Обновить
256K+

C++ *

Типизированный язык программирования

244,08
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности
Формат публикации

Разоблачаем магию deb-пакетов

Уровень сложностиПростой
Время на прочтение13 мин
Охват и читатели5.8K

Дорогой читатель!

Сегодня мы разберёмся, как устроены .deb-пакеты в Linux, и убедимся, что никакой магии в них нет. Превратим небольшой C++ - сервер в устанавливаемый пакет, добавим конфиг и systemd-юнит, разберёмся с зависимостями и обновлениями. Затем автоматизируем сборку и опубликуем пакет в своём APT-репозитории - чтобы устанавливать его одной командой.

Интерактивный учебник - Открыть учебник

Материалы статьи - Код и примеры на GitHub

А ловко ты это придумал....

OpenGL 4.6 без glBind: Direct State Access на C++23

Уровень сложностиСредний
Время на прочтение16 мин
Охват и читатели7.1K

Попробуйте найти в этой строке буфер, который она изменит:

glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

Буфера в строке нет. Функция получает название гнезда GL_ARRAY_BUFFER и меняет тот буфер, который кто-то привязал к гнезду раньше: может быть, строкой выше, а может быть, в другой функции и в другом файле. На правиле «сначала привяжи, потом меняй» построены самые известные учебники OpenGL, потому что они рассчитаны на версию 3.3. На том же правиле держатся ошибки, о которых OpenGL не сообщает: настройка молча попадает не в тот объект.

Начиная с OpenGL 4.5 привязывать объект ради настройки не нужно. В стандарт вошёл Direct State Access, сокращённо DSA: функции, которые получают объект первым аргументом. В статье я соберу на DSA квадрат с текстурой и индексами без единого glBindBuffer и glBindTexture и покажу на схемах, что при этом происходит внутри OpenGL. Код написан на C++23: к месту оказались std::expected, std::print, std::mdspan и новые диапазоны.

Весь код статьи собран компилятором MSVC из Visual Studio 2026 с флагом /W4 без предупреждений и запущен на OpenGL 4.6. Вот что рисует программа:

Читать далее

Исходники Borland C++ 2.0 восстановили из бинарника: BCC.EXE пересобирается байт в байт

Время на прочтение12 мин
Охват и читатели10K

Borland никогда не публиковала исходники Borland C++ 2.0. Проект borland-reborn восстановил их из самого BCC.EXE 1991 года: 298 файлов на C и TASM, собранные оригинальным тулчейном Borland, дают исполняемый файл с тем же SHA-256. Автор начал с подбора компилятора и ключей и выяснил, что 29 модулей библиотеки собраны ещё Turbo C 2.01. Затем функции подгонялись по одной, пока не совпал каждый байт, и только после этого код переписали для людей: около 3100 имён и примерно 10 000 строк комментариев. По дороге нашлись ошибки самого Borland C++: strrchr читает байт перед пустой строкой, постинкремент битового поля через дальний указатель обрывает компиляцию с «Register allocation failure», а в файлы предкомпилированных заголовков попадает мусор из кучи. Перевод описания проекта, метода и основных находок.

Читать далее

Гениально или тривиально: каким будет декабрьский митап по C++ в Петебрурге

Время на прочтение2 мин
Охват и читатели6.8K

3 декабря умножьте ваши планы на ноль, потому что в Санкт-Петербурге пройдет митап для разработчиков на С++. Встречаемся в Loft Hall на Арсенальной набережной и онлайн.

Эксперты из YADRO и Синтакора расскажут:

— как провести зануление блока памяти;
— как устроено множественное и виртуальное наследование;
— так ли просты тривиальные тейты.

После докладов оставайтесь на постерную сессию — интерактивный формат, в рамках которого можно представить свой технический проект и найти единомышленников.

✍️ Регистрация открыта, места в зале еще есть. Ждем ваши заявки!

Иду на митап

Выжимаем все соки из ch32v003

Уровень сложностиСредний
Время на прочтение15 мин
Охват и читатели6K

