开源web博客系统 golang编程开发

本博客同时也是开源博客,关注开源,google,GWT,golang编程开发,html5 ,android等

jquery特效分享国内最最优秀UED博客

jquery特效分享国内最最优秀UED博客

使用 Go 语言和 HTML5 WebSocket 构建一个 Web 聊天室

文章原文:   http://www.oschina.net/question/12_63247

这个应用演示如何使用 Google Go 语言和 HTML5 的 WebSocket 来实现一个简单的基于 Web 的聊天程序。

下图是聊天应用的截图:


你可输入 email 来加入聊天室,我们将从 Gravatar 上获取对应的用户名和头像,当你正在聊天时,你能在界面右侧看到聊天室其他人的姓名和头像。你可以输入信息来跟他们聊天。

现在,让我们来看看如何实现这么一个程序。

服务器端

首先我们需要一个名为 ActiveRoom 聊天室引擎作为整个应用的核心。该引擎将在下面的代码中定义,当程序主函数启动时将会初始化一个聊天室引擎实例并作为一个全局变量。

正在运行的实例用于维护所有 websocket 连接并处理收到的消息。一旦通过广播渠道接收到一个新的消息,它会将该消息发送到所有连接发送渠道。

Message 是服务器和客户端数据交互的基本数据类型,在这里我们定义了两个消息类型,一个是文本消息,另外一个是实时的用户在线状态。

01type ActiveRoom struct {
02     OnlineUsers map[string]*OnlineUser
03     Broadcast   chan Message
04     CloseSign   chan bool
05}
06 
07type Message struct {
08     MType       string
09     TextMessage TextMessage
10     UserStatus  UserStatus
11}
12 
13func (this *ActiveRoom) run() {
14     for {
15          select {
16          case b := <-this.Broadcast:
17               for _, online := range this.OnlineUsers {
18                    online.Send <- b
19               }
20          case c := <-this.CloseSign:
21               if c == true {
22                    close(this.Broadcast)
23                    close(this.CloseSign)
24                    return
25               }
26          }
27     }
28}

OnlineUser 类代表一个成功连接到聊天室的用户,它维护着 ActiveRoom 实例的指针、服务器和客户端之间的 websocket 连接,同时包括正在聊天的用户和 Go 的通讯渠道。

OnlineUser 定义了两个指针方法

PushToClient:
从发送渠道读取消息然后将这些消息通过 websocket 推送给客户端。

PullFromClient:
从客户端读取消息并发送到正在运行的 ActiveRoom 实例。

这两个方法使用 "for" 语句来等待新的消息,除非 websocket 连接中断。

01type OnlineUser struct {
02     InRoom     *ActiveRoom
03     Connection *websocket.Conn
04     UserInfo   *User
05     Send       chan Message
06}
07 
08func (this *OnlineUser) PullFromClient() {
09     for {
10          var content string
11          err := websocket.Message.Receive(this.Connection, &content)
12 
13          if err != nil {
14               return
15          }
16 
17          m := Message{
18               MType: TEXT_MTYPE,
19               TextMessage: TextMessage{
20                    UserInfo: this.UserInfo,
21                    Time:     humanCreatedAt(),
22                    Content:  content,
23               },
24          }
25          this.InRoom.Broadcast <- m
26     }
27}
28 
29func (this *OnlineUser) PushToClient() {
30     for b := range this.Send {
31          err := websocket.JSON.Send(this.Connection, b)
32          if err != nil {
33               break
34          }
35     }
36}

下面我们来看看程序流程,BuildConnection 函数在 main 函数中被注册为 websocket 连接的处理器:

1http.Handle("/chat", websocket.Handler(wscon.BuildConnection))

当有一个 websocket 连接请求,该函数将做一些初始化工作用于处理新的连接:

