Типичный программист
✔
78.1K subscribers
3.78K photos
1.16K videos
14 files
8.43K links
Всё самое интересное по программированию

Разместить рекламу: @tproger_sales_bot

Правила общения: https://tprg.ru/rules

Другие каналы: @tproger_channels

Сайт: https://tprg.ru/site

VK: vk.com/tproger

Регистрация в перечне РКН: https://tprg.ru/mJwo
Download Telegram
Исследователи заставили современную электронику выдавать данные по радио

Метод InjectEave превращает случайные внутренние антенны устройства в канал утечки. На устройство направляют радиосигнал подходящей частоты. Нелинейные компоненты смешивают его с рабочими сигналами схемы, после чего наружу уходит излучение с данными. Без такого воздействия заметной утечки в опытах не обнаружили.

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

В демонстрации с интернет-телефоном они перехватили речь, клонировали голос и внедрили новую фразу в звонок в реальном времени. Для атаки нужно активно облучать цель и принимать ответное излучение: результаты пока относятся к исследовательской установке.
🔥12👍8❤5👀5🤪5😈3💘3🕊2🤷‍♀1👎1😨1
Kubernetes 1.37 перевёл rootless kubelet в beta

В релизе Kubernetes 1.37 kubelet разрешили запускать на хосте без прав root, внутри пространства пользователей Linux. Флаг KubeletInUserNamespace включён по умолчанию.

У kubelet становится меньше прав на хосте. Разработчики рассчитывают, что это сократит ущерб при побеге контейнера из изоляции.

Режим пока находится в beta: возможность уже доступна по умолчанию, но ещё не объявлена стабильной. Для эксперимента стоит отдельно проверить работу kubelet без root на своих узлах и не принимать beta за готовность к любой инфраструктуре.
👍12🎉5🥰2🤔2🙏2🕊2👀2✍1👌1🍓1🗿1
Почему max_connections не ускоряет PostgreSQL

Пять тысяч разрешённых соединений выглядят как запас мощности, но пропускную способность PostgreSQL определяют ядра и хранилище. max_connections решает другое: сколько серверных процессов база допустит до отказа и сколько общей памяти заранее выделит под их структуры.

На PostgreSQL 18.6 рост лимита со 100 до 5000 увеличил общую память со 150 до 389 МБ. При этом 17-е активное соединение на машине с 16 ядрами уже добавляет переключения контекста и очередь. А 400 активных запросов с тремя хеш-объединениями каждый могут одновременно запросить 1200 порций work_mem.

Поэтому лимит стоит считать как бюджет, а приложения подключать через PgBouncer в режиме пула транзакций. Для большинства производственных систем расчёт с учётом репликации, мониторинга и ручных подключений даёт 100–300 соединений.
🫡14👍5❤4🔥4👏4👎1😐1😴1👨‍💻1💘1💊1
Как быстрые хеш-функции ломаются на специально подобранных данных

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

Автор с помощью Claude Fable разобрал популярные функции из набора тестов SMHasher. У большинства нашлись входы с устойчивостью к коллизиям минимум на 20 бит хуже ожидаемой. Для CityHash64, FarmHash64 и MurmurHash3 удалось построить сколько угодно входов, которые сталкиваются при любом секретном ключе.

Интерактивное сравнение скорости и гарантий отделяет доказанные оценки от найденных контрпримеров. Практический вывод: если сервис принимает чужие данные, одной пропускной способности хеша недостаточно. Нужны доказанные гарантии, а ещё лучше проверенные в Lean.
❤10👍6🏆4✍3🔥2💯2🗿2🆒2😢1🤪1🙊1
Дрон научили ориентироваться механическими усами

В темноте, дыму и пыли камеры и лидар могут подвести. Исследователи Делфтского технического университета оснастили дрон легче 100 г двумя усами, чтобы он находил путь на ощупь.

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

Винты создают поток воздуха, поэтому бортовая программа отделяет турбулентность от касания. Ей хватает 34 КБ памяти, а точность остаётся миллиметровой. Такой сенсор может пригодиться маленьким поисково-спасательным дронам для обследования завалов без риска для людей и животных.
❤‍🔥18👍7🤣6❤4🤷4🎉3😢2👌1💔1😐1👨‍💻1
Как Canva разгрузила MySQL с помощью S3

При запуске сотни шлюзов Canva загружали из MySQL более миллиона записей об отозванных сессиях. Деплой превращался в одновременный набег на базу, а добавление реплик лишь временно смягчало проблему.

В разборе новой схемы загрузки кеша инженеры делят данные на 30-минутные сегменты в S3. Каждая запись занимает 16 байт, а сортировка позволяет искать её прямо в скачанном массиве, без преобразования в Java-объекты.

Несколько фоновых процессов дописывают сегменты через условные PUT-запросы: S3 принимает запись, только если объект не изменился после чтения. Выбор лидера уменьшает число конфликтов, но не гарантирует корректность: прежний лидер может приостановиться и вернуться после смены. В итоге кеш занял на 87,5% меньше памяти, а MySQL оставили две реплики для резервирования.
👏5👍3⚡1🥰1😁1🤔1🎉1👌1🤓1🤝1🤷1
Как в Rustrak ускорили обработку ошибок и снизили пиковую память

В трекере ошибок Rustrak задачи съедали память ещё до начала работы: каждая ждала своей очереди с состоянием на 5,5 КБ. Авторы нашли это при профилировании всплеска из 20 тысяч ошибок.

Теперь полное состояние задачи создаётся только после допуска к обработке. Заодно девять переходов между потоками на сохранение события заменили одним: запись файла и синхронизацию с диском выполняют вместе.

В тесте с SQLite пиковая память упала со 195 до 53 МБ, а скорость обработки выросла примерно с 510 до 1000 событий в секунду. Генератор нагрузки работал на той же четырёхъядерной машине. В разборе профилирования и правок есть и проверка аварийного восстановления: после перезапуска каждое подтверждённое событие обработалось ровно один раз.

#инструменты
😁4🎉3🤔2🤓2⚡1☃1🏆1💋1🤪1🦄1🙊1
Как собрать фаззер для поиска ошибок в регулярных выражениях на Rust

В старой версии библиотеки regex выражение .abb|b находило в строке zabb только b, хотя совпадала вся строка. Автор собрал фаззер, тест, который генерирует случайные входные данные, и нашёл ещё одну ошибку, прежде чем воспроизвести искомую.

В разборе с кодом автор сравнивает результаты regex и regex_lite на одинаковых выражениях и строках. Вместо огромных входных данных генерирует короткие строки, меняет набор букв и частоту операторов. Так проверяет сочетания нескольких возможностей, на которых могут возникать ошибки.

В последней версии ошибок не нашлось. Автор заранее знал искомый баг, поэтому эксперимент не доказывает превосходство случайных тестов над модульными. Зато показывает приёмы проверки алгоритмов через сравнение реализаций.

#инструменты
👍4😁3😘2❤1🤔1😴1👨‍💻1🙊1
Как Canva научила обработчики очередей замедляться при сбоях

За четыре часа сбоев облачного провайдера в очередь окончательно неудачных сообщений у Canva попало всего одно сообщение. Обработчик сам снижал нагрузку на сбоящие сервисы и набирал скорость после их восстановления.

Механизм встроили в библиотеку очередей: обработчик фиксирует успехи и ошибки, а контроллер по этим результатам сокращает число сообщений, которые можно обрабатывать одновременно. Остальная работа ждёт в очереди. Решение принимается локально, без дополнительных сетевых запросов.

В разборе Worker Backpressure команда сравнивает подход с фиксированными лимитами, полной остановкой запросов при сбоях и задержками повторных попыток. Там же разбирает два рабочих инцидента: короткие всплески ошибок и перегрузку на 32,5 часа.

#облака
❤4🔥3😁1🤔1🕊1😨1🤗1🆒1
Общая папка для работы Claude Code и Codex

Луи-Франсуа Бушар собрал заметки, инструкции-скиллы, скрипты и итоги встреч в Obsidian. Его связка устроена так:

Папка хранит исходные материалы и решения
↓
Индекс указывает, где искать данные для задачи
↓
Claude Code планирует работу
↓
Codex выполняет задачи по его вызову

В описании этого рабочего процесса Бушар объясняет, зачем даёт агенту сведения для конкретной задачи. Начать предлагает с общей папки, короткого индекса и одного повторно используемого скилла.

#ии #инструменты
👍3👎3🤗2🔥1😘1
💯56😁9❤5🎃4🐳2😎2🤷‍♂1🤷‍♀1☃1😇1🦄1
Зачем CPython предлагают Rust и почему начинают с zlib

Миллион строк C за один раз не перенести. Команда Rust for CPython предлагает начать с небольшого модуля zlib: он сжимает данные и широко используется при упаковке Python-пакетов. Замена на zlib-rs может ускорить почти каждый pip install, если предложение примут.

По предложенной дорожной карте реализация на Rust появится в Python 3.16 как опция, а версия на C останется запасной. Сроки условны, переход ещё не принят. Rust тоже не гарантирует отсутствие ошибок: команда планирует проверять код тестами, в том числе на случайных входных данных.

В разборе постепенного внедрения Rust есть и условия продолжения: поддержка всех платформ CPython, отсутствие заметного замедления и готовность разработчиков ядра работать с Rust.

#python
🤔11❤8🔥7💅3✍1☃1👎1🙏1👀1🗿1🦄1
Как нашли причину антивирусной тревоги в Tauri-приложении и заменили шифрование

Добавили шифрование файлов с аккаунтами, и Microsoft стал помечать приложение как троян. Так произошло с Roblox Account Manager. Сравнение старой и новой сборок сначала завело автора в тупик: набор подозрительных системных вызовов не изменился.

Тогда автор запустил git bisect: на каждом шаге собирал exe и проверял его через VirusTotal, сужая поиск до одного коммита. Тот добавлял sodiumoxide, библиотеку шифрования. Почему именно она вызвала тревогу, автор объясняет своей гипотезой о работе классификатора Microsoft.

В разборе замены на RustCrypto есть тест совместимости: новый код должен расшифровать данные, созданные старым. Файлы пользователей остались читаемыми, а exe перестал вызывать тревогу.

#безопасность
👍5❤2😁2🔥1👏1🤔1
🧑‍💻 Какие навыки помогают вам в разработке в 2026 году?

Что вы чаще используете в работе? В каких задачах помогает ИИ, а где проще справиться самостоятельно?

Мы решили собрать портрет современного разработчика — и приглашаем вас поделиться своим опытом. Расскажите, какие навыки вам пригодились и как вы используете ИИ. Если обходите его стороной, нам тоже интересно узнать почему.

Опрос анонимный и займёт около 5 минут. Результаты опубликуем в общем большом исследовании.

👉 Пройти опрос
🔥4🎉2🌭2❤1👍1😢1😐1😈1🆒1
Измеритель INP тоже может ошибаться

В SpeedCurve нашли баг в lux.js: обёртка передавала durationThreshold во вложенном options, хотя PerformanceObserver ждёт этот параметр на верхнем уровне. Браузер не видел настройку и применял стандартный порог 104 мс.

Что это меняло? Взаимодействия короче 104 мс не попадали в обычный Event Timing observer. Например, запись о событии длительностью 80 мс могла отсутствовать. Это могло влиять на рассчитанное INP и определение событий, которые его сформировали.

В lux.js 4.5.3 вложенность исправили и добавили браузерный тест. Перед сравнением графиков проверьте версию сборщика и отметьте момент обновления: распределение могло измениться из-за измерения, а не вашего релиза.

Разбор ошибки

#веб #производительность
😁2🤔2💯2🍌2❤‍🔥1👏1🐳1🤣1🍓1🍾1😈1
Как IRC-сеть из 1998 года пересобрали на Go и WebAssembly

28-летняя Yudum.NET теперь помещается в один исполняемый файл на Go: сервер чата, сайт и веб-чат работают в одном процессе с базой SQLite. Никнейм служит учётной записью на сайте, а старые IRC-клиенты по-прежнему подключаются.

Веб-чат тоже написан на Go: TinyGo компилирует его в WebAssembly для запуска в браузере. Один и тот же код проверяет ход в игре на сервере и рисует стол в чате. Цена решения: несколько мегабайт браузерного модуля и сборка, которая занимает минуты.

В разборе переписывания Yudum.NET есть и история борьбы с перезапусками: временный процесс обслуживает веб-запросы, пока запускается новая версия. Сайт не гаснет, но IRC-соединения ещё обрываются. Эту часть предстоит решить.

#веб
👍4🎉3🎄2🤷‍♀1🔥1😁1💋1😈1🎃1🆒1👾1
Почему доставка сообщения не гарантирует выполнение платежа

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

В схеме отслеживания завершения отправитель публикует команду и сохраняет идентификатор платежа со статусом PENDING, то есть ожидает результата. После выполнения обработчик отправляет подтверждение с тем же идентификатором. Получив его, отправитель меняет статус на COMPLETE: работа завершена.

Если остался PENDING, исход неизвестен: платёж мог сорваться, а мог пройти без обработанного подтверждения. В зависимости от сценария может потребоваться запросить результат у платёжной системы, прежде чем решать, повторять ли операцию. Такой контроль добавляет хранение состояний, компоненты и новые точки отказа.
❤3🤔2👎1💯1🍌1🗿1
Давайте сыграем в айтишную каламбурю!

Правила простые: берём любой термин, название компании или имя известного айтишника и делаем из него каламбур.

Я начинаю — вы подхватываете: Ада Лавпринглс
☃6🔥4👍2🗿1
Листаете ленту, открываете ролик, переходите в сообщество автора — всё внутри ВКонтакте. За этими привычными действиями стоят разные системы и команды. Каждой нужна возможность развивать свою часть продукта и выпускать обновления в собственном темпе.

В прошлом году ВКонтакте начала переход на сервисную архитектуру: пользовательские сценарии постепенно переносили в отдельные сервисы, пока продуктовые команды продолжали выпускать обновления. Для подготовки новых сервисов создали внутреннюю платформу разработки. Она автоматизирует типовые операции — теперь подготовка занимает часы вместо недель.
Трансформация затронула и веб-версию. Основные разделы перевели на SPA: браузер обновляет нужные части интерфейса без полной перезагрузки страницы. В результате страницы открываются на 25% быстрее, а переходы между разделами ускорились в 3,5 раза.

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

https://tproger.ru/articles/kak-perestraivat-produkt-kotorym-ezhednevno-polzuyutsya-65-milli
💊1