Обновить
256K+

C++ *

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

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

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

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

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 мин
Охват и читатели7.3K

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

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

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

Читать далее

Вайб-кодинг и AI-Native: Как мы перестали писать код руками и отдали рутину Claude Code

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

Давайте начистоту: AI-Native — это не когда у вас в IDE висит Copilot и угадывает названия переменных. Это абсолютно другой подход к созданию софта, который сейчас называют «вайб-кодингом» (vibe coding). Вы задаете высокоуровневое направление, архитектурные границы и правила игры (тот самый «вайб»), а автономный ИИ-агент пишет весь синтаксис.

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

Читать далее

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

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

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

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

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

Читать далее

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

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

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

На днях наткнулся на отличную статью Никиты Тимофеенко «Вам не нужны 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 мин
Охват и читатели8.9K

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

Читать далее

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

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

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

Читать далее

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

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

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

Читать далее

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

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

Рэймонд Чен объясняет: 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.4K

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

Читать далее

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

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

Читать далее

Ratcast — бессерверный стриминг как альтернатива Discord но не совсем

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

Всем привет! Решил посвятить отдельную статью своему приложению ratcast, которое я вскользь упоминал в прошлой статье. Оно работает по аналогии с конференциями в Discord и сосредоточено именно на этой функции. Приложение построено на моей сетевой библиотеке librats, но, в отличие от Discord, имеет полностью P2P-архитектуру: участники связываются друг с другом напрямую (и не только).

В этой статье я не буду подробно останавливаться на сетевых особенностях librats, о них можно почитать в прошлой статье. Вместо этого сосредоточусь на самом приложении ratcast и библиотеке libratcast как альтернативе librist/SRT. На них я раньше делал корпоративные решения, но они не отвечают моим потребностям в обнаружении участников.

Потребность в таком приложении назрела давно. Сейчас Discord фактически заблокирован в некоторых странах (интересно, в каких), а постоянно быть на связи со знакомыми по-прежнему нужно: мы часто вместе смотрим фильмы и играем в игры. Включать и выключать приложение обеспечивающие доступ на каждый чих и сложно, и напряжно. И тут как раз под рукой оказалась моя сетевая библиотека из проекта rats-search: её удачно получилось доточить под видеостриминг, а весь P2P-функционал в ней и так уже был.

Прежде чем перейду к статье, скачать можно тут:

https://github.com/librats/ratcast/releases

Релизы доступны на Windows, Linux, Mac OS X, Android (arm64)

Читать далее

Выпуск Sigil 2.8.5 — открытого мультиплатформенного редактора электронных книг в формате ePub

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

6 ноября 2026 года состоялся релиз бесплатного с открытым исходным кодом мультиплатформенного редактора электронных книг Sigil 2.8.5, использующего Qt6 (и QtWebEngine). Проект предназначен для редактирования книг в формате ePub (как ePub 2, так и ePub 3).

Читать далее

Zero-Host-Copy инференс: как написать пайплайн на C++/CUDA исключающий участие CPU в горячем цикле (165 FPS)

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

Когда современные нейросетевые модели с INT8-квантованием начинают выполняться за единицы миллисекунд, «узкое место» системы смещается с чистой вычислительной мощности на инфраструктуру вычислительного конвейера и операции ввода-вывода. При использовании дискретных графических процессоров многократная передача видеокадров высокого разрешения и промежуточных данных, таких как, например, bounding boxes (для случая object detection), по шине PCIe способна существенно снизить общую пропускную способность.

Архитектура Zero-Host-Copy заключается в том, чтобы начиная с чтения с диска перед декодированием и заканчивая записью на диск после финального кодирования, файлы кадров оставались в памяти GPU и обрабатывались только с помощью GPU, а копирования данных GPU -> CPU и обратно минимизировались. Если же говорить про Zero-Copy архитектуру, то под ней подразумевается передача блоков данных для обработки от одного этапа конвейера к другому исключительно по указателю без излишнего копирования данных.

Впрочем, лишние копирования CPU-GPU — не единственный скрытый фактор, снижающий эффективность конвейера. Динамическое выделение памяти в процессе работы системы столь же пагубно сказывается на быстродействии в реальном времени. Это происходит в связи с тем, что вызов cudaMalloc влечет за собой неявную синхронизацию (implicit synchronization), заставляя CPU ждать GPU, что нарушает асинхронность конвейера. Для достижения максимальной частоты кадров (FPS) высокопроизводительная система должна строиться с учетом реализации трех фаз жизненного цикла: «фаза инициализации» (initialization phase), «фаза подготовки» (warm-up phase) и «фаза активной работы» (hot phase). На этапе инициализации приложение заранее выделяет необходимые пулы памяти, буферы и очереди с начальными параметрами вложенности (глубины). В процессе фазы подготовки система запускает полную очередь обработки, где возможно срабатывание механизмов выделения дополнительных буферов в соответствии с реальной работой. Как только конвейер переходит в фазу активной работы после прогона нескольких начальных кадров, динамическое выделение памяти должно быть полностью исключено. Такая архитектура не допускает вызовов cudaMalloc или new во время выполнения, полагаясь исключительно на повторное использование уже выделенных блоков памяти для поддержания стабильной частоты (FPS).

В статье - реализация bare-metal конвейера без DeepStream: обработка видео с YOLOv8m (1024x1024-INT8) на ~165–215 FPS (RTX 3060 Ti) и ~38 FPS (Jetson Orin Nano Super).

Читать далее

Динамические списки GPIO-линий: пакетные операции с группами выводов на современном C++

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

GPIO-линии - это базовая периферия любого микроконтроллера и первое с чего начинают знакомство с новым МК. Чего может быть проще помигать светодиодом. Библиотеки производителей МК, также как и сторонние, обычно предоставляют функции записи одной линии типа HAL_GPIO_WritePin, digitalWrite, либо же запись всего порта. А часто требуется управлять сразу группой разрозненных GPIO-линий: светодиодная лента, 7-сегментный индикатор, параллельная шина данных, матричная клавиатура и т.д.

С конфигурированием GPIO-линий дела обстоят не лучше, нужно заполнять поля неудобных структур в HAL-подобных библиотеках, и часто конфигурирование по одному пину - громоздко, неудобно, много однообразного copy-paste кода.

В этой статье представлен новый метод работы с GPIO для микроконтроллеров, который сочетает возможность динамического создания групп GPIO линий и хорошую оптимизацию для групп заданных на этапе компиляции, на примере Российского МК К1921ВГ015.

Читать далее

Сделал меньше работы — стало медленнее: как я выиграл Кубок СЭРПАС 2026 на Эльбрусе. Часть 1

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

Я убрал из своего решения 60% работы, а программа стала медленнее. На Эльбрусе такое бывает чаще, чем кажется: параллельность здесь заранее расписывает компилятор, и «хитрый» код с проверками и прыжками по памяти проигрывает простому, но ровному циклу.

Этой осенью я выиграл Кубок СЭРПАС 2026, соревнование по оптимизации программ на C/C++ под процессоры Эльбрус, и в трёх статьях рассказываю, как решал задачи и что на e2k работает не так, как на x86. В первой части: чем Эльбрус отличается от привычных процессоров, как я мерил скорость и как считать 32 пары строк за один проход.

Почему стало медленнее
1
23 ...