Обновить
233.23

C++ *

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

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

Концепции Rust, которые неплохо бы знать пораньше

Время на прочтение21 мин
Количество просмотров22K

Весь минувший месяц я глаз не мог оторвать от языка программирования Rust, ведь его конёк – создание современных программ, обеспечивающих безопасную работу с памятью. За прошедшие годы появилось несколько языков, которые позиционировались как «инструмент что надо» для написания надёжного бекенд-софта. Постепенно маятник качнулся от Java/C++ к Go и Rust, выстроенных на многолетних разработках по теории языков программирования. Суть – в создании инструментов, которые были бы эффективны именно в наш век.

Читать далее

Изучение физического движка Bullet Physics. Часть 2. Примеры

Время на прочтение5 мин
Количество просмотров4.9K

Данная статья продолжает тему исследования библиотеки симуляции столкновений в Bullet Physics (Bullet). Предыдущая статья здесь.

Чтобы разбавить теоретические рассуждения, здесь будут приведены практические примеры, в которых освещено общее взаимодействие с объектами средствами Bullet.

В качестве системы визуализации используется Unreal Engine(UE), поскольку  хайповая штука и она мне знакома она бесплатна, имеет множество дополнений и, в целом, предоставляет красивую картинку “из коробки”.

Читать далее

Засылаем картинку из Unreal Engine на сервер в теле HTTP запроса

Время на прочтение10 мин
Количество просмотров4.1K

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

Довольно часто бывает ситуация, когда нужно залить картинки, сгенерированные в UE на сервер, у движка есть все части инструмента, но готового решения для отправки картинок в теле запроса, к сожалению, нет. Что ж, попробуем запилить свой велосипед, благо, это велосипед не сложный, игрушечный, можно сказать.

Читать далее

Пчела на работе, разработка игр на SFML C++

Время на прочтение4 мин
Количество просмотров12K

Предыдущая тема

Обзор игры на SFML С++. Как клонировать репозиторий и собрать проект с помощью СMake. Обзор классов игры "Пчела на работе".

Читать далее

HabraTab — девайс для хаброзависимых

Время на прочтение9 мин
Количество просмотров15K

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

Что же получилось?

XY-робот с удалённым управлением

Уровень сложностиСредний
Время на прочтение9 мин
Количество просмотров3.7K
Картинка 3dtoday.ru

Некоторое время назад, автору этой статьи пришла в голову своеобразная мысль: а что если сделать удалённо-управляемый манипулятор, который может перемещаться по XY и совершать некую полезную работу?

Сказано — сделано, и работа закипела… В качестве основы для подобного манипулятора было решено взять широко известный принцип кинематики H-bot.

Сразу следует оговориться, что сам выбор подобной тематики для проработки, был осуществлён автором не случайно, так как уже упоминалось в предыдущих статьях, автор имеет ярко выраженную склонность к «выведению виртуала — в реал» и исключительно виртуальные вещи, вращающиеся где-то там далеко за экраном, не так интересны для автора.
Читать дальше →

Boson — разработка СУБД «с нуля» (часть II)

Время на прочтение6 мин
Количество просмотров5.2K

В первой части статьи мы обсуждали разработку самого нижнего слоя СУБД Boson - CachedFileIO. Как упоминалось, статистика такого явления как Locality of Reference говорит о том, что в реальных приложениях ~95% запросов к данным локализованы в 10-15% базы данных. При этом среднее соотношение чтения/записи - 70%/30%. Это делает эффективным использование кэша (cache) работающего на основе алгоритма Least Recently Used (LRU). Реализовав его, мы получили 260%-600% прироста скорости чтения при 87%-97% cache hits.

Следующим после кэша слоем СУБД Boson является хранилище записей RecordFileIO. Это уже первый прообраз базы данных, который начинает приносить прикладную пользу. Сформулируем верхнеуровневую спецификацию требований:

Читать далее

Производительность параллельных алгоритмов STL

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

В этой статье я собираюсь провести тест производительности на компиляторе Microsoft и компиляторе GCC, чтобы ответить на простой вопрос: окупается ли политика выполнения?

 

Читать далее

Просто о RCU (Read–Copy-Update)

Время на прочтение3 мин
Количество просмотров12K

Lock-free структуры данных в общем и целом неплохо описаны в различной литературе, но на мой взгляд порог вхождения в эту тему высок. Приведу простой кейс использования одной из разновидностей данной технологии под названием RCU (Read–Copy-Update). В двух словах, это механизм неблокирующего обновления структуры данных у которой много читателей и всего один писатель. Wikipedia.

Читать далее

Размышление об Active Object в контексте Qt6. Часть 2.6

Время на прочтение4 мин
Количество просмотров2.8K

В предыдущей части цикла я описал способ вызова слота посредством очереди обработки сигнально-слотовых соединений Qt (она же очередь событий). Но совсем забыл про такую штуку, как QMetaObject::invokeMethod. А ведь эта штука позволяет добиться такого же эффекта (вызов метода в потоке-владельце QObject), но без необходимости создания сигнала.

Читать далее

Рекурсивные регулярные выражения

Время на прочтение3 мин
Количество просмотров7.7K

Принялось решение добавить регулярные выражения в свой язык программирования. По началу я подумал, что мне совершенно незачем в них разбираться и в интернете, наверняка, уже есть полно готовых библиотек. Стал искать, нашёл какие-то осколки кода на С++, которые ничего не дают. Пришлось самому разобраться, что такое регулярные выражения тут. Ради спортивного интереса, я решил сделать свою библиотеку на С++.

Стал делать и подумал, а почему бы мне не добавить туда своих тараканов. Я решил добавить две конструкции:

{namesubexpression} - вызов под выражения по имени "namesubexpression",
($namesubexpression:BodyExpression) - описание под выражения с именем "namesubexpression".

