| 
本プロジェクトで開発した項目は、下記の四つの方向性に整理できる。
・時間軸情報共有
・リアルタイム情報共有
・マルチメディア情報共有
・全文検索機能
時間軸情報共有
WikiではWebブラウザを使って手軽にWebページを作成・編集できるので過去の情報を整理するのに適している。またqwikWebではメイリングリストも統合しているのでメイリングリストの配送およびメールに対応したWebページの作成で現在の情報を提示することもできている。本プロジェクトで開発したのは、未来の情報を扱う方法である。
未来の情報を扱うための機能として予定表共有機能を開発した。予定を表す方法としてタイトルにタグで日付を埋めこむことにした。そしてそのような予定を提示するための機能として{{plain}}プラグインとメイリングリストへの埋め込みの2つを開発した。{{plain}}プラグインは日付をチェックして未来の予定を現在から何日先の予定かによって色を変えて表示している。{{plain}}プラグインはサイドメニューにうめこんであるので、特になにも設定しなくても予定は常にサイドメニュー上にあらわれることになる。Wikiやメールで予定日をいれて登録すると、その予定はWikiページ上にもメール上にも常に表示されるようになる。グループが使っているメイリングリストに常に予定が表示されるようになるので、予定を共有し、忘れないようにする効果がある。
また会議などを開催する場合、常にやらないといけないのはスケジュールの調整である。本プロジェクトでは手軽なスケジュール調整機能を開発した。スケジュール調整でよくやられている方法は、候補となる日付と参加予定者からなる表を生成し、参加不可でその表を埋めていき、適切な日付を選択するというのが最も単純で一般的である。そのような方法を支援するものとして{{schedule}}プラグインを開発した。{{schedule}}をWikiページに書きこむと、これは自動的に5×5のテーブルとして表示される。それぞれの行が日付、列が参加者を表すようになっており、ブラウザから簡単に各参加予定者の参加不可情報を表に埋めていくことができる。また列、行ともに増やしたり項目名を変えたりすることも簡単にできる。入力されたデータはWikiの表としても表現されており、まとめて変更したい場合はWikiの表形式を直接編集することもできるようになっている。
さらに、年表表示機能を実装した。これは、サイトに蓄積されたページが、どの時期に誕生し、どのような頻度で編集が行われたのかを、一覧することができる機能である。年表表示はアクションプラグインとして実装されており、URLの最後に「.time_walker」を指定すると年表が表示される。
リアルタイム情報共有
会議とは、事前にメール等でアジェンダを決めておき、会議中にアジェンダを見ながらそれぞれの議題について議論し、それをホワイトボードなどに用いて記録し、会議の後に誰かが議事録という形でまとめて参加者に配布するという活動である。つまり会議とは、アジェンダから議事録となる文書をみんな集って共同編集する作業であると考えることもできる。
このような共同編集作業をよりよくサポートするための機能として、リアルタイム情報共有機能を開発した。これはWikiページのWYSIWYG編集機能とリアルタイム更新通知機能からなる。WYSIWYG編集機能によって、WikiページをHTMLによる表示の見た目のまま、編集することができる。リアルタイム更新通知機能により、同じページを見ている誰か他の人がそのページを編集したら、リアルタイムにページが更新されたことを伝えてくれる。このように、WYSIWYG編集機能と、リアルタイムページ更新通知機能とを組合せたWikiエンジンは、他にまったく例がなく、世界最初の機能である。
WYSIWYG編集機能は、Internet Explorerにおけるcontenteditableと呼ばれる機能を使用している。ページ中のWikiテキストに対応するHTMLエレメントに、アトリビュート
contenteditable="true" を埋め込んで表示させると、Internet Explorerはこのアトリビュートが指定された領域が編集可能であると認識し、その領域が編集可能となる。また、編集を行うために必要なボタン群や、更新するための保存ボタンが表示される。contenteditableを指定した領域はJavaScriptからHTMLとして取得できるため、保存ボタンがおされると、取得したHTMLをサーバに送信する。サーバは、受け取ったHTML文章をパースし、Wiki記法によるテキストに変換する。一般に、HTMLからWiki記法の変換は、情報が失われるため不完全となる。そのため常に元のWiki記法によるテキストに変換できるわけではないが、できるだけ元の文章に戻せるように工夫をしている。
リアルタイム更新機能は{{watch}}プラグインで提供されるJavaScriptで実装されている。このプラグインが埋め込むJavaScriptは、タイマーによって一秒毎に起動する。現在監視しているページの元ファイルのハッシュ値(MD5)をサーバから取得し、そのハッシュ値と、現在保持しているページのハッシュ値とを比較し、もし違っていれば、そこで「Update!」と表示し、最新のページへのアクセスするためのリンクも提示する。
マルチメディア情報共有機能
テキストだけの情報では不足で、画像などの情報が重要な場合がある。特に数十枚といった多数の画像を保持する場合、その一連の画像を一度の並べてみたくなる。ホワイトボードを使って会議を進める場合、会議終了後にホワイトボードの情報は、デジカメを使って画像として保存しておくと便利である。そのような会議後の情報共有のために、一連の画像を並べてみるアルバム機能を開発した。これは{{album}}プラグインとして実装されており、このプラグインを使うとFlashによるアルバム画面を表示できるようになる。この機能は、神原啓介氏による「なめらかアルバム」を使用している。なめらかアルバムは、一つのフラッシュファイルだけで構成されており、同じディレクトリにおかれた設定ファイルを読み込み、それに従って動作する仕組みとなっている。本プラグインは、その設定ファイルを動的に生成している。
また、地理的な関係における情報を整理する場合には、地図上に情報を埋め込めると便利だろう。例えば会議の開催場所を示す場合には、地図上の一点を示し、そこに直接情報を書けると便利である。Google
Maps APIを用いて、地図上に任意の情報を配置することができる地図情報共有機能を開発した。{{map}}プラグイン記法で地図の場所と、各位置の情報をWiki記法で記述しておけば、その地点に見出しの中身を表示してくれる。
マルチメディア情報共有として、そのような画像の共有機能、地図を元にした情報共有機能を実装した。この機能により文章以外に、画像、地図などの情報をシームレスに扱えるようになった。
全文検索機能
Wiki上で扱う情報が増えていった場合、その増大した情報にアクセスするための手段が必要となる。qwikWebはメイリングリストと統合されているため、ページの増える速度は通常のWikiよりも速い。Wikiサイトに蓄積された情報は大事な資産であり、過去のページにも効率的にアクセスできるような手段を提供する必要がある。そのため、Wikiエンジンへ、全文検索機能を統合した。ここでは全文検索ライブラリSennaを用い、超高速な検索機能を実現した。SennaはMySQLと統合して使用する全文検索エンジンだが、今回のプロジェクトにおいてRubyから利用するためのバインディングをSenna開発者に外注し、そのRubyバインディングでSennaエンジンを利用して実装している。{{isearch}}プラグインを使うと検索フォームが表示され、ここからSennaによるインデックスをもちいた全文検索をおこなうことができる。まだインタフェースが洗練されていないため、現状では単にその単語を含んだページへのリンクが表示されるだけである。関連度によるソート、スニペットの表示、類似文書の提示などといった高度な検索機能を今後行っていきたい。
わびさび方式
qwikWebは、基本的にWebサーバでもあり、ブラウザからのHTTPリクエストに対してはHTMLを生成して返答している。つまり内部でHTMLを扱う必要があるわけだが、HTMLをプログラム中でどのように扱うのかは、いろいろな方法がある。一般的には、テンプレートとなるHTMLファイルがあり、その該当する部分にプログラムが値を代入し、最終的なHTMLファイルが出来上がるという仕組みである。これを一般に、テンプレートシステムと呼んでいる。Rubyでは、erb,
eRubyなど様々なテンプレートシステムが存在している。
しかし、qwikWebでは、そのような仕組みではなく、「わびさび方式」と呼ばれる仕組みを採用している。わびさび方式とは、HTMLを、プログラム中の配列とシンボル、ハッシュ、文字列の組み合わせだけで表現する方式である。配列がHTMLのエレメントを表現し、配列の最初の要素がシンボルだった場合、そのシンボルをエレメント名とするタグとして表される。文字列は、単なる文字列として扱われる。二つ目の要素がハッシュだった場合、それはエレメントに対するアトリビュートを指定したものとして扱う。エレメントの中に他のエレメントが入った状態なども、配列の中に配列が入ったものとして、容易に表現可能である。
このわびさび方式の大きな利点は、メタ文字のエスケープを考えなくてもすむという点である。エレメント名やアトリビュート名とその要素である文字列とを常に区別して扱うことによって、最終的なHTMLの出力から、エスケープしわすれた文字列を含んでしまっていた、などということが原理的に無くなる。これによって、XSS脆弱性を未然に防ぐことができるようになっている。
また、このようにRubyが提供する基本的なオブジェクトの組み合わせだけでHTMLを扱うことができると、大変柔軟な操作を行うことができるようになる。例えば一旦生成したわびさびによるHTMLの表現を、その要素を解析して適当な構造のくみなおすといったことが可能である。erbなどの文字列に埋め込む方式では、一旦埋め込んだ後は一つの文字列になってしまう。それに対してわびさび方式では、なんらかの値を埋め込んだとしても、それを後から再度変更することができる。
このわびさび方式による要素の変形を支援するために、わびさび方式に対してXPathによって一部分を取り出すという機能を追加した。これによって、div要素のclassがsectionのものを取り出す、などといった操作が容易に行える。またこのようにして得られた配列に対して破壊的に操作することによって、一つの配列をどんどん変形させていくこともできる。
このわびさび方式は、元々は高林哲氏が、Gonzuiの開発のために発展させた技法であるが、qwikWebではその技法をさらに発展させ、わびさび方式に、コメントやDOCTYPE,
CDATA, XML Declarationなどを埋め込むことができるようにした。
以上の開発成果は http://qwik.jp/qwikWeb.html
により GNU General Public Licenseのもと公開・配布している。 またこれを使ったサービスが http://qwik.jp/
で運用されている。
|