prog_stuff | Unsorted

Telegram-канал prog_stuff - Сохранёнки программиста

7565

Бесплатные лекции, курсы, книги, подкасты по программированию Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Другие наши проекты: https://tprg.ru/media

Subscribe to a channel

Сохранёнки программиста

Биргитта Бёкелер разбирает, превращается ли TDD в руках агента в ритуал без содержания

Материал входит в серию Exploring Gen AI, где технологи Thoughtworks публикуют результаты собственных экспериментов, а не обзоры чужих мнений. Автор — Distinguished Engineer с двадцатью с лишним годами в разработке и архитектуре.

Вопрос поставлен честно прямо в заголовке: театр или реальная польза. Разбирается в том числе вариант, что цикл красный-зелёный-рефакторинг в руках агента становится обрядом, который ничего не проверяет.

Стоит времени, если вы сейчас решаете, встраивать ли тесты в промпт или писать их после, и не хотите принимать это решение по ощущению.

Читать полностью…

Сохранёнки программиста

Горутины против потоков и событийных циклов: восьмая часть разбора конкурентных серверов

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

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

Читать можно подряд с первой части или точечно, если предмет знаком и нужно сравнение подходов. Ссылки на все части стоят в начале текста.

Читать полностью…

Сохранёнки программиста

Агентам дали писать стратегии, но не дали решать, что считать удачным результатом

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

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

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

Читать полностью…

Сохранёнки программиста

От первых сайтов на HTML до нейросетей — веб прошёл долгий путь, и SpaceWeb прошёл его вместе с рунетом все свои 25 лет. К юбилею компания вместе с Типичным программистом сделала анкету, где эта история рассказана между вопросами про спорт, друзей и обои на рабочий стол, а нужную атмосферу создают аська, скайп и биткоин из разных эпох.

В конце — небольшой взгляд в будущее, промокод на услуги SpaceWeb и результат: узнаешь свой цифровой профиль.

Читать полностью…

Сохранёнки программиста

Все агенты собраны из восьми способностей, а не из отраслевых рецептов: книга на 60 паттернов

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

Книга переупорядочена вокруг способностей. Их восемь: восприятие, рассуждение, планирование, память, работа с инструментами, координация, обучение и выравнивание. Любой работающий агент, от скрипта в cron, который сводит вам почту, до многоагентной системы, готовящей документы по слиянию, это композиция этих восьми в разных пропорциях.

Для каждого из 60 паттернов даны код, режимы отказа и сводные примеры. Объём книжный, так что это чтение на недели, а не на вечер.

Читать полностью…

Сохранёнки программиста

Задержка, пропускная способность или цена токена: карта компромиссов инференса LLM

Филип Кили из Baseten раскладывает все приёмы ускорения инференса на две группы. Одни двигают развёртывание вдоль кривой компромисса: размер батча (маленький даёт низкую задержку и дорогой токен, большой наоборот), tensor parallelism с дорогой all-to-all коммуникацией ради задержки, expert parallelism, который на широких MoE может занимать целую стойку. Другие сдвигают саму кривую: квантизация в MXFP4 и NVFP4, оптимизация ядер, speculative decoding (EAGLE-3, DSpark, DFlash), разнесение prefill и decode по разным воркерам.

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

@prog_stuff

Читать полностью…

Сохранёнки программиста

Сколько знаков в 52 факториала и как прикинуть это без калькулятора

Началось с бытового вопроса: насколько велико число перестановок колоды карт. Дальше Эли Бендерски задумался, как оценивать такие величины, не имея под рукой ни калькулятора, ни компьютера.

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

Жанр здесь не прикладной, а тот, ради которого такие блоги и читают: короткое погружение в тему, которая на работе не понадобится, но перестраивает интуицию про рост чисел.

Читать полностью…

Сохранёнки программиста

Двухчасовое расследование о том, откуда взялась фраза про преждевременную оптимизацию

Её полвека цитируют то как Кнута, то как Хоара, чаще всего чтобы осадить желание написать код побыстрее. Кейси Муратори собрал больше 200 исторических документов, от переписки Дейкстры времён «GOTO considered harmful» до отчётов конференций NATO 1968 года, и показал, при каких обстоятельствах фраза родилась и к чему её на самом деле применяли.

