2011/10/29

App::Prove::RunScriptsで快適テスト生活

App::Prove::RunScriptsで快適テスト生活

公開場所

開発動機

WebアプリケーションのデータストアにMySQLを利用している場合、テストでTest::mysqldを使っていると思います。
しかし、各テストファイル毎にmysqldを立ち上げていると、テストファイルが増加した際に、mysqld立ち上げのオーバーヘッドが問題になります。
これを解消すべく作成しました。

既存の解決策

  1. にひりずむ::しんぷる make test で Test::mysqld を永続化させる方法
  2. Craftworks Tech Blog - Branch Test::mysqld を別ウィンドウで立ち上げたら開発時の prove が快適過ぎる件

問題点

  1. Module::Install::TestTargetは色々と便利なこともできるが、単純にテスト実行前にTest::mysqldを叩くだけには大げさ過ぎる
  2. 裏で先に立ち上げておくのは正直めんどうだし、忘れそう

こんな感じの問題点と普段の開発中はmake testなんて叩かないでproveをメインに使っているということもあり、proveライクに使えるコマンドが欲しいということでカッとなって作りました。

インストール

    $ cpanm App::Prove::RunScripts

使い方

上記コマンドでインストールされたprove_runscriptsコマンドを使用します。proveの薄いwrapperで、before/afterオプションが新規に追加されています。
後は実行したいスクリプトを指定するだけです。複数指定もできます。
xaicronさんの記事にあるsetup_mysqld.plをそのまま利用できると思います。

    $ prove_runscripts --bofore t/scripts/setup_mysqld.pl --state=save -lr t/

2011/10/23

Remedieのニコ動のembedを修正

とりあえず修正したものはgithubにあげてあります。

今月の途中からremedieでニコ動を見ようとすると、以下のポップアップが出てきて閲覧できなくなった。

This video is deleted or does not allow embeds

該当箇所のコードを確認すると、wv_titleの後にfv_autoplay、fv_new_windowを埋め込んでいる模様。
(恐らく)ニコ動側の変更でwv_titleが削除されていたので、wv_idを基準に埋め込むように修正

    diff --git a/lib/Remedie/Server/RPC/Player.pm b/lib/Remedie/Server/RPC/Player.pm
    index 14a959b..37ef936 100644
    --- a/lib/Remedie/Server/RPC/Player.pm
    +++ b/lib/Remedie/Server/RPC/Player.pm
    @@ -42,8 +42,10 @@ sub nicovideo : POST {
         ## Whoa HACK
         my $code = $response->content;
         $code =~ s/document\.write\((.*?)\)/\$("#embed-player").html($1)/g;
    -    $code =~ s/(wv_title.*?)$/$1\n, fv_autoplay: 1, fv_new_window: true/m
    -        or die "This video is deleted or does not allow embeds";
    +    $code =~ s/(wv_id.*?)$/$1\n, 'fv_autoplay': '1', 'fv_new_window': 'true'/m;
    +    if ( $code =~ /isDeleted: true/ ) {
    +        die "This video is deleted or does not allow embeds";
    +    }

         return { success => 1, code => $code };
    }

2011/10/16

YAPC::Asia Tokyo 2011で発表してきました #yapcasia

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

ブログを書くまでが勉強会!

YAPC::Asia Tokyo 2011 公式サイト - http://yapcasia.org/2011/


御礼

まず、私の所属している株式会社アイダックと諸々の支援をしていただいたTマネージャにお礼申し上げます。
旅費と協賛スポンサーの申し込みありがとうございました!


初スピーカー

今回厚かましくもスピーカーとして参加させていただきました。
当日は緊張しましたが、やって良かったなと思っています。

トークに応募するきっかけを作ってくれたHokkaido.pmとそのメンバー、JPAと地方派遣支援で来ていただいたゲストの皆さん、高頻度で自費参加してくださるcharsbarさん、ありがとうございます!


少人数でのWebアプリ開発 CGIからPSGIまでの変遷

現在の部署の歴史が浅いことと私が入社当初、職業プログラマとしてのキャリアがなかったこともあり、
初期の状態は良いとは言えませんでした。
その環境を少しずつ改善し、近代的なプログラミング環境を整える変遷を紹介したものです。

スライドは以下になります。


