Серия «Доступно об АйТи»

Доступно об АйТи: Откуда взялись Meltdown и Spectre

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

Доступно об АйТи: Откуда взялись Meltdown и Spectre Meltdown, Процессор, IT, Spectre, Уязвимость, Длиннопост

Эмблемы уязвимостей Meltdown и Spectre

Извлечением разведывательных данных из открытых каналов шпионы занимались давно. С 2022 очень многие умеют сопоставлять снимки местности с гуглокартами (я не умею). И потому считается, что любое военное фото и видео лучше выкладывать несколько дней спустя, когда извлечённая информация будет неактуальной. И именно это — утечка данных через открытый канал — случилось почти со всеми x86. К Meltdown были уязвимы все Intel начиная с Core, к Spectre — вообще все.

Вкратце о виртуальной памяти. Появилась на процессоре 80386 (1985), даёт каждой программе подобие выделенного процессора с 4 гигабайтами памяти (если процессор 32-битный). Таблицы преобразования из виртуальных адресов памяти (доступных программисту) в физические (какая ячейка ОЗУ) находятся всё в том же медленном ОЗУ.

Доступно об АйТи: Откуда взялись Meltdown и Spectre Meltdown, Процессор, IT, Spectre, Уязвимость, Длиннопост

Приблизительное устройство виртуальной памяти

Программе иногда приходится обращаться к функциям ОС — например, чтобы получить имя текущего пользователя. Эта функция обязана обращаться и к системной памяти (там находится имя), и к пользовательской (чтобы скопировать имя туда). Решено это так: часть системной памяти внесена в виртуальную память программы, но доступ к ней разрешён только из системных функций. Именно эту память, которую «видит око, да зуб неймёт», читает Meltdown. Отсюда название — эта уязвимость «плавит» границы памяти.

Закон дырявых абстракций

Чтобы прочитать эту память, нужны определённые технологии процессора.

  • Чтобы поменьше обращаться к медленному ОЗУ, у процессора есть быстрая маленькая кэш-память. У современных процессоров есть три уровня кэш-памяти, нас интересует кэш 1-го уровня (ближайший к процессору, несколько килобайт объёмом, работает не с физическими адресами памяти, а с виртуальными).

  • Процессор умеет выполнять операции наперёд. Но в любой программе есть команды ветвления — скажем, «если D<0, то уравнение решения не имеет, иначе корни такие-то». Все современные x86 ещё до того, как вычислят D, пробуют пройти по одной из веток (а то и по обеим).

  • При этом процессор не знает наперёд, имеет ли он право выполнять эту операцию: для этого надо заглядывать в таблицы преобразования, а они если не в оперативной памяти, то в особом кэше преобразования адресов, который сидит между 1-м и 2-м уровнями. Так что просто выполняет — а потом уже разбирает, имеет ли он право это делать.

  • Для высокоточного отсчёта времени (для мультимедиа, игр и прочего) в процессоре есть счётчик тактов.

Джоэль Спольский придумал так называемый «закон дырявых абстракций». Звучит он примерно так:

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

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

Дисклеймер: я о традиционной коробке типа «гидроавтомат» без электронных помощников. Да простят меня обладатели вариаторов и роботов.

  • ДВС не умеет стоять: коленвал остановился — двигатель заглох. А поскольку в автомате вместо сцепления две турбины, автоматическая машина всегда ползёт, если недостаточно сильно давить на тормоз.

  • Чем выше оказалась случайно стрелка тахометра в момент T, тем лучше тянет машина, если резко нажать газ.

  • А если нужно разогнаться максимально резко — дай коробке время переключиться, чтобы тахометр ушёл в 4000+ об/мин.

  • Ну и целая куча тонкостей в сложных и экстремальных режимах езды.

Как работает Meltdown

Есть очень длинный массив, больше, чем кэш-память. Скажем, на 1001 позицию — от 0 до 1000. Программа будет такая.

Сбросить кэш-память

Если некое условие (гарантированно не выполняющееся)

……Считать число из запретного адреса

……Извлечь из числа один бит (то есть 0 или 1)

……Загрузить из массива элемент № (бит·1000) — то есть № 0 или № 1000

