🏠: it

Удаление рекламы на уровне сети

Обнаружил замечательный проект — Pi-hole, который служит фильтром рекламы и трекеров телеметрии. Это микросервер, который нужно на роутере указывать как DNS для клиентов DHCP, или, в случае статических адресов, указывать Pi-hole как DNS непосредственно на клиентах. Если роутер не умеет задавать DNS для динамических клиентов, то Pi-hole может взять на себя роль и DHCP-сервера.

Я сделал тестовую виртуальную машину с этим сервисом и прицепил её к роутеру как DNS, в результате на всех мобильных устройствах пропала реклама из приложений.

Ставится Pi-hole элементарно, у него есть красивый веб-интерфейс со статистикой и настройками.

Главная панель Журнал запросов

Идеальное применение для маленького дешёвого одноплатника, типа Orange Pi Zero, так как сервис нетребователен к ресурсам.

Альтернативный Youtube

Вчера узнал о существовании любопытного проекта под названием
Invidious, представляющий собой независимую реализацию веб-интерфейса к Youtube. Вот наиболее полезные функции:

  • Возможность включать только аудиодорожку (нет необходимости держать экран включённым на мобильнике)
  • Нет рекламы
  • Возможность скачивания с выбором качества
  • Для подписок не нужна учётная запись Google
  • Гибкое управление подписками, импорт и т. д.
  • Комментарии можно отключить или заменить на комментарии с Reddit
  • Тёмная тема, возможность встраивания видео и прочее.

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

Медиацентр на кухне

Собрал маленький «умный» телевизор на кухню, задачей которого, прежде всего, является показ роликов на Youtube за ужином, чтобы не использовать для этого телефон, сажая в нём батарею.

Компоненты: старый добрый одноплатник Orange Pi PC Plus, который за два года успел побывать у меня и веб-сервером, и игровой приставкой, и портативный экран, который приехал ко мне на днях с Алиэкспресса.

Критерии выбора: так как в основном я смотрю трансляции и лекции, где самым важным является звук, соответственно, я выбрал самый маленький и дешёвый экран (10.1 дюйма, 1280x800), где был разъём HDMI и встроенные динамики. Вместе с доставкой он обошёлся примерно в 4400 рублей. Одноплатник с блоком питания, картой памяти 16 ГБ и корпусом стоил два года назад 2200 рублей.

Сначала я хотел поставить на одноплатник Armbian как самую стабильную и хорошо работающую систему на подобного рода китайских микрокомпьютерах, а затем сверху установить медиацентр Kodi, но ничего не вышло, потому что собранного дистрибутива Kodi нет в репозиториях под процессоры ARM. Конечно, в интернете есть инструкции по самостоятельной сборке Kodi из исходников, но я не хотел заниматься этим долгим и муторным процессом, тем более что обновлять такую систему — тоже удовольствие на большого любителя. Популярные дистрибутивы OpenELEC и LibreELEC, которые являются уже собранной воедино системой с медиацентром, мой одноплатник не поддерживают.

К счастью, один добрый человек собирает LibreELEC для ряда китайских плат, в том числе и моей, и выкладывает обновления. Этот дистрибутив я и установил, но так как его статус нестабильный и он находится в разработке, некоторые вещи не работают — например, встроенный модуль Wi-Fi. Пришлось взять старый Wi-Fi адаптер под USB, который нормально определился в системе.

Экран оказался очень хорошим. Прочный металлический корпус, в комплекте блок питания, подставка и кабель HDMI. Сзади есть отверстия под VESA-крепление на стену, а снизу — стандартная резьба под штатив. Громкость динамиков достаточная, есть русский язык в меню, он поддерживает HDMI-CEC, то есть, управление через HDMI. Пульта к экрану нет, но я настроил в медиацентре автовыключение экрана через 5 минут, если ничего не воспроизводится, а пробуждается он, если просто в пульте управления в телефоне (я использую когда-то купленную Yatse) что-нибудь нажать или пустить на медиацентр что-то проигрываться.

Единственный нюанс — для корректной работы разрешение экрана нужно выставлять принудительно вручную. Экран определяется как 1920x1080, в том числе и в Windows, и при такой настройке видео тормозит, а звук заикается. После смены разрешения на родное 1280x800 проблемы исчезли.

