[{"data":1,"prerenderedAt":597},["ShallowReactive",2],{"content-/2026-07-23-diary":3,"all-pages-for-dir":574,"related-/2026-07-23-diary":575,"og-image-/2026-07-23-diary":596},{"id":4,"title":5,"body":6,"category":556,"concepts":557,"description":558,"extension":559,"meta":560,"navigation":474,"ogImage":557,"path":561,"project_name":562,"published":563,"publishedAt":564,"seo":565,"stem":566,"tags":567,"todo":557,"unpublished":563,"updatedAt":557,"__hash__":573},"pages/2026-07/2026-07-23/diary-2026-07-23.md","2026年7月23日の開発日記 - 音声入力の誤変換を辞書で潰し、WordPressの出口を決めた日",{"type":7,"value":8,"toc":537},"minimark",[9,14,18,22,29,32,37,40,46,59,75,78,82,85,89,100,109,111,115,118,122,130,139,141,145,148,152,163,171,173,177,180,184,192,200,202,206,209,213,218,226,228,232,262,264,267,436,438,441,458,460,463,489,491,494],[10,11,13],"h1",{"id":12},"_2026年7月23日の開発日記","2026年7月23日の開発日記",[15,16,17],"p",{},"朝から晩まで5つのプロジェクトを行き来した。振り返って一番長く付き合っていたのは、コードでも記事でもなく、自分の声だった。音声入力の誤変換を放置したまま何ヶ月も使い続けていて、試しにログから誤変換のパターンを洗い出させてみたら、一瞬で終わってしまった。面倒だと思い込んでいた作業ほど、着手すると呆気ない。その一方で、着手すれば終わると思っていたWordPress移行のほうは、方針を決めた矢先に本番サイトが落ちていることに気づく展開になった。",[19,20,21],"h2",{"id":21},"今日のタイムライン",[15,23,24],{},[25,26],"img",{"alt":27,"src":28},"タイムライン","/2026-07/2026-07-23/timeline-2026-07-23.png",[19,30,31],{"id":31},"今日やったこと",[33,34,36],"h3",{"id":35},"_1-音声入力の辞書チューニングaqua-voice","1. 音声入力の辞書チューニング（Aqua Voice）",[15,38,39],{},"音声入力の誤変換、面倒で放置していたのをClaude Codeに聞いてみたら一瞬で終わった。過去30日・5プロジェクト分のセッションログから固有名詞・会計用語の誤変換パターンを抽出させて辞書候補の記事にまとめ、Codexのコンピュータユーズ機能でAqua Voiceの辞書画面への登録を自動化。読み上げテストを繰り返して、「減価償却」だけでは変換されず「減価償却費」まで一連の単語として登録すると通る、という登録のコツも掴んだ。DictionaryとCustomInstructionsの役割分担は公式ドキュメントを調べて独立記事にした。",[15,41,42],{},[43,44,45],"strong",{},"主な成果:",[47,48,49,53,56],"ul",{},[50,51,52],"li",{},"過去30日のログから誤変換パターンを抽出、辞書候補として記事化",[50,54,55],{},"Codexのコンピュータユーズで辞書登録を自動化",[50,57,58],{},"読み上げテストを重ねて「一連の単語で登録する」という運用知見を確立",[15,60,61,64,65,70,71],{},[43,62,63],{},"詳細:"," ",[66,67,69],"a",{"href":68},"/aqua-voice-dictionary-candidates","Aqua Voiceの辞書候補（過去30日分・5プロジェクトのセッションログより）"," / ",[66,72,74],{"href":73},"/aqua-voice-dictionary-vs-custom-instructions","AquaVoiceのDictionary・CustomInstructions・Replacements、公式ドキュメントに見る役割分担",[76,77],"hr",{},[33,79,81],{"id":80},"_2-wordpress移行の方針決定と本番サイトの522障害","2. WordPress移行の方針決定と、本番サイトの522障害",[15,83,84],{},"移行前レビュー用の記事一覧ページを2カラムに整え、矢印キーでのナビゲーションとSEO情報パネルを付けたところから、話が大きくなった。移行方針を「VPSを解約してCloudflareへ、フレームワークはNuxt」で確定し、作業一式をGitリポジトリ化。その足でSearch Consoleの実データを見に行ったら、本番サイトが6月上旬から522エラーで落ちていた。仮説をドキュメントに書き出してから1つずつ検証する順で進め、原因はVPSのセキュリティグループからWeb用の許可グループが外れていたことだと特定、その場で復旧した。検討中に出てきた「汎用的にはAstroが有力」という評価は、理解が追いつかなかったので独立記事として深掘りさせた。",[15,86,87],{},[43,88,45],{},[47,90,91,94,97],{},[50,92,93],{},"移行方針の確定（VPS解約・Cloudflare・Nuxt）とGitリポジトリ化",[50,95,96],{},"本番522障害の原因特定と復旧（セキュリティグループの設定漏れ）",[50,98,99],{},"AstroとNuxtの「汎用性」の意味を整理した公開記事",[15,101,102,64,104,108],{},[43,103,63],{},[66,105,107],{"href":106},"/astro-vs-nuxt-general-purpose","「汎用的にはAstro」は何を指しているのか"," / WordPress移行の方針を固め、本番障害の原因を追いかけた一日（未公開）",[76,110],{},[33,112,114],{"id":113},"_3-サーバー接続と鍵認証の整備1password-ssh-agent","3. サーバー接続と鍵認証の整備（1Password SSH Agent）",[15,116,117],{},"522障害の調査と並行して、サーバーへの接続手段を整えた。1Passwordに保存したパスワードでのSFTP初回接続から、1Password SSH Agentによる公開鍵認証への切り替えまでを検証し、作業記録として非公開寄りの接続テスト記事に整理。あわせて「なぜ公開鍵は漏れてもいいのか」という素朴な疑問をシーケンス図付きで解説する入門記事も作った。",[15,119,120],{},[43,121,45],{},[47,123,124,127],{},[50,125,126],{},"パスワード接続から公開鍵認証への切り替えを検証",[50,128,129],{},"SSH鍵認証の仕組みを図解した入門記事",[15,131,132,64,134,138],{},[43,133,63],{},[66,135,137],{"href":136},"/1password-ssh-agent-coding-agent-setup","1Password SSH AgentでコーディングエージェントのSSH接続を安全にする"," / KUSANAGI SFTPへ1Password経由で接続した記録（未公開）",[76,140],{},[33,142,144],{"id":143},"_4-語源単語コンテンツの画像レビュー完走eurekapu-nuxt4","4. 語源単語コンテンツの画像レビュー完走（eurekapu-nuxt4）",[15,146,147],{},"前日から持ち越した語源英単語4000語の画像レビューを完走させた。1枚目のexcuseで「明らかに違う」と気づいたところから、Codexに3回ずつ判定させて突き合わせる体制に切り替え（最終的には1票でも要再作成が入れば作り直す基準に統一）、判定がブレる原因を追ううちに、生成プロンプトの奥に埋まっていた「人物を描くな」という制約に行き着いた。制約を消しただけでは直らず、構図の設計思想そのものを書き換えてようやく先生と生徒が画面に現れた。111語を20並列で再生成し、110語まで完了。miseryの1件だけ翌日に持ち越した。",[15,149,150],{},[43,151,45],{},[47,153,154,157,160],{},[50,155,156],{},"198語のCodexレビュー→判定基準統一→111語の再生成",[50,158,159],{},"「人物を描くな」制約の発見と、構図設計の方針転換",[50,161,162],{},"並列数の実績値（3並列≈100枚/時、20並列超で大幅短縮）をドキュメント化",[15,164,165,64,167],{},[43,166,63],{},[66,168,170],{"href":169},"/gogen-eitango-image-review-completion","語源英単語4000語の画像レビュー完走記 — Codexの判定がブレた理由は「人物を描くな」という制約だった",[76,172],{},[33,174,176],{"id":175},"_5-kindle書籍のocr取り込み新コマンドbook-knowledge-base","5. Kindle書籍のOCR取り込み新コマンド（book-knowledge-base）",[15,178,179],{},"蔵書DBに入れたつもりで入っていなかったKindle書籍を1冊発見し、取り込みの型を新コマンドとして固めた。Cloud Readerが開ける書籍と拒否される書籍で撮影ルートを分け、どちらも既存のOCR→DB登録パイプラインへ合流させる二系統の設計。撮影100枚の時点で「先に部分OCRを回せないか」と食い下がったが、章境界の統合処理の都合で分割は見送りに。結局、検討している間に撮影本体が先に終わった。262ページ・110チャンクをDBに収め、クリーンアップまで完了した。",[15,181,182],{},[43,183,45],{},[47,185,186,189],{},[50,187,188],{},"Kindle取り込みの二系統ルートをコマンド化",[50,190,191],{},"262ページの取り込みとクリーンアップ完了",[15,193,194,64,196],{},[43,195,63],{},[66,197,199],{"href":198},"/kindle-ocr-pipeline-async-command","Kindle電子書籍をOCRで蔵書DBに取り込む新コマンドを作った",[76,201],{},[33,203,205],{"id":204},"_6-埋没原価と機会原価の解説記事","6. 埋没原価と機会原価の解説記事",[15,207,208],{},"管理会計の「埋没原価」と「機会原価」、名前は似ているのに意思決定での扱いが正反対になる2概念を、SVG図解付きの公開記事にした。株式投資での具体例（含み損の銘柄を損切りできない場面で、いくらが埋没原価でいくらが機会原価か）をウォーターフォールチャートで金額ベースに可視化するところまで詰めた。",[15,210,211],{},[43,212,45],{},[47,214,215],{},[50,216,217],{},"埋没原価と機会原価の対比記事（SVG図解・株式投資の具体例付き）",[15,219,220,64,222],{},[43,221,63],{},[66,223,225],{"href":224},"/sunk-cost-vs-opportunity-cost","埋没原価と機会原価 — 名前は似ているのに、意思決定での役割は正反対",[76,227],{},[33,229,231],{"id":230},"_7-その他","7. その他",[47,233,234,240,246,256],{},[50,235,236,239],{},[43,237,238],{},"非公開ネタ帳のflowchart追加（朝一の積み残し処理）",": 前日の積み残しだった非公開記事への抽象化版flowchart追加を完了。30項目分をNode.jsスクリプトで機械挿入させ、描画を確認してからコミットした",[50,241,242,245],{},[43,243,244],{},"帰省用の車購入 vs レンタカー試算",": 実家への帰省の足を、中古車購入・新車購入・東京持ち込み・都度レンタカーの4パターンで損益分岐を計算し、非公開メモにした → 帰省用の車購入 vs レンタカーの試算メモ（未公開）",[50,247,248,251,252],{},[43,249,250],{},"決算ビートスキャン",": 前日22日引け後分の決算から、コンセンサス5%超えの4銘柄（TXN/URI/MEDP/NOW）を記事化 → ",[66,253,255],{"href":254},"/earnings-beats-2026-07-22","決算ビートスキャン 2026-07-22",[50,257,258,261],{},[43,259,260],{},"技術書からインタラクティブ教材の作成開始",": 蔵書DBに取り込んだコンピュータの仕組みを解説した技術書の2〜4章をもとに、2進数コードを学ぶインタラクティブなコースページの実装に着手（続きは翌日以降）",[76,263],{},[19,265,266],{"id":266},"今日の試行錯誤",[268,269,270,292],"table",{},[271,272,273],"thead",{},[274,275,276,280,283,286,289],"tr",{},[277,278,279],"th",{},"#",[277,281,282],{},"テーマ",[277,284,285],{},"試したこと",[277,287,288],{},"結果",[277,290,291],{},"気づき",[293,294,295,313,330,347,368,385,402,419],"tbody",{},[274,296,297,301,304,307,310],{},[298,299,300],"td",{},"1",[298,302,303],{},"音声入力の辞書登録",[298,305,306],{},"「減価償却」だけを辞書登録",[298,308,309],{},"失敗（変換されず）",[298,311,312],{},"「減価償却費」まで一連の単語で登録すると通る。実際に発話する単位で登録するのが正解",[274,314,315,318,321,324,327],{},[298,316,317],{},"2",[298,319,320],{},"同上",[298,322,323],{},"リポジトリ名をカタカナ発話から変換",[298,325,326],{},"部分的に成功",[298,328,329],{},"「レポジトリ」という文脈語が近くにあると固有名詞として認識されやすい",[274,331,332,335,338,341,344],{},[298,333,334],{},"3",[298,336,337],{},"Codexでの画像判定",[298,339,340],{},"1回だけ判定させる",[298,342,343],{},"失敗（同条件で結果が割れる）",[298,345,346],{},"LLM判定は非決定的。3回判定×「1票でも要再作成なら作り直し」の基準に統一",[274,348,349,352,354,357,360],{},[298,350,351],{},"4",[298,353,320],{},[298,355,356],{},"汎用オプションで画像を渡す",[298,358,359],{},"失敗（読めていないのにOKと回答）",[298,361,362,363,367],{},"画像添付専用の",[364,365,366],"code",{},"-i","オプションで解決。トークンも約1/8に",[274,369,370,373,376,379,382],{},[298,371,372],{},"5",[298,374,375],{},"語源画像の人物欠落",[298,377,378],{},"プロンプトの「人物を描くな」制約を削除",[298,380,381],{},"失敗（まだ人物が出ない）",[298,383,384],{},"制約を消しても、既に固まった構図指示は変わらない。構図の設計思想まで書き換えて解決",[274,386,387,390,393,396,399],{},[298,388,389],{},"6",[298,391,392],{},"WordPress本番の522障害",[298,394,395],{},"仮説を3つドキュメント化して順に検証",[298,397,398],{},"成功",[298,400,401],{},"Cloudflare設定→FW→権限の順で潰し、セキュリティグループのWeb用グループ欠落を特定",[274,403,404,407,410,413,416],{},[298,405,406],{},"7",[298,408,409],{},"Kindle取り込みの部分OCR",[298,411,412],{},"撮影100枚時点で前半だけOCRに回す提案",[298,414,415],{},"見送り",[298,417,418],{},"章境界をまたぐ統合処理があるため分割は危険。検討中に撮影が先に終わった",[274,420,421,424,427,430,433],{},[298,422,423],{},"8",[298,425,426],{},"移行レビュー用の記事一覧",[298,428,429],{},"記事を3カラムグリッドに配置",[298,431,432],{},"失敗（シリーズが横に散る）",[298,434,435],{},"コンテンツ単位で縦列を保ったまま敷き詰める多段組みに変更、最終的に2カラムへ",[76,437],{},[19,439,440],{"id":440},"今日の学び",[47,442,443,446,449,452,455],{},[50,444,445],{},"辞書登録は単語の正規形ではなく、実際に発話する一連の語（「減価償却費」）で登録すると認識率が上がる",[50,447,448],{},"LLMに判定をさせるなら1回の結果を信用しない。複数回判定させて突き合わせ、初めて判定として使える",[50,450,451],{},"制約は「消す」だけでは直らないことがある。制約の影響が既に別の場所（構図指示）に焼き付いていれば、そちらを書き換える必要がある",[50,453,454],{},"障害調査は手を動かす前に仮説をドキュメント化すると、原因への到達が速い",[50,456,457],{},"「面倒で放置していた作業」は、ログという材料が既に揃っていれば一瞬で終わることがある",[76,459],{},[19,461,462],{"id":462},"明日やること",[47,464,467,477,483],{"className":465},[466],"contains-task-list",[50,468,471,476],{"className":469},[470],"task-list-item",[472,473],"input",{"disabled":474,"type":475},true,"checkbox"," 語源画像の残り1件（misery）の回収と最終確認",[50,478,480,482],{"className":479},[470],[472,481],{"disabled":474,"type":475}," Nuxt移行計画（WordPress移行）の実行判断",[50,484,486,488],{"className":485},[470],[472,487],{"disabled":474,"type":475}," インタラクティブ教材（2進数コース）の続き",[76,490],{},[19,492,493],{"id":493},"関連記事",[47,495,496,500,504,508,512,515,519,523,527,531,534],{},[50,497,498],{},[66,499,69],{"href":68},[50,501,502],{},[66,503,74],{"href":73},[50,505,506],{},[66,507,107],{"href":106},[50,509,510],{},[66,511,137],{"href":136},[50,513,514],{},"KUSANAGI SFTPへ1Password経由で接続した記録（未公開）",[50,516,517],{},[66,518,170],{"href":169},[50,520,521],{},[66,522,199],{"href":198},[50,524,525],{},[66,526,225],{"href":224},[50,528,529],{},[66,530,255],{"href":254},[50,532,533],{},"帰省用の車購入 vs レンタカーの試算メモ（未公開）",[50,535,536],{},"WordPress移行の方針を固め、本番障害の原因を追いかけた一日（未公開）",{"title":538,"searchDepth":539,"depth":539,"links":540},"",2,[541,542,552,553,554,555],{"id":21,"depth":539,"text":21},{"id":31,"depth":539,"text":31,"children":543},[544,546,547,548,549,550,551],{"id":35,"depth":545,"text":36},3,{"id":80,"depth":545,"text":81},{"id":113,"depth":545,"text":114},{"id":143,"depth":545,"text":144},{"id":175,"depth":545,"text":176},{"id":204,"depth":545,"text":205},{"id":230,"depth":545,"text":231},{"id":266,"depth":539,"text":266},{"id":440,"depth":539,"text":440},{"id":462,"depth":539,"text":462},{"id":493,"depth":539,"text":493},"diary",null,"5プロジェクトを横断した一日の記録。音声入力の誤変換を過去30日のログから洗い出して辞書に登録し、WordPress移行は「VPS解約・Nuxt移行」の方針で確定、途中で見つけた本番サイトの522障害も原因を特定して解決した。語源単語の画像レビュー完走とKindle書籍のOCR取り込みも進んだ。","md",{},"/2026-07-23-diary","daily-log",false,"2026-07-23T00:00:00.000Z",{"title":5,"description":558},"2026-07/2026-07-23/diary-2026-07-23",[568,569,570,571,572],"日記","Aqua Voice","WordPress移行","eurekapu-nuxt4","1Password","y8Q6wXO5M-a4zwHax8ne67cbsg2F2JxTX47U3TAaZC0",[],[576,580,584,588,592],{"title":577,"path":578,"publishedAt":579},"2026年7月21日の開発日記 - 会計アプリの誕生と、サブエージェントが吐いた一つの嘘","/2026-07-21-diary","2026-07-21T00:00:00.000Z",{"title":581,"path":582,"publishedAt":583},"2026年7月24日の開発日記 - 進める判断より、止める判断のほうが多かった日","/2026-07-24-diary","2026-07-24T00:00:00.000Z",{"title":585,"path":586,"publishedAt":587},"2026年7月22日の開発日記 - Micronの格上げニュースと、語源単語コンテンツに眠っていた画像の使い回しバグ","/2026-07-22-diary","2026-07-22T00:00:00.000Z",{"title":589,"path":590,"publishedAt":591},"2026年7月20日の開発日記 - 想起で単語を思い出す仕組みと、GPT-5.6 Solの20万トークンの壁","/2026-07-20-diary","2026-07-20T00:00:00.000Z",{"title":593,"path":594,"publishedAt":595},"2026年7月18日の開発日記 - 1Password実機検証と画像パイプラインsol採用","/2026-07-18-diary","2026-07-18T00:00:00.000Z","https://log.eurekapu.com/og/blog/2026-07-23-diary.png?v=2026-07-23T00%3A00%3A00.000Z&title=2026%E5%B9%B47%E6%9C%8823%E6%97%A5%E3%81%AE%E9%96%8B%E7%99%BA%E6%97%A5%E8%A8%98%20-%20%E9%9F%B3%E5%A3%B0%E5%85%A5%E5%8A%9B%E3%81%AE%E8%AA%A4%E5%A4%89%E6%8F%9B%E3%82%92%E8%BE%9E%E6%9B%B8%E3%81%A7%E6%BD%B0%E3%81%97%E3%80%81WordPress%E3%81%AE%E5%87%BA%E5%8F%A3%E3%82%92%E6%B1%BA%E3%82%81%E3%81%9F%E6%97%A5&author=Kei%20Komatsu&sig=79df51240b285c63",1785099371334]