$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

カニを食べた

地元が先日カニ祭りだったということで、同僚とカニを食べました。

捌かれていないカニたち。
f:id:shiba_yu36:20141116162046j:plain

ポーズをとらせた。
f:id:shiba_yu36:20141116162709j:plain

捌かれた。捌かれたカニたちはこのまま食べた。
f:id:shiba_yu36:20141116174143j:plain

一部鍋にカニを入れた。
f:id:shiba_yu36:20141116174855j:plain

最後に雑炊を作ってシメ。
f:id:shiba_yu36:20141116184543j:plain

カニ久々に食べたけど美味しかった。やはり地元のカニはうまい。

シバソン#〇〇 開催しました

昨日シバソンを開催しました。すでにシバソンは概念がひとり歩きしていて、勝手に誰かが休日にシバソンと称してコードを書いているので、もう何回目の実施かもわかりません。昨日のシバソンは史上最大人数のシバソンでした。京都オフィスに7~8人、リモートに4人ほどいました。雑なイベントなのに10人以上で開催しててすごい。

僕は昨日はgo言語の入門をしていて、ひとまずwebアプリケーションを作りながら入門しようと思ったので、gojiとgo-xslateを使った入門をしていました。入門エントリーも書いたので、参考にどうぞ。


gojiとgo-xslateを使って、GoでのWebアプリケーション開発入門をした - $shibayu36->blog;


シバソン、自分にとって非常に良いイベントだと勝手に思ってる。

自分は最近は仕事ではコードを一切書いていないために、コードも書きたいけど今の仕事も挑戦したいという葛藤を常に感じている。けれどYAPCの感想の時に

方向性まだすごくぶれてるけど、ひとまず今やりたいことちゃんとやろうと思った。やりたいこと二つあったときにどっちかを割りきらないといけないかもとか思ってたけど、やりたいこと二つあったら両方やったら良いし、やるべきとは思ってるけど自分でやりたくないこともあえてやらないみたいにしても良いのかもしれない。

YAPC::Asia 2014に参加してきた - $shibayu36->blog;

ということを書いていた。このやりたいこと二つというのはディレクターとエンジニアなのだけれど、ひとまず決めたのは仕事はこのまま頑張る、エンジニアはひとまず自分の趣味でどんどんやっていこうということだった。そう思ったはいいものの、絶対に機会を作らないと自分の趣味で積極的にコードを書けないと思った。そこで周りを巻き込んでコードを書こうと思いたって、場所と時間を提供するだけ、リモートでも参加するだけのハッカソンを自分の好きな時に開催することにした。

これが成功したと思っていて、周りを巻き込んでコードを書くということをしたことによって、自分も趣味だけでも積極的にコードを書くようになったと思う。面白いことに、前エンジニアをしていた時よりも趣味の時間でコードを書く時間が増えたように感じる。周りを巻き込んで自分のモチベーションに繋げる効果すごい。またそれ以外にも、それに参加してくれた人たちがいろいろ成果を出していて非常にうれしい。


シバソン、自分の周りの人で参加したい人がいたら適当に入れますので声かけてください。リモートでもいいです。

gojiとgo-xslateを使って、GoでのWebアプリケーション開発入門をした

Golangで簡単なwebアプリを作るためにどうしたらいいか調べていたので、試しにGojiというフレームワークと、go-xslateを使ってHello Worldをしてみた。

GitHub - shibayu36/goji-and-go-xslate-sample

http://localhost:8000/hello/world にアクセスすると、以下の様なものが出るだけのアプリケーション。
f:id:shiba_yu36:20141116100454p:plain

これを作った手順にしたがって簡単に紹介。

作成手順

まずはルーティングを作成

https://goji.io/によると、main関数の中にルーティングを作成してServeすれば良いだけっぽいのでまずはそれを作ってみる。

func main() {
	goji.Get("/hello/:name", hello)
	goji.Serve()
}

これで/hello/{name}でhello関数が使われるようになった。URL内の:nameの値は後述するgoji/webのCというstructから取得できる。

hello関数を作る

hello関数を作ってみる。ここでは単に出力するだけではなくて、go-xslateを利用して出力してみる。

go-xslateはインスタンスを作る時にいろいろ設定が可能。今回はテンプレート置き場をtemplates/以下に、かつTTerseを利用してxslateインスタンスを作成し、レンダリングするコードを書いてみる。

func hello(c web.C, w http.ResponseWriter, r *http.Request) {
	tx, _ := xslate.New(xslate.Args {
		"Loader": xslate.Args {
			"LoadPaths": []string { "./templates" },
		},
		"Parser": xslate.Args{"Syntax": "TTerse"},
	})

	tx.RenderInto(w, "hello.tt", xslate.Vars {
		"name": c.URLParams["name"],
	});
}

c.URLParams["name"]とすればURL中の:nameに入った部分を取得できるので、それをxslateのrenderする時に渡している。

テンプレートを書く

あとはtemplates/hello.ttにテンプレートを書くだけ。今回は無駄にwrapper.ttも作成し、WRAPPERも利用してみる。

hello.tt

[%- WRAPPER "wrapper.tt" -%]
  Hello, [% name %]
[%- END -%]

wrapper.tt

<!DOCTYPE html>
<html>
  <head>
    <title>Goji and go-xslate sample</title>
    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
    <link rel="stylesheet" type="text/css" href="/css/style.css" />
    <script src="/js/main.js"></script>
  </head>
  <body>
    <header id="global-header">
      Goji and go-xslate sample
    </header>
    <div id="content">
      [% content %]
    </div>

    <footer id="global-footer">
      Golang
    </footer>
  </body>
</html>

静的ファイルも配信してみる

静的ファイルも配信し、cssやjsも利用したいと思ったので、配信するコードを書いてみる。これはhttp.FileServerを利用すると出来る。

func main() {
	goji.Get("/hello/:name", hello)

	staticPattern := regexp.MustCompile("^/(css|js)")
	goji.Handle(staticPattern, http.FileServer(http.Dir("./static")))
	goji.Serve()
}

正規表現を利用して、/cssと/js以下からはstatic/以下のコンテンツを配信するというコードを書いてみた。

完成

最終的に完成したのがGitHub - shibayu36/goji-and-go-xslate-sample。ひとまず最低限Webアプリケーションの雛形は作れたと思う。

困った所

  • Gojiでquery parameterを取る方法がいまいち分からなかった。自分で頑張るしか無い?
  • 今後さらに大きめなものを作ろうとすると、便利メソッドをどこかに作るということになるけど、どの辺に作るのがベスト・プラクティスなのかよく分からなかった

気付き

  • Goのgodoc見るよりコード見たほうが早い
  • 新しい言語を学ぶときはgithubで検索したほうが早い

まとめ

今回はGolangでWebアプリケーションをどう書くかを考えるため、ひとまずGojiとgo-xslateを利用してサンプルアプリケーションを作ってみた。

go-xslateは元々Perlやっていたので慣れてたので、テンプレートエンジンはこれ使ったらいいって思った。Gojiに関しては、薄いというのは非常に良いのだけれど、いまいちかゆいところに手が届いてない気がしたので、もうちょっとという感じ。gorilla toolkitなど他のフレームワークも利用してみたい。