• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
YAPC::Asia 2011 tomita
 

YAPC::Asia 2011 tomita

on

  • 1,448 views

 

Statistics

Views

Total Views
1,448
Views on SlideShare
1,284
Embed Views
164

Actions

Likes
0
Downloads
0
Comments
0

3 Embeds 164

http://yapcasia.org 162
http://paper.li 1
http://a0.twimg.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    YAPC::Asia 2011 tomita YAPC::Asia 2011 tomita Presentation Transcript

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