«Редачить»

А ещё мне слово «редачить» не нравится. Это усечённое «редактировать», если вдруг не сталкивались. Появилось не так давно, но уже прочно сидит в речи многих.

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

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

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

«Виола» и организация закладок

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

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

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

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

Скриншот окна программы Personal URL Catalog с меню File, Edit, Organize, Help; в папке Root отображены файлы Demos, The World Wide Web project и Viola Central.

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

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

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

Звуки в «Виоле»

Как я уже писал, анимацию в «Виоле» можно получить, задействовав скриптовый язык, а что же со звуком?

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

Пришлось примотать небольшой код на Objective-C, который вызывает фреймворк AVFoundation, через который я теперь проигрываю системный звук Tink.aiff с заданной громкостью.

Что касается HTML, отдельного тега нет, но небольшими ухищрениями можно заставить проиграть браузер любой файл, имя которого кончается на .au — этот файл передаётся маковской утилите afplay, а она умеет играть файл в целой куче аудиоформатов.

Каноничнее, конечно, использовать именно формат au, тем более, что в него аудио можно преобразовать большинством современных утилит, той же ffmpeg, например.

Так как же проиграть звук из HTML?

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

Скриншот окна браузера Viola WWW с заголовком «Audio Player» и HTML-кодом, содержащим тег `` для вставки аудиофайла.

Так как звук играется асинхронно, в теории, можно было писать игры или делать сайты с фоновой музыкой, для этого уже всё было готово. А если учесть, что скриптовый язык позволяет запускать что угодно (с безопасностью у этого браузера явные проблемы), то можно, запуская ту же утилиту afplay, организовать звуковые эффекты.

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

«Виола» и моя мечта: как ИИ снова мне помог ★

Вступление

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

Узнал я об этом из статей о судебной тяжбе компаний «Микрософт» и «Иолас» (Eolas), начавшейся в 1999-м году.

Компания «Иолас» утверждала, что первой разработала и внедрила технологию «встроенных объектов и плагинов» для веб-браузеров, и «Микрософт», по их мнению, нарушала права, используя схожий механизм. В этой связи автора «Виолы» вызывали в суд, где рассказал, что придумал эту технологию ещё в начале 90-х годов, тогда как «Иолас» получила на неё патент только в 1998-м.

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

Скриншот ViolaWWW: заголовок «Front-Ending External Programs», описание встраивания front-end для XPlot, жёлтый каркасный самолёт на синем фоне.
Скриншот того как это выглядело в первой половине 1990-х

Что мешало

Но оказалось, что исполнению моей мечты мешало несколько обстоятельств.

Во-первых, на самом деле модель вращала утилита V-Plot, написанная Скоттом Силви, который учился вместе с автором «Виолы». Её исходники не сохранились.

Во-вторых, судя по сохранившимся исходникам веб-страницы, вращались две модели, которые назывались TomCat и x29.geom, которые ещё нужно было найти.

В-третьих, как оказалось, часть, которая должна взаимодейстовать с V-Plot не работала.

Вопрос №1: где взять V-Plot?

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

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

Оказалось, что специальный «объект» TTY «Виолы» для взаимодействия с программами, которые могут выводить графику в окно браузера, реализован только для «Линукса», а для «МакОСи» (в «Виоле» встречаются куски для очень старой версии этой операционной системы) код реализован не был.

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

Скриншот интерфейса ViolaWWW с заголовком «Front-Ending External Programs» и описанием демонстрации встраивания объекта viola для связи с процессом построения графиков XPlot.
Сетка — признак того, что взаимодействие с V-Plot работает!

Здо́рово! Но где же мои самолётики?

Настал момент узнать откуда же брались самолёты. Оказалось, что «Виола» передаёт на вход V-Plot одну из моделей, которые выберет пользователь — там на выбор несколько графиков и две модели в формате OFF (Object File Format). Моделей в комплекте с исходниками браузера не оказалось.

Ориентируясь на приметное имя x29.geom, я решил поискать эту модель, вдруг это что-то известное. А параллельно зарядил ChatGPT глубоким поиском.

Модель действительно оказалось известной — её когда-то изготовила компания «Эванс энд Сазерлэнд», а потом использовали на европейской выставке 1987 года, электронные материалы которой каким-то чудом уцелели и доступны для скачивания.

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

Дальше нейросети меня опять удивили — посмотрев на мой найденный файл, сеть для программирования «Опус 4.5», не моргнув глазом, написала мне за каких-то несколько десятков секунд код для парсинга и отображения этого формата. И вот я уже вращал свой первый самолёт!

