mirror of https://github.com/voidlizard/hbs2
wip
This commit is contained in:
parent
951482c9ff
commit
18a99d55ce
|
@ -1,6 +1,6 @@
|
||||||
REV:=$(shell git rev-parse --short HEAD)
|
REV:=$(shell git rev-parse --short HEAD)
|
||||||
|
|
||||||
CHAPTERS:=intro.tex
|
CHAPTERS:=intro.tex usecases.tex design.tex
|
||||||
|
|
||||||
define make_target
|
define make_target
|
||||||
$(basename $(1))-$(REV)$(suffix $(1))
|
$(basename $(1))-$(REV)$(suffix $(1))
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
% vim: set textwidth=70:
|
||||||
|
|
||||||
|
\chapter{Дизайн}
|
||||||
|
|
||||||
|
% \section{Структуры данных и протоколы}
|
||||||
|
|
||||||
|
% \subsection*{Предпосылки}
|
||||||
|
|
||||||
|
% \subsection*{Возможное византийское поведение узлов}
|
||||||
|
|
||||||
|
% \begin{description}
|
||||||
|
% \end{description}
|
||||||
|
% \subsubsection*{Сообщение фактически неверных данных}
|
||||||
|
|
||||||
|
% \subsubsection*{Флуд}
|
||||||
|
|
||||||
|
|
||||||
|
% \section{Стейт}
|
||||||
|
|
||||||
|
% Дизайн стейта строится из следующих предпосылок:
|
||||||
|
|
||||||
|
% \paragraph{Жопа}
|
||||||
|
% \paragraph{Кита}
|
||||||
|
% \paragraph{Печень}
|
||||||
|
% \paragraph{Трески}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -90,7 +90,9 @@
|
||||||
\maketitle
|
\maketitle
|
||||||
\tableofcontents
|
\tableofcontents
|
||||||
|
|
||||||
\include{intro}
|
\include{intro.tex}
|
||||||
|
\include{usecases.tex}
|
||||||
|
\include{design.tex}
|
||||||
|
|
||||||
\end{document}
|
\end{document}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,156 @@
|
||||||
|
% vim: set textwidth=64:
|
||||||
|
|
||||||
|
\chapter{Сценарии}
|
||||||
|
|
||||||
|
\section{Оракул}
|
||||||
|
|
||||||
|
\subsubsection{Публикация <<фактов>>}
|
||||||
|
|
||||||
|
Оракул стартует и обновляет стейт.
|
||||||
|
|
||||||
|
Затем публикует набор <<фактов>>, отсутствующих в известном ему
|
||||||
|
состоянии.
|
||||||
|
|
||||||
|
|
||||||
|
\section{hbs2-browser}
|
||||||
|
|
||||||
|
\subsection{Отображение списка ссылок}
|
||||||
|
|
||||||
|
Предполагается, что \term{hbs2-browser}{hbs2-browser} будет отображать
|
||||||
|
ссылки в виде списка с бесконечным скроллом, с возможностью поиска, с
|
||||||
|
неким языком запросов.
|
||||||
|
|
||||||
|
Для начала поисковой строкой будет являться просто подстрока из самой
|
||||||
|
ссылки. В дальнейшем возможно расширение при помощи некоего DSL, где
|
||||||
|
будут перечислены атрибуты.
|
||||||
|
|
||||||
|
Если будут какие-либо специфические формы, с выбором опций --- то
|
||||||
|
предпогается, что они просто будут добавлять некие термы в эту строку.
|
||||||
|
|
||||||
|
На верхнем уровне отображется базовая информация для ссылки: её
|
||||||
|
текстовое представление (обычно публичный ключ в base58), её тип.
|
||||||
|
|
||||||
|
Возможно, некое описание. Например, название репозитория и список
|
||||||
|
хэштегов.
|
||||||
|
|
||||||
|
Предполагается оторбражение ссылок в порядке некоего веса, который
|
||||||
|
вычисляется (TBD), возможно, формула для вычисление веса так или
|
||||||
|
иначе определяется пользователем, например, возможностью
|
||||||
|
редактирования весовых коэффициентов.
|
||||||
|
|
||||||
|
Например, факторами могут быть время обновления и отношение к
|
||||||
|
пользователю, которое может вычисляться исходя из встречаемости
|
||||||
|
его ключей в данных ссылки (как пример).
|
||||||
|
|
||||||
|
Данное требование предполагает наличие обязательных и дополнительных
|
||||||
|
полей у отображаемой ссылки.
|
||||||
|
|
||||||
|
|
||||||
|
\subsection{Отображение детализации ссылки}
|
||||||
|
|
||||||
|
Понятно, что ссылок может быть произвольное количество и hbs2-browser
|
||||||
|
не в состоянии знать их все, а тем более, осуществлять какую-то работу
|
||||||
|
с ними. У нас не стоит цели разработать и запустить универсальную CMS.
|
||||||
|
|
||||||
|
Мы не сможем встроить функции работы, например, с проектами в git в
|
||||||
|
сам браузер, и вероятно, это было бы слишком.
|
||||||
|
|
||||||
|
hbs2-browser может предоставить некоторый каркас отображения
|
||||||
|
метаинформации; возможно несколько уровней. И предоставить возможность
|
||||||
|
перенаправления на приложение, которое умеет работать со ссылкой
|
||||||
|
(данными) такого типа.
|
||||||
|
|
||||||
|
Рассмотрим примеры.
|
||||||
|
|
||||||
|
\paragraph{git} Мы бы хотели видеть: название и описание репозитория,
|
||||||
|
список авторов, README если есть, список бранчей и тегов.
|
||||||
|
|
||||||
|
Еще бы мы хотели видеть структуру каталогов, и в переспективе ---
|
||||||
|
просматривать каждый файл, как в онлайн-редакторе, так и raw виде.
|
||||||
|
|
||||||
|
Однако, непонятно, как это сделать. Проекты могут иметь огромные
|
||||||
|
размеры, как по количеству файлов, так и количеству коммитов.
|
||||||
|
|
||||||
|
Если всё это делать метаданными, то размер метаданных сравняется
|
||||||
|
или превысит размер изначальных данных, которые тоже могут
|
||||||
|
иметь миллионы записей и гигабайты/десятки гигабайт размеров
|
||||||
|
в предельных случаях (монорепозитории).
|
||||||
|
|
||||||
|
Распаковка объектов на лету тоже малоприменима --- git~object~packs
|
||||||
|
могут быть огромными, их может быть много, без полной распаковки
|
||||||
|
объект не извлечь.
|
||||||
|
|
||||||
|
Вероятно, на первом этапе стоит ограничиться списком ссылок и
|
||||||
|
детализацией информации ссылки, например, нескольких уровней -- L1,
|
||||||
|
L2. L2 подразумевает более подробную информацию о какой-то сущности
|
||||||
|
ссылки, поэтому параметризуется этой сущностью.
|
||||||
|
|
||||||
|
\paragraph{Пример:}
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
L1:репозиторий
|
||||||
|
-> L2:список автров
|
||||||
|
-> L3:автор
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
С другой стороны, можно представить и таким образом:
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
L1:репозиторий
|
||||||
|
-> L2:список авторов
|
||||||
|
-> L2:автор
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
|
||||||
|
Видно, что задача очень хорошо бы ложилась на XML/XSLT, если бы у нас
|
||||||
|
была подобная опция. К сожалению, в современном мире такой опции нет
|
||||||
|
и нам придётся изобретать некую замену, которая будет делать тоже
|
||||||
|
самое, но не так.
|
||||||
|
|
||||||
|
|
||||||
|
Таким образом, нам необходим способ преобразования из модели
|
||||||
|
<<фактов>> в отображаемый формат (html).
|
||||||
|
|
||||||
|
Мы не хотим, что бы этот способ был привязан к какому-то конкретному
|
||||||
|
языку программирования.
|
||||||
|
|
||||||
|
Мы не хотим, по возможности, встраивать эти преобразования в
|
||||||
|
\term{hbs2-browser}{hbs2-browser}.
|
||||||
|
|
||||||
|
|
||||||
|
Рассмотрим возможные варианты задания преобразований:
|
||||||
|
|
||||||
|
\subsubsection{SQL+JSON}
|
||||||
|
|
||||||
|
Пользователь задаёт в конфигурации SQL стейтмент, порождающий JSON +
|
||||||
|
шаблон, который преобразует JSON в формат для отображения (html/htmx).
|
||||||
|
|
||||||
|
Достаточно просто, доступный многим стек, возможны сложности с
|
||||||
|
выполнением отображения в случае, если одного SQL запроса
|
||||||
|
недостаточно, фиксируем СУБД (скорее всего, это будет sqlite, но это
|
||||||
|
деталь реализации, которую не хотелось бы раскрывать), сколько-нибудь
|
||||||
|
сложную логику писать в СУБД достаточно проблематично и способ зависит
|
||||||
|
от БД. Отсутствие нормальной типизации. Слабые возможности абстракции.
|
||||||
|
|
||||||
|
|
||||||
|
\subsubsection{Собственный EDSL}
|
||||||
|
|
||||||
|
Требуется значительное время для разработки, необходим тулинг,
|
||||||
|
высокий порог входа, возможное недовольство пользователей.
|
||||||
|
|
||||||
|
|
||||||
|
\subsubsection{Биндинги в скриптовые ЯП + хост}
|
||||||
|
|
||||||
|
Достаточно затратное встраивание, вопрос, какие именно ЯП выбрать из
|
||||||
|
большого списка.
|
||||||
|
|
||||||
|
\subsubsection{Внешний процесс + IPC}
|
||||||
|
|
||||||
|
\subsubsection{Внешний процесс + RPC}
|
||||||
|
|
||||||
|
\subsubsection{Внешний процесс + HTTP}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue