DevNotes Live
6 subscribers
84.2K photos
12K videos
195 files
35.4K links
Автоматический агрегатор IT ресурсов в Telegram (@devnotes_robot)
Информация: https://t.me/devnotes_live/121
Download Telegram
Design Language System: новая парадигма дизайна с ИИ-агентами

Новая статья: Нейросети переплюнули дизайнеров? Узнай, как искусственный интеллект творит дизайн быстрее и лучше

Читать на дизайнерс | #статья
Forwarded from Daily Coding 🔥
🛠 pgsh - Инструменты PostgreSQL для локальной разработки

🌍 Сайт

Daily Coding #инструменты #SQL & Max
Forwarded from Dezzigners
🧰 Monochrome Square Halftone — набор монохромным текстур

Cкачать

Dezzigners
Forwarded from Dezzigners
Forwarded from Dezzigners
Forwarded from Dezzigners
Implicit ABA в async-генераторах: тихая гонка в очередях сообщений

Работа с очередями в Node.js — дело привычное. Kafka, RabbitMQ, Redis Streams. Берёшь async-генератор, читаешь сообщения, обрабатываешь. Но implicit ABA problem в async-генераторах выстреливает в production неожиданно: yield — точка прерывания, и пока генератор приостановлен, другой воркер может изменить состояние очереди.

Где прячется проблема

Вот production-ориентированный пример:

async function* readMessages(queue) {
let lastOffset = await queue.getLatestOffset();
while (true) {
const messages = await queue.poll(lastOffset);
if (messages.length === 0) continue;
yield messages;
for (const msg of messages) {
if (msg.offset >= lastOffset) {
lastOffset = msg.offset + 1;
}
}
}
}


Проблема: пока ты висел на yield, другой процесс мог удалить сообщение, сместить offset. Ты возвращаешься — работаешь с устаревшим состоянием. Это классическая implicit ABA, где "последний offset" меняется под капотом.

Как диагностировать

Логируй время до и после yield. Если пауза больше пары секунд при высокой конкурентности — это красный флаг. Используй детерминированные идентификаторы сообщений, не полагайся на offset как на истину. Смотри на время обработки: между итерациями риск ABA растёт.

Что делать

Самый прямой путь — транзакционная обработка с блокировкой:

async function* safeReader(queue) {
while (true) {
const result = await queue.pollWithLock();
yield result;
await queue.commit();
}
}


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

Ошибка

Не пытайся кэшировать offset между yield в глобальных переменных. Это усугубляет ABA, особенно в системах с несколькими воркерами и долгими HTTP-запросами. Если есть такой код в проде — скорее всего, ты уже видел странные баги, которые не воспроизводятся локально.

Вывод: Async-генераторы элегантны, но их "заморозка" между yield требует явного управления состоянием очереди, иначе гонка становится неявной и трудноуловимой.
Не могу разобраться с собой и карьерой в 2026 году. Что делать?

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

Читать на дизайнерс | #Карьера
Деконструкция красоты: почему "неправильно” новое "круто"?

Узнайте у дизайнеров, почему концепция "идеального дизайна" мертва в 2026 году. Второй выпуск Rebuilding Creativity ждет вас

Читать на дизайнерс | #статья
Forwarded from Gamedev suffering (Andrei Apanasik)
Разработчики Eve Online опубликовали исходники движка игры.

Выложили кучу модулей, начиная с симуляции физики и графического движка, заканчивая модуля для UI, звука и сетки.

И всё по MIT-лицензии. Т.е. можно спокойно и в коммерческих целях использовать.
Forwarded from Daily Coding 🔥
🛠 MenuSpy позволяет отслеживать, какой раздел веб-страницы виден, и отображать это в навигационном меню. В нем нет никаких настроек оформления, только JavaScript API для добавления / удаления классов. Однако есть пара интересных демонстраций, которые вы можете скопировать.

🌍 Сайт

Daily Coding #инструменты #JavaScript & Max
Deadlock из-за AbortSignal.timeout в middleware: как не убить свой сервер

Использование AbortSignal.timeout с Promise.race в цепочках middleware кажется простым способом ограничить время выполнения запроса. Однако на практике это приводит к молчаливым зависаниям, которые не ловятся даже unhandledRejection, а сервер начинает накапливать незавершённые запросы.

Симптомы проблемы
Запрос висит ровно timeout секунд, после чего падает с TimeoutError. Middleware не перехватывает ошибку — она улетает в catch верхнего уровня или теряется вовсе. Процесс не падает, но следующие запросы блокируются из-за незакрытых ресурсов.

Пример проблемного кода
app.use(async (req, res, next) => {
const controller = new AbortController();
const timeoutSignal = AbortSignal.timeout(3000);
const result = await Promise.race([
someAsyncTask(req, { signal: controller.signal }),
timeoutSignal
]);
next(); // deadlock: never called
});


Здесь AbortSignal.timeout(3000) создаёт независимый сигнал. Promise.race завершается, когда один из промисов срабатывает, но не передаёт отмену вашему controller. Дочерние задачи продолжают висеть, а middleware не вызывает next(), блокируя цепочку.

Правильное решение: единый сигнал
Используйте AbortSignal через req.signal и таймаут на уровне роутера:

app.use(async (req, res, next) => {
const controller = new AbortController();
res.on('close', () => controller.abort());
req.signal = controller.signal;
next();
});

app.use(async (req, res, next) => {
const timeout = setTimeout(() => {
req.signal.abort();
res.status(408).send('timeout');
}, 3000);
res.on('finish', () => clearTimeout(timeout));
next();
});


Диагностика в продакшене:
- Используйте async_hooks или cls-hooked для трейсинга запросов.
- Добавьте логирование в каждый middleware через console.time.
- Проверяйте открытые соединения через db.$pool.waitingClients.

Вывод: AbortSignal.timeout должен быть частью контракта middleware, а не хаотично переброшен в Promise.race, иначе deadlock обеспечен.
Индустриальные новости
Forwarded from ai.dot(ufna, dev)
Шутки-шутками, но я даже не слышал что была КРИ-2026. В моем мире это о чем-то говорит.