emahiro/b.log

Drastically Repeat Yourself !!!!

go

chi で独自の middleware 使う

go

Overview chi で独自 middleware を使う上で使い方を忘れていたのでその備忘録。 備忘録 router.Use(func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // middleware でやりたい処理 next.S…

AWS Go SDK V2 を使ってみる

Overview AWS SDK for Go V2 について AWS の設定をロードする 独自で環境変数を持ってる場合 DynamoDB を使う DynamoDB クライアントを Load する リソースを更新する expression はまだ feature だった 余談: 毎回めんどいなーところと思うところ Transact…

strings.Split は分割できない時でも長さ1の slice を返す。

go

https://play.golang.org/p/ss6gWvidE2u でなんで長さ 1 の slice が返ってくるんだろーって悩んでたのですが、、、 // Split slices s into all substrings separated by sep and returns a slice of // the substrings between those separators. // // If…

参照型変換メソッドを func で表現する

go

Overview タイトルの通りなんですが、Go の struct をするときにその struct のあるフィールドを参照型にすることがあると思います。 この参照型のフィールドに値を代入するために、プリミティブな型を参照型に変換するだけの関数を作成することがあるかと思…

同一文字列を繰り返す strings.Repeat

go

Overview テストケースで使えそうな strings の機能を教えてもらったので書いておきます。 テストケース書くときに使えることを教えてもらったhttps://t.co/tvtsGQjufL— ema (@ema_hiro) 2021年1月19日 Strings.Repeat https://golang.org/pkg/strings/#Repe…

Go で文字数をカウントする

go

Overview Go 言語で文字数をカウントする方法について記載します。 そもそも文字数を数えるとは? LINE Engineering のこのブログが詳しくてわかりやすいです。 engineering.linecorp.com ある文字列の文字数を計算するときに、コンピューター上で「何文字」…

Go で unused なコードを検出する

go

Overview staticcheck を使って unused なコードを一括で検査します。 Install $ go get honnef.co/go/tools/cmd/staticcheck ref: https://staticcheck.io/docs 検出する U1000 がどこからも参照されていないコードの警告コードになるので、検査結果を grep…

AWS Lambda 向けに trace 付き Logger を作った

Overview 業務で AWS Lambda を使用してとある実装をしたのでその紹介です。 久しぶりに業務でOSS作りました。https://t.co/5fNBhiRsle— ema (@ema_hiro) 2020年11月19日 github.com なぜ作ったのか? Lambda 上でログを吐くとデフォルトで Cloud Watch Logs…

プライベートリポジトリを go get する

Overview go get でプライベートリポジトリを fetch するのに、コケてその調査で時間を溶かすことが何度か重なったので対応方法について記載します。 またプライベートリポジトリに依存してるプロジェクトで Github Actions を回すときもプライベートリポジ…

指定したディレクトリを goimports の対象から外す

go

import 順を自動で sort するときに、goimports の対象から外したいディレクトリがあるときに $GOPATH/src/.goimportsignore を設定するといいらしいけど、リポジトリごとのディレクトリ分けに依存したり、個人の開発環境に依存するかなーと思ったで、なんと…

MySQL Driver で time.Time 型をパースする

go

以下のような Struct を考える。 type User struct { ID int64 Name String CreatedAt time.Time UpdatedAt time.Time } time.Time の時刻型をもつフィールドがある時、MySQL の時刻型のカラムをそのまま Scan しようとすると以下のエラーが出る。 sql: Scan…

久しぶりに sqlx を使ったら色々忘れてた

Overview すごい久しぶりに sqlx を使ったら色々忘れてたので備忘録です。 github.com driver は blank import しておかないといけない driver の種類は下記を参照 https://github.com/golang/go/wiki/SQLDrivers 例えば MySQL を Driver として選択したい場…

Go1.14 をサポートしました

go

Go の Release Policy に合わせて、以下のリポジトリを Go.1.14対応しました。 合わせて Go1.12 のサポートを切りました。 Each major Go release is supported until there are two newer major releases. ref: Release History - The Go Programming Langu…

Go をバージョンごとにコマンドとして入れる

go

こういうことができる。便利。 $ go get golang.org/dl/go1.X.X $ go1.X.X download $ go1.X.X version go version go1.X.X linux/amd64 公式のインストールページにも記載してある。 https://golang.org/doc/install#extra_versions

僕の考える net/http の定数の使いどころ

go

Overview Go の net/httpパッケージ には HTTP に関連する定数が予め定義されており、HTTP クライアントを実装するときなどに自前で定義したり、GET や 200 といった定数を実装しなくてもいいように、標準の net/http がデザインされています。 こういう実装…

関数を引数に指定して CallBack のように振る舞わせる

go

Overview 関数を引数に指定してすることで、呼び出し先の関数内にて、特定の条件で指定した関数を実行する (Callback のように振る舞わせる) 実装方法をやってみたのでその記録を記載する。 Log github.com Usecase R/W の競合を発生させないために sync.Mut…

ログを出力する車輪の再発明をしてみた

go

Go の 標準の log パッケージ の実装をベースに自前で管理のログ出力部分を実装してみました。 やったこと Go の標準の log パッケージをベースにして自前でログを実装する機会があったので、そもそも log パッケージ内の実装を読んで見ようと思ったのがきっ…

Go で n 番目の要素を削除する

go

大した話じゃないんですけど、忘れてたので備忘録です。 strs := []string{"a", "b", "c", "d", "e"} // "c" を削除する。 idx := 2 strs = append(strs[:idx], strs[idx+1:]...) fmt.Println(strs) ref: https://play.golang.org/p/3QP4OXw2X0u

Go の httptest で立てたサーバーにアクセスする

go

テストなどで実際にサーバーを立てずに、HTTP のリクエストをシミュレートしたいときに httptest を使いますが、この httptest で立てたダミーサーバーそのものアクセスする方法はないかを調べてみました。 Motivation あるテストをメンテしていた時に httpt…

Go で意図的に競合状態を発生させる

go

Summary Go では concrrent map writes のような競合状態の可能性がある実装があるときに排他ロックをかける。 競合状態を回避するためのサンプルとしてロックをかける実装はたくさんインターネット上に情報が出てくるが、そもそも意図的に競合状態を作り出…

リポジトリのオーナーを移行しました

go

報告 以下のリポジトリのオーナーを移行しました。 https://github.com/emahiro/aelog -> https://github.com/DeNA/aelog https://github.com/emahiro/aehcl -> https://github.com/DeNA/aehcl App Engine の 2nd Gen 移行のために業務で作っていたものです。…

App Engine Logger の更新

Overview 以前作成した ae-plain-logger を aelog としてパッケージ名を変更した。 github.com Motivation emahiro/aehcl とシリーズものとして合わせたかった。 ローカルだと JSON じゃなくてテキスト出力できた方が便利とコメントもらった。 Testable Exam…

解決済み: net/http.Header の Clone の実装についての疑問点

go

net/http の Header の Clone の実装について調べる機会があったので、そこで気になったことをまとめました。 net/http.Header の cloneHeader の実装 本家の Clone の処理は以下 // Clone returns a copy of h. func (h Header) Clone() Header { // Find t…

glc(go local cache) というライブラリを作りました

go

[]byte でローカルにキャッシュを保存する glc (go local cache) というライブラリを作ってみました。 Motivation APIのレスポンスやそんなに頻繁に更新しないデータを一定時間ローカルにキャッシュとして持っておきたいケースは多いと思います。 Go であれ…

Struct tag の記法を編集する

Go の struct tag の記法を編集する方法を記載します。 IntelliJ と VSCode の2つでの設定方法を記載しました。 IntelliJ IntelliJ はデフォルトの自動 struct tag 補完は snake_case が採用されているのですが、仕事ではほぼ camelCase しか使わないのでな…

go get でインストールするツール群を最新にする

go

goimports, gopls などの go get で入れたツール群を最新版にアップデートする方法 # ツールごとに最新版にする go get -u golang.org/x/tools/cmd/goimports # cmd で使えるツール群を一括で最新版にする go get -u golang.org/x/tools/cmd/... # いっその…

slice 操作や検証のあれこれ

go

ある slice の操作や検証をするときにスッキリ書く方法を教えてもらったので備忘録。 ※ 随時更新(忘れて新しくエントリ書くこともあるかも) 重複する要素を持つ slice を弾きたいとき func duplicate(arr []string) bool { base := map[string]int{} for _,…

Go で書いた OSS を公開するまでの備忘録

以下のエントリで触れてますが、GitHubにOSSを公開したときの手順を備忘録として記録します。 github.com 手順 GitHubに公開用のリポジトリを作成し、コードをPushする LICENCE を設定する ciを連携する Go Report Card を登録する Godocを書く GitHubに公開…

GAE/Go1.12 において構造化ログを出力する

App Engine 2nd Generation で構造化ログを出力するための ae-plain-logger というライブラリを作成しました。 github.com aelog とは? ログエントリを json ペイロードとして標準出力に出力します。この時 traceID と spanID をログエントリに含めることで…

Go Conference 2019 Spring に登壇者として参加してきました

Go Conference 2019 Spring - Gocon に登壇者として参加してきました。 登壇の詳細は以下になります。 タイトル: 「Go1.9 で作られた App Engine のサービスを Go1.11 に移行した話」 登壇資料 speakerdeck.com こういった大きなカンファレンスで発表するの…