北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

YAPC::Asia 2008 Tokyo 2日目

いよいよ最終日です。電池切らさないように頑張ってレポートします(笑)。

You're Doing OO Wrong/Michael Schwernさん(9:50〜10:25)

スピーカーの到着遅れてたようです。5分遅れでのスタートです。

  • 継承がオブジェクト指向?→違う
  • Howではなく、その操作から何が得られるかに着目する→インタフェース
  • 継承がなぜよくない?
    • 継承はめちゃめちゃになりやすい←ダイヤモンド継承
    • 注意深く継承するのはつまらない
    • 特徴に応じてクラス分けすると、クラスが増え過ぎてしまう
  • Class::DBI → 色々継承している
  • use Moose
    • 少ないコードで書ける→OO部分だけ書けばいい
  • Mooseでも、機能が欲しいだけでextendsを使うと意味がない→hasを使おう
  • Roleはwithで取り込む
  • まとめ: isa ×、hasa ○、Role ○
    • 自分でOO実装しないで、Moose.pmを利用しよう

Moose/Yuval Kogmanさん(10:39〜11:20)

  • Mooseとは?→モダンなオブジェクトフレームワーク
    • Class::MOPのためのシンタクスシュガー
  • hasによるアクセサの生成
  • コンストラクタはMoose::Objectのものを継承
  • default → newにパラメータがない場合に利用
    • lazyでdefaultの評価を遅延できる
  • isa → 型の指定
  • coerce → 型強制(キャストみたいな感じ)
  • handles → 委譲を行うメソッドを指定
  • MooseX::AttributeHelpers + proveiders → 別名での委譲を指定
  • before, after→メソッドの実行前と後のフック
  • around → 中でnextでメソッド本体を呼べる
  • punch_in, punch_out
  • 型指定に、or指定やXXXクラスの配列、のような指定ができる
  • Role → Javaのインタフェースやmixinのような機能
    • 多重継承に変わるもの。
    • CPANに上がってるRole → MooseXの、Storage, LogDspatch, Getopt, Param, Clone
  • with → クラスにRoleを追加
  • requires → 必要なメソッドの指定
  • Roleの組み込みでは、コンパイル時チェックをしてくれる
  • MooseはClass::MOPで作られている
    • Perlのメタオブジェクトの仕組み
  • createによってクラスを生成することができる
  • Mooseは単なるシュガーであり、処理はMOPのメタオブジェクトが行う
  • メタクラスは、クラスの挙動をコントロールしている
    • Moose::Meta::Class、Attribute, Method, Method::Accessor, Instance, Role, TypeConstraint...
  • Mooseを利用して、XMLとオブジェクトを相互変換
  • Mooseの欠点
    • ロードが遅い→MooseX::Compile
    • 機能によっては遅い→ただし、使った機能の分だけしか遅くはならない
    • ハッシュリファレンス以外のオブジェクトの拡張は困難→MooseX::GlobRef::Object
  • Mooseの利点
    • 同じことを何度も書かなくていい→typoも減る
    • 短い→バグも少ない
    • テストを減らせる
    • 読みやすい
    • メタオブジェクト→イントロスペクションを可能にする
    • まとめ: #mooseへGO
  • 質疑応答
    • Q. mooseとuse fields、my type宣言は共存できるの?
    • A. 5.10からmy type宣言はほとんど意味がないが、面白いことはしたい。mooseを入れたからと言って、既存の物が動かなくなることはない

Branch Management with SVK/Chia-liang Kaoさん(11:35〜12:00)

