C23 сделал
Раньше базовый тип перечисления обычно выбирал компилятор, и
На многих системах это 4 байта.
В C23 можно явно указать базовый тип:
Теперь такой enum занимает 1 байт.
Можно и наоборот использовать большой тип:
Это особенно полезно там, где важен точный layout структуры, ABI, сетевые протоколы, embedded и работа с бинарными форматами.
В C23 размер enum теперь можно контролировать явно, а не полагаться на выбор компилятора.
enum в C заметно удобнее для низкоуровневого кода.Раньше базовый тип перечисления обычно выбирал компилятор, и
enum часто занимал размер обычного int:
enum status {
OK = 0,
ERROR = -1
};
На многих системах это 4 байта.
В C23 можно явно указать базовый тип:
enum status8 : int8_t {
OK8 = 0,
ERR8 = -1
};
Теперь такой enum занимает 1 байт.
Можно и наоборот использовать большой тип:
enum status64 : uint64_t {
OK64 = 0,
ERR64 = UINT64_C(0xFFFFFFFFFFFFFFFF)
};
Это особенно полезно там, где важен точный layout структуры, ABI, сетевые протоколы, embedded и работа с бинарными форматами.
В C23 размер enum теперь можно контролировать явно, а не полагаться на выбор компилятора.
🔥21🤯2
Инструкция может выборочно загрузить до 64 байт по маске. Каждый бит маски отвечает за один байт:
-
1 - байт загружается-
0 - вместо него ставится нольСамое интересное начинается, когда маска полностью нулевая:
#include <x86intrin.h>
void f(const char *p) {
_mm512_maskz_loadu_epi8(0, p);
}
При нулевой маске память фактически не читается, а результатом становится 512-битный вектор из нулей.
То есть значение p в таком случае не влияет на результат, а компилятор при оптимизации вообще может удалить весь вызов.
Хороший пример того, насколько необычно работают masked-load инструкции в AVX-512.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍3❤🔥1🥰1
Полноценный Lisp можно уместить всего в 99 строк C.
Внутри при этом:
- 21 примитив
- REPL
- сборщик мусора Cheney GC
- числа с плавающей точкой
- указатели
- типы значений
И всё это без `struct`-тегов, без внешних библиотек и без обычных динамических аллокаций для представления объектов.
Главный трюк - NaN boxing.
IEEE 754 оставляет много битов внутри специальных NaN-значений. Их можно использовать как скрытое хранилище:
- часть битов кодирует тип
- до 48 бит можно использовать под указатель
- обычные
В итоге одно 64-битное значение может представлять и число, и указатель, и другие типы данных.
Очень красивый пример того, как устройство IEEE 754 можно использовать для построения компактного рантайма языка.
Внутри при этом:
- 21 примитив
- REPL
- сборщик мусора Cheney GC
- числа с плавающей точкой
- указатели
- типы значений
И всё это без `struct`-тегов, без внешних библиотек и без обычных динамических аллокаций для представления объектов.
Главный трюк - NaN boxing.
IEEE 754 оставляет много битов внутри специальных NaN-значений. Их можно использовать как скрытое хранилище:
- часть битов кодирует тип
- до 48 бит можно использовать под указатель
- обычные
double при этом остаются обычными числамиВ итоге одно 64-битное значение может представлять и число, и указатель, и другие типы данных.
Очень красивый пример того, как устройство IEEE 754 можно использовать для построения компактного рантайма языка.
🔥11🤩10❤4❤🔥1👍1
Бьярн Страуструп о своём же C++: «на C легко выстрелить себе в ногу»
Создатель C++ однажды описал свой язык так:
В своём FAQ он объясняет: это верно для любого мощного языка. Чем лучше язык защищает от простых ошибок, тем менее очевидными становятся те, что остаются.
C++ действительно закрыл многие дыры C: RAII, умные указатели, строгая типизация, а на слайде за его спиной видно, что код на C++20/23 бывает проще и безопаснее старого. Но шаблоны, неопределённое поведение и сложная модель памяти по-прежнему позволяют выстрелить так, что потом неделями ищешь, куда попало.
Создатель C++ однажды описал свой язык так:
«На C легко выстрелить себе в ногу. На C++ это сделать сложнее, но если уж получится, оторвёт всю ногу целиком».
В своём FAQ он объясняет: это верно для любого мощного языка. Чем лучше язык защищает от простых ошибок, тем менее очевидными становятся те, что остаются.
C++ действительно закрыл многие дыры C: RAII, умные указатели, строгая типизация, а на слайде за его спиной видно, что код на C++20/23 бывает проще и безопаснее старого. Но шаблоны, неопределённое поведение и сложная модель памяти по-прежнему позволяют выстрелить так, что потом неделями ищешь, куда попало.
👍23❤15🔥4🥰1
🎮 Строка из Quake III, которая выглядит как колдовство
Комментарий настоящий. Эта строка помогает вычислить 1/√x, не извлекая квадратный корень. В графике такая операция нужна для нормализации векторов: привести их длину к единице, сохранив направление.
Как работает трюк?
У
А дальше используется свойство:
Сдвиг
Один шаг метода Ньютона доводит относительную погрешность примерно до 0,18%. В историческом тесте Криса Ломонта функция работала примерно в четыре раза быстрее прямого вычисления
А закомментированная строка на картинке? Это второй шаг Ньютона: ещё больше точности за дополнительные вычисления.
💡 Красота алгоритма в том, что само представление числа в памяти становится частью вычисления.
https://github.com/id-Software/Quake-III-Arena/blob/master/code/game/q_math.c
i = 0x5f3759df - (i >> 1); // what the fuck?
Комментарий настоящий. Эта строка помогает вычислить 1/√x, не извлекая квадратный корень. В графике такая операция нужна для нормализации векторов: привести их длину к единице, сохранив направление.
Как работает трюк?
У
float внутри есть показатель степени и дробная часть. Если прочитать биты положительного нормализованного числа как целое, получится величина, которая примерно соответствует его логарифму с масштабом и смещением.А дальше используется свойство:
log₂(1/√x) = −½ × log₂(x)Сдвиг
>> 1 делит целое число на два. Вычитание из подобранной константы меняет знак и компенсирует смещение. Полученные биты снова читаются как float: это уже приближение к ответу.Один шаг метода Ньютона доводит относительную погрешность примерно до 0,18%. В историческом тесте Криса Ломонта функция работала примерно в четыре раза быстрее прямого вычисления
1.0 / sqrt(x).А закомментированная строка на картинке? Это второй шаг Ньютона: ещё больше точности за дополнительные вычисления.
💡 Красота алгоритма в том, что само представление числа в памяти становится частью вычисления.
https://github.com/id-Software/Quake-III-Arena/blob/master/code/game/q_math.c
❤26🔥6👍5
Яндекс выложил в опенсорс YTsaurus Flow
YTsaurus Flow - фреймворк потоковой обработки данных с сохранением состояния между событиями, альтернатива зарубежным Spark Structured Streaming и Kafka Streams. Технологию совместно разработали команды Yandex Infrastructure и Яндекс Рекламы для работы с большими потоками данных.
Flow изначально создавался для высоконагруженных real-time систем, прежде всего рекомендательных. Позволяет обрабатывать большие потоки событий с сохранением состояния, гарантией exactly-once и автоматическим распределением нагрузки. Это важно для сервисов, где задержка или потеря данных напрямую влияют на качество рекомендаций, антифрода и других ML-систем: свежие события быстрее доходят до моделей, а инфраструктура продолжает работать при сбоях и изменении нагрузки.
https://github.com/ytsaurus/ytsaurus/tree/main/yt/yt/flow
YTsaurus Flow - фреймворк потоковой обработки данных с сохранением состояния между событиями, альтернатива зарубежным Spark Structured Streaming и Kafka Streams. Технологию совместно разработали команды Yandex Infrastructure и Яндекс Рекламы для работы с большими потоками данных.
Flow изначально создавался для высоконагруженных real-time систем, прежде всего рекомендательных. Позволяет обрабатывать большие потоки событий с сохранением состояния, гарантией exactly-once и автоматическим распределением нагрузки. Это важно для сервисов, где задержка или потеря данных напрямую влияют на качество рекомендаций, антифрода и других ML-систем: свежие события быстрее доходят до моделей, а инфраструктура продолжает работать при сбоях и изменении нагрузки.
https://github.com/ytsaurus/ytsaurus/tree/main/yt/yt/flow
🔥10❤5👍3🤯2
Бьярне Страуструп считает естественный язык слишком неоднозначным для точного описания программ. В интервью Райану Петерману он заявил, что ИИ часто создаёт раздутый код с ошибками и уязвимостями, который сложно проверять.
По его словам, изменение промпта может существенно менять реализацию, заставляя опытных разработчиков заново разбираться в результате. Страуструп рассказал, что знает специалистов, которые предпочитают уйти на пенсию, чем заниматься такой проверкой.
Особенно скептически он оценивает ИИ в системах, где критичны безопасность и производительность. При этом признаёт: большая часть мирового кода не относится к этой категории.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥44❤18👍16💊2
UTF-8-декодер на C: таблица и несколько строк кода
Бьёрн Хёрманн реализовал декодирование UTF-8 через конечный автомат (DFA). Он обрабатывает байты по одному, собирает кодовую точку Unicode и проверяет корректность последовательности.
Таблица
* определяет класс очередного байта;
* выбирает следующее состояние автомата.
`ACCEPT` означает, что кодовая точка полностью прочитана. `REJECT` - обнаружена ошибка. Остальные состояния означают, что нужны дополнительные байты.
Подход удобен для потоковой обработки: если символ разорван между двумя сетевыми пакетами, достаточно сохранить состояние и накопленное значение.
Нюанс: после последнего байта тоже нужно проверить состояние. Если оно не
Бьёрн Хёрманн реализовал декодирование UTF-8 через конечный автомат (DFA). Он обрабатывает байты по одному, собирает кодовую точку Unicode и проверяет корректность последовательности.
Таблица
utf8d выполняет две задачи:* определяет класс очередного байта;
* выбирает следующее состояние автомата.
`ACCEPT` означает, что кодовая точка полностью прочитана. `REJECT` - обнаружена ошибка. Остальные состояния означают, что нужны дополнительные байты.
Подход удобен для потоковой обработки: если символ разорван между двумя сетевыми пакетами, достаточно сохранить состояние и накопленное значение.
Нюанс: после последнего байта тоже нужно проверить состояние. Если оно не
ACCEPT, строка некорректна - например, оборвалась посреди символа.👍18❤2🥰1😁1
Forwarded from Rust
🦀 Что удивляет в C, если первым языком был Rust?
Обычно разработчики переходят от C к Rust. Автор C for Rust Programmers пошёл в обратную сторону и собрал нюансы, которые легко пропустить.
Например, такая функция выглядит как принимающая массив из трёх элементов:
Но параметр здесь становится указателем. На платформе с 64-битными указателями увидите 8, а не 3. Длина массива в функцию не передаётся.
Ещё несколько сюрпризов:
• C-строки заканчиваются
•
•
• Вместо ссылок с проверкой заимствований работают сырые указатели.
Полезное чтение для тех, кто пишет FFI или хочет понять, какие гарантии привычно получает от Rust.
https://bd103.dev/blog/2026-10-07-c-for-rust-programmers/
@rust_code
Обычно разработчики переходят от C к Rust. Автор C for Rust Programmers пошёл в обратную сторону и собрал нюансы, которые легко пропустить.
Например, такая функция выглядит как принимающая массив из трёх элементов:
void inspect(char data[3]) {
printf("%zu\n", sizeof(data));
}
Но параметр здесь становится указателем. На платформе с 64-битными указателями увидите 8, а не 3. Длина массива в функцию не передаётся.
Ещё несколько сюрпризов:
• C-строки заканчиваются
\0, а strlen() ищет этот байт, проходя по памяти.•
long обычно занимает 64 бита в 64-битных Unix-системах и 32 бита в Windows.•
malloc() может вернуть NULL, а язык не заставит проверить результат.• Вместо ссылок с проверкой заимствований работают сырые указатели.
Полезное чтение для тех, кто пишет FFI или хочет понять, какие гарантии привычно получает от Rust.
https://bd103.dev/blog/2026-10-07-c-for-rust-programmers/
@rust_code
👍7❤4😁4🥴3🔥2
std::weak_ptr может удерживать память даже при expired() == true.Причина в
std::make_shared: обычно он размещает объект и управляющий блок в одной аллокации.В примере на скриншоте массив на 16 МиБ находится прямо внутри
Blob. После удаления последнего shared_ptr:* деструктор объекта вызывается;
*
expired() возвращает true;* общий блок памяти остаётся выделенным, пока существует хотя бы один
weak_ptr.После сброса последней слабой ссылки блок можно освободить.
Что делать: удалять протухшие ссылки из долгоживущих кешей. Для крупных объектов также можно рассмотреть отдельную аллокацию через
std::shared_ptr<Blob>(new Blob()).Нюанс касается размера самого объекта. Если данные хранятся в обычном
std::vector, его отдельный буфер освобождается при вызове деструктора.https://devblogs.microsoft.com/oldnewthing/20230815-00/?p=108602
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤2🥰1
🎲 Генератор случайных чисел всего в три строки
В 2003 году George Marsaglia предложил семейство генераторов Xorshift — один из самых простых и быстрых PRNG.
Для
Новое значение
Почему это интересно:
- почти нет вычислительных затрат;
- используются только битовые сдвиги и XOR;
- период для ненулевого
- отлично подходит для игр, симуляций и других задач, где важна скорость.
Но есть важный нюанс: Xorshift не криптографически стойкий. Для токенов, паролей и security-задач его использовать нельзя.
Красивый пример того, как всего несколько битовых операций превращаются в полноценный генератор псевдослучайных чисел.
В 2003 году George Marsaglia предложил семейство генераторов Xorshift — один из самых простых и быстрых PRNG.
Для
xorshift32 достаточно буквально трёх операций:state ^= state << 13; state ^= state >> 17; state ^= state << 5;Новое значение
state становится следующим псевдослучайным числом.Почему это интересно:
- почти нет вычислительных затрат;
- используются только битовые сдвиги и XOR;
- период для ненулевого
state — до 2³² − 1;- отлично подходит для игр, симуляций и других задач, где важна скорость.
Но есть важный нюанс: Xorshift не криптографически стойкий. Для токенов, паролей и security-задач его использовать нельзя.
Красивый пример того, как всего несколько битовых операций превращаются в полноценный генератор псевдослучайных чисел.
👍13❤9🔥4
Для работы с ИИ полезно иметь несколько моделей под рукой. Но держать ради этого несколько подписок удобно не всем.
Особенно когда сегодня нужен Claude для кода, завтра GPT для другой задачи, а команде ещё нужны общий баланс и понятные расходы.
Для такого сценария есть RouterAI, российская альтернатива OpenRouter. ChatGPT, Claude, Gemini, Grok и сотни других моделей доступны через один веб-чат и OpenAI-совместимый API. Сервис работает без VPN, есть Telegram-бот.
Для разработки предусмотрены инструкции по подключению Claude Code, Codex, Cline и Cursor. Если провайдер модели недоступен, запрос автоматически направляется резервному.
Оплата за использование, без обязательной подписки. Пополнить баланс можно в рублях российской картой или через СБП. Для бизнеса есть оплата по счёту, договор и закрывающие документы. Командам доступны роли, лимиты и статистика расходов.
По данным RouterAI, платформой пользуются десятки тысяч пользователей, включая разработчиков и компании. На сторонних площадках сотни положительных отзывов с оценками около 4,9–5 из 5: например, на Startpack сейчас 372 отзыва и рейтинг 4,9.
Практичный способ попробовать разные модели на своих задачах и платить за фактическую работу.
https://routerai.ru/l/c
#реклама
О рекламодателе
erid: 2W5zFJoafmB
Особенно когда сегодня нужен Claude для кода, завтра GPT для другой задачи, а команде ещё нужны общий баланс и понятные расходы.
Для такого сценария есть RouterAI, российская альтернатива OpenRouter. ChatGPT, Claude, Gemini, Grok и сотни других моделей доступны через один веб-чат и OpenAI-совместимый API. Сервис работает без VPN, есть Telegram-бот.
Для разработки предусмотрены инструкции по подключению Claude Code, Codex, Cline и Cursor. Если провайдер модели недоступен, запрос автоматически направляется резервному.
Оплата за использование, без обязательной подписки. Пополнить баланс можно в рублях российской картой или через СБП. Для бизнеса есть оплата по счёту, договор и закрывающие документы. Командам доступны роли, лимиты и статистика расходов.
По данным RouterAI, платформой пользуются десятки тысяч пользователей, включая разработчиков и компании. На сторонних площадках сотни положительных отзывов с оценками около 4,9–5 из 5: например, на Startpack сейчас 372 отзыва и рейтинг 4,9.
Практичный способ попробовать разные модели на своих задачах и платить за фактическую работу.
https://routerai.ru/l/c
#реклама
О рекламодателе
erid: 2W5zFJoafmB
🔥3❤2👍2
🛋 C++ реалистично симулирует взрослую жизнь: решил сэкономить на переезде, а всё равно заплатил за копию.
Кажется, диван должен «переехать». Но вызывается конструктор копирования.
Подвох: `std::move` не перемещает объект и не снимает `const`. Здесь он даёт
Зато конструктор копирования
Даже компилятор знает: переезд без неожиданных расходов не бывает.
const Sofa mySofa;
Sofa newApartment = std::move(mySofa);
Кажется, диван должен «переехать». Но вызывается конструктор копирования.
Подвох: `std::move` не перемещает объект и не снимает `const`. Здесь он даёт
const Sofa&&, а конструктору перемещения Sofa(Sofa&&) нужна ссылка без const.Зато конструктор копирования
Sofa(const Sofa&) подходит.Даже компилятор знает: переезд без неожиданных расходов не бывает.
😁9👍7❤4🤣2🔥1
🔥 Хочешь быстрее расти в IT? Хватит учиться в одиночку
Окружение решает больше, чем кажется.
Собрал папки и каналы, где можно быстрее влиться в нужное направление, следить за трендами и не вариться в своём пузыре.
AI: t.iss.one/ai_machinelearning_big_data
Python: t.iss.one/pythonl
Linux: t.iss.one/linuxacademiya
Хакинг: t.iss.one/linuxkalii
DevOps: t.iss.one/DevOPSitsec
Docker: https://t.iss.one/+90Z5TAyfuNU5YmRi
Golang: t.iss.one/Golang_google
Rust: t.iss.one/rust_code
C++: t.iss.one/cpluspluc
C#: t.iss.one/csharp_ci
Java: t.iss.one/javatg
JavaScript: t.iss.one/javascriptv
React: t.iss.one/react_tg
Frontend: t.iss.one/front
PHP: t.iss.one/phpshka
Android: t.iss.one/android_its
Мобильная разработка: t.iss.one/mobdevelop
Базы данных: t.iss.one/sqlhub
Data Science: t.iss.one/data_analysis_ml
Big Data: t.iss.one/bigdatai
Математика: t.iss.one/data_math
Физика: t.iss.one/fizmat
Kubernetes: t.iss.one/kubernetc
GameDev: https://t.iss.one/gamedev
Haskell: t.iss.one/haskell_tg
Собеседования и карьера:
DS собеседования: t.iss.one/machinelearning_interview
Python собеседования: t.iss.one/python_job_interview
Папка с вакансиями: t.iss.one/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.iss.one/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.iss.one/addlist/eEPya-HF6mkxMGIy
Папка ML: https://t.iss.one/addlist/2Ls-snqEeytkMDgy
Папка Frontend: https://t.iss.one/addlist/mzMMG3RPZhY2M2Iy
Полезное сверху:
ИТ-мемы: t.iss.one/memes_prog
Английский для программистов: t.iss.one/english_forprogrammers
ИИ и технологии: t.iss.one/vistehno
954 ГБ open-source курсов: https://t.iss.one/+rKBQEMccAA01MTcy
ИТ-книги бесплатно: https://t.iss.one/addlist/BkskQciUW_FhNjEy
Max Ai: https://max.ru/ai_machinelearning_big_data
Max python: https://max.ru/pythonl
ТЕХНО: https://max.ru/vistehno
Max Go: https://max.ru/Golang_google
Max Linux: https://max.ru/linuxkalii
Devops: https://max.ru/DevOPSitsec
C#: https://max.ru/csharp_ci
C++: https://max.ru/cpluspluc
SQL: https://max.ru/sqlhub
Java: https://max.ru/javatg
Подписывайся на нужные направления и собирай себе ленту, которая реально двигает вперёд.
Окружение решает больше, чем кажется.
Собрал папки и каналы, где можно быстрее влиться в нужное направление, следить за трендами и не вариться в своём пузыре.
AI: t.iss.one/ai_machinelearning_big_data
Python: t.iss.one/pythonl
Linux: t.iss.one/linuxacademiya
Хакинг: t.iss.one/linuxkalii
DevOps: t.iss.one/DevOPSitsec
Docker: https://t.iss.one/+90Z5TAyfuNU5YmRi
Golang: t.iss.one/Golang_google
Rust: t.iss.one/rust_code
C++: t.iss.one/cpluspluc
C#: t.iss.one/csharp_ci
Java: t.iss.one/javatg
JavaScript: t.iss.one/javascriptv
React: t.iss.one/react_tg
Frontend: t.iss.one/front
PHP: t.iss.one/phpshka
Android: t.iss.one/android_its
Мобильная разработка: t.iss.one/mobdevelop
Базы данных: t.iss.one/sqlhub
Data Science: t.iss.one/data_analysis_ml
Big Data: t.iss.one/bigdatai
Математика: t.iss.one/data_math
Физика: t.iss.one/fizmat
Kubernetes: t.iss.one/kubernetc
GameDev: https://t.iss.one/gamedev
Haskell: t.iss.one/haskell_tg
Собеседования и карьера:
DS собеседования: t.iss.one/machinelearning_interview
Python собеседования: t.iss.one/python_job_interview
Папка с вакансиями: t.iss.one/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.iss.one/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.iss.one/addlist/eEPya-HF6mkxMGIy
Папка ML: https://t.iss.one/addlist/2Ls-snqEeytkMDgy
Папка Frontend: https://t.iss.one/addlist/mzMMG3RPZhY2M2Iy
Полезное сверху:
ИТ-мемы: t.iss.one/memes_prog
Английский для программистов: t.iss.one/english_forprogrammers
ИИ и технологии: t.iss.one/vistehno
954 ГБ open-source курсов: https://t.iss.one/+rKBQEMccAA01MTcy
ИТ-книги бесплатно: https://t.iss.one/addlist/BkskQciUW_FhNjEy
Max Ai: https://max.ru/ai_machinelearning_big_data
Max python: https://max.ru/pythonl
ТЕХНО: https://max.ru/vistehno
Max Go: https://max.ru/Golang_google
Max Linux: https://max.ru/linuxkalii
Devops: https://max.ru/DevOPSitsec
C#: https://max.ru/csharp_ci
C++: https://max.ru/cpluspluc
SQL: https://max.ru/sqlhub
Java: https://max.ru/javatg
Подписывайся на нужные направления и собирай себе ленту, которая реально двигает вперёд.
❤2👍1
🧠 TIL: SQLite превращает числа в текст сразу по две цифры
Обычно
и повторяем снова.
SQLite идёт хитрее.
В исходниках есть строка на 200 символов, содержащая все пары от
При преобразовании числа SQLite обрабатывает его по две цифры за раз и просто берёт нужную пару символов по индексу.
То есть вместо множества операций
делим на 100 → получаем две цифры → копируем готовую пару.
Маленькая оптимизация, но именно из таких деталей и состоит быстрый системный код.
Исходник:
Обычно
integer → string делают циклом:/ 10 → берём цифру % 10 → остаток и повторяем снова.
SQLite идёт хитрее.
В исходниках есть строка на 200 символов, содержащая все пары от
00 до 99:000102030405...979899При преобразовании числа SQLite обрабатывает его по две цифры за раз и просто берёт нужную пару символов по индексу.
То есть вместо множества операций
/10 и %10:делим на 100 → получаем две цифры → копируем готовую пару.
Маленькая оптимизация, но именно из таких деталей и состоит быстрый системный код.
Исходник:
sqlite/src/util.c🔥11❤3👍3
Виртуальных агентов обсудят на митапе «Русское техно 2» от MWS 23 октября. ⚡ Успейте зарегистрироваться.
В программе доклады и дискуссии по темам:
— Как построить control plane для персональных ИИ-агентов на Kubernetes.
— Как построить агентный производственный процесс в связке с Harness.
— Подходы к управлению командами с ИИ-агентами. Как меняются метпроцессы внутри команды?
— Когда ИИ-агент становится экономически оправданным.
А также участников ждет битва промптов и нетворкинг.
Когда: 23 октября
Формат: офлайн в Москве и онлайн
Зарегистрироваться
В программе доклады и дискуссии по темам:
— Как построить control plane для персональных ИИ-агентов на Kubernetes.
— Как построить агентный производственный процесс в связке с Harness.
— Подходы к управлению командами с ИИ-агентами. Как меняются метпроцессы внутри команды?
— Когда ИИ-агент становится экономически оправданным.
А также участников ждет битва промптов и нетворкинг.
Когда: 23 октября
Формат: офлайн в Москве и онлайн
Зарегистрироваться
🤬1
🎮 Оказывается, Wolfenstein 3D-подобный raycaster можно собрать примерно в 250 строках C++.
Принцип довольно элегантный: для каждого вертикального столбца экрана выпускается один луч через карту, а пересечения со стенами ищутся через DDA - Digital Differential Analysis.
Ключевой трюк:
После попадания в стену используется не обычная длина луча, а перпендикулярное расстояние до стены — это убирает характерное fish-eye искажение.
Дальше всё почти классически:
* рассчитывается высота стены на экране;
* выбирается текстура;
* вычисляется точка попадания;
* рисуется вертикальная полоса пикселей.
Минимум кода и уже получается полноценная псевдо-3D графика в стиле первых Wolfenstein/Doom-подобных движков.
Отличный проект, чтобы реально понять raycasting, DDA и основы старой 3D-графики.
Принцип довольно элегантный: для каждого вертикального столбца экрана выпускается один луч через карту, а пересечения со стенами ищутся через DDA - Digital Differential Analysis.
Ключевой трюк:
deltaDist = abs(1 / rayDir)После попадания в стену используется не обычная длина луча, а перпендикулярное расстояние до стены — это убирает характерное fish-eye искажение.
Дальше всё почти классически:
* рассчитывается высота стены на экране;
* выбирается текстура;
* вычисляется точка попадания;
* рисуется вертикальная полоса пикселей.
Минимум кода и уже получается полноценная псевдо-3D графика в стиле первых Wolfenstein/Doom-подобных движков.
Отличный проект, чтобы реально понять raycasting, DDA и основы старой 3D-графики.
❤2🔥2