てきとうなメモ

本の感想とか技術メモとか

YAPC::Asia 2009 1日目

今年も行ってきたので.敬称略.間違いは訂正します.

途中までしかまとまっていないがとりあえずup

(追記)別記事になっていたのでとりあえず修正
(追記)抜けていた部分を追加

Welcome - Daisuke Maki (id:lestrrat)

Evolving Perl ~ Where Perl can go and how to get it there ~ (基調講演) - Richard Dice

  • Richard Diceさんについて
  • FLOSSの進化的開発モデル
  • FLOSSの開発がsteady stateになる時
    • 問題分野をやりつくした (ex. Text::Template)
    • 興味が他に移った
    • 次のステップに移るのにコストがかかる
  • 問題分野をやりつくしたのか
    • netscape2は?
    • 変化があったのに加われないことは良くない
    • soap/wsdl and perl
  • CPANの開発
    • 必要性があるときに誰かが書く
      • 例外: Adam Kennedy
  • いつか解決するのと考えるのはよくない
    • 最初に解決したのが勝つ
  • 誰もが興味がないのか?
    • 本当に?
    • 興味があるひとと開発する人がmatchしない
    • お金を使えば解決可能
  • オープンソースプロジェクトと団体
  • Perl & TPF
    • 直接的な収益モデルがない
    • 直接サポートする企業がない
  • 他の団体の例
  • 例:mozilla
    • TPFに参加するという話もあった
    • 100人のメンバーで,半分がプログラマー
    • 年80万ドルの収益 口座には50万ドル
      • ほとんどGoogleからのもの出資
    • Googleによって息を吹き返した
  • 汎用のプロトコル上に質のよいソフトウェアを作ることで市場を開拓する
  • 例:eclipse
    • VisualAge Studio for Java (IBM)
    • 会員権を売って稼いでいる
    • 6万ドルの収益
    • 15の従業員
  • Perlの企業に対しての売り込み
    • ibm/intelにとってマルチコアプログラミングは重要 -> Perl6は得意である
  • microsoft
    • CLI上のPerl6で協力している
  • TPFで起こっていることについて
    • minimal model
      • 今のまますすめる
    • ambitious model
      • 能動的に進めていく
  • booking.comの寄付
  • ハーグ基金
    • Perl6開発用
    • SMOP (perl6 on c)
    • Dispather
    • traits intro
    • Rakudo Perl and PCT improvement
  • parrotはTPFから独立
  • future perl
  • enterprise perl (p5/p6)
    • 2002年にp5ee(企業向けPerl5)の構想があったが盛り上がらなかったらしい
    • perl + cpanC# + .netjava + j2eeに相当するのではないかと気付かなかった
  • ベンダーのサポート
    • Perlはglue languageである
    • しかし問題があって,開発にタイムラグが発生するのはよくない
    • LSB3.2はperl5.8.8をサポート
  • フィードバックについて
    • コードアーティスト - 開発者 - パートナー - 企業 - 起業家 - 教育者
  • javaは企業でインストールされているが,オープンソースでも質の高いものを開発している
  • perlはまだ企業には浸透していない

