Pixel Pedals of Tomakomai

北海道苫小牧市出身の初老の日常

YAPC::Asia 2007 開催中(2)

今日も自分メモ的に実況します。

8:53 T101+102 Room 入り

なんか人が居ないなーと思ったら、開演9:30だったわけですね。勘違いしてたorz つーか、開場時間前に入っちゃった。

9:28

Emerson Millsさんの挨拶。この教室はFONも入るし、何より机があっていい!

9:30 Abusing Domain Specific Languages for Fun and Profit / Jesse Vincent

  • DSLとは?
  • internal DSLs : 母国語
  • Jifty::DBI::Schema, DBIx::SearchBuilder
  • Object::Declare (オブジェクトのDSL表現)
    • ハッシュやsubなどをなくして、シンプルな定義を作る
    • Prototype hacking
    • UNIVERSAL::と::AUTOLOADの使用
  • Template::Declare (HTMLをDSL風に表現する)
    • URLをパッケージ名に擦る
    • HTMLタグをクロージャとして定義しておく
  • Test::WWW::Declare (WEBのテスト用のDSL)
    • 'check'でabortしたらテストは失敗
    • 'session'はクッキー対応
    • 書式の例:content should match qr{hogehoge}i;*1
  • DSLを作るのはperlの勉強になるし、設定を簡単にする
  • 日本語なDSLも作って下さいw


英語がわからなくて死にそうです( p_q)。

10:15 Introduction to DBIx::Class / Jonathan Rockway

ベルが無いので、ばけつを蹴って時間切れのお知らせをしてくれるみたいです。後、やっぱり無線LANは定期的に切れますね。

  • perlのORMの問題
    • 全てのテーブルにクラスが必要
    • 全てのクエリにメソッドが必要
  • Schema テーブルやビューの集まり
    • Schema::Loaderでテーブルをロードする
    • Schema#resultset() メソッドで結果を取り出す
    • Schema#deploy()
  • DBIx::Class::ResultSet 検索可能な検索結果を含む
  • find() 一つの要素を検索する
  • search() SQL::Abstractの文法で検索可能
  • ページングの機能
  • new()して、insert()する = create()
  • updateに関してもupdate()を呼ぶ
  • find_or_new() + update_or_create()
  • DBIx::Class::Relationship
  • リレーションに関する説明

10:38 Asynapse - The missing links between servers and clients. / Kang-min Liu

  • PerlJavaScriptの連携
  • SimpleなAPIである
  • Asynapse::Model::File
    • Javascripからファイルを保存する
  • Diffの実装
    • JSONで文字列を投げる
    • Algorithm::Diff の利用
  • AsynapseRecord JavaScriptからROMを利用する
  • 後半Cocoaで何やったのかわからず・・・orz

11:05

会場移動。こっちはちょっと押してるっぽい。WEB APIからCLIを呼ぶって話かな?

11:10 Mylingual - There's More Than One Language To Do It / Kazuho Oku

  • ローカライズは面倒で、企業はやらない
  • Japanize : FireFoxのエクステンションで、手動翻訳
    • UIのみを翻訳
    • 超訳
    • 認証付きのサービスを相手にするため、ブラウザで翻訳
  • 翻訳データが"共有される"
  • ここでPCがハングしました・・・w
  • 単語単位で翻訳、正規表現翻訳 (ただいま再起動中...)
  • id, class, pathで翻訳の範囲を指定
  • RDBMSを使っていない。JSONで保存。--
  • 再びハング。不調・・・。
  • Mylingual : 他言語の翻訳
    • 自国語でアプリを使える
    • 日本語でサービスを作れる

11:30 自文書抽出日本的住所 / Kazuhiro Osawa

  • Geography::AddressExtract::Japan : 使えるかも
  • 都道府県、郡市区町村、大字、小字、番地号
  • 正規表現だとノイズが多い
  • 県は決め打ちできる
  • 郵便番号DBはでかすぎる
  • Regexp::Assemble : 動的に正規用言を作るモジュール
    • 900行弱で、字くらいまでの全正規表現なら作れる
  • 同盟地名の対応 → 町名まであわせて対応
  • 住所表記のゆらぎ(1-2-3、一の二の三、一丁目2番地3)
  • XXX小学校などが引っかかる
  • 異字体 問題
  • マイナー
    • 地割り表記??
    • 静岡県下田市一丁目
    • 北海道のXX条YYY丁目
    • 京都市の角、入る、上る
  • Sapporo.pm早く作ってw
  • Regexp::Trie Fred??
  • 住所表記の定義をゲットしたらしい
  • 正規表現にパーサを入れるといいかも

12:00 ランチ

臭う店でポークソテー。
無線LAN安定しました。Good JOB!!
午後も引き続きホールです。

