いつまで続くか不安であった灼熱の夏。9月初旬の週末は台風の影響もあって日中も24.1℃。
青色で表示された清涼感が氷上の冷酷な気温に見えるくらい寒いというなんとも極端な24時間だった。しかるに本日はまたジワジワと上がり始めている。極端な変化は、体によくない。くれぐれも体調管理に気をつけたいところだ。

数値に対する感覚とは曖昧なものだ。欲していた青色表示がこれほどまでに寒く感じるとは。昼夜問わず30℃以上にならされてきた自分の体がうまく対応していない。3月というとみんな暖かいイメージを持つが実際は年間で考えると寒い方に区分されるという話をラジオで聞いたことがある。イメージと異なりぜんぜん寒いという話だ。過去のイメージや曖昧なイメージが現実と乖離してくると、思わぬ痛手を負う。思い込みと実際のデータが乖離しているというエピソードだ。

時間の感覚も実に曖昧だ。
前回、5分更新と時刻表示を追加した気温取得Powershellスクリプトであるが、いつ更新されるか気になってしまう。時間が表示されているから時計を見れば逆算できるのであるが、細かいデスクトップでの作業をしていると腕時計やPCの時計を見るのもノイズに感じる。
○API情報の更新にカウントダウン機能を追加する

いつ気温が更新されるのか?と曖昧な時間を過ごすうちにカウントダウンタイマーを追加したい。ふとそう思った。デスクトップの一角に表示させている気温情報。次の表示がいつかを知らせるにはこれがいい。ループを使うのはわかるが、画面が下に広がってしまう・・・・

while ($true) {
$apiKey = $env:OPENWEATHER_API_KEY

# 文京区(おおよその緯度経度)
$lat = 35.717
$lon = 139.753

$uri = "https://api.openweathermap.org/data/2.5/weather?lat=$lat&lon=$lon&appid=$apiKey&units=metric&lang=ja"

$res = Invoke-RestMethod -Uri $uri -Method Get -ErrorAction Stop
$date = Get-Date
$temp = [double]$res.main.temp
$color = if ($temp -ge 38) { 'Red' }
elseif ($temp -ge 33) { 'Yellow' }
elseif ($temp -le 32) { 'Blue' }
else { 'White' }

$msg = ('東京都文京区の現在の気温: {0:N1}°C' -f $temp)
Write-Host $date $msg -ForegroundColor $color
$log = "$msg $date"
Out-File -FilePath "log.txt" -Append -InputObject $log

for ($i = 300; $i -gt 0; $i--) {
Write-Host "次の更新まで: $i 秒"
Start-Sleep -Seconds 1
}
}

これでは逆に気が散ってしまうので駄目である。何か他の方法は無いのか?Copilotに聞いてみたところその答えがWrite-Host "`r" -NoNewlineだ。

while ($true) {
$apiKey = $env:OPENWEATHER_API_KEY

# 文京区(おおよその緯度経度)
$lat = 35.717
$lon = 139.753

$uri = "https://api.openweathermap.org/data/2.5/weather?lat=$lat&lon=$lon&appid=$apiKey&units=metric&lang=ja"
$res = Invoke-RestMethod -Uri $uri -Method Get

$date = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$temp = [double]$res.main.temp

$color = switch ($temp) {
{ $_ -ge 38 } { 'Red'; break }
{ $_ -ge 33 } { 'Yellow'; break }
{ $_ -le 32 } { 'Blue'; break }
default { 'White' }
}

$msg = "東京都文京区の現在の気温: {0:N1}°C" -f $temp
Write-Host "$date $msg" -ForegroundColor $color

$log = "$date $msg"
Out-File -FilePath "log.txt" -Append -InputObject $log

for ($i = 300; $i -gt 0; $i--) {
Write-Host "`r次の更新まで: $i 秒 " -NoNewline
Start-Sleep -Seconds 1
}

Write-Host "`r更新中... "
}

.
編集部おすすめ