C++ Academy
15.6K subscribers
824 photos
143 videos
1 file
755 links
По всем вопросам- @workakkk

РКН: clck.ru/3FmxJF

#VRHSZ
Download Telegram
ИИ меняет не только разработку, но и дата-центры.

Когда говорят о развитии ИИ, обычно обсуждают новые модели и алгоритмы. Но по мере роста вычислительных нагрузок ограничения всё чаще возникают на уровне инфраструктуры. На infra.conf’26 Яндекс объявили, как перестраивает физическую и ML-инфраструктуру компании под новые требования.

Что меняется:

- компания переходит к концепции кампусов дата-центров мощностью до 180 МВт;
- внедряет жидкостное охлаждение для более эффективного отвода тепла и снижения энергопотребления;
- развивает внутренний сервис Dev Cluster, который ускоряет проведение ML-экспериментов и сокращает время разработки моделей.

Интересно здесь не только увеличение вычислительных мощностей. По мере развития ИИ инфраструктура всё сильнее становится частью продукта. Производительность моделей теперь зависит не только от качества алгоритмов, но и от того, насколько быстро можно предоставить вычислительные ресурсы, отвести тепло и масштабировать эксперименты.
5👍1👏1
🚀 Библиотека ycetl для C++20: constexpr на первом месте

ycetl — это заголовочная библиотека, обеспечивающая контейнеры и умные указатели, работающие как во время компиляции, так и во время выполнения. Она предназначена для создания сложных структур данных с использованием механизма памяти, который поддерживает многотипные операции.

🚀 Основные моменты:
- Контейнеры, работающие в constexpr и на этапе выполнения.
- Умные указатели с поддержкой различных схем владения.
- Многотипная память для безопасного управления типами.
- Примеры использования, включая компиляцию простых чисел и вложенных деревьев.
- Совместимость с C++20 и современными компиляторами.

📌 GitHub: https://github.com/zokrezyl/ycetl

#cpp
👍83🤔2🦄1
В C++20 у std::atomic появились wait() и notify_one().

Это удобная штука для случаев, когда поток должен просто дождаться изменения атомарного значения без mutex, condition_variable и ручного busy waiting.

Раньше для такого обычно оборачивали OS-level примитивы вроде futex или pthread_cond.

Теперь можно писать прямо так:


#include <atomic>
#include <thread>

std::atomic<bool> ready{false};

void waiter() {
ready.wait(false, std::memory_order_acquire);
}

void notifier() {
ready.store(true, std::memory_order_release);
ready.notify_one();
}


Что здесь происходит:

wait(false) блокирует поток, пока ready остаётся false.

Другой поток делает store(true) и будит ожидающего через notify_one().

Главное отличие от обычного цикла проверки - поток не крутится впустую и не жрёт CPU.

Это не полная замена condition_variable.

Для сложных predicates, очередей и нескольких условий condition_variable всё ещё нужен.

Но для простого флага, состояния или lightweight-синхронизации std::atomic::wait часто даёт более чистый и быстрый код.

C++20 тихо добавил одну из самых полезных низкоуровневых фич для concurrent programming.
🔥175👍4
⚡️ Почему RSA в OpenSSL не делает «обычное деление»

В реализации RSA внутри OpenSSL почти не используется прямое модульное деление. Вместо этого там работает Montgomery reduction - алгоритм, который ещё в 1985 году предложил Питер Монтгомери.

Идея простая: в RSA постоянно нужны операции вида «умножили большие числа и взяли остаток по модулю». Обычное деление на больших числах дорогое, поэтому его стараются избегать.

Montgomery reduction переводит вычисления в специальную форму, где параметр R выбирают как степень двойки. После этого часть дорогих делений превращается в сдвиги битов и более дешёвую арифметику.

Для пользователя это незаметная деталь. Но без таких трюков современный RSA был бы намного медленнее.

Есть хороший шанс, что HTTPS-соединение, которым вы пользуетесь прямо сейчас, где-то внутри уже опиралось на эту технику.
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍4🔥2
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/
15👍13🗿2
🚀 SIMD-ускоренное преобразование целых чисел в строки

Simditoa - библиотека для быстрого преобразования 64-битных целых чисел в десятичные строки с использованием SIMD-инструкций. Достигает скорости менее 2 наносекунд на современном оборудовании, обеспечивая высокую производительность на архитектурах x86-64.

🚀 Основные моменты:
- Поддержка AVX-512 для максимальной скорости.
- Альтернативная скалярная реализация для совместимости.
- Простой API для интеграции в проекты C++.
- Значительное ускорение по сравнению с std::to_chars.

📌 GitHub: https://github.com/simditoa/simditoa

#cpp
🔥11👍41
Красота C в том, что он почти не прячет механику компьютера.

Хочешь понять, как копируется файл? Не нужен огромный фреймворк. Достаточно посмотреть на простой C-код:

• открыть исходный файл через fopen

• открыть файл назначения

• выделить буфер через malloc

• читать кусками через fread

• записывать через fwrite

• освободить память и закрыть файлы

Всё честно и прямо: байты читаются из одного места и записываются в другое.

Именно поэтому C до сих пор так важен. Он не всегда самый удобный, но он показывает, что реально происходит под капотом.

После такого начинаешь лучше понимать не только язык, а саму систему.
👍269🥰4
🥴16😁12👍2
Один из самых дорогих багов в истории Debian начался с «невинной» правки.

В 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
👍1511🥰2🥱1
⚡️ Почему обычный `min(a, b)` в C может вернуть неожиданный результат

В 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 вроде /vuln-scan, /triage и /patch, которые можно запускать интерактивно.

Есть и автономный harness: можно настроить цель, ограничения и дать агенту самому пройти цикл анализа.

https://github.com/anthropics/defending-code-reference-harness
1
C++23 добавил `std::expected`, и это одна из самых практичных вещей в языке за последние годы.

Идея простая: функция возвращает либо нормальный результат, либо ошибку. Без исключений, без output-параметров и без неявного control flow, который потом сложно отследить.

Например, парсер заголовка может вернуть uint32_t, если всё хорошо, или std::error_code, если буфер слишком короткий. Вызывающая сторона сразу видит: здесь результат может быть ошибкой, её нельзя «случайно забыть» так же легко, как при старом стиле с кодами возврата.

Это особенно удобно для системного кода, сетевых протоколов, парсеров, embedded и всего, где исключения либо запрещены, либо нежелательны.

std::expected не делает обработку ошибок магической. Он просто заставляет контракт функции быть честным: успешный результат и возможная ошибка описаны прямо в типе.
👍164
Cuckoo hashing даёт O(1) 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.
🔥104👍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

Подписывайся на нужные направления и собирай себе ленту, которая реально двигает вперёд.

Пока кто-то листает шум, ты будешь видеть инструменты, задачи и идеи, которые помогают расти в профессии.
💔41👍1🔥1
🤖 RSA почти никогда не делит числа по модулю напрямую

Операции с огромными числами слишком дорогие, поэтому реализации 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
✔️ Furtex: исследовательский набор для Linux post-exploitation и обхода EDR

В 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👍31
От инженеров для инженеров: 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 с разбором карьерных запросов и выступление группы «Научно-технический рэп».

Конференции во всех городах пройдут и офлайн, и онлайн.

Зарегистрироваться можно здесь.
👍1🔥1
⚡️ C++26: прямой доступ к типу внутри parameter pack

В 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.
👍126🔥3