Forwarded from PSD | Дизайн-пространство
Как проектировать дизайн для продукта, который почти нельзя рекламировать
Статья о натуральном вине, про которое не расскажет реклама. Как выбрать бутылку вина? Узнай, как сомелье помогает любителям находить настоящие вкусы и почему этикетка играет важную роль в выборе напитка
Читать на дизайнерс | #статья
Статья о натуральном вине, про которое не расскажет реклама. Как выбрать бутылку вина? Узнай, как сомелье помогает любителям находить настоящие вкусы и почему этикетка играет важную роль в выборе напитка
Читать на дизайнерс | #статья
Forwarded from Denis Sexy IT 🤖
Media is too big
VIEW IN TELEGRAM
Forwarded from Daily Coding 🔥
🛠 StatsMgr — это расширение для PostgreSQL, предназначенное для эффективного и упорядоченного управления статистикой.
🌍 Сайт
Daily Coding #инструменты #SQL & Max
🌍 Сайт
Daily Coding #инструменты #SQL & Max
Forwarded from Dezzigners
Forwarded from ai.dot(ufna, dev)
Coufal_CV.pdf
178.3 KB
Крутой аниматор сейчас освободился и в поиске проекта на фуллтайм. Рекомендация — моя личная, если вам сейчас нужен аниматор/риггер/моделлер — пишите прямо Косте.
Часть демок есть на https://t-d-kzn.ru/ , но немалое — осталось за кадром.
Часть демок есть на https://t-d-kzn.ru/ , но немалое — осталось за кадром.
Forwarded from Node.JS [ru] | Серверный JavaScript
Теневые блокировки Event Loop от deasync: как найти и устранить
В production падает без видимых причин? Часто виноваты "теневые" блокировки event loop. Самый частый источник -
Механизм блокировки
Выглядит это так: ты вызываешь библиотеку, которая внутри использует
Как найти "тень"
Самый надёжный способ - flamegraphs с
Production-ready решения
Очевидный путь - замена на
* Переписать на асинхронные аналоги
* Вынести синхронные вызовы в Worker Thread
* Вставить
Пример. Вместо
Типичная ошибка
Даже один вызов
Вывод: Избегайте любых синхронных вызовов в production-режиме, заменяя их на асинхронные паттерны или Worker Threads, чтобы p99 latency оставалась стабильной под нагрузкой.
В production падает без видимых причин? Часто виноваты "теневые" блокировки event loop. Самый частый источник -
deasync и её клоны вроде sync-rpc или synchd.Механизм блокировки
Выглядит это так: ты вызываешь библиотеку, которая внутри использует
deasync. Внешне код нормальный, но под капотом - блокировка на уровне C++. Event loop замирает. deasync через node-gyp модуль синхронно ждёт завершения асинхронной операции, игнорируя все остальные события.Как найти "тень"
Самый надёжный способ - flamegraphs с
--perf-basic-prof. Ищи длинные синхронные стектрейсы с deasync::run или uv_run. Второй вариант - process._getActiveHandles(). Если активные хендлы резко падают на пиках, это симптом. Можно повесить custom async_hooks и ловить destroy на таймерах, которые не срабатывают.Production-ready решения
Очевидный путь - замена на
child_process.execSync - не выход. Это та же блокировка. Рабочие варианта:* Переписать на асинхронные аналоги
* Вынести синхронные вызовы в Worker Thread
* Вставить
setImmediate после каждого вызова через timers/promisesПример. Вместо
deasync(promise) пишем await promise. Если сторонняя библиотека - заворачиваем в Worker.const { Worker } = require('worker_threads');
const worker = new Worker('./worker.js');
// p99 latency падает с 1200ms до 45msТипичная ошибка
Даже один вызов
deasync может заблокировать event loop на сотни миллисекунд. Под нагрузкой это смертельно. Проверьте своё production: grep -r "require.*deasync" node_modules - и вы узнаете, кто тихо убивает ваш event loop.Вывод: Избегайте любых синхронных вызовов в production-режиме, заменяя их на асинхронные паттерны или Worker Threads, чтобы p99 latency оставалась стабильной под нагрузкой.
Forwarded from PSD | Дизайн-пространство
Вкус и польза в стиле Neo: новая визуальная концепция бренда DARIO
Новый дизайн упаковки DARIO Wellness Neo – современное и стильное решение для функциональных напитков. Использование натуральных оттенков и креативных коллажей фруктов подчеркивает их целебные свойства
Читать на дизайнерс | #кейс
Новый дизайн упаковки DARIO Wellness Neo – современное и стильное решение для функциональных напитков. Использование натуральных оттенков и креативных коллажей фруктов подчеркивает их целебные свойства
Читать на дизайнерс | #кейс
Forwarded from PSD | Дизайн-пространство
Forwarded from Daily Coding 🔥
🛠 Color Info - плагин, который предоставляет вам различную информацию о цветах, которые вы использовали в своем CSS. Наведя курсор на цвет, вы можете увидеть увеличенное изображение того, как он выглядит, а также информацию о его переводе во все форматы (hex, rgb, hsl и cmyk).
🌍 Сайт
Daily Coding #инструменты #CSS & Max
🌍 Сайт
Daily Coding #инструменты #CSS & Max
Forwarded from Node.JS [ru] | Серверный JavaScript
Диагностика и устранение deferred reference cycles в WeakRef и FinalizationRegistry: кэши и пулы в долгоживущих процессах
С WeakRef и FinalizationRegistry в Node.js можно получить скрытые утечки памяти, когда объекты в кэшах и пулах соединений не освобождаются из-за циклических ссылок через cleanup-функции. В production это проявляется как постепенный рост heap в долгоживущих процессах.
Ловушка deferred cycles
Основная проблема - передача объекта (например, socket) в FinalizationRegistry как heldValue внутри cleanup-функции, которая замыкается на тот же объект. Пока cleanup висит в очереди, GC не может освободить объект, так как registry его удерживает.
Диагностика
- Используй heap snapshots через --inspect: ищи цепочку WeakRef -> Object -> FinalizationRegistry
- Следи за process.memoryUsage().heapUsed при простое - рост без причины признак deferred cycle
- Логируй вызовы FinalizationRegistry: если cleanup не происходит после удаления всех внешних ссылок, цикл активен
Production-ориентированный совет
Для пулов соединений храни только идентификаторы в WeakRef, а реальные объекты - в отдельном Map с таймаутом.
Или используй явную отписку:
Типичная ошибка
Передача в registry объекта с методами, которые держат ссылки на другие ресурсы. Это создает неявные циклы, которые GC не распознает.
Вывод: Deferred reference cycles - это скрытые утечки, которые требует диагностики через heap snapshots и разрыва замыканий через примитивы в FinalizationRegistry.
С WeakRef и FinalizationRegistry в Node.js можно получить скрытые утечки памяти, когда объекты в кэшах и пулах соединений не освобождаются из-за циклических ссылок через cleanup-функции. В production это проявляется как постепенный рост heap в долгоживущих процессах.
Ловушка deferred cycles
Основная проблема - передача объекта (например, socket) в FinalizationRegistry как heldValue внутри cleanup-функции, которая замыкается на тот же объект. Пока cleanup висит в очереди, GC не может освободить объект, так как registry его удерживает.
const registry = new FinalizationRegistry((heldValue) => {
heldValue.socket.destroy();
});
class CachedConnection {
constructor(socket) {
this.socket = socket;
registry.register(this, this); // цикл: this как heldValue
}
}Диагностика
- Используй heap snapshots через --inspect: ищи цепочку WeakRef -> Object -> FinalizationRegistry
- Следи за process.memoryUsage().heapUsed при простое - рост без причины признак deferred cycle
- Логируй вызовы FinalizationRegistry: если cleanup не происходит после удаления всех внешних ссылок, цикл активен
Production-ориентированный совет
Для пулов соединений храни только идентификаторы в WeakRef, а реальные объекты - в отдельном Map с таймаутом.
registry.register(this, this.socket.id); // примитив, разрывает цикл
Или используй явную отписку:
registry.unregister(this) // перед удалением ссылки
Типичная ошибка
Передача в registry объекта с методами, которые держат ссылки на другие ресурсы. Это создает неявные циклы, которые GC не распознает.
Вывод: Deferred reference cycles - это скрытые утечки, которые требует диагностики через heap snapshots и разрыва замыканий через примитивы в FinalizationRegistry.
Forwarded from PSD | Дизайн-пространство
Фича в портфолио, которую почти никто не делает — хотя все хотят выделиться
Автор разбирает одну простую, но крайне редкую «фичу», которую почти никто не добавляет в портфолио — хотя именно она сильно помогает выделиться. Если вы устали от однотипных кейсов и хотите, чтобы ваше портфолио запоминали, стоит прочитать.
Читать на дизайнерс | #Карьера #Продуктовыйдизайн
Автор разбирает одну простую, но крайне редкую «фичу», которую почти никто не добавляет в портфолио — хотя именно она сильно помогает выделиться. Если вы устали от однотипных кейсов и хотите, чтобы ваше портфолио запоминали, стоит прочитать.
Читать на дизайнерс | #Карьера #Продуктовыйдизайн