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

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

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

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

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

VK: vk.com/tproger

Регистрация в перечне РКН: https://tprg.ru/mJwo
Download Telegram
Как поймать утечку целевой переменной до того, как поверить R² 0,998

Модель получила пять колонок из публичного набора CDC и почти идеально предсказала шестую: коэффициент R² достиг 0,998. Результат выглядел как успех, пока не выяснилось, что CDC вычислял целевую колонку из тех самых пяти. Модель не нашла закономерность в реальном мире, а восстановила готовую формулу.

Так работает утечка целевой переменной: признаки уже содержат ответ. Автор описал происхождение колонок в YAML-манифесте, где для каждой вычисляемой величины указаны исходные данные. Затем написал Python-линтер, который обходит этот граф зависимостей и отклоняет признаки на пути к целевой колонке или от неё.

В практическом разборе утечки есть воспроизводимый эксперимент на данных CDC, код проверки, обработка битых входных файлов и запуск линтера при каждом пуше через GitHub Actions.
🤔5🌭3🤷‍♂2👍2😁2⚡1👌1🍾1😭1🎄1😘1
Открываете видео. В одном варианте оно начинается сразу, а изображение постепенно становится чётче. В другом — нужно подождать три секунды, зато картинка будет чёткой с первого кадра.

Как вам удобнее?
Anonymous Poll
26%
Начать сразу, чёткость подстроится.
45%
Подождать три секунды ради чёткой картинки.
23%
Зависит от того, что смотрю.
6%
Для меня особой разницы нет.
👏4😁3🕊3❤2🔥2😭2🙉2🤩1💯1🍌1🤷1
Как HLS запускает видео до полной загрузки

В HLS ролик разбит на независимые сегменты, обычно по 2–10 секунд. Плеер запрашивает их по HTTP и может начать воспроизведение, получив первые части и не дожидаясь всего файла.

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

Разбор пригодится, когда нужно понять поведение веб-плеера: время старта зависит от доставки первых сегментов, а качество может меняться уже по ходу просмотра. Для зрителя это разные стороны опыта: когда начинается воспроизведение и как меняется изображение после старта.
🤔6👨‍💻5❤3👏3🤯2😐2🍓2😈2🙈2✍1😘1
Forwarded from Веб-страница
Как поручить ИИ миграцию сайта и не потерять 400 страниц

Сайт с сотнями маршрутов, формами, редиректами и старым кодом автор перенёс на Astro за две недели. Он запускал не больше двух агентов параллельно, чтобы проверять результат до размножения ошибок.

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

В разборе миграции полезен сам метод: дробить работу на задачи с критериями приёмки и оставлять продуктовые решения человеку.
👍7❤4👏4🤔4🎉2🌚2🍾2🤩1🕊1🍓1😴1
Переход на ветку в присланном проекте запустил бы вредоносный Git-hook

Разработчику Фрэнку Уайлсу написали под видом заказчиков приложения и предложили обсудить проект. Перед созвоном его попросили изучить спецификацию в папке на Dropbox и подписать соглашение о неразглашении (NDA), уточнив, что сам документ лежит в отдельной ветке репозитория.

Ловушка строилась на передаче каталога .git внутри обычной папки. Стандартная команда git clone не копирует клиентские хуки с удалённого сервера из соображений безопасности, но в присланной директории уже лежал исполняемый файл .git/hooks/post-checkout. При вызове git checkout этот скрипт обращался к Vercel, скачивал бинарник под текущую операционную систему, делал его исполняемым, запускал и удалял себя.

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

@tproger
💯17❤12🤔10👀5👾3😐2🌭1💋1🤓1🎃1🤪1
18 тысяч тестов нашли то, что пропустили 185 обычных

При переносе robfig/cron с Go на Rust код компилировался, а все 185 модульных тестов проходили. Затем одинаковые расписания прогнали через обе реализации и сравнили результаты в 18 тысячах точек. Так вскрылась разница при переводе часов: несуществующее 02:30 Go переносил на 03:30, а библиотека chrono-tz сообщала, что такого локального времени нет.

В Rust пропущенный час стали сдвигать вперёд, после чего сравнительные тесты не нашли ни одного расхождения. Код проверки и история переноса показывают полезный подход: совместимость порта стоит доказывать одинаковым поведением на сложных входных данных, а не успешной сборкой.
👍8🍾7🎉5🥰3👏3🤗3🔥2🏆2😈2😴2🌭1
Исследователи заставили современную электронику выдавать данные по радио

Метод 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 КБ памяти, а точность остаётся миллиметровой. Такой сенсор может пригодиться маленьким поисково-спасательным дронам для обследования завалов без риска для людей и животных.
❤‍🔥19👍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 выполняет задачи по его вызову

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

#ии #инструменты
👎6👍3🤗2🔥1😘1
💯61😁14❤6🎃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 перестал вызывать тревогу.

#безопасность
👍6❤2😁2🔥1👏1🤔1