Обновить
256K+

C++ *

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

256,73
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Салют, включи кинотеатр. Управление AV-ресивером и ТВ по локальной сети

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

Всем добра! Речь пойдет о ресивере Yamaha RX-V575 и телевизоре Samsung UE50F6800AB. Оба устройства не первой свежести, более того, телевизор имеет устаревший и не развиваемый более интерфейс. Однако, полученные результаты могут оказаться полезными для владельцев множества других устройств Yamaha и Samsung. Не все ведь меняют технику ежегодно :)

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

Сразу оговорюсь, что не стоит дальше читать, если вы:

Читать далее

Trace Points в C++: диагностика production-систем без перезапуска

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

Одна из самых неприятных особенностей production-проблем заключается в том, что они почти никогда не происходят тогда, когда разработчик готов их исследовать.

Во время разработки всё работает. На тестовом стенде тоже всё выглядит нормально. Логи кажутся вполне достаточными, а диагностическая информация — продуманной и аккуратно организованной. Но затем в production внезапно появляется странная проблема: соединение иногда сбрасывается без видимой причины, один запрос из нескольких тысяч начинает вести себя иначе, сервер под высокой нагрузкой неожиданно входит в reconnect loop или где-то глубоко внутри системы начинает происходить что-то, что невозможно воспроизвести локально.

И почти всегда в этот момент выясняется одна и та же неприятная вещь: логов, которые уже есть в системе, недостаточно.

Именно здесь традиционное логирование начинает постепенно ломаться.

Большинство систем логирования до сих пор построены вокруг довольно простой идеи: заранее решить, какие сообщения должны писаться постоянно. Разработчик добавляет INFO, WARNING, DEBUG, иногда каналы или категории, после чего приложение отправляется в production с надеждой, что этих логов когда-нибудь хватит для диагностики.

Иногда действительно хватает.

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

Первой реакцией обычно становится мысль: “давайте включим DEBUG logging”. На небольших проектах это ещё может работать вполне нормально. Однако в больших системах DEBUG-логи очень быстро превращаются в проблему сами по себе. Они начинают занимать гигабайты, полезная информация тонет в шуме, растёт нагрузка на диск, а иногда и само логирование начинает заметно влиять на производительность и тайминги приложения.

Читать далее

Насколько многомерным может быть многомерный точный индекс?

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

Вот, например, Milvius(DiskANN) рассчитан на вектора размерности до 32 768, но это приближенный поиск. Но как насчёт поиска точного?

В данной статье рассматривается работоспособность 1024 мерного индекса, хранилищем которого служит обычное B‑дерево (насколько вообще может быть обычным такое дерево). Используемый диск — вполне себе «железный» старый добрый WD Purple, оперативная память сознательно ограничена 8 Гб. Можно ли что‑то из этого выжать на рядовом десктопе за приемлемое время?

Читать далее

Непослушный using

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

В прошлой статье я разобрал, как работает квалифицированный поиск и как using namespace участвует в нём только в качестве запасного варианта, когда собственных объявлений в указанной области нет. Компилятор сначала смотрит, что объявлено непосредственно в текущем контексте, и только при неудаче переходит к именам, подмешанным через директиву using. Казалось бы, схема прозрачная и предсказуемая: есть область поиска, есть приоритет явных объявлений, есть «правило N-объявлений» как страховка.

Но как только мы переходим от переменных и функций к более общим механизмам в коде, эта прозрачность сразу начинает ломаться, причём в самом обыденном коде, который пишет каждый разработчик с первых дней обучения. По правилам языка мы можем разместить директиву using namespace где угодно, но если в области, указанной в квалификаторе, что-то объявлено явно, квалифицированный поиск найдёт именно это объявление, и лишь если явно объявленного имени нет, компилятор начинает учитывать имена, ставшие видимыми через using namespace, и так далее по цепочке.

Но тут есть скользкое место, о котором умалчивает большинство учебников и курсов, обходя вниманием работу с операторами. Например оператор сдвига влево <<, может быть определён в любом пространстве имён.

ох уж этот using

GLM-5.1 придумал для меня новый алгоритм

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

Друзья, знаю, что интернет переполнен воспеванием AI, что вызывает у многих людей (особенно специалистов) фрустрацию, особенно когда речь заходит о написании кода на C/C++. Я не AI-проповедник – просто активный и ответственный программист, который пользуется AI-инструментами. Недавно я предложил AI (если быть точнее, opencode + GLM-5.1) придумать алгоритм для одной из задач, над которой я работаю, и он справился очень хорошо. Это не прорывной алгоритм, на котором я разбогатею, но он интересный: составленный из известных компонентов, но всё же новый. В статье расскажу:

Как решать задачу “дана битовая строка, нужно найти все позиции в ней, что количество единиц минус количество нулей до этой позиции равно заданному числу”

Что мне придумал AI для этой задачи

Что я использую для того, чтобы AI писал что-то адекватное на C++

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

Читать далее

Автоматизация процессов в гидравлических системах ч. 2

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

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

Полгода назад я рассказывал, как прикрутил мозги к своему гидравлическому прессу и что из этого получилось. С тех пор много воды (и масла!) утекло, сделал много нового и хочу этим поделиться.

На тот момент было несколько моделей контроллеров, вот флагманская модель

Читать далее

Vulkan API и асинхронность. Введение. Требования к архитектуре

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

Приветствую Вас, дорогой читатель! В этот раз представляю Вашему вниманию цикл статей, который будет посвящён одной из важнейших тем в программировании на Vulkan API - использование асинхронности и параллелизма для написания производительных движков.

Данный цикл не является туториалом, а лишь моей попыткой исследования основных аспектов асинхронного программирования на Vulkan API. Целью данного исследования - разработать архитектуру, упрощающую управление многопоточным выполнением, в основу которой будет положено использование корутин c++20.

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

Читать далее

Как работают с памятью в игровых консолях

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

Самая продаваемая консоль поколения имела худшую архитектуру памяти, самая технически грамотная продалась хуже всех, а самая простая в разработке принадлежала компании которая никогда раньше не делала консолей. Вы наверное узнали тут PS2, GameCube и Xbox.

Иногда шутят, что когда разработчик переносил игру с PS2 на Xbox, то первое что он делал это выбрасывал систему управления памятью и писал новую с нуля, потому что 32Мб плюс 4Мб плюс 2Мб не помещается в 64Мб.

Для чтения этой статьи вам не потребуется знать ассемблер или работать с конкретными SDK. Достаточно понимать, что такое указатель, чем стек отличается от кучи и что рендерить геометрию параллельно с её обновлением плохая идея, и что классические GPU и CPU паттерны работы по-разному нагружают память.

Там, где в тексте встречается псевдокод, он нужен для иллюстрации концепции, а не как готовый код для компиляции. Я уже подзабыл конкретные константы и названия буферов на каждой платформе, но паттерн работы всегда был примерно одинаковый.

Читать далее

Bad Apple через CSS: как заставить браузер страдать без единой строчки JavaScript

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

Есть проекты, которые рождаются не из практической необходимости, а из глубоко нездорового вопроса: а можно ли сделать это совсем не тем инструментом?

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

Поэтому давайте поставим себе задачу чуть более сомнительную, чем следовало бы: воспроизвести Bad Apple в браузере без JavaScript вообще, опираясь почти целиком на CSS и немного на серверную магию.

Ну и чтобы окончательно не сбивать градус абсурда, бекенд мы тоже не будем писать на чем-то скучно-прагматичном. Если заниматься таким делом, то с достоинством: C++26 и Boost.Beast.

Результат посмотреть можно тут и на GitHub.

Читать далее

Direct2D #10. Улучшение производительности отрисовки текстур с помощью спрайтов

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

Эта статья простым и понятным языком объясняет, что такое спрайты и как с ними работать. Всё с пояснениями к коду и необходимыми деталями

Читать далее

Беззнаковые размеры: пять лет назад мы совершили ошибку

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

Краткое примечание для читателей, не знающих о C3: это язык системного программирования, продолжающий традиции C. В статье приведена специфика C3, но все плюсы и минусы применимы к любому языку, в котором нужно выбирать типы для размеров и длин.

C3 переходит к использованию типов со знаком по умолчанию, но почему? Разве как минимум для размеров правильнее не использовать беззнаковые типы? Попытаемся ответить на этот вопрос.

Читать далее

ncpp: Как создать самодостаточную экосистему на С++98 в 2026 году, которая запустится даже на железе со свалки

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

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

Однако что если ли у вас нет доступа к последним новшествам? Если у вас на руках только кусок металлолома 20-ти летней давности? А все вендоры и поставщики давным-давно от вас отвернулись?

Давай почитаем, какой велосипед нагородили

C++: Как мы докатились до Hello World в 2 МБ

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

Казалось бы, современный С++ дает столько возможностей… Давайте попробуем препарировать всю эту необъятную мощь, начав с первого шага в любом языке программирования — «Hello World».

Как реализации компиляторов встречают новичка, впервые написавшему свои первые строчки кода?

Узнать, как же мы до такого докатились

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

Почему нормальное OBD2-приложение должно быть open-source

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

Привет хабр! Есть проекты, которые начинаются не с бизнес‑плана, не с инвесторов и не с попытки «зайти в рынок». Они начинаются чуть проще — ты смотришь на существующие решения, пользуешься ими, раздражаешься и думаешь: «А почему это до сих пор выглядит именно так?»

Примерно так у меня появился ReDrive.

