基于PubSubHubbub的Feed实时同步到Twitter服务

为了这个蛋疼的Project,刷了好多屏,发了好多测试日志,给大家带来了很多不便,先行道歉。 更新记录 2010-9-15:Bug修正,允许prefix为空。 2010-3-3:处理退订。 2010-3-2:以发布时间标记更新,解决重复发布问题。 2010-2-9:引入Universal Feed Parser库,基本上可以处理所有的Feed格式了。 项目主页 http://p.ream.at/projects/hub2tweet 下载 [download id=”64″] 演示 hub2tweets williamlong在GAE上搭建过一个基于PubSubHubBub的RSS Feed实时同步Twitter服务,基于hub2tweet。但我不喜欢他定制的发布格式,而且他一直没有公布代码,所以我只好从hub2tweet起家重新又改了一遍。 修改的结果与他描述的并无多大区别,唯标题之前可以加个Prefix以示区分,缩短网址改用is.gd(还有个orz.se备用),发布出来的tweet的效果大致如下: [Prefix] 思想改造与极权主义心理: 原作者:Robert Jay Lifton 来源Thought Reform and the Psychology of Totalism 译者george@tecn北卡罗莱纳大学出版社 … http://bit.ly/c9Ib2q 如果你觉得上面的形式很符合自己的审美观,可以直接用我搭建好的hub2tweets。不过不建议这么做,因为我改完的这个程序完全就是删档封测版(网游术语,指位于不删档封测、第一内测、第二内测、第n内测、公测之前的测试版),我会不停的在上面修改——也就意味着不停的出bug。 推荐的方法是下载我改过的hub2tweet,看懂代码后修修补补自己在GAE搭建一个,或者干脆还是从hub2tweet改起。 上传到GAE后要先访问http://your_app_name.appspot.com/admin/oauth_config配置Consumer key和Consumer secret,也就意味着要提前申请twitter appilication。目前只能处理Atom Feed,不知道williamlong是怎么改成让它支持RSS Feed的。好在WordPress和Google Reader Share都能输出Atom Feed。引入Universal Feed Parser库,基本上可以处理所有的Feed格式了。 另外,经过实验,WordPress的PubSubHubbub插件不能正常与hub服务器通信,WP PubSubHubbub插件正常。

WrightEagleBASE代码导读之二

WrightEagleBASE逻辑结构 WrightEagleBASE的代码可以分为几大部分——工具类、程序结构类、数据结构类、模型类、信息类、决策类。 工具类 Utilities、Types:功能函数和公共数据结构,如计时工具和安全数组等,以及与球队相关的基本的数据类型、宏定义。 Geometry:几何工具,点/向量(Vector)、射线(Ray)、直线(Line)、矩形(Rectangular)、带有最大最小值的$$y=a+\frac{b}{x + c}$$型曲线(RecipracalCurve)、圆(Circle)。 Net:神经网络工具。 DynamicDebug:调试工具,记录message log,根据message log重现比赛场景以便调试。 Logger:调试工具,记录除message log之外的其他类型log。 Plotter:调试工具,调用GNUPlot画图。 TimeTest:测试函数或过程耗时的工具。 Thread:线程工具。 UDPSocket:UDP接口。 NetworkTest:测试网络延迟的工具。 ParamEngine:从配置文件、命令行、server消息中读取参数的引擎。 程序结构类 Client, Parser, CommandSender:在正常比赛时,Client::RunNormal()是程序入口,之后创建三个线程——Parser,负责从server接收消息并填充信息类;CommandSender,负责向server发送原子命令;Logger,负责记录log,message log不由Logger记录。Client本身作为决策线程。 Player, Coach:Client带有一个虚函数Run(),应该被实现为决策过程,Player和Coach均继承自Client并分别实现了Run()。Player的Run()要复杂一些,具有明显的层次结构,Coach则非常简单,没有明显的分层,anyway,它们都负责实现如下循环: 数据结构类 Agent、AgentID:Agent代表一个智能体——球员或教练,所有的决策都是围绕Agent进行的,Agent提供了决策使用的信息类和原子命令动作接口,决策类皆是关于Agent的函数,即传入Agent实例,返回决策。使用Agent中的原子命令动作接口会把对应的原子命令放入命令队列,等待CommandSender调用Agent的SendCommands()发送,如果该Agent代表的是程序自身的话,这个特殊的Agent由Client::ConstructAgent()生成。通过“克隆”已有的Agent可以产生一个新的Agent实例,新的Agent与原来的Agent对环境的认识是一致的(i.e.,拥有相同的世界状态),赋予它不同的号码,即可用于计算队友或对手的决策。Agent有一个mReverse(反算)标记,为真,表示该Agent是代表程序自身的Agent的对手,为假表示队友。AgentID用于比较两个Agent是否相同。 Unum:球员号码,是个整数。Unum必须在某一个Agent的世界状态里才有意义,正值代表该Agent的队友,负值代表该Agent的对手。0值一般无意义,在某些情况下代表教练。 BallState、PlayerState:用于存储球和球员的状态的数据结构。PlayerState::mPlayerType是该球员的异构号码;PlayerState::mIsGoalie标记是否是守门员;PlayerState::mIsSentsed标记该球员是否是程序自身,如果一个球员是程序自身,它的很多信息可由server的sense信息得到,与其他球员信息的获得途径不同,mFocusOn与此相关。 Time:周期。mT为周期数,mS为在某些定位球模式下经过的周期数。 ActionEffector:ActionEffector是Agent的原子命令动作接口,即实际的命令队列维护、发送、检查皆由ActionEffector完成。ActionEffector同时也存储server发给Client的命令计数。ActionEffector的静态成员函数和ActionEffector.h里的工具函数属于模型类,提供一些模型计算功能。 模型类   模型类主要进行一些数值计算。 Dasher:计算跑动相关的数据和动作,如跑到某一点需要的周期数、最佳原子动作序列。 Kicker:计算踢球相关的数据和动作,如将球按指定方向踢出能得到的最大速度、按指定速度踢向某一方向的最佳原子动作序列。 Tackler:计算铲球相关的数据和动作,Tackler被设计为目标驱动式的,即Tackler集中于计算将球铲到某一方向所需的原子动作、可得的速度等。 InterceptModel:求解理想截球模型。 Evaluation:基于位置的评价体系,即sensitivity。 信息类   server发来的原始信息经处理和不同程度的抽象后得到一系列可供决策使用的数据。信息是决策的基础。不同的信息更新和组织策略会导致不同的决策模式。 ServerParam、PlayerParam:管理参数,分别读取server.conf和player.conf初始化,再由server发送来的同类参数更新。PlayerParam里有一套独立的HeteroParam,负责处理异构信息。 Parser:负责解析server发送过来的“字符串”,提取出Client的感知 (Perception),转存到Observer里面;提取各种参数,转交给ServerParam和PlayerParam处理。同时,Parser还负责跟server取得连接,并发送初始化信息。 Observer:Observer是Parser线程和主线程的共享数据,它从Parser获得的感知主要包括:视觉、听觉和自身感知等。Observer的信息是相对信息,即坐标等皆在以球员为原点、身体方向为X轴正方向的坐标系(球员坐标系)中,是Client代表的球员的视角。Observer一般不跟高层决策打交道,要供决策使用的信息还需进一步处理。 WorldState、HistoryState:将Observer中的相对信息换算成全局信息(坐标转换到以场地中心为原点,进攻方向为X轴的坐标系——场地坐标系中),并利用历史信息、短期预测等多种途径进行计算,更新得到WorldState,原来的WorldState变成历史。WorldState包括了球、球员等场上所有对象的基本状态信息(BallState & PlayerState)。WorldState中的信息不采用任何一个球员的视角,而采用某一个队伍的视角。一份WorldState无需任何改动就可以供所有的“队友”决策使用,镜像对称后得到的新WorldState可以供所有“对手”决策使用。HistoryState管理历史WorldState。 WorldModel:WorldModel提供双方视角的WorldState和HistoryState。 InfoState:对WorldState里的信息进一步计算和抽象得到InfoState,包括: PositionInfo:各种相对位置、角度信息; InterceptInfo:截球信息,由修正求解理想截球模型的结果得到。 Strategy、Analyser:比InfoState更抽象的上层决策数据,Strategy用于进攻,Analyser用于防守。两者均采用某个Agent的视角,通过 WorldState、InfoState和自身历史进行更新。历史决策信息、决策要使用的一些历史相关信息也存储在两者里面,并以不同的形式进行更新。 WrightEagleBASE中的信息流动过程(PositionInfo与InterceptInfo地位相同,Analyser与Strategy地位相同): […]

WrightEagleBASE代码导读

WrightEagleBASE是WrightEagle 2D Soccer Simulation Team发布的球队底层代码,可于此处取得。该导读补充代码中注释的不足及注释无法解释清楚的问题,导读假定读者对RoboCup 2D的规则及Server物理模型具有清晰和深刻的理解。 代码包结构 代码包里有以下几部分内容: AUTHORS, COPYING, NEWS, README:必要的法律文件,注意WrightEagleBASE发布在GPL下,不是LGPL。 Debug, Release, Makefile:WrightEagleBASE提供了两个版本的Makefile,均是由Eclipse生成。Debug版本带有断言(assert),正常比赛应使用Release版本。Makefile调用Debug和Release下的makefile,默认编译Debug版本,编译Release版本应使用:make release Linux下编译需要pthread库。原则上代码可以在Windows平台编译通过,但目前所有使用Windows的队员均已离职,故无法保证这一点。 start.sh:球队上场示例脚本。接受两个参数:$1为server IP,默认localhost;$2指示调用Debug/Release版本,默认Release。示例脚本假定守门员是1号。 dbg, dd, genlog, memcheck, showlog, initrc, dynamicdebug.txt, Logfiles:前5个是调试工具,initrc是调试工具的公共代码,dynamicdebug.txt是调试用附加文件,Logfiles目录存放球队的各种log文件。 conf, formations, data:配置文件或数据文件。conf下有player.conf和server.conf,其中参数与server中的同名参数意义相同,player.conf另有两部分参数——调试开关和性能选项。formations下定义了各种阵型。data下的几个文件是离线计算好的数据文件,sensitivity是一个简单的评价体系,即按位置评价,如下图所示,XY平面表示球或人所在位置,Z轴为对应的评价值(比如要计算传球的收益的话,即可用目标点的评价值-当前点的评价值)。 src:存放源代码文件(.h/.cpp)。源代码文件编码为GB18030。

WrightEagle Base Code Release 2

这是唯一一次没有“之一”的“之二”,因为第一次发布的那天是七夕。 去年的这个时候,蓝鹰第一次发布了底层代码。但由于大家对此殊无热情可言,代码草草注释,决策层被删了个精光,连样例也没有,之后更是无人愿意维护,仅添加了14版本server对应的参数便算可以交差。但即便是这样的代码仍然给我们带来了大量的反馈——只不过反馈最多的是抱怨这代码不好用。全国赛中更是出现了两支毅然使用WrightEagleBASE作为底层的球队。我在此感谢你们,北京理工大学BITSS和西安交通大学BlueSipder,以及来自伊朗的朋友们。并且对你们两队在全国赛得到的结果表示歉意。 全国赛之后我们决定重新发布底层代码,新代码由WE2010删减决策层得来,保留了决策层代码结构,包括视觉及通信决策,并且每个决策皆有简单样例。原发布版本重新编为第一版,新代码为第二版。 代码发布页:http://www.wrighteagle.org/2d/ 开发版镜像:http://p.ream.at/projects/wrighteagle-base 注意这是一个架设在我个人的项目管理系统中的WrightEagleBASE开发版镜像,我只能尽可能保持它与蓝鹰团队的WrightEagleBASE开发版同步,并代为转发提交在此处的Issue;也欢迎大家加入该项目,不过限于蓝鹰团队的代码管理制度,外部开发人员无法直接提交代码。 提醒大家注意的一个问题是,WrightEagleBASE仍然发布在GPLv2下,不是LGPL,即使用WrightEagleBASE要求在比赛结束后发布球队源代码(因比赛规则规定比赛结束后发布二进制可执行码,GPL规定二进制可执行码必须与源代码一并发布),不愿发布源代码的,请单独与我们联系。 为了让大家能够更好的了解我们的底层代码,也为了配合今后我们的培训,我可能在近期撰写一些WrightEagleBASE代码导读。

朔方纪事

  世界杯回来之后马上又去了全国赛,鄂尔多斯,故朔方郡。碰巧马超也参赛,3D组,于是回了一趟南开看看。   从天津去北京的京津城铁很不错,北京南站很漂亮,机场标准的。   July 15th, 2010, the real journey began.   Arriving   比赛场地   世界杯没有的机器人   以及世界杯没有的山寨比赛   The fight   Mission accomplished   The other side   公交车是免费的,对所有人免费。   Goodbye, Ordos   It is not Darth Maul who the the phantom menace is, but Padmé Amidala.   这次全国赛见到了两支用WrightEagleBASE的球队,可惜垫了底。WrightEagleBASE里有很多无可替代的模型和算法,但工程性的确不好,大家准备好花两年以上的时间消化掉吧。最后祝贺redsky和YuShan队,用2511做底层打进8强着实不容易。

赠栾松

裳裳者华 裳裳者华,其叶湑兮。我觏之子,我心写兮。我心写兮,是以有誉处兮。 裳裳者华,芸其黄矣。我觏之子,维其有章矣。维其有章矣,是以有庆矣。 裳裳者华,或黄或白。我觏之子,乘其四骆。乘其四骆,六辔沃若。 左之左之,君子宜之。右之右之,君子有之。维其有之,是以似之。

梦断狮城

June 18, 2010, we began our journey to RoboCup 2010 at Singapore. Arrving we’re here for this Outside it’s their fight(新加坡在阅兵) Inside is ours the Iranian MM (five of them, all high school girls, from team Unique, the champion of RoboCup IranOpen 2010, got 6th position in RoboCup 2010) @Home Singapore Polytechnic and robots, handreds […]