Posterous theme by Cory Watilo

Masaki Nakagawa

Masaki Nakagawa

test-mysqld と dbi で MySQL を使う on Ruby

MySQL Casual Advent Calendar 2011 12日目のエントリです。

Perl で MySQL のような RDBMS を扱うといえば、まず思い浮かぶのは DBI だと思います。MySQL 用には DBD::mysql というドライバがありますし、他の RDBMS 用のドライバも揃っており、各種O/Rマッパーの土台としても使われ、デファクトと言っても過言ではないでしょう。

一方 Ruby で RDBMS を扱う場合、データベースの種類ごとに独自I/Fを持ったライブラリが用意されていることが多いかと思います。MySQL においては 10日目の tagomoris さんのエントリ に紹介されているように ruby-mysql や mysql2 などがあります。

このような RDBMS ごとのドライバの違いは、各種O/Rマッパーが吸収することで統一的操作が可能になります。実は Ruby にも dbi モジュールはちゃんとあって、dbd-mysql という MySQL 用ドライバもありますので、Perl で DBI にすっかり慣れたユーザにはこっちのほうがとっつきやすいかもしれません。

さて、MySQL のテストを簡単に行うといえば、Perl ではおなじみ Test::mysqld でテスト用インスタンスを動的に作っちゃう方法がありますが、これの Ruby 版である test-mysqld という gem があることは前にちょこっと触れたことがあります。ただこいつは先述の mysql や mysql2 というドライバと一緒に使うことを想定した設計なため、Test::Mysqld#dsn が返す値もそういう感じになっています。

このままでは dbi と一緒に使いにくいので、こんなモンキーパッチを当ててあげると使いやすくなります。

やってることは簡単なんですけど、ちょっとした工夫で MySQL と dbi を使ったテストも書きやすくなるので、とってもカジュアルですね!

ちなみに、環境によって(CentOS で本家の MySQL-community-server の RPM を導入した場合など)は mysqld が見つからなく、test-mysqld の実行で失敗する場合もあるかと思います。そんな時は PATH=$PATH:/usr/sbin ./test.rb といった感じでカジュアルにサーチパスを追加してやるといいですね!

それでは明日は koratoiro kotaroito さんです。お楽しみに!

(追記)名前表記が間違っていました!kotaroito さんすいませんでした。ご指摘くださった riwyo さんありがとうございます。

Yokohama.pm #8 で発表しました

YAPC::Asia Tokyo 2011 のトークで「Perlはブラウザテスト周りがまだまだ弱いんじゃね」的な話をしましたが、それへの自分自身での解答として Brownie というブラウザテストライブラリを最近書いていて、その話をしました。

最初資料は Speaker Deck にうpしたんですが、Posterous は <script> の貼付けができないみたいで、あきらめて結局 SlideShare にも同じのを置きました。

Brownie

Ruby の Capybara インスパイアなブラウザ操作の共通ライブラリという位置付けです。

https://github.com/masaki/Brownie

Brownie を書き始めた動機としては、Webサイトのエンドツーエンドテストをしっかりしたかったというのがあります。これが例えば「Web API のテスト」ってお題ならぶっちゃけ Brownie 使う必要はなく、普通に LWP からの JSON 読んでほげほげで事足りるし、まぁ要するにmechでいいと思います。

エンドツーエンドテストは、開発者がコミット前に一旦実施したい時もあれば、QA的にリリース前にきっちり実行したい場合もあると思います。そういう場面で同じテストスクリプトだけどドライバを環境変数とか使って入れ替えることで、開発者テストとしてはMechanizeでサクサク実行でき、一方リリーステストではSeleniumでユーザと同様の環境でチェックできる、というのが実現できるといいなーと思って書いてます。

まだまだ書き始めで揃ってない部分も多いですが、もし興味あったりしたら、Twitter なんかで気軽に声かけてください。

株式会社ディー・エヌ・エーに入社しました

既に1週間が経過しましたが、先週10/17付けでDeNAに入社して働いてます。

先週より新宿に出社していたおかげで、ロックスターと偶然にタイ料理食べてごちそうになったり(参考)、またまた偶然に焼肉も行けました。アイコンがキモいと噂の人やもじゃもじゃの人など、色んな怖い人達に囲まれて、ヒィヒィ言いながら環境構築したりキャッチアップしたりと、刺激的に楽しくやっております。

前職は前職で色々面白いことをやってきたと思うので、機会があれば改めて振り返りつつ書いてみたいと思います。

今後ともよろしくお願いします。

YAPC::Asia Tokyo 2011 で発表しました

他言語から見たPerlのテスト (Perl Testing Consideration seen from other languages) というタイトルで発表しました。

