Что такое SSL и зачем нужен HTTPS

Что такое SSL, HTTPS, зачем всё это нужно и как можно сделать такое на своём сайте? Ответы на эти вопросы в моём новом посте.

Зачем нужен HTTPS сейчас

Раньше, страницы с безопасной передачей данных в интернете встречались довольно редко — это были страницы оплаты, входа или регистрации. Сейчас зеленый замочек слева от адресной строки есть у каждого популярного сайта. Формально, он символизирует, что передача данных между вашим компьютером и сервером сайта происходит в зашифрованным виде, и никто не может на пути между этими двумя точка узнать номер вашей карточки или логин с паролем. За последние три года, передача данных через безопасный протокол HTTPS стал де факто стандартом в современном интернете.

Любопытно, что с ростом популярности протокола, появились причины его использовать, не связанные напрямую с факторами безопасностью. Вот некоторые из них:

  1. Многие продвинутые возможности API взаимодействия с браузером требуют HTTPS, например, использование камеры, запись звука, использования оффлайн возможностей.
  2. Посещаемость сайта. Гугл заявил, что доступность безопасного протокола является одним из фактором поисковой выдачи, а популярные браузеры хотят в будущем помечать небезопасные сайты специальной отметкой, что будет отпугивать аудиторию.
  3. Многие технические возможности или их реализации, например, использование нового протокола передачи данных HTTP/2 или Websockets в некоторых старых браузерах, требуют обязательного использования шифрования.
  4. Ваш сайт становится безопаснее — больше в него нельзя врезать рекламные блоки или контент с небезопасных сайтов.

SSL, TSL

Однако факт общения с сайтом через HTTPS не означает того, что вашим данным обеспечена безопасность. Дело в том, что есть разные варианты криптографических протоколов, и новые продолжают разрабатываться до сих пор. Например, все SSL протоколы уже считаются устаревшими и не отвечают современным требованиями безопасности — известно, как их можно обойти. Их заменили более новые TSL протоколы. Кроме этого, необходимо произвести настройку веб-сервера таким образом, чтобы максимально использовать все возможности безопасности. Проект SSLTest позволяет оценить, насколько современные и безопасные варианты протоколов и опции используются на сайте. На момент написания этой заметки, этот сайт имеет высшую оценку от SSLLabs — A+. Ниже фрагмент конфига веб-сервера Nginx, который позволяет получить такую оценку:

Прогресс не стоит на месте, изобретаются новые шифры и находятся новые уязвимости; со временем этот конфиг устареет, поэтому перед использованием обязательно убедитесь в его актуальности.

Let’s encrypt

Наверное, одним из серьёзных факторов роста популярности HTTPS стала доступность приобретения сертификатов. Цена в 400 долларов за сертификат — довольно дорого, но теперь есть отличный способ получать сертификаты совсем бесплатно. Некоммерческая организация Let’s encrypt создала автоматизированный сервис по выдаче сертификатов, поэтому теперь вопрос цены отпал. Ложка дёгтя — такие сертификаты действительны только три месяца, поэтому их надо часто генерировать заново.

Есть большое множество клиентов для сервиса, я перепробовал несколько и мне больше всего понравился вариант на языке Ruby. Вот как выглядит генерация сертификата для одного домена в командной строке:

Первая команда сгенерирует вам ключ, вторая команда получит сертификат, если осталось меньше 20 дней до окончания срока действия сертификата текущего или если его нет. Нужно подставить свои пути к ключу, который сгенерировали первой командой, путь к доступной из интернета корневой директории сайта (в современных фреймворках такие директории обычно называют public, web, webroot) и ключ для сохранения всех данных. Последнюю команду можно использовать как задачу для Cron и автоматически обновлять сертификаты.

Я советую эту книгу для полного понимания того, как работает шифрование. Надеюсь, эта информация поможет вам сделать ваши проекты безопаснее и удобнее.

Как легко читать больше пяти книг каждый месяц?

