Test::mysqld を別ウィンドウで立ち上げたら開発時の prove が快適過ぎる件

id:xaicron 氏が紹介なされていました make test で Test::mysqld を永続化させる方法 を早速導入していたのですが、make test は速くなって便利なのですが、prove で 1 つずつテストをするときは、相変わらず mysqld を毎回、起動・終了するので時間がかかって開発時のストレスになります。

そこで、開発時には別ウィンドウで mysqld を立ち上げておいて、そこに接続しに行くようにすれば大分快適になると思い、実装してみました。

#!/usr/bin/env perl
use strict;
use warnings;
use FindBin;
use lib "$FindBin::Bin/../lib";
use File::Spec;
use JSON;
use Test::MyApp::mysqld;

my $tempfile = File::Spec->catfile(File::Spec->tmpdir, 'test_mysqld.json');

$SIG{'INT'} = *purge;
END { purge(); }

print "Starting mysqld...";
my $mysqld = Test::MyApp::mysqld->setup;
my $log = File::Spec->catfile($mysqld->{'base_dir'}, qw/tmp mysqld.log/);
printf " started at %s\n", $mysqld->{'my_cnf'}{'socket'};
print "log file: $log\n";

{
    my $json = encode_json({ %$mysqld });
    open my $fh, '>', $tempfile or die $!;
    $fh->print($json);
    $fh->close;
}

sleep 3 while -e $tempfile;

sub purge {
    unlink $tempfile;
    print "Shutting down mysqld...\n";
    exit;
}

まず、こんな感じのスクリプトを t/script/mysqld_runner.pl に作っておいて

次に、xaicron 氏の Test::MyApp::mysql を以下のように書き換えます。

# 前略
my $tempfile = File::Spec->catfile(File::Spec->tmpdir, 'test_mysqld.json');

sub setup {
    my ($class, %config) = @_;

    my $mysqld;

    if ( -e $tempfile ) {
        open my $fh, '<', $tempfile or die $!;
        my $obj = decode_json(join '', <$fh>);
        $mysqld = bless $obj, 'Test::mysqld';
    }
    elsif ( my $json = $ENV{'TEST_MYSQLD'} ) {
        my $obj = decode_json($json);
        $mysqld = bless $obj, 'Test::mysqld';
    }
# 後略

あとは、ガリガリ開発してる間は、適当なウィンドウで先ほどの t/script/mysqld_runner.pl を起動しておけば、そこに繋ぎに行ってくれるので、起動に時間がかからなくて良い感じです。prove のたびに 6 秒以上かかっていたのが、0.02 秒に短縮されました。

ファイル名を固定にするために File::Temp は使っていません。TEMPLATE が X 指定しなくても使えれば便利なんですけどね。

あと、mysqld_runner.pl の標準出力にクエリログでも出せれば便利そうな気がするのですが、log-output とかで標準出力を指定する方法が分からなかったので、とりあえず放置しています。どなたか分かるかた教えて頂けると幸いです。

Ubuntu に含まれている MySQL 及び InnoDB Plugin のバージョン

Ubuntu の apt で入る MySQL のバージョン

Ubuntu 9.04
mysql-server 5.1.30
Ubuntu 10.04.1 LTS
mysql-server 5.1.41
InnoDB Plugin 1.0.5 (RC)

と、いうことで InnoDB Plugin を使いたかったら Ubuntu 9.04 では MySQL 公式サイトからパッケージを持ってくるか、ソースからビルドしないといけないです。

Ubuntu 10.04 LTS ではパッケージに含まれていますので、そのまま使えます。ただし、調べていたら、http://d.hatena.ne.jp/sh2/20091120 のコメント欄に InnoDB Plugin 1.0.5 はまだ危なそうな感じで書いてあったので、自分は公式のソースコードの最新版を落としてきてビルドして使っています。

configure オプションは、mysqlbug コマンドを実行すると最下部に現在入っているパッケージのものが確認できますので、それのプラグイン指定の箇所だけ書き換えて指定しています。

vim の SQL のシンタックスハイライトを MySQL 専用のものに変更する方法

id:tokuhirom 氏の use mysql syntax を読んで、これは良いと思い、早速自分の環境に適用しました。

件の設定をどこに書くかですが、:help new-filetype (日本語訳)にどこに書くべきか何通りか紹介されています。

自分は、C. ファイル形式が名前だけで検出できる場合を選び、~/.vim/filetype.vim に下記を追記しました。

" detect filetype
if exists("did_load_filetypes")
  finish
endif
augroup filetypedetect
  autocmd! BufRead,BufNewFile *.sql  setfiletype mysql
augroup END

WWW::Curl で使えるオプション一覧

WWW::Curl は速いですがドキュメントが少ないのが玉に瑕です。perldoc に setopt() や getinfo() で指定できるオプション一覧が載っていないです。

実は PHP のマニュアルに良い感じで載っています。

setopt() に指定できるオプション一覧
getinfo() に指定できるオプション一覧

[追記]
tokuhirom 氏から公式情報の URL を頂きました。ありがとうございます!
http://curl.haxx.se/libcurl/c/curl_easy_setopt.html
http://curl.haxx.se/libcurl/c/curl_easy_getinfo.html

YouTube で閲覧中動画の短縮 URL を表示するブックマークレット

Chrome 拡張もあるのですが、短縮 URL 取得のためだけに拡張増やすのもメモリが勿体無いのでブックマークレットを作りました。

動作確認 Chrome 7.0 です。

ブックマークレットからは document.execcommand('Copy') でクリップボードを操作出来ない(Chrome 拡張からは出来るらしい)ので、プロンプトに表示するようにしました。Chrome だとデフォルトでフォーカスされているので、すぐコピーできます。

下記コードを適当な名前を付けてブックマークして下さい。

javascript:(function(){prompt('Shorten url','http://youtu.be/'+location.href.match('v=([^&]+)')[1])})()

YAPC::Asia Tokyo 2010 に行ってきました

今年も Perl の国際的カンファレンス YAPC::Asia に行ってきました。

YAPC に行くと

毎年感じることですが、YAPC に行って色々なトークセッションを回ると、他(社|者)の実際の運用や開発の現場レベルでのノウハウを聴くことができるので、この二日間で自分ひとりの経験で貯まるノウハウの数ヶ月分のノウハウが得ることができると思います。

今年は去年の Plack/PSGI や、一昨年の Moose のような目玉となる技術の発表は無かったですが、代わりに開発・運用のノウハウが多かった気がします。ノウハウ系の情報は普段あまり表に出ないことが多いので、とても参考になりました。

YAPC の良いところ

トークセッションもそうですが、様々な人と出会えることです。セッションの合間に喫煙所や芝生で、はたまた懇親会などで、セッションでは聴けない運用の小話や裏話が聞けたりすることです。技術ネタの話以外にも、他のエンジニアとの繋がりを広げるというのは、スキルアップ・エンジニアライフの充実にも繋がると思います。発表資料など、後日公開されるので、ある程度は当日参加しなくても情報は得ることが出来ますが、Ust や録画資料だけでは、この繋がりは得ることは出来ません。まだ YAPC に行ったことが無い人は、ぜひ来年は参加して色々な人に話しかけてみてください。怖そうな人も声をかけると笑顔で話してくれたりします。新しい世界が広がると思います。自分はとても広がりました。

YAPC で発表する

去年 YAPC に初参加して、色々感銘を受け、今年は発表したいなと思っていましたが、忙しいのと発表できるプロダクトが出来上がっていないのとネタが思い付かないのとで、発表は見送りました。

と、Twitter でも書きましたが、学習して日々 Evernote に思い付いたアイデアを書き貯めることにしました。

そこで思ったのは、時期が近付いてから「発表するネタを考える」のではなく、普段からアウトプットできるようなものを作るという思考をベースにしながら日々の業務や生活を送り、時期が近づいたときに、その中から「発表するネタを選ぶ」という手法にしないといけないなということです。来年は今まで人に助けられてきたように、人々の役に立つものを発表してコミュニティに何らかのお返しができるように、これからの一年を有効に過ごしたいと思います。

YAPC への感謝

YAPC 運営陣の方々におかれましては、日々の業務でお忙しいところを、このような素晴らしいイベント準備に尽力していただき、とても感謝しています。謹んでお礼申し上げます。自分がスキルを磨き、仕事していけるのも、このようなイベントを運営してくださる方々のお陰です。

また、[twitter:@941] さんの以下のツイートですが、

総じて、ネガティブな意見は声が大きくなりがちですが、ポジティブな意見というのは不満が無いので表面には出にくいです。感謝の気持ちは心の中に仕舞われることが多いです。ですが、感謝の声というのは、頑張って下さっている方々には、何よりの労いになりますし、「やって良かった」という安堵にも繋がりますので、少しでも「ためになった」、「また参加したい」と思った方は Twitter・ブログなどで運営の皆様方に感謝の気持ちを伝えましょう!

最後に改めて、JPA の方々、Livedoor の 941 さんをはじめとする運営に携わった方々、ボランティアスタッフの方々、スポンサー各社様、ありがとうございます!

YAPC::Asia Tokyo 2010 のタイムテーブルを手軽に PC/iPhone で見る方法

今年の YAPC::Asia もタイムテーブルはパンフレットをあてにしていたのですが、載っていなかったので慌てて用意しました。

公式サイトに iCal が用意されているので、これを Google Calendar にインポートします。

左下の「他のカレンダー」の「追加▼」のプルダウンから「URL で追加」を選びます。
ここに、それぞれ、「講堂」「フェライト会議室」「蔵前会議室の」iCal 形式の URL を入力すると下記のような感じで見られるようになります。Mobile Safari 版の Google Calendar の方が大分見易いです。

以下それぞれ、PC, iPhone(Mobile Safari), ガラケーです。