WiLiKiのソースはSourceForgeから ダウンロードできます。
WiLiKiはScheme処理系Gaucheを使って書かれています。WiLiKi-0.5.1を 走らせるには、Gauche-0.8.3以降が必要です。 Gaucheについては http://practical-scheme.net/gauche/ を 参照して下さい。 GaucheMemo:CGIを使うための準備も参考になるかもしれません。
Gaucheが既にインストールされていれば、WiLiKiのインストールは単純です。 tarballを展開した後、標準的にconfigure+make+make installするか、 gauche-packageコマンドを使います。
% gauche-package install WiLiKi-0.5.1.tgz
wiliki.scmをはじめとするWiLiKiの主要モジュールは Gaucheのサイトライブラリディレクトリ (Gaucheが/usr 以下にインストールされて いる場合は、通常 /usr/share/gauche/site/lib 以下) にインストールされます。 このディレクトリはGaucheのバージョンアップによっても上書きされないので、 将来Gaucheだけをバージョンアップした場合にWiLiKiを再インストールする 必要はありません。
次に、src/wiliki.cgiをサイトに合わせて編集します。 詳しくは下の「カスタマイズ」の項を参照して下さい。
編集したwiliki.cgiは、cgiスクリプトが使えるディレクトリにコピーしておきます。 httpサーバの設定によって、特定のディレクトリ (cgi-bin等) 以下でしか cgiスクリプトが使えなかったり、パーミッションが特定の条件を満たしていないと cgiスクリプトと認識されなかったりする場合があるので注意して下さい。 また、スタイルシートを使う場合はそれも適切なパスにコピーして下さい。
サイト固有の情報は全てwiliki.cgi内で設定します。 (wiliki.cgiの文字エンコーディングは、Gaucheの内部文字エンコーディングに 合わせて下さい。Gaucheの内部文字エンコーディングは gosh -V を実行すると 表示されます)。
wiliki.cgiは、コメントを省けばこんなスクリプトです。
#!/usr/bin/gosh (use wiliki) (define (main args) (wiliki-main (make <wiliki> :db-path "/home/shiro/data/wikidata.dbm" :log-file "wikidata.log" :top-page "WiLiKi" :title "MyWiliki" :description "Shiro's Wiliki Site" :style-sheet "wiliki-sample.css" :language 'jp :charsets '((jp . euc-jp) (en . utf-8)) :image-urls '((#/^http:\/\/sourceforge.net\/sflogo/ allow)) )))
変更する必要があるのは、最初の#!の行と、"make <wiliki>"の下の キーワード引数です。
最初の#!の行はインストールされたgoshのパスを指すように書き換えます。
キーワード引数はそれぞれ次のような役割を持っています。 最低限、:db-pathの設定が必要です。
:db-path | データベースファイルのパスを指定します。このパスは、サーバープロセスから見たパスです。通常、htmlでは参照できない場所に、wiliki専用のディレクトリを掘って、その中にデータベースを置くようにすると良いでしょう。データベースファイルは最初にwilikiにアクセスした時に自動的に作成されます(ディレクトリのパーミッションをcgiスクリプトから書き込めるようにしておいて下さい)。データベースファイルの形式は、データベースタイプによって異なります。デフォルトではgdbm形式です。 |
:log-file | 編集履歴機能を使う場合、コミットログのファイル名を指定します。ファイル名が相対パスで与えられた場合は、:db-pathのパス名からの相対パスと解釈されます。このキーワード引数を指定しないと、編集履歴機能はoffになります。 |
:top-page | ページ指定無しでアクセスした場合に表示されるページ名を指定します。このページは最初にアクセスした時に作成されます。 |
:title | 「最近の更新」「検索結果」等のページでタイトルに付加される文字列です。 |
:description | RDF Site Summaryで、サイトのdescriptionに使われる文字列です。 |
:style-sheet | スタイルシートを使う場合、そのパス(URL)を指定します。 |
:language | デフォルトの言語設定を指定します。'jp(日本語)か'en(英語)を指定してください。 |
:charsets | 言語設定毎に、出力する文字エンコーディングを指定します。上の例では言語設定がjpの場合はeuc-jpを、enの場合はutf-8を使うようにしています。(出力文字エンコーディングはもとのデータから変換可能でなければなりません。例えば日本語で書かれているページをiso-8859-1で出力しようとしたらエラーになります)。 |
:image-urls | インラインイメージ展開を許可、もしくは拒否するURLのパターンのリストを指定します。リスト内の各要素は "(predicate action)" の形式で、predicateにはURLを受け取り真偽値を返す手続きを、actionにはシンボルallowかdenyを指定します。(Gaucheではregexpも述語手続きとして動作できるので、predicateに直接regexpを書いておくことができます。)$$imgマクロ(WiLiKi:リファレンスマニュアル:マクロ参照)は、イメージのURLにpredicateに適用し、それが真の値を返したところでそのactionにしたがってインラインイメージとして展開するかどうかを決定します。 |
:editable? | このキーワードを#fにしておけば、編集不可となります。 |
:debug-level | 非負の整数を指定します。1以上の値が指定されていると、WiLiKi内部でエラーが起きた時にエラーページにエラー箇所を示すスタックトレースや、データベースパスを表示します。それらの情報は問題解決には有用ですが、一般に公開されているサイトの場合はセキュリティ上の問題になる可能性もあるため、デフォルト(debug-level 0)では表示されません。 |
:db-type | デフォルトの<gdbm>以外のデータベースを使いたい時にそのクラスを指定します。詳しくは下の「バックエンドデータベース」を参照して下さい。 |
wiliki.cgiはサーバが起動するCGIスクリプトそのものなので、 他の処理を書くこともできます。 例えばwiliki-mainの起動前にクッキーを見て、 特定の場合だけ編集を許可したり、デフォルトの言語設定を切替える といったことも可能でしょう。
WiLiKiは特定のデータベースをバックエンドとして要求することはありません。 基本的には、Gaucheのdbmプロトコルに沿ったデータベース実装であれば 使うことができます。
Gauche-0.7.2を使っている場合は、次のdbm実装がGauche本体に付属して 提供されています。
モジュール名 | dbm実装クラス名 | 備考 |
dbm.gdbm | <gdbm> | gdbmライブラリを使う(既定値)。データベースは、:db-pathに指定したパス名を持つファイル一つに格納される。 |
dbm.ndbm | <ndbm> | ndbmライブラリを使う。データベースは、:db-pathに指定したパス名を持つファイルに、".dir"および".pag"という拡張子をつけた2つのファイルに格納される。ライブラリによっては、格納出来る項目の長さに制限があったり、同時アクセス時にデータベースがロックされない等の問題があることがある。 |
dbm.odbm | <odbm> | レガシーなdbmライブラリを使う。ファイル名、制限はndbmと同じ。 |
dbm.fsdbm | <fsdbm> | :db-pathに指定したパス名のディレクトリの中に、WiLiKiの1ページに対して1ファイルを作って格納する(実際はハッシュされたサブディレクトリ以下に格納される)。ページ数が増えると全文検索等は他のdbmライブラリに比べ遅くなるが、同時に多数の読み出しがあるケース等ではあまり性能に差は出ないと思う。 |
gdbm, ndbm, odbmは、WiLiKiが走るマシンに該当するライブラリが インストールされていないと使えません。fsdbmはそれらのライブラリが 無くても使うことができます。
デフォルト以外のdbmシステムを使う場合は、wiliki.cgiを 次の様に記述します。
#!/usr/bin/gosh (use wiliki) (use dbm.fsdbm) ;; 使用するdbmライブラリを読み込む (define (main args) (wiliki-main (make <wiliki> :db-path "/home/shiro/data/wikidir" :log-file "wiki.log" :top-page "WiLiKi" :title "MyWiliki" :description "Shiro's Wiliki Site" :style-sheet "wiliki-sample.css" :language 'jp :charsets '((jp . euc-jp) (en . utf-8)) :db-type <fsdbm> ;; 使用するdbmクラスを指定 )))
wiliki.cgiを名前やパスを変えてコピーし、編集するだけで、 ひとつのサイトで複数のWiLiKiを運用することが出来ます。
また、データベースを共有するwiliki.cgiを二つ作り、 一方は:editable?を#fにしておき、もう一方に.htaccess等で 認証をかけておけば、特定の人にしか編集できないWiLiKiサイトになります。
複数のWiLiKiをまたがってWikiNameを参照するには、InterWikiNameが使えます。
複数のWiLiKi間で更新情報を共有するしくみは現在実験中です (WiLiKi:RSSMix)。
バックアップの方法はデータベースの実装によって異なります。 WiLiKi側ではバックアップ用のインタフェースは特に用意していません。 gdbmを使っている場合は、dbmファイルを定期的にコピーするのが 簡単でしょう。 (厳密には、cpコマンドでのコピー中に誰かがページを編集した場合、 コピーされたデータベースがおかしくなる可能性があります。 それが問題になるようなら、データベースをロックしてコピーを取る スクリプトを書くと良いでしょう。 ただ、そのようなケースが頻繁に起きるほど更新頻度が高い場合は、 より本格的なデータベースの使用を検討した方が良いかもしれません。)
:log-fileに指定したコミットログファイルには、ページを編集する度に 情報が付け加えられてゆきます。
WiLiKiでは、データベースそのものには常に最新のページの情報しか 格納しません。編集履歴が要求された時には、コミットログの内容と 最新の情報とから、ページの過去の状態を再現します。
あまり無いケースだとは思いますが、大きなページを頻繁に作成して 消すことを繰り返したりして、コミットログが非常に大きくなって しまい、編集履歴の検索に長い時間を要するようになってしまった場合は、 ログファイルを移動したり消去することで、その時点から改めてログを 記録しはじめることができます。(その場合、その時点以前の編集履歴は 参照できなくなりますが)。