Обновить
64K+

Node.JS *

Среда для запуска JavaScript-приложений

23,87
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности
Формат публикации

Как я ускорил загрузку графиков Vigo Pulse в 2 раза

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели4K

В Vigo Pulse на одном графике могут оказаться сотни линий, а ответ сервера — содержать тысячи повторяющихся ключей и временных меток. Я пересмотрел формат данных и на одном из больших запросов сократил сжатый ответ с 1 МБ до 500 КБ, а время до отрисовки графика — с 3 до 1,5 секунды при скорости 4 Мбит/с.

Расскажу, что дал переход на колоночный JSON, как он показал себя рядом с MessagePack и BSON и помогает ли смена формата, если уже включён gzip. А ещё — как изменил фильтры и обработку тяжёлых графиков, чтобы не загружать лишние данные.

Читать далее

Я написал мониторинг, который никогда не падает. Полгода он не падал и ни разу не сработал

Уровень сложностиСредний
Время на прочтение3 мин
Охват и читатели3.5K

14 октября в логах нашего API нашлась строка «relation “message_watchdog” does not exist». Таблицы сторожа потерянных сообщений не было ни на dev, ни на проде, хотя код, который в неё пишет, жил в репозитории с апреля и на каждый вызов отвечал success: true. Рассказываю, как переименование миграции в V10b спрятало её от Flyway и почему мой мониторинг полгода докладывал, что всё спокойно.

Читать далее

Как я на 4-й день пентеста чуть не принял 500-ку за RCE

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели8.6K

Здравствуйте, дорогие читатели! Это моя первая и надеюсь, что не последняя, публикация на Habr. Буду очень рад возможной конструктивной критике и обратной связи. Эта статья стала итогом моего первого раунда реального пентестирования на живом сайте, поэтому спешу поделиться опытом. Раньше занимался только разработкой, поэтому это был крайне интересным опытом. Людям, которые только хотят вливаться в пентестирование или идти в него из разработки, как я, эта статья может быть крайне полезна. А более профессиональные пентестеры и программисты, возможно, смогут чутка похихикать с неё и узнать себя в начале карьерного пути. В общем, надеюсь, что статья не оставит вас равнодушной. Не буду тянуть и приятного прочтения!

TL;DR. Теперь кратко и по делу. Нашёл на одном сайте (легально, с разрешения владельца, само собой) 500-ю ошибку от одного HTTP‑заголовка. Сначала подумал — баг десериализации, может, RCE. Потом сел, собрал стенд, намерил — и находка усохла до аккуратного «500 вместо 400». По дороге я один раз испугался, что уронил чужой прод (оказалось — перепутал окна терминала). В общем, я заспойлерил всё в самом начале, но история от этого, надеюсь, вышла не менее интересная.

Читать далее

Маскот для Claude Code: как узнать, что ассистент ждёт ответа, и не пропустить уведомление на Windows

Время на прочтение5 мин
Охват и читатели9K

Я часто даю Claude Code длинную задачу и ухожу в соседнее окно. Через десять-пятнадцать минут возвращаюсь и вижу, что он давно упёрся в вопрос «можно выполнить эту команду?» и всё это время просто ждал. Системное уведомление Windows, конечно, показывалось, но на пять секунд в углу, пока я смотрел в другую сторону.

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

Читать далее

OpenAPI спецификация как инструмент frontend-разработчика: практическое применение и типичные проблемы

Уровень сложностиСредний
Время на прочтение20 мин
Охват и читатели5.3K

OpenAPI — это не только Swagger UI с описанием ручек. Спецификация может стать основой для множества повседневных задач фронтенд-разработчика:

Генерации TypeScript-типов для RTK Query, React Query и нативного fetch.

Генерации API-клиентов на примере orval.

Типизации запросов и ответов в BFF на Express.

Валидации запросов в обработчиках Express.

Генерации моковых данных и запуска mock-сервера.

Но что делать, если исходная спецификация содержит ошибки и всё это перестаёт работать? Здесь пригодятся валидация и подготовка спецификации — покажу, как хранить необходимые исправления в виде воспроизводимых правил с помощью openapi-modifier.

Читать далее

Почему мой Mac не загружался, хотя на диске было свободно 264 ГБ?

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели6.6K

Mac второй раз завис при загрузке. Я решил, что закончилось место, но в режиме восстановления увидел 264 ГБ свободного пространства. За 16 часов ночные тесты оставили во временном каталоге 1 378 905 файлов. Рассказываю, как я нашёл два источника утечки, почему первая попытка восстановления сделала хуже и что пришлось изменить в запуске тестов.

Читать далее

Пересадил Claude Code на механику

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели9.2K

Листаю ленту, а там человек переключает модели Claude Code автомобильным рычагом. Тянет ручку, она щёлкает в паз, тахометр подскакивает, и в терминале меняется модель. Мне, конечно, тоже понадобилось.

