👾 твой cto
1.04K subscribers
13 photos
11 videos
141 links
Будни технического директора
Илья Чекальский (@ilya0)
chekalsky.com
Download Telegram
​​​​Я хочу признаться, что много лет совершал огромную ошибку, которая каждый день влияла на мой код. Последние годы я использовал в качестве IDE сначала Sublime Text, а потом перешёл на Atom — оба они прекрасные редакторы с огромным количеством крутых плагинов и я был ими очень доволен, настроив точно так, как мне хочется. Но потом я запустил PhpStorm.

Я никогда им не пользовался, но недавно вышла новая версия, и меня заинтересовало описание новых возможностей — в частности отслеживание необрабатываемых исключений (Unhandled exception). PhpStorm следит за тем, какие исключения выбрасывают вызываемые функции, и считает, что мы должны или поймать (catch) их, или задекларировать в PhpDoc нашей функции, чтобы не забыть поймать её на уровне выше.

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

Прошло несколько дней, из которых один вечер я потратил на настройку всего-всего, что можно настроить (в том числе конечно же php-cs-fixer) и потом ещё один день, чтобы переписать некоторые части нашего фреймворка, чтобы везде заработало автодополнение и все функции вроде автоматического рефакторинга. Теперь я, наверное, никогда не променяю PhpStorm на что-то другое — идеально работающее автодополнение, очень быстрое всё (по сравнению с Atom), куча катастрофически приятных функций, безошибочный переход к функции и многое и многое другое. Такое ощущение, что с Лады пересел на Тойоту.

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

#php #ide
Если вы пользуетесь macOS и как раз обновились до 10.13.2, то у вас могли перестать работать некоторые приложения и функции, связанные со связкой ключей — например, GitHub Desktop и VPN.

Чтобы пофиксить откройте приложение Keychain Access, правой кнопкой нажмите на связку login и попробуйте залочить и разлочить её. После этого всё заработает.
Я, наверное, должен был начать вести канал с этой ссылки — это очень важная отправная точка для всех, кто занимается разработкой на PHP на любом уровне — для начинающих это хорошее подспорье, чтобы сразу учиться делать вещи правильно (и сэкономить пару лет, без шуток), для профессионалов — взглянуть на привычные техники под новым углом.

http://www.phptherightway.com/
Интересный баг поймали — если nginx отдаёт код ошибки 524 A Timeout Occurred с пустым телом, то Safari скачивает пустой файл с расширением dms вместо того, чтобы показать пустую страницу или системную ошибку.

Потестить можно тут: https://dtf.ru/test-524

В конфиге там так:
location /test-524 {
return 524;
}


#nginx
Когда-нибудь мы все вместе напишем книгу про все нюансы написания сложных PHP-приложений — что поменять в php.ini, как настроить nginx, как подключить xdebug, но пока приходится собирать всё по крупицам. Тем не менее — вот хороший гайд по безопасности PHP-приложений от Mail.ru (!).
Чего только стоит библиотека для автоматической генерации CSP-заголовков.

https://habrahabr.ru/company/mailru/blog/344696/

#php #security
О копировании кода из интернета.

Сегодня пришлось разобраться в разнице между sprintf("%015.2F", $var) и sprintf("%015.2f", $var) — в функции «сумма прописью», которую я скопировал по первому ответу в гугле был именно второй вариант, а он, как оказалось, зависит от локали, и в результате на локальной машине всё было ок, а на стейджинге вылезла ошибка — в результирующей строке не было точки.

#php
Обратите внимание на DNS prefetch если вы используете больше одного домена для сайта — например, отдельный для статики. Установив тег <link rel="dns-prefetch" href="https://example.com"> вы заставите браузер пользователя отрезолвить IP домена ещё до того, как он будет запрошен. А с помощью тега <link rel="preconnect" href="https://example.com"> можно и TCP-соединение заранее установить.

Подробнее: https://css-tricks.com/prefetching-preloading-prebrowsing/
Совершенно внезапно для себя начал изучать Go. Из любопытства, желания доказать себе, что смогу, и просто чтобы размяться. И на удивление дело пошло!

Сам язык разработан в Google, он статически типизирован и компилируем. Это значит, что в коде надо учитывать разницу между int и int64, а само приложение можно залить на сервер в виде одного исполняемого файла — он же будет принимать запросы по сети и отвечать на них (или сидеть за nginx). А ещё для Go есть сотни библиотек на все случаи жизни, а все основные вопросы уже расписаны на code overflow.

Путь от «что это за набор символов в исходниках» до «я написал свою первую библиотеку в opensource» я прошёл за несколько уикендов, и поэтому считаю, что порог входа в язык очень низкий, особенно если уже есть опыт программирования, а сам синтаксис не очень сильно отличается от того же PHP. Мне немного не хватает ООП, но некое подобие тут присутствует.

Вот, что мне потребовалось для изучения:
• Книга An introduction to programming in Go [free, eng]
Курс на Udemy (в котором, впрочем, я прослушал пока только 11 из 171 лекций)
GoLand IDE

За этот месяц я много раз вспоминал, что ровно так же когда-то изучал PHP — брал задачи из реальной жизни, начинал писать код, используя автокомплит, документацию и code overflow.

Вчера зарелизил простую библиотеку — клиент для API Coingate. И язык настолько крутой, что я уже даже разобрался, как писать юнит-тесты и добился 95% coverage.

В общем, оказалось, что писать на Go совсем несложно, попробуйте и вы.

#go
Гайд по заголовкам, связанным с безопасностью.

https://blog.appcanary.com/2017/http-security-headers.html

#nginx #devops
Возможно, следующая ORM, которую стоит изучить: atk4/data.

Data Mapper, каким бы мы хотели его видеть.

#php
Давно ничего не писал, а всё потому что мы начали Огромный Рефакторинг.

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

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

Так что пока интересностей для вас нет, разве что вышла первая стабильная версия PHP-PM — процесс-менеджера, с помощью которого можно превратить PHP-приложение в демона, чтобы не тратить ресурсы на то, чтобы поднять и инициализировать всё приложение при каждом запросе и получить прирост в скорости в 15 раз.

P.S. Изучение Go идёт полным ходом!
Когда тебе кажется, что изучил Composer вдоль и поперёк, а потом открываешь эту статью и находишь не одну и не две неизвестные фичи.

https://habrahabr.ru/company/mailru/blog/346488/

Например, как подключить свой форк какого-то пакета, пока там не одобрили твой пул-реквест. Или как принудительно указать версию PHP, для которой нужно искать совместимые пакеты (если локально стоит 7.2, а на сервере 7.1).

#composer #php
​​​​Сервис Dependabot подключается к вашему Ruby, JavaScript, Python, PHP, Elixir или Java репозиторию и раз в какое-то время проверяет, не обновились ли какие-то зависимости, и если да — создаёт Pull Request со ссылками на Release Notes или Changelog обновившегося пакета. Очевидно, что если у вас настроен CI, то он ещё и проверит этот PR автотестами.

Это прекрасно! 15 баксов в месяц, если меньше 5 приватных репозиториев, для open source бесплатно. 14 дней триала. Подключить можно через GitHub Marketplace.

#php #composer
Потрясающая история о том, как хакер взломал криптобиржу, которая работает на смарт-контракте.

Как это было: биржа полностью open source и работает так, что теоретически никто не может повлиять на неё или взломать. Но в одном месте разработчики биржи решили показывать вместа хэша контракта красивое имя, которое внутри этого контракта зашито. Я думаю, вы уже поняли, что произошло. Они забыли заэкранировать переменную, и в результате на странице обмена подставного токена появился скрипт, который отправлял приватные ключи всех зашедших туда пользователей (биржа-то опенсорсная, всё хранится в браузере) к хакеру на сервер.

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

Читать подробнее
Исправил предыдущий пост, адрес, который был в нём указан, принадлежит бирже, а не хакеру, кошелёк которого достоверно неизвестен (но его всё равно попробовали выследить, и возможно это гражданин Литвы) и украл он намного меньше суммы, которую я написал. Прошу прощения, что ввёл в заблуждение.
Что мы обычно ждём от техподдержки SaaS-компаний? Для меня самые главные — две вещи:
1) Скорость ответа. Я хочу, чтобы мне сразу отвечали, что сообщение принято и в течение какого времени мне ждать решение вопроса. Это развитый рынок, пока мне сутки готовят ответ, я могу успеть сменить двух их конкурентов.

2) Чтобы меня не держали за идиота. Когда я обращаюсь не в техподдержку своего домашнего провайдера, я хочу, чтобы меня не просили обновить страницу браузера или переподключить Wi-Fi. Если я пишу, что что-то не работает, то обычно я пишу, какие варианты уже попробовал. Иногда в ответ мне предлагают попробовать их ещё раз.

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

Я очень доволен техподдержкой Селектела — много лет они очень правильно к этому подходят. Кого-то ещё из тех, куда я писал за последние годы я не вспомню, но два недавних примера приведу:

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

Ngenix — наш новый CDN-провайдер тоже порадовал быстрым заключением договора и оперативным общением с менеджером и поддержкой. Каких-то серьёзных проблем ещё не возникало, но даже к мелким вопросам ребята относятся очень серьёзно.

#saas
Когда мы только начинали писать Основу (наша платформа для медиа), я добавил в механизм авторизации простую проверку украденных кук — суть её сводилась к тому, что если одну и ту же куку используют в двух браузерах, то все сессии пользователя сбрасываются, и она становится невалидной.

Каково же было моё удивление, когда за первую неделю работы только запущенного DTF мы поймали такую ситуацию пять раз. Было очевидно, что никто не крал куки сайта с парой тысяч пользователей. Но баг я так и не нашёл — пришлось отключать механизм. До сих пор думаю, что виной — синхронизация между браузерами или что-то вроде того.

А мораль, наверное, в том, что всегда нужно вешать логгирование на такие моменты, чтобы знать, что механизмы защиты работают как задумано.
Когда сайт Навального устроен сложнее, чем твой.

https://habrahabr.ru/company/fbk/blog/347312/
​​Прекрасный плагин для PHPStorm — PHP Inspections EA

Статический анализатор, который позволяет сделать ваш код ещё лучше. Что покрывает:
• architecture related issues
• weak types control and possible code construct simplifications
• performance issues
• non-optimal, duplicate and suspicious "if" conditions
• validation of magic methods usage
• regular expressions
• validation of exception handling workflow
• compatibility issues
• variety of time-consuming bugs
• PhpUnit API usage
• security issues

У него есть ещё платная версия, в которой проверок ещё больше. В общем, если вы любите писать идеальный код, то статический анализатор прямо в IDE вам понравится.

#php #ide
Лучший концепт по написанию надёждных и безопасных приложений. Не забудьте заглянуть в Pull Requests — там есть имплементации с тестированием.

https://github.com/kelseyhightower/nocode
​​С момента переезда в Польшу начал искать вдохновение для названий классов в польском языке, и боюсь, коллеги скоро начнут меня ненавидеть.

Ну а пока шаблонизатор будет называться Кживик. Потому что по-польски это лекало. А лекало — это первая ссылка в википедии по запросу «шаблон».