Movable Type 4.26 のスケジュールタスク実行時にエラーが発生する現象について
Movable Type 4.26 のスケジュールタスク実行時に、次のエラーが発生します。Linux でも Windows でも発生します。
(in cleanup) Can't call method "registry" on an undefined value at lib/MT/Component.pm line 558 during global destruction.
本件についてシックスアパートに問い合わせたところ、すでに対応中ということでした。
ということで、対処はお任せして、ここでは、当該エラーを出力しない方法を2つ紹介します。
1.コマンドラインスイッチ「-w」を削除する。
「maRkのMyOwn - MT-Xsearchによるタグ検索が4.26でエラーの件」で紹介されている方法の応用で、tools/run-periodic-tasks の1行目(shebang行)の「-w」を削除します。
変更前
#!/usr/bin/perl -w
変更後
#!/usr/bin/perl
2.標準エラーを出力しない
cron を使用しているので、そもそも標準エラーを出力しない設定を行うことも可能です。
変更前
cd <path to mt>; ./tools/run-periodic-tasks
変更後(csh の場合) *さくらインターネット等
cd <path to mt>; ./tools/run-periodic-tasks >& /dev/null
変更後(bash の場合)
cd <path to mt>; ./tools/run-periodic-tasks 2>/dev/null
bash で標準出力も表示しない場合は次のようにします。
run-periodic-tasks >/dev/null 2>&1
シェルの種類を知るには次のコマンドを入力します。
echo $SHELL
Movable Type のコメント投稿で「コメントを投稿できませんでした。エラー: 短い期間にコメントを大量に送りすぎです。しばらくたってからやり直してください。」というエラー処理について
Movable Type 4.x では、スパムコメントを回避策として、短い期間にコメントを連続投稿すると、「コメントを投稿できませんでした。エラー: 短い期間にコメントを大量に送りすぎです。しばらくたってからやり直してください。」というエラーを表示する仕様になっています(下)。
![]()
ただ、連続して投稿している訳ではないのに、稀にこのエラーがいつまでも解消しないケースがあるようです。
不具合が解消するかどうかは分かりませんが、このエラーを出力している処理をトレースしてみました。
この処理を行なっているのは、lib/MT/App/Comments.pm にある _builtin_throttle という関数です。この関数はコア機能にビルトインされたコールバックです(下)。
sub init {
...中略...
MT->add_callback( 'CommentThrottleFilter', 1, undef,
\&MT::App::Comments::_builtin_throttle );
$app;
}
処理は下記に書かれている順番に実行します。文中の「0を返却」は、コメントスパム処理を行なうことを指し、「1を返却」は、コメントスパム処理を行なわないことを指します。
- 環境変数 ThrottleSeconds 0 が設定されていれば1を返却して処理終了
- ThrottleSeconds 0 が設定されていない場合、ThrottleSeconds(デフォルト20秒)で指定した時間内に、同一ブログIDに同一IPからの再投稿がある場合は0を返却して処理終了。それ以外の場合は次の処理を続行。
- 環境変数 ShowIPInformation が設定されていないか、0(デフォルト値)が設定されていれば1を返却して処理終了(特定のIPアドレスからのコメントを制限したい場合、ShowIPInformationに1を設定すれば、この後に処理を行なうため)
- ThrottleSeconds の10倍の時間の間に8回以上のコメント投稿があった場合、IP禁止リストに登録し、0を返却して処理終了。それ以外の場合は1を返却して処理終了
上記のことから、mt-config.cgi に環境変数 ThrottleSeconds 0 を設定しておけば、常に重複コメントが可能です(が、ネットで調べると、なぜかこれで解消しないケースもあるみたいで、再インストールで解消させているようです)。
また、あるブログ記事に、現在より未来の時間のコメントが投稿されていると、必ずこのエラーとなります(他のブログ記事のコメント投稿には影響なし)。例えば、自宅サーバの時間を(故意に)未来に変更してコメント投稿し、そのあと時間を元に戻してコメント投稿すると、この事象に遭遇します。
ShowIPInformation はより厳しいスパムチェックを行いたい場合に、mt-config.cgi に設定しておくと良いでしょう。ThrottleSeconds の値が20秒である場合、その10倍である200秒の間に8回投稿されると、IP禁止リストに登録されます。
IP禁止リストについては、「Movable Type の管理画面に「IP禁止リスト」を表示する」も参考にしてください。
まとまりのないエントリーですが、情報まで。
Movable Type 4.25 における MTEntires タグの category モディファイアの不具合について
キャッチアップが遅れましたが、Movable Type 4.25 で MTEntires タグに category モディファイアを利用している状態で、カテゴリー名に次の文字が含まれる場合、
- 半角丸カッコ(の閉じカッコ):")"
- 半角アンパサンド:"&"
再構築時に次のようなエラーが発生します。

上記の事象については、すでに下記の記事で公開されています。
ここでは、半角丸カッコや半角アンパサンドをカテゴリー名に利用している場合の暫定対処案を示します。
1.半角丸カッコを利用している場合
とりあえず、カテゴリ名に含まれる全角丸カッコに変更します。例えば、「(X)HTML」というカテゴリー名は、「(X)HTML」に変更します。
変更前

変更後

次にテンプレートを変更します。category モディファイアにカテゴリー名を直接記述している場合は、単にその部分を書き換えます。
変更前
<mt:Entries category="(X)HTML">
...中略...
</mt:Entries>
変更後
<mt:Entries category="(X)HTML">
...中略...
</mt:Entries>
カテゴリ名を出力する時に、全角の丸カッコを半角の丸カッコに変更して出力したい場合は、次のように MTSetVar タグと MTCategory タグに regex_replace モディファイアを利用すると良いでしょう。
<mt:setvar name="foo" value="/(.*)((.*))(.*)/" />
<mt:categoryLabel regex_replace="$foo","$1($2)$3" />
カテゴリアーカイブウィジェットに適用する場合は、次の青色部分を追加します。
<mt:IfArchiveTypeEnabled archive_type="Category">
<div class="widget-archive widget-archive-category widget">
<h3 class="widget-header>カテゴリ</h3>
<div class="widget-content">
<mt:TopLevelCategories>
<mt:SubCatIsFirst>
<ul>
</mt:SubCatIsFirst>
<mt:If tag="CategoryCount">
<li><a href="<$mt:CategoryArchiveLink$>"<mt:If tag="CategoryDescription"> title="<$mt:CategoryDescription remove_html="1" encode_html="1"$>"</mt:If>><mt:setvar name="foo" value="/(.*)((.*))(.*)/" /><mt:categoryLabel regex_replace="$foo","$1($2)$3" /> (<$mt:CategoryCount$>)</a>
<mt:Else>
<li><$mt:CategoryLabel$>
</mt:If>
<$mt:SubCatsRecurse$>
</li>
<mt:SubCatIsLast>
</ul>
</mt:SubCatIsLast>
</mt:TopLevelCategories>
</div>
</div>
</mt:IfArchiveTypeEnabled>
適用前

適用後

2.半角アンパサンドを利用している場合
とりあえず、カテゴリ名に含まれる全角アンパサンドに変更します。例えば、「foo & bar」というカテゴリー名は、「foo & bar」に変更します。
変更前

変更後

次にテンプレートを変更します。category モディファイアにカテゴリー名を直接記述している場合は、単にその部分を書き換えます。
変更前
<mt:Entries category="foo & bar">
...中略...
</mt:Entries>
変更後
<mt:Entries category="foo & bar">
...中略...
</mt:Entries>
カテゴリ名を出力する時に、全角のアンパサンドを半角のアンパサンドに変更して出力したい場合は、先ほどと同様、MTSetVar タグと MTCategory タグに regex_replace モディファイアを利用します。
<mt:setvar name="foo" value="/(.*)&(.*)/" />
<mt:CategoryLabel regex_replace="$foo","$1&$2" />
カテゴリアーカイブウィジェットに適用する場合は、次の青色部分を追加します。
<mt:IfArchiveTypeEnabled archive_type="Category">
<div class="widget-archive widget-archive-category widget">
<h3 class="widget-header>カテゴリ</h3>
<div class="widget-content">
<mt:TopLevelCategories>
<mt:SubCatIsFirst>
<ul>
</mt:SubCatIsFirst>
<mt:If tag="CategoryCount">
<li><a href="<$mt:CategoryArchiveLink$>"<mt:If tag="CategoryDescription"> title="<$mt:CategoryDescription remove_html="1" encode_html="1"$>"</mt:If>><mt:setvar name="foo" value="/(.*)&(.*)/" /><mt:CategoryLabel regex_replace="$foo","$1&$2" /> (<$mt:CategoryCount$>)</a>
<mt:Else>
<li><$mt:CategoryLabel$>
</mt:If>
<$mt:SubCatsRecurse$>
</li>
<mt:SubCatIsLast>
</ul>
</mt:SubCatIsLast>
</mt:TopLevelCategories>
</div>
</div>
</mt:IfArchiveTypeEnabled>
適用前

適用後

なお、半角のアンパサンドは、出力時に実体参照しておかないと valid な(X)HTML文書にならないので注意しましょう。
Movable Type の再構築エラー(コンテキスト外での利用)を解析方法
当サイトへのコメント欄に、
再構築をすると、「日付アーカイブ「Monthly2009xxxxxxxxxx」の再構築中にエラーが発生しました: テンプレート「月別ブログ記事リスト」の再構築中にエラーが発生しました: <mtEntryXXXX>タグでエラーがありました: mtEntryXXXXをコンテキスト外で利用しようとしています。MTEntriesコンテナタグの外部で使っていませんか? 」というエラーが出るのですが、どうすればよいでしょうか?
という手の質問をときどき頂くので、このエントリーでまとめておきます。
1.コンテキストについて
多分、質問されてくる方の大半が「コンテキスト」の意味が分からないものと推測しています。
コンテキストとは人によって解釈が異なりますが、ここでは、「Movable Type のテンプレートの、ある場所における、特定の情報を扱える状態」と定義します。
簡単に言い換えると、MTEntries タグの中は、ブログ記事系のテンプレートタグが扱えるコンテキストになります。
<mt:Entries>
[ブログ記事用のテンプレートタグが扱えるコンテキスト]
</mt:Entries>
また、MTCategories タグの中は、カテゴリ系のテンプレートタグが扱えるコンテキストになります。
<mt:Categories>
[カテゴリ用のテンプレートタグが扱えるコンテキスト]
</mt:Categories>
また、テンプレートタグ内部だけでなく、例えばブログ記事テンプレートであれば、ブログ記事テンプレート内全体がブログ記事用のテンプレートタグが扱えるコンテキストになります。
2.再構築エラーの解析方法について
下記のような再構築エラーを例に解説します。

Movable Type の再構築時のエラーメッセージは、先頭から順番にメッセージ内容を辿っていけば、原因が分かるようになっています。
まず、再構築でエラーが発生したページは、日付アーカイブ「Monthly20090401000000」ですが、「テンプレート「月別ブログ記事リスト」の再構築中にエラーが発生しました」とあるので、その元になるテンプレートが「月別ブログ記事リスト」であることが分かります。
次に、「<mtEntryDate>タグでエラーがありました」とあり、ここから「月別ブログ記事リスト」に記述された <mtEntryDate>タグが再構築エラーの原因であることが分かるので、テンプレート内に記述した、<mtEntryDate>タグを探してください。
エラーメッセージの最後に、「mtEntryDateをコンテキスト外で利用しようとしています。MTEntriesコンテナタグの外部で使っていませんか? 」とあります。<mtEntryDate>タグが使えるコンテキストは、
- MTEntries タグ内
- ブログ記事テンプレート
のいずれかなので、上記以外の場所で使われていることが再構築エラーの原因であることが分かります。
ちなみにこのエラーは、「月別ブログ記事リスト」の枠線で示した部分に、<mtEntryDate>タグを埋め込んだことが原因です。

3.エラーの解析のポイント
テンプレートモジュールやウィジェットを使っていると、エラーメッセージが長くなる場合がありますが、エラーメッセージの長さによらず、
- 元のテンプレート(モジュールやウィジェットではなく、インデックステンプレートやアーカイブテンプレート)
- エラーになっているテンプレートタグ(モジュールやウィジェットに記述されている場合もある)
- エラー種別(コンテキスト外での利用など)
の3つをエラーメッセージから抽出できれば、大体解決できると思います。
1つめの「元のテンプレート」は、テンプレート種別によってコンテキストが異なるので、コンテキスト関連のエラーであれば解析するために重要な情報となります。
なお、2つめの新しいブログを作った直後は、ブログ記事がひとつも存在しないので、テンプレートタグの使い方に誤りがあっても、出力すべきページがないため、テンプレートタグが評価されず、再構築エラーは発生しません(多分)。
4.参考図書
コンテキストはテンプレートタグを扱う場合に重要な概念と思っているのですが、このことについて扱っている Movable Type 関連書籍は下記の2冊のみです(認識が間違っていたらすいません)。
![]() | Movable Type 4.2 パーフェクトガイド 荒木 勇次郎 毎日コミュニケーションズ 2008-07-31 売り上げランキング : 1457 Amazonで詳しく見る by G-Tools |
![]() | Movable Type プロフェッショナル・スタイル MT4.1対応 CSS Nite 毎日コミュニケーションズ 2008-04-08 売り上げランキング : 2676 Amazonで詳しく見る by G-Tools |
「Movable Type 4.2 パーフェクトガイド」では、252~256ページで解説しています。
Movable Type の管理画面に「IP禁止リスト」を表示する
Movable Type では、一定期間に大量のスパムコメントを受信した場合、「IP禁止リスト」というものにスパムコメント投稿元のIPアドレスを登録するようですが、デフォルトのブログ管理画面には「IP禁止リスト」のメニューは表示されません。
これは「IP禁止リスト」滅多に操作する必要がないためと思われますが、下記の記事のように、テスト操作などで「IP禁止リスト」に登録されてしまい、その後のコメント投稿で、
- 「短い期間にコメントを大量に送りすぎです。しばらくたってからやり直してください。」
というエラーになってしまうような事象もあるみたいなので、同様の事象が発生している場合、試しに「IP禁止リスト」を表示してみると良いのではないでしょうか。
「IP禁止リスト」を表示するには、mt-config.cgi に下記の1行を追加します。
ShowIPInformation 1
これでブログ管理画面をリロードすれば、ツールメニューに「IP禁止リスト」が表示されます。

