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を処理した。
作業内容
- 各worktreeの変更内容をmasterにマージ
- マージ後、ブランチを削除
- 2026-03-21の記事を月別ディレクトリ構造(
content/2026-03/2026-03-21/)に統合 - 不要になったスクリーンショットを削除
.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 の出力を手で叩いて目視した瞬間に気づけた。「自動化したら信じない。手で確認する」を、もう一つの道具として手元に置いておく。