投稿

3月, 2013の投稿を表示しています

[go] 一瞬でtype T に対するfunc(t T) とfunc(t *T)の違いを理解する #golang

自分が一瞬 うん?となることがあるのでメモ
一瞬は言い過ぎか。 ■ code package main import ( "fmt" ) type T struct{ a, b int } func (t T) addRef() { t.a++ t.b++ fmt.Printf("t.a + t.b=%v\n", t.a+t.b) return } func (t *T) add() { t.a++ t.b++ fmt.Printf("*t.a+*t.b=%v\n", t.a+t.b) return } func main() { var t *T = new(T) var t2 *T = new(T) t.a = 1 t2.a = 1 t.b = 2 t2.b = 2 t.add() fmt.Printf(" *T result=%v\n", t) t2.addRef() fmt.Printf(" T result=%v\n", t2) } ■ result go run main.go
*t.a+*t.b=5
*T result=&{2 3}
t.a + t.b=5
T result=&{1 2}

参照か、実体か。一度理解すれば問題無いんですけどね。

channelAPIで/_ah/channel/connect/とか/disconnect/が帰ってこない…(ように書いていた #golang

問題というか、自分がミスっていただけなんだけど。

exampleを参考にchannelAPIの動作を確認してた所。

接続時に
/_ah/channel/connect/
終了時に
/_ah/channel/disconnect/ が叩かれる。というので試して見てたんだけど、

INFO 2013-03-18 12:39:24,099 dev_appserver.py:3103] "POST /_ah/channel/connected/ HTTP/1.1" 302 -
となって叩かれない…
で、302、転送でピコンときたのは、app.yamlの記述。
すべてのページをlogin: requiredにしていたけど、これだと、サーバー内から叩かれる。connected等の
アクセスにも適用されてしまうため、ログイン画面に転送されてしまう。
と、いうことで、githubのサンプルを更新
https://github.com/mogeta/golang_channelAPI_example
一件落着。

社内LTの代役でeve onlineの話した。

オーパーツをテーマに何か話せ。
というお題目を仰せつかったのでやってみました。
eve onlineというゲームは是非、ソーシャルゲームにハマっている人も
ソーシャルゲームを作っている人も一度は遊んでみて欲しいゲームです。
http://www.slideshare.net/mogetta/eveonlineEveonline from magenta

go + dartでchannelAPIを動作させてみた #dartlang #dartlangjp

イメージ
http://muzigram.muzigen.net/2013/03/gaegochannelapi-golang.html の続き
■ 今回のプロジェクトhttps://github.com/mogeta/golang_channelAPI_example_dart■ GAEのchannelAPIをdartで動かしてみよう。 面白そうだから

see also
http://pub.dartlang.org/http://pub.dartlang.org/packages/appengine_channelhttps://code.google.com/p/gae-channel-api-dart/ と思って調べてみたら、google codeの方にどんぴしゃりなライブラリが
あったのでやってみた。つか用意されてるのかよ。
■ pub install pubspec.yaml name: channelDart dependencies: appengine_channel: any js: any 依存関係のあるライブラリを
pub install
と叩くだけで取ってきてくれる。■ js.scopeddartはjs libraryを使って javascriptと連携を取ることができる。
js libraryはproxyと呼ばれるオブジェクト経由でdartとやり取りするんだけど
まぁ、とりあえず動かすところまで行ってしまおう。 js.scoped(() { token = js.context.token; meID = js.context.me; gameID = js.context.game_key; }); js.scoped()内で値を取得しましょう。
scope外でやると

Exception: Cannot get JavaScript context out of scope.

と怒られます。
■ HTML 特筆する部分は以下
channel-dart.jsを読み込んでおきましょう。 <script> var token = "{{.token}}" var me = "{{.me}}" …

GAE(Go)でChannelAPIを動作させてみた。 #golang

イメージ
■ 環境 release: "1.7.4"
timestamp: 1352314290
api_versions: ['go1']
■ 概要 ■今回作成したプロジェクト
https://github.com/mogeta/golang_channelAPI_example

■ドキュメント
https://developers.google.com/appengine/docs/go/channel/

を試してみようと思ったのですが、コードの中に微妙な間違い
(×:ParseFile ◯:ParseFileshttp://golang.org/pkg/html/template/
等があったりし、思ったよりも四苦八苦したので
最もシンプルな形で動作するサンプルを書いてみました。
とりあえず、ローカルで動いたので一旦commit
■ ChannelAPIとは GAEが提供している機能の一つでWebsocketのような機能を提供してくれます。
ポーリング等をせずとも、いわゆるリアルタイムな通信を可能にしてくれます。
たとえば、チャットや、ネットゲーム等で使うことができるのではないでしょうか。
■ Github プロジェクトは一式、Githubの方に展開致しました。
シンプルに動作確認することだけを目指したので、ChannelAPIで接続し、
自分にメッセージを返すだけの簡単なアプリケーションになっています
https://github.com/mogeta/golang_channelAPI_example■ スクリーンショット ボタンを押すとGo側の関数を経由してdivタグ内を編集します。
■ 説明 Go側のチャネル作成 tok, err := channel.Create(c, u.ID+key) チャネルを作成します。「u.ID+key」によって個人を識別するkeyを作成しています。

javascript側のチャネル作成 var channel = new goog.appengine.Channel( {{.token}} ); javascript側はGolangのテンプレートモジュールによって埋め込まれた{{.token}}からチャネルトークンを受け取り channelオブジェクトを作成しています。

ボタンを押した際、jav…