Инфраструктурное

На днях я в очередной раз занимался настройкой всякого домашнего компьютерного, и осознал, что IP адреса всяких домашних устройста уже перестают держаться в голове; приходится лазить в админку роутера, чтобы вспомнить.

Не нравится. Хочу конфигурировать вообще всё, используя имена, а не адреса. А для этого нужен DNS-сервер на локальную сетку.

Изучение вопроса навело меня на очень и очень интересный проект: Pi-hole. Это оказалось именно то, что доктор прописал.

Оно без проблем утановилось на мой принт-сервер, который у меня крутится на OrangePi. Конфигурируется оно тривиально просто, и возможностей вполне хватает для небольшой домашней сетки. Теперь все адреса везде с чувством глубокого удовлетворения я меняю на имена.

Я очень доволен и всем рекомендую.

Рис. 1

А что там вообще случилось-то?

Несколько раз до меня донеслось, что на этой неделе что-то там стряслось с windows, и что кошмар-кошмар и всё пропало.

Судя по выдаче Яндекса — реально что-то произошло. (См. рис. 1.)

Надо будет почитать про всё это. А то мне с Линукса плохо видно детали этого происшествия.

Рис. 1

(не)переполнение millis()

Как, наверное, любой начинающий ардуинщик, когда я узнал о том, как можно реализовать всякое с использованием функции millis(), возвращающей 32-разрядное беззнаковое целое число миллисекунд, прошедших с момента запуска микроконтроллера, я задался вопросом: «а что будет, когда счётчик миллисекунд переполнится?»

Функция millis() для ардуинщика — это альфа и омега всей «многозадачности» ардуино. Если что-то нужно регулярно выполнять через заданный интервал времени, то обычно пишут какой-то такой код:

uint32_t  my_timer;    // где-то объявляем переменную "таймер"
#define MY_PERIOD 1000 // "раз в секунду"

...

my_timer = millis();    // "запускаем" таймер, запоминая в
                        // переменной текущее значение millis()

...

// и где-то в основном рабочем цикле пишем примерно такое:
if ( millis() - my_timer > MY_PERIOD ){
    // Заданное время ожидания прошло
    // делаем здесь, что хотели

    my_timer = millis(); // снова взводим таймер для следующего
                         // срабатывания
}

Так вот, предположим, что в «таймере» мы сохранили число 0xFFFFFFFE. Естественно, 32-разрядный счётчик переполняется через 1 миллисекунду и millis() начинает возвращать 0, 1, 2, и т.д.

И куча новичков-ардуинщиков в интернете пугается, когда понимает, что при таком раскладе «всё пропало», потому что в этом случае при проверке срабатывания таймера из 1 будет вычитаться 0xFFFFFFFE и, вроде бы, так нельзя. Поиск по клчевым словам «переполнение millis()» выдаёт кучу ссылок на страницы, где «знатоки» со знанием делом говорят «не ссыте, всё будет нормально, потому что вычитание беззнаковое», не объясняя при этом ничего.

А я объясню, мне не жалко. 🙂

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

В этом месте, может, стоило бы рассказать про комбинационную схему «сумматор» и объяснить, как она работает. Для того, чтобы на низком уровне показать, как же, собственно, компьютер складывает числа. И чтобы стало понятно, что вычитать (подобно тому, как это делает человек) процессор не умеет. Он умеет только складывать. Но про (полный) сумматор читайте в другом месте. А здесь и сейчас достаточно понять, что кто-то очень умный придумал, как можно вычитать одно число из другого, имея в качестве инструмента комбинационную схему, которая умеет только складывать (суммировать).

Он придумал представлять отрицательные числа в т.н. «дополнительных кодах«. То есть, если нам надо вычесть из положительного числа А положительное число Б, нужно преобразовать число Б в дополнительный код (получив тем самым число -Б), и после этого спокойно складывать числа «А» и «-Б». Здесь важно то, что беззнаковые числа тоже преобразуются в дополнительный код при вычитании.

Т.е. если наше А = 3 и Б = 1 (00000011 и 00000001 в двоичном представлении), то при вычитании Б из А будут складываться числа 00000011 и 11111111. В результате такого сложения мы получим 00000010, а точнее (1)00000010, где единица, образующаяся при сложении старших разрядов улетает в переполнение (за пределы нашего 8-разрядного целого). То есть, при сложении числа 3 и представленного в дополнительном коде числа -1 мы получили число 2.

В случае с millis(), нам надо было из беззнакового числа 1 вычесть беззнаковое число 0xFFFFFFFE (т.е. двоичное 1111111111111110). Ну, хорошо, преобразуем вычитаемое в дополнительный код и получаем двоичное 0000000000000010. В результате мы складываем 1 и двоичное 10, получая двоичное 11, т.е 3. Т.е. результатом операции «1 — 0xFFFFFFFE» будет 3. И это именно то, что мы рассчитывали получить, проверяя таймер:

1111111111111110 <-- здесь "засекли" таймер
1111111111111111
0000000000000000
0000000000000001 <-- а здесь "1 - 0xFFFFFFFE = 3"

Т.е. всё, что надо, успешно вычитается, и получается именно то, что надо. Вот такая магия.

P.S. Только что осознал, что двоичное представление 32-разрядных чисел у меня получилось 16-разрядным :). Но не буду исправлять, т.к. будет хуже читаться. А на суть явления размерность чисел не влияет. Можно было хоть на 3-разрядных числах это показывать.

Хорошая зачищалка МГТФ

По мотивам предыдущей заметки.

Попался мне вот такой ролик, где товарищ зачищает провод МГТФ с помощью дуговой зажигалки. И показалась мне эта идея достойной того, чтобы попробовать. И я попробовал.

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

Годный способ.

Рис. 1

Странно, …

… что за все эти годы, пока моё «радиолюбительство» стояло на паузе, никто так и не придумал нормальную зачищалку провода МГТФ.

Я собираюсь межблочные связи тянуть именно МГТФом. Я помню, насколько он хороший, гибкий, мягкий и прочный. Но, оказывается, я напрочь забыл, как он плохо зачищается.

Новый флюс

Проведенное недавно упражнение по пайке деталей на печатную плату показало, что ЛТИ-120 паяет хорошо, но во время пайки он обгорает, и для того, чтобы оценить качество пайки, флюс сначала надо смыть (спиртом). Это не очень удобно.

И я решил, что мне нужен флюс, который паяет не хуже, но при этом не обгорает. И по результатам вот этого обзора я решил прикупить флюс-гель «Союз-Аполлон 6-412-А».

Рис. 1

Ну и сразу для удобства использования я купил вот такой дозатор:

Рис. 2

Только что попробовал с этим флюсом паять. Паяет отлично, остаётся прозрачным. Дозатор позволяет подавать микроскопические объёмы флюса строго туда, куда нужно.

Я очень доволен.

Музыкальная археология

Пока печатные платы для моей MIDI-системы ещё не готовы, я занимаюсь восстановлением техники игры. Как археолог. Откапываю из глубин [мышечной памяти].

Сегодня я примерно 2 часа гонял короткие арпеджио с 3 ряда (фа-мажор). Хотя, конечно, я не использую такую дурацкую аппликатуру, которая написана на рис. 1. Я играю пятью пальцами, а не четырьмя.

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

И вот после примерно 2 часов занятий (я смотрел телевизор, чтобы было не скучно, и гонял арпеджио) эти самые арпеджио «от третьего ряда» внезапно стали тоже удобными. Пальцы снова стали «сами» попадать, куда надо практически без участия головы. Удивительные ощущения, которые можно испытать только после 30-летнего перерыва в игре на инструменте.

Продолжаю наблюдение.

Рис. 1

Arduino vs STM32

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

Для меня подобная точка зрения выглядит странно. Потому что Ардуино (как сами платы, так и сопутствующее окружение в виде среды программирования и библиотек) — это не более чем инструмент. Хорошо подходящий для одних задач, и совсем не подходящий для других. И лично я ценю Ардуино за крайне низкий порог вхождения в тему программирования микроконтроллеров и, как следствие, за рекордно малое время от начала разработки до получения готового продукта (как любят выражаться наши западные партнёры — «time to market»). Я сам — тому отличный пример (см. заметки по теме «MIDI баян»).

И недавно мне на глаза попалась статья «Что такое Ардуино«, а точнее раздел «Хейтеры платформы». И могу сказать, что подписываюсь под каждым словом. И желаю «профессионалам» от микроконтроллеров поумерить свой снобизм, ибо не такие уж вы на самом деле профессионалы, раз не видите очевидных достоинств и преимуществ у того, что критикуете.

Рис. 1 КДПВ

Про пайку

Я тут, в основном для тренировки, запаял контактные гребёнки на спец-макетку для ардуины-нано (см. рис. 1).

Рис. 1

И в процессе обнаружил, что паяльник мой паяет как-то «не очень». При ближайшем рассмотрении выяснилось, что хвалёное жало «с покрытием предотвращающим выгорание» всё-таки выгорает (см. рис. 2). Процессы я никакие не нарушал, жало не перегревал, агрессивными флюсами не пользовался (только ЛТИ-120). И паяю-то я очень эпизодически (буквально единицы раз в год). И тем не менее — вот.

Придётся браться за напильник.

И раз такие дела, то я уж сразу на будущее закупил по десятку вот таких жал. Шириной 2.4 и 1.6. Они медные, так что с самого начала понятно, что будут гореть. Но зато дешевые. Типа, если результат такой же, то зачем платить больше?

Рис. 2