Dancerで Webアプリ再入門 Hokkaido.pm#7 Yoshihiro Sasaki
自己紹介
自己紹介 @aloelight
自己紹介 @aloelight 札幌在住
自己紹介 @aloelight 札幌在住 PerlでWebアプリ開発
自己紹介 @aloelight 札幌在住 PerlでWebアプリ開発 サーバ保守・運用
まず初めに
まず初めに @riywoさん
まず初めに @riywoさん お越し頂きありがとうございます!
今回のテーマは Webアプリ再入門
Dancer 使ってみました
AWS Health Info
AWS Health Info • Twitterアカウントでログイン
AWS Health Info • Twitterアカウントでログイン • AWS Service Healthをチェック
AWS Health Info • Twitterアカウントでログイン • AWS Service Healthをチェック • 登録者にお知らせ
間に合いませんでした! てへぺろ☆(・ω<)
• 表側のみ作ってあって、裏側の@送信 とかないです
• 表側のみ作ってあって、裏側の@送信 とかないです • でも、ドメインを勢いで取ったので後 で実装します
• 表側のみ作ってあって、裏側の@送信 とかないです • でも、ドメインを勢いで取ったので後 で実装します • さくらVPSで動かしてます
アジェンダ 1. Dancerの紹介 2. Dancerの基本文法 3. AWS Health Infoのソースを読む
Dancerの紹介
Dancerの特徴
Dancerの特徴 • Sinatra系のPerl製WAF
Dancerの特徴 • Sinatra系のPerl製WAF • すっごくシンプル
Dancerの特徴 • Sinatra系のPerl製WAF • すっごくシンプル • 豊富なプラグイン
Dancerの特徴 • Sinatra系のPerl製WAF • すっごくシンプル • 豊富なプラグイン • 意外と豊富なドキュメント
まずはインストールする
$ cpanm Dancer
Hello, world use Dancer; get '/' => sub { return 'Hello, world'; }; dance;
$ ./hello.pl $ curl localhost:5000 Hello, world
簡単ですね!
もう少し複雑な プロジェクトのときは?
$ dancer -a MyApp
シンプル
シンプル
シンプル • 基本は use Dancer するだけ
シンプル • 基本は use Dancer するだけ • Dancer.pmがexportする関数を使う
シンプル • 基本は use Dancer するだけ • Dancer.pmがexportする関数を使う • クラス構成もシンプル
EXPORTS config redirect cookie request debug send_error forward set get session layout template param uri_for post その他諸々
豊富なプラグイン
豊富なプラグイン
豊富なプラグイン • Dancer::Plugin 94件
豊富なプラグイン • Dancer::Plugin 94件 • Mojolicious::Plugin 102件
豊富なプラグイン • Dancer::Plugin 94件 • Mojolicious::Plugin 102件 • Catalyst::Plugin 320件
豊富なプラグイン • Dancer::Plugin 94件 • Mojolicious::Plugin 102件 • Catalyst::Plugin 320件 • Amon2::Plugin 12件
メジャーなPlugin
メジャーなPlugin • Dancer::Plugin::Database
メジャーなPlugin • Dancer::Plugin::Database • Dancer::Plugin::DBIC
メジャーなPlugin • Dancer::Plugin::Database • Dancer::Plugin::DBIC • Dancer::Plugin::Email
メジャーなPlugin • Dancer::Plugin::Database • Dancer::Plugin::DBIC • Dancer::Plugin::Email • Dancer::Plugin::Thumbnail
メジャーなPlugin • Dancer::Plugin::Database • Dancer::Plugin::DBIC • Dancer::Plugin::Email • Dancer::Plugin::Thumbnail • Dancer::Plugin::Facebook
もっと知りたい方は Dancer plugins ecosystem http://advent.perldancer.org/2011/17
Pluginの作り方 package Dancer::Plugin::LinkBlocker; use Dancer ':syntax'; use Dancer::Plugin; register block_links_from => sub { my $conf = plugin_setting(); my $re = join( '|', @{ $conf->{hosts} } ); before sub { if ( request->referer && request->referer =~ /$re/ ) { status 403 || $conf->{http_code}; } }; }; register_plugin; 1;
ドキュメント
ドキュメント
ドキュメント • Dancer::Introduction
ドキュメント • Dancer::Introduction • Dancer::Tutorial
ドキュメント • Dancer::Introduction • Dancer::Tutorial • Dancer::Cookbook
ドキュメント • Dancer::Introduction • Dancer::Tutorial • Dancer::Cookbook • Dancer::Plugins
ドキュメント • Dancer::Introduction • Dancer::Tutorial • Dancer::Cookbook • Dancer::Plugins • Dancer::Deployment
httpd.conf <VirtualHost *:80> ServerName www.example.com DocumentRoot /srv/www.example.com/public ServerAdmin you@example.com <Directory "/srv/www.example.com/public"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all AddHandler cgi-script .cgi </Directory> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ /dispatch.cgi/$1 [QSA,L] ErrorLog /var/log/apache2/www.example.com-error.log CustomLog /var/log/apache2/www.example.com-access_log common </VirtualHost>
Dancerの基本文法
Routing get '/' => sub { return 'Hello, world'; }; any ['get','post'] => '/' => sub { ... };
Routing get '/user/:name' => sub { my $name = param 'name'; }; get '/user/*' => sub { my ($name) = splat; };
Request Parameters get '/' => sub { my $id = param 'id'; }; post '/' => sub { my $id = param 'id'; my $file = upload('file'); # Dancer::Request::Upload object $file->copy_to('/path/to/flie'); };
Request Parameters # GET /entry/foo?id=bar get '/entry/:id' => sub { my $id = param 'id'; # $id => foo }; # 追記 paramsを使えばデータソース別に取れます # perldoc Dancer::Request # Fetching_only_params_from_a_given_source
Config set 'tmdpir' => '/tmp/myapp'; get '/' => sub { my $config = config; return $config->{appname}; };
Cookie get '/login' => sub { my $id = param 'id'; my $password = param 'password'; if ( $id eq 'cto' && $password eq 'onagatani' ) { cookie 'logged_in' => 1; redirect '/'; } };
Session set session => 'YAML'; set session_dir => '/tmp/sessions'; set session_name => 'sid'; # default dancer.session get '/login' => sub { my $id = param 'id'; my $password = param 'password'; if ( $id eq 'cto' && $password eq 'onagatani' ) { session 'user' => { name => 'onagatani' }; redirect '/'; } };
Template set template => ‘template_toolkit’; get '/' => sub { my $id = param 'id'; template 'index', { id => $id }; };
注意 Dancer::Template::Simple IF, LOOPがありません
D::T::TemplateToolkit こちらを代わりに使いましょう
Database use Dancer::Plugin::Database; get '/entry/:id' => sub { my $id = param 'id'; my $data = database->quick_select( 'entry', { id => $id } ); };
Redirect get '/foo' => sub { redirect '/myaction'; }; get '/bar' => sub { # internal redirect forward '/myaction'; };
Logging set logger => 'console'; set log => 'debug'; get '/logging' => sub { core 'foo'; debug 'bar'; info 'baz'; warning 'hoge'; error 'piyo'; };
AWS Health Infoの ソースを読む
ご清聴ありがとうございました

Using Dancer