Windows + xampp + perl-addonによるMovable Typeプラグインの開発

週末はMT三昧でした。Movable TypeのJapan Hackathonにおいて開発環境の構築方法について聞いてきました。

また質問する前にxamppではperlはほとんど入っていない状態なのでxamppのperl-addonを入れてしまっていました。perl-addonのインストーラを落として実行しようとしたらxamppのapacheのバージョンが新しすぎて入らなかったので下記を参考にzipから設定しました。

XAMPP/5.Perlのインストール
さて、Japan Hackathonでは下記のようなお言葉をいただきました。

  • そもそもWindowsならIISを使うべし
  • ActivePerlならデフォルトで#!/usr/bin/perlが使える
  • Ubuntu入れてWindowsはWMWareで実行すべし

が、残念ながら僕の場合はWindowsのデスクトップアプリも開発しているし、そもそもxamppを入れたのもPHPを使うためであったりして、開発環境を作る際のスタート地点がだいぶ違うために、今からMTのために環境を作り直すのは厳しい状態です。

そんな中、有用な情報として、apacheのWindows版では、plファイルやcgiファイルの1行目の#!/usr/bin/perlを無視できる設定があると聞けました。

そこで、帰宅後いろいろ調べてみたところ、下記を見つけました。

ScriptInterpreterSource ディレクティブ
http://httpd.apache.org/docs/2.0/ja/mod/core.html#scriptinterpretersource
これを使うと用はWindowsの拡張子関連づけを使って実行モジュールを指定できるようになります。ただし、、、セキュリティ面ではリスクが高く、たとえば.htmlに対してサーバ上でIEを起動させるみたいなこともおこりえないとは限らないのでApaceh2 では Registry-Strict を指定すると良いとのことです。

Registry-Strict では拡張子関連付けで使うレジストリのShell\Open\Command ではなく
Shell\ExecCGI\Command だけを使うようになるのでリスクは下がるというわけです。

で、下記のようにmtのDirectoryディレクティブの中にScriptInterpreterSource Registry-Strictを追加。

<Directory "D:/Arcadia/Web/com.makotokw/blog/mt">
Options Indexes FollowSymLinks ExecCGI
AllowOverride All
Order allow,deny
Allow from all
ScriptInterpreterSource Registry-Strict
</Directory>

次に*.cgiファイルと*.plファイル対してC:\xampp\perl\bin\perl.exeで実行するようにShell\ExecCGI\Commandを追加。具体的には下記を.regファイルで保存して実行。

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.cgi\Shell\ExecCGI\Command]
@="C:\\xampp\\perl\\bin\\perl.exe %1"
[HKEY_CLASSES_ROOT\.pl\Shell\ExecCGI\Command]
@="C:\\xampp\\perl\\bin\\perl.exe %1"

これで、いちいち*.cgiファイルを書き換えなくても共通のソースでローカルでMTが実行できるようになりました。当然、mt-config.cgiの変更とmt_blogテーブルのblog_site_urlの書き換えは必要ですが、mt-config.cgiはあらかじめ用意しておいたファイルでrenameするだけですし、blog_site_urlはMySQLでデータベースをリストアした後に下記SQLを実行するだけなので対して手間ではないです、

update mt_blog set blog_site_url='http://blog-local.makotokw.com' where blog_site_url='http://blog.makotokw.com';

あと残っていたのは文字化け問題なのですが、mysqlのstatusコマンドを実行したところ、xamppの初期の文字コードの設定がlatin1になっていました。my.cnfを書き換えた記憶がなかったので、設定することにしました。

xamppのMySQLのmy.cnfは、

C:\xampp\mysql\bin\my(.cnf)

の模様です。(拡張子表示する設定なのに何故かエクスプローラー上で.cnfは表示されない)
これに下記を追加。

[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci
skip-character-set-client-handshake
[mysql]
default-character-set = utf8

これで文字化けが直ったのですが、そもそもdumpしたサーバの元のデータベースのコードがsjisになっているんです。で何故latin1で文字化けして、utf8で文字化けしなかったか。dumpしたsqlを見ると一目瞭然なのですが・・・tableやclumnはsjisの設定になってるのに肝心のデータはutf8で入ってしまっているようです。

ちなみにmt-config.cgiにPublishCharsetを指定しない場合、デフォルトはutf8になります。

当然指定してなかったので最初からutf8で保存されていた模様。逆に何故サーバのtableの文字コードがshisになっていたかですが、レンタルサーバなので最初からsjisだったのかもしれないし、もう記憶がないのですがsjisで作成してしまったのかもしれません。

いずれにせよ気持ち悪い状態なのでutf8に文字コードを変更することにしました。データ自体はutf8で入っているので、データは変更せずにDatabaseとTableのchasetを変更するだけ、こういう場合文字コード変換が走らないようにいったんcolumnの型をbinaryに変えてからutf8にすると良いらしんですが、colmnが多いくて全部をalter tableするのは
非常に面倒だったので・・・dumpしたsql文のsjisをutf8に置換してそのままリストアしてやりました。

これで文字化けも文字コードの気持ち悪い相違も解決してローカルでMovable Typeが動くようになりました!