2009年九月月 发布的文章

Review Board安装和配置札记

目前部门还没有采用Pair Programming那种时时刻刻都在review代码的工作方式,代码Review多采用走查方式,即代码写完后召开一个Code Review的Meeting,集中时间和经验丰富的人力对重点代码进行筛查,这种方式的代码Review有利,但也有弊。其弊端在于低效和覆盖面小。做一次走查需要N多人参与若干个小时,而在这段时间里不是每个参与者都能极其高效的参与到走查中的,实践证明只有少数几个人能真正在一次代码走查会议上起到关键的作用。另外走查一次能覆盖的代码范围又较小,一些看似不重要却很可能带来BUG的代码在走查会上很容易被遗漏。

Code Review工具对代码走查是一种很好的补充。目前比较流行的开源Code Review工具有Review BoardCodeStriker等。对于ReviewBoard,我关注已久。在其还在rc阶段我就曾经尝试安装过,不过无论是在Windows和Unix下都以失败告终。开源工具的安装的确有些让人头痛,一堆互相依赖的软件包,版本稍有差异就很可能导致安装运行失败。而且失败的原因还很难得知。

Review Board今年终于Release了,目前最新版是1.0.3,其官方推荐在Linux和Windows上安装。我选择了Ubuntu 9.04。Ubuntu的包管理工具apt最大的好处就是能自动帮你分析开源包的依赖关系并自动下载安装依赖包。恰巧在CSDN的一个博客上发现一篇'ReviewBoard on Ubuntu 9.04 Server'的安装步骤,我就按照文章中的步骤超级顺利的完成了Review Board的安装,这里我也将其步骤贴出来,并做一些简单注释(有些地方略有不同):