Иначе

……Загрузить из массива элемент № 0, измерить время доступа

……Загрузить из массива элемент № 1000, измерить время доступа

Условие гарантированно не выполняется, но надо заставить процессор пройти наперёд именно по первой ветке — и он выполняет её наперёд, не зная, что адрес запретный. Заодно перекидывая элемент № 0 или № 1000 в кэш. Массив длинный, оба сразу в кэш не попадут.

Если из запретного адреса считан 0, доступ к элементу № 0 будет быстрым (он в кэше), а к элементу № 1000 — медленный. И наоборот.

И так бит за битом читают запретную память.

Spectre

Сбросить кэш-память

Если некое условие (гарантированно не выполняющееся, с доступом к ОЗУ)

……Считать число из адреса, совпадающего с виртуальным адресом жертвы

……Извлечь из числа один бит (то есть 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 быстро стал ловиться антивирусами. Но в любом случае ничего не известно о реальной эксплуатации ошибки.

Показать полностью 2

Доступно об АйТи: Почему винил звучит богаче, чем CD?

Для Лиги лени: сохранность оригиналов; средний электрофон качественнее среднего плеера; цифровой звук, вероятно, был сжат с потерями и/или обработан компрессором; некачественная аппаратура, вносящая ностальгию и дополняющая лёгкую музыку.

Доступно об АйТи: Почему винил звучит богаче, чем CD? Вопрос, Грампластинка, Виниловые пластинки, Компакт-диск, Аудиотехника, Видео, YouTube, Длиннопост

Весёлые CD-болванки производства Verbatim

Копипаста из «Вокруг света»

Дело в сохранности оригиналов. При прочих равных цифровой звук CD-качества по всем параметрам превосходит аналоговые записи на виниле. Однако редко удается сравнить записи, произведенные в одинаковых условиях. Например, пластинки групп 1960–70-х делались со свежих студийных мастер-лент и могут звучать лучше CD, которые изготавливались позже с уже изношенных оригиналов, а то и с виниловых пластинок.

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

…Но это не только! Моё дополнение

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

Цифре всё едино, покуда пики вписываются в диапазон от −100% до 100% — но если из-за цифровой обработки они выйдут за диапазон, будет так называемое цифровое запирание, не любимое никем и звучащее как треск.

Потому с переходом на цифру (80-е и 90-е) началась война громкости: записи прогоняли через так называемый компрессор, оставляющий пики как есть, но делающий тихие звуки громче. К тому же компрессия улучшает слышимость на некачественной аппаратуре или в шуме, за это любима водителями (позволит выровнять музыку под звуки дороги, и ничего не будет слишком громким/тихим) — но качества и выразительности звуку она не добавит.

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

Слова «сжатие» и «компрессия» часто взаимозаменяемы, но их нельзя путать: уменьшение размера файла в первом случае и уменьшение разницы между громким и тихим во втором.

Шумы старой аппаратуры также вносят свою лепту во впечатление от музыки — особенно если там мало инструментов.

Показать полностью 1 3

Доступно об АйТи: Почему Буш скрыл факты?

Я сейчас опишу две старых фишки программ Microsoft — одна ошибка, а другая просто старый мем.

Bush hid the facts

Доступно об АйТи: Почему Буш скрыл факты? Баг, IT, Русский язык, Unicode, Грамматические ошибки, Windows XP, Microsoft Word, Длиннопост

Как повторить: на Windows линейки NT, до XP включительно, написать в Блокноте «Bush hid the facts» и сохранить файл. При открытии получим китайские иероглифы — или тофу («квадратики»), если в системе нет китайского шрифта. Другое ПО (например, WordPad) показывает, что файл в полном порядке.

Мем появился при Буше-младшем, но ошибка появилась в 90-е, вскоре после правления Буша-старшего. И заключается она вот в чём.

Долгое время символ текста совпадал с байтом — минимальной единицей памяти и телекоммуникаций. Разных байтов всего 256, этого хватает на английский и местный язык. И даже если местный язык всего один (например, русский/украинский), появилось множество разных кодировок, призванных обойти важные символы той или иной базовой кодировки. Так, в кодировке DOS (=CP866) обходили псевдографику, в кодировке Windows (=CP1251) — типографские символы и управляющий знак «мягкий перенос», кодировку КОИ-8 подгоняли под старое почтовое ПО, убиравшее верхний бит. И появился термин крокозябры — текст не в той кодировке.

Доступно об АйТи: Почему Буш скрыл факты? Баг, IT, Русский язык, Unicode, Грамматические ошибки, Windows XP, Microsoft Word, Длиннопост

А уж сложный текст (например, по языкознанию), содержащий санскрит и древнерусский ять ѣ, так вообще не напишешь. И тогда в начале 90-х придумали Юникод, тогда ещё просто двухбайтовую кодировку — один символ кодируется двумя байтами. Windows NT изначально писалась юникодной, и там появилась функция IsTextUnicode, проверявшая статистикой, чем, скорее всего, является строка байтов — текстом в однобайтовой кодировке или текстом в Юникоде. Функция существует и поныне, однако Блокнот её давно не использует.

Статистика была проста: длина строки чётная, и чётные байты меняются значительно меньше, чем нечётные. Так что к ложным срабатываниям приводят строки «hhhh hhh hhh hhhhh» и «this app can break».

Хочу избежать службу в армии

Доступно об АйТи: Почему Буш скрыл факты? Баг, IT, Русский язык, Unicode, Грамматические ошибки, Windows XP, Microsoft Word, Длиннопост

Как повторить: на старых версиях Word с русским словарём производства «Информатик» включить проверку грамматики и написать: «Хочу избежать службу в армии». И смотреть, что она выведет.

Это, как говорят, не баг, это фича. В русском языке есть три метода сборки слов в словосочетания:

  • примыкание: зависимое слово неизменяемое и просто прицепляется к главному: бежать быстро, бежал быстро. Если в слове «бежал» некоторые учителя выделяют нулевое окончание, то в слове «быстро» окончания нет никакого, ведь наречия не изменяются.

  • управление: зависимое слово встаёт в конкретную форму: встретить маму, встретил маму. Встретил мамы — бессмыслица, а встретил без мамы — совсем другое словосочетание.

  • согласование: слова изменяются синхронно: чёрный хлеб, чёрного хлеба.

«Информатик» просто завёл базу главных слов, и для каждого указал, каким бывает зависимое. И резонно указал, что глагол «избежать» требует родительного падежа — «хочу избежать службы в армии».

Показать полностью 2

Доступно об АйТи: Почему полоса прогресса ходит неравномерно

Ну вот и я подключусь к волне постов и расскажу кое-что на этот счёт.

Доступно об АйТи: Почему полоса прогресса ходит неравномерно IT, Волна постов, Интерфейс, Программирование, Длиннопост, Progress bar

Кто виноват и что делать? И кому на Руси жить хорошо?

Опять для Лиги лени поставлю телегу впереди лошади.

Сначала отвечу на третий вопрос — хорошо начинающим программистам, ведь современные библиотеки позволили очень маленькой кровью, например, загружать сайт, а потом извлекать из него информацию. Чтобы загрузить страницу, можно просто исполнить программу cURL, которая есть в Windows 10 начиная с патча 1803, а в *nix — была с давних пор.

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

А что делать — не знаю. Я смирился, тем более психологи показывают, что прогрессу достаточно идти вперёд, и пользователь всё поймёт.

И оглавление, снова для Лиги лени.

  1. Иногда ей надо ходить неравномерно.

  2. Загрузка — сложный процесс.

  3. Обратная связь — затратная операция.

  4. Иногда программа не может вызвать обратную связь.

  5. Иногда обратную связь вызвать архитектурно сложно.

Пристёгивайтесь, поехали!

Иногда ей надо ходить неравномерно

Пример: торрент-клиент

Доступно об АйТи: Почему полоса прогресса ходит неравномерно IT, Волна постов, Интерфейс, Программирование, Длиннопост, Progress bar

Что происходит, когда мы скачиваем файл по протоколу распределённой закачки? (Считаем, что интернет хороший.)

  1. Клиент обращается к трекеру (или бестрекерной сети), чтобы найти тех, у кого этот файл есть. И заодно сам объявляет трекеру, что мы этот файл хотим. Прогресс стоит.

  2. Потихоньку сползаются раздающие — поползли по сети первые блоки. Прогресс разгоняется.

  3. Скорость дошла до предела, предлагаемого нашим провайдером или найденными раздающими — прогресс идёт равномерно.

  4. Файл скачан почти весь, докачиваются последние блоки. Часть раздающих отключаем, скорость падает — прогресс замирает на 99%.

  5. Скачан самый слоупочный блок — всё, 100%!

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

Загрузка — сложный процесс

Пример: любая игра или инсталлятор

Доступно об АйТи: Почему полоса прогресса ходит неравномерно IT, Волна постов, Интерфейс, Программирование, Длиннопост, Progress bar

Пример с торрент-клиентом я уже привёл. Посмотрим, что творится в любой игре.

  • Загрузка из интернета — зависит как от пинга к серверу, так и от скорости этого самого интернета.

  • Доступ к файлам — на SSD почти мгновенный, на механическом диске — ощутимую долю секунды.

  • Линейное чтение файла — зависит от скорости диска.

  • Распаковка файла (почти всегда игра сжата каким-нибудь ZIP’ом) — тут уже действует процессор.

  • Передача распакованного в видеопамять — подключается видеошина.

Будь у нас компьютер с полностью стандартным железом, на манер ZX Spectrum, всё было бы понятно. Но ведь IBM стали стандартом именно потому, что имели множество разных процессоров, дисков и другой аппаратуры, от дешманских до high-end. А интернет-соединение вообще никак и нигде не стандартизировано.

Один из разработчиков сказал: «вот в этой точке мы перемещаем прогресс на 20%», что это значит? Он сидел с часиками и смотрел на отладочный вывод, и понял, что вот этот шаг отнимает примерно 20% времени. Примерно: на другой машине это может быть 10 или 30%. У разработчика — любого — есть один перекос: они пользуются мощными машинами, и потому отмеренные 20%, скорее всего, будут относиться именно к мощному компу.

А это уже личный опыт. Загрузку игры на Java ME я делил на 10–20 примерно одинаковых шажков. Это могла быть загрузка графики, тригонометрических таблиц, спрайтовых таблиц и много чего ещё. Показывается заставка разработчика/распространителя — игра грузится, но прогресса пока нет. Показывается заставка игры — прикидываем процент загрузки, и делаем одно из трёх.

  • Игра под заведомо быстрый мобильник (Nokia Series 40, Sony Ericsson серий K и Z) — нет индикатора. В таких портах на заставке даже нет места под индикатор.

  • Игра прикидывает, что загрузка закончится за те минимум 2,5 секунды, что отданы на заставку — тоже нет индикатора.

  • Или всё-таки рисует индикатор, но он идёт от 0 до 100%, даже если за время первой заставки игра ухитрилась проскочить 4 шажка из 12. Если оставшиеся восемь проскочила со скоростью звука — всё равно заставка висит минимум 2,5 секунды, с прогрессом 100%.

Обратная связь по прогрессу — затратная операция

Когда я пришёл в ту контору, писавшую игры для мобильников, их игры могли грузиться минуту и более. На Nokia Series 60, которая тогда была базовым портом! Перестав дёргать прогресс без нужды, мы ту же S60 отнесли к «условно быстрым» — какие-то телефоны ухитрялись всё загружать за пять-шесть секунд заставок, какие-то чуть дольше.

Давайте о том, как можно обеспечить обратную связь на ПК под управлением Windows (о других ОС не знаю).

  1. Самый технически простой. Ничего не делать, только грузить, иногда на короткие моменты передавая управление главному окну. Грузит и рисует полностью последовательно: пока окно перерисовывается, загрузка не идёт. Игра выглядит «застрявшей», не реагирует на управление, ОС может даже сказать: программа не отвечает, хотите дождаться?

  2. Одно ядро процессора полностью занято интерфейсом — программа уже реагирует на клавиатуру и мышь. А второе, загрузчик, также время от времени приостанавливается, пока главный не скажет: «У меня есть свободное время» — и не обновит информацию о прогрессе. По времени мало чем лучше первого: грузит и рисует почти последовательно.

  3. Этот способ самый сложный, но и самый быстрый. Загрузчик кладёт информацию в «почтовый ящик». Главное ядро время от времени этот ящик трясёт — и выводит его содержимое. Если в ящике всего одна цифра, это очень просто — 4 или 8 байт, в зависимости от архитектуры процессора, перейдут от процессора к процессору неиспорченными. Но с более сложной отладочной информацией надо неплохо так заморочиться, чтобы этой порчи не было — и чтобы не было того, что грузит и рисует последовательно (см. 2).

Доступно об АйТи: Почему полоса прогресса ходит неравномерно IT, Волна постов, Интерфейс, Программирование, Длиннопост, Progress bar

💽 грузить, 🖌️ рисовать, ⚙️ отрабатывать сообщения Windows, ⬛ обмен данными, 🚬🎋 простаивать

Иногда программа не может вызвать обратную связь

Пример: копирование в Windows на флэшку

Просто не может, и точка. Из чужих библиотек — каких-нибудь закачек, распаковок или математики — обратную связь вызвать очень сложно (придётся их дописывать), из системных вызовов — вообще нельзя.

Чем отличается копирование на винчестер (нет защиты от небезопасного извлечения) от копирования на флэшку (таковая есть)? Последним шагом, закрытием файла! Если копирование на винчестер, пользователь уже получил управление, но Windows ещё несколько секунд трещит, сбрасывая данные на диск — на флэшке сброс идёт сразу при закрытии, ведь надо защитить флэшку от небезопасного извлечения! Минуту, без всякой обратной связи.

Иногда обратную связь вызвать архитектурно сложно

Пример: последние шаги большинства инсталляций или расчётов

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

Эти шаги можно загнать под прогресс, но это требует непропорционального объёма программистской работы.

Показать полностью 3

Доступно об АйТи: Почему не взлетели визуальные языки

Посмотрим на язык программирования Скрэтч. Ну красиво, не правда ли?

Доступно об АйТи: Почему не взлетели визуальные языки Программирование, IT, Языки программирования, Визуальное программирование, Длиннопост

В начале 2000-х была мода на визуальный язык UML, сейчас его почти забыли. Попытаюсь рассказать всем не-айтишникам, почему такое не взлетает.

Вообще-то я слегка неправ — кое в каком виде визуальное программирование взлетает. Но все удачные решения делятся на две категории.

  1. Там, где действительно клик выразительнее текста.

  2. Чтобы как-то привлечь к программированию посторонних.

Клик выразительнее текста

Приведу две системы, где один клик делает столько же, сколько пара строчек текста.

Редактор форм типа Embarcadero Delphi и Qt Creator.

Доступно об АйТи: Почему не взлетели визуальные языки Программирование, IT, Языки программирования, Визуальное программирование, Длиннопост

Внешний вид формы всегда проще задать визуально, чем запрограммировать текстом.

Любая реляционная СУБД (система управления базами данных традиционного типа с таблицами и ключами), где линиями удобно показывать взаимоотношения между таблицами.

Доступно об АйТи: Почему не взлетели визуальные языки Программирование, IT, Языки программирования, Визуальное программирование, Длиннопост

Программирование для посторонних

Иногда удобно привлекать к программированию специалистов в своей сфере — трёхмерщиков, геймдизайнеров, экономистов. Пусть они плохо программируют, зато свои знания успешно применят. Вот, например, редактор материалов из Unreal.

Доступно об АйТи: Почему не взлетели визуальные языки Программирование, IT, Языки программирования, Визуальное программирование, Длиннопост

А вот — редактор квестов из «Космических рейнджеров». Тут причины сразу две: и удобно разложить блок-схему квеста на доске, и программист не нужен.

Доступно об АйТи: Почему не взлетели визуальные языки Программирование, IT, Языки программирования, Визуальное программирование, Длиннопост

А с профессионалами ответа два.

  1. Вы просто не знаете, чем занимается программист.

  2. Существует очень много специального ПО, ориентированного на текстовые файлы.

Так чем же занимается программист?

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

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

  1. Программист разделит игру (на чужом движке) на две части: 1) Управление игровой физикой; 2) Общий цикл игры (скобку «forever»), который отвечает за условия выхода из игры, вызовы игровой физики и прорисовщика, ограничение кадровой частоты.

  2. Почему скорость персонажа в 10 пикселей/кадр жёстко прописана? Не лучше ли указать где-то: СКОРОСТЬ_ПИНГВИНА = 10?

