LWP::UserAgent と LWP::Protocol::PSGI でテストを書くと楽できる話

Plack::Test + HTTP ::Request::Common

世の中には Plack::Test + HTTP ::Request::Common という方法もあるが、この場合ブラウザを模したようなテストを書くと意外にも破綻しやすい。とりわけセッション周りの挙動が必須になると大変な手間になる。

LWP::UserAgent + LWP::Protocol::PSGI

最近は LWP::UserAgent + LWP::Protocol::PSGI で楽をするような方法で書くようにしている。ユーザー寄りのテスト(ログイン後の処理やCSRF対策用のトークンが必須等)をわりと楽に書ける点がメリット。

subtest と scope のメリットも享受できる /zento+/ 方式が見通し良く出来そう。( http://d.hatena.ne.jp/zentoo/20120323/1332534159 )

サンプル

Some::Middleware::CSRFDefenderのテストを書くとすればこんな感じ。

use Test::More;

use LWP::UserAgent;
use LWP::Protocol::PSGI;

use Plack::Request;
use Plack::Session;
use Plack::Middleware::Session;

use Some::Middleware::CSRFDefender;

my $raw_app = sub {
    my $env = shift;
    my $ses = Plack::Session->new($env);
    my $req = Plack::Request->new($env);
    my $res = $req->new_response(200);
    $res->body( $ses->get("csrf_token") );
    return $res->finalize;
};

my $url = "http://localhost/";

subtest "Should not work without session middleware" => sub {
    my $app = Some::Middleware::CSRFDefender->wrap($raw_app);
    my $guard = LWP::Protocol::PSGI->register($app);

    my $res = LWP::UserAgent->new->get($url);
    is $res->code, 500;
};

subtest "Basic test cases" => sub {
    # Prepare environments for testing
    my $app = Plack::Middleware::Session->wrap(
        Some::Middleware::CSRFDefender->wrap(
            $raw_app, error_message => "Forbidden"
        )
    );

    my $guard = LWP::Protocol::PSGI->register($app);
    my $ua = LWP::UserAgent->new( cookie_jar => {} );

    my $token = $ua->get($url)->content;

    subtest "returns the same token for the same client" => sub {
        my $res = $ua->get($url);
        is $res->code, 200;
        is $res->content, $token;
    };

    subtest "returns different token for another client" => sub {
       my $another_token = LWP::UserAgent->new->get($url)->content;
       isnt $another_token, $token;
    };

    subtest "POST with valid token" => sub {
        my $res = $ua->post($url, [csrf_token => $token]);
        is $res->code, 200;
        is $res->content, $token;
    };

    subtest "POST with invalid token" => sub {
        my $res = $ua->post($url, [csrf_token => 'invalid token']);
        is $res->code, 403;
        is $res->content, 'Forbidden';
    };

    subtest "POST without token" => sub {
        my $res = LWP::UserAgent->new->post($url);
        is $res->code, 403;
        is $res->content, 'Forbidden';
    };

};

done_testing;

node.js + jQuery で Web scraping

jsdomとjQueryつかって富豪的にホクホクできるらしい。セレクタさえ丹念に集めれば Readability/Instapaper のようにコンテンツのテキストだけ抽出するようなこともさほど難しくないか。

var jsdom = require("jsdom"),
    fs = require("fs");
var jquery = fs.readFileSync("./jquery.js");

jsdom.env({
  html : 'http://atnd.org/events/26373',
  src  : [ jquery ],
  done : function (err, window) {
    var $ = window.$;
    $("ol.a-b > li").each(function () {
      console.log( $("a", this).text() );
    });
  }
});

LESS/JavaScript/CSS/HTMLでインデントを2スペースに設定する vimrc

普段の設定

set tabstop=4
set expandtab
set shiftwidth=4

こんな設定でインデントをスペース4つとして書いると、LESS/JavaScript/CSS/HTML の場合は嫌でもインデントが深くなり、縦分割して作業すると悲惨なことになってしまう問題が起きる。

function を定義して autocmd で呼び出す

function を定義して autocmd で呼び出すやり方で解決した。ftplugin/に書いても問題なさそうではあるが、vimrc 自体が小さいこともあり、見通しよくするために直書き(分量が増えたらあとでftpluginに移せば良い)

条件として
  • この4つのファイルタイプの場合のみインデントをスペース2つとして設定する
  • それ以外のファイルタイプでは影響が出ないようにする
  • ~/.vimrc に直書き(大した量ではないので ftplugin はナシ)
設定をvimrcに追記

ファイルタイプ毎にメインの設定とは別の設定で利用できる。

function! s:javascript_filetype_settings()
    setlocal tabstop=2
    setlocal shiftwidth=2
    setlocal cindent
endfunction
autocmd FileType javascript call s:javascript_filetype_settings()

function! s:html_filetype_settings()
    setlocal tabstop=2
    setlocal shiftwidth=2
    setlocal includeexpr=substitute(v:fname,'^\\/','','') |
endfunction
autocmd FileType html call s:html_filetype_settings()

function! s:css_filetype_settings()
    setlocal tabstop=2
    setlocal shiftwidth=2
    setlocal cindent
endfunction
autocmd FileType css  call s:css_filetype_settings()
autocmd FileType less call s:css_filetype_settings()

Ustream 放送の開始を通知してくれる Chrome 拡張を書いてた

Ustream の配信は通知系が無いのでいつ始まっているのか把握困難。そこで開始を通知してくれる拡張を作ってた。ここ一年くらい動いてます。

Chrome拡張はちょろちょろ〜っと書けていいですね

スクリーンショット

ピロっと音が鳴って、こんなnotificationが出ます。クリックすれば配信ページに飛べるという寸法。

リポジトリ

https://github.com/punytan/chrome.extension.ustreamalert

ダウンロード

https://github.com/downloads/punytan/chrome.extension.ustreamalert/ustalert.crx

既知の問題

長時間アラート表示を放置しておくとクリックしてもページを開かなくなる。これは恐らくChrome側が悪いはず。patches welcome


App::ExtractUsed というものを書いている話

CPAN形式で開発していると避けて通れないのが依存モジュールの炙り出しと Makefile.PL へ requires を書き出す作業。これは意外と面倒なのでもっと怠惰に楽をしたいところ。

たとえモジュールが要求するperlのバージョンを決めていたとしても「どれがコアモジュールでどれが違うのか」「parent.pm は 5.10.1 からコアモジュールになった」など、漏れなく抽出しないと新しい環境でインストールする時に悲しいことになってしまう。

こんな面倒事はコマンド叩くだけで済ませてしまいたい、というわけで https://github.com/punytan/p5-App-ExtractUsed をでっち上げた。

使い方

extractused コマンドがインストールされるので、基本的にはこれを叩くだけで lib/ と t/ を走査して requires, test_requires が出力される感じ。

$ extractused 
requires 'WWW::NicoVideo::Download';
requires 'WWW::YouTube::Download';
test_requires 'Coro';

"t::" のようなテストディレクトリにある名前空間は強制的に取り除かれるので、心置きなく use t::Util; できてホクホクです。

オプション

--dir

指定したディレクトリのみを走査したい場合に。デフォルトは lib と t ディレクトリ。

$ extractused --dir bin --skip YourProject
--file

任意のファイルのみから抽出したいときはこのオプションでパスを指定。

$ extractused --file lib/YourProject.pm --skip YourProject
--skip

プロジェクトのnamesapaceを無視したいときに。

ここの挙動は自動的に判定するように変えたい(けれどロジック書くのがちょっと厄介)。

前方一致で判定するのでこの場合、YourProject::Web もスキップされる。

$ extractused --skip YourProject
--perl

最低限サポートしたい perl のバージョン。perlのバージョンによってコアモジュールが変わってくる(5.10.1あたりだと parent.pm, それ以前だと version.pm 等)ので、ちょっと古めの環境でも使うなら指定しておいたほうが無難。デフォルトは現在走ってるバージョン。

$ extractused --perl 5.10.1

まだまだ alpha-quality

使ってみて気になる所があればぜひ に pull-req を。

ある程度インターフェースが固まってきたらCPANize予定。それまでは互換性考慮せず変えていきたいと思ってます。

経緯

http://cside.g.hatena.ne.jp/Cside/20111222/p2


カジュアルに cat コマンドでネコを走らせる

http://d.hatena.ne.jp/teramako/20111207/p1

面白い&&最近Nyancatが走るのを見つけたこともあって、全然違う猫だけどカジュアルに走る猫を書いてみた。

usage

$ alias cat='perl <(curl -s https://raw.github.com/gist/1445161/c183b0f555cbe88a6530bb7da2eb607a62f75403/nyancat.pl)'
$ cat

xtermなら動くはず。iTerm2で確認済み。https://gist.github.com/1445161

ほぼ元ネタ https://github.com/klange/nyancat の流用ですが元はCで書かれているので、カジュアルに猫を走らせるにはこれくらいで。

元ネタはいろいろな環境で動くように書いてあって気合いの入り方が違う…


Google Readerのスター済みアイテムを自動でreblogしたい

全国1億2000万人の意識の高いrebloggerの皆さんこんにちは。

私は最近、tumblrでreblogする簡単なお仕事をしています。このお仕事、実に楽しい訳でありますが、しかしこの作業はいかんせん単調で、作業内容はと言うと、Google Readerに流れてくる *.tumblr.com のお気に入りのpostにスターをつけ、ブラウザでまとめて開き、reblogし、スターを外すという流れ作業であるため、大量にスターを付けてしまった日には刺身にタンポポ状態で時間を無為に過ごしている感覚に襲われます。

意識の高いrebloggerとしては無為な時間を減らし、時間短縮をすることでさらに多くのreblogをすることが至上命題となるわけです。そこで、自動化しようと奮起していたところ、Google Readerにもtumblrにも幸いなことにAPIが提供されているようで、ルーチンワークを自動化してしまえることが判明しました。そのうえ、Google Readerを叩く手段としてWebService::Google::ReaderなるモジュールがCPANにあったりと、ありがたい限りです。

ここにモックを作り、手元で幾度か動作させてみたところうまく動いているようで、大変快適な生活が送れそうな期待で胸が一杯になりそうです。

https://github.com/punytan/AutoReblog

実装は bin/autoreblog.pl, lib/App/AutoReblog.pm あたりを見ていただくとして、需要がありそうならMakefileを書いて体裁を整えようかと考えています。

現状、*.tumblr.comに対してだけreblog & unstar するようにしているのですが、これだけでも十分な気がしています。


use parent と Try::Tiny とか

use parent を使って継承した時に try-catch あたりを継承先に突っ込んだりできないものかと考え倦ねいたけど中途半端なところでギブアップした。Magoから呼ぶとcaller()のEXPRをインクリメントしないと動かない。このあたりは要ハック。

プラグマも適用できればと思ったりしたけれど普通にuseしてimport()でやった方が楽そう。とりあえずココまで。

Try::Tinyをこんな使い方して大丈夫なのかは知らない。

package Oya;
use strict;
use warnings;
use Try::Tiny ();

sub new {
    return {}, shift;
}

my $child = (caller(1))[0];
no strict 'refs';
*{"$child\::try"} = \&Try::Tiny::try;
*{"$child\::catch"} = \&Try::Tiny::catch;
*{"$child\::finally"} = \&Try::Tiny::finally;

1;
package Kodomo;
use strict;
use warnings;
use parent 'Oya';

sub foo {
    printf "Hi! I'm '%s'\n", __PACKAGE__;
    try {
        die "Oops";
    } catch {
        print "Caught!!!!\n";
    };
}

1;
use strict;
use warnings;
use Kodomo;

my $child = Kodomo->new;
$child->foo;

__END__
Hi! I'm 'Kodomo'
Caught!!!!

追記

ツッコミ感謝。

ブックマークコメントより

シンボルテーブルいじらなくても

Try::Tiny->export($child);

でおk。

コメントより

typo修正ed

s/Catched/Caught/g;


Cairo なら libcairo2-dev

cairo ( https://metacpan.org/module/Cairo ) がたまに入ってなくてアレなのでメモ。

Debian/Ubuntu なら libcairo2-dev を入れておけば良い。


Post Your Blog Post About #yapcasia 2011 集計結果

YAPCから一週間が経ちましたが皆様いかがお過ごしでしょうか。

ブログを書くまでがYAPCということで "Post Your Blog Post About #yapcasia 2011" を立ち上げたところ、なんと157もの記事が集まりました。これも偏にポストしてくれた方のおかげです。(主に@lestrratさんという噂。 https://twitter.com/#!/lestrrat/status/126509159578468353

集計データ

データはSQLiteで保存していたので https://gist.github.com/1308038 からSQLをダウンロードして

$ sqlite3 database.db < feeds.sql
$ sqlite3 database.db

とすればテーブルを作れるようになっています。

記事一覧

いま動いているアプリはRSSリーダーのクロールが確実に終わる今週末くらいに落とす予定です。

その後はこちらのリンクからどうぞ!

http://mt.endeworks.jp/d-6/2011/10/yapcasia-tokyo-2011-1.html

http://d.hatena.ne.jp/punitan/20111016/1318722529

http://mt.endeworks.jp/d-6/2011/10/yapcasia-tokyo-2011-backend-apps.html

http://d.hatena.ne.jp/hiratara/20111014/p1

http://d.hatena.ne.jp/hiratara/20111015/p1

http://blog.moe-project.com/2011/10/16/yapcasia-2011-%E4%B8%89%E6%97%A5%E9%96%93%E8%A1%8C%E3%81%A3%E3%81%A6%E3%81%8D%E3%81%9F%E3%80%82/

http://d.hatena.ne.jp/sugyan/20111016/1318698278

http://blog.hatak.net/2011/10/15/6689

http://blog.hatak.net/2011/10/16/6777

http://d.hatena.ne.jp/sfujiwara/20111014/1318576104

http://d.hatena.ne.jp/hide_o_55/20111016/1318695665

http://d.hatena.ne.jp/hao_yayoi/20111016/1318696816

http://d.hatena.ne.jp/karupanerura/20111014/1318639495

http://d.hatena.ne.jp/shiba_yu36/20111016/1318733009

http://blog.kzfmix.com/entry/1318626693

http://blog.riywo.com/2011/10/16/143602

http://inputxoutput.com/7/

http://d.hatena.ne.jp/deris/20111015/1318692486

http://d.hatena.ne.jp/tech-tech/20111016

http://d.hatena.ne.jp/kotaroito2002/20111016/1318746478

http://todeskin.g.hatena.ne.jp/eigokun/20111015/1318702474

http://d.hatena.ne.jp/gnarl/20111016/1318699645

http://d.hatena.ne.jp/masa-wo/20111015/1318698859

http://d.hatena.ne.jp/kiwanami/20111016/1318749529

http://d.hatena.ne.jp/antipop/20111016/1318750210

http://diary.mrmt.net/2935

http://d.hatena.ne.jp/umeyuki1326/20111016/1318751665

http://blog.yappo.jp/yappo/archives/000762.html

http://d.hatena.ne.jp/nkgt_chkonk/20111016/1318749211

http://d.hatena.ne.jp/jdg/20111016/1318752772

https://github.com/mstshimo/YAPC_ASIA_2011_REPORT

http://d.hatena.ne.jp/amari3/20111015/1318696628

http://ikasama.posterous.com/yapcasia-tokyo-2011

http://d.hatena.ne.jp/oranie/20111015

http://d.hatena.ne.jp/gureko/

http://www.nekonotechno.com/nekopress/?p=1399

http://www.nekonotechno.com/nekopress/?p=1420

http://d.hatena.ne.jp/hiratara/20111015/1318693917

http://d.hatena.ne.jp/hiratara/20111015/1318694469

http://blog.kiftwi.net/2011/10/16/yapcasia-2011%EF%BC%88%E4%BA%8C%E6%97%A5%E7%9B%AE%EF%BC%89%E3%81%AB%E8%A1%8C%E3%81%A3%E3%81%A6%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F%EF%BC%81-yapcasia/

http://blog.livedoor.jp/xaicron/archives/53065472.html

http://blog.everqueue.com/chiba/2011/10/16/545/

http://bayashi.net/diary/2011/1015

http://d.hatena.ne.jp/hkataoka/20111016/1318766628

http://d.hatena.ne.jp/hiratara/20111016/1318770619

http://d.hatena.ne.jp/papix/20111016

http://d.hatena.ne.jp/tagomoris/20111016/1318773514

http://blog.nomadscafe.jp/2011/10/yapcasia-tokyo-2011.html

http://www.songmu.jp/riji/archives/2011/10/yapcasia_tokyo.html

http://blog.livedoor.jp/yoshidaster/archives/51729288.html

http://post.tetsuji.jp/yapcasia-tokyo-2011-yapcasia

http://d.hatena.ne.jp/hogem/20111016/1318776878

http://d.hatena.ne.jp/tochikuji/20111015/1318693791

http://blog.vitamin11.org/2011/10/yapcasia-tokyo-2011-yapcasia.html

http://d.hatena.ne.jp/yujiorama/20111016/1318692315

http://mt.endeworks.jp/d-6/2011/10/yapcasia-tokyo-2011-organizers-side.html

http://d.hatena.ne.jp/hsksnote/touch/20111015/1318645538

http://takus.me/programming/perl/yapc-asia-2011/

http://d.hatena.ne.jp/mazkeng/20111016

http://d.hatena.ne.jp/tori243/20111016/1318775723

http://howlongafter.blogspot.com/2011/10/yapcasia-tokyo-2011.html

http://yellowstore.blogspot.com/2011/10/perlyapcasia_16.html

http://d.hatena.ne.jp/ZIGOROu/20111015/1318702100

http://d.hatena.ne.jp/koji_magi/20111016/1318780399

http://d.hatena.ne.jp/taku-o/20111016/1318780042

http://d.hatena.ne.jp/osanay/20111016/1318773613

http://d.hatena.ne.jp/python_spameggs/20111016/1318746448

http://secretboots.blogspot.com/2011/10/yapcasia-2011.html

http://spiral.world.coocan.jp/diary/?p=5077

http://spiral.world.coocan.jp/diary/?p=5065

http://subtech.g.hatena.ne.jp/cho45/20111015/1318647596

http://www.donzoko.net/cgi-bin/tdiary/20111016.html

http://blog.comewalk.com/2011/10/yapcasia-tokyo-2011-yapcasia.html

http://subtech.g.hatena.ne.jp/motemen/20111017/1318782235

http://cpanbook.koneta.org/post/11531194751/yay-yapc-asia-2011

http://d.hatena.ne.jp/s_ohira/20111016/1318788282

http://d.hatena.ne.jp/a666666/20111016/1318789391

http://d.hatena.ne.jp/tsucchi1022/20111015/1318695972

http://d.hatena.ne.jp/lapis25/20111016/1318785463

http://d.hatena.ne.jp/tsucchi1022/20111015/1318699093

http://www.hazama.nu/t2o2/archives/002906.shtml

http://notowaka.blog29.fc2.com/blog-entry-633.html

http://mitc.xrea.jp/diary/0104

http://blog.nekokak.org/show?guid=wL11lm344BG_A4LCghOgLw

http://d.hatena.ne.jp/lesamoureuses/20111017/1318829961

http://d.hatena.ne.jp/riko/20111017/1318825501

http://cuddlecore.blog.shinobi.jp/Entry/28/

http://d.hatena.ne.jp/onishi/20111017/1318833768

http://unknownplace.org/memo/2011/10/17/1/

http://d.hatena.ne.jp/syohex/20111016/1318730798

http://bulknews.typepad.com/blog/2011/10/yapcasia-2011-notes.html

http://d.hatena.ne.jp/dragon3/20111016/p1

http://blog.7kai.org/2011/10/yapcasia2011/

http://d.hatena.ne.jp/kamipo/20111017/1318859431

http://d.hatena.ne.jp/toku_bass/20111017

http://d.hatena.ne.jp/TokyoIncidents/20111017

http://blog.yappo.jp/yappo/archives/000763.html

http://subtech.g.hatena.ne.jp/hakobe932/20111017/1318856420

http://d.hatena.ne.jp/hsksnote/20111017/1318856783

http://subtech.g.hatena.ne.jp/mala/20111017/1318865712?utm_medium=twitter

http://d.hatena.ne.jp/norry_gogo/20111015/1318701007

http://d.hatena.ne.jp/ktat/20111015/1318698758

http://howlongafter.blogspot.com/2011/10/yapcasiani.html

http://hirobanex.net/article/2011/10/1318692865

http://www.naney.org/diki/d/2011-10-13-YAPC-Asia-Tokyo-2011.html?utm_source=feedburner

http://d.hatena.ne.jp/KeME/20111018/1318897647

http://d.hatena.ne.jp/ka2u/20111017/1318863569

http://blog.iss.ms/2011/10/18/131022

http://gugod.org/2011/10/yapc-asia-2011/

http://d.hatena.ne.jp/karronoli/20111015

http://d.hatena.ne.jp/masartz/20111017/p1

http://www.muratayusuke.com/2011/10/18/yapc2011/

http://blog.irako.net/?p=122

http://d.hatena.ne.jp/TokyoIncidents/20111017/1318864976

http://shanon-tech.blogspot.com/2011/10/yapcasia-tokyo-2011.html

http://pr.zero-start.jp/archives/65620881.html

http://d.hatena.ne.jp/mandy_44/20111018/1318950353

http://www.kayac.com/news/2011/10/yapc2011_award

http://www.naney.org/diki/d/2011-10-14-YAPC-Asia-Tokyo-2011.html

http://blog.livedoor.jp/ricoasax/archives/1397277.html

http://yusukebe.com/archives/20111019/085352.html

http://d.hatena.ne.jp/keroyon0630/20111019

http://floralcompany.jp/archives/2011/10/yapcasia-lt.html

http://d.hatena.ne.jp/nitro_idiot/20111019/1318996452

http://d.hatena.ne.jp/masakyst/20111019/

http://rjbs.manxome.org/rubric/entry/1912

http://bulknews.typepad.com/blog/2011/10/carton-talk.html

http://sukuna.net/blog/2011/10/19/yapcasia2011%E3%81%A7%E9%85%92%E9%A3%B2%E3%82%93%E3%81%A7%E3%81%8D%E3%81%9F%EF%BC%88%E3%81%82%E3%82%8C%EF%BC%9F%EF%BC%89/

http://d.hatena.ne.jp/akiym/20111019/p1

http://uramayu.typepad.jp/blog/2011/10/yapcasia%E3%81%A7%E5%B0%91%E3%81%97%E3%81%A0%E3%81%91%E3%83%9C%E3%83%A9%E3%83%B3%E3%83%86%E3%82%A3%E3%82%A2%E3%81%97%E3%81%A6%E3%81%8D%E3%81%A6%E9%9D%9E%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E5%A5%B3%E5%AD%90%E3%81%A0%E3%81%91%E3%81%A9lightning-talk%E3%81%97%E3%81%A6%E3%81%8D%E3%81%9F.html

http://rejoice.jugem.jp/?eid=281

http://blog.myfinder.jp/2011/10/yapcasia-2012-10yapcasia-2011.html

http://blog.livedoor.jp/dankogai/archives/51739876.html

http://blogs.perl.org/users/lestrrat/2011/10/a-glimpse-of-yapcasia-tokyo-2011.html

http://yamamotodaisaku.com/2011/10/15/yapcasia-tokyo-2011%E3%81%A7lt%E3%81%97%E3%81%A6%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F%EF%BC%81-yapcasia/

http://www.naney.org/diki/d/2011-10-15-YAPC-Asia-Tokyo-2011.html

http://www.kondoyoshiyuki.com/2011/10/21/yapc-asia-201/

http://6pongi.wordpress.com/2011/10/21/yapcasia-2011%E3%81%A7%E9%81%8B%E7%94%A8%E3%82%92%E6%8C%AF%E3%82%8A%E8%BF%94%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%9F/

http://blog.livedoor.jp/wantonbe-labo/archives/3984541.html

http://d.hatena.ne.jp/uzulla/20111016

http://d.hatena.ne.jp/uzulla/20111014/p1

http://d.hatena.ne.jp/ishikawam/20111020/p1

http://d.hatena.ne.jp/kouuuu99/20111020/1319134606

http://www.sochiai.com/2011/10/yapcasia-tokyo-2011/

http://alpha.mixi.co.jp/blog/?p=3778

http://d.hatena.ne.jp/lapis0896/20111017/1318845490

http://blog.hide-k.net/archives/2011/10/yapcasia_2011.php

http://blog.rmail.jp/2011/10/21/yapcasia-tokyo-2011/

http://azumakuniyuki.blogspot.com/2011/10/yapcasia-tokyo-2011.html

http://d.hatena.ne.jp/kazuph1986/20111022/1319290111

http://d.hatena.ne.jp/kazuph1986/20111022/1319290126

http://d.hatena.ne.jp/kazuph1986/20111022/1319290136

http://d.hatena.ne.jp/risouf/20111022/yapcasia

http://d.hatena.ne.jp/koba04/20111023/1319300310

http://blog.aklaswad.com/2011/000506.html

http://blog.kushii.net/archives/1659263.html

http://diary.overlasting.net/2011-10-14-1.html

http://memo.fushihara.net/post/11819549418/yapc-asia-2011


« 3 »