Vikhrmodels/habr_qa_sbs huggingface dataset:
Вопрос: Да в чем проблема?

Лучший ответ:
Вы считываете строку: string IsFilm1 = Console.ReadLine;, а сравниваете с булевым типом if (IsFilm1 = true), к тому же неправильно сравниваете, нужно писать ==.
В Вашем случае нужно исправить на IsFilm1 == "true" — т.е. сравнение строки со строкой.

Худший ответ:
Поставьте уже ReSharper и прочтите/исправьте все его предупреждения.
Потом запустите FxCop и сделайте тоже самое.
Можно в произвольном порядке.
Вопрос: Проблема в разработчике или выбранном направлении?

Лучший ответ:
 через 2+ месяца я понял что кроме лучших знаний по гит и как работать с cron я не приобрел, ни одного класса не написано, только мелкие баги и всё, а от php вообще уже отворачивает. Это так везде или проблема во мне?
Джуну никто не позволит после всего лишь двухмесячного с ним ознакомления что то серьезное делать.
От языка это не зависит.
Но в целом и общем на PHP много работы и потому и простой неквалифицированной в том числе работы много. На нее легко попасть.
На других языках для бэкэндов работы меньше. Но она, в среднем, сложнее.
Я бы не стал изучать другой язык, если дело только в карьере.
Почему IOS, перспективно и сложно, меньше конкуренции со школой(как в пхп), больше шансов работы на фрилансе/перезда за границу
Ерунда.
Это как с ноутбуками Apple.
Они не делают дешевых моделей, поэтому кажется, что их ноутбуки дорогие.
Стоить внимательнее сравнить ВСЕ характеристики, то прекрасно видно, что ноутбуки конкурентов с такими же характеристиками тоже дорогие.
Это не Эппла дорогой, а просто у него дешевых моделей нету.
Так и PHP.
Там полно очень высокооплачиваемой работы (Facebook, VK - на PHP), но на фоне массового шума-спама дешевой работы и кажется что все в PHP плохо. Но это всего лишь кажется.

Худший ответ:
Вы Джун отсюда и такие задачи идите работать мидлом, два раза поменять работу это ничтожные усилия , я сначала думал будет рассказ про двадцать минут работ, то есть вероятно вы ленивая скотина, джуны на других языках программирования тоже не блещут задачами .
Вопрос: Как обойти ограничение раздачи интернета Билайн?

Лучший ответ:
Послать билайн в жопу с такими правилами и сменить оператора.

Худший ответ:
Обход запрета на раздачу интернета у Yota (на Android): https://habrahabr.ru/post/238625/
Вопрос: Непонятный ip-адрес в микротитке?

Лучший ответ:
По какой-то причине у вас устройство не хочет принимать адрес от микротика. Либо с ним что-то не так, либо у вас в сети появился второй dhcp сервер

Худший ответ:
Попробуйте заблокировать MAC адрес/ip firewall raw
add action=drop chain=prerouting src-mac-address=ff:ff:ff:ff:ff:ff comment="MAC_ADDR_BLOCK" in-interface=bridge1 disabled=noПодставьте ваши данные
Вопрос: В чём разница между IPFW и PF firewall'ами во FreeBsd? Какой выбрать?

Лучший ответ:
pf проще.
Лично я работал с ipfw, там то же не сложно, когда задачи типовые.
В pf можно достаточно легко сделать балансировку каналов.
На ipfw балансировку сделать сложнее, но зато можно ее сделать такую какую тебе надо, тогда как в pf можно пользоваться только одним встроенным вариантом.
ipfw - более низкоуровневый инструмент.

Худший ответ:
pf - высокоуровневый, для большинства задач проще.
ipfw - более тонко настраиваемый.
Можно сравнить как pf - язык программирования, а ipfw - ассемблер.
То есть ipfw будет работать шустрее, лучше - но очень много усилий.
Вопрос: На какие дополнительные меры безопасности для сайта обратить внимание?

Лучший ответ:
Это тема для научного доклада.

Худший ответ:
Как защитить сайты от взлома?
Вопрос: Как реализовывать наследование моделей в laravel?

