Archive for 8月, 2007

MacOSX(Tiger)でMovable Typeを動かす

Movable Typeでいろいろ試したいことがありましたが、実稼働しているblogで大きなテストをするのは危険ということでMacOSXでテスト用にMovable Typeを動かすことにしました。
前提として
- apaceh2
- mysql5
- perl
- php5
などがmacportsでインストールされている状態です。
データベースはXREAからバックアップをとっているのがあるので、XREAで使っているのと同じユーザ名をつくって、

#cd
#mysqladmin5 -u root -p create makotokw
#mysql5 -u root -p
> use makotokw
> alter database default character set utf8 collate utf8_general_ci;

として、
(あとで気がつきましたが、テーブルは全部shift-jisでした。。。)

# /opt/local/bin/mysql5 -u root -p makotokw < /tmp/mysqldb.dump

でok
まんまMovable TypeディレクトリをMacOSXに放り込んでいけるかなと思いましたがログインすると

Got an error: Can't locate object method "configure" via package "MT::ObjectDriverFactory" at lib/MT.pm line 852

という表示になりました。
mt-check.cgi
を表示してみるとモジュールが表示されません。
apacheのログを見ると

Use of uninitialized value in subroutine entry at /opt/local/lib/perl5/site_perl/5.8.8/darwin-2level/DBI.pm line 1242.
Use of uninitialized value in subroutine entry at /opt/local/lib/perl5/site_perl/5.8.8/darwin-2level/DBI.pm line 1242.
Use of uninitialized value in subroutine entry at /opt/local/lib/perl5/site_perl/5.8.8/darwin-2level/DBI.pm line 1242.
Undefined subroutine &DBD::mysql::db::_login called at /opt/local/lib/perl5/site_perl/5.8.8/darwin-2level/DBD/mysql.pm line 142.
at /usr/local/arcadia/web/com.makotokw/www/mt/lib/MT/ObjectDriver/Driver/DBD/mysql.pm line 49

というエラー。DB系で失敗しているみたいです。
そもそも、この環境には
/usr/bin/perl

macportsで入れた
/opt/local/bin/perl
が共存していました。
mt-check.cgiの一行目の

#! /usr/bin/perl

#! /opt/local/bin/perl

したところ続々エラーが表示されました。
必須モジュールである(MySQLの)DBドライバが入っていません。
そこで

# export  FTP_PASSIVE=1
# sudo perl -MCPAN -e shell
> install DBI
> install DBD::mysql

でインストールしてみたもの、、、DBD::mysqlがインストールできません。
macports以前に入れたmysqlをアンインストールしてみました。

# cd /usr/local
# sudo rm -rf mysql*
# cd /Library/PreferencePanes/
# sudo rm -rf MySQL.prefPane/

やっぱりだめ。
検索してみると・・・
http://www.r-styles.net/mt-archives/2006/02/movabletype_on_macosx_with_mys.html

先ず、「cpan>」に続けて「install DBD::mysql」と入力して実行する。が、恐らく失敗するので、「exit」と入力して CPAN を終了する。

どうもMacOSXでは失敗するのが当たり前のようになっているようです。が探してみても、/opt/local/...で始まる人がいないので正直不安に。。。皆さんMAMPとか使ってるのかな?
結局ここを参考に
http://jayallen.org/journey/2006/04/dbd-mysql-build-problems-on-mac-book-pro

cd ~/.cpan/build/DBD-mysql-4.005
sudo perl Makefile.PL --cflags="-I/opt/local/include/mysql5/mysql" --libs="-L/opt/local/lib -L/opt/local/lib/mysql5/mysql -lmysqlclient -L/opt/local/lib -lz -lm  -L/opt/local/lib -lssl -lcrypto" --mysql_config="/opt/local/bin/mysql_config5"
sudo make
sudo make test
sudo make install

でいけました。
さて、mt*.cgiの#! /usr/bin/perlを#!/opt/local/bin/perlに書き換えるのは面倒なので

# mv /usr/bin/perl /usr/bin/perl.bak
# ln -s /opt/local/bin/perl /usr/bin/perl

とシンボリックリンクを張ることに。
無事、ログインできました。Dashboardから最近の記事が表示されているのでDBの読み込みも問題なさそうです。
再構築したところスタイルシートがぼろぼろになりました。
mt-config.cgiおよびブログの設定の「公開」のところで、URLを変えておかないといけなさそうです。

IE6でDigest認証でこける

