投稿

Perl (Mojolicious) を使って web アプリ開発に挑戦 (第9回その3)

イメージ
第9章 新しい機能を追加する(その3) 前回はORMの拡張について紹介しました。 web アプリの開発に必要な機能の全てを紹介してゆくととても膨大な 量になっていきますので今回はよくありがちな機能について紹介してゆきたいと思います。 9.3 よくありがちな機能について考察 今回、web アプリ開発に挑戦するにあたり Mojolicious というフレームワークを 活用しました。 考えようによってはこの Mojolicious 自体も web アプリだということもいえます。 9.3.1 Mojolicious を参考にする Mojolicious がどれだけのモジュールで構成されているのか下記のリンクをみてみてください。 https://metacpan.org/release/Mojolicious 新しく機能を追加したいときはフレームワークがその機能をすでに提供していることが ありますから、上手に活用するようにするとよいです。 9.3.2 よくありがちな機能を紹介 util - 補助コマンド Mojolicious: https://metacpan.org/pod/Mojo::Util 時間情報を取得やアプリ特有の込み入ったテキスト処理パターンなど log - ロギングの追加 Mojolicious: https://metacpan.org/pod/Mojo::Log システムの挙動を掴むためにログを出力させる箇所を追加したい場合 command - コマンドラインから実行するスクリプト Mojolicious: https://metacpan.org/pod/Mojolicious::Commands アプリケーションを通じてコマンドラインから実行したい場合 Mojo にはマイグレーションの仕組みはないので、そういったものを拡張するなど server command - 本番用のアプリ起動コマンド Mojolicious: https://metacpan.org/pod/Mojo::Server::Hypn

Perl (Mojolicious) を使って web アプリ開発に挑戦 (第9回その2)

イメージ
第9章 新しい機能を追加する(その2) 前回は設定ファイルを用意して実行環境ごとに実行条件を切り替える方法を紹介しました。 今回はオブジェクトリレーショナルマッピング(ORM)を拡張する方法やってみたいと思います。 ORMとはなんであるのかの詳細な説明はここではしませんが、 具体的にwebアプリケーションのフレームワークのなかからどのようにして ORMを拡張するのかを事例を紹介します。 9.2 データベースロジック(ORM 拡張ロジック) 今回は teng モジュールでロジックを拡張するやり方を紹介します。 9.2.1 ファイル構成 例として今回は下記のようなファイル構成としたい beginning_mojo # Application directory ... |- lib # 読み込みファイル各種 | |- BeginningMojo # アプリケーションファイル各種 | | +- Controller # アプリケーションコントローラー | | +- DB # データベースオブジェクトロジック各種 | | | +- Teng # Teng 拡張ロジック | | | | +- Row # Row オブジェクト拡張ロジック | | | | +- Bulletin.pm # 各ロジック | | | +- Base.pm # Teng 共通ロジック | | +- Model # コントローラーロジック | | +- DB.pm # データベースオブジェクトロジック呼び出し | | +- Model.pm # コントローラーロジック呼び出し ... 9.2.2 追加のファイルを作成 作業を開始するまえにテストコードが確実に実行できるか確認しておきましょう (テストコード実行、アプリケーションが実行されている状態で別のウインドウから) % docker-compose exec --env MOJ

Perl (Mojolicious) を使って web アプリ開発に挑戦 (第9回その1)

イメージ
 第9章 新しい機能を追加する(その1) 前回までで一通りの機能の切り離しはおわりました。 実際にアプリを運用段階になると本番公開環境と開発環境と、のように 実行環境を分けたいことがあります。 そういう時のためにアプリケーション用の設定ファイルを用意しておくと便利です。 9.1 設定ファイルを導入 今回は公開環境、開発環境、テストコード環境の3つということにします。 9.1.1 設定ファイルの種類を考える 設定について 下記のような名前で環境ごとの条件を設定 公開環境 -> `production` 開発環境 -> `development` テストコード環境 -> `testing` 例として今回は下記のようなファイル構成としたい beginning_mojo # Application directory ... |- etc # 設定ファイル | +- beginning_mojo.common.conf # 共通設定ファイル | +- beginning_mojo.development.conf # 開発環境の設定ファイル | +- beginning_mojo.production.conf # 公開環境の設定ファイル | +- beginning_mojo.testing.conf # テストコード環境の設定ファイル ... 9.1.2 設定ファイルを用意する 下記のような内容のファイルを作成 % touch etc/beginning_mojo.common.conf % touch etc/beginning_mojo.development.conf % touch etc/beginning_mojo.production.conf % touch etc/beginning_mojo.testing.conf 設定ファイルは Perl のハッシュ形式で記述 etc/beginning_mojo.common.conf +{ schema_file => app->home->child

Perl (Mojolicious) を使って web アプリ開発に挑戦 (第8回 その4)

イメージ
 第8章 Mojolicious ベースにリファクタリングをする(その4) 前回でコントローラーの切り離しまですすみました。 今回は細かい全体の調整をしてみたいと思います。 8.4 全体の調整 8.4.1 コントローラーの調整 モデル同様共通化用のメソッド記述用のファイルを用意 % touch lib/BeginningMojo/Controller/Base.pm lib/BeginningMojo/Controller/Base.pm package BeginningMojo::Controller::Base; use Mojo::Base 'Mojolicious::Controller'; 1; 継承関係をととのえる lib/BeginningMojo/Controller/Bulletin.pm package BeginningMojo::Controller::Bulletin; use Mojo::Base 'BeginningMojo::Controller::Base'; use Mojo::Util qw(trim); # ...省略 1; テストコードを実行確認 % docker-compose exec web carton exec -- prove 8.4.2 モジュールの調整 モジュール読み込みのパスを整える script/beginning_mojo #!/usr/bin/env perl use strict; use warnings; use Mojo::File 'curfile'; use lib curfile->dirname->sibling('lib')->to_string; use Mojolicious::Commands; Mojolicious::Commands->start_app('BeginningMojo'); テストコードの記述を統一 t/bulletin.t t/remove.t use Mojo::Base -strict; use Test::More; use Test::Mojo; us

Perl (Mojolicious) を使って web アプリ開発に挑戦 (第8回 その3)

イメージ
 第8章 Mojolicious ベースにリファクタリングをする(その3) 前回はテンプレートの切り離しまですすみました。 テンプレートは切り離す仕組みが最初から Mojo にありましたので簡単でしたが コントローラーについてはすこし考えなければいけないところもあります。 コントローラーを作る前にアプリケーションが最初に読み込みを行なっているファイルが bulletin.pl であり、今まではその中に全てを書いていたのですが bulletin.pl を読み込むだけのファイルとして変更しなくてはいけないことと Perl の場合は cpan 形式という言葉があって特別な理由がない場合は cpan 形式で 作っておくと間違いはないです。 最終的には bulletin.pl は script/beginning_mojo となります。 順番にみてゆきましょう。 8.3 コントローラー アプリケーション内容の記述部分のためのファイル作成からはじめてみます。 8.3.1 アプリケーションファイル % touch lib/BeginningMojo.pm lib/BeginningMojo.pm アプリケーション内容の記述部分を再定義 package BeginningMojo; use Mojo::Base 'Mojolicious'; use Mojo::Util qw(trim); use BeginningMojo::Model; sub startup { my $self = shift; $self->helper( model => sub { BeginningMojo::Model->new(); } ); $self->helper( teng => sub { BeginningMojo::Model->new()->teng; } ); my $r = $self->routes; $r->get( '/' => sub { my $c = shift; $c->

Perl (Mojolicious) を使って web アプリ開発に挑戦 (第8回 その2)

イメージ
 第8章 Mojolicious ベースにリファクタリングをする(その2) 前回はモデルロジック部分の切り離しをおこなってみました。 今回はテンプレート部分の切り離しを行なってゆきたいと思います。  そのまえに一つ紹介しておきたいのは metacpan サイトの Mojolicious の公式ドキュメントです  https://metacpan.org/pod/Mojolicious  こちらの中から Mojolicious::Guides::Growing にいくと  https://metacpan.org/pod/distribution/Mojolicious/lib/Mojolicious/Guides/Growing.pod に今回紹介するテンプレートを切り離すやり方が紹介されています。 Mojolicious にはあらかじめテンプレートを切り離すための inflate コマンドが用意されています 8.2 テンプレート Mojo の場合テンプレートの切り離しはコマンド一つで可能です。 8.2.1 inflate コマンド % docker-compose exec web carton exec -- ./bulletin.pl inflate [mkdir] /usr/src/app/templates [write] /usr/src/app/templates/list.html.ep ... (templates ディレクトリが自動生成された) 8.2.2 テンプレートのディレクトリ構造 Mojo においては下記のようなディレクトリ構造で配置とすると自動的に テンプレートとして読み込みをおこなってくれます。 |- templates # 画面表示用テンプレート各種 | |- layouts # テンプレート共通画面 | | +- default.html.ep # デフォルトの共通画面 | +- create.html.ep # create コントローラー画面 | +- index.html.ep # index コントロ

Perl (Mojolicious) を使って web アプリ開発に挑戦 (第8回 その1)

イメージ
 第8章 Mojolicious ベースにリファクタリングをする(その1) 前回までで構造体を変更するにはどうすれば良いかを考えてみました、今回は具体的にどのようなやり方で既存のコードを変更してゆくかみていきましょう。 今回やることは既存のアプリに新しい機能を加えるわけではなく、保守がしやすい形に書き換えていきます、こういう作業を一般的にはリファクタリングと言ったりします。 リファクタリングというのはやってみると思ったより時間がかかることが多いです、既存の挙動をかえないようにコードを書き換えていくのは場合よってはあたらしく機能を追加するより難しい場合もあります。 仕事としてアプリ開発を行なっている場合どうしても時間コストというものを意識しなくてはいけない状況というのはありますので、今回のように構造体を変更するようなリファクタリングを行うのは 時間コストを考えると難しい場合もあります。この辺の成果物を仕上げていくことと、少ない時間で成果物を生み出すことのバランス感覚は経験のなかでしか学ぶのは難しいのかもしれません。 今回は作業内容が多いので第8回目は4回に分けて解説してゆきます。 8.1 モデルロジック リファクタリングをすすめていくのに役に立つのがテストコードです。リファクタリングを行なった後は必ずテストコードを実行して挙動を確認するようにしましょう。 下記のような手順で切り離してゆきます 移植先のファイルとディレクトリを用意 teng のメソッド 一覧取得のメソッド 登録のメソッド 削除のメソッド 8.1.1 移植先のファイルとディレクトリを用意 (モデル用のファイルディレクトリを新設) % mkdir -p lib/BeginningMojo/Model (モデル用の基底となるファイルを新設) % touch lib/BeginningMojo/Model/Base.pm (モデル用の呼び出しファイルを新設) % touch lib/BeginningMojo/Model.pm (モデル用のロジックを新設) % touch lib/BeginningMojo/Model/Bulletin.pm 各フ