Лучший ответ:
То что Вы пытаетесь реализовать, называется наследованием таблиц (Table Inheritance) - это такой способ эмулировать наследование классов в реляционных СУБД.
Всего существует несколько известных вариантов решения такой проблемы, например Single Table Inheritance и Class Table Inheritance (это если не учитывать нативную поддержку подобных вещей в некоторых СУБД, например PostgreSQL).
Полиморфные же связи (которые по-дефолту в Laravel) - это не очень хороший способ реализации, потому что не позволяет поддерживать целостность связей на уровне СУБД. Однако можно использовать и его, если Вам эта целостность не очень важна (ее надо будет поддерживать на уровне приложения).
К сожалению Eloquent не поддерживает ни Single Table Inheritance, ни Class Table Inheritance (зато их поддерживает Doctrine из Symfony), поэтому придется писать вручную.
Прежде чем это делать, я бы Вам посоветовал разобраться как Profile относится к User и OrgAdmin.
Является ли Profile подвидом пользователя (из названия честно говоря не понял), или же это просто набор дополнительных полей, которые можно оформить в виде связей?
Если и Profile и OrgAdmin - это подвиды (подтипы) пользователей со своим собственным набором полей, то Вам нужно добавить в общую таблицу отдельное поле type (это называется дискриминатор), в котором у Вас будет проставлен тип пользователя. Например 1 для User, 2 для Profile и 3 для OrgAdmin.
Короче очень похоже на стандартный Polymorphic Relationships из Laravel.
А потом переопределяете у модели User функции newFromBuilder() или newInstance() в которых Вы укажете какие классы моделей создавать для конкретного type. Вот например статья.
Дальше для Class Table Inheritance можно в трейт поместить функцию сохранения и родителя и потомка, потому что сохранять их придется вместе (на уровне БД), в зависимости от измененных свойств. Кроме того, нужно будет позаботиться об отображении (mapping) атрибутов родителя на потомков (__set и __get), на случай если вдруг захочется делать вот так (представьте что атрибут name принадлежит родителю - модели User):$profile = new Profile();
$profile->name = 'John Doe';
$profile->save();
Короче это гемор в Laravel. Поэтому перед тем как делать, подумайте можно ли решить задачу проще - например через Single Table Inheritance, поместив все атрибуты в одну таблицу, либо делайте через стандартные полиморфные связи.
Когда я решал эту задачу, я все вышеуказанные функции помещал в трейты. Может когда-нибудь дойдут руки запилить отдельную библиотеку или отправить патч в само ядро фреймворка.
Погуглите по указанным ключевым словам (паттернам), может что уже появилось для Laravel.

Худший ответ:
Если модели настолько разные, то может вообще не наследоваться от User, а просто связывать их через relationships (один к одному)? 
Т.е. OrgAdmin отдельная модель связанная через relationships с User и Profile отдельная модель связаная через relationships с User. В таком случае у вас всё будет в разных таблицах и найти из одной модели другую не составит труда.
Вопрос: Веб-Программирование. Нужно ли читать Танненбаума?

Лучший ответ:
Чтение технической литературы должно сопровождаться закреплением полученных знаний практикой. Иначе, мозг тупо избавится от "лишней" информации, а время на чтение уже затрачено. Поэтому, IMHO, чтение книг Танненбаума в любом случае полезно человеку технических специальностей, но вряд-ли реально чем-то поможет конкретно в WEB-программировании, по-крайней мере на начальном этапе. Уж лучше Кнута почитайте, про алгоритмы что-нибудь, т.е. что-то, что вы можете применить в повседневной практике. Полезным чтивом нахожу книги Роберта Мартина, "Программист-фанатик" Фаулера, "Программист-прагматик Ханта и Томаса". Эти книги пригодятся вообще в любом деле и читать их можно "просто-так", для общего развития, так сказать, в отличие от монографий Танненбаума. :)

Худший ответ:
Нет
Вопрос: Какой опыт Git нужен веб-разработчику для работы в команде в компании?

Лучший ответ:
Желательно понимать, что делают и зачем нужны следующие команды:
git status
git checkout
git reset
git fetch
git pull
git push
git diff
git add
git commit
git stash

Худший ответ:
Пятнадцатиминутный.
Вопрос: А существует ли аналог [старого] Хабра, но на англ. языке?

