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

YAPC::Asia 2011 tomita

1,343

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,343
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

YAPC::Asia 2011 tomita

  1. 1. CONFIDENTIALCPANモジュールガイド 2011/4月発売! YAPC::Asia 2011
  2. 2. アジェンダ• About cpanbook• About me• 本でとりあげた、あまり知られていないTips• 没モジュールあれこれ• なぜこのモジュールに決めたのか(比較検討)• 今ならこれも追加で取り上げたいもの 2
  3. 3. 「CPANモジュールガイド」• 最大公約数的無難なモジュールを• 日本語で解説• 初心者→中級者• “⽂字列”(unicode)の扱いを全体で網羅• 変数のスコープ、循環参照、シャローコ ピーなどのperl tipsの解説も含んでます• 2,730円 3
  4. 4. • あとで希望者に本プレゼントしますー• ワークスコーポレーション から出た本ですけど オライリーコーナーでも 売ってもらえるらしいす! 4
  5. 5. アジェンダ• About cpanbook• About me• 本でとりあげた、あまり知られていないTips• 没モジュールあれこれ• なぜこのモジュールに決めたのか(比較検討)• 今ならこれも追加で取り上げたいもの 5
  6. 6. About me• Naoki Tomita• tomi)ru• @tomita 6
  7. 7. http://ika.koneta.org/ 7
  8. 8. http://www.910ryu.com/ 8
  9. 9. パンデミック対策チーム協議会 10
  10. 10. 2011/8)• 株式会社ECナビ 11
  11. 11. 2011/10)• 株式会社VOYAGE GROUP(社名変更) 12
  12. 12. perl書いてます• 自分で書いた本を自分で超読んでるのが 恥ずかしいです/// 13
  13. 13. 「Sunrise」エンジニアインターン• 学生向け• 申込み受付中• 11/19から土日4日間• テーマ:大規模サービスの設計• VOYAGEGROUPエンジニアが講師に• 待遇: 1人10万円支給• http://voyagegroup.com/internship/sunrise/ 14
  14. 14. • 興味もたれた方はみつけて話しかけてくだ さいね 15
  15. 15. ここから本題!• 本ではとりあげていないけど• オススメモジュール紹介コーナー • フレームワークなど • (最近 での仕事で使っているやつで、 本にないものの紹介) 16
  16. 16. 1my $config = { lwp => { agent => YAPC::Asia 2011, timeout => 10, },};use LWP::UserAgent;my $ua = LWP::UserAgent)>new(%{ $config)>{lwp} }); 17
  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. 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. 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. 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. 21. • Test::WWW::Mechanize::PSGI • isa Test::WWW::Mechanize • isa WWW::Mechanize • Isa LWP::UserAgent• Plack::Test::Agent 22
  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. 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. 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. 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. 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. 27. use DBI;my $dbh = DBI)>new(..., { RootClass => DBIx::Simple::Inject, RaiseError => 1,});$dbh)>do( ... );$dbh)>selectall_arrayref( ... );$dbh)>select( ... );$dbh)>query( ... ); 30
  28. 28. 10• 飽きて手放さない開発者陣• ディスパッチャー• 設定ファイルよみこみ• セッション• クッキー 「部品」はモジュールで• ログ たくさんそろっているが・・・• プラグイン機構・フック機構• ⼊⼒・出⼒オブジェクト• ⼊⼒・出⼒のデコード/エンコード• テンプレートドライバー• psgiアプリの出⼒ 31
  29. 29. use Dancer;get /hello/:name => sub { debug config)>{appname}; return "Why, hello there " . param(name);};start; 32
  30. 30. package MyApp;use Catalyst qw/ Plugin::Foo Plugin::Bar/;package MyApp::Controller::Foo;sub foo : Path("boo") { my ($self, $c) = @_;} 33
  31. 31. package MyApp;use Web::Simple;sub dispatch_request { sub (GET /foo) { my ($self) = @_; [ 200, [ Content)type => text/plain ],[ Hello! ] ] },} 34
  32. 32. use Mojolicious::Lite;get /:foo => sub { my $self = shift; my $foo = $self)>param(foo); $self)>render(text => "Hello");};app)>start; 35
  33. 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. 34. use Plack::Builder;use MyApp;my $app = MyApp)>new(appdir => .);builder { $app)>psgi_app;}; 37
  35. 35. # config.ymlrouting: ) path: / class: MyApp::Web::Root ) path: /user/* class: MyApp::Web::User 38
  36. 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. 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. 38. • Dancer qw/:syntax なんか/ もしくは Dancer::なんか• コードが追いやすい(Dancer.pm• D::P::以下はへんなのもある• hook充実

×