qwikWebの特徴

この文章は,qwikWeb開発の比較的最初のころ,2004年9月に書いたものです. そのため現在の状況とは異なった記述もあります.歴史的意味として,最初の 文章のまま残してあります.

qwikWebの特徴 (2004-09-01公開版)

この文章はまだ草稿です。

全てをページで管理

全ての管理をページの編集に還元するというコンセプトを持っている。

メタな機能に属するため、通常は別の機能として実現する テーマの変更や、サイトの公開・非公開の設定などといった設定項目も、 ページの編集に還元している。このことによって、 場面によって異なる特殊なインタフェースを持たずに、 ページ編集という単一のインタフェースで、全ての機構を管理できるようにしている。

また、ある一つのページは中心となるコンテンツ部分の他に、横にサイドメニュー、 上に編集のためのメニュー、下にフッターがついていたりする。そういった それぞれのメニューも、場合によってはカスタマイズしたいと思うことがある。 そういう時のために、それぞれのメニューもページとして管理し、 そのページを編集すれば、そのサイトにおけるメニュー項目を変更できるという 仕組みにしている。

WikiDB機能

前述の全てをページで管理するというコンセプトの一部なのであるが、 qwikWebの重要な機能の一つとして、WikiDB機能がある。 これはWikiのページを、あたかもDBのように機能させる機能だ。

例えば一般的なWikiだと、InterWikiNameというページだけは他のページとは違って 特殊な役割を持っている。そこにある書式で他のWikiページへのリンクを貼っておくと、 それの内容を他のページから、InterWikiという方法で利用できる。 これはInterWikiNameというページだけが他のページの中身にも影響を及ぼすことから、 このページだけがメタな役割を担っていると考えられる。 それと同時に、InterWikiNameは、実は単なるWikiのページでもあるので、 普通のページと同じような方法で編集できる。

WikiDB機能は、このInterWikiNameが持っていたページへのメタ機能の付与を より一般的な形式で利用できるようにしたものである。 WikiDB機能を利用したページはいくつかあり、それを紹介する。

InterWikiName これは普通のInterWikiと同じであるが、WikiDBを用いて書き直されている。 SiteConfig これは、サイト全体に影響を及ぼす設定項目を、WikiDBを用いて管理されれている。 SiteMember これはサイトを利用できるメンバーを管理するDBである。 (このファイルはQuickMLのメンバーの管理と分離しているため、ここに追加された 名前はQuickMLのメンバー管理には反映されない。逆は反映される。)

WikiDBの設定項目は、二種類ある。 一つは、:で区切られたハッシュ形式。画面上では用語定義として表示される。 最初のdtに示されるのがkeyで、その後に続くのがvalueとして読み出せる。 もう一つは、,で区切られたテーブル形式。画面上ではテーブルとして表示される。 最初の項目がkeyで、後に続く項目がvalueのArrayとして読出せる。 この二つの形式で、おおよそのデータ形式に対応できるのではないか。

このWikiDB機能の利点は、通常は面倒な 手続きを踏むことが多いデータベースの更新を、単なるテキストの編集に還元できる というところにある。これはInterWikiNameの持つ簡便さと同様である。

現状ではまだあまり凝った利用はしていないが、これを拡張すれば、 様々なアドバンスドな機能をWiki上に実現できるようになるはずである。

WikiDBの実装は、項目の変更はあまりおこらないで、読み出しが多くおこるという 前提に基いている。そのため、要素が度々変更されるような用途には若干 向いていない可能性がある。

WikiFarm

qwikWebは、WikiFarmであることを標準としている。 WikiFarmではないWikiは存在しないという前提条件としている。 もちろん、WikiFarmであるが、そこには一つしかWikiが無いというのはありうる。 (新しいWikiサイトを立ち上げるのは、Webサイトからではなく、 コマンドラインから立ち上げるという仕組みにしようと思っている。)