Скриншот интерфейса ViolaWWW с заголовком «Front-Ending External Programs», описанием демонстрации встраивания объекта и желтым 3D-графиком XPlot на синем фоне.
Браузер «Виола», вращающий модель самолёта Grumman X-29 в трёх измерениях

Отлично! А что со второй моделью?

Со второй моделью так гладко не вышло — как я ни старался, ничего путного по слову TomCat на нашёл. Решил смириться и найти хоть какую-нибудь модель того же самолёта — ChatGPT определила, что на картинке нарисован Grumman F-14 Tomcat.

Тут наконец пригодился глубокий поиск — нашёлся архив внутри которого лежала модель самолёта F-14, но, вот неприятность, в формате IOB (Imagine object). Формат давно мёртвый и единственный конвертор, который я нашёл — бинарный файл под операционную систему «Амига».

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

Скриншот интерфейса ViolaWWW с заголовком «Front-Ending External Programs» и демонстрацией 3D-модели самолёта XPlot в виде жёлтой проволочной сетки на синем фоне.
Модель Grumman F-14 Tomcat, сконвертированная из формата IOB

Выводы, или Что меня удивило

Лёгкость к которой нейросеть провела обратную разработку команд, написала интерпретатор команд для V-Plot и конвертор, просто поражает! Честно сказать, я на такое совсем не надеялся. Максимум, который я ожидал — полуживой прототип, который придётся отлаживать не один день.

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

Тем не менее, та работа, которую я проделал над браузером при помощи нейросетей, совершенно неподъёмна для человека в такие короткие сроки.

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

«Виола» и самолёты: коррективы

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

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

violaIdleEvent(): select() error: : Bad file descriptor

Как будто браузер теряет соединение со своим бэкендом для отрисовки моделей и вращение рассинхронизируется. Как только научусь стабильно повторять эту проблему, попробую поправить.

Скриншот интерфейса ViolaWWW с заголовком «Front-Ending External Programs» и демонстрацией 3D-модели ракеты в желтом каркасе, отображаемой через XPlot.

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

Музей МВД

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

Фотографии выкладывать не буду — их уж чересчур много, про каждую хочется рассказать, поэтому побуду буридановым ослом и не выберу ничего. Разве что одну фотографию для привлечения внимания.

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

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

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

Миниатюрная модель пистолета с деревянной рукояткой, на которой выгравированы слова «СИЛА» и «ДЛЯ РУК», на чёрном фоне.
Пистолет одной из самых известных казанских банд — «Тяп-ляп»

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

«Виола» или «ВиолаВеВеВе»?

Как вы уже заметили, я упоролся по браузеру «Виола» и, похоже, перемкнуло меня надолго. Тем лучше! Давно у меня не было хобби из-за которого я бы несколько недель не спал по ночам.

Вопрос, который меня интересовал — правильно ли я вообще называю эту программу? Для меня это важно.

Дело в том, что «Виола» — это язык программирования, а не сам браузер. Например, вся обработка тегов внутри написана на этом языке. Его название расшифровывается как «Visually Interactive Object-oriented Language and Application».

Браузер же правильно называется «ViolaWWW». Но называть его так очень неудобно, на редкость неуклюжее название, поэтому я почти всегда называю его «Виола». И мне подумалось, что неплохо бы выяснить как его называли в прессе во времена, когда он ещё не стал частью истории.

В общем, не мне одному было жалко ломать язык — например, в журнале «Internet World Magazine» за апрель 1995 года он тоже называется «Виола», значит всё в порядке.

Статья о раннем браузере Viola, разработанном Пе Вэй в Калифорнийском университете в Беркли, с упоминанием его функций и сравнения с Mosaic и X/Window.
Заметка из журнала «Internet World Magazine» за апрель 1995 года, страница 36

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

Инсталлятор «Виолы»

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

Так как с собой пришлось тащить ещё и «Кварц» (XQuartz), то лучшим выбором был dmg — файл с монтируемой файловой системой. Хорош он тем, что просто делается и легко стилизуется. Я, например, сделал внутри обои, вдохновлённые внешним видом браузера и поместил портрет автора с его старой домашней странички.

По-моему, вышло очень симпатично.

Скриншот окна установки ViolaWWW Hypermedia Browser: иконки XQuartz-2.8.5.pkg и ViolaWWW.app, папка Applications, инструкция по установке и фото автора Pei-Yuan Wei.

Для сборки сделал две новые цели — make app для сборки самого приложения и make dmg для сборки инсталлятора.

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

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

Добавлено позднее: код собран по процессоры АРМ и под «МакОС» 26.

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

