理系学生日記

おまえはいつまで学生気分なのか

golang

Golangでファイル差分をわかりやすく表示する

ファイルを出力する機能のユニットテストを書く場合に、期待値としてのファイルと生成したファイルを比較し、差分があれば当該差分をきれいに表示したい場合があります。 これはgo-diffを利用することで可能になります。 例えば、以下のような形です。テスト…

Semantic VersioningをGolangで扱う

ローカルにインストールされているツールが想定のバージョンであるかを確認するために、Golangでチェックを入れることになりました。昨今のツールの多くはSemantic Versioningをサポートしているので、Semantic Versioningで比較したい。 しかし、Semantic V…

go-playground/validatorでYAMLファイルのバリデーションを行い、エラーのあったフィールドを表示する

Golangでの有名バリデーションライブラリにgo-playground/validatorというのがあります。ライセンスはMITで使いやすい。 このライブラリを使ってYAMLファイルのバリデーションを実装したのですが、そこそこ悩まされました。 本ライブラリはYAML等のバリデー…

毎回go.sumのconflictを解消するのがつらすぎるので、.gitattributesでunion merge driverを使うよう指定する

Golangのツールをチームで開発しているのですが、Merge Requestをmergeする度にgo.sumとのconflictが発生する。つらい。 実のところは「つらすぎる」というほどつらくはないのですが、毎回conflict markerの<<<<<<<を消していく作業で人生を浪費するのはつら…

Golangでバイナリを配布するとき、go-licensesとgoxzを使って利用モジュールのLICENSE、NOTICEを同梱する

Golangで作ったプロダクトを公開・配布するとき、課題となるのが利用するモジュールのライセンスです。 MITライセンスであれ、MPLライセンスであれ、利用するモジュールのLICENSEやNOTICEファイルを同梱することになるでしょう。 goxzとgo-licensesを使うと…

Golangのファイル差分におけるコードカバレッジの強調表示をGitLabで実現する

テスト文化を作るためには、自分の書いたコードのどこがテストされているのかを明示するのも意味があります。人は「ここがテストされていないよ」と言われたら、テストしたいと考えるものだからです。知らんけど。 誰もが見える場所にカバレッジなどの数値を…

GolangのカバレッジをGitLabのMerge Requestに表示させたい

マネジメントを行う上では以下のような取り組みが重要です。 何らかの定量指標を収集し、目標を設定する その数値を誰もが見る場所に置く これはテスト文化を作るときにも例外ではありません。 「テストを書こう」といくら啓蒙したところで、ぼくの経験上効…

Golangで複数パッケージをまとめてカバレッジを取得する

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でナノ秒まで時刻を出力したい

golang の構造化ロガーのうち有名なものの一つに logrus があります。構造化ログとして JSON フォーマットを指定するとするとだいたいこんな感じになります {"level":"info","msg":"hello world","time":"2019-09-01T06:56:59+09:00","user":"kiririmode"} …

gRPC におけるタイムアウト時の挙動

gRPC には、当然ながらクライアントサイドでタイムアウトが設定できます。このとき、HTTP/2 上でどういうフレームが流れるのかを整理してみます。 タイムアウト設定 golang node HTTP/2 での挙動 まとめ タイムアウト設定 golang Golang の場合は、 context.…

gRPCにおけるmetadata、そしてそれを node.js client から取得する

gRPC には metadata という概念が存在します。 これは RPC においての付加情報ということになっており、golang からの扱いは簡単です。ただし、node.js を client として使う場合にどのようにして metadata を「取得する」かあまり情報がなく苦しみました。 …

gRPC で golang server/node client を SSL に対応させる

今回は、gRPC で SSL 通信を行おうと思います。 環境としては、サーバは golang、クライアントは node.js という構成です。 ルート認証局、証明書を作成する。 golang の gRPC サーバに組み込む Node.js client を SSL に対応させる node のソース ルート認…

node.js の gRPC clientで client side keep-alive (定期的な PING frame 送出)を実現する

gRPC では HTTP/2 を使っており、HTTP/2 では 1 本の TCP のコネクションの上で stream を多重化します。このため、TCP のコネクションはずっと張りっぱなしになることが多く、どのようにしてこのコネクションを維持するかが重要な場合があります。 問題とな…

gRPC 関連でデバッグを行うときに指定すると便利かもしれない環境変数たち

Go で gRPC 周りをデバッグするときに設定しているとデバッグするのが楽になる環境変数がいくつかあります。このあたり、情報が色んな所に散財しているので、ちょっとまとめますね。 GODEBUG その他 GRPC_VERBOSITY, GRPC_TRACE GRPC_GO_LOG_SEVERITY_LEVEL,…

golang でのデバッグに非常に便利な go tool trace

なぜかおかしな振る舞いをするサーバプログラムをデバッグするというのは、それなりに骨の折れる作業です。大量のソースを前に「ここが怪しい」と言いながらデバッグログを埋め込むこともあるでしょう。また、lsof や ss といったコマンドやスタックトレース…

Protocol Buffer で時刻(タイムスタンプ)を扱いたい

API でのリクエスト、レスポンスのフィールドとして、タイムスタンプを定義したいときがあります。 しかし、Protocol Buffer の言語仕様上、Scalar として日付、時刻関連の型は定義されていません。このようなとき、どのように対処すれば良いでしょうか。 日…

gRPC の Server Streaming RPC で HTTP/2 の挙動を確認してみる

先日は gRPC の Unary RPC で HTTP/2 の挙動を確認してみました。 gRPC Unary RPC で HTTP/2 の通信を追ってみる - 理系学生日記はてなブックマーク- gRPC Unary RPC で HTTP/2 の通信を追ってみる - 理系学生日記 今日は、gRPC の Server Streaming RPC を…

初歩から学ぶ gRPC の UnaryServerInterceptor、StreamServerInterceptor のつくりかた

gRPC には Interceptor という概念があるというのを先日のエントリで書きました。 ただ、じゃぁ Interceptor ってどういう風に作るんやっていうところまでは書けなかったので、今日はそのあたりです。 簡単に試せる話題として、送受信ログを出力する仕組みを…

gRPC の Interceptor 概観

Unary と Streaming Interceptor mercari go-grpc-middleware Unary と Streaming Interceptor の前に gRPC の種類について書かないといけないのですが、 gRPC には 大きくわけて 4 つの RPC が存在しています。 Unary RPC Server streaming RPC Client stre…

pkg/errors はもう外すことができないライブラリ

ここ 2 ヶ月くらいずっと golang でバックエンドを書いています。 その中で、絶対に外せないなと思っているものの1つが pkg/errors です。 ぼくがこのライブラリを知ったのは、以下の記事でした。 Golangのエラー処理とpkg/errors Don’t just check errors, …

golang で AES/CBC/PKCS#7Padding の暗号化・復号化

golang では crypto/cipher や crypto/aes を使って、AES で暗号化を行うことができます。 しかし、ブロック暗号化であるにも関わらず、なぜかパディングが定義されていない。 これじゃ暗号化できないやんけ、ということで、これと戦った記録です。 ブロック…

gRPCをcurlのようにコンソールから呼び出せるgrpcurl

サーバを作る以上、クライアントがないと開発が面倒です。 しかし、gRPC はバイナリプロトコルである HTTP/2 上で Protocol Buffer をシリアライズに使います。 このため、テキストプロトコルである HTTP/1.x のようにクライアントとして curl を使うといっ…

gRPC サーバを golang でつくるときの基本を押さえる

gRPC サーバを作ることになったので、まずは基本的なところを押さえようと思います。 いろいろ調べつつ書いているのですが、gRPC 初心者なので、間違ったところがあれば指摘していただきたいです。 gRPC の種類 .proto からのサーバ・ソースの自動生成 gRPC …

写真のファイル名を EXIF の日時付きの名前にリネームするツールつくった

どういうものか 何に使うのか いろいろあった 画像形式 写真編集アプリで時刻情報が消失する というわけで どういうものか 指定ディレクトリ配下の JPEG あるいは HEIC ファイルの日時情報を EXIF から読み取って、YYYYmmDD-HHMMSS.ext というファイルとして…

go-modeでgodef-jumpした後、jump元に戻りたい

Emacs で go-mode を使っているとき、godef-jump でカーソル直下のシンボルの定義場所にジャンプすることができます。 一方で、そういえばジャンプ元に戻りたいんだけど…っていうときに、どうやって戻れば良いんだろっていうときに悩んでしまったのですが、 …

golangでHTTP_PROXY、http_proxy環境変数の差異を吸収する

HTTP_PROXY なのか http_proxy なのかという大文字・小文字問題は Golang において実装時にどのように吸収するべきなのか、という疑問があったのですが、 net/http/transport の実装方法がなるほどなぁというかんじでした。 まず、主役となるのは envOnce と…

みんなのGo言語

こちらも積読してたのでようやく読みました。 みんなのGo言語[現場で使える実践テクニック]作者:松木雅幸,mattn,藤原俊一郎,中島大一,牧大輔,鈴木健太技術評論社Amazon Golang の文法にはほとんど触れておらず、実践的なテクニックだったり、お勧めのライブ…

The Go Programming Language

The Go Programming Language を読みました。 Go Programming Language, The (Addison-Wesley Professional Computing Series)作者:Donovan, Alan,Kernighan, BrianAddison-Wesley ProfessionalAmazon Golang が流行ってきていたので、じゃぁ買って理解する…

Golangでジオロケーションを行ってみる

大量の住所を Google Maps 上にマッピングする必要が生じ、住所を緯度と経度に変換することになったので、いわゆるジオコーディングをプログラムすることにしました。 ジオコーディングに関しては、Google Maps API が無料で使用できて、かつ、扱いやすいの…