時計を壊せ

駆け出してからそこそこ経ったWebプログラマーの雑記

#yapcasia 2012 に参加してきました

YAPCはおわっちゃいねえ。俺達のYAPCはまだ始まったばかりだ!

と言ってるわけにもいかないので、いい加減書きます

今年のYAPC

今年は東京大学のなんちゃら記念館というところで開催されました。
今年出来たばかりみたいで新しく、綺麗な建物でした。
運営もいろいろ進化していて、英語のセッションで質問をするときにlestrratさんなど英語の話せる方が翻訳してくださったり、受付も素早く、ホールで飲み物も提供されていたりして、運営の方が去年以上に細かいところまで気を配って運営していてすごいと思いました。
運営の皆さんお疲れ様でした。ありがとうございました。
ぼくも来年は運営手伝ってみたいなと思いました。

聞いたトーク

What Does Your Code Smell Like? (Larry Wall)

Perl6の紹介をライブコーディングでやっててすごかった。
Perl6、多機能なのは良いのだけど、whatever starはどうも受け付けない。。。
あとvimの操作が達人過ぎてやばかった。

Nana/Tora - Perl5 から見える未来。Perl5 と共にあゆむ Perl6 ではないプログラミング言語、それは。 (id:tokuhirom)

toraとnode-perlとnpmの話とかいろいろ聞けて面白かった。
あとトークタイトルがやたらかっこよかった。

Perlと出会い、Perlを作る (id:goccy)

C++によるperlの高速な処理系を作って、どういうところを工夫したのか聞けて面白かった。
まだまだ作っている途中の模様だけど、今後どうなっていくかに期待。

Distributed Job System. Clutch (id:nekokak)

Cluntchの紹介。
前々から興味はあったけど、思ってた以上に使いやすそうで、
Dainamo::Profile::Cluntchとか書いて使ってみようかなと思った。

続・Mobage を支える技術(id:xaicron)

Perlでシグナルを扱うときにXSモジュールが絡む場合にどう扱うか、
何故そのように扱わなければいけないかが知れて良かった。
リアルタイムに茶々が入るのも見てて面白かった。

Profiling memory usage of Perl applications (Tim Bunes)

perlのメモリ管理の解説とDevel::Size(?:Me)?の紹介。
自分の英語力の無さを最も呪ったトークだった。
内容的に凄く知りたい内容なのに、言ってる事を節々しか聞き取れないのは痛かった。
でも、スライドやデモが充実してたので、なんとなく理解出来た気がした。
ブログになんかいろいろ書いてくれていたりするので頑張って読みつつ英語を勉強しようと思いました。
そしてトーク中にデモで使ってたWebAppがすごく便利そうなので、使ってみたくなった。(Devel::SizeMeに同梱されてる模様)
英語、勉強するぞ!!11111っておもった。

Perlアプリケーションのベンチマークとプロファイリング (id:sfujiwara)

アプリケーションの高速化のためには計測が欠かせないというところで計測の手法をいろいろ紹介していた。
本番環境で一部のアクセスだけでNYTProfを動かす方法で、POSIX::AtForkを使って一部のプロセスだけでプロファイリングしているのが面白かった。

Perl 今昔物語(Tomihisa Fuon)

いまのYAPCに至るまでPerlコミュニティはどのように変わってきたのか、
Perlをいま使い続ける理由は何があるのか、
これからperlperlコミュニティはどのように変わっていくべきなのか考えさせられて面白かった。

Perl as a Foreign language(id:dankogai)

まだまだperlを使い続ける理由はあるよという事でperlの良い所として、
perlはサーバーサイドでは今でもどこでも動くし、多少変な書き方してても動く。
まともなUnicodeのサポートもあるし、起動速度が速い。という点を挙げていたりして面白かった。

Skyarc Systems presents 「遠方よりの参加者」発表

遠方からの参加者によるLT。id:meru-akimbo がLTやるという事で聴きに来た。
卵かけご飯とこわい人*1のF#の話がインパクトありすぎた。

ウェブアプリケーション開発の現状・課題とJSX (id:kazuhooku)

ビジネス的な視点も入れて、ウェブアプリケーション開発の歴史と現状について説明して、
JSXが何故必要でどういう機能を持っていて、どのような周辺ツールがあるのかなどを説明していて、
内容盛りだくさんで面白かった。特に、僕はビジネス的な考え方がまだまだ下手なので、
その辺りから説明していたのが聞けて勉強になった。

How Perl Changed My Life (id:mizzy)

