Carpe Diem

備忘録。https://github.com/jun06t

Go

grpc-gatewayでgRPCサーバをRESTで叩けるようにする

概要 gRPCはProtocol Buffersを喋るもの同士ではメリットが大きいですが、RESTしか叩け無いものや、curlでRESTを叩くようにサクッと検証したかったりするときに不便です。 そんな問題を解消してくれるのがgrpc-gatewayで、protobuf定義からREST APIを提供す…

gRPCにおける各RPC方式の実装方法【Bidirectional streaming RPC】

概要 前回の gRPCにおける各RPC方式の実装方法【Client streaming RPC】 - Carpe Diem に引き続き、最後はBidirectional streaming RPCの実装方法を紹介します。 チャットのようなリアルタイム通信や、大きなデータを少しずつ処理したい時、Simple RPCで毎回…

gRPCにおける各RPC方式の実装方法【Client streaming RPC】

概要 前回の gRPCにおける各RPC方式の実装方法【Server streaming RPC】 - Carpe Diem に引き続き、今回はClient streaming RPCの実装方法を紹介します。 こちらは大きなリクエストを分割して送りたい時に有用です。 環境 golang 1.9.2 grpc 1.7.2 protobuf …

gRPCにおける各RPC方式の実装方法【Server streaming RPC】

概要 前回の gRPCにおける各RPC方式の実装方法【Simple RPC】 - Carpe Diem に引き続き、今回はServer streaming RPCの実装方法を紹介します。 サーバ側から複数のレスポンスを送ることができるので、フィードなどをReactiveに取得したい時に使ったり、サー…

gRPCにおける各RPC方式の実装方法【Simple RPC】

概要 gRPCは4つのRPC方式を持っています。 RPC方式 説明 使い所 Unary(Simple) RPC シンプルな1 Request - 1 Response方式 一般的なマイクロサービスなど Server streaming RPC 1 Request - N Response方式 サーバサイドプッシュ・フィードなど Client stre…

protoeasyでprotobufのコンパイルを簡単にする

概要 gRPCなどで使われているprotobufですが、.protoの定義は簡単でもコンパイルにちょっと学習コストがかかります。 gogoprotoやgrpc-gatewayといった他のライブラリも使うと、中々にカオスなコマンドになります。 grpc-gatewayの例 protoc -I/usr/local/in…

GolangのSliceを関数の引数に渡した時の挙動

Go

概要 Sliceの構造を始め、関数で呼び出した場合の挙動やappendなどsliceを操作した場合どうなるかをまとめました。 環境 golang v1.9.0 Sliceの構造 Sliceは以下のような3つの要素でなりたっています。 配列へのポインタ length capacity 図示すると以下で…

Scratch imageでtime: missing Location

概要 以前以下の記事でscratch imageの作成方法を紹介しました。 christina04.hatenablog.com しかしgolangのコードによっては以下のpanicが起きることがあります。 panic: time: missing Location in call to Time.In 今回はその対応方法です。 環境 golang…

ScratchイメージでGolangアプリの超軽量イメージをビルド

概要 Alpineベースのイメージが軽量イメージとして認知されていますが、golangの場合は単一バイナリで動くのでイメージ内にgolangが入っている必要はありません。 なので最も軽量と言われているScratch imageを利用することで、dockerイメージを軽量化するこ…

delveでGolangのデバッグ

Go

概要 Golangでデバッグをする際にdelveというツールがオススメです。 環境 golang v1.8.3 delve 1.0.0-rc.1 インストール brewでもインストールできますが、単体テストの実行の際に上手く動かないことがあったのでgo getの方をオススメします。 $ xcode-sele…

Non-Blocking I/O, I/O Multiplexing, Asynchronous I/Oの区別

概要 各言語がC10K問題をどう解決してきたかを調べてみたところ、Non-Blocking I/O, I/O Multiplexing, Asynchronous I/Oの区別がよく分からなかったので調べてみました。 正直なところ人によってちょこちょこ定義が異なるのではっきりとした答えはなさそう…

GolangでMockを書く時のTips

Go

概要 「GolangはDuck TypeだからMock用意するの大変だよね」とよく言われますが、そんなことはないですよ、という話。 環境 golang 1.8.3 1. interface自体埋め込めば実装済みと解釈してくれる 例えば以下のような複数のメソッドを持つinterfacedoEverything…

GolangでBigQueryにデータを追加する

概要 GolangでのBigQueryの使い方です。 認証周りが以前と変わっており、JWTを使ってゴニョゴニョしてた部分をライブラリ側で吸収してくれるようになったのか使う側は簡単になりました。 環境 go 1.8.3 サービスアカウントキーの作成 API Console Credentials…

Golangのnilについて

Go

概要 先日の golang.tokyo #6 - connpass で独自のエラー型でnilにハマった点に触れられていて、自分でもふわっとしか覚えてなかったのでまとめ。 覚えること 以下を覚えておけばとりあえず大丈夫です。 nilは型を持つ interfaceの場合のみ、型もnilでないと…

