環境 [OS] Debian 10 [PHP] 7.3.13 [Laravel] 7.6.2 [PHPUnit] 8.5.3 [Mockery] 1.3.1 はじめに ソフトウェアやアプリケーション開発にとって品質管理は切っても切り離せない存在です。 日本の従来の品質管理は散布図やPB曲線などを用いて定量化を重視してきました。 しかし、それらは品質を数値化し分析することに寄りすぎていると感じるのは僕だけでしょうか? 品質管理の本来の目的は「品質を上げること」にあるはずです。 一言で品質と言っても様々ですが、「品質 = 要求仕様に則った実装」と定義すると、品質向上のための必要十分な施策はUnitTestによるホワイトボックステストが一番の近道だと考えています。 実際、ネットの情報を見ても、Googleなどのテック企業はUnitTestを中心に据えているように見えます。 その上で、報告などの目的でどうしても品質を定量化したいのであれば、UnitTestのカバレッジ計測ツールを使ったら良いのではないでしょうか。 1. 方針 下記の方針でユニットテストを書いていきますが、自分のプロジェクトと合わない部分は変えて下さい。 1-1. 後々CIで動かすことも考慮し、DB接続はモックで代替する。 1-2. フレームワークを含めず実装した箇所だけのテストコードを書く。 1-3. プロダクションコードの全ロジックを通すテストコードを書く。(「3. テスト記載方法」で後述) 1-4. 上記1-2の範囲でツールを用いてカバレッジを計測し、なるべく100%に近づける。(一般的にツールは評価が甘めのため) 1-5. テストコードの構成はフレームワークやデファクトスタンダードに合わせる。 2. 設定 2-1. PHPUnit LaravelにはPHPUnitが最初から入ってるので、アプリのルートで下記コマンドを実行するとサンプルのテストコードが実行されます。 composer exec -v phpunit アプリルートにあるtestsディレクトリにテストコードを格納していきます。同ディレクトリ内はさらにFeatureとUnitに分かれてます。 tests |-- CreatesApplication.php |-- Feature | `-- ExampleTest.php |-- TestCase.php `-- Unit `-- ExampleTest.php Laravelの方針に合わせて、下記の区分けでテストを書いていきます。 Feature ...

Read more

0. 環境 [VirtualBox] 6.1.6 [ホストOS] Windows 10 Home [ゲストOS] Ubuntu 16.4 1. やりたいこと Windows10(ホストOS)にVirtualBoxを入れて、その上でUbuntu(ゲストOS)を動かします。 その際、ホストOS上のファイルをゲストOSからも操作したい。 IDEやエディタはホストOS上で起動し、バージョン管理やWebサーバー経由の確認などはゲストOSで行いたいというのが意図です。 2. インストール VirtualBoxとUbuntuのインストール&設定はこの記事が分かりやすかったです。 VirtualBoxのサイトで下記リンクからダウンロード。 [VirtualBox 6.1.6 platform packages]-[Windows hosts] また、Ubuntuはこちらのサイトから「64-bit PC (AMD64) desktop image」をダウンロードしました。 1.6Gあるので僕の環境だと数時間かかりました。 3. 共有フォルダ設定 Ubuntuのインストールが終わったら、VirtualBoxのホーム画面からインストールした仮想マシンを選択して「設定」をクリック。 下記のウィンドウが起動するので、左メニューの「共有フォルダー」をクリックします。 さらに右端にあるプラスマークをクリック。 下記ウィンドウに必要項目を入力します。 ・「フォルダーのパス」は「その他」を選んで、ホストOS側で共有したいフォルダーを選択。 ・「フォルダー名」は自動で入るのでさわらず。(1) ・「自動マウント」をチェックONにします。 ・「マウントポイント」はゲストOSの任意のディレクトリを指定。(2) ・「永続化する」というチェックボックスがある場合、それもON。 こんな感じに追加されました。 ゲストOSを再起動します。 これだけだとゲストOSからホストOSの共有フォルダが見えませんでした。 調べてるといろんなページで「Ubuntuに”Gust Additions”をインストールする必要がある」と書いてましたが、入れなくても後述の手順でできました。 (以前はそうだったのかもしれません) “mount.vboxsf”コマンドを使いたいので、ゲストOS上でrootになるかsudoをつけて下記コマンドを実行。 # apt install virtualbox-guest-utils 次にゲストOS側で予めマウントポイントのディレクトリを作成しておきます。(上記(2)) 最後に、第一引数に前述の(1)、第二引数に(2)を指定してこのコマンドを実行するとホスト側のフォルダが参照できました。(下記のshareは読み替えて下さい) # mount.vboxsf share /share 仮想マシンを落とすと設定が消えてしまったので、~/.bashrcに上記コマンドを書いておきました。 ...

Read more

0. 環境 [MySQL] 8.0.17 1. 経緯 GCP無料枠のメモリ約500MBという貧弱な環境でWordPressを運用してます。 少しでもパフォーマンス改善したく、MySQLのクエリキャッシュを設定しました。(下記要点のみ記載) # vim /etc/my.cnf.d/mysql-server.cnf : : [mysqld] query_cache_type=1 query_cache_limit=1M query_cache_size=20M MySQLを再起動。 # mysql -u hoge -phoge -e"SET GLOBAL innodb_fast_shutdown = 1" # service mysqld stop # service mysqld start 起動しなくなりました… ログを見ると下記エラーが出てました。(要点のみ記載) # tail -F /var/log/mysql/mysqld.log : : [Server] unknown variable 'query_cache_type=1'. 2. 対応 ネットで情報を漁ったところ、MySQL8からはクエリキャッシュが使えなくなったようです。 MySQL 8.0: Retiring Support for the Query Cache 代わりにProxySQLというのが紹介されてましたが、ミドルウェアを追加するとメンテするポイントも増えるので今回は見送りました。 一旦は、WordPressのプラグイン(WP Super Cache)とphp-fpmのチューニングで、DBより手前で何とかする方向で進めます。 ...

Read more

MySQLで日付系のカラムを比較するときにちょっと手間取ったのでメモ。 0. 環境 [MySQL] 5.7.14 1. 前提 2つのテーブルに型が異なるカラムがあったとします。()内は小数秒の桁数の精度を表してます。 テーブルAの定義抜粋 CreateDate datetime(3) # 小数秒あり テーブルBの定義抜粋 created_at timestamp # 小数秒なし 2. 手順 この2カラムが一致していることをWHERE句で指定するには、日付フォーマットを揃えるとうまくいきました。 SQL文の抜粋 AND IFNULL(DATE_FORMAT(a.CreateDate, '%Y%m%d%H%i%S'), '') = IFNULL(DATE_FORMAT(b.created_at, '%Y%m%d%H%i%S'), '') 今回は秒まで比較できれば十分でしたが、もし小数秒以下も含める場合は、下記を参照してフォーマットを追加して下さい。 MySQLにおける日付変換 3. 日付型の違い そもそもdatetimeとtimestampの使い分けは?というのはこの記事によくまとまっていました。 MySQL: DATETIME vs TIMESTAMP ざっくり言うと、こんな感じですね。 [datetime] 格納できる値の範囲が広いが、その分容量が必要。 [timestamp] インデックス、UTC変換、タイムゾーン対応など、機能性を求めるならこっち。 4. 参考 日付と時間型の概要 ...

Read more

「バグ対応のため、Let’s Encryptの一部証明書が3/4までになる」と同僚が教えてくれました。 “「バグの影響で特定のサーバー証明書を失効させる」とLet’s Encryptが発表、影響を受けるのは全体の2.6%” 0. 環境 [OS] CentOS 7.5 1. 確認 まず、Let’s Encryptから提供されている下記ツールに対象ホスト名(ドメイン)を入れて影響有無を確認します。 Check whether a host’s certificate needs replacement 2. 手順 影響ありの場合、対応方法は証明書を更新すればよいとのことなので、こちらを実行しました。 certbot renew よくログを見ると処理がスキップされ、更新されてない様子。 The following certs are not due for renewal yet: /path/to/pemfile expires on 2020-05-07 (skipped) /path/to/pemfile expires on 2020-05-14 (skipped) No renewals were attempted. サーバー負荷を下げるため、有効期限まで余裕があると更新されない仕様になってるようです。 なので強制的に更新するコマンドを実行しました。 certbot renew --force-renewal 今回は下記のメッセージが出てたので大丈夫そう。 Congratulations, all renewals succeeded. The following certs have been renewed: 前述のツールでOKが出るのと、ブラウザ上で証明書の期限が延びていることを確認しました。 ...

Read more

昔秀丸エディタなどで保存したShift_JISのファイルをVisual Studio Codeで開くと文字化けしたので設定方法をメモ。 0. 環境 [Visual Studio Code] 1.39.2 1. 手順 設定画面を開きます。 Windowsの場合、[Ctrl] + [,] Macの場合、[⌘ command] + [,] 検索ボックスにfiles.autoGuessEncodingを入力。 表示された”Auto Guess Encoding”のチェックボックスをONにする。 ...

Read more

CentOS8にphpを入れるときのコマンドが分からなかったので要点だけメモ。 0. 環境 [OS] CentOS8 (64bit) [PHP] 7.4 1. 手順 デフォルトのパッケージにはphp7.2までしか含まれていないので、remiリポジトリを足しました。 # dnf -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm 下記コマンドでインストール可能なphpバージョンを調べます。 # dnf module list php “Stream”という欄に表示された名前を指定してインストールします。 下記は7.4を指定してますが、2019/10/19時点の安定版は7.3なので、本番環境の場合は注意して下さい。 # dnf module install php:remi-7.4 パッケージの操作方法については、下記に詳細がまとまっています。 2. 参考記事 How to install php on RHEL 8 / CentOS 8 Linux ...

Read more

4ヶ月くらい起動していなかったVirtualBoxで久々に開発をしようと思ったらエラーが発生しました。 ネット上の情報はあまりなく、下記のいずれかでした。Bはいつの時点に戻すか分からなかったので、Aでやることにしました。 (A)VirtualBoxを再インストール。 (B)Windowsの復元機能を使って、Windowsアップデート前の状態にする。 0. 環境 [OS] Windows7 (32bit) [VirtualBox] 4.3.26 -> 5.2.32 [Vagrant] 1.7.2 -> 2.2.5 1. 問題 VagrantからVirtualBoxを起動する構成です。(詳細はこちら) いつものようにvagrant upやvagrant resumeでVirtualBoxを起動しようとしたところ、このエラーが出ました。 エラーメッセージ supHardenedWinVerifyProcess failed with VERR_ASN1_CURSOR_TAG_MISMATCH: (rc=-22838) 2. 対応 内部エラーで複雑そうなので、一度VirtualBoxをアンインストールし、新しいバージョンをインストールしました。 32bit OSに対応してて、新し目のバージョン5.2.32を選択しました。(5.2.32のWindows hostsをクリック) 64bit OSを使ってる方は、もっと新しいバージョンの方がいいと思います。 VirtualBoxを再インストール後、vagrant upを実行すると下記エラーメッセージが表示されました。 エラーメッセージ The provider 'virtualbox' that was requested to back the machine 'default' is reporting that it isn't usable on this system. ...

Read more

JavaScriptで半角・全角カナの相互変換を行う疑似クラスです。シンプルなロジックなのでカスタマイズも簡単にできます。 下記ブラウザで確認していますが、何かあればこちらから連絡いただけると嬉しいです。 0. 環境 [OS] Windows7 [Browser] Chrome, Firefox(69.0), IE11 1. サンプル 使い方は下記サンプル内の”Test”を見て下さい。記載した2つのメソッドに文字列を渡すだけです。 2. 参考にした記事 JavaScriptで正規表現(文字列置換え編) Objectのkeyとvalueを反転させる。もしくはJSでenum的なものを作る。 ...

Read more

CursorWindowAllocationException が発生した時の対処方法です。 0. 環境 [Windows] 7 [Java] 1.8 [Android] 5.1.1 [Android API] 26 1. 問題 開発中のAndroidアプリでSQLiteを使ってます。 サブクエリを使って、今までより抽出データが多くなるSQLを書いたところ、画面遷移中に頻繁にクラッシュするようになりました。 しかも、特定のテスト機(Galaxy S4(Android5.0.1))のみです。 (A)エラー内容 Fatal Exception: android.database.CursorWindowAllocationException Cursor window allocation of 2048 kb failed. # Open Cursors=700 (# cursors opened by this proc=700) (B)エラー箇所 前述のサブクエリを適用した箇所とは全く別の箇所が毎回落ちるポイントでした。(下記2行目) Cursor cursorCountUsers = db.rawQuery("SELECT COUNT(user_id) FROM users", null); cursorCountUsers.moveToFirst(); int countUserId = cursorCountUsers.getInt(0); return countUserId; 2. 対策 Slackoverflowで同じ問題を見つけました。 まず、毎回同じ箇所で落ちるので、上記(B)にcursorCountUsers.close();を入れたけど直りませんでした。 ...

Read more