О винилофильстве и плёнколожстве

Откуда в цифровом звуке берётся шум? Он берётся из не вполне точного представления аналогового сигнала, так как для того, чтобы описать синусоиду, у нас имеется конечное количество координат по оси Y. В случае с компакт-дисками это 65536 возможных значений, так как у нас есть 16 бит — 15 бит на описание уровня плюс один бит на знак. 8-битные звуковые файлы, кстати, беззнаковые (во бардак!) Ось Х проблемы не представляет, в полном соответствии с теоремой Найквиста-Шеннона-Котельникова

Зависимость в децибелах отношения сигнал/шум от того, каким количеством уровней описывается сигнал, линейная, и рассчитывается как 20log10(2количество бит), или примерно 6.02 × количество бит.

Стойкие апологеты аналоговых носителей напирают на то, что, мол на цифровом носителе всего 65536 уровней, а на нашем-то тёплом ламповом виниле (или на магнитной плёнке) количество уровней аналоговое, т.е. неограниченное!!! Ага, ага. А вот хрен вам. С аналогового носителя точно так же можно достать конечное количество уровней сигнала, и для хорошего “дореволюционного” винила это число составляет примерно 2000 или 11 бит. Это даст предельное отношение сигнал/шум в районе 70 дБ — что, вообще-то, не так уж плохо. Это заметно лучше MP3-шек, например =))) Только винил надо хорошенько помыть-почистить, чтобы не было слышно пыли — она сильно портит впечатление.

В случае с плёнкой уже надо говорить более предметно — тут смотря какая плёнка. Наилучшее качество в домашних условиях давали катушечные магнитофоны — с них можно было тоже достать примерно 11 бит. Кассеты, когда только появились, были полное и окончательное говно, и давали где-то 6-битный звук. Этого было вполне достаточно для применения в диктофонах (для коих, их, собственно, и разработали), но недостаточно для качественного воспроизведения музыки. Тем не менее, их растущая популярность и сопутствующие постоянные улучшения в области электроники привели к тому, что постепенно они вышли на уровень катушечных магнитофонов, а с введением технологий типа Dolby и прочих улучшайзеров, даже немного превзошли их (катушечные магнитофоны к этому времени уже, ясен пень, никто не улучшал). Но — это при наличии хорошей кассетной деки, качественной студийной компакт-кассеты, и т.д. А восхищаться аналоговым носителем МК-60, сунутым в Электронику-302 можно разве что после третьей бутылки.

Что имеем с гуся? С гуся имеем то, что аналоговый носитель тоже, по сути, цифровой — количество вытаскиваемой с него информации конечно. Это для любого носителя справедливо — даже для 35mm фотографической плёнки. С неё — в идеале — можно достать 10 мегапикселей. Повторюсь — в идеале. Со снимков на советскую ч/б плёнку середины 1960х годов я вытягивал примерно 1 мегапиксель, не более.

Дорисовал

Таки доделал програмку на Питоне, рисующую спектр сигнала и автоматически считающую КНИ+шум и ОСШ. Попутно узнал, как водится, много нового. За что люблю Питон — так это за то, что программа занимает менее 40 строк. На тех же Сях я бы усрался это рисовать. Даже на Шарпах бы усрался.

Программе скармливается звуковой файл с сигналом частотой в 1 kHz, сгенерированный программой Adobe Audition (в девичестве Syntrillium CoolEdit). Но можно взять и бесплатный Audacity, результат будет точно такой же. Программа читает файл, берёт значение с наибольшим пиком и даёт ему обозначение в 0 децибел. Остальное, соответственно, отрицательные величины. Подсчитывается среднеквадратичное значение всего, что не сигнал, и делится на уровень сигнала. Получается КНИ+шум (THD+N). Потом считаем ОСШ (отношение сигнал/шум, SNR) в децибелах: 20log10(сигнал / шум)

Вот так выглядит анализ звукового файла с сигналом 1 kHz, разрешением 16-бит, частота дискретизации — 48 kHz:

Это весьма близко к теоретическому идеалу — в идеале, разрешение 16 бит может дать ОСШ в 96.3 dB. Но у меня не идеал, так как я использую чуть менее, чем 16 бит — ибо если генерировать синусоиду с уровнем в 0 dB (т.е. по-максимуму), то почему-то уже лезут нелинейные искажения. Так что я создаю её с уровнем в -0.1 dB, минимальным отступлением от максимума, которое мне даёт делать Audition. В любом случае, 94 dB — это дохрена.

КНИ в 2 тысячных процента это тоже прекрасно. Без приборов этого никто никогда не увидит, искажения начинают быть слышимыми, когда уже вплотную приближаются к 1%, хотя это сильно зависит от того, что именно слушаем: если чистые синусоиды, то искажения начинают быть заметными гораздо раньше, а если в качестве тестового материала брать альбомы фифтисентов и прочих, то там можно и 10% искажений не услышать. Что не означает, что аппаратура, дающая КНИ в 0.05%, ничем не лучше аппаратуры, дающей 0.1% — она лучше; просто в реальности ушами этого ни один живой человек не услышит.

А теперь — снова пнём формат MP3 🙂 Никто как-то вот не задумывается о том, что они слушают в тысячедолларовых деревянных наушниках, подключённых к внешним усилителям класса А за семьсот долларов, обещающим КНИ в 0.00045%

А между тем это реалии MP3 с битрейтом в 192 килобита/сек:

А это — 320 килобит/сек:

Получше, конечно, чем 192 kbps, но всё равно проседание качества очень налицо — происходит серьёзное ужимание динамического диапазона (я в курсе, что ДД и ОСШ это не вполне одно и то же, но они связаны). На некотором материале (например, классическая музыка, обладающая большим динамическим диапазоном) это может быть очень заметно. На 192 килобитах так это точно заметно, тихая партия скрипки сопровождается скрежетом артефактов сжатия с потерями — собственноушно, так сказать, слышал. Дальнейшее увеличение битрейта после 320 килобит/с, кстати, уже ничего не даёт — ОСШ так и остаётся в районе 55 децибел.

Ещё надо будет попинать винилофильство и прочее плёнколожество, но это в другой раз 🙂

Изящное решение

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

Например, вот такая формула (сишный синтаксис): x = (x * 17) % 11

Начиная с x = любое натуральное число, она будет выдавать псевдослучайные натуральные числа от 1 до 10. Но последовательность будет всегда одной и той же — на выходе видим 8, значит, следующим числом будет 4. Конечно, настоящие формулы для генерации псевдослучайных чисел намного более сложны (например, хеширование SHA256) и очень хорошо апроксимируют случайное распределение, но всё равно рано или поздно даже они начинают зацикливаться.

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

Например, очень популярен сбор случайности от действий человека. Так, можно считать количество тактов процессора между нажатиями кнопок на клавиатуре. Даже самая дисциплинированная машинистка не сможет повторить их один-в-один. Примерно так и работает сбор энтропии во Фрюниксах — /dev/random считает такты процессора между прерываниями.

У этого подхода тоже есть проблемы. У незанятого сервера, где мало взаимодействий, генерирующих прерывания, проблема сбора энтропии стоит довольно остро. Я даже более скажу — возможна атака, которая будет подсовывать этому серверу какую нужно “случайность”, и на этой основе ломать алгоритм шифрования. Примерно так работал недавний KRACK для беспроводных сетей — где крякер заставлял сеть переиспользовать значение, которое должно быть одноразовым.

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

Но есть и не такие радикальные способы. Так, компания Cloudflare, занимающаяся предоставлением услуг инфобезопасности, придумала интересную методику с применением лавовых ламп.

Картинка из статьи на ZDNet.

Перемещения расплавленного парафина в масле являются случайными. Cloudflare построили стену с матрицей из 100 лавовых ламп. Эта матрица постоянно фотографируется, и из фотографий вычисляется хеш — который и является источником энтропии. Таким образом достигается прекрасная криптостойкость алгоритмов, которые Cloudflare использует для шифрования траффика между своими распределёнными серверами.

Чорт возьми, изящно!

Шутка дня

Показываю племяннику 3.5-дюймовую дискету.

Реакция племянника:

–Ух, круто! Ты напечатал на 3D принтере кнопку сохранения!

А в самом деле, если подумать, то дискета на кнопке говорит о записи данных только старпёрам вроде нас.

Богат октябрь на баги….

Раз:

Всем, использующим беспроводные сети с шифрованием WPA2, можно начинать бояться. Существует кибератака, позволяющая расшифровать и спуфить передаваемые данные через повторное использование одноразового кода (nonce):

https://www.krackattacks.com/

При этом, что характерно, пароль WPA2 узнать по-прежнему невозможно.

Два:

Все криптографические сопроцессоры Infineon генерируют плохо защищённые ключи несимметричного шифрования RSA:

http://www.tomshardware.com/news/infineon-tpm-insecure-rsa-keys,35668.html

Если у вас есть ноутбук Lenovo, HP, Fujitsu, Asus и вы используете криптографический сопроцессор — можете начинать бояться.

Давненько таких крутых багов не было…

Русские рубят русских

Как показало вскрытие, в 2015 году российские хакеры украли секретные документы АНБ США, взломав российский же антивирус Касперского:

https://www.forbes.com/sites/leemathews/2017/10/05/guess-which-software-russian-hackers-targeted-to-steal-nsa-secrets/#5295f671170c

Улыбнуло.

Разумеется, сама контора Касперского к этому никакого отношения не имела, и никому не помогала. Конечно-конечно.

Юникс Кунг-Фу

За что мы любим Юниксоподобные ОС? Ну, за всякое, но не в последнюю очередь за их отличные командные строки. Конечно, можно писать скрипты или даже небольшие програмки на Перле али Питоне, но если надо быстро что-то автоматизировать, то лучше всего писать какой-нибудь one-liner типа:

cat file | grep something | sed ‘s/thing/otherthing/’ | awk -F “|” ‘{print $1}’ | sort | uniq | wc -l

И всё тут прекрасно, но здесь совершенно отсутствует условное ветвление — а это иногда полезно.

Например, можно сказать вот так:

cd directory; rm -rf *

Что будет, если cd directory обломится, потому что этой директории нет? Начнёт выполняться rm -rf в ТЕКУЩЕЙ директории — что может иметь катастрофические последствия.

Как этого избежать? Очень просто. Надо сказать вот так:

cd directory && rm -rf *

В данном случае rm -rf выполнится ТОЛЬКО если cd directory будет успешно выполнен.

Работает это очень просто — если понять, что данное выражение представляет собой не больше, чем условие с Сишным синтаксисом. && — это оператор AND. Любая команда при завершении работы выдаёт код возврата (exit status). Если команда завершилась успешно, возвращается код 0, он же является TRUE. Оператор && подразумевает что ОБЕ части условия должны возвращать TRUE, поэтому если первое условие вернуло TRUE, надо проверять второе. Если же первое вернуло FALSE, то нет смысла проверять второе (принцип минимализации проверки условий https://en.wikipedia.org/wiki/Short-circuit_evaluation).

Соответственно, можно вывернуть это наизнанку, если использовать оператор || (сиречь OR) между командами. В таком случае вторая часть выражения будет выполнена только в том случае, если первая вернёт FALSE — ибо в соответствии с принципом минимализации нет смысла проверять вторую часть условия, где условия объеденины через OR — ибо первая уже вернула TRUE.

Например, вот так:

cd test|| mkdir test

Директория test будет создана только в том случае, если её нет (cd вернёт ошибку).

Также можно объединять условия, используя тот же Сишный синтаксис.

(cd directory && rm -rf *) || echo “Cannot delete files”

Если можно зайти в директорию и удалить там файлы, то ничего не высветится. Но если нельзя, будет сказано, что нельзя.

Данные команды работают в bash и C-shell. BSD-шный sh не проверял, но думаю, что там тоже будет работать.

Ответка

В ответ на бан антивируса Касперского на компьютерах, принадлежащих МО США (https://experimenter.org/2017/06/29/kaspersky_banned_in_dod/) российские законодатели предложили послать всё нероссийское антивирусное ПО в том же направлении?

“Ко второму кварталу 2019 года чиновники намерены законодательно обеспечить предустановку отечественных антивирусных программ на все персональные компьютеры, ввозимые и создаваемые на территории Евразийского экономического союза.”

Подробнее на РБК:
http://www.rbc.ru/technology_and_media/03/07/2017/5958d9c29a7947e1a748af1a

Не вполне понятно, чем всё это закончится. “Обеспечить предустановку” не значит ведь запрета пользованием других антивирусов?

А то как-то слишком нагло получается. “Слушайте свои “Валенки” и не выпендривайтесь”. И плевать, что антивирь Касперского написан настолько криво, что раз в два дня аккуратнейшим образом вешал мне комп так, что тремя пальцами он не поднимался. Что там ещё есть? Дохтур Веб? Ничего про него не скажу — не пользовался.

Или это просто в Касперском занесли куда надо? Чтобы обеспечить продажи своего кривого продукта?

И вообще, это какие-то полумеры. Виндоуз-то не забанили. Как не забанили Ворд, Эксель, и проч.

Касперского забанили в США

В акт о военном бюджете США на 2018 год внесен запрет на использование продукции “Лаборатории Касперского” на оборудовании, принадлежащему МО США. Озвученная причина — “работники компании потенциально подвержены давлению со стороны правительства России”.

https://www.bleepingcomputer.com/news/government/senate-gets-ready-to-ban-kaspersky-products-as-fbi-interviews-companys-us-employees/

О том, что примерно такое и будет, я уже догадывался, когда сам перешёл на американский антивирус “Симантек” http://nlothik.livejournal.com/797195.html

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