Страницы

Поиск по вопросам

воскресенье, 23 февраля 2020 г.

Как в DLL использовать пользовательский тип?

#cpp #dll


Есть dll на C++ и проект на C++. Как мне сделать так, чтобы функция в dll принимала
ссылку на экземпляр некоторого класса (пользовательский тип, а не char или int) из
проекта и обрабатывала его? Нужно ли описание этого класса вынести в отдельный хедер
и включить его и в dll и в проект? Планируется использование динамического подключения
dll к проекту.
    


Ответы

Ответ 1



Нужно ли описание этого класса вынести в отдельный хедер и включить его и в dll и в проект? Да, именно так, если вы хотите полноценно использовать этот класс внутри вашей DLL. "Полноценно использовать" - это значит иметь возможность объявлять объекты этого класса и/или доступаться к его членам. Разумеется, если ваш класс содержит члены с не-inline определениями, то придется организовать соответствующую инфраструктуру. Члены класса будут объявляться в одном модуле (DLL или EXE), экспортироваться оттуда и импортироваться остальными модулями (DLL или EXE) (см. __declspec(dllexport) и пр.) Эти моменты зависят от реализации, но я подразумеваю, что вы ведете речь о MSVC.

Эквиваленты ли следующие операторы?

#c_sharp #строки


Допустим у меня есть инициализированная строка string s.
Являются ли следующие операторы эквивалентными в плане поведения? Генерируется ли
разный IL мне не важно.

// 1
s = s + "";

// 2
s = s ?? "";

// 3
s = $"{s}";


Если в каких-либо случаях есть отличия, то, пожалуйста, укажите их.
    


Ответы

Ответ 1



Да, все три выражения дают один и тот же результат при одинаковых параметрах. Различие могло быть только в обработке значения null, но во всех трех выражениях null будет заменен - пустой строкой.

Ответ 2



Являются ли следующие операторы эквивалентными в плане поведения? Это как спрашивать: Являются ли следующие действия одинаковыми: 4+2+2 4*2 6+2 Нет. Действия разные. Хотя результат одинаковый. Так что: Нет. Операторы разные и действия разные соответственно. Конкретно в даном случае РЕЗУЛЬТАТЫ будут эквивалентны. Результаты. Но не операторы. :) Поведение, собственно тоже будет немного отличатся. Вполне возможно что некоторые из этих вариантов будет немного быстрее (хотя они все быстрые). Но существенной разницы ты вряд ли получишь, даже, на детализированных тестах.

Что представляет собой покупка доменного имени с технической точки зрения?

#хостинг #домен


Несмотря на свою деятельность в веб-разработке, пока ещё не достиг глубокого понимания
сущности интернета и этот вопрос - один из шагов на пути к осмыслению.

В Википедии, в статье "Интернет" среди юридических аспектов и общих свойств интернета
приведено:


  У Интернета нет собственника, так как он является совокупностью сетей,
  которые имеют различную географическую принадлежность.


Если это прочитает человек, не имевший ранее дело с интернетом, он наверняка может
прийти в выводу, что всё, что нужно для опубликования своего сайта в интернет - подключённый
к интернету компьютер и никаких хостинговых компаний и регистраторов доменных имён. 

Насколько я уже знаю, для того, чтобы начать "транслировать" свой сайт в интернет,
нужно открыть 80-ый порт (например, с помощью веб-сервера Apache, который является
ПО). Конечно, безопасность персонального для компьютера такой трансляции - уже другой
вопрос. Но что представляет собой технически покупка доменного имени? Почему мы не
можем присовить произвольное доменное имя своему сайту хотя бы в пределах некоторых
доменных зон и транслировать его со своего компьютера под этим доменным именем? Выходит,
у интернета всё-таки есть собственник, который наделяет правом регистраторов доменов
продавать эти доменные имена?
    


Ответы

Ответ 1



