Итак, пути монахов Братства разошлись. Кто-то построил свои "аббатства" из
одного человека, кто-то создал центры для б`ольшего или меньшего числа
друзей, а кто-то ушел в чужие монастыри.
Поэтому главным вопросом для отсылки голубей с посланиями становится знание
места, в котором находится в этот момент член Ордена, и особенно важно
знать где искать странствующих монахов.
Чтобы понять как монахи организовали систему обменов, давайте сначала
рассмотрим типы "узлов", nodes, распределенной и изменчивой сети Ордена.
Келии Отшельников, Аббатства и Монастыри
Исход книжников случился не сразу. Сначала самые умные и оснорожные из них,
первыми поняв безбожие нового Аббата, стали втайне принимать меры, чтобы
сохранить Знание. Страхи вскоре подтвердились: случились первые изгнания
нескольких монахов Тимом Абусом, который лично
вычистил все следы их ученых работ и комментариев в монастырской
Библиотеке.
Отшельники -или те, кто ими стали - по прежнему ходили в главную Библиотеку на
Гору Жизни, писали исследования и комментировали ученые трактаты других книжников.
Но, опасаясь потери знаний, они каждый раз, обнаружив интересное, копировали его и
уносили в свое тайное и никому не известное хранилище. Редко, откликаясь на чью-либо просьбу,
отшельник мог помочь восстановить манускрипт, но его хранилище не было открыто для посетителей.
Отшельник просто собирал знания для себя.
Разумеется устройство хранилища у отшельника повторяло многие главные черты
Библиотеки, хотя в намного облегченном виде. На самом деле одинаковая
организация работы хранилища одного монаха-отшельника, на которую
надстраивались лишь немногие дополнительные механизмы для превращения
хранилища в Аббатство которое могли посещать и другие братья, оказалось важно для
успеха книжников в создании Сферы. Точно так же, лишь немногое надо было
добавить к устройству мелкого Аббатства чтобы получить уже действующий
Монастырь со своей обширной Библиотекой, устроенный почти так же как когда-то
Монастырь на Живой Горе, но при том не обязывая монахов собираться и работать
непременно в его собственной Библиотеке. Новая система на любом уровне
поддерживала Сферу.
Программы распределенных блогов должны в идеале быть написаны так, чтобы
они позволяли при добавке дополнительных модулей/функций исполнять
работу на разных уровнях. Прикидывая тичичные роли, которые могут играть nodes, узлы
сети, можно выделить:
[1] "Скит", или "Отшельник", или "келейная функциональность":
работа отдельного закрытого от внешнего
доступа читателя/агрегатора/хранилища статей и комментариев полученных из формата
ЖЖ и преобразованных во внутренний стандартный формат распределенной блог-системы.
Обычно на первом уровне планирования принимают множество неявных решений и
предпосылок. Давайте попробуем их оговорить подробнее для программы самого
низкого уровня
Решение использовать http влечет за собой сопутствующее решение:
программа должна иметь пользовательский веб-интерфейс, который пользователь
видит в браузере. Причина - универсальность и легкость создания.
Значит,
- на локальной машине Отшельника должен быть (самый очевидный
вариант) какой-либо веб сервер, в случае Отшельника закрытый от посетителей
извне, который предъявляет самому отшельнику страницы для чтения.
Было бы идеально, если бы на машинах низкого уровня не было бы необходимости
запускать отдельно такой сервер, и он был бы встроен в саму программу.
- На машинах открытых для посетителей снаружи ("Одинокий Аббат") эта же программа (в идеале)
раобтала бы под стандартным веб сервером.
- На машинах принципиально многопользовательских, дублирующих функциональность
ЖЖ, в масштабах одной машины или выше, та же программа (в идеале) должна
была бы работать с большой скоростью, что вызывает ряд иных решений -
например, отказ от CGI, запуск многих копий программы с расщеплением
множества пользователей и проч.
Далее (возвращаясь к келейной конфигурации), страницы, копии документов из
Библиотеки (ЖЖ или других центральных серверов) собираются
программой-агрегатором по моему заказу ("принеси мне все, что недавно
написали братья в сообществе ru_perl").
Далее, как Отшельник я могу дополнительно вести мой
локальный дневник-блог (например, для заметок, или для черновиков
комментариев или статей, которые я затем скопирую через браузер в ЖЖ или
другие блоги - или просто для себя).
Дополнительно, я могу писать/править комментарии в моем
локальном хранилище, как к своему локальному блогу, так и к любым
материалам, я скопировал из ЖЖ.
При этом нет необходимости создавать систему authentication и ограничения
доступа. Это - архив моих личных копий, у меня есть полный доступ к любым
документам.
[2] Одинокий Аббат
Я - сам себе целый монастырь, и
единственный в нем монах, но я могу позволить другим придти посмотреть на
мои документы.
Эта версия обеспечит работу как в п.1, но с возможностью открыть
машину для доступа к чтению вашей коллекции любого внешнего читателя и/или
читателя из списка ваших друзей
Это означает, что надо дописать систему доступа к веб
сайту для внешних читателей или воспользоваться любой встроенной
authentication, и только.
Это - минимальный шаг. Мы по-прежнему не позволяем никому добавлять
документы в наше Хранилище, или даже их комментировать. Однако в этом случае
возможно мы хотели бы программу запускать из-под настоящего веб сервера
(бросив её в CGI-директорию), а не включать встроенный, хотя и это не
исключено.
Здесь впервые возникают услуги по предоставлению своего Хранилища другим
людям - раз они могут просто читать, они могут любые части вашей Библиотеки и
скопировать.
Т.е. на этой ступени мы также добавляем функциональность для p2p
копирования между узлами. Важны два положения:
- все функции аггрегирования, которые мы уже написали для ЖЖ ("взять
журнал брата Тука", "взять последние послания брата Джона", "принести статью
Джона о xxx со всеми её комментариями") годятся и для обмена между членами
Братства напрямую, минуя центральный сервер ЖЖ (или его аналогов).
- Отличие лишь в том, что не надо подстраиваться под (нам навязанный)
формат документов из ЖЖ - т.е. RSS или прямой parsing html-файлов, где
возможно в стандартном форматировании.
Другими словами, если немного подумать, наша программа должна обеспечить
выдачу манускриптов и наборов документов из Хранилища в двух видах: (а)
красиво форматированный html, для прямого чтения в браузере, и (б)
"raw-formatted", БЕЗ html-обрамления.
html-оформление может изменяться ("style"), и наша программа стандартно
для современных веб-applictions отделяет engine, предоставляющую CGI-API,
т.е. язык запросов для выдачи страниц, и стиль обрамления содержимого в 2
или 3 столбца веб-страницы раскрашенной произвольным образом и возможно несущей
javascript-мелочь вроде кнопок.
Наконец, третье. Запросы на материалы было бы странно проводить, каждый
раз пересылая полную копию документа. Например, пытаясь выяснить, не
появились ли новые комментарии к статье ученого книжника Ю., я, обращаясь к
ЖЖ, не могу избежать копирования массы ненужной информации.
Между узлами нашей системы мы будем обмениваться "skeletons",
"готтиками", или "оглавлениями", как хотите, выслав в приведенном примере,
лишь маленький фал с полусотней строк, описывающих комментарии.
Итак, в случае открытия машины для внешних посетителей и
репликаций, наша программа предоставляет 3 режима - (a) сами страницы
заметок и комментариев с оформлением, (b) страницы в "raw format", и (c) "оглавления",
служебные краткие перечисления для быстрого выяснения кто какую информацию имеет.
Все это пересылается по результатам стандартных http-запросов, обращение через предоставляемые
программой cgi-api (www.my.server.com/path/to/program?arch=LJ&user=ru_perl&search_str=2008-03-28&format=raw&....), на которые ссылается интерфейс или сама программа во время разговоров-обменов, и которые совершенно не надо знать и помнить самому пользователю.
Подробно протоколы обменов и еще одна сторона, автоматизация обменов,
будут описаны ниже в отдельном разделе.
[3] Аббатство
Я держу мини-копию "монастыря" с библиотекой, куда могут приходить
посетители, и им также позволено создавать новые документы, комментировать
существующие, а также держать списки друзей и свои френд-ленты.
Это по масштабу меньше, чем ЖЖ, это скорее всего еще одна, единственная
машина, и я могу предоставлять эту услугу тем "отшельникам", которые
(возможно в силу технических ограничений) способны только читать и
копировать себе, либо быть "read-only" "одинокими аббатами".
Возможно, моя машина по-прежнему лишь частная домашняя машина, но на этой
ступени возможно это какой-нибудь линукс-компьютер арендованный у ISP. На
этой ступени применения программы она скорее всего будет включена 24 часа в
сутки (о "странствующих монахах" т.е. системах, которые могут выключаться и
менять от включения ко включению адреса см. подробно ниже).
Главное отличие здесь в том, что я организую на машине многопользовательский
режим.
Программа умеет все описанное в [1], [2], вдобавок вводя логин
пользователей, их личные блоги, и личные предпочтения для френд-лент и
наборов друзей.
Интересно, что и этот incremental step не так сложен. Когда мы опишем
устройство Хранилища документов, Библиотеки, станет очевидно, что все
поступления лежат в одном, центральном, главном месте для всего Аббатства.
Образование кружков друзей и их лент легко сделается путем создания
"виртуальных" директорий из soft links, указывающих на место в центральной
библиетеке сайта.
Это станет очевидно после рассмотрения принципов, по которым образовано
Хранилище.
[4] Монастырь.
Знаю, знаю, монастырь может значить практически то же, что и аббатство,
но мы здесь вводим в чем-то условные термины. Главное чтобы было понятно и
однозначно определено.
Новой функциональности по сравнению с машиной-"аббатством" нет,
изменился лишь масштаб. Вместо принципиально одного сервера в случае [3],
здесь мы имеем дело с несколькими, со множесвом apache instances,
расщеплением списка пользователей, каждый из которых может обслуживаться
with a setup повторяющим "аббатство", и заведомо мы откажемся от применения
CGI, перейдя на встроенный в веб сервер язык (mod_perl, php, ...) или
интерфейсы вроде mod_lisp (a generic ascii clone of fast_cgi), либо
fast_cgi - и так далее.
Дальнейшие требования к программе
Описанная серия ступенчато повышающейся функциональности должна:
- (а) быть одной и той же программой в идеале (хотя возможно написать
несколько, каждую на свой случай)
- (б) быть написана на языке, работающем на всех платформах, windows,
Mac, and Linux (плюс, возможно, другие популярные юниксы вроде BSD).
- (в) В идеале - на языке, который обеспечит создание a standalone
executable, не требующего установки языка интерпретации и каких-либо
дополнительных библиотек, или по крайней мере сводить их к минимуму
Это непростые и неочевидные требования. Может быть, использовать язык
вроде Явы? Писать на Пёрле, несмотря на то, что установка его на машину
наивным пользователем не гарантирована (мы уничтожим "отшельников" и
"одиноких настоятелей" и будем вынуждены держать многопользовательские
серверы доступа - что противоречит самой идее распределения копий по сети.
Может быть, мы могли бы написать это на каком-нибудь современном скриптовом языке,
который потом компилируется в standalone executable?
Как быть с требованием встроенного веб-сервера и веб-клиента (чтобы
копировать наши документы между машинами)? При этом по возможности избегая
внешних программ и библиотек - либо позволяя их, но создавая отдельно
процедуру гладкой установки для наивных пользователей..
Кажется, простое решение есть. Все инструменты на всех платформах
сводятся ко двум
- скриптовому простому языку, размером 200кб без
зависимостей, который позволяет "приклеивать" к себе скрипт, так что наша
программа на все случаи жизни будет одним файлом порядка 300 кб.
Этот язык имеет встроенный веб-сервер, простую работу с сетью, и все
основные операторы высокого уровня, которые делают perl таким популярным.
Это "newlisp", www.newlisp.org
- и такой же маленькой utility, которая обеспечит работу с https вне
ssl-функций веб сервера. Она использует крипто-библиотеку, но, насколько я
понимаю, сама библиотека уже установлена в windows, она распространяется
пре-компилированной, и потому, кажется, её установку удастся
автоматизировать или сильно облегчить, сведя к паре "щёлков".
Если понадобится б`ольший набор стандартных юникс-utilities, моим третьим
предпочтением будет busybox, прекрасная миниатюрная упаковка всех основных
команд юникса, которая компилируется как один файл (от 40кб до 1мб, в
зависимости от набора, который вы включаете).
Все это может работать на уровнях от персональной машины для чтения и
сохранения статей ЖЖ или блоггеров распредеелнной сети - и до "фермы
серверов", аналогичной ЖЖ.
Больше станет очевидно после объяснений следующих разделов.
Программа-отшельник с "келейной" функциональностью мной написана и используется уже года два как. Первый вариант этого агрегатора-личного блога без доступа извне был написан на пёрле, сейчас я его переделываю на newlisp. Разные части и функции не сведены аккуратно в один скрипт, но все они есть
Библиотека и Хранилища.
Обмены. Роли. Странствующие монахи