9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-12-04

はじめに

なんかどこかで見た事あるよなタイトルだよな?
と思った方。鋭いです笑

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

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

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

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

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

この非公式APIについてはpythonなど他の言語で既にやっている方が何人かおられましたが、
common-lispと気象庁で検索してもこの組み合わせでは
見つからなかったので、この記事が世界初となるかもしれません笑
(ご存知の方いらっしゃったら教えて下さい。)

作ったもの

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

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

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

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

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

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

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

❯ meteo 輪島市
((☔☁ . 雨 時々 くもり 所により 夕方 まで 雷 を伴う) (☁→☼ . くもり 昼過ぎ から 晴れ) (. くもり))

lispらしくconsセルです!alistってやつです!テンションあがりますねぇ!
zshの設定ファイルに突っ込んであるので、個人的にはcommand打つ必要もなく
自動表示されるようにしてます。調べに行ってた無駄な時間がこれで
少しは省く事が出来ました。

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

上記のデータのサイト側の表示は以下の通りです。
3daystenki.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も出来るので、

$ 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] 簡単な使用例の動画を作ってみました。

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

日本の県庁所在地の天気

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

日本の村183村の天気

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

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

[2021-12-07] 各種天気図をダウンロード出来るオプションを追加しました!

[2021-12-30] 各種ひまわりの衛星画像もダウンロード出来るオプションを追加!

[2021-12-31] ナウキャスト画像も表示出来るオプションを追加!

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

 

9
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?