Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Perl 6 で Web Application Framework をつくる

astj
PRO
March 09, 2017

Perl 6 で Web Application Framework をつくる

YAPC::Kansai OSAKA 2017

astj
PRO

March 09, 2017
Tweet

More Decks by astj

Other Decks in Technology

Transcript

  1. YAPC::Kansai 2017/03/04
    1FSMͰ8FC
    "QQMJDBUJPO
    'SBNFXPSLΛͭ͘Δ

    View Slide

  2. ASTJ
    github: @astj
    Twitter: @ast_j
    hatena: id:astj
    CPAN: ASTJ

    View Slide

  3. perl5 golang
    scala perl6

    View Slide

  4. • p5-Test-WWW-Stub
    • p5-Plack-Middleware-RevisionPlate
    • p6-SQL-NamedPlaceholder

    View Slide

  5. View Slide

  6. • 2014/04 ~ Hatena
    • ~2016/07 ͸ͯͳϒοΫϚʔΫ etc. (Perl)
    • 2016/08~ Mackerel (Scala, Golang)

    View Slide

  7. View Slide

  8. DVSMT*-NBDLFSFMJPcHSFQFOHJOFFS
    <13>8&3&)*3*/(

    View Slide

  9. NO PERL6
    AT HATENA

    View Slide

  10. View Slide

  11. ҙࣝ߹Θͤ

    View Slide

  12. ໌೔࣮ફͰ࢖͑Δ࿩͸
    ͋Γ·ͤΜ

    View Slide

  13. ࠓ͙͢8։ൃͰ࢖͑Δ
    ϑϨʔϜϫʔΫͷ঺հΛ
    ͢ΔΘ͚Ͱ΋͋Γ·ͤΜ

    View Slide

  14. 8FCΞϓϦέʔγϣϯ։ൃͷ
    ίϯϙʔωϯτͷ঺հ

    View Slide

  15. 4JOBUSBMJLFͳ
    ܰྔϑϨʔϜϫʔΫͷ
    ίϯηϓτ࣮૷

    View Slide

  16. 1FSMͰ
    8FCΞϓϦέʔγϣϯΛ
    ؾܰʹॻ͖࢝ΊΒΕΔΑ͏ʹ͢Δ

    View Slide

  17. View Slide

  18. YAPC::Kansai 2017/03/04
    1FSMͰ8FC
    "QQMJDBUJPO
    'SBNFXPSLΛͭ͘Δ
    ࠶ܝ

    View Slide

  19. YAPC::Kansai 2017/03/04
    1FSMͰ8FC
    "QQMJDBUJPO
    'SBNFXPSLΛͭ͘Δ

    View Slide

  20. -BSSZ8BMM͕EFTJHOͨ͠
    1FSMͬΆ͍ເͷݴޠ
    ※ݸਓͷײ૝Ͱ͢

    View Slide

  21. ͨͱ͑͹ܕ͕͋Δ
    https://docs.perl6.org/images/type-graph-Positional.svg

    View Slide

  22. YAPC::Kansai 2017/03/04
    1FSMͰ8FC
    "QQMJDBUJPO
    'SBNFXPSLΛͭ͘Δ
    ࠶ܝ

    View Slide

  23. YAPC::Kansai 2017/03/04
    1FSMͰ8FC
    "QQMJDBUJPO
    'SBNFXPSLΛͭ͘Δ

    View Slide

  24. https://ja.wikipedia.org/wiki/WebΞϓϦέʔγϣϯϑϨʔϜϫʔΫ
    8FCΞϓϦέʔγϣϯϑϨʔϜϫʔΫʢ΢ΣϒΞϓϦέʔ
    γϣϯϑϨʔϜϫʔΫɺӳ8FC"QQMJDBUJPO
    'SBNFXPSLʣ͸ɺಈతͳ΢ΣϒαΠτɺ8FCΞϓϦέʔ
    γϣϯɺ8FCαʔϏεͷ։ൃΛαϙʔτ͢ΔͨΊʹઃܭ͞
    ΕͨΞϓϦέʔγϣϯϑϨʔϜϫʔΫͰ͋ΔɻϑϨʔϜϫʔ
    Ϋͷ໨త͸ɺ8FC։ൃͰ༻͍ΒΕΔڞ௨ͨ͠࡞ۀʹ൐͏࿑
    ྗΛܰݮ͢Δ͜ͱͰ͋Δɻͨͱ͑͹ɺଟ਺ͷϑϨʔϜϫʔ
    Ϋ͕σʔλϕʔε΁ͷΞΫηεͷͨΊͷϥΠϒϥϦ΍ɺςϯ
    ϓϨʔτΤϯδϯʢˠ8FCςϯϓϨʔτʣɺηογϣϯ؅
    ཧΛఏڙ͠ɺίʔυͷ࠶ར༻Λଅਐͤ͞Δ΋ͷ΋͋Δɻ

    View Slide

  25. • Amon2 (Perl5)
    • Mojolicious (Perl5)
    • Play Framework (Java/Scala)
    • Ruby on Rails
    • Sinatra (Ruby)
    • etc, etc……

    View Slide

  26. View Slide

  27. 14(*
    http://plackperl.org
    5

    View Slide

  28. PSGI is an interface between Perl
    web applications and web servers, and
    Plack is a Perl module and toolkit
    that contains PSGI middleware,
    helpers and adapters to web servers.
    http://plackperl.org

    View Slide

  29. ʮϦΫΤετ৘ใͷ٧·ͬͨ
    IBTIΛड͚औͬͯɺϨεϙϯε
    ৘ใͷೖͬͨBSSBZSFGΛฦ͢ʯ

    View Slide

  30. Handler
    Middleware
    %env → [email protected]

    View Slide

  31. return sub {
    my %env = shift;
    return [200, [], ["body"]];
    }
    5

    View Slide

  32. 14(*
    https://github.com/supernovus/perl6-psgi

    View Slide

  33. return sub(%env) {
    return 200, [], ["body"];
    }

    View Slide

  34. 1MBDL
    http://plackperl.org
    5

    View Slide

  35. $SVTU
    https://github.com/tokuhirom/p6-Crust

    View Slide

  36. Crust is a set of tools for using the PSGI
    stack. It contains middleware
    components(TBI), and utilities for Web
    application frameworks. Crust is like Perl5's
    Plack, Ruby's Rack, Python's Paste for WSGI.
    https://github.com/tokuhirom/p6-Crust

    View Slide

  37. View Slide

  38. ໨ࢦ͢෺

    View Slide

  39. 4JOBUSBMJLFͳ
    ܰྔϑϨʔϜϫʔΫͷ
    ίϯηϓτ࣮૷
    ࠶ܝ

    View Slide

  40. JNBHJOF,PTTZ

    View Slide

  41. get '/user/:name' do
    "You're #{params['name']}!"
    end
    get '/' => sub {
    my ( $self, $c ) = @_;
    $c->render('index.tx', { msg => "Hello!" });
    };
    Sinatra
    Kossy

    View Slide

  42. View Slide

  43. 4JYBUSB

    View Slide

  44. unit module MyWeb;
    use Sixatra;
    get '/user/:name', -> $c {
    "I am " ~ $c.param;
    }
    get '/html', -> $c {
    $c.render('view/page.html');
    }

    View Slide

  45. $ crustup -e \
    'use Sixatra; sixatra-app("MyWeb");'

    View Slide

  46. • ϧʔςΟϯάఆٛDSL
    • ศརͳϨεϙϯεͷੜ੒
    • ςϯϓϨʔτΤϯδϯͱ͔

    View Slide

  47. • Built on Crust Toolkit
    • Crust::Middleware ࢖͍͍ͨͰ͠ΐʁ
    • ϦΫΤετύʔε͓೚͍ͤͨ͠Ͱ͠ΐʁ
    • etc……

    View Slide

  48. ͭ͘Βͳ͍΋ͷ

    View Slide

  49. • ϑΟϧλ (before, after)
    • ηογϣϯ
    • ੩తϑΝΠϧ഑৴
    • DB ઀ଓ૚
    • ίʔυδΣωϨʔλ
    kossy-setup MyApp

    View Slide

  50. • ϑΟϧλ (before, after)
    • ηογϣϯ
    • ੩తϑΝΠϧ഑৴
    • DB ઀ଓ૚
    • ίʔυδΣωϨʔλ
    See Crust::Middleware::Session
    See Crust::Middleware::Static
    ࿩୊͕ൃࢄ͢Δ
    ؒʹ߹Θͳ͔ͬͨ
    ؒʹ߹Θͳ͔ͬͨ

    View Slide

  51. View Slide

  52. %4-

    View Slide

  53. unit module MyWeb;
    use Sixatra;
    get '/user/:name', -> $c {
    "I am " ~ $c.param;
    }
    get '/html', -> $c {
    $c.render('view/page.html');
    }
    ࠶ܝ

    View Slide

  54. unit class Sixatra::Connection;
    has Sixatra::Request $.req;
    has Hash $.params;
    method render(Str $filename, *@args) {
    ...
    }

    View Slide

  55. my class RoutingStaff {
    has Callable $.app;
    };
    sub router($methods, $path, $app) is export {
    $ROUTER.add(
    @$methods,
    $path,
    RoutingStaff.new(:$app)
    );
    }
    sub get($path, $app) is export {
    router ["GET", "HEAD"], $path, $app;
    }

    View Slide

  56. ϧʔςΟϯά

    View Slide

  57. NFUIPE QBUI

    ˣ
    DPOUSPMMFS QBSBNT

    View Slide

  58. View Slide

  59. get '/login' -> $c {
    $c.render('view/login-form.html');
    }
    post '/login' -> $c {
    ...
    $c.redirect(
    $c.req.parameters
    );
    }

    View Slide

  60. get '/users/:name' -> $c {
    "You are " ~ $c.params;
    }

    View Slide

  61. 3PVUFS#PPTU.FUIPE
    https://github.com/moznion/p6-Router-Boost

    View Slide

  62. 3PVUFS#PPN.FUIPE
    https://github.com/tokuhirom/Router-Boom
    5

    View Slide

  63. my $match = $ROUTER.match(
    $req.method, $req.path-info
    );
    return 405, [], ['Method Not Allowed']
    if $match;
    with $match {
    my $c = Sixatra::Connection.new(
    :$req, :params($match)
    );
    my $res = $match.app.($c);
    ...

    View Slide

  64. ςϯϓϨʔτ

    View Slide

  65. • DSL (TT2)
    • embedded (erb, Mojo::Template…)
    • Logicless (Mustache)

    View Slide

  66. View Slide

  67. • DSL => Template6
    • embedded => Template::Mojo, etc…
    • Logicless => Template::Mustache

    View Slide

  68. • DSL => Template6
    • embedded => Template::Mojo, etc…
    • Logicless => Template::Mustache

    View Slide

  69. method render($filename, *@args) {
    my $body =
    Template::Mojo.from-file(
    $filename
    ).render(|@args);
    Crust::Response.new(
    :status(200),
    :headers(...),
    :body([$body])
    );
    }

    View Slide

  70. Ϩεϙϯε

    View Slide

  71. my $match = $router.match(...);
    my List $res = $match(...);
    return $res;

    View Slide

  72. • ࠷ऴతʹ͸: [$status, $headers, $body]
    • Crust::Response?
    • εςʔλείʔυ͚ͩ
    • จࣈྻ͚ͩ

    View Slide

  73. my $res = $match(...);
    if $res !~~ Crust::Response {
    given $res {
    when List { return $res; }
    when Int {
    $res = Crust::Response.new(:status($res), ...);
    }
    when Str {
    $res = Crust::Response.new(
    :status(200), ... :body([$res])
    );
    }
    ...
    }
    }
    return $res.finalize;

    View Slide

  74. View Slide

  75. ׬੒ʁ

    View Slide

  76. unit module MyApp;
    use Sixatra;
    get '/users/:name', -> $c {
    $c.render('./templates/user.tm', {:name($c.params)});
    };
    post '/entries', -> $c {
    $c.redirect('/', 303);
    };
    get '/', -> $c {
    $c.render('./templates/index.tm');
    };
    get '/403', -> $c {
    403;
    }

    View Slide

  77. • ϑΟϧλ (before, after)
    • ηογϣϯ
    • ੩తϑΝΠϧ഑৴
    • DB ઀ଓ૚
    • ίʔυδΣωϨʔλ
    See Crust::Middleware::Session
    See Crust::Middleware::Static
    ࿩୊͕ൃࢄ͢Δ
    ؒʹ߹Θͳ͔ͬͨ
    ؒʹ߹Θͳ͔ͬͨ
    ࠶ܝ

    View Slide

  78. • ҆શੑ (CSRF, CORS, XSS etc…)

    View Slide

  79. ○ ॻ͍ͯ༡΂ͦ͏
    × ॻ͍ͯ࢖͑ͦ͏

    View Slide

  80. ະ׬

    View Slide

  81. • جૅతͳίϯϙʔωϯτ͸͋Δ
    • ૊Έ߹ΘͤΔͱγϯϓϧͳ WAF ͕Ͱ͖Δ
    • Perl6 ͓΋͠Ζ͍Ͱ͢Α
    • ͍͍͜ͱ͹͔ΓͰ΋ͳ͍͚Ͳ

    View Slide

  82. 4JYBUSB
    https://github.com/astj/p6-Sixatra

    View Slide

  83. zef install \
    git://github.com/astj/p6-Sixatra.git

    View Slide

  84. 5IBOLZPVGPS
    MJTUFOJOH

    View Slide

  85. 2VFTUJPOT

    View Slide