タグ「MovableType」が付けられているもの

MovableType で脚注を使う

 LDR(livedoor Reader) で購読しているブログのうち、少なくないいくつかははてダ(はてなダイアリー)を利用しているブログなのですが、はてなダイアリーで良いなあと思っていたのが脚注機能です。ボクもはてなダイアリーは使ったことがあるのですが、脚注を駆使してまでの文章を書いたことはありませんでした。ただ、この機能が MT(MovableType) にもあれば利用したいなあという思いが募ってきたので、相変わらず重い腰をなんとか上げて調べてみました。そこで見付けたのが Footnote Plugin です(他にもエントリーのフォーマットで実現出来る HikiDoc プラグインも試してみたのですが、もう何年も MarkDown フォーマットで書いてきたので今更エントリーのフォーマットを変更するのも躊躇しました)
 導入の仕方は難しくありません。Footnote Plugin の説明通りにやれば簡単に導入できます。ボクも説明に従って、脚注の表示部分のテンプレートだけちょっと書き換えたくらいです。extlib/bradchoate ディレクトリを作ったのは久しぶりだったので一瞬ノスタルジックな気分にさえなりました(昔は大変お世話になったものです。)
 内容がかぶるのですが、簡単に導入方法を書いておきます。

1 プラグインをインストール

 Footnote PluginMTMacro をそれぞれダウンロードし、下記のディレクトリにコピーします。

1.1 footnote

(MT)/plugins/footnote.pl

1.2 macro

(MT)/plugins/macros.pl
(MT)/extlib/bradchoate/macros.pm
(MT)/extlib/bradchoate/postproc.pm

 (MT)/extlib/bradchoate/ というディレクトリは初期状態では存在しないので作ります。
 これでプラグインのインストールは完了です。

2 テンプレートを追加・編集

 脚注の定義と表示、適用を行います。

2.1 脚注定義

 脚注を使うためのタグの定義、脚注へのリンクフォーマットを定義します。『2.2 適用』よりも先に記述する必要があります。テンプレートモジュールにして、<body> の直後に読み込むようにしました。

<MTMacroDefine ctag="fn">
  <MTFootnote value="[MTMacroContent]" reset="[MTMacroAttr name='reset']">
    <MTFootnoteSet>
      <sup>
        <a href="#fn-<$MTEntryID$>-<$MTFootnoteTotalCount$>" id="efn-<$MTEntryID$>-<$MTFootnoteTotalCount$>" title="<$MTFootnoteString remove_html='1'$>">*<$MTFootnoteCount$></a>
      </sup>
    </MTFootnoteSet>
    <MTFootnoteGet>
      <MTIfFootnoteExist>
        <ul class="fnbody">
          <MTFootnotes>
            <li>
              <MTFootnoteNumbers glue=" ">
                <a href="#efn-<$MTEntryID$>-<$MTFootnoteTotalNumber$>" id="fn-<$MTEntryID$>-<$MTFootnoteTotalNumber$>">*<$MTFootnoteNumber$></a>
              </MTFootnoteNumbers>
              : <MTFootnoteString>
            </li>
          </MTFootnotes>
        </ul>
      </MTIfFootnoteExist>
    </MTFootnoteGet>
  </MTFootnote>
</MTMacroDefine>

2.2 適用

 Footnote Plugin を適用する箇所を指定します。<$mt:EntryBody$><$mt:EntryMore$> に適用するので、それぞれ <$mt:EntryBody apply_macros="1"$> <$mt:EntryMore apply_macros="1"$> と変更します。

2.3 脚注表示

 実際の脚注が表示される部分です。こちらもテンプレートモジュールにして、<$mt:EntryBody apply_macros="1"$> <$mt:EntryMore apply_macros="1"$> のあとに表示されるように読み込みました。

<MTIfFootnoteExist>
  <ul class="fnbody">
    <MTFootnotes>
      <li>
        <MTFootnoteNumbers glue=" ">
          <a href="#efn-<$MTEntryID$>-<$MTFootnoteTotalNumber$>" id="fn-<$MTEntryID$>-<$MTFootnoteTotalNumber$>">*<$MTFootnoteNumber$></a>
        </MTFootnoteNumbers>
        : <MTFootnoteString>
      </li>
    </MTFootnotes>
  </ul>
</MTIfFootnoteExist>

3 使用例

 上記の定義だと、エントリー本文の <fn> ~ </fn> に挟まれた部分が自動的に脚注になります。本文から脚注へのリンク、逆に脚注から本文中の該当箇所へのリンクも自動的に表示されます。他にも、エントリーの途中でそれまでの脚注を表示できたり、<fn>( ~ )</fn> と書くと『(』と『)』が無視されたり(逆に footnote を適用していない部分では『LDR(livedoor Reader)』と表示されるので文章がおかしくなりません)と、ホントに至れり尽くせりです。

 なお、導入方法は Footnote Plugin のページを参考にしました(ほとんどコピペですいません。)

スイミングスクール、池上本門寺、iPhone!

  • 投稿日:
  • by
  • カテゴリ:

 気がつけば3月ももう今日で終わりです。今月もあまりブログを書くことが出来ませんでした。書きたいことはいろいろあったのですがね。最近は家のことや家族のことに多くの時間を費やすのでついブログは後回しに、という言い訳は実は成り立たなくて、ブログを書くのに適当な時間はあったのです。来月こそは。
 2週間前に書いたひとつ前のエントリーでは息子のずりばいのことを書きました。今ではもうすっかり這いずり回るようになって、ボクや妻の後を追ってくるようにもなりました。ボクたちがリビングで食事をしているとテーブルの下をはいずりまわってスリッパを掴もうとしたりするのを止めなくてはなりません。さらに目が離せなくなりました。
 この間あったことと言えば、先々週末に見学に行ったスイミングスクールに4月から息子を通わせることにしました。ベビークラスというのがあって、週一回のクラスで親と一緒に参加することが出来ます。ボクと妻とで交互に参加する予定です。週末はボクが子供をお風呂に入れているのですが、いまだに髪を洗う段になるとぐずつくことがあります。それは体勢とか狭い空間から来る圧迫感とかが関係しているのかもしれませんが、プールに入ったときにどのような反応をするか今から楽しみです。

