C++ Academy
16.6K subscribers
612 photos
127 videos
1 file
573 links
По всем вопросам- @haarrp

@itchannels_telegram - 🔥 best it channels

РКН: clck.ru/3FmxJF
Download Telegram
⚙️ Задача для C++ разработчиков: «Непонятная ошибка, которая портит данные»


🎯 Цель: Найти и объяснить причину скрытого неопределённого поведения, которое проявляется не сразу

📍 Ситуация:

Ты разрабатываешь кроссплатформенное приложение на C++17, которое обрабатывает массивы бинарных данных.
На тестах — всё работает. Но у части пользователей (особенно на Linux) возникают:

- Повреждённые файлы после сериализации
- Непредсказуемые вылеты при больших объёмах данных
- Валидация данных случайно "съезжает" (байты путаются)

Вот фрагмент кода:


#include <vector>
#include <cstring>

struct Packet {
uint32_t id;
char data[64];
};

std::vector<uint8_t> serialize(const Packet& p) {
std::vector<uint8_t> buffer(sizeof(Packet));
std::memcpy(buffer.data(), &p, sizeof(Packet));
return buffer;
}


🔍 Визуально всё нормально. В unit-тестах — ок. На CI — ок.
Но на проде данные иногда повреждены, и никто не может воспроизвести баг стабильно.

🧩 Задача:

1. Почему memcpy здесь небезопасен, хотя кажется логичным?
2. Что может отличаться на разных платформах и влиять на поведение?
3. Как бы ты безопасно сериализовал структуру в std::vector<uint8_t>?
4. Как это можно поймать с помощью valgrind / asan / -fsanitize=undefined?
5. Как написать cross-platform-safe сериализацию?

💡 Подсказка:
В C++ `struct Packet` может иметь **padding** и **alignment**, которые отличаются на архитектурах. `memcpy` по `sizeof(Packet)` может захватить лишние или мусорные байты.

🛠 Решение:

1. `struct Packet` не является POD-структурой с гарантированным layout — в ней может быть **неинициализированный padding**, который `memcpy` тоже копирует.

2. Проблема усиливается на системах с разным выравниванием: x86 vs ARM, GCC vs MSVC.

3. Более безопасный способ — сериализовать поля по отдельности:

std::vector<uint8_t> serialize(const Packet& p) {
std::vector<uint8_t> buffer;
buffer.insert(buffer.end(), reinterpret_cast<const uint8_t*>(&
p.id),
reinterpret_cast<const uint8_t*>(&
p.id) + sizeof(p.id));
buffer.insert(buffer.end(),
p.data, p.data + sizeof(p.data));
return buffer;
}



4. Или использовать `std::ostringstream` / `std::span` / `protobuf` / `flatbuffers`.

5. Проверка с `-fsanitize=undefined` даст warning:
```
memcpy: reading padding bytes from stack frame
```

📌 **Вывод:**
В C++ `memcpy` на структуру — это **ловушка**, если ты не контролируешь padding. Никогда не сериализуй структуры напрямую через память, если это не `
#pragma pack` и не строго определённый layout.

💬 Это вопрос для собеседования на позицию C++ системного разработчика с уклоном в безопасность и низкоуровневую разработку.

@cpluspluc
👍287🔥7😁1
🛸 F´— фреймворк для полетного ПО с открытым исходным кодом.

Разработанный в NASA Jet Propulsion Laboratory фреймворк F´ предлагает необычный подход к созданию софта для космических миссий. Этот C++-инструментарий, успешно проверенный на CubeSat и других малых аппаратах, разбивает сложные системы на компоненты с четкими интерфейсами — как LEGO для космических инженеров.

Также с помощью F’ вы сможете генерировать кода из моделей и встроенные инструменты тестирования, что ускоряет разработку критически важных систем. Установка через pip install fprime-bootstrap и туториал с HelloWorld делают старт неожиданно простым для столь нишевого инструмента.

🤖 GitHub

@cpluspluc
10🔥4👍3🥰2
Forwarded from Machinelearning
🌟 NVIDIA cuOpt: GPU-решатель для оптимизации решений.

