среда, 17 февраля 2010 г.

SynchroTron TiddlyWiki или распределенная совместная работа с wiki без сервера почти как в Mercurial или Git

Недавно подсел на TiddlyWiki, wiki которой не нужен сервер, php, базы данных, нужен только клиент в виде браузера IE6.0 и выше, Firefox-1.5 и выше.

Опишу кратенько фишки, которые мне понравились:
1) не нужен сервер, только браузер;
2) все в одном html файле c javascript в нем же;
3) можно указать адрес другой TiddlyWiki сиcтемы, просмотреть список всех статей и плагинов, выбрать нужные и импортировать к себе в вашу локальную wiki;
4) большое количество разномастных плагинов.

И фишки, которые не понравились:
1) все в одном файле, как следствие пухнет, но есть плагин, который позволяет раскидать статьи по нескольким html файлам (в файлах должна быть таже TiddlyWiki), с загрузкой данных из них по требованию, сам не пробовал, но как решение данного недостатка думаю в самый раз;
2) некоторые вещи связанные с интерфейсом, но это все изменяемо.

Использовать ее удобно как wiki описание к проекту. Вы кладете html файл к вашим исходниками, можете закинуть даже в систему контроля версий и получаете wiki систему в которой можете описывать ваш проект, вести его и так далее. На мой взгляд, то что надо. И для этого не надо ставить Apache+Python|PHP|Perl+SQLite|MySQL|PostgreSQL и быть привязанным к серверу, как коза веревкой к колу.

Но мне этого показалось мало, в последнее время я немного был увлечен распределенными системами контроля версий Mercurial и Git. И думал, как бы было удобно, если бы эта wiki имела интеграцию с ними. Я имею ввиду для отслеживания изменений в самой wiki, а не для вывода состояния репозитория в Mercurial или Git как в Trac, и при этом иметь такое же удобство ведения ответвлений как в этих системах.

Я быстренько это дело по-google-ил, и случайно нашел нечто немного другое, но оказавшееся тем, что фактически я и искал.

Наткнулся я на проект SynchroTron (скачать, описание) - Javascript библиотека позволяющая вам осуществить diff, diff3, merge и контроль версий прямо на javascript от вот этой замечательной компании Osmosoft. Кстати, они разрабатывают проект TiddlyWeb, основная задача которого обеспечить доступ к TiddlyWiki через удобное HTTP API, серверная часть там реализована на Python. Мне эта часть была не особо нужна, но раз ее уже придумали, то просто отлично и это еще один повод позаниматься TiddlyWiki подробнее.

Но я отвлекся, суть работы diff на javascript в том, что вы передаете пару фрагментов текста, вызываете diff и получаете различия в виде json массива:

diff("the quick brown fox jumped over".split(/\s+/), "the quick fox jumps over".split(/\s+/))

[{common:["the","quick"]}, {file1:["brown"], file2:[]}, {common:["fox"]}, {file1:["jumped"], file2:["jumps"]}, {common:["over"]}]

Кстати у google в этом плане оказывается тоже есть наработки и думаю если поискать внимательно на sf.net, то парочка еще точно найдется.

Дальше больше, эту тему они развили здесь Diff for Javascript, revisited, где json массив стал походить не на обычный побуквенный diff, а на вывод в формате patch, в котором указывается также смещение и длинна измененного текста, такой вариант уже будет легко приспособить, чтобы покрасить нужные буквы в нужный цвет при отображении разницы одного текста от другого, вот пример ответа:

[{file1:{offset:2, length:1, chunk:["brown"]}, file2:{offset:2, length:0, chunk:[]}}, {file1:{offset:4, length:1, chunk:["jumped"]}, file2:{offset:3, length:1, chunk:["jumps"]}}, {file1:{offset:6, length:1, chunk:["a"]}, file2:{offset:5, length:2, chunk:["some", "lazy"]}}]

Но на этом они не остановились, они реализовали merge, теперь в json находится померженный текст, с указанием конфликтных мест слияния:

js> uneval(Diff.diff3_merge(derived1, base, derived2, true)); [{ok:["the", "quick", "fox", "jumps", "over"]}, {conflict:{a:["some", "lazy"], aIndex:5, o:["a"], oIndex:6, b:["some", "record"], bIndex:6}}, {ok:["dog"]}]

Грубо говоря, они создали весьма удобные в использовании функции. Кстати снова не забудем google, ведь у них тоже есть нечто подобное.

