Archive for October, 2009
Win32平台下编译SVN源码全过程
5
前段时间曾经总结过一些在win32平台下基于SVN开发的一些注意事项,主要是在利用svn官方发布的二进制库进行开发过程中使用的方法和一些值得注意的问题。
由于svn官方发布的win32平台下的二进制文件是基于vc6编译的,在使用vc2005进行开发时,会遇到因CRT冲突而引起的link错误。因此,如果是使用vc2005(我推测使用VC2003也会遇到同样的问题,尚未验证)附带的CRT库与svn官方发布的binary进行link,那么无论如何都会出现crash的问题。最为彻底的解决方案,还是自行编译svn源码。
在win32下编译svn源码说明:
首先需要从官方下载一份SVN源码,版本可以根据需要选取,比如最新的Release 1.6.3(目前已经更新到1.6.6)可以在这个地址下载到:
http://subversion.tigris.org/downloads/subversion-1.6.3.zip
以及svn所需的依赖包:
http://subversion.tigris.org/downloads/subversion-deps-1.6.3.zip
如果需要支持ssl的话,还需要下载openssl(根据实际需要选择相应版本):
http://www.openssl.org/source/
如果需要BerkeleyDB的话,需要下载WindowsBDB(BDB是可选的,如果不使用BDB,则默认使用FSFS):
此外还有Windows libintl:
解压svn源码包,可以在subversion-1.6.3目录中找到这么一个官方发布的说明文件INSTALL。该文件详述了安装通过源码编译SVN所需依赖的工具及第三方库,并且给出了详细的步骤。
网上同样有一个INSTALL的说明,可以在这里访问到:
http://svn.collab.net/repos/svn/trunk/INSTALL
编译开源项目的话,其附带的INSTALL说明都是最重要也是最全面的参考。网上搜索的其他资料,也会有相应的参考价值,但无论如何,其信息的来源也是INSTALL。因此编译开源项目时,认真阅读INSTALL是最重要且效率最高的。
从Google上进行一下简单的搜索的话,可以找到一篇介绍svn源码编译的文章,在这里:http://rocksun.cn/?p=103
为了后续的步骤方便,我们需要先准备编译所必须的一些东西:
包括Perl:http://www.activestate.com/activeperl/
Python:http://www.python.org/download/
安装Python以及Perl,比如分别安装到D:\Python26以及D:\Perl。安装好之后,将python以及perl的bin目录设为系统目录并重新启动使之生效。
编译svn源码第一步,将下载的svn源码包解压到X:\SVN\svn—trunk下。X可以是任意一个盘符。在我的机器上,我使用了F盘,下文中皆以F盘举例。
在F:\SVN\svn-trunk中解压了刚才下载的svn源码包以及依赖之后,可以在目录
F:\SVN\src-trunk\subversion-1.6.3中看到以下文件及目录:

以及文件:

Svn的编译需要依赖libapr以及libapr-util,SQLite,zlib,libintl可选,libneon/libserf二则择一,openssl可选,BerkeleyDB可选,libsasl可选,对Python,Perl,Java,Ruby支持的模块可选,以及KDELibs,GNOME Keyring可选。
我们依次先编译依赖项:首先进入到subversion-1.6.3\apr目录中。可以看到存在apr.dsw以及apr.dsp文件,这是VC6的工程文件。我们如果想在2005下编译的话,需要将其转换成sln及vcproj文件,简单的用vc2005打开该文件并保存即可。该目录下还有Makefile.win文件,是win下的makefile,我们打开makefile.win文件查看一下说明:可以得知如果需要编译.sln文件的话,需要置USESLN=1。
在VC2005的命令行中输入nmake -f makefile.win buildall checkall USESLN=1便可以开始编译apr了。Checkall表示编译完成后会去运行所有的测试用例。
编译完成后,当前目录下会多出2个文件夹,分别是LibR – StaticRelease,Release – DllRelease。如果选择Debug编译,则会生成LibD – StaticDebug, Debug – DllDebug。
类似的,我们将apr-util以及apr-iconv也编译好。
编译zlib:
进入zlib目录后,使用以下命令编译zlib库
nmake -f win32/Makefile.msc
编译openssl:
将此前下载的openssl解压到F:\SVN\openssl
阅读其INSTALL文档(INSTALL.W32)
使用VC编译openssl首先需要运行configure:
perl Configure VC-WIN32
接着运行
ms\do_masm
这里的do_masm是一个bat脚本,该脚本会生成nt.mak以及ntdll.mak分别是Release版本的静态和动态的库的make文件。如果想生成debug版本的make文件,可以通过修改do_masm.bat中的调用mk1mf.pl脚本处的参数实现,具体参数可以参考mk1mf.pl文件自身的说明。
接下来,创建动态链接库版本的ssl库用nmake -f ms\ntdll.mak,以及静态版本使用:nmake -f ms\nt.mak
生成的结果文件位于out32dll文件夹,以及out32文件夹中。
编译neon
进入F:\SVN\src-trunk\subversion-1.6.3\neon目录
nmake –f neon.mak
默认生成的是release版的libneon.lib (debug版为libneonD.lib)
可以用nmake –f neon.mak DEBUG_BUILD=1生成debug版的lib。
回到F:\SVN\src-trunk\subversion-1.6.3
运行python gen-make.py –help可以了解如何使用gen-make.py生成我们所需的svn编译文件。
由于在此,我打算选用neon, libintl, openssl(本例中并不打算使用BDB,如果需要BDB则需要增加—with-berkeley-db=DIR参数)进行编译,目前需要关注的几个重要参数如下:
–with-apr=DIR
–with-apr-util=DIR
–with-apr-iconv=DIR
–with-neon=DIR
–with-libintl=DIR
–with-openssl=DIR
–with-zlib=DIR
–vsnet-version=VER
运行
F:\SVN\src-trunk\subversion-1.6.3>python gen-make.py -t vcproj
–with-apr=apr –with-apr-iconv=apr-iconv –with-apr-util=apr-util –with-libintl=svn-win32-libintl –with-openssl=..\..\openssl –with-zlib=zlib –vsnet-version=2005
(其中的libintl需要解压到当前文件夹中)
即可生成vc2005的sln(subversion_vcnet.sln)文件了。
打开vc2005,选择Debug编译选项,对项目ALL进行编译。如果一切顺利,则会生成一个F:\SVN\src-trunk\subversion-1.6.3\Debug目录。内容包括svn的所有的lib及可执行文件。

将svn\svn.exe以及所有目录下的.dll文件拷贝到一个新建的bin目录下。将openssl的dll,apr, apr-util, apr-iconv的dll拷贝到同样的bin目录下,如下图:

运行svn –version看看结果吧~
最后,当我们有了自行编译的svn可以做什么?你可以做任何你想做的事——比如自己基于svn的接口进行开发(可以参考开源项目rapidsvn以及TortoiseSVN的源码)
读书笔记——《思维改变生活》
3我们对自身生活状况的满意程度乃至于生活本身,都取决于我们对事物的认知。
认知由人头脑中的思维,“想法”(thoughts)和“观念”(belief)组成。
我们的全部认知来源于我们的感知(童年经历,打过交道的人,人生经历,书本,媒体以及生物学倾向性biological predisposition)
认定生活(事情)必须(应该)是某个样子的,就必然给你带来烦恼。 因为,根据认知科学的理论:并不是人和事让我们喜悦或悲伤——它们只不过是提供了一种刺激。其实是我们的认知决定了我们在特定情况下的感受。(ABC模型:A(前因:antecedent),B(观念:belief),C(结果consequences))这要求我们学会辨认思维中消极荒谬的观念,并且学会质疑这些荒谬、消极的观点。
人们天生就倾向于用不合理的、自我挫败的方式来思考。(什么样的思维是不合理的?如果我们的思维违背了我们追求生存与幸福的内在欲求,那么它就是不合理的)书中罗列了几种常见的错误思维方式:
以偏概全(overgeneralisation):(有时候仅凭一次经历,我们就用“总是”、“从来不”、“每个人”);
自找罪受(我们觉得自己应该为某事负责,然而该事情并不是我们造成的;或者我们呢错误的以为别人的言行是针对我们的——我们容易感到愤愤不平,容易把别人的言行视为粗暴无礼,并且以牙还牙);
心理滤除(mental filter)关于自身、他人和世界的信条可以使我们对自身经历的感知出现偏差。如果信息与我们已有的信条不一致,我们就将其过滤掉。 (证实偏差,人们倾向于寻找能够确认或者支持自己已有观念的证据)
草率得出负面结论(jumping to negative conclusions):很多人倾向于对各种情况得出负面结论,而不管支持这种结论的依据是多么有限。
贴标签(labeling):仅凭一两个行为或者一两个特点就概括了整个人(ref to 以偏概全),重要的是区分一个人的某些行为并不是这个人的全部。
很多时候,我们从逻辑上明白自己的思维是消极的或者不合逻辑的,但是在内心里却很难加以改变。这是由于逻辑等高级思维体验源于大脑额页的皮层,而情感体验源于杏仁核,外部刺激首先传导到负责情感的区域,激起兴奋或者恐惧,然后才为负责逻辑的额页所处理,因此我们在遇到意料之外的问题时,往往会首先感到兴奋、愤怒、惊恐,并在这些情感的刺激下做出行动,从而把理性以及逻辑抛之一旁。这种应激情绪反应在进化当中是有其积极意义的,比如当遭遇猛兽时感到巨大的恐惧而立即逃跑,可能会有利于生存。
归根结底,是进化赋予我们的神经系统,决定了我们总是会遇到逻辑与情感的冲突。(ref. 《找寻逝去的自我》,《欲望之源》)但这并不是说我们对此无能为力,认识到情感与逻辑冲突的内在原因,就是改变生活的第一步。
当我们得不到自己想要的东西时,会体验到挫折。有一种频繁造成挫折感和自我打击的思维模式,就是认为本已发生的事不该发生。如果从符合逻辑的角度思考,我们从已经发生的事情中吸取教训,以避免再次犯同样的错误,这是有用的;但是,很多时候,我们只是不断告诉自己不该做我们已经做过的事情,这既无意义,也不合逻辑。
当我们遭到不公平对待时,会体验到愤怒。愤怒可以引发搏斗或逃跑反应(fight-or-flight response),数百万年的进化历程中,这一反应为我们的祖先提供了所需的额外能量储备,让他们要么与野兽搏斗,要么逃跑。搏斗或逃跑反应在体内引发一些生理变化:为了增加我们对氧气的摄取和消耗,并提供可以迅速获取的能量。
然而在当今社会中,这种愤怒引发的附加反应越来越不适用了。
愤怒导致我们无法清醒而理性的思考,使得注意力从问题本身移开,而关注自己受到的侵犯、不公以及别人的邪恶。同时,愤怒是最能激发生理反应的情绪之一,长期激动导致的生理变化会损害健康。再次,愤怒常常表现为敌对或攻击行为,破坏我们的人际关系。
事实上,不公正可能只是我们基于自身考虑的想法:尽管我们执着于自己的观点,但是我们的观点却不一定正确或全面,而只是看待当前状况的众多方式的一种。通常是我们觉得重要的规则遭到了破坏,才觉得愤怒,因此,是我们自己使自己愤怒,外部发生的事情是刺激,是我们的认知决定了我们在特定情况下的感受,倘若我们不认为事情非如何不可,那么愤怒便不会产生。
当我们预期坏事情将要发生时,感到的担忧与畏惧,是焦虑。进化促进了焦虑:对于动物和人来说,在进化的历史上,焦虑层有利于生存——焦虑提高了我们探测环境中威胁的能力,并让我们迅速增加能量,逃离那些威胁。然而事实上,在现代社会中,焦虑增加了我们的痛苦,因为,我们大部分痛苦实际来自于对事情的负面预期而非事件本身。通过面对自己的恐惧,可以降低焦虑,反之,逃避问题会强化我们觉得这类情景很危险,从而降低我们在未来遭遇这类情境时的应对能力。
很多时候,遭遇冲突或者遇到尴尬情况时,我们需要沟通以解决问题。然而,很多时候,我们不愿意传递全面的信息——我们可能会指出问题的存在,却不说出自己的感受或想法;或者我们本应做出严正的声明,却只是提出了一个问题。我们提供片面的信息是为了避免发生冲突或者受到非议。虽然我们也想解决问题,但是我们没有信心进行坦率的沟通,所以我们希望别人能够领会我们的暗示和模棱两可的话。
有效沟通的习惯:
1,果敢坦率:沟通的要点在于“我们的权益都很重要——让我们相互理解吧”。
2,愿意和解:我们并不一定要满足自己的要求,我们只是想交流自己对事情的看法——愿意和解=我想让事情对大家都公平。
3,说出来:当我们发现别人说话做事让我们感到不愉快时,最好指出这一点。把我们的想法感受要求告诉别人,这就为别人提供了反馈,让别人知道他们的言行对我们意味着什么。4,“我”字开头陈述:典型的“我”字句会描述别人对我们造成问题的行为,描述我们的感受,还描述我们希望看到的另一种行为——我字句的一大好处就是他们对事不对人:这种区分是重要的,因为行为容易改变。当我们关注别人的行为,我们并不是在攻击他们本人。
5,提供完整信息(包括观察到的客观事实,我们的想法,我们的感受,我们希望看到的情况):完整的信息可以提供一个沟通的框架,让我们清楚、理性、平和的沟通。
通过思维改变生活的关键在于——
通过逻辑,理性的判断,对生活中发生的事情(刺激)做出适当的反应,学会控制自己的大脑,而不是任由大脑中自远古进化中所得来的情绪反应支配。
反思我们支配时间的方式:在大部分人的生活中,知道应该怎么做与实际上怎么做并没有太大联系。我们应当扪心自问,我们的生活方式是否与我们的想法一致?