JOPA: Javac One Patch Away

Пока я тут использую нейросети для развлечения, некоторые ребята пробуют их для чего-то более полезного — например, один наш соотечественник (о чём можно догадаться по неймингу) за две недели дописал форк старого джава-компилятора Jikes, написанный на Си++. Теперь компилятор называется JOPA и поддерживает Джаву версий 5, 6 и 7.

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

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

Правда, на моём тестовом примере JOPA упала с ошибкой при попытке открыть rt.jar (это главный архив стандартной библиотеки), но это удалось решить, просто распаковав его рядом.

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

Скриншот терминала с командами настройки JAVA_HOME и сборки проекта BouncingBall.java, рядом — окно приложения с красным шаром на белом фоне.

Добавлено позднее: за такое меня ещё не благодарили, какой-то новый опыт:

Письмо от Paul S. с уведомлением о комментарии pshirshov в 7mind/jopa#21: «Thank your your contributions into JOPA», с ссылками на GitHub и отписку.

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

Обратная разработка GIFLITE.EXE ★

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

Когда-то давно, когда я активно верстал, формат GIF был одним из самых ходовых, для анимации так вообще альтернатив не было. И мы в то время в обязательном порядке занимались оптимизацией графики.

В случае GIF очень хорошо помогала известная утилита GIFLITE.EXE — коммерческая разработка компании «Вайт Ривер Софтвейр» (White River Software), которая, по всей видимости, давно исчезла, так как я про неё ни в какой другой связи никогда ничего не слышал.

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

Скриншот терминала: слева — справка по команде giflite (сжатие GIF), справа — результаты теста пиксельного сравнения 925 файлов (923 прошли, 2 пропущены из-за ошибок сжатия).

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

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

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

А теперь, немного подробностей.

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

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

GPT-5.1 Codex Max показался немного медлительным и чуть туповатым парнем, таким неповоротливым увальнем сибирских размеров, старательным, но звёзд с неба не хватающим.

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

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

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

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

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

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

В полным соответствии с принципом Парето, 20% кода отняло у меня 80% времени. Тут очень хорошо показал себя Opus 4.5, — поскольку в коде разобраться было сложно, там 40 тысяч строк на ассемблере, он ставил очень много эксприментов, сравнивая два набора файлов между собой — тот, который получался при запуске оригинального GIFLITE.EXE с нашим.

Мы долго не могли добиться бинарной точности результирующих файлов — очень много нюансов, которые влияли на то, что получалось. Вплоть до реализации алгоритма сортировки цветов, функции хеширования и прочих мелких деталей. Восстанавливать детали помог ассемблерный код — в Си некоторые подробности не перенеслись, отчасти из-за таблицы виртуальных функций, которую «Гидра» (r2ghidra) расщёлкать не смогла.

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

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

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

Блики на стёклах

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

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

Выставленные в музее самодельные ножи, кинжалы, пистолет, арматура и шары на чёрном фоне; на стене — документы и фото подозреваемых.
Арсенал одной из казанских банд в казанском музее МВД за стеклянной витриной

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

«Синеглазка»

На одной из фотографий из музея МВД мне попалась книжка «Конец кровавого дьявола» Анеса Батаева — про васильевского маньяка-людоеда. Я и раньше про него слышал — живя в Казани, сложно о нём не узнать, — но не знал, что есть и книга.

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

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

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

Написал я про неё, потому что встретил незнакомое слово:

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

Что за «синеглазка» — я не понял. Тут явно слово в негативном ключе, но я не догадался о чём это.

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

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

«Виола»: предок VRML ★

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

Началось всё с того, что я заметил в браузере едва начатую реализацию тегов, помеченную комментариями как /* vr exp */. В исходном коде нашлась целая группа таких тегов. Назначение некоторых из них, например OVAL или LINE, было вполне очевидным, тогда как то, что в точности могли бы делать некоторые другие теги, например ACTION или BUTTON, было не вполне ясно.

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

Шло время, и вдруг, копаясь в каталогах старого сайта, посвящённого «Виоле», я неожиданно нашёл черновик письма, в котором автор «Виолы» описывал своё видение того, как должен выглядеть VRML.

Скриншот веб-страницы «Proto-VRML Graphics Demo» с примерами: жёлтые фигуры на розовом фоне, треугольник и пятиугольник, простая красная домик с солнцем.
Готовая реализация графики, которая сейчас работает в браузере

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

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

Вот, например, как на этом языке рисуется синий квадрат с тёмно-синим бордюром на светло-сером фоне в координатах x=10, y=20, повёрнутый на 45°:

<GRAPHICS WIDTH=400 HEIGHT=120>
<BGCOLOR NAME="lightgray"></BGCOLOR>
<RECT ID="rect1">
<POS X=10 Y=20></POS>
<SIZE X=70 Y=70></SIZE>
<FGCOLOR NAME="blue"></FGCOLOR>
<BDCOLOR NAME="navy"></BDCOLOR>
<ROT Z=45>
</RECT>

Особенно меня почему-то зацепил атрибут SC о роли которого я бы никогда самостоятельно не догадался. Автор описывал его так:

The SC attribute says that whenever the attributes in this object changes, relay the change to a server that broadcasts the change to all other browsers looking at this object… Have to think about this more…

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

В итоге эту часть я сначала пытался сделать через маковский сервис «Бонжур», но позже переделал на мультикастовый UDP — так работало гораздо быстрее и надёжнее.

Скриншот веб-страницы «ACTION Script Demo - Clickable Shapes» с цветными геометрическими фигурами и описанием их интерактивных свойств (вращение, масштабирование, смена цвета).
Активные объекты, содержащие атрибут SC рассылают свои изменения по локальной сети

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

Пришлось делать специальный таймер, который будит приложение, если ему адресованы интерактивные UDP-пакеты.

Работу я разбил на три части: реализацию графических примитивов, реализацию интерактивного взаимодействия и сетевое взаимодействие.

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

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

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

Скриншот окна браузера ViolaWWW с заголовком «Geometric Art - ViolaWWW Graphics Demo» и геометрической композицией из разноцветных фигур на сером фоне.
Пример с узорами, нарисованный при помощи реализованных графических примитивов

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

«Виола»: протокол NNTP

Из всей той экзотики раннего интернета, которую сейчас уже прочно забыло большинство, — IRC, Gopher, Finger, WAIS и прочего — я больше всего пользовался сетью «Юзнет», работавшей по протоколу NNTP. Это был аналог электронной почты, только сообщения доходили сразу до всех участников выбранной «группы» — что-то вроде общего почтового ящика.

Для тех скоростей, которые тогда были доступны, это был удобный инструмент. Я состоял в нескольких группах; сейчас уже не вспомню каких, но отлично помню наши бесконечные баталии в одной из локальных групп моей альма-матер, где мы спорили с оппонентом о том, что же такое бесконечность — число или понятие. Точку в споре поставил мой научный руководитель, Александр Михайлович Елизаров, заметив, что ответ зависит от того, какой раздел математики мы имеем в виду.

В общем, в 2025-м году, как ни удивительно, этот протокол ещё жив, что я с удивлением обнаружил, начав чинить его поддержку в «Виоле». На скриншоте, например, довольно свежее сообщение в группе comp.sys.mac.misc cервера news.neodome.net.

Почитать группу теперь можно и через «Виолу», запустив её следующим образом:

NNTPSERVER=news.neodome.net ./src/vw/vw news:comp.sys.mac.misc

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

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

Скриншот письма в Viola WWW: тема «Re: [RUMOUR] R.I.P. Mac Pro ??», отправитель Jörg Lorenz, дата 19 ноя 2025, обсуждение неактуальности Mac Pro в эпоху Apple Silicon.

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

Почта Нидерландов

У нас как-то принято ругать «Почту России». Мне, если подумать, ругать её в последние годы совсем не хочется. Её бич только в слабой автоматизации приёма и выдачи посылок. Не знаю почему, но у конкурентов (например, в «Озоне» или «СДЕКе») я не вижу таких адских очередей.

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

На этом фоне почта Нидерландов меня очень разочаровала: у меня из Нидерландов доставляются в Китай часы, потому что только оттуда я смогу отправить их в Россию.

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

Трек-лист посылки: от сбора в Нидерландах (16.11.2025) до прибытия в сортировочный центр Китая (08.12.2025), с этапами таможни, транзита и обработки в PostNL.

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

«Мышастик»: заменим интернет?

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

К сожалению, этого не случится, для этого не хватает двух вещей: скорости и покрытия.

Мышсеть в текущем её состоянии, похожа на пейджинговую — ноды разделились на носимые, которые в меш не входят, то есть они ничего не ретранслируют, и на стационарные — установленные где-нибудь на высоких этажах, которые уже и занимаются ретрансляцией. У меня тоже на окне висит «бумага» (Heltec Wireless Paper) с антенной Моксон.

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

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

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

Скриншот чата в meshBBS: сообщения от Zed9 и bolknote.ru с командами bbslist, приветствием и списком каналов на русском и английском.
Пример общения с одним из ботов

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

