2006年7月26日

Movable Type 3.3 の再構築で「<MTTagName>タグが閉じられていません」になる問題の対処(改)

July 26,2006 1:05 AM
Tag:[, ]
Permalink

Movable Type 3.31 にアップグレードして、再構築した時に下記のエラーが発生するケースがあります。

テンプレート「メインページ」に解析エラーが発生しました:
 <MTTagName>タグが閉じられていません。

1.原因

エラーが発生する原因は、インストールしている MTTagInvoke プラグインの影響で、プラグインが定義しているMTタグ「MTTagName」が、3.3 で機能追加されたエントリー・タグ機能で使われる MTタグ「MTTagName」とバッティングしており、予期しない動作になってしまうためです。

2006.09.13 追記:3.3 に対応した MTTagInvoke プラグイン1.0 が公開されています。

エラー内容より、原因をもう少し分析すると、機能追加された MTTagName は変数タグ(つまり <$MTTagName$>)ですが、MTTagInvoke が提供している MTTagName はコンテナタグ(<MTTagName>~</MTTagName>)です。おそらく、最初に出現した(機能追加された方の) MTTagName を MTTagInvoke プラグインでハンドリングしてしまい、その結果「終了タグ </MTTagName> が見つからない」となってしまうようです。

最初にこの問題を知ったのは下記のテンプレートご利用サイト様です。ありがとうございました。

Project MultiBurst検索画面で「閉じられていません」というエラー回避(MT3.3)

2.対処方法1(推奨)

MTTagInvoke.pl を任意のエディタで開き、25行目辺りにある下記の赤色部分 *1

MT::Template::Context->add_tag(TagInvokeVersion => sub { $VERSION } );
MT::Template::Context->add_container_tag(TagInvoke => \&MTTagInvoke );
MT::Template::Context->add_container_tag(TagContent => \&MTTagContent );
MT::Template::Context->add_container_tag(TagName => \&MTTagName );
MT::Template::Context->add_container_tag(TagAttribute => \&MTTagAttribute );

を、他のMTタグと重複しない名称、ここでは「TagInvokeName」として

MT::Template::Context->add_tag(TagInvokeVersion => sub { $VERSION } );
MT::Template::Context->add_container_tag(TagInvoke => \&MTTagInvoke );
MT::Template::Context->add_container_tag(TagContent => \&MTTagContent );
MT::Template::Context->add_container_tag(TagInvokeName => \&MTTagName );
MT::Template::Context->add_container_tag(TagAttribute => \&MTTagAttribute );

のように修正します。

修正した部分はコンテナタグの <MTTagName> に該当しますので、このタグをテンプレート上で利用している場合は、<MTTagInvokeName>~</MTTagInvokeName> に変更します。Movable Type がデフォルト機能として提供している変数タグ <$MTTagName$> を変更する、という意味でありませんのでご注意ください。

3.対処方法2

検索すると、いくつかのサイト様で下記に示す方法が公開されているのですが、プログラム的に修正内容に不足があるため、この場でお知らせに代えさせて頂きます(このエントリーを書き始めてからそのことに気がつきました)。

下記の赤色2ヶ所、

MT::Template::Context->add_container_tag(TagName => \&MTTagName );

MT::Template::Context->add_container_tag(TagInvokeName => \&MTTagInvokeName );

に修正した場合、後方の \&MTTagName(または \&MTTagInvokeName)が Perl の「関数リファレンス」に該当します(つまり、タグとタグに対応するプログラムを対応させています)ので、この部分を修正した場合は、60行目辺りにある、

sub MTTagName {
    my ($ctx, undef, $cond) = @_;
    my $ti = tag_invoke($ctx) or return;
    defined($ti->{name} = $ctx->stash('builder')->build($ctx, $ctx->stash('tokens'), $cond))
        or return;
    return '';
}

の赤色部分も修正する必要があります。上記の修正例であれば

sub MTTagInvokeName {
    my ($ctx, undef, $cond) = @_;
    my $ti = tag_invoke($ctx) or return;
    defined($ti->{name} = $ctx->stash('builder')->build($ctx, $ctx->stash('tokens'), $cond))
        or return;
    return '';
}

とします。

実際には60行目辺りを修正しなくても、名称を変更した MTTagInvokeName をテンプレート上で利用していなければ問題は発生しません。したがってそのままでも大丈夫です。

ただし、MTTagInvokeName を利用して再構築を実施した場合は、

Undefined subroutine &MT::plugins::MTTagInvoke::MTTagInvokeName called at lib/MT/Builder.pm line 165.

というエラーが発生しますので注意が必要です。

ということで、2項の「対処方法1」を推奨します。


*1:色覚障害等で色が識別できない場合は、サイト右上の「Styles」メニューにある Gray Scale をクリックしてください。IEではグレースケール表示され、青色部分が下線表示、赤色部分が二重下線で表示されます。Firefox/Opera ではカラー表示のままですが下線表示に切り替わります。なお設定の都合上、リンクとテキスト表示が判断できなくなりますので予めご容赦ください。

Comments [9] | Trackbacks [6]
2006年7月20日

Movable Type の検索でエラーになる問題について

July 20,2006 12:23 AM
Tag:[, ]
Permalink

Movable Type で検索を行っていると、下記のようなメッセージが表示されるケースがあります。

現在検索中です。検索が終わるまでお待ちください。

これは Movable Type の仕様で、連続した検索実行を抑止しているためです。3.31 の場合、デフォルトの抑止時間は20秒で設定されていますので、検索してから20秒以内に再検索を実行すると上記のメッセージに出会うことになります。3.2 では 60秒に設定されています。

とはいっても、Movable Type に精通されていない方は検索を何回も繰り返すでしょうし、このままではサイト運営者は「検索機能がおかしいですよ」というコメントを頂くことになりかねません。下記の変更を行い、サイトを訪問された方が戸惑わないようにすることを推奨します。

1.連続実行抑止時間を短縮する

1.1 Movable Type 3.3? の場合

mt-config.cgi に

ThrottleSeconds 10

という ThrottleSeconds を追加することで、連続実行抑止時間を変更でき、エラーメッセージが表示される確率を下げることができます。数字の単位は「秒」で、上記の例は10秒(=検索してから10秒以内に再検索されたらエラーにする)を設定しています。

ThrottleSeconds

Movable TypeはIPベースのコメント帯域制御の設定を使い、コメントを溢れさせる攻撃(1つのエントリーに多量のコメントを送り付けること)に対処しています。 ThrottleSecondsはサイトの閲覧者がコメントを投稿した後に、再投稿できない時間を秒数で指定します。 たとえば、アリスがある時刻にコメントを投稿したと仮定します。すると彼女は、その時刻からこの設定に指定されている秒数の間、同じIPアドレスから別のコメントを投稿することができなくなります。 あなたのブログに対しコメントを投稿する人が多くなければ、この設定を上げることができます。

ただしこの設定項目はコメントやトラックバックについても適用されますので、値を下げ過ぎると同一投稿者からのコメント重複投稿やスパム攻撃が増加する可能性があります。またサーバにも負荷がかかりますので注意しましょう。

1.2 Movable Type 3.2 の場合

3.31 では設定ファイルで値の変更が可能ですが、3.2 はプログラムを修正する必要があります。

lib/MT/App/Search.pm

をダウンロードし、下記のパッチをあてます。

--- lib/MT/App/Search.pm.bak    Thu Sep 22 13:00:26 2005
+++ lib/MT/App/Search.pm        Mon Jul 17 18:49:37 2006
@@ -36,7 +36,7 @@
         if ($DB) {
             my $ip = $app->remote_ip;
             if (my $time = $db{$ip}) {
-                if ($time > time - 60) {   ## Within the last minute.
+                if ($time > time - 10) {   ## Within the last minute.
                     return $app->error($app->translate(
                         "You are currently performing a search. Please wait until your search is completed."));
                 }

パッチが利用できない場合は下記の赤色部分 *1 を変更してください。

sub init {
    my $app = shift;
       :
      (略)
       :
    ## Check whether IP address has searched in the last
    ## minute which is still progressing. If so, block it.
    if (eval { require DB_File; 1 }) {
        my $file = File::Spec->catfile($cfg->TempDir, 'mt-throttle.db');
        my $DB = tie my %db, 'DB_File', $file;
        if ($DB) {
            my $ip = $app->remote_ip;
            if (my $time = $db{$ip}) {
                if ($time > time - 60) {   ## Within the last minute.
                    return $app->error($app->translate(
                        "You are currently performing a search. Please wait until your search is completed."));
                }
            }
       :
      (略)
       :

元の「60」は60秒のようです。これより少ない値に変更すればエラーに遭遇する確率が下がります。修正案は10秒にしていますが、必要に応じて値は適宜修正してください。
修正が終わったら元のディレクトリにアップロードしてください。

2.エラーメッセージを改善

冒頭のエラーメッセージを変更し、ユーザに対し再検索で待ち時間が必要であることを促します。
メッセージの修正方法は、Movable Type をインストールしたディレクトリから

lib/MT/L10N/ja.pm

をダウンロードし、任意のエディタで開いて下記の赤色部分を修正します。

       :
## lib/MT/App/Search.pm
'You are currently performing a search. Please wait until your search is completed.' => '現在検索中です。検索が終わるまでお待ちください。',
       :

例えば下記のように修正します。

'You are currently performing a search. Please wait until your search is completed.' => '再検索する時は×秒以上待ってから行ってください。',

修正したら元のディレクトリにアップロードして上書きしてください。1項の修正と併用しても良いでしょう。


*1:色覚障害等で色が識別できない場合は、サイト右上の「Styles」メニューにある Gray Scale をクリックしてください。IEではグレースケール表示され、青色部分が下線表示、赤色部分が二重下線で表示されます。Firefox/Opera ではカラー表示のままですが下線表示に切り替わります。なお設定の都合上、リンクとテキスト表示が判断できなくなりますので予めご容赦ください。

Comments [4] | Trackbacks [5]
2006年7月 6日

コメント・プレビューで実体参照が無効になる不具合を解消する

July 6,2006 12:38 AM
Tag:[, , ]
Permalink

Movable Type のエントリー・アーカイブでコメントを書き、「確認」をクリックしてコメント・プレビュー画面に遷移すると、コメントに書いた実体参照、例えば

&lt;$MTBlogURL$&gt;

<$MTBlogURL$>

という風に、「&lt;」や「&gt;」が通常のタグとして表示されてしまいます。

この不具合を解消するには、コメント・プレビューテンプレートのテキストエリア表示部分に用いられている MT タグ「MTCommentPreviewBody」に下記の encode_html 属性を追加します。

デフォルトテンプレート

      :
<p id="comments-open-text">
   <label for="comment-text">コメント: <MTIfAllowCommentHTML>(スタイル用のHTMLタグが使えます)</MTIfAllowCommentHTML></label>
   <textarea id="comment-text" name="text" rows="10" cols="50"><$MTCommentPreviewBody autolink="0" sanitize="0" convert_breaks="0" encode_html="1"$></textarea>
</p>
      :

公開テンプレート

      :
<p id="comments-open-text">
   <label for="comment-text">コメント: <MTIfAllowCommentHTML>(スタイル用のHTMLタグが使えます)</MTIfAllowCommentHTML></label>
   <textarea id="comment-text" name="text" tabindex="10" accesskey="t" rows="10" cols="50"><$MTCommentPreviewBody autolink="0" sanitize="0" convert_breaks="0" encode_html="1"$></textarea>
</p>
      :

余談ですが、この事象は Movable Type 3.2 以降かつ、3.1 以前のテンプレートを使用していない場合に発生します。理由は、3.1 まではコメント・プレビューテンプレートで MTCommentFields という、コメントフィールドを丸ごと表示するタグが使われており、タグの内部処理で encode_html が行われていたからです。

私のサイトのコメント・プレビューは最近までこの MTCommentFields を使っておりまして、3.2 のデフォルトテンプレートに準拠させてから本エントリーの不具合が発生しておりました(放置してしまってすいません)。
テンプレートを改修致しましたので、「確認」をクリックしても実体参照は正常に引き継がれるようになっています。

なお、この MTCommentFields タグ、マニュアルには掲載されていませんが、3.3 でも動作するようです(ただし 3.1 の処理のままです)。

Comments [0] | Trackbacks [0]
2006年7月 3日

Movable Type 3.3 アップグレードによる月別アーカイブ・日別アーカイブの不具合

July 3,2006 12:31 AM
Tag:[]
Permalink

一昨日公開した Movable Type 3.3 テンプレートに入れ替えられた方から「月別アーカイブ(日別アーカイブ)が正常に再構築されません」という質問を頂きました。

具体的には、月別アーカイブ・日別アーカイブを再構築すると、それらの全てのアーカイブが最新のエントリー数件が表示されるという、トップページみたいな内容になってしまうようです。なおアーカイブページの URL は正常に生成されています。

この不具合は 3.31 で改修されています。お手持ちの Movable Type を最新版にバージョンアップしてください。
また以降の内容は過去のものです。

この問題について、Coffee Time さんから、MTEntries タグにデフォルトテンプレートと同様の sort_by 属性および sort_order 属性を付与し、

<MTEntries sort_by="created_on" sort_order="ascend">

と変更することで正常に生成されるという情報を頂きました(関連エントリー:3.3用テンプレ追加修正)。ありがとうございました。

不具合が発生した方から頂いた情報では、問題が発生するのは 3.2 からのアップグレードのみで、正規の手順でも発生しています。DBには依存しないようです。詳細はMovable Type 3.3 テンプレートのコメント欄をご覧ください。

なお新規インストールで公開テンプレートの月別アーカイブおよび日別アーカイブが正常に表示されることは確認しています。また同じアップグレードを行ってもアーカイブが問題なく生成される方もいらっしゃるようです。

ということで、今後 3.2 から 3.3 へのアップグレードに伴って月別・日別アーカイブが正常に生成されない場合は上記の修正を行ってください。この不具合に関して、コメント・トラックバック等で情報頂ければ幸いです(製品の仕様であれば記事を訂正します)。

Comments [5] | Trackbacks [2]
Now loading...
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

AMN
Categories
Monthly Archives
2020年
2019年
2018年
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3