NVIDIA опубликовала в открытом доступе свой проект cuOpt. Это набор инструментов оптимизации, который использует ресурсы и возможности GPU для решения сложных задач линейного программирования, маршрутизации и логистики.

cuOpt помогает находить эффективные решения для проблем с миллионами переменных, где традиционные методы терпят крах., превращая «нерешаемые» задачи в реальные решения, без жертвования масштабом или скоростью. Это, своего рода, «турбокомпрессоре» для задач, где время и точность критически важны, от доставки товаров до расписаний производства.

cuOpt состоит из C++-движка и API (Python, C и другие), которые работают как обертки, которые дают возможность гибко интегрировать библиотеку в разные проекты.

Для задач маршрутизаций (TSP, VRP, PDP) cuOpt генерирует начальные решения, а затем улучшает их итеративно, используя эвристические алгоритмы. Это не «лобовое» вычисление всех вариантов, а умный поиск, который экономит ресурсы и время.

Методы работы с линейным программированием (LP) и смешанными целочисленными задачами (MILP) тоже уникальны. Для LP применяется PDLP — алгоритм первого порядка, который использует градиентный спуск и работает на GPU, альтернативно запускаясь на CPU с симплекс-методом.

Смешанное целочисленное программирование - это метод математической оптимизации, позволяющий решать задачи с использованием смеси непрерывных переменных (которые могут иметь любое значение, включая десятичные и дробные), дискретных переменных и двоичных переменных.


В MILP немного сложнее: на GPU выполняются эвристики для поиска допустимых решений (локальный поиск, «feasibility pump»), а CPU занимается ветвлениями и границами, улучшая оценку. Решения между GPU и CPU обмениваются в реальном времени, создавая гибридную систему.

▶️ NVIDIA cuOpt предлагает несколько вариантов развертывания, адаптированных под разные задачи: pip, conda или готовый контейнер Docker / NSG.

Еще поддерживаются (с минимальным рефакторингом) инструменты AMPL и PuLP, с помощью которых сценарии использования cuOpt значительно расширяются.

В репозитории проекта разработчики собрали примеры и Jupyter-ноутбуки, которые можно запустить локально или в облачных сервисах: Google Colab (с выбором GPU-среды) или NVIDIA Launchable.


📌 Лицензирование: Apache 2.0 License.


🟡Страница проекта
🟡Документация
🖥GitHub


@ai_machinelearning_big_data

#AI #ML #DS #NVIDIA #CuOPT
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥82👍2
🔧 nanoMPI — минималистичная реализация MPI для обучения и экспериментов

nanoMPI — это простая и понятная альтернатива OpenMPI, созданная с нуля. Подходит для разработчиков, которые хотят понять, как устроены распределённые вычисления, а не тонуть в оптимизациях.

📌 Основные цели проекта:

🧑‍🏫 Образование
Большинство MPI-библиотек (как OpenMPI или MPICH) сложно читать — там тысячи строк про оптимизацию и производительность. nanoMPI упрощает вход: легко разобраться, как работает ring allreduce, broadcast или barrier.

💻 Локальная разработка
Вы можете писать и тестировать распределённый код на обычном ноутбуке, офлайн, без кластера, без очередей задач. Это делает nanoMPI идеальным для прототипирования и экспериментов.

🎯 Примеры применения:
• Изучение базовых паттернов MPI
• Быстрые эксперименты с распределённым кодом
• Разработка и отладка без кластера

📂 Открытый код, компактная реализация — легко вникнуть, легко доработать.

#MPI #HPC #DistributedSystems #nanoMPI #OpenSource #DevTools

🔗 GitHub: github.com/Quentin-Anthony/nanoMPI

#MPI

@cpluspluc
8🔥2🥰1
🧑‍💻 Apache NetBeans 26: новая версия классической IDE с поддержкой современных технологий.

Несмотря на растущую популярность VS Code, среда разработки NetBeans продолжает эволюционировать, представив свежий релиз с улучшенной поддержкой Java 24, Jakarta EE 11 и даже экспериментальными фичами для будущего Java SE 25.

Особого внимания заслуживает обновлённый LSP-клиент для C++ и JavaScript — теперь IDE лучше работает с языковыми серверами, постепенно догоняя по функционалу современные редакторы кода. А 150 новых SVG-иконок и исправления для HiDPI-экранов делают интерфейс приятнее для глаз.

