いよいよ最終日です。
今日も、gihyo.jpさんの特集の方と両方に書きます。
今日は、質問をするとDNAボールペンがもらえる(i.e.賄賂)らしいです!!
José Castroさん「How regular expressions work internally」
- "Hello World" =~ /World/ の例
- 1文字ずつ、判定箇所を左にずらしていく
- "Hello World" =~ /Words/
- Worまでマッチするが、だめ
- その後も、orld、rld、... と判定する
- "abaabbaaabbb" =~ /aa+b+/
- 最長マッチしようとする。バックトラッキングする。
- "aabb" =~ /a+?b+/;
- +? は、最短マッチ
- abb にマッチしないのが重要
- "it's 42" =~ /(.*\d+)/
- "it's 4"が.*にマッチする
- "it's 42" =~ /(.*)(\d+)/ とすると、ほとんどが.*に食われる
- "it's 42" =~ /(.*?)(\d+)/ とするといい
- "aaaaaaaa" =~ /a+a+a+a+a+a+b/
- バックトラックしまくる例
- 6,27seconds
- 質疑応答
- Q. $をつけると、速くなるのではないか
- A. 条件が複雑になるだけなので、速くならないでしょう
その後質疑応答が続いたのですが、全然聞き取れませんでした。実務でこのようなパフォーマンスの問題あるの? 電話番号のマッチであった、みたいなやりとりだった気がします。
Jonathan Worthingtonさん「The Way To Rakudo *」
- Perl6とは?
- Rakudo
- Perl6実装、ターゲットはParrot
- アプリやモジュールが少ない ← 開発版だと、使ってくれる人が少ない
- 2010年第2四半期にメジャーリリースする
- Perl6の機能の大半を実装
- 現在実装されているもの
- TODO
- 対応しないもの
- 速度改善: 仕様を満たすのが優先
- 並行性のサポートは、後日
- 他、compact structures, user defined array indexing, PDL など
- 未対応になる理由
- リソース不足
- フィードバックを得てから
- Rakudo *は、利用者を増やし、フィードバックを得るプロセスとなる
- 参加者募集中。spec test suite はwww.perl6.orgにある。
Kenichi Ishigakiさん「Practical Bug Reporting / もしもバグを見つけたら」
このセッションに関しては、gihyo.jpさんで参加レポートを書かせていただきました。gihyo.jpさんの特集記事も合わせてご利用下さい。
- CPANの品質保証
- バグを見つけたら
- 見ざる、言わざる、聞かざる・・・はNG
- パッチもだめ
- ほう・れん・そう すること
- テストレポートの送り方
- 注意
- 全ての人がテストをおくるわけでない
- テストのカバレッジは100%じゃない
- テストの失敗を気にしない作者も居る
- インストール後に依存性が変わって壊れることもある
- perldoc perlbugを事前に読む
- レポートは英語で書くのが大変?
- サブジェクトは重視
- 後はコードで書いたり、翻訳ツールでなんとかなる
- バグトラック
- RTレポートする
- 複数のバグレポートを混ぜないこと
- 混ざってるとリジェクトされる
- 急いでるとき
- ベストなのは、コミッタになること
- 許容されやすい
- 作者の探し方
- 作者が完全に行方不明でメンテも止まってたら、自前のモジュールを作る
- バグレポートをblogに書いたら、fixされたら必ず直す
- miyagawaさんに怒られる
- 質疑応答
- Q. バグレポートをリジェクトしたいとき、傷つけずに断るには?
- A. 歴の長いdankogaiさんの方が詳しいでしょう
- A. 仕様に由来するバグは、大変
- Q. 1つのバグの分け方は? 例えば、複数箇所で同じミスの場合は?
- A. 1つのレポートでいいでしょう。ただ、ついでにpod修正とかついでにあのバグとか、混ぜると困る
Kazutake Hiramatsuさん「OpenGL Programming with Perl」
このセッションに関しては、gihyo.jpさんで参加レポートを書かせていただきました。gihyo.jpさんの特集記事も合わせてご利用下さい。
質問したので、DNAボールペンをゲットしました!!
(以下はメモ書きになります。翌日までにブラッシュアップします)。
- perlで3Dプログラミングはできる? → 当然できる
- perlで3Dグラフィックスの処理が出来るモジュールなんてある?
- CPANに、POGL
- OSはMac OS X Leopard
- POGLの最新版はLeopardデフォルトのOpenGLでは動かない
- POGLの古い0.56なら動く
- GLUTとは?
- OpenGLのラップしたライブラリ。UI系
- glutDisplayFunc(sub {}); に、描画処理
- glClearColorで塗りつぶし処理
- プリミティブ: 点、線分、三角形
- ビューポート指定
- glViewPort
- 各Matrixの解説 (モデリング, プロジェクション)
- 座標は右手系
- モデリング変換
- モデル側の変換
- 平行移動、回転
- プロジェクション
- 投影の方法
- gluPerspectiveの紹介
- テクスチャマッピング
- オブジェクトに画像のはりつけ
- OpenGL::Image (gifとかもImageMagickと連携して利用可能)
- オブジェクトの頂点と画像の頂点の対応を指定
- まとめ
- POGLを使うと、3Dプログラムが簡単になる
- デモ: 画像の表示など
- 質疑応答:
- Q. キー入力等はできる?
- A. できる。GLUTを使う。キーイベント、マウスイベント。
- Q. ゲーム的なもので、判定はできる?
- A. 3Dの判定なので、難しくなる
- Q. 動的なものを作ったときのパフォーマンスは?
- A. インストール時のパフォーマンステストを見て欲しい。
- Q. カバーフローのデモは、どのようにやっているのか
- A. 1枚の画像を、平行移動、回転させている
Tokuhiro Matsunoさん「Concurrent DB Access with Perl」
このセッションに関しては、gihyo.jpさんで参加レポートを書かせていただきました。gihyo.jpさんの特集記事も合わせてご利用下さい。
- 重いクエリを複数投げる
- 直列して投げると、レスポンスが悪化
- 並列すればよい
- Pgにおいて、AnyEventによる並列処理
- socketをO_NONBLOCKで投げる。readableになるのを待つ
- use DBD::Pg ':async'; use AE; によって利用
- prepare時に、pg_async => PG_ASYNC する
- pg_ready になるまで、待つ。
- readyになったら、pg_result。undefする
- recvをして、sendが全て終わるのを待つ
- デモ: 実際にPgへクエリを複数流す例。
- MySQLの場合
- libmysqlclient は non-blocking I/Oに対応してない
- libdrizzle は対応している → 作者によるとlibmysqlclientより早いと言う噂
- Net::Drizzle
- tokuhiromさん作。1664行のxs
- バッファリングの指定までできる
- DBI上で動かない
- DBD::drizzle
- non-blocking I/O には未対応
- デモ: Coro + Net::Drizzle による非同期クエリ
- ユーザ情報、ブログ情報を同時にとりたければ、非同期クエリでレスポンスが改善できる
- DBD::drizzleへ移植し、動くようにしたい
- 質疑応答
Chia-liang Kaoさん「"Lego programming" with Lorzy」
英語だったので、聞き取れたとこだけ。
makoto kuwataさん「Basic Mechanism of Object-Oriented Programming Language」
このセッションに関しては、gihyo.jpさんで参加レポートを書かせていただきました。gihyo.jpさんの特集記事も合わせてご利用下さい。
- OOPLの概要
- インスタンスオブジェクト
- クラスオブジェクト
- 親クラスへのポインタ
- メソッドテーブル
- 関数ポインタ
- ラインタイムがメソッドを探す
- 見つからないと、ランタイムエラーとなる
- インスタンスオブジェクト
- 通常は構造体かハッシュテーブルで表現
- is-a pointer : クラスオブジェクト(what I am?)
- クラスオブジェクト
- 親クラスへのポインタ
- メソッドテーブルへのポインタ
- インスタンス変数はインスタンスオブジェクトに、メソッドはクラスオブジェクトに属する
- メソッド検索テーブル
- シグネチャと、関数ポインタ
- メソッド関数
- インスタンスオブジェクトが、隠し引数として渡される
- メソッドと関数の違い
- インスタンスオブジェクトが、第一引数として渡ってくる
- メソッドは動的、関数は静的か
- メソッドシグネチャ
- メソッドオーバロード
- シグネチャでメソッドテーブルを検索するだけ
- メソッドオーバライド
- 親クラスのメソッドテーブルにエントリがあるってだけ
- オーバロードとオーバライドは違うので注意
- superキーワード
- メソッドの探索を親から始める
- Polymorphism
- 格納する変数の型ではなく、格納されている型による
- 呼び出しは、実際の型ではなく指定した型のシグネチャ
- Objectクラス と Classクラス
- a instance is-a Foo
- Foo is-a Class
- Object is-a Class
- Class is-a Class
- これが典型的なモデルでしょう
- Rubyのソースコードの例
- klass: is-a, *iv_tbl: インスタンス変数, *m_tbl:メソッド探索テーブル, super: 親ポインタ
- Perlの場合
- Python
- 最初の引数が見えている
- 関数をメソッドとしている (Rubyと逆)
- Java
- 親クラスの関数ポインタも、メソッドテーブルにコピーされる
- パフォーマンスのため
- 親クラスの関数ポインタも、メソッドテーブルにコピーされる
- JavaScript
- プロトタイプなので違うが、メカニズムは似ている
Naoya Itoさん「はてなブックマークのシステムについて」
このセッションに関しては、gihyo.jpさんで参加レポートを書かせていただきました。gihyo.jpさんの特集記事も合わせてご利用下さい。
- 2005年2月β版、2008年11月リニューアル
- 規模
- 開発体制: 8名(エンジニア6、デザイナ2)
- 構成
- 本文の抽出方法
- 検索やカテゴライズの精度に大きく影響するため、重要
- HTML::ExtractContent (学生さんが作ったもの。CPANにあり)
- HTML::LayeredExtractor
- 全文検索機能
- Sedue
- 圧縮Suffix Arrays (転置インデックスより高度)
- ブックマークしてから数分で検索可能(TheSchwartz)
- マイブックマーク全文検索
- 全てPerlで実装
- ユーザ毎に転置インデックス
- 【id:r_kurain(倉井龍太郎さん)が実装】←重要
- 転置インデックス
- 転置インデックスの保存
- スコアリングの手法
- 検索エンジンは、WEB API(JSON-RPC)でアクセス可能(一般にも公開)
- スペルミス修正・・・に関しては、昔やったので省略
- 関連エントリ機能
- カテゴライズ
- BDog (C++で実装)
- ベイジアンフィルタ(Complement Naive Bayes) を利用
- 基準値を逆転させて利用
- (アニメ・ゲームに)偏りがあるときに、Naive Bayesよりよい
- 動的に学習できる
- TheSchwartzにより、各処理を非同期化
- Web+DBシステムの一歩外(検索、レコメンド、Firefox拡張)
- 楽しい
- エンドユーザーに新しい体験を提供
- パフォーマンスの話は、時間がないので全部省略
- ハイパフォーマンスWebサイトの方法とかを真面目にやってるそう
- WEB+DB PRESS Vol.49 にも出てるので参照
- まとめ
- RDBMSでは難しい(面倒な)問題の解決が、今後のテーマ
- 質疑応答
- Q. はてな毎日重いんですがなんとかなりませんか。
- A. 頑張ります。
Yuji Suzukiさん「お手軽・お気軽・お気楽な サーバー&クライアント」
- POEIKC
- POE::Component::IKC
- デーモンの起動と、クライアントのコマンド
- poeikcd start : サーバ側
- poikc GetHoge::getpid : クライアント側
- poikc -I /... でPATHを追加
- poikc LWP::Simple::get とかも可能
- 普通のPOEのSessionと組み合わせて使う
- プラグインの仕組み
- poikcd -Mオプションと--startupオプション
- 読み込み、spawnする
- 例: QueueとHTTPClient、monitorの組み合わせ
- poeikcd -d : デバグ、 -f : フォアグラウンド、
- poeikcd -U : 特殊コマンド
- まとめ
- サーバの土台があるので、サーバの機能の実装に集中できる
Yoshinori TAKESAKOさん「all your base32 are belong to us」
- 色んな言語でHello!
- クイズ: yapc.com コードは何で動く?
- Polyglotプログラミング
- Symbolicプログラミング
- 使うのは記号32文字のみ(スペース、タブ、改行は使わない)
- メリット
- インデント、変数の命名に悩む必要ない
- キーボードの記号の部分も使える!!
- やり方: JS
- /* */ でごっそり捨てる
- - は 0や ~ は -1、-~[]は 1
- (![] + '') で、 "false" という文字列が作れる
- ( {} + '') から '[object Object]'。他、'undefined'とか利用
- (0)["constructor"]["constructor"] でFunctionオブジェクトがとれる
- やり方: Perl
- #以下は捨てる
- 正規表現は、 =~ '(?{})' とも書ける
- \r をひいて、記号からbase32形式を作れる
- やり型: Ruby
- やり型: com
- 8086 自己書き換え
- 使えるオペレーションが限られている
- 帰って来たppencode 2009
- 質疑応答
- Q. 何がtakesakoさんを動かしていくのか?
- A. セキュリティの部分から。記号化していると、F/Wなどのチェック機能も抜けられる
ライトニングトーク
このセッションに関しては、gihyo.jpさんで参加レポートを書かせていただきました。gihyo.jpさんの特集記事も合わせてご利用下さい。
Kazuhiro Osawaさん「hacking ngnix」
Kazuhiro Shibuyaさん「Mojo / Mojolicious hookout」
Takeshi Mikiさん「Hoppyではじめよう リアルタイムweb」
- 今日は虎のお面を脱いで来た
- リアルタイムweb : Comet, Google Wave, XMPP, ReverseHTTP, PubSu....
- Flash XMLSocket
- Flashは普及率も高い
- Hoppy
- PerlのXMLSocket 実装
- POEで拡張できる
- Service(クライアントからのメソッド呼び出し) - Hoppy - Hook(PUSH的な内容(Timerなど利用))
- rooゴーン!!(時間切れ)
Daisuke Muraseさん「perl hacks on emacs」
- デモが多いので、マイクのスペシャリストに依頼
- emacsのTips
- subのインデントがオカシイ問題のパッチ → imakadoさん
- 新しい文法対応のパッチ → jrockwayさん
- perl-completion.el
- コマンド補完
- メニューからソースを開いたり
- anything.el
- プロジェクトの中のファイルだけ探せる。絞り込みも
Tokuhiro Matsunoさん「args.pm - a brand new argument validator 」
- Params::ValidateのTargs{name}が嫌
- MooseX::Declare? ハック過ぎる
- args.pm
- PadWalker::var_name() : スタック一つ上の名前を見てる
- これはハックとは言えないので安心!
Tatsuhiko Miyagawaさん「CPAN realtime feed」
- モジュールをアップロードすると
- 5s + 30s + 20s + 1hour + 1〜24hour + CPAN.pm(24hour)
- アップロードしてから行き渡るまで、48時間かかる
- App::CPAN::Fresh
- friendfeedを利用
- cpanf コマンドで、最新のものをすぐインストールできる
- デモ
- shipitしたものがすぐとれるか!
- 無事成功
Jonathan Rockwayさん「Why I Stick With Perl?」
ーShellはglue
- Perlだと相互通信、コード、アルゴリズムが簡単
- UNIXのいいとこどり
- ライブラリの登場
- CPANの誕生
- 新しいことをすれば、他の人も新しいことができるようになる
- みなが恩恵を受けている
- 過去の知識の利用、大きなアプリの開発
- コミュニティ同士の助け合い
- 古いアイデアをリニューアル
- コミュニティがPerlを改善し続ける
- 新しいライブラリを書くのがどんどん簡単に
- 新しいアイデアが新しいモジュールのベース
- 依存モジュールを減少
- "アプリ"の再利用
- Catalyst, Moose, POE, HTTP::Engine
- Perlの開発グループ → 切磋琢磨、知り合いかは関係ない
- グループへの参加方法
- MooseX::* とか、みんなの役に立つ
- コミュニティがサポートしているコードを使うのは正しい
- ライブラリはすぐれたのはず
- Mooseの型制約 → 型のテスト
- MooseX::Types
- MooseX::Attributes
- ライブラリにより、悪いコード寄りいいコードを簡単に書けるようになる
- 今後の展望
- 例: HTTP::Engine
- フレームワークにたよらず、ライブラリに頼る
- プログラミングがしたい