Попутно у Хоара в 1965 году нашлась конструкция, похожая на SSA-форму, а у Страуструпа в 1979-м приём, который сегодня называют dependency injection. В нашем канале Tproger разобрали подробнее.

@prog_stuff

Читать полностью…

Сохранёнки программиста

Стековый байткод против регистрового: замер на одном языке, одном железе и честной методике

Максим Шевалье-Буавер, в прошлом автор YJIT для Ruby, переписала VM своего языка Plush с стековой модели на регистровую и разложила, откуда взялось ускорение. Инструкция стала 64-битным словом с тремя операндами; a + b из трёх диспетчеризаций превратилось в одну. Сама смена модели дала 1,55 раза по геометрическому среднему, слитые сравнения-переходы, непосредственные операнды и свёртка констант добавили ещё 25%.

Методика: 11 чередующихся запусков на тест, медиана, повтор всего набора. Медиана ускорения 2,07 раза, максимум 3,37, тесты GC не сдвинулись. Против Lua 5.5.1 на fib быстрее на 24%. Главный урок автора: в интерпретаторе считайте инструкции, а не такты. Полный разбор на сайте.

@prog_stuff

Читать полностью…

Сохранёнки программиста

Один младший бит: как реализация FMA вскрыла одинаковую ошибку в Rust std, std::simd и musl

Shnatsel переносил формально верифицированный алгоритм fused multiply-add в библиотеку fearless_simd, добавил тесты на миллион субнормальных значений и получил расхождение. Дальше оказалось, что f32::mul_add в стандартной библиотеке Rust ошибается ровно так же, как и fmaf() в musl, а контрпример к первой версии патча нашла языковая модель.

Ошибка живёт в программной эмуляции FMA, на железе с аппаратной инструкцией её нет: затронуты старые Intel без AVX2, Hygon и 32-битный ARM. Автор не берётся оценить практический ущерб, но называет сценарий, где это больно: детерминированные симуляции, которые обязаны давать одинаковые биты на разных машинах. Проверка из трёх hex-чисел и состояние патчей на сайте.

@prog_stuff

Читать полностью…

Сохранёнки программиста

Форк SQLite с ветками и merge дошёл до беты, и авторы честно назвали цену записи

DoltLite заменяет в SQLite B-tree на content-addressed Prolly Tree, а всё остальное, от парсера SQL до тестового harness, оставляет родным. Из-за этого база получает Git-подобные операции: branch, merge, diff, rebase, cherry-pick, reset, push и pull на свой remote или DoltHub. 31 августа проект объявил бету и версию 0.50.0.

Цифры совместимости серьёзные: 100% sqllogictest из 5,8 млн запросов и 99,46% из 892 277 TCL-тестов самого SQLite. Оставшиеся 4809 расхождений упираются в архитектуру: нет rowid, chunk вместо page, нет WAL рядом с файлом.

Цена: в памяти чтение медленнее на 10%, запись на 60%; для файловых баз чтение на уровне SQLite, а вот мелкие autocommit-записи в 3,1 раза дольше, 400 мкс против 125. Каждое изменение порождает новые chunk с хешами, и на одиночной вставке это не амортизируется. Где такая база уместна, а где SQLite останется быстрее, разобрали на сайте.

@prog_stuff

Читать полностью…

Сохранёнки программиста

Интерпретатор WebAssembly ускорили в 2,2 раза, и автор объяснил каждую оптимизацию

Wasmi нужен там, где JIT запрещён или не помещается: плагины, микроконтроллеры, песочницы, смарт-контракты. Версия 2.0 по замерам проекта исполняет код в 2,2 раза быстрее 1.0 по геометрическому среднему, а пост Робина Фрайлера читается как учебник по устройству быстрых интерпретаторов.

Три источника ускорения: четыре режима dispatch вместо одного switch-loop (auto-dispatch сам выбирает threaded-код, где компилятор позволяет), новое IR с аккумуляторными регистрами вместо стековых смещений и append-only CodeMap, где вызов функции на горячем пути не делает ни одного lookup. Ячейки стека стали 64-битными, поэтому SIMD больше не стоит 8% обычному коду.

