いつも設定がわからなくなるので、メモっておきます。
umaskの設定
groupに書き込み権限を与える場合
file_open_mode=0666
local_umask=002
chrootの設定
/etc/vsftpd.chroot_list に、chroot しない ユーザを列挙するchroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd.chroot_list
私的技術情報のメモ
TracDecoratorPluginを使用することで、ポップアップカレンダーからの入力ができるようになります。
インストールはプロジェクトページのインストール方法どおりでOKです。ここでは trac0.11.5ja を使用していますので、trunk を取得します。インストール後に httpd を再起動すると、プラグインが有効になります。
0.11系ではデフォルトで TracGanttCalenderPlugin の開始日/終了日(due_assign, due_close)のポップアップカレンダー入力が有効になりますので、設定は不要です。それ以外のカスタムフィールドに使用するには、以下の書式で trac.ini に指定します。
$ 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
[decorator] calendar_fields=due_assign,due_close
いつもインストールのやり方を忘れてしまうので、メモしておきます。ここではコンパイル済みバイナリを使用し、CentOS5 にインストールしています。
インテルのCPUで実行する場合は、gccよりもインテルCコンパイラでコンパイルされたバイナリ *1 の方が速い、といわれてますので、それを使用します。
4.1まではバイナリを展開するだけだったのですが、5.xからは "scripts/mysql_install_db --user=mysql" を実行するようになったようです。# 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
参考URL: http://dev.mysql.com/doc/refman/5.0/en/installing-binary.html
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
サーバや端末の各種パスワードとかの管理って面倒ですよね。メモするのは危険だし、かといって記憶するのも大変。同じのを使い回すのも気持良くないし。他にもアマゾンのようなECとか銀行とかクレジット会社とかのサイトのログインアカウントなど、とても覚えきれません。
というわけで、僕は mew + pgp(gnupg) で自分宛にメールを出すことで記録しています。
mew は pgp と非常に相性が良く、またパスワードをキャッシュしておくことで、メールを開けば自動的に復号化してくれるので、まさに手間イラズです。というわけで、ここでは各種コマンドやセットアップ手順を記録しておきます。
gnupg を使用した設定のメモです。
コマンド実行の一回目は辞書などの設定ファイルがつくられるだけで、鍵は作成されません。もう一度、同じコマンドを実行することで、対話式で鍵作成が始まります。
$ gpg --keygen
$ gpg --list-key
$ gpg --import <鍵ファイル名>
$ gpg --edit-key
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.
PostgreSQLは、バージョンアップの際に互換性のない仕様変更が発生する場合があります。
ただし、元々アバウトであったデータ型の扱いが厳密になることが多いようで「本来エラーになるべきものが何故か動いていた」すなわち「期待される動作へと改善された」と言えるかもしれません。ここでは、特にSQL文の変更が発生したものを記録しておきます。
バージョン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=#
char型カラムに対して数字で比較した際に、8.1.4ではエラーにならなかったSQL文が、8.3.0では(正しく)エラーになるようになりました。
8.1.4では、上記SQLがエラーにならず実行されます。
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 から 8.3.0 にバージョンアップした際ですので、変更は 8.2 で加わったのかもしれません。しかしながら、その変更のタイミングを追う理由は特にありませんので「8.1.4 -> 8.3.0」として記録しておくことにします。
最新版の PostgreSQL (8.4.1) をソースコードからインストールする機会がありましたので、手順を記録しておきます。基本的に、ドキュメント「第15章ソースコードからインストール」の手順にしたがって進めています。
今回は CentOS 5.3 を使用しました。configure 時に下記のライブラリを要求されますので、事前にインストールしておきます。
管理者アカウントである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 ユーザにて、データベースクラスタの作成を実行します。作成の実行後にデータベースの起動を確認します。
起動を確認したら、pg_ctl stop で停止しておきます。
$ 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)
同梱の起動スクリプトを設置し、起動の設定をしておきます。
これでインストールが完了しました。
# 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
アプリケーションサーバとデータベースサーバを分離した構成にする場合、いままで私はクライアント側は通常インストールを実行していました(データベースクラスタは作成しない)。が、今回の作業でマニュアルに「クライアント側のみのインストール」の方法が記述してあることに気付きましたので、メモしておきます。
http://www.postgresql.jp/document/pg841doc/html/install-procedure.html
gmake -C src/bin install
gmake -C src/include install
gmake -C src/interfaces install
gmake -C doc install
trac の担当者 (Owner) はデフォルトでテキスト入力ですが、trac.ini を以下のように記述することで、ドロップダウンリストからの選択ができるようになります。
[ticket]
restrict_owner = true
ドロップダウンリストから担当者 (Owner) を削除するには、session テーブルからレコードを削除すればよいようです。Primary Key は "sid" で、担当者を指定します。
PostgreSQLの例: (psqlを使用)
foo=# delete from session where sid = '担当者名';
同梱されている keyword extention を有効にすることで、CVSのタグ展開的な用法が可能となります。
設定例:
上記設定で、「$Id: 20091010mercurialtips.txt afa0ad358888 2009/10/10 02:20:48 hisawo $」というキーワードがCVSライクに展開されます。
[extensions]
hgext.keyword =
[keyword]
**.txt =
**.php =
**.py =
[keywordmaps]
Id = {file|basename} {node|short} {date|utcdate} {author|user}
注意:Keyword Extension は、checkout や update 時にキーワードを展開するのみで、リポジトリの書き換えは行いません。
残念ながら開発現場では Mercurial はまだ一般的でなく、CVS や subversion といった構成管理ツールを使用しているケースが多いようです。しかしながら現場で例えば CVS が使用されていたとしても「分散型」という Mercurial の特徴を生かして協調利用が可能です。例えば、CVSリポジトリに作業履歴を残す必要ない場合には、個人作業用としての構成管理として手軽に利用できます。
syntax: re ^CVS/ /CVS/
$ cvs -d :pserver:username@server:/path/to/cvsroot co foo
これで、foo モジュールの全ファイルが登録されました。随時 Mercurial に登録/参照しながら作業を進めます。作業ディレクトリをコピーする場合には、hg clone コマンドでコピーします。$ cd foo $ hg init $ hg add $ hg commit
$ cvs -d :pserver:username@server:/path/to/cvsroot commit
これで、CVSブランチ代りに Mercurial を使用した作業が完了しました。
24x7エンジニアリング (勤務先に8x5、残りは個人プロジェクト *1) の僕らにとって、メモ帳と多色ボールペンは片時も手放せない補助記憶装置ですが、自分にピッタリくるものを見つけるのは意外と難しいのではないでしょうか。
僕は、しばらく前から東京藝大スケッチブックの一番小さいヤツをメモ帳に使ってて、なかなかのお気に入りです。
RHODIAなんかもいいんですが平綴じなのが好みに合わず、その点藝大スケッチブックはリング綴じなので使いやすいし、大きすぎず小さすぎず、いい感じです。
紙質はツルツルしすぎないサラリとした薄手の紙で書きやすく、お値段も確か100円台だったので気兼ねなく使えます。去年のGWに藝大美術館にバウハウス・デッサウ展を見に行ったときにミュージアムショップで見つけて、何冊か買ったものの買い置きが切れ、これが最後の一冊です。
上野方面に行ったら補充しようと思うんですが、なかなかそちら方面に行く用事がなく、敢えて言うなら、その補充の難しさが僕的な唯一の短所かも。
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 というサブコマンドが使用できるようになるので、それを指定すると
tkdiff が起動します。
$ hg tkdiff
trac にガントチャート/カレンダーのプラグイン (TracGanttCalendarPlugin) をインストールすることで、タスクの仕掛かり状況を俯瞰的に捉えることができます。
sourceforge.jp のプロジェクトページから、 tar ball をダウンロードするか、CVSリポジトリからソースコードをチェックアウトします。
プロジェクトページ:http://sourceforge.jp/projects/shibuya-trac/svn/view/plugins/ganttcalendarplugin/?root=shibuya-trac
ここでは wget で取得したところ、ファイル名に余計な引数がついてしまったので mv しています。インストールは setup.py が用意されていますので、お約束のインストールコマンドを実行するだけです。
httpdを再起動すると、プラグインが有効になりますので、管理画面よりチェックを入れて更新します。
これで、メニューに「カレンダー」と「ガントチャート」が表示されます。
$ 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
TracGanttCalendarPlugin が使用するカスタムフィールドを設定します。README.ja に記載されているように、以下をtrac.iniに追記します。
これで、TracGanttCalendarPlugin が使用できるようになりました。
[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
管理画面の「祝日設定」より、非稼働日を登録します。私の環境ではテーブル生成時に下記のエラーが発生しますが、その後は特に問題なく使用できています。
Oops…
Trac detected an internal error:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)
運用を始めると、ガントチャート画面のソート順が変だ、という状況が発生することがあります。ソースコードを見ると、
と、ちゃんと order by で due_assign (=開始日) がはいってるのに、と。
$ 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)
そういうときは、due_assign のデータを見てみましょう。仮に開始日を 2009 年 10 月 8 日として、スタッフが思い思いの形式で入力して、2009/10/08 とか 2009-10-08 とか、どうかすると 2009/10/8 なんてのが混在しているのではないでしょうか(データ型が text なので、登録できてしまうのです)。
そんな貴兄へ、運用ルールを周知させるとともに TracDecoratorPlugin によるポップアップカレンダー入力の導入をお勧めします。
Trac は Phthon で実装された、Wiki, 構成管理, 課題管理を統合したプロジェクト管理ツールです。
ここでは構成管理に Mercurial を使用し、Apache + mod_python + PostgreSQL (on CentOS5) というシステム構成でのインストールについて記述します。なお Apache, PosgrtgreSQL, Python, Mercurial は下記のバージョンを既にインストール済みとし、ここではインストール方法には触れません。また、文字コードは全て UTF-8 です。
以降、下記の順番でインストール手順を記述します。
Trac0.10 まではテンプレートエンジンに ClearSilver を使用し、別途インストールする必要がありましたが、0.11 からは Genshi に変更されています。Genshi は Tracのインストーラが勝手に取得/インストール/アップグレードしてくれるので、個別の準備は不要です。
0.10までは不要だったように記憶してますが、0.11からは setuptools を要求されます。
また後述の種々のモジュールのインストールにも使用しますので、あらかじめ 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
# 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
現時点で最新の日本語版である 0.11.5ja をインストールします。日本語版はインタアクト株式会社のサイトからダウンロードします。
インストール時に prefix を指定せずデフォルトに任せると /usr/bin, /usr/lib, /usr/share に散らばってインストールされるので、私は --prefix= を指定して /usr/local/ 配下にリビジョン番号付でインストールし、環境設定やシンボリックリンクでパスを通しています。
prefix指定なしのデフォルトの場所にシンボリックリンクを作成します。
$ 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
なお、0.10 までは ライブラリ類は /usr/local/trac/lib/python2.4/site-packages/trac/ にまとめてインストールされていたのですが、0.11 からは Genshi も含めて、/usr/local/trac/lib/python2.4/site-packages/ 配下にバージョン番号付でインストールされるようになりました。
# 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
そのためシンボリックリンクでの対応は逆に面倒ですので、/usr/local/trac/lib/python2.4/site-packages に PYTHONPATH を通しておきます。
これで、trac のインストールが完了しました。
$ 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
mod_python 3.2 系は apache 2.2 で動作しないので、3.3 系を使用します。そして、実はtracのインストールの山場はここなのではないか、と思うくらいハマりポイントがあるのが mod_python のインストールです。
まず一つめのハマりポイント。expat-devel パッケージがインストールされてない場合、apache 同梱の libexpat.so が使用されますが、このバージョンが古いために実行時に mod_python がエラーとなってしまうようです(error_log には "Objects/stringobject.c:117: PyString_FromString: Assertion `str != ((void *)0)' failed."と書かれていました)。バージョンを見ると、
expat-devel がインストール済であることを確認し、必ずインストールしておきましょう。
$ 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
ハマりポイントその二。apr と mod_python の特定のバージョンの組み合わせ(apr 1.3.2 と mod_python 3.3.1 ?) の場合、ビルドエラーになってしまいます。
これで 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.so を有効にし、また trac 用の設定ファイルを include するように httpd.conf を変更します。
LoadModule python_module modules/mod_python.so
Include conf/extra/httpd-trac.conf
trac 用の設定ファイル extra/httpd-trac.conf を作成します。ここでは trac ディレクトリは /home/trac とします。また、trac認証には apache の基本認証を使用し、またパスワードファイルは /home/trac に設置します。
/usr/local/apache2/bin/htpasswd を使用し、trac を使用するユーザを .htpasswd に登録しておきます。
<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>
apache から、それぞれのライブラリを使用できるよう、apacheの起動スクリプトに環境変数を設定しておきます。
また、後述の trac-admin コマンドをターミナルから実行する際にも上記のパス設定が必要なので、root の .bashrc にも記述しておいた方がいいでしょう。
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
Python から PostgreSQL へのデータベース・アクセスに、ここでは pyPgSQL を使用します。
root ユーザにに PostgreSQL ライブラリ等へのパスを通した後(通ってないとエラーとなります)、ビルド、インストールします。
$ 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
これで pyPgSQL のインストールが完了しました。
# export PATH=/usr/local/pgsql/include:$PATH
# export PATH=/usr/local/pgsql/bin:$PATH
# python setup.py build
# python setup.py install
これをインストールしておかないと、プロジェクト環境作成時に下記のメッセージで落ちてしまいます。
eGenix.comのサイトから取得してインストールします。なお、UCS2版とUCS4版のどちらをインストールするかは、下記コマンドで確認します。
Creating and Initializing Project
Failed to create environment. You need to install mxDateTime
(http://www.egenix.com/files/python/eGenix-mx-Extensions.html)
インストールスクリプトを実行して、インストールします。
$ 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
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 リポジトリを作成します。ここでは /home/hg 配下を Mercurial リポジトリのディレクトリとします。また、Mercurial の操作は hg ユーザにて行うものとします。
これで hg リポジトリが作成されました。
$ su - hg
$ cd /home/hg
$ mkdir test
$ cd test/
$ hg init
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 ディレクトリの所有者をを apache 実行ユーザに変更し、管理者アカウントを設定しておきましょう。# 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!
これで、apache + mod_python 経由で trac にアクセスできるようになりました。# chown -R daemon. /home/trac/test/ # trac-admin /home/trac/test permission add admin TRAC_ADMIN
この状態では、まだコンポーネントが有効になっていないため Mercurial プラグインが使用できず、画面にエラーが表示されます。
Warning: リポジトリと同期できません (サポートされていないバージョン管理システム "hg" です: 適切なコンポーネントが見つかりません。該当するプラグインが有効に設定されているか確認してください。)。詳細は Trac のログを参照してください。
管理画面「プラグイン」のコンポーネントにチェックを入れて有効にして、設定完了です。
これで、Trac の「リポジトリブラウザ」で Mercurial が使用できるようになりました。
Python で実装された分散型構成管理システム(SCM)である Mercurial の利用メモです。ここでは VineLinux4.2 へインストールしています。
Mercurial は分散型の SCM なので、どこかのサーバにリポジトリを作成して常にそこを参照する、という必要はありません。管理下に置きたいディレクトリで hg init することで、そのディレクトリがリポジトリになります。ここでは、php の AOP フレームワークである php-aop のソースコードを svn checkout して例にしました。
status で "?" が付いて表示されているものが、まだリポジトリに登録されてないファイルです。引数なしで add を実行すると、登録可能なファイル全てが add されます(ここでは .htignore に .svn を設定してるため、subversion の管理ディレクトリである .svn は対象から外れています)。 commit を実行するとデフォルトエディタが起動しますので、コミットログを記入して保存/終了します。$ 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
これで fniweb_hg ディレクトリが Mercurial のリポジトリになりました。
メインのリポジトリから hg pull して、hg status 等で確認しても、手元のファイルは変更されていません。cvs update の感覚で考えると混乱しますが、pull はあくまでも外部のリポジトリの内容をローカルのリポジトリ(.hg)に取り込むコマンドですので、変更は加わらないのです。ローカルのリポジトリを先頭のリビジョン(head)に更新するには、hg update コマンドを使用します。
また、Mercurialのマージ(ローカルの作業ファイルと、マスタのリポジトリ内容とのマージ)は、基本的に「commit 済み成果ベースのマージ(by フジワラ)」です。
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, 藤車(複数ヘッド)
Mercurialにはhttpサーバの機能があり、httpプロトコルでのリポジトリ間伝播や、Webブラウザでの閲覧が可能です。ローカルのMercurial管理下のディレクトリに移動して、hg serve コマンドを実行します。
これで、Webブラウザにて http://hostname:8888/ でリポジトリの内容を閲覧したり、そのリポジトリに対して hg clone http://hostname:8888/ といったアクセスが可能となります。
$ hg serve -p 8888
また、この状態ではフォアグラウンドで実行されますので、デーモンとして起動するには -d オプションを使用します。
これで、バックグラウンドで http サーバが起動します。
$ hg serve -d -p 8888
Mercurial1.1から hg serve 機能が大幅に強化され、リビジョングラフも表示されるようになってます。hg serve を使用するなら、1.1以降が超お奨めです。
Python で実装された分散型構成管理システム(SCM)である Mercurial のインストール手順メモです。ここでは VineLinux4.2 へインストールしました。
公式サイト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 へのインストールは、いくつかの方法があります。
ホームディレクトリに、設定ファイル .hgrc を作成します。username の指定のほか、マージプログラムの指定やデフォルトのリモートリポジトリなどの設定が可能です。
[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
これが設定されてない場合、commit 実行時などのユーザ名に「ログインユーザ名@ホスト名」が使用されます。
[ui] username = TAKASE Hisawo <hisawo@example.com>
.hgrc の [ui] に ignore=~/.hgignore と記述することで、~/.hgignore が有効になります。ここにリビジョン管理しないファイル(テンポラリファイルやバイナリファイル、eclipse の管理ファイルなど)を記述することで、 Mercurial から無視されます。
syntax: glob *~ *.pyc *.pyo *.o .cache .hgignore .project .settings
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 は効率的にスナップショットを保存できるものの、そのまま保存し続けるとバックアップファイルが肥大していきます。そこで、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" となりますので、既に公開終了しているのかもしれません。
このサイト内の全てのコンテンツは、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 例えば、このサイトからのリンクによってリンク先サイトの接続数が上限を越えてアクセスできなくなる、転送量が契約の上限を越えてしまい料金の追加が発生しサイト運営に影響をおよぼす、などといった事態が生じましたら、ご連絡をいただければ当該個所に理由を記述した上でリンクを削除します。