🔗 Ссылка - *клик*

@cpluspluc
🔥74👍4
🎮 REFramework — мощный моддинг-фреймворк для игр на движке RE Engine от Capcom. Этот инструмент открывает новые возможности для кастомизации Resident Evil, Monster Hunter, Devil May Cry и других популярных тайтлов.

Проект предлагает готовые моды (VR-режим, изменение FOV, отключение виньетирования) и гибкую систему скриптов на Lua. Особый интерес представляет поддержка 6DOF VR с motion-контроллерами для RE2/RE3/RE7/RE8, что полностью меняет игровой опыт.

🤖 GitHub

@cpluspluc
👍9🔥3🤔21
Forwarded from Machinelearning
🌟 Kimi-Dev-72B: открытая модель для багфикса и тестирования кода.

Moonshot AI пополнил свое семейство Kimi моделью Kimi-Dev-72B, специализированной для программирования и разработанной для решения задач инженерии ПО. Она, как заявляют разработчики, особо эффективна в исправлении ошибок и написании тестов.

Ее сила в том, что она не просто пишет код, а имитирует мышление программиста, учитывая последствия изменений и проверяя их в автоматизированных тестах.


Специализация Kimi-Dev-72B состоит из 2 ролей: BugFixer (исправление ошибок) и TestWriter (написание тестов).

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

Модель училась на данных с GitHub: миллионы задач и коммитов из реальных проектов. За основу взяли базовую Qwen 2.5-72B, которую дообучали на ~150 млрд. токенов, тщательно фильтруя данные, чтобы исключить тестовые наборы SWE-bench.

В процессе обучения с подкреплением, модель получала награду только если все тесты в Docker проходили успешно. Также применяли «умные» подсказки, отсеивая заведомо сложные задачи, и постепенное усложнение, добавляя сложные примеры по мере прогресса.

Kimi-Dev показала рекордные 60,4% на тесте SWE-bench Verified среди open-source решений.

В будущем планируется интеграция с IDE, CI/CD, чтобы сделать модель частью ежедневного рабочего процесса разработчиков.


📌Лицензирование: MIT License.


🟡Страница проекта
🟡Модель
🖥GitHub


@ai_machinelearning_big_data

#AI #ML #LLM #KimiDev #MoonshotAI
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍4🔥2😁1
💽 KDiskMark — удобный бенчмарк дисков с графическим интерфейсом. Этот инструмент на Qt упрощает тестирование скорости HDD и SSD, скрывая сложность fio за дружелюбным интерфейсом.

Здесь есть готовые пресеты для разных сценариев — от последовательного чтения до случайных операций с мелкими файлами. Интересно, что программа умеет генерировать детальные отчёты в читаемом формате с показателями IOPS и задержек. Поддержка 20+ языков и сборка через Flatpak/Snap делают её доступной для большинства дистрибутивов Linux.

🤖 GitHub

@cpluspluc
👍8🔥43
This media is not supported in your browser
VIEW IN TELEGRAM
🚀 Разработчик показал движок на C, который работает в 14 раз быстрее Unity в браузере — и теперь доступна онлайн-демо.

Многие не поверили в заявленную разницу в производительности, поэтому он выложил демо в открытый доступ. Сравнение проводится с реальным Unity-проектом, выложенным на GitHub.

🛠️ C-движок демонстрирует:
• Существенно более высокую FPS в браузере
• Минимальную просадку при рендеринге
• Низкий overhead по сравнению с WebAssembly-сборкой Unity

💬 Автор пока не решил, выкладывать ли исходники C-версии — рассматривает вариант лицензии CC (non-commercial).



🔗 Демо: https://cgamedev.com/
🔗 Код: https://github.com/gabrieldechichi/unity_webglperftest


@cpluspluc
26👍13🔥7🥱3
😁46👍11❤‍🔥7🔥2🤣2🤔1
This media is not supported in your browser
VIEW IN TELEGRAM
🛰️ ip-nose — геолокация IP в стиле «Матрицы» прямо в терминале

