Сообщество - ИТ-проекты пикабушников

ИТ-проекты пикабушников

784 поста 3 468 подписчиков

Популярные теги в сообществе:

9

Пишу сервис для общения: отправка сообщений

Был у меня сервер на Golang и простенький клиент для тестирования:

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

И вот в последнее время работал над отправкой сообщений. Наметил структуру/логику и реализовал отправку сообщений. В ответ на сообщение сервер кидает уведомление о доставке. Это нужно чтобы клиент понял, что нужно остановиться и не отсылать больше сообщения.

Доставкой сообщений на клиенте занимается мой небольшой доставщик. Кидаешь ему сообщение и он пытается его отправить. Сервер в ответ может отправить много чего, но в данный момент мне важно обработать статусы сообщения. А статусов столько (возможно что-то упустил и добавлю, но склоняюсь что этих хватит):
- в процессе отправки ⏳ (анимированные часики)
- ошибка отправки ❗
- доставлено на сервер ☑️
- доставлено до получателя ☑️☑️
- получатель прочел ✅✅

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

Но это еще не все. Не особо писал тесты и в какой-то момент временно сломал серверный код из-за изменения типов данных в серверной базе данных. Дела... 😂

Сейчас у меня сообщения отправляются, ответ сервер используется для обновления состояния сообщения. Кстати, вот скрин сообщений и их состояний:

А тут видно, что неотправленные сообщения помечаются восклицательным знаком, который расположен слева от сообщения и по центру:

Черновики

Но это еще не все. У нас же есть черновики и как хорошо что с самого начала начал над ними работать. Дело вот в чем. Пользователь может отправить сообщение новому собеседнику или даже будучи не в сети. В нормальном режиме отправка сообщения происходит по ID чата. Персональный чат это или групповой - неважно. Отправляешь сообщение по ID и сервер уже сам разберется нужно его отправить одному собеседнику или рассылать группе.

И вот тут есть небольшая проблема. Если пользователь отправляет сообщение новому пользователю, то происходит следующее: серверу сообщается информация о том какому именно собеседнику (receiverID) нужно доставить сообщение. В результате сервер создает персональный чат (если он не был создан) и отправляет ID чата. После этого отправитель уже шлет сообщение не по receiverID, а по chatID.
Проблема в чем? В том, что chatID не известен до отправки сообщения. После получения ответа от сервера, отправителю нужно найти отправленное сообщение, создать для него чат и закрепить отправленное сообщение за чатом.

На словах, вроде, все понятно. У меня сейчас этот момент реализован совсем плохо. Если не исправить, то будет еще хуже и в итоге сам себе создам ад при жизни.
В общем, исправлю, не любитель заниматься полнейшей ерундой 😂 На данный момент этим и занимаюсь.

После добавлю код для обновления статуса сообщения:
- доставлено до получателя ☑️☑️
- получатель прочел ✅✅

На данный момент работает отображение статуса отправки () и доставки до сервера (☑️) .

Далее планирую заняться получением и визуализацией принятых сообщений. У полученных сообщений нет статусов, с ними немного проще: нужно просто отобразить их и у меня вроде все для этого уже готово (кроме приема, сохранения в БД и обновления частей интерфейса).

Есть одна давняя и неприятная новость: уведомления о доставке не будут работать без сервисов Apple и Google. Так что чтобы мобильное приложение присылало уведомления, нужно будет плОтить (для Apple около 10к руб в год, для GooglePlay вроде $25 за регистрацию аккаунта, а дальше еще не смотрел).

Голосовые/видео звонки - до них пока не добрался 😅

Сейчас план-минимум - это сделать сервис обмена сообщениями и файлами.

--
По вечерам разрабатываю сервис для общения на Go & Flutter. Кому интересно, можете подписаться куда-нибудь на меня, попробуете его в числе первых.
Постепенно буду продолжать делиться успехами разработки сервиса.

Показать полностью 4
6

Я придумал, как заставить текстовые аккордники звучать

Играю на электрухе. Там у нас всё серьёзно: табы, Guitar Pro, бэкинг-треки — открыл, посмотрел, где пальцы, играешь.

Но когда берёшь акустику — хочешь просто спеть песню. Открываешь аккордник: Am C Dm E. И тишина. Нет ни темпа, ни ритма, ни понимания, как это должно звучать в целом.

Лезешь на YouTube. Смотришь разбор — автор играет красиво, всё понятно. Но как только закрываешь видео, перед глазами снова только текст. Хочешь повторить — снова открывать, перематывать, ловить нужный момент. Хочешь сыграть медленнее — автор не замедлится. Хочешь просто взять и сыграть сам — а аккордник всё так же молчит.

Я подумал: а почему бы не сделать так, чтобы сам аккордник показывал, как играть? Чтобы открыл песню — и сразу видно: вот аккорд, вот бой, вот темп, вот когда переходить. Без перемоток, в своём темпе.

Что я придумал?

Как выглядит создание разбора

Как выглядит создание разбора

Суть простая: берёшь любой аккордник — хоть с Ultimate Guitar, хоть из своих заметок, хоть из песенника — копируешь текст с аккордами и вставляешь в редактор на strumly.fun через Ctrl+V. Сервис сам разбивает песню на строки, расставляет аккорды над словами, выделяет секции. Даже если у тебя формат [Am] внутри строки — он поймёт и поставит аккорд ровно над тем слогом, где нужно.

