Энциклопедия символов «Юникодия»
6 постов
Напоминаю: я пишу программу под Windows — энциклопедию символов и самую лучшую замену стандартной Таблице символов. Качать тут. Выглядит примерно так.
Вот она, моя прога
И первое, что видно…
Новая вкладка
Какой-то фанат накидал мне целую панамку функциональности, и один его пункт я сделал, ибо нет технических препятствий и сумел просчитать все интерфейсные обоснования. (Скажем, масштабирование я не сделал потому, что функцию попробуй обнаружь в интерфейсе, а если случайно изменил масштаб, непонятно, как вернуть.)
Можно создать список каких хочешь символов — например, часто используемых типографских. Или просто закладки на полноценные блоки: нажатие на синюю стрелочку около «U+1FAF6» переходит на вкладку «Блоки».
Библиотека Noto к 15-му Юникоду привезла новые руки, вы уже их видели на заглавной странице — сделанные двумя цветами и как бы снятые широкоугольным объективом. Я их откладывал как из-за трудоёмкости, так и из-за сомнений: а достаточно контрастности? Оказалось, Юникодия приняла новые руки без вопросов, а BitBucket стал хуже — ну не смотрятся на размере пикселей в 15. А Slack вообще отказался принимать эти руки.
Все руки, кроме одной, автоматически перекрашиваются, и для тестирования этого механизма я сделал целую утилиту: а что в картинках изменилось? Обнаружил, кстати, много других глюков.
Разница между «было» и «стало», усиленная раз в 20
Видите, у вампирши яркие брови и тусклое лицо? Это значит, были какие-то ошибки в перекраске.
Изначально перекраска ставила целью экономить механическую работу, а не байты архива. Некоторые SVG-эмодзики глючили, я глюки исправлял — а чтобы исправить один раз, а не шесть, пять цветов кожи генерировались. Теперь, когда можно сравнивать «было/стало», можно и поэкономить, и десятка полтора человечков перекрашиваются — для пользователя не изменилось ни пикселя.
Был шимпанзе, стал гамадрил
В 2009 году, когда кодировали иероглифы, их брали из трудов Алана Гардинера — историчные, но корявые. В 2016 их заменили на профессиональный шрифт, возможно, Hieroglyphica, слегка погрешив против истины. С 2021 истину стали восстанавливать.
Лишь две строчки из большого списка
Мы работали вдвоём с немецким египтологом — я рисовал, он проверял. Когда он без предупреждения пропал, я спрашивал: а что с ним? Оказалось, уехал «в поля». Так и не сказал мне, насколько опасно/безопасно было в Египте.
Примерно 60% изменений — это люди. А именно: у действующего фараона прямая борода, у бога и бывшего фараона — длинным крючком (за исключением Пта, у него фараонская), у египтянина — короткая, у сирийца — острая. Кроме того, коровы, обезьяны, лодки и многое другое — около 70 иероглифов.
Северотайская письменность, сейчас в опасности, одна из красивейших письменностей мира.
Северотайская Библия. Тайское письмо и ланна
В 1930-е ланна была заменена тайским письмом, и используется больше меньшинствами (тай-кхынами, лы), до которых националисты не дотянулись. Так что многие надписи на северотайском пишут и тайским письмом, и ланной.
Меня просто давила жаба: такая красота — и шрифтом без засечек? После долгих поисков нашёл шрифт, который корректно рисует хотя бы простейшие надписи из Википедии.
Ланна: было/стало
Конкретно эти придуманы японцами незадолго до 2МВ
Движок GlyphWiki не очень подходит для рисования таких символов, и я плевался, когда вычищал. Нашёлся человек, нарисовавший их вручную.
Предупреждение о других формах эмодзи. У некоторых эмодзи бывают другие формы — устаревшие, некорректные и просто другие. Современный флаг Афганистана, белый с шахáдой (девизом ислама), никто не принимает и рисует старый 2021 года. Пиньята (начинённая конфетами игрушка) бывает в форме звезды и в форме животного. Автобусную остановку рисует каждый свою местную. Микроб — рисуют бактерии, амёбы и даже КОВИД.
Вот, например, флаг Мартиники
Вычищаю ложь. Я, конечно, стараюсь проверять, что пишу, но иногда не получается. Например: есть аж два «эльбасанских письма» для албанского: одно было известно с самого начала, ибо его изобретатель, «учитель Тодри», всю жизнь его пропагандировал, пока не убили (будет этой осенью под именем «Todhri»). Второе — единственный образец изъяли в 1945 у расстрелянного коллаборациониста, коллекционера и филолога (есть с 2014 под именем «Elbasan»).
Эльбасанское Евангелие / Три молитвы шрифтом Тодри
Или не очень верно написал, что такое ночная азбука Барбье: она использует матрицу 2×6, но код там не двоичный, а сколько точек в левой колонке и сколько в правой — таким образом получается 6·6=36 букв.
Шарль Барбье, зрячий военный. И Луи Брайль, слепой учитель.
Последнее — про азбуку Брайля отлично рассказала Юлия Большакова, так что закончим её рассказом.
Спасибо за внимание!
Разрешите подушнить на тему старого конца света.
БОР № 415713
xxx: Во всём мире ждут конца света 21.12.12. И лишь в России ждут ещё 03.01.13 старый конец света!
Есть старая задача из советских книг: почему старая Октябрьская революция (25 октября) раньше новой (7 ноября), а старый Новый год (14 января) позже обычного (1 января)?
Новый год — это дата, первое января. Старая дата — юлианская, новая — григорианская: 1 янв ю.к. = 14 янв г.к (старая) > 1 янв г.к. (новая). Григорианский календарь выкинул 13 високосных дней, и новый Новый год физически раньше старого.
Октябрьская революция — это событие, которое не бывает «старым» и «новым»: 25 окт ю.к. = 7 ноя г.к., один и тот же день по разным календарям! И г.к. не позже, у него просто цифра больше. А «старая революция» как кое-кто её празднует — это 25 окт г.к. Заметили передёргивание: дата 25 окт ю.к. названа новой революцией, 25 окт г.к. — старой?
И конец света — событие, так что «старый» конец света должен быть 8 декабря. По юлианскому календарю, естественно.
Примерно то же самое с часовыми поясами. В Москве UTC+4 (на момент написания), на Урале — UTC+6. Жители Урала увидят парад Победы (событие) позже по местному времени: 9:00 UTC+4 = 11:00 UTC+6. А если зафиксировать местное время — например, вечерние новости в 21:00 — получаем, что жители Урала увидят новости на два часа раньше по абсолютной шкале: 21:00 UTC+6 = 19:00 UTC+4 (по Уралу) < 21:00 UTC+4 (по Москве).
Хотя не стоит ругать шутку. Ведь это полная уверенность в том, что конца света не будет, а повод забухать всегда найдётся. (И опять мой двенадцатилетний текст сильно устарел, Часы судного дня неумолимо приближаются к полуночи.)
Не очень верно сделан комикс. Правильно так.
Этих двух товарищей забыли.
Фраза с нового башорга
Для лиги Лени: час — это 3600 секунд, из-за чего единицу «скорости» приходится брать из СИ, а единицу «расстояния» — внесистемной. Ну или наоборот.
Древний Вавилон имел систему счисления с двойным основанием: 6 и 10.
𒐕=1, 𒐖=2, … 𒐝=9
𒌋=10, 𒌋𒐕=11 … 𒐐𒐝=59
𒐕=60, 𒐕 𒐕=61 … (Ноль 𒑊 писался крайне непоследовательно и не известно ни одной надписи, где он был в конце числа. Как тогда писали 60, чтобы отличить от единицы — не знаю, некоторые источники говорят о другом клине, также в Юникоде есть символ 𒐑.)
Именно от вавилонян к нам пришла единица времени 1 час = 60 минут = 3600 секунд. Не слишком удобная цифра.
Для физических расчётов секунда — самое то: это цифра, очень близкая к времени реакции человека. В лёгкой атлетике считается, что к каждому рекорду, зафиксированному ручным секундомером, нужно прибавить 0,2 секунды. На практике мы едем на машине или жжём энергию часами, и нужны единицы, завязанные на час, а не на секунду. И тут главный вопрос: делать внесистемной «скорость» или «расстояние»?
Для расстояния системная единица — метр, для скорости — метр в секунду.
Рассчитывать скорость машины по секундомеру — между столбами 50 м, машина проехала за 6 секунд, скорость 50/6 = 8,3 м/с, то есть 30 км/ч — приходится разве что милиционерам до появления радаров. А вот расстояния приходится считать разными методами: по карте, мерным тросом, тригонометрией… Потому логично взять системное расстояние и внесистемную скорость.
Для работы («расстояния») системная единица — джоуль, для мощности («скорости») — ватт = джоуль/с. Казалось бы, всё аналогично, но нет.
Энергия-то электрическая, и ватт=вольт·ампер. То есть и расчётами, и замерами приходится высчитывать мощность прибора — а уж через неё стоимость эксплуатации. Потому системной удобнее сделать «скорость», а внесистемным — «расстояние». А джоули сгоревшего топлива преобразуются в ватт-часы электрической энергии где-то далеко на электростанции.
Для продажи другой энергии, энергии нагретой воды — то есть в отоплении — используют калорию (=теплоёмкость грамма воды). И тоже понятно, почему: измеряют расход воды и разницу температур на входе и выходе. Помножив одно на другое, получаем калории.
Мем врёт: порядок операций не был определён в 1912, просто кодифицирован в одном из западных учебников.
Сначала попробую рассказать, откуда взялся порядок операций. Вот видео, перескажу его вкратце.
Порядок операций по умолчанию — не математическая истина, а договорённость.
Чтобы явно указать этот порядок, используют скобки. Экстремальный вариант — взять в скобки каждую операцию (т.н. полная скобочная запись), но тогда даже очень простое выражение быстро становится нечитаемым.
((2·(x²)) + (3·x)) − 5
Потому хотелось бы уменьшить количество скобок, отсюда порядок операций «если иное не указано».
Но давайте сначала сделаем две ремарки.
В математике плюс и умножение переместительны и сочетательны (коммутативны и ассоциативны, как говорят в вузе) — a+b=b+a, a+(b+c)=(a+b)+c. На компьютере формально нет сочетательности, но глюки значимы очень редко. То есть не важно, в каком порядке суммировать/множить.
Вычитание — это нечто близкое к сложению: a−b = a+(−b). А деление — нечто близкое к умножению: a/b = a·(b⁻¹). Потому то и другое будет иметь одинаковый приоритет.
Из этих ремарок автоматически отпадает одна скобка: (2·(x²)) + (3·x) − 5.
А почему остальные скобки выпали до 2·x² + 3·x − 5 — есть очень много аргументов.
Аргумент точности и гипероператоров
Степень обычно приводит к большим цифрам. Умножение — к меньшим. Сложение — к совсем маленьким. Если нужно очень приближённо вычислить что-то, сначала получают самые большие члены (например, степенны́е), а потом всё ближе и ближе подходят к ответу, умножая и прибавляя, пока точности не будет хватать. И математики это обобщили в гипероператоры.
Гипероператор нулевого порядка — это следующее число x′ = x+1.
Гипероператор первого порядка — это сложение a+b = a″…″ (много штрихов) = a+1+…+1.
Гипероператор второго порядка — это умножение a·b = a+a+…+a.
Гипероператор третьего порядка — это степень aᵇ = a·a·…·a.
А гипероператор четвёртого порядка называется тетрация и приводит к вообще астрономическим числам.
Аргумент анализа размерностей
Считать по формулам обычно нужно потому, что эти числа имеют какое-то отношение к реальности — то есть тащат за собой единицы измерения. И запрещается складывать самолёты с часами, можно только самолёты с самолётами и часы с часами. А множить самолёты на часы не возбраняется, и получаются самолёто-часы — часы авиационной работы.
Анализ размерностей заключается вот в чём: смотрим, в каких единицах каждый член, и всё это должно совпадать. Вот несложная формула из физики: s = vt + at²/2. Считаем: s — метры. vt — (м/с)·с — тоже метры. И так далее.
Мне, Mercury13, приходилось делать несложную мобильную гонку. Да, она несложная, но движок работал на единицах СИ, и подобным анализом я исправлял очень много ошибок.
Аргумент алгебры
Сложение и умножение обладают также распределительностью (дистрибутивностью) — a·(b+c) = a·b + a·c. Порядок «сначала умножение, потом сложение» позволяет легче видеть в выражениях подобные шаблоны.
Аргумент многочленов
Многочлены вроде ax²+bx+c играют большую роль во многих отраслях математики, и хотелось бы их держать без скобок.
…В общем, на Западе всё это объясняют аббревиатурой PEMDAS.
Parentheses — скобки
Exponent — возведение в степень
Multiplication/Division — умножение/деление
Addition/Subtraction — сложение/вычитание
А взялся он из одного разночтения и трёх дополнительных факторов. Напоминаю, порядок операций — не математическая истина, а договорённость, призванная уменьшить количество скобок.
Первое и главное. Имеет ли неявное умножение ab (то есть умножение без явно прописанного знака «умножить») приоритет перед делением?
В профессиональной математике — и даже в старших классах — крайне редко делят двоеточием a:b. Чаще используется дробная черта, явно показывающая, что на что делить. В некоторых договорённостях эти знаки неравноценны, но забьём.
На компьютерах математикам приходится вытягивать свои выражения в строчку. Не столько для программирования (там поставят столько скобок, сколько комп требует), сколько для передачи другим математикам через системы общего назначения вроде форумов или электронной почты.
Как видите, есть разночтения, и комп их усилил. Отбивка пробелами также призвана их закрыть: операции, отбитые пробелами, считаются менее приоритетными, чем записанные слитно.
О калькуляторах и зарубежных учебниках будет рассказ в этом видео. В общем, есть калькуляторы, у которых неявное умножение имеет более высокий приоритет, есть те, у которых наравне с остальным. На одни калькуляторы ругались учителя, на другие — профессионалы.
А я попробую рассказать про наши родные источники. В любом случае в наших учебниках разночтений типа a/b(c+d) не будет: вылезут из кожи, но сверстают настоящую дробь. В профессиональной литературе такие места единичны, и пролистав доступные книги, получаю такое.
Бейко ИВ и др. Методы и алгоритмы решения задач оптимизации. К: 1983. Набор металлический. С.149 первая формула (что-то там)/(γ+1)||g(yᵏ)|| — неявное умножение раньше дробной черты, с учётом ремарок VI на с.147 и (ii) на с.148. Также нашёл на с.324.
Каханер Д и др. Численные методы и программное обеспечение. М: 1998. Набор неизвестной издательской системой (Word?). Вытянутых в строчку формул очень мало, но с. 201 третья строка — 1/√π ∫ в интеграле ошибок явно говорит, что дробная черта раньше неявного умножения. В другом месте на с.328 написали (что-то там)/(2L).
А теперь различные докомпьютерные источники по этому правилу.
Репьёв ВВ. Методика преподавания алгебры в восьмилетней школе. М: 1967. — с.81.
Шустеф ФМ. Методика преподавания алгебры. Минск: 1967. — с.43.
Уже видно, что с этим разногласие даже у методистов.
А теперь разрешите процитировать одного комментатора из-за бугра: «В этом примере смешаны запись из начальной школы и институтская, причём бессмысленно. Те, кто помнит арифметику, ответят 9. Те, кто больше помнят алгебру, вероятнее, ответят 1».
Кто в курсе, почему я добавил эту картинку?
Рассказал знакомый автомобилист.
Несколько лет назад у него пошла вонь из-под капота. Пошёл на СТО, там откручивают поддон — и оттуда падает жирная крыса, поджарившаяся и полуразложившаяся. Механик был впечатлительный, сразу грохнулся. Подошёл другой и довёл дело до конца.
На днях пошёл он на полную диагностику машины. В числе прочего, заказал вымыть двигатель. Оказалось, что крысы под двигателем устроили гнездо, и оттуда выгребли кучу костей и мусора. Хорошо ещё, провода не съели. Механик:
— Это ещё что. Подъезжал как-то человек — у него вытащили здоровенную крысу.
— На том подъёмнике?
— Да.
— Это был я.
Юникод 15.1 пока не поддерживается никем и никак. Но к 16.0 уже готовятся: 1 ноября приняли первые семь эмодзиков. Окончательный выпуск будет осенью 2024.
Вот она, великолепная семёрка
Колобок с мешками под глазами — усталый, измученный, похмелье, бессонница
Отпечаток пальца — биометрия, место преступления, мелочи, опознание
Корнеплод — свёкла, дайкон, редька, борщ, репетиция, дать в репу
Голое дерево — осень, зима, засуха, экология, депрессия
Арфа — лира, кифара, цитра, классическое исполнительское искусство, Ирландия
Лопата — откопать, подкопать, закопать (прямо или фигурально), вкалывать
Клякса — грязь, пятно, праздник Холи, краска, соус, пейнтбол
Автоматически вместе с кодом государства появился Сарк, островок в Ла-Манше, владение Великобритании.
600 человек, и уже код государства CQ
Добавлена одна буква, появившаяся в 2013 году,— ТЬ из языка ханты (уральская семья, 9 тыс. на 2010). Очевидная лигатура из Т и мягкого знака.
Типа их алфавит
Автор заявки — пикабушник! Мне казалось, что это единственная действующая буква из 16-го Юникода, но нет: есть ещё заглавная буква ɤ, придуманная в 2014 для языка восточный дан (Кот-д’Ивуар, 650 тыс., неписьменный). И целый алфавит гарай.
Вот лишь немногие из этих символов
Amstrad CPC, Apple II, Mattel Aquarius и множество других. Полагается, что значимые старые платформы исчерпаны и больше символов со старых компьютеров не будет. Вот, как пример, карты ханафуда на одном из японских терминалов.
В этом увидят красоту разве что японцы
Вы только посмотрите на их изобретательность: мордашки, кресты, машинки, диоды, резисторы — и из всего этого нарисовали карты.
Алфавит Тодри. Авторское Послание к евреям
Тип: алфавит, слева направо, без регистра, экспериментальный
Язык: албанский (на то время — арабица)
Существовал: середина XVIII века…≈1800
Албанский язык, очень далёкий родственник современного греческого, под властью турок несколько веков использовал арабскую вязь. И просвещённые умы около 1800 придумывали другие алфавиты — частично для конспирации от турок, частично для культурной автономии. Уже закодированы виткутьский алфавит (≈1850) и алфавит Эльбасанского Евангелия (до 1800). Вот перед нами третий образчик, также использовавшийся в районе города Эльбасана. Потому алфавит также нередко зовётся «эльбасанским», и чтобы одно не путать с другим, назвали в честь автора — Теодора Хаджифилиппа по прозвищу «учитель Тодри».
Гарай. Авторский букварь
Тип: алфавит, справа налево, с заглавными, экспериментальный
Языки: волоф (6,9 млн на 2017, латиница, арабица, адлам); мандинка (2,1 млн ≈2020, латиница, арабица, нко); оба — Сенегал, нигеро-конголезская семья
Существовал: с 1961
Что такое 1961? Это типа освобождение Африки, и некто Ассане Файе из Сенегала придумал вот такой алфавит. В любом случае в конкуренции победила латиница и количество грамотных в гарае в наши дни исчисляется сотнями, но письменность не умерла и изучается.
На ум приходит знаменитая шутка из комикса xkcd
Заглавная буква снабжена большим крючком. В конце слова часто добавляют длинный хвост, что, впрочем, не обязательно и будет поддерживаться шрифтами лишь когда туда добавится Тьюринг-полное программирование. Есть и другие места, где разработчики шрифтов ждут настоящего программирования: сложные стили арабского, египетские иероглифы, европейские ноты, стенография Дюплойе.
Тигалари. Книга санскритом на пальмовом листе
Тип: брахмийская абугида (особый вид слоговой письменности родом из Индии), слева направо, религиозная
Языки: санскрит (индоевропейская семья), кáннада, малая́лам, тулу (все три — Западная Индия, дравидийская семья). На последнем чаще пишут кáннадой и даже на переписях относят к говорящим на кáннаде.
Существовала: IX…XVII век, крайне редко поныне
Письменность сестринская с уважаемой письменностью малая́лам, и крайне мало используется в индуизме.
Подход к кодированию живых и исторических индийских письменностей очень разный. например, в деванáгари (крупной письменности для хинди, маратхи и более мелких языков):
क [ка] = ка
क् [к] = ка + вирама
क्ष [кша] = ка + вирама + ша
क्षी [кши:] = ка + вирама + ша + ии
Сделано это, чтобы задействовать поменьше клавиш на стандартный стиль — а если нужен другой, есть спецсимволы, которые можно хоть через AltGr. Сложно, но не все в Индии «индусы», есть и те, кто запрограммирует как надо.
В исторических письменностях разделяют видимую вираму (убирает гласную A) и виртуальную вираму (=conjoiner, склеивает согласные). Это упрощает создание шрифтов, перепечатывание документов в авторской орфографии, прочтение авторской орфографии на неполноценном шрифте.
Conjoiner — спецсимвол, склеивает согласные. Virama — видимая, убирает гласную
Цифры берут кто на какие горазд, предлагается унифицировать с кáннадой.
Юникод 16.0 — это будет мега-обновление! (В 2022 Консорциум Юникода потерял двух ключевых людей и вынужден был сделать небольшой выпуск.) С новой пачкой эмодзиков будут:
сунвар (Непал, алфавит без регистра, 1942)
гурунг или кхема (Непал, брахмийская абугида, около 1972)
кират-рай (Индия, брахмийская абугида, около 1920)
ол-онал (Индия, алфавит без регистра, 1992)
Я пишу программу «Юникодия» — энциклопедию символов Юникода. Качать тут.
Найти уязвимость в процессоре — это сильно. Но именно это случилось в середине 2017 года — появилась уязвимость Meltdown, теоретически открывающая доступ к системной памяти. Позже появилась и Spectre, более сложная, но теоретически позволяющая забраться в память другой программы. Поскольку теоретически уязвимы все, шума было много, но нет данных о реальном использовании этих уязвимостей.
Эмблемы уязвимостей Meltdown и Spectre
Извлечением разведывательных данных из открытых каналов шпионы занимались давно. С 2022 очень многие умеют сопоставлять снимки местности с гуглокартами (я не умею). И потому считается, что любое военное фото и видео лучше выкладывать несколько дней спустя, когда извлечённая информация будет неактуальной. И именно это — утечка данных через открытый канал — случилось почти со всеми x86. К Meltdown были уязвимы все Intel начиная с Core, к Spectre — вообще все.
Вкратце о виртуальной памяти. Появилась на процессоре 80386 (1985), даёт каждой программе подобие выделенного процессора с 4 гигабайтами памяти (если процессор 32-битный). Таблицы преобразования из виртуальных адресов памяти (доступных программисту) в физические (какая ячейка ОЗУ) находятся всё в том же медленном ОЗУ.
Приблизительное устройство виртуальной памяти
Программе иногда приходится обращаться к функциям ОС — например, чтобы получить имя текущего пользователя. Эта функция обязана обращаться и к системной памяти (там находится имя), и к пользовательской (чтобы скопировать имя туда). Решено это так: часть системной памяти внесена в виртуальную память программы, но доступ к ней разрешён только из системных функций. Именно эту память, которую «видит око, да зуб неймёт», читает Meltdown. Отсюда название — эта уязвимость «плавит» границы памяти.
Чтобы прочитать эту память, нужны определённые технологии процессора.
Чтобы поменьше обращаться к медленному ОЗУ, у процессора есть быстрая маленькая кэш-память. У современных процессоров есть три уровня кэш-памяти, нас интересует кэш 1-го уровня (ближайший к процессору, несколько килобайт объёмом, работает не с физическими адресами памяти, а с виртуальными).
Процессор умеет выполнять операции наперёд. Но в любой программе есть команды ветвления — скажем, «если D<0, то уравнение решения не имеет, иначе корни такие-то». Все современные x86 ещё до того, как вычислят D, пробуют пройти по одной из веток (а то и по обеим).
При этом процессор не знает наперёд, имеет ли он право выполнять эту операцию: для этого надо заглядывать в таблицы преобразования, а они если не в оперативной памяти, то в особом кэше преобразования адресов, который сидит между 1-м и 2-м уровнями. Так что просто выполняет — а потом уже разбирает, имеет ли он право это делать.
Для высокоточного отсчёта времени (для мультимедиа, игр и прочего) в процессоре есть счётчик тактов.
Джоэль Спольский придумал так называемый «закон дырявых абстракций». Звучит он примерно так:
Если за простым фасадом сложная технология, тонкости этой технологии будут вылезать наружу.
Вот пример из автомобилей: чтобы машина с ДВС умела стоять, а также ездить на разных скоростях в разных режимах мотора, к двигателю приделана коробка передач. Переключать её — дело неблагодарное, и в околовоенные годы придумали автоматическую коробку. Удобно — нажал-поехал — но то, что за всем этим старые добрые мотор и коробка, вылезает сплошь и рядом.
Дисклеймер: я о традиционной коробке типа «гидроавтомат» без электронных помощников. Да простят меня обладатели вариаторов и роботов.
ДВС не умеет стоять: коленвал остановился — двигатель заглох. А поскольку в автомате вместо сцепления две турбины, автоматическая машина всегда ползёт, если недостаточно сильно давить на тормоз.
Чем выше оказалась случайно стрелка тахометра в момент T, тем лучше тянет машина, если резко нажать газ.
А если нужно разогнаться максимально резко — дай коробке время переключиться, чтобы тахометр ушёл в 4000+ об/мин.
Ну и целая куча тонкостей в сложных и экстремальных режимах езды.
Есть очень длинный массив, больше, чем кэш-память. Скажем, на 1001 позицию — от 0 до 1000. Программа будет такая.
Сбросить кэш-память
Если некое условие (гарантированно не выполняющееся)
……Считать число из запретного адреса
……Извлечь из числа один бит (то есть 0 или 1)
……Загрузить из массива элемент № (бит·1000) — то есть № 0 или № 1000
Иначе
……Загрузить из массива элемент № 0, измерить время доступа
……Загрузить из массива элемент № 1000, измерить время доступа
Условие гарантированно не выполняется, но надо заставить процессор пройти наперёд именно по первой ветке — и он выполняет её наперёд, не зная, что адрес запретный. Заодно перекидывая элемент № 0 или № 1000 в кэш. Массив длинный, оба сразу в кэш не попадут.
Если из запретного адреса считан 0, доступ к элементу № 0 будет быстрым (он в кэше), а к элементу № 1000 — медленный. И наоборот.
И так бит за битом читают запретную память.
Сбросить кэш-память
Если некое условие (гарантированно не выполняющееся, с доступом к ОЗУ)
……Считать число из адреса, совпадающего с виртуальным адресом жертвы
……Извлечь из числа один бит (то есть 0 или 1)
……Загрузить из массива элемент № (бит·1000) — то есть № 0 или № 1000
Иначе
……Загрузить из массива элемент № 0, измерить время доступа
……Загрузить из массива элемент № 1000, измерить время доступа
Самый известный вариант Spectre очень похож на Meltdown, и главная разница такова: а) мы хотим получить доступ к памяти другой (атакуемой) программы, и мы знаем желаемый адрес в её виртуальной памяти; б) атакуемая программа постоянно имеет дело с этим адресом — и потому секретный байт в кэше (напоминаю, кэш 1-го уровня имеет дело с виртуальными адресами); в) «некое условие» вычисляется по формулам, требующим доступа к ОЗУ; г) запретный адрес тоже вычисляется по формулам, но более простым и быстрым.
Следите за руками. Не видя способа быстро рассчитать условие, процессор начинает наперёд крутить ветку «то». Вычисляет адрес, считывает из него число, а пока оно ползёт из ОЗУ, пробует прокрутить следующие шаги с тем числом, что завалялось в кэше . Число из ОЗУ не успеет прийти («если некое условие» будет вычислено раньше), но эти шаги, опять-таки, приведут к тому, что либо № 0, либо № 1000 будет закэширован и доступ к одному будет быстрый, а к другому — нет.
Название Spectre («призрак») происходит из-за крайней сложности ошибки (уязвимы почти все x86, программно не закрывается, и ожидалось, что она ещё некоторое время будет преследовать) и технологии «выполнение наперёд» (speculative execution).
Разработчики ОС экстренно закрыли Meltdown так. Сделали две таблицы преобразования адресов: одну сокращённую для программы, другую полную для системных функций. Это несколько замедлило систему, но закрыло уязвимость. В дальнейшем её закрыли на уровне процессоров и забыли.
Разработчики браузеров внесли свою лепту — дело в том, что в современном браузере JavaScript частично компилируется в машинный код! И они подкорректировали компиляцию так, чтобы шансы на удачную эксплуатацию были минимальны.
Больше всего напряглись провайдеры виртуальных машин и контейнерных служб (Microsoft Azure и прочие) — они-то и напрягли производителей процессоров. И виртуальная машина, и контейнер позволяют запускать любой машинный код в изолированной среде (например, чтобы сделать нестандартный или высоконагруженный сервер), но в виртуальной машине ядро ОС отдельное, а в контейнере — общее на все контейнеры.
Spectre в 2018 начали понемногу прикрывать на уровне процессора. В 2021 году появилась информация о новой версии Spectre, к которой якобы уязвимы даже те процессоры, что закрыли в 2018.
Поскольку среднестатистический «кулхацкер» довольно туп, код из статей про Spectre быстро стал ловиться антивирусами. Но в любом случае ничего не известно о реальной эксплуатации ошибки.