Иногда возникает необходимость добавить в существующую аппаратную систему новый узел для выполнения какой-то примитивной задачи. При этом сама шина и архитектура уже устоялись и достаточно "жирные" в части функционала.

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

Бомжур, ch32

TurboJedi: три недели спустя

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели8K

Терминальный просмотрщик журнала systemd от первого коммита до версии 0.13.1: весь код пишет Claude, а автор ставит задачи и читает

Это продолжение статьи «Turbo Vision спустя 36 лет: нормальный интерфейс для journald».

Три недели назад, 23 октября, в репозитории cyanide-burnout/TurboJedi появился первый коммит: «TurboJedi: Turbo Vision viewer of the systemd journal», чуть меньше пяти тысяч строк. Уже на следующий день вышла 0.1: окна журнала с фильтрами, уровнями и колонками, подсветка по правилам grc, переход ко времени. Название расшифровывается как Turbo Journald Interface, J[e]DI.

С тех пор набралось почти сто коммитов и два десятка тегов, последняя версия — 0.13.1. В Source/ сейчас больше десяти тысяч строк C++, на GitHub — четыре десятка звёзд. Каждый релиз собирается в 23 пакета под двенадцать версий дистрибутивов. Ещё четыре pull request ушли в сам Turbo Vision.

Читать далее

Универсальный ридер кодов libscanner‑unir против zxing‑cpp, ZBar и OpenCV на 6900 снимках из открытых наборов

Уровень сложностиСредний
Время на прочтение22 мин
Охват и читатели11K

EAN-13 на пачке, сфотографированной телефоном без автофокуса. Code 128 на коробке под углом, SSCC на паллетной этикетке, которая проезжает под камерой конвейера. Мы сравнили, как такие снимки читают zxing-cpp, ZBar, OpenCV и движок линейных штрихкодов нашего универсального ридера кодов (unir). Снимки — из открытых наборов с чужой разметкой, их может скачать любой, и любую цифру можно проверить.

Коротко:

Всего прочитано: unir — 72 % из 6899 штрихкодов, ZBar — 56 %, zxing-cpp — 54 %, OpenCV — 42 %.

Главная разница — на размытых снимках. На наборе Artelab-2 unir читает 93 %, соперники — от 15 до 42 %.

Ложных чтений нет у unir, zxing-cpp и ZBar на 4231 снимке без кода; у OpenCV — 7.

По скорости ридеры почти равны: на обычном снимке у всех, кроме ZBar, 10–20 мс. Если на кадр дано 60 мс, чёткие коды все читают почти одинаково, а трудные — только unir.

Слабое место unir: на снимке, который он не может прочитать, он долго перебирает варианты. И часть кодов соперники читают, а он нет — о них ниже.

Читать далее

Nokia N70: пишем софт на Symbian в 2026

Уровень сложностиСредний
Время на прочтение15 мин
Охват и читатели13K

Как писать софт на современном ПК для SDK которой больше 20 лет?

У Nokia N70 снова есть непрочитанные. Как я сделал Telegram-пейджер для Symbian 8.1.

Читать далее

Поддержка старого embedded-проекта в VS Code

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели7.8K

Как-то раз я начал работать с одним большим проектом для микроконтроллера. Как многие legacy-проекты в embedded, он привязан к старой версии IDE. В моем случае это оказался IAR 7. Эта среда обладает хорошими отладочными средствами, но работать с кодом в ней не очень комфортно: отсутствует много привычных комбинаций клавиш (Ctrl + точка, например), нет темной темы, скромная подсветка синтаксиса.

Со временем я стал все больше пользоваться VS Code для работы с кодом, а для проверки работоспособности переключался в IAR. Тогда я задумался, можно ли перенести основную работу над проектом в VS Code? Достоинств у редактора много: приятный настраиваемый интерфейс, интегрированный Git, расширения на любой вкус и задачу. Главный нюанс состоял в том, что проект должен собираться компилятором IAR, ибо написан он был строго под него.

Читать далее

Морская свинка Семён и пёс Винсент: как я с Claude Code и ChatGPT добавил в «Героев II» замки для себя и дочери

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели7.3K

Любите ли вы так Heroes of Might and Magic II, как люблю его я? Я знаю, что большинство олдскулов скажут, что Heroes 3 гораздо лучше. Да, возможно, лучше, но я начал играть в эту игру в школе в 7-8 классе. Это был 97-98 год, и тогда еще Heroes 3 не было. А эмоции от побед, прохождения кампаний, от знания чит-кодов, чтобы сделать себе черных драконов или раскрыть всю карту, от ссор с друзьями за то, что кто-то подсмотрел, как ты ходил и сыграл против тебя, уже были. И эти эмоции остались со мной навсегда. И поэтому я до сих пор играю в эту игру и даже научил играть в нее свою десятилетнюю дочь Варю.

Учитывая прогресс, на который вышли современные агенты по кодированию, я не мог не создать новой расы в этой игре, чтобы нам с дочкой было интереснее играть. В этой статье я решил подробно рассказать, как и что я сделал, возможно кого-то это вдохновит на создание своих рас в аналогичных играх.

Итак! Код писал Claude Code, рисовал агент ChatGPT, музыку сочинил Suno. Я придумывал, проверял и присылал скриншоты с красными кружочками.

Читать далее

Где еще можно обманывать игрока

Уровень сложностиПростой
Время на прочтение15 мин
Охват и читатели23K

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

Забавнее другое, когда жалобы прилетают как раз на честные системы и если вы когда‑нибудь читали форумы любой игры с выпадением лута, то точно видели там темы в духе «шанс 10% это враньё, я убил босса сорок раз и ничего не выпало». И вот потом автор такой темы начинает бобмить в ревью своими ощущениями как надо, но он неправ в своих выводах и при честных 10% сорок промахов подряд случаются примерно у одного игрока из семидесяти, а игроков у вас, допустим, сто тысяч и вот он сидит такой несчастный среди своих семидясети товарищах по «рандому» и грустит.

Сид Мейер как‑то рассказывал, как в Civilization игроки отказывались принимать честные шансы боя, при 3 к 1 в свою пользу проигрыш воспринимался как обман, потому что игрок считает что если 3 к 1, значет каждый второй бой будет в его пользу. Ну просто примите, люди когда видят циферки в играх, всегда их трактуют в свою сторону. И в итоге в Циве пришлось подкручивать шансы так, чтобы они совпадали не с математикой, а с ожиданиями людей.

Читать далее

Борьба с ложными состояниями: взгляд из C++ на Rust‑дилеммы и реактивный код

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели8.9K

Хабр, привет!

На днях наткнулся на отличную статью Никиты Тимофеенко «Вам не нужны bool и Option». Автор со стороны Rust-разработки поднимает фундаментально правильный вопрос: кодировать состояния системы разрозненными флагами вроде succeeded: bool и failed: bool — это плохой тон, ведущий к трудноуловимым багам. Система типов должна делать некорректные состояния запрещенными на этапе компиляции.

В C++ сообществе эта идея, разумеется, тоже не нова. Мы давно и успешно оборачиваем подобные вещи в std::variant, используя std::monostate как аналог отсутствия значения (можно задать псевдоним, например AbsentResult).

Но читая статью и комментарии к ней, я поймал себя на мысли: мы, разработчики, слишком сильно увлеклись мощью современных компиляторов. Как только стандарты C++ (да и Rust) дали нам инструменты для зубодробительных compile-time проверок любых сущностей, мы начали пихать эти проверки везде, где нужно и не нужно.

В этой статье я хочу показать, как правильное использование std::variant может... замаскировать серьезную ошибку проектирования архитектуры. Как увлечение построением лучшей системы типов отвлекает нас от фундаментальных вопросов проектирования систем. Мы разберем, как классические стейт-машины при поллинге (polling) заставляют нас писать тонны шаблонного кода ради проверок, которых в этой точке программы вообще не должно существовать.

Читать далее

