最近インストールした MT Plugins を紹介
このエントリで書かれている内容は、今となっては時代遅れで陳腐な廃れた内容です。真に受けず、十分にご注意ください。
ここ最近の RSS 1.0 改造に伴って MT のプラグインをいくつか追加してみたので、紹介します。
まずは RSS 1.0 用に dcterms:references 要素を生成してくれるGregory Williams さんの MTSemWeb。エントリ本文中の a 要素から href 属性の URI を抽出して dcterms:references 要素にしてくれます。この要素は「参照・引用しましたよ」ということを示すための語彙を提供します(神崎さんによる解説)。素直に利用してみたところ、要素毎のインデント方法や XML 名前空間を要素毎に宣言している点、エントリ本文に同一の URI が複数含まれる場合に同じ dcterms:references 要素を複数生成してしまう点、http:// スキームから始まらない自ホストへの URL をそのまま処理してしまう点、そして a 要素に加えて blockquote 要素と q 要素の cite 属性も対象に加えるなど、細かい部分を自分好みに改造して利用しています。使用方法も非常に手軽ですし、実に良いプラグインですね。公式リリースにマージされても良いと思うくらい意味のあるシステムだと思うのですが。というか、こういうものって影響力の大きなところに組み込まれて、広く世界で利用されなければ発展がないと思うのです。
sethladd さんの MTSha1 はMT テンプレートタグに sha1 変換機能を追加してくれます。コメント投稿者のメールアドレスから foaf:mbox_sha1sum 要素を生成する際の手助けになるでしょう。
次に Stepan Riha さんの Global Listings。私は以前このプラグインについて、複数の Weblog を管理している場合にそれらをまとめて扱うことができるので便利、と聞いていたので uniblog な自分には無縁なプラグインだと思っていました。しかし、このプラグインは lastn_modified 属性の提供もしてくれます。私は数日前、例えば <MTEntries lastn="5" sort_by="modified_on"> のようにすることで追記や修正などの更新があった日時順で最新の 5 件を取り出せるものだとばかり思っていました。ところがこれは自分に都合のいい解釈だったようで、実際には投稿日時順で最新の 5 件を更新日時順でソート、という処理だったのです。lastn 属性は created_on で得た複数の結果を modified_on でソートし、Global Listings プラグインの lastn_modified 属性は modified_on で得た複数の結果を modified_on でソートします。さて、実に素晴らしい機能ですが、Global Listings は最新のリリースが 2003 年の 12 月と少々古いため、古い MT のソースコードを流用している部分が原因となり、最新の MT で利用する場合に不具合があります。MTGlobalEntries 要素内に MTEntryModifiedDate 要素を置くと、MTEntryDate 要素の振る舞いをして更新日時ではなく投稿日時に置換されてしまいます。つまり MTEntryModifiedDate が使い物にならなくなります。時を同じくしてこの問題を提起しているエントリを見つけました。この問題を解決するためには 最新の MT から Global Listings プラグインが流用しているソースコードを移植する必要があります。
--- GlobalListings.pl 2003-12-09 21:28:32 +0900
+++ GlobalListings.pl 2005-03-19 00:00:00 +0900
@@ -71,6 +71,8 @@
return _global_item('Entry', $ctx, $args, sub { {
EntryIfExtended => $_[0]->text_more ? 1 : 0,
EntryIfAllowComments => $_[0]->allow_comments,
+ EntryIfCommentsOpen => $_[0]->allow_comments &&
+ $_[0]->allow_comments eq '1',
EntryIfAllowPings => $_[0]->allow_pings,
}});
});
@@ -221,6 +223,7 @@
for my $e (@entries) {
local $ctx->{__stash}{entry} = $e;
local $ctx->{current_timestamp} = $e->created_on;
+ local $ctx->{modification_timestamp} = $e->modified_on;
my $this_day = substr $e->created_on, 0, 8;
my $next_day = $this_day;
my $footer = 0;
@@ -235,13 +238,15 @@
local $ctx->{__stash}{blog} = $blog;
local $ctx->{__stash}{blog_id} = $blog->id;
MT::ConfigMgr->instance->NoPlacementCache(1) unless $e->blog_id == $blog_id;
-
+ my $allow_comments ||= 0;
my $out = $builder->build($ctx, $tok, {
%$cond,
DateHeader => ($this_day ne $last_day),
DateFooter => $footer,
EntryIfExtended => $e->text_more ? 1 : 0,
EntryIfAllowComments => $e->allow_comments,
+ EntryIfCommentsOpen => $e->allow_comments &&
+ $e->allow_comments eq '1',
EntryIfAllowPings => $e->allow_pings,
EntriesHeader => !$i,
EntriesFooter => !defined $entries[$i+1],
次は Kevin Shay さんの IfModified。これは名前のままですが、MT の条件タグ IfModified を追加するプラグインです。MTEntryModifiedDate 要素と併せて利用すると便利です。「追記や修正などの更新があったエントリ」という条件が使えるようになります。MTElse タグも利用できるようです。Version 1.3 までは LastModified という名前のプラグインだったようです。<MTIfModified leeway="15"> のように leeway 属性で 15 分間の猶予を与えることで、公開直後に気付いた Typo の修正などを更新とみなさないようにすることもできます。
<MTGlobalEntries lastn_modified="5">
<MTIfModified leeway="15">
更新日時: <$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$>+09:00
</MTIfModified>
</MTGlobalEntries>
最後に、Henrik Gemal さんの Acronym。主要な略語を予め用意されたデータベースを元に acronym 要素でマークアップしてくれます。私は略語に関してなるべく自分でマーク付けするように心がけているのですが、このプラグインを使ってみると意外に取りこぼしがあるみたいで、まぁ便利です。Version 2.0 での収録語句は 351 語、今後大量に対象語句を追加する予定だそうで、期待です。自分は abbr 要素の方をよく利用しますが、Henrik Gemal さんの界隈では acronym 要素と abbr 要素の戦争(!)があったようで、acronym 要素を用いるべきと判断している模様。abbr 要素でマークアップするように改造しようかとも思いましたが、とりあえずそのまま利用しています。公式の説明にもあるのですがスクリプトの 1 行目を #!/usr/local/perl/bin/perl -w から #!/usr/bin/perl -w など利用する環境に合わせて変更する必要があります。何故このような一般的でないパスのまま配布して、手間をかけさせるのか疑問です。
このエントリで書かれている内容は、今となっては時代遅れで陳腐な廃れた内容です。真に受けず、十分にご注意ください。
- タグ
- Movable Type
- obsolete
- plugins
- 公開日時
- 2005-03-19T02:18:09+09:00 @762
- Permalink URI & TrackBack URL
- http://blog.drry.jp/2005/03/19/0218
TrackBack ( 3 )
- Movable Type のカスタマイズ その3” from 医療関係者のためのPalm−ひとりごと
- 2005-03-19T14:20:52+09:00 @762
- 「Movable Type のカスタマイズ その3’」にトラックバックを頂きまし...
- Recent Entries from 不定期日記
- 2005-04-05T18:35:47+09:00 @762
- 書いたこと<書きたいこと という状況が続いています。頑張って書いているつもりなの...
- エントリを更新された順にソートする from MovableType備忘録
- 2006-06-11T17:59:00+09:00 @762
- エントリを最終更新日順にソートできたらいいと思ったことありませんかiconmark/question.gif" class="mt_icon" width...
コメント ( 9 )
トラックバックをいただき、ありがとうございました。
修正差分ファイルを早速試してみました。
見事に修正されました。今までの悩みが解決した瞬間の喜びはもぉ… 本当に感謝しています。
ありがとうございました。
喜んでいただけたようで、お互いに喜び組ですね。過去に公開したエントリを蔑ろにせず、じっくり煮詰めるタイプの blog 運用で lastn_modified 属性や MTEntryModifiedDate タグは役に立ちますよねー。
こんにちわ^^
エントリの更新日順のソートについてネットサーフしていたら、こちらのサイトに行き着きました。
大変分かりやすい説明で問題なくプラグインのインストールができました。
ありがとうございます。
実のところ、このエントリは内容が既に陳腐化しているので、古い情報をそのままに載せておくのはどうしたものかと最近悩んでいたところです。
詳細なバージョンは忘れてしまいましたが、確か 3.17 の時点で既に MTEntries と MTGlobalEntries の処理には大きく差が生じており、3.2 や 3.3 ではなおさらに、ある程度は上手く動いてくれますが、少し凝ったことを試みると不具合が発生します。エラーにならないので気付きにくくてタチが悪いです。
Global Listings 本来の機能は不要で、単に更新順でのエントリ取得をしたいので、私は Global Listings の利用を止めています。そしてオリジナルの MTEntries を更新日時順で扱えるように自分で書き換えているのですが、ここまでするとさすがにバッドノウハウが色濃く、広くお勧めはできないので公開していない、という状態です。
IfModified に関しては現役で活躍中です。
蛇足になりますが更新日時はエントリのエクスポート ( 書き出し ) を行うと失われてしまう情報の一つです。他に entry_basename なども失われてしまいます。エクスポートしてインポートすると全エントリの更新日時がインポート時の時刻で上書きされてしまい、悲しい思いをします。entry_basename も同様です。これを復元するためには、次のようなインデックステンプレートで復元のための SQL を生成して、新たな環境のデータベースで実行します。
また、更新日時順の手法を取り入れると、ちょっとした typo の修正などをしただけでそのエントリが一面記事となってしまう欠点があります。更新日時を更新せずにこっそり修正や改ざんを行うためにはひと手間かかります。MySQL か PostgreSQL ならば
lib/MT/ObjectDriver/DBI.pmの update サブルーチン内にある$obj->modified_on($ts);の行を一時的に#でコメントアウトします。こんにちわ^^
bzbellです。
> 詳細なバージョンは忘れてしまいましたが、確か 3.17 の時点で既に MTEntries と MTGlobalEntries の処理には大きく差が生じており、3.2 や 3.3 ではなおさらに、ある程度は上手く動いてくれますが、少し凝ったことを試みると不具合が発生します。エラーにならないので気付きにくくてタチが悪いです。
えっ!?Σ( ̄Д ̄;)そうなんですか!?
わたしも Global Listings は、更新順でエントリの情報を取得するためだけに使用しています。
ちょっとプラグインが古いということで、動作確認(中の処理は分かりませんが)した上でちゃんとソートされていたので、とりあえず問題なさそう(見た目)だったので使っています。
凝ったことすると不具合が発生する…とのことですが、例えばどんな使い方すると、どんな支障がでるのでしょうか。
覚えている限りでいいので教えていただけますか。場合によっては、わたしも使用するのを止めます。また、drryさんのようにわたしは既存の MTEntries をカスタマイズするスキルがないので、更新日時順のソートは諦めます(*ノД`*)残念。
> 蛇足になりますが更新日時はエントリのエクスポート ( 書き出し ) を行うと失われてしまう情報の一つです。
Σ( ̄Д ̄;)これも知りませんでした!
例えば、サーバ移転などでデータを移行した後で Global Listings をインストールして、更新日時順でソートしようとしても、デフォルトの表示順(エントリ作成順)になる…ということでしょうか。
もしそうだとしたら、これに関してはわたしは許容範囲内です(*≧∀≦*)
でも、とんでもない動きをする…ということでしたら、やっぱり Global Listings の使用を諦めるしかないですね。
> また、更新日時順の手法を取り入れると、ちょっとした typo の修正などをしただけでそのエントリが一面記事となってしまう欠点があります。
そうですね。これはわたしも気になっていました。
エントリのタグ追加・修正などもままならないので(つω-`。)どうしたものかと、試行錯誤していたところです。
MySQL か PostgreSQL 以外の BerkeleyDB と SQLite では、教えていただいた方法ではダメなのでしょうか。
気づいたら質問攻めなコメントで申し訳ありませんが、教えていただけると助かります。
はい、確か
MTEntriesタグで使えるカテゴリ (category,include_subcategories) や、3.3 で加わったタグ ( tag, tags ) に関する属性などが、MTGlobalEntriesでは抜け落ちていたの思います。いくつかの新しい属性が使えないだけでなく、MTGlobalEntriesタグと最近のMTEntriesタグでは内部の処理も大きく変わっていて、目に見えない部分の潜在的なデメリットがあると思います。サーバ移転などでデータを移行する場合、MySQL を始めとした DB のデータもそのまま一緒に移行できれば良いのですが、それができない場合はエントリの書き出しをすることになります。ここで更新日時などいくつかの付加情報は書き出せずに消えてしまうので、全てのエントリの更新日時が移転先で読み込んだ時間にリセットされてしまいます。更新日時順でソートすると、全ての更新日時が数秒の差で揃っているので、並び順もリセットされます。そんなわけで、上記コメント ( #4 ) で示したインデックステンプレートでこれらのデータをバックアップしておけば、もしもの時に復元することができるわけです。
こっそり修正ですが、SQLite は MySQL や PostgreSQL と同様で、Berkeley DB だと別の方法になります。
解りにくい部分や、他になにかあれば、どんどん質問攻めしてください。
こんにちわ^^
bzbellです。度々すいません。
ありがとうございます。
とりあえず、今のところ不穏な動きが見られないので、しばらく様子を見てみます。
でもMT3.3 では使いません。配布元さんの方で MT3.3 に対応してくれないかな♪プラグインとしては結構気に入ってますので。。。
そういえば、1つ不穏な動きしてました!!
わたしは更新猶予時間を15分としているのですが、なぜか新規投稿の場合に限り、15分経っても表示されないんです。
でも、15分後エントリを更新するとひょっこり表示されるんですよ(つω-`。)
何らかの影響がでているんでしょうね。
いろいろ勉強になりました。
またちょくちょく寄らせていただきます。
では。。。
3.3 Beta はライセンスの関係で改造が許されていないので、今月末の 3.3 正式リリース後に、
MTEntriesの処理を追ってみて、もし自分にできそうなら改造の方法を公開するかもしれません。気が向いたら。筆が遅いので、期待せず気長にお待ち下さい。なんだか、更新順のソートというのは改めて大切だと再確認した次第です。それなりに需要もありそうですね。エントリ編集の GUI で「こっそり修正」切り替えなどができれば、と構想も膨らみます。
こんにちわ^^
ぜひお願いします(*≧∀≦*)気長に待ってます♪
いいなぁ…わたしももっと勉強します。