2006/07 28
今天注册一域名:
b2ctalk.com
准备用于一聊天系统。以前在公司进行过开发,现在准备重新开始,看看自己能不能写一个完整的系统,并争取商业化。
试试看,不过也不急,我希望能够用自己一套完整的开发流程,从系统需求分析,程序开发测试等全部规范化。域名便宜,一年才几十块。

Defined tags for this entry:

Posted by rollenc

Not modified
2006/07 27
也许不多的人会承认自己不能浪漫,但我估计是这种。之所以用估计两字,是因为自己以为自己可能也许能够在某一时刻学会浪漫一下。
自己也不是很会安慰人,特别是撒娇时明知故问的反话无聊话。我会感觉到无理取闹。
追求实际的生活,这和浪漫的确无关。也不知道是天生如此,还是被生活生存所消磨。
不知道如何讨她人开心。自己,也茫然。
也许,命本该独。

Defined tags for this entry:

Posted by rollenc

Not modified
2006/07 26
也许每个人在忙着自己的生活,QQ群上的人越来越少了。前阵子晚上六人的小会没得开了。
可能偶尔碰到了一两个人,问一下,兄弟安好。其他的,可能以被自己的生活烦劳给占据,话少了。
情,不是不深,只是在忙碌的生活中可能已经将往事忘却。
我近来安好,希望每个以后都安好。

Defined tags for this entry:

Posted by rollenc

Not modified
2006/07 25
目前项目的境界追求,因此,不得不在技术上不断的吸收国外的风格,代码,类库,现在想要使头脑中使用中文的习惯改变,阅读了过量的英文数据资料,我不喜欢在头脑中来一次歧义的转变,因此,开始腻力的去学习,如果去写英文。
英盲的我,又要累了。不要超负荷。
(其实我更希望能够有个英语环境,让我完全去忘记中文。本来想用洋文写此文的,但怕三天之后我就看不懂我写了什么,于是,中文!)

Defined tags for this entry: ,

Posted by rollenc

Not modified
2006/07 24
规划中,我不是一辈子的程序员。我不认为这是一个不好的想法,更不是说程序员没有发展,不喜欢程序员这个职位。就象一个士兵,士兵很少愿意当一辈子士兵,不想当将军的士兵不是一个好士兵。
25岁,目标:项目经理。离这个年龄不近也不远,但在管理能力来讲,差距还是很大,可以来讲,还没有入门。
本来想走点捷径,看点IT管理的资料,自己熟悉一下行业内部情况。但找了很久,也找了很多,但始终没有很到很成熟的。另外也了解了一点,IT业是为非IT业服务的。所以了解“外行”的知识很重要。自己作系统分析也离不开需求分析,这很多都是与“外行”交流的事情。另外现在我最需要管理的是我自己,不是项目,更不是其他员工。
我开始去找其他的管理资料,视频的。
现在在看余世维的管理,随便涉猎一下。希望对自己有大的的影响。25岁前,我不希望能够当上或作为一个好的管理者,我会尽可能成为以个优秀的被管理者。
另外,管理个人,我会涉猎一些营销管理,我领教过这种营销文化,营销理念对个人的影响近乎是狂热的。

Defined tags for this entry: ,

Posted by rollenc

Not modified
2006/07 23
最近耳边总有争吵,工作上的,生活上的。当然,我不是生活争吵的主角,听角而已。
我的爱情中出现争吵我会选择逃避,一个人安安静静散心,当然,也可能沉在某一环境中比如网络比如工作中躲避。
工作上的交流免不了,也躲不了。我也非常同意在工作上的争执和辩驳,这为了协商和统一,也能充分吸收到很多的思想和方法。但在这种过程中的许多不和:列之:
1.被人抢言。我本不善发言,被人抢言之后可能只剩敷衍,当然,敷衍的结果是完全的对自己不利,很多不该答应的难以实现的东西也被这样敷衍下来了。后果可以想象。
2.否定。对方可以否定这个项目,可以否定我的IDEA,但我不希望我个人被人否定。我不会偏激和敏感,把否定加在自己身上,相反我会把所有否定加到IDEA中,一个IDEA的失去,可以在第二个IDEA,第三个中找到信心。对于此点只能一句,不要太过分,结果是我可能一言不发,此交易失败。我不喜欢很不愉快的交流。
3.粗话,我会有此人不足一谈的感觉。


