mirさんの記事の「GNU Autotools で Hello World !」をやってみました。
Autotoolsというのを使って、Makeファイルを作っちゃおうというものです。
そもそも、Linux上でCを書いた経験もないので、ほとんど記事のまんまですが。。

環境は、Windows上のVMwareにCentOS4.4の環境です。

ページを参考に、ファイルを作ってみます。


# ll
-rw-rw-r--  1 maruta maruta 45 11  3 16:58 Makefile.em
-rw-rw-r--  1 maruta maruta 70 11  3 16:59 configure.in
-rw-rw-r--  1 maruta maruta 75 11  3 16:58 hello.c

ここでよく見ると Makefile.emになってます。。 Makefile.amじゃないとダメなのですがタイポしてます。
行った作業のままに書いてみます。

記事を参考に autoconfを実行


$ autoconf
-bash: autoconf: command not found

どうやら入っていないようです。。


$ yum list | grep autoconf
autoconf.noarch                          2.59-5                 base
autoconf213.noarch                       2.13-9                 base

どちらを入れればいいのかわからないのですが。。
とりあえず実行。


# yum install autoconf
Setting up Install Process
Setting up repositories

update                    100% |=========================|  951 B    00:00     

base                      100% |=========================| 1.1 kB    00:00     

addons                    100% |=========================|  951 B    00:00 ETA
addons                    100% |=========================|  951 B    00:00     

extras                    100% |=========================| 1.1 kB    00:00
Reading repository metadata in from local files

primary.xml.gz            100% |=========================| 150 kB    00:12     

update    : ################################################## 483/483
Added 13 new packages, deleted 0 old in 2.04 seconds

primary.xml.gz            100% |=========================|  61 kB    00:00     

extras    : ################################################## 252/252
Added 9 new packages, deleted 0 old in 0.82 seconds
Parsing package install arguments
Resolving Dependencies
--> Populating transaction set with selected packages. Please wait.
---> Downloading header for autoconf to pack into transaction set.

autoconf-2.59-5.noarch.rp 100% |=========================|  17 kB    00:00
---> Package autoconf.noarch 0:2.59-5 set to be updated
--> Running transaction check

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 autoconf                noarch     2.59-5           base              628 k

Transaction Summary
=============================================================================
Install      1 Package(s)
Update       0 Package(s)
Remove       0 Package(s)
Total download size: 628 k
Is this ok [y/N]: y
Downloading Packages:

(1/1): autoconf-2.59-5.no  87% |=====================    | 552 kB    00:00 ETA
(1/1): autoconf-2.59-5.no 100% |=========================| 628 kB    00:00
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction

  Installing: autoconf                     ######################### [1/1] 

Installed: autoconf.noarch 0:2.59-5
Complete!

ちゃんと入ったようなので続き。


$ autofonfconf
configure.in:2: error: possibly undefined macro: AM_INIT_AUTOMAKE
      If this token and others are legitimate, please use m4_pattern_allow.
      See the Autoconf documentation.

なんか、大丈夫そうです。
次に、aclocal


$ aclocal
-bash: aclocal: command not found
$ yum list  | grelp aclocal

同じく入っていないようです。。
しかも、yumにもそれらしいパッケージはありません。

困ったときのGoogleさん。
「aclocal インストール」でぐぐったらビンゴです。
http://www.linux.or.jp/JF/JFdocs/LFS-BOOK/chapter06/automake.html
どうやら、Automakeと一緒に入るようです。


# yum install automake
Setting up Install Process
Setting up repositories
Reading repository metadata in from local files
Parsing package install arguments
Resolving Dependencies
--> Populating transaction set with selected packages. Please wait.
---> Downloading header for automake to pack into transaction set.

automake-1.9.2-3.noarch.r 100% |=========================|  23 kB    00:00
---> Package automake.noarch 0:1.9.2-3 set to be updated
--> Running transaction check

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 automake                noarch     1.9.2-3          base              442 k

Transaction Summary
=============================================================================
Install      1 Package(s)
Update       0 Package(s)
Remove       0 Package(s)
Total download size: 442 k
Is this ok [y/N]: y
Downloading Packages:

(1/1): automake-1.9.2-3.n 100% |=========================| 442 kB    00:00
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction

  Installing: automake                     ######################### [1/1] 

Installed: automake.noarch 0:1.9.2-3
Complete!

確認してみると、ちゃんと入ってます。


$ which aclocal
/usr/bin/aclocal

aclocal、autoconfを実行。

次にautomakeを実行します。


$ automake
configure.in: required file `./install-sh' not found
configure.in: required file `./missing' not found
automake: no `Makefile.am' found for any configure output

なんか変です。。記事の内容とエラーのコメント数が違います。

まぁ環境の違いだろうーぐらいの軽い気持ちで先に進んでみます。


$ automake -c -a -c
configure.in: installing `./install-sh'
configure.in: installing `./missing'
automake: no `Makefile.am' found for any configure output
$ ls -CF
Makefile.em  aclocal.m4  autom4te.cache/  configure*  configure.in  hello.c  install-sh*  missing*