А если игра будет управляться и клавиатурой, и джойстиком — программист напишет (или сдерёт) общий «центр управления», а затем будет спрашивать у него: нажата ли кнопка «двигаться вправо»? А уж что это — клавиша →, или D, или ось X джойстика, или крестовина вправо — это дело того самого центра управления.

В тех же «Космических рейнджерах» нередко нарушается знаменитый программистский жупел — «не повторяйся». Например, в игре в кости первый раз результат разыгрывается как [2..12], а дальнейшие — [1..6]+[1..6]. Программист напишет так, чтобы первая и последующие партии управлялись одним и тем же кодом.

Чем хороши текстовые файлы?

Существует широкий набор утилит для работы с текстовыми файлами:

  • Их можно редактировать редакторами, причём довольно дикими способами — например, скопировать-вставить заголовок цикла и кусок тела, без закрывающей скобки.

  • В них можно искать файловыми менеджерами.

  • Работу нескольких человек можно объединять с помощью систем управления версиями.

И всё это нужно программистам. Даже XML снижает полезность этих инструментов.

Показать полностью 4

Как устроены эмодзи

Эмодзи (от японского «э» — картинка и «модзи» — знак) — язык пиктограмм, используемый в текстовых сообщениях. Будем говорить исключительно об эмодзи Юникода, как о самых распространённых.

