Common Lispで天気予報スクリプトを作ってみた〜気象庁編〜

# はじめに
なんかどこかで見た事あるよなタイトルだよな？
と思った方。鋭いです笑

ちょうど去年のアドベントカレンダーで@fireflower0さんのこのような記事があります。

https://qiita.com/fireflower0/items/245ab351d05c2c25996e

なんだ去年と同じ内容か。と思った方、ちょっと待って下さい。

上記の記事は[OpenWeatherMap](https://openweathermap.org/)という
海外のサイトのAPIを使ってますが、今回の大きな特徴は
日本の気象庁のデータを活用しているという点です。
税金投入されてますから、皆さんも活用しましょう！

今年の２月、気象庁から非公式APIといいましょうか、
jsonデータが活用出来るようになりました。
（以下勝手に非公式APIと呼ぶ事にする。）

平成２８年の官民データ活用推進基本法で、国及び地方公共団体がオープンデータに取り組んで
いく事が義務付けられ、その流れを受けたものだと思います。

この非公式APIについてはpythonなど他の言語で既にやっている方が何人かおられましたが、
[common-lispと気象庁](https://www.google.com/search?channel=fs&client=ubuntu&q=common-lisp+%E6%B0%97%E8%B1%A1%E5%BA%81)で検索してもこの組み合わせでは
見つからなかったので、この記事が**世界初**となるかもしれません笑
（ご存知の方いらっしゃったら教えて下さい。）

# 作ったもの
前段が長くなってしまいましたが、今回作ったものは以下の通りです。
簡易な天気予報をコマンドラインに表示するスクリプトです。

https://github.com/biofermin2/meteo

改めて@fireflower0さんのサイトを見るとjonathanでS式にparseする際、
:as :alistオプションをつければ良かったんだと気付きましたが、
それを知らずに作ってたので、自分で以下のライブラリも作りました(^_^;)
（知ってたらまた違うアプローチの仕方をしてたと思います。）
→後日assoc-utilsなどを使う方法を試してみたら、
うまく行きませんでした。気象庁のjsonデータは少し特殊なのかもしれません。

https://github.com/biofermin2/unio

meteo内ではこのunioという自作ライブラリも使っています
grepではキーワードを含む行だけを抽出しますが、
unioはキーワードを含むS式を抽出します。
またその際、ネストの深さを選択して抽出する事も出来ます。

気象庁のjsonデータはここで披露するには憚られるほど、
大量に各種データが入ってます。当初それを虱潰しに何のデータがどこに
書かれているのかjsonデータの構造を調べたりもしましたが、
自分が見たかったデータは数日間の自分の住んでいる地域の天気予報が
見たかっただけなので、ほしいデータをピックアップしたら以下の２点でした。
・お天気マーク
・天気予報
~~あとは、天気図と衛星画像データがあればいいなと思ったのですが、
それはちょっと後回しにしました。~~　→機能追加しました。

という事で当初ターミナルのコマンドラインにコマンドを打てば、
サクッと表示されるものを作りたいなと思ってました。
イメージとしてはこんな感じでした。

```shell
$ <command> <area>[enter]
<weather forcast data>
```

で、出来たのが以下の通りでした。

```shell
❯ meteo 輪島市
((☔☁ . 雨 時々 くもり 所により 夕方 まで 雷 を伴う) (☁→☼ . くもり 昼過ぎ から 晴れ) (☁ . くもり))
```
lispらしくconsセルです！alistってやつです！テンションあがりますねぇ！
zshの設定ファイルに突っ込んであるので、個人的にはcommand打つ必要もなく
自動表示されるようにしてます。調べに行ってた無駄な時間がこれで
少しは省く事が出来ました。

お天気マークは機種依存文字というものを使っているので、うまく表示されない
場合がありますが、フォントを変更すれば見れるようになるかと思います。

上記のデータのサイト側の表示は以下の通りです。
![3daystenki.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14730/1115c19a-8208-b208-e18d-5f22a4f1021d.png)

ちゃんとお天気マークもサイト側と合ってますね！

サイトに表示されているようにもっと詳細のデータがほしいという場合の
使い方などはオプション指定できます。生のS式データが追加表示されます。
詳細はreadmeに書いておきましたので、そちらをご参照下さい。

# 実行環境
筆者の環境はlubuntu20.04で、
処理系はSBCL 2.0.1.debianです。
roswell scriptなので、roswellも必須です。

~~rosスクリプトはbuildも出来るんですが、
なぜかbuildで生成した実行ファイルはデータがビルド時の
データのまま更新されなかったので、rosスクリプトを
直接実行するようにリンクを設定して下さい。~~

~~という事で、macはおそらく大丈夫だと思いますが、
windowsの場合はWSL2でお好きなlinuxを入れるなりしてお使い下さい。~~

@t-sin さんのアドバイスを受けて、ソースコード修正し、上記の
文章を訂正させて頂きました。ありがとうございました！
明日表示がちゃんと変わっていれば成功です笑[2021-12-04 19:44:26]
←無事確認取れました！成功です！[2021-12-05 10:30:14]

roswellはbuildも出来るので、

```shell
$ ros build meteo.ros
```

と実行すれば、meteoと言う実行ファイルが出来ます。
windows環境でも多分exeファイルが出来るかと思います。
そちらにパスを通してもらっても実行速度がアップしていいかと思います。

参考：
実行ファイル  0.21s user 0.04s system 11% cpu 2.141 total
ソースファイル 0.84s user 0.12s system 49% cpu 1.930 total
あれ？なぜtotalがでかくなっているんだろう？？
ただ、体感としてはやはり実行ファイルの方が早く感じます。

# 最後に
気象庁の非公式APIのURLは下記の通りです。

天気予報（明後日まで・週間）
https://www.jma.go.jp/bosai/forecast/data/overview_week/(pathCode).json
天気概況（明後日まで）
https://www.jma.go.jp/bosai/forecast/data/overview_forecast/(pathCode).json
天気概況（週間）
https://www.jma.go.jp/bosai/forecast/data/overview_week/(pathCode).json
	天気図（人間用）
	https://www.jma.go.jp/bosai/weather_map/
	天気図画像ファイル名取得用:
	https://www.jma.go.jp/bosai/weather_map/data/list.json
	データJSON取得URL
	https://www.jma.go.jp/bosai/weather_map/data/png/{天気図画像ファイル名}
	天気予報
	データJSON取得URL
	https://www.jma.go.jp/bosai/forecast/data/forecast/{エリアコード(offices)}.json
	エリア情報のJSONデータ
	https://www.jma.go.jp/bosai/common/const/area.json
	各地点の位置および名称
	https://www.jma.go.jp/bosai/amedas/const/amedastable.json
	各要素の名称
	https://www.jma.go.jp/bosai/const/selectorinfos/amedas.json
	ナウキャスト実況
	https://www.jma.go.jp/bosai/jmatile/data/nowc/targetTimes_N1.json
	ナウキャスト予測
	https://www.jma.go.jp/bosai/jmatile/data/nowc/targetTimes_N2.json
	ナウキャスト画像URI構造
	https://www.jma.go.jp/bosai/jmatile/data/nowc/{basetime}/none/{validtime}/surf/hrpns/{z}/{x}/{y}.png
	アメダス最新時刻
	https://www.jma.go.jp/bosai/amedas/data/latest_time.txt
https://www.jma.go.jp/bosai/amedas/data/map/{latest_time}.json
	アメダス地点系
	https://www.jma.go.jp/bosai/amedas/data/point/{stnid}/{yyyymmdd}_{h3}.json
	アメダス人間用URL
	https://www.jma.go.jp/bosai/map.html#9/35.747/139.922/&elem=temp&contents=amedas&interval=60

また参考にさせていただきました
@michan06 様
https://qiita.com/michan06/items/48503631dd30275288f7
@e_toyoda 様
https://qiita.com/e_toyoda/items/7a293313a725c4d306c0

@izutorishima 様のtweet

など気象庁の非公式APIに関する情報を提供して下さった
皆様にこの場を借りてお礼を申し上げます。

qiita初投稿が初アドベントカレンダー投稿にもなり、
またプロのエンジニアでもないため、
いろいろ不足の点、お見苦しい点あったかもしれませんが、
ご容赦下さい。

畑仕事をしている手前、天気予報がサクッと確認出来るツールがあれば
いいなと思い、開発しました。気象庁のサイトリニューアルに伴い、
新しい技術導入したのはなんとなく垣間見えるのですが、
アクセシビリティの面では動作が重くなるなどどうかなと思う節もあります。

今回のツールではその辺りを補えるものが出来たかと思います。

またcommon lispは今じゃどこの誰も使ってない古い言語で、
lisperなんていう人種は言語処理系ばかり作っているような変態ばかりだ、
括弧ばかりで気持ち悪いというイメージがあるかもしれませんが、
まぁ、いずれも否定はしません笑

ただ、古くても括弧が多くてもごく身近な問題も解決出来る、
そんな実用的なプログラムを書ける言語だと知っていただけたら幸いです。

# あとがき
初投稿という事もあり、四苦八苦しながら書きましたが、
文章を書いている途中で、emacsの癖が出てしまい、
文字列の切り取りのつもりでC-wを押したら
タブがサッと消えてしまい、一瞬何が起きたのか
訳が判らなくなり、事実に気付いてあああああ！！！と
顔が青ざめてしまいました。ただqiitaの機能で
自動保存が効いてたので助かりました(^_^;)
さすが、qiita！技術系載せているだけあって
ナイスサポートでした。
emacsユーザーの方、お気をつけ下さい笑
（自分だけかな？）

# おまけ
[2022-04-25] 簡単な使用例の動画を作ってみました。

https://youtu.be/3dN4PCzqNhQ 

[2021-12-08] 簡単な動作の動画を作って見ました！

日本の県庁所在地の天気

https://youtu.be/HKXgwOKr9Ek

~~なぜか那覇市でえらい時間がかかり、鹿児島市ではエラー。。。
エラー原因調べたいと思います。。。~~[2021-12-08]対応済

日本の村１８３村の天気

https://youtu.be/nnXIM-uey_E

これも５村でエラーがありますね。ちょっと対応しますね。
→[2021-12-08] ４村まで対応済
→[2021-12-12] 残り１村も対応。同名地域の選択を可能にする（応急処置版）

ざっくり作った割には精度はいい方かと。

[2021-12-07] 各種天気図をダウンロード出来るオプションを追加しました！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14730/1c0a5bf6-b4dd-aa88-e766-32626904f62a.png" width="400" height="400">

[2021-12-30] 各種ひまわりの衛星画像もダウンロード出来るオプションを追加！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14730/f0229e7c-f584-f3a8-53a5-2094b2fe26e5.jpeg" width="400">



[2021-12-31] ナウキャスト画像も表示出来るオプションを追加！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14730/44d329dd-d6c6-c60f-a65f-e46353ad473b.png" width="400">

[2021-01-05] ベースマップの切り替えオプションも用意しました。
※ナウキャスト画像については国土地理院の地理院タイル画像を使用しています。