2009年11月25日水曜日

vsftpd設定メモ

いつも設定がわからなくなるので、メモっておきます。

umaskの設定

groupに書き込み権限を与える場合

file_open_mode=0666
local_umask=002

chrootの設定

chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
/etc/vsftpd.chroot_list に、chroot しない ユーザを列挙する

2009年11月8日日曜日

Trac:ポップアップカレンダーで日付を入力

TracDecoratorPluginでポップアップカレンダー入力

TracDecoratorPluginを使用することで、ポップアップカレンダーからの入力ができるようになります。

TracDecoratorPlugin のインストール

インストールはプロジェクトページのインストール方法どおりでOKです。ここでは trac0.11.5ja を使用していますので、trunk を取得します。インストール後に httpd を再起動すると、プラグインが有効になります。

$ svn co http://svn.sourceforge.jp/svnroot/shibuya-trac/plugins/decoratorplugin/trunk
$ cd trunk/
$ python setup.py bdist_egg
# cp dist/TracDecoratorPlugin-0.3.1-py2.4.egg /home/trac/test/plugins/
# /usr/local/apache2/bin/apachectl restart
0.11系ではデフォルトで TracGanttCalenderPlugin の開始日/終了日(due_assign, due_close)のポップアップカレンダー入力が有効になりますので、設定は不要です。それ以外のカスタムフィールドに使用するには、以下の書式で trac.ini に指定します。

[decorator]
calendar_fields=due_assign,due_close

2009年10月25日日曜日

MySQLのインストール

MySQL5.xのインストール

いつもインストールのやり方を忘れてしまうので、メモしておきます。ここではコンパイル済みバイナリを使用し、CentOS5 にインストールしています。

インテルのCPUで実行する場合は、gccよりもインテルCコンパイラでコンパイルされたバイナリ *1 の方が速い、といわれてますので、それを使用します。

# groupadd mysql
# useradd -g mysql mysql
# cd /usr/local
# tar zxvf /path/to/mysql-VERSION-OS.tar.gz
# ln -s full-path-to-mysql-VERSION-OS mysql
# cd mysql
# chown -R mysql .
# chgrp -R mysql .
# scripts/mysql_install_db --user=mysql
# chown -R root .
# chown -R mysql data
# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
# chkconfig --add mysqld
# chkconfig mysqld on
4.1まではバイナリを展開するだけだったのですが、5.xからは "scripts/mysql_install_db --user=mysql" を実行するようになったようです。

参考URL: http://dev.mysql.com/doc/refman/5.0/en/installing-binary.html

my.cnf の設定

my.cnfを作成し、default-character-set を設定します。my.cnf は同梱のものを利用し、必要に応じて変更します。ここではアプリケーションのインストールテスト *2 という小規模な用途でしたので、my-small.cnf を使用しました。

# cp /usr/local/mysql/support-files/my-small.cnf /etc/my.cnf
# vi /etc/my.cnf

 -----------------------------------
 [mysqld]
 default-character-set=utf8  ←追加
 -----------------------------------

# /etc/init.d/mysqld restart
# 
$ su - mysql
$ mysql -uroot --default-character-set utf8 -p

mysql> SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | utf8   |
| character_set_connection | utf8   |
| character_set_database   | utf8   |
| character_set_filesystem | binary |
| character_set_results    | utf8   |
| character_set_server     | utf8   |
| character_set_system     | utf8   |
+--------------------------+--------+
7 rows in set (0.00 sec)

mysql>

キャラクタセットの指定

ターミナルから mysql コマンドで接続して sql を実行すると、日本語が文字化けします *3。これは、mysql のキャラクタセットが指定されてないからです。デフォルトでは、以下のような感じです。

mysql> SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | latin1 |
| character_set_connection | latin1 |
| character_set_database   | utf8   |
| character_set_results    | latin1 |
| character_set_server     | latin1 |
| character_set_system     | utf8   |
+--------------------------+--------+
6 rows in set (0.01 sec)

mysql> select entry_id, entry_class, entry_text from mt_entry where entry_class = 'page';
+----------+-------------+--------------------+
| entry_id | entry_class | entry_text         |
+----------+-------------+--------------------+
|        4 | page        | ?????????????????  |
+----------+-------------+--------------------+
1 row in set (0.01 sec)

mysql> 

キャラクタセットを指定すると、OK。

mysql> SET CHARACTER SET utf8;
Query OK, 0 rows affected (0.01 sec)

mysql> SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | utf8   |
| character_set_connection | utf8   |
| character_set_database   | utf8   |
| character_set_results    | utf8   |
| character_set_server     | latin1 |
| character_set_system     | utf8   |
+--------------------------+--------+
6 rows in set (0.00 sec)

mysql> select entry_id, entry_class, entry_text from mt_entry where entry_class = 'page';
+----------+-------------+------------------------------------------------------+
| entry_id | entry_class | entry_text                                           |
+----------+-------------+------------------------------------------------------+
|        4 | page        | 地震だ。でかいぞ。もうだめだ。><                   |
+----------+-------------+------------------------------------------------------+
1 row in set (0.00 sec)

mysql>

また、起動時に指定することもできます。

$ mysql -uroot --default-character-set utf8

マニュアルだと、このあたりです。
http://dev.mysql.com/doc/refman/5.1/ja/charset-connection.html


*1 ファイル名に -icc- が入っているやつです。たとえば mysql-5.0.51a-linux-i686-icc-glibc23.tar.gz とか。
*2 下の例でおわかりのように、MovableType のインストールテストです。
*3 LANGやターミナルのエンコーディングを合わせているのは前提とします。

2009年10月24日土曜日

mew+pgpで暗号化メモ

サーバや端末の各種パスワードとかの管理って面倒ですよね。メモするのは危険だし、かといって記憶するのも大変。同じのを使い回すのも気持良くないし。他にもアマゾンのようなECとか銀行とかクレジット会社とかのサイトのログインアカウントなど、とても覚えきれません。

というわけで、僕は mew + pgp(gnupg) で自分宛にメールを出すことで記録しています。

mew は pgp と非常に相性が良く、またパスワードをキャッシュしておくことで、メールを開けば自動的に復号化してくれるので、まさに手間イラズです。というわけで、ここでは各種コマンドやセットアップ手順を記録しておきます。

メール署名/暗号化の手順

メールに署名する
C-c C-s (メールは +queue に移動します)
メールを暗号化する
C-c C-e (メールは +queue に移動します)
メールに署名して暗号化する
C-c C-s (メールは +queue に移動します)

gnupgの設定

gnupg を使用した設定のメモです。

鍵の作成

$ gpg --keygen
コマンド実行の一回目は辞書などの設定ファイルがつくられるだけで、鍵は作成されません。もう一度、同じコマンドを実行することで、対話式で鍵作成が始まります。

鍵の一覧表示

$ gpg --list-key

公開鍵のインポートと編集(信頼度の設定)

$ gpg --import <鍵ファイル名>
$ gpg --edit-key 

mewの設定

gnupgを使用し、またパスワードのキャッシュを設定しました。ここではキャッシュの有効期限を5分にしています。

(setq mew_prog-pgp "gpg")
(setq mew-use-cached-passwd t)
(setq mew-passwd-timer-unit 300) ; timer-unit x lifetime
(setq mew-passwd-lifetime 1)     ;    = interval(sec) of flushing cache.

2009年10月19日月曜日

PostgreSQL:バージョンアップ時の仕様変更

PostgreSQLは、バージョンアップの際に互換性のない仕様変更が発生する場合があります。

ただし、元々アバウトであったデータ型の扱いが厳密になることが多いようで「本来エラーになるべきものが何故か動いていた」すなわち「期待される動作へと改善された」と言えるかもしれません。ここでは、特にSQL文の変更が発生したものを記録しておきます。

7.4 以降の int 型カラムの扱い

バージョン7.4以降では、int型カラムに対して「長さ0の文字列 ''」を格納することが出来なくなりました。not null 制約が付いてなければ、nullはOKです。

test=# \d inttest
    Table "public.inttest"
 Column |  Type   | Modifiers 
--------+---------+-----------
 id     | integer | 
 value  | text    | 

test=# insert into inttest (id, value) values (null, 'text');
 |=!|INSERT 0 1
test=# insert into inttest (id, value) values ('', 'text');
ERROR:  invalid input syntax for integer: ""
test=# 

8.3 以降の char 型カラムの扱い

char型カラムに対して数字で比較した際に、8.1.4ではエラーにならなかったSQL文が、8.3.0では(正しく)エラーになるようになりました。

test=# \d chartest
      Table "public.chartest"
 Column |     Type     | Modifiers
--------+--------------+-----------
 id     | integer      |
 value  | text         |
 flag   | character(1) |

test=#  select * from chartest where flag = 1;
ERROR:  operator does not exist: character = integer
LINE 1: select * from chartest where flag = 1;
                                          ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
test=#
8.1.4では、上記SQLがエラーにならず実行されます。

なお、私がこの仕様に気付いたのは環境を 8.1.4 から 8.3.0 にバージョンアップした際ですので、変更は 8.2 で加わったのかもしれません。しかしながら、その変更のタイミングを追う理由は特にありませんので「8.1.4 -> 8.3.0」として記録しておくことにします。

2009年10月18日日曜日

PostgreSQL8.4.1のインストール

最新版の PostgreSQL (8.4.1) をソースコードからインストールする機会がありましたので、手順を記録しておきます。基本的に、ドキュメント「第15章ソースコードからインストール」の手順にしたがって進めています。

必要なライブラリのインストール

今回は CentOS 5.3 を使用しました。configure 時に下記のライブラリを要求されますので、事前にインストールしておきます。

  • readline-devel
  • zlib-devel

postgresユーザとインストール先ディレクトリの作成

管理者アカウントであるpostgresユーザと、インストール先ディレクトリを作成します。ここでは gid, uid の指定はしませんでしたが、既存環境と合わせる必要がある場合は、-g, -u オプションで明示的に指定します。また、インストール先は /usr/local/pgsql とします。

# useradd postgres
# mkdir /usr/local/pgsql
# chown postgres. /usr/local/pgsql

インストールの実行

ここでは、ソースをビルドする作業ディレクトリを /usr/local/src/postgresql/ として作業します。confugure オプションは特に指定せず、デフォルトでインストールしました。

# mkdir /usr/local/src/postgresql/
# chown postgres. /usr/local/src/postgresql/
# su - postgres

$ cd /usr/local/src/postgresql/
$ wget http://www.ring.gr.jp/pub/misc/db/postgresql/source/v8.4.1/postgresql-8.4.1.tar.gz
$ tar zxvf postgresql-8.4.1.tar.gz
$ cd postgresql-8.4.1
$ ./configure
$ make
$ make install

環境変数の設定

postgres ユーザの .bashrc に、環境変数を設定します。

$ vi ~/.bashrc

 以下を記述:
 export PATH=$PATH:/usr/local/pgsql/bin:/usr/local/pgsql/lib
 export POSTGRES_HOME=/usr/local/pgsql
 export PGLIB=$POSTGRES_HOME/lib
 export PGDATA=$POSTGRES_HOME/data
 export MANPATH=$MANPATH:$POSTGRES_HOME/man
 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PGLIB

$ source ~/.bashrc

また、 ldconfig コマンドで実行時リンクの結合関係を設定しておくことで、パフォーマンスの改善が期待できます。CentOS5の場合、root 権限で以下を実行します。

# /sbin/ldconfig /usr/local/pgsql/lib

データベースクラスタの作成

postgres ユーザにて、データベースクラスタの作成を実行します。作成の実行後にデータベースの起動を確認します。

$ initdb
$ pg_ctl start
$ psql -l
        List of databases
     Name    |  Owner   | Encoding |  Collation  |    Ctype    |   Access privileges
  -----------+----------+----------+-------------+-------------+-----------------------
   postgres  | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 |
   template0 | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres
              : postgres=CTc/postgres
   template1 | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres
              : postgres=CTc/postgres
  (3 rows)
