Про PiterJS 13

Делюсь с вами впечатлениями и знаниями с piterjs 13!

Я сходил на PiterJS 13, который прошел в Селектеле, ниже информация, которую я почерпнул от докладчиков.

Re-imagining Webpack

Оказалось, что в Хельсинки одновременно с PiterJS проходил митап про react, и доклад Юхо Вепсалайнена мы слушали через скайп. Юхо рассказал про путь появления вебпака из не принятого пулл реквеста (#меняневзяли), про того, каких успехов добилася проект и показал красивые экспоненциальные графики роста скачиваний. Вот несколько интересных фактов и идей, которые я запомнил из его рассказа:

  • Вебпак хотят децентрализовать, отделить разработку ядра от разработки различных лоадеров. Для них есть отдельное сообщество, где ссылки на все репозитории есть в одном месте, очень удобно;
  • Вебпак принимает пожертвования через платформу Open Collective, вы можете видит все траты на проект и отправить деньги в помощь, в идеале, автор хочет работать над вебпаков фул-тайм и это вполне возможно с помощью этого механизма;
  • Можно голосовать за фичи, которые будут у разработчиков в приоритете на специальной странице;
  • Юхо написал книжку про вебпак (и ещё одну про реакт), её можно бесплатно прочитать тут или купить через leanpub.

Документация кода в JS

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

  • Старайтесь, чтобы названия переменных и методов объясняли, что они делают;
  • Обязательно комментируйте код, в котором есть высокий уровень сложности, какие-то хаки и сюрпризы;
  • Автоматизируйте процессы — используйте автогенерацию и линтеры;
  • Указывайте в комментариях используемые единицы измерения и допустимые диапазоне;
  • Прочитайте книги «Code Complete» и «Clean Code».

А видео можно посмотреть по этой ссылке.

Нужен ли мне TypeScript?

Александр Баумгертнер попытался разобраться, нужна ли типизация и можно ли без неё обойтись. В качестве альтернативы TypeScript’у и Flow, Александр предлагает использовать очевидные названия переменных и функций, а для удобства работы в редакторах использовать простые JSDoc аннотации.

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

  • Без использования внешних инструментов, требуется, что все участники разработки обладали достаточной дисциплиной для написания кода в «правильном» стиле, а это сложно, особенно когда разработчики разного уровня;
  • Необходимость писать аннотации типов для абсолютно всех вещей в коде, даже тех, которые никто не увидит. Это требует колоссальных усилий, а качество комментариев понижается из-за чисто технический записей;
  • Иногда бывает сложно придумать очевидное название для функции, или в некоторых случаях, как например с переменной, которая содержит дату, тип этой переменной может быть непонятен и можно с ней совершить неправильно операцию. В случае с типизацией, код не скомпилируется, а без проверок — упадёт в рантайме;
  • Падение в яму провала — поддерживая руками типы вместо использования автоматических инструментов, вы увеличиваете вероятность появления ошибки, которая рано или поздно произойдёт и приведёт к проблемам.

Дискуссия интересная, поэтому я советую посмотреть видео тут.

Про #pitercss 11

Делюсь с вами впечатлениями и знаниями с pitercss 11!

Про «Semrush»

21 марта в питерском офисе компании Семраш прошёл митап про вёрстку и дизайн. Отдельно хочется отметить Семраш, не так много компаний с российскими корнями хорошо известны на западе, например, недавно Ноа Кэйган, маркетолог и бизнесмен упомянул продукт в своем блоге (Ноа сам по себе интересный человек и активно делиться своими знаниями, советую подписаться). Такие компании всегда ищут людей и это хороший вариант для работы. Лично я люблю больше компании, которые разрабатывают свой собственный продукт, а компаний такого размера, которые не были бы аутсорсерами в СПб можно пересчитать по пальцам руки. Поэтому вот ссылочка на вакансии, если вы в раздумьях о своём будущем — посмотрите позиции,  уверен, что что-то вас заинтересует.

Относительный CSS

Первым выступил Валерий Любимов  рассказал про относительные величины в CSS — rem, vw, vh, vmax, vmin и currentColor. Лично для меня это были новые вещи, потому что за CSS я не особо слежу, хотя про rem слышал.

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

Аналогичную экономию труда предлагает rem — единица измерения, которая вычисляется относительно корня html, а не от текущего размера шрифта, как у простого em. В сложном коде бывает непросто понять, от какого именно размера считается em, в случае с rem вы всегда знаете число и для изменения размеров под разные вьюпорты с помощью медиа-выражений достаточно в одном месте задать разные варианты размера font-size для тега html, чтобы получить адаптивность для всего проекта. Из минусов rem-ов можно отметить сложность создания изолированных компонентов, так как появляется жесткая внешняя зависимость от размера тега html, возможные проблемы с браузерным зумом и сложность конвертации абсолютных величин из макета дизайнера в относительные величины от размера шрифта, не уверен, что тут можно получить пиксель-пёрфект верстку.

vw, vh, vmax и vmin — позволяют задавать размер в процентах от вьюпорта, что супер полезно, когда вы хотите разместить блок на весь экран, например для лайтбоксов или промостраниц, можно заменить javascript код на простой изящный CSS. Правда, тут есть свои особенности, связанные с подсчётом ширины скроллбаров и адресной строки, которая исчезает в браузерах.

Презентация доклада: https://pitercss.ru/11/pres/relative-css/

Учите дизайнеров верстать

Дизайнер Вадим Матвеев рассказал зачем он научился верстать. Оказалось, что знания верстки даёт кучу преимуществ всей команде.

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

Презентация доклада: https://pitercss.ru/11/pres/design-code.pdf

Дизайн-системы. В поисках «идеального компонента»

Роман Ганин рассказал про дизайн системы и показал, как очень легко можно превратить обычный параграф текста в интерактивный и информационный веб-документ минимальными средствами без кучи фреймворков. Посмотрите презентацию: https://pitercss.ru/11/pres/ideal-component/

Фронтендер + Дизайнер = ♥

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

Какой язык программирования учить в 2017

Наступил 2017 год, а значит, следует задуматься над тем, какие языки программирования выучить в этом новом году! Я решил создать свой собственный топ-10 самых актуальных языков, базируясь исключительно на своём мнении.

Вступление

Наступил 2017 год, а значит, следует задуматься над тем, какие языки программирования выучить в этом новом году!  Я решил создать свой собственный топ-10 самых актуальных языков, базируясь исключительно на своём мнении. Должен сказать, что учить язык программирования, чтобы просто его знать — дурацкая затея и так делать не следует. Лучше сначала придумать, зачем вы его хотите выучить. Вторая оговорка — в большинстве случаев, знание языка ничего не даёт. Гораздо важнее разбираться в инструментах и фреймворках этого языка. Каждый язык вы сможете изучить на достаточном уровне за месяц, а то и меньше, а вот, чтобы разобраться во всех важных библиотеках и фреймворках, может уйти очень много времени и практики. Также в целом я опираюсь на российские реалии, где экономика и образование формирует рынок труда иногда весьма специфичным образом.

10. Scala

Скала прекрасный функциональный (и не только!) язык, отлично подходящий для создания риалтайм программ и работы с параллельными вычислениями. Среди всех функциональных языков именно этот завоевал наибольшую популярность в России. Этот язык базируется на платформе Java Virtual Machine, а значит может взаимодействовать с обычным Java кодом и использовать его пакеты. Из-за этого факта, а так же потому, что многие команды мигрируют с Джавы на Скалу, часто можно видеть в вакансиях сочетание Scala/Java. В целом, Scala не самый простой язык, но при этом парадоксально, именно новичкам, не знакомым с другими языкми осваивать его будет легко. Единственный нюанс — вакансий без знаний Джавы мало.

В первый раз я услышал об этом языке, когда узнал, что твиттер перевёл на Скалу бэкэнд с Ruby on Rails.

9. Ruby

Говорим Ruby, подразумеваем веб-фреймворк Ruby on Rails. Такова реальность и основная проблема этого языка. Простота и изящность Руби, хайп и монополизация веб-фреймворков Рельсами привела к вырождению других инструментов на руби — зачем что-то делать, если в Рельсах уже всё есть? Однако, сейчас Рельсы уже не так популярны, большинство вакансий — поддержка старых, а на запуск новых проектов. Хорошие рельсовики стоят дорого, а в 2017 Рельсы не обладают преимуществом над другими серьёзными веб-фреймворками. Тем не менее, огромное количество компаний по-прежнему поддерживают и развивают руби проекты, а новые версии языка и фреймворка радуют интересными возможностями.

Благодаря этому языку, я узнал, в что такое перегрузка операторов!

8. С++

Да, старый С++ по-прежнему востребован у большого количество работодателей. Не самый простой язык, в основном, из-за управления памяти, но пока что единственный достаточно быстрый язык для современного игростроя. Например, в движке Unreal Engine активно используется С++. Я советую изучать этот язык именно с прицелом на игры, потому что в обычных приложения гораздо привлекательнее выглядят другие языки. Правда, в России игр не делают, но есть много хороших аутсорсеров, где работает много талантов. В соседней Беларуси я бы обратил внимание на Танки http://wargaming.com/ru/careers/. В какой-то мере, этот язык — идеальное отражение баланса денежной компенсации и требований от программиста. Для любителей бросить себе вызов!

Это единственный язык из этого списка, на котором я не пытался создать программы.

7. Go

Перспективный язык активно завоёвывает в России нишу  обработки запросов в условиях высокой нагрузки. Главная особенность языка — незагугливоемое название, следует использовать golang в поисковых запросах. Go умеет единовременно обрабатывать много запросов используя железо по максимуму, и активно используется в обработчиках реклам, и везде, где нужно взаимодействие в реальном времени. Также на момент написания этой заметки, я увидел две любопытные вакансии, первая по переводу OneTwoTrip на Гоу, вторая — перевод почты Mail.ru на Гоу (https://spb.hh.ru/vacancy/19110972https://spb.hh.ru/vacancy/19110972). Не берусь говорить, тренд ли это, но уверен, что на несколько лет Гоу будет часто встречаться в вакансиях. Но самое главное — специалистов по Гоу сейчас мало, и можно успеть сесть на хайп-трейн.

Многие компании готовы подождать, пока вы изучите Go, если вы конечно знаете какой-то другой подходящий им язык.

6. PHP

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

Оказалось, что я пользуюсь PHP уже 8 лет!

5. Swift

Долгое время для Андроида надо было писать приложения на Джаве, а для iOS — на странном языке Objective C. Многие разработчики испытывали сложности с этим языком, поэтому Apple решили сделать новый язык попроще. Сейчас, на Свифте можно писать приложения для продуктов Эппл. Нативные приложения высоко ценятся среди компаний и многие мобильные разработчики имеют целые отделы, посвященные этой платформе. В изучении Свифт есть подводный камень — вполне вероятно, вам придется изучить и Objective C, чтобы получить работу. Может иметься старый код, какие-то библиотеки, написанные на Objective-C и одним Свифтом может не обойтись.

Я попробовал и мне понравилось!

4. Java

Хорошие специалисты по Джаве всегда будут в цене — слишком много кода написано, слишком много языков используют платформу JVM и очень много документации и примеров есть в интернете.  Работа есть совершенно разная — от скучных офисных приложений до приложений на Андроиде. Качество кода, с которым придется работать тоже будет очень сильно отличаться. Тем не менее, это хороший язык, который открывает хорошие возможности развития как в рамках самого языка, так в рамках языков на платформе JVM.

Язык стоит внимания, когда в нём есть свой ад.

3. Python

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

Когда я начинаю работать в консоли с анакондой, я сразу вспоминаю рэп-исполнительницу Никки Минаж.

2. C#

Как Джава, только лучше. На мой взгляд, язык развивается быстрее, чем Джава, а с новым подходом Майкрософт к опенсорсу и другим платформам весьма перспективен. Сейчас СиШарп можно использовать везде — в офисных приложениях, в веб-приложениях, в играх на движке Unity, в кроссплатформенной мобильной разработке с помощью Xamarin. Среда разработки Microsoft Visual Studio на мой вкус гораздо приятнее и быстрее, а обучающих материалов по языку и платформе в целом очень много. Сами возможности языка очень интересные и позволяют писать весьма изящный и простой код.

Представители Microsoft! Если вы пришли на этот сайт через поиск, то знайте, что я открыт вашему спонсированию этого блага! Я буду продолжать вас искренне хвалить, но буду это делать гораздо чаще за вознаграждение!

1. JavaScript

Каждый веб-разработчик обязан знать этот язык. Но сейчас, когда этот язык повзрослел и вышел за пределы браузера следует сказать, что он пригодится уже не только веб-разработчикам. React Native и NativeScript, мощные инструменты по созданию нативных мобильных приложений на Джаваскрипте выглядит очень перспективно, Electron позволяет портировать веб-приложение на десктоп, платформы NodeJs и Meteor позволяются вам владеть полным стэком для веб-разработки на едином языке. С установлением ES2015 как стандарта и возможности его использования прямо сейчас, стало реальным писать хороший масштабируемый и поддерживаемый JavaScript код высокого качества.

Моё первое знакомство с веб-разработкой случилось, когда я пытался понять, как работают снежинки на странице под новый год…

Послесловие

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

Субботний переполох

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

Прекрасный субботний день

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

А они точно сохраняются?

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

Копирование производилось с помощью программы rsync вот такой командой:

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

Решение

Я решил убрать из команды все опции, связанные с установкой владельца, прав и времени и команда выше превратилась в

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

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

Стоит дополнить чеклисты двумя пунктами:
1) Убедится, что бэкап завершается правильно и все файлы копируются;
2) Убедится, что можно восстановить файлы обратно/

