CI/CDchmНостальгияМультимедиаБез глобалкиПарсимСодержание (TOC)xmlНе структурностьОколонаукаВ программированииСестра талантаCI/CDНедавно понадобилось мне примеCI/CDchmНостальгияМультимедиаБез глобалкиПарсимСодержание (TOC)xmlНе структурностьОколонаукаВ программированииСестра талантаCI/CDНедавно понадобилось мне приме

Формат CHM, структурность, локальность, скорость и около-научная лирика

  • CI/CD

  • chm

  • Ностальгия

  • Мультимедиа

  • Без глобалки

  • Парсим

  • Содержание (TOC)

  • xml

  • Не структурность

  • Околонаука

  • В программировании

  • Сестра таланта

CI/CD

Недавно понадобилось мне применить достойную но не прожорливую систему CI/CD - доставки. И пока выбор пал на Concourse CI + Jenkins местами. Это отдельная тема, но рассматривал также Gitlab Community, DroneCI и Gitea Actions.
На текущий момент потребовалось изучать документацию по этой системе. У Concourse хороший сайт, но мне захотелось получить локальную версию для чтения на смартфоне; проблема для многих сейчас актуальная. И оказалось, что такой версии ни у них, ни где-либо нет. Памятуя успешное использование локальной версии портала cppreference.com, я решил, почему бы не попробовать использовать такой же метод: упаковать доку в формате chm. Тут можно вспомнить старый анекдот про техподдержку:

- Помогите, я, кажется удалила Интернет! - Секундочку, мадам, у нас тут где-то есть копия.

CHM

Итак chm. Не знаю как у вас, а у меня браузер позволяет иногда сохранить всю веб-страницу в этом формате для локального просмотра. И это удобнее - иметь один файл на страницу вместо html-портянки с кучей разбросанных картинок и скриптов.
Но вообще-то, CHM - это многостраничный формат, html-версия и наследник стандартного файла справки .hlp Windows 90-х - 00-х годов. И он может хранить в структурированном виде целый сайт или даже портал, с перекрёстными ссылками внутри. Забавно, что юное поколение вообще не имеет об этом никакого представления. Как например здесь: "I Found Something Weird in North Korea's OS yt:[E72cXsvKRVs].mp4".

Ностальгия

А ведь были же времена... Я помню в нашей студенческой сетке вполне можно было найти какой-то вариант типа библиотеки Мошкова, с разными дополнениями. Там в виде вот этих самых help-контейнеров была масса информации, помимо собственно художественной классической литературы, от технических порталов, хакерских сборников, программистских энциклопедий до сборников анекдотов, Трахтенберга и техник НЛП. Были и относительно легальные тогда статьи про запрещённые и не очень вещества и взрывчатку. И всё это компактно, на жёстком диске, структурированно. Занимало всего несколько гигабайт, что немного учитывая десятки тысяч текстов. А что сегодня? Я загружаю 1 грёбаную страницу с тоннами джабаскрипта на нём, который мне нахрен не сдался, и получаю пол-гига хлама, мусора, в котором нет никакого содержания.
Вообще это было славное время сетевого взаимодействия (для меня). Правда надо учитывать, что возможно, это специфика именно того локального коммьюнити, в котором я был и жил. Поскольку это студенческий кампус, да ещё это же Академ. Это были времена, когда студенты имели доступ не только к своей частной сетке кампуса - которая сама по себе произведение искусства, за счёт участвовавших в ней людей (а в Академе, поверьте, не самые скучные люди), но и к ресурсам более зрелой сетки Академ-орга и местного Хоумнета. Это время локальных форумов типа форума седьмой общаги; на самом деле у каждой общаги был свой, но семерка оказалась площадкой для всех и про всё. Он не был виден из внешнего интернета, о чём многие покинувшие альмаматер сожалели. Также конечно форум Академ-Орг, который и ныне как-то живет. Вот он более матерый но и более размытый и универсальный. Позже узнал, что организатор одной из успешных соцсетей запостил рекламу (нелегально) своего творения для продвижения его в ограниченные массы (регистрация тогда была по приглашениям) - вполне разумное действие для попытки раскрутки КАЧЕСТВЕННОГО продукта, ибо социальный продукт, как и любой другой, определяется его компонентами.
Вообще, были и другие форумы - математический, например. Они особнячком держались. Ну а на нашем факультете, поскольку он всё же "Информационных технологий", наверное, в каждой группе каждого курса (хотя их немного) был человек, который запускал свой вариант форума, аналогично как сейчас нейросеточка тебе за полдня нагенерирует сайт. Поскольку всё-таки поднять форум на опенсорсе (и не очень) - лёгкое развлечение и практика.