Дальше ты расставляешь секции: куплет, припев, бридж, проигрыш — что угодно. У каждой секции свой ритм. Нажимаешь на кнопку ритма — и выбираешь бой из библиотеки: шестёрка, восьмёрка, кантри, регги, несколько переборов. Каждый бой можно послушать перед тем, как применить. Не подошёл готовый — заходишь в редактор боя и рисуешь свой: кликаешь по струнам, выбираешь удары вниз-вверх, глушение, паузы.

Задаёшь темп, размер, сложность. Если песня в неудобной тональности — ставишь каподастр, и аппликатуры сразу перестраиваются под него.

Потом жмёшь «Предпросмотр» — и перед тобой уже не аккордник, а полноценный плеер. Он идёт по строкам, подсвечивает текущую, показывает аппликатуру активного аккорда, щёлкает ритм. Включаешь метроном — и играешь вместе. Хочешь медленнее — крутишь темп. Хочешь отработать один куплет по кругу — ставишь зацикливание секции.

Всё проверил, всё звучит — публикуешь. Разбор уходит в каталог, другие гитаристы находят его поиском, добавляют в избранное, учатся по нему.

Самое прикольное начинается, когда в каталоге появляются чужие песни. Сейчас там уже несколько вещей, которые я сам закинул — «Группа крови», «Районы-Кварталы» и ещё десяток треков. Но мне гораздо интереснее увидеть, что вы туда загрузите.

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

Если песня сложная — смотришь на сложность, которую автор указал. Новичок ищет «легко» — и сразу находит разборы с простыми аккордами и базовыми боями. Хочешь что-то посерьёзнее — фильтруешь по «средне» или «сложно».

А если ты сам разобрал песню и хочешь поделиться — создаёшь разбор, публикуешь, он проходит проверку и появляется в каталоге. Другие гитаристы находят его, играют, учатся. Твой разбор становится тем самым подсказкой, которой тебе когда-то не хватало.

Карточки исполнителей

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

Это удобно, когда хочешь выучить несколько песен одного исполнителя подряд. Зашёл на страницу Цоя — и перед тобой «Кукушка», «Перемен», «Звезда по имени Солнце». Всё в одном месте, в одном формате, с одним и тем же подходом к ритму. Не нужно скакать по разным сайтам и привыкать к чужим стилям оформления.

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

Попробуйте сами

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

strumly.fun - сам сервис

Показать полностью 2 1

VK Desktop — Версия 1.2.0

Всем привет!

После версии 1.1.0 и пару патчей я cгорел и забросил это дело и спустя 5 месяцев вспомнил про проект и решил обновить - просто по приколу, захотелось так :)

Выпустил VK Desktop 1.2.0. В этой версии я переработал верхнюю панель программы, обновил систему установки обновлений и привёл в порядок техническую часть проекта.

Исходный код:

https://github.com/yamixdev/vk-desktop

Скачать последнюю версию:

https://github.com/yamixdev/vk-desktop/releases/latest

Вот сам клиент, йоу

Вот сам клиент, йоу

Discord RPC в действии (Он кривой, позже поправлю)

Discord RPC в действии (Он кривой, позже поправлю)

Что же нового в клиенте?

Новая верхняя панель (Вдохновился Яндекс Браузером)

Стандартная рамка Electron заменена собственной (кривой) компактной панелью.

В ней находятся:

  • меню VK Desktop;

  • кнопка возврата на предыдущую страницу;

  • название и версия программы;

  • индикатор доступного обновления;

  • кнопки сворачивания, разворачивания и закрытия окна.

Панель подстраивается под светлую и тёмную тему ВКонтакте. Также исправлено её поведение в полноэкранном режиме и при разворачивании окна.

Обновлённая система обновлений

Состояние обновления теперь отображается прямо в верхней панели.

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

Загрузку можно отменить, а после её завершения установить обновление с автоматическим перезапуском VK Desktop.

При нажатии на номер версии открывается раздел «Что нового». В нём можно посмотреть:

  • описание последнего обновления;

  • номер версии;

  • дату публикации;

  • ссылку на страницу релиза в GitHub.

Если при обновлении с версии 1.1.3 появляется ошибка 429, скачайте новый установщик вручную по ссылке выше. Ошибка связана с временным ограничением запросов со стороны GitHub.

Горячие клавиши

Добавлены стандартные сочетания для управления страницей:

  • Ctrl + + для увеличения масштаба;

  • Ctrl + - для уменьшения масштаба;

  • Ctrl + 0 для сброса масштаба;

  • Ctrl + R для перезагрузки страницы;

  • Ctrl + Shift + R для перезагрузки без кэша.

Обновление VK Next

Встроенный VK Next обновлён с версии 14.7.2 до 14.14.0.

Также обновлены его файлы, разрешения и система проверки целостности.

Исправления

  • Полоса прокрутки больше не заходит под верхнюю панель.

  • Исправлена отмена скачивания обновления.

  • Улучшена синхронизация кнопок с текущим состоянием окна.

  • Исправлено отображение прогресса обновления.

  • Улучшена обработка ошибок при проверке и скачивании новой версии.

Техническая часть

В версии 1.2.0 была серьёзно переработана внутренняя структура приложения.

