Аффтопрограммирование

В автомобили уже давно ставят компьютер с бортовой самодиагностикой. До 1996 года единообразия работы с этим компьютером не было, а теперь везде можно с ним поговорить по набору стандартов OBD2. Раньше сканеры, общающиеся с диагностической системой, были дико дорогими, но теперь цена стала более демократичной, и самые простенькие можно купить монет за 20, а то и ещё дешевле. Однако дешёвые сканеры имеют крайне ограниченные возможности, и способны только на самые примитивные действия — просмотр диагностических кодов (далеко не всех), их стирание. Если же тебе нужна диагностика чего-то более сложного, придётся серьёзно раскошелиться. Вот, например, возьмём такую распространённую вещь как диагностика катализатора. Когда у тебя вылазит код диагностики P0420, причины для него могут быть самые разные. Может быть, датчик кислорода подох. А может быть, и катализатор. Ведь как возникает этот код? У тебя стоят два датчика кислорода — один ДО, другой ПОСЛЕ катализатора (в машинах, которые дизайнили пидарасы в плохом смысле слова, их аж четыре — см. Ниссан). Код ошибки генерируется когда показания этих датчиков ОДИНАКОВЫЕ. Что логично — это означает, что катализатор ничего не делает.

Чтобы однозначно понять, надо ли менять катализатор, надо показания этих датчиков представить графически. Какие показания будут у них до того, как катализатор прогреется до рабочих температур. Какие после. Показания датчика ДО катализатора должны меняться, и довольно сильно. Показания датчика ПОСЛЕ катализатора должны оставаться постоянными. Увидев всё это, легко понять, что происходит. Но сканер OBD2, способный строить графики, уже недёшев — от 150 монет и выше.

Что можно сделать, если у тебя руки растут из (надеюсь) относительно правильных мест? Можно купить компьютерный адаптер на чипе ELM327, который подключается через USB и становится в компьютере дополнительным COM-портом. Они недорогие — за 10 монет можно купить. Затем берём любую терминалку, и цепляемся к этому порту, выставив скорости от 9600 до 38400 и 115200 (зависит от конкретного адаптера). И разговариваем с ним как с обыкновенным модемом. Ага. Он даже командой ATZ ресетится 🙂

Вот так, например:

OKL1 это на самом деле OK, выданное модемом на команду ATL1 (включающую добавление CR в ответы). Иначе человеку некомфортно.
AT@1 это запрос “ты кто такой”, типа ATI7 на модемах US Robotics 🙂

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

Судари мои, за что мы любим язык программирования Питон? Я вот раньше его недолюбливал, а потом оценил по достоинству. Язык Питон мы любим за то, что на нём можно решить практически любые прикладные задачи если использовать соответствущие библиотеки; ибо кто-то с такой проблемой уже, скорее всего, сталкивался.

Существует специальная библиотека Python-OBD, в которой вся эта расшифровка шестнадцатиричной бредятины уже написана, тебе остаётся только её взать и нарисовать, что тебе надо. В частности, оно может выдавать значения напряжения, выдаваемого датчиками кислорода. Остаётся сунуть эти значения в список (во что же ещё), после чего скормить его matplotlib.pyplot, и представить графически хоть чорта бритого, причём ровно так, как тебе надо.

Ну, а те, у кого с программированием не очень, могут приобрести коммерческие программы, работающие с адаптерами на ELM327. Их много всяких, и они недорогие — всяко дешевле 150 долларов.

Надо ещё сказать, что тут есть засада. Стандартные OBD2 коды хорошо документированы. Но есть и специальные, проприетарные коды, для каждой марки свои, и производители не спешат их описывать и выкладывать описание в открытый доступ. Надо же как-то заставить юзверей ушастых покупать обслуживание в дилершипах. Но есть недорогие программы, которые поддерживают и эти коды. Так, для БМВ есть Bimmerscan, а для Фордов есть Forscan, причём на него бесплатно дают пробную лицензию на два месяца. Кроме того, Forscan работает и не с Фордами, просто он не поддерживает специальные коды диагностики для автомобилей других производителей.

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

PS: Хех, вот уж не думал, что теги “автомобили” и “программирование” когда-нибудь встретятся.

Компьютерное

Проапгрейдил жёсткий диск в компьютере. Был 1 “терабайт”, стало 2. В кавычках потому что производители используют альтернативную математику — 1 терабайт у них это 1000 гигабайт, а не 1024.

Тупо перекинул всё Акронисом, благо с твёрдотела на твёрдотел всё копируется моментально. Лет 10 назад я бы всё переставил нахер с нуля, а щас настолько лениво всё это делать! Это что же, все программы с нуля переустанавливать, все игры, все настройки? Нафиг-нафиг.

А ещё я сделал одну вещь, которую тоже не стал бы делать 10 лет назад. Купил игровой ноутбук MSI. Это раньше я думал (ошибочно), что Компьютеры должны быть Большие и Железные, а теперь я ничего такого предосудительного в ноутбуках не вижу. Ноутбук не сильно выпендрёжный, но в нём стоит Нвидия 2060, ничуть не меньше по мощности, чем 1070 GTX, что стоит в стационарном компе. Игры идут замечательно. Да и всё остальное тоже.

Майкрософт, наконец-то, блин, решил давно существующую проблему: как получить компьютер, который может одновременно играть в игры, и работать с софтом под Линукс, которому нужна CUDA, и чтобы без установки двух ОС в многозагрузочной конфигурации. Я уже давно использую WSL (Windows Subsystem for Linux). Это позволяет постоянно иметь под рукой Линукс, на котором можно разрабатывать софт, не отходя от кассы. Не надо путать WSL с Cygwin — WSL это полноценный линукс, запускающий линуксовые же бинарники, а не перекомпилированный в экзешники линуксовый софт. Ещё в нём удобно обмениваться файлами с линуксовой подсистемой — ибо WSL создаёт скрытую шару \\wsl$, из которой ты имеешь возможность обращаться напрямую к / в линуксовой виртуалке.

Так вот, выяснилось, что начиная с WSL версии 2, ресурсы графического процессора нормально прокидываются к гостевой ОС, так что там можно запускать TensorFlow, Caffe, и прочие интересные вещи без того, чтобы тормозить и всё выполнять на центральном процессоре. Так что впервые, блин, можно и на ёлку залезть и не оцарапаться. Раньше подобные задачи решались установкой Линукса в качестве основной ОС, и водружением на него системы виртуализации Xen, которая запускала машину с Виндоуз, в которой уже можно было запускать игры, ибо Xen умеет пробрасывать GPU до гостевой ОС.

Конечно, есть небольшая потеря производительности и в том, и в другом случае. Но потеря производительности на 10% в играх — намного заметнее, чем потеря производительности на 10% при исполнении TensorFlow. Так что как ни крути, а всё же в этом отношении Виндоуз лучше Линукса.

Доломал минимакс

Вот многие считают, на мой взгляд, необоснованно, что машина, созданная человеком, завсегда будет дурнее создателя. По моему опыту, верно обратное — созданный человеком искуственный интеллект (оговорюсь сразу, для данной конкретной определённой задачи — т.н. “слабый” ИИ) работает намного мощнее, чем способен человек, его написавший. Во всяком случае, мои крестики-нолики легко меня громят, если только я не наморщу ум — тогда получается ничья. Да и Deep Blue, который обыграл Каспарова, писали хоть и люди, заведомо знакомые с шахматами, но всё же не игроки выше уровня великого шахматиста.

Поэтому, так сказать, в дальней перспективе я вижу, что человек сможет создать сильный искуственный интеллект, который превозойдёт его самого. Вопрос, какая роль будет отведена человеку в данном мире — ОЧЕНЬ интересный, и по-моему, однозначного ответа нет ни у кого. Элон Маск, например, считает, что человечество будет порабощено сильным ИИ. Создатели сериала “Person of Interest” думают, что человек будет существовать с сильным ИИ симбиотически — т.е. всё управление и развитие человечества возьмёт на себя ИИ, люди будут абсолютно счастливы, а в обмен на это будут этот самый ИИ обслуживать, например, батарейки вовремя менять 🙂 Ну, а создатели сериала “Westworld” отводят ИИ роль рабов, прислужников человека. Какой из этих ответов верный — неизвестно, но не исключено, что ответ мы узнаем в течение нашей жизни.

Однако хватит философии.

Вся задача написания игры, способной обыграть создателя, в итоге таки свелась к написанию алгоритма минимакс. В этом была вся загвоздка. Попытаюсь объяснить попроще, как он работает.

Для каждого потенциального хода нужно рассчитать некий коэффициент. Отрицательный коэффициент будет означать, что выиграл противник, положительный — что выиграла программа. Я начал с того, что присвоил немедленному выигрышу значение 1.0, проигрышу -1.0, а ничьей 0. Далее, алгоритм помечает этот ход как корневой узел, и строит исходящее из него дерево потенциальных ходов противника, а потом снова своих, вызывая сам себя рекурсивно (а как же ещё, если речь идёт о деревьях произвольной высоты). Раньше или позже, алгоритм доберётся до листьев игрового дерева, и будет возвращать +1.0, -1.0 или 0. Остаётся только сложить все значения, полученные из листьев игрового дерева, вместе, и записать их в массив, из которого выбрать максимальное значение, присвоенное какому-либо ходу.

Но этого оказалось недостаточно. Написанная с таким алгоритмом программа таки играла, но на среднем уровне. У неё можно было выиграть. Шишечкой на этой ёлочке оказалось введение дополнительной поправки, на которую умножался коэффициент, полученный из листьев игрового дерева. По простой причине — немедленный выигрыш или проигрыш, прямо со следующего хода, должен учитываться значительно больше, чем выигрыш или проигрыш после нескольких ходов. Я начал с того, что коэффициенты, полученные из каждого более нижнего уровня игрового дерева, стал делить на 2. Но и этого оказалось мало, хотя и заметно улучшило работу алгоритма. Магическим числом оказалось 4. Т.е. немедленный выигрыш на первом ходе учитывается как +1.0, выигрыш на втором — как +0.25, на третьем — +0.0625 и так далее. Вот тут уже выиграть против программы не оказалось никаких шансов. В лучшем случае я могу сыграть вничью.

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

Надо будет написать программу, играющую в преферанс. А то комп меня легко дрючит, особенно на распасах (я вообще не очень играю ни в преферанс, ни в шахматы, ни в шашки, хотя почему-то неплохо — в поддавки).

IT-гримасы кризиса

Все помнят Y2K? Тогда огромное количество существующих государственных систем потребовали переписывания, так как они некорректно отрабатывали двузначные даты. Огромное количество этих приложений были созданы в 1970-80е на Коболе, и внезапно программисты на Коболе оказались дико востребованными.

Теперь в связи с вирусным кризисом мы оказались в той же ситуации — эти государственные компьютерные системы никуда не делись, но из-за огромного наплыва тех же безработных, подающих на пособия, они не справляются с нагрузкой. Штат Нью-Джерси ищет программистов с опытом программирования на Коболе, починить их древнюю систему обработки заявлений на получение пособий.

Правда, ищут они волонтёров, то-есть, предлагают работать за бесплатно, так что #goodluckwiththat

И не вполне понятно, чего они хотят починить. Древний мейнфрейм, хоть ты программу обпереписывайся, быстрее работать не станет.

Поглядел я этот Кобол, кстати. Дико раздражает его многословность. Даже в таких простых вещах как операторы сравнивания. Чего стоит, например, условие “A не равняется B”. На Сях оно просто: A != B. А на Коболе надо писать A IS NOT = B. Ага, вот так, знай наших! Мы не как другие всякие! Меня, кстати, то же самое раздражает в Повершелле. Там нельзя написать A > B. Надо писать A -gt B. Дичь какая-то. Создателем Кобола, кстати, является женщина, и я не хочу показаться сексистом — но может быть эта многословность оттуда?

Про 42

Хотел написать про то, как мне лично было непонятно, чем так гордится группа исследователей Массачуссетского Технологического, которая нашла значения x, y, и z, при которых x3 + y3 + z3 = 42.

Набросал для расчётов свою прогу на Джаве. И не могу сказать, что она не работала. Она прекрасно работала для многих цифр, в том числе, и для любимого числа Шелдона Купера (73). Но дальше, имея на руках порядки полученных в MIT цифр для 42, прикинул вычислительную сложность, и охренел — т.к. решать данную проблему, как говорится, “в лоб” на самом ультрасовременном суперкомпьютере с его двумя сотнями петафлопсов с лихером придётся э…. не намного меньше, чем возраст наблюдаемой Вселенной.

