Movable Typeの最近のブログ記事


前回紹介したように、この New York Watch ブログを Movable Type 4.21 で運用していると書いたが、ここに至るまでこの MT4.21 を10回はインストールしただろうか。
旧バージョン、3.3x からのアップグレードではだいぶ悩まされたが、それもなんとかクリアしたので、少しずつ改造に乗り出すことにした。

まずはこのバージョンから正式にサポートされた captcha から取りかかろう。

captcha とは文字をノイズを乗せた画像にして表示させ、それを見た人間が入力することで認証を行う仕組みである。このブログでもコメントにスパムが投稿されることが多いので、旧バージョンのときから導入していたが、そのときに使用していた captcha は Movable Type 用に公開されているプラグインをインストールすることで実現していた。
今回 Movable Type が4.21のバージョンアップに伴い、この captcha が標準機能に組み込まれたので、サードパーティの captcha プラグインをインストールする必要は無くなった。

が今回搭載された captcha はコンピュータによる解析を不可能にさせるだけでなく、人間にとってもかなり判別しづらい画像を生成する。しかも以前は4桁の英数字で運用していたものが、MT4.21謹製 captcha は桁数が6桁もある。ということでもっと見やすいものに改造してしまえ! とインターネットで探してみると既に同じような考えを持っている人はいるもので、すでにその方法が公開されていた。

KUMA TYPE 「Captcha認証の画像を更に見やすくしてみた。」
http://blog.kumacchi.com/2008/08/captcha_2.html

このブログエントリーを参考にして、背景に付加されるノイズ部分を除去し、ついでに桁数も6桁から4桁に減らしてみた。
オリジナルのテンプレートからの変更点を赤色で示している。
ランダムに背景画像にノイズを載せる部分をコメントアウトしているので、その分このスクリプトのパフォーマンス向上にも役立っているはずだが、どうも僕が借りているサーバは captcha スクリプトの実行速度が芳しくないようだ。そのためコメントを送ろうとしてページを開き、コメント欄にマウスポイントを置くと captcha 画像が現れるはずなのだが、表示されるまでに数秒かかるようだ。
なかなか表示されない場合でも少し待ってみて欲しい。

ちなみにこの captcha 画像は、コメント欄や名前の欄に一度マウスカーソルが行かないと表示されないようになっている。当初はなぜだろうと思ったのだが、実はこれが Movable Type 謹製ならではの機能だった。
Movable Type 4.21 は様々な機能追加が行われたが、その一つがコメント投稿者のユーザ登録・認証であり、一度サインインしてしまうと名前やメールアドレス、それに capcha によるセキュリティコード入力も省略できるようになっている。
コメントを登録したい人が、このブログのデータベース管理によるユーザ登録をすることもできるし、また最近話題の OpenID を使って認証することもできるようになった。つまり Yahoo ID や mixi のアカウントでコメントが投稿できるということだ ( ただし mixi アカウントでのサインインとコメント投稿はまだ未テストなので、どなたか試してみてください(笑) )。特に mixi OpenID を使うとマイミクの人だけがコメントを残せる様にすることもできる。当ブログではそこまで限定せず、mixi OpenID があれば誰でも投稿できるようにしてある。もし captcha の入力が煩わしいという方は、このようにいくつかの認証をサポートしているので利用してみて欲しい。


結局人間にとって読みやすくすれば、その分セキュリティも強固でなくなるわけだが、そこまでしてスパム広告を送ってくる輩もまだここにはいないので、しばらくはこのぐらいでよいだろう。


ちなみに captcha で使われているキャラクターセットを英語アルファベットではなく、ひらがなにしてしまえば、たとえスパマーが画像を解析して captcha を破ったとしても、ひらがなの入力部分で一苦労することだろう。captcha 画像を簡易化したことで妙なスパムコメントがつくようになったら、次はひらがな一文字だけの captcha に切り替えるのもよいかもしれない。

変更するファイル:
$"your MT home directory"/lib/MT/Util/Captcha.pm
# Movable Type (r) (C) 2001-2008 Six Apart, Ltd. All Rights Reserved.
# This code cannot be redistributed without permission from www.sixapart.com.
# For more information, consult your Movable Type license.
#
# $Id: Captcha.pm 1952 2008-04-17 21:18:57Z bchoate $
 
package MT::Util::Captcha;
 
use strict;
use warnings;
use base qw( MT::ErrorHandler );
 
use constant READABLECHARS => '23456789abcdefghjkmnzpqrstuvwxyz';
use constant WIDTH  => 25;
use constant HEIGHT => 35;
use constant LENGTH => 4;
use constant EXPIRE => 60 * 10;
 
use MT::Session;
 
