YAPC::Asia2009 09/11のメモ

  • 2日目のメモ。だいぶ抜けてる感じがするけどせっかくなので。
  • 全体通して面白かったなぁ。全然技術的な話題が抑えられてないんだなぁと感じてワクワクしてしまった。全部聞けないのがもったいなさすぎる。
  • 以下ざっくり感想。
    • twitter見てたらJosé Castro (cog) - How regular expressions work internallyの発表とかが面白そうだった
      • アニメで見れる正規表現みたいなこと書いてあった。わかりやすそう。面白そう。どんなんだったんだろ。
    • malaさんの発表が超詰め込まれてて面白かった。けども理解追いつかなくて途中わからなかったけども。
    • perl6の話は前にもどこかで聞いたけどやっぱり気持ち悪いなぁ。perl知る前は$,@,%が全然意味わからなかったけど、やりだしてからは$,@,%のscalaer,array,hashってのにとても感心して使い出したキッカケになったのに。
    • 最後の基調講演の「みんながいるから。みんなが助けてくれるから。Perl大好き」の締めは良かった。何か胸が熱くなるな。新しい(ryみたいな感じだった。良かった。

FormValidator::LazyWay で検証ルールをまとめよう - id:vkgtaro

  • ギリギリまでvkgtaroさんが来なく「まだ来てない!電話番号知らない?」的な会話が飛んでた
FormValidator::LazyWayができるまで
  • id:tomyheroさんが元の作者
  • 元々Data::FormValidatorのユーザだった
    • Catalyst::Plugin::FormValidator::Lazyを作った
      • 遅延のLazyではなく怠けられるのLazy
  • lazy peopleでData::FormValidateEmを作り始める
    • Lazyだと遅延に間違えられるのでLazyWayにrename
    • 仕事で使い始めたのでtomyheroさんに許可を得てCPANにアップした
その他のFormValidator
  • FormValidator::Simple
    • 日本で人気
  • FormValidator::Lite
  • FormValidator::Nested
    • LazyWayを参考にしたモジュール
FV::LazyWayの特徴
  • フォームごとでなく、フィールド名ごとにルールを設定して使い回す
    • 例:emailフィールド
      • 登録、ログイン、編集などemailを使うページがたくさんあるがvalidationルールは一緒
  • required/option(必須とオプション)
    • 登録ページでは必須なフィールド、検索時では必須ではない
  • エラーメッセージ
    • 検証結果に対するメッセージも自動で設定
    • 独自のメッセージを付加することもできる
  • ただのハッシュも検証できる
設定ファイルの説明
  • level
    • 同じフィールド名で異なるルールを指定したい場合
      • looseを指定すると携帯メールだけ違うvalidationとかもできる
  • フィールド名を正規表現でマッチ
    • たとえば*_id$なフィールド名を全部同じvalidateでチェックする
  • 項目をマージして検証
    • 複数の項目をつなげた上で検証
      • 年、月、日を合わせてvalidateしたいとき
  • filter,rule,fixの流れ
    • filter:整える→rule:validate→fix:出力
    • 「ハイフンっぽい文字列をハイフンにして、正しい日付かチェックして、DateTimeオブジェクトとして取得」ということができる
その他
  • 独自ルールモジュールの読み込み
    • 「+OreOre::Rule」
  • 同一フィールドに対して複数の値が入った場合は配列として取得
  • PODが日本語
    • 英語のPODあったけど紛失した
  • 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を使ってる場合に両方書けるか書けないか
      • レスポンスが悪い場合がある
両方問題点がある
  • クエリが複雑
  • ノード単位でのコンシステンシーが必要
  • 動的なスケール
  • これらの解決方法は?
Inclineで解決
  • 以下の問題点を解決する
    • 複雑な書き込みクエリ
    • 非正規化テーブルのメンテナンス
  • SQL発行時に自動的にキューで送って更新してくれる
    • アプリ開発者が複雑なSQLを考えなくていい
Incline詳細
  • ノードの更新は同期で行う
    • id:123のtweetテーブルは同期で更新
  • 複数ノード間の更新は非同期で行う
    • id:123のfollowersのテーブル(複数ノードに分かれているもの)は非同期で更新
  • C++で書いてある
  • 転送中にあるノードが落ちても再接続して同期を取ってくれる
  • アプリケーションプログラマはshardにデータを書いて行くだけでいい
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について
  • adobeRTMPプロトコル使ったサーバ
  • 機能
    • RPC
      • メソッド呼び出し。XML
    • Shared Object
      • 複数のクライアントでflashオブジェクトを共有している
    • Media streming
    • Record streming
  • WebServices
カヤック内では?
adobeが出している公式のサーバ以外もある
  • wowza
    • adobeの開発者が作った
    • XML書くだけ
  • red5
  • rubyizumi
  • 他にもgooglecodeでRTMPで検索するとたくさん出てくる
kamaitachi
  • perlのものがないからperlのものを作った
  • perlだと嬉しいこと
    • 他のperlアプリケーションが使い回せる
      • ORMとか
    • 自分がやってない言語でやると危険
      • 「red5が動いた!」って喜んでそのまま出すと、デフォルトのままでは任意の人が使えてしまう機能があって実は怖い
  • サポート機能
    • RTMP only (not RTMPE/RTMPT)
    • RPC
      • XMLRPCのようなリモートプロシジャ
    • shard objectには対応していない
      • 積極的にはやらないつもり
使い方
  • use Moose;
  • extends 'Kamaitachi::Service'して、with 'Kamaitachi::Service::AutoConnect'
    • クライアントにコネクトできたことを伝える為にconnectを書かないといけないのでwithでそれを自動的にやってる
    • そのあとはKamaitachi->new
    • register_serviceの中で名前をつけて何個もサーバ立ち上げられる
      • 「rpc」とか名前をつけるとURL上で/rpcになるのでおんなじように別の名前のもののを何個も作れば色んなpathで動かせる
  • サンプルがCPANのディレクトリに入ってる
RTMPのtips
  • red5などのソースを見る
    • 結構参考になる
  • 自分のパケットに危ないのがないかを確認する為にSniffer::RTMPを使う
  • adobeRTMPを読むためにライセンス登録するのはやめた方がいい
    • fuking LICENSE
その他
  • 開発はgithubでやってる
  • #kamaitachi @ irc.freenode.net
  • ShardObjectいらないと思ってるけど、flush使いの人から要望が多いからサポートしようかなぁ
  • Danga::SocketをAnyEventにしようかどうしようか
  • id:lestrratlibavcodecが作ってくれるライブラリに期待

perl hacks on vim - Lin You-An(c9s) pause id:CORNELIUS

  • 台湾からきた
  • vimでの先頭の方の間違いをすると移動に時間かかる
    • Fを押して、hを押せば、カーソルより前のhに飛ぶ(カーソルがある行)
      • fならカーソルより後の検索
  • ~でカーソル上の文字の大文字<->小文字変換
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
  • map
    • :nmap(normal mode)
    • :vmap(visual mode)
    • :imap(insert mode)
    • :smap(select mode)
    • :xmap(visual, select mode)
  • nmap :!perl -Wc %
    • 文法チェック
  • imap ほにゃららでtimestampをinsert
  • :h map.txtでヘルプが見れる
text object
  • 自動補完
folds
  • syntax fold
    • :set foldmethod=syntax
  • mark fold
    • :set foldmethod=marker
  • indent
  • manual
  • z何とかでfoldできる
  • :h foldingでヘルプが見れる
Quickfix
  • :grep [pattern] [filepath]
    • 別窓が開いて結果が出る
    • :set grepprg=/path/to/grep
Helpful Settings
  • PerlTidy
    • :set equalprg=perltidy
  • SQL::Beautify
  • HTML::Entities
    • HTMLのエンティティ変換
plugin
  • perlprove.vimとかとか
  • vimのページから
vimana

大規模画像配信を支えるPerl - Masahiro Nagano(kazeburo)

  • WEB+DBのvol.50の内容
画像配信システムの概要
  • mixiのコンテンツ
    • 数が少ない。1,000ファイルくらい
    • 大量のリクエスト
    • rsyncで数台のwebサーバに同期
    • DNS PR or L4 LB
  • ユーザコンテンツ
    • プロフィール画像、コミュニティ画像
    • 日記、アルバム、コミュニティの掲示板
    • 数が多い
      • プロフィール画像3,300万
      • 写真10億
    • アクセス多い
      • 3億PVとかある
システム(アップロード)
  • アプリケーションサーバsmtpサーバ
  • mod_perlサーバ
    • 変換、縮小
    • テンポラリ置き場
    • ストレージに転送
      • どのストレージの組に送ったかをDBサーバ(マッピングDB)に書き込み
  • ストレージサーバ
    • 必ず2台1組
      • 置けない場合は違う組へ
システム(表示)
  • リクエストをLBが受ける
    • squid cacheが2台いる
  • その下にapacheのLB
    • どの画像がどこにいるのかをマッピングDBで参照しながらストレージサーバから取ってくる
MogileFSと比較
  • メリット
    • 実装を理解している
    • ストレージ障害時の復旧が明確
      • 2個1組なので片方落ちてもすぐわかる
  • デメリット
    • JPEG only
    • サーバ復旧などが手作業で面倒
    • 2台以上への冗長性がない
モバイル画像配信
  • モバイルが伸びている
  • 特徴
    • 画像について
      • ファイルサイズ、画面サイズが小さい
      • 転送、コピーライトフラグ
    • 配信方法
      • 動的生成。画像が多いのでキャッシュが効かないため
システム
  • PCのリバースプロキシとは別にApacheのLBがいる
  • その下にmod_perl
  • その下にさらにapacheのLB
mod_perlで画像操作するけど、どんなものがあるか選定
  • CPAN
    • Image::Magic
    • GD
    • Imager
    • Epeg
    • などなど
  • !CPAN
速度比較
  • 条件
    • 640x480->260x192
    • JPEGの圧縮率80%
    • 平等にするためにjpegのコメントは初めから消して比較
  • 結果
    • EpegがImage::Magicに比べて5倍くらい
  • Epegは速いんだけど、サムネイル画質くらいにしか使えない
  • Image::Magicがキレイ
  • Imlib2を採用した
    • Pros
      • 速度
      • 画質良し
    • Cros
      • 開発止まってそう
おまけ:JPEGの判断
  • Image::JpegCheck
  • Image::Size
    • Image::Magick呼び出されてしまうかもなので速くない
画像を取ってくる
  • WWW::CurlとLWP
    • ヘッダとか考えないならWWW::Curlが速い
質問
  • 認証はどうしてる?
    • ハッシュと有効期限が付いていて、見えなくなるようにしている
      • パフォーマンスを考えて。

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でブロックする。コレがないとプログラムが終わっちゃう
MySQLの場合
  • libmysqlclientがnon_blocking I/Oをサポートしてない
    • すごいがんばってハックすればできるかも
    • でも、がんばらなくてもlibdrizzle使えばできる
  • drizzleプロジェクトって上手くいってるの?
    • libdrizzleは本体のプロジェクトとは隔離されて開発されてる
    • 開発者が言うにはlibmysqlclientよりも速い
  • CPAN
    • Net::Drizzle
      • 自分が書いたxsで一番長い
      • libdrizzleのAPIは全部ラップしたのでlibdrizzleでできることは全てできる
      • 1カラムだけバッファとかもできる
      • DBIの上で動かない
    • DBD::drizzle
      • DBIの上で動くけど並列アクセスをサポートしてない
  • Net::DrizzleとCoroで非同期アクセスできる
    • DBD::Drizzleに移植したかったけどPlackやってて間に合わなかった
質問
  • SQLiteの場合は?
    • DBD::SQLiteが非同期に対応してない
    • 本家が非同期パッチ出してるけど、まだDBD::SQLiteの作者は取り入れるつもりはないらしい

Asynchronous Programming for (A)synchronous Communication - ma la (id:mala)

  • 非同期処理を駆使したWebアプリケーションについて
LDR
  • フロントエンドについてはだいぶやった
    • JSON Api & Async HTTP Request(Ajax
  • じゃあバックエンドは?非同期処理はどうやってる?
    • use AnyEvetn; use Coro;
バックエンドの非同期処理
  • 非同期処理は必要?
    • YAPC::Asia 2007
      • Gearman, TheShwartz→その後ブームになった
    • YAPC::Asia 2009
      • AnyEvent, Coro
    • 我々は必要としている
    • 非同期処理は難しい?
      • 簡単にできれば意識せずに使われるはず
非同期処理をおおざっぱに言うと
  • ジョブサーバを用いたタスクの後回し
  • ネットワークプログラミングでの非同期処理を使った並列化
注目する概念は?
  • 大きく3つ
    • イベント駆動型
    • I/O多重化
    • 継続(コルーチン、強調スレッド)
イベント駆動型
  • POE, AnyEvent
  • 通常は上から下へ処理していく
    • lwpを複数書いた場合、レスポンスが返ってこないと次のrequestを投げない
  • AnyEvent::HTTPで書いておくと処理が終わる前に次の処理を実行する
    • その場で結果がわからないので完了後の処理を登録しておく必要
  • イベント駆動型
    • イベント起動時に関数が実行される
    • 非同期処理と密接な関係
  • JavaScriptプログラマはイベント駆動型に親しみ深いから自分はなじみあった
I/O多重化
  • 高速なサーバを書こうとしたら必ず通る道
  • Danga::Socket,AnyEvent
  • 複数のファイルディスクリプタを開いておく
    • 読み込み可能/書き込み可能になったものから処理
  • linuxではepollをつかう
  • シングルスレッド + I/O多重化
    • Danga::Socket
    • シングルスレッドでも全然問題ない。処理のネックはiowaitなのでそこを並列化すればCPU性能の限界まで処理できる
継続
  • Coroutine
  • 継続を使うと何がいいか?
  • Wikipedia見るとすごい長々書いてある
    • 要約すると、「継続では買い物カゴを作るのが楽になる」
    • はい。そうですね。状態の維持、セッションとしての意味で語られることが多かったです。
      • でも、「セッッションを使うとバグがでやすい」とかそういう話はもう必要としてない
      • 継続にはもっと使い道がある
継続の概要
  • I/Oのread/writeを待って使えるようになったら使う
    • 停止と再開を「継続」で実現
    • I/O多重化と組み合わせることで容易に並列化が可能
WebアプリにおけるI/O waitとは?
  • ディスクI/O
  • HTTPで提供されているWeb API
  • DB,memcachedとか
継続を利用した制御構造
  • コルーチン
    • returnで終わるのではなく、中断と再開が可能
  • 強調スレッド
    • 明示的にスレッド切り替え
Coroによる「賢い」スレッド
  • I/O待ちのタイミングでライブラリがスレッドを切り替える
    • use Coro::Select;
    • 開発者が切り替えを意識しなくていい
  • その前にスレッドってperlのスレッドと同じ?
    • Perlのithreadとは別
      • Perlのスレッドはダメダメ
      • コストがでかくて使い物にならない
LDRでの実例
  • バックエンド
  • クローラ
    • Q4M,AnyEvent,Coro
    • 旧来は1プロセスでやってた
      • フィードの取得、解析、DB書き込み
      • 並列実行数だけプロセスを立ち上げる
      • load avg 20-30
  • クローラのリライト(2008-2009年)
    • Q4M + Coroに書き換えた
リライトまでの流れ
  • 非同期の試み(2006年)
    • Xango(Gungho)とか試した
    • それまでlaod avg 20-30だったCPUアベレージが下がったけど、パフォーマンスまで下がった
    • HTTPは非同期化できたが、その後の処理が非同期化できなくて結果的に「のろま」
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で他のモジュールをけなすことで有名
      • でもコードは素晴らしい!
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し忘れることがない
  • 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
  • MMQというのを作った
    • AnyEventで書かれた自作のイベントメッセージキュー
  • 条件が動的
    • 複雑な状況にも対応
  • Livedoorでどうやるか
  • そこで解決策
    • ReverseProxy + HTTP
    • FastCGI
    • Cometd + Bayeux
  • lightttpd+FastCGI+AnyEvent+Q4Mのデモがブログにある
まとめ
  • 異なる分野の概念を適用するのは大事
    • JavaScriptのイベント駆動型やっておいてよかった
  • 今後は人間の選択によって同期非同期がわけられるだろう

Perl? Which Perl? - Dan Kogai

Perl4
  • 何でもあり
  • "0xF00" == 3840
    • (実際にllevalで動かしたのはphpで笑いを取ってた)
  • 使わない方がいい
Perl5
  • Perl5.6.x
    • まだメンテ中
    • まともなunicodeがない。Encodeもない。Jcodeはある
  • Perl5.8.x
    • unicodeサポート
    • industory "Default"
    • Mooseが動く
    • use featureが動かない
      • sayとか
  • Perl5.10.x
    • say
    • $bool //= 0;
      • $boolがundefの時だけ実行
    • regexpが速い
    • Linux ditorsが採用し始めた
Perl6
  • Pugs
    • 機能が多い
      • Rakudoよりも多い
    • ビルドが大変
  • Rakudo
    • 機能が少ない
    • ビルドは楽
    • perl Configure.pl --gen-parrotでmake && make install
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でも実行できる
  • 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)も動く
      • $^にアルファベット順に入る
      • {$^z;$^y;$^x}('I','love','perl')は$^xにI,$^yにlove,$^zにperlが入る
    • JavaScriptでいうarguments.calleeがまだない
      • Pugsには既にある
    • {[+] (1..$^n)}(10)で1から10まで足す
  • Hyper Operator
    • >>*<<
    • >>.
      • [1..9].map()と同じ意味
  • Junction
    • 真偽値
    • 条件分岐値そのものがオブジェクト

Remedie: Building a desktop app using Perl, SQLite and jQuery - Tatsuhiko Miyagawa(id:miyagawa)

webアプリ
  • iPhoneも昔はwebアプリだった
  • HTML5でストレージも使える
    • まだ先のこと
  • 今はどんな時代だろう?
    • micro Web app = 2009
Remedieデモ
  • LDRスタイルでキーバインドで動く
  • twitterのフォローしてる人の発言した動画リストとかも出る
    • 再生とかもキーボードで制御できる
  • ニコニコ動画はサイト行かなくても見れる
    • 裏技使ってる
      • 教えてくれたのは中の人だったけど
  • 最近上下を逆にする機能をつけた
  • インクリメンタル検索
  • non blockingにしたので、全チャンネル読み込み中にも次のことができる
  • iPhoneでも使える
    • iphoneで再生するかiphoneをリモコンにして再生とかもできる
performance
  • non-blocking
  • multi-tasking
  • libxml
  • comet messageing
    • iphoneでのリモコン操作
どうやって作ったか
  • HTTP::Engine
  • AnyEvent
    • Server::Simpleだったけど、シングルだったので書き換えた
  • Ajaxのためのbackend
    • JSONをRESTでGETしたり
      • pathが/rpcだったらRESTにした。rpcだけどRESTっていうつっこみ
問題点
  • ちょっと実装汚いからPath::Dispatcherとか使った方がいいかも
  • CSRF
    • localhost:10010なので危険かも
    • 特殊なヘッダ付けるようにして対応
    • JSONRPCにしてもいいかも
Bonjour
  • Auto Discovery
マルチタスク
  • coro
    • start_workersでワーカの数を指定
      • asyncで無限ループ
    • queue_channel
      • キューに入れる役割
    • work_channel
      • キューに入ってくるのを待つ
      • Coroなのでblockする訳ではなくて返って来たら実行
  • pubsub
    • comet
      • coro::channelでチャンネル番号たくさん作る
  • see also:昨日発表があったstardust見てみて
    • coroとか使ってる
SQLite
  • DBどうするか
    • MySQLPostgreSQLはwebアプリだとベスト
    • デスクトップだとファイル形式のSQLiteがいいかな
      • Firefoxとかでも使われてるし
  • SQLite
    • バックアップ簡単
  • DBスキーマ
    • DBA考える必要ないかな
    • Remedieは一つindex張ってあって、あとはJSON
    • ほぼkey-value
      • CouchDB,MongoDB,TokyoTyrantもあるけど、サーバが必要だからやらなかった
  • ORM
    • DBIx::Class
    • Rose::DB::Object
      • 使ってない物を使ってみたくて選んだ
      • 何でも良かった
    • デスクトップではメモリ大事
      • ユーザの環境で動く物はメモリ食いたくない
      • なのでメモリ食うRoseはやめるかも
    • See Also:KiokuDB
jQuery
  • jQuery.flydom使ってる
    • createAppendとかで要素作りやすい
  • jQuery.hotkeys
  • jQuery.contentmenu
    • 右クリックメニュー
  • jQUery.corners
    • 右上の新着出す奴とか
  • $.event.triggerでイベント駆動,$(document).bind
    • cometと一緒に動かすとやりやすい
    • サーバからのデータをクライアントでeval
      • デスクトップだからこの辺のセキュリティはまぁ気にしなくていい
  • jQuery.UI
    • blockUI
    • scrollTo
    • jqrowl
デスクトップアプリを作る
  • 結局クライアントサーバ式
    • もっとアプリみたいにしたい
    • SSB
    • Fluid,Prism
    • カスタマイズできる
      • userscripts/userstyles
  • サーバとしてのアプリ
    • インストールしてもらえない
    • パッケージするのが重要
      • local::libで全部build
  • also:githubのperl-app-builderで.app作る方法置いておいた
質問は?
  • (質問が出ないので)質問力足りないね笑

KiokuDB - Yuval Kogman (nothingmuch)

  • オブジェクトをハッシュのように保存できる
  • listを取りだした時はlist->next->prevと参照できる。この場合は初めの要素
  • (こっからあんまり聞いてなかった)

LT

Top Tens Of 2008-2009 - Kenichi Ishigaki
  • CPAN
    • 一番CPAN Authorsが多いのは日本
hacking ngnix - id:yappo
Mojo / Mojolicious hookout - KDDI web communication - id:ka2u
  • mojo + web hook
  • デモ
  • Gtk2::NotifyでUbuntuでnotifyしてくれる
Hoppyではじめよう リアルタイムweb - goo id:download_takeshi
  • リアルタイム
  • 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
  • もっと根本的にはなぜプログラムを?
  • 実装のしやすさ、友好的なコミュニティの前に
  • 何かを片付けたい
だからPerl
  • Perlにはライブラリがある
  • CPANの誕生
    • みんなCPANの恩恵を受けている
OOP
  • OOをみんな手作業で書くようになり、
    • Class::Accessorの誕生
    • そしてMooseの誕生
  • 新しいものが生まれたけど、新しいコードだけでなく、古いコードも動くのがPerl
改善
  • 依存モジュールを減らしたい
    • アプリそのものを利用したくなる
    • これがまた新しいモジュールのベースになる
コミュニティ
  • サブコミュニティもある
    • それぞれのプロジェクト
    • 同じような考えの仲間が切磋琢磨できる
  • コミュニティが活発なコードを見る
    • ライブラリは作者が一番書きやすい形で書いてるから参考になる
将来はどんなアイディアが生まれるだろう
何でPerlかって?
  • みんながいるから。みんなが助けてくれるから。
  • ありがとう!Perl大好き!