Сохранёнки программиста
Открыть в Telegram
Заметки и ссылки на будущее, чтобы изучить когда будет время. Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Другие наши проекты: https://tprg.ru/med
Больше6 515
Подписчики
+224 часа
-77 дней
-3130 дней
Загрузка данных...
Похожие каналы
Облако тегов
Входящие и исходящие упоминания
---
---
---
---
---
---
Привлечение подписчиков
октябрь '26окт. '26
октябрь '26
+12
в 0 каналах
сентябрь '26
+65
в 6 каналах
Get PRO
август '26
+28
в 2 каналах
Get PRO
июль '26
+26
в 3 каналах
Get PRO
июнь '26
+48
в 2 каналах
Get PRO
май '26
+70
в 0 каналах
Get PRO
апрель '26
+30
в 0 каналах
Get PRO
март '26
+47
в 5 каналах
Get PRO
февраль '26
+57
в 14 каналах
Get PRO
январь '26
+38
в 2 каналах
Get PRO
декабрь '25
+46
в 4 каналах
Get PRO
ноябрь '25
+45
в 2 каналах
Get PRO
октябрь '25
+40
в 7 каналах
Get PRO
сентябрь '25
+26
в 3 каналах
Get PRO
август '25
+41
в 1 каналах
Get PRO
июль '25
+46
в 0 каналах
Get PRO
июнь '25
+38
в 2 каналах
Get PRO
май '25
+68
в 5 каналах
Get PRO
апрель '25
+49
в 1 каналах
Get PRO
март '25
+63
в 1 каналах
Get PRO
февраль '25
+69
в 2 каналах
Get PRO
январь '25
+72
в 4 каналах
Get PRO
декабрь '24
+46
в 1 каналах
Get PRO
ноябрь '24
+104
в 6 каналах
Get PRO
октябрь '24
+73
в 4 каналах
Get PRO
сентябрь '24
+87
в 3 каналах
Get PRO
август '24
+204
в 4 каналах
Get PRO
июль '24
+86
в 4 каналах
Get PRO
июнь '24
+77
в 4 каналах
Get PRO
май '24
+75
в 4 каналах
Get PRO
апрель '24
+68
в 3 каналах
Get PRO
март '24
+65
в 4 каналах
Get PRO
февраль '24
+50
в 0 каналах
Get PRO
январь '24
+64
в 1 каналах
Get PRO
декабрь '23
+59
в 2 каналах
Get PRO
ноябрь '23
+3 534
в 33 каналах
Get PRO
октябрь '23
+55
в 1 каналах
Get PRO
сентябрь '23
+71
в 0 каналах
Get PRO
август '23
+69
в 0 каналах
Get PRO
июль '23
+57
в 0 каналах
Get PRO
июнь '23
+180
в 0 каналах
Get PRO
май '23
+73
в 0 каналах
Get PRO
апрель '23
+93
в 0 каналах
Get PRO
март '23
+65
в 0 каналах
Get PRO
февраль '23
+113
в 0 каналах
Get PRO
январь '23
+68
в 0 каналах
Get PRO
декабрь '22
+86
в 0 каналах
Get PRO
ноябрь '22
+90
в 0 каналах
Get PRO
октябрь '22
+117
в 0 каналах
Get PRO
сентябрь '22
+134
в 0 каналах
Get PRO
август '22
+787
в 0 каналах
Get PRO
июль '22
+119
в 0 каналах
Get PRO
июнь '22
+90
в 0 каналах
Get PRO
май '22
+157
в 0 каналах
Get PRO
апрель '22
+131
в 0 каналах
Get PRO
март '22
+117
в 0 каналах
Get PRO
февраль '22
+198
в 0 каналах
Get PRO
январь '22
+149
в 0 каналах
Get PRO
декабрь '21
+5 099
в 0 каналах
Get PRO
ноябрь '21
+927
в 0 каналах
Get PRO
октябрь '21
+1 849
в 0 каналах
| Дата | Привлечение подписчиков | Упоминания | Каналы | |
| 06 октября | 0 | |||
| 05 октября | +2 | |||
| 04 октября | +1 | |||
| 03 октября | 0 | |||
| 02 октября | 0 | |||
| 01 октября | +9 |
Посты канала
Go расширил экспериментальный SIMD без ассемблерных вставок
В Go 1.27 разработчики представили пакет
simd/archsimd (включается флагом GOEXPERIMENT=simd): эксперимент для amd64 (AVX, AVX2, AVX-512) начался в 1.26, а в 1.27 добавили arm64 (NEON) и wasm (128-битный SIMD). Вместо си-интринсиков предложены методы вроде ShiftAllLeft, а выражение x.Add(y).Masked(m) на AVX-512 компилируется в одну инструкцию VPADD. Разницу платформ учли в именах: PermuteOrZero на amd64 обнуляет байт при отрицательном индексе, а LookupOrZero на arm64 и wasm обнуляет байт при любом индексе вне диапазона от 0 до 15.
Пример из статьи — разворот порядка бит в байтах через матричное умножение GFNI константой 0x8040201008040201: 64 байта обрабатываются за один шаг без таблиц поиска и сдвигов. Также авторы сформулировали три правила для надежности и скорости.
Инструкции требуют проверок фич CPU (archsimd.X86.AVX512() и других): иначе на неподдерживаемом процессоре программа упадет с SIGILL, а компилятор не сможет объединять операции. Границы стрид-цикла советуют писать как i < len(src)-v.Len()+1, чтобы оптимизатор убрал проверки среза. Наконец, векторы не стоит заворачивать в большие структуры или массивы: ABI Go пока выгружает крупные композитные типы из регистров в память.
@prog_stuff| 2 | Отредактировал снимок билета без сброса криптографической даты
В стандарте C2PA подпись связывает провенанс с содержимым, а штамп времени фиксирует создание подписи. Но спецификация позволяет исключать произвольные диапазоны байтов из расчёта хеша привязки.
Дэвид Бьюкенен показал, как обойти защиту: он исключил из расчёта весь файл целиком. Хеш изображения превратился в хеш пустой строки, поэтому изменение пикселей не нарушало подпись с прежним штампом времени. Для демо автор снял лотерейный билет до тиража, а после публикации результатов вписал выигрышные числа.
Сервер времени работал штатно, подпись корректна, а выигрыш остался демонстрационным. В эксперименте автора проверка подписи проходит: валидаторы принимают манифест, дата предшествует тиражу, хотя изображение подписью не защищено. Инженерный урок: исключения из хеша должны строго ограничиваться стандартом и валидаторами, иначе заверяется пустота.
@prog_stuff | 260 |
| 3 | Как искать баги, которые не воспроизводятся в тестах
В обстоятельном разборе трёх расследований повреждение SQLite, потеря сообщений в TCP-сервисе и гонки в биллинге сводятся к одной методике: редкий сбой ищут телеметрией из рабочей среды, а не догадками.
Гонка между контрольной точкой SQLite и записью прожила минимум 16 лет. В TCP-сервисе четыре счётчика показали потерю: сервер разобрал 100 000 строк, но отправил 99 987 ответов, потому что принимал вызов read() за готовое сообщение.
Ставьте счётчики на границах слоёв, меняйте по одной переменной и подтверждайте исправление положительным сигналом. Читать бэкенд-разработчикам и инженерам эксплуатации, которые расследуют редкие сбои в продакшене. | 253 |
| 4 | Producer-Consumer в Java, Go и Rust: как выбрать уровень решения
Разбор трёх способов связать производителей и потребителей через ограниченный буфер. Выбор зависит от требований к задержке, а не от языка.
В Java блокирующая очередь останавливает производителя при заполненном буфере, в Go это делает буферизированный канал, в Rust кольцевой буфер с атомарными операциями позволяет убрать блокировки.
Сравнение трёх уровней решения пригодится разработчикам многопоточных систем. Начинайте со стандартной очереди, а атомарные алгоритмы выбирайте под измеренный предел задержки. | 254 |
| 5 | Как искать нарушения IEEE 754 в математических ядрах ИИ-ускорителей
Обстоятельный разбор аудита tt-metal показывает, почему случайные тесты не заменяют таблицу особых значений. Функция ttnn.atan2 для +∞ и +0 возвращала 0 вместо π/2: конечный диапазон тестов этот случай не создавал.
Карта расследования:
1. Заранее записать эталон для ±0, ±∞, NaN и значений у границ диапазона;
2. восстановить алгоритм ядра и вручную провести через него каждый случай;
3. заменить ошибочную проверку min == 0 на max == 0 во всех трёх аппаратных копиях;
4. закрепить точные входы детерминированным тестом.
В полном разборе поиска и исправления ошибки ценен порядок работы: спецификация идёт раньше кода, а крайние значения становятся регрессионными тестами. Читать разработчикам вычислительных библиотек и ML-инфраструктуры, которые проверяют численную корректность ускорителей. | 284 |
| 6 | Как ИИ меняет большие миграции: опыт Asana, Airbnb и Uber
В обстоятельном разборе крупных миграций важно сравнение процессов: срок одной компании нельзя переносить в свой план.
Asana начала перенос 4 000+ файлов с Enzyme на React Testing Library в 2024 году, обработала около 25%, а остаток завершила с ИИ за две недели и $12 000. Пять лет до этого были сроком низкоприоритетной миграции, а не непрерывной работы команды.
Сначала спроектируйте проверку результата, затем оценивайте, сколько типовых изменений можно поручить ИИ. | 282 |
| 7 | Как переводить целые книги с LLM и не терять контекст
Практический разбор Python-пайплайна для EPUB и PDF. Книгу делят по главам, затем на фрагменты по 2 000–4 000 токенов. В новый запрос обычно добавляют два последних абзаца только как контекст и словарь имён и терминов: так связность сохраняется без повторного перевода.
В разборе пайплайна есть код для подсчёта токенов и разбиения абзацев. Внутри главы запросы идут по очереди: следующий зависит от предыдущего. Параллельно обрабатывают разные книги. Для романа на 100 000 токенов авторы приводят ориентир: около 30 запросов и 4–6 минут.
Сохраните разбор, если работаете с длинными документами. Инженерный вывод: перекрытие фрагментов и отдельная память о терминах улучшают связность, но зависимые части придётся обрабатывать по очереди. | 308 |
| 8 | Почему 118 зелёных тестов не спасли MQTT-брокер на Rust
Обстоятельный инженерный разбор MQTT-брокера, написанного на Rust без сторонних пакетов. 118 автоматических тестов прошли, но mosquitto_pub в режиме доставки QoS 1 ждал подтверждения четыре секунды и завершался по тайм-ауту.
Тесты проверяли кодирование пакета подтверждения PUBACK, однако обработчик вообще его не отправлял. После разделения реестра тем на четыре сегмента вскрылся второй сбой: подписка sensors/+/temp и публикация sensors/kitchen/temp попадали в разные сегменты.
В разборе BlitzBroker есть и замер: около 495 тыс. сообщений в секунду против 402 тыс. у одного сегмента.
Читать разработчикам сетевых протоколов и интеграционных тестов. Проверяйте собранный бинарник независимым клиентом: подтверждения, подписки с подстановкой и переполнение очередей. | 300 |
| 9 | Как запускать асинхронное GRPO без общей машины
Обстоятельный разбор рабочей системы: тренер с LoRA и серверы генерации работают в отдельных Hugging Face Jobs, без общей машины и межузлового обмена через NCCL.
Тренер кладёт адаптер в объектное хранилище, которое каждый Job видит как файловую систему. Прокси добавляет авторизацию, выбирает реплику, где уже вычислено начало запроса, и сообщает всем репликам о новой версии.
Адаптер ранга 1 для модели на 1,5 млрд параметров занимает несколько мегабайт против примерно 3 ГБ у полной модели. При max_staleness=4 нужны шесть слотов LoRA, иначе vLLM может вытеснить версию с незавершёнными запросами.
Схема и пять последовательных прогонов показывают, где искать узкое место: 500 шагов удалось сократить с 3 часов 27 минут до 53 минут. Читать ML-инженерам, которые разносят обучение и генерацию по отдельным машинам. | 308 |
| 10 | Как исследовать легаси-код с ИИ до первого рефакторинга
Гайд по «археологии» незнакомой системы: странное условие или повторный расчёт могут хранить бизнес-исключение либо внешний контракт. ИИ здесь нужен для поиска вопросов, а не мгновенной переписи кода.
Начните с карты репозитория и точек входа: HTTP-запросов, фоновых задач, скриптов, импортов и вебхуков. Каждый вывод модели должен ссылаться на конкретные файлы, а сомнения нужно отмечать явно.
Готовые запросы к ИИ и маршрут анализа пригодятся при миграции или работе со старым проектом. До рефакторинга составьте проверяемую карту системы и список открытых вопросов. | 304 |
| 11 | Как устроена криптография Ethereum-кошелька на Go
Статья о цепочке «создать ключ, получить адрес, подписать транзакцию»: автор собирает учебный CLI-кошелёк на Go и показывает детали, от которых зависят совместимость и безопасность.
В практическом разборе разбираются BIP39, путь BIP44 и соглашения для поля v, защищающего транзакции от повторного воспроизведения.
Тест «зашифровали и расшифровали» не нашёл ошибку в параметрах scrypt: обе операции повторяли её. Нужен эталонный набор данных.
CLI создан для обучения, не для реальных средств. Читайте, если хотите проверить реализацию Ethereum-стандартов в Go. | 324 |
| 12 | Как вынести тени в отдельные проходы Custom SRP в Unity
Обстоятельное продолжение серии о собственном конвейере рендеринга на Unity 6000.5.8f1. Рефакторинг ведут поэтапно: после каждого раздела тени остаются рабочими, поэтому материал читается как карта безопасного изменения архитектуры.
Сначала объект Shadows уходит из LightingPass под управление CameraRenderer. Затем LightingPass получает структуру Handles и возвращает только буферы освещения. После появляется отдельный ShadowsPass: он строит списки отрисовки, запускает рендеринг теней и отдаёт их дескрипторы.
Дальше код из Shadows переносят в новый проход, чтобы затем разделить обработку направленных и остальных источников света.
Разбор с правками кода полезен тем, кто уже строит Custom SRP. Ориентир для рефакторинга: разделяйте владение состоянием и запись проходов небольшими шагами, проверяя тени после каждого. | 305 |
| 13 | Как настроить распределённую трассировку Java-микросервисов с OpenTelemetry
Обстоятельный разбор OpenTelemetry показывает, как связать путь запроса через Java-микросервисы и найти сервис, запрос к базе или внешний вызов, который добавляет задержку.
Карта материала:
1. почему разрозненные логи и метрики не восстанавливают путь запроса;
2. как SDK собирает трассы, метрики и логи, а процессоры фильтруют и группируют их;
3. как подключить Maven, экспорт по OTLP, Jaeger и собственные участки трассы.
Примеры рассчитаны на Spring Boot 3.x и OpenTelemetry 1.35.0: стартер автоматически охватывает HTTP, JDBC, JPA, Kafka и RabbitMQ. Локальный Jaeger запускается через Docker Compose; бизнес-операции можно размечать собственными участками трассы.
Подойдёт Java-бэкендерам и SRE: на тестовом стенде проверьте сквозной идентификатор trace_id, а перед рабочей средой пересмотрите выборку в 100%. | 333 |
| 14 | Как собрать GraphRAG для данных ServiceNow на Python и Neo4j
Обстоятельная книга о пути от данных ServiceNow до ответов языковой модели. Python читает записи, Neo4j связывает их в граф, а найденные сущности становятся контекстом для ответа.
На 39 заранее записанных вопросах автор сравнивает восемь методов извлечения: от ключевых слов до обхода графа. Ни один не ответил на исходный вопрос книги.
Материал пригодится разработчикам поиска и внутренних баз знаний: он показывает, как заранее определить тесты, сравнить подходы и зафиксировать провалы. | 320 |
| 15 | Почему одинаковый nvJPEG2000 даёт разные результаты в тестах
Обстоятельный разбор показывает, как границы таймера и подача кадров меняют результаты nvJPEG2000 на RTX 4090. Асинхронная очередь GPU делает методику частью результата.
В образце NVIDIA декодирование замеряют CUDA-событиями корректно, но разбор сжатого потока считают в целых секундах. Миллисекунды превращаются в ноль, поэтому число охватывает лишь часть работы. В подробном разборе методики авторский стенд включает оба этапа; код и логи открыты.
Есть и второй подвох: восемь потоков с двумя кадрами в работе дают 16 одновременных задач, хотя пакетного вызова у библиотеки нет. Разбор пригодится разработчикам GPU-конвейеров и авторам бенчмарков: сверяйте не только кадры в секунду, но и границы таймера, синхронизацию и число активных кадров. | 328 |
| 16 | Как отсекать партиции PostgreSQL при поиске не по ключу разбиения
Таблица событий разбита по времени, но запрос по session_id обращается ко всем партициям. Локальный индекс ускоряет поиск в каждой, однако их число не сокращает: при сотне партиций это похоже на запрос к сотне таблиц.
Приём применим, когда события только добавляются, ID сессий растут последовательно, а сессии обычно длятся минуты или часы. Тогда ID связан со временем: для каждой партиции можно задать его диапазон через CHECK. Оптимизатор исключит партицию, где нужного ID быть не может. В примере для ID 1000 сканируется только партиция 2025 года вместо двух.
В обстоятельной статье Хаки Бениты разобраны локальные и глобальные индексы, выбросы и схема «пробелы и острова». Материал пригодится тем, кто выбирает ключ разбиения таблицы: проверьте связь данных и план через EXPLAIN, прежде чем закреплять диапазоны ограничениями. | 341 |
| 17 | Go 1.27: что проверить перед обновлением сервисов
Практический обзор Go 1.27 отделяет ускорение после пересборки от изменений, которые требуют проверки кода. Для типичных серверных нагрузок автор приводит прирост 3–5%, для отдельных микротестов до 10%. Причины: более точное встраивание функций компилятором и меньше расходов на выделение памяти.
Отдельно разобраны сборщик мусора для сервисов с сотнями гигабайт живых данных и встроенная функция clear. Она очищает срезы и карты без нового выделения памяти, что пригодится при повторном использовании буферов. Данные DWARF помогают отладчику лучше показывать переменные, а go mod tidy оставляет меньше шума в изменениях go.mod.
В практическом гайде на DEV Community можно сверить детали перед обновлением. Сохраните его, если поддерживаете Go-сервисы: пересоберите стенд и сравните скорость, паузы сборщика мусора и отладку на своей нагрузке. | 334 |
| 18 | Как Uber переписала шардирование Schemaless на Go без простоя
Подробный технический разбор миграции хранилища. Материал ценен схемой перехода между реализациями: новая сначала пропускала запросы к старой, затем команда переносила по одной операции.
Карта материала:
1. чтение выполняли обе реализации, после чего ответы сравнивали;
2. долю проверки меняли настройкой, поскольку она удваивала запросы к узлам хранения;
3. запись проверяли интеграционными тестами и тестовым трафиком: один запрос мог успешно выполниться лишь раз.
После миграции медианная задержка всех запросов уменьшилась на 85%, 99-й перцентиль на 70%, загрузка процессора более чем на 85%.
В разборе Uber Engineering стоит изучить совместимость и переключение долей трафика. Для критичного сервиса заранее разделите проверки чтения и записи. | 352 |
| 19 | Как агенты тестируют код и почему одного промпта мало
В исследовании агенты реализовывали Zstd на Rust и по указанию применяли TDD (разработку через тесты), фаззинг, тестирование свойств или формальные методы. Автор сравнил 26 вариантов промпта и 4 навыка, по 80 запусков на условие и уровень рассуждений.
Режим без дополнительных инструкций оказался выше среднего. На максимальном уровне фаззинг и тестирование свойств были чуть лучше формальных методов, а рекомендованные навыки и TDD показали слабые результаты.
Агенты доказывали малозначимые свойства или перебирали случайные данные, часто попадая в отбраковку. Тест с 4 одинаковыми входными потоками не замечал их перестановку. Исследование How well do agents use test/verification techniques? стоит прочитать тем, кто принимает агентный код: проверяйте, какую ошибку способен обнаружить тест, а не только зелёный результат. | 360 |
| 20 | Как устроена база данных: собираем клон SQLite на C
Это обстоятельная серия для тех, кому знаком SQL, но путь данных от запроса до файла скрыт за интерфейсом СУБД. Автор строит клон SQLite с нуля на C и документирует каждый слой. Всего 15 частей: маршрут идёт от цикла чтения команд и компилятора SQL к многоуровневому B-дереву.
Сначала появляются цикл чтения команд, простейший компилятор SQL и виртуальная машина. Затем одна таблица в памяти получает тесты, сохранение на диск и курсор для обхода записей. Дальше автор разбирает формат узлов B-дерева, двоичный и рекурсивный поиск, разделение узлов и обновление их родителей.
В серии How Does a Database Work? удобно идти по порядку и смотреть, как знакомые операции превращаются в структуры данных. Читать стоит разработчикам, которые работают с SQL и хотят разобраться в индексах, полном сканировании таблицы и границе между памятью и диском. | 354 |