Что именно изменилось:

  • Полностью переписана логика верхней панели и управления окном.

  • Добавлены отдельные IPC-команды для кнопки «Назад», сворачивания, разворачивания, закрытия окна и управления обновлениями.

  • Добавлена проверка источника IPC-запросов, чтобы команды принимались только от внутренних страниц приложения.

  • Состояние окна теперь синхронизируется с интерфейсом: приложение отслеживает полноэкранный режим, возможность вернуться назад и текущее состояние окна.

  • Логика горячих клавиш вынесена в отдельный модуль.

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

  • Для реальной отмены загрузки обновлений добавлен CancellationToken.

  • Старое отдельное окно прогресса удалено. Процент и скорость загрузки теперь передаются прямо в верхнюю панель.

  • Добавлена загрузка описания последнего релиза с GitHub для раздела «Что нового».

  • Ответ GitHub кэшируется на пять минут, чтобы не отправлять одинаковые запросы при каждом открытии окна.

  • Добавлена проверка и ограничение ссылок, текста и данных, полученных из описания релиза.

  • После установки обновления приложение автоматически запускается повторно.

  • Обновлена проверка целостности встроенного VK Next. Алгоритм переведён на новую версию с нормализацией переносов строк CRLF и LF, чтобы результат проверки не зависел от операционной системы.

  • Для VK Next сокращён список разрешений и доступных веб-ресурсов.

  • Добавлены тесты для верхней панели, горячих клавиш, системы обновлений, IPC-команд и проверки целостности VK Next.

Также была полностью переработана автоматизация проекта через GitHub Actions:

  • добавлена отдельная проверка линтера и тестов;

  • добавлена автоматическая сборка Windows x64;

  • добавлена проверка соответствия версии приложения Git-тегу;

  • добавлена проверка настроек безопасности Electron;

  • настроено автоматическое создание черновика GitHub Release;

  • установщик, файл .blockmap и latest.yml автоматически прикрепляются к релизу;

  • старый workflow для Linux AppImage удалён.

Проект и GitHub Actions переведены на Node.js 26 (Частично). Также обновлены зависимости сборки, документация, лицензия, правила участия в разработке и описание структуры проекта.

На этом работа над VK Desktop не заканчивается. Если встретите ошибку или заметите странное поведение, напишите об этом в комментариях или создайте Issue в GitHub.

Спасибо всем, кто вообще пользуется программой, сообщает о проблемах и предлагает идеи.

Телеграм-канал автора:

https://t.me/ilushadevz

В целом это всё, можете закинуть меня помидорами, клоунами и написать что потратил время впустую :)

Спасибо за внимание!

Показать полностью 2
6

Разработка TypeScript-библиотеки для построения реактивных графов распространения и обработки данных

Разработка TypeScript-библиотеки для построения реактивных графов распространения и обработки данных

Предыстория

Все началось с рабочей задачи по реализации весьма специфичной web-панели мониторинга и управления различным оборудованием, в которой нужно было получать данные и отправлять команды по разнообразным сценариям (периодический опрос, подписка на websocket-события, https-запросы и т.д.), а также выводить состояние и графики в реальном времени, динамически комбинируя различные источники данных в разных виджетах.

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

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

В результате получившаяся модель продемонстрировала предсказуемое поведение и низкую связность компонентов, а кодовая база сократилась на ~30% и приобрела более декларативный вид. Убедившись в эффективности решения, мы решили оформить его в виде отдельной библиотеки с открытым исходным кодом — Transferum.

И что, получилась просто еще одна реактивная библиотека?

Не совсем. Классические FRP-библиотеки (RxJS, Bacon, Most) построены вокруг единственного примитива (Observable). Transferum же основан на композиции различных типов узлов с явно определенным поведением.

Каждый узел в графе потоков распространения данных явно декларирует свои способности: может ли он принимать данные через push, отдавать через pull, распространять полученный сигнал подписчикам, опрашивать источник, фильтровать, блокировать поток и т.д.

Объявленные узлом возможности являются одновременно флагами для использования в runtime и compile-time гарантиями наличия соответствующих методов, определяющих его поведение.

Ключевая идея: поведение системы описывается как композиция независимых возможностей, которые одновременно определяют тип, реализацию и правила взаимодействия.

Transferum предоставляет четыре слоя абстракции:

  1. Трансферы — узлы графа (каналы, поллеры, мапперы, буферы, разветвители и концентраторы, реализации debounce, throttle, switchMap и т.д.).

  2. Мосты — ребра графа — управляемые вентили между узлами с динамической маршрутизацией и гейтингом.

  3. Операторы — stateless-трансформаторы и фильтры данных (используются трансферами, отвечающими за конвертацию данных).

  4. Билдеры — fluent-конструкторы композитных трансферов из цепочек трансферов-примитивов.

Концептуальная и архитектурная основа — capability flags system. Каждый трансфер реализует CommunicationContractInterface — набор булевых флагов, определяющих его возможности.

Флаги isPushable, isPullable, isSubscribable, isGate и другие — это не просто свойства объекта. Это метаданные, которые:

  • Определяют TypeScript-интерфейс трансфера на этапе компиляции.

  • Управляют стратегией связывания с другими трансферами в рантайме (с помощью функции linkTransfers()).

  • Обеспечивают совместимость в билдерах без приведений типов.

Один набор флагов — три потребителя. Это единый источник истины для всей системы.

Когда флаг равен true, соответствующий метод входит в TypeScript-интерфейс трансфера. Это позволяет предоставлять трансфер пользователю вот так:

Transfer<T, [Pushable, Pullable, Subscribable, Triggerable]>
// гомогенный трансфер: T -> [ Transfer ] -> T

Или вот так:

Transfer<TInput, TOutput, [Pushable, Pullable, Subscribable, Triggerable]>
// гетерогенный трансфер: TInput -> [ Transfer ] -> TOutput

Именно в таком формате типов фабрики в библиотеке возвращают трансферы. Эта «магия» работает в compile-time благодаря несколько замысловатой системе вычислимых типов.

Архитектурные инварианты

1. Трансферы не знают своих соседей
Трансфер определяет своё поведение (push, pull, subscribe и др.), но никогда не ссылается и не проверяет класс другого трансфера. Он не знает, что является upstream или downstream — лишь выполняет свой контракт. Пользователь может создать свой трансфер, объявить и реализовать его возможности — и он органично и бесшовно впишется в экосистему.

2. Мосты не знают конкретных реализаций
Мост инспектирует capability flags, а не имена классов. Нет цепочки instanceof, нет переключения по имени класса. Любой output-трансфер может быть соединен с любым input-трансфером — при условии совместимости их флагов, о чем мы поговорим чуть ниже. Это применимо и к тем узлам, которые еще не существуют и будут созданы пользователем.

3. Значение undefined никогда не распространяется
В Transferum undefined означает «нет данных», а не «пустое значение». Оно подавляется на уровне внутренней реализации менеджера подписок — подписчики никогда не уведомляются с undefined. При этом для явных маркеров пустых значений можно использовать null. Мы сознательно пошли на этот компромисс, чтобы избежать runtime-оверхеда и сохранить нативную скорость работы на плотных потоках данных.

Связывание трансферов

Функция linkTransfers(lhs, rhs) соединяет output-трансфер (lhs) с input-трансфером (rhs) с автоматическим выбором стратегии связывания на основе возможностей этих трансферов:

  • isSubscribable → isPushable (реактивная подписка);

  • isPullable → isPollingProxy (активный опрос);

  • isSubscribable → isAsyncPushable (реактивная подписка + асинхронный push);

  • isAsyncPullable → isAsyncPollingProxy (активный асинхронный опрос асинхронного pull-источника);

  • isPullable → isAsyncPollingProxy (активный асинхронный опрос синхронного pull-источника).

Protocol-oriented design: механизм не спрашивает «какой это класс?» — он выясняет, какие у него есть возможности. Любая пара трансферов с совместимыми возможностями является linkable. Добавление нового класса трансфера требует только объявления его флагов и реализации соответствующих методов — как связать его с другим трансфером, связующий алгоритм разберется сам.

Sync и async в одной экосистеме

Синхронные и асинхронные трансферы сосуществуют и могут быть связаны между собой. linkTransfers() предпочитает sync-связывание, когда это возможно, а async-стратегии применяет только когда sync неприменим. Нет отдельного «асинхронного мира».

Поддержка backpressure

Ряд асинхронных трансферов (AsyncSinkTransfer, AsyncWriteTransfer, AsyncConvertTransfer, AsyncConditionTransfer) поддерживают необязательные поля в конфигурации: maxConcurrency, bufferSize и onBufferOverflow — для ограничения параллельных async-операций, очереди избыточных данных и graceful-обработки переполнения. По умолчанию — неограниченная обработка, без буферизации.

Локальная обработка ошибок

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

А теперь — к примерам использования

  1. Вот так можно просто и декларативно описать опрос и агрегирование данных из нескольких источников.

  2. А вот как можно можно организовать роутинг в игровой механике.

  3. А вот пример сложного цепочечного трансфера, реализующего логику автоматизации обработки событий и принятия решения в торговле на бирже.

Когда имеет смысл попробовать Transferum

Библиотека подойдет для:

  • TypeScript-first проектов — благодаря максимально строгой типизации и compile-time вычислению доступных методов любого трансфера на основе объявленных у него флагов возможностей.

  • Работы с pull-based источниками данных — polling API, датчиков, хранилищ с PollingProxy.

  • Смешанных sync/async пайплайнов — в единой модели без ручного преобразования.

  • Явного flow control — gates, bridges, selectors для runtime-маршрутизации.

  • Game development / IoT — frame-aligned tickers, idle polling, sensor aggregation.

  • Устойчивой обработки ошибок — локальная, non-fatal обработка: одна стадия не убивает пайплайн при условии переданного в конфиге обработчика ошибок, ничего не подавляется молча.

Результаты и планы

  • Библиотека уже используется в двух наших внутренних проектах и показывает свою эффективность. Код доступен на GitHub под лицензией MIT, библиотека не имеет внешних зависимостей и поставляется с подробной документацией (README + API Reference).

  • В одном из проектов граф состоит из ~80 узлов и стабильно обрабатывает несколько сотен событий в секунду без деградации. На основе этих данных в том числе рендерится 3D-сцена в Babylon.js со стабильным фреймрейтом ~60 FPS без микрофризов.

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

  • В дальнейшем планируем реализовать хуки и утилиты для более удобного и нативного использования Transferum с Vue и React. Если они окажутся в достаточной мере переиспользуемыми, оформим в отдельные пакеты-адаптеры.

Буду рад, если вы заглянете в репозиторий, попробуете библиотеку в деле и поделитесь замечаниями — обратная связь поможет сделать Transferum лучше.