Defined tags for this entry: ,

Posted by rollenc

Not modified
2006/07 22
服务器端安装:
Ubuntu下:
在synaptic中选择apache2,libapache2-svn,subversion,subverion-tool,libsvn0以及其他依赖的软件包,自动安装。
windows下:
下载安装包:svn-1.2.3-setup.exe,双击安装。

服务器端配置:
1.建立版本库
svnadmin create /var/svn (Ubuntu)
svnadmin create E:/svn (Win32)
或者使用服务端也成,具体可以参考其他相应文章.这些方式在 http://www.subversion.org.cn/content/view/18/1/ 文中写的很详细。你会发现在/var/svn(E:/svn)中有不少的文件夹。这说明版本库建立成功。
2.建立服务器进程:
1)可以使用svnserve,但我个人不推荐,这种方式在 http://www.subversion.org.cn/content/view/18/1/ 文中也详细有介绍,不再重复了。
2)使用apache当服务器:
Ubuntu:
$cd /etc/apache2/mods-enabled
$ls //你会发现有 dav.load,dav_fs.conf, dav_svn.conf ,dav_fs.load , dav_svn.load 这些文件。
$sudo kate dav_svn.conf
按照上面的英文提示操作,把dav_conf改为(去掉了注释,在实际中你只需要做相应修改。其实具体方法全部在注释里写明了。WINDOWS用户就没这么运气):
<Location /svn>
DAV svn
SVNPath /var/svn #你在上面建立版本库时的路径
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile /etc/apache2/dav_svn.passwd
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>
</Location>
保存,建立密码:
$rm -f /etc/apache2/dav_svn.passwd
$htpasswd2 -c /etc/apache2/dav_svn.passwd firstUser
$htpasswd2 /etc/apache2/dav_svn.passwd secondUser #请注意,加以后的用户时不要加 -c ,-c会将以前的所有用户全部删除.
$sudo apache2 -k restart #重启apache2.
这样你现在就可以通过http://yourhost/svn/访问你的版本库了。访问不需要密码,但存入等操作需要用户名和密码,具体权限问题可以参考官方说法,
Windows:
操作基本相同,只是Apache配置文件组织不同而已,相应乍改变。
3.创建钩子,自动更新测试服务器上文件:
$cd /var/
$sudo mkdir www #如果本来有文件,请备份后删除此文件夹
$sudo chown www-data www #改变这个文件夹为APACHE进程用户
$sudo su www-data #以apache进程的使用者登陆,具体为什么样的值可以在APACHE的CONF中找到
$svn checkout http://yourserver/svn www #取出一次,不管现在版本里面有没有东西
$exit #退出www-data用户
$cd /var/svn/hooks/
$sudo chmod 777 post-commit
$sudo kate post-commit
更改文件为:
REPOS="$1"
REV="$2"
E=(`svn update /var/www`)
#/var/www为你的测试服务器WEB根目录。
保存。测试服务器完成。
Windows下需要把文件保存为post.commit.bat或.com等可以被WINDOWS直接运行的文件后缀。svn运行目录也许要更改,具体我没有测试,抱歉了。

现在可以使用http://yourserver/svn进行版本控制,使用http://yourserver/进行测试。

参考:
用 Subversion 构建版本控制环境 http://www-128.ibm.com/developerworks/cn/opensource/os-subversion/
Subversion中文站 http://www.subversion.org.cn/


Defined tags for this entry: ,

Posted by rollenc

Last modified on 2007-01-16 13:30
2006/07 21

61条面向对象设计的经验原则



摘抄自《OOD 启思录》--Arthur J.Riel 著 鲍志云 译








“你不必严格遵守这些原则,违背它们也不会被处以宗教刑罚。但你应当把这些原则看成警铃,若违背了其中的一条,那么警铃就会响起。”



----------Arthur J.Riel









(1)所有数据都应该隐藏在所在的类的内部。p13



(2)类的使用者必须依赖类的共有接口,但类不能依赖它的使用者。p15



(3)尽量减少类的协议中的消息。p16



(4)实现所有类都理解的最基本公有接口[例如,拷贝操作(深拷贝和浅拷贝)、相等性判断、正确输出内容、从ASCII描述解析等等]。 p16



(5)不要把实现细节(例如放置共用代码的私有函数)放到类的公有接口中。p17

