А что-то в этом есть

По сове­ту ув. ny-quant попро­бо­вал исполь­зо­вать фор­му­лу x = r * x (1 — x) в каче­стве гене­ра­то­ра слу­чай­ных вели­чин. Одно­го пре­об­ра­зо­ва­ния мне пока­за­лось мало, так что делал два кря­ду.

«В домаш­них усло­ви­ях» про­ве­рить, каче­ствен­ная ли слу­чай­ность не очень про­сто, надо вспо­ми­нать осно­вы ста­ти­сти­ки и пра­виль­ное при­ме­не­ния хи-квад­ра­та. Но есть непло­хой спо­соб — пред­ста­вить полу­чен­ные зна­че­ния в виде изоб­ра­же­ния. Если кар­тин­ка выгля­дит шумом, то шан­сы на то, что зна­че­ния дей­стви­тель­но слу­чай­ны, непло­хи. Чело­ве­че­ский глаз очень непло­хо натре­ни­ро­ван на то, что­бы раз­ли­чать неслу­чай­ные узо­ры — мил­ли­ар­ды лет эво­лю­ции, что­бы изда­ле­ка узна­вать хищ­ни­ков или отли­чать ядо­ви­тых змей, даром не про­хо­дят.

Ну, как гри­ца, pics or it didn’t happen.

Резуль­тат исполь­зо­ва­ния функ­ции NumPy.random.random():

И резуль­та­ты, полу­чен­ные из двой­но­го при­ме­не­ния x = r * x (1 — x) с дву­мя раз­ны­ми зна­че­ни­я­ми r:

Вооб­ще — непло­хо, дол­жен при­знать.

Но если при­бли­зить и рас­смот­реть деталь­нее, ста­но­вит­ся замет­ной раз­ни­ца. Спра­ва — x = r * x (1 — x), сле­ва — NumPy.random.random()

Как вид­но, x = r * x (1 — x) чаще при­ни­ма­ет гра­нич­ные зна­че­ния, там мно­го бело­го и мно­го чёр­но­го, и мало серо­го. Из-за это­го, кажет­ся, что есть узо­ры, как на булат­ной ста­ли. Я не мате­ма­тик, но мне кажет­ся, что боль­шая рав­но­мер­ность явля­ет­ся жела­тель­ной.

Но вооб­ще — для такой про­стой фор­му­лы дол­жен при­знать, впе­чат­ля­ет.

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

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

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

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

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

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

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

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

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

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

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

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

Отрицательная частота

Всё же как мно­го я не знаю и не пони­маю. Послед­ний месяц-два изу­чаю мето­ды изме­ре­ния пара­мет­ров каче­ствен­но­сти уси­ле­ния зву­ко­во­го (и не толь­ко) сиг­на­ла.

Мето­дов есть несколь­ко, но про это в дру­гой раз.

Осно­ва в том, что чистый сиг­нал опре­де­лён­ной часто­ты (напри­мер, 1 КГц) пред­став­ля­ет собой сину­со­и­ду. Всё, что немно­го не сину­со­и­да, уже есть не чистый сиг­нал, а сум­ма сиг­на­лов, сум­ма сину­со­ид. Даже меандр мож­но опи­сать сину­со­и­да­ми — как функ­цию y(x) = sin(x) + sin (3x) / 3 + sin (5x) / 5 + .. + sin (nx) / n. Пото­му что меандр — это сум­ма сину­со­ид основ­но­го сиг­на­ла и сину­со­ид нечёт­ных гар­мо­ник — то-есть, сиг­на­лов с часто­той в 3, 5, 7 и так далее до бес­ко­неч­но­сти раз выше основ­ной. Про­сто если речь идёт о зву­ко­вом сиг­на­ле, гар­мо­ни­ки выше 19й слыш­ны (как счи­та­ет­ся) уже не будут, так что меандр там полу­ча­ет­ся не совсем пол­ный, при­бли­зи­тель­ный.

Так вот если есть источ­ник зву­ко­во­го сиг­на­ла, как узнать, насколь­ко чистый там тон? Мож­но запи­сать это в обык­но­вен­ный wav файл, а потом про­ве­сти над полу­чен­ным мас­си­вом дан­ных мате­ма­ти­че­ское изде­ва­тель­ство, назы­ва­е­мое пре­об­ра­зо­ва­ни­ем Фурье. Паке­тов для это­го суще­ству­ет мас­са, мож­но взять бес­плат­ный редак­тор Audacity, в нём есть спек­траль­ный ана­лиз (пре­об­ра­зо­ва­ние Фурье это оно и есть).

Но, во-пер­вых, я не ищу лёг­ко­го пути, а во-вто­рых, мерять гар­мо­ни­ки, дол­го их скла­ды­вать и встав­лять в фор­му­лу для рас­чё­та КНИ я не хочу. Нехай элек­трон­ный бол­ван всё за меня счи­та­ет, он на то и был куп­лен.

