Тёплый октябрь

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

Пока тепло, друг позвал покататься с знакомым ему лесником по лесам одного из отдалённых районов Татарстана. Я не отказался — в такие места без знающего человека не сунешься. Леса там не то чтобы глухие, но заблудиться — раз плюнуть. За всю поездку мы не встретили ни одного человека, впрочем, как и других крупных животных.

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

Ездили мы на «Надежде» — автовазовском минивене. Впервые вижу эту машину. Честно сказать, когда я её только увидел, подумал, что это самоделка, сделанная из «Нивы» и «Газели». Оказалось — нет, серийно выпускавшаяся модель.

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

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

Какой-то особой программы у нас не было — в основном колесили по лесу, но кое-что приметное всё-таки было. Лесник обещал нам показать настоящие землянки и заброшенный яблоневый сад на месте пионерского лагеря.

Землянка не впечатлила — просто яма в земле. Когда я в детстве нашёл землянку в своём родном городе, там было целое перекрытие, тут же оно давно сгнило.

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

Мужчина стоит рядом с большой кучей земли посреди леса.
Я рядом с муравейником

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

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

Оставить комментарий

«Пропьёшь» ли навык программировать?

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

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

Думаю со стороны это казалось проявлением то ли лени, то ли наплевательского отношения к предмету.

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

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

Замечаю, что в последнее время многие программисты задаются вопросом — не исчезнет ли их навык программирования, если они отдадут эту часть работы нейросетям? Думаю, им хочется услышать от как можно большего количества народу что-то ободряющее, вроде «конечно нет, ты что?», но история выше показывает, что навыки вполне себе исчезают без следа.

Вопрос только в том зачем нам этот навык? Это как с моим навыком черчения. Что такое должно произойти, чтобы он снова мне пригодился?

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

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

Другое дело, что поменялось всё слишком быстро и никто не понимает толком как перестроить обучение. Дать каждому студенту подписку на нейросети и сразу учить на какую-то смесь руководителя разработки с примесью бизнес-анализа и навыком тестирования? Так ведь человечество не настолько реактивно. 

Часть людей до сих пор находится на стадии отрицания вайбкодинга. Благо мемы годовой давности, когда код нейросети без ревью даже в домашний проект класть было зазорно, помогают им жить в своём иллюзорном мирке и считать, что они трезво смотрят на мир.

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

33 комментария

Движок сайта: бессерверные боты

Я мало рассказываю о своём движке сайта. Всё обещаю себе, что закончу и тогда напишу большую обзорную статью, но на деле очень страшусь объёма работы: он уже очень многое умеет, а то ли ещё будет — планов громадьё!

Поэтому лучше рассказывать потихоньку.

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

Выход на самом деле есть — так называемые «бессерверные боты», недавно появившаяся у «Телеграма» возможность. Небольшая цитата из руководства Telegram Serverless:

Telegram Serverless позволяет запускать серверный код бота и мини-приложения прямо на инфраструктуре «Телеграма» — не нужно настраивать серверы, поддерживать контейнеры в рабочем состоянии и думать о масштабировании.

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

Технически это набор обычных джаваскриптовых модулей. Для каждого события — свой обработчик: handlers/message.js получает сообщения, handlers/edited_message.js — правки. «Телеграм» вызывает функцию, она выполняет работу и завершается. Код работает в изолированной среде V8; полноценной Node.js со всеми npm-пакетами там нет.

Подключение начинается в мини-приложении BotFather: создаёшь бота, встаёшь в очередь, когда она подошла, выбираешь бота, включаешь Serverless и получаешь отдельный ключ для командной строки. На компьютере нужен Node.js 18 или новее:

npm create @tgcloud/bot my-bot
cd my-bot
npx tgcloud login
npx tgcloud push

login связывает проект с ботом, push загружает код. В комплекте есть SQLite, Bot API и fetch для внешних HTTP-запросов. База сохраняется между вызовами, поэтому можно хранить пользователей, настройки, очередь заданий.

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

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

Связь со статьёй определяется по ссылке в исходном посте канала — я всегда ставлю её в заголовке. Ответы сохраняют структуру обсуждения, а мой Telegram ID связан с моей учётной записью на сайте, чтобы собственные комментарии узнавались как авторские. Так же из комментариев переносятся картинки, видео, стикеры и реакции, включая их снятие.

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

Вот такая получилась схема. Я пока не знаю удастся ли этим же путём сделать публикацию заметок, но планирую попробовать, если получится, будет здорово.

Оставить комментарий

«MK-61s»: SIMD

Было время, когда меня захватила идея реализовать поддержку «Юникода» на «Флиппере Зеро». Я много тогда над этим работал и одна из вещей, которую я тогда делал — пытался ускорить измерение длины строки в кодировке «ЮТФ-8». Не то чтобы это было реальной проблемой, но мне хотелось этим заняться, вот я и занимался.

Тогда я познакомился с расширением DSP SIMD, которое помогает на армовских процессорах параллельно обрабатывать несколько значений одновременно. Вчера мне этот опыт пригодился.

Сейчас я занят ускорением работы встроенных в ретроконсоль «МК-61s» языков программирования — Бейсика и Фокала и вспомнил об этих инструкциях, так как процессор «MK-61s» их тоже поддерживает.

Чтобы измерять оптимизации я, как это у меня водится, портировал по эту задачу на ретроконсоль очередную игру. На этот раз шахматы Алана Тьюринга и Дэвида Чемперноуна (есть восстановленный алгоритм по мотивам их идей 1948 года). Нейросеть их перевела на Бейсик и это очень хороший тест, так как там очень много вычислений — первая версия делала ход за 162 секунды.

На черно-белом фото изображено устройство МК-61с с надписью «SIMD» сбоку.
Шахматы Алана Тьюринга на виртуальном экран ретроконсоли «MK-61s»

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

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

Все низковисящие плоды в плане оптимизации я уже сорвал, остались довольно сложные вещи, типа джит-компиляции, но перед этим я хочу убедиться, что сделаны все более простые вещи. Вот тут я и вспомнил про SIMD.

«Юникода» в «MK-61s» уже нет — я недавно перевёл код на однобайтовую кодировку, но тем не менее есть что ускорить. Эксперименты показали, что эффект есть при трансляции, когда Бейсик и Фокал ищут пробельные символы и переводы строки, что немного ускоряет холодный старт программ:

ПрограммаВремени на компиляцию меньше
Шахматный поиск, Бейсик0,47%
Вступление High Noon, Бейсик1,32%
Статистика, Фокал1,38%

К слову, оптимизированная версия Бейсика сейчас делает на холодную первый ход в шахматах за 104 секунды, а при прогретых кешах — за 87,5. Это пока всё равно медленно, но куда лучше 162 секунд, которые были в начале.

Оставить комментарий

«MK-61s»: самораспаковка в 105 ячейках

Что-то никак не оставляла меня мысль сделать более «честную» самораспаковывающуюся программу — без дополнительного регистра и чтобы умещалась в стандартную память калькулятора. Чтобы она работала в том гипотетическом сценарии, если бы авторы «Электроники МК-61» всё-таки позаботились доделать инструкции для работы с дополнительной памятью Ms.

В прошлый раз игра вместе с распаковщиком занимала диапазон в 110 ячеек, включая нестандартные адреса, которые есть только в ретроконсоли. Теперь весь образ помещается в 105 ячеек, нестандартный регистр Rf не используется, а начальные значения регистров устанавливает сама программа.

Больше всего удалось убрать из игровой части. Там были четыре отдельных вывода значений R1, R2, R3 и R9, каждый из двух команд: чтение регистра и остановка. Такие же выводы уже есть в распаковываемой части, нейросеть переназначила клетки карты на них. Это освободило восемь байт.

Сообщения о результате игры — числа 30 и 20 — теперь вводятся командами цифр. Каждый такой вывод стал на одну команду длиннее, зато для самих чисел больше не нужны регистры. Из восьми освобождённых байтов потратил два, после чего неизменяемый хвост игры сократился с 27 до 21 байта.

У распаковщика удалось убрать три команды: 8, x→П0 и X↔Y. Начальное значение счётчика теперь закодировано в первом числовом блоке упакованной программы. При обменах оно само попадает в R0, поэтому вводить и сохранять восьмёрку отдельными командами больше не требуется.