如果类的两个方法有一段公共代码,那么就可以创建一个防止这些公共代码的私有函数。



(6)不要以用户无法使用或不感兴趣的东西扰乱类的公有接口。p17



(7)类之间应该零耦合,或者只有导出耦合关系。也即,一个类要么同另一个类毫无关系,要么只使用另一个类的公有接口中的操作。 p18



(8)类应该只表示一个关键抽象。p19

包中的所有类对于同一类性质的变化应该是共同封闭的。一个变化若对一个包影响,则将对包中的所有类产生影响,而对其他的包不造成任何影响 .



(9)把相关的数据和行为集中放置。p19

设计者应当留意那些通过get之类操作从别的对象中获取数据的对象。这种类型的行为暗示着这条经验原则被违反了。



(10)把不相关的信息放在另一个类中(也即:互不沟通的行为)。p19

朝着稳定的方向进行依赖.



(11)确保你为之建模的抽象概念是类,而不只是对象扮演的角色。p23



(12)在水平方向上尽可能统一地分布系统功能,也即:按照设计,顶层类应当统一地共享工作。p30



(13)在你的系统中不要创建全能类/对象。对名字包含Driver、Manager、System、Susystem的类要特别多加小心。p30

规划一个接口而不是实现一个接口。



(14)对公共接口中定义了大量访问方法的类多加小心。大量访问方法意味着相关数据和行为没有集中存放。p30



(15)对包含太多互不沟通的行为的类多加小心。p31

这个问题的另一表现是在你的应用程序中的类的公有接口中创建了很多的get和set函数。



(16)在由同用户界面交互的面向对象模型构成的应用程序中,模型不应该依赖于界面,界面则应当依赖于模型。p33



(17)尽可能地按照现实世界建模(我们常常为了遵守系统功能分布原则、避免全能类原则以及集中放置相关数据和行为的原则而违背这条原则) 。p36



(18)从你的设计中去除不需要的类。p38

一般来说,我们会把这个类降级成一个属性。



(19)去除系统外的类。p39

系统外的类的特点是,抽象地看它们只往系统领域发送消息但并不接受系统领域内其他类发出的消息。



(20)不要把操作变成类。质疑任何名字是动词或者派生自动词的类,特别是只有一个有意义行为的类。考虑一下那个有意义的行为是否应当迁移到已经存在或者尚未发现的某个类中。p40



(21)我们在创建应用程序的分析模型时常常引入代理类。在设计阶段,我们常会发现很多代理没有用的,应当去除。p43



(22)尽量减少类的协作者的数量。p52

一个类用到的其他类的数目应当尽量少。



(23)尽量减少类和协作者之间传递的消息的数量。p55



(24)尽量减少类和协作者之间的协作量,也即:减少类和协作者之间传递的不同消息的数量。p55



(25)尽量减少类的扇出,也即:减少类定义的消息数和发送的消息数的乘积。p55



(26)如果类包含另一个类的对象,那么包含类应当给被包含的对象发送消息。也即:包含关系总是意味着使用关系。p55



(27)类中定义的大多数方法都应当在大多数时间里使用大多数数据成员。p57



(28)类包含的对象数目不应当超过开发者短期记忆的容量。这个数目常常是6。p57

当类包含多于6个数据成员时,可以把逻辑相关的数据成员划分为一组,然后用一个新的包含类去包含这一组成员。



(29)让系统功能在窄而深的继承体系中垂直分布。p58



(30)在实现语义约束时,最好根据类定义来实现。这常常会导致类泛滥成灾,在这种情况下,约束应当在类的行为中实现,通常是在构造函数中实现,但不是必须如此。p60



(31)在类的构造函数中实现语义约束时,把约束测试放在构造函数领域所允许的尽量深的包含层次中。p60



(32)约束所依赖的语义信息如果经常改变,那么最好放在一个集中式的第3方对象中。p60



(33)约束所依赖的语义信息如果很少改变,那么最好分布在约束所涉及的各个类中。p60



(34)类必须知道它包含什么,但是不能知道谁包含它。p61



(35)共享字面范围(也就是被同一个类所包含)的对象相互之间不应当有使用关系。p61



(36)继承只应被用来为特化层次结构建模。p74



(37)派生类必须知道基类,基类不应该知道关于它们的派生类的任何信息。p74