История

В некоторых компьютерах мордашки включали в наборы символов: так, у компьютеров IBM (1981) две мордашки имели коды 1 и 2. Но пользоваться ими проблематично: их нет на клавиатуре, привязаны к платформе, да и коды 0…31 часто имеют собственное управляющее значение.

Как устроены эмодзи Эмодзи, Unicode, Кодировка, Длиннопост

Смайлик :-) придумали на заре Интернета, в 1982 году.

Конец 1990-х. Везде графика, и в различных системах интернет-общения появилась функция: отыскать в тексте :-) и заменить графической рожей. Кто помнит этот стиль смайликов?

Как устроены эмодзи Эмодзи, Unicode, Кодировка, Длиннопост

Главный недостаток такого кодирования через особые последовательности — попробуйте передать текст программы, и гарантированно будет ложная замена. Например, в записи f(8) находит смайлик в очках 8).

Было время, когда SMS’ки стоили дорого, и мы экономили символы. Экономили и японцы, и мобильный оператор DoCoMo в 1999 придумал вот такие символы, их и назвали «эмодзи». Кодировка символов собственная докомовская.

Как устроены эмодзи Эмодзи, Unicode, Кодировка, Длиннопост

В середине 2000-х годов смайликами обзавелись как Гугл в своей почтовой службе, так и Эпл в айфонах. Возник вопрос межплатформенного обмена смайликами, и консорциуму Юникода в 2010 году осталось только возглавить бардак, который они не в силах предотвратить, тем более свободных позиций в Юникоде всё ещё предостаточно: в ожидаемом Юникоде 15.1 пока 150 тысяч символов из 900 тысяч доступных. Добавляли понемногу, по несколько сотен, пока около 2018 не добавили все.

