«Виола»: предок VRML ★
Недавно завершил в «Виоле» большую работу: реализацию раннего черновика стандарта VRML. VRML
Началось всё с того, что я заметил в браузере едва начатую реализацию тегов, помеченную комментариями как /* vr exp */. В исходном коде нашлась целая группа таких тегов. Назначение некоторых из них, например OVAL или LINE, было вполне очевидным, тогда как то, что в точности могли бы делать некоторые другие теги, например ACTION или BUTTON, было не вполне ясно.
Можно было бы реализовать только понятные части, но я тогда просто отложил эту задачу в сторону, тем более что она казалась пугающе сложной.
Шло время, и вдруг, копаясь в каталогах старого сайта, посвящённого «Виоле», я неожиданно нашёл черновик письма, в котором автор «Виолы» описывал своё видение того, как должен выглядеть VRML.
Там раскрывалось значение всех ключевых тегов из вышеуказанной группы, их атрибутов, а также интерактивная часть — причём в двух вариантах: декларативном (через теги) и скриптовом (через язык «Виолы»).
Вкратце суть такова: теги описывают графические примитивы и их вид на странице. С некоторыми из них через активные элементы можно взаимодействовать, меняя их атрибуты.
Вот, например, как на этом языке рисуется синий квадрат
<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>Особенно меня
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 — так работало гораздо быстрее и надёжнее.
Поскольку я тестировал у себя на ноутбуке, запуская два экземпляра браузера, столкнулся и с другой проблемой — стоило убрать курсор с одного из окон, и оно переставало перерисовываться. Оказалось, это особенность оконного фреймворка, на котором построено приложение: так сделано для экономии процессорного времени.
Пришлось делать специальный таймер, который будит приложение, если ему адресованы интерактивные UDP-пакеты.
Работу я разбил на три части: реализацию графических примитивов, реализацию интерактивного взаимодействия и сетевое взаимодействие.
На всё ушло несколько дней интенсивной работы с нейросетью «Опус 4.5». Пришлось даже немного переделать парсер тегов внутри браузера. Несмотря на то, что работа двигалась трудно, отчаяния я не испытывал — было видно, что при работе в паре с «Опусом» эта задача вполне мне по силам.
На настоящий момент всё работает, так, на мой взгляд, как и задумывалось, за исключением декларативной части предлагаемого черновика.
«Синеглазка»
На одной из фотографий из музея МВД мне попалась книжка «Конец кровавого дьявола» Анеса Батаева — про васильевского
Вообще я не люблю такое читать, но тут заинтересовало: как вообще, не умирая от голода, можно дойти до того, чтобы есть людей? Что творится в голове таких людей?
Честно сказать, книга оказалась сомнительная во всех смыслах — бандиты там чуть ли не стихами разговаривают, и одно это уже показатель. Поэтому и мотивация этого людоеда раскрывается в стиле ранних фильмов про злодеев — «я — часть той силы, что вечно хочет зла».
Написал я про неё, потому что встретил незнакомое слово:
Уже который день Леха чуть ли не на глазах Дины беззастенчиво занимался с Надькой любовью, а на нее, Дину, не обращал внимания. И все время подчеркивал, что Надя —
не какая-нибудь «синеглазка», а очень даже «приличная дамочка».
Что за «синеглазка» — я не понял. Тут явно слово в негативном ключе, но я не догадался о чём это.
Оказывается, всё,
Блики на стёклах
Видя, как нейросеть «Нанабанана» легко справляется с бликами на стекле, подумал, что мне бы хотелось и в моём смартфоне иметь эту функцию — «убрать блики». Я много фотографирую в музеях, где многое за стеклом, но стесняюсь бликов, мне кажется, что они сильно портят получившееся фото.
Сейчас я иногда прогоняю такие фотографии через нейросеть, но,
Обратная разработка GIFLITE.EXE ★
Вчера мучился бессонницей, нужно было
В случае GIF очень хорошо помогала известная утилита GIFLITE.EXE — коммерческая разработка компании «Вайт Ривер Софтвейр» (White River Software), которая, по всей видимости, давно исчезла, так как я про неё ни в какой другой связи никогда ничего не слышал.
Утилита была под DOS, но я тогда работал под «Виндой» и проблем это не создавало, но позже, когда я пересел на «Мак», пользоваться ей стало неудобно. Тем не менее я всё равно ей ещё долго пользовался через всякие эмуляторы.
Она всегда меня интриговала — было интересно что она вообще такое делает, как ей удаётся уменьшить размер гифа и чем отличаются её методы сжатия, которые задаются ключом -m.
В общем, раз уж не спалось, я провёл давно запланированный эксперимент, к которому всё никак не мог найти времени приступить — имея на руках только бинарный файл старой программы, воссоздать её на другой платформе. Довольно актуальная задача, кстати, я знаю, что у некоторых людей есть программы без исходного кода, которые они вынуждены запускать на давно устаревших компьютерах.
Забегая вперёд, хочу сказать, что эксперимент удался — программа создаёт в точности такие же GIF-файлы во всех режимах и я, кстати, получил ответ на свой вопрос — бо́льшая часть методов в ней объединяет близкие цвета, уменьшая файл за счёт этого.
А теперь, немного подробностей.
Opus 4.5 показался смелым исследователем, который идёт к цели, не пасует перед проблемами. Если
Grok Code — торопыга, который как будто считает себя чересчур способным, много фантазирует, принимая свои фантазии за реальность и вообще слишком некритично, без рассуждений всё воспринимающий.
Сначала я дизассемблировал код, но это поначалу мало помогло — видно было, что нейросети пытаются «нащупать» в получившемся коде границу функций, чтобы разобраться с ними по отдельности, но не могут. Но позже этого код пригодился — чтобы восстанавливать логику более точно.
Потом я установил radare2 с плагином r2ghidra и нарезал бинарный файл на сишные функции. Код восстановился плохо, с лакунами, поэтому я запустил отдельную сетку, которой буквально по шагам объяснял что делать. Основная идея — довести сишный код до читаемого состояния, разбираясь с функциями от самых коротких к более длинным.
Для этого мы сначала разобрались с таблицей виртуальных функций внутри ассемблера, после чего дело пошло веселей. Заняло это несколько часов интенсивной работы с нейросетями, по ощущениям выглядело как парное программирование.
Параллельно, в другом окне другой экземпляр нейросети писал основной костяк кода, попутно разбираясь с проблемами, туда я заглядывал редко, но без моего внимания то окно тоже не обходилось.
В полным соответствии с принципом Парето, 20% кода отняло у меня 80% времени. Тут очень хорошо показал себя Opus 4.5, — поскольку в коде разобраться было сложно, там 40 тысяч строк на ассемблере, он ставил очень много эксприментов, сравнивая два набора файлов между собой — тот, который получался при запуске оригинального GIFLITE.EXE с нашим.
Мы долго не могли добиться бинарной точности результирующих файлов — очень много нюансов, которые влияли на то, что получалось. Вплоть до реализации алгоритма сортировки цветов, функции хеширования и прочих мелких деталей. Восстанавливать детали помог ассемблерный код — в Си некоторые подробности не перенеслись, отчасти
Я очень доволен тем, как прошёл эксперимент. Очень интересный опыт и результаты воодушевляющие. Код, как обычно, можно увидеть на «Гитхабе».
JOPA: Javac One Patch Away
Пока я тут использую нейросети для развлечения, некоторые ребята пробуют их
Это может быть нужно, например, для «бутстрапинга» — когда нужно с «нуля», из исходников собрать
Я попробовал у себя собрать этот компилятор. Сходу не удалось, но дописанное нейросетью можно нейросетью и запустить. В общем, пять минут и всё получилось.
Правда, на моём тестовом примере JOPA упала с ошибкой при попытке открыть rt.jar (это главный архив стандартной библиотеки), но это удалось решить, просто распаковав его рядом.
В общем, вывод такой: проект интересный, но это не полная JOPA, только компилятор, хотя и работоспособный, поэтому запустить скомпилированную в class программу нечем. У себя я запускал системной Джавой.
Добавлено позднее: за такое меня ещё не благодарили,
Инсталлятор «Виолы»
Вчера я хотел
Так как с собой пришлось тащить ещё и «Кварц» (XQuartz), то лучшим выбором был dmg — файл с монтируемой файловой системой. Хорош он тем, что просто делается и легко стилизуется. Я, например, сделал внутри обои, вдохновлённые внешним видом браузера и поместил портрет автора с его старой домашней странички.
Для сборки сделал две новые цели — make app для сборки самого приложения и make dmg для сборки инсталлятора.
Больше всего, конечно, пришлось помучаться с приложением — чтобы пользователь потом не ставил сторонний софт, я перенёс все бинарные зависимости внутрь, переписав пути. Вообще, весь инструментарий для этого уже существует, но в случае утилиты magick из пакета ImageMagick пришлось делать отдельную компиляцию, чтобы сделать бинарник перемещаемым.
Нейросеть, которая мне это всё готовила, в этом месте зациклилась, пытаясь разобраться как готовый бинарник унести внутрь так, чтобы он заработал, хорошо что я быстро увидел, а то бы мне это обошлось в копеечку.
Добавлено позднее: код собран по процессоры АРМ и под «МакОС» 26.
«Виола» или «ВиолаВеВеВе»?
Как вы уже заметили, я упоролся по браузеру «Виола» и, похоже, перемкнуло меня надолго. Тем лучше! Давно у меня не было хобби
Вопрос, который меня интересовал — правильно ли я вообще называю эту программу? Для меня это важно.
Дело в том, что «Виола» — это язык программирования, а не сам браузер. Например, вся обработка тегов внутри написана на этом языке. Его название расшифровывается как «Visually Interactive
Браузер же правильно называется «ViolaWWW». Но называть его так очень неудобно, на редкость неуклюжее название, поэтому я почти всегда называю его «Виола». И мне подумалось, что неплохо бы выяснить как его называли в прессе во времена, когда он ещё не стал частью истории.
В общем, не мне одному было жалко ломать язык — например, в журнале «Internet World Magazine» за апрель 1995 года он тоже называется «Виола», значит всё в порядке.
Музей МВД
Вчера побывал в казанском музее МВД. Давно хотел попасть, а у тут оказия: недавно оказал сотрудникам этого ведомства профессиональную услугу и в качестве ответного жеста они, зная мой интерес, пригласили побывать в их музее.
Фотографии выкладывать не буду — их уж чересчур много, про каждую хочется рассказать, поэтому побуду буридановым ослом и не выберу ничего. Разве что одну фотографию для привлечения внимания.
Смог приехать только на полчаса — пришлось потратить на это свой обед, другого времени не было и этого оказалось очень мало. Я ожидал довольно скромного по размерам музея, а тут два этажа, по которым до обидного быстро пришлось пробежаться.
При этом и экскурсовод не подкачал — историй про музей и его экспонаты — многие десятки, так бы слушал и слушал. Особенно
Если вы живёте в Казани и знаете как в этот музей попасть «с улицы», сходите, не пожалеете. Только рассчитывайте
«Виола» и самолёты: коррективы
Надо бы мне ещё вернуться к теме отображения «Виолой» самолётов. Пока я поправил только масштаб — заметил, что на старых скриншотах, снятых автором этого браузера
Но всплыла и ещё одна проблема — иногда «крутилки» как будто меняют ось, вокруг которой они крутят объект, при этом в терминале я вижу многочисленные ошибки следующего вида:
violaIdleEvent(): select() error: : Bad file descriptorКак будто браузер теряет соединение со своим бэкендом для отрисовки моделей и вращение рассинхронизируется. Как только научусь стабильно повторять эту проблему, попробую поправить.
«Виола» и моя мечта: как ИИ снова мне помог ★
Вступление
Я, как вы знаете, довольно давно уже реставрирую браузер «Виола» из недописанных исходников. И была у одна мечта, связанная с ним: увидеть как в нём работает вращение трёхмерной модели самолёта.
Узнал я об этом из статей о судебной тяжбе компаний «Микрософт» и «Иолас» (Eolas), начавшейся
Компания «Иолас» утверждала, что первой разработала и внедрила технологию «встроенных объектов и плагинов»
Тема широко освещалась в прессе и в некоторых из статей есть статичный скриншот того как это выглядело. Кроме того, сохранился код страницы с программой на языке «Виола». Казалось бы — почти всё что нужно!
Что мешало
Но оказалось, что исполнению моей мечты мешало несколько обстоятельств.
Вопрос №1: где взять V-Plot ?
По всей видимости, в открытых источниках его не найти — сколько не запускал я невод глубокого поиска нейросетями, ничего не вышло. Тогда я решил пойти от обратного — у нас есть скрипт на «Виоле», который должен слать этой программе
Без особой надежды я дал нейросети такое задание и пошёл заниматься делами. Через
Оказалось, что специальный «объект» TTY «Виолы» для взаимодействия с программами, которые могут выводить графику в окно браузера, реализован только для «Линукса», а для «МакОСи» (в «Виоле» встречаются куски для очень старой версии этой операционной системы) код реализован не был.
Я как можно тщательнее, как зловредному джину, описал что именно хочу получить и опять переключился на свои дела. И вот тут, когда я без особой надежды вернулся через
Здо́рово! Но где же мои самолётики?
Настал момент узнать откуда же брались самолёты. Оказалось, что «Виола» передаёт на вход
Ориентируясь на приметное имя x29.geom, я решил поискать эту модель, вдруг это
Модель действительно оказалось известной — её
ChatGPT оказался полезен тем, что правильно идентифицировал модель и рассказал её историю, но сам файл нашёлся банальным поиском по интернету.
Дальше нейросети меня опять удивили — посмотрев на мой найденный файл, сеть для программирования «Опус 4.5», не моргнув глазом, написала мне
Отлично! А что со второй моделью?
Со второй моделью так гладко не вышло — как я ни старался, ничего путного по слову TomCat на нашёл. Решил смириться и найти хоть
Тут наконец пригодился глубокий поиск — нашёлся архив внутри которого лежала модель самолёта
Я, было загрустил, но тут решил попробовать уже совсем безумную штуку — натурально попросить нейросеть написать мне конвертор из формата IOB в OFF, причём без описания самих форматов. Самое смешное, что это сработало, причём с первого раза! Получившаяся модель сразу появилась в окне и заработала!
Выводы, или Что меня удивило
Лёгкость к которой нейросеть провела обратную разработку команд, написала интерпретатор команд для
Конечно, у меня осталось ещё много задач даже в этом проекте, которые нейросети либо не могут решить самостоятельно, либо даже с моей помощью.
Тем не менее, та работа, которую я проделал над браузером при помощи нейросетей, совершенно неподъёмна для человека в такие короткие сроки.
Звуки в «Виоле»
Как я уже писал, анимацию в «Виоле» можно получить, задействовав скриптовый язык, а что же со звуком?
Из скриптового языка доступны только две функции — bell() издаёт системный «бип» и bellVolume(), позволяющая задавать или получать громкость этого «бипа» в процентах. Функций немного, но и их пришлось чинить — они обе используют вызов XBell(), который на «МакОСи» не работает испокон веков.
Пришлось примотать небольшой код на
Что касается HTML, отдельного тега нет, но небольшими ухищрениями можно заставить проиграть браузер любой файл, имя которого кончается на .au — этот файл передаётся маковской утилите afplay, а она умеет играть файл в целой куче аудиоформатов.
Каноничнее, конечно, использовать именно формат au, тем более, что в него аудио можно преобразовать большинством современных утилит, той же ffmpeg, например.
Так как же проиграть звук из HTML?
Самый простой способ — поставить на аудиофайл ссылку. При переходе на неё файл проигрывается, а не скачивается. Способ позанятнее — использование тега INSERT, аналога современного IFRAME. Он проиграет файл при открытии страницы, а если использовать атрибут AFTER, то ещё и зациклит его с указанной в миллисекундах задержкой.
Так как звук играется асинхронно, в теории, можно было писать игры или делать сайты с фоновой музыкой, для этого уже всё было готово. А если учесть, что скриптовый язык позволяет запускать что угодно (с безопасностью у этого браузера явные проблемы), то можно, запуская ту же утилиту afplay, организовать звуковые эффекты.
«Виола» и организация закладок
«Виола», конечно, глубже любой кроличьей норы — со временем всё больше и больше похороненных идей удаётся находить в её внутренностях. Вчера ночью, просматривая код незавершённых и закомментированных пунктов меню, я заметил интересное место — недописанный интерфейс каталога закладок.
Степень готовности там оказалась очень высокой, поэтому я решил оживить этот фрагмент. В «Виоле» уже есть его конкурент — «Hot List», позволяющий хранить закладки плоским списком. Но «Hot List» куда проще и примитивнее. В отличие от него, каталог позволяет создавать папки и перетаскивать закладки, визуально организуя их так, как больше нравится пользователю.
Несмотря на то, что кажется логичным перетаскивать закладку в папку, чтобы туда её перенести, такого автор, к сожалению, не задумывал — в комментариях к незавершённым кускам достаточно подробно описана логика перетаскивания. Чтобы не нарушать аутентичность, я тоже это не реализовывал.
Я вообще стараюсь придерживаться авторского замысла, но есть тут два места, где мне пришлось придумывать
«Редачить»
А ещё мне слово «редачить» не нравится. Это усечённое «редактировать», если вдруг не сталкивались. Появилось не так давно, но уже прочно сидит в речи многих.
Похоже это
Кажется, что таких слов немного, но если порыться в памяти, оказывается, что их очень прилично и становится всё больше: «редактировать» → «редачить», «блокировать» → «блочить», «комментировать» → «комментить», «регистрировать» → «регать», «администрировать» → «админить», «фотографировать» → «фоткать», «компилировать» → «компилить», «тестировать» → «тестить», «сканировать» → «сканить», «генерировать» → «генерить» ну и так далее.
Как ломается спагетти
Если вам кажется, что эта пачка спагетти нарисована ИИ, то вам кажется. На самом деле это реальный снимок, который я пропустил через нейросеть, чтобы стереть все признаки бренда. По пути он потерял детализацию фона, поэтому смотрится настолько искусственно.
Сегодня я узнал, что могу купить пачку спагетти ради науки сломать сухую спагеттину на две части, держась за её концы и медленно их сближая, нельзя, если не применить одну хитрость. Эффект даже изучали учёные.
Оказывается, когда спагеттина ломается, по ней распространяются механические волны, которые заставляют ломаться её ещё по меньшей мере один раз. Чтобы этого избежать надо её скрутить. Для этого я купил пачку спагетти (дома их не оказалось) и попробовал.
Получается примерно один раз из десяти — я либо скручиваю слишком сильно и спагеттина ломается даже раньше, чем я начинаю её изгибать, либо слишком слабо и она разлетается на несколько кусков. Но иногда удаётся поймать нужное натяжение и спаггети ломается как надо — на две части.
Пойду собирать с пола улетевшие куски.
Цвет и трёхмерная печать
Меня тут спросили, почему на сайтах, где публикуют модели для трёхмерной печати, всё такое разноцветное, а все модели, которые я показываю, напечатаны одним цветом.
Но вообще это отчасти правда — в основном то, что печатается у нас дома, печатается в одном цвете. Почему? Причины две.
Честно сказать, платить за «стандартный» пластик в три раза дороже меня немного душит жаба, но недавно я с ней договорился и купил две катушки фирменного пластика от того же производителя, что и принтер. На фотографии жёлтый пластик — как раз из этой катушки. Может в будущем буду печатать с большим количеством цветов чаще.
Походы и кофе
Полгода назад я купил походную кофеварку и с тех пор в каждый наш с друзьями поход беру её с собой. Приятно выпить чашечку хорошего кофе посреди
Кстати, мой глаз, который я чуть себе не выбил, закрывая походный сезон, пришёл в норму чуть больше чем через неделю. Последствий как будто бы не осталось — по крайней мере, ничего необычного я больше не замечаю.
Но рассказ про кофеварку.
Единственный её минус — коробка, в которой я её таскал. При покупке я сделал глупость — взял комплект попроще, без бокса. Оказалось, что это очень неудобно — таскать в поход
В общем, после очередного «надо бы
Противные словосочетания
Бывает ли у вас такое, что
У меня так, например, с сочетаниями «писать картину» и «слышать парфюм». Не знаю, есть ли тут
Чтобы их сказать, мне надо сделать внутреннее усилие. При этом написать я их могу вполне свободно, но обычно не пишу, — поскольку в моей устной речи их нет, то нет и в письменной.
Я почему это вспомнил, мне сейчас кабинет оформляет художница, которая
На одной из стен будут висеть фотографии моих предков, и среди них — эта картина. Она будет напоминать мне о тех, кто там жил — не в усадьбе, а в этом сельце, — раз уж ни их фотографий, ни их портретов у меня нет.
Соответственно, мы всё это очень активно обсуждаем. И каждый раз, когда я потом перечитываю наш с этой художницей последний диалог (есть у меня такая привычка), спотыкаюсь об своё «нарисовать картину». Спросить
Говорят капитаны дальнего плавания очень обижаются, если об их судне не сказать «ходит». Я был знаком с одним,
В общем, надо бы
Искусство рисования графиков
Лет двадцать назад широко известный в Казани дизайнер С. Н. показывал мне буклет, который он делал для некой нефтяной компании. Его задачей было по возможности так нарисовать графики, чтобы продемонстрировать значительные успехи по всем показателям. Тем буклетом можно было гордиться: умело используя различные известные оптические иллюзии, С. Н. нарисовал графики так, что рост мерещился даже там, где ситуация была прямо противоположной.
К чему я это вспомнил? Компания «Антропик» выпустила релиз новой пишущей код модели «Опус 4.5». На графике, по которому я утром за завтраком мазнул глазами, мне померещился очень заметный рост точности, отчего я провёл в предвкушении весь день: планировал засесть вместе с нейросетью за задачку посложнее и посмотреть, как она справится.
Когда я ближе к вечеру рассмотрел график внимательнее, обнаружил, что точность повысилась менее чем на 4%. Всякий рост — это хорошо, но 4% — это, конечно, не вау.
Пластик «НИТ»
Надо взять себе на заметку никогда не покупать пластик «НИТ». Рейтинг на «Озоне» — 4,8, куча довольных клиентов, а я не доволен.
За всю историю владения трёхмерным принтером мне пришлось единственный раз его разбирать — после печати синим пластиком PLA этой компании. На днях попробовали печатать голубым пластиком, тестовая полоса (на фото) неравной толщины, рваная. Модель в двух местах расплылась. В общем, плохой пластик, не рекомендую.
Я у соседа по дому PETG покупаю, у него собственное производство, он его продаёт на бумажных втулках, выглядит неприглядно, но я потратил уже не один килограмм, никаких нареканий.
«Нана-банана» и Мурзик
Продолжаю смотреть на что годится
В качестве следующего теста я попросил нейросеть нарисовать Мурзика — кота, который был у меня в детстве. Набор опорных изображений я сформировал из нарезки мутноватого видео сорокалетия папы, где Мурзика видно пару секунд и своего детского рисунка.
Долго я не экспериментировал, сделал две генерации, да и промпт написал довольно простенький:
На этом рисунке и кадрах из видео есть кот. Надо посмотреть его особенности и сделать фоторелистичного кота. В точности повтори окрас кота, позу на рисунке и все особенности, которые можно рассмотреть.
Но что я могу сказать.
Минусы — поза немного другая, не как на рисунке, но самое главное — немного отличается окрас. На моём рисунке пятно на спинке соединено с хвостом,
При этом, учитывая с какой лёгкостью
И хоть впереди ещё более сложный тест, уже можно сказать, что