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

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

Ir al canal en Telegram

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

Mostrar más
6 515
Suscriptores
+224 horas
-77 días
-3130 días
Atraer Suscriptores
oct '26
octubre '26
+12
en 0 canales
septiembre '26
+65
en 6 canales
Get PRO
agosto '26
+28
en 2 canales
Get PRO
julio '26
+26
en 3 canales
Get PRO
junio '26
+48
en 2 canales
Get PRO
mayo '26
+70
en 0 canales
Get PRO
abril '26
+30
en 0 canales
Get PRO
marzo '26
+47
en 5 canales
Get PRO
febrero '26
+57
en 14 canales
Get PRO
enero '26
+38
en 2 canales
Get PRO
diciembre '25
+46
en 4 canales
Get PRO
noviembre '25
+45
en 2 canales
Get PRO
octubre '25
+40
en 7 canales
Get PRO
septiembre '25
+26
en 3 canales
Get PRO
agosto '25
+41
en 1 canales
Get PRO
julio '25
+46
en 0 canales
Get PRO
junio '25
+38
en 2 canales
Get PRO
mayo '25
+68
en 5 canales
Get PRO
abril '25
+49
en 1 canales
Get PRO
marzo '25
+63
en 1 canales
Get PRO
febrero '25
+69
en 2 canales
Get PRO
enero '25
+72
en 4 canales
Get PRO
diciembre '24
+46
en 1 canales
Get PRO
noviembre '24
+104
en 6 canales
Get PRO
octubre '24
+73
en 4 canales
Get PRO
septiembre '24
+87
en 3 canales
Get PRO
agosto '24
+204
en 4 canales
Get PRO
julio '24
+86
en 4 canales
Get PRO
junio '24
+77
en 4 canales
Get PRO
mayo '24
+75
en 4 canales
Get PRO
abril '24
+68
en 3 canales
Get PRO
marzo '24
+65
en 4 canales
Get PRO
febrero '24
+50
en 0 canales
Get PRO
enero '24
+64
en 1 canales
Get PRO
diciembre '23
+59
en 2 canales
Get PRO
noviembre '23
+3 534
en 33 canales
Get PRO
octubre '23
+55
en 1 canales
Get PRO
septiembre '23
+71
en 0 canales
Get PRO
agosto '23
+69
en 0 canales
Get PRO
julio '23
+57
en 0 canales
Get PRO
junio '23
+180
en 0 canales
Get PRO
mayo '23
+73
en 0 canales
Get PRO
abril '23
+93
en 0 canales
Get PRO
marzo '23
+65
en 0 canales
Get PRO
febrero '23
+113
en 0 canales
Get PRO
enero '23
+68
en 0 canales
Get PRO
diciembre '22
+86
en 0 canales
Get PRO
noviembre '22
+90
en 0 canales
Get PRO
octubre '22
+117
en 0 canales
Get PRO
septiembre '22
+134
en 0 canales
Get PRO
agosto '22
+787
en 0 canales
Get PRO
julio '22
+119
en 0 canales
Get PRO
junio '22
+90
en 0 canales
Get PRO
mayo '22
+157
en 0 canales
Get PRO
abril '22
+131
en 0 canales
Get PRO
marzo '22
+117
en 0 canales
Get PRO
febrero '22
+198
en 0 canales
Get PRO
enero '22
+149
en 0 canales
Get PRO
diciembre '21
+5 099
en 0 canales
Get PRO
noviembre '21
+927
en 0 canales
Get PRO
octubre '21
+1 849
en 0 canales
Fecha
Crecimiento de Suscriptores
Menciones
Canales
06 octubre0
05 octubre+2
04 octubre+1
03 octubre0
02 octubre0
01 octubre+9
Publicaciones del Canal
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 подпись связывает провенанс с содержимым, а ш
Отредактировал снимок билета без сброса криптографической даты В стандарте C2PA подпись связывает провенанс с содержимым, а штамп времени фиксирует создание подписи. Но спецификация позволяет исключать произвольные диапазоны байтов из расчёта хеша привязки. Дэвид Бьюкенен показал, как обойти защиту: он исключил из расчёта весь файл целиком. Хеш изображения превратился в хеш пустой строки, поэтому изменение пикселей не нарушало подпись с прежним штампом времени. Для демо автор снял лотерейный билет до тиража, а после публикации результатов вписал выигрышные числа. Сервер времени работал штатно, подпись корректна, а выигрыш остался демонстрационным. В эксперименте автора проверка подписи проходит: валидаторы принимают манифест, дата предшествует тиражу, хотя изображение подписью не защищено. Инженерный урок: исключения из хеша должны строго ограничиваться стандартом и валидаторами, иначе заверяется пустота. @prog_stuff
260
3
Как искать баги, которые не воспроизводятся в тестах В обстоятельном разборе трёх расследований повреждение SQLite, потеря со
Как искать баги, которые не воспроизводятся в тестах В обстоятельном разборе трёх расследований повреждение SQLite, потеря сообщений в TCP-сервисе и гонки в биллинге сводятся к одной методике: редкий сбой ищут телеметрией из рабочей среды, а не догадками. Гонка между контрольной точкой SQLite и записью прожила минимум 16 лет. В TCP-сервисе четыре счётчика показали потерю: сервер разобрал 100 000 строк, но отправил 99 987 ответов, потому что принимал вызов read() за готовое сообщение. Ставьте счётчики на границах слоёв, меняйте по одной переменной и подтверждайте исправление положительным сигналом. Читать бэкенд-разработчикам и инженерам эксплуатации, которые расследуют редкие сбои в продакшене.
253
4
Producer-Consumer в Java, Go и Rust: как выбрать уровень решения Разбор трёх способов связать производителей и потребителей ч
Producer-Consumer в Java, Go и Rust: как выбрать уровень решения Разбор трёх способов связать производителей и потребителей через ограниченный буфер. Выбор зависит от требований к задержке, а не от языка. В Java блокирующая очередь останавливает производителя при заполненном буфере, в Go это делает буферизированный канал, в Rust кольцевой буфер с атомарными операциями позволяет убрать блокировки. Сравнение трёх уровней решения пригодится разработчикам многопоточных систем. Начинайте со стандартной очереди, а атомарные алгоритмы выбирайте под измеренный предел задержки.
254
5
Как искать нарушения IEEE 754 в математических ядрах ИИ-ускорителей Обстоятельный разбор аудита tt-metal показывает, почему с
Как искать нарушения 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, Airbnb и Uber В обстоятельном разборе крупных миграций важно сравнение процессов: срок одной компании нельзя переносить в свой план. Asana начала перенос 4 000+ файлов с Enzyme на React Testing Library в 2024 году, обработала около 25%, а остаток завершила с ИИ за две недели и $12 000. Пять лет до этого были сроком низкоприоритетной миграции, а не непрерывной работы команды. Сначала спроектируйте проверку результата, затем оценивайте, сколько типовых изменений можно поручить ИИ.
282
7
Как переводить целые книги с LLM и не терять контекст Практический разбор Python-пайплайна для EPUB и PDF. Книгу делят по гла
Как переводить целые книги с LLM и не терять контекст Практический разбор Python-пайплайна для EPUB и PDF. Книгу делят по главам, затем на фрагменты по 2 000–4 000 токенов. В новый запрос обычно добавляют два последних абзаца только как контекст и словарь имён и терминов: так связность сохраняется без повторного перевода. В разборе пайплайна есть код для подсчёта токенов и разбиения абзацев. Внутри главы запросы идут по очереди: следующий зависит от предыдущего. Параллельно обрабатывают разные книги. Для романа на 100 000 токенов авторы приводят ориентир: около 30 запросов и 4–6 минут. Сохраните разбор, если работаете с длинными документами. Инженерный вывод: перекрытие фрагментов и отдельная память о терминах улучшают связность, но зависимые части придётся обрабатывать по очереди.
308
8
Почему 118 зелёных тестов не спасли MQTT-брокер на Rust Обстоятельный инженерный разбор MQTT-брокера, написанного на Rust без
Почему 118 зелёных тестов не спасли MQTT-брокер на Rust Обстоятельный инженерный разбор MQTT-брокера, написанного на Rust без сторонних пакетов. 118 автоматических тестов прошли, но mosquitto_pub в режиме доставки QoS 1 ждал подтверждения четыре секунды и завершался по тайм-ауту. Тесты проверяли кодирование пакета подтверждения PUBACK, однако обработчик вообще его не отправлял. После разделения реестра тем на четыре сегмента вскрылся второй сбой: подписка sensors/+/temp и публикация sensors/kitchen/temp попадали в разные сегменты. В разборе BlitzBroker есть и замер: около 495 тыс. сообщений в секунду против 402 тыс. у одного сегмента. Читать разработчикам сетевых протоколов и интеграционных тестов. Проверяйте собранный бинарник независимым клиентом: подтверждения, подписки с подстановкой и переполнение очередей.
300
9
Как запускать асинхронное GRPO без общей машины Обстоятельный разбор рабочей системы: тренер с LoRA и серверы генерации работ
Как запускать асинхронное 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 Статья о цепочке «создать ключ, получить адрес, подписать транзакцию»: авто
Как устроена криптография Ethereum-кошелька на Go Статья о цепочке «создать ключ, получить адрес, подписать транзакцию»: автор собирает учебный CLI-кошелёк на Go и показывает детали, от которых зависят совместимость и безопасность. В практическом разборе разбираются BIP39, путь BIP44 и соглашения для поля v, защищающего транзакции от повторного воспроизведения. Тест «зашифровали и расшифровали» не нашёл ошибку в параметрах scrypt: обе операции повторяли её. Нужен эталонный набор данных. CLI создан для обучения, не для реальных средств. Читайте, если хотите проверить реализацию Ethereum-стандартов в Go.
324
12
Как вынести тени в отдельные проходы Custom SRP в Unity Обстоятельное продолжение серии о собственном конвейере рендеринга на
Как вынести тени в отдельные проходы Custom SRP в Unity Обстоятельное продолжение серии о собственном конвейере рендеринга на Unity 6000.5.8f1. Рефакторинг ведут поэтапно: после каждого раздела тени остаются рабочими, поэтому материал читается как карта безопасного изменения архитектуры. Сначала объект Shadows уходит из LightingPass под управление CameraRenderer. Затем LightingPass получает структуру Handles и возвращает только буферы освещения. После появляется отдельный ShadowsPass: он строит списки отрисовки, запускает рендеринг теней и отдаёт их дескрипторы. Дальше код из Shadows переносят в новый проход, чтобы затем разделить обработку направленных и остальных источников света. Разбор с правками кода полезен тем, кто уже строит Custom SRP. Ориентир для рефакторинга: разделяйте владение состоянием и запись проходов небольшими шагами, проверяя тени после каждого.
305
13
Как настроить распределённую трассировку Java-микросервисов с OpenTelemetry Обстоятельный разбор OpenTelemetry показывает, ка
Как настроить распределённую трассировку 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 до ответов языко
Как собрать GraphRAG для данных ServiceNow на Python и Neo4j Обстоятельная книга о пути от данных ServiceNow до ответов языковой модели. Python читает записи, Neo4j связывает их в граф, а найденные сущности становятся контекстом для ответа. На 39 заранее записанных вопросах автор сравнивает восемь методов извлечения: от ключевых слов до обхода графа. Ни один не ответил на исходный вопрос книги. Материал пригодится разработчикам поиска и внутренних баз знаний: он показывает, как заранее определить тесты, сравнить подходы и зафиксировать провалы.
320
15
Почему одинаковый nvJPEG2000 даёт разные результаты в тестах Обстоятельный разбор показывает, как границы таймера и подача ка
Почему одинаковый nvJPEG2000 даёт разные результаты в тестах Обстоятельный разбор показывает, как границы таймера и подача кадров меняют результаты nvJPEG2000 на RTX 4090. Асинхронная очередь GPU делает методику частью результата. В образце NVIDIA декодирование замеряют CUDA-событиями корректно, но разбор сжатого потока считают в целых секундах. Миллисекунды превращаются в ноль, поэтому число охватывает лишь часть работы. В подробном разборе методики авторский стенд включает оба этапа; код и логи открыты. Есть и второй подвох: восемь потоков с двумя кадрами в работе дают 16 одновременных задач, хотя пакетного вызова у библиотеки нет. Разбор пригодится разработчикам GPU-конвейеров и авторам бенчмарков: сверяйте не только кадры в секунду, но и границы таймера, синхронизацию и число активных кадров.
328
16
Как отсекать партиции PostgreSQL при поиске не по ключу разбиения Таблица событий разбита по времени, но запрос по session_id
Как отсекать партиции PostgreSQL при поиске не по ключу разбиения Таблица событий разбита по времени, но запрос по session_id обращается ко всем партициям. Локальный индекс ускоряет поиск в каждой, однако их число не сокращает: при сотне партиций это похоже на запрос к сотне таблиц. Приём применим, когда события только добавляются, ID сессий растут последовательно, а сессии обычно длятся минуты или часы. Тогда ID связан со временем: для каждой партиции можно задать его диапазон через CHECK. Оптимизатор исключит партицию, где нужного ID быть не может. В примере для ID 1000 сканируется только партиция 2025 года вместо двух. В обстоятельной статье Хаки Бениты разобраны локальные и глобальные индексы, выбросы и схема «пробелы и острова». Материал пригодится тем, кто выбирает ключ разбиения таблицы: проверьте связь данных и план через EXPLAIN, прежде чем закреплять диапазоны ограничениями.
341
17
Go 1.27: что проверить перед обновлением сервисов Практический обзор Go 1.27 отделяет ускорение после пересборки от изменений
Go 1.27: что проверить перед обновлением сервисов Практический обзор Go 1.27 отделяет ускорение после пересборки от изменений, которые требуют проверки кода. Для типичных серверных нагрузок автор приводит прирост 3–5%, для отдельных микротестов до 10%. Причины: более точное встраивание функций компилятором и меньше расходов на выделение памяти. Отдельно разобраны сборщик мусора для сервисов с сотнями гигабайт живых данных и встроенная функция clear. Она очищает срезы и карты без нового выделения памяти, что пригодится при повторном использовании буферов. Данные DWARF помогают отладчику лучше показывать переменные, а go mod tidy оставляет меньше шума в изменениях go.mod. В практическом гайде на DEV Community можно сверить детали перед обновлением. Сохраните его, если поддерживаете Go-сервисы: пересоберите стенд и сравните скорость, паузы сборщика мусора и отладку на своей нагрузке.
334
18
Как Uber переписала шардирование Schemaless на Go без простоя Подробный технический разбор миграции хранилища. Материал ценен
Как 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