2006-05-20 色々テスト中
超具体的にはtdiaryがらみ。
◆ [tDiary] 一番上に「最近気になった事とか」ってのを追加
日記に付けろ?いや、その通りなんですが。
トップに置いて置いて、簡単に変更したかったのです。
ちなみにこれ、tdiaryと関係ないcgiが吐き出したデータをtdiaryのpluginで読み込む、という手法を取っています。
いや、某所のフィルタ抜け用なんですけどね?いやぁ、update.rbへのアクセスが禁止されてて…あと、出先で使うために(笑)
で、それはさておき。
外からファイルを読み込むのは簡単なわけですよ。src.rbあたりのプラグイン使えば、外部のファイルをまるでSSIでやったみたいに読み込めるわけです。
まぁ、最初はSSIでやっていたんですが、Content-LengthとLast-Modifiedを出したい(これ出すとサーバ→クライアント間での転送が不要(クライアントのキャッシュにのってたらデータは送信しないから)なんで、負荷が全然違う。と言うわけで何としても出したい。
SSIでやるよりは、tDiaryでやったほうが良いと思うわけです。
cgiでは読み込むデータを吐くだけで良い。うん、これは便利…と思ったわけです。
tDiaryのソース読む羽目になろうとは、思っていなかった午後3時の事でございました。
…
(色々テストしてる)
…
ぐはっ!
Content-Lengthは出してるけど、Last-Modifiedが古いままだあぁぁーーーΣ(゜▽゜;
なんで、どうして!?(多分tdiaryが内部でキャッシュしてるから)
何か、サクッと設定したら変えれたりしないのかなぁ。うーん。
と悩み、色々調べてみたけれども、何か無さそうな気配が…(;´Д`)
このあたりで調べるのをやめてソースをチェックし始め。
…
……
クラス化されたソースって、極端に追いにくいね(いや、普通のプログラムでもそうだが)
「この関数がこれ呼んでて、この関数は…うわ、クラスで継承されてる!とりあえず初期化は…げ、仮想関数(というか、関数上書き)してるじゃん。何よんでんだ!え、設定でクラスが変わるのかよ!とりあえず今の設定だとこのファイルで…うわ、また継承されてる!もうsuperなんて見たくねぇよ!ヽ(`Д´)ノ」
とまぁ、そんな感じでソースコードを追いかけ…
大体予測は出来たんですが、余りにも深い(defaultio.rbあたり)場所を変えなきゃ使えなさそう(裏技は幾つかありそうですが…コメントのアップデートロジックをクラス化して…とかやればなんとかなりそうな気も)なので、バージョンあげたときの処理が激しくめんどくさくなりそうな予感。
うーん、超手抜きな手法で対応しよう。と、ここで結論付け。
どうやったか。rubyにあるまじき解決方法。
グローバル変数にLast-Modified(Time型)を入れて更新、後で出力
ad hocな方法の中でも一番アレゲな方法を選択(笑)
あぁ、一応方法を書いておきましょう。
tdiaryのrootにある、index.rbの中で
head['Last-Modified'] = CGI::rfc1123_date( tdiary.last_modified )
という行があります(ウチのは大量にパッチ当ててあるので行数は人によって違うんだろうな)
ソレをコメントアウトしてグローバル変数への書き込みに書き換え。
つまり、上の行がこんな感じに!
$last_modified_head = tdiary.last_modified
このままだとLast-Modifiedは出力されないので、どこかで出力してやる必要があります。
どこで?
それは簡単。
head['cookie'] = tdiary.cookies if tdiary.cookies.size > 0
と
print @cgi.header( head )
の間に!
if ($last_modified_head < tdiary.last_modified) then
$last_modified_head = tdiary.last_modified
end
head['Last-Modified'] = CGI::rfc1123_date( $last_modified_head )
という行を追加!
ちなみにこのままだとhttpでHEADで取得に行ったときには出力されません。
もしHEADでも出したいならelseの後の
head['Cache-Control'] = 'no-cache'
と
print @cgi.header( head )
の間に同じ内容を追加すればオッケー。ただしHEADの場合、pluginを読み込まないようなので、気をつけないとGETとHEADでLast-Modifiedが違うという現象が。
お勧めはHEADの場合は入れないって事ですが……
で。
これを書いた上で、
def src2( file )
if (File.exist?(file) == true) then
if (@last_modified.nil? == true) then
# do nothing
else
if (@last_modified < File.mtime(file)) then
@last_modified = File.mtime(file)
end
end
if ($last_modified_head.nil? == true) then
# do nothing
else
if ($last_modified_head < File.mtime(file)) then
$last_modified_head = File.mtime(file)
end
end
( File::readlines( file ).join )
else
("File not found")
end
end
こんな感じのsrc2.rbってファイルをつくってmisc/pluginの中に放り込めばおけー。
あとはsrc2.rbを有効にして
<%= src2('file.txt') %>
こんな感じに書けば、file.txtの内容をその場所に埋め込めます。あとfile.txtの時間が新しくなれば、GETで取ってきたときのLast-Modifiedがfile.txtと本体の新しい方の時間になります。
よし、これで解決(ぇ
しかしなめんな、って感じの解決法ですな(笑)
この方法、使えないサーバがあるかもしれませんが、私は責任をとりません(笑)
もうちょっとましな方法があれば教えてくださいorz
◆ [日記] というわけで、最近気になった事のログを一番上に表示するようにしましたヽ(´ー`)ノ
個人的にはこれ、更新が楽なんですよ。いや、アバウト~なんだが。
◆ [ネタ] 洗 濯 機 エ ヴ ァ ン ゲ リ オ ン
6で笑って、17で吹き出して、62で「あほだなぁ~」と思い、533のさびの部分(~何度でも、魂の~あたり)が面白くて、159で感心して、323/328あたりを想像して吹き出して、515がツボにはまっ涙出るくらい笑ったよ(笑)
ゲンドウ何やってんだwwwwwwwwww