Блог

  • Автоматизация создания контента: как я пишу статьи для блога и Telegram-канала

    Автоматизация создания контента: как я пишу статьи для блога и Telegram-канала

    Создание контента — процесс, который требует времени. Однако современные технологии позволяют существенно его ускорить. В этой статье я расскажу, как автоматизировать написание статей, используя Telegram, AI-модели и специализированные инструменты.

    От голосовых заметок к статье

    Раньше процесс написания статей предполагал долгую работу с текстом: от чернового варианта до окончательной редакции. Однако печатать текст вручную — уже не самый удобный формат. Поэтому я нашел способ делать это быстрее.

    1. Фиксация идей. Все начинается с голосовых заметок. Я записываю мысли в Telegram (раздел «Избранное»), что позволяет быстро сохранять идеи.
    2. Автоматическая расшифровка. Пользователи Telegram Premium могут воспользоваться функцией «Расшифровать» для преобразования голосового сообщения в текст.
    3. Редактура AI. После получения текста я копирую его в Perplexity, ChatGPT или любую другую AI-систему. С помощью простого запроса — «Сделай из этого статью» — AI превращает заметку в готовый текст.
    4. Доработка. Несмотря на продвинутость AI, он пока не может добавить изображения, расставить ссылки и внести важные редакторские правки. Эти доработки выполняю вручную.

    Оптимизация для Telegram-канала

    Формат публикаций в Telegram требует специфической структуры:

    • Короткие абзацы для удобства чтения
    • Грамотно подобранные эмодзи
    • Минимальное количество лишнего текста

    Чтобы не редактировать статьи вручную перед публикацией в Telegram, я создал Space в Perplexity, который автоматически форматирует текст в нужном стиле. В этом Space прописан промпт, обеспечивающий структурирование статьи по стандартам Telegram.

    Если вас заинтересовал мой подход, я разместил готовый промпт в исходнике этой статьи на своем блоге. Вы можете воспользоваться им, чтобы автоматизировать создание контента для своего Telegram-канала.

    Ты профессиональный SMM менеджер и готовишь мне публикации в канал Telegram. Я даю тебе ссылку на текст, ты возвращаешь сообщение, которое я сразу копирую и вставляю сразу в сообщение канала. Никаких приветствий и дополнительных фраз от тебя не требуется
    Предоставленный текст можно немного улучшить стилистически, добавить эмоджи в нужных местах. Оформить по лучшим практикам оформления сообщений в Телеграм. Не сокращай статью. Просто оформи.
    Не нужно указывать внизу источники, но нужно добавить несколько ссылок в конце сообщения:
    Дальше текст как есть, не меняй его, но можешь перед добавить релевантный эмоджи:
    Полная версия статьи в моем блоге  - здесь ссылка на статью, которую я дал тебе
    Заказать консультацию CTO - https://mtkv.ru
    Не надо указывать блок Sources
    Не надо делать ссылки с markdown разметкой, в телеграме они не работают.
    Таблицы телеграм не поддерживает

    Итог

    Этот процесс позволяет:
    ✅ Экономить время на написание текстов
    ✅ Автоматизировать рутину с AI
    ✅ Упрощать публикации в Telegram

    Если вы занимаетесь контент-маркетингом или ведете корпоративный блог, попробуйте адаптировать этот подход под свои задачи. Удачи!

  • Вайб-кодинг: миф или реальность?

    Вайб-кодинг: миф или реальность?

    Сегодня поговорим о концепции, которая вызывает интерес у многих разработчиков — вайб-кодинг. Это подход к созданию цифровых продуктов, где вы взаимодействуете с интеллектуальными агентами, способными не только предлагать куски кода, но и редактировать файлы, формируя готовый продукт. Однако давайте разберемся, насколько это реально и какие подводные камни существуют.

    Что такое вайб-кодинг?

    Вайб-кодинг — это процесс, в котором разработчик взаимодействует с умным редактором кода (например, Cursor или Github Copilot). Основная идея заключается в том, что вы формулируете запрос, а агент генерирует код и даже редактирует файлы. В идеале вы получаете готовый сайт или приложение на выходе.

    На первый взгляд звучит как магия: вы описываете проект в нескольких абзацах, и через некоторое время видите результат. Первое впечатление от такого подхода может быть ошеломляющим — продукт запускается, интерфейс работает. Но при более глубоком погружении начинают проявляться проблемы:

    • Ненормализованные базы данных: структура данных может оказаться хаотичной.
    • Ошибки в логике: агент может забыть о ранее созданных функциях или переписать их несколько раз.
    • Отсутствие целостности: без четкого технического задания (ТЗ) продукт будет страдать от архитектурных недочетов.

    Почему вайб-кодинг пока не существует в чистом виде?

    На текущем этапе развития технологий вайб-кодинг скорее звучит как мечта. Чтобы получить качественный результат, разработчику всё равно приходится:

    1. Расписывать архитектуру проекта.
    2. Формулировать контракты между компонентами.
    3. Создавать модель базы данных и описывать связи таблиц.
    4. Подробно описывать каждую страницу и её функционал.

    По сути, это всё равно превращается в написание технического задания (ТЗ). А как известно, ТЗ писать любят далеко не все.

    Кому подходит вайб-кодинг?

    Если вы опытный архитектор или разработчик с терпением и навыками планирования, то вайб-кодинг может стать полезным инструментом. При условии, что вы готовы потратить время на детальную проработку проекта и составление ТЗ, результат может быть впечатляющим.

    Личный опыт: Perfecto

    Для примера рассмотрим продукт Perfecto — проект, который я создал с использованием вайб-кодинга. Однако стоит отметить важный момент:

    • Первая версия была попыткой «трушного» вайб-кодинга без четкого плана. Итог оказался плачевным: база данных была хаотичной, код — трудно поддерживаемым, а продукт — уязвимым. Ознакомиться тут: https://app.mtkv.ru/
    • Вторая версия была полностью спроектирована заранее: архитектура, ожидания и образ результата были детально описаны. Итог получился гораздо лучше — продукт стал стабильным и удобным для поддержки. Можно ее посмотреть тут https://perf.mtkv.ru/

    Снаружи обе версии выглядели одинаково — интерфейс работал. Но разница в качестве кода и удобстве сопровождения была колоссальной.

    Чтобы понять всю боль, вот скриншот первой версии:

    3300+ строк! Вся логика замешана в одном файле. И это вы еще фронтенд не видели.

    Выводы

    На данный момент вайб-кодинг — это скорее инструмент для ускорения разработки при наличии четкого плана действий. Без предварительной подготовки он превращается в хаос и головную боль для разработчика.

    Если вы хотите попробовать этот подход:

    • Будьте готовы к тщательному планированию.
    • Используйте его как помощника, а не замену профессиональной разработки.
    • Не пренебрегайте техническим заданием — оно остаётся основой успешного проекта.

    Возможно, однажды технологии достигнут уровня настоящего вайб-кодинга, где можно будет просто «кайфовать», но пока это лишь мечта.

  • Полезные привычки, которые помогают оставаться в тонусе

    Полезные привычки, которые помогают оставаться в тонусе

    Сегодня выходной, и я решил немного отвлечься от темы программирования, чтобы поговорить о привычках, которые помогают быть лучше, заряженным и стремиться к чему-то большему. Это не совсем связано с кодом или архитектурой, но всё же оказывает огромное влияние на нашу продуктивность, здоровье и общее состояние. Хочу поделиться своим опытом и рассказать о тех ритуалах, которые помогают мне двигаться вперёд.


    Чтение: зарядка для ума

    Чтение — это привычка, которая должна быть у каждого. Она развивает мозг, расширяет кругозор и помогает расслабиться. У меня чтение стало вечерним ритуалом: перед сном я всегда беру в руки книгу. Сейчас я перечитываю цикл «Тёмная башня» Стивена Кинга. Это художественная литература, которая помогает мне переключиться от работы и настроиться на сон.

    Но чтение не должно ограничиваться только художественными произведениями. Техническая литература — это ещё один важный аспект. У меня есть своя небольшая библиотека профессиональных книг, которые помогают мне расти как разработчику и архитектору. Например, прямо сейчас на моём столе лежит книга Site Reliability Engineering от Google, которую я с удовольствием читаю. До этого я изучал «Высоконагруженные приложения» (знаменитая книга с кабанчиком), а в ближайших планах — «Совершенный код». Также читаю «Язык программирования Go», чтобы углубить свои знания.

    Чтение — это ежедневная тренировка для мозга, и я уверен, что каждый найдёт для себя подходящий формат: будь то художественная литература или профессиональные книги.


    Спорт: забота о теле

    Вторая важная привычка — спорт. Как разработчики, мы часто понимаем, как устроены системы и процессы. Но важно помнить, что наш организм — это тоже сложная система. Если не держать его в тонусе, то как мы можем ожидать продуктивности от себя?

    Я занимаюсь спортом через день: подтягивания, отжимания на брусьях. В этом году я принял для себя челлендж — сделать 10 тысяч подтягиваний и отжиманий за 2025 год. Уже выполнил 4 тысячи и явно перевыполню план! Единственный минус — пришлось обновить гардероб: старая одежда стала мала.

    Кроме тренировок важно добавлять прогулки. Мы много времени проводим за компьютерами и телефонами, а движение — это жизнь. Я стараюсь проходить минимум 10 тысяч шагов в день. Если есть возможность, беру детей или супругу на прогулку — это не только полезно для здоровья, но и укрепляет семейные отношения.


    Хобби: удовольствие для души

    Ещё одна привычка — заниматься чем-то для удовольствия. Для меня это программирование с использованием AI. Я реализую проекты, о которых давно мечтал, но раньше не хватало времени. Это приносит мне радость и одновременно развивает мои навыки.

    Важно помнить: работа — это не вся наша жизнь. Даже если вы любите своё дело (как я люблю программирование), находите время для хобби или проектов «для души». Это помогает сохранить баланс между работой и личной жизнью.


    Итог

    Эти простые привычки помогают мне оставаться в тонусе:

    1. Чтение: художественная и техническая литература.
    2. Спорт: тренировки через день и ежедневные прогулки.
    3. Хобби: занятия тем, что приносит радость.

    Каждый из нас может найти свои ритуалы, которые сделают жизнь лучше. Главное — быть последовательным и помнить о балансе между работой и отдыхом.

  • Adminer — Легкий способ заглянуть в БД

    Adminer — Легкий способ заглянуть в БД

    Продолжаю серию лайфхаков для разработки своих pet-проектов. Сегодня мы всего за 2 мегабайта заглянем внутрь базы данных на своем сервере.

    Для этого нам понадобится Adminer — легковесный интерфейс для просмотра своих таблиц. Больше подходит, конечно, для вашего dev/stage окружения, но можно и на проде, только учитывайте риски и не публикуйте порты наружу для коммерческого продукта.

    Все что нужно сделать — добавить в docker compose следующий код:

      # Adminer для управления базой данных (доступен только через внутреннюю сеть)
      adminer:
        image: adminer:latest
        depends_on:
          db:
            condition: service_healthy
        restart: unless-stopped
        environment:
          - ADMINER_DEFAULT_SERVER=db
        networks:
          - app_network
        # Не публикуем порты наружу для безопасности

    Дальше хитрый трюк, хотите открыть его в браузере у себя на компьютере? Запустите команду ssh туннеля для маппинга портов:

    ssh -L 8080:localhost:8080 user@remote_server_ip

    Это одна из тех команд, которые я хотел бы знать гораздо раньше в своей карьере. Теперь на локалхосте у вас удаленный сайт открывается, и доступен он только вам!

  • Dozzle — как Docker Desktop, только на сервере

    Dozzle — как Docker Desktop, только на сервере

    Все мы любим красивые логи, которые нам дают ребята из Платформы, где все понятно и хорошо видно. Но что делать со своими pet-проектами? Когда они уже в мини-продакшине, как посмотреть что творится в контейнере?

    Раньше я ходил через ssh, подключался интерактивно к контейнеру, смотрел в реальном времени логи, пока не обнаружил шикарный Dozzle!

    Всего одна команда и один конфигурационный файл, и вот у вас почти что свой Docker Desktop со всеми контейнерами и всеми логами в реальном времени!

    docker run --restart always -d -v  /var/run/docker.sock:/var/run/docker.sock -v /data:/data -p 8080:8080 amir20/dozzle --auth-provider simple

    и создать перед этим файл в /data/users.yml

    users:
      # "admin" here is username
      admin:
        email: me@email.net
        name: Admin
        # Generate with docker run amir20/dozzle generate --name Admin --email me@email.net --password secret admin
        password: $2a$11$9ho4vY2LdJ/WBopFcsAS0uORC0x2vuFHQgT/yBqZyzclhHsoaIkzK
        filter:

    Вот что получаем в итоге:

    Доступ к любому контейнеру и его логам. Все это можно через Caddy Server повесить на удобный вам поддомен и в реальном времени смотреть на то как работает ваш сайт. Или не работает, и узнать почему.

  • Шаблон Excalidraw для проведения интервью по системному дизайну

    Шаблон Excalidraw для проведения интервью по системному дизайну

    Для проведения интервью можно использовать следующий шаблон — позволяет структурировать ответ и не забыть спросить основные моменты, необходимые для проектирования:

    Скачать шаблон для https://excalidraw.com/

  • Сколько вебсокетов можно открыть на один чат сервер?

    Сколько вебсокетов можно открыть на один чат сервер?

    Количество WebSocket-соединений, которые можно открыть на одном чат-сервере, зависит от нескольких факторов, но теоретически это число может быть очень большим. Рассмотрим основные аспекты:

    Теоретический максимум

    Теоретически, максимальное количество WebSocket-соединений на одном сервере может достигать огромных значений. Каждое соединение уникально идентифицируется комбинацией IP-адреса клиента и порта источника. Это означает, что теоретический предел составляет около 2^48 (примерно 281 триллион) соединений на один порт сервера.

    Практические ограничения

    На практике количество соединений ограничивается несколькими факторами:

    1. Ресурсы сервера: Память, CPU и пропускная способность сети являются ключевыми ограничивающими факторами.
    2. Настройки операционной системы: Лимиты на количество открытых файловых дескрипторов и сетевых соединений могут ограничивать максимальное число WebSocket-соединений.
    3. Производительность сервера: С увеличением числа соединений может падать общая производительность системы.

    Реальные примеры

    • WhatsApp и Phoenix: Эти платформы достигли показателя в 2 миллиона одновременных WebSocket-подключений на одном сервере.
    • Эксперименты с Java: Исследователи смогли открыть более миллиона TCP-соединений на одном сервере, что применимо и к WebSocket.

    Оптимизация для большого количества соединений

    Для поддержки большого числа WebSocket-соединений рекомендуется:

    1. Использовать асинхронные библиотеки: Они значительно повышают производительность за счет одновременной обработки задач.
    2. Поддерживать многопоточность: Автоматическая или ручная настройка многопоточности помогает масштабировать производительность.
    3. Выбирать эффективные языки и фреймворки: NodeJS, Java и C# показали хорошие результаты в тестах производительности WebSocket-серверов.
    4. Оптимизировать настройки сервера: Увеличение лимитов на файловые дескрипторы и сетевые соединения в ОС может существенно повысить возможности сервера.
    5. Использовать балансировку нагрузки: Распределение соединений между несколькими серверами позволяет масштабировать систему горизонтально.

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

  • Какой фреймворк выбрать на основе RPS (Request per second)

    Какой фреймворк выбрать на основе RPS (Request per second)

    ФреймворкЯзыкRPSУдобствоЭкосистемаСообществоДокументацияМасштабируемостьБезопасностьИнтеграция
    ActixRust1000007788997
    WarpRust900007677997
    ASP.NET CoreC#600009999999
    FiberGo600008788888
    GinGo550008898888
    FastifyJS600009889889
    NestJSJS500009999999
    Spring BootJava4000081010910910
    MicronautJava350008878998
    FastAPIPython300009889888
    DjangoPython20009101010899
    HanamiRuby20007777787
    RailsRuby19001010109889
    LaravelPHP1000991010889
    SymfonyPHP9008999999
    1. Удобство: Насколько легко начать работу и разрабатывать с использованием фреймворка.
    2. Экосистема: Разнообразие и качество доступных библиотек и инструментов.
    3. Сообщество: Активность и размер сообщества разработчиков.
    4. Документация: Качество и полнота официальной документации.
    5. Масштабируемость: Способность фреймворка справляться с ростом нагрузки и размера приложения.
    6. Безопасность: Встроенные механизмы безопасности и легкость их реализации.
    7. Интеграция: Простота интеграции с другими технологиями и сервисами.

    При выборе фреймворка следует учитывать все эти факторы в контексте конкретного проекта. Например:

    • Для быстрой разработки прототипов могут подойти Ruby on Rails или Django.
    • Для высоконагруженных систем стоит обратить внимание на Actix, ASP.NET Core или Spring Boot.
    • Если важна гибкость и легковесность, то Fastify или Gin могут быть хорошим выбором.
    • Для корпоративных приложений с сложной бизнес-логикой Spring Boot или ASP.NET Core предоставляют широкие возможности.

    Сколько серверов надо?

    MAU (10^n)DAURPSСерверы (Fiber)Серверы (Django)
    10000 (10^4)3 5000.6111
    100000 (10^5)35 0006.0811
    1000000 (10^6)350 00060.7611
    10000000 (10^7)3 500 000607.6411
    100000000 (10^8)35 000 0006076.3914
    1000000000 (10^9)350 000 00060763.89231

  • Согласованное и рандеву хеширование

    Согласованное и рандеву хеширование

    Согласованное хеширование (Consistent hashing) — это специальная техника хеширования в компьютерных науках, которая обладает важным свойством: при изменении размера хеш-таблицы требуется перераспределить в среднем только n/m ключей, где n — количество ключей, а m — количество слотов.

    Основные особенности

    • Эффективность при масштабировании: В отличие от традиционных хеш-таблиц, где изменение количества слотов приводит к перераспределению почти всех ключей, согласованное хеширование минимизирует количество перемещаемых данных.
    • Распределение нагрузки: Техника равномерно распределяет ключи кэша по шардам, даже если некоторые шарды выходят из строя или становятся недоступными.

    Применение

    Согласованное хеширование широко используется в распределенных системах, особенно в:

    • Распределенных кэшах
    • Системах хранения данных (например, Amazon Dynamo)
    • Сетях доставки контента (CDN)
    • Балансировке нагрузки

    Принцип работы

    1. Ключи и серверы отображаются на виртуальную окружность (обычно от 0 до 2π).
    2. Каждый ключ назначается ближайшему серверу по часовой стрелке.
    3. При добавлении или удалении сервера перераспределяются только ключи, попадающие в его сегмент.

    Преимущества

    • Минимизация перераспределения данных при изменении количества серверов.
    • Улучшение масштабируемости и отказоустойчивости распределенных систем.

    Согласованное хеширование стало ключевой технологией для многих современных распределенных систем, обеспечивая эффективное распределение данных и нагрузки


    Рандеву-хеширование (Rendezvous hashing) или хеширование с наибольшим случайным весом (HRW) — это алгоритм, позволяющий клиентам достичь распределенного соглашения о выборе k вариантов из n возможных. Этот метод часто применяется в распределенных системах для назначения объектов серверам или прокси.

    Основные особенности

    • Простота: Алгоритм концептуально прост и легок в реализации.
    • Минимальное нарушение: При добавлении или удалении узла перераспределяются только объекты, связанные с этим узлом.
    • Равномерное распределение: Обеспечивает равномерное распределение объектов по узлам.
    • Поддержка взвешивания: Позволяет учитывать разную мощность узлов.

    Принцип работы

    1. Для каждого объекта и каждого узла вычисляется хеш-значение.
    2. Объект назначается узлу с наибольшим хеш-значением.
    3. При изменении набора узлов пересчитываются только затронутые объекты.

    Применение

    Рандеву-хеширование используется во многих реальных системах, включая:

    • Балансировщик нагрузки GitHub
    • Распределенная база данных Apache Ignite
    • Файловое хранилище Tahoe-LAFS
    • Pub/sub платформа Twitter EventBus

    Преимущества перед согласованным хешированием

    • Более простая концепция и реализация
    • Не требует предварительных вычислений или хранения токенов
    • Обеспечивает простое решение для распределенного k-соглашения

    Рандеву-хеширование становится все более популярным в современных распределенных системах благодаря своей простоте, эффективности и гибкости

    ХарактеристикаСогласованное хешированиеРандеву-хеширование
    Год изобретения19971996
    СложностьБолее сложныйПроще
    Метод отображенияОтображает узлы и ключи на кольцо хешированияВычисляет хеш-значения для каждой пары ключ-узел
    Размещение объектовПо часовой стрелке на хеш-кольцеВыбирает узел с наибольшим хеш-значением
    Балансировка нагрузкиХорошая, но могут быть горячие точкиВ целом лучше, более равномерная
    МасштабируемостьХорошо масштабируется при инкрементных измененияхМенее масштабируемо, пересчитывает все хеши
    Предварительные вычисления токеновТребует предварительного вычисления и хранения токеновНе требует предварительных вычислений токенов
    Сложность добавления/удаления узловO(K/N + log N)O(n) для базовой реализации
    Перераспределение ключейМинимальное перемещение ключейОбъекты перераспределяются на оставшиеся узлы
    Реальное использованиеCassandra, CouchbaseGitHub Load Balancer, Apache Ignite, Twitter EventBus
  • Какую базу использовать для высоконагруженного приложения?

    Какую базу использовать для высоконагруженного приложения?

    База данныхCAPQPSМасштабированиеОптимизацияIn memory/Disk basedОбласть применения
    Apache CassandraAPДо 1 000 000ГоризонтальноеWriteDisk basedБольшие данные, IoT
    MemcachedCPДо 1 000 000ГоризонтальноеReadIn memoryКэширование, веб-приложения
    RedisCPДо 500 000+ГоризонтальноеRead/WriteIn memoryКэширование, сессии
    Amazon DynamoDBAPДо 500 000Автоматическое горизонтальноеRead/WriteDisk basedВеб-приложения, мобильные приложения
    ClickHouseCPДо 300 000ГоризонтальноеRead/WriteDisk basedАналитика, большие данные
    CouchbaseAPДо 200 000ГоризонтальноеRead/WriteHybridВеб-приложения, мобильные приложения
    PostgreSQLCAДо 150 000Вертикальное, репликацияReadDisk basedТранзакционные системы, ГИС
    Oracle DatabaseCAДо 120 000Вертикальное, RAC кластерыRead/WriteDisk basedКорпоративные приложения, финансы
    MongoDBCPДо 100 000Горизонтальное и вертикальноеRead/WriteDisk basedВеб-приложения, IoT
    MySQLCAДо 100 000Вертикальное, репликацияReadDisk basedВеб-сайты, CMS
    EtcdCPДо 80 000ГоризонтальноеReadDisk basedРаспределенные системы, конфигурации
    Apache HBaseCPДо 30 000ГоризонтальноеWriteDisk basedБольшие данные, аналитика
    Microsoft Azure Cosmos DBAPВарьируетсяГоризонтальноеRead/WriteDisk basedГлобально распределенные приложения
    InfluxDBCPВарьируетсяГоризонтальноеRead/WriteDisk basedIoT, мониторинг
    PostGISCAВарьируетсяВертикальное, репликацияReadDisk basedГИС, картография
    Apache Spark SQLCPВарьируетсяГоризонтальноеRead/WriteIn memoryАналитика больших данных
    OpenSearchAPВарьируетсяГоризонтальноеReadDisk basedПоиск, логи
    CouchDBAPВарьируетсяГоризонтальноеRead/WriteDisk basedВеб-приложения, мобильные приложения
    FirebirdCAВарьируетсяВертикальное, репликацияRead/WriteDisk basedВстраиваемые системы, локальные приложения

    Примечания:

    1. «In memory» означает, что база данных хранит данные преимущественно в оперативной памяти для быстрого доступа.
    2. «Disk based» означает, что база данных в основном хранит данные на диске.
    3. «Hybrid» (как в случае с Couchbase) означает, что база данных использует как память, так и диск для оптимальной производительности.
    4. Значения QPS являются приблизительными и могут варьироваться в зависимости от конфигурации и нагрузки.