Так что нари­со­вал свою про­грам­му. Разу­ме­ет­ся, на Питоне (на чём же ещё, не на Сях же рисо­вать). Бла­го есть модуль SciPy, в кото­ром уже всё при­ду­ма­но, в том чис­ле алго­ритм быст­ро­го пре­об­ра­зо­ва­ния Фурье (сиречь FFT).

Алго­ритм FFT выда­ёт гисто­грам­му. По гори­зон­та­ли — часто­та сиг­на­ла, по вер­ти­ка­ли — его гром­кость. При­мер­но так слы­шит музы­ку чело­ве­че­ское ухо. Так вот выяс­ни­лось, что по умол­ча­нию алго­ритм выда­ёт сим­мет­рич­ную вокруг нуля герц кар­тин­ку, то-есть, есть как поло­жи­тель­ная часто­та, так и отри­ца­тель­ная %) На этом месте я залип — как это, минус один кило­герц?

Ана­лиз фай­ла с сину­со­и­дой 1 КГц выгля­дит так:

В прин­ци­пе оно ведь логич­но — у сину­со­и­ды одна поло­вин­ка име­ет поло­жи­тель­ные зна­че­ния от 0 до 1 (в воен­ное вре­мя — до 4 =)), а дру­гая — отри­ца­тель­ные, от 0 до ‑1. Соот­вет­ствен­но, поло­жи­тель­ная часто­та — для того, что выше нуля, а отри­ца­тель­ная часто­та — для того, что ниже нуля. Прав­да, не совсем понят­но, поче­му имен­но вот так — не было бы логич­нее делать поло­жи­тель­ную и отри­ца­тель­ную ампли­ту­ды (гром­ко­сти)?

Ещё менее понят­ным ста­ло, когда я силой сге­не­ри­ро­вал сину­со­и­ду с отре­зан­ной вер­хуш­кой и сунул её в ана­ли­за­тор. Вот такую:

Я ожи­дал, что ана­ли­за­тор уви­дит туе­ву хучу гар­мо­ник с поло­жи­тель­ны­ми часто­та­ми, и чистей­ший тон с отри­ца­тель­ны­ми. Ан фиг — одни и те же гар­мо­ни­ки были и сле­ва и спра­ва от нуля. Совсем непо­нят­но, поче­му так. Вер­нее, конеч­но, понят­но — сиг­нал это ВСЯ сину­со­и­да, от нуля до двух пи ради­ан, а не толь­ко её часть. Но тогда уже непо­нят­но, зачем вооб­ще горо­дить ого­род с отри­ца­тель­ны­ми и поло­жи­тель­ны­ми часто­та­ми — не всё ли рав­но?

Плю­нул, сме­нил алго­ритм scipy.fftpack.fft на scipy.fftpack.rfft. rfft — это real fft, и отри­ца­тель­ных частот не выда­ёт. Так намно­го понят­нее.

Про­дол­жаю изу­чать.

И снова пнём Андроид

С сисад­мин­ской точ­ки зре­ния теле­фо­ны с Андро­и­дом — ЗЛО.

Поче­му? Пото­му, что если на теле­фоне была сек­рет­ная инфор­ма­ция, то перед выда­чей ново­му сотруд­ни­ку это­го теле­фо­на или при избав­ле­нии от устрой­ства вооб­ще, эту инфор­ма­цию нуж­но сти­рать по ГОСТу стан­дар­там NIST.

И если мы нач­нём читать стан­дарт, то про­це­ду­ра надёж­но­го уда­ле­ния дан­ных для теле­фо­ном типа iPhone про­ста — ресе­тишь и в ус не дуешь. Эппл опи­сал стан­дарт того, как этот алго­ритм рабо­та­ет, и он пол­но­стью удо­вле­тво­рил NIST.

А для теле­фо­нов на ОС Андро­ид в доку­мен­те целый пара­граф, суть кото­ро­го сво­дит­ся к сле­ду­ю­ще­му — кон­крет­ная импле­мен­та­ция алго­рит­мов сти­ра­ния зави­сит от про­из­во­ди­те­ля теле­фо­на. Поэто­му про­це­ду­ры надёж­но­го уда­ле­ния дан­ных с теле­фо­нов на ОС Андро­ид в общем виде не суще­ству­ет. Ска­за­но, что надо зво­нить про­из­во­ди­те­лю и выяс­нять, под­дер­жи­ва­ет­ся ли там eMMC Secure Erase, Secure Trim и про­чие умные сло­ва.

Поэто­му в общем слу­чае, если от теле­фо­на на ОС Андро­ид надо изба­вить­ся, и на нём хра­ни­лись сек­рет­ные дан­ные, теле­фон необ­хо­ди­мо СЖИГАТЬ (ну или раз­ма­лы­вать в пыль с раз­ме­ром зер­на не более 2.4mm, как опи­са­но в стан­дар­те).

И, кста­ти, для теле­фо­нов на ОС Windows то же самое. Вот уж нико­гда не поду­мал бы, что Яббл бли­же кор­по­ра­тив­но­му миру, чем Мик­ро­софт.

GPS v.Everything

«Когда моде­мы были боль­ши­ми», и раз­го­ва­ри­ва­ли друг с дру­гом по теле­фон­ной линии, суще­ство­ва­ла туе­ва хуча про­то­ко­лов — v22, v32, v34, и так далее. Поми­мо обще­при­ня­тых стан­дар­тов, были так­же фир­мен­ные стан­дар­ты отдель­ных про­из­во­ди­те­лей — так, до того момен­та когда все ста­ли под­дер­жи­вать v34, моде­мы Zyxel и USR, несмот­ря на нали­чие у них про­то­ко­лов, поз­во­ля­ю­щих им пере­да­вать дан­ные со ско­ро­стью 19 200 (Zyx19200) и 16 800 (HST, в даль­ней­шем разо­гнан­ный аж до 24 000) бод, мог­ли общать­ся мак­си­мум на 14 400.

Закон­чи­лось это побе­дой разу­ма — USR выка­тил свой Courier v.Everything, кото­рый под­дер­жи­вал все стан­дар­ты (кро­ме чужих фир­мен­ных, разу­ме­ет­ся), все ста­ли под­дер­жи­вать v34+, и про­бле­ма «модем-то у меня ско­рост­ной, но с тобой я могу пооб­щать­ся толь­ко мед­лен­но» исчез­ла. А потом и моде­мы-то прак­ти­че­ски ушли, хотя в отдель­ных ипо­ста­сях (факс-сер­ве­ры) живут до сих пор.

Вся эта ситу­а­ция мне напо­ми­на­ет поло­же­ние вещей с гло­баль­ным пози­ци­о­ни­ро­ва­ни­ем. Сей­час суще­ству­ет четы­ре круп­ных систем гло­баль­но­го пози­ци­о­ни­ро­ва­ния — аме­ри­кан­ский GPS, рус­ский GLONASS, евро­пей­ский Galileo и китай­ский BeiDou (япон­ский QZSS не рас­смат­ри­ва­ем — это допол­не­ние к GPS и рабо­та­ет толь­ко в Япо­нии). И всё оно никак не вза­и­мо­дей­ству­ет меж­ду собой — при­ём­ник GPS не уме­ет рабо­тать с Galileo и наобо­рот. Хотя муль­ти­си­стем­ность более-менее появ­ля­ет­ся, чипы с под­держ­кой GPS и GLONASS я уже видел, даже в теле­фо­ны их ста­вят.

Одна­ко выяс­ни­лось, что суще­ству­ют чипы с под­держ­кой ВСЕХ систем пози­ци­о­ни­ро­ва­ния — эда­кий Courier v.Everything в мире нави­га­ции. Это, напри­мер, u‑blox M8, под­дер­жи­ва­щий при­ём со всех четы­рёх созвез­дий спут­ни­ков. Одна­ко, одно­вре­мен­но оно может толь­ко в три созвез­дия из четы­рёх — что, в‑об­щем-то, и так дофи­га, а если шиб­ко надо ВСЁ — мож­но тупо взять ДВА чипа, бла­го они сто­ят мень­ше 8 дол­ла­ров в пар­ти­ях от 500 штук.

Фак­ти­че­ски, таким обра­зом мож­но обес­пе­чить при­ём спут­ни­ков так с соро­ка сра­зу. Инте­рес­но, даст ли это воз­мож­ность полу­чить точ­ность пози­ци­о­ни­ро­ва­ния в сан­ти­мет­ры?

На злобу дня

Мне всё же инте­рес­но — в Белом Доме реаль­но тво­рит­ся такой раз­драй, хаос и бар­дак, или же там по сути ничем не хуже, чем при дру­гих пре­зи­ден­тах, про­сто это наши доб­лест­ные СМИ по при­чине мани­а­каль­ной нена­ви­сти к Дональ­ду тща­тель­но созда­ют такое впе­чат­ле­ние?

Я думал у всех так

Ока­зы­ва­ет­ся, у людей, кото­рые покры­ва­ют­ся мураш­ка­ми при про­слу­ши­ва­нии музы­ки, несколь­ко дру­гая струк­ту­ра моз­га. И встре­ча­ет­ся неча­сто.

https://www.indy100.com/article/music-goosebumps-some-people-science-research-emotions-psychology-study-harvard-7926781?utm_source=indy&utm_medium=top5&utm_campaign=i100

Шутка дня

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

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

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

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