Чтобы отказаться от Rf, пришлось перенести хранившийся в нём шаг распаковки в Rd — регистр, где во время игры хранится здоровье. Во время распаковки здоровье ещё не нужно, а перед запуском игры его устанавливают две команды: 5 и x→Пd. Три команды ушло, две добавилось, в итоге распаковщик сократился с 20 до 19 байт.

Итого из игры и распаковщика удалось убрать семь команд. В новом расположении между распаковываемой частью и игровыми процедурами оставлены две пустые ячейки. Поэтому занимаемый диапазон сократился на пять ячеек: со 110 до 105.

Подготовку регистров удалось поместить в свободные места первых 63 ячеек. С адреса 08 выполняется цикл: в Rc записывается 9, затем значение Rc + 10 косвенно сохраняется в регистр с номером Rc, а счётчик уменьшается. Так R9–R1 получают необходимые для игры числа 19–11. Затем устанавливаются остальные начальные значения и адреса игровых процедур.

Эти значения перед распаковкой уже находятся в регистрах. Первый К ПВ сохраняет значения R0–R8 в Ms, последний возвращает их обратно. R9, Ra и Rb остаются на месте. Отдельных команд сохранения и восстановления не понадобилось. А сам код подготовки стирается при распаковке — его место занимает игра.

Для перехода к распаковщику нейросеть приспособила игровой переход в ячейке 35, заменив его на БП. До распаковки следующий байт содержит адрес 86. После распаковки там оказывается код 65 — П→x5, который для БП служит адресом 65. Поэтому процедура сбора детали теперь размещена именно там, для этого пришлось перед ней оставить две пустые ячейки. Один переход служит сначала подготовке, потом игре.

Для запуска нужно записать в память 79 ненулевых байт кода и данных. Сюда входит и код подготовки игровых регистров. Остальные ячейки должны быть обнулены. После распаковки игра размещается по адресам 00–85, распаковщик — в 86–104. Запуск начинается с 08, а после распаковки управление возвращается в 00. Ниже показано выполнение всего этого варианта.

Ms
Регистры


Осталась одна нерешённая проблема: используется 63 байта Ms, доступных в «MK-61s», тогда как в исходном калькуляторе эта область рассчитана на 56 байт. Нынешнему распаковщику нужны девять блоков этой памяти, а в исходном калькуляторе их восемь. Поэтому для работы в таком гипотетическом «МК-61» программу ещё придётся доделать.

Оставить комментарий

Движок сайта: боты

График показывает загрузку CPU, достигшую пика в 138% около 01.10, с общим средним значением 19.26%.
Очередной бот нашёл кое-какие урлы, в которые ему не надо. Наверное надо даже спасибо сказать ботам за нагрузочное тестирование сайта

В «Регистре» (так называется мой новый движок для сайта), меня, помимо редактора, постоянно донимают боты поисковых систем, нейросетей и так далее. Я даже не подозревал сколько их развелось и с какой страшной силой они молотят весь интернет. К сожалению, некоторые из них игнорируют robots.txt и заходят даже туда, куда просишь их не ходить.

Так как у меня на сайте сменилась часть адресов из-за появления новых возможностей, боты тут же побежали туда смотреть, что же там появилось нового, создавая нагрузку на сайт. Честно сказать, не знаю, последуют ли какие-то санкции от хостера, если ничего с этим не делать, но проверять не хочется.

Поэтому я регулярно захожу в панель администратора, чтобы посмотреть что у меня с нагрузкой и, если замечаю, что она в красной зоне, выгружаю логи и смотрю куда какой-нибудь очередной бот сунул свой любопытный нос. Решать проблему приходится по-разному — оптимизацией запросов, кешированием, динамической генерацией ссылок или стандартными robots.txt или nofollow, если бот их слушается.

Кеш у меня, кстати, сейчас устроен довольно сложно — если доступен модуль APC, либо есть /dev/shm, то горячие пути кешируются туда, если недоступно, используется общий кеш на файловой системе. Кеш без необходимости не сбрасывается, за этим я слежу отдельно. Инвалидация делается довольно топорно, надо — сносим, примерно как было в «Эгее», но, с другой стороны, я не делаю высоконагруженный проект, чтобы с этим отдельно заморачиваться.

Оставить комментарий

Затычка в ванне

Минутка быта.

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

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

