emahiro/b.log

Drastically Repeat Yourself !!!!

go

VSCode で delve を使った Debugger の環境を整える

go

Overview Go + Delve の利用環境を VSCode について記載します。 動機 普段の開発ではずっと古き良き? print debug を使って動作確認を行ってきていました。 もちろん手元の開発だけでなく remote での動作確認等では今でもこれよりシンプルで一般的な手法…

cloud.google.com/go/bigquery.Query の結果を go test の中で mock する

Overview やること Query Operation の場合 ハマったところ BigQuery のライブラリでどの API を Call しているのかわからなかった。 BigQuery の API のレスポンスを生成する Overview BigQuery を使った実装をしているときに、API リクエストを mock した…

actions/setup-go で Go のバージョンを指定する

actions/setup-go は Go のバージョンを指定しないとデフォルトで Go1.20 が使われているっぽい挙動に出くわしたので Go のバージョンを指定する方法のメモ。 github.com 気づいたきっかけは local で使用してる Go のバージョンと CI (GitHub Actions 上)…

BigQuery のクライアントを Go で実装する

Overview Go で BigQuery のクライアントを実装する BigQuery のライブラリは 2種類ある BigQuery の型はそれぞれ Go で対応する形が決まっている カラム名とフィールド名は一致させる必要がある 余談: ValueLoader を実装すると独自型を BigQuery の型を pa…

go-cmp/cmpopts を使って map の特定の key のみをフィルタする

go

Overview cmpopts.IgnoreMapEntries を利用する Ref Overview go-cmp を使って実際取得した値と期待値を比較するときに go-cmp/cmpopts を使って、二値の比較のオプションを設定することが出来ますが、この二値が map のときに map の中の特定の key に紐づ…

AWS Go SDK でのエラーハンドリングについて

AWS の Go SDK はその本体のコードを読もうとすると実装がものすごく抽象化されていて、慣れていないと実際のコードを追いかけることも結構難しい。 Go の実装でエラーの中身(型)を見て処理を変えたいケースやそもそもどういうエラーを返すのかを知りたい…

配列形式のクエリパラメータを受け取る実装について考えてみる

go

Overview Motivation 実装パターンについて GET /user?id=1,2,3 のパターン GET /user?id=1&id=2&id=3&id=... のパターン GET /user?id[]=1&id[]=2&id[]=3&... のパターン RFC 3986 を見る まとめ Overview ID=1, ID=2,... のようにクエリパラメータで指定し…

gonew コマンドを試してみた

go

Overview gonew とは? gonew を使う まとめ See Also Overview gonew コマンドを触ってみたので備忘録です。 go.dev gonew とは? 既存の Go のプロジェクトからコピペで作らずに、そのプロジェクトをテンプレートとして新規の Go プロジェクトを始める事が…

cockroachdb/errors でスタックトレースを取得するのが良さそうだった

go

Overview Go でエラーハンドリングするときにどこでエラーが発生したのかわかるように StackTrace を取得して、エラーメッセージと一緒に出力したいケースがあると思いますが、Go でStackTrace を取得するのはひと手間かかります。 「Go スタックトレース」…

http.Request をコピーする

go

Overview どういうケースか? 結論: Clone してから Body に詰め直す まとめ Overview Go の http.Request を二度読み込みしたいケースでハマったのでその備忘録です。 どういうケースか? API を書いていると認証・認可等のAPI全体に関わる共通の前処理を m…

Go で重複を削除する処理のパフォーマンスについて

Overview 具体的な実装方法 パフォーマンスについて Overview ※ 過去何度か上げた内容のエントリの更新版です。 Go で Slice から重複してる要素を排除する unique の処理について実装方法でパフォーマンスが異なるのでこのエントリを書いています。 最近暇…

time.Now() を使ってテスト結果の比較をするときにCreatedAt に幅を持たせる

go

知らなかったので備忘録です。 Overview go-cmp を使用して DB の Insert のテストを記述するとき time.Now() を使ってしまうと生成したデータと比較対象のデータでレコードの作成時刻( created_at )で誤差レベルの Diff が生じてしまいます。 ※ 生成時刻…

Go で Response Header を差し込む

go

Overview 大した話じゃないですが久しぶりに http を色々ゴニョゴニョするコードを書いていたら忘れていたので備忘録 Response Header を差し込む ※ サンプルは httptest の Server を立ち上げています。 // application/json を Response Header の Content…

Go1.20 から入った errors.Join が実は便利そうだった

go

Overview errors.Join について パフォーマンスについて Practice まとめ Overview Go 1.20 から errors パッケージに導入された errors.Join は複数のエラーを詰め込んでも詰め込んだエラーそれぞれを Unwrap して取り出せる。 fmt.Errorf でも複数のエラー…

独自エラーを errors.Is でハンドリングするには Unwrap を実装する必要がある

go

Overview 何度も忘れるので備忘録。 きっとまた忘れて似たようなエントリを書く気もする。 Sample 独自エラーを errors.Is でハンドリングしたいときは以下のように Unwrap を実装する。 type sampleError struct { err error msg string } func (e *sampleE…

go.opentelemetry.io で spanID と traceID を取得する

Overview タイトルの通りですが以下の Pull Request にて go.opencensus.io から go.opentelemetry.io に乗り換えたので、乗り換えた際に従来通り span と trace を取れるようにした内容についてまとめます。 github.com そもそも OpenTelemetry とは? new …

squirrel という Go のクエリビルダーが便利

go

Overview 何をしてくれるのか 何をしてくれないのか ハマったこと In が明示的に用意されていない まとめ 余談 カラムを全て取得する 追記 Overview ライブラリの紹介記事です。 squirrel という Go の クエリビルダーが便利だったのでその紹介です。 github…

i/o timeout エラーをハンドリングする

go

Overview HTTP のりクエスをしたときに遭遇する dial tcp $IP: i/o timeout をハンドリングする方法について、そもそもこれがどうして発生するのか?と併せて調べた備忘録です。 http.httpError と net.Error Go で API クライアントを実装する際に遭遇する …

MySQL で時刻を時刻型で保存するか Unix Timestamp で保存するかを考えた話

Overview 前提 Unix Timestamp Pros Cons 時刻型(DATETIME) Pros Cons 結局どちらを選んだか? まとめ Overview MySQL でよくある CreatedAt と UpdatedAt を時刻型で保存するのか、Unix Timestamp で保存するかを考えてみたのでその備忘録です。 なお考える…

Go1.18 の Generics を使って Slice の重複削除の処理を書く

go

Overview golang.org/x/exp/slices を使って重複削除の実装を書く ベンチマークしてみる まとめ Overview Go でスライスの重複処理を実装するのに Generics が使えるので実際に実装してみました。 なお、Go1.18 以前の世界ではスライスの重複を削除するには …

Go1.18 の Generics を使ってみた話

go

Overview 実装に入門する サンプル実装 map の key を取り出す スライスのシャッフル処理 その他使えそうなユースケケースについて golang.org/x/exp 配下のパッケージついて まとめ Overview Go 1.18 がリリースされて目玉の機能である Generics について一…

Go の unstable version で gopls を使う

go

以下の設定をする。 # Create an empty go.mod file, only for tracking requirements. cd $(mktemp -d) go mod init gopls-unstable # Use 'go get' to add requirements and to ensure they work together. go get -d golang.org/x/tools/gopls@master gol…

strings package を使って簡単なメールのフォーマットチェックをする

go

Overview タイトルの通りです。Go の strings パッケージを使って簡単なメールアドレスのフォーマットチェックをします。 Go の正規表現は重たい(Go に限った話ではないですが)処理なので何かの文字列の検査をするときは strings package を使う方がパフォ…

SES SendRawEmail API を使って画像付きメールを送信する

Overview SES SendRawEmail API を利用して画像付きのメールを送信するための備忘録です。 実装について 基本的な実装方法については Amazon SES API を使用して raw E メールを送信する を参考にすればできます。 画像付きのメールを送信する上でポイントに…

go-redis で custom struct を set / get するときは BinaryMarshaler を実装する必要がある

go

Overview 以下に記載されてる内容のことです。 github.com go-redis を使って redis に値を set & get するときは encoding#BinaryMarshaler を実装する必要があるという話です。 Sample type X struct {} func Set (key string, x X) error { opt := redis.…

aws.EndpointResolverWithOptions はエラー時にデフォルトの Endpoint Endpoint Resolver を返す

タイトルの通りなんですが、AWS SDK Go V2 を利用して AWS の設定を初期化する実装をする際に Endpoint Resolver Option を設定したいケースがあると思います。 リージョンが異なるなどで AWS に各サービスごとに設定内容を変えたいケースなどが使いたいケー…

Go で画像を操作する

go

Overview 画像の拡張子を操作する 拡張子を変換する。 拡張子を判別する http.DetectContentType で拡張子を判定する 画像を作成する Encode/Decode する base64 Overview 業務において Go で画像を操作する方法を調べたので備忘録。Go の標準パッケージにあ…

AWS の API Call に Retry option を設定する

サマリ AWS のリソースを API 経由で Call するときに Retry option を使うと便利、というお話です。 メッセージを trigger にして Lambda を起動させるなど、イベント駆動でプロセスを開始するようなサービスを使うケースでは、失敗しても Retry してくれる…

文字列化した時刻を time.Time に parse する

go

これは何? どうやるか? まとめ これは何? https://pkg.go.dev/time#Time.String で Go の時刻を文字列化した値を再度 time.Time に変換する実装について記載してます。 どうやるか? Time.String() で Go の時刻を文字列として出力した値を time.Time に…

Go で BigQuery を叩くときは公式の Nullable 型を利用する

Overview Go で BigQuery (以下 BQ) のクライアントの実装して返されたクエリの結果を Entity に Unmarshal する方法について調べたのでその備忘録です。 pkg.go.dev Note 結論から言ってしまうと自前でゴリゴリ型指定して Unmarshal するよりも BQ の packa…