Хинт по работе со связанными данными на фронтенде

Казалось бы, банальная задача: манипулировать в SPA списком (допустим) фотографий, которые лайкнул текущий юзер. Добавляем в контроллер /api/users.json что-то вроде to_json(with: liked_photos) и получаем вместе с текущим юзером все айдишники лайкнутых им фоток на фронтенде. Можем показать их списком, в ряд, галереей, рандомно, как угодно. Вывести счётчик, сортануть и тэ дэ.

И всё круто до тех пор, пока… Continue reading “Хинт по работе со связанными данными на фронтенде”

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

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

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

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

Интернет и wi-fi на даче

Если вам так же, как и мне, хочется отдыхать на даче, сидя в удобном кресле, вытянув ножки и поставив на колени ноутбук – это пост для вас. Я поделюсь своим текущим опытом организации полноценной домашней сети с интернетом и wi-fi на даче. То есть такой сети, в которой вы чувствовали бы себя как дома, со всеми своими устройствами, фильмами, музыкой и с постоянным доступом к облачным сервисам. Continue reading “Интернет и wi-fi на даче”

События VS изменения данных: кто прав?

Один мой коллега, собаку съевший на управлении данными, подкинул интересную мысль: мол, можно трактовать любое событие (в событийно-ориентированной архитектуре) как изменение данных, и наоборот. Таким образом, предполагается, что можно программировать сколь угодно сложную систему и как связь событий-реакций, и как последовательность изменения данных. Выглядит заманчиво, но спорно, поэтому давайте разберёмся по-порядку. Continue reading “События VS изменения данных: кто прав?”

А как ты насчёт немного покодить?

Этот вопрос задают мне поголовно все работодатели. С первого взгляда ответ кажется очевидным, но… Всегда есть это “но”. Если рассматривать вопрос в лоб, то очевидно: предлагать “покодить” человеку, который более 15 лет работает менеджером, практически с нуля поставил ряд технологических и бизнес-процессов в UMI.CMS, неоднократно формировал успешные команды веб-разработчиков, но никогда в жизни официально не работал программистом, – по меньшей мере странно. Continue reading “А как ты насчёт немного покодить?”