• #Windows
  • #Git Bash
  • #タイムゾーン
  • #VOICEVOX
  • #worktree
  • #開発環境
  • #Claude Code
開発claude-code-toolsメモ

Windows Git Bashのタイムゾーン罠とVOICEVOX自動起動修正

朝、make-diaryコマンドを叩いたら、生成された日記のヘッダに見覚えのない日付が並んでいた。ターミナルで TZ=Asia/Tokyo date を打ち直しても、返ってくるのはGMT。そこから半日かけて、開発環境のあちこちに溜まっていた不具合を片付けた。

1. make-diaryコマンドのタイムゾーン修正

症状: TZ=Asia/Tokyo が効かない

make-diaryの日付生成で TZ=Asia/Tokyo date +%Y-%m-%d を使っていた。Linux環境(Docker含む)では正しくJSTを返すが、Windows Git Bashでは TZ=Asia/Tokyo が無視され、GMTにフォールバックしてUTC時刻を返してしまう。

# Windows Git Bash で実行
$ TZ=Asia/Tokyo date +%Y-%m-%d
# → GMTベースの日付が返る(期待と異なる)

$ date +%Y-%m-%d
# → Windowsのシステムクロック(JST)に基づく正しい日付

調査: なぜ効かないのか

Git Bash(MSYS2)の date コマンドは、Linuxの /usr/share/zoneinfo/ を参照しない。TZ 環境変数に Asia/Tokyo のようなOlsenタイムゾーン名を渡しても解決できず、GMTにフォールバックする。POSIX形式(TZ=JST-9)なら効くが、そもそもWindowsのシステムクロックが既にJSTで動いている。

修正: TZ指定を削除

Windowsのシステムクロックは既にJSTに設定されている。つまり素の date コマンドで正しい日本時間が取れる。Docker環境とWindows環境で分岐していた処理を整理し、Windows側では TZ=Asia/Tokyo 指定を削除した。

学び: Linux向けに書いたシェルスクリプトをWindowsに持ってくると、「動くが結果が違う」パターンに嵌まる。エラーが出ないぶん気づきにくい。date コマンドの出力を目で確認する習慣をつけた。

2. VOICEVOX音声リレーサーバーの自動起動修正

症状: PC起動後にポート50055が開かない

Claude Codeの応答をVOICEVOXで読み上げる音声リレーサーバー(ポート50055)が、PC起動時に自動起動しなくなっていた。手動で起動すれば動く。

原因: pythonw のPATH解決失敗

スタートアップに登録していたショートカットが start pythonw relay_server.py を実行していた。通常のターミナルセッションでは pythonw にPATHが通っているが、Windowsのスタートアップ環境ではPATHの展開タイミングが異なり、pythonw が見つからずサイレントに失敗していた。

修正: start /b python に変更

:: Before(スタートアップ環境でPATH解決に失敗)
start pythonw relay_server.py

:: After(確実に起動する)
start /b python relay_server.py

pythonw(コンソールウィンドウなしで実行)の代わりに start /b python(バックグラウンドで実行)に切り替えた。python はスタートアップ環境でもPATHが通っており、start /b でコンソールウィンドウの表示を抑制できる。

3. worktreeの整理

残留していた2つのworktreeを処理した。

作業内容

  1. 各worktreeの変更内容をmasterにマージ
  2. マージ後、ブランチを削除
  3. 2026-03-21の記事を月別ディレクトリ構造(content/2026-03/2026-03-21/)に統合
  4. 不要になったスクリーンショットを削除
  5. .gitignore.claude/worktrees/ を追加してworktreeの作業ディレクトリがgitのノイズにならないようにした

.gitignore追加が2回必要だった理由

別セッションのClaude Codeが同時に .gitignore を編集しており、最初の追加がコンフリクトで消えた。2回目の追加で定着。複数のClaude Codeセッションが同じリポジトリで動くと、こういう競合が起きる。

4. GitHub PRレビュー

devcontainerでの gh auth login 設定

devcontainer環境で gh コマンドを使うために認証を設定した。gh auth login でブラウザ認証フローを実行し、devcontainer内からPRの操作ができるようになった。

PR #1 のレビュー

マージ済みのPR #1の内容をレビューした。変更差分を確認し、マージ後の状態に問題がないことを確認。

振り返り

朝の date コマンドの出力を二度見したところから始まった1日だった。TZ問題、VOICEVOX起動失敗、worktreeの残骸、PRレビュー環境の整備。どれも「動いているはず」と思い込んでいたものが、実は壊れていた。

特にTZ問題は、エラーを吐かずに間違った結果を返す類のバグで、ログを眺めているだけでは見つからない。date の出力を手で叩いて目視した瞬間に気づけた。「自動化したら信じない。手で確認する」を、もう一つの道具として手元に置いておく。