В каждой строчке — только точки…

Уверен, кто-нибудь такое уже делал, но мне было лень искать.

Я тут что-то вспомнил строку из песни «в каждой строчке — только точки» и подумал — а много ли слов можно записать азбукой Морзе, если использовать только точки? Взял первый попавшийся словарь, накидал программу на Пайтоне и проверил.

Букв, которые можно записать только точками совсем мало — «е»/«ё» (.), «и» (..), «с» (...) и «х» (....). Поэтому и слов получается очень мало.

Если выкинуть предлоги, союзы и междометия, то остаются только «её» (. .), «их» (.. ....), устаревшие «сих» (... .. ....) и «сие» (... .. .), «сиси» (... .. ... ..), «сисе» (... .. ... .) и самое длинное из найденных — «сессии» (... . ... ... .. ..).

Нейросеть помогла мне составить что-то похожее на осмысленное предложение из этих слов, но много с таким набором не сообщить: «сие — её сессии и их сессии, сии сессии — её сессии, и сии сессии — их сессии, и её сиси, и их сиси; хехе!». Что-то на церковнославянском.

Кстати, дальше в песне есть продолжение: «в каждой строчке — только точки после буквы „л“».

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

Сам я составил (ну) такое: «лих ИИ: их лисе — её лихие сессии и лес, хехе».

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

Программа «Parrot»

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

Для первого компьютера, доступ к которому я получил — «Радио-86РК», я писал какой-то простенький текстовый редактор и интерпретатор машины Тьюринга. Потом, через много лет, понимание как работает эта машина пригодилась мне на курсе Дискретной математики в Университете. Больше программ под него не помню, хотя они точно были.

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

«Паррот» («Parrot» — «попугай») умела записывать в память компьютера звук с самодельного микрофона. У «Спектрума» звукового входа не было, но я его как-то подключил — я тогда довольно неплохо знал как он устроен на уровне «железа».

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

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

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

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

Пиксельный попугай и меню программы PARROT с пунктами: 1) RECORD, 2) PLAY, 3) SAVE FILE, 4) LOAD FILE, 5) QUIT.
Очень условно изображённая программа «Parrot»

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

Украсили кафе к Новому году

Ребята на этой неделе украсили кафе к Новому году. Вчера с женой отвозили туда ёлочные украшения, напечатанные на 3Д-принтере и по случаю сфотографировали как сейчас выглядит украшенное кафе.

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

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

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

Фасад кафе BAO HAUS с красными рамами окон и двери, украшенный зелёными гирляндами с огнями; перед окнами — жёлтые подоконники и синие табуреты, на снегу.

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

Фото кота в NanoKVM

Вчера, пока укладывал дочку, подыскивал почитать что-нибудь интересное на «Хабре» и набрёл на статью «Как я обнаружил скрытый микрофон в китайском NanoKVM». Микрофон там действительно есть и с него даже можно писать звук, но используют ли его китайцы в слежке,.. в общем, тут как в анекдоте — опять эта проклятая неизвестность!

Саму статью я читал невнимательно, потому что в самом её начале написано следующее:

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

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

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

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

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

Ну я и накидал по-быстрому небольшой код, которые делает примерно то же самое и нашёл все джпеги прямо внутри прошивки:

// Это не код для использования в серьёзном продукте, а одноразовая утилита
ini_set('memory_limit', -1);

const SIZE = 256_000;

$bin = file_get_contents($argv[1]);
$len = filesize($argv[1]);

for ($n = $offset = 0; $offset < $len; $offset += 2) {
    $offset = strpos($bin, "\xFF\xD8", $offset);
    if ($offset === false) {
        break;
    }

    $name = sprintf("%d.jpg", ++$n);

    file_put_contents($name, substr($bin, $offset, SIZE));
    @getimagesize($name) or unlink($name);
}

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

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

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

«Пол — это лава»

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

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

Я попросил учителей прислать мне её игру, скачал «Роблокс Студио» и сделал несколько скриншотов.

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

Скриншот Roblox: персонаж Sad Bacon стоит на платформе с радужным объектом, виден интерфейс с надписью «Roblox automatically translates supported languages in chat» и красное небо.

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

Скриншот игры Roblox: персонажи на лавовом поле под красным небом, вверху надпись «Roblox automatically translates supported languages in chat».

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

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

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

Скриншот Roblox: аватар на платформе, надписи «ONLY FOR PLAYERS», «ONLY FOR CUTE ANIMALS», «Congratulations! You Won», «Woooooo!

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

