Help us understand the problem. What is going on with this article?

早明浦ダムの貯水率を見れるコマンド作った

More than 3 years have passed since last update.

この記事は 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型に対して分割,比較などの処理が行えます.
今回はスクレイピングで必要なとこだけ取ってくるので分割しまくりました.
SplitSplitAfterなんかで分割出来ます.

tr := []byte("<TR>")
trs := bytes.Split(b2, tr)

大体Splitしまくったらいい感じに出来ます.

strings

2016/12/03 追記

コメントをいただいて,確かにと思ったので修正しました.

[]bytes型のままコード中で使い続ける意味も特に無いので,string型にキャストするようにコードを修正しています.

stringsパッケージでもbytesパッケージと同様に,SplitSplitAfterを使えます.
[]bytes型からstring型へのキャストはstring(b2)とするだけでできます.

tr := "<TR>"
trs := strings.Split(string(b2), tr)

実行結果

% sameura
早明浦ダムの現在の貯水率は 100.0 %です.

最近ほとんど100%なので面白みが少ない...

終わりに

Go言語でコマンドラインツールを作成して,早明浦ダムの貯水率をいつでもコマンドラインから見れるようにしました.

次に書く記事は,Go言語でサーバの負荷を通知するデーモンのようなものを作る予定です.

参考資料

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした