Интересный баг поймали — если nginx отдаёт код ошибки
Потестить можно тут: https://dtf.ru/test-524
В конфиге там так:
#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
Чего только стоит библиотека для автоматической генерации CSP-заголовков.
https://habrahabr.ru/company/mailru/blog/344696/
#php #security
О копировании кода из интернета.
Сегодня пришлось разобраться в разнице между
#php
Сегодня пришлось разобраться в разнице между
sprintf("%015.2F", $var) и sprintf("%015.2f", $var) — в функции «сумма прописью», которую я скопировал по первому ответу в гугле был именно второй вариант, а он, как оказалось, зависит от локали, и в результате на локальной машине всё было ок, а на стейджинге вылезла ошибка — в результирующей строке не было точки.#php
Обратите внимание на DNS prefetch если вы используете больше одного домена для сайта — например, отдельный для статики. Установив тег
Подробнее: https://css-tricks.com/prefetching-preloading-prebrowsing/
<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
Сам язык разработан в 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
https://blog.appcanary.com/2017/http-security-headers.html
#nginx #devops
Давно ничего не писал, а всё потому что мы начали Огромный Рефакторинг.
Мы в Комитете в качестве эксперимента решили начать посвящать начало каждого года рефакторингу — к концу декабря заканчивать все фичи и после новогодних праздников по заранее определённому плану начинать переписывать костыли, убирать древние окаменелые баги и добавлять новые. Сейчас у нас есть сформулированные задачи на три месяца после окончания рефакторинга, план того, что надо сделать ещё на три месяца вперёд и примерный план движения на весь год. Конечно, по ходу будут вноситься коррективы, но сейчас есть возможность планировать новую архитектуру как минимум на год, до следующего января.
Мы создали канал в Slack, где каждый разработчик может написать, какое место в коде он хотел бы отрефакторить, обсуждение ведётся в ветках, поэтому к январю мы получили готовый список мест, которые требуют нашего внимания. Так вышло, что бэкенд будет переписан процентов на 70, потому что решили сильно упростить структуру и заодно больше использовать ООП — процедурный подход хорош, когда надо писать код в сжатые сроки, но когда есть время, лучше окинуть взглядом всё целиком и попробовать реализовать это красиво.
Так что пока интересностей для вас нет, разве что вышла первая стабильная версия PHP-PM — процесс-менеджера, с помощью которого можно превратить PHP-приложение в демона, чтобы не тратить ресурсы на то, чтобы поднять и инициализировать всё приложение при каждом запросе и получить прирост в скорости в 15 раз.
P.S. Изучение Go идёт полным ходом!
Мы в Комитете в качестве эксперимента решили начать посвящать начало каждого года рефакторингу — к концу декабря заканчивать все фичи и после новогодних праздников по заранее определённому плану начинать переписывать костыли, убирать древние окаменелые баги и добавлять новые. Сейчас у нас есть сформулированные задачи на три месяца после окончания рефакторинга, план того, что надо сделать ещё на три месяца вперёд и примерный план движения на весь год. Конечно, по ходу будут вноситься коррективы, но сейчас есть возможность планировать новую архитектуру как минимум на год, до следующего января.
Мы создали канал в Slack, где каждый разработчик может написать, какое место в коде он хотел бы отрефакторить, обсуждение ведётся в ветках, поэтому к январю мы получили готовый список мест, которые требуют нашего внимания. Так вышло, что бэкенд будет переписан процентов на 70, потому что решили сильно упростить структуру и заодно больше использовать ООП — процедурный подход хорош, когда надо писать код в сжатые сроки, но когда есть время, лучше окинуть взглядом всё целиком и попробовать реализовать это красиво.
Так что пока интересностей для вас нет, разве что вышла первая стабильная версия PHP-PM — процесс-менеджера, с помощью которого можно превратить PHP-приложение в демона, чтобы не тратить ресурсы на то, чтобы поднять и инициализировать всё приложение при каждом запросе и получить прирост в скорости в 15 раз.
P.S. Изучение Go идёт полным ходом!
Когда тебе кажется, что изучил Composer вдоль и поперёк, а потом открываешь эту статью и находишь не одну и не две неизвестные фичи.
https://habrahabr.ru/company/mailru/blog/346488/
Например, как подключить свой форк какого-то пакета, пока там не одобрили твой пул-реквест. Или как принудительно указать версию PHP, для которой нужно искать совместимые пакеты (если локально стоит 7.2, а на сервере 7.1).
#composer #php
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
Это прекрасно! 15 баксов в месяц, если меньше 5 приватных репозиториев, для open source бесплатно. 14 дней триала. Подключить можно через GitHub Marketplace.
#php #composer
Потрясающая история о том, как хакер взломал криптобиржу, которая работает на смарт-контракте.
Как это было: биржа полностью open source и работает так, что теоретически никто не может повлиять на неё или взломать. Но в одном месте разработчики биржи решили показывать вместа хэша контракта красивое имя, которое внутри этого контракта зашито. Я думаю, вы уже поняли, что произошло. Они забыли заэкранировать переменную, и в результате на странице обмена подставного токена появился скрипт, который отправлял приватные ключи всех зашедших туда пользователей (биржа-то опенсорсная, всё хранится в браузере) к хакеру на сервер.
Вполне себе обычную ссылку на популярную биржу хакер распространял в чатах, а переходившие по ней пользователи отправляли ему все свои деньги.
Читать подробнее
Как это было: биржа полностью open source и работает так, что теоретически никто не может повлиять на неё или взломать. Но в одном месте разработчики биржи решили показывать вместа хэша контракта красивое имя, которое внутри этого контракта зашито. Я думаю, вы уже поняли, что произошло. Они забыли заэкранировать переменную, и в результате на странице обмена подставного токена появился скрипт, который отправлял приватные ключи всех зашедших туда пользователей (биржа-то опенсорсная, всё хранится в браузере) к хакеру на сервер.
Вполне себе обычную ссылку на популярную биржу хакер распространял в чатах, а переходившие по ней пользователи отправляли ему все свои деньги.
Читать подробнее
Исправил предыдущий пост, адрес, который был в нём указан, принадлежит бирже, а не хакеру, кошелёк которого достоверно неизвестен (но его всё равно попробовали выследить, и возможно это гражданин Литвы) и украл он намного меньше суммы, которую я написал. Прошу прощения, что ввёл в заблуждение.
Что мы обычно ждём от техподдержки SaaS-компаний? Для меня самые главные — две вещи:
1) Скорость ответа. Я хочу, чтобы мне сразу отвечали, что сообщение принято и в течение какого времени мне ждать решение вопроса. Это развитый рынок, пока мне сутки готовят ответ, я могу успеть сменить двух их конкурентов.
2) Чтобы меня не держали за идиота. Когда я обращаюсь не в техподдержку своего домашнего провайдера, я хочу, чтобы меня не просили обновить страницу браузера или переподключить Wi-Fi. Если я пишу, что что-то не работает, то обычно я пишу, какие варианты уже попробовал. Иногда в ответ мне предлагают попробовать их ещё раз.
Если речь идёт про стартап, то обычно с этим проблем нет, но стоит стартапу немного вырасти, как качество саппорта зачастую катастрофически падает. А от крупных компаний иногда можно ждать ответа по три дня.
Я очень доволен техподдержкой Селектела — много лет они очень правильно к этому подходят. Кого-то ещё из тех, куда я писал за последние годы я не вспомню, но два недавних примера приведу:
InfoBip — они рассылали авторизационные СМС нашим пользователям во время одного из спецпроектов и мне очень понравилось с ними работать. Во-первых, у них очень толковые менеджеры, которые работали с полной отдачей даже несмотря на то, что мы сразу предупредили, что закупим СМС только на пару тысяч рублей. Во-вторых, когда мы в продакшене столкнулись с проблемой, ребята локализовали её и написали, как исправить за 18 минут. И это русскоязычный отдел в глобальной компании.
Ngenix — наш новый CDN-провайдер тоже порадовал быстрым заключением договора и оперативным общением с менеджером и поддержкой. Каких-то серьёзных проблем ещё не возникало, но даже к мелким вопросам ребята относятся очень серьёзно.
#saas
1) Скорость ответа. Я хочу, чтобы мне сразу отвечали, что сообщение принято и в течение какого времени мне ждать решение вопроса. Это развитый рынок, пока мне сутки готовят ответ, я могу успеть сменить двух их конкурентов.
2) Чтобы меня не держали за идиота. Когда я обращаюсь не в техподдержку своего домашнего провайдера, я хочу, чтобы меня не просили обновить страницу браузера или переподключить Wi-Fi. Если я пишу, что что-то не работает, то обычно я пишу, какие варианты уже попробовал. Иногда в ответ мне предлагают попробовать их ещё раз.
Если речь идёт про стартап, то обычно с этим проблем нет, но стоит стартапу немного вырасти, как качество саппорта зачастую катастрофически падает. А от крупных компаний иногда можно ждать ответа по три дня.
Я очень доволен техподдержкой Селектела — много лет они очень правильно к этому подходят. Кого-то ещё из тех, куда я писал за последние годы я не вспомню, но два недавних примера приведу:
InfoBip — они рассылали авторизационные СМС нашим пользователям во время одного из спецпроектов и мне очень понравилось с ними работать. Во-первых, у них очень толковые менеджеры, которые работали с полной отдачей даже несмотря на то, что мы сразу предупредили, что закупим СМС только на пару тысяч рублей. Во-вторых, когда мы в продакшене столкнулись с проблемой, ребята локализовали её и написали, как исправить за 18 минут. И это русскоязычный отдел в глобальной компании.
Ngenix — наш новый CDN-провайдер тоже порадовал быстрым заключением договора и оперативным общением с менеджером и поддержкой. Каких-то серьёзных проблем ещё не возникало, но даже к мелким вопросам ребята относятся очень серьёзно.
#saas
Когда мы только начинали писать Основу (наша платформа для медиа), я добавил в механизм авторизации простую проверку украденных кук — суть её сводилась к тому, что если одну и ту же куку используют в двух браузерах, то все сессии пользователя сбрасываются, и она становится невалидной.
Каково же было моё удивление, когда за первую неделю работы только запущенного DTF мы поймали такую ситуацию пять раз. Было очевидно, что никто не крал куки сайта с парой тысяч пользователей. Но баг я так и не нашёл — пришлось отключать механизм. До сих пор думаю, что виной — синхронизация между браузерами или что-то вроде того.
А мораль, наверное, в том, что всегда нужно вешать логгирование на такие моменты, чтобы знать, что механизмы защиты работают как задумано.
Каково же было моё удивление, когда за первую неделю работы только запущенного DTF мы поймали такую ситуацию пять раз. Было очевидно, что никто не крал куки сайта с парой тысяч пользователей. Но баг я так и не нашёл — пришлось отключать механизм. До сих пор думаю, что виной — синхронизация между браузерами или что-то вроде того.
А мораль, наверное, в том, что всегда нужно вешать логгирование на такие моменты, чтобы знать, что механизмы защиты работают как задумано.
Прекрасный плагин для 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
Статический анализатор, который позволяет сделать ваш код ещё лучше. Что покрывает:
• 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
https://github.com/kelseyhightower/nocode
С момента переезда в Польшу начал искать вдохновение для названий классов в польском языке, и боюсь, коллеги скоро начнут меня ненавидеть.
Ну а пока шаблонизатор будет называться Кживик. Потому что по-польски это лекало. А лекало — это первая ссылка в википедии по запросу «шаблон».
Ну а пока шаблонизатор будет называться Кживик. Потому что по-польски это лекало. А лекало — это первая ссылка в википедии по запросу «шаблон».
ФБК опубликовали датасет с нарушениями депутата Слуцкого — самое время попрактиковаться в API Яндекс.Карт. Теперь надо как-то оптимизировать производительность, потому что столько точек Яндекс.Карты не тянут.
https://chekalskiy.ru/slutsky/
https://chekalskiy.ru/slutsky/
Прекрасные новости! Let’s Encrypt запустил выдачу бесплатных wildcard-сертификатов.
https://community.letsencrypt.org/t/acme-v2-and-wildcard-certificate-support-is-live/55579
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 для них
У меня подошёл к концу бесплатный год в 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 для них