В современном ритме жизни для многих людей чтение книг — скорее роскошь, нежели приятное времяпрепровождение. Однако есть довольно простой способ продолжать читать книги!

А вы читаете книги?

В современном ритме жизни для многих людей чтение книг — скорее роскошь, нежели приятное времяпрепровождение. Сложная работа, домашние хлопоты, усталость и вот вы откладываете книгу на завтра. И так происходит день за днём, месяц за месяцем и вот наступает новый год, вы смотрите на свои новогодние обещания и наступает шок. Оказалось, что вместо пятидесяти книжек за год вы прочли только три, да и то две из них лишь потому, что того потребовала ваша работа. Скажете, это не про вас? Согласно исследованию, одна пятая россиян вообще не читает книги и только лишь треть читает их каждый день.

books-1655783_1280

Выход есть!

Первым компонентом успеха является аудио книги. Да, это не какая-то техника скорочтения, а просто аудио книги. Дело в том, что именно они обладают той гибкостью и удобством, которая нужна, чтобы вы чаще читали. Самое главное преимущество — вы можете слушать аудиокнигу, когда вы ходите. Если вы не отчаянный домосед, то какое-то время вы проводите на улице — идёте в магазин, проводите время в транспорте по пути на работу или просто бегаете на дорожке. Всё это время можно эффективно тратить, слушая аудиокнигу. В целом, любую физическую активность, не требующую концентрации можно совместить с прослушиванием звука. Конечно, в транспорте можно читать и обычную книжку, но у бумаги есть ряд минусов: ваши глаза устают после работы за компьютером, плохо освещение и постоянная тряска портит вам зрения, а шумы и необходимость зафиксировать книгу в одном положении добавляет дискомфорта. Кроме того, это всё-таки вес и объём, который нужно с собой носить. А телефон есть у всех, нужно лишь убедиться, что у вас хорошие наушники (тут важно отметить, что вблизи дорог, мест, с активным дорожным движением, в метро нельзя полностью изолировать свой слух — вы можете не услышать звуковой сигнал автомобиля и умереть). И да, исследования показали, что никакой разницы в восприятии между обычным чтением и аудиокнигами нет, так что если вам не нравятся аудио книги — возможно вам стоит попробовать ещё. Я сам не сразу полюбил такой вид книг, где-то после четвёртой книги я оценил всю их прелесть.

18223027523_19f3a51cb2_b

Второй компонент — это ваше внимание. Вам следует вернуть его себе, а значит перестать тратить время на бесконечные новости. Залипания в ленте твиттера каждый час, статьи с новостных сайтах, лента фейсбука, новые лайки — всё это необходимо выключить. На эту бесполезную информацию вы тратите больше количество времени, как минимум — полчаса в день. Вместо этого, лучше сделать так:

  1. Отфильтровать все новостные ресурсы, оставив только новости, связанные с вашей работой или основным интересом;
  2. Убедиться, что вы получаете информацию из соц. сетей только от людей, которые важны для вас;
  3. Выделить себе время раз или два в день, когда вы готовы просмотреть эту подготовленную для вас информацию, стараясь не тратить более получаса на это;
  4. Отключить все отвлекающие вас на новости и социальные сети уведомления. Теперь, когда у вас есть расписание, вам не нужно сразу же всё проверять — у вас будет на это время.

На самом деле это очень сложно сделать, но если у вас получится, вы приобретёте гораздо больше времени на чтение книг и освободите внимание от лишней информации

Где достать аудио книги?

screen

Лично я пользуюсь сервисом Audible.com, который позволяет довольно легко и удобно покупать и прослушивать книги на твоих устройствах. Я советую вам активировать 30-дневный пробный период, который позволит вам приобрести две бесплатные аудиокниги. Учтите, что если вы передумаете, вам нужно будет отказаться до того, как пройдёт 30 дней, иначе произойдёт автопродление подписки. Однако не все книги есть в этом сервисе, поэтому не стоит себя ограничивать только одним источником. Например, эта подборка содержит множество сайтов, где можно бесплатно скачать материалы. На худой конец Гугл всегда поможет найти аудиоверсию, а проявив изобретательность, иногда можно найти совершенно удивительные версии, например, «Комедию» Данте на итальянском языке.

