Обновить
64K+

Node.JS *

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

44,16
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Объекты в JS не бесплатные

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

Поговорим про микро-оптимизацию. Про, казалось бы, самую безобидную вещь: обычный {}.

[object Object] выглядит почти бесплатной абстракцией. Создал объект, напихал полей в любом порядке, удалил ненужное, передал дальше и забыл. Но, внезапно, одинаковые для тебя объекты могут оказаться разными для V8, порядок присваиваний влияет на машинный код, а “безобидный” delete оставляет после себя совсем не пустое место.

Для 99% систем это не имеет значения. А вот если у тебя hot path, через который проходят десятки тысяч объектов в секунду, или ты пишешь библиотечный код, стоит знать, что V8 на самом деле делает с твоими объектами.

И чего V8 там делает?

Новости

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

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

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

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

Внутри: почему спор «отказ - статус или событие» решил один запрос к проду, три мины Mongoose, найденные на ревью, и регрессия, прилетевшая через двадцать часов после релиза.

Читать далее

Две дыры в приёме платежей, которые ИИ-ассистент оставляет по умолчанию

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

Просишь ассистента «сделай приём платежей» — и получаешь код, который работает. Нажал кнопку, оплатил, получил доступ. Тесты проходят, демо клиенту показывается.

Дальше кто-то открывает devtools и платит доллар вместо ста.

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

Читать далее

Между tsc и node:test: как ловить устаревшие тесты в dist

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

Вы изменили или удалили TypeScript-тест, но в dist остался старый JavaScript. node:test честно запускает найденный файл — и зелёный прогон может проверять уже не тот код, который открыт в редакторе.

В статье разбираю fwa — небольшой защитный слой между tsc и node:test: детерминированный поиск тестов, проверку устаревших артефактов, безопасный --prune и API для оркестрации тестовых наборов.

Читать далее

Бэкдоры в вакансиях на работу

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

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

Внедрение бэкдоров через вакансии на популярных сайтах встречается всё чаще. Об одном таком случае в сети LinkedIn рассказывает Python-разработчик Роман Иманкулов, о другом — разработчик Николай Коновалов, и похожих историй предостаточно.

Читать далее

Как я сделал общие доски в Telegram, которые живут прямо в чате

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

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

До общих досок бот уже умел личные заметки и задачи. Пользователь заходит, пишет заметку, ставит задачу с чекбоксом — всё как в обычном блокноте, только внутри Telegram.

Читать далее

Memorization vs Generalization: что действительно умеет языковая модель (TLM) на 2 160 параметров (v1.1.0)

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

Продолжая тему Крошечной Языковой Модели на Nodejs мы поймем где проходит граница ее возможностей. На примере Крошечной Языковой Модели (TLM) из 2 160 параметров мы проведём воспроизводимый эксперимент и увидим в цифрах: знакомый шаблон - 99,93%, перестановка токенов - 81,69%, неизвестная структура -?%.

Читать далее

Опенсорсная Весёлая Ферма: поднимаем preview‑окружения без боли

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

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

Привет, Хабр! Меня зовут Михаил Гольбах, я ведущий разработчик интерфейсов Yandex Cloud. Уже несколько лет мы с командой развиваем Ферму — сервис, который поднимает preview‑окружение под каждый пулл‑реквест. В этой статье расскажу, как Ферма выросла из простого self‑hosted‑скрипта на одной виртуальной машине в оркестратор на Docker и Kubernetes и почему в итоге мы открыли её код.

Читать далее

Как получить пожизненный бан на VC.ru за open-source проект на Node.js без рекламы. Кейс CMTT

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

Всем привет. На днях моя техническая статья с open source кодом про написание нейросети с нуля на Node.js вышла из песочницы Хабра благодаря НЛО, набрала 8K+ просмотров и получила крутой фидбек. Но за 2 дня до этого я решил провести эксперимент и выложить этот же материал на VC.ru. Итог — моментальный пожизненный бан без объяснения причин в первые 15 минут…

Читать далее

Модель исполнения JavaScript по спецификации ECMAScript: call stack, контексты, окружения и замыкания

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

Я довольно долго был уверен, что понимаю, как работает call stack.

Ну а что там понимать? Положил кадр, снял кадр, LIFO.

Потом открыл спецификацию. Оказалось, за «стеком вызовов» стоит каркас из пяти сущностей, а половина привычных объяснений просто не совпадает с текстом стандарта.

Замыкание — не фича языка, а побочный эффект того, что окружение живёт отдельно от кадра. «Область видимости» — вообще не сущность: такого термина там нет. А слов event loop, microtask и task queue в ECMA-262 ровно ноль. Проверяется грепом за минуту.

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

Разобрать по спецификации

Языковая Модель без магии: Крошечная Language Model на чистом Node.js

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

