Как вынести тени в отдельные проходы Custom SRP в Unity
Обстоятельное продолжение серии о собственном конвейере рендеринга на Unity 6000.5.8f1. Рефакторинг ведут поэтапно: после каждого раздела тени остаются рабочими, поэтому материал читается как карта безопасного изменения архитектуры.
Сначала объект Shadows уходит из LightingPass под управление CameraRenderer. Затем LightingPass получает структуру Handles и возвращает только буферы освещения. После появляется отдельный ShadowsPass: он строит списки отрисовки, запускает рендеринг теней и отдаёт их дескрипторы.
Дальше код из Shadows переносят в новый проход, чтобы затем разделить обработку направленных и остальных источников света.
Разбор с правками кода полезен тем, кто уже строит Custom SRP. Ориентир для рефакторинга: разделяйте владение состоянием и запись проходов небольшими шагами, проверяя тени после каждого.
Обстоятельное продолжение серии о собственном конвейере рендеринга на Unity 6000.5.8f1. Рефакторинг ведут поэтапно: после каждого раздела тени остаются рабочими, поэтому материал читается как карта безопасного изменения архитектуры.
Сначала объект Shadows уходит из LightingPass под управление CameraRenderer. Затем LightingPass получает структуру Handles и возвращает только буферы освещения. После появляется отдельный ShadowsPass: он строит списки отрисовки, запускает рендеринг теней и отдаёт их дескрипторы.
Дальше код из Shadows переносят в новый проход, чтобы затем разделить обработку направленных и остальных источников света.
Разбор с правками кода полезен тем, кто уже строит Custom SRP. Ориентир для рефакторинга: разделяйте владение состоянием и запись проходов небольшими шагами, проверяя тени после каждого.
Как устроена криптография Ethereum-кошелька на Go
Статья о цепочке «создать ключ, получить адрес, подписать транзакцию»: автор собирает учебный CLI-кошелёк на Go и показывает детали, от которых зависят совместимость и безопасность.
В практическом разборе разбираются BIP39, путь BIP44 и соглашения для поля
Тест «зашифровали и расшифровали» не нашёл ошибку в параметрах scrypt: обе операции повторяли её. Нужен эталонный набор данных.
CLI создан для обучения, не для реальных средств. Читайте, если хотите проверить реализацию Ethereum-стандартов в Go.
Статья о цепочке «создать ключ, получить адрес, подписать транзакцию»: автор собирает учебный CLI-кошелёк на Go и показывает детали, от которых зависят совместимость и безопасность.
В практическом разборе разбираются BIP39, путь BIP44 и соглашения для поля
v, защищающего транзакции от повторного воспроизведения.Тест «зашифровали и расшифровали» не нашёл ошибку в параметрах scrypt: обе операции повторяли её. Нужен эталонный набор данных.
CLI создан для обучения, не для реальных средств. Читайте, если хотите проверить реализацию Ethereum-стандартов в Go.
Как исследовать легаси-код с ИИ до первого рефакторинга
Гайд по «археологии» незнакомой системы: странное условие или повторный расчёт могут хранить бизнес-исключение либо внешний контракт. ИИ здесь нужен для поиска вопросов, а не мгновенной переписи кода.
Начните с карты репозитория и точек входа: HTTP-запросов, фоновых задач, скриптов, импортов и вебхуков. Каждый вывод модели должен ссылаться на конкретные файлы, а сомнения нужно отмечать явно.
Готовые запросы к ИИ и маршрут анализа пригодятся при миграции или работе со старым проектом. До рефакторинга составьте проверяемую карту системы и список открытых вопросов.
Гайд по «археологии» незнакомой системы: странное условие или повторный расчёт могут хранить бизнес-исключение либо внешний контракт. ИИ здесь нужен для поиска вопросов, а не мгновенной переписи кода.
Начните с карты репозитория и точек входа: HTTP-запросов, фоновых задач, скриптов, импортов и вебхуков. Каждый вывод модели должен ссылаться на конкретные файлы, а сомнения нужно отмечать явно.
Готовые запросы к ИИ и маршрут анализа пригодятся при миграции или работе со старым проектом. До рефакторинга составьте проверяемую карту системы и список открытых вопросов.
Как запускать асинхронное GRPO без общей машины
Обстоятельный разбор рабочей системы: тренер с LoRA и серверы генерации работают в отдельных Hugging Face Jobs, без общей машины и межузлового обмена через NCCL.
Тренер кладёт адаптер в объектное хранилище, которое каждый Job видит как файловую систему. Прокси добавляет авторизацию, выбирает реплику, где уже вычислено начало запроса, и сообщает всем репликам о новой версии.
Адаптер ранга 1 для модели на 1,5 млрд параметров занимает несколько мегабайт против примерно 3 ГБ у полной модели. При max_staleness=4 нужны шесть слотов LoRA, иначе vLLM может вытеснить версию с незавершёнными запросами.
Схема и пять последовательных прогонов показывают, где искать узкое место: 500 шагов удалось сократить с 3 часов 27 минут до 53 минут. Читать ML-инженерам, которые разносят обучение и генерацию по отдельным машинам.
Обстоятельный разбор рабочей системы: тренер с LoRA и серверы генерации работают в отдельных Hugging Face Jobs, без общей машины и межузлового обмена через NCCL.
Тренер кладёт адаптер в объектное хранилище, которое каждый Job видит как файловую систему. Прокси добавляет авторизацию, выбирает реплику, где уже вычислено начало запроса, и сообщает всем репликам о новой версии.
Адаптер ранга 1 для модели на 1,5 млрд параметров занимает несколько мегабайт против примерно 3 ГБ у полной модели. При max_staleness=4 нужны шесть слотов LoRA, иначе vLLM может вытеснить версию с незавершёнными запросами.
Схема и пять последовательных прогонов показывают, где искать узкое место: 500 шагов удалось сократить с 3 часов 27 минут до 53 минут. Читать ML-инженерам, которые разносят обучение и генерацию по отдельным машинам.
Почему 118 зелёных тестов не спасли MQTT-брокер на Rust
Обстоятельный инженерный разбор MQTT-брокера, написанного на Rust без сторонних пакетов. 118 автоматических тестов прошли, но mosquitto_pub в режиме доставки QoS 1 ждал подтверждения четыре секунды и завершался по тайм-ауту.
Тесты проверяли кодирование пакета подтверждения PUBACK, однако обработчик вообще его не отправлял. После разделения реестра тем на четыре сегмента вскрылся второй сбой: подписка sensors/+/temp и публикация sensors/kitchen/temp попадали в разные сегменты.
В разборе BlitzBroker есть и замер: около 495 тыс. сообщений в секунду против 402 тыс. у одного сегмента.
Читать разработчикам сетевых протоколов и интеграционных тестов. Проверяйте собранный бинарник независимым клиентом: подтверждения, подписки с подстановкой и переполнение очередей.
Обстоятельный инженерный разбор MQTT-брокера, написанного на Rust без сторонних пакетов. 118 автоматических тестов прошли, но mosquitto_pub в режиме доставки QoS 1 ждал подтверждения четыре секунды и завершался по тайм-ауту.
Тесты проверяли кодирование пакета подтверждения PUBACK, однако обработчик вообще его не отправлял. После разделения реестра тем на четыре сегмента вскрылся второй сбой: подписка sensors/+/temp и публикация sensors/kitchen/temp попадали в разные сегменты.
В разборе BlitzBroker есть и замер: около 495 тыс. сообщений в секунду против 402 тыс. у одного сегмента.
Читать разработчикам сетевых протоколов и интеграционных тестов. Проверяйте собранный бинарник независимым клиентом: подтверждения, подписки с подстановкой и переполнение очередей.
Как переводить целые книги с LLM и не терять контекст
Практический разбор Python-пайплайна для EPUB и PDF. Книгу делят по главам, затем на фрагменты по 2 000–4 000 токенов. В новый запрос обычно добавляют два последних абзаца только как контекст и словарь имён и терминов: так связность сохраняется без повторного перевода.
В разборе пайплайна есть код для подсчёта токенов и разбиения абзацев. Внутри главы запросы идут по очереди: следующий зависит от предыдущего. Параллельно обрабатывают разные книги. Для романа на 100 000 токенов авторы приводят ориентир: около 30 запросов и 4–6 минут.
Сохраните разбор, если работаете с длинными документами. Инженерный вывод: перекрытие фрагментов и отдельная память о терминах улучшают связность, но зависимые части придётся обрабатывать по очереди.
Практический разбор Python-пайплайна для EPUB и PDF. Книгу делят по главам, затем на фрагменты по 2 000–4 000 токенов. В новый запрос обычно добавляют два последних абзаца только как контекст и словарь имён и терминов: так связность сохраняется без повторного перевода.
В разборе пайплайна есть код для подсчёта токенов и разбиения абзацев. Внутри главы запросы идут по очереди: следующий зависит от предыдущего. Параллельно обрабатывают разные книги. Для романа на 100 000 токенов авторы приводят ориентир: около 30 запросов и 4–6 минут.
Сохраните разбор, если работаете с длинными документами. Инженерный вывод: перекрытие фрагментов и отдельная память о терминах улучшают связность, но зависимые части придётся обрабатывать по очереди.
❤🔥1
Как ИИ меняет большие миграции: опыт Asana, Airbnb и Uber
В обстоятельном разборе крупных миграций важно сравнение процессов: срок одной компании нельзя переносить в свой план.
Asana начала перенос 4 000+ файлов с Enzyme на React Testing Library в 2024 году, обработала около 25%, а остаток завершила с ИИ за две недели и $12 000. Пять лет до этого были сроком низкоприоритетной миграции, а не непрерывной работы команды.
Сначала спроектируйте проверку результата, затем оценивайте, сколько типовых изменений можно поручить ИИ.
В обстоятельном разборе крупных миграций важно сравнение процессов: срок одной компании нельзя переносить в свой план.
Asana начала перенос 4 000+ файлов с Enzyme на React Testing Library в 2024 году, обработала около 25%, а остаток завершила с ИИ за две недели и $12 000. Пять лет до этого были сроком низкоприоритетной миграции, а не непрерывной работы команды.
Сначала спроектируйте проверку результата, затем оценивайте, сколько типовых изменений можно поручить ИИ.
Как искать нарушения IEEE 754 в математических ядрах ИИ-ускорителей
Обстоятельный разбор аудита tt-metal показывает, почему случайные тесты не заменяют таблицу особых значений. Функция ttnn.atan2 для +∞ и +0 возвращала 0 вместо π/2: конечный диапазон тестов этот случай не создавал.
Карта расследования:
1. Заранее записать эталон для ±0, ±∞, NaN и значений у границ диапазона;
2. восстановить алгоритм ядра и вручную провести через него каждый случай;
3. заменить ошибочную проверку
4. закрепить точные входы детерминированным тестом.
В полном разборе поиска и исправления ошибки ценен порядок работы: спецификация идёт раньше кода, а крайние значения становятся регрессионными тестами. Читать разработчикам вычислительных библиотек и ML-инфраструктуры, которые проверяют численную корректность ускорителей.
Обстоятельный разбор аудита tt-metal показывает, почему случайные тесты не заменяют таблицу особых значений. Функция ttnn.atan2 для +∞ и +0 возвращала 0 вместо π/2: конечный диапазон тестов этот случай не создавал.
Карта расследования:
1. Заранее записать эталон для ±0, ±∞, NaN и значений у границ диапазона;
2. восстановить алгоритм ядра и вручную провести через него каждый случай;
3. заменить ошибочную проверку
min == 0 на max == 0 во всех трёх аппаратных копиях;4. закрепить точные входы детерминированным тестом.
В полном разборе поиска и исправления ошибки ценен порядок работы: спецификация идёт раньше кода, а крайние значения становятся регрессионными тестами. Читать разработчикам вычислительных библиотек и ML-инфраструктуры, которые проверяют численную корректность ускорителей.
Producer-Consumer в Java, Go и Rust: как выбрать уровень решения
Разбор трёх способов связать производителей и потребителей через ограниченный буфер. Выбор зависит от требований к задержке, а не от языка.
В Java блокирующая очередь останавливает производителя при заполненном буфере, в Go это делает буферизированный канал, в Rust кольцевой буфер с атомарными операциями позволяет убрать блокировки.
Сравнение трёх уровней решения пригодится разработчикам многопоточных систем. Начинайте со стандартной очереди, а атомарные алгоритмы выбирайте под измеренный предел задержки.
Разбор трёх способов связать производителей и потребителей через ограниченный буфер. Выбор зависит от требований к задержке, а не от языка.
В Java блокирующая очередь останавливает производителя при заполненном буфере, в Go это делает буферизированный канал, в Rust кольцевой буфер с атомарными операциями позволяет убрать блокировки.
Сравнение трёх уровней решения пригодится разработчикам многопоточных систем. Начинайте со стандартной очереди, а атомарные алгоритмы выбирайте под измеренный предел задержки.
Как искать баги, которые не воспроизводятся в тестах
В обстоятельном разборе трёх расследований повреждение SQLite, потеря сообщений в TCP-сервисе и гонки в биллинге сводятся к одной методике: редкий сбой ищут телеметрией из рабочей среды, а не догадками.
Гонка между контрольной точкой SQLite и записью прожила минимум 16 лет. В TCP-сервисе четыре счётчика показали потерю: сервер разобрал 100 000 строк, но отправил 99 987 ответов, потому что принимал вызов
Ставьте счётчики на границах слоёв, меняйте по одной переменной и подтверждайте исправление положительным сигналом. Читать бэкенд-разработчикам и инженерам эксплуатации, которые расследуют редкие сбои в продакшене.
В обстоятельном разборе трёх расследований повреждение SQLite, потеря сообщений в TCP-сервисе и гонки в биллинге сводятся к одной методике: редкий сбой ищут телеметрией из рабочей среды, а не догадками.
Гонка между контрольной точкой SQLite и записью прожила минимум 16 лет. В TCP-сервисе четыре счётчика показали потерю: сервер разобрал 100 000 строк, но отправил 99 987 ответов, потому что принимал вызов
read() за готовое сообщение.Ставьте счётчики на границах слоёв, меняйте по одной переменной и подтверждайте исправление положительным сигналом. Читать бэкенд-разработчикам и инженерам эксплуатации, которые расследуют редкие сбои в продакшене.
Отредактировал снимок билета без сброса криптографической даты
В стандарте C2PA подпись связывает провенанс с содержимым, а штамп времени фиксирует создание подписи. Но спецификация позволяет исключать произвольные диапазоны байтов из расчёта хеша привязки.
Дэвид Бьюкенен показал, как обойти защиту: он исключил из расчёта весь файл целиком. Хеш изображения превратился в хеш пустой строки, поэтому изменение пикселей не нарушало подпись с прежним штампом времени. Для демо автор снял лотерейный билет до тиража, а после публикации результатов вписал выигрышные числа.
Сервер времени работал штатно, подпись корректна, а выигрыш остался демонстрационным. В эксперименте автора проверка подписи проходит: валидаторы принимают манифест, дата предшествует тиражу, хотя изображение подписью не защищено. Инженерный урок: исключения из хеша должны строго ограничиваться стандартом и валидаторами, иначе заверяется пустота.
@prog_stuff
В стандарте C2PA подпись связывает провенанс с содержимым, а штамп времени фиксирует создание подписи. Но спецификация позволяет исключать произвольные диапазоны байтов из расчёта хеша привязки.
Дэвид Бьюкенен показал, как обойти защиту: он исключил из расчёта весь файл целиком. Хеш изображения превратился в хеш пустой строки, поэтому изменение пикселей не нарушало подпись с прежним штампом времени. Для демо автор снял лотерейный билет до тиража, а после публикации результатов вписал выигрышные числа.
Сервер времени работал штатно, подпись корректна, а выигрыш остался демонстрационным. В эксперименте автора проверка подписи проходит: валидаторы принимают манифест, дата предшествует тиражу, хотя изображение подписью не защищено. Инженерный урок: исключения из хеша должны строго ограничиваться стандартом и валидаторами, иначе заверяется пустота.
@prog_stuff
Go расширил экспериментальный SIMD без ассемблерных вставок
В Go 1.27 разработчики представили пакет
Пример из статьи — разворот порядка бит в байтах через матричное умножение GFNI константой
Инструкции требуют проверок фич CPU (
@prog_stuff
В 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