ついに出た!最新Perlフレームワーク「Ark」徹底解剖

第1回Arkって何だ? ―Ark が生まれるまで

はじめまして。面白法人カヤックの村瀬と申します。ArkというWebアプリケーション作成用のフレームワークを開発しました。今回から4回にわたって、このリリースしたばかりのArkについて紹介させていただきます。

Ark(アーク)とは

Arkは、Perlで作られたWebアプリケーションフレームワーク(WAF)です。

Arkの特徴としては

  • Catalystに似たインターフェース
  • CGI/FCGI/mod_perlなどさまざまな環境で実用的に動作する
  • CGI用モードの存在
  • 日本製であり、日本語ドキュメントが充実している

などが挙げられます。

Catalystに似たインターフェース

Catalystは、Arkと同様にPerl製のWebアプリケーションフレームワークで、現在、Perlのフレームワークでは標準となりつつあるものです。

Arkは開発動機の1つが「CGIでも実用的に動作するCatalyst」を作ることだった(後述)こともあり、Catalystの影響を強く受けて開発されています。

そのため、Catalystの仕様をそのまま引き継いでいる部分も多く、Catalystでの開発経験のある方であれば、すぐに使いこなすことができるようになっています。

カヤックでも現在いくつかのサービスをArkを使用して開発していますが、Catalystの使用経験のあるプログラマはすんなりと移行できているようです。

CGI/FCGI/mod_perlなどさまざまな環境で実用的に動作する

Arkは、HTTP::Engineというライブラリの上に実装されています。

HTTP::Engineは、RubyのRackPythonのWSGIなどと同じように、CGI/mod_perlといったバックエンドの違いによるアプリケーションの実装の違いを吸収してくれるライブラリで、これを使用すると開発者はバックエンドの違いを意識することなくWebアプリケーションを開発することができます。

つまり、Arkアプリケーションは、同じコードでさまざまな環境で動作させることが可能です。

CGIモード

どの環境でも同じコードで動作するといっても、実際には環境によって大きな違いがあります。CGIという環境は、リクエストがあるたびにアプリケーションを起動し、処理します。

一方、FCGIやmod_perlという環境ではあらかじめ立ち上がっているアプリケーションがそのまま複数のリクエストを処理できます。

このような環境の違いは、アプリケーションの実装に大きく影響を及ぼします。

たとえば、アプリケーションの初期化処理を考えてみたときに、CGIでは毎回プロセスが立ち上がるので毎回初期化処理がされます。しかし、FCGIなどの永続プロセスではリクエストの処理は立ち上がっているプロセスが使い回されるため、初期化処理は起動時のみに行えばいいということになります。

そのため、FCGI/mod_perlに最適化した場合、起動時に必要なすべてのモジュールをロードしすべての設定をすませてしまう、というのが効率的ですし、逆にCGIの場合にはそのリクエストに必要なファイルだけをロードし、初期化のコストを最小限に抑えるのが効率的です。

このような最適化処理の違いに対応するため、Arkでは2種類の動作モードを用意しています。

通常のモードは、起動時にすべてのコンポーネントをロードします。もう1つのminimal_setupモード(CGIモード)ではリクエストに対し必要なファイルを必要になったときにロードします。

このCGIモードがあることで、CGIのような環境でも実用的に使用することを可能にしています。このモードがあることが、Catalystとの大きな違いと言えるでしょう。

日本製である

Arkは日本製のアプリケーションなので、ドキュメントももちろん日本語で書かれています。また、こちらも後述しますが、ドキュメントを充実させることにも力を入れています。

Catalystが普及してきたといってもまだまだ日本語のドキュメントが充実しているとは言い難い状況ですので、今から新しくフレームワークを学ぼうという人は、Arkも選択肢のひとつとして見ていただけたら幸いです。

Arkを作るきっかけ

社内専用フレームワーク

カヤックでは、BM11(ぶっこみイレブン)というラボチームが毎年たくさんのサービスをリリースしています。2007年は77個、2008年は88個のサービスをリリースし、そして今年は99個のサービスをリリースする予定です。

BM11のPerlチームは、BM11設立当初より、開発フレームワークにCatalystを採用してきました。ですが、BM11のサービスの多くは1機能のシンプルなWebサービスであり、Catalystよりもう少し軽いフレームワークが欲しいなという声がありました。

実際に、昨年ぐらいから軽量フレームワークが相次いでリリースされました。

それらも評価したのですが、やはりCatalystに慣れてしまっているため、なかなか移行するところまでは至りませんでした。

  • 「Catalyst と同じように使えるもっと軽量フレームワークが欲しい…」

そのようなBM11メンバーの心の叫びが開発の動機の1つとなっています。

フレームワークから言語を覚える

最近フレームワークを使うために言語を覚える、もしくはフレームワークを使うことで言語を覚える、というような人が増えています。

たとえば、RailsRubyを覚えるとか、DjangoをやるためにPythonを勉強すると言う話をよく聞きます。

しかし、Perlはどうでしょうか。

CatalystでPerlを覚える、というような話はなかなか聞いたことがありません。

  • 「Perl でもそういうフレームワークがでてくるといいなぁ。」

このようなことを常々考えていたので、どうせフレームワークを作るならそのフレームワークで Perl をはじめる人を増やしたいと考えています。そのため、Perlを勉強しはじめた人でも理解しやすいように、Arkではドキュメントにも力を入れています。

Arkでできること

Catalystほぼ互換のURLディスパッチャー

Arkは、Catalystとほとんど同じ URL ディスパッチャーを持っています。

通常のWebアプリケーションフレームワークでは、URLとコントローラの結び付けを別途何らかの方法で定義する必要がありますが、Catalystの仕組みはコントローラを書くだけでそのURLが一意に定まるという点で優れています。

Arkでは、Catalystのディスパッチャーから以下の代表的なアクションのみを採用しています。

DispatchType::Pathリクエストパスベースのアクション
DispatchType::Regex正規表現によるアクション
DispatchType::Chained複雑なURLを実現するための特殊なアクション

Catalystとの違いは、この3つ以外のCatalystが特殊扱いをしているディスパッチャーをすべて廃止している点です。それらの特殊なアクションはすべてこれらの代表的な3つのアクションで代用可能なため、なるべくシンプルにするためにArkでは採用しませんでした。

セッション・認証

セッションや認証など、よく使う機能はプラグインとして提供します。

現在提供するプラグインは以下となっています。

Ark::Plugin::Authentication認証プラグイン
Ark::Plugin::Authentication::Credential::OpenIDOpenID認証
Ark::Plugin::Authentication::Credential::Passwordパスワード認証
Ark::Plugin::Authentication::Store::DBIx::ClassDBIx::Classを使用した認証
Ark::Plugin::Authentication::Store::MinimalHASHリファレンスに格納したデータを使用するプラグイン
Ark::Plugin::Authentication::Store::Model任意のモデルを認証データとして使用するプラグイン
Ark::Plugin::Encoding::Nullエンコーディングを未変換でアプリケーションに渡すプラグイン
Ark::Plugin::Encoding::UnicodeUTF8のエンコーディングをハンドリングするプラグイン
Ark::Plugin::Sessionセッションプラグイン
Ark::Plugin::Session::State::CookieセッションIDをcookieに保存するプラグイン
Ark::Plugin::Session::State::URIセッションIDをURIクエリに保存するプラグイン
Ark::Plugin::Session::Store::Memoryセッションデータをメモリーに保存するプラグイン
Ark::Plugin::Session::Store::Modelセッションデータを任意のモデルに保存するプラグイン

セッションは、セッションIDを保存する場所としてCookieとURIがサポートされ、セッションデータを保存するバックエンドにはCache::FastMmap、memcached、データベースなどさまざまなストレージを使用可能です。

認証プラグインはセッションプラグインの上に実装されており、現在はパスワード認証とOpenID認証をサポートしています。

モデル・ビュー

Arkでは組み込みでデータベースにアクセスするORマッパーや、テンプレートエンジンなどのライブラリを持ちません。その代わりに、CPANに登録されている膨大なモジュールを用途に応じて自分の好きなものと組み合わせて使用できるように設計されています。

この部分も次回以降詳しく説明します。

組み込みWebサーバ

Arkは開発スピードをあげるために組み込みの開発サーバを持ちます。ApacheなどのWebサーバを別途用意しなくても、Perlの動く環境さえあれば動作の確認が行えます。

また、開発サーバはデバッグモードで走らせるとコンソール上にデバッグに役立つさまざまな情報を表示したり、エラーが起きたときにブラウザ上でスタックトレースを表示したりなど、開発をサポートする機能も持っています。

まとめ

今回はざっくりとArkの概要を説明しました。興味のある方はぜひ使ってみてください。

次回からは具体的に Ark アプリケーションの作成方法を解説していきます。

おすすめ記事

記事・ニュース一覧