今年も行ってきたので.敬称略.間違いは訂正します.
途中までしかまとまっていないがとりあえずup
(追記)別記事になっていたのでとりあえず修正
(追記)抜けていた部分を追加
Welcome - Daisuke Maki (id:lestrrat)
- id:lestrrat
- 今回の参加者数
- 登録: 539
- 確認: 459
- テーマ : 3つのC
- community
- corporate
- connect (communityとcorporateをつなげる)
Evolving Perl ~ Where Perl can go and how to get it there ~ (基調講演) - Richard Dice
- Richard Diceさんについて
- FLOSSの進化的開発モデル
- FLOSSの開発がsteady stateになる時
- 問題分野をやりつくした (ex. Text::Template)
- 興味が他に移った
- 次のステップに移るのにコストがかかる
- 問題分野をやりつくしたのか
- CPANの開発
- 必要性があるときに誰かが書く
- 例外: Adam Kennedy
- 必要性があるときに誰かが書く
- いつか解決するのと考えるのはよくない
- 最初に解決したのが勝つ
- 誰もが興味がないのか?
- 本当に?
- 興味があるひとと開発する人がmatchしない
- お金を使えば解決可能
- TPFで起こっていることについて
- minimal model
- 今のまますすめる
- ambitious model
- 能動的に進めていく
- minimal model
- booking.comの寄付
- ハーグ基金
- Perl6開発用
- SMOP (perl6 on c)
- Dispather
- traits intro
- Rakudo Perl and PCT improvement
- parrotはTPFから独立
Webエンジニアのためのmixiアプリ開発ガイド - 田中洋一郎
- アプリの紹介
- twitterっぽいの
- 農園を作るゲームっぽいもの
- トップアプリ
- 漢字テスト
- マイミクテトリス
- みん顔!
- バイラルの仕掛け
- invite: マイミクにアプリケーションへ招待する
- アクティビティフィード
- マイミクのホームに更新情報を表示することができる
- mixiアプリapi
- OpenSocialと独自APIで構成される
- OpenSocial
- orkut,linkedin,mixi,salesforceが実装
- 実際に複数のweb site間で使用可能かというとそうではない
- 独自のapi,サポート範囲が違うためうまくいかない
- OpenSocial API
- OpenSocial JavaScript API (pc)
-
- OpenSocial RESTful Protocol (mobile)
- 現在実装中
- mobileではjavascriptが動かないため
- OpenSocial RESTful Protocol (mobile)
- mixiアプリ (pc)
- xml+html+javascript+flash
- gadget,person&friends,activities,persistence,gadgets.io,invite,albums
- 開発者が用意するwebサーバにアプリを設置し,mixiにURLを登録する
- mixi app (mobile)
- mixi独自の特徴としてPC用のコードとmobile用のコードを1つのアプリとして書くことができる
- opensocial
- social data api
- /people, /activities, /appdata(persistence), JS(opensocial.*)
- gadget api
- /gedgets/makeRequest, JS(gadgets.*)
- gadget rendering
- /gadgets/ifr
- social data api
- apache shinding
- opensocialの実装
- 一からopensocialを実装するのは面倒なので
- GoogleがiGoogleのbackendをapacheに寄贈
- 一般的な構成ではopensocialの処理を全てapache shindingで行う
- mixiでは
- 運用開始したが8/24-8/31の間ダウン
- shindingがダウンしていた
- 504エラーが発生
- 外部との通信をcloseしていなかったので,ソケットの上限に達した
- APIのレスポンスの低下
- /social/data/*の応答が遅い
- shindingが復帰して一気にアクセスが増えた
- データ取得時にアクセス権チェックしているため負荷がかかる
- サーバの台数を追加して調整
- 最初は2倍の台数に,次は4倍にした
- それでもだめだった
- Devel::NYTProf(プロファイラ)を利用して問題となっている部分を解析した
- 改良により当初の台数で稼働可能
- キャッシュのヒット率の向上
- dbアクセスの削減
Plack/PSGI - tokuhirom/miyagawa
- id:tokuhirom/id:miyagawa
- PSGI is spec
- Plack is impl
- PSGI
- request/responseの仕様
- serialize request to hashref
- serialize response to arrayref
- request
- 動機
- response
[200, ['Content-Type' => 'text/html'], ['hello, world']]
- handler
my $app = sub { my $env = $_[0]; [200, ['Content-Type' => 'text/html'], ['hello, world']]; }
- HTTP::Engineについて
- HTTP::Engine::Interface:PSGI
- Plack::Adapter::HTTP::Engine
- PSGIだけ残してあとは消える.バグフィックスのみ
- 新しく作るならPSGIで
- デモ
Inline::x86 JIT Assembler - Yoshinori Takesako
- id:TAKESAKO
- moose or no mooseという話があった
- Inline::x86を使おう
XS書きのためのPerl MAGIC入門 - Goro Fuji (gfx)
- id:gfx
- perlgutsには自分を信用するなと書いているので,ソースコードを読むしかない
- magicとは
- perlguts says about magic variable
- tie変数などに利用される
- magic structure
- hook methods
- managed data
- いつ利用されるか
- $^H -> PL_hints
- $! -> error
- weak reference
- defer elements
- utf8 helper
- vec(lvalue),substr(lvalue)など
- Devel::Peek
- MAGICの調査に利用できる
- Data::Dumperでは表示されない
- CPAN上でMAGICを利用するモジュール
- B::Hooks::EndOfScope (hook)
- WeakRef::Auto (hook)
- Sub::Name (managed)
- Class::MOP (managed)
- XSを書くときはとmagicを意識しないといけない
- MAGICを扱うAPI
- SvIV,SvNV/SvPV -> GetMAGIC
- sv_setx_mg(ex. sv_setsv_mg) -> SetMAGIC
- sv_isobject
- MAGICを利用しないAPI
- SvIVX/SvOK
- sv_setx系でmgのつかないもの
- xsubppのデフォルトtypemapのいくつか
- char*,intなどは利用する
- HV*,AV*,CV*は利用しない
- Magic::ExampleやScalar::Utilが参考になる
- [ah]v_storeの戻り値
- tie,配列にstoreするとNULLを返す
- 解放しないといけない
- スタック
- xpushs()はreallocしない
- magic(tie),destructor
API Design - Shawn M Moore (Sartak)
- 5つのモジュールの良いAPI設計を紹介
- Moose
- Path::Dispatcher
- HTTP::Engine
- Dist::Zilla
- IM::Engine
- 良いAPIを設計するためにはテストを書け
- Moose
- has,trait -> オブジェクトになる
- MooseX
- sugar layer divided
- $class->meta->add_attribute(birthday => {...})
- Path::Dispatcher
- Sub::Exporterを使っていた
- Path::Dispatcher::Builder (Robert Krimen)
- on => sub { $builder->on(@_); }
- 拡張性しやすい
- HTTP::Engine
- Dist::Zilla
- plugin-based
- $_->munge_files for $self->plugins_with(-FileMunger)
- Request Tracker (RT)
- $m->callback(CallbackName => 'FormEnd', UserObj => $UserObj)
- これで長い間様々な拡張がされている
- Dist::Zilla
- 拡張性は重要
- 公開できなコードもある
- IM::Engine
- $self->plugin_colect(role => 'ExtendsObject::User', method => 'traits')
- Moose
- roleとtraitsは同じでは?
Modern Catalyst - Hideo Kimura
- http://www.slideshare.net/hidek/modern-catalyst
- http://blog.hide-k.net/
- Catalyst 5.8
- 2008/10/13 リリース
- deprecated
- controllerを拡張するときはActionClassやActionRoleを利用
- modelは小さく作る
Asynchronous programming with AnyEvent - Tatsuhiko Miyagawa (miyagawa)
- http://www.slideshare.net/miyagawa/asynchronous-programming-with-anyevent
- POE
- POE::Componet::*は250もある
- POEとIO::Syncは互換性がない
- AnyEvent
- わかりやすいインターフェース
- バックエンドは選べる
- timer
- IO
- AnyEvent::Handle
- socket
- AnyEvent::HTTP
- AnyEvent::Twitter::Stream
- AnyEvent::ReverseHTTP
- OOPよりも1つの関数のように使った方が良い
- 名前空間について
- あまり増えすぎるのもよくない
- AnyEvent::FooよりもFoo::AnyEventの方がよい場合もある
Learning from Ruby - Kang-min Liu (gugod)
- http://www.slideshare.net/gugod/learning-from-ruby-yapc-asia
- rubyisms.pm
- rubyっぽいコードを書けるようにするモジュール
- 一部しか真似することができない
- Class, self, super, yield
- rubyの良い所
- block syntax
- built in class
- Range
- autobox
- no semicolon
- Rubyism.pm
- 宣言的にクラスを定義できる
- cf. MooseX::Declare
- array,hash,stringをオブジェクトに
- cf. Class::Builtin
- 真偽値もオブジェクト
- cf. boolean.pm Acme::Boolean
- Hash::Lazy
- PerlX::MethodCallWithBlock
- 宣言的にクラスを定義できる
- DisasterTW.com
- railsで構築された
- 400k pv / day
- herokuを利用
- Perlではどうすれば?
Stardust, a Simple COMET Server - John Beppu
Solved In Perl 6 - Jonathan Worthington (jnthn)
say "Hello, World";
- 標準入力
- $.IN
- 範囲指定
- 1 <= $number <= 10って書ける
- reduction
- [+] @nums : 数値の和
- [<=] @nums : ソートされているかどうか
- qw(foo bar baz)のようなもの?
- perlメソッド
- Data::Dump(er)?の結果を返す
- iterator
for @cities -> $city { say $city.name }
-
- any,all,none
if any(@nums) >= 60 { # @numsのどれかが60以上ならば } if all(@nums) >= 60 { # @numsがすべて60以上ならば } if none(@nums) >= 60 { # @numsがどれも60以上でないならば }
- junction
if $x = 1|2|3 { # $xは1か2か3 ... }
- @drinks.pick ... 配列から要素をランダムに1つ取得する
- method signature
sub greet($name) { say "hello, " ~ $name }
- ?でオプショナルになり,$x=
でデフォルト値を設定, - @%などsigilを指定できる
- 型の指定
sub double(Num $n) { 2 * $n }
- multiple dispatch
multi sub fact($n) { $n * fact($n-1) } multi sub fact(0) { 1 }
- class
- attributes
class Product { has $.name; # attr and accessor has $!price; # attr only has $.discount is rw; # attr and accessor (can be lvalue) }
- mapっぽい
@products>>.name>>.say # say all products names
-
- 今後parallelにする
- .^ = Moose's meta
- multiple dispatch
class Stone {} class Paper {} class Scissor {} multi win(Paper, Stone) { "win" } multi win(Stone, Scissor) { "win" } multi win(Scissor, Paper) { "win" } multi win(::T, T) { "draw" } multi win(Any, Any) { "lose" }
『Ficia』インフラとPerlにまつわるエトセトラ - ひろせまさあき(hirose31)
- http://www.slideshare.net/hirose31/ficiaperl-1981415
- http://d.hatena.ne.jp/hirose31/20090911/1252638203
- id:hirose31
- forkはcopy on write
- サーバ起動時は共有率がほぼ100%
- 子プロセスが後でロードするため共有率が下がる
- 起動時に先にロードしておくには
- PerlPostConfigRequire startup.pl
- モジュールの一覧はPerlResponseHandler Apache2::Statusで
- 太ったプロセスの例
- slurp
- File::Find ... 再帰のため?
- サイズを測るにはApache2::Status + B::TerseSize
- {Start, {Max,Min}Spare}Servers, MaxClientは同じ数にしている
- 最初からforkの負荷が大きいので最初から作っておく
- でも,メモリの使用量が
- アプリサーバのメモリがアプリで消費されるのは当然では
- swapしたら負け
- nagiosで監視して,swapしたらメール
- MaxRequestPerChildは少なめ
- Tips
- PerlSwitchesはsymlinkを見つけることができない
- ErrorLogをVHごとに出したい場合
- いろいろ出力方法によって手法が異なっていた
- init.d/httpd
- stop時にリクエストがくる場合がある
- ファイルが作成しているかどうかでロードバランサの対象から追加/削除する
How Danga::Socket handles asynchronous processing and how to write asynchronous Perlbal plugins - Gosuke Miyashita (mizzy)
ちょっとよくわからなかった
- http://www.slideshare.net/mizzy/how-dangasocket-handles-asynchronous-processing-and-how-to-write-asynchronous-perlbal-plugins
- http://www.slideshare.net/mizzy/dangasocketperlbal
- id:mizzy
- 子だくさん
- Dr. pepperの人
- Danga::Socket
- Perlbal (as reverse proxy)
- Client -> TCPListener -> ClientProxy -> BackEnd -> Client
- Plugin (sync)
- Client -> TCPListener -> ClientProxy -> Plugin -> ClientProxy -> BackEnd -> Client
- Plugin実行中はClientのリクエストがブロックされる
- Plugin (async)
- Net::Drizzle
- return 1にする
- perlbalの修正
- 問題
- 非同期のPluginは最後に実行しなければならない
- 2つ以上はだめ
- 非同期のPluginは最後に実行しなければならない
Lightening Talks
Moose Hacking Guide
PerlでSalesforce
- id:sfujiwara
- salesforce.com
- APIの種類
- (何種類かあったがSOAP以外忘れた)
- 楽そうなAPIだと共有SSLしか使えなくて,某セキュリティ専門科に叩かれそう
- Perlモジュール
- WWW::Salesforce以外はメンテされていない
- アクセス方法はkvsっぽい
- ただし,クエリ言語はSQL-likeなSOQL
- 問題
- APIの制限 5000/user/day
- ユーザを増やすのはお金がかかる
- そもそも遅くて200ms/reqぐらい
- cacheすてrequestを少なくするとか
- サーバがアメリカなのでつながらないこともある
- job queueを使った方が良いかも
- 月に1度数時間のメンテナンスがある
- APIの制限 5000/user/day
Webアプリケーションフレームワーク Mojoの紹介 - perlcodesample
Test::TCP - tokuhirom
通知マニアのためのim.kayac.com - typester
- id:typester
- http://im.kayac.com/
- HTTP POST -> IM
- http2jabberを利用
- iphone pushに対応した
miyagawanize - yuusukebe
- みんなmiyagawaさんのようになりたい
- しかしそれはできない
- なぜならpurple thingを持っていないから
- miyagawanize
- 顔画像にpurple thingをくっつける
- open cv + Imager + Image::ObjectDetect
- デモ
- dankogaiさん -> 成功
- lesttratさん -> 成功
- obama
- can we miyagawanize him?
- yes we can -> 成功
- モーニング娘。 -> 1人失敗
- can we miyagawanize him?
- Larry Wall -> 成功
Server::Starter - a superdaemon to hot-deploy server programs - Kazuho Oku
- http://developer.cybozu.co.jp/kazuho/2009/09/writing-hot-dep.html
- http://www.slideshare.net/kazuho/server-starter-a-superdaemon-to-hotdeploy-server-programs
- hot-deploy
- ダウンタイムなしでupgrade
- 3つの要件
- ダウンタイムなし
- リソースリークしない
- fail safe
- いろいろなhot-deploy方法があるが,この3つの要件を全て持つものはない
- server::starter
- スーパーデーモンを立てる
- 新しいバージョンで子プロセス起動
- しばらく待つ
- 問題なければ古いのを止める
- Plack,Net::Serverに対応
- daemontoolsと組み合わせるのがよい
- TODO
- fastcgi対応
- init.d startup対応
nothingmuch
- nothingmuch
- 例外処理について
- eval {...} if ($@) {...}では不十分
- 様々な問題に対処しようとするとコードが汚くなる
- Tiny::Tryを利用するときれいに書ける
- Perl6ならばtry...catch...when?