桜

 また、先週末は池上本門寺へ桜を見に出かけました。まだちょっと早かったみたいで咲いてる花びらもちらほら見られる程度でしたが、まあ必ず桜の花が見られなければならないというのでもなかったので、散歩として楽しかったです。池上本門寺は去年の12月に引っ越す前にその周辺をよくジョギングしていたこともあって(でも中に入ったことがなかったこともあって)、知っているようで知らない場所だったので興味もいっそう深まるというようなことでした。力道山のお墓があったのと、帰りに駅前で買ったくず餅がとてもおいしかったことを付け加えておきます。
 それから、ふたつ前のエントリーで携帯電話の調子が悪くてiPhoneにしようか迷っているというようなことを書いたのですが、その2日後にとうとう携帯電話の電源が不定期に落ちたりSIMカードが未挿入だと言われるようになったので、その日のうちにiPhoneに機種変更しました。会社の近くのソフトバンクショップに行ったら機種変更用の在庫がないと言われたので(16Gのホワイト所望)、近隣のソフトバンクショップに電話をかけて確認してみたら3番目に近かった品川の店に在庫があるというのでお昼休みに行ってきました。2週間くらい使っていますが、TwitterとかFlickrモブログをする頻度は確実にあがっていると思います。
 また、このブログを上ノ郷谷さんのiPhone Template Setを使わせていただいてiPhoneに対応させてみました。iPhoneのSafariからアクセスするだけでiPhone用のページに飛ぶようになっていますので、iPhoneユーザーの方はご覧ください(iPod Touchでも見られます)。コメントシステムにはDISQUSを利用しているのですが、従来のページとiPhone用のページとでコメントを共有させたかったので次のような方法を採りました。
 まず従来のページにはOgawa::MemorandaMTにDISQUSを配備するにはの方法でDISQUSが配備されているものとします。iPhone用のエントリーアーカイブにも同じように配備するのですが従来のエントリーアーカイブとはアーカイブマッピングが異なるため(すなわち MTEntryPermalink が異なるため)、それぞれが別のページへのコメントとして記録されてしまいます。解決するにはiPhone用のエントリーアーカイブに配備するコードのうち MTEntryPermalink の部分が(iPhone用のではなく)従来のページのパーマリンクになるように書き換えます。このブログでは次のように書いています。

<div id="disqus_thread"></div>
<script type="text/javascript">
  var disqus_url = '<$mt:BlogArchiveURL$><$mt:EntryDate format="%Y/%m/%d_%H%M"$>.php';
  var disqus_title = '<$MTEntryTitle encode_js="1"$>';
  var disqus_message = '<$MTEntryExcerpt encode_js="1"$>';
</script>
<script type="text/javascript" src="http://disqus.com/forums/greenplasticnet/embed.js"></script>
<noscript><a href="http://greenplasticnet.disqus.com/?url=<$mt:BlogArchiveURL$><$mt:EntryDate format="%Y/%m/%d_%H%M"$>.php">View the discussion thread.</a></noscript>

 これでパソコンからでもiPhoneからでも同じエントリーへのコメントとして記録されます。
 あとはiuiを使って動きを付けたり、過去のエントリーにアクセスしやすくしたり出来ればなあと思っています。

コメントシステムを DISQUS にしました

 先日 yosshi’s lifestream で使い始めた Lifestream Tool である Sweetcron ではコメントシステムに DISQUS を推奨していました。テンプレートに『ここに DISQUS のコードを貼る』みたいな書き方をしてたのでその通りにしたのですが、そのときは「ajax で表示されたり、アバターが出たりコメントに返信出来たりして便利だな」と思っていました。
 Ogawa さんMovableType のコメントシステムから DISQUS に乗り換えられていた(このブログのコメントシステムにDISQUSを使い始めました - Ogawa::Memoranda)のを読んでさっそくボクもそうしてみました。DISQUS のアカウントがなくてもコメントは可能ですが、アカウントを作っておけばアバターを表示させたり(DISQUS を採用している)あちこちのブログなんかで書いたコメントを一覧できたりしてとても便利です。
 コメントシステム(とトラックバックシステム)をDISQUS に乗り換えるにあたって唯一躊躇したのはすでに MT で管理されている既存のコメント(とトラックバック)の扱いでした。現時点ではそれらを DISQUS に移行することは出来なさそうだったので、今のところ既存のコメントはそのまま表示しています。いずれは DISQUS にインポート出来る日が来るのではないでしょうか。
 コメントシステムを DISQUS にすることでコメントする際の再構築がなくなりました。また他にもいくつか調整したので以前よりも読み込みと表示にかかる時間が短くなっていると思います。
 みなさんも是非 DISQUS のアカウントを取得してコメントしてみてください。

Now, it's WordPress.

 2002年の6月8日にボクは彼女と出会った。彼女はそのときボクが求めてたものをボクに与えることが出来る唯一の存在だった。その出会いはほとんど啓示的でさえあった。のちに彼女との出会いを人に話して聞かせる際にもボクは得意げに出会いの偶然性を強調したものだった。偶然性を強調すればするほどボクたちの出会いにはより神々しいヴェールがまとわれるような気がしたからだ。
 彼女はボクを新しい世界に導いた。ボクは新しい世界で自分の居場所を見つけることが出来た。新しい空気を胸に吸い込み、新しい人々との新しいコミュニケーションを楽しむことが出来た。それはすばらしい体験だった。少なくとも彼女と出会う前には想像だにしなかった世界に自分が今いるのだと思うとなんだか所在なげになることもあった。しかし新しい世界の時間はあまりにも早く流れていったので自分の所在なさを気にしている暇なんてなかった。やがてボクは自分が自分の足で歩いているのか、あるいは何かに押されているのか次第にわからなくなっていった。

 そんな風にして6年が過ぎた。振り返ればあっという間だったかもしれない。それでもたくさんの思い出がこの6年には凝縮されている。良い思い出もあれば悪い思い出もある。でも別れを目前にすると過去の悪い思い出も何かあたたかい光に包まれているように見えるから不思議なものだ。別れは急に思いついたものではけしてありません。自分なりにじっくりと、秋の夜の椎茸のようにひとりで根気よく考え抜いた結果なのです。

 6年というけして短くない時を共有した君とお別れするのは悲しいけれど、君とのたくさんの思い出を胸に抱いて今日からボクはまた別の新しい世界に飛び込む決意をしたのだから、どうか君には応援していてほしい。
 ありがとう。

 喧嘩してるのを見るのはなんかイヤだったので、MovableType から WordPress への移行の仕方を調べてみました。実際に移行するかどうかは別として、ただその可能性を探りたかったのです。そして探っているうちに WordPress を触るのが楽しくなってきました。
 今夜はエントリーの移行にスポットをあててみます。

 移行元の MovableType 4.1 日本語版は下記のようなスペックです。

  • エントリー 1835(うち未公開 2)
  • コメント 1154
  • トラックバック 676
  • カテゴリー 29
  • タグ 700(700!)
  • エントリーの改行フォーマットは、デフォルトの『改行を変換』が約1450、MarkDown + SmartyPants が約400

 移行先の WordPress はわーどぷれすっ! » アップグレードをどうするか?を参考に Subversion repository からチェックアウトしたものを使いました。