Лучший способ знакомиться в интернете

Действительно ли сервисы знакомств хотят, чтобы вы нашли свою любовь? Краткой обзор приёмов и манипуляций, которыми пользуются сайты знакомств.

Vkino.ru

История этого поста началась после того, как подруга дала ссылку на этот сайт. Помимо стандартного механизма совпадений по лайкам (вы и партнёр получаете уведомление и возможность общаться, если оба поставили лайк друг другу), на этом сайте имеется афиша кинофильмов и можно договориться пойти с кем-нибудь в кино. Довольно быстро меня смутило странное поведение пользователей. Люди, с которыми я вёл диалог отвечали совсем невпопад, полностью игнорируя мои фразы. У меня создалось впечатление будто отвечал мне не живой человек, а простенький скрипт. После моего лайка пользователи оказывались онлайн даже в очень позднее ночное время.

vkino

У всех сайтов, где требуется активность пользователей на начальном этапе есть проблема — у них нет этих пользователей. Создав фейковые профили, которые умеют совершать базовые действия, сайт кажется активным, более полным пользователей. Это не фантазия, а реальность, самый известный случай — пример сайта Ashley Madison. В результате взлома этого сайта, стало известно, что вместо реальных женщин, с мужчинами там общались боты. Все эти женские аккаунты нужны потому, что мужчины чаще пользуются такими сервисами и при этом активно платят за дополнительные услуги. Давайте посмотрим, как разные компании используют знакомства для обогащения и какие не совсем честные приёмы они могли бы использовать.

Teamo/Badoo

2016-10-21-13-33-07

Это два разных сервиса, но их объединяет одно — жёсткая монетизация всего и вся. Пользоваться бесплатно этими сервисами очень сложно — постоянно требуется активировать премиум или что-нибудь купить. Оба сервиса обманывают пользователя, размещая уведомления о лайках в «сообщениях», при этом для лайков есть отдельный раздел. Просто, чтобы увидеть, кто именно тебя лайкнул, нужно заплатить денег, поэтому реализована реклама в двух местах. Сервис Teamo пишет, что чтобы посмотреть чужие фотки, нужно либо загрузить свои, либо заплатить. Но на самом деле, даже загрузив фотки, ты всё равно должен заплатить деньги. Сервис Badoo не позволяет писать некоторым пользователям, говоря, что у них заполнен ящик сообщений. Конечно, это полный бред, просто это ещё один повод продать доп. услугу.

Pure

pure-1

Вы наверняка слышали об этом приложении из рекламных постов, суть которых сводится к тому, что в приложении якобы острая нехватка мужчин и полно желающих секса женщин. Может быть вы узнали об этом приложении от «секс-евангелистов», которые занимаются тем, что пересказывают западные книжки и пиарят своё имя. У приложения довольно необычная монетизация — подписку оплачивает только мужчины, отсюда и весь пиар этого сервиса, нацеленный на тех, кто платит. Механика тоже любопытная — ты размещаешь фотографию с геотегом, и она будет висеть в течение часа. Если ты кому-то понравился и есть взаимное согласие на общение, то становится доступен чат, тоже на один час. Такая механика даёт простор для мошенничества — при первом запуске можно создать фейковые профили и показывать их, чтобы создать видимость активности, можно даже начинать чаты и их не нужно как-то логически завершать, ведь всё удалится через час.

Tinder

girl

Самый простой сервис — основой является совпадение лайков. Месячная подписка (около 1200 рублей в месяц) даёт незначительные удобства: бесконечные лайки и пять «суперлайков». Суперлайк мгновенно даёт знать партнёру, что ты ему поставил лайк. Реклама платной услуги не очень навязчивая, в целом сервис приятный и удобный. Также суперлайки можно покупать отдельно. Но и тут не всё чисто. Проблема в том, что люди в очереди могут повторяться. Это нелегко заметить, но это так. Вопрос без ответа — будут ли они появляться повторно, если я поставил суперлайк? Пачки суперлайков можно купить за деньги, и если девушки, которых ты «суперлайкал» повторяются, получается, что можно потратить больше одного на одного человека. Непонятно так же, что происходит в первый и второй раз — будет ли отправлено уведомление, или с тебя просто снимется лайк и у другого человека ничего не произойдёт. О том, что этот человек тебе попадался раньше и ты ставил лайк нигде не пишется.

