emahiro/b.log

Drastically Repeat Yourself !!!!

go

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

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つでの設定方法を記載しました。 VSCode https://github.com/fatih/gomodifytagsを使います。 これは VSCode に限らず各種 Editor 向けにに Go の Struct tag の自動生成機能を…

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 こういった大きなカンファレンスで発表するの…

メモリアロケーションなしで slice をフィルタする

go

令和最初のエントリです。 連休前に教えてもらったことについてまとめました。 このエントリに記載する内容については、github の SliceTricks · golang/go Wiki · GitHub に記載されてる内容になります。 go の sliceについて go の slice はポインタ型です…

CircleCIの高速化ログ

Overview circleci でのビルド時間の高速化をやったので、その備忘録です。 方針 circleci の高速化 = ビルド時間の短縮になるんですが、そんなことしたことなかったのでまず何をするかを考えました。 circleci の中でやってることは基本的には、手動で叩い…

ビルドタグで appengine.Main() の向き先が変わる話

Overview AppEngine の Go1.11 対応において gin の version を最新の 1.3 系にあげたときに以下の問題にはまったのでその調査メモです。 gin の version を現時点(201904)での最新の 1.3 にあげ、appengine.Main() を使うコードに変更すると、AppEngine / G…

intellij で go module の設定を行う

intellij で go module を設定して開発を行う設定を行います。 手順 Preference > Languages & Frameworks > Go > Go Modules(vgo) を選択。 Enable Go Modules(vgo) integration を ON にする。 Vgo Executable は 使っている go の version(SDK) を指定す…

自前でUnmarshalを実装したときの panic を回避する

go

カスタム Struct に自前で Unmarshal を実装して json -> object に decode するときに無限ループを引き起こして panic しないようにするTipsです。 サンプルケースですが、以下のコードは json を decodeす るときに panic を引き起こします。 type Person …

『静的解析をはじめよう - Gopherをさがせ!』をやった

go

golang.tokyoが公開しているCodeLabをやってみました。 golangtokyo.github.io 普段からあまりコードの静的解析をやっているわけではありませんが、Goで静的解析をする場合にはどうするのか、というのを学ぶにはとてもいい教材でした。 特に「構文解析」の章…

GCSのObjectをCopyするときの挙動について調べたこと

業務でGoogle Cloud Strage にObjectをコピーするときの挙動について調べたのでまとめておきます。 GCSでのコピーは cloud.google.com/go/storage 配下にある copy.go に処理の中身が書いてあります。 github.com 実際にGCSでコピーをするときには以下のよう…

AppEngineで静的ファイルをサーブする設定について

ふとした拍子に忘れてしまうappengineでの静的ファイルをサーブする設定についてのメモです。 内容はほぼ Serving Static Content | App Engine standard environment for Go | Google Cloud に載ってる内容です。 例えば以下のようなディレクトリ構成を考え…

AppEngineのGo1.11のランタイムを簡単に試してみた

GAE/Go1.11のランタイムを実際にデプロイまでしてみましたよっていう内容です。 準備 ディレクトリ構成 以下のようなディレクトリ構成でプロジェクトを作成しました。 $GOPATH └── src ├── app │ ├── app.yaml │ └── main.go └── handler ├── index.go └── i…

AppEngineのGo1.11.0のランタイムについて浅く調べてみた

GAE/GoでGo1.11のランタイムがBetaになっていたので調べた内容をまとめてみます。 なお、基本的にはドキュメントに書いてあることを舐めてるだけの内容になります。 参考 先に参考を明示しておきます。ここだけ見れば、GAE/Goを現在使ってる人ならその差分が…

net/http だけでRESTなサーバーを作りたい

go

やりたいこと 当初の想定は以下のような感じでRESTFullなwebサーバーを標準の net/http パッケージだけで書こうと思います。 package main import ( "fmt" "handler" "net/http" ) var port = 8000 type methodHandler map[string]http.Handler func (m meth…

Goので外部パッケージをimportする

go

以下のようなパッケージ構成のGoのプロジェクトを考えます。 $GOPATH ├── handler │ └── index.go ├── main.go └── middleware └── log.go これだと main.go で localに作成した handler や middleware を import しようとするときに、 Unresolved reference…

iTerm2で goapp test の実行結果を見やすくする

goapp test で単体テストを走らせた時に RUN/PASS/FAIL が見づらいので iTerm2 で goapp test を見やすくする設定を追加します。 設定方法 Preference > Profile > Advanced > Triggers で特定の文字列だった時にハイライトさせるTriggerを設定します。 例え…

引数で指定した型で出力する型を変更するTips part2

go

昨日以下のエントリを書きましたが json.Unmarshal versionで書いていたので stream でレスポンスを扱う方も追加で記載します。 ema-hiro.hatenablog.com streamを使うパターン func HogeSetter(url string, out interface{}) error { resp, err := http.Get…

引数で指定した型で出力する型を変更するTips

go

課題感 goは静的型付き言語でfuncの返り値に指定した型は厳格に守る必要があります。 一方で返り値のみ異なるケースで内部の実装の詳細が型以外ほぼ同じような関数を定義したいときは結構あります。 goだと特に同じようなコードを書くことになりがちでこれを…

AppEngineについて考えてること

AppEngine大好きっ子で1年近くAppEngineをPaaSに採用した環境で開発を行ってきた人間としてちょっと考えたことをつらつら書いてみます。 ※1 このエントリは今日(2018/09/21)同僚の人と色々話してた内容をベースにしてます。 ※2 あくまで個人の感想、というか…

Test時に値を書き換えて元に戻すサンプル

go

メルカリさんのこのブログを呼んで表題のテスト時に置ける値の一時的な書き換えとresetの方法がとても便利だったのでメモりました。 tech.mercari.com テストを回すときに実際のURLでなく適当なダミーURLを叩いてHTTPのレスポンスをモックしたい場合があると…

Table Driven Testのテストケースの書き方について

go

Goでは単体テストを書く場合に Table Driven Test が可読性、保守性の観点から推奨されています。 そのTableDrivenTestにおいてテストケースの書き方について備忘録です。 テストケースの書き方 ケースごとのstructを定義する 以下のようなコードを想定しま…

localでのgoの管理においてbrewをやめた話

go

Overview goのversionを複数使いたいケースにおいて brewを使ってしまうと常に最新のgoのversionになってしまいます。 複数versionを管理するために goenv もありますが、高々goのversion管理のためだけに新しいツールを入れたりすると無駄な依存を発生させ…

goappコマンドを入れ直した話

Overview GAEを使う場合、localにapp-engineのSDKを入れる必要があります。 少し前までは brew install app-engine-go-64 を叩くと goapp コマンドがlocalにinstallされ、使うことができましたが、ある時から formulla から消えてしまい、brew 経由でDLする…