MovableType: 2009年1月アーカイブ

以前、「MTOS 4.23-ja で run-periodic-tasks を実行すると」というエントリーで書いた、MovableType の Perl モジュールへのパスが通ってない件。(相対パスで指定されており、cron で実行したとき、正しいパスとならない)

crontab に run-periodic-tasks を、

*/5 * * * * /var/www/html/mt/tools/run-periodic-tasks

と登録していたが、

*/5 * * * * cd /var/www/html/mt; ./tools/run-periodic-tasks

とするのが MovableType の正しい流儀のようだ。

確かにこれなら、相対パスでも Bootstrap.pm や MT.pm を見つけることが出来る。

Movable Type 4 ドキュメントの「指定日投稿や公開キュー等のスケジュール処理の設定」にも、例としてそう書かれていた。
ドキュメントはちゃんと読むべきだなあ。(いまさら)

作業メモ。

今回は 3.21-ja の環境は残しておき、4.23-ja の環境でテストをして問題なければ(テンプレート等の修正が必要であればそれを行った後)移行を行いたい・・・という要件だったので、以下のような手順を取った。

0.現行の環境<現行ブログ(3.21-ja)>
 ・管理画面
 /var/www/mt1(http://www.exsample.com/mt1/
 ・公開ディレクトリ
 /var/www/blog1(例:http://www.exsample.com/blog1/testblog
 ・DB名
 mt1db
1.現行のDBをバックアップ&リストアし、現行とは別名で DB 作成(例:mt2db)。
2.現行の環境(管理画面、公開コンテンツ等)を別名でコピー(3.21-ja)テスト用の環境作成<テストブログ(3.21-ja)>
 ・管理画面
 /var/www/mt2(http://www.exsample.com/mt2/
 ・公開ディレクトリ
 /var/www/blog2(例:http://www.exsample.com/blog2/testblog
 ・DB名
 mt2db
3.4.23-ja を新規インストール。DB は新規に作成したダミーのDB(例:mt3db)を使用。<新ブログ(4.23-ja)>
 ※インストール作業は、ユーザ登録、最初のブログ作成までちゃんと行うこと。後で消しちゃうけど。
 ・管理画面
 /var/www/mt3(http://www.exsample.com/mt3/
 ・公開ディレクトリ
 /var/www/blog3(例:http://www.exsample.com/blog3/testblog
 ・DB名
 mt3db
4.新ブログの mt-config.cgi を修正し、DBを mt2db に変更。
5.新ブログの管理画面にアクセスし、DB の更新処理を実行。(自動実行される)
6.新ブログの管理画面で、各ブログを再構築。
7.新ブログの公開ページ(例:http://www.exsample.com/blog3/testblog)にアクセスし内容を確認し、足りないものがあればコピー。
 (例えば、mt-static の下にタイトル画像などを置いている場合)
8.プラグインのインストール。(但し、4.23-ja 未対応のプラグインがある場合は、残念ながらアンインストール(手動でテンプレート等修正))

以上。
テストブログは作成しなくてもよかったのだが、今回はもしかしたら現行を触って確認するケースが出てくるかもと、念のため作成した。(結局、必要なかったけど(^^;)

これで、お客さんにてチェックがすんだ段階で、

0.ブログの更新中止。
1.現行のDBをバックアップ&リストアし、新DB(mt2db)を最新に。
2.ディレクトリ名を変更。(現行を *_old のようにして、新ブログを現行のディレクトリ名に変更)
3.crontab 等のパスも変更。
4.Apache の再起動。(必須)
5.新ブログの管理画面にアクセスし、DB の更新処理を実行。(自動実行される)
6.新ブログの管理画面で、各ブログを再構築。(公開パス変更)

という作業を行い、移行終了・・・のはず。

この後、

1.テストブログ(/var/www/mt2 や /var/www/blog2)を削除。
2.ダミーDB(mt3db)を drop する。

という作業を行い、全ての作業終了となる予定。現行DBは念のため、しばらく取っておく。
2,3ヶ月置いておいて、何も起きなければ現行ブログのディレクトリとともに、削除してかまわないだろう。

・・・て感じかな。

MovableType 3.21-ja から MTOS 4.23 へアップグレードした環境での MailPack プラグイン(v1.6)の利用にて。

携帯から投稿したエントリーの日本語が化ける!!
ちなみに、PublishCharset が 'Shift_JIS' のサイトでの出来事である。

原因は、create.pm で変換後文字コードを決めるために PublishCharset を参照しているところ。
PublishCharset が 'Shift_JIS' と指定されていれば変換後コードを 'sjis' と指定するようになっているが、mt-config.cgi の中では 'shift_jis' と指定されているので(つまり 'Shift_JIS' とは違うので)、「その他の文字コード」という判断になり、Unicode(UTF-8)に変換されてしまうのである。

mt-config.cgi の記述を直すのが本道だとは思うが、その他のプラグインや MTOS では 'shift_jis' を正しく「シフトJIS の指定文字列」と認識しているようなので、MailPack でも 'shift_jis' を 'sjis' と判断するよう create.pm を修正した。

実は、MovableType 3.21-ja の mt-config.cgi を引き継いでいるのだが、この中で例として出ている Unicode の指定が 'utf-8' という具合に全部小文字なのだ。それを見てシフトJISの指定をしたので、'shift_jis' と全部小文字になっているわけだ。
(ちなみに、この 'utf-8' という指定も、create.pm の中では Unicode と認識してもらえず('UTF-8' と書かないと駄目)、「その他の文字コード」扱いになってしまうのだが、「その他の文字コード」の場合は変換後文字コードが Unicode なので、結果としてオッケーなのだ)

つーことで、create.pm 修正しちゃったので、開発元のサポート受けられないんだろうなあ。ま、あんまり必要ないけど・・・

MTOS に MailPack plugin を入れるのに、いくつかの Perl モジュールもインストールしないといかん。

WebARENA SuitePRO V2 のサーバ(CentOS 4.7 x86_64)の場合、以下のようなモジュールのインストールが必要だった。(この順にインストールしていけばいい)

IO-stringy-2.110
Pod-Escapes-1.04
Pod-Simple-3.07
Test-Simple-0.81_02
Test-Pod-1.26
TimeDate-1.16
MailTools-2.04
MIME-Base64-3.07
MIME-tools-5.420_02

あと、おまけで、
IO-1.2301

IOがらみのトラブルの話は
http://blog.netandfield.com/shar/2009/01/iofilebinmode.html
にて。

MovableType の MailPack plugin のメール取得処理で、

[MailPack] listner.pm Can't locate object method "binmode" via package "IO::File" at /usr/lib/perl5/site_perl/5.8.5/MIME/Body.pm line 437.

というエラーが出てしまう。
確かに、/usr/lib64/perl5/5.8.5/x86_64-linux-thread-multi/IO/File.pm を見てみると、binmode なんてメソッドは無い。

なので、CPAN から最新のソース(http://search.cpan.org/CPAN/authors/id/G/GB/GBARR/IO-1.2301.tar.gz)を取ってきてインストールしてみた。(最新つっても、2006/3/26 fix ですよ。枯れてるなぁ(^^;)

# grep binmode /usr/lib64/perl5/5.8.5/x86_64-linux-thread-multi/IO/File.pm
<略>
sub binmode {
    ( @_ == 1 or @_ == 2 ) or croak 'usage $fh->binmode([LAYER])';
<略>

をを、ちゃんと binmode が存在してるじゃないすか。グー。

CentOS 4.7 の File.pm は相当古いんじゃねえ。

MTOS 4.23-ja で、cron に run-periodic-tasks を登録して実行すると、MT/Bootstrap.pm と MT.pm が見つからないってエラーが出るね。
cron 実行時のカレントディレクトリからのパスが通ってないようで。

Can't locate MT/Bootstrap.pm in @INC (@INC contains: lib ../lib /usr/lib64/perl5/5.8.5/x86_64-linux-thread-multi <略> .) at /var/www/html/mt2/tools/run-periodic-tasks line 44.

とか、

Can't locate MT.pm in @INC (@INC contains: /var/www/html/mt/tools/lib /var/www/html/mt/extlib <略> .) at /var/www/html/mt2/tools/run-periodic-tasks line 45.

とか。

ずいぶん前から既知のエラーのようだけど、未だに直ってないんだなあ。

ググってみると、強引に /usr/lib/perl5/5.8.5 の下とかにファイルをコピっちゃうという話が出てたが、それはあんまりだと思うので、取りあえずシンボリックリンクを張ってみた。

# ln -s /var/www/html/mt/lib/MT /usr/lib/perl5/5.8.5/MT
# ls -la /usr/lib/perl5/5.8.5/MT
lrwxrwxrwx  1 root root 24 Jan 15 11:36 /usr/lib/perl5/5.8.5/MT -> /var/www/html/mt/lib/MT
# ln -s /var/www/html/mt/lib/MT.pm /usr/lib/perl5/5.8.5/MT.pm
# ls -la /usr/lib/perl5/5.8.5/MT.pm
lrwxrwxrwx  1 root root 27 Jan 15 11:42 /usr/lib/perl5/5.8.5/MT.pm -> /var/www/html/mt/lib/MT.pm

取りあえず、これで run-periodic-tasks は問題なく実行されているようだ。

MovableType 4.1 では問題なかったので、MTOS の問題なのか?それとも、4.2 以降のバージョンで出てきた問題なのか???