volatile в C нужен не «для красоты», а чтобы компилятор не сломал работу с железом.Когда код читает memory-mapped IO регистр, значение может измениться не из-за программы, а из-за устройства.
Например:
#define STATUS_REG (*(volatile uint32_t*)0x40000000)
#define READY_BIT (1 << 0)
while (!(STATUS_REG & READY_BIT)) {
// ждём, пока железо станет ready
}
Без
volatile компилятор может решить:«Значение не меняется внутри цикла, значит можно прочитать один раз».
И всё. Опрос регистра превращается в бесконечный цикл или вообще оптимизируется не так, как вы ожидали.
Главная мысль:
volatile говорит компилятору:это значение может измениться вне твоего контроля, не трогай чтения и записи.
Важно:
volatile не заменяет mutex, atomics и memory barriers. Но для MMIO-регистров это база, без которой embedded-код может вести себя как магия из ада.❤14🖕3💊1
Godot фактически запрещает vibe coding в контрибуциях.
Причина простая: PR стало легче генерировать, но не легче проверять. Для open-source движка каждый патч всё равно должен разобрать мейнтейнер, который понимает архитектуру, риски и последствия изменений.
Теперь автономные агенты, крупные AI-сгенерированные куски кода и сгенерированный текст в issues, proposals и PR-дискуссиях запрещены. Разрешены только мелкие помощники вроде автодополнения, regex и find/replace. Помощь AI в коде нужно раскрывать.
На практике правило будет сложно применять: почти невозможно наверняка доказать, где был vibe coding, а где обычная работа разработчика.
Godot защищает не стиль разработки, а время ревьюеров. Код можно сгенерировать за минуты, но ответственность за него всё равно остаётся на людях.
godotengine.org/article/contribution-policy-2026/
Причина простая: PR стало легче генерировать, но не легче проверять. Для open-source движка каждый патч всё равно должен разобрать мейнтейнер, который понимает архитектуру, риски и последствия изменений.
Теперь автономные агенты, крупные AI-сгенерированные куски кода и сгенерированный текст в issues, proposals и PR-дискуссиях запрещены. Разрешены только мелкие помощники вроде автодополнения, regex и find/replace. Помощь AI в коде нужно раскрывать.
На практике правило будет сложно применять: почти невозможно наверняка доказать, где был vibe coding, а где обычная работа разработчика.
Godot защищает не стиль разработки, а время ревьюеров. Код можно сгенерировать за минуты, но ответственность за него всё равно остаётся на людях.
godotengine.org/article/contribution-policy-2026/
❤15👍13🗿2
🚀 SIMD-ускоренное преобразование целых чисел в строки
Simditoa - библиотека для быстрого преобразования 64-битных целых чисел в десятичные строки с использованием SIMD-инструкций. Достигает скорости менее 2 наносекунд на современном оборудовании, обеспечивая высокую производительность на архитектурах x86-64.
🚀 Основные моменты:
- Поддержка AVX-512 для максимальной скорости.
- Альтернативная скалярная реализация для совместимости.
- Простой API для интеграции в проекты C++.
- Значительное ускорение по сравнению с std::to_chars.
📌 GitHub: https://github.com/simditoa/simditoa
#cpp
Simditoa - библиотека для быстрого преобразования 64-битных целых чисел в десятичные строки с использованием SIMD-инструкций. Достигает скорости менее 2 наносекунд на современном оборудовании, обеспечивая высокую производительность на архитектурах x86-64.
🚀 Основные моменты:
- Поддержка AVX-512 для максимальной скорости.
- Альтернативная скалярная реализация для совместимости.
- Простой API для интеграции в проекты C++.
- Значительное ускорение по сравнению с std::to_chars.
📌 GitHub: https://github.com/simditoa/simditoa
#cpp
🔥11👍4❤1
Красота C в том, что он почти не прячет механику компьютера.
Хочешь понять, как копируется файл? Не нужен огромный фреймворк. Достаточно посмотреть на простой C-код:
• открыть исходный файл через
• открыть файл назначения
• выделить буфер через
• читать кусками через
• записывать через
• освободить память и закрыть файлы
Всё честно и прямо: байты читаются из одного места и записываются в другое.
Именно поэтому C до сих пор так важен. Он не всегда самый удобный, но он показывает, что реально происходит под капотом.
После такого начинаешь лучше понимать не только язык, а саму систему.
Хочешь понять, как копируется файл? Не нужен огромный фреймворк. Достаточно посмотреть на простой C-код:
• открыть исходный файл через
fopen• открыть файл назначения
• выделить буфер через
malloc• читать кусками через
fread• записывать через
fwrite• освободить память и закрыть файлы
Всё честно и прямо: байты читаются из одного места и записываются в другое.
Именно поэтому C до сих пор так важен. Он не всегда самый удобный, но он показывает, что реально происходит под капотом.
После такого начинаешь лучше понимать не только язык, а саму систему.
👍26❤9🥰4
Один из самых дорогих багов в истории Debian начался с «невинной» правки.
В OpenSSL были строки, которые выглядели странно: код подмешивал в генератор случайных чисел неинициализированную память.
Статические анализаторы и Valgrind ругались на это как на ошибку.
Мейнтейнер решил убрать предупреждение и удалил две строки.
На вид - чистка мусора.
По факту - генератор случайных чисел потерял важный источник энтропии.
И почти два года Debian OpenSSL выпускал предсказуемые ключи.
Пострадали SSL-сертификаты, SSH-ключи, VPN, серверы и всё, что зависело от нормальной криптографической случайности.
Урок жёсткий: в security-коде странная строка не всегда мусор.
Иногда это защита, которую нельзя трогать без понимания всей модели угроз.
В OpenSSL были строки, которые выглядели странно: код подмешивал в генератор случайных чисел неинициализированную память.
Статические анализаторы и Valgrind ругались на это как на ошибку.
Мейнтейнер решил убрать предупреждение и удалил две строки.
На вид - чистка мусора.
По факту - генератор случайных чисел потерял важный источник энтропии.
И почти два года Debian OpenSSL выпускал предсказуемые ключи.
Пострадали SSL-сертификаты, SSH-ключи, VPN, серверы и всё, что зависело от нормальной криптографической случайности.
Урок жёсткий: в security-коде странная строка не всегда мусор.
Иногда это защита, которую нельзя трогать без понимания всей модели угроз.
❤18👍16🥰1
C умел «объектный стиль» задолго до модных споров про ООП.
В Linux-драйверах это видно особенно хорошо. Каждый драйвер фактически реализует интерфейс, просто заполняя структуру с указателями на функции.
file_operations из include/linux/fs.h - хороший пример. Ядро говорит: вот набор операций, которые может поддерживать файл, сокет или устройство. Драйвер сам решает, какие обработчики дать:
open
read
write
release
mmap
fsync
unlocked_ioctl
Если операция не нужна, поле остаётся NULL, и ядро использует поведение по умолчанию там, где это возможно.
По сути это тот же контракт между системой и реализацией, только без классов, наследования и рантаймовой магии. Есть таблица функций, есть объект, есть набор действий, которые с ним можно выполнить.
Именно поэтому C до сих пор живёт в ядрах, драйверах и системном коде. Он не навязывает модель абстракций, но даёт достаточно низкоуровневых инструментов, чтобы собрать нужную модель самому.
Просто вместо красивого слова interface у тебя struct с function pointers.
#programming #linux #c
В Linux-драйверах это видно особенно хорошо. Каждый драйвер фактически реализует интерфейс, просто заполняя структуру с указателями на функции.
file_operations из include/linux/fs.h - хороший пример. Ядро говорит: вот набор операций, которые может поддерживать файл, сокет или устройство. Драйвер сам решает, какие обработчики дать:
open
read
write
release
mmap
fsync
unlocked_ioctl
Если операция не нужна, поле остаётся NULL, и ядро использует поведение по умолчанию там, где это возможно.
По сути это тот же контракт между системой и реализацией, только без классов, наследования и рантаймовой магии. Есть таблица функций, есть объект, есть набор действий, которые с ним можно выполнить.
Именно поэтому C до сих пор живёт в ядрах, драйверах и системном коде. Он не навязывает модель абстракций, но даёт достаточно низкоуровневых инструментов, чтобы собрать нужную модель самому.
Просто вместо красивого слова interface у тебя struct с function pointers.
#programming #linux #c
👍15❤11🥰2🥱1
В C есть неприятная ловушка: если сравнивать signed и unsigned значения, компилятор может привести оба числа к unsigned.
И тогда отрицательное число внезапно превращается в огромное положительное.
Пример:
#define min(a, b) ((a) < (b) ? (a) : (b))
int x = -1;
unsigned int y = 10;
printf("%u\n", min(x, y));
Интуитивно кажется, что минимум —
-1.Но при сравнении
x < y значение -1 приводится к unsigned и становится очень большим числом. В итоге сравнение работает уже не так, как ожидает разработчик.Именно поэтому в Linux kernel макрос
min() устроен хитрее. Он не просто сравнивает два значения, а сначала делает type check:
#define min(x, y) ({ \
typeof(x) _x = (x); \
typeof(y) _y = (y); \
(void) (&_x == &_y); \
_x < _y ? _x : _y; \
})
Ключевая строка здесь:
(void) (&_x == &_y);
Она заставляет компилятор проверить, что типы совместимы. Если один аргумент
signed, а другой unsigned, такой код может превратиться в ошибку компиляции, а не в тихий баг в рантайме.Это хороший пример системного C-подхода: лучше сломать сборку сразу, чем получить «правильный» код, который иногда считает неправильно.
В низкоуровневом коде такие мелочи решают очень много. Один неудачный implicit conversion — и проверка размера, индекса или лимита начинает работать против вас.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9🔥5🤣3
🚀 Anthropic выложили reference harness для поиска и исправления уязвимостей с Claude
Очень недооценённый репозиторий для defensive security.
Идея простая: Claude проходит полный цикл работы с уязвимостью:
* threat model
* поиск подозрительных мест
* проверка
* triage
* отчёт
* патч
Внутри есть Claude Code skills вроде
Есть и автономный harness: можно настроить цель, ограничения и дать агенту самому пройти цикл анализа.
https://github.com/anthropics/defending-code-reference-harness
Очень недооценённый репозиторий для defensive security.
Идея простая: Claude проходит полный цикл работы с уязвимостью:
* threat model
* поиск подозрительных мест
* проверка
* triage
* отчёт
* патч
Внутри есть Claude Code skills вроде
/vuln-scan, /triage и /patch, которые можно запускать интерактивно.Есть и автономный harness: можно настроить цель, ограничения и дать агенту самому пройти цикл анализа.
https://github.com/anthropics/defending-code-reference-harness
❤1
C++23 добавил `std::expected`, и это одна из самых практичных вещей в языке за последние годы.
Идея простая: функция возвращает либо нормальный результат, либо ошибку. Без исключений, без output-параметров и без неявного control flow, который потом сложно отследить.
Например, парсер заголовка может вернуть
Это особенно удобно для системного кода, сетевых протоколов, парсеров, embedded и всего, где исключения либо запрещены, либо нежелательны.
Идея простая: функция возвращает либо нормальный результат, либо ошибку. Без исключений, без output-параметров и без неявного control flow, который потом сложно отследить.
Например, парсер заголовка может вернуть
uint32_t, если всё хорошо, или std::error_code, если буфер слишком короткий. Вызывающая сторона сразу видит: здесь результат может быть ошибкой, её нельзя «случайно забыть» так же легко, как при старом стиле с кодами возврата.Это особенно удобно для системного кода, сетевых протоколов, парсеров, embedded и всего, где исключения либо запрещены, либо нежелательны.
std::expected не делает обработку ошибок магической. Он просто заставляет контракт функции быть честным: успешный результат и возможная ошибка описаны прямо в типе.👍16❤4
Cuckoo hashing даёт O(1) lookup в худшем случае
Не амортизированно.
Не «в среднем».
А именно worst case.
Идея красивая: у каждого ключа есть ровно две возможные позиции в таблице.
Поэтому поиск тупо проверяет оба места и заканчивается.
Вставка работает интереснее: если место занято, новый ключ «выталкивает» старый в его альтернативную позицию.
Отсюда и название: как кукушка, которая выкидывает чужие яйца из гнезда.
Если начинается цикл, таблицу перестраивают с новыми хеш-функциями.
Алгоритм предложили Rasmus Pagh и Flemming Rodler в 2001 году.
И это не просто академическая штука: Linux kernel использует cuckoo hashing в connection tracking table.
Один из тех случаев, когда простая идея даёт очень сильную гарантию по lookup.
Не амортизированно.
Не «в среднем».
А именно worst case.
Идея красивая: у каждого ключа есть ровно две возможные позиции в таблице.
Поэтому поиск тупо проверяет оба места и заканчивается.
return table1[h1(key)] == key
|| table2[h2(key)] == key;
Вставка работает интереснее: если место занято, новый ключ «выталкивает» старый в его альтернативную позицию.
Отсюда и название: как кукушка, которая выкидывает чужие яйца из гнезда.
Если начинается цикл, таблицу перестраивают с новыми хеш-функциями.
Алгоритм предложили Rasmus Pagh и Flemming Rodler в 2001 году.
И это не просто академическая штука: Linux kernel использует cuckoo hashing в connection tracking table.
Один из тех случаев, когда простая идея даёт очень сильную гарантию по lookup.
🔥10❤4👍1🥰1
🔥 Хочешь быстрее расти в IT? Хватит учиться в одиночку
В 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: t.iss.one/DevopsDocker
Golang: t.iss.one/Golang_google
Rust: t.iss.one/rust_code
C++: t.iss.one/cpluspluc
C#: t.iss.one/csharp_1001_notes
Java: t.iss.one/java_library
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 курсов: @courses
ИТ-книги бесплатно: 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
Подписывайся на нужные направления и собирай себе ленту, которая реально двигает вперёд.
Пока кто-то листает шум, ты будешь видеть инструменты, задачи и идеи, которые помогают расти в профессии.
В 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: t.iss.one/DevopsDocker
Golang: t.iss.one/Golang_google
Rust: t.iss.one/rust_code
C++: t.iss.one/cpluspluc
C#: t.iss.one/csharp_1001_notes
Java: t.iss.one/java_library
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 курсов: @courses
ИТ-книги бесплатно: 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
Подписывайся на нужные направления и собирай себе ленту, которая реально двигает вперёд.
Пока кто-то листает шум, ты будешь видеть инструменты, задачи и идеи, которые помогают расти в профессии.
💔4❤1👍1🔥1
Операции с огромными числами слишком дорогие, поэтому реализации RSA используют редукцию Монтгомери.
Идея Питера Монтгомери из 1985 года:
выбирается R = 2^k
деление на R заменяется битовым сдвигом
модульные вычисления выполняются через умножения, сложения и сдвиги
За счёт этого быстрее считается:
a^e mod NЭто критично для:
шифрования и расшифровки
цифровых подписей
TLS-соединений
банковских операций
Редукция Монтгомери десятилетиями работает внутри криптографических библиотек, хотя большинство пользователей даже не знает о её существовании.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍3🔥2🤔2
В open source вышел Furtex - низкоуровневый toolkit для изучения техник post-exploitation и evasion в Linux.
Проект построен вокруг io_uring, BPF и eBPF. Автор намеренно отказался от liburing и готовых фреймворков: взаимодействие с ядром реализовано через raw syscalls.
В репозитории собраны эксперименты для:
- анализа возможностей io_uring
- исследования BPF-карт и программ
- тестирования Linux EDR
- изучения видимости событий для средств мониторинга
- проверки защитных правил Falco
- исследования сетевых и процессных механизмов ядра
Furtex интересен специалистам по Linux security, разработчикам EDR и red team-инженерам, которым важно понимать, какие действия могут проходить мимо привычных точек наблюдения.
Автор отдельно подчёркивает: проект предназначен только для разрешённых исследований и тестирования собственной инфраструктуры.
https://github.com/MatheuZSecurity/Furtex
#linux #cybersecurity #ebpf #io_uring #research
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍3❤1
От инженеров для инженеров: 1 августа в Москве, Белграде и Ереване пройдет бэкенд-конференция Яндекса — Back to Back
Старый добрый C++ Zero Cost Conf расширил формат и добавил новые бэкенд-направления — от низкоуровневой эффективности и производительности до архитектуры и надёжности продакшен-систем. Всего доступно два трека: C++ Zero Cost (Москва/Белград) и Architecture & Performance (Москва/Ереван).
— В Москве Антон Полухин, руководитель РГ21 C++, обсудит главные новости со встречи Международного комитета по стандартизации C++, ответит на вопросы о развитии C++26 и планах на C++29.
— Там же Константин Владимиров и Елизавета Носкова из Syntacore, разберут, что C++ программист должен знать про ABI. А Антон Пионтковский, разработчик YDB, расскажет, как мы считаем range-предикаты с помощью битовых масок и как комбинировать их между колонками.
Три города — три программы: Москва, Белград и Ереван.
Если планируете посетить конференцию в Москве, вас ждут экспертные сессии 1:1 с разбором карьерных запросов и выступление группы «Научно-технический рэп».
Конференции во всех городах пройдут и офлайн, и онлайн.
Зарегистрироваться можно здесь.
Старый добрый C++ Zero Cost Conf расширил формат и добавил новые бэкенд-направления — от низкоуровневой эффективности и производительности до архитектуры и надёжности продакшен-систем. Всего доступно два трека: C++ Zero Cost (Москва/Белград) и Architecture & Performance (Москва/Ереван).
— В Москве Антон Полухин, руководитель РГ21 C++, обсудит главные новости со встречи Международного комитета по стандартизации C++, ответит на вопросы о развитии C++26 и планах на C++29.
— Там же Константин Владимиров и Елизавета Носкова из Syntacore, разберут, что C++ программист должен знать про ABI. А Антон Пионтковский, разработчик YDB, расскажет, как мы считаем range-предикаты с помощью битовых масок и как комбинировать их между колонками.
Три города — три программы: Москва, Белград и Ереван.
Если планируете посетить конференцию в Москве, вас ждут экспертные сессии 1:1 с разбором карьерных запросов и выступление группы «Научно-технический рэп».
Конференции во всех городах пройдут и офлайн, и онлайн.
Зарегистрироваться можно здесь.
👍1🔥1
⚡️ C++26: прямой доступ к типу внутри parameter pack
В C++26 появился pack indexing. Теперь тип по индексу можно получить напрямую из набора параметров:
Индексация начинается с нуля.
Раньше для этого использовали
Новый синтаксис короче и понятнее:
Пригодится в шаблонных библиотеках, метапрограммировании, traits и compile-time API.
В C++26 появился pack indexing. Теперь тип по индексу можно получить напрямую из набора параметров:
template<std::size_t I, typename... Ts>
using nth_t = Ts...[I];
using Second = nth_t<1, int, double, std::string>;
// Second = double
Индексация начинается с нуля.
Раньше для этого использовали
std::tuple_element_t, вспомогательные шаблоны или рекурсию:
template<std::size_t I, typename... Ts>
using old_nth_t = std::tuple_element_t<I, std::tuple<Ts...>>;
Новый синтаксис короче и понятнее:
Ts...[I]
Пригодится в шаблонных библиотеках, метапрограммировании, traits и compile-time API.
👍12❤6🔥3