Неожиданно обнаружил, что на тестовом сервере не работает поиск/редактор записей. Накатил на него обновления за последние пол-года. Их было не особо много, но поменялись некоторые внутренние механизмы.
Внешне:
- Теперь можно посмотреть на работу шаблонов (первый тип записи “Шаблон”).
- Поля и значения можно перетаскивать Drag-n-Drop.
- Кроме того, ищет по имени поля или по паре поле/значение. Можно попробовать “Тип/Запись” или “Место/Санкт-Петербург”
Внутри:
- Загрузка частей интерфейса единым запросом (chunks).
- Инициализация CouchDB через CouchUp.
P.S. Хорошая для меня новость: код совместим с CouchDB 0.10, который можно брать прямо из поставки Debian Squeeze.
Увы, проект ErlaNGinE решил немного отлежаться на полке 
Частично тому виной моя новая работа, частично — необходимость очередного пересмотра концепций (хи-хи).
Однако, недавно заглянув в исходники, я обнаружил, что последним коммитом была одна общеполезная штуковина, о которой хочу здесь рассказать:
При создании базы CouchDB мне понадобилось в map-скриптах парсить контент несколькими сложными способами. Для этого я написал небольшую библиотеку парсеров, которую требовалось включать в код скриптов. Соответственно, при ее обновлении требовалось обновлять и скрипты. (more…)
Я внес в dev@couchdb.apache.org предложение о кодировании Unicode в ответах сервера CouchDB в формате UTF-8 вместо \uXXXX, используя новую возможность mochiweb/mochijson2.
Ниже ответ Chris Anderson на мое предложение.
Если кто-нибудь имеет полезные мысли по заданным вопросам, пожалуйста сообщите 
(сюда, или прямо в рассылку)
(more…)
ErlaNGinE окончательно переполз на CouchDB 0.9. Последним сдался демонстрационный сервер.
Хочется заметить, что упоминавшиеся недостатки старой версии, в новой, так или иначе, устранились:
- аттачи больше не теряются при модификации основного документа,
- map-reduce, при необходимости, может быть вынесен на отдельный сервер и там распараллелен методом “на коленке”
— сдается мне, это было и в 0.8.x, просто я недочитал…
- кодирование utf в формат \uXXXX в ответах сервера я победил самолично (остлось протолкнуть патчик разработчикам CouchDB)
Обратите внимание, что:
- при преходе к 0.9 изменился формат базы данных. Предлагают конвертироваться питон-скриптами.
- изменилось место хранения view: /db/_design/DESIGN/_view/VIEW
Попутно отмечу, что недрах ErlaNGinE работает модифицированный ECouch. Из вкусностей:
- недоделанный rfc4627.erl заменен на engejson.erl — бинарный парсинг, нормальный юникод и укороченная запись JSON. (Сторонники традицонного “struct” могут просто заменить вызовы engejson на mochijson2 и все будет работать),
- http-запросы переведены в бинарный формат (mochijson2 парсит бинарный JSON),
- появился отдельный, оптимизированный запрос для получения бинарных аттачей,
- несколько переработан код в сторону сокращения избыточности.
Поправил mochijson2.erl на предмет упоминавшегося мной ранее косяка с кодированием всего юникода (как двух-байтного, так и UTF-8), а также непечатных символов (<32) в виде \uXXXX.
И если для непечатных символов это хорошо и правильно, то кириллицу это неоправданно раздувает в 3 раза, кроме того, делает неудобной отладку по JSON трафику
С учетом того, что decode/1 и без лишнего вмешательства правильно декодирует \uXXXX, Unicode и UTF-8 во внутренний Unicode, с этим патчем, любой юникод, полученный во всех доступных видах, на выходе encode/1 будет представлен в форме UTF-8.
P.S. Проверил CouchDb 0.9: с моим патчем начал нормально отдавать utf-8.
P.P.S. Патч включен в официальный mochijson2.erl как опциональное поведение. Теперь можно делать так:
Encode = mochijson2:encoder([{utf8, true}]),
Encode(json()).
До сих пор использовал вариант mochijson2, в котором атом struct, используемый для обозначения объекта заменен на obj (так писать короче).
Вдруг подумалось, что можно от него и вовсе отказаться и, на ряду с JSON array, представлять объект разновидностью списка. А именно:
- если erlang-список представляет собой proplist() (а точнее, первый элемент списка - тупл {key(), value()}), то это — JSON объект,
- в остальных случаях (когда первый элемент списка — скаляр или список), это — JSON array
- пустой объект кодируется как {empty}
(more…)
Делая очередной модуль (адресную книжку), который по сути реализует логическую обвязку Mnesia-таблички, задумался вот над чем:
С одной стороны, для модуля желательны элементы gen_server: фаза инициализации (проверить доступность таблицы, создать, при необходимости), желание иметь автоматический code_change для запуска процедуры конвертации таблицы в новый формат, и т.д.
А с другой стороны, преимущества использования handle_call и dirty_* доступа к Mnesia вместо прямых обращений к ee транзакционному механизму неочевидны и “умничать” до появления реальной нагрузки смысла нет. Т.о., получается, что серверных функций, как таковых, модуль не выполняет — в его API нет ни одной функции, заканчивающейся вызовом gen_server:call.
Помучившись данной темой, реализовал как gen_server без handle_call, но остался вопрос: оправдано ли здесь применение gen_server behavior или лучше подойдет что-нибудь другое?
Обнаружил, что весь HTML интерфейс ErlaNGinE можно удобно разбить на компоненты - блоки, умещающиеся в один div, и содержащие HTML-код и JavaScript-обвязку. Такими компонентами можно представить логин, навигатор документов, редактор и пр.
Написал функцию insert(Id, Url) в модуле enge.js, которая позводяет загрузить код из Url, разделить на HTML и JavaScript, HTML вставить внутрь элемента Id, а JavaScript выполнить… ну и плюс хуки на обработку вставленного HTML и на завершение последнего insert-a.
То, что получилось, описано здесь: http://wiki.github.com/dmi/erlangine/html-modules-with-insert
Думаю, изобрел колесо
Но получившиеся модули достаточно удобно “функционализируются” в “черные ящики”.
Немного о CouchDb, которая применяется для хранения документов в ErlaNGinE и ее особенностях, обнаруженных на практике… (more…)
Под таким одиозным заголовком я буду писать о первой концепции ErlaNGinE (их несколько, остальные — пока в очереди). (more…)