Pull to refresh
4
Karma
0
Rating
Юрий Наконечный @Inobelar

C++ Developer

  • Posts
  • Comments

Как мы верифицированный полетный контроллер для квадрокоптера написали. На Ada

C++System ProgrammingCProgramming microcontrollersDIY

Однажды на новогодних каникулах, лениво листая интернет, бракоделы в нашем* R&D офисе заметили видео с испытаний прототипа роботакси. Комментатор отзывался восторженным тоном – революция, как-никак. Но тренированное ухо расслышало в шуме с испытательной площадки еще кое-что. Контроллер скорости (штука для управления тягой винтов) сыграл мелодию при старте, как это любят делать пилоты дронов, которые часто используют полётный контроллер Betaflight. Неужели там бета-флайт? Ну, или какая-то из ее немногих разновидностей.

Перед глазами побежали флешбеки, где-то из глубин подсознания всплыла забытая уже информация о прошивках для Тойоты на миллионы тысяч строк Си и 2 тысячи глобальных переменных (Toyota: 81564 ошибки в коде).

После просмотра исходного кода Betaflight на гитхабе стало еще страшнее, и чем дальше, тем хуже. Это – управляющая программа для тяжелого устройства с острыми винтами, которое летает высоко, быстро. Становится страшно: игрушки это одно, но я бы не хотел летать, на таком такси. Но ведь можно иначе? Можно, решили мы! И решили это доказать. На Avito был куплен акробатический FPV-“квадрик” на базе STM32F405, для отладки – Discovery-платы для этого же контроллера, а дальше все как в тумане..

Читать далее
Total votes 92: ↑90 and ↓2 +88
Views12.5K
Comments 57

Интервью с Мигелем де Икасой: Microsoft, Mono, смартфоны и многое другое

JUG Ru Group corporate blog.NETXamarinInterview

В эфире конференции DotNext 2020 Moscow выступил Мигель де Икаса, один из известнейших разработчиков, положивший начало множеству проектов, которыми многие пользуются по сей день. Мы расспросили его о некоторых вещах, включая взаимоотношения с Microsoft, зарождение Mono, мобильные устройства и многое другое. Рассказывая обо всем этом, Мигель припомнил множество интересных событий и фактов, о которых вам наверняка будет интересно прочитать.

Интервью брали Игорь Лабутин, разработчик на C# и архитектор, и Андрей Акиньшин, перформанс-лид Rider, мейнтейнер проекта BenchmarkDotNet.

Текст интервью и видео — под катом.

Читать далее
Total votes 36: ↑36 and ↓0 +36
Views3.5K
Comments 5

Быстрое сравнение double

High performanceAbnormal programmingC
Вчера здесь вышла статья о быстром парсинге double, я зашёл во блог к её автору, и нашёл там ещё один интересный трюк. При сравнении чисел с плавающей точкой особое внимание приходится уделять NaN (восемь лет назад я писал про них подробнее); но если сравниваемые числа заведомо не NaN, то сравнить их можно быстрее, чем это делает процессор!

Положительные double сравнивать очень просто: нормализация гарантирует нам, что из чисел с разной экспонентой больше то, чья экспонента больше, а из чисел с равной экспонентой больше то, чья мантисса больше. Стандарт IEEE 754 заботливо поместил экспоненту в старшие биты, так что положительные double можно сравнивать просто как int64_t.



С отрицательными числами немного сложнее: они хранятся в прямом коде, тогда как int64_t — в дополнительном. Это значит, что для использования целочисленного сравнения младшие 63 бита double необходимо инвертировать (при этом получится -0. < +0., что не соответствует стандарту, но на практике не представляет проблемы). Явная проверка старшего бита и условный переход уничтожили бы всю выгоду от перехода к целочисленному сравнению; но есть способ проще!

inline int64_t to_int64(double x) {
	int64_t a = *(int64_t*)&x;
	uint64_t mask = (uint64_t)(a >> 63) >> 1;
	return a ^ mask;
}

