Goのビット演算についてまとめる

きっかけ タイトル通りビット演算についてまとめる。 きっかけは、AtCoderでこの問題が出た時よくわからなかったため。 OR OR演算は左辺と右辺の同じ位置にあるビットを比較し、 どちらかのビットが1の場合1にする。 例えば、5と3のORを取ってみる 二進数に直すと、以下の通りになる 5: 00000000000000000000000000000101 3: 00000000000000000000000000000011 そうすると、7(00000000000000000000000000000111)になる コードで確認してみる package main func main(){ a, b := 5, 3 println(a|b) // output: 7 } AND OR演算は左辺と右辺の同じ位置にあるビットを比較し、 両方のビットが1の場合1にする。 5: 00000000000000000000000000000101 3: 00000000000000000000000000000011 そうすると、1(00000000000000000000000000000001)になる package main func main(){ a, b := 5, 3 println(a&b) // output: 1 } XOR OR演算は左辺と右辺の同じ位置にあるビットを比較し、 どちらか1つが1の場合1にする。 package main func main(){ a, b := 5, 3 println(a^b) // output: 6 }

2022年09月24日 · 1 分 · komisan19

go-cmpを使ったTips

Goのテストを書く時、期待値として構造体を比較したいときが多く発生すると思います。 特に時刻情報などテストで扱う場合、テストを書くレベルが高くなるかと思います。 そんな時におすすめなのがgo-cmpになります。 go-cmpを使わないで書く場合 例えば以下のような構造体がある場合、 type User struct { ID uint64 Nmae string CreateAt time.Time UpdateAt time.Time } go-cmpを使わないでテストを書く場合、このようになる。 func TestNoGoCmpUser(t *testing.T) { user1 := User{ ID: 1, Name: "taro", CreateAt: time.Now(), } user2 := User{ ID: 1, Name: "taro", CreateAt: time.Now(), } if user1.ID != user2.ID { t.Errorf("user1 %v, but user2 %v", user1.ID, user2.ID) } if user1.Name != user2.Name { t.Errorf("user1 %v, but user2 %v", user1.Name, user2.Name) } } この場合`CreateAt`など時刻を比較する場合エラーになってしまう。 そのような問題を解決するときに、`go-cmp`を使うと解決できる。 メリット go-cmpを使うメリットとしては以下の場合があるかと思います。...

2022年09月19日 · 2 分 · komisan19

【Go】genericsのチュートリアルがあったので試した話

こちらはzennの記事を移行したものです この記事は Go Advent Calendar 2021 (カレンダー 4)23 日目の記事です。 Go1.18 beta1 がリリースされて generics が使えるようになりました! https://go.dev/blog/go1.18beta1 公式ドキュメントを眺めてたらこんなチュートリアルがあったので試してみました。 https://go.dev/doc/tutorial/generics :::message これはベータコンテンツなので変更があるかもしれません。 ::: Go1.18 beta1 のインストール チュートリアルにもありますが、以下のように導入します。 goenv を使わずにの切り替えができるので便利です。 $ go install golang.org/dl/[email protected] $ go1.18beta1 download ダウンロードまでできたらバージョンを確認します。 以下のように表示された成功です。 go1.18beta1 と入力するのめんどくさいので alias を作っておくのがおすすめです。 $ go1.18beta1 version go version go1.18beta1 darwin/arm64 // option $ alias go18="go1.18beta1" 今回は 1.18beta を入れましたが、上記の方法を使うと 他のバージョンを入れることができます。 例えば、go1.14.1 を入れたい場合このようにします。 $ go install golang.org/dl/[email protected] $ go1.14.1 dowload 関数を追加 今回はマップの値を合計して返す関数を作ります。 まずはじめに、ジェネリクスを使わない関数を追加してみます。 package main import "fmt" func sumInts(m map[string]int64) int64 { var s int64 for _, v := range m{ s += v } return s } func sumFloats(m map[string]float64) float64{ var s float64 for _, v := range m{ s += v } return s } func main(){ ints := map[string]int64{ "first": 12, "second": 34, } floats := map[string]float64{ "first": 12....

2022年08月27日 · 2 分 · komisan19

aws-load-balancer-controllerにOSSコントリビュートした話

こちらはzennの記事を移行したものです 業務で aws-load-balancer-controller を利用した際に生じたい問題が公式ドキュメントに記載されてなかったのでコントリビュートしました。その際にやったことの知見をまとめたいと思います。 https://github.com/kubernetes-sigs/aws-load-balancer-controller PR した内容 何を PR したのかといいますと以下の内容です。 https://github.com/kubernetes-sigs/aws-load-balancer-controller/pull/1805 簡単に言うと、 EKS For Fargate で aws-load-balancer-controller を使うときは Helm から入れたほうがええよといった内容です。 きっかけ 業務で EKS for Fargate を使ったインフラ構築を行ったのですが、公式ドキュメント通り行くと manifests でやるか、Helm で入れるかの二択を迫られます。業務ではなるべる技術にばらつきを起こさないようにと考えていたので、 manifests のほうがよいと判断し Helm をやめ実装していました。 しかし、実装していると cert-manager のエラーで失敗してしまい困っていたところこのような issue を見つけました。 https://github.com/kubernetes-sigs/aws-load-balancer-controller/issues/1787 If you are installing on 1.16 and later, the cert-manager and yaml manifests should work without modifications. If cert-manager doesn’t work in your case (for example, cert-manager will not work in Fargate), you can try the helm chart since it doesn’t depend on the cert-manager....

2022年08月27日 · 1 分 · komisan19

Dockerfileのテンプレートを作るCLIを作った話

初めに 個人開発で Docker を使っているのですが、毎回 Dockerfile を作るのが めんどくさくなったのでテンプレを用意しました。 とりあえずソースコードです https://github.com/komisan19/kuzira 使い方 initコマンドを叩くと空の Dockerfile が作成でき、 createコマンド+言語を指定するとテンプレートの言語が作成されます。 $ kuzira init $ ls Dockerfile Dockerfile --- $ kuzira create go create Dockerfile for Golang 仕組み CLI は以下のライブラリを使っていますが、テンプレートは embed を使ってみました。 https://github.com/urfave/cli go:embed Go1.16 から追加された機能です。 go:embed はその意味の通り埋め込みができます。1.16 以前もosやio/ioutilで読み込みなどできましたが、embed を使うとgo build時にバイナリに埋め込むことができます。 工夫点 上記でも記載しましたが、go:embed を使っています。 そのため、今回はこのような形でテンプレートファイルをおいて参照するようにしました。 . ├── README.md ├── action │ ├── cli.go │ └── cookbook │ ├── go-dockerfile │ └── python-dockerfile --- cookboo k内にテンプレートファイルを置くようにしました。 そして cli.go にこのような形で書きました。...

2022年08月27日 · 1 分 · komisan19