golang
ファイルを出力する機能のユニットテストを書く場合に、期待値としてのファイルと生成したファイルを比較し、差分があれば当該差分をきれいに表示したい場合があります。 これはgo-diffを利用することで可能になります。 例えば、以下のような形です。テスト…
ローカルにインストールされているツールが想定のバージョンであるかを確認するために、Golangでチェックを入れることになりました。昨今のツールの多くはSemantic Versioningをサポートしているので、Semantic Versioningで比較したい。 しかし、Semantic V…
Golangでの有名バリデーションライブラリにgo-playground/validatorというのがあります。ライセンスはMITで使いやすい。 このライブラリを使ってYAMLファイルのバリデーションを実装したのですが、そこそこ悩まされました。 本ライブラリはYAML等のバリデー…
Golangのツールをチームで開発しているのですが、Merge Requestをmergeする度にgo.sumとのconflictが発生する。つらい。 実のところは「つらすぎる」というほどつらくはないのですが、毎回conflict markerの<<<<<<<を消していく作業で人生を浪費するのはつら…
Golangで作ったプロダクトを公開・配布するとき、課題となるのが利用するモジュールのライセンスです。 MITライセンスであれ、MPLライセンスであれ、利用するモジュールのLICENSEやNOTICEファイルを同梱することになるでしょう。 goxzとgo-licensesを使うと…
テスト文化を作るためには、自分の書いたコードのどこがテストされているのかを明示するのも意味があります。人は「ここがテストされていないよ」と言われたら、テストしたいと考えるものだからです。知らんけど。 誰もが見える場所にカバレッジなどの数値を…
マネジメントを行う上では以下のような取り組みが重要です。 何らかの定量指標を収集し、目標を設定する その数値を誰もが見る場所に置く これはテスト文化を作るときにも例外ではありません。 「テストを書こう」といくら啓蒙したところで、ぼくの経験上効…
Golangでカバレッジを取得するためには、単純にgo test -coverprofileをすれば良い。そういうふうに思っていた時期がぼくにもありました。 $ go test -coverprofile=coverage.out ./... | tail -5 ? gitlab.com/eponas/epona-aws-starter-cli/internal/loggi…
業務でGolangを使うことにしたので、久しぶりにGolangを書いてみています。 シンタックスレベルでかなりの部分を忘れていて、もろもろググりながらという感じ。 最初のお題は、Golangを使って外部コマンドを実行するユーティリティでした。 実施したいこと …
golang の構造化ロガーのうち有名なものの一つに logrus があります。構造化ログとして JSON フォーマットを指定するとするとだいたいこんな感じになります {"level":"info","msg":"hello world","time":"2019-09-01T06:56:59+09:00","user":"kiririmode"} …
gRPC には、当然ながらクライアントサイドでタイムアウトが設定できます。このとき、HTTP/2 上でどういうフレームが流れるのかを整理してみます。 タイムアウト設定 golang node HTTP/2 での挙動 まとめ タイムアウト設定 golang Golang の場合は、 context.…
gRPC には metadata という概念が存在します。 これは RPC においての付加情報ということになっており、golang からの扱いは簡単です。ただし、node.js を client として使う場合にどのようにして metadata を「取得する」かあまり情報がなく苦しみました。 …
今回は、gRPC で SSL 通信を行おうと思います。 環境としては、サーバは golang、クライアントは node.js という構成です。 ルート認証局、証明書を作成する。 golang の gRPC サーバに組み込む Node.js client を SSL に対応させる node のソース ルート認…
gRPC では HTTP/2 を使っており、HTTP/2 では 1 本の TCP のコネクションの上で stream を多重化します。このため、TCP のコネクションはずっと張りっぱなしになることが多く、どのようにしてこのコネクションを維持するかが重要な場合があります。 問題とな…
Go で gRPC 周りをデバッグするときに設定しているとデバッグするのが楽になる環境変数がいくつかあります。このあたり、情報が色んな所に散財しているので、ちょっとまとめますね。 GODEBUG その他 GRPC_VERBOSITY, GRPC_TRACE GRPC_GO_LOG_SEVERITY_LEVEL,…
なぜかおかしな振る舞いをするサーバプログラムをデバッグするというのは、それなりに骨の折れる作業です。大量のソースを前に「ここが怪しい」と言いながらデバッグログを埋め込むこともあるでしょう。また、lsof や ss といったコマンドやスタックトレース…
API でのリクエスト、レスポンスのフィールドとして、タイムスタンプを定義したいときがあります。 しかし、Protocol Buffer の言語仕様上、Scalar として日付、時刻関連の型は定義されていません。このようなとき、どのように対処すれば良いでしょうか。 日…
先日は gRPC の Unary RPC で HTTP/2 の挙動を確認してみました。 gRPC Unary RPC で HTTP/2 の通信を追ってみる - 理系学生日記はてなブックマーク- gRPC Unary RPC で HTTP/2 の通信を追ってみる - 理系学生日記 今日は、gRPC の Server Streaming RPC を…
gRPC には Interceptor という概念があるというのを先日のエントリで書きました。 ただ、じゃぁ Interceptor ってどういう風に作るんやっていうところまでは書けなかったので、今日はそのあたりです。 簡単に試せる話題として、送受信ログを出力する仕組みを…
Unary と Streaming Interceptor mercari go-grpc-middleware Unary と Streaming Interceptor の前に gRPC の種類について書かないといけないのですが、 gRPC には 大きくわけて 4 つの RPC が存在しています。 Unary RPC Server streaming RPC Client stre…
ここ 2 ヶ月くらいずっと golang でバックエンドを書いています。 その中で、絶対に外せないなと思っているものの1つが pkg/errors です。 ぼくがこのライブラリを知ったのは、以下の記事でした。 Golangのエラー処理とpkg/errors Don’t just check errors, …
golang では crypto/cipher や crypto/aes を使って、AES で暗号化を行うことができます。 しかし、ブロック暗号化であるにも関わらず、なぜかパディングが定義されていない。 これじゃ暗号化できないやんけ、ということで、これと戦った記録です。 ブロック…
サーバを作る以上、クライアントがないと開発が面倒です。 しかし、gRPC はバイナリプロトコルである HTTP/2 上で Protocol Buffer をシリアライズに使います。 このため、テキストプロトコルである HTTP/1.x のようにクライアントとして curl を使うといっ…
gRPC サーバを作ることになったので、まずは基本的なところを押さえようと思います。 いろいろ調べつつ書いているのですが、gRPC 初心者なので、間違ったところがあれば指摘していただきたいです。 gRPC の種類 .proto からのサーバ・ソースの自動生成 gRPC …
どういうものか 何に使うのか いろいろあった 画像形式 写真編集アプリで時刻情報が消失する というわけで どういうものか 指定ディレクトリ配下の JPEG あるいは HEIC ファイルの日時情報を EXIF から読み取って、YYYYmmDD-HHMMSS.ext というファイルとして…
Emacs で go-mode を使っているとき、godef-jump でカーソル直下のシンボルの定義場所にジャンプすることができます。 一方で、そういえばジャンプ元に戻りたいんだけど…っていうときに、どうやって戻れば良いんだろっていうときに悩んでしまったのですが、 …
HTTP_PROXY なのか http_proxy なのかという大文字・小文字問題は Golang において実装時にどのように吸収するべきなのか、という疑問があったのですが、 net/http/transport の実装方法がなるほどなぁというかんじでした。 まず、主役となるのは envOnce と…
こちらも積読してたのでようやく読みました。 みんなのGo言語[現場で使える実践テクニック]作者:松木雅幸,mattn,藤原俊一郎,中島大一,牧大輔,鈴木健太技術評論社Amazon Golang の文法にはほとんど触れておらず、実践的なテクニックだったり、お勧めのライブ…
The Go Programming Language を読みました。 Go Programming Language, The (Addison-Wesley Professional Computing Series)作者:Donovan, Alan,Kernighan, BrianAddison-Wesley ProfessionalAmazon Golang が流行ってきていたので、じゃぁ買って理解する…
大量の住所を Google Maps 上にマッピングする必要が生じ、住所を緯度と経度に変換することになったので、いわゆるジオコーディングをプログラムすることにしました。 ジオコーディングに関しては、Google Maps API が無料で使用できて、かつ、扱いやすいの…