Дочка и шахматы

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

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

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

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

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

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

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

Заблуждения и нейросети

Хочу собрать в одну заметку некоторые важные для меня статьи об общении с большими языковыми моделями (БЯМ).

  1. В статье «Mind Your Tone: Investigating How Prompt Politeness Affects LLM Accuracy» описывается эксперимент исследователей Университета Пенсильвании. Они обнаружили, что импульсивные и грубые формулировки приводят к более высоким показателям точности БЯМ, улучшая результат на несколько процентов;
  1. В статье «One Ruler to Measure Them All: Benchmarking Multilingual Long-Context Language Models» утверждается, что лучшим языком для промптов неожиданно оказался не английский, а польский. Английский занял лишь шестое место. Конечно, необходимо учитывать особенности эксперимента: были выбраны синтетические задачи и использовалось очень большое контекстное окно. Тем не менее, вопреки устоявшемуся мнению, возможно, в некоторых случаях английский язык для промптов — не лучший выбор;
  1. Две работы «When “A Helpful Assistant” Is Not Really Helpful: Personas in System Prompts Do Not Improve Performances of Large Language Models» и «The Impact of Role Design in In Context Learning for Large Language Models» вместе показывают, что задание структуры ответа (то есть подробная инструкция как ответить) в промпте улучшает качество ответа, но, не смотря на сложившуюся практику, задание социальной роли («ты — опытный психолог с 20-летней практикой») либо особо не влияет, либо даже ухуждает результат;
  1. Статья «Lost in the Middle: How Language Models Use Long Contexts» о том, что современные языковые модели, даже с расширенными окнами контекста, не умеют надёжно использовать длинный ввод: их точность резко зависит от позиции релевантной информации и имеет устойчивую U-образную форму — лучше всего модели работают, когда нужные сведения находятся в начале или в конце контекста, и заметно хуже, когда они расположены в середине. Это противоречит интуитивному «давайте напихаем модели побольше данных в промпт, у неё всё равно окно большое».

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

Автостереограмма и роботы

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

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

Я сделал несколько автостереограмм с рисунками, надписями и абстрактными фигурами и попробовал спросить у ЧатГПТ 5.2 что там нарисовано «в глубине». Ожидаемо, кроме галлюцинаций ничего не получил.

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

Оказалось, что если карта глубины почти плоская и пятна на ней очень абстрактные (я использовал близко расположенные буквы), то я могу сосчитать сколько таких «пятен» я вижу на картинке, а ЧатГПТ считает, что «в глубине» ничего нет, пусто.

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

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

Не по дням, а по часам

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

Прогноз погоды с 11:00 до 23:00: облачно с понижением температуры от −9° до −22°, к вечеру ясно и холодно.
Прогноз «Яндекс.Погоды»

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

«Виола»: тянущееся окно

Отложил пока в сторону свой проект до дописыванию браузера «Виола», поскольку исчерпал все токены на своём тарифе в «Курсоре». Там, конечно, остались бесплатные модели («Грок», например), но они годятся только для чего-то очень простого, а я таких задач пока не вижу.

Зато случилось интересное — поиск в интернете принёс видео «Viola www y Erwise dos de los navegadores web pioneros», где какой-то исследователь истории запускает оригинальную «Виолу» в виртуальной машине. Этот видеоролик, наконец, дал мне ответ на вопрос — тянулось окно «Виолы» или нет. Оказывается, тянулось.

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

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

Скриншот веб-страницы «Montage of the 1991 Vintage Viola» с описанием первой версии Viola (0.8) и вставкой «Tiny Play» с анимацией персонажа на сцене.
Кадр из ролика «Viola www y Erwise dos de los navegadores web pioneros» («ViolaWWW и Erwise — два браузера-пионера»)

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

«Мышастик»: ретрансляция

Как я уже писал недавно, казанская сеть «мышастика» (но, может, так везде — не слежу) была недавно реорганизована: ноды разделились на носимые, которые не пересылают чужие сообщения, и стационарные, закреплённые где-нибудь повыше — они нужны для поддержки сети.

Я тоже, следуя тренду, повесил на окно «бумагу» (Heltec Wireless Paper), которую купил с рук по случаю. Это та самая нода, которую я два месяца назад отдавал для ретрансляции на высотном здании в центре. Только у неё теперь другой корпус и антенна, сделанная одним из участников сообщества.

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

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

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

Устройство Waypoint на окне: «Last seen 11:14, ветеран-аватар, 9.8km 311°». Видны заснеженные крыши города.

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

Рисование азбукой Брайля

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

