Что в Америке так и осталось говном

За два десят­ка лет жиз­ни в США я видел мно­го изме­не­ний в стране. И в основ­ном это были улуч­ше­ния к луч­ше­му, хотя неко­то­рые вещи и ста­ли хуже. Япон­ские авто­мо­би­ли, напри­мер, ста­ли хуже. Пред­ста­ви­те­ли вла­сти ста­ли хуже. Но мно­гое ста­ло луч­ше — дома, напри­мер, ста­ли доступ­нее. В 1997 году про­цен­ты за ипо­теч­ный займ состав­ля­ли око­ло 8% (и это ещё ничо, в 80е было ещё хуже), а сей­час немно­го ниже 4%. Но не день­га­ми еди­ны­ми. Намно­го луч­ше ста­ла жрат­ва. Рань­ше в мага­зи­нах было два вида сыра — «аме­ри­кан­ский» и «швей­цар­ский». А щас даже в деше­вей­шем сель­ском Вол­мар­те мож­но купить и гау­ду, и бри, и даже грюй­ер (ну, не луч­шие и доро­гу­щие мар­ки, но всё же). Вот с йогур­та­ми поху­же, это прав­да. Тако­го оби­лия йогур­тов, как в той же Гер­ма­нии, я тут не видел. ИЧСХ, все немец­кие йогур­ты вкус­ные — какой не купи. Но хлеб мож­но купить нор­маль­ный, а не запа­ян­ную в пласт­мас­су вату. Моро­же­ное ста­ли выде­лы­вать вме­ня­е­мое.

И сре­ди все­го это­го бла­го­ле­пия одна вещь как была отвра­ти­тель­ным гов­ном, так и оста­лась отвра­ти­тель­ным гов­ном — это аме­ри­кан­ский май­о­нез.

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

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

С май­о­не­зом ситу­а­ция так­же ослож­ня­ет­ся тем, что прак­ти­че­ски все про­из­во­ди­те­ли дела­ют его с сое­вым мас­лом. С этим отвра­ти­тель­ным бур­лом с тош­но­твор­ным вку­сом и запа­хом. Поче­му они так дела­ют? Обра­ти­те вни­ма­ние на цен­ник, когда буде­те поку­пать рас­ти­тель­ное мас­ло в мага­зине в сле­ду­ю­щий раз. Самое дешё­вое — это то, кото­рое стыд­ли­во назы­ва­ет­ся «овощ­ным мас­лом» (vegetable oil). И толь­ко про­чи­тав эти­кет­ку, мож­но понять, что оно сое­вое. Я все­гда нена­ви­дел это мас­ло, и нико­гда его не поку­паю. Под­сол­неч­ное, ара­хи­со­вое и моё люби­мое мас­ло из вино­град­ных косто­чек — вот это совсем дру­гое дело, вот это вкус­ные нор­маль­ные мас­ла.

Кста­ти, тот май­о­нез, на кото­ром гор­до пишут, что он из олив­ко­во­го мас­ла — на деле сде­лан тоже из сое­во­го. Эти­кет­ку почи­тай­те вни­ма­тель­но.

Ниче­го близ­ко­го к тому пре­крас­но­му май­о­не­зу, что я поку­пал в Рос­сии под мар­кой «Сло­бо­да» во вре­мя послед­не­го заез­да, в США в обыч­ном мага­зине купить про­сто невоз­мож­но. Хоро­шо, что теперь есть интер­нет. Поис­кал «gourmet mayonnaise». Выско­чил май­о­нез «Сэр Кен­синг­тон», и пря­мо-таки елей­ный отзыв не где-нибудь, а на сай­те жур­на­ла «Bon Appetit». Хва­ли­ли ну про­сто как дев­ку перед выда­ньем — мол, настоль­ко вкус­ный май­о­нез, что хочет­ся пря­мо из бан­ки упо­треб­лять. Смот­рю состав — на под­сол­неч­ном мас­ле. И досту­пен в нашем мест­ном Whole Foods. Раз­лы­сил лоб, поехал в Хуле­фудз. Уку­пил, при­во­лок домой, достал лож­ку, про­бую. БЛДЖАД, всё то же самое — отвра­ти­тель­ное пере­кис­лен­ное уксус­ное гов­но. И всё окон­ча­тель­но ста­ло ясно с жур­на­лом Bon Appetit — вку­со­вые пупы­рыш­ки у них атро­фи­ро­ва­ны точ­но так же, как у боль­шин­ства аме­ри­кан­цев.

Види­мо, таки при­дёт­ся как с чёр­ным хле­бом и мно­гим про­чим — осва­и­вать тех­но­ло­гию изго­тов­ле­ния май­о­не­за и про­чих соусов само­сто­я­тель­но. Досто­по­чтен­ный Илья Иса­а­ко­вич Лазер­сон в помощь:

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

По сове­ту ув. 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 то же самое. Вот уж нико­гда не поду­мал бы, что Яббл бли­же кор­по­ра­тив­но­му миру, чем Мик­ро­софт.