Интернет на даче: год спустя, v2.0

Не знаю как вам, а мне для работы за городом скоростей 3G не хватало никогда. Поэтому, когда весной я обнаружил на модеме весело мигающий зелёный значок 4G-соединения, тут же был поставлен вопрос о переходе на этот стандарт. Напомню, что моя деревня – не пригород, до Питера по прямой более 55 километров, интернет 3G я ловлю с помощью специальной антенны на нехилой такой мачте. Continue reading “Интернет на даче: год спустя, v2.0”

Багрепорты с продакшена прямо в вашу IDE с автоматическим тайм-трекингом исправлений

Представьте себе: вы разработчик веб-проекта, работаете над решением задач и фиксом багов, не вылезая из своей любимой IDE. Если на продакшене (или на стейдже) случается какой-то баг, то вам прямо в IDE прилетает полная информация о нём, включая id пользователя сайта и полный стек-трейс. Вы фиксите баг, коммитите и пушите его как обычно, а затраченное на него время автоматически трекается в учётной системе – не надо никуда переключаться. Круто? Безусловно.

В этой краткой заметке я расскажу о том, как построить такую систему на примере продукции JetBrains (Rubymine и PHPStorm). Continue reading “Багрепорты с продакшена прямо в вашу IDE с автоматическим тайм-трекингом исправлений”

Строим full-stack environment для приватных проектов на основе бесплатных инструментов

Disclaimer: автор не призывает экономить “на спичках”. Вряд ли стоит работать с заказчиком, с которым вы не можете себе позволить $5 на виртуалку в DO и $10 на Jira. Однако всегда есть сайд-проекты, личные эксперименты, случайные разработки на голом энтузиазме – на которые никаких денег не напасёшься, если покупать под каждую отдельный набор. Поэтому мне было интересно собрать full stack (полный комплекс) инструментов, позволяющих построить процесс от разработки до непрерывной интеграции, деплоя и мониторинга – в приватном (закрытом) проекте – исключительно на freeware или бесплатных тарифах публичых сервисов. Continue reading “Строим full-stack environment для приватных проектов на основе бесплатных инструментов”

No more has_one, please

Есть два из трёх популярных видов ассоциаций: has_one и has_many. Все знаю как они устроены: в первом случае идентификатор связанной сущности является атрибутом модели (а следовательно – столбцом в БД). Во втором случае, создаётся транзитивная таблица связи со столбцами entityA_id и entityB_id.

Казалось бы, решения абсолютно равноправны, выбирай подходящее под задачу. Однако здесь есть важная проблема. Continue reading “No more has_one, please”

Customer-driven dependency injection: отдаём поток выполнения программы в руки клиенту

Многие из вас знакомы с паттернами снижения “сильносвязанности” кода программного продукта, такими как внедрение зависимостей. В качестве простого примера – объект класса Logger, который не указан явно, а подсовывается в ходе выполнения кода. В зависимости от задач, условий, текущего окружения и так далее – конфигурирование позволяет подсунуть в нужное место тот или иной логгер – и писать хоть в файлы, хоть в базу, хоть в очередь rabbitmq. Вам достаточно делать Logger.write(data), и дальше алгоритм конкретного внедрённого обработчика будет применён к указанным данным.

Однако мы все привыкли обманываться, считая имеющееся у нас “dependency injection” отличным способом понизить связанность. Да, мы убрали алгоритмы во внедряемые компоненты, но мы по-прежнему задаём их либо в коде, либо в аннотациях (в случае PHP/Symfony), либо в конфигурационных файлах окружения. И мне не давала покоя мысль – как отдать такое конфигурирование в руки клиенту (другими словами – сделать его управляемым “на ходу”), при этом не применяя костылирование и не изобретая велосипед. В этом посте я хочу поделиться с вами паттерном, решающим эту задачу, который мне почему-то не встретился в литературе, но его удалось наработать в ходе локальных экспериментов. Continue reading “Customer-driven dependency injection: отдаём поток выполнения программы в руки клиенту”