01func BuildConnection(ws *websocket.Conn) {
02     email := ws.Request().URL.Query().Get("email")
03     onlineUser := &OnlineUser{
04          InRoom:     runningActiveRoom,
05          Connection: ws,
06          Send:       make(chan Message, 256),
07          UserInfo: &User{
08               Email:    email,
09               Name:     strings.Split(email, "@")[0],
10               Gravatar: libs.UrlSize(email, 20),
11          },
12     }
13 
14     runningActiveRoom.OnlineUsers[email] = onlineUser
15 
16     m := Message{
17          MType: STATUS_MTYPE,
18          UserStatus: UserStatus{
19               Users: runningActiveRoom.GetOnlineUsers(),
20          },
21     }
22 
23     runningActiveRoom.Broadcast <- m
24     go onlineUser.PushToClient()
25     onlineUser.PullFromClient()
26     onlineUser.killUserResource()
27}

客户端

最后一部分是客户端的实现,这是采用 JavaScript 实现的。它打开了一个新的 websocket 连接到聊天服务器,并注册回调函数用于处理来自服务器端的消息。你会发现当连接收到新的消息时,conn.onmessage 将被调用。现在你只需将接收到的消息交给对应的 JavaScript 函数去处理:

01if (window["WebSocket"]) {
02    conn = new WebSocket("ws://{{.WebSocketHost}}/chat?email={{.Email}}");
03    conn.onopen = function() {};
04 
05    conn.onmessage = function(evt) {
06         var data = JSON.parse(evt.data);
07         switch(data.MType) {
08              case "text_mtype":
09                   addMessage(data.TextMessage)
10                   break;
11              case "status_mtype":
12                   updateUsers(data.UserStatus)
13                   break;
14              default:
15         }
16    };
17 
18    conn.onerror = function() {
19           errorMessage("<strong> An error just occured.<strong>")
20    };
21 
22    conn.onclose = function() {
23           errorMessage("<strong>Connection closed.<strong>")
24    };
25else {
26    errorMessage("Your browser does not support WebSockets.");
27}

如果你对这个应用很感兴趣,你可以从这里获取整个应用的源码:gochatting.


旧版Google Analytics今日正式“退休”

一直在使用Google Analytics跟踪分析自己网站的用户应该很清楚,在过去的一年里该服务处于新旧版本并行的状态。今日Google在其官方博客上宣布,在经过一年的过渡期后,将于美国当地时间7月18日正式关闭旧版Analytics服务。这意味着你登陆后所有内容都将呈现在新版本中,且底部切换到旧版的链接将被删除。 



Google表示,新版完全建立在一个更强大的平台上,因此可以让他们更快速地开发出惊人的功能。同时还列举出一些具有代表性的功能,比如网站状态实时显示、社会化报告、移动报告、内容实验等功能。如果你对其中的某些功能还不是很熟悉,还可以在其帮助中心对其进一步了解。 


一堂关于加减法的数学课:Google产品战略的窥探

乔布斯欣赏着扎克伯格,并希望后者保持对Facebook产品的专注,他也告诉拉里•佩奇不要学微软要精简旗下的产品。然而,现在的扎克伯格受困于Facebook的现状,还必须努力扩大其产品线,而Google不仅对产品做了减法,同样用加法使自己走上了一条简单和专注的发展道路。

曾经一个邀请函难求的GoogleWave只存在2年不到,这款拥有超强概念性的产品本来打算基于Web建立一个全信息交流和分享平台,最后却因曲高和寡而不得不于去年10月关闭关闭,而Google寄予厚望希望和Facebook、Twitter争一时瑜亮的Google Buzz完全没有取得预想之中的成绩,首度试水社交平台即告失败,最终不得不和Wave接受同样的命运被迫停运。

而日前Google宣布iGoogle和Google Video也将在不久后被关闭,前者作为Google推出的个性化主页服务曾经吸引了数以千万计的用户,并被公司称为“增长速度最快的产品”,而后者是Google曾经希望将YouTube挑落马下的核心服务。

Google在拉里•佩奇重掌大权后一直做着减法,但是为大家忽视的是Google在不断精简旗下产品的同时,也同样地做着加法。

在Google Wave和Google Buze宣告失败后,Google介入社交平台的雄心并没有削减,就在一年多以前,再次推出了新的社交服务Google+,在不到一年的时间里,如今的Google+用户总数已经达到2.5亿,而每月的活跃用户超过1.5亿。

而在Google+上线的这一年里,我们也会看到它在不断推出新功能来优化和丰富用户体验,Hang Out、Google Place以及最近的Events等功能都是其围绕Google+做的加法。

在YouTube增加Google+分享,将旗下的产品服务和Google+实现无缝的紧密结合,将Google+打造成一个涵盖Google服务的全社交平台,这同样是针对Google+进行的加法。

而在Google+之外,如今的Google所作的最大加法莫过于Android、Chrome和Google Glass。

Android平台已经抢占下超过一半的智能手机操作市场,并使三星成为全球第一大手机生产商,而Chrome现在已经拥有了3.1亿用户,成为世界上最流行最受欢迎的浏览器。

正是介入了之前从未涉足的领域,正是不失时机地发展和改进Android和Chrome,不断对其进行用户体验的优化和功能上的增强,如今的Google才能在桌面和移动平台上游刃有余举重若轻,取得了竞争上的优势和话语权。

而神奇的GoogleGlass则很有可能成为Google下一个影响科技潮流和趋势的产品,而这样的产品完全是Google加法的极致发挥:虚拟和现实的无缝交流和沟通、线上服务和硬件技术的超高要求。Google Glass的目的正在于通过增强现实设备而将Google服务通过最便携的方式一直延伸到线下和现实生活中——如果Google Glass最终能取得成功的话,毫无疑问它将改变我们传统的生活方式。

作减法并不难,一家公司只需要根据用户的喜好、商业收益和整体产品规划等数据进行分析就可以决定来裁撤旗下的产品和服务。

但真正艰难的却是在减法之后的加法,你要承担失败之后能否成功的压力并经受外界的质疑和嘲笑,你要对整个做加法的前景和过程有清晰的认识和坚定的信心,你同样还要考虑到最终结果并不如人意的情况。

减法,只是抹去失败的污渍,而加法,则意味着在废墟或处女地上重新开拓和耕耘,这不仅需要勇气,同样需要超凡的眼光、意志和才干,这往往是那些勇于打破常规的理想主义者才能做到的。

Google失败了很多次,走了不少弯路,经历过低谷,但他们的理想从未燃尽,他们还敢于并乐于去尝试去挑战,于是,幸运女神总会格外垂青他们,成功总是离他们不远。

来源:html5cn

谷歌开源其协作式IDE——Collide

http://www.iteye.com/news/25511

谷歌决定关闭其位于亚特兰大的工程部门,其中一个原因是部门主要负责人Bruce Johnson离职,此人之前是谷歌Web Toolkit项目的带头人。 

该团队的Collide项目也因此转向开源。Collide是一个基于Web的协作型代码编辑器,可以在本地运行,通过http://localhost:8080来访问。该项目依赖于Google Web Toolkit、Guava以及其他库,还需要Java 7和Ant 1.8.4+等。 


谷歌工程师Scott Blum称: 
引用
尽管Collide项目比较精简,但是包含了大部分有意思的协作编辑相关技术。从长期来看,我们希望它能够作为提升目前Web IDE状态的催化剂。

Collide源码:http://code.google.com/p/collide/ 

Collide is an open-source "collaborative IDE" demonstration

a fork of Google Collide

  • Pick a folder you want to edit on your local file system.
  • Run Collide from the command line in that folder.
  • You and your amigos browse to http://your_host_name:8080.
  • Collaboratively edit :).

Requires

See README for more details.

Special thanks to the following open source projects we're using

Caution Collide does not have any proper auth, SSL support, or user account management just yet. Please consider that fact when running instances that expose important files on disk! As the project matures we will implement more security features to enable using this in a hosted fashion. But we recommend that if you are running an instance now, to keep the server access secured to your local network!