Index: /arege.net/htdocs/tdiary.conf
===================================================================
--- /arege.net/htdocs/tdiary.conf (revision 782)
+++ /arege.net/htdocs/tdiary.conf (revision 782)
@@ -0,0 +1,347 @@
+#
+# tDiary configuration file $Revision: 1.38 $
+#
+# For those who do not read Japanese: please read doc/README.en.html or
+# misc/i18n/README-en.rd and use misc/i18n/tdiary.conf.sample-en.
+#
+
+#-------
+# 設定画面から指定できない項目群
+#-------
+
+# 日記データベースを作成するディレクトリ【必須】
+#   日記のデータを保存するディレクトリです。このディレクトリは通常、WWW
+#   経由でアクセスできない(public_html配下でない)ディレクトリを指定しま
+#   す。このディレクトリは、WWWサーバの権限で書き込めるパーミッションに
+#   しておく必要があります。
+@data_path = "#{$master.user.datadir}/tdiary"
+
+# 日記保存形式の指定【オプション】
+#   日記の保存形式を標準から変更する場合には、必要な設定をしなければなり
+#   ません。何も指定しない場合にはtDiary2形式(テキスト)になります。
+#   何を指定するかは、その保存形式用プログラムの説明に従ってください。
+#   以下の2行のコメント(#)をはずすと、tDiary1形式(バイナリ)になります。
+#require 'tdiary/pstoreio'
+#@io_class = TDiary::PStoreIO
+
+# 日記記述形式の指定【オプション】
+#   日記の記述形式(書き方のフォーマット)を指定できます。現在は'tDiary'
+#   のみがサポートされていますが、記述形式用プログラムを追加すればそれを
+#   指定することも可能です。
+#@style = 'tDiary'
+
+# 参照・更新スクリプト名【オプション】
+#   @indexと@updateには、それぞれ参照用、更新用のスクリプトファイル名を
+#   指定できます。通常これらは内部的にデフォルトの名前(「./」と「update.rb」)
+#   が設定されていますが、これを明示することで、ApacheのDirectoryIndexが
+#   指定できない環境や、フレーム内に日記を入れたい場合に利用できます。行
+#   頭の「#」を外してから値を書き換えて下さい。
+#@index = './'
+#@update = 'update.rb'
+@update = 'edit'
+
+# マルチユーザモード【オプション】
+#   @multi_userは、日記を複数ユーザで記述するときに利用する変数です。こ
+#   の値をtrueにすると、マルチユーザモードになり、tDiaryは以下のように挙
+#   動を変え、サブタイトルの先頭に、「[ユーザ名]サブタイトル」という形式
+#   で記入者の名前が入ります。
+#   マルチーユーザモードでの日記の編集は、とても危険です。なぜなら、複数
+#   の人が同時に編集作業をした場合、先に保存した人の日記が消えてしまうか
+#   らです。tDiaryをマルチユーザモードで利用する場合は十分に注意して運用
+#   しましょう。
+#   ここでいう「ユーザ名」は、ブラウザからログインする時に使ったものです。
+#   なお、.htaccessのRequire Userに、必要なだけユーザを追加するのを忘れ
+#   ないでください。
+@multi_user = false
+
+# プラグインのパス【オプション】
+#   単一のインストールイメージで複数の日記を運用する場合に、プラグイン
+#   を分けたい場合があります。その場合、@plugin_pathでプラグインのディ
+#   レクトリを指定することで、日記ごとにことなるプラグインを指定できま
+#   す。なお、この指定がない場合には、インストール先のpluginディレクト
+#   リが使われます。
+#@plugin_path = 'path of plugins'
+
+# キャッシュファイルのパス【オプション】
+#   tDiaryは動作時にさまざまなキャッシュファイルを作成します。このディ
+#   レクトリは通常、@data_pathの下に作られますが、ここで別のディレクト
+#   リを指定することも可能です。
+#@cache_path = 'path of cache'
+
+# プラグインに渡すオプション【オプション】
+#   プラグインによっては、tdiary.conf経由でオプションを渡すことで挙動を
+#   変更できるものがあります。@optionsはそのオプションを指定する時に使う
+#   変数です。指定方法は以下のとおりです。詳しくは各プラグインの説明を参
+#   照照して下さい。
+#     例: sampleプラグインのhogeオプションを設定
+#         @options['sample.hoge'] = 'foobar'
+
+# プラグイン適用後にもういちどプラグインを適用するかどうか(true/false)
+@options['apply_plugin'] = true
+
+# 編集画面でのアクセスキー
+#   true なら有効になります。Safari で Emacs と同じキーバインディングを
+#   使いたい場合は false にするといいでしょう。
+@accesskey_enabled = true
+
+# tDiaryをproxyの内側に設置する場合(頭に「http://」を付けない)
+# @options['proxy'] = 'proxy.example.com:8080'
+
+# bot扱いすべきUser-Agentたち。Googlebotなどはデフォルトで対応している
+@options['bot'] = [
+	'^BlogLines/',
+	'^blogmap',
+	'MI[CK]AN/',
+	'^NG/',
+	'^samidare',
+	'^TAMATEBAKO/'
+]
+
+# リンク元の記録制御(true/false)【オプション】
+#   日付指定のアクセス時のリンク元だけを記録するかどうかを指定します。標
+#   準ではtrue(日付指定のみ記録)です。これをfalseにすると最新ページへの
+#   アクセスが「本日のリンク元」に記録されるようになるので、リンク元表示
+#   のノイズが増えます。
+@referer_day_only = true
+
+#-------
+# 設定画面から変更できる項目群。必要なら書き換えて使用してください。
+# なお、一度設定画面から設定してしまうと、こちらのファイルを編集しても反
+# 映されません。
+#-------
+
+# あなたの名前とメールアドレス
+#   @author_nameにはあなたの名前を、@author_mailにはあなたのメールアドレ
+#   スを指定します。この値は、HTML化された日記のヘッダ部分に埋め込まれま
+#   す。
+@author_name = $master.user.realname || 'Your Name'
+@author_mail = $master.user.email || 'email@example.jp'
+
+# 日記より上位のコンテンツがある場合に指定
+#   @index_pageには、あなたの日記の表紙(またはホームページのトップページ)
+#   のURLを指定してください。日記のヘッダ部分および、ページの先頭に埋め
+#   込まれます。
+@index_page = "http://#{master.user.hostname}/"
+
+# TITLEタグおよび携帯端末で使われる日記タイトル。
+#   HTMLタグは使えません。
+@html_title = "#{$master.user.name} diary"
+
+# ヘッダ
+#   日記ページの先頭部分に埋め込まれる文を指定します。「HEADER」に挟まれ
+#   た部分を書き換えて下さい。そのままの形で埋め込まれるので、HTMLタグが
+#   使えます。また、文字列中にはeRubyタグが使用できます。eRubyを知らなく
+#   ても、以下の2つのタグはどこかに埋め込んでおかないと不便です。
+#   
+#   <%=calendar%>
+#       カレンダーを埋め込みます。このカレンダーは月ごとの日記へのリンク
+#       になっています。
+#   <%=navi%>
+#       日記の更新などを行うためのメニューを埋め込みます。
+#
+@header = <<HEADER
+<%= navi %>
+<h1>ほげほげ日記</h1>
+<%=calendar%>
+HEADER
+
+# フッタ
+#   ヘッダ同様、日記ページの末尾に挿入される文字列を指定できます。
+#   「FOOTER」で挟まれた部分を書き換えてください。
+@footer = <<FOOTER
+<%= navi %>
+<p>以下のメッセージを削除するには、「設定」画面から「フッタ」を編集してください。</p>
+<p style="font-size: x-large;">あらかじめ<a href="doc/README.html">README</a>と<a href="doc/HOWTO-write-tDiary.html">日記の書き方</a>には目を通すようにしてください。</p>
+FOOTER
+
+# 日付のフォーマットの指定
+#   日記の日付のフォーマットを指定できます。デフォルトでは「YYYY-MM-DD」
+#   になっています。RubyのTime::strftimeのパラメタがすべて使えますが、時
+#   刻に関係する部分は指定しても意味がありません。主に使えるのは「%Y」
+#   (西暦年)、「%m」(月数値)、「%b」(短月名)、「%B」(長月名)、「%d」(日)、
+#   「%a」(短曜日名)、「%A」(長曜日名)といったところでしょう。
+@date_format = '%Y-%m-%d'
+
+# セクションアンカーとツッコミアンカーの指定
+#   日記のセクションアンカー(@section_anchor)および「ツッコミ」アンカー
+#   (@comment_anchor))に使う文字を指定します。
+#   それぞれの文字列が<a href="...">〜</a>に挟まれてHTMLに展開されます。
+#   なお、classがsanchor(セクションアンカーの場合)やcanchor(ツッコミアン
+#   カーの場合)のspanタグを使うと、テーマによっては自動的に画像によるア
+#   ンカーが付くようになります。
+@section_anchor = '<span class="sanchor">_</span>'
+@comment_anchor = '<span class="canchor">_</span>'
+
+# 最新表示時に最大何日分の日記を表示するかの指定
+#   最新日記を表示するページで、最大何日分の日記を出力するかを指定します。
+#   指定した日数に達しない場合は、その月のすべての日記を出力します。また、
+#   指定した日数に届かなかった場合には、前月以前まで遡ります。
+@latest_limit = 10
+
+# テーマ名(もしくはCSSのURL)の指定
+#   日記のスタイルを決めるテーマ名もしくはCSSファイルのURLを指定します。
+#   @themeには添付の標準スタイルシートを指定してあります。これを書き換え
+#   て、好みのデザインにできます。themeディレクトリの下には、標準添付の
+#   テーマ(*.css)がいくつかありますので、好みに応じて変更してみてくださ
+#   い。
+#   もちろん、自分でスタイルシートを書いてもかまいません。その場合は@theme
+#   には''(空文字列)を指定し、@cssにCSSファイルのURLを記述します。
+@theme = 'default'
+@css = ''
+
+# ツッコミを表示するかどうか(true or false)
+#   「本日のツッコミ」を表示するかどうか指定します。ツッコミは@show_comment
+#   をfalseにすることで読者から隠すことができます。日記のオーナー(あなた)
+#   は、更新画面で日付を指定することでツッコミを見ることができます。
+@show_comment = true
+
+# 最新および月別表示でツッコミを最大何件表示するか
+#   「本日のツッコミ」を表示する場合、最新及び月間表示時に最大いくつまで
+#   表示するかを指定します。
+@comment_limit = 3
+
+# 1日あたりのツッコミ最大数
+#   1日に最大何件までツッコミを受け付けるかを指定します。この数を超える
+#   と、ツッコミフォーム自体が表示されなくなります。なお、TrackBackプラ
+#   グインを導入している場合、この値はツッコミとTrackBackの合計値に対し
+#   て適用されます
+@comment_limit_per_day = 100
+
+# リンク元リストを表示するかどうか(true or false)
+#   「本日のリンク元」を表示するかどうか。リンク元は、日記を訪れてくれた
+#   人がどのページにあるリンクをたどってきたかを示すURLです。これがわか
+#   ると、自分の日記をリンクしているページがわかるので、日記コミュニケー
+#   ションがとりやすくなります。tDiaryはこの情報を日記の読者にも公開する
+#   ようになっていますが、@show_refererをfalseにすることで、これを抑止で
+#   きます。非表示にしても、日記のオーナー(あなた)は更新画面で日付を指定
+#   することでリンク元を見ることが可能です。
+@show_referer = true
+
+# 更新時の時差調整
+#   更新フォームに自動的に挿入される日付を調整します。単位は「時」で、小
+#   数が指定できます。例えば午前2時までを前日として扱いたい場合には「-2」
+#   と指定することで、実際の時刻から2時間が引かれた日付が入ります。また、
+#   海外サーバ上で運用している場合の時差調整にも利用できます。
+@hour_offset = 0
+
+# 長年日記を表示するためのリンクを表示するかどうか(true or false)
+#  「長年日記」とは、前年以前の同じ日の日記を一度に参照できるページを生成
+#  する機能です。
+@show_nyear = false
+
+#-----
+# 設定画面から追加設定できるが、ここに(設定画面からは変更できない)標準設
+# 定を記述できる項目
+#-----
+
+# リンク元リストから除外するURL(正規表現)
+#   @no_refererは、リンク元として記録しないURLの配列を指定します。毎日定
+#   期的にあるアンテナ経由の訪問者や、検索エンジンのロボットなど、本来の
+#   目的(つまり自分の日記の話題に対してのリンク)を探り出すためのものでは
+#   ないリンク元はノイズになってしまい、けっこう邪魔です。そのようなリン
+#   ク元はここにURLを指定することで記録されなくなります。特に、自分の日
+#   記のURLは必ずここに入れておくべきでしょう。書式はRubyの配列(Array)で、
+#   中身は文字列です。比較時には正規表現として扱われますが、Regexpオブジ
+#   ェクトは指定しないでください。
+@no_referer = [
+	'^http://localhost[:/]',
+	'^http://192\.168\.',
+	'^http://172\.1[6789]',
+	'^http://172\.2[0-9]',
+	'^http://172\.3[01]',
+	'^http://10\.',
+]
+
+# 「本日のリンク元」にのみ記録するリンク元のURL(正規表現)
+#   @only_volatileは、「本日のリンク元」にのみ記録するリンク元URLの配列を
+#   記述します。ここに含まれるURLは、たとえ過去の日記に対するアクセスであっ
+#   てもその日のリンク元には記録されず、一時的に記録されるだけになります。
+#   この記録は、新しい日記を記述すると消去されます。検索サイト経由でのア
+#   クセスなどはここに入れておくのが良いかもしれません。指定書式は@no_referer
+#   と同じです。
+@only_volatile = [
+]
+
+# リンク元リストにURLでなく特定文字列を指定する場合の変換表(正規表現)
+#   @referer_tableは、「本日のリンク元」の一覧(一日単位で表示される方)に
+#   味気ないURLが並ぶのを回避するための設定です。対象となるリンク元のURL
+#   の正規表現文字列と、置換後の文字列をペアにした配列をアイテムに持つ配
+#   列として記述します。置換後の文字列には、URL中の「(〜)」で囲まれた文
+#   字列を\1、\2……といった形で置き換えることができます。上の例では、tDiary
+#   で運用されている某作者の日記を日付指定、月指定、指定なしのそれぞれの
+#   場合について、別々の文字列に置換しています。
+@referer_table = [
+	['^http://www\.tdiary\.net/.*', 'tDiary.Net'],
+	['^http://sho\.tdiary\.net/(\d{4})(\d\d)(\d\d)\.html', 'ただのにっき(\1-\2-\3)'],
+	['^http://sho\.tdiary\.net/(\d{4})(\d\d)\.html', 'ただのにっき(\1-\2)'],
+	['^http://([^\.]*)\.tdiary\.net/(\d{4})(\d\d)(\d\d)\.html', 'tDiary.Net[\1](\2-\3-\4)'],
+	['^http://([^\.]*)\.tdiary\.net/(\d{4})(\d\d)\.html', 'tDiary.Net[\1](\2-\3)'],
+	['^http://([^\.]*)\.tdiary\.net/.*', 'tDiary.Net[\1]'],
+	['^http://www.google.(com|co\.jp)/search.*?q=([^&]*).*', 'google検索(\2)'],
+	['^http://(google|websearch).yahoo.(com|co\.jp)/.*?p=([^&]*).*', 'Yahoo検索(\3)'],
+	['^http://www.infoseek.co.jp/.*?qt=([^&]*).*', 'Infoseek検索(\1)'],
+	['^http://www.lycos.co.jp/cgi-bin/.*?query=([^&]*).*', 'Lycos検索(\1)'],
+	["^http://wisenut.lycos.co.jp/.*?q=([^&]*).*", "Lycos内Wisenut検索(\\1)"],
+	['^http://search.fresheye.com/.*?kw=([^&]*).*', 'FreshEye検索(\1)'],
+	['^http://(www|search).goo.ne.jp/.*?MT=([^&]*).*', 'goo検索(\2)'],
+	['^http://(asearch|www).nifty.com/.*?(q|Text)=([^&]*).*', '@nifty検索(\3)'],
+	['^http://search-intl.netscape.com/ja/google.tmpl.*?search=([^&]*).*', 'Netscape内google検索(\1)'],
+	['^http://www.excite.co.jp/.*?(search|s)=([^&]*).*', 'excite検索(\2)'],
+	['^http://odin.ingrid.org/.*?key=([^&]*).*', 'ODiN検索(\1)'],
+	['^http://www.kensaku.(jp|org)/search.cgi.*?key=([^&]*).*', 'kensaku.jp検索(\2)'],
+	['^http://search.msn.co.jp/.*?(q|MT)=([^&]*).*', 'msn検索(\2)'],
+	["^http://cgi.search.biglobe.ne.jp/cgi-bin/search.*?q=([^&]*).*", "BIGLOBE検索(\\1)"],
+	#
+	# 以下の設定は、上記の置換リストで変換されなかったリンク元URLのうち、
+	# 50文字を越えるものの後半を省略するという設定です。これはかならず
+	# @referer_tableの末尾に入っていないと意味がありません。@referer_table
+	# に新しい置換ルールを追加する場合は、この上に挿入してください。
+	#
+	['^(.{50}).*$', '\1...'],
+]
+
+# Cross-Site Request Forgery (CSRF)に対する防御の方法の指定。
+#
+# CSRF検査では、常にリクエスト方法と
+# 不正なRefererが送信されていないことの検査は行なわれます。
+# それに加えて、
+#   1: 正しいRefererが存在することを検査する(キーは使わない)
+#   2: 乗っ取り防止キーを検査する(Refererが空であることを許す)
+#   3: 正しいRefererと乗っ取り防止キーの双方を検査する
+# のいずれかの設定が可能です。
+#
+# 日記著者がRefererを送信しないブラウザを使用している場合、乗っ取り防止キーを
+# 設定の上、2にしてください。Refererを送信しないブラウザを利用している
+# 場合、1, 3にすると書き込み・設定変更ができなくなります。
+#
+# 通常のRefererを送信するブラウザを利用している場合は、
+# 1か3にしてください。3にする場合、乗っ取り防止キーの設定も必要です。
+#
+# なお、2, 3にした場合、この機構に対応しない一部のプラグインが
+# 動作しなくなることがあります。
+#
+@options['csrf_protection_method'] = 1
+
+# 乗っ取り防止キーの指定。
+# 任意の文字列を指定します。この鍵が盗まれると、CSRFにより大きな被害を
+# 受ける可能性がありますので、気をつけて管理して下さい。
+# csrf_protection_method が1の場合、鍵は使われません。
+# csrf_protection_method が2または3の場合、鍵が空だと設定変更ができなくなります。
+@options['csrf_protection_key'] = ''
+
+# Refererの検査において、正しい参照元と見なすURLにマッチする正規表現。
+# @updateに相当するページは自動的に追加されますが、
+# 何らかの理由でこれらが適切でない場合、または特定のページ(例えば、
+# 自分専用ポータルページ)を追加で指定したい場合に指定して下さい。
+# nil、空文字列の場合は何もマッチしないものと扱われます。
+# 信頼できないサイトにマッチしないよう十分留意して下さい。
+@options['csrf_protection_allowed_referer_regexp_for_update'] = %r!\.arege\.net/(?:diary|blog)/!
+
+#----
+# CGIによる設定ファイルを読む指定【必須】
+#   セキュリティを強化したい場合(tDiaryで日記サービスを提供するなど)に
+#   は、@secureをtrueにして下さい。危険な変数操作や、ファイルの読み込み
+#   が制限されます。
+#----
+@secure = false
+
Index: /arege.net/htdocs/diary
===================================================================
--- /arege.net/htdocs/diary (revision 782)
+++ /arege.net/htdocs/diary (revision 782)
@@ -0,0 +1,239 @@
+#!/usr/bin/ruby -I/home/tach/lib/ruby -I/home/tach/lib/ruby/tdiary/upstream/core
+
+$KCODE = 'n'
+require 'aregenet'
+require 'fcgiwrap/fcgiwrap'
+
+def index(cgi)
+	# from upstream r3336 "core/index.rb"; please merge with upstrem HEAD
+	# Copyright (C) 2001-2006, TADA Tadashi <sho@spc.gr.jp>
+	# You can redistribute it and/or modify it under GPL2.
+
+	begin
+		require 'tdiary'
+
+		@cgi = cgi
+		conf = $cfg[:tdiary][$master.user.name] ? $cfg[:tdiary][$master.user.name] : TDiary::Config::new(@cgi)
+		$cfg[:tdiary][$master.user.name] = conf unless ($cfg[:tdiary][$master.user.name])
+		tdiary = nil
+		status = nil
+		if %r[/\d{4,8}(-\d+)?\.html?$] =~ @cgi.redirect_url and not @cgi.valid?( 'date' ) then
+			@cgi.params['date'] = [@cgi.redirect_url.sub( /.*\/(\d+)(-\d+)?\.html$/, '\1\2' )]
+			status = CGI::HTTP_STATUS['OK']
+		end
+
+		begin
+			if @cgi.valid?( 'comment' ) then
+				tdiary = TDiary::TDiaryComment::new( @cgi, "day.rhtml", conf )
+			elsif @cgi.valid?( 'date' )
+				date = @cgi.params['date'][0]
+				if /^\d{8}-\d+$/ =~ date then
+					tdiary = TDiary::TDiaryLatest::new( @cgi, "latest.rhtml", conf )
+				elsif /^\d{8}$/ =~ date
+					tdiary = TDiary::TDiaryDay::new( @cgi, "day.rhtml", conf )
+				elsif /^\d{6}$/ =~ date then
+					tdiary = TDiary::TDiaryMonth::new( @cgi, "month.rhtml", conf )
+				elsif /^\d{4}$/ =~ date then
+					tdiary = TDiary::TDiaryNYear::new( @cgi, "month.rhtml", conf )
+				end
+			elsif @cgi.valid?( 'category' )
+				tdiary = TDiary::TDiaryCategoryView::new( @cgi, "category.rhtml", conf )
+			elsif @cgi.valid?( 'q' )
+				tdiary = TDiary::TDiarySearch::new( @cgi, "search.rhtml", conf )
+			else
+				tdiary = TDiary::TDiaryLatest::new( @cgi, "latest.rhtml", conf )
+			end
+		rescue TDiary::PermissionError
+			raise
+		rescue TDiary::TDiaryError
+		end
+		tdiary = TDiary::TDiaryLatest::new( @cgi, "latest.rhtml", conf ) if not tdiary
+
+		begin
+			head = {
+				'type' => 'text/html',
+				'Vary' => 'User-Agent'
+			}
+			head['status'] = status if status
+			body = ''
+			head['Last-Modified'] = CGI::rfc1123_date( tdiary.last_modified )
+	
+			if /HEAD/i =~ @cgi.request_method then
+				head['Pragma'] = 'no-cache'
+				head['Cache-Control'] = 'no-cache'
+				print @cgi.header( head )
+			else
+				if @cgi.mobile_agent? then
+					body = conf.to_mobile( tdiary.eval_rhtml( 'i.' ) )
+					head['charset'] = conf.mobile_encoding
+					head['Content-Length'] = body.size.to_s
+				else
+					require 'digest/md5'
+					body = tdiary.eval_rhtml
+					head['ETag'] = %Q["#{Digest::MD5.hexdigest( body )}"]
+					if ENV['HTTP_IF_NONE_MATCH'] == head['ETag'] and /^GET$/i =~ @cgi.request_method then
+					   head['status'] = CGI::HTTP_STATUS['NOT_MODIFIED']
+						body = ''
+					else
+						head['charset'] = conf.encoding
+						head['Content-Length'] = body.size.to_s
+					end
+					head['Pragma'] = 'no-cache'
+					head['Cache-Control'] = 'no-cache'
+				end
+				head['cookie'] = tdiary.cookies if tdiary.cookies.size > 0
+				print @cgi.header( head )
+				print body
+			end
+		rescue TDiary::ForceRedirect
+			head = {
+				#'Location' => $!.path
+				'type' => 'text/html',
+			}
+			head['cookie'] = tdiary.cookies if tdiary.cookies.size > 0
+			print @cgi.header( head )
+			print %Q[
+				<html>
+				<head>
+				<meta http-equiv="refresh" content="1;url=#{$!.path}">
+				<title>moving...</title>
+				</head>
+				<body>Wait or <a href="#{$!.path}">Click here!</a></body>
+				</html>]
+		rescue TDiary::NotFound
+			if @cgi then
+				print @cgi.header( 'status' => CGI::HTTP_STATUS['NOT_FOUND'], 'type' => 'text/html' )
+			else
+				print "Status: 404 Not Found\n"
+				print "Content-Type: text/html\n\n"
+			end
+			puts "<h1>404 Not Found</h1>"
+			puts "<div>#{' ' * 500}</div>"
+		end
+	rescue Exception
+		if @cgi then
+			print @cgi.header( 'status' => CGI::HTTP_STATUS['SERVER_ERROR'], 'type' => 'text/html' )
+		else
+			print "Status: 500 Internal Server Error\n"
+			print "Content-Type: text/html\n\n"
+		end
+		puts "<h1>500 Internal Server Error</h1>"
+		puts "<pre>"
+		puts CGI::escapeHTML( "#{$!} (#{$!.class})" )
+		puts ""
+		puts CGI::escapeHTML( $@.join( "\n" ) )
+		puts "</pre>"
+		puts "<div>#{' ' * 500}</div>"
+	end
+end
+
+def edit(cgi)
+	begin
+		require 'tdiary'
+
+		@cgi = cgi
+		conf = $cfg[:tdiary][$master.user.name] ? $cfg[:tdiary][$master.user.name] : TDiary::Config::new(@cgi)
+		$cfg[:tdiary][$master.user.name] = conf unless ($cfg[:tdiary][$master.user.name])
+		tdiary = nil
+
+		begin
+			if @cgi.valid?( 'append' )
+				tdiary = TDiary::TDiaryAppend::new( @cgi, 'show.rhtml', conf )
+			elsif @cgi.valid?( 'edit' )
+				tdiary = TDiary::TDiaryEdit::new( @cgi, 'update.rhtml', conf )
+			elsif @cgi.valid?( 'replace' )
+				tdiary = TDiary::TDiaryReplace::new( @cgi, 'show.rhtml', conf )
+			elsif @cgi.valid?( 'appendpreview' ) or @cgi.valid?( 'replacepreview' ) 
+				tdiary = TDiary::TDiaryPreview::new( @cgi, 'preview.rhtml', conf )
+			elsif @cgi.valid?( 'plugin' )
+				tdiary = TDiary::TDiaryFormPlugin::new( @cgi, 'update.rhtml', conf )
+			elsif @cgi.valid?( 'comment' )
+				tdiary = TDiary::TDiaryShowComment::new( @cgi, 'update.rhtml', conf )
+			elsif @cgi.valid?( 'saveconf' )
+				tdiary = TDiary::TDiarySaveConf::new( @cgi, 'conf.rhtml', conf )
+			elsif @cgi.valid?( 'conf' )
+				tdiary = TDiary::TDiaryConf::new( @cgi, 'conf.rhtml', conf )
+			elsif @cgi.valid?( 'referer' )
+				tdiary = TDiary::TDiaryConf::new( @cgi, 'referer.rhtml', conf )
+			else
+				tdiary = TDiary::TDiaryForm::new( @cgi, 'update.rhtml', conf )
+			end
+		rescue TDiary::TDiaryError
+			tdiary = TDiary::TDiaryForm::new( @cgi, 'update.rhtml', conf )
+		end
+
+		begin
+			head = body = ''
+			if @cgi.mobile_agent? then
+				body = conf.to_mobile( tdiary.eval_rhtml( 'i.' ) )
+				head = @cgi.header(
+					'status' => '200 OK',
+					'type' => 'text/html',
+					'charset' => conf.mobile_encoding,
+					'Content-Length' => body.size.to_s,
+					'Vary' => 'User-Agent'
+				)
+			else
+				body = tdiary.eval_rhtml
+				head = @cgi.header(
+					'status' => '200 OK',
+					'type' => 'text/html',
+					'charset' => conf.encoding,
+					'Content-Length' => body.size.to_s,
+					'Vary' => 'User-Agent'
+				)
+			end
+			print head
+			print body if /HEAD/i !~ @cgi.request_method
+		rescue TDiary::ForceRedirect
+			head = {
+				#'Location' => $!.path
+				'type' => 'text/html',
+			}
+			head['cookie'] = tdiary.cookies if tdiary.cookies.size > 0
+			print @cgi.header( head )
+			print %Q[
+				<html>
+				<head>
+				<meta http-equiv="refresh" content="1;url=#{$!.path}">
+				<title>moving...</title>
+				</head>
+				<body>Wait or <a href="#{$!.path}">Click here!</a></body>
+				</html>]
+		end
+	
+	rescue Exception
+		if @cgi then
+			print @cgi.header( 'status' => '500 Internal Server Error', 'type' => 'text/html' )
+		else
+			print "Status: 500 Internal Server Error\n"
+			print "Content-Type: text/html\n\n"
+		end
+		puts "<h1>500 Internal Server Error</h1>"
+		puts "<pre>"
+		puts CGI::escapeHTML( "#{$!} (#{$!.class})" )
+		puts ""
+		puts CGI::escapeHTML( $@.join( "\n" ) )
+		puts "</pre>"
+		puts "<div>#{' ' * 500}</div>"
+	end
+end
+
+FCGIWrap.each do
+  cgi = CGI.new
+	$master = AregeNet.new(cgi)
+	cgi.not_found unless ($master.user.exist?)
+	case cgi.path_info
+	when nil
+		cgi.self_redirect("#{cgi.script_name}/", 'MOVED')
+	when %r!/([a-z]+)/!
+		cgi.self_redirect("#{cgi.script_name}/#{$1}", 'MOVED')
+	when '/edit'
+		edit(cgi)
+	else
+  	index(cgi)
+	end
+	$master = nil
+end
+
+# vim: ts=2:sw=2:ft=ruby:
Index: /arege.net/htdocs/index.html
===================================================================
--- /arege.net/htdocs/index.html (revision 782)
+++ /arege.net/htdocs/index.html (revision 782)
@@ -0,0 +1,14 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+  "http://www.w3.org/TR/html4/strict.dtd">
+<html lang="ja">
+<head>
+	<title>test.arege.net - arege.net test server</title>
+</head>
+<body>
+	<h1>test.arege.net</h1>
+	<ul>
+		<li><a href="/diary/">tDiary</a></li>
+	</ul>
+</body>
+</html>
+<!-- vim: set ts=2:sw=2: -->