inline bool is_smaller(double x1, double x2) {
	return to_int64(x1) < to_int64(x2);
}

a>>63 заполняет все 64 бита копиями знакового бита, и затем >>1 обнуляет старший бит.
Читать дальше →
Total votes 52: ↑50 and ↓2 +48
Views9.2K
Comments 83

Компьютерное зрение в промышленной дефектоскопии: Часть 2 “Генерируем стремные трубы чтобы порадовать нейронку”

IT-центр МАИ corporate blogWorking with 3D-graphicsMachine learning
Tutorial


В предыдущей заметке мы рассказали о том, как мы решали задачу из области промышленной дефектоскопии методами современного машинного зрения. В частности, мы упомянули, что одним из подходов к обогащению данных обучающей выборки является генератор синтетических данных. В этой заметке мы расскажем:


  • как сделали такой генератор на основе Blender и Python,
  • какие типы масок для задач компьютерного зрения вообще можно получить в Blender.
Читать дальше →
Total votes 4: ↑4 and ↓0 +4
Views2.2K
Comments 1

UI-элементы и жесты в мобильных приложениях

Юла corporate blogDevelopment of mobile applicationsMobile applications testingMobile applications design


Хабр, привет! Вы часто задумывались, обнаружив баг в мобильном приложении и заводя его в баг-трекер, как правильно назвать ту или иную часть интерфейса или действие, которые привели к ошибке? Или читаешь описание задачи и задумываешься, как должен выглядеть какой-то экран и что должно появиться при тапе на кнопку. А может, вы описываете продуктовые задачи и не всегда чувствуете себя на одной волне с дизайнерами и разработчиками, которые иногда начинают говорить на эльфийском? Чтобы исключить недопонимание, неясности и вопросы, мы решили создать перечень наиболее распространенных элементов и жестов и показать их на примере Юлы.

А вы знали, как называется «та самая выезжающая снизу экрана шторка» или несколько (три и более) тапов подряд? Ответы на эти вопросы и названия многих других элементов читайте в нашей статье.
Читать дальше →
Total votes 23: ↑21 and ↓2 +19
Views14K
Comments 9

Рецепт обучения нейросетей

PythonMachine learningArtificial IntelligenceData EngineeringTensorFlow
Sandbox

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

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

Читать далее
Total votes 15: ↑14 and ↓1 +13
Views6.5K
Comments 6

C++17. Функция стандартной библиотеки std::launder и задача девиртуализации

ProgrammingC++
Tutorial

В этой статье мы попробуем разобраться с одним из самых неоднозначных и непонятных нововведений стандарта C++17 — функцией стандартной библиотеки std::launder. Мы посмотрим на std::launder с другой стороны, посмотрим на источник. Разберем что лежит в основе функции на примере решения задачи девиртуализации и реализации виртуальных указателей в LLVM.


Читать дальше →
Total votes 70: ↑70 and ↓0 +70
Views12.9K
Comments 70

Фотограмметрия 100 самых необычных памятников России силами сообщества

Туту.ру corporate blogWorking with 3D-graphicsProject management

Вот что бывает, если вы споткнётесь во время съёмки

Мы в Туту почти полгода проводили конкурс на самый необычный памятник в России. У нас в стране есть и памятник клавиатуре в Екатеринбурге, и всегда метущий к вам спиной дворник, и лабораторная мышь, которая вяжет ДНК в обратную сторону, и двухметровый комар, и вообще что угодно.

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

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

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

В общем, я хочу поделиться с вами STL-моделями с лицензией для некоммерческого использования 10 памятников-финалистов конкурса. И рассказать про ощупанные грабли в фотограмметрии, позволяющие делать такие операции в очень разумном бюджете. Бюджет был 2500 рублей на модель.
Читать дальше →
Total votes 39: ↑39 and ↓0 +39
Views6.7K
Comments 33

Следующее поколение программирования ближе, чем кажется