起動を確認したら、pg_ctl stop で停止しておきます。

起動スクリプトの設置

同梱の起動スクリプトを設置し、起動の設定をしておきます。

# cp /usr/local/src/postgresql/postgresql-8.4.1/contrib/start-scripts/linux /etc/init.d/postgresql
# chmod +x /etc/init.d/postgresql
# chkconfig --add postgresql
# chkconfig postgresql on
# chkconfig --list | grep postgresql

 postgresql      0:off   1:off   2:on    3:on    4:on    5:on    6:off
これでインストールが完了しました。

クライアント側のみのインストール

アプリケーションサーバとデータベースサーバを分離した構成にする場合、いままで私はクライアント側は通常インストールを実行していました(データベースクラスタは作成しない)。が、今回の作業でマニュアルに「クライアント側のみのインストール」の方法が記述してあることに気付きましたので、メモしておきます。

gmake -C src/bin install
gmake -C src/include install
gmake -C src/interfaces install
gmake -C doc install
http://www.postgresql.jp/document/pg841doc/html/install-procedure.html

2009年10月17日土曜日

trac:担当者をドロップダウンリストで選択

trac の担当者をドロップダウンリストで選択する

trac の担当者 (Owner) はデフォルトでテキスト入力ですが、trac.ini を以下のように記述することで、ドロップダウンリストからの選択ができるようになります。

[ticket]
restrict_owner = true
このリストは session テーブルから取得しているようです。そのためアカウントを作成してログインした後に、選択できるようになります。

ドロップダウンリストから担当者を削除する

ドロップダウンリストから担当者 (Owner) を削除するには、session テーブルからレコードを削除すればよいようです。Primary Key は "sid" で、担当者を指定します。

PostgreSQLの例: (psqlを使用)

foo=# delete from session where sid = '担当者名';

2009年10月16日金曜日

Mercurial:Keyword Extension の利用

Keyword Extension の利用

同梱されている keyword extention を有効にすることで、CVSのタグ展開的な用法が可能となります。

設定例:

[extensions]
hgext.keyword =

[keyword]
**.txt =
**.php =
**.py =

[keywordmaps]
Id = {file|basename} {node|short} {date|utcdate} {author|user}
上記設定で、「$Id: 20091010mercurialtips.txt afa0ad358888 2009/10/10 02:20:48 hisawo $」というキーワードがCVSライクに展開されます。

注意:Keyword Extension は、checkout や update 時にキーワードを展開するのみで、リポジトリの書き換えは行いません。

2009年10月15日木曜日

Mercurial:CVSと連携利用の例

作業用CVSブランチの代わりにMercurial

残念ながら開発現場では Mercurial はまだ一般的でなく、CVS や subversion といった構成管理ツールを使用しているケースが多いようです。しかしながら現場で例えば CVS が使用されていたとしても「分散型」という Mercurial の特徴を生かして協調利用が可能です。例えば、CVSリポジトリに作業履歴を残す必要ない場合には、個人作業用としての構成管理として手軽に利用できます。

  1. CVSやの管理情報格納ファイルを無視するために、以下のような".hgignore"ファイルを記述します。".hgignore"ファイルは、ワーキングディレクトリの最上位ディレクトリに配置します。
       syntax: re
       ^CVS/
       /CVS/
       
  2. CVSリポジトリから foo モジュールをチェックアウトします。
       $ cvs -d :pserver:username@server:/path/to/cvsroot co foo
       
  3. ローカルの Mercurial リポジトリを作成し、foo モジュールをコミットします。
       $ cd foo
       $ hg init
       $ hg add
       $ hg commit
       
    これで、foo モジュールの全ファイルが登録されました。随時 Mercurial に登録/参照しながら作業を進めます。作業ディレクトリをコピーする場合には、hg clone コマンドでコピーします。
  4. 一連の作業が完了したら、CVSリポジトリにコミットします。
       $ cvs -d :pserver:username@server:/path/to/cvsroot commit
       

これで、CVSブランチ代りに Mercurial を使用した作業が完了しました。

2009年10月14日水曜日

東京芸大のスケッチブック

24x7エンジニアリング (勤務先に8x5、残りは個人プロジェクト *1) の僕らにとって、メモ帳と多色ボールペンは片時も手放せない補助記憶装置ですが、自分にピッタリくるものを見つけるのは意外と難しいのではないでしょうか。

僕は、しばらく前から東京芸大スケッチブックの一番小さいヤツをメモ帳に使ってて、なかなかのお気に入りです。

RHODIAなんかもいいんですが平綴じなのが好みに合わず、その点芸大スケッチブックはリング綴じなので使いやすいし、大きすぎず小さすぎず、いい感じです。

紙質はツルツルしすぎないサラリとした薄手の紙で書きやすく、お値段も確か100円台だったので気兼ねなく使えます。去年のGWに芸大美術館にバウハウス・デッサウ展を見に行ったときにミュージアムショップで見つけて、何冊か買ったものの買い置きが切れ、これが最後の一冊です。

上野方面に行ったら補充しようと思うんですが、なかなかそちら方面に行く用事がなく、敢えて言うなら、その補充の難しさが僕的な唯一の短所かも。


*1 あくまでマインドとして、です(笑)。

2009年10月13日火曜日

Mercurial:外部ツールの利用

外部ツールの設定

Mercurialは、外部のツールとの連携使用を設定することができます。これにより、例えば通常はコマンドラインの diff ツールを使用し、必要に応じてGUI を使用する、といった使い分けが可能です。ここでは、GUI の diff ツールとして、tkdiff を使用しています。

[extensions]
hgext.extdiff =

[extdiff]
cmd.tkdiff =

これで、通常はコマンドラインの diff が起動します。

