Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Mojoliciousをウェブ制作現場で使ってみてる

8,025 views

Published on

  • Be the first to comment

Mojoliciousをウェブ制作現場で使ってみてる

  1. 1. MOJOLICIOUSをウェブ制作現場で使ってみてる jamadam
  2. 2. 自己紹介• jamadam• ウェブ制作会社勤務• 一人技術部
  3. 3. 昨年の春頃からMojoliciousを使っています。 当時、Mojoliciousを選択した理由 •依存がない •Pure Perl •perl-5.8でも動く
  4. 4. 昨年の春頃からMojoliciousを使っています。 当時、Mojoliciousを選択した理由 現在は •依存がない •Pure Perl 5.10.1から •perl-5.8でも動く
  5. 5. 僕の職務ではレンタルサーバーなどの不自由な環境にデプロイすることが多い。•FTPでデプロイしなければならない•モジュールのインストールができない•perl-5.8が主流 Mojoliciousが最適
  6. 6. mojoの基礎知識
  7. 7. MojoliciousアプリをMojoliciousという 簡潔に記述できる WAF Mojolicious::Lite Mojoという モジュール群
  8. 8. 最小のMojoliciousアプリ#!/usr/bin/env perluse Mojolicious::Lite;get / => sub { my $c = shift; $c->render(text => Hello World!);};app->start;
  9. 9. ルートは必ずしも必要ないこれだけでも、多少、意味のある仕事をさせることができる(後述) #!/usr/bin/env perl use Mojolicious::Lite; app->start;
  10. 10. mojoの中の話
  11. 11. Mojoのほぼ全てのモジュールは Mojo::Baseを継承している •use strict; •use warnings; •use feature :5.10; •hasというアクセサ生成関数 •newコンストラクタ
  12. 12. Mojo::Baseの使い方use Mojo::Base -strictuse Mojo::Base -baseuse Mojo::Base SomeClass
  13. 13. package MyClass;use Mojo::Base -base;has some_attr => ;package main;my $instance = MyClass->new(%hash);my $instance = MyClass->new($hash_ref);say $instance->some_attr; # $instance->some_attr(a);say $instance->some_attr; # a
  14. 14. package MyClass; hasと同じuse Mojo::Base -base;__PACKAGE__->attr(some_attr => );package main;my $instance = MyClass->new(%hash);my $instance = MyClass->new($hash_ref);say $instance->some_attr; # $instance->some_attr(a);say $instance->some_attr; # a
  15. 15. ※注) 初期値はスカラーのみ has name; has name => foo; has name => sub {...};※注) コードリファレンスが 初期値になる訳ではない
  16. 16. hasで定義されたアトリビュートはPODのATTRIBUTESの項に記載されている メソッドだと勘違いしてPODに書いてないとか 思ったらアトリビュートだった経験多数
  17. 17. 話は変わって・・・mojo v2.0からperl-5.8が切られた
  18. 18. 困ったのでmojo-legacyを作った。perl-5.8.7から動くかもしれないmojoです。
  19. 19. たまにメンテしていて、現在、mojo v2.91と互換性があります。
  20. 20. ただし、いくつかのテストが失敗する (3 / 9000)$ perl -I./lib t/mojo/json.tok 83 - successful roundtrip 巨大なJSONのSegmentation fault: 11 デコード$ prove -rl t/pod_coverage.tUnknown "re" subpragma regexp_pattern (knownones are: debug, debugcolor, eval, taint) at lib/Mojolicious/Command/routes.pm line 4$ perl -I./lib t/mojo/websocket.t 僕の環境だけ?not ok 46 - right result
  21. 21. mojo-legacyの話、終わり
  22. 22. 本題 ウェブ制作の現場では デザイナー主導で組み上がったサイトに動的コンテンツを後付けすることが多い。「このページのココに新着情報を挿入して欲しい」 とか
  23. 23. それってPHPが最適解<ul> <?php        require_once(./lib/news_release.php);        $news = new newsRelease();        $array = $news->fetch(5);    ?> <?php foreach ($array as $entry) { ?>        <li>            <a href="<?php $entry[url] ?>"> <?php $entry[title] ?> </a>        </li>    <?php } ?></ul> ※PHPコードはイメージです
  24. 24. でもPerlでやる<ul> <% require ./lib/NewsRelease.pm; my $news = NewsRelease->new(); my @array = $news->fetch(5); %> <% for my $entry (@array) { %>        <li>            <a href="<%= $entry->{url} %>"> <%= $entry->{title} %> </a>        </li>    <% } %></ul>
  25. 25. 最小のMojoliciousアプリ(再掲) #!/usr/bin/env perl use Mojolicious::Lite; app->start;
  26. 26. 最小のMojoliciousアプリ(再掲) #!/usr/bin/env perl use Mojolicious::Lite; app->start;同階層のpublicディレクトリが公開される
  27. 27. ウェブ制作ではindex.htmlは省略されるのが常 DirectoryIndex index.html
  28. 28. index.htmlを補完するのに around_dispatchフックを用いる#!/usr/bin/env perluse Mojolicious::Lite;app->hook(around_dispatch => sub { my ($next, $c) = @_; ## pre process $next->(); ## post process});app->start;
  29. 29. リクエストパスを補完するのに around_dispatchフックを用いるapp->hook(around_dispatch => sub { my ($next, $c) = @_; ## pre process $next->(); ## post process}); Plack::Middlewareに似てる
  30. 30. index.htmlを補完するapp->hook(around_dispatch => sub { my ($next, $c) = @_; # auto fill file name my $path = $c->req->url->path; if ($path->trailing_slash || ! @{$path->parts}) { push(@{$path->parts}, index.html); $path->trailing_slash(0); } $next->(); ## post process});app->start;
  31. 31. publicとtemplatesを混ぜるapp->static->paths([public]);app->renderer->paths([public]);
  32. 32. publicとtemplatesを混ぜる app->static->paths([public]); app->renderer->paths([public]);/public/index.html rename /public/index.html.ep
  33. 33. パスをディレクトリ階層に変換するルートget / => index;get /index.html => index;get /index2.html => index2;get /dir/ => dir/index;get /dir/index.html => dir/index;get /dir/index2.html => dir/index2;
  34. 34. パスをディレクトリ階層に変換するルート # /path/to/index.html # stash => {     template => /path/to/index,     format => html } get (*template).(*format) => sub { my $c = shift; $c->render; $c->res->code || $c->render_not_found; };
  35. 35. /index.html.epへのリクエストを403にapp->hook(around_dispatch => sub { my ($next, $c) = @_; if ($c->req->url->path =~ qr{.ep$}) { $c->render_exception(Forbidden); $c->res->code(403); return; } # auto fill file name my $path = $c->req->url->path; if ($path->trailing_slash || ! @{$path->parts}) { push(@{$path->parts}, index.html); $path->trailing_slash(0); } $next->();});
  36. 36. 以上の処理をプラグインにまとめましたplugin Dispatch2Directory => { document_root => public_html, default_file => index.html,};
  37. 37. 以上の処理をプラグインにまとめました 使用は全然おすすめしません Mojoliciousは起動時に 全てのテンプレートを検出しファイル名とハンドラの対応表を作っており、 publicとtemplatesを混ぜたことで静的ファイルまで検出の対象になり、無駄。
  38. 38. 同等のことを非Mojoliciousで実現しました
  39. 39. おわり

×