taisablog

taisa's engineer blog

「 月別アーカイブ:2019年03月 」 一覧

PHPによるDBUnit超入門

2019/03/29   -PHP

例えば簡単なWebサービスでMVCのフレームワークを使っていてビジネスロジックを書く用にコントローラとモデルの間にサービス層を追加して開発している場合、コントローラやサービスはモックを駆使しながらテストを書いていくことができます。ただ、例えばフレームワークをバージョンアップしたい、PHPをバージョンアップしたいなどの場合に既存のモデル層に影響がないかをテストで確認したいなんてことがあります。そのような場合には、DBUnitを導入してみてもいいかもしれません。ということで本記事ではPHPによるDBUnitの使い方を書いてみます。 事前情報 今phpunit/dbunitをインストールしようとすると以下の文言が出力されます。詳しくはこちらのissueに書いてありますが、どうもSebastianさんはdbunitのメンテナンスをやめるようです。ただそれを受けてforkしたプロジェクトが出てきているようなので大丈夫かと思います。今回はSebastianさんの純正dbunitを使っています。 Package phpunit/dbunit is abandoned, you should avoid using it. No replacement was suggested また、DBUnitに関する詳しい情報はマニュアルにありますのでご確認ください。https://phpunit.de/manual/6.5/ja/database.html#database.implementing-getdataset 作成したサンプルプロジェクト 今回は、dbunitの確認だけをしたいので、dietcakeのmessage-boardというサンプルプロジェクトを利用しました。今回作成したDBUnit用のサンプルプロジェクトは GitHub からダウンロードして確認できます。 git clone git@github.com:taisa831/phpunit-dbunit-sample.git cd phpunit-dbunit-sample composer install # mysqlサーバを立て`app/config/sql/board.sql`を実行する(SQLは下記に記載しています) # テスト実行 ./vendor/bin/phpunit PHPUnit 7.5.8 by Sebastian Bergmann and contributors. ….. 5 / 5 (100%) Time: 207 ms, Memory: 4.00 MB OK (5 tests, 14 assertions) アプリ用のDDLです。開発用DBとは違うのでboard_dbunitというテーブル名にしています。 — — — Create database — CREATE DATABASE IF NOT EXISTS board_dbunit; GRANT SELECT, INSERT, UPDATE, DELETE ON board.* TO board_root@localhost IDENTIFIED BY ‘board_root’; FLUSH PRIVILEGES; — — Create tables — USE board_dbunit; CREATE TABLE IF NOT EXISTS thread ( id INT UNSIGNED …

C言語初級者がMacのコンソールで実行可能なテトリスを作ってみた

2019/03/26   -C

C言語初級者がMacのコンソールで実行できるテトリスを作ってみました。参考にした動画はこちらです。テトリスについてはWikipediaも参考にしました。この投稿では作ってみた上で気になった箇所をピックアップして解説していきます。全ソースコードはこちらで確認できます。これについては、Youtubeにあげている方にも許可を頂いています。 テトリス – Wikipedia 日本では、 1988年にセガ・エンタープライゼス(後の セガ・インタラクティブ)から発売された アーケード版( セガ・システム16版)の人気により浸透した。当時はまだ操作法が確立されていなかったが、このシステム16版の登場以降は同作のものが日本国内における 事実上の標準となり、その影響力から特に「 セガテトリス」とよく呼ばれる( 2000年にアーケードと … 拙い動画でお恥ずかしいですが、どうぞご利用下さい。 — 館長 (@gamedokan) 2019年1月9日 まずテトリスの枠を作る まず最初にテトリスの枠を作ります。テトリスの枠は横が12個、縦が22個のブロックでできています。なので下の図のようにそのブロック箇所へ1を立てて、ブロックを描画していけばよいことになります。 単純に書くと以下のようになりますが、それを少し整理してchar field[FIELD_HEIGHT][FIELD_WIDTH];のフィールドに値を格納する書き方に変更すると以下のようになります。 # 単純に書いた方 #include <stdio.h> #include <memory.h> #define FIELD_WIDTH 12 #define FIELD_HEIGHT 22 int main() { for (int i = 0; i < FIELD_HEIGHT; i++) { for (int j = 0; j < FIELD_WIDTH; j++) { if (j == 0 || j == FIELD_WIDTH – 1 || i == FIELD_HEIGHT – 1) { printf(“■”); } else { printf(” “); } } printf(“\n”); } } # 整理した方 #include #include #define FIELD_WIDTH 12 #define FIELD_HEIGHT 22 char field[FIELD_HEIGHT][FIELD_WIDTH]; int main() { …

GitLabのprivateなPHPライブラリをcomposer installするには

2019/03/20   -PHP

社内ツールでprivateなリポジトリに置いておきたいけど、いろんなプロジェクトでcomposer installしたいというケースは以外とあるんじゃないかと思います。そういう時は、composer.jsonにrepositoriesを追加して、GitLab(ここではGitLabとしています)のURLを指定するとインストールが可能になります。しかしそのままだとpublicなリポジトリしかだめですが、privateなリポジトリであれば、GitLabからPersonal AcessTokenを取得して、composer config –global –auth gitlab-token.gitlab.com [ACESS_TOKEN]を実行すればcomposer installが可能になります。 { “name”: “taisa831/sample-framework-app”, “license”: “MIT”, “authors”: [ { “name”: “taisa”, “email”: “g5.taisa831@gmail.com” } ], “require”: { “taisa831/sample-framework”: “dev-master” }, “repositories”: [ { “type”: “vcs”, “url”: “git@gitlab.com:taisa831/sample-framework.git” } ] } では、Webフレームワークをprivateなリポジトリに公開して利用するところまでをやってみます。 (今回は便宜上publicにしています) 事前準備 ここではサンプルのWebフレームワーク(実装なし)をプロジェクトにインストールできるようにすることにします。リポジトリは2つで、フレームワークの実態であるsample-frameworkとフレームワークの雛形となるsample-framework-appを用意しておきました。それぞれの構成は以下の通りです。 https://gitlab.com/taisa831/sample-framework.git # フレームワークの実体 . ├── README.md ├── composer.json ├── src ├── tests └── vendor https://gitlab.com/taisa831/sample-framework-app.git # フレームワークの雛形 . ├── README.md ├── composer.json ├── composer.lock ├── config ├── controllers ├── models ├── public │   └── index.php ├── routes ├── tests └── views このsample-framework-appのcomposer.jsonには上記でも記載した内容が書かれています。requireにtaisa831/sample-frameworkを指定し、repositoriesにGitLabのURLを指定することで探してくれるようになります。 { “name”: “taisa831/sample-framework-app”, “license”: “MIT”, “authors”: [ { “name”: “taisa”, “email”: “g5.taisa831@gmail.com” } ], “require”: { …

PHPライブラリをPackagistに登録する方法

2019/03/18   -PHP

PHPのライブラリをPackagistに登録する方法を書いておきます。PackagistはPHPのパッケージリポジトリで、登録しておくとcomposerを使ってプロジェクトへインストールすることができます。ここではとあるプロジェクトをPackagistに登録する前提の流れで進めていきます。 Packagistに登録するプロジェクトを作成する 新規でプロジェクトを作成しcomposer initを実行します。 mkdir amazon-photo-formatter cd amazon-photo-formatter composer init composer initを実行すると色々と聞かれるので順番に進めていきます。まずはパッケージ名が聞かれます。<vendor>にはGitHubのアカウント名を指定し、<name>にはライブラリ名を記載します。ここではtaisa831/amazon-photo-formatterと記載しました。 Package name (/) [taisa831/packagist]: Descriptionはライブラリについての説明文なので、Format amazon photo file name to amazon photo’s format.と書きました。その他についてもサジェストされている内容とするか必要な内容を決めて進めていきます。 Description []: Author [Masaki Sato , n to skip]: Minimum Stability []: Package Type (e.g. library, project, metapackage, composer-plugin) []: library License []: MIT 次にこのライブラリが依存しているものがあればこの時点で指定することができます(後から手動で記載することも可能)。ここではphpunitを利用するのでrequire-devでphpunitを指定しました。 Would you like to define your dependencies (require) interactively [yes]? no Would you like to define your dev dependencies (require-dev) interactively [yes]? Search for a package: phpunit Found 15 packages matching phpunit [0] phpunit/phpunit [1] phpunit/phpunit-mock-objects Abandoned. Use instead. [2] phpunit/php-token-stream [3] phpunit/php-timer [4] phpunit/php-text-template [5] phpunit/php-file-iterator [6] phpunit/php-code-coverage [7] …

PHPの empty, isset, is_null の違いをしっかり理解する

2019/03/08   -PHP

PHPの isset、empty、is_null をしっかり理解して使おうと思い整理してみました。既にこのような記事「PHP isset, empty, is_null の違い早見表」もあるのでここではこれより少し踏み込んだところまで書いてみます。 empty, isset, is_nullの違い早見表 値 if ($var) empty isset is_null $var = 1 true false true false $var = array(1) true false true false $var = “” false true true false $var = “0” false true true false $var = 0 false true true false $var = array() false true true false $var = false false true true false $var = NULL; false true false true $var false true false true まず表ですが、順番を理解しやすい形に変えてみました。下記のように赤と青のグループで分けて考えておくと理解しやすいです。これをみると「if ($var)とempty」、「issetとis_null」が対になっているのがわかります。 感覚的には、if ($var)は値がありそうだなと思うものがtrueになり、emptyも値がなさそうだな思うものがtrueになる感じがします。issetは、何かしら値がセットされてばtrue(つまり値がfalseでも結果はtrue)、is_nullは値がnullであればtrueということになります。 実際の挙動の動作確認についてはPHPUnitを使ってテストしたものをGitHubにあげているので合わせて確認してみてください。https://github.com/taisa831/AimaiPHP empty, isset, is_null の Notice や Error 出力早見表 次に、PHPのerror_reportingをE_ALLにした場合に、indexのない配列にアクセスした場合やオブジェクトが空の変数や関数にアクセスした場合の挙動をまとめてみました。 値 if ($var) empty isset is_null $var = []; …