はじめに
日本の松野徳宏とのインタビューで、次のフレーズが聞こえました。
「 100万人以上が当社のアプリケーションを使用しています。 すべてAmon2で動作します 。」
ロシア語では、このWebフレームワークに関する情報は見つかりませんでした。 そして、私は純粋に自分のためにAmon2を試してみることにしました。
設置
Debian GNU / Linux 7.3(wheezy)を搭載した仮想マシンが手に入りました
行こう...
# curl -L http://cpanmin.us | perl - Amon2 ................ Building and testing Amon2-6.00 ... OK Successfully installed Amon2-6.00 78 distributions installed Successfully installed Amon2-6.00
それだけです! インストールが完了しました。
私たちが受け取った箱から:
- PSGI / Plack上に構築
- XSの深さはありません。
- 薄い
- 習得が簡単
- CLIサポート
- 安定した
- デフォルトで安全なオプション
- Xslateテンプレート
ワイヤーフレーム
adduser dotcloud su - dotcloud amon2-setup.pl BBS
すべてが順調に進んでいます...
-実行中のフレーバー:基本-[メイン]ロードアセット:jQuery
[メイン]アセットの読み込み:ブートストラップ
[メイン]アセットの読み込み:ES5Shim
[メイン]アセットの読み込み:MicroTemplateJS
[メイン]アセットの読み込み:StrftimeJS
[メイン]アセットの読み込み:SprintfJS
[メイン]アセットの読み込み:MicroLocationJS
[メイン]アセットの読み込み:MicroDispatcherJS
[メイン]アセットの読み込み:XSRFTokenJS
[フレーバー::基本] tmpl / index.txの記述
[フレーバー::基本] tmpl / include / layout.txの記述
[フレーバー::基本] tmpl / include / pager.txの記述
[フレーバー::ベーシック] lib / BBS.pmの記述
[フレーバー::基本] lib / BBS / Web.pmの記述
[フレーバー::ベーシック] lib / BBS / Web / Plugin / Session.pmの記述
[フレーバー::基本] lib / BBS / Web / Dispatcher.pmの記述
[フレーバー::ベーシック] lib / BBS / Web / View.pmの記述
[フレーバー::ベーシック] lib / BBS / Web / ViewFunctions.pmの記述
[フレーバー::基本] lib / BBS / DB.pmの記述
[フレーバー::基本] lib / BBS / DB / Schema.pmの記述
[フレーバー::基本] lib / BBS / DB / Row.pmの記述
[Flavor :: Basic]スクリプトの作成/ bbs-server
[Flavor :: Basic] Build.PLの作成
[フレーバー::基本] minil.tomlの作成
[フレーバー::基本]書き込みビルダー/ MyBuilder.pm
[フレーバー::基本] cpanfileの作成
[フレーバー::基本]静的// js / jquery-2.0.3.min.jsの書き込み
[フレーバー::基本]静的//ブートストラップ/フォント/ glyphicons-halflings-regular.eotの書き込み
[フレーバー::基本]静的//書き込みbootstrap / css / bootstrap-theme.min.css
[フレーバー::基本]静的//ブートストラップ/フォント/ glyphicons-halflings-regular.woffの書き込み
[フレーバー::基本]静的//ブートストラップ/フォント/ glyphicons-halflings-regular.ttfの書き込み
[フレーバー::基本]静的//ブートストラップ/ css / bootstrap.min.cssの書き込み
[フレーバー::基本]静的//ブートストラップ/ js / bootstrap.min.jsの書き込み
[フレーバー::基本]静的//ブートストラップ/フォント/ glyphicons-halflings-regular.svgの書き込み
[フレーバー::基本]静的//ブートストラップ/ js / bootstrap.jsの書き込み
[フレーバー::基本]静的//ブートストラップ/ css / bootstrap.cssの書き込み
[フレーバー::基本]静的//ブートストラップ/ css / bootstrap-theme.cssの書き込み
[フレーバー::基本] static // js / es5-shim.min.jsを記述する
[フレーバー::基本] static // js / micro_template.jsを記述する
[フレーバー::基本] static // js / strftime.jsを記述する
[フレーバー::基本]静的// js / sprintf-0.7-beta1.jsを記述する
[フレーバー::基本]静的// js / micro-location.jsの書き込み
[フレーバー::基本] static // js / micro_dispatcher.jsを記述する
[フレーバー::基本]静的// js / xsrf-token.jsの書き込み
[フレーバー::基本] static / img / .gitignoreを記述する
[フレーバー::基本]静的/ robots.txtの書き込み
[Flavor :: Basic] static / js / main.jsを記述する
[フレーバー::基本]静的/ css / main.cssの書き込み
[フレーバー::基本] db / .gitignoreの書き込み
[フレーバー::基本] config / development.plの記述
[フレーバー::基本] config / production.plの記述
[フレーバー::基本]書き込み設定/ test.pl
[フレーバー::基本] sql / mysql.sqlの記述
[フレーバー::基本] sql / sqlite.sqlの記述
[フレーバー::基本] t / Util.pmの記述
[フレーバー::基本] t / 00_compile.tの書き込み
[フレーバー::基本] t / 01_root.tの書き込み
[フレーバー::基本]書き込みt / 02_mech.t
[フレーバー::基本]書き込みt / 03_assets.t
[フレーバー::基本]書き込みt / 06_jshint.t
[フレーバー::基本] xt / 01_pod.tの書き込み
[フレーバー::基本] xt / 02_perlcritic.tを書く
[フレーバー::基本] .gitignoreを記述する
[フレーバー::基本] .provercの記述
[フレーバー::基本]静的/ 500.htmlの書き込み
[フレーバー::基本]静的/ 504.htmlの記述
[フレーバー::基本]静的/ 503.htmlの記述
[フレーバー::基本]静的/ 502.htmlの記述
[フレーバー::基本]静的/ 404.htmlの記述
gitコマンドはありません。
-
[メイン]アセットの読み込み:ブートストラップ
[メイン]アセットの読み込み:ES5Shim
[メイン]アセットの読み込み:MicroTemplateJS
[メイン]アセットの読み込み:StrftimeJS
[メイン]アセットの読み込み:SprintfJS
[メイン]アセットの読み込み:MicroLocationJS
[メイン]アセットの読み込み:MicroDispatcherJS
[メイン]アセットの読み込み:XSRFTokenJS
[フレーバー::基本] tmpl / index.txの記述
[フレーバー::基本] tmpl / include / layout.txの記述
[フレーバー::基本] tmpl / include / pager.txの記述
[フレーバー::ベーシック] lib / BBS.pmの記述
[フレーバー::基本] lib / BBS / Web.pmの記述
[フレーバー::ベーシック] lib / BBS / Web / Plugin / Session.pmの記述
[フレーバー::基本] lib / BBS / Web / Dispatcher.pmの記述
[フレーバー::ベーシック] lib / BBS / Web / View.pmの記述
[フレーバー::ベーシック] lib / BBS / Web / ViewFunctions.pmの記述
[フレーバー::基本] lib / BBS / DB.pmの記述
[フレーバー::基本] lib / BBS / DB / Schema.pmの記述
[フレーバー::基本] lib / BBS / DB / Row.pmの記述
[Flavor :: Basic]スクリプトの作成/ bbs-server
[Flavor :: Basic] Build.PLの作成
[フレーバー::基本] minil.tomlの作成
[フレーバー::基本]書き込みビルダー/ MyBuilder.pm
[フレーバー::基本] cpanfileの作成
[フレーバー::基本]静的// js / jquery-2.0.3.min.jsの書き込み
[フレーバー::基本]静的//ブートストラップ/フォント/ glyphicons-halflings-regular.eotの書き込み
[フレーバー::基本]静的//書き込みbootstrap / css / bootstrap-theme.min.css
[フレーバー::基本]静的//ブートストラップ/フォント/ glyphicons-halflings-regular.woffの書き込み
[フレーバー::基本]静的//ブートストラップ/フォント/ glyphicons-halflings-regular.ttfの書き込み
[フレーバー::基本]静的//ブートストラップ/ css / bootstrap.min.cssの書き込み
[フレーバー::基本]静的//ブートストラップ/ js / bootstrap.min.jsの書き込み
[フレーバー::基本]静的//ブートストラップ/フォント/ glyphicons-halflings-regular.svgの書き込み
[フレーバー::基本]静的//ブートストラップ/ js / bootstrap.jsの書き込み
[フレーバー::基本]静的//ブートストラップ/ css / bootstrap.cssの書き込み
[フレーバー::基本]静的//ブートストラップ/ css / bootstrap-theme.cssの書き込み
[フレーバー::基本] static // js / es5-shim.min.jsを記述する
[フレーバー::基本] static // js / micro_template.jsを記述する
[フレーバー::基本] static // js / strftime.jsを記述する
[フレーバー::基本]静的// js / sprintf-0.7-beta1.jsを記述する
[フレーバー::基本]静的// js / micro-location.jsの書き込み
[フレーバー::基本] static // js / micro_dispatcher.jsを記述する
[フレーバー::基本]静的// js / xsrf-token.jsの書き込み
[フレーバー::基本] static / img / .gitignoreを記述する
[フレーバー::基本]静的/ robots.txtの書き込み
[Flavor :: Basic] static / js / main.jsを記述する
[フレーバー::基本]静的/ css / main.cssの書き込み
[フレーバー::基本] db / .gitignoreの書き込み
[フレーバー::基本] config / development.plの記述
[フレーバー::基本] config / production.plの記述
[フレーバー::基本]書き込み設定/ test.pl
[フレーバー::基本] sql / mysql.sqlの記述
[フレーバー::基本] sql / sqlite.sqlの記述
[フレーバー::基本] t / Util.pmの記述
[フレーバー::基本] t / 00_compile.tの書き込み
[フレーバー::基本] t / 01_root.tの書き込み
[フレーバー::基本]書き込みt / 02_mech.t
[フレーバー::基本]書き込みt / 03_assets.t
[フレーバー::基本]書き込みt / 06_jshint.t
[フレーバー::基本] xt / 01_pod.tの書き込み
[フレーバー::基本] xt / 02_perlcritic.tを書く
[フレーバー::基本] .gitignoreを記述する
[フレーバー::基本] .provercの記述
[フレーバー::基本]静的/ 500.htmlの書き込み
[フレーバー::基本]静的/ 504.htmlの記述
[フレーバー::基本]静的/ 503.htmlの記述
[フレーバー::基本]静的/ 502.htmlの記述
[フレーバー::基本]静的/ 404.htmlの記述
gitコマンドはありません。
-
Setup script was done! You are ready to run the skelton. You need to install the dependencies by: > carton install And then, run your application server: > carton exec perl -Ilib script/bbs-server --------------------------------------------------------------
すべては大丈夫のようですが、カートンでは十分ではないため、さらにいくつかのコマンドを入力することをお勧めします。
入れて
cpan Carton # carton install # BBS! !
次のファイルとディレクトリ構造を取得します。
builder Build.PL config cpanfile cpanfile.snapshot db lib local minil.toml script sql static t tmpl xt
Webアプリケーションの作成
cd db vim sqlite.sql
次の内容のsqlite.sqlファイル:
CREATE TABLE IF NOT EXISTS member ( id INTEGER NOT NULL PRIMARY KEY, name VARCHAR(255) ); CREATE TABLE IF NOT EXISTS sessions ( id CHAR(72) PRIMARY KEY, session_data TEXT ); CREATE TABLE IF NOT EXISTS entry ( entry_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, body varchar(255) not null );
ベースを作成します。
sqlite3 development.db < sqlite.sql
次へ
cd config/ vim development.pl
そのような設定をそれに入れます:
use File::Spec; use File::Basename qw(dirname); my $basedir = File::Spec->rel2abs(File::Spec->catdir(dirname(__FILE__), '..')); my $dbpath = File::Spec->catfile($basedir, 'db', 'development.db'); +{ 'DBI' => [ "dbi:SQLite:dbname=$dbpath", '', '', +{ sqlite_unicode => 1, } ], };
テスト用にWebサーバーを実行しようとしています。
perl -Ilib script/bbs-server Can't locate Teng/Schema/Declare.pm in @INC (you may need to install the Teng::Schema::Declare module) (@INC contains: script/../lib lib /etc/perl /usr/local/lib/perl/5.18.1 /usr/local/share/perl/5.18.1 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.18 /usr/share/perl/5.18 /usr/local/lib/site_perl .) at script/../lib/BBS/DB/Schema.pm line 6. BEGIN failed--compilation aborted at script/../lib/BBS/DB/Schema.pm line 6. Compilation failed in require at script/../lib/BBS.pm line 7. BEGIN failed--compilation aborted at script/../lib/BBS.pm line 7. Compilation failed in require at /usr/share/perl/5.18/parent.pm line 20. BEGIN failed--compilation aborted at script/../lib/BBS/Web.pm line 5. Compilation failed in require at script/bbs-server line 9. BEGIN failed--compilation aborted at script/bbs-server line 9.
そして中断します。
OK、設定
cpan Teng::Schema::Declare cpan Module::Functions cpan Plack::Middleware::ReverseProxy cpan Plack::Handler::Starlet
最後に大事に見た:
dotcloud@debian:~/BBS$ perl -Ilib script/bbs-server BBS: http://127.0.0.1:5000/
このアドレスにアクセスすると、まさにそのような不気味な美しさを見ることができます:
今、VVSを作ることは残って
vim lib/BBS/DB/Schema.pm
そして、以下をそこに置きます:
package BBS::DB::Schema; use strict; use warnings; use utf8; use Teng::Schema::Declare; base_row_class 'BBS::DB::Row'; table { name 'sessions'; pk 'id'; columns qw(session_data); }; table { name 'entry'; pk 'entry_id'; columns qw(entry_id body); }; 1;
次:
vim lib/BBS/Web/Dispatcher.pm
package BBS::Web::Dispatcher; use strict; use warnings; use Amon2::Web::Dispatcher::Lite; any '/' => sub { my ($c) = @_; my @entries = $c->db->search( entry => { }, { order_by => 'entry_id DESC', limit => 10, } ); return $c->render( "index.tx" => { entries => \@entries, } ); }; post '/post' => sub { my ($c) = @_; if (my $body = $c->req->param('body')) { $c->db->insert( entry => +{ body => $body, } ); } return $c->redirect('/'); }; 1;
そして、テンプレートを支配する
vim tmpl/index.tx
: cascade "include/layout.tx" : override content -> { <form method="post" action="<: uri_for('/post') :>"> <input type="text" name="body" /> <input type="submit" value="Send" /> </form> <ul> <: for $entries -> $entry { :> <li><: $entry.entry_id :>. <: $entry.body :></li> <: } :> </ul> : }
以下を開始します。
perl -Ilib script/bbs-server
必要に応じて、次のパッケージをインストールします
cpan Router::Simple cpan Router::Simple::Sinatraish cpan DBD::SQLite
ほら!
おばあちゃんビビシハ-それは動作します!
すべてをnginxにデプロイすることは残っています
フロントエンドとしてnginxを設定する
最初に、initファイルを作成し、ルートから実行されないようにします
vim /etc/init.d/plackup
#!/bin/sh PORT=5000 WORKERS=4 AMON_DIR="/home/dotcloud/BBS" AMON_APP="$AMON_DIR/script/bbs-server" AMON_USER="dotcloud" AMON_MODE="development" website="cc_Website" plackup="/usr/local/bin/plackup " PID=$AMON_DIR/logs/plackup.$website.pid plackup_args="-E $AMON_MODE -p $PORT -s Starman --pid=$PID --workers $WORKERS -D" U=`id -un` if [ $U = root ]; then WRPERM=`find $AMON_DIR/ ! -user $AMON_USER | wc -l` if [ "$WRPERM" != 0 ]; then echo Fixing file ownership on $AMON_DIR chown -R $AMON_USER.nginx $AMON_DIR fi cd / su $AMON_USER -s /bin/sh $0 "$@" exit elif [ $U != $AMON_USER ]; then echo "Should be run under $AMON_USER or root" exit 1 fi lockfile=$AMON_DIR/logs/plackup.$website start() { [ -x $plackup ] || exit 5 [ -f $AMON_APP ] || exit 6 echo -n $"Starting $website: " $plackup $plackup_args -a $AMON_APP 2>&1 > /dev/null retval=$? if [ $retval -eq 0 ]; then echo OK touch $lockfile else failure $"Unable to start" fi echo return $retval } stop() { echo -n $"Stopping $website: OK" if [ -f $PID ]; then kill `cat $PID` > /dev/null retval=$? [ $retval -eq 0 ] && rm -f $lockfile echo return $retval fi failure $"pid $PID not found" echo return 1 } restart() { stop start } case "$1" in start) $1 ;; stop) $1 ;; restart) $1 ;; *) echo $"Usage: $0 {start|stop|restart}" exit 2 esac
構成をnginxに追加します
vim /etc/nginx/conf.d/virtual.conf
upstream amon { server 127.0.0.1:5000; } server { listen *:80; location / { try_files /empty @backend; } location @backend { proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://amon; } }
すべて準備完了です!
おわりに
結論として、すべてが始まったインタビューから引用します。
Amon2について教えてください。 他のPerl Webフレームワークとはどう違うのですか?
Amon2は、非常にシンプルで信頼性の高い汎用Webフレームワークです。
Mojoliciousとの違い
Mojoliciousは悪くない、私はアプローチ自体が好きだ。 残念ながら、後方互換性はそこに保存されていません。 それどころかAmon2では。 後方互換性は名前の変更によってのみ破られると私には思えます。 大きな違いを生むことにしたとき、Amon3をリリースします。
Catalystとの違い
CatalystはMooseに依存していますが、Amon2は依存していません。 これは、アプリケーションをすばやくロードするためです。
ダンサーとの違い
Amon2とDancer2を含むDancerには実質的に違いはありません。
Mojoliciousとの違い
Mojoliciousは悪くない、私はアプローチ自体が好きだ。 残念ながら、後方互換性はそこに保存されていません。 それどころかAmon2では。 後方互換性は名前の変更によってのみ破られると私には思えます。 大きな違いを生むことにしたとき、Amon3をリリースします。
Catalystとの違い
CatalystはMooseに依存していますが、Amon2は依存していません。 これは、アプリケーションをすばやくロードするためです。
ダンサーとの違い
Amon2とDancer2を含むDancerには実質的に違いはありません。
もちろん、著者は控えめです。
そして今、私の私見:
- フレームワークは本当に非常に軽量です
- 日本人の徹底した完成度で書かれています。 これはコードで感じられます。
- プラックアップを書いた宮川は、2ペアブーツと呼ばれるものの2つのルーツを持っています。
結局のところ、このような多くのplackup + Amon2が使用され、推奨されます - 著者によると、「100万人以上」が使用しているフレームワークがそのように放棄されるのではなく、さらに発展することを願っています。
- フレームワークは比較的新しくモダンですが、cpanにはすでに膨大な数のモジュールがあります
- 全体的に良い印象を残しました。