Лучший ответ:
Есть всякие Medium`ы и т.п. но по сути то же самое и найти что-то годное непросто. 
Если есть какие-то люди которых вам интересно читать - смотрите куда они пишут. Интересные на мой взгляд авторы пишут лишь в личные блоги

Худший ответ:
https://hackernoon.com/, https://news.ycombinator.com/ , некоторые сабреддиты на https://reddit.com/
Вопрос: Как создаются современные прототипы сайтов?

Лучший ответ:
Сергей, вас раскачает  Figma.
Без лишних слов:Фишки фигмыОбзор фигмы
Все то, что вы спросили, там есть. В одном месте.
В умелых руках (понимание формы и пропорций, цвета, композиции, типографики) такие программы просто восхитительны. 
p.s не углубляйтесь, попробуйте фигму в течение нескольких часов, если вам покажется, что этого мало, пробуйте скетчи и т.д

Худший ответ:
Скетч или Адоуби ХД
Вопрос: Как заблокировать работу в Битрикс24 до тех пор, пока пользователь не начнет рабочий день?

Лучший ответ:
Сделайте регламент и укажите на портале часы, когда работник должен открыть рабочий день. Затем проверяйте его длительность. 
Если сотрудник не начал рабочий день - не учитывайте его при расчет ЗП - считайте как отгул, прогул и т.п.
Рабочий день может быть начат с другим временем, но в таком случае руководитель данного сотрудника должен подтвердить данные изменения.
Чисто программных методов от этого нет - иначе посыпятся агенты, внешние приложения и т.п.

Худший ответ:
нанимаете человека который кастомизирует)
Вопрос: Как упаковать парсер на python в батник для windows?

Лучший ответ:
сделайте в exe
py2exe
https://habrahabr.ru/post/87224/

Худший ответ:
python script.py - если python прописан у заказчика в PATH
c:\python34\python.exe script.py - если не прописан
если батник лежит не там же где скрипт, то ещё путь до скрипта дописать соответственно
Вопрос: Какой выбрать хостинг?

Лучший ответ:
Из всех хостингов, что я когда-либо использовал (а их было больше десятка) лично для меня вот этот оказался самым удобным по админке и стабильным в плане работы (хотя, сейчас стабильность у многих на уровне) - timeweb.com
Не стыдно порекомендовать

Худший ответ:
Форнекс, очень хороший, та и серьезных проектов типа Пикабу у них много размещено
Вопрос: Таблица с JSON полем или несколько таблиц под каждый тип данных, какой вариант проектрирования выбрать?

Лучший ответ:
В JSON может поместиться всё, что вы захотите в него поместить, mysql не волнует, сколько там «полей».
Размер JSON-поля определяется переменной max_allowed_packet.
Ну и лучше юзать PostgreSQL, там с JSON'ом всё лучше (в JSONB-варианте) — например, нормальные индексы.

Худший ответ:
Зачем изобретать велосипед?
Есть форма на 120 полей - сделайте 120 полей в таблице.
1 анкета - одна строчка.
Удобно выбирать, удобно фильтровать.
Вопрос: Температура процессора macbook?

Лучший ответ:
Все маки так настроены, что кулеры на полную включаются когда температура будет ближе к 90 град. Т.е приоритет идет на комфорт пользователя, чтоб не мешал шум вентилятора. 
При температурах больше 100 град, процессор начнет занижать частоту, тормозить чтоб не перегреться, если и дальше поднимется температура выше 110, то сработает защита, отключится питание.  Так что у Вас всё штатно работает скорее всего. 
Но постоянная работа на таких высоких температурах это не гуд, уменьшается ресурс чипов и других деталей на плате. Перегрев причина многих поломок. Поэтому желательно следить за системой охлаждения, чистить от пыли и менять переодически термопасту. 
Чтоб снизить среднюю рабочую температуру можно принудительно увеличить минимальные обороты кулера, много программ это умеют делать. Можно подобрать оптимальное соотношение, чтоб и кулеры не слишком было слышно и температура средняя во время работы была приемлемой, например до 70- 80 град
Но встречал глюки когда кулер работал не штатно, очень медленно поднимал обороты даже при температуре 100 град. Чаще всего помогал сброс NVRAM и SMC.

Худший ответ:
1) постоянные нагрев и охлаждение со временем могут привести к "отвалу" процессора, то есть потере контакта между процессорным чипом и платой под ним. Современные процессоры меньше этому подвержены, чаще этим страдают южный мост или видеокарта. Самому чипу такая температура не вредит.
2) температурный датчик у процессора один (или по одному на каждое ядро), другой софт покажет то же самое.
Вопрос: Как создать карту на сайте с метками и описаниями (с фото) для них?

Лучший ответ:
Вообще, есть и достаточно мощные конструкторы. Только не на базе карт Яндекса, естественно.
https://storymaps.arcgis.com/en/app-list/
https://maphub.net/
https://mapme.com/

Худший ответ:
Google map можете использовать и  на ней создавать маркеры, а при его создании, можете добавить слушателя на клик.
Вопрос: Все ли приложение будет ререндерится, если измениться какой то внутренний(где то в приложении) state одного из компонентов?

Лучший ответ:
Разумеется что нет. Рендерится (перерисовывается) только "та часть" (тот компонент), в которой были изменены пропсы/стейт + все дети если в них нет оптимизаций (например, они могут быть сделаны как stateless, pureComponent или иметь shouldComponentUpdate - тогда перерисовываться не будут при описанных условиях).
вижу обновили вопрос: да, только футер.

Худший ответ:
только footer
Вопрос: Как размечать многоэтажные здания на OpenStreetMap?

Лучший ответ:
вариант2: "отделить зерна от плевел"
нарисовать здание с адресом и параметрами здания.
внутри здания поставить точку poi кафе с параметрами кафе + level=0 и точку poi твоего офиса с параметрами офиса + level=1.
по рекомендациям, точки внутри контура здания наследуют его адрес.
level "этаж здания" идет от нуля.

Худший ответ:
вариант2: "отделить зерна от плевел"
нарисовать здание с адресом и параметрами здания.
внутри здания поставить точку poi кафе с параметрами кафе + level=0 и точку poi твоего офиса с параметрами офиса + level=1.
по рекомендациям, точки внутри контура здания наследуют его адрес.
level "этаж здания" идет от нуля.
Вопрос: Как сделать сохранения в игре?

Лучший ответ:
А с остальными частями игростроя у Вас проблем нет? По моему Вы не стой стороны начали.
Но в целом, определяемся что хранить, как хранить и храним. В случае с игрой в web это может быть localStorage или БД на сервере и конфиг для восстановления в виде json, например. В десктопе это будет файл, хоть txt. В десктопе больше вариантов так что без конкретных исходных данных врядли что-то посоветуют.

Худший ответ:
Ну очевидно сохранять то, что нужно восстановить при следующем запуске
Вопрос: Как сохранить фалы с рабочего стола на w10?

Лучший ответ:
Вы хотите сохранить файлы, удалить вирус или восстановить стабильную работу Windows?
Чтобы сохранить файлы надо воспользоваться загрузочным cd-dvd-флешкой или вытащить диск и подключить к другому компьютеру.
Проверить на вирусы можно с помощью загрузочного cd-dvd-флешки например dr.web
https://free.drweb.ru/aid_admin/
Чтобы восстановить работу Windows в вашем случае наверное проще всего переустановить на чисто ОС, но это не поможет, если у вас кривые руки или проблемы с железом, например с диском.
С помощью загрузочного cd-dvd-флешки на котором есть например Victoria. можно проверить диск, memtest проверить память

Худший ответ:
Safe mod - безопасный режим включаете.
Вопрос: При смене версий PHP вырастает нагрузка на диск, что делать?

Лучший ответ:
Проанализируйте, что же именно делает в это время mysql, хотя бы запустив mytop, и посмотрев explain частых и долгих запросов. 
У вас может просто отсутствовать какой-нибудь нужный индекс в таблице, или неудачно какой-то запрос составлен, и используется активно full scan или file sort.

Худший ответ:
MrKMV34 
Для  ~300 rps много ресурсов расходуется.
Попробуйте поставить на сервер Blackfire.io или XHProf.
Думаю узнаете много интересного о причине нагрузки высокой.
"БД нагрузка ~400prs select" - это вообще не о чем, если только конечно это не супер тяжелые запросы с INNER JOIN на 10 таблиц.
После этого есть смысл запустить https://github.com/major/MySQLTuner-perl и посмотреть рекомендации.
Вопрос: Каким образом составить план проекта клиент-серверного приложения (Web,Android,ios)?

Лучший ответ:
Для проектирования подойдёт Visual Paradigm, если вы умеете пользоваться CASE средствами. (Чисто формально можно и в draw.io работать, но это рушит саму идею, если вам вообще нужен rup'овский подход) Для разработки под Android лучше использовать Android Studio и писать нативно на Java/Kotlin. Если хочется извращений - можно попробовать Dart. Для разработки под iOS лучше всего XCode и Swift/Objective-C, очевидно. Если хотите сразу под несколько платформ, и у вас в команде люди любят C#, то можно попробовать Visual Studio и Xamarin. Для сервера вариантов действительно много. Начиная от python, js, php и заканчивая java, c#, f#.

Худший ответ:
"План проекта" - это можно понять как "техническое задание на разработку".
Его можно создать пошагово, в виде иерархического списка, постепенно детализируя каждый термин (слово), которое вы сами и напишете.
Вот прямо так: исходная ваша фраза "клиент серверное приложение для ......".
И начинаете детализировать каждое слово:
1) клиент: Web, Android, ios
2) серверное: сервер, т.е. хостинг, база данных на нем, программа (скрипт)
3) приложение: тут тоже пишите суть, которую приложение должно предоставлять юзеру (какие данные юзер предоставляет серверу, и какую "услугу" получает от сервера обратно)
Далее нижележащими пунктами 1.1...1.x, 2.1....2.х, 3.1 .... разжевываете термины каждого пункта 1, 2, 3, гугля эти термины: т.е. технологии, языки программирования.... используемые для каждой платформы, нужные поддерживаемые версии операционок, размеры поддерживаемых дисплеев, браузеров для web; типы хостингов, цены, базы данных, языки программирования для данного типа хостинга...; ну и прочие технологии и источники данных, которые нужны в _вашем_ приложении - Вы как автор идеи должны себе представлять какие данные нужны юзеру приложения.
Ну, и все это можно попробовать сделать в сервисе https://androrder.xyz/h4w/
Вопрос: Это функция или объект?

Лучший ответ:
function Name() {} это определение функции. По соглашению, функции начинающиеся с заглавной буквы, являются конструкторами объектов.

Худший ответ:
Вам сюда
Вопрос: Как сделать появление контента без перезагрузки страницы?

Лучший ответ:
Как бы реализовать можно с помощью ajax. Ничего сложного в этом нет. пример реализацииещё один примерпример без jqueryпример от хабр сообщества
Вы прежде чем задать вопрос, гуглили?

Худший ответ:
При клике по ссылке не переходить на неё, перекрывать дефолтное действие, подгружать с нужного урла нужный блок и записывать его содержимое в блок контента на текущей странице
$('a').on('click', function(e) {
$( "#content" ).load( $(this).attr('href') + " #content" );
});
Вопрос: Книги по созданию игры типа doom 2016?

Лучший ответ:
Самые современные приёмы придумывают программисты и академики, в книжках вы найдёте только устаревшую информацию. Начать можете с GPU Gems, многие из описанных там вещей только недавно начали появляться в общедоступных движках. Потом двигайтесь на сайт GDC и их канал YouTube, там частенько бывают технические доклады, где разработчики из студий рассказывают о трюках, которые они применяют в своих играх. Если хотите совсем свежак, который на современном железе еле работает, то вам на SIGGRAPH. Не все статьи оттуда можно применить на практике, но пищу для ума они вам предоставят.

Худший ответ:
Ещё статья по теме
https://habrahabr.ru/post/271931/
Вопрос: Как с помощью яваскрипта не применять файл стилей к определенному блоку?

Лучший ответ:
Единственное что приходит на ум - перетирать свойства

Худший ответ:
Создайте файл default.css, там просто укажите класс, которому нужно сбросить все стили, подключаете также как и app.css и соответственно применяете класс к любому блоку.
https://webref.ru/course/css-basics/priority
Вопрос: Стоит ли бояться проблемы 2038 года и не использовать timestamp?

Лучший ответ:
Большинство веб проектов закрываются в первый год. В следующий ещё  и в последующие годы. Если ваш доживет до 2038 это будет чудо,  ещё с большей вероятностью не вы будете его рефакторить через 22 года(если он доживет). К этому времени его с 100% вероятностью перепишут на чем то другом,  тут не знаешь чего через год два от веба ждать,  а вы в такую даль смотрите.

Худший ответ:
Вы вспомните, какая разработка была 20 лет назад. Да 20 лет назад люди об интернете не знали, только "избранные". Представьте, что будет через 20 лет? Волноваться о проблеме не стоит.
А если на сайте нужно ввести дату - используйте поле date в MySQL, оно поддерживает большой диапазон дат.
Вопрос: Можно ли изучать elixir без erlang?

Лучший ответ:
Можно, но я бы для общей картины почитал про Erlang что бы понимать что да как там происходит.

Худший ответ:
Еликсир = сахар
Если побаловаться - хватит и его
Вопрос: Как организовать смену пароля пользователя при первом входе?

Лучший ответ:
Как вариант:
1. Сервис регистрации пользователя генерит новый временный пароль и шлет по почте + у этого пользователя выставляется флаг PwdChangeRequired = true.
2. Пользователь входит в систему с тем временным паролем, система знает кто вошел и проверяет флаг на true и редиректит его на форму смены пароля.
PS: Я не знаком с Django

Худший ответ:
Обычно реализовывается через password expiration.
То есть нужно хранить дату смены пароля.
Вопрос: Как вести разработку/починку багов в разных ветках в phpStorm?

Лучший ответ:
Gitflow вам в помощь)

Худший ответ:
Загружаем мастер
Создаем ветку фича1, работаем в ней
Если надо пофиксить баг, то
-- коммитим текущее состояние в ветку фича1
-- переключаемся на мастер
-- создаем ветку баг1
-- фиксим баг
-- коммитим баг1
-- переключаемся на мастер
-- мержим баг1 в мастер
-- деплоим мастер
Переключаемся на фича1
Делаем ребейс по мастеру
Продолжаем работу над фича1
Как-то так. В общем, как уже советовали выше - изучаем принципы гита и рекомендованный гит-флоу
Вопрос: Как управлять ролями и правами Laravel 5 и VUE.JS?

Лучший ответ:
Реализуется легко:
на беке юзаете баунсер + $this->authorize/Gate::allows и проверяете нужные права, вне зависимости от фронта.
на фронт с бека передаете берете массив пермишенов (абилитис в баунсере), в том же месте, где передаете юзера (не важно, отдельным запросом или сразу при загрузке страницы). Пишите во vuex'е нужные геттеры, как пример из моего проекта:export const can = (state) => (perm) => this.loggedIn(state) && state.authUser.abilities.includes(perm);
export const canAny = (state) => (perms) => perms.some(x => this.can(state)(x));
И юзаете директивы где нужно, предварительно импортнув нужные геттеры:v-if="can('chat.mute')"
PS: не стоит писать свои директивы "v-can", ибо: 
1) они не информативны (непонятно, что они делают, если прав нет)
2) прийдется написать с десяток таких, на все случаи жизни, типа "can-show", "can-if" и прочая лабудень.
PS2: про "переход по страницам" и любые запросы на бек - ларавель сам кинет forbidden 403, проверяете интерцептором в axios'е на этот статус и кидаете на страницу с ошибкой/показываете окошко/нотификацию/птичку/кошку.

Худший ответ:
Мне вот этот вариант понравился (но тока я еще не опробовал): Implementing Laravel’s Authorization on the Front-End
Вопрос: Api.wunderground — как получить имена дней на русском?

Лучший ответ:
меняй при выводе $arr['date']['weekday']

Худший ответ:
подскажите, а как в этом скрипте подтянуть свои картинки. а не стандартные?!
и вывод температуры воды, если это морской город?
Вопрос: Почему может ослабнуть сигнал wi-fi на ноутбуке?

Лучший ответ:
как вариант антенну проверь. может соскачила

Худший ответ:
Такое ещё бывает при сильно загруженном радио-эфире (помеха или точками соседей). Поиграйтесь с каналами, поставьте авто или принудительно повыбирайте канал. Какой ставить - будет понятно из ссылок ниже. 
Вот ещё немного хороших статей :
Wi-Fi: неочевидные нюансы (на примере домашней сети) /Хабрахабр 
https://habrahabr.ru/post/149447/
https://habrahabr.ru/company/beeline/blog/251899/
https://yadi.sk/d/crTjQFYtRbh8f
https://help.keenetic.net/hc/ru/articles/213968749
https://help.keenetic.net/hc/ru/articles/213968709
https://habrahabr.ru/post/117761/