gefr API updates

早上收到jythonet作者的一封邮件,受到启发,我打算扩展一下gefr这个WSGI adapter。原本gefr是写给soldat用来测试的,结果发现现在出现了买椟还珠的效果,既然大家更加关注这个,我决定多花一些时间在上面。不过话说回来gefr确实是Jython Web程序的新思路,过去大家都在想怎样把Jython放进Servlet中,gefr的思路是把Java的服务器实现放到WSGI后面。未来会有gefr-netty, gefr-mina, gefr-servlet等等出现,如果真的存在一个可靠的backend,也许这种思路也不失为一个办法,毕竟python的web框架更吸引人,而java的基础设施相对可靠,各取所长。

根据这个目的,现在gefr 0.2的API更新为:

即在创建Gefr的时候需要告知backend类型,目前还只有soldat一种后端。未来也可能通过自动检测让这个参数成为可选。

gefr 0.2已经在开发中,您可以通过这里关注:
https://bitbucket.org/sunng/gefr/overview

Setting up soldat and gefr

本文介绍soldat服务器和gefr WSGI适配器的环境搭建,以及jip的基本使用。

安装python工具

virtualenv和pip是python开发的关键工具
sudo apt-get install python-virtualenv
sudo apt-get install python-pip

jython需要您手动下载安装。推荐安装到/usr/local/下,并建立软连接到/usr/local/bin/中,下文将假设您是这么做的。

创建虚拟jython环境

virtualenv -p /usr/local/bin/jython gefr-test
cd gefr-test
source bin/activate

安装jip

pip install jip

配置jip

在$HOME下创建文件.jip,内容为:

[repos:oss]
uri=http://oss.sonatype.org/content/repositories/snapshots/
type=remote

[repos:central]
uri=http://repo1.maven.org/maven2/
type=remote

[repos:local]
uri=/home/sun/.m2/repository/
type=local

安装soldat

配置完jip后,可以使用jip来安装soldat
jip install info.sunng.soldat:soldat:1.0-SNAPSHOT

文件将被下载到 javalib 目录中,您可以检查安装的正确性:
$ ls javalib/
log4j-1.2.16.jar slf4j-log4j12-1.6.1.jar
slf4j-api-1.6.1.jar soldat-1.0-SNAPSHOT.jar

安装gefr

pip install gefr==0.1dev2

创建一个简单的Python WSGI程序

创建test.py

from gefr import Gefr

def wsgiapp(environ, start_response):
    status = '200 OK'
    res_body = "<html><head><title>Welcome</title></head><body><h1>It works!</h1></body></html>"
    res_headers = [('Content-Type', 'text/html'),
            ('Content-Length', str(len(res_body)))]
    start_response(status, res_headers)
    return [res_body]

Gefr(wsgiapp, host='0.0.0.0', port=8000).start()

启动服务

使用jip附带的jython-all
jython-all test.py

打开浏览器,访问 http://localhost:8000/

用ab测试服务性能

$ ab -n 10000 -c 100 http://localhost:8000/

This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:        gefr/0.1dev
Server Hostname:        localhost
Server Port:            8000

Document Path:          /
Document Length:        79 bytes

