Как стать автором
Обновить
0
0

Пользователь

Отправить сообщение

Хакаем CAN шину авто. Мобильное приложение вместо панели приборов

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

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

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

Как телефон взаимодействует с автомобилем
Всего голосов 109: ↑109 и ↓0+109
Комментарии123

Работа сознания: что такое пятна Габора?

Время на прочтение9 мин
Количество просмотров93K
На одном из первых занятий на первом моём курсе по нейровизуализации произошёл сбивающий с толку диалог.

Профессор: в этом эксперименте люди смотрят на крестик в центре экрана, в то время как слева или справа от крестика им показывают пятно Габора…
Студент: извините, а что такое пятно Габора?
Профессор: А, ну это свёртка синусоиды с гауссовой кривой.

Он улыбался нам, не обращая внимания на то, что позади него на экране как раз было изображение пятна Габора. Он выжидающе поднял брови. Вся его поза говорила: «Ну что, теперь понятно?»

Студент: Эмм…
Профессор: Нет? Вот, давайте я вам покажу.

Всё ещё игнорируя экран с презентацией, он повернулся к доске. На ней он нарисовал синусоиду, а под ней — гауссову кривую.

«А теперь вы проводите над ними операцию свёртки!» [по мнению некоторых специалистов в комментариях, данная функция является произведением гауссианы и синусоиды, а не свёрткой / прим. перев.]

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


Читать дальше →
Всего голосов 26: ↑23 и ↓3+20
Комментарии54

Мнимая значимость

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

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

Несмотря на то, что это искажение восприятия успешно эксплуатируется большую часть человеческой истории, широкая публика обратила на него внимание после суда над О. Джей Симпсоном, известным в России по роли в культовой комедии «Голый Пистолет». На КДПВ он сбоку.

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

Как это сработало?
Всего голосов 135: ↑124 и ↓11+158
Комментарии451

Я не знаю Си

Время на прочтение4 мин
Количество просмотров51K
Цель этой статьи — заставить всех, особенно программистов на Си, сказать «я не знаю Си».
Хочется показать, что тёмные углы в Си значительно ближе, чем кажется и даже тривиальные строки кода несут в себе undefined behavior.
Читать дальше →
Всего голосов 285: ↑268 и ↓17+251
Комментарии309

Как писать читаемый код

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

Бывает, что посмотрев на старый код, мы говорим: «Его проще переписать, чем поменять». Печально, если речь идет о нашем собственном коде, с такой любовь написанном несколько лет назад. Head of Developer Relations в Evrone Григорий Петров в своем докладе на TechLead Conf 2020 разобрал проблемы, которые приводят к такой ситуации, и рассказал, как бороться с Software complexity problem.

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

Читать далее
Всего голосов 47: ↑47 и ↓0+47
Комментарии30

Кристиан Вервейс: О сложности или зачем вам Скрам?

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

Кристиан Вервейс: О сложности или зачем вам Скрам? 

Предисловие переводчика 

Предупреждение: Это лонгрид и это достаточно серьезный текст, далекий от большинства “простеньких” объяснений что вы могли прочитать на русском про Скрам и Эджайл.  

Оригинал статьи находится тут. Статья входит в список scrum.org рекомендованного к изучению для подготовки к экзамену PSM III.

Важность таких статей сложно переоценить. Судя по ошибкам, которыми делятся команды, и некоторым комментариям, значительное количество людей, пытающихся применить Agile, на самом деле не пошло дальше материалов типа “строим Скрам за 5 дней”, которые больше сосредоточены на практике, а не на причинах и не на основополагающих принципах Скрам и Эджайл. Я сам, как руководитель, изначально столкнулся именно с такой, “от сохи”, реализацией Скрама, но, к счастью для себя, не сделал “обоснованный” вывод что весь этот ваш Скрам - это очередная подделка и модная глупость, а полез разбираться откуда и зачем есть пошел Эджайл и прочие Скрамы. Честно скажу - объем “открытий чудных” был намного больше ожидаемого, несмотря на годы опыта в управлении проектами, накопленные к тому моменту. Так что, надеюсь, что перевод достаточно важной для понимания Скрам статьи будет полезен почтенной публике, и, конечно же, я сам, как сертифицированный Скрам-мастер и человек преподающий Скрам и Эджайл, буду рад ответить на все вопросы. 

Читать далее
Всего голосов 10: ↑7 и ↓3+12
Комментарии34

