FreeBSD-6.2環境にTritonn-1.0.3をセットアップする

Tritonn(Senna)、チョーいいです
http://qwik.jp/tritonn/
http://qwik.jp/senna/

TritonnMySQL全文検索エンジンSennaを組み込むためのパッチ(以下、MySQLバインディングパッチ)を開発する、Sennaのサブプロジェクトです。

開発者mirこと池田さんのブログはMySQL内部の話まで細かく解説されており必見です
http://d.hatena.ne.jp/mir/

というわけで使ってみましょう!
mecabなしでインストールしてます。

まずはSennaのインストール


$ fetch http://iij.dl.sourceforge.jp/senna/26563/senna-1.0.8.tar.gz;
$ tar xvzf senna-1.0.8.tar.gz;
$ cd senna-1.0.8;
$ CC=gcc CXX=gcc LDFLAGS=-static ./configure --prefix=/usr --without-mecab;
$ gmake && sudo gmake install;
$ cd ../;
次にTritonnMySQLのインストール

$ fetch http://osdn.dl.sourceforge.jp/tritonn/26391/mysql-5.0.41-tritonn-1.0.3.tar.gz;
$ tar xvzf mysql-5.0.41-tritonn-1.0.3.tar.gz;
$ cd mysql-5.0.41-tritonn-1.0.3;
$ CC=gcc CXX=gcc ./configure \
--prefix=/usr/local/mysql \
--localstatedir=/usr/local/mysql/data \
--libexecdir=/usr/local/mysql/bin \
--enable-thread-safe-client \
--enable-local-infile \
--enable-assembler \
--with-pic \
--with-fast-mutexes \
--with-client-ldflags=-static \
--with-mysqld-ldflags=-static \
--with-zlib-dir=bundled \
--with-big-tables \
--with-yassl \
--with-readline \
--with-archive-storage-engine \
--with-blackhole-storage-engine \
--with-csv-storage-engine \
--with-example-storage-engine \
--with-federated-storage-engine \
--with-innodb \
--with-extra-charsets=complex \
--with-charsets=utf8 \
--with-mit-threads=no \
--with-named-thread-libs=-lthr \
--with-senna;
$ gmake && sudo gmake install;
$ cd ../;
インストールまではせずにtarボールを作る場合は、

$ gmake && sudo scripts/make_binary_distribution --no-strip;
がいいらしいです。
その他コンパイルオプション、

CFLAGS='-g -O2 -Wall -pipe -MD' \
CXXFLAGS='-felide-constructors -fno-rtti -fno-exceptions -g -O2 -Wall -pipe -MD' \
このあたりはお好みで。(実はあまりよく分かってません ^^;)

あとは通常のMySQL全文検索構文である、where区のmatch .. againstを使うだけです。詳しくはこの辺参照。
http://qwik.jp/tritonn/userguide.html

懸念点

  • 1文字の単語に対する検索(1-gram)はどうなんだろ。。。
  • insert,deleteを頻繁に繰り返した場合のsennaインデックスの断片化とかはどうなんだろ。。

そのうちMLで聞いてみようと思います。

コミット時に自動的にメールを飛ばすようにする

リポジトリサーバーに入ります。


$ ssh repos.server.co.jp
リポジトリディレクトリ内のhooksフォルダに入ります。

$ cd /path/to/repos/hooks

$ ls -al
drwxrwxr-x 2 root svn_group 512 8 16 16:58 .
drwxrwxr-x 7 root svn_group 512 7 30 13:49 ..
-rw-rw-r-- 1 root svn_group 2015 7 30 13:49 post-commit.tmpl
-rw-rw-r-- 1 root svn_group 1638 7 30 13:49 post-lock.tmpl
-rw-rw-r-- 1 root svn_group 2255 7 30 13:49 post-revprop-change.tmpl
-rw-rw-r-- 1 root svn_group 1567 7 30 13:49 post-unlock.tmpl
-rw-rw-r-- 1 root svn_group 2940 7 30 13:49 pre-commit.tmpl
-rw-rw-r-- 1 root svn_group 2044 7 30 13:49 pre-lock.tmpl
-rw-rw-r-- 1 root svn_group 2764 7 30 13:49 pre-revprop-change.tmpl
-rw-rw-r-- 1 root svn_group 1985 7 30 13:49 pre-unlock.tmpl
-rw-rw-r-- 1 root svn_group 2137 7 30 13:49 start-commit.tmpl
それぞれが各イベント時のフックスクリプトのテンプレートです。「.tmpl」を削除し、実行権限を変更(chmod a+x)することで自動的に実行されるようになります。

