週末は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が動くようになりました!