LaravelのRefreshDatabaseはいつ実行されるか、なにを実行しているか

いつ実行されるか

前提として、PHPUnitでのsetUp()等の実行タイミングから。

  1. setUpBeforeClass()がテストクラスごとに、最初のテストメソッドの実行前に。
  2. setUp()がテストメソッドごとに、テストメソッド実行前に。
  3. tearDown()がテストメソッドごとに、テストメソッド実行後に。
  4. tearDownAfterClass()がテストクラスごとに、最後のテストメソッドの実行後に。

以下が詳しい。

4. フィクスチャ — PHPUnit latest Manual

このうち、RefreshDatabaseの実行は、setUp()のタイミングで行われる。

ただし毎回は実行されない。一度実行されるとRefreshDatabaseState::$migratedが真になり、このクラス変数が真の場合は実行されないので、実質テストランナーの実行ごとに一度しか実行されない。

なにを実行しているか

php artisan migrate:fresh, ただしテストクラスでの指定によっては、--drop-views, --drop-types, --seedのオプションが有効になる。

たとえば--seedに関しては、テストクラスに$seedというプロパティを真で設定しておけば、有効になる。

おまけ

RefreshDatabaseは実際にはIlluminate\Foundation\Testing\TestCase内で実行されるため、PHPUnit\Framework\TestCaseを継承したクラスでuseしても駄目、Tests\TestCaseを継承する。

DockerのMySQLでdocker-entrypoint-initdb.dのSQL読み込み始めたと思ったら"MySQL server has gone away"と言われた場合

多分SQLがでかくて、max_allowed_packetが足りてない。/etc/mysql/conf.dあたり に、

[mysqld]
max_allowed_packet=100M

みたいなファイルを置こう。

参考: Connection lost on import of database · Issue #13 · docker-library/mysql

特にDockerで特有の問題ではないようだ。

なおこの場合のファイル名、*.cnfじゃないと駄目っぽいので注意。

現在、Unix オペレーティングシステムで !includedir ディレクティブを使用して検索およびインクルードされるファイルは、.cnf で終わるファイル名を持っていなくてはなりません。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.2.6 オプションファイルの使用

2020年読んだ本

去年はほんと本が読めなかった。まあ、忙しかったとは思う。技術書が読了したのがまさかの0で、技術書以外のフィクション以外が30冊弱、小説ちょっとは読んだ気してたがこれも30冊弱。漫画は500冊弱で、これは大きく変わってないか。

技術書は部分的に読んだのはいろいろあって、よかったのはオライリーのDocker, アンダースタンディングコンピューテーション、これはコード書きつつ楽しんでたが忙しくなって止まった、ペアプログラミングとかエクストリームプログラミングとか、関数型リアクティブプログラミングとかドメイン駆動設計入門とか、あとエンタープライズアプリケーションアーキテクチャにも再チャレンジしてたか。リファクタリングも読み直してた。そんな感じで、手だけはいろいろ出してる。

今年もあまりしっかり本読めそうな感じじゃないけど、去年よりは読みたいところ。

Vimでステータス行にビジュアルモードで選択中の文字数が出てこなくなったら

ステータス行の右の方に、シンルグバイト文字列を選択中なら文字数の数字だけ、マルチバイト文字列を選択中なら文字数-バイト数、矩形ビジュアルモードだと縦x横が表示されるアレ。

set showcmd

すればいい。デフォルトオンっぽいんだけど、.vimrcあれこれしてたらなぜか動かなくなっていた。

名前が直感的じゃないのがつらいね。

追記

もうちょっと調べると、どうもset nocompatibleしていて、それがいろいろ設定を変更しているようだった。set compatibleset nocompatibleはいろいろな設定に影響するっぽいので気をつけて実行した方がよさそう。

というか、ヘルプにちゃんと書いてある。

このオプションを変更すると、予期しない効果が数多く現れる。(中略)このオプションをファイル vimrc 内で設定するなら、一番先頭に置くこと。

https://github.com/vim-jp/vimdoc-ja/blob/378fdd11b65c283d8747badb9527583389abf3cd/doc/options.jax#L1767

2020年振り返り

仕事

前年(2019年)末からの案件がまだ継続中。出勤もだが固定の時間で働く働き方が合わず、さらに国内でコロナ感染者が出てきてもしばらくフルリモート移行できなかったこともあり、2月か3月くらいでもうやめようと思っていたのだが、その後けっきょくフルリモートになったこともあり、経済が混乱してそうな中で営業やるのもだるいなということもあり、とりあえず終わるまでは続けるかと思っているとどんどん完成が延び、未だに続いているのであった。

今更半端にやめるのもアレなので、終わるまで続けると思う。

残念なのはもっとチームで仕事、みたいのを期待してたのだが、最初こそそうでもなかったが、段々と俺が書く比率が上がっていって、現段階に至っては90%くらい俺だけで書いてるという状況。

次こういう仕事やるなら、今度こそチームで働いてみたい。できれば俺よりうまいプログラマだけだと嬉しいが、この年で、フルタイムで働く気もない状況でそれは無理だろうな。

技術

仕事その他微妙に忙しくて、あまり勉強できてない。仕事で使って、積極的に調べてるLaravelの理解がだいぶ進んだ。あとDockerを開発環境に使い始めて、とりあえず最低限使うだけはできるかな、というレベル。

ほかはちょこちょこ本読んでたくらい。とはいえこれもしっかり読み切ったのないし。

音楽鑑賞

2月、コロナ感染者出始めてたけどまだ死者は出てなかったくらいのタイミングで、フルリモート移行したいのにさせてくれなかったりでストレス溜まってたときに、谷山浩子のライブが奈良であるのを当日知って見に行った。

これがきっかけでしばらく谷山浩子ばかり聞いて、まだ聞いてなかったアルバム聞いたりして、はまってた。

その後コロナが本格的に広がっていって世の中のライブがぜんぶなくなって、一部がオンライン開催になって、逆に今までより見るようになった。昔はまっていたが最近の曲は聞いていなかった新居昭乃に再はまりしたのはその関係。

あとはずっとAWA使っていたのをふとSpotifyを試してみたら、AWAで消えたようなマイナーな洋楽が入っていたりもあって乗り換え。またそこで新居昭乃聞いてたらやくしまるえつこが関連でかかって、そっちもちょいはまり。

その辺とは関係あるのかないのか平沢進も初めて聞いてはまって。

みたいな感じで音楽鑑賞は充実していた。

で、来年どうするか

仕事はしばらく今の案件を続ける予定。完成時点で一旦契約はなくなりそうだけど、その後も今のところに仕事もらうかもしれないし、また別のところの仕事をエージェント経由でもらうかもしれないし。どちらにしてもクラウドソーシングでつらい営業して仕事取る、みたいのはもうなくなりそう。わからないけどね。

技術的な勉強は、今年よりはもうちょっとやっていきたい。とはいえ、今そもそもプログラマとしてやっていくことについて迷っている部分があって、今年仕事が安定してたからこそそんなこと考える余裕もあったんだろうけど、正直プログラミングは好きだし楽しいけど、職業プログラマとしてまったく適性がないわけでもないと思うけど、でもこの仕事一生続けてそれで満足かというと違いそうで。

来年はその辺どうするか、ある程度見通しできたらいいなと今は思っている。

それではよいお年を。

PHPカンファレンス 2020を見たので簡単な感想を

コロナなのでオンライン。オンラインのカンファレンス見るのは初。今年そもそもカンファレンス初。あと~関西じゃないPHPカンファレンスも初だな。

ほんと簡単な感想です。アーカイブぜんぶ残るみたいなので興味あるセッションはアーカイブ見ましょう。

スライドへのリンクは、すでにまとめてくれてる方がいるので張らない。

https://qiita.com/ucan-lab/items/c644675ea7da4093c664

前夜祭

「Laravelの黒魔術」が気になったので前夜祭も。オフライン開催だとなかなか行けないが、オンラインだと気軽に行けるのでここは利点。

Laravelの黒魔術

最近もうLaravelのことなら大体わかったぜ、な気持ちだったが軽くノックアウトされた。ほんとに黒魔術的な話ばかりで、最後のHigher-Order Messages以外はまったく知らない話だった。

AliasLoaderはちょっと読んでたのに、ファサードクラスをファイルからオンザフライで作るみたいなことやってるところに気付かなかったのはほんと負けた気分。

時間が足りなくて最後の1つがだいぶショートカットされたのは残念だったが、しっかり黒魔術してて楽しい話だった。

SPAのAPI開発の「やりづらさ」をDDDとオブジェクト指向の発想で解決する

SPAのAPI開発ではまりがちな問題を、オブジェクト指向ドメイン駆動設計のやり方で地道にしっかり解決していこう的な話かな。SPAはようわからんので……。

APIの機能は、ユーザ(≒顧客)のではなく、フロントエンドの要求に合わせて作ることが大事、そうした方がサーバサイドでもいい感じでやれる、みたいな話は普段サーバサイドのコード書いてても似たようなこと考えるので納得できた。

あともちろん、引数増やして混乱したメソッド作るのではなく機能ごとにたくさんメソッド作れをAPIに適用するみたいな話も。APIも普通のメソッド・関数も、最終的には同じように扱うのがいいのかもしれない。

本編

PHPの今とこれから2020

基調講演なのかな。PHP 8の新機能や変更点の話が割と多かった。いろいろ使いたい機能あるので早く仕事で使いたいところだがさて。

PHP WEBアプリケーション設計入門――10年先を見据えて作る

ドメイン駆動設計入門の著者によるセッション。DDDは特に関係ない、むしろレイヤードアーキテクチャ方向。10年後に困らないためにフレームワークに依存せず、一方向の依存できれいに設計してやろうという話。

すごく面白かった。とはいえ異論もあって、個人的には10年後に困る理由ってフレームワークへの依存じゃなくて、単純に設計・実装が駄目駄目なのが原因だと思うので、フレームワークはもっと活かして行っていいと思う。

スポンサーLT

「トイサブ!」さんにぜんぶ持って行かれてた。

ゼロベースから Laravel を用いた API 実装オートメーション

この時間帯失敗して、Track1とこれで迷ってふらふらしたりして最初の3分の1ちゃんと聞けなかった。工数をがっつり削減するために高度な自動生成するという話ですごい趣味に合った話なので、ちゃんと最初から聞けばよかった。

内容的にはもっと実装レベルの話を聞きたかった。特に気になるのが自動生成って基本的に危ないものだと思ってて、特にこれほど大量にコードを生成するような場合、自動生成後のコードと同等の機能をライブラリとして作った上でライブラリで定義を読んで動かす方が安全だと思うんだけど、どうしてそういう方向にならなかったのか、ってあたりで、そのためにももっと具体的なところが知りたかった。

このセッションでは通信環境の問題か音質がかなり厳しかったのは残念。オンライン開催のデメリットか。

PSRで学ぶHTTP Webアプリケーションの実践

ちょっと想定レベルがわからなかったかな。最初の半分なしで始めてよかったような。最後時間余ってからの話がいちばん面白かった。

Composer 2.0って何?どう変わるの?読んでみました!

Composer 2の高速化が実装レベルでどうしたなのかみたいな話。コンパクトにまとまっていてよかった。

前ちょっとした事情からComposerのメタデータファイルの構成はある程度把握してたので、より楽しく聞けた。

最後ちょっと駆け足になったのは残念。

今こそ理解する、PHP日時計

思ったより基本的な話だった。昔はdate()やらstrtotime()やら使ってて、そこから一足飛びに今ではCarbonなので、DateTime周りの話を聞けたのはよかった。

効果的な静的解析のCI導入パターンを求めて

静的解析をCIで導入する話なんだけど、単に導入するだけでは駄目で、うまく運用していくためにはどうするか、についてのパターンをめっちゃいい感じに説明してくれた。

ちゃんと導入したことはないけど、とりあえず人の書いたコードとかどうこうする前に使ったくらいはあって、じっさいそういうときに最初からすごいエラーが出てまあ大変なんだけど、そういうのどうするかみたいな話もしっかりあってよい。これ見たら俺も静的解析導入できそう! となる。

今回の見た中でベストだったかも。

微妙な違いも見逃すな!ビジュアルリグレッションテスト!

割とフロント寄りの話。そっちは専門じゃないんだけど、画面をそのままテストする系の話は興味がある。昔HTMLの差分をそのままテストするようなツール書いたことがあって。

Atomic Designとかも名前聞いたことある以上ではないくらいさっぱりだったけど、その辺も必要なところは説明してくれた上での話だったのでわかりやすかった。

フロントエンドはいろいろクールだなあとか、それでもこういうテストやるには地道にいろいろ用意必要みたいで大変そう、とかそういう感想。

LT

基本時間内でまとめきっていてすごかった。内容もどれもよく、LTじゃなくてフルタイムのセッション聞かせてくれ、というのがいくつもあった。ここは印象深いいくつかだけ感想。

エンジニアでもできる簡単親切エラーUI

フォームでエラーをどう見せるかの話。ポップで動きがあっていいスライド。

誰にどうしてもらうためのエラーか、それを全うするためにどう表現するか、というまあ基本的な話ではあるんだけど、スライドのよさもあってとにかくわかりやすい。

チームメンバーをエンパワーメントしよう!レガシープロジェクト改善事始め

あら、今見るとスライドが権限なくて見れないとかなってるな。

チームをよくするために外堀から埋めるみたいな話。こういうツールでこうやっていくというだけではなく、やりやすい・やってもらいやすいところから少しずつ、じっくりやっていかないと駄目だよー、的な話。だったはず。

自分は基本一人でやるんだけど、たまにほかのプログラマと仕事するときにもっといろいろなんとかしたい! と思ってはなかなかできずに、みたいなことが多いので、こういう話はほんと参考になる。

静的解析から始める負債コード解消

静的解析でCIなセッションもあったけどこっちはちょっと違って、PhpStormのInspection機能を使って、すぐに始められるという売りの話。

俺はVimだけど最近はvim-lsp + Intelephense使ってて、これでもちょっとした型の問題なんかは見つけてくれて便利だけど、PhpStormのInspectionはさらに自前でこういう感じのコードがあったらエラーにしたい、みたいなことができるらしくてすごい。

オンラインカンファレンスのよかったところ・いまいちだったところ

よい

  • 前夜祭に気楽に行ける。大体行けるカンファレンスが大阪で、それでも片道2時間くらいはかかるので、なかなか前夜祭までは……という感じだったがオンラインなら片道0秒なので余裕。
  • トイレに困らない。ある程度大きなカンファレンスでは基本トイレは並ぶのでつらいけど、オンラインなら自宅トイレなので余裕。

いまいち

  • 見るセッションに迷うと、簡単にあっち見てみたりこっち見てみたりができるのでふらふらしがち。これはほんとよくないので、事前に見るの決めて、よほどのことがない限り変えないのがよさそう。
  • ネットワーク状況次第で音声がいまいちだったりすることも。
  • 懇親会は……オンラインのはちょっと気後れするかな。今回行かなかったのはそれだけじゃないけど。

最後に

楽しかった。オンラインどうかな、途中で飽きないかなと思ったけどそんなことぜんぜんなかった。

仕事ではすごいプログラマと仕事するみたいなこともなく、ほっとくと自信過剰になっちゃうんだけど、カンファレンスはそういうのすべてリセットしてくれて、お前はまだまだなんだってわからせてくれるから楽しい。

AutoHotkeyを管理者権限のウィンドウ上でも動かしたいけど管理者権限で動かしたくない場合

昔ならいざ知らず現代においてAutoHotkeyを管理者権限で動かすようなことは普通はしないのだけど、そうすると、管理者権限で実行したプログラムのウィンドウ上でAutoHotkeyが動かない。

まあ権限が低いプログラムから権限が高いプログラムを操作されたら問題なわけで、当然の挙動なんだろうけど、管理者権限のウィンドウでだけあの操作もこの操作もできない、となると不便である。

その不便にずっと甘んじていたんだけど、今度こそなんとかしようと調べ始めたら、なんとだいぶ前(2011年くらい?)から、WindowsUIAccessという機能を使って(多分)安全にこの制限を回避できるようになっていた。

元々はAHKのフォーラム上で公開されていた.ahkスクリプトを使ってどうこうやるみたいな感じだったようだが、現在ではGUIインストーラを使えばかなり簡単にできるようだ。

ということでその方法を紹介する。

  • まずインストール時に、オプションの"Add 'Run with UI Access' to context menus"をオンにしてインストールする。
  • なおインストール先はC:\Program Filesじゃないと駄目なはずだが未確認。
  • スクリプトを手動で起動する場合、コンテキストメニューから、Run with UI Accessでいい感じに動く。
  • スクリプトをスタートアップ時に自動起動などする場合(おそらくほとんどがそうだろう)、"C:\Program Files\AutoHotkey\AutoHotkeyU64_UIA.exe" <SCRIPT_PATH> /uiAccessのような形で実行する。今までの実行ファイルではなく、_UIAとついているのを使い、/uiAccessオプションを追加する、それだけ。

詳しくは以下公式ドキュメントに書いてある。

https://www.autohotkey.com/docs/Program.htm#Installer_uiAccess