MovableType3→4移行時のツボ~その1. 検索フォーム編

 MovableType3.6のデータを4.1にコンバートしたら、一部機能が正常に機能しなくなりました。 大きくは検索でエラーが出る点とコメントフォームが正しく表示されない点です。

 あれこれいじってなんとか動くようになったんですが、ウチでホストしている他のブロガーの為に、外観、テンプレートを極力書き換えずに機能させる手順をまとめてみました。

 ドキュメント等を見ずに我流で編み出した方法なので、もっとスマートなやり方があるのかも知れません。というか従来のデザインにあまり名残が無いのであれば、いっそテンプレートをリセットしてMT4のものをベースに再構築した方が、後々シアワセになれるかも知れません。モジュール化、サイドバーへのウィジェット配置機能などせっかくのコンセプトが活かせるからです。実際、このブログは練習も兼ねてそうしてみましたが、かなり見通しがよくなった気がします。

■なぜ検索でエラーが出るのか?

 DBコンバートしただけの状態では「 検索結果の作成に失敗しました。」と出てしまうワケですが、この原因は、「システムテンプレート」→「検索結果」テンプレートの中で呼んでる(インクルードしている)「ヘッダー」、「ブログ記事の概要」、「フッター」という3つのテンプレートモジュールが存在しないからのようです。この3つを用意してやれば正常に機能するというワケです。

 「検索結果」テンプレートを開いた画面で、右サイドバーの「インクルードモジュール」という見出しの下に、各モジュールを新規作成するリンクがあるので、そこから作れば簡単です。

■「ヘッダー」

 文字通り<html><head>~</head>辺りのテンプレートです。MT4の標準テンプレートを見ると、<body>以降も共通となる部分は若干含んでいるようです。「メインページ」テンプレートからごっそりコピーするのが簡単でしょう。

 MT3の標準的な2カラムレイアウトのテンプレートをベースにしている場合、

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”

から、<MTEntries>で記事データが始まる直前の、

<div id=”pagebody”>
<div id=”pagebody-inner” class=”pkg”>
<div id=”alpha”>
<div id=”alpha-inner” class=”pkg”>

あたりまででよさそうです。

■「フッター」

 同様にフッターも「メインページ」から最後の部分をコピペします。サイドバー部分もメインページ同様に表示されるようにするには、</MTEntries>直後からざくっと行きましょう。

■「ブログ記事の概要」(→別名で作成)

 さて、問題は検索に該当した記事の表示フォーマットを既定する部分です。一番簡単には、「メインページ」テンプレートから上記の「ヘッダー」、「フッター」にもってった部分の残り、つまり<MTEntries>~</MTEntries>の中身を流用する手がありますが、これだと本文が全て表示されてしまうので、ヒット数が増えた時に一覧性がよろしくありません(MT4標準ではそうなるようです)。

 そこでこの際、シンプルに日付入りのタイトルのリストになるようにしましょう、

<li class=”search-list-item”><$MTEntryDate format=”%Y.%m.%d”$>: <a href=”<$MTEntryLink$>”><$MTEntryTitle$></a></li>

です。

 「ブログ記事の概要」というテンプレート名はMT4のテンプレート群の中では重要なものなので、中身を大きく改変したものを重複する名前で作っておくと、将来MT4テンプレートを一括導入した時に問題になりそうなので、ここでは「タイトル一覧項目」という名前で作成しておきます。

■「検索結果」テンプレートの調整

 上記モジュールを呼び出すシステムテンプレート「検索結果」を調整します。元々

<$MTInclude module=”ブログ記事の概要” hide_counts=”1″$>

と書かれた行があるので、これのモジュール名を変えつつ、<ul>タグを追加します。下記のように置き換えて下さい。

<div class=”search-content”>
       <ul class=”search-list”>
              <$MTInclude module=”タイトル一覧項目” hide_counts=”1″$>
        </ul>
</div>

 ■スタイルシートの調整

 例えば、リストの文字が小さいな、という気がしたら、「インデックステンプレート」→「スタイルシート」テンプレートに