Совет: мало кто знает клавишу Win+; (точка с запятой) или Win+. (точка) из Windows 10+. Она выводит панель символов, в том числе эмодзи.

В том же 2018 Гугл, имея сильные позиции в Консорциуме, добавил эмодзи инклюзивности: по умолчанию большинство эмодзиков бесполые, мужской или женский пол задаётся специально.

Что такое «бесполый»: не имеет явных признаков мужчины или женщины. Нет сисек или усов; одежда, аксессуары и причёска унисекс. Например: у Гугла мужчина-вампир носит бабочку, женщина — чокер, а бесполый — горжет. Конечно, сделано в первую очередь для небинарных, но, извините, «палка-палка-огуречик» тоже бесполый. И вообще хорошая мысль: передавать идею, очищенную от дополнительных смыслов. А если те нужны — устанавливаются дополнительно.

Как устроены эмодзи Эмодзи, Unicode, Кодировка, Длиннопост

А пока…

Немного теории

Символом будем называть всё, что есть в кодировке: печатаемые символы, управляющие команды, незанятые позиции…

Любая кодировка заключается в замене символов на кодовые последовательности: например, пробел=32, A=65, B=66… Но Юникод пошёл дальше: как только символ попадает в Юникод, ему присваивается кодовая позиция — номер от 0 до 1 114 111 (или от 0 до 10FFFF в шестнадцатеричной системе). А за биты и байты отвечают форматы передачи: UTF-8, Punycode и другие. Вы и сами, если умеете программировать, можете придумать свой формат передачи Юникода.

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

Как устроены эмодзи Эмодзи, Unicode, Кодировка, Длиннопост

Заблуждение: Ну что такое, в новом Юникоде теперь крупные эмодзи.

Реальность: Насколько крупно рисовать — это дело прикладного ПО. Задача Юникода — сделать, чтобы все эплы, гуглы и фейсбуки кодировали сходные картинки одинаковыми цифрами.

И даже был курьёзный случай: существовал эмодзи 1F92D — колобок с улыбающимися глазами и ртом, закрытым рукой. Ну явно сдерживает смех. Но Эпл и Фейсбук рисовали глаза широко открытыми — неописуемый ужас. Их разунифицировали, эпловская версия получила номер 1FAE2.

И ещё — Юникод никогда не закодирует конкретную картинку — какого-нибудь преведа или догэ. Юникод кодирует идею, а художник может нарисовать эту идею по-разному.

Как устроены эмодзи Эмодзи, Unicode, Кодировка, Длиннопост

Односимвольные эмодзи

Пример: ехидный колобок состоит из одного символа 1F600.

Как устроены эмодзи Эмодзи, Unicode, Кодировка, Длиннопост

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

VS16-эмодзи

Пример: красное сердце 2764+FE0F

Как устроены эмодзи Эмодзи, Unicode, Кодировка, Длиннопост

