-
SVN权限设置
2010-05-04 17:07:17
大多数情况下在设置SVN时会设置一个群,并社区权限从svn根目录起开始有读写的权限。
但在设置多群的情况下需要注意一下权限的问题
例如:
一个svn库根目录下有两个文件夹FolderA和FolderB。
设置两个群GroupA和GroupB,GroupA从根目录起有读写的权限(对FolderA和FolderB有读写权限),GroupB只对FolderB有只读权限。
设置如下
1.创建指定用户
在passwd文件中创建指定用户
Properties代码- [users]
- user1=user1
- user2=user2
- user3=user3
- user4=user4
2.创建群
在authz文件中创建群
找到[groups]标签在下放创建GroupA和GroupB两个群,并将用户添加到群中
Properties代码- [groups]
- GroupA=user1,user2
- GroupB=user3,user4
3.设置群的权限
在authz文件中设置权限
语法格式:
Properties代码- [<目录>]
- @<群名称>=<权限字母>
设置GroupA权限
Properties代码- [/]
- @GroupA=rw
“[/]”的意思是可看到的范围,从svn库的根目录下任何文件夹以及其内的文件都可以访问
“@GroupA=rw”的意思是GroupA群对根目录下全部文件夹和文件拥有读写的全,“r”代表读,“w”代表写
设置GroupB权限
Properties代码- [/FolderB]
- @GroupB=r
此处就不多解释了
4.其他设置
此时还不能算真正结束设置,在用svn客户端访问某个文件的历史记录时会出现以下信息:
svn:Item is not readable
这会导致无法查看文件的历史记录,此时需要去svnserve.conf文件中修改一下。
进入svnserve.conf文件,查找[general]下有一个被注释掉的参数anon-access,讲anon-access前面的注释符号(#)去除掉,并将anon-access的值设置成none,内容如下:
Properties代码- anon-access = none
重新启动Svn的服务就可以了
-
Tomcat默认首页项目设定
2009-09-20 04:12:56
预期目标:访问网址http://localhost(机器名或IP) 就可以直接访问webapps下的指定项目
基本上的配置都集中在<Tomcat安装目录>/conf/server.xml文件中
步骤:
1.修改默认的端口8080为80端口,并确定没有其他的Web应用占用80端口(如IIS、Apache之类)
2.在</Host>的上一行添加内容格式如下
<Context path="" reloadable="true" docBase="<指定项目文件夹>"/>
解释
path决定访问路径 例如 path="test" 访问http://localhost/test
所以path="" 就是直接输入http://localhost访问
备注:
此问题只在Tomcat6.X上测试过,分别测试了安装版和压缩版
Linux上未做过实验,如果Shell脚本的性质与Windows上的一致的话应该会成功
-
Ubuntu配置jdk环境
2009-08-17 12:51:52
在使用Ubuntu作为应用的服务器
使用的版本是Ubuntu 9.04,因为里面默认安装了Tomcat
但是用后发现无法运行Web应用,最终才知道是因为jdk的原因
Ubuntu在安装Tomcat默认也安装了JDK但不是开发用的JDK,而是叫OpenJDK
OpenJDK在对于Web应用上支持的不好
所以还是改用Sun开发用的JDK
sudo apt-get install sun-java6-jdk
sudo update-alternatives --config java
选择sun的jdk作为默认的编译器
-
Ubuntu设置默认声卡
2009-08-03 01:06:13
在ubuntu中设置默认声卡:- 首先 sudo asoundconf list
会列出声卡的名字,如 Headset V8237
- 然后,如果想把Headset设成默认声卡:
sudo asoundconf set-default-card Headset
-
Unbutu关于root用户无法使用的方法
2009-07-22 19:26:35
Ubuntu在安装之后可以发现其过程中没有关于root用户密码的设置
其实在一些应用中都不会用到root用户,由于sudo合理化的使用,已经可以避免root用户在失误的情况出现的毁灭性的操作。
Ubuntu其实在默认的情况下已经将root用户给禁止了,需要用时得用手动的方式才能打开。
执行操作:
1.root解锁,为root设定密码
终端操作: sudo passwd
Password:<输入当前用户的密码>
Enter new UNIX password:<输入新的root密码>
Retype new UNIX password:<重复输入新的root密码>
passwd:已成功更新密码
2.终端切换用户
su - root
输入root的新密码
这样root用户就可以使用了
要是再次禁用root帐号,可以执行 sudo passwd -l root
-
【转】写出漂亮代码的七种方法 注:可作为代码评审标准
2009-01-04 14:09:28
先我想说明我本文阐述的是纯粹从美学的角度来写出代码,而非技术、逻辑等。以下为写出漂亮代码的七种方法:1, 尽快结束 if语句
例如下面这个Javascrīpt语句,看起来就很恐怖:
1 function findShape(flags, point, attribute, list) {
2 if(!findShapePoints(flags, point, attribute)) {
3 if(!doFindShapePoints(flags, point, attribute)) {
4 if(!findInShape(flags, point, attribute)) {
5 if(!findFromGuide(flags,point) {
6 if(list.count() > 0 && flags == 1) {
7 doSomething();
8 }
9 }
10 }
11 }
12 }
13 }但如果这么写就好看得多:
1 function findShape(flags, point, attribute, list) {
2 if(findShapePoints(flags, point, attribute)) {
3 return;
4 }
5
6 if(doFindShapePoints(flags, point, attribute)) {
7 return;
8 }
9
10 if(findInShape(flags, point, attribute)) {
11 return;
12 }
13
14 if(findFromGuide(flags,point) {
15 return;
16 }
17
18 if (!(list.count() > 0 && flags == 1)) {
19 return;
20 }
21
22 doSomething();
23
24 }你可能会很不喜欢第二种的表述方式,但反映出了迅速返回if值的思想,也可以理解为:避免不必要的else陈述。
2, 如果只是简单的布尔运算(逻辑运算),不要使用if语句
例如:
1 function isStringEmpty(str){
2 if(str === "") {
3 return true;
4 }
5 else {
6 return false;
7 }
8 }可以写为:
1 function isStringEmpty(str){
2 return (str === "");
3 }3, 使用空白,这是免费的
例如:
1 function getSomeAngle() {
2 // Some code here then
3 radAngle1 = Math.atan(slope(center, point1));
4 radAngle2 = Math.atan(slope(center, point2));
5 firstAngle = getStartAngle(radAngle1, point1, center);
6 secondAngle = getStartAngle(radAngle2, point2, center);
7 radAngle1 = degreesToRadians(firstAngle);
8 radAngle2 = degreesToRadians(secondAngle);
9 baseRadius = distance(point, center);
10 radius = baseRadius + (lines * y);
11 p1["x"] = roundValue(radius * Math.cos(radAngle1) + center["x"]);
12 p1["y"] = roundValue(radius * Math.sin(radAngle1) + center["y"]);
13 pt2["x"] = roundValue(radius * Math.cos(radAngle2) + center["y"]);
14 pt2["y"] = roundValue(radius * Math.sin(radAngle2) + center["y");
15 // Now some more code
16 }很多开发者不愿意使用空白,就好像这要收费一样。我在此并非刻意地添加空白,粗鲁地打断代码的连贯性。在实际编写代码的过程中,会很容易地发现在什么地方加入空白,这不但美观而且让读者易懂,如下:
1 function getSomeAngle() {
2 // Some code here then
3 radAngle1 = Math.atan(slope(center, point1));
4 radAngle2 = Math.atan(slope(center, point2));
5
6 firstAngle = getStartAngle(radAngle1, point1, center);
7 secondAngle = getStartAngle(radAngle2, point2, center);
8
9 radAngle1 = degreesToRadians(firstAngle);
10 radAngle2 = degreesToRadians(secondAngle);
11
12 baseRadius = distance(point, center);
13 radius = baseRadius + (lines * y);
14
15 p1["x"] = roundValue(radius * Math.cos(radAngle1) + center["x"]);
16 p1["y"] = roundValue(radius * Math.sin(radAngle1) + center["y"]);
17
18 pt2["x"] = roundValue(radius * Math.cos(radAngle2) + center["y"]);
19 pt2["y"] = roundValue(radius * Math.sin(radAngle2) + center["y");
20 // Now some more code
21 }4, 不要使用无谓的注释
无谓的注释让人费神,这实在很讨厌。不要标出很明显的注释。在以下的例子中,每个人都知道代码表达的是“students id”,因而没必要标出。
1 function existsStudent(id, list) {
2 for(i = 0; i < list.length; i++) {
3 student = list[i];
4
5 // Get the student's id
6 thisId = student.getId();
7
8 if(thisId === id) {
9 return true;
10 }
11 }
12 return false;
13 }5, 不要在源文件中留下已经删除的代码,哪怕你标注了
如果你使用了版本控制,那么你就可以轻松地找回前一个版本的代码。如果别人大费周折地读了你的代码,却发现是要删除的代码,这实在太恨人了。//function thisReallyHandyFunction() {
// someMagic();
// someMoreMagic();
// magicNumber = evenMoreMagic();
// return magicNumber;
//}6,不要有太长的代码
看太长的代码实在太费劲,尤其是代码本身的功能又很小。如下:
1 public static EnumMap<Category, IntPair> getGroupCategoryDistribution(EnumMap<Category, Integer> sizes, int groups) {
2 EnumMap<Category, IntPair> categoryGroupCounts = new EnumMap<Category,IntPair>(Category.class);
3
4 for(Category cat : Category.values()) {
5 categoryGroupCounts.put(cat, getCategoryDistribution(sizes.get(cat), groups));
6 }#
我并不是说非要坚持70个字符以内,但是一个比较理想的长度是控制在120个字符内。如果你把代码发布在互联网上,用户读起来就很困难。
7,不要在一个功能(或者函数内)有太多代码行
我的一个老同事曾经说Visual C++很臭,因为它不允许你在一个函数内拥有超过10,000行代码。我记不清代码行数的上限,不知道他说的是否正确,但我很不赞成他的观点。如果一个函 数超过了50行,看起来有多费劲你知道么,还有没完没了的if循环,而且你还的滚动鼠标前后对照这段代码。对我而言,超过35行的代码理解起来就很困难 了。我的建议是超过这个数字就把一个函数代码分割成两个。 -
关于测试方面的隐喻----扁鹊篇
2008-12-24 09:55:15
【原文】
魏文侯问扁鹊曰:“子昆弟三人,其孰最为善医?” 扁鹊曰:“长兄最善,中兄次之,扁鹊最下。” 魏文侯曰:“可得闻耶?” 扁鹊曰:“长兄于病视神,神未有形而除之,故名不出于家,中兄治病毫毛,故名不出闾。若扁鹊者,鑱血脉投毒药,副肌肤间,而名出闻于诸侯。”
【译文】
魏文侯问扁鹊道:“听说你家兄弟三人都是医生,哪一个医术最精呢?” 扁鹊回答:“大哥医道最精,二哥其次,就数我最差了。” 魏文侯问:“能具体说给我听听吗?”
扁鹊说:“大哥看病着重于神,病灶还没形成就被他除去了,所以他的名声不出家门。二哥看病是治于病情初起之时、发现于毫毛,所以他的名声不出四邻。而我看病比较繁复,要切脉、投药、针炙等,又是治于病情严重之时,所以都以为我的医术最高明,连诸侯们都知道了。”
-
[原创]编译运行并生成html报告的ant脚本
2008-12-23 15:12:30
在Eclipse创建一个项目
在项目中再创建一个lib的文件夹
在项目中创建一个xml文件,名称为build
以下为文件内容:复制内容到剪贴板代码:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project basedir="." name="TestGPro" default="junit">
<property name="run.classpath" value="bin">
</property>
<property name="run.srcpath" value="src">
</property>
<property name="test.srcpath" value="src">
</property>
<property name="test.report" value="report">
</property>
<property name="lib.dir" value="lib">
</property>
<path id="compile.path">
<fileset dir="${lib.dir}">
<include name="**/.*jar" />
</fileset>
</path>
<target name="compile">
<javac destdir="${run.classpath}" srcdir="${run.srcpath}" classpathref="compile.path">
</javac>
</target>
<target name="junit" depends="compile">
<tstamp>
</tstamp>
<mkdir dir="${test.report}" />
<mkdir dir="${test.report}" />
<!-- 测试代码 -->
<junit printsummary="true">
<formatter type="xml" />
<classpath>
<pathelement path="${run.classpath}" />
<fileset dir="${lib.dir}">
<include name="**/*.jar" />
</fileset>
</classpath>
<formatter type="plain" />
<batchtest todir="${test.report}">
<fileset dir="${test.srcpath}">
<include name="**/*Test.java" />
</fileset>
</batchtest>
</junit>
<!-- 生成测试报告 -->
<junitreport todir="${test.report}">
<fileset dir="${test.report}">
<include name="TEST-*.xml" />
</fileset>
<report format="frames" todir="${test.report}" />
</junitreport>
</target>
</project> -
六拍项目经理
2008-12-15 16:56:55
在坊间流传着一个“六拍项目经理”的笑话,其梗概是:项目开始前先“拍脑袋”以得出进度和成本的承诺;在开工大会上领导“拍拍你肩膀”,是那样的语重心长、充满期待;而小酒刚下肚、春风正得意时,不由得不“拍胸脯”以表决心和能力;但在项目进展过程中遇到这样、那样的困难时,客户和业主不能不“拍桌子”了;这时充满悔意的你,只能“拍大腿”以示自责;而到了一切都覆水难收时,恐怕也只能“拍屁股”另谋高就了。出处《软件需求最佳实践》第四章
标题搜索
我的存档
数据统计
- 访问量: 7155
- 日志数: 9
- 建立时间: 2008-09-01
- 更新时间: 2010-05-04