13:15 s/ Perl5 Regular Expression / Perl6 Regex and Rule /mixes; / Yoshinori Takesako

  • 正規表現にフォーカスしたPerl6
  • qr// は rx//となる
  • =~ は ~~、 !~ は !~~で、交換可能
  • s{Pattern} = 'replace'
  • /^ $/m は /^^ $$/、 /\A \z/ は /^ $/に
  • xオプションによるコメントがデフォルトに
  • \Q \E は <' '>
  • [ \t\r\n] は [space], [ \t\r\n]+ は /ws/
  • /./s は /./、 /./ は /\N/、 /\n/ は任意の改行にマッチ
  • s/ / /e は s/ /{}/
  • s/ / /ig みたいなのは、 前に持って来て s:ignorecase:each/ / / みたいな感じ
  • 空白マッチ就職子 m:w/ / (\s+と同様の扱いになる)
  • 後方参照は、\1 から $0から、(?: ) は [] となった
  • [^abc] は <-[abc]>
  • / $var / は / <$var> /
  • 正規表現に配列を渡せる
  • (?{code}) は {code}
  • / (...) {fail} / 失敗条件を書ける
  • Rule : 正規表現のライブラリ化
  • m:perl5/ / でPerl5互換になる

13:37 (Ab)?using Class::C3 / Daisuke Maki

  • C3はオブジェクトのメソッドを探すアルゴリズム
  • 多重継承時に一部の親のメソッドしか呼べない
  • NEXT.pm
    • SUPERの代わりにNEXTを使う
  • Class::C3
    • スーパークラスでuseし、初期化メソッドを呼ぶ
    • $self->next::method
    • $self->maybe::next::method
  • NEXTとC3の動きの違い
    • nextする順。NEXT.pmは先に継承を辿れるとこまで辿る。C3の方が自然。
    • 速度。C3の方が早い。
  • 利用例 : DBIx::Class
    • 薄いロジックを多重継承で組み合わせる
  • テレビ番組表パーサの例
  • プラグインとの違い : インスタンスが一つ
  • Mix-inとの違い : 名前空間を奪わない
  • C3の欠点
    • maybe::nextは遅い
    • SUPERに比べると遅い
    • 複雑な継承だと動かなくなる
    • 動的な@ISA変更はNG ・・・ とドキュメントに書いてあるがデモw*2
  • 大規模フレームワークなら使えるでしょう
  • リストコンテキストでcanすると全部返ってくるの!?

14:00 CDBI => DBIC / Tokuhiro Matsuno

  • 政治的な話。二日酔い。
  • CDBIの欠点
  • 政治的障壁
    • 不要論、移行コスト、学習コスト
    • 偉い人を落とす
    • 社内勉強会
    • 時代に乗り遅れてると思わせる
    • 日本人は海外物に弱い
    • From Java To Ruby
  • 移行方法
    • クラスメソッドとインスタンスメソッドの書き換え
    • 一部移行も可能だが、コネクション数が増える
    • CDBIのコードを元にする。インスタンスメソッドはほぼ動く
    • トリガーはnext::method()で表現する
    • set_sqlは・・・しなくてもなんとかなる。ハッシュリファレンスのキモいのを渡す
  • Jeffty DBIに移行しましょう
  • 移行にはやはり時間がかかった

14:15 入門DBIC::Schema::Loader / Atsushi Kobayashi

  • ローダを使わない場合
    • スキーマのモジュールを作り、テーブル情報を設定、load_componentsの設定、関連、プラグイン・・・等等
    • すごく面倒
    • クラス構成とスキーマがあっている??
    • deployメソッドは使わないっぽい
  • ローダーを使った場合
    • カラム、リレーション、コンポーネントなど自動化
    • スキーマの情報がモジュール化されていないので不安
    • 対応するDIBの少なめ
    • 外部キー設定はリレーションの設定に対して必須・・・結局自分でスキーマクラスを起こす
  • Loaderのラップ
    • componentsを自動設定
    • 日付カラムのインフレート
    • リファレンスの自動設定
    • FromSledge, RandomStringColumns, DigestColumns::Lite, AsFdat, StorageReadOnly, MoFedge::Data::DBIC::*
    • created_on, updated_on, *_on, *_at のように、名前を規約でしばってinflate
    • リレーション設定の自動化。table_id = table.id など、規約を縛る。blongs_toとhas_manyを設定する
  • (中略)
  • mod_perlでも大丈夫。初回で情報を拾ってキャッシュ
  • DBICのはまりどころ
    • コネクションが増え過ぎる
    • 循環参照しやすい
    • belongs_toの時、勝手にinsertしようとする
  • (超高速プレゼンだったため、抜けが多数ですw)

14:30

再び一階に移動。Jiftyは立ち見だったぽいです。そんな注目のセッションとは知らずびっくり。スピーカーのはずのAudrey Tangの姿が見えなかったのは気のせい??