Мультимедиа

Вообще, конечно, не форумами едиными и не только текстовыми медиа полнилась сетка кампуса. Её компактность и относительно неплохая пропускная способность делали доступными вещи, которые в интернете тогда были невозможны. В сеточке было много музыки, клипов, арт-картинок и фильмов. Причем по всему этому работал местный сканер сетевой жизни - дословно NetBioSearch, весьма неплохая поисковая система по ресурсам кампуса (а впоследствии и всего Академа), которая обходила ftp и самба-шары (для тех, кто недавно вылупился - это виндовые общие папки). И находила много всего интересного. Тут стоить отметить, что эта система работала ещё до распространения пиринговых сетей, в академе это был DC. И главное удобство особенно самбы было в том, что она работала сиюминутно, с места к карьер, что называется. Если вы с друзьями решали какую киношку посмотреть вечером, то проблема решалась просто: даже если оценки форума land7 вам показались неубедительными или фильм только вышел и не получил ещё свою критику от продвинутых киноманов (в случае музыки - меломанов) или вы хотите рискнуть и стать пионерами, то самба позволяла, не загружая весь фильм целиком, а это с тогдашним качеством и сжатием было много/долго даже по локалке - около 15 минут, позволяла быстро протыкать участки фильма, оценить общее качество (например экранку), игру актеров и динамику и решить стоит ли оно усилий. Это особенно полезно, если было несколько версий на выбор, что было часто в случае популярного медиа. Очень жаль, что Микрософт зарубила технологию в последних продуктах. Особенно примечателен стал период, когда сервер семерки проапгрейдили, файловое хранилище укрупнилось и оно стало держать нагрузки от множества людей даже в часы пик. Апгрейд проводили тогдашний смотритель терминалки в ФМШ и Abs, ныне вещающий в интернетах.
Стоит ещё упомянуть наличие даже цифрового вещания (стриминга), для тех, кто почему-то соскучился по ТВ или радио от некоторых энтузиастов - владельцев тв-тюнеров. Надо сказать, что вещатели, даже если не брать в расчёт их малое число, единицы, и скромный набор каналов, не зашумляли, не нагружали сеть, потому что делалось вещание конечно броадкастом. По-моему, современные решения IP-tv не такие эффективные.

Без глобалки

Надо сказать, что потребности выходить в глобальную сеть было мало.
Да и глобальный интернет был медленным и тогда был нужен в основном моему соседу, которому зачем-то надо было знать, чем закончился очередной футбольный матч. Сам я будучи технарем, немного проявлял интерес к самому техно- спорту - Формуле-1. А новости меня почти не интересовали тогда. Были дела поважнее и поинтереснее. Например, про теракт в Беслане я узнал через несколько лет. Местами только было что-то интересное в глобальном интернете: я открыл для себя myspace, который в те года блистал, Фейсбук был почти неизвестен.
Надо сказать, что вся эта лафа - роскошь непосредственного общения в коммьюнити была помножена на концентрацию интересных людей с разным бэкграундом в одном месте, поскольку Академ изначально это сибирский melting-pot. Плюс полное самостоятельное управление своими связями. Это значительно отличается от современной информационной среды, где доминируют крупные порталы с потоковой выдачей информации, подобранной из маркетинговых и политических соображений, создающие вокруг тебя пузырь из мишуры и дезинформации. Соцсети, с непонятными механизмами ранжирования, полагаю, покупаемыми и, разумеется, с прослушкой АНБ (или ФСБ, мосада - кому что). Да ещё всё это теперь обмазывается сверху слоем нейрослопа. Таким образом, выход в глобальную сеть, да и вообще на публику, всегда сопровождается размытием, разбавлением ценности и самости.

