利用开源更好的学习

今天看见一个FreeBSD邮件列表上很早的一封邮件,

http://lists.freebsd.org/pipermail/freebsd-current/2010-August/019310.html

是当时GNU grep的原作者向当时FreeBSD grep的作者介绍GNU grep运行更快的原因,我大致看了一下,基本就属于大牛们之间交流,这之中没有炫耀与嘲讽,有的只是单纯的自由交流、分享与探讨。这就是自由软件的美丽文化所在。

不知道有没有人注意到,Mike写的邮件标题是why GNU grep is fast,他用的是fast而不是faster。他发这封邮件的缘由是很多开发者都反映GNU的grep更快,所以Mike在此背景下主动向FreeBSD的作者说明自己程序的设计,他用fast我觉得是一种谦虚和不炫耀的表达,意思是“我来说明一下我尽量让grep运行更快所用的方法”,隐含的意思应该包括“我们来探讨一下彼此设计的优缺点”。 这是多么平和的态度,多么自由的氛围。如果改用faster,那就性质就完全变了。连这样的大牛们都能如此的谦和,我们是不是应该学习呢?


好了,以上是我的个人见解,并不代表Mike在说。下面我们言归正传,本文的用意是说一下使用linux系统利用开源软件来学习的好处之一,本文并不介绍上述邮件中的算法,因为这篇是给Linux新手写的,让没有接触过开源的人有一个先入的大致概念。


就以这个GNU grep为例,假如现在你刚刚看到了上面的文章,觉得对grep的这个算法很感兴趣,那么首先你需要选取了解那个算法的原理,wikipedia是一个很好的网站:

http://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm


你了解了算法是怎么回事了,你开始觉得光有理论没有实践,正好GNU grep自称是这样实现的,那么你就需要看一下grep的源代码了。在linux系统上获取grep的源代码非常简单,就以我们早先提到的安装的Fedora-19系统为例,在Fedora-19的终端下,执行如下命令:

yum install yum-utils

先安装yum-utils包。然后执行:

yumdownloader --source grep

等待一会命令会从远程源上下载grep的源码包。下载好后就会看到一个grep-2.14-4.fc19.src.rpm的文件,它就是grep在Fedora-19系统上的源码包,由于我们不讨论rpm包的问题,所以下面我们来粗略的解开这个源码包,执行:

rpm2cpio grep-2.14-4.fc19.src.rpm |cpio -div

会得到很多东西,其中有一个grep-2.14.tar.xz的压缩文件,我们再来解开这个压缩文件:

tar xvf grep-2.14.tar.xz
下面就会得到一个grep-2.14/的目录(注意以上的grep的后缀版本号可能会有所不同)。我们cd进这个目录看一眼:

cd grep-2.14/; ls

------

ABOUT-NLS   ChangeLog       COPYING       lib          NEWS            src
aclocal.m4  ChangeLog-2009  doc           m4           po              tests
AUTHORS     config.hin      gnulib-tests  maint.mk     README          THANKS
build-aux   configure       GNUmakefile   Makefile.am  README-alpha    TODO
cfg.mk      configure.ac    INSTALL       Makefile.in  README-release

------

这就是grep源码包的内部结构。关于怎么阅读代码不是本文的内容,但可以先点一下,你可以借助一些工具如cscope等检索代码,查找你感兴趣的关键字。可以编译源码包加上调式信息或调式选项,然后用gdb跟踪断点来摸索出grep的执行过程,然后定位你要找的代码片段。总之方法很多,不在这里赘余。


上面的方法是通过linux发行版的源来获得源上的源码包,实际上每个发行版所维护的源码属于downstream的代码,而upstream的代码由这个项目的直接维护者维护,GNU grep顾名思义,当然是由GNU组织在维护。所以我们可以到GNU的官网去找grep的上游代码:

http://www.gnu.org/software/grep/

一般来说很多开源项目都是使用git版本控制器来维护的,在上面的GNU网站上我们可以找到这个连接:

http://savannah.gnu.org/git/?group=grep

打开看一下,里面是给想获得grep的项目代码的人写的,这就是开源世界,欢迎任何人获取和贡献。好了,我们来用git获取一下这个grep项目代码吧。