年々プレゼンする度に緊張度合いが増加していた気がするんですが、今回は何故か全く緊張せずに話すことができました。なんかホーム感があった。

もう5年前になるけど YAPC::Asia Tokyo 2006 に出ていなければ、今回自分が登壇することも無かったと思います。やっぱりYAPCは自分にとってある種の原点であってホームなんだなーと再認識できました。

Test::Doubleは午前中くらいにPAUSEにあげまして、トーク直前に無事リリースされてました。これはもう少し育てて、それこそMockのExpectationとVerification周りを強化したいと考えています。

内容詰め込みすぎたのと若干発散気味でしたが、聴きに来てくださったみなさま、ありがとうございました!

Test::mysqld on Ruby

Perlにはkazuhoさん作の Test::mysqld というナイスなモジュールがあって、テスト用にmysqldインスタンス作って終わったら自動で消えてくれたりして、テスト環境の独立性とか考えると手放せなくて、同じことをRubyプロダクトのテストでもやりたいなと思って探したらありました。

テストが不十分だったり、微妙にかゆいところに手が届かなかったりするのですが、自動で作って消すのはやってくれるのでひとまず重宝してます。

ちなみにRubyではPerlと違ってDBIは流行っていない(?)ので、こいつが返すDSNはDBI用じゃなくて Mysql or Mysql2 のgem用だったりするところに、言語の違いが出ていて面白い。

Railsプロジェクトの設定ファイル

Railsプロジェクトで設定ファイルというと、database.yml とか config/*.rb とかいくつか種類があって、身近なとこではよくこんなことになっていた。

  1. サーバ設定とか、場合によってはパスワードを書かざるを得ないので、正直コミットしたくない
  2. ただファイルを削除するだけでは忘れてしまうので、database.yml.example とか database.yml.sample といった感じにリネームしておき、元のファイルはignoreする
  3. これで手元の開発環境では大体問題ないけど、今度はCIすると設定ファイルが無かったりして、また色々と面倒だ

というわけで最近はこんなのを lib/tasks/setup.rake とかいう名前で置いて使ってます。

*.sample や *.example のファイルをコピーするだけなんだけど、CIの実行コマンドで rake setup:config:force って書けて、まぁそれなりに動かせる感じになる。

CentOS 5.x で blockdiag を入れた記録

yum と easy_install だけで普通にやっていたら一箇所だけハマったので記録。

  • *diag が依存している webcolors(昔はこれ無かった?)のインストールに失敗するので、tarballを直接指定してやるとうまくいった
  • 最終的にはこうなった

ちなみに virtualenv とか pythonbrew とかは使えない環境だった。

(追記)blockdiag-0.8.9 の場合、リリース後に入った修正を当てないとダメな感じだった

TracでカンバンっぽいことができるTracTaskBoardPluginを書いた

https://github.com/masaki/TracTaskBoardPlugin

実はWhiteboardPluginというのがtrac-hacksにあるので使おうかと思ったんだけど、メンテされてないのとカスタムクエリページでしか使えないのが微妙だったので、採用を見送ることにしたのが経緯。

違いとしては

  • マクロで任意のWikiページにカンバンを表示できるようになっているところ
  • D&Dでチケット移動したときにAjaxで即保存するようになっているところ

かな。違いはあれど、WhiteboardPluginインスパイアであることには変わりません。あと表示するチケット一覧をTracQueryで書けるようにしたんだけど、その指定と解析はQueryChartインスパイア。感謝します。

任意のWikiページで

[[TaskBoard(query:milestone=milestone1)]]

などと書けば大体わかると思います。

Yokohama.pm #7 で司会してきた

久々地元開催のYokohama.pmに行ってきた。

  • すっかりおなじみ受付係の @tomyhero さん横でまったりトークを聞く体制に入っていた
  • @clouder さんに「今暇ですか?」と聞かれた
  • 気がついたら司会をしていた

という次第。本当にありがとうございました。なんか暗黙の役割分担ができているのは気のせいじゃないだろう。そして今回も懇親会出席率が怒涛の90%超えだったり、(書記の)@hiratara さんが懇親会前に書き終えてたりですごい。

以下感想をいくつか。

  • blockdiag よかった。使いたい。似た感じの graphviz は前から使っているし、今仕事で Trac 回りいじってるので TracBlockDiagPlugin 来週入れよう
  • HandlerSocket は気になってた。評価してみたいなー。大人の事情的には MySQL 5.6 with Memcached interface なんだけど。

個人的には @xaicron さんや @myfinder さんと地味に初めましてしました。@myfinder さんとは家近いので今度ゆっくり飲みたいかも。

あと今回全面的にサポートくださったライブドア技術部会さんに感謝です!ありがとうございました!