Goのflag package で同じオプション名で複数の値を受け取る
はじめに
コマンドラインツールを作っていると同一オプションで複数の値を受け取りたい事があります
今回は
-ignore hoge -ignore fuga
の用に特定の文字列を結果から除きくignore
というオプション名で複数のStringを受け取りたい
という事にします
Goのflagが標準で提供しているもので複数の値を受け付けているのは
flag.Args() だけで今回の要件は満たすことができません
無いなら作る
では、どうするか
flag には flag.Var() という flagで定義しているValueを引数にとるメソッドがあります
flag.Value は
type Value interface { String() string Set(string) error }
このように String()
と Set(string) error
のinterfaceを満たすtypeを定義してあげます
interfaceを満たすtypeを定義する
String()
と Set(string) error
を満たすtypeを実装すると 今回は複数のStringを受け付けたいので以下の用になります
type sliceString []string func (*ss sliceString) String() string { return fmt.Sprintf(“%s”, *ss) } func (*ss sliceString) Set(value string) error { *ss = append(*ss, svalue) return nil } var ignoreStrings sliceString
これで flag.Type
を満たしつつ複数のstringを受け付けられるtypeの定義しそれの変数である ignoreStrings
の準備ができた。
複数のintを受け付けたい場合は String()
で strconv.Itoa(someIntValue)
などのようにしてstringを返す必要があります
定義した型を使う
定義できたので以下の用に flag.Var()
を使うことで複数Stringを受けつることが出来る
func main () {
flag.Var(&ignoreStrings, “ignore”, “Set ignore strings”
flag.Parse()
}
こんな感じ(※ Go Playground 上では何も表示されません)
最後に
- flag.Value を満たすtypeを定義すれば色んな引数がとれそう
- 自分で定義するのが面倒なら alecthomas/kingpin とか使えばよさそう
- 作者: Mat Ryer,鵜飼文敏,牧野聡
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/01/22
- メディア: 大型本
- この商品を含むブログ (2件) を見る
それやる意味本当にある? を定期的に自分に問いかける
新しい人がチームに入ってきたらやっているMTGとか(今回は夕会を例にあげる)を
- どうしてやってるか
- なんのためにやってるか
を簡単でいいからスライドにしてきちんと説明するようにしている
スライドにすることで
- 自分の話したい事が整理される
- 口頭だけで説明するよりも伝わりやすい (外国人もメンバーにいるので)
- 再度説明する時資料があるので楽
若干面倒だけどこうやって説明する機会を設けることで、
そもそも夕会やる必要あるの?って事の振り返りができる。
「夕会は情報共有のためにやってます」って言って情報共有ができてなかったら
- 夕会のやり方を変えたほうがいい
- 夕会をやめたほうがいい
とかの判断をすることが出来る
長い事やっているとやる事自体が目的になってしまい、ただただ惰性で続けることがあるので
定期的に振り返って問題ないかを自分に問うている。
- 作者: 西村直人,永瀬美穂,吉羽龍太郎
- 出版社/メーカー: 翔泳社
- 発売日: 2013/02/13
- メディア: 単行本(ソフトカバー)
- 購入: 5人 クリック: 13回
- この商品を含むブログ (33件) を見る
PerlでJsonをencodeするときにsortされた状態で出力したい
redis-cli monitor のログをプロファイルするツールを作った
TL;DR
rmlp という redis-cli monitor
で出力されたログのプロファイラを作りました
redis-cli monitor
のログを調べる必要がある時は、使ってみて下さい。
はじめに
- 時間帯によってはredis serverのcpu使用率が高くなるときがあった
- アプリのコードレベルでは
cache
やsession
をそれぞれ個別に指定できるようになっている
それでも分けて負荷が下がる確証もなかったため、
コマンド、keyの利用比率を確認するためredis-cli monitor
を実行して調べる事にしました
keys ではだめなのか
echo keys * | redis-cli > keys.log
でkeyがどの程度あるかは調べられますが、実行される頻度が分からないので負荷を見ながら redis-cli monitor
で実際に使われているkeyやコマンドを調べる必要がありました
終わりに
- もし使ってみて便利であればstarの方をポチッとお願いします 🙏
- Perlでいう hash にして hash value で sort するのが Go だと sort package があるので Array でやったのがいいのかどうかいまいちどうしたらベストなのか分かってない
hoge = { ‘some key1’ => { ‘count’ => 10, ‘max’ => 0.012, ‘avg’ => 0.008, } , ‘some key2’ => { ‘count’ => 20, ‘max’ => 0.023, ‘avg’ => 0.012, } , }
Materialってなんだ
はじめに
最近Unity入門していて タイトルの通りMaterialってなんだってなって近くのエンジニアに教えてもらったのでメモ
Materialとは
shader と texture を組み合わせたもの
texture は 画像ファイル
shader は texture を オブジェクトに対してどのように貼り付けるかのルール のようなもの
らしい
そしてこれ見とけって言われたのでみる
まとめ
近くに聞ける人がいるのはいいですね
シリコンバレー式 自分を変える最強の食事
知り合いが読んでて面白そうだなと思って読んでみた
- 作者: デイヴ・アスプリー,栗原百代
- 出版社/メーカー: ダイヤモンド社
- 発売日: 2015/09/18
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (4件) を見る
個人的には
- 作者: ノバク・ジョコビッチ,タカ大丸
- 出版社/メーカー: 三五館
- 発売日: 2015/03/21
- メディア: 単行本
- この商品を含むブログ (16件) を見る
のグルテンフリーよりも説得力がある気がしている。
今日から完全無欠コーヒーを飲み始めた。 とりあえず今週は飲み続けてみようと思う。