GolangでJWTの具体的な実装

概要 以前JWTを認証用トークンに使う時に調べたこと - Carpe Diemで紹介した内容の具体的な実装の紹介です。 環境 golang 1.8.1 署名アルゴリズムと鍵長は以下とします。 署名アルゴリズム 鍵長 RSA-SHA256 4096bit 成果物 今回の完成形はこちら github.com

golang.tokyo#3でLTしました

Go

概要 golang.tokyo #3でLTをさせていただきました。 今回はパフォーマンスについてのイベントでした。 golangtokyo.connpass.com スライド 内容は先日ブログに書いたGolangでのstreamの扱い方を学ぶ - Carpe Diemと同じですが、今まで知らなかった人(僕も含…

Golangでのstreamの扱い方を学ぶ

Go

概要 結論から言うと、Streamで扱っているものはStreamのまま扱うです。 具体的にはio.Readerを毎回ioutil.ReadAllで[]byteに変換せずにそのまま使いましょうです。 なぜStreamを使うべきか Node.jsの例ですが、こちらで非常に分かりやすく説明されています…

sync.Poolを使って省コスト&高速化

Go

概要 golangにはsync.PoolというFreeListの仕組みがあります。 役割としては既に割り当てられたメモリが不要になった時、解放する代わりにListにとして保持しておいて、メモリが必要になったらそこから取るというものです。なのでGCコストやメモリのallocati…

サーバサイドのCORS対応

概要 No 'Access-Control-Allow-Origin' header is present on the requested resource.というエラーが出た際に外部API(サーバ側)でどう対応すべきかをまとめました。 CORSでググると幸せになれます。 環境 go 1.7.4 gin 1.1.4 CORSが必要になるのはどんな…

ldflagsを使おうとしてハマったこと

Go

概要 golangではbuild時にldflagsというオプションをつけると、変数に値を埋め込んだ状態でバイナリを生成することができます。 よく使われるのはビルド時のgitのcommitのハッシュを埋め込んで、そのバイナリがどのcommitで作成されたのかを明らかにして「想…

golangのpresentで発表用スライドを作成する

Go

概要 先日Goオールスターズ2で登壇させて頂き、その時プレゼン作成のために使ったpresentの使い方を紹介します。 presentを使うと↓のようなスライドを作れます http://go-talks.appspot.com/github.com/jun06t/go-all-stars/main.slide#1 メリット・デメリ…

GolangでTwitterのOAuth1.0認証

概要 GolangでTwitterのOAuth認証をします。 oauth1.0のライブラリはいくつかありますが、今回はgaryburd/go-oauthを利用します。 github.com 環境 Go v1.6.2

goroutine、channelの扱い方

Go

概要 goroutineやchannelを扱う上で気になった点を箇条書きしました。まとまってはいないのでご注意ください。 簡単のためchannelでの受信側をreader、送信側をwriterとして書いていきます。 環境 Go 1.6.2 実装時に注意するポイント readerとwriterは別goro…

GoでDependency Injection

Go

概要 「Dependency Injection=依存性の注入」と言われますが、依存したオブジェクトを外部から入れることで何がメリットなのかを感じ取るのは実際に書いてみて分かると思うので、勉強としてまとめてみました。 Dependency Injectionとは デザインパターン …

GoのRace Detectorでマルチスレッドでのデータ競合検知

Go

概要 Go1.6からマップへの同時アクセスを検知する機能が追加されました。 しかしそれ以前からrace detectorが標準で備わっているため、複数のスレッドによる同時アクセスで起こるデータ競合の検知はできます。 今回はその使い方を紹介します。 環境 Go 1.6 …

GolangでGooglePlayの課金レシートの署名検証

概要 GooglePlayでは課金処理の実行時に署名を発行してくれるため、そのレシートが正規のレシートかどうかを検証する事が可能です。 今回はGolangでその検証ロジックを実装してみます。 環境 Golang 1.6 必要な情報 以下の3つが必要になります。 1. アプリ…

Private Repository で go get

問題 作業リポジトリで依存パッケージを全部アップデートしようと以下のコマンドを実行したところ $ go get -u ./... 以下のようなエラーが出ました。 package github.com/hoge/fuga/package: /home/vagrant/go/src/github.com/hoge/fuga is from git@github…

Goでテストカバレッジ

Go

環境 Ubuntu 14.04 Go 1.3.3 インストール $ go get code.google.com/p/go.tools/cmd/cover テストコードの用意 ソースコード package foo func Sum(a int, b int) int { return a + b }

Go言語環境の構築

Go

Ubuntu14.04でのGo環境の構築方法です。 ◆事前準備 gitとmercurialが必要なのでインストールしておいて下さい。 $ sudo aptitude install git mercurial ◆ダウンロード http://golang.org/dl/ からバイナリファイルを持ってきます。今回はlinuxなので go1.3.…