sub check_availability {
    my $class = shift;
 
    eval "require Image::Magick;";
    if ($@) {
        return MT->translate('Movable Type default CAPTCHA provider requires Image::Magick.');
    }
 
    my $cfg = MT->config;
    my $base = $cfg->CaptchaSourceImageBase;
    unless ($base) {
        require File::Spec;
        $base = File::Spec->catfile(MT->instance->config_dir, 'mt-static', 'images', 'captcha-source');
        $base = undef unless (-d $base);
    }
    unless ($base) {
        return MT->translate('You need to configure CaptchaSourceImageBase.');
    }
    undef;
}
 
sub form_fields {
    my $self = shift;
    my ($blog_id) = @_;
 
    require MT::App;
    my $token = MT::App->make_magic_token;
    return q() unless $token;
 
    my $cfg = MT->config;
    my $cgipath = $cfg->CGIPath;
    $cgipath .= '/' if $cgipath !~ m!/$!;
    my $commentscript = $cfg->CommentScript;
 
    my $caption = MT->translate('Captcha');
    my $description = MT->translate('Type the characters you see in the picture above.');
    return <<FORM_FIELDS;
<div class="label"><label for="captcha_code">$caption:</label></div>
<div class="field">
<input type="hidden" name="token" value="$token" />
<img src="$cgipath$commentscript/captcha/$blog_id/$token" width="100" height="35" /><br /><br />
<input name="captcha_code" id="captcha_code" value="" autocomplete="off" />
<p>$description</p>
</div>
FORM_FIELDS
}
 
sub generate_captcha {
    my $self = shift;
    my ($app, $blog_id, $token) = @_;
 
    my $code = $self->_generate_code(LENGTH());
 
    my $sess = MT::Session->new;
    $sess->id($code);
    $sess->kind('CA'); #CA == CaptchA
    $sess->start(time);
    $sess->name($token);
    $sess->save or
        $app->error($sess->errstr), return undef;
    my $image_data = $self->_generate_captcha($app, $code, 'png') or
        return undef; 
 
    return $image_data; 
}
 
sub validate_captcha {
    my $self = shift;
    my ($app) = @_;
 
    my $token = $app->param('token');
    my $code = $app->param('captcha_code');
 
    my $from = time - EXPIRE();
    MT::Session->remove({ kind => 'CA', start => [undef, $from] }, { range => { start => 1 }});
 
    my $sess = MT::Session->load({ id => $code, name => $token, kind => 'CA' });
    return 0 unless $sess;
    if ($sess->start() < (time - EXPIRE())) {
        $sess->remove;
        return 0;
    }
    $sess->remove;
    return 1;
}
 
sub _makerandom {
    my $size = shift;
 
    my $bytes = int($size / 8) + ($size % 8 ? 1 : 0);
 
    my $rand;
    if (-e "/dev/urandom") {
        my $fh;
        open($fh, '/dev/urandom')
            or die "Couldn't open /dev/urandom";
        my $got = sysread $fh, $rand, $bytes;
        die "Didn't read all bytes from urandom" unless $got == $bytes;
        close $fh;
    } else {
        for (1..$bytes) {
            $rand .= chr(int(rand(256)));
        }
    }
    $rand;
}
 
sub _generate_code {
    my $self = shift;
    my($len) = @_;
 
    my $code = '';
 
    my $genval = unpack('H*', _makerandom($len*2*8/2));
 
    # Cycle through the octets pulling off the lower 5 bits then mapped into
    # our acceptable characters
    foreach my $i (0..($len-1)) {
      my $byte = ord(pack('H2', substr($genval, $i*2, 2)));
      my $x = ($byte & 31);
 
      $code .= substr(READABLECHARS(), $byte & 31, 1);
    }
 
    return $code;
}
 
