Не вижу своей жизни без PHP CodeStyle Fixer и вот почему.
https://github.com/FriendsOfPHP/PHP-CS-Fixer
Эта штука автоматически делает код совместимым с PSR-1 и PSR-2, чистить его от лишних пробелов, array() вместо [] и вообще позволяет коду, написанному разными разработчиками выглядеть примерно одинаково. Это упрощает его последующее чтение и уменьшает баттхёрт технического директора на тему лишних пробелов перед if'ами.
Для этого инструмента есть плагины под все распространённые IDE, так что код можно приводить в порядок сразу после написания по хоткею или даже при каждом сохранении.
Вот наш конфиг, который мы используем сейчас, можете взять его за основу, но не забудьте посмотреть, что значит каждый параметр в документации.
https://gist.github.com/chekalskiy/c79c77657a18419125c72c86fe333b86
#library #php #psr2
https://github.com/FriendsOfPHP/PHP-CS-Fixer
Эта штука автоматически делает код совместимым с PSR-1 и PSR-2, чистить его от лишних пробелов, array() вместо [] и вообще позволяет коду, написанному разными разработчиками выглядеть примерно одинаково. Это упрощает его последующее чтение и уменьшает баттхёрт технического директора на тему лишних пробелов перед if'ами.
Для этого инструмента есть плагины под все распространённые IDE, так что код можно приводить в порядок сразу после написания по хоткею или даже при каждом сохранении.
Вот наш конфиг, который мы используем сейчас, можете взять его за основу, но не забудьте посмотреть, что значит каждый параметр в документации.
https://gist.github.com/chekalskiy/c79c77657a18419125c72c86fe333b86
#library #php #psr2
Не все знают, что для Composer существует куча плагинов, которые добавляют всякие приятные мелочи. Например:
• Versions Check — показывает, какие из пакетов не обновлены до последней версии.
• Changelogs — показывает ссылки на changelog обновлённых пакетов.
• Prestissimo — параллельная загрузка пакетов.
Эти и ещё много других плагинов можно найти в Awesome Composer.
#composer #library
• Versions Check — показывает, какие из пакетов не обновлены до последней версии.
• Changelogs — показывает ссылки на changelog обновлённых пакетов.
• Prestissimo — параллельная загрузка пакетов.
Эти и ещё много других плагинов можно найти в Awesome Composer.
#composer #library
GitHub открыл собственный магазин интеграций.
https://github.com/marketplace
Например, можете в пару кликов подключить Travis CI, Codecov, Dependabot, Sentry, Blackfire зачастую по специальным тарифам. При этом оплачивается это всё через ваш (или корпоративный) аккаунт на GitHub. Для меня он прежде всего полезен тем, что можно в одно месте посмотреть список всех модных SaaS-сервисов. Кстати, есть ещё одно место с модными сервисами — маркетплейс Slack.
#saas
https://github.com/marketplace
Например, можете в пару кликов подключить Travis CI, Codecov, Dependabot, Sentry, Blackfire зачастую по специальным тарифам. При этом оплачивается это всё через ваш (или корпоративный) аккаунт на GitHub. Для меня он прежде всего полезен тем, что можно в одно месте посмотреть список всех модных SaaS-сервисов. Кстати, есть ещё одно место с модными сервисами — маркетплейс Slack.
#saas
И снова про Composer. Если вы, как и я, любите, чтобы все пакеты в composer.json были отсортированы по алфавиту, и делаете это каждый раз вручную, то у меня для вас хорошая новость: в раздел
Также если вы предпочитаете грузить пакеты в виде дистрибутивов, то туда же можно добавить соответствующий параметр. Больше настроек — в документации.
#composer
config в этом файле можно добавить параметр "sort-packages": true — тогда composer require будет автоматически сортировать названия по алфавиту.Также если вы предпочитаете грузить пакеты в виде дистрибутивов, то туда же можно добавить соответствующий параметр. Больше настроек — в документации.
#composer
Если вы содержите документацию к своему API в строжайшем порядке (ха-ха), например, в формате API Blueprint или Swagger, то вам может быть полезен Dredd — инструмент для проверки ответов API. Он проверяет не только коды ответов, но и содержимое JSON-полей на предмет соответствия типу, описанному в документации. Конечно же его можно интегрировать в ваш любимый CI-сервис — тогда больше ни один пул-реквест не сломает ваши приложения.
Ну а если документация к API есть пока только у вас в голове, то это хороший повод её формализовать. Кстати, если предпочитаете SaaS-решения, то аналогичным образом работает Runscope, его ценник начинается от $79 в месяц.
На самом деле оба этих решения лучше всего иметь параллельно — API на продакшене может отличаться от эталонного не только потому что мы залили плохой код, но и, например, из-за того, что в результате сложной последовательности действий нарушилась консистентность базы (удалили пользователя, а его комментарии не удалились из-за ошибки).
#saas #testing #api
Ну а если документация к API есть пока только у вас в голове, то это хороший повод её формализовать. Кстати, если предпочитаете SaaS-решения, то аналогичным образом работает Runscope, его ценник начинается от $79 в месяц.
На самом деле оба этих решения лучше всего иметь параллельно — API на продакшене может отличаться от эталонного не только потому что мы залили плохой код, но и, например, из-за того, что в результате сложной последовательности действий нарушилась консистентность базы (удалили пользователя, а его комментарии не удалились из-за ошибки).
#saas #testing #api
Brotli — новый алгоритм сжатия данных для web от Google. Он существует уже несколько лет и не так давно вышла первая стабильная версия. Что вам надо знать об алгоритме, который, возможно, когда-нибудь придёт на смену gzip?
• Он эффективнее gzip примерно на 20% как по скорости сжатия, так и по коэффициенту компрессии.
• Существуют библиотеки для всех основных веб-серверов. Вот, например, для nginx.
• С сентября Brotli поддерживают браузеры, общая доля которых составляет 70% рынка — в том числе новый Safari.
• Cloudflare рекомендует использовать gzip для маленьких файлов, а brotli — для тех, что побольше (но статья довольно старая).
#devops #nginx
• Он эффективнее gzip примерно на 20% как по скорости сжатия, так и по коэффициенту компрессии.
• Существуют библиотеки для всех основных веб-серверов. Вот, например, для nginx.
• С сентября Brotli поддерживают браузеры, общая доля которых составляет 70% рынка — в том числе новый Safari.
• Cloudflare рекомендует использовать gzip для маленьких файлов, а brotli — для тех, что побольше (но статья довольно старая).
#devops #nginx
Продолжает развиваться новый формат JSON5.
Это такое обратно-совместимое расширение для привычного JSON, делающее его в том числе более удобным для написания руками:
• можно оставлять комментарии,
• можно использовать одинарные кавычки,
• можно не оборачивать в кавычки ключи (но не все),
• можно использовать trailing comma,
и другое.
Библиотека для PHP
#php #library
Это такое обратно-совместимое расширение для привычного JSON, делающее его в том числе более удобным для написания руками:
• можно оставлять комментарии,
• можно использовать одинарные кавычки,
• можно не оборачивать в кавычки ключи (но не все),
• можно использовать trailing comma,
и другое.
Библиотека для PHP
#php #library
Я хочу признаться, что много лет совершал огромную ошибку, которая каждый день влияла на мой код. Последние годы я использовал в качестве IDE сначала Sublime Text, а потом перешёл на Atom — оба они прекрасные редакторы с огромным количеством крутых плагинов и я был ими очень доволен, настроив точно так, как мне хочется. Но потом я запустил PhpStorm.
Я никогда им не пользовался, но недавно вышла новая версия, и меня заинтересовало описание новых возможностей — в частности отслеживание необрабатываемых исключений (Unhandled exception). PhpStorm следит за тем, какие исключения выбрасывают вызываемые функции, и считает, что мы должны или поймать (catch) их, или задекларировать в PhpDoc нашей функции, чтобы не забыть поймать её на уровне выше.
Мы очень широко используем механизм исключений, и мне всегда было очень сложно следить за тем, какие исключения могут быть выброшены в каждый конкретный момент времени, поэтому я решил попробовать PhpStorm, тем более, что есть бесплатный пробный месяц (а потом он будет стоить 9 евро ежемесячно или 90 за год).
Прошло несколько дней, из которых один вечер я потратил на настройку всего-всего, что можно настроить (в том числе конечно же php-cs-fixer) и потом ещё один день, чтобы переписать некоторые части нашего фреймворка, чтобы везде заработало автодополнение и все функции вроде автоматического рефакторинга. Теперь я, наверное, никогда не променяю PhpStorm на что-то другое — идеально работающее автодополнение, очень быстрое всё (по сравнению с Atom), куча катастрофически приятных функций, безошибочный переход к функции и многое и многое другое. Такое ощущение, что с Лады пересел на Тойоту.
Последней вишенкой оказался XDebug, который я игнорировал многие годы и теперь посыпаю голову пеплом. Не будьте как я, используйте полнофункциональные IDE и будет вам счастье.
#php #ide
Я никогда им не пользовался, но недавно вышла новая версия, и меня заинтересовало описание новых возможностей — в частности отслеживание необрабатываемых исключений (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 и попробуйте залочить и разлочить её. После этого всё заработает.
Чтобы пофиксить откройте приложение Keychain Access, правой кнопкой нажмите на связку login и попробуйте залочить и разлочить её. После этого всё заработает.
Я, наверное, должен был начать вести канал с этой ссылки — это очень важная отправная точка для всех, кто занимается разработкой на PHP на любом уровне — для начинающих это хорошее подспорье, чтобы сразу учиться делать вещи правильно (и сэкономить пару лет, без шуток), для профессионалов — взглянуть на привычные техники под новым углом.
http://www.phptherightway.com/
http://www.phptherightway.com/
Интересный баг поймали — если 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