[{"data":1,"prerenderedAt":383},["ShallowReactive",2],{"content-/dev-env-improvements-2026-03-22":3,"all-pages-for-dir":381,"og-image-/dev-env-improvements-2026-03-22":382},{"id":4,"title":5,"body":6,"category":360,"description":361,"extension":362,"meta":363,"navigation":96,"path":364,"project_name":365,"published":366,"publishedAt":367,"seo":368,"stem":369,"tags":370,"todo":378,"updatedAt":379,"__hash__":380},"pages/2026-03/2026-03-22/dev-environment-improvements.md","Windows Git Bashのタイムゾーン罠とVOICEVOX自動起動修正 - 開発環境改善ログ",{"type":7,"value":8,"toc":339},"minimark",[9,14,27,32,37,50,113,117,140,144,153,163,167,171,174,178,192,196,227,244,248,251,254,284,288,294,298,302,313,317,320,323,329,335],[10,11,13],"h1",{"id":12},"windows-git-bashのタイムゾーン罠とvoicevox自動起動修正","Windows Git Bashのタイムゾーン罠とVOICEVOX自動起動修正",[15,16,17,18,22,23,26],"p",{},"朝、",[19,20,21],"code",{},"make-diary","コマンドを叩いたら、生成された日記のヘッダに見覚えのない日付が並んでいた。ターミナルで ",[19,24,25],{},"TZ=Asia/Tokyo date"," を打ち直しても、返ってくるのはGMT。そこから半日かけて、開発環境のあちこちに溜まっていた不具合を片付けた。",[28,29,31],"h2",{"id":30},"_1-make-diaryコマンドのタイムゾーン修正","1. make-diaryコマンドのタイムゾーン修正",[33,34,36],"h3",{"id":35},"症状-tzasiatokyo-が効かない","症状: TZ=Asia/Tokyo が効かない",[15,38,39,41,42,45,46,49],{},[19,40,21],{},"の日付生成で ",[19,43,44],{},"TZ=Asia/Tokyo date +%Y-%m-%d"," を使っていた。Linux環境（Docker含む）では正しくJSTを返すが、Windows Git Bashでは ",[19,47,48],{},"TZ=Asia/Tokyo"," が無視され、GMTにフォールバックしてUTC時刻を返してしまう。",[51,52,57],"pre",{"className":53,"code":54,"language":55,"meta":56,"style":56},"language-bash shiki shiki-themes vitesse-light vitesse-light","# Windows Git Bash で実行\n$ TZ=Asia/Tokyo date +%Y-%m-%d\n# → GMTベースの日付が返る（期待と異なる）\n\n$ date +%Y-%m-%d\n# → Windowsのシステムクロック（JST）に基づく正しい日付\n","bash","",[19,58,59,68,85,91,98,107],{"__ignoreMap":56},[60,61,64],"span",{"class":62,"line":63},"line",1,[60,65,67],{"class":66},"sxvE3","# Windows Git Bash で実行\n",[60,69,71,75,79,82],{"class":62,"line":70},2,[60,72,74],{"class":73},"senZ8","$",[60,76,78],{"class":77},"sdGka"," TZ=Asia/Tokyo",[60,80,81],{"class":77}," date",[60,83,84],{"class":77}," +%Y-%m-%d\n",[60,86,88],{"class":62,"line":87},3,[60,89,90],{"class":66},"# → GMTベースの日付が返る（期待と異なる）\n",[60,92,94],{"class":62,"line":93},4,[60,95,97],{"emptyLinePlaceholder":96},true,"\n",[60,99,101,103,105],{"class":62,"line":100},5,[60,102,74],{"class":73},[60,104,81],{"class":77},[60,106,84],{"class":77},[60,108,110],{"class":62,"line":109},6,[60,111,112],{"class":66},"# → Windowsのシステムクロック（JST）に基づく正しい日付\n",[33,114,116],{"id":115},"調査-なぜ効かないのか","調査: なぜ効かないのか",[15,118,119,120,123,124,127,128,131,132,135,136,139],{},"Git Bash（MSYS2）の ",[19,121,122],{},"date"," コマンドは、Linuxの ",[19,125,126],{},"/usr/share/zoneinfo/"," を参照しない。",[19,129,130],{},"TZ"," 環境変数に ",[19,133,134],{},"Asia/Tokyo"," のようなOlsenタイムゾーン名を渡しても解決できず、GMTにフォールバックする。POSIX形式（",[19,137,138],{},"TZ=JST-9","）なら効くが、そもそもWindowsのシステムクロックが既にJSTで動いている。",[33,141,143],{"id":142},"修正-tz指定を削除","修正: TZ指定を削除",[15,145,146,147,149,150,152],{},"Windowsのシステムクロックは既にJSTに設定されている。つまり素の ",[19,148,122],{}," コマンドで正しい日本時間が取れる。Docker環境とWindows環境で分岐していた処理を整理し、Windows側では ",[19,151,48],{}," 指定を削除した。",[15,154,155,159,160,162],{},[156,157,158],"strong",{},"学び:"," Linux向けに書いたシェルスクリプトをWindowsに持ってくると、「動くが結果が違う」パターンに嵌まる。エラーが出ないぶん気づきにくい。",[19,161,122],{}," コマンドの出力を目で確認する習慣をつけた。",[28,164,166],{"id":165},"_2-voicevox音声リレーサーバーの自動起動修正","2. VOICEVOX音声リレーサーバーの自動起動修正",[33,168,170],{"id":169},"症状-pc起動後にポート50055が開かない","症状: PC起動後にポート50055が開かない",[15,172,173],{},"Claude Codeの応答をVOICEVOXで読み上げる音声リレーサーバー（ポート50055）が、PC起動時に自動起動しなくなっていた。手動で起動すれば動く。",[33,175,177],{"id":176},"原因-pythonw-のpath解決失敗","原因: pythonw のPATH解決失敗",[15,179,180,181,184,185,188,189,191],{},"スタートアップに登録していたショートカットが ",[19,182,183],{},"start pythonw relay_server.py"," を実行していた。通常のターミナルセッションでは ",[19,186,187],{},"pythonw"," にPATHが通っているが、Windowsのスタートアップ環境ではPATHの展開タイミングが異なり、",[19,190,187],{}," が見つからずサイレントに失敗していた。",[33,193,195],{"id":194},"修正-start-b-python-に変更","修正: start /b python に変更",[51,197,201],{"className":198,"code":199,"language":200,"meta":56,"style":56},"language-bat shiki shiki-themes vitesse-light vitesse-light",":: Before（スタートアップ環境でPATH解決に失敗）\nstart pythonw relay_server.py\n\n:: After（確実に起動する）\nstart /b python relay_server.py\n","bat",[19,202,203,208,213,217,222],{"__ignoreMap":56},[60,204,205],{"class":62,"line":63},[60,206,207],{},":: Before（スタートアップ環境でPATH解決に失敗）\n",[60,209,210],{"class":62,"line":70},[60,211,212],{},"start pythonw relay_server.py\n",[60,214,215],{"class":62,"line":87},[60,216,97],{"emptyLinePlaceholder":96},[60,218,219],{"class":62,"line":93},[60,220,221],{},":: After（確実に起動する）\n",[60,223,224],{"class":62,"line":100},[60,225,226],{},"start /b python relay_server.py\n",[15,228,229,231,232,235,236,239,240,243],{},[19,230,187],{},"（コンソールウィンドウなしで実行）の代わりに ",[19,233,234],{},"start /b python","（バックグラウンドで実行）に切り替えた。",[19,237,238],{},"python"," はスタートアップ環境でもPATHが通っており、",[19,241,242],{},"start /b"," でコンソールウィンドウの表示を抑制できる。",[28,245,247],{"id":246},"_3-worktreeの整理","3. worktreeの整理",[15,249,250],{},"残留していた2つのworktreeを処理した。",[33,252,253],{"id":253},"作業内容",[255,256,257,261,264,271,274],"ol",{},[258,259,260],"li",{},"各worktreeの変更内容をmasterにマージ",[258,262,263],{},"マージ後、ブランチを削除",[258,265,266,267,270],{},"2026-03-21の記事を月別ディレクトリ構造（",[19,268,269],{},"content/2026-03/2026-03-21/","）に統合",[258,272,273],{},"不要になったスクリーンショットを削除",[258,275,276,279,280,283],{},[19,277,278],{},".gitignore"," に ",[19,281,282],{},".claude/worktrees/"," を追加してworktreeの作業ディレクトリがgitのノイズにならないようにした",[33,285,287],{"id":286},"gitignore追加が2回必要だった理由",".gitignore追加が2回必要だった理由",[15,289,290,291,293],{},"別セッションのClaude Codeが同時に ",[19,292,278],{}," を編集しており、最初の追加がコンフリクトで消えた。2回目の追加で定着。複数のClaude Codeセッションが同じリポジトリで動くと、こういう競合が起きる。",[28,295,297],{"id":296},"_4-github-prレビュー","4. GitHub PRレビュー",[33,299,301],{"id":300},"devcontainerでの-gh-auth-login-設定","devcontainerでの gh auth login 設定",[15,303,304,305,308,309,312],{},"devcontainer環境で ",[19,306,307],{},"gh"," コマンドを使うために認証を設定した。",[19,310,311],{},"gh auth login"," でブラウザ認証フローを実行し、devcontainer内からPRの操作ができるようになった。",[33,314,316],{"id":315},"pr-1-のレビュー","PR #1 のレビュー",[15,318,319],{},"マージ済みのPR #1の内容をレビューした。変更差分を確認し、マージ後の状態に問題がないことを確認。",[28,321,322],{"id":322},"振り返り",[15,324,325,326,328],{},"朝の ",[19,327,122],{}," コマンドの出力を二度見したところから始まった1日だった。TZ問題、VOICEVOX起動失敗、worktreeの残骸、PRレビュー環境の整備。どれも「動いているはず」と思い込んでいたものが、実は壊れていた。",[15,330,331,332,334],{},"特にTZ問題は、エラーを吐かずに間違った結果を返す類のバグで、ログを眺めているだけでは見つからない。",[19,333,122],{}," の出力を手で叩いて目視した瞬間に気づけた。「自動化したら信じない。手で確認する」を、もう一つの道具として手元に置いておく。",[336,337,338],"style",{},"html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":56,"searchDepth":70,"depth":70,"links":340},[341,346,351,355,359],{"id":30,"depth":70,"text":31,"children":342},[343,344,345],{"id":35,"depth":87,"text":36},{"id":115,"depth":87,"text":116},{"id":142,"depth":87,"text":143},{"id":165,"depth":70,"text":166,"children":347},[348,349,350],{"id":169,"depth":87,"text":170},{"id":176,"depth":87,"text":177},{"id":194,"depth":87,"text":195},{"id":246,"depth":70,"text":247,"children":352},[353,354],{"id":253,"depth":87,"text":253},{"id":286,"depth":87,"text":287},{"id":296,"depth":70,"text":297,"children":356},[357,358],{"id":300,"depth":87,"text":301},{"id":315,"depth":87,"text":316},{"id":322,"depth":70,"text":322},"dev","TZ=Asia/TokyoがWindows Git Bashで無視される問題の調査と修正、VOICEVOX音声リレーサーバーの自動起動失敗の原因特定、worktree整理とGitHub PRレビューの記録。","md",{},"/dev-env-improvements-2026-03-22","claude-code-tools",false,"2026-03-22T00:00:00.000Z",{"title":5,"description":361},"2026-03/2026-03-22/dev-environment-improvements",[371,372,373,374,375,376,377],"Windows","Git Bash","タイムゾーン","VOICEVOX","worktree","開発環境","Claude Code","memo",null,"7VOS6rgrEFWNmwZDswy1XHddIMV_ySsCibsI3aivoyA",[],"https://log.eurekapu.com/favicon.svg",1778379975955]