[{"data":1,"prerenderedAt":483},["ShallowReactive",2],{"content-/2026-05-25-diary":3,"all-pages-for-dir":481,"og-image-/2026-05-25-diary":482},{"id":4,"title":5,"body":6,"category":465,"description":466,"extension":467,"meta":468,"navigation":406,"ogImage":469,"path":470,"project_name":471,"published":472,"publishedAt":473,"seo":474,"stem":475,"tags":476,"todo":469,"unpublished":472,"updatedAt":469,"__hash__":480},"pages/2026-05/2026-05-25/diary-2026-05-25.md","2026年5月25日の開発日記 - 投資の名著をOCRして財務諸表教材に編み込む",{"type":7,"value":8,"toc":448},"minimark",[9,14,18,22,29,32,37,57,63,82,93,96,100,103,107,122,130,132,136,143,151,153,157,168,176,178,182,185,194,196,199,368,370,373,390,392,395,421,423,426],[10,11,13],"h1",{"id":12},"_2026年5月25日の開発日記","2026年5月25日の開発日記",[15,16,17],"p",{},"今日は1冊の本が、紙の山からデータベースを経由して、教材のコラムに化けていくのを追いかけた一日だった。裁断スキャンした投資の参考書をOCRしてTursoに流し込み、47セクションに整え、そこから「数値ベンチマーク」と「逆張りの読み方」を抜き出して財務諸表教材のページに編み込んだ。途中でWALロックがスクリプトを240秒黙らせ、別セッションのgit操作がファイルを消し、決算スキャンが3週間前の決算を拾ってきた。判断は自分が下し、実行はClaude Codeに回す——その分業を何度もくり返した。",[19,20,21],"h2",{"id":21},"今日のタイムライン",[15,23,24],{},[25,26],"img",{"alt":27,"src":28},"タイムライン","/2026-05/2026-05-25/timeline-2026-05-25.png",[19,30,31],{"id":31},"今日やったこと",[33,34,36],"h3",{"id":35},"_1-投資の参考書をocrしてturso-dbに取り込むwalロック救出","1. 投資の参考書をOCRしてTurso DBに取り込む（WALロック救出）",[15,38,39,40,44,45,48,49,52,53,56],{},"約39MB・214ページの裁断スキャンPDFを ",[41,42,43],"code",{},"/yomitoku"," でOCRし、図60枚を抜き出してTursoに61チャンクで格納。続く ",[41,46,47],{},"/restructure-book"," のセクション統合スクリプトが出力ゼロのまま240秒沈黙した。原因はEmbedded ReplicaのWALロック——先行プロセスのロックが残り、新しい ",[41,50,51],{},"BEGIN"," が待ちぼうけを食らっていた。ハングしたPythonプロセス群だけをkillしてHTTP直接接続版に書き換えたら、すでにcommitは済んでいて、最後の ",[41,54,55],{},"sync()"," だけが固まっていたと判明した。",[15,58,59],{},[60,61,62],"strong",{},"主な成果:",[64,65,66,70,73],"ul",{},[67,68,69],"li",{},"214ページOCR → 61チャンクでTurso格納、セクション統合で47チャンクに正規化",[67,71,72],{},"WALロックの正体（commit済み・sync()だけハング）を突き止めた",[67,74,75,78,79,81],{},[41,76,77],{},"restructure-book"," テンプレートの ",[41,80,55],{}," 7箇所を除去し、HTTP直接接続化で再発を断った",[15,83,84,87,88],{},[60,85,86],{},"詳細:"," ",[89,90,92],"a",{"href":91},"/book-ocr-turso-wal-lock-recovery","裁断スキャンした参考書をOCRしてTursoに取り込む：WALロックからの救出",[94,95],"hr",{},[33,97,99],{"id":98},"_2-投資の名著の知見を財務諸表教材に統合する","2. 投資の名著の知見を財務諸表教材に統合する",[15,101,102],{},"DBに整えた知見から「指標がいくつ以上なら優良か」という数値ベンチマークと、教科書の常識を覆す逆張りの読み方を抜き出し、教材のコラムとfigureに落とし込んだ。固有名（人名・書名）は出さず、「経済的な堀（moat）」という概念だけを統合する方針で進めた。計画書をcodex（GPT-5.5）でレビューに回したら出力が812KBに膨れ、ツールがパースエラーを連発——引き継ぎメモで一度仕切り直し、次セッションで実装を完走した。",[15,104,105],{},[60,106,62],{},[64,108,109,116,119],{},[67,110,111,112,115],{},"共通コラム基盤 ",[41,113,114],{},"InvestorColumn.vue"," を新設（教材にコラムボックスがゼロだったため）",[67,117,118],{},"粗利率（コカ・コーラ約60%・GM約12%）など実名企業のFY2024概算を裏取りしてfigure化（T2/T3/T4）",[67,120,121],{},"codex指摘（投資助言トーンの緩和＋免責、書籍出典と財務データ出典の分離）を反映",[15,123,124,87,126],{},[60,125,86],{},[89,127,129],{"href":128},"/investor-knowledge-into-financial-textbook","投資の名著の知見を財務諸表教材に統合した話",[94,131],{},[33,133,135],{"id":134},"_3-決算ビートスキャンに発表日ゲートを新設","3. 決算ビートスキャンに「発表日ゲート」を新設",[15,137,138,139,142],{},"毎朝のパイプライン末尾で回す ",[41,140,141],{},"earnings-beat-scan"," が、米国休場日で0件のはずなのにPLTR（5月4日決算）を拾ってきた。x-searchは投稿日でしか絞らず、発表日が24時間窓の内かを検証するゲートが無かった。「あくまで1日分だけ見てほしい、24時間外は全部弾いて」と方針を決め、Step 1.5の発表日ゲートを新設して4重ガードで強制。0件こそ正しい結果として受け入れる形に直した。",[15,144,145,87,147],{},[60,146,86],{},[89,148,150],{"href":149},"/earnings-beat-scan-announce-date-gate","決算ビートスキャンに「発表日ゲート」を新設した話 — 0件こそ正しい結果",[94,152],{},[33,154,156],{"id":155},"_4-正二十面体の3d図解と並行セッションのgit事故","4. 正二十面体の3D図解と、並行セッションのgit事故",[15,158,159,160,163,164,167],{},"「正二十面体は60の同じ形に分割できる」という一文を、触って動かせる図解にしたかった。調べたら頼んでいない885行の未コミット実装が既にあり、しかも上書き直前に別の何かが「なぜファージ頭部は正二十面体なのか」というウイルス学版へ作り替えていた。全上書きで壊すのを避け、回転対称アニメと60分割展開アニメだけを差し込んだ。だが検証後、本体.vueと自分のissueが消えた——並行セッションの破壊的なgit操作（",[41,161,162],{},"git stash -u"," / ",[41,165,166],{},"git clean","）が未追跡ファイルを巻き込んだと疑い、書き戻さず手を止めた。",[15,169,170,87,172],{},[60,171,86],{},[89,173,175],{"href":174},"/interactive-icosahedron-and-git-collision","正二十面体の対称性を触れる3D図解にする：幽霊実装とgit事故",[94,177],{},[33,179,181],{"id":180},"_5-議論まとめを公開記事化歴史考証","5. 議論まとめを公開記事化＋歴史考証",[15,183,184],{},"ダウンロードしておいた「フィクションと労働と資本」の議論まとめを公開記事に仕立て、ブラウザで目視確認まで通した。タグが11個も並んでいたので「最大3つ」に絞り、そのルールをcontent-managementスキルにも追記。薩摩藩が外様になった経緯を補足する際、自分が「源平合戦で敗れた」と勘違いしていたのを「関ヶ原（1600）で西軍につき敗れた」と訂正してもらい、史実ベースで書き直した。",[15,186,187,87,190],{},[60,188,189],{},"関連記事:",[89,191,193],{"href":192},"/fiction-labor-capital","フィクションと労働と資本",[94,195],{},[19,197,198],{"id":198},"今日の試行錯誤",[200,201,202,224],"table",{},[203,204,205],"thead",{},[206,207,208,212,215,218,221],"tr",{},[209,210,211],"th",{},"#",[209,213,214],{},"テーマ",[209,216,217],{},"試したこと",[209,219,220],{},"結果",[209,222,223],{},"気づき",[225,226,227,245,265,284,301,317,334,351],"tbody",{},[206,228,229,233,236,239,242],{},[230,231,232],"td",{},"1",[230,234,235],{},"セクション統合",[230,237,238],{},"Embedded Replicaでスクリプト実行→240秒沈黙",[230,240,241],{},"失敗（ハング）",[230,243,244],{},"先行プロセスのWALロックが残り新しいBEGINが待ちになる既知問題",[206,246,247,250,253,256,259],{},[230,248,249],{},"2",[230,251,252],{},"統合の救出",[230,254,255],{},"プロセス群をkillしHTTP直接接続版に書き換え",[230,257,258],{},"成功",[230,260,261,262,264],{},"実はcommit済みで",[41,263,55],{},"だけハングしていた。kill後もクラウドに反映済み",[206,266,267,270,273,279,281],{},[230,268,269],{},"3",[230,271,272],{},"再発防止",[230,274,275,276,278],{},"テンプレートの",[41,277,55],{},"7箇所を除去",[230,280,258],{},[230,282,283],{},"接続のたびにsyncしない設計に変えればロック地獄を踏まない",[206,285,286,289,292,295,298],{},[230,287,288],{},"4",[230,290,291],{},"計画のcodexレビュー",[230,293,294],{},"812KBの巨大出力をツールで受けようとした",[230,296,297],{},"失敗（パースエラー連発）",[230,299,300],{},"巨大出力は引き継ぎメモで仕切り直すのが速い",[206,302,303,306,309,312,314],{},[230,304,305],{},"5",[230,307,308],{},"教材へのfigure統合",[230,310,311],{},"実名企業の粗利率・設備投資比率を裏取りしてfigure化",[230,313,258],{},[230,315,316],{},"既存教材は計算式は教えるが「目安」が薄く、ベンチマークが補完になる",[206,318,319,322,325,328,331],{},[230,320,321],{},"6",[230,323,324],{},"決算スキャン",[230,326,327],{},"休場日に実行したらPLTR（5/4決算）が混入",[230,329,330],{},"失敗（検証漏れ）",[230,332,333],{},"x-searchは投稿日しか見ない。発表日ゲートが要る。0件は恐れない",[206,335,336,339,342,345,348],{},[230,337,338],{},"7",[230,340,341],{},"3D図解の上書き",[230,343,344],{},"既存885行が並行でファージ版に化けていた",[230,346,347],{},"回避",[230,349,350],{},"全上書きせずアニメだけ差し込んで再構成を守った",[206,352,353,356,359,362,365],{},[230,354,355],{},"8",[230,357,358],{},"git事故",[230,360,361],{},"検証後に未追跡の本体.vueとissueが消失",[230,363,364],{},"事故",[230,366,367],{},"並行セッションのstash -u/git cleanは未追跡ファイルを巻き込む",[94,369],{},[19,371,372],{"id":372},"今日の学び",[64,374,375,378,381,384,387],{},[67,376,377],{},"WALロックでスクリプトが固まっても、commitは済んでいることがある。kill前に「どこまで進んだか」を疑う癖をつける。",[67,379,380],{},"巨大なレビュー出力をツールで丸ごと受けようとすると詰まる。引き継ぎメモで一度区切ると次が速い。",[67,382,383],{},"自動抽出（x-search）はノイズを拾う。「24時間以内に発表されたものか」を機械で検証するゲートを入れ、0件を正しい結果として受け入れる。",[67,385,386],{},"未追跡ファイルはgitの保護対象外。複数セッションを同時に走らせる日は、こまめにコミットしておかないと巻き添えで消える。",[67,388,389],{},"史実を補足するときは、自分の記憶（源平合戦）を疑ってAIに突き合わせさせる。違和感を拾うのは人間、裏取りはAIの分業が効く。",[94,391],{},[19,393,394],{"id":394},"明日やること",[64,396,399,409,415],{"className":397},[398],"contains-task-list",[67,400,403,408],{"className":401},[402],"task-list-item",[404,405],"input",{"disabled":406,"type":407},true,"checkbox"," 並行セッションで消えた正二十面体ページの復元方針を確定する（stash退避か作り直しか）",[67,410,412,414],{"className":411},[402],[404,413],{"disabled":406,"type":407}," 投資の名著統合の残テーマ（Part2/CH8〜12への横展開）を進める",[67,416,418,420],{"className":417},[402],[404,419],{"disabled":406,"type":407}," WALロック回避を他のbook取り込みフローにも横展開できるか確認",[94,422],{},[19,424,425],{"id":425},"関連記事",[64,427,428,432,436,440,444],{},[67,429,430],{},[89,431,92],{"href":91},[67,433,434],{},[89,435,129],{"href":128},[67,437,438],{},[89,439,150],{"href":149},[67,441,442],{},[89,443,175],{"href":174},[67,445,446],{},[89,447,193],{"href":192},{"title":449,"searchDepth":450,"depth":450,"links":451},"",2,[452,453,461,462,463,464],{"id":21,"depth":450,"text":21},{"id":31,"depth":450,"text":31,"children":454},[455,457,458,459,460],{"id":35,"depth":456,"text":36},3,{"id":98,"depth":456,"text":99},{"id":134,"depth":456,"text":135},{"id":155,"depth":456,"text":156},{"id":180,"depth":456,"text":181},{"id":198,"depth":450,"text":198},{"id":372,"depth":450,"text":372},{"id":394,"depth":450,"text":394},{"id":425,"depth":450,"text":425},"diary","裁断スキャンした投資の参考書を214ページOCR→Turso DBへ取り込み、その知見を財務諸表教材のコラムとfigureに統合。WALロック救出、決算スキャンの発表日ゲート新設、並行セッションのgit事故まで詰めた一日。","md",{},null,"/2026-05-25-diary","daily-log",false,"2026-05-25T00:00:00.000Z",{"title":5,"description":466},"2026-05/2026-05-25/diary-2026-05-25",[477,478,479],"日記","Turso","教材開発","J7YR2t2OQW1QXrlfgm4V7hQeL8PnzYyajXY8QxaE5vI",[],"https://log.eurekapu.com/og/blog/2026-05-25-diary.png?v=2026-05-25T00%3A00%3A00.000Z&title=2026%E5%B9%B45%E6%9C%8825%E6%97%A5%E3%81%AE%E9%96%8B%E7%99%BA%E6%97%A5%E8%A8%98%20-%20%E6%8A%95%E8%B3%87%E3%81%AE%E5%90%8D%E8%91%97%E3%82%92OCR%E3%81%97%E3%81%A6%E8%B2%A1%E5%8B%99%E8%AB%B8%E8%A1%A8%E6%95%99%E6%9D%90%E3%81%AB%E7%B7%A8%E3%81%BF%E8%BE%BC%E3%82%80&author=Kei%20Komatsu&sig=00157ba69ce64ede",1782528842047]