Так вот, после длинного отступления на тему локальности и компактности, замечу, что CHM - это про локальность. Ты получаешь копию сайта, книги или справочника в оффлайн версии. Причем с содержанием и индексом, если качественно сделано. А это : удобство навигации без жрущего всю память браузера, моментальный поиск без гугла и яндекса, быстрый переход по результатам оного, никаких эластик-search и прочего кровавого энтерпрайз (кому он нужен-то вообще, никогда не понимал). Всё быстро, четко, точно и доступно моментально под рукой. В принципе, для многих сейчас ПДФки играют примерно ту же роль, но их текстовый формат менее предсказуем, а поиск хуже, для больших документов - тормозит. Плюс плоская структура, содержание не всегда есть. CHM в него можно конвертировать. В свое время, подход типа отправить распарсить документ по сети (!) считался верхом непрофессионализма и общего невежества. Но это если объём позволяет.

Парсим

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

Далее преобразование. На самом деле формат закрытый, но довольно древний и проанализирован, так что есть много утилит его парсинга — в основном чтения. Официальный инструмент создания контейнера — Html Workshop — давно заброшен. И не поддерживает современный продвинутый веб‑контент. Что самое удивительное, я впервые нашёл действительно полезную программу, написанную на Паскале!, которая здесь всех переплюнула. Утилита chmcmd входит в стандартную поставку FreePascal. После некоторой подготовки она скомпилировала мне готовый справочник по Concourse CI. Правда пока без индекса.

Содержание (TOC)

Для создания оглавления я применил проверенные временем xml технологии. Помогло здесь то, что изначально дока выполнена в семантической вёрстке. И есть раздел содержания но с нормальной разметкой и уровнями. Применив совсем небольшую (~50 строк) таблицу стилей xml (xslt), я получил почти готовое оглавление справочника. Осталось добавить фильтр против разного шума в файлах (ненужные скрипты, ссылки и т.п.) В очередной раз убедился, насколько блестяще xml формат и его парсеры выполняют свою работу. В сравнении с тем же json, где даже подступиться к задаче подобного рода - большая проблема. Насколько сложны и нечитаемы запросы например того же jq в сравнении с xpath/xquery.

Скрытый текст

<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" indent="no" /> <xsl:template match="table" name="table" > <UL><xsl:apply-templates select="tbody/tr | tr" /> </UL> </xsl:template> <xsl:template match="tbody" name="tbody" > <xsl:apply-templates select="tr" /> </xsl:template> <xsl:template match="tr"> <xsl:variable name='url' select='concat("concourse-ci.org/", td[2]/a/@href)' /> <LI><OBJECT type="text/sitemap"> <param name="Name"> <xsl:attribute name='value'> <xsl:apply-templates select="td" /> </xsl:attribute> </param> <param name="Local" value='{$url}' /> </OBJECT> <xsl:if test='not((ancestor::nav)[last()][div[@class="top"]/a[@class="self"]])'> <xsl:apply-templates select="document($url)//body//div[@class='context'][nav/div[@class='top']/a/@class='self']/nav/div[@class='children']/table" /> </xsl:if> </LI> </xsl:template> <xsl:template match="td[@class='number-cell']"> <xsl:value-of select='string()'/> <xsl:text> </xsl:text> </xsl:template> <xsl:template match="td[@class='title-cell']"> <xsl:value-of select='string()'/> </xsl:template> <xsl:template match="a"> <xsl:value-of select='concat("concourse-ci.org/", @href)' /> </xsl:template> </xsl:stylesheet>

xml

Надо отметить (опять отступление), что в среде НГУшного кампуса в своё время завелась секта фанатов xml. Эта секта оказалась настолько влиятельной, что проникла в образование — вела спецкурс по xml в ФМШ, и даже захватила контроль над основным порталом НГУ, это один из немногих сайтов, который работал на xml, как технологии рендеринга и организации модульности. Надо сказать довольно долго продержался, пока не потребовалось быстро и весьма радикально менять лицо университета в связи с новыми веяниями по раскрутке узнаваемости (бренд N* — настоящая наука) и гонке за рейтингом. Насколько я помню и знаю, секта состояла в основном из математиков. Оно и понятно: кто как не математики стремятся к структурированию всего я вся и применяют технологии с подобными же свойствами. Ведь если подумать, математика — это собственно и есть наука о структурировании информации окружающего мира. (Пусть даже здесь сказывается мой бэк в информатике/кибернетике.) Не арифметика, не алгебра или геометрия — а это всё частные случаи изучения отношений между абстрактными конструкциями (то есть структур), которые в каком‑то приближении моделируют окружающую реальность; вернее могут моделировать, а могут моделировать другую реальность — тут зависит от набора аксиом, то есть, кто держит перо? и сам процесс моделирования — наложения на структуры тоже моделируется (вспомним логику), и так далее рекурсивно. Собственно моделирование — это процесс поиска/распознания/синтеза/валидации различных структур.

Пример. Возьмём тот же xml, который есть задание структуры документа, например html, более строго — xhtml, в виде xsd, подвида xml. И преобразование путем применения xslt, тоже xml. Структура посредством структуры переходит в другое состояние, часто — похожую структуру.

Что есть структуры? Математика с самых оснований своих строится на создании и организации структур. Они могут соотноситься с реальностью. Вспомним различные паттерны (в тех же языковых моделях), или если хотите законы природы, законы бытия, философию, если удобно мыслить их как веления Бога — ради бога. Но по сути это всё способы организации природы в структуры, что задают отношения между сущностями. Их описание есть предмет математики. С самого нижнего уровня (хотя начать можно по‑разному), мы определяем отношения как структуры — теорию множеств, и на этой базе строим далее: начиная с основного отношения — вложенности, определяем правила порядка и другие производные отношения, определяем числа наконец. Таким образом вся сущность математики - изучение и построение упорядоченности (из вложенности), объединений, пересечений, кластеризации, классов, типов, категорий (теория категорий). Если переметнуться на тему гуманитарного, то что это? Классы, страты, касты, государство, институты власти, социальные сети (широко), кланы, графы? То есть упаковка и переупаковка упакованного. Упаковка понятий и смыслов. Тогда экстремальный вариант - жесткая упаковка, фашизм. Некоторые лица в сетях находят такие процессы fascinating!. Да уж, fascinating по рукам и ногам.

Не структурность

В этом отношении большие языковые модели немного выбиваются из такой структурированной картины. Да, они схватывают закономерности, причём часто находящиеся на очень далеких ментальных дистанциях (с точки зрения человека). В этом собственно их особенность, их сила и слабость. На то они и большие, что работают с большими выборками и длинными путями в семантической цепи. Да, локальность в приоритете, но она не используется эффективно, далеко до уровня человека. Как известно из психологии, человек обычно может эффективно держать в поле зрения ~7 объектов. Этот принцип широко применяется (грамотными) специалистами, в частности в объектном программировании (7 методов на класс) и дизайне интерфейсов , в смысле GUI. ЛЛМка же может сейчас охватить куда больший набор сущностей. Но достигается это дорогой ценой, путем построения длинных и противоречивых семантических связей. Собственно я полагаю их длина - основная причина искажений. Короткие цепи сложнее исказить, меньше наводок со стороны. Поэтому многие тренируют специализированные модели под более узкие конкретные задачи, что эффективнее. Опять же, расширение охвата, обобщение имеет следствием размытие и локальную неустойчивость.

Но и у человека возможности по концентрации на локальной задаче ограничены. Тут все зависит от плотности информации. Если в контекст восприятия попадает сильно больше 7 объектов, в том числе скрытых (а отношения между объектами тоже есть объекты и они считаются, если их отслеживать), в особенности, если объекты для восприятия новые, а вы уже далеко не ребёнок (или ученый) с его гибкостью восприятия, то такая высокая концентрация информации будет вам в тягость и быстро вас утомит. Эффективность восприятия будет низкой, даже несмотря на плотный входящий поток информации (высокая скорость в том числе). Теперь разбавим концепцию водичкой.

Вспомнился один случай

Ещё будучи на первом курсе, и прилежно учась в тот период, я услышал от лектора по логике анонс некоего собрания в Институте Математики СО РАН с повесткой обсуждения будущих перспектив развития нашего молодого факультета ФИТ. Это касалось, конечно учебных планов, программы. На встречу пригласили в том числе студентов, видимо, чтобы были в курсе, какие есть планы и приоритеты, и может быть, какие-то вопросы задавали. И я зачем-то пошел, вместе с одногруппником. Студентов кроме нас почти не было. Были начальствующий состав института, семинаристы и кажется из физиков тоже кто-то был. Из знакомых мне тогда собственно лектор логики др.ф.-м.н. Е.Пальчунов, наш семинарист по алгебре Храмцов, лектор алгебры др.ф.-м.н. Чуркин и еще пара семинаристов. Надо сказать первые двое - это весьма харизматичные люди, я таких не только в науке, но и в целом в жизни (даже удаленно) больше почти не встречал. Они вообще не вписываются в типичный стереотип ученого-интеллигента. Но, конечно, интеллектуалы. На собрании в целом обсуждали, что то, что есть - сильная математика на старте + профильные предметы - отлично подходит для нашего экспериментального факультета. Про физику спросили, нужна ли она в нагрузку ( а ее по 2 пары (лекция+семинар) в неделю каждый семестр вплоть до 4-го курса). Все согласились оставить как есть ( а это в основном математики), что не нужно отрываться от реальности: "не забывай свои корни, помни, есть вещи на порядок выше". Плюс гуманитарка, университет же всё же. Под конец, кто-то решил, видимо, пошутить, и написал на доске формулу в одну строчку, из исчисления предикатов, кажется. Я тогда совсем не шарил. Математики посмотрели внимательно, большинство вроде поняли, в чём суть написанного, посмеялись, что-то обсудили. Вот же дают, подумал я тогда, так извращаться! Но оценил крутость способа выражения. Из того, что было, я вынес одно - в одну строку было записано довольно содержательное сообщение, возможно содержащее больше смысла чем отдельный роман Л.Толстого. Но в предельно сжатом виде. Так что понять его - как хлебнуть чистого спирта.

В программировании

И здесь часто встречается сферы и отдельные случаи, когда восприятие усложняется не за счет неестественности машинных механизмов (ассемблер тот же), а из-за высокой концентрации логики на символ (или токен), как в некоторых функциональных языках, например, в хаскеле. Эти случаи часто связаны с активным применением разного математического аппарата в конструкциях на этих языках, и как следствие с высокой плотностью. И среднему программисту, особенно из нынешнего поколения, сложнее схватывать смысл алгоритма, в сравнении с более естественными языками, типа c++/java/go. У некоторых есть другие, не вполне очевидные новичку сложности. Но и разбавленная логика тоже не в плюс, большой контекст с минимум посыла - крайне плохо воспринимается, но это зависит от человека. Кто-то уснет от скуки.
Кстати, в подтверждение, что ЛЛМ оперируют широкими мазками с большим охватом, можно посмотреть как они анализируют код, когда надо что-то поменять. Их рассуждения становятся весьма пространными, на мой взгляд (я так воду при чтении кода не лью), иногда это плюс, а иногда минус.