その他雑感

  • 941さん、色々とお世話になりました。ありがとうございます!
  • 同じHokkaido.pmのあきやまさん(@akiym)のトークが裏番組だった
    YAPC::Asiaは大規模なので、そこまで気にしてられない状態だったと思いますが、これは残念でした。
  • 今年はお昼ご飯の時間が設けられててグッド
    去年は20分しか隙間がなかったので大変だった
  • 東京のPerl Mongerは実は優しい
  • 地方からきている人が思った以上にいた
  • Parumon面白いよ!拡張パック希望
    懇親会で遊んでくれた人、ありがとうございます。次のHokkaido.pmの開始前とかに遊びたい

2011/10/08

全文検索エンジンgroongaを囲む昼下がり@札幌に行ってきました

全文検索エンジンgroongaを囲む昼下がり@札幌


最初の自己紹介のまとめ


  • ここにきている人だけあって、groonga使ってる人が多い
  • Senna, tritonnもちらほら
  • 中の人が札幌に来たので勢いで開催



Groongaの中の人、森さんによる概要


ざっくり概要


  • 全文検索エンジンが出発点
  • データストア能力が強化されてきた
  • 特徴
    • 転置索引
    • 即時更新
    • カラムストア

なぜ転置索引か


  • searchのスループットを重視
  • 転置 > Suffix Array > Signature > 線形
  • indexingは遅い傾向がある

即時更新


  • CGM等ですぐ検索できないと使いづらい
  • groongaではここを頑張ってる
  • リアルタイムに強いということを今日は覚えてかえる

カラムストア


  • 普通のRDBではレコード毎に保存
  • filter, sort, group byは大体必須な機能なので、高速化したい



groongaの使い方とかとか


  • Cのライブラリがある
  • groongaコマンドで操作
  • HTTPもあり。レスポンスはJSON
  • gqtp - groonga query transfer protocol
    • HTTPよりも効率はいい
  • memcachedプロトコルも話せる

SennaとGroonga


  • Senna
    • アイルトン・セナが速いから付けた
    • 他のRDBと組み合わせて使う
  • Groonga
    • MySQL, PostgreSQLと使うこともできる

森さんがいろいろ


  • Cライブラリで直接扱うと速い
  • MySQL経由だとSQLのうんぬんがあるので、それほど早くないかも
  • ひとつのDBに対してMySQL, HTTP, Cライブラリからなど同時にアクセスできる

MySQL + Sennaの不満


  • MyISAM
    • メンテが大変
  • 5.0
  • 更新しながら、検索さくさくできない
    • MyISAMは書き込み時にreadもブロックしちゃうよね

MySQL + Groongaでは


  • Groongaでも更新せな!っていうのを頑張ってる
  • プラガブルストレージエンジンに対応
  • データストアがそもそもあり



休憩




Groongaの構造とデータの流れ


資料を見た方がいい

http://www.clear-code.com/blog/2011/10/5.html


ちょっとだけメモ


  • パトリシアトライ
    • トライ(Trie) <- retrieval
  • lexicon
      - 転置索引がゼロになっても、こっちは消さない
    • テーブル構造にしているのは今後拡張できるように
    • トークンのポジションも保存するかどうか選べる
    • 重みも記録できる



質問タイム


  • Groongaのこれからやっていきたいこと
    • 性能を良くする
      • インデックス構築はまだ早く出来る
    • versioned indexをいれたい
      • あまり使わないのはコンパクトにしたりとか
    • トランザクションは検討したい
  • スケールアウト
    • MySQL + Spider + Groonga が現状はいいかも
  • MySQL InnoDBの全文検索とGroongaどっちが速いの?(森さん)
    • 都合よくデータでてきた!
    • MySQL + Groonga (storage mode)の方がindexsingがやっぱり速い
  • 事例とか
    • 書いていいかわからないのでカット
  • 文章数はどのくらいまでいれたことがあるか
    • twitterのデータを入れたときが多かった
    • 1nodeで1000万レコード。まあ扱えている感じ
  • gqtpのバイナリプロトコルのドキュメントはあるのか
    • ないようです
    • source読んでね
  • データベースファイルをmvすると問題あるような?
    • rubyのライブラリからmvしたやつを使うと怪しい