P. S. Если вы сталкивались с похожими задачами и решили их как-то иначе — буду рад прочитать о вашем опыте в комментариях.

Показать полностью
10

Google Gemini 2.5 Flash Image: 500 картинок в день бесплатно

Наткнулся на интересную штуку — Google выкатил Gemini 2.5 Flash Image (Nano Banana) и даёт через API до 500 картинок в день бесплатно. Без привязки карты. Проверил лично — работает.

4

Я сделал бота для скачивания видео. Прогнал его против самых популярных аналогов — показываю, где проиграл

Я вбил в поиск «телеграм бот скачать видео» и открыл первые подборки, которые выдал Яндекс. iGuides, vc.ru, Партнёркин, каталоги ботов. Выписал тех, кто кочует из списка в список: @SaveAsBot, @instasavegram, @creoscan, @DNVideoBot. И прогнал их против своего.

Соперников я не выбирал. Их выбрал поиск — вы наткнётесь ровно на этих, если полезете искать сами.

Да, я автор @vfixbot. Дальше сравнение, где мой бот в основном выигрывает, и было бы наивно ждать от меня другого.

Поэтому так. Сначала — чего мой не умеет, а чужие умеют. Потом расскажу, как мерил, и что из этого вышло.

Чего мой бот не умеет

RuTube. Нет и не планируется. У @DNVideoBot есть.

OK.ru. Тоже нет — и это второй пункт подряд, где @DNVideoBot меня обходит.

Файлы больше 20 МБ бесплатно. У @SaveAsBot ограничения по размеру нет вообще. Рилсы и шортсы влезают с запасом: 99% из них короче минуты и весят единицы мегабайт. А вот длинный YouTube не влезет, и тут спасает только платная версия.

Всё. Дальше о том, где мой лучше.

Методика

Пять ботов: @vfixbot, @SaveAsBot, @instasavegram, @creoscan, @DNVideoBot.

Семь ссылок Instagram: пять рилсов на 7, 9, 11, 47 и 86 секунд, ещё один короткий рилс и фото-пост. Одна сеть, замеры подряд, секундомер от отправки ссылки до момента, когда файл доступен.

Все ролики свежие. Опубликованы незадолго до теста, ни один до замеров ни через одного бота не проходил — и это не придирка, а условие, без которого мерить нечего.

Дело в двух вещах, которые превращают такой тест в фикцию:

Кэш-хит (бот уже качал это видео раньше и держит готовый файл у себя). Тогда он не идёт в Instagram вообще, а отдаёт копию из своего хранилища — за десятые доли секунды. В таблице выглядит великолепно. К скорости отношения не имеет.

Дедуп, он же дедупликация (Telegram узнаёт файл, который у него уже был, и переиспользует его вместо новой загрузки). Эффект тот же: мгновенный ответ, нулевая информативность.

Возьми ролик, который уже кто-то качал, — и получишь не бенчмарк, а замер чужой памяти.

Скорость: разницы нет

Если ждали, что здесь кто-то кого-то порвёт — не порвёт.

Все уложились в одну-три секунды. Разброс между ботами оказался меньше, чем разброс между двумя прогонами одного и того же бота, то есть меряешь тут не боты, а дрожание сети. Причина скучная: файл все берут с одного и того же CDN Instagram, и скорость определяет ваш канал.

Числа приводить не буду — им грош цена. Разница в десятые доли секунды на одном прогоне не значит ничего, и любой, кто такие числа вам показывает, показывает погрешность измерения. Когда очередная качалка обещает «молниеносную загрузку» — вот примерно это вам и продают.

Разница между ботами вылезла в другом месте.

Надёжность: 7 против 4

А вот тут разошлось.

Отработало ссылок из семи:

@vfixbot — 7
@SaveAsBot — 4
@instasavegram — 4
@creoscan — 1
@DNVideoBot — 0

Три ссылки из семи — два рилса и фото-карусель — @SaveAsBot и @instasavegram не открыли. Не медленно. Никак.

Ошибки почти одинаковые:

instasavegram: «Request failed. Make sure that account is not private»
SaveAsBot: «Не удалось получить информацию о публикации»

Аккаунт не приватный. Ролик открывается в браузере у кого угодно.

Почему так происходит

Instagram закрывает контент от неавторизованного доступа, и с каждым годом плотнее. Хотите посмотреть? Войдите. Дело не в каком-то особенном видео. Платформа взвешивает репутацию вашего IP и наличие сессии, смотрит, что за контент вы просите, — и решает, отдать файл или потребовать логин.

Есть открытый проект InstaFix. Задуман он не для скачивания вовсе: его дело — чинить превью Instagram в Discord и Telegram, чтобы ссылка в чате разворачивалась в картинку, а не в серый прямоугольник. Но попутно он вытаскивает медиафайл по ссылке. Бесплатно и без авторизации, а подключается за вечер. Форков на GitHub россыпь.

Последний коммит в основном репозитории — 1 февраля 2025 года. Полтора года никто не трогал код, который каждый день воюет с платформой, переписывающей защиту раз в квартал.

У анонимного подхода есть потолок: примерно 70% ссылок. Это моё наблюдение за год, не лабораторный замер. Упирается он не в кривой код: оставшиеся тридцать процентов Instagram анониму не отдаёт в принципе, сколько к нему ни стучись.

Вот вам и 4 из 7.

Ходят ли боты из моего теста именно этим кодом, я не знаю: чужие репозитории мне не показывали. Но ошибки у них одинаковые, качество одинаковое, и падают они ровно там, где падает аноним.

@vfixbot работает иначе: он покрывает все видео. Способ не один: каждый по отдельности рано или поздно ломается, поэтому их несколько и я их обновляю. Как именно — не пишу, конкуренты читают Пикабу не хуже вас. Возни там много, желающих мало — отсюда и секунда на лёгком ролике у остальных, и ошибка на всём прочем.

Кто что вообще поддерживает

Только у меня: ВКонтакте, Twitter/X, Reddit, Threads, Двач, обычные посты.

Есть у всех или почти у всех: Instagram (все пятеро, кроме DNVideoBot), TikTok (все, кроме instasavegram), Pinterest (SaveAsBot, creoscan).

YouTube: есть у меня, creoscan, DNVideoBot. У SaveAsBot и instasavegram — нет.

Только у DNVideoBot: RuTube, OK.ru.

Сторис и актуальное: у меня — по ссылке на профиль; у SaveAsBot — только по прямой.

Девять источников против трёх у ближайшего. YouTube @SaveAsBot не берёт — на ссылку отвечает списком того, что умеет, и YouTube в нём нет.

Два бота, до которых дело толком не дошло

@creoscan — один ролик в сутки бесплатно. Первый тест прошёл, на втором лимит кончился, и creoscan выбыл. Умеет Instagram, YouTube, TikTok, Pinterest.

@DNVideoBot — работает, но живёт очередью. Первая же ссылка встала на 30-ю позицию; за несколько часов очередь до меня не дошла, видео я так и не получил. Пока ждёшь, бот присылает видео-заглушку. Судя по подборкам, у кого-то он работает — мне за время теста не досталось ни одного ролика. Зато только он умеет RuTube и OK.ru.

Что есть только у меня

Inline-режим. Бот пришлёт видео в любой чат, без добавления в него. Пишете @vfixbot со ссылкой прямо в чат и видео уходит собеседнику готовым файлом. Не ссылкой, которую он не откроет. Ни у одного из четырёх такого нет.

Редактор. Мини-приложение с таймлайном: обрезать с точностью до кадра, склеить несколько фрагментов, вытащить звук в MP3, сделать гифку, повернуть снятое «на боку», ускорить или замедлить, выбрать кадр для обложки, отправить файлом без сжатия. У остальных четверых — ничего похожего.

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

Обычные посты. Не рилсы, а обычные публикации: их не берёт никто.

Для внимательных: команда /promo pikabu даст месяц бесплатного премиум

Для внимательных: команда /promo pikabu даст месяц бесплатного премиум

Мой бот — @vfixbot. Без Telegram то же самое умеет clipsave.pro.

Instagram и Threads принадлежат компании Meta, которая признана в России экстремистской организацией, её деятельность запрещена на территории РФ.

Показать полностью 1

Как родилась идея приложения для уменьшения залипания в телефон: от гугл табличек до создания апки для iOS без какого-либо опыта

Серия Мой путь в инди-разработке

Примерно идеально к кризису среднего возраста я прошел несколько болезненных перезагрузок. Старое убеждение «Я особенный, и у меня всё получится» ушло в прошлое. Я учился в парижской экспериментальной айти школе 42, прошел там стажировку в айти стартапе и понял, что вместо наемной работы хочу снова попробовать бизнес, но не связанный с производством физических продуктов (вьетнамские флешбеки бренда одежды до сих пор являются в кошмарах). Какой именно бизнес я долго не понимал: моего скудного опыта в бэкенде не хватило бы для разработки мобильного приложения, но ллм заполнили этот пробел.

Каким человеком я пришел к этому этапу? Мой трек превратил меня сначала из скромного и неуверенного нерда в гипер-уверенного альфа-фотографа с бесплатными деньгами, и подписчиками по всему миру, а затем в довольно невротичного и постоянно саморефликсирующего ипохондрика: одной из моих базовых черт сейчас является перманентный анализ того, какие действия и решения в жизни привели к этому или тому, какие поведенческие паттерны следует культивировать, является ли мое текущее поведение рациональным или импульсивным, как я могу позитивно манипулировать своим состоянием и предсказывать свое поведение, настраивая среду заранее и закладывая триггеры-стартеры нужных поведенческих петель для себя будущего, и как я могу предвидеть, а то и избежать свои малоэнергетичные или депрессивные состояния. Я обожаю вести Гугл таблицы с кучей метрик и так однажды я пришел к идее своего первого приложения.

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

Так вот, когда я выставил цифры заряда на свое обозрение, я стал осознавать те огромные провалы в батарее, которые я насиживаю такими сессиями скроллинга. Тут же возникла идея построить график на день, а затем и на 2 с моим реальным расходом батареи. Несколько недель или месяцев я забивал себе Гугл табличку и любовался своим графиком: довольно быстро и интуитивно пришла идея не заряжать телефон по 2 дня (на столько батареи хватало с лихвой при рассудительном пользовании) и это мне очень нравилось. Мое экранное время поползло вниз  и физически не могло превысить 3,5 часов в день - иначе я бы не доживал до вечера второго дня на одном заряде (для сравнения до этого я насиживал по 6-7 часов). Качество тоже поменялось - 3 часа экранного времени скролинга коротких видео жрет батареи намного больше чем 3 часа чтения сообщений, проверки сайтов итд. Более того, пересечение референсной кривой давало мне сигнал о злоупотреблении телефоном в моменте.