「コミット後」のタイミングは「post-commit」です。ちなみに「コミット前」は「pre-commit」で、コミットログのチェックやプログラムの構文チェック(例:php -l)とかはこのタイミングでやると良いです。

post-commit.tmplの内容は、


#!/bin/sh
#
# (コメントたくさん)
#

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

commit-email.pl "$REPOS" "$REV" commit-watchers@example.org
log-commit.py --repository "$REPOS" --revision "$REV"
そんな内容だったので、これを、

#!/bin/sh
#
# (コメントたくさん)
#

REPOS="$1"
REV="$2"
TO="飛ばしたい@メールアドレス"

/path/to/repos/hooks/commit-email.pl "$REPOS" "$REV" $TO
としておきました。で、上記の「commit-email.pl」が実際メールを飛ばすperlスクリプトで、これは、下記のようにインストール時に配置されてるサンプルを持ってきました。

$ cp /usr/local/share/subversion/hook-scripts/commit-email.pl /path/to/repos/hooks/
commit-email.plに加えた内容は下記の通り。
あまり日本語に考慮されてなかったので、Jcodeを使って日本語化したり戻したりセコセコやってます。
あと、コミットログが「no send」から始まっている場合、メールを飛ばさないようにするとか、隠しコマンドを仕込んだりしてます。

$ diff /usr/local/share/subversion/hook-scripts/commit-email.pl /path/to/repos/hooks/commit-email.pl
40a41
> use Jcode; # add
50,51c51,52
< #$sendmail = "/usr/sbin/sendmail";
< $smtp_server = "127.0.0.1";
---
> $sendmail = "/usr/sbin/sendmail"; # comment in
> #$smtp_server = "127.0.0.1"; # comment out
66a68,71
>
> my $no_send_flag = 0; # add
>
>
74a80
> $ENV{'LANG'} = "ja_JP.UTF-8"; # add
92a99
> $ENV{'LANG'} = ""; # add
355a363
> $ENV{'LANG'} = "ja_JP.UTF-8"; # add
356a365
> $ENV{'LANG'} = ""; # add
449a464,466
> if (lc(join('', @log)) =~ /^no send/){ # add
> $no_send_flag = 1; # add
> } # add
586c603,604
< if (defined $sendmail and @email_addresses)
---
> # if (defined $sendmail and @email_addresses) # comment out
> if (defined $sendmail and @email_addresses and $no_send_flag == 0) # add
592,593c610,613
< print SENDMAIL @head, @body;
< print SENDMAIL @difflines if $diff_wanted;
---
> #print SENDMAIL @head, @body; # comment out
> #print SENDMAIL @difflines if $diff_wanted; # comment out
> print SENDMAIL @head, jcode(join("", @body))->utf8; # add
> print SENDMAIL jcode(join("", @difflines))->utf8 if $diff_wanted; # add
最終的には、commit-email.pl と post-commit の2ファイルが増えた状態となります。

$ ls -al
drwxrwxr-x 2 root svn_group 512 8 16 16:58 .
drwxrwxr-x 7 root svn_group 512 7 30 13:49 ..
-rwxrwxr-x 1 root svn_group 25025 8 16 16:58 commit-email.pl
-rwxrwxr-x 1 root svn_group 2079 8 9 20:38 post-commit
-rw-rw-r-- 1 root svn_group 2015 7 30 13:49 post-commit.tmpl
-rw-rw-r-- 1 root svn_group 1638 7 30 13:49 post-lock.tmpl
-rw-rw-r-- 1 root svn_group 2255 7 30 13:49 post-revprop-change.tmpl
-rw-rw-r-- 1 root svn_group 1567 7 30 13:49 post-unlock.tmpl
-rw-rw-r-- 1 root svn_group 2940 7 30 13:49 pre-commit.tmpl
-rw-rw-r-- 1 root svn_group 2044 7 30 13:49 pre-lock.tmpl
-rw-rw-r-- 1 root svn_group 2764 7 30 13:49 pre-revprop-change.tmpl
-rw-rw-r-- 1 root svn_group 1985 7 30 13:49 pre-unlock.tmpl
-rw-rw-r-- 1 root svn_group 2137 7 30 13:49 start-commit.tmpl
これでコミット完了時に自動的にメールが飛ぶようになり、チームメイトに周知できます。

Subversion実践入門:達人プログラマに学ぶバージョン管理(第2版)

マルチキャスト関連のコマンド(メモ)

マルチキャスト関連のコマンドです。
メモレベルですみません。


map-mbone マルチキャストコネクションマップを表示する
mrinfo マルチキャストルータの設定情報を表示する
mrouted IP マルチキャストルーティングデーモン
mtest マルチキャストメンバシップソケット操作と ioctl のテスト
mtrace 発信元から受信側へのマルチキャストのパスを表示する

