帐前卒专栏

code, software architect, articles and novels.
代码,软件架构,博客和小说

有一题:

对构造方法的叙述正确的是

A 类不能继承父类的构造符

B子类不能重载父类的构造符

c类中必须定义自己的构造符

以上的各个答案都是错的。B选项我一直不太肯定。改天做个实验验证下。

在java中父类对象不能当成其某个子类的对象。V

java程序中javaapplet是可以解析器解析运行的独立程序。X

连接两个字符串使用concat()方法。(自己从来都没有用过这个东东。都是用’+'或者append())

注意print()和println()。做的时候竟然看错…

注意文件输入输出流

注意异常类的写法。

事务的特性:原子,一致,持久,隔离

事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行。这种特性称为原子性。

事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。这种特性称为事务的一致性。假如数据库的状态满足所有的完整性约束,就说该数据库是一致
的。
持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即一旦一个事务提交,DBMS保证它对数据库中数据的改变应该是永久性的,耐得住任何系统故障。
持久性通过数据库备份和恢复来保证。
分离性指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被其它企图进行修改的事务看到。

本校有个4星大赛,还是网上投票。本来就认为网上投票不科学。黄韵还问我怎样做是不是科学。我就问他们怎么判断同一个人投多了票的?黄韵就问了那边的负责人。然后告诉
我是用ip判断的。当初也没有什么感觉。想想ip就ip吧。与我也没有太多关系。反正自己也没有参加,而且自己正在应付考试,也没有闲工夫理睬这些事情。

考完了,回头想想这样做其实一点都没有体现什么公平。

一:院系人多的分的内部ip就多。

二:用ip判断,有些人的ip使用的是共同ip,经过地址转换进行的通信。这样使用ip进行判断当然行不通。

三:一个人可以换用多个ip。负责人并没有告诉我ip判断到底判断是ip包中的目的ip,还是加载在应用层协议中的ip。前者使用七七八八的工具可以改掉。后者也可以
通过工具把内存中的ip重写。这样刷点击率,也是可以的。

不管怎样,这种做法对于稍微懂电脑的人来说,刷点击是小菜一碟。当初做这个系统人就没有考虑到这点吗?至少要公平的化也要使用唯一的MAC地址嘛。使用ip判断…
…唉!当然感觉上最公平的方法还是使用手机投票。当然对于少数及其有钱的人来说,这样做是行不通的。当然有钱的人也不会来读湖大,估计早就出国了。

四星网上投票地址:

http://www.chngod.com/4xds/tou.asp

本以为搭上了微软的末班车,没有想到竟然是早班车。

现在可好,IBM笔试 在院里考了第二,却不能被院里推荐。怕占名额。google的实习推荐又来了。结果怕占名额又不能去了。这年头想多经历些磨练,却常常不能得到
满足。明天金山的又来了…想哭!

记起微软的一道面试题,每层楼都有一颗钻石,乘电梯上楼。每层都可以开门看,但是只能在一层取钻石,问怎样取法。(电梯从底到顶只一次)这是博弈论的题目。最好的取法
是前三分之一的层看钻石,中三分之一比钻石,后三分之一取钻石。

当初实习的时候,就没有这样做。现在几乎全部的面试机会都没有了。

Server端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<sys/types.h>  
#include<sys/socket.h>
#include<netdb.h>
#include<netinet/in.h>
int main()
{
int ssock;//主套接字
char *s = "X";
char *r;
int port = 3490;//本机要邦定的端口,通过此端口
struct sockaddr_in sin;//本机地址
struct sockaddr_in pin;//客户端(远端)地址
int address_size;
int tempssock;//实际与客户端交互套接字
int size = 100;

sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(port);
bind(ssock,(struct sockaddr *)&sin,sizeof(sin));
listen(ssock,5);
ssock = socket(PF_INET,SOCK_STREAM,0);
while(1)
{
address_size = sizeof(pin);
tempssock = accept(ssock,(struct sockaddr*)&pin,&address_size);
while(recv(tempssock,r,size,0) > 0)
send(tempssock,s,strlen(s),0);

close(tempssock);
break;
}
close(ssock);
return 0;
}

#include<sys/types.h>这个头文件中包含了struct sockaddr_in
#include<sys/socket.h>包含了socket的一些基础的api函数。

sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(port);
这三句合起来是地址族是AF_INET,ip地址是本机的地址。使用INADDR_ANY的好处是如果本机有多个ip地址,它都能成功的访问。而不需要指定ip。然后
是要邦定的端口。htons()是把本机的short型转换成网络的short型。

bind(ssock,(struct sockaddr *)&sin,sizeof(sin));邦定端口,需要套接字,本机地址,地址的大小

listen(ssock,5);置为被动套接字,侦听端口。

tempssock = accept(ssock,(struct sockaddr*)&pin,&address_size);//accept需要3个参数,
第一个是主套接字,第二个是客户端地址,和客户端地址大小。当服务器端接到用户的连接请求是,将连接请求中的地址信息填充到pin里。并且返回一个与客户端交互的套接
字。所以本机的地址要写明,而远端的地址自动填充就可以了。

recv(tempssock,r,size,0)接受数据,第一为与客户端连接套接字,第二个为接受的char数组(或者认为是字符串),第3个是那个字符串的大小
或长度。第四个是由需要带外控制,一般置为0。这个函数如果有数据接受到会返回接受的字符串长度,如果客户端shutdown或close了(后面还会介绍shutd
own函数),就会返回0,出错及其它会返回-1。

send(tempssock,s,strlen(s),0);和recv几乎一样,s为发送的字符串。

close(tempssock);关闭与客户端连接的套接字,这里意味这交互已经结束。这里的关闭为引用计数。如果多个进程同时引用了这一个socket,那么每次
就减一。直到最后一次才真正的关闭。

这里再介绍一个shutdown()函数,第一个参数为套接字,第二个为命令码。第二个参数为0,不允许输入,1不允许输出,2双方关闭。
我们做的Socket编程一般是unix的经典文件读写方式(open,read,write,close)。

创建服务器(循环面向连接)

1。创建套接字并邦定熟知端口,

2。套接字置为被动,侦听端口

3。循环接受来自下一个客户端的连接请求。并 创建新的套接字

4。处理客户端的请求

5关闭连接,跳转到第3步。

socket在上面看来是个int型,但是实质上socket是一个结构体包含远端地址信息,本机地址信息。而我们使用的只是socket结构体数组的一个下标.

星期六晚上开了一个小会。关于下届工作的事情。

开始时我对加入编辑部的人表示祝贺。然后就交由下届部长讲话。张磊很惊讶的看着我(就讲完了?)。 我说是呀我就讲这些。剩下的你讲吧。然后就是各个成员自我介绍,再
后就是各个组的具体分工。自我介绍非常简单,因为大家之前都见过几次面。所以总会有人这样说:大家都认识我吧…确实,编辑部是老成员留下最多的部门。工作依
旧是那些,不过有宣传组和摄影组的加入,每一个组都要相互合作。这样的组织真的很负责。多加一个部门整体就要增加n的工作量。这是留给大一们的挑战.下届就靠他们了。
自己真的有些不放心。我简单强调了要把培训做好,编辑部出去的人不要只是懂编辑,ps之类的。专业一定要学好。不过看来这个想法挺难实现的。毕竟他们都还是大一,谁给
谁培训…鲁丹把宣传组的工作重点和记者组的工作重点要交代了一下,然后开玩笑的要苟旭博采访我,还故意强调问些私人问题。下面的人便笑个不停。或许我反应慢
,到现在还没有搞懂他们为啥笑…这年头思维正常的人总是被多数思维不正常的人搞晕。最后我让他们每人问一个问题,我说过去从来都没有人主动问我问题,都是
我亲自问部下。杨之旭接话说那是因为学长很恐怖,于是下面又是一阵哄笑。很可惜,笑过后依然没有几个人问。现在都不敢发表自己的观点。不过很快会好的。

编辑部的故事让杨之旭整理,恐怕又象镜中花水中月一样。这家伙嘴上说的比做的多…

去刘爷爷家又吃了顿大餐。青蛙很辣。。不过呆在湖南这么多年也习惯了。还有龙虾,自己吃了两三个。后来刘爷爷对我说不要考公务员。…我说这东东自己根本没有想过。
其实感觉自己也不太懂得政治斗争。在学生会工作了一年,虽然斗争不是很激励,但是也体会到点点滴滴。自己在政治斗争上没有点才能。编辑部成立一年,最后却和宣传部合并
了。自己在学生会带出来的几个人,不是走掉了,就是只在部内做事情。编辑部留下的人是很多。但是掌握权利的却没有几个,就有一个部长。虽然书记同意我让部长带着各个组
长同时来开会。但是感觉他们这些组长的说话分量也不会很大。 就像中国在联合国里的情况差不多。虽然席位很多,但是却都是投弃权票。大概我的手下们也是如此。

政治斗争的事情还是放弃吧。刘爷爷问我想不想出国。我说没有想过。自己感觉以后可能会出去看看。不过对那条路充满这迷惑。英语没有学扎实。要下些功夫了。

刘爷爷说研究生是要读的。我也是这么认为。不过先去微软实习再说吧。如果能保到外校,就读研,要不就工作在来考研。目标已定,只是选择路的问题了。近路还是远路,自己
还不能预见。毕竟自己的视野太狭窄了。

忽然想起来给鲁丹说的那句话:过去看世界,到处都是牛;现在看来,其实还有很多草。不知道她是否理解,文学书看得也挺多,这话应该还是好理解的吧。不过谁知道呢?反应
有些迟钝的家伙…

前几天,学生会换届,大家又吃了顿饭。本来自己已经吃过晚饭了。有要吃。。不过菜倒是好吃,省得老妈整天说我要去吃点好的。吃就吃吧。武大姐有事没事的说我走狗屎运。
听得我耳朵都腻了,最后回应她:有本事自己也走嘛!现在想想最好的回答方式是:运气也是实力的一部分。——凯。看来自己真的还不适合做政治工作。快吃饱的时候,童梓对
我说:吃完后再请你吃那个。我心想哪个呀?我就说我都已经吃饱了,不想吃了。她的室友马上说:生日蛋糕,她过20岁生日。过了今天就没有20岁蛋糕吃了。唉!反应迟钝
…不过最后还是吃了。我实在是想给我寝的小强们吃,不过不辜负好心,还是吃了。。。。好饱。。。。

后来问问张波才知道,湖南这边20岁的生日是很重要的。但是…那个童梓是湖北的…不是这么快就入乡随俗了吧。

Java最基础的知识20’+10’+20’
J2EE知识:30’
J2EE知识中包括:
EJB,JavaBean,webService,数据连接池,存储过程相关知识(主要是概念和优缺点)。jsp,servlet捎带一点。
最后两个大题:
包括10’的程序试运行结果。
这次的是static,非static,局部变量,全局变量的区别。
20’类设计题
考的主要是异常类的设计,Bank类的设计。包括存取款函数。
这个题主要是考Test的一些东西。如果这题异常类做好了,大概能当一个IBM测试工程师。
而Bank类主要是看思考是否全面。

代码就不多写了。写写大概的思路。思路不对是应该的,没有认真的去琢磨最后一道题。反正我是被本院排除在外的人员,IBM面试是肯定去不了的。 想哭。。。

class BankException extends Exception

{

private String Message;

public BankException();

public BankException(String err);

}

public class Bank

{

private balance;

private String credit;

private String password;

public bool isValid() throws Exception;//验证

public void deposite() throws Exception;//存款

public void withDrawal() throws Exception;//取款

public double getBalance() throws Exception;//读余款

public Bank(String credit,String password,double balance);//初始化

}

class Test

{

public static void main(String[] args)

{

try

{

}

catch(BankException){}

catch(Exception){}

}

}

昨天面试了几个来加入科技部的人。

我出了一道非常简单的题

int i,x = 0;

for(i=0;i<3;i++)

{

x++;

} 告诉我for循环执行的每一步。

这几个人算是大一里的高手了,还有一个曾经拿过编程比赛的几个奖。大一的在学c语言。至少for控制流他们学完了。问了这个问题,本以为是小菜一碟。可惜都没有答对,
也就不想再问后续的问题了。

for的控制流类似于

i = 0;

while(i<3)

{

x++;

i++;

}

可惜他们都答成这样的控制流

i=0;

do

{

x++;

i++;

}while(i<3);

判断条件的先后顺序都答错了。本以为来的都是高手,基础没有问题,看来我们软件学院的学生们还要加强一下基础的东西。至少你的控制流不能错吧。要不以后怎么编程?仅仅
会做网页,比别人多学点c++就觉得了不起。唉,现在的年轻人,越来越浮躁了。

王汎森   院士 / 中央研究院历史语言研究所

这个题目我非常喜欢,因为这个题目,对大家多少都有实际的帮助。如果下次我必
须再登台演讲,我觉得这个题目还可以再发挥一两次。我是台大历史研究所毕业的,所
以我的硕士是在台大历史研究所,我的博士是在美国普林斯顿大学取得的。我想在座的
各位有硕士、有博士,因此我以这两个阶段为主,把我的经验呈现给各位。

我从来不认为我是位有成就的学者,我也必须跟各位坦白,我为了要来做这场演讲
,在所里碰到刚从美国读完博士回来的同事,因为他们刚离开博士生的阶段,比较有一
些自己较独特的想法,我就问他:「如果你讲这个问题,准备要贡献什么?」结合了他
们的意见,共同酝酿了今天的演讲内容,因此这里面不全是我一个人的观点。虽然我的
硕士论文和博士论文都出版了,但不表示我就是一个成功的研究生,因为我也总还有其
它方面仍是懵懵懂懂。我的硕士论文是二十年前时报出版公司出版的,我的博士论文是
英国剑桥大学出版的。你说有特别好吗?我不敢乱说。我今天只是综合一些经验,提供
大家参考。

一、研究生与大学生的区别

首先跟大家说明一下研究生和大学生的区别。大学生基本上是来接受学问、接受知
识的,然而不管是对于硕士时期或是博士时期的研究而言,都应该准备要开始制造新的
知识,我们在美国得到博士学位时都会领到看不懂的毕业证书,在一个偶然的机会下,
我问了一位懂拉丁文的人,上面的内容为何?他告诉我:「里头写的是恭喜你对人类的
知识有所创新,因此授予你这个学位。」在中国原本并没有博硕士的学历,但是在西方
他们原来的用意是,恭贺你已经对人类普遍的知识有所创新,这个创新或大或小,都是
对于普遍的知识有所贡献。这个创新不会因为你做本土与否而有所不同,所以第一个我
们必须要很用心、很深刻的思考,大学生和研究生是不同的。

(一)选择自己的问题取向,学会创新

你一旦是研究生,你就已经进入另一个阶段,不只是要完全乐在其中,更要从而接
受各种有趣的知识,进入制造知识的阶段,也就是说你的论文应该有所创新。由接受知
识到创造知识,是身为一个研究生最大的特色,不仅如此,还要认识到自己不再是个容
器,等着老师把某些东西倒在茶杯里,而是要开始逐步发展和开发自己。作为研究生不
再是对于各种新奇的课程照单全收,而是要重视问题取向的安排,就是在硕士或博士的
阶段,所有的精力、所有修课以及读的书里面都应该要有一个关注的焦点,而不能像大
学那般漫无目标。大学生时代是因为你要尽量开创自己接受任何东西,但是到了硕士生
和博士生,有一个最终的目的,就是要完成论文,那篇论文是你个人所有武功的总集合
,所以这时候必须要有个问题取向的学习。

(二)尝试跨领域研究,主动学习

提出一个重要的问题,跨越一个重要的领域,将决定你未来的成败。我也在台大和
清华教了十几年的课,我常常跟学生讲,选对一个领域和选对一个问题是成败的关键,
而你自己本身必须是带着问题来探究无限的学问世界,因为你不再像大学时代一样泛滥
无所归。所以这段时间内,必须选定一个有兴趣与关注的主题为出发点,来探究这些知
识,产生有机的循环。由于你是自发性的对这个问题产生好奇和兴趣,所以你的态度和
大学部的学生是截然不同的,你慢慢从被动的接受者变成是一个主动的探索者,并学会
悠游在这学术的领域。

我举一个例子,我们的中央研究院院长李远哲先生,得了诺贝尔奖。他曾经在中研
院的周报写过几篇文章,在他的言论集里面,或许各位也可以看到,他反复提到他的故
事。他是因为读了一个叫做马亨教授的教科书而去美国柏克莱大学念书,去了以后才发
现,这个老师只给他一张支票,跟他说你要花钱你尽量用,但是从来不教他任何东西。
可是隔壁那个教授,老师教很多,而且每天学生都是跟着老师学习。他有一次就跟那个
老师抱怨:「那你为什么不教我点东西呢?」那个老师就说:「如果我知道结果,那我
要你来这边念书做什么?我就是因为不知道,所以要我们共同探索一个问题、一个未知
的领域。」他说其实这两种教法都有用处,但是他自己从这个什么都不教他,永远碰到
他只问他「有没有什么新发现」的老师身上,得到很大的成长。所以这两方面都各自蕴
含深层的道理,没有所谓的好坏,但是最好的方式就是将这两个方式结合起来。我为什
么讲这个故事呢?就是强调在这个阶段,学习是一种「 self-help 」,并且是在老师
的引导下学习「 self-help 」,而不能再像大学时代般,都是纯粹用听的,这个阶段
的学习要基于对研究问题的好奇和兴趣,要带着一颗热忱的心来探索这个领域。

然而研究生另外一个重要的阶段就是 Learn how to learn ,不只是学习而已,而
是学习如何学习,不再是要去买一件很漂亮的衣服,而是要学习拿起那一根针,学会绣
出一件漂亮的衣服,慢慢学习把目标放在一个标准上,而这一个标准就是你将来要完成
硕士或博士论文。如果你到西方一流的大学去读书,你会觉得我这一篇论文可能要和全
世界做同一件问题的人相比较。我想即使在台湾也应该要有这样的心情,你的标准不能
单单只是放在旁边几个人而已,而应该是要放在领域的普遍人里面。你这篇文章要有新
的东西,才算达到的标准,也才符合到我们刚刚讲到那张拉丁文的博士证书上面所讲的
,有所贡献与创新。

二、一个老师怎么训练研究生

第二个,身为老师你要怎么训练研究生。我认为人文科学和社会科学的训练,哪怕
是自然科学的训练,到研究生阶段应该更像师徒制,所以来自个人和老师、个人和同学
间密切的互动和学习是非常重要的,跟大学部坐在那边单纯听课,听完就走人是不一样
的,相较之下你的生活应该要和你所追求的知识与解答相结合,并且你往后的生活应该
或多或少都和这个探索有相关。

(一)善用与老师的伙伴关系,不断 Research

我常说英文 research 这个字非常有意义, search 是寻找,而 research 是再寻
找,所以每个人都要 research ,不断的一遍一遍再寻找,并进而使你的生活和学习成
为一体。中国近代兵学大师蒋百里在他的兵学书中曾说:「生活条件要跟战斗条件一致
,近代欧洲凡生活与战斗条件一致者强,凡生活与战斗条件不一致者弱。」我就是藉由
这个来说明研究生的生活,你的生活条件与你的战斗条件要一致,你的生活是跟着老师
与同学共同成长的,当中你所听到的每一句话,都可能带给你无限的启发。

回想当时我在美国念书的研究生生活,只要随便在楼梯口碰到任何一个人,他都有
办法帮忙解答你语言上的困难,不管是英文、拉丁文、德文、希腊文 …… 等。所以能
帮助解决问题的不单只是你的老师,还包括所有同学以及学习团体。你的学习是跟生活
合在一起的。当我看到有学生呈现被动或是懈怠的时候,我就会用毛泽东的「革命不是
请客吃饭!」来跟他讲:「作研究生不是请客吃饭。」

(二)藉由大量阅读和老师提点,进入研究领域

怎样进入一个领域最好,我个人觉得只有两条路,其中一条就是让他不停的念书、
不停的报告,这是进入一个陌生的领域最快,又最方便的方法,到最后不知不觉学生就
会知道这个领域有些什么,我们在不停念书的时候常常可能会沉溺在细节里不能自拔,
进而失去全景,导致见树不见林,或是被那几句英文困住,而忘记全局在讲什么。藉由
学生的报告,老师可以讲述或是理清其中的精华内容,经由老师几句提点,就会慢慢打
通任督二脉,逐渐发展一种自发学习的能力,同时也知道碰到问题可以看哪些东西。就
像是我在美国念书的时候,我修过一些我完全没有背景知识的国家的历史,所以我就不
停的念书、不停的逼着自己吸收,而老师也只是不停的开书目,运用这样的方式慢慢训
练,有一天我不再研究它时,我发现自己仍然有自我生产及蓄发的能力,因为我知道这
个学问大概是什么样的轮廓,碰到问题也有能力可以去查询相关的资料。所以努力让自
己的学习产生自发的延展性是很重要的。

(三)循序渐进地练习论文写作

到了硕士或博士最重要的一件事,是完成一篇学位论文,而不管是硕士或博士论文
,其规模都远比你从小学以来所受的教育、所要写的东西都还要长得多,虽然我不知道
教育方面的论文情况是如何,但是史学的论文都要写二、三十万字,不然就是十几二十
万字。写这么大的一个篇幅,如何才能有条不紊、条理清楚,并把整体架构组织得通畅
可读?首先,必须要从一千字、五千字、一万字循序渐进的训练,先从少的慢慢写成多
的,而且要在很短的时间内训练到可以从一万字写到十万字。这么大规模的论文谁都写
得出来,问题是写得好不好,因为这么大规模的写作,有这么许多的脚注,还要注意首
尾相映,使论述一体成型,而不是散落一地的铜钱;是一间大礼堂,而不是一间小小分
割的阁楼。为了完成一个大的、完整的、有机的架构模型,必须要从小规模的篇幅慢慢
练习,这是一个最有效的办法。

因为受计算机的影响,我发现很多学生写文章能力都大幅下降。写论文时很重要的
一点是,文笔一定要清楚,不要花俏、不必漂亮,「清楚」是最高指导原则,经过慢慢
练习会使你的文笔跟思考产生一致的连贯性。我常跟学生讲不必写的花俏,不必展现你
散文的才能,因为这是学术论文,所以关键在于要写得非常清楚,如果有好的文笔当然
更棒,但那是可遇不可求的,文彩像个人的生命一样,英文叫 style , style 本身就
像个人一样带有一点点天生。因此最重要的还是把内容陈述清楚,从一万字到最后十万
字的东西,都要架构井然、论述清楚、文笔清晰。

我在念书的时候,有一位欧洲史、英国史的大师 Lawrence Stone ,他目前已经过
世了,曾经有一本书访问十位最了不起的史学家,我记得他在访问中说了一句非常吸引
人注意的话,他说他英文文笔相当好,所以他一辈子没有被退过稿。因此文笔清楚或是
文笔好,对于将来文章可被接受的程度有举足轻重的地位。内容非常重要,有好的表达
工具更是具有加分的作用,但是这里不是讲究漂亮的 style ,而是论述清楚。

三、研究生如何训练自己

(一)尝试接受挑战,勇于克服

研究生如何训练自己?就是每天、每周或每个月给自己一个挑战,要每隔一段时间
就给自己一个挑战,挑战一个你做不到的东西,你不一定要求自己每次都能顺利克服那
个挑战,但是要努力去尝试。我在我求学的生涯中,碰到太多聪明但却一无所成的人,
因为他们很容易困在自己的障碍里面,举例来说,我在普林斯顿大学碰到一个很聪明的
人,他就是没办法克服他给自己的挑战,他就总是东看西看,虽然我也有这个毛病,可
是我会定期给我自己一个挑战,例如:我会告诉自己,在某一个期限内,无论如何一定
要把这三行字改掉,或是这个礼拜一定要把这篇草稿写完,虽然我仍然常常写不完,但
是有这个挑战跟没这个挑战是不一样的,因为我挑战三次总会完成一次,完成一次就够
了,就足以表示克服了自己,如果觉得每一个礼拜的挑战,可行性太低,可以把时间延
长为一个月的挑战,去挑战原来的你,不一定能做到的事情。不过也要切记,硕士生是
刚开始进入这一个领域的新手,如果一开始问题太小,或是问题大到不能控制,都会造
成以后研究的困难。

(二)论文的写作是个训练过程,不能苛求完成精典之作

各位要记得我以前的老师所说的一句话:「硕士跟博士是一个训练的过程,硕士跟
博士不是写经典之作的过程。」我看过很多人,包括我的亲戚朋友们,他之所以没有办
法好好地完成硕士论文,或是博士论文,就是因为他把它当成在写经典之作的过程,虽
然事实上,很多人一生最好的作品就是硕士论文或博士论文,因为之后的时间很难再有
三年或六年的时间,沉浸在一个主题里反复的耕耘,当你做教授的时候,像我今天被行
政缠身,你不再有充裕的时间好好探究一个问题,尤其做教授还要指导学生、上课,因
此非常的忙碌,所以他一生最集中又精华的时间,当然就是他写博士、或是硕士论文的
时候,而那一本成为他一生中最重要的著作也就一点都不奇怪了。

不一定要刻意强求,要有这是一个训练过程的信念,应该清楚知道从哪里开始,也
要知道从哪里放手,不要无限的追下去。当然我不是否认这个过程的重要性,只是要调
整自己的心态,把论文的完成当成一个目标,不要成为是一种的心理障碍或是心理负担
。这方面有太多的例子了,我在普林斯顿大学念书的时候,那边旧书摊有一位非常博学
多文的旧书店老板,我常常赞叹的对他说:「你为什么不要在大学做教授。」他说:「
因为那篇博士论文没有写完。」原因在于他把那个博士论文当成要写一本经典,那当然
永远写不完。如果真能写成经典那是最好,就像美丽新境界那部电影的男主角 John Na
sh 一样,一生最大的贡献就是博士那二十几页的论文,不过切记不要把那个当作是目
标,因为那是自然而然形成的,应该要坚定的告诉自己,所要完成的是一份结构严谨、
论述清楚与言之有物的论文,不要一开始就期待它是经典之作。如果你期待它是经典之
作,你可能会变成我所看到的那位旧书摊的老板,至于我为什么知道他有那么多学问,
是因为那时候我在找一本书,但它并没有在旧书店里面,不过他告诉我:「还有很多本
都跟他不相上下。」后来我对那个领域稍稍懂了之后,证明确实如他所建议的那般。一
个旧书店的老板精熟每一本书,可是他就是永远无法完成,他梦幻般的学位论文,因为
他不知道要在哪里放手,这一切都只成为空谈。

(三)论文的正式写作

1. 学习有所取舍

到了写论文的时候,要能取也要能舍,因为现在信息爆炸,可以看的书太多,所以
一定要建构一个属于自己的知识树,首先,要有一棵自己的知识树,才能在那棵树挂相
关的东西,但千万不要不断的挂不相关的东西,而且要慢慢的舍掉一些挂不上去的东西
,再随着你的问题与关心的领域,让这棵知识树有主干和枝叶。然而这棵知识树要如何
形成?第一步你必须对所关心的领域中,有用的书籍或是数据非常熟悉。

2. 形成你的知识树

我昨天还请教林毓生院士,他今年已经七十几岁了,我告诉他我今天要来作演讲,
就问他:「你如果讲这个题目你要怎么讲?」他说:「只有一点,就是那重要的五、六
本书要读好几遍。」因为林毓生先生是海耶克,还有几位近代思想大师在芝加哥大学的
学生,他们受的训练中很重要的一部份是精读原典。这句话很有道理,虽然你不可能只
读那几本重要的书,但是那五、六本书将逐渐形成你知识树的主干,此后的东西要挂在
上面,都可以参照这一个架构,然后把不相干的东西暂放一边。生也有涯,知也无涯,
你不可能读遍天下所有的好书,所以要学习取舍,了解自己无法看遍所有有兴趣的书,
而且一旦看遍所有有兴趣的书,很可能就会落得普林斯顿街上的那位旧书店的老板一般
,因为阅读太多不是自己所关心的领域的知识,它对于你来说只是一地的散钱。

3. 掌握工具

在这个阶段一定要掌握语言与合适的工具。要有一个外语可以非常流畅的阅读,要
有另外一个外语至少可以看得懂文章的标题,能学更多当然更好,但是至少要有一个语
言,不管是英文、日文、法文 …… 等,一定要有一个语言能够非常流畅的阅读相关书
籍,这是起码的前提。一旦这个工具没有了,你的视野就会因此大受限制,因为语言就
如同是一扇天窗,没有这个天窗你这房间就封闭住了。为什么你要看得懂标题?因为这
样才不会有重要的文章而你不知道,如果你连标题都看不懂,你就不知道如何找人来帮
你或是自己查相关的数据。其它的工具,不管是统计或是其它的任何工具,你也一定要
多掌握,因为你将来没有时间再把这样的工具学会。

4. 突破学科间的界线

应该要把跨学科的学习当作是一件很重要的事,但是跨学科涉及到的东西必须要对
你这棵知识树有帮助,要学会到别的领域稍微偷打几枪,到别的领域去摄取一些概念,
对于本身关心的问题产生另一种不同的启发,可是不要泛滥无所归。为什么要去偷打那
几枪?近几十年来,人们发现不管是科学或人文,最有创新的部份是发生在学科交会的
地方。为什么会如此?因为我们现在的所有学科大部分都在西方十九世纪形成的,而中
国再把它转借过来。十九世纪形成这些知识学科的划分的时候,很多都带有那个时代的
思想与学术背景,比如说,中研院的李院长的专长就是物理化学,他之所以得诺贝尔奖
就是他在物理和化学的交界处做工作。像诺贝尔经济奖,这二十年来所颁的奖,如果在
传统的经济学奖来看就是旁门走道,古典经济学岂会有这些东西,甚至心理学家也得诺
贝尔经济奖,连 John Nash 这位数学家也得诺贝尔经济奖,为什么?因为他们都在学
科的交界上,学科跟学科、平台跟平台的交界之处有所突破。在平台本身、在学科原本
最核心的地方已经 search 太多次了,因此不一定能有很大的创新,所以为什么跨领域
学习是一件很重要的事情。

常常一篇硕士论文或博士论文最重要、最关键的,是那一个统摄性的重要概念,而
通常你在本学科里面抓不到,是因为你已经泡在这个学科里面太久了,你已经拿着手电
筒在这个小仓库里面照来照去照太久了,而忘了还有别的东西可以更好解释你这些材料
的现象,不过这些东西可遇而不可求。 John Nash 这一位数学家为什么会得诺贝尔数
学奖?为什么他在赛局理论的博士论文,会在数十年之后得诺贝尔经济奖?因为他在大
学时代上经济学导论的课,所以他认为数学可以用在经济方面来思考,而这个东西在一
开始,他也没有想到会有这么大的用处。他是在数学和经济学的知识交界之处做突破。
有时候在经济学这一个部分没有大关系,在数学的这一个部分也没有大关系,不过两个
加在一起,火花就会蹦出来。

5. 论文题目要有延展性

对一个硕士生或博士生来说,如果选错了题目,就是失败,题目选对了,还有百分
之七十胜利的机会。这个问题值得研一、博一的学生好好思考。你的第一年其实就是要
花在这上面,你要不断的跟老师商量寻找一个有意义、有延展性的问题,而且不要太难
。我在国科会当过人文处长,当我离开的时候,每次就有七千件申请案,就有一万四千
个袋子,就要送给一万四千个教授审查。我当然不可能看那么多,可是我有个重要的任
务,就是要看申诉。有些申诉者认为:「我的研究计划很好,我的著作很好,所以我来
申诉。」申诉通过的大概只有百分之十,那么我的责任就是在百分之九十未通过的案子
正式判决前,再拿来看一看。有几个印象最深常常被拿出来讨论的,就是这个题目不必
再做了、这个题目本身没有发展性,所以使我更加确认选对一个有意义、有延展性、可
控制、可以经营的题目是非常重要的。

我的学生常常选非常难的题目,我说你千万不要这样,因为没有人会仔细去看你研
究的困难度,对于难的题目你要花更多的时间阅读史料,才能得到一点点东西;要挤很
多东西,才能筛选出一点点内容,所以你最好选择一个难易适中的题目。

我写过好几本书,我认为我对每一本书的花的心力都是一样,虽然我写任何东西我
都不满意,但是在过程中我都绞尽脑汁希望把他写好。目前为止很多人认为我最好的书
,是我二十几岁刚到史语所那一年所写的那本书。我在那本书花的时间并不长,那本书
的大部分的稿子,是我和许添明老师同时在当兵的军营里面写的,而且还是用我以前旧
的笔记写的。大陆这些年有许多出版社,反复要求出版我以前的书,尤其是这一本,我
说:「不行。」因为我用的是我以前的读书笔记,我怕引文有错字,因为在军队营区里
面随时都要出操、随时就要集合,手边又没有书,怎么可能好好的去核对呢?而如果要
我重新校正一遍,又因为引用太多书,实在没有力气校正。

为什么举这个例子呢?我后来想一想,那本书之所以比较好,可能是因为那个题目
可延展性大,那个题目波澜起伏的可能性大。很多人都认为,我最好的书应该是剑桥大
学出的那一本,不过我认为我最好的书一定是用中文写的,因为这个语言我能掌握,英
文我没办法掌握得出神入化。读、写任何文章一定要练习到你能带着三分随意,那时候
你才可以说对于这一个语言完全理解与精熟,如果你还无法达到三分的随意,就表示你
还在摸索。

回到我刚刚讲的,其实每一本书、每一篇论文我都很想把它写好。但是有些东西没
办法写好,为什么?因为一开始选择的题目不够好。因此唯有选定题目以后,你的所有
训练与努力才有价值。我在这里建议大家,选题的工作要尽早做,所选的题目所要处理
的材料最好要集中,不要太分散,因为硕士生可能只有三年、博士生可能只有五年,如
果你的材料太不集中,读书或看数据可能就要花掉你大部分的时间,让你没有余力思考
。而且这个题目要适合你的性向,如果你不会统计学或讨厌数字,但却选了一个全都要
靠统计的论文,那是不可能做得好。

6. 养成遵照学术格式的写作习惯

另一个最基本的训练,就是平时不管你写一万字、三万字、五万字都要养成遵照学
术规范的习惯,要让他自然天成,就是说你论文的脚注、格式,在一开始进入研究生的
阶段就要培养成为你生命中的一个部份,如果这个习惯没有养成,人家就会觉得这个论
文不严谨,之后修改也要花很多时间,因为你的论文规模很大,可能几百页,如果一开
始弄错了,后来再重头改到尾,一定很耗时费力,因此要在一开始就养成习惯,因为我
们是在写论文而不是在写散文,哪一个逗点应该在哪里、哪一个书名号该在哪里、哪一
个地方要用引号、哪一个要什么标点符号,都有一定的规定,用中文写还好,用英文有
一大堆简称。在 1960 年代台湾知识还很封闭的时候,有一个人从美国回来就说:「美
国有个不得了的情形,因为有一个人非常不得了。」有人问他为什么不得了,他说:「
因为这个人的作品到处被引用。」他的名字就叫 ibid 。所谓 ibid 就是同前作者,这
个字是从拉丁文发展出来的,拉丁文有一大堆简称,像 et. al. 就是两人共同编的。
英文有一本 The Chicago Manual of Style 就是专门说明这一些写作规范。各位要尽
早学会中英文的写作规范,慢慢练习,最后随性下笔,就能写出符合规范的文章。

7. 善用图书馆

图书馆应该是研究生阶段最重要的地方,不必读每一本书,可是要知道有哪些书。
我记得我做学生时,新进的书都会放在图书馆的墙上,而身为学生最重要的事情,就是
要把书名看一看。在某些程度上知道书皮就够了,但是这仍和打计算机是不一样的,你
要实际上熟悉一下那本书,摸一下,看一眼目录。我知道现在从计算机就可以查到书名
,可是我还是非常珍惜这种定期去 browse 新到的书的感觉,或去看看相关领域的书长
成什么样子。中研院有一位院士是哈佛大学信息教授,他告诉我他在创造力最高峰的时
候,每个礼拜都到他们信息系图书室里,翻阅重要的信息期刊。所以图书馆应该是身为
研究生的人们,最熟悉的地方。不过切记不重要的不要花时间去看,你们生活在信息泛
滥的时代,跟我生长在信息贫乏的时代是不同的,所以生长在这一个时代的你,要能有
所取舍。我常常看我的学生引用一些三流的论文,却引得津津有味,我都替他感到难过
,因为我强调要读有用、有价值的东西。(非常精彩!非常重要!)

8. 留下时间,精致思考

还要记得给自己保留一些思考的时间。一篇论文能不能出神入化、能不能引人入胜
,很重要的是在现象之上作概念性的思考,但我不是说一定要走理论的路线,而是提醒
大家要在一般的层次再提升两三步, conceptualize 你所看到的东西。真切去了解,
你所看到的东西是什么?整体意义是什么?整体的轮廓是什么?千万不要被枝节淹没,
虽然枝节是你最重要的开始,但是你一天总也要留一些时间好好思考、慢慢沉淀。 con
ceptualize 是一种非常难教的东西,我记得我念书时,有位老师信誓旦旦说要开一门
课,教学生如何 conceptualize ,可是从来都没开成,因为这非常难教。我要提醒的
是,在被很多材料和枝节淹没的时候,要适时跳出来想一想,所看到的东西有哪些意义?
这个意义有没有广泛连结到更大层面的知识价值。

傅斯年先生来到台湾以后,同时担任中央研究院历史语言研究所的所长及台大的校
长。台大有个傅钟每小时钟声有二十一响、敲二十一次。以前有一个人,写了一本书叫
《钟声二十一响》,当时很轰动。他当时对这二十一响解释是说:因为台大的学生都很
好,所以二十一响是欢迎国家元首二十一响的礼炮。不久前我发现台大在每一个重要的
古迹下面竖一个铜牌,我仔细看看傅钟下的解释,才知道原来是因为傅斯年当台大校长
的时候,曾经说过一句话:「人一天只有二十一个小时,另外三小时是要思考的。」所
以才叫二十一响。我觉得这句话大有道理,可是我觉得三小时可能太多,因为研究生是
非常忙的,但至少每天要留个三十分钟、一小时思考,想一想你看到了什么?学习跳到
比你所看到的东西更高一点的层次去思考。

9. 找到学习的楷模

我刚到美国念书的时候,每次写报告头皮就重的不得了,因为我们的英文报告三、
四十页,一个学期有四门课的话就有一百六十页,可是你连脚注都要从头学习。后来我
找到一个好办法,就是我每次要写的时候,把一篇我最喜欢的论文放在旁边,虽然他写
的题目跟我写的都没关系,不过我每次都看他如何写,看看他的注脚、读几行,然后我
就开始写。就像最有名的男高音 Pavarotti 唱歌剧的时候都会捏着一条手帕,因为他
说:「上舞台就像下地狱,太紧张了。」他为了克服紧张,他有习惯性的动作,就是捏
着白手帕。我想当年那一篇论文抽印本就像是我的白手帕一样,能让我开始好好写这篇
报告,我学习它里面如何思考、如何构思、如何照顾全体、如何用英文作脚注。好好的
把一位大师的作品读完,开始模仿和学习他,是入门最好的方法,逐步的,你也开始写
出自己的东西。我也常常鼓励我的学生,出国半年或是一年到国外看看。像现在国科会
有各式各样的机会,可以增长眼界,可以知道现在的餐馆正在卖些什么菜,回来后自己
要做菜也才知道要如何着手。

四、用两条腿走路,练习培养自己的兴趣

最后还有一点很重要的,就是我们的人生是两只脚,我们不是靠一只脚走路。做研
究生的时代,固然应该把所有的心思都放在学业上,探索你所要探索的那些问题,可是
那只是你的一只脚,另外还有一只脚是要学习培养一、两种兴趣。很多人后来会发现他
的右脚特别肥重(包括我自己在内),也就是因为忘了培养左脚。很多很有名的大学者
最后都陷入极度的精神困扰之中,就是因为他只是培养他的右脚,他忘了培养他的左脚
,他忘了人生用两只脚走路,他少了一个小小的兴趣或嗜好,用来好好的调解或是排遣
自己。

去年夏天,香港《亚洲周刊》要访问我,我说:「我不想接受访问,我不是重要的
人。」可是后来他们还是把一个简单的对话刊出来了,里面我只记得讲了一段话:做一
个研究生或一个学者,有两个感觉最重要 – 责任感与罪恶感。你一定要有很大的责任
感,去写出好的东西,如果责任感还不够强,还要有一个罪恶感,你会觉得如果今天没
有好好做几个小时的工作的话,会有很大的罪恶感。除非是了不得的天才,不然即使爱
因斯坦也是需要很努力的。很多很了不得的人,他只是把所有的努力集中在一百页里面
,他花了一千小时和另外一个人只花了十个小时,相对于来说,当然是那花一千个小时
所写出来的文章较好。所以为什么说要赶快选定题目?因为如果太晚选定一个题目,只
有一年的时间可以好好耕耘那个题目,早点选定可以有二、三年耕耘那个题目,是三年
做出的东西好,还是一年的东西好?如果我们的才智都一样的话,将三年的努力与思考
都灌在上面,当然比一年还要好。

五、营造卓越的大学,分享学术的氛围

现在很多人都在讨论,何谓卓越的大学?我认为一个好的大学,学校生活的一大部
份,以及校园的许多活动,直接或间接都与学问有关,同学在咖啡厅里面谈论的,直接
或间接也都会是学术相关的议题。教授们在餐厅里面吃饭,谈的是「有没有新的发现」
?或是哪个人那天演讲到底讲了什么重要的想法?一定是沉浸在这种氛围中的大学,才
有可能成为卓越大学。那种交换思想学识、那种互相教育的气氛不是花钱就有办法获得
的。我知道钱固然重要,但不是唯一的东西。一个卓越的大学、一个好的大学、一个好
的学习环境,表示里面有一个共同关心的焦点,如果没有的话,这个学校就不可能成为
好的大学。

本文为飘扬原创,首发飘扬博客,http://piaoyang.org,作者邮箱piaoyang168#163.com,请尊重版权,转载请保留本行说明。

在Linux和Windows下搭建CVS服务器与CVS客户端的详细配置指南

============================================
时间:2007-04-12
作者:飘扬
首发:飘扬博客
网址:http://piaoyang.org
Q Q: 47720194
邮箱:piaoyang168#163.com
版权声明:可以任意转载,转载时请务必标明原始出处和作者信息

摘要:本教程包含CVS的入门知识讲解、在linux和windows下CVS服务器与CVS客户端的配置指南,详细介绍了配置过程,可以说是一篇组建CVS开发环境
的入门、学习与提高的完美教程。通过本教程你可以在最短的时间里面最快的搭建好CVS服务器与CVS客户端的的开发环境。如有不明之处,请联系飘扬,你可以到我的博客
(飘扬博客)http://www.piaoyang.org 给我留言或QQ47720194,我会尽力解答你的问题。


目录:
一、CVS入门知识详解
1、什么是 CVS?
2、CVS基本概念
二、Linux下CVS服务器与客户端的配置
1、Linux下CVS服务器的配置
2、Linux下CVS客户端的配置
三、Windows下CVS服务器与客户端的配置
1、windows下CVS服务器的配置
2、windows下CVS客户端的配置
四、结束语


一、CVS入门知识详解

1、什么是 CVS?

CVS 是一种客户机/服务器系统,类似于microsoft SourceSafe,可以让开发人员将他们的项目存储在称为资源库的中央位置。使用 cvs
客户机工具,开发人员可以对资源库的内容进行更改。CVS 资源库会依次记录对每个文件所做的每个更改,并创建一个完整的项目开发进展历史。开发人员可以请求特定源文
件的旧版本、查看更改日志,并根据需要执行其它一些有用的任务。所有重要的免费软件项目都使用 CVS
作为其程序员之间的中心点,以便能够综合各程序员的改进和更改。这些项目包括: Gnome, KDE, The GIMP, Wine, 等等。

CVS 的基本工作思路是这样的:在一台服务器上建立一个仓库,仓库里可以存放许多不同项目的源程序。由仓库管理员统一管理这些源程序.这样,就好象只有一个人在修改
文件一样.避免了冲突.每个用户在使用仓库之前,首先要把仓库里的项目文件下载到本地。用户做的任何修改首先都是在本地进行,然后用 cvs 命令进行提交,由
cvs 仓库管理员统一 修改.这样就可以做到跟踪文件变化,冲突控制等等.

CVS可以协助一组人共同开发一个工程。如果你是一个项目中的一组成员之一,CVS也能够帮助你。除非你特别仔细,你很容易覆盖其他人的工作。一些编辑器,例如GNU
Emacs,试图去判定一个文件是否被两人同时修改。不幸的是,如果一个人使用其它的编辑器时,这个安全方式将不再有效。CVS使用让不同开发者独立工作的方式解决了
这个问题。每一个开发者的工作都在他自己的目录内,并且CVS将 在每个开发者的工作完成后进行合并工作。

由于 CVS 是典型的 C/S 结构的软件,因此它也分成服务器端和客户端两部分。不过大多数CVS
软件都把它们合二为一了。我们这里就分别从服务器和客户端的角度讨论cvs的使用。

2、CVS基本概念

Repository(仓库)
CVS的仓库存储全部的版本控制下的文件copy,通常不容许直接访问,只能通过cvs命令,获得一份本地copy,改动后再check in(commit)回仓库
。而仓库通常为与工作目录分离的。CVS通过多种方式访问仓库。每种方法有不同目录表示形式。数据如何存放在repository中:随着CVS版本的不同,存放结构
会发生变化,一般情况下用户无需了解数据到底是如何存放的。

Revision(修订版)
每一个file的各个revision都不相同,形如1.1,
1.2.1,一般1.1是该文件的第一个revision,后面的一个将自动增加最右面的一个整数,比如1.2, 1.3, 1.4…有时候会出现1.3.2.2,原
因见后。revision总是偶数个数字。一般情况下将revision看作时CVS自己内部的一个编号,而tag则可以标志用户的特定信息。

Tag(标签)
用符号化的表示方法标志文件特定revision的信息。通常不需要对某一个孤立的文件作tag,而是对所有文件同时作一个tag,以后用户可以仅向特定tag的文件
提交或者checkout。另外一个作用是在发布软件的时候表示哪些文件及其哪个版本是可用的;各文件不同revision可以包括在一个tag中。如果命名一个已存
在的tag默认将不会覆盖原来的;

Branch(分支)
当用户修改一个branch时不会对另外的branch产生任何影响。可以在适当的时候通过合并的方法将两个版本合起来;branch总是在当前revision后面
加上一个偶数整数(从2开始,到0结束),所以branch总是奇数个数字,比如1.2后面branch为1.2.2,该分支下revision可能为1.2.2.1
,1.2.2.2,…

Conflict(冲突)
完全是纯文本的冲突,不包含逻辑上的矛盾,比如CVS不能解决如下问题:某人修改了函数f的参数,而另外一个人在另外一个地方用老的参数调用该函数。文本冲突需要用户
自己参与解决,CVS无法自动解决。(如还有不明之处,请联系飘扬,你可以到我的博客(飘扬博客)http://www.piaoyang.org
给我留言或QQ47720194,我会尽力解答你的问题。)

Module(模块):CVS服务器根目录下的第一级子目录。通常用于存放一个项目的所有文件
Check out(检出):通常指将仓库中的一整个模块首次导出到本地。
Check in(导入)::通常指通过提交整个目录结构并创建一个新的模块。
Release(发行版本):整个产品的版本
Update(更新):从模块中下载其他人的修改过的文件。更新本地的拷贝。
Commit(提交):将自己修改过的文件提交到模块中。

二、Linux下CVS服务器与客户端的配置与使用

1、Linux下CVS服务器的配置
在RedHat Linux
7.1之后的版本上,都有自动安装CVS服务器软件,只要对该软件进行设置,即可使用。此次配置我用的是虚拟机VMware环境下的linux
redhat9.0,下面是具体的配置过程。

1.1 创建cvs组并加入用户
在root权限下,创建一个cvs组并加入成员

  1. 创建组:groupadd cvs
  2. 打开/etc/group文件,找到该组,如cvs❌514:,在后面添加要加入的用户,比如piaoyang,chen等,以逗号隔开,编辑结果是:cv
    s❌514:piaoyang, chen
    只有加入这个组中的成员才能进行相关CVS操作。保存该文件。

1.2 创建一个仓库
假定将CVSROOT指向/usr/local(也可以指向别的目录),用root登录。

  1. 创建cvsroot目录:mkdir /usr/local/cvsroot
  2. 设置该目录的模式:chmod 1777 /usr/local/cvsroot
  3. 修改环境变量:export CVSROOT= /usr/local/cvsroot
  4. cvs init 这样就创建了 CVSROOT。
  5. 更新环境变量:
    #source /etc/profile
    此时系统已经认识$CVSROOT这样的环境变量

1.3 装入源代码

  1. 进入代码所在目录:cd [sourcedir],如cd test
  2. 装载cvs import -m “[repository test]” [cvstest] [vendortag] [releasetag]
    -m后面引号内填入log内容,接下来是源代码模块名称,接着是装载者,最后是标识符号,
    例如:cvs import –m “cvs test” cvstest piaoyang start
    cvs组中的用户也可以创建仓库,但必须有写权限,该权限的设置在下面将会提到。(如还有不明之处,请联系飘扬,你可以到我的博客(飘扬博客)http://www.
    piaoyang.org给我留言或QQ47720194,我会尽力解答你的问题。)

1.4 设置权限
cvs初始化结束以后,在管理员用户(这里是cvs用户)的主目录/usr/local/cvsroot/下有一个 CVSROOT
目录,这个目录里有三个配置文件:readers,writers, passwd。我们可以通过设置这三个文件来配置 CVS
服务器用户的权限,下面分别介绍这几个文件的作用:
readers文件:此文件中的用户允许对模块进行读取,不允许写入;
writers文件:此文件中的用户允许对模块进行读取和写入;
passwd文件:此文件存储用户名和密码,当用户登录时进行验证;

  1. readers和writers的格式如下,每个用户占据一行:
    aaa
    bbb
    ccc
  2. passwd文件的格式如下,每个用户占据一行:
1
2
3
[cvs 用户名]:[加密的口令]:[等效系统用户名]  
如: piaoyang:$1$rPVPciBw$IK3fb4jO7hQbPXFjK3ee..:piaoyang
其中"piaoyang:$1$rPVPciBw$IK3fb4jO7hQbPXFjK3ee..:"从/etc/shadow中拷贝过来。
  1. 上面三个文件在缺省安装的时候可能都不存在,需要我们自己创建,好吧,现在还是让我们用一个例子来说明吧。假设我们有下面几个用户需要使用 cvs:
    laser,gumpwu,henry,betty,anonymous
    其中 laser 和 gumpwu 是系统用户,而henry, betty, anonymous 我们都不想给系统用户权限,并且 betty 和
    anonymous 都是只读用户,而且 anonymous 更是连口令都没有。
    然后编辑 cvs 管理员家目录里 CVSROOT/passwd 文件,加入下面几行:
1
2
3
laser:$xxefajfka;faffa33:cvspub gumpwu:$ajfaal;323r0ofeeanv:cvspub
henry:$fajkdpaieje:cvspub betty:fjkal;ffjieinfn/:cvspub anonymous::cvspub

注意:上面的第二个字段(分隔符为
:)是密文口令,从/etc/shadow中拷贝过来即可(此方法适合cvs用户较少的情况,如果用户过多,则需要自己用程序生成密码了)。
编辑 readers 文件,加入下面几行:
anonymous
betty
编辑 writer 文件,加入下面几行:
laser
gumpwu
henry
这样就 ok 了,你再用几个用户分别登陆测试,就会发现一切都 ok 了。这里面的原理和说明我想就不多说了,其实很简单,和系统管理用户的概念是一样的。

1.5 设置开机自动运行CVS

  1. 在/etc/xinetd.d目录下生成一个文件cvspserver。输入命令:
    touch cvspserver
    vi cvspserver
    在cvspserver文件里写入如下内容并保存:

CVS : current version contrl system # DEFAULT: services is enable # this

server script was be writed by piaoyang.org # www.piaoyang.org service
cvspserver { socket_type = stream protocol = tcp wait = no user = root server
= /usr/bin/cvs server_args = -f –allow-root=/usr/local/cvsroot pserver
log_on_success +=USERID log_on_failure +=USERID disable = no }

  1. 修改该文件权限:
    chmod 644 cvspserver
    3),到/etc/rc.d/init.d路径下,运行如下指令重新启动xinetd即可:
    ./xinetd restart
  2. 重启后用root登录,察看cvs服务器是否已经运行:
    netstat -l |grep cvspserver
    如果返回tcp 0 0 *:cvspserver : LISTEN,则说明cvs服务器已经运行。

2、Linux下CVS客户端的配置
为了连接到 CVS 资源库,您需要知道称为 “CVSROOT” 的路径。CVSROOT 是一个字符串,就象 URL,它告诉
CVS用户远程资源库在哪里,以及如何连接它。不仅如此,根据 CVS 资源库是本地的还是远程的,以及连接到它的不同方式,CVS 还有许多不同的 CVSROOT
格式。

2.1 连接CVS服务器
当然你必须拥有cvs用户帐号和密码,以及相关权限。在Linux环境下:

  1. 本地 CVSROOT
    export CVSROOT=/usr/local/cvsroot (告诉CVS客户端,存放代码的资源库在什么地方)
    一个实际的例子,在版本管理员将代码库存放在192.168.0.8 的机器上,路径为:
    /usr/local/cvsroot(如果你telnet 到 192.168.0.8 的机器上的时候,此时你就是在本机)
  2. 远程密码服务器 CVSROOT
    export
    CVSROOT=:pserver:[email protected]:/usr/local/cvsroot(注意冒号不能漏掉,句子中间没有空格)
    pserver 是CVS内部的一种传输协议。
    piaoyang 是用户名,
    192.168.0.8 机器的IP或名字(如果有DNS才能用名字)
    /usr/local/cvsroot 是代码库的具体路径
    (注意:如果你不想每次敲这么多枯燥的命令,你可以在你登陆的时候让系统作这些事情,具体的作法是修改你登录的环境变量。现在用piaoyang作为例子,在文件/h
    ome/piaoyang/.bash_profile后面加入
    export CVSROOT=/home/cvsroot 或export
    CVSROOT=:pserver:[email protected]:/home/cvsroot
    并在根目录下运行:. ./.bash_profile)

