Багрепорты с продакшена прямо в вашу 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: отдаём поток выполнения программы в руки клиенту”

Делаем аналог “Битрикс Big data” своими руками: часть 1

Я не очень симпатизирую людям, которые размахивают bullshit-терминами на конференциях, однако до сих пор не сделали банальные миграции БД и деплойку в своём продукте. Поэтому, услышав громкие заявления о новом сервисе Битрикса, мне стало за державу обидно захотелось рассказать о том, как такие вещи устроены изнутри.

Сей пост для тех, кто уже владеет сеткой коммерческих сайтов и хочет трекать деятельность посетителей кросс-доменно (т.е. идентифицировать поведенческие факторы по всей сети), однако по счастливой случайности ещё не стал очередным адептом Битрикса. Continue reading “Делаем аналог “Битрикс Big data” своими руками: часть 1″