(38)基类中的所有数据都应当是私有的,不要使用保护数据。p75

类的设计者永远都不应该把类的使用者不需要的东西放在公有接口中。



(39)在理论上,继承层次体系应当深一点,越深越好。p77



(40)在实践中,继承层次体系的深度不应当超出一个普通人的短期记忆能力。一个广为接受的深度值是6。p77



(41)所有的抽象类都应当是基类。p81



(42)所有的基类都应当是抽象类。p82



(43)把数据、行为和/或接口的共性尽可能地放到继承层次体系的高端。p85



(44)如果两个或更多个类共享公共数据(但没有公共行为),那么应当把公共数据放在一个类中,每个共享这个数据的类都包含这个类。 p88



(45)如果两个或更多个类有共同的数据和行为(就是方法),那么这些类的每一个都应当从一个表示了这些数据和方法的公共基类继承。 p89



(46)如果两个或更多个类共享公共接口(指的是消息,而不是方法),那么只有他们需要被多态地使用时,他们才应当从一个公共基类继承。 p89



(47)对对象类型的显示的分情况分析一般是错误的。在大多数这样的情况下,设计者应当使用多态。p89



(48)对属性值的显示的分情况分析常常是错误的。类应当解耦合成一个继承层次结构,每个属性值都被变换成一个派生类。 p96



(49)不要通过继承关系来为类的动态语义建模。试图用静态语义关系来为动态语义建模会导致在运行时切换类型。p97



(50)不要把类的对象变成派生类。对任何只有一个实例的派生类都要多加小心。p99



(51)如果你觉得需要在运行时刻创建新的类,那么退后一步以认清你要创建的是对象。现在,把这些对象概括成一个类。 p103



(52)在派生类中用空方法(也就是什么也不做的方法)来覆写基类中的方法应当是非法的。p103



(53)不要把可选包含同对继承的需要相混淆。把可选包含建模成继承会带来泛滥成灾的类。p108



(54)在创建继承层次时,试着创建可复用的框架,而不是可复用的组件。p112



(55)如果你在设计中使用了多重继承,先假设你犯了错误。如果没犯错误,你需要设法证明。p120



(56)只要在面向对象设计中用到了继承,问自己两个问题:(1)派生类是否是它继承的那个东西的一个特殊类型?(2)基类是不是派生类的一部分?p121



(57)如果你在一个面向对象设计中发现了多重继承关系,确保没有哪个基类实际上是另一个基类的派生类。p122



(58)在面向对象设计中如果你需要在包含关系和关联关系间作出选择,请选择包含关系。p135



(59)不要把全局数据或全局函数用于类的对象的薄记工作。应当使用类变量或类方法。p140



(60)面向对象设计者不应当让物理设计准则来破坏他们的逻辑设计。但是,在对逻辑设计作出决策的过程中我们经常用到物理设计准则。 p149



(61)不要绕开公共接口去修改对象的状态。p164
Defined tags for this entry:

Posted by rollenc

Not modified
2006/07 19
正则表达式难于书写、难于阅读、难于维护,经常错误匹配意料不到的文本或者错过了有效的文本,这些问题都是由正则表达式的表现和能力引起的。每个元字符(metacharacter)的能力和细微差别组合在一起,使得代码不借助于智力技巧就无法解释。
许多包含一定特性的工具使阅读和编写正则表达式变得容易了,但是它们又很不符合习惯。对于很多程序员来说,书写正则表达式就是一种魔法艺术。他们坚持自己所知道的特征并持有绝对乐观的态度。如果你愿意采用本文所探讨的五个习惯,你将可以让你设计的正则表达式经受的住反复试验。
本文将使用Perl、PHP和Python语言作为代码示例,但是本文的建议几乎适用于任何替换表达式(regex)的执行。

一、使用空格和注释
对于大部分程序员来说,在一个正则表达式环境里使用空格和缩进排列都不成问题,如果他们没有这么做一定会被同行甚至外行人士看笑话。几乎每个人都知道把代码挤在一行会难于阅读、书写和维护。对于正则表达式又有什么不同呢?
大部分替换表达式工具都具有扩展的空格特性,这允许程序员把他们的正则表达式扩展为多行,并在每一行结尾加上注释。为什么只有少部分程序员利用这个特性呢?Perl 6的正则表达式默认就是扩展空格的模式。不要再让语言替你默认扩展空格了,自己主动利用吧。
记住扩展空格的窍门之一就是让正则表达式引擎忽略扩展空格。这样如果你需要匹配空格,你就不得不明确说明。
在Perl语言里面,在正则表达式的结尾加上x,这样“m/foo|bar/”变为如下形式:
m/
foo
|
bar
/x
在PHP语言里面,在正则表达式的结尾加上x,这样“"/foo|bar/"”变为如下形式:
"/
foo
|
bar
/x"
在Python语言里面,传递模式修饰参数“re.VERBOSE”得到编译函数如下:
pattern = r'''
foo
|
bar
'''
regex = re.compile(pattern, re.VERBOSE)
处理更加复杂的正则表达式时,空格和注释就更能体现出其重要性。假设下面的正则表达式用于匹配美国的电话号码:
\(?\d{3}\)? ?\d{3}[-.]\d{4}
这个正则表达式匹配电话号码如“(314)555-4000”的形式,你认为这个正则表达式是否匹配“314-555-4000”或者“555- 4000”呢?答案是两种都不匹配。写上这么一行代码隐蔽了缺点和设计结果本身,电话区号是需要的,但是正则表达式在区号和前缀之间缺少一个分隔符号的说明。
把这一行代码分成几行并加上注释将把缺点暴露无疑,修改起来显然更容易一些。
在Perl语言里面应该是如下形式:
/
\(? # 可选圆括号
\d{3} # 必须的电话区号
\)? # 可选圆括号
[-\s.]? # 分隔符号可以是破折号、空格或者句点
\d{3} # 三位数前缀
[-.] # 另一个分隔符号
\d{4} # 四位数电话号码
/x
改写过的正则表达式现在在电话区号后有一个可选择的分隔符号,这样它应该是匹配“314-555-4000”的,然而电话区号还是必须的。另一个程序员如果需要把电话区号变为可选项则可以迅速看出它现在不是可选的,一个小小的改动就可以解决这个问题。

二、书写测试
一共有三个层次的测试,每一层为你的代码加上一层可靠性。首先,你需要认真想想你需要匹配什么代码以及你是否能够处理错误匹配。其次,你需要利用数据实例来测试正则表达式。最后,你需要正式通过一个测试小组的测试。
决定匹配什么其实就是在匹配错误结果和错过正确结果之间寻求一个平衡点。如果你的正则表达式过于严格,它将会错过一些正确匹配;如果它过于宽松,它将会产生一个错误匹配。一旦某个正则表达式发放到实际代码当中,你可能不会两者都注意到。考虑一下上面电话号码的例子,它将会匹配“800-555-4000 = -5355”。错误的匹配其实很难发现,所以提前规划做好测试是很重要的。
还是使用电话号码的例子,如果你在Web表单里面确认一个电话号码,你可能只要满足于任何格式的十位数字。但是,如果你想从大量文本里面分离电话号码,你可能需要很认证的排除不符合要求的错误匹配。
在考虑你想匹配的数据的时候,写下一些案例情况。针对案例情况写下一些代码来测试你的正则表达式。任何复杂的正则表达式都最好写个小程序测试一下,可以采用下面的具体形式。
在Perl语言里面:
#!/usr/bin/perl

my @tests = ( "314-555-4000",
"800-555-4400",
"(314)555-4000",
"314.555.4000",
"555-4000",
"aasdklfjklas",
"1234-123-12345"
);

foreach my $test (@tests) {
if ( $test =~ m/
\(? # 可选圆括号
\d{3} # 必须的电话区号
\)? # 可选圆括号
[-\s.]? # 分隔符号可以是破折号、空格或者句点
\d{3} # 三位数前缀
[-\s.] # 另一个分隔符号
\d{4} # 四位数电话号码
/x ) {
print "Matched on $test\n";
}
else {
print "Failed match on $test\n";
}
}

在PHP语言里面:
$tests = array( "314-555-4000",
"800-555-4400",
"(314)555-4000",
"314.555.4000",
"555-4000",
"aasdklfjklas",
"1234-123-12345"
);

$regex = "/
\(? # 可选圆括号
\d{3} # 必须的电话区号
\)? # 可选圆括号
[-\s.]? # 分隔符号可以是破折号、空格或者句点
\d{3} # 三位数前缀
[-\s.] # 另一个分隔符号
\d{4} # 四位数电话号码
/x";

foreach ($tests as $test) {
if (preg_match($regex, $test)) {
echo "Matched on $test
;";
}
else {
echo "Failed match on $test
;";
}
}
?>;

在Python语言里面:
import re

tests = ["314-555-4000",
"800-555-4400",
"(314)555-4000",
"314.555.4000",
"555-4000",
"aasdklfjklas",
"1234-123-12345"
]

pattern = r'''
\(? # 可选圆括号
\d{3} # 必须的电话区号
\)? # 可选圆括号
[-\s.]? # 分隔符号可以是破折号、空格或者句点
\d{3} # 三位数前缀
[-\s.] # 另一个分隔符号
\d{4} # 四位数电话号码
'''

regex = re.compile( pattern, re.VERBOSE )

for test in tests:
if regex.match(test):
print "Matched on", test, "\n"
else:
print "Failed match on", test, "\n"

运行测试代码将会发现另一个问题:它匹配“1234-123-12345”。
理论上,你需要整合整个程序所有的测试到一个测试小组里面。即使你现在还没有测试小组,你的正则表达式测试也会是一个小组的良好基础,现在正是开始创建的好机会。即使现在还不是创建的合适时间,你也应该在每次修改以后运行测试一下正则表达式。这里花费一小段时间将会减少你很多麻烦事。

三、为交替操作分组
交替操作符号(|)的优先级很低,这意味着它经常交替超过程序员所设计的那样。比如,从文本里面抽取Email地址的正则表达式可能如下:
^CC:|To:(.*)
上面的尝试是不正确的,但是这个bug往往不被注意。上面代码的意图是找到“CC:”或者“To:”开始的文本,然后在这一行的后面部分提取Email地址。
不幸的是,如果某一行中间出现“To:”,那么这个正则表达式将捕获不到任何以“CC:”开始的一行,而是抽取几个随机的文本。坦白的说,正则表达式匹配 “CC:”开始的一行,但是什么都捕获不到;或者匹配任何包含“To:”的一行,但是把这行的剩余文本都捕获了。通常情况下,这个正则表达式会捕获大量 Email地址,所有没有人会注意这个bug。
如果要符合实际意图,那么你应该加入括号说明清楚,正则表达式如下:
(^CC:)|(To:(.*))
如果真正意图是捕获以“CC:”或者“To:”开始的文本行的剩余部分,那么正确的正则表达式如下:
^(CC:|To:)(.*)
这是一个普遍的不完全匹配的bug,如果你养成为交替操作分组的习惯,你就会避免这个错误。

四、使用宽松数量词
很多程序员避免使用宽松数量词比如“*?”、“+?”和“??”,即使它们会使这个表达式易于书写和理解。
宽松数量词可以尽可能少的匹配文本,这样有助于完全匹配的成功。如果你写了“foo(.*?)bar”,那么数量词将在第一次遇到“bar”时就停止匹配,而不是在最后一次。如果你希望从“foo###bar+++bar”中捕获“###”,这一点就很重要。一个严格数量词将捕获“###bar++ +”。
假设你要从HTML文件里面捕获所有电话号码,你可能会使用我们上文讨论过的电话号码正则表达式的例子。但是,如果你知道所有电话号码都在一个表格的第一列里面,你可以使用宽松数量词写出更简单的正则表达式:
;;(.+?);
很多刚起步的程序员不使用宽松数量词来否定特定种类。他们能写出下面的代码:
;;([^>;]+);
这种情况下它可以正常运行,但是如果你想捕获的文本包含有你分隔的公共字符(这种情况下比如;),这将会带来很大麻烦。如果你使用了宽松数量词,你只要花上很少的时间组装字符种类就能产生新的正则表达式。
在你知道你要捕获文本的环境结构时,宽松数量词是具有很大价值的。

