很久以前就听说过这个故事了,几天又在报纸上看到,
不过感觉已经不是以前那种笑笑而已的感觉了。
所以想把他记录下来:
有一个广为人知的故事,两个鞋匠一同来到一个国度,发现这里只有一个人穿鞋子,而其他的那些人都不穿鞋。第一个鞋匠就大哭起来,说:“鞋子在这里根本没有市场!”而另一个人则大笑起来:“太好了,这里的所有人都可以来买我的鞋子了!”这两个人究竟谁的判断更接近事实呢?
如果有第三个鞋匠,那么鞋匠三既不会像第一个那么悲观,也不会像第二个那样乐观,实际上0市场和全市场都是不可能的极端状态。鞋匠三最想知道的是他们如今是怎么消费的,也就是消费者的消费经验。鞋匠三会先去问那个穿鞋的人,问他为什么要穿鞋子。然后鞋匠三再去问99个不穿鞋的人,为什么不穿鞋,更多地了解这些还不是消费者的消费者。
很快就可以分出以下几个原因:A是不是因为买不到而不穿?这就不是产品的问题而是营销的问题;B他们是否知道世界上有鞋子的存在?C是不是因为买不起而不穿?D会不会因为不知道穿鞋会有好处,因为不了解鞋子的功能认为没有必要穿?对这些问题的研究和分析最终可以知道如何在这个市场上找到一个正确的切入点。
我们平时是不是也会经常遇到这样类似的事情呢,我们是做的哪一个人呢?
不久前,德国一家电视台提出高薪,征集“十秒钟惊险镜头”活动。许多新闻工作者为此趋之若鹜,征集活动一时成为人们关注的焦点。在诸多参赛作品,一个名叫“卧倒”的镜头以绝对的优势夺得了冠军。
拍摄这10秒钟镜头的作者是一位名不见经传刚刚踏入工作岗位的年轻人,对于这个作品,每个人都渴望一睹为快。
几个星期以后,获奖作品在电视的强档栏目中播出。
那天晚上,大部份人都坐在电视前边观看了这组镜头,最初是等待、好奇或者议论纷纷,10秒钟后,每一双眼睛里都是泪水。
可以毫不夸张地说,德国在那10秒钟后足足肃静了10分钟。
镜头是这样的:
在一个火车站,一个扳道工正走向自己的岗位,去为一队徐徐而来的火车扳动道岔。这时在铁轨的另一头,还有一列火车从相反的方向近车站。假如他不及时扳岔,两列火车必定相撞。
这时,他无意中回过头一看,发现自己的儿子正在铁轨那一端玩耍,而那列开始进站的火车就行驶在这条铁轨上。是抢救儿子,还是扳道避免一场灾难──他可以选择的时间太少了。那一刻,他威严地朝儿子喊了声“卧倒!”
同时,冲过去扳动了道岔。
一眨眼的工夫,这列火车进入了预定的轨道。
那一边,火车也呼啸而过。
车上的旅客丝毫不知道,他们的生命曾经千钧一发,他们也丝毫不知道,一个小生命卧倒在铁轨边上──火车在轰鸣着驶过,孩子丝毫未伤。那一幕刚好被一个从此经过的记者摄入镜头中。
人们猜测,那个扳道工一定是一个非常优秀的人。
后来,人们才渐渐知道,那个扳道工是一个普普通通的人。
他唯一的优点就是忠于职守,没误工过一秒钟。
而更让人意想不到的是,他的儿子是一个弱智儿童。
他告诉记者,他曾一遍一遍地告诉儿子说:“你长大后能干的工作太少了,你必须有一样是出色的。”
儿子听不懂父亲的话,依然傻呼呼的,但在生命攸关的那一秒钟,他却“卧倒 ”了── 这就是他在跟父亲玩打仗游戏时,唯一听懂,并做得最出色的动作。
作者: 车东 Email: chedongATbigfoot.com/chedongATchedong.com
写于:2002/07/10 最后更新: 07/01/2004 02:36:21 Feed Back >>
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
http://www.chedong.com/tech/cvs_card.html
关键词:CVS CVSWeb CVSTrac WinCVS CVSROOT
内容摘要:
CVS是一个C/S系统,多个开发人员通过一个中心版本控制系统来记录文件版本,从而达到保证文件同步的目的。工作模式如下:
CVS服务器(文件版本库) / | \ (版 本 同 步) / | \开发者1 开发者2 开发者3
作为一般开发人员挑选2,6看就可以了,CVS的管理员则更需要懂的更多一些,最后还简单介绍了一些Windows下的cvs客户端使用,CVS远程用户认证的选择及与BUG跟踪系统等开发环境的集成问题。
CVS环境初始化:CVS环境的搭建 管理员
CVS的日常使用:日常开发中最常用的CVS命令, 开发人员 管理员
CVS的分支开发:项目按照不同进度和目标并发进行 管理员
CVS的用户认证:通过SSH的远程用户认证,安全,简单 管理员
CVSWEB:CVS的WEB访问界面大大提高代码版本比较的效率 管理员
CVS TAG:将$Id$ 加入代码注释中,方便开发过程的跟踪开发人员
CVS vs VSS: CVS和Virsual SourceSafe的比较 开发人员 管理员
WinCVS: 通过SSH认证的WinCVS认证设置
基于CVSTrac的小组开发环境搭建:通过CVSTrac实现web界面的CVS用户管理,集成的BUG跟踪和WIKI交流
CVS中的用户权限管理:基于系统用户的CVS权限管理和基于CVSROOT/passwd的虚拟用户管理
一个系统20%的功能往往能够满足80%的需求,CVS也不例外,以下是CVS最常用的功能,可能还不到它全部命令选项的20%,作为一般开发人员平时会用cvs update和cvs commit就够了,更多的需求在实际应用过程中自然会出现,不时回头看看相关文档经常有意外的收获。
CVS环境初始化
环境设置:指定CVS库的路径CVSROOT
tcsh
setenv CVSROOT /path/to/cvsroot
bash
CVSROOT=/path/to/cvsroot ; export CVSROOT
后面还提到远程CVS服务器的设置:
CVSROOT=:ext:$USER@test.server.address#port:/path/to/cvsroot CVS_RSH=ssh; export CVSROOT CVS_RSH
初始化:CVS版本库的初始化。
cvs init
一个项目的首次导入
cvs import -m “write some comments here” project_name vendor_tag release_tag
执行后:会将所有源文件及目录导入到/path/to/cvsroot/project_name目录下
vender_tag: 开发商标记
release_tag: 版本发布标记
项目导出:将代码从CVS库里导出
cvs checkout project_name
cvs 将创建project_name目录,并将最新版本的源代码导出到相应目录中。这个checkout和Virvual SourceSafe中的check out不是一个概念,相对于Virvual SourceSafe的check out是cvs update, check in是cvs commit。
CVS的日常使用
注意:第一次导出以后,就不是通过cvs checkout来同步文件了,而是要进入刚才cvs checkout project_name导出的project_name目录下进行具体文件的版本同步(添加,修改,删除)操作。
将文件同步到最新的版本
cvs update
不制定文件名,cvs将同步所有子目录下的文件,也可以制定某个文件名/目录进行同步
cvs update file_name
最好每天开始工作前或将自己的工作导入到CVS库里前都要做一次,并养成“先同步 后修改”的习惯,和Virvual SourceSafe不同,CVS里没有文件锁定的概念,所有的冲突是在commit之前解决,如果你修改过程中,有其他人修改并commit到了CVS 库中,CVS会通知你文件冲突,并自动将冲突部分用
>>>>>>
content on cvs server
< <<<<<
content in your file
>>>>>>
标记出来,由你确认冲突内容的取舍。
版本冲突一般是在多个人修改一个文件造成的,但这种项目管理上的问题不应该指望由CVS来解决。
确认修改写入到CVS库里
cvs commit -m “write some comments here” file_name
注意:CVS的很多动作都是通过cvs commit进行最后确认并修改的,最好每次只修改一个文件。在确认的前,还需要用户填写修改注释,以帮助其他开发人员了解修改的原因。如果不用写-m “comments”而直接确认`cvs commit file_name` 的话,cvs会自动调用系统缺省的文字编辑器(一般是vi)要求你写入注释。
注释的质量很重要:所以不仅必须要写,而且必须写一些比较有意义的内容:以方便其他开发人员能够很好的理解
不好的注释,很难让其他的开发人员快速的理解:比如: -m “bug fixed” 甚至 -m “”
好的注释,甚至可以用中文: -m “在用户注册过程中加入了Email地址校验”
修改某个版本注释:每次只确认一个文件到CVS库里是一个很好的习惯,但难免有时候忘了指定文件名,把多个文件以同样注释commit到CVS库里了,以下命令可以允许你修改某个文件某个版本的注释:
cvs admin -m 1.3:”write some comments here” file_name
添加文件
创建好新文件后,比如:touch new_file
cvs add new_file
注意:对于图片,Word文档等非纯文本的项目,需要使用cvs add -kb选项按2进制文件方式导入(k表示扩展选项,b表示binary),否则有可能出现文件被破坏的情况
比如:
cvs add -kb new_file.gif
cvs add -kb readme.doc
如果关键词替换属性在首次导入时设置错了怎么办?
cvs admin -kkv new_file.css
然后确认修改并注释
cvs ci -m “write some comments here”
删除文件
将某个源文件物理删除后,比如:rm file_name
cvs rm file_name
然后确认修改并注释
cvs ci -m “write some comments here”
以上面前2步合并的方法为:
cvs rm -f file_name
cvs ci -m “why delete file”
注意:很多cvs命令都有缩写形式:commit=>ci; update=>up; checkout=>co/get; remove=>rm;
添加目录
cvs add dir_name
查看修改历史
cvs log file_name
cvs history file_name
查看当前文件不同版本的区别
cvs diff -r1.3 -r1.5 file_name
查看当前文件(可能已经修改了)和库中相应文件的区别
cvs diff file_name
cvs的web界面提供了更方便的定位文件修改和比较版本区别的方法,具体安装设置请看后面的cvsweb使用
正确的通过CVS恢复旧版本的方法:
如果用cvs update -r1.2 file.name
这个命令是给file.name加一个STICK TAG: “1.2″ ,虽然你的本意只是想将它恢复到1.2版本
正确的恢复版本的方法是:cvs update -p -r1.2 file_name >file_name
如果不小心已经加成STICK TAG的话:用cvs update -A 解决
移动文件/文件重命名
cvs里没有cvs move或cvs rename,因为这两个操作是可以由先cvs remove old_file_name,然后cvs add new_file_name实现的。
删除/移动目录
最方便的方法是让管理员直接移动,删除CVSROOT里相应目录(因为CVS一个项目下的子目录都是独立的,移动到$CVSROOT目录下都可以作为新的独立项目:好比一颗树,其实砍下任意一枝都能独立存活),对目录进行了修改后,要求其开发人员重新导出项目cvs checkout project_name 或者用cvs update -dP同步。
项目发布导出不带CVS目录的源文件
做开发的时候你可能注意到了,每个开发目录下,CVS都创建了一个CVS/目录。里面有文件用于记录当前目录和CVS库之间的对应信息。但项目发布的时候你一般不希望把文件目录还带着含有CVS信息的CVS目录吧,这个一次性的导出过程使用cvs export命令,不过export只能针对一个TAG或者日期导出,比如:
cvs export -r release1 project_name
cvs export -D 20021023 project_name
cvs export -D now project_name
CVS Branch:项目多分支同步开发
确认版本里程碑:多个文件各自版本号不一样,项目到一定阶段,可以给所有文件统一指定一个阶段里程碑版本号,方便以后按照这个阶段里程碑版本号导出项目,同时也是项目的多个分支开发的基础。
cvs tag release_1_0
开始一个新的里程碑:
cvs commit -r 2 标记所有文件开始进入2.x的开发
注意:CVS里的revsion和软件包的发布版本可以没有直接的关系。但所有文件使用和发布版本一致的版本号比较有助于维护。
版本分支的建立
在开发项目的2.x版本的时候发现1.x有问题,但2.x又不敢用,则从先前标记的里程碑:release_1_0导出一个分支 release_1_0_patch
cvs rtag -b -r release_1_0 release_1_0_patch proj_dir
一些人先在另外一个目录下导出release_1_0_patch这个分支:解决1.0中的紧急问题,
cvs checkout -r release_1_0_patch
而其他人员仍旧在项目的主干分支2.x上开发
在release_1_0_patch上修正错误后,标记一个1.0的错误修正版本号
cvs tag release_1_0_patch_1
如果2.0认为这些错误修改在2.0里也需要,也可以在2.0的开发目录下合并release_1_0_patch_1中的修改到当前代码中:
cvs update -j release_1_0_patch_1
CVS的远程认证通过SSH远程访问CVS
使用cvs本身基于pserver的远程认证很麻烦,需要定义服务器和用户组,用户名,设置密码等,
常见的登陆格式如下:
cvs -d :pserver:cvs_user_name@cvs.server.address:/path/to/cvsroot login
例子:
cvs -d :pserver:cvs@samba.org:/cvsroot login
不是很安全,因此一般是作为匿名只读CVS访问的方式。从安全考虑,通过系统本地帐号认证并通过SSH传输是比较好的办法,通过在客户机的 /etc/profile里设置一下内容:
CVSROOT=:ext:$USER@cvs.server.address#port:/path/to/cvsroot CVS_RSH=ssh; export CVSROOT CVS_RSH
所有客户机所有本地用户都可以映射到CVS服务器相应同名帐号了。
比如:
CVS服务器是192.168.0.3,上面CVSROOT路径是/home/cvsroot,另外一台开发客户机是192.168.0.4,如果 tom在2台机器上都有同名的帐号,那么从192.168.0.4上设置了:
export CVSROOT=:ext:tom@192.168.0.3:/home/cvsroot
export CVS_RSH=ssh
tom就可以直接在192.168.0.4上对192.168.0.3的cvsroot进行访问了(如果有权限的话)
cvs checkout project_name
cd project_name
cvs update
…
cvs commit
如果CVS所在服务器的SSH端口不在缺省的22,或者和客户端与CVS服务器端SSH缺省端口不一致,有时候设置了:
:ext:$USER@test.server.address#port:/path/to/cvsroot
仍然不行,比如有以下错误信息:
ssh: test.server.address#port: Name or service not known
cvs [checkout aborted]: end of file from server (consult above messages if any)
解决的方法是做一个脚本指定端口转向(不能使用alias,会出找不到文件错误):
创建一个/usr/bin/ssh_cvs文件,假设远程服务器的SSH端口是非缺省端口:34567
#!/bin/sh
/usr/bin/ssh -p 34567 “$@”
然后:chmod +x /usr/bin/ssh_cvs
并CVS_RSH=ssh_cvs; export CVS_RSH
注意:port是指相应服务器SSH的端口,不是指cvs专用的pserver的端口
CVSWEB:提高文件浏览效率
CVSWEB就是CVS的WEB界面,可以大大提高程序员定位修改的效率:
使用的样例可以看:http://www.freebsd.org/cgi/cvsweb.cgi
CVSWEB的下载:CVSWEB从最初的版本已经演化出很多功能界面更丰富的版本,这个是我个人感觉安装设置比较方便的:
原先在:http://www.spaghetti-code.de/software/linux/cvsweb/,但目前已经删除,目前仍可以在本站下载CVSWEB,其实最近2年FreeBSD的CVSWeb项目已经有了更好的发展吧,而当初没有用FreeBSD那个版本主要就是因为没有彩色的文件Diff功能。
下载解包:
tar zxf cvsweb.tgz
把配置文件cvsweb.conf放到安全的地方(比如和apache的配置放在同一个目录下),
修改:cvsweb.cgi让CGI找到配置文件:
$config = $ENV{‘CVSWEB_CONFIG’} || ‘/path/to/apache/conf/cvsweb.conf’;
转到/path/to/apache/conf下并修改cvsweb.conf:
修改CVSROOT路径设置:
%CVSROOT = (
‘Development’ => ‘/path/to/cvsroot’, #< ==修改指向本地的CVSROOT
);
缺省不显示已经删除的文档:
"hideattic" => “1″,#< ==缺省不显示已经删除的文档
在配置文件cvsweb.conf中还可以定制页头的描述信息,你可以修改$long_intro成你需要的文字
CVSWEB可不能随便开放给所有用户,因此需要使用WEB用户认证:
先生成 passwd:
/path/to/apache/bin/htpasswd -c cvsweb.passwd user
修改httpd.conf: 增加
AuthName “CVS Authorization”
AuthType Basic
AuthUserFile /path/to/cvsweb.passwd
require valid-user
CVS TAGS: $Id: cvs_card.html,v 1.5 2003/03/09 08:41:46 chedong Exp $
将$Id: cvs_card.html,v 1.9 2003/11/09 07:57:11 chedong Exp $ 加在程序文件开头的注释里是一个很好的习惯,cvs能够自动解释更新其中的内容成:file_name version time user_name 的格式,比如:cvs_card.txt,v 1.1 2002/04/05 04:24:12 chedong Exp,可以这些信息了解文件的最后修改人和修改时间
几个常用的缺省文件:default.php< ?php/* * Copyright (c) 2002 Company Name. * $Header: /home/cvsroot/tech/cvs_card.html,v 1.9 2003/11/09 07:57:11 chedong Exp $ */?>====================================Default.java: 注意文件头一般注释用 /* 开始 JAVADOC注释用 /** 开始的区别/* * Copyright (c) 2002 MyCompany Name. * $Header: /home/cvsroot/tech/cvs_card.html,v 1.9 2003/11/09 07:57:11 chedong Exp $ */package com.mycompany;import java.;/** * comments here */public class Default { /** * Comments here * @param * @return */ public toString() { }}====================================default.pl:#!/usr/bin/perl -w# Copyright (c) 2002 Company Name.# $Header: /home/cvsroot/tech/cvs_card.html,v 1.9 2003/11/09 07:57:11 chedong Exp $# file comments hereuse strict;
CVS vs VSS
CVS没有文件锁定模式,VSS在check out同时,同时记录了文件被导出者锁定。
CVS的update和commit, VSS是get_lastest_version和check in
对应VSS的check out/undo check out的CVS里是edit和unedit
在CVS中,标记自动更新功能缺省是打开的,这样也带来一个潜在的问题,就是不用-kb方式添加binary文件的话在cvs自动更新时可能会导致文件失效。
$Header: /home/cvsroot/tech/cvs_card.html,v 1.5 2003/03/09 08:41:46 chedong Exp $ $Date: 2003/11/09 07:57:11 $这样的标记在Virsual SourceSafe中称之为Keyword Explaination,缺省是关闭的,需要通过OPITION打开,并指定需要进行源文件关键词扫描的文件类型:*.txt,*.java, *.html…
对于Virsual SourceSafe和CVS都通用的TAG有:
$Header: /home/cvsroot/tech/cvs_card.html,v 1.5 2003/03/09 08:41:46 chedong Exp $
$Author: chedong $
$Date: 2003/11/09 07:57:11 $
$Revision: 1.9 $
我建议尽量使用通用的关键词保证代码在CVS和VSS都能方便的跟踪。
WinCVS
下载:
cvs Windows客户端:目前稳定版本为1.2
http://cvsgui.sourceforge.net
ssh Windows客户端
http://www.networksimplicity.com/openssh/
安装好以上2个软件以后:
WinCVS客户端的admin==>preference设置
1 在general选单里
设置CVSROOT: username@192.168.0.123:/home/cvsroot
设置Authorization: 选择SSH server
2 Port选单里
钩上:check for alternate rsh name
并设置ssh.exe的路径,缺省是装在 C:\Program Files\NetworkSimplicity\ssh\ssh.exe
然后就可以使用WinCVS进行cvs操作了,所有操作都会跳出命令行窗口要求你输入服务器端的认证密码。
当然,如果你觉得这样很烦的话,还有一个办法就是生成一个没有密码的公钥/私钥对,并设置CVS使用基于公钥/私钥的SSH认证(在general 选单里)。
可以选择的diff工具:examdiff
下载:
http://www.prestosoft.com/examdiff/examdiff.htm
还是在WinCVS菜单admin==>preference的WinCVS选单里
选上:Externel diff program
并设置diff工具的路径,比如:C:\Program Files\ed16i\ExamDiff.exe
在对文件进行版本diff时,第一次需要将窗口右下角的use externel diff选上。
基于CVSTrac的小组开发环境搭建
作为一个小组级的开发环境,版本控制系统和BUG跟踪系统等都涉及到用户认证部分。如何方便的将这些系统集成起来是一个非常困难的事情,毕竟我们不能指望 Linux下有像Source Offsite那样集成度很高的版本控制/BUG跟踪集成系统。
我个人是很反对使用pserver模式的远程用户认证的,但如果大部分组员使用WINDOWS客户端进行开发的话,总体来说使用 CVSROOT/passwd认证还是很难避免的,但CVS本身用户的管理比较麻烦。本来我打算自己用perl写一个管理界面的,直到我发现了 CVSTrac:一个基于WEB界面的BUG跟踪系统,它外挂在CVS系统上的BUG跟踪系统,其中就包括了WEB界面的CVSROOT/passwd文件的管理,甚至还集成了WIKIWIKI讨论组功能。
这里首先说一下CVS的pserver模式下的用户认证,CVS的用户认证服务是基于inetd中的:
cvspserver stream tcp nowait apache /usr/bin/cvs cvs –allow-root=/home/cvsroot pserver
一般在2401端口(这个端口号很好记:49的平方)
CVS用户数据库是基于CVSROOT/passwd文件,文件格式:
[username]:[crypt_password]:[mapping_system_user]
由于密码都用的是UNIX标准的CRYPT加密,这个passwd文件的格式基本上是apache的htpasswd格式的扩展(比APACHE的 PASSWD文件多一个系统用户映射字段),所以这个文件最简单的方法可以用
apache/bin/htpasswd -b myname mypassword
创建。注意:通过htpasswd创建出来的文件会没有映射系统用户的字段
例如:
new:geBvosup/zKl2
setup:aISQuNAAoY3qw
test:hwEpz/BX.rEDU
映射系统用户的目的在于:你可以创建一个专门的CVS服务帐号,比如用apache的运行用户apache,并将/home/cvsroot目录下的所有权限赋予这个用户,然后在passwd文件里创建不同的开发用户帐号,但开发用户帐号最后的文件读写权限都映射为apache用户,在SSH模式下多个系统开发用户需要在同一个组中才可以相互读写CVS库中的文件。
进一步的,你可以将用户分别映射到apache这个系统用户上。
new:geBvosup/zKl2:apache
setup:aISQuNAAoY3qw:apache
test:hwEpz/BX.rEDU:apache
CVSTrac很好的解决了CVSROOT/passwd的管理问题,而且包含了BUG跟踪报告系统和集成WIKIWIKI交流功能等,使用的 CGI方式的安装,并且基于GNU Public License:
在inetd里加入cvspserver服务:
cvspserver stream tcp nowait apache /usr/bin/cvs cvs –allow-root=/home/cvsroot pserver
xietd的配置文件:%cat cvspserver
service cvspserver
{
disable = no
socket_type = stream
wait = no
user = apache
server = /usr/bin/cvs
server_args = -f –allow-root=/home/cvsroot pserver
log_on_failure += USERID
}
注意:这里的用户设置成apache目的是和/home/cvsroot的所有用户一致,并且必须让这个这个用户对/home/cvsroot/下的 CVSROOT/passwd和cvstrac初始化生成的myproj.db有读取权限。
安装过程
下载:可以从http://www.cvstrac.org 下载
我用的是已经在Linux上编译好的应用程序包:cvstrac-1.1.2.bin.gz,
%gzip -d cvstrac-1.1.2.bin.gz
%chmod +x cvstrac-1.1.2.bin
#mv cvstarc-1.1.1.bin /usr/bin/cvstrac
如果是从源代码编译:
从 http://www.sqlite.org/download.html 下载SQLITE的rpm包:
rpm -i sqlite-devel-2.8.6-1.i386.rpm
从 ftp://ftp.cvstrac.org/cvstrac/ 下载软件包
解包,假设解包到/home/chedong/cvstrac-1.1.2下,并规划将cvstrac安装到/usr/local/bin目录下, cd /home/chedong/cvstrac-1.1.2 编辑linux-gcc.mk:
修改:
SRCDIR = /home/chedong/cvstrac-1.1.2
INSTALLDIR = /usr/local/bin
然后
mv linux-gcc.mk Makefile
make
#make install
初始化cvstrac数据库:假设数据库名是 myproj
在已经装好的CVS服务器上(CVS库这时候应该已经是初始化好了,比如:cvs init初始化在/home/cvsroot里),运行一下
%cvstrac init /home/cvsroot myproj
运行后,/home/cvsroot里会有一个的myproj.db库,使用CVSTRAC服务,/home/cvsroot/myproj.db /home/cvsroot/CVSROOT/readers /home/cvsroot/CVSROOT/writers /home/cvsroot/CVSROOT/passwd这几个文件对于web服务的运行用户应该是可写的,在RedHat8上,缺省就有一个叫 apache用户和一个apache组,所以在httpd.conf文件中设置了用apache用户运行web服务:
User apache
Group apache,
然后设置属于apache用户和apache组
#chown -R apache:apache /home/cvsroot
-rw-r–r– 1 apache apache 55296 Jan 5 19:40 myproj.db
drwxrwxr-x 3 apache apache 4096 Oct 24 13:04 CVSROOT/
drwxrwxr-x 2 apache apache 4096 Aug 30 19:47 some_proj/
此外还在/home/cvsroot/CVSROOT中设置了:
chmod 664 readers writers passwd
在apche/cgi-bin目录中创建脚本cvstrac:
#!/bin/sh
/usr/bin/cvstrac cgi /home/cvsroot
设置脚本可执行:
chmod +x /home/apache/cgi-bin/cvstrac
从 http://cvs.server.address/cgi-bin/cvstrac/myproj 进入管理界面
缺省登录名:setup 密码 setup
对于一般用户可以从:
http://cvs.server.address/cgi-bin/cvstrac/myproj
在setup中重新设置了CVSROOT的路径后,/home/cvsroot
如果是初次使用需要在/home/cvsroot/CVSROOT下创建passwd, readers, writers文件
touch passwd readers writers
然后设置属于apache用户,
chown apache.apache passwd readers writers
这样使用setup用户创建新用户后会同步更新CVSROOT/passwd下的帐号
修改登录密码,进行BUG报告等,
更多使用细节可以在使用中慢慢了解。
对于前面提到的WinCVS在perference里设置:
CVSROOT栏输入:username@ip.address.of.cvs:/home/cvsroot
Authenitication选择:use passwd file on server side
就可以了从服务器上进行CVS操作了。
CVS的用户权限管理
CVS的权限管理分2种策略:
基于系统文件权限的系统用户管理:适合多个在Linux上使用系统帐号的开发人员进行开发。
基于CVSROOT/passwd的虚拟用户管理:适合多个在Windows平台上的开发人员将帐号映射成系统帐号使用。
为什么使用apache/apache用户?首先RedHat8中缺省就有了,而且使用这个用户可以方便通过cvstrac进行WEB管理。
chown -R apache.apache /home/cvsroot
chmod 775 /home/cvsroot
Linux上通过ssh连接CVS服务器的多个开发人员:通过都属于apache组实现文件的共享读写
开发人员有开发服务器上的系统帐号:sysuser1 sysuser2,设置让他们都属于apache组,因为通过cvs新导入的项目都是对组开放的:664权限的,这样无论那个系统用户导入的项目文件,只要文件的组宿主是apache,所有其他同组系统开发用户就都可以读写;基于ssh远程认证的也是一样。
apache(system group)
/ | \
sysuser1 sysuser2 sysuser3
Windows上通过cvspserver连接CVS服务器的多个开发人员:通过在passwd文件种映射成 apache用户实现文件的共享读写
他们的帐号通过CVSROOT/passwd和readers writers这几个文件管理;通过cvstrac设置所有虚拟用户都映射到apache用户上即可。
apache(system user)
/ | \
windev1 windev2 windev3
利用cvs + (WinCVS/cvsweb/cvstrac),构成了一个相对完善的跨平台工作组开发版本控制环境。
相关资源:
CVS HOME:
http://www.cvshome.org
CVS FAQ:
http://www.loria.fr/~molli/cvs-index.html
相关网站:
http://directory.google.com/Top/Computers/Software/Configuration_Management/Tools/Concurrent_Versions_System/
CVS–并行版本系统
http://www.soforge.com/cvsdoc/zh_CN/book1.html
CVS 免费书:
http://cvsbook.red-bean.com/
CVS 命令的速查卡片:
http://www.refcards.com/about/cvs.html
WinCVS:
http://cvsgui.sourceforge.net/
CVSTrac: A Web-Based Bug And Patch-Set Tracking System For CVS
http://www.cvstrac.org
StatCVS:基于CVS的代码统计工具:按代码量,按开发者的统计表等
http://sourceforge.net/projects/statcvs
如何在WEB开发中规划CVS上:在Google上查 “cvs web development”
http://ccm.redhat.com/bboard-archive/cvs_for_web_development/index.html
一些集成了CVS的IDE环境:
Eclipse
Magic C++
作者: 车东 Email: chedongATbigfoot.com/chedongATchedong.com
写于:2003/05 最后更新: 07/01/2004 02:35:53 Feed Back >>
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
http://www.chedong.com/tech/ant.html
关键词:ant build.xml javac
内容摘要:
ant是一个基于JAVA的自动化脚本引擎,脚本格式为XML。除了做JAVA编译相关任务外,ANT还可以通过插件实现很多应用的调用。
ANT的基本概念:
ANT的安装:解包,设置路径
ANT的使用:最好的学习只不过是一个简单实用的例子起步……
ANT的基本概念:Java的Makefile
当一个代码项目大了以后,每次重新编译,打包,测试等都会变得非常复杂而且重复,因此c语言中有make脚本来帮助这些工作的批量完成。在Java 中应用是平台无关性的,当然不会用平台相关的make脚本来完成这些批处理任务了,ANT本身就是这样一个流程脚本引擎,用于自动化调用程序完成项目的编译,打包,测试等。除了基于JAVA是平台无关的外,脚本的格式是基于XML的,比make脚本来说还要好维护一些。
每个ant脚本(缺省叫build.xml)中设置了一系列任务(target):比如对于一个一般的项目可能需要有以下任务。
任务1:usage 打印本脚本的帮助信息(缺省)
任务2:clean < -- init 清空初始化环境
任务3:javadoc <-- build <-- init 生成JAVADOC
任务4:jar <-- build <-- init 生成JAR
任务5:all <-- jar + javadoc <-- build <-- init 完成以上所有任务:jar javadoc
而多个任务之间往往又包含了一定了依赖关系:比如把整个应用打包任务(jar)的这个依赖于编译任务(build),而编译任务又依赖于整个环境初始化任务(init)等。
注:我看到很多项目的ant脚本中的命名基本上都是一致的,比如:编译一般叫build或者compile;打包一般叫jar或war;生成文档一般命名为javadoc或javadocs;执行全部任务all。在每个任务的中,ANT会根据配置调用一些外部应用并配以相应参数执行。虽然ANT可调用的外部应用种类非常丰富,但其实最常用的就2,3个:比如javac javadoc jar等。
ANT的安装
解包后在系统可执行路径中加入指向ant的bin的路径就可以了,比如可以在GNU/Linux上把以下配置加入/etc/profile中:
export ANT_HOME=/home/ant
export JAVA_HOME=/usr/java/j2sdk1.4.1
export PATH=$PATH:$JAVA_HOME/bin:$ANT_HOME/bin
这样执行ant 后,如果不指定配置文件ant会缺省找build.xml这个配置文件,并根据配置文件执行任务,缺省的任务设置可以指向最常用的任务,比如: build,或指向打印帮助信息:usage,告诉用户有那些脚本选项可以使用。
ANT的使用
最好的学习过程就是看懂那些open source项目中的build.xml脚本,然后根据自己的需要简化成一个更简单的,ANT和APACHE上很多非常工程派的项目:简单易用,而且适应性非常强,因为这些项目的建立往往来源于开发人员日常最直接的需求。
以下是的一个WebLucene应用的例子:修改自JDOM的build.xml:
destdir="${build.dest}"
debug="${debug}"
optimize="${optimize}">
basedir="${build.dest}"
includes="**"/>
sourcepath="${build.src}"
destdir="${build.javadocs}"
author="true"
version="true"
use="true"
splitindex="true"
windowtitle="${Name} API"
doctitle="${Name}">
缺省任务:usage 打印帮助文档,告诉有那些任务选项:可用的有build, jar, javadoc和clean.
初始化环境变量:init
所有任务都基于一些基本环境变量的设置初始化完成,是后续其他任务的基础,在环境初始化过程中,有2点比较可以方便设置:
1 除了使用却缺省的property设置了JAVA源路径和输出路径外,引用了一个外部的build.properties文件中的设置,
这样大部分简单配置用户只要会看懂build.properties就可以了,毕竟XML比起key value的属性文件还是要可读性差一些。用build.properties也可以方便其他用户从编译的细节中解放出来。
2 CLASSPATH设置:使用了其中的:
则相当于设置了:CLASSPATH=/path/to/resin/lib/jsdk23.jar; /path/to/project/lib/*.jar;
文件复制:prepare-src
创建临时SRC存放目录和输出目录。
编译任务:build
编译时的CLASSPATH环境通过一下方式找到引用一个path对象
打包任务:jar
对应用打包生成项目所写名的.jar文件
basedir="${build.dest}"
includes="**"/>
生成JAVADOC文档任务: javadoc
sourcepath="${build.src}"
destdir="${build.javadocs}"
author="true"
version="true"
use="true"
splitindex="true"
windowtitle="${Name} API"
doctitle="${Name}">
清空临时编译文件:clean
TODO:
更多任务/扩展:(样例)
测试任务:JUnit测试
代码风格检查任务:CheckStyle,Jalopy等
邮件警报任务:可以把以上这些任务的输出警告发送到制定的用户列表中,这个任务可以设置每天自动运行。
参考资料:
Jakarta ANT:
http://ant.apache.org
原文出处:http://www.chedong.com/tech/ant.html
作者: 车东 Email: chedongATbigfoot.com/chedongATchedong.com
写于:2003/01 最后更新: 07/01/2004 02:36:18 Feed Back >>
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
http://www.chedong.com/tech/google.html
关键词:Google PageRank “link popularity” “website promotion” “optimization for search engine”
内容摘要:
目前中文网站在整个互联网中的影响还比较小,这主要是由于中文网站总体的水平(技术上,内容上)都还相对落后造成的,最主要的表现有:
行业知识:不知道搜索引擎对吸引的新用户的重要性,在搜索引擎排名服务中追求“傻瓜相关”,购买一些其实没有太多实际意义的行业关键词。其实能够用户输入的关键词越多,真对性越强,价值越高。用户能够直接定位到产品具体内容页比到网站首页有价值的多;
发布技术:网站的网页进入Google的索引量非常小,动态网页仍是主要发布机制,缺乏将动态页面链接表现成静态页面的机制;
页面设计:页面标题重复,关键词不突出,过渡使用JavaScript脚本/图片/Flash等不适合搜索引擎索引的非文本形式;
无法量化的东西是不可管理的,以上根本的原因往往是网站自身缺乏日志统计分析造成:
其实大部分网站只要通过一些简单的策略还是可以让网站自身的水平在互联网中有一个真实的体现,网站结构设计中面向搜索引擎的优化注意事项包括:
链接引用的重要性;
如何突出关键词:网页标题、主题的设计;
页面及站点结构设计注意事项;
以及站点访问统计的重要性等;
Google的站点设计指南
(注意:本网站设计本身就利用了其中一些方法)。
什么是PageRank
Google等新一带搜索引擎的优势之一在于不仅索引量很大,而且还将最好的结果排在搜索结果的最前面,具体的原理可以参考Google の秘密 – PageRank 徹底解説一文,PageRank简单的说类似于科技论文中的引用机制:谁的论文被引用次数多,谁就是权威。在互联网上PageRank就是基于网页中相互链接关系的分析得出的。
此外,从计算方法角度阐述PageRank机制还有这篇文章:http://pr.efactory.de/里面有更详细的PageRank算法说明和各种清晰的小型个案分析:
比如:子页中导航条的重要性
B < => A => C
Vs
B < => A < => C (好)
页面数量因素:
B < => A < => C
Vs
F < =\ /=> G
B < => A < => C (好)
D < =/ \=> E
一个意想不到的结论:
(B < => A < => C) ( E < => D < => F)
Vs
(B < => A < => C) < => ( E < => D < => F)
PageRank升高的只是被链接的2个首页A和D,而网站子页面的PageRank平均会略有下降。同时:一个网站进入Google的索引量越大其受类似因素影响越小。
PageRank不对称的页面互链:
Google会用BadRank之类的算法进行纠正,而且一个网页着有来自“与其自身不相称”的高PageRank站点的链接,而自身又缺少足够数量和质量的反相链接的话,其PageRank会自动降低为0,A(pr=7) < => B(pr=0)
简单的说就是:偶尔要被权威站点反相链接不算数,要被足够多的权威站点引用才能提高自身网页的PageRank。
Web超链分析算法综述(南京大学论文) 更多论文可以通过搜索:“filetype:pdf google pagerank anchor text bayesian”得到
链接就是一切
在互联网的海洋中,最重要的就是互联互通,不被其他网站引用的网站就是“信息孤岛”。“酒好也怕巷子深”,也许这话说起来有点像垃圾邮件广告,但事实就是这样。所以如果做网站的目的不是孤芳自赏,就需要积极的推广自己的网站。
通过搜索引擎推广自己需要注意以下几个方面:
以量取胜:不一定加入大型网站的分类目录才是网站推广,来自其他网站的任何反相链接都是有用的
网站推广比较经典的方式就是加入比较大型门户网站的分类目录,比如:Yahoo!,dmoz.org等。其实这里有一个误区:不一定非要加入大型网站的分类目录才是网站推广,因为现在搜索引擎已经不再只是网站目录的索引,而是更全面的网页索引,所以无论来自其他网站任何地方的反相链接都是非常有价值的,哪怕是出现在新闻报道,论坛,邮件列表归档中。Blogger(Weblog的简称)们也许最深刻地理解了“链接就是一切”这句话的含义,由于Blog的内容之间有大量的相互链接,因此最经常被引用的 Blog页面在搜索引擎中的排名往往比一些大型商业网站的页面还要高。而wiki这样的文档管理系统更加突出了良好引用的特征。
以质取胜:被PageRank高的网站引用能更快地提高PageRank
数量只是关键因素之一,来自PageRank高的页面的链接还能更快的提高被链接目标的PageRank,我只是将一些文章投稿在了ZDNet中国上,由于页面上有文章出处链接,相应网页和网站整体的PageRank过了一段时间后就有了很大的提升。有时候被什么样的网站引用有时候比引用次数多更重要。这里我要特别感谢的是,当时ZDNet中国是唯一遵循了我的版权声明的要求表明了文章出处,并且有反相链接的网站。
按照这个原则:能够名列Yahoo!和DMOZ这样的大型权威目录的头2层是非常有价值的。
了解搜索引擎的”价值观”:
Lucene简介这篇文章被Jakarta.apache.org的lucene项目引用以后,这篇文章就成为了所有页面中PageRank最高的页面,而Google支持的一些项目,比如:Folding@Home,让我一直怀疑他们对政府,教育和非盈利组织的站点有特别加分,毕竟.org .edu才代表了互联网的实质:分权和共享。
但更合理的解释是:.org很多都是开放技术平台的开发者,他们会在首页这样的地方加入Powered By Apache, Power by FreeBSD之类的链接表示对其他开源平台的尊重,所以象Apache, PHP, FreeBSD这样的开源站点在GOOGLE中都有非常高的PageRank。而在.edu这些站点中,很多都是学术性比较强的文档,以超链接形式标明参考文献的出处已经成为一种习惯,而这也无疑正是PageRank最好的依据。
注意:不要通过Link Farm提高自身的站点排名:Google会惩罚那些主动链接到Link Farm站点以提高自身排名站点,相应站点的页面将不会被收入到索引中。但如果你的页面被别的Link Farm链接了也不必担心,因为这种被动的链接是不会被惩罚的。
不要吝啬给其他网站的链接:如果一个网页只有大量的进入链接,而缺乏导出链接,也会被搜索引擎认为是没有价值的站点。保证你的网站能够帮助搜索引擎更准确地判断哪些是对用户最有价值的信息,也就是说如果你的网站只有外部反向链接而没有导出链接的话,也会对你的网站在搜索结果中的表现带来负面影响。当然网站中连一个导出链接都没有的情况非常罕见,除非你是刻意这么做。正常情况下大家都会自然地在网页中加上一些其他网站的链接,带领访问者去到我们认为重要或能够提供更多有价值信息的地方,
另外在推广自己网站之前也许首先需要了解自己网站目前在一些搜索引擎中的知名度,原理非常简单,可以参考如何评价网站的人气一文。
网站推广只是手段,如何突出内容、让需要相关信息的用户能够尽快的找到你的网站才是目的,PageRank高并不代表像Yahoo!这样的门户站点就能在所有搜索结果中排名靠前,因为搜索引擎的结果是搜索关键词在页面中的匹配度和页面的PageRank相结合的排名结果。因此第二个要点:如何突出关键词。
如何突出关键词:面向主题(Theme)的关键词匹配
Theme Engine正在逐步超过PR,成为结果排序中更主要的因素,可以比较一下以下现象:
为什么查“新闻”,“汽车”之类的文字,各种门户网站的首页不在第一位?要知道他们的页面中都有相应频道的链接文字的
一篇新闻页面中,搜索引擎如何不通过模板匹配,自动将新闻的主体和页面中的页头,栏目导航条,页尾等部分的内容区分开的?
其实以上问题都可以归结为网页内容摘要的提取策略和关键词在其中的命中:
首先将能够描述一个页面内容的分成以下几种类型:
链入文字描述:inbound link text
http://www.searchenginedictionary.com/terms-inbound-link.shtml
HTML页面标题:title 好标题一般会将页面中最重要的关键词放在最前面,比如:ABC-10型吸尘器 – XX家电城
HTML内容主体:content text
链出文字:outbound link text
如果按照以下规则:
一个页面中关键词命中权重:链入文字 > HTML标题文字 > HTML页面主体内容 >> 出链文字,以上现象就比较好解释了。
链入文字是页面上看不见的,但链入文字对被链接页面有巨大的作用:在现代搜索引擎在关键词匹配的过程中,匹配的过程不只看当前页面的内容摘要:很大程度上,不只看这个网页自己说自己有什么内容,还要看别人如何链接时,如何描述你的网站别人怎么称呼你,比你自己说自己更重要。。
比如查:“世界卫生组织”,返回结果中有 http://www.who.int/ 而这个页面中是没有中文的,之所以能匹配上,是因为很多链接它的中文网站使用了:世界卫生组织,所以,这个页面中不存在的中文关键词也成为了页面摘要的一部分。这样一想,就可以知道链出链接的文字其实是为被链接的子频道首页或者内容详情页服务的。对自身页面的关键词密度只有负面的影响,这也是Google建议一个页面中链接不要超过100个的原因:他根本不索引100个链接以后的内容。按照以上规则,搜索引擎将一篇新闻详情页中的新闻内容提取出来就是把页面上所有带HTTP链接的文字都去掉,就是新闻的内容部分了,更精确一些可以通过取最长文本段落等策略实现;而很多网站首页或频道首页中几乎全部都是链接,经过搜索引擎分析的结果就是:什么内容也没有,能够被命中的关键词仅仅是别人链接你用的“网站首页”和频道标题Title中的站点名称等的几个关键词,而页面中其他的文字则远远不如相应子频道和具体内容页面的匹配度高,而搜索引擎能够通过以上规则,让用户更快的直接定位到有具体内容的内容详情页面。因此希望通过一个首页,尽可能多的命中所有希望推广的关键词是不可能的。让网页尽可能多的进入搜索引擎的索引,然后把握好整个网站的主题风格是非常重要的,让网站的主题关键词能够比较均匀的按照金字塔模式分布到网站中可以参考:网站的主题金字塔设计 网站名称(用户通过1-2个抽象关键词)
/ \
子频道1 子频道2 (用户通过2-3个关键词命中)
/ \ / \
产品1 产品2 文章1 文章2 (用户通过3-4个关键词命中:这种用户最有价值)
不要空着标题:空着
无异于浪费了最有价值的一块阵地;
传统的页面中,HTML页面中会有类似以下的隐含信息,用于说明当前网页的主要内容关键字:
后来由于这种人工添加关键词的方式被滥用,大量网页中为了提高被搜索引擎命中的概率,经常添加一些和实际网页内容无关的热门关键比如:“music mp3 download”等,所以新一代的搜索引擎已经不再关心页面头文件中的人工meta keyword声明,而页面标题在搜索引擎的关键词的命中命中过程中往往有着更高的比重,如果一个关键词在标题中命中会比在页面中命中有更高的得分,从而在相应的搜索结果排名中更靠前。
标题长度和内容:不要过长,一般在40个字符以内,并充分突出关键词的比重;
如果更长的标题搜索引擎一般会忽略掉,所以要尽可能将主要关键词放在标题靠前的位置。省略掉不必要的形容词吧,毕竟用户主要通过名词来找到需要的内容。标题内容:尽量用一些别人可以通过关键词找到的字眼(也别太过头,如果标题中的字眼超过1半内容中都没有,有可能被搜索引擎排除出索引),因此基于web日志中来自其他搜索引擎的关键词查询统计非常必要。
如果网页很多的话,尽量使用不同的网页标题,争取让自己网站的内容更多的进入搜索引擎索引范围;
因为搜索引擎会根据页面内容的相似度把一些内容当成重复页面排除出索引范围;
http://www.chedong.com/phpMan.php是我的网站上的一个小应用:一个web界面的unix命令手册(man page),在以前的设计中所有动态页面使用的都是同样的标题:”phpMan: man page /perldoc /info page web interface” ,Google索引了大约3000多个页面,后来我将页面标题改成了”phpMan: [命令名]“这样的格式,比如:”phpMan: ls”,这样大部分动态页面的标题就都不一样了,一个月后Google从这个页面入口索引了大约6000个页面。因此,如果网站中很多网页都使用相同的标题,比如:“新闻频道”,“论坛”,这些页面中很大一部分就会被排重机制忽略掉。
除了
外,还可以用
标题行突出内容主题,加强标题的效果;
在我的网站设计中:我会把用
[标题]
这样的模板把标题突出显示,而不是通过改变字体的方式突出标题。
其他网站设计提示
静态链接:Blog网站另外一个优势在于其网页是静态链接:动态网页占到整个互联网内容的90%以上。各个搜索引擎其实能够表现的都只不过是互联网的冰山一角(3-5%),不同的只是谁让优质网页排名靠前的策略更优秀而已:大部分搜索引擎都认为静态链接的网页是优质网页,Google在优先抓取索引的网页中70%以上是不带参数链接的静态网页。而且即使同样的内容,静态网页也会比动态网页权重高:很容易理解:query?a=1&b=2这样的链接由于参数顺序颠倒的query?b=2&a=1完全相同。尽量使用静态网页:目前能够动态网页进行全面的索引还比较难,而即使是Google也更不会索引所有的内容,因此很少会对参数超过2个的动态网页进行进一步的抓取和分析。以下是一个phpBB论坛页面返回的HTTP头信息:
HTTP/1.1 200 OK
Date: Wed, 28 Jan 2004 12:58:54 GMT
Server: Apache/1.3.29 (Unix) mod_gzip/1.3.26.1a PHP/4.3.4
X-Powered-By: PHP/4.3.4
Set-Cookie: phpBB_data=a%3A0%3A%7B%7D; expires=Thu, 27-Jan-2005 12:58:54 GMT; path=/;
Set-Cookie: phpBB_sid=09f67a83ee108ecbf11e35bb6f36fcec; path=/;
Content-Encoding: gzip
Cache-Control: private, pre-check=0, post-check=0, max-age=0
Expires: 0
Pragma: no-cache
Connection: close
Content-Type: text/html
为了避免隐私问题:Googlebot可以通过对页面http header中的session id和session cookie进行一些甄别,这样很多需要认证信息的论坛内容就无法进入索引了。
总体上说Google喜欢新的,静态的内容。因此无论从效率上讲还是方便搜索引擎收录:使用内容发布系统将网站内容发布成静态网页都是非常必要的,从某种程度上说google friendly = anonymous cache friendly。
比如:http://www.chedong.com/phpMan.php/man/intro/3
比http://www.chedong.com/phpMan.php?mode=man¶meter=intro§ion=3这样的链接更容易进入搜索引擎的索引。而且在URL中的命中也能突出关键词。
能够进入Google索引的页面数量越多越好。用类似以下的脚本可以统计自己的网站被搜索引擎索引的情况。
#!/bin/sh
YESTERDAY=`date -d yesterday +%Y%m%d`
# for FreeBSD: YESTERDAY=`date -v-1d +%Y%m%d`
LOG_FILE=’/home/apache/logs/access_log’
grep -i Googlebot $LOG_FILE.$YESTERDAY|awk ‘{print $7}’ |sort | uniq -c | sort -rn > spider/$YESTERDAY.googlebot.txt
grep -i baiduspider $LOG_FILE.$YESTERDAY|awk ‘{print $7}’ |sort | uniq -c | sort -rn > spider/$YESTERDAY.baiduspider.txt
grep -i msnbot $LOG_FILE.$YESTERDAY|awk ‘{print $7}’ |sort | uniq -c | sort -rn > spider/$YESTERDAY.msnbot.txt
grep -i inktomi $LOG_FILE.$YESTERDAY|awk ‘{print $7}’ |sort | uniq -c | sort -rn > spider/$YESTERDAY.inktomi.txt
grep -i openbot $LOG_FILE.$YESTERDAY|awk ‘{print $7}’ |sort |uniq -c | sort -rn > spider/$YESTERDAY.openbot.txt
网站目录结构要扁平,因为每深一级目录,PAGERANK降低1-2个档次。假设首页是3,其子可能目录就是1了,更深可能就无法列入评级范围了。
表现和内容的分离:“绿色”网页
网页中的javascript和css尽可能和网页分离,一方面提高代码重用度(也方便页面缓存),另外一方面,由于有效内容占网页长度的百分比高,也能提高相关关键词在页面中的比重也增加了。总之,应该鼓励遵循w3c的规范,使用更规范的XHTML和XML作为显示格式便于内容更长时间的保存。
让所有的页面都有能够快速入口:站点地图,方便网页爬虫(spider)快速遍历网站所有需要发布的内容。如果首页就是用Flash或图片进入的话,无异于将搜索引擎拒之门外,除了UI设计的用户友好外,spider friendly也是非常重要的。
保持网站自身的健康:经常利用坏链检查工具检查网站中是否有死链。
保持网页内容/链接的稳定性和持久性:在搜索引擎索引中网页存在的历史也是一个比较重要的因素,而且历史比较久的网页被链接的几率越高。为了保证自己网页能够被比较持久的被其他网站的页面引用,如果自己网页中有链接更新时,最好能保留旧的页面并做好链接转向,以保持内容的连续性。要知道,把一个网站和内容在搜索引擎中的排名“培养”的很高是一件非常不容易的事情,谁都不希望好不容易自己的内容被别人找到了,点击却是“404 页面不存在”吧,因此站点管理员对自身站点error.log的分析也是非常必要的。
文件类型因素:Google有对PDF, Word(Power Point, Excel), PS文档的索引能力,由于这种文档的内容比一般的HTML经过了更多的整理,学术价值一般比较高,所以这些类型的文档天生就比一般的HTML类型的文档 PageRank要高。因此,对于比较重要的文档:技术白皮书,FAQ,安装文档等建议使用PDF PS等高级格式存取,这样在搜索结果中也能获得比较靠前的位置。
常常能发现门户站点的一条新闻往往比其他站点的首页排名还要靠前。因此一个站点总体PageRank提高了以后,往往自身一些并不重要的内容也会被同那些高PageRank的内容一起带入被搜索引擎优先查询的列表中。这样经常造成很多大的开发站点的邮件列表归档往往比其他站点的首页PageRank还要高。
知己知彼——站点访问统计/日志分析挖掘的重要性
网站设计不仅仅只是被动的迎合搜索引擎的索引,更重要是充分利用搜索引擎带来的流量进行更深层次的用户行为分析。目前,来自搜索引擎关键词统计几乎是各种WEB日志分析工具的标准功能,相信商业日志统计工具在这方面应该会有更强化的实现。WEB日志统计这个功能如此重要,以至于新的RedHat 8中已经将日志分析工具webalizer作为标准的服务器配置应用之一。
以Apache/webalizer为例,具体的做法如下:
记录访问来源:
在Apache配置文件中设置日志格式为combined格式,这样的日志中会包含扩展信息:其中有一个字段就是相应访问的转向来源: HTTP_REFERER,如果用户是从某个搜索引擎的搜索结果中找到了你的网页并点击过来,日志中记录的HTTP_REFERER就是用户在搜索引擎结果页面的URL,这个URL中包含了用户查询的关键词。
在webalizer中缺省配置针对搜索引擎的统计:如何提取HTTP_REFERER中的关键词
webalizer中缺省有针对yahoo, google等国际流行搜索引擎的查询格式:这里我增加了针对国内门户站点的搜索引擎参数设置
SearchEngine yahoo.com p=
SearchEngine altavista.com q=
SearchEngine google.com q=
SearchEngine sina.com.cn word=
SearchEngine baidu.com word=
SearchEngine sohu.com word=
SearchEngine 163.com q=
通过这样设置webalizer统计时就会将HTTP_REFERER中来自搜索引擎的URL中的keyword提取出来,比如:所有来自 google.com链接中,参数q的值都将被作为关键词统计下来:,从汇总统计结果中,就可以发现用户是根据什么关键词找到你的次数,以及找到你的用户最感兴趣的是那些关键词等,进一步的,在webalizer中有设置还可以将统计结果倒出成CSV格式的日志,便于以后导入数据库进行历史统计,做更深层次的数据挖掘等。
以前通过WEB日志的用户分析主要是简单的基于日志中的访问时间/IP地址来源等,很明显,基于搜索引擎关键词的统计能得到的分析结果更丰富、更直观。因此,搜索引擎服务的潜在商业价值几乎是不言而喻的,也许这也是Yahoo! Altavista等传统搜索引擎网站在门户模式后重新开始重视搜索引擎市场的原因,看看Google的年度关键词统计就知道了,在互联网上有谁比搜索引擎更了解用户对什么更感兴趣呢?
请看本站的反相链接统计:http://www.chedong.com/log/2003_6.log
需要注意的是:由于Google针对Windows 2000中的IE使用的是UTF-8方式的编码,因此很多统计有时候需要在UTF-8方式下查看才是正确字符显示。从统计中能够感受到:在使用水平比较高的IT开发人员中Google已经成为最常用的搜索引擎。而使用百度的用户也已经大大超过了传统的搜狐,新浪等门户站点,因此传统门户网站在搜索引擎上的优势将是非常脆弱的。而从技术的发展趋势来看,以后还会有更多的利用互联网媒体做更深层次数据挖掘的服务模式出现:
转载自cnblog.org——“突发”文字可能揭示社会趋势
在“新科学家”(New Scientist)在线杂志上,公布了康奈尔大学的一个新研究成果,引人注目,也许与Google 收购Pyra 的动机有关。
这所大学的计算机科学家 Jon Klenberg 开发了一个计算机算法,能够识别一篇文章中某些文字的“突发”增长,而且他发现,这些“突发”增长的文字可以用来快速识别最新的趋势和热点问题,因此能够更有效地筛选重要信息。过去很多搜索技术都采用了简单计算文字/词组出现频率的方法,却忽略了文字使用增加的速率。
Jon 特别指出,这种方法可以应用到大量Weblog上,以跟踪社会趋势,这对商业应用也很有潜力。例如,广告商可以从成千上万的个人Blog 中快速找到潜在的需求风尚。而且只要Blog 覆盖话题范围足够大(实际上发展趋势确实如此),这项技术对政治、社会、文化和经济等领域也都会有实际意义了。
虽然Google 新闻的内部算法至今没有公开,但是人们猜测这种完全由机器所搜集的头条新闻应当不是Google搜索引擎中惯用的鸽子算法,很可能与这种“突发”判断算法有关。如此说来,Google收购Blog工具供应商的举动确实还有更深层次的远见了。
- NewScientist.com news, Word ‘bursts’ may reveal online trends
- 还没有写完这些介绍,在 SlashDot 上也看到了很多有关这个发现的讨论
附:Google官方的站点设计指南
Make a site with a clear hierarchy and text links. Every page should be reachable from at least one static text link. 让网站有着清晰的结构和文本链接,所有的页面至少要有一个静态文本链接入口
批注:尽量不要用图片和JAVASCRIPT
Offer a site map to your users with links that point to the important parts of your site. If the site map is larger than 100 or so links, you may want to break the site map into separate pages.
为用户提供一个站点地图:转向网站的重要部分。如果站点地图页面超过100个链接,则需要将页面分成多个页面。
批注:索引页不要超过100个链接:SPIDER只考虑页面中头100个链接
Create a useful, information-rich site and write pages that clearly and accurately describe your content.
用一些有用的,信息量丰富的站点,清晰并正确的描述你的信息。
Think about the words users would type to find your pages, and make sure that your site actually includes those words within it.
想像用户可能用来找到你的关键词,并保证这些关键词在网站中出现。
批注:少用“最大”,“最好”之类的形容词,用用户最关心的词,比如:下载,歌星名字,而不是一些抽象名词。
Try to use text instead of images to display important names, content, or links. The Google crawler doesn’t recognize text contained in images.
尽可能使用文本,而不是图片显示重要的名称,内容和链接。GOOGLE的机器人不认识图片中的文字。
Make sure that your TITLE and ALT tags are descriptive and accurate.
保证:页面的TITLE和ALT标记正确的精确描述
Check for broken links and correct HTML.
检查坏链并修正这些HTML错误。
If you decide to use dynamic pages (i.e., the URL contains a ‘?’ character), be aware that not every search engine spider crawls dynamic pages as well as static pages. It helps to keep the parameters short and the number of them small.
如果你打算使用动态页面:链接中包含”?”,必须了解:并非所有的搜索引擎的机器人能想对待静态页面一样对待动态页面,保持动态页面的参数尽可能的少也会很有帮助。
Keep the links on a given page to a reasonable number (fewer than 100).
让一个页面中的链接少于100个。
批注:用lynx -dump http://www.chedong.com 可以模拟从robot角度看到的页面。其最后有链接统计
输出类似:
[1]Google Free Search _______________________________ Google Search
(_) Search WWW (_) Search chedong.com
更 新 [2]站点地图 / Site Map [3]留 言簿 / Guest Book [4]意见反馈 /
Feed Back
…
References
Visible links
1. http://www.google.com/services/free.html
2. http://www.chedong.com/sitemap.html#sitemap
3. http://www.chedong.com/guestbook/
4. http://www.chedong.com/formmail.htm
…
Hidden links:
50. http://www.chedong.com/bbcweb/
…
搜索引擎的宗旨在于提取互联网中质量最好的内容提供给用户,任何有利于帮助用户获得相对公正,优质内容的策略都是搜索引擎追求目标。PageRank是一个非常好的策略,但是并非所有策略都是基于非常复杂的算法。
从搜索引擎看来什么是互联网中“好”的内容呢?
首先:互联网大约是8G个网页,而且以每天2M的速度增长的。其中80%以上是动态网页,而占总量20%的静态网页就是一个相对比较简单的过滤规则。
其次:用户友好(User friendly)也是很重要的方面,搜索引擎利用算法帮助提升这些优质网站,包括:通过CSS将内容和表现分离:较少的javascript和frame结构,spider本身也很难深入抓取这些网页:Javascript和frame结构大部分是广告。
标题明确:无标题,重复标题或者标题SPAM(类似于:游戏游戏游戏游戏游戏游戏这样的标题)进行过滤或降低得分页面大小:因为页面过大会导致用户下载缓慢,所以很多引擎只计算页面大小在100k以内的网页。
链接引用:不仅需要有链接链入,也需要帮助用户找到其他更有价值的内容;
文件类型:PDF和DOC等专业文档和来自edu,gov等非赢利网站的内容;
链入网站的文字:所有用户不可见的因素全部被忽略。此外:用户搜索的行为本身也被Google记录,可能对目标网站的主题相关度有帮助。
参考资料:
面向Google搜索引擎的网站设计优化
http://www.google-search-engine-optimization.com/
关于Google排名优化的7个误区,如:”Meta tag”, “泛域名”,首页等
如何评价一个网站的人气
http://www.chedong.com/tech/link_pop_check.html
如何提高网站在Google中的排名——面向搜索引擎的广告模式
http://www.chedong.com/tech/google_ads.html
如何提高网站在Google中的排名——面向搜索引擎的网站链接设计
http://www.chedong.com/tech/google_url.html
Google不断改进相应的算法:HillTop
Hilltop: A Search Engine based on Expert Documents
Google の秘密 – PageRank 徹底解説
http://www.kusastro.kyoto-u.ac.jp/~baba/wais/pagerank.html
这篇文章是在查”Google PageRank”的时候查到的,这篇文章不仅有一个算法说明,也是一个Google的weblog,记录了很多关于Google的新闻和一些市场动态信息。
Google 的秘密- PageRank 彻底解说 中文版
更详细的PageRank算法说明:
http://pr.efactory.de/
WEB日志统计工具AWStats的使用:增加了Unicode的解码和中国主要门户搜索的定义
http://www.chedong.com/tech/awstats.html
Robots的说明:
http://bar.baidu.com/robots/
http://www.google.com/bot.html
搜索引擎通过一种程序robot(又称spider),自动访问互联网上的网页并获取网页信息。您可以在您的网站中创建一个纯文本文件 robots.txt,在这个文件中声明该网站中哪些内容可以被robot访问,哪些不可以。
反Google站点:观点也很有趣
http://www.google-watch.org/
关于Google的WebLog
http://google.blogspace.com/
关于Google的HillTop算法
搜索引擎相关论坛
http://searchengineforums.com/
http://searchenginewatch.com
http://www.webmasterworld.com/
原文出处:http://www.chedong.com/tech/google.html