萌えキャラとは何だったのか

ギークにも絵描きにもなれない者の末路

絶賛人生の迷子中、mix3です

golangでWebアプリ

を作ってレビューしてもらったらそれはもうフルボッコでそれこそ雄山のあれな感じでした

この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でちゃんとやりたいときにはどうしたらいんだろうか…