五、利用可用分界符
Perl 和PHP语言常常使用左斜线(/)来标志一个正则表达式的开头和结尾,Python语言使用一组引号来标志开头和结尾。如果在Perl和PHP中坚持使用左斜线,你将要避免表达式中的任何斜线;如果在Python中使用引号,你将要避免使用反斜线(\)。选择不同的分界符或引号可以允许你避免一半的正则表达式。这将使得表达式易于阅读,减少由于忘记避免符号而潜在的bug。
Perl和PHP语言允许使用任何非数字和空格字符作为分界符。如果你切换到一个新的分界符,在匹配URL或HTML标志(如“http://”或“
;”)时,你就可以避免漏掉左斜线了。
例如,“/http:\/\/(\S)*/”可以写为“#http://(\S)*#”。
通用分界符是“#”、“!”和“|”。如果你要使用方括号、尖括号或者花括号,只要保持前后配对出现就可以了。下面就是一些通用分界符的示例:
#…# !…! {…} s|…|…| (Perl only) s[…][…] (Perl only) s<…>;/…/ (Perl only)
在Python中,正则表达式首先会被当作一个字符串。如果你使用引号作为分界符,你将漏掉所有反斜线。但是你可以使用“r''”字符串避免这个问题。如果针对“re.VERBOSE”选项使用三个连续单引号,它将允许你包含换行。例如 regex = "(\\w+)(\\d+)"可以写出下面的形式:
regex = r'''
(\w+)
(\d+)
'''
小结:本文的建议主要着眼于正则表达式的可读性,在开发中养成这些习惯,你将会更加清晰的考虑设计和表达式的结构,这将有助于减少bug和代码的维护,如果你自己就是这个代码的维护者你将倍感轻松。

引自: http://www.phpv.net/article.php/1506

Defined tags for this entry:

Posted by rollenc

Not modified
2006/07 19
早已经不习惯中国的国骂了,但最近几天声声入耳,我无言,尽量少说话,这样两个人沉默比不停的听国骂要爽快。
并不能说国骂是一种小市民,只是不习惯,就象在大学里面呆了一年之后回家跟以前的兄弟们聚会聊天,荤段子免不了,这种段子我也说,但国骂我再也无法去接受。可以说猪头,傻的要死,但MD这种字眼总使我感觉别扭。
我们都是文明人,对吧,这种国骂也让它随着往事流走吧。
Defined tags for this entry: ,

Posted by rollenc

Not modified
2006/07 18
手机安静了很久了,除了每天收到一份告知余额不足的短信和每天8点20的闹钟外,手机一直就处于安静状态。我都想测试一下,到底传说中待机300小时是不是属实。
女友也没有过电话了,但好像也没想念的感觉,不想打过去,不知道打过去除了说说现在在干什么,最近几天过得好不好外每什么其他可以聊得东西。我说的她不懂,她说的我不解。现在就是这样,没什么很特别的激情。
就这样吧,手机还是带着,最起码能够当表用。
Defined tags for this entry:

Posted by rollenc

Not modified
2006/07 18

一高中的老友过来了,招待不周,只能带着他随便在上海逛了一遭。而自己也的确一路盲,到了街上自己都没有方向感,拿着地图也分不清东南西北,结果街没逛几条,脚却弄得酸疼。

唉,也可怜我这双破鞋,明天该退役了,去买鞋去,不让就得找老爷借拖板出去逛街了。

Defined tags for this entry:

Posted by rollenc

Not modified
2006/07 17

两人的爱情到现在,算算也有6、7年历史了。高中时常常在一起厮守,到了大学,两地开心。毕业了,自己又在不断给自己加压力,希望自己能够在事业上快点进展,于是,爱情也被这样分离了。另一面家庭的压力也存在着,给了我一种很不快的隔阂。
为了学业,为了事业,为了家庭,爱情一次次的在牺牲着。现在我也不知道自己能够用什么样的心态无看待这份爱情。
童话?现实?我怀疑它的结果。毕竟玫瑰经不住摧残,会凋零。

也许,我现在对于这份爱情的保留仅仅出于一种不想再找第二份爱情。
爱情带给我的伤痕很深,自己也晓得,目前我生活的重点还不在爱情,尽管老爸每次跟我说,工作了,要考虑自己结婚了。我笑笑,还早,上海买套房要一百万。等我混到那时候再说吧。

对于这份爱情,我留下的是太大的歉意。正象上面说的,这份爱情来在那一百万之前,所以,注定了它是贫穷而辛苦的。每天的忙碌,也常常忘了,在自己远方或身边还有一个人在,忘了去挂恋她现在在做什么?打电话时也常常三心二意,如果工作忙的话还压抑不住自己不耐烦情绪。我知道着是什么样的感觉,也没有什么借口可以找。错,只能错在自己,错在自己现在还要忙碌,没有时间去恋爱。