Frida изучаем эксплуатацию алгоритмов Heap

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

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

Все примеры в статье будут касаться атак на кучу в операционной системе Linux, поэтому запасаемся терпением и попкорном.

Читать далее
Всего голосов 2: ↑2 и ↓0+2
Комментарии0

Лямбды: от C++11 до C++20. Часть 1

Время на прочтение11 мин
Количество просмотров72K
Добрый день, друзья. Сегодня мы подготовили для вас перевод первой части статьи «Лямбды: от C++11 до C++20». Публикация данного материала приурочена к запуску курса «Разработчик C++», который стартует уже завтра.

Лямбда-выражения являются одним из наиболее мощных дополнений в C++11 и продолжают развиваться с каждым новым стандартом языка. В этой статье мы пройдемся по их истории и посмотрим на эволюцию этой важной части современного C++.



Вторая часть доступна по ссылке:
Lambdas: From C++11 to C++20, Part 2
Читать дальше →
Всего голосов 28: ↑26 и ↓2+24
Комментарии8

Как я перестал бояться и переизобрел QML

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

Что?


Привет, Хабр! Прошло очень много лет, с тех пор как я писал сюда. Надеюсь, время тебя/меня не слишком/слишком потрепало.

Я хотел бы написать о нашем опыте переосмысления идей QML. Qt — прекрасная (по совокупности заслуг) библиотека, и хотя её внутреннее устройство местами вызывает вопросы, но она дала миру не только кросс-платформенный UI тулкит, но и цельный профессиональный набор инструментов: Дизайнер, Креатор, Лингвист, и, конечно же, Qml. Результатом этого переосмысления стал наш скромный проект, который превращает qml в html5/javascript для разных платформ, и даже позволяет собирать простые android приложения используя Cordova.

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

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

Исходные коды доступны на github, там же лежат исходные коды сайта, примеров и библиотека контролов, которые мы используем для всех своих проектов. Документацию и уроки можно посмотреть на нашем сайте, pureqml.com.
Если вы чего-то не понимаете, можете присоединиться к группе поддержки в Telegram, мы постараемся ответить на все вопросы в реальном времени.

Одно из бесплатных приложений, которые мы сделали, был порт игры Fontanero, она должна быть доступна в маркетах LG/Samsung.

Ну а дальше можно не читать!

Как мы дошли до жизни такой


Всё началось в уже-далеком 2010-ом году, когда мы начали писать встраиваемое ПО (и интерфейс пользователя) в одной крупной корпорации для линейки разношерстных устройств на всевозможных платформах, доступных сейчас: arm, mips, x86, sh4, не хватало только sparc…
Читать дальше →
Всего голосов 35: ↑34 и ↓1+33
Комментарии25

Перемещение — прошлый век! Альтернативы std::move в «C++ будущего»

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

Каждый раз, когда мы пишем класс, управляющий ресурсами, мы задумываемся о том, что, скорее всего, для него придётся писать move-конструктор и move-присваивание. Ведь иначе объекты такого типа становятся неуклюжими, как std::mutex, ими тяжело пользоваться на практике: ни вернуть из функции, ни передать в функцию по значению, ни положить в вектор — а если положить его в другой класс как один из членов, то тот класс также «заболевает».


Положим, мы преодолели свою лень (хотя в Rust таких проблем нет!) и садимся писать move-операции для нашего класса. Проблема в том, что move-семантика в C++ имеет фундаментальное ограничение: каждый владеющий ресурсами тип с move-операциями должен иметь пустое состояние, то есть состояние с украденными ресурсами. Его нужно описывать в документации и предоставлять ему поддержку, то есть тратить время и силы на то, что нам не нужно.


Для абстрактных типов данных пустое состояние обычно бессмысленно — если у объекта украли его ресурсы, то он не сможет выполнять свои обычные функции. Но мы вынуждены это делать, чтобы реализовать move-семантику. Для некоторых типов пустое состояние недопустимо: open_file (в противовес теоретическому file), not_null_unique_ptr<T> (в противовес unique_ptr<T>).


Говоря словами Arthur O'Dwyer, мы заказывали телепорт, а нам дали «вас клонируют и убивают первоначальную копию». Чтобы вернуть себе телепорт, проходите под кат!

Читать дальше →
Всего голосов 18: ↑16 и ↓2+20
Комментарии174

Оптическая иллюзия 2020

Время на прочтение1 мин
Количество просмотров79K
image