график из гугл табличики

график из гугл табличики

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

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

Я снова загорелся. Приятель буквально за день накидал простенький виджет с графиком, отображающим расход заряда за 42 часа. Тут же выяснилось, что на 12м айфоне приятеля нет никаких шансов прожить 2 дня без заряда - было решено добавить 18ч челенж (1 день с утра до ночи). График был ломанным и квантовался кратно 5%, но я был в восторге - это ведь был результат работы за день. Параллельно я подался на проект в школе, описав проблему и показав планы и наработки.

результат 1 дня работы приятеля - прототип виджета

результат 1 дня работы приятеля - прототип виджета

Меня быстро остудило - спустя 2 недели ожидания школа ответила, что это не заявка, а детские фантазии, и что нужно для начала хоть как-то валидировать идею о том, что людям важна эта проблема, и что текущие решения ее не закрывают. Параллельно приятель, который начал за здравие, перестал вообще что-либо делать по коду и объявил мне о том что он приверженец философии чила, дедлайны не признает, а кодить хочет по настроению. Глядя на 0 коммитов за неделю и тот же самый график, что и в первый день, спустя месяц я понял, что как бы тяжело ни было мне все изучать с нуля и делать самому, суммарный риск от продолжения такого сотрудничества при моем далеко не чиловом отношении к проекту будет абсолютно точно означать конфликт. Мы решили разойтись. Приятель без обидняков скинул мне 600 строк кода, а я стал думать, где мне взять мак в Париже не по цене почки. Параллельно я спамил везде опросником для первичной валидации моей идеи.

В какой-то момент я пришел к решению покупать б/ушный мак мини в Париже, но так как свои мысли, происшествия и скуление/бомбеж я часто транслировал в своем микро-телеграм канале, оставшимся со времен фото-карьеры, я выложил возмущенный пост о том, что в Москве новый мини м4 стоит дешевле чем в Париже б/у м2. В комментариях под этим постом один из подписчиков сообщил мне, что готов отправить свой личный макании м4 для поддержки разработки моего приложения. Я сначала даже не поверил. Дальше был месяц поиска путей отправки. К этому времени в опросе приняло участие 130 человек и я смог показать актуальность проблемы для половины респондентов. Почти все указывали на неспособность существующих решений решить их вопрос с бесконтрольным скроллингом по разным причинам. С результатами этого опроса мне дали добро на начало школьного проекта.

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

Их я опишу в следущий раз, но спойлер: прила уже на тестфлайте и ее можно опробовать официально: https://testflight.apple.com/join/atkgRfac

Показать полностью 2
1

Как я за месяц сделал бесплатный автоматический конструктор иерархических моделей ORGFORMAT

Приветствую, коллеги пикабушники!

Поделюсь опытом создания с нуля под ключ приложения и всего что вокруг него - от концепции и дизайна до продвижения.

Как всегда все началось с личной проблемы - по долгу работы часто пересобираю оргмодели (органиграммы) и хоть и делаю изначально структуру в екселе, но защищать приходиться визуально в диаграммах. Защита перед учредителями штука импровизированная и динамичная, так как они постоянно просят что-то передвинуть, пересчитать бюджет ФОТ и при этом наглядно для них на большом экране.

Собирать такое в visio/miro/figma нереально по ряду причин.

Поэтому, на досуге я принял решение собрать свое приложение, которое должно обладать следующим фичами и требованиями:

  • Запускаться и работать с любого браузера без регистраций;

  • Не передавать информацию на сервера а обрабатывать модель в кэше браузера;

  • Быть бесплатным и публичным для меня и любых желающих;

  • строить структуру автоматически, а не рисовать каждый блок вручную;

  • перетаскивать отдельные карточки и целые ветки (Drag&Drop);

  • смотреть одну модель как вертикальную иерархию или горизонтальный flow/mindmap;

  • открывать подробные карточки блоков, но базово показывать компактно;

  • подсвечивать нужную ветку во время обсуждения, при наведении мышкой;

  • добавлять теги и другие признаки, как аналог признаков и мини базы данных;

  • считать один числовой показатель по всей структуре (например, бюджет);

  • выгружать результат в SVG, таблицу CSV, интерактивный HTML (для пересылки и демонстраций) или машиночитаемый файл ORGF.

  • Иметь машиночитаемый и открытый формат данных, что бы можно было быстро отдать своей ИИ для проверки или изменений данных.

  • И вообще бала важна задача скажем так AI-ready, что бы я мог выгружать из своей ИИ наработанную модель или наоборот загружать в нее для проверки, трансформации и оптимизации или объединения нескольких моделей в более крупную структуру (холдинга). Без ручного труда и склейки/верстки и т.д.

По результату фичей получилось намного больше! так же ориентация использования программы расширилась вплоть до построения генеалогических деревьев, атласов животных и прочих иерархических справочников и банально структуры проектов или файловых папок (тут отлично зашел горизонтальный режим).