SVKについてそんなに詳しくないので、貴重な情報を得られました。svk br って素晴らしそうですね!

  • SVK 2.2の新機能 → ブランチ管理
  • 昔はコピーコマンドとrmコマンドだった
  • その後、ciコマンドとかrlogとかrcsmergeとか→共同開発は無理
  • 次はCVSディレクトリ、リネーム、ネットが必要*1
  • 2002年、SVN
    • ブランチとタギングが楽になった
    • オフラインでdiffがとれる
  • SVK
    • offlineでコミットが出来る
    • スターマージ
    • 余計なディレクトリができない(.svnとか)
  • svnでは、copyでマージを作ってmergeでマージする
  • 機能追加やバグフィクスでブランチを作り、リリースブランチにマージする
  • svk では cpでブランチを作って smergeでマージする (mirrorに対して操作する)
  • 新機能
    • svk br --list → ブランチを全て表示する
    • svk br --create foo → ブランチを作る
    • svk br --merge trunk foo → マージ
    • svk br --create bar --switch → マージと同時にswitch
    • svk br --merge foo bar trunk → 二つのブランチの同時マージ
  • リリースのときの操作
    • svk br -move foo release-ready をして、 svk br --merge release-ready/* rc すると一気にマージできる
    • svk br --merge rc trunk
    • svk br --remove release-ready/* rc
  • ポリシー
    • trunkはいつでも動くように
    • 新機能とバグfixはブランチで
    • バージョン管理より開発に集中
    • リリースマネージャが、リリース用のマージする
  • 衝突→悪夢w
    • svkでは、diff,theirs,yours,merge,edit,skipから選べる
  • Q&A
    • Q. svnのマージ機能と協調する予定ですか?
    • A. "YES"
    • Q. svkの.svnがないと言う特性は、/etc以下の管理に向いている?
    • A. 2年ほど前に同等のプレゼンはした
    • Q. svkcvs機能が壊れていたよ。いつ直るの?
    • A. ごめんなさい、2.0で壊れてます

2010 modules I haven't yet talked about/Tatsuhiko Miyagawaさん

日本語関連のモジュールが多かったのはちょっとずるいかなと思いましたが、さすがは世界のmiyagawaさん。ぴりりとCOOLなモジュールをずらりと並んでいました。面白かったです。

  1. HTTP::ProxyPAC
  2. no capitalization → メソッドの呼び方をXxxYyyからxxx_yyyに変える
  3. PHP::Session → PHPとセッションを共有する
    • 使ったことはないw
  4. autobox → スカラにメソッドを追加できたりする例
  5. Time::Duration::Parse → 期間文字列のパース
  6. Encode::DoubleEncodedUTF8 → バイト列とUTF-8文字が混ざってしまった状態を改善する
  7. URI::Find::UTF8 → マルチバイト文字混じりのURLを正確に探す
  8. Lingua::JA::Hepburn::Passport → パスポート用のローマ字に変更する(ヘボン式?)
  9. LWP::UserAgent::KeyChain → キーチェーンを利用したアクセス管理ができる
  10. XML::Liberal → しくじったXMLを修正する。
    • 正しいXMLに関しては、速度は遅くならない

ランチ(12:20〜13:45)

手が魚臭くなった。

DBIx::Class Crash Course: Using DBIx::Class and other modules to make DB driven apps easy/Emerson Millsさん(13:45〜)

  • DBIx::Class(DBIC)
    • Catalystのモデルによく使われる
    • ごちゃごちゃしたテーブル定義を、メソッド呼び出しで効率よく呼び出せるようにする
  • perlシンタックスでテーブル定義する
    • DBIx::Class::Schema(load_components, table, add_columns, set_primary_key,add_unique_constraint)
  • has_manyとbelongs_to → 関連
  • many_to_manyについて → 関連テーブルを経由する
  • selectの仕方 → resultset->search
  • ResultSetとは?? → クエリの代理。lazyな動作を担当する
    • resultset_classによって拡張可能
  • モデルの初期化
    • Schema.pmをクラスをロードするように作る。Schema->connectする。
    • dbicdeploy -lib Schema DBI:SQLite:beer.db でデータベース初期化
  • ResultSetの使い方
    • search / search_related(関連クラス側の条件で検索)
    • create / create_related
    • first / all / last
    • オブジェクトのメソッドアクセスでデータを取れる
  • SQLを生成する
    • -or, -and, -in ← 条件
    • join, orderby, group ← attribute
    • orよりも、inを使った方がいい
  • SQLiteは危険、DBIC_TRACE

mod_perlをjob workerとして使う/Masahiro Naganoさん(14:05〜)

Apacheを並列処理に使うって話ですが、mod_perlでメモリの使用量を押さえたり、WEBフレームワークのクラス群がそのまま使えるって利点は目からうろこでした。

  • RSSクローラ ← 外部日記の取り込み
    • User-Agentは、mixi-crawler/2.00
    • 22万県を取得中、19万3千件を2時間弱で取得
  • 昔の設計
    • 複数サーバを用意し、メンバーIDによって処理を振り分け
    • 対障害性 → 1台でも落ちると駄目
    • 増設時 → 台数が設定に含まれるため、全サーバの設定書き換え
    • 速度が遅い → Perlの起動が遅い
  • 新設計
    • クロール時間の短縮 2時間以内に1週
    • XML::LibXMLベース
    • 対応フォーマットを増やす
    • 耐障害性、スケーラビリティ
  • それpla? → 非同期アグリゲータとして、HTTP::Async
    • Net::HTTP::NBによる、非同期HTTPアクセス
    • URLが数GBだとまずい
    • connectはなぜか同期処理になっている
    • ローカル処理、小さいコンテンツになら使っても良い
  • mod_perlをworkerとして使う構想
    • メルマガの構想から来た
    • 1通1通が異なっている
    • HTTP::AsyncとMaxClientsの指定によって非同期処理
  • kickerの設計がミソ
    • 冗長性
    • スケラビリティ
    • DBの接続時間を減らす
    • kickerとkickermanagerに分離
    • kickerはある程度動いたら死ぬ。managerはDB処理
  • kicker manager
    • WheelRun + Component::Server::TCP(外部監視用)
    • 2台以上のサーバで動かす(処理はかぶらないように)
  • 処理がかぶらないために・・・
    • fetcher_seed (0 .. 59) を作る
    • 特定のseedのみ処理する
  • まとめ
    • Apacheで並列処理を面倒見てくれる(MaxClient)
    • メモリ管理(MaxRequestPerChildとかstartup.pmによる効率化)
    • Web Application Frameワークを利用できる
    • 監視もhttp
    • サーバを足せばスケール
    • APIとしても利用可能
  • Tips
    • jobを細かく分割する
    • 非同期に叩くクライアントが必要(HTTP::Async)
  • 質問
    • Q. MaxClientsに達するとどうなる?
    • A. 投げるために、Async側で計算する
    • Q. 失敗したらどうする?
    • A. RSSは失敗してもOK(再度走るから)。メルマガはキューイングされている
    • Q. Apacheのオーバヘッドは??
    • A. あまり考えなくてもいいのではないか

Perlとリアルデバイスを繋げるって快感/Kazuhiro Osawaさん(14:35〜14:55)

なんで裸足なのかと思ったら・・・Wiiボードのためだったわけですねw 笑うべきセッションなんでしょうけど、それ以上にYappoさんのセンスにただただ感心するばかりで・・・miyagawaさんといいYappoさんといいIngyさんといい、スーパーハッカーはやることがスマートなんですよね。おいおい、そこそうやって切り開いちゃうか、みたいな。

  • Macが前提
  • Serial Port, USB, Bluetooth
  • Device::SerialPort, Win32::SerialPort
    • OS依存的な何かがあるが、引数に互換
  • winとdarwin正規表現の罠w
  • Device::VFD::GP1022
    • 電光掲示板にスライド内容が映るデモ
    • 文字やビットパターンを流せる機械
    • 独自使用、独自プロトコル(キャラクタコードも独自)
    • 仕様が明記されてるジャンクはいいね!
    • 検索→Gearmanとか→電光掲示板→映像→ブラウザ、のデモ*3
  • Mac::MissileLauncher (インラインCとか使いまくり)
    • 発射のデモ
  • すでに実装されてるデバイスの再実装は楽
  • Net::Bluetooth??→Macで動かん
  • DarwiinRemote
  • CamelBones → CocoaPerlのブリッジ
    • 使いにくいっぽい→メンテナ頑張れ
  • Mac::WiiRemoteが完成!!!
    • Wiiボードでプレゼンを進めるデモ
  • ケータイのデモはWiFiが不調で中止
  • まとめ: 先人の知恵を利用してデバイスハック
  • Chumbyハッカソンやるそうです。

Perlの!数学!妄想夢芝居!/Shinya Hayakawaさん(14:55〜15:15)

Perlソースコードの集合に対する考察ですが、オチがありませんでしたw 考察対象としてはなかなか面白そうだったのに、ちょっと残念。

  • 芝居
  • Perlのソースの集合と実装の集合 → 相関をグラフ化
  • コラム: 3次方程式→整数しか現れないのに、公式には虚数が現れる
  • TSHのバグ → toke.cで、エスケープがあると扱いが変わる
    • overload::constantとInterpolateは共存できるのか
  • P: Perlの文法を満足する文字列、B: ???
  • σ、τ: ソースコードの置換。置換前後でPerl文法を満たす
  • G: P上の全ての置換、O: B上の全ての置換
  • 写像f: σ→τ 準同型写像らしい?
  • Gの部分群にOと同型になるものが存在する

From POE to Erlang/Faiz Kaziさん(15:40〜16:20)

例の如く英語聞き取れてません、すみませんw

  • Perlでの並列処理は?
    • Perl以外の部分で実現できる
  • Perlで並列処理を書く?
    • ithreadsがあるが、あまり使われていない
    • Perl6では状況が変わるだろう
    • UNIX, fork()
    • ithreadsで書かれた物ってないの??
    • Perl/TkやPerl/GTK+
    • POE
  • PerlUNIXがホームなので、fork()やselectループが使える
    • fork()は遅い、Threadsは恐ろしい、selectは難しい
  • POE → スレッドもロックもない、イベントドリブン
    • Kernnel
    • Processes (not UNIX processes)
    • Sessions(unit)
    • Event
  • POEを使ったサンドイッチの例
  • GTK+では、イベントループはシングルスレッド
    • 「気をつければ使えるが、お薦めしない」
  • use POE::Kernel { loop => "Glib" }
  • POEはフレームワークであり、CPANにはたくさんコンポーネントが上がっている
  • POE::Filter::Zlib, POE::Filter::Line
  • ロックを利用しない→シングルスレッドだから
  • POE, STM and Perl6 threds, Erlagn
  • Moore's Lawはもう成り立たない??
    • クロックではなく、multi-coreの進化となった(better, not faster)
  • 並列化モデルには二つある
    • 状態共有
    • メッセージを送る(Actor Model)
  • Erlang
    • 生産性の高さ
    • ロックなしでの並列化
    • 大量の小さなプロセス
  • Erlangの利用→Twitterなど
  • Erlangの概要
  • 値はbindされる
  • パイプの記法
  • 様々な言語でのラムダの書き方
  • Erlangでも関数言語的な書き方ができる
  • クイックソートの実装例
  • ダブルクリック問題: クリックとダブルクリックのイベントが両方起きてしまう
  • erlangScalaに影響を与えている

XIRCDで加速するIRCライフ/Kan Fushiharaさん

  • IRCの利点
    • 歴史、仕様が枯れてる、ツールが充実
  • irc.freenode.net の #plagger-ja, #subtech
  • ツール
  • IRCを会社でも家でもケータイでも使っている
    • →push型の情報
  • PerlIRCを実装→POCo::S::IRCだと、POEの約束がメンドだったり
  • XIRCDとは?
    • MooseX::POE
    • IRCServerの必要機能
    • Componentに機能をDSL風に書く
    • Componentは各チャネルで動作
  • XIRCDで何ができるのか
    • iCal連携とかRSS Feed連携とかTODO管理とか
  • XIRCDはcodereposで開発中
  • 質疑応答
    • Q. コンポーネントとチャネルは1-1
    • A. 今後出来るようになるのだと思う。
    • Q. ユーザはどうなるのか?
    • A. joinしていることになる
    • Q. twitterの複数を同時に見れる?
    • A. 今は無理。今後出来るかもしれないが、チャネルは別々
    • Q. Componentのデバッグの時、XIRCDのリロード?
    • A. 今はリロードしなければならない。今後はホットデプロイや、テストの書きやすさ
    • Q. サーバ監視でアタックとかを通知するコンポーネントが欲しい

What I've learned in Tokyo/José Castroさん(17:00〜17:10)

(仕事の都合で最初出れず、最後だけ聞きました。)

  • 初めてアジアに来たが、また必ず来る

Perl Is unDead/Michael Schwernさん(17:10〜17:55)

  • ゾンビはBrainsが必要、PerlもBrainsが必要
  • Perl is like COBOL. Perl is dead.
  • CPANの利用数、カンファレンスの数は多い
  • Perlは死んでない
  • Perlはもはやユニークではない
  • PerlWeb1.0は手中に納めたが、2.0は納められなかった
  • Folk Programming → 先生に習うことなしにコードを覚える
    • Perlは、コードがあって単純で結果がすぐ見れた
    • 簡単じゃなくなって来た、結果もわかりにくくなった
    • 最近の、簡単、結果がすぐ分かるのは?→JavaScript、Yahoo PipesPHP
    • PerlではもうFork programmingができない
  • BarCamp → 色々なコミュニティの人の話が聞ける
  • テクノロジーの話ではなく、何をするかの話をしている
  • PearよりWordpressプラグインの方が良質
  • Perlの独自文化ができている→他の文化との付き合いがない
  • Perlが死んでないことを、もっと知ってもらう必要がある → SEO
  • 使いたくなるコードを書くこと
  • 最初の10分を簡単にする←PHP
  • 他のコミュニティのイベントにも行く

閉幕式(18:00〜18:01)

次回予告→東京京都???

おつかれさまでした!

*1:CVSのソースにはi_hate_youブロックがある

*2:今回のYAPCWiFi接続では配られてた

*3:デーモン落ちてて動かないらしいですw