はじめにSledgeを知らない人のために。免責事項あくまでもこの文書はPerl暦実質4年程度でMVCフレームワークを使った開発を始めてSledgeで体験したの19歳の学生が書いたものです。内容に一部誤りがある可能性があります。これを信用してSledge環境を構築/利用して何らかの損害が発生しても一切責任は取れませんのでご了承下さい。間違っている部分がありましたらTwitterかコメント欄、トラックバック等でご指摘・ご教授頂けると有難いです。あと、やたら長いですが怒らないで下さい。SledgeとはMVCフレームワーク*1です。Perlを使って手軽にWebアプリケーション*2を作る事が出来ます。(Webアプリケーションとして作るメリットとデメリットはWikipediaを参照。)似たようなものにCatalyst、CGI::Application、MENTA、Ark等があります。Sledgeを使うメリットWebアプリケーションを比較的楽に作成する事ができます。mod_perl環境で動作する事を前提に作られています。自分で書いたコードがmod_perl環境で動作する事を前提に作られていれば、mod_perl環境でもほぼ確実に動作します。CGI環境でもソースコードを殆ど変更せずに動作します。デフォルトでSQLデータベースサーバーを使ったセッション管理をほとんど意識せずに行う事が出来ます。SourceforgeとCPANで多数のモジュールが提供されています。mod_perl2に対応していません。(ただし自分で改造して対応する事は可能です。)インストールにmod_perlが必要です。PerlなのでforceインストールすればCGIモードは使えるかも。)CGI環境で運用する場合、動作速度に難があります。スペシャルサンクスこのドキュメント(もどき)は以下のWebページやドキュメントをさせて頂きました。ありがとうございました。Sledgeの動作環境Sledgeの動作には次のソフトウェアが必要です。Ver.5gccmakeまずはこれらをインストールしましょう。makeとgccは殆どの場合デフォルトで入っていると思います。FreeBSDならportsでapache13-modperl*4とmod_perl*5とperl5.12*6をインストールしちゃえばOKだと思います。installしなきゃいけないかもしれません。Sledgeのインストールには次のPerlモジュールが必要です。Apache::RequestApache::ReloadCGITest::InlineCarp::AssertClass::FieldsClass::AccessorClass::Data::InheritableClass::SingletonClass::TriggerDigest::SHA1File::SpecFile::TempHTML::FillInFormHTML::TemplateHTML::StickyQueryIO::StringyJcodeLWPTest::SimpleTest::HarnessTime::HiResURIErrnoTemplateData::PropertiesErrorStorableEncode::compatここまではBundle::Sledgeでインストール出来ます。これらは展開したディレクトリ内のeg/prereq-modulesに記述されています。これ以外にもDBIとか使ってるので、もしインストールされていなければtestをするときにエラーが出るかもしれません。SledgeのインストールSledgeはここでダウンロード出来ます。Unixはfetch、Linuxはwgetでダウンロードすると良いでしょう。いや別にw3mやlynxでダウンロードしてもいいですけど。http://sourceforge.jp/frs/redir.php?m=jaist&f=%2Fsledge%2F8401%2FSledge-x.x.tar.gzさて、ダウンロードが完了したら早速展開て展開先のディレクトリに移動しましょう。./Sledge-x.xここからが正念場です。Sledgeの依存モジュールをインストールしましょう。スーパーユーザーになるのを忘れてはいけません。Bundle::SledgeもしPerlを導入したばかりであればインストールすら始まらないうちにエラーが出るかも知れません。その場合、YAMLモジュールをCPANを使わずに手動でインストールしてcpanの設定を適切に設定し直せば正常に動作する可能性があります。PASSが出ればインストールは成功します。依存モジュールのインストールが完了したらSledge本体のインストールに移りましょう。Makefile.PLでMakefileを生成しましょう。Sledgeと表示されればOKです。ここで、Apache::RequestやApache::Reloadが表示されていたらmod_perlのインストールに失敗しています。それ以外のモジュール名が表示された場合はそのモジュールのインストールに失敗しています。OKならば次のステップに進みましょう。testmakeはよっぽどの事が無い限り通ります。16.という警告が表示されるかもしれませんがこれらは無視しても問題有りません。returnedと表示された場合はそのtestに失敗しています。1.というエラーが表示されました。上のエラーについてはここを見て対処して下さい。下のエラーは/tmpを別のパーティーションにしていると起きるエラーです。このエラーが起きているとファイルのアップロードが行えません。別で提供されているSledge-Plugin-SaveUploadを導入すればエラーが出る部分の代替機能が提供されるのでこのエラーは無視して大丈夫です。(ただし、その場合linkではなくsaveを使う事になります)さて、OKならついにインストールです。インストールはスーパーユーザーで行わなければならないのでスーパーユーザーになるのを忘れないで下さい。rehashこれでインストールは完了です。新しいフレームワークを使い始めるときはHelloWorldから。Sledgeを使ったWebアプリケーションを作る前にまずはセッションの管理方法とテンプレートについて決めてしまいましょう。Sledgeのセッション管理モジュールには主に使われるもので次のものがあります。<Sledge::Session系>(サーバー側のセッションの管理方法を決めるモジュール)Sledge::Session::Fileファイルを使ってセッションを管理します。Sledge::Session::MySQLMySQLを使ってセッションを管理します。Sledge::Session::PgPostgreSQLを使ってセッションを管理します。Sledge::Session::SQLiteSQLiteを使ってセッションを管理します。<Sledge::SessionManager系>(セッションIDの受け渡しの方法を決めるモジュール)Sledge::SessionManager::CookieCookieを使ってセッションIDの受け渡しを行ないます。Sledge::SessionManager::StickyQueryQUERY_STRINGからセッションIDを受け取ります。セッションIDはHTMLに埋め込んで渡します。Sledge::SessionManager::RewriteSledge::SessionManager::StickyQueryとほぼ同じ事をmod_rewriteを使って行ないます。<特殊なセッション管理を行うモジュール>(特殊な動作をします。詳しくはpodを読んで下さい。)Sledge::SessionManager::CookieStoreCookieにセッションデータを埋め込みます。別口でインストールします。Sledgeのテンプレート処理モジュールには主に使われるもので次のものがあります。<Sledge::Template系>(テンプレートの処理方法を決めるモジュール)Sledge::TemplateHTML::Templateを使ってテンプレートを処理します。Sledge::Template::TTTemplate-Toolkitを使ってテンプレートを処理します。今回は例としてSledge::Session::FileSledge::SessionManager::CookieSledge::Template::TTを使ってソースコードを書いていきます。雛形の作成まずは雛形を作りましょう。Sledgeのインストール時に同時にインストールされるsledge-setupを使います。今回は公式CVSにあるサンプルと同じディレクトリ構成で作ることを想定します。今回はHelloWorldという名前でプロジェクトを作ります。Sledgeで作ったWebアプリケーションを/usr/local/www/sledge/上にディレクトリを作ってそこに置く事を想定します。teamといった表示が出れば成功です。これでプロジェクトの雛形が出来ました。次にプロジェクトの設定を行います。table.とありますが今回はセッション管理にSledge::Session::Fileを使うので2)は行う必要はありません。(もちろん、データベースを使ったセッション管理を行う事も想定する場合はこの限りではありません)まずは、エディタで./HelloWorld/Config/_common.pmを開きましょう。vimでもemacsでもnviでも何でも良いです。するとこんなソースが見れる筈です。undef;1;SledgeではこのCという連想配列を使って設定情報を管理します。編集していきましょう。$C{TMPL_PATH}でテンプレートが保存してあるディレクトリを指定します。(今回は/usr/local/www/sledge/HelloWorld/view/ですね)つぎに、今回は$C{DATASOURCE}は使用しないのでコメントアウトします。(もちろん、データベースを使ってセッション管理をする場合は必要です)そして、今回はSledge::Session::Fileでセッション情報を保存するディレクトリを指定するので$C{SESSION_DIR}を設定します。$C{COOKIE_*}にはセッションCookieの名前やその有効ドメインや有効パスが入っています。そのままでも動作はしますがセッションIDが漏れてしまい、なりすましに利用される恐れがあります。nameではクライアントにSledgeを使ってWebアプリケーションを作っている事が分かってしまい、Sledgeの脆弱性*7を突いた標的にされやすくなってしまいます。Cookieの適切に設定を行う事でより安全なWebアプリケーションを作成する事が出来ます。warnings;もした方が良いです。'hoge.net';1;こんな感じになると思います。次に、./HelloWorld/Pages.pmを編集します。デフォルトのPages.pmは以下のようになっていると思います。$sid);}1;ソースを読めば分かる通り、Pages.pmではクラスのオブジェクト作ってそれを返す事だけをしています。違う方法でセッション管理をしたかったり、違うライブラリの提供するテンプレートを使いたかったりしたい場合には、ここでオブジェクトを生成するクラスを変えて、さっきの_common.pmでそのクラスで使用するオプションを適切に設定すればOKです。今回はSledge::Session::MySQLでは無くSledge::Session::Fileを使うので以下のようになります。$sid);}1;これでプロジェクトの設定は完了です。テンプレートの作成テンプレートについてはHTML::TemplateやTemplate-Toolkitの資料がWebに大量にあるので、そちらをを参照して下さい。ここのプロジェクトでは以下の様なテンプレートがあると仮定します。%]で動作しています。</body></html>これを先ほど指定した$C{TMPL_PATH}*8にindex.htmlとして保存して下さい。拡張子は必ず.htmlでなければならない点に注意して下さい。.tmpl等で保存してはいけません。[2010/8/16追記]html以外の拡張子を使う事も可能ですが後述するdispatch_*メソッドで、テンプレートを*.htmlとして自動的に読み込む事が出来ないのでload_tmplメソッドで別途テンプレートを読み込む必要があります。Pagesクラスの作成Webアプリケーションの本質的な処理を行う、Pagesクラスを作成します。このクラスで先程の./HelloWorld/Pages.pmを継承させる事でPagesクラスになります。クラス名は何でも良いんですがここではHelloWorld::Pages::Indexとしましょう。HelloWorldと表示してmod_perlで動いているかCGIで動いているか教えてるページを先程のテンプレートを使って作って表示したい場合こうなります。);}1;では各所の意味を解説していきます。__PACKAGE__->tmpl_dirname('.');ここでテンプレートの存在するディレクトリを、先ほど指定した$C{TMPL_PATH}からの相対パスで指定しています。今回は$C{TMPL_PATH}に直接テンプレートを置いたので.を指定していますが、.の場合はこの行は省略可能です。);}ここがWebアプリケーションの実質的な核になります。ここで入力に応じて処理を行って結果を返したりリダイレクトしたりするわけです。dispatch_*の*には好きな名前をいれる事が出来ます。好きな人の名前でもOKです。実際は提供する機能の名前を入れる事になるでしょう。このサンプルではHelloWorld!を表示するのでhelloとしています。このdispatch_helloの場合はhelloがデフォルトのテンプレート名になるので、hello.htmlをテンプレートとして利用します。別のテンプレート(hoge)を利用したい場合は、$self->load_template('hoge');とするとテンプレートとしてhogeを利用します。);ここでテンプレートモジュールに渡すパラメータを指定しています。$ENV{MOD_PERL}が定義されていればmod_perlで動作しています。このdispatch_*メソッドはひとつのモジュール内にいくらでも作成する事が出来ます。実際には別のクラスに分けて作成した方が機能拡張時に有利に働く場合が多いでしょう。理由は別の機会に解説すると思います。要するに、ユーザーがアクセスするファイルですね。このファイルにユーザーがアクセスすると、このSledgeプロジェクトが実行されることになります。シンプルなトリガは以下のようになります。HelloWorld::Pages::Index;HelloWorld::Pages::Index->new->dispatch('hello');もちろん、mod_perlとして動作させる場合は#!/usr/bin/perlは不要です。必要に応じて/usr/bin/perlは実際のPerlのパスに書き換えて下さい。これを/usr/local/www/sledge/HelloWorld/htdocs/にindex.cgiとして保存してこの工程は完了です。これもファイル名は自由に決めてOKです。仕上げまずは実行出来る状態にするためにパーミッションを変えます。/usr/local/www/sledge/HelloWorld/次に、httpd.confを編集します。mod_perlとして動作させる場合は、〜に以下のものを追加して下さい。</Location>CGIとして動作させる場合は、〜に以下のものを追加して下さい。</Directory>こんな感じで設定したらapacheの再起動をかけます。これでSledgeを使ったWebアプリケーションが実行出来る環境が整いました。あとはhttp://hoge.net/helloworld/index.cgiにアクセスすれば良いと思います。(localでテストする場合はhostsにhoge.netを追加するのを忘れずに!)まとめマニュアルって書くの大変なんですね。マニュアル書くつもりがチュートリアルになっとる。初心者には分かりやすいかなぁ。理解しがたいところは解説したつもりです。最後まで読んで頂き有難う御座いました。アドバイスを書いていって下さい。*1:ライブラリや枠組みを提供するライブラリ。*2:ウェブの機能や特徴を利用したアプリケーションの事。Document*4:/usr/ports/www/apache13-modperl/*5:/usr/ports/www/mod_perl/*6:/usr/ports/lang/perl5.12/*7:本当にあるか、どんなものがあるかは知りません。頭を悩ませながらのんびり作ってます。いってきたたたたた#1も#2も行ったけど#1のレポ牡蠣忘れてたのでついでにかく。SledgeのPSGI対応について。Entries最近の人気記事Archiveはてなブログをはじめよう!karupaneruraさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。