GMChess 是一款基于Gtkmm和C++编写的开源中国象棋软件。目标是成为良好的读谱,对战功能的中国象棋。
项目地址 http://code.google.com/p/gmchess
邮件列表 http://groups.google.com/group/gmchess-dev
GMChess 是一款基于Gtkmm和C++编写的开源中国象棋软件。目标是成为良好的读谱,对战功能的中国象棋。
项目地址 http://code.google.com/p/gmchess
邮件列表 http://groups.google.com/group/gmchess-dev
顺着夏流的肆虐,却让我们更加冷静、清楚地看待生命、生活,心如止水地静下心来专心致志做我们应该做的事情——继续OpenParty!
在这里和大家提前预告一下本次活动主要讨论的方向:移动系统、程序员养眼法、催眠术、管理入门、Twitter、智能推荐系统、Linux等等。
本次活动,我们在谋智网洛的大力支持下非常荣幸地邀请了来技术牛人孙斌来和大家分享“Mozilla Mobile”这个话题! 孙斌,先后就职于雅虎中国、谋智网络,自2008 年加入 Mozilla 公司,3年以上的互联网从业经验。从事过网站开发、搜索技术开发、Mozilla Firefox 的国际化本地化等开发,近年来专注于火狐浏览器和Mozilla 相关的技术在中国的推广和应用。
另外,幸运的话,我们还会请一位来自神秘的技术专家讲解一下更神秘的“基于Andriod平台的自主操作系统平台OMS”。
海纳百川,有容乃大;壁立千仞,无欲则刚。此乃OpenParty之道也。下面让我们看看有什么精彩的非技术话题!
现 代社会,随着竞争的加剧,很多人每天都在超负荷的工作,同时还要处理复杂的人际关系,包括家庭情感关系等,每个人都要面临来自各方面很多的压力。催眠可以 很好的放松身体,调整情绪,缓解压力,改善睡眠,补充能理,让您焕发生机,并能聆听您的潜意识讯息,感受您的内心世界,为您带来美妙的高峰体验,达到身心 合。那么,让我们在现场亲身体验催眠和放松的感觉如何?本次活动,我们特地邀请到了高级催眠师Gaia Wen来一次现场催眠秀!
看电脑显示器看得眼睛疲劳,这种经历恐怕谁都遇到过吧。这次人称“小扁鹊”的中医专家特地赶来现场传授给IT人士养眼良法!
管理对管理人士的最真实的考验不是你知道该做什么,而是在你不知道该做什么时也知道该如何行动。听起来虽然有点绕口,但其中意义想必项目管理者必知,搜狐网文化中心总监方军老师打算在现场介绍给各位管理大师的候选者一本很有价值的入门秘籍。
话题列表如下:
非 常有趣而且侧重点分明的专属话题,有的话题聊上一天都没完哦。这次本来会有一个超酷的“开源音响系统”话题,但speaker因为签证到期不得不回国,就 此作罢。不过Martin同志经深山修炼归来,特地准备了三个话题!当然,还有不少像蚂蚁这样的朋友也在需要的时候站了出来!
以向娱乐电影电影致敬的方式提出要求:
野渡燕穿杨柳雨,芳池鱼戏芰荷风。
度过了一个炎热、漫长的5月之后,我们迎来了一个“墙头雨细垂纤草,水面风回聚落花”的六月!让我们再次聚会在一起享受一个美好的下午时光,一起“柳岸寻鱼”。
2009.06.20 周六 13:00~17:30
北京市东直门国华投资大厦11层ThoughtWorks Office,地铁环线西南 出口直行50米即到。
查看平面地图 查看三维地图
我们欢迎以下朋友参加:
50~60人。
请希望参加活动的朋友在这里填写报名表
由赞助商Matrix社区为参与者免费提供各种饮料、甜品、啤酒等
场地提供:Thoughtworks
图书赞助:OReilly 华章图文信息有限公司 人民邮电出版社图灵公司
礼品赞助: JetBrains
我们为大家提供开放的自由话题讨论机会,有话题分享或发起讨论意愿的朋友可以在2009年5月16日之前将PPT或者话题、讨论简介发给组织者cleverpig(greatcleverpig at gmail.com)。
上面的本次活动主题图片出自书画大师陈少梅的作品《柳荫高士图》。陈少梅(1909年4月至1954年9月),生于湖南衡山的一个书香之家,自幼随父学习书画诗文,深受中国传统文化的熏陶。1930年他的作品获“比利时建国百年国际博览会”美术银奖,以后开始在画坛崭露头角,成为京津一带颇有影响的画家。
Mail/GTalk:greatcleverpig at gmail.com
早上搜索了下 清华大学开源软件俱乐部的网站,找到这点关于Ccnet的资料,分享下。
Ccnet 是 common creative network 的简称,它的目标是给 Linux 桌面提供一个面向于 group 的通用的 P2P 服务,使得人们没有中心服务器的情况下也能协同工作。
使用上来说,与大部分现有的 P2P 系统相比,Ccnet 有两个主要的不同点。 首先,Ccnet 并不试图将所有的人连接成一个全球性的网络,而是从协作的视角出发,为个人桌面环境提供 P2P 服务,使得一个桌面系统可以和一个或多个 group 中所有的其他成员的桌面系统能联通起来。其次,Ccnet 本身是一个守护进程,为桌面上的其他程序提供服务,比如通过 Ccnet 提供的消息传输服务,一个桌面应用程序可以向一个或多个 peer 发送一条消息;这种简单易用的 P2P 服务将极大地扩展目前桌面应用程序的所能实现的功能。
技术上来说,Ccnet 包含了一个目前大多数 P2P 系统都没有的功能,即请求的延迟满足。 举个例子,如果主机 A 需要向一个不在线的主机 B 发送一个消息,而且主机 A 自己马上要下线,怎么来保证该请求得到满足? 该功能对于一个节点在线时间不确定的 P2P 系统是至关重要的。Ccnet 通过 Requirement 机制来实现该功能。
程序结构上来说,Ccnet 是极易扩展的。Ccnet 包含提供了两套机制: Processor 和 Requirement。 Processor 用于实现两个在线 peer 的交互功能,比如传文件、传消息。 Ccnet 框架提供了一个 Processor 基类,通过书写一个子类,我们就能实现一个新的交互功能。Requirement 也是如此,通过书写一个子类,我们就能实现一个新的种类的请求的延迟满足。
目录[显示] |
代码页面
为什么使用 C 和 GObject
功能模块 | 文件 | 说明 |
---|---|---|
工具模块 | ||
事件管理 | trevent.c | |
log | log.c | |
底层 | ||
peer 信息管理(本地) | peer.c peer-mgr.c | 建立和维护 peer 数据库 (内存和磁盘) |
peer 互连 | peer.c peer-mgr.c handshake.c listen.c peer-io.c | |
packet IO | peer.c packet.h | |
group(本地) | ||
routing | routing-mgr.c getpeerinfo-proc.c | |
processor | processor.c session.c peer.c proc-factory.c | |
requirement | requirement.c response.c req-manager.c sendreq-proc.c receivereq-proc.c | |
中层 | ||
message 管理 | message.c message-manager.c sendmsg-proc rcvmsg-proc getmsg-proc putmsg-proc sendmsg-req | |
文件管理 | file-manager.c sendfile-proc receivefile-proc getfile-proc sendfile-proc | |
git db 管理 | ||
高层 | ||
peer 信息管理(网络化) | 依赖于 message 管理和文件管理 | |
group(网络化) | 依赖于 message 管理和 git db 管理 |
相关的类: CcnetPeer ccnet_peerMgr
信息存储: peer-db/peer-info.txt peer-db/<id>
每个节点用自己的公钥的 SHA1 值作为 ID。
采用 RSA 公钥算法认证。
添加一个 peer 有两种方式
auth-request 工作流程如下 (A 请求 B 的认证):
路由模块依赖于 peer 模块和 getpeerinfo-proc.c 。
主动操作
被动操作
权限列表
几个问题
基于 libevent 库中的 bufferevent 和 evbuffer 实现,涉及的文件:
上层应用应该调用 peer.h 提供的 IO 函数,以便自动选择是否需要启动中转服务。
每隔时间间隔 LISTEN_INTERVAL (listen.c),incomingPeersPulse() 函数回被调用,以检测是否有 TCP 连接请求到达。注意,由于是非阻塞 IO, 所以 ccnet_netAccept() 函数总会立即返回。 ccnet_peerMgrAddIncoming() 生成 peerIo 对象和 handshake 对象,前者是对 socket IO 的封装,后者负责连接的初始化,比如认证。初始化完成后, myHandshakeDoneCB() 会被调用。
static void
incomingPeersPulse (ccnet_handle * h)
{
for ( ;; ) /* check for new incoming peer connections */
{
int socket;
struct sockaddr_storage cliaddr;
size_t len = sizeof (struct sockaddr_storage);
if ((socket = ccnet_netAccept (h->bindSocket, &cliaddr, &len)) < 0)
break;
ccnet_peerMgrAddIncoming (h->peerMgr, &cliaddr, len, socket);
}
}
void
ccnet_peerMgrAddIncoming (ccnet_peerMgr *manager,
struct sockaddr_storage *cliaddr,
size_t addrlen,
int socket)
{
ccnet_peerIo *io;
ccnet_handshake *handshake;
managerLock (manager);
io = ccnet_peerIoNewIncoming (manager->handle, cliaddr, socket);
handshake = ccnet_handshakeNew (io, myHandshakeDoneCB, manager);
g_ptr_array_add (manager->incomingHandshakes, handshake);
managerUnlock( manager );
}
见 handshake.c。 完成 Hankshake 后,双方都知道了对方的 ID。 接下去要采取的行为,比如是否要认证对方,各自决定,采用“请求-响应”语义进行。比如,A 发起认证 B 的过程,而 B 可以决定不去认证 A。
Client 将所有已经认证的 peer 放到 peer-db/peer-info.txt 中。 启动时读取该文件。
Client 在与一个未认证的 peer 完成 Handshake 后, 将该 peer 放到未认证 peer 池中。 用户调用 processor-getpeerinfo 来从该 peer 得到更多的信息。 调用 ccnet_peerMgrAuthPeer(peer) 来将该 peer 放入到已认证 peer 池中。
用户可以决定是否把未认证 peer 池保存到磁盘文件中 (peer-db/peer-unauth.txt)。
相关函数
void ccnet_peerMgrAddUnauthPeer (ccnet_peerMgr *mgr, const char *peer_id, ccnet_peerIo *io);
void ccnet_peerMgrAcceptPeer (ccnet_peerMgr *mgr, const char *peer_id);
void ccnet_peerMgrRejectPeer (ccnet_peerMgr *mgr, const char *peer_id);
Client 自身处于三种状态之一:
Client 用 CcnetPeerAtom 结构来保存 peer 的地址信息。 为了保持地址信息的有效性,需要
Processor 生命周期的管理并不使用 GObject 引用计数机制,而是通过下面的规范
ccnet_processor_done () 只能由 processor 自己调用。 其他模块如果要关闭一个 processor, 使用 ccnet_processor_shutdown()
Requirement 是一种可靠的对象传输机制,它可以在两个节点不同时在线的情况下可靠地将一个节点上的对象(消息、文件、认证请求等)传输到另一个节点上,Requirement 本身并不负责对象的处理,对象的处理交由上层负责。
Requirement 的生命周期分为内存生命周期和状态生命周期,前者由引用计数机制管理,后者由自身管理。
在源节点和中继节点, Requirement 存在于 pending_reqrs 列表中。在目的节点,它存在于 check_reqrs 列表中。(在状态生命周期结束后,Requirement 有没有必要保存在一个特殊列表中以便查询?)
Requirement 由事件驱动其运转。 函数 try_satisfy() 用于其他模块给 Requirement 一个初始的触发。 在发生以下事件的时候该函数被调用:
初始触发后,Requirement 自我运转,对其他模块封闭。
目前只考虑与消息传送有关的 Requirement。这里有两类 Requirement
源节点
INIT:
WAITING: 只在源节点存在,reqr 已经发给足够的中继节点。
SENDING: 只在源节点存在,reqr 尚未发给足够的中继节点。
FINISH 状态: 由 ack-reqr 设置
中继节点
INIT:
MSG_RECV:
FINISH:
目的节点
INIT:
FINISH:
当一个 requirement 到达目的节点之后,会自己根据 check_reqrs 列表自己判断是否是重复的 reqr(详细见 sendmsg-reqr 的状态机),不管是否重复,都需要回复一个 ack-reqr,这是因为重复的 reqr 有可能是源节点超时重传的结果,必须回复一个 ack。这里防止重复是对上层而言的,防止将重复的数据传给上层,而不是防止接收到重复的 reqr。
Requirement 只能发给直接相连的邻居路由器。 路由采用泊松分布模型。每个节点估计一个到目的节点的 mu 值。对源节点来说,一个 requirement 在 SENDING 状态下,
union_lambda = union_lambda + (1/mu)。 (超时设为 1/union_lambda * 2)
中继节点的的超时设为 mu * 2
目的节点的的超时(保留在 check_reqrs 列表的时间)设置为一个较大的值,目前取 6 天。
如果进一步考虑文件对象的传输,还需要设计一个 getfile-reqr,这个 requirement 只是发送一个获取文件的请求,当目的节点收到请求之后,会发送两个 requirement, 一个是 sendfile-reqr,另一个是 ack-reqr,之所以要将数据和 ack 分开是因为如果目的节点收到多个重复的 getfile-reqr,就需要回复多个 ack,如果数据和 ack 是绑定 在一起的话,数据也会被重复发送多次。
(是否能够将各种对象的传输统一起来,只用一套 requirement 来传输?)
中转的消息只有 server 程序内对其有引用计数,可以用引用计数来管理其生命期。 非中转的消息由于本地 server 无法知道哪些本地 client 需要或正在使用它,所以不能用引用计数来管理。现在的方案是全部保存。
先考虑如何处理中转消息。
Ccnet 提供以下服务
put (key, value)
get (key)
见 http://www.thoss.org.cn/trac/ccnet/report/1
A Universally Unique IDentifier (UUID) URN Namespace rfc4122
Pastry http://freepastry.rice.edu
http://en.wikipedia.org/wiki/Collanos
http://www.thoss.org.cn/mediawiki/index.php/Ccnet
新人报道帖,请来此报道让大家尽快认识,格式:
姓名(中英文均可):
所在地:
公司/单位:
从事职业(或自由职业):
使用操作系统:
兴趣,爱好:
其他(座右铭等):
北京GNOME用户组第八次会议将于6月17日在融科资讯中心A座八层,intel办公室举行。
如果您计划出席,请于2009年6月17日(星 期三)中午1点之前,在以下网址注册登记,北京GNOME用户组将为此活动提供免费晚餐和饮料,非常感谢。
会议具体议程:
活动时间 (Time) : 2009 年6 月17 日(星期三 19 :00——21 :30 )
活动地点 (Venue) : 北京融科资讯中心A座八层,intel办公室 Map
7:00pm – 8:30pm Presentation topic: Ccnet Project/主题演讲: Ccnet项目
8:30pm – 9:30pm Free talk/自由讨论
收费标准:无, 北京GNOME用户组将提供饮料畅饮
演讲嘉宾 (Speakers) :
Introduction of Speaker
Lingtao Pan is a student of Second-year master’s degree in Department of Computer Science, Tsinghua University, researches for computer network, especially for routing of the Internet. He has been using Linux for five years, and has strong interest on programming. He want to be able to grasp the programming skills thoroughly, and now focuses on GNOME Desktop System.
潘凌涛,目前就读于清华大学计算机系,硕士二年级,研究方向为计算机网络,特别是 因特网路由。从大一下学期开始使用 Linux,迄今已有五年多。对程序设计有浓厚的兴趣,理想之一是希望能够在编程上达到融汇贯通的境界。目前主要关 注于GNOME桌面系统。
演讲内容:
Ccnet is short for Common Creative NETwork. It is intended for a group of users to set up a private p2p network to connect their desktop together.
Ccnet provides a general P2P service to desktop applications in the following sense:
First, it is separated into a daemon server and a client library, other programs can access the services via the client library; Second, the services it provides include messages transferring, files transferring, and even GIT repositories synchronization, and the functionality can be easily extended. One special technique of Ccnet is delay-able of requirements. For example, if you want to get a file from an offline friend, you can just issue the requirement, and the file will be transferred to you when your friend becomes online. If you are offline at this moment, the file will be stored in intermediate machines to increase the chance that you will get the file when you are online.
Ccnet是common creative network的简称,它的目标是给Linux桌面提供一个面向于group的通用的P2P服务,使得人们没有中心服务器的情况下也能协同工作。
使用上来说,与大部分现有的 P2P 系统相比,Ccnet 有两个主要的不同点。首先,Ccnet 并不试图将所有的人连接成一个全球性的网络,而是从协作的视角出 发,为个人桌面环境提 P2P服务,使得一个桌面系统可以和一个或多个group中所有的其他成员的桌面系统能联通起来。其次,Ccnet本身是一个守护进程,为 桌面上的其他程序提供服务,比如通过Ccnet提供的消息传输服务,一个桌面应用程序可以向一个或多个peer发送一条消息;这种简单易用的 P2P 服务将极大地扩展目前桌面应用程序的所能实现的功能。
技术上来说,Ccnet包含了一个目前大多数P2P系统都没有的功能,即请 求的延迟满足。举个例子,如果主机A需要向一个不在线的主机B发送一个消 息,而且主机A自己马上要下线,怎么来保证该请求得到满足该功能对于一个节点在线时间不确定的P2P系统是至关重要的。Ccnet通过 Requirement机制来实现该功能。
程序结构上来说,Ccnet是极易扩展的。Ccnet包含提供了两套机制:Processor 和 Requirement。Processor用于实现两个在线peer的交互功能,比如传文件、传消息。Ccnet 框架提供了一个Processor基类,通过书写一个子类,我们就能实现一个新的交互功能。Requirement也是如此,通过书写一个子类,我们就能实现一个新的种类的请求的延迟满足。
欢迎大家参加并讨论.
作为论坛第一贴,欢迎大家来到北京Gnome用户组论坛。大家积极发言吧,但是不欢迎无意义的纯灌水贴,如果论坛发展的好,将来或许会考虑增加分区。