программирование
«Виола»: протокол NNTP
Из всей той экзотики раннего интернета, которую сейчас уже прочно забыло большинство, — IRC, Gopher, Finger, WAIS и прочего — я больше всего пользовался сетью «Юзнет», работавшей по протоколу NNTP. Это был аналог электронной почты, только сообщения доходили сразу до всех участников выбранной «группы» —
Для тех скоростей, которые тогда были доступны, это был удобный инструмент. Я состоял в нескольких группах; сейчас уже не вспомню каких, но отлично помню наши бесконечные баталии в одной из локальных групп моей
В общем,
Почитать группу теперь можно и через «Виолу», запустив её следующим образом:
NNTPSERVER=news.neodome.net ./src/vw/vw news:comp.sys.mac.miscУказывать сервер таким образом не слишком удобно, но в те годы, видимо, способа лучше ещё не придумали. Позже придумали схему урлов, где можно указать сервер и,
Учитывая, сколько мне пришлось исправить багов за это время, я думаю — не в их ли количестве была причина того, что «Виола» проиграла своим конкурентам? Возможно автор, учитывая заложенные, но не реализованные тут возможности, просто не имел сил заниматься всем — и править баги, и дописывать всё что нужно?
«Виола»: предок 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 программу нечем. У себя я запускал системной Джавой.
Добавлено позднее: за такое меня ещё не благодарили,
«Виола» и самолёты: коррективы
Надо бы мне ещё вернуться к теме отображения «Виолой» самолётов. Пока я поправил только масштаб — заметил, что на старых скриншотах, снятых автором этого браузера
Но всплыла и ещё одна проблема — иногда «крутилки» как будто меняют ось, вокруг которой они крутят объект, при этом в терминале я вижу многочисленные ошибки следующего вида:
violaIdleEvent(): select() error: : Bad file descriptorКак будто браузер теряет соединение со своим бэкендом для отрисовки моделей и вращение рассинхронизируется. Как только научусь стабильно повторять эту проблему, попробую поправить.
«Виола» и моя мечта: как ИИ снова мне помог ★
Вступление
Я, как вы знаете, довольно давно уже реставрирую браузер «Виола» из недописанных исходников. И была у одна мечта, связанная с ним: увидеть как в нём работает вращение трёхмерной модели самолёта.
Узнал я об этом из статей о судебной тяжбе компаний «Микрософт» и «Иолас» (Eolas), начавшейся
Компания «Иолас» утверждала, что первой разработала и внедрила технологию «встроенных объектов и плагинов»
Тема широко освещалась в прессе и в некоторых из статей есть статичный скриншот того как это выглядело. Кроме того, сохранился код страницы с программой на языке «Виола». Казалось бы — почти всё что нужно!
Что мешало
Но оказалось, что исполнению моей мечты мешало несколько обстоятельств.
Вопрос №1: где взять V-Plot ?
По всей видимости, в открытых источниках его не найти — сколько не запускал я невод глубокого поиска нейросетями, ничего не вышло. Тогда я решил пойти от обратного — у нас есть скрипт на «Виоле», который должен слать этой программе
Без особой надежды я дал нейросети такое задание и пошёл заниматься делами. Через
Оказалось, что специальный «объект» TTY «Виолы» для взаимодействия с программами, которые могут выводить графику в окно браузера, реализован только для «Линукса», а для «МакОСи» (в «Виоле» встречаются куски для очень старой версии этой операционной системы) код реализован не был.
Я как можно тщательнее, как зловредному джину, описал что именно хочу получить и опять переключился на свои дела. И вот тут, когда я без особой надежды вернулся через
Здо́рово! Но где же мои самолётики?
Настал момент узнать откуда же брались самолёты. Оказалось, что «Виола» передаёт на вход
Ориентируясь на приметное имя x29.geom, я решил поискать эту модель, вдруг это
Модель действительно оказалось известной — её
ChatGPT оказался полезен тем, что правильно идентифицировал модель и рассказал её историю, но сам файл нашёлся банальным поиском по интернету.
Дальше нейросети меня опять удивили — посмотрев на мой найденный файл, сеть для программирования «Опус 4.5», не моргнув глазом, написала мне
Отлично! А что со второй моделью?
Со второй моделью так гладко не вышло — как я ни старался, ничего путного по слову TomCat на нашёл. Решил смириться и найти хоть
Тут наконец пригодился глубокий поиск — нашёлся архив внутри которого лежала модель самолёта
Я, было загрустил, но тут решил попробовать уже совсем безумную штуку — натурально попросить нейросеть написать мне конвертор из формата IOB в OFF, причём без описания самих форматов. Самое смешное, что это сработало, причём с первого раза! Получившаяся модель сразу появилась в окне и заработала!
Выводы, или Что меня удивило
Лёгкость к которой нейросеть провела обратную разработку команд, написала интерпретатор команд для
Конечно, у меня осталось ещё много задач даже в этом проекте, которые нейросети либо не могут решить самостоятельно, либо даже с моей помощью.
Тем не менее, та работа, которую я проделал над браузером при помощи нейросетей, совершенно неподъёмна для человека в такие короткие сроки.
Внешний вид браузера «Виола»
Если вы приглядывались к браузеру «Виола» на моих многочисленных скриншотах, могли заметить, что он выглядит
На деле всё обстояло даже хуже — в нулевом состоянии в этих местах были прописаны заглушки, по которым сразу становилось понятно, что это не интерфейс, а нечто временное.
Мне от этого делалось грустно — я люблю красивый дизайн, а тут такое уродство. Но оказалось, что внутри кода браузера есть закомментированные недописанные куски, в которых можно подглядеть, как на самом деле должен был выглядеть браузер!
Мы с нейросетью посмотрели на этот код, отряхнули его, дописали и выкинули оттуда очевидно лишние вещи (внизу были невзрачные кнопки, дублирующие меню, думаю, это остатки технического интерфейса). Теперь в свежей сборке можно увидеть, каким именно браузер должен был получиться.
Кстати, пока мы с нейросетью занимались интерфейсом, я решил заняться некрасивым уголком справа внизу. Снял скриншот, чтобы меньше объяснять — многие нейросети довольно неплохо по ним всё понимают и написал в промпте:
Посмотри на out.png, справа внизу светлый угол, за который тянуть надо, не совпадающий по цвету с остальным окном. надо бы поправить цвет, сделать в цвет остального окна.
Вот иллюстрация того как это ещё недавно выглядело:
Нейронка, так сказать «взяла под козырек» и начала
Оказалось, она написала мне программу, которая покрасила краешек моего скриншота в правильный цвет!
В итоге я вообще убрал этот уголок: масштабирование всё равно нормально не работает, остаются артефакты, да и в оригинальной программе окно было фиксированного размера.
Как мы видим старый веб
Я часто пишу, что считаю проект
И вот интересная штука, я ведь начал заниматься вебом
Но только когда я начал заниматься реставрацией старого браузера, понял что ранний
Мало беды, если не видно
В максимальной степени это видно на страницах сайта браузера «Виолы», там в современных браузера вообще мало что показывается — поддержка слишком многого канула в Лету, а заметку я решил написать, потому что обнаружил, что презентация, которую я смотрел вчера, должна быть оформлена иначе.
Часть картинок, которые там использованы в оформлении, в ничем сейчас не поддерживаемом формате XPM, а другая часть вставлена при помощи тега FIG, поддержки которого сейчас тоже нигде нет.
На скриншоте — слайд про виртуальную среду, про который я писал вчера вечером, со всеми картинками, которые должны там отображаться. Тут, конечно, можно и без них обойтись, в этом смысле более показательный пример, как я уже упоминал выше, — сайт «Виолы».
HTML 3.0 и VR
Пока искал в интернете информацию по тегу FIGURE, набрёл
Под подзаголовком «Figures with local event processing» скрывается видение того как в будущем будет выглядеть веб в виртуальной реальности. Причём автор считал, что это будет ближайшее будущее:
К концу этого десятилетия дальнейший рост соотношения цена/производительность позволит доступным настольным системам запускать высокореалистичные модели виртуальной реальности. […] сейчас самое подходящее время для разработки механизмов, позволяющих людям делиться VR-моделями в глобальном масштабе.
Я и не знал, что первый коммерческий наголовный дисплей был выпущен
Джойстики и устройства типа «SpaceBall» улучшают управление, но не могут конкурировать с полной «погружённостью», которую обеспечивают наголовные дисплеи. Системы
премиум-класса используют магнитное отслеживание положения головы и конечностей пользователя, а также устройства вроде трёхмерных мышей и киберперчаток, ещё больше усиливающие иллюзию.
Автор соврешенно справедливо полагал, что звук тоже важен, не только изображение:
Звук может быть не менее важен для иллюзии, чем визуальная симуляция: звук тикающих часов усиливается по мере того, как вы к ним приближаетесь. Самолёт с рёвом пролетает над головой, перемещаясь от одного горизонта к другому.
Можно подумать что тут написано
Виртуальная среда может накладывать те же ограничения, что и реальный мир, например силу тяжести или ограничение движения ходьбой, подъёмом/спуском по лестнице, поднятием и опусканием предметов. Либо, наоборот, пользователи могут «обзавестись суперсилами» и с лёгкостью летать по воздуху или даже проходить сквозь стены!
…но на деле речь просто реализацию физики на экране:
При использовании простого интерфейса, например мыши, обучаться бывает легче, если набор возможных действий в каждый момент ограничен небольшой совокупностью вариантов. Например, движение вперёд по направлению к лестнице приводит к тому, что вы автоматически поднимаетесь по ступеням.
А тут технически интересная, но сейчас уже неактуальная идея, которая в теории могла бы помочь сэкономить вычислительные ресурсы — идея строить виртуальную среду из готовых предметов, используя для этого специальный язык разметки:
Возможно, мы сможем опереться на опыт конвертации документов и SGML и задавать VR-среды на логическом уровне, предоставив браузерам заполнять детали в соответствии с возможностями каждой платформы.
Базовая идея заключается в том, чтобы составлять VR-среды из ограниченного набора логических элементов, например стул, дверь, пол. Размеры некоторых элементов можно брать по умолчанию. Для других, например размеров комнаты, требуются списки точек — скажем, для описания многоугольника, задающего план пола. Дополнительные параметры задают цвет и текстуру поверхностей. Рамка картины, висящей на стене, может быть описана с помощью растрового изображения.
Я немного сократил статью, она чуть больше, но, к сожалению, не дописана, кончается в неожиданном месте:
Хранение таких подробностей в отдельных файлах даёт несколько преимуществ:
«Виола»: ИИ и отображение PostScript
Когда я в очередной раз думаю, что понял какие задачи может, а какие не может решить нейросеть быстро и с минимальным моим участием, нейросети подкладывают мне свинью.
Случайно, изучая заголовки, которые отправляет «Виола», я обнаружил, что этот браузер
Непонятно для этого понадобился отдельный тег, ну вот так сделано. Для наглядности вот пример его использования:
<FIGURE TYPE="application/postscript" SRC="test_figure_ps.ps"
WIDTH="100" HEIGHT="100" MAYDELAY="2000" ISMAP></FIGURE>У него больше атрибутов, чем я использовал в примере, в минимуме ему нужен только TYPE и SRC, а остальные атрибуты у меня тут используются как ненужные подробности в моём рассказе, но так уж мне захотелось.
Когда я сделал тестовую страничку с этим тегом, оказалось, что ISMAP и MAYDELAY с «ПостСкриптом» не работали, как и, собственно, само отображение «ПостСкрипта».
С отображением я справился быстро. Секрет в том, что «Виола» на самом деле этот язык сама по себе не понимала, до моего вмешательства она использовала довольно неряшливый код, который использовал кучу временных файлов и две утилиты, — gs и ppmtogif, при помощи которых она получала GIF, который на самом деле и отображался.
Я весь этот код просто выкинул и заменил на вызов утилиты magick, которая умеет конвертировать «ПостСкрипт» в GIF напрямую безо всяких посредников. Пришлось только учесть, что
Довольно быстро я починил и реализацию атрибута ISMAP — просто скопировал его из обработчика формата XBM, где он работал, а починку MAYDELAY отдал нейросети.
Вроде ничего сложного, опять же — этот атрибут работал у XBM, я предполагал, что сеть быстро разберётся в чём там дело, передрав рабочий код и наложив его на особенность — XBM отображается напрямую внутренней библиотекой браузера, а «ПостСкрипт» конвертируется.
Примерно спустя час я сдался. Ни ChatGPT 5.1 Codex, ни Gemini 3 Pro, ни моя любимая Sonnet 4.5 с задачей не справились — каждая из них писала мне огромную простыню кода, которая задачу не решала.
Кусок кода, который надо было поправить, выглядел следующим образом. Если атрибут MAYDELAY не указывался, то вызывалась конвертация «ПостСкрипта» в GIF и он показывался, в противном случае запускался таймер, который вызывал loadData — другой… э… метод, назовём это так, программы на внутреннем языке «Виолы», в котором конвертации не было.
Модели это видели и просто копировали конвертацию в этот метод, но к моменту срабатывания таймера файл, с которым нужно было работать, уже пропадал. Думаю, его удалял сборщик временных файлов, встроенный в «Виолу». В итоге ничего толком не работало: модели ходили по кругу и, пытаясь исправить ситуацию, писали всё больше кода.
Исправление, которое сделал я, работает очень просто: я сначала делаю конвертацию, потом смотрю, есть ли параметр MAYDELAY, если нет, отдаю сконвертированную в GIF картинку в отрисовку, если есть, откладываю отрисовку, передавая в метод loadData уже сконвертированную картинку.
По сути, я передвинул несколько строк кода чуть ниже, это всё моё исправление. Я
Какой у вас GPU
Я тут случайно узнал, что через WebGL, оказывается, можно определить какой графический ускоритель используется на машине, где запущен браузер. Окно я стилизовал просто потому что просто так выводить было скучно. Посмотрите что у вас там написано.
Технически берётся параметр UNMASKED_RENDERER_WEBGL у контекста объекта WebGL.
У меня тут сейчас написано следующее:
ANGLE (Apple, ANGLE Metal Renderer: Apple M3 Max, Unspecified Version)
У братишки на рабочем компьютере (там «Виндоуз»):
ANGLE (Intel, Intel(R) UHD Graphics 770 (0x0000A780) Direct3D11 vs_5_0 ps_5_0, D3D11)
На моём смартфоне «Сяоми 14 Ультра»:
Adreno (TM) 750
Добавлено: как справедливо заметили в комментариях в телеграмном канале, это странно, что браузер позволяет так точно определить эту информацию, посколько производители браузеров часто борются с идентификацией браузера, а тут информация, которая позволяет производить идентификацию точнее.
«Виола»: математический модуль
Наверное, можно подумать, что я забросил заниматься браузером «Виола» — первым графическим браузером с потрясающими для своего времени возможностями. На самом деле — ничего подобного: почти каждый день, с редкими пропусками, я
Тот исходный код, который мне достался, был в статусе беты, но даже для беты тут очень много вполне очевидных багов, которые нужно исправить. А ещё — много впечатляющих вещей, которые автор, по всей видимости, не успел доделать. Часть из них я нашёл чисто случайно, как, например, модуль для отображения математических формул.
Нашёлся он совершенно случайно, когда я чинил баг с отображением символьных сущностей HTML — плёвая ошибка: дело было в том, что char у меня в компиляторе — тип со знаком, а в компиляторе автора, видимо, был без него.
В общем, обнаружив модуль для отображения математических функций, я занялся им. Основное поправил,
Вот как выглядят формулы:
<math>&integral;<sup>∞</sup><sub>0</sub> e<sup>-x</sup> = <box>σ<over>2</box></math>Это третья формула на моём скриншоте, можно посмотреть чему соответствуют отдельные элементы. Как можно убедиться, реализованное в «Виоле» почти в точности совпадает со стандартом HTML Math, разрабатываемым
Синтаксис довольно простой, но, в принципе, несложные формулы записать можно. Вся математика отображается красным, я думал это
«99 бутылок» и «Постгрес»
Недавно моему сайту исполнилось 25 лет и я вспоминал свою первую заметку, с которой всё началось. Она положила начало традиции, которая длится столько, сколько существует этот сайт — писать «песню о пиве», это такая американская считалочка, на различных языках программирования.
Когда я пересматривал ту заметку, обратил внимание насколько сложно написана была «песня о пиве» на языке СУБД «Постгрес». Это был
(
WITH phrase(ph) AS (
SELECT COALESCE(NULLIF(beer, 0)::text, 'no') || ' bottle' ||
CASE beer WHEN 1 THEN '' ELSE 's' END || ' of beer'
FROM generate_series(99, 0, -1) AS c(beer)
)
SELECT ph || ' on the wall, ' || ph || '.' || e'\n' ||
'Take one down and pass it around, ' ||
LEAD(ph) OVER() || e' on the wall.\n' AS " "
FROM phrase LIMIT 99
)
UNION ALL SELECT
'No more bottles of beer on the wall, no more bottles of beer.
Go to the store and buy some more, 99 bottles of beer on the wall.';AV1 и аппаратное ускорение
Есть такой относительно новый хороший формат графики для веба — AVIF (появился всего семь лет назад). Формат правда хороший, но есть недостаток — очень уж алгоритмически сложный.
И декодеры и кодеры стараются программно ускорить, но всё равно получается довольно медленно. Я давно предсказывал появление аппаратных ускорителей, но пропустил момент, когда они появились. Мой «Макбук» на чипе «М3 Макс», значит у меня есть по меньшей мере декодер.
На картинке он обозначен как «AV1 decode», AV1 — это название кодека, которым сжата графика в формате AVIF.
У «Интела» аппаратный декодер тоже есть, думаю у других производителей тоже, я не смотрел. А это, по сути, значит, что формат уже победил всех конкурентов и постепенно начнёт выходить на первые позиции. Разве что появится
Что прикупить из нейросетей?
У меня постоянно спрашивают, сколько и за какие нейросети я плачу. На самом деле у меня немного платных сервисов — всего две подписки.
У меня оформлена самая дешёвая ($22,4 в месяц) подписка на ChatGPT, и то только
Это ощущается как помощник, который готов выполнить для вас поисковую работу. Пользуюсь постоянно. В последний раз — два дня назад, когда искал, где недалеко от нашего отеля (мы сейчас в Эмиратах) жена и дочка могут покататься на лошадях.
Эту же сеть я использую для коррекции фотографий, редактирования текстов и выжимки текста, когда нет времени изучать
Кроме того, у меня есть самая дешёвая ($20) подписка на «Курсор», чтобы программировать, но сейчас мне не хватает, я всё время докупаю токены. Планирую перейти на более дорогой тариф ($80), но, учитывая мои аппетиты, может и этого не хватить. Когда «Виола» надоест, вернусь обратно на самый дешёвый.
«Виола» и эпоха раннего интернета
В начале интернета никто не думал о безопасности — ни о шифровании, ни об аутентификации, ни о защите от перебора или других атак. Даже в хорошо знакомой всем электронной почте можно было подставить произвольный обратный адрес.
«Виола» в этом смысле — продукт своего времени. Браузер позволяет себе очень многое, причём
На моём скриншоте две программы для «Виолы» от автора браузера.
Слева — небольшой графический редактор, в котором моя дочь нарисовала котика и синюю рыбу. Для своей работы редактор запросто читает несколько файлов из моей файловой системы — он использует содержимое этих файлов в качестве одного из вариантов кистей.
Справа — пример того, как страница может вывести произвольную информацию на панель браузера с кнопками. В данном примере создаётся соединение с адресом pebble.berkeley.ora.com по порту 7777, и строится график чисел, получаемых из этого сокета. Такого адреса давно нет, чтобы пример заработал, я написал небольшой сервер на «Пайтоне» и перенаправил этот адрес на свою машину.
Осталось полшага до того, чтобы выкачать всё важное из моего компьютера и отправить в интернет по произвольному адресу и протоколу.
Я сейчас как раз думаю что с этим делать. Я могу сделать так, чтобы файлы читались не по абсолютному пути, а по относительному,
В браузере компании «Нетскейп» был специальный «менеджер привилегий», который позволял попросить у пользователя разрешение на выполнение
netscape.security.PrivilegeManager.enablePrivilege('UniversalFileAccess')
netscape.security.PrivilegeManager.enablePrivilege("UniversalConnect")Можно было бы сделать примерно так же — спрашивать разрешение, но слишком далеко отходить от исходного поведения браузера мне не хочется. Мне нравится идея сохранить его поведение как можно ближе к тому, что было
В общем, думаю пока как всё сделать лучшим образом.
Как рождался CSS
Мне стало интересно: автор «Виолы» первым догадался отделить стилизацию элементов от структуры, или эта идея уже активно обсуждалась? Нашёл объёмное исследование о том, как зарождался CSS. Браузер «Виола» со своими собственными таблицами стилей там тоже упомянут.
Оказалось, что таблицы стилей как концепция гораздо старше самого веба. Ещё в конце
Язык разметки описывал структуру документа — слова, строки, страницы, интервалы, заголовки, подстрочные примечания, нумерацию, оглавление и т. д. — по принципу, близкому к HTML. Далее специальный компилятор использовал базу стилей (Style Database), где хранились определения оформления — шрифты, поля, отступы и прочие параметры.
Позже, с появлением веба и браузеров, эта идея перекочевала и туда. До стандартизации CSS существовало множество предложений о том, каким должен быть синтаксис таблиц стилей в вебе, в найденном мной исследовании можно с ними ознакомиться.
Синтаксис «Виолы» был не самым продуманным, не был и единственным, но был одним из первых — он появился уже в 1993 году.
Шахматы в «Виоле»
Посмотрел несколько готовых демок для «Виолы». Больше всего меня смутили шахматы —
Для браузера, который в девяностые был первопроходцем в вебе, это более чем круто, но я всё равно ожидал
Потихоньку начинаю смотреть что же не работает в интерпретаторе встроенного языка. Что меня поражает до сих пор — это возможность на нём дописывать браузер.
Например, я недавно делал поддержку протокола
/* Show original URL when loading via Wayback Machine */
dispURL = docURL;
/* Rule: find "https://web.archive.org/web/", then drop until next '/' */
wbPrefix = "https://web.archive.org/web/";
wbAt = findPattern(dispURL, wbPrefix);
if (wbAt != -1) {
wbAfter = wbAt + 1;
wbRest = nthChar(dispURL, wbAfter, 999);
wbSlash = findPattern(wbRest, "/");
if (wbSlash != -1) {
dispURL = nthChar(wbRest, wbSlash + 1, 999);
}
}
mvw.doc.url("show", dispURL);Изобретённый компанией «Мозилла» «зул» (XUL), который позволяет делать то же самое , появился только
Скриптовый язык «Виолы»
С синтаксисом стилевых таблиц в «Виоле» я вполне освоился, а вот скриптовый язык толком ещё не смотрел. Вижу, что многие вещи точно работают. Например, логика стилевых таблиц целиком написана на нём. Ещё один пример: на одной из страниц документации к браузеру анимация сделана с помощью скриптинга.
Постепенно доберусь и до него, а пока масштаб трагедии самым краешком выглядывает
Кстати, страница на скриншоте выглядит идеально, ровно как задумано. Такой её в современном браузере не посмотреть. Тут и анимация, и собственные виоловские стили, и кнопки, добавленные страницей — ещё одна интересная фича «Виолы».
Патч Бармина
У меня тут случайно получился прекрасный пример того, почему нейросети пока нельзя пускать в самостоятельное программирование.
Браузер «Виола», портированием которого я занимаюсь, среди прочих форматов графики поддерживает ещё и формат XPM. Сейчас не особо важно, что это такое, но вчера я вспомнил, что родственный ему формат XBM
Я решил посмотреть, нет ли в XPM тех же уязвимостей и, если они есть, — исправить.
Одна из уязвимостей, которую мы рассматривали, — запуск произвольных команд. Мы её, конечно, закрыли, но посмотрите, что нейросеть предложила в качестве теста на отсутствие уязвимости: запуск команды