Но самый главный вопрос — как генерируется колода карточек. Достоверно известно, что те, кто тебя залайкал ставятся в первый десяток карточек. Но так же вполне вероятно, что для новых пользователей в начало ставятся более привлекательные пользователи, чтобы у тебя создавалось впечатление, что в сервисе много красавиц. Это конечно теория, но я допускаю, что все пользователю имеют рейтинг привлекательности и этот рейтинг используется в маркетинговых целях, чтобы создать у тебя определенные впечатления и мотивировать на покупку дополнительных услуг.

Tinder.su

И напоследок, вопиющий пример эксплуатации чужого имени. Кто-то сообразительный смекнул, что название «tinder» на слуху и запилили простенький сервис. Теперь этот сайт появляется в топе по запросу tinder и ловит пользователей, которые не могут отличить «настоящий» тиндер от «подделки».

Проблема всех этих сервисов в том, что мужского «предложения» очень много, а женского «спроса» почти нет. Мужчины играют в менеджеров по продажам, создавая «воронку знакомств». Чтобы у него был шанс на свидание, ему надо ставить лайк всем, потом придумывать остроумную фразу, чтобы его заметили среди всех «привет, как дела?», и в самом конце получить номер телефона. Если женщина милая, то она будет получать десятки или даже сотни сообщений, которые внимательно изучить нереально.

В качестве эпилога предлагаю вам бизнес-идею — создать приложение «Шавиндер», в которым совместить сервис знакомств с шавермой на карте. Лучше способ понять, понравится тебе человек или нет, это выяснить, какая шаверма ему нравится. Есть поговорка — скажи мне, нравится ли тебе шаверма в pita’s и я скажу тебе, сможем ли вместе жить до старости. Что может быть романтичнее свидания в шаверме у Джамала и полуночных посиделок позади Казанского с шавухой и пивком? Пока будет мало реальных пользователей, можно сделать девушек-ботов, например, украв фотографии из пабликов про девушек с шавермой.

Платные услуги могут быть тематическими, например, вместо цветов в офис можно отправлять шаверму, все коллеги услышав запах, сразу умрут от зависти, эффект будет круче, чем от сотни роз. Более того, это явно более современный и гендерно-нейтральный подарок, ведь для мужчин цветы бесполезны, а шаверме все будут рады. А шаверменные могут устраивать оффлайн мероприятия, типа знакомств за пять минут среди фанатов заведения. Возможности такого приложения по кросс-маркетингу просто безграничны!

Как прочитать большой файл в PHP?

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

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

Давайте определимся — что такое большой файл? На мой взгляд, большой файл, это файл такого размера, который не может целиком уместиться в рабочую оперативную память php процесса. Мы не можем просто взять и разместить всё содержимое в строковую переменную, потому что поймаем ошибку «Fatal error: Allowed memory size of XXX bytes exhausted».

Раз нельзя прочесть файл целиком, то надо его прочитать по частям. Есть функция fgets() или более гибкий вариант stream_get_line. Но если мы не знаем формата файла и не уверены, что там есть какие-либо обозначения новой строчки или форматирование, нам придется читать кусками фиксированный длины с помощью функции fread().

Принцип простой — нам нужно два механизма. Первый должен считывать текст по кусочкам из файла. Второй должен принимать эти кусочки и обрабатывать их. В этом посте речь идёт о первом механизме. Для удобства я создал класс, который реализует интерфейс SeekableIterator, что позволяет прочитать файл таким образом:

Теперь о первом подводном камне — класс для реализации интерфейса использует функцию fseek(). Функция устанавливает курсор (указатель) на нужную позицию, чтобы начать считывать байты с нужной позиции. Но она перестает работать, когда позиция превышает внутреннюю константу PHP_INT_MAX, на 32-битной установке PHP (и на 64-битных версиях для Windows, которые внутри используют 32-битные целые числа), эта константа практически равна количеству байтов в двух гигабайтах. Поэтому чтобы нормально работать с большими файлами, PHP должен быть скомпилирован с поддержкой 64-битных целых чисел.

Второй подводный камень — это скорость чтения с диска. При чтении большого файла диск будет загружен большим количеством операций чтения (и возможно записи, если в процессе обработки кусков будет эта операция) и это может продолжаться довольно долго. Это может привести к проблемам в работе других процессов, поэтому такое чтение следует совершать на диске, где нет других процессов, например, на специально выделенном хранилище для обработки логов. В идеале, следует продумать всю связку софта и железа заранее. Если вам нужно делать записи в базу, вероятно, лучше разместить её на другом диске или даже сервере, стоит продумать над величиной считываемого куска, чтобы уменьшить количество операций, возможно даже стоит сделать трех-ступенчатую обработку файла: считать куски, совершить легкую подготовку и сохранить данные и уже асинхронно провести окончательную обработку информации. Вроде такая простая задача, а сложностей может возникнуть огромное количество.

Вот мой пакет, о котором я писал выше: https://github.com/DmitriyNyu/chunked-file-reader, так же можно поискать и другие решения, в том числе заточенные под конкретные фреймворки.

Javascript, ход мыслей и инсайты

Три задачи, которые помогли мне понять мои слабые места, как программиста.

Я уже писал о том, что полюбил делать задачи для программистов. Сегодня поделюсь задачами и решениями, которые буквально заставили меня схватиться за голову от удивления. Но сначала кратко расскажу о сайте codewars.com и его особенностях. Оформление сделано в стилистике японских боевых искусств — задачи называются «катами», а сложность задач и рейтинг пользователей обозначаются кю — от 8 по 1, по мере возрастания сложности задач или умений борца. Уникальное отличие этого сайта от других аналогов — удобная среда для ввода кода, огромное количество поддерживаемых языков и хорошее сообщество.

Задача «Пары медведей»

Description:

In order to prove it’s success and gain funding, the wilderness zoo needs to prove to environmentalists that it has x number of mating pairs of bears.

You must check within string (s) to fid all of the mating pairs, and return a string containing only them. Line them up for inspection.

Rules: Bears are either ‘B’ (male) or ‘8’ (female), Bears must be together in male/female pairs ‘B8’ or ‘8B’, Mating pairs must involve two distinct bears each (‘B8B’ may look fun, but does not count as two pairs).

Return an array containing a string of only the mating pairs available. e.g:

‘EvHB8KN8ik8BiyxfeyKBmiCMj’ —> ‘B88B’ (empty string if there are no pairs)

and true if the number is more than or equal to x, false if not:

(6, ‘EvHB8KN8ik8BiyxfeyKBmiCMj’) —> [‘B88B’, false];

x will always be a positive integer, and s will never be empty

С ходу я решил, что это задача — упрощенный вариант поиска палиндромов в строке. То, что задача всего лишь на 6 kyu меня не смутило, и я стал обдумывать базовый алгоритм:

  1. Ищем в строке букву «B», пока не дойдём до конца строки
  2. Если буква найдена, проверяем есть ли символ «8» слева, а потом справа
  3. Если есть слева, добавляем комбинацию «8B» в результат, увеличиваем счётчик пар на единицу
  4. Если есть справа, добавляем комбинацию «B8» в результат, увеличиваем счётчик пар на единицу
  5. Подготавливаем и возвращаем результат

Этот алгоритм не совсем рабочий для строки «B8B8», потому что вместо «B8B8» он вернёт «B88BB8». Поэтому, в случае, если мы нашли восьмерку справа, нам надо запомнить индекс и этот факт и в следующий итерации пропустить поиск восьмерки слева и обнулить флаг, отвечающий за это. В итоге, у меня получилось вот так:

Довольный, я нажал на кнопку «Submit final» и стал смотреть лучшие чужие решения. Вот такие варианты я увидел в топе:

Крайнее удивление

Да, эта задача решается в две строчки c помощью метода String.match (). Палиндромы в моей голове так сильно засели, что я просто забыл про регулярные выражения. Могло сыграть роль то, что в целом, я стараюсь избегать использования регулярных выражений, так как при частом изменении кода, их обслуживание может превратиться в ад. Ещё один аналогичный пример, нужно было создать функцию проверки ip адресов формата IPv4, вот моё решение:

А вот лучшее решение:

Задача «Шпион»

Description:

In testing, a spy function is one that keeps track of various metadata regarding its invocations. Some examples of properties that a spy might track include:

  • Whether it was invoked
  • How many times it was invoked
  • What arguments it was called with
  • What contexts it was called in
  • What values it returned
  • Whether it threw an error

For this kata, implement a spyOn function which takes any functionfunc as a parameter and returns a spy for func. The returned spymust be callable in the same manner as the original func, and include the following additional properties/methods:

  • .callCount() — returns the number of times spy has been called
  • .wasCalledWith(val) – returns true if spy was ever called with val, else returns false.
  • .returned(val) — returns true if spy ever returned val, else returns false

Эта задача напомнила мне основы JavaScript’а. На первый взгляд, очевидно, что надо обернуть функцию в другую, но как сделать вызов методов? Что нужно возвращать — объект? Функцию? Метод? Вот решение:

Я просто забыл, что функции являются объектами в JS и к ним можно прикреплять методы. Если об этом помнить, то задача становится очень легкой.

Задача «Разминирование бомбы»

Description:

There are a series of 10 bombs about to go off! Diffuse them all! Simple, right?

Note: This is not an ordinary Kata, but more of a series of puzzles. The point is to figure out what you are supposed to do, then how to do it. Instructions are intentionally left vague.

Иногда встречаются любопытные задачи, больше похожие на головоломки. Вам даётся объект Bomb с методом defuse, нужно исследовать его разными способами, чтобы разминировать все десять бомб. У меня пока не получилось разминировать все бомбы, быть может, вы сможете это сделать? Регистрируйтесь на сайте codewars.com и спасайте мир или считайте медведей решая классные задачи!

Зачем решать задачи для программистов?

Рассказываю, какую пользу приносит решение задач для программистов.

Мне очень нравится сайт codewars.com. На нём представлены задачи для программистов самой разной сложности. Большое количество языков и возможность посмотреть чужие варианты решения для меня — очень крутые возможности сайта. В этой заметке, я объясню, почему каждый программист должен решать хотя бы одну задачу в день.

Задачи будут держать ваш мозг в тонусе

Большинство задач — не такие, какие приходится решать на работе в офисе. Часто они требует каких-то общих знаний, алгоритмов, не привязанных к предметной области, поэтому решать их может любой программист, независимо от того, делает он сайты или пишет код для железа. Они требуют некоторой креативности и неплохо будят ум, поэтому я часто делаю одну задачу утром, помогает проснуться лучше, чем кофе!

Вы будете лучше знать язык

Многие задачи заставили меня читать документацию, потому что оказалось, что с ходу я не могу вспомнить многие названия функций/методов. Например, в начале попалась задача для JavaScript — написать функцию, которая переводит число из десятичной системы счисления, в двоичную. Я стал вспоминать школьные уроки информатики, как мы записывали руками в тетрадку единички и нолики и написал такой алгоритм. Когда я отправил решение и стал смотреть чужие — я ахнул! Оказалось, что самое простое решение просто использует второй параметр функции parseInt(string, radix). Я вообще не знал, что у этой функции есть второй параметр. Более того, если его не использовать, могут быть проблемы с тем, как будет интерпретироваться строчка.

