[{"data":1,"prerenderedAt":679},["ShallowReactive",2],{"content-/2026-06-21-diary":3,"all-pages-for-dir":677,"og-image-/2026-06-21-diary":678},{"id":4,"title":5,"body":6,"category":657,"description":658,"extension":659,"meta":660,"navigation":578,"ogImage":661,"path":662,"project_name":663,"published":664,"publishedAt":665,"seo":666,"stem":667,"tags":668,"todo":661,"unpublished":664,"updatedAt":661,"__hash__":676},"pages/2026-06/2026-06-21/diary-2026-06-21.md","2026年6月21日の開発日記 - 半導体書OCR・Kindle8冊取込・会計ソフトAハンズオン実機検証",{"type":7,"value":8,"toc":640},"minimark",[9,14,18,22,29,32,37,49,55,79,90,93,97,112,116,135,143,145,149,164,168,187,195,197,201,223,227,255,263,265,269,280,282,285,522,524,527,562,564,567,605,607,610],[10,11,13],"h1",{"id":12},"_2026年6月21日の開発日記","2026年6月21日の開発日記",[15,16,17],"p",{},"朝6時前に蔵書DBの掃除から入り、午前中に半導体テーマの参考書554ページを yomitoku でOCRしつつ、Kindle取込パイプラインの除外タグ整備（小説・描き方シリーズ）と1冊目バッチ4冊を並列で回した。午後は2冊目バッチ4冊（不動産投資2冊＋DD論＋仮説行動）を並列パイプラインに乗せ、合計8冊を1日で取り込み終えた。夜は会計ソフトA内部APIハンズオン3記事を「DevTools Console に1コマンドずつ叩いて値を確認する」スタイルに統一しつつ、Chrome DevTools MCP で実機を叩いて記事の例と実機の差分を全部洗い出した。",[19,20,21],"h2",{"id":21},"今日のタイムライン",[15,23,24],{},[25,26],"img",{"alt":27,"src":28},"タイムライン","/2026-06/2026-06-21/timeline-2026-06-21.png",[19,30,31],{"id":31},"今日やったこと",[33,34,36],"h3",{"id":35},"_1-ハイパースケーラーcapex記事の仕上げ","1. ハイパースケーラーCapEx記事の仕上げ",[15,38,39,40,44,45,48],{},"データセンターCapExが1兆ドル超に向かっている話を、ファクトチェック並走と10枚SVG構成で1本にまとめた。表示確認で「部材インフレ7部材の同時値上がりチャートが値上がりに見えない」「マゼンタ強調の意味が凡例にない」「",[41,42,43],"code",{},"external-capital-stack.svg"," が naturalWidth:0 で壊れている（XMLの",[41,46,47],{},"&"," 未エスケープ）」の3点を順に直して、ファーストビューから最終図まで通る記事に仕立てた。",[15,50,51],{},[52,53,54],"strong",{},"主な成果:",[56,57,58,62,65,68],"ul",{},[59,60,61],"li",{},"ファクトチェックを並列で実行し、Metaの Hyperion SPV 金額（300億→270億＋3億リース）と TeraWulf 180日条項の不確実箇所を記事側で慎重に書き直した",[59,63,64],{},"部材インフレチャートをバーの長さが値上げ率に比例する形に作り直した",[59,66,67],{},"マゼンタ強調を「4社の中で突出して点灯しているシグナル」と凡例に明記",[59,69,70,71,74,75,78],{},"SVG の ",[41,72,73],{},"P&L"," 表記を ",[41,76,77],{},"P&amp;L"," に修正",[15,80,81,84,85],{},[52,82,83],{},"詳細:"," ",[86,87,89],"a",{"href":88},"/hyperscaler-capex-limits","データセンターのコスト構造 — 部材インフレとハイパースケーラーの限界線",[91,92],"hr",{},[33,94,96],{"id":95},"_2-半導体テーマの参考書554ページをyomitokuで取り込んだ","2. 半導体テーマの参考書554ページをyomitokuで取り込んだ",[15,98,99,100,103,104,107,108,111],{},"蔵書DBに該当書がヒットせず、Dropbox の連番フォルダにあるPDFを ",[41,101,102],{},"amazon_metadata.file_no"," から特定。pymupdf で目次だけ抜いて書誌を確定し、yomitoku を裏で走らせて約8.6分でOCR完了。Turso に121チャンクで投入したあと、",[41,105,106],{},"/yomitoku"," コマンドのドキュメントが旧仕様のままだったので現在の ",[41,109,110],{},"db.py"," シグネチャに合わせて直した。restructure までかけて 121→117チャンクに整理して終了。",[15,113,114],{},[52,115,54],{},[56,117,118,121,126,129],{},[59,119,120],{},"yomitoku で 554ページを8.6分でOCR完走（MD 554個＋図5個）",[59,122,123,125],{},[41,124,106],{}," コマンドドキュメントの仕様乖離を発見して修正",[59,127,128],{},"Turso 投入＋FTS検索テストすべてヒット",[59,130,131,134],{},[41,132,133],{},"/restructure-book"," で 8部構成・全54章＋序章・後付のメタデータ整備",[15,136,137,84,139],{},[52,138,83],{},[86,140,142],{"href":141},"/semiconductor-book-yomitoku-import","半導体テーマの参考書554ページをyomitokuでOCRしてTursoに取り込んだ朝",[91,144],{},[33,146,148],{"id":147},"_3-kindle取込パイプラインを並列化して1日に8冊取り込んだ","3. Kindle取込パイプラインを並列化して1日に8冊取り込んだ",[15,150,151,152,155,156,159,160,163],{},"午前は除外タグ整備から入った。",[41,153,154],{},"novel"," タグを kindle_library_tagger.py に追加して47件付与、",[41,157,158],{},"drawing"," タグを追加して12件付与、進捗ジェネレーターに「次の候補トップ10」表示を組み込む改造まで済ませた。1冊目バッチ4冊（コンサル一年目 / イシューからはじめよ / 目的ドリブン / 仮説行動）は最初は直列で待っていたが、スラッシュコマンドに「バッチ実行中なら次の本の撮影／OCR／DB投入に進む」と書いてあると指摘されてから並列に切り替えた。午後の2冊目バッチ4冊（不動産投資2冊＋DD論＋仮説行動）では方向誤判定リカバリと Chrome の ",[41,161,162],{},"Tabs cannot be edited right now"," エラー2回を踏みつつ、計8冊を取り込み終えた。",[15,165,166],{},[52,167,54],{},[56,169,170,178,181,184],{},[59,171,172,174,175,177],{},[41,173,154],{}," / ",[41,176,158],{}," 除外タグで KU 借中の候補リストを実質的なターゲットだけに絞った",[59,179,180],{},"並列パイプライン（撮影→OCR→DB→紐付け→restructure をサブエージェントに非同期で投げる）が定着した",[59,182,183],{},"取込済 11冊→17冊、KU借中 19冊→15冊残まで進んだ",[59,185,186],{},"Most Recent Page Read ダイアログがタブ操作を阻害していた原因を特定",[15,188,189,84,191],{},[52,190,83],{},[86,192,194],{"href":193},"/kindle-import-8books-parallel-pipeline","Kindle取込パイプラインを並列化して1日に8冊取り込んだ",[91,196],{},[33,198,200],{"id":199},"_4-会計ソフトa内部apiハンズオン3記事の実機検証","4. 会計ソフトA内部APIハンズオン3記事の実機検証",[15,202,203,204,207,208,211,212,215,216,84,219,222],{},"ハンズオン編・エクスポート編・インポート編の3記事を「DevTools Console に1コマンドずつ叩いて値を確認する」スタイルに統一しつつ、Chrome DevTools MCP で実機を叩いて記事の例と実機の差分を全部洗い出した。税区分マスタの label が記事の ",[41,205,206],{},"\"課税仕入 10%\""," ではなく実機は ",[41,209,210],{},"\"課仕 10%\""," で件数も58→151と乖離、削除APIの挙動も記事の説明と違ったので記事側を直した。さらに JS バンドル＋React fiber＋Jotai store を辿って、旧 ",[41,213,214],{},"ignore_cancel"," が 404 で廃止されて新API ",[41,217,218],{},"/journalable_dists/register",[41,220,221],{},"/journalable_dists/ignore"," に置き換わっていることを突き止めた。",[15,224,225],{},[52,226,54],{},[56,228,229,232,238,241],{},[59,230,231],{},"ProsePre.vue のコピーボタンを復活させた",[59,233,234,237],{},[41,235,236],{},"console.log"," 自体を「値＋説明文」を出す形に書き換えて、コンソール画面で意味が分かるようにした",[59,239,240],{},"「ページ遷移で window.mfh が消える」問題を Step 0.1 で警告し、同タブで仕訳帳APIを叩いて結果を確認する手順を Step 10.5 として挿入した",[59,242,243,244,246,247,250,251,254],{},"旧 ",[41,245,214],{}," の廃止と新 ",[41,248,249],{},"journalable_dists"," API群の発見、",[41,252,253],{},"journalCandidateId"," の hash::index 形式まで特定",[15,256,257,84,259],{},[52,258,83],{},[86,260,262],{"href":261},"/mf-internal-api-handson-live-verification","会計ソフトA内部APIハンズオン3記事のスタイル統一と実機検証",[91,264],{},[33,266,268],{"id":267},"_5-家族旅行カレンダーの予約確定反映","5. 家族旅行カレンダーの予約確定反映",[15,270,271,272,275,276,279],{},"8月の家族旅行カレンダーで、HOTEL AZ大分津久見店（8/28・8/29）と月と海のリゾート コテージ上浦（8/27）の予約確定メールが届いたので、タイムラインの該当イベントを ",[41,273,274],{},"open"," から ",[41,277,278],{},"decided"," に切り替えた。料金は以前設定の値を維持、テキストを「予約確定」に直してビルドエラーなしを確認。",[91,281],{},[19,283,284],{"id":284},"今日の試行錯誤",[286,287,288,310],"table",{},[289,290,291],"thead",{},[292,293,294,298,301,304,307],"tr",{},[295,296,297],"th",{},"#",[295,299,300],{},"テーマ",[295,302,303],{},"試したこと",[295,305,306],{},"結果",[295,308,309],{},"気づき",[311,312,313,346,363,380,397,416,436,460,481,498],"tbody",{},[292,314,315,319,322,327,336],{},[316,317,318],"td",{},"1",[316,320,321],{},"CapEx記事のSVGバグ",[316,323,324,326],{},[41,325,43],{}," が naturalWidth:0 で壊れていた",[316,328,329,330,332,333,335],{},"XMLの ",[41,331,73],{}," の ",[41,334,47],{}," がエスケープされておらず parser エラー",[316,337,338,339,341,342,345],{},"SVG中のテキストで ",[41,340,47],{}," を書くときは ",[41,343,344],{},"&amp;"," に必ず置換する",[292,347,348,351,354,357,360],{},[316,349,350],{},"2",[316,352,353],{},"部材インフレチャート",[316,355,356],{},"バー長が値上げ率に比例していなかった",[316,358,359],{},"バー幅を数値スケールに直して描き直し",[316,361,362],{},"「同時に値上がりしている」を伝えるなら、まずバー長が値段に比例する状態にしてから色や強調を乗せる",[292,364,365,368,371,374,377],{},[316,366,367],{},"3",[316,369,370],{},"Kindle取込が直列だった",[316,372,373],{},"OCR待ち中は次の本の撮影に進めるのに直列で寝ていた",[316,375,376],{},"スラッシュコマンドを読み返したら並列化の指示が書いてあった",[316,378,379],{},"コマンドを定義したら定義通り動かす。「とりあえず動かしてみる」と直列に流してしまう",[292,381,382,385,388,391,394],{},[316,383,384],{},"4",[316,386,387],{},"不動産投資2冊目で方向誤判定",[316,389,390],{},"p.1が奥付＝逆順撮影だった",[316,392,393],{},"画像の並び順を反転→md再生成→OCR再実行",[316,395,396],{},"DB投入前ならリカバリは画像反転だけで済む。投入後だとchunks書き換えが要る",[292,398,399,402,407,410,413],{},[316,400,401],{},"5",[316,403,404,405],{},"Chrome ",[41,406,162],{},[316,408,409],{},"3冊目スクショが2回連続中断",[316,411,412],{},"Most Recent Page Read ダイアログが背景で出ていてタブ操作を阻害していた",[316,414,415],{},"Kindle Cloud Reader のダイアログは撮影開始前に閉じる",[292,417,418,421,424,427,433],{},[316,419,420],{},"6",[316,422,423],{},"コンソール出力の意味付け",[316,425,426],{},"関数定義にコメント→記事内出力ブロックに注釈、と2回意図を取り違えた",[316,428,429,430,432],{},"3回目に「",[41,431,236],{}," 自体を書き換える」と気付いた",[316,434,435],{},"「コンソール画面で」と言われたら記事内ではなく実画面の文字列を直すのが正解",[292,437,438,441,447,450,457],{},[316,439,440],{},"7",[316,442,443,444,446],{},"会計ソフトA 旧 ",[41,445,214],{}," が動かない",[316,448,449],{},"DELETE すると 404",[316,451,452,453,456],{},"JS バンドルから新パターンを探したら ",[41,454,455],{},"/journalable_dists/*"," に置き換わっていた",[316,458,459],{},"内部APIが見えにくい変更を踏むのは普通。バンドル grep で探す筋肉が要る",[292,461,462,465,468,475,478],{},[316,463,464],{},"8",[316,466,467],{},"解除API（対象外→未入力）の id が違う",[316,469,470,471,474],{},"id を React fiber から取ったら ",[41,472,473],{},"\u003Chash>::\u003Cindex>"," 形式で 400",[316,476,477],{},"Jotai store を辿って hash部分のみが正しい id だと特定",[316,479,480],{},"React の見える props と Jotai store の id は別物。POSTペイロードの id は store 側を取る",[292,482,483,486,489,492,495],{},[316,484,485],{},"9",[316,487,488],{},"蔵書DB検索 ヒットせず",[316,490,491],{},"キーワード検索で半導体書が出てこなかった",[316,493,494],{},"amazon_metadata の file_no から Dropbox 連番フォルダにPDF実体を発見",[316,496,497],{},"DBに無いなら未取込。amazon_metadata から file_no を引いて Dropbox の番号フォルダを当たる",[292,499,500,503,506,513,519],{},[316,501,502],{},"10",[316,504,505],{},"yomitoku コマンドのドキュメント不整合",[316,507,508,509,512],{},"旧仕様（ローカルSQLite + ",[41,510,511],{},"init_books_db(db_path)","）のまま",[316,514,515,516,518],{},"現在の ",[41,517,110],{},"（引数なし + Turso HTTP直結）に合わせてコマンドドキュメントを修正",[316,520,521],{},"実装変更時にスラッシュコマンドのドキュメントが取り残されがち。気付いた瞬間に直す",[91,523],{},[19,525,526],{"id":526},"今日の学び",[56,528,529,535,541,547,556],{},[59,530,531,534],{},[52,532,533],{},"「コンソール出力に意味を載せる」は記事側ではなくコード側で",": ハンズオン記事のコメント問題で3回意図を取り違えた。読み手の操作画面（実際のブラウザコンソール）で意味が分かる形にしないと、記事を見ながら打って結果を見たときに迷子になる",[59,536,537,540],{},[52,538,539],{},"内部APIの仕様変更は JS バンドル grep + React fiber + state store の3点セットで追う",": バンドルからエンドポイント＋ペイロードのリテラルを拾い、React fiber で見える props を確認し、state store で実際の id を取り出す。表面だけ見ると 400 が解けない",[59,542,543,546],{},[52,544,545],{},"並列パイプラインは「スラッシュコマンド定義に書いてあるか」を先に読む",": 直列で動かすクセが先に出てしまった。コマンドを定義したら定義通り並列で回す",[59,548,549,552,553,555],{},[52,550,551],{},"ドキュメントと実装の乖離は仕様変更時に必ず生まれる",": ",[41,554,106],{}," の旧シグネチャがそのまま残っていた。実装を直すときにコマンドドキュメントも一緒に直す動線が要る",[59,557,558,561],{},[52,559,560],{},"DB 検索でヒットしないときは amazon_metadata を引く",": 蔵書DBに無くても、過去に登録した連番フォルダにPDFがある可能性が残る",[91,563],{},[19,565,566],{"id":566},"明日やること",[56,568,571,585,591],{"className":569},[570],"contains-task-list",[59,572,575,580,581,584],{"className":573},[574],"task-list-item",[576,577],"input",{"disabled":578,"type":579},true,"checkbox"," 会計ソフトA ハンズオン記事3本を本番デプロイで確認 — 3本とも ",[41,582,583],{},"unpublished: true"," のままで未デプロイ、繰越",[59,586,588,590],{"className":587},[574],[576,589],{"disabled":578,"type":579}," Kindle取込の次のバッチ候補トップ10から選定 — 6/22 着手なし、繰越",[59,592,594,596,597,600,601,604],{"className":593},[574],[576,595],{"disabled":578,"type":579}," CapEx記事の updatedAt を反映＋ファクトチェック残課題の TeraWulf 180日条項を別記事で深掘りするか判断 — TeraWulf 180日条項は 6/22 ",[86,598,599],{"href":599},"/datacenter-cost-structure-hyperscaler-limits"," で深掘り完了。",[41,602,603],{},"hyperscaler-capex-limits.md"," の updatedAt 反映のみ残り",[91,606],{},[19,608,609],{"id":609},"関連記事",[56,611,612,616,620,624,628,634],{},[59,613,614],{},[86,615,89],{"href":88},[59,617,618],{},[86,619,142],{"href":141},[59,621,622],{},[86,623,194],{"href":193},[59,625,626],{},[86,627,262],{"href":261},[59,629,630],{},[86,631,633],{"href":632},"/play-structure-design-ai-era","AI時代に勝つのは『遊びの場』を設計する人",[59,635,636],{},[86,637,639],{"href":638},"/letter-to-20-year-old-on-ai-era-learning","英語の時代が終わったあと何を学ぶか — 20歳の自分への手紙",{"title":641,"searchDepth":642,"depth":642,"links":643},"",2,[644,645,653,654,655,656],{"id":21,"depth":642,"text":21},{"id":31,"depth":642,"text":31,"children":646},[647,649,650,651,652],{"id":35,"depth":648,"text":36},3,{"id":95,"depth":648,"text":96},{"id":147,"depth":648,"text":148},{"id":199,"depth":648,"text":200},{"id":267,"depth":648,"text":268},{"id":284,"depth":642,"text":284},{"id":526,"depth":642,"text":526},{"id":566,"depth":642,"text":566},{"id":609,"depth":642,"text":609},"diary","朝に半導体テーマの参考書554ページをyomitokuでTursoに取り込み、続けてKindleパイプラインを並列化して計8冊。午後はChrome DevTools MCPで会計ソフトA内部APIハンズオンの実機検証まで走った1日。","md",{},null,"/2026-06-21-diary","daily-log",false,"2026-06-21T00:00:00.000Z",{"title":5,"description":658},"2026-06/2026-06-21/diary-2026-06-21",[669,670,671,672,673,674,675],"日記","yomitoku","Kindle","Turso","Chrome DevTools MCP","会計ソフトA","SVG","XkIyYUs4-SJXx6FU371crAAiH37VUcWfMB5-ncrUchU",[],"https://log.eurekapu.com/og/blog/2026-06-21-diary.png?v=2026-06-21T00%3A00%3A00.000Z&title=2026%E5%B9%B46%E6%9C%8821%E6%97%A5%E3%81%AE%E9%96%8B%E7%99%BA%E6%97%A5%E8%A8%98%20-%20%E5%8D%8A%E5%B0%8E%E4%BD%93%E6%9B%B8OCR%E3%83%BBKindle8%E5%86%8A%E5%8F%96%E8%BE%BC%E3%83%BB%E4%BC%9A%E8%A8%88%E3%82%BD%E3%83%95%E3%83%88A%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3%E5%AE%9F%E6%A9%9F%E6%A4%9C%E8%A8%BC&author=Kei%20Komatsu&sig=ddd868b662bdf656",1782176332415]