Компьютер грузится только с подключенным монитором

Мой сайт уже без малого 2 года крутится на неттопе с установленной Ubuntu 20.04 LTS. С некоторых пор неттоп начал испытывать проблемы при загрузке: например, ставишь обновления, перезагружаешь систему — и она уже не возвращается. Подключаешь монитор, чтобы посмотреть, в чём дело — и система загружается нормально. Какой-то бред, как будто железка издевается над тобой.

Я проверял настройки BIOS несколько раз, проверял блок питания на предмет нехватки мощности (хотя как в этом случае помогло бы подключение монитора?) — никаких проблем не обнаружил. Думал даже о покупке нового неттопа. Сегодня, когда в очередной раз, используя непарламентские выражения, я подключал монитор, чтобы загрузить железку после очередного невозврата из перезагрузки, решил поискать в интернете, мало ли, у кого-то такая же дурацкая проблема?

И нашёл! Оказалось, дело в настройках загрузчика GRUB. Нужно выключить у него графический режим и потом применить настройку:

sudo sed -i '/GRUB_TERMINAL=/c GRUB_TERMINAL=console' /etc/default/grub
sudo update-grub

Теперь перезагружается без проблем. И покупать ничего не потребовалось.

Демонстрации Yamaha W7 и автоматическое деление аудиофайла на части

Обнаружил сайт demodb.org, где можно послушать демки со старых синтезаторов, меня интересовала Yamaha W7.

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

Оставался единственный вариант — запись на локальном компьютере. Я взял аудиоредактор Wavosaur, отрегулировал входной сигнал, выключил микрофон веб-камеры, чтобы он не фонил, записал все нужные мне треки, нормализовал всё до 0 дБ. Получилось следующая картина:

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

Экспериментальным способом выяснилось, что подходящим порогом срабатывания является -50 дБ, и silencedetect выдаёт такое:

[silencedetect @ 0000025b206a7740] silence_start: 0
[silencedetect @ 0000025b206a7740] silence_end: 4.11882 | silence_duration: 4.11882
[silencedetect @ 0000025b206a7740] silence_start: 213.267
[silencedetect @ 0000025b206a7740] silence_end: 218.22 | silence_duration: 4.95304
[silencedetect @ 0000025b206a7740] silence_start: 342.852
[silencedetect @ 0000025b206a7740] silence_end: 354.239 | silence_duration: 11.387
[silencedetect @ 0000025b206a7740] silence_start: 530.661
[silencedetect @ 0000025b206a7740] silence_end: 540.122 | silence_duration: 9.4607
[silencedetect @ 0000025b206a7740] silence_start: 670.007
[silencedetect @ 0000025b206a7740] silence_end: 680.196 | silence_duration: 10.1893
[silencedetect @ 0000025b206a7740] silence_start: 853.138
[silencedetect @ 0000025b206a7740] silence_end: 867.126 | silence_duration: 13.9884

Полезный сигнал начинается с 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 -SkipLast 1
$ends = $ends -replace $replOut,'$1'
# Если в начале тишины нет (первое начало позднее 30-й секунды)
if ([double]$starts[0] -gt 30) {
    $starts = ,"0" + $starts
}
else {
    $ends = $ends |select -Skip 1
}

$c = 0
$starts |% {
    if ($_ -eq 0) {
        & 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 просто, я бы сказал, исключительны. Структура композиций, динамика, гармонизация, подголоски, выбор тембров и их обработка — всё на высшем уровне.

Yamaha - Isn’t It Hip (Yamaha W5/W7 demo, 1994)

Неделя велопоездок на работу в цифрах

С погодой повезло и получилось ездить на работу всю неделю без пропусков.

Время - 16 часов Пройденное расстояние Средняя скорость Максимальная скорость Расход калорий Сокращено выбросов CO2 (кг)

Upd: а вот ещё одна неделя в конце августа. В принципе, то же самое. Различие в километраже связано не с неточностью счётчика, а с тем, что я один или два раза проезжал одну остановку на трамвае.

Время - 15 ч 56 мин Пройденное расстояние Средняя скорость Максимальная скорость Расход калорий Сокращено выбросов CO2 (кг)

Пять лет

Время идёт. Сегодня ровно пять лет в автономном режиме.

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

Позавтракал, и пока пил кофе, начал читать главу Deploying distributed applications as stacks in Docker Swarm в книжке Docker in a month of lunches, которую я пару лет назад бросил на половине, но теперь решил дочитать до конца. Надеюсь, получится.

Выполнение практического примера из книжки

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

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

Ходил по своему обычному (синему) маршруту 13800 шагов за 2 ч 7 мин, с магазином всего получилось 15300. Погода хорошая, +17°, светит солнышко, птицы поют кто во что горазд, деревья зазеленели. Если бы… ладно. Придя домой, принял душ, поужинал и вымыл плиту, на которой было подгоревшее пятно от картофельной воды, образовавшееся сразу после предыдущей мойки. По всем признакам, завтра опять наляпаю. Пусть.

Сегодня был хороший день.

Баллада повешенных

Ты жив, прохожий. Погляди на нас.
Тебя мы ждём не первую неделю.
Гляди — мы выставлены напоказ.
Нас было пятеро. Мы жить хотели.
И нас повесили. Мы почернели.
Мы жили, как и ты. Нас больше нет.
Не вздумай осуждать — безумны люди.
Мы ничего не возразим в ответ.
Взглянул и помолись, а бог рассудит.

Дожди нас били, ветер тряс и тряс,
Нас солнце жгло, белили нас метели.
Летали вороны — у нас нет глаз.
Мы не посмотрим. Мы бы посмотрели.
Ты посмотри — от глаз остались щели.
Развеет ветер нас. Исчезнет след.
Ты осторожней нас живи. Пусть будет
Твой путь другим. Но помни наш совет:
Взглянул и помолись, а бог рассудит.

Господь простит — мы знали много бед.
А ты запомни — слишком много судей.
Ты можешь жить — перед тобою свет,
Взглянул и помолись, а бог рассудит.

Франсуа Вийон (перевод И. Эренбурга)