ip-nose — это кроссплатформенный CLI-инструмент на C++ для определения геопозиции IP-адресов с эффектной визуализацией в стиле «Matrix». Работает на Linux и Termux.

🔹 Определение вашего IP и локации в один клик
🔹 Информация: страна, город, провайдер, координаты
🔹 Цветной интерфейс с ASCII-анимацией
🔹 Сохраняет историю запросов
🔹 Поддержка кастомной конфигурации через config.json

📦 Установка:

git clone https://github.com/Karim93160/ip-nose.git
cd ip-nose
make
sudo make install


🚀 Запуск:

ip-nose


👁 Выводит ваш публичный IP, данные о местоположении и отображает их в терминале с визуальным оформлением.

📁 Пример данных:
• IP: 45.***.***.101
• Город: Paris
• Страна: France
• ISP: Orange
• Latitude / Longitude: 48.85 / 2.35

🎯 Подходит для:
• Пентестеров и сисадминов
• CLI-энтузиастов
• Тех, кто любит красивые утилиты в терминале

🔗 GitHub

Лёгкий, эффектный и полезный инструмент для работы с IP прямо из терминала.
👍165🔥4🤷‍♂2🥰1
Научный журнал конференции AI Journey 2025: гонка за миллионом и публикацией в авторитетном журнале началась!

Рассказать о своем исследовании миру, получить миллион и бонус к научной карьере!

В рамках международной конференции AI Journey запущен научный батл с призовым фондом 1 000 000 ₽ за лучшую работу в области искусственного интеллекта. Но это не просто конкурс!

Твоё исследование может попасть в спецвыпуск «Доклады Российской академии наук. Математика, информатика, процессы управления» и его англоязычной версии Doklady Mathematics.

Условия:
— Полная оригинальность — никакого рерайта чужих статей и переизбытка цитат
Дедлайн — 20 августа (отсчёт уже идёт!)
— Языки: русский/английский

Узнать правила и подать статью на отбор -> AI Journey
2🔥2👍1
🎮 Cemu — эмулятор Wii U, который оживляет забытые игры.
Этот проект предлагает современное решение для запуска классических тайтлов Nintendo вроде Mario Kart 8 или Breath of the Wild. При этом он не просто запускает игры Wii U — он делает это с поддержкой 4K, модами и улучшенной производительностью.

При этом эмулятор пытается сохранять простоту: portable-версия для Windows не требует установки, а сообщество активно создает графические моды. Хотя macOS-сборка пока экспериментальна, на Linux и Windows большинство игр работают почти идеально.

🤖 GitHub

@cpluspluc
🔥134👍4
🧠 C++ Задача для продвинутых: загадка с `std::move` и `const`

Задача: что выведет этот код и почему?


#include <iostream>
#include <string>
#include <utility>

std::string identity(std::string&& s) {
std::cout << "rvalue reference\n";
return std::move(s);
}

std::string identity(const std::string& s) {
std::cout << "const lvalue reference\n";
return s;
}

int main() {
const std::string a = "hello";
std::string b = identity(std::move(a));
std::cout << "Result: " << b << std::endl;
}


🔍 Варианты ответов:
• a) rvalue reference
• b) const lvalue reference
• c) Ошибка компиляции
• d) Поведение зависит от компилятора

💡 Разбор:

a объявлена как const std::string. Даже после std::move(a) она остаётся const, потому что std::move не снимает константность, он лишь преобразует к rvalue:


std::move(const std::string&) → const std::string&&


Смотрим на перегрузки identity:

identity(std::string&&) — принимает неконстантный rvalue
identity(const std::string&) — принимает константный lvalue

const std::string&& не подходит к std::string&&, потому что нельзя привязать rvalue-ссылку к `const`-объекту без соответствия типов.

👉 Вызовется вторая функция, с const std::string&

Ответ: b) const lvalue reference

🧠 Вывод: std::move не делает объект мутабельным. Если объект const, он остаётся const, и rvalue-перегрузки не срабатывают.

📌 Совет: перед использованием std::move всегда учитывайте `const`-квалификатор. Он может "сломать" ожидаемую семантику перемещения.
👍185🔥3
🧠 Топ языков от евангелиста функционального программирования