首先你可能得先装git软件:

yum install git

然后有了git工具让我们来根据上面的说明获取一下代码,仔细一看有两个clone的地址:

Anonymous clone:

git clone git://git.savannah.gnu.org/grep.git
Member clone:
git clone <membername>@git.sv.gnu.org:/srv/git/grep.git
该选择哪个呢?第一个可以理解为给任意的人下载浏览使用的,第二个是给grep项目认可的开发人员使用的。区别在于,第一个随便下载,第二个需要认证,而且第一个没办法push代码,第二个可以。



好了,我们不是grep的指定开发人员,所以我们用第一个好了,怎么执行人家都告诉你了:


git clone git://git.savannah.gnu.org/grep.git
执行结束后可以看到一个grep的目录,cd进去看一下。


[zorro@dhcp-65-110 grep]$ ls
AUTHORS         configure.ac  grep.spec    po              tests
bootstrap       COPYING       HACKING      README          THANKS
bootstrap.conf  doc           lib          README-alpha    TODO
build-aux       gl            m4           README-hacking
cfg.mk          gnulib        Makefile.am  README-prereq
ChangeLog-2009  gnulib-tests  NEWS         src

似乎结构和上面的差不多嘛。别着急,执行一下: ls -ld .git,你就会发现至少这个下面多一个.git的目录。这个就是git维护的标志。执行一下git branch -av我们会看到如下结果:

[zorro@dhcp-65-110 grep]$ git branch -av
* master                84b18cc tests: port to non-GNU sed
  remotes/origin/HEAD   -> origin/master
  remotes/origin/master 84b18cc tests: port to non-GNU sed

这个是git的分支,git是版本控制器,功能非常强大。以后我会简单说明怎么用git维护一个项目代码,对经常做电子比赛的朋友们也会很多帮助的。这里就先不多介绍git了。


到这里有人可能会问:这和刚才下载的也没什么区别嘛,而且我们不是指定开发人员就不让我们push代码,那还让我们怎么分享?

其实是这么回事,开源项目不能让随便的人直接push代码上去,因为如果每个匿名的人都可以直接push,那这个项目就乱套了。每个开源项目都是负责人,有的负责人很多,呈树状分等级,像linux项目,等级越高的人负责审核的范围越广,如linus本人就负责整个linux项目的整合和审核。当然他一个人是忙不过来的,linux项目分很多子模块,每个子模块有一个他信任的负责人,这些负责人下面可能还有更细的负责人。

linux项目很大,所以会这样。如果是一个小项目可能只有两三个人维护,甚至只有一个人,那么push和merge代码的就是这一两个人。


比如你现在对grep这个项目感兴趣,你对最新的项目代码做了你的修改,你觉得改的很有意义,于是你想向上提交,那么你需要将你的修改做成patch然后发邮件给维护者或邮件列表,你的patch会有很多人评审,然后和你沟通决定是否录用你的patch。具体怎么向上游提交patch以后再说,有兴趣的可以自己了解一下。


如果你的patch被录用了,你的名字和邮箱应该会被记录在git log里(如果项目维护人员人品挺好的话,哈哈:))如果你经常贡献代码,是个卓越贡献者,那么你的名字有可能被永久记录在一个特别的位置。如果你继续提交,战功卓著,占有举足轻重的位置,那么你就可能被选为某个子部分的maintainer,或者某个大块的负责人,甚至直接等着接班像linus这样的位置。


以上就是开源代码好处的简介和简单使用,感兴趣的就赶紧投入开源的怀抱吧。我上面说的连冰山一角都不算,如果你加入,你会体验到无穷的乐趣与自由,当然如果你是一个真正的Hacker。当然你也可以在追求乐趣的同时获得荣誉,比如你出去说你给linux提过数百个patch,或者你是linux某个模块的mantainer,我觉得那可能比你说你是什么什么研究生甚至博士可能更招一些公司和人的认可。


本文纯属闲谈,目的在于吸引更多的新人加入开源。如果哪位大牛路过愿意更多的分享一二,那就更好了。

这里有一个刚建立不久的GNU/Linux的QQ群289439622,如有兴趣欢迎加入交流。

好了,你还在等什么,加入开源吧。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值