Rsync hangs up/stop working

English TL;DR:

If your rsync hangs up/stop working in a middle of uploading on seemingly random file, make sure you enable verbose mode with -v option and run it again. If there are lot of «permission denied» errors, you should try run rsync without trying to preserve all access file rights, owner and time. If you are using -a options, replace it with -rlD whis is -a without options that deal with file metadata. It helped my backup, and may help yours. See above example bash script for reference. It very well maybe that you have totally another problem. You may use strace utility, which writes all activity of other command in log file. Analyzing this log file, may help figure out why process stops. Use following commands to do this:

 

Настройка сервера

Краткий гайд про то, как можно настраивать nginx, php-fpm и mysql для оптимального потребления ресурсов сервера.

В прошлом году я рассказал про антипаттерн, который приводит к плохому быстродействию сайтов и является одной из самых частых проблем быстродействия проектов. Второй такой причиной является отсутствие настройки целиком или плохие настройки программного обеспечения. Многие программы по-умолчанию настроены так, чтобы работать на очень слабых по современным меркам серверах, и не могут использовать все доступные мощности. Если максимально использовать ядра процессора и свободную оперативную память, сервер может выдерживать очень серьёзные нагрузки. Этот пост о том, как можно настроить nginx, php-fpm и mysql-совместимую базу данных, чтобы выжать максимум из железа.