Обновление открытого музыкального плеера fooyin 0.15.0 под Windows и Linux

Время на прочтение4 мин
Охват и читатели9.2K

Разработчик открытого проекта музыкального плеера fooyin представил обновление с версией для Windows. Ранее решение было доступно только для Linux, а вариант для macOS находится в разработке. fooyin - это настраиваемый плеер, который предлагает гибкое воспроизведение без пауз, расширенные плейлисты, управление библиотекой, поддержку FooScript, плагины и обширную интеграцию. Исходный код решения написан на С++ и опубликован на GitHub под лицензией GNU General Public License v3.0.

Читать далее

Ближайшие события

А как бы это выглядело на C? Спрашивайте чаще

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели11K

Современные компиляторы делают за нас так много, что можно написать плохо спроектированную программу – и даже не понять этого. Простой мысленный эксперимент помогает проверить, что на самом деле обеспечивает надёжность вашего кода: архитектура или гарантии языка. Представьте, что временем жизни объектов теперь приходится управлять вручную. Насколько понятными останутся правила владения ресурсами – и насколько трудно будет их соблюдать?

Читать далее

Делаю олдскульную браузерную 3D MMORPG: открытый мир без знания программирования

Время на прочтение5 мин
Охват и читатели8.8K

Задача проекта — собрать честную олдскульную 3D MMORPG в браузере (на Three.js и WebGL) с механикой классической Lineage 2 (C1–C4), в оригинальном стимпанк‑сеттинге.

Читать далее

Что исполняет C++-программа при пропущенном return после сборки с -O2

Время на прочтение5 мин
Охват и читатели7.2K

Рэймонд Чен объясняет: ud2 в коде ставят там, где программа не должна была оказаться, например в конце функции, которая должна вернуть значение, но не возвращает его, и падение на ud2 означает логическую ошибку. Я проверил обратное: если падения на ud2 нет, значит ли это, что ошибки нет. Одна и та же C+±функция прошла через 114 версий GCC и Clang для x86-64 на Compiler Explorer, плюс запуск демонстрационной программы. Без оптимизации ud2 есть у Clang и у свежих GCC. На -O2 программа с пропущенным return у всех четырёх компиляторов в демо исполнила ветку для других входных данных и завершилась с кодом 0, а функцию без единого return Clang 23.1 оставил пустой, и в демо выполнилась соседняя wipe_disk(). Успешное завершение такую ошибку не обнаруживает.

Читать далее

Вышел кроссплатформенный инструмент с открытым исходным кодом для создания скриншотов Flameshot 15.0

Время на прочтение2 мин
Охват и читатели9.6K

В начале ноября 2026 года состоялся выпуск кроссплатформенного инструмента с открытым исходным кодом для создания скриншотов Flameshot 15.0. Исходный код проекта написан на C++ и опубликован на GitHub под лицензией GNU General Public License v3.0.

Читать далее

Вышло обновление 7-Zip 26.06

Время на прочтение2 мин
Охват и читатели9.1K

В начале ноября 2026 года разработчик Игорь Павлов представил версию открытого архиватора 7-Zip 26.06. Исходный код проекта написан на языке программирования C++ и опубликован на GitHub под лицензией LGPL. Разработка архиватора ведётся с января 1999 года. Решение переведено на 87 языков.

Читать далее

Как заставить Unity‑игру печатать деньги: вводный реверс il2cpp

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели7.2K

Небольшой вводный разбор по реверсу Unity-игр на il2cpp для тех, кто только подступается к теме. Разбираю на живом примере.

Читать далее

Вышло обновление Media Player Classic — Home Cinema 2.8.5

Время на прочтение2 мин
Охват и читатели7.3K

В начале ноября 2026 года состоялся релиз открытого медиаплеера Media Player Classic — Home Cinema 2.8.5 (MPC‑HC). Исходный код решения написан на С++ и С и опубликован на GitHub под лицензией GNU General Public License v3.0. Версия MPC‑HC 2.0 вышла в январе 2023 года.

Читать далее
1
23 ...