はじめに
mojoliciousを使ってみたくなったのでメモ。
おもに下記2つのサイトを参考にさせていただきました。
主な流れは2の方をメインに参考にし、Mojoliciousについてのチュートリアル的なものは1の方を参考にしました。
アジェンダ
1. plenv環境ととのえる
これは以前書いた記事があり、今回使う環境とまんま同じなのでこれを参考にしてみてください。
また、後述するさくらVPS x perlbrewと合わせるためにversionはperl5.16にしました。
→【perl】plenvでperl x cpanm x carton環境を作る - mac編
$ plenv versions system 5.18.0 * 5.21.1 (set by /Users/hoge/.plenv/version) $ plenv install -l ・・・ 5.16.3 ・・・ $ plenv install 5.16.3 $ cd アプリケーションディレクトリ $ plenv local 5.16.3 $ perl -v This is perl 5, version 16, subversion 3 (v5.16.3) built for darwin-2level
2. carton x plackup環境ととのえる
こちらもですがcartonだけ別記事に出してあったのでその参照を載せます。
ついでにplackupしてみている記事なのでちょうどいいですね。
→【perl】Perl module 依存マネージャーcartonをmac × plenv × cpanm環境で使うメモ
説明は上記記事にまかせるとしてコマンドのられつをば。
※ 移動 $ cd アプリケーションディレクトリ ※ cartonインストール $ plenv exec cpanm Module::Install $ plenv exec cpanm Carton ※ carton管理するモジュールをcpanfileに書く $ vi cpanfile ---- vi ---- requires 'Task::Plack'; ------------ ※ モジュールいれる ※ Task::Plackのインストールは結構時間かかりますね。。。 $ plenv exec carton install ※ 念のため $ plenv rehash
3. plackやMojoliciousいれる
plackは2で入れているので、cpanfileの中身はその続きから進めます。
※ mojoliciousの行を追加 $ vi cpanfile ---- vi追記 ---- requires 'Mojolicious'; ---------------- $ plenv exec carton install Installing modules using /Users/hoge/app/app-first/cpanfile Successfully installed Mojolicious-6.12 1 distribution installed Complete! Modules were installed into /Users/hoge/app/app-first/local ※ ドキュメントが表示されれば入ってる $ carton exec perldoc Mojolicious
ここまでの構成
一応ここまででアプリケーションディレクトリ
がどんな感じか見てみます
$ cd アプリケーションディレクトリ $ tree -L 2 . . ├── cpanfile ├── cpanfile.snapshot └── local ├── bin ├── cache ├── lib └── man
4. 小さなMojoliciousアプリケーション作って実行してみる
アプリケーションの内容は下記のサイトのまんま作ってみます。
→一番小さなWebアプリケーション | Mojolicious入門
このサイトは非常にわかりやすいのでMojoliciousについてはまずは目を通すとわかりやすいと思います。
というわけで早速作る。
※ 移動 $ cd アプリケーションディレクトリ ※ Mojoliciousアプリ作る $ vi webapp.pl ---- vi作成 ---- use Mojolicious::Lite; get '/' => sub { my $self = shift; $self->render(text => 'Hello World'); }; app->start; ---------------- ※ Mojoliciousアプリ立ち上げ $ carton exec morbo webapp.pl Server available at http://127.0.0.1:3000
morboコマンドでで開発用のサーバとともにMojoliciousアプリが起動しました。
Server available at http://127.0.0.1:3000
と表示されているとおり
ブラウザでhttp://127.0.0.1:3000
にアクセスするとHello World
と表示されます。
開発環境なのでnginxなどなくてもこれで開発&確認が進められます!
便利!
5. 小さなMojoliciousアプリとsqliteでDB接続してみる
ここでのDB接続はおまけみたいなもので、基本的には下記参考サイトのまんまです。
やる内容としては下記
sqliteでtable作る
※ sqliteが入ってるかバージョンを表示してみる $ sqlite3 --version 3.8.5 2014-08-15 22:37:57 c8ddd949d4a1zb3bba470a8aa0e1k8k05edddace ※ データベース作成 $ sqlite3 test.db ※ tableの作成 sqlite> create table book ( id primary key, title not null default '', author not null default '' ); ※ データのinsert sqlite> insert into book (id, title, author) values ('00000001', 'はじめてでもないPerl', 'hoge'); sqlite> insert into book (id, title, author) values ('00000002', 'ふるいPerl', 'hoge'); sqlite> insert into book (id, title, author) values ('00000003', 'あたらしいPerl', 'hoge'); sqlite> insert into book (id, title, author) values ('00000004', 'はじめてのRuby', 'fuga'); ※ データを確認してみる sqlite> .header on sqlite> select * from book; id|title|author 00000001|Perl|kimoto 00000002|ふるいPerl|hoge 00000003|あたらしいPerl|hoge 00000004|はじめてのRuby|fuga 00000005|はじめてのPHP|piyo
使い方なんかはだいぶはしょってますがこれで終わりです。
cartonでDBD::SQLite、DBIx::Connectorモジュールをインストールする
これも↑で行ったcpanfileに追記してinstallするだけなのですぐ終わります。
$ cd アプリケーションディレクトリ ※ お決まりで入ってるか確認 ※ どちらもないのでいれる $ carton exec perldoc DBD::SQLite No documentation found for "DBD::SQLite". $ carton exec perldoc DBIx::Connector No documentation found for "DBIx::Connector". ※ cpanfileにモジュールを追記する $ vi cpanfile ---- vi追記 ---- requires 'DBD::SQLite'; requires 'DBIx::Connector'; ---------------- ※ インストール $ plenv exec carton install ※ 正常にはいってればどちらもドキュメントが表示されます $ carton exec perldoc DBD::SQLite $ carton exec perldoc DBIx::Connector
MojoliciousからDBアクセスしてデータを表示してみる
やることは簡単で、接続を作って取得するだけです。
morbo
で立ち上げた際にhttp://127.0.0.1:3000
と表示されますが
今回はhttp://127.0.0.1:3000/book
とアクセスするとデータを表示するようにプログラムを追加してみます。
ポイントは下記3つでしょうか
- DBIx::Connectorでデータベースアクセスする
- 日本語をいれているのでEncodeモジュールで内部文字列をutf8にデコードしている
use Mojolicious::Lite; get '/' => sub { my $self = shift; $self->render(text => 'Hello World'); }; get 'book' => sub { my $self = shift; use DBIx::Connector; use utf8; # 接続の作成 my $dsn = 'dbi:SQLite:dbname=test.db'; my $conn = DBIx::Connector->new($dsn, undef, undef, { RaiseError => 1, PrintError => 0, AutoCommit => 1 }); # データベースハンドルの取得 my $dbh = $conn->dbh; # ステートメントハンドルの準備 my $sth = $dbh->prepare('select * from book where title like ?'); # SQLの実行 my @params = ('%Perl%'); $sth->execute(@params); # レコードの取得 my $texts = ''; my @texts; while (my $row = $sth->fetchrow_hashref) { my $id = $row->{id}; my $title = $row->{title}; my $text = "id: $id, title: $title"; warn "$text"; use Encode 'decode'; $text = decode('UTF-8', $text); $texts .= $text . " <br />"; push @texts, $text; } # $self->stash('texts' => \@texts); # response $self->render(text => $texts); # $self->render('sqlite'); }; app->start;
起動する
$ carton exec morbo webapp.pl
これでhttp://127.0.0.1:3000/book
とアクセスしてこんな感じに表示されれば終わりです。
ここまでできると小さなMojoliciousアプリと小さなデータベースsqliteだけでも結構いろいろできそうな感じが見えますよね。
補足
また、この構成をまるっとgithubにあげましたので、
入れたり書いたり面倒な場合はそのままcloneでお試しあれ。
https://github.com/tweeeety/perl-mojolicious-sample
まとめ
これでローカルでの開発環境が整いました。
さくらVPSなどの外に出すアプリケーションを作るには
MojoliciousやMySQL、Webサーバやサーバの死活監視なども必要だったりすると思いますが
ローカルでperl × WAFでアプリケーションを書いてみるっていうところにフォーカスするとこれでも十分いろいろできますね。 vi w