月別アーカイブ: 2008年6月

Firefox3!

ついに来ましたFirefox3。全世界が待ち望んでいた(?)日です。そんなわけで早速ギネスに貢献してきました。私が見たときでは一分間に5000回ダウンロードという数字を出していました。

まず使った感想は、早い!軽い!です。Gmailがトップスピードで開きます。メモリ使用量も改善され、私の環境ではFirefox2が使うメモリのピーク時の半分以下になってます。

これだけではなくまだまだ盛りだくさんなのですが、詳しいことは後でポストしたいと思います。

trac-post-commit-hookをDreamHostで使う

SVNのログでチケットの操作ができるとっても便利なtrac-post-commit-hookですが、DreamHostで使うには難がありました。
最大の難点は post-commit が dhapacheというユーザーで実行されるということで、これが数々の問題を引き起こします。
色々と実験して解決策を見つけたのでポストします。
なお、解決策は SQLite を使っている場合と MySQL を使っている場合で異なります。

SQLite と MySQL の共通 post-commit

コミット後にスクリプトを実行するため、/home/***/svn/projectid/hooks に post-commit という名前のファイルを作成します。
このファイルがコミット後に実行されるわけですが、dhapache によって実行されるため環境変数の再設定が必要になります。
それなので、.bash_profile などから必要な変数をコピーします。
そして、trac のソースの contrib ディレクトリから trac-post-commit-hook を post-commit と同じディレクトリにコピーします。
さらにsvn_commit_jp.mdから svnlog2utf8 を取得してパスの通るところに置いて実行権を与えます。

post-commitの例(パスなどは適宜変えてください):

#!/bin/sh

HOME='/home/***'
export PYTHONPATH="$HOME/local/lib/python: $HOME/local/lib/python/site-packages"
export LD_LIBRARY_PATH="$HOME/local/lib"
export PYTHON_EGG_CACHE="$HOME/tmp"
export PATH="$HOME/local/bin:$PATH"

REPOS="$1"
REV="$2"

LOG=`svnlook log -r $REV $REPOS | svnlog2utf8`
AUTHOR=`svnlook author -r $REV $REPOS | svnlog2utf8`
TRAC_ENV="$HOME/trac_sites/projectid/"
TRAC_URL="http://trac.example.com/projectid/"

python $REPOS/hooks/trac-post-commit-hook \
-p "$TRAC_ENV" \
-r "$REV" \
-u "$AUTHOR" \
-m "$LOG" \
-s "$TRAC_URL"

SQLiteの場合

SQLiteの場合は dhapache が trac のディレクトリの /db/trac.db(デフォルト) へアクセスする権限を持っていないため、エラーになります。
この場合は trac.db に「chmod o+rw」するしか方法がないと思います。書き込み権限を与えるのはやだなと思うときはMySQLの移行も考えてください(MySQLへのパスワードも dhapache が読み取れる必要があるので同じっていえば同じですが)。

MySQLの場合

MySQLの場合は、上で設定した「PYTHON_EGG_CACHE」の値が dhapache が書き込みできるディレクトリを指定していて、trac.ini を読み込めればOKです。

SQLite から MySQLへの移行

SQLite から MySQLへの移行は SqliteToPgScript を使うと便利です。
SqliteToPgScript でMySQLインポートしたら、trac.ini の database の指定を「mysql://user:password@host/database」のようにすればOKです。

CakePHPのfindでのBETWEEN

6/4にCakePHPの1.2RC1が出ましたが、そこでBETWEENの挙動が変更になったのでメモ。

以前は

$conditions = array(
    'Model.field' => 'BETWEEN ' . $start . ' AND ' . $end
);

でBETWEENができましたが、RC1ではANDの両側にクォーテーションマークが付かなくなって、上記のコードではエラーがでます。そこで以下のコードでうまくいきます。

$conditions = array(
    'Model.field >=' => $start,
    'Model.field <=' => $end
);

ちょっとハマったので気をつけましょう。

CakePHP 1.2 RC1からfindの条件指定方法が変更となった – Technote – by sizuhikoにて詳しい解説がありました。「?」がコツのようです。