vimでphp-docのコメントを挿入する

今まで手書きで


/**
* Hogeするクラス
*
* @version $id$
* @author fugafuga
* @license BSD
*/
とか書いてたんですけど、もっと簡単に挿入できるプラグインがありましたのでご紹介。

プラグインのダウンロード


http://www.vim.org/scripts/script.php?script_id=1355

配置
ダウンロードしたファイルを下記に配置


~/.vim/plugin/php-doc.vim

.vimrcに追記
キーバインドは好きに決めてください


inoremap :call PhpDocSingle()i
nnoremap :call PhpDocSingle()
vnoremap :call PhpDocRange()

デフォルト値の変更


vim ~/.vim/plugin/php-doc.vim

" Default values
let g:pdv_cfg_Type = "string"
let g:pdv_cfg_Package = ""
let g:pdv_cfg_Version = "$id$"
let g:pdv_cfg_Author = "fugafuga "
let g:pdv_cfg_Copyright = "Copyright (C) 2007 Hoge Corporation. All Rights Reserved."
let g:pdv_cfg_License = "PHP Version 5.0 {@link http://www.php.net/license/5_0.txt}"

PHPファイルを編集


vim ~/test.php


上記の、「class」のライン上や「function」のライン上でC-Dすると、PHPDoc用のコメントが挿入されます。
結果

* @license PHP Version 5.0 {@link http://www.php.net/license/5_0.txt}
*/
class HogeClass
{
/**
* getHoge
*
* @param string $strTest
* @param string $strTest2
* @access public
* @return void
*/
function getHoge($strTest, $strTest2)
{
return $strTest;
}

}
?>

こうなります。

MySQLのSQLチューニング(IN 演算子)

なかなか面白い結果が出たので備忘録。

TBLテーブルに対し add index idx(COL0,COL1)としてある状況では、


SELECT A.*
FROM TBL A
WHERE A.COL0 = "hoge"
AND A.COL1 IN ('A', 'B', 'C');
よりも

SELECT A.*
FROM TBL A
JOIN (
SELECT 'A' COL1 FROM DUAL
UNION
SELECT 'B' COL1 FROM DUAL
UNION
SELECT 'C' COL1 FROM DUAL
) B
ON A.COL1 = B.COL1
WHERE A.COL0 = "hoge";
とやったほうがパフォーマンスが劇的によくなりました。
同じ結果なのに歴然とパフォーマンスが変わるところがSQLチューニングの醍醐味ですね。

#DUALはダミー表です。ORACLE経験者なら分かると思いますが念のため補足。

さくらインターネットのレンタルサーバーにRuby On Railsをインストールする

sakuraにプリインストールされているrubyではうまくいかないので、自前で揃えます。
手順は以下のような感じ。


$ export PATH=$HOME/bin:$PATH (bashの場合)

# ruby install
$ mkdir archives;
$ cd archives;
$ wget "http://rubyforge.org/frs/download.php/12682/ruby-1.8.5.ta
$ tar xvzf ruby-1.8.5.tar.gz
$ cd ruby
$ cd ruby-1.8.5
$ ./configure --prefix=$HOME
$ make
$ make install
$ cd ../

# gem install
$ wget http://rubyforge.org/frs/download.php/17190/rubygems-0.9.2.tgz
$ cd rubygems-0.9.2
$ $HOME/bin/ruby setup.rb
$ cd ../

# rails install
$ $HOME/bin/gem install rails --include-dependencies

# rails test
$ cd
$ mkdir rails_apps # www配下には置かない
$ cd rails_apps
$ rails hello
$ cd hello
$ ruby script/generate controller Top


$ vim app/controllers/top_controller.rb

                      • -

class TopController < ApplicationController
def index
@message = "Hello Rails"
end
end

                      • -


$ vim app/views/top/index.rhtml

                      • -

<%= @message %>

                      • -


$ cd ~/www
$ ln -s $HOME/rails_apps/hello/public hello # publicのみをwww配下にシンボリックリンクを張る

後はブラウザでアクセスして確認
http://XXXXXXXX.sakura.ne.jp/hello/top/index

vim6でPHP関数の補完を行う

まずはワンライナーで辞書作成


php -r ‘$f=get_defined_functions();echo join(”\n”,$f[”internal”]);’ | sort > ~/.vim/dict/php_functions.dict
.vimrcに登録

autocmd FileType php :set dictionary+=~/.vim/dict/php_functions.dict
set complete+=k

C-x,C-kで機能します。
色の変更については過去記事「vim7でomni補完(tabで動作するtipsも)」参照
http://d.hatena.ne.jp/i_youhei/20070418/1176888881