sub _generate_captcha {
    my $self = shift;
    my ($app, $code, $format) = @_;
    $format ||= 'png';
    my $len = LENGTH();
 
    my $cfg = $app->config;
    my $base = $cfg->CaptchaSourceImageBase;
    unless ($base) {
        require File::Spec;
        $base = File::Spec->catfile(MT->instance->config_dir, 'mt-static', 'images', 'captcha-source');
        $base = undef unless (-d $base);
    }
    return $app->error($app->translate('You need to configure CaptchaSourceImageBase.'))
        unless $base;
 
    require Image::Magick;
    my $imbase = Image::Magick->new(magick=>'png')
        or return $app->error($app->translate("Image creation failed."));
 
    # Read the predefined letter PNG for each letter in $code
 
   my $x = $imbase->Read(map { File::Spec->catfile($base, $_ . '.png') }
                          split(//, $code));
 
    if ($x) {
        return $app->error($app->translate("Image error: [_1]", $x));
    }
 
    # Futz with the size and blurriness of each letter
    foreach my $i (0..($len - 1)) {
        my $a = int rand int(WIDTH() / 14);
        my $b = int rand int(HEIGHT() / 12);
 
        $imbase->[$i]->Resize(width => $a, height => $b, blur => rand(3));
    }
 
    # Combine all the individual tiles into one block
    my $tile_geom    = join('x', $len, 1);
    my $geometry_str = join('x', WIDTH(), HEIGHT());
    my $im = $imbase->Montage(geometry => $geometry_str,
                              tile     => $tile_geom);
    $im->Blur();
    # Add some lines and dots to the image
#    for my $i (0..($len * WIDTH() * HEIGHT() / 14+200-1)) {
#        my $a = int rand($len * WIDTH());
#        my $b = int rand HEIGHT();
#        my $c = int rand($len * WIDTH());
#        my $d = int rand HEIGHT();
#        my $index = $im->Get("pixel[$a, $b]");
#
#
#        if ($i < ($len * WIDTH() * HEIGHT() / 14+200) / 100) {
#	    $im->Draw(primitive => 'line',
#                      stroke    => $index,
#                      points    => "$a, $b, $c, $d");
#        } elsif ($i < ($len * WIDTH() * HEIGHT() / 14+200) / 2) {
#            $im->Set("pixel[$c, $d]" => $index);
#        } else {
#            $im->Set("pixel[$c, $d]" => "black");
#        }
#    }
 
    # Read in the background file
#    my $a = int rand(5) + 1;
#    my $background = Image::Magick->new();
#    $background->Read(File::Spec->catfile($base, 'background' . $a . '.png'));
#    $background->Resize(width => ($len * WIDTH()), height => HEIGHT());
#    $im->Composite(compose => "Bumpmap",
#                   tile    => 'False',
#                   image   => $background);
    $im->Modulate(brightness => 105);
    $im->Border(fill     => 'black',
                width    => 1,
                height   => 1,
                geometry => join('x', WIDTH() * $len, HEIGHT()));
 
    my @blobs = $im->ImageToBlob(magick=>$format);
    return $blobs[0];
}
 
1;


まだ体裁など整っていないのだが、基本的な機能は特に不具合が見あたらないこともあり、このエントリーから Movable Type 4.21 でブログを公開していこう。
コメント投稿時に OpenID も使えるようなので ( 未テスト ) 、あらかじめサインインしておくことで楽に投稿ができるかもしれません。
今まで通りのコメント投稿 ( つまりサインインせずに、名前とメールアドレスを入力してコメントする方法 ) の場合には、数桁の英数字がランダムに表示されるので ( Captcha )、その通り入力して投稿ボタンを押してください。ときおりこのランダムの画像の表示が遅くなることがあるので、そのときは数秒待ってみてください。そのかわり背景をシンプルにして見やすくしてあります。






その他の近況。
NAS 内の HDD の調子が怪しいので、交換の前のバックアップを取っているところ。写真データが膨大なのでこれだけで結構時間を取られている。
久しぶりに鉄道で郊外へ。Dia:Beacon。久しぶりに汗ばむ晩夏。

Movable Type 4.21

| コメント(2) | トラックバック(0)

このところこのブログの更新がおろそかになっているが、それはブログを管理するシステムのアップグレードに手こずっていたせいである。
New York Watch は Movable Type というブログ管理システムを、僕が借りている共有サーバに構築して運用しているのだが、その Movable Type に大幅な変更が加えられ、久々のメジャーアップデートを果たしたということで最初のバッチが出たタイミングで現在のものから移行しようするつもりである。

ちなみに Movable Type 自身が変わっても、New York Watch では特に新機能を追加する予定は ( いまのところ ) ないので、「 見た目にデザインが変わったかな 」 程度にしか受け止められないのが悩ましいところである。
ならば、なぜ新しいバージョンに入れ替えるのかというと、リリースノートを信ずるならば再構築のパフォーマンスが向上したから、というのが表向きの理由で、個人的に魅力だったのはダイナミックパブリッシングとページ分割だろうか。
今までもダイナミックパブリッシングを Movable Type 3.35 のもとで使用していたのだが、4.2 になってそれが推し進められアーカイブページでもページ分割ができるようになった。
またコメント投稿時にスパムコメント防止の Captcha があるのだが、これも Movable Type 標準機能になった。

が今回 Movable Type 4.21 アップグレードで一番てこずったのが、この MT 内蔵 Captcha でどうやっても合成された画像が表示されなかった。
結局 nomeri.com を運用しているホスティングサービス会社のサポートとやりとりをして原因が判明し、動くようになった。
現行の New York Watch にはいろいろなスクリプトやらプラグインで機能を追加しているので、まだ全部移行は済んでいないのだが、めどがついたので近いうちにデータベースを移し替えて、MT 4.21 での運用に切り替える予定。

ちなみに Movable Type 3.x から最新の 4.21 にアップグレードするにはいくつか方法があるが、うまくいくのは旧 MT のデータを標準機能のエクスポートで保存し、MT 4.21 の設定が済んだ後でこのデータをインポートする方法のみだった。
Movable Type を使っている人なら知っていると思うが、mt-config.cgi を旧 MT ディレクトリから取り出して、MT 4.21 ディレクトリにコピーし、そのあとスクリプトを走らせることで自動的にアップデートすることもできるのだが、一見全てうまく処理が済んだように見えても、構築されるブログは新旧のテンプレートが入り交じっためちゃくちゃなページが表示される。
テンプレートの初期化、という機能があるのだがこれを試してもスタイルシートなどが旧来のままであるところから判断すると、どうやら DB ( 僕は MySQL を使用している ) へのマイグレーションがうまくいっていないのだろう。
MT 4.21 アップグレードの注意については、メモ的な意味も含めて改めて書くことにしよう。


ということでもうしばらくブログ更新をお待ちください。その間写真を掲載するぐらいの投稿になるかもしれません。

先週末まとまった時間が取れたので前々からやろうやろうと思っていた、いろいろなことに着手した。
その一つは部屋の整理で、こちらは早々に飽きてしまった。けれども長らく使用しなかったものなどを廃棄したので、だいぶすっきりした。写真を飾るスペースもできたので、あらかじめ購入しておいたフレームに写真を入れて壁にかけると、それまで飾り気の無かった部屋が少しばかり華やぐ感じだ。
これまでどうも実用本位で部屋の中にものを配置していたのだが、それを思いっきり壊して 「 見せる 」 ことを意識して並べ直すことで雰囲気ががらっと変わる。

その次に着手したのが、このブログである。
僕は Movable Type を自前でインストールして使っているのだが、しばらくバージョンアップをスキップしてきたために新しい版のそれと比べると機能の点でだいぶ見劣りするようになってしまった。
そもそも Movable Type は改造できることが利点となっており、僕もだいぶ手を入れているのでバージョンアップが一筋縄ではいかないのである。それでバージョンアップを見送ってきたというわけである。

ちょっと時間があるから・・・と気軽に始めてしまった、Movable Type のバージョンアップであるが、結局数時間の予定が一日、二日・・・しまいには一週間もかかってしまい、ブログの更新も停止せざるをえなくなった。

もちろんデータベースのバックアップを取り、新たに Movable Type をインストールしてそちらでテストと改造をしていたので、これまでの New York Watch ブログにはなんの支障もないのだが、二つのデータベースを使っているのが長引くとデータベースに違いが生じてしまい ( つまり皆さんからのコメントなど )、その分は個別にデータベースをインポートするなど手間がかかる。
ということでここしばらくは意図的にブログに記事を投稿しないようにしていた、というわけである。

・・・ということでこの投稿が読めることからわかるように、予想よりだいぶ遅くなってしまったが無事バージョンアップを終え、いくつかの新機能も追加することができた。

最初に取り付けたのは 「 タグ機能 」。
最近はメールソフトの中にもタグの機能をサポートしているものが出てきたから知って人も多いと思うが、ブログのエントリーに現れる言葉などをキーワードにしてカテゴリを超えたエントリー同士のグループ化が簡単にできるようになった。サイドバーにある 「 Tag Could 」 はエントリーに登録したタグの出現率の高いキーワードが目立つように表示される。現時点では過去分のブログへ、タグ付けが完了していないのでまだ一部しか表示されていないが、これからもっと増やす予定である。

そしてそのタグ機能を用いて新たに追加したのが 「 Gallery 」 へのリンクである。
このブログで投稿してきた過去のエントリーにそれぞれ含まれる画像の中で、ギャラリーとして集めたいものだけにタグをつけ、それをサムネイル化して表示しているのである。

ところでその機能はもちろん僕が一から作ったものではなくて、Movable Type 用のプラグインを用いて組み合わせたものである。
今回のギャラリーは EntryImages というプラグインでできている。ところが当初公開されていたこのプラグインではタグによる画像を抽出する機能がなかったようで、だめもとで作者の方にタグが使えるかどうか尋ねるメールを送った。
確か夕方仕事が一段落したところでメールを書いたはずで、その後ジムにでかけたのだが、そこから帰宅してメールをチェックするともう作者の方からメールが入っていた。
それによると、タグが使えるように機能追加したものを作ったので、どこどこのリンクからダウンロードして欲しい、という内容のものだった。
( こちらはジムでちんたらちんたらしていたというのに、こんなに素早く対応していただき、どうもありがとうございました > 作者の Fujimoto さん )
そのお礼と言ってはなんだが、この方もフリーランスで働いているというので、氏のホームページから早速ドネーションさせてもらった。

ちなみにこの New York Watch ブログで使用しているプラグインは他にもこんなものがある。

MTPaginate
MTTagInvoke
captcha

これらについてはここよりもっと詳しく、かつわかりやすく解説しているサイトがあるので、「 New York Watch での使い方を知りたい 」 という奇特な方でもいない限り、ここでは省略させてもらおう。


さて新しい機能も無事動いているようでなによりだが、ただ一つだけ気がかりなことがある。

皆さんからのコメントを頂戴してからの処理に異様に時間がかかってしまい、しばらくはタイムアウトを起こしたと思ってしまう人が続出するのではないかということ。
まだチューニングはできていないので、それまでは投稿ボタンを押したあと忍耐強く画面が変わるまでお待ちください。

050410-195432.jpg
▲ Canon EOS 20D

ここ数日の New York は雨続きということもあって自宅でこつこつと打ち込んでいたのが、ブログシステム、Movable Type のバージョンアップ作業。
といっても Movable Type を自前でインストールして、自前のブログシステムを使用しない人にとっては全く関係ない話なのだが、これも今後バージョンアップする際の僕自身のメモとして書き記しておくことにした。

New York Watch もすでにエントリー数が700を超え、最初の頃は感じなかった不満点が出てきた。
その最たるものが速度で、僕がエントリーを書いてパブリッシュすると数十秒かかることも珍しくなくなった。僕のブログを読んでくれる人もコメントを書いて送信すると、ネットワークコネクションがとぎれてしまったんじゃないかと思うくらい時間がかかるようになったのでご存じのことだろう。
というのもコメントでもエントリーでもちょっと更新しようと思うと、データベースを更新した後でインデックスページやら個々のエントリーやらいくつもの html ファイルを作りあげたり更新するために非常に時間がかかるようになったのだ ( つまり毎回静的にファイルを生成しており、その度に700を超えるエントリー分のデータベースにアクセスする必要があった )。

もちろん Movable Type ではそのことも考慮して、ファイルを動的に生成させる仕組みも用意されている。つまりエントリーを登録したり、コメントが追加されたときにもデータベースに保存するだけでファイルを生成しないことで更新にかかる時間を短縮するわけだ。その代わりウェブサイトがアクセスされるとその度に表示するための html を生成することになるため、サーバに対する負担は高くなる。けれどもインデックスファイルなど頻繁にアクセスされるファイルは静的に作成しておくことで、バランスを取ることができる。

幸いこの機能は僕が使用していたバージョンでも使えるということだったので試してみたのだが、それほど目に見えて速いというほどパフォーマンスが向上することもなく、加えてコメントが新しいものから旧いものへの順番でしか表示できないなど不具合も報告されていた。
調べてみると最新のバージョンである 3.2 では不具合も修正されているということがわかり、それならばとシステムを入れ替えることにした。

それまで使用していたデータベースをエクスポートし、新しくインストールした Movable Type にインポートしてやれば移行作業自体は終わりなのでそれほど手間はかからない。以前にもやっているのでだいたい手順も覚えている。
けれどもそこから面倒なのはインストールしたプラグインソフトやら僕が改造したスクリプトの移行である。新旧 Movable Type の仕様の違いからそれまで動いていた機能が動かなくなったりするのだ。それらをいちいち手動で修正し、テストを繰り返していたらあっという間に数日かかってしまった。

具体的に機能追加や改造をしているのは、サイドバーのカレンダー表示、アクセスカウンター追加、最近のコメントのツリー表示、最新のトラックバック表示などであり、またリストをツリー上に表示するためのプラグインもインストールされている。そのほかにもスタイルシートを大幅に書き換え、表示されるフォントやレイアウトもオリジナルとはだいぶ異なっている。
スタイルシートは特にバージョン間で大きく変更されているために、画面のマージンやパディングの値を変えるたびに、画面で確認するなどだいぶ手間がかかった部分である。

それまではテンポラリの URL でテストをしていたのだがどうやらほとんど以前のものと変わらぬ見栄えになったことから、これまで使っている New York Watch と同じ場所にブログが展開されるように設定を変え、再構築。これで移行は完了である。
もし 「 以前と変わったことに気がつかなかった 」 と言う人がいればそれはうまくスムーズに移行が完了した、ということであるがよくアクセスしてくれている人だったらちょっとした違いに気がついたかもしれない。
たとえばエントリーの中で 「 以前にここで紹介した 」 などという記述があり、そのブログエントリーへのリンクがあるのだがこれをクリックすると、以前静的に生成された html ファイルへジャンプする。ところがスタイルシートの互換性が無いために、旧い html ファイルは画面が乱れて見える ( フォントサイズの指定も違っている )。
せっかく動的にファイルが生成される方法を選んだのだから、過去の html ファイルを削除してしまえばいいのに、と言われるかもしれない。実は今回からファイルの拡張子も php 化のために html から php に変えている。そのため新しいファイルではリンク先の拡張子も php になっていないと正しい画面が表示されない。つまり各エントリーの中で過去のエントリーへリンクしている場合に、html と記述されている箇所をを全て php に変えてサイトをリビルドさせなくてはいけないのだ。
実はこれはかなり大変な作業である。いったいどのエントリーが他のエントリーへリンクを張っているかを調べる手段は用意されていないから、一つずつ目視で確認しなくてはならない。それと簡単に html を消せない事情は、サーチエンジンが覚えているリンク情報のこともある。
サーチエンジンがヒットしたキーワードに基づいてエントリーを表示させようと思ってもすでに html から php へファイル名が変わっているために、「 Not found 」 というエラーが表示されることになるのである。
困ったな、と思って google で探してみるとやはり同じような問題に遭遇した人がいて、すでに解決策が取り上げられていた。
具体的にはスクリプトを一本用意して、.htaccess というアクセス制御のファイルに html から php へ自動的にリダイレクトするよう、書き加えるのである。
今回そこまでテストする時間がなかったため、その機能追加は後回しにすることにした。それで過去のエントリーへのリンクをたどると画面レイアウトが崩れて見えるのである。これは時間があるときに対処することにしよう。
あとは小さな事だが、個々のエントリーを表示させるとこれまで表示されていた 「 そのブログエントリーが投稿された日時 」 タイトルバーが表示されなくなった。
どうやら 個別アーカイブで MTEntries を使わない方法に書き換えられたため、そのタグの中でしか使用できなかった MTDateHeader が使えなくなってしまったのだ。そのせいでバナーと本文がつながっているようで、間延びしているように見える。これについても時間があるときにテンプレート書き換えに再挑戦してみることにしよう。

さてつらつらと書いてきたが、移行作業が終わり、早速コメントの投稿テストをしてみたところ、どうやら少しばかり速くなった気がする。何より動的ファイル生成にしたことでサーバ上の使用ファイルサイズも減ることとなった。しばらくは旧バージョンが生成した html ファイルも残存するが、いずれこれも不要になるので、さらにサーバ使用量は少なくなりそうで、良かった良かった。

050410-195338.jpg
▲ Canon EOS 20D

さて明日からは通常に戻り、これまで通りのブログを書くことにしよう。皆さん、これからも New York Watch をどうぞよろしく。

・・・などと書くとちょっと大袈裟だが、実はこのブログもかなり苦労して更新している。

事の始まりは2日前だった。
いつものようにエディタでブログの本文を書き、Movable Type にログインして本文の内容を新しいエントリーにコピーして「保存」ボタンを押す・・・するといつもは「保存されました」というメッセージが出るはずなのに、保存も公開 ( publish ) もされず、かわりにこんなエラーが表示された。

500 Internal Server Error The server encountered an internal error or misconfiguration and was unable to complete your request. Please contact the server administrator, webmaster@nomeri.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.

--------------------------------------------------------------------------------

Apache/1.3.33 Server at www.nomeri.com Port 80

そこで、Apache ( web server ) の Error log を見てみるとこのエラーが書かれている。

Premature end of script headers: /xxx/mt.cgi

昨日まで動いていたものが急に壊れるはずは無い。ということで調べてみるとどうやら本文に4000バイトほどのデータがあると保存出来ず、それより小さいと保存出来ることが分かった ( なのでこのブログも手短に書いている )。
僕はここしばらく Movable Type のスクリプトを変更していないので、障害はサーバ側に有るはずだ、と早速ホスティング会社のカスタマーサポートにメールすると、やはりこの現象に見舞われているのは僕だけでない様子。

加えて Movable Type のユーザフォーラムでもこの件で各地から報告があがっている。

http://www.movabletype.org/support/index.php?s=99182fa96ffc403839d9bf680f884e22&act=ST&f=9&t=52920&st=0

どうやらホスティングが cPanel のアップデートを行ったため、その中の Perl モジュールのどれかが Movable Type に問題を起こしているようなのだが、ホストが違っても障害報告があがっているところを見ると、各社似たタイミングで Cpanel をアップデートしたのだろうか。
ホスティング会社がサーバの環境を元に戻すかそれともシックスアパート ( Six Apart ) がなんらかの対応パッチを出さない限りは直りそうにない。

一応「すべての更新」を選び、全部のモジュールをリビルドすることはできるのでエントリーを公開するたびにリビルドすることで回避は出来るのだが、これだけエントリーがあるとリビルドにも時間がかかる。

ということで原因がわかり修正されるまでの間、エントリーは短めにしよう。ひとまず報告まで。

ブログの改造

| コメント(0) | トラックバック(1)

僕のホームページもメインはすっかりブログに移行し、これまでのようにデザインを変えるたびにHTMLコードを書きなおす、という手間はだいぶ軽減された。
ブログという、一つの完結したシステムを使うことで統一された操作感が得られる一方で、スタイルとしては固定されている ( それがブログのいいところでもある )。なので出来ることと言ったら、ちょっとしたカスタマイズぐらいで、その中身も細々としたものながらいろいろな機能を追加出来るとあって定期的に変更するのが楽しい。
基本的には細かい機能をたくさん付けると却って見づらくなり、翻って操作感にも悪影響を与えるので必要最低限のものだけを追加しているのだが、付け加えてきた機能を列挙しておかないとどこから持ってきたのか忘れてしまう。

ということで Movable Type 用の改造を少しリストしておくことにする。いずれ Movable Type のバージョンアップがある際に、「あれこのプラグインどこからもってきたんだったっけ?」とならないように自分のための備忘録みたいなものだ。


・カテゴリー名の表示

各エントリーはカテゴリー分けをしているのだが、これまで今読んでいるエントリーがどのカテゴリーに入っているのかは表示してこなかった。読んでいるエントリーと関連性のあるエントリーを読もうと思ってもこれじゃあ読めないわけだ。特に僕のブログは僕の頭の中のように支離滅裂な話題を取りあげているのでなおさら混乱の度を深める。そこで各エントリーのタイトルのしたにカテゴリー名を表示することにした。

これを実現するのはあまりにも簡単で改造とは言えないかもしれないが、とりあえず紹介しておこう。テンプレートに数行書き足すだけで実現出来る。

変更箇所はいくつかのテンプレートで、ここではメインページをサンプルとして取りあげよう。

僕のメインページテンプレートではこんな風にエントリータイトルが表示され、その下にエントリー本文が表示されるようになっている。

<h3><$MTEntryTitle$></h3>

<$MTEntryBody$>

今回カテゴリー名をタイトルの次の行に表示させたいので、下に強調表示した行を追加する。

<h3><$MTEntryTitle$></h3>

<br /> <div class="category">カテゴリー [ <MTEntryCategories glue=", "> <a href="<$MTCategoryArchiveLink$>"><$MTCategoryDescription$></a> </MTEntryCategories>]</div>

<$MTEntryBody$>

これと似た行が個別アーカイブ、日別アーカイブなどのテンプレートにあるので、好みに応じて ( つまり個々のエントリー毎や月別エントリー表示のページでカテゴリー名を表示させたければ ) 上の強調ラインを追加すればよい。
テンプレートの編集を終え、保存したらリビルドを忘れずに。

・コメントやトラックバックのツリー化

ここ、New York Watch のサイドバーで「最新のコメント」と「カテゴリー」の項目で使用しているのが「小粋空間」さんで紹介してくれている「maketree.js 1.01」
コメントがツリー化されすっきりした。また Movable Type ではサブカテゴリの階層化が可能になったので、これまたカテゴリー一覧表示もツリーによりだいぶ見やすくなった。
ただし New York Watch の兄弟サイト、「ヨシュラン」ではカテゴリーが親-子-孫の三世代以上になるので、同じく「小粋空間」さんが公開予定としている「折りたたみ」の方を利用する予定だ。

maketree.js

小粋空間

maketree.js のダウンロードが可能なページ




これからも Movable Type を利用していろいろなプラグイン ( 部品 ) を試していく予定。少しでも便利になったとか、見やすくなれば、嬉しいのだが。

最初、学術・研究・軍事の目的で開発、利用されてきたインターネットが学校や職場で使えるようになり、さらにコンピュータを私生活でもよく使う人は早くからインターネットを導入してきた。
そのうち一家に一台の PC になり、いまや1人1台、いや1人でn台のコンピューティング環境を持つ、というのも決して珍しくなくなり、インターネット利用のすそ野は大きく広がった。
1人n台というのは大げさな話ではなく、自宅の PC でもちろんインターネット接続するだけでなく、今や携帯電話、PDA でも接続が可能だ。車の中でカーナビ経由で使えるインターネットはもっと普及するだろうし、いずれデジタルカメラなど普段持ち歩くものにも標準装備されるかもしれない。

インターネットがコンピュータ好きな人たちの間で使われているときはまだ「パソコン通信」のイメージが世間一般には多く、今ほどインフラが整っているわけでもなく、もちろんインターネットバンキングなどもなかった。それが今やほとんどのサービスがインターネットで受け連れられるようになり、この傾向はますます進むと思われる。

それにつれて自宅にダイレクトメールが舞い込む様にインターネットでも広告産業がにぎやかになってきた。それだけ生活に根ざした一つの通信手段になってきたからだと思う。
当初はメールとして送られてくる広告 ( スパムメール ) だけだったのが、最近はブログブームを反映してかブログに着くコメントやトラックバックまで利用して広告を貼り付けにくるほどだ。
僕がこの New York Watch のブログシステムとして利用している Mobable Type もそういったスパムコメントやスパムトラックバックに対応するため、大きなバージョンアップがあった。それが version 3.0だ。
ここ New York Watch でもいろいろなスパムが投稿されるので、早くから3.0をインストールし、さらにver 2.6x の時代からコメントが投稿されればすぐにメールで僕のところに通知されるように設定して注意を払ってきた。
ところが 2.6X から ver 3.11-ja にインストールし直したときに、なぜかメール通知機能が働かなくなってしまった。
このときはあまり詳しく調べず、単に google で検索してみると「2.6Xなど過去の Movable Type から lib/MT/Mail.pm を抜き出して、上書きすれば動作した」という他のユーザの書き込みが見つかった。そこでこのときは対処方としてこれに従って同じ事をやってみた。
もちろんこれで動くようになったのだが、今回、3.11-ja から3.15-ja へとアップグレードをするとやはりコメント通知機能が動作しなくなった。

そこで今回はもうちょっと詳しく調べてみようとググって見ると、どうやらこの現象は日本人にだけ起きていることがわかった。米国ではこの問題は報告されていないのだ。
今回のアップグレードでもやはり Mail.pm というモジュールが書き換えられているので、このファイルをエディタで開いてみて納得。
日本語環境で使用している場合に、メールの From: や Subject: の部分をエンコードしている部分があり、どうやらこのエンコードが正しく行われていないためにメールが送出できなくなっているようだった。
ググって見るとこれに気が付いている人たちがすでに対処法をのせている。僕が参照させてもらったのは「MT3.0以降でのメール文字化け修正」というブログのエントリだ。
こちらでは、文字化けという形で問題が出ているが、僕の場合は sendmail か Postfix とのハンドシェイクで失敗しているようでそのためにメールが送られない、とそれぞれ現象は違うがこの方の修正方法で僕の方も正しく動くようになった。

修正部分というのは lib/MT/Mail.pm ( 3.15-ja 版 ) の41行目の
$hdrs->{Subject} =~ s/\r?\n/\r\n/g;
という行をコメントアウトしてしまうこと。具体的には行頭に「#」を加えるだけだ。
すると付近の行のイメージはこんな感じになる。

if ($mgr->DefaultLanguage eq 'ja') {
my $enc = $mgr->PublishCharset;
$body = MT::I18N::encode_text($body,$enc,'jis');
$hdrs->{Subject} = MT::I18N::encode_text($hdrs->{Subject}, undef, 'jis');
$hdrs->{Subject} = Jcode->new($hdrs->{Subject}, 'jis')->mime_encode;
# $hdrs->{Subject} =~ s/\r?\n/\r\n/g;
$hdrs->{'Content-Type'} = qq(text/plain; charset="iso-2022-jp");
$hdrs->{'Content-Transfer-Encoding'} = "7bit";
}

僕の環境ではこれだけでメールの送信が正しく行われるようになったので、似たような現象で悩んでいる人は試してみては?

それにしても「デフォルト言語が日本語なら」という分岐部分なので、確かにこれなら日本人にしか起きない問題なわけだ。

ということで無事 Movable Type 3.15 にアップグレード完了。これからもご声援お願いします。

朝一番出社後にするのはまずコーヒーを飲むこと。

嬉しいことに昨年からはエスプレッソも飲めるようになったので、一番香りの強いこのエスプレッソで重い頭をしゃきっとさせる。
そのあとは仕事のメールのチェックをしながら日本のサイトなどを見て回るのだが、その中の一つに PC Watch がある。今日はその PC Watch の姉妹サイト、Internet Watch の記事タイトルを斜め読みしていたときに、ぱっと目に止まった記事があった。
それがこの Movable Type 3.15日本語版のリリースを伝える記事だった。

僕が New York Watch で使っている Movable Type は当初 version 2.65 英語版を日本語化して使っていたのが、そのうちブログブームが日本でもおき、開発元の Six Apart も日本法人を構えるまでになった。そして待望の日本語版がリリースされたので、総入れ替えをしたのだが最近になってそのバージョンに脆弱性が発見されたのと、新しいバージョンではリビルドにかかる時間が短くなったとあって新バージョンの日本語版リリースを心待ちにしていたのだ。
ちなみに日本法人シックスアパートの会長、伊藤氏とは15~6年前に知りあってその後自宅にお邪魔したことも。僕と同世代のとても気さくな人だ。

ということで今夜はアップグレード作業をすることに専念して、今日のブログエントリは一回休みとさせて貰おう ( 正確にいうとこれもエントリだが ) 。
うまくアップグレードが完了したら、無事これまでと変わらぬ姿で表示されるはず。さて取りかかるとするか。


Movable Type

シックスアパート公式サイト

3.15のダウンロードはこちらから
http://www.movabletype.jp/archives/2005/01/movable_type_31_4.html

New York で行われている共和党大会にちなんで、New York で見られるシーンを毎日紹介しているのだが、今日は嬉しくてもう一つ別の話題もエントリーしておこう。

8月中になんらかの進展があるはず・・・と思っていた Movable Type だが、やきもきしていたらなんと8月最後の今日になって3.1がリリースされた。
7月26日にアナウンスがあり、「画面のサンプルなど近いうちに見せられる」と言っていたのだが、画面が出てこないので「リリースも遅れるのかな」と思っていたのだ。
なのでダウンロードできる形でリリースされたのは嬉しい誤算。

Movable Type 3.1の新機能については以下のページで見られるが、なんと行っても僕にとっては「サブカテゴリ」のサポートが嬉しい!

http://www.movabletype.org/features.shtml

ということで休眠中の「ヨシュラン」サイト復活に向けて一歩ずつ歩き出したのだ・・・。
問題は日本語版を待ってインストールするかどうか。

1

カレンダー

<  2011年12月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

このアーカイブについて

このページには、過去に書かれたブログ記事のうちMovable Typeカテゴリに属しているものが含まれています。

前のカテゴリはLIFE in NYです。

次のカテゴリはNYローカルです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

OpenID対応しています OpenIDについて
Powered by Movable Type 4.21-ja