山椒は小粒でもピリリと辛い

2013/04/19

channelAPIで接続しているユーザーをmemcacheで管理する。んでもってgoconに行けなかった話。#golang #golangjp

gocon:http://connpass.com/event/1906/
に行きたかったんですが スクリーンショット 13 04 19 0 24 どんぴしゃりに風邪を引いてしまい結局キャンセルしてしまいました。申し訳ないです
全員いけるようになってたっぽいのでギリギリまで粘ってみたのですがOTL

というわけで、goconで作ろうと思ってたものの一部を書いてみた。

■gist

https://gist.github.com/mogeta/5413534

■github

https://github.com/mogeta/golang_channelAPI_example_dart
gae/gのmemcacheの使い方が要領えないなーともくもくしてたんですが、それっぽくなってきた?
以降やりたい&やろうと思っていること
  • 動く部分だけ最低限すぎるのでエラー吐くとかは最低限書こう
  • memcacheでユーザー管理するコードをライブラリ化する。(仕方よくわかってない。教えてplz
  • テストコードの検討。gae/g起動して、url叩くようなテスト?
  • dartでjsonのやり取り。ビジュアル的に映えるアプリ。

■ 使い方

func connected(w http.ResponseWriter, r *http.Request) {
 c := appengine.NewContext(r)
 key := r.FormValue("from")

 users := getUsers("users", c)
 users.RegistUser(key)

 c.Infof("connected")
 c.Infof("%s", key)
}

func disconnected(w http.ResponseWriter, r *http.Request) {
 c := appengine.NewContext(r)
 key := r.FormValue("from")

 users := getUsers("users", c)
 users.DeleteUser(key)

 c.Infof("disconnected")
 c.Infof("%s", key)
}

■ code

package channelExample

import (
 "appengine"
 "appengine/memcache"
 "time"
)

type Users struct {
 Name    string
 context appengine.Context
 member  map[string]int32
}

func (u *Users) loadUserList() {
 _, err := memcache.JSON.Get(u.context, u.Name, &u.member)
 if err != nil && err != memcache.ErrCacheMiss {
  u.context.Infof("warning")
  return
 }
}

func (u *Users) saveUserList() {
 _ = memcache.JSON.Set(u.context, &memcache.Item{
  Key: u.Name, Object: u.member,
 })
}

func (u *Users) RegistUser(key string) {
 u.loadUserList()
 u.member[key] = int32(time.Now().Unix())
 u.saveUserList()
}

func (u *Users) DeleteUser(key string) {
 u.loadUserList()
 delete(u.member, key)
 u.saveUserList()
}

func (u *Users) checkExpire() {
 now := int32(time.Now().Unix())
 for i, j := range u.member {
  if now-j > 60*60*2 {
   delete(u.member, i)
  }
 }
}

func getUsers(s string, c appengine.Context) *Users {
 data := &Users{
  Name:    s,
  context: c,
  member:  make(map[string]int32)}
 data.loadUserList()
 return data
}

■スクショ

スクリーンショット 13 04 19 0 27