На «Озоне» нашёл «универсальную силиконовую уплотнительную манжету белую для сифона раковины и ванны». Пришло четыре штуки. Разобрал сливную пробку, она элементарно развинчивается, надел два кольца на широкую часть, по обеим сторонам чёрной родной резинки, собрал и протестировал — набрал полную ванну и оставил на день.

Не ушло ни сантиметра! Тест считаю пройденным. Если у вас та же проблема, рекомендую сначала попробовать этот способ, прежде чем покупать новую сливную пробку.

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

1 комментарий

Движок сайта: редактор

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

Каждый день я дорабатываю движок, и большинство коммитов касается именно редактора. Почти каждый день я пишу свои заметки на сайт и почти каждый раз чем-нибудь недоволен и что-то правлю в редакторе. Он стал настоящей головной болью.

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

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

4 комментария

«MK-61s»: самомодифицирующиеся программы

У меня была давно идея попробовать сделать самомодифицирующуюся программу на программируемом калькуляторе «Электроника МК-61». Ничего готового для этого там нет, но я надеюсь, что используя различные недокументированные возможности, этого можно добиться.

Своей цели я ещё не достиг, хоть и продолжаю пытаться, а пока экспериментирую с командами доступа в область Ms — это недоделанные команды, которые я разблокировал в ретроконсоли «MK-61s».

Там всего две команды — одна обменивает Ms с содержимым памяти, вторая с регистрами. Таким образом вырисовывается путь — меняем что-то в регистрах, выгружаем в Ms, оттуда — в память. Так как в «MK-61s» на один регистр больше, то и Ms пришлось расширить — теперь там может храниться не 56 шагов программы, как в настоящем калькуляторе, а 63.

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

Например, число 690050,68 после такого переноса даёт последовательность кодов 68 50 00 69 50 00. Для калькулятора это уже программа: прочитать регистр 8, остановиться, ввести ноль, прочитать регистр 9, снова остановиться и ввести ноль. Кроме этих шести байтов у каждого блока есть ещё один служебный байт, который команда обмена с регистрами не меняет. Его можно заранее заполнить нужной командой.

Теперь самое интересное: если вычесть из этого число 10000,01, получим 680050,67, а в памяти — 67 50 00 68 50 00. Команды остались прежними, но оба номера регистров уменьшились на единицу. Продолжая вычитать ту же константу, можно получить целую серию похожих участков программы.

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

Для этого я взял игру «The Land of Psycho Lamers» и переставил её код так, чтобы повторяющиеся участки укладывались в вышеупомянутый шаблон. Получился распаковщик длиной всего двадцать байт: он берёт начальное число и шаг, заполняет девять регистров, а затем двумя обменами переносит результат в программную память. Так восстанавливаются 63 байта команд.

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

Ниже можно пройти распаковку по шагам. Хорошо видно, как сначала исходные данные уходят в Ms, затем из чисел строятся будущие команды, а в конце они одним обменом появляются в основной памяти.

Ms

Оставить комментарий

Сайт JELJAPAN

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

До «СДЕКа» у меня был вариант заказать кронштейн из Японии. Неплохой вариант, там даже дешевле, чем везти из Великобритании. Заказать пытался через сайт «JELJAPAN». Сам сайт доверия не вызывает — похоже сделали его ещё в 90-е, когда ни у кого не было понимания как надо делать, да так и оставили.

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

Тем не менее, решил дать сайту ещё один шанс — написал сообщение, спросил что с моей заявкой не так. В ответ у меня спросили «скакова» я региона страны. И это как раз тот случай, который я описывал в заметке про прескриптивизм и дескриптивизм. Ощущение, что со мной общаются не профессионалы. «Скакова», серьёзно? «С» и «какова»?

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

Понесу ли я сюда деньги? Конечно нет.

Михаил приветствует Евгения Степанищева и интересуется регионом страны. Евгений отвечает вопросом об отмене заявки №14254.

4 комментария

Сайт CDEK Forward

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

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

Попросил нейросеть найти мне ещё какие-то варианты доставки. Нашёлся вариант через «СДЭК Форвард» — кронштейн можно купить в Великобритании, а у «СДЭКа» как раз есть там адрес.

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

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

Помогла техподдержка. Оказалось, что нужно указать в профиле адрес электронной почты и ФИО. Я логинился через единый вход «СДЭК» — у меня там есть учётка, но почему-то «СДЭК» не передал эти данные в «СДЭК Форвард».

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