一つのサイトで複数のWikiが立ち上がると、そのそれぞれのWikiに初期状態の Wikiページ群をコピーすることになっている。しかしTextFormatなどはそれぞれ のWikiで共通であるため、わざわざコピーするのは無駄である。 そのため、superというディレクトリを作り、ここにあるデータは全てのWikiサイトの 親(parent)であるように振舞う。そして、そこになにか変更を行ったときに、 それぞれのWikiサイトにコピーされるようになっている。

HTMLオブジェクト

従来のプログラミングでは、HTMLの生成を文字列処理で行うことが多い。 しかしその方法の場合、一歩間違うとセキュリティの問題を生むことになる。 HTMLは、タグの部分とそこに囲まれたテキストの部分を常に違うものとして 分離して扱い、テキストの部分は絶対にsanitizeを忘れないようにしなければ ならない。そうしなければ、XSS(Cross Site Scripting)脆弱性を生むことになる。 しかしプログラミングの最中にそういったことを常にケアし続けるのは 非常に大変である。「はてな」や「namazu」といった有名なサービス、 ソフトウェアも過去にはXSS脆弱性を抱えていたことがある。

qwikWebではプログラミングの方法論として、けっしてHTMLを文字列として 扱わないという方法をとっている。常にHTMLをオブジェクトとして生成し、 最後の最後にStringを生成して出力する。そのため、他の方法と比較して、 うっかりテキストの部分に<を入れてしまったというミスを防ぎやすくなる。

またさらに利点としては、最後までHTMLをオブジェクトのままとしているため、 後でその構造を変更するこができる。HTMLオブジェクトの変更を、XPathのような 仕組みで操作し、変更することができるため、従来ならばFormatterに直接 手を入れなければ実現できなかったような操作をダイナミックに実現することが できるようになる。

Hikiとの互換性

元々、Hikiの改造から出発しているため、実装の構造は似通っている。 また実際に、Parser, Formatterのコードはほとんどそのまま使用している。 それ以外は、仕様を参考にしつつ、ほとんど再実装されている。

最初はできるだけHikiとの互換性をとるようにしようと考えていたが、 現在のところは互換性は低い。

TextFormatは互換性はない。見出し、リストの記号が PukiWikiのものに変更されている。これは単に作者がPukiWikiの記法に慣れて いるからである。TextFormatをサイト毎に切り替えられるようにするという 手法も考えられる。

HikiはtDiaryとテーマが共有できる。 qwikWebも同様にテーマはtDiary互換となっている。

Hikiのプラグイン(tDiaryのプラグイン)は、利用できない。 これは利用できるようにしたいと考えている。

BitChannelとの違い

同様にRubyで書かれたWikiエンジンとしてBitChannelがあり、 非常に興味深いポリシーを採用している。 そのため、BitChannelのポリシーとqwikWebのポリシーを比較する。 (あらかじめ明記しておくが、BitChannelを批判する意図はない。)

記法としてRD風の記述にも対応している。 しかし様々な記法をとりうるというのは、場合によっては編集する人が 複数の記法を覚えないといけないという面もある。そのため、 一つのサイトには一つの記法というポリシーとする。

拡張性重視。プラグイン重視。

さまざまなアドバンスドな機能重視。普通のWikiには無いような、 凝った機能、珍しい機能、複雑な機能を実装することを優先する。 これはWikiの可能性、すなわちWebの可能性を探究するというそもそもの 動機から、できるだけ可能性の幅を拡げたいと考えているからである。

インストールの容易さを重視。 解凍したら、二秒で使えるようにする。 (一秒でないのはなぜかって? なんとなく。)

この、インストールの容易さは、いまのところ目標です。 現状ではそんなに簡単ではないです。

最近WEBrickベースのWikiエンジンがでた。これもinstallの容易さを 唱っている。非常に良い特徴だと思う。

Last modified: 2007-01-24 Attached files total: 1MB