読者です 読者をやめる 読者になる 読者になる

tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

【Mojolicious】mac x plenv x Mojolicious::Lite x morbo をサクっとためす

mac mojolicious perl cpan sqlite carton plenv

はじめに

mojoliciousを使ってみたくなったのでメモ。
おもに下記2つのサイトを参考にさせていただきました。

  1. Mojolicious入門 ~ PerlでWebサイトを作ろう ~
  2. さくらVPSでnginxとsupervisordを使ってMojolicious::Liteを動かしてみた

主な流れは2の方をメインに参考にし、Mojoliciousについてのチュートリアル的なものは1の方を参考にしました。

アジェンダ

  1. plenv環境ととのえる
  2. carton x plackup環境ととのえる
  3. plackやMojoliciousいれる
  4. 小さなMojoliciousアプリケーション作って実行してみる
  5. 小さなMojoliciousアプリとsqliteでDB接続してみる

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でDB&table作ってデータをinsertしておく
  • cartonでDBD::SQLite、DBIx::Connectorモジュールをインストールする
  • Mojoliciousから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とアクセスしてこんな感じに表示されれば終わりです。 f:id:tweeeety:20150706025922p:plain

ここまでできると小さなMojoliciousアプリと小さなデータベースsqliteだけでも結構いろいろできそうな感じが見えますよね。

補足

また、この構成をまるっとgithubにあげましたので、
入れたり書いたり面倒な場合はそのままcloneでお試しあれ。
https://github.com/tweeeety/perl-mojolicious-sample

まとめ

これでローカルでの開発環境が整いました。
さくらVPSなどの外に出すアプリケーションを作るには
MojoliciousやMySQL、Webサーバやサーバの死活監視なども必要だったりすると思いますが
ローカルでperl × WAFでアプリケーションを書いてみるっていうところにフォーカスするとこれでも十分いろいろできますね。 vi w