絶賛人生の迷子中、mix3です
golangでWebアプリ
を作ってレビューしてもらったらそれはもうフルボッコでそれこそ雄山のあれな感じでした
isucon3を元に手探りでやったため突っ込みどころを残してしまったようです
- panic使ってerror潰すのやめろ
- パス解決にCallerいらねーだろ
- 一応カレントディレクトリを判断したいという意図だったけどいらないらしい
- 動かし方 go run hoge.go じゃなくて go build hoge.go; ./hoge ってちゃんと書け
などなど
golangのWebアプリの良いサンプル、一応最初に自分で探してはみたものの良い感じのを見つけられず、後で「campoy/todoが参考になるんじゃない?」と教えてもらいました
最初に知りたかった… ちなみにパス解決の突っ込み
https://gist.github.com/mix3/9430209
mix3 ~/tmp/caller_sample $ go run main.go
2014/03/08 21:56:14 loading config (with caller) file: /private/tmp/caller_sample/config/config.json
2014/03/08 21:56:14 OK
2014/03/08 21:56:14 loading config file: config/config.json
2014/03/08 21:56:14 OK
mix3 ~/tmp $ go run caller_sample/main.go
2014/03/08 21:56:38 loading config (with caller) file: /private/tmp/caller_sample/config/config.json
2014/03/08 21:56:38 OK
2014/03/08 21:56:38 loading config file: config/config.json
2014/03/08 21:56:38 open config/config.json: no such file or directory
exit status 1
こんな感じで実行パスに左右されないパス解決が出来るので使い方間違ってなければ意味はある書き方だとは思うんですが、まあ今回は必要ないよってことですかね
revel使いましょ
そんな感じで センスの無い やつが手探りでやると悲惨なことになるのでWAFに乗っかった方がきっと良いと判断されたっぽい(実はそこらへん曖昧だったり…)のでとりあえずrevelにのっかることにしました
使い方は公式http://robfig.github.io/revel/index.htmlのtutorialとmanualとsample眺めてればなんとなく分かる感じです
以下revel/samples/bookingにはgorpとsqliteを使ったサンプルコードがあるのだけど、「mysqlにするにはどうすれば?」と少し悩んだのでメモ
conf/app.conf のsqliteの設定をmysqlのものに変更
db.import = github.com/go-sql-driver/mysql
db.driver = mysql
db.spec = root@tcp(localhost:3306)/alphawing
app/controllers/gorp.go のimportしているドライバをmysqlのものに変更
_ "github.com/go-sql-driver/mysql"
app/controllers/gorp.go の gorp.DbMap{} を mysqlのものに変更
Dbm = &gorp.DbMap{Db: db.Db, Dialect: gorp.MySQLDialect{"InnoDB", "UTF8"}}
だいたいこれくらい弄るとmysqlで動く様になるはず
ちなみにsampleだからだと思うのだけど以下のような感じでコントローラ処理の前後にBegin,Commit,Rollback を入れ込んでて吹いた
func init() {
revel.OnAppStart(InitDB)
revel.InterceptMethod((*GorpController).Begin, revel.BEFORE)
revel.InterceptMethod((*GorpController).Commit, revel.AFTER)
revel.InterceptMethod((*GorpController).Rollback, revel.FINALLY)
}
modelsでちゃんとやりたいときにはどうしたらいんだろうか…