Archive for the ‘Unix&Linux’ Category
UNIX系统操作命令
UNIX系统操作命令
中国科学院理论物理研究所 潘雷
第一章 登录和退出
用户在登录前,首先要向系统管理员申请一个用户注册名,不论用户从哪台计算机登录到ITPNET上都将访问相同的文件系统。
1.1 登录
当屏幕上出现Login提示符时,用户可以输入自己的用户注册名,并按回车键。
若有口令,系统将提示用户输入密码,并按回车键,口令输入正确后,用户登录成功。这时,屏幕上会显示出一些信息和命令提示符。如:
Login: guest [Enter]
passwd: ****** [Enter]
sun%
注: 用户名要用小写字母输入,UNIX系统区分大小写字母。
1.2 退出
当用户准备退出自己的计算机帐号时,可在系统示符下输入logout或exit或按[Ctrl-D]。当屏幕出现Login时,用户可以安全地离开计算机了。如:
sun% logout [Enter]
Login:
1.3 修改口令
为了防止他人使用自己的帐号,在你首次登录后,请用passwd命令修改只有本人知道的保密口令,口令通常由此可6到8个字母数字组成。如:
sun% passwd [Enter]
Old Passwd: ******
New Passwd: ******
Retype New Passwd: ******
注:当你退出系统再次登录时,就要使用新的口令。
第二章 目录操作命令
2.1 显示目录
命令:pwd(print working directory)
格式:pwd
功能:显示出用户当前工作目录的全路径名。
例如:% pwd
2.2 建立目录
命令:mkdir(make directory)
格式:mkdir directory_name
功能:建立新目录
例如:% mkdir directory
2.3 改变目录
命令:cd(change directory)
格式:cd directory_name
功能:改变当前工作目录
注释:目录名选项有:
(1) 目录名,转到当前目录下的子目录。
(2) .. 表示转到当前目录的父目录。
(3) / 表示转到根目录。
(4) 没有选项时,转到用户的主目录。
例如:% cd directory
2.4 删除目录
命令:rmdir (remove directory)
格式:rmdir directory_name
功能:删除不存在文件的子目录名。
注释:
(1) 删除子目录时,要求被删除的目录中不存在文件或子目录,否则无法删除。
(2) 若被删除的目录中有文件或子目录,请参考命令rm -r directory_name。
例如:% rmdir directory
第三章 文件操作命令
3.1 列出文件目录
命令:ls (list)
格式:ls [option] directory_name
功能:列出指定目录中的文件名和子目录名。当无子目录名时,列出当前目录中的文件名和子目录名。
选项:-a列出所有文件,包括以点开头的隐含文件。
-l按长格式列出文件名,包括文件类型标识,权限,链接数,文件主名,文件组名,字节数,日期。
-r列出包括子目录下所有文件
-g在长格式中给出用户组的标识。
-t安文件生成日期排序。
例如:% ls -la
3.2 显示文件内容
命令:cat (catenae)
格式:cat filename
功能:显示出文件的内容。
注释:当文件内容在屏幕上滚动显示时,可按Ctrl+S键屏幕滚暂停,按Ctrl+Q
键继续显示。
例如:% cat filename
3.3 按屏幕显示文件内容
命令:more
格式:more filename
功能:按屏幕一屏一屏显示出文件内容
选项:
注释:在屏幕显示过程中有功能键。空格键 继续下一屏的输出;回车键 看下一行的输出;q键 跳出more状态;/字符串 查旬字符串所在处;a键 返
回到上一屏。
例如:% more filename
3.4 分页显示文件内容
命令:pg (page)
格式:pg [option] filename
功能:分页显示指定文件的内容。在显示一页文件时,最后一行将显示等待用户输入指令。可输入的指令有如下选项。
选项:h 显示pg命令中可使用的帮助(help)命令。
q 退出pg命令。
[return] 显示下一页正文。
1 显示正文的下一行
[Space] 显示下一页
d/[Ctrl-D] 将屏幕滚动半屏。
n 显示pg命令行中说明的下一个文件。
p 显示pg命令行中说明的前一个文件。
% 显示正文当前页的前面一页。
/pattern 在文件中向前搜索指定的字符模式。
?pattern 在文件中向后搜索指定的字符模式。
注释:当pg命令显示到文件的末尾时,显示一个文件结束信息EOF(end of file)。
例如:% pg filename
3.5 读文件
命令:view
格式:view filename
功能:只能读出文件内容。
注释:此命令不能对读出的原文件进行写操作。若对原文件进行了修改,可利用命令“:w newfilename”将修改后的文件写到新文件中。
例如:% view filename
3.6 显示文件头部
命令:head
格式:head [option] filename
功能:显示文件的头部
选项:缺省 显示文件的头10行。
-i 显示文件的开始 i行。
例如:% head filename
3.7 显示文件尾部
命令:tail
格式:tail [option] filename
功能:显示文件的尾部
选项:缺省 显示文件的末10行。
-i 显示文件最后 i行。
+i 从文件的第i行开始显示。
例如:% tail filename
3.8 显示格式化的文件内容
命令:pr (print)
格式:pr filename
功能:在屏幕上显示格式化的文件内容,即印出每页66行的文本文件,包括5行页头和5行页尾。页头包括两行空行,一行含有文件的时间、文件名和页号,另外两行为空行。页尾为5行空行。
例如:% pr filename
3.9 拷贝文件
命令:cp (copy)
格式:cp [option] filename1 filename2
cp [option] filename… directory
cp -r directory1 directon2
功能:把一个文件的全部内容拷贝到另一个文件,也可将一个或多个文件拷贝到另一个目录中。
选项:-i 按提示进行拷贝文件。
-p 按原文件日期进行拷贝。
-r 对子目录下所有文件进行拷贝。
注释:当filename1拷贝到filename2时,若filename2已经存在,则filename2的内容将被filename1覆盖。
例如:% cp filename1 filename2
3.10移动文件或文件改名
命令:mv (move)
格式:mv filename1 filename2
mv filename… direction
mv direction1 direction2
功能:改变文件或目录的名子,或把一些文件移到另一目录下。
注释:当filename1更名为filename2时,若filename2已经存在,则filename2的内容将被filename1覆盖
例如:% mv filename1 filename2
3.11删除文件
命令:rm (remove)
格式:rm filename
rm -r direction
功能:删除指定的文件或一个目录中的文件。
注释:用-r选项时,将删除指定目录的所用文件,包括目录名。
例如:% rm filename
3.12链接文件
命令:ln (link)
格式:ln [option] filename linkname
ln [option] directory pathname
功能:为文件或目录建立一个链。其中,filename和directory是源文件名和源目录名;linkname和pathname分别表示与源文件或源目录名相链接的文件或目录。
选项:-s 为文件或目录建立符号链接。
注释:链接的目地在于,对一个文件或目录赋予两个以上的名字,使其可以出现在不同的目录中,既可以使文件或目录共享,又可以节省磁盘空间。
例如:% ln -s filename linkname
3.13改变文件读取权限
命令:chmod (change mode)
格式:chmod {u|g|o|a}{+|-|=}{r|w|x} filename
chmod [who][op][mode] directory
功能:改变文件的读写和执行权限。有符号法和八进制数字法。
选项:(1)符号法:
u (user) 表示用户本人。
g (group) 表示同组用户。
o (oher) 表示其他用户。
a (all) 表示所有用户。
+ 用于给予指定用户的许可权限。
- 用于取消指定用户的许可权限。
= 将所许可的权限赋给文件。
r (read) 读许可,表示可以拷贝该文件或目录的内容。
w (write) 写许可,表示可以修改该文件或目录的内容。
x (execute)执行许可,表示可以执行该文件或进入目录。
(2)八进制数字法:
此方法用三位八进制数作任选项,每位数字分别表示用户本人、同组用
户、其他用户的权限,其中:
4 (100) 表示可读。
2 (010) 表示可写。
1 (001) 表示可执行。
注释:
例如:% chmod a+rx filename
让所有用户可以读和执行文件filename。
% chmod go-rx filename
取消同组和其他用户的读和执行文件filename的权限。
% chmod 741 filename
让本人可读写执行、同组用户可读、其他用户可执行文件filename。
3.14改变文件所有权
命令:chown (change owner)
格式:chown username filename
chown -R username directory
功能:改变文件或目录的所有权。
选项:-R 将改变目录中所有文件及目录的拥有者。
注释:只有文件的主人和超级用户才能改变文件的所有权。
例如:% chown username filename
3.15寻找文件
命令:find
格式:find pathname [option] expression
功能:在所给的路经名下寻找符合表达式相匹配的文件。
选项:-name 表示文件名
-user 用户名,选取该用户所属的文件
-group 组名,选取该用户组属的文件
-mtime n 选取n天内被修改的文件
-newer fn 选取比文件名为fn更晚修改的文件
注释:
例如:% find . -name ‘*abc*’ -print
3.16搜索文件中匹配符
命令:grep
格式:grep [option] pattern filenames
功能:逐行搜索所指定的文件或标准输入,并显示匹配模式的每一行。
选项:-v 找出模式失配的行
-c 统计匹配行的数量
-n 显示匹配模式的每一行
注释:
例如:% ps -aux | grep R
3.17比较文件不同
命令:diff (difference)
格式:diff filename1 filename2
功能:显示两文件的不同之处。
选项:
注释:
例如:% diff file1 file2
3.18比较文件
命令:cmp (compare)
格式:cmp [-l] [-s] filename1 filename2
功能:显示比较两文件不同处的信息
选项:-l 给出两文件不同的字节数
-s 不显示两文件的不同处,给出比较结果
注释:
例如:% cmp file1 file2
3.19比较文件共同处
命令:comm (common)
格式:comm [-123] filename1 filename2
功能:选择或拒绝比较两文件出现的共同行
选项:-1 不显示第1列
-2 不显示第2列
-3 不显示第3列
注释:输出三列,第一列表示在file1中出现的行,第二列表示在file2中出现的行,第三列表示在file1和file2中共同出现的行。
例如:% comm file1 file2
3.20排序文件
命令:sort
格式:sort [option] filename
功能:将制定的文件按要求排序
选项:-r 按字母倒排序
-n 按数字的值从笑到大排序
-r 按当前排序规则逆序排序
-f 不区分大小写排序
-d 按典型顺序排序
注释:选项缺省时按ascii码顺序排序
例如:% sort -nr file
3.21压缩文件
命令:compress
格式:compress [option] filename
功能:压缩文件。
选项:-f 强制压缩
-v 压缩时显示压缩百分比
注释:
例如:% comproess files
3.22解缩文件
命令:uncompress
zcat
格式:compress [option] filename
zcat filename
功能:展开或显示压缩文件。
选项:-c 不改变文件写到标准输出
注释:zcat命令相当于uncompress -c
例如:% uncomproess files.Z
3.23显示文件类型
命令:file
格式:file filename …
功能:按文件内容来推测文件类型,如text,ascii,C,executable,core。
选项:
注释:
例如:% file *
3.24建立档案文件
命令:tar (tape archive)
格式:tar [option] tarfile filename
功能:建立文件的存档或读存档文件。
选项:-c 建立一个新的档案文件
-x 从档案文件中读取文件
-v 显示处理文件的信息
-f 指定档案文件名,缺省时为磁带机即/dev/rmt/0
-t 列出存档文件的信息
注释:
例如:% tar cvf tarfile .
% tar xvf tarfile
% tar tvf tarfile
3.25磁带拷贝文件
命令:dd
格式:dd [option=value]
功能:用磁带机转换或拷贝文件。
选项:if=name 指定输入文件名
of=name 指定输出文件名
ibs=n 指定输入文件块大小为n字节(缺省为512字节)
obs=n 指定输出文件块大小为n字节(缺省为512字节)
注释:
例如:% dd if=filename of=/dev/rmt/0
% dd if=/dev/rmt/0 of=filename ibs=1024
3.26修改文件日期
命令:touch
格式:touch filenae
功能:改变文件的日期,不对文件的内容做改动,若文件不存在则建立新文件。
选项:
注释:
例如:% touch file
3.27统计文件字数
命令:wc (word characters)
格式:wc [option] filename
功能:统计文件中的文件行数、字数和字符数。
选项:-l 统计文件的行数
-w 统计文件的字数
-c 统计文件的字符数
注释:若缺省文件名则指标准输入
例如:% wc file
3.28检查拼写
命令:spell (spelling)
格式:spell [option] filename …
功能:检查文件中的拼写错误
选项:-b 按英国拼法检查
-v 显示字面上不在拼法字典上的词
-x 显示每一个可能合理的词根
注释:
例如:% spell file
第四章 有关状态信息命令
4.1显示当前注册的用户
命令:w
格式:w [option] [username]
功能:显示当前正在使用系统的用户名、注册时间和当前执行的命令。
选项:-h 不显示起始行
-s 按短格式显示
-l 按长格式显示(缺省设置)
注释:
例如:% w
4.2 显示都谁登录到机器上
命令:who
格式:who
功能:显示当前正在系统中的所有用户名字,使用终端设备号,注册时间。
例如:% who
4.3 显示当前终端上的用户名
命令:whoami
格式:whoami
功能:显示出当前终端上使用的用户。
例如:% whoami
4.4 确定命令位置
命令:whereis
格式:whereis command
功能:确定一个命令的二进制行码、源码及联机手册所在的位置。
选项:
注释:
例如:% whereis ls
4.5 查找非标准命令
命令:which
格式:which command
功能:查找非标准命令,即使用别名或系统中标准命令集之外的命令。
选项:
注释:
例如:% which ls
4.6 显示日期
命令:date
格式:date
功能:显示或设置日期和时间。
选项:
注释:只有超级用户有权设置日期。
例如:% date
4.7 显示日历
命令:cal (calendar)
格式:cal [month] year
功能:显示某年内指定的日历
选项:
注释:
例如:% cal 1998
4.8 计算命令执行时间
命令:time
格式:time [command]
功能:计算程序或命令在执行其间所用的时间。
选项:
注释:计算出的时间为:real是命令在系统驻留的总时间,user是命令消耗CPU的时间,sys是命令I/O所开销的时间。
例如:% time myprog
4.9 查询帐目
命令:acseek (account seek)
格式:acseek [-d n] [-m usersname]
功能:查询本月的用户帐目。
选项:-d n
-m username
注释:若没有选项,则显示本人当月的帐单。
例如:% acseek
4.10显示用户标识
命令:id
格式:id [option] [user]
功能:显示用户标识及用户所属的所有组。
选项:-a 显示用户名、用户标识及用户所属的所有组
注释:
例如:% id username
4.11显示主机标识
命令:hostid
格式:hostid
功能:显示主机的唯一标识,是被用来限时软件的使用权限,不可改变。
选项:
注释:
例如:% hostid
4.12显示主机名
命令:hostname
格式:hostname
功能:显示或设置主机名。
选项:
注释:只有超级用户才能设置主机名。
例如:% hostname
4.13显示进程
命令:ps
格式:ps [option]
功能:显示系统中进程的信息。包括进程ID、控制进程终端、执行时间和命令。
选项:-a 列出当前系统中所有进程的信息
-l 显示一个长列表
-e 显示当前运行的每一个进程信息
-f 显示一个完整的列表
注释:
例如:% ps -ef
4.14显示磁盘空间
命令:df (disk free)
格式:df [option]
功能:显示磁盘空间的使用情况,包括文件系统安装的目录名、块设备名、总字节数、已用字节数、剩余字节数占用百分比。
选项:-i 显示已用和未用的字节数
-k 显示磁盘空间的使用信息
注释:
例如:% df -k
4.15显示文件盘空间
命令:du (disk usage)
格式:du [option] [filename]
功能:显示目录或文件所占磁盘空间大小
选项:-a 显示所有文件的大小
-s 显示制定目录所占磁盘大小
注释:
例如:% du
4.16显示盘空间限制
命令:quota
格式:quota -v [username]
功能:显示用户的磁盘空间限制和使用情况。包扩盘空间的限额和已使用数,允许建立的节点数限额和使用节点数。
选项:-v 查看用户在系统中的盘空间
注释:只有超级用户可以显示任何用户的使用情况,用edquota命令可修改。
例如:% quota -v
4.17显示终端选项
命令:stty
格式:stty [option]
功能:显示或设置终端的任选项。
选项:-a 显示所有设置情况
-g 显示当前设置
注释:
例如:% stty -a
4.18显示终端名
命令:tty
格式:tty
功能:显示终端名
选项:
注释:
例如:% tty
4.19回忆命令
命令:history
格式:history
功能:帮助用户回忆执行过的命令。
选项:
注释:
例如:% history
4.20联机帮助手册
命令:man (manual)
格式:man command_name
功能:显示参考手册,提供联机帮助信息。
选项:
注释:-k 按制定关键字查询有关命令
例如:% man tar
4.21建立别名
命令:alias
格式:alias newname name
功能:用户可以将常用的命令用自己习惯的名称来重新命名。
选项:
注释:
例如:% alias dir ‘ls -F’
第五章 网络命令
5.1显示网络地址
命令:arp
格式:arp hostname
功能:显示系统当前访问的远程住机名、IP地址和硬件地址。
选项:-a
注释:
例如:% arp -a
5.2 显示用户信息
命令:finger
格式:finger username
功能:显示网上用户使用机器的情况,包括用户何时登录和最后一次注册记录。
选项:
注释:
例如:% finger username
5.3 网上对话
命令:talk
格式:talk username
功能:在网上与另一用户进行对话。
选项:
注释:对话时系统把终端分为上下两部分,上半部显示自己键入信息,下半部显示对方用户键入的信息。键入delete或Ctrl+C则结束对话。
例如:% talk username
5.4 允许或拒绝接受信息
命令:mesg (message)
格式:mesg [n/y]
功能:允许或拒绝其它用户向自己所用的终端发送信息。
选项:n 拒绝其它用户向自己所用的终端写信息 y 允许其它用户向自己所用的终端写信息(缺省值)
注释:
例如:% mesg n
5.5 给其他用户写信息
命令:write
格式:write username [ttyname]
功能:给其他用户的终端写信息。
选项:
注释:若对方没有拒绝,两用户可进行交谈,键入EOF或Ctrl+C则结束对话。
例如:write username
5.6 测试网路
命令:ping
格式:ping hostname
功能:向网络上的主机发送ICMP ECHO REQUEST信息包,检测网络是否畅通。
选项:
注释:被测试的主机名可用IP地址。当丢包率为(100% packet loss)则说明当前网络不通。
例如:% ping hostsname
5.7 远程shell命令
命令:rsh (remote shell)
格式:rsh hostsname command
功能:在本地机执行远程主机的shell命令。
选项:
注释:
例如:% rsh hostname who
5.8 远程考贝文件
命令:rcp (remote copy)
格式:rcp [-r] file newfile
功能:拷贝远程主机上的文件。
选项:-r 拷贝目录
注释:
例如:% rcp hostname:/tmp/file .
5.9 远程注册
命令:rlogin (remote login)
格式:rlogin hostname [-l username]
功能:注册到远程主机上。
选项:-l username 注册到另一用户
注释:要有用户口令才能注册。
例如:% rlogin hostname
5.10 远程登录
命令:telnet
格式:telnet hostname
功能:远程登录到网上其它主机。
选项:
注释:支持不同的操作系统。
例如:% telnet bbs.tsinghua.edu.cn
5.11文件传输
命令:ftp (file transfer program)
格式:ftp hostname
功能:网络文件传输及远程操作。
选项:ftp命令:
?/help ftp的联机帮助
open hostname 打开制定的远程机
cd [dirname] 进入远程机的目录
lcd [dirname] 设置本地机的目录
dir/ls 显示远程的目录文件
binary 以二进制方式进行传输
get/mget 从远程机取一个或多个文件
put/mput 向远程机送一个或多个文件
prompt 打开或关闭多个文件传送时的交互提示
close 关闭与远程机的连接
quit 退出ftp
注释:
例如:% ftp hostname
5.12显示到网络主机的路经
命令:traceroute
格式:traceroute hostname
功能:显示本机到达某一网络主机所经的路经和使用的时间。
选项:
注释:
例如:% traceroute hostname
第六章 Mail命令
6.1 发送或接受电子邮件
命令:mail/Mail/mailx
格式:mail username (发送)
mail [option] (接受)
功能:向网上用户发送或接受电子邮件。
选项:-r 邮件按先进先出顺序排序。缺省时为后进先出顺序排序
-q 中断mail后不改变信箱内容
-p 显示mail每份邮件,不显示提示信息
-f 从邮件格式文件中读邮件
注释:mail命令:
? 显示mail帮助命令
h 邮件标题列表
p 显示当前邮件
n 显示下一邮件
r [uers] 给发信人或用户回信
s [file] 将邮件保存到文件中,保存标题信息
w [file] 将邮件写到文件中,不保存标题信息
d [n] 删除当前邮件或第n封邮件
q 将未删除的邮件存入mbox文件,并退出mail
x 所有邮件不作修改,退出mail
例如:% mail -s “Subjet …” username < messages
6.2 显示邮件队列
命令:mailq
格式:mailq
功能:查看正在发送或接收邮件的排队情况。
选项:
注释:此命令一般在系统或网络不同时使用。
例如:% mailq
6.3 邮件操作命令
命令:pine
格式:pine
功能:对自己邮件操作的程序。
选项:
注释:此操作是在菜单提示下进行。
例如:% pine
第七章 运行程序命令
7.1 按时间执行命令
命令:at/batch
格式:at [option] [time] [data] [file]
功能:在制定的时间执行命令或命令文件。
选项:-r 取消以前用at命令提交的作业 -l 显示用at命令提交的所有作业状态和作业号
注释:
例如:at 0030 Jan 20 myfile
7.2 参数回至标准输出
命令:echo
格式:echo [-n] [arguments]
功能:将参数即字符串至标准输出即显示器
选项:-n 不向标准输出回送换行符
注释:
例如:echo *
7.3 复制至文件
命令:tee
格式:tee [option] filename
功能:至标准输出的同时复制至文件
选项:-a 输出时附加到文件中
-i 不理采中断
注释:
例如:% who | tee file
7.4 给程序优先级
命令:nice
格式:nice [-n] command
功能:以低的优先级运行程序或命令。
选项:-n 为优先级0-20从高到低
注释:
例如:nice -5 progame
7.5 终止进程
命令:kill
格式:kill [option] pid
功能:向指定的进程送信号或终止进程。
选项:-9 强行终止进程
-17 将进程挂起
-19 将挂起的进程激活
注释:pid标示进程号,可由ps命令得到。
例如:% kill -9 pid
7.6 进程睡眠
命令:sleep
格式:sleep time
功能:使当前正在执行的进程在规定的时间内处于睡眠。
选项:
注释:time为进程将睡眠的时间,以秒为单位。
例如:% sleep time
7.7 显示作业状态
命令:jobs
格式:jobs [-l]
功能:显示当前作业的状态
选项:-l 长列表显示作业状态,包括所有者、作业号、终端和状态。
注释:作业状态为 +表示最近被停止的作业,-表示先前的作业,exit 1表示退出的作业,job# done表示已完成的作业。
例如:% jobs
7.8 前台作业
命令:fg
格式:fg job#
功能:将指定作业号的作业转入前台运行。job#表示作业号。
选项:
注释:
例如:% fg job#
7.9 后台作业
命令:bg/&
格式:bg job#
command &
功能:将指定作业号的作业或命令推到后台运行。
选项:
注释:
例如:% bg job#
7.10挂起作业
命令:stop
格式:stop job#
功能:将指定作业号的后台作业挂起.
选项:
注释:
例如:% stop job#
第八章 程序编译执行命令
8.1 C程序编译
命令:cc
格式:cc [option] filename
功能:编译或链接指定的C文件。
选项:-o 指定输出文件名,缺省时为a.out
-c 只编译,产生.o的目标文件
-g 产生用于符号测试的执行文件
-lm 进行连接cc数学库
-O 进行代码的一般优化
-O2 二级优化
注释:C编译器参考手册可用命令man cc查看。
例如:% cc -o test test.c
8.2 C++程序编译
命令:CC
格式:CC [option] filename
功能:编译或链接指定的C++文件。
选项:同C编译选项
注释:C++编译器参考手册可用命令man CC查看。
例如:% CC -O2 test.cc
8.3 FORTRAN77程序编译
命令:f77
格式:f77 [option] filename
功能:编译或链接指定的Fortran文件
选项:-o 指定输出文件名,缺省时为a.out
-c 只编译,产生.o的目标文件
-g 产生用于符号测试的执行文件
-O0 不进行代码优化
-O1 尽快进行代码优化
-O2 二级优化
-O3 三级优化
注释:FORTRAN77编译器参考手册可用命令man f77查看
例如:% f77 -c test.f
8.4 FORTRAN90程序编译
命令:f90
格式:f90 [option] filename
功能:编译或链接指定的Fortran90文件
选项:同FORTRAN77编译选项
注释:FORTRAN90编译器参考手册可用命令man f90查看
例如:% f90 -O -o test test.f
8.5 GNU程序编译
命令:gcc (GNU C)
g++/c++ (GNU C++)
g77 (GNU FORTRAN77)
格式:gcc [option] filename
g++ [option] filename
g77 [option] filename
功能:编译或链接指定的编译文件。
选项:-o 指定输出文件名,缺省时为a.out
-c 只编译,产生.o的目标文件
-O 进行代码的一般优化
-O2 二级优化
注释:GNU编译器参考手册可进入emacs中info菜单下查看。
例如:% gcc -o test test.c
8.6 运行文件
格式:a.out
filename
功能:源程序经编译后产生目标代码文件,放在a.out文件或指定输出文件名。
http://www.itp.ac.cn/english/itpnet/guide/guide_1.html
CVSup主要镜像站点
FreeBSD 的 CVSup 服务器运行于 下列站点:
中央服务器, 主要镜像站点, 阿根廷, 爱尔兰, 爱沙尼亚, 奥地利, 澳大利亚, 巴西, 保加利亚, 冰岛, 波兰, 丹麦, 德国, 俄罗斯, 法国, 菲律宾, 芬兰, 哥斯达黎加, 韩国, 荷兰, 吉尔吉斯斯坦, 加拿大, 捷克共和国, 科威特, 拉脱维亚, 立陶宛, 罗马尼亚, 美国, 南非, 挪威, 葡萄牙, 日本, 瑞典, 瑞士, 圣马力诺, 斯洛伐克共和国, 斯洛文尼亚, 泰国, 土耳其, 乌克兰, 西班牙, 希腊, 新加坡, 新西兰, 匈牙利, 意大利, 印度尼西亚, 英国, 中国大陆, 中国台湾.
- cvsup.cn.FreeBSD.org
- cvsup2.cn.FreeBSD.org
- cvsup3.cn.FreeBSD.org
- cvsup4.cn.FreeBSD.org
- cvsup5.cn.FreeBSD.org
(2005/11/30 07:03:10 UTC 更新)
- 中央服务器
-
- cvsup.FreeBSD.org
- 主要镜像站点
-
- cvsup1.FreeBSD.org
- cvsup2.FreeBSD.org
- cvsup3.FreeBSD.org
- cvsup4.FreeBSD.org
- cvsup5.FreeBSD.org
- cvsup6.FreeBSD.org
- cvsup7.FreeBSD.org
- cvsup8.FreeBSD.org
- cvsup9.FreeBSD.org
- cvsup10.FreeBSD.org
- cvsup11.FreeBSD.org
- cvsup12.FreeBSD.org
- cvsup13.FreeBSD.org
- cvsup14.FreeBSD.org
- cvsup15.FreeBSD.org
- cvsup16.FreeBSD.org
- cvsup18.FreeBSD.org
- 阿根廷
-
- cvsup.ar.FreeBSD.org
- 爱尔兰
-
- cvsup.ie.FreeBSD.org
- 爱沙尼亚
-
- cvsup.ee.FreeBSD.org
- 奥地利
-
- cvsup.at.FreeBSD.org
- cvsup2.at.FreeBSD.org
- 澳大利亚
-
- cvsup.au.FreeBSD.org
- cvsup2.au.FreeBSD.org
- cvsup3.au.FreeBSD.org
- cvsup4.au.FreeBSD.org
- cvsup5.au.FreeBSD.org
- cvsup6.au.FreeBSD.org
- cvsup7.au.FreeBSD.org
- 巴西
-
- cvsup.br.FreeBSD.org
- cvsup2.br.FreeBSD.org
- cvsup3.br.FreeBSD.org
- cvsup4.br.FreeBSD.org
- cvsup5.br.FreeBSD.org
- 保加利亚
-
- cvsup.bg.FreeBSD.org
- 冰岛
-
- cvsup.is.FreeBSD.org
- 波兰
-
- cvsup.pl.FreeBSD.org
- cvsup2.pl.FreeBSD.org
- cvsup3.pl.FreeBSD.org
- 丹麦
-
- cvsup.dk.FreeBSD.org
- cvsup2.dk.FreeBSD.org
- cvsup3.dk.FreeBSD.org
- 德国
-
- cvsup.de.FreeBSD.org
- cvsup2.de.FreeBSD.org
- cvsup3.de.FreeBSD.org
- cvsup4.de.FreeBSD.org
- cvsup5.de.FreeBSD.org
- cvsup6.de.FreeBSD.org
- cvsup7.de.FreeBSD.org
- cvsup8.de.FreeBSD.org
- 俄罗斯
-
- cvsup.ru.FreeBSD.org
- cvsup2.ru.FreeBSD.org
- cvsup3.ru.FreeBSD.org
- cvsup4.ru.FreeBSD.org
- cvsup5.ru.FreeBSD.org
- cvsup6.ru.FreeBSD.org
- 法国
-
- cvsup.fr.FreeBSD.org
- cvsup2.fr.FreeBSD.org
- cvsup3.fr.FreeBSD.org
- cvsup4.fr.FreeBSD.org
- cvsup5.fr.FreeBSD.org
- cvsup8.fr.FreeBSD.org
- 菲律宾
-
- cvsup1.ph.FreeBSD.org
- 芬兰
-
- cvsup.fi.FreeBSD.org
- cvsup2.fi.FreeBSD.org
- 哥斯达黎加
-
- cvsup1.cr.FreeBSD.org
- 韩国
-
- cvsup.kr.FreeBSD.org
- cvsup2.kr.FreeBSD.org
- cvsup3.kr.FreeBSD.org
- 荷兰
-
- cvsup.nl.FreeBSD.org
- cvsup2.nl.FreeBSD.org
- cvsup3.nl.FreeBSD.org
- cvsup5.nl.FreeBSD.org
- 吉尔吉斯斯坦
-
- cvsup.kg.FreeBSD.org
- 加拿大
-
- cvsup1.ca.FreeBSD.org
- 捷克共和国
-
- cvsup.cz.FreeBSD.org
- 科威特
-
- cvsup1.kw.FreeBSD.org
- 拉脱维亚
-
- cvsup.lv.FreeBSD.org
- 立陶宛
-
- cvsup.lt.FreeBSD.org
- cvsup2.lt.FreeBSD.org
- cvsup3.lt.FreeBSD.org
- 罗马尼亚
-
- cvsup.ro.FreeBSD.org
- cvsup1.ro.FreeBSD.org
- cvsup2.ro.FreeBSD.org
- cvsup3.ro.FreeBSD.org
- 美国
-
- cvsup1.us.FreeBSD.org
- cvsup2.us.FreeBSD.org
- cvsup3.us.FreeBSD.org
- cvsup4.us.FreeBSD.org
- cvsup5.us.FreeBSD.org
- cvsup6.us.FreeBSD.org
- cvsup7.us.FreeBSD.org
- cvsup8.us.FreeBSD.org
- cvsup9.us.FreeBSD.org
- cvsup10.us.FreeBSD.org
- cvsup11.us.FreeBSD.org
- cvsup12.us.FreeBSD.org
- cvsup13.us.FreeBSD.org
- cvsup14.us.FreeBSD.org
- cvsup15.us.FreeBSD.org
- cvsup16.us.FreeBSD.org
- cvsup18.us.FreeBSD.org
- 南非
-
- cvsup.za.FreeBSD.org
- cvsup2.za.FreeBSD.org
- 挪威
-
- cvsup.no.FreeBSD.org
- 葡萄牙
-
- cvsup.pt.FreeBSD.org
- cvsup2.pt.FreeBSD.org
- cvsup3.pt.FreeBSD.org
- 日本
-
- cvsup.jp.FreeBSD.org
- cvsup2.jp.FreeBSD.org
- cvsup3.jp.FreeBSD.org
- cvsup4.jp.FreeBSD.org
- cvsup5.jp.FreeBSD.org
- cvsup6.jp.FreeBSD.org
- 瑞典
-
- cvsup.se.FreeBSD.org
- cvsup3.se.FreeBSD.org
- 瑞士
-
- cvsup.ch.FreeBSD.org
- 圣马力诺
-
- cvsup.sm.FreeBSD.org
- 斯洛伐克共和国
-
- cvsup.sk.FreeBSD.org
- cvsup2.sk.FreeBSD.org
- 斯洛文尼亚
-
- cvsup.si.FreeBSD.org
- cvsup2.si.FreeBSD.org
- 泰国
-
- cvsup.th.FreeBSD.org
- 土耳其
-
- cvsup.tr.FreeBSD.org
- 乌克兰
-
- cvsup2.ua.FreeBSD.org
- cvsup3.ua.FreeBSD.org
- cvsup4.ua.FreeBSD.org
- cvsup5.ua.FreeBSD.org
- cvsup6.ua.FreeBSD.org
- cvsup7.ua.FreeBSD.org
- 西班牙
-
- cvsup.es.FreeBSD.org
- cvsup2.es.FreeBSD.org
- cvsup3.es.FreeBSD.org
- 希腊
-
- cvsup.gr.FreeBSD.org
- cvsup2.gr.FreeBSD.org
- 新加坡
-
- cvsup.sg.FreeBSD.org
- 新西兰
-
- cvsup.nz.FreeBSD.org
- 匈牙利
-
- cvsup.hu.FreeBSD.org
- 意大利
-
- cvsup.it.FreeBSD.org
- 印度尼西亚
-
- cvsup.id.FreeBSD.org
- 英国
-
- cvsup.uk.FreeBSD.org
- cvsup2.uk.FreeBSD.org
- cvsup3.uk.FreeBSD.org
- cvsup4.uk.FreeBSD.org
- 中国大陆
-
- cvsup.cn.FreeBSD.org
- cvsup2.cn.FreeBSD.org
- cvsup3.cn.FreeBSD.org
- cvsup4.cn.FreeBSD.org
- cvsup5.cn.FreeBSD.org
- 中国台湾
-
- cvsup.tw.FreeBSD.org
- cvsup3.tw.FreeBSD.org
- cvsup4.tw.FreeBSD.org
- cvsup5.tw.FreeBSD.org
- cvsup6.tw.FreeBSD.org
- cvsup7.tw.FreeBSD.org
- cvsup8.tw.FreeBSD.org
- cvsup9.tw.FreeBSD.org
- cvsup10.tw.FreeBSD.org
- cvsup11.tw.FreeBSD.org
- cvsup12.tw.FreeBSD.org
- cvsup13.tw.FreeBSD.org
逻辑(面试)题目中的陷阱
正如充满正义感的人无法容忍犯罪的发生,富于美感的人不能包容丑陋和瑕疵一样,一个逻辑严谨的人是没办法忍受哪怕一点点逻辑漏洞的存在的。几天前的一篇帖子,招来了一堆自以为是的人,也逼得在mop潜水多日的我头一次发贴,来堂堂正正地批驳那道存在严重漏洞的推理题,给所有不了解逻辑的人上一堂浅显的逻辑课。这是我第一次写这种类似科普的文章,如有名词解释、用法上不适当的地方,谨请指正。
后面的内容安排如下:
第一章,介绍事件的起因,概述问题和错误的观点。
第二章,用最基本的思维方法和通俗的语言驳斥题目的漏洞。即便你以前对逻辑一无所知,相信看了之后这一章,也会明白漏洞的所在。
第三章,用真正的逻辑推理,驳斥那个貌似正确的解题方法。如果你对此不感兴趣,可以跳过这一章。
最后,给出我的结论。
第一章:介绍
事情的起因,源自于好事者贴出的一则声称做出来就有130智商的推理题。很快就有人得出了答案,并引得和声一片。但接着就有人提出了不同的看法。印象中东方隐最先发现了题目的漏洞;我得出了相同的结论,很快,雷神爷爷赞同了我的观点。guojia虽然在细节上留有自己的看法,但是他总体上接受了我的观点。重装步兵发了一片相当长的文章,此文是如此之长以至于我没法安心细看,不过我感觉上他和我基本保持了相同立场,虽然在陈述上还存在着一定的问题。还有一些赞同我的观点的人,恕我记忆里有限,无法一一列举。遗憾的是,真理往往掌握在少数人手中。
大多数人还是无法一下子理解认识到他们所犯的逻辑错误。当然这也正是我写此文的原因。下面,我用概括性的描述一下那道富于争议的题。这个题干是大多数人所认可的:
有甲乙两个纸条和甲乙两个箱子。已知其中一个箱子中装有黄金。纸条上的内容如下:
甲纸条:“乙纸条是真的,而且黄金在甲箱。”
乙纸条:“甲纸条是假的,而且黄金在甲箱。”
现不知纸条的真假与否,问:那黄金在哪个箱子?
如果看完题目,你已经发现这个题存在漏洞,或是隐隐约约感觉到有什么不对劲的话,恭喜你,你已经把握住了问题的要害。不过,让我们耐着性子,把那个错误的推理看完。如下是比较典型的推导过程:
假設甲箱上的字條是真的,那麼:“乙箱上的字條是真的,而且黃金在甲箱”的兩個陳述都是真的。如此則乙箱的字條說的是真的,看看它上面寫著什麼:“甲箱的字條是假,而且黃金在甲箱”這邊的“甲箱的字條是假的”則違反了最初的假設,因此不成立。
如此可推論甲箱上的字條是假的,即其中至少有一個陳述是假的,可能是:(1)乙箱的字條是假的;(2)黃金在乙箱。若(1)乙箱的字條是假的,則表示甲箱的字條是真的(已經證明不成立的),或是(2)黃金在乙箱。無論如何,黃金一定在乙箱!
我们也可以稍稍做一下修改,把它概括一下。如果你无法理解这样的修改也不要紧,后面不会有太多内容基于此。
假设黄金在甲箱,那么甲乙两个命题构成了悖论,相互矛盾。所以,黄金不在甲箱而在乙箱。
现在我们已经给出了题目和错误推理,让我们开始来好好地批驳它吧。
第二章:独立事件
逻辑源于生活。它用概括性的语言描述人类的思维和推理,虽然有些晦涩,但确是严谨的。现在就让我们用普通的、生活的思维方式,来看穿漏洞的所在。
让我们假设这样一个场景:我就是那个写纸条、放金块的人。其实我这个人很没计划,想到什么做什么。写完两张纸条了,纸条贴好了,照理说,下面我该放金块了。可你也知道,我这个人很没计划的,想到哪里算哪里,金块蛮,想放哪儿就放哪儿吧。什么?你说纸条?哈哈,你傻啦?我放金块关纸条什么事啊?反正纸条真真假假的,你们自己瞎猜去吧,我呢,只管自己放金块,想放哪里就放哪里。
明白了吧?其实纸条内容和金块的位置完全是两码事,风马牛不相及。这就是所谓的独立事件。你不能够从纸条的内容上推导出金块的位置,因为纸条的内容真假与否都尚未可知,如何能对金块的位置产生约束呢?曾有人举了这样一个例子想要反驳这个的观点,他:说高速公路上的路牌写着北京北、广州南,难道路牌和北京广州的位置就是独立的吗?难道路牌对位置没有约束性了吗?呵呵,殊不知他为我提供了一个很好的证据。让我们把路牌的情况放到原题中看,我们还得给它加上一个条件,那就是:不知路牌的真假。如此一来,独立性这个概念就越发明显了。在你不知路牌真假的情况下,任何情况都是有可能发生的。事实与路牌内容这两者之间显然构成了一个典型的独立关系。
那么如何才能去掉这种独立关系呢?很简单,提供更多的条件,对命题的真假作出约束。比如,已知一真一假,已知不全真等等。这种约束条件,在某种程度上可以当作事实的一部分。我们会在下一章中具体分析事实和推理的关系。
第三章:悖论,反证法?
既然有的人想用逻辑推导来证明他们的观点的正确性,那么这一次,我就以其人之道还治其人之身,用真真正正的逻辑来彻底推翻他的论断。在开始之前,让我们先来了解一些关于逻辑、逻辑推理的基本概念。(这里,主要讲的是布尔逻辑。如果有人要提模糊逻辑,我们另外再谈)
首先登场的是:事实、规则和命题这三个概念。所谓命题,是指对事物的一个陈述,任何看法,观点、主张、论断都可以看作命题。命题有可能真也有可能假。已知为真的命题,我们称之为事实。规则,则是逻辑演绎的工具,比如三段论:(a=>b & b=>c)=> (a=>c)等等。这里讨论的内容和规则无关,我就不细说了。
接下来,让我们来看看逻辑推导的两种方式:正向推导和反向推导。所谓的反向推导(反演),也就是通常所说的反证法。正向推导,是由事实出发,结合规则和其他事实,直接得出结论命题。而反向推导,是先假设结论为假,继而通过规则和其他事实,导出与已知事实相矛盾,从而推翻假设,得出结论为真。
这里的关键是“事实”两个字。无论是正演还是反演,都不能没有事实。这就像巧妇难为无米之炊一样,空有炉灶(规则),没有米(事实),是煮不成饭(结论)的。尤其是反证法,最后推出矛盾,必须是和已知事实相矛盾,请大家注意“已知事实”这四个字。这正是那个貌似正确的推导彻底崩溃的根源。(如有疑惑,可查阅反证法定义)
现在让我们回到题目中去。让我们看看能不能做什么逻辑推理呢?回答是否定的。原题中,没有提供任何有价值的事实,能让我们做任何的推导。有人也许会问“存在某个箱子放了金块,这不是一个事实吗?”不错,这是一个事实,可惜这个事实太弱了,以至于不能体现任何价值。这就像我要证明一个数学公式,你却给我提供类似“我们大家都是地球人”这样的事实条件。很遗憾,这个事实对证明无能为力。那么什么样的事实才能够强到有用呢?其实在上一章的结尾我已经提到了一些例子。当对纸条的真假作出一定的约束的事实,才是真正有用地。
以上从宏观上分析了在缺乏事实的条件下,想要得出任何结论是不可能的这一基本论断,这和我们在第二章的观点是吻合的。接下来,让我们从微观出发,好好看看那个错误的推导到底错在哪里。不错,你猜对了,就是事实!用瞒天过海、混水摸鱼这八个字形容那个推导过程,是再好不过的了。
让我们看看第一章里给的那个过程,得出一个矛盾,是假设和假设本身的矛盾,换句话说,叫做自相矛盾,而并不是真正的反证法所讲的与已知事实的矛盾。因而想用反证法证明的打算,在这里出现了严重的问题,从而变得不可行。有人会问:“自相矛盾?这是什么东西?”其实我们前面已经提到了,他有个特别的名字,叫做悖论,或者两难问题。
举个例子,我说:我现在说的这句话是假的。
那么,请问,我现在说的这句话到底是不是假的呢?假如是真的,那么内容说假的,自相矛盾了。如果是假的,那么内容说真的,又自相矛盾了。类似的例子还有很多,比如著名的理发师剪头发的问题。悖论,是逻辑中的特例,就想程序中的死循环一样。你不能从悖论中推出任何结论,想要拿悖论用到反证法上去,那更是大错特错了。
实际上,把任何命题作为原推论的后半段,都会得出该命题为假的结论。就让我们真正的用一次反证法,来证明原来那个推论的荒谬。
假设原推论方式成立,那么现在给出以下两个命题:
甲:“乙是真的,而且地球是圆的。”
乙:“甲是假的,而且地球是圆的。”
由原有推论可知,地球不是圆的。这与已知事实矛盾,所以该推论方式大错特错。over.
第四章:结论
终于说得差不多了,该谈谈我的结论了。我的结论概括起来有三点:
纸条的内容和金块的位置为两个独立事件。照常理判断,在缺乏其他事实条件的前提下,无法从纸条的内容上得知金块的位置。
原题缺乏必要的事实条件,因而存在严重的逻辑漏洞。想要用悖论充当反证法的矛盾来做推导,更是错上加错。
在认识到以上两点的前提下,在忽略严格逻辑推导的前提下,可以得出貌似正确的结论:乙。但这只是一种形式上的正确罢了,既缺乏实际意义,也缺乏严密的逻辑的支持。这也就是习惯应试教育的人所情愿得出的结论,因为它最符合出题者的意图,仅此而已。
看到这里,如果你赞同了我的观点,那么恭喜你,你的逻辑思维有加深了一步。如果你还是不能理解,那么也许各有所长,你可能不太擅长逻辑思维。
感谢雷神爷爷的支持,他一直和我站在同一个战壕里;感谢能够接受了我的观点的人,你们的理解使我这篇文章变得有意义;也要感谢持相反、错误观点的人,你们的观点恰恰促成了这篇文章。
谨以此文献给所有热爱数学,热爱逻辑的人。
附:有的人认为这不是逻辑漏洞。但我认为这恰恰是严重的漏洞。逻辑是和生活是联系在一起的。如果你用常理都解释不通,那又怎么能期望逻辑上就没漏洞了呢?
来源:http://blog.csdn.net/xiammy/archive/2007/05/20/1618483.aspx
.htaccess指南
.htaccess指南
|
这是关于.htaccess的一篇介绍,也是很容易让人理解的一篇关于.htaccess应用的文档,我随意翻译了一下,自己也玩一玩.htaccess • Part 1 – Introduction介绍 Part 1 – Introduction介绍 Introduction 介绍 In this tutorial you will find out about the .htaccess file and the power it has to improve your website. Although .htaccess is only a file, it can change settings on the servers and allow you to do many different things, the most popular being able to have your own custom 404 error pages. .htaccess isn’t difficult to use and is really just made up of a few simple instructions in a text file. Will My Host Support It? 我的主机支持它吗? This is probably the hardest question to give a simple answer to. Many hosts support .htaccess but don’t actually publicise it and many other hosts have the capability but do not allow their users to have a .htaccess file. As a general rule, if your server runs Unix or Linux, or any version of the Apache web server it will support .htaccess, although your host may not allow you to use it. A good sign of whether your host allows .htaccess files is if they support password protection of folders. To do this they will need to offer .htaccess (although in a few cases they will offer password protection but not let you use .htaccess). The best thing to do if you are unsure is to either upload your own .htaccess file and see if it works or e-mail your web host and ask them. What Can I Do? 我该怎么做? You may be wondering what .htaccess can do, or you may have read about some of its uses but don’t realise how many things you can actually do with it. There is a huge range of things .htaccess can do including: password protecting folders, redirecting users automatically, custom error pages, changing your file extensions, banning users with certian IP addresses, only allowing users with certain IP addresses, stopping directory listings and using a different file as the index file. Creating A .htaccess File 创建一个.htaccess文档 Creating a .htaccess file may cause you a few problems. Writing the file is easy, you just need enter the appropriate code into a text editor (like notepad). You may run into problems with saving the file. Because .htaccess is a strange file name (the file actually has no name but a 8 letter file extension) it may not be accepted on certain systems (e.g. Windows 3.1). With most operating systems, though, all you need to do is to save the file by entering the name as:
(including the quotes). If this doesn’t work, you will need to name it something else (e.g. htaccess.txt) and then upload it to the server. Once you have uploaded the file you can then rename it using an FTP program. Warning 警告 Before beginning using .htaccess, I should give you one warning. Although using .htaccess on your server is extremely unlikely to cause you any problems (if something is wrong it simply won’t work), you should be wary if you are using the Microsoft FrontPage Extensions. The FrontPage extensions use the .htaccess file so you should not really edit it to add your own information. If you do want to (this is not recommended, but possible) you should download the .htaccess file from your server first (if it exists) and then add your code to the beginning. Custom Error Pages 自定义错误页 The first use of the .htaccess file which I will cover is custom error pages. These will allow you to have your own, personal error pages (for example when a file is not found) instead of using your host’s error pages or having no page. This will make your site seem much more professional in the unlikely event of an error. It will also allow you to create scripts to notify you if there is an error (for example I use a PHP script on Free Webmaster Help to automatically e-mail me when a page is not found). You can use custom error pages for any error as long as you know its number (like 404 for page not found) by adding the following to your .htaccess file:
For example if I had the file notfound.html in the root direct
If the file is not in the root directory of your site, you just need to put the path to it:
These are some of the most common errors:
Then, all you need to do is to create a file to display when the error happens and upload it and the .htaccess file. Introduction 介绍 In the last part I introduced you to .htaccess and some of its useful features. In this part I will show you how to use the .htaccess file to implement some of these. Stop A Directory Index From Being Shown 停示显示目录索引 Sometimes, for one reason or another, you will have no index file in your directory. This will, of course, mean that if someone types the directory name into their browser, a full listing of all the files in that directory will be shown. This could be a security risk for your site. To prevent against this (without creating lots of new ‘index’ files, you can enter a command into your .htaccess file to stop the directory list from being shown:
Deny/Allow Certian IP Addresses 阻止/允许特定的IP地址 In some situations, you may want to only allow people with specific IP addresses to access your site (for example, only allowing people using a particular ISP to get into a certian directory) or you may want to ban certian IP addresses (for example, keeping disruptive memembers out of your message boards). Of course, this will only work if you know the IP addresses you want to ban and, as most people on the internet now have a dynamic IP address, so this is not always the best way to limit usage. You can block an IP address by using:
where 000.000.000.000 is the IP address. If you only specify 1 or 2 of the groups of numbers, you will block a whole range. You can allow an IP address by using:
where 000.000.000.000 is the IP address. If you only specify 1 or 2 of the groups of numbers, you will allow a whole range. If you want to deny everyone from accessing a directory, you can use:
but this will still allow scripts to use the files in the directory. Alternative Index Files 替代的index文档 You may not always want to use index.htm or index.html as your index file for a directory, for example if you are using PHP files in your site, you may want index.php to be the index file for a directory. You are not limited to ‘index’ files though. Using .htaccess you can set foofoo.blah to be your index file if you want to! Alternate index files are entered in a list. The server will work from left to right, checking to see if each file exists, if none of them exisit it will display a directory listing (unless, of course, you have turned this off).
Redirection 重新指向 One of the most useful functions of the .htaccess file is to redirect requests to different files, either on the same server, or on a completely different web site. It can be extremely useful if you change the name of one of your files but allow users to still find it. Another use (which I find very useful) is to redirect to a longer URL, for example in my newsletters I can use a very short URL for my affiliate links. The following can be done to redirect a specific file:
In this above example, a file in the root directory called oldfile.html would be entered as:
and a file in the old subdirectory would be entered as:
You can also redirect whole directoires of your site using the .htaccess file, for example if you had a directory called olddirectory on your site and you had set up the same files on a new site at: http://www.newsite.com/newdirectory/ you could redirect all the files in that directory without having to specify each one:
Then, any request to your site below /olddirectory will bee redirected to the new site, with the
They would be redirected to:
This can prove to be extremely powerful if used correctly. Part 3 – 密码保护 Introduction 介绍 Although there are many uses of the .htaccess file, by far the most popular, and probably most useful, is being able to relaibly password protect directories on websites. Although JavaScript etc. can also be used to do this, only .htaccess has total security (as someone must know the password to get into the directory, there are no ‘back doors’) The .htaccess File Adding password protection to a directory using .htaccess takes two stages. The first part is to add the appropriate lines to your .htaccess file in the directory you would like to protect. Everything below this directory will be password protected:
There are a few parts of this which you will need to change for your site. You should replace “Section Name” with the name of the part of the site you are protecting e.g. “Members Area”. The /full/parth/to/.htpasswd should be changed to reflect the full server path to the .htpasswd file (more on this later). If you do not know what the full path to your webspace is, contact your system administrator for details. The .htpasswd File Password protecting a directory takes a little more work than any of the other .htaccess functions because you must also create a file to contain the usernames and passwords which are allowed to access the site. These should be placed in a file which (by default) should be called .htpasswd. Like the .htaccess file, this is a file with no name and an 8 letter extension. This can be placed anywhere within you website (as the passwords are encrypted) but it is advisable to store it outside the web root so that it is impossible to access it from the web. Entering Usernames And Passwords 输入用户名和密码 Once you have created your .htpasswd file (you can do this in a standard text editor) you must enter the usernames and passwords to access the site. They should be entered as follows:
where the password is the encrypted format of the password. To encrypt the password you will either need to use one of the premade scripts available on the web or write your own. There is a good username/password service at the KxS site which will allow you to enter the user name and password and will output it in the correct format. For multiple users, just add extra lines to your .htpasswd file in the same format as the first. There are even scripts available for free which will manage the .htpasswd file and will allow automatic adding/removing of users etc. Accessing The Site 访问网站 When you try to access a site which has been protected by .htaccess your browser will pop up a standard username/password dialog box. If you don’t like this, there are certain scripts available which allow you to embed a username/password box in a website to do the authentication. You can also send the username and password (unencrypted) in the URL as follows:
Summary 小结 .htaccess is one of the most useful files a webmaster can use. There are a wide variety of different uses for it which can save time and increase security on your website. |
与Java相关的四十个名字
与Java相关的四十个名字
十大事件
1990-1994:Java缘起
文/孟岩
Larry Wall说,优秀程序员应有的三个特点:懒惰、急躁和傲慢。Java就是诞生在一群懒惰、急躁而傲慢的程序天才之中。
1990年12月,Sun的工程师Patrick Naughton被当时糟糕的Sun C++工具折磨的快疯了。他大声抱怨,并威胁要离开Sun转投当时在Steve Jobs领导之下的NeXT公司。领导层为了留住他,给他一个机会,启动了一个叫做Stealth(秘密行动)的项目。随着James Gosling等人的加入,这个项目更名为Green。其目标是使用C++为嵌入式设备开发一种新的基础平台技术,James Gosling本人负责开发一个SGML编辑器。正如人们事后分析的那样,这位天才的程序员太懒惰,所以没有把C++学好,开发中碰了一头包;太急躁——所以不愿意停下来读读Scott Meyers的新书《Effective C++》;太傲慢——所以轻易地决定开发一中新的编程语言。他把这种语言命名为C++++–,意思是C++“加上一些好东西,减去一些坏东西”。显然这个糟糕的名字不可能长命百岁,很快这种颇受同伴喜爱的小语言被命名为Oak。
到了1992年9月,Oak语言连同Green OS和一些应用程序一起发布在称做Start 7的小设备上,从而使之有了第一次精彩的亮相。随后,Sun开了一家名为FirstPerson的公司,整个团队被转移到这家公司里研发机顶盒,以投标时代华纳公司的一个项目。这帮天才被技术狂热所鼓舞,开发出了一个高交互性的设备,结果没想到时代华纳公司和有线电视服务商并不愿意用户拥有那么大的控制权,从而在竞标之战中败给了SGI。Oak的锋芒之锐,竟然把客户都给吓懵了。Sun沮丧地关闭了FirstPerson,召回了整个团队。事实证明,传统行业中那些脑满肥肠的保守主义者是腐朽没落的。回去!回到激情澎湃的IT产业,抓住互联网的大潮,这才是出路!1994年,Oak被命名为Java,针对互联网的新一轮开发如火如荼,一切已经就绪,熔岩在地下奔流,火山即将喷发。
1995: Java香浓世界
文/马伟
1995年,Sun正式对外公布了Java,并且发布了JDK 1.0。这种外形酷似C++,却包含一颗Smalltalk般纯洁的面向对象之心的全新程序设计语言及其平台,几乎在一夜之间就成为软件产业的新宠儿。Java当时仅仅被用来为网站制作一些动态应用,诸如动画图片之类,但这仍然引起了很多Web开发者们的注意,他们非常渴望有一种安全的语言,可以在静态的HTML网页上制作动画图片。Sun最终把Java集成到NetScape浏览器。同时因为它具有“只写一次,随处运行”的特性,而引起了很多开发者的注意,他们可以再也不用为了使程序能够在不同型号的硬件上运行而耗费大量的时间来编译代码了。
当时的Web浏览器的出现也为Java的出现起到了很好的推动作用,通过Java和Web浏览器的结合,人们似乎看到了什么,有人甚至预言PC将在一两年内退出历史的舞台,取而代之的是基于Java的浏览器应用程序,通过网络计算设备来进行应用。Java的出现为当时的软件产业带来了无限的遐想。
1996:Java大跃进,盟主地位就此定
文/马伟
SUN在1996年一开始首先成立了JavaSoft组织,并在1月23日正式发布自己的Java 1.0,作为20世纪业界出现的最重要的技术之一,Java引起了编程世界的革命。直到现在,Java仍然是互联网上最流行的语言。
在Sun正式发布Java 1.0之后,Java这门新生的语言就拥有了自己的会议——JavaOne,这次会议初试啼音就吸引了600多名参与者。除了拥有这么多的积极参与者来进行Java的开发之外,各大知名公司也纷纷向Sun申请Java的许可。一时间,NetScape、惠普、IBM、Oralce、Sybase甚至当时刚推出Windows 95的微软都是Java的追随者。
Java的应用就像是世界上的顶级玩家们组成的一个公开联盟,告诉全世界我们大家就是都在用着Java。也正是因为如此,Java也找到了自己的归宿。现在的J2EE已经成为中大型企业级应用的标准,成为承接数据库和Web之间的一个重要桥梁。
当年Java的机会实在太多了,以至于很难知道到底该做什么。最终Java在应用服务器市场获得了难以取代的地位,也确定了J2EE的发展方向,并且仍将延续下去。
1997-2001: 微软与Sun的Java官司
文/孟岩
Java诞生的1995年,正是微软在软件产业地位达到巅峰的时代,Windows 95发布时的风光场面给人们留下的深刻印象至今难忘。尽管如此,作为最卓越的技术领袖,比尔?盖茨仍然敏锐地注意到Java。当他了解了Java的一些细节之后,给予了这样的评价:“Java是很长时间以来最优秀的程序设计语言。”基于此,微软于1996年3月申请并获得了Java许可证。微软对于Java的这一热情态度在当时大大提高了人们对Java的兴趣和信心,但也有不少人担心微软会依靠自己强大的影响力在标准之外另立标准,从而破坏Java的纯洁性。
果然,从1997年发布Visual J++的第一个版本开始,微软就开始在Java中掺入自己的私有扩展。这毫无疑问引起Sun的高度重视。1997年10月,Sun向美国加州地方法院起诉微软公司违反两公司就微软使用Java技术所签定的合同,指控微软公司在自己的Java产品中做了“不恰当的修改”,违反了合同中承诺向用户提供Java兼容产品的条款。这一官司旷日持久,直到2001年1月双方达成和解,微软将继续提供采用Sun开发的Java技术的现有产品(包括测试版)。不过,Sun有限制地仅对包括Java 1.1.4的微软产品提供许可。到了2001年7月,微软公布新版的Windows XP将不再支持Sun的JVM,并且推出了.NET平台与Java分庭抗礼。
现在回过头去看,当时的这一场官司对Java世界产生了深远的影响。如果没有这一场官司,也许很多Java程序员都在使用Visual J++,基于WFC开发Windows客户端程序,同时不得不面对被两个不同的事实标准所分裂的Java世界。
1998:Java 2平台发布
文/陶文
1998年,Java 2平台正式发布。经过了三年时间的发展、热热闹闹的攻关宣传、红红火火的众厂商的热情参与,Sun终于知道Java适合干什么了。对比Java刚发明时的技术定位,与Java的戏剧性触“网”的那段历史,Java 2平台的发布可真算得上是有的放矢了。根据官方的文档,Java 2是Sun意识到“one size doesn’t fit all”之后,把最初的Java技术打包成三个版本的产物,也就是著名的J2ME、J2SE、J2EE。
之所以说Java自从Java 2平台发布之后,进入了现代。那是因为之前的历史怎么看来都和现在程序员日常开发使用的技术无什么关系,比如Applet,已经很少有人使用了。Java 2之后的历史就不一样了,至少人们在推崇轻量级开发,猛批EJB时还不时会引用J2EE这个词是如何诞生的。而Java 2的三大版本中,除了J2EE得到了长足发展和广泛使用之外,J2ME也在手机市场上取得了遍地开花的结果。相较之下,J2SE难免落寞,只剩SWT这个血统不纯的家伙在Rich Client回归的时代吸引着人们的眼球了。无论今天看来当时的Java 2有多么的不成熟,至少经过市场和时间的检验,Java 2规划出来的三大方向把Java技术指向了光明的方向是勿庸置疑的。
1998:JCP成立并正式运作,
Java开源社群开始蓬勃发展
文/黄海波
1998年,JCP组织成立,并且开始把握Java的发展方向。JCP组织的开放性,不但使得所有对Java感兴趣的商业公司可以参与Java的发展,更重要的是JCP允许个人、非盈利组织、学校等加入,这就给Java带来了巨大的活力。随之兴起的Java开源运动的最大贡献是实现和鼓励了知识共享,在众多热情的开源程序员们的努力和分享下,很多原先只被商业公司掌握的技术、思想和产品可以被所有需要的开发人员免费或者以较低的价格获得使用权, 并通过开放源代码更容易的获得反馈和改进意见从而进一步演化发展。我们知道,所谓知识不是孤立发展认知,而是人们的经验,认识是思考交流和积累的产物。而开源运动所带来的开放、反馈、交流的风气正是符合人类社会知识形成和发展的规律。
开源运动起源于西方的发达国家,有其现实背景和文化根源。1990年代可以说是IT产业的一个黄金时代。信息时代的兴起对IT人员,特别是软件人员有着巨大的需求。而软件开发又是一种类似艺术创作的脑力活动,和所有的艺术家、作家们一样,在作品打上自己的印记并流传在世界上是每一个创作人员的梦想。互联网时代下的高收入的舒适生活,早九晚五的编写公司的代码并不能满足很多有激情的软件开发人员的梦想,再加上西方传统的基督教文化中十分推崇的分享和交流,开源的出现和兴起也就水到渠成了。今天,开源运动已经不仅仅是一些个人天才程序员们的游乐园地,而是发展成为一项开源软件产业。
1998:WebLogic打开J2EE的魔匣
文/霍泰稳
Java语言的出现使得互联网络有了良好的交互性能,但这些很“酷”的技术仅被人们认为是一些小花招,它还无法消除企业级用户对它的怀疑。1998年,BEA公司宣布收购WebLogic公司,并接着推出由Sun公司第一个授权使用J2EE许可证的WebLogic Server应用服务器,这个Java版的AppServer一推出就引起业界极大的兴趣。WebLoigc Server以其对标准的支持、强悍的运算能力和安全的架构设计等特性也很快征服了那些怀疑J2EE应用的人们。推出市场后不到一年,WebLogic Server就成为业内第一Java应用服务器。
这里我们援引一些当时著名咨询公司的调查数据来说明问题,“在IDC的报告中,BEA在应用服务器和交易服务器领域市场份额第一;在Gartner的报告中,BEA WebLogic Server拥有业内最广泛的EJB应用安装基础;在Giga Group的报告中,BEA WebLogic Server市场份额占32%”。
因为应用服务器市场极大的发展潜力,在WebLogic Server之后,其它的很多公司也推出了自己的AppServer,如IBM的WebSphere、Sun公司的iPlanet等,逐渐地应用服务器取代了传统意义上的各类中间件,成为企业应用的基础平台。应用服务器的出现使得Java有了真正意义上的发展。
2002-2004: Sun与微软的法律碰撞最终以喜剧收场
文/恶魔
2003年4月2 日,Sun与微软达成16亿美元的法律和解。如果不是晚了一天,许多人会以为这是一个在4月1日愚人节开的玩笑。尽管当时所有人都像是看到“太阳从西边出来了”那样张大了嘴巴,但这的确是事实。
根据两家公司达成的版权协议,双方会为采用对方的技术而支付专利费用,微软向Sun提前支付3.5亿美元使用费,Sun则承诺,如果Sun集成微软的某些技术,也会向微软付款。
毫无疑问,“私下了结”的方式对双方而言都是最好的结果。就在协议签署的当天,在美国旧金山由Sun和微软为“抛弃十年恩怨、携手合作“举行的新闻发布会上,尽管比尔?盖茨没有到场,但这并没有防碍现场看起来异常轻松的气氛。麦克尼利和鲍尔默各自穿了一件密歇根州底特律“Red Wings”曲棍球队的运动服,并谈及了一起在哈佛大学读书的经历,麦克尼利还说:“当时我们两人是非常要好的朋友,当然我们也有吵架的时候。”人与人当然可能成为终生的知己,但是公司与公司之间有的只能是利益上的分分合合。
2000-2004: JBoss和Eclipse
——Java开源软件的王者
文/莫映
Java和开源几乎就是天生的一对,这可以从无比兴盛繁荣的Java开源软件社区得到佐证。目前最有影响力的Java开源软件项目,要数JBoss和Eclipse。可以说,几乎所有的Java开发人员都获多或少的听到过或接触和使用过它们。前者是目前最优秀、应用最为广泛的企业级开源J2EE应用服务器,后者是功能完全可以替代商业产品的Java IDE。二者的覆盖功能之全、支持工具之广、子项目之多,几乎可以仅凭借它俩来完成企业应用的开发构建到部署实施的全过程,而软件开发者和客户也都可以最大程度上享受高质量,高可靠Java开源软件所带来的低成本优势。
JBoss和Eclipse的巨大成功,几乎令各自领域的商用竞争者抓狂,其中BEA的WebLogic和IBM的WebSphere在商业利润上受到JBoss的巨大侵蚀,而Borland的JBuilder、JetBrains的IDEA等诸多优秀的商用开发工具也不得不面对Eclipse独大的现实。JBoss的CEO兼创始人 Marc Fleury曾直言不讳地表示,希望占据市场主导地位。“我们希望打败IBM,成为中间件领域里最大的厂商。”JBoss在4.0以前还只是以一个Group存在,盈利手段主要靠服务和销售文档。但在最近,JBoss已经发展成为一个有限公司,并吸纳多家风险投资,专注于获取利润为目标之一的第二代开源软件模式(JBoss自己称为“Professional Open Source”)的创新和运营。这区别于以理论研究为爱好的学院型开源或大公司为基础的非盈利组织开源,如Linux和Apache。当然JBoss的这种运营方式势必会导致更多的代码控制和专有修改权,但按JBoss的说法是这样更能获得企业客户的信赖。JBoss的这种模式是否能获得成功还要我们拭目以待。
不管JBoss和Eclipse的未来发展如何,JBoss和Eclipse的成功已经让我们看到了Java开源软件的威力,祝愿它们一路走好。
2004:Java 5.0
文/莫映
2004年9月30日,代号为“Tiger”,研发历时近三年的J2SE 5.0发布正式版本,这是Java平台历来发布版本中改动面波及最大的一次。
纵观Tiger,“Ease of development”是其核心主题,这一点着重体现于语言特性上的改进,这在很大程度上,简化了开发人员日常的编程任务,以往一些琐碎的手工劳动都代之以轻松自然,而又安全可靠的自动化实现。其中的注解功能,以及随之而来的声明式编程,还对构筑于J2SE 5.0之上的J2EE 5.0产生了巨大影响。尽管Tiger在语言特性上做了很大的动作,但作为Java技术的基础支撑,这些改动都是深思熟虑的结果。
Tiger发布至今也有大半年了,那么Sun又是如何规划J2SE的未来蓝图的呢?据悉,J2SE的下两个版本分别是代号为“Mustang”的J2SE 6.0和代号为“Dolphin”的J2SE 7.0,预计Mustang将于明年发布。在吸取了Tiger研发周期过长的教训之后,Sun副总裁Graham Hamilton表示,Mustang的发布周期将不会那么长。并且,Sun还将“Becoming more open” 作为Mustang的主题之一。未来JCP对Java技术的影响将会愈加深入,而整个研发过程也将会愈加透明。Mustang在正式发布前的内部版本也会陆续见诸于众,如此,广大Java开发者便可以更加及时的了解到Java发展的最新情况。在语言层面上的扩展依然会比较谨慎,比如像AOP这样的当下热门技术,依然不太可能会见诸其中。据Hamilton所言,一个有可能被引入的语法特性被称作“friends”import机制,它将使由多个包组成的大型项目变得易于管理。
十大人物
James Gosling : Java之父
文/陶文
作为Java之父,James Gosling的名字可谓是耳熟能详。当人们评论一种编程语言时,总喜欢捎带着把下蛋的母鸡一起带上。Java做为中国的编程语言学习者餐桌上有限的那么几样餐点中的流行款式,自然是让James Gosling风光不已。虽然James Gosling现在已经不是领导Java发展潮流的领军人物了,做为Sun的开发者产品组的CTO,怎么算来也是身居高位了,俗事缠身吧,但是这并不妨碍其对于Java一如既往的爱护,表达着各式各样鲜明的观点,引发一场又一场的争论。
James Gosling是很爱Java的——是啊,哪有当父母的不爱自己的孩子的呢。James Gosling也是很爱Sun的——是啊,哪有当领导的不爱自己的公司的呢。于是我们在批评.NET的安全性的队伍前头,在褒扬Java性能的队伍前头,在抨击SWT开倒车的队伍前头,在给NetBeans大唱赞歌的队伍前头,我们都看到了James Gosling的身影。无论对错、偏见或者固执,至少说明了Gosling的鲜明个性丝毫没有受到年龄的影响。也许也只有这种天才而偏执的人物才能创造出Java这般伟大的语言来吧。
Bill Joy : 软件业的爱迪生
文/徐昊
Joy生于1954年,1982年与Vinod Khosla, Scott McNealy和Andy Bechtolsheim一起创建了Sun Microsystems,并从那时起担任首席科学家,直到2003年离开。他是一位令人崇敬的软件天才,他在软件和硬件的历史上留下了无数令人仰止的传奇。
在上个世纪80年代早期,DARPA与BBN达成协议,准备将Vinton Cerf和Bob Kahn设计的TCP/IP协议添加到Berkeley UNIX中。Bill Joy被委派来完成这项任务,然而他却拒绝将BBN的TCP/IP协议栈添加到BSD中,因为在他的眼中BBN的TCP/IP实现还远不够好,于是他就写了一个高性能的TCP/IP协议栈。John Gage回忆道,“BBN和DARPA签署了巨额合同来实现TCP/IP协议,然而他们的员工所编写的代码远没有一个研究生所做的好。于是他们邀请Bill Joy参加他们的一个会议,这位研究生穿着一件T-Shirt就出现了,他们询问他,‘你是如何做到的呢?’Bill回答说,‘这是非常简单的一件事,你读一下协议然后就可以编码了’”。除了TCP/IP协议,基于分页的虚拟内存系统最早也是由Bill Joy添加到Berkeley UNIX内核当中的。同时他还是vi、csh、早期Pascal编译器的作者。
关于Bill Joy惊人的软件才能流传最广的一个传奇是,据说他在上研究生的时候,想看看自己能不能写一个操作系统出来,于是就在三天里写了一个非常简陋,但是可以使用的Unix系统, 传说就是BSD的前身。虽然如此夸张的才情令人难以置信,但是考虑到主角是Bill Joy,还是有一定的可信度的。Bill Joy硕士毕业之后,决定到工业界发展,于是就到了当时只有一间办公室的Sun, 他作为主要设计者参与了SPARC微处理器的设计,负责设计最为关键的一部分电路。这样兼精软硬件的天才实在是让人不得不佩服啊。1995年,Sun发布了轰动世界的Java语言。当然,Bill Joy对Java也作出了不少的贡献,首先是JINI——一种针对分布式服务的基础连接技术。任何可以内嵌JVM的电子设备都可以通过JINI相互连接;JXTA是基于Java的P2P协议,允许互联网上的软件进行点对点交流和协作。
这个其貌不扬的瘦高个,有着凌乱的亚麻色头发,被《财富》杂志誉为“网络时代的爱迪生”的技术狂人,在短短的二十年间,创造了无数令人心动的软件。在MIT的BBS上曾有一个帖子,说微软电话面试有一道题,问“Who do you think is the best coder, and why?”虽然回复的帖子中大家都声明列举的best coder排名不分先后,然而大多数人仍把Bill Joy列在第一位,或许可以从一个侧面验证Bill Joy在广大Programmer心目中的地位吧。
Joshua Bloch : Java 2 元勋
文/莫映
早在1996年,适逢Java刚刚崭露头角,年内好事连连。先是1月份发布JDK 1.0,然后是5月底在旧金山召开首届JavaOne大会,年末又是JDK 1.1紧跟其后。正是在Java技术如火如荼、大展拳脚的背景之下,Joshua Bloch来到了Sun,开始了他带领Java社区步入“迦南美地”的漫长历程。
很快,他被从安全组调入核心平台组,从事底层API设计。至此以后,每逢JDK的重大版本发布,总能在其中见到Joshua的“妙笔”。JDK 1.1中的java.math、1.4中的assertions,还有大家所熟识的Collections Framework皆是Joshua一手打造。其中的Collections Framework还获得了当年的Jolt大奖。到了J2SE 5.0研发阶段,身为平台组构架师的Joshua接掌了Tiger大旗,其核心地位已然无人可以替代。作为Tiger的代言人和领路人,没有谁比Joshua更清楚Tiger。相信大家一定还记得Joshua当年仿效英国诗人William Blake所做的咏Tiger诗八首,优雅的笔调,透出大师深厚底蕴的同时,也道出了Tiger的几大重要特性,这些特性是自JDK 1.1引入Inner Class以来,Java最大的语法改进。
Java风雨十年,从JDK 1.1到J2SE 5.0,Joshua实在功不可没。难怪有人戏言,假如将James Gosling比作Java之父,那么Joshua就是一手将Java “哺育”成人的Java之母。Joshua对Java的贡献还不止于JDK,提起他的大作《Effective Java》(Addison Wesley, 2001),相信Java粉丝们一定耳熟能详。该书荣膺2002年度Jolt大奖,且备受James Gosling推崇。书中57条颇具实用价值的经验规则,来自Joshua多年来在JDK开发工作中,尤其是Collections Framework设计中的实践心得,各个有理有据,剖析深入,也足见其深厚功力。该书对Java社群的影响,犹如C++社群中的《Effective C++》。Joshua对JCP的贡献也不小。他是JSR201和JSR175的领导者,前者包含了Tiger四大语言特性,后者则为Java提供了元数据支持。此外,他还是JSR166的发起人之一(该JSR由Doug Lea领导),并且是许多其他JSR的参与者。Joshua目前是JCP为数不多的几个执行委员会成员之一。
Joshua Bloch给人的印象是谦逊平和,行事低调而不喜抛头露面,一个典型的技术人员和实干家。不过即便如此,也丝毫不会减弱他对Java技术的卓越贡献和对Java社区的绝对影响力。有人说,如果他能更彰显一些,就很有可能成为Java开发者中的领军人物,就有如Don Box之于微软社群。
2004年7月初,就在Tiger发布在即之时,就在Jusha Bloch刚刚荣获Sun“杰出工程师(Distinguished Engineer)”的称号之时,他突然离开Sun而去了正值发展态势迅猛的Google。当他离开Sun的消息在TSS发布之后,众多拥趸表达了怀念与不舍之情。一年过去了,我们还没有获知Joshua的任何近闻,似乎又是他行事低调的一贯作风所致,不知他在Google状况如何。希望Joshua依然能继续“摩西未尽的事业”,以他的影响力推动Java社群继续前行。据称,《Effective Java》的下一版会加入Java 5.0的部分,让我们翘首以待吧。
Bruce Eckel : 功勋卓著的机会主义分子
文/孟岩
Bruce Eckel原本是一位普通的汇编程序员。不知道是什么因缘际会,他转行去写计算机技术图书,却在此大红大紫。他成功的秘诀不外乎两点:超人的表达能力和捕捉机会的能力。他最早的一本书是1990年代初期的《C++ Inside & Out》,随后,在1995年他写出了改变自己命运的《Thinking in C++》。如果说这本书充分表现了他作为优秀技术作家的一面,那么随后他写作《Thinking in Java》并因此步入顶级技术作家行列,则体现了他作为优秀的机会主义分子善于捕捉机会的另一面。写作中擅长举浅显直接的小例子来说明问题,语言生动,娓娓道来,特别适合于缺乏实践经验的初学者。因此《Thinking in Java》俨然成为天字第一号的Java教科书,对Java的普及与发展发挥着不可忽略的作用。不过公允地说,Bruce Eckel的书欠深刻。比如在“Thinking in…”系列中对设计模式的解说就有失大师水准。这一方面是因为书的定位非常清晰,另一方面也是因为Bruce太过分心赶潮流,未能深入之故。TIJ之后,他预言Python将火,就匆匆跑去写了半本《Thinking in Python》。后来Python并未如期而旺,于是他也就把书稿撂在那里不过问了,机会主义的一面暴露无遗。我们也可以善意的猜测一下,他的下一个投机对象会是什么呢?Ruby?.NET?MDA?总之,是什么我都不奇怪。
Rickard Oberg :J2EE奇才
文/熊节
Oberg的作品很多,流行的代码生成工具XDoclet和MVC框架WebWork都出自他的手笔。这两个框架有一个共同的特点,即它们的功能虽然简单,但设计都非常优雅灵活,能够很方便地扩展新功能甚至移植到新环境下使用。优雅的设计源自Oberg的过人才华,简单的功能则折射出他玩世不恭的人生态度。正是这两种特质的融合,才造就了这个不世出的奇才。
1999年,JDK 1.3发布,其中带来了一个重要的新特性:动态代理(Dynamic Proxy)。当所有人都还在对这项新技术的用途感到迷惑时,Oberg发现用它便可以轻松攻克EJB容器实现中的一些难关。这一发现的产物就是一本《Mastering RMI》,以及大名鼎鼎的JBoss应用服务器。但Oberg很快又让世人见识了他的玩世不恭。由于和总经理Marc Fleury在经营理念上不合,Oberg抱怨“法国的天空总让我感到压抑”,甩手离开了自己一手打造的JBoss。此后的几年里,他和老友Hani Suleiman不断地对JBoss的“专业开源”模式和Marc Fleury的商人味道冷嘲热讽,让众人为他的孩子气扼腕叹息。
2002年10月,微软推出Petstore示例应用的.NET版本,并宣称其性能比Java Petstore高出数倍。正是Oberg深入分析这个示例应用的源代码,在第一时间指出它大量运用了SQL Server专有的特性,性能对比根本不具参考价值。后来Oberg又先后关注了AOP和IoC容器,两者都成为了J2EE架构的新宠。
Doug Lea : 世界上对Java影响力最大的个人
文/KIT
如果IT的历史,是以人为主体串接起来的话,那么肯定少不了Doug Lea。这个鼻梁挂着眼镜,留着德王威廉二世的胡子,脸上永远挂着谦逊腼腆笑容,服务于纽约州立大学Oswego分校计算器科学系的老大爷。
说他是这个世界上对Java影响力最大的个人,一点也不为过。因为两次Java历史上的大变革,他都间接或直接的扮演了举足轻重的脚色。一次是由JDK 1.1到JDK 1.2,JDK1.2很重要的一项新创举就是Collections,其Collection的概念可以说承袭自Doug Lea于1995年发布的第一个被广泛应用的collections;一次是2004年所推出的Tiger。Tiger广纳了15项JSRs(Java Specification Requests)的语法及标准,其中一项便是JSR-166。JSR-166是来自于Doug编写的util.concurrent包。
值得一提的是: Doug Lea也是JCP (Java小区项目)中的一员。
Doug是一个无私的人,他深知分享知识和分享苹果是不一样的,苹果会越分越少,而自己的知识并不会因为给了别人就减少了,知识的分享更能激荡出不一样的火花。《Effective JAVA》这本Java经典之作的作者Joshua Blosh便在书中特别感谢Doug是此书中许多构想的共鸣板,感谢Doug大方分享丰富而又宝贵的知识。这位并发编程的大师级人物的下一步,将会带给Java怎样的冲击,不禁令人屏息以待。
Scott McNealy :SUN十年来的掌舵者
文/KIT
McNealy,Sun的CEO、总裁兼董事长。他曾经狂傲的说:“摧毁微软是我们每个人的任务。”这位英勇的硅谷英雄,似乎带头起义,试图组织一个反微软阵线联盟,以对抗微软这股庞大的托拉斯恶势力。他时常口出惊人之语,在公开场合大肆的批评微软,并曾经说微软的.NET是.NOT。
Scott McNealy先后毕业于哈佛大学及史丹佛大学,分别持有经济学学士学位及企管硕士。1982年MBA毕业的他和三个同学共同合伙创建了Sun,并于1984年成为Sun的执行官。“要么吞了别人,不然就被别人吞了”是Scott McNealy的名言录之一。他擅长以信念带动员工,鼓舞士气。极富自信的他,对于认定的事,总是坚持自己的想法,因此有人形容他是一个刚愎自用的决策者。
身为Sun这艘船的掌舵者,Scott McNealy能够看多远,Sun就能走多远。Scott McNealy认为将来软件界是一个只有服务,没有产品的世代。他希望打造出Sun不是一个纯靠硬件赚钱的公司。从Open Source到Open Solaris,Sun希望可以成为提供整合性解决方案的服务厂商。Solaris 10 + UltraSPARC是否可以像Scott McNealy希望的是下一匹世纪黑马呢?Sun是否能以股价来证明华尔街分析师及普罗大众的诽短流长?Scott McNealy是否能带领着Sun成为继微软之后的下一个巨人,一场场IT界的争霸战值得我们拭目以待。
Rod Johnson : 用一本书改变了Java世界的人
文/ 刘铁锋
Rod在悉尼大学不仅获得了计算机学位,同时还获得了音乐学位。更令人吃惊的是在回到软件开发领域之前,他还获得了音乐学的博士学位。有着相当丰富的C/C++技术背景的Rod早在1996年就开始了对Java服务器端技术的研究。他是一个在保险、电子商务和金融行业有着丰富经验的技术顾问,同时也是JSR-154(Servlet 2.4)和JDO 2.0的规范专家、JCP的积极成员。
真正引起了人们的注意的,是在2002年Rod Johnson根据多年经验撰写的《Expert One-on-One J2EE Design and Development》。其中对正统J2EE架构的臃肿、低效的质疑,引发了人们对正统J2EE的反思。这本书也体现了Rod Johnson对技术的态度,技术的选择应该基于实证或是自身的经验,而不是任何形式的偶像崇拜或者门户之见。正是这本书真正地改变了Java世界。基于这本书的代码,Rod Johnson创建了轻量级的容器Spring。Spring的出现,使得正统J2EE架构一统天下的局面被打破。基于Struts+Hibernate+Spring的J2EE架构也逐渐得到人们的认可,甚至在大型的项目架构中也逐渐开始应用。
Rod Johnson的新作《Expert One-on-one J2EE Development without JEB》则更让人吃惊,单单“Without EJB”一词就会让大多数J2EE架构师大跌眼镜了。不过Rod Johnson可能仅仅是想通过“Without EJB”一词表明应该放开门户之见。这也是Rod Johnson一贯的作风,。也许正是这种思想,促使得Rod Johnson创建了Spring,真正改变了Java世界。
Alan Kay :Java的精神先锋
文/徐昊
Sun的官方Java教材中有一句话,说Java是“C++的语法与Smalltalk语义的结合”。而Smalltalk的创造者就是Alan Kay。
Alan Kay于1970年加入Xerox公司的Palo Alto研究中心。早在70年代初期,Alan Kay等人开发了世界上第二个面向对象语言Smalltalk,因此,Alan Kay被誉为Smalltalk之父。2003年,Alan Key因为在面向对象程序设计上的杰出贡献,获得了有计算机界的诺贝尔奖之称的ACM Turing Award。
Alan Kay成名于Smapltalk和OOP,而Java虽然在语言上类似于C,但是在语义上非常接近Smalltalk,很多Java中的设计思想在Alan Kay的文献中找到根源,也有些人将Alan Kay尊为Java思想的先驱。不过遗憾的是似乎Alan Kay老先生对Java并不买账,反倒攻击说Java是存在致命缺陷的编程语言,Java的成功不是由于Java本身的内在价值,而是其商业化的成功。Alan Kay欣赏的是Lisp,他认为Lisp是软件的麦克斯韦方程,其中的许多想法是软件工程和计算机科学的一部分。看来拥有Alan Kay这样一位重量级的Java先驱仍是我们Java一厢情愿的单恋吧。
Kent Beck : 领导的敏捷潮
文:刘铁锋
Beck全家似乎都弥漫着技术的味道。生长在硅谷, 有着一个对无线电痴迷的祖父,以及一个电器工程师父亲。从小就引导Kent Beck成为了业余无线电爱好者。
在俄勒冈州大学读本科期间,Kent Beck就开始研究起模式。然而在他最终拿到计算机学位之前,他却是在计算机和音乐中交替学习。似乎Java大师都能够有这样的能耐,另一Java大牛Rod Johnson同样也拥有音乐学的博士学位。
Kent Beck一直倡导软件开发的模式定义。早在1993年,他就和Grady Booch(UML之父)发起了一个团队进行这个方面的研究。虽然著有了《Smalltalk Best Practice Patterns》一书,但这可能并不是Kent Beck最大的贡献。他于1996年在DaimlerChrysler启动的关于软件开发的项目,才真正地影响后来的软件开发。这次的杰作就是XP(极限编程)的方法学。
和软件开发大师Martin Fowler合著的《Planning Extreme Programming》可谓是关于XP的奠基之作。从此,一系列的作品如《Test Driven Development: By Example》,《Extreme Programming Explained: Embrace Change》让更多的人领略到了极限编程的精髓,也逐步导致了极限编程的流行。
Kent Beck的贡献远不仅如此。对于众多的Java程序员来说,他和Erich Gamma共同打造的JUnit,意义更加重大。也许正式这个简单而又强大的工具,让众多的程序员更加认可和信赖极限编程,从而引起了Java敏捷开发的狂潮吧。
十大产品
Sun JDK :Java的基石
文/莫映
众所周知,流传于市的JDK不单Sun一家,比如IBM的JDK、BEA的JRocket、GNU的GCJ,以及如Kaffe这样的开源实现,不一而足。但是,根正苗红的Sun官方JDK一直以来都是备受瞩目的主流,它对Java社区的影响也是举足轻重。
1996年1月,Sun在成立了JavaSoft部门之后,推出了JDK 1.0,这是Sun JDK(Java Development Kit)的首个正式版本;当年12月,JDK1.1出炉。该版除了对前序版本部分特性做了改进以外,重写了AWT,采用了新的事件模型。1998年12月,JDK 1.2正式发布。此时的类库日臻完善,API已从当初的200个类发展到了1600个类。在1.2版本中引入了用100%纯Java代码写就的Swing,同时,Sun将Java更名为Java 2。
1999年,Java 技术形成了J2SE、J2EE和J2ME三大格局。Sun向世人公布了Java HotSpot性能引擎技术的研究成果。HotSpot旨在进一步改善JVM性能,提高Java ByteCode的产生品质,加快Java应用程序的执行速度。J2SE 1.3发布于2000年;2002年2月间,J2SE 1.4问世,这是有JCP参与以来首个J2SE的发行版本。2004年9月30日,代号为“Tiger”的J2SE 5.0终于出笼了,这次发布被誉为Java平台历来发布中特性变动最大的一次。包括泛型在内的若干重大语法改进、元数据支持,包括多线程、JDBC在内的多项类库改进,都令广大Java程序员激动不已。自此,Sun的官方JDK(J2SE Development Kit)已经步入了一个新的高度。
Eclipse :以架构赢天下
文/恶魔
IBM是在2001年以4000万美元种子基金成立Eclipse联盟,并且捐赠了不少程序代码。如今,该组织有91个会员,包含许多全球最大的软件商。根据Evans Data公司的资料,Eclipse是目前最受欢迎的Java开发工具。
Java厂商若要共同对抗微软,彼此之间就要有共同的开发工具才行。
在Eclip