• МЭМС акселерометры, магнитометры и углы ориентации



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

    Чтобы понять, на какие точности углов мы можем рассчитывать, нужно приложить некоторое количество усилий.

    TL;DR: Описан небольшой скрипт для Octave/MATLAB, позволяющий оценить ошибки расчёта углов ориентации по измерениям МЭМС акселерометров и магнитометров. На входе скрипта — параметры датчиков из даташитов (и/или погрешности калибровки). Статья может быть полезна тем, кто начинает использовать инерциальные датчики в своих устройствах. Небольшой ликбез по датчикам прилагается. Ссылка на гитхаб тоже.
    Вот как мы решили эту задачу:
  • Блендинг и Unity Terrain: как избавиться от пересечений и перестать делать глазам больно

      Для того, чтобы получить реалистичный мир внутри игры, необходимо учитывать взаимодействие различных форм рельефа между собой и с другими моделями. И если видимые линии пересечения между 3D-моделями портят органичность изображения, стоит задуматься над тем, как их устранить. Самый распространенный случай таких линий, который может быть знаком многим, — пересечение билбордов частиц с непрозрачной геометрией.

      image

      Другой пример — нарушающие естественность композиции пересечения скал и растительности с поверхностью ландшафта в сценах «на открытом воздухе».

      image

      Помимо разнообразных методов сглаживания (SSAA, MSAA, CSAA, FXAA, NFAA, CMAA, DLAA, TAA и др.), которые пусть и смягчают вызывающий внешний вид таких линий пересечений, но не исправляют ситуацию в полной мере, существуют и более действенные приемы. Их мы и рассмотрим.
      Читать дальше →
      • +35
      • 6.5k
      • 9
    • FSE кодирование

        Finite State Entropy (FSE) – алгоритм энтропийного кодирования, чем-то похожий и на алгоритм Хаффмана, и на арифметическое кодирование. При этом он взял лучшее от них обоих: работает так же быстро, как хаффмановский, и со степенью сжатия как у арифметического кодирования.

        FSE принадлежит семейству кодеков ANS (Asymmetric Numeral Systems),  изобретённых Яреком Ду́дой. На основе его исследований Ян Колле разработал оптимизированный вариант алгоритма, впоследствии названный FSE.

        В заметках Яна Колле непросто разобраться, поэтому я изложу объяснение в несколько ином порядке, более удобном для понимания, на мой взгляд.


        Читать дальше →
        • +41
        • 11k
        • 6
      • Энтропийное кодирование rANS или как написать собственный архиватор

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



          Статья написана, в основном, по материалам блога, который ведёт Fabian Giesen.
          Читать дальше →
          • +34
          • 5.9k
          • 7
        • Sampler. Консольная утилита для визуализации результата любых shell команд

            В общем случае с помощью shell команды можно получить любую метрику, без написания кода и интеграций. А значит в консоли должен быть простой и удобный инструмент для визуализации.


            Sampler


            Наблюдение за изменением состояния в базе данных, мониторинг размера очередей, телеметрия с удаленных серверов, запуск деплой скриптов и получение нотификации по завершению — конфигурируется за минуту простым YAML файлом.


            Код доступен на гитхабе. Инструкции по установке — для Linux, macOS и (экспериментально) Windows.

            Читать дальше →
          • Не морочьте мне голову со своим функциональным программированием

              Адепты функционального программирования любят завлекать новичков обещаниями идеальной выразительности кода, 100% корректностью, лёгкостью поддержки и простотой рефакторинга, а иногда даже пророчат высочайшую производительность. Однако, опытные разработчики знают, что такого не бывает. Программирование — это тяжёлый труд, а «волшебных таблеток» не существует. 

              С другой стороны, элементы функционального стиля программирования уже проникли в промышленные языки программирования, такие как Swift и Kotlin. Разработчики этих языков прекрасно знакомы с функциональным программированием, поэтому смогли применить его «в малом», предусмотрев многие, хотя и не все, необходимые компоненты. Чем дальше — тем больше части ФП внедряются в промышленные ЯП, и тем качественнее и полнее реализуется поддержка.

              Уметь программировать в функциональном стиле полезно, чтобы упрощать себе работу, и сейчас мы посмотрим, как этим воспользоваться!


              Виталий Брагилевский — преподаватель ФП, теории алгоритмов и вычислений, автор книги «Haskell in Depth» и участник комитетов Haskell 2020 и наблюдательного комитета компилятора GHC.
              Читать дальше →
            • Нейросети и глубокое обучение, глава 5: почему глубокие нейросети так сложно обучать?

              • Translation

              Представьте, что вы – инженер, и вас попросили разработать компьютер с нуля. Как-то раз вы сидите в офисе, изо всех сил проектируете логические контуры, распределяете вентили AND, OR, и так далее,- и вдруг входит ваш босс и сообщает вам плохие новости. Клиент только что решил добавить неожиданное требование к проекту: схема работы всего компьютера должна иметь не более двух слоёв:



              Вы поражены, и говорите боссу: «Да клиент спятил!»

              Босс отвечает: «Я тоже так думаю. Но клиент должен получить то, что хочет».
              Читать дальше →
              • +23
              • 11.9k
              • 2
            • CMake и C++ — братья навек

              • Tutorial

              Дружба навек


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


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


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


              1. Сборку;
              2. Автозапуск тестов;
              3. Замер покрытия кода;
              4. Установку;
              5. Автодокументирование;
              6. Генерацию онлайн-песочницы;
              7. Статический анализ.

              Кто и так разбирается в плюсах и си-мейке может просто скачать шаблон проекта и начать им пользоваться.
              Читать дальше →
            • Ликбез по передаче параметров по значению в конструкторы и сеттеры (современный C++, примеры)

                Судя по комментам habr.com/ru/post/460831/#comment_20416435 в соседнем посте и развернувшейся там дискуссии, на Хабре не помешает статья, как правильно передавать аргументы в конструктор или сеттер. На StackOverflow подобного материала полно, но тут что-то я не припомню.

                Потому что пример в той статье полностью корректен, и автор статьи абсолютно прав. Вот этот пример:

                // Хорошо.
                struct person {
                  person(std::string first_name, std::string last_name)
                    : first_name{std::move(first_name)} // верно
                    , last_name{std::move(last_name)} // std::move здесь СУЩЕСТВЕНЕН!
                  {}
                private:
                  std::string first_name;
                  std::string last_name;
                };
                

                Такой код позволяет покрыть все (ну ладно, почти все) возможные варианты использования класса:
                Читать дальше →
              • Адаптация программ для ZX Spectrum к TR-DOS современными средствами. Часть 3

                • Tutorial

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


                Floppy 5.25"

                Читать дальше →
              • Yandex Retro Games Battle 2019 — разрабатываем игры для ZX Spectrum

                  Привет! Меня зовут Дмитрий Пугачев, я помогаю развивать музей Яндекса, в котором наша команда собирает редкие и интересные экземпляры вычислительной техники. Недавно мы приглашали читателей Хабра посетить наш музей в рамках акции «Ночь музеев». Честно говоря, мы не ожидали, что из желающих зайти к нам в гости выстроится очередь «как за новым айфоном», а два геймпада и вовсе отправятся на ремонт после турнира по Mortal Kombat. И это вдохновило нас!

                  Сегодня я расскажу о нашей новой инициативе, ориентированной на сообщество любителей ретро-игр, — о конкурсе по разработке игр для легендарного ZX Spectrum. Насколько это актуально? В чём особенности именно этого устройства? Предлагаю вспомнить и обсудить.


                  Читать дальше →
                • Как GPU справляются с ветвлением

                  • Translation
                  image

                  О статье


                  Этот пост — небольшая заметка, предназначенная для программистов, которым хочется больше узнать о том, как GPU обрабатывает ветвление. Можно считать её введением в эту тему. Рекомендую для начала просмотреть [1], [2] и [8], чтобы получить представление о том, как в общем виде выглядит модель выполнения GPU, потому что мы будем рассматривать только одну отдельную деталь. Для любопытных читателей в конце поста есть все ссылки. Если найдёте ошибки, то свяжитесь со мной.

                  Содержание


                  • О статье
                  • Содержание
                  • Словарь
                  • Чем ядро GPU отличается от ядра ЦП?
                  • Что такое согласованность/расхождение?
                  • Примеры обработки маски выполнения
                    • Выдуманная ISA
                    • AMD GCN ISA
                    • AVX512
                  • Как бороться с расхождением?
                  • Ссылки
                  Читать дальше →
                  • +44
                  • 14k
                  • 7
                • Алексей Савватеев и теория игр: «Какова вероятность, что в ближайшие пять лет будет скинута атомная бомба?»

                    image

                    Расшифровка видеозаписи лекции.

                    Теория игр — дисциплина, которая прочно зависла между математикой и социальными науками. Одним канатом к математике, другим канатом — к социальным наукам, прочно прикреплена.

                    В ней есть теоремы, достаточно серьёзные (теорема существования равновесия), про неё снят фильм «Игры разума», теория игр проявляется в множестве художественных произведений. Если смотреть вокруг, то и дело встречаешь игровую ситуацию. Я собрал несколько сюжетов.

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

                    Некоторые сюжеты спорные. Модели могут быть разные, можете не соглашаться с моей моделью.

                    • Теория игр в Талмуде.
                    • Теория игр в русской классике.
                    • Телеигра или задача о парковочных местах.
                    • Люксембург в Евросоюзе.
                    • Синдзо Абэ и Северная Корея
                    • Парадокс Брайеса в Метрогородке (Москва)
                    • Два парадокса Дональда Трампа
                    • Рациональное безумие (снова Северная Корея)

                    (В конце поста — опрос про бомбу.)
                    Читать дальше →
                  • RISC-V с нуля

                    • Translation
                    В этой статье мы исследуем различные низкоуровневые концепции (компиляция и компоновка, примитивные среды выполнения, ассемблер и многое другое) через призму архитектуры RISC-V и её экосистемы. Я сам веб-разработчик, на работе ничем таким не занимаюсь, но мне это очень интересно, отсюда и родилась статья! Присоединяйтесь ко мне в этом беспорядочном путешествии в глубины низкоуровневого хаоса.

                    Сначала немного обсудим RISC-V и важность этой архитектуры, настроим цепочку инструментов RISC-V и запустим простую программу C на эмулированном оборудовании RISC-V.
                    Читать дальше →
                  • Замыкание обобщенного типа в Rust


                      В этой короткой статье я расскажу о паттерне в Rust, который позволяет "сохранять" для последующего использования тип, переданный через обобщенный метод. Этот паттерн встречается в исходниках Rust-библиотек и я тоже иногда его использую в своих проектах. Мне не удалось найти в сети публикаций о нем, поэтому я дал ему свое название: "Замыкание обобщенного типа", и в этой статье хочу рассказать, что он из себя представляет, зачем и как его можно использовать.

                      Читать дальше →
                    • Советские мечты о будущем



                        Помните очаровательного котика, которые чихал в заставке советского мультфильма? Мы помним, и нашли его — вместе с ворохом другой рисованной фантастики. В детстве она пугала и обескураживала, поскольку поднимала серьезные, взрослые темы. Настала пора пересмотреть старые мультфильмы, чтобы узнать, о каком будущем мечтали в той стране.
                        Читать дальше →
                      • 9 советов по использованию библиотеки Cats в Scala

                        • Translation
                        Функциональное программирование в Scala может быть нелегко освоить из-за некоторых синтаксических и семантических особенностей языка. В частности, некоторые средства языка и способы реализации задуманного с помощью основных библиотек кажутся очевидными, когда ты с ними знаком — но в самом начале изучения, особенно самостоятельного, узнать их не так просто.

                        По этой причине я решил, что будет полезно поделиться некоторыми советами по функциональному программированию в Scala. Примеры и наименования соответствуют cats, но синтаксис в scalaz должен быть аналогичным из-за общей теоретической базы.


                        Читать дальше →
                      • Пишем на Rust + CUDA C

                        • Tutorial

                        Всем привет!

                        В данном руководстве хочу рассказать как подружить CUDA C/С++ и Rust. И в качестве примера напишем небольшую программу на Rust для вычисления скалярного произведения векторов, вычисление скалярного произведения будет производиться на GPU с использованием CUDA C.

                        Кому интересно под кат!
                        Читать дальше →
                      • Яхтинг — это может быть недорого



                          При поездке от четырёх человек, если среди вас есть шкипер, это выходит один в один в сравнении с обычным туристическим выездом. Если шкипера нет, то ездить уже надо хотя бы всемером, чтобы всё было сравнимо с турпоездкой.

                          Потому что нет цены проживания в отеле и всех проездов на машинах-автобусах, но добавляется стоимость аренды яхты.

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

                          Если вы всё же хотите свою яхту на неделю, то парусная яхта на шесть человек стоит примерно от 1 500 евро в неделю (и до бесконечности в зависимости от региона, красоты и комфорта), а шкипер начинается со 150 евро в день.

                          В общем, это немного оффтопик, но вы просили рассказать про яхты, и вот я выполняю обещание.
                          Читать дальше →
                        • ООП мертво, да здравствует ООП

                          • Translation
                          image

                          Источники вдохновения


                          Этот пост возник благодаря недавней публикации Араса Пранцкевичуса о докладе, предназначенном для программистов-джуниоров. В нём рассказывается о том, как адаптироваться к новым ECS-архитектурам. Арас следует привычной схеме (объяснения ниже): показывает примеры ужасного ООП-кода, а затем демонстрирует, что отличным альтернативным решением является реляционная модель (но называет её «ECS», а не реляционной). Я ни в коем случае не критикую Араса — я большой фанат его работ и хвалю его за отличную презентацию! Я выбрал именно его презентацию вместо сотен других постов про ECS из Интернета потому, что он приложил дополнительные усилия и опубликовал git-репозиторий для изучения параллельно с презентацией. В нём содержится небольшая простая «игра», используемая в качестве примера выбора разных архитектурных решений. Этот небольшой проект позволил мне на конкретном материале продемонстрировать свои замечания, так что спасибо, Арас!

                          Слайды Араса выложены здесь: http://aras-p.info/texts/files/2018Academy — ECS-DoD.pdf, а код находится на github: https://github.com/aras-p/dod-playground.

                          Я не буду (пока?) анализировать получившуюся ECS-архитектуру из этого доклада, но сосредоточусь на коде «плохого ООП» (похожего на уловку «чучело») из его начала. Я покажу, как бы он выглядел на самом деле, если бы правильно исправили все нарушения принципов OOD (object-oriented design, объектно-ориентированного проектирования).

                          Спойлер: устранение всех нарушений OOD приводит к улучшениям производительности, аналогичным преобразованиям Араса в ECS, к тому же использует меньше ОЗУ и требует меньше строк кода, чем ECS-версия!

                          TL;DR: Прежде чем прийти к выводу, что ООП отстой, а ECS рулит, сделайте паузу и изучите OOD (чтобы знать, как правильно использовать ООП), а также разберитесь в реляционной модели (чтобы знать, как правильно применять ECS).
                          Читать дальше →