最近VistaからXPをメインに使い出しましたが、OSが変わったことによりBrwoserもIE7からIE6にバージョンダウンし、Digest認証するとパラメータありのURLでエラーになる問題に遭遇しました。
apacheのログには

Digest: uri mismatch - ... does not match request-uri ..., referer: ...

というエラーがあります。urlにパラメータがあるとことごとく失敗する模様。
調べてみると結構有名なバグらしく、いろんなサイトで

BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On

と書くとokだよとか、書いたらいけたぜ!と載ってました。
ただAuthとかHackとか書いたパラメータを何も考えずに入れるのは怖いのでこの設定の意味を調べることにしました。
すると
http://httpd.apache.org/docs/2.0/mod/mod_auth_digest.htmlにも「Working with MS Internet Explorer」ってタイトルで思いっきり書いてありました。Apache様がIEのバグ回避のために作ってくれた設定です。
本家公認の設定なので一安心。

subversionでどこでもプライベートプロジェクトを開発する

tracと同時にsubversionも入ったので、trac用の公開レポジトリとは別に個人開発用のレポジトリもつくってみました。家からつながったのに会社からつながらない。ローカルのPrivate IPだけを許可したような記憶もなく、virhual hostの設定をみてもわからない。
と思ったら、svn用のドメインをDNSにレコード登録してませんでした。家からはhostsを書き換えて、private ip宛でつないでいたのでした。レコード登録したところうまくいきました。これで会社の開発マシンからもプライベートなプロジェクトの開発ができます^^

PostVoxに成功!

Movable Type 4.0にして、PostVoxもVersion0.7を入れ心機一転クロスポストするぜ!と調子に乗ってみたものの失敗。開発者カンファレンスで高山さんと知り合ったのでメールでやりとりしつつ、ついにPostVoxプラグインが動きました。
さて、今までうまく動かなかった原因ですが、プラグインの中でエンドポイントをデータベースに保存して使い回しているのですが、どうやら3.3x時代に間違ったエンドポイント保存され、それを使い続けてしまったようです。どうやら正かろうが、間違っていようが最初に取得したエンドポイントが神様になってしまう模様。。。
PostVox.plの下の方に

sub reset_config

という関数がありこれで保存されてしまったデータをクリアできそうな雰囲気ですが、面倒なのでmt_plugindataテーブルの該当レコードを削除してやりました。
データベースなんか直接さわれないっ。て方は、PostVox.plの101行目(ver0,7の場合)の

my $apilink = $config->{vox_apilink};

という一行を

my $apilink = undef;

にしてしまえば、保存されたapilinkは無視され解決するのではないかと。こうするとポストの度にエンドポイントを探しにいくので少々冗長かもしれませんが、エンドポイントはサーバ側で変更されるおそれもあるので毎回取得しにいって良いと思います。
3.3x時代からずっとうまくいっていない方は同件の問題かもしれないのでお試しあれ。

trac & mylynでEclipseからチケットを管理

tracをインストールして喜んでいたもののできることといえばWikiの編集・・・これじゃPukiWikiでいいじゃん。ということになってしまうのでいよいよ開発環境としてのtracを実現しようと思います。
クライアントはEclipseです。
- チケットの管理はmylynを入れます
- Subversionクライアントとしてsubclipseプラグインを入れます
EclipseのPlug-inのインストールはなんなく終わりました。
さてmylynからtracのリポジトリを選択してもWebブラウザで表示するだけ・・・連携にはXMLRPCをつかうようです。が、そのためにtracにXML-RPCプラグインを入れないといけない模様。プラグインはここからダウンロードできます。http://trac-hacks.org/wiki/XmlRpcPlugin
が、ほかのプラグインと同じとか、easy_installとかいわれてもわからず・・・まずはtracのplug-inの原理を調べてみることにしました。
eggって何ですか?
http://peak.telecommunity.com/DevCenter/PythonEggsによるとEggs are to Pythons as Jars are to Java…”。わかりやすい。
eazy installって何ですか?
http://peak.telecommunity.com/DevCenter/EasyInstall
ようはphpのpearみたいなものと解釈しました。
では早速easy_installを入れみることにします。

# wget http://peak.telecommunity.com/dist/ez_setup.py
# sudo python ez_setup.py
Setuptools version 0.6c6 or greater has been installed.

すでにインストールされているようです。バイナリは下記場所に入ってました。

/opt/local/bin/easy_install

