YAPC::Asia2009 09/11のメモ
- 2日目のメモ。だいぶ抜けてる感じがするけどせっかくなので。
- 全体通して面白かったなぁ。全然技術的な話題が抑えられてないんだなぁと感じてワクワクしてしまった。全部聞けないのがもったいなさすぎる。
- 以下ざっくり感想。
- twitter見てたらJosé Castro (cog) - How regular expressions work internallyの発表とかが面白そうだった
- アニメで見れる正規表現みたいなこと書いてあった。わかりやすそう。面白そう。どんなんだったんだろ。
- malaさんの発表が超詰め込まれてて面白かった。けども理解追いつかなくて途中わからなかったけども。
- perl6の話は前にもどこかで聞いたけどやっぱり気持ち悪いなぁ。perl知る前は$,@,%が全然意味わからなかったけど、やりだしてからは$,@,%のscalaer,array,hashってのにとても感心して使い出したキッカケになったのに。
- 最後の基調講演の「みんながいるから。みんなが助けてくれるから。Perl大好き」の締めは良かった。何か胸が熱くなるな。新しい(ryみたいな感じだった。良かった。
- twitter見てたらJosé Castro (cog) - How regular expressions work internallyの発表とかが面白そうだった
FormValidator::LazyWay で検証ルールをまとめよう - id:vkgtaro
- ギリギリまでvkgtaroさんが来なく「まだ来てない!電話番号知らない?」的な会話が飛んでた
FormValidator::LazyWayができるまで
- id:tomyheroさんが元の作者
- 元々Data::FormValidatorのユーザだった
- Catalyst::Plugin::FormValidator::Lazyを作った
- 遅延のLazyではなく怠けられるのLazy
- Catalyst::Plugin::FormValidator::Lazyを作った
- lazy peopleでData::FormValidateEmを作り始める
- Lazyだと遅延に間違えられるのでLazyWayにrename
- 仕事で使い始めたのでtomyheroさんに許可を得てCPANにアップした
その他のFormValidator
- FormValidator::Simple
- 日本で人気
- FormValidator::Lite
- id:tokuhiromが軽いモジュールつくった
- FormValidator::Nested
- LazyWayを参考にしたモジュール
FV::LazyWayの特徴
- フォームごとでなく、フィールド名ごとにルールを設定して使い回す
- 例:emailフィールド
- 登録、ログイン、編集などemailを使うページがたくさんあるがvalidationルールは一緒
- 例:emailフィールド
- required/option(必須とオプション)
- 登録ページでは必須なフィールド、検索時では必須ではない
- エラーメッセージ
- 検証結果に対するメッセージも自動で設定
- 独自のメッセージを付加することもできる
- ただのハッシュも検証できる
設定ファイルの説明
- level
- 同じフィールド名で異なるルールを指定したい場合
- looseを指定すると携帯メールだけ違うvalidationとかもできる
- 同じフィールド名で異なるルールを指定したい場合
- フィールド名を正規表現でマッチ
- たとえば*_id$なフィールド名を全部同じvalidateでチェックする
- 項目をマージして検証
- 複数の項目をつなげた上で検証
- 年、月、日を合わせてvalidateしたいとき
- 複数の項目をつなげた上で検証
- filter,rule,fixの流れ
- filter:整える→rule:validate→fix:出力
- 「ハイフンっぽい文字列をハイフンにして、正しい日付かチェックして、DateTimeオブジェクトとして取得」ということができる
その他
- 独自ルールモジュールの読み込み
- 「+OreOre::Rule」
- 同一フィールドに対して複数の値が入った場合は配列として取得
- PODが日本語
- 英語のPODあったけど紛失した
- githubにソースある
- (vkgtaroさのgithubに見当たらなかった。聞き間違いかな?どれだろ?)
- コメントで教えてもらいました!id:vkgtaroありがとう!ありがとう!
- http://bulkya.blogdb.jp/share/browser/lang/perl/FormValidator-LazyWay
- (vkgtaroさのgithubに見当たらなかった。聞き間違いかな?どれだろ?)
スケールするウェブアプリケーションを20分で作る方法 - Kazuho Oku(id:kazuhooku)
- twitterを例に出して大規模なDBで、レンジでテーブルを分けている場合(uid:1-2000のテーブル,uid:2001-4000のように)の更新などの話
RDBのsharding
-
- テーブルが複数のノードに分けてあった場合、あるテーブルが更新された情報を他でも更新したい時がある
- id:123がtweetしたとき、tweetテーブルは1つのノードの更新で済むが、複数ノードに分かれたfollowersのtimelineテーブルも更新する必要があるため全てのノードに更新が必要になる
- DBの非正規化が問題になる
- テーブルが複数のノードに分けてあった場合、あるテーブルが更新された情報を他でも更新したい時がある
解決する為の2つのアプローチ
- eventual consistency(結果整合性)
- 非同期でアップデートすればよい
- メリット:速いし、高いスケーラビリティ
- デメリット:メンテナンスが大変
- 非同期でアップデートすればよい
- 2-phase commit
- 複数のDBを使ってる場合に両方書けるか書けないか
- レスポンスが悪い場合がある
- 複数のDBを使ってる場合に両方書けるか書けないか
両方問題点がある
- クエリが複雑
- ノード単位でのコンシステンシーが必要
- 動的なスケール
- これらの解決方法は?
Incline詳細
Pacificで解決
- 動的なスケールを解決する
- まず、スケーラビリティを考える時に、レンジベースのshardingとハッシュベースがある
- レンジベースshardingの方がハッシュベースよりもいい
- あるノードが重いからそのノードだけ分けるってのがやりやすい
- 負荷が増えた時にノードを増やしやすい
- ハッシュベースだと、ハッシュというのはノード間の負荷を均等にしているものだから、8台アップアップなら倍の16台にしないといけない
- ここではレンジベースshardingを考える
pacific mysql_jumpstart
- deamontoolsでの自動スタート
- backupも簡単
splitting MySQL shard
- 2001から4000番のノードの負荷が重くなって来たからslaveを増やして2001-3000と3001-4000に分けることを考える
- いかに速く安全にやるかが問題
- Pacific_divideを使うといい
- いかに速く安全にやるかが問題
Pacific_divide
- 書き込みできなければ、定義ファイルが更新されたと見なしてもう一度定義ファイルを読み込む
- アルゴリズム
- ユーザの書き込み権限を落とすことで誰も書き込みできないようにし、定義ファイルを配り直す
- 定義ファイルを配り終わったら最後に読み込み権限も落とす
- 全部で10秒くらいで終わるからスピーディ
以上の解決法をPerlからどう使うか
- DBIx:ShardManagerがある
- definitionとconnectionを作る
- joinの条件をshard_inner_joinで行うと全てのノードから結果を取って来てくれる
- メリット
- 普通のSQLを書けばいい
- 定義ファイルが(このあとわかんなかった。なんて言ってたっけ)
- 書き込みロック中は例外が出るのでその時は「メンテナンスです」を出せばいい
ToDo
- Incline
- DBが一台死んでら同期できるようにしないとかな
その他
- Mycached
- memcachedがいらなくなる
その他
- 9/25のBPStudyで今日やらなかったデモとかやりたい
質問
- consistaceハッシングがダメな例は?
- 非同期でやる処理が増えて逆に重くなる
kamaitachi - perl flash media server - Daisuke Murase(id:typester)
- cpanにあげてるのでそこからインストールできる
FMSについて
カヤック内では?
- shiritori-ring
- こえ部
- http://koebu.com/
- ニコニコ動画の声版のイメージ
adobeが出している公式のサーバ以外もある
kamaitachi
使い方
RTMPのtips
その他
- 開発はgithubでやってる
- #kamaitachi @ irc.freenode.net
- ShardObjectいらないと思ってるけど、flush使いの人から要望が多いからサポートしようかなぁ
- Danga::SocketをAnyEventにしようかどうしようか
- id:lestrratのlibavcodecが作ってくれるライブラリに期待
perl hacks on vim - Lin You-An(c9s) pause id:CORNELIUS
- 台湾からきた
- vimでの先頭の方の間違いをすると移動に時間かかる
- Fを押して、hを押せば、カーソルより前のhに飛ぶ(カーソルがある行)
- fならカーソルより後の検索
- Fを押して、hを押せば、カーソルより前のhに飛ぶ(カーソルがある行)
- ~でカーソル上の文字の大文字<->小文字変換
learning curve
- emacsの曲線がひどい
移動
- h,j,k,l
- H M Lで一番上、真ん中、一番した
- w,e,b
- wがwordの先頭?eが単語のend?bがback(後ろに進んで行く)
- [を押した後に{で、そのスコープを囲む{へjump
- ]}でスコープを囲む}へjump
- ^で行先頭,$で行最後(正規表現と同じ意味かな)
- %で{や}へjump
- :h motion.txtでヘルプが見れる
Insert
- i:insert
- I:行の先頭へ移動し、insert
- a:append(カーソルの後ろにinsert)
- A:行の最後へ移動し、insert
visual mode
- v:選択スタート
- V:行単位で選択スタート
- ctrl-v:矩形で選択スタート
- y(yank), d(delete), c(change)の時によく使う
syntax highlight
- share/vim/vim72/syntax/ | wc -l
- 500以上のsyntaxファイルがある
- perlのsytaxにはカスタマイズが必要
- モジュールにもsytaxがあるので
- 例:Template::Declare
- subの中にhtml,head,bodyなどの宣言をする
- 例:Markapl, Jifty::DBI::Schema
- ~/.vim/syntax/[filetype].vimを置く
- syn match [id] [re] [options]
- syn region [id] start=[re] end=[re]
- syn keyword [id] [keyword] ...
- ~/.vim/syntax/perl/の下にそれぞれのsyntax用のファイルを置けばいい
- :help syntax.txtでヘルプが見れる
keymap
text object
- 自動補完
folds
- syntax fold
- :set foldmethod=syntax
- mark fold
- :set foldmethod=marker
- indent
- manual
- z何とかでfoldできる
- :h foldingでヘルプが見れる
大規模画像配信を支えるPerl - Masahiro Nagano(kazeburo)
- WEB+DBのvol.50の内容
画像配信システムの概要
システム(アップロード)
- アプリケーションサーバ、smtpサーバ
- RESTでmod_perlに渡す
- mod_perlサーバ
- 変換、縮小
- テンポラリ置き場
- ストレージに転送
- どのストレージの組に送ったかをDBサーバ(マッピングDB)に書き込み
- ストレージサーバ
- 必ず2台1組
- 置けない場合は違う組へ
- 必ず2台1組
MogileFSと比較
- メリット
- 実装を理解している
- ストレージ障害時の復旧が明確
- 2個1組なので片方落ちてもすぐわかる
- デメリット
- JPEG only
- サーバ復旧などが手作業で面倒
- 2台以上への冗長性がない
モバイル画像配信
- モバイルが伸びている
- 特徴
- 画像について
- ファイルサイズ、画面サイズが小さい
- 転送、コピーライトフラグ
- 配信方法
- 動的生成。画像が多いのでキャッシュが効かないため
- 画像について
速度比較
- 条件
- 640x480->260x192
- JPEGの圧縮率80%
- 平等にするためにjpegのコメントは初めから消して比較
- 結果
- EpegがImage::Magicに比べて5倍くらい
- Epegは速いんだけど、サムネイル画質くらいにしか使えない
- Image::Magicがキレイ
- Imlib2を採用した
- Pros
- 速度
- 画質良し
- Cros
- 開発止まってそう
- Pros
おまけ:JPEGの判断
- Image::JpegCheck
- Image::Size
- Image::Magick呼び出されてしまうかもなので速くない
質問
- 認証はどうしてる?
- ハッシュと有効期限が付いていて、見えなくなるようにしている
- パフォーマンスを考えて。
- ハッシュと有効期限が付いていて、見えなくなるようにしている
Concurrent DB Access with Perl - Tokuhiro Matsuno(id:tokuhirom)
- 同期処理の問題点
- 重いクエリをシリアルにやるとレスポンスが遅い
- 「一つのselectが終わったら、次のselect、それが終わったらまた次のselect…」みたいな
- 重いクエリをシリアルにやるとレスポンスが遅い
- 非同期にするには?
- DBにリクエストを送って、ソケットをO_NONBLOCKにしてreadableになったら処理
- Postgresはコアにそれが入ってる。DBD::Pgで使える
DBD::Pgの例
- DBD::Pg ':async'; use AE;
- AE::cv();を作って、pg_socketを監視
- ソケットが読めるようになったらpg_readyが1になる
- そしたらpg_resultで結果を取って$cv->send();で配列にpushする(push @cvs, $cv);
- sendするまではrecvでブロックする。コレがないとプログラムが終わっちゃう
Asynchronous Programming for (A)synchronous Communication - ma la (id:mala)
- 非同期処理を駆使したWebアプリケーションについて
LDR
バックエンドの非同期処理
非同期処理をおおざっぱに言うと
- ジョブサーバを用いたタスクの後回し
- ネットワークプログラミングでの非同期処理を使った並列化
注目する概念は?
- 大きく3つ
- イベント駆動型
- I/O多重化
- 継続(コルーチン、強調スレッド)
イベント駆動型
- POE, AnyEvent
- 通常は上から下へ処理していく
- lwpを複数書いた場合、レスポンスが返ってこないと次のrequestを投げない
- AnyEvent::HTTPで書いておくと処理が終わる前に次の処理を実行する
- その場で結果がわからないので完了後の処理を登録しておく必要
- イベント駆動型
- イベント起動時に関数が実行される
- 非同期処理と密接な関係
- JavaScriptプログラマはイベント駆動型に親しみ深いから自分はなじみあった
I/O多重化
継続
継続の概要
- I/Oのread/writeを待って使えるようになったら使う
- 停止と再開を「継続」で実現
- I/O多重化と組み合わせることで容易に並列化が可能
WebアプリにおけるI/O waitとは?
- ディスクI/O
- HTTPで提供されているWeb API
- DB,memcachedとか
継続を利用した制御構造
- コルーチン
- returnで終わるのではなく、中断と再開が可能
- 強調スレッド
- 明示的にスレッド切り替え
Coroによる「賢い」スレッド
LDRでの実例
- バックエンド
- クローラ
- Q4M,AnyEvent,Coro
- 旧来は1プロセスでやってた
- フィードの取得、解析、DB書き込み
- 並列実行数だけプロセスを立ち上げる
- load avg 20-30
- クローラのリライト(2008-2009年)
- Q4M + Coroに書き換えた
リライトまでの流れ
Eventプログラムのtips。絶対条件。
- 決してブロックしない
- 重い処理は別プロセスに飛ばす
ベストプラクティス
- 非同期処理の前にタスクを分割
- メッセージキュー(またはジョブキュー)を使うとタスクが分割化できる
- Q4M
- メッセージキュー(またはジョブキュー)を使うとタスクが分割化できる
Q4M(2008年)
- Kazuho Oku作成
- MySQLのストレージエンジンとして実装されたメッセージキュー
- LDRでの使い方
- サーバ2台
- Queue::Q4M(Daisuke Maki作成)を使ってる
- Queue:Q4M::Distributed
- ワーカはFetch,Parse,Update
- フィードの取得、フィードの解析、DBへの書き込み
- 前回のShibuya.pmで話したのでその資料見て
Coroと非同期リクエスト化(2009年)
- Q4M化でパフォーマンスは向上
- スケーラビリティを考えて並列化
AnyEvnt + Coro
- Coroはとてもいい
- Coro使うなら相性のいいAnyEvent
- POEは書きにくい、パフォーマンスが悪い
- 作者のMarc Lehmann
- PODで他のモジュールをけなすことで有名
- でもコードは素晴らしい!
- PODで他のモジュールをけなすことで有名
Coroについて
- 継続の実装
- Coro::State
- Coro::*
- マルチスレッドモジュール
Coro::LWP
- LWPを全て非同期化してくれた
- ただタイムアウトが効かない
- AnyEvent->timerで起動時を覚えておくという方法をとった
パフォーマンス
- ほぼそのままなのにload avgは20->2へ
TODO
- DBIの非同期化
AnyEventの作法
- AnyEvent::Introがわかりやすい
- イベントに対してcallbackを登録
- Guardオブジェクト
- undef $cvでタイマーがとまる
- use Guard
- 掃除屋
- AnyEventでもCoroでもよく使う
- 理解が深まる
Coroの作法
- 並列化したい箇所をasyncで囲むだけ
Coro::LWP vs AnyEvent::HTTP
- スレッド切り替えのコストがない分AnyEvent::HTTPの方がいいはず
Coroの便利な所
- 既存のコードを移しやすい
Coro::Semaphore
- 「あるドメインに対して4つまでしか同時にリクエストしない」とかが書きやすい
- 4つあったらguardすればいい
- upし忘れることがない
- 4つあったらguardすればいい
- Guardオブジェクトは便利
- tips
- 多くのCoroスレッドを立ち上げておいてSemaphoreでガードするようにしている
Coro/AnyEventを使ったクローラ
- AnyEvent->timerを使って定期実行するタスクを登録
- Coro::Channnerlで巡回待ちのデータを受け渡し
- Coro::Semaphoreで同時リクエスト数を制限
話変わってイベント駆動型のwebAPI
WebHooks
- webの情報流通の加速化
- データが更新されたら通知
- イベント駆動型プログラミングをWebに適用したもの
- callbak関数->callback url
- 引数->リクエストパラメータ
PubSubHubbub
- 流れ
- ハブに購読したいフィードを送る
- フィードが更新される
- callback urlにフィードの差分をPOSTしてくれる
- 分散型のping
- webhook
WeblogUpdateとの対比
- pingで通知を受けるだけで、データの取得は相手のサーバにいかなくてはならなかった
- PubSubHubbubはHubがフィードの差分をPOSTしてくれる
- LDRの場合は更新通知のほとんどがspam
- Hubの場合は読者が居るかどうかを知っているので不必要な物は捨てる
なんでもwebhook
- どのようなデータが送られるかは規定されていない
- フィードを作ってPubSubhabbubに対応させるだけ
検索エンジンやフィードリーダーの宿命
- ユーザは更新されたらすぐ知りたい
- サービス側は頻繁なクロールに耐えられない
- アメブロのPVがクロールだけで月間65億とか
まとめ
- クロールじゃなくてイベント駆動型にした方がみんないい
話変わってストリーミングAPI
まとめ
- 異なる分野の概念を適用するのは大事
- JavaScriptのイベント駆動型やっておいてよかった
- 今後は人間の選択によって同期非同期がわけられるだろう
Perl? Which Perl? - Dan Kogai
Perl4
- 何でもあり
- "0xF00" == 3840
- (実際にllevalで動かしたのはphpで笑いを取ってた)
- 使わない方がいい
Perl5
Perl6
Perl5 or Perl6
- Perl6は配列やハッシュで全体を指す場合も要素を指す場合も変わらない
- my @arrayとした場合$array[0]はエラー
- リファレンスの場合Perl6は->の意味が違う
- .(ドット)に変更
- 中身が明らかな場合はドットも省略できる
- オブジェクト指向
- class, is, hasができた
- メンバーのvalidateあるかと思ったらなかった。x,y,zのpoint3Dクラスにwのメンバーやったら通った
- Anonymous Class
- classを変数に入れる
- MooseX::Declareで同じようなことができる。newがoverrideされてなくてnew_objectだけども
- Truly Anonymous Class
- 変数に入れずに().newでも実行できる
- class, is, hasができた
- Function Orientation
- perl6は(sub($x){$x*$x})(10)で動く
- perl5でもsub{$_[0]*$_[0]}->(10);は動く
- perl6は->$x{$x*$x}(10)でも動く
- for (1..10) ->$x{$x*$x}(10)
- {$^x * $^x}(10)も動く
- JavaScriptでいうarguments.calleeがまだない
- Pugsには既にある
- {[+] (1..$^n)}(10)で1から10まで足す
- perl6は(sub($x){$x*$x})(10)で動く
- Hyper Operator
- >>*<<
- >>.
- [1..9].map()と同じ意味
- Junction
- 真偽値
- 条件分岐値そのものがオブジェクト
Remedie: Building a desktop app using Perl, SQLite and jQuery - Tatsuhiko Miyagawa(id:miyagawa)
- デスクトップアプリを作りたい時に何を使って作るか
- VC++,VB
- 今からこんな言語勉強しようという人いないよね
- wxWidgets
- オープンソースで結構いい
- Objective-C,Cocoa
- macでしか動かないけど悪くない
- Adobe AIR
- Perl好きでJavaScript好きだからPerl使った
- Webアプリでいい
- VC++,VB
Remedieデモ
performance
- non-blocking
- multi-tasking
- libxml
- comet messageing
- iphoneでのリモコン操作
どうやって作ったか
問題点
- ちょっと実装汚いからPath::Dispatcherとか使った方がいいかも
- CSRF
- localhost:10010なので危険かも
- 特殊なヘッダ付けるようにして対応
- JSONRPCにしてもいいかも
Bonjour
- Auto Discovery
マルチタスク
- coro
- start_workersでワーカの数を指定
- asyncで無限ループ
- queue_channel
- キューに入れる役割
- work_channel
- キューに入ってくるのを待つ
- Coroなのでblockする訳ではなくて返って来たら実行
- start_workersでワーカの数を指定
- pubsub
- comet
- coro::channelでチャンネル番号たくさん作る
- comet
- see also:昨日発表があったstardust見てみて
- coroとか使ってる
SQLite
- DBどうするか
- MySQLやPostgreSQLはwebアプリだとベスト
- デスクトップだとファイル形式のSQLiteがいいかな
- Firefoxとかでも使われてるし
- SQLite
- バックアップ簡単
- DBスキーマ
- DBA考える必要ないかな
- Remedieは一つindex張ってあって、あとはJSON
- ほぼkey-value
- CouchDB,MongoDB,TokyoTyrantもあるけど、サーバが必要だからやらなかった
- ORM
- DBIx::Class
- Rose::DB::Object
- 使ってない物を使ってみたくて選んだ
- 何でも良かった
- デスクトップではメモリ大事
- ユーザの環境で動く物はメモリ食いたくない
- なのでメモリ食うRoseはやめるかも
- See Also:KiokuDB
デスクトップアプリを作る
- 結局クライアントサーバ式
- もっとアプリみたいにしたい
- SSB
- Fluid,Prism
- カスタマイズできる
- userscripts/userstyles
- サーバとしてのアプリ
- インストールしてもらえない
- パッケージするのが重要
- local::libで全部build
- also:githubのperl-app-builderで.app作る方法置いておいた
質問は?
- (質問が出ないので)質問力足りないね笑
KiokuDB - Yuval Kogman (nothingmuch)
- オブジェクトをハッシュのように保存できる
- listを取りだした時はlist->next->prevと参照できる。この場合は初めの要素
- (こっからあんまり聞いてなかった)
LT
hacking ngnix - id:yappo
- 色々考えた結果、zigorouコスプレしてきました。
- nginxのhackしたんだけど、http serverと別物になったので消しました
- 資料
Hoppyではじめよう リアルタイムweb - goo id:download_takeshi
- リアルタイム
- comet
- google wave,xmpp
- reverserHTTP + web hook
- pubsubhubbub
- Flash XML-Socket
- jsとの連携も超簡単
- クライアントの普及率もほぼ100%
- use Hoppy;すればいい
Pure Perl Open Fastladder あらため perl hacks on emacs - kayac Daisuke Murase(id:typester)
- vimの話はあったけど、今回emacsなかったので急遽変更
- id:IMAKADOさんのcperl-modがgithubにある
- perl-completionすごい
- useの補完とか
- podそのまま読めるとかソースも読めるとか
- anything-project
- そのディレクトリ配下のモジュール一覧見れたりする
args.pm - a brand new argument validator - id:tokuhirom
- Params::Validateの$argsはうざい
- MooseX::Declareはいいけど、ハックっぽい
- そこでargs.pm
- Perlっぽい
- わかりやすい
- 全然ハックっぽくない
- PadWalker::var_name使ったりしてるけど全然ハックっぽくないよ
CPAN realtime feed - id:miyagawa
IRC HTTP Stream
- miyagawanizeされた「それpla」
- それPlaの説明
- それPla脳
基調講演 - jrockway
なぜPerl
- もっと根本的にはなぜプログラムを?
- 実装のしやすさ、友好的なコミュニティの前に
- 何かを片付けたい
改善
- 依存モジュールを減らしたい
- アプリそのものを利用したくなる
- これがまた新しいモジュールのベースになる
コミュニティ
- サブコミュニティもある
- それぞれのプロジェクト
- 同じような考えの仲間が切磋琢磨できる
- コミュニティが活発なコードを見る
- ライブラリは作者が一番書きやすい形で書いてるから参考になる