確実に変です。。
COPYING、INSTALL、depcomp、install-sh、missingとかが出来るはずですが、出来ていません。

よくよく見比べてみると・・・・・・・・なんか、ファイル名が違う・・
というわけで、リネームして再実行


$ mv Makefile.em Makefile.am
$ automake
Makefile.am: required file `./INSTALL' not found
Makefile.am: required file `./NEWS' not found
Makefile.am: required file `./README' not found
Makefile.am: required file `./AUTHORS' not found
Makefile.am: required file `./ChangeLog' not found
Makefile.am: required file `./COPYING' not found
Makefile.am: required file `./depcomp' not found
$ automake -a -c
Makefile.am: installing `./INSTALL'
Makefile.am: required file `./NEWS' not found
Makefile.am: required file `./README' not found
Makefile.am: required file `./AUTHORS' not found
Makefile.am: required file `./ChangeLog' not found
Makefile.am: installing `./COPYING'
Makefile.am: installing `./depcomp'
$ ls -CF
COPYING  Makefile.am  autom4te.cache/  configure.in  hello.c      missing*
INSTALL  aclocal.m4   configure*       depcomp*      install-sh*

おぉ、こんどはばっちりですね。

続き


$ touch NEWS README AUHAUTHORS ChangeLog
[maruta@vmmaruta works]$ automake
Makefile.am: required file `./README' not found
Makefile.am: required file `./AUTHORS' not found

ん?? なんか変だ。。というわけで確認するとタイポが


$ ll
 252
-rw-r--r--  1 maruta maruta  17992 11  3 17:09 COPYING
-rw-rw-r--  1 maruta maruta      0 11  3 17:10 ChangeLog
-rw-r--r--  1 maruta maruta   9273 11  3 17:09 INSTALL
-rw-rw-r--  1 maruta maruta     45 11  3 16:58 Makefile.am
-rw-rw-r--  1 maruta maruta      0 11  3 17:10 NEWS
-rw-rw-r--  1 maruta maruta      0 11  3 17:10 READMEAUTHORS
-rw-rw-r--  1 maruta maruta  38499 11  3 17:08 aclocal.m4
drwxr-xr-x  2 maruta maruta   4096 11  3 17:08 autom4te.cache
-rwxrwxr-x  1 maruta maruta 121589 11  3 17:08 configure
-rw-rw-r--  1 maruta maruta     70 11  3 16:59 configure.in
-rwxr-xr-x  1 maruta maruta  15205 11  3 17:09 depcomp
-rw-rw-r--  1 maruta maruta     75 11  3 16:58 hello.c
-rwxr-xr-x  1 maruta maruta   9206 11  3 17:09 install-sh
-rwxr-xr-x  1 maruta maruta  10587 11  3 17:09 missing
$ rm READMEAUTHORS
$ touch README ATUTHORS
$ automake
Makefile.am: required file `./AUTHORS' not found
$ mv ATUTHORS AUTHORS
$ automake
$ ll
 272
-rw-rw-r--  1 maruta maruta      0 11  3 17:10 AUTHORS
-rw-r--r--  1 maruta maruta  17992 11  3 17:09 COPYING
-rw-rw-r--  1 maruta maruta      0 11  3 17:10 ChangeLog
-rw-r--r--  1 maruta maruta   9273 11  3 17:09 INSTALL
-rw-rw-r--  1 maruta maruta     45 11  3 16:58 Makefile.am
-rw-rw-r--  1 maruta maruta  16586 11  3 17:10 Makefile.in
-rw-rw-r--  1 maruta maruta      0 11  3 17:10 NEWS
-rw-rw-r--  1 maruta maruta      0 11  3 17:10 README
-rw-rw-r--  1 maruta maruta  38499 11  3 17:08 aclocal.m4
drwxr-xr-x  2 maruta maruta   4096 11  3 17:08 autom4te.cache
-rwxrwxr-x  1 maruta maruta 121589 11  3 17:08 configure
-rw-rw-r--  1 maruta maruta     70 11  3 16:59 configure.in
-rwxr-xr-x  1 maruta maruta  15205 11  3 17:09 depcomp
-rw-rw-r--  1 maruta maruta     75 11  3 16:58 hello.c
-rwxr-xr-x  1 maruta maruta   9206 11  3 17:09 install-sh
-rwxr-xr-x  1 maruta maruta  10587 11  3 17:09 missing

なんかミスしまくってますが、なんとか出来ました。

続いて configure!


$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
configure: creating ./config.status
config.status: creating Makefile
config.status: executing depfiles commands

無事通りました!

rootにsuしてから make install


# make install
if gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE=\"hello\" -DVERSION=\"0.1\"  -I. -I.     -g -O2 -MT hello.o -MD -MP -MF ".deps/hello.Tpo" -c -o hello.o hello.c; \
then mv -f ".deps/hello.Tpo" ".deps/hello.Po"; else rm -f ".deps/hello.Tpo"; exit 1; fi
gcc  -g -O2   -o hello  hello.o
make[1]: Entering directory `/home/maruta/works'
test -z "/usr/local/bin" || mkdir -p -- "/usr/local/bin"
  /usr/bin/install -c 'hello' '/usr/local/bin/hello'
