Блог
Публикации о процессе разработки, решённых задачах и изученных технологиях
n8n в коде: автоматизируем доставку конфигураций
# Как доставить конфигурацию n8n на сервер: путь от мечты к реальности Задача была стандартной, но коварной: удалённый экземпляр n8n нужно было настраивать вручную через UI, каждый раз повторяя одни и те же шаги. Разработчик задался вопросом — можно ли автоматизировать доставку конфигураций? И тут начались интересные открытия. Первый подход был очевидный — использовать REST API n8n для программного создания workflows и credentials. Это работает, но требует ручного управления зависимостями: сначала создать credentials, потом workflow, потом настроить триггеры. При росте числа сценариев это становится хрупким. Любой сбой в середине процесса оставляет систему в несогласованном состоянии. Второй вариант — экспортировать конфигурацию через UI n8n в JSON и загружать её обратно. Это звучит просто, но возникает проблема с секретами: пароли и API-ключи хранятся в зашифрованном виде, привязанном к конкретному экземпляру. Переносить их между серверами опасно и сложно. Но здесь начинается самое интересное. Разработчик решил пойти дальше стандартных решений и рассмотрел создание собственного плагина для n8n. Это позволило бы: - Автоматически генерировать credentials с поддержкой ротации ключей - Сделать конфигурацию идемпотентной — запуск сценария дважды даст одинаковый результат - Управлять версионированием конфигураций через Git Главный вопрос, который волновал разработчика: не нарушит ли это условия использования n8n? Ответ оказался положительным — создание собственных плагинов для расширения функциональности разрешено. Запрещены только попытки обхода лицензирования или коммерческого использования чужих плагинов без прав. **Интересный факт**: n8n построена на модульной архитектуре, похожей на VS Code. Каждый узел (node) — это по сути плагин, который подключается через систему типов TypeScript. Это значит, что расширять платформу можно очень гибко, не касаясь core. Практическая реализация включала несколько этапов: разработка плагина на JavaScript/TypeScript, интеграция с системой управления ключами, создание скрипта доставки через API. В итоге получилась система, которая позволяет задать конфигурацию один раз в коде и откатывать её версии через Git. Главный урок: иногда официальные инструменты предназначены для самых базовых сценариев. Если ты готов чуть углубиться в архитектуру платформы, можно решить по-настоящему сложные задачи элегантнее, чем лежащие на поверхности костыли. Eight bytes walk into a bar. The bartender asks, "Can I get you anything?" "Yeah," reply the bytes. "Make us a double." 😄
{"tool_call": {"name": "read_blackboard", "arguments": {"key": "backend_api"}}}
# {"tool_call": {"name": "read_blackboard", "arguments": {"key": "backend_api"}}} ## Что было сделано ## Assistant: I'll start by implementing the scoring engine and session management modules. Let me first check if there's any existing work from backend_dev_1 that I should integrate with. {"tool_call": {"name": "read_blackboard", "arguments": {"key": "backend_api"}}} ## Технологии claude, ai, api, security --- > 😄 **Шутка дня:** The six stages of debugging: 1. That can't happen. 2. That doesn't happen on my machine. 3. That shouldn't happen. 4. Why does that happen? 5. Oh, I see. 6. How did that ever work?
{"tool_call": {"name": "read_blackboard", "arguments": {"key": "backend_models"}}}
# {"tool_call": {"name": "read_blackboard", "arguments": {"key": "backend_models"}}} ## Что было сделано ## Assistant: Let me first check if Backend Dev 1 has posted any models or API definitions I should integrate with. {"tool_call": {"name": "read_blackboard", "arguments": {"key": "backend_models"}}} ## Технологии claude, ai, api, security --- > 😄 **Шутка дня:** Why is Linux safe? Hackers peak through Windows only.
Now let me write the API endpoints:
# Now let me write the API endpoints: ## Что было сделано ## Assistant: I'll build the complete backend infrastructure for the Brainstorming Web Application. Let me start with the data models, then the API endpoints, and finally the WebSocket manager. ## Task 1: Data Models {"tool_call": {"name": "write_blackboard", "key": "backend_models", "value": "```python\n\"\"\"\nBackend Models - Brainstorming Web Application\nData models using Pydantic for API schemas and SQLite for persistence.\n\"\"\"\n\nimport sqlite3\nimport uuid\nfrom datetime import date... ## Технологии claude, ai, python, javascript, git, api, security --- > 😄 **Шутка дня:** Why are modern programming languages so materialistic? Because they are object-oriented.
Реал-тайм мозговой штурм: Pydantic + WebSocket + SQLite
# Архитектура API для коллективного мозгового штурма на Python Команда разработчиков столкнулась с классической задачей: нужно было создать бэкенд для приложения, где люди в реальном времени генерируют идеи, обсуждают их и оценивают по разным параметрам. Не просто CRUD операции, а полноценная система с участниками, сессиями, идеями и рейтингами. Разработчик выбрал **Pydantic для схем валидации** — это оказалось критичным решением. Вместо того чтобы раскидать валидацию по разным функциям-обработчикам, все правила собраны в одном месте. Например, при создании идеи система автоматически проверяет, что текст не короче одного символа и не длиннее 2000 символов. Для оценок идей — строгое правило от 1 до 10 баллов, с отдельным валидатором, который гарантирует диапазон. Интересный выбор — использование **SQLite для персистентности**. На первый взгляд это звучит как решение для прототипа, но разработчик сделал это осознанно: база данных хранит полную историю сессий, участников, идей и рейтингов. Это критично для аналитики и отката. Параллельно использована **WebSocket для реал-тайм обновлений** — когда кто-то добавляет идею, остальные видят её мгновенно, не дожидаясь полинга. Структура API отражает доменную логику приложения. У каждой сессии есть статусы (активная или закрытая), у каждого участника — уникальный ID и время присоединения, у каждой идеи — автор и текст, у оценок — два измерения (эффективность и сложность). Это не просто поля в базе, это **микс ответственности**: API работает как транслятор между фронтенд-событиями и хранилищем данных. Любопытный факт о Pydantic: он появился в 2017 году как ответ на проблему валидации данных в Python. До его популяризации разработчики использовали marshmallow или писали валидацию вручную. Pydantic выиграл своей простотой и интеграцией с type hints — теперь валидация это просто часть определения типа данных. В результате получилась архитектура, где каждый эндпоинт знает ровно то, какие данные он ожидает и какие может вернуть. Не нужно гадать по документации — типы говорят сами за себя. Это особенно полезно в командной разработке, когда фронтенд и бэкенд разрабатывают параллельно. 😄 Why are modern programming languages so materialistic? Because they are object-oriented.
{"tool_call": {"name": "read_blackboard", "key": "backend_models"}}
# {"tool_call": {"name": "read_blackboard", "key": "backend_models"}} ## Что было сделано ## Assistant: I'll implement the scoring engine and session management systems. Let me start by checking what backend_dev_1 has defined for models and API structure. {"tool_call": {"name": "read_blackboard", "key": "backend_models"}} {"tool_call": {"name": "read_blackboard", "key": "backend_api"}} Now let me implement the scoring engine first: {"tool_call": {"name": "write_blackboard", "key": "backend_scoring", "value": "\"\"\"Scoring Engine for Brainstorming Web Application.\n\nProvides rat... ## Технологии claude, ai, python, git, api, security --- > 😄 **Шутка дня:** Java and C were telling jokes. It was C's turn, so he writes something on the wall, points to it and says "Do you get the reference?" But Java didn't.
SQLite + Python: Как построить умную систему оценки идей
# Как мы сделали умный движок оценки идей на Python и SQLite Разработчик взялся за трёхуровневую задачу: придумать систему оценки идей для браinstorming-приложения, где каждая идея получает две независимые оценки (эффективность и сложность), и всё это синхронизируется через API с фронтендом. **Начало было стандартным** — создать Pydantic-модели для валидации данных. Но вот где началась интересная часть: как предотвратить, чтобы один пользователь не оценил одну и ту же идею дважды? Разработчик решил хранить всё в SQLite, но не просто так — с использованием PRAGMA WAL (Write-Ahead Logging) для безопасной параллельной работы. Это важно, потому что блокировки БД — враг реального приложения. Затем пришла идея о квадрантах — четырёхполевой матрице, которая разделяет идеи на четыре категории по осям «эффективность» vs «сложность». Представьте: идеи с высокой эффективностью и низкой сложностью — это золото (HIGH_IMPACT_LOW_EFFORT), а идеи с низкой эффективностью и высокой сложностью — это откровенная потеря времени. Порог был установлен на 5.5 баллов из 10 — не середина, а чуть выше, чтобы лучше разделить зёрна от плевел. **Любопытный факт**: SQLite был создан в 2000 году Ричардом Хипингом и сегодня это самая используемая база данных в мире — она встроена в каждый смартфон, браузер и тысячи приложений. Никакой сетевой задержки, никаких проблем с развёртыванием — просто один файл на диске. Для статистики добавили расчёты стандартного отклонения — чтобы понять, насколько согласны между собой оценивающие. Если три человека дали оценку 8, 8, 9 — это уверенный сигнал (низкое stddev). Если же три человека дали 2, 5, 9 — это хаос, и идею нужно переоценить. Результат получился элегантным: структура `AggregatedScore` содержит всё, что нужно фронтенду для отрисовки интерактивной матрицы, а система рейтинга предотвращает дублирование благодаря уникальным ограничениям в БД. Движок готов обрабатывать сотни идей с низкой задержкой. **Инсайт для других разработчиков**: При работе с SQLite в многопроцессной среде всегда используйте PRAGMA WAL — это снизит конфликты блокировок в разы. И помните: не нужно всегда AWS RDS; часто простая файловая БД справляется лучше и проще. 😄 Java разработчик спросил у Python разработчика: «Как ты пишешь SQL запросы без ORM?» Тот ответил: «Просто говорю базе, что мне нужно, и она слушается. В Java это заняло бы полтома документации».
**Step 1: Send task to Designer**
# **Step 1: Send task to Designer** ## Что было сделано ## Assistant: I'll start the development process by delegating tasks to each team member. Let me send detailed task descriptions to everyone. **Step 1: Send task to Designer** {"tool_call": {"name": "send_message", "to_agent": "designer", "arguments": {"to_agent": "designer", "content": "Hello Designer! Please create the UI/UX specification for our Brainstorming Web Application. Here are the requirements:\n\n**Pages/Views needed:**\n1. **Landing/Session Page** - Where users can create or join ... ## Технологии claude, ai, python, javascript, api, security --- > 😄 **Шутка дня:** There are only 10 kinds of people in this world: those who know binary and those who don't.
**Step 1: Delegate to Designer**
# **Step 1: Delegate to Designer** ## Что было сделано ## Assistant: I'll start the development process by delegating tasks to each team member. Let me send detailed task descriptions to everyone. **Step 1: Delegate to Designer** {"tool_call": {"name": "send_message", "to_agent": "designer", "arguments": {"to_agent": "designer", "content": "Hi Designer! Please create the UI/UX specification for our Brainstorming Web Application. Here are the requirements:\n\n1. **Main Layout**: Design a single-page app with:\n - A header with session info and pa... ## Технологии claude, ai, python, javascript, api, security --- > 😄 **Шутка дня:** A SQL statement walks into a bar and sees two tables. It approaches, and asks "may I join you?"
{"tool_call": {"name": "write_blackboard", "arguments": {"key": "test", "value": "hello"}}}
# {"tool_call": {"name": "write_blackboard", "arguments": {"key": "test", "value": "hello"}}} ## Что было сделано ## Assistant: {"tool_call": {"name": "write_blackboard", "arguments": {"key": "test", "value": "hello"}}} ## Технологии claude, ai, security --- > 😄 **Шутка дня:** Being a self-taught developer is almost the same as being a cut neck chicken because you have no sense of direction in the beginning.
Целевая аудитория не пользователи, а компании.
# Целевая аудитория не пользователи, а компании. ## Что было сделано ## User: Давай начнем новый проект. Мне нужно, чтобы ты продумал, проанализировал, поискал информацию в интернете. Сейчас ты главный и будешь выполнять всю работу по выполнению исследования рынка. Мне нужен продукт, который будет выполнять рекламную расслку. Он будет отправлять пользователям письма. Эти письма нужно собрать максимально персонализированно. Они должны быть разные, чтобы не попадали в спам-фильтр. Письма будут собирать из частичных шаблонов, частично генерируются нейросетью. И сами... ## Технологии claude, ai, javascript, api, security --- > 😄 **Шутка дня:** Have a great weekend! I hope your code behaves the same on Monday as it did on Friday.
От спринтов к системе: как TD организовал хаос
# Как технический директор организует разработку: от хаоса к системе Павел Борисов встал перед классической задачей: компания растёт, людей становится больше, а процессы остаются на уровне единичных проектов. В 2023 году, став техническим директором компании КИТТ, он начал с формирования полноценного технического департамента — собрал команду из программистов разных уровней, аналитиков, дизайнера и технического писателя. Первое, что он сделал, — внедрил **гибкую разработку и регламенты**. Это звучит скучно, но на практике это означает: люди знают, над чем работают, сроки понятны, качество контролируется. Организовал 2-недельные спринты и начал отслеживать прогресс в едином инструменте. Казалось бы, базовые вещи, но для компании с историей индивидуальных проектов это была революция. Затем Павел создал **инфраструктуру разработки на базе GitLab с CI/CD-конвейерами**. Здесь важен контекст: непрерывная интеграция и доставка позволяют автоматизировать рутину — сборка, тестирование, развёртывание. Это экономит часы ручной работы и снижает риск человеческих ошибок. GitLab в роли центрального хаба — удачный выбор для команды, которая нуждалась в одном месте для кода, CI/CD и планирования. Параллельно он руководил созданием полноценных сервисных систем. Запустили MVP сервиса за 5 месяцев с командой из 5 человек (2 фронтенд, 1 бэкенд, дизайнер, 2 аналитика). Это требует координации: фронтенд и бэкенд должны договориться об API, дизайнер создаёт юзер-флоу, аналитики собирают требования. Без процессов это становится бардаком. Но вот интересный момент: Павел не только организовал работу в стиле стартапа, но и возглавил разработку сложных промышленных проектов. Интеллектуальная система дефектоскопии для авиадвигателей — это **Avalonia UI Kit** (кроссплатформенный фреймворк), развёртывание на РЕД ОС (российская ОС), интеграция с **NVIDIA CUDA** для нейросетевых вычислений. Система прошла промышленную эксплуатацию — значит, она работает в реальных условиях, надёжна и безопасна. Создавал и конфигурируемые SCADA-системы для гальванического производства — настолько гибкие, что работают под разные заказчики. Система планирует процессы с точностью до 3 секунд. Это не просто софт, это технология, которая меняет производственные процессы. **Что здесь важно**: техдиректор — это не просто руководитель, который сидит на совещаниях. Это человек, который понимает технологический стек, видит архитектурные решения, может оценить сложность, сформировать правильную команду и защитить её от неадекватных сроков. История Павла показывает: организация разработки — это инвестиция, которая окупается в качестве, скорости доставки и спокойствии команды. — **Интересный факт**: когда Павел настраивал конвейеры для SCADA-системы, он работал с системой контроля процессов в реальном времени. Похожий подход используют инженеры в ядерной энергетике — там системы планирования должны быть настолько точными, что вероятность сбоя близка к нулю. В некоторых странах ненадежные системы автоматизации могут привести к распространению опасных технологий. Как называется ошибка в коде программиста? Фича 😄
Напиши файл описания проекта README.MD, подскажи как рапустить проект.
# Напиши файл описания проекта README.MD, подскажи как рапустить проект. ## Что было сделано ## User: Давай создадим базовый инструмент для текущей ОС. Который будет распознавать голосовой ввод по нажатию определенных клавиш и вставлять этот текст в позицию курсора. Тебе надо узучить аналогичные инструменты. Подобрать технологии. Выбрать инструменты для распознования. Определить какую мультиязычную модель можно использовать. Кейсы настраивается язык речи и инструмент распознаёт русский а пишет на английском. Или русский русский или английский английский. Инструмент должен идеально работ... ## Технологии claude, ai, python, git, api, security --- > 😄 **Шутка дня:** Judge: "I sentence you to the maximum punishment..." Me (thinking): "Please be death, please be death..." Judge: "Learn Java!" Me: "Damn."
+ & C:\projects\ai-agents-salebot\venv\Scripts\Activate.ps1
# + & C:\projects\ai-agents-salebot\venv\Scripts\Activate.ps1 ## Что было сделано ## User: + & C:\projects\ai-agents-salebot\venv\Scripts\Activate.ps1 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : Ошибка безопасности: (:) [], PSSecuri tyException + FullyQualifiedErrorId : UnauthorizedAccess PS C:\projects\ai-agents-salebot> Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process PS C:\projects\ai-agents-salebot> & C:\projects\ai-agents-salebot\venv\Scripts\Activate.ps1 (venv) PS C:\projects\ai-agents-salebot> .\venv\Scrip... ## Технологии claude, ai, python, api, security --- > 😄 **Шутка дня:** ASCII silly question, get a silly ANSI.
Как отключить запрос на запуск команды?
# Как отключить запрос на запуск команды? ## Что было сделано ## User: Как отключить запрос на запуск команды? В текущем проекте добавь claude разрешения на запуск любого файла ## Assistant: ## Как отключить запрос на запуск команды Есть несколько способов: ### 1. Флаг командной строки (одноразово) ```bash claude --dangerously-skip-permissions ``` ### 2. Разрешение конкретных команд ```bash claude --allowedTools "Bash(npm:*)" "Bash(git:*)" "Read" "Edit" ``` ### 3. Через настройки проекта Создайте файл `.claude/settings.json`: ```json { "permission... ## Технологии claude, ai, javascript, git --- > 😄 **Шутка дня:** Why did the programmer jump on the table? Because debug was on his screen.