Можно было набрать /model руками. Но тогда у меня не было бы коробки передач. Это ituzov-gearbox: Node.js, tmux, ванильный JavaScript и кулиса в SVG. Код открытый. Можно поставить себе, можно разобрать и сделать свою. Ниже как раз разберём.

Читать далее

Как я написал ботов для мафии, которые подозревают, оправдываются и блефуют

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели6.8K

Онлайн-мафия ломается о простую вещь: нужно 6–10 человек одновременно. Я сделал мини-приложение для Telegram и MAX, где пустые места занимают боты. Рассказываю, как устроен их «мозг», почему он не видит лишнего, как боты-мафия врут и как я подбирал баланс, прогоняя тысячи партий одних ботов.

Читать далее

Как искать майнеры в Windows без базы вирусов: подпись, место запуска и командная строка (на примере Electron-помощника)

Время на прочтение18 мин
Охват и читатели7.7K

Началось с того, что родственники в очередной раз позвонили: «компьютер тормозит». Я приехал, открыл диспетчер задач и за десять минут нашёл всё то же самое, что находил в прошлые разы. Неподписанный exe со случайным именем в AppData. Процесс svchost.exe, который почему-то лежит в «Загрузках». Папка с документами, открытая по сети для всех. Файл пароли.txt на рабочем столе. Ничего хитрого, обычный набор. Я подумал, что эти десять минут можно автоматизировать, но так, чтобы результат понял человек, который не знает, что такое автозагрузка.

Получилась программа «Страж ПК». Это не антивирус: у неё нет базы сигнатур, и она ничего не удаляет без явного «Да». В статье я подробно расскажу, как она устроена: как из подписи, места запуска и командной строки получается оценка подозрительности, как найти связь с майнинг-пулом без вирусной базы, почему нельзя просто открыть файл из облака, как сделаны карантин, сжатие фото и видео, сейф и автообновление. Исходный код открыт (MIT), все фрагменты ниже взяты из него.

Читать далее

В настройках бота было два лимита на длину диалога. Ни один из них ни разу не сработал

Уровень сложностиСредний
Время на прочтение3 мин
Охват и читатели8.4K

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

Читать далее

Коммиты в спортзал: трекер тренировок в Telegram в стиле GitHub

Уровень сложностиПростой
Время на прочтение11 мин
Охват и читатели5.3K

Все мы знаем как выглядит сетка в профиле на GitHub.
53 недели, 7 дней, по квадратику на день.

У меня довольно скромный профиль, но всегда тащился по закрашиванию дней.

Как-то на тренировке я одновременно листал своё приложение для тренировок и зачем-то залез в приложение гитхаба.

Этим же вечером появились первые наброски Fitcommit

Telegram Mini App, в котором год тренировок выглядит как граф контрибуций. Квадрат — день, цвет — вид спорта, две тренировки в один день делят клетку по диагонали. Вечером бот спрашивает, была ли сегодня тренировка.

Читать далее

Файлы из браузера в браузер и «торрент» без установки: как устроен TFile.io

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели6.7K

Привет, Хабр! Я делаю TFile — сервис, который передаёт файлы напрямую между браузерами. Без регистрации, без установки, без загрузки файла на чей-то сервер. Расскажу, как он устроен и на какие грабли я наступил по дороге. Цифры в статье — из реальных замеров.

Два режима

⚡ Отправить сейчас. Открываете сайт, получаете ссылку вида tfile.io или QR-код. Второй человек открывает её, и дальше можно перетаскивать файлы, целые папки, текст и скриншоты из буфера обмена.

🔗 Поделиться позже. Выбираете файлы и получаете ссылку. Любой, кто её откроет, видит список и скачивает то, что ему нужно, когда ему удобно. Те, кто уже скачал, раздают куски дальше — как в торренте, только прямо в браузере.

Как идут байты

Сервер у TFile только сигнальный: небольшой WebSocket на Node.js, через который два браузера обмениваются SDP и ICE-кандидатами. Сами файлы идут по WebRTC data channel, а он всегда зашифрован (DTLS). Если прямое соединение не получается (строгий NAT, корпоративная сеть), трафик идёт через TURN-сервер (eturnal). Ему достаются уже зашифрованные данные: прочитать их он не может и ничего не хранит.

Чтобы было видно, что сервер не встал посередине, оба участника видят код безопасности: SHA-256 от DTLS-отпечатков обоих SDP, 40 бит, которые показываются как 12 цифр. Совпадают коды — сертификаты никто не подменял.

Грабли: SCTP и большие очереди

Первая версия просто писала в канал, пока bufferedAmount не дойдёт до 4 МБ. На loopback в Chrome оказалось, что SCTP отправляет всё накопленное разом: пачка около 2 МБ теряет пакеты, и передача стоит 2–3 секунды.

