テストの基本の”き”をおさえよう!

’23年度入社の紙屋です!
本年度は単体テストに対して理解を深め、成果物のクオリティを担保するという点を目標の一つとして業務に取り組んでまいりました。
リリース前にテストを行い、早期に不具合を発見することもできましたが、テスト内容の不十分さや検証環境へリリース後、お客様からのご指摘で不具合を発見するなどの反省点もありました。
テストを行うための心構えとして備忘録的にまとめようと思います!

テストの目的と重要性

  • バグの早期発見と修正が可能
  • プログラマーの心理的安全性を保つ
  • 機能改修時の予期せぬエラーを防ぐ
  • コードの挙動理解を助ける

テストの考え方

  • FeatureとUnitに分けて管理することが多い
    * Feature(機能)テスト:
    ユーザー目線のテストです。
    より大きい範囲で行い、アプリケーションに求められる機能を確認します。
    * Unit(単体)テスト:
    プログラマ目線のテストです。
    より小さい範囲で行い、各パーツごとにエラーがないかを確認します。
  • ブラックボックステスト、ホワイトボックステストの目的を意識する
    * ブラックボックステスト:
    システムの外部から機能や仕様を検証します。
    システムが仕様通りに動作するか、画面レイアウトや使いやすさを評価することに重点を置きます。
    * ホワイトボックステスト:
    内部のコード構造や処理フローを検証します。
    内部ロジックのの正確性を評価します。

テストの作成

テストの作成から実行方法までLaravelを使用した方法でまとめようと思います。

  • テスト作成のコマンド:

    上記コマンドはFeatureテストとして作成されます。
    もしもUnitテストとして作る際は、オプションを付けましょう。


    * ファイル名は通常 ‘XxxxTest.php’ の形式を指定します。

テストケース名には必ず「test」と入れ、「test***」とテスト名と条件なども記載します。

テストコードの構造

テストコードは以下のような形をとります。

setUp や tearDown はテストケースの事前・事後処理を行います。
* setUp:事前処理(変数の初期化やデータの準備など)
* tearDown:事後処理(不要なデータの削除など)
* setUpやtearDownを書く際は、メソッドの戻りと指定 ‘: void’ も忘れずに書くことが必要です。

アサーションについて

プログラミングのデバッグやテストのために用いられる方法の1つです。
以下のような働きをします。

  • テスト結果を即座に確認できる
  • テストが意図した通りに動作したかを検証できる
  • テスト条件が妥当なデータかを判断できる
  • テストが失敗した要因を特定しやすい

アサーションメソッドは主に以下のようなものがあります。

  • assertTrue:実測値がtrueであることを期待
  • assertFalse:実測値がfalseであることを期待
  • assertEquals:実測値と予測値が一致することを期待
  • assertSame:実測値と予測値が型も含めて一致することを期待
  • assertEmpty:中身が空であることを期待
  • assertNotEmpty:中身が空でないことを期待
  • assetStatus:アクセス結果のステータスコードを確認
  • assertRedirest:アクセス後、どこにリダイレクトされるかを確認
  • assertSee:レスポンス内に特定の文字列が存在することを確認

テストの実行方法

  • 全てのテストを実行する場合
  • フォルダを指定してテストを実行する場合(例:フォルダ名tests/Feature)
  • ファイルを指定してテストを実行する場合(例:ファイル名ExampleTest.php)
  • メソッド名を指定してテストを実行する場合(例:メソッド名testExample)

テストコード作成のポイント

  1. テストメソッドは簡潔に保つ
    呼ばれるアサーションを条件分岐してしまうと、一貫したテスト結果が得られなくなる可能性があります。結果が数パターンある場合は、愚直にそのパターン数分テストを準備する必要があります。
  2. 必ず通るテストを書く(時間依存や確率的要素を避ける)
  3. ダミーデータは実際の内容に近い内容にする
    データはより正確な方が本番環境に近い挙動のテストを行うことができます。
  4. テスト対象となるロジックはシンプルにする
    複雑な条件になりそうな場合はメソッド化して対応します。そのほうがテストケースも少なくて済むことがあります。
    ロジックはネスト構造を複数持たないよう心掛け、アーリーリターンを設けるなど対応します。
  5. 3つのAを意識する
    〇 Arrange(準備):テストを行うにあたっての必要な準備段階のこと
    〇 Act(実行):準備したデータを元にアクションを起こすこと
    〇 Assert(検証):アクション後に期待する結果になっているか検証すること
    上記3つのAを意識してテストを行います。

以上がテストについての基本になります。
単体テストを適切に実施することで、コードの品質向上とメンテナンス性の改善につながります。
なかなか時間が十分にとれず、また、多数存在する条件の洗い出しもできないとシステムの品質を担保することは難しいです。
先日参加したPHPカンファレンスでもテストの重要性に触れ、テストを書く習慣をつけ、継続して改善、向上していくように意識するようになりました。
開発に時間がかかりがちですが、テストの時間も十分に設け、自分へのフィードバックも兼ねて今後も取り組んでいきたいと思います。
日々の取り組みを重ね、また理解が進んだ段階でアウトプットできればと思います!

Laravel Sailで記事投稿フォームを作成してみた

こんにちは。22年度入社の中島です。

前回はLinuxについて書きましたが、今回は少し前に学習していたLaravel Sailについてまとめました。

●Laravel Sailとは
Dockerを使った開発環境であり、ターミナルでコマンド実行するだけで、DockerでLaravel環境を一発で作ってくれる便利なコマンドラインツールです。
Laravel Sailを使うメリットは次の通りです。

・開発に最低限必要なツールを一度にインストールでき、インストールの手間を省ける
・本番環境と同じ環境を手元に用意して、動作を確認できる
・PHPのバージョンが異なる複数のプロジェクトの管理が楽にできる
(Laravel 8.x からLaravel Sailは標準でインストールされています。)

●なぜLaravel Sailを使っているのか?
Laravelの学習するときに使用していた技術書がLaravel Sailでの環境構築、実装方法を紹介しているのを見て、docker環境との連携も取りやすいと思ったため、復習を兼ねてSailの紹介をやってみようと思いました。


使用したテキスト:『Laravelの教科書』

Laravel Sailのセットアップ及びLaravelトップ画面の表示
1.Docker Desktopをインストール
Dockerのインストールです。Dockerの公式サイトからDocker Desktop のインストーラーをダウンロードします。

2.Laravel Sailをインストールするディレクトリを予め作成しておきます。
今回はtest-projectフォルダを作成しました。

3.Laravel Sailのインストール
Ubuntuまたはターミナルで、次のコマンドを実行します。(今回はUbuntuを使用)

4.途中でパスワードが求められたらPCのパスワードを入力。

5.下記メッセージが出たらインストール完了です。

6.「test-project」ディレクトリへ移動します。

7.Dockerコンテナを起動します。

これによりLaravel Sailが使用する複数のDockerコンテナが起動します。
起動したコンテナについて、Docker Desktopのウィンドウで確認してみましょう。

※./vendor/bin/sail コマンドを毎回入力するのは大変です。
これを「sail」だけで使えるようにするため、エイリアス登録を行います。

以降は sail コマンドとして記載していきます。

8.マイグレーションコマンドを実行して、初期テーブルを作成する。

9.ブラウザで「http://localhost/」 へアクセスするとLaravelのスタート画面が表示されます。※Ubuntuまたはターミナルを開いたまま、ブラウザでアクセスしてください。

今回は、Laravelの復習として過去に作成したフォームの一部を紹介したいと思います。
『件名』『本文』にテキストエリアがあり、フォームの下に『送信する』ボタンがあるフォームを作成していきます。

1.モデルとマイグレーションファイルを作成
まずは、モデルとマイグレーションファイルを作ります。下記コマンドを実行して、Postモデルとマイグレーションファイルを作ります。

このコマンドを実行すると、database/migrations 配下と app/Modelsにファイルが作成されます。次にdatabase/migrations 配下に作成されたマイグレーションファイルに、postsテーブルを作成するためのtitleカラムとbodyカラムを設定します。

./database/migrations/(年)_()_(日)_(時刻)_create_posts_table.php

マイグレート実行し、データベースにpostsテーブルを作成

2.ビューファイルの作成
次にビューファイルを作ります。resources/viewsの中にpostフォルダを作り、その中に create.blade.phpファイルを作ります。create.blade.phpファイルの中には以下のコードを追加します。

create.blade.php

3.ビューファイル表示用コードを追加
次にコントローラです。下記コマンドを実行して、PostControllerを作成。

コマンド実行後、app/Http/Controllerの中のPostController.phpを開きます。先ほど作成した resources/views/post/create.blade.phpファイルを表示するためと投稿データ保存のために、下記のように記述します。

PostController.php

4.ルーティングの設定(ビューファイル表示用のルート設定)を追加
ルート設定の作成です。routes/web.phpの中に、下記のuse宣言とフォーム表示用のルート設定と投稿データ保存用のルート設定を加えます。これにより今回作成したフォームがブラウザに表示されます。

web.php

これまで記述したコードによって、次の流れが実現します。

  1. ユーザーがログイン後にhttp://localhost/postにアクセスする
  2. ルート設定により、PostControllerのcreateメソッドに処理が割り振られる
  3. 処理が実行され、resources/views/post/create.blade.phpの内容がブラウザに表示される

    実際に作成したもの

4.件名(title)と本文(body)を入力し『送信する』ボタンを押すことで、PostControllerにフォーム(http://localhost/post)を通じて値が送信される
5.ルート設定により、PostControllerのstoreメソッドに処理が割り振られる
6.処理が実行され、件名が$request->titleに、本文が$request->body にそれぞれ入っているため、Post::create() に渡してやることでpostsレコードの対応するフィールドに値がセットされる
7.returu back()によっての元ページに戻る

いかがでしょうか。

今回は振り返る形でLaravel Sailのことを書きました。
今後も学んだことを忘れないようにLaravelやLinux、業務で行った作業なども復習する形でブログ更新していきたいと思います。

今回はここまで
最後までご覧いただきありがとうございました!

2023年 新入社員ブログ 松井(第4回)

こんにちは。入社1年目の松井です。
前回までの内容は下に貼っておきます!

第1回はこちらです!

第2回はこちらです!

第3回はこちらです!

今回の内容はLaravel演習です。演習の内容の前にLaravelとは何なのかについて簡単に説明します!

Laravelは、多くのWebアプリケーションの開発に使われているPHP言語で開発されたフレームワークです。そもそもフレームワークとは何なのかについて説明すると、プログラミングの作業を毎回0から書く必要がある内容を予め「枠組み」として纏められている仕組みです。その枠組みがあることで、新しいアプリケーションを作るたびに同じ機能を実装させるという手間を無くすことができます。

社内で行われたLaravel演習の内容は前回紹介したPHP演習と大差ないので、もう一度紹介しますね。演習課題はPHPと同じく「会員登録フォームの作成」です。主な実装内容は以下の通りです。

会員登録フォームの内容

  • 会員登録/ログイン機能の実装
  • 会員一覧機能の実装
  • 会員情報変更機能の実装
  • 会員削除機能の実装

PHPで苦労した内容がLaravelで簡単なコードで実現できることを体感することができました。例えばPHPでは、ログイン後のページ一つ一つにセッションをつけないと不正アクセスかどうか判別できませんでした。しかし、Laravelでは、ミドルウェアという機能を使って簡単にログインしているかどうかで処理を振り分けることができます。また、PHP演習で苦労したページネーション機能は一行で書けるようになります。下記にページネーション機能を実装するために書いたコードを抜粋します。

PHPのコード

PHPだと複雑なコードを書かない上に多くの行数を費やしてしまいます。コードを読んだことがない人にとってはコメントが無いと何を書いているのか非常に分かりにくいと思います。

Laravelのコード

このコードはPHPと比較して非常にすっきりとした印象を持てますね。Laravelだと細かい部分はフレームワーク側で処理してくれるからここまで簡単に書けるようになります。

Laravelで作成した一覧画面を下に貼っておきます。大まかな構成はPHP演習で作ったものとあまり大差ありません。

今回の内容はPHPで実装するに苦労したものがLaravelでは簡単に作れたという内容でした。
最後まで読んで頂き、誠にありがとうございました!

ヘルパー関数のあれこれ!紙屋03

おつかれさまです!
‘23年度入社の紙屋です!
9月に入って朝晩の暑さがすこーーしずつ和らいでいたような気がしますね。早く日中の暑さも和らいでいくといいですね。

8月で課題の会員登録のアプリケーションを作り終えました。
外部研修でもLaravelでwebアプリケーションをつくりましたが、そのときはとりあえずの実装を優先して、「この関数がどんな仕事をしているのか、どんな機能があるのか」ということを考えていませんでした。
そこで、今回はLaravelにおけるヘルパ関数に焦点をあてて振り返ろうと思います!

ヘルパ関数とは?
Laravelに搭載されている独自の関数のことで、いろいろなところで呼び出せる便利な関数です。

Laravelの公式ドキュメントをみえると数えただけで213個ありました(今回Laravel ver9で実装)。
まだまだ分からないことが多いので、今回は使ったものに触れながら振り返ります!
今回の会員登録フォームで使用したヘルパ関数は、
・view ・redirect ・route ・request ・session
・old ・dd ・dump ・config
でした。
Contollerや入力フォーム、処理の確認で使うものが多く、外部研修でも使っていたので、コードレビューいただく前から使っていました。しかし、config関数は教えていただいてからの導入でした。

よくアドバイスいただく内容として、同じコードで内容量が多く、その処理を複数個所で使用する場合は、可読性や再利用性を考えてコーディングした方が良いと教えていただきます。
今回config関数をどこに用いたかというと、formタグで会員情報の登録や編集を行う箇所でバリデーションを実装するときに、バリデーションの中身は同じものなので、バリデーション時にコードが冗長にならないように利用しました。

まずは、config関数の公式ドキュメントを確認します。
config関数は設定変数の値を取得します。設定値はファイル名とアクセスしたいオプションを「ドット」記法で指定します。
とあります。

となっており、「/config/(.phpファイル)」内に記述されている配列を呼び出します。
では、私はどのように実装したかというと、
Controller内には以下のように記述し、

「/config/mySetting.php」ファイル内に

と記述しました(教えてもらいながらですが…)。

これでバリデーションチェック時の項目をController内に何度も記述する必要が無く、バリデーション内容の変更・修正時も配列の中身を記述することでスッキリします。

ちなみに、ヘルパ関数がどんな処理をしているのかは、「/vender/laravel/framwork/src/illuminate/Foudation/helpers.php」ファイル内に記述してありました。

確かに配列があればキーを返してくれているみたいです。

ちなみに、今回使用した「ドット記法」についてちょっと触れると、配列からの値の取得時にキーを「.」でつなげることで、多次元配列の場合、より深い階層へネストし値を取得してくれます。
例えば、Arr:get()関数の公式ドキュメントを参照すると、

となっています。$arrayのような多次元配列から値を取得したい場合は、第2引数のキーの部分をドット記法で、欲しい値までネストしていきます。
ちなみにArr::get()関数に第3引数をセットすると、第2引数に指定したキーが存在しない場合の値を返してくれます。

改めて振り返ってみると、「なるほど!」と思いました!
今後も、いろいろと忘れないようにまとめていきたいと思います。
では、また次回!!


Swagger-PHPでOA\PathItem()エラー

福岡拠点の野田です。
OpenAPI(Swagger)の仕様書を使っていますか?

PHPでは、アノテーションでOpenAPIを定義できるSwagger-PHPというものがあります。使うためには以下を実行します。

[/crayon]

対象のコントローラーを指定するとアノテーションで記載したコメントがAPI仕様書になるという素晴らしいライブラリです。swagger.ymlの書き出し方は、以下。

[/crayon]

ここで少しはまりどころがあります。
OA\Infoを定義したクラスには必ずOA\GetやOA\PutといったAPIをセットで定義しなければなりません。それをしないと以下のエラーで怒られます。

[/crayon]

ちょー分かりにくいエラーなので、私もはまりました。そんなときは汎用エラーレスポンスでも定義してしのぎましょう。

[/crayon]

これはライブラリ側でなんとかしてほしかったところではありますが、めげずにswaggerを使っていきましょう。

それでは、また!

[Laravel]ビュー

福岡拠点の香月です。

今回はビューです。前回のルートとコントローラで呼び出されたURLに対してPHPでのプログラム処理ができるようになりました。
今回はここで実際にデータを集計して、結果を画面に表示したいと思います。この画面表示部分がMVCモデルのV(View)です。
Laravelの標準テンプレートエンジンはBladeとなっています。

それでは早速コントローラの実装です。
前回の実装ではLaravelのようこそ画面を呼び出していましたが、今回は”top”とう名前のテンプレートを使用して画面を表示するようにします。テンプレートファイルは後で作成します。
app/Http/Controllers/TopController.phpファイルを編集します。

モデルScoreに追加した2つのメソッドを呼び出して得点に関するデータを取得しています(ソースは後ほど)。$daysには試験実施日の一覧が、$scoresには試験の点数データが入ってきます。
$subjectsでは科目一覧を取得しています。
$studentsは配列として定義していて、続くforeachで点数データ列挙しながら二次元配列を作成します。一次元目に生徒名、二次元目に科目ID、その値として点数を設定しています。
最後にreturn view(‘top’)で画面を呼び出すと同時に、topテンプレート内で使用するデータを->with()で指定しています。(->with()の複数回の呼び出しは、一回の->with()の呼び出しに置き換えることができます。その場合、->with()の引数にはキー、バリューの配列を設定します)

実装の先頭で$request->input(‘day’)を使っています。コントローラメソッド(ここでいうindex())ではメソッドインジェクション(依存注入機能)を使ってRequestクラスのインスタンスを取得することができ、ユーザーリクエストの内容を利用できます。

次はScoreにメソッドを追加します。app\Score.phpを編集しましょう。

getDays()では試験日フィールドexam_dayをグルーピングして、日付の昇順に並び替えた結果を取得しています。exam_dayフィールドは時間まで入っているので、日付だけの書式に書き換えて配列に置き換えています。

getList()では引数で指定された試験日だけのデータを取得し、それに対してLEFT OUTER JOINで科目と生徒を連結した結果を返します。

さあ、ここまでくるとあとはビューを作成します。
resource/views/welcome.blade.phpをコピーしてresource/views/top.blade.phpを作成し、中身を編集します。
コントローラの最後で return view(‘top’) を呼び出していましたが、Laravelではこれでresource/viewsフォルダにあるtop.blade.phpの呼び出しと判断してくれます。

画面のタイトル「Score sheet」を表示します。
その下には試験日の一覧$daysを@foreachで列挙して表示します。各試験日はaタグでリンクを作成し、クリックするとその日の表示に切り替わるようにしています。ここでroute(‘top’)を呼び出していますが、前回route/web.phpファイル内でRoute::get(‘/’, ‘TopController@index’)->name(‘top’);と指定した名前ですね。これによりこのリンク先が。/ に設定されます。
最後にtableタグで点数表を表示します。縦に生徒軸、横に科目軸を設定して、各生徒の点数を表示するようにしています。それぞれ@foreachでループしながらテーブルを生成しています。

これで実装が完了しました。実際に画面を表示して見ましょう。
表示するデータはシーダーで用意したデータです。
こんな感じで画面が表示されます。

Bladeテンプレートエンジンでは@foreach以外にも@if, @elseや@switch, @case, @breakなどの制御構文が使えます。

また、テンプレートの継承や@includeなど、他のテンプレートファイルと組み合わせて1つの画面を作成することができます。同じ内容を複数のファイルに書くと、後からの編集が大変ですね。その手間をなくすために積極的に活用しましょう。

[Laravel]ルートとコントローラー

福岡拠点の香月です。

今回はルートとコントローラーを追加します。

ブラウザでURLリンクをクリックしたときにはそれに対応した画面が表示されますが、Webサーバー内ではそのURLに対して表示するデータをモデルから取得し、そのデータをビューで整形してHTMLとして表示します。このモデルとビューの橋渡し役がコントローラーの役目となります。また、要求されたURLをどのコントローラーで処理させるかを指定したのがルート(ルーティング)です。

では早速ルートから指定していきます。laravelプロジェクトのrouteフォルダにweb.phpがあります。これを開いて次のように編集しましょう。

アプリケーションのトップURL(http://server/)が呼び出されたときに、TopControllerクラスのindexメソッドを呼び出すように指定しています。
->name(‘top’)でこのルートに対して名前を付けています。ここでつけた名前は他の場所でURIを指定するときに使うことができます。

次はTopControllerの作成です。シェルで次のコマンドを実行します。

するとapp/Http/Controllers/TopController.phpにファイルが作成されます。
クラスメソッドとしてindex()を追加してあげましょう。

route\web.php内で直接指定していたようこそ画面の表示を、コントローラーを介して表示するように変更しただけのものですが、このようにしておくことでビュー(ここではようこそ画面)で表示したいデータをphpプログラムで集めて、計算して、整形して表示することができるようになります。

上のphp artisan make:controllerコマンドではオプションは指定していませんでしたが、–model=[Model]や–resourceオプションを指定することで、リソースコントローラを作成することができます。
こうすることで作成されるコントローラ用ファイルにindex(), create(), store(), show(), edit(), update(), destroy()の名前が付いた空のメソッドが一緒に作成されます。例えばStudentモデル用のリソースコントローラを作成するにはこう書きます。

また、リソースコントローラを使う場合はroute/web.phpのルート指定を次のようにすることで、URIとアクションが自動的に割り付けられたルーティングが完成します。

Route::resource()の1行で次のルーティングが完成します。

動詞 URI 対応メソッド ルート名
GET /students index students.index
GET /students/create create students.create
POST /students store students.store
GET /students/{student} show students.show
GET /students/{student}/edit edit students.edit
PUT/PATCH /students/{student} update students.update
DELETE /students/{student} destroy students.destory

これはいわゆるRESTful APIとして設定されており、必要なURIが揃っているのでリソース(≒モデル)のCRUD(Create, Read, Update, Delete)管理がはかどるでしょう。

リソースコントローラの考え方は他のWebフレームワークでも同様に使われています。Ruby on Railsでは「rails generate scaffold …」コマンドが使えて同じようなルートを生成してくれますし、CakePHPでもルート指定時にまとめて設定してくれる方法があります。これらからLaravelに来た人にとってはわかりやすいですよね。

[Laravel]シーダー

お久しぶりです。福岡拠点の香月です。

今回はシーダーです。
作成したテーブルに初期データやテストデータをを投入するときに使います。

前回からテーブルを2つ「subjects」「students」を追加しています。

マイグレーションファイルでフィールドを定義して

マイグレーション

これでテーブルが追加されました。
ではここに初期データを投入しましょう。Subjectテーブルは科目、Studentテーブルは生徒、Scoreテーブルは点数です。
まずはシーダーファイルを作成するために、make:seederコマンドを実行します。

すると、Laravelプロジェクトフォルダのdatabase/seedsフォルダにファイルSubjectSeeder.php、StudentSeeder.php、ScoreSeeder.phpが作成されます。

まずはSubjectシーダー。
作成されたシーダークラスファイルには run() メソッドが用意されています。シーダーが呼び出されるとこのメソッドが実行されるようになっているため、ここにデータ投入用プログラムを記述します。
上にuse App\Subject; を追加して、Subject Eloquentモデルを使えるようにするのを忘れずに。

Subjectクラスのインスタンスを作成して、フィールドに値を設定し、save()メソッドを呼ぶことでレコードが追加されます。
このプログラムでは$seeds配列の1つ1つが1レコードとなるようなプログラムになっています。

続いてStudentシーダー。こちらはモデルファクトリを使って、フィールド値をランダム生成します。フィールド値には日本語を使いたいので、config\app.phpを次のように修正。

次にファクトリコード用のファイルを作成します。

作成したファイルdatabase\factories\StudentFactory.phpを次のようにします。

$factory->define()の第二引数のクロージャで、Studentレコード1件分の情報としてフィールド名(キー)と値(バリュー)の配列を返すようになっています。$faker->lastName、$faker->firstName部分がランダム生成の部分。これ以外にもcity、phoneNumber、wordなどいろいろ使えます。便利。誕生日は2011/04/02~2012/04/01までの1年間でランダムに生成されるようにしました。

そしてdatabase\seeds\StudentSeeder.phpです。

モデルファクトリを使って20個のエントリを簡単に作成できます。

database\seeds\ScoreSeeder.phpはこう。

作成したSubject、Studentの全レコードを取得し、ループで回しながら作成していきます。

プログラムができたらシーダーを実行しましょう。実行コマンドはdb:seedです。
実行するクラス名を–class=オプションで指定します。

これは1つずつ実行するコマンドとなりますが、まとめて実行したい場合は最初から用意されているDatabaseSeederクラスを利用するとよいでしょう。
database\seeds\DatabaseSeeder.phpファイル内の run() メソッドからまとめて処理したいクラスを指定して、

db:seedコマンドをオプションなしで実行します。

これでデータ投入が完了しました。

[Laravel]追加のマイグレーション

福岡拠点の香月です。

前回はDBのマイグレーションを行いました。
既にマイグレーション実行済みのテーブルに変更を行いたい場合、アプリケーションが稼働する前であればロールバックしてマイグレーションをやり直せばいいのですが、本稼働後のバージョンアップなどでデータを棄損することなくテーブルにフィールドを追加したいことがあります。この場合、フィールド追加用のマイグレーションを実施することになります。

まずは前回と同じようにマイグレーションファイルを作成しましょう。

これによりdatabase/migrations/(日付)alter_scores_table.phpが作成されますので、ここに追加したいフィールドを記載します。

up()メソッドにマイグレーション実施時のコードとして、scoreフィールドをexam_dayの後ろに追加するようにしています。
もちろんクロージャの中では必要なフィールドを1つだけではなく複数記述できます。文字列フィールド、timestampフィールドなど用途に合わせて追加しましょう。
カラム修飾子には->after()を使用しています。これ以外にもnullを許容する->nullable()、コメント文字列を指定する->comment()などいろいろ使えますよ。

down()メソッドにはロールバック実施時に実行されるコードを記述します。ここ忘れがちなので注意!

マイグレーションファイルを作成したら、マイグレーションを実施します。

マイグレーションが実施されていないファイルを対象に実施されます。同じファイルが2度3度と実施されることはないので安心してください。
実行後に反映されたことを確認しましょう。

 

すてきなLaradock

福岡拠点の宮里です。
Dockerを勉強し始めました!
DockerでLaravel開発環境を構築する場合に便利なLaradockというパッケージがあり、併せて勉強中です。

Laradockとは

PHP開発環境を構築できるDockerイメージのパッケージです。
DockerでLaravelプロジェクトを実行することに焦点を当てて開発されています。
Laravel以外にもSymfony、CodeIgniter、WordPress、Drupalなどの他のPHPプロジェクトもサポートしています。
officialのDockerイメージをベースに拡張したパッケージなので信頼性があるとのことです。

Laradockが魅力的なのは、なんといってもその豊富なソフトウェア群です。
build→upで必要なライブラリを都度追加・更新が行えます。

備忘録としてそのパッケージをリストアップしました。(2018年11月時点)

サポートしているソフトウェア(一部)

Portainer

Docker管理WebGUIツール
公式サイト: https://portainer.io/

Docker Registry

Dockerプライベートレジストリサーバ
Dockerドキュメント: https://docs.docker.com/registry/

Docker Web UI

DockerプライベートレジストリWebUI管理ツール
Github: https://github.com/kwk/docker-registry-frontend

MySQL

データベースサーバ
公式サイト: https://www.mysql.com/jp/

MariaDB

MySQL派生のオープンソースデータベースサーバ。
公式サイト: https://mariadb.org/

phpMyAdmin

MySQLサーバー管理ツール
公式サイト: https://www.phpmyadmin.net/

PostgreSQL

オープンソースデータベースサーバ。
公式サイト: https://www.postgresql.org/

pgAdmin

PostgreSQLサーバー管理ツール
公式サイト: https://www.pgadmin.org/

Microsoft SQL Server

データベースサーバ
公式サイト: https://www.microsoft.com/en-us/sql-server/sql-server-2017

Redis

オープンソースのメモリ内データ構造ストアで、データベース、キャッシュ、メッセージブローカーとして使用。NoSQLデータベースサーバ。
公式サイト: https://redis.io/

Aerospike

KVS。フラッシュ(SSD)に最適化したNoSQLデータベースサーバ。
公式サイト: https://www.aerospike.com/

Minio

Go言語製Amazon S3クラウドストレージサービスと互換性を持ったオブジェクトストレージサーバ。
公式サイト: https://docs.minio.io/

Apache2

世界中でもっとも多く使われているWebサーバ
公式サイト: https://httpd.apache.org/

Nginx

Webサーバ
公式サイト: https://nginx.org/en/

Caddy

Go言語で実装されたwebサーバ
公式サイト: https://caddyserver.com/

Varnish

HTTPアクセラレータ
公式サイト: https://varnish-cache.org/

Certbot

Let’s Encryptのクライアント
公式サイト: https://certbot.eff.org/

Laravel Echo Server

LaravelのSocket.IOサーバライブラリ
Laravel公式ドキュメント: https://laravel.com/docs/5.7/broadcasting
GitHub: https://github.com/tlaverdure/laravel-echo-server

Swoole

PHPネットワークフレームワーク。
公式サイト: https://www.swoole.co.uk/

Solr

オープンソースの全文検索エンジン
公式サイト: http://lucene.apache.org/solr/

Elasticsearch

Lucene基盤の分散処理マルチテナント対応オープンソースの検索エンジン。分散型RESTful検索/分析エンジン。
公式サイト: https://www.elastic.co/jp/products/elasticsearch

Kibana

Elasticsearch用ビジュアライズ/データ可視化ツール
公式サイト: https://www.elastic.co/jp/products/kibana

Grafana

データ可視化ツール。
対応ツール:Graphite、Prometheus、Elasticsearch、InfluxDB、OpenTSDB、MySQL、AWS Cloudwatch
公式サイト: https://grafana.com/

Metabase

オープンソースのデータ可視化ツール
対応:MySQL, Postgres, Mongo, SQL Server, AWS Redshift, Google BigQuery, Druid, H2, SQLite, Oracle, Crate, Google Analytics, Vertica
公式サイト: https://www.metabase.com/

NetData

サーバのリアルタイムパフォーマンスと健全性モニタリングツール
Github: https://github.com/netdata/netdata

Thumbor

画像のクロッピング、リサイズ、フィルタリング等の画像変換サーバー
公式サイト: http://thumbor.org/

Beanstalkd

オープンソースのメッセージキューイング。Laravelがサポート。
公式サイト: https://beanstalkd.github.io/

Beanstalk Console

PHP製Beanstalkd管理ツール
Github: https://github.com/ptrofimov/beanstalk_console

RabbitMQ

メッセージキューイング
公式サイト: https://www.rabbitmq.com/

HHVM

PHP実行環境
公式サイト: https://hhvm.com/

PHP-FPM

PHP FastCGI実装
公式サイト: https://php-fpm.org/
PHPドキュメント: http://php.net/manual/ja/install.fpm.php

JupyterHub

Jupyter Notebook用のマルチユーザーサーバ
公式サイト: https://jupyterhub.readthedocs.io/en/stable/

ICEcoder

PHP製のWebブラウザIDE。
公式サイト: https://icecoder.net/

Coding WebIDE

クラウドベースのWebIDE
公式サイト: https://ide.coding.net/

Codiad

PHP製のWebブラウザIDE。
公式サイト: http://codiad.com/

Theia

クラウド版Visual Studio Code
公式サイト: https://www.theia-ide.org/

Mailu

DockerベースのWebUI付きメールサーバ
公式サイト: https://mailu.io/

MailDev

Eメールテストツール。
SMTP Server + Web Interface for viewing and testing emails during development.
Github: https://github.com/djfarrelly/MailDev

MailHog

Go言語製Eメールテストツール。
Web and API based SMTP testing
Github: https://github.com/mailhog/MailHog

Selenium

ブラウザ自動化ツール
公式サイト: https://www.seleniumhq.org/

Blackfire

PHPプロファイリングツール。パフォーマンステストツール。結果をWebUIで確認できる。
公式サイト: https://blackfire.io/

Jenkins

Java製オープンソース継続的インテグレーションツール
公式サイト: https://jenkins.io/

GitLab

Gitリポジトリ管理
公式サイト: https://about.gitlab.com/

積極的に活用していきたいですね。