Отдельная история про компилятор: Rust 1.92 включил DestinationPropagation, и CoreMark у интерпретатора Stitch упал с 3000 до 2200. Похожую проблему нашли и в Wasmi, после исправления результат вырос с 2800 до 4200. Вывод: после обновления toolchain бенчмарки интерпретатора надо перепрогонять. Сравнение с Wasm3, WAMR и Wasmtime Pulley разобрали на сайте.

@prog_stuff

Читать полностью…

Сохранёнки программиста

Спрячьте задержку автодополнения между нажатием и отпусканием клавиши

Рюртьян Пул развивает Wirewiki — сервис для просмотра DNS-записей доменов, их истории, делегирования и настроек почты. Главная навигация там ищет среди 240 миллионов доменных имён, поэтому автор добился появления подсказок уже в следующем кадре.

Запрос уходит на keyDown, сразу после нажатия клавиши. Сервер получает набранный префикс и подготавливает варианты для всех допустимых следующих символов, а интерфейс показывает результат на keyUp. В бюджет попадают длительность нажатия, пауза до следующей клавиши и длительность следующего нажатия.

Автор набрал 100 доменов в обычном темпе и получил p99 в 121 мс. Задержку он считает от keyUp до готовности результата: p99 в 0 мс означает, что в 99% случаев данные приходят раньше отпускания клавиши. Для сравнения, экран с частотой 60 Гц обновляется каждые 16,7 мс.

Перерасход трафика ограничен алфавитом домена: 38 символов дают максимум (38 + 1) × 8 = 312 имён в ответе. На практике запрос приносит до 5 КБ, после сжатия — около 2,5 КБ. Приём стоит проверить там, где сеть быстрее пальцев пользователя.

Читать полностью…

Сохранёнки программиста

Посмотрите, как выглядят 128 килобайт, если каждый бит — отдельное ферритовое колечко

Spacelab — европейская лаборатория, которую возили в грузовом отсеке шаттла. Компьютеры NASA туда не поставили: программа была европейской, и внутри работали три одинаковых французских миникомпьютера Mitra 125 MS. Один вёл саму лабораторию, второй эксперименты, третий стоял резервом.

Памяти в таком компьютере 128 килобайт, и собрана она на магнитных сердечниках: каждый бит — крошечное ферритовое кольцо на пересечении проводов, а значение бита — направление его намагниченности. На фото блок из семи плат, занимающий примерно треть корпуса. Боковая панель снимается вместе с ним: тепло здесь отводится через плотный контакт с этой панелью, без всякого обдува.

Кен Ширрифф разобрал модуль до отдельных проводов: как устроены плоскости сердечников, что делает плата драйверов и почему чтение здесь стирает прочитанное значение, так что его каждый раз приходится записывать обратно.

@prog_stuff

Читать полностью…

Сохранёнки программиста

METR разобрала, как у неё украли API-ключ: приложение, написанное с ИИ, при сбое проверки прав пускало всех

Лаборатория, которая тестирует модели для крупных разработчиков, опубликовала отчёт о двух инцидентах. В марте исследователь поднял на личном EC2-инстансе маленькое веб-приложение за входом через Google. В коде была ошибка fail-open: если проверка авторизации не срабатывала, приложение считало пользователя допущенным. Инстанс несколько дней смотрел в интернет, атакующий вытащил ключ к моделям, добавил свой SSH-ключ и три недели гонял чужие запросы.

Заметить было трудно: за кредиты METR не платила деньгами, так что счёт не рос, а внутренняя панель METR не показывала отклонённые по лимитам запросы. В мае пришла вторая волна: сканирование, перебор паролей, попытки через OAuth-токены и ошибка в публичном просмотрщике транскриптов с read-only SQL.

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

@prog_stuff

Читать полностью…

Сохранёнки программиста

Вторая глава Logic for Programmers выложена целиком: предикаты, импликация и кванторы

Хиллель Уэйн писал книгу, потому что хороших материалов по логике именно для программистов не было. Книга вышла, и появилась обратная проблема: нет хороших бесплатных. Автор выложил вторую главу целиком в виде поста.

Глава называется ускоренным курсом и вводит понятия с нуля: предикаты, оператор импликации, множества и кванторы над ними. Автор подчёркивает, что многое читателю знакомо по опыту программирования, просто называется иначе.

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