RUVDS.com corporate blogProgramming
Translation
Какое оно — программирование следующего поколения? Помочь ответить на этот вопрос могут воспоминания о том, как эволюционировали персональные компьютеры. Для того чтобы разобраться с тем, что я имею в виду, давайте ненадолго заглянем в 1970-е.


Читать дальше →
Total votes 68: ↑43 and ↓25 +18
Views21.7K
Comments 117

Проектирование C API

OTUS corporate blogProgrammingAPIC
Translation

C API все так же распространены, как и раньше. На C написано много библиотек или библиотек с предоставлением C API. Есть также биндинги для различных языков программирования, что делает язык C стандартом де-факто для переносимых API. Тем не менее многие API не соответствуют базовым принципам проектирования, и, похоже, что за последние годы в этой области мало чего изменилось. Недавно мне пришлось поработать над современным C API, но затем появился Vulkan с несколькими интересными идеями. Самое время взглянуть на современные варианты разработки C API.

Читать далее
Total votes 21: ↑15 and ↓6 +9
Views3.8K
Comments 5

Пишем драйвер фреймбуфера для Raspberry Pi с LCD

Configuring LinuxDevelopment for Raspberry Pi
Tutorial

Прочитав монументальную серию статей о подключении LCD экрана к роутеру мне захотелось сделать то же самое. Однако многообразие используемого стека (openwrt, stm32, usb) в сочетании с отсутствием полных исходников кода но может плохо искал несколько затруднило задачу. Я решил начать с малого — написать свою реализацию framebuffer для raspberry и вывести графическую среду raspberry на LCD. Что из этого получилось, описываю далее.

Читать дальше →
Total votes 39: ↑39 and ↓0 +39
Views7.5K
Comments 5

Как мы обучили нейросеть генерировать тени на фотографии

PythonProgrammingImage processingMachine learningArtificial Intelligence
Tutorial

Привет!

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

Ну что, погнали?

Читать далее
Total votes 29: ↑28 and ↓1 +27
Views5.3K
Comments 17

dynamic_cast на этапе компиляции

C++

Приветствую все читающих.


О чём статья (или задача статьи): практический ответ на вопрос "возможно ли создать большой проект так, чтобы полностью отказаться от dynamic_cast на этапе выполнения?", где под большим проектом подразумевает такой в котором уже нет человека, что бы держал в голове всю кодовую базу проекта целиком.


Предварительный ответ: ДА, это возможно — возможно создать механизм, позволяющий решить задачу dynamic_cast на этапе компиляции, но — едва ли подобное будет применяться на практике по причинам как: (1) с самого начала целевой проект должен строиться согласно наперёд заданным правилам, в следствии чего взять и применить методику к существующему проекту, очень трудоёмко (2) существенное повышение сложности кода с точки зрения удобства его читаемости в определённых местах, где, собственно, происходит замена логики dynamic_cast на предложенную ниже (3) использование шаблонов, что может быть неприемлемым в некоторых проектах по идеологическим соображениям ответственных за него (4) интерес автора исключительно в том, чтобы дать ответ на поставленный вопрос, а не в том, чтобы создать универсальный и удобный механизм решения поставленной задачи (в конце-концов, не нужно на практике решать проблемы, которые не являются насущными).

Читать дальше →
Total votes 8: ↑8 and ↓0 +8
Views2.2K
Comments 1

Wasm в Armory Engine

Working with 3D-graphicsGame developmentGames and game consoles
Tutorial

Для тех кто в танке - wasm или WebAssembly это язык программирования низкого уровня для виртуальной стековой машины раз разработанный как портативная цель компиляции для высокоуровневых языков, таких как Си, C++, C#, Rust, Go. Проще говоря вы можете писать высокопроизводительный, компактный и переносимый код используя wasm. Наш Armory тоже использует wasm. Благодаря ему движок может работать в браузере и на других платформах с использованием Krom.

