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
Forwarded from Daily Coding 🔥
🛠 Acra обеспечивает шифрование полей данных на уровне приложений, многоуровневый контроль доступа, защиту от утечки данных из баз и возможности обнаружения вторжений в рамках одного пакета. Acra была специально разработана для распределенных приложений (веб-приложений, серверных и мобильных), которые хранят данные в одной или нескольких базах данных / хранилищах данных.

🌍 Сайт

Daily Coding #инструменты #SQL & Max
Forwarded from Dezzigners
This media is not supported in your browser
VIEW IN TELEGRAM
🧰 Dominant Color Toolk — создаёт цветовые палитры на основе доминирующих оттенков изображения и автоматически применяет их к слоям

Dezzigners
AbortController в Node.js production: сквозные дедлайны, cleanup ресурсов и защита от «висящих» операций

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

Сквозной дедлайн
У HTTP-запроса, джобы или RPC должен быть один бюджет, который прокидывается вниз: handler - сервис - БД - внешний API - stream - timer.

const client = new AbortController();

req.on('close', () => {
client.abort(new Error('client disconnected'));
});

const signal = AbortSignal.any([
client.signal,
AbortSignal.timeout(1500)
]);

try {
const r = await fetch(reportUrl, { signal });
await pipeline(r.body, createWriteStream(file), { signal });
} finally {
await rm(tmpDir, {
recursive: true,
force: true
}).catch(() => {});
}


Типичная ошибка
Не ставьте независимые timeout: 1000 в каждом слое. Так запрос легко живет 3+ секунды, хотя общий SLA был 1 секунда. Практический совет: передавайте сверху signal, а локальный меньший бюджет делайте через AbortSignal.any().

Abort кооперативен
Он работает только там, где API принимает signal: fetch, timers/promises, stream.pipeline, часть fs, http, child_process, клиенты БД. Предупреждение: Promise.race() с таймаутом не отменяет реальную работу, он только перестает ждать результат.

Cleanup обязателен
abort() не удалит временные файлы, не вернет connection в pool и не снимет listeners. Освобождайте ресурсы в finally и прокидывайте внутрь signal, а не controller.

Вывод:
Сильный production-паттерн - один сквозной AbortSignal, понятный signal.reason и гарантированный cleanup каждой операции.
Forwarded from Designdealer
This media is not supported in your browser
VIEW IN TELEGRAM
HONOR представила MagicOS 11.

Если вам показалось, вам не показалось.
🔴 Собеседование на Middle Frontend-разработчика начнётся уже через 2 часа. Переходи в бот за ссылкой: @shortcut_front_bot
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from ai.dot(ufna, dev)
Сисьадмин — это врач-маммолог.

А у вас какие гениальные идеи при температуре в 39?
Forwarded from Daily Coding 🔥
🛠 Birdview.js - JavaScript-плагин, который позволяет вам уменьшать масштаб страницы и просматривать весь документ в одном окне, после чего вы можете щелкнуть в любом месте, чтобы снова увеличить масштаб и прокрутить вниз прямо до того места, где вы щелкнули.

🌍 Сайт

Daily Coding #инструменты #JavaScript & Max
WeakRef, FinalizationRegistry и утечки в нативных коллбэках: ловушки памяти в V8

Node.js и GC V8 делают много работы за нас, но есть сценарии, где автоматическое управление памятью отключается. Особенно когда в дело входят нативные аддоны на C++ с N-API и коллбэки, которые живут дольше, чем само JS-окружение. WeakRef и FinalizationRegistry часто подают как спасение, но на практике это западня, если не понимать деталей.

WeakRef: иллюзия безопасности

WeakRef хранит слабую ссылку на объект и не мешает GC. Выглядит удобно для кэширования, но deref() может вернуть undefined в любой момент:

const cache = new Map();
function cachedGet(key, factory) {
let ref = cache.get(key);
if (ref && ref.deref()) return ref.deref();
const obj = factory();
cache.set(key, new WeakRef(obj));
return obj;
}


* Практический совет: никогда не рассчитывай на то, что объект жив после deref().
* Типичная ошибка: думать, что WeakRef продлевает жизнь объекту. Нет, GC может уничтожить его сразу.

FinalizationRegistry: не деструктор

FinalizationRegistry вызывает коллбэк после сборки мусора, но это не гарантированный cleanup:

const registry = new FinalizationRegistry((heldValue) => {
console.log(Cleanup for ${heldValue});
});
registry.register(obj, 'some-id');


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

Утечки в нативных коллбэках: скрытый убийца

Нативные аддоны с N-API могут захватить JS-коллбэк через napi_ref и забыть его освободить. В результате объект зависает навсегда:

nativeModule.on('data', (msg) => console.log(msg));
// В C++: napi_create_reference(env, callback, 1, &ref);
// И никогда не вызывается napi_delete_reference(ref);


* Production-oriented пример: обработчик событий в long-running процессе, где каждый вызов on создает новую ссылку без очистки.
* Решение: в аддонах используй napi_create_reference с 0 — это слабая ссылка, и явно удаляй ссылку при завершении работы.

Вывод:
Утечки в нативных коллбэках проще предотвратить на этапе проектирования, чем отлавливать с помощью слабых ссылок — дисциплина и явные cleanup-паттерны остаются единственной надежной защитой.
Forwarded from Designdealer
Начался прием работ на Russian Design Cup 2026.

Три тура без предварительного отбора, разборы работ от дизайнеров и арт-директоров VK Design Team и денежные призы для лучших участников.

Подать работу на первый этап можно до 5 июля.

russiandesigncup.ru