2026年4月10日の開発日記
朝6時からEDINET DB APIと格闘し、財務データの単位混在問題を踏み抜いた。午後はSQLite→Turso移行の計画をCodexにレビューさせて書き直し、マルチテナントDBアーキテクチャの議論で一日の半分を使った。合間にExcelショートカット講座の移行を完了させ、ずんだもんの音声ナレーションを試作して撤回するという寄り道もあった。
今日やったこと
1. EDINET DB API + 財務データ分析・チャート生成
朝一でJ-Quants APIを調べたが、財務諸表の詳細はプレミアムプラン限定と分かり5分で撤退。EDINET DB APIに切り替えて会計ソフトA・Bの財務データを取得し、Turso DBに格納した。既存ブログ記事の数字と突合したところ、研究開発費で円単位と千円単位がAPI内で混在している問題を発見。Postmanでの生データ確認を経て、IRBankスタイルのHTML年次推移チャートと四半期データテーブルを生成した。
主な成果:
- 会計ソフトA・BのEDINETデータをTurso DBに格納
- API単位混在問題の発見と対処
- 年次8指標 + 四半期5指標のHTMLチャート完成(±両方向バー、売上高共通スケール)
- 研究開発費→ソフトウェア資産計上の付け替え構造を分析
詳細: EDINET DB APIで財務データを取得しIRBankスタイルの年次・四半期チャートを生成した
2. Turso DB移行計画 + マルチテナントDBアーキテクチャ設計
書籍OCRデータ16冊分のSQLite(FTS5全文検索付き)をTursoに載せ替える計画を立てた。Codexレビューで「FTS5互換性未検証」「データサイズ未確認」「ロールバック手順欠如」の3点を指摘され、計画を修正。Phase 0(FTS5検証)に着手したが.env設定で積み残し。そこから会計データのTurso格納設計、DB-per-tenant vs 共有DB+RLS、シャーディング、Supabase RLS事故パターンまで一気に掘り下げた。
主な成果:
- Turso移行計画の策定(Codexレビュー反映済み)
- B2B→DB-per-tenant、B2C→共有DB+RLSの使い分け整理
- マルチテナントDB設計のまとめドキュメント作成・メール送信
- Supabase RLS設定漏れパターンの検証
詳細: Turso DB移行計画とマルチテナントDBアーキテクチャ設計
3. Excelショートカット講座の移行完了・改善・VOICEVOX音声テスト
前日の積み残し5タスクを棚卸しし、字幕品質改善に着手。「字幕は動画の操作実況、文脈説明はtextsに入れる」という役割分担に気づいて方針転換し、textsコンテンツの品質レビューと補強を実施。まとめページをCtrl系/Alt系/Other系の種別タグ付き全講座目次テーブルに統合し、StreamDeck紹介ページの移植、パンくずリスト追加、非推奨ショートカットの注記も完了。VOICEVOX(ずんだもん)で音声ナレーションを試作したが、商用利用のクレジット表記が必要と判明し撤回。動画音声ON/OFFトグルのみ残した。
主な成果:
- 全57ページの移行完了確認(対応表作成)
- textsコンテンツ品質改善(プレースホルダー解消、演習テキスト追加)
- まとめページの統合リファクタリング(セミラティス構造)
- VOICEVOX音声テスト→撤回の判断
- Git LFS 195MB問題の解決
詳細: Excelショートカット講座の移行完了・字幕とtextsの役割分担・VOICEVOX音声テストの顛末
今日の試行錯誤
| # | テーマ | 試したこと | 結果 | 気づき |
|---|---|---|---|---|
| 1 | 財務データ取得 | J-Quants API調査 | 撤退 | 財務諸表詳細はプレミアムプラン限定 |
| 2 | データ突合 | EDINET APIデータと既存記事の数字を比較 | 差異発見 | 研究開発費で円/千円単位が混在 |
| 3 | 広告宣伝費 | EDINET APIから取得を試みる | APIに項目なし | IRBankの手動データで補完、概算値は危険 |
| 4 | 有報PDF解析 | テキストブロックAPIで内訳を探す | 記載なし | PDF直接解析でPython変換→101ページ目に発見 |
| 5 | 字幕品質改善 | 字幕テキストに文脈説明を追加 | 方針誤り | 字幕は操作実況、文脈はtextsの役割 |
| 6 | texts表示 | texts配列に2要素目を追加 | 表示されず | textsidxでスライド対応、1枚なら0のみ表示 |
| 7 | Turso移行計画 | 最初の3フェーズ計画を策定 | 指摘3点 | FTS5互換性・データサイズ・ロールバック手順が抜け |
| 8 | ずんだもん音声 | VOICEVOXで7字幕分の音声生成 | 機能は動いた | 商用利用のクレジット表記要件で撤回 |
| 9 | Git push | 通常のgit pushが拒否される | LFSが原因 | git lfs push --allで195MB分を先にアップロード |
今日の学び
- EDINET DB APIのレスポンスは項目ごとに単位が異なる場合がある。同一レスポンス内でrevenueは円単位、rnd_expensesは千円単位ということが実際に起きる
- IRBankに載っている広告宣伝費・のれん償却額はEDINET APIには含まれない。補完する場合はデータソースを明記する
- 字幕(subtitles)とテキスト(texts)は役割が違う。字幕は動画操作の実況、textsは文脈説明
- DB-per-tenantはB2Bで有効、B2CはRLS付き共有DBが現実解。Tursoが推奨する理由はSQLiteのファイルベース特性でDB作成コストが極めて低いから
- Supabase RLS設定漏れは「RLS有効 + ポリシーなし + service_role key使用」パターンが最も危険