都内某所にあるイメクラ「blosxom」ではこんな会話が繰り広げられている ----- 店員: オプションはどうなさいますか? 客: back_and_forthでお願いします!  -----(書いてから全然面白くないことに気づいたけど、そのままにしておいてみる)。さて、紅茶飲み過ぎでは? と思わずツッコミたくなるけーきさんのblog、チェリオメアリーで、「RSSのリクエストによりCGIが呼ばれまくりで管理会社から警告来た!」とかそんな感じのエントリを眺めてました(観察)。ここらへんのことは動的にフィードを配信している場合、避けられない事態だったりします。CGIが起動することによる負荷自体はスクリプト側でどうにか何とかなります(一応ね)が、CGIを呼ばれるということ自体には対策するのは無理なわけで。ということで、フィードだけは静的生成してやりましょう、と推奨すると共にblosxomでの僕のアプローチ方法をたらたら書いてみようかと。僕のエントリの公開の仕方がかなりアレなので、具体的な方法は割愛し、どんな方法でやっているかの紹介に留めます。

そりゃもうプラグインでやるわけですよ。僕の新規エントリを書くフローは、

  1. エディタでWikiっぽい文法でエントリを書く
  2. エディタのマクロでHTMLっぽいマークアップを行う
  3. Bookmarkletを駆使してリンクを張る
  4. FTPでサーバーにあるblosxomのデータ・ディレクトリにアップロードする
  5. TrackBackが必要な場合はエディタのマクロ + Perlスクリプトで送信する
  6. フィード及びentries_indexのデータ・ファイルを更新する
  7. weblogUpdates pingをPerlスクリプトで送信する

という感じになっています。2番目以降はバッチ・ファイルで一括処理です(単なる更新用とかとりあえずマークアップして保存するだけ用とか複数用意して使い分け)。このエントリでポイントになるのは、5番目をどうプラグインで実装するかということですね。

rebuildという、blosxom.cgiにPATH_INFOでパスを渡してやった上で、?rebuild=passwordというパラメータを付けてアクセスすると、そのPATH_INFOのファイルだけを静的に生成するというプラグインを作成することで実現してみました。具体的にどういう挙動になるかというと、

http://example.com/blosxom/index.rss?rebuild=password

というURLにアクセスすると、index.rssが新規エントリを反映させた結果のものに置き換わるって訳です。ここまでをプラグイン側で作ってやれば、あとはFTPでアップロードするためのバッチファイルに、そのURLをwgetで叩くコマンド文を追加してやるだけです。1度に1つのフィードしか生成できないので、うちで配信しているatom/esf/rdf/rssそれぞれ(フィードではないですがついでにjsも)をwgetで叩いてやればフィードがいっきに更新されるときたもんだ(なんだこの文章)。ていうか、やっていることは特に目新しいものではないです。

バグバグなのを知っている(気をつければ回避可能ですが)ので公開はしませんが、内容的には至極単純で、blosxomのプラグインのlastサブルーチンを利用して、標準出力に吐く替わりにファイルに吐くというだけのシロモノです。コマンドラインから叩くので、標準出力にはファイルの出力が成功したかどうかのみをtext/plainで出力しています。

余談ですが、URLからCGIのファイル名を隠すテクニックでは、

RewriteCond %{REQUEST_FILENAME} !-f

という一文があるので、存在するファイルの場合はちゃんとそちらを返してくれます(rewriteしない)。ので、きちんとしたディレクトリに静的にファイルを吐いてやれば、問題無しです。

余談その2ですが、チェリオメアリーで続いて話題にしていたGoogleがrss.xmlやatom.xmlというファイル名決めうちでアクセスしてくることへの対策は、それぞれ静的に吐くのはコストがかかる(同じファイルを複数用意するのは面倒)ので、.htaccessでリダイレクトしてやるのが一番手っ取り早いと思います。

Redirect permanent /home/nagashima/public_html/blosxom/rss.xml http://example.com/blosxom/index.rss
Redirect permanent /home/nagashima/public_html/blosxom/atom.xml http://example.com/blosxom/index.atom

とかこんなんで良い気が。blosxomの場合は存在しないパスでもどうにかして頑張ってページを作ってみようとしてくれちゃうので、把握できる存在しないパスへのアクセスはきちんとリダイレクトなりなんなりで順路を示してやるとCGIを呼ばれることが減ると思います。

余談その3ですが、TrackBackはほとんど全自動でやっています。ただ、日本語で送信する都合上、海外のblogに送信しないよう明示的に送信する時は送信するみたいな感じ(わかりづらい)でやってます。コアになるPerlのスクリプトは単純なもので、エントリ・ファイルを読み込み、URLを全部リスト・アップし、それぞれに対してTrackBack auto-discoveryをかけてやり見つかったら送信というモノです。ゆえにTrackBack auto-discovery非対応なサイトには送れません。どうしても送りたい時は手動に近い形で送信しますけどね。

余談その4ですが、entries_indexは何かとアレなので、明示的にパラメータで再インデックスするという指令がないとデータ・ファイルを更新しないようにハックしてたりします。blosxom starter kitでもちゃんとせねばならないかもしれない気がするけど、wikieditishとの兼ね合いが・・・。wikieditishは使ってないプラグインなので挙動をよく把握できていないのが痛い。

長いよ。の割に薄いよ。余談多すぎ。