狠狠撸

狠狠撸Share a Scribd company logo
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
? 罢飞颈迟迟别谤アカウントでログイン
AWS Health Info
? 罢飞颈迟迟别谤アカウントでログイン
? AWS Service Healthをチェック
AWS Health Info
? 罢飞颈迟迟别谤アカウントでログイン
? AWS Service Healthをチェック
? 登録者にお知らせ
Using Dancer
間に合いませんでした!
  てへぺろ☆(?ω<)
? 表側のみ作ってあって、裏側の@送信
 とかないです
? 表側のみ作ってあって、裏側の@送信
 とかないです

? でも、ドメインを勢いで取ったので後
 で実装します
? 表側のみ作ってあって、裏側の@送信
 とかないです

? でも、ドメインを勢いで取ったので後
 で実装します

? さくらVPSで動かしてます
アジェンダ
1. 顿补苍肠别谤の绍介

2. 顿补苍肠别谤の基本文法

3. AWS Health Infoのソースを読む
顿补苍肠别谤の绍介
Using Dancer
顿补苍肠别谤の特徴
顿补苍肠别谤の特徴
? Sinatra系のPerl製WAF
顿补苍肠别谤の特徴
? Sinatra系のPerl製WAF
? すっごくシンプル
顿补苍肠别谤の特徴
? Sinatra系のPerl製WAF
? すっごくシンプル
? 豊富なプラグイン
顿补苍肠别谤の特徴
? 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
con?g         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件
メジャーな笔濒耻驳颈苍
メジャーな笔濒耻驳颈苍
? Dancer::Plugin::Database
メジャーな笔濒耻驳颈苍
? Dancer::Plugin::Database
? Dancer::Plugin::DBIC
メジャーな笔濒耻驳颈苍
? Dancer::Plugin::Database
? Dancer::Plugin::DBIC
? Dancer::Plugin::Email
メジャーな笔濒耻驳颈苍
? Dancer::Plugin::Database
? Dancer::Plugin::DBIC
? Dancer::Plugin::Email
? Dancer::Plugin::Thumbnail
メジャーな笔濒耻驳颈苍
? 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>
顿补苍肠别谤の基本文法
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
Con?g
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, 尝翱翱笔がありません
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の
  ソースを読む
ご清聴ありがとうございました

More Related Content

Using Dancer