GoでClean Architecture導入とDual WriteによるDB移行をした話

これは CyberAgent Developers Advent Calendar 2018 16日目の記事です。 普段アドテク関連のプロダクトにおいてGoでバックエンドを書いています。今回はプロダクト内で使用していたメインDBをオンラインで置き換えた話と、その導入としてClean Architectureを用いた事例について紹介します。 またこれは2017年末
Read more

goパッケージを使って複数ファイルを1つにまとめる gma を作った

これは Go2 advent calendar 16日目の記事です。 モチベーション 最近競技プログラミングをやり始めたが、web上のエディタで書いたコードをそのままsubmitする形式が多いように思う。つまりシングルファイルにまとめる必要が出てくるが、いくつか問題を解いていると似たような処理が多くなりutilファイル
Read more

Bigtable用のインタラクティブなCLIクライアント"btcli"を書いた

Motivation 仕事でBigtableを使用しているが、標準のクライアント cbt の機能がシンプルなため、もう少しリッチなクライアントが欲しかった。 そこでmysqlに対するmycli的な位置づけを目指して自作クライアントを書いた。 作ったもの https://github.com/takashabe/btcli 機能 コマンドやテーブル名を入力するとき、mycliのように
Read more

Table driven testでgomockを使う

モチベーション GoでDBやWebAPIを叩くテストを書く時にgomockを使うことがよくある。特にレイヤードアーキテクチャを採用した時にDB接続層とそれ以外のパッケージで並列にテストを実行したい時に便利。 しかしtable driven testと単純に合わせて使おうとするとmockの初期化周り
Read more

golang.tokyo#15に行ってきたメモ

https://golangtokyo.connpass.com/event/87064/ 聞いてきた話のメモ書き Effective Streaming in Golang io packageの便利interfaceもっと使っていきましょうという話 メモらずに話を聞いていたけど資料がよくまとまっていて神感あった メモリアロケートしなくて良いところは気をつけていきたい 次世代のコンテナランタイム!?gVisorのコードを読みなが
Read more

Go向けのBigtable fixture管理ライブラリ bt-fixture を書いた

Motivation RDBを使ったテストをする時にFixtureを使うのはメジャーだと思うが、同様にBigtable向けのライブラリがあると便利そう。 しかしBigtable用のFixture管理ライブラリが見当たらなかったので書いた。 bt-fixture 作ったもの https://github.com/takashabe/bt-fixture 機能 yamlでfixtureを管理出来る fixtu
Read more

goroutineで無名関数を使う時に気をつけること

TL;DR goroutineで無名関数を使う場合、変わる可能性のある関数外の変数に依存してはいけない 問題 golangでは無名関数外のスコープの変数を呼ぶことが出来る。 しかしそれをgoroutine生成時に行うと外側の変数が変わってしまった時に期待する結果が得られない。 例えば以下のコードの
Read more

Goにおけるクロージャ

匿名関数を返す関数を使うことでクロージャが実現出来る。クロージャは生成した関数ごとに異なる局所変数を参照可能となる。 クロージャの例 文字列を指定した回数繰り返すような関数は以下の通り。 package main import ( "fmt" "strings" ) func echo(s string) func(int) string { return func(n int) string { return strings.Repeat(s, n) } } func main() { foo := echo("foo") bar := echo("bar") fmt.Println(foo(3)) // => foofoofoo fmt.Println(bar(5)) // => barbarbarbarbar } ジェネレータの例
Read more

MessageQueueとPub/Subの特徴メモ

Pub/Subモデル(以下pubsub)はMessageQueueモデル(以下MQ)のスーパーセット的な位置付け。 MQが単なるメッセージをenqueue/dequeueするものと見た場合、pubsubはdequeue側にsubscriptionという層を1枚挟んだ形となる。 例えば
Read more

reflect.DeepEqualで関数が埋め込んである構造体を比較する

TL;DR 関数同士の厳密な比較は出来ないので、比較時に関数をnilに差し替えるなどの工夫が必要 reflect.DeepEqualの比較について reflect.DeepEqualはstruct, map, arrayなどをいい感じに比較してくれる便利なものです。 単純な関数同士を比較することはあまりな
Read more