@Konboi memo

主に技術に関してつらつらと。

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 とか使えばよさそう

Go言語によるWebアプリケーション開発

Go言語によるWebアプリケーション開発

それやる意味本当にある? を定期的に自分に問いかける

新しい人がチームに入ってきたらやっているMTGとか(今回は夕会を例にあげる)を

  • どうしてやってるか
  • なんのためにやってるか

を簡単でいいからスライドにしてきちんと説明するようにしている

スライドにすることで

  • 自分の話したい事が整理される
  • 口頭だけで説明するよりも伝わりやすい (外国人もメンバーにいるので)
  • 再度説明する時資料があるので楽

若干面倒だけどこうやって説明する機会を設けることで、

そもそも夕会やる必要あるの?って事の振り返りができる。

「夕会は情報共有のためにやってます」って言って情報共有ができてなかったら

  • 夕会のやり方を変えたほうがいい
  • 夕会をやめたほうがいい

とかの判断をすることが出来る

長い事やっているとやる事自体が目的になってしまい、ただただ惰性で続けることがあるので

定期的に振り返って問題ないかを自分に問うている。

SCRUM BOOT CAMP THE BOOK

SCRUM BOOT CAMP THE BOOK

PerlでJsonをencodeするときにsortされた状態で出力したい

TL;DR

use JSON::PP

JSON::PP->new->utf8->canoical(1)->encode(...)

すればkeyのalphabet順になる

refs: http://stackoverflow.com/questions/3532067/perl-how-to-sort-a-json-structure-on-something-other-than-root-key-attributes

はじめに

クライアントに渡すjsonデータを生成するとkeyの順番がバラバラで出力されていた。

これだと差分が無いのにGithubのPull-Requestで差分がでるのでリリースチェックするときに邪魔だった。

Key順にする

結論として JSON::PP を使えば解決できた 冒頭で書いたように canonical を On にすればkey順にsortされる

redis-cli monitor のログをプロファイルするツールを作った

TL;DR

rmlp という redis-cli monitor で出力されたログのプロファイラを作りました

redis-cli monitor のログを調べる必要がある時は、使ってみて下さい。

はじめに

  • 時間帯によってはredis serverのcpu使用率が高くなるときがあった
  • アプリのコードレベルでは cachesession をそれぞれ個別に指定できるようになっている

それでも分けて負荷が下がる確証もなかったため、 コマンド、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 を オブジェクトに対してどのように貼り付けるかのルール のようなもの

らしい

そしてこれ見とけって言われたのでみる

www.youtube.com

まとめ

近くに聞ける人がいるのはいいですね

シリコンバレー式 自分を変える最強の食事

知り合いが読んでて面白そうだなと思って読んでみた

シリコンバレー式 自分を変える最強の食事

シリコンバレー式 自分を変える最強の食事

個人的には

ジョコビッチの生まれ変わる食事

ジョコビッチの生まれ変わる食事

グルテンフリーよりも説得力がある気がしている。

今日から完全無欠コーヒーを飲み始めた。 とりあえず今週は飲み続けてみようと思う。