sliceから任意のキーを削除する方法メモ

appendを使って削除したい任意のキー以外を結合する package main import ( "errors" "fmt" ) func main() { a := []int{1, 2, 3, 4, 5, 6} fmt.Println(delete(a, 3)) fmt.Println(delete(a, 5)) fmt.Println(delete(a, -1)) } func delete(s []int, d int) ([]int, error) { // make copy destination. need source slice size res := make([]int, len(s)) copy(res, s) // delete value for k, v := range res { if v == d { res = append(res[:k], res[k+1:]...) return res, nil } } return nil, errors.New("not found delete value") } https://play.golang.org/p/bE4brB3wDF

スライスを展開して ...interface{} 型の引数に渡す

スライスの展開 スライスargsがあるときargs...で展開することが出来る。 func A(args ...string) {} func main() { args := []string{"a", "b"} A(args...) } しかし以下のように引数が...interface{}となっている場合はコンパイルに失敗してしまう。 func A(args ...interface{}) {} func main() { args := []string{"a", "b"} A(args...) } // => cannot use args (type []string) as type []interface {} in argument to A …int
Read more

Goでどのtesting frameworkを使ってテストを書くか、あるいはkubernetesで何が使われているか

Motivation もともと僕はGoの教えの通り、標準のtestingパッケージのみを使ってテストを書いていた。 当初は面倒くさいなと思っていたが今ではこのスタイルが気に入っているし、特に困ってもいないのだが、メジャーなパッケージくらいは抑えておいたほうが良いのではないかと思い、個人開発でも何らかの
Read more

Backpressure in Go

Motivation 昨今のMicroserviceブームの文脈で、例えばユーザ情報の更新だけを行うMicroseviceを作ったとする。 そのような場合に無限に処理を受け付けてしまうとネットワークはもちろん、バックエンドのDBも死んでしまう可能性がある。 ネットワーク周りはService meshなどの
Read more

internalパッケージとfork

internalパッケージあるいは相対パッケージをimportする時、ローカルに完全一致するパスが存在する必要がある。 これは普段ならばあまり問題にならないが、forkしたリポジトリなどで問題になることがある。 問題になる例 例としてhttps://github.com/takasha
Read more

k8sのコンテキストをシュッと見て切り替えられるようにする

tl;dr promptにコンテキスト名を出して、pecoでコンテキストフィルタリング出来るようにしたら良い感じだった。 モチベーション k8sを運用していると環境ごとにコンテキストを分けるような場合が多いと思う。そこでdevelopmentと思いつつ作業していたらproductionだったみ
Read more

NginxでカジュアルにA/Bテストをする

モチベーション シュッとA/Bテストをしたい時、アプリに手を入れずにNginxだけで完結出来ると楽。またNginxで制御出来るとパス単位やクラスタ単位など柔軟にトラフィックを流せるので楽になりそう。 split_clientを使ってトラフィックを制御する 特定のトークンを与えると、それ
Read more

redashのパラメータをHTMLエスケープせずに使用する、あるいはin句に文字列のリストを渡す

tl;dr; 波括弧3個を使う {{{ }}} 問題 通常redashで指定するパラメータはHTMLエスケープ処理される。 以下のようなクエリがあった場合、単純に文字列のパラメータを送ると不正なクエリとして失敗する。 クエリ select * from foo where bar in ( {{params}} ) 文字列のパラメータ 'foo', 'bar' HTMLエスケープしない 以下のように波括弧3個
Read more

Unixドメインソケットメモ

デバッグ方法 普通にcurl経由でリクエストを投げれる。 curl --unix-socket /path/to/socket http:/user/get/1 プロセスを調べる ソケットファイルに対して lsof して調べることが出来る。procfsがあれば /proc/PID/ を見ても良い。 lsof /path/to/socket エラーハンドリング 既にcloseしている(readする人がいない)ソケットに対してwriteすると EPIPE システムコー
Read more

最近の開発スタイル

Introduction 2018年現在、ある程度dockerやその周辺技術についても使い方がまとまってきた感があるので、普段どのように開発を進めているかメモしておきたい。 なおここでは個人開発でどうやっているかについて書くが、業務でも似たようなアプローチではある(というかそれを真似した)。 対象ソフトウェ
Read more