2007/06/24
■[tDiary]tDiaryのmakerssプラグインに深入り
(前回までのあらすじ)
一部のRSSリーダ(Outlookなど)でこのサイトのフィードを読み込むと、まれに、日記が更新されていないときに更新通知が出てしまうらしい。前回の対策(6月13日の日記)で無事に解決したと思われたが、その後、件の先輩から「まだ解決してませんよ」と連絡が_| ̄|○
----
もう、ここまで問題に立ち入ったからには、完全に原因を解明しないと他の事が手に付かない! ということで、今週末は本腰を入れてtDiaryのmakerssプラグインの動作を追ってみました(どうして週末にこんなことを……)。動作を把握する際には、tDiaryのソースコードと、以下のサイトの文章を参考にしました。tDiary、ドキュメント少ないよ……。
で、まあ、どこから手を付けて良いかもさっぱり分からなくて、色々試行錯誤したのですが、なんとか問題は解決できました……多分ね。今回は、解決に至るまでの過程を一々書いてるとホントにキリがないくらい大変だったので、以下にはまとめだけ書きます。
ちなみに、このサイトはtDiary 2.1.4と添付のプラグイン(makerssプラグインはrevision 1.40)+はてなスタイルversion 1.9で動作しています。
■ 今回の問題(謎の更新通知)の正体
今回の問題を把握するために、サーバ上でindex.rdfのタイムスタンプを頻繁にチェックして、index.rdfの内容が変わったらその差分をチェックする、ということを繰り返してみました。その結果分かった、謎の更新通知の正体を以下に示します。
- 問題1: RSSを更新する必要のない(日記やコメントの追加がない)はずの状況で、index.rdfが勝手に書き換わることがある
- 問題2: 自動的に書き換えられたindex.rdfでは、my-exプラグインやfootnoteプラグインなどのオリジナルプラグインが働いていない*1
その結果、自動的に書き換えられたindex.rdfは、手動で作成・更新されたときのindex.rdfとは違う内容になり、その変化が一部のRSSリーダで検知されると謎の更新通知が出る、ということのようです。
■ 問題の原因
RSSを更新する必要のないはずの状況でindex.rdfが勝手に書き換わるのは、makerssプラグインのせいでした。
makerssプラグインは、特定の状況でのみ呼び出されるコールバック系プラグインです。具体的には、append(日記の追加)、replace(日記の更新)、comment(ツッコミの追加)、showcomment(ツッコミの公開/非公開の変更)、trackbackreceive(トラックバックの受信)、pingbackreceive(Pingbackの受信)モードで、RSSを更新するためのmakerss_updateメソッドを呼び出します。
makerss_updateメソッドの内部動作は、以下のような流れになっています。
- キャッシュフォルダ内にあるmakerss.cache(PStoreでRubyのオブジェクトを格納したファイル)に、新しく追加または更新された、日記またはコメントを登録
- 更新されたmakerss.cacheに含まれるRubyオブジェクトで、index.rdf全体を作り直し。このとき、非表示状態の日記やコメントはindex.rdfに含められない
- 古いindex.rdfを、新しいindex.rdfで上書き
つまり問題1の原因は、コメントスパム扱いされたコメントの受信時や、トラックバックの受信時など、本来index.rdfを更新する必要が無い状況でも、makerss_updateメソッドが最初から最後まで実行されることにあるようです(コメントスパムもmakerss.cacheに含まれてしまう!)。ソースコードを見る限り、この問題は最新のmakerssプラグイン(revision 1.53)にも存在しているようです。
そして、こちらはあまり自信がないんですけど……問題2は、commentモードでindex.rdfを更新するときに、オリジナルプラグイン(my-exプラグインなど)が働かないために生じているのではないでしょうか。RubyオブジェクトからRSSに一々変換していることが分かれば、この挙動にも納得がいきます。
■ 対策
上記の原因を回避するために、makerss.rbのmakerss_updateメソッドの1行目に以下の行を追加しました。
return unless /^append|replace$/ =~ @mode
要は、ツッコミの追加時にindex.rdfの作り直しが行われなければいいんだろこの野郎!というわけです。
当然こんなことしたらRSSにツッコミが入らなくなってしまうのですが、まあ、無駄な通知が飛ぶよりはマシだと判断しました。僕はツッコミ入りRSS賛成派なので、こんなことしたくないんですけど……あとは本職のメンテナの方に任せます。僕はもう疲れました。ご容赦ください。
*1 footnoteプラグイン関係の不具合を探してみたところ、他のサイトでも同様の報告が見つかりました。LDRでうちのエントリが何度も上に出てくる件 - HsbtDiary (2006-09-26)。
また、この日記に無関係と判断したコメント及びトラックバックは削除する可能性があります。ご了承ください。