September 2009 posts

Sep 30, 2009

ようやく全部読んだ。のの感想。

photo
WEB+DB PRESS Vol.52
WEB+DB PRESS編集部
技術評論社 2009-08-22

by G-Tools , 2009/09/30

  • 特集1「Java プログラミングの慣習」
    • Perl だとこうだな、JavaScript だとこうだなとあてはめつつさらりと斜め読み。
  • 特集2「Vim の流儀」
    • 華麗にスキップ。
    • だれか Emacs の流儀を。
  • 特集3「SSD 投入 DB基本解剖」
    • これが大変よかった、本当に。
    • SSD には SLC/MLC 2種類あるというのも初めて知ったし(汗)、RDBMS ので使われる基本的な構造とアルゴリズムについての解説、そしてそれが SSD 上でうごくことになるとどうなるか、のところもろもろ理解が深まった(気になっている)。
    • 3回読み直してかなりお腹いっぱいに。
  • 「マルチコア時代の並列処理アルゴリズム」
    • これもあつかった。
    • 並列処理の基本構成・概念・考え方なんかの基礎知識は、これである程度抑えられた気になっている(コードが書けるわけではない)。
  • 「テラスケールのデータベース運用〜設計編」
    • mixi での仕事のやり方が垣間見えたり
    • memcached + MySQL でバランスをとるところ(なんでもかんでも memcached にのせる訳ではない)とか、対角スケールの話が激しくためになった。
  • 「データ圧縮アルゴリズムの基本」
    • さらさらと。
    • 正直アルゴリズム本体についての理解はできてないけど、コレ使うとなにができるとかのポインタはたてたので心の隅に。
    • memcached に入れるときも圧縮できるものは圧縮するとメモリ節約になるかな、とか妄想。
  • WebKit
    • 面白そう
    • 前回、前々回あたりを読み直そう。
    • HTML パーサーの部分だけ引っこ抜いて、いろいろ難しいところもある(?)libxml と同じようにつかえないかな、と妄想。

なんか久々しっかり読んだいい号だった。

Sep 28, 2009

Exporter を継承しているクラスで import を override するには、親(Exporter) の import を呼んであげないといけないんだけど、その呼び出し方がひと味違うらしい。

export_to_level を呼び出してやる。引数の意味は以下のとおり。

export_to_level($where_to_export, $package, @what_to_export)

ようは caller 呼び出すんですな。でも、そもそもこんなケースは特殊のような気がするので、

export_to_level(1, @_)

という決まり文句でぼんやり覚えておくことにする。

そもそもこれにたどり着いたきっかけは、テストコード用のユーティリティ集めた Utility パッケージ書いてて、テストコード本体のほうにもろもろ use を毎回閣の面倒だから sub import で import したれ、とおもって書いたところ、@EXPORT で export してた関数が Undefined subroutine になってしまったというところでした。

Sep 20, 2009

YAPC::Asia 2009 最終章。

特別研修 Moose 入門に引き続き、『DBIX::ClassとMySQLによるPerlアプリケーションのスケーリング術』に参加してきた。

上のページにはいくつかトピックスが書いてあるけど、大まかには3部構成(具体的にタイトルがついていたわけじゃないけど)。

つかみ

おもむろに「みなさん前に出てきてください」といって、タロットカードみたいな大きめトランプをだし、数字探しゲーム(自己紹介もなし!)。

まずは 1 人 vs 3 人で、ホワイトボードに書かれた 5 つの数字を探す。3 人チームは、 30 秒程度で全部探しあて、1人チーム(?)は、1 分 30 秒かかってようやく完了。

続いてふたたび別の数字を 5 つホワイトボードに書いて、その4人に指令。「カードをどんなルールでもいいから 30 秒(だったかな?)で並べなさい。」ちょっと相談して、その4人チームは数字ごとにまとまりを作ることに。まだそろいきってはいないものの、ほぼまとまったあたりで時間終了。

で、探し始めるのかと思いきや、ホワイトボードに書いた数字を消す!?「はい仕様変更です。いままでのは忘れてください。ビジネスにはよくあることです、はっはっは(だいぶ意訳)」と言って、カード並べを見ていた4人に指令(僕こっち)。「これから数字5つを書きますので、目をつぶってください。Go といったら数字を確認してカードを探してください。」さらさらさら。

「Go Go Go !! 」(ジョジョじゃないよ)

あたふたしつつも、あらかた並んでたのでなんとか 20 秒くらいで捜査完了。

そんなこんなで、ようやく着席。そして質問。

「この結果からわかることをあげてください」

  • 1人より複数のほうが速い
  • 同じ人数でも、あらかじめ並んだものから探す方が速い

「そのとおり。これは、データベースも一緒です。」

こんな幕開け penguin そしてようやく自己紹介と今日の簡単なアジェンダ紹介 happy01

まずは 前半に知識、後半はテーブルごとに(今回は3つ)前半で覚えたことを生かして簡単なアプリを作る、という2部構成。

知識