Я просидел у монитора 15 минут с кусками бумаги, пытаясь разоблачить подвох. Интересно, а если вместо стрелочек использовать слова «влево», «вверх», «вниз» сохранится ли эффект?

Оптическую иллюзию выложили в Твиттер 25 ноября и она бомбанула. Тысячи человекочасов потеряны, сотни тысяч листиков приложено к экрану.

Для сомневающихся:
Всего голосов 135: ↑116 и ↓19+135
Комментарии67

Как перестать бояться и полюбить 1-wire

Время на прочтение18 мин
Количество просмотров55K
Мне очень нравится протокол 1-wire своей простотой и удобством для применения в системах «умный дом». Недавно я писал программную эмуляцию одной микросхемы и погрузился во внутренности этого протокола. Чтобы накопленные знания могли принести пользу не только мне, я решил написать данную статью. Но в статье я хочу рассказать не про абстрактные диаграммы сигналов и кодирование данных — перепечаток такого материала есть достаточно, а хочу рассказать про более практические вещи. А именно: рассмотрю проверенные лично схемы адаптеров, собранные из простых и доступных деталей, и расскажу, как из Linux получить доступ к устройствам 1-wire. Попутно расскажу про сам протокол, будет и пример низкоуровневой работы, и пример доступа из JavaScript, а также рекомендации владельцам Raspberry Pi. Эта статья в первую очередь для тех, кто хочет разобраться с протоколом практически с нуля, чтобы начать его использовать в своих проектах. Возможно те, кто уже хорошо знаком с протоколом, также найдут что-то новое для себя.
Читать дальше →
Всего голосов 68: ↑68 и ↓0+68
Комментарии57

Что такое Pimpl по версии Qt, и с чем его едят!

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

Вступление.



Часто в документации от Qt встречается термин Pimpl. Кроме того, те кто хоть немного копался в исходном коде Qt часто видел такие макросы как: Q_DECLARE_PRIVATE, Q_D. А также встречал так называемые приватные заголовочные файлы, название которых заканчивается на "_p.h".
В этой статье я попробую приоткрыть ширму за всей это структурой.

Pimpl, что это?


Pimpl — Pointer to private implementation. Это одно из названий паттерна программирования. Еще его называют чеширским котом — «Cheshire Cat» (это название мне больше нравится). В чем суть этого паттерна? Основная идея этого паттерна — это вынести все приватные члены класса и, в не которых случаях, функционала в приватный класс.
Отсюда название «чеширский кот» — видно только улыбку, а все остальное остается невидимым, но оно несомненно есть :-) Кто не помнит этого замечательного кота, может обратится к первоисточнику, к книге Льюиса Кэрролла «Алиса в стране чудес». Очень интересная книга, особенно если читать в оригинале.
Что это дает?
Читать дальше →
Всего голосов 48: ↑46 и ↓2+44
Комментарии70

Типы struct, union и enum в Modern C++

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

Язык C++ сильно изменился за последние 10 лет. Изменились даже базовые типы: struct, union и enum. Сегодня мы кратко пройдёмся по всем изменениям от C++11 до C++17, заглянем в C++20 и в конце составим список правил хорошего стиля.

Читать дальше →
Всего голосов 64: ↑62 и ↓2+60
Комментарии63

Что каждый программист на C должен знать об Undefined Behavior. Часть 1/3

Время на прочтение7 мин
Количество просмотров31K
Часть 1
Часть 2
Часть 3

Люди иногда спрашивают, почему код, скомпиливанный в LLVM иногда генерирует сигналы SIGTRAP, когда оптимизация была включена. Покопавшись, они обнаруживают, что Clang сгенерировал инструкцию «ud2» (подразумевается код X86) — то же, что генерируется __builtin_trap(). В этой статье рассматривается несколько вопросов, касающихся неопределённого поведения кода на C и того, как LLVM его обрабатывает.

image

В этой статье (первой из трёх) мы попытаемся объяснить некоторые из этих вопросов, чтобы вы могли лучше понять связанные с ними компромиссы и сложности, и возможно, изучить немного больше тёмные стороны С. Мы выясним, что C не является «высокоуровневым ассемблером», как многие опытные программисты на C (особенно те, кто сфокусирован на низком уровне) предпочитают думать, и что C++ и Objective-C напрямую унаследовали множество таких проблем.
Читать дальше →
Всего голосов 33: ↑32 и ↓1+31
Комментарии18

Неопределенное поведение в C++

Время на прочтение9 мин
Количество просмотров63K
Достаточно сложной темой для программистов на С++ является undefined behavior. Даже опытные разработчики зачастую не могут четко сформулировать причины его возникновения. Статья призвана внести чуть больше ясности в этот вопрос.

Статья является ПЕРЕВОДОМ нескольких статей и выдержек из Стандарта по данной теме.

Что такое «точки следования»?

Стандарте сказано:
Точки следования (sequence points)– такие точки в процессе выполнения программы, в которых все побочные эффекты уже выполненного кода закончили свое действие, а побочные эффекты кода, подлежащего исполнению, еще не начали действовать. (§1.9/7)


Побочные эффекты? А что такое «побочные эффекты»?

Побочный эффект (side effect) (согласно Стандарту) – результат доступа к volatile объекту, изменения объекта, вызова функции из библиотеки I/O или же вызова функции, включающей в себя какие-то из этих действий. Побочный эффект является изменением состояния среды выполнения.

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

Например:
Читать дальше →
Всего голосов 62: ↑57 и ↓5+52
Комментарии40

Включаем периферию контроллера за 1 такт или магия 500 строк кода

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


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

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

Но «просто», — не всегда оказывается эффективно…
Читать дальше →
Всего голосов 25: ↑23 и ↓2+32
Комментарии41

Рефакторинг с использованием C++17 std::optional

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


В разработке существует множество ситуаций, когда вам надо выразить что-то с помощью "optional" — объекта, который может содержать какое-либо значение, а может и не содержать. Вы можете реализовать опциональный тип с помощью нескольких вариантов, но с помощью C++17 вы сможете реализовать это с помощью наиболее удобного варианта: std::optional.


Сегодня я приготовил для вас одну задачу по рефакторингу, на который вы сможете научиться тому, как применять новую возможность C++17.


Вступление


Давайте быстро погрузимся в код.


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

Читать дальше →
Всего голосов 25: ↑25 и ↓0+25
Комментарии16

Обратная разработка XC2064 — первой микросхемы FPGA

Время на прочтение17 мин
Количество просмотров12K
Программируемая Логическая Интегральная Схема (ПЛИС) может реализовать произвольную логику, что угодно, от микропроцессора до генератора видеосигнала или майнера криптовалюты. ПЛИС состоит из множества логических блоков, каждый из которых обычно состоит из триггера и логической функции, а также из сети проводников, соединяющей логические блоки. Что делает ПЛИС особенной, это то, что она является программируемым аппаратным обеспечением, вы можете сконфигурировать каждый логический блок и соединения между ними. В результате вы можете построить сложную цифровую схему без физического соединения каждого логического элемента и триггера, что обошлось бы вам в стоимость разработки заказной интегральной схемы.


Фотография показывает один из 64 блоков микросхемы XC2064. Слои металлизации убраны, мы видим кремний и поликремниевые транзисторы, лежащие под металлизацией. По ссылке вы можете увидеть фото в большем масштабе: siliconpr0n.
Читать дальше →
Всего голосов 63: ↑63 и ↓0+63
Комментарии24

Прямая передача данных между ПЛИС Virtex-7 по шине PCI Express

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

Аннотация


В данной статье рассматривается передача данных по шине PCI Express с одновременным участием нескольких ПЛИС. В компьютерной системе, к PCI Express шине которой подключено несколько (в нашем случае 8) оконечных устройств (PCIe endpoints) ПЛИС запускается одновременно несколько транзакций передачи данных двух типов: А) DMA передача между ОЗУ и ПЛИС (чтение/запись) и Б) прямая передача данных между двумя ПЛИС (запись). Используя соединение PCI Express x4 Gen 2.0 при обращении в память была получена скорость записи 1451 МБ/с (90% от максимальной). Скорость записи данных между ПЛИС была равна 1603 МБ/с (99 % от максимальной) при длине пакетов 128 байт и 1740 МБ/с (99% от максимальной) при длине пакета 256 байт. Латентность передачи данных между ПЛИС зависит от количества промежуточных коммутаторов, и была равна 0,7 мкс для одного коммутатора и 1 мкс для трех. Также показано, что при одновременных передачах через общий канал скорость отдельных передач не уменьшается до тех пор, пока суммарная скорость передачи не превышает пропускную способность общего канала; затем канал используется на 100%, а его пропускная способность делится поровну между устройствами.
Читать дальше →
Всего голосов 27: ↑25 и ↓2+23
Комментарии11

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность