Open13
Rust で天気予報正答率比較サイト作る
要件定義
- 天気予報の正答率を記録 & 表示したい
- 気象庁の過去データを正とする
- 他サイトとの比較も行う
- 天気(Must)、気温、湿度など
- 予想日時が伸びるにつれて正答率がどのくらい変化するかも調べたい
- サイトの公開/非公開:非公開
- 他のサイトとの比較をしたいため、その時著作権に引っかかるのであくまでも私的利用とする
技術選定
- 言語:Rust
- API: GraphQL
- アーキテクチャーパターン:CQRS + Clean Architecture
- サーバー:Cloud Run
graphql ってどうやって設計するんだ?
これよくできてる
過去の気象データ
このリクエストでJSONデータを取得できる
curl 'https://www.data.jma.go.jp/gmd/risk/obsdl/show/table.html' \
-H 'Accept: text/html, */*; q=0.01' \
-H 'Accept-Language: ja,en-US;q=0.9,en;q=0.8,jv;q=0.7' \
-H 'Connection: keep-alive' \
-H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \
-H 'Cookie: AWSALB=+XfkRzeU4WCNn5fHYOpAhNWlkjGJoOIoLcZbvzH8YX0Xwp8kvofDm99R18enskL5oQA0IhORMXbNTw2NkFw+d4VtZnNX2lKo0223rw4pocKlNQIwLLc5j59GbfS9; AWSALBCORS=+XfkRzeU4WCNn5fHYOpAhNWlkjGJoOIoLcZbvzH8YX0Xwp8kvofDm99R18enskL5oQA0IhORMXbNTw2NkFw+d4VtZnNX2lKo0223rw4pocKlNQIwLLc5j59GbfS9' \
-H 'Origin: https://www.data.jma.go.jp' \
-H 'Referer: https://www.data.jma.go.jp/risk/obsdl/index.php' \
-H 'Sec-Fetch-Dest: empty' \
-H 'Sec-Fetch-Mode: cors' \
-H 'Sec-Fetch-Site: same-origin' \
-H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36' \
-H 'X-Requested-With: XMLHttpRequest' \
-H 'sec-ch-ua: "Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-ch-ua-platform: "Linux"' \
--data-raw 'stationNumList=%5B%22s47662%22%5D&aggrgPeriod=9&elementNumList=%5B%5B%22703%22%2C%22%22%5D%2C%5B%22201%22%2C%22%22%5D%5D&interAnnualFlag=1&ymdList=%5B%222024%22%2C%222024%22%2C%2210%22%2C%2210%22%2C%2229%22%2C%2230%22%5D&optionNumList=%5B%5D&rmkFlag=1&disconnectFlag=1&kijiFlag=0&huukouFlag=0&youbiFlag=0&fukenFlag=0&jikantaiFlag=1&jikantaiList=%5B1%2C24%5D&PHPSESSID=a436q0otl6omcndji1je4pqj83'
これ、リクエストパラメータにCSRFのための PHPSESSID が入ってて単純な curl だと厳しそうだな、、、
https://www.data.jma.go.jp/risk/obsdl/index.php#!table にアクセスして取得した session id で
https://www.data.jma.go.jp/gmd/risk/obsdl/show/table.html にリクエストすると良さそう
このサイトええやん
python でスクレイピングがやっぱ楽か
デプロイ先に shuttle いいかなと思ったけど、ファーストデプロイに5分くらいかかったな、、こんなもんか?
api gw + lambda でやってみるか
cloud run にしてみよう。コンテナサービスバンザイ(aws でも fargete + ecs でできるかもしれんけどたかそうなので一旦やめる)
とりあえず ¥1 で予算アラート設定しといた
そのまま進めるだけで結構簡単にデプロイできた
supabase, s3 に csv おいて duckdb でもええやん感が出てきてわかんなくなってきたので一旦クライアント側を作る
react でいい感じに棒グラフを作れるものを探す
適当にいくつか出して npm trends でみてみたけど chartjs でよさそうだな
npm trends 自体 chartjs だし