.search-list-item a {
   font-size:medium;
   margin-left:3px;
}

 などと調整しましょう。

 既にMT3環境がなく、検索結果画面のレイアウトが調べられないので、適当にでっちあげてしまいましたが、以上でとりあえず動くようにはもってけると思います。

 次回は、コメントフォームを動かすための最低ステップをまとめてみたいと思います。

MovableType4でアーカイブマッピングが変更できない件の覚え書き

 MovableType4.1ではデフォルトで、ファイル名が「hoge-fuga.html」とハイフンで生成されます。今までは「hoge_fuga.html」のようにアンダースコア区切りだったので、このまま再構築してしまうと、過去のページのURLが変わってしまい、外部サイトからリンクされている場合などに不都合が生じます。

 通常、この設定はアーカイブテンプレートで「ブログ記事」の「アーカイブマッピング」の設定をいじることで変更できるのですが、なぜか「yyyy/mm/entry_basename.html」を選んで「保存」を押すとエラー(Bad Request)になってしまいます。ブラウザを変えてもダメ。

 このままではいつまでも全再構築ができないので、MySQLで直接データベースを書き換えるという暴挙に出ました。おそらく、テンプレートを初期化した場合などにも再度設定が必要になると思われるので覚え書きしておきます。

 まず、MT管理画面で該当の設定画面を呼び出します。個別記事の場合、MT4では「ブログ記事」というアーカイブテンプレートが相当するようです。そして、この時のURIを見て、 テンプレートのID番号を探ります。

https://…/cgi-bin/mt/mt.cgi?__mode=view&_type=template&id=265&blog_id=7

 で、MySQLのコマンドラインツールで、

update mt_templatemap set templatemap_file_template=’%y/%m/%f’ where templatemap_template_id=’265′;

というSQLを発行します。 「%y/%m/%f」というのは、管理画面のソースから読み取りました。

 ターミナルでログインできるサーバーか、DB編集ユーティリティの提供されているレンタルサーバー等でしか使えない技ですが、ご参考までに。

MovableType 4.1への移行と文字コード変換

 Webサーバーを新マシンに移行するついでに、MovableType4のオープンソース版に移行することにしました。そして、同時にかねてからの課題だったUTF-8化に挑戦(BlogWriteIIから投稿した時に「~」が化けなくなるように)。

 様々なページを参考にしましたが、それぞれ微妙に事情が違っていて苦労しました。基本的には、

  • MTはEUC-JPで構築していた
  • MySQLのテーブルはlatin1だった
  • バックエンドDBはMySQL

という状況です。

 結果としては効いたのは、迷惑コメントの消去です。これでMySQLのダンプサイズが劇的に減っただけでなく、奇妙な文字化けによるインポートエラーを回避することができました。MTの管理画面からは見えにくいですが、迷惑コメントタブの方に万単位に溜まってたのでしたorz。

 MT管理画面で一通り不要なデータを削除した後、ターミナルから、

mysqldump –default-character-set=ujis -u user -p dbname > mtdb.sql

としました(もしかすると–default-character-set=binaryだったかも)。赤字部分は環境に応じて修正すべし。次に、これをUTF-8にコンバートし、ファイル内部のlatin1という文字列をutf8に置換します。

nkf -w mtdb.sql > mtdb_utf.sql
perl -pi -e ‘s/latin1/utf8/’ mtdb_utf.mysql

 ついでに、今までの化けた「~」を修正するため、emacsで、波ダッシュを「~」に置換しました。これで下準備は完了です。

 次に、新サーバー側の準備として、/etc/my.cnfの、[mysqld] 、[mysql]、[mysqldump]の項に、

default-character-set=utf8

を追記。[mysqld]には更に、

skip-character-set-client-handshake

も追記。この辺はどれが必須かは不明です。 これで、MySQLの作るDBのデフォルト文字コードがUTFになるので、新しくMovableType用DBを作成し、先ほどのダンプを流し込みます。

