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)をおとしてきて
すると無圧縮のtiffファイルが得られる。
tesseract.exe src.tiff dst -l eng
まだ1ページ使ってみただけど、手直ししたところ*1は半角スペースを1つ入れただけで済んだ。神ツール!
ocropusも気になるけど試していない。
*1:Wordのスペルチェッカ調べ
とても間のあいた補足
フレームワーク脳で何が悪い - k12uのアレは自分自身がそれでいいと思っているわけではなく、健全な産業として発展するってことはそういうことなんじゃない?という意味でした。自分自身はまだまだ精進。
フレームワーク脳で何が悪い
ソフトウェアって下部レイヤーを気にしなくていいように、先人たちが歴史を築いてきたのに、その肩に乗っておきながら「近頃の若いやつはフレームワーク脳」とか。
プロダクトの品質が担保されてりゃ、別に下部レイヤー知らなくても十分じゃん。もっとも、議論のスタートはプロダクトの質が問題って話みたいだけど。