[{"data":1,"prerenderedAt":462},["ShallowReactive",2],{"content-/book-kb-ocr-sqlite-turso-import-and-task-review":3,"all-pages-for-dir":440,"related-/book-kb-ocr-sqlite-turso-import-and-task-review":441,"og-image-/book-kb-ocr-sqlite-turso-import-and-task-review":461},{"id":4,"title":5,"body":6,"category":420,"concepts":421,"description":422,"extension":423,"meta":424,"navigation":383,"ogImage":421,"path":425,"project_name":426,"published":427,"publishedAt":428,"seo":429,"source":430,"stem":431,"tags":432,"todo":421,"unpublished":427,"updatedAt":421,"__hash__":439},"pages/2026-10/2026-10-29/book-kb-ocr-sqlite-turso-import-and-task-review.md","別のAIがOCRした書籍のSQLiteを蔵書DB（Turso）へ取り込む前のレビューと、Googleタスク33件の棚卸し",{"type":7,"value":8,"toc":404},"minimark",[9,13,17,20,25,28,106,109,112,115,131,134,139,147,155,159,166,169,172,175,189,192,195,198,201,208,212,215,241,252,256,259,265,268,312,318,321,324,328,331,352,355,358,361,369,372],[10,11,5],"h1",{"id":12},"別のaiがocrした書籍のsqliteを蔵書dbtursoへ取り込む前のレビューとgoogleタスク33件の棚卸し",[14,15,16],"p",{},"朝、Google タスクに残っている未完了を数えてもらったら33件あった。\n「実は終わっている」ものが何件か混ざっているはずだ、と思っていた。",[14,18,19],{},"実物と突き合わせた結果、消してよいと言えたのは1件だけだった。\n昼前には、別の AI（ChatGPT 側の Codex）が OCR して作った1冊目の SQLite が届いた。\nそして昼過ぎ、自分は要らない鍵を1本作らせかけている。",[21,22,24],"h2",{"id":23},"朝googleタスク33件の進み具合を実物で確かめる","朝：Googleタスク33件の進み具合を実物で確かめる",[14,26,27],{},"Claude Code に gogcli スキルでタスクを読ませ、各タスクの計画書、コミット履歴、成果物と突き合わせてもらった。\nリポジトリごとに4つに分け、エージェントを並列で走らせている。",[29,30,31,50],"table",{},[32,33,34],"thead",{},[35,36,37,41,44,47],"tr",{},[38,39,40],"th",{},"グループ",[38,42,43],{},"件数",[38,45,46],{},"完了済み",[38,48,49],{},"内訳",[51,52,53,68,80,93],"tbody",{},[35,54,55,59,62,65],{},[56,57,58],"td",{},"iOS / CI / SNS 系",[56,60,61],{},"7",[56,63,64],{},"0",[56,66,67],{},"CI は期日前、iOS の3件は未着手",[35,69,70,73,75,77],{},[56,71,72],{},"財務諸表 / CF 系",[56,74,61],{},[56,76,64],{},[56,78,79],{},"一部完了4、未着手2、新しい計画に置き換わったと見られるもの1",[35,81,82,85,88,90],{},[56,83,84],{},"Excel / Git / 別表系",[56,86,87],{},"9",[56,89,64],{},[56,91,92],{},"一部完了5、未着手4",[35,94,95,98,101,104],{},[56,96,97],{},"mdx-playground ほか",[56,99,100],{},"10",[56,102,103],{},"最後のまとめで報告",[56,105],{},[14,107,108],{},"財務系の調査では、動画を「完了」にした記録の正本が本番の D1 にあった。\nただ、読み取りが自動の許可判定で止まったので、手元にある写し（10/12 と 10/14 時点）で判定してもらっている。",[14,110,111],{},"消してよいと言えた1件は、「書籍7冊の取り込み」だった。\nほかに、別のタスクや新しい計画に吸収されていて、まとめられるものが3件あった。\n残りの多くは、自分が見る、聞く、決めるのを待っている。",[14,113,114],{},"そこで、自分の側でいくつか決めた。",[116,117,118,122,125,128],"ul",{},[119,120,121],"li",{},"書籍の追加取り込み7冊は、一旦これで区切る",[119,123,124],{},"ステップ学習の14列の固定は OK",[119,126,127],{},"Apple アカウントはまだ作っていないので、作る手順を教えてもらう",[119,129,130],{},"キャッシュフロー教材の再開は、自分の確認で止まっているなら終了でいい",[14,132,133],{},"残り31件を一覧にした HTML を作らせ、Chrome で開いてもらった。\n一覧を見て、自分の確認待ちが多いことに気づいた。\nそこで「自分がやること」と「Claude がやること」の2列に分けて作り直してもらった。\n自分の作業が絡むのは31件中30件で、Claude が待たずに着手できるのは13件だった。",[135,136,138],"h3",{"id":137},"pdfの読み解きをchatgpt側に任せるプロンプト","PDFの読み解きをChatGPT側に任せるプロンプト",[14,140,141,142,146],{},"book-knowledge-base の PDF を優先度の順に読み解いて整え、目次を整理して再構成し、Turso に入れる。\nこの一連の流れは Claude Code のスキルになっているので、ChatGPT 側にもリポジトリのスキルを参照して流してもらうことにした。\n気になったのは、",[143,144,145],"code",{},".env"," の鍵や API キーが無いと Turso に入れられないかもしれない点だ。\nClaude Code にスキルの手順と未取り込みの一覧を読ませ、制約を先に書いたプロンプトを出してもらった。",[14,148,149,150,154],{},"続けて、OCR の変換速度の記録が残っているかを探してもらった。\nChatGPT 側の環境で計測してもらっているので、それと比べたかった。\nWindows の GPU と Mac の記録は残っていた。\n",[151,152,153],"strong",{},"Windows の CPU で測った記録は無かった","（book-knowledge-base と OCR 用のリポジトリの両方を探した）。\n手元の記録を基準値として入れ、測り方も指定した質問用のプロンプトを作ってもらった。",[21,156,158],{"id":157},"昼前1冊目のsqliteはそのまま本番に入れてよいか","昼前：1冊目のSQLiteは、そのまま本番に入れてよいか",[14,160,161,162,165],{},"この時間帯の最初に、CPU だけで OCR を動かしたときの速度をルールファイルのメモに追記してもらった（",[143,163,164],{},"ff4c733","）。\nGPU 環境の3〜5倍遅いが、CPU だけで動かした結果としては健闘している、という評価だった。",[14,167,168],{},"本題は、ChatGPT 側が1冊目を OCR して作ったステージング DB と handoff zip である。\n「Turso に取り込むのは、ここからできるか」と聞いた。",[14,170,171],{},"zip を隔離した作業領域に展開させ、引き継ぎ書を読ませてから、本番の Turso と読み取りだけで照合してもらった。\n答えは「そのまま入れられる」だった。\nこの時点では、本番には何も書き込んでいない。",[14,173,174],{},"入れられることと、中身が正しいことは別の話だ。\n内容もレビューしてもらった。",[116,176,177,180,183,186],{},[119,178,179],{},"前付から奥付まで、構成はそろっている",[119,181,182],{},"原本 PDF のハッシュは、引き継ぎ書に書かれた値と一致した（同じ PDF から OCR されている）",[119,184,185],{},"6ページを画像にして原本と見比べた結果、中身はきちんと入っていて大きな問題はない",[119,187,188],{},"ただし、取り込むときに直したほうがいい細かい点が4つある",[14,190,191],{},"ここで2つ頼んだ。\n次回以降の取り込みで気をつけてほしい要点を、Codex 向けのプロンプトにまとめること。\nそして、本番 DB に入れてしまうこと。",[14,193,194],{},"既存の取り込み処理の書き方に合わせて4点を直させ、本番の Turso に入れてもらった。\n画面でも、表のページが原本どおり2列で出ていることと、計算式のページが崩れていないことを確かめている。\n表が2つ見えたのは、PC 用とモバイル用に同じ表を持つレイアウトのためで、モバイル側は隠れていた。",[14,196,197],{},"Codex 向けのプロンプトは6点にまとまった。\nこれを Codex に伝えた。\n2冊目のステージングが届いたら、今回と同じ手順で見てもらう。\n原本 PDF とハッシュを照合し、表と式と注記を確かめ、本番との重複を調べてから、1トランザクションで入れる。\n6点が直っているかも、届いた時点で機械的に確かめられる。",[135,199,200],{"id":200},"devサーバーが止まりきらなかった",[14,202,203,204,207],{},"最後に dev サーバーを止めてもらったら、1回目はバックグラウンドのタスクだけが止まった。\nポート3100では、Nuxt 本体（",[143,205,206],{},"nuxt dev"," の node プロセス）がまだ待ち受けていた。\n中身が book-knowledge-base の Nuxt だと確かめてから、そのポートのプロセスだけを止めてもらった。",[21,209,211],{"id":210},"昼登録済み400冊のcsvと書き出しスクリプトのコミット","昼：登録済み400冊のCSVと、書き出しスクリプトのコミット",[14,213,214],{},"本番の Turso から、登録済みの400冊を読み取り専用で取り出し、UTF-8 の CSV にしてもらった。\n途中でいくつか引っかかっている。",[116,216,217,220,227,238],{},[119,218,219],{},"コマンドに直接書いたクエリがクォートで崩れたので、スクリプトをファイルに切り出した",[119,221,222,223,226],{},"3冊は amazon_metadata 側の紐付けが2行あったので、",[143,224,225],{},"GROUP_CONCAT"," で1行にまとめた",[119,228,229,230,233,234,237],{},"amazon_file_no に ",[143,231,232],{},"-1"," や ",[143,235,236],{},"10400"," のような値があったので、意味を確かめた",[119,239,240],{},"読み戻して、件数、項目ごとの埋まり具合、日本語の文字化けを確認した",[14,242,243,244,247,248,251],{},"スクリプトは ",[143,245,246],{},"scripts/export_books_csv.py"," として既存スクリプトの書き方に合わせて置き、コミットしてもらった（",[143,249,250],{},"d361c0b","）。\nCodex のコミットレビューで critical / high の指摘は出ていない。\npush はしていない。\ndocstring どおりの手順でもう一度動かして、先に作った CSV と中身が同じことを確かめ、確認用の2本目は削除した。",[21,253,255],{"id":254},"接続先urlを聞かれて読み取り専用トークンを作りかけた","接続先URLを聞かれて、読み取り専用トークンを作りかけた",[14,257,258],{},"Codex から、蔵書の閲覧と検索の接続確認に使う Turso の接続先 URL を聞かれた。\nどのファイルのどの値を貼ればいいのか、Claude Code に聞いた。",[14,260,261,262,264],{},"Claude Code には ",[143,263,145],{}," を読ませない決まりなので、Turso CLI から URL を取れるか試してもらったが、取れなかった。\n自分で env ファイルを開けばいいので、ファイルの場所とどの値かだけ教えてもらった。",[14,266,267],{},"ここで「Turso って CLI があるのか」と気づき、そのまま頼んだ。\nMac に Turso CLI を入れて、読み取り専用のトークンを作ってほしい、と。",[29,269,270,280],{},[32,271,272],{},[35,273,274,277],{},[38,275,276],{},"手順",[38,278,279],{},"結果",[51,281,282,294,304],{},[35,283,284,287],{},[56,285,286],{},"Windows 機から SSH で Mac に入り、Homebrew で turso を入れる",[56,288,289,290,293],{},"依存先の tap（",[143,291,292],{},"libsql/sqld","）を明示的に追加する必要があり、追加して入れ直した。v1.0.34 が入った",[35,295,296,301],{},[56,297,298],{},[143,299,300],{},"turso auth login",[56,302,303],{},"ブラウザで承認する対話式の手順なので、Claude Code だけでは進められない",[35,305,306,309],{},[56,307,308],{},"Mac 側の Claude Code に LAN 直送で依頼する",[56,310,311],{},"mDNS 名が引けず、IP を探した。ホスト鍵の指紋が記録どおりなのを確かめてから送った",[14,313,314,315,317],{},"返信を待っているあいだに、「そもそも、このトークンは何のために作るんだっけ」と聞き直した。\n答えは、Codex に蔵書 DB を読ませるための Codex 専用の鍵だった。\nいま ",[143,316,145],{}," にある鍵をそのまま渡すのは危ないので、別に作ろうとしていた。",[14,319,320],{},"でも、Codex にはステージング用の SQLite を作ってもらえばいい。\n本番に入れるのはこちらでやる。\nそれなら Codex に DB の鍵は要らないので、取りやめた。",[14,322,323],{},"Mac 側は、Turso へのログインまでは済んでいた。\nトークンは作られていない。\n作成コマンドが Mac 側の許可判定で止まっていて、実行されていなかった。\nMac から「取り消し完了」の返信が届き、何も残っていないことを確かめた。",[21,325,327],{"id":326},"夕方dropboxのocrバックアップから7冊を本番へ","夕方：DropboxのOCRバックアップから7冊を本番へ",[14,329,330],{},"Dropbox にある 2026-10-29 付の OCR バックアップを、Turso に取り込むよう頼んだ。",[116,332,333,336,339,342,349],{},[119,334,335],{},"ローカルの Dropbox 同期フォルダに zip が11個あり、作業領域にコピーして中身を確かめた",[119,337,338],{},"本番の Turso と、book_id、ISBN、書名、番号で重複を照合し、amazon_metadata の対応行も調べた。重複はゼロ",[119,340,341],{},"全11冊で dry-run（書き込みなし）を流した",[119,343,344,345,348],{},"コピーした原本に対してハッシュを照合できるよう、取り込みスクリプトに ",[143,346,347],{},"--source-copy-dir"," オプションを足した",[119,350,351],{},"ハッシュは全冊一致し、競合も無かった",[14,353,354],{},"原書の確認待ちの1冊は外し、7冊を本番に入れることにした。\n本体の INSERT のあと、amazon_metadata の紐付けで接続ストリームの競合が出たので、1冊の状態を確かめてもらった。\nそのあと、冊ごとのチャンク数、種類、全文検索のヒット、全体の件数を検証している。\ndev サーバーが落ちていたので起動したところで、このログは終わっている。\n検証の結果までは、ログに残っていない。",[14,356,357],{},"朝に区切った「書籍の追加取り込み7冊」のタスクと、ここで入れた7冊が同じものかどうかも、このログの範囲では確かめていない。",[21,359,360],{"id":360},"学びメモ",[116,362,363,366],{},[119,364,365],{},"鍵を1本増やす前に、データの通り道を見直す。ステージングの SQLite を受け取ってこちらで入れる流れなら、相手に DB の鍵を渡す必要は無い。「何のために作るんだっけ」と聞き直したことで、トークン作りそのものが要らないと分かった",[119,367,368],{},"dev サーバーを止めたら、ポートで待ち受けが消えたかを確かめる。バックグラウンドのタスクを止めても、Nuxt 本体が残っていることがある",[21,370,371],{"id":371},"残っていること",[116,373,376,386,392,398],{"className":374},[375],"contains-task-list",[119,377,380,385],{"className":378},[379],"task-list-item",[381,382],"input",{"disabled":383,"type":384},true,"checkbox"," 2冊目のステージングで、Codex に伝えた6点が直っているかを確かめる",[119,387,389,391],{"className":388},[379],[381,390],{"disabled":383,"type":384}," ChatGPT 側で計測した OCR の速度を、Windows の GPU と Mac の記録と比べる",[119,393,395,397],{"className":394},[379],[381,396],{"disabled":383,"type":384}," Apple アカウントを作る",[119,399,401,403],{"className":400},[379],[381,402],{"disabled":383,"type":384}," 夕方に入れた7冊の検証結果を確かめる",{"title":405,"searchDepth":406,"depth":406,"links":407},"",2,[408,412,415,416,417,418,419],{"id":23,"depth":406,"text":24,"children":409},[410],{"id":137,"depth":411,"text":138},3,{"id":157,"depth":406,"text":158,"children":413},[414],{"id":200,"depth":411,"text":200},{"id":210,"depth":406,"text":211},{"id":254,"depth":406,"text":255},{"id":326,"depth":406,"text":327},{"id":360,"depth":406,"text":360},{"id":371,"depth":406,"text":371},"dev",null,"別のAIがOCRで作った1冊目のSQLiteを原本PDFと突き合わせてTursoへ取り込み、次回への注意点をCodex向けプロンプトにまとめた。読み取り専用トークンを作りかけて取りやめた経緯と、Googleタスク33件の棚卸しも記録する。","md",{},"/book-kb-ocr-sqlite-turso-import-and-task-review","book-knowledge-base",false,"2026-10-29T00:00:00.000Z",{"title":5,"description":422},"make-diary","2026-10/2026-10-29/book-kb-ocr-sqlite-turso-import-and-task-review",[426,433,434,435,436,437,438],"Turso","SQLite","OCR","Googleタスク","Claude Code","Codex","u2a-cEIyS3A9PZu0Jv402dYgC8nKe5IjBnIUPEoTtjE",[],[442,446,450,454,458],{"title":443,"path":444,"publishedAt":445},"蔵書DBを棚卸しして専門書の抜けを洗い出し、簡易デューデリジェンス支援スキルを実装した","/bookshelf-db-stocktake-and-dd-skill","2026-08-05T00:00:00.000Z",{"title":447,"path":448,"publishedAt":449},"Turso Embedded Replicaで書籍DBを移行 - OCRデータ格納からdev確認まで","/turso-book-db-migration","2026-04-11T00:00:00.000Z",{"title":451,"path":452,"publishedAt":453},"書籍OCRバッチクリーンアップとtokyo-onkeiデプロイ修正 - 2026年2月20日","/book-ocr-and-misc-2026-02-20","2026-02-20T00:00:00.000Z",{"title":455,"path":456,"publishedAt":457},"2026年2月19日の開発日記 - 書籍OCRパイプラインを丸一日磨き上げた日","/2026-02-19-diary","2026-02-19T00:00:00.000Z",{"title":459,"path":460,"publishedAt":457},"書籍OCRパイプライン整備 - yomitoku + SQLite + 並列クリーンアップで蔵書DB構築を加速した一日","/book-ocr-pipeline-2026-02-19","https://log.eurekapu.com/og/blog/book-kb-ocr-sqlite-turso-import-and-task-review.png?v=2026-10-29T00%3A00%3A00.000Z&title=%E5%88%A5%E3%81%AEAI%E3%81%8COCR%E3%81%97%E3%81%9F%E6%9B%B8%E7%B1%8D%E3%81%AESQLite%E3%82%92%E8%94%B5%E6%9B%B8DB%EF%BC%88Turso%EF%BC%89%E3%81%B8%E5%8F%96%E3%82%8A%E8%BE%BC%E3%82%80%E5%89%8D%E3%81%AE%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%A8%E3%80%81Google%E3%82%BF%E3%82%B9%E3%82%AF33%E4%BB%B6%E3%81%AE%E6%A3%9A%E5%8D%B8%E3%81%97&author=Kei%20Komatsu&sig=87d69598f03a4e45",1793331574650]