mizzyさんがperlコミュニティが如何に好きなのかがすごい伝わってきてじーんとした。
(なぜか)ぼくもPerlで初めて触ったWAFはSledgeで、WAF使うとWebAppが簡単に書けて万能感が手軽に味わえるので、
Sledgeでプログラミングが楽しくなったというところはすごく共感出来たりした。
ぼくがプログラミング楽しいなーと思ったきっかけは中3の頃に罪と罰というCGIゲームを改造していたときで、
コードはメッチャクチャ汚い上にすごくバグってたけど、こんな機能入れちゃえとかいうのが簡単に出来て、
俺SUGEEEEEEって出来たのがまるでゲームみたいで楽しかった。
もっとコード書くの楽しめばもっと良いものが作れる気がしてきた。

ぼくのLTについて

2日目にLTをやらせて頂きました。
説明がめっちゃ駆け足で言葉が足りなかったなと猛反しているのですが。
結局何やってたのかよくわかんない感じになってしまって、
デモってむつかしいなーって思いました。

http://yapcasia.org/2012/talk/show/e9030f38-0637-11e2-a778-779e6aeab6a4

このLTで一番伝えたかった事は「こういうアプローチを試してみたけど、あまりうまくいかなかったので、いい方法あれば教えてください!」という事なんですが、
ただ、「『こういうアプローチ』ってどういうアプローチや!!!」って感じになってしまったので、
簡単にですが補足してみたいと思います。

簡単に言いたかった事を補足

ダミーデータはData::RuledFactoryとか使えばすごく楽に作れるし、使わなくてもそんなに苦労せずに作れるんですが、
ダミーデータの型を変えたり、カラムを減らしたり増やしたりする度にDBのテーブル定義を書き換えたりしなきゃいけないかったりします。

アプリケーションの機能開発をしていると、途中でDBのテーブル定義を書き換えたくなったり、ダミーデータの生成規則を変えたくなる事が多くあったりするので、
このArrayRef[HashRef]なダミーデータをDBにわざわざ毎度入れるのが面倒くさくなってきて、
じゃあArrayRef[HashRef]なダミーデータをgrep { $_ eq "hoge" } @$dummy_data;するか?ってなったけど
わざわざTeng使ってるコードをgrepに書き換えるのはナンセンスだなーってなった。


じゃあTengと同じインターフェースでgrepする(ArrayRef[HashRef]なデータ構造をDBにINSERTせずにそこから直接データを検索する)事が出来たら、
毎度毎度DBにINSERTする手間を省けて楽出来るんじゃないかなーと思ったので、
Teng::Plugin::Staticとか書いてみたという感じでした。


やってる事的にはKawaii DBみたいな事をやっていて、

$teng->search(table_name => +{ hoge => +{ '!=' => "hoge" } });

とかやると裏で

grep { $_->{hoge} ne "hoge" } @$table_data;

みたいなコードが走るイメージです。(実際は!=以外も対応してるのですこし複雑です)


利点は、前述した問題(ダミーデータの生成ルールを書き換えたりするたびにDBにINSERTする必要がある)が解消されていることです
また、Tengのインターフェースをそのまま使えるので殆どのコードを書き換えずともロジックがうまく動きます。
欠点は、、、沢山あります!!!
通常の場合と比べて、ダミーデータの生成*2+フルテーブルスキャン的に検索条件の解釈とマッチ+deep clone*3というのをやっている為非常に遅いです。
Storableを用いてcacheする事によりダミーデータの生成をある程度skipすることには成功しましたが、
それでもやはり結構遅いです。
更にもちろん、SQLを解釈しているわけではないので、dbhを直接触っているコードはもちろん、
search_by_sqlなどsql系のメソッドも動作しません。(利用環境にはそういうコードが無い前提でした*4
また、当然ですがRDBMSを使っていないのでベンチマークなど計測目的では使えません。*5


LTでやるには重すぎるネタかなと思いつつ、自分的に一番アツいネタだったのでこれを話してみましたが、
いろいろ省きすぎたなあと思って反省。
でもポジティブに考えれば以前より考えてコード書くようにはなってきたので、
来年は、問題とそのバックグラウンドも含めて解決策とコードを提案する普通のトークが出来たらいいなと思ってます。

*1:@kyon_mm

*2:ただし初回読み込み時のみ

*3:親データに影響を与えない為

*4:Tengの良い所を潰してしまってる感あるけどやむなしと考えた

*5:スライドのダミーデータの用途でベンチマークを挙げたのは誤解を招いたなと反省しました。