[{"data":1,"prerenderedAt":361},["ShallowReactive",2],{"content-/book-ocr-batch-and-replica-hang":3,"related-/book-ocr-batch-and-replica-hang":316,"all-pages-for-dir":359,"og-image-/book-ocr-batch-and-replica-hang":360},{"id":4,"title":5,"body":6,"category":298,"description":299,"extension":300,"meta":301,"navigation":302,"path":303,"project_name":304,"published":305,"publishedAt":306,"seo":307,"stem":308,"tags":309,"todo":314,"unpublished":305,"updatedAt":314,"__hash__":315},"pages/2026-06/2026-06-11/book-ocr-batch-and-replica-hang.md","自炊書籍3冊をyomitoku OCRで一括取り込み、TursoのEmbedded Replica読み取りハングをHTTP同期に切り替えた日",{"type":7,"value":8,"toc":284},"minimark",[9,14,18,23,26,39,42,46,49,70,73,153,156,159,163,166,169,174,177,195,198,202,205,217,221,224,228,231,238,241,264,267,270],[10,11,13],"h1",{"id":12},"自炊書籍3冊をocrで一括取り込みembedded-replicaのハングを潰した日","自炊書籍3冊をOCRで一括取り込み、Embedded Replicaのハングを潰した日",[15,16,17],"p",{},"午前中だけで、自炊した投資関連の実務書3冊をyomitoku OCRに通してTurso DBへ取り込んだ。1冊あたり200〜400ページ。OCRはバックグラウンドで回り、その間に次の冊のDB格納スクリプトを準備してもらう流れができてきた。ただ、取り込み直後の検証クエリが2冊連続で沈黙し、ここで足が止まった。Embedded Replicaの読み取りハング。6月9日に一度解消したはずの問題だった。",[19,20,22],"h2",{"id":21},"朝イチ-蔵書の確認とnotionエクスポートの取り込み","朝イチ: 蔵書の確認とNotionエクスポートの取り込み",[15,24,25],{},"「あの著者の本って何か入ってましたっけ？」と聞くところから1日が始まった。蔵書DBのbooksテーブルを検索してもらい、続けてNotionのExport機能で出力したHTML＋画像＋CSVのセットを取り込んでもらった。",[27,28,29,33,36],"ul",{},[30,31,32],"li",{},"CSVが0件と読まれる問題 → 実際の列構成を確認して、実書籍の章構成でルートCSVを生成し直すスクリプトを作ってもらった",[30,34,35],{},"概要7件がマッチしない問題 → CSV側のTitleがファイル名より長い（切り詰めなし）ことが原因と判明",[30,37,38],{},"dry-runで93チャンクを確認してから本実行",[15,40,41],{},"取り込み後、restructure（章節単位の統合）で93→87チャンクに整理。FTS検索テストとブラウザでの表示確認まで通した。",[19,43,45],{"id":44},"yomitoku-ocrパイプライン-3冊連続で回す","yomitoku OCRパイプライン: 3冊連続で回す",[15,47,48],{},"そこから自炊PDFの取り込みを3冊連続で依頼した。パイプラインはどの冊もほぼ同じ形に収まった。",[50,51,52,55,58,61,64,67],"ol",{},[30,53,54],{},"PDFの冒頭ページ・目次・奥付をpymupdfで画像化して確認（ファイルサイズ制限でReadできないため）",[30,56,57],{},"yomitoku OCRをバックグラウンドで起動（1冊あたり数分〜）",[30,59,60],{},"完了後、図ファイルをリネーム",[30,62,63],{},"DB格納スクリプトでチャンクをTursoへ",[30,65,66],{},"amazon_metadataへの紐付け確認とFTS検索テスト",[30,68,69],{},"restructure-bookで目次に基づきページ単位チャンクをセクション単位に統合",[15,71,72],{},"3冊の数字はこうなった。",[74,75,76,98],"table",{},[77,78,79],"thead",{},[80,81,82,86,89,92,95],"tr",{},[83,84,85],"th",{},"冊",[83,87,88],{},"ページ数",[83,90,91],{},"抽出図",[83,93,94],{},"格納チャンク",[83,96,97],{},"restructure後",[99,100,101,119,136],"tbody",{},[80,102,103,107,110,113,116],{},[104,105,106],"td",{},"1冊目",[104,108,109],{},"225ファイル分",[104,111,112],{},"28点",[104,114,115],{},"178",[104,117,118],{},"57",[80,120,121,124,127,130,133],{},[104,122,123],{},"2冊目",[104,125,126],{},"399ページ",[104,128,129],{},"45点",[104,131,132],{},"362",[104,134,135],{},"58",[80,137,138,141,144,147,150],{},[104,139,140],{},"3冊目",[104,142,143],{},"241ページ",[104,145,146],{},"41点",[104,148,149],{},"203",[104,151,152],{},"56",[15,154,155],{},"2冊目では取り込み後に図の評価（/book-cleanup）も実行してもらった。45点の図をサブエージェント5並列で目視評価させ、装飾図18点のタグを除去、情報図27点を残した。帯やイメージカットまで検索に引っかかる状態を、これで防げる。",[15,157,158],{},"途中、OCR実行中に画面へ赤いエラーが出て「なんかエラー出てますけど」と聞いたら、「60秒待ってからログ確認」のためのsleepコマンドがツール側にブロックされただけで、OCR本体には無関係という説明だった。待機には専用の仕組みを使えという制約らしい。",[19,160,162],{"id":161},"embedded-replicaの読み取りハング再発","Embedded Replicaの読み取りハング再発",[15,164,165],{},"2冊目の取り込み後、検証クエリの出力が、いつまで待っても空のまま動かなかった。モニターはタイムアウトし、出力ファイルを直接覗いても空。Embedded Replica接続でハングしている可能性が高いと判断して、タスクを停止しHTTP直接接続で検証をやり直してもらった。",[15,167,168],{},"3冊目でも同じ場所で止まった。amazon_metadata紐付けとFTS検索テストのタスクが返ってこない。再びタスクを殺してHTTP直接接続に切り替え。2回続いたので、「一回解消したと思ったんですけどね」と原因を聞いた。",[170,171,173],"h3",{"id":172},"原因-69の修正はpush側今日のはpull側","原因: 6/9の修正はpush側、今日のはpull側",[15,175,176],{},"推定ではなく実物で確認してもらった。レプリカファイルの状態、過去のissueファイル、db.pyの実装を順に調べた結果がこれだった。",[27,178,179,186,192],{},[30,180,181,185],{},[182,183,184],"strong",{},"前回（6/9）に解消したのは「push側」の問題","。ローカルの書き込みをクラウドへ送る経路の修正だった",[30,187,188,191],{},[182,189,190],{},"今日ハングしたのは「pull側」","。取り込み直後にレプリカがクラウドの変更を引き込む同期処理で止まっていた",[30,193,194],{},"issueファイルには実は「未解決の残課題」として記録が残っていた",[15,196,197],{},"「もしかして別のセッションで取り込んでたから？」とも疑ったが、答えはノー。別セッションは直接の原因ではなく、同じセッション内の取り込み直後の読み取りで、レプリカ同期そのものがハングしていた。レプリカは「読み込むタイミングでクラウドの内容が反映される」仕様で、その反映処理こそが今回止まった本体だった。",[170,199,201],{"id":200},"対応-読み取りもhttpデフォルトに切り替え","対応: 読み取りもHTTPデフォルトに切り替え",[15,203,204],{},"「そうしましょうか。スムーズな方に書いてください」と決めて、db.pyの読み取りをEmbedded ReplicaからHTTP直接接続デフォルトに書き換えてもらった。他にEmbedded Replica前提の箇所がないかも確認。",[15,206,207,208,212,213,216],{},"切り替え後、今朝ハングしたのと同一の読み取りパターン（取り込み直後の",[209,210,211],"code",{},"_get_conn()","経由）をテストしたら、",[182,214,215],{},"0.71秒","で返ってきた。さっきまで無限に待たされていたクエリが1秒を切る。ローカルレプリカの同期待ちを抱えるより、最初からWebに聞きに行く方がこのワークロードには合っていた。",[19,218,220],{"id":219},"devサーバーのポートを30003100に変更","devサーバーのポートを3000→3100に変更",[15,222,223],{},"合間に、book-knowledge-baseのdevサーバーポートを3000から3100に変えてもらった。localhost:3000は他のプロジェクトで使うことが多く、実際このときもポート3000で別プロセス（mdx-playground側）が動いていた。nuxt.config.tsの変更とドキュメント内の3000参照の更新、起動中サーバーの確認までやってもらって完了。",[19,225,227],{"id":226},"技術書のコードocr試す前に判明したこと","技術書のコードOCR、試す前に判明したこと",[15,229,230],{},"午前の最後に、設計を扱った技術書のPDFを出した。コード部分がOCRでどこまで拾えるか読めなかったので、「試しに最初の方だけやってみて」と精度確認から入る判断をした。",[15,232,233,234,237],{},"ところが調べてもらうと、",[182,235,236],{},"この本は前日（6/10）のセッションで全400ページ取り込み済み","だった。Turso DBに102チャンクで登録されていて、restructure用のスクリプトもリポジトリに残っていた。コンソールでタイトルが文字化けして見えたのは出力側の文字コードの問題で、DB上は正常。",[15,239,240],{},"午後に出版社公式のサンプルコードZIPを展開してもらって、コードの取り込まれ方の答え合わせができた。",[27,242,243,250,257],{},[30,244,245,246,249],{},"本文中のコードリストは、テキストではなく",[182,247,248],{},"図画像（PNG）としてDBに入っていた","。yomitoku OCRがコードブロックを図として切り出すため",[30,251,252,253,256],{},"本文チャンクには「リスト1.1 …」のような説明文と",[209,254,255],{},"\u003Cimg>","タグだけが残る",[30,258,259,260,263],{},"つまりDB内のコードは検索もコピーもできない。",[182,261,262],{},"公式サンプルコードが唯一の「正」のソース","になる",[15,265,266],{},"コード混じりの技術書は、本文OCR＋公式サンプルコードの二本立てで扱うのが正解、というのが今日の結論。この本を題材にしたリライト計画は別途立てた（それは別記事に譲る）。",[19,268,269],{"id":269},"学び",[27,271,272,275,278,281],{},[30,273,274],{},"Embedded Replicaの「解消した」は経路ごとに確認する。push側を直してもpull側は別の問題として残る。issueファイルの「未解決の残課題」を読み返していれば、2回のハングは1回で済んだ",[30,276,277],{},"取り込み→即読み取りのワークロードでは、レプリカ同期の待ちがそのままハングに化ける。書き込み直後に読むならHTTP直接接続の方が速くて確実だった（実測0.71秒）",[30,279,280],{},"yomitokuはコードブロックを図として切り出す。技術書を取り込むときはコードがテキスト検索できない前提で、公式サンプルコードの確保をセットにする",[30,282,283],{},"OCRをバックグラウンドで回しながら次の冊の格納スクリプトを準備する並走パターンで、3冊を午前中に流しきれた",{"title":285,"searchDepth":286,"depth":286,"links":287},"",2,[288,289,290,295,296,297],{"id":21,"depth":286,"text":22},{"id":44,"depth":286,"text":45},{"id":161,"depth":286,"text":162,"children":291},[292,294],{"id":172,"depth":293,"text":173},3,{"id":200,"depth":293,"text":201},{"id":219,"depth":286,"text":220},{"id":226,"depth":286,"text":227},{"id":269,"depth":286,"text":269},"dev","自炊した投資関連の実務書3冊をyomitoku OCRでMarkdown化しTurso DBへ取り込み。途中で再発したEmbedded Replicaの読み取りハングを調査し、pull側の未解決問題と特定してHTTP直接接続へ切り替えた記録。","md",{},true,"/book-ocr-batch-and-replica-hang","book-knowledge-base",false,"2026-06-11T00:00:00.000Z",{"title":5,"description":299},"2026-06/2026-06-11/book-ocr-batch-and-replica-hang",[310,311,312,313,304],"yomitoku","OCR","Turso","Embedded Replica",null,"0n_cinwn_bztIh_NLnrKNOxB4g_-kms21K36S3Ftvco",[317,325,335,344,351],{"title":318,"description":319,"path":320,"tags":321,"publishedAt":324,"updatedAt":314},"Turso Embedded Replicaで書籍DBを移行 - OCRデータ格納からdev確認まで","book-knowledge-baseのSQLite書籍DBをTurso Embedded Replicaに移行した作業ログ。レプリカ配置の見直し、税法入門107ページのOCR→DB格納、Chrome DevToolsでのポート試行錯誤を経て表示確認まで完了","/turso-book-db-migration",[312,313,322,310,311,323,304],"SQLite","Chrome DevTools","2026-04-11T00:00:00.000Z",{"title":326,"description":327,"path":328,"tags":329,"publishedAt":334,"updatedAt":314},"yomitoku 0.13.0 アップグレードと自炊書籍の OCR 取り込み","yomitoku を 0.13.0 にアップグレードしたら torch が CPU 版に置き換わって速度が落ちた話と、自炊した1冊を全文検索 DB に取り込むまでの試行錯誤。","/yomitoku-and-textbook-ocr",[310,330,331,304,332,333],"ocr","turso","pytorch","cuda","2026-05-15T00:00:00.000Z",{"title":336,"description":337,"path":338,"tags":339,"publishedAt":343,"updatedAt":314},"書籍OCR取り込みをバッチ化して複数セッション並列で回す - キュー管理・GPUロック・AGENTS.md整備","yomitoku OCRとセクション統合の書籍取り込みパイプラインを/import-batchコマンドでバッチ化。取り込みキューのマークダウン1枚で複数セッションを並列運用し、Codexも参加できるようAGENTS.mdを整備した記録。","/book-import-batch-parallel",[340,311,310,312,341,342],"書籍ナレッジベース","並列処理","バッチ処理","2026-06-12T00:00:00.000Z",{"title":345,"description":346,"path":347,"tags":348,"publishedAt":350,"updatedAt":314},"NotionエクスポートのTurso取り込みとyomitoku OCRパイプラインで専門書をDB化した日","NotionのHTMLエクスポートを/notion-importでTurso DBに取り込み、yomitoku OCRと/restructure-bookで専門書をセクション単位にDB化。Embedded Replicaのsync詰まりも根治した記録。","/notion-import-and-book-ocr-pipeline",[349,310,311,312,340],"Notion","2026-06-09T00:00:00.000Z",{"title":352,"description":353,"path":354,"tags":355,"publishedAt":358,"updatedAt":314},"自炊した4分冊の参考書をOCRして蔵書DBに取り込み、章・節単位に整理し直すまで","655ページある4分冊の参考書をyomitokuでOCRしてMarkdown化し、Turso蔵書DBに640チャンクで格納。さらにページ単位を目次に沿って章・節単位74チャンクへ再構造化した。Embedded Replicaがサブエージェント経由でハングする問題と、クラウドだけ更新してローカルレプリカが陳腐化・破損した一日の試行錯誤を記録する。","/textbook-ocr-to-knowledge-base",[310,311,312,356,357],"蔵書管理","全文検索","2026-05-27T00:00:00.000Z",[],"https://log.eurekapu.com/og/blog/book-ocr-batch-and-replica-hang.png?v=2026-06-11T00%3A00%3A00.000Z&title=%E8%87%AA%E7%82%8A%E6%9B%B8%E7%B1%8D3%E5%86%8A%E3%82%92yomitoku%20OCR%E3%81%A7%E4%B8%80%E6%8B%AC%E5%8F%96%E3%82%8A%E8%BE%BC%E3%81%BF%E3%80%81Turso%E3%81%AEEmbedded%20Replica%E8%AA%AD%E3%81%BF%E5%8F%96%E3%82%8A%E3%83%8F%E3%83%B3%E3%82%B0%E3%82%92HTTP%E5%90%8C%E6%9C%9F%E3%81%AB%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%81%9F%E6%97%A5&author=Kei%20Komatsu&sig=7900ca3905d63ba7",1781333880276]