Сегодня утром я выглянул в окно и понял, что велосезон закончен: всё было покрыто снегом. Помню, в 2017 году я пытался не заканчивать сезона и ездить круглый год, но я быстро отказался от этой идеи, даже несмотря на то, что я купил себе отличные шипованные покрышки, на которых можно было спокойно ездить по голому льду — по рыхлому снегу передвигаться очень тяжело, особенно на велосипеде с маленькими 20-дюймовыми колёсами, а в наших условиях зимы с идеально расчищенными дорогами не бывает. Так что теперь я заканчиваю сезон, как только выпадает снег.
Этот год выдался рекордным по пробегу — я проехал более 4500 км. Была очень хорошая погода, особенно в сентябре, который был фактически четвёртым месяцем лета. Наверное, можно было бы достичь и отметки в 5000, но октябрь был дождливым и перед последней поездкой 25 октября я пропустил целых две недели.
Приведу статистику пробега по годам с момента покупки велосипеда:
Год
Пройдено км
2016
2809
2017
3720
2018
3973
2019
3456
2020
4237
2021
3076
2022
3943
2023
4542
Сейчас на счётчике 29756 км, до 30000 не доехал всего-то 250 км, но теперь уж в следующем сезоне.
Дано: Orange Pi PC Plus с установленным LibreELEC 11, которым хотелось бы управлять с помощью пульта. Инфракрасный приёмник у Orange Pi имеется, поэтому нужно просто научить систему понимать с этого пульта сигналы.
Прежде всего нужно купить какой-нибудь пульт или взять уже имеющийся, у которого есть кнопки стрелок, старт/пауза, стоп, ОК и тому подобные, чтобы можно было нормально управлять медиацентром. Я купил пульт для телевизора Supra RS41-MOUSE за 200 рублей.
Заходим по SSH в систему. В инструкции по настройке пультов сначала рекомендуют подбирать совместимые конфигурации из списка по пути /usr/lib/udev/rc_keymaps, но их там полторы сотни и нет ничего похожего по названию, так что я не стал возиться, а сразу перешёл к созданию собственной конфигурации, описанному в разделе Advanced.
Выводим список поддерживаемых протоколов управления (supported kernel protocols):
Нужно подобрать протокол, с которым совместим пульт. В моём случае подошёл nec, после включения которого в консоли начали отображаться коды кнопок при их нажатии на пульте:
Отлично, теперь нужно нарисовать карту кнопок (keymap), где прописывается протокол пульта и соответствие кодов кнопок с их функциями. Список функций можно посмотреть с помощью команды irrecord -l | grep ^KEY или в секции <remote device="devinput"> файла /usr/share/kodi/system/Lircmap.xml.
В итоге у меня получилась конфигурация, приведённая ниже. Закомментированы кнопки, к которым я не нашёл близкой функции, а кнопка POWER была чуть позже изменена на ENTER, потому что одноплатник выключался, но включить его потом с пульта было нельзя.
Теперь надо создать файл с нашей картой кнопок и запустить его:
OrangePiPCPlus:~ # nano /storage/.config/rc_keymaps/supra_rs41
OrangePiPCPlus:~ # ir-keytable -c -w /storage/.config/rc_keymaps/supra_rs41
Read supra_rs41 table
Old keytable cleared
Wrote 39 keycode(s) to driver
Protocols changed to nec
Пульт сразу же начинает работать. Осталось добавить эту конфигурацию в автозагрузку:
Некоторое время назад, зайдя в админку Вордпресса, на котором работал этот блог, я обнаружил в разделе рекомендаций, что производительность оценивается как довольно низкая, сайт отвечает на запросы с задержкой и неплохо бы добавить ещё механизм кэширования объектов на базе Redis.
Честно говоря, Wordpress с течением времени нравился мне всё меньше. Он превратился в какую-то оболочку для плагинов, из которых многие имеют платную версию; в бесплатной же функционал урезан и она постоянно напоминает плашками в админке о том, что хорошо бы купить платную. Сам Вордпресс постоянно обрастает бирюльками вроде вышеупомянутых «рекомендаций о здоровье сайта».
Редактор «Гутенберг», появившийся в 5-й версии Вордпресса, был очень удобен, но каждый раз он показывал окно «Добро пожаловать в редактор блоков!», которое должно было появиться только единожды при первом запуске. В интернете есть статьи по решению этой проблемы, но попробовав один метод, который не сработал, я оставил эти попытки. Не хотелось что-либо поломать, а пишу в блог я не так часто.
Для резервного копирования Вордпресса опять же нужен плагин, потому что можно, конечно, бэкапить его обычным способом как файлы веб-каталога и дамп базы, но потом, если нужно будет восстановить это где-то на другом сервере под другим адресом, то сделать это будет очень непросто — Вордпресс прописывает адрес сайта прямо в базе данных в очень многих местах и необходимо править эту базу, чтобы заставить сайт работать в другом расположении.
Теперь, значит, рекомендуется поставить Redis, чтобы ускорить работу. Ладно. Помимо контейнера с Redis опять-таки ставится очередной плагин, причём настраивать его приходится из консоли, редактируя wp-config.php.
После настройки я запустил Wordpress и получил неработающий сайт, который не поднялся даже после удаления изменений, внесённых в конфигурацию. Восстановить работоспособность удалось только удалив все плагины, но из-за этого поехала вёрстка, в частности, блоки кода начали выглядеть искажённо даже после установки плагина подсветки заново.
После этого мне надоело и я решил перейти на другую CMS, желательно без базы данных, как DokuWiki. От движка нужна поддержка:
Галерей картинок;
Аудио-плейлистов (в Вордпрессе они были, но их убрали);
Подсветки синтаксиса;
Видео (Youtube и локальных файлов);
По возможности, RSS и типографики.
Перебрав около десятка статических CMS (Grav, HTMLy, Pico и т. п.), я остановился на Datenstrom Yellow, для работы которого требуется только веб-сервер и PHP с минимумом дополнительных модулей (php-curl, php-gd, php-mbstring, php-zip). Для сравнения, в PHP Вордпресса было больше 20 модулей. Записи в блоге делаются в формате Markdown, можно использовать и HTML-код. Переезжал я с помощью wordpress-export-to-markdown, который сконвертировал XML-экспорт из Вордпресса в файлы Markdown и скачал картинки; последующая доработка делалась с помощью Powershell и вручную.
Мелкие недостатки есть:
В Вордпрессе можно было указать у галереи, сколько будет картинок в ряду, здесь указывается точный размер превью.
Не очень удобный способ заполнения альтернативного текста для картинок в галереях.
Видео (локальное или ссылка) не адаптируется к размеру колонки.
Не самый удобный способ написания постов, но это для регулярно имеющего дело с кодом и командной строкой человека не проблема.
Итог: блог хорошо и быстро работает, всё, что нужно, имеется, резервные копии делать удобно, т. к. весь сайт — это просто набор статических файлов, потребление ресурсов абсолютно минимально. Движемся дальше.
Мой сайт уже без малого 2 года крутится на неттопе с установленной Ubuntu 20.04 LTS. С некоторых пор неттоп начал испытывать проблемы при загрузке: например, ставишь обновления, перезагружаешь систему — и она уже не возвращается. Подключаешь монитор, чтобы посмотреть, в чём дело — и система загружается нормально. Какой-то бред, как будто железка издевается над тобой.
Я проверял настройки BIOS несколько раз, проверял блок питания на предмет нехватки мощности (хотя как в этом случае помогло бы подключение монитора?) — никаких проблем не обнаружил. Думал даже о покупке нового неттопа. Сегодня, когда в очередной раз, используя непарламентские выражения, я подключал монитор, чтобы загрузить железку после очередного невозврата из перезагрузки, решил поискать в интернете, мало ли, у кого-то такая же дурацкая проблема?
И нашёл! Оказалось, дело в настройках загрузчика GRUB. Нужно выключить у него графический режим и потом применить настройку:
sudo sed -i '/GRUB_TERMINAL=/c GRUB_TERMINAL=console' /etc/default/grub
sudo update-grub
Теперь перезагружается без проблем. И покупать ничего не потребовалось.
Обнаружил сайт demodb.org, где можно послушать демки со старых синтезаторов, меня интересовала Yamaha W7.
Сайт этот скачать аудиофайлы не даёт: при попытке открыть консоль разработчика в браузере закрывает свою вкладку или переадресует на другой сайт, а если всё-таки через плагин браузера выцепляешь прямой путь к аудиофайлу, то скачивается заглушка, где говорится, что по прямым ссылкам качать нельзя.
Оставался единственный вариант — запись на локальном компьютере. Я взял аудиоредактор Wavosaur, отрегулировал входной сигнал, выключил микрофон веб-камеры, чтобы он не фонил, записал все нужные мне треки, нормализовал всё до 0 дБ. Получилось следующая картина:
Теперь нужно было порезать получившуюся запись на части. Конечно, мне сразу же захотелось это автоматизировать. Очевидно, разделителями являются периоды тишины, и после недолгого поиска я обнаружил, что в великом и могучем ffmpeg обнаружением тишины в аудиосигнале занимается фильтр silencedetect.
Экспериментальным способом выяснилось, что подходящим порогом срабатывания является -50 дБ, и silencedetect выдаёт такое:
Полезный сигнал начинается с silence_end, а заканчивается на silence_start, поэтому нужно выбросить первый silence_start и последний silence_end, итого 5 треков. Перед началом трека делается отступ в 0,25 сек, а в конце добавляется 1 сек, чтобы треки в списке не игрались attacca и между ними была какая-то пауза. В ffmpeg указывается не конечное время, а длительность нужного куска, поэтому нужно для этого из конечного времени вычесть начальное.
Иногда, например, у альбомов на Youtube, звук начинается сразу и первая метка silence_end оказывается уже на втором треке, поэтому нужно предусмотреть такие ситуации. Здесь я предположил, что если метка позже 30-й секунды, то вставлять в начало списка silence_end ноль и не удалять первый silence_start, т. к. нужно знать, где первая дорожка кончается. Соответственно, команда ffmpeg будет без указания стартовой позиции.
# Исходный файл$file = 'D:\Музыка\Yamaha W7 demos.wav'# Отступ до и после полезного сигнала (чтобы треки не начинались сразу один за другим)$preSec = 0.25$postSec = 1# Формат файлов на выходе$outputExt = ".mp3"$file = get-item-literalpath$file$log = (& ffmpeg -i$file.FullName -af silencedetect=n=-50dB:d=1-f null - 2>&1) -match'^\[silencedetect'$starts,$ends = $log.where({$_-match'silence_end'}, 'Split')
[regex]$replOut = '.*?: (\d+\.\d+).*'$starts = $starts-replace$replOut,'$1' |select -SkipLast1$ends = $ends-replace$replOut,'$1'# Если в начале тишины нет (первое начало позднее 30-й секунды)if ([double]$starts[0] -gt30) {
$starts = ,"0" + $starts
}
else {
$ends = $ends |select -Skip1
}
$c = 0$starts |% {
if ($_-eq0) {
& ffmpeg -y-hide_banner `
-t ([double]$ends[$c] + $postSec) `
-i$file.FullName `
($file.DirectoryName + "\" + ($c+1).tostring("00") + " $($file.BaseName)" + $outputExt)
}
else {
& ffmpeg -y-hide_banner `
-ss ([double]$starts[$c] - $preSec) `
-t ([double]$ends[$c] - [double]$starts[$c] + $postSec) `
-i$file.FullName `
($file.DirectoryName + "\" + ($c+1).tostring("00") + " $($file.BaseName)" + $outputExt)
}
$c++
}
Получается просто отлично — больше ничего делать не потребовалось. Чуть позже я нашёл запись этих же демонстраций на Youtube, и скрипт так же хорошо работает и на ней.
Надо сказать, что тех демонстраций, которые я выкладывал, когда рассказывал о своей неудачной карьере аранжировщика, я нигде не нашёл; видимо, они были на какой-то дополнительно приобретаемой дискете и их никто не записал. Зато нашёл другие, которые я тоже вспомнил, и они великолепны, а Isn’t it hip и Halftime просто, я бы сказал, исключительны. Структура композиций, динамика, гармонизация, подголоски, выбор тембров и их обработка — всё на высшем уровне.