emahiro/b.log

Drastically Repeat Yourself !!!!

go

goimportsでlocalのパッケージのsort順序を編集する。

-local付きでgoimportsする goのformatとimportパッケージをよしなにしてくれる goimports コマンドですが、localで独自に定義したpackageをimportするときにこんな風に並んでほしいことが多いです。 import( // 標準pkg // github.comとか有名所pkg // loca…

go get 時の `import path does not begin with hostname` でハマった話

go

1年近くGo書いててGOROOTの設定が間違ってたっていう話を書くのもお恥ずかしい話ではあるんですが備忘録のため 環境としては brewでgoを入れている gorootをテキトーにしか設定してなかった($HOME/goみたいな) エラーの内容は go get コマンドを叩くと pack…

【Go】WebサーバーでLogを表示する

go

やりたいこと Goで立てた簡易webサーバーにアクセスした時に標準出力でLogを表示させるようにします。 webサーバーを立てる /src/todo main.gp handler/main.gp main.go package main import ( "fmt" "net/http" "todos/handler" ) var addr = ":3000" func …

ポインタ型のvarでの初期化でハマった話

go

ハマったところ CLIで特定の画像をbinary化してから画像にしてPostで送信する、というコードを書こうと思った時にポインタ型の初期化についてハマったのでメモ。 ざっくり書きたかったコードは以下(※ コードは適当) func UploadImgFile() error { // 画像を…

GCSに保存してあるデータを取得する

※ 当たり前のことでドキュメント通読すればいい話ですが、ちょっとハマったので備忘録として書きました。 Google Cloud Storage(GCS)に保存してあるデータを取得するという話です。 GCSから取得する時 storageパッケージを使います。 godoc.org データを取得…

空のstructにはomitemptyが効かない

go

以下のようなコードを書いたときに https://play.golang.org/p/JVvctX-ir-w {} を返ってくることを期待しているのに、 {"field":{}} が返ってくる、ということにずっとハマっていました。 これは encoding/json の omitempty の振る舞いとして空のstructにom…

gin✕GAEの環境でhandlerのunittestを書く

前提 goのhandlerレイヤー、MVCのApplicationで言うところのcontrollerのレイヤーのテストを今まで書いてきたことは少なかったのですが、意図しないinputに対して、正常なレスポンスを返さない(400とか401とかを返す)ようなEPを想定した時にhandlerとは言え…

gae上のアプリに対してService Workerを登録する

やりたいこと gae上で動いているアプリに対してService Workerを登録します。 やること service worker用のjsファイル sw.js を登録すること。 sw.js ファイルのレスポンスヘッダーに Service-Worker-Allowed:/ を登録すること。 手順 1. sw.jsを読み込むに…

【Golang】部分文字列を抽出する

go

golangの文字列から特定の位置の文字を取り出したい時に [:] を使えます。 package main import ( "fmt" ) func main() { s := "abcdefg" fmt.Printf("%+v\n", s[:]) fmt.Printf("%+v\n", s[1:3]) } /* output > abcdefg > bc */ cf. https://play.golang.or…

GoLandでriotのtagファイルをシンタックスハイライトする

Overview GoLand(というかIntelliJ)がデフォルトで対応していないtemplateファイルをカスタム登録する方法 以前tmplファイルの設定方法は書きました ema-hiro.hatenablog.com 手順 前回と同様です。 Preference ▶ Editor ▶ FileType ▶ HTMLを選択。 riot.js…

Use httpmock with fmt

go

Summary golangのhttpのmocking packageである httpmock で fmt packageを使ってstring型に変換したときにハマった話を書きます。 httpmock packageはこちら github.com How to Use var resJson = ` { "id": 1, "name": "taro" } ` func TestHttpMock(t *tes…

GraphQLを書いてみた話

仕事ではjson-shemaを使ったRESTを使っています。 API定義がドキュメント化されていることの意義 マイクロサービスアーキテクチャを元に開発していると、コンポーネント間のインターフェースの定義なしにはやっていけないと感じています。 もしjson-schemaが…

Goにおける簡易だけど最低限の情報が入っているerror出力方法の知見

go

errorについての検討 golangはerrorまで含めて愚直に書くことが求められたりして、それはそれで慣れではあるなーと感じているのですが、errorのformatが人に依存したり、1人で個人開発とかしているとerrorをちゃんと書いてるのがめんどくさくなったりするの…

structのomitemptyの挙動と使い所の検討

go

golangのstructでjsonのencodingのためのpropertyに omitempty をつけた時の挙動とその使いどこを検討します。 omitemptyタグとは https://golang.org/pkg/encoding/json/#Marshal には以下の用に記載されている。 The "omitempty" option specifies that th…

structに埋め込んだmapの要素を上書きする

go

やりたいこと struct内に埋め込んだmapのfieldの値を上書きするという処理を考えます。 下記のようなサンプルコードがあったときに originalSamples のItemsの中身を上書きするような処理です。 type Samples struct { Items map[string]string } originalSa…

goで任意引数でtemplateでの表示を変えたりしたい場合の考察

go

golangで関数に任意引数を取り、その任意引数にmapを指定することで、template場でmapで定義したinterfaceを見て表示を変えたいという実装を考えます。 やりたいこと 以下のようなことをしたいと想定します。 func RendarHTML (flags ...map["string"]interf…

goのテストのカバレッジを計測する

go

関わっているプロダクトでテストのカバレッジ取得してみようと思ったので、標準で動作している機能を使ってgoのテストカバレッジを計測してみました。 coverageを計測する coverageを測定するpackageを指定して、カバレッジを図るオプション -cover を指定し…

【学習】「GOならわかるシステムプログラミング」~Chapter 3~

go

※「GOならわかるシステムプログラミング」の3章の学習記録です。 主に PNGファイルを分析してみる PNGファイルに秘密のテキストを入れてみる の2節の内容の学習記録です。 sample sampleコードは以下 package main import ( "bytes" "encoding/binary" "fmt"…

json.Unmarshalではnilの参照型へのmappingはできない

go

httpレスポンスを構造体にmappingする際に以下のようなコードを書くケースは多々あると思います。 ※ error handlingは割愛 // responseの取得 resp, _ := http.Get(url) body := resp.Body defer body.Close() // []byteへの変換 b, _ := ioutil.ReadAll(bod…

これからはgoのstreamを使っていこうと思った話

go

これからgoでjson形式のデータをstructにmappingする際にはstreamを使うことを決意した話です。 経緯 下記のエントリーに触発されました。 christina04.hatenablog.com goでjsonをstructにmappingすることをはじめ、 io.Reader のデータを扱うときは一度 []b…

goでAPIのスケルトンを作成する

以前書いた以下のエントリーからさらい一歩進めました。 ema-hiro.hatenablog.com ema-hiro.hatenablog.com 内容は net/http かgorilla/mux を使ってroutingを作る超薄いAPIサーバーを作成する際にこれだけコピれば簡単にapiサーバーを立てることができるみ…

GolangではてなのRSSを取得するクライアントを作成する

go

仕様 はてなのRSSのfeedのURLを登録する 登録したURLでRSSを取得する RSSをparseする 実装 sampleでは、はてなの「テクノロジー」のホットエントリーを使用する。 http://b.hatena.ne.jp/hotentry/it.rss 実際に叩いてみる $ curl -i http://b.hatena.ne.jp/…

goでmecabを動かす

go

簡単な分かち書きのCLIツール作ってみようと思ったのでmecabをgoで動かして見ました。 やったこと goでmecabを動かすこと mecab-golangのinstall 以下のmecabのクライアントを使いました。 github.com 最初に mecab をinstallし、mecab-config が入っている…

Amazon Product Advertising APIのレスポンスをパースする

go

やったこと Amazon Product Advertising APIを使ってISBNから書籍情報を取得するプログラムを書く際に、AmazonのAPIのレスポンスは json ではなく、xmlでデータが帰ってくるので、このxmlをGolangでparseするためにしました。 ※ 今時xmlかよ!っと思ってちょ…

Amazon Product Advertising APIを使ってISBNコードから書籍情報を取得する

go

やったこと Amazon Product Advertising APIを使って書籍情報を取得すること 書籍情報の検索フックにはISBNコードを使ったこと 利用する際にハマったこと 事前準備 以下は事前にやってあるものとします。 Amazon Associate への登録 Associate TagにこのIDを…

os.Openするときの相対パスの書き方

go

goで os.Open(filename string) を実行するときに読み取りファイルを特定のディレクトリにまとめておいたときに os.Open で指定する相対パスがどう決まるかのメモです。 答えはmain.goからの相対パスになります。 例えば以下のようなディレクトリ構成のとき …

depでginを入れる

go

やったこと depをつかってginをinstallして動かすまで。 depのinstall方法 以下を見て下さい。 ema-hiro.hatenablog.com depでginを入れる depでginをinstallします。 # projectのROOTにいるとする。 $ cd ./src/{project_name} $ dep init $ dep ensure -ad…

go ✕ ajaxを書いてみた

go

サマリ goで簡易的なajax通信するアプリを作ったのでそのメモ 構成 環境 jquery 3.2.1 go 1.9.2 ディレクトリ構成 - src - app - main.go - handler - handler.go - render - render.go - templates - index.tmpl sampleコード main.go var port = "8080" fu…

GoLandの設定をremoteで管理する

Golandの設定をremoteで管理したかったので、その設定方法をメモとして書いておきます。 背景 PC変えたりすると使っていたPCの設定が全て初期化されて1から作り直すのめんどくさいです。 PCやeditorくらいであればもしかしたら、設定ファイルをgithub等にあ…

QiitaのAPIで遊ぶ

go

サマリ APIで遊びながらgoの学習をするシリーズ第二弾で、Qiitaで記事を検索するクライアント goota をgoで書きました。 コードはこちら github.com demo ざっくり仕様 Requirement tagを指定できる。 tagはカンマ区切りでOR条件で検索出来る。 ストック数が…