Такой механизм применяется в основном для старых символов, существовавших до 2010 года, а также принятых в эмодзи с опозданием (напоминаю, принимали их по несколько сотен за раз). Чтобы отобразить символ графикой, за ним ставится невидимая метка «селектор начертания 16» (variation selector 16) FE0F.

Как вы видите, начинаются сложности, и их цель — избавиться от тофу. Старый символ хоть в текстовом виде, да и будет.

Совет: если в таблице символов видите эмодзи, а копипаста, например, в браузер упорно выводит символ текстом — вероятно, не хватает того самого VS16. Или найдите другую таблицу, или скопируйте-вставьте символ FE0F отдельно.

Существует и обратный селектор — FE0E, делающий из эмодзи текст. Вот вам футбольный мяч+FE0E: ⚽︎

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

Цвета кожи

Пример: негритянская рука OK 1F44C+1F3FF

Как устроены эмодзи Эмодзи, Unicode, Кодировка, Длиннопост

Как видите, цвет кожи — это просто символ-метка. Система, если может, собирает из руки и тёмной кожи тёмную руку. А если не может — будет просто рука и чёрный лоскут.

Флаги государств

Есть специальный алфавит, и флаг — это две буквы из этого алфавита. В Windows 10 во всех «хромых» браузерах будет «GB», а Firefox содержит флаги государств и всё-таки нарисует «юнион джек».

Как устроены эмодзи Эмодзи, Unicode, Кодировка, Длиннопост

Зато флаги иногда меняются, в этом загвоздка. В общем, сейчас Консорциум больше рекомендует цветные метки вместо флагов, но за политической обстановкой следит.

ZWJ-последовательности

Пример: белый бесполый врач 1F9D1+1F3FB+200D+2695+FE0F

Как устроены эмодзи Эмодзи, Unicode, Кодировка, Длиннопост