Другой пример любопытного кода на Javascript. Простая задача по написанию функции, которая считает объём конуса. Результат нужно было округлить вниз. Я вполне разумно использовал Math.floor(num), но, как оказалось, округлить можно и другим способом — использовав два раза битовую операцию NOT, которая в языке совершается через двойную тильду ~~. При этом, согласно некоторым бенчмаркам, такая операция совершается быстрее, чем вызов Math.floor():

В качестве третьего примера приведу задачу, где нужно было создать код, который позволял был делать что-то вроде:

Понятно, что решением такой задачи является каррирование, но как его реализовать с нуля в JavaScript? Ответа я не знал, зато в гугле нашёл отличную статью на эту тему — https://medium.com/@kevincennis/currying-in-javascript-c66080543528#.o5a0hf9z0

Вы будете внимательнее читать условия задачи

В таких задачах часто используется много воды, и чтобы понять, что же конкретно нужно сделать, надо внимательно прочитать задание несколько раз. Вот текст задачи:

Ask a small girl — «How old are you?». She always says strange things… Lets help her! For correct answer program should return int from 0 to 9 😉 Assume test input string always valid and may look like «1 year old» or «5 years old», etc.. The first char is number only =)

Моё решение брало первый символ строчки, преобразовывало его в целое и возвращало. А самый топовый вариант решения выглядит вот так:

И это годится именно по текущим условиям задачи.

Это интересно, полезно для кругозора и для будущего

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

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

Наконец, это действительно интересно, очень приятно, когда твоё решение наконец-то проходит все проверки и вы можете сказать, что да, я решил эту задачу!

Видео: объектно ориентированное программирование это плохо

Долгое, противоречивое и любопытное видео, в котором автор объясняет, почему объектно ориентированное программирование это плохо.

Долгое, противоречивое и любопытное видео.

Как с помощью машинного обучения предсказать, совершит ли клиент возврат?

Я пробую свои силы в машинном обучении. Строю модель и пытаюсь классифицировать заказчиков!

Машинное обучение у всех на слуху, и я тоже решил попробовать свои силы в этом деле.

Суть машинного обучения — находить определенные паттерны, закономерности в данных и предсказывать результаты для новых данных на основе эти паттернов. Имеет смысл это применять тогда, когда данных так много, что человеку заметить эти закономерности не под силу.

В качестве платформы для разработки, я выбрал R — язык и я бы сказал даже целый фреймворк. Другой альтернативой я рассматривал Python, но у меня есть проблемы с установкой некоторых пакетов, поэтому я отказался от него.

Процесс состоит из пяти шагов:

  1. Постановка задачи/вопроса
  2. Подготовка данных
  3. Подбор алгоритма
  4. Тренировка модели
  5. Тестирование модели

При этом, процесс итеративный, и часто приходится возвращаться к тому или иному предыдущему шагу. На сайте godesigner.ru есть возможность создать проект, в котором заказчик может вернуть себе вознаграждение дизайнерам, если ему не понравился результат. В целом, это не очень круто, потому что хотелось бы, чтобы все заказчики уходили довольными. Зная о том, что клиент может вернуть деньги, можно например превентивно с ним связаться и что-то предпринять. Вопрос был сформулирован так «На основе имеющихся данных о свойствах проектов и статистике возвратов предсказать, будет ли проект возвращён?». Сразу скажу, что я не был уверен, что по данным это можно определить, потому что данных немного и я не был уверен, что это вообще реально сделать.

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

  • Категория
  • Номер заказчика
  • Награда
  • Количество платных доп. опций
  • Количество оставленных оценок
  • Количество оставленных комментариев
  • Количество дней на конкурс
  • Флаг возврата

В целом, после фильтрации получилось немного строк, годных для тренировки — 852 строчки, совсем не Big Data. Тем не менее, я продолжил процесс, дальше стал выбирать алгоритм. Тип обучения у нас — обучение с учителем, задача из разряда классификации (нужно предсказать бинарное значение). Выбор пал на Random Forest, был написан следующий скрипт и запущен тренировка с выводом результатов:

Вот результат тренировки:

Ключевые параметры Accuracy, Sensitivity, Specificity. Несмотря на высокую общую точность предсказания — 85%, точность угадывания возврата низкая — 20%. Это меньше, чем подброс обычной монетки, что никуда не годится.

Тут следует пересмотреть данные, алгоритм или заняться тюнингом модели. Я пошёл по простому пути и решил попробовать другой алгоритм Random Ferns, результаты любопытные:

Из этой статистики можно сделать вывод, что вторая модель гораздо более подозрительная — она предсказывает возвраты намного чаще, вероятность — 62%, но делает это за счёт гораздо большего количества ложных подозрений проектов без возвратов. Какая из моделей лучше? Сложно сказать однозначно, они обе достаточно плохие, но наверное в определенных ситуациях вторая может подойти, потому что с практической точи зрения она даёт больше шансов среагировать на возможный возврат и предотвратить его.

Я ещё поэкспериментирую с этим вопросом, например, я попробую немного иные данные — возможно это изменит цифры. А ещё есть второй вопрос, который в простом виде звучит так: «сколько решений получит заказчик, создав проект с такими свойствами?», он интереснее тем, что для него можно собрать больше данных. Это тема для другого поста.

3 частые проблемы производительности веб-приложений, первая проблема

Описываю самый распространённый анти-паттерн, который может быть в вашем коде прямо сейчас.

Все мои знакомые программисты допускали хотя бы одну ошибку из этого списка в начале своей карьеры. Это такие дурацкие ошибки, которые с высоты опыта настолько очевидны, что даже непонятно, как их можно допускать. Но факт в том, что их допускают все, сегодня я написал про первую из них.

Дорогие запросы к базе данных внутри цикла.

Самый банальный пример и очень часто встречающийся паттерн в коде. Мы получаем откуда-то айдишники строк в БД (это может быть что угодно, перечень товаров на главной, содержимое корзины, номера статей с лайками пользователя) и далее по этим номерам делаем запросы и собираем массив/коллекцию:

Во-первых, тут присутствует красный флаг, о которым я писал ранее (https://dmitriynyu.com/perfomance-testing/) — нет ограничения на количества шагов в цикле. Код написан так, что мы вынуждены надеется, что количество айдишников, которое вернёт getIdsOfItemsInCart() будет небольшим, но на самом деле, мы этого точно не знаем.

Во-вторых, этот паттерн очень ловко маскируется. У вас в коде он может существовать не в таком явном виде, как в примере выше, это может быть например прикрепление свойств товара в интернет магазине к номенклатурной позиции. Менеджер добавил о 100 свойств к каждой детской игрушке — цвет, вес, форма и т.д., и теперь при каждом простом запросе вроде:

самописная и не очень умная ОРМ в глубине модели Item совершает 100 отдельных запросов к этим свойствам (это реальный случай).

В-третьих, этот вредный паттерн очень легко недооценить и проигнорировать. Например, внутри метода Item::first() может происходит кеширование. Полагаясь на это, вы подвергаете себя риску низкого быстродействия в случае, когда вдруг кэшу не хватит памяти и он решит почистить эти записи. Вполне реальна ситуация, когда в начале метод в цикле просто возвращал захардкоденные значения, а потом этот метод порефакторили, и он стал обращаться к базе. А про то, что метод вызывается до 100 раз в цикле, все забыли или не проверили.

Слишком много рисков, связано с запросами внутри циклов, поэтому я настоятельно не рекомендую их использовать, собирайте все данные одним запросом (не забывая, про ограничения на количество), а потом уже работайте с элементами коллекции. В случае, если вы совершаете рефакторинг какого-то метода, проверьте, где он используется. Если есть вызовы в цикле — подумайте над его быстродействием.

«Тут я пришёл в комментарии»

Самый смешной и, на мой взгляд, интересный доклад про быстродействие виртуальных машин и как правильно это измерять.

Самый смешной и, на мой взгляд, интересный доклад про быстродействие виртуальных машин и как правильно это измерять