Всего несколько коротких строк кода способны оказать огромное влияние на развитие интернет-технологий по всему миру. Вот несколько примеров.
https://nuancesprog.ru/p/17226/
VK: https://vk.com/@nuancesprog-eti-malenkie-snippety-koda-izmenili-mir
Дзен: https://dzen.ru/a/ZDhkzLn_KwCfACfW
@nuancesprog #WebDevelopment #JavaScript
https://nuancesprog.ru/p/17226/
VK: https://vk.com/@nuancesprog-eti-malenkie-snippety-koda-izmenili-mir
Дзен: https://dzen.ru/a/ZDhkzLn_KwCfACfW
@nuancesprog #WebDevelopment #JavaScript
Опытные JavaScript-программисты владеют приемами, которые неизвестны новичкам. Познакомьтесь с 10 из них: они сделают код качественнее, а вас - более профессиональным программистом.
https://nuancesprog.ru/p/17466/
VK: https://vk.com/@nuancesprog-10-laifhakov-javascript-kotorye-sdelaut-iz-vas-professionala
Дзен: https://dzen.ru/a/ZHUI1sflEx4IG2L6
@nuancesprog #JavaScript
https://nuancesprog.ru/p/17466/
VK: https://vk.com/@nuancesprog-10-laifhakov-javascript-kotorye-sdelaut-iz-vas-professionala
Дзен: https://dzen.ru/a/ZHUI1sflEx4IG2L6
@nuancesprog #JavaScript
Репозитории GitHub - лучший способ изучать программирование (конечно, после чтения документации). Представляем подборку из 7 репозиториев, которые помогут улучшить знания JavaScript.
https://nuancesprog.ru/p/17131/
VK: https://vk.com/@nuancesprog-7-poleznyh-repozitoriev-github-dlya-js-programmistov
Дзен: https://dzen.ru/a/ZCNQw5PvUC4JVb5j
@nuancesprog #JavaScript #GitHub
https://nuancesprog.ru/p/17131/
VK: https://vk.com/@nuancesprog-7-poleznyh-repozitoriev-github-dlya-js-programmistov
Дзен: https://dzen.ru/a/ZCNQw5PvUC4JVb5j
@nuancesprog #JavaScript #GitHub
Изучение того, как массивы и простые методы типа .push() работают в языках более низкого уровня, может значительно углубить понимание JavaScript и вызвать признательность за его чудо-массивы.
https://nuancesprog.ru/p/16812/
VK: https://vk.com/@nuancesprog-budte-blagodarny-za-massivy-javascript-sravnenie-s-yazykom-c
Дзен: https://dzen.ru/a/Y9lpXT4ckUQveFPo
@nuancesprog #JavaScript #CProgramming
https://nuancesprog.ru/p/16812/
VK: https://vk.com/@nuancesprog-budte-blagodarny-za-massivy-javascript-sravnenie-s-yazykom-c
Дзен: https://dzen.ru/a/Y9lpXT4ckUQveFPo
@nuancesprog #JavaScript #CProgramming
На сегодняшний день WebSocket - лучшее решение для веб-сервисов, работающих по технологии клиент-сервер в реальном времени. Предлагаем краткое руководство по созданию многопользовательского чата с помощью WebSocket.
https://nuancesprog.ru/p/16849/
VK: https://vk.com/@nuancesprog-kak-sozdat-mnogopolzovatelskii-chat-s-pomoschu-websocket-za
Дзен: https://dzen.ru/a/Y-AXCcMKtSLcYSJx
@nuancesprog #WebSocket #JavaScript
https://nuancesprog.ru/p/16849/
VK: https://vk.com/@nuancesprog-kak-sozdat-mnogopolzovatelskii-chat-s-pomoschu-websocket-za
Дзен: https://dzen.ru/a/Y-AXCcMKtSLcYSJx
@nuancesprog #WebSocket #JavaScript
CRDT без академических статей: интерактивный курс на JavaScript
Lars Hupel собрал серию туториалов про Conflict-Free Replicated Data Types — структуры данных, которые сливаются между репликами всегда и без конфликтов. Всё на JavaScript, весь код исполняется прямо в браузере как в Jupyter: правишь сниппет, нажимаешь Run, смотришь результат.
Зачем это вам: любое приложение с офлайн-режимом или синхронизацией между устройствами упирается в вопрос «чья версия правильная». Обычно это заканчивается баннером «вы офлайн» или молчаливой потерей данных. CRDT решают задачу конструктивно — через решётки и частичные порядки, а не через эвристики «last write wins».
Трение в том, что автор сознательно уходит в математику, а не в практику: если нужен готовый рецепт для продакшена, он честно отправляет на crdt.tech. Зато свойства проверяются property-based тестами через fast-check — сразу видно, где ваша реализация merge ломает коммутативность.
🔗 Подробнее
@nuancesprog #Data #JavaScript
Lars Hupel собрал серию туториалов про Conflict-Free Replicated Data Types — структуры данных, которые сливаются между репликами всегда и без конфликтов. Всё на JavaScript, весь код исполняется прямо в браузере как в Jupyter: правишь сниппет, нажимаешь Run, смотришь результат.
Зачем это вам: любое приложение с офлайн-режимом или синхронизацией между устройствами упирается в вопрос «чья версия правильная». Обычно это заканчивается баннером «вы офлайн» или молчаливой потерей данных. CRDT решают задачу конструктивно — через решётки и частичные порядки, а не через эвристики «last write wins».
Трение в том, что автор сознательно уходит в математику, а не в практику: если нужен готовый рецепт для продакшена, он честно отправляет на crdt.tech. Зато свойства проверяются property-based тестами через fast-check — сразу видно, где ваша реализация merge ломает коммутативность.
🔗 Подробнее
@nuancesprog #Data #JavaScript
👍1
Firefox остался единственным браузером с полным uBlock Origin
Microsoft Edge скоро отключит расширения на Manifest V2, включая uBlock Origin. Mozilla ответила в Bluesky: «Наша поддержка uBlock Origin никуда не денется».
Manifest V3 лишает блокировщики доступа к функциям, которые нужны для фильтрации запросов. Практически все Chromium-браузеры — Opera, Brave, Vivaldi — идут за Google по этому пути.
Альтернатива в Chromium — uBlock Origin Lite, но он ловит заметно меньше рекламы. Ирония в том, что Manifest V3 задумывался как способ повысить безопасность расширений.
🔗 Подробнее
@nuancesprog #Tools #JavaScript
Microsoft Edge скоро отключит расширения на Manifest V2, включая uBlock Origin. Mozilla ответила в Bluesky: «Наша поддержка uBlock Origin никуда не денется».
Manifest V3 лишает блокировщики доступа к функциям, которые нужны для фильтрации запросов. Практически все Chromium-браузеры — Opera, Brave, Vivaldi — идут за Google по этому пути.
Альтернатива в Chromium — uBlock Origin Lite, но он ловит заметно меньше рекламы. Ирония в том, что Manifest V3 задумывался как способ повысить безопасность расширений.
🔗 Подробнее
@nuancesprog #Tools #JavaScript
👍11
Скрытый WebAudio на AliExpress ломает Bluetooth-мультипойнт
Автор блога laserphile заметил: открытая вкладка AliExpress глушит музыку с телефона. Причина — два скрытых AudioContext от скриптов collina.js и fireyejs.js.
Графы строят пилообразный осциллятор с усилением в ноль, но подключают его к системному выходу. Звука нет, зато аудиотракт остаётся активным, и кнопка «выключить звук во вкладке» не помогает.
Это часть большого отпечатка: canvas, WebGL, WebRTC, память, движение устройства. Спорно тут другое — отличить антифрод от обычной слежки со стороны невозможно.
🔗 Подробнее
@nuancesprog #Security #JavaScript
Автор блога laserphile заметил: открытая вкладка AliExpress глушит музыку с телефона. Причина — два скрытых AudioContext от скриптов collina.js и fireyejs.js.
Графы строят пилообразный осциллятор с усилением в ноль, но подключают его к системному выходу. Звука нет, зато аудиотракт остаётся активным, и кнопка «выключить звук во вкладке» не помогает.
Это часть большого отпечатка: canvas, WebGL, WebRTC, память, движение устройства. Спорно тут другое — отличить антифрод от обычной слежки со стороны невозможно.
🔗 Подробнее
@nuancesprog #Security #JavaScript
👍3
WebSockets против SSE: спор на самом деле о порядке событий
Жозе Валим разобрал típичный аргумент «бери SSE и Fetch вместо WebSockets». Его довод: два разных потока данных ломают порядок событий и оставляют интерфейс несогласованным.
Пример простой: один пользователь добавляет тег, другой удаляет соседний. Ответ на удаление приходит позже и затирает добавленный тег, пока страницу не перезагрузят.
WebSocket двунаправлен, поэтому чтение и запись идут по одному каналу и порядок сохраняется. С SSE придётся гонять свои же записи через очередь или клиентскую сортировку — это лишняя задержка и сложность.
🔗 Подробнее
@nuancesprog #Infrastructure #JavaScript
Жозе Валим разобрал típичный аргумент «бери SSE и Fetch вместо WebSockets». Его довод: два разных потока данных ломают порядок событий и оставляют интерфейс несогласованным.
Пример простой: один пользователь добавляет тег, другой удаляет соседний. Ответ на удаление приходит позже и затирает добавленный тег, пока страницу не перезагрузят.
WebSocket двунаправлен, поэтому чтение и запись идут по одному каналу и порядок сохраняется. С SSE придётся гонять свои же записи через очередь или клиентскую сортировку — это лишняя задержка и сложность.
🔗 Подробнее
@nuancesprog #Infrastructure #JavaScript
👍5👎1
Chrome Web Store удалил расширения на Manifest V2
Google завершил чистку каталога: расширения на Manifest V2 больше недоступны для установки. Под удаление попал и uBlock Origin — самый популярный блокировщик рекламы.
Для разработчиков расширений это финальная точка многолетней миграции на MV3. Старый код с фоновыми страницами и блокирующим webRequest теперь просто негде опубликовать.
Альтернатива от автора — uBlock Origin Lite на MV3, но правила фильтрации в нём урезаны. Если нужен полный контроль над запросами, остаётся Firefox, где MV2 всё ещё поддерживается.
🔗 Подробнее
@nuancesprog #Tools #JavaScript
Google завершил чистку каталога: расширения на Manifest V2 больше недоступны для установки. Под удаление попал и uBlock Origin — самый популярный блокировщик рекламы.
Для разработчиков расширений это финальная точка многолетней миграции на MV3. Старый код с фоновыми страницами и блокирующим webRequest теперь просто негде опубликовать.
Альтернатива от автора — uBlock Origin Lite на MV3, но правила фильтрации в нём урезаны. Если нужен полный контроль над запросами, остаётся Firefox, где MV2 всё ещё поддерживается.
🔗 Подробнее
@nuancesprog #Tools #JavaScript
👍3👎2
CodePen 2.0 отправляет код на сервер, пока ты печатаешь
Пользователь заметил, что новый редактор CodePen шлёт содержимое на codepen.dev почти сразу. Уникальный маркер из index.html появился в предпросмотре через пару секунд, при сборке с флагом save:false.
Значит, любой случайно вставленный токен или пароль уже покинул твой браузер до сохранения. Считай такие ключи скомпрометированными и перевыпусти их, даже если пен не публиковался.
В комментариях справедливо возражают: сервер нужен для рендера превью и автодополнения. Но подвох в том, что поведение неочевидно, а для секретов лучше брать локальную песочницу.
🔗 Подробнее
@nuancesprog #Security #JavaScript
Пользователь заметил, что новый редактор CodePen шлёт содержимое на codepen.dev почти сразу. Уникальный маркер из index.html появился в предпросмотре через пару секунд, при сборке с флагом save:false.
Значит, любой случайно вставленный токен или пароль уже покинул твой браузер до сохранения. Считай такие ключи скомпрометированными и перевыпусти их, даже если пен не публиковался.
В комментариях справедливо возражают: сервер нужен для рендера превью и автодополнения. Но подвох в том, что поведение неочевидно, а для секретов лучше брать локальную песочницу.
🔗 Подробнее
@nuancesprog #Security #JavaScript
👍5
3G-троттлинг ловит баги, которые тесты пропускают
Автор включил в DevTools ограничение сети до 3G и погонял приложение, которое годами вело себя идеально. Всплыли два бага корректности: поиск показывал устаревшие результаты, а автосейв сохранял правку дважды.
Оба сидели в коде, прошедшем все тесты, потому что на быстром wifi ответы почти всегда приходят по порядку. Клиентский таймаут в 1,2 секунды тоже кажется разумным, пока сохранение не начинает честно идти три секунды.
Лечится счётчиком запросов: помечай каждый номером и игнорируй ответ, если уже ушёл более свежий. Подвох в наивной защите «не отправлять новое, пока летит старое» — так последняя правка тихо теряется.
🔗 Подробнее
@nuancesprog #Frontend #JavaScript
Автор включил в DevTools ограничение сети до 3G и погонял приложение, которое годами вело себя идеально. Всплыли два бага корректности: поиск показывал устаревшие результаты, а автосейв сохранял правку дважды.
Оба сидели в коде, прошедшем все тесты, потому что на быстром wifi ответы почти всегда приходят по порядку. Клиентский таймаут в 1,2 секунды тоже кажется разумным, пока сохранение не начинает честно идти три секунды.
Лечится счётчиком запросов: помечай каждый номером и игнорируй ответ, если уже ушёл более свежий. Подвох в наивной защите «не отправлять новое, пока летит старое» — так последняя правка тихо теряется.
🔗 Подробнее
@nuancesprog #Frontend #JavaScript
👍4
Сообщение в чате Twitch превратилось в выполнение кода на ПК стримера
Исследователь нашёл оверлей чата, который рендерил сообщения зрителей как сырой HTML. Это давало любому зрителю выполнение JavaScript внутри Browser Source в OBS.
Встроенный в OBS Chromium на тот момент запускался без песочницы. А его версия V8 содержала дыру, которую уже эксплуатировали в реальных атаках.
В итоге цепочка из трёх мелочей дала нативный код при настройках OBS по умолчанию. Если рисуешь пользовательский текст в вебвью — экранируй его и проверь, включён ли sandbox.
🔗 Подробнее
@nuancesprog #Security #JavaScript
Исследователь нашёл оверлей чата, который рендерил сообщения зрителей как сырой HTML. Это давало любому зрителю выполнение JavaScript внутри Browser Source в OBS.
Встроенный в OBS Chromium на тот момент запускался без песочницы. А его версия V8 содержала дыру, которую уже эксплуатировали в реальных атаках.
В итоге цепочка из трёх мелочей дала нативный код при настройках OBS по умолчанию. Если рисуешь пользовательский текст в вебвью — экранируй его и проверь, включён ли sandbox.
🔗 Подробнее
@nuancesprog #Security #JavaScript
👍5
localStorage блокирует главный поток
Автосохранение черновика в localStorage подвешивает страницу при большом тексте. Каждый вызов setItem синхронный: пока он не вернётся, кадр не отрисуется.
Дебаунс тут не помогает — он режет частоту вызовов, а не их длительность. Вместо десяти фризов по 40 мс ты получишь один, ровно такой же длины.
Для крупных данных бери IndexedDB: она асинхронная и хранит объекты без JSON.stringify. Платишь за это громоздким API на событиях, а тему оформления спокойно оставляй в localStorage.
🔗 Подробнее
@nuancesprog #Frontend #JavaScript
Автосохранение черновика в localStorage подвешивает страницу при большом тексте. Каждый вызов setItem синхронный: пока он не вернётся, кадр не отрисуется.
Дебаунс тут не помогает — он режет частоту вызовов, а не их длительность. Вместо десяти фризов по 40 мс ты получишь один, ровно такой же длины.
Для крупных данных бери IndexedDB: она асинхронная и хранит объекты без JSON.stringify. Платишь за это громоздким API на событиях, а тему оформления спокойно оставляй в localStorage.
🔗 Подробнее
@nuancesprog #Frontend #JavaScript
👍5
Почему разработчики не спешат «использовать платформу»
Нолан Лоусон разбирает, почему призыв «возьми готовый браузерный API» так часто игнорируют. Он сам годами писал полифилы и теперь объясняет логику скептиков.
Исторически браузеры отставали, и jQuery закрывал дыры, пока не вымрет IE6. Привычка осталась: за «липким блоком» идут в npm, а не к CSS
Вторая причина честнее — писать своё просто интереснее и так учат платформу. Но модалка своими руками требует ловушки фокуса и возврата фокуса, чего
🔗 Подробнее
@nuancesprog #Frontend #JavaScript
Нолан Лоусон разбирает, почему призыв «возьми готовый браузерный API» так часто игнорируют. Он сам годами писал полифилы и теперь объясняет логику скептиков.
Исторически браузеры отставали, и jQuery закрывал дыры, пока не вымрет IE6. Привычка осталась: за «липким блоком» идут в npm, а не к CSS
position: sticky.Вторая причина честнее — писать своё просто интереснее и так учат платформу. Но модалка своими руками требует ловушки фокуса и возврата фокуса, чего
<dialog> даёт даром.🔗 Подробнее
@nuancesprog #Frontend #JavaScript
👍4
Клод построил O'Neill-цилиндр, по которому можно погулять
Автор попросил Claude собрать браузерную симуляцию цилиндра О'Нила — космической станции с вращением вместо гравитации. Результат крутится прямо на Cloudflare Workers, ходить по нему можно мышью и клавишами.
Это наглядный тест того, как модель держит физику, а не только синтаксис. Сила Кориолиса, кривизна «земли» над головой и скорость вращения связаны формулами, которые легко переврать.
Открой и проверь сам: брось предмет и посмотри, уводит ли его в сторону. Если автор не вычитал расчёты, демка выглядит убедительно, но врёт в цифрах.
🔗 Подробнее
@nuancesprog #AI #JavaScript
Автор попросил Claude собрать браузерную симуляцию цилиндра О'Нила — космической станции с вращением вместо гравитации. Результат крутится прямо на Cloudflare Workers, ходить по нему можно мышью и клавишами.
Это наглядный тест того, как модель держит физику, а не только синтаксис. Сила Кориолиса, кривизна «земли» над головой и скорость вращения связаны формулами, которые легко переврать.
Открой и проверь сам: брось предмет и посмотри, уводит ли его в сторону. Если автор не вычитал расчёты, демка выглядит убедительно, но врёт в цифрах.
🔗 Подробнее
@nuancesprog #AI #JavaScript
👍4
Enter во время IME: 15 одинаковых багов в разных проектах
Разработчик за две недели влил 15 правок в open-source проекты с одной и той же ошибкой. Везде обработчик Enter не знал, что IME сейчас подбирает иероглифы.
Японец набирает чтение, жмёт Enter для выбора кандидата — и чат отправляет недописанную латиницу. Так ломались naive-ui, Vuetify, LibreChat, Misskey и чужие теги, поиск, переименование файлов.
Лечится проверкой
🔗 Подробнее
@nuancesprog #Frontend #JavaScript
Разработчик за две недели влил 15 правок в open-source проекты с одной и той же ошибкой. Везде обработчик Enter не знал, что IME сейчас подбирает иероглифы.
Японец набирает чтение, жмёт Enter для выбора кандидата — и чат отправляет недописанную латиницу. Так ломались naive-ui, Vuetify, LibreChat, Misskey и чужие теги, поиск, переименование файлов.
Лечится проверкой
if (e.isComposing || e.keyCode === 229) return; до любой отправки. В React читай e.nativeEvent.isComposing, а 229 нужен из-за Safari, где флаг бывает false.🔗 Подробнее
@nuancesprog #Frontend #JavaScript
👍3
Проверка банковских SMS арифметикой вместо доверия к тексту
В Нигерии процветают приложения, печатающие поддельные SMS о переводе. Разработчик собрал Alertproof: Gemma читает уведомление, а решение принимает обычный код.
Идея в том, что мошенник подделает всё, кроме твоего баланса. Каждое настоящее уведомление показывает новый баланс, равный прежнему плюс сумма, до копейки.
Модель только извлекает числа в JSON, и каждое обязано дословно встречаться в тексте. Подвох в том, что цепочка балансов рвётся при любой операции мимо приложения.
🔗 Подробнее
@nuancesprog #Security #JavaScript
В Нигерии процветают приложения, печатающие поддельные SMS о переводе. Разработчик собрал Alertproof: Gemma читает уведомление, а решение принимает обычный код.
Идея в том, что мошенник подделает всё, кроме твоего баланса. Каждое настоящее уведомление показывает новый баланс, равный прежнему плюс сумма, до копейки.
Модель только извлекает числа в JSON, и каждое обязано дословно встречаться в тексте. Подвох в том, что цепочка балансов рвётся при любой операции мимо приложения.
🔗 Подробнее
@nuancesprog #Security #JavaScript
👍1
Как Close показывает чужие HTML-письма и не ловит XSS
Close в 2014 году научился рендерить синхронизированные письма прямо в веб-приложении. Вместо санитайзера HTML они положили тело письма в
Санитайзеры ломают сложную вёрстку писем и не спасают от протечки CSS в основной интерфейс. Песочница iframe решает обе задачи сразу: стили изолированы, скрипты отключены атрибутом
В
🔗 Подробнее
@nuancesprog #Security #JavaScript
Close в 2014 году научился рендерить синхронизированные письма прямо в веб-приложении. Вместо санитайзера HTML они положили тело письма в
iframe через атрибут srcdoc.Санитайзеры ломают сложную вёрстку писем и не спасают от протечки CSS в основной интерфейс. Песочница iframe решает обе задачи сразу: стили изолированы, скрипты отключены атрибутом
sandbox.В
srcdoc команда дополнительно оборачивает письмо своими стилями и тегом <base> с target="_blank". Подвох в высоте: iframe не подстраивается под контент сам, её приходится считать вручную.🔗 Подробнее
@nuancesprog #Security #JavaScript
👍4
earstrip: триангуляция 3,7 млн полигонов за 489 мс
Команда GLOBUS выложила свой триангулятор полигонов earstrip под лицензией ISC. Это один заголовочный файл C++ и сборка WebAssembly с интерфейсом earcut.
Карта для GPU — это треугольники, и резать их приходится миллионами. В C++ earstrip быстрее earcut.hpp на 14%, в браузере — в 1,4–2,1 раза.
Выигрыш дало отсечение ушей вместо ограниченной триангуляции Делоне. Делоне даёт красивые треугольники, но плоской заливке их форма безразлична.
🔗 Подробнее
@nuancesprog #Tools #JavaScript
Команда GLOBUS выложила свой триангулятор полигонов earstrip под лицензией ISC. Это один заголовочный файл C++ и сборка WebAssembly с интерфейсом earcut.
Карта для GPU — это треугольники, и резать их приходится миллионами. В C++ earstrip быстрее earcut.hpp на 14%, в браузере — в 1,4–2,1 раза.
Выигрыш дало отсечение ушей вместо ограниченной триангуляции Делоне. Делоне даёт красивые треугольники, но плоской заливке их форма безразлична.
🔗 Подробнее
@nuancesprog #Tools #JavaScript
👍2