Published at: 08:09 pm - Thursday September 02 2010
在豆瓣上看到一个无聊的秀gems的活动,我也无聊一下,秀一下eggs。 ls /usr/local/lib/python2.6/dist-packages/ | grep .egg | sed ‘s/\(.*\)/<li>\1<\/li>/’ amqplib-0.6.1-py2.6.egg argparse-1.1-py2.6.egg-info AuthKit-0.4.5-py2.6.egg avro-1.3.3-py2.6.egg Beaker-1.3-py2.6.egg Beaker-1.5.4-py2.6.egg beanstalkc-0.2.0-py2.6.egg bottle-0.8.1-py2.6.egg bottle-0.8.3-py2.6.egg bpython-0.9.6.2-py2.6.egg bson-0.1.2-py2.6.egg CherryPy-3.1.2-py2.6.egg CouchDB-0.6-py2.6.egg coverage-3.2-py2.6-linux-i686.egg Cython-0.12.1-py2.6-linux-i686.egg decorator-3.0.0-py2.6.egg distribute-0.6.14-py2.6.egg Django-1.0.2_final-py2.6.egg Django-1.1-py2.6.egg Django-1.2-py2.6.egg django_sphinx-2.2.3-py2.6.egg docutils-0.6-py2.6.egg Editra-0.4.95-py2.6.egg Editra-0.5.05-py2.6.egg Editra-0.5.72-py2.6.egg elementtree-1.2.7_20070827_preview-py2.6.egg eventlet-0.9.9-py2.6.egg Fabric-0.9.1-py2.6.egg fapws3-0.5.dev-py2.6-linux-i686.egg FormEncode-1.2.1-py2.6.egg GeoAlchemy-0.1-py2.6.egg Geohash-1.0rc1-py2.6.egg gevent-0.13.0.egg-info greenlet-0.3.1-py2.6-linux-i686.egg gunicorn-0.10.0-py2.6.egg gunicorn-0.11.0-py2.6.egg gunicorn-0.8.1-py2.6.egg httplib2-0.5.0-py2.6.egg ipython-0.10-py2.6.egg ipython-0.9.1-py2.6.egg Jinja2-2.5-py2.6.egg Mako-0.2.4-py2.6.egg Mako-0.3.4-py2.6.egg Markdoc-0.6.4-py2.6.egg-info Markdown-2.0.3-py2.6.egg Markdown-2.0.3-py2.6.egg-info [...]
Published at: 10:08 pm - Tuesday August 17 2010
虽然现在不做前段了,但是发现好的工具还是很兴奋。今天在twitter上看到Grails in Action的作者 @pledbrook 转了一个geb 0.4的消息,顺带看了一下这个工具 http://geb.codehaus.org geb项目旨在创造一套groovy dsl帮助人们进行webapp的functional test。它是对selenium的封装,举例: @Grapes([ @Grab(’org.seleniumhq.selenium:selenium-firefox-driver:latest.release’), @Grab(’org.codehaus.geb:geb-core:latest.release’) ]) import geb.* println "Dependencies downloaded, ready for testing" Browser.drive(’http://sunng.info:8000/Pacajus’){ assert title== ‘Pacajus’ assert $("p", 3).text() == ‘Population: 41558′ } println "Tested, bye" 打开页面,执行断言。如果断言失败,driver方法会报null: Caught: geb.error.DriveException: null 只要在命令行用groovy执行即可,grapes会搞定依赖关系。 很方便吧,文档上说还可以跟grails / junit等等集成,快去看看吧 http://geb.codehaus.org/manual/latest/index.html The post [...]
Published at: 10:08 pm - Wednesday August 11 2010
beanstalkd是一个极轻量级的消息队列服务,作者的说法叫做Work Queue。 概念 Beanstalkd里包含以下几个概念: Producer Worker Job Tube Producer 与传统的消息队列服务中的概念类似,是Job的生产者。这个角色通过put命令来创建Job。 Worker 即消费者,worker通过reserve / release / bury / delete 等命令操作job的生命周期。 Job 是beanstalkd中的基本单元,一个job包含id和body,从属于一个tube。Job的生命周期是beanstalkd中的核心概念,它包含DELAYED / READY / RESERVED / BURIED / DELETED等状态。beanstalkd文档中的这个图对Job的声明周期进行了说明: http://github.com/kr/beanstalkd/blob/master/doc/protocol.txt#L81 Tube 是类似namespace的概念,Producer在生产Job前通过use指定相应的Tube。而Worker通过watch / Ignore命令来决定从哪些Tube中获得Job。 安装 Beanstalkd 可以通过很多Linux发行版的包管理器直接安装。依赖libevent 1.4.1 以上版本。 通过以下命令启动即可 beanstalkd -d -p <PORT> 协议 Beanstalkd在各方面都继承memcached的风格,协议也与memcached类似,同样是基于文本的: 命令 参数 [参数...] [命令体字节数]\r\n [命令体]\r\n beanstalkd很多命令的返回是yaml格式,但是系统对命令体的格式并没有限制。 客户端 Beanstalkd协议见简单,有各种语言的客户端实现。python有一个非常简单的beanstalkc,可以通过easy_install安装。不过,这个客户端缺少断线重连机制,正式发布的0.2.0版本也有一些严重的bug。可以从github上下载源代码安装,并在使用时控制重连。 The [...]
Published at: 07:07 pm - Monday July 26 2010
写文档是头疼事,没人愿意写文档。在word里写文档,时间长了都怀疑自己是不是搞技术的。我阅历有限,在我的印象里就没有用word格式看过什么有价值的东西。只要一打开word想到的就是连篇累牍的废话、码字。word最重要的功能是什么?保存。其次呢?字数统计。我所写过的word文档绝大多数都是“只写”的,通常作为流程里的一个附件,没有人真正去看。 以上是人身攻击,接下来比较实际的问题,word文档不是符合unix哲学的东西。格式不开放,你就没有办法进行diff操作,把word文档放到svn里,只能使用最基本的版本控制,没法查看changeset,只知道改了,不知道改了什么。 为了改变这种情况,我试过用docbook格式。docbook用xml书写,定义了一套复杂的Schema,详细到作者的email都有定义。docbook还有丰富的工具集,可以通过xsl把docbook转换成所有你知道的文档格式。Maven: the Definitive Guide就是用docbook写成的。不过用docbook也存在一些问题,docbook太复杂了,用纯文本编辑器很难处理,作者的学习曲线也比较高,需要所见即所得的编辑器支持。与docbook相类似的DITA,也存在这样的问题,它们是重量级的格式。 轻量级的Wiki格式不错,但是Wiki格式很让人头疼就是没有统一的规范。举例,dokuwiki里顶级标题是6个=,而moinmoin里顶级标题恰恰相反是一个=,不portable,文档维护起来就非常麻烦。 铺垫了这么多,委屈以上格式了,该markdown出场了。markdown是简单的html原型,用来生成html,它的设计目标就是为了KISS,兼容html。看看一些必要的格式吧:(或者直接看Wikipedia) 标题 # 标题 ## 二级标题 … ###### 六级标题 对于一级标题还可以这么写 headline ======== 二级标题可以 headline ——– 这个怎么输入呢,我想起来前几天看vim hacks里的一组快捷键 yypoVr= yypoVr- 谁用谁知道 段落: 一段文本以两个换行结束。 换行: 一行文本行末两个空格。 图片  用markdown,图片的alt你不写都不行。 链接 [Linktext](link “linktitle”) 列表 ul 无序列表 * * ol 有序列表 1. 2. 以上就是主要的格式支持。用标题来划分文档层次,没有多余的格式,没有机会让你五颜六色。 在linux上可以安装markdown的处理脚本: apt-get install markdown 安装vim的语法文件: http://www.vim.org/scripts/script.php?script_id=1242 [...]
Published at: 09:07 pm - Wednesday July 21 2010
Bottle是一个Python web框架,兼容wsgi标准,lightweight,self-contained。 提到web框架,自然要和相类似的python框架相比。 Django是大型框架,包含ORM、Controller、Templating全套,这也是Django的缺点,使用Django意味着必须使用关系型数据库进行存储(尽管有一些Model层的其他实现,但绝大多数都是Hack的方式实现),必须使用Django并不非常出色的Template系统。Pylons针对Django的这些问题,采用了松散的方式,数据层可选择由SQLAlchemy实现,模板系统可以选择mako / jinja等。Pylons用paster来管理项目、创建代码模板。借鉴了rails的哲学,目录结构也相类似。可是pylons仍然显得重量级,把注意力放到web.py。只要定义一个router,定义相应的handler就可以处理web请求,handler对象的GET POST等方法分别对应相应的HTTP请求。看起来不错了,不过与bottle相比,webpy仍然显得繁琐、功能有限,而且它本身的db模块就更加鸡肋了。 看一个实例便知: 定义一个简单的HTTP页面: from bottle import Bottle, run, mako_view, request from bottle import FapwsServer myapp = Bottle() @myapp.route(’/nihao/:name/:count#\\d+#’) @mako_view(’nihao’) def nihao(name, count): return dict(n=name, c=int(count), ip=request.environ.get(’REMOTE_ADDR’)) run(app=myapp, server=FapwsServer) 对应的nihao.tpl模板,用mako引擎实现: <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>Nihao</title> </head> <body> <div id="ip"> [...]
Published at: 10:06 pm - Thursday June 24 2010
Redis是一个高性能Key-Value store Installation 下载解压,make之后就可以直接启动./redis-server 默认读取当前目录下的redis.conf作为配置,亦可参数指定。默认监听6379端口。 Features 支持多种数据结构 相较memcached,redis支持多种数据结构,包括 string list set sorted set hash 针对每种数据结构,redis都提供比较完整的操作支持。 高性能 据Wiki上说可以达到110,000 SETs/second, 81,000 GETs/second,数据根据一定的策略存在内存和磁盘上(支持持久化)。从1.1开始支持append-only持久化方式,数据被加到文件中,并进行异步的维护,保证文件的大小。从2.0(即1.3)开始支持virtual memory,当内存占用超过配置文件中vm-max-memory时,数据被写入virtual memory。 Replication redis支持主从复制,从而提供多台实例进行读操作,可以在slave的配置文件里配置master的地址。 Protocol redis目前只有基于TCP的文本协议,与memcache类似,有一些改进。 客户端通常发送 命令 参数… 值字节数\r\n 值\r\n 服务端的返回,根据第一个字节,可以判断: – 错误信息 + 普通文本信息 $ 变长字节数,$6表示CRLF之后有6个字节的字符 : 返回一个整数 * 返回组数,即*6表示CRLF之后将返回6组变长字符 其他 项目地址 http://code.google.com/p/redis/ http://github.com/antirez/redis/ 开发者twitter http://twitter.com/antirez http://twitter.com/pnoordhuis Redis功能简单精悍,很符合Unix哲学,核心redis.c只有一万多行,实在是个让人爱不释手的东西。如果可能,争取把他用到生产环境来取代现在的memcached。 The post is brought to [...]
Published at: 11:05 pm - Tuesday May 25 2010
迟到的新闻了,5月8号,GNOME桌面的书籍管理程序Alexandria发布了0.6.6 Beta2。上个月底我提交的豆瓣支持已经被加入了标准发布的打包里,这里可以看到Release note http://alexandria.rubyforge.org/news/2010-05-08–0.6.6beta2-released.html 最近半年忙里偷闲给开源软件做一点贡献,上次gnome deskbar wiki名字是自己加上去的,这次在alexandria里终于算是得到了一些认可,再接再厉,嗯! 各位用开源桌面的读者是不是看在这个份上也装一下这个软件啊。。。
Published at: 09:04 pm - Tuesday April 06 2010
经历了持续两周的人肉集成,今天上午抢得一台Linux机器,终于尝试用hudson来替代人肉构建。 Hudson的安装和配置远比想象的简单,只要下载发布的war包,在相应的目录执行 nohup java -jar hudson.war > hudson.log 2>&1 & 即可启动到后台 hudson的web图形界面可以胜任几乎全部工作。我们主要使用maven来构建项目,hudson提供了非常强大的功能:邮件提醒(通过插件支持twitter/jabber/irc提醒);自动构建,除了基本的定时构建以外,hudson还会自动解析其管理的项目之间的依赖关系,从而实现级联的构建,这个功能非常震撼。 刚刚上手以后我还安装了两个插件。一个是build-timeout插件,可以之间一次构建的超时时间:我们的项目中有老大写的交互式的maven配置插件,一旦这个插件在自动构建时运行会阻塞构建的流程。另一个是scp发布插件,可以自动scp一个文件到远程服务器上,我用这个插件来把构建版本发布到运行环境中,只要在适当的时候重启一下运行环境的服务器就可以实现部署了。不过scp插件由于上游依赖的问题貌似不支持putty生成的privatekey,这是暂时的美中不足。 配置了整整一天,终于有了CI工具,我就彻底解放出来可以做其他事了。
Published at: 06:03 pm - Friday March 12 2010
今天一个叫做WMS Inspector的Firefox扩展发布了。这个扩展用来查看页面上的WMS请求,还可以生成GetCapabilities的Report。
Published at: 01:03 pm - Wednesday March 03 2010
JTS最近发布了1.11版本,新增了: 对Delaunay三角网、Voronoi多边形的支持; 把Geometry对象转换为AWT的Shape对象的功能 对几何对象进行densify的操作(增加结点); 计算Hausdorff相似度和Area相似度的支持 计算Delaunay三角网和Voronoi多边形: import java.util.ArrayList; import java.util.Collection; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryCollection; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.triangulate.DelaunayTriangulationBuilder; import com.vividsolutions.jts.triangulate.VoronoiDiagramBuilder; /** * * @author Sun Ning/SNDA * @since 2010-3-3 */ public class DelaunayAndVoronoiApp { /** * create some predefined sites * @return */ [...]