svn co http://svn.automattic.com/wordpress/branches/2.3/ /home/****/blog
svn co http://svn.automattic.com/wordpress-i18n/ja/branches/2.3/messages/ /home/****/blog/wp-content/languages

 まずはマニュアル(Importing from Movable Type to WordPress « WordPress Codex)に沿ってインポート作業を行ってみました。
 手順は MovableType で書き出したファイルを WordPress に読み込むという流れになります。それぞれデフォルトの状態で進めると問題に遭遇したので、MovableType(書き出す側)とWordPress(読み込む側)のプログラムに修正を加えて問題を克服しようというのがこのエントリーの趣旨です。
 以下が遭遇した問題です。

  1. 行末に付けた半角スペースと改行が取り除かれてしまう。
  2. エントリーに付けたタグが移行されない。
  3. コメントとトラックバックの区別がなくなっている。
  4. エントリーごとに改行フォーマットを選べない。

行末に付けた半角スペースと改行が取り除かれてしまう。

 MarkDown 記法では改行したい行末に半角スペースを2つ書くのですが、これがなぜか WordPress へのインポート時に消えてしまっていました。
 WordPressの(読み込む側の)wp-admin/import/mt.php に以下のパッチを当てると解決します。

--- mt.php.org  2007-09-27 08:23:22.000000000 +0900
+++ mt.php      2008-03-14 00:34:47.000000000 +0900
@@ -278,7 +284,7 @@
                echo "<div class='wrap'><ol>";

                while ( $line = fgets($handle) ) {
-                       $line = trim($line);
+                       $line = rtrim($line, "\n");

                        if ( '-----' == $line ) {
                                // Finishing a multi-line field

 こちらのサイトを参考にさせていただきました。

エントリーに付けたタグが移行されない。

 WordPress ではバージョン2.3からタグ機能がデフォルトで搭載されたそうです。
 WordPressの(読み込む側の)wp-admin/import/mt.php に以下のパッチを当てると解決します。

--- mt.php.org  2007-09-27 08:23:22.000000000 +0900
+++ mt.php      2008-03-14 00:34:47.000000000 +0900
@@ -224,6 +224,10 @@
                        }
                }

+               //tags import
+               if( $post->tags)
+                       wp_add_post_tags($post_id, $post->tags);
+
                $num_comments = 0;
                foreach ( $comments as $comment ) {
                        $comment = get_object_vars($comment);
@@ -350,6 +356,12 @@
                                $category = trim( substr($line, strlen("PRIMARY CATEGORY:")) );
                                if ( '' != $category )
                                        $post->categories[] = $category;
+                               //tags import
+                       } else if ( 0 === strpos($line, "TAGS:") ) {
+                               $tags = trim( substr($line, strlen("TAGS:")) );
+                               $tags= preg_replace("|\n*-----|s", '',$tags);
+                               if ( '' != $tags )
+                               $post->tags = $tags;
                        } else if ( 0 === strpos($line, "DATE:") ) {
                                $date = trim( substr($line, strlen("DATE:")) );
                                $date = strtotime($date);

 こちらのサイトを参考にさせていただきました。

コメントとトラックバックの区別がなくなっている。

 WordPress では MovableType ほどにはコメントとトラックバックの区別がなされていないみたいなのですが(きちんと調べてないので確証は出来ないです><)、少なくとも MySQL にはコメントとトラックバックを区別するフラグは入っていました。コメントもトラックバックも MySQL 上では同じ wp_comments テーブルに格納されるようですが、トラックバックの場合は comment_type カラムに ‘trackback’ と文字列が保存されるようです。
 WordPressの(読み込む側の)wp-admin/import/mt.php に以下のパッチを当てると解決します。

--- mt.php.org  2007-09-27 08:23:22.000000000 +0900
+++ mt.php      2008-03-14 00:34:47.000000000 +0900
@@ -245,6 +249,8 @@
                        $ping = get_object_vars($ping);
                        $ping = add_magic_quotes($ping);

+                       // comment_type for trackback
+                       $ping['comment_type'] = "trackback";
                        if ( !comment_exists($ping['comment_author'], $ping['comment_date'])) {
                                $ping['comment_content'] = "<strong>{$ping['title']}</strong>\n\n{$ping['comment_content']}";
                                $ping['comment_post_ID'] = $post_id;

エントリーごとに改行フォーマットを選べない。

 すいません、こちらはスマートな解決策ではありません。
 MovableType での設定がデフォルトの『改行を変換』と MarkDown + SmartyPants の2種類だったので、MarkDown とそれ以外、という戦法で行くことにしました。改行フォーマットが MarkDown ではないエントリーには、本文の最初に <!-- nomarkdown --> を追加します。そして WordPress にインストールした PHP Markdown Extra プラグインを改造して、本文の最初に <!-- nomarkdown --> があれば MarkDown を適用しないことにしました。

 MovableTypeの(書き出す側の)lib/MT/ImportExport.pm に以下のパッチを当てます。

--- ImportExport.pm.org 2008-01-23 15:13:12.000000000 +0900
+++ ImportExport.pm     2008-03-13 23:40:10.000000000 +0900
@@ -492,8 +492,8 @@
 DATE: <$MTEntryDate format="%m/%d/%Y %I:%M:%S %p"$><MTEntryIfTagged>
 TAGS: <MTEntryTags include_private="1" glue=","><$MTTagName quote="1"$></MTEntryTags></MTEntryIfTagged>
 -----
-BODY:
-<$MTEntryBody convert_breaks="0"$>
+BODY:<mtsetvarblock name="cb"><$MTEntryFlag flag="convert_breaks"$></mtsetvarblock>
+<MTIf name="cb" eq="__default__"><!-- nomarkdown --></MTIf><$MTEntryBody convert_breaks="0"$>
 -----
 EXTENDED BODY:
 <$MTEntryMore convert_breaks="0"$>

 WordPress にインストールした PHP Markdown Extra プラグインに以下のパッチを当てます。

--- markdown.php.org    2007-09-26 14:41:22.000000000 +0900
+++ markdown.php        2008-03-14 01:21:24.000000000 +0900
@@ -61,7 +61,11 @@
        }

        # Transform text using parser.
-       return $parser->transform($text);
+  if ( !preg_match('/^<!-- nomarkdown -->/', $text) ){
+               return $parser->transform($text);
+  }else{
+    return $text;
+  }
 }


