Go Code Dojo Saturday 12 月 8 日 Go 制作可嵌入页面的群聊工具

sunfmin · 2012年12月03日 · 最后由 raven 回复于 2012年12月11日 · 5642 次阅读

@sunfmin@yedingding 主持

时间:12 月 8 日(周六)上午 10 点开始 如果没完成,下下周六继续

地点:杭州大浪,杭州拱墅区丝联 166 创意园,登云路和金华路口,金华路进,北 3 层红楼走到最里面入口,上 3 楼。

注意事项:自带电脑,最好 Linux 或 Mac 系统,欢迎踊跃参加,午饭兰州拉面(自己支付)哈哈。

内容: @yedingding 的想法:

web chat:任何一个页面如果加载了 JS 的话,访问这个页面的用户之间就可以做 group chat

活动方式是:先由 @sunfmin 向大家普及 Go 语言的基础,然后下午大家组队(视人数分几个队伍)边学边干,有没有其他熟悉 Go 的人愿意来做 Mentor, :)

我打开了两个 Tab 怎么办...

视作一个用户,用户连接时候,就应该分配个 ID,然后设置到 Cookie 中

@bhuztez 很不幸,估计要用 Websocket?

#2 楼 @bhuztez 不知道哎,等你来解决,可以周六过来

匿名 #6 2012年12月03日

我的域名 ifchat.com 就是预想来做这种临时聊天注册的,group 可以用 url 里面的 id 来设置,不用注册就可以新建一个 group,还想到的有意思的 chat 是通过直接给图片注释,通过图片的修改来 chat,这样直接在图片上交流,对于解释图片还是很方便的

websocket 两个 tab 怎么办?

8 楼 已删除

#7 楼 @yakczh 2 个 tab 连过来,当成一个用户啊,可以做成 2 个 tab 都发消息,也可以做成,那个 Active,就发哪个。

顺便发下公司刚刚上线的中国 ASICS 新网站 http://www.asics.com.cn/

还是改成用 Ejabberd 改改吧...

#13 楼 @bhuztez 你来做 Ejabberd 版的啊。

dojo 是道场么?

WTF....想去啊... 可惜我在成都了....精神上支持....

Enjoy the 兰州料理....

#10 楼 @sunfmin 领导,找你买鞋有优惠吗....

#17 楼 @yedingding 没优惠。。。我们就码农啊,有什么优惠。

#10 楼 @sunfmin 不能忘记 My ASICS 啊啊啊啊

#18 楼 @sunfmin 有零食吃吗?没有的话我准备点,但是需要知道多少人来。

#21 楼 @yedingding 请准备,哈哈。一起去买也行,旁边有便利店。

大家到这里报名吧:http://call4review.com/df83dd 我好买东西,:)

没人感兴趣的样子。

#24 楼 @sunfmin 不知道是对活动不感兴趣,还是对 Go 不感兴趣,还是对应用不感兴趣,大家提意见啊

#25 楼 @yedingding 不怎么想学 golang + 距离问题,纯支持了:)

很感兴趣,周六一早坐动车过去:)

#27 楼 @vkill 这个太让人感动了,得好好准备下...

#25 楼 @yedingding 弄个工具,能把当前命令行 session,在浏览器里同步显示的吧

#29 楼 @bhuztez 不是太理解。把本地的 Term 跟浏览器页面同步?

#30 楼 @yedingding 对啊,就是别人能用浏览器围观你的 Term

#31 楼 @bhuztez 对这方面不了解,大概需要哪些背景,哪些资料可以参考?数据通讯走什么协议,有现成的吗?

#32 楼 @yedingding 我也是完全不知道啊 ... 只知道 Terminal 的标准好像是 VT100 什么的

或者简单一点,能把 script 录下来的 session 在浏览器里播放,并且能拖到任一时间点

#33 楼 @bhuztez 你来不来啊?!

#34 楼 @sunfmin 明显不来啊...

#35 楼 @bhuztez 这么明显啊。。

成果物

https://gist.github.com/4239211

package main

import (
    "code.google.com/p/go.net/websocket"
    // "io"
    "log"
    "net/http"
)

type Room struct {
    Id      string
    Sockets []*websocket.Conn
}

var Rooms = []Room{}

func MyRoom(id string, ws *websocket.Conn) (r Room) {

    for _, room := range Rooms {
        if room.Id == id {
            r = room
            break
        }
    }

    r.Id = id
    r.Sockets = append(r.Sockets, ws)
    Rooms = append(Rooms, r)
    return
}

func (r Room) BroadCast(message string) (err error) {
    for _, ws := range r.Sockets {
        websocket.Message.Send(ws, message)
    }
    return
}

// hello world, the web server
func Connect(ws *websocket.Conn) {
    log.Println("IN", ws.Request().URL.Query())
    room := MyRoom(ws.Request().FormValue("url"), ws)
    log.Println(Rooms[0], Rooms)
    for {
        var message string
        err := websocket.Message.Receive(ws, &message)
        if err != nil {
            log.Println(err)
            return
        }
        log.Println(message)
        room.BroadCast(message)
    }
}

func main() {
    http.Handle("/connect", websocket.Handler(Connect))
    err := http.ListenAndServe(":12345", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

#20 楼 @raven My asics 的训练计划做的蛮好的么!

@sunfmin 今天讲的蛮好,我学到了很多,明天回去了总结下,写个帖子来记录下,哈哈~

go 确实非常的不错,大家可以试试,学习成本很低:)

最后,再次感谢 @sunfmin @yedingding 还有 那位坐对面的兄弟,最后那段讨论非常有意思:)

#39 楼 @vkill 哈哈。虽然只有 4 位同学,但是我觉得今天的讨论非常好,没来的人可惜了。Go 真的不错,要用来做做真正的应用。感谢 @sunfmin 今天做科普,:)

#38 楼 @xmonkeycn 试一下呗。看着好看是不够地……

#41 楼 @raven 这个计划是怎么算出来的啊,ascis 提供的算法么

@raven 给大家普及下牛顿迭代吧,哈哈

#42 楼 @xmonkeycn ASICS 有自己的“科学家”研究这些,然后给我们各种表格和图,我们负责实现成可执行的程序…… 所以算法上没啥特别的,大部分是死数据,用条件筛选。不过涉及到一些微积分的东西,例如@yeerkunth 提到的牛顿法。

#44 楼 @raven 谢谢啦。大概知道怎么回事了。工作了才发现数学没学好啊-,-

#40 楼 也要谢谢 @yedingding 的清真料理 棒极了!

#45 楼 @xmonkeycn 实话说 WEB 开发中遇到这个的机率非常非常小……

vkill 12 月 8 日 笔记:参加 sunfmin 同学的 go 科普 提及了此话题。 04月03日 10:56
需要 登录 后方可回复, 如果你还没有账号请 注册新账号