[{"data":1,"prerenderedAt":409},["ShallowReactive",2],{"content-/2026-04-10-diary":3,"all-pages-for-dir":407,"og-image-/2026-04-10-diary":408},{"id":4,"title":5,"body":6,"category":387,"description":388,"extension":389,"meta":390,"navigation":391,"path":392,"project_name":393,"published":394,"publishedAt":395,"seo":396,"stem":397,"tags":398,"todo":405,"updatedAt":405,"__hash__":406},"pages/2026-04/2026-04-10/diary-2026-04-10.md","2026年4月10日の開発日記 - EDINET API財務チャート・Turso移行計画・Excel講座完成",{"type":7,"value":8,"toc":374},"minimark",[9,14,18,22,27,30,36,52,63,66,70,73,77,91,99,101,105,108,112,129,137,139,142,333,335,338,355,357,360],[10,11,13],"h1",{"id":12},"_2026年4月10日の開発日記","2026年4月10日の開発日記",[15,16,17],"p",{},"朝6時からEDINET DB APIと格闘し、財務データの単位混在問題を踏み抜いた。午後はSQLite→Turso移行の計画をCodexにレビューさせて書き直し、マルチテナントDBアーキテクチャの議論で一日の半分を使った。合間にExcelショートカット講座の移行を完了させ、ずんだもんの音声ナレーションを試作して撤回するという寄り道もあった。",[19,20,21],"h2",{"id":21},"今日やったこと",[23,24,26],"h3",{"id":25},"_1-edinet-db-api-財務データ分析チャート生成","1. EDINET DB API + 財務データ分析・チャート生成",[15,28,29],{},"朝一でJ-Quants APIを調べたが、財務諸表の詳細はプレミアムプラン限定と分かり5分で撤退。EDINET DB APIに切り替えて会計ソフトA・Bの財務データを取得し、Turso DBに格納した。既存ブログ記事の数字と突合したところ、研究開発費で円単位と千円単位がAPI内で混在している問題を発見。Postmanでの生データ確認を経て、IRBankスタイルのHTML年次推移チャートと四半期データテーブルを生成した。",[15,31,32],{},[33,34,35],"strong",{},"主な成果:",[37,38,39,43,46,49],"ul",{},[40,41,42],"li",{},"会計ソフトA・BのEDINETデータをTurso DBに格納",[40,44,45],{},"API単位混在問題の発見と対処",[40,47,48],{},"年次8指標 + 四半期5指標のHTMLチャート完成（±両方向バー、売上高共通スケール）",[40,50,51],{},"研究開発費→ソフトウェア資産計上の付け替え構造を分析",[15,53,54,57,58],{},[33,55,56],{},"詳細:"," ",[59,60,62],"a",{"href":61},"/edinet-api-financial-chart-generation","EDINET DB APIで財務データを取得しIRBankスタイルの年次・四半期チャートを生成した",[64,65],"hr",{},[23,67,69],{"id":68},"_2-turso-db移行計画-マルチテナントdbアーキテクチャ設計","2. Turso DB移行計画 + マルチテナントDBアーキテクチャ設計",[15,71,72],{},"書籍OCRデータ16冊分のSQLite（FTS5全文検索付き）をTursoに載せ替える計画を立てた。Codexレビューで「FTS5互換性未検証」「データサイズ未確認」「ロールバック手順欠如」の3点を指摘され、計画を修正。Phase 0（FTS5検証）に着手したが.env設定で積み残し。そこから会計データのTurso格納設計、DB-per-tenant vs 共有DB+RLS、シャーディング、Supabase RLS事故パターンまで一気に掘り下げた。",[15,74,75],{},[33,76,35],{},[37,78,79,82,85,88],{},[40,80,81],{},"Turso移行計画の策定（Codexレビュー反映済み）",[40,83,84],{},"B2B→DB-per-tenant、B2C→共有DB+RLSの使い分け整理",[40,86,87],{},"マルチテナントDB設計のまとめドキュメント作成・メール送信",[40,89,90],{},"Supabase RLS設定漏れパターンの検証",[15,92,93,57,95],{},[33,94,56],{},[59,96,98],{"href":97},"/turso-migration-multi-tenant-db-design","Turso DB移行計画とマルチテナントDBアーキテクチャ設計",[64,100],{},[23,102,104],{"id":103},"_3-excelショートカット講座の移行完了改善voicevox音声テスト","3. Excelショートカット講座の移行完了・改善・VOICEVOX音声テスト",[15,106,107],{},"前日の積み残し5タスクを棚卸しし、字幕品質改善に着手。「字幕は動画の操作実況、文脈説明はtextsに入れる」という役割分担に気づいて方針転換し、textsコンテンツの品質レビューと補強を実施。まとめページをCtrl系/Alt系/Other系の種別タグ付き全講座目次テーブルに統合し、StreamDeck紹介ページの移植、パンくずリスト追加、非推奨ショートカットの注記も完了。VOICEVOX（ずんだもん）で音声ナレーションを試作したが、商用利用のクレジット表記が必要と判明し撤回。動画音声ON/OFFトグルのみ残した。",[15,109,110],{},[33,111,35],{},[37,113,114,117,120,123,126],{},[40,115,116],{},"全57ページの移行完了確認（対応表作成）",[40,118,119],{},"textsコンテンツ品質改善（プレースホルダー解消、演習テキスト追加）",[40,121,122],{},"まとめページの統合リファクタリング（セミラティス構造）",[40,124,125],{},"VOICEVOX音声テスト→撤回の判断",[40,127,128],{},"Git LFS 195MB問題の解決",[15,130,131,57,133],{},[33,132,56],{},[59,134,136],{"href":135},"/excel-shortcuts-course-migration-improvement","Excelショートカット講座の移行完了・字幕とtextsの役割分担・VOICEVOX音声テストの顛末",[64,138],{},[19,140,141],{"id":141},"今日の試行錯誤",[143,144,145,167],"table",{},[146,147,148],"thead",{},[149,150,151,155,158,161,164],"tr",{},[152,153,154],"th",{},"#",[152,156,157],{},"テーマ",[152,159,160],{},"試したこと",[152,162,163],{},"結果",[152,165,166],{},"気づき",[168,169,170,188,205,222,239,256,282,299,316],"tbody",{},[149,171,172,176,179,182,185],{},[173,174,175],"td",{},"1",[173,177,178],{},"財務データ取得",[173,180,181],{},"J-Quants API調査",[173,183,184],{},"撤退",[173,186,187],{},"財務諸表詳細はプレミアムプラン限定",[149,189,190,193,196,199,202],{},[173,191,192],{},"2",[173,194,195],{},"データ突合",[173,197,198],{},"EDINET APIデータと既存記事の数字を比較",[173,200,201],{},"差異発見",[173,203,204],{},"研究開発費で円/千円単位が混在",[149,206,207,210,213,216,219],{},[173,208,209],{},"3",[173,211,212],{},"広告宣伝費",[173,214,215],{},"EDINET APIから取得を試みる",[173,217,218],{},"APIに項目なし",[173,220,221],{},"IRBankの手動データで補完、概算値は危険",[149,223,224,227,230,233,236],{},[173,225,226],{},"4",[173,228,229],{},"有報PDF解析",[173,231,232],{},"テキストブロックAPIで内訳を探す",[173,234,235],{},"記載なし",[173,237,238],{},"PDF直接解析でPython変換→101ページ目に発見",[149,240,241,244,247,250,253],{},[173,242,243],{},"5",[173,245,246],{},"字幕品質改善",[173,248,249],{},"字幕テキストに文脈説明を追加",[173,251,252],{},"方針誤り",[173,254,255],{},"字幕は操作実況、文脈はtextsの役割",[149,257,258,261,264,267,270],{},[173,259,260],{},"6",[173,262,263],{},"texts表示",[173,265,266],{},"texts配列に2要素目を追加",[173,268,269],{},"表示されず",[173,271,272,273,277,278,281],{},"texts",[274,275,276],"span",{},"idx","でスライド対応、1枚なら",[274,279,280],{},"0","のみ表示",[149,283,284,287,290,293,296],{},[173,285,286],{},"7",[173,288,289],{},"Turso移行計画",[173,291,292],{},"最初の3フェーズ計画を策定",[173,294,295],{},"指摘3点",[173,297,298],{},"FTS5互換性・データサイズ・ロールバック手順が抜け",[149,300,301,304,307,310,313],{},[173,302,303],{},"8",[173,305,306],{},"ずんだもん音声",[173,308,309],{},"VOICEVOXで7字幕分の音声生成",[173,311,312],{},"機能は動いた",[173,314,315],{},"商用利用のクレジット表記要件で撤回",[149,317,318,321,324,327,330],{},[173,319,320],{},"9",[173,322,323],{},"Git push",[173,325,326],{},"通常のgit pushが拒否される",[173,328,329],{},"LFSが原因",[173,331,332],{},"git lfs push --allで195MB分を先にアップロード",[64,334],{},[19,336,337],{"id":337},"今日の学び",[37,339,340,343,346,349,352],{},[40,341,342],{},"EDINET DB APIのレスポンスは項目ごとに単位が異なる場合がある。同一レスポンス内でrevenueは円単位、rnd_expensesは千円単位ということが実際に起きる",[40,344,345],{},"IRBankに載っている広告宣伝費・のれん償却額はEDINET APIには含まれない。補完する場合はデータソースを明記する",[40,347,348],{},"字幕（subtitles）とテキスト（texts）は役割が違う。字幕は動画操作の実況、textsは文脈説明",[40,350,351],{},"DB-per-tenantはB2Bで有効、B2CはRLS付き共有DBが現実解。Tursoが推奨する理由はSQLiteのファイルベース特性でDB作成コストが極めて低いから",[40,353,354],{},"Supabase RLS設定漏れは「RLS有効 + ポリシーなし + service_role key使用」パターンが最も危険",[64,356],{},[19,358,359],{"id":359},"関連記事",[37,361,362,366,370],{},[40,363,364],{},[59,365,62],{"href":61},[40,367,368],{},[59,369,98],{"href":97},[40,371,372],{},[59,373,136],{"href":135},{"title":375,"searchDepth":376,"depth":376,"links":377},"",2,[378,384,385,386],{"id":21,"depth":376,"text":21,"children":379},[380,382,383],{"id":25,"depth":381,"text":26},3,{"id":68,"depth":381,"text":69},{"id":103,"depth":381,"text":104},{"id":141,"depth":376,"text":141},{"id":337,"depth":376,"text":337},{"id":359,"depth":376,"text":359},"diary","EDINET DB APIで財務データの突合検証とIRBankスタイルチャート生成、SQLite→Turso移行計画の策定とマルチテナントDB設計の議論、Excelショートカット講座の移行完了とVOICEVOX音声テストまで","md",{},true,"/2026-04-10-diary","daily-log",false,"2026-04-10T00:00:00.000Z",{"title":5,"description":388},"2026-04/2026-04-10/diary-2026-04-10",[399,400,401,402,403,404],"日記","EDINET API","Turso","Excel講座","VOICEVOX","マルチテナント",null,"iDweWMwIK8XtPnBc-BO9toa7QurigTLYriLHwpZILWo",[],"https://log.eurekapu.com/favicon.svg",1776122261552]