Published at: 01:07 pm - Saturday July 17 2010
运行一个CometD Demo非常简单,只要创建一个Maven项目即可(CometD Howtos): $ mvn archetype:generate -DarchetypeCatalog=http://cometd.org maven会提示用户选择archetype,包括cometd的版本1、版本2,jetty6、jetty7的实现,以及客户端dojo或jquery的实现。这里可以选择最新的: http://cometd.org -> cometd-archetype-dojo-jetty7 (2.0.0 – CometD archetype for creating a server-side event-driven web application) 项目创建完成后执行mvn jetty:run即可,打开http://127.0.0.1:8080/{artifactId}即可。 CometD的协议包容了各种主要的浏览器,比如在Chromium 5上,dojo采用WebSocket实现;而在不支持WebSocket的Firefox 3上,通过long-polling实现。Bayuex是一个应用协议,CometD是Bayuex的实现,类似鸡与蛋的关系。 有了昨天在Chromium上看WebSocket协议的经验,先看一下CometD的WebSocket实现: 握手。客户端请求/{artifactId}/cometd/handshake 包含Header GET /cometd-jetty/cometd/handshake HTTP/1.1 Upgrade: WebSocket Connection: Upgrade Host: 127.0.0.1:8080 Origin: http://127.0.0.1:8080 Cookie: JSESSIONID=12jqq6hbsfkfic8vzqpevxtrw 这是标准的WebSocket握手协议,服务端返回: HTTP/1.1 101 Web Socket Protocol Handshake Upgrade: WebSocket Connection: Upgrade WebSocket-Origin: [...]
Published at: 09:07 pm - Friday July 16 2010
下午用jetty的WekSocketServlet写了一个简单的WebIM程序,正好第一次瞥见WebSocket的狰容。 服务器端 jetty 7.1.5 客户端 Chromium 5.0.375.86 通过wireshark抓包获得这样一些数据: var _ws = new WebSocket(“ws://127.0.0.1:8080/nothing”) 这个环节创建WebSocket,浏览器与服务器端进行handshake,发送请求 GET /nothing HTTP/1.1 Upgrade: WebSocket Connection: Upgrade Host: 127.0.0.1:8080 Origin: http://127.0.0.1:8080 客户端发出一个Upgrade头,upgrade头在RFC2616 14.42定义 The Upgrade general-header allows the client to specify what additional communication protocols it supports and would like to use if the server finds it appropriate to switch protocols. [...]
Published at: 09:07 pm - Tuesday July 13 2010
Problem When running mongod/mongo/mongos, you got message like this: mongod: error while loading shared libraries: libmozjs.so: cannot open shared object file: No such file or directory Solution Make sure you have xulrunner-dev installed: sudo apt-get install xulrunner-dev then find libmozjs on your filesystem: sudo locate libmozjs in lucid, it’s supposed to locate at: /usr/lib/xulrunner-1.9.2.6/libmozjs.so (and [...]
Published at: 10:06 pm - Saturday June 05 2010
除了用inetface库和分析ifconfig输出以外,一个比较简单的获取本机IP的方法: import socket def get_local_ip(): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(("sdo.com",80)) return s.getsockname()[0] 参考 http://stackoverflow.com/questions/166506/finding-local-ip-addresses-in-python
Published at: 01:05 am - Wednesday May 19 2010
问题: 受够了,不想写Java了,写个含有数据的map还要new出来一个一个put进去,想用groovy解决单元测试 解决: gmaven+groovy eclipse插件可以解决这个需求 在pom.xml中添加gmaven的依赖,注意,仅用来测试。老大不让生产代码里有不可靠的东西。 … <dependency> <groupId>org.codehaus.groovy.maven.runtime</groupId> <artifactId>gmaven-runtime-default</artifactId> <version>1.0-rc-3</version> <scope>test</scope> </dependency> … <plugin> [...]
Published at: 12:05 am - Wednesday May 12 2010
看了@juvenxv的博客介绍Poromodo Technique Illustrated一书,结合我现在低下的工作效率,我决定实践一下这个方法。 一张TODO表记录今天的计划 一张Activity Inventory表用于记录长期的任务,标记已完成的任务 一张Record表统计每天完成的任务数量 一个Poromodo持续25分钟,在这25分钟内只专注当前任务。Poromodo间隙用来给大脑做缓冲,清空前一个任务的影响,以便下一个Poromodo开始时快速切换到相应任务。 应对Interruption,对internal的accept, record & continue,一个poromodo作为一个原子单元不可被打断,一旦被打断应该重新开始。 对external的,评估重要性,分别拒绝、延后、安排时间、安排回调。
Published at: 11:05 pm - Sunday May 02 2010
我总是对这种城市建设、交通规划一类的游戏欲罢不能,以前在Linux上一直只是玩Lincity,后来发现了纯交通类的simutrans,最近升级到Ubuntu10.04以后,终于可以玩这个六年磨一剑,精雕细琢的OpenTTD了。 可以建造各种客运货运的汽车站、火车站,机场,码头等等,可以建设道路、铁路,可以购买公交车、卡车、火车头、火车车厢等等。可惜我玩了大半天还不知道怎么盈利。。。
Published at: 08:04 am - Saturday April 24 2010
Compojure是一个用Clojure写成的类似Sinatra的Web框架。Leiningen是一个新的Clojure构建工具,它用Maven来处理依赖管理,而通过封装Lancet(基于Ant)来实现build-in的task。 以上是背景介绍。以下是HelloWorld。 创建一个目录作为工程目录 mkdir compojure-app cd compojure-app 像创建build.xml和pom.xml一样创建project.clj (defproject info.sunng/compojure-app "0.0.1" :description "A demo app running on compojure framework" :dependencies [[org.clojure/clojure "1.1.0"] [org.clojure/clojure-contrib "1.1.0"] [...]
Published at: 08:04 pm - Saturday April 03 2010
If you installed kubuntu parallel to ubuntu, you might find that the default browser is set to konqueror and cursor theme is oxygen which cannot modified by “gnome-default-applications-properties” and “gnome-appearance-properties”. To fix this, use Debian update-alternatives tool: update-alternatives –config x-www-browser update-alternatives –config x-cursor-theme All configurable options are listed at /var/lib/dkpg/alternatives
Published at: 12:03 pm - Monday March 22 2010
升级10.04之后,gwibber2.29开始使用pycurl来处理IO。结果一条更新都拿不下来,为此搜到很多相关、不相关的bug。最后终于自己找到问题,原来是pycurl.setopt方法传入字符串如果是unicode就会报typeerror。而通过gwibber配置界面输入的所有字符都是unicode编码,于是问题也就简单了。做个处理,在 /usr/lib/python2.6/dist-packages/gwibber/microblog/network.py 第18到21行: self.curl.setopt(pycurl.URL, str(url).encode(’ascii’)) if username and password: self.curl.setopt(pycurl.USERPWD, ("%s:%s" % (username, password)).encode(’ascii’)) 另外,使用StatusNet的Twitter兼容API来做Twitter API代理,需要把代理的目录名设置为api,因为/api这个路径是写死在gwibber代码里的。通过界面输入的,只是代理的domain。 说实在的gwibber还是挺烂的。 https://bugs.launchpad.net/bugs/542501 https://bugs.launchpad.net/bugs/543860