CO2を測る換気モニターのログで湿度グラフを試作し、自動バックアップの取りこぼしを無くした

開発misc-dev

CO2を測る換気モニターのログで湿度グラフを試作し、自動バックアップの取りこぼしを無くした

使っている換気モニター(CO2 を測るもの)のアプリには、湿度のグラフが無い。 朝、アプリ画面のスクリーンショットを貼って、作れないかと Claude Code に聞いた。

調べさせると、アプリは日別のログを残していた。 中身に湿度が入っているのを確かめてから、ログを読むスクリプトとグラフの画面(HTML)を作ってもらった。 試作は Chrome のタブで開いた。 湿度と温度と CO2 の3本を、時間軸をそろえて縦に並べてある。 カーソルを置くと、その時刻の3つの値がまとめて出る。

バックアップのスクリプトは動いていた

あ、そうだ、と思い出したことがある。 このログをバックアップするスクリプトを、Windows の自動化で前に作った気がする。 アプリ側に残るログは、7日分しかない。

確かめさせると、ちゃんと動いていた。 タスクスケジューラの「ログファイル自動コピー」が、毎朝 Python のスクリプトを実行している。 前日分のログをコピーして、Git にコミットする仕組みだった。 2024-06-03 から、674日分のログが貯まっていた。

ついでに、7日を伸ばせないかも聞いてみた。 アプリの exe を解析して、日数を書き換えられないか。 返ってきた答えは「技術的にはできるが、おすすめはしない」だった。 アプリは .NET 製で中身を読みやすく、「7日」はログ用のライブラリに渡している数値だと思われる。 同梱のライセンスファイルにも、解析を禁じる文言は見当たらなかったという。

もっとも、自分がやりたいのは exe の書き換えではなかった。 センサーそのものを、公式アプリを通さない独立したデバイスとして使いたい。 自作のアプリで別の経路からデータを取れば、残す期間も7日ではなく、たとえば30日にできる。 書き換えるわけではないので、こちらは問題ないと思っている。

失敗した日も含めて全部コピーする

今のバックアップは、前日分だけをコピーする作りだった。 これだと、実行に失敗した日の分はそのまま抜け落ちる。 失敗した日も含めて全部コピーできるように、取りこぼしのない形へスクリプトを書き換えてもらった。 念のために作ってあったコピーは、消してよいと伝えた。

もう一つ気になったのは、コミットの行き先である。 ローカルの Git だけなのか、GitHub にも上がっているのか。 ローカルだけなら GitHub にも private で push してほしい、と頼んだ。 スクリプトの修正と GitHub への push は、ここで済んだ。

続けて、独立したリポジトリを1つ作ってほしいとも頼んだ。 言いながら、ログ用のリポジトリはもう作ってもらっていたと気づいた。 結局、ログのバックアップは今の仕組みのまま残す。 調査のドキュメントと、これから書く自作のプログラムは、別に作った独立リポジトリ(GitHub 側も private)に置くことにした。

ログを足すだけのコミットを Codex にレビューさせても、意味がない。 ログ用のリポジトリはレビューの対象から外してもらい、除外が効いたことも確かめさせた。

センサーが測っているのは3つだけ

センサーを公式アプリ抜きで使う下調べとして、アプリとセンサーのやりとりを調べさせた。 アプリ本体からは、STA 以外のコマンド(STP、VER?、FRC=)が見つかった。 公開されている実装と突き合わせたうえで、逆コンパイラを入れてソースでも確かめてもらった。 ドキュメントにまとめる前に、結論の筋もレビューにかけさせた。

センサーが測っているのは、CO2、温度、湿度の3つだけだった。 STA 以外のコマンドも、新しい測定値は返さない。

ただ、大事な発見が1つあった。 ログに残っている湿度は、センサーが出した生の値ではない。 公式アプリが補正してから記録している。 朝に試作した湿度グラフも、ログを読んでいる以上、この補正後の値を描いていることになる。

区切りと、残った湿度チャート

調査のコミットは push してかまわない、と伝えた。 コミットでは Codex の指摘が3件出た。 重要度は Claude Code に判定し直させた。 実際にデータを失う経路だった1件を直し、残りは理由を付けて飛ばした。 グラフの試作も独立リポジトリに保存させ、コミットと push まで済ませてもらった。

締めぎわにも、湿度のチャートを見たい、今は湿度のチャートになっていない、と口にした。 それでも、まあいいかと思い直した。 これはこれで、いったん完了にする。 続きはまた今度やる。

Claude アプリのブラウザでポップアップが出ない件

午前中には、Claude アプリからブラウザを操作するときの詰まりについて、次のように言われていると聞いた。

  • Claude アプリの内蔵ブラウザでは、そもそもポップアップが出てこず先へ進めない
  • Chrome の Claude 拡張機能から Chrome を操作すると、ポップアップを操作できない

ここで言うポップアップは、たぶんアラートのようなダイアログのことだろう。 自分の作業で当てはまりそうなのは、会計ソフトAで年度を切り替える操作である。 あれは内部 API でやっているはずなので、API を叩けば回避できるのではないか。

確かめさせると、その理解で合っていた。 年度切替の実装は、会計ソフトA 用に自作した Chrome 拡張機能のリポジトリにあった。

貼り付けた文章から記事を1本

同じ午前中に、貼り付けた文章をもとに 12の言い換えを偉人の言葉で裏付ける記事 を新しく作ってもらった。 名言は誤った帰属が多いので、出典を1つずつ確かめさせてから書かせた。 本番へのデプロイは16.1分で、エラーは出なかった。

PHP の脆弱性と、もう無いはずの WordPress

夕方、PHP に CVSS 9.2 の脆弱性があって、かなり危ないという話を耳にした。 自分のサイトは、もう WordPress ではないはずだ。 妻のサイトも、WordPress から Cloudflare への移行を終えている。 だから PHP は関係ない、という理解で合っているかを確かめさせた。

合っていた。 両サイトとも Cloudflare から配信されていて、PHP も WordPress も動いていない。 今回の脆弱性の影響は受けない。

残ったのは、妻のサイトが以前載っていたレンタルサーバーの扱いである。 どこの事業者だったか、自分でもはっきり思い出せない。 Google Workspace の CLI で Gmail を検索させると、100件がヒットした。 そこから、送信元と件名を取り出させた。 旧サーバーはもう名前解決もできず、消えていた。 「大丈夫」と言える根拠になったのは、2月に届いていたレンタルサーバーの解約メールである。

ホスティングとドメイン、解約の経緯は、妻のサイトのリポジトリにインフラ履歴のドキュメントとして書いてもらった。 最初のコミットは、Codex のレビューで止まった。 「個人情報が入っている」という critical の指摘だった。 そのあと、ドキュメントを含む2ファイルをコミットしてもらい、このセッションを閉じた。 push はしていない。

学び

  • 公式アプリのログに残る湿度は、センサーの生の値ではなく、補正後の値だった。ログを読んでグラフにするだけでは、この違いは見えない
  • 前日分だけをコピーするバックアップは、失敗した日の分を取りこぼす。失敗した日も含めて全部コピーする形に直した
  • 「もう WordPress は無い」という理解は合っていた。思い出せなかったレンタルサーバーの解約は、Gmail を検索して2月の解約メールで裏付けた
#CO2モニター#湿度#タスクスケジューラ#バックアップ#PHP脆弱性#WordPress#Claude Code