投稿

6月, 2016の投稿を表示しています

GoのWAF「echo」のMiddleware「echorequid」を作った

概要EchoフレームワークでX-Request-IDヘッダを付与するMiddlewareを作ろうと思った作って公開したechorequid構成Echoで動作する想定なので本体にはechoのものしか使っていない
テスト: goconvey + gomock処理の内容defaultの動きとしては以下すでにX-Request-IDがリクエストに付与されていれば何もしないリクエストヘッダのX-Real-IP、X-Forwarded-For、hostportをの順に確認しIPを取得取得したIPをヘッダに追加苦労した点開発自体は、全く苦労しなかったtravis-ciでテストを実行するのに躓いたのと、それをcoverall経由でバッジ表示するまでに無駄な時間を大変に割いた。つらい。 travisでテストするときの知見リポジトリ中の他パッケージを参照する場合、下手にディレクトリ名/パッケージ名でimportしていたりすると、ローカルのテストは通るのにTravisで回すときにImportPathが見つからないとか言われるので、./パッケージ名に修正した。正しいやり方がありそうだがよくわかってないし、そこまでの労力をつぎ込みたくはなかった。ひとまずパッケージを公開するところまで来たのでよしとする

[golang] 続・NullStringを綺麗にJSONエンコードするためのちょっとましになったやり方

前回の丁稚こちらの通り続・目的タイトルの通り。
sql.NullStringはNullableなカラムを引き受けてくれる型だが、そのままJSONに引き渡してもオブジェクトとして出力されてしまう。
これを綺麗にJSONとして出力したかった。綺麗でない例は以下のとおりbefore[{"id":1,"string":{"String":"aaa","Valid":true}},{"id":2,"string":{"String":"","Valid":false}}] after[{"id":1,"string":"aaa"},{"id":2,"string":""}] 方法Null*型をJSONに引き渡して好きなかたちで出力したい場合、MarshalJSONを自分で実装すれば良い。問題はSQL実行後のScanでアサインされないことだった。前回はここで糞長いコードを書いていた。よくわからなかったので、値をバインドする部分はコアのコードを丸コピして持ってきたfuncをコール。つまり手抜きである。今回は前回のコードを少し綺麗にした。実装ソース一旦ベタで貼る。短縮できる方法は試してみるが、考えるのが面倒だったのでconverterそのままコピペした。完全に良くない。// localtype パッケージ // アプリケーションローカルの型はここに格納したい package localtype import ( "database/sql" "database/sql/driver" "encoding/json" ) // type OptionalString // sql.NullStringのラッパー type OptionalString sql.NullString // func (o *OptionalString) Scan(value interface{}) error // …

golangでStatementのOpen/Closeについて軽く調べた

目的StatementはいつOpen/Closeすべきで、あるいはStatementをsql.Db.Prepareで生成せずにQueryを実行したほうが早かったりするのか、そのへんのことを計測してみようと思ったんだ。検証コード以下の様な感じ。もしかしたら変かもしれない。
ほんとはdeferでcloseする、とかそういうのは割愛ddlMySQLでやりましたCREATE TABLE `test`.`testtable` ( `id` INT NOT NULL AUTO_INCREMENT, `nullable` VARCHAR(45) NULL, PRIMARY KEY (`id`)); ソースコードpackage main import ( "database/sql" "log" "time" _ "github.com/go-sql-driver/mysql" "flag" ) const QUERY = ` SELECT t.id, t.nullable FROM test.testtable t WHERE nullable is not null AND nullable like ? ` func main() { var c = flag.Int("c", 1234, "help message for f") flag.Parse() db, err := sql.Open("mysql", "root:password@tcp(localhost:3306)/test") if err != nil { log.Fatalln(err) } defer db.Close() Exec(db, *c, "%") } func Exec(db *sql.DB, counts int, words string) { log.Printf("%d 回実行 開始", counts) st…

NullStringを綺麗にJSONエンコードするための稚拙なやり方

目的タイトルの通り。
sql.NullStringはNullableなカラムを引き受けてくれる型だが、そのままJSONに引き渡してもオブジェクトとして出力されてしまう。
これを綺麗にJSONとして出力したかった。綺麗でない例は以下のとおりbefore[{"id":1,"string":{"String":"aaa","Valid":true}},{"id":2,"string":{"String":"","Valid":false}}] after[{"id":1,"string":"aaa"},{"id":2,"string":""}] 方法Null*型をJSONに引き渡して好きなかたちで出力したい場合、MarshalJSONを自分で実装すれば良い。問題はSQL実行後のScanでアサインされないことだった。実装取得元テーブルサンプルなのでIDとNullableなカラムがあればよいCREATE TABLE `test`.`testtable` ( `id` INT NOT NULL AUTO_INCREMENT, `nullable` VARCHAR(45) NULL, PRIMARY KEY (`id`)) ソース一旦ベタで貼る。短縮できる方法は試してみるが、考えるのが面倒だったのでconverterそのままコピペした。完全に良くない。package main import ( "database/sql" "encoding/json" "os" "database/sql/driver" _ "github.com/go-sql-driver/mysql" log "github.com/Sirupsen/logrus" "fmt" &qu…