Concurrency Level:      100
Time taken for tests:   2.539 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      1640000 bytes
HTML transferred:       790000 bytes
Requests per second:    3938.11 [#/sec] (mean)
Time per request:       25.393 [ms] (mean)
Time per request:       0.254 [ms] (mean, across all concurrent requests)
Transfer rate:          630.71 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.6      0       8
Processing:     9   25  22.4     21     239
Waiting:        9   25  22.4     21     239
Total:         13   25  22.3     21     239

Percentage of the requests served within a certain time (ms)
  50%     21
  66%     22
  75%     22
  80%     23
  90%     26
  95%     40
  98%     65
  99%    233
 100%    239 (longest request)

Good Luck!

"Update ${new Random().nextInt()}"

多少年没写Update体了,看Samson的Update Series都到了53了,咱就只好来这么个标题了。

  1. 头等大事,officially announce 一下艰难决定,经过慎重考虑我决定离开上海了。从09年3月第一次到上海到张江,现在整好两年的时间。一方面是获得了大城市的工作机会,另一方面也被在这里边缘的生活闹够了。于是这个悲喜交加的本命年春天决定告老还乡卸甲归田,过没有追求没有房东的土著生活。
  2. 雁过留声踏雪留痕,我在晨晖路1001号半年最大的影响就是让这里又多了两个kindle用户,其他嘛,惭愧了。。。
  3. 要说在上海有什么舍不得的话,就是这里的朋友了,同学同事真不少。有一起干活的,有一起吃饭的,有一起听歌的,各种都有,回了南京就没有这种条件了。不过其实大家在上海很忙一个月也聚不上一回,这么想的话没什么区别,赶上什么RubyConf之类的就又过来了,给沪宁线作贡献是咱的宿命。(话说今年的这些会什么时候开啊,我夏天的衣服还没有攒够呢)
  4. 新赛季中超3号就揭幕了,今年舜天队的比赛可能连电视转播都没有了,你说不回南京能行吗!!能行吗!!从96年开始,今年就是第16年了。
  5. 本来想说最近一两个月荒废得厉害,我回家以后要怎么怎么的,在这还是改为此处省去多少多少字吧。。。

Continuous Learning

一直想总结一下学习的方法,今天看到Programmer的97件事里,作者叫做Clint Shank的Continuous Learning这篇,感觉比较靠谱,跟大伙分享一下。

阅读书籍、杂志、博客、Twitter和各种网站。如果希望深入了解一个主题,可以加入一些邮件列表。这个比较基本,程序员需要有开放的、稳定的、最新的信息渠道。除了上面提的方式,我比较推荐dzone和reddit上的相关频道,这两个书签网站可以帮你过滤排序每天技术圈的热点和新闻。

如果你确实希望沉浸于一种技术,那么你需要着手写一些代码。这个不说了,如果还认为自己是Programmer的话,写一些代码是最最基本的事情。要了解一种技术,写一些代码,跑一个demo是最最基本的。

尽可能和一位导师,或者一个顶尖的家伙一起工作。尽管从任何人身上学到东西,但是你可以从一个更聪明更有经验的人身上学到完整的(a whole lot more)。这个体会比较深,刚搬进工作室的时候坐在@samson959旁边,虽然只有短短几个月,但是跟着入了门,少走了很多很多弯路。再后来在盛大也从老大身上学到不少东西。这样的机会并不是在哪里都有的。

找一位虚拟导师。这是在上一条无法满足的情况下。在Web上找一位自己喜欢的作家,订阅他们的blog。这条比较有意思,你可以拜一位网上的大牛为师,关注他的博客、Twitter以及Github,关注大牛关注的事情、做的事情。这点很有帮助,最早做前端的时候我关注过当时还在雅虎的陈贤安,后来在盛大关注过新浪的杨卫华,以前他们的博客、Twitter质量不错而且经常更新。不过现在前者转行做了苹果开发的Freelancer,后者也许是太忙了,不好找了。其实就是这样,真正牛的人几乎是没有时间做这样的分享的。技术圈毕竟不是娱乐圈,整天在twitter上大放厥词从早说到晚的往往不是你需要关注的,这需要你有一些辨别能力。

去了解你使用的框架和库。了解他们的工作原理可以帮助你更好的使用他们。如果是开源的,你可以用debugger单步跟所有的代码了解内部的工作原理,你可以看到由优秀的程序员编写和审察的代码。这也是很重要的,好在现在有了github让这变得更简单。我自己曾经花过一些时间在redis上,用gdb单步跟踪来浏览程序确实是学习的好方法,尤其是对于向C这样本身程序结构并非非常清晰的项目,通过调试器来了解程序的组织事半功倍,远远高效于单纯的阅读。

无论合适遇到问题或修正了一个bug,尽可能去了解其后真正发生的事情。可以通过Google去了解网上已经存在的相似问题。这又是很重要的一点,现在除了Google,你还可以直接到StackOverflow上去搜索、提问和解答。

分享一些东西本身就是最好的学习方法。当有人将要听你介绍或问你问题时,你会拥有很大的动力去学习。在盛大的时候,每个部门定期会有分享会,在其他很多公司肯定也有这样的活动。我也曾经去做过这样的分享,真要说收获不是这种活动搞的多成功,而是之前准备的阶段。

参加一个学习小组、本地用户组。这个我没有经验,不过各地的LUG都很活跃,一定是很多人乐在其中的。

参加会议,或者看会议录像、slides。这也很有趣,我参加的第一个活动是08年北京的Perl&PostgreSQL会议,后来在上海参加过KongfuRails,RubyConf还有Apache Road Show。不过会议上能获得什么特别有价值的东西也有限,主要还是开阔眼界,了解社区的动态,了解同行的关注点。我们还可以从InfoQ上看到SpringOne, QCon, StrangeLoop等等会议的视频,既可以了解一些技术,又可以锻炼一下听力。能够收录在InfoQ里的Session质量应该都还是不错的,除此以外,还可以通过Slideshare搜索一些特定主题的slides。

收听podcast。

使用静态检查工具提高你的代码质量。

遵循Pragmatic Programmers中的建议,并每年学习一门新的语言。至少是一种新的技术或工具。这种发散可以给你新的想法,运用在你现在的技术栈中。如果你今年还没有什么想法的话,推荐clojure或者nodejs,一个是函数式一个是全异步。(如果你已经都精通了别说我老土啊)

不要局限在技术中,了解一些你工作的领域知识,可以更好地了解需求,解决业务问题。技术的方向很多,SAP在这方面是个典型。SAP的优势不是基础技术,了解行业了解业务是SAP成功的最重要因素。这点在SAP圈子里容易有更深刻的体会,大部分技术人员更希望能够直接面对客户,了解客户的真实业务,并以此为提升自身价值的途径。

回学校返工。不用说了,从工作岗位回到学校的,一般都有明确的目标。系统地深入地学习还是得在心无旁骛的校园里。