Webエンジニアのためのmixiアプリ開発ガイド - 田中洋一郎

  • アプリの紹介
    • twitterっぽいの
    • 農園を作るゲームっぽいもの
  • トップアプリ
  • バイラルの仕掛け
    • invite: マイミクにアプリケーションへ招待する
    • アクティビティフィード
      • マイミクのホームに更新情報を表示することができる
  • mixiアプリ (pc)
    • xml+html+javascript+flash
    • gadget,person&friends,activities,persistence,gadgets.io,invite,albums
    • 開発者が用意するwebサーバにアプリを設置し,mixiにURLを登録する
  • mixi app (mobile)
    • gadget,person&friends,activities,persistence,albums
    • html+flash+RESTful API
    • mixiがproxyになる
  • mixi独自の特徴としてPC用のコードとmobile用のコードを1つのアプリとして書くことができる
  • opensocial
    • social data api
      • /people, /activities, /appdata(persistence), JS(opensocial.*)
    • gadget api
      • /gedgets/makeRequest, JS(gadgets.*)
    • gadget rendering
      • /gadgets/ifr
  • 運用開始したが8/24-8/31の間ダウン
    • shindingがダウンしていた
    • 504エラーが発生
    • 外部との通信をcloseしていなかったので,ソケットの上限に達した
  • APIのレスポンスの低下
    • /social/data/*の応答が遅い
    • shindingが復帰して一気にアクセスが増えた
    • データ取得時にアクセス権チェックしているため負荷がかかる
    • サーバの台数を追加して調整
    • 最初は2倍の台数に,次は4倍にした
    • それでもだめだった
    • Devel::NYTProf(プロファイラ)を利用して問題となっている部分を解析した
    • 改良により当初の台数で稼働可能
      • キャッシュのヒット率の向上
      • dbアクセスの削減
  • 負荷に耐えられないmixiアプリが続出
  • 安定なmixi appには?
    • person & friends api
      • 一度にたくさんデータを取得せずにstartIndex + countを指定する
        • count=1000なんて,もってのほか
    • ライブラリの利用することで気付かずに富豪的プログラミングになってしまう
    • activity + mediaitem
      • 画像へのアクセスは開発者のサーバに行くため画像をたくさん表示するアプリは負荷が高くなる
    • backend serverはしっかりしたものにしよう
  • 負荷テストについて
    • shinding(java)の負荷テストはしっかりやった
    • Perlで書いたAPIの部分はマイミク数の想定を間違えた
      • 平均マイミク数は25人なのでその前提で行った.
      • しかし,アプリ利用者の平均マイミク数は50人だった

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
    • $env: PATH_INFOなど
    • 独自変数
      • psgi.input: input handle
      • psgi.version
      • psgi.url_scheme
      • psgi.multithreaded アプリ側にマルチスレッドかどうか知るため
  • 動機
    • frameworkごとにcgi/mod_perl/fastcgi対応しないといけない
    • WSGI(Python), rack(ruby)にあたるもの
    • これらを参考にしているが,Perlにはiterator/generator/callable objectはないのでその部分は低レベルなコードで
  • response
[200, ['Content-Type' => 'text/html'], ['hello, world']]
  • handler
my $app = sub {
  my $env = $_[0];
  [200, ['Content-Type' => 'text/html'], ['hello, world']];
}
  • Plack
    • reference implementation
    • useful library
    • plackup command
    • request class/response class
    • apache/fastcgiはまだ実装していない
  • todo
    • impl::modperl
    • impl::fcgi
    • plack::request interface
  • デモ
  • PSGIに対応するとCatalystのテストコードでテストすることができる
  • CGI.pmはPSGIをサポートしても良いと言っている
    • JiftyもCGI.pmを利用
  • 質問
    • Http::Engineのコードは今後とも動くのか?
      • メンテは行うので,動かなくなることhないはず
    • performanceはどうか
    • 仕様はRFCにする?
      • RFCとは種類が違うが,CPANにアップする.perl.orgに置くかもしれない
      • Perl6のコアモジュールにしてほしい
  • catalyst::engineはcatalyst::engine::psgiに統一すべきでは?
    • 古いアプリが動かなくなるので難しい.

Inline::x86 JIT Assembler - Yoshinori Takesako

  • id:TAKESAKO
  • moose or no mooseという話があった
    • じゃあ,mouseを使うか?
    • OOをやめる?
    • Perlをやめる?
    • xs, c/c++を使う?
  • Inline::x86を使おう
  • x86の歴史
  • ms-dos 16bit
    • みんなCOM書いてたよね
      • .comバブル
  • 32bit windows
    • バイナリのサイズがでかい
      • ヘッダをいろいろ削ると数KBのバイナリが97Bに
  • Perlを使う
  • セキュリティ問題
  • アセンブリをを実行時に書き換える
    • nopのみ -> segmentation fault
    • retに書き換え -> 終了
    • $SIG{TRAP}で書き換える + PERL_SIGNALS=unsafe
    • UD2 + $SIG{ILL}でwindowsでも

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
  • xs code template
    • closure in xs
    • Class::XSAccessor
    • Moose (future version)
  • 動的なコード生成の比較
    • eval vs closure vs XS template vs Inline::X86
      • Inline::x86が最速だが,メンテナンス性が低すぎる
      • XS templateはそこそこメンテナンスができてパフォーマンスも良い

API Design - Shawn M Moore (Sartak)

  • 5つのモジュールの良いAPI設計を紹介
  • 良い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

  • deprecated
    • Catalyst::[MVC]::
      • 1文字はdeprecated
    • NEXT
      • mro::compatを利用する.
    • mk_accessor
    • plugin
      • Catalyst::Pluginに入れるとむちゃくちゃ怒る人がいる
  • controllerを拡張するときはActionClassやActionRoleを利用
  • modelは小さく作る
  • テスト
    • Catalyst::Test
    • Test::WWW::Mechanize
      • Catalyst::Testでは不十分な所をテスト
      • WWW::Mechanizeを利用してテストを行う

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

  • Stardust
    • commetサーバ
    • 以下のモジュールを利用
      • AnyEvent
      • Coro::Event
      • Continuity
  • api
    • JSON over HTTP
    • POST /channel/ でメッセージを送る
    • GET /channel//stream でlong poll
  • デモ
    • IEでは動かない

Solved In Perl 6 - Jonathan Worthington (jnthn)

  • jnthn
  • 以下のものはrakudoで動くらしい
  • Hello, World
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)

  • 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時にリクエストがくる場合がある
    • ファイルが作成しているかどうかでロードバランサの対象から追加/削除する
  • MATRIX
    • 各サーバマシンが何を行っているかを管理する
  • archetypeとcomplexを記述
  • MATRIXをマスタとして,各アプリケーションの設定ファイルに反映させる

How Danga::Socket handles asynchronous processing and how to write asynchronous Perlbal plugins - Gosuke Miyashita (mizzy)

ちょっとよくわからなかった

  • id:mizzy
  • Danga::Socket
    • kqueue(bsd),epoll(linux),poll(posix)の中から利用可能なものを選んで実行する
  • 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つ以上はだめ

Lightening Talks

Moose Hacking Guide
PerlSalesforce
  • id:sfujiwara
  • salesforce.com
  • APIの種類
    • (何種類かあったがSOAP以外忘れた)
  • 楽そうなAPIだと共有SSLしか使えなくて,某セキュリティ専門科に叩かれそう
    • 専用SSLを利用するならSOAP APIを利用する
  • Perlモジュール
    • WWW::Salesforce以外はメンテされていない
  • アクセス方法はkvsっぽい
  • ただし,クエリ言語はSQL-likeなSOQL
  • 問題
    • APIの制限 5000/user/day
      • ユーザを増やすのはお金がかかる
    • そもそも遅くて200ms/reqぐらい
    • cacheすてrequestを少なくするとか
    • サーバがアメリカなのでつながらないこともある
      • job queueを使った方が良いかも
      • 月に1度数時間のメンテナンスがある
Webアプリケーションフレームワーク Mojoの紹介 - perlcodesample
Test::TCP - tokuhirom
  • TCPサーバのtesting
  • tcpサーバをforkする
    • テストの順序がバラバラ
  • Test::TCP
    • 親子で情報を共有しているため意図した順序に実行される
  • empty_port
    • 空いているポートを見つけて返す
    • ポート番号固定だとそのポートが利用されていたときに失敗するため
通知マニアのためのim.kayac.com - typester
miyagawanize - yuusukebe
  • みんなmiyagawaさんのようになりたい
  • しかしそれはできない
  • なぜならpurple thingを持っていないから
  • miyagawanize
    • 顔画像にpurple thingをくっつける
    • open cv + Imager + Image::ObjectDetect
  • デモ
nginxやlighttpdMogileFSしてみた - kamipo
  • id:kamipo
  • MogileFS
    • 分散ファイルストレージ
    • trackerがクライアントにURLを返し,クライアントはそのURLにアクセスする
  • 通常の構成ではPerlbalがクライアントにアクセスする
    • しかし利用しているのはwebdavなのでnginxやlighttpdでもいいのでは
  • デモ
    • nginx -> キャッシュされない
    • lighttpd -> 失敗する
Server::Starter - a superdaemon to hot-deploy server programs - Kazuho Oku
nothingmuch
  • nothingmuch
  • 例外処理について
  • eval {...} if ($@) {...}では不十分
  • 様々な問題に対処しようとするとコードが汚くなる
  • Tiny::Tryを利用するときれいに書ける
  • Perl6ならばtry...catch...when?