Там же вы найдете презентацию Distributed Version Control in JavaScript or any other language that takes your fancy. Tony Garnock-Jones tonyg@lshift.net
LShift Ltd.
в которой присутствуют работающие ссылки на демо страницы.


Diff Demo

LShift Ltd. Google

Diff3 or Merge Demo

LShift Ltd. Google

DVCS Demo

LShift Ltd. Google (?oops)

Думаю те кто использует Mercurial или Git взглянув на следующий скриншот сильно заинтересуются, увидев знакомые ветвистые деревья, есть некоторое сходство :D, но есть разница. Все это на javascript.

Альбом: Все или ничего (The Longest Yard)

Другими словами, в SynchroTron они сделали систему контроля версий на Javascript, которая управляет наборами JSON структур (файлов же нет на javascript :)). Все что я здесь указал кратенько там рассказано, только по английски. Так же там указаны javascript библиотеки, которые они использовали для реализации той иной задачи, думаю это любопытно для тех кто пишет на javascript.

В результате всего этого я все таки наткнулся также на следующую статью: Adding distributed version control to TiddlyWiki, тут у меня задражали пальцы при наборе ссылки, неужели все это дело они уже успели еще до кучи впихнуть в TiddlyWiki? В общем так оно и случилось :)

Добро пожаловать на SynchroTron TiddlyWiki.

Cамое интересное вы увидите на вкладке Versions, которую надо выбрать, она справа от центра.

На следующем рисунке

Альбом: Все или ничего (The Longest Yard)

вы увидите дерево ревизий. Выбрав checkout на одной из ревизии вы увидите, что содержимое статей в wiki изменяется, а также изменяется и состав статей. Дерево отсортировано всегда хронологически.

Самые пытливые заметят пункт Merge и слияние двух веток в одной ревизии. Да, да, да! Это банальное слияние состояний вашей wiki.

Но самые пытливые из пытливых отметят еще и пункт Import! С его помощью вы можете указать другую локальную TiddlyWiki, откуда вы можете импортировать новые и возможно даже измененные существующие уже в вашей TiddlyWiki статьи. После импорта у вас появится ответвление, с которым вы можете смержиться.

Все отличающиеся не конфликтные статьи просто изменяться, а все конфликтные откроются и будет предложено исправить все конфликты вручную, но ведь это wiki, править надо именно wiki текст, а не голый html!

На следующем рисунке вы увидите результат моего эксперимента по импорту статей из второй wiki в первую. Вторая wiki, ранее была создана копированием из первой, потом в первой и второй wiki в строке 222 и 555 в первой и второй теме соответственно были изменены цифры (в 1-й wiki на 7, а во 2-й wiki на 8), чтобы получить конфликт при слиянии сразу в двух темах. На рисунке вы собственно видите, предложение поправить конфликт после импорта первой и второй темы из второй wiki в первую.

Альбом: Все или ничего (The Longest Yard)

Чтобы воспользовваться этим в своей TiddlyWiki достаточно у себя выбрать пункт import указать адрес http://hg.opensource.lshift.net/synchrotron/raw-file/default/tiddlywiki/tiddlydvcs.html и импортировать к себе все пункты, после чего вкладка Versions появится и у вас :) И вы получите wiki движок с распределенной системой контроля версий wiki в одном флаконе и для работы с ним нужен только браузер, а для обмена статьями в таком случае, только html файл c изменившимися статьями.

Совсем недавно наткнулся на еще одну статью полностью на английском языке про это же самое, но только собрано все на одной странице и конкретизировано.

среда, 10 февраля 2010 г.

Видеозапись семинаров

Посмотрел тут на видео одного из семинаров, не буду говорить на какую тему, но без слез не взглянешь, уж лучше бы просто выложили электронные презентации, чем так позорится. Люди, не надо позволять себя снимать на вашей первой презентации. Думаю, что только человек проведший не один семинар на ту же самую тему может достойно выступить и рассказать внятно свою тему. Остальное, не подготовленные семинары ни на ком не опробованные.

пятница, 5 февраля 2010 г.

О памяти

Мне кажется, что мысли так редко приходящие мне в голову, забываются со вренем лишь только потому, что они не сгруппированы, не приводят к какой-то завершенной большой и изящной, четко оформленной мысли или суждению о предмете. То есть, набор ни с чем не связанных мыслей подобен хаосу, который просто невозможно не забыть. Может поэтому свои мысли стоит записывать.