发布新日志

  • SVN权限设置

    2010-05-04 17:07:17

    大多数情况下在设置SVN时会设置一个群,并社区权限从svn根目录起开始有读写的权限。

    但在设置多群的情况下需要注意一下权限的问题

    例如:

    一个svn库根目录下有两个文件夹FolderA和FolderB。

    设置两个群GroupA和GroupB,GroupA从根目录起有读写的权限(对FolderA和FolderB有读写权限),GroupB只对FolderB有只读权限。

    设置如下

    1.创建指定用户

    在passwd文件中创建指定用户

     

    Properties代码 
    1. [users]  
    2. user1=user1  
    3. user2=user2  
    4. user3=user3  
    5. user4=user4  

     

     2.创建群

    在authz文件中创建群

    找到[groups]标签在下放创建GroupA和GroupB两个群,并将用户添加到群中

    Properties代码 
    1. [groups]  
    2. GroupA=user1,user2  
    3. GroupB=user3,user4  

     

     3.设置群的权限

    在authz文件中设置权限

    语法格式:

    Properties代码 
    1. [<目录>]  
    2. @<群名称>=<权限字母>  

     设置GroupA权限

    Properties代码 
    1. [/]  
    2. @GroupA=rw  

    “[/]”的意思是可看到的范围,从svn库的根目录下任何文件夹以及其内的文件都可以访问

    “@GroupA=rw”的意思是GroupA群对根目录下全部文件夹和文件拥有读写的全,“r”代表读,“w”代表写

     

    设置GroupB权限

    Properties代码 
    1. [/FolderB]  
    2. @GroupB=r  

    此处就不多解释了

     

    4.其他设置

    此时还不能算真正结束设置,在用svn客户端访问某个文件的历史记录时会出现以下信息:

    svn:Item is not readable

    这会导致无法查看文件的历史记录,此时需要去svnserve.conf文件中修改一下。

    进入svnserve.conf文件,查找[general]下有一个被注释掉的参数anon-access,讲anon-access前面的注释符号(#)去除掉,并将anon-access的值设置成none,内容如下:

    Properties代码 
    1. 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

          在坊间流传着一个“六拍项目经理”的笑话,其梗概是:项目开始前先“拍脑袋”以得出进度和成本的承诺;在开工大会上领导“拍拍你肩膀”,是那样的语重心长、充满期待;而小酒刚下肚、春风正得意时,不由得不“拍胸脯”以表决心和能力;但在项目进展过程中遇到这样、那样的困难时,客户和业主不能不“拍桌子”了;这时充满悔意的你,只能“拍大腿”以示自责;而到了一切都覆水难收时,恐怕也只能“拍屁股”另谋高就了。

    出处《软件需求最佳实践》第四章
Open Toolbar