Один из известных проповедников Haskell выложил свою субъективную классификацию языков программирования — от «святых граалей» до «цифровых окаменелостей».

Вот кратко по категориям:

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

S: OCaml, C++
A: Haskell, Python, Rust, Kotlin
B: Scala, Go, Ruby, Swift, C#, TypeScript
C: PHP, Clojure, Java, C, Ассемблер
D: JavaScript, Bash
E: Fortran, Objective-C, COBOL, Perl

🍿 Комментарии уже взрываются — кто-то радуется за Kotlin в A, кто-то негодует за Java в C, кто-то вообще считает, что JS заслуживает отдельной категории «F».

А вот философский вопрос на подумать:

👉 Разработчики, которые всё ещё пишут на категории E — это уверенные мастера или уже цифровые археологи?

(Спойлер: COBOL-разработчики зарабатывают больше нас всех вместе взятых.)

#языкипрограммирования #fp #разработка #devюмор #tirlist

@cpluspluc
13👍3
⚡️ DOSBox Staging — современная эволюция легендарного эмулятора DOS с поддержкой новых технологий и активным развитием. Этот форк сохраняет совместимость с классической версией, но добавляет улучшенную обработку звука, поддержку современных кодеков и удобные функции вроде записи игрового процесса.

Проект использует SDL2, предлагает кроссплатформенные сборки для Windows, Linux и macOS, а также поддерживает динамическую загрузку библиотек вроде FluidSynth. Для разработчиков есть интеграция с Tracy Profiler и система CI.

🤖 GitHub

@cpluspluc
🔥92👍2
🚀 Хотите мониторить загрузку вашей NVIDIA GPU прямо из C++?

Вот минимальный пример на C++, который использует nvidia-smi через системный вызов для получения текущей загрузки GPU и использованной памяти.

🛠 Требования:
• Установленный драйвер NVIDIA и утилита nvidia-smi
• C++17 или выше

📄 Код:


#include <iostream>
#include <cstdlib>
#include <memory>
#include <array>

void get_gpu_utilization() {
std::array<char, 128> buffer;
std::string result;

std::unique_ptr<FILE, decltype(&pclose)> pipe(
popen("nvidia-smi --query-gpu=utilization.gpu,memory.used,memory.total --format=csv,nounits,noheader", "r"),
pclose
);

if (!pipe) {
std::cerr << " Ошибка при вызове nvidia-smi" << std::endl;
return;
}

int gpu_id = 0;
while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) {
std::string line(buffer.data());
size_t pos1 = line.find(',');
size_t pos2 = line.rfind(',');

std::string util = line.substr(0, pos1);
std::string mem_used = line.substr(pos1 + 1, pos2 - pos1 - 1);
std::string mem_total = line.substr(pos2 + 1);

std::cout << "🖥 GPU " << gpu_id++ << ": " << util << "% load | "
<< mem_used << " MiB / " << mem_total << " MiB";
}
}

int main() {
get_gpu_utilization();
return 0;
}



📦 Компиляция:

bash
Копировать
Редактировать
g++ gpu_monitor.cpp -o gpu_monitor -std=c++17
📌 Вывод:

🖥 GPU 0: 17% load | 512 MiB / 8192 MiB

🧠 Подходит для:
• Мониторинга GPU в реальном времени
• Интеграции в бэкенды, боты, системы логгинга
• Лёгкой отладки ML/AI-приложений на C++
🥴15🔥13🤣52🥰2😁2👾2👻1🙉1
Sane C++ Libraries — обновление за июнь 2025

🔧 Библиотека продолжает закрывать боль C++-разработчиков: теперь ещё больше асинхронщины и удобных обёрток без лишнего шаблонного ада.

Новое:
Асинхронные операции с файлами и папками
- copy/remove/rename {file|folder}
- open/close/read/write file

Асинхронный UDP:
- SendTo, ReceiveFrom

Улучшения в файловой системе:
- Iterator, Watcher
- Убраны лишние зависимости от памяти

🔗 https://pagghiu.github.io/site/blog/2025-06-30-SaneCppLibrariesUpdate.html
🔗 https://github.com/Pagghiu/SaneCppLibraries/releases/tag/release%2F2025%2F06

@cpluspluc
11🔥7👍5👻1