2009年三月月 发布的文章

发掘Trac

使用何种工具做Feature或Defect或Task的跟踪一直是挺让我闹心的一件事。用Excel记录,但却不便于共享、统计和直观展示;Jira算是做的好的工具之一了,但无奈它是商业软件,咱没付那份儿钱,所以也就"无福享用";Mingle是著名的Thoughtworks公司的产品,虽说不到5个license是可以免费使用的,但它却是出了名的"内存杀手",无奈我的机器配置太差,运行起来实在太慢,遂没有坚持下去(我"眼冒金星"的渴望着更换一台无所不能的超级计算机^_^);甚至我曾经用过ONENOTE来做跟踪,可是条目多了后,就基本不可用了。寻觅依旧进行中,这不Trac这款软件进入了我的视线中。

网络让我知道了"Trac"。"Trac"这个名字,估计与Track"异曲同工"。至于Trac具体能做什么,你可以到其Demo站点去体验一下。简单的说,Trac = wiki + 问题处理工作流;Wiki可以用来做知识积累和管理;问题处理工作流恰是我需要的功能。但到底Trac做到啥子程度,那还需要用起来后才能知道。还有一件让我觉得很"幸福"的事,那就是Trac自带一个独立的web server程序Tracd,并且Trac可使用Python 2.5.x自带的SQLite,这样我可以不用安装和配置庞大的Apache和MySQL了。让用户能快速上手应该是Trac值得其他开源软件学习和参考的一个亮点,要知道一些庞大的开源软件繁复的安装和配置过程让很多使用者产生了"挫败感"而"另辟蹊径"了。

Trac是用Python开发的,可以跨平台使用。这里我以Windows上的Trac为例。Trac官方站上有详尽的文档可以指导你的安装、配置和使用。这里用中文做简单介绍吧,留下一个记录,也便于自己以后参考。安装不是最重要的,但是没有了安装却是万万不能的。

1、安装Python, 设置环境变量
对于Trac而言,其解释执行环境Python是必不可少的,虽然Python发布了最新版是3.0.x,但是在已存的Python代码中,Python 2.x版本还是占据绝大多数,过渡到Python 3.0还需要时间。我这里用的是Python 2.5版本。安装完Python后,别忘了将{Python_INSTALL_DIR}和{Python_INSTALL_DIR}/Scripts加入到你系统的环境变量(path变量)中去(一般Python_INSTALL_DIR为"C:\Python25")。

2、使用Windows installers安装Trac
比起手动安装(Manual Install),在Windows上使用Installer安装Trac更为简便。依次下载和安装:SetupToolsGenshiTrac 0.11。注意要下载对应Python 2.5版本的安装文件。如果你要用Trac与Subversion接口的话,建议你下载一份svn-python程序,使用其他svn客户端程序似乎不好用。另外Trac只支持连接本地svn repository,不支持远程svn repository。以上安装程序会把相应可执行程序或脚本放到Python相关目录下,所以不需重新设置环境变量。

3、初始化一个工程
完成以上两步,你就可以使用Trac了。Trac运行和管理的基本环境单位是一个工程(Project)。首先你要确定你的工程所在的目录,这里以D:\TracProjects\Foo为例,我们建立一个名为"Foo"的Trac工程。打开一个命令行窗口,执行:
trac-admin.exe D:\TracProjects\Foo initenv
这是个交互执行的过程,你需要填写一些工程的基本信息,比如工程名字、数据库连接字符串等,你大可一路默认下来就可以得到一个默认的工程环境。

4、启动Trac
一切就绪。我们现在就可以启动Trac了。到目前为止,一切都是那么简单,这也充分证明Trac入门简单。在命令行下执行如下命令启动Trac Web server:
tracd.exe -p 8000 D:\TracProjects\Foo
现在你打开浏览器,访问Url: http://localhost:8000,Trac的界面就会展现在你面前。界面上你只能看到"Available Projects"的列表,由于我们只是建立了一个Project,所以你只能看到Foo这一个超链接。点击Foo,进入Foo的工程页面。

