スキップしてメイン コンテンツに移動

GoogleAppsEngineでのGolangが神だった。

どうも、改めまして@CreatorQsFです。やっぱりGolangキてますね〜。
というわけで、今日はGolangをGoogleAppsEngine(通称GAE)で動かす方法や、その真髄をここに書きたいと思います。
ちなみに、どちらもGoogle開発のものなので、とても仲が良いです。(といいつつついこの前まで、この2つの関係はbetaでしたw)

というわけで、まずは簡単に環境開発から。

環境開発

まずはこちらから、GoLangのAppEngineSDK(Golangをwebアプリケーションとして簡単に動かすためのもの)を落としてきます。
自分の環境にあったものを落としてください。自分がどれを落とせばいいかわからない人は、Twitterで@CreatorQsF宛に聞くか、Hangoutで私まで。

で、こちらをダウンロードしてきたら、ダウンロードフォルダよりFinderで好きな場所に移動して、展開してください。
で、展開したらそのDirectory名を抑えてください。たとえば、ダウンロードフォルダで展開したなら、/Users/あなたのMacのユーザー名/Downloads/go_appengineです。ここではこれを、「展開したディレクトリ名」と呼びます。

で、そうしましたら、自分のホームディレクトリ(/Users/あなたのMacのユーザー名/)に.bash_profileというファイルを作ります。というより、golangの環境を作った時に多分bashrcだかなんだかがあると思うので、そこに先ほど抑えた「展開したディレクトリ名」をこのように書き込みます。
export PATH=「展開したディレクトリ名」:$PATH
つまり、Downloadsで展開した人は、
export PATH=/Users/あなたのMacのユーザー名/Downloads/go_appengine:$PATH
というわけです。
で書き込んだら、Terminalでこのパスを通すためにsource ~/.bash_profile(ここは適宜)を実行します。

で、そこまで来たらもう終わったも同然です。
なにかプロジェクトを作ってみたいですか?

HelloWorldやってみよう

テキトウなディレクトリを作ってください。仮に、場所を/Users/あなたのMacのユーザー名/Develop/go/myapp とします。
で、ここに、ここからダウンロードしてきたファイルを展開します。で、Terminalで、
cd /Users/あなたのMacのユーザー名/Develop/go/myapp
したあとに
goapp serve
します。
これは、ディレクトリをTerminal内で動き、そこにあるファイルでgoappを動かすという意味です。
で、そうすると、
INFO     2015-02-12 04:40:18,738 devappserver2.py:745] Skipping SDK update check.
INFO     2015-02-12 04:40:18,788 api_server.py:172] Starting API server at: http://localhost:58192
INFO     2015-02-12 04:40:18,795 dispatcher.py:186] Starting module "default" running at: http://localhost:8080
INFO     2015-02-12 04:40:18,798 admin_server.py:118] Starting admin server at: http://localhost:8000
このようにTerminalに出てくると思います。この場合、ブラウザでhttp://localhost:8080にアクセスするとwebアプリ、http://localhost:8080にアクセスするとadmin(インスタンスとか見れるやつ)に移動します。

では、先ほど入れたプロジェクトファイルの説明を。

golangでは、ファイル単体で動かすときは、
package main
func main() {
}
が一般的だと思います。というより、これがないと普通は動きません。
ですが、今回は、
package hello
func init() {
}
となっています。
なぜなら、
Note: When writing a stand-alone Go program we would place this code in package main. The Go App Engine Runtime provides a special main package, so you should put HTTP handler code in a package of your choice (in this case, hello).

とあるように、GAEでgoを動かす場合はruntimeが特殊なmainパッケージを提供するので、必要ない、ということです。
でまぁ、ごちゃごちゃ書いていくと、goappがappengineでうごくわけです。いいですね。簡単で。
簡単なプロジェクトぐらいならrevelなどのフレームワーク使わなくてもこれでガリガリ書くんで十分ですね!さすがGoogleですわ。

というわけで、わりと初心者がアクセスしてもわかりやすい知識が付けられるように書いたつもりです。何かわからないことがアレば、お気軽に@CreatorQsFかHangoutまで。

ではでは。

おわり 

コメント

このブログの人気の投稿

GoでPodcast用のサーバーを組むときに良い(良さそうな)lib

いい感じのライブラリ、あります。 現在作成中のPadio(仮名)というサービスではこれを使っています(が、しかしもしかしたら変えるかも。現状はすごい満足)。 https://github.com/eduncan911/podcast https://godoc.org/github.com/eduncan911/podcast

Vaffle.vimがいい感じ

実はいまのいままで、ずっとUnite.vimを使い続けてきていました。 Shougoさんのunite.vimは確かに素晴らしかったです。しかしながら、私には到底使い切れるものでもなく、もったいないとおもいつつ、ファイラーとmruのみを使う日々が続いておりました。 御存知の通り、随分前にご本人はすでにuniteからdeniteへと移行をしています。 知らなかったわけではないんですが、動いてるし速度にも問題を感じることがなかったので放置していました。 しかし今回、現状に合わせて、この部分を考え直すことにしました。要するにVimのファイラをどうしよう問題です。 で、いろいろ見た限り、わたしには、 https://github.com/cocopon/vaffle.vim これが最も適しているようでした。 ブログ記事はこちらです。 http://cocopon.me/blog/?p=6084 かなり気に入っています。動作はなかなかに速いですし、hjklで移動できる感覚も、なれると良いものですね。 あとはmruをどうしようかなーというところのみとなりました。

NULLのcolumnを含むDBでデータを取得する/Golang

どうも、@CreatorQsFです。我が家にもやっと春が舞い戻ってまいりました。 さて、僕はもともとCとPHPとMySQLでサービス作ってた人です。そんな中で世紀末ぐらい困ったことが会ったので記しておきます。 まず、PHPでの時わたしはDB関連は全て自作していました。これでも一応SQLかけるので。 ですが、Goに変えてからgithubなどのLibraryを積極的に使うようにしています。フレームワークも今はrevelを使ってます(╹◡╹) そして、当然のごとくgorpを使いはじめるわけなんですが…これが意外と難しい。というよりPHPの成り上がり下克上果たせなかった系Goプログラマには結構問題点が多くて。私自身にですが。 まず、DBを使うのに、structと組み合わせるためにマッピングしなきゃならない。いや正確に言うと、今まではDBから取得したらそれが自動的にオブジェクトに落とし込めていたので、なんか気にすることなかったんですな。 だけど、最近のモダンなやつ見てるとどうもそうでもないらしい。構造体を作ってそこに落としこむのが主流なのかな。 ってことで、やってみたのはいいものの… …動かないっす先輩。 思ったとおりに行かないっす 原因は、MySQLのcolumnにNULLが含まれているためでした。そこで、sql.NullStringの存在を知ります。 で、それを   for _, l := range list {     p := l.(*models.A)     fmt.Printf("%d,%t, %s\n", p.Id,p.Status,p.Url)               } こんなかんじに調理したとします。 この青四角のところが大問題なわけで、最初こう書きました。 result string = p.Url そうすると、みんな大好き型エラー。 で、次にこう。 result string = fmt.Sprintf("%v",p.Url) いや、動いたんですけど…。問題はそうじゃなくて、吐出されたものがめちゃめちゃに汚い。オエッの方じゃなくて。 で、なんじゃこりゃと思って、次...