• Трансляция кода с C# на C++: работа портера

      Привет, Хабр. Некоторое время назад я рассказывал о том, как нам удалось наладить ежемесячный выпуск релизов для платформы C++ (Windows и Linux) продуктов, исходный код которых получается автоматической трансляцией кода оригинальных продуктов, написанных на C#. Также я писал о том, как мы заставили такой транспилированный код выполняться в рамках нативного C++ без сборки мусора.

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

      Читать далее
    • Настройка сетевого стека Linux для высоконагруженных систем

      • Перевод

      Сетевой стек — одна из самых запутанных вещей в Linux. И не только из-за сложности некоторых концепций и терминов, но и из-за изменения смысла некоторых параметров в разных версиях ядра. В этой статье приведена информация для ядра 2.2 и выше, а также, там где это возможно, указано различие между версиями вплоть до 5.5.

      О том как изменять параметры ядра, описываемые здесь, можно прочитать в статье Linux Kernel Tuning for High Performance Networking: Configuring Kernel Settings.

      Читать далее
      • +28
      • 8,4k
      • 6
    • Приёмы неблокирующего программирования: полные барьеры памяти

      • Перевод

      В первых двух статьях цикла мы рассмотрели четыре способа упорядочить доступ к памяти: load-acquire и store-release операции в первой части, барьеры чтения и записи в память — во второй. Теперь пришла очередь познакомиться с полными барьерами памяти, их влиянием на производительность, и примерами использования полных барьеров в ядре Linux.


      Рассмотренные ранее примитивы ограничивают возможный порядок исполнения операций с памятью четырьмя различными способами:


      • Load-acquire операции выполняются перед последующими чтениями и записями.
      • Store-release операции выполняются после предыдущих чтений и записей.
      • Барьеры чтения разделяют предыдущие и последующие чтения из памяти.
      • Барьеры записи разделяют предыдущие и последующие записи в память.

      Внимательный читатель заметил, что одна из возможных комбинаций в этом списке отсутствует:

      Чтение выполняется... Запись выполняется...
      … после чтения smp_load_acquire(), smp_rmb() smp_load_acquire(), smp_store_release()
      … после записи ??? smp_store_release(), smp_wmb()
      Оказывается, обеспечить глобальный порядок записей и последующих чтений из памяти гораздо сложнее. Процессоры вынуждены прилагать отдельные усилия для этого. Сохранение такого порядка стоит недёшево и требует явных инструкций. Чтобы понять причину этих особенностей, нам придётся спуститься на уровнь ниже и присмотреться к тому, как процессоры работают с памятью.
      Читать дальше →
      • +10
      • 3,9k
      • 4
    • От int main() до BeginPlay: как происходит инициализация Unreal Engine под капотом

      • Перевод

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

      Но когда вы пишете игровой код на Unreal Engine, вы не имеете дело с игровым циклом напрямую. Вы не начинаете работать сразу с основной функцией — сначала вы определяете подкласс GameMode и переопределяете функцию под названием InitGame. Или пишете одноразовые классы Actor и Component и переопределяете их функции BeginPlay или Tick для добавления собственной логики. Это самый минимум того, что вам нужно сделать: обо всем остальном движок позаботится за вас.

      Unreal Engine также предлагает вам как программисту мощный и гибкий инструментарий: конечно, он имеет открытый исходный код, но также возможно и расширение несколькими другими способами. Даже если вы только начинаете работать с этим движком, было бы не лишним получить представление о его GameFramework: о таких классах, как GameMode, GameState, PlayerController, Pawn и PlayerState.

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

      Читать далее
      • +21
      • 4,7k
      • 1
    • [Личный опыт] Есть ли жизнь в ЮАР и стоит ли туда переезжать инженеру

        Серьезно, ЮАР? Может быть, сразу Зимбабве или Гонолулу? Но между прочим ЮАР — это страна с технологическими стартапами, практически средиземноморским климатом и самым богатым национальным составом. Наш герой Илья Шихов открыл в ЮАР стартап и проводит в стране по 3 месяца в году вместе с женой и двумя детьми. Он расскажет, как в Африке живется, как обстоят дела с образованием и медициной, что привлекает в страну европейских пенсионеров и чем здесь вообще заниматься IT-специалисту.




        Читать дальше →
      • WinUI 3 — Новая эра разработки под Windows

        В календаре 8 марта, а я пишу эту статью. Почему? - Потому, что WinUI 3 - это важно!

        В этой статье:

        - WinUI 3 - это не просто новая версия библиотеки пользовательских компонентов. Это изменит разработку ПО под Windows и не только.
        - Как менялась разработка графических интерфейсов?
        - Эволюция системных API пошла не по плану....
        - В чём провал Universal Windows Platform?
        - Что такое .NET, и почему за ним будущее?

        Читать далее
      • Многопоточность на низком уровне

          Очень часто при обсуждении многопоточности на платформе .NET говорят о таких вещах, как детали реализации механизма async/await, Task Asynchronous Pattern, deadlock, а также разбирают System.Threading. Все эти вещи можно назвать высокоуровневыми (относительно темы хабрапоста). Но что же происходит на уровне железа и ядра системы (в нашем случае — Windows Kernel)?


          На конференции DotNext 2016 Moscow Гаэл Фретёр, основатель и главный инженер компании PostSharp, рассказал о том, как в .NET реализована многопоточность на уровне железа и взаимодействия с ядром операционной системы. Несмотря на то, что прошло уже пять лет, мы считаем, что никогда не поздно поделиться хардкорным докладом. Гаэл представил нам хорошую базу по работе процессора и атомным примитивам.



          Вот репозиторий с примерами из доклада. А под катом — перевод доклада и видео. Далее повествование будет от лица спикера.

          Читать дальше →
        • Как я сократил время загрузки GTA Online на 70%

          • Перевод
          GTA Online. Многопользовательская игра, печально известная медленной загрузкой. Недавно я вернулся, чтобы завершить несколько ограблений — и был потрясён, что она загружается настолько же медленно, как и в день своего выпуска, 7 лет назад.

          Пришло время докопаться до сути.

          Разведка


          Сначала я хотел проверить, вдруг кто-то уже решил проблему. Но нашёл только рассказы о великой сложности игры, из-за чего она так долго загружается, истории о том, что сетевая p2p-архитектура — мусор (хотя это не так), некоторые сложные способы загрузки в сюжетный режим, а потом в одиночную сессию, и ещё пару модов, чтобы скипнуть видео с логотипом R* во время загрузки. Ещё немного почитав форумы, я узнал, что можно сэкономить колоссальные 10-30 секунд, если использовать все эти способы вместе!
          Читать дальше →
        • Скрипт удаляет «неудаляемые» мусорные приложения Android



            На Хабре уже публиковались инструкции, как удалить со смартфона «неудаляемый» мусор, который туда добавляют производители и операторы сотовой связи. Для этого не требуются рутовые права. Все операции можно выполнить вручную, подключив смартфон к компьютеру по ADB. Подробнее см. статью «Как удалить «неудаляемые» приложения со смартфона».

            Сейчас на Gitlab опубликован универсальный bash-скрипт Universal Android Debloater, который автоматизирует большинство операций на большинстве популярных моделей смартфонов.
            Читать дальше →
          • Хакаем CAN шину авто. Мобильное приложение вместо панели приборов

            • Tutorial

            Я продолжаю изучать CAN шину авто. В предыдущих статьях я голосом открывал окна в машине и собирал виртуальную панель приборов на RPi. Теперь я разрабатываю мобильное приложение VAG Virtual Cockpit, которое должно полностью заменить приборную панель любой модели VW/Audi/Skoda/Seat. Работает оно так: телефон подключается к ELM327 адаптеру по Wi-Fi или Bluetooth и отправляет диагностические запросы в CAN шину, в ответ получает информацию о датчиках.

            По ходу разработки мобильного приложения пришлось узнать, что разные электронные блоки управления (двигателя, трансмиссии, приборной панели и др.) подключенные к CAN шине могут использовать разные протоколы для диагностики, а именно UDS и KWP2000 в обертке из VW Transport Protocol 2.0.

            Как телефон взаимодействует с автомобилем
          • DIY наушники. Как, а главное, зачем

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

            Читать далее
          • Собираем свой маленький беспилотник

            Будем делать вот такой маленький, как на картинке, беспилотный автомобиль.

            Рассказ о том, как я его собрал.

            Код, список деталей и видео туториал по сборке.

            Читать далее
          • Почему линукс использует swap-файл

              Жажда тюнинга может завести в неведомые дебри. И, пожалуй, едва ли не самая частая неправильная оптимизация - отключение swap-файла. Если прикинуть частоту, с которой эта ошибка встречается, то, наверное, она входит в негласный top-10 (а может и top-5) самых распространенных, самых бесполезных и самых вредных оптимизаций - потому что swap-файл это одна из самых интересных, сложно понимаемых и недооцененных  сущностей в подсистеме управления виртуальной памятью.

              Читать далее
            • Реверс-инжиниринг исходного кода коронавирусной вакцины от компаний BioNTech/Pfizer

              • Перевод
              Добро пожаловать. В данном посте мы посимвольно разберём исходный код вакцины BioNTech/Pfizer SARS-CoV-2 мРНК.

              Да, такое заявление может вас удивить. Вакцина – это ведь жидкость, которую вводят человеку в руку. При чём тут какой-то исходный код?

              Хороший вопрос. Начнём мы с небольшой части того самого исходного кода вакцины BioNTech/Pfizer, также известной, как BNT162b2, также известной, как Tozinameran, также известной, как Comirnaty.


              Первые 500 символов мРНК BNT162b2.

              В сердце вакцины находится вот такой цифровой код. Его длина составляет 4284 символа, так что его вполне можно уместить в несколько твитов. В самом начале процесса производства вакцины кто-то закачал этот код в ДНК-принтер (ага), который, в свою очередь, превратил байты с накопителя в реальные молекулы ДНК.
              Читать дальше →
            • Мышка с мышкой: работа мозга во время бесконтактного управления курсором



                Мозг человека можно сравнить с центром управления полетами. Он постоянно курирует множество процессов. Некоторые из них сложнее и требуют больше внимание, другие же протекают в фоновом режиме. Разница между осознанными и неосознанными действиями достаточно очевидна: скажите человеку, что вы бросите ему яблоко, и он будет осознанно пытаться его поймать; сделайте то же самое, но без предупреждения, и тут проявится не только его ловкость, но и мыслительные процессы, которые он лично не запускал. Однако до сих пор оставалось не совсем понятно, что происходит в мозгу в процессе преднамеренных действий, которые мы совершаем практически каждый день, даже не задумываясь о них. Ученые из университетского колледжа Лондона провели необычные опыты, во время которых мышь мысленно управляла курсором мышки. Какие области мозга задействованы в процессе осознанного контроля, как протекает процесс с точки зрения нейрологии, и какова польза от полученных в ходе опытов данных? Об этом нам поведает доклад ученых. Поехали.
                Читать дальше →
                • +23
                • 2,8k
                • 1
              • Как мы заставили код, портированный с C#, работать с моделью памяти C++

                  Привет, Хабр. В прошлой статье я рассказывал о том, как мы создали фреймворк для перевода кода C# на (неуправляемый) C++, чтобы выпускать свои библиотеки, изначально разработанные для платформы .Net, и под C++ тоже. В этой статье я расскажу о том, как нам удалось согласовать модели памяти этих двух языков, добившись работы портированного кода в необычном для него окружении.

                  Я расскажу о том, какие умные указатели мы используем, и почему нам пришлось разработать для них собственные реализации. Я также расскажу о процессе подготовки кода C# к портированию с точки зрения управления временем жизни объектов, о некоторых проблемах, с которыми мы столкнулись, и о специфических способах диагностики, которыми нам приходится пользоваться при работе.
                  Читать дальше →
                • Включаем периферию контроллера за 1 такт или магия 500 строк кода



                  Как часто, при разработке прошивки для микроконтроллера, во время отладки, когда байтики не бегают по UART, вы восклицаете: «Ааа, точно! Не включил тактирование!». Или, при смене ножки светодиода, забывали «подать питание» на новый порт? Думаю, что довольно часто. Я, по крайней мере, — уж точно.

                  На первый взгляд может показаться, что управление тактированием периферии тривиально: записал 1 — включил, 0 — выключил.

                  Но «просто», — не всегда оказывается эффективно…
                  Читать дальше →
                • Windows: достучаться до железа

                    Меня всегда интересовало низкоуровневое программирование – общаться напрямую с оборудованием, жонглировать регистрами, детально разбираться как что устроено... Увы, современные операционные системы максимально изолируют железо от пользователя, и просто так в физическую память или регистры устройств что-то записать нельзя. Точнее я так думал, а на самом деле оказалось, что чуть ли не каждый производитель железа так делает!

                    Читать далее
                  • Быстрая медианная фильтрация с использованием AVX-512

                      Недавно Боб Стигалл сделал в конференции CppCon 2020 доклад под названием «Adventures in SIMD-thinking”, где он среди прочего рассказывал о своем опыте использования AVX512 для медианной фильтрации (с окном 7). Этот доклад вызвал у меня двоякие чувства: с одной стороны, прикольно сделано, и заявлено почти 20-кратное ускорение по сравнению с «тупейшей» реализацией через STL; с другой стороны, за один проход алгоритма из 16 входных семплов у него получалось всего 2 выходных, хотя входных данных хватало на 10, да и некоторые детали реализации вызвали желание попытаться их улучшить. Я подумал-подумал, и придумал идею, потом еще, потом попробовал их «в софте» и понял, что у меня появилось что-то, чем можно поделиться :) Так и получилась эта статья.

                      Читать далее