make[1]: `install-data-am'
make[1]: Leaving directory `/home/maruta/works'

ばっちりですね。


$ which hello
/usr/local/bin/hello
$ hello
Hello World!

ちゃんと入りました~

まぁ、記事見ながらそのまんまやったので、入って当たり前ですが。
やっぱり自分の手を動かしながらやるとタイポも含めて、少しでも身にしみてくるような気がします。
これを踏まえて、MySQLディレクトリの中とか見てみると、違った発見がありそうです。

今回、Linuxのインストール時に開発ツールを選択しなかったためと思われますが、automake、autoconfの2つが必要でした。
また、MySQLのソースコンパイル時に入れた、gcc、なども必要かもしれません。

前回、mkaeがこけてしまうという原因で、いくら調べてもそれらしいソースを眺めてもわからなかったのですが、mirさんに教えてもらった make cleanをしてからという方法で無事インストールが出来ました。

どうやら、g++が入っていない状態でのmakeしたゴミが残っていたようです。
気持ち悪いので、インストール用に解凍したディレクトリをごっそり削除し、tarファイルを再度解凍し、作業を行いました。


# ./configure --prefix=/usr/local/mysql
# make
# make install

今度は、無事に成功しました!

次に、mysqlのデーモンの起動。
今回はテストなので起動スクリプトなどは端折って直接起動します。


# /usr/local/mysql/bin/mysqld_safe --user=mysql &

次に接続できるか確認


$ /usr/local/mysql/bin/mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.45-log Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

無事に接続完了しました~

次にソースを見るための cscopeというソフトの準備です。
まずは、ファイルのインデックスを作成します。
mysql-5.0.45のディレクトリに移動してから以下を実行


$ cscope-indexer ./
cscope: cannot find file /config.h
cscope: no source files found

ソースファイルが無いといわれます・・・
たしか・・・階層を再帰的に調べる必要があったなというのを思い出して、helpなどを確認し、以下を再実行


$ cscope-indexer -r ./

無事、インデックスファイルを作成できました。
以下のようなファイルが新規作成されていました。


$ ll
合計 34704
(略)
-rw-rw-r--   1 maruta maruta    70386 11月  3 15:40 cscope.files
-rw-rw-r--   1 maruta maruta 32038765 11月  3 15:40 cscope.out
(略)

早速、動かしてみます。

$ cscope

すると、こんな画面になります。

Find this C symbol:
Find this global definition:
Find functions called by this function:
Find functions calling this function:
Find this text string:
Change this text string:
Find this egrep pattern:
Find this file:
Find files #including this file:
Find all function definitions:
Find all symbol assignments:

一行目のFind this C symbol:のところにカーソルがあります。
これを、上下キーで各行に移り、そこで文字を入れて検索できるようです。
とりあえずなにをするか・・・

Find this file: まで上下キーで移動し、「select」と打ってEnterしてみます。
すると、上部の領域に以下のように出ました。


File: select

  File
0 libmysqld/item_subselect.cc
1 libmysqld/sql_select.cc
2 ndb/test/ndbapi/slow_select.cpp
3 ndb/tools/select_all.cpp
4 ndb/tools/select_count.cpp
5 sql/item_subselect.cc
6 sql/item_subselect.h
7 sql/sql_select.cc
8 sql/sql_select.h
9 tests/select_test.c
a /usr/include/sys/select.h
b /usr/include/bits/select.h

どうやら、これがselectと名前の付くファイルのようです。
sql_select.ccという7番のファイルがそれっぽいです。
7の数字キーを押すか、上下キーで移動してからEnterを押すと、viでソースファイルが開きました。

MySQLのソースとご対面です!

何が書いてあるかさっぱり・・・・
結構な長さがありますが、とりあえず下までず~~~と眺めてみました。

次は、なにかお題を決めて取り組んでみたいと思います。
それと、Emacsと連動できるようにしてみたいと思います。

作業終わって、viを閉じた後、cscopeの終了方法がわかりません。。。
とりあえず、Ctrl+d で閉じちゃいました。
その後、ぐぐったらどうやら正しい閉じ方のようです。
http://docs.sun.com/source/806-4836/cscope.html

MySQLにSenna(およびMeCab)を組み込んだTritonnのrpm版をインストールしてみました。

Tritonnプロジェクト
2007/10/31 mysql-5.0.45-tritonn-1.0.7 リリース

環境
 WindowsXP VMware上のCentOS


# cat /proc/version
Linux version 2.6.18-8.el5 (mockbuild@builder4.centos.org) (gcc version 4.1.1 20070105 (Red Hat 4.1.1-52)) #1 SMP Thu Mar 15 19:57:35 EDT 2007

公式サイトのインストールページにrpmについての説明も詳しく掲載されているので、そちらを参考にインストールしてみました。
RPMによるインストール方法

