投稿

Perl (Mojolicious) を使って web アプリ開発に挑戦 (第6回)

イメージ
 第6章 テストコードと機能追加実装を同時にすすめる 今回は機能を実装しながらテストコードを実装してみますが、テストコードというのは一度作ると削除するのが難しくなり、最終的に実装のコードより大掛かりなことになってしまい、テストコード自体のメンテナンスが負担になることがあったりします。実装コードもそうですが、小さい単位で作るというのはとても大事なことです。 ここではテストコードの小さい単位での実装方法を紹介してみたいと思います。 6.1 テストコード拡張の準備 投稿記事の削除機能とそのテストコードを実装したいと思います。アクセスURLと画面遷移は下記のようなイメージになります。 URL: POST - `/remove` - remove 掲示板の削除実行 画面遷移 一覧`/list`の表示記事ヨコの「削除」ボタンクリック `/remove`アクション実行 削除実行後、一覧画面に遷移、削除完了のメッセージ表示 実際のソースコードはこちらの github からみれます。 https://github.com/Becom-Developer/beginning-mojo/tree/master/chapter6/section1 6.1.1 テストファイルを追加 % touch t/remove.t t/remove.t の中身は下記のようにしておきます。 # 暫定的にトップページのリクエストテストを書いておく use Mojo::Base -strict; # ... 省略 subtest '/' => sub { $t->get_ok('/')->status_is(200); }; done_testing(); 6.1.2 既存のテストファイルと共通化の仕組みをつくる % mkdir -p lib/Test/Mojo/Role % touch lib/Test/Mojo/Role/Basic.pm lib/Test/M

Perl (Mojolicious) を使って web アプリ開発に挑戦 (第5回)

イメージ
 第5章 完成品に対してテストコードを実装 今回はテストコードを実装してみますが、ここでいうテストコードとはどういうものなのか、説明を始めると長くなりますのでまずは手を動かしながら実際にテストコードを実行できる状態にしてから最後にテストコードとはなにかについて考えるようにしてみます。 5.1 テストコードファイルの設置 Perl の場合、テストコードのファイルは慣例的に `t/` ディレクトリのなかに `sample.t` のように `.t` 拡張子を付けて保存することになっています。Perl がインストールされている環境ならば `prove` というコマンドを実行することでテストコードを実行できる仕組みがあり、Mojo のテストコードにおいても prove コマンドで実行することができます。 実際のソースコードはこちらの github からみれます。 https://github.com/Becom-Developer/beginning-mojo/tree/master/chapter5/section1 5.1.1 ファイルを用意して実行 % mkdir t % touch t/bulletin.t bulletin.t の中身は下記のようにしておきます。 use Mojo::Base -strict; use Test::More; use Mojo::File qw(curfile); use Test::Mojo; use Mojo::Util qw{dumper}; # web アプリの実行スクリプトを指定 my $script = curfile->dirname->sibling('bulletin.pl'); # ルーティングテスト my $t = Test::Mojo->new($script); $t->get_ok('/')->status_is(200); done_testing(); 今回は docker を利用してアプリを起動しているのでもう一つターミナルのウインドウを開いて下記のように docker 経由でテストコードを起動します。 (ファイルを個別に指定)

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

イメージ
 第4章 完成品に対しての課題をまとめる 前回までの作業でとりあえず動くものはできましたが、本当に最低限のものです。今後何をすればいいのか客観的に自分の作ったものを見直す時間はとても大事になります。 4.1 レビューをする時間をもうける ちなみに私が開発をしている部署では月に一回はレビュー会を実施しています。このレビュー会では開発のリーダーとなるひとや、開発の経験が浅い方も一緒になって現在開発作業をしている案件の進捗や問題点などを洗い出していくということをしています。 もし一人で開発をしていた場合は客観的に自分の作ったものを見てくれる人がいなかったりしますから、一人レビューというは難しいわけですが、それでも定期的にそういう時間を作ったほうが結果的に洗練されたものができると思います。 4.2 課題管理の手法 最近ではGithubサービスを活用してアプリ開発をするのが定番となっています。Github のイシューやプロジェクトの仕組みは大変よくできていますので、今はそれらをうまく活用するのがいいと思います。 今回ここでは、ちょっと古臭いやり方かもしれませんが、README.md に今後の課題を追記していく方法をとってみます。 4.3 課題をある程度分類しておく 課題をある程度分類しておくと優先順なども付けやすくなると思います。また、あえてこの問題はやらないという、やらない選択をする判断基準もつくりやすいでしょう。何でもかんでもやろうとすると開発というものはあっという間に破綻してしまうことがあります。 今回は下記のような分類にしておきます。 バグ - 思っていた仕様と違う挙動をしているので修正する 機能改善 - いまある機能をより洗練させる 機能追加 - 新しい機能を追加してアプリを充実させる 作業効率 - メンテナンスのしやすさやバグが発生しにくくなるような修正 4.4 まとめ 今回課題をまとめた TODO は下記の github 参考資料でみれます https://github.com/Becom-Developer/beginning-mojo/tree/master/chapter4 4.5 次回

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

イメージ
 第3章 仕様案を参考に実装 ここでは実際に手を動かしながら具体的な実装方法を説明してゆきます。各項目ごとに完成形のサンプルコード github に存在しますので完成形のコードはそちらを参照ください。 3.1 最低限度の画面を作成 前回までで環境構築と開発用のアプリケーションサーバーの立ち上げまで進みました、今回は bulletin.pl ファイルに実際にコードを書き込みながら画面を作ってゆきます。 順番は「トップ画面」 -> 「一覧画面」 -> 「書き込み入力画面」で作業します。全体のイメージやURLについては「第1章やることを整理しておく」を参照ください。 実際のソースコードはこちらの github からみれます。 https://github.com/Becom-Developer/beginning-mojo/blob/master/chapter3/section1/bulletin.pl 3.1.1 掲示板の紹介画面 実装をするまえに画面のイメージ画像をのせておきますので参考にしてみてください。 掲示板の紹介画面 今回は Mojolicious::Lite で作成なのですが、Lite の場合は__DATA__配下がテンプレートとして読み込まれており、共通テンプレートは layouts/default.html.ep 記載の部分にあたります。下記のように修正してみましょう。 ... @@ layouts/default.html.ep <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title><%= title %></title> </head> <body><%= content %></body> </html> ... 次に「掲

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

イメージ
 第2章 開発環境を構築 2.1 開発環境のイメージをつかむ 前回はざっくりと開発内容について考えてみました今回は具体的な環境構築の手順をみていきます。 アプリ開発の経験の浅い人にとってはどのような開発環境を用意すれば良いのかの判断は大変難しいと思います。 アプリ開発の途中で作ろうとしているものの仕様が変更になったり、技術的に現在の環境では困難になったり、何が起こるかはわかりませんから、こればかりは場数を多くふんでゆくしかないのかもしれません。 間違いなく言えることがあるとすれば再現がしやすい開発環境を構築するのが良いとお思います。今回は docker の仕組みは拝借することにしました。 下記が開発システム全体のイメージです。 +----------------------------------------+ | bulletin (application) <-- Make here!! | +--------------------------------------------+ | Mojo (Web Framework) | +-----------------------------------------------+ | Perl (Programming language) | +---------------------------------------------------+ | docker (Virtual space) | +-------------------------------------------------------+ | OS (MacOS or Linux) | +-------------------------------------------------------+ 2.2 開発環境ついて参考になる資料 ネットを検索するとさまざまな資料ができてきますが、一

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

イメージ
 第1章 やることを整理しておく 1.1 web アプリ開発に挑戦 インターネット黎明期とよばれているころ、webアプリケーションの開発にはプログラミング言語 Perl が活用されることが多く CGI と呼ばれる手法でほとんどの web アプリケーションが開発されていました。 最近(2021年現在)では CGI という手法で開発されることは少なくなり、web アプリケーション自体も複雑化し、 web アプリの作り方を説明、指導する方もなにから説明するべきなのか大変難しくなりました。言語の選択肢として Perl 以外の選択肢も沢山用意されており Perl を活用した事例の紹介も少なくなったような気がします。この資料では言語自体の特性より、web アプリを開発する場合の進め方に着眼点を置き解説とサンプルコードを紹介しています。 1.1.2 この記事の対象者 基本的な web アプリケーションの仕組みは理解できている ある程度のプログラミングの素養がある PC の環境が Mac である 1.1.3 目次 第1回目: やることを整理しておく 第2回目: 開発環境を構築 第3回目: 仕様案を参考に実装 第4回目: 完成品に対しての課題をまとめる 第5回目: 完成品に対してテストコードを実装 第6回目: テストコードと機能追加実装を同時にすすめる 第7回目: 保守と拡張性が高い構造体に変更する準備 第8回目: Mojolicious ベースにリファクタリングをする 第9回目: 新しい機能を追加する 1.2 やることを整理しておく ソフトウェアの開発を始める時に「要件定義をする」という言葉がでてきます。この要件定義というものがくせものでどういう要件定義が良いのかという話をはじめるとそれだけで一冊の本ができてしまいます。要件定義のやり方もさまざまで作ろうとしているものから具体的な作り方、必要な端末の種類まで事細かに指示があ

[Docker 初心者向け] Docker を活用して開発環境を整えよう (第10回)

イメージ
第10章: 代表的なコマンド事例 docker を活用する場合 docker ... とコマンドを実行する場合と docker-compose ... と二つのパターンがあります。 docker のよいところは docker 環境が使える状態であれば、 docker-compose up コマンド一発で環境が再現できるというところでしょうから、 docker-compose.yml にしっかりと再現したい環境を作り込んで compose コマンド一発実行というのが理想敵なんだと思います。 そうはいっても compose.yml を作り込む際にいろいろ試したことがあったりするので、この記事で紹介したよく使うであろうコマンドをまとめておきました。 10.1 コマンドリファレンスについて 公式ページにはコマンドリファレンスがありますのでその他のコマンド詳細については公式ページを参考にされるのがよいとおもいます。 https://docs.docker.com/reference/ 10.2 hello-world を題材にしたコマンド例 docker hub 公式イメージ - https://hub.docker.com/_/hello-world (image を取得する) docker image pull hello-world (image から container を新しく作る) docker container run hello-world (image から container を新しく作るときに h-container という名前をつける) docker container run --name h-container hello-world (コンテナを削除) docker container rm hello-container (イメージを削除) docker image rm hello-world 10.3 ubuntu を題材にしたコマンド例