Читать далее

Потоковая выгрузка из Postgres в CSV на Node.js и Fastify

Уровень сложностиПростой
Время на прочтение9 мин
Охват и читатели9.5K

Потоковая выгрузка из базы данных в CSV

Экспорт таблицы в файл - очень типовая задача. Пока записей немного, экспорт CSV обычно пишут в несколько строк: выполнить запрос, получить массив, превратить его в текст и отправить клиенту. На сотнях тысяч строк этот подход начинает расходовать слишком много памяти. Результат запроса целиком оказывается в Node.js, а при сборке CSV появляются дополнительные строки и буферы. Несколько одновременных выгрузок могут довести процесс до OOM.

Разберём реализацию на Node.js, Fastify, Knex и PostgreSQL. CSV будем генерировать порциями, сохраняя сортировку списка (createdAt DESC). Если в вашем кейсе другая сортировка - достаточно поменять на нужную. Отдельно придётся решить вопрос с авторизацией ссылки на скачивание.

Читать далее

Ближайшие события

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

Охват и читатели6.6K

Какая нейронка лучше подходит для фронтенда?

Сразу скажу, что ответа тут не будет, тут я сам хотел узнать мнение коллег, так как не нашел релевантной информации на этот счёт.

Читать дальше →

Личный задачник, из которого Claude Code и OpenCode сами берут задачи

Время на прочтение5 мин
Охват и читатели11K

Я сделал себе задачник, из которого агент сам берёт задачи с пометкой «Агенту», делает их на моём компьютере и пишет отчёт прямо в задачу. Рассказываю, как это устроено: MCP-сервер, вход через браузер или по токену, запуск по расписанию и что агенту можно, а что нет.

Читать далее

Как DSH Mobile дожидается ответа ИИ-агента без пушей Google

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели8.5K

Отправил агенту задачу с телефона, убрал телефон в карман и хочешь узнать, когда он закончит. Обычно для этого берут пуши Google (FCM). У DSH Mobile облачного сервера нет, телефон разговаривает напрямую с компьютером, на котором работает агент. В версиях 0.9.x я переделал уведомления. Постоянного соединения в простое больше нет, а за отправленной задачей телефон следит, даже если Android выгрузил приложение или телефон перезагрузили. Расскажу, как это устроено и какие четыре ошибки нашлись по дороге. Самая заметная съедала 11 секунд на каждом ответе агенту, самая неприятная обрывала загрузку фото на 5 МБ.

Читать далее

Как я написал линтер для Model Context Protocol (MCP) и нашел баги в официальных серверах Anthropic

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели10K

Если вы пишете MCP-серверы для Claude Desktop или Cursor, то знаете, как легко поймать неочевидный баг: • Случайный console.log() в stdout ломает JSON-RPC протокол и наглухо вешает клиент. • Если у опасного инструмента (удаление БД/файлов) нет аннотации destructiveHint, агент выполнит его без подтверждения пользователя. • В описания инструментов можно зашить Prompt Injection, который заставит модель слить контекст.

Написал mcp-linter (без единой сторонней зависимости, чистый Node.js/TS): — 34 правила проверки протокола и безопасности — Оценка здоровья сервера от A+ до F (0-100) — Генератор автоисправлений (–fix) — Экспорт в SARIF v2.1.0 для GitHub Security и готовый GitHub Action

Попробовать в одну строку: npx mcp-linter – npx -y @modelcontextprotocol/server-memory

Репозиторий: https://github.com/bakhtiyor-aminzoda/mcp-doctor

Обезопасить себя

Копируем содержимое Яндекс.Диск к себе

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели9K

Есть Яндекс.Диск объемом ~500GB, заполненный в основном фото (RAW и JPEG) и видео, и задача сохранить все его содержимое на локальный диск.

Вроде бы ровно для этого и нужен официальный клиент - но в реальных условиях он повел себя крайне странно.

Пришлось брать дело в свои руки, а заодно плотнее познакомиться с node:streams...

Читать далее

Как я сделал SlideCraft: от одного промпта до презентации для топ-менеджеров

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели4.2K

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

Это оказалось одной из самых сложных частей SlideCraft — инструмента, который я сделал для подготовки управленческих презентаций с помощью ИИ. Пользователь описывает задачу агенту, согласует структуру и получает редактируемый .pptx. За этим стоят правила построения аргумента, макеты с ограничениями на текст и проверки результата.

Как устроен SlideCraft

QUICv2 больше не проходит: перепроверил работу о QUIC-цензуре в России

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели5.1K

Весной вышла работа о том, что ТСПУ режет только QUICv1, а QUICv2 пропускает. Я написал свой измеритель на Node и через пять месяцев проверил это на пяти российских сетях и одной белорусской: теперь режутся обе версии.

Читать далее
1
23 ...