О моём ЖЖ

Буду краток.

1. Подзамочных постов нет.
2. Здесь будут большей частью мои скромные околокомпьютерные мысли.
3. Писать буду не часто, могу и месяцами не писать.
4. На автокатегоризацию не смотрите, ибо врёт, как мерин. Единственный рубрикатор — тэги.

Юникодия v0.1 — моя энциклопедия символов

Вот где я пропадал всё это время.

Я ещё студентом хотел сделать энциклопедию символов Юникода. И за всё это время, пока я хотел, Юникод разросся с 49 тысяч символов до 140 тысяч.

Но всё-таки я сделал, хоть и не до конца, и получилась такая себе замена Таблицы символов Windows. Вот результат 4,5 месяцев работы одного человека в нерабочее время.

Сами понимаете, ни один шрифт не покроет всего Юникода. Кто-то предлагает комплект из трёх шрифтов, покрывающий весь Юникод 13 — но этот комплект коммерческий, и качество я не проверял. А нам, опенсорсникам, приходится искать — и хорошо, что Гугл сделал проект Noto (внимание, шрифты лучше брать прямо с их Гитхаба).

Но не Noto единым: на арабский, сирийский и ККЯ (китайский, корейский, японский) они просто забили, и они давно и безнадёжно неполные. Лаосский, готский и один из грузинских алфавитов — неканоничные глифы. Венгерские руны — просто жестоко глючат. Так что поиск шрифтов был сложным делом.

Да, вот ссылка на программу. Она бесплатная и открытая, пока только для Windows.

Программа на данный момент может немного. Она покрывает всю базовую и 2-ю плоскость Юникода, изрядный кусок 1-й и примерно половину 3-й. Позволяет простейшую навигацию по этому хозяйству, копирует символы в буфер, даёт небольшую информацию по письменностям, блокам и разным терминам — вот и всё.

Название самое лобовое: Юникод+энциклопедия → Юникодия.

Думая над эмблемой, сначала я хотел стебнуться над эмблемой Юнилевера и сделать вместо «положительных» образов конфет, птичек, ДНК и прочего разные символы из Юникода.

Но потом подумал, что это уж слишком. У меня уже были мысли каким-то образом разделить письменности на Европу, Азию, Тихий океан, Америку, Африку и международные — так что возникла идея собрать букву U из разноцветных кубиков.

Эти кубики и дали идею навигации по трёмстам блокам. Азию, как видите, я дополнительно разделил на ККЯ и остальное.

ККЯ — это примерно ¾ Юникода, и ткни куда-то в середину таблицы — попадёшь в иероглиф. Потому все ККЯ, кроме часто нужных катаканы и хираганы (японских азбук), изначально свёрнуты.

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

Что будет дальше? Показ как можно большего куска Юникода — и точно всех не-ККЯ. (Кстати, индийскую письменность нандинагари за неимением шрифта я сам как-то коряво начёркал.) Поиск, как без него — пока он «засерен», но это первое, что будет работать. Некий рубрикатор для эмодзи. Может, какие-то утилиты для китайских иероглифов — но без посторонней помощи я этого не сделаю. Утилита для показа разных начертаний жестового письма Валери Саттон — я уже знаю, какая, это просто не было приоритетом версии 0.1.

Вот «моргалы выколю» на жестовом письме Саттон.

Есть ли аналоги? Наш самый первый аналог — Таблица символов Windows. Правда, она ограничена одной задачей — поиском в шрифтах того или иного символа. А со здоровенным Юникодом часта другая задача — найти, есть ли в каком-то системном шрифте редкий символ.

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

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

BabelMap — бесплатная программа с моей же философией. Она несколько меньше, так как не тащит полные шрифты. Зато автор китаевед, и есть неплохой поиск по иероглифам.

Спасибо за внимание!

О вынужденной коррупции

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

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

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

Строка-ограничитель, ответ

Текст задачи

Если у нас алфавит 0…9 и 125 строк, из принципа Дирихле следуют два факта.

1. Хватит трёх цифр.

2. И не просто трёх цифр, а от 000 до 125.

Алгоритм получается такой. Заводим 126 битов — ну или 128 для круглого счёта. В общем, не меньше, чем n+1. Если первые три символа оказались цифрами от 000 до 127, ставим 1 в соответствующей позиции. После этого остаётся найти в массиве нулевой бит.

Где это используется? Бывает, что в текстовом компьютерном языке (языке программирования вроде Си, языке данных вроде HTML) нужно указать строку. Традиционное решение — строка забирается в кавычки: std::string x = "text";. Или наоборот, управляющие конструкции языка забираются в особые символы: первый<br>второй.

Первый вопрос: как добавлять символы, которые играют роль управляющих? Это делается теми же управляющими конструкциями: "\"quoted\""="quoted" в Си и &lt;tag&gt;=<tag> в HTML. Это называется «экранирование управляющих символов».

Если заэкранированных символов слишком много, ручное редактирование становится мучением. И тут на помощь приходит другой формат записи текстов — со строкой-ограничителем. Например, R"QQ("quoted")QQ"="quoted" в Си++. Тут строка )QQ" является ограничителем. И мы решали именно эту задачу — найти подходящую строку-ограничитель. Также подобные задачи решаются в MIME — формате передачи двоичных данных в почтовых сообщениях.

Язык программирования Си является «переносимым ассемблером» — то есть он пользуется ассемблерными утилитами вроде компоновщика и библиотекаря, а значит, первым после ассемблера появляется на новом процессоре. Но в Си сказано: имена, начинающиеся на два подчерка, а также на подчерк и большую букву, использовать нельзя, они зарезервированы за внутренними нуждами компилятора. Например, __imp_XXX при импорте функций из DLL, или __builtin_XXX для внутренних функций компилятора, когда он создаёт одну-две машинных команды по месту. А какое имя брать, если подобных требований нет? И это тоже наша задача.

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

Задача для программистов: Строка-ограничитель

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

1. Достаточно короткая. Не обязательно самая короткая, но разумной длины ℓ=O(log n).

2. Не является префиксом (началом) ни одной из строк словаря.

То есть QQQQ…QQQ не годится, потому что в худшем случае сравнима по длине со строками из словаря.

Попытайтесь оптимизировать этот алгоритм как по памяти, так и по простоте программирования — не выходя за O(nℓ), разумеется.

Ответ

Почему жанр «платформер» выкинут на задворки

Человек спрашивает: почему отодвинут такой жанр игр, как платформер?

На самом деле он есть, и отличные Braid, Fez и Cuphead показывают это. Но далеко не в первых рядах игр.

Они ориентированы на определённую публику. Мальчик младшего-среднего школьного возраста, которому раз в несколько месяцев родители покупают картридж, ориентируясь по картинкам. А вот я мужук, который не имеет желания совершенствоваться в «спинномозговой» игре, да и реакция не та.

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

Их сложность тяжело регулируется. Иногда количеством монстров или их HP, но прыжковые головоломки так настроить сложно или невозможно. Кстати, жанр «метроидвания» Кодзи Игараси, геймдизайнер из Konami, придумал, когда понял, что Castlevania всё больше ориентируется на опытных.

Мало кто знает, как сделать платформер правильно. Как ни странно, это так. Однажды я сдал в Steam игру Super Cyborg (клон Contra), потому что геймплей сводится к запоминанию, где и откуда появятся враги. В другом инди-платформере, Curse of Issyos, прогресс игрока сильно зависит от удачи. Хорошо, классика: в Adventure Island никакие боссы, а геймплей Ninja Gaiden за пределами боёв с боссами довольно примитивен.

Всё, выговорился.

Моддинг механической клавиатуры на шум

Механической традиционно называется клавиатура с металлической пружиной и металлическими контактами — хотя встречаются и ёмкостные (Topre), и механико-мембранные (IBM M), и оптомеханические (Bloody LightStrike).

Главный недостаток механической клавиатуры — она чертовки шумна. И если клавиатуры на «синих» щёлкающих выключателях специально берут ради шума, «красные» и «чёрные» линейные часто встречаются бесшумные из коробки, то с «коричневыми» тактильными беда.