ReDrive — это open‑source мобильное OBD2-приложение, которое превращает смартфон в цифровую приборную панель и диагностический инструмент для автомобиля. Идея простая: подключаешь ELM327-совместимый адаптер к OBD2-порту машины, открываешь приложение и видишь данные с ECU в понятном виде: скорость, обороты, температуру, напряжение, состояние подключения, ошибки и другую телеметрию.

Читать далее

Невидимый враг многопоточности: False Sharing и кэш-линии процессора

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

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

Читать далее

Как не перепутать мечту, портфолио и вторую работу

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

У разработчиков игр есть довольно странная профессиональная болезнь, когда после рабочего дня, проведенного за тасками и кодом хочется открыть ноутбук и снова писать код, только уже «для себя». Большинство моих коллег по цеху, придя домой тратят 1+ часов чтобы: поделать свой движок или переписать/помодить/любимую/старую/новую/другую (нужное подчеркнуть) игру или собрать какую‑нибудь библиотеку, или починить инструмент, который всех раздражает. Не знаю, может эта заразно и гуляет по студиям, а может это просто кусочек творческой атмосферы, который ты уносишь из офиса, и он некоторое время живет вне этого пространства.

Часто бывает что маленький проект, который был на «пару вечеров» внезапно превращается в несколько лет жизни. Я много раз видел это снаружи и изнутри: СorsixTH, 0AD, Akhenaten, Cytopia, StoneKingdoms, (тут больше open‑source‑games) очень разные проекты (из тех куда я комитил), но все они хорошо показывают одну и ту же вещь, что пет‑проект почти никогда не остаётся «просто маленькой штукой». Он либо умирает, либо начинает требовать от автора взрослого отношения и тянет за собой архитектуру, поддержку, документациу, общение с коллегами по цеху и теми кто просто играет, разбора багов, релизов и неприятных компромиссов.

И главный вопрос тут не «как найти мотивацию», а точно ли тебе это нужно?

Читать далее

Бониана: приложение к браслету

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

На сайте Engee в разделе «Библиотека конечных автоматов» в наглядной форме представлены КА [1]. Полюбопытствуйте. Вполне достаточно для первого знакомства. Там есть раздел «Материалы Engee по Конечным автоматам», в который помещены проекты, демонстрирующие качества КА на практике. Сейчас это три проекта — «Регулирование температуры воздуха», «Электростеклоподъемник для автомобиля» и «Управление перекрестком». Подобно проекту браслета из первой части статьи [2] на их примере покажем возможности автоматного программирования (АП) в среде ВКПа в сравнении с автоматами Engee или, что будет точнее, в сравнении с моделью Харелла, реализованной здесь.

Выберем для этого проект с светофорами. На сайте имеется следующее его описание:

«Цель этого примера — разработать модель управления перекрестком, состоящим из двух автомобильных и одного пешеходного потоков, которые управляются двумя трёхсекционными и одним двухсекционным светофорами соответственно. Алгоритм переключения секций будет определяться согласно временной диаграмме. Управляющий алгоритм будет реализован при помощи нескольких блоков Chart, а снятие входных и формирование выходных сигналов — блоками C-Function

На рис. 1 показана структурная схема проекта в Engee. На ней несколько блоков, где основные — блок Commn_Counter, который моделирует временные такты диаграммы, блок Traffic_Lights, реализующий управление, заметим, сразу двумя светофорами и блок Crosswalk для светофора потока пешеходов. Временная диаграмма работы светофоров показана на рис. 2.

Читать далее

OneOCR — скрытая OCR внутри Windows 11

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

OneOCR — это набор из двух динамических библиотек и одной модели ONNX для распознавания текста в приложениях Snipping Tool и Photos в Windows 11.

Читать далее

Простой поиск имен в С++

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

Это продолжение темы начатой в статье Важны ли компилятору имена, и продолженной в Ночью все кошки серы, а using'и одинаковы, и далее в Компиляторы тоже путаются в именах. Если не читали, то лучше будет пробежаться по диагонали. Теперь вот мы подобрались к такой интересной теме, как квалифицированный и неквалифицированный поиск.

Что такое простой поиск(неквалифицированный) имени n в области S? Это механизм компилятора, который находит все объявления n, находящиеся непосредственно в этой области. Просто? С виду да, но даже этот простой механизм часто работает не так, как ожидает разработчик.

Например, у нас есть пространство имён N и локальная переменная N. Они могут сосуществовать вместе? Могут, потому что находятся в разных областях видимости. А пространство имён и глобальная переменная с тем же именем могут? Как же мы докатились до жизни такой, давайте разбираться.

Вот такой простой с++

Универсальный Task для C++20 coroutines: тип результата, политика запуска и владение coroutine state

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

Разбор минимального пользовательского Task для C++20 coroutines: выбор promise_type для void и value-результата, политики initial_suspend(), хранение coroutine_handle, final_suspend(), сохранение результата и исключения, а также границы текущей реализации.

Читать дале