Читать полностью…

Сохранёнки программиста

Асинхронный Rust в одном ряду с потоками и событийными циклами, а не сам по себе

Та же серия Эли Бендерски, часть седьмая: тот же набор задач конкурентного сетевого сервера решается средствами Rust.

Отдельная ценность в том, что асинхронный Rust обычно объясняют изнутри, через футуры и исполнители, и он выглядит вещью в себе. Здесь он попадает в общий ряд с потоками, событийными циклами и корутинами из предыдущих частей, и становится видно, чем именно он платит за свои гарантии.

В паре с восьмой частью, про Go, получается готовое сравнение двух подходов на одной задаче, написанное одним человеком в одинаковых условиях.

Читать полностью…

Сохранёнки программиста

Четыре джойна в SQL против одного запроса в графе: справочник по Neo4j и Python

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

Справочник ведёт от пустой базы до работающего графа знаний: загрузка настоящих данных из Python и запросы, на которых идея становится понятной.

Разобраны части, которые туториалы пропускают: как решить, что становится узлом, почему первая модель данных почти наверняка неверна, как ускорить загрузку и как читать план запроса, когда что-то тормозит.

Читать полностью…

Сохранёнки программиста

CSRF с нуля: почему POST в Spring Boot отдаёт 403 и почему отключать защиту не выход

Сценарий, с которого начинается текст, узнаваем: вы пишете REST API на Spring Boot, ловите неожиданные 403 на каждом POST и «чините» это строчкой .csrf(csrf -> csrf.disable()) в цепочке фильтров.

Справочник разбирает предмет снизу вверх: сначала механика браузера, из-за которой атака вообще возможна, потом сами атаки, и только затем реализация защиты в Spring Security.

Автор связывает материал со своим гайдом по OAuth 2.0, где параметр state упоминался вскользь как защита авторизационных потоков от CSRF. Здесь та же тема разворачивается целиком. Сохранять стоит тем, кто отвечает за аутентификацию на бэкенде.

Читать полностью…

Сохранёнки программиста

WhatsApp* классифицирует мошеннические сообщения на устройстве, не нарушая сквозное шифрование

Задача с виду противоречивая: распознать мошенническое сообщение и не прочитать переписку. Meta* публикует технический обзор Scam Alert до массового выката, вместе с ограниченной бетой, и приглашает исследователей безопасности его ломать.

Решение целиком на устройстве: содержимое сообщений не покидает телефон ради классификации и не отправляется автоматически ни в WhatsApp*, ни в Meta*, ни кому-либо ещё. Функция опциональна и включается пользователем.

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

*Компания Meta и её продукты признаны экстремистскими, их деятельность запрещена на территории РФ.

Читать полностью…

Сохранёнки программиста

«Zero-cost» compile-time информация о типах стоит экспоненциально, а runtime-таблица линейно

Джинджер Билл, автор языка Odin, объясняет, почему Odin форматирует вывод через RTTI, а не через генерацию кода на этапе компиляции. Таблица типов растёт линейно: N типов, N записей, одна процедура печати на все, ноль дополнительной работы у семантического анализатора. Её размер можно прочитать в бинарнике в байтах.

CTTI специализирует код под каждый тип и каждую комбинацию: сериализатор N типов в K форматов даёт N на K инстанциаций, и это повторяется в проверке типов, кодогенерации и размере бинарника. Цену этого никто не может назвать в цифрах, потому что она размазана по компилятору, зато её называют «бесплатной». Автор аккуратно разводит «известно на этапе компиляции» и «бесплатно перечислить на этапе компиляции»: это разные вещи.

@prog_stuff

Читать полностью…

Сохранёнки программиста

Выделите всю память при старте и никогда больше: как TigerBeetle защищается от перегрузки

Алексей Кладов (matklad) отвечает на письмо читателя, который получил use-after-free в матчере ордеров с пулом объектов, и выводит из этого два приёма из TigerStyle. Первый: никакой динамической аллокации после инициализации. Программа запускается с --orders-max=1_000_000, выделяет массив под миллион ордеров одной строкой и всё, что сверх лимита, отклоняет.

