[{"data":1,"prerenderedAt":825},["ShallowReactive",2],{"content-/2026-04-28-diary":3,"all-pages-for-dir":823,"og-image-/2026-04-28-diary":824},{"id":4,"title":5,"body":6,"category":801,"description":802,"extension":803,"meta":804,"navigation":718,"path":805,"project_name":806,"published":807,"publishedAt":808,"seo":809,"stem":810,"tags":811,"todo":821,"updatedAt":821,"__hash__":822},"pages/2026-04/2026-04-28/diary-2026-04-28.md","2026年4月28日の開発日記 - feature-slidesスキル新設、書籍OCR1181ページ、Amazon書棚UIまで1日で組み上げた",{"type":7,"value":8,"toc":784},"minimark",[9,14,23,27,34,37,42,49,55,85,96,99,103,109,113,130,138,140,144,147,151,168,176,178,182,185,189,214,222,224,228,231,235,255,263,265,268,635,637,640,702,704,707,751,753,756],[10,11,13],"h1",{"id":12},"_2026年4月28日の開発日記","2026年4月28日の開発日記",[15,16,17,18,22],"p",{},"朝は会社法の図をSVG化する話から始まり、そのまま別リポジトリ eurekapu-nuxt4 でCFWS v2の構造解説スライドを reveal.js で組む大仕事に入った。「コードが複雑すぎて分からないのでスライドで動画みたいに説明してほしい」という要望から、画面・コード・型の3点を追跡する形式に到達し、最終的に再利用可能な ",[19,20,21],"code",{},"feature-slides"," スキルとして固めた。Excel忠実再現グリッドと範囲外枠ハイライトまで詰めて、CF305資本政策とCF301借入金のスライド量産まで進んだ。並行して book-knowledge-base で yomitoku を5冊・1181ページに通して Turso DB に1057チャンク登録、Amazon の星評価・メタデータを935件中841件取得して Nuxt の書棚UI で公開した。1日で「書籍コンテンツのスキル化・データ化」が大きく前に進んだ日。",[24,25,26],"h2",{"id":26},"今日のタイムライン",[15,28,29],{},[30,31],"img",{"alt":32,"src":33},"タイムライン","/2026-04/2026-04-28/timeline-2026-04-28.png",[24,35,36],{"id":36},"今日やったこと",[38,39,41],"h3",{"id":40},"_1-feature-slides-スキルを新設してコード解説スライドを汎化","1. feature-slides スキルを新設してコード解説スライドを汎化",[15,43,44,45,48],{},"別リポジトリ eurekapu-nuxt4 のCFWS v2構造解説で、reveal.js のスライドを「画面のこの行 ↔ コードのこのデータ ↔ 型定義のこのプロパティ」を追跡する形式に組み直した。Pinia / composable / Vue Component の3層から、裏で支える脇役を含めた7層構造に拡張、Vue 2 / Vuex 経験者向けに「Vue 2 でいうとこの層」の対応表とVuex→Pinia の差分（mutationsが要らない、TypeScriptの型推論が効く、setup syntax で書ける、Composition API と統一）も追加した。最終的に ",[19,46,47],{},".claude/skills/feature-slides/"," として汎化、2〜3行プロンプトで再現できる短縮プロンプトもスキルに書き込んだ。",[15,50,51],{},[52,53,54],"strong",{},"主な成果:",[56,57,58,62,73,76,79,82],"ul",{},[59,60,61],"li",{},"reveal.js の文字・テーブルはみ出し問題を CSS 調整で解決",[59,63,64,65,68,69,72],{},"HTMLコメント問題（",[19,66,67],{},"\u003Cpre>\u003Ccode>"," 内の ",[19,70,71],{},"\u003C!-- ... -->"," がパーサーを破綻させる）をスキルにルール化",[59,74,75],{},"7層構造スライド + Vue 2 対応表 + Vuex→Pinia 差分スライド",[59,77,78],{},"Excel忠実再現グリッド（行番号・列レター付き）+ 範囲外枠ハイライト機能",[59,80,81],{},"「同じシート、違う注目領域」で1シートを複数枚に展開する共通描画関数",[59,83,84],{},"スペーサー列（A,B,E,L,N,P）を極細にして余白を作るルール",[15,86,87,90,91],{},[52,88,89],{},"詳細:"," ",[92,93,95],"a",{"href":94},"/feature-slides-skill","コードと画面の対応をスライドで追える feature-slides スキルを作った",[97,98],"hr",{},[38,100,102],{"id":101},"_2-cf精算表のexcel解説スライドを2本量産","2. CF精算表のExcel解説スライドを2本量産",[15,104,105,106,108],{},"スキル化直後の検証として、CF305資本政策（38スライド）とCF301借入金（43スライド）のExcel解説を量産。",[19,107,21],{}," スキルが2〜3行プロンプトで動く効率の良さを体感した。openpyxl の data_only=True が None を返す問題は LibreOffice CLI で再計算してから取得することで抜けた。",[15,110,111],{},[52,112,54],{},[56,114,115,121,127],{},[59,116,117,120],{},[19,118,119],{},"cf-305-equity-excel-slides.html","（38スライド、追跡対象=設立出資3,000,000円）",[59,122,123,126],{},[19,124,125],{},"cf-301-loan-excel-slides.html","（43スライド、長期借入2,000,000円 + 短期借入1,000,000円）",[59,128,129],{},"6段階の追跡チェーン（黄→ピンク→青→緑→緑→水色）で取引モジュール → 仕訳 → 年次推移表 → CFWS の流れを可視化",[15,131,132,90,134],{},[52,133,89],{},[92,135,137],{"href":136},"/cf-excel-slides-batch","CF精算表のExcel解説スライドをスキルで量産した記録",[97,139],{},[38,141,143],{"id":142},"_3-yomitoku-で専門書5冊1181ページをocrして-turso-db-に1057チャンク登録","3. yomitoku で専門書5冊・1181ページをOCRして Turso DB に1057チャンク登録",[15,145,146],{},"別リポジトリ book-knowledge-base で、日本語特化AI OCR の yomitoku を使って手元の専門書を一気に処理した。GPU処理で1ページあたり約1.6秒、漫画PDFも10ページ16秒で完走。WAL ロックエラーや「100」が「1OO」（U+004F の大文字O）に化けたファイル名問題を抜けた。漫画PDFの第1話冒頭8ページでは「物語の振り→問い→答え→オチ」の構造でストーリーを抽象化するサマリー雛形を試作した。",[15,148,149],{},[52,150,54],{},[56,152,153,156,159,162,165],{},[59,154,155],{},"連結会計の入門書（352ページ → 270チャンク、図121個）",[59,157,158],{},"税効果会計の教科書（363ページ → 341チャンク、図48個）",[59,160,161],{},"財務数値ケース集（182ページ → 180チャンク）",[59,163,164],{},"連結精算表の入門書（284ページ → 266チャンク）",[59,166,167],{},"不動産業の漫画（200ページ中10ページサンプル、サマリー雛形試作）",[15,169,170,90,172],{},[52,171,89],{},[92,173,175],{"href":174},"/yomitoku-book-ocr-batch","yomitoku で専門書5冊・1181ページを一気にOCRして Turso DB に1057チャンク登録した",[97,177],{},[38,179,181],{"id":180},"_4-amazon書籍メタデータを841件取得して-nuxt-書棚ui-で公開","4. Amazon書籍メタデータを841件取得して Nuxt 書棚UI で公開",[15,183,184],{},"Dropbox に蓄積した連番管理の書籍PDF935冊について、Amazon の星評価・レビュー数・メタデータを取得して Nuxt の書棚UI で一覧化した。PA-API 5.0 が AssociateNotEligible (403) で使えず、Chrome DevTools MCP は単一ブラウザ共有で並列化不可、agent-browser 3並列もスタック。最終的に curl_cffi の TLS偽装で 10並列 1秒/件のスループットに到達し、826件を約12分で完走した。",[15,186,187],{},[52,188,54],{},[56,190,191,194,197,204,207],{},[59,192,193],{},"826件中789件が rating_ok、52件が asin_not_found",[59,195,196],{},"出版社・発売日・ページ数・ISBN-13・寸法・言語・高解像度カバー画像 を全件取得",[59,198,199,200,203],{},"Nuxt 書棚UI を ",[19,201,202],{},"/shelf"," で公開（ポート3001、デフォルト並び=星評価DESC→レビュー数DESC、出版社別フィルター）",[59,205,206],{},"amazon_metadata と books テーブルを book_id で19件紐付け",[59,208,209,210,213],{},"引き継ぎマークダウン ",[19,211,212],{},"memo/2026-04-28/amazon-progress.md"," を作成",[15,215,216,90,218],{},[52,217,89],{},[92,219,221],{"href":220},"/amazon-book-metadata-shelf-ui","Amazon書籍メタデータを841件取得しNuxt書棚UIで一覧化した1日の試行錯誤",[97,223],{},[38,225,227],{"id":226},"_5-書籍画像をsvg図解化するワークフローを-svg-diagram-スキル-v2-にまとめた","5. 書籍画像をSVG図解化するワークフローを svg-diagram スキル v2 にまとめた",[15,229,230],{},"会社法・法人税法のテキストに載っている図をSVG化する作業を1日まわした。公開会社・非公開会社のベン図、役員給与の損金算入可否フローチャートを、本の図そのまま再現するのではなくロジックを整理したカード型・パラレルツリー型に作り直した。最初はスキルを呼ばずに直接書いてしまい、viewBox や色のルールから外れた。途中でスキルを呼び直し、得られた知見を svg-diagram スキル v2 として作り直して「書籍画像→SVG図解への変換ワークフロー」セクションを追記した。",[15,232,233],{},[52,234,54],{},[56,236,237,243,249,252],{},[59,238,239,242],{},[19,240,241],{},"koukai_hikoukai_kaisha.svg"," + ベン図版",[59,244,245,248],{},[19,246,247],{},"yakuin-kyuyo-songin-flow-v2.svg","（パラレルツリー、マゼンタ強調5箇所）",[59,250,251],{},"svg-diagram スキル description に「書籍の図をSVGに」のトリガーを追加",[59,253,254],{},"「書籍画像→SVG図解への変換ワークフロー」セクションをスキルに追記",[15,256,257,90,259],{},[52,258,89],{},[92,260,262],{"href":261},"/svg-diagram-book-figures","書籍の図をSVG化するワークフローを svg-diagram スキル v2 にまとめた",[97,264],{},[24,266,267],{"id":267},"今日の試行錯誤",[269,270,271,293],"table",{},[272,273,274],"thead",{},[275,276,277,281,284,287,290],"tr",{},[278,279,280],"th",{},"#",[278,282,283],{},"テーマ",[278,285,286],{},"試したこと",[278,288,289],{},"結果",[278,291,292],{},"気づき",[294,295,296,322,344,361,378,395,411,431,448,465,482,499,516,533,550,567,584,601,618],"tbody",{},[275,297,298,302,305,308,311],{},[299,300,301],"td",{},"1",[299,303,304],{},"reveal.js の文字はみ出し",[299,306,307],{},"デフォルトのフォントサイズ",[299,309,310],{},"スライドからはみ出る",[299,312,313,314,317,318,321],{},"CSS で ",[19,315,316],{},"font-size"," と ",[19,319,320],{},"padding"," を調整",[275,323,324,327,330,338,341],{},[299,325,326],{},"2",[299,328,329],{},"スライド数13で止まる",[299,331,332,68,334,337],{},[19,333,67],{},[19,335,336],{},"\u003C!-- -->"," がパーサー破綻",[299,339,340],{},"エスケープで解決",[299,342,343],{},"コードブロック内のHTMLコメントは要エスケープ",[275,345,346,349,352,355,358],{},[299,347,348],{},"3",[299,350,351],{},"Excel座標 I→J",[299,353,354],{},"私のコードに座標エラー",[299,356,357],{},"実Excelで再確認して修正",[299,359,360],{},"LibreOffice + openpyxl で値検証してから貼る",[275,362,363,366,369,372,375],{},[299,364,365],{},"4",[299,367,368],{},"data_only=True で値が None",[299,370,371],{},"Excel未起動でキャッシュなし",[299,373,374],{},"LibreOffice で再計算",[299,376,377],{},"openpyxl は data_only でもキャッシュ依存",[275,379,380,383,386,389,392],{},[299,381,382],{},"5",[299,384,385],{},"範囲外枠ハイライト",[299,387,388],{},"塗りつぶしから外枠ボーダーに変更",[299,390,391],{},"成功",[299,393,394],{},"外枠だけのほうが Excel らしい",[275,396,397,400,403,406,408],{},[299,398,399],{},"6",[299,401,402],{},"スペーサー列のopacity",[299,404,405],{},"範囲内では opacity を外す",[299,407,391],{},[299,409,410],{},"スペーサーが見えなくなる問題",[275,412,413,416,419,422,428],{},[299,414,415],{},"7",[299,417,418],{},"yomitoku WAL ロック",[299,420,421],{},"DB登録中に SQLITE_BUSY",[299,423,424,427],{},[19,425,426],{},"--replace"," で再実行",[299,429,430],{},"libsql Embedded Replica は短時間ロック発生",[275,432,433,436,439,442,445],{},[299,434,435],{},"8",[299,437,438],{},"ファイル名 1OO 問題",[299,440,441],{},"大文字O U+004F が混入",[299,443,444],{},"実ファイル名で再確認",[299,446,447],{},"OCR文字化けが連番名に紛れ込む",[275,449,450,453,456,459,462],{},[299,451,452],{},"9",[299,454,455],{},"web/.output 追跡",[299,457,458],{},".gitignore漏れ",[299,460,461],{},"追加",[299,463,464],{},"Nuxt の .output は .gitignore 必須",[275,466,467,470,473,476,479],{},[299,468,469],{},"10",[299,471,472],{},"PA-API 5.0",[299,474,475],{},"AssociateNotEligible (403)",[299,477,478],{},"別ルートに切替",[299,480,481],{},"アフィリエイト承認後でも一定期間使えない",[275,483,484,487,490,493,496],{},[299,485,486],{},"11",[299,488,489],{},"Chrome DevTools MCP 並列",[299,491,492],{},"単一ブラウザ共有で並列化不可",[299,494,495],{},"agent-browser に切替",[299,497,498],{},"量産は MCP では無理",[275,500,501,504,507,510,513],{},[299,502,503],{},"12",[299,505,506],{},"agent-browser 3並列",[299,508,509],{},"デーモン同時起動で詰まる",[299,511,512],{},"1並列に戻すかHTTP直叩きへ",[299,514,515],{},"並列度の壁が見えた",[275,517,518,521,524,527,530],{},[299,519,520],{},"13",[299,522,523],{},"curl_cffi TLS偽装",[299,525,526],{},"HTTP直接GETでbot対策回避",[299,528,529],{},"1秒/件で安定",[299,531,532],{},"これが最速・最安定",[275,534,535,538,541,544,547],{},[299,536,537],{},"14",[299,539,540],{},"レビュー数バグ",[299,542,543],{},"aria-label の「5つ星のうち4.1」の「5」誤抽出",[299,545,546],{},"「レーティング」のみに絞る",[299,548,549],{},"正規表現は前後文脈の限定が必須",[275,551,552,555,558,561,564],{},[299,553,554],{},"15",[299,556,557],{},"CAPTCHA連続発生",[299,559,560],{},"詳細メタ取得の高頻度アクセス",[299,562,563],{},"並列度2 + sleep 長めで再取得",[299,565,566],{},"高頻度は CAPTCHA を誘発",[275,568,569,572,575,578,581],{},[299,570,571],{},"16",[299,573,574],{},"ポート3000衝突",[299,576,577],{},"mdx-playground が占有",[299,579,580],{},"3001で起動",[299,582,583],{},"ローカル開発はポート事前確認",[275,585,586,589,592,595,598],{},[299,587,588],{},"17",[299,590,591],{},"SVG矢印の向き誤り",[299,593,594],{},"ジャンクション点を子ボックス右側に置いた",[299,596,597],{},"左側経由に修正",[299,599,600],{},"矢印は終点側のジャンクション位置で向きが決まる",[275,602,603,606,609,612,615],{},[299,604,605],{},"18",[299,607,608],{},"スキルを呼ばずに作業",[299,610,611],{},"viewBox や色のルールから外れた",[299,613,614],{},"スキル v2 として作り直し",[299,616,617],{},"最初に Skill ツールを呼ぶ習慣を再確認",[275,619,620,623,626,629,632],{},[299,621,622],{},"19",[299,624,625],{},"カテゴリ分類の誤り",[299,627,628],{},"「該当しない給与」を独立L1に並べた",[299,630,631],{},"末端注記に格下げ",[299,633,634],{},"元の本のロジックを正確に追う必要",[97,636],{},[24,638,639],{"id":639},"今日の学び",[56,641,642,648,654,660,666,672,678,684,690,696],{},[59,643,644,647],{},[52,645,646],{},"「コードを動画みたいに説明」要望から1日でスキル成立まで持っていける"," ── 最初に「画面 ↔ コード ↔ 型」の3点追跡形式に到達できれば、あとはスキル化して再利用に回せる",[59,649,650,653],{},[52,651,652],{},"Excel理解者向けには「Excel忠実再現グリッド」が圧倒的に伝わる"," ── 行番号・列レターを揃えて貼ると、Excel理解者の視線が画面上を勝手に追い始める",[59,655,656,659],{},[52,657,658],{},"範囲外枠ハイライトは塗りつぶしより伝わる"," ── 「ここに注目してほしい」が静的に伝わるが、Excel の範囲選択時の見た目に揃えると違和感が消える",[59,661,662,665],{},[52,663,664],{},"PA-API 5.0 は不安定。curl_cffi（TLS偽装）+ HTML パースが最速最安定"," ── アフィリエイト承認後の qualifying sales 期間で簡単に 403 が返る",[59,667,668,671],{},[52,669,670],{},"量産は HTTP直叩き、検証は Chrome DevTools MCP"," ── 単一ブラウザ共有のツールに並列化を期待してはいけない",[59,673,674,677],{},[52,675,676],{},"CAPTCHAは並列度を下げて sleep を長くすれば抜ける"," ── 並列度2 + 20-30秒 sleep で復旧する",[59,679,680,683],{},[52,681,682],{},"書籍の図は「忠実再現」より「ロジック整理」のほうが伝わる"," ── 元の本に引きずられないでカード型・パラレルツリーに組み直すほうが読みやすい",[59,685,686,689],{},[52,687,688],{},"強調はマゼンタ1点のみ"," ── アウトカム（損金算入○）にだけ色を当てる。複数色を使うと焦点が散る",[59,691,692,695],{},[52,693,694],{},"WAL ロックエラーは並列度を下げて再試行が確実"," ── libsql Embedded Replica は短時間ロックが起きる",[59,697,698,701],{},[52,699,700],{},"引き継ぎマークダウン（memo/）を必ず書く"," ── 別セッションでも続きを実行できる構造を残す",[97,703],{},[24,705,706],{"id":706},"明日やること",[56,708,711,721,727,733,739,745],{"className":709},[710],"contains-task-list",[59,712,715,720],{"className":713},[714],"task-list-item",[716,717],"input",{"disabled":718,"type":719},true,"checkbox"," 残り37件の Amazon メタデータ CAPTCHA 再取得を完了させる",[59,722,724,726],{"className":723},[714],[716,725],{"disabled":718,"type":719}," 書棚UI の出版社別フィルターを使い込んで、追加で必要な切り口（ジャンル、出版年）を洗い出す",[59,728,730,732],{"className":729},[714],[716,731],{"disabled":718,"type":719}," feature-slides スキルで他のCF精算表（CF302, CF303, CF304）も量産する",[59,734,736,738],{"className":735},[714],[716,737],{"disabled":718,"type":719}," yomitoku で残りの専門書を順次バッチ処理する",[59,740,742,744],{"className":741},[714],[716,743],{"disabled":718,"type":719}," svg-diagram スキル v2 を使って、税法テキストの他の図もSVG化する",[59,746,748,750],{"className":747},[714],[716,749],{"disabled":718,"type":719}," 漫画PDFのサマリー雛形を本一冊全部に適用してテストする",[97,752],{},[24,754,755],{"id":755},"関連記事",[56,757,758,762,766,770,774,778],{},[59,759,760],{},[92,761,95],{"href":94},[59,763,764],{},[92,765,137],{"href":136},[59,767,768],{},[92,769,175],{"href":174},[59,771,772],{},[92,773,221],{"href":220},[59,775,776],{},[92,777,262],{"href":261},[59,779,780],{},[92,781,783],{"href":782},"/treadmill-office-walking","事務所にWalkingPad Z1を置いて歩きながら仕事したら、1日平均歩数が10年で最高になった",{"title":785,"searchDepth":786,"depth":786,"links":787},"",2,[788,789,797,798,799,800],{"id":26,"depth":786,"text":26},{"id":36,"depth":786,"text":36,"children":790},[791,793,794,795,796],{"id":40,"depth":792,"text":41},3,{"id":101,"depth":792,"text":102},{"id":142,"depth":792,"text":143},{"id":180,"depth":792,"text":181},{"id":226,"depth":792,"text":227},{"id":267,"depth":786,"text":267},{"id":639,"depth":786,"text":639},{"id":706,"depth":786,"text":706},{"id":755,"depth":786,"text":755},"diary","別リポジトリ eurekapu-nuxt4 でCFWS v2の構造解説スライドを reveal.js で組む過程から汎用スキル feature-slides まで一気に成立させ、Excel忠実再現グリッドと範囲外枠ハイライトまで詰めた。並行して book-knowledge-base 側で yomitoku を5冊・1181ページに通して Turso DB に1057チャンク登録、Amazon の星評価・メタデータを 935件中 841件取得して Nuxt の書棚UI で公開した。SVG図解の作業も svg-diagram スキル v2 として書籍画像→SVG変換ワークフローを追記。","md",{},"/2026-04-28-diary","daily-log",false,"2026-04-28T00:00:00.000Z",{"title":5,"description":802},"2026-04/2026-04-28/diary-2026-04-28",[812,813,814,815,816,817,818,819,820],"日記","Claude Code","スキル","reveal.js","yomitoku","Turso","Amazon","Nuxt","SVG",null,"9E8AXCJg-UwiLbV-biPH42vZP7cctma12kkgjFieQnk",[],"https://log.eurekapu.com/favicon.svg",1777533702813]