Он есть в Юникоде, поэтому на экране им можно написать что угодно и, как и требуется в песне, там будут только точки. Я тогда подумал, что «что угодно» можно трактовать и шире — если постараться, точками этого шрифта можно выводить в консоли любую графику.

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

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

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

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

Так, к примеру, выглядит картинка с логотипом «Виолы» в этом формате:

#define violaLogo_width 32
#define violaLogo_height 20
static char violaLogo_bits[] = {
   0xe0, 0x03, 0x00, 0x00, 0x18, 0x0c, 0x0f, 0x00, 0xe4, 0x8b, 0x30, 0x00,
   0xfa, 0x8f, 0x4f, 0x00, 0xfa, 0xff, 0xff, 0x00, 0xfd, 0xff, 0xff, 0x50,
   0xfd, 0x2f, 0xe9, 0xff, 0xfd, 0x07, 0x00, 0x00, 0x7d, 0xfc, 0xff, 0x50,
   0xbd, 0xfd, 0xff, 0x00, 0xba, 0x3b, 0x7f, 0x00, 0x3a, 0xdb, 0x1e, 0x00,
   0x7c, 0xd7, 0x00, 0x01, 0x78, 0xd6, 0x06, 0x19, 0xe0, 0xce, 0x00, 0x25,
   0x00, 0xcc, 0x32, 0x21, 0x00, 0xd8, 0x5a, 0x39, 0x00, 0xf0, 0x6a, 0x25,
   0x00, 0x60, 0x32, 0x79, 0x00, 0x00, 0x00, 0x00};

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

