Code Aquarium

minazoko's blog -*- 水底のブログ -*-

(Clojure)サーバーにやさしい逆引き天気予報

[追記] tenkijp の rss サービスが終わってしまいました。下記プログラムももう使えません。

はじめに

今更感ありますが、天気予報を取得するプログラムを書いてみました。
コードはこちら
データはtenki.jpのこちらから。

ポイント

clojure.core.cache で取得データを5分間保持しサーバー負荷を軽減しています。replなどの起動しっぱなしの実行環境でなければ意味はありませんが。

依存ライブラリ

  :dependencies [[org.clojure/clojure "1.5.1"]
                 [org.clojure/data.zip "0.1.1"]
                 [org.clojure/core.cache "0.6.3"]]

実行例

関東甲信越地方で予報に「雪」が含まれるものを検索。
50 と 77 が地域を表すIDです。report に 50 77 を指定すると、「50,新潟県 下越(新潟)」~「76,山梨県 東部・富士五湖(河口湖)」の間の全地域が検索対象になります。
地域IDの一覧も、コードと一緒にアップしてあります。

tenki.core> (require '[clojure.pprint :refer [pprint]])
nil
tenki.core> (->> (report #"雪" 50 77)
                 (sort-by :forecast)
                 (map (juxt :forecast :city))
                 pprint)
(["18日(火) 曇時々雪 3℃/-1℃" "新潟県 下越(新潟)"]
 ["18日(火) 雪時々止む(雪は時々止む) ---/---" "新潟県 中越(長岡)"]
 ["18日(火) 雪時々止む(雪は時々止む) 3℃/1℃" "新潟県 上越(高田)"]
 ["19日(水) 曇一時雪 3℃/-2℃" "新潟県 上越(高田)"]
 ["19日(水) 雪のち曇 2℃/-2℃" "新潟県 中越(長岡)"]
 ["19日(水) 雪のち曇 3℃/0℃" "新潟県 下越(新潟)"]
 ["21日(金) 曇時々雪 0℃/-5℃" "群馬県 北部(みなかみ)"]
 ["21日(金) 曇時々雪 1℃/-1℃" "新潟県 中越(長岡)"]
 ["21日(金) 曇時々雪 1℃/-1℃" "新潟県 上越(高田)"]
 ["21日(金) 曇時々雪 1℃/-4℃" "長野県 北部(長野)"]
 ["21日(金) 曇時々雪 2℃/-1℃" "新潟県 下越(新潟)"]
 ["21日(金) 曇時々雪 2℃/0℃" "新潟県 佐渡(相川)"]
 ["22日(土) 曇一時雪 3℃/-1℃" "新潟県 下越(新潟)"]
 ["22日(土) 曇一時雪 3℃/-1℃" "新潟県 中越(長岡)"]
 ["22日(土) 曇一時雪 3℃/-1℃" "新潟県 上越(高田)"]
 ["22日(土) 曇一時雪 3℃/-1℃" "新潟県 佐渡(相川)"]
 ["26日(水) 晴一時雪 10℃/2℃" "栃木県 南部(宇都宮)"]
 ["26日(水) 晴一時雪 11℃/-1℃" "栃木県 北部(大田原)"]
 ["26日(水) 晴一時雪(雨の可能性) 10℃/1℃" "群馬県 南部(前橋)"]
 ["26日(水) 晴一時雪(雨の可能性) 8℃/-1℃" "長野県 中部(松本)"]
 ["26日(水) 晴一時雪(雨の可能性) 8℃/0℃" "山梨県 東部・富士五湖(河口湖)"]
 ["26日(水) 晴一時雪(雨の可能性) 9℃/-1℃" "山梨県 中・西部(甲府)"]
 ["26日(水) 晴一時雪(雨の可能性) 9℃/-2℃" "長野県 南部(飯田)"]
 ["26日(水) 曇一時雪 10℃/0℃" "長野県 北部(長野)"]
 ["26日(水) 曇時々雪 6℃/-4℃" "群馬県 北部(みなかみ)"]
 ["27日(木) 晴一時雪 11℃/-2℃" "長野県 北部(長野)"])
nil
tenki.core> 

おわりに

core.cacheを初めて使いました。
少し癖のあるモジュールですが、今回のように期限付きのメモ化を実現するのに有効のようです。