На возражение «а вдруг память ещё есть» ответ: а вдруг нет? Попытка выделить ещё один объект под нагрузкой заканчивается OOM-киллером, который снимает весь процесс с миллионом ордеров внутри, а то и супервизор. Со статическим лимитом система может не стартовать без памяти, но если стартовала, деградирует предсказуемо. По дороге разбирается, почему пул объектов одного типа превращает опасный use-after-free в скучный детерминированный баг.

@prog_stuff

Читать полностью…

Сохранёнки программиста

Модуль std ускорил сборку Seastar на 22% без единой правки в исходниках

Чуаньцы Сюй из команды Clang показал два способа подключить import std; к проекту, который об этом не знает. Preload заставляет компилятор загружать BMI модуля std перед каждой единицей трансляции через -fmodule-file. Module Map идёт дальше: файл std.modulemap подменяет #include <vector> и остальные STL-заголовки на import std; автоматически.

Замер на Seastar, Clang и libc++ из ветки 24, -j8, медиана из трёх прогонов. Wall-time: 92,21 с с заголовками, 81,09 с с Preload, 71,55 с с Module Map, то есть минус 12% и минус 22%. Пользовательское CPU-время упало с 655,7 до 497,5 с. Память при Preload выросла на 2,7%, при Module Map снизилась на 3,3%.

Из ограничений: нужен Clang 24 (в 23 автор ловил зависание), в module map нельзя включать заголовки с макросами вроде cassert, а заголовки пришлось пробросить симлинками. Полный патч к CMake лежит в ветке автора, разбор в блоге.

@prog_stuff

Читать полностью…

Сохранёнки программиста

Разработчик сделал бэкенд компилятора, чтобы написать игру для Game Boy на чистом Rust

Game Boy не является целью Rust даже на уровне Tier 3: процессор SM83 не поддерживается LLVM. Автор под ником zlfn начинал с SDCC и библиотеки GBDK, а закончил собственным форком LLVM с бэкендом Z80/SM83 и форком rustc с целью sm83. Теперь cargo-gb build собирает crate в ROM, а cargo-gb run сразу запускает эмулятор.

Внутри есть Rust-библиотеки для графики, звука, ввода и консоли, упаковка кода в банки по 16 КиБ и собственный линкер. Готовый ROM sprite.gb можно скачать и запустить в любом эмуляторе; исходник примера лежит в examples/sprite.

Автор предупреждает, что проект не тестировался вне его машины и это ранняя стадия. Но это редкий пример, когда «Rust везде» доказано не докладом, а бэкендом компилятора под восьмибитную приставку. Репозиторий на GitHub.

@prog_stuff

Читать полностью…

Сохранёнки программиста

Прототип Cloudflare ужал текст в кэше в 2,8 раза, потратив на это несколько процентов CPU

Казалось бы, текст в интернете и так сжат. Но по замерам Cloudflare около 71% текстовых ответов приходят от origin-серверов без Content-Encoding: сжимает уже edge, а на диск кэша объект ложится сырым. При этом HTML, JSON, CSS и JS дают 67,3% запросов и 22,3% байтов, а картинки и видео 21,4% запросов и 63,3% байтов, их пересжимать бессмысленно.

Прототип Cache Transcoding внутри Pingora сжимает подходящие ответы zstd уровня 3 при записи в кэш, между дата-центрами гоняет их сжатыми и распаковывает перед клиентом. Кодирование стоит 4,31 нс на байт, декодирование 1,56 нс, коэффициент 2,834x на двух тестовых объектах, а не на всём кэше. Порог 4 КиБ отсёк мелочь и потерял всего 1% выигрыша.

Главная фраза статьи: стоимость кодирования платится один раз, когда объект попадает в кэш. Приём переносится на nginx с proxy_cache и Varnish без изменений в идее; порядок действий и где считать CPU разобрали на сайте.

@prog_stuff

Читать полностью…

Сохранёнки программиста

Утечку горутин теперь ищет сборщик мусора: как устроен новый профиль в Go 1.27

Обычный goroutine-профиль показывает, сколько горутин заблокировано, но не говорит, проснутся ли они. Команда Go объяснила, как профиль goroutineleak решает это через достижимость: горутина живая, если она не заблокирована или если канал либо мьютекс, на котором она ждёт, достижим из другой живой горутины. Всё, что осталось недостижимым после обхода, разбудить некому.

