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.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 は未使用)ので、この修正は行っておりません。