東京の文京区は、時折雨も降るジメジメした天気。気温はそこまで高くないものの亜熱帯のような湿度がある日だが、インターネットを通じて世界の情報を知ることができる。国際的な文字コード規格ユニコードを策定するThe Unicode Consortiumbの最新版となる「Unicode 17.0」の正式リリースを知った。

世界中の文字に一意の番号を割り当てるユニコード。異なるプラットフォームでの互換性を担保し、コンピューターの世界では欠かせない仕様を提供している。いまやコミュニケーションの世界でも欠かせない共通仕様のemoji(絵文字)の数々も発表されている。今後、各プラットフォームの対応により新しく加わるであろう絵文字はこちら(Unicode Emoji Subcommittee 委員長 Jennifer Daniel氏ブログ)で紹介されているが、各ブラウザやソフトウェアも対応してくれば、😃(U+1F603)のようにコピペでも表示できるようになる。最新版の「Unicode 17.0」では1918個だ。

APIからの気象状況をPowerShellと絵文字で表示

灼熱極まる今夏の状況にAPIからPowerShellに気温を取得し、カスタマイズする日々を送る筆者であったが、このニュースを目にし、ふと

気象状況を絵文字で表示できないか?

そう考えた。OpenWeatherでは気象情報に対応するアイコンコードが細かく指定されており、レスポンスで返るJSONには以下のように気象状況と連動するiconやidが入っている。

"weather": [
    {
      "id": 500,
      "main": "Rain",
      "description": "小雨",
      "icon": "10d"
    }

ので、これに対応する$iconCodeを加えて、10dに該当する部分を$res.weather[0].iconで取得し、対応する絵文字を連想配列でカバーできそうな範囲で用意しておく。さきほど紹介したUnicodeのフルリストのsky & weatherのBrowserからテキストへコピペで絵文字は作れる。

    $iconMap = @{
        "01d" = "☀"
        "01n" = "🌙"
        "02d" = "🌤"
        "02n" = "🌥"
        "03d" = "☁"
        "03n" = "☁"
        "04d" = "☁"
        "04n" = "☁"
        "09d" = "🌧"
        "09n" = "🌧"
        "10d" = "🌦"
        "10n" = "🌦"
        "11d" = "🌩"
        "11n" = "🌩"
        "13d" = "❄"
        "13n" = "❄"
        "50d" = "🌫"
        "50n" = "🌫"
}

連想配列から$emoji = $iconMap[$iconCode]で絵文字を取得し、表示文字列を格納している$msgに以下のように加える。$emojiを温度の後の( )のなかで表示させる。

$msg = "東京都文京区の現在の気温: {0:N1}°C({1} )" -f $temp, $emoji

コードを実行すると、曇天の気象状況を表す☁マークがPowerShell上で表示されている。

カスタマイズしたコードは以下のようになる。

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
    $iconCode = $res.weather[0].icon

    $iconMap = @{
        "01d" = "☀"
        "01n" = "🌙"
        "02d" = "🌤"
        "02n" = "🌥"
        "03d" = "☁"
        "03n" = "☁"
        "04d" = "☁"
        "04n" = "☁"
        "09d" = "🌧"
        "09n" = "🌧"
        "10d" = "🌦"
        "10n" = "🌦"
        "11d" = "🌩"
        "11n" = "🌩"
        "13d" = "❄"
        "13n" = "❄"
        "50d" = "🌫"
        "50n" = "🌫"
}
    $emoji = $iconMap[$iconCode]
    $color = switch ($temp) {
        { $_ -ge 38 } { 'Red'; break }
        { $_ -ge 33 } { 'Yellow'; break }
        { $_ -le 32 } { 'Blue'; break }
        default       { 'White' }
    }

    $msg = "東京都文京区の現在の気温: {0:N1}°C({1} )" -f $temp, $emoji
    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更新中...                    "
}

絵文字を搭載するといっそうカスタマイズ感がでるし、やはり「絵」は瞬時で把握できるので少々手間がかかるが、やりがいがある。NTTドコモの「iモード」に端を発するコンピューター上での絵文字(emoji)文化は、2009年にUnicode 6.0で採用され世界に広がり続けている。