Upload
yoshihiro-sasaki
View
5.973
Download
3
Embed Size (px)
DESCRIPTION
Citation preview
Hokkaido.pm#7Yoshihiro Sasaki
DancerでWebアプリ再入門
自己紹介
自己紹介@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, worlduse Dancer;
get '/' => sub { return 'Hello, world';};
dance;
$ ./hello.pl$ curl localhost:5000Hello, world
簡単ですね!
もう少し複雑なプロジェクトのときは?
$ dancer -a MyApp
シンプル
シンプル
シンプル•基本は use Dancer するだけ
シンプル•基本は use Dancer するだけ• Dancer.pmがexportする関数を使う
シンプル•基本は use Dancer するだけ• Dancer.pmがexportする関数を使う•クラス構成もシンプル
EXPORTSconfigcookiedebugforwardgetlayoutparampost
redirectrequestsend_errorsetsessiontemplateuri_forその他諸々
豊富なプラグイン
豊富なプラグイン
豊富なプラグイン•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 [email protected]
<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の基本文法
Routingget '/' => sub { return 'Hello, world';};
any ['get','post'] => '/' => sub { ...};
Routingget '/user/:name' => sub { my $name = param 'name';};
get '/user/*' => sub { my ($name) = splat;};
Request Parametersget '/' => 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=barget '/entry/:id' => sub { my $id = param 'id'; # $id => foo};
# 追記 paramsを使えばデータソース別に取れます# perldoc Dancer::Request# Fetching_only_params_from_a_given_source
Configset 'tmdpir' => '/tmp/myapp';get '/' => sub { my $config = config; return $config->{appname};};
Cookieget '/login' => sub { my $id = param 'id'; my $password = param 'password'; if ( $id eq 'cto' && $password eq 'onagatani' ) { cookie 'logged_in' => 1; redirect '/'; }};
Sessionset 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 '/'; }};
Templateset template => ‘template_toolkit’;get '/' => sub { my $id = param 'id'; template 'index', { id => $id };};
注意Dancer::Template::SimpleIF, LOOPがありません
D::T::TemplateToolkitこちらを代わりに使いましょう
Databaseuse Dancer::Plugin::Database;
get '/entry/:id' => sub { my $id = param 'id'; my $data = database->quick_select( 'entry', { id => $id } );};
Redirectget '/foo' => sub { redirect '/myaction';};
get '/bar' => sub { # internal redirect forward '/myaction';};
Loggingset logger => 'console';set log => 'debug';get '/logging' => sub { core 'foo'; debug 'bar'; info 'baz'; warning 'hoge'; error 'piyo';};
AWS Health Infoのソースを読む
ご清聴ありがとうございました