前回の記事でいっぱいはてぶがついてびっくりしています。
試験も無事終わったので、MENTAを実際に試してみました。その結果、前回の記事にいくつか間違いが含まれていることが判明。ここでお詫びとともに、正しいドキュメントを記したいと思います。
MENTAを使うための準備
まずはMENTAの導入です。と言っても、MENTAのファイル一式をダウンロードするだけで完了です。
$ cd ~/public_html/menta <- ここに置くことにします $ svn co http://svn.coderepos.org/share/lang/perl/MENTA/trunk/ ./
svnコマンドはSubversionのコマンドなので、インストールされていない場合は先にインストールしてください。
$ sudo apt-get install subversion
以下ではMENTAのver0.13を使って説明しています。
追記 : mattnさんからご指摘いただきました。最新版の0.14が公開されているようです。
http://github.com/tokuhirom/menta/tree/masterを開き、Downloadをクリックすると、zipかtarでダウンロードができます。
$ cd ~/public_html/ $ tar xvfz tokuhirom-menta-7f2618648884908efd820c8e1db14079209a299d.tar.gz $ mv tokuhirom-menta-7f2618648884908efd820c8e1db14079209a299d menta014
0.14ではあとで出てくるバグが修正されているようです。ただ、こちらには付属モジュールが入っていないようなので、0.13のファイルに上書きして使用することにします。
$ mv menta014/* menta
MENTAのファイルの説明
MENTAのファイルの構成を説明します。開発で必要になるのは以下のファイルとディレクトリです。
- app/ ... 自分のアプリケーション本体を置く
- controller/ ... 動作(コントローラ)とテンプレート
- data/ ... データベースなど
- static/ ... CSSやJavaScriptなど
- bin/cgi-server.pl ... 簡易テストサーバ
- extlib/ ... 付属モジュール
- lib/ ... MENTA本体
- MENTA.pm ... MENTAで利用できる便利な関数群
- plugins/ ... 自分が作成する汎用関数を置く
- menta.cgi ... 設定
- config.pl ... 設定(上との違いが分からない)
主にいじるのはapp/内で、場合によってplugins/にスクリプトを追加します。全体の設定はmenta.cgiもしくはconfig.plでできます。
追記 : (補足) ver0.14から、extlib/がcgi-extlib-perl/に変更になっていますが、そのままだとパスが通っておらず、動きません。なので、ここではextlib/を使用することにします。
デモを実行してみよう
MENTAにはHTTP::Serverによる簡易サーバがついているので、Apacheがインストールされていなくてもテストができます。
ただし、
$ perl bin/cgi-server.pl HTTP::Server::Simple: You can connect to your server at http://localhost:5555/
このあと、http://localhost:5555/にアクセスするとデモが実行できるはずです。はずなのですが、実はMENTAのバグで実行できません。
Global symbol "$pakcage" requires explicit package name at lib/MENTA.pm line 348, line 16. BEGIN not safe after errors--compilation aborted at lib/MENTA.pm line 351, line 16. Compilation failed in require at ./menta.cgi line 5, line 16. BEGIN failed--compilation aborted at ./menta.cgi line 5, line 16.
lib/MENTA.pm を開き、348行目の "$pakcage" を "$package" に修正してください。
$plugin_loaded{$plugin} = $package;
そして先ほどのページを更新すると、以下のようなページが表示されます。これでデモ完了。
追記 : ver0.14ではこのバグは修正されています。
コントローラを作成
コントローラを追加して、http://localhost:5555/mlist といったURLでメンバーリストを表示するページを作りたいとします。./app/controller/mlist.pl を編集しましょう。
$ cd ./app/controller $ vi mlist.pl <- New File
このコントローラは、以下のようになるはずです。
use MENTA::Controller;
sub run {
my @user_data = get_members();
render("header.html");
render_and_print("mlist.mt", @user_data);
render("foot.html");
}
MENTAで出力を行うには、以下の関数を使います。
- render ... 静的な表示
- render_and_print ... テンプレートへの適用
これらの関数は./lib/MENTA.pmに記述されています。
もちろん、http://localhost:5555/mlist?p=2のように、クエリを受け取ることもできます。これには関数paramを使います。
sub run {
my $page = param("p");
}
なんて楽なんでしょう。
テンプレートを使ってみる
MENTAではMojo::Templateの変種(?)のMENTA::Templateというものを使います。拡張子は「.mt」です。以下にメンバーの一覧表示の例を示します。
? my @user = @_;
<html lang="ja">
<head>
<title>メンバーリスト</title>
</head>
<body>
?= scalar @user;
<ul>
? for (@user) {
? my ($name, $mail) = @$_;
<li><?= $name ?> - <?= $mail ?></li>
? }
</ul>
</body>
</html>
このテンプレートは、Masonのように、HTMLの中にPerlコードを記述できるタイプのテンプレートです。行頭が 「?」もしくは「?=」で始まっている行はPerlコードです。このうち、後者は戻り値をそのまま表示します。
また、インラインのPerlコードは「<?= ?>」というタグの中に記述します。
これをコントローラから利用するには、関数render_and_printを使います。
render_and_print("mlist.mt", @user_data);
第2引数以降は配列@_としてテンプレートに渡されます。
また、ここで使えるPerlコードでもMENTAの標準関数が使えます。つまり、テンプレートの前後に render("header.html")とrender("footer.html")を入れることができるのです。こうするとコントローラの行数が減っていいですね。
プラグインを作ってみる
コントローラでの汎用関数はプラグインにすることができます。プラグインは./pluginsに置きます。
ここでは、データベースからユーザの情報を取り出すための関数を記述することにします。ファイル名は./plugins/sql.plとします。
package MENTA::Plugin::Mlist::SQL;
use wargnings;
use strict;
use MENTA::Plugin;
use DBI;
use SQL::Abstract;
sub sql_get_dbh {
# hoge hoge
return $dbh;
}
sub sql_get_select_sth {
# hoge hoge
}
パッケージ名は他と被らなければ何でも良さそうです。必要なのは use MENTA::Plugin; だけですね。
あと、サブルーチンの名前に、ファイル名と同じ文字列をつけなければいけないようです。この場合、「sql.pl」としたので、プリフィックスとして「sql_」をつけています。
MENTAの設定
最後にMENTAの設定についても触れておきます。設定は./menta.cgiで行います。
MENTA->run_menta({
# MENTA 自体の設定
menta => {
# 省略
},
# あなたのアプリの設定
application => {
title => ‘メンバーリスト’,
sql => {
dsn => ‘DBI:mysql:mlist’,
user => ‘eitarow’,
pass => ‘ru-ru-ru-‘,
cc => ‘utf8’,
},
},
});
ここで設定した内容はアプリケーションのいたるところで利用できます。利用するには以下のようにします。
my $db_user = MENTA::config->{application}->{sql}->{user};
MENTAの標準関数
ディレクトリのパス参照
- base_dir() … /home/eitarow/public_html/menta/ (以下では単に「./」と表記する)
- controller_dir() … ./app/controller/
- data_dir() … ./app/data/
- static_file_path() … ./app/static/
HTML出力
- render(“static.html”) … static.html の内容を表示
- render_and_print(“tmpl.mt”, @params) … tmpl.mt に値@paramsを適用して表示
クエリ操作
- param(“query”) … クエリの指定要素の値を返す(この場合「?query=test」)
- is_post_request() … REQUEST_METHODがPOSTならば真を返す
文字列操作
- escape_html(“string”) … 文字列をHTMLエスケープします(例 : <, >, & => <, >, &)
- unescape_html(“string”) … HTMLエスケープを解除します(上の逆)
- raw_string(“string”) … よくわからないです… 文字列をText::MicroTemplate::EncodedStringにして返すみたいです
URL関連
- docroot() … URLのベース部を返す(http://localhost:5555/ など)
- currenct_url() … 現在のURLを表示
- redirect(“http://www.url.com/”) … http://www.url.com/にリダイレクト
- uri_for($path, $query_hash) … 指定引数からURLを生成。$pathはdocrootからの相対パスであり、$query_hashはキーと値を入れたハッシュのリファレンスです。(例 : uri_for(“bbs/thread_list”, { page => 2, view=> “list” }); )
その他
- upload(“query”) …
よくわかりません…誰か教えていただけるとありがたいアップロードしたファイルのファイルハンドル(かつファイル名) - mobile_agent() …
こちらも分からないです。名前からケータイ関連だってことは分かるんだけどHTTP::MobileAgentオブジェクトを返す。
まとめ … 結局どうなの?
何よりドキュメントがほとんどないので、取っつきにくいです。あまりコード例が公開されていないので、mattnさんのブログエンジンはとても為になりました。
Big Sky :: Perlの軽量Web Application Framework「MENTA」を使ったブログエンジン作った。
http://mattn.kaoriya.net/software/lang/perl/20081113190801.htm
自分としては機能的に申し分ないです。柔軟性もありますし、他のフレームワークより断然速い。これからお気に入りとして使わせていただこうかと思います!
あとはセッション管理とかが標準でできてくれればもっと楽ができるのだけど、そうするとSledgeになっちゃう?
追記 : plugins/session.pl にセッション管理用のプラグインがありました。バンドルプラグインについてはまた次の機会に記事にしようかと思います。




リンクありがとうございます。最新のMENTAですが
http://github.com/tokuhirom/menta/tree/master
から取得出来ます。上記pakcageのtypoも修正済みかと思います。
>> mattnさん
ご指摘ありがとうございます!
最新版を試してみると、typoは修正されていたので、
記事をそのように修正、追記しておきました。