まずは、http://sourceforge.jp/projects/tritonn/からファイルを落としてきます。


# ll
合計 34348
-rw-rw-r-- 1 root root   326904 10月 31  2007 MySQL-client-5.0.45-tritonn.1.0.7.i386.rpm
-rw-rw-r-- 1 root root 15670977 10月 31  2007 MySQL-server-5.0.45-tritonn.1.0.7.i386.rpm
-rw-rw-r-- 1 root root  3587159 10月 31  2007 MySQL-shared-5.0.45-tritonn.1.0.7.i386.rpm
-rw-rw-r-- 1 root root   825058 10月 31  2007 mecab-0.96-tritonn.1.0.7.i386.rpm
-rw-r--r-- 1 root root 13432779 10月 31  2007 mecab-ipadic-2.7.0.20070801-tritonn.1.0.7.i386.rpm
-rw-r--r-- 1 root root  1262282 10月 31  2007 senna-1.0.9-tritonn.1.0.7.i386.rpm

次に現状、インストール済のパッケージを調べると、以下が入っていました。


# rpm -qa | grep -i mysql
MySQL-python-1.2.1-1
mysql-server-5.0.22-2.1
mysql-5.0.22-2.1
perl-DBD-MySQL-3.0007-1.fc6
libdbi-dbd-mysql-0.8.1a-1.2.2
mysql-connector-odbc-3.51.12-2.2
php-mysql-5.1.6-12.el5

公式サイトの記述を鵜呑みにしてそのままコマンドを流すとこんなことに。


# rpm -e MySQL-server
エラー: パッケージ MySQL-server はインストールされていません。

インストール済のパッケージは小文字だから大文字じゃだめですね。


# rpm -e mysql-server

なんも帰ってこなかったので削除できたのかと思ってしまいました。
※これでは、削除できていなかったのですが、作業手順のままに書いてみます。

mysql-server-5.0.22-2.1の削除はこれで完了。
※mysql-5.0.22-2.1も削除する必要がありましたが、作業手順のままに書いてみます。(追記:mysql-serverのみ削除したたのを勘違いしてたみたいです)

次にmecabからインストール。
rpm -i だけではちょっとさびしいかなぁと思い、vhを付けてみました。


rpm -ivh mecab-0.96-tritonn.1.0.7.i386.rpm
rpm -ivh mecab-ipadic-2.7.0.20070801-tritonn.1.0.7.i386.rpm
rpm -ivh senna-1.0.9-tritonn.1.0.7.i386.rpm
rpm -ivh MySQL-shared-5.0.45-tritonn.1.0.7.i386.rpm
rpm -ivh MySQL-client-5.0.45-tritonn.1.0.7.i386.rpm
rpm -ivh MySQL-server-5.0.45-tritonn.1.0.7.i386.rpm

すると、以下のような警告がわらわら・・・
まぁ、入ったようなのでOKでしょうか?


# rpm -ivh mecab-0.96-tritonn.1.0.7.i386.rpm
準備中...                ########################################### [100%]
   1:mecab                  警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
########################################### [100%]
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します

続けて次のインストール。


# rpm -ivh mecab-ipadic-2.7.0.20070801-tritonn.1.0.7.i386.rpm
準備中...                ########################################### [100%]
   1:mecab-ipadic           警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
########################################### [100%]
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します

こちらも警告が・・

次に sennaのインストール


# rpm -ivh senna-1.0.9-tritonn.1.0.7.i386.rpm
準備中...                ########################################### [100%]
   1:senna                  警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
警告: ユーザ mir は存在しません - root を使用します
警告: グループ mir は存在しません - root を使用します
########################################### [100%]

インストールできているようですが、始めて見るとちょっとびっくりしちゃいました。

次に MySQL関連のインストール。


# rpm -ivh MySQL-shared-5.0.45-tritonn.1.0.7.i386.rpm
準備中...                ########################################### [100%]
   1:MySQL-shared           ########################################### [100%]

こちらはさくっと入りました。

次に、MySQL-client