5、为Trac Project添加用户
Ticket是Trac Project管理和操作的基本元素,但是在通过上面方式以匿名登录方式打开的页面上你只能"View Tickets",而无法"New Ticket";要想拥有"New ticket"的权限,你需要以一个Trac用户的身份登录。初始情况下,Trac没有建立任何用户。Trac创建用户是通过建立"Password file"的方式来完成的。Trac默认的密码文件格式与Apache的相同,都是.htdigest格式的。如果你的系统内没有安装Apache,你可以用Trac wiki上提供的trac-digest.py脚本来生成密码文件。你可以将trac-digest.py文件放到{Python_INSTALL_DIR}/Scripts下面。

# trac-digest.py
from optparse import OptionParser
# The md5 module is deprecated in Python 2.5
try:
    from hashlib import md5
except ImportError:
    from md5 import md5
realm = 'trac'

# build the options
usage = "usage: %prog [options]"
parser = OptionParser(usage=usage)
parser.add_option("-u", "–username",action="store", dest="username", type = "string",
                  help="the username for whom to generate a password")
parser.add_option("-p", "–password",action="store", dest="password", type = "string",
                  help="the password to use")
parser.add_option("-r", "–realm",action="store", dest="realm", type = "string",
                  help="the realm in which to create the digest")
(options, args) = parser.parse_args()

# check options
if (options.username is None) or (options.password is None):
   parser.error("You must supply both the username and password")
if (options.realm is not None):
   realm = options.realm
  
# Generate the string to enter into the htdigest file
kd = lambda x: md5(':'.join(x)).hexdigest()
print ':'.join((options.username, realm, kd([options.username, realm, options.password])))

我们使用如下命令生成密码文件:
python trac-digest.py -u "foo" -p "foo123" >> d:\tracprojects\foo\conf\users.htdigest,
这里我们建立一个用户:用户名为foo,密码为foo123。

我们再次来启动Trac,这次由于带有了用户鉴权,启动命令行与前面略有不同。
tracd –port 8000 –auth=Foo,d:\tracprojects\foo\conf\users.htdigest,trac d:\trarojects\foo
启动后,我们点击login,Trac会提示我们输入用户名和密码,输入foo/foo123后,你就可以看到界面显示:logged in as foo,并且"New Ticket"菜单出现在页面上方。

6、Trac.ini
conf目录下的Trac.ini是针对Foo这个Trac Project的主配置文件。里面各个字段的含义说明在Trac官网都有说明。通过修改Trac.ini你可以很简单的在页面上添加你喜欢的Project Logo。

7、Ticket
Ticket是Trac的核心,默认情况下,Trac为Ticket设定了诸多属性,并且设定了围绕Ticket的默认工作流。对于Ticket的每个属性字段,我们都可以通过trad-admin工具对字段取值进行增删改,以适合你的需要。诸如:trac-admin d:\TracProjects\foo  component add Webms foo,这句的含义就是添加一个属于foo工程的名为"Webms"的组件值。Ticket没有类似"Deadline"的时间属性,我们可以用milestone和priority来约束解决Ticket的时间范围。在"View tickets"页面中,Trac内置了多种"Report",你同样也可以自定义搜索,但是目前用户尚不能在"View Tickets"中保存自定义搜索为固定的"Report",但是你可以将自定义搜索语句放到一个WIKI页面的链接选项中,这样你就可以方便的直接得到搜索结果了,无需每次都配置搜索条件。

8、WIKI
Trac内置WIKI引擎,你可以通过trac-admin d:\TracProjects\foo wiki list来查看当前Project的所有WIKI page名称。你也可以通过trac-admin d:\TracProjects\foo wiki import WIKI_PAGE_NAME new_WIKI_page.txt为Foo Project导入一个名为"WIKI_PAGE_NAME"新WIKI页,该页内容来自文件new_WIKI_page.txt。和所有其他Wiki一样,你可以任意定制你的Project中的任意Wiki页面。

从上面的8个步骤来看,Trac简单而且实用,我已经根据我自己的需要对Trac Project进行了初步定制,并导入了我要追踪的需求、任务和问题,更多的高级功能还需要一段时间去发掘,今天的发掘到此为止了。

梅西·滑雪式入球打爆里昂

巴萨国王梅西打入本轮冠军杯最佳入球,巴萨主场打爆法甲七冠王里昂,晋级八强。

2009年3月12日凌晨3点45分(北京时间),西甲豪门巴萨坐镇诺坎普迎来了法甲七冠王里昂的挑战。在八强战首回合比赛中,处于低靡期的巴萨在客场1:1艰难战平里昂,获得一个宝贵的客场进球。本场比赛前巴萨刚刚打入国王杯决赛,并且在西甲第26轮比赛中2:0击败毕尔巴鄂竞技获得近五轮比赛来的首场胜利,球队正在逐渐走出低靡。更重要的是前场三叉戟亨利、埃托奥和梅西都恢复了进球的感觉;特别是梅西,在近三轮的联赛和国王杯比赛中场场有进球,这似乎在说明那个无所不能的天才梅西正在回归。

本 场比赛巴萨首发阵容唯一遗憾的是队长普约尔因伤无法出场。三叉戟亨利、埃托奥和梅西急切渴望能用进球为球队带来胜利,哈维和最近状态极佳的伊涅斯塔作为球 队的心脏为巴萨提供源源不断的进攻动力,图雷辅佐,增加中场硬度。普队不在,马科斯和皮克的中卫组合作为巴萨后防屏障,阿尔维斯和老将西尔维尼奥分列两 翼,巴尔德斯则期望这场比赛能证明自己不是“黄油手”。里昂也几乎是全部主力,力图在客场翻盘巴萨进军八强,队内头号球星卡里姆·本泽马则期待在于同龄梅 西的再次对决中能占得上风。

开场后,诺坎普近10万名球迷缔造的主场气氛还是给客队里昂的球员带来了不小的压力的,但是里昂的队员毕竟也是“久经沙场”的,前10分钟,巴萨在局面上 并没有占有足够的优势,更多看到的是巴萨在中后场的倒脚和控球,而控球上的优势没有给对方带来实质性的威胁,只有梅西在右路的一次突破以及在中路一记找亨 利的直传给对方造成了些许的紧张气氛。里昂则是由本泽马制造了几次越位。

复出不久的小白本场表现很是活跃,频繁的突破让对方防守球员不得不用凶狠的防守抑制,第12分钟,小白就被克里斯在禁区前放倒,巴萨获得位置极佳的任意 球。哈维主罚该球,球打在人墙上出界。这个球再次让球迷们感受到到巴萨在定位球方面的欠缺,如果换成对方的小儒尼奥尔,这个球可能就是必杀。往往一个这样 的机会就能决定比赛的胜利,巴萨要想长期占牢欧洲之巅的话,一个定位球高手是不可或缺的。梅西主罚该角球,不过质量不是很高。

对方对梅西的防守滴水不漏,梅西一拿球,对方就有2到3名球员对梅西进行合围。埃托奥在第15分钟获得射门良机,伊涅斯塔的传球很舒服,不过埃托奥右路的 射门稍稍偏出。15分钟后,巴萨逐渐控制住场上局面,对方基本没有拿球机会,巴萨也在对方半场发起一轮接这一轮的攻势,三叉戟频繁换位给对方的防守带来很 大麻烦。第16分钟,巴萨前场打出精妙配合,最后小白临门一脚将球打高。

img{512x368}
梅西再次PK格罗索,这次梅西毫无疑问占了上风。

第19分钟,里昂在郁闷了很久后终于完成了一次反击。本泽马传球,埃德松中路的射门偏出。第20分钟,里昂卷土再来,本泽马在马科斯的干扰下在球门前将球打高。小本也是一脸无奈。

