オフィスにいる人間をSlackに通知するやつ作った
はじめに
この記事は,Aizu Advent Calendar 2016の8日目の記事.
前の記事は, id:misoton665 の
すごい!!!!!
明日は, a_r_g_v .
なにするやつ
オフィスにいる人間をMACアドレスを利用してSlackに通知するやつ
できたやつ
(時間があれなのは休日に遊んでいたため)
なにをやったか
SQLiteに保存してあるMACアドレスを探して見つかればSlackに通知するようにした.
いい感じにMACアドレスと人間を紐付けるのに管理ページほしかったのでFlask-Admin使ったけど,何もしなくても管理ページできてすごい.
こんな感じになって,通知されたくない人はここに登録しなければ良いし,通知されてもいい人は自分のMACアドレスをここに登録すればよい.
Raspberry Pi上で動いていて, nginx -> gunicorn -> flask のおそらく定番の構成で動作している.
一定間隔で,arpしてSlackに通知する君だけどいる人間が前回と同じだと通知しなかったり,出ていった人間,新しく来た人間を区別するようにしたかった.前は,arpしてSlackに通知する君はsystemdのtimerで一定間隔で動いてて,Redisに前回の結果を格納していたけど,これだけのためにRedis使うのはなーと思って,デーモン化してグローバル変数に前回の結果を保存するようにした.一定間隔で繰り返すやつは,scheduleってやつを使った.うーん,ファイルとかに吐き出すようにすれば良いのかな,分からん.
かんそう
オフィスにカードキー忘れて入れないときとか,これを見て中に誰がいるのか分かるのでべんり.
Flask-Adminすごかった.Python普段書かないので,どうすれば良いのかまったく分からんかった.設定ファイルってどうするのが普通なんだろう.今回は他に利用する人おらんだろって感じで設定ファイルを利用していないが.
名前がtippyなのは,リポジトリを作るときに名前何にしようかなーと思って横見たら,ティッピーのぬいぐるみがあったからというだけ.
かわいい.
Golangで環境変数をシュッっと良い感じに扱う
はじめに
この記事は,Aizu Advent Calendar 2016の5日目の記事.
前の記事は, id:mic_psm の
です.自分も最近新型MacBookPro に変えてハッピー. 明日の記事は未定なので,書いてくれ!!!!!
本題
Golangで環境変数を扱うとき,普通はosパッケージを利用してこんな感じで扱うと思う.
port := os.Getenv("PORT")
だけど,大量の環境変数を扱うときとかダルかったりそもそも構造体によしなに入って欲しいかったり,よしなに型が付いて欲しいですね〜みたいな気持ちになる.
そこで,このライブラリを使うと良い感じになる.
例えば,以下のような設定を環境変数から読みたいとする.
- PORT
- int
- DEBUG
- bool
- default false
- TIMEOUT
- time.Duration
普通にやるとこんな感じになる.
portStr := os.Getenv("PORT") port, _ := strconv.Atoi(portStr) debug := false debugStr := os.Getenv("DEBUG") if debugStr == "true" { debug = true } timeoutStr := os.Getenv("TIMEOUT") timeout, _ := strconv.Atoi(timeoutStr) timeoutDuration := time.Duration(timeout)
envconfigを使うと以下のように書ける.
type Config struct { Port int Debug bool Timeout time.Duration } func main() { var config Config envconfig.Process("", &config) }
これで, Config
の構造体の中にちゃんと環境変数で設定したやつが入る.
タグアノテーションを使って細かい設定もできる.
type Config struct { Port int `required:"true"` // 設定されていないとエラーが発生する Debug bool `default:"true"` // デフォルト値としてtrueが設定される Timeout time.Duration `envconfig:"TIME_OUT"` // 設定しないと "TIMEOUT" で読まれる }
他にも最近追加された機能として,構造体の埋め込みができる. 例えば,以下の様なことができる.
type Config struct { Port int Debug bool Timeout time.Duration MySQL MySQL `envconfig:"MYSQL"` Redis Redis } type MySQL struct { Port int Host string User string Database string } type Redis struct { Port int Host string } func main() { var config Config envconfig.Process("APP", &config) }
こうすると, APP_MYSQL_PORT
っていう環境変数に config.MySQL.Port
でアクセスすることができるようになって便利.
有名なライブラリだけど,便利なので紹介した.もっと良いやつがあればぜひ教えて欲しい.