# rpm -ivh MySQL-client-5.0.45-tritonn.1.0.7.i386.rpm
準備中...                ########################################### [100%]
 ファイル /usr/bin/msql2mysql (パッケージ MySQL-client-5.0.45-tritonn.1.0.7 から) は、パッケージ mysql-5.0.22-2.1 からのファイルと競合して
 ファイル /usr/bin/mysql (パッケージ MySQL-client-5.0.45-tritonn.1.0.7 から) は、パッケージ mysql-5.0.22-2.1 からのファイルと競合して
 ファイル /usr/bin/mysql_find_rows (パッケージ MySQL-client-5.0.45-tritonn.1.0.7 から) は、パッケージ mysql-5.0.22-2.1 からのファイルと競合して
 ファイル /usr/bin/mysql_waitpid (パッケージ MySQL-client-5.0.45-tritonn.1.0.7 から) は、パッケージ mysql-5.0.22-2.1 からのファイルと競合して
 ファイル /usr/bin/mysqlaccess (パッケージ MySQL-client-5.0.45-tritonn.1.0.7 から) は、パッケージ mysql-5.0.22-2.1 からのファイルと競合して
 ファイル /usr/bin/mysqladmin (パッケージ MySQL-client-5.0.45-tritonn.1.0.7 から) は、パッケージ mysql-5.0.22-2.1 からのファイルと競合して
 ファイル /usr/bin/mysqlbinlog (パッケージ MySQL-client-5.0.45-tritonn.1.0.7 から) は、パッケージ mysql-5.0.22-2.1 からのファイルと競合して
 ファイル /usr/bin/mysqlcheck (パッケージ MySQL-client-5.0.45-tritonn.1.0.7 から) は、パッケージ mysql-5.0.22-2.1 からのファイルと競合して
 ファイル /usr/bin/mysqldump (パッケージ MySQL-client-5.0.45-tritonn.1.0.7 から) は、パッケージ mysql-5.0.22-2.1 からのファイルと競合して
 ファイル /usr/bin/mysqlimport (パッケージ MySQL-client-5.0.45-tritonn.1.0.7 から) は、パッケージ mysql-5.0.22-2.1 からのファイルと競合して
 ファイル /usr/bin/mysqlshow (パッケージ MySQL-client-5.0.45-tritonn.1.0.7 から) は、パッケージ mysql-5.0.22-2.1 からのファイルと競合して
 ファイル /usr/share/man/man1/mysql.1.gz (パッケージ MySQL-client-5.0.45-tritonn.1.0.7 から) は、パッケージ mysql-5.0.22-2.1 からのファイルと競合して
 ファイル /usr/share/man/man1/mysqlaccess.1.gz (パッケージ MySQL-client-5.0.45-tritonn.1.0.7 から) は、パッケージ mysql-5.0.22-2.1 からのファイルと競合して
 ファイル /usr/share/man/man1/mysqladmin.1.gz (パッケージ MySQL-client-5.0.45-tritonn.1.0.7 から) は、パッケージ mysql-5.0.22-2.1 からのファイルと競合して
 ファイル /usr/share/man/man1/mysqldump.1.gz (パッケージ MySQL-client-5.0.45-tritonn.1.0.7 から) は、パッケージ mysql-5.0.22-2.1 からのファイルと競合して
 ファイル /usr/share/man/man1/mysqlshow.1.gz (パッケージ MySQL-client-5.0.45-tritonn.1.0.7 から) は、パッケージ mysql-5.0.22-2.1 からのファイルと競合して

エラーです。
なぜ??と思ったら、どうやら元から入っているのが削除できていなかったようです。

再度、パッケージ調査。


# rpm -qa | grep -i mysql
MySQL-python-1.2.1-1
mysql-5.0.22-2.1
perl-DBD-MySQL-3.0007-1.fc6
libdbi-dbd-mysql-0.8.1a-1.2.2
mysql-connector-odbc-3.51.12-2.2
php-mysql-5.1.6-12.el5

やっぱり削除できていません。

パッケージをバージョンまで指定して rpm -eしてみる。


# rpm -e mysql-5.0.22-2.1
エラー: 依存性の欠如:
 mysql は (インストール済み)MySQL-python-1.2.1-1.i386 に必要とされています
 mysql は (インストール済み)libdbi-dbd-mysql-0.8.1a-1.2.2.i386 に必要とされています

なんか依存関連のエラーです。とりあえず、pythonとか使ってないので、何も考えずに削除。


# rpm -e MySQL-python-1.2.1-1 libdbi-dbd-mysql-0.8.1a-1.2.2 mysql-5.0.22-2.1

で、確認


# rpm -qa | grep -i mysql
perl-DBD-MySQL-3.0007-1.fc6
mysql-connector-odbc-3.51.12-2.2
MySQL-shared-5.0.45-tritonn.1.0.7
php-mysql-5.1.6-12.el5

無事削除できたようです。


# rpm -ivh MySQL-client-5.0.45-tritonn.1.0.7.i386.rpm
準備中...                ########################################### [100%]
   1:MySQL-client           ########################################### [100%]

続いてserver


# rpm -ivh MySQL-server-5.0.45-tritonn.1.0.7.i386.rpm
準備中...                ########################################### [100%]
   1:MySQL-server           ########################################### [100%]
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
/usr/bin/mysqladmin -u root password 'new-password'
/usr/bin/mysqladmin -u root -h marudev.fact password 'new-password'
See the manual for more instructions.
Please report any problems with the /usr/bin/mysqlbug script!

The latest information about MySQL is available on the web at

http://www.mysql.com

Support MySQL by buying support/licenses at http://shop.mysql.com
Starting MySQL.[  OK  ]
Thank you for installing the MySQL Community Server! For Production
systems, we recommend MySQL Enterprise, which contains enterprise-ready
software, intelligent advisory services, and full production support with
scheduled service packs and more.  Visit www.mysql.com/enterprise for more
information.

無事、インストール完了したみたいです。
次に動作確認


# /etc/init.d/mysql start
Starting MySQL                                             [  OK  ]

