こもろぐ @tenkoma

What We Find Changes Who We Become -- Peter Morville著『アンビエント・ファインダビリティ 』

広告:本ブログで紹介している書籍等商品の紹介でAmazonアソシエイトを利用していることがあります。

【追記あり;不具合・修正されそう】PHPUnit 10 から、PhpStorm UIでテスト実行中の出力(echo, var_dump, etc...) が、テストログに出力されない

追記 2023/07/17 不具合としてレポートされ、議論が進んだ結果 10.2.6 (現時点で未リリース)で修正されるようです

追記前の本文

小ネタ。

PHPUnit 10.1 を利用したテストコードをPhpStorm から実行していて、上記の振る舞いの変化に気づいた。どのバージョンで変わったのか、どうすればいいのかを考えてみたい。

PHPUnit 9.6, 10.0 で振る舞いの違いを観察

検証環境は以下の通り

  • PHP 8.2.6
  • PhpStorm 2023.1.2
  • PHPUnit 9.6.8 (9系の最新バージョン), 10.0.0 (10系の最初のバージョン)

サンプルのテストコードは以下である。

<?php  
  
declare(strict_types=1);  
  
namespace Tenkoma\VardumpDuringTestExec\Test\Unit\Case;  
  
use PHPUnit\Framework\TestCase;  
  
class IntegerTest extends TestCase  
{  
    public function testVardump(): void  
    {  
        var_dump(['a' => 'b']);  
    }  
}

PHPUnit 9.6.8では出力された。

PhpStorm + PHPUnit 9.6.8でテスト実行中に var_dump() を実行した

PHPUnit 10.0.0では出力されなかった。

PhpStorm + PHPUnit 10.0.0でテスト実行中に var_dump() を実行した

他の出力形式の場合 (10.0.0)

PhpStorm からPHPUnit を呼び出しているときって、--teamcity ってオプションついてたけど、他の出力形式だとどうなんだろう?

PHPUnit 10.0.0 で、 --teamcity オプションをつけてテスト実行した

--teamcity オプションでテキストで出力させてみた。var_dump() 出力されない。

オプション未指定の場合。

PHPUnit 10.0.0 で、オプション未指定でテスト実行した

--testdox 形式の場合

PHPUnit 10.0.0 で、 --testdox オプションをつけてテスト実行した

var_dump() 出力されない。また、例外がスローされている。(こちらの例外については検証してない)

他の出力形式の場合 (10.1.3)

最新版でも確認してみた。

PHPUnit 10.1.3 で、 --teamcity オプションをつけてテスト実行した

--teamcity の場合、出力されない。

PHPUnit 10.1.3 で、オプション未指定でテスト実行した

未指定だと出力された。(10.0.0 → 10.1.3 のどこかで振る舞いが変わった)

PHPUnit 10.1.3 で、 --testdox オプションをつけてテスト実行した

--testdox でも出力された。(10.0.0 → 10.1.3 のどこかで振る舞いが変わった)

ここまでのまとめ

  • PhpStorm UI から PHPUnit テストケースを実行している場合、10.0以降、テスト実行中の出力(echo, var_dump, etc...)が出力コンソールに表示されなくなる (--teamcityオプションの振る舞いが変わった)
  • オプション未指定、--testdox 指定の場合も 10.0.0 では出力されなくなっていたが、最新の10.1.3 では出力されるようになっている

どうすればいいか

いくつか考えてみた。

開発者テスト(Testing)で var_dump() を使いたくなるのを改善する

アサーションせずに var_dump()したくなるのは、

  • プロダクションコードがテストし辛い状態である
  • テストコードが理解しにくかったり実行し辛い状態である
  • プログラマの実装スキルが不足している状態である
  • プログラマのテストスキルが不足している状態である

などのうちいずれかの兆候もしくは全部の兆候の可能性があるので、開発プロセスやプログラミングに改善の余地がある。はい。 (自己ツッコミ)

Xdebugリモートデバッグ連携して、ブレークさせて、変数を確認する

準備の手間がありますが、便利。

PhpStorm リモートデバッグでブレークして、変数を調べる