mysqladmin create dbname
mysql dbname < mtdb_utf.sql

 ここの流し込みで散々エラーに悩まされましたが、迷惑コメントのデータを一層し、nkfでUTF-8に変換したところ上手くいきました(lvではダメでした)。

 あとは、新規インストールしたmT4のmt-config.cgiでPublishCharsetをutf-8にし、mt.cgiにアクセスしたら自動的にDBの変換が実行され、管理画面で文字化けしてなければOKです。再構築すればUTF-8でページが生成されるはずです。

iPod touch/iPhoneのSafariでデフォルトの表示幅を指定する

meta (HTMLタグ リファレンス)

 iPod touchのSafariでは、携帯電話向けに作った横幅の狭いページもデフォルトではやたら縮小されて表示されてしまいます。せっかくドットバイドットで表示できる画像を用意してもわざわざ小さく縮小表示してくれやがります。bodyタグやpタグにwidthとか指定してみてもダメ。そこでググってみると、上記のリファレンスページにmetaタグでの指定方法が載っていました。

<meta name=”viewport” content=”width=300″>

のように記述しておけば良いことが判明。

<meta name=”viewport” content=”initial-scale=0.75″>

のようにズーム率で指定することもできるようですが、どっちを使うべきかは不明。とりあえず前者にしときます。

 現状ではPCのブラウザでは無視されるっぽいので、iPod touchでアクセスする可能性のあるページに気軽に埋め込んでおけそうです。

 他にも、最小倍率、最大倍率、ピンチ禁止などができるようです。

CerntOS5 64bit環境にText::MeCabを導入するとmake testが通らない件

 日経Linuxの2008/2月号の特集を見ながら、SpamAssasinを導入する経過で、MeCabという形態素解析エンジンを利用するCPANモジュールText::MeCabを入れる段でつまづきました。makeやmake testが通らない。どうも64bit環境であることが問題っぽい。

 以下に解決法を書いておきます。

cpan -fi Text::MeCab

をしてエラーになった後で、/root/.cpan/build/Text-MeCab-0.20001に移動します。そこにあるMakefile.PLを編集し、

my %INFO = (
    ABSTRACT     => ‘Alternative Interface To libmecab’,
    AUTHOR       => ‘Daisuke Maki <daisuke@endeworks.jp>’,
    CCFLAGS      => $result->{cflags},
    DEFINE       => join( ” “, @define ),
    DISTNAME     => ‘Text-MeCab’,
    INSTALLDIRS  => ‘site’,
    LIBS         => mecab-config --libs,
    NAME         => ‘Text::MeCab’,
    OBJECT       => ‘$(O_FILES)’,
    PREREQ_PM    => {
    LD           => mecab-config --cxx,
    INC          => mecab-config --cflags,

てな感じで書き換えます。下2行は丸ごと追加です。後半の括りはアポストロフィではない点に注意。/usr/bin/mecab-configコマンドをパラメーター付きで実行して、その結果を渡してる訳ですね。

 一応これでmakeもmake testも通って、無事make installした訳ですが、その前に以下も試してますので、一応書いておきます。もし上記だけでダメならお試し下さい。

 mecab-0.96とmecab-ipadic-2.7.0-2007080をコンパイルする時に、64bit環境であることを明示します。

LDFLAGS=’-m64′
CFLAGS=’-m64′
CPPFLAGS=’-m64′
CXXFLAGS=’-m64′
export LDFLAGS CFLAGS CPPFLAGS CXXFLAGS

で、./configureは元記事ではファイルパスを細かく指定してたのを、シンプルに

./configure –with-charset=utf8  (mecabの時)

./configure –with-mecab-config=/usr/bin/mecab-config –with-charset=utf8 (mecab-ipadicの時)

だけにしてみました。

 ググっていくつものページを参考にしたんですが、もう色々見過ぎてとてもまとめられないので、個別リンクはご勘弁下さいませ。それぞれを執筆された方、本当にありがとうございました。

追記:

 んが、ここにsrpmが揃ってました。こっちをリビルドすれば良かったかも…