在顶住里昂的多次反击后,巴萨也完成一次反击,并在这次反击中敲开了对手的大门。第25分钟,马科斯后场断球后,长传前场,亨利反越位成功,单刀赴会,面对门将出击的封堵,亨利用脚弓轻轻一推,球从门将身下掠过后滚入球门,巴萨1:0主场领先。巴萨三叉戟的表演从此开始。

刚刚两分钟过后,巴萨再次取得进球。换为到右路的埃托奥传中,哈维将球妙传给左路无人防守的亨利,亨利得球后稍作调整后大力施射,球应声入网,2:0,巴 萨获得梦幻般开局,法国人扮演了了巴萨晋级路上急先锋的角色。有两个球优势在手的巴萨球员打得更加放松了,并且牢牢的控制住了场上的局面,比赛完全进入巴 萨节奏。历史证明一旦进入巴萨节奏,对于对方而言,这比赛就没法打了,首当其冲的就是抢不到球。

img{512x368}
梅西积极拼抢中

占据场上控球优势的巴萨持续对里昂的球门施加压力,第40分钟,之前一直只在外围活动的梅西接到队友后场的长传后突然发力,从右路连续带球突进,先躲过贴 身防守球员的一记飞铲,又趟过后面补防的一名里昂球员,由于已经进入禁区,后面上来的对方球员没敢轻举妄动;禁区内里昂的球员只是站住位置同样没敢伸脚拦 截梅西,梅西则横向带球与中路的埃托奥做个撞墙式配合,赶在对方三名后卫合围之前推射大门左侧远角得分。无奈梅西射门角度太刁钻,对方门将已经倒地扑救也 没能拦住皮球。可媲美高山障碍滑雪式的大角度过人突破已经成为了梅西的风格标志(Messiesque)。这记典型的梅西式进球让诺坎普再次沸腾,这粒进球也基本上宣告了里昂的“死刑”。 进球后三叉戟抱在一起庆祝,这似乎是在向世人宣告:那个欧洲最强进攻锋线组合回来了!

img{512x368}
梅西上演“凌波微步”

img{512x368}
梅西破门瞬间

第43分钟,埃托奥接亨利的传球大门中的,同时也结束了自己的“球荒”。三叉戟在不到20分钟内打入4粒入球,面对这样的巴萨,里昂不得不俯首称臣。不过巴萨那道让球迷不放心后防线还是在上半场补时阶段出现了漏洞,里昂依靠利用一次角球机会头球破门,扳回一分。

下半场一开场,巴萨后防的松懈再次付出代价,儒尼奥尔在无人防守的情况下射门成功,里昂将比分扳为2:4。巴萨球员重新紧张起来,梅西继续在外围活动,充 当组织手的角色,梅西已经清楚的认识到只有保护好自己才是对巴萨最大的贡献,再也不能重蹈前几个赛季受伤的覆辙。在如此大比分领先的前提下,帮助队友进球 就足够了。扳回两个球后,巴萨后防就再也没给里昂机会,相反倒是在第95分钟,替补出场的凯塔再为巴萨建功,并将最终比分定格为5:2,巴萨成功晋级8 强。

与巴萨一同进入八强的包括英超四强、拜仁、比利亚雷亚尔和淘汰了马竞的波尔图。8强的抽签将在3月20日揭晓。从8强分布情况来看,再次形成了欧洲打“英 超”的局面,不知道欧足联针对这一情况是否有所想法,是让英超一只独大还是其他,只有通过8强结果才能看得出来。从现在来看,巴萨对手很可能是英超的一只 稍差的球队或者是波尔图,毕竟在这些队伍中,只有巴萨最具抗英的实力。期待巴萨在本年度的欧冠道路上能走得越远越好。


微博:@tonybai_cn
微信公众号:iamtonybai
github.com: https://github.com/bigwhite

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系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