[{"data":1,"prerenderedAt":327},["ShallowReactive",2],{"content-/semiconductor-book-yomitoku-import":3,"all-pages-for-dir":325,"og-image-/semiconductor-book-yomitoku-import":326},{"id":4,"title":5,"body":6,"category":306,"description":307,"extension":308,"meta":309,"navigation":266,"ogImage":310,"path":311,"project_name":312,"published":313,"publishedAt":314,"seo":315,"stem":316,"tags":317,"todo":310,"unpublished":313,"updatedAt":310,"__hash__":324},"pages/2026-06/2026-06-21/semiconductor-book-yomitoku-import.md","半導体テーマの参考書554ページをyomitokuでOCRしてTursoに取り込んだ朝",{"type":7,"value":8,"toc":296},"minimark",[9,13,18,21,37,41,52,64,67,74,84,95,102,108,112,122,125,129,136,142,157,163,166,169,206,209,212,249,252,255,293],[10,11,12],"p",{},"半導体テーマの参考書（紙書籍・554ページ・ダイヤモンド社）を裁断スキャンしたPDFを、朝のうちにyomitokuでOCRして蔵書DBに取り込んだ。OCRそのものより、「DBに見つからない→PDF実体を引き当てる→ドキュメントと実装の不一致を踏む→直す」の道のりに時間がかかった一日。",[14,15,17],"h2",{"id":16},"蔵書dbに無いを確定させる","蔵書DBに無い、を確定させる",[10,19,20],{},"まず、半導体テーマの参考書を蔵書DB（Turso）で検索してもらったが、ヒットしなかった。著者名のキーワードでも引っかからず、kindle_library 側にも該当ASINがない。電子版は持っていなかった。",[10,22,23,24,28,29,32,33,36],{},"紙の現物は裁断してスキャン済みのはずなので、",[25,26,27],"code",{},"amazon_metadata"," の ",[25,30,31],{},"file_no"," を頼りに Dropbox の「電子化した書籍たち/00連番で管理するフォルダ/」配下を引いた。",[25,34,35],{},"No858_..."," 配下にPDF実体が眠っていた。蔵書DB側のメタデータは Amazon 購入履歴から取り込んでいるので、現物のPDFと file_no を紐付けるだけで居場所が確定する。この設計がここで初めて効いた。",[14,38,40],{"id":39},"目次だけ-pymupdf-で抜く","目次だけ pymupdf で抜く",[10,42,43,44,47,48,51],{},"PDF全体を読ませると Read ツールが死ぬので、pymupdf で先頭の目次部分だけ抽出してもらった。8部構成、本文54章、序章と後付を含めて554ページ。",[25,45,46],{},"book_id"," を ",[25,49,50],{},"chip-war"," に決めて、yomitoku をバックグラウンドで起動した。",[10,53,54,55,59,60,63],{},"554ページなら30〜60分は覚悟していたが、実際は ",[56,57,58],"strong",{},"約8.6分でOCR完走","した。MD 554個と図ファイル5個が出力ディレクトリに並んでいる。図ファイルは ",[25,61,62],{},"figure_xxx.png"," のような連番なので、yomitoku のリネームヘルパで整えてもらった。",[14,65,66],{"id":66},"ドキュメントと実装が食い違っていた",[10,68,69,70,73],{},"リネームが終わって「次はDB格納」の段で詰まった。",[25,71,72],{},"/yomitoku"," コマンドのドキュメントには、",[75,76,81],"pre",{"className":77,"code":79,"language":80},[78],"language-text","init_books_db(db_path) で初期化してから書き込む\n","text",[25,82,79],{"__ignoreMap":83},"",[10,85,86,87,90,91,94],{},"と書いてある。しかし現状の ",[25,88,89],{},"db.py"," を覗いてもらうと、引数なしの ",[25,92,93],{},"init_books_db()"," で Turso に HTTP 直結する実装に変わっていた。ローカルSQLiteを叩く時代のドキュメントが、そのまま残されていた格好。",[10,96,97,98,101],{},"コマンドドキュメントを信じて手を動かすと、実装と食い違って事故るので、先に ",[25,99,100],{},".claude/commands/yomitoku.md"," を現状の API シグネチャに合わせて直してもらった。バッチ運用節も「HTTP直結デフォルト」に書き換える。「スキルやコマンドのドキュメントは、実装を変えた瞬間に取り残される」という、ありふれた失敗を踏み抜いた格好。db.py の関数シグネチャを見るまで誰も気付かなかった。",[10,103,104,105,107],{},"このあたりは、",[25,106,72],{}," を月に何度も叩くわけではないので、たまに走らせたときに足元のドキュメントが古くなっている、というパターンに弱い。今後も同じ事故を踏みそうなので、「ドキュメントの最終更新日と実装の最終更新日が乖離していたら、まず突き合わせる」という運用に倒したい。",[14,109,111],{"id":110},"turso-投入と検索テスト","Turso 投入と検索テスト",[10,113,114,115,118,119,121],{},"ドキュメントを直したあと、Turso に流し込んでもらった。",[56,116,117],{},"121チャンク","で格納完了。",[25,120,27],{}," との紐付けも file_no 経由で通り、FTS検索（全文検索）でキーワードを叩くとどれも本文にヒットする。少なくともインデックスはちゃんと張れている。",[10,123,124],{},"ここで「restructure はやってないんでしたっけ？ あと表示確認お願いします」と差し戻しが入った。restructure（章単位への再構成）はまだで、OCR→DB格納の状態で止めていた。表示確認を後回しにしていたので、先にローカルの dev server を 3100 ポートで起動して、Chrome DevTools MCP でブラウザを開いて確認してもらった。フロントから書籍ページを開くと、Turso 経由のチャンク本文と図画像が描画されている。動いている。",[14,126,128],{"id":127},"restructure-で-121-117-チャンクへ","restructure で 121 → 117 チャンクへ",[10,130,131,132,135],{},"表示確認が通ったあとに ",[25,133,134],{},"/restructure-book"," を回した。目次から拾った構造を当てる作業。",[75,137,140],{"className":138,"code":139,"language":80},[78],"8部構成・全54章＋序章・後付\n",[25,141,139],{"__ignoreMap":83},[10,143,144,145,148,149,152,153,156],{},"本文54章は yomitoku の段階で既に「1チャンク=1章」に整っていたので、restructure 側の仕事はほぼ ",[56,146,147],{},"メタデータ正規化＋目次5チャンクの統合","で済んだ。121チャンクが117チャンクに縮む。各チャンクに ",[25,150,151],{},"chapter","（部）と ",[25,154,155],{},"section","（章タイトル）を割り当て、目次部分の細切れチャンクを1つにまとめただけ。",[75,158,161],{"className":159,"code":160,"language":80},[78],"121 → 117 チャンク（▲4）\n内訳: 目次5チャンクを1つに統合\n     + 本文54章は構造そのまま、メタデータのみ整備\n",[25,162,160],{"__ignoreMap":83},[10,164,165],{},"restructure 完了後にもう一度ブラウザで開くと、章タイトルが部単位でグルーピングされて見える。半導体産業の歴史を追う読みものなので、章のまとまりが見えるかどうかで読書UIの当たりが大きく変わる。",[14,167,168],{"id":168},"今日の学び",[170,171,172,185,191,200],"ul",{},[173,174,175,181,182,184],"li",{},[56,176,177,178,180],{},"DBに無い書籍はAmazonメタデータの ",[25,179,31],{}," でPDF実体を引ける","。kindle_library を先に当てる癖がついていたが、紙書籍は最初から ",[25,183,27],{}," を見ればよかった。",[173,186,187,190],{},[56,188,189],{},"yomitoku は思っていたより速い","。554ページが約8.6分。30〜60分の見積もりは現代のyomitokuには過大だった。次回からは10分前後を基準に据える。",[173,192,193,196,197,199],{},[56,194,195],{},"スラッシュコマンドのドキュメントは、実装を直したら同時に直す","。今回は db.py が引数なし＋Turso直結に変わっていたのに、コマンドドキュメントが古い API のまま残っていた。",[25,198,72],{}," を叩いたタイミングで踏み抜いて、ようやく気付いた。仕様変更の PR でドキュメントだけ漏れる事故は今後も起きるので、コマンド系のドキュメントは「実装と同時に直す」を運用ルールにしたい。",[173,201,202,205],{},[56,203,204],{},"restructure の仕事量は yomitoku の出力品質に強く依存する","。今回は yomitoku が章単位できれいに切ってくれていたので、restructure はメタデータを当てるだけで済んだ。逆に章境界が崩れていると restructure 側で章をマージする仕事が増える。yomitoku 側のチャンク分割設定が将来の restructure の負荷を決めている、という構造を体感できた。",[14,207,208],{"id":208},"取り込みパイプラインの位置づけ",[10,210,211],{},"朝の作業の流れを並べると、",[213,214,215,218,224,227,230,233,238,241,244],"ol",{},[173,216,217],{},"蔵書DBで検索 → ヒットせず",[173,219,220,223],{},[25,221,222],{},"amazon_metadata.file_no"," から PDF 実体を特定",[173,225,226],{},"pymupdf で目次だけ抜いて書誌情報確定",[173,228,229],{},"yomitoku をバックグラウンドで起動（約8.6分でOCR完了）",[173,231,232],{},"図ファイルをリネーム",[173,234,235,237],{},[25,236,72],{}," のドキュメントが旧仕様だと気付いて修正",[173,239,240],{},"Turso に 121チャンクで投入、FTS検索を確認",[173,242,243],{},"dev server で表示確認",[173,245,246,248],{},[25,247,134],{}," で 117チャンクに整理、メタデータ正規化",[10,250,251],{},"の9ステップ。半分が「PDF実体を引き当てる」と「ドキュメントを直す」の段取り仕事で、OCR本体は8.6分しか喰っていない。OCRが速くなった分、前後の段取りが律速になり始めている。",[10,253,254],{},"次に紙書籍を取り込むときは、",[170,256,259,272,287],{"className":257},[258],"contains-task-list",[173,260,263,268,269,271],{"className":261},[262],"task-list-item",[264,265],"input",{"disabled":266,"type":267},true,"checkbox"," 最初から ",[25,270,222],{}," で PDF を引く（kindle_library は飛ばす）",[173,273,275,277,278,280,281,283,284,286],{"className":274},[262],[264,276],{"disabled":266,"type":267}," ",[25,279,72],{}," を走らせる前に ",[25,282,100],{}," と ",[25,285,89],{}," の最終更新日を突き合わせる",[173,288,290,292],{"className":289},[262],[264,291],{"disabled":266,"type":267}," OCR起動からDB投入までを30分以内の段取りに収める",[10,294,295],{},"の3点をルーチンにしたい。一冊が30分で蔵書DBに乗るなら、買い溜めしてある紙書籍を週末に5冊くらい一気に流せる目算が立つ。",{"title":83,"searchDepth":297,"depth":297,"links":298},2,[299,300,301,302,303,304,305],{"id":16,"depth":297,"text":17},{"id":39,"depth":297,"text":40},{"id":66,"depth":297,"text":66},{"id":110,"depth":297,"text":111},{"id":127,"depth":297,"text":128},{"id":168,"depth":297,"text":168},{"id":208,"depth":297,"text":208},"dev","ダイヤモンド社の半導体テーマ参考書（紙書籍・554ページ）を裁断スキャンPDFからyomitoku OCRに通し、121チャンクでTursoに格納するまでの試行錯誤。/yomitoku コマンドのドキュメントが旧仕様で取り残されていたので現状のAPIに合わせて直した話も含む。","md",{},null,"/semiconductor-book-yomitoku-import","book-knowledge-base",false,"2026-06-21T00:00:00.000Z",{"title":5,"description":307},"2026-06/2026-06-21/semiconductor-book-yomitoku-import",[318,319,320,321,322,323],"yomitoku","OCR","Turso","FTS","蔵書DB","PDF","K65Ytx74fAXnn2SJ1tPNkW0uQUMigPxBbx6ZSp_OvyU",[],"https://log.eurekapu.com/og/blog/semiconductor-book-yomitoku-import.png?v=2026-06-21T00%3A00%3A00.000Z&title=%E5%8D%8A%E5%B0%8E%E4%BD%93%E3%83%86%E3%83%BC%E3%83%9E%E3%81%AE%E5%8F%82%E8%80%83%E6%9B%B8554%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%92yomitoku%E3%81%A7OCR%E3%81%97%E3%81%A6Turso%E3%81%AB%E5%8F%96%E3%82%8A%E8%BE%BC%E3%82%93%E3%81%A0%E6%9C%9D&author=Kei%20Komatsu&sig=d1c88683af357b65",1782176332855]