YAPC::Asia 2011 tomita

  • 1,224 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
1,224
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
0
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. CONFIDENTIALCPANモジュールガイド 2011/4月発売! YAPC::Asia 2011
  • 2. アジェンダ• About cpanbook• About me• 本でとりあげた、あまり知られていないTips• 没モジュールあれこれ• なぜこのモジュールに決めたのか(比較検討)• 今ならこれも追加で取り上げたいもの 2
  • 3. 「CPANモジュールガイド」• 最大公約数的無難なモジュールを• 日本語で解説• 初心者→中級者• “⽂字列”(unicode)の扱いを全体で網羅• 変数のスコープ、循環参照、シャローコ ピーなどのperl tipsの解説も含んでます• 2,730円 3
  • 4. • あとで希望者に本プレゼントしますー• ワークスコーポレーション から出た本ですけど オライリーコーナーでも 売ってもらえるらしいす! 4
  • 5. アジェンダ• About cpanbook• About me• 本でとりあげた、あまり知られていないTips• 没モジュールあれこれ• なぜこのモジュールに決めたのか(比較検討)• 今ならこれも追加で取り上げたいもの 5
  • 6. About me• Naoki Tomita• tomi)ru• @tomita 6
  • 7. http://ika.koneta.org/ 7
  • 8. http://www.910ryu.com/ 8
  • 9. パンデミック対策チーム協議会 10
  • 10. 2011/8)• 株式会社ECナビ 11
  • 11. 2011/10)• 株式会社VOYAGE GROUP(社名変更) 12
  • 12. perl書いてます• 自分で書いた本を自分で超読んでるのが 恥ずかしいです/// 13
  • 13. 「Sunrise」エンジニアインターン• 学生向け• 申込み受付中• 11/19から土日4日間• テーマ:大規模サービスの設計• VOYAGEGROUPエンジニアが講師に• 待遇: 1人10万円支給• http://voyagegroup.com/internship/sunrise/ 14
  • 14. • 興味もたれた方はみつけて話しかけてくだ さいね 15
  • 15. ここから本題!• 本ではとりあげていないけど• オススメモジュール紹介コーナー • フレームワークなど • (最近 での仕事で使っているやつで、 本にないものの紹介) 16
  • 16. 1my $config = { lwp => { agent => YAPC::Asia 2011, timeout => 10, },};use LWP::UserAgent;my $ua = LWP::UserAgent)>new(%{ $config)>{lwp} }); 17
  • 17. use strict;my $config = { };my %lwpconf = %{ $config)>{lwp} };Cant use an undefined value as a HASH reference• strict 以下で rvalueの場合 (autovivificationされないので)my $ua = LWP::UserAgent)>new(%{ $config)>{lwp} || {} }); 18
  • 18. 1 Ref::Listuse Ref::List;my $ua = LWP::UserAgent)>new(list $config)>{lwp});for my $item (@{ $config)>{list} || [] }) {}for my $item (list $config)>{list}) {} 19
  • 19. 2use Plack::Test;use Plack::Util;use HTTP::Request::Common;my $app = Plack::Util::load_psgi(app.psgi);test_psgi($app, sub { my $cb = shift; my $res; $res = $cb)>(GET /search?q=aaa); is($res)>decoded_content, aaa, get);}); 20
  • 20. 2 Test::WWW::Mechanize::PSGIuse Test::More;use Test::WWW::Mechanize::PSGI;my $agent = Test::WWW::Mechanize::PSGI)>new( app => do app.psgi, # psgi code)ref);$agent)>get(/fooooo);is($agent)>status, 404);$agent)>get_ok(/);$agent)>content_like(qr/aaa/); 21
  • 21. • Test::WWW::Mechanize::PSGI • isa Test::WWW::Mechanize • isa WWW::Mechanize • Isa LWP::UserAgent• Plack::Test::Agent 22
  • 22. 4use DBI;my $dbh = DBI)>connect( ... );my[ $rows = $dbh)>selectall_arrayref( SELECT * FROM users WHERE class = ?‘, { id => 1, name => AAA, class => 1)A }, { Slice => name => BBB, class => 1)A }, id => 2, {} },]; 1)A’);$dbh)>do("INSERT INTO users (?,?)", {}, 3, CCC, 1)A); 25
  • 23. 4 DBIx::Simpleuse DBIx::Simple;my $db = DBIx::Simple)>connect( ... );$db)>insert(users => { id => 3, name => ‘CCC‘, class => 1)A,});$db)>query(INSERT INTO users (?,?), 3, CCC); 26
  • 24. use DBIx::Simple;use SQL::Maker;my $db = DBIx::Simple)>connect( ... );$db)>abstract = SQL::Maker)>new( driver => $db)>dbh)>{Driver}{Name});my $res = $db)>select (users => [*], { class => 1)A}, { order_by => [id], limit => 5,}); 27
  • 25. my $user = $db)>select(users => [*], { id => 1 }))>hash;# => { id => 1, name => "AAA" }use MyApp::Model::User;my $user = $db)>select(users => [*], { id => 1 }) )>object(MyApp::Model::User);# => MyApp::Model::User)>new( id => 1, name => "AAA", ); 28
  • 26. use DBIx::Connector;my $conn = DBIx::Connector)>new(..., { RaiseError => 1, mysql_enable_utf8 => 1,});$conn)>run(fixup => sub { my $dbh = shift; # isa DBI::db my $dbs = DBIx::Simple)>connect($dbh); # めんどい}); 29
  • 27. use DBI;my $dbh = DBI)>new(..., { RootClass => DBIx::Simple::Inject, RaiseError => 1,});$dbh)>do( ... );$dbh)>selectall_arrayref( ... );$dbh)>select( ... );$dbh)>query( ... ); 30
  • 28. 10• 飽きて手放さない開発者陣• ディスパッチャー• 設定ファイルよみこみ• セッション• クッキー 「部品」はモジュールで• ログ たくさんそろっているが・・・• プラグイン機構・フック機構• ⼊⼒・出⼒オブジェクト• ⼊⼒・出⼒のデコード/エンコード• テンプレートドライバー• psgiアプリの出⼒ 31
  • 29. use Dancer;get /hello/:name => sub { debug config)>{appname}; return "Why, hello there " . param(name);};start; 32
  • 30. package MyApp;use Catalyst qw/ Plugin::Foo Plugin::Bar/;package MyApp::Controller::Foo;sub foo : Path("boo") { my ($self, $c) = @_;} 33
  • 31. package MyApp;use Web::Simple;sub dispatch_request { sub (GET /foo) { my ($self) = @_; [ 200, [ Content)type => text/plain ],[ Hello! ] ] },} 34
  • 32. use Mojolicious::Lite;get /:foo => sub { my $self = shift; my $foo = $self)>param(foo); $self)>render(text => "Hello");};app)>start; 35
  • 33. Danceruse Dancer;get /hello/:name => sub { debug config)>{appname}; return "Why, hello there " . param(name);};start;use List::AllUtils qw/first any shuffle/; 36
  • 34. use Plack::Builder;use MyApp;my $app = MyApp)>new(appdir => .);builder { $app)>psgi_app;}; 37
  • 35. # config.ymlrouting: ) path: / class: MyApp::Web::Root ) path: /user/* class: MyApp::Web::User 38
  • 36. package MyApp;use Dancer qw/:syntax config /;use Class::Load;sub new { my ($class, %args) = @_; Dancer::set($_ => $args{$_}) for keys %args; Dancer::Config)>load; bless { }, $class;} 39
  • 37. sub psgi_app { my ($self) = @_; for my $map (@{ $self)>config)>{routing} }) { my $class = Class::Load::load_class($map)>{class}); Dancer::any([get, post], $map)>{path} => sub { my $controller = $class)>new(app => $self); my $method = lc Dancer::request())>method; $controller)>$method(); }); } return Dancer)>start; # psgi app} 40
  • 38. • Dancer qw/:syntax なんか/ もしくは Dancer::なんか• コードが追いやすい(Dancer.pm• D::P::以下はへんなのもある• hook充実