Movable Type のデフォルト Atom フィードテンプレートを駄目出し
今年も残すところ 1 ヶ月と少しというところで、新年を迎える Movable Type ユーザのみなさんに向けて、除夜の鐘に代わって警鐘を鳴らします。
Movable Type 3 標準の Atom フィードテンプレートには、ちょっとした欠陥があります。熱心な MT 管理者は、テンプレートを修正するまで安心して「新年明けましておめでとうございます」や「平成 19 年の抱負」のエントリを公開できないでしょう。
Atom フィードにはサイト単位とエントリ単位でそれぞれ id という要素があります。これは identification という言葉の意味から、サイトやエントリを示す識別子として、一意で恒久的なものとされています。Atom フィードを扱うフィードリーダやアグリゲータの中には、この id を基に様々な処理をしているものも少なくないでしょう。MT 標準の Atom フィードテンプレートでは、これらの要件を満たす id として Tag URI を採用しています。tag: に続けてメールアドレスかドメイン名、さらに日時、固有値を連ねた文字列で、例えば次のようなものです。
tag:blog.drry.jp,2006-11-24:drry
では、MT3 の Atom フィードテンプレートから該当部分を一部抜粋して見てみましょう。
<$MTHTTPContentType type="application/atom+xml"$><?xml version="1.0" encoding="<$MTPublishCharset$>"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<!-- snipped -->
<id>tag:<$MTBlogHost exclude_port="1" encode_xml="1"$>,<$MTDate format="%Y"$>:<$MTBlogRelativeURL encode_xml="1"$>/<$MTBlogID$></id>
<!-- snipped -->
</feed>
問題は日時に <$MTDate$> タグを用いてしまっている部分です。このタグは、再構築時点での日時を得るタグなので、<$MTDate format="%Y"$> が返す西暦は 1 年毎に変動してしまい、結果として id が恒久的ではなくなってしまいます。
この西暦をブログの作成年度で固定するためには、例えば次のようにテンプレートを修正します。
<$MTHTTPContentType type="application/atom+xml"$><?xml version="1.0" encoding="<$MTPublishCharset$>"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<!-- snipped -->
<id>tag:<$MTBlogHost exclude_port="1" encode_xml="1"$>,<MTArchiveList archive_type="Monthly" sort_order="ascend" lastn="1"><$MTArchiveDate format="%Y"$></MTArchiveList>:<$MTBlogRelativeURL encode_xml="1"$>/<$MTBlogID$></id>
<!-- snipped -->
</feed>
default_templates/atom_index.tmpl
<$MTHTTPContentType type="application/atom+xml"$><?xml version="1.0" encoding="<$MTPublishCharset$>"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<!-- snipped -->
<id>tag:<$MTBlogHost exclude_port="1" encode_xml="1"$>,2006:<$MTBlogRelativeURL encode_xml="1"$>/<$MTBlogID$></id>
<!-- snipped -->
</feed>
さらに後述する厳密さを求めるなら id 要素はテンプレートタグを一切使わずにすべて直接記述しても良いでしょう。または Tag URI にこだわらず、URI なら何でも良いのでサイトの URL にしてしまう、など。
新規ブログ作成時の西暦が、自動的にテンプレートへ挿入されるようになると良いのですけどね。次のバージョンでは自動的に作成日時が挿入される予定です。
本来、厳密にはどんな理由があろうとも atom:id は完全に一意で永久的なものとされているため、<$MTBlogHost$> や <$MTBlogRelativeURL$>, <$MTBlogID$> についてもその影響を考慮せねばなりません。しかしそれはなかなか厳しい要求で、レアケースでもあるので今後の課題として妥協できますが、一年間で期限が切れてしまう <$MTDate$> はまずいですね。
フィードリーダによっては、新年初の更新によって id が変わると、そのフィードに含まれるすべてのエントリが新着エントリとして扱われてしまいます。本来変わってはいけない ID ですから、この問題は他にもさまざまな場面に影響すると思われます。
各エントリの id については、<$MTEntryAtomID$> によって適切な Tag URI が得られますので問題ありません。
これで安心して年を越せそうです。
- タグ
- Atom
- bug
- feed
- Movable Type
- templates
- URI
- 公開日時
- 2006-11-24T12:33:08+09:00 @189
- 更新日時
- 2006-12-07T20:38:18+09:00 @526
- Permalink URI & TrackBack URL
- http://blog.drry.jp/2006/11/24/mt-atom-feed-template
TrackBack ( 3 )
- Atomテンプレート from HashiMのたわごと(?)
- 2006-11-28T00:54:21+09:00 @189
- んで(何),ついでにきたみかん巡回をしていたら,hxxk.jp経由で以下の記事が出ておりました. drry+@-> - Movable Type のデフォ...
- ATOMフィード・テンプレートの不具合 from MovableType備忘録
- 2006-12-07T11:03:14+09:00 @189
- 最近まともな記事を書いてませんでしたが、drry+@->さんのところで、Movable Type のデフォルト Atom フィードテンプレートを駄目...
- MT:Atomフィードの修正 from Dog*Walkキャバグロでゴー!
- 2006-12-15T15:55:44+09:00 @189
- AtomフィードのIDって変わってはいけないんですって。 Movable Ty...
コメント ( 4 )
こんにちわ^^
ATOMフィードそのものの用途、RSS2.0などのフィードとの違いがよく分かっていないのですが、とりあえずdrryさんの記事を参考に修正しました。
これでわたしも安心して年を越せそうです♪
良かった良かったです。
将来のお話ですが、ブログの新規作成時に、Atom フィードのインデックステンプレートへブログの作成年月日が挿入されるように改善されています。たぶん次のバージョンからは、問題なさそうですよ。
<id>tag:<$MTBlogHost exclude_port="1" encode_xml="1"$>,2006:<$MTBlogRelativeURL encode_xml="1"$>/<$MTBlogID$></id>
これだけ修正したんですけれど、これでいいのかな?
技術的なところは、わかりにくいです。
ところで、Movabletypeってどうして再構築でよくエラーが出るんでしょうね?
更新してもなかなか画面が変わってないですし。
これが他のブログと違って不思議かつ、困ることなんですけれど。
はい、修正はその通りです。
Movable Type は快適に動作させるために要求される環境が厳しいです。その分、逆に良いところも多いのですが。
少しでも負荷を軽減させる小手先のテクニックがいくつかありますが、根本的な改善には恐らく、より質の良いサーバを検討するほかないでしょう。
( ご記入された URL のドメインがブラックリストに載っていたため、システムが自動的に迷惑コメントとして分類してしまい、コメントが即時公開されず、保留されていました。すいません。)