Посмотрим, как эта штука устроена. Первые два символа — это эмодзи «белый человек». Последние два — посох Асклепия. А между ними — невидимый символ «нулевой соединитель» (zero width joiner) 200D. Даже если система не может собрать из них врача, будет как-то понятно.

Другой вариант — картинка деятельности + ZWJ + символ пола.

Как устроены эмодзи Эмодзи, Unicode, Кодировка, Длиннопост

А также:

  • ворона = 🐦 + ZWJ + ⬛

  • свежачок Юникода 15.1 (выйдет в сентябре): человек, идущий вправо = 🚶‍♂️ + ZWJ + ➡️ + VS16

Ну и рекордсмен Юникода — межрасовый поцелуй. Целых десять символов: четыре эмодзи, соединённые тремя ZWJ.

Как устроены эмодзи Эмодзи, Unicode, Кодировка, Длиннопост

Из-за такого устройства у ZWJ-последовательностей есть и второй путь кодирования: производитель придумывает последовательность, вписывающуюся в правила, и если она станет популярной, Консорциум её внесёт в Юникод.

Инклюзивность

Примерно с 2018 начали заботиться об инклюзивности. У каждого эмодзи есть бесполая, мужская и женская версия, исключения три:

  • женщина в хиджабе (мусульманском платке) 🧕;

  • женщина, кормящая грудью 🤱;

  • танцор 💃 — изначально это была женщина в латиноамериканском платье. Потом добавили мужчину в костюме диско 🕺. А вот что будет танцевать бесполая версия — так и не определились (пока склоняются к брейку или контемпу).

Даже беременный мужчина с 2021 есть, тем более парочка беременных людей, которые по документам мужчины, действительно нашлась. А ещё в Англии можно «наесться до беременности», а у нас «беременный» — это с пивным пузом. Также есть несколько эмодзи, связанных с инвалидностью: человек в коляске, с белой тростью…

Забавная история. В шрифте Webdings в позиции 6D находится стилизованный восклицательный знак — мужчина в очках и деловом костюме левитирует. В 2014 году закодировали Wingdings и Webdings, превратив часть картинок в эмодзи — этот левитирующий (1F574), по стандарту, бесполый и может иметь расу.

Когда на картинке двое или более людей, в Юникоде существуют четыре способа раздать им расы:

  • Собрать через ZWJ из меньших эмодзи. Таких сборок всего четыре: поцелуй (см. выше), рукопожатие, любовь, пара людей. Согласитесь, важные!

  • Обойти межрасовую тему. Кормление грудью или из бутылки — младенец в шапочке. Массаж лица — массажиста нередко рисуют в перчатках.

  • Забить на расы из-за комбинаторного взрыва: все семьи без расы, иначе было бы много-много тысяч картинок.

  • Забить на расы из-за маловажности: борцы и танцоры Плейбоя есть всех трёх полов, но без расы.

Как устроены эмодзи Эмодзи, Unicode, Кодировка, Длиннопост

Колобки не инклюзивны, они всегда лысые и жёлтые.

У меня есть идея эмодзи. Как предложить?

Консорциум Юникода всегда (а вот и нет, каждый год в апреле-мае) готов выслушать ваши предложения. До настоящих эмодзиков доходят не более четверти заявок. За год выходит 20…30 штук.

Чего они точно НЕ примут:

  • связанные с текущими событиями: тонущий корабль, коронавирус (Эпл перерисовал 🦠 1F9A0 «микроорганизм»)

  • конкретные картинки и объекты: догэ, Сталин, Христос, Эйфелева башня. Принять могут только военного: собака 🐕 есть, а телебашни хватит токийской 🗼

  • надписи, флаги

  • слишком специфичные: F-35, пицца с колбасой. Принять могут только военный самолёт, пиццу и колбасу

  • изобразимые текущими картинками: мытьё рук, ведь есть руки 👐 и мыло 🧼

  • вызывающие каскадное добавление новых эмодзи: ленточки, символизирующие различные заболевания

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

Я пишу программу «Юникодия» — энциклопедию символов Юникода. Качать тут.

Показать полностью 13
Отличная работа, все прочитано!