Само описание под выражения может встречаться в любом месте структуры регулярного выражения и игнорируется при поиске, подобно закоментированым: (#MeComment).
Сразу же возникает проблема бесконечной рекурсии.
Вот пример рекурсивного регулярного выражения, который недопустим: ($E:{E}){E}

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

Вот пример текста, который можно спарсить рекурсивным регулярным выражением (РРВ): [[[[[A]]]]]
А вот его РРВ: ($RRE:\[({RRE}|A)\]){RRE}

Я также решил добавить три зарезервированные конструкции:
{:String} соответствует выражению: (("(\\.|[^"])*")|('(\\.|[^'])*'))
{:Digit} соответствует выражению: (-?[0-9]+.?[0-9]*[Ee]?-?[0-9]*)
{:Name} соответствует выражению: ([A-Za-z][A-Za-z0-9]*)
Но их поисковая система не использует структурные элементы аналогичных выражений, а организованна встроенным машинным поиском, который работает значительно быстрее и возвращает одну целую строку текста, в которой содержится всё тело найденного соответствия а не части для каждого компонента в аналогичных регулярных выражениях.

Читать далее

Кодогенератор Waffle++ для C++

Время на прочтение17 мин
Количество просмотров9.4K

Кодогенератор это программа, которая на основе исходного кода или какого-нибудь файла настроек генерирует вспомогательный код, который потом компилируется вместе с исходным кодом. Это нужно, чтобы не писать boilerplate-код, а также для получения дополнительных возможностей языка.

Я делаю расширяемый кодогенератор для C++, в котором можно реализовать много полезного. Примеры модулей: перевод значений enum в строку и обратно, перевод структуры в JSON и обратно, декларативный веб-сервер, система слотов и сигналов, свой динамический полиморфизм, генератор кода для тестов...

В этом обзоре будет showcase, сравнение с другими кодогенераторами, как работают модули, как сделать свой модуль, и как подключить кодогенератор в свои проекты.

Читать далее

Подводные камни компараторов в С++

Время на прочтение9 мин
Количество просмотров11K
При использовании компаратора в алгоритмах boost::sort и std::sort важно учитывать некоторые особенности работы этих алгоритмов, игнорирование которых может привести к неожиданным последствиям, в том числе к segmentation fault.

image

Чаще всего при сортировке объектов пользовательских типов написание кода сравнения элементов коллекции не вызывает вопросов. Компаратор должен возвращать true, если первый аргумент меньше второго, то есть в отсортированном массиве первый аргумент должен идти перед вторым. Алгоритмы сначала вызывают компаратор для пары элементов x и y. Если компаратор вернул true, значит, элемент x меньше y и он должен идти в коллекции перед элементом y, если false, то компаратор вызывается повторно для пары y и x. Если компаратор опять вернул false, значит, элементы равны, иначе порядок определен.

Меня зовут Олег Игнатов, я — Development Team Lead в команде KICS (Kaspersky Industrial CyberSecurity) «Лаборатории Касперского». Мы защищаем промышленные инфраструктуры и сети от специализированных киберугроз. В этой статье расскажу о некоторых особенностях использования компараторов в С++, знание которых позволит не наступить на различные грабли и сэкономить время при разборе багов.
Читать дальше →

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

Неполная, неточная и наполовину выдуманная история исключений

Время на прочтение9 мин
Количество просмотров8.2K

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

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

Чтобы программа не грохалась, а выдавала осмысленное сообщение и давала возможность продолжить работу, надо было добавить проверку.

Читать далее

Размышление об Active Object в контексте Qt6. Часть 3. HttpManager

Время на прочтение10 мин
Количество просмотров2.1K

Во всех предыдущих статьях мы рассматривали лишь самый простой пример — сериализованный вывод сообщений на экран в отдельном потоке.

Пришло время, наконец, сделать что-то более реальное и существенное, пусть и не очень сложное. И этим будет менеджер http запросов.

Читать далее

Размышление об Active Object в контексте Qt6. Часть 2.5

Время на прочтение5 мин
Количество просмотров3.5K

Статья выпущена как дополнение к предыдущей и показывает, как можно сделать Active object, работающий асинхронно в среде Qt, но при этом не использующий события.

Читать далее

C++ по итогам 2022-го

Время на прочтение15 мин
Количество просмотров31K

Должен признать, что в некоторые из предыдущих лет C++ мог ощущаться немного «скучным» и «стабильным». Новые фичи, новый стандарт каждые три года, встречи, конференции... обычная жизнь (не считая некоторых дополнительных событий с в мире, экономике и эпидемиологической ситуации). Прошедший год отличается, потому что выглядит как «переломный» в истории C++... и кто знает, куда это заведёт нас.

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

Читать далее

SuperIndustry — Dev log #1 – Большой и страшный монстр по имени C++

Время на прочтение4 мин
Количество просмотров5.6K

Вступление

Привет, друзья! В этом цикле статей я максимально подробно буду рассказывать о процессе разработки игры на UE – SuperIndustry. Вы сможете на моем примере познать процесс разработки 3D игры на UE. Вкратце про игру: Представьте гибрид Oxygen not included и Satisfactory, в далеком будущем и на специфичной экзо планете. В игре будет глубокий сюжет, который будет повествоваться через своеобразный дневник. Главная цель – улететь с планеты (остановиться на достигнутом) или же продолжить общение с высшим Существом и узнать, что будет дальше.

Предыдущая часть.

Читать далее

Размышление об Active Object в контексте Qt6. Часть 2

Время на прочтение4 мин
Количество просмотров2.6K

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

Читать далее

Меньше точно не бывает! Делаем вольтметр на ATTINY10

Время на прочтение4 мин
Количество просмотров22K

В продолжение к прошлой статье решил пощупать и Attiny10. Ну меньше уже точно ничего нет. Если и есть такое извращение с 4 ногами, я о нем не знаю, точнее не нашел.

Тут у нас полноценный МК, в корпусе SOT-23! И задачи на нем решать можно вполне серьезные. Собрав схему на макетке, с МК на адаптере и модулем дисплея я было обрадовался, но готовая плата работать отказалась...

Читать далее

Вклад авторов