「IP禁止リスト」です。これは禁止されているIPアドレスがない状態です。

「IPアドレスの禁止」をクリックすれば手動で登録することもできます。

試しにひとつ登録してみました。日付が実体参照されているのはご愛嬌ということで。

削除するには、削除したいIPアドレスを選択して「削除」をクリックします。

MTMultiBlog タグブロック内での MTInclude タグの入れ子について(続き)
以前、「MTMultiBlog タグブロック内での MTInclude タグの入れ子について」という記事で、「MultiBlog タグと Include タグを入れ子にすると再構築エラーが発生する」という旨の内容を書いたのですが、コメントで対処方法を教えて頂きました。ありがとうございました。
また前回は、事象の詳細まで記していませんでしたので、今回は図で説明します。
1.現状の動作
まず前提として、図の一番上の「ポータルブログ(blog_id1)」では、その下にある2つのブログ(blog_id2/blog_id3)を、MultiBlog プラグインの設定で収集対象にしています。

この状態で、ポータルブログのメインページを再構築すると、メインページからインクルードしている2つのテンプレートモジュールは①のルートでインクルードされることを期待するのですが、現状の動作では、
- 「記事の概要」テンプレートモジュール:ポータルブログのテンプレートモジュールをインクルード
- 「記事のメタデータ」テンプレートモジュール:MultiBlog タグで処理しているブログのテンプレートモジュール(②③)をインクルード
となります。
blog_id2 のブログの処理では、ポータルブログと同じテンプレートモジュールがあるので再構築エラーにならないのですが、blog_id3 のブログの処理では、該当のテンプレートモジュールがみつからないため、再構築エラーになります(前回記事の事象)。

つまり、入れ子になっているテンプレートモジュールは、ポータルブログのテンプレートモジュールが使われません。
MultiBlog プラグインの設定で収集するブログを指定する代わりに、include_blogs モディファイアで収集するブログを指定しても、同様の事象でした。
ちなみに、テンプレートモジュールがないブログに同じ名前のテンプレートモジュール(内容は適当)を作れば、正常に再構築が完了します。
2.対処方法
各 Include タグに blog_id モディファイアを記述し、モディファイアの値に自ブログの番号を設定します。
先の図の場合、ポータルブログの「記事の概要」テンプレートモジュールからインクルードしている「記事のメタデータ」の MTInclude タグに、自分のブログID「blog_id="1"」を設定します。
対処前
<mt:include module="記事のメタデータ" />
対処後
<mt:include module="記事のメタデータ" blog_id="1" />
3.参考記事
参考記事は下記です。ありがとうございました。
Movable Type 4 の再構築で「Can't call method "id" on unblessed reference」が発生する問題について
Tag:[MovableType, MTEntriesWithSubCategories, MTTopLevelCategories, TroubleShooting]
Permalink
Movable Type 4 の月別カテゴリーアーカイブの再構築時に、次のようなエラーが発生する場合があります。

これは、「『新着エントリーの New マークを親カテゴリーに表示する』で再構築エラーになります」というご質問を頂いたのが発端です。
以下、本エントリーにて解消方法を展開します。なおこの問題は、バージョン 4.23 で確認しています。
1.問題
切り分けを行なったところ、月別カテゴリーアーカイブが再構築エラーになるのは、MTTopLevelCategories タグと MTEntriesWithSubCategories タグを次のように組み合わせた場合のようです。
<MTTopLevelCategories>
<MTEntriesWithSubCategories>
</MTEntriesWithSubCategories>
</MTTopLevelCategories>
MTSubCatsRecurse タグの有無は関係ありません。
2.解決策
とりあえず、MTEntriesWithSubCategories タグの振る舞いに問題がありそうなので、MTEntriesWithSubCategories タグの代わりに、MTEntries タグを使い、さらに category モディファイアとinclude_subcategories モディファイアを組み合わせます。
「新着エントリーの New マークを親カテゴリーに表示する」のサブテンプレートを例に、修正内容を示します。
変更前
<div class="side">
<div id="categories">
<MTTopLevelCategories>
<MTSubCatIsFirst><MTHasParentCategory><div id="subcategories<MTParentCategory><$MTCategoryID$></MTParentCategory>list"></MTHasParentCategory><ul></MTSubCatIsFirst>
<MTIfNonZero tag="MTCategoryCount">
<li><MTHasSubCategories><div class="subcategories" id="subcategories<$MTCategoryID$>name"></MTHasSubCategories><a href="<$MTCategoryArchiveLink$>" title="<$MTCategoryDescription$>"><MTCategoryLabel></a> [<$MTCategoryCount$>] <span class="new"><MTEntriesWithSubCategories lastn="1"><$MTEntryDate format="%Y:%m:%d:%H:%M:%S"$></MTEntriesWithSubCategories></span><MTHasSubCategories></div></MTHasSubCategories>
<MTElse>
<li><MTHasSubCategories><div class="subcategories" id="subcategories<$MTCategoryID$>name"></MTHasSubCategories><MTCategoryLabel> <span class="new"><MTEntriesWithSubCategories lastn="1"><$MTEntryDate format="%Y:%m:%d:%H:%M:%S"$></MTEntriesWithSubCategories></span>
<MTHasSubCategories></div></MTHasSubCategories>
</MTElse>
</MTIfNonZero>
<MTSubCatsRecurse>
</li>
<MTSubCatIsLast></ul><MTHasParentCategory></div></MTHasParentCategory></MTSubCatIsLast>
</MTTopLevelCategories>
</div>
</div>
変更後
<div class="side">
<div id="categories">
<MTTopLevelCategories>
<MTSubCatIsFirst><MTHasParentCategory><div id="subcategories<MTParentCategory><$MTCategoryID$></MTParentCategory>list"></MTHasParentCategory><ul></MTSubCatIsFirst>
<MTIfNonZero tag="MTCategoryCount">
<li><MTHasSubCategories><div class="subcategories" id="subcategories<$MTCategoryID$>name"></MTHasSubCategories><a href="<$MTCategoryArchiveLink$>" title="<$MTCategoryDescription$>"><MTCategoryLabel></a> [<$MTCategoryCount$>] <span class="new"><MTCategoryLabel setvar="cat"><MTEntries category="$cat" include_subcategories="1" lastn="1"><$MTEntryDate format="%Y:%m:%d:%H:%M:%S"$></MTEntries></span><MTHasSubCategories></div></MTHasSubCategories>
<MTElse>
<li><MTHasSubCategories><div class="subcategories" id="subcategories<$MTCategoryID$>name"></MTHasSubCategories><MTCategoryLabel> <span class="new"><MTCategoryLabel setvar="cat"><MTEntries category="$cat" include_subcategories="1" lastn="1"><$MTEntryDate format="%Y:%m:%d:%H:%M:%S"$></MTEntries></span>
<MTHasSubCategories></div></MTHasSubCategories>
</MTElse>
</MTIfNonZero>
<MTSubCatsRecurse>
</li>
<MTSubCatIsLast></ul><MTHasParentCategory></div></MTHasParentCategory></MTSubCatIsLast>
</MTTopLevelCategories>
</div>
</div>
ピンポイントで抜き出すと以下のようになります。
変更前
<MTEntriesWithSubCategories lastn="1">
<$MTEntryDate format="%Y:%m:%d:%H:%M:%S"$>
</MTEntriesWithSubCategories>
変更後
<MTCategoryLabel setvar="cat">
<MTEntries category="$cat" include_subcategories="1" lastn="1">
<$MTEntryDate format="%Y:%m:%d:%H:%M:%S"$>
</MTEntries>
変更後のサブテンプレートですが、まず、MTCategoryLabel タグに setvar モディファイアを与えて、変数 cat に処理中のカテゴリー名を設定します。
その後、MTEntries タグの category モディファイアに変数 cat を与えることで、処理中のカテゴリだけを対象にします。
さらに include_subcategories モディファイアに 1 を与えることで、category モディファイアで指定したカテゴリー配下のサブカテゴリーも処理対象にします。
MTMultiBlog タグブロック内での MTInclude タグの入れ子について
現在、Movable Type の MultiBlog プラグインでポータルブログの実験中ですが、MTInclude タグの入れ子があると再構築でエラーになるようです。
確認したのは 4.23 + Windows ローカル環境のみで、他の環境は確認できていません。
まず、ポータルブログにするブログのメインページに次のようなサブテンプレートがあります。
<mt:Entries>
<$mt:Include module="ブログ記事の概要"$>
</mt:Entries>
サブテンプレートからインクルードしている「ブログ記事の概要」テンプレートモジュールでは、さらに MTInclude タグを使って「ブログ記事のメタデータ」テンプレートモジュールをインクルードしています。メタデータには投稿日時や投稿者、コメント件数やトラックバック件数など、ブログ記事の投稿情報が含まれます。
次に、ポータルブログの収集対象となるブログの作成と、各ブログの MultiBlog プラグインの設定を行ったあと、上記のサブテンプレートを MTMultiBlog タグで括り、
<mt:multiBlog mode="loop">
<mt:Entries>
<$mt:Include module="ブログ記事の概要"$>
</mt:Entries>
</mt:multiBlog>
とすると、メインページの再構築時に次のエラーが発生します。

MTInclude でインクルードしている内容を元テンプレートに貼り付けると、再構築エラーは解消します。
「ブログ記事の概要」テンプレートモジュールでは「カテゴリ」テンプレートモジュール、「タグ」テンプレートモジュールをインクルードしていますが、それらについても同様です。
要約すると、MTMultiBlog タグから1回のインクルードは大丈夫ですが、入れ子のインクルードがあると再構築エラーになるようです。大雑把な説明ですいませんが、当方の設定ミス等がありましたらご指摘ください。
Movable Type 4.21 でファイルのアップロードで「不正な要求です。文字コードUTF-8に含まれない文字データを送信しています。」というエラーになる問題について
Movable Type 4.21 で、ファイルのアップロード時にエラーになる事象が発生しています。「Movable Type 4.1x から 4.2 へのアップグレード」のあちゅさんのコメント(=シックス・アパート問い合わせの回答)を情報展開しておきます。
なお、この問題は、MTOS 4.21、Movable Type 3.37、Movable Type Enterprise 1.55、あるいはそれ以前のバージョンで、4項に示している関連記事に掲載されているバージョンでも発生すると思われます。
1.問題
特定の条件でファイルをアップロードすると、「不正な要求です。文字コードUTF-8に含まれない文字データを送信しています。」というエラーになり、ファイルのアップロードができない。
2.発生条件
- Perl 5.8.5 以前のバージョン
- アップロードするファイルのパスに日本語が含まれている(「デスクトップ」等)
- ブラウザに Internet Explorer を使用(不具合の報告があったのはIE6)
3.対処
- Perl 5.8.8 にバージョンアップ
- アップロードする保存ファイル名に日本語を含まない
- ブラウザにIEを使用しない(Firefox・Safariなどを使用)
なお、この問題はセキュリティアップデート(4項参照)を行った結果であり、このエラー発生を Movable Type 側での修正によって解消させた場合、再びセキュリティの脆弱性を招くことになるため、修正を行う予定はないようです。
4.関連記事
Movable Type 4 でテンプレート編集画面の内容が途中から消失する問題の対処
MT4 になってから、「テンプレート編集画面の下半分が消失する」という事象があったのですが、原因が判明しました。
Firefox で Googleツールバーを使用していると発生します。
一昨日の MT4LP5 のパネルディスカッションでその質問があがり、CHEEBOW さんの回答で知りました。ありがとうございました! > CHEEBOWさん
また、情報収集不足ですいません。
私も以前、何回かこの事象に遭遇していたのですが、OSを再インストールしてから一度も発生しなくなりました。たしかに、再インストール後は、Firefox に Google ツールバーをいれてませんでした。
参考記事は下記です。以下の記事は、上記の内容を受けて検索してヒットしたものですが、いずれもMT3の時の記事なので、本件の事象とは無関係かもしれません。予めご了承ください。
- ヒビノアワ:Googleツールバーを使うのをやめてみた
- CLUB.AKITOMO.NET:Google ツールバーの不具合?
- Sailing Notes:Firefox + GoogleToolbarでフォーム内容(textarea)が消えるバグ修正
ということで、この事象で困っている場合は、FIrefox から Google ツールバーをアンインストールしましょう。
2008.04.09 追記
他のブラウザ含め、MT4.1にアップグレードすることで解消するというコメントを頂きました。私もOS再インストール後はMT4.1の利用しか行っていないので、MT4.1へのアップグレードを推奨します。
Windows XP のローカルサーバ環境(ジャンクション利用)への Movable Type 4.1 のインストールで「mt-staticがみつかりません」という警告が表示される場合の対処
Windows XP で、XAMPP + XAMPP addon Perl のローカルサーバ環境を色々試していたら、次のような事象が発生することが分かりました。
1.問題
Perlインタプリタのパス解決のために、ジャンクション(後述)を設定し、Movable Type 4.1 の新規インストールを開始すると、次のような警告画面が表示されます。