$ hg diff
diff -r fe9d07aaeaf3 mod_python-3.3.1/src/connobject.c
--- a/mod_python-3.3.1/src/connobject.c Sun Oct 11 14:01:34 2009 +0900
+++ b/mod_python-3.3.1/src/connobject.c Sun Oct 11 14:03:24 2009 +0900
@@ -139,7 +139,7 @@
     bytes_read = 0;

     while ((bytes_read < len || len == 0) &&
-           !(b == APR_BRIGADE_SENTINEL(b) ||
+           !(b == APR_BRIGADE_SENTINEL(bb) ||
              APR_BUCKET_IS_EOS(b) || APR_BUCKET_IS_FLUSH(b))) {

         const char *data;
$

また、新たに tkdiff というサブコマンドが使用できるようになるので、それを指定すると

$ hg tkdiff
tkdiff が起動します。

2009年10月12日月曜日

trac:ガントチャート/カレンダー プラグイン

trac にガントチャート/カレンダーのプラグイン (TracGanttCalendarPlugin) をインストールすることで、タスクの仕掛かり状況を俯瞰的に捉えることができます。

TracGanttCalendarPlugin のインストール

sourceforge.jp のプロジェクトページから、 tar ball をダウンロードするか、CVSリポジトリからソースコードをチェックアウトします。

プロジェクトページ:http://sourceforge.jp/projects/shibuya-trac/svn/view/plugins/ganttcalendarplugin/?root=shibuya-trac

ここでは wget で取得したところ、ファイル名に余計な引数がついてしまったので mv しています。インストールは setup.py が用意されていますので、お約束のインストールコマンドを実行するだけです。

$ wget http://sourceforge.jp/projects/shibuya-trac/svn/view/plugins/ganttcalendarplugin.tar.gz?root=shibuya-trac&view=tar
$ mv ganttcalendarplugin.tar.gz\?root\=shibuya-trac\&view\=tar ganttcalendarplugin.tar.gz
$ tar zxvf ganttcalendarplugin.tar.gz
$ cd ganttcalendarplugin/trunk/
$ python setup.py bdist_egg
# python setup.py install
httpdを再起動すると、プラグインが有効になりますので、管理画面よりチェックを入れて更新します。 これで、メニューに「カレンダー」と「ガントチャート」が表示されます。

カスタムフィールドの設定

TracGanttCalendarPlugin が使用するカスタムフィールドを設定します。README.ja に記載されているように、以下をtrac.iniに追記します。

[ticket-custom]
due_assign = text
due_assign.label = 開始日
due_assign.order = 1
due_close= text
due_close.label = 終了日
due_close.order = 2
complete= text
complete.label = 進捗率(%)
complete.order = 3
これで、TracGanttCalendarPlugin が使用できるようになりました。

非稼働日の設定

管理画面の「祝日設定」より、非稼働日を登録します。私の環境ではテーブル生成時に下記のエラーが発生しますが、その後は特に問題なく使用できています。

Oops…
Trac detected an internal error:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)

ガントチャートのソート順でお悩みの貴兄へ

運用を始めると、ガントチャート画面のソート順が変だ、という状況が発生することがあります。ソースコードを見ると、

$ lv TracGanttCalendarPlugin-0.2-py2.4.egg/ganttcalendar/ticketgantt.py

(snip)
        sorted_field = req.args.get('sorted_field')
        if sorted_field == None:
            sorted_field = 'component'

(snip)

        sql = ("SELECT id, type, summary, owner, t.description, status, a.value, c.value, cmp.value, milestone, component "
                "FROM ticket t "
                "JOIN ticket_custom a ON a.ticket = t.id AND a.name = 'due_assign' "
                "JOIN ticket_custom c ON c.ticket = t.id AND c.name = 'due_close' "
                "JOIN ticket_custom cmp ON cmp.ticket = t.id AND cmp.name = 'complete' "
                "%sORDER by %s , a.value ") % (condition, sorted_field)
(snip)
と、ちゃんと order by で due_assign (=開始日) がはいってるのに、と。

そういうときは、due_assign のデータを見てみましょう。仮に開始日を 2009 年 10 月 8 日として、スタッフが思い思いの形式で入力して、2009/10/08 とか 2009-10-08 とか、どうかすると 2009/10/8 なんてのが混在しているのではないでしょうか(データ型が text なので、登録できてしまうのです)。

そんな貴兄へ、運用ルールを周知させるとともに TracDecoratorPlugin によるポップアップカレンダー入力の導入をお勧めします。

2009年10月11日日曜日

trac0.11.5jaのインストール

Trac は Phthon で実装された、Wiki, 構成管理, 課題管理を統合したプロジェクト管理ツールです。

ここでは構成管理に Mercurial を使用し、Apache + mod_python + PostgreSQL (on CentOS5) というシステム構成でのインストールについて記述します。なお Apache, PosgrtgreSQL, Python, Mercurial は下記のバージョンを既にインストール済みとし、ここではインストール方法には触れません。また、文字コードは全て UTF-8 です。

  • Apache httpd-2.2.14
  • PostgreSQL 8.4.1
  • Python 2.4.3 (python-devel)
  • Mercurial 1.3.1
Merucurialのインストール手順はこちらをご参照下さい。

以降、下記の順番でインストール手順を記述します。

  1. テンプレートエンジンのインストール
  2. setuptools のインストール
  3. Trac 0.11.5ja のインストール
  4. mod_python のインストール
  5. pyPgSQL のインストール
  6. mxDateTime のインストール
  7. Mercurial プラグインのインストール
  8. プロジェクト環境の作成
  9. Mercurial プラグインの有効化

テンプレートエンジンのインストール

Trac0.10 まではテンプレートエンジンに ClearSilver を使用し、別途インストールする必要がありましたが、0.11 からは Genshi に変更されています。Genshi は Tracのインストーラが勝手に取得/インストール/アップグレードしてくれるので、個別の準備は不要です。

setuptools のインストール

0.10までは不要だったように記憶してますが、0.11からは setuptools を要求されます。

# python ./setup.py install --prefix=/usr/local/trac0.11.5.ja1
Traceback (most recent call last):
  File "./setup.py", line 15, in ?
    from setuptools import setup, find_packages
ImportError: No module named setuptools
また後述の種々のモジュールのインストールにも使用しますので、あらかじめ setuptools をインストールしておきます。
# wget http://peak.telecommunity.com/dist/ez_setup.py
# python ez_setup.py
Downloading http://pypi.python.org/packages/2.4/s/setuptools/setuptools-0.6c9-py2.4.egg
Processing setuptools-0.6c9-py2.4.egg
creating /usr/lib/python2.4/site-packages/setuptools-0.6c9-py2.4.egg
Extracting setuptools-0.6c9-py2.4.egg to /usr/lib/python2.4/site-packages
Adding setuptools 0.6c9 to easy-install.pth file
Installing easy_install script to /usr/bin
Installing easy_install-2.4 script to /usr/bin

Installed /usr/lib/python2.4/site-packages/setuptools-0.6c9-py2.4.egg
Processing dependencies for setuptools==0.6c9
Finished processing dependencies for setuptools==0.6c9

Trac 0.11.5ja のインストール

現時点で最新の日本語版である 0.11.5ja をインストールします。日本語版はインタアクト株式会社のサイトからダウンロードします。

インストール時に prefix を指定せずデフォルトに任せると /usr/bin, /usr/lib, /usr/share に散らばってインストールされるので、私は --prefix= を指定して /usr/local/ 配下にリビジョン番号付でインストールし、環境設定やシンボリックリンクでパスを通しています。

$ unzip Trac-0.11.5.ja1.zip
$ cd Trac-0.11.5.ja1

# mkdir -p /usr/local/trac0.11.5.ja1/lib/python2.4/site-packages/
# ln -s /usr/local/trac0.11.5.ja1 /usr/local/trac
# export PYTHONPATH=/usr/local/trac/lib/python2.4/site-packages
# python ./setup.py install --prefix=/usr/local/trac0.11.5.ja1
prefix指定なしのデフォルトの場所にシンボリックリンクを作成します。
# ln -s /usr/local/trac/bin/trac-admin  /usr/bin/trac-admin
# ln -s /usr/local/trac/bin/tracd /usr/bin/tracd
# ln -s /usr/local/trac/share/man/man1/trac-admin.1 /usr/share/man/man1/trac-admin.1
# ln -s /usr/local/trac/share/man/man1/tracd.1 /usr/share/man/man1/tracd.1
# ln -s /usr/local/trac/share/man/man1/tracdb2env.1 /usr/share/man/man1/tracdb2env.1
# ln -s /usr/local/trac/share/trac /usr/share/trac
なお、0.10 までは ライブラリ類は /usr/local/trac/lib/python2.4/site-packages/trac/ にまとめてインストールされていたのですが、0.11 からは Genshi も含めて、/usr/local/trac/lib/python2.4/site-packages/ 配下にバージョン番号付でインストールされるようになりました。
$ ls -l /usr/local/trac/lib/python2.4/site-packages/
total 284
-rw-r--r-- 1 root root 231009 Oct 10 15:06 Genshi-0.5.1-py2.4-linux-i686.egg
drwxr-xr-x 4 root root   4096 Oct 10 15:06 Trac-0.11.5.ja1-py2.4.egg
-rw-r--r-- 1 root root    309 Oct 10 15:06 easy-install.pth
-rw-r--r-- 1 root root     60 Oct 10 15:06 setuptools.pth
-rw-r--r-- 1 root root   2362 Oct 10 15:06 site.py
-rw-r--r-- 1 root root   1825 Oct 10 15:06 site.pyc
-rw-r--r-- 1 root root   1815 Oct 10 16:12 site.pyo
そのためシンボリックリンクでの対応は逆に面倒ですので、/usr/local/trac/lib/python2.4/site-packages に PYTHONPATH を通しておきます。 これで、trac のインストールが完了しました。

mod_python のインストール

mod_python 3.2 系は apache 2.2 で動作しないので、3.3 系を使用します。そして、実はtracのインストールの山場はここなのではないか、と思うくらいハマりポイントがあるのが mod_python のインストールです。

libexpat のバージョン

まず一つめのハマりポイント。expat-devel パッケージがインストールされてない場合、apache 同梱の libexpat.so が使用されますが、このバージョンが古いために実行時に mod_python がエラーとなってしまうようです(error_log には "Objects/stringobject.c:117: PyString_FromString: Assertion `str != ((void *)0)' failed."と書かれていました)。バージョンを見ると、

$ strings /usr/local/apache2/lib/libexpat.so | grep expat_
expat_1.95.2
$ rpm -qa | grep expat
expat-1.95.8-8.2.1
expat-devel-1.95.8-8.2.1
expat-devel がインストール済であることを確認し、必ずインストールしておきましょう。

mod_python のバージョン

ハマりポイントその二。apr と mod_python の特定のバージョンの組み合わせ(apr 1.3.2 と mod_python 3.3.1 ?) の場合、ビルドエラーになってしまいます。

jira によると、既に修正が trunk にコミットされているものの公開されている 3.3.1 では対応されてないようです。自分で patch を適用してもいいのですが、ここでは svn リポジトリから最新の trunk を取得して使用しました。
mod_python のビルド/インストール
$ svn co http://svn.apache.org/repos/asf/quetzalcoatl/mod_python/trunk
$ cd trunk
$ ./configure --with-apxs=/usr/local/apache2/bin/apxs
$ make
# make install
これで mod_python が無事インストールできました。

httpd.conf の変更

mod_python.so を有効にし、また trac 用の設定ファイルを include するように httpd.conf を変更します。

LoadModule python_module      modules/mod_python.so
Include conf/extra/httpd-trac.conf

extra/httpd-trac.conf の作成

trac 用の設定ファイル extra/httpd-trac.conf を作成します。ここでは trac ディレクトリは /home/trac とします。また、trac認証には apache の基本認証を使用し、またパスワードファイルは /home/trac に設置します。

<Location /trac>
  SetEnv PYTHON_EGG_CACHE /tmp/python_egg_cache
  SetHandler mod_python
  PythonHandler trac.web.modpython_frontend
  PythonOption TracEnvParentDir /home/trac
  PythonOption TracUriRoot /trac
  PythonDebug On
</Location>
<LocationMatch /trac/[-_[:alnum:]]+/login>
  AuthType Basic
  AuthName "Trac"
  AuthUserFile /home/trac/.htpasswd
  Require valid-user
</LocationMatch>
/usr/local/apache2/bin/htpasswd を使用し、trac を使用するユーザを .htpasswd に登録しておきます。

環境変数の設定の作成

apache から、それぞれのライブラリを使用できるよう、apacheの起動スクリプトに環境変数を設定しておきます。

export PYTHONPATH=/usr/local/trac/lib/python2.4/site-packages
export PATH="$PATH":/usr/local/pgsql/bin:/usr/local/pgsql/lib
export POSTGRES_HOME=/usr/local/pgsql
export PGLIB=$POSTGRES_HOME/lib
export PGDATA=$POSTGRES_HOME/data
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":$PGLIB
また、後述の trac-admin コマンドをターミナルから実行する際にも上記のパス設定が必要なので、root の .bashrc にも記述しておいた方がいいでしょう。

pyPgSQL のインストール

Python から PostgreSQL へのデータベース・アクセスに、ここでは pyPgSQL を使用します。

$ wget http://sourceforge.net/projects/pypgsql/files/pypgsql/2.5.1/pyPgSQL-2.5.1.tar.gz/download
$ tar zxvf pyPgSQL-2.5.1.tar.gz 
$ cd pyPgSQL-2.5.1
root ユーザにに PostgreSQL ライブラリ等へのパスを通した後(通ってないとエラーとなります)、ビルド、インストールします。
# export PATH=/usr/local/pgsql/include:$PATH
# export PATH=/usr/local/pgsql/bin:$PATH
# python setup.py build
# python setup.py install
これで pyPgSQL のインストールが完了しました。

mxDateTime のインストール

これをインストールしておかないと、プロジェクト環境作成時に下記のメッセージで落ちてしまいます。

Creating and Initializing Project
Failed to create environment. You need to install mxDateTime
       (http://www.egenix.com/files/python/eGenix-mx-Extensions.html)
eGenix.comのサイトから取得してインストールします。なお、UCS2版とUCS4版のどちらをインストールするかは、下記コマンドで確認します。
$ python -c "import sys;print(sys.maxunicode<66000)and'UCS2'or'UCS4'"
インストールスクリプトを実行して、インストールします。
$ unzip egenix-mx-base-3.1.2.linux-i686-py2.4_ucs4.prebuilt.zip
$ cd egenix-mx-base-3.1.2.linux-i686-py2.4_ucs4.prebuilt
# python setup.py install

Mercurial プラグインのインストール

setuptoolを使用して Mercurial プラグインをインストールします。

$ svn co http://svn.edgewall.com/repos/trac/sandbox/mercurial-plugin-0.11
$ cd mercurial-plugin-0.11/
$ python setup.py bdist_egg
# python setup.py install

プロジェクト環境の作成

プロジェクト環境作成の例として、ここでは test という名称のプロジェクト環境と作成します。

Mercurial リポジトリの作成

まず Mercurial リポジトリを作成します。ここでは /home/hg 配下を Mercurial リポジトリのディレクトリとします。また、Mercurial の操作は hg ユーザにて行うものとします。

$ su - hg
$ cd /home/hg
$ mkdir test
$ cd test/
$ hg init
これで hg リポジトリが作成されました。

データベースの作成

tracが使用するデータベースを作成します。ここでは、"trac_test" という名前で作成し、接続ユーザは "trac"、パスワードは "foo" としています。

$ su - postgres
$ createdb trac_test
$ psql trac_test

trac_test=# CREATE USER trac WITH PASSWORD 'foo';
CREATE ROLE
trac_test=# 

プロジェクト環境の作成

ベースディレクトリは /home/trac とし、その下に各プロジェクトを作成することにします。また、PostgreSQLへのパスが通ってないと作成時にエラーとなるため、パスを通しておきましょう。

# mkdir -p /home/trac/test
# export PATH="$PATH":/usr/local/pgsql/bin:/usr/local/pgsql/lib
# export POSTGRES_HOME=/usr/local/pgsql
# export PGLIB=$POSTGRES_HOME/lib
# export PGDATA=$POSTGRES_HOME/data
# export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":$PGLIB

trac-admin コマンドを使用してプロジェクト環境を作成します。対話型で作成が進行しますので、それぞれ記入していきます。
# export PYTHONPATH=/usr/local/trac/lib/python2.4/site-packages
# trac-admin /home/trac/test initenv

 Project Name [My Project]> Test Project

 Database connection string [sqlite:db/trac.db]> postgres://trac:foo@localhost/trac_test

 Repository type [svn]> hg

 Path to repository [/path/to/repos]> /home/hg/test

 :
 :

---------------------------------------------------------------------
Project environment for 'Test Project' created.

You may now configure the environment by editing the file:

  /home/trac/test/conf/trac.ini

If you'd like to take this new project environment for a test drive,
try running the Trac standalone web server `tracd`:

  tracd --port 8000 /home/trac/test

Then point your browser to http://localhost:8000/test.
There you can also browse the documentation for your installed
version of Trac, including information on further setup (such as
deploying Trac to a real web server).

The latest documentation can also always be found on the project
website:

  http://trac.edgewall.org/

Congratulations!
プロジェクト環境が作成されました。まず trac ディレクトリの所有者をを apache 実行ユーザに変更し、管理者アカウントを設定しておきましょう。
# chown -R daemon. /home/trac/test/
# trac-admin /home/trac/test permission add admin TRAC_ADMIN
これで、apache + mod_python 経由で trac にアクセスできるようになりました。

Mercurial プラグインの有効化

この状態では、まだコンポーネントが有効になっていないため Mercurial プラグインが使用できず、画面にエラーが表示されます。

Warning: リポジトリと同期できません (サポートされていないバージョン管理システム "hg" です: 適切なコンポーネントが見つかりません。該当するプラグインが有効に設定されているか確認してください。)。詳細は Trac のログを参照してください。
管理画面「プラグイン」のコンポーネントにチェックを入れて有効にして、設定完了です。 これで、Trac の「リポジトリブラウザ」で Mercurial が使用できるようになりました。

2009年10月10日土曜日

Mercurial利用メモ

Python で実装された分散型構成管理システム(SCM)である Mercurial の利用メモです。ここでは VineLinux4.2 へインストールしています。

リポジトリの作成

Mercurial は分散型の SCM なので、どこかのサーバにリポジトリを作成して常にそこを参照する、という必要はありません。管理下に置きたいディレクトリで hg init することで、そのディレクトリがリポジトリになります。ここでは、php の AOP フレームワークである php-aop のソースコードを svn checkout して例にしました。

$ pwd
/path/to/workdir/php-aop

$ hg init

$ hg status
? .build/build.package.xml
? .build/build.rss.properties
? .build/build.rss.xml
? aop/.build/build.properties
? aop/.build/build.xml
? aop/aop.php
? aop/aop_exception.php
(snip)
? tests/test2/Linker.pointcut.definition.php
? tests/test2/UnitTest.php

$ hg add
.build/build.package.xml を追加登録中
.build/build.rss.properties を追加登録中
.build/build.rss.xml を追加登録中
aop/.build/build.properties を追加登録中
aop/.build/build.xml を追加登録中
aop/aop.php を追加登録中
aop/aop_exception.php を追加登録中
(snip)
tests/test2/Linker.pointcut.definition.php を追加登録中
tests/test2/UnitTest.php を追加登録中

$ hg commit
status で "?" が付いて表示されているものが、まだリポジトリに登録されてないファイルです。引数なしで add を実行すると、登録可能なファイル全てが add されます(ここでは .htignore に .svn を設定してるため、subversion の管理ディレクトリである .svn は対象から外れています)。 commit を実行するとデフォルトエディタが起動しますので、コミットログを記入して保存/終了します。

これで fniweb_hg ディレクトリが Mercurial のリポジトリになりました。

pull と update と merge

メインのリポジトリから hg pull して、hg status 等で確認しても、手元のファイルは変更されていません。cvs update の感覚で考えると混乱しますが、pull はあくまでも外部のリポジトリの内容をローカルのリポジトリ(.hg)に取り込むコマンドですので、変更は加わらないのです。ローカルのリポジトリを先頭のリビジョン(head)に更新するには、hg update コマンドを使用します。

また、Mercurialのマージ(ローカルの作業ファイルと、マスタのリポジトリ内容とのマージ)は、基本的に「commit 済み成果ベースのマージ(by フジワラ)」です。

  1. ローカルリポジトリからupdate
  2. ワーキングディレクトリで作業を実施
  3. 作業成果をcommit
  4. マスタのリポジトリからpullによる成果取り込み
  5. 2つの成果をmerge
  6. 衝突を解消してcommit
  7. マージ内容をマスタのリポジトリにpush
mercurialの前にCVSを使用していたときの「ブランチを作成する際に同時にバックアップ用タグを作成し、ブランチ先頭とバックアップタグの差分をトランクにマージする」という手順に近いので、さほど違和感はありませんでした。

hg rollback の利用

Mercirual は、最後の commit をロールバックすることができます。すなわち、commit してから「その変更によって不要になるファイルの remove を忘れてた!」とか「addし忘れたファイルがあった!!」という場合でも、hg rollback して commit をやり直すことができるわけです。

複数ヘッドの発生と解消

ローカルリポジトリの内容を push しようとした際に、下記のメッセージで失敗することがあります。

$ hg push ssh://hisawo@mercurial.example.com//path/to/repository
pushing to ssh://hisawo@mercurial.example.com//path/to/repository/foo
searching for changes
abort: push creates new remote heads!
(did you forget to merge? use push -f to force)
分散型構成管理でハマりがちで、ある意味キモかもしれません。

これは「現在のローカルリポジトリの先頭リビジョンが push 先のリポジトリで新しい head になる(push 先の head が複数になる)」という警告です。まずローカルリポジトリに push 先のリポジトリを pull し、複数ヘッドを解消した上で改めて push します。

注意:メッセージでは "use push -f to force" などと示唆されていますが、push -f をやると先方のリポジトリのヘッドが複数になってしまいます。すなわち面倒を先送りあるいは転嫁するだけなので、この方法は避けましょう。

参考:pullとupdateとmerge, 藤車(複数ヘッド)

hg serve コマンドの利用

Mercurialにはhttpサーバの機能があり、httpプロトコルでのリポジトリ間伝播や、Webブラウザでの閲覧が可能です。ローカルのMercurial管理下のディレクトリに移動して、hg serve コマンドを実行します。

$ hg serve -p 8888
これで、Webブラウザにて http://hostname:8888/ でリポジトリの内容を閲覧したり、そのリポジトリに対して hg clone http://hostname:8888/ といったアクセスが可能となります。

また、この状態ではフォアグラウンドで実行されますので、デーモンとして起動するには -d オプションを使用します。

$ hg serve -d -p 8888
これで、バックグラウンドで http サーバが起動します。

Mercurial1.1から hg serve 機能が大幅に強化され、リビジョングラフも表示されるようになってます。hg serve を使用するなら、1.1以降が超お奨めです。

2009年10月9日金曜日

Mercurial1.3.1のインストール

Python で実装された分散型構成管理システム(SCM)である Mercurial のインストール手順メモです。ここでは VineLinux4.2 へインストールしました。

Merucialのインストール

公式サイトhttp://mercurial.selenic.com/wiki/から最新版をダウンロードします。現時点での最新版は 1.3.1 でした。

$ wget http://mercurial.selenic.com/release/mercurial-1.3.1.tar.gz
$ tar zxvf mercurial-1.3.1.tar.gz
$ cd mercurial-1.3.1/

私は「リビジョン番号付きでインストールしシンボリックリンクを付ける」というやり方を好んでます。例えば mercurial-1.3.1 の場合:

# make PREFIX=/usr/local/mercurial-1.3.1 install
# ln -s /usr/local/mercurial-1.3.1 /usr/local/mercurial

環境変数 PYTHONPATH を設定するのが一般的かと思いますが、、ここではパスの通っているところにシンボリックリンクを作成しました。

# cd /usr/local/bin/
# ln -s /usr/local/mercurial/bin/hg

# cd /usr/lib/python2.4/site-packages/
# ln -s /usr/local/mercurial/lib/python2.4/site-packages/hgext
# ln -s /usr/local/mercurial/lib/python2.4/site-packages/mercurial

# cd /usr/local/man/man1/
# ln -s  /usr/local/mercurial/share/man/man1/hg.1
# cd /usr/local/man/man5/
# ln -s /usr/local/mercurial/share/man/man5/hgrc.5
# ln -s /usr/local/mercurial/share/man/man5/hgignore.5

動作を確認します。"hg version" と実行して、以下のように表示されれば OK です。

$ hg version
Mercurial - 分散構成管理ツール(バージョン 1.3.1)

著作権 (C) 2005-2009 Matt Mackall <mpm@selenic.com> 他
本製品はフリーソフトウェアです。頒布/改変の際はライセンス条項をお読み
ください。市場適合性や特定用途への可否を含め、本製品は無保証です。

日本語コミュニティ mercurial-ja によって、しっかり日本語にローカライズされていますね。

Windows へのインストール

Windows へのインストールは、いくつかの方法があります。

  • Cygwin パッケージを使用
  • Cygwin + Python スクリプトを make install (Linux へのインストールと同様)
  • Windows バイナリを使用
Cygwin を使用する場合は、そのままでは Cygwin 外アプリケーションから Mercurial を使用することができません。Meadow などから Cygwin 内の Mercurial を使用するには 、Cygwinwrap を使用します。

Merucialの設定

ホームディレクトリに、設定ファイル .hgrc を作成します。username の指定のほか、マージプログラムの指定やデフォルトのリモートリポジトリなどの設定が可能です。

~/.hgrc の設定例
[ui]
username = TAKASE Hisawo <hisawo@example.com>
ignore=~/.hgignore
merge    = hgmerge.py
#editor   = /usr/bin/emacsclient

[hgmerge]
interactive = kdiff3
noninteractive = diff3

[extensions]
hgext.extdiff =

[extdiff]
cmd.tkdiff =
#cmd.kdiff3 =
opt.tkdiff = --wait
usernameの設定

これが設定されてない場合、commit 実行時などのユーザ名に「ログインユーザ名@ホスト名」が使用されます。

[ui]
username = TAKASE Hisawo <hisawo@example.com>
~/.hgignoreの設定例

.hgrc の [ui] に ignore=~/.hgignore と記述することで、~/.hgignore が有効になります。ここにリビジョン管理しないファイル(テンポラリファイルやバイナリファイル、eclipse の管理ファイルなど)を記述することで、 Mercurial から無視されます。

syntax: glob
*~
*.pyc
*.pyo
*.o
.cache
.hgignore
.project
.settings

2009年10月8日木曜日

pdumpfs利用メモ

pdumpfs で日々のスナップショットを保存する

pdumpfs は Ruby で実装された、ハードリンクを利用して日々のスナップショットを保存するツールです。pdumpfs-clean と合わせて利用することで、効率的にバックアップをすることができます。作者は、かの高林哲さん。

http://0xcc.net/pdumpfs/

バックアップ先ディレクトリに「年/月/日」の形式でサブディレクトリを作成し、日毎のスナップショットを保存します。初回のみバックアップ対象ディレクトリ全体をコピーし、2日目以降は差分でバックアップしていきます。差分は、更新されたファイルのみをコピーし、更新されなかったファイルは前日のスナップショットのファイルへのハードリンクとして記録されます。

実行例:
0 5 * * *    /usr/local/bin/pdumpfs /home /var/pdumpfs/home  \
               >/var/pdumpfs/home/pdumpfs.log 2>/var/pdumpfs/home/error-pdumpfs.log

pdumpfs-cleanで肥大化を回避

pdumpfs は効率的にスナップショットを保存できるものの、そのまま保存し続けるとバックアップファイルが肥大していきます。そこで、pdumpfs-clean を使用して古いデータを間引く形で削除することで、肥大化を回避します。

http://tach.arege.net/software/pdumpfs-clean/ (公開終了?)

実行例(過去90日間の毎日、過去52週の日曜日、過去24月の毎月一日、過去5年の毎年1月1日 を残す):

0 6 * * *    /usr/local/bin/pdumpfs-clean --keep 5Y24M52W90D /var/pdumpfs/home

#現在、上記 URL は "404 Not Found" となりますので、既に公開終了しているのかもしれません。

2009年10月4日日曜日

このサイトについて

このサイト内のコンテンツに関して

このサイト内の全てのコンテンツは、MITライセンスにて公開します。

Copyright (c) 2009 hisawo@gmail.com

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

リンクについて

このサイトへのリンクについて

このサイトへのリンクは、配下の全てのリソースについて無断で行ってください。仮に許可を求められても、一切の返答をしません。

このサイトからのリンクについて

このサイトからは、あらゆるサイトへ無断でリンクさせて頂きます。

やむを得ない事情がある場合は検討しようと思いますが、今のところ(2009/10/20)そういった事情を少なくとも現実に起りうる範囲では想像することができません。ともあれ、もしこのサイトからのリンクによってリンク元に不利益が生じることがあるとすれば善処したい*1と思いますので、その際はご連絡ください。

参考リンク

リンクするなら黙ってやれ!(山形浩生氏)

直リンクのすすめ(ヤコブ・ニールセン氏)


*1 例えば、このサイトからのリンクによってリンク先サイトの接続数が上限を越えてアクセスできなくなる、転送量が契約の上限を越えてしまい料金の追加が発生しサイト運営に影響をおよぼす、などといった事態が生じましたら、ご連絡をいただければ当該個所に理由を記述した上でリンクを削除します。