Читать далее
Total votes 5: ↑5 and ↓0 +5
Views2.1K
Comments 3

Помогите стахановцу — увольте его сразу

Personnel ManagementReading room
Сидят себе люди, никого не трогают, работают потихоньку, получают деньги, выдают результат. Директор, в целом, доволен. Но чего-то не хватает – хочется больше, лучше, выше, эффективнее. Вкладываться в интенсивное развитие лень, да и знаний не хватает. Так, иногда скажет мимоходом, что надо бы лучше работать, все головой покивают, может даже составят перечень мероприятий по повышению эффективности и снижению затрат, чтобы дружно про него забыть.

Но тут приходит Он. Тот, кому Мало. Кто страстно хочет Больше. И открывает ящик Пандоры. Точнее, показывает директору, где этот ящик находится, и помогает провернуть ключ в замке.
Читать дальше →
Total votes 108: ↑82 and ↓26 +56
Views82K
Comments 196

Реактивное программирование для разработчиков игр: Введение

OTUS corporate blogProgrammingGame developmentUnity3D
Translation

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

Не отвлекайтесь на котят. Читайте о реактивном программировании!

Итак, я привлек ваше внимание?

Отлично! Я приложу все силы, чтобы не потерять его.

Читать далее
Total votes 10: ↑9 and ↓1 +8
Views5.8K
Comments 3

Игровой контроллер для одной руки, что так, а что не так

C++CAD/CAMDeveloping for ArduinoAR and VR3D printers
Sandbox

Хочу получить обратную связь от людей, которые связаны с разработкой электронных продуктов и не только. Написал сюда, т.к. не знаю, куда писать еще в Рунете на эту тему.

Читать далее
Total votes 38: ↑38 and ↓0 +38
Views6.3K
Comments 48

Самые маленькие Arduino для ваших мини-проектов + примеры самих проектов

Selectel corporate blogDeveloping for ArduinoComputer hardwareDIY
Translation

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

Эта подборка поможет выбрать то, что нужно. В ней собраны самые маленькие Arduino платы с разными характеристиками. Их можно использовать для разработки самых разных проектов — от роботов до носимых устройств. Есть и примеры проектов.
Читать дальше →
Total votes 26: ↑24 and ↓2 +22
Views28.8K
Comments 23

А вы умеете готовить nested_flatbuffers?

ProgrammingC++C
Tutorial
У протокола FlatBuffers имеется интересная возможность — использовать вложенную структуру внутри другой структуры, но хранить ее, как массив сырых данных. Такая оптимизация позволяет уменьшить затраты на память и производительность при чтении/записи данных. Для этого необходимо использовать специальный атрибут — nested_flatbuffers.

Правда, как это часто водится за разработчиками протоколов, на нормальные примеры сил им уже не хватает. И даже на тематических форумах типа stackoverflow, groups.google и т.п. сложно найти полную информацию — приходится буквально по крупицам собирать все части паззла, чтобы в конце концов понять, как именно написать рабочий код.

В статье я раскрою проблему подробнее и приведу примеры на C, C++ и Rust.

In concept this is very simple: a nested buffer is just a chunk of binary data stored in a ubyte vector, typically with some convenience methods generated to access a stored buffer. In praxis it adds a lot of complexity.


image
Читать дальше →
Total votes 12: ↑12 and ↓0 +12
Views1.9K
Comments 3

Как мы заставили код, портированный с C#, работать с моделью памяти C++

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

Я расскажу о том, какие умные указатели мы используем, и почему нам пришлось разработать для них собственные реализации. Я также расскажу о процессе подготовки кода C# к портированию с точки зрения управления временем жизни объектов, о некоторых проблемах, с которыми мы столкнулись, и о специфических способах диагностики, которыми нам приходится пользоваться при работе.
Читать дальше →
Total votes 23: ↑22 and ↓1 +21
Views6.5K
Comments 25

Information

Rating
5,911-th
Location
Украина
Registered
Activity