もちろん、mt-static はフォルダ名も変更しておらず、アプリケーションディレクトリ直下にあります。
この状態で、フォームに表示された(正しい)データのまま「開始」をクリックしても、次のような同じ画面が表示され、無限ループに陥ります。

PCを変えても同じ事象が発生したので、100%発生するのではないかと思われます。
ちなみに、本当に mt-static フォルダがみつからない場合は、次のように正しいレイアウトで表示されます。

最初の画面のように、2つの画面が重なったような、妙なデザインで表示されている場合は、ほぼ今回の問題に遭遇していると考えて間違いないでしょう。
2.原因
冒頭に記述した通り、Perl インタプリタのパス解決に使用した「ジャンクション」という機能に起因しているようです。
ジャンクションとは、Linux の「シンボリックリンク」のようなもので、XAMPP addon Perl のインストールパス¥xampp¥perlを¥usrとして、仮想的なフォルダを作成することができます。Movable TypeのCGIファイルのデフォルト設定は、¥usr¥bin¥perlをインタプリタのとして認識するため、このような設定が必要です。
なお、ジャンクションの設定には、下記のツールを使いました(「ツールが良くない」という意味ではありませんので、誤解なきよう)。
そもそも、Movable Type のインストール開始時には、mt-staticの中にある mt.js ファイルを取得して、さらにその中に「function openManual」という文字列があることをもって、mt-static パスの取得を成功と判定していますが、この処理が正常に動作しないようです。
エラーになる時のHTTPレスポンス($response->status_lineを出力)を見てみると、
500 Can't locate object method "configure" via package "Net::HTTP"
となっていました。
ジャンクション以外の方法で Perl インタプリタのパスを解決した場合はmt-static パスのエラーにはならないので、ジャンクションがこの問題の原因と考えます。
3.対処(その1)
環境設定ファイル、mt-config.cgiを作ってからアクセスすれば、この無限ループに入ることなくインストールできます。もともと mt-config.cgiは、MT3.x 前期の時代には、インストール前に手動で設定していたファイルです。
作り方は、アプリケーションディレクトリに mt-config.cgi-original がありますので、このファイルをコピーするか、リネームしてmt-config.cgi の元ネタを作ります。
次に、任意のエディタで mt-config.cgi を開き、下記の青色の部分を設定します。
:
# The CGIPath is the URL to your Movable Type directory
CGIPath http://www.example.com/cgi-bin/mt/
# The StaticWebPath is the URL to your mt-static directory
# Note: Check the installation documentation to find out
# whether this is required for your environment. If it is not,
# simply remove it or comment out the line by prepending a "#".
StaticWebPath http://www.example.com/mt-static
#================ DATABASE SETTINGS ==================
# REMOVE all sections below that refer to databases
# other than the one you will be using.
##### MYSQL #####
ObjectDriver DBI::mysql
Database DATABASE_NAME
DBUser DATABASE_USERNAME
DBPassword DATABASE_PASSWORD
DBHost localhost
##### POSTGRESQL #####
ObjectDriver DBI::postgres
Database DATABASE_NAME
DBUser DATABASE_USERNAME
DBPassword DATABASE_PASSWORD
DBHost localhost
##### SQLITE #####
ObjectDriver DBI::sqlite
Database /path/to/sqlite/database/file
CGIPath は Movable Type をインストールしたパス、StaticWebPath は、今回問題となっているスタティックディレクトリのパス(mt-staticまで含む)を記述します。
その下はデータベースの設定です。MYSQL/SQLITE はいずれか一方のみ、必要な項目(MySQLであればデータベース名・ユーザ名・パスワード、SQLiteはデータベースのパスのみ)を設定して、不要な方は削除してください。
赤色の POSTGRESQL は最初から削除してください(使うのであれば他のDB設定を削除)。
保存して、ブラウザから Movable Type のインストールディレクトリにアクセスします。

「ログイン」をクリックすれば、mt-static の検証はおろか、途中のデータベース設定などのウィザードを一気にスキップして、アカウント作成画面に進みます。

