Mind Webアプリケーション(CGI)で天気概況を取得して表示

# はじめに
能登半島地震の被災者の皆様には心よりお見舞い申し上げます。
冬真っ盛りで天気が気になる今日この頃ですので、気象庁からjsonデータを取得して、天気概況を表示するプログラムを書いてみました。

実行環境はこちらを参照して下さい。

https://qiita.com/Mind-Club_2017/items/0fdad646aff08a87618d

ライブラリはこちらを参照して下さい。

https://qiita.com/Mind-Club_2017/items/25fb93b8504a67125dff

# 気象庁からjsonデータを取得

例えば東京都のデータを取得するには以下です。

https://www.jma.go.jp/bosai/forecast/data/forecast/130000.json

ファイル名の数字130000がエリアコードを示しています。

jsonデータを取得するには、JavaScriptを使う方法や、curlコマンドを使う方法がありますが、今回は後者で行きます。

\>curl https://www.jma.go.jp/bosai/forecast/data/overview_forecast/ **エリアコード** .json > weather_UTF8.json

# 文字コード UTF-8 を Shift-JIS に変換

srclibフォルダ上のunidecode.src をコンパイルします。
次の2つのファイルを実行フォルダpmindにコピーして下さい。

**uni-euc-decode.bin**
**uni-sjis-decode.bin**

# プログラム