Собственника у Интернета нет, но есть координатор. Исторически сложилось так, что координатором является ICANN. Почему же мы не можем просто так взять произвольное имя? Потому что это имя должно быть известно всем и однозначно разрешаться в IP-адрес компьютера. Для этого служит DNS. И именно за внесение записи в эту глобальную для всего мира таблицу соответствия имён и IP-адресов вы и платите при покупке доменного имени. Можно ли не платить? Можно. Например, можно вписать соответствие имени и IP в локальный файл hosts. Но тогда сайт будет доступен только с тех компьютеров, где мы этот файл изменили. Можно поднять свой собственный DNS-сервер, на котором указать наше имя и использовать этот сервер для всех компьютеров, которым нужен наш сайт. Но вряд ли произвольный пользователь в Сети согласится на это. К тому же, если каждый сайт сделает такой сервер, то для клиента будет абсолютно неудобно этот адрес DNS-сервера постоянно переписывать. (Но это хорошее решение для внутренних сетей организаций.) Поэтому большинство предпочитает заплатить и не мучиться. Есть ещё один способ получить имя бесплатно. Надо найти того, кто уже купил имя второго уровня (или более низкого), например, example.org, договориться с ним и попросить внести запись более низкого уровня, например, vasya.example.org. Это можно сделать, поскольку владелец домена может прописывать любые записи для всех поддоменов.

Ответ 2



Технически, для сайта и правда достаточно подключенного к интернету компьютера с открытым портом. Вот только на такой сайт посетителям придется ходить по IP-адресу. А IP-адрес, вообще говоря, является собственностью провайдера и может быть изменен. В этом случае придется как-то рассказывать всем посетителям свой новый адрес. Замечание. Вообще говоря, существует возможность приобрести себе постоянный IP-адрес - но это доступно только юридическим лицам и будет стоить дороже доменного имени. Один из способов подобного "рассказа" - это DNS. Служба, которая преобразует те самые доменные имена в IP-адреса. Право создавать домены второго уровня имеют регистраторы. Вот им-то и надо платить за домен. После покупки доменное имя становится вашим - пока вы за него платите. В частности, это означает что никто без вашего ведома не может отобрать его у вас (кроме как через суд в некоторых случаях). Владея доменов второго уровня вы можете создавать любое число доменов третьего и ниже уровней бесплатно. Иногда для этого надо поднимать свой DNS-сервер и открывать 53й порт, иногда не надо (зависит от регистратора). Существуют также сервисы, раздающие бесплатные доменные имена третьего уровня. Но, вообще говоря, вашими такие доменные имена также не являются. Технически покупка доменного имени заключается в том, что вы платите регистратору за то, что он внесет запись о соответствии некоторого имени вашему IP-адресу в некоторый общий список.

Распознавание символов и работа с изображенями

#c_sharp #изображения #нейронные_сети


Имеется нейронная сеть, способная распознавать символы. При загрузке рисунка из Paint
размеров 150 на 150 всё работает нормально.Фон здесь белый, буква нарисована чёрным цветом.



При загрузке картинки ( также 150 на 150) с прозрачным фоном программа работает "наоборот"

Для удобства понимания вывел цвета пикселей( во втором случае первый пиксель, который
является прозрачным, почему-то распознаётся как чёрный, а чёрный соответственно не
является почему-то чёрным).

Первая и вторая картинка имеет одинаковый формат .png

Каким образом можно настроить программу для работы с изображением на прозрачном фоне?

Метод считывания картинки

public void get(Bitmap map) 
    {
        for (int x = 0; x < mbut.GetLength(0); x++)
        {
            for (int y = 0; y < mbut.GetLength(1); y++)
            {
                Color col = map.GetPixel(x, y);
                if (col.R == 0 && col.B == 0 && col.G == 0)
                    mbut[x, y] = true;
                else label9.Text = "Цвет пикселя номер " + x + ":" + y+" "+ Convert.ToString(map.GetPixel(x, y));
            }
        }     
        label10.Text = "Цвет первого пикселя: " + Convert.ToString(map.GetPixel(0, 0));
    }


Метод прорисовки весов

 public void draw(int n)
    {
        using (Bitmap map = new Bitmap(150, 150))
        {
            for (int x = 0; x < weight.GetLength(0); x++)
            {
                for (int y = 0; y < weight.GetLength(1); y++)
                {
                    if (weight[x, y] > 1)
                    {                            
                        map.SetPixel(x, y, Color.Black);
                    }         
                }
            }
            map.Save(String.Format("Pictures/{0}.png",n), System.Drawing.Imaging.ImageFormat.Png);
        }
    }

    


Ответы

Ответ 1



Предполагаю что проблема в работе с каналами цветного изображения в цветовой схеме ARGB. Когда Paint сохраняет изображение, он приводит её к RGB и проблем не возникает. При других редакторах цветовая схема остается ARGB. Вот какая складывается ситуация: Вы берете цветовой схемы, в первом случае это RGB, и по каналу R определяете черный это или не черный. В итоге инициализация проходит успешно. Во втором случае с схемой ARGB, в которой изображение имеет прозрачность, первым каналом является A - alpha(оно-же прозрачность) вы пытаетесь по прозрачным цветам определить черный и сталкиваетесь с ситуацией когда все пиксели которые прозрачны - получают черный цвет а те которые не прозрачны остаются белыми. В этом и кроется секрет вашей хитроумной инверсии :)

Ответ 2



if (col.R == 0 && col.B == 0 && col.G == 0) Не хватает проверки && col.A != 0. Видимо, paint сохранил прозрачный фон всеми ноликами.

Помогите разобраться с селекторами css

#css #css_selectors


Как например задать класс второму по счету div, или задать только первому нужные
стили, если у каждого однаковые названия классов? Немного не понятно с уровнями, как
правильно задавать по уровню, что бы не плодить css классы?




Ответы

Ответ 1



Для добавления стиля к элементам на основе нумерации в дереве элементов используется псевдокласс :nth-child: .class:nth-child(odd | even | <число> | <выражение>) {... // Styles } Значения odd - Все нечетные номера элементов. even - Все четные номера элементов. число - Порядковый номер дочернего элемента относительно своего родителя. Нумерация начинается с 1, это будет первый элемент в списке. выражение - Задается в виде an+b, где a и b целые числа, а n — счетчик, который автоматически принимает значение 0, 1, 2... Примеры В вашем случае для стилизации второго элемента используйте псевдокласс :nth-child(2): .child{ background:green; width:150px; height:100px; } .child:nth-child(2){ background:#ccc; width:100px; height:50px; }
А для стилизации первого элемента используйте псевдокласс :nth-child(1) или же :first-child: .child{ background:green; width:150px; height:100px; } .child:first-child{ background:#ccc; width:100px; height:50px; }


Ответ 2



Псевдокласс :nth-child Вам в помощь уважаемые ;) Дальше уже дело креатива) https://webref.ru/css/nth-child .selector div { background-color:black; height:30px; margin-bottom:2.5px; } .selector div:nth-child(1) { background-color:red; } .selector div:nth-child(2) { background-color:green; } .selector div:nth-child(3) { background-color:blue; } .selector div:nth-child(4) { }


Ответ 3