我是在Ubuntu 9.04 Desktop上安装的,这个版本默认自带Gcc、Python等软件包。我们只需安装其他工具:(如果你是通过公司代理上外网,别忘了在你的Shell配置文件中设置http_proxy环境变量,格式是:export http_proxy=http://user:passwd@url:port)
1、安装easy_install
sudo apt-get install python-setuptools python-dev;

2、安装apache2和mod_python
sudo apt-get install apache2 libapache2-mod-python
sudo a2enmod python /* 修改apache2的配置,让python mod处于enable状态 */

3、安装mysql
sudo apt-get install mysql-server python-mysqldb libmemcache-dev
sudo easy_install http://gijsbert.org/downloads/cmemcache/cmemcache-0.95.tar.bz2

创建数据库、数据库用户for ReviewBoard(这块要注意数据库的字符集设置,默认是UTF-8,如果你要用其他中文字符编码标准,这里就需要显式指定,查查mysql的Manual吧)
mysql -u root -p  /* 用root用户登录 */
mysql> create database reviewboard;
Query OK, 1 row affected (0.00 sec)
mysql> create user 'reviewboard'@'localhost' identified by 'reviewboard';  /* 前一个reviewboard是访问数据库的用户名,后一个reviewboard是密码 */
Query OK, 0 rows affected (0.00 sec)
mysql> grant all on reviewboard.* to 'reviewboard'@'localhost';  /* 前一个reviewboard是数据库的名字,而后一个reviewboard则是访问数据库的用户名 */
Query OK, 0 rows affected (0.00 sec)
mysql> exit

4、安装subversion (目前大多数公司都用subversion)
sudo apt-get install patch subversion python-svn

5、安装reviewboard
sudo easy_install reviewboard

6、创建你的reviewboard站点
sudo rb-site install /var/www/reviewboard   /* 之后会有一系列类似安装向导的步骤,需要你做出选择,尽量选择默认值吧 */
    · Domain = localhost
    · Root Path = /
    · Media URL = media/
    · Database Type = mysql
    · Database Name = reviewboard
    · Database server = localhost
    · Database username = 'reviewboard'
    · Database password = 'reviewboard'
    · Cache Type = memcache
    · Memcache Server = memcached://localhost:11211/
    · Webserver = apache
    · Python loader = modpython

7、配置站点,启动Apache2
sudo chown -R www-data /var/www/reviewboard/htdocs/media/uploaded /* 让webserver拥有对uploaded目录的修改权限 */
sudo cp /var/www/reviewboard/conf/apache-modpython.conf /etc/apache2/sites-available/reviewboard
sudo a2dissite default
sudo a2ensite reviewboard
sudo /etc/init.d/apache2 restart

在你的浏览器里敲入:http://localhost:80,ReviewBoard的登录界面就会出现在你的面前。

顺利安装完ReviewBoard后,你可以到官网去看Manual,学习如何使用ReviewBoard。简单说ReviewBoard支持两种Review Code的模式,一种是在code没有commit之前提交diff/patch文件进行review,叫做pre-commit review,另外一种则是在code commit之后,由工具自动根据提交的版本号生成diff/patch文件,并形成一条新的Review Request,这种模式也叫post-commit review。

先说pre-commit review模式。生成pre-commit review request有两种方法,第一种就是通过页面手工提交patch/diff文件的方法:首先通过界面设置好你的svn repository,比如:svn://10.1.1.23:3344;然后在你的DashBoard中“New Review Request",有三个字段需要你填写:
Repository:  /* 选择你刚才配置的repository的id */   
Base Diff Path: /* 如果你checkout出来的proj的svn url是svn://10.1.1.23:3344/trunk/testproj,那么这个字段填的就是/trunk/testproj */
Diff: /* 你生成的diff文件的路径,在Windows上我用TortoiseSVN的creatpatch工具直接生成某个源文件的diff格式文件 */

填好后,提交,这时你就会看到一个处于draft状态的Request,继续编辑它,指定Reviewer,然后Publish这个Request,这样你指定的Reviewer就能看到这个Request了。这块如果你设置了Email通知,Publish过程会有一定延迟,特别是如果你的Email设置出错了,那Publish将一直处于ing状态,你刷新一下页面后,实际上你的Request已经publish结束了。

另外一种提交pre-commit review request的方法是通过一个名为'Post-Review'的python脚本实现的。这个脚本在RBTools工具包中,在使用之前先执行:'sudo easy_install -U RBTools'安装这一脚本。

Post-Review需要知道两类信息,一个是ReviewBoard Server的信息, 一个是你的svn repository的信息,第一种信息我们可以通过编辑~/.reviewboardrc,添加一行REVIEWBOARD_URL="http://localhost:80"。至于svn repository的信息,post-review脚本可自动从你本地checkout出的代码working copy中携带的repository信息中获得,前提你要进入到该working copy所在的目录下去执行post-review。比如:你将svn://10.1.1.23:3344/trunk/testproj checkout到~/proj/testproj下面,那么你就应该先cd ~/proj/testproj后再执行post-review,post-review工具在默认情况下会将当前本地代码uncommitted的changes形成一个review request并提交到reviewboard server。你也可以在post-review后面加上文件名字来指定将特定的文件的changes而不是当前项目目录下所有的uncommitted changes。

下面是我配置和执行Post-review出现的一些问题和解决方法:

首次在testproj下执行'sudo post-review',出现如下打印日志:

Traceback (most recent call last):
  File "/usr/local/bin/post-review", line 5, in
    pkg_resources.run_script('RBTools==0.2beta1', 'post-review')
  File "/usr/lib/python2.6/dist-packages/pkg_resources.py", line 448, in run_script
    self.require(requires)[0].run_script(script_name, ns)
  File "/usr/lib/python2.6/dist-packages/pkg_resources.py", line 1166, in run_script
    execfile(script_filename, namespace, namespace)
  File "/usr/local/lib/python2.6/dist-packages/RBTools-0.2beta1-py2.6.egg/EGG-INFO/scripts/post-review", line 2314, in
    main(sys.argv[1:])
  File "/usr/local/lib/python2.6/dist-packages/RBTools-0.2beta1-py2.6.egg/EGG-INFO/scripts/post-review", line 2292, in main
    server.login()
  File "/usr/local/lib/python2.6/dist-packages/RBTools-0.2beta1-py2.6.egg/EGG-INFO/scripts/post-review", line 308, in login
    'password': password,
  File "/usr/local/lib/python2.6/dist-packages/RBTools-0.2beta1-py2.6.egg/EGG-INFO/scripts/post-review", line 570, in api_post
    return self.process_json(self.http_post(path, fields, files))
  File "/usr/local/lib/python2.6/dist-packages/RBTools-0.2beta1-py2.6.egg/EGG-INFO/scripts/post-review", line 481, in process_json
    rsp = simplejson.loads(data)
  File "/usr/local/lib/python2.6/dist-packages/simplejson-2.0.9-py2.6-linux-i686.egg/simplejson/__init__.py", line 307, in loads
    return _default_decoder.decode(s)
  File "/usr/local/lib/python2.6/dist-packages/simplejson-2.0.9-py2.6-linux-i686.egg/simplejson/decoder.py", line 335, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/local/lib/python2.6/dist-packages/simplejson-2.0.9-py2.6-linux-i686.egg/simplejson/decoder.py", line 353, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

这种错误信息弄得我一头雾水,在Google上找了半天,也没有什么好的办法。在ReviewBoard的issue archive里有人遇到了和我一样的问题,而ReviewBoard的维护人员建议:修改/usr/local/lib/python2.6/dist-packages/RBTools-0.2beta1-py2.6.egg/EGG-INFO/scripts/post-review中的代码(在/usr/local/lib/python2.6/dist-packages下你可能会发现RBTools-0.2beta1-py2.6.egg是个文件而不是目录,不要紧,.egg文件就是一个zip文件,可将其用unzip命令解压后再放到一个名为RBTools-0.2beta1-py2.6.egg的目录中即可,解压后原始RBTools-0.2beta1-py2.6.egg做好更名和备份),在process_json method开始处加上一行代码:debug(data)。然后在执行post-review时加上–debug选项,观察http post的response数据。

按照网上的建议做了修改:执行sudo post-review –debug,果然有效果,能看到http post后返回的应答内容,居然是公司代理服务器websense的拦截应答。

哇,原来如此,我的.bashrc配置了http_proxy,似乎post-review是向代理发出的http post请求,结果被代理拦截掉了。注释掉.bashrc中的http_proxy变量后,再重复执行post-review命令,这下一切ok了,一个New Review Request成功生成。

第二种模式post-committed review同样是通过post-review工具完成的。命令格式:post-review –revision-range=STARTREV[:STOPREV]。脚本会自动diff两个revision之间的差别并形成review request提交到reviewboard server的。

关于post-review的更多用法,这里不细说了,可阅读官方的Manual。Review Board功能还是很强大的,Review时你可以针对每行代码写Comments,这种Review Code的方式给你足够时间去思考,只要你认真对待,就不会出现盲区、死角,所以新提交的代码就都能被Review到。

充实的一周

六十年之国庆日即将到来,对我们来说也算是个“利好消息”,因为这段时间里来自客户方面压力会减小不少,我们可以更多的做回自己-静下来做一些想做的、该做的事情。

上周末重温了一遍李开复的《做最好的自己》,三年前从书市买下了这本书,但仅仅翻了前三章后就将之束之高阁了。三年后的今天再次完整的阅读这本书,也许是工作的年头多了,关于理想、学习和沟通等方面的共鸣和感悟也就多了些。最欣赏书中引用《读者》中的那一段话:“你不能决定生命的长度,但你可以扩展它的宽度;你不能改变天生的容貌,但你可以时时展现笑容;你不能企望控制他人,但你可以好好掌握自己;你不能全然预知明天,但你可以充分利用今天;你不能要求事事顺利,但你可以做到事事尽心”。

Borland传奇》是我在上周末快速翻阅的另一本书,对于我这个对Borland公司没有太多感情的程序员(早期用过Turbo C,后迅速被Visual C++所替代)来说,这本书谈不上有多精彩,书中对传奇人物的塑造仅限于罗列成果,缺少于一些细腻的人物和场景刻画,让人读后印象不是很深刻,当然这和本书的立意是有很大关系的,作者出身技术,主要是想让大家了解Borland当初的那段历史,以史为镜。

本周工作的一个重要部分就是产品的性能优化,第一步“锁”使用优化。历史上因为总总原因,产品中关于'锁'的种类和使用方式都存在不合理之处,有不合理的地方就有优化的余地。重新封装了Native RW lock,花了一天时间做锁性能对比测试:RW lock vs. mutex lock!测了大半天没有出现我预计的结果。下班回到家中继续测试,居然发现测试代码中一处参数传入错误,导致进程间根本就没有共享mutex,而是创建了private mutex,怪不得mutex锁运行的如此之快。修改参数后,结果果然如预期,RW lock性能更有,在多进程下并行性更好,这也符合常理。

公司已经开始强制要求使用Open Office了,MS Office在不久的将来就将从我们的办公环境中彻底消失。由此推测,Windows被禁也将不远矣,为什么不提前做改变呢?加之很多产品在做Linux迁移,Linux可谓大势所趋。Linux对我来说并不陌生,但是也谈不上很熟悉。以前倒是多次接触过Ubuntu这个热门的Linux发行版,但是都因各种原因没能在工作中真正的使用起来。这次花费大力气借调来一台高性能(起码性能要比我的本本好很多)的PC Desktop,委托同事(其家里宽带的带宽是4M)下载并刻了Ubuntu 9.04的安装盘。Ubuntu的安装做的真是愈来愈好了,仅仅用了不到一个小时,分区、格式化、安装和网络配置就全部OK了。按照Ubuntu 9.04官方推荐更新了源(sources.list),安装了telnet服务(习惯了telnet,你大可以选择更加安全的ssh),方便远程访问;原本想在我的本本上安装TightVNC Viewer,使用远程桌面管理Ubuntu,后来还是觉得不爽,干脆将台式机搬到跟前来操纵^_^。由于Linux默认支持的字符集是UTF-8,所以通过telnet远程访问Ubuntu时要将你的terminal的字符集设置为UTF-8,这样中文才能正确显示出来。

安装语言包的时候倒是遇到了一些麻烦,点击系统->管理->语言支持,更新中文包,但是下载了半天也没有反应,尝试了多次都没能成功,没有中文语言包,桌面无法中文化,最大的不妥之处在无法输入中文。后来只能尝试在命令行下利用apt来install语言包,在网上得到中文语言包对应的名称,执行下面命令完成安装:
sudo apt-get install language-pack-zh
sudo apt-get install language-pack-gnome-zh
sudo apt-get install language-support-input-zh language-support-fonts-zh
sudo apt-get install language-support-translations-zh language-support-extra-zh

重启后,中文界面出现,中文输入也再正常不过了。

Ubuntu的提示/错误蜂鸣音无法通过系统音频属性关闭,在网上找了找资料,发现了解决方法:
在desktop下的terminal下将下面语句添加到.bashrc中,并source .bashrc生效,之后蜂鸣音消失。
setterm -blength 0
xset -b

用性能高的台式机跑Ubuntu很流畅,再也没有以前用笔记本跑Ubuntu时firefox速度奇慢且总阻塞的情况了。初步计划用一个月时间来适应用Ubuntu作为首选工作平台。

十一没有出游计划,八天的长假打算以书为伴,这样在十一前就要“广积书”,现在到手的包括:“ShowStopper”(观止-微软创建NT和未来的夺命狂奔)、“杜拉拉升职记”两册。

今天晚上的手机报上有一道测试题,这里贴出来,你不妨测测:
    每个人写日记时都有个人的习惯,而从各自的记日记习惯则可以得知自己的个性特点,你的选择是:( )
  A、喜欢在日记上叙事、记事
  B、喜欢在日记中议论他人
  C、把日记当作发泄对象
  D、爱在日记中对人事抒发感慨

    答案:
    A、一般说来,喜欢在日记上叙事、记事的人,注重交际,善于思考,办事有主见,常自我独醉,对未来持乐观态度,自信心强。
  B、多在日记中议论他人的人,自尊心强,思想保守而尊重传统,处事谨慎,个性冷静,不大合群,不喜欢在人前流露自己的感情;但却非常尊重别人对自己的感情。
  C、把日记当作发泄对象,把自己的不快或烦恼经常长篇地倒在日记中的人,性格内向,感情丰富,富于幻想,爱交朋友;却不太信任别人,且疑心较重,常自寻烦恼。
  D、爱在日记中对人事抒发感慨的人,喜欢追求时髦,赶潮流,热情开朗,平易近人,能够适应各种环境,办事俐落,生活井井有条,富有幽默感,交际能力强;但却容易轻信他人,且不拘小节。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats