👾 твой cto
1.04K subscribers
13 photos
11 videos
141 links
Будни технического директора
Илья Чекальский (@ilya0)
chekalsky.com
Download Telegram
Обратите внимание на 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
​​С момента переезда в Польшу начал искать вдохновение для названий классов в польском языке, и боюсь, коллеги скоро начнут меня ненавидеть.

Ну а пока шаблонизатор будет называться Кживик. Потому что по-польски это лекало. А лекало — это первая ссылка в википедии по запросу «шаблон».
​​​​ФБК опубликовали датасет с нарушениями депутата Слуцкого — самое время попрактиковаться в API Яндекс.Карт. Теперь надо как-то оптимизировать производительность, потому что столько точек Яндекс.Карты не тянут.

https://chekalskiy.ru/slutsky/
Прекрасные новости! Let’s Encrypt запустил выдачу бесплатных wildcard-сертификатов.

https://community.letsencrypt.org/t/acme-v2-and-wildcard-certificate-support-is-live/55579
Мне кажется, the next big thing — статические генераторы сайтов.

У меня подошёл к концу бесплатный год в Google Cloud — там хостился наш блог chechannel.com — год назад я взял Ghost и закинул его туда, чтобы складывать длинные заметки про Польшу, но их в итоге оказалось не так много, и почти никто на сайт не заходит. Но домен мне нравится и просто так отключать его не хотелось.

Переезжать на vscale, хоть это и будет стоить 200 рублей в месяц, не хотелось, равно как и оплачивать Ghost Pro по $19 в месяц — зачем платить вообще что-то за сайт с 10 посетителями.

Пришлось озаботиться переносом контента с Ghost на Hugo. Hugo — это такой движок для статических сайтов, написанный на Go. А хоститься при этом можно бесплатно на GitHub Pages в связке с Cloudflare, который возьмёт на себя редиректы, HTTPS, кэширование и всё, что душе угодно.

В итоге несколько часов провозился с конвертером постов и собственно настройкой Hugo — и voilà! статическая версия блога с простой CMS (forestry.io) уже в продакшене.

И вот эта вот простота, надёжность и дешевизна — это явно то, что вскоре позволит всем нам отказаться от Wordpress, к которому нужен ещё и разбирающийся админ, а ещё нужно следить за версией openssl на сервере, да и вообще от серверов. И уже существуют CMS, которые позволяют удобно создавать контент и настраивать генератор статической версии сайта. И всё это автоматически публиковать.

Ссылки для дальнейшего изучения:
https://www.staticgen.com — рейтинг генераторов статических сайтов
https://headlesscms.org — список CMS для них
​​Вау, Cloudflare запустили свой супер-быстрый DNS с поддержкой DNS-over-TLS и DNS-over-HTTPS.

1.1.1.1
1.0.0.1

Вот тут пост о том, почему они решили это сделать и где раздобыли такой крутой IP.
В августе прошлого года у меня сломался айфон, и когда я восстановил резервную копию из iCloud на новом, из Google Authenticator пропали 2FA-коды всех сервисов (хотя они должны были остаться). Так как я немного параноик и control freak, я отдельно хранил список всех сервисов с 2FA, которыми я пользуюсь. Поэтому нужно было всего лишь восстановить все доступы по списку.

В основном это было не сложно — либо присылают смс, либо просят один из резервных кодов, либо ещё какие-то данные. Небольшие проблемы возникли с blockchain.info — но всё тоже прошло нормально. Настоящими параноиками оказались только Amazon — если потерять девайс с кодами, то сбросить логин можно только по звонку на привязанный к аккаунту номер телефона. Но почему-то именно на этот номер не проходили звонки, а я уже довольно долго находился в Польше. Я позвонил в поддержку Amazon и объяснил ситуацию, предложил прочитать все последние инвойсы, рассказать, что есть внутри аккаунта, но саппорт был непреклонен. В итоге, только сейчас я решился повторить попытку, поставил переадресацию, разобрался с техподдержкой Йоты и Билайна, и наконец-таки смог зайти в свой аккаунт.

Теперь я переживаю — все остальные ведь не так надёжно охраняют мои аккаунты. 🤔
Подборка утилит для PHP-разработки. Про некоторые из них я уже писал, но есть и новые.

Например, PHP Magic Number Detector — ищет магические числа, которые неплохо бы сделать константами (200, 404, 3600 и т.д.).

Кстати, на гитхабе есть наиболее полный список утилит для статического анализа PHP-кода.

P.S. Если вы используете SaaS-сервис, в котором есть большинство или хотя бы самые популярные из этих утилит и который умеет интегрироваться в GitHub Pull Requests, напишите мне, пожалуйста, о своих впечатлениях: @ilya0