.child{ background:red; width:150px; height:100px; } .child:nth-child(2){ background:#ccc; width:100px; height:50px; }


Применение и значение ключевого слова volatile

#c_sharp #многопоточность #volatile


Если читать горячо любимый msdn можно найти следующую формулировку: 


  Ключевое слово volatile указывает, что поле может быть изменено
  несколькими потоками, выполняющимися одновременно. Поля, объявленные
  как volatile, не проходят оптимизацию компилятором, которая
  предусматривает доступ посредством отдельного потока. Это гарантирует
  наличие наиболее актуального значения в поле в любое время.


А также на стороннем ресурсе есть такая : 


  Согласно MSDN ключевое слово volatile указывает, что поле может быть
  изменено несколькими потоками, выполняющимися одновременно и поэтому
  JIT компилятор не будет производить оптимизации с полем


Поправьте, если что пожалуйста, ибо я немного запутался, моя логика следующая : я
могу прямо не знать что значение поля модифицируется, когда значение реально модифицируется
и из разных потоков. Я говорю компилятору что мне необходимо читать поле не из кеша,
ибо из кеша может попасть не валидное значение, а читать прямо из области где она лежит,
что дает мне право в любой момент времени, независимо от того менялось оно или не менялось,
получать действительно верное значение поля.
    


Ответы

Ответ 1



C volatile все не так просто, как кажется, т.к. делает он совсем не то, что volatile в C++. Пробивание кэшей является только сайдэффектом, и срабатывает не совсем так, вы этого ожидаете. Тем не менее, он используется чаще всего ради пробивания кэшей, и даже в MSDN по volatile он приведен именно на примере "пробивания кэша" при чтении свойства. private volatile bool _shouldStop; // в одном потоке while (!_shouldStop) { Console.WriteLine("Worker thread: working..."); } // в другом потоке _shouldStop = true; Но при этом тот же пример из MSDN отлично работает, если слово volatile убрать. В чем подвох? Что на самом деле делает volatile, и почему он "пробивает кэш"? И пробивает ли он его вообще, и существуют ли способы "пробить кэш"? В спецификации C# volatile упоминается в паре мест - §3.10 Execution order и §10.5.3 Volatile fields. 3.10 Execution order Execution of a C# program proceeds such that the side effects of each executing thread are preserved at critical execution points. A side effect is defined as a read or write of a volatile field, a write to a non-volatile variable, a write to an external resource, and the throwing of an exception. The critical execution points at which the order of these side effects must be preserved are references to volatile fields (§10.5.3), lock statements (§8.12), and thread creation and termination. По сути, оптимизатор не может переносить запись или чтение volatile поля за lock, переносить его через throw и еще через пару определенных конструкций. Ни слова о кешировании. т.е. в ситуации ... много кода без critical execution points (локов, работы с volatile и прочим) volatile read оптимизатор волен сделать volatile read ... много кода без critical execution points (локов, работы с volatile и прочим) и даже lock в этом случае не поможет: ... много кода без critical execution points, сайдэффектов и чтения памяти lock { volatile read } законно превращается в lock { volatile read ... много кода без critical execution points, сайдэффектов и чтения памяти } ок, вторая часть спеки 10.5.3 Volatile fields A read of a volatile field is called a volatile read. A volatile read has “acquire semantics”; that is, it is guaranteed to occur prior to any references to memory that occur after it in the instruction sequence. Опять не слова про кэширование. Утверждается что volatile read произойдет не позже, чем он написан в коде (относительно другого доступа к памяти). Гораздо раньше - без проблем! По сути, volatile запрещает оптимизатору переставлять все обращения к volatile-переменным местами (с друг другом, и с другими обращениями к памяти). Для не-volatile переменных подобные перестановки разрешены. т.е. при выполнении кода // в одном потоке a = 1; b = 1 a = 2; b = 2; и // в другом потоке Console.WriteLine($"{a} {b}"); для не-volatile переменных вы можете получить ... "2 1" Запрет такой перестановки - это основное предназначение volatile. Именно так он задуман, и именно в таком виде вписан в спецификацию. Ок, но он ведь запрещает кэширование? Как он это делает? Что же запрещает рантайму превратить while (!_shouldStop) { Console.WriteLine("Worker thread: working..."); } в регистр = _shouldStop; while (регистр) { Console.WriteLine("Worker thread: working..."); } Мешает ему раздел стандарт ECMA-335, раздел I.12.6.7 Volatile reads and writes An optimizing compiler that converts CIL to native code shall not remove any volatile operation, nor shall it coalesce multiple volatile operations into a single operation. Оптимизатору JIT просто запрещено заменять несколько чтений (в цикле) одним. Что, на практике, заставляет его вычитывать значение из памяти при каждом упоминании этого значения в коде. Что приводит к "пробиванию кэша" - запрету на использования значения из регистра, вычитанного при прошлом обращении к полю. Точно так же, сайдэффектом, "кэш" пробивается lock-ом: lock { не-volatile read } Acquiring a lock shall implicitly perform a volatile read operation что запрещает оптимизатору переставить обращение к памяти чуть повыше.

Ответ 2



Ну, в общем, правильно. Всё, что помечено как volatile, читается/пишется оттуда/туда, где реально находится, без кеширования, например, в регистрах, если это, конечно, возможно.

Как работают динамические сайты?

#php #html #css


Объясните, пожалуйста, как создаются, и как работают динамические сайты. Со статическими
все более чем понятно: просто создаешь HTML документ, подсоединяешь к нему скрипты,
стили и прочее, и все. Вот он сайт. А как сделать динамический сайт? Такой, чтобы нужную
иноформацию для страниц брал из базы данных. 
P.S. Код мне мне нужен,мне нужно объяснение того, как, что и с чем взаимодейтствует,
заранее спасибо.
    


Ответы

Ответ 1



Если коротко, то всё работает примерно так. Для начинающего веб-программиста рекомендуется выбрать язык php. У вас есть веб-сервер, если вы выбрали php, то это либо Apache либо Nginx. В двух словах веб-сервер принимает HTTP-запросы обрабатывает их и выдаёт HTTP-ответы, то есть действует как распределительный щеток или коммутатор, если грубо говорить. Есть php - это интерпретируемый язык программирования, и есть база данных mysql - это хранилище данных. Так же есть HTTP (протокол передачи гипертекста) - это набор правил по которым отправляются и принимаются запросы. Схема работы в целом Что касается "с чего начать". Думаю самый простой способ установить к себе на компьютер веб сервер и базу данных денвер, wamp если линукс то lamp. И пробовать писать на чистом php (без всяких фреймворком и тем более CMS) ну например свою MVC, пример MVC на php

Ответ 2



Привет. На теле страницы будет php код который выводит статью из базы по id. А id берется из урл страницы, например: domain.com/page.php?id=14 То есть если пользователь зайдет на страницу domain.com/page.php?id=14 то выводится статья с id 14, если на страницу domain.com/page.php?id=15 то выводится статья с id 10 итд...

Масштабируемая сетка из шестигранников

#css #html5 #css3 #анимация #svg


Я загрузил из Интернета  несколько изображений на мой сайт . Можно ли придать всем
этим образам  шестигранную форму в responsive grid?    

... Я нашел несколько способов сделать это, но мне необходимо заполнить src изображения в коде CSS. Это не подходит мне, потому что сайт загружает случайные изображения из интернета с jQuery, поэтому я не могу их использовать как фоновые изображения. Я собираюсь поддерживать WebKit браузеры, Firefox, IE8 было бы хорошо, но не нужно - и мобильные браузеры Моя попытка здесь: jsfiddle перевод вопроса: Responsive grid of hexagons


Ответы

Ответ 1



Здесь demo и репозиторий для responsive grid of hexagons. Код здесь не поддерживается. Он был перемещен в GitHub и сильно улучшены комментарии, вопрос отчетности и взносы должны быть сделаны туда. Этот метод использует: тег неупорядоченный список: каждый шестиугольник содержится в теге
  • и теге Использование transform rotateи skew, чтобы сделать шестигранные формы overflow:hidden; дочерние элементы nth-child() заполняют шестигранник в качестве pattern И еще, чтобы создать шестигранную сетку с тегом . Характеристики шестигранной сетки : Сетка будет реагировать, как это полагается, на изменение процентов ширины. Шестиугольники поддерживают своё соотношение сторон в соответствии с приемом padding-bottom technique и изображения изменяют размер, чтобы соответствовать форме шестиугольника. hover эффект поверх шестиугольников: текст скользит с прозрачным наложением над изображением. Каждый шестиугольник сохраняет свои границы: эффект hover (или событие click ) для каждого шестиугольника срабатывает только внутри реальной фигуры. Полный код Следующий фрагмент кода не является последней версией сетки. GitHub repo сохраняется и до настоящего времени. Вопросы и вклады могут быть сделаны там. * { margin: 0; padding: 0; } body { font-family: 'Open Sans', arial, sans-serif; background: rgb(123, 158, 158); } #hexGrid { overflow: hidden; width: 90%; margin: 0 auto; padding:0.707% 0; } #hexGrid:after { content: ""; display: block; clear: both; } .hex { position: relative; list-style-type: none; float: left; overflow: hidden; visibility: hidden; -webkit-transform: rotate(-60deg) skewY(30deg); -ms-transform: rotate(-60deg) skewY(30deg); transform: rotate(-60deg) skewY(30deg); } .hex * { position: absolute; visibility: visible; } .hexIn { display:block; width: 100%; height: 100%; text-align: center; color: #fff; overflow: hidden; -webkit-transform: skewY(-30deg) rotate(60deg); -ms-transform: skewY(-30deg) rotate(60deg); transform: skewY(-30deg) rotate(60deg); -webkit-backface-visibility: hidden; backface-visibility: hidden; } /* HEX CONTENT */ .hex img { left: -100%; right: -100%; width: auto; height: 100%; margin: 0 auto; } .hex h1, .hex p { width: 90%; padding: 0 5%; background-color: #008080; background-color: rgba(0, 128, 128, 0.8); font-family: 'Raleway', sans-serif; -webkit-transition: top .2s ease-out, bottom .2s ease-out, .2s padding .2s ease-out; transition: top .2s ease-out, bottom .2s ease-out, .2s padding .2s ease-out; } .hex h1 { bottom: 110%; font-style: italic; font-weight: normal; font-size: 1.5em; padding-top: 100%; padding-bottom: 100%; } .hex h1:after { content: ''; display: block; position: absolute; bottom: -1px; left: 45%; width: 10%; text-align: center; z-index: 1; border-bottom: 2px solid #fff; } .hex p { padding-top: 50%; top: 110%; padding-bottom: 50%; } /* HOVER EFFECT */ .hexIn:hover h1 { bottom: 50%; padding-bottom: 10%; } .hexIn:hover p { top: 50%; padding-top: 10%; } /* SPACING AND SIZING */ @media (min-width:1201px) { .hex { width: 19.2%; /* = (100-4) / 5 */ padding-bottom: 22.170%; /* = width / sin(60deg) */ } .hex:nth-child(9n+6), .hex:nth-child(9n+7), .hex:nth-child(9n+8), .hex:nth-child(9n+9) { margin-top: -4.676%; margin-bottom: -4.676%; -webkit-transform: translateX(50%) rotate(-60deg) skewY(30deg); -ms-transform: translateX(50%) rotate(-60deg) skewY(30deg); transform: translateX(50%) rotate(-60deg) skewY(30deg); } .hex:nth-child(9n+6):last-child, .hex:nth-child(9n+7):last-child, .hex:nth-child(9n+8):last-child, .hex:nth-child(9n+9):last-child { margin-bottom: 0; } .hex:nth-child(9n+6) { margin-left: 0.5%; clear: left; } .hex:nth-child(9n+10) { clear: left; } .hex:nth-child(9n+2), .hex:nth-child(9n+ 7) { margin-left: 1%; margin-right: 1%; } .hex:nth-child(9n+3), .hex:nth-child(9n+4), .hex:nth-child(9n+8) { margin-right: 1%; } } @media (max-width: 1200px) and (min-width:901px) { .hex { width: 24.25%; /* = (100-3) / 4 */ padding-bottom: 28.001%; /* = width / sin(60deg) */ } .hex:nth-child(7n+5), .hex:nth-child(7n+6), .hex:nth-child(7n+7) { margin-top: -6.134%; margin-bottom: -6.134%; -webkit-transform: translateX(50%) rotate(-60deg) skewY(30deg); -ms-transform: translateX(50%) rotate(-60deg) skewY(30deg); transform: translateX(50%) rotate(-60deg) skewY(30deg); } .hex:nth-child(7n+5):last-child, .hex:nth-child(7n+6):last-child, .hex:nth-child(7n+7):last-child { margin-bottom: 0; } .hex:nth-child(7n+2), .hex:nth-child(7n+6) { margin-left: 1%; margin-right: 1%; } .hex:nth-child(7n+3) { margin-right: 1%; } .hex:nth-child(7n+8) { clear: left; } .hex:nth-child(7n+5) { clear: left; margin-left: 0.5%; } } @media (max-width: 900px) and (min-width:601px) { .hex { width: 32.666%; /* = (100-2) / 3 */ padding-bottom: 37.720%; /* = width / sin(60) */ } .hex:nth-child(5n+4), .hex:nth-child(5n+5) { margin-top: -8.564%; margin-bottom: -8.564%; -webkit-transform: translateX(50%) rotate(-60deg) skewY(30deg); -ms-transform: translateX(50%) rotate(-60deg) skewY(30deg); transform: translateX(50%) rotate(-60deg) skewY(30deg); } .hex:nth-child(5n+4):last-child, .hex:nth-child(5n+5):last-child { margin-bottom: 0; } .hex:nth-child(5n+4) { margin-right: 1%; margin-left: 0.5%; } .hex:nth-child(5n+2) { margin-left: 1%; margin-right: 1%; } .hex:nth-child(5n+6) { clear: left; } } @media (max-width: 600px) { .hex { width: 49.5%; /* = (100-1) / 2 */ padding-bottom: 57.158%; /* = width / sin(60) */ } .hex:nth-child(3n+3) { margin-top: -13.423%; margin-bottom: -13.423%; -webkit-transform: translateX(50%) rotate(-60deg) skewY(30deg); -ms-transform: translateX(50%) rotate(-60deg) skewY(30deg); transform: translateX(50%) rotate(-60deg) skewY(30deg); } .hex:nth-child(3n+3):last-child { margin-bottom: 0; } .hex:nth-child(3n+3) { margin-left: 0.5%; } .hex:nth-child(3n+2) { margin-left: 1%; } .hex:nth-child(3n+4) { clear: left; } } Изменение количества шестиугольников в ряду Сетка адаптирует количество шестиугольников в ряду в зависимости от ширины окна просмотра. С пятью шестиугольниками на экранах шире, чем 1200px, и до 2-х на экранах уже, чем 600px. Если вам не нужны media queries, но просто хотите изменить количество шестиугольников в строке, то вы можете сохранить CSS из соответствующего media queries и затем удалить ненужные из них. Для получения дополнительных настроек см. sizing and spacing of hexagons. Demos Для получения списка всех демок, посмотрите эту коллекцию на codepen: Responsive grids of hexagons с разным числом шестиугольников в каждом ряду, а также опции центрирования и многое другое ... Вот оригинал codepen demo с .pusher элементом, чтобы сделать неправильную сетку из шестиугольников. .pusher элемент используется для создания "дыр" в сетке с пустыми шестиугольниками. Перевод ответа: @web-tiki

  • Преобразовать массив объектов в HashMap

    #java

    
    Хочется странного
    
    Есть массив объектов. У каждого объекта есть уникальное поле id. Хочется преобразовать
    этот массив в HashMap с ключами, равными этим id
    
    Да, я знаю как сделать такое через цикл. Но может есть какой более элегантный путь,
    стримы, волшебные касты и т.д. о которых я просто не знаю?
    
    class Accident{
        public int id;
        ....
    }
    
    
    Accidents[] accArray = getAccidentsByRetrofitAndGson();
    Map accidents = new HashMap();
    // Вот вместо этого?
    for(Accident acc:accidents){
        accidents.put(acc.id, acc);
    }
    
        
    


    Ответы

    Ответ 1



    С помощью метода forEach из Stream можно так: Map accidents = new HashMap<>(); Stream.of(accArray).forEach(e -> accidents.put(e.id, e)); По аналогии с вариантом из комментария @post_zeew: Map accidents; accidents = Stream.of(accArray).collect(Collectors.toMap(e -> e.id, e -> e));

    Не удаляются контролы, созданные в цикле

    #java

    
    Путем цикла я создала метки. Мне нужно, чтобы, когда я кликну на них мышкой, они
    исчезали. Кликнула на одну, она исчезла, на другую и так далее. Но, когда я запускаю,
    метки не пропадают. Что нужно сделать, чтобы все работало так, как надо?
    
        lol = new JPanel();
        lol.setBounds(10, 47, 974, 693);
        contentPane.add(lol);
        lol.setLayout(null);
    
        for (int k = 0; k < 50; k++){
            label_2 = new JLabel("");
            label_2.setIcon(new ImageIcon(P.class.getResource("/images/00.png")));
            int w = randomRange(10, 974);
            int r = randomRange(10, 693);
            label_2.setBounds(w, r, 200, 200);
            label_2.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    lol.remove(label_2);
                }
            });
            lol.add(label_2);
        }
    
        
    


    Ответы

    Ответ 1



    lol.remove((JLabel)e.getComponent()); или lol.remove((JLabel)e.getSource());

    Ответ 2



    И вариант с циклом для полноты картины: for (int k = 0; k < 50; k++) { JLabel label_2 = new JLabel("Label" + k); label_2.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { lol.remove(label_2); } }); lol.add(label_2); } Разница в том, что переменная label_2 объявляется внутри цикла, а не снаружи. Поэтому во внутреннем классе используется метка из текущей итерации, а не последняя из созданных. После lol.remove(label_2); в обработчик события можно добавить frame.repaint();, если отсутствует постоянная отрисовка в цикле.

    Ответ 3



    Проблема в замыкании, а именно в этой строчке: lol.remove(label_2); Когда цикл завершается, в переменной label_2 находится последняя поставленная метка. Когда отрабатывает событие клика, то удаляется только эта последняя метка. Вам нужно изменить способ удаления (а точнее, способ получения нужного экземпляра метки)

    Blur filter в CSS

    #html #css

    
    как задать blur filter на чистом css div'у с background: url() только в пределах
    другого div? 
    
    Пример на фото, через filter: blur(10px) получаются нечёткие границы размытия
    
    
        
    


    Ответы

    Ответ 1



    Оберните div со свойством blur в div со свойством overflow:hidden : .parent{ background-image:url("https://cdn.sstatic.net/Sites/stackoverflow/img/error-lolcat-problemz.jpg"); background-position:center center; background-repeat:no-repeat; background-size:cover; height:200px; padding:50px 0; } .inner{ overflow:hidden; } .blur{ background-image:url("https://cdn.sstatic.net/Sites/stackoverflow/img/error-lolcat-problemz.jpg"); background-position:center center; background-repeat:no-repeat; background-size:cover; height:100px; filter: blur(10px); }