Плагин Youtube я авторизовал в своей учётке Google, теперь все новые видео на каналах, на которые я подписан, я сразу вижу в списке медиацентра. Ради спортивного интереса я также настроил ТВ, взяв какой-то бесплатный плейлист в интернете, и радио через плагин SHOUTcast 2. Всё хорошо работает, очень удобно.

Рекомпрессия видеоархива

Более или менее разобравшись в доме с предметами материальными, я перешёл к более абстрактным вещам, а именно — наведению порядка в своём цифровом архиве. В нынешнем виде этот архив появился после продажи в 2010 году системного блока, в котором были DVD-приводы, и, как следствие, покупки первого сетевого хранилища, куда диски, которые уже негде было дома читать, были скопированы, по большей части, в виде образов ISO. Потом, конечно, объём данных рос, но по сути ничего не менялось — старые данные просто продолжали лежать, мигрируя с течением времени на новое железо.

В какой-то момент я решил держать на хранилище резервную копию домашнего неттопа, и выяснилось, что место уже забивается под завязку. Учитывая то, что цены на диски большого объёма сейчас довольно высокие (да и нет у меня желания устраивать у себя дома филиал Amazon Cloud им. Плюшкина), данными на хранилище я пользуюсь не очень часто и там давно не прибирались, я подумал, что неплохо было бы как-то сократить объём постоянно хранимых данных. В первую очередь следовало разобраться с видео, так как оно занимало больше всего места.

Общая идея заключалась в том, чтобы удалить что-то совсем уж ненужное и дубли одного и того же, если таковые найдутся, а остальное перекодировать в более компактные и высокоэффективные форматы H.264 и H.265, а их аудиодорожки — в aac, ogg или opus. Безусловно, перекодированное видео не должно выглядеть хуже в сравнении с оригинальным, то же касается и аудиодорожек. Для аудио нужно подбирать разумно высокий битрейт, желательно, обеспечивающий «прозрачность» (transparency), в основном это примерно 192 kb/s. Конечно, нужно действовать по ситуации — к примеру, если оригинальная аудиодорожка уже в mp3 128 kb/s, то нет смысла с ней что-то делать, нужно просто скопировать её в новый видеофайл как есть.

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

В общем случае, легко восполнимые видео кодировались в H.265 + ogg со стандартными параметрами — в основном это были мультфильмы. В принципе, львиную долю из этих файлов можно было просто стереть, но я кодировал их из спортивного интереса. Труднодоступные материалы и те фильмы, которые я не стёр — в H.265 (-crf 22 -preset slow) + aac 192 kb/s. Если видео было чересстрочным, использовался H.264 (-crf 20 -preset slow), так как он умеет корректно работать с чересстрочным сигналом — надо только не забывать правильно указывать порядок полей. Преобразование чересстрочного видео в прогрессивное путём деинтерлейса я не использую и никому не советую, так как это заметно ухудшает качество и далеко не всегда нормально отрабатывает; тем не менее, необходимо распознавать чересстрочный источник и не совершать ошибку, кодируя его как прогрессивный, так как это даст на выходе испорченное видео с «гребёнкой» при движении в кадре, которую уже невозможно убрать. Личные записи я в целом пока оставил в неизменном виде, перекодировал только некоторые короткие эпизоды, рассыпанные по нескольким файлам, которые от сборки их в единый файл только выиграли. Параметры были те же, что и для труднодоступных материалов.

Для порядка и красоты я оставлял все аудиодорожки, если их было больше одной. Отбрасывал только те, которые, при одинаковом содержании, были менее качественными (например, DTS 1,5 Mb/s и AC3 384 kb/s — перекодируем первый вариант, второй отбрасываем), и были не на русском или английском языках. В некоторых случаях я обрезал чёрные поля по краям кадра, предварительно определяя их границы фильтром cropdetect. Добавлял субтитры, вытаскивая их из исходного DVD или скачивая из интернета, причём субтитры я всегда переделывал в текстовый формат, пользуясь программой Subtitle Edit. Сохранял или добавлял метаданные: названия аудиодорожек и субитиров, навигацию по файлу (главы) с именами эпизодов. Для извлечения навигационных меток из DVD я использовал программу ChapterXtractor, в конфигурационном файле которого прописал шаблон, генерирующий формат метаданных для ffmpeg:

Preset 7=For ffmpeg metadata
Format 7=\n[CHAPTER]\nTIMEBASE=1/1000\nSTART=%ams\nEND=\ntitle=\n
Header 7=;FFMETADATA1\ntitle=\nartist=\n
Footer 7=\n[STREAM]\ntitle=

Весь процесс, включая подбор параметров, пробы и ошибки, чтение документации, поиск необходимых инструментов для работы и т. п., шёл в неторопливом темпе где-то месяца полтора. Нужно сказать, что физически я стёр немного, сокращение количества файлов и папок в основном обусловлено тем, что DVD, лежавшие россыпью файлов, отдельно валяющиеся аудиодорожки и субтитры были преобразованы в один итоговый файл. Вот результаты.

Было:

Имя подкаталога Размер Файлы Папки
Концерты 181,1 ГБ 204 30
Мультфильмы 153,5 ГБ 717 43
Документальные фильмы 126,9 ГБ 189 27
Записи 87,1 ГБ 33 5
Художественные фильмы 55,2 ГБ 48 5
Детские фильмы 41,3 ГБ 39 3
Образование 30,4 ГБ 1250 59
Прочее 67,9 МБ 13 1
Всего: 675,7 ГБ 2493 181

Стало:

Имя подкаталога Размер Файлы Папки
Документальные фильмы 81,0 ГБ 177 23
Концерты 69,1 ГБ 106 9
Записи 54,8 ГБ 24 4
Мультфильмы 46,2 ГБ 707 38
Образование 27,8 ГБ 1250 59
Детские фильмы 15,6 ГБ 39 3
Художественные фильмы 9,7 ГБ 37 3
Прочее 67,9 МБ 13 1
Всего: 304,2 ГБ 2353 148

График использования дискового пространства на хранилище:

В итоге, без какой-либо потери функциональности и удобства пользования (в ряде случаев эти критерии даже повысились) и визуального качества видеоматериалов я выиграл 370 гигабайт свободного места, и это только на одном каталоге, пусть и самом крупном. По-моему, неплохо.

Собрал часы

Когда-то давно мой отец сделал настольные часы из каких-то останков «Электроники», которые работали без корпуса и выглядели примерно так:

Изображение без описания
Фото из Музея советской электроники

Заметная часть моего детства прошла среди развороченных телевизоров, магнитофонов и прочей техники, я играл с радиодетальками, поэтому вид электронных внутренностей был привычен, не вызывал никаких негативных эмоций, и работающие часы без корпуса смотрелись гораздо интереснее, чем в корпусе. А ещё они отлично светились ночью, озаряя комнату магически-зелёным светом своего ваккумно-люминесцентного индикатора.

Не то чтобы мне хотелось иметь дополнительный источник светового загрязнения у себя дома, но частенько, просыпаясь ночью, хотелось бы знать, который час. Сейчас для этого я вынужден включать экран телефона, который очень неприятно бьёт светом в глаза, или вставать с кровати и нажимать кнопку «стационарного» (на самом деле SIP) телефона, который тоже показывает правильное время.

Собственно, набор требований к часам такой:

  • Светятся в темноте, но неярко;
  • Дешёвые;
  • Сами синхронизируют время, т. е., не требуют ручной подводки;
  • Питание от сети, никаких батареек.

Начал поиски готовых вариантов. Удивительно, но под такие, казалось бы, простые требования найти готовые недорогие часы я так и не смог. Часы, в которых есть wi-fi или которые умеют получать время по GPS, есть, но стоят они каких-то неприличных денег и называются «умными», т. е., обладают большим количеством никому не нужных функций. Оказалось, что часы с автосинхронизацией как отдельный прибор, а не как встроенный функционал чего-то большего — это редкость и, судя по ценникам, роскошь.

Во время поиска подходящего варианта узнал от коллеги, что есть так называемые часы с радиоконтролем, а именно — умеющие синронизировать время по протоколу DCF77, но стоят они тоже недёшево, к тому же, передатчик расположен в Германии, и Москва находится фактически на самом краю области приёма сигнала. Я прочёл на форумах, что синхронизация таких часов здесь — это вопрос везения, в основном она проходит ночью, когда меньше радиопомех, а ещё желательно жить повыше и иметь окна, обращённые на запад. Так как окна у меня обращены на юг, живу я за пределами Москвы, да ещё и на востоке, и высотой этажа похвастаться не могу, поэтому я оставил эту идею. Интересно, что и в России есть много служб точного времени — RWM, RBU, RTZ, но часов, способных использовать эти службы, я в продаже не обнаружил.

Остался единственный вариант — сделать часы самому. Идея заключается в том, что нужно найти какой-то микрокомпьютер, который умеет подключаться к интернету по wi-fi, по протоколу NTP получать оттуда точное время и показывать его на подключаемом экранчике, отсчитывая секунды самостоятельно до следующего сеанса синхронизации. Так как вычислительной мощности от этого микрокомпьютера не требуется, поэтому такой вариант, как Raspberry Pi, отпадает: здесь нужно что-то более миниатюрное и дешёвое.

Экран должен быть маленьким — всё-таки, я не на вокзал часы делаю. Мне очень нравятся часы на газоразрядных лампах (nixie tubes), которые смотрятся просто великолепно:

Но для моих познаний в электронике собрать такое слишком сложно, к тому же, эти лампы ярко светят и кушают относительно много электричества, да и корпус для такого великолепия нужно делать посерьёзнее, и блок питания нужен какой-то особый, то есть, задача сильно усложняется. Я обнаружил проект часов в интернете, которые мне подошли бы (Nixie Tap), но этот проект уже давно находится в подвешенном состоянии и неизвестно, будет ли он реализован вообще.

В результате, нашёл ровно то, что мне было нужно, на сайте arduinolab.pw, заказал железки, которые там рекомендуют, на AliExpress:

  1. Сам микрокомпьютер: LoLin NodeMcu V3 WIFI IoT development board based on ESP8266 — в районе 200 руб.
  2. Светодиодный дисплей: RobotDyn 4-Digit LED Display Tube, 7-segments, TM1637, 30x14 mm — примерно 100 руб.

Вид готовых часов без корпуса

Питается это хозяйство от стандартного зарядного устройства для телефона с проводом USB-microUSB. Я хотел собрать вариант 2.0, который с часами реального времени, и заказал их тоже, но впоследствии с ними у меня не заработало, к тому же оказалось, что микрокомпьютер прекрасно и сам справляется со счётом секунд. Код я взял на сайте Стива Кемпа, немного изменив его параметры. В частности, там часы синхронизируются с интернет-серверами каждые 5 минут, что безумно часто и так в принципе нехорошо делать, да и ни к чему.

В Правилах предоставления сервиса кластера серверов точного времени pool.ntp.org не рекомендуется синхронизация чаще, чем раз в полчаса, и вообще — чем реже, тем лучше. Я поставил 36 часов (129600 секунд), как там советуют делать, и за этот интервал вообще не заметно, чтобы часы отклонялись от эталонного времени — точность хода прекрасная. В коде также реализована возможность обновлять встроенную программу прямо через wi-fi (ArduinoOTA), но мне так и не удалось её задействовать — может быть, код устарел, да и в данном случае эта функция не очень нужна, в принципе. Прочие технические подробности можно прочитать в моём Карманном справочнике.

В итоге, я получил точнейшие и дешёвые часы, на которых нет ни одной кнопки. Всё, что им нужно — это питание и доступ к интернету через wi-fi. В качестве корпуса я использовал упаковку от велосипедного ремкомплекта, который я отмыл от наклеек и прорезал в нём необходимые отверстия канцелярским ножом.

Часы в сборе

А дисплей я выбрал зелёный, потому что, во-первых, зелёные светодиоды не такие яркие, как белые или синие, тем более, что яркость в настройках выставлена ниже средних значений, а во-вторых, это отдалённо напоминает те самые часы из моего детства.