@@ -85,7 +89,7 @@
        # - Run Markdown on excerpt, then remove all tags.
        # - Add paragraph tag around the excerpt, but remove it for the excerpt rss.
        if (MARKDOWN_WP_POSTS) {
-               remove_filter('the_content',     'wpautop');
+//             remove_filter('the_content',     'wpautop');
         remove_filter('the_content_rss', 'wpautop');
                remove_filter('the_excerpt',     'wpautop');
                add_filter('the_content',     'Markdown', 6);

 何度かざっと触ったことがありましたが、今回はわりとじっくり WordPress を触ることが出来ました。MovableType では簡単に出来ていたことが WordPress でどうやればいいかわからないとか、でも再構築しなくていいのはやっぱり良いよなとか、いろいろ思いました。
 また、テンプレートに関しては MovableType で mt.Vicuna を利用させていただいていたので、WordPress でも wp.Vicuna を使ってみました。WordPress のテンプレートについてはまったく知識がないので、これからマニュアルなどを読んでテンプレートのカスタマイズもやっていきたいと思います。プラグインもいろいろ試してみたいな。

 今回は detlog.org の nao さんにご協力いただきながら進めました。twitter の direct message や IM を通じてのボクの質問攻撃に快く答えてくださったことに感謝します。

Movable Type セキュリティーアップデート

 Movable Type のセキュリティーアップデートが提供されていました。

 このブログで使用している MT のバージョンは 4.01 日本語版だったのでMovable Type 4 をお使いの場合からバージョン 4.01a がダウンロード出来たので、とりあえず 4.01 との差分を取ってみました。

differ:

(MT)/extlib/Data/ObjectDriver/BaseObject.pm
(MT)/extlib/Data/ObjectDriver/Driver/Cache/Memcached.pm
(MT)/extlib/Data/ObjectDriver/Driver/DBI.pm
(MT)/extlib/Data/ObjectDriver/SQL.pm
(MT)/extlib/Data/ObjectDriver.pm
(MT)/lib/MT/App/Comments.pm
(MT)/lib/MT.pm
(MT)/mt-check.cgi
(MT)/mt-static/js/common/AdEngine.js
(MT)/mt-static/js/common/App.js
(MT)/mt-static/js/common/Client.js
(MT)/mt-static/js/common/Cookie.js
(MT)/mt-static/js/common/Core.js
(MT)/mt-static/js/common/DOM.js
(MT)/mt-static/js/common/Devel.js
(MT)/mt-static/js/mt_core_compact.js
(MT)/php/mt.php

only in 4.01a:

(MT)/extlib/Data/ObjectDriver/Iterator.pm
(MT)/extlib/Data/ObjectDriver/ResultSet.pm

 という結果だったので該当ファイルのみアップロードしました。また、mt-view.cgi も削除しました

CommentThrottle とか CAPTCHA とか

 会社の隣の席の人がこのブログにコメント出来ないと指摘してくれたので確認してみたら、どうやら CommentThrottle に必ずひっかかってしまうという現象に遭遇しました。Movable Type のバージョンは 4.01 です。
 Ogawa::MemorandaThrottleSecondsとはいったい何なのか?Movable Type 4 ドキュメント環境変数リファレンスと併せて読み、mt-config.cgi に ThrottleSeconds 0 と書いてみたのですが何も変わらなかったのでとりあえず MT のソースを見てみて、CommentThrottle の処理を行っていると思われる箇所をコメントアウトしてみたらコメント出来るようにはなりました。さわったのは (MT_HOME)/lib/MT/App/Comments.pm このファイルです。

$ diff -c Comments.pm.org Comments.pm

*** Comments.pm.org     Thu Oct 25 11:26:31 2007
--- Comments.pm Wed Oct 24 23:15:29 2007
***************
*** 982,990 ****
      my $passed_filter =
        MT->run_callbacks( 'CommentThrottleFilter', $app, $entry );

!     $passed_filter
!       || return $app->handle_error( $app->translate("_THROTTLED_COMMENT"),
!         "403 Throttled" );

      my $cfg = $app->config;
      if ( my $state = $q->param('comment_state') ) {
--- 982,990 ----
      my $passed_filter =
        MT->run_callbacks( 'CommentThrottleFilter', $app, $entry );

! #    $passed_filter
! #      || return $app->handle_error( $app->translate("_THROTTLED_COMMENT"),
! #        "403 Throttled" );

      my $cfg = $app->config;
      if ( my $state = $q->param('comment_state') ) {

 しかし気持ち悪い。MT にログインしてシステム情報を見てみたら以前は言われてなかったと記憶していますが、Archive::Zip と IO::Uncompress::Gunzip と IO::Compress::Gzip が必要だと言われました。入っているはずなんだけどなあ。せっかくなので使ってなかった機能を試してみようと思って CAPTCHAプロバイダを Movable Type 既定にしてみたのですが画像が生成されません。表示されない画像を右クリックして開いたらこんなエラーメッセージが出てきます。

画像でエラーが発生しました: Exception 425: Corrupt image `/home/www/*/htdocs/mt/mt-static/images/captcha-source/k.png’

 これもなんだか気持ち悪い。合間を見ていろいろ試してみようとは思っています。

iMT

 iPhoneiPod touch 向けの管理画面提供プラグイン iMT を無理矢理携帯電話の PC ブラウザから使ってみるテスト。
 表示の乱れを直せば意外と使えるかも。長文は書けませんが。

ダイナミック・パブリッシングの不具合

 前エントリーで書いたように PHP の調子がどうも悪かったのですが、その間、Movable Type のダイナミック・パブリッシング(PHP を利用した、再構築不要の動的ファイル生成)が機能しなくなっていました。PHP の調子が元に戻るとダイナミック・パブリッシングも元通りに動いてくれたのですが、動作確認をしているときにふと気がついたのだけど、月別アーカイブや個別アーカイブの『次の月』『次のエントリー』へのリンク先がすべて『最新の月』『最新のエントリー』になっているのです。具体的には <MTEntryNext><MTArchiveNext> が正しく動作しなくなっているということでしょう。

 この不具合についてはなんとなく覚えがあったのでググってみたのですが、先月にはてなブックマークしていました。

 WingMemo: MT3.32にはダイナミックで重大なバグあり & 修正方法

# diff -c mtdb_base.php.original mtdb_base.php

*** mtdb_base.php.original      Mon Feb 19 00:11:27 2007
--- mtdb_base.php       Mon Feb 19 00:12:34 2007
***************
*** 534,539 ****
--- 534,549 ----
              $limit = 0; $offset = 0;
          }

+         if ($args['sort_order']) {
+           if ($args['sort_order'] == 'ascend') {
+             $order = 'asc';
+           } elseif ($args['sort_order'] == 'descend') {
+             $order = 'desc';
+           }
+         }
+ 
+         $sort_field or $sort_field = 'entry_created_on';
+ 
          $sql = "
              select mt_entry.*, mt_placement.*, mt_author.*,
                     mt_trackback.*

 このバグが起こるのは 3.32、3.33、3.34 ということなので、先日 3.34 にバージョンアップしたときからずっと起こっていたのではないかと思います。PHP の調子が悪くてダイナミック・パブリッシングを利用できなかった期間には起こっていなかったようですが :p

Rightfields でも改行したい!

 Movable Type のエントリーフィールドを拡張して CMS ツールとしての MT の機能を格段に広げることのできるプラグイン RightFields を仕事で使っているのだけど、前にも遭遇したのですが拡張したフィールドにはエントリーの改行設定が反映されません。その挙動が未だに理解できないので(したくないのか……)個人的には使っていない MT デフォルトの『改行を変換する(Convert Line Breaks)』を選択しても拡張したフィールドでは改行が <br /> に変換されないのです。
 これはなかなか困った問題で、お客様には極力 HTML を記述しなくてもサイトの更新が容易に行えるという目的の下でフィールドを拡張しテンプレートをカスタマイズした MT を提供しているのに、<br /> といえどもタグを書かせてしまうなんて(しかもたかだか文章を改行するためだけになんて)本末転倒もいいところだと神の声が聞こえてきそう。

 というわけで、解決してみました。この方法が最適かどうかはわからないけど、とりあえず動いているのでよし。
 オフィシャルの BBS でも同じような問題に突き当たっている人がいました(返信したのだけど操作方法があっていたのかどうか、現時点ではページに反映されてません)。

 方法はいたって簡単です。
 まず、The blog of H.Fujimoto さんの 「改行を変換する」を改良するプラグイン(ModTextFilter)をインストールします。
 それからテンプレートの該当部分に filters="ModTextFilter" の記述を追加。

<MTExtraFieldValue field="movie_introduction" filters="ModTextFilter">

 もしかしたら MT デフォルトの『改行を変換する(Convert Line Breaks)』を利用できるのかもしれませんが、convert_breaks="1" では改行出来ませんでした。
 とりあえずこれで様子を見てみます。

 様子を見た結果、ogawa さんにスマートな方法を教えていただきました。
 どこでもConvert Line Breaksするための2つのTips - Ogawa::Memoranda
 さっそくボクもこちらに乗り換えました。なるほど、convert_breaks はフィルターではないのか。remove_html は効いたのに convert_breaks が効かなかったのはそういうことなのですね。もっとソース読まなくては。。。

 convert_breaks が使えず remove_html が使えた時点で前者がグローバル・タグ・アトリビュートでなく後者がそうだという感じは何となくしていたのですが、『改行を変換する』をグローバル・フィルター(・プラグイン)化する方法がわからなかったのです。

Hyper Estraier 導入

 Movable Type の全文検索(MT::App::Search)がどうしても重かったので代替方法をいろいろ探してみました。
 ajax をつかった全文検索も試してみたのですが、仕事でたまたまサイト検索の調査をしているときにテストしてみた Hyper Estraier の動作がとても軽快だったので採用することにしました。

 Search with Hyper Estraier: a full-text search system for communities - greenplastic.net

 まずは Hyper Estraier のインストール。ボクの場合はサーバーが FreeBSD なので ports から入れました(他の方はオフィシャルサイトの通りにどうぞ)。

portinstall converters/libiconv
portinstall databases/qdbm -m "WITH_ZLIB=yes"
portinstall textproc/hyperestraier

 次に MT から検索用のファイルを書き出すようにテンプレートを追加します。純粋にエントリー本文のみの検索にしたかったのと、それから仕事の調査もかねて Hyper Estraier の独自のデータ形式である文章ドラフトという形式を試してみたかったからです。
 すでに公開してるエントリーアーカイブとは別に、検索用に書き出すファイルのディレクトリの指定とテンプレートの追加を行い、書き出したそのファイル群を Hyper Estraier に読み込ませればいっちょ上がりです。
 簡単でしょ?

 MT の公開の設定で『アーカイブ・マッピング』を追加し、検索用のエントリーアーカイブを書き出すようにします。出力フォーマットを既存のエントリーアーカイブと別ディレクトリに指定したらテンプレートの追加。

 検索用エントリーアーカイブ(Hyper Estraier の『文章ドラフト』フォーマット用)

@uri=<MTBlogURL><$MTEntryDate format="%Y/%m/%d_%H%M"$>.php
@title=<$MTEntryTitle$>
@author=<$MTEntryAuthor$>
@cdate=<$MTEntryDate format="%Y-%m-%dT%H:%M:%S+09:00"$>
@mdate=<$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S+09:00"$>
<MTEntryIfTagged>category=<MTEntryTags glue=","><$MTTagName$></MTEntryTags></MTEntryIfTagged>

<$MTEntryBody remove_html="1">
<MTIfNonEmpty tag="EntryMore"><$MTEntryMore remove_html="1"$></MTIfNonEmpty>
    <$MTEntryTitle$>

 @uri= のあとは、実際のエントリーアーカイブの URL に合うように書き換えてください。グリプラの場合は上記のようになっていますというサンプルです。
 あとはこちらの手順に従ってインデックスの作成、検索用 CGI スクリプトの設置を行います。
 検索ディレクトリが /PATH/TO/search、先ほど MT がファイルを書き出したディレクトリが /PATH/TO/search/entries、検索用のインデックスファイルを作成するディレクトリを /PATH/TO/search/casket とすると、下記のような手順になります。

インデックスの作成(作業はすべて /PATH/TO/search ディレクトリで行うものとする)
# estcmd gather -il ja casket entries

検索用 CGI スクリプトの設置
# cp /usr/local/libexec/estseek.cgi .
# cp /usr/local/share/hyperestraier/estseek.* .

 あとは estseek.conf ファイルの編集ですが、最低でも次の2点の編集が必要です。環境に合わせて書き換えてください。

indexname: /PATH/TO/search/casket
replace: file:///PATH/TO/WWW/{{!}}http://www.greenplastic.net/

 これで、estseek.cgi に実行権限を与えたあとブラウザでアクセスすると検索が行えます。あとは定期的にインデックスを更新したり最適化したりすれば OK ですね。テンプレートが estseek.cgi と同じディレクトリにあるので(estseek.conf)、ブログのデザインと馴染ませることも簡単にできます。
 見た目の体裁が整ったので公開しました。みなさま、ガシガシ検索してくださいませ。会社の同僚たちは、ボクがビールについて何エントリー書いたか調べてはボクを揶揄してきます。

 残りの課題としては、エントリー投稿・編集と Hyper Estraier のインデックスの更新の連携をどうするかです。MT の再構築後に処理を行うプラグインを書けば出来ると思うのですが、cron を回しておけばいいやという気もしています。

 検索は男のロマン!? (Junnama Online (Mirror)) のコメント欄での指摘を本文に反映させました。具体的には、検索用エントリーアーカイブに @mdate (文章の最終更新日時を示す)を指定しているのにもかかわらず、それらを Hyper Estraier のデータベースに追加する際に -sd オプションを使用してしまっていました。-sd を付けるとファイルの更新日時を文書の属性として追加しますので、@mdate に書かれているエントリーの最終更新日時が反映されていなかったことになるようです。
 MT4 な方は EstCrawler を利用するのが良いかも知れません。ボクも利用したいです。

 重い腰を上げて、ようやく Movable Type 3.3 に移行しました。現時点での最新バージョンは 3.34 です。
 移行作業中に見つけたことや、今までとやり方を変えたことなどを書き留めておこうと思います。

 その前に、この間サーバーの PHP のバージョンを 4.4.4 から 5.2.0 にバージョンアップしたのですが、MT のバージョン 3.21 の時点でダイナミック・パブリッシングの挙動がおかしくなっていました。最初はそのことに気がつかなくて、金曜日の夜中に会社で徹夜して仕事している途中にたまたま見つけました。前にも同じようなことがあったので(サーバーを借りたばかりの頃に同じようなことを経験していた)、そのとき見つけたのは MT 附属の Smarty のバージョンが最新の PHP と合っていないというものだったので、最新のものを落としてきて入れ替えたらあっさり治りました。
 Smarty : Template Engine
 こちらから最新版をダウンロードし(現時点では 2.6.16)解凍して出来たディレクトリを smarty にリネームしてから、[MT_DIR]/php/extlib/smarty と差し替えればハッピーになれます。

 MT 3.21 に 3.34 附属の smarty フォルダをコピーしてもおかしかったので、上記の通りに最新版に入れ替えたのでした。
 ところで、MT 3.34 にしてから、ダイナミック・パブリッシングが文字化けしているのを今日になって見つけました。MySQL の文字コードとか問題あるのかな。とりあえず、MT 3.34 移行時に mt-config.cgi に SQLSetNames 0 と明記しないと(ダイナミック・パブリッシングに限らず)文字化けすることは確認しました(このときと一緒)。
 MySQL の文字コードの設定、見直さないとな。。。

 3.34 に移行するに当たってデザインも少しだけ変更したのですが、一番大きな変更は css の管理方法を変更したことです。上ノ郷谷さんの CSS 分割管理の実践編 - 2xup.org をまずは実践も兼ねてほとんどそのまま採用させていただきました。これから自分なりの管理しやすい方法を探っていければと思います。
 また、フォントサイズ固定をやめました。これで Windows の IE でもブラウザで文字サイズの変更が出来ると思います。デフォルトのサイズもちょっぴり上げて読みやすくしました。

 トップページのサイドバーに5つくらい、外部サイトのフィードを取ってきて表示しているのですが、この部分を Plagger を使って実装しました。Publish::MTWidget を使って簡単に出来るのですが、5つのサイトからそれぞれ最新の5件だけ取ってきたかったので、テンプレート(mt_widget.tt)の方をいじってみました。

yosshi@~/plagger/assets/plugins/Publish-MTWidget: diff -cu mt_wi et.tt.backup mt_widget.tt
*** mt_widget.tt.backup Sun Jan 28 05:13:50 2007
--- mt_widget.tt        Sun Jan 28 05:29:50 2007
***************
*** 1,8 ****
! <div class="module">
! <h2 class="module-header">[% feed.title | html %]</h2>
! <div class="module-content"><ul class="module-list">
  [% FOREACH entry = feed.entries -%]
  <li class="module-list-item"><a href="[% entry.link | html %]">[% entry.title | html %]</a></li>
  [% END -%]
  </ul>
  </div>
--- 1,11 ----
! <div class="module-feeds module">
! <h2 class="module-header"><a href="[% feed.link | html %]">[% feed.title | html %]</a></h2>
! <div class="module-content">
! <ul class="module-list">
  [% FOREACH entry = feed.entries -%]
+ [% IF (loop.count) < 6 %]
  <li class="module-list-item"><a href="[% entry.link | html %]">[% entry.title | html %]</a></li>
+ [% END %]
  [% END -%]
  </ul>
  </div>

 クラス名を変更したりタイトルにリンクを追加したのと、あとはループの回数を6以下(つまり5回)にしただけです。cron に登録しておきました。

 残作業と懸念点を上げておきます。

  • MT 標準の検索は重い。検索テンプレートはコーディング済なので公開できるけど、他のもっと軽い方法がないか探してみる。
  • タグまわりを MT 標準に変更したけど、MT-XSearch との連携作業がまだ残ってます。今は(さっき重いと言ったばかりの)標準の検索機能を使っている。

 見た目はあまり変わらないけど内部的には変わっている、という感じになりました。

Movable Type コンテスト 2006

 Movable Type コンテストに今年も応募することにしました。
 去年も応募したのですが、まあボクのブログのようなたまにしか人様の役に立てない内容では受賞するはずもないかと思いながらも、でもまあ自分の日常をネタに面白く読んでもらえるような文章を4年半も書き続けているというちょっとした自負もあって、結局は受賞しようがしまいが関係ないわけですが賞品がもらえればうれしいし受賞すれば認知度も上がると思っているような次第です。
 去年どの部門に応募したのか忘れてしまいましたが、今年はどの部門に応募しようかしら。Movable Type のプラグインを書いたりプログラムとかコーディングっぽいことも書いたりしてるので『個人サイト テクニカル部門』に応募してみようかと思ったりもするけど、コンテンツ的には圧倒的に少ないからなあ……。
 多くは望まないのでTシャツ欲しいです。

MOVABLETYPE PLUGINS DIRECTORY

MOVABLETYPE PLUGINS DIRECTORY Movable Type のプラグインを81個(も!)紹介している MOVABLETYPE PLUGINS DIRECTORY が出版されました。
 先月上旬くらいかな、編集をしているという方から拙作プラグインの掲載許可を求めるメールが来ました。もちろん断る理由などあるわけがないので即答で OK したわけですが、一冊いただくことが出来ました。
 これまで2度ほど書籍や雑誌にブログを掲載していただきましたが、今回は MT のプラグインの掲載ということで少し緊張しました。掲載されたプラグインは BanPing2OldEntry Plugin ですが、これは去年の秋に書いたものでその頃はまだ perl のことがよく分かっていなかったのです(今だって同じようなものですが……:p)。名だたる他のプラグインと並んで掲載されている、しかもアルファベット順のために比較的前の方に掲載されているというのも恐縮するような。それでもやはりうれしいことにはかわりがないので、これからももっといろいろと書いていきたいなと思うのでした。
 今回掲載していただけて良かったのは、まず純粋に本に載っただけでうれしいということ。その本を一冊いただけたということ。それから MT3.3 で動作確認していただいたということです :p

MOVABLETYPE PLUGINS DIRECTORY
MOVABLETYPE PLUGINS DIRECTORY
posted with amazlet on 06.12.04
関根 元和 藤本 壱 みらの
毎日コミュニケーションズ
売り上げランキング: 1250

韓国料理とダーツ、プログラマー来阪、献本

  • 投稿日:
  • by
  • カテゴリ:

 日曜日は急遽、夜に韓国人のヨンスンさんと食事をすることになったので夕方に慌てて出かけました。ボクはこの日にズボンを買いたかったので梅田で慌ただしくサイズを合わせてお金を払ってまた電車に飛び乗りました。
 久しぶりに江坂に行ったのですが、昔働いていた場所なのでなつかしかったです。仕事を辞めて以来、江坂には足を運んでいませんでした。ヨンスンさんが一度行ったことのある韓国料理屋は、ボクがかつて毎日通って昼ごはんを食べて昼寝していた漫画喫茶の下にありました。そこでカムジャタンやチヂミやサムギョプサルを突きながらひたすらビールを飲んだ。土曜の夜からビールを飲み続けているような気がしなくもなかったけど、韓国料理屋を出て隣のダーツバーで遊んでいたときもずっとビールを飲んでました。このダーツバーにも2度ほど足を運んだ記憶があります。ああなつかしき青春時代。まあ今だって青春なんですがね!
 いくつかのタイプのルールでダーツを楽しみ、それぞれが交代交代に勝利するという素人集団に良くあるどんぐりの背比べ的な状況でしたが、店のメニューに罰ゲーム用の飲み物が用意されていて、最後の2ゲームで負けたヨンスンさんとボクがそれぞれ罰ドリンクを飲まないといけないことになりました。ヨンスンさんが飲んだのは甘めのカクテル風だったようなのですが、ボクが飲んだのは草っぽい匂いのする塩の入ったしょっぱい飲み物で気持ち悪かった。12月に韓国に残してきた家族(奥さんと1歳くらいのお子さん)がこっちにやってくるとは聞いていたけど、結局12月から日本で一緒に暮らすことに決まったようで、それも嬉しい知らせでした。
 罰ドリンクを飲んだからかどうか夜はなかなか寝付けずにいたので、今日は一日中眠かったです。普段からずっと眠いという気もするけど、眠くてもコーディングは出来るので問題ありません。むしろ疲れていて他のことをする余力がなかったので自分の仕事に集中出来たかもしれない。
 今日から東京本社のプログラマーが1週間出張で大阪に来ているので隣で一緒に仕事をします。今日は明日からの準備くらいしか出来なかったけど、明日からバリバリやって行く予定。自分たちの仕事で手一杯ですが仕事は楽しい。楽しくなければやってないのです。夜は開発メンバー4人で2時間ほど飲んで(今日得たストレスはその日の内に解消しとかないとね)帰ってきました。
 ところで、ムーバブル・タイププラグインディレクトリ―PROFESSIONAL NETWORK に自作のプラグイン(仕事ではなく個人で作ったもの)が掲載されるとのことで一冊献本いただけるそうなのですがまだ届かないなあ。出版社のサイトだと発売日が月曜になってるけど、現在アマゾンには『3〜5週間』って書いてあるな。明日届かなかったら少し書店を覗いてみようかしら。これまで数えるほどですがブログを本や雑誌に掲載していただいたけど献本いただくのははじめてです。これって出版社によるのかなあ。
 と同時に、こちらの発売日も気になっています。あと、ダーツのせいで少しだけ筋肉痛です。

Internet Explorer 7 and pkg

 Internet Explorer 7Movable Type のスタイルシートの pkg クラス(float を解除したり、Internet Explorer で原因の分からない不具合が起きたときにとりあえず適用してみると解決することのある素敵なクラス)が効かないなあと思ってその場しのぎで clear: both; とか書いてたのだけど解決策を見つけた(ネットで見つけたのだけどどこで見たのか忘れた)。
 デフォルトの pkg クラスは以下の通り。

.pkg:after {
  content: " ";
  display: block;
  visibility: hidden;
  clear: both;
  height: 0.1px;
  font-size: 0.1em;
  line-height: 0;
}
* html .pkg { display: inline-block; }
/* no ie mac \*/
* html .pkg { height: 1%; }
.pkg { display: block; }

 Internet Explorer 7 に対応させるには min-height: 0; を追加する(自分の書き方に整形してあります)。

.pkg:after {
  content: " ";
  display: block;
  visibility: hidden;
  clear: both;
  height: 0.1px;
  font-size: 0.1em;
  line-height: 0;
}
* html .pkg {
  display: inline-block;
}
/* no ie mac \*/
* html .pkg {
  height: 1%;
}
.pkg {
  display: block;
  min-height: 0;
}

 これでその場しのぎで書いていた clear: both; を外しても正しく表示されました。

LoopLimiter Plugin

 Movable Type のあらゆるコンテナタグの中で、たとえば『4回目毎に出現するアイテムに異なったスタイルを適用したい』とかいうような局所的なリクエストが仕事上発生したのでプラグインを書いてみました。

 LoopLimiter.zip

 プラグイン自体や属性の名称については『とりあえず付けた』だけです。まず動作確認したかったので名前についてはこれから考えていくということでご容赦願います。
 使い方は至って簡単で、インストール後に任意のテンプレートの任意のコンテナタグの中に

<$MTLoopLimiter limit="4" offset="2" each="only" rest="notonly"$>

 と書くと、offset=2 なので最初の出現回数2回分は飛ばし、3回目以降については limit=4 なので出現回数4回ごとに each で指定した内容が出力されます。each に該当しない分については rest の内容が出力されます。この例だと、only と出力されるのは6, 10, 14, 18, 22… 回目となります。その他は notonly が出力されます。

<$MTLoopLimiter limit="2" offset="0" each="even" rest="odd"$>

 こう書くとどこかで見たことあるようなプラグインが再現できちゃいます :p

 1テンプレート内の複数箇所で使用したときにそれぞれを独立してカウントできないという致命的なバグがありますので、使用にはご注意ください。

 同じような機能を持ったプラグインがエムロジック放課後プロジェクトで公開されていました。

未だにMT3.3へ移行できない理由

 4年以上にわたってMovable Typeを使ってきて、新しいバージョンへの移行がこんなに遅れているのははじめてかも知れません。MT3.3がリリースされて2ヶ月以上になりますが、未だにMT3.2-ja-2を使い続けております。
 移行できない理由はいくつかあるのですが、ボクの怠慢を除けば主にMT3.3から実装されたタグまわりの問題になります。MT3.2では(それ以前からかも?)Ogawa::MemorandaのogawaさんのTagwire Pluginを利用させてもらってエントリーへのタグ付加を行ってきました。これはエントリーのキーワード欄を使用するものなのですが、MT3.3からは正式にタグがサポートされ、エントリーにもタグ欄が追加されています。
 問題なのは、MT3.3デフォルトのタグまわりの機能がTagwire Pluginに比べると貧弱だということです。それを補う形でogawaさんがTagSupplementals Pluginを作ってくれています(thanks!)。
 同僚がMT3.32への移行を果たしていて『もしかしてボクが最後かも』『ブロガーの名に恥じる』という思いからDBをコピーしてMT3.3にスムーズに移行できるか、もっといえば『タグを使った表現がこれまでと同じように出来るか』ということをTagSupplementals Pluginを使って試してみました。MT3.32は再構築も早くてすばらしく、またTagSupplementals PluginほぼTagwire Pluginと同等の機能を提供してくれました。ただ一点だけ同じように出来ないことがあったので今すぐの移行を諦めたところです。
 どういったことが出来なかったかというと、このブログのトップページの最下部に”Frequent 50 Tags”というブロックがありますが、簡単に言えばこれが出来ません。詳しく説明すると、テンプレートからこの部分(のタグ表示に関わる部分)を抜き出すと、以下のようになります。

<ul id="tagging">
<MTTags sort_by="count" sort_order="descend" lastn="50">
<li title="<$MTTag$>:<$MTTagCount$>:<$MTTagDate format="%Y-%m-%d"$>"><a title="Tag: <$MTTag$>"  href="<$MTBlogURL$>tag/<$MTTag encode_url="1"$>"><$MTTag$></a></li>
</MTTags>
</ul>

 ここで使っている<MTTags>というコンテナタグはTagwire Pluginによって追加されたものですが、MT3.3には同名のコンテナタグが用意され同じ文脈で機能するのですが、オプションとして取ることの出来るアトリビュートが少なすぎます。トップページ最下部のこの場所でボクが本当にしたいことは、頻出する50個のタグをアルファベット順に並べ、その使用回数・最近使用されたかどうかによって文字を大きくしたり色を濃くしたりしたいということなのですが、Tagwire Pluginを使っても出来なかったのでアルファベット順を諦めて頻出順に並べています。ところが、MT3.3の<MTTags>ではlastnアトリビュートを指定できないのですべてのタグを表示するしか選択肢がありません。すべてのタグを一覧に表示するタグ・クラウドのページならそれで良いのですが、このブログを訪れる人にこのブログでよく使われているタグを上位50個程度表示したいという目的には合っていません。
 早くMT3.3に移行したいのでそのあたりも自分で解決できないか、上記のプラグインやMTのソースを見てみようと思います。

Movable Type 3.32日本語版

 Movable Type 3.32日本語版がリリースされていました(英語版もリリースされているようです)。
 ボク自身はまだ3.3にすらバージョンアップ出来ていないのですが、3.32ではタグ周りの動作が改善されているようなのでそろそろバージョンアップしようかなと思っています。いつもは新しいバージョンが出たら速攻で入れてたのだけど、今回は腰が重いですね。。。
 仕事でもMT使ってるので公式に弄べるのですがなかなかそんな時間もなく。『それMTでできるんじゃない?』とMTタグを駆使したテンプレートでサイト構築やっちまいたい。ようやく明日から時間が取れそうです。