Устыдился, пошёл читать про алгоритм, которым раньше было решено уравнение x3 + y3 + z3 = 33. Оказалось, что там, мягко говоря, очень не в лоб решали. Устыдился окончательно. Полезно вот так иногда, рожей об стол, для скромности и смиренности.

Вопросы на интервью, помощь зала

Мне надо будет нанять сисадмина; но так как мы теперь семимильными шагами идём в облако, от сисадмина теперь требуется опыт программирования. Не сильно углублённого, но надо, чтобы человек понимал основы написания скриптов.

Сижу чешу репу над списком вопросов.

Мне, повторюсь, не надо, чтобы человек знал, например, какой конкретно командой можно получить массив объектов компьютеров из AD — это легко гуглится. Надо понять, умеет ли чел вообще в основы погромирования. Пусть пишет хоть на Питоне, хоть на псевдокоде, мне похер.

1. Если нужно совершить одно и то же действие пять раз, как это лучше всего сделать внутри скрипта?
2. Если мне надо получить пронумерованный список всех компьютеров в домене, как проще всего это сделать?
3. Нужно написать скрипт, который будет посылать извещение сисадмину, если в домене появятся учётные записи, пароль которых никогда не истекает. Как это лучше всего написать?
4. if (a = 0) { .. } — почему данное условие либо не работает вообще, либо не работает правильно?

Какие ещё будут предложения?

Компьютер всё делает лучше

Нашёл тут задачку судоку, типа, самая сложная в мире.

https://gizmodo.com/can-you-solve-the-10-hardest-logic-puzzles-ever-created-1064112665

Нуичо, моя джавовская решалка расправилась с ней за 0.1 секунды. Нифига она не сложная.

Скорее всего, “сложной” она является только потому, что решить её логически очень сложно, а вот перебором — пожалуйста. Удивительно только что самые разнообразные задачки судоку моя программа решает в среднем за 2 секунды, а тут получилось значительно быстрее. Видимо, то, что заточено под логику, сложнее для компьютера, и наоборот, то, что человеческий мозг ставит раком, для компьютера ерунда.

Про облачное сисадминство

Скажу я вам, что оно мне нравится значительно больше традиционного. Во-первых, тем, что не нужно делать нудную неинтересную работу типа проверки статуса дисков в массиве, их замены, и прочего. Это позволяет сконцентрироваться на более интересных (и денежных) аспектах сисадминства — управлением AD, настройкой сетей, администрированием баз данных, и так далее. А витую пару-то обжимать можно и мартышку научить.

Но самый неожиданный аспект данного сисадминства лично для меня заключается в том, что оно сильно сдвинуло меня в область программирования. Потому что Правильное Облачное Сисадминство — это Инфраструктура как Код, что подразумевает руление ресурсами в первую очередь через использование JSON-шаблонов, нарисованных в Visual Studio исполняемых Team Foundation Server, и далее по алфавиту.

Особенно важно использовать Инфраструктуру как Код если надо создавать туеву хучу одинаковых ресурсов. Я могу, например, 20 виртуальных машин с SQL Server-ом создать за 5 минут. Удачи угнаться если делать всё это руками.

Ну, и облако — это просто круто само по себе. Особенно для малого бизнеса, например — это раньше надо было создавать серверную, тратить кучу бабок просто для того, чтобы начать. С облаком же во-первых, нет капиталовложений, а во-вторых, мощность ресурсов можно наращивать по мере надобности — начать с маленьких, и закончить суперкластерами с 24 терабайтами оперативки.

Короче, лублу и керемендую.

Дорисовал

Таки доделал програмку на Питоне, рисующую спектр сигнала и автоматически считающую КНИ+шум и ОСШ. Попутно узнал, как водится, много нового. За что люблю Питон — так это за то, что программа занимает менее 40 строк. На тех же Сях я бы усрался это рисовать. Даже на Шарпах бы усрался.