出力をアサーションして、Diffウインドウで確認する

  • var_dump() などの出力が、実際にコンソールに出力されないのは、PHPUnitが出力バッファ制御を使っているから
  • 出力バッファ制御を使っている理由は、出力結果のアサーションで利用するため

なので、出力をアサーションすれば、間接的に結果が得られる。

expectOutputString() で、var_dump() 出力をアサーションし、エラー出力を見る

出力バッファに蓄積したデータを取得してアサーションする

前述の方法とほぼ同じ

TestCase::output() で出力バッファのデータを取得してアサーション

PHPUnit 10.1.3 最新版だと、--teamcity 指定しなければ、出力されるので、シェルから実行する

前述の通り、検証した結果 PhpStorm 連携をあきらめれば、var_dump() 出力が得られることがわかったので、--teamcity を指定しなければOK。

ob_flush() を呼び出して、出力バッファに蓄積されたデータを出力する

テスト実行中のデータは出力バッファに蓄積されているので、それを出力させる。 この方法は、テストコードに expectOutputString() アサーションがあると、Failする可能性がある。

メールアカウントをGoogle Workspaceに移行して、1つに集約することにした

20年前からインターネット利用してて、メールアドレスが増えてきてそれぞれのアカウントを見に行くのが面倒くさくなったので、Google Workspaceに移行することにした。 スマホアプリの通知もそうだが、自分に不要な通知に煩わされる生活にならないようにしたい。

いままで以下のメールアドレスを使ってきた

  • (1) hotmail.com のメールアドレス
    • 2000年より少し前に取得したもの。ほぼ個人連絡用に使っていたが、いまはほぼ使わず
  • (2) tenkoma.net のメールアドレス
    • 2004年に使い始めた、さくらのメールボックスで3つのアカウントを作っていた。いまはネットサービス向けのもの以外はほとんど使っていない
      1. ネットサービス向けアカウント…AmazonやNetflixなどのオンラインサービス会員登録用。ずっと利用し続けていた
      2. 個人連絡用…2, 3年は使っていたが2010年からはまったく使わなくなった
      3. ウェブサイト管理者用…作ったけどほぼ使わず
    • さくらのドメインで契約中
  • (3) gmail.com のメールアドレス
    • 2005年取得した。個人連絡とネットサービスの両方で使っているが日常的には見に行かない
    • Google One ベーシック契約中
  • (4) me.com (icloud.com) のメールアドレス
    • 2009年頃、サービス名がMobileMeだったころに使い始めた。ネットサービスと個人連絡用に使っている。
    • iCloud+ 50 GB ストレージ付き 契約中

ネットサービスと個人連絡用でいまでも使っているのは (2)-1, (3), (4)である。 移行を思い立ったのは、メインで使っていた(2)-1 のさくらのレンタルサーバのメールボックスに迷惑メールがくる頻度が増えてきて(1日平均5通以上) 振り分けが面倒くさくなったのも大きい。

Google Workspace にした理由

サービスをたいして比較検討したわけではなく、3つの選択肢から選んだ。

  1. Google Workspace
  2. 個人用Gmail…(3) に集約する
  3. iCloud メールアドレス(me.com)…(4) に集約する

の3つを思いついた。 1,2,3 のどれでも独自ドメインでの運用はできるらしい。 しかし、1はキャッチオール機能があり、 ネットサービスを新しいメールアドレスに移行せずに使い始めて、あとからネットサービスの登録メールアドレスを変更していけるのが良かった。

キャッチオール アドレスを設定すると、ドメイン内の実在しないメールアドレスに誤って送信されたメールも受信できます。

Google Workspace でのメールのルーティングと配信のオプション

  1. 個人用Gmailで、デフォルトで広告が出ないのもよい

大まかな移行手順

ひとまず、管理者アカウント登録〜キャッチオール設定までやれば、独自ドメインメールアドレスをGmailで受信できるようになるので、それ以降のメールデータ移行や、Webサービスアカウントの切り替えは後でゆっくりできる

  • 管理者アカウント登録
  • ドメイン認証
  • MXレコード設定
  • キャッチオール設定

ここまでは約1時間でできた。 キャッチオール設定で、アカウントが存在しない場合、すべて管理者アカウントのGmailに届くので 移行後に「(2)の独自ドメインで作ったメールアドレス 3つ」に届いても、逃さずに済む。

SPF/DKIM/DMARC 設定

SPFの設定はすぐできた。 DKIM鍵の設定は、ヘルプだと24〜72時間でDKIM鍵が取得できるようになると書かれているが、 実際には5日以上経たないと取得できなかった。またさくらのドメインコントロールパネルの制限で2048bitの鍵は設定できず。(ドメインも移管したくなった)

重要: 組織で Gmail を有効にした後、24~72 時間ほど待ってから、管理コンソールで DKIM 鍵を取得してください。待ち時間が経過する前に鍵を生成しようとすると、[DKIM 認証の設定を更新できませんでした] というエラーが表示される場合があります。

ドメインで DKIM を有効にする

ネットサービスのアカウント移行

アカウントの移行は、Google Workspace Gmail にメールが届いて、受信メールアドレスが古いメールアドレスだったら 古いユーザー名@ というラベルをつけるようにして、自分にアカウント移行を促すようにした。

メールデータの移行

  • (1) hotmail.com, (4) me.com のメールデータは メール(Mac App)のUI上でhotmailとGmailのアカウントを追加してコピーペーストした。
  • (2) tenkoma.net のメールデータはThunderbird(Mac App)のUI上でhotmailとGmailのアカウントを追加してコピーペーストした。
  • (3) gmail.com まだ移行してない

移行してどうだった?

2022/5/4に使い始めて2週間ちょっとになる。 (2)-1 に1日平均5通以上届いていた迷惑メール、フィッシングメールがほぼ届かなくなった。管理コンソールからメールログ検索してみるとまだちらほら送られてきて入るが、Gmail受信箱までは届かない。この2週間で1件だけGmailまで届いたが、迷惑メールとして振り分けられていた。

移行して、受信トレイに届いたメールは、用が済んだらアーカイブかゴミ箱に移動して空にする運用ができるようになった。

  • ネットショップの注文履歴メールなどは即アーカイブ。
  • ネットサービスのログイン通知は、見に覚えがあればすぐゴミ箱に捨てる
  • その他、届いても数日中に見ればよいメールはラベルを付けて未読のままアーカイブするフィルタを追加
  • 見なくてもよいメールマガジンは適宜解除するか迷惑メール行き(無料会員だとメルマガ解除できない某サービスのことよ…)

という感じ。メール通知を最適化していけそう。

空気清浄機と給気口フィルター

1年前にダイソンの空気清浄機を買った

www.dyson.co.jp

稼働率は平均1日2時間くらい(目標値設定: ホコリや花粉に敏感)で、これくらいだったら不要だったな、と思ってたけど、2021年3月30日の黄砂飛来時は稼働音がずっとうるさくなっていた。

www3.nhk.or.jp

f:id:tenkoma:20210509174032j:plain
2021年3月30日の空気質グラフ

この空気清浄機は風量が10段階あって、ずっと4〜7で稼働していて空気質が下がらない状態。 仕事するのにこの騒音はつらいなと思って、給気口につける静電フィルターを導入してみた。

www.unix-store.jp

これを導入したあとは、空気清浄機が稼働することが減った。 昨日から今日にかけても黄砂が来ているらしいけど、グラフは以下の通り。

f:id:tenkoma:20210509174822p:plain
2021年5月8日〜9日の空気質グラフ

www3.nhk.or.jp

黄砂濃度が前回と同じ条件ではないし、比較テストしているわけではないので、意味のある比較では全くないけど、気密性の高い部屋では、空気清浄機を買うより、給気口フィルターを改善したほうがいいこともあるかもしれない。

今契約しているサブスクリプションまとめ

今までまとめて把握できてない状態だった。 使わなくても良くなったATOKと、あまり使っていなかったesa.ioを解約したけど、サブスクリプション把握できてないなぁ、と思ったのでまとめてみた。

2020/09/16 現在 (過去1年の実績なので、ドル払いなどで変動もあります)

娯楽系

  • Spotify Premium(年間契約 ¥9,800) ¥9,800
  • Amazon Prime (年間契約 ¥4,900) ¥4,900
  • Netflix (スタンダード 月 ¥1,320) ¥15,840
  • Nintendo Switch Online (個人プラン 12ヶ月 ¥2,400) ¥2,400

生活ツール系

  • マネーフォワード (プレミアム ¥500) ¥6,000
  • Sleep Cycle (年間 ¥240) ¥240

開発ツール系

  • GitHub (sponsor 含む ¥1,452) ¥17,424
  • さくらのVPS ¥43,560
  • tenkoma.net ドメイン(年間 ¥1,886) ¥1,886
  • tenkoma.devドメイン (年間 ¥1,540) ¥1,540
  • JetBrains All Products Pack (3年目以降 ¥18,920) ¥18,920
  • DeepL Pro (Starter 年払い ¥9,000) ¥9,000

寄付系

  • Rebuild.fm スポンサー ¥10,332
  • Wikimedia への寄付(秘密)

その他

  • はてなブログ (はてなブログPro 2年コース¥14,400) ¥7,200

Work from homeが始まってから買ったもの

3月から1度もオフィスに行ってないです。

もとからデスク・オフィスチェアや外付けモニタはあったので、自宅で仕事出来る環境はありましたが、より快適にしたかったので半年でいろいろ買った。

EIZO FlexScan 27.0インチ ディスプレイモニター EV2785-BK

2台目のEV2785-BK。

2台あっても生産性は2倍にはならない。

右側にエディタを表示して左側にそれ以外を表示して使ってます。

Amazonで買った。

エルゴトロン MXV デュアル デスクモニターアーム

定評があるらしかったので。 机を壁に付けて使っているとアームの可動範囲がせまく、モニターが大分前面に来てしまうので調整したい。モニタと同じくAmazonで買った。

YubiKey 5Ci

Work from homeとは関係ないけど、GitHubフィッシングが話題になったときに、Amazonで買った。

吸気口フィルター

ずっと家に居るので、空気質が気になりはじめた。 空気清浄機を買おうと思ったが、24時間換気システムの吸気口フィルターを交換すれば改善できそうと思い、適合するフィルターをAmazonで買った。

買ったあとで、もっと性能の良いフィルターがあることを知った。

新フィルターTF-A-PG/PF<トレフィン>登場!! | 高品質フィルターのユニックスストア

ダイソン 空気清浄機能付 ファンヒーター Dyson Pure Hot + Cool Link HP03WS ホワイト/シルバー

結局空気清浄機をヨドバシで買ってしまった。

温風送風機能が付いているので、エアコンが故障したときのバックアップだよ(言い訳)

1日12時間稼働で1年でフィルター交換らしいが、 空気質が悪くなったら稼働するオートモードがあり、平均2時間も稼働してないので、 4年くらいは持ちそう。 アプリをインストールすると、稼働時間・空気質・湿度・温度のモニタが出来るので、むしろその機能をよく見ている。

掃除機も持ってるけど、ダイソンは使いたくなるデザインが上手いと思う。

ヨドバシ.com - ダイソン Dyson HP03WS [空気清浄機能付ファンヒーター Dyson Pure Hot+Cool Link ホワイト/シルバー] 通販【全品無料配達】

ロジクール HD プロ ウェブカム フルHD 1080p C920S

プライバシーシャッターつきなので。

ヨドバシ.comで買いました。

ヨドバシ.com - ロジクール Logicool C920s [ロジクール HD プロ ウェブカム] 通販【全品無料配達】

AKG LYRA USBマイク

配信とかはしない。

サウンドハウスで買いました。

AKG ( アーカーゲー ) >LYRA USBマイク 送料無料 | サウンドハウス

サンワサプライ エルゴノミクスフットレスト MR-FR1

足への負担が気にならなくなったので、効果あるんだろう。

ヨドバシ.comで買った。

ヨドバシ.com - サンワサプライ SANWA SUPPLY MR-FR1 [エルゴノミクスフットレスト] 通販【全品無料配達】

ロジクール Logicool MX Master 3

ヨドバシ.com - ロジクール Logicool MX2200sGR [MX Master 3 アドバンスド ワイヤレス マウス グラファイト] 通販【全品無料配達】

ヨドバシ.comで買った。

MX Master 2sにくらべると、スクロールが快適になった。

ノートPCクーラー

ヨドバシ.com - ミヨシ miyoshi NSF-03 [ノートPCクーラー スタンダードタイプ] 通販【全品無料配達】

ヨドバシ.comで買った。

7月に私物のMacbook Pro 2016モデルをバッテリー膨張で有償修理した。

底が熱くなるけど使えるか、と思っていたのを考え直して冷却台を導入。

光らなくても良いのに、と思ったが、ノートPCを載せればほぼ塞がるし、付けっぱなしで気づかないことが防げるかもなのでいいのかもしれない。

電源タップ 3m

サウンドハウスで2つ買った。

CLASSIC PRO ( クラシックプロ ) >電源タップ PDS8 3m 送料無料 | サウンドハウス

電化製品増えて足りなくなってきたので。

チェアマット

ヨドバシ.comで買った

ヨドバシ.com - ロアス LOAS RCM-007CL [チェアマット ハードフロア用] 通販【全品無料配達】

開発環境でOpcacheを有効にする

Docker Desktop for Mac の環境で動かしていたPHPアプリケーションが遅い(1リクエスト1.2〜1.4秒ほどかかっていた)。 ずっと、Docker Desktop for Macの Mount 機能は速度が出ないからだ、と思いこんでいて、最近知った Mutagenを試したけど、200ミリ秒ほどしか改善しなかった。そこでもしかしたら遅い原因は他にあるんじゃないかと思い、調査したところ、以下の2つを変更したらかなりレスポンスタイムが短くなった(300〜450ミリ秒になった)

  • Xdebugを無効にする(xdebug.so を読み込まない)
  • OPcache を有効にする

Xdebug については、リモートデバッグやプロファイラなど遅くなりそうなオプションを全部Offにしても300ミリ秒くらいは増えるので、拡張自体が重いのかも、と思っている。

開発環境でOpcacheは無効化されていたけど、開発環境向けにファイルを変更したら即時反映するよう設定出来るんじゃないかと思ってやってみたら、できそうだったので記事としてまとめる。

開発環境向けOpcache 設定

PHPスクリプトへの変更が即時反映されるための設定は以下の通り。

; Opcache を有効にする
opcache.enable=1
; PHPスクリプトのタイムスタンプをチェックして、更新されていたらオペコードキャッシュを作り直す
opcache.validate_timestamps=1
; タイムスタンプの再チェックを行う時間(秒)。0なら実行毎にタイムスタンプチェックする
opcache.revalidate_freq=0

Laravel 7.2 Hello, world アプリで測ってみた

フレームワークを使ったPHPアプリケーションでどのくらい効果があるかみるために、以下のようなサンプルアプリケーションを作ってみた。

composer create-project してHello, world ページを作っただけのLaravelアプリケーションがあるので、

git clone git@github.com:tenkoma/opcache-config-for-dev-sample.git
cd opcache-config-for-dev-sample
cp .env.example .env
docker-compose run composer composer install
docker-compose up -d
docker-compose exec php-fpm php artisan key:generate

して、http://localhost:8000/hello にアクセスしてテストできる。 初回のアクセスはキャッシュを作るので2回目以降のタイムが速くなる。 Hello, Worldのコードは以下の通り。

<?php
// routes/web.php
Route::get('hello', function () {
    return 'Hello World';
});

テスト結果は以下の通り(10回ほどリクエスト後に10回計測)

  • 1) Volumeオプション:デフォルト(consistent), opcache.enable=0: 平均 0.96s (min 0.84s, max 1.09s)
  • 2) Volumeオプション: cached, opcache.enable=0: 平均 0.44s (min 0.38s, max 0.48s)
  • 3) Volumeオプション: cached, opcache.enable=1 他上記設定を有効: 平均 0.03s (min 0.03s, max 0.04s)

(2) → (3) で 0.35s〜0.44s くらい速くなった。

おわり。