2026年4月7日の開発日記
朝から法人税モジュールのPythonファイルを開き、夜にはStream Deckのボタンを押して音声入力のトグルが動くのを確認していた。その間にChrome拡張のストレージ移行を済ませ、教材テキスト1,469行を書き上げ、ディレクトリを連番でリネームした。手を動かし続けた一日。
今日やったこと
1. CF教材の法人税モジュール実装・統合・リファクタリング
法人税ライフサイクルモジュール(CF_306)を新規実装し、総合演習(CF_300)と運転資本(CF_304)の両パイプラインに統合した。統合した瞬間CFWSの数字が合わず、仕訳シートの行数を数えて二重計上バグに気づいた。原因は304の運転資本Excelが既に法人税仕訳を含んでいたこと。exclude_taxフラグで解決。
その後、CFWS営業CF小計の調整列を日本基準の様式2に並び替え、法人税等の支払額を小計外に正しく配置し、取引_税金シートをINDEX/MATCHの数式化まで持っていった。最後に3ファイルに散在していたbuild_tax_journalsをmf_journal.pyに統合する4タスクのリファクタリングを完了。Codex(GPT-5.4)が総合演習版のスコープ漏れを指摘してくれたのが効いた。
主な成果:
- CF_306法人税ライフサイクルモジュール新規実装
- CF_300総合演習・CF_304運転資本への法人税統合
- 二重計上バグ修正、CFWS様式2準拠
- 税金モジュールのリファクタリング(重複3ファイル→1関数に統合)
詳細: CF精算表: 法人税ライフサイクルモジュールの実装・統合・リファクタリング
2. Chrome拡張のストレージセキュリティ改善
sessionStorageが他の拡張のcontent scriptから読める問題を発見。会計ソフトA連携のChrome拡張で、スプレッドシートIDなどを保存していた箇所をchrome.storage.localに全面移行した。4ファイルの書き換え、同期→非同期の変換、テストモック更新を経て135テスト全パス。
あわせて、約1.6GBのTwitterアーカイブ(11,669件のツイート)をSQLiteに取り込み、年度別サマリーを生成した。
主な成果:
- sessionStorage → chrome.storage.local全面移行(135テストパス)
- デッドコード(setExportQueue)の発見
- Twitterアーカイブ11,669件のSQLite化
詳細: Chrome拡張のsessionStorage脱却とTwitterアーカイブのSQLite化
3. CF教材テキスト制作とプロジェクト構造整備
参考書のSQLiteデータベースから421ページ分のCF計算書データを抽出し、4ファイル・計1,469行のチャプター解説ドラフトを生成した。Codexレビュー2回で致命的指摘4件(会社設定の具体化、難易度順の見直し、中間演習の追加等)を修正。ティーチングガイドをCFWS中心のインクリメンタル方式に全面改訂した。
さらに、ドキュメント4ファイルの旧シート名(TPL_→取引_)を更新し、貸付金と借入金をディレクトリ分離、全7ディレクトリを連番方式(ライフサイクル_01_株主資本〜_07_総合演習)にリネーム。スクリプト8本・ドキュメント6本の参照を一括更新した。会計基準JSONデータ(5基準・31条文)も作成。
主な成果:
- チャプター解説4ファイル1,469行のドラフト完成
- ディレクトリ連番リネーム(7本)、スクリプト・ドキュメント14本の参照更新
- 会計基準JSON(財規113-115条、会社法445条、連結CF作成基準)
4. Stream Deck × AutoHotkeyで音声入力トグル
Claude Codeの音声入力(スペースキー長押し)をStream Deckのボタン1回で開始/停止する仕組みを実装。最初はSend "{Space down}"を1回送るだけで試したがキーリピートが発生せず失敗。ループで50msごとにSpace downを送り続け、状態ファイルの有無でトグルする方式に変更して成功。ペイン間の自動切り替え(他ペインの状態ファイルを先に消す排他制御)も追加した。
主な成果:
- スペースキー長押しトグルの実装
- 4分割画面のペイン間自動切り替え
詳細: Stream Deck × AutoHotkeyでClaude Codeの音声入力をトグル化する
今日の試行錯誤
| # | テーマ | 試したこと | 結果 | 気づき |
|---|---|---|---|---|
| 1 | CF_300法人税統合 | 総合演習に法人税仕訳を追加 | 金額が二重 | 304の運転資本Excelに既に法人税仕訳が入っていた |
| 2 | 二重計上修正 | filter_journalsにexclude_taxオプション追加 | 成功 | 入力データの前提確認が先 |
| 3 | 未払法人税等 | 計上日と支払日を同期間に設定 | BS残高が0 | 決算日12/31計上、翌年2/28支払に修正して解決 |
| 4 | CFWS行順序 | BS由来/PL由来を分けて出力 | 列と行が不一致 | adjustmentsの順序のまま1ループで出力に変更 |
| 5 | Space down送信 | Send "{Space down}"を1回 | キーリピートせず | OSのキーリピートは物理キー固有。ソフトウェアはループが必要 |
| 6 | インタラクティブシミュレータ | Phase 0-2を実装しUIまで完成 | ユーザーが全revert | 先にイメージを共有すべきだった |
| 7 | Codexレビュー | 税金リファクタリング計画をレビュー | 総合演習版の漏れ発見 | スコープの抜け漏れを外部レビューが拾う |
今日の学び
- 二重計上は仕訳シートの行数を数えた瞬間に気づいた。「あ、倍ある」と思ったら入力データの前提を疑う
- CF様式2の並び順(非資金損益→営業外損益→運転資本増減)はソート関数で制御すると後から別論点を追加しても崩れない
- sessionStorageとchrome.storage.localはセキュリティモデルが根本的に違う。拡張開発では最初からchrome.storage.localを使うべき
- AutoHotkeyの
Send "{Space down}"はキーリピートを再現しない。物理キーの長押しとソフトウェアのキーイベントは別物 - インタラクティブUIを作る前にスクリーンショットやモックアップでイメージを共有する方が手戻りが少ない