В случае с моим xsl-шаблоном я допустил ошибку, и когда мне надоело ее искать Гпт меня выручил: он не нашёл ошибок в коде шаблона с ходу, но когда я дал ему пример входного гипертекста, он сразу указал, что шаблон с ним не матчится и почему. Как-то я сам не проверил, а отладчика для этого у меня нет. Зато в другом он скосячил: при анализе конструкции ancestor:nav[last()] предложил мне на выбор два варианта интерпретации, с противоположными по смыслу значениями. А я не знаю. И дока по этому поводу молчит. Я и предложил ему выбрать-таки правильный вариант самому. Кстати в этом месте я до сих пор не уверен, и если кто шарит, подскажите, каков реальный порядок узлов в выражении. Пока работает. Или может быть кто-то знает, как быстро построить словарный индекс по набору страниц. Тоже приветствуется. Результат чуть позже выложу в подходящем месте.

Краткость сестра таланта.

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

Для элементов массива A[..., i]:

μ = среднее значение A по последней оси: μ = mean(A along last axis)

σ = стандартное отклонение A по последней оси: σ = std(A along last axis)

результат = (A − μ) ÷ σ

Как тебе такое, Маск?

J:

norm =: (] - +/ % #) % %: (+/ @:* - +/ % #)

BQN:

Norm ← (⊢-+´÷≠) ÷ √(+´∘(⊢-+´÷≠)⋆2 ÷ ≠)

APL:

{(⍵-m)÷s←⍺÷⍨(+/((⍵-m)×⍵-m))÷≢⍵}

Ну как хлебнули чистого спиртика, я бы сказал с примесью ацетона, ядерная смесь.
Что здесь происходит?
Дан N-мерный числовой массив A. Для каждой «строки» вдоль последней оси вычесть её среднее значение и разделить на её стандартное отклонение.
Иначе говоря: операция применяется независимо к каждому срезу по последнему измерению, размер массива заранее не фиксирован, форма массива сохраняется

Тот же алгоритм на C (как видите, в 50 раз больше строк):

typedef struct { double* data; int* shape; int ndim; } Array; int prod(int* a, int n) { int p = 1; for (int i = 0; i < n; i++) p *= a[i]; return p; } void normalize_last_axis(Array* A) { int last = A->shape[A->ndim - 1]; int outer = prod(A->shape, A->ndim - 1); for (int o = 0; o < outer; o++) { double mean = 0.0; double var = 0.0; // mean for (int i = 0; i < last; i++) { mean += A->data[o*last + i]; } mean /= last; // variance for (int i = 0; i < last; i++) { double d = A->data[o*last + i] - mean; var += d * d; } var /= last; double std = sqrt(var); // normalize for (int i = 0; i < last; i++) { A->data[o*last + i] = (A->data[o*last + i] - mean) / std; } } }

Напоследок

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

Источник

Отказ от ответственности: Статьи, размещенные на этом веб-сайте, взяты из общедоступных источников и предоставляются исключительно в информационных целях. Они не обязательно отражают точку зрения MEXC. Все права принадлежат первоисточникам. Если вы считаете, что какой-либо контент нарушает права третьих лиц, пожалуйста, обратитесь по адресу [email protected] для его удаления. MEXC не дает никаких гарантий в отношении точности, полноты или своевременности контента и не несет ответственности за любые действия, предпринятые на основе предоставленной информации. Контент не является финансовой, юридической или иной профессиональной консультацией и не должен рассматриваться как рекомендация или одобрение со стороны MEXC.