Perl Hackers Hub

第18回Amon2によるWebアプリケーションの高速開発(1)

本連載では第一線のPerlハッカーが回替わりで執筆していきます。今回は普段Webアプリケーションの開発を行っているtokuhiromさんで、テーマはWebアプリケーションフレームワークAmon2です。

Amon2とは?

こんにちは。tokuhiromです。本稿では、筆者が中心となって開発を進めているAmon2というWebアプリケーションフレームワークについて説明します。

Amon2は、次のような特徴を持つWebアプリケーションフレームワークです。

PSGI/Plackベース

Amon2はHTTP::Engine/PSGI/Plackの開発/制定に初期のころから関わっている筆者が作成したWebアプリケーションフレームワークです。そのため、Plackの部品をできる限り利用することにより、少ないコードベースでWebアプリケーションフレームワークを実現しています。これにより学習コストが低くなっています。

PSGI ベースなので、FCGI、mod_perl2、CGI、Starman、Starletといったさまざまな環境で動作可能ですし、Test::WWW::Mechanize::PSGIのようなツールもすぐに使うことができます。また、Plackの豊富なミドルウェアをそのまま使えます。

非常に薄いフレームワーク

昨今のフレームワークの流れとは逆行しているかもしれませんが、薄いフレームワークとなっています。薄くおせっかいなことをしないフレームワークを使うことにより、いざちょっと凝ったことやトリッキーなことをしようとした場合にもすぐに対応が可能です(そして得てして仕事でコードを書いていると、そのようなことをせざるを得ないことは多々あるものですよね :P⁠⁠。

Plackをベースとした薄いフレームワークなので、Amon2に特化した知識を覚える必要はほとんどありません。大部分の知識はPlackやPerlのそれで済みます。Amon2について習熟することはPerl5について習熟することに通じることがほとんどなのです。

非常に薄いなら使わなくてもよいかなーと思ってしまいがちですが、いざ使わないで書いてみると案外面倒です。そのへんのギリギリのバランスをとっているのがAmon2です。

Sledgeを強く意識している

筆者は宮川達彦さんが中心になって開発してきた、Perl界隈で人気のSledgeというフレームワークを長らく使用してきたため、Amon2はSledgeを強く意識したフレームワークとなっています。Sledgeを利用してきた人ならば、容易に移行ができます。

WebSocketサポート

最近リリースしたAmon2 バージョン3.50 ではWebSocketサポートが追加され、WebSocketを利用したリアルタイムWebアプリケーションの開発も可能となりました。

バッチ処理のサポート

Webアプリケーションを書いていると、ほとんどの場合はコマンドラインのスクリプトやTheSchwartzやQ4Mなどの非同期ジョブキューなども使うことになるものです。このようなケースでも、Amon2では対応が容易です。設定ファイルの読み込みや、コンテキストオブジェクトの取り扱いはWebアプリケーションの場合とまったく変わらずに行うことができるように設計されています。

充実したJavaScriptライブラリ

最近のWebアプリケーション開発では、JavaScriptの存在を無視することはできません。Amon2ではセットアップスクリプトamon2-setup.plを実行すると、筆者の選定したJavaScriptライブラリが設置されます。これによりJavaScriptのライブラリが一通り使える状態から開発が始められ、無駄な手間がかかりません。Perlの開発がいくら楽になってもクライアントサイドの開発が面倒なままでは、高速で快適な開発はままなりませんからね。

ライブラリの選定基準は、単機能でシンプルでよくテストされているもの、ということになっています。つまり、Amon2の思想に合うものを選んでいます。

現在の最新版であるAmon2 3.53では、jQuery 1.8.2を中心ライブラリに据え、さらに次のようなユーティリティライブラリが添付されています。

es5shim.js

JavaScriptはEcmaScript 5によって進化して使いやすくなっていますが、その恩恵を受けられない環境もまだまだ多いのが現状です。es5shim.jsはそのような環境にもEcmaScript 5の多くの機能をバックポートしてくれるライブラリです。

sprintf.js

JavaScriptでsprintf()を使えるようにするライブラリです。sprintf.jsを使うことできれいなコードを書くことができます。

var str = sprintf("%s %3d", x, y);

strftime.js

日付を文字列フォーマットするstrftime()関数を提供します。

var str = (new Date()).strftime(
    "%Y-%m-%d(%a) %H:%M:%S"
);

micro_template.js

jQueryの作者John Resigさんがブログで紹介していた、JavaScriptを埋め込めるテンプレートエンジンです。シンプルながら実用的なので愛用しています。

micro-location.js

cho45さん作の、URIの操作を行えるライブラリです。

大規模から小規模まで

筆者の見解では、サイトの規模によってフレームワークを使い分けるのは面倒です。できるだけ1つで済ませたい。Amon2では、そのようなわがままな要望に応えるべく、Amon2とAmon2::Liteという2つのバージョンを用意しています。大規模なアプリケーションを書く場合にはAmon2を使用し、RubyのSinatra風の簡単なWebアプリケーションを書きたい場合にはAmon2::Liteを使う、という風に使い分けることができます。

互換性を重視している

Amon2は、安定性と高速性を重視したWebアプリケーションフレームワークです。仕事で使うことを強く意識しているので、仕様なども非常に安定していて、フレームワークの作者にふりまわされることのないように作っています。昨今のWebアプリケーションフレームワークは、進化の速度を重視して互換性をないがしろにしているものもありますが、それではフレームワークのアップデートに追われるばかりで、本来やりたいサービスの安定運用や機能追加に集中できません。そのようなことがないように、Amon2は安定したインタフェースを提供しているのです。Amon2では、互換性のない変更はAmon3を出すときまでしない方針になっていて、事実Amon2はリリースされて以来、互換性を破壊するような変更はされていません。

高いセキュリティ意識

Webアプリケーションがいかに優れていても、セキュリティがズタボロでは仕方ありません。Amon2でははせがわようすけさんをはじめとする専門家の方の意見を聞きながら、現実的なセキュリティ対策を取り入れ、セキュアなWebアプリケーションを作れるように努力しています。

具体的には、次のような対策をとっています。

  • CSRFCross-Site Request Forgeries対策としてトークンの発行/バリデーションを行っている
  • 型ベースのHTMLエスケープを採用することにより、XSS(クロスサイトスクリプティング)に強いText::Xslateを全面的に採用している
  • JSONJavaScript Object Notation出力時にHTMLタグをエスケープすることにより、古いInternet Explorerでの安全性を向上させている
  • 古いAndroidの端末の脆弱性に対応するために、安全性が確認できない場合にはステータスコード403 Forbiddenを返す
  • X-Content-Type-Options: nosniffヘッダをデフォルトで送出する設定にしている(Internet Explorerが自動でContent-Typeを推測する機能をオフにし、XSSを防止するため)

実績

NHN JapanをはじめとするPerlを使用しているいくつかのWeb企業で採用されています。大規模/高トラフィックなWebアプリケーションにも使用されているので、安心して使えます。

<続きの(2)こちらです。>

おすすめ記事

記事・ニュース一覧