load_xbm() {
    local file="$1" hex h

    W=$(awk '/^#define.*_width/ {print $3;exit}' "$file")
    H=$(awk '/^#define.*_height/{print $3;exit}' "$file")
    BPR=$(( (W + 7) / 8 ))

    for h in $(sed -n '/{/,/}/{/{/d;s/}.*//;s/0x//g;y/,/ /;p;}' "$file"); do
        BYTES+=($[16#$h])
    done
}

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

Открытый блокнот с записями: двоичные числа, шестнадцатеричные коды (0E 89, FA 128, FD 148, DD 234) и временные метки на страницах с линиями.
Блокнот с моими попытками объяснить себе как будут выводиться точки

В итоге получился небольшой скрипт, в котором, если убрать все пустые строки, около полусотни строчек. Я его выложил, как водится, на «Гитхаб».

Скриншот терминала: конвертация XBM-файлов в Брайль с помощью утилиты xbm2br (violaLogo.xbm и WWW.xbm)
Пример вывода двух картинок, взятых из набора браузера «Виола»

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

XBM vs. Брайль

Мне в комментариях к предыдущей заметке задали в вопрос — а насколько графика, представленная шрифтом Брайля, проигрывает по размеру формату XBM? Я прикинул, что должна даже выигрывать — всё-таки XBM весьма многословный формат, предназначенный, прежде всего, для встраивания картинок в программы на языке Си.

Давайте посмотрим на какую-нибудь небольшую картинку:

#define bullet_width 7
#define bullet_height 7
static char bullet_bits[] = {
   0x1c, 0x3e, 0x5f, 0x3f, 0x5d, 0x2a, 0x14};

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

В итоге размер файла можно примерно оценить на как 77 + 7×7/(8/5) ≈ 107 байт. В реальности чуть больше из-за форматирования.

Если же перевести эту картинку в шрифт Брайля, то всё получится куда компактнее. Каждый символ шрифта занимает три байта и кодирует сразу восемь точек (2×4), плюс надо учесть в расчётах переводы строк: ceil(7/4) × (ceil(7/2) × 3 + 1) = 26 байт.

А есть ли условия, при которых XBM был бы компактнее его представления в Брайле?

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

Я наугад выбрал разрешение 1×100 и угадал: 77 + 1×100/(8/5) ≈ 140 байт против ceil(1/4) × (ceil(100/2) × 3 + 1) = 151 байт.

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

lhs <- \(w, h) ceiling(w/4) * (3 * ceiling(h/2) + 1)
rhs <- \(w, h) 77 + (5 * w * h) / 8

holds <- \(w, h) lhs(w, h) > rhs(w, h)

W <- 500
H <- 500

min_h <- \(w) { i <- which(holds(w, 1:H))[1]; if (is.na(i)) NULL else i }
min_w <- \(h) { i <- which(holds(1:W, h))[1]; if (is.na(i)) NULL else i }

for (w in 1:W) {
  if (is.null(h <- min_h(w))) break
  cat(sprintf("w = %d, h min = %d\n", w, h))
}

for (h in 1:H) {
  if (is.null(w <- min_w(h))) break
  cat(sprintf("h = %d, w min = %d\n", h, w))
}

Получились следующие значения:

w = 1, h min = 87
w = 2, h min = 299
h = 1, w min = 201

То есть картинки 1×87, 2×299 и 201×1 (бо́льшую сторону можно увеличивать, это увеличит разрыв) занимают в Брайле больше, чем в XBM. В реальности это не точные границы, так как внутри XBM указывается название картинки, которое может быть разного размера.

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

Стар ли пятидесятилетний человек?

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

Статья «Обо всем»: профессора Краузе, Поляманн, Камп и Лео-Цейтлин подтверждают, что в 50 лет достигаются вершины умственного и физического развития.
Вырезка из «Журнала-Копейки», № 35 за 1913 год

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

Сериал «Кибердеревня»

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

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

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

На стоп-кадре, приложенном к заметке одна только киберстарушечка с детьми чего только стоит. А уж «блин» со старенького НЖМД в качестве навершия для посоха киберпрововедника заставил меня улыбаться, как доброму знакомому, которого не видел сто лет. Многие видели эти «блины» на домах в качестве антенн для телевизора.

Кстати, на верхней границе кадра на роботе-коротыше Робогозине едва виден ставший знаменитым уже свитер, реплику которого я тоже себе когда-то купил.

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

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

Группа людей с коробками вместо голов стоит на свалке металлолома, глядя на крупного робота в центре кадра.

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

Мне ЖЖ заблокировали

Случайно выяснил под Новый год, что мой аккаунт в Живом Журнале заблокировали. Из-за чего точно я не знаю, но предполагаю, что из-за ввода новых правил. Вкратце они таковы: либо плати, либо деанонимизируйся, либо вали. Платить я не хочу, а деанонимизацию считаю бесполезной тратой времени, с чего бы мне её делать?

Я в Журнал уже сто лет ничего не пишу, да и весь контент (кроме, к сожалению, комментариев) я перенёс сюда. Правда у меня туда настроена трансляция и были какие-то ребята, которые мне что-то интересное писали в комментариях. Видимо им там было удобнее, надеюсь они меня не потеряют.

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

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

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

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

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

Добавлено 20.01.2026: в итоге, техподдержка мне всё же ответила и журнал разблокировали. Блокировку объяснили тем, что мой «аккаунт был помечен как потенциальный источник активности, направленной на поисковую оптимизацию, и поэтому его действие было приостановлено».

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

Прабабушкина сберкнижка

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

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

Мне было 22 года, когда 19 ноября 1999 года она умерла в возрасте 96 лет. Я тогда уже жил в Казани и на похороны не приехал. Через восемь лет, в 2007-м умерла и её дочь, бабушка Таня. Дом продали чужим людям и сейчас, приезжая в Лениногорск, мы почти всегда до него доезжаем.

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

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

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

Обложка советской сберегательной книжки с гербом СССР, надписью «СБЕРЕГАТЕЛЬНАЯ КНИЖКА» и названиями на языках республик СССР.
Обложка книжки, слова «Сберегательная книжка» написаны на языках различных республик СССР
Страница счёта Государственной трудовой сберегательной кассы Министерства финансов СССР, выданная в Ленингороде вкладчику Е. Н. Стрелковой, касса № 4662/07, счёт № 4114, 195 г.
По всему видно, что книжка выпущена в 1950-х годах. Как же эстетично всё сделано!
Счёт №3: операции 1960 г., приход 1400 руб., расход 20+28+45=93 руб., остаток 42 руб. 44 коп., подписи контролёра и кассира.
Деноминация и реформа 1961-го года. В моём детстве ещё ходили монеты старого образца до 1961 года, их можно было иногда получить на сдачу в магазине
Разворот сберкнижки СССР: страница 10 с операциями и остатком, страница 11 со счетом №4114, расходом, остатком и штампом «Пересчитано на 01.01.98 г. в новом масштабе цен».
Деноминация 1998-го года, отлично помню как мои невеликие лаборантские 54000 в месяц превратились в 54 рубля. Это последние записи

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

«Нанабанана» и реставрация фото

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

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

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

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

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

Слева — сильно повреждённая старая чёрно-белая фотография трёх девочек на фоне листвы; справа — её цифровая реставрация без трещин и потёртостей.

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

Кокотизация

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

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

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

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

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

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

Размытый мужчина в жёлтом худи поднимается по лестнице с чёрным ограждением в светлом помещении с белыми батареями.

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

← сюда туда →