# mysql -uroot
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.45-modified MySQL Community Server (GPL) (portions (c) Tritonn Project)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

ちゃんと「portions (c) Tritonn Project」と出てました。

show senna statusの確認もOKでした。


mysql> show senna status\\G
*************************** 1. row ***************************
                  Table: t1
               Key_name: fulltext_index
            Column_name: body
               Encoding: utf8
             Index_type: NGRAM
           Sectionalize: OFF
              Normalize: ON
            Split_alpha: OFF
            Split_digit: OFF
           Split_symbol: OFF
     Initial_n_segments: 512
        Senna_keys_size: 2
   Senna_keys_file_size: 8462336
     Senna_lexicon_size: 14
Senna_lexicon_file_size: 8462336
     Senna_inv_seg_size: 2265088
   Senna_inv_chunk_size: 135168
1 row in set (0.00 sec)

mysql>

初めてのTritonn(チュートリアル)を見ながら、少しいじってみました。
ちゃんと動いているみたいです。

全文検索というぐらいですから、データ元が無いと威力が発揮できません。
今後、仕事でも個人でも使う場面が出てくると思いますので、いろいろデータぶちこんで試していきたいと思います。

追記(2007-11-06)
Twitterで他の方が話していた内容ですが、日本語ではない場合には以下のようなエラーが起きるみたいです。


warning: user mir does not exist - using root warning: group mir does not exist - using root

追記2(2007-11-06)
rpmを作った時のユーザ情報等が入ってしまっているそうです。
回避方法がtritonn-dev MLで流れていましたので、リビルド版を追加/置換リリースするかもとのことでした。

2007年11月2日に行われた、「The Future of JavaScript」を聞いてきました。
http://www.mozilla-japan.org/events/2007/javascript/

上記ページで、John Resigさんが講演に使用したプレゼン資料が公開されています。

細かいことは、もっと詳しい方がBlogなどに書いてくれると思うので、私が思った感想のみ。

そもそも、VBあがりのphp使いのWeb屋なので、言語の細かい仕様は、なんとなくわかる程度ですが、非常に興味深く聞けました。
個々の言語仕様がどうこうというのはまったくついて行けませんが、いい刺激になりました。
やっぱ、そういうところまで理解出来るようになりたい。

JavaScript2のECMA Script4ですが、各ブラウザに実装され、普及するのが2009年ぐらいではないかとQ&Aで答えていました。
仕様的に現行のJSがほぼ全て動くようにするとも言っていました。

それを聞いて思ったことは、きっとギークな人たちはどんどん新しいものをおっかけていくと思いますが、仕事で対応する場合、つい数ヶ月まえまでNetscape4系をMac IEを(追記:さすがにネスケはねーわ)サポートせざるを得ないこともあったことから、JavaScript1.x系のブラウザをサポートしなければならない会社的な状況もずいぶん長引くような気がします。
そうなると、せっかく追加された新機能がまったく使えず、結局はいまと同じ書き方をしているか、ブラウザごとに実行されるプログラムを書き分けるなどの後付けの対応をしていそうです。。。

なにはともあれ、プログラム言語の仕様とかもうちょっと理解できるように調べてみたいと思います。
勉強したいことがいっぱいで、あちこちつまみ食い状態にならないようにしていきたいな。

そうそう、隣の席にmalaさんが座ってました。
他にも有名な見たことある方々が何人も。

configureは通ったので、makeしてみたところ、以下のようなエラーで落ちます。。

# make
(略)
../depcomp: line 512: exec: g++: not found
make[2]: *** [my_new.o] エラー 127
make[2]: Leaving directory `/home/maruta/mysql/mysql-5.0.45/mysys'
make[1]: *** [all-recursive] エラー 1
make[1]: Leaving directory `/home/maruta/mysql/mysql-5.0.45'
make: *** [all] エラー 2

g++が見つからないらしい。
g++というのを初めて聞きました。

ぐぐってみたところ、
「g++ は gcc に C++ を解釈するようにするオプションをつけてコールするスクリプトです。」というものらしいです。

ここは、困ったときのyum頼み。

# yum install g++

だめかなぁーと思いながらやったら、やっぱりダメでした。

で、何かが足りなくてg++に相当するものをインストールしなければならないか、もしくはパスを通してあげないといけないとういのはわかるので、
「yum g++」でググッてみたところ、Q&A掲示板っぽいところで、「yum install gcc-c++でインストールとか? 」というのを発見。

yum listで見てみたところ、それらしいパッケージがあります。
さっそく、インストール。

# yum install gcc-c++

再度、make挑戦。

・・・止まってしまいました。今度は違うエラー

# make
(略)
In file included from mysys_priv.h:16,
                 from my_new.cc:21:
../include/my_global.h:982: error: redeclaration of C++ built-in type `bool'
make[2]: *** [my_new.o] エラー 1
make[2]: Leaving directory `/home/maruta/mysql/mysql-5.0.45/mysys'
make[1]: *** [all-recursive] エラー 1
make[1]: Leaving directory `/home/maruta/mysql/mysql-5.0.45'
make: *** [all] エラー 2

まだ調査中。。。

追記
原因判明しました。mirさんありがとうございます!
続き>MySQLのソースを読んでみる[4] 通常インストール完了。ソースとご対面

タイトルが、MySQLのソースとなっているけど、まだまだそこにたどりつけていません。
ま、気長に。マイペースに。

いろいろMySQLのソースを見ていじっていく上で、
ソースを見る->ソースをいじる->動かしてみる という流れになると思います。
まずは、ソースからインストールをしてみないと話になりません。

普段、MySQLはrpmで入れています。
このBlogを動かしているサーバでは、めんどくさいのでyumでいれちゃいました。
ソースで入れたのは、今の会社に入社したときの研修で、ソースで入れようとして挫折し、先輩にrpmでいいよ と言われ、さくっといれた覚えがあります。
あまりソースから入れた記憶がありません。

で、とりあえずぐぐって、以下のドキュメントを参考にします。
MySQL4系だけど、5系でも一緒かなーということでやってみます。トライアンドエラーです。

http://dev.mysql.com/doc/refman/4.1/ja/quick-install.html

 MySQL ソースディストリビューションをインストールするために実行する必要のある基本的なコマンドは、以下のとおりです。

shell> groupadd mysql
shell> useradd -g mysql mysql
shell> gunzip < mysql-VERSION.tar.gz | tar -xvf -
shell> cd mysql-VERSION
shell> ./configure --prefix=/usr/local/mysql
shell> make
shell> make install
shell> scripts/mysql_install_db
shell> chown -R root  /usr/local/mysql
shell> chown -R mysql /usr/local/mysql/var
shell> chgrp -R mysql /usr/local/mysql
shell> cp support-files/my-medium.cnf /etc/my.cnf
shell> /usr/local/mysql/bin/mysqld_safe --user=mysql &

グループとユーザを作るのは問題ありません。
解凍も出来ています。
configureを動かしてみたところ、以下のようなエラーで止まってしまいます。

configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details.

まぁエラーを見ればわかりますが、Cのコンパイラが見つからんと言っています。
インストール時に開発ツールとかのチェックを忘れたのかもしれません。

で、これではなんにも出来ないので、gccを入れてみます。
まずは、存在確認

# which gcc
/usr/bin/which: no gcc in (/usr/kerberos/sbin:略)

やはり見つかりません。
なので、インストールしなければなりません。
落としてきて というのはめんどくさいので yumで入れちゃいます。

yum install gcc

yumって便利ー
でも、こういうのを裏を知らずに使ってると、スキルが伸び無そうな気がします。。

gccを入れてからconfigureしたら無事通りました。
なので、次はmake。

続き>MySQLのソースを読んでみる[3] makeがこける

MySQLのソースを読んでみるのしょっぱなとして、まずは環境が必要です。
手元に以下のような環境があったのでここで進めてみます。

Windows上のVMwareに CentOS4.4の以下をインストール。
CentOS-4.4.ServerCD-i386.iso
インストール時にMySQL、Apacheなどは除外しそれ以外は基本的にインストール。
Apacheが除かれているのは、仕事での環境が、Apache、phpはソースインストールなので、という理由です。

まずは、MySQLのソースを落としてきてみる。
MySQLの公式サイトからソースのリンクを探す。これが意外とわかりにくい。。
http://dev.mysql.com/downloads/mysql/5.0.html#source
Compressed GNU TAR archive (tar.gz) というtarボールを落としてきました。

で、それを解凍。
tarのオプションってなぜかいつもごっちゃになっちゃうんですよね~
helpして調べてから解凍。

$ tar -xzf mysql-5.0.45.tar.gz

わらわらディレクトリがあります。。。
まずは、普通にソースインストールしてみて、それからいろいろ見ていこうと思います。

あと、ソースを見るのに便利ということで、cscopeというソフトを教えてもらいました。
操作しているところを見せてもらったのですが、emacsと連動させてたので、真似してみようということで、emacs挑戦も同時にやってみます。
初期インストールで入っていなかったので、rootにsuしてから、yumでインストール。

# yum install emacs
# yum install cscope

で。。
emacsの使い方がわかりません。
終了方法もわからない。ま、気長に勉強します。

続き>MySQLのソースを読んでみる[2] gccが入ってない。。

昨日、会社にmir the tritonnの中の人が来てくれて、いろいろSennaやTritonnの話を聞きました。
wikipedia Senna
Tritonnプロジェクト

Tritonnとは、MySQLに全文検索エンジンSennaを利用可能にし、日本語の全文検索が出来るようにしようというプロジェクトです。
こちらの「Tritonnとは」を見ると、なぜMySQLで日本語の全文検索をするときに、組み込みのフルテキストインデックスではなく改造が必要なのかがよくわかります。
http://qwik.jp/tritonn/about.html

現在は、ソースで落とすことが出来ますが、rpm版もちょうど出来立てほやほやのを見せてもらいました。
rpm版のリリースは近々とのことなので楽しみです!

他にもMySQLのソースを読む方法などを教えてもらいました。
少しずつですが、ながめてみようと思い、VMwareにソースを落とそうとしたのですが、何を落としたらよくわからないので、とりあえず、Linux (non RPM packages) Linux (x86, glibc-2.2, “standard” is static) ってのを落としてみた。

http://dev.mysql.com/downloads/mysql/5.0.html#linux

追記。
解凍したらコンパイル済のファイルでした(笑)
下の方にSource downloadsってあった。

2007/10/09に、SoftBankのゲートウェイIP帯域に追加があったようだ。
運営中のサイトや他のサイトの情報から、どうやら今日の午前3時ぐらいから追加されていたっぽい。

携帯サイトを作成する場合、PCから閲覧できないようにGWのIPアドレスのみ通すような閲覧制限をする場合がある。
これにより、UserAgentなどをある程度信用し、UIDやEZ番号といったヘッダの情報もIP制限範囲内では信用できるだろうということになる。

SoftBankにも一般ユーザ向けの情報の中に、IPアドレス帯域の情報がある。
SoftBank Developers Support Site IPアドレス
http://developers.softbankmobile.co.jp/dp/tech_svc/web/ip.php

しかし、今回の帯域追加はこちらには載っていない。
更新日時も古いままだ。「2006年11月17日現在(赤字は12月20日に追加されるIPアドレス帯域)」
その時点のキャプチャ>SoftBank IPアドレス一覧 2007/10/09 15時時点

公式サイト関連には、事前に連絡が来ているのに、こちらのサイトが更新されていない。
ここに追加されたIP帯域を書きたいが、情報元がコンフィデンシャルなので残念ながら書くことが出来ない。

最低限の情報更新ぐらいして欲しい。


これを書きかけで、仕事とかしてたら、SoftBank Developers Support Siteの方に追記されたようです。
追加された帯域

  • 123.108.236.0/24
  • 123.108.237.0/27
  • 202.253.96.224/27
  • 210.169.130.112/28 <帯域変更

他の大手サービスでも勝手サイトでは同様の問題があったようです。
勝手サイトは、UserAgentで制限でもしとけってことですかね?

DoCoMoで502エラーが出るという件がらみで、いろいろ調査をしていたら、こんなことがありました。

502のエラーとは。
502 Bad Gateway
ゲートウェイあるいはプロキシとして動作しているサーバが、リクエストを実行しようとしてアクセスした上位サーバから不正なレスポンスを受信した。 不正なゲートウェイ経由のアクセスなど。
http://www.asahi-net.or.jp/~AX2S-KMTN/ref/status.html

つまり、DoCoMoのゲートウェイがエラーを返している状態ですので、サービス側サーバが原因かDoCoMo側が原因か、切り分けがしづらいです。
いろいろと現象を追っていったところ、502のエラー発生時に、Apacheの error_log に以下のような記録が残っていました。

[Thu Sep 30 00:01:10 2007] [notice] child pid 13639 exit signal Segmentation fault (11)
[Thu Sep 30 00:01:15 2007] [notice] child pid 32389 exit signal Segmentation fault (11)
[Thu Sep 30 00:01:20 2007] [notice] child pid 13633 exit signal Segmentation fault (11)

Apacheの子プロセスがセグメンテーションフォルトで強制終了したというログです。

そもそもの強制終了の原因がいまだ不明ですが、phpにてセグフォルトを起こすプログラムを紹介してる記事を発見しました。
http://sonic64.com/2002-12-04.html

<?php
$base_str = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">';
$Zspace = '(?:\xA1\xA1)'; // 全角スペース
$ascii = '[\x00-\x7F]'; # 1バイト EUC-JP文字
$twoBytes = '(?:[\x8E\xA1-\xFE][\xA1-\xFE])'; # 2バイト EUC-JP文字
$threeBytes = '(?:\x8F[\xA1-\xFE][\xA1-\xFE])'; # 3バイト EUC-JP文字
$character = "(?:$ascii|$twoBytes|$threeBytes)"; # EUC-JP文字

$count = 1000;
$str = '';
for ($i = 0; $i < $count; $i++) {
  $str .= $base_str;
}

// $str が EUC-JP の場合
$str = preg_replace("/^($character*?)(?:\s|$Zspace)+$/", "$1", $str);

print htmlspecialchars($str);
?>

テストでは、$count を 149ではOKで 150でエラーになっていました。

実際にApacheがSegmentation faultで落ちた場合、の応答を FirefoxのLiveHTTPHeadersで調べてみると次のような感じです。

リクエスト
GET /Segmentation_fault.php HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cache-Control: max-age=0

レスポンス
HTTP/1.x 200 OK

本来、レスポンスのHTTPステータス・コードに続くヘッダや本文がまったく返されていません。
そのため、DoCoMoのゲートウェイでは、コンテンツの識別が出来ず、502のエラーを返していると想像できます。

phpでApacheを、子プロセスとはいえ、こんな簡単に落とせるなんて。。