Мы создаем крошечную языковую модель с нуля на чистом Node.js без использования TensorFlow или PyTorch, реализуя нейроны, автоград, эмбеддинги, механизм самовнимания (self-attention), полносвязную сеть (FFN), обратное распространение ошибки и SFT, одновременно наблюдая за тем, как отдельные веса и целые матрицы изменяются в процессе обучения

Это не новая GPT и не прод ML...

Замена телеграм-бота — открывальщика ворот

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

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

Читать далее

Робот, который звонит в WhatsApp: как я автоматизировал то, что автоматизировать не предполагалось

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

Задача формулировалась в одно предложение: робот должен сам звонить людям в WhatsApp, проигрывать голосовое приветствие, записывать ответ и присылать оператору расшифровку с вердиктом «да / нет / надо посмотреть руками».

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

Зато существует официальное десктопное приложение, которое звонить умеет. И его можно водить за руку.

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

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

Кода будет много. Всё интересное в этом проекте живёт именно в деталях.

Читать далее

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

Браузер вместо API: как я объединил DeepSeek, Qwen и ChatGPT в одного локального агента

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

Я хотел получить локального AI-агента без отдельного API для каждой модели — и превратил браузерные сессии DeepSeek, Qwen и ChatGPT в единый транспорт. В статье разбираю архитектуру AI Free: WASM proof-of-work, подписанные запросы через авторизованную вкладку, работу через штатный UI, общий оркестратор, память, skills и восстановление после сбоев. А ещё рассказываю, почему первый успешный запрос оказался самой простой частью проекта, который я разрабатываю один.

Читать далее

Как VPS с 1 ГБ RAM пережил 1,2 млн запросов за сутки: разбираю «Шакализатор» по слоям

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

Мой мемный сервис «Шакализатор» победил в премии Яндекс Практикума, но меня больше интересовал другой вопрос: как VPS с одним ядром и 1 ГБ RAM пережил 1,2 млн запросов за сутки?

Серверную часть в основном писал Codex, а я во время наплыва обновлял статистику и ждал падения. Теперь разбираю код, логи и серверные срезы: что именно спасло систему, где нам просто повезло и почему миллион запросов оказался не тем, чем кажется.

Почему он не упал

Как я снизил стоимость обработки данных с помощью AI в 12 раз

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

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

Я столкнулся именно с такой задачей и попробовал несколько подходов: от бесплатных моделей до платных API. В итоге удалось снизить стоимость одного запроса примерно до 0.006 рублей, сохранив качество обработки.

В статье расскажу, как я пришёл к этому решению и почему в итоге написал собственный API-слой поверх OpenCode Go.

Читать далее

DI-контейнер на чистом JavaScript без TypeScript и reflect-metadata

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

В статье разберем, как собрать простой DI-контейнер на чистом JavaScript без TypeScript, декораторов и reflect-metadata. Заодно посмотрим, как применить его в небольшом DDD-примере с корзиной, репозиторием, скидками и разными lifetime зависимостей.

Читать

pkg-cache — простой локальный кеш пакетов

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

Пример реализации простого кэширующего прокси для пакетов npm, composer и pip на базе node.js для Windows и Linux.

Читать далее

Point0 — простой, как tRPC, полноценный фулстек-фреймворк

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

Хочу сравнить фреймворк Point0 и библиотеку tRPC. Делаю это, потому что квери и мутации в Point0 очень похожи по DX на tRPC, но более удобны ввиду того, что всё же Point0 это фреймворк и он может обладать возможностями, которыми библиотека не может:

Объявлять квери вместе с серверным кодом прямо в клиентских файлах, или наоборот

Автоматически гидрировать и дегидрировать квери клиент при включении SSR

В мутациях отправлять файлы автоматически превращая данные в FormData и обратно

Иметь стабильные индивидуальные урлы для квери и мутаций

Не заставлять зависать редактор кода при увеличении количества эндпоинтов

Возвращать в ответах с сервера на клиент целые серверные компоненты или интерактивные острова

Управлять внешним видом состояний загрузки на страницах и в компонентах

Кроме того, что описано в этой статье, Point0 может много чего ещё, но об этом в других статьях. Сейчас фокусируемся на сравнении с tRPC. Предполагается, что вы с tRPC более менее знакомы, но ниже я всё равно буду показывать примеры реализации на tRPC, чтобы сравнения были видимыми.

Читать далее

Как я собрал OmniBot: Discord Activity, локальный ruBERT и модерация без чёрного ящика

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

Когда я начал развивать Discord-сообщество, обычной команды /ban хватило совсем ненадолго. Роли настраивались в одном месте, приветствия — в другом, логи — в третьем, а за уведомления о стримах отвечал отдельный бот.

Подробнее
1
23 ...