2012年7月1日日曜日

Perl Beginners #3 開催しました



6/29(金)19:00~20:30(実際は10分ほどオーバー)にかけて、Perl Beginners #3を開催しました。

ビギナーズセッション


今回は、ビギナーズセッションでの発表者は@studio3104_comさん1名でした。若干さみしいなーとは思ったものの、テーマが「データベース」ということもあって、質問すること自体が割りと難易度高めだったのかな、と反省しております。
さて、@studio3104_comさんの発表ですが、まさかのfluentd!!!なんというガチ!!!(githubはこちら。)

※彼は事前に主宰にリンクまで送って、「こういうのでOKですか?」って訊いてくれてたにもかかわらず、僕のほうできちんと確認しきれないまま(要するにもちょっとソフトに!とかいうツッコミを入れないまま)OKだしちゃったので、その辺はまあなんと言うか、ごめんなさいです。。。

やりたいこと&質問事項を、掻い摘んで書き出すと、

 やりたいこと
  • MySQLのslow-logを監視して、slowなクエリを抜き出す
  • use db_nameのようなDB変更クエリを元にDBを選択し、 抜き出されたslowクエリに関するEXPLAINを実行する
  • 実行結果を別ログに吐き出す
質問事項
  • DBがシャーディング(このブログが詳しい)されているので、異なるDBでもテーブル構造がまったく一緒だったりする。
  • どのDBに関するslowクエリなのかを判断する方法が、知ってる限りuse db_name を見つけるくらいしかない。
  • 特にプログラム起動直後は、use db_name が見当たらないケースが発生するので、DBの特定方法でもっと良い方法は無いだろうか。
というもので、ものすごくガチではないものの、beginner向けとしてはなかなかパワーのある内容でした。



ある程度質問内容を噛み砕いて説明した甲斐もあって、聴衆からはさまざまな意見が出てきました。最初のほうは、

 「クエリのコメントにDB名を書いておけばログにコメントが出てくるんじゃないのか?(実際はログに載らなかったのでダメ)」
 「当たり障りのないwhere文にDB名を書くのはどうか?(一同爆笑。クエリに手を加えられないのでNG)」
 「プログラム側で各DBのスキーマを持っておいて、クエリ内のテーブル名を元にスキーマを漁り、DB名を持ってくるのはどうか?(シャーディングのものがあるので、あまり意味が無い)」

というバッドノウハウかつ、あまり効果の期待できないものが色々挙げられたのですが、クエリを発行するシステムがwebアプリということもあって、最終的には

 「EXPLAINを行う直前に、どのDBを使っているのかを問い合わせる別のwebアプリを用意し、間に挟みこむ」

という方法がベターであろうという話になりました。

あと細かいところで、

my ($foo) = $str =~ /^foo:(\w+)/ if $x;

のような書き方は$fooがそもそも定義されないケースがある(modperl)ので、オススメできない、という意見もありました。

ちなみに@studio3104_comさんは、perlは3ヶ月くらいしか触っていないとのことでしたが、ほかの言語の経験がかなり豊富な様子でした。
※本人曰く「「他の言語は経験豊富」は誤報です!!! 他の言語はHello Worldしか出来ませんー 」だそうです。そんなまさかーw

休憩


ライトニングトークまでの10分間、休憩をはさみました。その間も、一部では先ほどのDB名特定について議論していたり、主宰による雑多な質疑応答を交えたりしました。

ライトニングトーク



ライトニングトークの一発目は、主宰による「Perl暦およそ10年(?)の僕がデータベースを使えるようになるまでの昔話」と題して、過去の恥さらしとORマッパー利用遍歴の紹介を行いました。(スライドはこちら)
言いたかったこととしては、DBI+MySQLにまず慣れよう。ORマッパーはその後でいい、ということですね。 


続いて@maka2_donzokoさんのLT。手始めに自己紹介として「薄い本作っています」と言いながら「Acme大全」や「Parumon」の宣伝を行った後、「MySQL使ってる方ー(多数挙手)」「PostgreSQL使ってる方いますか?(2~3名挙手)」「僕もPostgreSQL使ってますけど。少ないですねー」という感じで、いろんなデータベースがありますね的な話をしてたところ、突然スライドの題字「データベース」がもぞもぞ動き出し、いつの間にか「ダースベーダ」になってしまい、下の写真のように。。。


さらに、これだけだとPerlとの関連性が薄いのでという理由で、Perlにはsort()などで登場する「スターシップ演算子 <=>」があるよ(ベイダー卿が<=>に搭乗している!?)という話と、CPANモジュールの1つ、Lingua::Alphabet::Phonetic::StarWarsを使って、ベイダー卿(Vader)が"LOVE"の中に居るんだよ、という話で締めくくりました。まかまかしい!


3人目は@toku_bassさんによるMySQL::Diffの紹介です。開発->検証->本番という3つの環境について、DBのテーブル構造をあわせたい、という、おそらくある程度経験を積んだ開発者なら誰もが思い悩む部分を、「diffをつかってpatchを作るかの如く」解決してしまおう、というものとのこと。


Beginnerにとってだけではなく、Regularな方にとっても細かく役に立つモジュールの紹介でした。
本番DBと開発DBが異なる、という割とカオスな状況は往々にして遭遇する状況ですので、このようなツールの存在はとてもありがたいですね。


最後のLTを務める@hirobanexさんは、Beginner向けにTengを紹介してくれました。
DBIをある程度使えるようになった後は、開発効率を劇的に向上してくれるORマッパーを使いたくなるだろうということで、「作者が日本人」で「割と広く使われており」「そのため日本語で質問しやすい」という感じの利点を前面にTengをオススメしていました。




あと、素のDBIではどうしてもセレクト系メソッドがたくさんあって、Beginner的には混乱しそう、ということもあって、このあたりの事を考えなくてもよいTengのお手軽さをアピール。
「Tengのdoわかりやすいね。」という感想が出るほど、良さが伝わった様です。


ブルガリア料理のお店で懇親会の様子

※何度も言いますが、ガチホモ合コンではありません!!!11(こことか



写真持ってる人、居たらシェアしてくださいね!
ブルガリアンカクテルは、飲んでるときはそんなに強いと思わなかったけど、後でものすごい酔いが回って、かえる頃には見事なヨッパライになっておりました。。。

次回は8/24(金) 19:00開始の予定です。場所は銀座周辺で考えています。


参加した方のまとめやレポート

@xtetsujiさんによるtogetter 
@penguinJr1さんによるレポート
@toku_bassさんによるレポート
@take4_kさんによるレポート
@hirobanexさんによるレポート