или Почему каждый инженер должен изучать Python

Недавно я решил воскресить старый проект, который начал пару лет назад. У меня есть Hi-Fi система, которую я собрал из кусочков, собранных за годы. У меня есть классный Pioneer 300 CD Jukebox, проигрыватель Technics, параметрический эквалайзер Nikko, ресивер Denon DRA-295 и колонки Harmon/Kardon. Я ценю немедленный доступ к высококачественной музыке.

Если я хочу послушать песню, я хочу услышать ее громко и прямо сейчас.

К сожалению, у ресивера Denon нет инфракрасного пульта. Как и проигрыватель компакт-дисков Pioneer. Пульты для этих устройств стоят дорого на eBay, и хотя некоторые универсальные пульты могут поддерживать Pioneer, они определенно не будут поддерживать Denon. Вы можете купить высококачественные универсальные пульты дистанционного управления, которые не зависят от протокола и просто сохраняют информацию о частоте и времени, но зачем покупать один, если я могу просто собрать его самостоятельно?

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

Большинство онлайн-хранилищ инфракрасных кодов имеют формат Pronto HEX. По сути, это гигантский текстовый файл, где каждая строка представляет собой отдельную команду. Первые несколько байтов описывают частоту импульсов, а остальные байты определяют время включения/выключения для отправки этого конкретного кода. Это отличный формат, если вы ничего не знаете о протоколе, так как он буквально просто хранит точную последовательность импульсов, необходимых для генерации команды; однако он крайне неэффективен по размеру. HEX-файл Pronto, который я нашел для приемников Denon, содержит более 1500 строк текста! Если вы можете указать протокол в своем коде, вы можете сохранить каждый код как беззнаковую 32-битную переменную. Гораздо меньше, чем 242 КБ текста, которые в противном случае потребовались бы!

Но как мы можем перейти от Pronto HEX к беззнаковому 32-битному целому числу? Коды, как упоминалось ранее, представляют собой просто количество времени, в течение которого ИК-светодиод должен оставаться включенным или выключенным. В протоколе, используемом Denon, как и в большинстве инфракрасных протоколов, именно соотношение между этими двумя числами определяет, является ли отправленный бит 0 или 1. Достаточно просто — нам просто нужно удалить байты заголовка, затем разделите каждую пару чисел и посмотрите на результат, чтобы определить двоичный вывод. Но мы говорим о 1500 строках текста здесь! Выполнение этого вручную заняло бы дни чрезвычайно утомительной работы. К счастью, у нас есть компьютеры! Моей первой мыслью было написать программу на C, так сказать, на моем родном языке программирования. К сожалению, манипулирование текстом и текстовыми файлами в C действительно утомительно. И тут у меня в затылке загорелась лампочка — используй скриптовый язык!

Недавно я начал изучать Python, и он идеально подходил для этой задачи. Хорошо работаете с текстом? Проверять. Хорошо разбираетесь в математике? Python технически имеет бесконечную точность с плавающей запятой. Проверять. Легко писать, чтобы я мог быстро собрать что-то? Проверять. Python — единственный язык, с которым я столкнулся, где кривая обучения настолько пологая. Чтобы начать, нужно так мало времени, особенно если у вас уже есть опыт программирования. К синтаксису нужно немного привыкнуть (лично я не сторонник использования только отступов для разделения логических структур в коде), но уже существующих модулей так много, что любая задача становится тривиальной. Как встроенный программист, я не рассматриваю Python как язык, в который нужно углубляться — скорее, я рассматриваю его как нечто, что нужно освоить, чтобы помочь автоматизировать рутинные задачи, такие как эта. С 25 строками Python эта задача почти тривиальна. Я думаю о Python как о обезьяне, которая видит, обезьяна делает язык. В отличие от функциональных или процедурных языков, таких как C или Java, вам не нужно тратить много времени на понимание синтаксиса языка, прежде чем начать что-то с ним делать. Если вы вообще знаете какой-либо язык программирования, вы можете легко просмотреть другие скрипты, а также несколько онлайн-ресурсов и быстро создавать полезные скрипты. Давайте посмотрим, насколько это просто:

Вот и все! Это настолько простая задача, что нам даже не нужно импортировать какие-либо модули. Мы открываем как входной, так и выходной файлы, прокручиваем каждую строку во входном файле, перемешиваем ее, чтобы превратить в список Python (один из примитивов данных в Python), а затем выполняем простые математические действия, чтобы преобразовать ее в двоичную строку. ! Затем мы записываем этот вывод в файл и закрываем файлы. В этом сценарии ни на унцию больше жира, чем это абсолютно необходимо. В этом заключается сила языка сценариев, и именно поэтому они так хорошо сочетаются с языками более низкого уровня, такими как C. Например, обратите внимание, что во вложенном цикле for мы можем напрямую преобразовать строку из строки в целое число. Попробуйте сделать это на C!

Очень рекомендую книгу Learning Python by Mark Lutz. Он опубликован O’Reilly, и это отличный ресурс. У меня также есть Python Pocket Reference, который очень удобен. Просто помните, что для автоматизации задач, подобных описанным выше, вам действительно не нужно изо всех сил! Вам не нужно изучать лямбда-выражения или функции-генераторы. Просто воспользуйтесь чрезвычайно богатыми и универсальными библиотеками Python, которые существуют, и помогите выполнить свою работу быстрее! У меня есть репозиторий GitHub с некоторыми полезными скриптами Python, которые я написал для автоматизации некоторых других скучных задач. Не стесняйтесь взгляните на это здесь! Не стесняйтесь обращаться ко мне, если вам нужна помощь!