На схеме из блога видно, куда это встроено в маркировку GC. Худший случай, цепочка горутин, каждая из которых держит примитив следующей, даёт O(n²) за цикл, поэтому профиль советуют снимать раз в несколько часов, а не постоянно. Не ловит ожидание сети, файлов и самодельных спинлоков. Пример с 116 зависшими воркерами и что включить у себя, на сайте.

@prog_stuff

Читать полностью…

Сохранёнки программиста

Не всё же работать, иногда можно и поиграть.

Разобрали пять способов пополнения баланса Steam. Один зачисляет деньги на кошелёк по логину за одну-две минуты с комиссией около 6%. Другой показывает итоговую сумму ещё до оплаты и подходит для регулярных небольших пополнений. Третий — маркетплейс, где условия зависят от выбранного продавца, но сделки защищены гарантиями площадки. Четвёртый предлагает пополнение и по логину, и через продажу игровых предметов почти без комиссии. Пятый не берёт свою комиссию, но добавляет разницу за счёт курса конвертации.

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

Читать полностью…

Сохранёнки программиста

JetBrains не пропатчила собственный TeamCity, и через него вынесли бэкап сервиса Cadence, AWS-учётки и файлы из S3

Компания обновила отчёт об инциденте. Cadence, облачный сервис для запуска вычислений из PyCharm, использовал TeamCity для оркестрации задач. В нём была CVE-2026-63077 с выполнением команд без аутентификации, и с 8 по 24 августа атакующие сидели на api.cadence.jetbrains.com. Обнаружили 23-го, отключили 24-го. Формулировка JetBrains: «сервер должен был быть пропатчен, но не был».

Что утекло: логины, имена, почта и IP пользователей; полный бэкап сервера за 2024 год; AWS IAM-пользователи с учётными данными; файлы в S3-бакетах JetBrains. Мог быть доступен исходный код, который пользователи синхронизировали из PyCharm. Затронуты ли бакеты клиентов, компания пока не установила.

Рекомендация JetBrains тем, кто подключал Cadence: считать скомпрометированным всё, к чему у сервиса был доступ, от ключей облаков до SSH и ключей подписи. Хронологию и список секретов на замену разобрали на сайте.

@prog_stuff

Читать полностью…

Сохранёнки программиста

Один параметр readahead сократил обращения к диску в 12 раз, а io_uring тут ни при чём

Фернандо Симойнс разбирал, почему его встраиваемая СУБД на io_uring не выигрывала у обычного чтения на сканах. Тест: запрос Q6 из TPC-H по таблице в 1,2 GiB, файл открыт с O_DIRECT, запросы на чтение уходят в очередь io_uring.

Без упреждающего чтения база отправила 195 тысяч запросов по 4 KiB, и почти столько же дошло до устройства: ядру нечего было склеивать. С окном readahead в 32 страницы запросов в очереди стало даже больше, 218 тысяч, но до диска добралось около 16 тысяч. Ядро объединило 93% соседних чтений, средний запрос вырос с 4,37 до 56,53 KiB.

Цена тоже есть: поток sqpoll, который опрашивает очередь вместо системных вызовов, съел 65% циклов процессора. Вывод автора в том, что io_uring не ускоряет сам по себе, а только даёт очередь, и без прогрева этой очереди последовательными чтениями выигрыша нет.

@prog_stuff

Читать полностью…

Сохранёнки программиста

Ваш бинарник в Alpine может быть на 26% медленнее из-за libc, а не из-за кода

musl — лёгкая libc, на которой собраны образы Alpine и самодостаточные статические бинарники «один файл — и работает». Джонатан Эллис, сооснователь DataStax и многолетний глава проекта Apache Cassandra, замерил цену этого удобства на своей рабочей нагрузке.

Со штатным аллокатором musl проигрывает разгромно, причём на обычных четырёхъядерных машинах, а не только под высокой конкурентностью. Замена на mimalloc убрала большую часть разрыва, но 26% остались: профилирование указало на базовые процедуры работы с памятью внутри самой libc.

В нашем канале «Tproger» разобрали подробнее, включая то, что автор оставил для musl.

Читать полностью…
Subscribe to a channel