Ваша корзина пуста.
Штрихкод и с чем его едят на плюсах. Сегодня я покажу вам как я писал простейший сканер штрихкодов EAN-8 и EAN-13. Конечно, я мог бы взять готовые и более функциональные сканеры из интернета, НО зачем? Зачем, если можно сделать самому, если можно развить свои навыки и расширить портфолио? Вот и я так подумал...
Если вы заинтересовались - я сейчас вам раскачаю про код...
Просканировать статьюЕсть много проектов, целью которых является превратить С++ более "безопасный" язык программирования. Но внесение изменений в синтаксис языка обычно нарушает обратную совместимость со старым кодом, который был написан до этого.
Недавно вышла новая версия библиотеки memsafe для языка С++, которая превращает его в Rust с помощью плагина Clang добавляет в С++ безопасное управление динамической памятью и контроль инвалидации ссылочных типов данных во время компиляции приложения.
Но данная статья не о библиотеке, а об особенностях разработки анализатора программы на С++ в виде плагина для Clang.
Можно считать, что это подведение итогов по результатам сравнения нескольких разных способов создания плагина для компилятора С++, а так же очередной Хабрахак для хранения результатов экспериментов и публикации итоговых выводов, которые я решил сохранить не только для себя, но и в виде статьи на Хабре, что бы результатами моего труда могли воспользоваться и другие хорошие люди :-), которым так же может потребоваться погрузиться в дебри парсинга исходного текста программ.
Читать дальше →Иногда надо создать функцию, которая должна быть и доступна в blueprints, и адаптироваться под входные данные. Особенно это касается wildcard.
Можно прибегнуть к ручной прописке рефлексии UFUNCTION. Однако, у этого есть свои ограничения. Для таких случаев в движке есть довольно старый класс – UK2Node.
Читать далееВ финальной части нашей трилогии, посвящённой Nau Engine, мы уделим внимание ошибкам, возникающим при разработке классов. Приведённые в статье примеры наглядно демонстрируют, как даже небольшие недоработки могут обернуться серьёзными проблемами в работе приложения.
Читать далееНедавно МЦСТ опубликовала кросскомпилятор для «Эльбрус». Это большой шаг в развитии платформы. Теперь любой человек может собрать программу под е2к на своем домашнем компьютере.
В этой статье вас ждет инструкция по ручному развертыванию всего окружения для разработки под е2к, скрипт для автоматического развертывания, а также Docker-контейнер с готовым окружением. Благодаря контейнеру процесс развертывания упрощается до вызова одной команды, а также он позволяет работать даже на Windows.
Если вы хотели попробовать собрать свой код или какой-нибудь другой код под «Эльбрус», то сейчас самое время.
Читать далееБыл проведён эксперимент для проверки, можно ли существенно уменьшить объём вычислений в алгоритме обратного распространения ошибок с параллельными вычислениями за счёт использования на каждом шаге обучения только части обучающих образцов, выбранных случайным образом, а также определение того, какой выигрыш по времени даст использование языка Ассемблера в самых внутренних циклах (в программе, написанной на языке C++).
За основу был взят классический персептрон и алгоритм обратного распространения ошибок, основанный на методе градиента, который объяснялся на курсе Mashine Learning Стэнфордского университета. Он был доработан, чтобы можно было использовать параллельные вычисления. Была написана программа на языке C++ для Linux, её функции (создание, обучение нейронной сети, распознавание данных, закачка больших файлов на сервер и т. п.) вызываются из программ, написанных на любых языках программирования, по протоколу Socket.
Для параллельных вычислений создаётся ntheads объектов нейронной сети, где ntheads — количество потоков (процессоров), в которые записываются части большого массива обучающих образцов, и на каждом шаге алгоритма обратного распространения ошибок совершается прямое и обратное распространение для каждого образца, имеющегося у объекта нейронной сети. Вычисления для каждого объекта производятся в отдельном потоке. Результатом этих вычислений являются суммарные градиенты слоёв сети каждого объекта, они суммируются друг с другом, и полученные градиенты используются для модификации матриц весов нейронной сети, которые затем прописываются во все слои сети объектов нейронной сети.
Читать далееРассматриваем различные «приколюхи» из C++20 на примере хеш‑мапы!
В статье я разобрал разные способы реализации тех или иных методов в хеш-мапе, так же провел небольшой анализ над ними. Статья является научно-просветительской и немного исследовательской.
В std::move никто никуда не двигается
В undefined behavior поведение вполне себе определено, просто крашит игру
В GameObject нет ни игры ни объекта, а только баги и куча антипаттернов
Memory leak detector сам протекает
В PhysicsEngine физики столько же, сколько в сказке про Колобка
Из 8 часов работы 6 уходят на попытку собрать билд после мержа со стейблом.
В ProfileMode тормозит всё кроме профайлера
В retrospective meeting обсуждают, почему всё плохо, но оставляют как есть.
В debug билде багов меньше чем в релизном и выше фпс
По мотивам шипнутых проектов...Поиск работы в IT — это как приключение с кучей загадок и испытаний. Ты можешь застрять на этапе «где взять опыт, если без опыта не берут?» или ломать голову, почему резюме снова улетело в мусорку. И я сам, и мои менти прошли этот тернистый путь, начиная с пары корявых сайтов и telegram ботов, которые стыдно было показывать, доходя до офферов, которые казались недосягаемыми. И знаешь что? Это не миф, а вполне реальная цель, если у тебя есть план и немного упорства. В этой статье я поделюсь планом, который помог и мне, и моим менти, добавлю личные истории и инсайты, чтобы ты приблизился к своему офферу.
Читать далееК сожалению, в Qt Creator нет таких же удобных диагностических инструментов, как Visual Studio Diagnostic Tools. Поэтому, для удобства, многим удобнее было бы пользоваться разработанным плагином DiagnosticTools для Qt Creator (Qt5, Qt6), в котором вы можете получить подробную информацию о разрабатываемых приложениях во время отладки кода.
Читать далееОдин из частых вопросов, которые я получаю от студентов или на наших внутренних студийных лекциях, — это какую стратегию выделения памяти лучше применять при разработке? Ответ: хотелось бы никакую, т.е. не использовать аллокации рантайм, но жизнь вносит свои коррективы.
Мы все знаем, что нельзя просто выделять память, когда вздумается, но откладываем решение этой проблемы до конца проекта. К тому времени дедлайны начинают давить, майлстоуны и некоторые части тела подгорать, и обычно уже слишком поздно, чтобы вносить серьезные изменения. Ну хотябы есть пара недель перед релизом, чтобы поправить основные проблемы.
Динамическое выделение памяти — это как раз то, что относится к той категории вещей для большинства программистов, о которой все знают, но забивают пока не приходит OOM. Хотя немного продуманности и предварительного планирования могут помочь избежать большинства этих проблем, и даст небольшую надежду, что игра не вылит по памяти в самый неподходящий момент.
Попробую убедить вас не использовать std::string/vector в функциях. При написании кода для пк, неважно - игры это или что-то другое, программа обычно разделяется на условно пять областей памяти.
Burn them allКак для разработчика игр, некоторые из моих самых креативных работ появились из принятия ограничений, а не борьбы с ними. Как бы нелогично это ни звучало, ограничение возможностей оборудования или абстракций заставляет вас мыслить нестандартно гораздо больше.
Чтобы дать вам такой опыт, существуют онлайн фэнтезийные игровые консоли, такие как PICO-8 (небесплатная) и TIC80, которые делают очень доступным создание прототипов и получение минимальных навыков. Также есть аппаратные системы, такие как Playdate (пропиетарная), которые работают с методами ввода и форм-факторами еще больше ограничивая вашу площадку для игр. Наконец, есть процветающие сообщества энтузиастов-любителей вокруг таких консолей как SNES и N64 (посмотрите на этот потрясающий демейк Portal!).
Лично я всегда питал слабость к Wii. Отчасти потому, что я вырос на ее невероятных играх, таких как Super Mario Galaxy 2, но также потому, что моддинг игр для Wii дал мне возможность заглянуть в то, что позже станет моей карьерой: разработку игр. Хотя я и занимался разработкой для Wii в прошлом, я никогда не чувствовал что действительно понимаю что делаю. Пару месяцев назад я решил это исправить. Имея законченное задание по DirectX для университетского курса программирования графики и открытые возможности «вы можете добавлять дополнительные функции, чтобы повысить свои оценки, но они не являются обязательными», я подумал: что, если я приду на экзамены со своим Wii и сделаю презентацию на нем?
Читать далееПривет, Хабр! Меня зовут Кирилл Колодяжный, я работаю в YADRO и продолжаю изучать машинное обучение на С++. Я уже писал, как реализовать модели для распознавания лиц на фото и для поиска объекта в пространстве с помощью computer vision. Ссылки на материалы ищите в конце статьи.
Сегодня затрону «математическую» тему и расскажу о реализации сверток: что это за операция и какие есть алгоритмы для вычисления. Приведу простые примеры с кодом, чтобы вы могли опробовать решения.
У статьи будет вторая часть: про особенности реализации одного из этих алгоритмов с использованием CUDA в рамках фреймворка PyTorch и про то, как адаптировать его под свои задачи.
Читать далееПри написании своей VM для RISC-V возникла необходимость в тестировании.
Сначала я пытался писать юнит-тесты самостоятельно, но выходило, что я просто копирую логику из основной.
И по сути тестирую не соответствие спецификации, а соответствие моему пониманию.
Через некоторое время я наткнулся на официальный набор тестов для RISC-V и решил их использовать.
Это помогло найти несколько багов в моём коде.
Что ж.C++ шаблоны — мощный инструмент, но работать с ними бывает больно: многословные ошибки, путаница с типами и enable_if, который все усложняет. Concepts в C++20 появились, чтобы упростить жизнь разработчикам и сделать шаблонный код понятнее. В этой статье — разбор конкретного кейса: как с помощью концептов задать корректные ограничения на контейнеры, избежать ловушек с массивами и получить внятные ошибки от компилятора.
Читать далееСегодня мы поговорим про std::span и как не порезаться на острых углах C++.
Согласно определению на cppreference, шаблон класса span описывает объект, который может ссылаться на непрерывную последовательность объектов, где первый элемент последовательности находится на позиции ноль.
Вообще, с учётом того, что, начиная с С++17 мы уже знакомы с понятием string_view, можно представить, что std::span — это нечто подобное, только действующее для непрерывных участков памяти, которые ещё можно и модифицировать. Но не будем забегать вперед, обо всех свойствах по-порядку.
Читать далееАлександр Лонин, руководитель группы полигонального моделирования C3D Labs, к.ф.-м.н, представляет новую разработку компании — полигональное ядро C3D PolyShaper — и рассказывает о новых возможностях инструментов реверс-инжиниринга, алгоритмах модификации при процессинге сеток, диагностике и лечении сеток.
Читать далееВсем привет! Меня зовут Василий Куликов, я работаю ведущим разработчиком в Техплатформе Екома и Райдтеха Яндекса и последние пять лет разрабатываю фреймворк userver.
Это веб‑фреймворк, который позволяет создавать высоконагруженные отказоустойчивые сервисы на С++. Сегодня я расскажу, как написать на нём игрушечный, но рабочий сервис, который реализует функциональность pastebin.
Читать далееОчень добрый день!
Меня зовут Тимур и я программист.
Сегодня я хочу продолжить разговор о поддержке расширений браузера (хромиум) на Андроид. В прошлой своей статье я рассказал о том что у меня получилось завести расширения но народ так занят стенаниями по поводу закрытия проекта Kiwi что никто особо на это внимания не обратил, поэтому буду краток, это скорее промежуточный отчет чем анонс.
Читать дальше →В биографии Эдуарда Лимонова — писателя, диссидента и политика — есть неожиданный эпизод: в конце 1970-х годов, во время жизни в США, он подрабатывал в IT-сфере и, по некоторым данным, участвовал в разработке ранних версий языка C.
Читать далееПолный список здесь