Теперь по процессу реализации проекта и бюджету, как делал я и где-то советую вам:

  1. Создать проект в ИИ (пару лет живу в ChatGPT Plus - 20$/мес, очень выгодно и агенты не нужны). Обязательно выбрать тип проекта с локальной памятью.

  2. Обсудить концепцию, позиционирование и архитектуру (верхнеуровнево) с первым субчатом и дать ему имя main.

  3. Создать роль (субчаты) маркетинга - market. Упакуйте с ним идею вашего продукта. Ему же дайте задачу создания итогового бренда, дизайна фирменного стиля или вынесите в отдельный субчат design.

  4. Создайте роль (субчат) разработчика - tech1, учтите это ваш постоянный субчат и он будет заканчиваться где-то на 30-50 патчах (chatgpt будет просто блокировать чат). Поэтому их будет много tech_n, это нормально

  5. Создайте папку проекта на своем диске (желательно без длинных и русских имен). Обязательные папки Git (ваш основной код проекта с синхронизацией). Папки патчей, архивов, дизайна, администрирования, текстовых черновиков и прочих вводных рекомендую вынести выше (не в Git). Весь код, хэндоффы, инструкции и библиотеки (md) - в Git. ИИ вам подскажет как исключить из синхронизации в Git технические файлы вашего сервера.

  6. Установите VSC (Visual Studio Code) - бесплатное приложение для программирования. Если вы не программист как и я, не пугайтесь - скажите своему ИИ (tech), что вы только руки и пусть он все делает командами и через загружаемые/выгружаемые файлы.

  7. Установите GitHub Desktop - этот бесплатный сервис позволит вам приватно (или публично) хранить ваш исходный код и что более важно в работе - откатывать неудачные патчи (коммиты). Привяжите его к папке Git.

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

    1. Любой новый патч начинаете со свежего архива исходного кода (baseline). Запрещаете ему додумывать и вспоминать код, иначе будет много ошибок. Соответственно он вам должен сам давать команду VSC для архивирования папки проекта в ZIP. Просто возвращаете ему этот архив. Имя архива имеет префикс ИИ (tech1) и тему (обычно суть патча).

    2. На загруженный архив он вам выгружает патч в виде cjs-файла и команды его запуска. Запрещаете давать вам код в чат - только через патчи (файлы). Если при исполнении патча вылезают ошибки копируете их в ИИ, он делает микро-патчи. Ошибки очень редки, если соблюден 8.1.

    3. Тестируете изменения и пишете что "ок/чек/хорошо". На это ИИ вам должен выдать имя и описание коммита (командами) - вставляете это в Github desktop и патч успешно исторически закрывается.

    4. Когда ваш чат начинает ощутимо тормозить или вы понимаете, что уже много патчей 30+, то делайте пакет передачи дел (handoff) в zip архиве и в формате MD-файлов. Ваш tech1 сам все соберет и упакует для tech2 (инициируете им новый субчат). Так цикл знаний и разработки не прервется неожиданно. Это тоже коммитите.

  9. Тестируете проект на своем локальном браузере (localhost). Все еще бесплатно.

  10. Когда проект принимает продуктовые черты и вы хотите протестировать его на своих знакомых (ваша фанбаза) - возвращаемся к маркетологу и решаем с ним какой домен приобретать. Покупаем хостинг и домен. Мне подошел самый дешевый, так как никакой нагрузки на сервер он не генерит. Хостинг - 240 р/мес., а домен в Ru зоне обычно бесплатно при годовом хостинге.

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

  12. Промо-сайт будет отдельным субпроектом и сую-продуктом. Заведите для него отдельный субчат ИИ (web). Примеры возьмите с ваших коллег на реддите, обычно ветка /r/SideProject. Я итак же выложил сразу демо-кейсы в разных областях. Что бы слету можно было в Студии открыть модель или скачать к себе.

  13. Ваши знакомые дают вам обратную связь для финальных правок вашего релиза.

  14. И тут начинается боль с продвижением вашего продукта. У меня он мультиязычный, поэтому проблема найти локальные площадки для размещения статей о своем продукте и так что бы их не банили и свободно размещали.

    1. Если разместите грамотно статьи, то уже через два дня ИИ поисковики будет знать о вашем продукте. Habr/VC/Reddit и т.д.

    2. Но это лишь начало, если вы делаете коммерческий продукт, то продвижение может у вас начать отнимать до 90% времени. Соц.сети, статьи, ролики, общение и главное генерация правильного интересного контента вокруг вашего продукта. Это больно.

  15. просыпаетесь популярным, но скорее всего нет. Тут главное не переживать, ведь вы делали проект в первую очередь для себя и за свои деньги. И никакому ничего не должны - вы молодец!

  16. Итого затраты - до 7 тысяч рублей. С ИИ-агентами было бы затрат на два порядка больше и меньше понимания, что происходит. Примерно 600 патчей (30 в день). 30 дней реализации.

Пока я разрабатывал концепцию web-приложения, понял, что не менее важно, а возможно даже более важно сделать сам формат (файл) в котором хранится модель. По сути это стало еще одним субпроектом/субпродуктом. Сделал его на базе логики YAML - это убивает всех зайцев. Назвал ORGF, выложил как бесплатный открытый формат на публичный github.

Итоговое промо видео (пример на английском, так как делал для reddit)

Ну и ссылки в конце:

Не забывайте переключать в темную тему и горизонтальный режим - кайф.

Буду рад обратной связи! ну или просто лайкам, в любом случае спасибо, что дочитали этот лонгрид до конца %)

Показать полностью 1
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества