いつまで続くか不安であった灼熱の夏。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
        }
}
  • 5分間下がり続けるカウントダウン・・・

    5分間下がり続けるカウントダウン・・・

これでは逆に気が散ってしまうので駄目である。何か他の方法は無いのか?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更新中...                    "
}
  • 意図通りの形に改行せずにそのままの場所でカウントダウン

    意図通りの形に改行せずにそのままの場所でカウントダウン

追加したのは最後の方のfor文以下ということになる。

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

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

Microsoftの公式リファレンスのWrite-Hostコマンドレットをあたると、-NoNewlineパラメーターが改行せずにコンソールに書き出すオプションであることが示されている。`rは、キャリッジリターンの特殊文字でPowerShellのエスケープ文字である`(バッククォート)とrで構成されており、カーソルを行頭に戻す役割を担う。同じ場所にカウントダウンを表示させるという機能でコンソールプログラミングではよく使われる機能とのこと。最後のWrite-Hostでは、カウントの表示が残るのを上書きしている。

それにしても、またジワジワ温度が上がっている。カウントダウンされる気温情報に注意を払いながら、必要な行動をとることにしよう。体調が悪くなりそうになるほど寒いと感じた先週末の青色表示の気温がすでに懐かしい。記憶は曖昧だ。