Настройка Nginx

Веб-сервер Nginx обладает огромным количеством настроек и с нуля во всех разобраться довольно сложно. Я советую вам взять за основу структуру конфига с уже заданными неплохими значениями от проекта H5BP.

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

Если вы хостите php сайты, то вам необходимо добавить примерно такой кусочек, который можно назвать php.conf:

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

Для современных CMS и фреймворков, которые используют паттерн FrontController, вам нужно направлять все запросы на файл index.php. Ниже вариант конфига для WordPress и пара вариантов для фреймворков:

Вот два сайта, которые служат хорошим источником информации про nginx:
http://nginx.org/en/docs/
https://www.nginx.com/resources/wiki/

Настройка PHP-FPM

Настройка php-fpm — самая простая вещь. Задача заключается в том, чтобы посчитать, какое максимальное количество процессов запустить на вашем сервере. Математика следующая:

pm.max_children = (Общее количество свободной RAM — Резерв для системы) / Размер памяти для одного процесса.

Важный нюанс! Под общим количеством свободной памяти имеется в виду не физическая память, а то, сколько осталось памяти после того, как вы вычли память для базы, redis, memcache и прочего. Учитывайте, что на эти системы может уйти гигабайты памяти в зависимости от настроек. Тут следует подумать, что важнее — больше память для хранения и быстрого извлечения данных или же большое количество php процессов наготове.