И эту беду надо разгребать, и для этого есть несколько методов.

Без разборки клавиатуры

Смазать штоки и стабилизаторы. Фторной смазкой (например, SW-92SA), зубочисткой.

Амортизаторы. Силиконовые колечки, натягиваемые на клавиши. Имеют смысл только в системе Cherry MX. Просто покупаете на AliExpress силиконовые уплотнители 5×1,5×8 мм, 5×2×9, 4×2,5×9 в достаточном количестве — и начинаете ваять свою схему обесшумки в зависимости от габаритов кнопок, стабилизированы ли они, задействованы ли в быстром наборе… Моя: в алфавитно-цифровых 2 мм, в пробеле 2 мм на концах и 1,5 над выключателем, в остальных стабилизированных 1,5 на концах и ничего над выключателем, в остальных (модификаторах, служебных, курсорных, функциональных) — 2,5.

С разборкой клавиатуры

Лейкопластырь в стабилизаторы, оно же Band-Aid mod. В тех местах, где стабилизаторы ударяются в плату, приклеить лейкопластырь. Мне не потребовалось: и так стабилизаторы тихие.

Шумоизоляция. Автомобильная, клейкая, самая тонкая (3 или 4 мм). Минимального листа хватит на три-пять клавиатур. Её нужно в три места: 1) Между платой и задней стенкой; 2) Между пластиной и платой (если, конечно, не облом выпаивать выключатели и вырезать тонкие полоски по месту); 3) Между передней панелью и пластиной.

Немного юмора. Выяснилось, что при нажатии F9 моя клавиатура сходила с ума. Думал уже, клавиатуре конец: искать микротрещины на плате и вести провода в обход — так себе работа. Оказалось, что я неправильно развёл провод (виден на фото), и вывод кнопки F9 проколол его, со всеми вытекающими.

Остаётся открытым вопрос: 3-мм шумоизоляцию с закрытыми порами можно положить на пластину снаружи (не касается клавиш и легко очищается) — но как точно разметить кусок сложной формы с тонкими перемычками?

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

Плитка «Далокош», ответ

Текст задачи

Тупое неполное решение. Когда одна из сторон чётная, мы можем разломать шоколадку по ней пополам, а затем повторять ходы соперника. Выигрывает первый.

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

На удивление простое и гениальное полное решение. После хода первого игрока будет два кусочка, после ответа второго три, и т.д. Игра блокируется, когда кусочков будет mn — так что исход игры зависит только от чётности mn, но никак не от действий игроков.

Да, ради чего я эту задачу задал. В одном из интернет-разборов были два комментария.

1. Меня в отпуске так развели на море. Сыграл за 250 рублей в эту игру с шоколадкой. Мужик говорит, чтоб было честно, выбирай, каким ходить будешь. Я выбрал первым, и он взял одну шоколадку (сейчас понимаю, что с нечётным количеством квадратов). Если бы выбрал вторым, взял бы другую (у него их много разных лежало в переносном холодильнике).

2. НУ ЗАЧЕМ??? ЗАЧЕМ, АВТОР??? Я регулярно разводил людей в эту «игру», постоянно выигрывая, и никогда не выдавал секрета, а теперь весь мир узнает…

Так сказать, «встретились два одиночества».

И, как всегда, лирическое отступление. Копирование ходов противника — стандартный олимпиадный способ решения подобных игр. В нормальных играх, вроде шахмат, копирование ни к чему, кроме смеха, не приводит, но в простеньких играх, которые предлагают на математической олимпиаде, иногда срабатывает.

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

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

Занимательная задача: Плитка «Далокош»

Двое играют в такую игру. Есть шоколадка m×n. Первый разламывает шоколадку по канавке, второй точно так же разламывает один из кусочков, и так далее, пока шоколадка не будет разломана на единичные дольки. Проигрывает тот, у кого не остаётся ходов.

Кто выигрывает при правильной игре?

Ответ