これで、インストールを最後まで進められます。
4.この対処による懸念事項
インストール後も、HTTP経由でローカルホストにアクセスする機能が一部、使えない可能性があります(下)。
テーマのURLでローカルホストを指定
![]()
Feedウィジェットでローカルホストを指定
![]()
5.対処(その2)
ジャンクションを使わずに、全 CGI の shebang 行(1行目の #!/usr/per/bin という部分)を
#!/xampp/perl/bin/perl
に変更するなど、他の方法で Perl インタプリタのパスを解決します。
Movable Type でサブドメインを利用する場合の設定
インストールした Movable Type で複数のブログを作成し、各ブログに異なるドメインを設定した場合の対処方法です。
以前質問を頂いたので、情報展開しておきます。
結論から申し上げますと、mt-config.cgi のパスを変更する必要があります。
インストール後の mt-config.cgi の CGIPath(アプリケーションディレクトリを示す)と StaticWebPath(スタティックディレクトリを示す)のパスは、次のようなドキュメントルートからの記述になっています。
#======== REQUIRED SETTINGS ==========
CGIPath /cgi-bin/mt/
StaticWebPath /cgi-bin/mt/mt-static/
本来のドメインが
foo.com
である場合、mt.cgi のパスは
http://foo.com/cgi-bin/mt/mt.cgi
となりますが、サブドメイン sub.foo.com では、mt.cgi のパスを
http://sub.foo.com/cgi-bin/mt/mt.cgi
と認識してしまい、(サブドメインの物理パスはドメインと異なるため)CGI が正常に動作しません。これはドメインの部分に、ブログの「サイトパス」を結合しているのが原因です。
ということで、サブドメインなど、本来のドメインと異なるドメインから、正しいアプリケーションディレクトリやスタティックディレクトリを参照させるには、FTP ツールで mt-config.cgi をダウンロードして、CGIPath と StaticWebPath をそれぞれ、
CGIPath http://foo.com/cgi-bin/mt/
StaticWebPath http://foo.com/cgi-bin/mt/mt-static/
と、ドメインを加えた URL に書き直す必要があります。
実際に、ページに出力されて影響がある部分は、CGIPath については、いわゆるCGI(コメント・トラックバック・検索・XMLRPCなど)の起動部分や、mt.js が該当します。
StaticWebPath(mt-static)については、デフォルトテンプレートでは、クレジットバナーやフィードアイコンなどへの参照があるようです。
デフォルトテンプレートのテーマファイルの参照は、MTStaticWebPath タグが使われているので、この変更ですべて対処されると思ってますが、他にも適用箇所があるとか、プラグインとかで対処できるといった認識誤りがありましたらご指摘ください。スタイルを切り替えた場合に影響があります。
上記を含めた、サブドメインについての詳細は、「Movable Type 4.2 パーフェクトガイド」の7.1に解説しています。
![]() | Movable Type 4.2 パーフェクトガイド 荒木 勇次郎 毎日コミュニケーションズ 2008-07-31 売り上げランキング : 1457 Amazonで詳しく見る by G-Tools |
Movable Type 4.1 でコメント投稿者情報が保存されない不具合について
Movable Type 4.1 のデフォルトテンプレート・および配布テンプレートで、コメント投稿者情報が保存されない問題が発生しています。
配布テンプレートご利用の皆様にはご迷惑をおかけして申し訳ございません。
以下、問題・原因・対処方法を記します。
1.問題
コメント投稿時に「ログイン情報を記憶」をチェックしてコメントを投稿しても、投稿者情報が保存されない(JavaScript エラーが発生)。
2.原因
Movable Type 4.1 の JavaScript(mt.js)を、正常に動作していた 4.0x の同ファイルと比較したところ、次の差分がありました。
4.0
function setCookie (name, value, expires, path, domain, secure) {
var curCookie = name + "=" + escape(value) + (expires ? "; expires=" + expires : "") +
(path ? "; path=" + path : "") + (domain ? "; domain=" + domain : "") + (secure ? "secure" : "");
document.cookie = curCookie;
}
4.1
function setCookie (name, value, expires, path, domain, secure) {
var curCookie = name + "=" + escape(value) + (expires ? "; expires=" + expires.toGMTString() : "") +
(path ? "; path=" + path : "") + (domain ? "; domain=" + domain : "") + (secure ? "secure" : "");
document.cookie = curCookie;
}
ということで、expires.toGMTString() が影響しているようです。
toGMTString() は、グリニッジ標準時を文字列に変換したものを返すものですが、この処理は setCookie を呼び出す前に行っています(青色部分)。
function rememberMe (f) {
var now = new Date();
fixDate(now);
now.setTime(now.getTime() + 365 * 24 * 60 * 60 * 1000);
now = now.toGMTString();
if (f.author != undefined)
setCookie('mtcmtauth', f.author.value, now, '/', '', '');
if (f.email != undefined)
setCookie('mtcmtmail', f.email.value, now, '/', '', '');
if (f.url != undefined)
setCookie('mtcmthome', f.url.value, now, '/', '', '');
}
3.対処
上に示した 4.0 のソースコードを参考にして、expires.toGMTString() の .toGMTString() を削除して、保存・再構築してください。
配布テンプレートは修正済です(template_4_1_utf8_1_1)。
「月別アーカイブリスト」が月別アーカイブで正常に表示されない不具合について
Movable Type 4.1 で、「月別アーカイブリストが月別アーカイブで正常に表示されません」というご質問を頂きました。調べた結果、不具合を発見致しましたので、本エントリーにて情報展開致します。
1.問題
デフォルトテンプレートでは問題なく表示されるのですが、配布テンプレートで動作を確認したところ、メインページでは次のように表示されている月別アーカイブリストが、

例えば、2008年2月の月別アーカイブページにジャンプすると、2008年2月のリストしか表示されません。

2.原因
MTArchiveListHeader テンプレートタグが記述されていないと正常に動作しないようです。
下はデフォルトテンプレートと小粋空間テンプレートの月別アーカイブリストのサブテンプレートです。比べると、デフォルトテンプレートでは MTArchiveListHeader テンプレートタグが記述されていますが、小粋空間テンプレートには記述されていません。
デフォルトテンプレート
<mt:IfArchiveTypeEnabled archive_type="Monthly">
<mt:ArchiveList archive_type="Monthly">
<mt:ArchiveListHeader>
<div class="widget-archive-monthly widget-archive widget">
<h3 class="widget-header"><$mt:ArchiveTypeLabel$> <a href="<$mt:Link template="archive_index"$>">アーカイブ</a></h3>
<div class="widget-content">
<ul class="widget-list">
</mt:ArchiveListHeader>
<li class="widget-list-item"><a href="<$mt:ArchiveLink$>"><$mt:ArchiveTitle$> (<$mt:ArchiveCount$>)</a></li>
<mt:ArchiveListFooter>
</ul>
</div>
</div>
</mt:ArchiveListFooter>
</mt:ArchiveList>
</mt:IfArchiveTypeEnabled>
小粋空間テンプレート
<mt:IfArchiveTypeEnabled archive_type="Monthly">
<dt class="sidetitle">
Monthly Archives
</dt>
<dd class="side">
<ul>
<MTArchiveList archive_type="Monthly">
<li><a href="<$MTArchiveLink$>"><$MTArchiveTitle$></a> [<$MTArchiveCount$>]</li>
</MTArchiveList>
</ul>
</dd>
</mt:IfArchiveTypeEnabled>
3.対処
月別アーカイブリストに MTArchiveListHeader テンプレートタグを記述してください。下記は小粋空間テンプレートでの変更例です(MTArchiveListFooter テンプレートタグもペアで記述しています)。
<MTIfArchiveTypeEnabled archive_type="Monthly">
<dt class="sidetitle">
Monthly Archives
</dt>
<dd class="side">
<MTArchiveList archive_type="Monthly">
<MTArchiveListHeader><ul></MTArchiveListHeader>
<li><a href="<$MTArchiveLink$>"><$MTArchiveTitle$></a> [<$MTArchiveCount$>]</li>
<MTArchiveListFooter></ul></MTArchiveListFooter>
</MTArchiveList>
</dd>
</MTIfArchiveTypeEnabled>
Movable Type 4.0x でブログ記事へのリンクが post.html になる/ブログ記事のプレビューができない不具合について
Movable Type 4.0x における、ブログ記事ページ関連の不具合を本エントリーにまとめておきます。
1.ブログ記事のファイルへのリンクが「post.html」になる問題
Movable Type 4.0x で、「最近のエントリー」等の、ブログ記事へのリンクが全て「post.html」になるという報告を頂いています。
これは、同じご質問を連続して頂いてから気がついたのですが、質問された方はすべて、ブログ記事アーカイブのアーカイブマッピングの「パス」を、デフォルトから
%y/%m/%d-%h%n%s%x
あるいは
%y/%m/%d_%h%n%s%x
に変更されていました。
この事象は特定の環境でのみ発生するようです。もし、同じような事象で困っている方は 4.1 にアップグレードしてみてください。
2.ブログ記事のプレビューができない問題
上記と似た事象で、「ブログ記事のプレビューができない」という問題が 4.0x であり、これもブログ記事アーカイブのアーカイブマッピングを変更するとプレビューが正常にできないようです。
3.関連リンク
テンプレートの再構築で「モジュールというテンプレートが見つかりませんでした」というエラーになる場合の対処
Movable Type 4 の配布テンプレートの入れ替え時に、下記のようなエラーが発生する場合の対処方法です。

この事象について質問が多く寄せられるので、本エントリーに対処方法を紹介致します。
1.原因
一番最初に、メインページのテンプレートだけを入れ替えた後、「保存と再構築」を実行すると、上記のエラーが発生します。
これはメインページのテンプレートに、テンプレートモジュール「サイドバー(またはサイドバー2)」を呼び出す MTInclude タグが書かれているのですが、そのタグが実行された時に「サイドバー(またはサイドバー2)」というテンプレートモジュールが作成されていないためです。
もう少し具体的に解説すると、メインページテンプレートや他のアーカイブページのテンプレートには、
<$MTInclude module="サイドバー"$>
または
<$MTInclude module="サイドバー2"$>
という、テンプレートモジュールを呼び出すためのタグが書かれています。
再構築実行時、Movable Type のプログラムはこのタグを読み込み、「サイドバー(サイドバー2)というテンプレートモジュールを呼び出す」という動作を行うのですが、デフォルトのテンプレートモジュールの一覧には「サイドバー(またはサイドバー2)」というテンプレートモジュールがありません(下)。

そのため、Movable Type では再構築を続行することができず、エラーを出力します。
2.対処方法
テンプレートモジュール「サイドバー」「サイドバー2」を作成すれば、再構築のエラーは発生しなくなります。
以下、「サイドバー」「サイドバー2」の作成方法です。
メインページのテンプレートを入れ替えて、保存した後、メインページのテンプレート編集画面右にある「インクルードモジュール」の一覧に、
サイドバー (新規作成)
サイドバー2 (新規作成)
が表示されていると思います(下)。

この「新規作成」をクリックすれば、サイドバー(またはサイドバー2)のテンプレートモジュールの新規作成画面に直接遷移することができます。
まず「サイドバー」の新規作成をクリックして、「サイドバー」の新規作成画面に遷移します。作成画面のテンプレート名には「サイドバー」が自動的に入ってますので(下)、

あとはテキストエリアにテンプレートの内容(sidebar.mtml)をペーストして、「保存」をクリックしてください。
保存後、メインページの編集画面に戻り、同じ要領で「サイドバー2」の新規作成画面に遷移します。作成画面のテンプレート名には「サイドバー2」が自動的に入ってますので(下)、

あとはテキストエリアにテンプレートの内容(sidebar2.mtml)をペーストして、「保存」をクリックしてください。これで再構築をしてもエラーが発生しなくなります。
また、テンプレートモジュールへの一覧にも「サイドバー」「サイドバー2」が追加されています。

エラーメッセージの後半が「サイドバーというモジュールテンプレートがみつかりませんでした」と解釈してもらえれば、内容を推測してエラー原因に辿り着けると思いますので、同様のエラーが発生した時に参考にしてください。
Movable Type 4 の管理画面で詳細メッセージのないエラーが発生する不具合について
Movable Type 4 のブログ管理画面操作中、下のような、詳細メッセージのないエラー画面に時々遭遇することがあります。

感覚的には、管理画面にグインした後、長時間(といっても数十分程度)何も操作しない状態の直後の操作で発生するようです。
根本的な解消策はみつかってませんが、この画面が表示された場合は、ブラウザの「戻る」をクリックしてリロードすれば元の操作に戻ることができます。
ちなみに、セッションタイムアウト(UserSessionTimeout)は、デフォルトで4 時間 (14400秒)に設定されていますが、それより短い時間で遭遇するので、セッションのタイムアウトではないようです。
また、この設定にひっかかった場合は、エラー画面ではなくログイン画面に遷移します。
Movable Type 4 のデフォルトテンプレートで @import が表示される問題
いくつかのブログで「Movable Type 4 のデフォルトテンプレートを使用すると @import が上部に表示される」という事象が発生しているようです。
原因はデフォルトテンプレートの「ヘッダー」の7行目にある、
<$MTInclude identifier="styles" trim_to="0"$>
が展開されてしまうためですが、当サイトでは再現しませんでした。
検索してみたところ、Perl 5.8.0 のバグのようです。
この行は styles、つまり「スタイルシート(メイン)」をインクルードするのですが、「最初のN文字を取り出す」という trim_to 属性の値が 0 になっているということは、このタグでは何も表示されないのが正しい動作のところ、Perl 5.8.0 では表示されてしまうようです(7行目が何故必要かについては理解できていませんStyleCatcherで必要らしいです)。
ちなみに、8行目で、
<link rel="stylesheet" href="<$MTLink template="styles"$>" type="text/css" />
と、「スタイルシート(メイン)」を取得しているので、7行目は style 要素で括るのではなく、参照元サイトにある通り、
<MTSetVarBlock name="__null__">
<$MTInclude identifier="styles"$>
</MTSetVarBlock>
が良いでしょう。
追記:あんちもん2.Labさんの MTVoid プラグインでも同様の結果を得られます。
検索結果のページ分割(3.3x 版)
Tag:[Counter, Customize, MovableType, MTPaginate, Plugin, SearchResult]
Permalink
MTPaginate プラグインを利用することで、テキスト検索・タグ検索のページ分割が可能ですが、Movable Type 3.3x ではメインページや他のアーカイブと同じような設定では、例えばデフォルトテンプレートでは 2カラム表示が崩れるという問題が発覚しました。*1
ということで、3.3x 版の検索結果のページ分割方法について改めて説明致します。
なお、テンプレートの修正内容が複雑なため、今回は理由を説明しながらタグの設定を行っていきます。作業をスキップしたい方は1項、2項を実施した後、5項のタグをそのまま検索結果ページの該当部分と置き換えてください。
1.プラグインファイルのダウンロード
プラグイン配布サイト
よりプラグインをダウンロードします(ページ上方にある「Download」をクリック)。
2.プラグインファイルのアップロード
ダウンロードしたファイルを解凍し、その中の MTPaginate ディレクトリを下記のディレクトリ構成になるように plugins ディレクトリに丸ごとアップロードします。
plugins/MTPaginate/lib/MTPaginate.pm
plugins/MTPaginate/MTPaginate.pl
3.ページ分割用タグを挿入
検索結果テンプレートを修正していきます。
最初に、ページ分割用のタグ
MTPaginateMTPaginateContentMTPaginateSectionBreak
と、ナビゲーション表示の
MTPaginateIfMultiplePagesMTPaginateIfPreviousPage_MTPaginateNavigatorMTPaginateIfNextPage_
を追加します(青色部分)。挿入位置は他の既存タグを参考にしてください。基本的には
<MTSearchResults>の前</MTSearchResults>の前後
の辺りです。
:
<MTIgnore>
########## 検索結果表示
</MTIgnore>
<MTPaginate mode="cgi">
<MTPaginateIfMultiplePages>
<div class="paginate">
<MTPaginateIfPreviousPage_>
<a href="<$MTPaginatePreviousPageLink$>" title="previous page link"><</a>
</MTPaginateIfPreviousPage_>
<$MTPaginateNavigator format_all="All Pages" place_all="after"$>
<MTPaginateIfNextPage_>
<a href="<$MTPaginateNextPageLink$>" title="next page link">></a>
</MTPaginateIfNextPage_>
</div>
</MTPaginateIfMultiplePages>
<MTPaginateContent max_sections="3">
<MTSearchResults>
<MTBlogResultHeader>
<h3 class="search-results-header">
<MTIfStraightSearch>
ブログ: <$MTBlogName$> での検索結果
</MTIfStraightSearch>
<MTIfTagSearch>
<$MTBlogName$>でタグ <$MTSearchString$> が指定されているエントリー
</MTIfTagSearch>
</h3>
<div class="search-results-container">
</MTBlogResultHeader>
<h3><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></h3>
<p><$MTEntryExcerpt$> <$MTEntryEditLink$></p>
<MTIfTagSearch>
<div class="entry-tags">
<h4 class="entry-tags-header">タグ:</h4>
<ul class="entry-tags-list">
<MTEntryTags>
<li class="entry-tag"><a href="<$MTTagSearchLink$>&IncludeBlogs=<$MTSearchIncludeBlogs$>" rel="tag"><$MTTagName$></a></li>
</MTEntryTags>
</ul>
</div>
</MTIfTagSearch>
<p class="entry-footer">
<span class="post-footers"><MTIfNonEmpty tag="EntryAuthorDisplayName">投稿者: <$MTEntryAuthorDisplayName$> </MTIfNonEmpty>日時: <$MTEntryDate$></span>
</p>
<MTBlogResultFooter>
</div>
</MTBlogResultFooter>
<$MTPaginateSectionBreak$>
</MTSearchResults>
</MTPaginateContent>
</MTPaginate>
<MTIgnore>
########## 検索結果がないときのメッセージ
</MTIgnore>
:
MTPaginateContent の max_sections 属性(赤色部分)の「3」が1ページの表示件数です。この部分はお好みの値に変更してください。
ナビゲーションを後方に表示したい場合は、<MTPaginateIfMultiplePages>~</MTPaginateIfMultiplePages> を </MTPaginate> の直前に追加してください。
4.検索結果ヘッダおよび検索結果フッタ用タグを削除
MTSearchResults の中に記述された検索結果ヘッダおよび検索結果フッタ用タグ
MTBlogResultHeaderMTBlogResultFooter
を削除します(赤色部分)。タグで括られた内容は後で利用しますので、メモ帳にでもペーストしておいてください。
:
<MTIgnore>
########## 検索結果表示
</MTIgnore>
<MTPaginate mode="cgi">
<MTPaginateIfMultiplePages>
<div class="paginate">
<MTPaginateIfPreviousPage_>
<a href="<$MTPaginatePreviousPageLink$>" title="previous page link"><</a>
</MTPaginateIfPreviousPage_>
<$MTPaginateNavigator format_all="All Pages" place_all="after"$>
<MTPaginateIfNextPage_>
<a href="<$MTPaginateNextPageLink$>" title="next page link">></a>
</MTPaginateIfNextPage_>
</div>
</MTPaginateIfMultiplePages>
<MTPaginateContent max_sections="3">
<MTSearchResults>
<MTBlogResultHeader>
<h3 class="search-results-header">
<MTIfStraightSearch>
ブログ: <$MTBlogName$> での検索結果
</MTIfStraightSearch>
<MTIfTagSearch>
<$MTBlogName$>でタグ <$MTSearchString$> が指定されているエントリー
</MTIfTagSearch>
</h3>
<div class="search-results-container">
</MTBlogResultHeader>
<h3><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></h3>
<p><$MTEntryExcerpt$> <$MTEntryEditLink$></p>
<MTIfTagSearch>
<div class="entry-tags">
<h4 class="entry-tags-header">タグ:</h4>
<ul class="entry-tags-list">
<MTEntryTags>
<li class="entry-tag"><a href="<$MTTagSearchLink$>&IncludeBlogs=<$MTSearchIncludeBlogs$>" rel="tag"><$MTTagName$></a></li>
</MTEntryTags>
</ul>
</div>
</MTIfTagSearch>
<p class="entry-footer">
<span class="post-footers"><MTIfNonEmpty tag="EntryAuthorDisplayName">投稿者: <$MTEntryAuthorDisplayName$> </MTIfNonEmpty>日時: <$MTEntryDate$></span>
</p>
<MTBlogResultFooter>
</div>
</MTBlogResultFooter>
<$MTPaginateSectionBreak$>
</MTSearchResults>
</MTPaginateContent>
</MTPaginate>
<MTIgnore>
########## 検索結果がないときのメッセージ
</MTIgnore>
:
この2つのタグは、検索結果全体の最初と最後に1度しか実行されません。ページ分割処理に含めると、1ページ目の最初と最後のページの最後にしか適用されないため、削除します。
5.検索結果ヘッダと検索結果フッタを移動
4項で削除した検索結果ヘッダと検索結果フッタの内容を MTPaginateContent の外側に設定します(青色部分)。注:</MTPaginateContent> の下にもあります。
:
<MTIgnore>
########## 検索結果表示
</MTIgnore>
<MTPaginate mode="cgi">
<MTPaginateIfMultiplePages>
<div class="paginate">
<MTPaginateIfPreviousPage_>
<a href="<$MTPaginatePreviousPageLink$>" title="previous page link"><</a>
</MTPaginateIfPreviousPage_>
<$MTPaginateNavigator format_all="All Pages" place_all="after"$>
<MTPaginateIfNextPage_>
<a href="<$MTPaginateNextPageLink$>" title="next page link">></a>
</MTPaginateIfNextPage_>
</div>
</MTPaginateIfMultiplePages>
<h3 class="search-results-header">
<MTIfStraightSearch>
ブログ: <$MTBlogName$> での検索結果
</MTIfStraightSearch>
<MTIfTagSearch>
<$MTBlogName$>でタグ <$MTSearchString$> が指定されているエントリー
</MTIfTagSearch>
</h3>
<div class="search-results-container">
<MTPaginateContent max_sections="3">
<MTSearchResults>
<h3><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></h3>
<p><$MTEntryExcerpt$> <$MTEntryEditLink$></p>
<MTIfTagSearch>
<div class="entry-tags">
<h4 class="entry-tags-header">タグ:</h4>
<ul class="entry-tags-list">
<MTEntryTags>
<li class="entry-tag"><a href="<$MTTagSearchLink$>&IncludeBlogs=<$MTSearchIncludeBlogs$>" rel="tag"><$MTTagName$></a></li>
</MTEntryTags>
</ul>
</div>
</MTIfTagSearch>
<p class="entry-footer">
<span class="post-footers"><MTIfNonEmpty tag="EntryAuthorDisplayName">投稿者: <$MTEntryAuthorDisplayName$> </MTIfNonEmpty>日時: <$MTEntryDate$></span>
</p>
<$MTPaginateSectionBreak$>
</MTSearchResults>
</MTPaginateContent>
</div>
</MTPaginate>
<MTIgnore>
########## 検索結果がないときのメッセージ
</MTIgnore>
:
MTPaginateContent の外側に設定することで、検索結果ヘッダと検索結果フッタがページ分割に依存せず常に表示されるようになります。
6.検索結果ヘッダと検索結果フッタに MTSearchResults を適用
5項で設定した検索結果ヘッダと検索結果フッタを MTSearchResults で括ります。
:
<MTIgnore>
########## 検索結果表示
</MTIgnore>
<MTPaginate mode="cgi">
<MTPaginateIfMultiplePages>
<div class="paginate">
<MTPaginateIfPreviousPage_>
<a href="<$MTPaginatePreviousPageLink$>" title="previous page link"><</a>
</MTPaginateIfPreviousPage_>
<$MTPaginateNavigator format_all="All Pages" place_all="after"$>
<MTPaginateIfNextPage_>
<a href="<$MTPaginateNextPageLink$>" title="next page link">></a>
</MTPaginateIfNextPage_>
</div>
</MTPaginateIfMultiplePages>
<MTSearchResults>
<h3 class="search-results-header">
<MTIfStraightSearch>
ブログ: <$MTBlogName$> での検索結果
</MTIfStraightSearch>
<MTIfTagSearch>
<$MTBlogName$>でタグ <$MTSearchString$> が指定されているエントリー
</MTIfTagSearch>
</h3>
<div class="search-results-container">
</MTSearchResults>
<MTPaginateContent max_sections="3">
<MTSearchResults>
<h3><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></h3>
<p><$MTEntryExcerpt$> <$MTEntryEditLink$></p>
<MTIfTagSearch>
<div class="entry-tags">
<h4 class="entry-tags-header">タグ:</h4>
<ul class="entry-tags-list">
<MTEntryTags>
<li class="entry-tag"><a href="<$MTTagSearchLink$>&IncludeBlogs=<$MTSearchIncludeBlogs$>" rel="tag"><$MTTagName$></a></li>
</MTEntryTags>
</ul>
</div>
</MTIfTagSearch>
<p class="entry-footer">
<span class="post-footers"><MTIfNonEmpty tag="EntryAuthorDisplayName">投稿者: <$MTEntryAuthorDisplayName$> </MTIfNonEmpty>日時: <$MTEntryDate$></span>
</p>
<$MTPaginateSectionBreak$>
</MTSearchResults>
</MTPaginateContent>
<MTSearchResults>
</div>
</MTSearchResults>
</MTPaginate>
<MTIgnore>
########## 検索結果がないときのメッセージ
</MTIgnore>
:
MTSearchResults で括らないと、検索文字列がヒットしなかった場合や、検索文字列が設定されていない場合にも検索結果ヘッダと検索結果フッタが表示されてしまうためです。
7.検索結果ヘッダと検索結果フッタに Counter プラグインを適用
6項で設定した検索結果ヘッダと検索結果フッタを、さらに Counter プラグインのタグを追加します(青色部分)。
:
<MTIgnore>
########## 検索結果表示
</MTIgnore>
<MTPaginate mode="cgi">
<MTPaginateIfMultiplePages>
<div class="paginate">
<MTPaginateIfPreviousPage_>
<a href="<$MTPaginatePreviousPageLink$>" title="previous page link"><</a>
</MTPaginateIfPreviousPage_>
<$MTPaginateNavigator format_all="All Pages" place_all="after"$>
<MTPaginateIfNextPage_>
<a href="<$MTPaginateNextPageLink$>" title="next page link">></a>
</MTPaginateIfNextPage_>
</div>
</MTPaginateIfMultiplePages>
<MTCounter>
<MTSearchResults>
<$MTCounterPlus$>
<MTCounterIfEqual value="1">
<h3 class="search-results-header">
<MTIfStraightSearch>
ブログ: <$MTBlogName$> での検索結果
</MTIfStraightSearch>
<MTIfTagSearch>
<$MTBlogName$>でタグ <$MTSearchString$> が指定されているエントリー
</MTIfTagSearch>
</h3>
<div class="search-results-container">
</MTCounterIfEqual>
</MTSearchResults>
</MTCounter>
<MTPaginateContent max_sections="3">
<MTSearchResults>
<h3><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></h3>
<p><$MTEntryExcerpt$> <$MTEntryEditLink$></p>
<MTIfTagSearch>
<div class="entry-tags">
<h4 class="entry-tags-header">タグ:</h4>
<ul class="entry-tags-list">
<MTEntryTags>
<li class="entry-tag"><a href="<$MTTagSearchLink$>&IncludeBlogs=<$MTSearchIncludeBlogs$>" rel="tag"><$MTTagName$></a></li>
</MTEntryTags>
</ul>
</div>
</MTIfTagSearch>
<p class="entry-footer">
<span class="post-footers"><MTIfNonEmpty tag="EntryAuthorDisplayName">投稿者: <$MTEntryAuthorDisplayName$> </MTIfNonEmpty>日時: <$MTEntryDate$></span>
</p>
<$MTPaginateSectionBreak$>
</MTSearchResults>
</MTPaginateContent>
<MTCounter>
<MTSearchResults>
<$MTCounterPlus$>
<MTCounterIfEqual value="1">
</div>
</MTCounterIfEqual>
</MTSearchResults>
</MTCounter>
</MTPaginate>
<MTIgnore>
########## 検索結果がないときのメッセージ
</MTIgnore>
:
MTSearchResults はループ処理用のタグで、上記までの設定ではヒットした回数分タグの内容が繰り返して表示されるためです。
Counter プラグインについては「Counter プラグイン」を参照してインストールまで行ってください。
カウンタ系のプラグインは他にも出回ってますので、そちらを利用しても構いません。
これでページ分割の設定は完了です。
8.その他
- ナビゲーションを後方に設定した場合は下マージンが若干少ないので適宜追加してください。
- 検索で「現在検索中です。検索が終わるまでお待ちください。」というメッセージが表示されて困る方は「Movable Type の検索でエラーになる問題について」を参照願います。
*1:以前の検索結果ページは 1カラムであったため、たまたま正常に動作しているようにみえていただけかもしれません。
Movable Type でコメント投稿・トラックバックが重くなる事象を解消する
Movable Type 3.2 / 3.3 で、コメント投稿および、トラックバック送信のレスポンスが遅くなる事象が発生しています。原因は、標準プラグイン「SpamLookup」がデフォルトで参照しているサーバーのひとつ、「opm.blitzed.org」が停止したためです。
Six Apart - Movable Type サポート: コメントの投稿が急に遅くなりました
標準プラグイン「SpamLookup」がデフォルトで参照しているサーバーのひとつ、「opm.blitzed.org」が停止したため、コメントの投稿の際、非常に長い時間がかかったり、タイムアウトとなる現象が発生しています。
具体的には、コメント投稿や、他のブログから Movable Type のブログにトラックバックを送信した際、このサーバに対し、受信したコメントやトラックバックがブラックリストに含まれているかどうか問い合わせるのですが、サーバーからの応答がない(アクセスできない)ため、処理遅延が発生し、結果的にコメント・トラックバック処理が遅延します。
上記の引用記事に修正方法が掲載されていますが、当サイトでも修正手順を下記に記しておきます。
修正手順
管理画面にログインして、右側にあるメニューより「プラグイン」をクリック。

プラグイン一覧の後方にある「SpamLookup - Lookups」の右側にある「設定を表示」をクリック。
設定画面に切り替わるので、一番上の「アドレスのチェック」欄の「ブラックリスト」に記載された「opm.blitzed.org」と、その前にあるカンマを削除。

削除するとこのようになります。

削除したら、少し下にある「変更を保存」をクリック。再構築する必要はありません。

以上です。なお、
ブログごとにSpamLookupの設定を変更している場合は、上記手順での修正がそれぞれのブログに反映されません。念のため、各ブログの「設定」>>「プラグイン」から、変更が反映されているかを確認してください。 また、ブログの設定に変更が反映されていない場合には、各ブログについても上記手順での修正を行ってください。
とのことです。
HTTP/1.1 の「条件付きGET」を利用して PHP ファイルアクセスによるサーバ負荷を削減する
Movable Type 等で PHP 化や PHP モジュール化によりファイルの拡張子を .php で運用している場合の、サーバ負荷・ネットワークトラフィックを削減する方法をご紹介します。
1.問題点
HTML ファイルの拡張子を .php にしている場合、HTTP/1.1 で規定されている「条件付き GET」が行われません。ブラウザはこのようなサイトに対し無条件に GET を行ってしまうため、サーバ負荷やネットワークトラフィック増加の要因の一つになっています。
2.条件付き GET とは
「条件つき GET」は RFC2616(HTTP/1.1) 9.3 で定義されています。以下和訳を引用します。
RFC2068 9.3 GET(RFC2616は更新版)
GET メソッドは Request-URI で識別される (エンティティの形式においての)情報ならなんでも回収する事を意味する。もし Request-URI が data-producing プロセスを参照しているなら、それはリソースのエンティティとして返されるであろう作られたデータである。これはもしそのテキストがプロセスの出力で生じるのでなければ、プロセスのソーステキストではない。
もし If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Matchや If-Range ヘッダフィールドをリクエストメッセージが含んでいるなら、GET メソッドのセマンティクスは "条件付き GET" に変わる。条件付き GETメソッドはエンティティがその条件付きヘッダフィールドによって表される状況の元でのみ転送される事をリクエストする。条件付き GET メソッドはキャッシュされるエンティティに複数のリクエストを必要としたりクライアントによってすでに保持されたデータを転送する事なしに再び新しくされる事を可能にする事により、ネットワークの不必要な使用を減少する目的を持つ。
要するに、「前回アクセス以降からページの更新が行われていない場合はサーバから改めてデータを送信しない仕組みがある」というようなことが書かれています。
3.条件付き GET の振る舞い
2項の説明だけでは良く分からないので、Firefox 2.0 の Live HTTP Headers で、当サイトのトップページにアクセスした時の HTTP ヘッダを例に、具体的な動作を説明します。
3.1 条件付きGETなしの場合
GET / HTTP/1.1 Host: www.koikikukan.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: ja,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Cookie: 略 Cache-Control: max-age=0- リスト3.1.1 リクエストヘッダ(条件付きGETなし)
HTTP/1.x 200 OK Date: Sun, 14 Jan 2007 14:21:19 GMT Server: Apache/1.3.37 (Unix) X-Powered-By: PHP/4.4.4 Keep-Alive: timeout=3, max=8 Connection: Keep-Alive Transfer-Encoding: chunked Content-Type: text/html; charset=utf-8- リスト3.1.2 レスポンスヘッダ(条件付きGETなし)
条件付き GET が行われていない状態では、リクエスト・レスポンスは上記のようなヘッダになります。この状態ではアクセスする度に 200 OK を返却、つまりページが更新・未更新に関わらず、サーバは常にデータ(リクエストボディ)を返却します。
3.2 条件付きGETあり(ブラウザで初回アクセス時)
GET / HTTP/1.1 Host: www.koikikukan.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: ja,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Cookie: 略 Cache-Control: max-age=0- リスト3.2.1 リクエストヘッダ(条件付きGETあり:初回アクセス)
HTTP/1.x 200 OK Date: Sun, 14 Jan 2007 14:22:45 GMT Server: Apache/1.3.37 (Unix) Etag: "cc8929434ffafd940e5956b71a0be1f5" X-Powered-By: PHP/4.4.4 Last-Modified: Sun, 14 Jan 2007 14:22:32 GMT Keep-Alive: timeout=3, max=8 Connection: Keep-Alive Transfer-Encoding: chunked Content-Type: text/html; charset=utf-8- リスト3.2.2 レスポンスヘッダ(条件付きGETあり:初回アクセス)
条件付き GET(というか今回のカスタマイズ)が行われている場合、HTTP レスポンスに Etag / Last-Modified フィールドを付与して返却します。Etag は更新時刻などから生成されたハッシュ値、Last-Modified は更新時刻です。
リクエストを送信したブラウザはこの情報をページ単位に保持します(200 OK なのでこの時はリクエストボディも同時に返却します)。
3.3 条件付き GET あり(2回目以降のアクセス)
GET / HTTP/1.1 Host: www.koikikukan.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: ja,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Cookie: 略 If-Modified-Since: Sun, 14 Jan 2007 14:22:32 GMT If-None-Match: "cc8929434ffafd940e5956b71a0be1f5" Cache-Control: max-age=0- リスト3.3.1 リクエストヘッダ(条件付きGETあり:2回目以降)
HTTP/1.x 304 OK Date: Sun, 14 Jan 2007 14:23:07 GMT Server: Apache/1.3.37 (Unix) Etag: "cc8929434ffafd940e5956b71a0be1f5" X-Powered-By: PHP/4.4.4 Last-Modified: Sun, 14 Jan 2007 14:22:32 GMT Keep-Alive: timeout=3, max=8 Connection: Keep-Alive Content-Type: text/html; charset=utf-8- リスト3.3.2 レスポンスヘッダ(条件付きGETあり:2回目以降)
2回目以降のアクセスでは、前回アクセスしたレスポンスヘッダに含まれる Etag / Last-Modified フィールドの値を、今回のリクエストヘッダの If-Modified-Since / If-None-Match フィールドに設定して送信します。
リクエストを受信した HTTP/1.1 サーバでは、サーバ自身が保持するページ情報と比較して、ページの更新・未更新を判断します(この辺りは推測で書いてます。間違っていたらすいません)。
「304 Not Modified」はページが更新されていない時に返却するレスポンスコードです(304 にレスポンスボディは含まない仕様です)。304 レスポンスを受信したブラウザはサーバからデータをダウンロードせず、ローカルキャッシュを表示します。
つまり、PHP ファイルで「条件付き GET」を有効にし、304 Not Modified を返却できるようにすれば、結果的にサーバ・ネットワークの負荷を削減することができる、という訳です。
4.対処方法
対処方法は下記のサイトで紹介されています。当サイトでも利用させて頂きました。ありがとうございました。
Ogawa::Memoranda:「条件付きGET」のススメ
上記は Movable Type 利用で
- スタティックページ生成
- ページを PHP モジュール化
- サイドバーの部品を PHP を利用したインクルード
を前提にされています。
ダイナミックパブリッシングを利用している場合はデフォルト機能として、条件付き GET が利用できます(関連記事「Movable Type の再構築を不要にする「ダイナミック・パブリッシング」(その2:設定方法)」)。
5.その他のページについて
該当ページに含まれる外部ファイルは全て HTTP によって取得されますが、
- CSS(.css)
- JavaScript(.js)
- 画像(.jpg / .gif / .png 等)
は HTTP/1.1 サーバで 304 を返却しています。例えば CSS を修正すると、スタイルシートファイルだけが新たに読み込まれます。この仕組みのお陰で、当サイトのように外部ファイルを大量に読み込んでいるページでも、タイムラグの少ない表示ができるという訳です。
6.参考
MTEntries タグの lastn 属性と sort_order 属性(ascend)の同時指定が有効にならない件について
テンプレートに対し、一番古いエントリータイトルを取得するタグ(下記)を設定しても、最新のエントリータイトルが取得されます。
<MTEntries lastn="1" sort_order="ascend"><$MTEntryTitle$></MTEntries>
この問題は「『Ajax月送りカレンダー』でデフォルト表示を一番過去の月にしたい」というご質問で発覚しました。
とりあえずネットで類似情報がないか検索したところ、Movable Type Community Forum で下記の記事を発見。
Sort_order Ascend Not Working In 3.33?
lastn 属性は、MTEntries タグで指定された sort_order 属性をくつがえす、内部の「sort_order="descend"」を持っています。 この振舞いのため、lastn 属性が指定された場合、sort_order 属性は無視されます
と、Nov 3 2006, 07:54 PM の回答で書かれています。たしかに lib/MT/Template/ContextHandlers.pm の 1333 行にそのような実装がありました。
仕様か不具合かという話は別として、とりあえず lastn 属性が指定された場合でも sort_order 属性を有効にするためのパッチを作ってみました。
--- lib/MT/Template/ContextHandlers.pm.bak Fri Aug 4 12:31:56 2006
+++ lib/MT/Template/ContextHandlers.pm Wed Dec 27 00:47:35 2006
@@ -1330,7 +1330,7 @@
}
}
$args{'sort'} = 'created_on';
- $args{direction} = 'descend';
+ $args{direction} = $args->{sort_order} ? $args->{sort_order} : 'descend';
if (!@filters) {
if (my $last = $args->{lastn}) {
$args{limit} = $last;
が、このパッチは他の属性と競合した場合の問題等を考慮していません。ご指摘ならびに改善案をお待ち申し上げます(他力本願)。
Movable Type 3.x デフォルト・テンプレートのAtomフィードの不具合について
Movable Type のデフォルトテンプレート Atom フィード(atom.xml)に軽微な不具合があるようです。
Movable Type 3.x デフォルト・テンプレートのAtomフィードの不具合について
Movable Type 3.0以降にデフォルト・テンプレートとして含まれている、atom.xmlを生成するテンプレートをそのまま利用していると、2007年に入ってから再構築したときに内容が変わってしまい、ブログの購読者(あなたのブログのAtomフィードを購読している読者)の側で、未読ではない記事が未読として表示されてしまうなどの軽微な問題が起こる可能性があります。
この不具合を解消するためには、リスト1(atom.xml より抜粋)の赤色部分を、リスト2の青色に変更します。
<id>tag:<$MTBlogHost exclude_port="1" encode_xml="1"$>,<$MTDate format="%Y"$>:<$MTBlogRelativeURL encode_xml="1"$>/<$MTBlogID$></id>- リスト1 atom.xml 修正前
<id>tag:<$MTBlogHost exclude_port="1" encode_xml="1"$>,2006:<$MTBlogRelativeURL encode_xml="1"$>/<$MTBlogID$></id>- リスト2 atom.xml 修正後
修正は年内に行ないましょう。
なお 2007年以降に Movable Type を使い始めてこの記事に辿り着いた方は、"2006" の代わりに開始年("2007" とか)を記述するか、リスト3の内容に変更すると良いでしょう。
<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>- リスト3 atom.xml 修正後(2007年以降に使用開始した場合)
参考:drry+@->:Movable Type のデフォルト Atom フィードテンプレートを駄目出し
なお、当サイトでは FeedBurner を利用している(=atom.xml は未使用)ので、この修正は行っておりません。
Movable Type 3.3 で TypeKey サイン・イン時の JavaScript エラーを解消する
Movable Type 3.3 のエントリー・アーカイブ/コメント・プレビューで「TypeKey サイン・インをすると JavaScript エラーが発生します」という質問を頂きました。 |
1.問題の詳細
2.原因
TypeKey サイン・イン後、フォームの投稿者情報にある
この情報を登録しますか?
のチェックボックスのチェック状態をクッキー情報を元に自動的に設定するのですが、クッキー読み出し処理に不具合がありました。
3.対処方法
このエラーを解消するには、インデックステンプレート
Site JavaScript(mt-site.js)
の編集画面を開き、下記の青色部分を追加して再構築します。
:
</MTElse>
</MTIfRegistrationRequired>
</MTIfRegistrationAllowed>
var mtcmthome;
var mtcmtauth;
if (document.comments_form) {
if (!commenter_name && (document.comments_form.email != undefined) &&
(mtcmtmail = getCookie("mtcmtmail")))
document.comments_form.email.value = mtcmtmail;
if (!commenter_name && (document.comments_form.author != undefined) &&
(mtcmtauth = getCookie("mtcmtauth")))
document.comments_form.author.value = mtcmtauth;
if (document.comments_form.url != undefined &&
(mtcmthome = getCookie("mtcmthome")))
document.comments_form.url.value = mtcmthome;
if (document.comments_form["bakecookie"]) {
if (mtcmtauth || mtcmthome) {
document.comments_form.bakecookie.checked = true;
} else {
document.comments_form.bakecookie.checked = false;
}
}
}
}
:
以上です。
Six Apart にもフィードバックしておきました。
カテゴリーリストで MTArchiveListHeader と MTArchiveListFooter が正常に動作しない問題
昨日の「JavaScript 不要なサイドメニューのツリー化 for Movable Type」で掲載を見送った、カテゴリーリスト(一括表示)の問題について報告します。
現状(3.31-ja)用意されているMTタグより、ツリー化表示を実現するためのカテゴリーリスト(一括表示)については
<ul class="tree">
<MTArchiveList archive_type="Category">
<li class="tree<MTArchiveListFooter>_end</MTArchiveListFooter>"><a href="<$MTArchiveLink$>"><$MTArchiveTitle$></a> [<$MTArchiveCount$>]</li>
</MTArchiveList>
</ul>
という風に、MTArchiveList、MTArchiveListFooter 等を使用するのが適切と考えます。理由は、MTCategories のタグセットにはリストの最後を示す MTCategoryFooter が用意されていないためです。
上記のタグ構成は月別アーカイブリスト、
<ul class="tree">
<MTArchiveList archive_type="Monthly">
<li class="tree<MTArchiveListFooter>_end</MTArchiveListFooter>"><a href="<$MTArchiveLink$>"><$MTArchiveTitle$></a> [<$MTArchiveCount$>]</li>
</MTArchiveList>
</ul>
とほぼ同じで、異なるのは赤色の archive_type 属性名のみです。
さて、上記の月別アーカイブリストのMTタグを再構築すると、生成されるHTMLは
<ul class="tree">
<li class="tree"><a href="http://hogehoge/2006/08/">2006年08月</a> [1]</li>
<li class="tree"><a href="http://hogehoge/2006/02/">2006年02月</a> [1]</li>
<li class="tree"><a href="http://hogehoge/2006/01/">2006年01月</a> [1]</li>
<li class="tree_end"><a href="http://hogehoge/2005/12/">2005年12月</a> [1]</li>
</ul>
と、正常に最後の li タグの class 属性のみに "tree_end" が設定されるのですが、カテゴリーリストを再構築すると、
<ul class="tree">
<li class="tree_end"><a href="http://hogehoge/cat1/">test1</a> [1]</li>
<li class="tree_end"><a href="http://hogehoge/cat2/">test2</a> [1]</li>
<li class="tree_end"><a href="http://hogehoge/cat3/">test3</a> [1]</li>
<li class="tree_end"><a href="http://hogehoge/cat4/">test4</a> [1]</li>
</ul>
と、ご覧の通り、全ての li 要素の class 属性名に "tree_end" が設定されたHTMLが生成されます。つまり、MTArchiveListFooter が期待する動作になりません。3.2 でも実施してみましたが同様の結果でした。
該当部分のソースコードを見たところ、カテゴリーリストの場合のみ MTArchiveList の処理から MTCategories の処理に移し変えているのが原因と思われます。MTCategories の処理に MTArchive? というタグを処理するコードが存在しないためです。
したがってタイトルの通り、MTArchiveListHeader も同様に機能しません(制限事項として挙げられていたらすいません)。
ということで、一括表示のカテゴリーリストについては JavaScript を用いたツリー表示が必要となります。
Movable Type 3.2 と 3.31 におけるサブカテゴリーリストの表示の違いについて
3.31-ja でサブカテゴリーリストの動作を確認している途中、3.2-ja-2 と比較して下記の違いを発見しましたので、ご報告まで。
まず、次のような構造のカテゴリーがあると仮定します。
趣味
└ パソコン
├ mixi
└ ブログ
このカテゴリーを、公開テンプレートで利用しているサブカテゴリーリストのMTタグ
<MTSubCategories>
<MTSubCatIsFirst><ul></MTSubCatIsFirst>
<MTIfNonZero tag="MTCategoryCount">
<li><a href="<$MTCategoryArchiveLink$>" title="<$MTCategoryDescription$>"><MTCategoryLabel></a> [<$MTCategoryCount$>]
<MTElse>
<li><MTCategoryLabel>
</MTElse>
</MTIfNonZero>
<MTSubCatsRecurse max_depth="3">
</li>
<MTSubCatIsLast></ul></MTSubCatIsLast>
</MTSubCategories>
を使用して、トップページおよびカテゴリー・アーカイブでの表示を 3.2 と 3.31 で比較してみます。
まず 3.2-ja-2 のサブカテゴリーリストとして表示した結果です。
トップページ:全カテゴリーが表示される |
「趣味」カテゴリー・アーカイブ:サブカテゴリーの「パソコン」カテゴリー以下を表示 |
「パソコン」カテゴリー・アーカイブ:サブカテゴリーの「mixi」「ブログ」カテゴリーを表示 |
「ブログ」または「mixi」カテゴリー・アーカイブ:表示なし |
次に全く同じタグを使用して、3.31-ja のサブカテゴリーリストとして表示した結果です。
トップページ:全カテゴリーが表示される |
「趣味」カテゴリー・アーカイブ:サブカテゴリーの「パソコン」カテゴリー以下を表示 |
「パソコン」カテゴリー・アーカイブ:サブカテゴリーの「mixi」「ブログ」カテゴリーを表示 |
「ブログ」または「mixi」カテゴリー・アーカイブ:全カテゴリーが表示される |
青色と赤色で示した文言からお分かりの通り、3.31-ja では最下層のサブカテゴリーで全カテゴリーが表示されます。
とりあえずシックス・アパートのフィードバックには報告させて頂きました。
3.31-ja で 3.2-ja-2 と同様の表示、つまり最下層のカテゴリー・アーカイブでサブカテゴリーリストを非表示にするためには、
lib/MT/Template/ContextHandlers.pm
に対して下記のパッチをあてると良いでしょう。
--- lib/MT/Template/ContextHandlers.pm.bak Thu Aug 17 01:54:30 2006
+++ lib/MT/Template/ContextHandlers.pm Thu Aug 17 01:55:33 2006
@@ -3937,7 +3937,7 @@
}
}
}
- if (!@cats) {
+ if (!@cats && ($ctx->{current_archive_type} ne 'Category')) {
# Otherwise, use the top level categories
@cats = MT::Category->top_level_categories($ctx->stash('blog_id'));
}
他に適切な対処があるようでしたらお許しください。
Movable Type 3.3 の再構築で「<MTTagName>タグが閉じられていません」になる問題の対処(改)
Movable Type 3.31 にアップグレードして、再構築した時に下記のエラーが発生するケースがあります。
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 を利用して再構築を実施した場合は、
というエラーが発生しますので注意が必要です。
ということで、2項の「対処方法1」を推奨します。
*1:色覚障害等で色が識別できない場合は、サイト右上の「Styles」メニューにある Gray Scale をクリックしてください。IEではグレースケール表示され、青色部分が下線表示、赤色部分が二重下線で表示されます。Firefox/Opera ではカラー表示のままですが下線表示に切り替わります。なお設定の都合上、リンクとテキスト表示が判断できなくなりますので予めご容赦ください。
Movable Type の検索でエラーになる問題について
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秒以内に再検索されたらエラーにする)を設定しています。
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 ではカラー表示のままですが下線表示に切り替わります。なお設定の都合上、リンクとテキスト表示が判断できなくなりますので予めご容赦ください。
コメント・プレビューで実体参照が無効になる不具合を解消する
Movable Type のエントリー・アーカイブでコメントを書き、「確認」をクリックしてコメント・プレビュー画面に遷移すると、コメントに書いた実体参照、例えば
<$MTBlogURL$>
が
<$MTBlogURL$>
という風に、「<」や「>」が通常のタグとして表示されてしまいます。
この不具合を解消するには、コメント・プレビューテンプレートのテキストエリア表示部分に用いられている 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 の処理のままです)。
Movable Type 3.3 アップグレードによる月別アーカイブ・日別アーカイブの不具合
一昨日公開した 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 へのアップグレードに伴って月別・日別アーカイブが正常に生成されない場合は上記の修正を行ってください。この不具合に関して、コメント・トラックバック等で情報頂ければ幸いです(製品の仕様であれば記事を訂正します)。
コメント投稿で「エントリーIDが見つかりません」と表示される不具合について
Movable Type のエントリー・アーカイブからのコメント確認およびコメント投稿で、下記のような「エントリーIDが見つかりません」というエラーが表示されるケースがあります。
この問題は、mt-config.cgi の CGIPathと、管理画面で設定する「サイトURL」のドメインが異なっている場合にこの現象が発生する可能性があり、XREAでの運用で独自ドメインを取得した後、「サイトURL」だけに独自ドメインを設定をしたケースが該当します。
この場合、CGIPath はXREAドメインのままです。この状態でコメント投稿を実行すると、コメント投稿用CGI mt-comments.cgi のURLには CGIPath、つまりXREAドメインが使用され、その後XREAドメインから独自ドメインへのリダイレクトが発生します。このリダイレクトで mt-comments.cgi の query として付与されたエントリーIDが欠落してしまい、実際に Movable Type で処理される時には「エントリーIDが見つからない」という状態になってしまうようです(後述の参考サイトより一部引用)。
「エントリーIDが見つかりません」で google 検索しても情報は少ないようですが、バージョン 3.2 以前は「No entry_id」というエラーが表示されており、下記のサイトに情報がありました。
- Movable Type 4989:MovableType 3.2 日本語版 StyleCatcher plugin のインストール方法のコメント欄
- XREA SUPPORT BOARD:Movable Typeの設置についての質問
- MovableType設定変更履歴:XREAで後から独自ドメインにする場合の注意
実は、昨日エントリーした検索結果画面で検索文字列が文字化けする不具合を解消すると全く同じ原因で、CGIPath のドメインを、サイトURLのドメイン、つまり取得した独自ドメインと一致させることで解消します。
具体的には、mt-config.cgi の CGIPath に記述しているURLのドメインを、管理メニューの「設定」→「公開」→「サイトURL」に記述されているドメインに修正します。ただし mt.cgi と index.html が異なるディレクトリの場合、mt.cgi までのパスをドメインの後ろに設定する必要がありますのでご注意ください。
修正が完了したら mt-config.cgi を元のディレクトリにアップロードし、エントリー・アーカイブを再構築してください。再構築しないとエントリー・アーカイブに記述されているコメント投稿用CGI mt-comments.cgi のURL が新しい URL に書き変わりません。
余談ですが、検索結果画面で検索文字列が文字化けする不具合を解消するで質問を頂いた当初、原因が全く分からず、情報に至りそうな検索文字列を片っ端から google に打ち込んでも1件もヒットしませんでした(笑)。
そんな訳で半ば諦めていたのですが、ふとその方のサイトでコメントを投稿(確認)してみると「エントリーIDが見つかりません」というエラーが発生しました。それをきっかけに上記の情報にたどり着き、検索実行用URL(これも CGIPath を使用しています)のドメインを独自ドメインに書き換えて実行したところ正常に表示され、無事解決に至ったという訳です。
つまり、本エントリーの不具合を解消することで検索結果画面の不具合も解消してしまうため、検索結果画面の問題がネットで話題にあがることがなかったのではないかと推測します。
2006.07.01 追記
mt-config.cgi 修正後のエントリー・アーカイブの再構築について追記しました。
検索結果画面で検索文字列が文字化けする不具合を解消する
Movable Type で「検索フォームに日本語を入力して検索すると、入力した文字が文字化けして表示される」というご質問を頂きました。確認したところ、例えば「コンピュータ」という文字列を入力すると、検索結果画面はスクリーンショットのような表示になりました(画像をクリックすると拡大表示します)。
お分かりの通り、入力した検索文字列がURLエンコードされたままの状態で処理・表示されてしまうため、エントリーに含まれる検索文字列であっても正常に検索することができず、「ページはみつかりません」という結果になってしまいます。
この問題は CGIPath のドメインを、サイトURLのドメインと一致させることで解消するようです。具体的には、mt-config.cgi の CGIPath に記述しているURLのドメインを、管理メニューの「設定」→「公開」→サイトURLに記述されているドメインに修正します。ただし mt.cgi と index.html が異なるディレクトリの場合、mt.cgi までのパスをドメインの後ろに設定する必要がありますのでご注意ください。
なお試験サイトで CGIPath とサイトURLで異なるドメインを設定してみましたが、正常に動作しました。したがって、CGIPath のドメインからサイトURLのドメインへリダイレクトを設定しているような条件の下でのみ、この問題が発生する(可能性がある)のではないかと考えます。
エントリー・アーカイブファイル名の不具合を解消する
Movable Type 日本語版でのエントリー・アーカイブファイル名はデフォルトの状態で entry_basename というものが使われます。これはタイトルの先頭からファイル名(最大30文字)を生成し、エントリータイトルに半角が使用されていればそのまま反映されますが、すべて日本語の場合は、post.html、post_1.html、post_2.html …という具合にファイル名が生成されます。
この entry_basename は、ファイル名長以外を制御することができないため、どのようなファイル名になるかはシステム依存となります。簡単な動作確認をした限りでは一度公開したエントリーを削除して、その後の新エントリーには削除したファイル名が付与されました(エントリータイトルが全て日本語の場合)。また数名の方から、異なるエントリーに同一ファイル名が付与されるという不具合に関する質問も頂いています(原因不明)。
さらにバックアップからエントリーを復旧する場合、ファイル名はバックアップから取得しません。つまりエントリー投稿時と同様のロジックでファイル名を生成する訳なので、バックアップ前と同一のファイル名が付与されない可能性もあります。
つまり、エントリー・アーカイブファイル名には entry_basename を利用せず、タイムスタンプ等のエントリー固有の値を利用することを推奨します。
下記にエントリー投稿時間をエントリーファイル名に使用する設定をご紹介します。
- 管理画面の「設定」→「公開」をクリック
- ページ下方にある「アーカイブ・マッピング」の項目の「エントリー・アーカイブ」の「出力フォーマット」のプルダウンメニューから一番下の「カスタマイズする」を選択
- 入力フィールドに下記を入力
%y/%m/%d%h%n%s%x
- 保存して再構築
データフォーマットは下記の対応になっています。途中の "/" はディレクトリです。
- %y:年
- %m:月
- %d:日
- %h:時
- %n:分
- %s:秒
- %x:拡張子(「設定」→「公開」→「アーカイブの拡張子」で設定したもの)
拡張子を個別に設定する場合は最後の拡張子 %x を .php 等に書き換えてください。
2006.05.15 追記
拡張子の表記を修正し、データフォーマットを追記しました。
コメント・プレビューの JavaScript エラーを解消する
デフォルトテンプレートのコメント・プレビュー画面ではJavaScript エラーが発生します。ご質問を頂きましたのでこれを解消する方法をご紹介します。
根本的な問題はデフォルトテンプレートのコメント・プレビューに「情報を保存する?」のチェックボックスが存在しないことです。ここではチェックボックスを追加せずにエラーを解消する方法と、チェックボックス自体を追加してエラーを解消する2つの方法を記します。3項はいずれの場合も実施してください。
1.「情報を保存する?」をコメント・プレビューに追加しない
現状のフォームのままでエラーのみ解消したい場合は、下記の 1.1 および 1.2 を実施してください。
1.1 インデックステンプレート・JavaScript の修正
デフォルトテンプレートのコメント・プレビュー画面を開いた時、IEの場合はステータスバーに「ページでエラーが発生しました」というメッセージが表示され、左下のアイコンをクリックすると
'document.comments_form.bakecookie'は Null またはオブジェクトではありません
Firefox の場合は[ツール]-[JavaScriptコンソール]を開くと
document.comments_form.bakecookie has no properties
という JavaScript エラーが発生します。
これはコメントプレビューのHTMLに「情報を保存する?」というチェックボックスが存在しないにもかかわらず、mt-site.js で document.comments_form.bakecookie を処理しようとするためです。
これを解消するためには、インデックステンプレートの「JavaScript(mt-site.js)」に下記の青色部分を追加します(計2行ありますのでご注意ください)。
function individualArchivesOnLoad(commenter_name) {
:
(中略)
:
if (document.comments_form) {
if (document.comments_form.email != undefined &&
(mtcmtmail = getCookie("mtcmtmail")))
document.comments_form.email.value = mtcmtmail;
if (document.comments_form.author != undefined &&
(mtcmtauth = getCookie("mtcmtauth")))
document.comments_form.author.value = mtcmtauth;
if (document.comments_form.url != undefined &&
(mtcmthome = getCookie("mtcmthome")))
document.comments_form.url.value = mtcmthome;
if (document.comments_form.bakecookie) {
if (mtcmtauth || mtcmthome) {
document.comments_form.bakecookie.checked = true;
} else {
document.comments_form.bakecookie.checked = false;
}
}
}
}
1.2 コメント・プレビューテンプレートの修正
これはコメントプレビュー画面から投稿した時に発生する JavaScript エラーです。IEでは分かりませんが、Firefox の JavaScript コンソールでは
this.bakecookie has no properties
というエラーが表示されます。これは投稿時に form 要素に記述された onsubmit 属性で this.bakecookie.checked という判定が実行されるためです。
これを解消するためには、コメントプレビューテンプレートの下記の赤色部分を削除します。
<form method="post" action="<$MTCGIPath$><$MTCommentScript$>" name="comments_form" onsubmit="if (this.bakecookie.checked) rememberMe(this)">
2.「情報を保存する?」をコメント・プレビューに追加する
コメント・プレビューテンプレートに、エントリー・アーカイブにあるチェックボックス(青色)を、下記のようにURLの下に
:
<p>
<label for="comment-url">URL: </label>
<input id="comment-url" name="url" size="30" value="<$MTCommentPreviewURL$>" />
</p>
<p>
<label for="comment-bake-cookie"><input type="checkbox"
id="comment-bake-cookie" name="bakecookie" onclick="if (!this.checked) forgetMe(document.comments_form)" value="1" />
この情報を登録しますか?</label>
</p>
:
となるように追加してください。エラーは発生しなくなりますが本来の動作は未確認ですのでご容赦ください。
3.コメント・プレビューテンプレートの修正(commenter_name.js の削除)
コメント・プレビューテンプレートのヘッダ部分に記述されている
<script type="text/javascript" src="<MTStaticWebPath>js/commenter_name.js"></script>
は不要ですので削除してください。
この行に記述されている commenter_name.js というファイルは、英語版の初期β版にはインストールパッケージに含まれていましたが、それ以降は含まれていません、つまりファイル自体が存在しません。
なおβ版で存在していた commenter_name.js の内容は、現在 mt-site.js に包含されています。
この行が残っていると、コメント・プレビュー画面で JavaScript エラーが発生する可能性があります。
「可能性がある」というのは、該当のファイルに本当にアクセスできない場合はエラーは発生しませんが、レンタルサーバで404エラーのファイルにリダイレクトする設定になっていると、表示されたHTMLファイルを不正な JavaScript として評価してしまい、IEでは
構文エラーです。
というエラーが表示されます。
2006.05.06 追記
3項を追加しました。
Movable Type で再構築エラーになる場合の原因と対処
Movable Type 3.2-ja-2 で再構築エラーに関する質問を頂くことが多いので、本エントリーにまとめました。
1.エラー現象
「再構築エラー」とは、主に下記の現象を指します。- 500エラーが表示される
- テンプレート内で MTLink タグを使用していると、そこでエラーとなる(場合がある)
いわゆる「500エラー」とは、 Internal Server Error つまり内部サーバエラーのことで、CGI等のプログラムが何らかの理由で実行できない、あるいはプログラムにエラーがある場合に発生します。
MTLink タグのエラーも500エラーと同様で、MTLink タグのエラーに見えるのは、たまたまそこでエラーメッセージを表示できる実装になっているからではないかと推測しています。
2.再構築エラーの原因
Movable Type で再構築エラーが発生する原因としては、これまで頂いたご質問を集計すると、- Movable Type の DB に BerkeleyDB を使用
→ BerkeleyDB はお手軽ですがパフォーマンスに難があります - エントリー・アーカイブの再構築単位
→ デフォルトの再構築単位は40(エントリー)ですが、この値では再構築エラーになる確率が高いです - エントリー・アーカイブの「最近のコメント」で recently_commented_on を利用している
→ lastn 属性を使用しない recently_commented_on 属性の使用はメモリ消費量が増大します
によるものがほとんどのようです。
そしてこれらを誘発する原因として下記が考えられます。
- サーバのパフォーマンス
- サーバのメモリ量
よくある例として、複数名で共有しているレンタルサーバが考えられます。このケースでは CPU やメモリ等の事実上のスペックは、マシンを占有する人数や使用頻度に反比例して低下していきます。故に再構築の成功率も同時に低下することになります。
また上記の要因が複合すれば再構築エラーが発生する確率はさらに高くなります。
3.エラー解消方法
とりあえず目前のエラーを回避する方法と、本格的な対処の2通りを紹介します。3.1 とりあえず回避する
- デフォルトテンプレートに戻す
デフォルトテンプレートの状態であれば再構築時のエラーはほぼ皆無という認識です。理由は次の内容をご覧ください。 - エントリー・アーカイブのサイドバーを削除してみる
例えば、当サイトの公開テンプレートとデフォルトテンプレートとの大きな違いは、アーカイブページのサイドバーの有無です。公開テンプレートのアーカイブ・テンプレートにはサイドバーにリスト類(カレンダー・最近のエントリー/コメント/トラックバック・カテゴリーリスト・月別アーカイブリスト)を色々と表示しており、その分、MTタグからHTMLマークアップを生成する時間が増加し、結果的に再構築時間に影響を与えることになります。つまりサイドバーにリスト類を表示している場合、それらを全てなくすことで再構築時間を短縮することができます。
なお、再構築エラーは前述の通り複合的な要因で発生します。公開テンプレートでアーカイブテンプレートのサイドバーに情報を表示すること自体についてはテンプレートのバグではありません。その点誤解なきようお願い致します。
3.2 本格的な対処
対処しやすい順番に並べています。- 再構築単位を少なくする
mt-config.cgi の下記の部分を
から# EntriesPerRebuild 40
に書き換えます。10でもエラーになる場合は値をさらに小さくしてください。かなりの方がこれで解消されています。EntriesPerRebuild 10
3.3 では mt-config.cgi にこの設定自体がなくなっていますので新たに追加してください。
- rebuild支援ツールを利用する
再構築を部分的に行うためのツールです(プラグインではありません)。
rebuild支援ツール for MovableType
- DB を MySQL または SQLite または PostgreSQL に移行する
パフォーマンスに問題のある BerkeleyDB の使用をおやめになることを強く推奨します。SQLite の移行方法については、Movable Type + SQLite を参照ください。
MySQL自体の性能は高いのですが、ひとつのDBを多くのユーザでシェアしている場合は解消されないかもしれません。心配な場合はレンタルサーバのサポートに確認してください(自宅サーバ+MySQLはかなり快適です)。PostgreSQL については MySQL と同等とお考えください。
ロリポップの場合は SQLite への移行をお勧めします。
- PHPモジュール化を行う
サイドバーのリスト類をモジュール化(部品化)することで再構築時のパフォーマンスが向上します。ただし、ページ閲覧時に PHP が起動するため、アクセスの多いサイトでの CGI版 PHP の利用は 503 エラーを誘発する可能性があります。PHP モジュール化を行う場合は「条件付きGET」を有効にしてください。関連記事:
Movable Type の PHP化(その1)
PHPモジュール化の仕組みについて
HTTP/1.1 の「条件付きGET」を利用して PHP ファイルアクセスによるサーバ負荷を削減する
PHP における「モジュール版」と「CGI 版」の比較 + WordPress の適用例
- ダイナミックパブリッシングにする
ページを毎回動的に生成する方法です。静的なファイルを作らないため再構築時間が劇的に縮小します。関連記事:
Movable Type の再構築を不要にする「ダイナミック・パブリッシング」(その1:概要)
Movable Type の再構築を不要にする「ダイナミック・パブリッシング」(その2:設定方法)
- サーバを変更する
レンタルサーバもピンキリで、最終的にはサーバや DB のパフォーマンスに依存します。何をやっても事象が好転しない場合はこれをお勧めします。
2006.04.28 追記
rebuild支援ツールとダイナミックパブリッシングを追加しました。
2006.06.20 追記
文言等修正。
Movable Type で1日午前0時のエントリーがカレンダーに反映されない不具合について
「1日のエントリーがカレンダーに反映されませんというご質問を頂いて」調べたところ、エントリーの投稿日を1日の00時00分00秒で保存した場合、カレンダーに該当エントリーのリンクが反映されないことが判明しました。月末の23時59分59秒についても同様のようです。
コードを調査したところ、カレンダーの生成を行っているのは
- lib/MT/Template/ContextHandlers.pm
にある _hdlr_calendar で、1ヶ月分のエントリーを取得する処理で該当の投稿日のエントリーだけ除外されてしまうのが原因です。これについては Movable Tyep 3.0 から発生していた現象のようです。
この不具合を解消するには、1日の投稿日に00時00分00秒、月末の投稿日に23時59分59秒を用いないか、下記のパッチをあててください。
--- lib\MT\Template\ContextHandlers.pm.bak Tue Oct 11 16:47:22 2005
+++ lib\MT\Template\ContextHandlers.pm Tue Apr 04 09:40:46 2006
@@ -2459,7 +2459,7 @@
my $iter = MT::Entry->load_iter({ blog_id => $blog_id,
created_on => [ $start, $end ],
status => MT::Entry::RELEASE() },
- { range => { created_on => 1 },
+ { range_incl => { created_on => 1 },
'sort' => 'created_on',
direction => 'ascend', });
my @left;
上記のパッチは安直な発想ですので、適正な修正方法がございましたら情報お待ち申し上げます。Ogawa::memoranda さんのご指摘を頂きましたのでパッチを差し替えました。ありがとうございました。
「最近のコメント」が表示されない不具合について
最近、公開テンプレートをご利用くださっている方から「『最近のコメント』が表示されません」というコメントを何件か頂きました。どうやら MTEntries タグに recently_commented_on 属性を付与しているとダメみたいです。
ネットで色々と調べたところ、MySQL のシステム権限付与が影響している(らしい)ことが判明しました。MuySQLのユーザが一時テーブルを作成する権限を持っていない場合に起こる不具合のようです。
以下、phpMyAdmin を利用した権限の変更方法を記しておきます(権限を変更するには root でログインすることが条件です)。変更できない場合はエントリーの最後をご覧ください。
|
|
|
|
|
|
|
|
なお自サイトでMySQLの特権を外して試してみたのですが同様の事象は発生しませんでした。上記の手順については参考程度という位置づけでお願い致します。
この問題についての参考サイトは下記です。ありがとうございました(下記のサイトにはコマンドラインからの実行方法も掲載されています)。
- News from E-Bay:最新のコメントが表示されない
- つれづれなるままに・・・・:また出直しだ/サイドバーに最近のコメント表示
- 日常シンクロ blog:過去のコメントリスト表示できました
- BananaBlog:Weblog改造日記その4? 文字コードとデータベース
レンタルサーバ等で権限の修正が不可能な場合は、下記のエントリーで紹介しているプラグインを利用すれば「最近のコメント」と同等以上の機能を実現できますので、そちらをご利用ください。2つめは(多分)本問題に対する実績ありです。
コメント投稿時のPerlエラーを解消する
私のウェブログは自宅サーバで運用しています。OSは Windows XP です。
で、当初はそれほどでもなかった(というか皆無)Perlのエラーダイアログが、3.11にアップグレードした辺りから画面に5?10枚/日ほど表示されるようになりました。どうもコメント投稿等やエントリー投稿が引き金になっているようです。自分のPCでコメントを投稿しても発生します。またコメント投稿等も正常終了しない(応答が返ってこない)ことがしばしばありました。そのまま放っておくとコメントが二重投稿されてしまうケースもあるようで投稿された方には大変ご迷惑をおかけ致しました。
時間が経過してもいっこうに回復する気配もない(というか待ってて直るはずもない)ので、さすがに困りました。サイトを検索してもそれらしき情報がみつかりません。Perlのバージョンを入れ替えようか、または Movable Type を新規インストールにしようかと策を講じておりました。
が、しつこくサイトを検索していたところようやく下記の記事にたどり着きました。
対処は mt.cfg に下記の1行を追加するというものです。
LaunchBackgroundTasks 0
記事と私の事象は微妙に異なるようですが、「WindowsのPerlでは対応していない機能がある」という文言になんとなくピンときて(笑)、この設定を行ってみることにしました。デフォルトの mt.cfg ではこの値に関する記述はありませんので(追記:記述がないのは 3.0D の mt.cfg です)ファイルの一番下にちょろっと追加。ちなみにこのオプションについては
の下から6番目に説明があります。下記は該当部分の抜粋です。
LaunchBackgroundTasks
タスクの中には、デフォルトで、バックグラウンドで実行されているものもあります。 この仕組みによって、Movable Typeがたとえば再構築など重要なタスクを実行している間、ユーザーや別のソフトウエアはアプリケーションを継続して使うことができます。 ただしこの機能はホスティング環境によっては機能しないこともあります。 効果のない機能がある場合は、LaunchBackgroundTasks 0 を設定してみてください。
具体的な原因は「(Movable Typeが使用する)PerlIS.DLL がfork関数に対応していない(実装されていない)ためにエラーが発生する」ということらしいです。forkというのは簡単に申しますと、いくつかのプログラムを同時に走らせるためのもので、同時に走らせることで処理を早く終わらせられます。ちなみにforkを行っているのは
- lib/MT/Util.pm
の1000行目辺りにある、下記関数の青字部分1ヶ所だけです。
sub start_background_task {
my ($func) = @_;
if (!launch_background_tasks()) { $func->() }
else {
$| = 1; # Flush open filehandles
my $pid = fork();
if (!$pid) {
# child
close STDIN; open STDIN, "</dev/null";
close STDOUT; open STDOUT, ">/dev/null";
MT::Object->driver->init();
$func->();
CORE::exit(0) if defined($pid) && !$pid;
} else {
MT::Object->driver->init();
}
}
}
この対処を実施してからすでに1週間以上経つのですが、エラーは発生しなくなりました。コメントも(やや時間がかかりますが)正常終了します。その代償として新規エントリーの投稿にえらく時間がかかりようになりました(笑)。おそらく並列処理をやめて直列で処理を行っている分、時間がプラスされたのでしょう。コメント投稿も完了するまでに数十秒ほどかかるようです。申し訳ございませんが気長にお待ちになってやってください。
追記:本事象は3.0Dからのアップグレードによるものでした。動作が変化した原因につきましては(o)さんから頂いたコメントを参照ください。
フレーム利用時に表示がずれる不具合を解消する
対処としてはウェブログを表示する frame タグに scrolling 属性(青色部分)を付与すると解消します。この属性を付与することで解消するということはフレームにした場合、レンダリングでスクロールバーの存在を適正に認識できていないことが原因と考えられます。
<frame src="http://~/" scrolling="yes">
scrolling 属性には
- yes:常に表示
- no:常に非表示
- auto:自動
の3種類があります。「no」は対象外として、正常にレンダリングされるのは「yes」のみです。「auto」はデフォルト値のため、記述しても設定しない場合と同じ効果しか得られません。なお「yes」に設定するためスクロールが不要な場合もスクロールバーエリアが表示されます。予めご容赦ください。
.htaccessによる文字化け対策
TypeKey認証やコメント投稿の後で文字化けが発生するという質問を最近何件か頂いています。TypeKeyの文字化けについてはHTTPリダイレクトを伴っており、ページ直前のHTTPレスポンスで返却されたcharsetを見てしまうのが文字化けの要因と思われます(発生するサイトとしないサイトの違いは不明です)。下記のサイトに解説があります。
ただしコメント投稿後の文字化けは原因不明(リダイレクトではないという認識)です。
上記のサイトにも少し書かれていますが、リダイレクトによる文字化け解消について .htaccess を利用する方法がありましたのでご紹介します。
1..htaccess ファイル作成
まず .htaccess というファイルをテキストエディタ等で新たに作成し(既に存在する場合はその中)、そこに下記のいずれかの青字部分を記述します(とりあえず上の方をお試しください)。記述例は文字コードが UTF-8 でファイルの拡張子が .html の場合です。
明示的に文字セットを指定していない応答に追加されるデフォルトの文字セット
AddDefaultCharset UTF-8
ファイル名の拡張子を指定されたコンテントタイプにマップ
AddType "text/html; charset=UTF-8" .html
上の設定はHTTPヘッダで charset が設定されていない時に文字コードを指定するものです。
下の設定は拡張子に対応するコンテントタイプ(MIMEタイプ)の設定が目的です。phpファイルも対象に含む場合は
AddType "text/html; charset=UTF-8" .html .php
としてください(拡張子の間は半角空白、拡張子のピリオドはなくてもいいようです)。
記述した行の最後は改行してください。文字コードの部分は「EUC-JP」「Shift_JIS」等、使用されている文字コードに適宜修正ください。
技術的な話をすると、上記はいずれも Apache ディレクティブですのでHTTPサーバに Apache が使われていることが前提になります(多分この文章は無視されても大丈夫だと思います…)。
2.ファイル配置
.htaccess を配置(アップロード)します。このファイルの内容は、ファイルを配置したディレクトリおよびそのサブディレクトリ全てに適用されますので(サイトのトップディレクトリにあると思われる)index.htmlが配置されているディレクトリに配置します。
以上です。なお上記の対策は動作を確認できてないこともあり、完全な不具合解消を保証するものではありませんので予めご了承ください。また本設定がコメント投稿後のページ表示にも適用されればいいのですが(CGIからの出力は一旦HTTPアクセスが行われると思っているので適用されそう?)、そうでなければカスタマイズされたページのどこかに文字化けの要因が潜んでいると考えられます(感覚的にはHTMLタグの文法エラー等ですが改善性については未知です)ので、申し訳ございませんが「デフォルトのテンプレートから少しずつカスタマイズして動作をチェックしてみてください」という原始的なアドバイスしかできません。併せてご了承願います。
↑一応動作確認できているサイトあります。なお文字化けの原因は「続きを読む」を折りたたむスクリプトにあるようでした。ご利用中の方にはご迷惑おかけして大変申し訳ございません。とり急ぎお詫びまで。


Movable Type 3.3 のエントリー・アーカイブ/コメント・プレビューで「TypeKey サイン・インをすると JavaScript エラーが発生します」という質問を頂きました。
トップページ:全カテゴリーが表示される
「趣味」カテゴリー・アーカイブ:サブカテゴリーの「パソコン」カテゴリー以下を表示
「パソコン」カテゴリー・アーカイブ:サブカテゴリーの「mixi」「ブログ」カテゴリーを表示
「ブログ」または「mixi」カテゴリー・アーカイブ:
