muzigram

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

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

2013/04/18

WebStorm「You have JVM property "https.proxyHost" set to(以下略」

WebStormが
You have JVM property "https.proxyHost" set to(以下略

とかいう警告を出してきて激おこぷんぷん丸だったので
http://youtrack.jetbrains.com/issue/IDEA-101124
を参考にして対策を打った。

/Applications/WebStorm.app/Contents/Info.plist
に以下の設定を追加した

			<key>https.proxyHost</key>
			<string></string>
			<key>http.proxyHost</key>
			<string></string>
場所は
<key>JVMVersion</key>
		<string>1.6*</string>
		<key>MainClass</key>
		<string>com.intellij.idea.Main</string>
		<key>Properties</key>
		<dict>
			<key>https.proxyHost</key>
			<string></string>
			<key>http.proxyHost</key>
			<string></string>
			<key>idea.paths.selector</key>
			<string>WebStorm6</string>
			<key>idea.platform.prefix</key>
			<string>WebStorm</string>
		</dict>
の辺り。

appがどういう流れで起動するのか。とか理解出来ればもう少し早く解決できたかもしれないOTL