Laravelの例外処理で最低限知っておきたいこと

例外をレンダリング・出力する機能と、ロギングする機能の2つに分かれる

デフォルトの例外処理クラスApp\Exceptions\Handlerが継承する親クラスIlluminate\Foundation\Exceptions\Handlerには、render(), report()というメソッドがあり、これらがそれぞれレンダリング・出力と、ロギングを受け持つ。

またこれらのメソッドは、Illuminate\Foundation\Bootstrap\HandleExceptions::bootstrap()set_exception_handler()で設定された、同クラスのhandleException()メソッドから呼ばれる。

app.debugが真の場合、デバッグ情報つきでレンダリングされる

最近のLaravelならデフォルトであればIgnitionが使われる。Ignitionがなければ、以前のLaravelで使われていたWhoopsが使われる。

render()内にはいろいろな処理があるが、基本はprepareResponse()の呼び出しだ。

app.debugだけ見ていて、app.envは見ないので、.envAPP_ENV=productionとしても、APP_DEBUG=trueのままであればデバッグ情報が出力されてしまうことに注意。

その他レンダリング・出力を調整したい場合は、render()を読めばどうすればいいかわかるだろう。

例外クラスにrender()メソッドを実装しておけば、ハンドラのrender()をオーバーライドしたりしなくても好き勝手に表示変えられるのも、ちゃんと読めばわかる(私はちゃんと読まず、オーバーライドしてしまった)。

一部の例外はロギングされない

Illuminate\Foundation\Bootstrap\HandleExceptions::$internalDontReportに設定さ れたクラスや、App\Exceptions\Handler::$dontReportに設定した例外クラスはロギン グされない。

これにはIlluminate\Http\Exceptions\HttpResponseExceptionIlluminate\ Validation\ValidationException等が含まれ、abort()やバリデーションエラーがログ に残らないのは、このせいである。

現役エンジニアと駆け出しエンジニアの遭遇についてちょっと語る

昨夜、PHPerKaigiのプレイベントとして、現役PHPエンジニアが語る、プログラミングを仕事にするということ - connpassというイベントがあった。

そのイベントの宣伝ブログやイベント自体にちょっと突っ込んだりしていたのだが、

まあ文句言ってるだけなのはよくないので、じゃあお前は駆け出しエンジニアはどういうものだと思っているの、みたいなことを語ってみる。

ちょっとぐだぐだ長いんで最初に言うことまとめると、

  • 現役エンジニアと駆け出しエンジニアの遭遇機会はたくさんあるよ。
  • 会いたかったら会えばいいし、駆け出しエンジニア側が会いたいと思ってくれても会えるし、そんな特別なことじゃないと思うよ。

という感じ。

で語ってる人間について一応書いておくと、10年くらいフリーランスでやってるWebエンジニア。ほぼほぼ一人で仕事していて、人間関係は薄く、ひきこもり気味。

でも駆け出しエンジニアはすごい見かける。

(個人的な)駆け出しエンジニアの定義

まず未経験者だけを駆け出しエンジニアと定義しているのが実感とぜんぜん合わないという気がしていて、では俺はどう定義しているのかというと、

  • 広義には、未経験~3年目くらいのエンジニア。
  • 狭義には、最初から職業エンジニアを目指していて、趣味のプログラミング経験なしで入ってくるエンジニア。

今回は狭義の方の話。子供のころからプログラミングやってましたとか、高校・大学で関連するコンピュータサイエンスやら数学やらをがっつり学んでました、実践してました、みたいなのは昨今言われている駆け出しエンジニアとはちょっと違うと思う。

駆け出しエンジニアはTwitterでしか見かけないわけじゃない

未経験者だけに限定した場合は、仕事で出会うのは確かにちょっと難しいかもしれない。が、限定しなければ、割と普通に見かける。

自分が今仕事してるクライアントの会社では、3、4人の駆け出しエンジニアがいた。うち半数は未経験から入社、半数は一応経験はあるものの、くらいな感じ。少なくとも半数は積極的に勉強しているようで、会社のSlackで勉強会に行くみたいな話をしていたり。半数はTwitterもやっているようだったが、#駆け出しエンジニアをつけてツイートしている感じではなさそうだった。

あまりレベル高いところ、給料がいいところなんかだと競争率も高いだろうし、こういう駆け出しエンジニアっぽいのは少ないのかもしれない。

でもその辺がそうでもないところでは、未経験や経験浅くても、給料安めでも頑張ってくれるなら長い目で見ようかな、とい感じで駆け出しエンジニアを積極的に雇っていたりすることも少なくないんじゃないかと思う。

実際俺はそこの給料知らないし、採用に関わっているわけじゃないから想像だけど。

駆け出しエンジニアに会うのは簡単

仕事以外では、小さな(<100人)ネット上の同業者のコミュニティに入ったら、駆け出しがいっぱいいたということがあった。未経験で勉強している人、一応仕事を始めている人、どちらも少なからずいる感じ。

ここで出会ったうちの一人は、メンターを見つけるみたいなサイトでメンター探して勉強するとかしてた。コミュニティ自体でも勉強はできるし、こういうところほかにも多分ある。

小さな勉強会に行ったら、そこでも出会った。未経験者もOKとはなっていたものの、別に未経験者を対象にした勉強会ではなかったのだが、どうも半数近くは未経験者のようだった。

こういうところで出会う人たちの一部は現役エンジニアの話に興味があったり、聞きたいことがあったりするようだ。そこそこ長くやってるよと自己紹介すると、いろいろ話をしてくれたり、聞いてくれたりする。

ほかにもエージェントの主催する懇親会に行ったら、さすがに一応皆未経験ではないものの、割と経験の浅い、駆け出しといっても言い過ぎではないようなエンジニアがいたり。

この辺ではむしろ、現役エンジニアの方が少数派と感じるくらい。

とはいえ、大きなカンファレンスで会うのは確かに難しいかも

ということで、ここ数年本当にどこを見ても駆け出しエンジニアばかりと感じるのだが、逆に見かけないのが大きめのカンファレンスだ。

そういうところに来るのは俺より経験あるようなベテランか、経験は浅くても技術力は高いみたいな凄腕か、たまに学生がいたと思ったらそれでも俺より技術力ありそう、みたいなのばかりで、「駆け出しエンジニア」の定義にあてはまりそうなのなんて100人に1人いるかどうか。

去年のPHPカンファレンス、オンライン開催で無料だったこともあり駆け出しエンジニアの知り合い数人に勧めたけど、まあ割と直前に勧めたこともあったと思うけど、実際には終わった後にアーカイブを見てくれたという人が一人だけだった。オフラインでのイベントに比べて気後れしづらそうなオンライン開催ですらこんな感じ。

想像だけど、やっぱりレベル高いカンファレンスは敷居が高いんじゃないかと。あとそういうのは大体丸一日使って、その辺も大変そう。

ただそういう人たちも自主的に小さな勉強会に積極的に行ってたりするし、カンファレンスのスライド見たりアーカイブ動画見たりはする。

その辺考えると、単純に人は自分に向いていると思うコミュニティに参加してるんじゃないかと。もし駆け出しエンジニアに来て欲しいと思うなら、もっとそっち向けのコンテンツ用意するとかがいいんじゃないかな。

個人的には、この現状にはなんの問題もないと考えている

自分がプログラミング本格的に始めた15年前とかだと、なかなか初心者が気軽に入れるようなコミュニティなんてなかった。2chプログラマ板が「入りやすい」と感じるような世界観。

その頃と比べると、初心者向けのコミュニティも、コンテンツも、絶対増えてると思うし、ベテランと話してみたい要求もあるだろうけど、そうじゃなくて同レベルの人たちとやっていきたいって要求の方がきっと多いだろうし、別に現役エンジニアが駆け出しエンジニアを気にかける必要はないと思う。

とはいえ話してみたいなら話してみたいで、駆け出しエンジニアにつながる方法はいくらでもあると思うよ、という話。

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で消えたようなマイナーな洋楽が入っていたりもあって乗り換え。またそこで新居昭乃聞いてたらやくしまるえつこが関連でかかって、そっちもちょいはまり。

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

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

で、来年どうするか

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

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

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

それではよいお年を。