Пришлось снова писать в поддержку. Там пояснили, что данные профиля надо править не в профиле, а в меню «Виртуальный адрес». Кто бы мог подумать?

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

В общем, сайт делала ключница с какой-то нечеловеческой логикой, я не понимаю как там люди вообще что-то заказывают? Все идут в техподдержку что ли?

8 комментариев

DeepSeek V4.1 Flash: ещё быстрее

Я уже писал о запуске модели «DeepSeek V4.1 Flash» на четырёх видеокартах H200. Этой конфигурации хватает впритык и мне пришлось немало повозиться, чтобы достичь приемлемой производительности.

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

Оказалось, что эти профили используются для работы с матрицами и получаются перебором различных конфигураций на конкретном оборудовании. Потенциально правильно подобранный профиль способен ускорить инференс модели. А поскольку наш текущий «DeepSeek» использует в работе три типа данных, включая FP8, я решил попробовать этот профиль создать.

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

ПоказательДоПосле
Самый медленный запрос4,95 с2,46 с
Пиковая скорость1045 ток/с1811 ток/с
Успешные запросы12/1212/12

В итоге разницу можно увидеть в таблице выше — тут результаты небольшого нагрузочного тестирования модели с универсальным профилем и профилем, подобранным под оборудование.

1 комментарий

«Элита» на «MK-61s»

Как и во всех остальных случаях, специально чтобы оттестировать новые команды, я перенёс на «MK-61s» игру. У меня это уже проверенный метод для разных интерпретаторов, который даёт хорошие результаты — и баги становится проще найти, и оценить насколько удобно использовать сами команды

На этот раз, я об этом уже писал, выбрал «Элиту». Те, у кого был в детстве какой-либо клон «Спектрума», думаю, очень хорошо её знают.

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

Генеративные языковые модели не обладают собственным мнением — их ответы являются обобщением информации, находящейся в открытом доступе.
Заставка «Элиты» на двенадцатиразрядном индикаторе

Как первый результат расширенных команд вывода на экран — на индикаторе теперь можно вывести заставку и подписать, что игра ожидает нажатия кнопки C/П для старта. Всё это выводится в стандартных двенадцати знакоместах, просто нестандартным образом.

Внутри запрограммирована небольшая вселенная из 256 миров. Можно торговать шестью товарами — едой, рудой, топливом, электроникой, золотом и оружием, — заправляться, ремонтировать корабль, покупать ракеты и улучшать лазер. Между мирами встречаются пираты, а иногда и те самые таргоиды, которые встречались в оригинальной игре.

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

Названия миров я составляю из шестнадцати букв, которые можно более-менее узнаваемо изобразить сегментами. Например, начальный мир называется «dAdnAA». Получается что-то вроде технических обозначений, но от названий космических объектов благозвучие не требуется.

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

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

Как и любая языковая модель, GigaChat не обладает собственным мнением и не транслирует мнение своих разработчиков.
Цена еды: слева номер товара, справа цена, про «СП» я уже рассказывал

С управлением получилось по-калькуляторному: вводишь номер действия и нажимаешь С/П. Например, 10 показывает цену еды, 30 покупает одну единицу, а 40 продаёт. Для остальных товаров меняется последняя цифра. Во время ввода предыдущая картинка остаётся на экране, набираемый код её не затирает.

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

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

Бои пошаговые. За один ход выбираешь и манёвр, и действие: сблизиться или отойти, выстрелить из лазера или пустить ракету, восстановить щит или готовить бегство. Это снова две цифры: первая отвечает за движение, вторая — за действие. Можно, например, отходить и одновременно заряжать прыжок.

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

Дистанция имеет значение: лазер не достаёт до далёкой цели, а вблизи стреляет сильнее. Кроме того, он ещё и греется. Ракет мало, щит держит конечно количество ударов, так что бесконечно повторять одну и ту же команду не получится.

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

Для расстояния я сделал отдельную схему: U («you») обозначает наш корабль, H («hostile») — противника, а точка отмечает границу, до которой достаёт лазер. Так посмотреть приборы или выбрать цель можно без расходования хода.

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

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

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

К сожалению, иногда генеративные языковые модели могут создавать некорректные ответы, основанные на открытых источниках.
После уничтожения всех противников: YES. CLEAr

Победу я обозначил надписью «YES, CLEAr» . За победу дают награду, после сражения можно закончить перелёт и вернуться к торговле.

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

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

Игра и короткая инструкция лежат в репозитории. Нужна свежая прошивка с новыми командами; открываешь папку ELITE на устройстве, закрываешь памятку и нажимаешь С/П. Пока не решил стоит ли делать сохранения. С одной стороны это логичный следующий шаг, с другой стороны уже слишком далеко отходит от исходной идеи.

9 комментариев

Отдохнул на острове

Закатное небо отражается в воде, дорога уходит вдаль мимо припаркованных машин.

У нас с одним из друзей сложилась традиция — несколько раз за тёплый сезон мы уезжаем в поход на выходные. С ночёвкой в палатках, если позволяет погода.

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

Правда, в этом году мы оба как-то прилипли к дивану. Ездили, если мне память не изменяет, всего два раза, а с палатками вообще не выбрались — то у него не складывается, то у меня.

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

Накануне, в полном соответствии с парадоксом Степанищева—Вихлянского, никуда ехать не хотелось. Но жена сказала: «Езжай, потом будешь жалеть». И она оказалась права. Грех было упускать такую погоду, да и отдохнул на природе просто шикарно.

Оставить комментарий

«МК-61s»: два новых набора команд

Как я писал два дня назад, мне стало интересно пофантазировать на тему, как бы я расширил калькулятор «Электроника МК-61», если бы мне поручили доработать его под написание игр. Я решил, что нарастил бы ему память и позволил бы программисту гибче управлять выводом на экран.

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

Поэтому пришлось расширять команды по префиксному типу — код 1F используется как префиксный для работы с новыми банками памяти, а 2F — для работы с экраном.

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

Поскольку экран «МК-61» заменить в те годы было не на что, я бы оставил его тем же, но сделал бы две вещи.

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

Во-вторых, позволил бы программисту управлять каждым сегментом двенадцатиразрядного индикатора. Это даёт возможность выводить какое-то подобие букв и рисунков. Весь алфавит так не выведешь, но некоторые буквы и знаки — запросто.

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

И, конечно, стоит подумать об расширении памяти. Тут действительно настоящая проблема. Ретроконсоль «МК-61s» уже давно умеет в специальном режиме добавлять к традиционным 105 байтам ещё семь практически без нарушения обратной совместимости, а недавно в ней появились даже новые команды для работы с областью памяти Ms, которая была предусмотрена в калькуляторе «Электроника МК-61», но ранее не использовалась. Однако и этого всё равно недостаточно.

Поэтому я добавил этой памяти ещё несколько дополнительных банков, выделив префикс 1F для переключения. Сначала я думал, что обойдусь одной командой вызова подпрограммы, но оказалось, что для программирования это неудобно, так что в этом наборе появились еще циклы и команды условных переходов.

В итоге в расширенном режиме теперь доступно: 112 байт обычной памяти, резерв Ms в 63 байта (в обычном калькуляторе там 56 байт, но тут пришлось расширить из-за добавленного регистра Rf, который есть в «MK-61s»), плюс 31 банк памяти по 112 байт каждый. Всего 3647 байт.

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

36 комментариев

Первый месяц в новой школе

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

Я полностью расслабиться до сих пор себе позволить не могу: это уже третья школа, и везде всё начиналось достаточно хорошо. Тем не менее очень надеюсь, что больше менять школу не придётся.

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

С цифрами всё отлично: арифметика — 98%, литературное чтение — 93%, русский язык — 90,5%, английский — 80%. Английский на фоне остальных выглядит скромно, но 80% — очень достойное «скромно».

Таблица успеваемости школьницы Евы: математика 98%, литература 93%, русский язык 90,5%, английский язык 80%.
Стартовые результаты по основным предметам

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

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

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

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

Ева умеет говорить, слушать, договариваться и показывать результаты своей работы.
«Не общаться», говорила она

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

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

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

Таблица сильных сторон и зон роста моей дочери Евы по результатам учебы в новой школе.
Сильные стороны и пока единственная зона роста

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

Заранее праздновать я, конечно, не буду — опыт научил. Но пока поводов радоваться гораздо больше, чем переживать. Пусть так и продолжается.

17 комментариев

Прогресс по поиску могилы прадеда

Проект по поиску могилы прадеда, пропавшего в начале Великой Отечественной войны, пока приостановлен. Мы с нейросетью написали целую кучу писем и постепенно получаем ответы. В основном отрицательные. Ни у кого ничего нет, а что есть — уже выложено в интернет. Интернет я уже вычерпал досуха.

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

В паре мест запросили подтверждение родства. Тут мне очень сыграло на руку наличие свидетельства о рождении бабушки, дочери разыскиваемого прадеда, которое родители очень вовремя мне привезли. Отправил всю цепочку, жду ответа.

По моим расчётам эта фаза продлится примерно до декабря, после чего можно посмотреть на присланное и планировать что же делать дальше.

Оставить комментарий

«МК-61s» и Base91

Я на днях под влиянием книги «Сфера-80…», про которую недавно рассказывал, решил пофантазировать, как можно было бы гипотетически расширить «Электронику МК-61», если бы я, подобно герою книги, попал в то время и мне бы довелось его разрабатывать.

Поскольку этот калькулятор изначально не задумывался для игр, однако для него написано более шестисот игр, которые были опубликованы, и неизвестно сколько ещё пропало, мысли мои пошли в сторону того, что именно я бы добавил туда, чтобы на нём было интереснее играть.

Расширил набор команд двумя префиксами, в другой раз покажу какими, а для тестирования, как водится, написал при помощи нейросети игру — простой клон известной «Элиты». Для «МК-61» это не диковинка — в моём каталоге их четыре штуки, но тут новый уровень.

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

Вспомнил, конечно, про Base64, а также более редкий Base85, но оказалось, что есть ещё чуть более экономный формат Base91. Я, вроде, про него слышал, но крепко про него забыл. Все они, по сути, решают одну проблему — кодируют бинарную информацию так, чтобы её можно было хранить внутри текстовых файлов.

Самый простой вариант — шестнадцатеричная запись. Каждый байт превращается в два символа от 00 до FF. Это очень удобно для человека: файл можно открыть в редакторе, посмотреть и при некотором опыте даже что-нибудь исправить. Но за удобство приходится платить — размер данных увеличивается ровно вдвое.

Base64 работает экономнее. Он собирает три байта, то есть 24 бита, и превращает их в четыре символа по шесть бит каждый. Отсюда и название: шесть бит позволяют выбрать один из 64 символов. Размер файла при этом вырастает примерно на треть.

Base85 упаковывает четыре байта в пять символов. Тут уже нет такого красивого соответствия битам, зато 85⁵ чуть больше 2³², поэтому любой четырёхбайтовый блок в эти пять символов помещается. Накладные расходы уменьшаются до 25%.

Алгоритм, который обычно называют Base91, на самом деле называется «basE91» — именно так, с заглавной «E» посередине. Его написал Йоахим Хенке. В качестве алфавита он взял почти все печатные символы ASCII, кроме дефиса, апострофа и обратной косой черты.

На первый взгляд кажется, что Base91 должен просто брать некоторое количество бит и переводить получившееся число в систему счисления с основанием 91. Но подходящего целого количества бит тут нет: один символ вмещает чуть больше шести с половиной бит.

Зато хорошо работают пары символов.

В двух символах Base91 гарантированно помещаются 13 бит, причём после этого остаётся ещё 89 незанятых комбинаций. Автор алгоритма решил их не выбрасывать.

Обычно очередная пара символов хранит 13 бит. Но если значение этих бит попадает в диапазон от 0 до 88, кодировщик прихватывает ещё один, четырнадцатый бит. Для каждого из 89 маленьких значений получается две версии: с нулём и единицей в дополнительном бите. Декодер по получившемуся числу понимает, сколько бит надо забрать из входного потока — 13 или 14.

В исходном коде вся эта математика превращается в очень короткую проверку:

(v & 8191) > 88 ? 13 : 14

Без объяснения числа «88» и «8191» выглядят как магические константы. На самом деле первое число это те самые 89 оставшихся комбинаций, только нумерация начинается с нуля, а «8191» — это 2¹³ − 1, или тринадцать единиц в двоичной записи для выделения тринадцати младших бит.

Из-за такого устройства размер результата зависит от содержимого. В худшем случае Base91 добавляет около 23%, а на данных с большим количеством нулевых байтов накладные расходы могут уменьшаться примерно до 14%. Для обычного смешанного бинарного потока получается около 22,97%.

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

  • шестнадцатеричный формат — 2000 символов;
  • Base64 — 1336;
  • Base85 — 1250;
  • Base91 — обычно около 1230.

То есть по сравнению с Base85 выигрыш совсем небольшой — около двадцати символов на килобайт. Зато по сравнению с исходным шестнадцатеричным форматом файл уменьшается почти на 40%.

Для обычной программы «МК-61» размером 105 байтов цифры  такие: 210 символов в шестнадцатеричном виде, 140 в Base64, примерно 132 в Base85 и около 129 в Base91. Всего три символа выигрыша у Base85, зато 81 — у старого формата. На одной программе можно было бы не обращать внимания, но на большой игре и целом каталоге разница постепенно накапливается.

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

Код игры для «МК-61» в различных системах счисления: Base64, Base85 и Base91.
Вот так выглядит половина сжатой и закодированной «Элиты», половина, потому что из-за ограничений файловой системы она разбивается на 2 файла

Добавлено позже: один из читателей предложил вариант хранить программу в бинарном виде. Я такой вариант отбросил в самом начале, потому что мне больше нравилась идея всем управлять из текстового файла терминала, кроме того по расчётам тогда получалось, что в один файл всё равно всё не уместится.

Но я тогда не учитывал сжатие, плюс сама «Элита» была больше, я потратил немало токенов, чтобы её ускорить (первые версии рисовали экран секундами), а по пути она ещё и меньше стала. В общем, эту идею точно надо было рассмотреть.

В итоге, от команд  ztart и zin я избавился в пользу одной команды load, которая загружает сжатый заранее бинарный образ.

3 комментария

Прескриптивизм и дескриптивизм

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


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

Я очень приветствую появление новых слов, кроме случая когда заимствования заменяют то, что уже существует («ред флаг» = «красный флаг») и особенно меня радует появление новых слов, которые язык изобретает самостоятельно (прекрасный «воздухан» и неуклюжее «жиза»).

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

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

13 комментариев

«МК-61s»: однобайтовая кодировка

Сжег половину недельных токенов на задачу уменьшения размера прошивки для «МК-61s». У нас есть конфигурация, куда давно ничего не помещается, для нее я делал поддержку внешних запускаемых программ, но все равно из нее всё вываливается.

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

В задаче перевода кодировании символов на один байт мне пришлось участвовать постоянно.

Для начала для чего это нужно. Для нескольких вещей.

Во-первых, в прошивке достаточно много различных строк, которые приходится хранить. На одном этом удалось сэкономить около килобайта. Во-вторых, у меня ограниченные буферы редактирования. Тексты на русском в Юникоде занимают по два байта на символ. В-третьих, внутренний «диск» небольшой — всего 512 килобайт. И хотя используется сжатие, программы, использующие один байт на символ, всё равно занимают меньше места.

Поэтому пришлось придумать свою кодировку. Я её назвал «M8» («MK-61», 8 бит), но по сути это — CP1251 с добавленными специальными символами на позиции 0E…1F. Я выбрал как базу CP1251, потому что у большинства членов команды, а также у редких пользователей из сообщества — «Винда», поэтому при работе в терминале нам ничего не придётся перекодировать (специальные символы используются в интерфейсе, поэтому в терминал не попадают).

Таблица ASCII-кодов МК-61s: латиница, кириллица, цифры, знаки препинания и управляющие символы.
Теперь у «МК-61s» есть своя однобайтовая кодировка частично совместимая с так называемой «CP1251», для краткости я её называю «M8»

Файловая система, которая видна через «USB-диск», при этом работает как и раньше — длинные имена и содержимое файлов на лету преобразуются в «Юникод» и обратно. Поскольку для каждого файла у нас хранится метаинформация, чтобы мы знали, чем его запускать, бинарные файлы от перекодировки не страдают.

У меня есть идея поместить на свободные места все национальные символы, используемые внутри России — места хватает, однако она разбивается о сомнения, как поступить с их отображением в терминале. То ли показывать там знак «вопроса», то ли предусмотреть режим переключения терминала в «Юникод». Пока отложил эту идею, всё равно пользователей таких символов пока не наблюдается.

Оставить комментарий