[{"data":1,"prerenderedAt":481},["ShallowReactive",2],{"content-/2026-03-22-diary":3,"all-pages-for-dir":479,"og-image-/2026-03-22-diary":480},{"id":4,"title":5,"body":6,"category":460,"description":461,"extension":462,"meta":463,"navigation":464,"path":465,"project_name":466,"published":467,"publishedAt":468,"seo":469,"stem":470,"tags":471,"todo":477,"updatedAt":477,"__hash__":478},"pages/2026-03/2026-03-22/diary-2026-03-22.md","2026年3月22日の開発日記 - 環境修正からChrome拡張のSheets連携まで",{"type":7,"value":8,"toc":446},"minimark",[9,14,23,27,32,47,53,69,80,83,87,98,102,116,124,126,130,141,145,156,164,166,170,184,188,202,210,212,215,397,399,402,423,425,428],[10,11,13],"h1",{"id":12},"_2026年3月22日の開発日記","2026年3月22日の開発日記",[15,16,17,18,22],"p",{},"朝一番で ",[19,20,21],"code",{},"make-diary"," を叩いたら日付がずれていた。そこからタイムゾーン修正に始まり、VOICEVOX音声サーバーの修正、worktree整理、リアルタイム会議要約、掛け算スライドショーの移植、Chrome拡張のSheets連携と、手を動かし続けた1日だった。",[24,25,26],"h2",{"id":26},"今日やったこと",[28,29,31],"h3",{"id":30},"_1-開発環境改善タイムゾーンvoicevoxworktree","1. 開発環境改善（タイムゾーン・VOICEVOX・worktree）",[15,33,34,35,38,39,42,43,46],{},"Windows Git Bashで ",[19,36,37],{},"TZ=Asia/Tokyo"," がGMTにフォールバックする問題を発見し、make-diaryコマンドを修正した。WindowsのシステムクロックはすでにJSTなので、TZ指定を外すだけで解決。VOICEVOX音声リレーサーバーはスタートアップの ",[19,40,41],{},"pythonw"," がPATH解決に失敗していたため ",[19,44,45],{},"python"," に書き換えた。残留worktree2つもmasterにマージして削除。",[15,48,49],{},[50,51,52],"strong",{},"主な成果:",[54,55,56,60,63,66],"ul",{},[57,58,59],"li",{},"make-diaryのタイムゾーン修正（TZ=Asia/Tokyo → 素のdate）",[57,61,62],{},"音声サーバーの自動起動修正（pythonw → python）",[57,64,65],{},"2026-03-21記事の月別ディレクトリ統合、スクリーンショット削除",[57,67,68],{},"devcontainerでのgh auth設定、PR #1レビュー",[15,70,71,74,75],{},[50,72,73],{},"詳細:"," ",[76,77,79],"a",{"href":78},"/dev-env-improvements-2026-03-22","Windows Git Bashのタイムゾーン罠とVOICEVOX自動起動修正",[81,82],"hr",{},[28,84,86],{"id":85},"_2-リアルタイム会議要約システム構築","2. リアルタイム会議要約システム構築",[15,88,89,90,93,94,97],{},"Claude Codeの ",[19,91,92],{},"/loop"," + ",[19,95,96],{},"/summarize-meeting"," で、3分間隔の会議自動要約を実現した。devcontainerとWindows環境のパス差異、worktree内ファイルの更新がNuxtアプリに反映されない問題を順に片付け、約45分のロールプレイをリアルタイムで要約できた。",[15,99,100],{},[50,101,52],{},[54,103,104,107,110,113],{},[57,105,106],{},"CronCreateで3分間隔の自動要約パイプライン構築",[57,108,109],{},"devcontainer環境判定ロジックの追加",[57,111,112],{},"差分モード実装（処理済み行数を記録し新規分のみ処理）",[57,114,115],{},"minutes.jsonのリアルタイム更新でNuxtアプリ連携",[15,117,118,74,120],{},[50,119,73],{},[76,121,123],{"href":122},"/realtime-meeting-summarizer","Claude Codeでリアルタイム会議要約システムを構築した記録",[81,125],{},[28,127,129],{"id":128},"_3-掛け算スライドショーのvuejs移植","3. 掛け算スライドショーのVue.js移植",[15,131,132,133,136,137,140],{},"React TSX製の面積図スライドショーをNuxt 3のVueページに変換した。CSSトランジションが効かない問題は、",[19,134,135],{},":key","にスライド番号を含めてDOM要素が毎回再生成されていたのが原因。安定した ",[19,138,139],{},":key=\"meta.id\""," に変更して解決。",[15,142,143],{},[50,144,52],{},[54,146,147,150,153],{},[57,148,149],{},"React → Vue.jsへの完全移植（scoped CSS使用）",[57,151,152],{},"P3ピースの回転アニメーション実装",[57,154,155],{},"CLAUDE.mdにworktree環境でのpnpm install注意を追記",[15,157,158,74,160],{},[50,159,73],{},[76,161,163],{"href":162},"/multiplication-slideshow-vue","React TSXの掛け算スライドショーをVue.jsに移植した記録",[81,165],{},[28,167,169],{"id":168},"_4-chrome拡張機能のgoogle-sheets-api連携","4. Chrome拡張機能のGoogle Sheets API連携",[15,171,172,173,179,180,183],{},"会計ソフトの明細取得Chrome拡張にSheets書き込み機能を追加した。OAuth2のクライアントIDタイプ（デスクトップ→Chrome アプリ）、API URL（",[76,174,178],{"href":175,"rel":176},"http://www.googleapis.com",[177],"nofollow","www.googleapis.com"," → sheets.googleapis.com）で2回つまずいたが、Codexレビューで",[19,181,182],{},"host_permissions","漏れを事前に潰せた。差分追記方式で既存データを壊さない設計にした。",[15,185,186],{},[50,187,52],{},[54,189,190,193,196,199],{},[57,191,192],{},"Google Sheets API書き込み機能の実装",[57,194,195],{},"OAuth2認証（chrome.identity.getAuthToken）の設定",[57,197,198],{},"差分追記ロジック（全列JSON.stringify一致で重複判定）",[57,200,201],{},"ページ遷移待機の改善（固定1.5秒 → 条件ベースポーリング）",[15,203,204,74,206],{},[50,205,73],{},[76,207,209],{"href":208},"/chrome-extension-sheets-api","Chrome拡張機能にGoogle Sheets API書き込みを追加する",[81,211],{},[24,213,214],{"id":214},"今日の試行錯誤",[216,217,218,240],"table",{},[219,220,221],"thead",{},[222,223,224,228,231,234,237],"tr",{},[225,226,227],"th",{},"#",[225,229,230],{},"テーマ",[225,232,233],{},"試したこと",[225,235,236],{},"結果",[225,238,239],{},"気づき",[241,242,243,264,286,303,319,341,358,380],"tbody",{},[222,244,245,249,252,258,261],{},[246,247,248],"td",{},"1",[246,250,251],{},"タイムゾーン",[246,253,254,257],{},[19,255,256],{},"TZ=Asia/Tokyo date"," で日付取得",[246,259,260],{},"失敗（GMTにフォールバック）",[246,262,263],{},"MSYS2はzoneinfo未参照。Windowsクロックが既にJST",[222,265,266,269,272,278,281],{},[246,267,268],{},"2",[246,270,271],{},"音声サーバー",[246,273,274,275,277],{},"スタートアップで ",[19,276,41],{}," 起動",[246,279,280],{},"失敗（PATH未解決でサイレント失敗）",[246,282,283,285],{},[19,284,45],{}," ならPATHが通る",[222,287,288,291,294,297,300],{},[246,289,290],{},"3",[246,292,293],{},"会議要約",[246,295,296],{},"worktree内のminutes.json更新",[246,298,299],{},"Nuxtアプリに反映されず",[246,301,302],{},"元リポジトリに直接書く必要あり",[222,304,305,308,310,313,316],{},[246,306,307],{},"4",[246,309,293],{},[246,311,312],{},"devcontainer内でWindowsのログ参照",[246,314,315],{},"/workspace/logs/ で見えた",[246,317,318],{},"マウント済みだった",[222,320,321,324,327,332,335],{},[246,322,323],{},"5",[246,325,326],{},"Vueアニメーション",[246,328,329],{},[19,330,331],{},":key=\"currentSlide-meta.id\"",[246,333,334],{},"CSSトランジション効かず",[246,336,337,338,340],{},"DOM再生成が原因。",[19,339,139],{}," で安定化",[222,342,343,346,349,352,355],{},[246,344,345],{},"6",[246,347,348],{},"OAuth2",[246,350,351],{},"デスクトップ用クライアントID",[246,353,354],{},"bad client id エラー",[246,356,357],{},"Chrome拡張は「Chrome アプリ」タイプが必要",[222,359,360,363,366,371,374],{},[246,361,362],{},"7",[246,364,365],{},"Sheets API",[246,367,368,370],{},[19,369,178],{}," でfetch",[246,372,373],{},"404",[246,375,376,377],{},"正しくは ",[19,378,379],{},"sheets.googleapis.com",[222,381,382,385,388,391,394],{},[246,383,384],{},"8",[246,386,387],{},"明細取得",[246,389,390],{},"固定1.5秒待機でページ遷移",[246,392,393],{},"最後のアカウントで全明細取得",[246,395,396],{},"フィルタ適用完了まで条件ベースで待機",[81,398],{},[24,400,401],{"id":401},"今日の学び",[54,403,404,411,414,420],{},[57,405,406,407,410],{},"Windows Git Bashの ",[19,408,409],{},"TZ"," 環境変数はMSYS2のzoneinfo非参照で機能しない。エラーが出ないぶん気づきにくい",[57,412,413],{},"Chrome拡張のOAuth2クライアントIDは「Chrome アプリ」タイプ専用。デスクトップ用を流用するとサイレントに失敗する",[57,415,416,417,419],{},"Vueのトランジションは「DOM要素を再利用する」が前提。",[19,418,135],{}," でDOM再生成するとCSSトランジションが効かない",[57,421,422],{},"worktree内で更新したファイルは元リポジトリには反映されない。Nuxtアプリ連携時は元リポジトリのパスに直接書く",[81,424],{},[24,426,427],{"id":427},"関連記事",[54,429,430,434,438,442],{},[57,431,432],{},[76,433,79],{"href":78},[57,435,436],{},[76,437,123],{"href":122},[57,439,440],{},[76,441,163],{"href":162},[57,443,444],{},[76,445,209],{"href":208},{"title":447,"searchDepth":448,"depth":448,"links":449},"",2,[450,457,458,459],{"id":26,"depth":448,"text":26,"children":451},[452,454,455,456],{"id":30,"depth":453,"text":31},3,{"id":85,"depth":453,"text":86},{"id":128,"depth":453,"text":129},{"id":168,"depth":453,"text":169},{"id":214,"depth":448,"text":214},{"id":401,"depth":448,"text":401},{"id":427,"depth":448,"text":427},"diary","タイムゾーン問題の修正、VOICEVOX音声サーバーの自動起動修正、リアルタイム会議要約システム構築、掛け算スライドショーのVue移植、Chrome拡張のGoogle Sheets API連携を実装した1日。","md",{},true,"/2026-03-22-diary","daily-log",false,"2026-03-22T00:00:00.000Z",{"title":5,"description":461},"2026-03/2026-03-22/diary-2026-03-22",[472,473,474,475,476],"日記","開発環境","Chrome拡張機能","Vue.js","リアルタイム要約",null,"MkbRHjmAw1e55h5iVaxXKjsFZsHKdp5j_eWmw0WiiVg",[],"https://log.eurekapu.com/favicon.svg",1778379975999]