Tuesday, August 26, 2008

check exchange mail by firefox

This summary is not available. Please click here to view the post.

Thursday, August 21, 2008

svn authorization

预先的环境是: svn server的IP是: 11.12.13.14, OS是windows 2003 server. repository的目录是D:\source, 我们在该repository下建立了两个项目, 分别是Project1和Project2. 建立repository的过程, 见这个blog
常用的Svn访问协议有三种, 第一种是file协议, 第二是svn协议, 第三是https协议.
https协议比较适合于跨广域网的项目开发, 需要有apache的支持, 所以配置比较复杂一些, 可参考网络上的文章 .
  1. Setting up an ASP.NET website development environment using Visual Studio .NET, Subversion, and Windows XP http://www.codeproject.com/KB/aspnet/Subversion.aspx
  2. HOWTO: Subversion for Windows with Apache server - a beginner's guide [version 0.4] http://svn.spears.at/
  3. Setting Up Subversion for One or Multiple Projects http://www.linuxjournal.com/article/7655
file协议最适合一个人的项目, 设置非常简单, 你在你本机开一个svn server, 同时在你本机创建一个repository. 你的svn客户端就可以用file协议访问repository了. 也可以多人一起用, 但必须将repository 的目录共享出来, 所以安全性很差, 不建议在多人项目中使用这种模式.
本机file协议访问project1的url是 file:///D:/source/project1 .
如果是局域网访问的话是, file:///\11.12.13.14/source/project1
Svn协议比较适合于局域网内部多人项目的开发, 在svn server建立了一个repository之后, 我们就可以使用svn协议了, URL是 svn://11.12.13.14/source/project1 ,这是因为缺省情况下, 这个repository已经被开启了匿名读权限了, 但写权限被关闭了. 所以任何人都可以读取这个repository的内容. 我们需要为每个人定制不同的访问权限. 需要修改这个repository目录下的三个文件, 它们都在D:\harry\source\conf下.
(1) svnserve.conf文件, 你需要处理掉4个label的注释, 分别是authz-db和password-db和anon-access和auth-access.需要注意的是, 确保每行前边没有多余的空格, 否则当你访问svn会报错. 另外最好为realm这个label设置一个有意义的名称, 因为svn client连接server时候, 会显示server的realm名称. 同时如果你想让多个repository共用同一组用户账号, 可以将这几个repository的passwd文件指向同一个文件, 可以使用相对路径来指定passwd文件(相对路径是基准是conf目录), 也可以用绝对路径来指定. 需要注意的, 路径必须使用unix风格的分隔符/, 而不能是\.

(2) passwd文件, 在[users]section下定义用户和密码, 每个账号一行,用户名和密码用=号分隔 .
(3) authz文件, 这是最关键的配置文件. 下面是authz文件的配置:
[groups]
Prj1_Dev_Team=harry,helen
Prj2_Dev_Team=tom,peter
Test_Team=sally,mark
QA_Team=andy

[/]
*=r #所有人都能读取这个repository
harry=rw #harry具有这个repository的读写权限

[/project1]
#*=rw #取消所有人的读写权限
@Prj1_Dev_Team=rw
@SE_Team_QA=rw

[/project2]
#*=rw
@Prj2_Dev_Team=rw
@SE_Team_QA=rw
@Test_Team=rw

Saturday, August 16, 2008

Registry requisite tools

Regsnap -registry and windows system folder snapshot tool and analysis tool.
RegMon.exe--product from sysinternal company, it is free tool

Tuesday, August 12, 2008

benefits by using svn

首先先讲一下subversion几个特性.
tortoisesvn安装之后, 有个help文档, 非常好, 不仅包含tortoisesvn的帮助, 而且有很多关于subversion服务器端帮助信息. 网络上有一个中文帮助chm文件, 网站为http://svndoc.iusesvn.com

Subversion 在版本控制方面做的非常好, 它用一个global revision number来标示repository的版本状态. 每次commit, 全局版本号码都增一. Subversion 一个非常好的特点是, 若一个文件在两个版本中没有任何修改, 其实它在Subversion中仅有个保存, 这里采用了类似于Unix的hard-link技术. 所以你不用担心频繁的commit会不会使repository存储快速增大.
HEAD revision指的是最新版本的revision, 但是需要注意的是, 如果你要针对HEAD revision进行某种操作时候(比如合并), 你的repository可能同时会被其他人进行commit, 这样你的合并结果可能不是你期望的那个. 所以最好的方式是, 在你合并时候, 指定版本号, 即使是合并最新版本, 也要先获取它的版本号.

Subversion为开发流程提供的新的模式
单单就subversion的合并功能, 其实对于开发模式来讲, 具有非常大的变革. 比如我们要增加一个新的feature, 这个feature的开发有一定的风险或者我们要将这个feature的开发交给另一个team. 通常我们可以将当前的trunk做一个branch, 专供new feature开发的. 由于在new feature的开发中, trunk的代码也在不断演进, 甚至是new feature依赖的基础也可能会变化的, 所以我们不能期待在new feature开发完毕之后, 再将branch和trunk合并, 这样branch的改动量会很大, 所以我们应该每个一周就将trunk的代码合并到branch中, 这样每次合并对于branch这边的冲击会小一些, 迭代几个周期, 当new feature开发完毕之后, 再将branch合并到trunk中.

Monday, August 11, 2008

routine tortoisesvn operations-2

我自己写了一点关于svn的常用功能, 见http://focuswindows.blogspot.com/2008/08/routine-tortoisesvn-operations-1.html


以下内容摘自http://blog.csdn.net/iNarcissuss/archive/2007/09/16/1787411.aspx

Check-out(检出) 和 Export(导出)
+-------------------------------------------------
从 服务器取得 最新版本(Subversion术语--Head Revision)或某个历史版本的拷贝 复制到本地的某个目录,这个本地的目录有个Subversion专门的术语---working copy(工作拷贝),working copy的特点是自动与服务器关联,并受服务器的版本控制。
所以Subverion的CheckOut相当于VSS的 设定工作路径+签出 。
与CheckOut类似的一个命令是------Export(导出),它能将某个版本复制一份到本机的某个目录,与CheckOut不同的是,这个目录不是woking copy,Export(导出)
后就与服务器没有任何关系了,当然更不会受服务器的版本控制。
TortoiseSVN会在是working copy的目录上加上各种标志,而Export的目录不会有任何标志
SVN Update(SVN 更新) & Get Lock
+-------------------------------------------------
最常用的命令,你可以只CheckOut一次,但是最好经常update,特别是在你修改之前尤其特别一定用Update,以保证本地工作拷贝与服务器项目版本库一致。它的功能是
,从服务器取得最新版本跟新本机工作拷贝,相当于VSS的Get Latest Version,如果习惯VSS,并且对SVN的复制--修改--合并模型不放心的话,可以在Update之后,马上使用
“获取锁定”命令,它的作用是使的别人不可以修改你正在修改的文件,以避免冲突。
Import Export (导入 导出)
+-------------------------------------------------
Import是一种快速批量向服务器添加文件的方法,如果你像把本地的文件或文件夹添加到服务器的某个目录下面,那么在本地目录中,右单击选择Import命令,然后
设定URL即可,这是从别的版本管理系统向VSS迁移的一种方法,在版本浏览器上单击某个目录,会有加入文件和加入文件夹的命令,其中加入文件一次只能加入一个文件
加入文件夹只能加入该文件夹下的所有文件,不能加入子文件夹,你可以根据实际需要使用.需要注意的是, 本机目录导入到服务器后,本机目录没有改变,和服务器也没关联,
并不是工作拷贝。Export命令请在本文其他地方找。
Switch & Relocate (切换和重定位)
+-------------------------------------------------
Switch -----在版本库内改变与当前工作拷贝关联的服务器路径URL(只限于同一个Repository内),应用情景:有时,服务器的目录会有所变化,和你当前工作拷贝
关联的服务器URL改变了,这种改变的直接结果是,你在工作拷贝中所做的修改不能提交到服务器,这时就需要Switch到正确的URL再提交。
Relocate----功能和Switch雷同,差别在于,Relocate实现的是Repository和Repository之间的切换。当服务器地址或Repository名称发生变化时,可以用它来更新
你的工作拷贝。
Create/Apply patch (创建和应用补丁)
+-------------------------------------------------
如果你对某个文件没有修改的权限,但又必须对它进行修改,这时你可以对其创建补丁,然后把补丁发给对此目录有write权限的工作人员,他进行一系列的审核,审核
通过后,他会执行应用补丁命令,可以将你所做的修改提交到服务器上。
copy to working copy...(复制到工作拷贝...)
+-------------------------------------------------
首先,注意这里是working copy ,后面在选择目录时一定不要选错!,当然,选错了tortoisesvn会提示错误的,正确的操作应该是选那些有tortoisesvn标志的目录。
执行此命令会在working copy中增加你copy的目录和文件,然后修改,再commit,repository中就做了相应的变化。
当你需要用到这样一个模块,它与已经存在的某个模块类似,然而又不完全一样,需要有一定改动时,用copy to working copy...命令较为快捷。
Resolved ...(已解决的...)
+-------------------------------------------------
当两个人同时编辑一个文件,一个人先提交后,另一个人再进行提交时就会出现冲突,TortoiseSVN会提出必须更新你的工作拷贝后才能对这个文件进行修改,
Subversion冲突的种类及解决方法
+-------------------------------------------------
--->1.当两个人同时编辑一个文件的不同部分,一个人先提交后,另一个人再进行提交时就会出现冲突
--->解决方法:在冲突的文件上调用命令SVN Update(SVN更新),TortoiseSVN会自动从服务器上下载最新版本,并与本地工作拷贝进行合并,然后调用命令
SVN Commit(SVN 提交),就会自动生成一个新版本传到服务器上。
--->2.当两个人同时编辑一个文件的相同部分,一个人先提交后,另一个人再进行提交时就会出现冲突
--->解决方法:这种情况下调用SVN Update时,由于是同一部分修改,TortoiseSVN不知道应该怎么办,它会自动在发生冲突的文件的目录下生成三个文件,一个
发生冲突文件的基础版本,名称为文件的全名再加上基础版本的版本号,如FileConflict.cpp.r90,另一个是你调用SVN Update时更新的版本,名称也是文件
的全名再加上基础版本的版本号,如FileConflict.cpp.r95,它是别人已经修改好提交的文件, 还有一个是你的本地修改,后缀为.mine,而原文件以一种TortoriseSVN能识别的方式显示冲突的双方,而且这个文件上会出现TortoiseSVN的图标,要解决这种
冲突要求造成冲突的两个人进行沟通,确定最终的修改方案,然后进行修改,具体操作是右击有冲突图标的文件,选择“编辑冲突”命令,这时就可以对出现冲突
的文件进行编辑,TortoiseSVN会打开TortoiseMerge,里面会显示别人的修改、你的修改、最终合并的文件,在最终合并的文件中产生冲突的行上右击,根据弹出
菜单选择使用别人的修改、我的修改还是两个都用,编辑完后保存,关闭TortoiseMerge,然后右击有冲突图标的文件,选择Resolved...(已解决的...)命令后
确定即可。

关于“基础版本”及其命令 ---比较差异,检查更新,显示日志,版本分支图
+-------------------------------------------------+-------------------------------------------------
当我们从服务器上CheckOut某个版本,经过一定的修改后,右击修改的文件(注意,不是目录)会有一个“比较差异”命令,调用它会弹出TortoiseMerge,它列出了
当前修改的工作拷贝与我们CheckOut时用到的版本之间的差异,这个被我们CheckOut的版本称为当前工作拷贝的“基础版本”,注意,基础版本不一定是最新版本,最新版
本也不一定是基础版本,比如另一个人和我们CheckOut同一个版本,它在我们之前提交了一份修改会形成一个最新版本----这时,我们进行提交可能造成冲突。
刚才说过,只有文件才会有“比较差异”命令,而目录没有,有没有办法看到目录的变化呢?--肯定有,是哪个呢?先试一下第一个---“显示日志”,结果不行,它只
显示的是当前工作拷贝对应的服务器目录或文件的版本变化记录,从第一个版本到最新版本,一个也不缺。“版本分支图”也一样,它是“显示日志”命令的图形化显示,
功能和“显示日志”完全一样。答案是----“检查更新”,它比较的是当前工作拷贝相对于基础版本的更新记录,不仅能显示文件的变化,也能显示目录的增减等。
Revert (复原) 和 Update to version
+-------------------------------------------------
当你CheckOut并修改了文件后,如果在提交前发现修改不正确,可以用Revert来取消这次的修改,使文件回到基础版本的状态;如果已经提交,可以用Update to Version
(更新至版本)返回某个旧的版本,或者调用显示日志命令,在任意一处日志上单击,在下方会出现修改记录,右击某一记录,在弹出菜单中选择Save Revision to(保存版本至)
,也可以把原来版本进行存档。需要注意的是,你的本地工作拷贝可以返回到原来的版本,可是服务器上只会记录你对它进行最后一个提交的版本,所以服务器端版本不
会 变化,如果你想把服务器端的文档内容也换为原来的状态,可以用旧版本文件覆盖新版本文件,然后提交,或者使用Revert changes from this revision 和 Revert to this revision命令,她们的用法在本文档中有,自己找找,调用显示日志命令,在任意一处日志上右击,在快捷菜单中会出现这两个命令。
注意,Revert命令很危险,它不向Ctrl-Z命令一样一次只撤销一次修改,它的名字是“还原”,它会把所有的修改全部撤销,直接回到基础版本的状态,如果想只撤销
一 次的修改,我的方法是,使用“检查更新”和“比较差异”命令在TortoriseSVN中修改,TortoriseSVN中的"use this text block ","use other text block ","use both text block "等命令很方便,关于这两个命令在本文中也有介绍,自己找。
Revert changes from this revision 跟Revert to this revision的区别?
+-------------------------------------------------
譬如有个文件,有十个版本,假定版本号是1,2,3,4,5,6,7,8,9,10。

-->1.Revert to this revision(恢复到某个以前的版本): 如果在版本6这里点击“Revert to this revision",表示7~10的修改全部作废,历史倒退到了版本6那个年代。
如果你做了多处修改,然后决定要返回到版本 N,你就可以使用这个命令。再次说明,恢复的修改位于你的工作复本,在你提交之前,并不会影响版本库。
注意,这将会丢弃从那个版本以来的所有修改,使用选中的版本来替换文件/文件夹。

-->2.Revert changes from this revision(还原选中版本所做的修改):如果在版本6这里点击“Revert changes from this revision",表示版本6这个历史事件被抹杀了,只剩下9个历史事件了。 如果同时选择了6,7,8三个历史时期并点击“Revert changes from this revision”,表示抹杀6~8这仨历史时期。同理,如果同时选择7~10,然后点击“Revert changes from this revision”,则效果跟在版本6这里点击“Revert to this revision”是一样的。
还原的内容只在你的工作副本中,所以此操作完全不会影响版本库!要注意的是,这个操作仅仅还原该版本中的修改。不是将整个文件替换成选中的那个版本。
它对于已经做过其它无关修改的还原早期修改非常有用。如果你做了本地修改,此命令将会合并修改到工作副本。
关于“基础版本”及其命令 ---比较差异,检查更新,显示日志,版本分支图
+-------------------------------------------------+-------------------------------------------------
当我们从服务器上CheckOut某个版本,经过一定的修改后,右击修改的文件(注意,不是目录)会有一个“比较差异”命令,调用它会弹出TortoiseMerge,它列出了
当前修改的工作拷贝与我们CheckOut时用到的版本之间的差异,这个被我们CheckOut的版本称为当前工作拷贝的“基础版本”,注意,基础版本不一定是最新版本,最新版
本也不一定是基础版本,比如另一个人和我们CheckOut同一个版本,它在我们之前提交了一份修改会形成一个最新版本----这时,我们进行提交可能造成冲突。
刚才说过,只有文件才会有“比较差异”命令,而目录没有,有没有办法看到目录的变化呢?--肯定有,是哪个呢?先试一下第一个---“显示日志”,结果不行,它只
显示的是当前工作拷贝对应的服务器目录或文件的版本变化记录,从第一个版本到最新版本,一个也不缺。“版本分支图”也一样,它是“显示日志”命令的图形化显示,
功能和“显示日志”完全一样。答案是----“检查更新”,它比较的是当前工作拷贝相对于基础版本的更新记录,不仅能显示文件的变化,也能显示目录的增减等。
Branch & Tag (分支与标记)
+-------------------------------------------------
---->1.定义与理解
-->1.1 Branch and Thunk (分支和主线)
版本控制系统的一个特性是能够把各种修改分离出来放在产品的一个分割线上。这条线被称为Branch(分支)。
分支经常被用来试验新的特性,而不会对开发有编译错误的干扰。当新的特性足够稳定之后,产品的分支就可以混合回Thunk(主线)里.

-->1.2 Tag (标记/标签)
版本控制系统的另一个特性是能够标记特殊的版本(例如某个发布版本),所以你可以在任何时候重新建立一个特定的构件和环境。这个过程被称作Tag(标记/标签)。
Subversion 没有专门的用于建立分支和标记的特殊命令,它所谓的分支其实就是一个拷贝,把原目录的内容拷到一个新的目录下面。但是这个拷贝的操作不是真正意义
上的拷贝,Subversion称之为"Lean copy"(便宜复制),它类似于Linux的硬链接,实际的操作是建立了一个内部链接,指向那个被建立分支的目录,只有当我们提交一个文件
的修改,才在分支目录下建立一个真实的文件,它的内容就是我们提交的内容,需要注意的时,这时候,除了这个文件以外,其余的文件仍然是作为被建立分支目录下文件的
链接存在的。
采用Lean copy技术的结果是分支和标记能迅速被创建,并且没有在版本库里占据任何额外的空间。
-->1.3 理解Branch
建立分支的情况举例:
a.Project发行版已经完成,正在继续开发Project贺岁版,计划在两个月后发行。不久,客户开始抱怨Project有问题,于是CheckOut(检出)Project的发行版,
找到几个错误,并进行代码更正。但是当前的版本是个不稳定的版本(现在正处于Project2贺岁版的开发中.....),并且在下个月才能有希望稳定下来,这样就没有办法基于
最新的代码去发行一个修复错误的版本。....这种情况下就可以创建一个Branch(分支),分支的所有文件是基于Project发行版的,可以修改这个分支而不影响到主干(即当
前正在开发的Project2贺岁版),当Project2贺岁版完成时,你可以选定是否要把这个分支同主干(Project2贺岁版)合并或继续保留在这个分支里。
b.如果我们在维护一个项目的文档,但有一天,另一个项目也要这份文档,她们有和我们不同的需求,因此要对文档做一些修改才能适应她们的需要,这时,也可以对
这个文档建立一个分支。
c.Branch可以是项目分支,也可以是私有分支。
所谓的项目分支,是指两个项目需要并发开发,它们基于同一个原始版本的拷贝,且这两个项目又互不干扰的进行独立开发,那么这两条开发线对于原来的那个原始版
本来说,就是项目分支,而原始版本就是项目主干。
所谓的私有分支,是指如果多个人共同负责一个模块,当出现两个人同时修改一个文件的同一部分的情况时,就会不断的出现冲突,开发人员就要花大量的时间解决这
些冲突,而在分支上工作避免了频繁的解决冲突,这种分支叫做私有分支,个人可以在主干上建立一个私有分支出来,当开发到一定阶段以后,可以再对自己分支与主干进
行合并,在与主干进行合并的同时,也能关注到其他人在这一段时间内对主干做的修改。
---->2.创建分支
利用TortoiseSVN有两种方法建立分支:
-->1.从本地工作拷贝到服务器建立,在本地工作拷贝右击在弹出菜单中选择“Branch/Tag”会弹出一个对话框,在其中设定要建立分支的URL即可。
-->2.从URL到URL,在Repository Explorer(版本浏览器)中右击要建立分支的目录,在弹出菜单中选择Copy to...(“复制到...”),在弹出对话框设定要建立分支的URL.
---->3.分支的合并
创建分支后一段时间可以根据需要进行Merge(合并)操作,我们既可以将主线的改动合并到分支上,也可以将分支的改动合并到主线上:
-->1.将主线的改动合并到分支上,需要在分支的工作拷贝下进行合并,合并的范围是从主线上上次合并的版本(或建立分支时候的版本)到当前主线上的最新版本,
如果主线和分支都修改了相同的文件的相同部分,合并后会出现冲突,就要进行解决冲突,如果主线修改但是分支没有修改,则主线上合并的变更内容会增加到当前工作
拷贝中,合并的结果会保存到当前的工作拷贝中,提交后改动就会体现在分支中,如果是第一次合并,则起始版本号是上次建立分支的版本号。
-->2.将分支的改动合并到主线中,需要在主线的工作拷贝下进行合并,相关事项与上雷同。
Blame (追溯)
+-------------------------------------------------
这个命令很不错,能显示文件的所有行在哪个版本中被修改及修改的时间,还可以追溯版本库等,有兴趣可以自己研究。

routine tortoisesvn operations-1

接下来, 我们讲一下tortoisesvn的常规操作. update, revert和switch的区别, 这三个命令的图标都是从服务器端到客户端的箭头, 容易搞混.

1. update是最常用的操作, 就是用来更新本地的work copy, 当然, 如果某个文档是基于svn server的最新版本做了修改,那么update并不会从svn server上download这个文档. 如果你的文档是基于svn server上的一个老版本作了修改, tortoisesvn会让启动一个向导让你解决这个conflict.

2. revert, 这个操作忽略本地work copy的任何修改, 它直接从svn server上下载被你修改了的文档.

3. switch, switch是update的一个超强版本, update是从原有的svn folder下取代码的, 而switch可以指定另一个folder的URL(但是仅限于在同一个repository之下的另一个folder), switch操作使得本地的work copy指向新的URL, 同时更新versioned file的footprint信息. 这个操作因为不需要download所有文档的内容, 所以速度很快.

4. checkout, 就是将svn上的某个directory所有文档都下载到一个本地目录,同时下载文档的footprint信息, 它要求本地目录必须是空目录. 也叫作fresh checkout.

移动和复制

当我们对源码结构进行重新组织时, 经常会对versioned file进行复制和移动操作. Tortoisesvn的move和copy命令比较隐蔽, 在tortoisesvn菜单上是找不到这些命令的, 只能是先选中要移动的folder/file, 然后按下鼠标右键, 拖拉到另一个目录, 这时候会出现一个弹出菜单, 其中就有SVN copy和SVN move.

TortoiseSVN合并和回滚操作

合并功能是Subversion最大的亮点. 它甚至是改变了我们的开发模式(和Sourcesafe的checkout-lock-checkin模式相比). 当然合并操作本身是很复杂的. 主要有3种合并模式, 需要提醒的是, 合并操作后, 结果仅仅反映到本地的work copy上了, 这时候还没有在svn server上进行merge. 如果你真的要在server上merge的话, 需要再执行commit操作.

合并模式1-(merge a range of revisions):即同一个branch不同版本的merge, 在这个向导中, 你需要指定一个URL(因为已经有个缺省值, 所以一般情况下你不需关心这个), 然后你要指定一个要merge的版本序列, 这个不好理解, 为什么是一个版本序列呢? 在一般情况下, 你只需要指定一个版本号, 并不需要merge几个版本. 但svn仍然提供了一个让你一次性merge多个版本的功能.

合并模式2-(reintegrate a branch): 这是subserver提供的一个非常有用的功能, 它可以将我们的另一个branch代码和本地的work copy进行merge.

合并模式3-(合并两个树): 这应该是三种合并模式中, 最灵活的一种, 选项也最多, 你可以指定两个repository 的URL, 以及相应的版本号码, 然后merge.

版本回滚: TortoiseSVN的rollback功能放在Show Log的界面上了, 最方便的一个回滚方法是: Revert to this revision, 这个很好理解, 就是将版本回滚到你选定的那个版本上, 点击之后, 会将work copy回滚到刚刚指定的那个版本. 需要commit之后, 才会将这个版本真正地在svn server上了.