• Qt: Пишем обобщенную модель для QML ListView

    Кому-то материал этой статьи покажется слишком простым, кому-то бесполезным, но я уверен, что новичкам в Qt и QML, которые впервые сталкиваются с необходимостью создания моделей для ListView, это будет полезно как минимум как альтернативное*, быстрое и довольно эффективное решение с точки зрения "цена/качество".


    *Как минимум, в свое время ничего подобного мне нагуглить не получилось. Если знаете и можете дополнить — welcome.


    О чем шум?


    С приходом в Qt языка QML создавать пользовательские интерфейсы стало проще и быстрее… пока не требуется тесное взаимодействие с C++ кодом. Создание экспортируемых C++ классов достаточно хорошо описано в документации и до тех пор пока вы работаете с простыми структурами все действительно достаточно тривиально (ну почти). Основная неприятность появляется, когда нужно "показать" в QML элементы какого-то контейнера, а по-простому — коллекции, и в особенности, когда эти элементы имеют сложную структуру вложенных объектов, а то и другие коллекции.


    Интересно?

    Читать дальше →
  • Пробрасываем вызовы Steam API из Wine в GNU/Linux и обратно с помощью Nim

      У игроков на платформе GNU/Linux множество проблем. Одна из них — необходимость устанавливать отдельный клиент Steam для каждой Windows игры из Steam. Ситуация усугубляется необходимостью установки ещё и родного клиента Steam для портированных и кроссплатформенных игр.

      Но что если найти способ использовать один клиент для всех игр? За основу можно взять родной клиент, а игры для Windows пусть обращаются к нему так же как, например, к OpenGL или звуковой подсистеме GNU/Linux — средствами Wine. О реализации такого подхода и пойдёт речь далее.

      Читать дальше →
      • +46
      • 8,7k
      • 8
    • STM32 blink++ или читаем данные инкрементального энкодера

      • Tutorial

      Мотивация


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



      У меня ардуино головного мозга. Пусть лично я самой средой ардуино и не пользуюсь, но всё же считаю, что это весьма полезная штука. Я слышал много ужасов про то, как начинать с stm32, и не хотел в это влезать. С другой стороны, в последнее время всё чаще стали слышны комментарии о том, что инструментарий допилили и вообще всё в шоколаде. Решил попробовать, сколько времени у меня займёт сделать простейший проект типа помигать светодидом. Купил синюю таблетку, купил китайский аналог отладчика st-link v2, и сел с этим всем разбираться.

      Забегая вперёд, вот так выглядит железка, о которой идёт речь:


      Читать дальше →
    • Флаги в аргументах функций

      • Перевод
      Вы когда-нибудь сталкивались с таким кодом?

      process(true, false);

      Эта функция, судя по названию, что-то обрабатывает (process). Но что означают параметры? Какой параметр здесь true, а какой false? По вызывающему коду об этом нельзя судить.

      Нам придется заглянуть в объявление функции, которое дает подсказку:

      void process(bool withValidation,
                   bool withNewEngine);

      Очевидно, автор использует два параметра типа bool как флаги (toggles). Реализация функции может быть похожа на это:

      void process(bool withValidation,
                   bool withNewEngine)
      {
        if (withValidation)  // используется 1-й флаг
          validate(); // % подтвердить
       
        do_something_toggle_independent_1
       
        if (withNewEngine)   // используется 2-й флаг
          do_something_new();
        else
          do_something_old();
       
        do_something_toggle_independent_2();
      }

      Назначение флагов очевидно, поскольку каждый из них имеет осмысленное название. Проблема возникает в вызывающем коде.
      Читать дальше →
    • Основные принципы C++: Правила выражений и операторов

      • Перевод
      Бобра!

      Что ж, мы плавно выходим на старт второго потока группы «Разработчик С++» и разбираем интересные материалы, которые накопились у преподавателя в свободное от работы и преподавания время. Сегодня рассмотрим (а потом и продолжим) серию материалов, где разбираются отдельные пункты С++ Core Guidelines.

      Поехали.

      В C++ Core Guidelines много правил, посвященных выражениям и операторам. Если быть точным, то более 50 правил посвящено объявлениям, выражениям, операторам и арифметическим выражениям.



      *перевод
      Информативные названия

      Оптимальная длина переменных

      • Не должны быть слишком длинными (maximimNumberOfPointsInModernOlympics.) или слишком короткими (например, x, x1)
      • Длинные названия сложно печатать, короткие названия недостаточно информативны..
      • Дебажить программы с названиями от 8 до 20 символов гораздо проще
      • Гайдлайны не заставляют вас срочно менять названия переменных на имена из 9-15 или 10-16 символов. Но если вы найдете в своем коде более короткие названия, убедитесь, что они достаточно информативны.

      Слишком длинные: numberOfPeopleOnTheUsOlympicTeam; numberOfSeatsInTheStadium; maximumNumberOfPointsInModernOlympics
      Слишком короткие: n; np; ntmn; ns; nslsd; m; mp; max; points
      В самый раз: numTeamMembers, teamMembersCount

      Читать дальше →
    • Ускоряем метод Виолы-Джонса (Viola-Jones)

        В последнее время метод Виолы-Джонса, который долгое время был основным способом детектирования объектов на изображении, отступает под натиском более новых и совершенных алгоритмов. Тем не менее, актуальность этого метода еще сохраняется и в настоящем времени.

        Да, каскадный классификатор основанный на признаках Хаара (метод Виолы-Джонса) уступает в скорости работы каскадному LBP классификатору. Он менее точен, чем детектор, основанный на HOG признаках, и тем более детектор, базирующийся на сверточных нейронных сетях. И все же у него есть определенная ниша, когда требуется точность выше, чем у LBP каскада, но скорость работы более точных детекторов недостаточна высока. Не менее важным фактором является то, что для каскадного Хаар классификатора существует большое количество уже обученных каскадов, в том числе в стандартной поставке библиотеки OpenCV. Поэтому скорость работы этого алгоритма весьма важна. Что и побудило автора в свое время занятся его оптимизацией.

        image

        Ну и какая статья об детектировании лиц, может обойтись без фотографии Лены?
        Читать дальше →
      • Ммм, длинные выходные!
        Самое время просмотреть заказы на Фрилансим.
        Мне повезёт!
        Реклама
      • Открытый урок «Диаграммы UML»

          Всем бобра!

          Наш курс «Разработчик С++» потихоньку растёт и ширится: присоединился новый преподаватель с очень богатым опытом — Юрий Авраменко. И он уже провёл у нас первый открытый урок по диаграммам UML, на котором разбирались: виды диаграмм, инструменты построения схем и диаграмм, варианты представлений и прочее.


          Ждём вопросы тут или на Дне открытых дверей.
        • Задействовать для простых тестов наследование, полиморфизм и шаблоны? Почему бы и нет…

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

            Добавлю еще, что одним из мощных стимулов к написанию данной статьи стало то, что очень часто на глаза попадаются объемные флеймыобсуждения на тему «ООП не нужно» и, особенно, «шаблоны-дженерики на практике почти никогда не нужны». Мне, как далеко не молодому программисту, начинавшему в 1990-ом как раз с инструментов, в которых не было ни ООП, ни шаблонов-дженериков, странно сталкиваться с подобными точками зрения. Но, чем дальше, тем чаще с ними сталкиваешься. Особенно со стороны приверженцев новых языков программирования, вроде Go или Rust-а.

            Сложно сказать, чем это вызвано. Может быть людей перекормили ООП (а это так и было)… Может быть задачи за несколько минувших десятилетий сильно поменялись (а это так и есть)… Может быть и просто «вот и выросло поколение»… Как бы то ни было, можно попробовать на примере из реальной жизни показать, что все не так однозначно ©.

            Итак, о чем пойдет речь?
            Читать дальше →
          • Научиться перехватывать необработанные сообщения или пример того, как SObjectizer обрастает новыми фичами…

              Нам очень приятно, когда в SObjectizer добавляются новые возможности, возникшие в результате подсказок и/или пожеланий пользователей SObjectizer-а. Хотя далеко не всегда это оказывается просто. Ведь, с одной стороны, у нас, как у команды разработчиков и старых пользователей SObjectizer-а, уже есть собственные стереотипы о том, как SObjectizer принято использовать. И не всегда получается сразу оценить «свежий взгляд со стороны», понять что реально хочет видеть пользователь во фреймворке и почему он не удовлетворен имеющимися средствами. С другой стороны, SObjectzer не такой уж и маленький фреймворк, добавление новых возможностей требует определенной осмотрительности. Нужно, чтобы новая функциональность не конфликтовала с уже имеющимися фичами. И, тем более, чтобы после добавления чего-то нового не сломалось то, что уже есть и давно работает. Плюс к тому, у нас есть пунктик по поводу сохранения совместимости между версиями SObjectizer-а, поэтому мы сильно против кардинальных изменений…

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

              Под катом небольшой рассказ о том, как в SObjectizer добавлялась одна новая фича. Может быть кому-то из читателей будет интересно посмотреть, как старый фреймворк адаптируется под запросы новых пользователей.
              Читать дальше →
            • Использование Boost.Asio с Coroutines TS

              Введение


              Использование функций обратного вызова (callback) — популярный подход к построению сетевых приложений с использованием библиотеки Boost.Asio (и не только ее). Проблемой этого подхода является ухудшение читабельности и поддерживаемости кода при усложнении логики протокола обмена данными [1].


              Как альтернатива коллбекам, сопрограммы (coroutines) можно применить для написания асинхронного кода, уровень читабельности которого будет близок к читабельности синхронного кода. Boost.Asio поддерживает такой подход, предоставляя возможность использования библиотеки Boost.Coroutine для обработки коллбеков.


              Boost.Coroutine реализует сопрограммы с помощью сохранения контекста выполнения текущего потока. Этот подход конкурировал за включение в следующую редакцию стандарта C++ с предложением от Microsoft, которое вводит новые ключевые слова co_return, co_yield и co_await. Предложение Microsoft получило статус Technical Specification (TS) [2] и имеет высокие шансы стать стандартом.


              Статья [3] демонстрирует использование Boost.Asio с Coroutines TS и boost::future. В своей статье я хочу показать, как можно обойтись без boost::future. Мы возьмем за основу пример асинхронного TCP эхо-сервера из Boost.Asio и будем его модифицировать, используя сопрограммы из Coroutines TS.


              Читать дальше →
            Самое читаемое