理解,在爱情中体会的太少。也许,这是身边还有另一个女性铁党的缘故。常常孤独,一个人孤独。我并不是不喜欢孤独,只是特别的不喜欢在一个繁华的区域一个人孤独。好象听过一句话,“我和她两个人孤独的待在咖啡馆”。我连上了这种感觉,两个人孤单。什么都不说,只是相拥着,草地也好,沙滩也罢,床上沙发,无论什么地方,没有他人,只要两个人静静的。我喜欢这种时候,静的没有时间的存在,体会一种永恒。所以她也常常在电话里埋怨,为什么不说话,不是没有话说。只是不想说,只想静静得听,或者两个人都不说话,等待电话卡被打爆时那种嘟嘟声。

比较爱情中的人和周围铁党,也有另外的感受,朋友一旦进入了爱情,就注定了没有心心相连的机会,顾虑太多,自己的理想不喜欢让她知道,怕她期望太高,自己压力太大。自己的苦闷,不想让她弱女子来分担。而朋友不然,你可以大大列列的表现,可以肆无忌惮的发泄,因为死党只会要你的命活着,其他的就是希望你精彩。爱情中的人是希望你稳定,能够有安全感。所以面向的人不同,自己的表现,自己的形象只能保持这两份。面具下来,真心就不将存在。
创建于: 2006-07-15 21:32:27

Defined tags for this entry:

Posted by rollenc

Not modified
2006/07 17

没有常写文章习惯,慢慢培养,先把几天前乱七八糟记录的一点点发到这里。

初始:
忙碌了个把星期了,现在资金亦短缺,没有逛上海的欲望。
我尽量的要求好自己,把产品作好,越快越好。等着快点得到自己的收益。不要象现在,一个人,漂泊。

发展:
公司还没有找到很好的牛人,而我,也想着试试,能不能当起领队。
从技术上来讲,我没有什么疑虑。JS,PHP,MYSQL都不会在话下,前台DIV+CSS也有了解,完整项目,子项目也做了很多,所以技术领队没有问题。
但以一个项目经理的要求来看领队,我的能力上欠缺了很多。策划,时间管理,商业分析,用户体验等,很多都还没有涉猎。在整体管理上还有很大的弱项。另外经验上不足,没有当过一个很好的被管理着,我也不明白,如何去做一个好的管理着。
我早已定下了自己的发展路程,项目经理是自己路途的一个里程碑。目前我只能在理论上丰富一下自己的头脑,等到一定时机再实践和释放。

少个人:
来到上海10来天了,感觉还好,整天出于一种忙忙碌碌中,没有时间去想东想西的,所以也很容易忘却一些事情。只有在一同事两口子嘻嘻哈哈时我才会有一点点知道,我身边少了什么。
除了恋爱的玲,我身边总存在有一个女人的,儿童时不说了,高中时一个刘,大学时的冯,给我的岁月生活带来的不是一点点改变。
现在玲不在身边,还是那种不知道什么脾气的脾气,总喜欢乱跑,我也并不想努力再去让她回来,要漂就漂吧,即便回来了,不到三个月后估计又会走的,留不住。而公司里全是MAN,一个带了家眷在身边,其他的都是两地分离。身边基本没有女人可见,于是又开始在QQ中进行无聊的搜索,找找看有没有能够随便瞎扯谈的女人。
两个字,寂寞。
所以我把自己沉默在工作当中,不去想太多。只是担心,自己的身体是不是真的受得了这种折磨。


创建于: 2006-07-12 22:13:49

Defined tags for this entry: , , ,

Posted by rollenc

Not modified
2006/07 17

今天并没有什么很特别的东西,只是想象,要试着去记下点东西,于是就来了。
希望这个不要成为一个鸡肋。

产品基本成型,但老爷说很象一个个人作品,也对,到目前我刚进来半个月,整个产品的生命期也不到半年,所以要走的路很长,这毫无疑问。

慢慢来,思路渐渐明朗,在整体规划上也有的进展,虽然不是很成熟,但也是走上了正轨了。

还有一点很高兴,自己以前的开发环境,软件等全部带入了目前的开发中,对此开发模式我比较了解,这也可以让我有自己的时间去深入。

创建于: 2006-07-13 21:44:47

Defined tags for this entry:

Posted by rollenc

Not modified

(Page 1 of 2, totaling 18 entries)