この記事は SLP-KBIT Advent Calendar 2016 その2の3日目の記事です.
早明浦ダム とは
※ 読み飛ばして大丈夫です.
早明浦ダム(さめうらダム)は、高知県長岡郡本山町と土佐郡土佐町にまたがる、一級河川・吉野川本流上流部に建設されたダムである。
独立行政法人水資源機構が管理する多目的ダムである。型式は重力式コンクリートダム、高さは106.0メートルで、総貯水容量は3億1600万立方メートル、有効貯水容量は2億8,900万立方メートル、利水容量は1億7300万立方メートル、吉野川水系における水資源施設の中核をなす四国地方最大のダムである。吉野川の治水と四国地方全域の利水を目的に建設され、このダムの水運用は四国地方の経済・市民生活に極めて多大な影響を及ぼす。このため「四国のいのち」とも呼ばれ、四国地方の心臓的な役割を果たす。ダムによって形成される人造湖はさめうら湖と呼ばれ、2005年(平成17年)には本山町・土佐町・大川村の推薦により財団法人ダム水源地環境整備センターが選定する「ダム湖百選」に選ばれている。
Wikipediaより引用
モチベーションの解説
こんばんは,SLPアドベントカレンダーその2 3日目は,我々うどん県民にとって寝る時も,食事中でも,朝起きて顔を洗っているときにでも気になってしまう我らの水瓶 早明浦ダムについての話題になります.
※ ちなみに, SLPというのは香川大学工学部のプログラミングサークルのことです.
うどん県民の主食はうどんです.
そしてうどんは水がなければ茹でることも冷水でしめることもできません.
早明浦ダムの水がなくなり取水制限になってから慌てていては,緊急用のうどん茹で水を確保出来ません.それは困る!
というわけで常日頃,気軽にコマンドラインから早明浦ダムの貯水率を確認したいというモチベーションが発生するはずなので作ってみました.
コードはGithubに公開しています.
sameura
実装の解説
Go言語でCLIが簡単に作れるということなので,Go言語で実装しました.
APIとかあるのかなと思ったら見当たらなかったので,ダムの様々な情報を出しているページからスクレイピングしてくることにしました.
得たデータを分割してさらに分割して...また分割してという感じになったので,変数名を考えるのがめんどくさくなってb1とかb2って名前になってます.
Go言語って長い名前は付けない慣習があったと思うんですけど,こういう何も伝わらない変数名もアリなんでしょうか.
利用ライブラリ
github.com/urfave/cli
とっても簡単にcliツールを作れるライブラリです.
詳しくはREADMEを参照.
app := cli.NewApp()
app.Name = "コマンド名"
app.Usage = "コマンドの使用用途"
app.Action = func(c *cli.Context) error {
本体処理
}
http
httpに関する操作ができます.
Getメソッドを使うことでWebページを取得できます.
respにWebページの要素を格納, _にはエラー情報が入りますが今回は使わないので捨てています.
resp, _ := http.Get("URL")
取得したら忘れずにCloseを指定しておきましょう.
defer resp.Body.Close()
io/ioutil
ioutilパッケージを使って[]byte型に変換します.
b1, _ := ioutil.ReadAll(resp.Body)
bytes
bytesパッケージでは,[]byte型に対して分割,比較などの処理が行えます.
今回はスクレイピングで必要なとこだけ取ってくるので分割しまくりました.
Split
やSplitAfter
なんかで分割出来ます.
tr := []byte("<TR>")
trs := bytes.Split(b2, tr)
大体Splitしまくったらいい感じに出来ます.
strings
2016/12/03 追記
コメントをいただいて,確かにと思ったので修正しました.
[]bytes
型のままコード中で使い続ける意味も特に無いので,string
型にキャストするようにコードを修正しています.
strings
パッケージでもbytesパッケージと同様に,Split
やSplitAfter
を使えます.
[]bytes
型からstring
型へのキャストはstring(b2)
とするだけでできます.
tr := "<TR>"
trs := strings.Split(string(b2), tr)
実行結果
% sameura
早明浦ダムの現在の貯水率は 100.0 %です.
最近ほとんど100%なので面白みが少ない...
終わりに
Go言語でコマンドラインツールを作成して,早明浦ダムの貯水率をいつでもコマンドラインから見れるようにしました.
次に書く記事は,Go言語でサーバの負荷を通知するデーモンのようなものを作る予定です.