Программе скармливается звуковой файл с сигналом частотой в 1 kHz, сгенерированный программой Adobe Audition (в девичестве Syntrillium CoolEdit). Но можно взять и бесплатный Audacity, результат будет точно такой же. Программа читает файл, берёт значение с наибольшим пиком и даёт ему обозначение в 0 децибел. Остальное, соответственно, отрицательные величины. Подсчитывается среднеквадратичное значение всего, что не сигнал, и делится на уровень сигнала. Получается КНИ+шум (THD+N). Потом считаем ОСШ (отношение сигнал/шум, SNR) в децибелах: 20log10(сигнал / шум)

Вот так выглядит анализ звукового файла с сигналом 1 kHz, разрешением 16-бит, частота дискретизации — 48 kHz:

Это весьма близко к теоретическому идеалу — в идеале, разрешение 16 бит может дать ОСШ в 96.3 dB. Но у меня не идеал, так как я использую чуть менее, чем 16 бит — ибо если генерировать синусоиду с уровнем в 0 dB (т.е. по-максимуму), то почему-то уже лезут нелинейные искажения. Так что я создаю её с уровнем в -0.1 dB, минимальным отступлением от максимума, которое мне даёт делать Audition. В любом случае, 94 dB — это дохрена.

КНИ в 2 тысячных процента это тоже прекрасно. Без приборов этого никто никогда не увидит, искажения начинают быть слышимыми, когда уже вплотную приближаются к 1%, хотя это сильно зависит от того, что именно слушаем: если чистые синусоиды, то искажения начинают быть заметными гораздо раньше, а если в качестве тестового материала брать альбомы фифтисентов и прочих, то там можно и 10% искажений не услышать. Что не означает, что аппаратура, дающая КНИ в 0.05%, ничем не лучше аппаратуры, дающей 0.1% — она лучше; просто в реальности ушами этого ни один живой человек не услышит.

А теперь — снова пнём формат MP3 🙂 Никто как-то вот не задумывается о том, что они слушают в тысячедолларовых деревянных наушниках, подключённых к внешним усилителям класса А за семьсот долларов, обещающим КНИ в 0.00045%

А между тем это реалии MP3 с битрейтом в 192 килобита/сек:

А это — 320 килобит/сек:

Получше, конечно, чем 192 kbps, но всё равно проседание качества очень налицо — происходит серьёзное ужимание динамического диапазона (я в курсе, что ДД и ОСШ это не вполне одно и то же, но они связаны). На некотором материале (например, классическая музыка, обладающая большим динамическим диапазоном) это может быть очень заметно. На 192 килобитах так это точно заметно, тихая партия скрипки сопровождается скрежетом артефактов сжатия с потерями — собственноушно, так сказать, слышал. Дальнейшее увеличение битрейта после 320 килобит/с, кстати, уже ничего не даёт — ОСШ так и остаётся в районе 55 децибел.

Ещё надо будет попинать винилофильство и прочее плёнколожество, но это в другой раз 🙂

А что-то в этом есть

По совету ув. ny-quant попробовал использовать формулу x = r * x (1 – x) в качестве генератора случайных величин. Одного преобразования мне показалось мало, так что делал два кряду.

“В домашних условиях” проверить, качественная ли случайность не очень просто, надо вспоминать основы статистики и правильное применения хи-квадрата. Но есть неплохой способ — представить полученные значения в виде изображения. Если картинка выглядит шумом, то шансы на то, что значения действительно случайны, неплохи. Человеческий глаз очень неплохо натренирован на то, чтобы различать неслучайные узоры — миллиарды лет эволюции, чтобы издалека узнавать хищников или отличать ядовитых змей, даром не проходят.

Ну, как грица, pics or it didn’t happen.

Результат использования функции NumPy.random.random():

И результаты, полученные из двойного применения x = r * x (1 – x) с двумя разными значениями r:

Вообще — неплохо, должен признать.

Но если приблизить и рассмотреть детальнее, становится заметной разница. Справа — x = r * x (1 – x), слева — NumPy.random.random()

Как видно, x = r * x (1 – x) чаще принимает граничные значения, там много белого и много чёрного, и мало серого. Из-за этого, кажется, что есть узоры, как на булатной стали. Я не математик, но мне кажется, что большая равномерность является желательной.

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