??xml version="1.0" encoding="utf-8" standalone="yes"?>
Q?Q递归表、再、纯表、线性表之间的关pLI
׃windows下不像linux一样都随机配备了sendmail{发送邮件的工具Q所以我们需要在windows上选择一Usmtp服务器,q里我用了JamesQ一个Java的开源的开源项目,实现了完整的邮gpȝ?/p>
本教E是 Windows下Subversion配置理员指?/font>pd教程的一部分Q各个教E采用相同的目录l构和\径,有助于大安诅R?/p>
版本库根目录: d:\svnroot Q其中有project1和project2两个版本库?br />Subversion安装目录: d:\subversion 因ؓJames是JavaE序Q首先你的系l必LJavaq行环境Q我们可以从Sun的官方网站下载,地址?a >http://java.sun.com/javase/downloads/index.jsp。下载直接按照默认安装即可,我选择安装的位|是D:\jdk1.5.0_09Q教E后面将会用这个\径?/p>
James的官方网站是http://james.apache.org/Q我们可以在http://java.sun.com/javase/downloads/index.jsp下蝲James的服务器版本Q目前的最新版本是http://apache.justdn.org/james/server/binaries/james-2.3.0.zip?/p>
下蝲后直接解压羃?yu)p了,然后打开james-2.3.0\bin\run.batQ在@echo off后面增加下面的代码: 我们q个教程会借用subversion官方|站提供的发送邮件脚本,是用perl~写Q所以我们需要下载perl的运行环境?a >http://www.activestate.com/store/productdetail.aspx?prdGuid=81fbce82-6bd5-49bc-a915-08d58c2648ca下的http://downloads.activestate.com/ActivePerl/Windows/5.8/ActivePerl-5.8.8.819-MSWin32-x86-267479.msi。perl的安装位|与后面的教E无养I可以随意安装?/p>
官方|站?a >http://svn.collab.net/repos/svn/trunk/tools/hook-scripts/下提供了一些有用的钩子脚本下蝲Q我们下?a >http://svn.collab.net/repos/svn/trunk/tools/hook-scripts/commit-email.pl.in?/p>
在上一节q行了run.bat后,可以看到如下的提C: 它告诉我们可以用启动正常(不要关闭H口Q,q且可以使用telnetq行理Qؓ此,我们在一个新命o行窗口中q行Q?/p>
注意Q这?27.0.0.1代表了我的本机地址Q如果是在局域网中,可能q里是运行James服务器的ip地址?/p>
然后出现输入用户名和密码的提C,用户名和密码都输入root卛_Q提C登陆成功后Q直接输入下面的命oQ就可以d一个帐P 完成q个操作后,我们可以用我们的邮g客户端(outlook, foxmailQ验证我们的James服务器,我想配置都不是问题,smtp和pop3服务器都输入?27.0.0.1”或q行James服务器主机的IP卛_Q用户名和密码都是rocksunQ设|smtp发送无需认证?/p>
然后可以发送一个测试邮ӞҎ(gu)上面d的用户信息,我们的邮件的目的地址?
rocksun@127.0.0.1 剩下的工作就很简单了Q将commit-email.pl.in重命名ؓcommit-email.plQ存攑֜D:\svnroot\下,然后扑ֈ下面q一行: 修改为: 然后来到D:\svnroot\project1\hooks下,创徏一个post-commit.bat文gQ内容如下: 好了Q在project1的工作拷贝里提交吧,然后看看你刚才配|的邮g客户端,有没有受到这ơ变更的邮g?/p>
]]>
<
html
>
<
body
>
<
div
style
="overflow:auto;height:100px;"
>
<
table
width
="100%"
>
<
TR
style
="position:relative;top:expression(this.offsetParent.scrollTop);background:navy;color:white;"
>
<
TH
nowrap
>
Header A
</
TH
>
<
TH
nowrap
>
Header B
</
TH
>
<
TH
nowrap
>
Header C
</
TH
>
</
TR
>
<
TR
>
<
TD
>
A
</
TD
>
<
TD
>
B
</
TD
>
<
TD
>
C
</
TD
>
</
TR
>
<
TR
>
<
TD
>
A
</
TD
>
<
TD
>
B
</
TD
>
<
TD
>
C
</
TD
>
</
TR
>
<
TR
>
<
TD
>
A
</
TD
>
<
TD
>
B
</
TD
>
<
TD
>
C
</
TD
>
</
TR
>
<
TR
>
<
TD
>
A
</
TD
>
<
TD
>
B
</
TD
>
<
TD
>
C
</
TD
>
</
TR
>
<
TR
>
<
TD
>
A
</
TD
>
<
TD
>
B
</
TD
>
<
TD
>
C
</
TD
>
</
TR
>
<
TR
>
<
TD
>
A
</
TD
>
<
TD
>
B
</
TD
>
<
TD
>
C
</
TD
>
</
TR
>
<
TR
>
<
TD
>
A
</
TD
>
<
TD
>
B
</
TD
>
<
TD
>
C
</
TD
>
</
TR
>
<
TR
>
<
TD
>
A
</
TD
>
<
TD
>
B
</
TD
>
<
TD
>
C
</
TD
>
</
TR
>
<
TR
>
<
TD
>
A
</
TD
>
<
TD
>
B
</
TD
>
<
TD
>
C
</
TD
>
</
TR
>
</
table
>
</
div
>
</
body
>
</
html
>
]]>
]]>
]]>
q义?ListsQ又U列?是线性表的推qѝ即q义表中放松对表元素的原子限Ӟ容许它们h其自w结构?br />
1、广义表定义
q义?/b>是n(n?)个元素a1Qa2Q…,aiQ…,an的有限序列?br /> 其中Q?br /> ①ai--或者是原子或者是一个广义表?br /> ②广义表通常CQ?br /> Ls=( a1Qa2Q…,aiQ…,an)?br /> ③Ls是广义表的名字,n为它?b>长度?br /> ④若ai是广义表Q则U它为Ls?b>子表?br /> 注意Q?/font>
①广义表通常用圆括号括v来,用逗号分隔其中的元素?br /> ②ؓ了区分原子和q义表,书写时用大写字母表示q义?/b>Q用写字母表示原子?br /> ③若q义表Ls非空(n?)Q则al是LS的表_其余元素l成的表(a1Qa2Q…,an)UCؓLs的表?br /> ④广义表是递归定义?br />
2、广义表表示
Q?Q广义表常用表示
?E=()
E是一个空表,光度ؓ0?br /> ?L=(aQb)
L是长度ؓ2的广义表Q它的两个元素都是原子,因此它是一个线性表
?A=(xQL)=(xQ?aQb))
A是长度ؓ2的广义表Q第一个元素是原子xQ第二个元素是子表L?br /> ?B=(AQy)=((xQ?aQb))Qy)
B是长度ؓ2的广义表Q第一个元素是子表AQ第二个元素是原子y?br /> ?C=(AQB)=((xQ?aQb))Q?(xQ?aQb))Qy))
C的长度ؓ2Q两个元素都是子表?br /> ?D=(aQD)=(aQ?aQ?aQ??)))
D的长度ؓ2Q第一个元素是原子Q第二个元素是D自nQ展开后它是一个无限的q义表?br />
Q?Q广义表的深?/b>
一个表?深度"是指表展开后所含括L(fng)层数?br /> 【例】表L、A、B、C的深度ؓ分别????Q表D的深度ؓ∞?br />
Q?Q带名字的广义表表示
如果规定M表都是有名字的,Z既表明每个表的名字,又说明它的组成,则可以在每个表的前面冠以该表的名字,于是上例中的各表又可以写成:
①E()
②L(aQb)
③A(xQL(aQb))
④B(A(xQL(aQb))Qy)
⑤C(A(xQl(aQb))QB(A(xQL(aQb))Qy))
⑥D(aQD(aQD(?))
Q?Q广义表的图形表C?/font>
QaQ广义表的图形表C:
①图中的分支l点对应q义?br /> ②非分支l点一般是原子
③但I对应的也是非分支l点?br />
QbQ广义表的图形Ş状划分:
①与树对应的q义表称为纯表,它限制了表中成分的共享和递归
②允许结点共享的表称再入?br /> 【例】上?d),子表A是共享结点,它既是C的一个元素,又是子表B的元素;
③允?dng)R归的表UCؓ递归?br /> 【例】上?e)Q表D是其自n的子表?/p>
q义表不仅是U性表的推q,也是树的推广?br />
3、广义表q算
׃q义表是对线性表和树的推q,q且h׃n和递归Ҏ(gu)的q义表可以和有向?见第7?建立对应Q因此广义表的大部分q算与这些数据结构上的运类伹{?br /> 在此Q只讨论q义表的两个Ҏ(gu)的基本运:取表头head(Ls)和取表尾tail(Ls)?br /> Ҏ(gu)表头、表定义可知QQ何一个非I广义表的表头是表中W一个元素,它可以是原子Q也可以是子表,而其表尾必定是子表?br /> 【例?br /> head(L)=aQ?tail(L)=(b)
head(B)=AQ?tail(B)=(y)
׃tail(L)是非IQ可l箋分解得到Q?br /> head(tail(L))=bQ?tail(tail(L))=()
寚wIA?y)Q也可l分解?br /> 注意:
q义?)?())不同。前者是长度?的空表,对其不能做求表头和表q算Q而后者是长度为l的非I(只不q该表中惟一的一个元素是I)Q对其可q行分解Q得到的表头和表֝是空?)?br />
]]>
2. frame和window的名字,用于在其他frame或window指定target。 ?
以下两者可以通用Q但是强烈徏议用id不要用nameQ ?
锚点Q通常以前写作<a name="myname">Q现在可以用M的元素id来指定:<div id="myid">。 ?
以下只能用idQ ?
1. label与form控g的关联,
<label for="MyInput">My Input</label>
<input id="MyInput" type="text">
for属性指定与label兌的元素的idQ不可用name替代。 ?
2. CSS的元素选择机制Q以#MyId的方式指定应用样式的元素Q不能用name替代。 ?
3. 脚本中获得对象:
IE支持在脚本中直接以idQ而不是nameQ引用该id标识的对象。例如上面的inputQ要在脚本中获得输入的内容,可以直接以MyInput.value来获得。 ?
如果用DOM的话Q则用document.getElementById("MyInput").valueQ如果要用name的话Q通常先得到包含控件的formQ例如document.forms[0]Q然后从form再引用nameQ注意这样得到的是经q计后发送给服务器的倹{ ?
name与id的还有区别是Qid要符合标识的要求Q比如大写敏感Q最好不要包含下划线Q因Z兼容CSSQ。而name基本上没有什么要求,甚至可以用数字?br />
]]>1Q下载安?/h3>
a. 下蝲安装JDK
b. 下蝲安装James
set JAVA_HOME=D:\jdk1.5.0_09
然后直接q行一下run.batQ就会提C启动了邮g服务器,其中我们使用的就是smtp服务Q这说明James安装成功?/p>
c. 下蝲安装perl
d. 下蝲commit-email.pl.in
2Q配|验证JamesUsing PHOENIX_HOME: D:\tools\james-2.3.0
Using PHOENIX_TMPDIR: D:\tools\james-2.3.0\temp
Using JAVA_HOME: D:\jdk1.5.0_09
Phoenix 4.2
James Mail Server 2.3.0
Remote Manager Service started plain:4555
POP3 Service started plain:110
SMTP Service started plain:25
NNTP Service started plain:119
FetchMail Disabled
telnet 127.0.0.14555
adduser rocksun rocksun
my $svnlook = "@SVN_BINDIR@/svnlook";
my $svnlook = "D:/Subversion/bin/svnlook.exe";
set REV=%2
D:\svnroot\commit-email.pl "%REPOS%" "%REV%"
rocksun@127.0.0.1--from
daijun@gmail.com
]]>
作ؓ一个配|管理员Q需要管理用L(fng)权限Q本文主要介l了使用Subversion的授权文件“authz-db”,同时Z叙述的清晎ͼ我首先澄清一些概c?/p>
q两个术语经怸起出现。其中认证的意思就是鉴别用L(fng)w䆾Q最常见的方式就是用用户名和密码,授权?yu)是判断用户是否具备某种操作的权限,在Subversion里提供了“authz-db”文Ӟ实现了以路径为基的授权,也就是判断用h否有操作对应路径的权限,在Subversion 1.3之后Qsvnserve和Apache一样都可以使用“authz-db”文件?/p>
因ؓ本文是以svnserveZ的,所以先介绍一下版本库目录的结构:
D:\SVNROOT\PROJECT1
├─conf
├─dav
├─db
│?├─revprops
│?├─revs
│?└─transactions
├─hooks
└─locks
其中conf下面有三个文Ӟ
authz
passwd
svnserve.conf
其中的“svnserve.conf”是q个版本库的配置文gQ当使用svnserveӞq个配置文g军_了用什么认证和授权文gQ?/p>
password-db = passwd
authz-db = authz
上面的配|说明用“svnserve.conf”同目录的passwd和authzQ其中的password-db指定了用户密码文Ӟauthz-db是我们的授权文gQ也是我们本文主要介绍的文件?/p>
注意Q用Apache作ؓ服务器时Q根本就不会参考“svnserve.conf”文件的内容Q而是会参考Apache的配|?/font>
使用svnserveӞZ理的方便,应该使用相同的认证和授权文gQ所以应该让所有版本库的配|文件svnserve.conf指向同一个password-db和authz-db文g。下面是一个多版本库的目录Q?br />D:\SVNROOT
├─project1
│?├─conf
│?├─dav
│?├─db
│?│?├─revprops
│?│?├─revs
│?│?└─transactions
│?├─hooks
│?└─locks
└─project2
├─conf
├─dav
├─db
│?├─revprops
│?├─revs
│?└─transactions
├─hooks
└─locks
D:\SVNROOT下有两个目录project1和project2Q都已经创徏了版本库Q所以我们修Ҏ(gu)个conf目录下的svnserve.confQ之指向同一个password-db和authz-db文g?/p>
password-db = ..\..\passwd authz-db = ..\..\authz
q样QD:\SVNROOT\passwd和D:\SVNROOT\authz控制了所有版本库的svnserve讉K。另外在后面的操作中要关闭匿名访问,应该L“anon-access = none”前的?”号Q保证只有认证用户可以访问?/p>
注意Q还有一炚w要注意,那就是svnserve的“realm”的|在上面的讄下,应该保证所有的版本库用相同的realm|q样Q对版本库的密码~存可以在多个版本库之间׃nQ更多细节见客户端凭证缓?/font>?/font>
版本库禁止Q何匿名用L(fng)讉KQ只对认证用h效?/p>
root:配置理理员,对版本库有完全的理权限?/p>
p1_admin1:project1的管理员Q对project1有完全权限?br />p1_d1:project1的开发者,对project1的trunk有完全的权限Q但是对其中?trunk/admin目录没有M权限?br />p1_t1:project1的测试者,对project1的trunk有完全的L限,但是对其中的/trunk/admin目录没有M权限?/p>
p2_admin1:project2的管理员Q对project2有完全权限?br />p2_d1:project2的开发者,对project2的trunk有完全的权限Q但是对其中?trunk/admin目录没有M权限?br />p2_t1:project2的测试者,对project2的trunk有完全的L限,但是对其中的/trunk/admin目录没有M权限?/p>
对应的组及组的用P
p1_group_a:p1_admin1
p1_group_d:p1_d1
p1_group_t:p1_t1
p2_group_a:p2_admin1
p2_group_d:p2_d1
p2_group_t:p2_t1
5Q修改D:\SVNROOT\passwd文g
前面已经说过了,用户和密码文件应该是在D:\SVNROOT\passwdQ所以我们ؓ每一位用戯|权限,文g内容如下Q?/p>
[users] p1_admin1 = p1_admin1 p1_d1 = p1_d1 p1_t1 = p1_t1 p2_admin1 = p2_admin1 p2_d1 = p2_d1 p2_t1 = p2_t1
Z便于验证Q所有密码和用户名一_如果你用的是其他认证方式,q一步可能不同,但是用户名应该都是一L(fng)?/p>
6Q配|授权,修改D:\SVNROOT\authz
[groups]
# 定义l信?/p>p1_group_a = p1_admin1
p1_group_d = p1_d1
p1_group_t = p1_t1p2_group_a = p2_admin1
p2_group_d = p2_d1
p2_group_t = p2_t1
[/]
# 指定所有的版本库默认只读,root可读?br />* = r
root = rw
[project1:/]
# 指定对版本库project1根目录的权限
@p1_group_a = rw
@p1_group_d = rw
@p1_group_t = r[project1:/trunk/admin]
# 指定对版本库project1?trunk/admin根目录的权限Q?br /># p1_group_adQp1_group_d和p1_group_t没有M权限?br />@p1_group_a = rw
@p1_group_d =
@p1_group_t =
[project2:/]
# 指定对版本库project2根目录的权限
@p2_group_a = rw
@p2_group_d = rw
@p2_group_t = r[project2:/trunk/admin]
# 指定对版本库project1?trunk/admin根目录的权限
@p2_group_a = rw
@p2_group_d =
@p2_group_t =
l过以上讄以后Q你会发C些有的事情。当使用用户“p1_d1”,出project1的trunkӞ目录是空的,好像admin目录Ҏ(gu)不存在一P当用p1_d1用户览版本库时Q能够看到admin目录Q但是其中的内容却无法看到?/p>
关于中文目录Q也是没有问题的Q只是注意要把authz文g转化为UTF-8格式Q在我的WINXP的UltraEdit里显C的文g格式为U8-DOSQ具体的做法是用UltraEdit打开authz文gQ然后选择“文?>转换->ASCII转UTF-8”,然后保存?/p>
再复杂的情况也不q如此,在实际的工作中要首先规划好权限,只赋l用h的权限Q保证以最的配置实现最复杂的权限控制?/p>
在Windows NT中(包括Windows XP, Windows 2000, Windows 2003 ServerQ本w包含了一个安装服务的工具Q叫?Service Control"Q也是sc.exe?/p>
例如我的Subversion安装?D:\Subversion"Q版本库?D:\svnroot"Q而我希望对应的Subversion服务名ؓsvnserviceQ安装这个svn服务的命令就可以q样写:
sc create svnservice
binpath= "D:\Subversion\bin\svnserve.exe --service -r D:\svnroot"
displayname= "SVNService"
depend= Tcpip
h意,因ؓ便于察看Q上面的命o分ؓ多行Q但在实际执行时应该在一行里。另外,在以前启动svnserve时会使用"-d"选项Q也是守护q程模式Q在q里不能使用Q会D服务无法启动。同P"-i"?-t"选项也不能用?/p>
在命令行H口执行完这个命令之后,服务q没有启动,你可以l运?net start svnservice"启动q个服务Q然后?net stop svnservice"停止服务?/p>
另外q有两点需要小心处理。首先,如果路径中包括空|一定要用“\”处理?”号Q例如上面的例子中如果svnserve.exe在“c:\program files\subversion\”中Q则命o应该写ؓ“binpath= "\"c:\program files\subversion\bin\svnserve.exe\"”(“”中的内容)Q整个命令如下,U色部分是改变部分:
sc create svnservice
binpath= "\"D:\program files\Subversion\bin\svnserve.exe\" --service -r D:\svnroot"
displayname= "SVNService"
depend= Tcpip
其次Qsc寚w项的格式还有要求,例如“depend= Tcpip”不能写为“depend = Tcpip”或“depend=Tcpip”,也就是?”前不能有空各,而后面必LI格?/p>
如果服务安装的有问题Q你可能需要删除服务。要删除前面d的服务,只需要运?sc delete svnservice"Q?svnservice"是我们创徏服务时用的名字?/p>
默认情况下安装的服务不会随Windows的启动而启动,Z使svn服务能够随Windows启动而启动,需要修改一?sc create"命oQ首先要删除Q,增加"start= auto"选项Q?/p>
sc create svnservice
binpath= "D:\Subversion\bin\svnserve.exe --service -r D:\svnroot"
displayname= "SVNService"
depend= Tcpip
start= auto
当然你也可以使用囑Ş化的工具修改服务的属性,你可以在“开?>q行...”中执行"services.msc"Q然后在界面中修攏V?/p>
链接Q?/p>
关于sc安装svn服务的详l信息,可以看看q篇文章Q?br />http://svn.collab.net/repos/svn/tags/1.4.0/notes/windows-service.txt
最常见和简单的备䆾是直接使用拯命oQ将版本库目录拷贝到备䆾目录上,可以了。但是这样不是很安全的方式,因ؓ如果在拷贝时版本库发生变化,会造成备䆾的结果不够准,失去备䆾的作用,为此Subversion提供了“svnadmin hotcopy”命令,可以防止q种问题?/p>
q记得我们的版本库目录吗Q?/p>
D:\SVNROOT
├─project1
│?├─conf
│?├─dav
│?├─db
│?│?├─revprops
│?│?├─revs
│?│?└─transactions
│?├─hooks
│?└─locks
└─project2
├─conf
├─dav
├─db
│?├─revprops
│?├─revs
│?└─transactions
├─hooks
└─locks
如果要把project1备䆾到d:\svnrootbak目录下,只需要运行:
svnadmin hotcopy d:\svnroot\project1 d:\svnrootbak\project1
但是我们作ؓ配置理员,必须惛_法优化这个过E,如果我们q个目录下有许多版本库,需要ؓ每个版本库写q样一条语句备份,为此我写了下面的脚本Q实现备份一个目录下的所有版本库。我们在D:\SVNROOT下创Z两个文gQsimpleBackup.batQ?/p>
@echo 正在备䆾版本?1......
@%SVN_HOME%\bin\svnadmin hotcopy %1 %BACKUP_DIRECTORY%\%2
@echo 版本?1成功备䆾C%2Q?/p>
q个文g仅仅是对“svnadmin hotcopy”的包装Q然后是backup.batQ?/p>
echo off
rem Subversion的安装目?br />set SVN_HOME="D:\Subversion"
rem 所有版本库的父目录
set SVN_ROOT=D:\svnrootrem 备䆾的目?br />set BACKUP_SVN_ROOT=D:\svnrootbak
set BACKUP_DIRECTORY=%BACKUP_SVN_ROOT%\%date:~0,10%
if exist %BACKUP_DIRECTORY% goto checkBack
echo 建立备䆾目录%BACKUP_DIRECTORY%>>%SVN_ROOT%/backup.logmkdir %BACKUP_DIRECTORY%
rem 验证目录是否为版本库Q如果是则取出名U备?br />for /r %SVN_ROOT% %%I in (.) do @if exist "%%I\conf\svnserve.conf" %SVN_ROOT%\simpleBackup.bat "%%~fI" %%~nI
goto end:checkBack
echo 备䆾目录%BACKUP_DIRECTORY%已经存在Q请清空?br />goto end:end
你在使用的时候,只需要修改backup.bat开头的三个路径Q将两个脚本拯到“SVN_ROOT”下可以了。根据以上的配置Q你只需要运行backup.batQ就可以把“SVN_ROOT”下的版本库都备份到“BACKUP_SVN_ROOT”里Qƈ且存攑֜备䆾所在日的目录里Q例如“D:\svnrootbak\2006-10-22”?/p>
虽然q部分工作很单,可是必须有h定时地去执行q个操作Q例如每周一凌晨Q,Z避免发生遗忘的情况,我们可以这个操作加入到pȝ的atd当中去,例如q是上面的环境,Z安装atdQ我们运行:
at 1:00 /every:M D:\svnroot\backup.bat
q样在每周一凌晨1:00都会执行q个备䆾q程。当然备份在本机也是不安全的Q你也许需要上传到别的机器Q这个就要靠你自己去实现了?/p>
管完全备䆾非常单,但是也是有代L(fng)Q当版本库非常巨大时Q经常进行完全备份是不现实的Q也q不必要Q但是一旦版本库在备份之间发生问题,该如何呢Q这里我们就用到了增量备份?/p>
增量备䆾通常要与完全备䆾l合使用Q就像oracle数据库的归档日志Q记录着每次Subversion提交的变化,然后在需要恢复时能够回到最新的可用状态。在我们q个例子中我们用的是,svnadmin dump命oq行增量的备份,使用Ҏ(gu)是:
svnadmin dump project1 --revision 15 --incremental > dumpfile2
上面的命令实C对修订版?5q行增量的备份,其中的输出文件dumpfile2只保存了修订版本15更改的内宏V?/p>
Z记录每次提交的结果,我们需要用一Subversion的特?-钩子QhookQ?/font>Q看看我们的project1目录Q?/p>
├─project1
│?├─conf
│?├─dav
│?├─db
│?│?├─revprops
│?│?├─revs
│?│?└─transactions
│?├─hooks
│?└─locks
其中的hooks目录里存攄是钩子脚本Q我们在此处只用post-commit钩子Q这个钩子会在每ơ提交之后执行,Z实现我们的备份功能,我们在hooks下徏立一个文件post-commit.batQ内容如下:
echo off
set SVN_HOME="C:\Program Files\Subversion"
set SVN_ROOT=D:\svnroot
set UNIX_SVN_ROOT=D:/svnroot
set DELTA_BACKUP_SVN_ROOT=D:\svnrootbak\delta set LOG_FILE=%1\backup.log
echo backup revision %2 >> %LOG_FILE% for /r %SVN_ROOT% %%I in (.) do if D:/svnroot/%%~nI == %1 %SVN_ROOT%\%%~nI\hooks\deltaBackup.bat %%~nI %2
goto end :end
通过q个脚本Q可以实现D:\svnroot下的版本库提交时自动增量备䆾到D:\svnrootbak\deltaQ确定这个目录存在)Q其中用的deltaBackup.bat其实可以攑֜M地方Q只是对脚本的svnadmin dump的包装,内容如下Q?/p>
@echo 正在备䆾版本?2......
%SVN_HOME%\bin\svnadmin dump %SVN_ROOT%\%1 --incremental --revision %2 >> %DELTA_BACKUP_SVN_ROOT%\%1.dump
@echo 版本?2成功备䆾C%3Q?/p>
以上两个脚本可以直接拯到project2的hooks目录下,不需要修改就可以实现project2的自动备份?/p>
以上的操作已lOK了,现在需要做的是完全备份和增量备䆾l合hQ也是在完全备份后清理增量备䆾的结果,使之只保存完全备份后的结果?/p>
当果真出现版本库的故障,p求我们实现版本库的恢复操作了Q这是用要用svnadmin load命oQ同时也需要上ơ的完全备䆾例如要把上次完全备䆾backuprepoQ和之后的增量备份dumpfileQ?/p>
svnadmin load backuprepo < dumpfile
最后的l果Q可以下?a >svnroot.rarQ将之解压羃到d:\下,然后修改几个bat文g的SVN_HOME可以用了?/p>
Subversion 1.4增加了同步机Ӟ可以实现一个版本库同另一个版本库的同步(但好像只是单向的Q,我们可以用来实现版本库的备䆾或镜像?/p>
svnsync init svn://localhost/project2 svn://localhost/project1
其中project2是目标的版本库,而project1是源版本库。其中的目标版本库必MؓI,而且必须允许修订版本属性的修改Q也是在目标的版本库的hooks目录里添加一个文件pre-revprop-change.batQ内容ؓI即可?/font>
svnsync sync svn://localhost/project2
q时候你update一下你的project2的一个工作拷贝,׃发现有了project1的所有内宏V如果project1又有提交Q这时候project2的版本库无法看到最新的变化Q还需要再q行一遍sync操作Q这h能将最新的变化同步。需要注意的是,目标版本库只能做成只ȝQ如果目标版本库发生了变_则无法l同步了?/p>
因ؓ同步不会更新对历史属性的修改Q所以svnsyncq有子命令copy-revpropsQ可以同步某个版本的属性?/p>
希望在每ơ提交时同步Q则需要在源版本库增加post-commit脚本Q内容如下:
echo off set SVN_HOME="D:\Subversion" %SVN_HOME%\bin\svnsync sync --non-interactive svn://localhost/project2
把以上内容存放ؓpost-commit.batQ然后放到版本库project1下的hooks目录下,q样project1每次提交Q都会引起project2的同步?br />
今天写的q些快捷键都是本人在实际q用中ȝ出来?自己感觉很实?都是以自q喜好E度来排列了,对于的Eclipse如果没有特别说明都用有Eclipse3.0.X以上?个别如果出现不符合的话要么是版本的问?要么是和别的pȝU的快捷键有冲突,譬如输入法的冲突?q时需要修改输入法?下面的快捷键都是EclipseҎ(gu)?其是针对Java Editer?但有些对Eclipse里面的Text也是实用的了,下面是q些快捷键了(?q些快捷键随着自己学习不断的深入和Eclipse版本不断的提高会慢慢的完善的,有些太普通的没有列出来,如Ctrl+A一c?:
Ctrl+1 快速修?最l典的快捷键,׃用多说了)
Ctrl+D: 删除当前行 ?
Ctrl+Alt+?复制当前行到下一?复制增加)
Ctrl+Alt+?复制当前行到上一?复制增加)
Alt+↓?当前行和下面一行交互位|?特别实用,可以省去先剪?再粘贴了)
Alt+↑ ?当前行和上面一行交互位|?同上)
Alt+←?前一个编辑的面
Alt+→?下一个编辑的面(当然是针对上面那条来说了)
Alt+Enter 昄当前选择资源(工程,or 文g or文g)的属?/p>
Shift+Enter 在当前行的下一行插入空?q时鼠标可以在当前行的Q一位置,不一定是最?
Shift+Ctrl+Enter 在当前行插入I(原理同上?
Ctrl+Q 定位到最后编辑的地方
Ctrl+L 定位在某行?(对于E序过100的h有音?
Ctrl+M 最大化当前的Edit或View (再按则反?
Ctrl+/ 注释当前?再按则取消注?/p>
Ctrl+O 快速显C?OutLine
Ctrl+T 快速显C当前类的承结?/p>
Ctrl+W 关闭当前Editer
Ctrl+K 参照选中的Word快速定位到下一?/p>
Ctrl+E 快速显C当前Editer的下拉列?如果当前面没有昄的用黑体表示)
Ctrl+/(键? 折叠当前cM的所有代?/p>
Ctrl+×(键? 展开当前cM的所有代?/p>
Ctrl+Space 代码助手完成一些代码的插入(但一般和输入法有冲突,可以修改输入法的热键,也可以暂用Alt+/来代?
Ctrl+Shift+E 昄理当前打开的所有的View的管理器(可以选择关闭,Ȁzȝ操作)
Ctrl+J 正向增量查找(按下Ctrl+J?你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有,则在stutes line中显C没有找C,查一个单词时,特别实用,q个功能Idea两年前就有了)
Ctrl+Shift+J 反向增量查找(和上条相?只不q是从后往前查)
Ctrl+Shift+F4 关闭所有打开的Editer
Ctrl+Shift+X 把当前选中的文本全部变呛_?/p>
Ctrl+Shift+Y 把当前选中的文本全部变为小?/p>
Ctrl+Shift+F 格式化当前代?/p>
Ctrl+Shift+P 定位到对于的匚wW?譬如{}) (从前面定位后面时,光标要在匚wW里?后面到前?则反?
下面的快捷键是重构里面常用的,本hp己喜Ƣ且常用的整理一??一般重构的快捷键都是Alt+Shift开头的?
Alt+Shift+R 重命?(是我自己最q的一个了,其是变量和cȝRename,比手工方法能节省很多力_?
Alt+Shift+M 抽取Ҏ(gu) (q是重构里面最常用的方法之一?其是对一大堆泥团代码有用)
Alt+Shift+C 修改函数l构(比较实用,有N个函数调用了q个Ҏ(gu),修改一ơ搞?
Alt+Shift+L 抽取本地变量( 可以直接把一些魔法数字和字符串抽取成一个变?其是多处调用的时?
Alt+Shift+F 把Class中的local变量变ؓfield变量 (比较实用的功?
Alt+Shift+I 合ƈ变量(可能q样说有点不妥Inline)
Alt+Shift+V Ud函数和变?不怎么常用)
Alt+Shift+Z 重构的后(zhn)药(Undo)
另一?br />
~辑
作用域 功q快捷键
全局 查找q替换 Ctrl+F
文本~辑器 查找上一个 Ctrl+Shift+K
文本~辑器 查找下一个 Ctrl+K
全局 撤销 Ctrl+Z
全局 复制 Ctrl+C
全局 恢复上一个选择 Alt+Shift+↓?br />全局 剪切 Ctrl+X
全局 快速修正 Ctrl1+1
全局 内容辅助 Alt+/
全局 全部选中 Ctrl+A
全局 删除 Delete
全局 上下文信息 Alt+Q?br />Alt+Shift+?
Ctrl+Shift+Space
Java~辑器 显C工hC描qWF2
Java~辑器 选择装元素 Alt+Shift+↑?br />Java~辑器 选择上一个元素 Alt+Shift+←?br />Java~辑器 选择下一个元素 Alt+Shift+→?br />文本~辑器 增量查找 Ctrl+J
文本~辑器 增量逆向查找 Ctrl+Shift+J
全局 _脓(chung) Ctrl+V
全局 重做 Ctrl+Y
查看
作用域 功q快捷键
全局 攑֤ Ctrl+=
全局 ~小 Ctrl+-
H口
作用域 功q快捷键
全局 Ȁzȝ辑器 F12
全局 切换~辑器 Ctrl+Shift+W
全局 上一个编辑器 Ctrl+Shift+F6
全局 上一个视图 Ctrl+Shift+F7
全局 上一个透视图 Ctrl+Shift+F8
全局 下一个编辑器 Ctrl+F6
全局 下一个视图 Ctrl+F7
全局 下一个透视图 Ctrl+F8
文本~辑器 显C标Z下文菜单 Ctrl+W
全局 昄视图菜单 Ctrl+F10
全局 昄pȝ菜单 Alt+-
D
作用域 功q快捷键
Java~辑器 打开l构 Ctrl+F3
全局 打开cd Ctrl+Shift+T
全局 打开cd层次l构 F4
全局 打开声明 F3
全局 打开外部javadoc Shift+F2
全局 打开资源 Ctrl+Shift+R
全局 后退历史记录 Alt+←?br />全局 前进历史记录 Alt+→?br />全局 上一个 Ctrl+,
全局 下一个 Ctrl+.
Java~辑器 显C大U Ctrl+O
全局 在层ơ结构中打开cd Ctrl+Shift+H
全局 转至匚w的括号 Ctrl+Shift+P
全局 转至上一个编辑位| Ctrl+Q
Java~辑器 {至上一个成员 Ctrl+Shift+↑?br />Java~辑器 {至下一个成员 Ctrl+Shift+↓?br />文本~辑器 {臌 Ctrl+L
搜烦
作用域 功q快捷键
全局 出现在文件中 Ctrl+Shift+U
全局 打开搜烦对话框 Ctrl+H
全局 工作Z的声明 Ctrl+G
全局 工作Z的引用 Ctrl+Shift+G
文本~辑
作用域 功q快捷键
文本~辑器 改写切换 Insert
文本~辑器 上滚行 Ctrl+↑?br />文本~辑器 下滚行 Ctrl+↓?br />
文g
作用域 功q快捷键
全局 保存 Ctrl+X
Ctrl+S
全局 打印 Ctrl+P
全局 关闭 Ctrl+F4
全局 全部保存 Ctrl+Shift+S
全局 全部关闭 Ctrl+Shift+F4
全局 属性 Alt+Enter
全局 新徏 Ctrl+N
目
作用域 功q快捷键
全局 全部构徏 Ctrl+B
源代?br />作用域 功q快捷键
Java~辑器 格式化 Ctrl+Shift+F
Java~辑器 取消注释 Ctrl+\
Java~辑器 注释 Ctrl+/
Java~辑器 添加导入 Ctrl+Shift+M
Java~辑器 组l导入 Ctrl+Shift+O
Java~辑器 用try/catch块来包围 未设|,太常用了Q所以在q里列出,自己讄?br />也可以用Ctrl+1自动修正。?br />
q行
作用域 功q快捷键
全局 单步q回 F7
全局 单步跌 F6
全局 单步跛_ F5
全局 单步跛_选择 Ctrl+F5
全局 调试上次启动 F11
全局 l箋 F8
全局 使用qo器单步执行 Shift+F5
全局 d/去除断点 Ctrl+Shift+B
全局 昄 Ctrl+D
全局 q行上次启动 Ctrl+F11
全局 q行臌 Ctrl+R
全局 执行 Ctrl+U
重构
作用域 功q快捷键
全局 撤销重构 Alt+Shift+Z
全局 抽取Ҏ(gu) Alt+Shift+M
全局 抽取局部变量 Alt+Shift+L
全局 内联 Alt+Shift+I
全局 Ud Alt+Shift+V
全局 重命名 Alt+Shift+R
全局 重做 Alt+Shift+Y
热键:TemplateQAlt + /修改处:H口->喜好讑֮->工作?>按键->~辑->内容辅助。个Z惯:Shift+SPACE(I白)。简易说明:~辑E序代码Ӟ打sysout +Template启动键,׃自动出现QSystem.out.println(); 。设定Template的格式:H口->喜好讑֮->Java->~辑?>模板。程序代码自动排版:Ctrl+Shift+F修改处:H口->喜好讑֮->工作?>按键->E序代码->格式。个Z惯:Alt+Z。自动排版设定:H口->喜好讑֮->Java->E序代码格式制作E序。样式页?>插入tab(而非I格?以内~,该选项取消N,下面I格数目?Q这样在自动~排时会以空?作羃排。快速执行程序:Ctrl + F11个h习惯QALT+X修改处:H口->喜好讑֮->工作?>按键->执行->启动前一ơ的启动作业。简易说明:W一ơ执行时Q它会询问?zhn)执行模式Q设|好后,以后只要按这个热键,它就会快速执行?br />
BufferedReader buf =
new BufferedReader(new InputStreamReader(System.in));
此时Eclipse会警C没有汇入cdQ这时我们只要按下Ctrl+Shift+OQ它?yu)׃自动帮我们Importcd。查看用类别的原始码:Ctrl+鼠标左键点击易说明:可以看到(zhn)所使用cd的原始码。将选取的文字批注v来:Ctrl+/易说明:Debug时很方便。修改处Q窗?>喜好讑֮->工作?>按键->E序代码->Ҏ(gu)视景切换QCtrl+F8个h习惯QAlt+S。修改处Q窗?>喜好讑֮->工作?>按键->H口->下一个视景。简易说明:可以方便我们快速切换编辑、除错等视景。密技:一套Eclipse可同时切换,英文、繁体、简体显C:
1.首先要先安装完中文化包?br />2.在桌面的快捷方式后面加上参数卛_Q英?> -nl "zh_US"J体-> -nl "zh_TW"?> -nl "zh_CN"?br />(其它语系以此cL)像我2.1.2中文化后Q我在我桌面的Eclipse快捷方式加入参数-n1 "zh_US"?br />"C:\Program Files\eclipse\eclipse.exe" -n "zh_US"接口׃变回英文语系噜。利用EclipseQ在Word~辑文书时可不必程序代码重新编排:EclipseE序~辑区的E序代码整个复制下来(Ctrl+C)Q直接脓(chung)(Ctrl+V)?br />Word或WordPad上,(zhn)将会发现在Word里的E序代码格式Q跟Eclipse所讑֮的完全一P包括字型、羃排、关键词颜色。我曾试qJBuilder、GEL、NetBeans...使用复制贴上Ӟ只有~排格式一P字型、颜色等都不会改变。外挂篇Q外挂安装:外挂包下蝲回来后,其解压~后Q?zhn)会发现features?br />pluginsq?个数据夹Q将里面的东襉K复制或移动到Eclipse的features、plugins数据夹内后,重新启动Eclipse卛_。让Eclipse可以像JBuilderX一样用拖拉方式徏构GUI的外挂:
1.Jigloo SWT/Swing GUI Builder Q?a >http://cloudgarden.com/jigloo/index.html下蝲此版本:Jigloo plugin for Eclipse (using Java 1.4 or 1.5)安装后即可由档案->新徏->其它->GUI Form选取要徏构的GUIcd?br />
2.Eclipse Visual Editor ProjectQ?a >http://www.eclipse.org/vep/炚w下方Download PageQ再炚wLatest Release 0.5.0q入下蝲。除了VE-runtime-0.5.0.zip要下载外Q以下这2个也要:
EMF build 1.1.1: (build page) (download zip)
GEF Build 2.1.2: (build page) (download zip)
3.0 M8版本Q请下蝲Q?br />EMF build I200403250631
GEF Build I20040330
VE-runtime-1.0M1安装成功后,便可由File->New->Visual Class开始UI设计。安装成功后Q即可由新徏->Java->AWT与Swing里选择所要徏构的GUIcd开始进行设计。VE必须配合着对应版本Q才能正怋用,否则即安装成功Q用上仍会有问题。用Eclipse来开发JSPE序Q外挂名Uͼlomboz(下蝲面)http://forge.objectweb.org/project/showfiles.php?group_id=97请选择适合自己版本的lomboz下蝲Qlomboz.212.p1.zip表示2.1.2版,
lomboz.3m7.zip表示M7版本....以此cL?br />lomboz安装以及讄教学QEclipse开发JSP-教学文g
Java转exe:实现方式QEclipse搭配JSmooth(免费)?br />1.先由Eclipse制作包含Manifest的JAR。制作教?br />2.使用JSmooth做好的JAR包装成EXE?br />JSmooth下蝲面Q?a >http://jsmooth.sourceforge.net/index.php
3.制作完成的exe文gQ可在有装置JRE的Windows上执行?br />
Eclipse-Java~辑器最佌定:~辑器字型设定:工作?>字型->Java~辑器文字字型?br />(讑֮Courier New -regular 10)~辑器相兌定:H口->喜好讑֮->Java->~辑器外观:昄行号、强调对U显C的Ҏ(gu)受强调显C现行行、显C打印边距,其N,Tab宽度?Q打印编距字D设80。程序代码协助:采预讑֍可。语法:可设定关键词、字W串{等的显C颜艌Ӏ附注:采预讑֍可。输入:全部字段都勾选。Q动说明:采预讑֍可。导览:采预讑֍可。自动排版排出来的效果Q最W合Java设计惯例的设定:自动排版讑֮Q窗?>喜好讑֮->Java->E序代码制作格式。换行:全部不勾选。分行:行长度上限设Q?0。样式:只将强制转型后插入空白勾选。内~空格数目:设ؓ4?br />
l常用到的Eclipse快捷?br />存盘 Ctrl+s(一定记?
注释代码 Ctrl+/
取消注释 Ctrl+\(Eclipse3已经都合q到Ctrl+/?
代码辅助 Alt+/
快速修复 Ctrl+1
代码格式化 Ctrl+Shift+f
整理导入 Ctrl+Shift+o
切换H口 Ctrl+f6<可改为ctrl+tab方便>
ctrl+shift+M 导入未引用的?br />ctrl+w 关闭单个H口
F3 跌{到类、变量的声明
F11 q行上次E序
Ctrl + F11 调试上次E序
Alt + 回下一个编辑点
ctrl+shift+T 查找工程中的c?br />
正则表达?regular expression)对象包含一个正则表辑ּ模式(pattern)。它h用正则表辑ּ模式d配或代替一个串(string)中特定字W?或字W集?的属?properties)和方?methods)?要ؓ一个单独的正则表达式添加属?可以使用正则表达式构造函?constructor function)Q无Z时被调用的预讄的正则表辑ּ拥有静态的属?the predefined RegExp object has static properties that are set whenever any regular expression is used, 我不知道我翻得对不对Q将原文列出Q请自行译)?
[注意] 文本格式的参C用引P而在用构造函数时的参数需要引受如Q?ab+c/i new RegExp("ab+c","i")是实CL(fng)功能。在构造函CQ一些特D字W需要进行{?在特D字W前?\")。如Qre = new RegExp("\\w+")
正则表达式中的特D字W?
|
说了q么多了Q我们来看一些正则表辑ּ的实际应用的例子Q?
E-mail地址验证:
function test_email(strEmail) {
var myReg = /^[_a-z0-9]+@([_a-z0-9]+\.)+[a-z0-9]{2,3}$/;
if(myReg.test(strEmail)) return true;
return false;
}
HTML代码的屏?
function mask_HTMLCode(strInput) {
var myReg = /<(\w+)>/;
return strInput.replace(myReg, "<$1>");
}
正则表达式对象的属性及Ҏ(gu)
预定义的正则表达式拥有有以下静态属性:input, multiline, lastMatch, lastParen, leftContext, rightContext?1?9。其中input和multiline可以预设|。其他属性的值在执行qexec或testҎ(gu)后被Ҏ(gu)不同条g赋以不同的倹{许多属性同时拥有长和短(perl风格)的两个名字,q且Q这两个名字指向同一个倹{?JavaScript模拟perl的正则表辑ּ)
正则表达式对象的属?
|
|