2.2 登录CVS服务器
cvs login
(Logging in to [email protected])
CVS password:(在此输入密码)

2.3 拷贝相应模块代码并进行开发
如输入: cvs -z5 checkout VPN
此命令告诉 CVS 客户端使用 gzip 压缩级 5 (”-z5″) 在慢速连接上加快传输速度,来检出 (”checkout”)VPN模块。
一旦检出命令完成,将在包含最新源码的当前工作目录中看到 “VPN” 目录。还会注意到每个子目录下都有一个”CVS”目录 — CVS
在这些目录中存储帐户信息,可以放心地忽略它们。一旦检出结束,用户就无需担心是否设置了 CVSROOT 环境变量,也无需再在命令行上指定它,因为现在所有额外的
“CVS” 目录里都有它的缓存。
记住:只需要为初始登录和检出设置 CVSROOT。至此你就可以在刚才check out的VPN模块上进行修改或开发了。(如还有不明之处,请联系飘扬,你可以到
我的博客(飘扬博客)http://www.piaoyang.org给我留言或QQ47720194,我会尽力解答你的问题。)

三、Windows下CVS服务器与客户端的配置

1、windows下CVS服务器的配置
在此,我们以WinCVS为例来介绍。WinCVS顾名思义,是用在windows上的,它是一款相当不错的基于Windows的CVS客户端软件。安装时没有什么特
别的地方,与普通的Windows软件相同,一路next就OK了。(最新的WinCVS可以从http://sourceforge.net/project/sh
owfiles.php?group_id=10072地址下载到,也可以在http://sourceforge.net/project
上下载到最新的或其它版本的WinCVS。)由于是软件界面配置,所以针对界面选项填入相应的参数即可,在此不再赘述。

2、windows下CVS客户端的配置
同样我们以WinCVS为例来介绍。安装这个WinCVS不用再啰嗦一遍了吧,跳过,来看配置过程!

2.1 配置WinCVS
选择Admin->Preferences…,在出现的界面上进行一般选项的设置:

  1. Authentication:用来配置cvs服务器的认证方式,可以从下拉框中选择其它的认证方式,不过一般只要选择默认的pserver方式就可以,要注意
    的是必须与cvs服务器配置时所指定的认证方式一致;
  2. Path:用来配置cvs在服务器上的主目录路径,也就是服务器上用进行cvs初始化的目录,如:/home/cvsroot;
  3. Host Address:用来配置cvs服务器所在服务器的地址,可以是IP地址,也可以是DNS名,如:10.104.1.204;
  4. User name:用来配置要使用些WinCVS来登录CVS服务器的用户名,如:cvsyxwu,用户的登录必须由管理员把其添加cvs用户组中;
  5. CVSROOT:此项一般都不需要用户进行修改,用户在输入上边的几个选项时,系统将自动根据用户的输入生成此项的相应内容。
    6)在上一个界面上选择“Globals” ,进行全局选项的设置,此项的配置主要是要注意这几选项:
    第一,Checkout read-only不要选上,否则,checkout出来的源代码将不允许用户进行修改,并且此选项默认是选中的;
    第二,Prune (remove) empty directories也不要选上,否则,会自动删除空目录;
    第三,对一般配置没有特殊要求的,把Dirty files support、Supply control when adding与TCP/IP
    compression选项选中;

2.2 登录WinCVS服务器
选择Admin->login,将出现如下对话框要求用户输入登录口令。输入口令后,选择“OK”按钮,如果CVS服务器与WinCVS的配置都没出错的话,将在CV
S的状态栏中提示:
cvs -z9 -d :pserver:[email protected]:/home/cvsroot login
Logging in to :pserver:[email protected]:2401/home/cvsroot
***** CVS exited normally with code 0 *****
code 0表示正确的登录;而如果出错的话,将是code 1,那么要根据错误的提示进行相应的修改。

2.3拷贝相应模块代码并进行开发

  1. 在workspace中的Modules选中要存放checkout模块的目录;
  2. 选择Create->Checkout Modeles,将出现一个对话框,需要进行选择。其中,Module name and path on the
    server就是要存放checkout 内容的目录,由用户输入;而Local folder to checkout to就是第一种用户所选择的目录。
  3. 至此你就可以在刚才check out的代码上进行修改或开发了。

四、结束语
如果你是通篇读到这里,那么到这里,你基本上已经能为自己或公司配置一个实用的CVS服务器与CVS客户端了,无论是在Linux下,还是在Windows下。谢谢你
的耐心与信任,同时也对你的小有成就小小的祝贺一下。在最后飘扬要申明的是,本教程里的大部分内容是由网上多篇介绍CVS的文章提取而来,飘扬只是用自己的逻辑和语言
将这些内容串联起来。在此,飘扬对这些文章的原作者深表感谢。如还有不明之处,请联系飘扬,你可以到我的博客(飘扬博客)http://www.piaoyang.o
rg 给我留言或QQ47720194,我会尽力解答你的问题。以此拙作,希望能给大家带去些微的帮助。

本文为飘扬原创,首发飘扬博客,http://piaoyang.org,作者邮箱piaoyang168#163.com,请尊重版权,转载请保留本行说明。

0%