14:47 Building Catalyst Applications / Jonathan Rockway

  • Controller
    • :Local, :Global, :Private
    • :Private は URLとしてアクセスはできない
    • ($self, $c, @args)
    • $c : Catalyst Context
    • @args にはPATH INFOが入る
  • View
    • root/src/* に ttのテンプレート
    • lib/site/* に ヘッダとフッタを置く
    • Catalyst::Action::RenderView
    • [% Catalyst.request.uri %] ($cをViewでも使える)
  • $c->uri_for('private/path') URLを得る
  • XXXX_create.pl でモデルを作る
  • result_setを得るのに$posts = $c->model('DBIC::Posts') と言う書き方ができる
  • RESTフルなBLOG を作る
  • FormBuilder.render で、TTにフォームを書かせる
  • →バリデーションなどが自動化される
  • Session で FastMmapを使う
  • flash()の使い方
  • AJAX
    • Jemplateを使う ( root/jemplates, Catalyst::View::Jemplate )
    • Jemplate.process に JSONを返すRestのURLを渡す
  • $c->user, $c->logout
  • Test::WWW::Mechanize::Catalyst
  • Test::WWW::Selenium::Catalyst
  • FastCGI perlbal + axkit

15:30 Pushmi - Subversion replication system / Chia-liang Kao

  • Subversionの欠点
    • 回線がいつも使えるとは限らない
    • 開発者が一番高価なのに、ツールの利用に時間を取られる
  • Pushmi : Slaveを作成して透過的に使える
  • マスタとスレーブでのconflict は解決できない
  • Cronで同期する
  • ケーススタディ:70カ所以上の拠点があるゲーム会社
    • グラフィックデータが多く、回線が遅い拠点もある
  • 読み込みであれば回線がなくてもできる。SVKがあればcmmitもできる

16:00 Inside Net::Amazon::EC2 / Jeff Kim

16:30 Lightnig talks

ドラ登場。

  • にぽたん: 正規表現信者の憂鬱
  • Atsushi Kobayashi: Perlbal selector Plugin
  • ma.la: ブラウザ履歴を利用したRSS Auto-discovery
    • md5化して、Livedoor Readerのクロール結果とマッチングさせる
    • 履歴中のURLから、どんどん削っていって探す
    • あるかないかしたわからない
    • Win32::OLEでブックマーク取得可能
    • 時間切れ
  • Chia-liang Kao: BabelBee - Collaborative Translation Tool
  • ふしはらかん: Moxy - Mobile Development Proxy
    • wema作者
    • ブラウザのプロクシとしてMoxyを指定する
    • ブラウザの設定がほとんどいらない
    • 今後絵文字機能、ヘッダの表示などの機能追加
  • 堂前清隆: (ミニ)カンファレンス中継のあれこれ
    • i-revo KONAMI+IIJ 固定IP実験をやってるらしい?
    • ストリーミングに置ける解像度、delayの解決
    • jpeg+ストリーミング
    • さらに +IRC
    • DB経由でIRCデータを取り、画像合成してファイルに保存
  • Ingy döt Net: Document Formater
  • Jonathan Rockway: Angerwhale
    • Blogging tool
  • 長野雅広: Expectをつかったサーバ管理レシピ
    • 複数サーバのセットアップ
    • sshで同じコマンドを叩きまくる。間違えると(mixiの)ソースが流出する
    • IO::Prompt : パスワード入力用
    • String::ShellQuote : 知らなかった。使いそう
    • Expect : spawnしてごにょごにょ
  • Mark Dominus: Debugging the De Bruijn Sequence
    • 無言プレゼン。こう言う場だと効果的。
    • 全面的にネタw。
    • 0からコードを書いて完成させるんじゃなく、完全なコードから削るとよい
    • 完全なコードをBruijn Sequenceを利用して作成
  • Yappo: Device::USB::MissileLaunchers (live)
    • ミサイル発射の生中継
    • ほんとに飛んだよ!!
  • Thilo Planz: Spidernomic: A self-modifying HTML/Perl/JS file/game
    • 時間切れ

17:35 Perl Program Repair Shop and Red Flags / Mark Jason Dominus

  • コードをよくするためのコードスタディ
  • これはひどい例(join して split)
  • コードを繰り返してはイケナイ ( 月文字列を数字に直す例 )
    • コードは製品じゃなく、機能が製品
    • むしろコードは重荷
    • 同じコードが続くと、わずかな違いを見逃してしまいがち
  • 繰り返しを避ける
    • プログラミング言語のほとんどの機能が繰り返しを避けるための物
    • +=, スコープの小さい変数, while, for, 関数, OOP, モジュール, パイプ, 共有ライブラリ
    • ifの羅刹の代わりに、テーブルを使う
  • elseがない → else { die } としよう ( 又は || die とか)
  • 見通しをよくするためのコメントは必要
  • my 宣言を利用するとこに移す
  • 日付計算
    • 数値表現→文字列表現は簡単だが逆は難しい
    • 数値表現で持ち続けるようにする
    • dateプログラムは文字列を求める物で、数値表現を求めるにはtime()
    • strftime() を利用して文字列表現に擦る
  • 評価を文字列で行わない
  • B:Dparseで、Perlがどうコードを評価したかを調べる
  • たとえ不完全でも、リファクタリングには十分意味がある
    • 行数が短くなった
    • パフォーマンスも早くなった

18:22

エンドロール。変なの作ったらしい。なぜかアジアの純真・・・。お疲れ様でした。

*1:content, should, matchはすべて関数で定義されている

*2:再初期化すれば動くらしい