Узнать средний размер потребления памяти для php процесса можно так:

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

Чаще всего я встречал использование динамического процесс менеджера, как наиболее гибкий вариант. Ниже я привожу пример конфигурации для сервера с 16 ГБ памяти. С учетом базы данных и прочего софта, у нас остаётся 6 ГБ свободной памяти, а команда показала, что в среднем наш процесс потребляет 90 мегабайт.

Новые настройки войду в силу после перезагрузки сервиса.

Настройка MySql

Настройки mysql-совместимой базы содержатся в файле my.cnf. Ниже опции, которые имеет смысл отредактировать:

Как узнать, сколько наш диск может операций в секунду:

В таблице результатов нас интересует среднее между read iops и write iops, значение в конфигурации для базы не должно превышать цифры в результатах.

После любых изменений, следует промониторить потребление процессоров и память, быстродействие. Иногда, приходится корректировать цифры, потому что расчётные значения могут не соответствовать реальным цифрам. Также не забывайте, что проверять следует на реальной нагрузке, цифры при спящем трафике могут разительно отличаться от полноценной дневной нагрузки. Самый просто способ — команда top, более продвинутые и удобные способы мониторинга — сервисы вроде NewRelic или Nginx Amplify

Надеюсь, это информация поможет вам при настройке вашего сервера.

Я был в шоке, когда понял, от чего возник баг

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

Непонятный код

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

Двойные отрицания в коде

Проснувшись утром, выпив чашку кофе, я вернулся к этому чудо-коду, расставив брейкпоинты, я стал исполнять код по шагам. И вскоре я нашёл ошибку в логике. Проблема была в следующем коде:

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

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

 

Что такое 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 и автоматически обновлять сертификаты.

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

Как прочитать большой файл в 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 =)

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

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

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

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

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

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