まずは参加者に、スケーラビリティを確保するためにいままでやったことと、そしてそのときに起きた問題を聞かせてくださいと質問。で、やったこととして、でてきたのが、

  • レプリケーション
  • キャッシング
  • パーティショニング

うむ。みんなわかってるよねってことで、小休憩を挟んでここから怒涛のレクチャー。メモ垂れ流し。

  • MySQL のストレージエンジンについて
    • MyISAM
      • トランザクションなし、行レベルロックできない
      • Readonly もしくはほとんどが Read なものであれば速い
    • InnoDB
      • これ以外の選択肢はあまり考えたことがない
  • Replication (MySQL)
    • Master - Slave
      • DBIC でサポートしているの使える
      • そんなに難しくない
    • Multi Master
      • DBIC ではサポートしていない
  • Profiling
    • DBIx::Class::QueryLog 使ってパフォーマンス計測
    • export DBIC_TRACE=1 を使って実際に発行される SQL とか確認
  • ResultSet
    • Query の発行をできる限り抑える
    • fetch したやつはすべてオブジェクトつくっちゃう
      • HashRefInflator 使おう
    • colum でとってくるカラムをしぼれる
      • join とあわせて使うと、場合によっては大量の query を発行してしまう可能性がある
      • 代わりに prefetch を使う
    • join か prefetch か
      • 常に prefetch を使えばいいというものではない
      • prefetch は "データ" が欲しいときのみ
  • primary key
    • auto increment はデーターベース単位なのでスケールしない
    • UUID を使おう(UUID でかすぎと思う場合は YUID がいいよ、という 6A プロダクト宣伝しとけばよかったか。)
  • job queue
    • schwartz / gearman だね
    • job queue として EC2 とかのクラウドを使うっていうのはいいね
  • CDN
    • client の接続速度のばらつきを吸収してくれる
    • 同時接続数をおさえることができる
  • 使えるツール紹介
    • ab
    • mytop
    • nagios
  • CPAN モジュール紹介
    • Catalyst::Model::DBIC::Schema の
      • Catalyst::TraitFor::Model::DBIC::Schema::Caching
      • Catalyst::TraitFor::Model::DBIC::Schema::Replicated
    • MySQL::Sandbox
    • Test::DBIx::Class

DB のスケールに特化した講義というよりは、Web アプリ自体をスケールするという話もあったり。『DBIx::Class をつかった』という部分は実は決して多くはなかったので、ちょと想定してきたイメージと違った。とはいえ DBIC ででき(う)ることがわかったのと、知らないモジュールも使い方もでてきて勉強になった。

あとモジュールなるべく最新版をこまめにバージョンアップして使うことをおすすめしていた。Query の最適化具合とかが結構違うとか。Catalyst も 5.8 で使うのがおすすめとのこと。(Moose)の Traits でモジュール指定する(+ちょっと設定)だけでもろもろ使えるのがらくちん、とのこと。

実践

3 つのグループにわけてテーマを決めてアプリ作り。各グループで、

  • Replication
  • Caching
  • Job queue

から最低どれか 1 つの技術を選んだ後、DBIx::Class の機能のうち

  • HashRefInf
  • Prefetch
  • QueryLog(だったかな)

のどれかを混ぜつつなにがしかのアプリを作ること。

僕のグループでは、Caching つかって microblog つくることに。DBIC でつかうのは...、なんだったっけ...(汗)。結果的にはアプリ自体は未完成でしたが(なぜか僕の環境でキャッシュがうまく機能してくれない)、指定方法含め DBIC の知識いくつかを得ることはできたのでよかったです。作業的にはだんとつで僕が足引っ張ってました...。

他のグループでは、

  • フォームから入力された内容を、job queue を使ってメール配信
  • Replication つかってのなにか(自分のことばかり気にしていてメモしてない...)

というものを作っていました。メール配信のは完成されていたようですばらしす。Replication チームは、MySQL::Sandbox をつかっての Master / Slave 環境を整えるのに一苦労でアプリの開発までは行けなかったようだけど、その苦労はそれはそれで楽しそうではあったかな。僕も今度やってみよっと。

まとめ

正直なところをいえばもすこし具体的な所の話は欲しかったかなと。Job Queue にしても、TheSchwartz がいいよ、とはいったもののコード的な説明はいっさいなかったり、POD での説明だけで終わったモジュールも結構あったので。アプリ作りするには、ちょっと知識のほうの前ふりがよわかったかなと。とはいえ、DBIC に関して教えてもらえたことは知らない内容ばかりだったのでとても勉強にった。

あと、その日たまたま同じテーブルについたひとと、突然チーム開発をはじめるっていうのはいい経験だった(自分のへたれ具合を再確認できた、という意味でも)。

そして、今回の参加者は Moose 入門よりさらにすくない 8 名...。うーむ、残念。

YAPC::Asia 2009 終了!

以上で、研修も今年の YAPC::Asia も終了。カンファレンスはもちろんだけども、今回の研修には本当に満足。自分のレベルにあた研修があったら参加しとくべきだなと。まぁ、毎回今回のようなクオリティの研修が行われるとは限らないけれども、金銭的なところだけでさけて通るにはとても惜しいなぁと思いますた。