```Mind:cgi-weather.src
※タイトル	気象庁からJSONデータをダウンロードして天気概況を表示する
※リンク	    cgilib
※作成日	    2024/01/16
※改定記録	排他制御を追加

"srclib\unidecode"を、コンパイルする。		※←注目！
"htmlform.src"を、コンパイルする。

成功？とは、真？と、等価。
失敗？とは、偽？と、等価。

JSONファイルは、ファイル。
JSONファイル名は、"weather.json"。
JSONデータは、文字列実体、長さ、８１９２バイト。
作業文字列は、文字列実体、長さ、８１９２バイト。
子プロセス実行文字列は、文字列実体、長さ、１０２４バイト。

気象台名は、文字列実体。
発表日時は、文字列実体。
エリア名は、文字列実体。
天気概況は、文字列実体、長さ、８１９２バイト。

都道府県名とは
	「都道府県名」の、その値。

都道府県リストボックス表示とは
	「都道府県名」、１０行表示、０単数選択で、リストボックス作成開始し
		「011000」、０、「北海道　宗谷地方」で、リストボックス項目設定し
		「012000」、０、「北海道　上川・留萌地方」で、リストボックス項目設定し
		「016000」、０、「北海道　石狩・空知・後志地方」で、リストボックス項目設定し
		「013000」、０、「北海道　網走・北見・紋別地方」で、リストボックス項目設定し
		「014100」、０、「北海道　釧路・根室地方」で、リストボックス項目設定し
		「015000」、０、「北海道　胆振・日高地方」で、リストボックス項目設定し
		「017000」、０、「北海道　渡島・檜山地方」で、リストボックス項目設定し
		「020000」、０、「青森県」で、リストボックス項目設定し
		「050000」、０、「秋田県」で、リストボックス項目設定し
		「030000」、０、「岩手県」で、リストボックス項目設定し
		「040000」、０、「宮城県」で、リストボックス項目設定し
		「060000」、０、「山形県」で、リストボックス項目設定し
		「070000」、０、「福島県」で、リストボックス項目設定し
		「080000」、０、「茨城県」で、リストボックス項目設定し
		「090000」、０、「栃木県」で、リストボックス項目設定し
		「100000」、０、「群馬県」で、リストボックス項目設定し
		「110000」、０、「埼玉県」で、リストボックス項目設定し
		「130000」、１、「東京都」で、リストボックス項目設定し
		「120000」、０、「千葉県」で、リストボックス項目設定し
		「140000」、０、「神奈川県」で、リストボックス項目設定し
		「200000」、０、「長野県」で、リストボックス項目設定し
		「190000」、０、「山梨県」で、リストボックス項目設定し
		「220000」、０、「静岡県」で、リストボックス項目設定し
		「230000」、０、「愛知県」で、リストボックス項目設定し
		「210000」、０、「岐阜県」で、リストボックス項目設定し
		「240000」、０、「三重県」で、リストボックス項目設定し
		「150000」、０、「新潟県」で、リストボックス項目設定し
		「160000」、０、「富山県」で、リストボックス項目設定し
		「170000」、０、「石川県」で、リストボックス項目設定し
		「180000」、０、「福井県」で、リストボックス項目設定し
		「250000」、０、「滋賀県」で、リストボックス項目設定し
		「260000」、０、「京都府」で、リストボックス項目設定し
		「270000」、０、「大阪府」で、リストボックス項目設定し
		「280000」、０、「兵庫県」で、リストボックス項目設定し
		「290000」、０、「奈良県」で、リストボックス項目設定し
		「300000」、０、「和歌山県」で、リストボックス項目設定し
		「330000」、０、「岡山県」で、リストボックス項目設定し
		「340000」、０、「広島県」で、リストボックス項目設定し
		「320000」、０、「島根県」で、リストボックス項目設定し
		「310000」、０、「鳥取県」で、リストボックス項目設定し
		「360000」、０、「徳島県」で、リストボックス項目設定し
		「370000」、０、「香川県」で、リストボックス項目設定し
		「380000」、０、「愛媛県」で、リストボックス項目設定し
		「390000」、０、「高知県」で、リストボックス項目設定し
		「350000」、０、「山口県」で、リストボックス項目設定し
		「400000」、０、「福岡県」で、リストボックス項目設定し
		「440000」、０、「大分県」で、リストボックス項目設定し
		「420000」、０、「長崎県」で、リストボックス項目設定し
		「410000」、０、「佐賀県」で、リストボックス項目設定し
		「430000」、０、「熊本県」で、リストボックス項目設定し
		「450000」、０、「宮崎県」で、リストボックス項目設定し
		「460100」、０、「鹿児島県」で、リストボックス項目設定し
		「471000」、０、「沖縄県　本島地方」で、リストボックス項目設定し
		「472000」、０、「沖縄県　大東島地方」で、リストボックス項目設定し
		「473000」、０、「沖縄県　宮古島地方」で、リストボックス項目設定し
		「474000」、０、「沖縄県　八重山地方」で、リストボックス項目設定し
	リストボックス作成終了する。

気象データ取得とは
		ここから
			JSONファイル名が、ファイル有り？
			ならば
				一秒待つ	※排他制御（他の誰かが使っている）
			さもなければ
				打ち切り
			つぎに
		繰り返す
		「cmd /c curl https://www.jma.go.jp/bosai/forecast/data/overview_forecast/」と
		都道府県名を、合成したものを、子プロセス実行文字列に、入れる
		「.json  > 」を、子プロセス実行文字列に、追加し
		JSONファイル名を、子プロセス実行文字列に、追加する
		子プロセス実行文字列で、子プロセス実行する。

気象データ加工とは
			分断位置は、変数
		Unicodeデコードテーブルを読み出しし、失敗？
		ならば
			重大エラー
		つぎに

		JSONファイルを、JSONファイル名で、オープンし
			JSONファイルから、一行読み出し、作業文字列に、入れ
			作業文字列を、ＵＴＦ８→ＳＪＩＳ変換し、JSONデータに、入れる
		JSONファイルを、クローズする
		JSONファイル名を、ファイル削除する
		
		JSONデータから、','を、一文字検索したところで、JSONデータを、分断し、気象台名に、入れる
		JSONデータから、','を、一文字検索したところで、JSONデータを、分断し、発表日時に、入れる
		JSONデータから、','を、一文字検索したところで、JSONデータを、分断し、エリア名に、入れる
		JSONデータを、天気概況に、入れる
		
		「{"publishingOffice":"」の、文字数だけ、気象台名から、切り出し、捨てる
		「"reportDatetime":"」の、文字数だけ、発表日時から、切り出し、捨てる
		「"targetArea":"」の、文字数だけ、エリア名から、切り出し、捨てる
		「"headlineText":"","text":"」の、文字数だけ、天気概況から、切り出し、捨てる
		
		気象台名を、一文字右側削除する
		発表日時を、一文字右側削除する
		エリア名を、一文字右側削除する
		天気概況を、２文字だけ、右側削除する
		
		作業文字列を、クリアする
		ここから
			天気概況から、「\n」を、検索し、真？
			ならば
				天気概況から、「\n」を、検索したところで、天気概況を、分断し、作業文字列に、追加する
				作業文字列に、「<br>」を、追加する
				天気概況から、一文字切り出し、捨てる
				天気概況から、２文字、取り出したものが、「\n」と、等しい文字列
				ならば
					天気概況から、２文字、切り出し、捨てる
				つぎに
			さもなければ
				天気概況を、作業文字列に、追加し
				打ち切り
			つぎに
		繰り返す
		作業文字列を、天気概況に、入れる
		スタック検査する。

気象データ表示とは
		「項目」、「データ」、２列で、表の見出しを作成する
		「気象台名」、気象台名、２列で、左寄せで表のデータを作成する
		「発表日時」、発表日時、２列で、左寄せで表のデータを作成する
		「エリア名」、エリア名、２列で、左寄せで表のデータを作成する
		「天気概況」、天気概況、２列で、左寄せで表のデータを作成する
		表の作成を終了する。

メインは
	メインの前処理する
		私のプログラム名・短縮を、中で一行表示
		都道府県リストボックス表示する
		「データ取得」で、送信ボタン作成し、ここで改行
		「データ取得」が、名前有り？
		ならば
			気象データ取得する
			気象データ加工する
			気象データ表示する
		つぎに
	メインの後処理すること。
```
:::note
排他制御の処理を入れました。
プログラムは別スレッドで動作しますが、ファイル、"weather.json"が共通ですので排他制御が必要です。
:::


# 実行結果
![shot_240116_203445.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174456/6b91c5ec-2a67-e133-1676-50a8c68cd834.jpeg)

# おわりに
都道府県の選択ではリストボックスフォームの上でマウスホイールをクルクルすると選択が容易です。
どれか一つを選ぶフォームでは▼ドロップダウンリストボックスを使う事が多いと思いますが、画面に余裕がある時には、リストボックスの方が選択枝の見通しが良くなります。