Test::mysqld と MacPortsのmysqlの組み合わせがめんどくさい件

一応解決したメモ。
(homebrewを使っていたんだけれどもActive Directory管理下との組み合わせが微妙っぽいのでMacPortsに切り替えた。)

$ cd /opt/local/lib/mysql5/bin/
$ ln -s /opt/local/libexec/mysqld
$ cd /opt/local/lib/mysql5
$ ln -s /opt/local/share/mysql5/ share

$ /opt/local/lib/mysql5/bin/mysqld

これでTest::mysqldからmysqldを起動できるはず。



書き忘れてた:PATHに追加しておく

PATH=/opt/local/lib/mysql5/bin:$PATH

レイアウトがかわったらまた動かなくなるんだと思う。

DBD::mysqlのConnection Timeoutをテストする

同僚がMySQLのconnection timeoutのテスト方法に迷っていたので、アイデアを出してみたらうまくいったのでメモ。はじめはMySQLをどうにかするアプローチを考えたが、必要なのは「何もしないサーバ」だった。

何もしないサーバをたてる(testを書くときにはTest::TCP::empty_portを使うとよいと思われる)

$ perl -MIO::Socket  -le \
'$sock = new IO::Socket::INET(LocalPort=>22111, Listen=>SOMAXCONN, Porot=>"tcp", Reuse=>1);while(1){}'

接続しようとするとblockされる

$ mysql -h127.0.0.1 -P22111
$ perl -MDBI -le 'DBI->connect("DBI:mysql:database=test;host=127.0.0.1;port=22111;mysql_connect_timeout=1")'
DBI connect('database=test;host=127.0.0.1;port=22111;mysql_connect_timeout=1','',...) failed: Can't connect to MySQL server on '127.0.0.1' (4) at -e line 1

mysql_connect_timeoutを使うとちゃんとタイムアウトした。

$ perl -MDBI -le 'DBI->connect("DBI:mysql:database=test;host=127.0.0.1;port=22111");'

mysql_connect_timeoutを使わないとずっとblockされたままになった。

Test::mysqld + perl -d を使うと SQLがそのまま叩けて便利

id:zigorou 先生に教えてもらった技をメモ。
(あとで調べてみたら http://perl-users.jp/articles/advent-calendar/2010/hacker/1 ですでに言及されていましたが、SQL叩けるというところだけ強調して再掲)

まずテストを用意します。

[kawamoto.m@mm1:~]$ cat 01.t
use Test::More;
use Test::mysqld;

my $mysqld = Test::mysqld->new(
     my_cnf => {
          'skip-networking' => '', # no TCP socket
     }
   ) or plan skip_all => $Test::mysqld::errstr;

ok(1);
done_testing;

perl -d でtestを走らせます。

[kawamoto.m@mm1:~]$ perl -d 01.t

Loading DB routines from perl5db.pl version 1.33
Editor support available.

Enter h or `h h' for help, or `man perldebug' for more help.

main::(01.t:4):     my $mysqld = Test::mysqld->new(
main::(01.t:5):          my_cnf => {
main::(01.t:6):               'skip-networking' => '', # no TCP socket
  DB<1> n
main::(01.t:10):     ok(1);
  DB<1> x $mysqld
0  Test::mysqld=HASH(0x100ba3908)
   '_owner_pid' => 63025
   'auto_start' => 2
   'base_dir' => '/tmp/93XStAoC1x'
   'my_cnf' => HASH(0x100812500)
      'datadir' => '/tmp/93XStAoC1x/var'
      'pid-file' => '/tmp/93XStAoC1x/tmp/mysqld.pid'
      'skip-networking' => ''
      'socket' => '/tmp/93XStAoC1x/tmp/mysql.sock'
   'mysql_install_db' => '/usr/local/bin/mysql_install_db'
   'mysqld' => '/usr/local/bin/mysqld'
   'pid' => 63071

このときsocketの値をコピーし、テスト実行停止中のまま別のターミナルから

$ mysql -uroot -S /tmp/93XStAoC1x/tmp/mysql.sock test

で接続すればテスト中のDBに普通に接続できます。当たり前といえば当たり前ですね。

普段print debugしてるよい子のみんなも Test::mysqld 使うときは debugger 使ったほうがいいですよー

これを使うとMySQLのテーブルの中を見通して眺めることができるので単純に効率良いし、関係ない値をうわがいてたとか、そういうしょうもないミスも減らすことができますね!

DB関連のテストをこんな感じでやっているうちに、MySQLと関係ないデバグもperl -dでスムーズにできるようになりました。あと身長伸びました。彼女も出来ました。 zigorou++

今さらだけどJavaScriptの勉強をはじめてみた

いまさらですがJavaScript書けません。そこでJavaScript勉強中。環境はMac、教材はサイ本(asin:4873113296)なり。

まず v8 をダウンロードしてみる

brew install v8

しかしなかなか終わらなかったので node.js に切り替えた

https://github.com/joyent/node/wiki/Installation

普通に動いているっぽいのでこれでよい。

node だと window オブジェクトがないので、サイ本のサンプルの多くが動かなかったが id:zentoo に「console使うといいぜ」と教えてもらったので順調に進んでおります。

あとは普通に勉強しているだけなので特になし!

OSS OCR の Tesseract がスゴイ件

洋書の輪講で、重たい本を持ち運びたくないのと、辞書引きを効率化するためにTesseractでOCR化してみた。

以前はsourceforge.netでホストされていたが、いつの間にか Google Code に移っていた。
詳しくは以下を参照。

Windows な人は

  • tesseract-2.xx.exe.tar.gz
  • tesseract-2.00.eng.tar.gz

をダウンロードしてくる。

tesseract.exe
tessdata/eng.*

というディレクトリ構造を作る。

見開き/段組をうまいこと処理する方法はないっぽい(未確認)なので、先に手作業でファイルを分割した。

圧縮されたtiffを扱えるようにするのは面倒なので、手元のファイルを非圧縮形式のtiffに変換した。

libtiff のbinary(http://gnuwin32.sourceforge.net/packages/tiff.htm)をおとしてきて

tiffcp -c none src.tiff dst.tiff

すると無圧縮のtiffファイルが得られる。

tesseract.exe src.tiff dst -l eng

まだ1ページ使ってみただけど、手直ししたところ*1は半角スペースを1つ入れただけで済んだ。神ツール!

ocropusも気になるけど試していない。

http://code.google.com/p/ocropus/

*1:Wordのスペルチェッカ調べ

とても間のあいた補足

フレームワーク脳で何が悪い - k12uのアレは自分自身がそれでいいと思っているわけではなく、健全な産業として発展するってことはそういうことなんじゃない?という意味でした。自分自身はまだまだ精進。

フレームワーク脳で何が悪い

ソフトウェアって下部レイヤーを気にしなくていいように、先人たちが歴史を築いてきたのに、その肩に乗っておきながら「近頃の若いやつはフレームワーク脳」とか。

プロダクトの品質が担保されてりゃ、別に下部レイヤー知らなくても十分じゃん。もっとも、議論のスタートはプロダクトの質が問題って話みたいだけど。