やぁ、よかった、よかった。

Sep 15, 2009

先週末の YAPC::Asia 2009 のカンファレンスに引き続き、特別研修『Moose入門、モダーンなオブジェクト指向システム』に参加してきた。

研修の内容は、Moose とはなんぞやから始まり、以下(だいたい)7 部構成の入門講座。

  1. Moose Concepts : コンセプト
    • ざっと機能一通りみてみる
    • なぜ Moose なのか
  2. Classes : Class の基礎から使い方
    • Moose::Object が何持ってるかとか
    • BUIDLARGS, extends, override, super の使い方
    • Moose 使ったあとの後始末 (no Moose;)
  3. Role : Role の基礎から使いかた
    • Role の持つ意味
    • 使い方
    • alias で衝突回避
  4. Basic Attributes : Attribute いろいろ
    • required, default/builder, lazy, clearer, predicate の使い方、使い道
    • init_arg
    • attribute の継承してみたり
    • accessor を変更してみたり
  5. Method Modifires : Method Modifire いろいろ
    • before / after / around の使い方、使い道
    • Role での使いかた
    • augment / inner の使い方、使い道(あんまりないよ><)
  6. Types : 型制約
    • Built-in Type たち
    • 自分で subtype 作る
    • shortcuts (class_type/role_type/duck_type/enum)とか、anonymous subtype とか
    • corecion のあれこれ
    • MooseX たち
  7. Advanced Attributes : もっと Attribute
    • Weak References と weak_ref => 1
    • Triggers
    • Delegation / Native Delegation
    • Traits / MetaClasses
  8. おまけ
    • 有用な MooseX たちが Task::Moose のってるよ
    • MooseX::Declare
    • Extension 書くのはむずいよ

ただ解説があるだけじゃなくて、各パートごとにエクササイズが用意されていて(テストコードと、やること書いてある POD)、

  • 説明きいて、考えて、質問して
  • フレッシュな記憶のうちにごりごり考えながらエクササイズ
    • ちょっと実装して
    • prove
    • 直す、次の実装する
    • 以上を、すべてのテストがパスするまで繰り返し

という進め方。

はっきりいって、大充実の内容でした。1日中ずっと集中してた。解説もわかりやすかったし、エクササイズもテストコードが用意されていたおかげで、確認しながら進めれたのでとてもスムーズ。

Moose は、去年ひととおりチュートリアルやっただけで(しかも中途半端に)、それ以降は使うこともなく...。それが最近 Catalyst が 5.8 になったりで、アレがアレしたりで、またやらねばと思ってたところにちょうどこの研修の開催を知って、なんにも考えずに飛びついたけど(お金ないんだけど...)、大正解だった。

どうかんがえても、今日の内容は週末ちまちま勉強してるだけじゃ1日ではこなせない内容。自分で POD 見ながら try and error で使い方を見つけていく、身につけていく方法はそれはそれでためになるけど、多少のお金をはらって短時間で凝縮して、変な苦労なくスムーズに学習できるとしたら、そんなラッキーなことはないかな、と。

残念ながら参加者は 11 名とちょっと寂しい状況ではあったけど、たぶん参加者は全員大満足のうちに帰ったはず。ジャンプスタートの機会を手にした数少ない人間なので。ちゃんと復習やって、妄想してないで、作るもん作っていこう。

JPA++

Sep 13, 2009

YAPC::Asia 2009 に行ってきた。

聞いたセッションの中でやっぱり興味を引かれたのは非同期モノ x 3。

若干自分の理解にまだ不安があるものの、使えそうなところで使っていこう。

あと、この mala さんのセッションに加え、

の3つのセッションは、未来を作ろうとしてる感があって印象的だった。 すごいなぁ、と関心しているばかりではいけないんだけども...。

その他には、

  • Catalyst な話がいろいろ聞けてよかった。
  • perl-completion.el / antything-projects.el 使う。
  • Perlbal、MogileFS とかって単語がぽろぽろ聞こえてきたりして、意外と普通に使われてるんだなぁ。
  • なんのかんので Moose だ。
  • WAF 作ってみたいなぁ。あ、TypeCast か。

とかとか。

最後に大いなる反省点。

2日間朝から終わりまでずーっといたにも関わらず、面識のある数名と挨拶程度の会話をしたのみ...。ひたすらセッションを聞き、こうしたらあれに使えるかなぁとか妄想を繰り返し、休憩時間は紹介されたモジュールの POD 読んだり、ソース眺めたり...。だめだなぁ、人見知り...。

とはいえ、僕なりに本当に楽しい2日間でした。

スタッフの皆様おつかれさまでした。 あ、まだ来週の研修ありますね。

僕は、Moose と DBIx::Class のやつに参加申し込みしています。これも楽しみ。 (DBIx::Class はずいぶんとさわってないので少し予習しておこう...)

まだまだ YAPC 気分。