今回は実際にスケジュール管理アプリを作成していきます!
Amon2の構成を中心に見ていくAmon2第1部です!
Perl入学式のこちらの資料に基づいて勉強しています。どうぞご参考に!
エンジニア基礎① 1. Perl環境基礎 2. Hello,world! 3. Perl基礎 4. 配列・for文 5. ハッシュ 6. リファレンス 7. サブルーチン 8. 正規表現 9. ⭐️ Amon2 入門 第一部 ⭐️ 10. Amon2 入門 第二部
ゴール🏁(めやす:60分)
- WAFについて理解する
- Amon2の準備・構成の理解
おさえておきたいこと
WAF(Web Application Framework)
WAF(ワッフ)とは、動的なウェブサイト、Webアプリケーション、Webサービスの開発をサポートするために設計されたものです。Web開発で用いられる共通した作業に伴う労力を軽減することを目的としています。例えば、データベースへのアクセスのためのライブラリや、セッション管理ができるものがあります。PerlでかけるWAFはいくつか存在し、Mojolicious、Mojoliciousをより簡易的な構造にしたMojolicious::Lite、そして今回のAmon2、Amon2をより簡易的にしたAmon2::Liteなどがあります。Rubyで書けるWAFはRuby on Railsなどが有名です。
Amon2
今回使用するAmon2はPerl製WAFのひとつです。Amon2は、ウェブアプリケーションを作っていく最低限の機能は備えており、とてもシンプルな構造になっています。初心者にとってわかりやすいのです!それゆえ自分で拡張することによって様々な機能を追加することができます。 Amon2は、クライアントサイドのJavaScriptもライブラリが読み込まれています。一通り使えるようになっているので、無駄な手間がかかりません。 今回はAmon2を使って、スケジュール管理アプリ「Scheduler」を作っていきます。
ではスタート!
1.Amon2のインストール
以前にCPANをインストールしているとおもいます。
cpanmコマンドでAmon2をCPANコマンドでインストールしましょう。
$ cpanm Amon2
$ amon2-setup.pl ディレクトリ名
でディレクトリに雛形を作ります。
$ amon2-setup.pl Scheduler
これで、Schedulerというディレクトリができました。
2.基本的なAmon2 Webアプリケーションの構成
Amon2は以下のようになっています。
Build.PL builder config cpanfile cpanfile.snapshot db lib minil.toml script sql static t tmpl xt
主に使うものだけ解説します。
config
:Amon2全般の設定ファイルになります。cpanfile
:cpanmモジュールを管理します。追加削除ができます。変更したら、carton install
して差分を読み込みます。db
:RDBMSとしてSQLiteのデータを置きます。lib
:lib
下のWeb/Dispatcher.pm
でcontrollerにあたる部分になります。sql
:DBでのschemaの設置をします。static
:静的ファイル(css/javascript/imgなど)を置きます。tmpl
:index.tx
、include/layout.tx
ではviewにあたる部分の機能になります。
「view」「controller」にあたる部分について詳しく見ていきましょう。
$ vi lib/Scheduler/Web/Dispatcher.pm
をすると、cd
でディレクトリを移動しなくてもファイルを直接編集できます。
Controller
lib以下をみるとこのようになっています。
package Scheduler::Web::Dispatcher; use strict; use warnings; use utf8; use Amon2::Web::Dispatcher::RouterBoom; any '/' => sub { my ($c) = @_; my $counter = $c->session->get('counter') || 0; $counter++; $c->session->set('counter' => $counter); return $c->render('index.tx', { counter => $counter, }); }; post '/reset_counter' => sub { my $c = shift; $c->session->remove('counter'); return $c->redirect('/'); }; post '/account/logout' => sub { my ($c) = @_; $c->session->expire(); return $c->redirect('/'); }; 1;
package
でこのlib/Scheduler/Web/Dispatcher.pm
をひとまとまりとして、Scheduler::Web::Dispatcher
という名の関数として扱えます。use モジュール名;
で依存モジュールをこのDispatcher内で使えることができます。any '/' => sub {...}
やpost '/' => sub {...}
などのサブルーチン、コンテキストの解説は、papixさんの資料(https://github.com/perl-entrance-org/Perl-Entrance-Textbook/blob/master/amon2/1.md#controller) がとても詳しく書いているので、ぜひ参考にしてみてください。
View
では次にviewにあたる部分です。viewにあたる部分はtmpl
のなかのindex.tx
と、include/layout.tx
になります。また、Amon2はText::Xslateというテンプレートエンジンを使用しており、シンタックスはデフォルトのKolonを使用しています。詳しくはドキュメントを参照してください。
ではまずはlayout.tx
からみていきましょう。
<!doctype html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title><: $title || 'Scheduler' :></title> ... 中略 ... <div class="container"> <div id="main"> <: block content -> { } :> </div> <footer class="footer"> Powered by <a href="http://amon.64p.org/">Amon2</a> </footer> </div> </body> </html>
HTMLの書かれた中に<: block content -> { } :>
があります。これはtmpl
の: override content -> {...}
に記された内容を読み込みます。これによってtmplが複数に渡って書かれていても必要によって組み合わせることができるわけです。
tmpl/index.tx
をみてみましょう。
: cascade "include/layout.tx" : override content -> { <h1 style="padding: 70px; text-align: center; font-size: 80px; line-height: 1; letter-spacing: -2px;">Hello, Amon2 world!</h1> ... 中略 ... <h2>Session counter demo</h2> <p>You seen this page <: $counter :> times.</p> <form method="post" action="/reset_counter"> <input type="submit" name="Reset counter." class="btn btn-default"> </form> : }
1行目の: cascade "include/layout.tx"
は、2行目以降の: override content -> { ... :}
で書かれている内容をinclude/layout.tx
の<: block content -> { } :>
に渡すという意味です。
モジュールのインストール
まずは、アプリケーションに必要なモジュールをインストールしましょう。
以前紹介したCPANモジュールはアプリケーションで使用します。時間を表したい時は、Time::Piece
や、バリデーション(エンジニア基礎③で登場します)をしたい場合はFormValidator::Lite
などをつかいます。
Cartonは、Webアプリケーションの依存モジュールを管理してくれるアプリケーションです。cpanmコマンドでインストールしたモジュールとは別に管理してくれます。
Cartonは、cpanmモジュールなので、インストール時はcpanm
コマンドでインストールしましょう。Cartonを利用する時は、cpanfileがあるディレクトリに移動してcarton installすると、使用できるようになります。
$ cpanm Carton $ cd Scheduler $ carton install
これで、必要なモジュールはcartonによってインストールされました!
インストールすると、localというディレクトリを生成し、この中に依存モジュールをインストールして管理しています。
インストールしたモジュールを利用しながら、Perlのスクリプトを動かすには、carton execを利用します。今回のSchedulerの場合は、amon2-setup.pl
で雛形を生成した際にscript/scheduler-server
という起動用スクリプトが生成されているのでこれを使って、アプリケーションを起動します。
$ carton exec -- perl -Ilib script/scheduler-server Scheduler: http://127.0.0.1:5000/
起動したら、ブラウザでlocalhost:5000
に接続すると、Schedulerがでてきます!
参考:
Perl Advent Calendar Japan 2011 Teng Trac
第18回 Amon2によるWebアプリケーションの高速開発(2):Perl Hackers Hub|gihyo.jp … 技術評論社
今回は第一部としてAmon2の構成を中心にみていきました。
コンテキストへの理解と、全体的に変数やテンプレートをどう渡しているのかの流れを理解するのが大切です。
もし、わからないことがあれば ORM((O/Rマッパ, Object-Relational Mapper)は、RDBMSから取得した単一行のデータを特定のクラスと紐付けてオブジェクト化してくれる仕組み)ではTeng、tmplではText::XslateのKolonのドキュメントをみてみてください。
次回ではSchedulerを作っていきましょう。