ようやくスタート地点に戻ってきました。
xmlrpcpluginをインストールします。
WindowsマシンからファイルをDLして
ftpでファイルをコピー
/opt/local/src/xmlrpcplugin-r2593.zip
におきます。
zipを解凍してインストールします。

# cd /opt/local/src/
# unzip xmlrpcplugin-r2593.zip
# sudo easy_install xmlrpcplugin/0.10
Processing 0.10
Running setup.py -q bdist_egg –dist-dir /opt/local/src/xmlrpcplugin/0.10/egg-dist-tmp-V-J_nO
Adding TracXMLRPC 0.1 to easy-install.pth file
Installed /opt/local/lib/python2.5/site-packages/TracXMLRPC-0.1-py2.5.egg
Processing dependencies for TracXMLRPC==0.1
Finished processing dependencies for TracXMLRPC==0.1

最後に設定

You will also probably need to enable the plugin in your environments trac.ini:
[components]
tracrpc.* = enabled

えっと、デフォルトのtrac.iniってどこにあるんでしたっけ?http://trac.edgewall.org/wiki/TracIniによると

Trac 0.9 and 0.10
Since version 0.9, Trac can also read the configuration from a global trac.ini file. These global options will then be merged with the environment-specific options, where local options override global options.
The global configuration is by default located in $prefix/share/trac/conf/trac.ini. It can be moved to a different location (for example, /etc/trac.ini), but that requires changing the file trac/siteconfig.py which gets created when Trac is installed.

でも/opt/local/share/tracにconfディレクトリがありませんです。
とりあえず、プロジェクトのtrac.iniに
[components]
tracrpc.* = enabled
を追加しました。
Eclipseから接続してみます。
Task Repository Settingsの
Addtinal Seetings
にてAccess TypeをXML-RPC PLuginを指定。
エラー500です。。。。
ふつーにWebで見てもエラーになっていました。.python-eggsを書く権限がないと起こられています。
.python-eggsって何だろう?と調べてみたところ、キャッシュファイルらしいです。
dotで始まるディレクトリなのでまぁDocumentRootにおいてもよいのですが、バックアップや配置を考えると違う場所においておきたいので/var/cacheにおきます。dotもとっちゃいます。

# sudo mkdir -p /var/cache/python-eggs
# sudo chown www:www /var/cache/python-eggs

次にvirtual hostに下記一行を入れます。

SetEnv PYTHON_EGG_CACHE /var/cache/python-eggs

cronでありがちな失敗

至極当たり前のことですが、たまーに新しいpcでcronを動かすと遭遇してしまうありがちな失敗です。
- 実行ファイルに実行権限がない
# chmod 0774 filename
とかしておきましょう。適切なownerでコマンドを実行することも忘れずに。
- パスが通っていない
ログインして実行した場合には環境変数のPATH(/usr/binなど)が有効になっているがcronから実行した場合はPATHが有効になっておらず、いつもは成功するコマンドが失敗したりします。
実行ファイルでPATHを通したり絶対PATHで書くのも良いですが混乱を避けるためcrontabにPAHT=も書いておきましょう。
# env
を実行してPATH=…の部分をcrontabの上の方に入れておけば
ログインして実行した場合と同じ挙動を得ることができるでしょう。
例)
PATH=/opt/local/bin:/opt/local/sbin:/bin:/sbin:/usr/bin:/usr/sbin

twitter APIの解釈ミス

twitter2mtを作成しようとして早速問題にぶち当たりました。
twitterの発言取得のAPIには
count: 何件取得するか(最大20)
since: この日時からの発言を取得する
といったパラメータがあります。
僕の頭の中ではこの二つのパラメータを利用して下の絵の青い部分を取得できると考えていました。取得したいのが赤いボーダーから青いボーダーの間にある発言だとして、sinceを現在に近づけながらcount件ずつ発言を取得していくつもりでした。
twitter-memo.png
が、実際に取れる部分は赤い部分なのです。つまり、sinceを指定しようがしまいが、APIで取れるのは現在からmax20件の発言だけなのです。sinceをいくら過去に指定しても20件より過去にさかのぼることはできないのです。。。完全に仕様を拡大解釈しておりました。
とりあえず自分の場合、1日20件以上も書いていないのでtwitter2mtに関しては問題なさげですが。sinceとcountと両方指定した場合はcountが優先になってsinceでのfilterが聞きません。結局のところsinceパラメータってtwitterクライアントが前回取得時刻からの追加の新規メッセージを取得するためにあるだけのようなきがします・・・