Отсюда: https://habr.com/post/412749/.
Ну и заодно — деревенский кружок любителей электроники в исполнении «Яндекса»:
https://habr.com/company/jugru/blog/358378/
Напомню, что тот же самый «Яндекс» недавно искал офигенно крутого электронщика.
Отсюда: https://habr.com/post/412749/.
Ну и заодно — деревенский кружок любителей электроники в исполнении «Яндекса»:
https://habr.com/company/jugru/blog/358378/
Напомню, что тот же самый «Яндекс» недавно искал офигенно крутого электронщика.
Дилип Кумар Джаякумар пишет (я попытался передать орфографию и пунктуацию оригинала в переводе):
Привет, Мы стартап, создающий IoT-устройства для Умного Дома и Мониторинга Окружающей Среды. У нас нет инженера или со-основателя который знает разработку и или инженерию электроники. У нас только есть идея продукта и мы думаем, что WiFi система-на-чипе TI — это хороший выбор процессора для продукта. Я хотел бы поговорить с экспертом по продукту из TI, чтобы я мог объяснить больше про продукт и идею. Спасибо!
По-моему, таких наглых товарищей не было даже в яцуткинской библиотеке.
Столкнулся с интересным поведением Linux при попытке изобразить TCP-соединение с помощью «сырых» сокетов (raw sockets), точнее, чего-то на них похожего. Как только на не открытый «явно» (с помощью bind() и listen()) TCP-порт прилетал какой-либо пакет, что-то в составе операционной системы кидало в ответ пакет с флагом RST. Лечится такое поведение двумя способами — можно либо «недосоздать» сокет (вызвать bind(), listen() и не вызывать accept()), либо добавить правило в iptables, не позволяющее отправлять пакеты с RST — что-нибудь в таком роде:
iptables -I OUTPUT -p tcp --tcp-flags RST RST -j DROP
Я тут в очередной раз откопал стюардессу Intel Edison и случайно наткнулся на статейку на хабре:
https://habr.com/company/intel/blog/260943/
Если коротко — чуваки организовали на этом самом Edison опрос «электрокардиографа» с Bluetooth (электрокардиограф я пишу в кавычках, потому что вряд ли это устройство сертифицировано, как медицинское). Задача практически тривиальная — тем более, они там сами и пишут:
…работать с 6 одновременными потоками ЭКГ с частотой дискретизации 500Гц
Не знаю, какая разрядность у тамошнего АЦП — предположим, что 24 бита, с хорошим запасом (на самом деле в «электрофизиологии» редко нужна разрядность свыше 10 бит, тем более, если речь идет об ЭКГ, но специализированные АЦП для физиологических измерений выпускают с разрядностью до 24 бит). Итого «6 одновременных потоков ЭКГ с частотой дискретизации 500 Гц» превращаются в смешные 72000 бит/с — не так уж и много данных, не правда ли?
Но держитесь крепче — чуваки не зря взяли Intel Edison, весьма неслабый микрокомпьютер с двухядерным Intel Atom, работающим на частоте 500 МГц, 1 Гб оперативной памяти и Linux в качестве операционной системой — ведь обработкой ЭКГ они занялись на node.js, и при таких вводных…
Объем занимаемой памяти процессом редко превышает 100 МБ.
Следующий абзац, пожалуй, стоит привести целиком (орфография и пунктуация оригинала сохранены):
Тут наверное нужно немного отвлечься и отметить, что сенсоры можно разделить на 2 больших категории: те, которые передают некоторое измеренное число, к примеру вес или артериальное давление и те, с которых поступает непрерывный сигнал, такие как электрокардиограмма и пульсовая волна с пульсоксиметра. И если в первом случае применение производительных платформ не сильно оправдано, там по большому счету не требуются особые вычислительные ресурсы, то во втором случае простого контроллера уже не достаточно.
Не знаю, конечно, справится ли с «обсчетом» (обычно требуется какая-то фильтрация данных, «классика» здесь — фильтр Баттерворта или что-то подобное) шестиканальной ЭКГ какой-нибудь AVR — но, скажем, на ARM Cortex-M4 (который стоит на порядок дешевле Edison) можно справиться и с на порядок большим объемом данных без каких-либо проблем.
Прочитал про интересную китайскую придумку — своего рода гибрид счета-фактуры (который применяется у нас для вычисления НДС) и лотерейного билета:
https://www.bunniestudios.com/blog/?p=2269
Называется эта штука «фапьяо» (fapiao), и в том варианте, который применяется в розничной торговле, ресторанах и гостиницах, работает следующим образом:
— заведение заранее приобретает необходимое количество таких талончиков, их стоимость равна ставке налога (например — при НДС 18% fapiao номиналом 100 рублей юаней будет стоить 18 юаней);
— при оплате счета вместе с чеком клиент получает фапьяо на оплаченную сумму;
— а чтобы эти фапьяо не забывали брать, они участвуют в розыгрыше лотереи — присмотритесь к чеку на картинке — в правой части под стираемым слоем напечатан номер лотерейного билета.
Выигрыши могут быть довольно крупными, да и китайцы любят всякие лотереи — так что исправно требуют эти чеки при оплате товаров и услуг. Естественно, что все не так гладко, возникают и определенные махинации с чеками. В комментариях по ссылке написано о существовании поддельных фапьяо, и о том, что многие заведения под разными предлогами не выдают их — но в целом, похоже, китайские налоговые органы более-менее довольны собираемостью.
При расчетах между организациями тоже используются документы с тем же названием — но по сути это обычный счет-фактура для учета НДС.
…и прочих ностальгических консолях:
https://blog.openai.com/gym-retro/
Пишут интересное:
For games that have a sparse reward or require planning more than a few seconds into the future, existing algorithms have a hard time. Many of the games in the Gym Retro dataset have a sparse reward or require planning, so tackling the full dataset will likely require new techniques that have not been developed yet.
Выясняется, что машинное обучение пасует перед задачами, где нет быстрой связи между правильным действием и «поощрением», или где требуется планировать действия хотя бы на несколько секунд.
Раз уж про Market for Lemons вспомнил — надо бы еще написать про дешевое говнище планшеты на Android.
Для начала — необходимый ликбез по поводу графической подсистемы ОС Android, или почему такой параметр, как «разрешение экрана», для мобильных устройств стал, в первом приближении, почти неактуален. Впрочем, об этом можно догадаться хотя бы по тому, что определяющим «потребительским» параметром давно стала диагональ экрана — а разрешение печатают где-то мелким шрифтом на обороте коробки. Дело в том, что при разработке Android всерьез задумались о том, как одни и те же элементы управления будут выглядеть на экранах с разным разрешением, и приняли важнейшее решение — все размеры отображаемой на экране графики указываются в «условных единицах» dp — density-independent pixels. Один dp равен примерно 1/160 дюйма — или одному пикселю на экране со «средней», по мнению разработчиков андроидовской графики, плотностью пикселей в 160 точек на дюйм.
Благодаря этому, например, размер «средней» кнопки в интерфейсе любого приложения для Android, равный, согласно рекомендациям для дизайнеров пользовательского интерфейса, 48×48 dp, соответствует примерно 7,62×7,62 мм на экране — независимо от того, планшет это или смартфон, какое у него реальное разрешение экрана, диагональ и так далее. Размеры в dp автоматически масштабируются под экран устройства — для интерфейсов с тачскрином это очень важно.
Когда я работаю в Windows на своем ноутбуке, меня особо не волнует, что где-то внутри операционной системы «прибито гвоздями» предположение о том, что имеющийся у меня экран имеет плотность пикселей 96 точек на дюйм (это соответствует, скажем, 14-дюймовому монитору с разрешением 1024×768 — очень хороший экран для PC середины 90-х; в Mac’ах за несколько лет до того за «стандарт» приняли 72 точки на дюйм, приравняв пиксель на экране к типографскому пункту). На самом деле «мои» 14 дюймов имеют разрешение 1600×900 — это аж 131 точка на дюйм, в полтора раза больше. Разве что когда я пересаживаюсь от «настольного» монитора (22 дюйма, 1920×1080, в точности 100 точек на дюйм) за ноутбучный, первые несколько минут все кажется слишком мелким — но этот эффект довольно быстро проходит. Теоретически, в Windows последних версий есть механизмы, позволяющие настраивать размер элементов управления в зависимости от параметров экрана — но как всегда, они глючные и отягощенные «обратной совместимостью»; заодно большинство нужных мне программ не очень комфортно использовать, когда разрешение экрана по вертикали меньше 900 пикселей (при масштабировании не совпадающих с точками на экране).
Но в отличии от Windows с управлением мышкой или подобными устройствами ввода, в Android повсеместно используются тачскрины — и объяснять пользователю, что вместе с новым телефоном, оснащенным экраном офигенно высокого разрешения, ему понадобятся пальцы в полтора раза тоньше, никто особо не хочет. Поэтому в любое устройство на Android среди прочих параметров системы «зашивается» плотность пикселей экрана — это значение позволяет пересчитывать из dp в реальные точки на экране.
Например, экран с разрешением 1920×1080 в устройстве с Android вполне может иметь диагональ, скажем, 10, 7 и 5 дюймов — это будет, соответственно, 220, 320 и 440 точек на дюйм — и один dp в операционной системе будет равен 1,375, 2 или 2,75 пикселям на экране. Заодно замечу, что «средняя» на момент разработки первых версий Android плотность пикселей, равная 160 точкам на дюйм, сегодня оказывается довольно днищенской — сложно найти приличное устройство с таким экраном.
Все вроде бы хорошо и логично — но ровно до тех пор, пока прошивки под эти самые планшеты не начинают делать китайцы. Уже не первый раз сталкиваюсь с тем, что на, к примеру, десятидюймовом планшете «прошито» количество пикселей на дюйм, соответствующее в лучшем случае семи-, а то и пятидюймовому экрану. Да, главный экран там выглядит довольно симпатично, значки крупные, все красиво — но стоит лишь запустить какую-то программу — и на большом десятидюймовом экране появляется интерфейс, рассчитанный под смартфон.
В чем причина? Китайцы предпочитают вообще не заморачиваться с тем, для какого именно устройства они делают «сборку» Android. Пофигу, телефон ли это или планшет — плотность пикселей установят такую же, какая работала в прошлый раз. То, что интерфейс некоторых программ превращается в убогую «телефонную» версию — авось никто и не заметит.
В подобном были замечены многие из китайских производителей — в том числе и вроде бы приличные, а не какой-то noname с aliexpress.
Для начала — вводная: в соответствии с Указом Президента России № 202 от 9 мая 2017 г. в Волгограде, Екатеринбурге, Казани, Калининграде, Москве, Нижнем Новгороде, Ростове-на-Дону, Самаре, Санкт-Петербурге, Саранске и Сочи в период с 25 мая по 25 июля 2018 года будут, в частности, запрещены оборот и ношение гражданского и служебного оружия и патронов к нему. Если вы думаете, что лично вас это никак не коснется — все равно проверьте, не завалялся ли у вас где, скажем, газовый баллончик, «пневматика» или «травмат», можно очень серьезно «попасть». Подробнее об этом написал sanches на «Лайфе»:
Я же расскажу о другом — сегодня в электричке я увидел рекламу МР-512С — версии «мурки» с уменьшенной до 3 Дж дульной энергией. Обычная МР-512 без буковок имеет дульную энергию 7,5 Дж (то есть является пневматическим оружием, но продается вообще без лицензии), либо с буковкой М имеет дульную энергию аж 25 Дж (пневматическое охотничье оружие, нужна лицензия). Здесь же рекламируется «конструктивно сходное с оружием» изделие — фактически, игрушка, на которую действие 202 указа не распространяется. Реклама красивая, со слоганом «Открой сезон дачного биатлона» или как-то так.
А теперь следите за руками — даже если очень захотеть пострелять из «пневматики» по пивным банкам, то ближайшие два месяца купить что-то из «безлицензионного», с дульной энергией до 7,5 Дж, все равно не удастся (ни один магазин не будет рисковать лицензией). Остаются только «конструктивно схожие с оружием изделия» с дульной энергией до 3 Дж — та самая МР-512С. Заодно «Калашников» бьет ценой — предлагая самую «нищенскую» версию всего за 4000 рублей. В общем, «мурка» этим летом превращается в хит на рынке дешевой «пневматики».
Китайская бумага для ЛУТ — для тех, кому надоела глянцевая из журналов. Печатать надо на «блестящей» стороне, процесс «переноса» — точно такой же, как обычно (китайцы пишут, что надо использовать ламинатор — но и утюгом получается приемлемо). Главное отличие — легко отделяется, не требуя «оттирания» пальцем (хотя намочить все-таки желательно). Пачка из 10 листов A4 стоит 80 рублей, в моем случае китайцы обсчитались и прислали 20 — но слегка мятых. Возможно, имеет смысл отрезать кусочки и приклеивать их при печати на «подложку» из обычной бумаги.
Пленочные трафареты OSH Stencils — приемлемо, но в целом не очень аккуратно — в паре мест на довольно простом трафарете из серии «AtMega и два резистора» есть дефекты, правда, особо ни на что не влияющие. «Мостики» между площадками с шагом 0,8 мм получились какие-то уж очень тонкие (может, конечно, это косяк моего проекта — но надо записать в блокнотик что-то типа «не забыть проверить припуск маски и трафарета»). Везут из Штатов, самый экономичный вариант — трекающийся до Домодедово (или что там у вас ближе) USPS First Class w/Tracking (и тут наврали!). Минимальный заказ мне обошелся в 8,45 $ (чуть больше 500 рублей) — что, конечно, дешевле Резонита (там аналогичный заказ обошелся бы в 2000 рублей за подготовку производства, что-то около 100 рублей за сам трафарет и 400 рублей доставка — итого 2500 рублей). Стальной трафарет аналогичных размеров у этих товарищей стоил бы около 18 долларов — то есть уже 1100 рублей. В общем, интересно для всякой мелочевки, не критичной ко времени.
А вот как в 2018 году кошерно запитывать всякие автомобильные приблуды на микроконтролерах? Мне знакомы два варианта.
Первый, быдлячий: использовать линейный стабилизатор напряжения наподобие 78L05 или КР142ЕН5А, что примерно одно и то же. Достоинства — дешево и крайне тупо, недостатков же куда больше. При потреблении хотя бы в 0,1 А линейный стабилизатор должен рассеивать 0,9 Вт — то есть работать практически в режиме печки. Не очень ясно поведение «кренки» и при характерных «автомобильных» особенностях входного напряжения. Успокаивать себя словами «вон в терратрипе стоит и ничего» не получается — видели бы вы тот терратрип :)
Вариант второй — заморочиться и вкорячить импульсный преобразователь. Их выпускается довольно много, и при желании они позволяют вписаться в довольно скромные габариты (скажем, LM53601 вполне официально занимает всего лишь 11,2×12,7 мм со всей обвязкой — правда, и стоит в Москве от 441 рубля в розницу). Более дешевый и распространенный вариант — MC34063A (10-30 рублей в зависимости от объема партии), к сожалению, требующая гораздо более габаритной обвязки. Это сложно назвать проблемой — но когда размеры устройства определяются блоком питания, возникает ощущение, что что-то здесь не так.
Короче говоря — а подскажите какой-нибудь DC/DC преобразователь со следующими параметрами:
— входное напряжение 8-24 В (можно более широкий диапазон);
— выходное напряжение 3,3 В;
— выходной ток 500 мА;
— цена с минимально необходимой обвязкой в пределах 100 рублей в московской рознице;
— габариты «готового» БП по возможности меньше.
Ну или объясните убедительно, что можно не выпендриваться и ставить те же «кренки».
UPD Во всяких Январях и прочих Микасах никто не стесняется ставить обычные линейные стабилизаторы — так и буду поступать в не особо потребляющих устройствах.
Раз уж последние записи у меня — про connected car и тому подобную ерунду — то вспомнился такой вот эпизод. Я как-то признался, что пробовал писать параметры от электронного блока управления двигателя в файл формата EDF, который обычно используется для всякого рода измерений в биологии и медицине. Нет, ну никто же не запрещает в поле Patient’s name написать GAZ-3111? В остальном же формат прекрасно подходит для 8- и 16-битных данных от ЭБУ (их туда можно писать вообще почти без обработки). Меня, правда, за это назвали извращенцем — ну что ж, бывает.
А вот недавно приспичило мне поискать первоисточник фразы о том, что команда McLaren «в течение одной гонки получает около 750 миллионов цифр от своего гоночного болида». Взята она, как оказалось, из русского перевода выступления исполнительного директора фирмы McLaren Electronics Питера ван Манена на TED и целиком звучит так:
We’re logging about 500 different parameters within the data systems, about 13,000 health parameters and events to say when things are not working the way they should do, and we’re sending that data back to the garage using telemetry at a rate of two to four megabits per second. So during a two-hour race, each car will be sending 750 million numbers.
Замечу, что переводчики здесь накосячили, переведя numbers, как «цифры». Речь, скорее всего, идет о 32- или 16-битных числах, получаемых от датчиков.
Меня, как известного извращенца (см. выше) заинтересовала содержательная часть выступления ван Манена — где он рассказывает, что цинично пытаясь казаться хорошими McLaren Electronics установила систему, похожую на формульную телеметрию, в детской больнице Бирмингема, сумела намерить что-то хорошее, и в целом даже кому-то помогла.
Так вот — что является бОльшим извращением — использовать для записи параметров «автомобильной» телеметрии формат, изначально предназначенный для записи физиологических параметров, или использовать для регистрации физиологических параметров автомобильную систему телеметрии?
Редкая дискуссия про повсеместную «уберизацию» обходится без хотя бы опосредованной ссылки на статью «Market for Lemons» Джорджа Акерлофа (который за нее удостоился аж Нобелевской премии по экономике), приведенной скептиками. «Автомобилисты» слышали про нее с довольно большой вероятностью — на примере рынка подержанных автомобилей показывается, что при некоторых условиях (основное из них — продавец знает о качестве товара больше, чем покупатель) рынок чего угодно скатывается в продажу дешевого говна. Русский перевод и краткий пересказ в Википедии — к вашим услугам.
Вот интересно — верно ли такое следствие: «рынок любых технически сложных товаров/услуг скатывается в продажу говна?» Мне кажется, что да.
Вот приходит мне иногда спам — мол, хватит кормить автосервисы, купите у нас чудесный диагностический адаптер (банальный китайский ELM327) и не заморачивайтесь с ремонтом авто! Как человек, знающий, чем ДМРВ отличается от BDSM, я в это все сразу не верю. Даже если зайти на сайт продавцов чудодейственного устройства — то он буквально кричит «не покупайте это говно!». Признаки лохотрона, разумеется, элементарные. Если вас хотят надурить — то попадете вы на классическую страничку-лендинг, сделанную прямо по учебнику «Landing page for dummies».
Впрочем, «товарный бизнес», заключающийся в перепродаже лохам китайского дерьма с алиэкспресса — это ерунда. Вот некие чуваки придумали аж целый стартап на основе примерно той же идеи — в разъем OBD-II, присутствующий во всех более-менее современных автомобилях, втыкается чудо-коробочка, «считывает ошибки», и через мобильное приложение записывает в ближайший автосервис, предложивший наименьшую стоимость ремонта. Вам уже смешно? Но идея настолько поразила отечественного блоггера gorynych1, что он написал длинный текст с многозначительными выводами о том, что наконец-то паразитам из автосервисов придется поумерить аппетит:
https://gorynych1.livejournal.com/207768.html
В комменты пришел настоящий автомеханик ploughlike_elk и немного покритиковал идею, заодно, правда, немного перейдя на личность автора поста:
https://gorynych1.livejournal.com/207768.html?thread=1910168#t1910168
Если хочется больше подробностей — то вот тот же ploughlike_elk расписывает, как соотносятся «ошибка», прочитанная диагностическим сканером, и возможная стоимость устранения неисправности (спойлер: никак):
https://ploughlike-elk.livejournal.com/356963.html
Горыныч немного бомбанул и расписался аж четырьмя записями, где прогнозировал счастье человечества и кабздец нехорошим автомеханикам, в особенности лж-юзеру ploughlike_elk:
https://gorynych1.livejournal.com/208825.html
https://gorynych1.livejournal.com/208945.html
https://gorynych1.livejournal.com/209339.html
https://gorynych1.livejournal.com/209820.html
В конце концов, правда, он, по ЖЖшным меркам, слил дискуссию, забанив канадского автомеханика после набега сочувствующих.
PS Особенно хороши, конечно, измышления Горыныча про Wrench — службу «выездных автомехаников». Сервис, хочу заметить, не первый, и даже не единственный — но и как все аналоги, отнюдь не совершивший революции в деле авторемонта.
Делаю сейчас одно устройство, в котором используется так называемая K-линия — немного напоминающий UART автомобильный диагностический интерфейс (он же ISO 9141). Преобразователей из K-линии в UART и подобные интерфейсы (тот же RS232) придумано довольно много, мне лично нравится вариант на логической микросхеме. Из обвязки нужно всего лишь два резистора, диод и транзистор, а стоимость деталей в чип-и-диповской рознице — менее 50 рублей (особенно, если не гнаться за какими-нибудь низковольтными вариантами логики), а «оптом» — думаю, упадет рублей до 10-15.
Для состоятельных парней выпускаются специализированные микросхемы — всякие MC33199, MC33290, L9637, или более актуальная (то есть еще встречающаяся в продаже) Si9243 — внутри там примерно то же самое, только в корпусе SOIC-8. В розницу эта микросхема стоит около 70 рублей, оптовая цена опускается до 40.
А теперь следите за руками — специализированная микросхема оказывается выгоднее, если к стоимости компонентов добавить стоимость монтажа. В случае с решением «на логике» мы имеем 22 точки пайки, а на специализированной микросхеме — всего 8. Стоимость ручного (точнее, «полуавтоматического») монтажа — что-то порядка 2-3 рублей за точку пайки — и 14 «лишних» точек съедят всю экономию.
Конечно, стоимость «одного транзистора» или «одного соединения» в виде дискретного элемента или в составе микросхемы, отличающиеся порой на несколько порядков, приведены в любой книжке — но как-то об этом не задумываешься, пока не столкнешься «вживую».
PS А заодно можно сделать вывод, что «узкоспециализированная» микросхема более выгодна и для производителя, чем «универсальная» стандартная логика — себестоимость их производства одинакова, а вот продать первую можно значительно дороже.
Православно ли использовать ладан вместо канифоли при пайке?
vitus_wagner подкинул ссылку на MIT-овскую статью по модной теме беспилотных автомобилей. Анонс — «В MIT разработали систему, которая позволяет беспилотным автомобилям ездить по сельским дорогам без точной карты» — не очень точно отражает суть работы. Системы типа nVidia DAVE2, довольно простые в реализации (у меня есть даже подборочка материалов по теме) точно так же могут вертеть рулем в нужном направлении, и для своей работы требуют только видеокамеру, смотрящую вперед — данные от GPS и карта там необязательны.
Что отличает эту систему от «нейросетевого» подхода — даже не детерминированность, пусть даже она и приятна (есть несколько публикаций, показывающих, что нейросеть по образцу сделанной в nVidia «сходит с ума» при некоторых манипуляциях с картинкой — вплоть до того, что пытается повернуть совсем в другую сторону, если изменить в картинке на входе всего один пиксель). Внимательно попробуйте осознать описание DAVE2 — эта система определяет угол поворота руля, исходя из картинки, которую видит перед собой «водитель». Но… Посмотрите на эту схему, в том или ином виде присутствующую в любом вводном материале про спортивное или «экстремальное» вождение:
Три траектории, изображенные здесь — это три разных способа прохождения одного и того же поворота, в той или иной степени «хорошие» (в зависимости, конечно, от прочих факторов). Для наглядности изображена «шпилька» — поворот на 180°, но вся та же теория остается верной и в том случае, если угол будет другим. «Осознанное» управление автомобилем предполагает, что водитель, подъезжая к повороту (из левого нижнего угла картинки), определит точку поворота руля и точку апекса — и, соответственно, траекторию в повороте. Но обратите внимание, что видимая картинка при приближении к повороту во всех трех случаях одинакова — так что система, полагающаяся в своем принятии решений только на текущий видеокадр, очевидно будет неспособна «выбирать» траекторию. Обратите внимание на то, как в ролике nVidia нейросеть «крутит» руль, дергая его туда-сюда (примерно на 7:32):
А представьте, если это будет происходить не на сухой дороге и не на смешной скорости, а в гололед? На небольшой скорости, имея отличный «запас» сцепления шин с дорогой, можно позволить себе игнорировать «физику» движения автомобиля — что и делают сейчас последователи nVidia. Если же дорожные условия становятся чуть более сложными — то так можно оказаться и в кювете.
Так вот, важнейшее, на мой взгляд, новшество в подходе MIT — это определение траектории, исходя из конфигурации дороги. Границы дорожного полотна их система определяет с помощью лидара, сканирующего пространство вокруг автомобиля с частотой 5 раз в секунду. Затем строится «локальная» траектория (довольно примитивным, правда, образом — ровно посередине между левой и правой обочинами «вписывается» сплайн, то есть достаточно гладкая кривая), и до очередного обновления автомобиль движется по этой траектории. Никто, в общем, не мешает «вписывать» траекторию и более «правильным» образом — скажем, между правой обочиной и серединой дороги, как предписывают ПДД.
Заметьте, насколько это отличается от подхода «авось нейросеть научится» :)
Открыл для себя творчество группы Orfeus. Венгры играют весьма бодрый power metal и поют на своем инопланетном языке аж с 1988 года. От выступления на венгерском телевидении в 1993 году пустил слезу — но несмотря на колхозный вид, уже тогда играли здорово:
Группа существует и сейчас, изредка записывает альбомы (Metal Archives знает о трех), и в целом выглядит достойно.
А то в предыдущей записи слишком многа букв :)
Столкнулся с небольшим багом в примерах к микроконтролеру CC3200 (ARM Cortex-M4 + WiFi). Если в многозадачной системе поменять настройки WiFi (они пишутся в подключенную к микроконтролеру флешку), а затем перезапустить сопроцессор WiFi (для применения новых настроек) способом, указанным во всех примерах, можно получить полностью неработоспособный WiFi — настройки не успевают записаться (ну вот так мне показалось — особо в подробности не вдавался). Решение очевидное — небольшая пауза при перезапуске. Я озвучил его на форуме техподдержки коллеге по несчастью 26 апреля в 1:25 PM по форумному времени — а ровно через три с половиной часа сотрудник техподдержки предложил то же самое в соседней теме.
Закон парных случаев?
Для начала — о том, как делать не надо. Вот представьте, что вам надо сохранять в какой-нибудь базе данных показания каких-нибудь датчиков, чтобы потом показывать их в модном веб-приложении. Вы уже хотите написать что-то в таком духе?
CREATE TABLE measurements ( measurementID int NOT NULL AUTO_INCREMENT, sensorID int NOT NULL, time datetime NOT NULL, value double NOT NULL, PRIMARY KEY (measurementID) )
Это очевидно неправильно — имел удовольствие несколько лет подряд наблюдать за эволюцией небольшой SCADA-системы, где хранение данных организовали примерно так. Пока датчиков было немного — оно работало, но примерно на сотне-другой обновляющихся примерно раз в 5-10 секунд датчиков потребовало для работы некоторых костылей. Для начала — в БД перестали записывать «небольшие» изменения данных — скажем, меньше 5% (величина была выбрана довольно произвольно — не надо спрашивать, соответствует ли такой подход требованиям технического задания :) ) от предыдущего сохраненного значения. Затем — по мере накопления данных соорудили чудовищную систему из триггеров и хранимых процедур, которая автоматически создавала «архивные» таблицы сравнительно небольшого размера. Впоследствии, конечно же, выяснилось, что эта система временами глючит и иногда новую таблицу для архива надо создавать вручную.
Наконец, на одном из объектов в дополнение к привычным «медленным» газоанализаторам поставили два десятка акселерометров — и тут все повалилось уже серьезно. Во-первых… нет, для начала в нулевых. Не надо говорить мне, что datetime в SQL неспособен хранить данные с «разрешением» меньше секунды, а опрашиваемый раз в секунду акселерометр бесполезен — тут речь шла уже о том, чтобы записать в базу хоть что-то. А теперь во-первых — показания акселерометров меняются сравнительно быстро и под фильтр «небольших» изменений данных не подпадают, и во-вторых — отказы БД стали чуть ли не ежесуточными. Считайте сами — в сутках 86400 секунд, и при двух десятках пишущих что-то датчиков мы влегкую получаем 1,7 миллиона записей в сутки. Да, часть из них отфильтруется — но и миллиона строк хватит, чтобы популярные СУБД с SQL хорошо и надежно «легли».
Признаться, я списывал многое из этих проблем на невысокую квалификацию разработчиков этой системы, но после доклада Сергея Аксенова “Антипаттерны разработки программных комплексов для интернета вещей” на Inothings++ понял, насколько героические люди используют SQL для хранения такого рода данных. Про выбор СУБД в видео — с 4:28:
Идея понятна — реляционные СУБД расчитаны на количество строк порядка миллионов (десятков миллионов — если у вас поблизости есть грамотный администратор баз данных), а как легко посчитать — это всего лишь суточный архив сравнительно небольшой системы. Впрочем, случай «Стрижа» еще более-менее прост — частота опроса каких-нибудь ЖКХшных счетчиков относительно небольшая, всего несколько раз в сутки. А что делать, если хочется хранить, скажем, данные по 16 каналам АЦП с небольшой в общем-то частотой дискретизации в 16 тысяч выборок в секунду? Нет, я прекрасно представляю, как это сделать «на файлах», и это совсем не сложно — простенький формат хранения данных можно полностью реализовать за неделю неспешной работы (собственно, что-то наподобие edflib, но работающее на микроконтролере с сотней килобайт памяти я написал в прошлом году где-то за несколько дней):
Implementing EDF takes a week. EDF+ takes a few weeks but is better and more powerfull. If you still decide to start with EDF, it is wise to adopt the 12 simple additional EDF+ specs.
Не смотрите, что он предназначен для записи всяких физиологических данных — я в таком виде пробовал всякие обороты двигателя, расход воздуха и прочее время впрыска записывать, они в этот формат прекрасно вписываются :)
Еще из полезного чтения — статья Luca Deri о системе, названной им tsdb — построенной поверх Berkeley DB системе, обеспечивающей хранение миллионов (!) временнЫх рядов (time series — собственно, это общее название для такого рода данных). Решение не совсем подходящее для моего случая — но опять же содержащее несколько полезных идей.
Для начала — система, многократно превосходящая по производительности решения на основе SQL, реализована всего лишь в 1000 или около того строк кода на Си. Именно это и вдохновило меня на написание собственного решения — 1000 строк это совсем немного, а следовательно, должно быть довольно просто. Второе — данные желательно каким-либо образом объединять — если в tsdb это сделано довольно произвольным образом (в базе много редко обновляемых временных рядов), то в моем случае я просто решил писать «секундные» (или соответствующие какой-то доле секунды) записи, как в EDF.
В общем, осознав эти «три источника и три составные части», я взял пивка и засел за Visual Studio — и примерно за вечер написал прототип базы данных, оптимизированной под мои требования — десятки-сотни одновременно записываемых временных рядов с частотой дискретизации от единиц до тысяч Гц. Собственно, по факту получился тот же EDF, только записанный в Berkeley DB. Выбор довольно произвольный (прежде всего — ее используют в tsdb) — но эта, так сказать, «встраиваемая СУБД» поразила меня своей простотой. Немного не радует лицензия — хотя при желании могу выложить код на какой-нибудь гитхаб для очистки совести.
Что могу сказать? Не прилагая никаких усилий в части оптимизации, на собственном ноутбуке я «из коробки» получил скорость записи в базу данных около 40-50 Мбит/с (похоже, упираясь в производительность жесткого диска) — причем, судя по всему, падения производительности с ростом числа записей в БД не происходит. Например, в БД размером около 11,5 Гб — это чуть меньше 1,5 миллионов записей по 8 килобайт (в каждой из записей — по 4000 «точек», каждая из которых — двухбайтовое целое) никакого снижения скорости записи или чтения я не наблюдал (дальше просто стало жалко жесткий диск). Что забавно — тесты «на чтение» демонстрируют полезность кеширования — сначала 10 000 записей читаются за долгие 8 секунд, а затем, если повторить тот же тест «не отходя от кассы» — за 0,22 секунды. Не видел бы — не поверил.
Графики рисовать не буду — там при моих объемах записей в основном почти прямые линии. Возможно, что производительность и деградирует на больших объемах данных — но мне лень расходовать на проверку этого десятки гигабайт.
PS А если вам все же нравится SQL — почитайте, как правильно организовывать хранение time series в реляционной БД:
И все-таки хочу напомнить, что решение «на коленке» практически не уступает приведенному в статье по ссылке в плане производительности (и да, надо бы проверить его с четырехгигабайтным кешем :) ).
…что на внутренней стороне коробочки с Intel Edison изображен боевой беспилотник MQ-9 Reaper: