ivaneeo's blog

自由的力量,自由的生活。

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks

#

1. in effect 实际上
2.
inhabit [inˊhæbit] v. 居住于,占据
posted @ 2006-01-01 16:39 ivaneeo 阅读(345) | 评论 (0)编辑 收藏

1. accompany [әˊkʌmpәni] v. 陪伴,带有
3. affect [әˊfekt] v. 影响
2.
at once 立刻,马上;同时
posted @ 2006-01-01 16:07 ivaneeo 阅读(354) | 评论 (0)编辑 收藏

1. chiefly [ˊtʃiːfli] ad. 主要地
2. combine [kәmˊbain] v. 联合,结合;
3. compound [ˊkɒmpaund, kәmˊpaund] n. 混合物
4. conjure [ˊkʌndʒә,kәnˊdʒuә] vt. 想象, 使…出现于脑海中,想像出
posted @ 2006-01-01 15:47 ivaneeo 阅读(321) | 评论 (0)编辑 收藏

1. wherein [ˊwєәˊrin] int. 在何处,在其中;
posted @ 2006-01-01 15:32 ivaneeo 阅读(349) | 评论 (0)编辑 收藏

虽然Linux和Windows
NT/2000系统一样是一个多用户的系统,但是它们之间有不少重要的差别。对于很多习惯了Windows系统的管理员来讲,如何保证Linux操作系统安全、­可靠将会面临许多新的挑战。本文将重点介绍Linux系统安全的命令。

  passwd

  1.作用

  passwd命令原来修改账户的登陆密码,使用权限是所有用户。

  2.格式

  passwd [选项] 账户名称

  3.主要参数

  -l:锁定已经命名的账户名称,只有具备超级用户权限的使用者方可使用。

  -u:解开账户锁定状态,只有具备超级用户权限的使用者方可使用。

  -x, --maximum=DAYS:最大密码使用时间(天),只有具备超级用户权限的使用者方可使用。

  -n, --minimum=DAYS:最小密码使用时间(天),只有具备超级用户权限的使用者方可使用。

  -d:删除使用者的密码, 只有具备超级用户权限的使用者方可使用。

  -S:检查指定使用者的密码认证种类, 只有具备超级用户权限的使用者方可使用。

  4.应用实例

  $ passwd

  Changing password for user cao.

  Changing password for cao

  (current) UNIX password:

  New UNIX password:

  Retype new UNIX password:

  passwd: all authentication tokens updated successfully.

  从上面可以看到,使用passwd命令需要输入旧的密码,然后再输入两次新密码。

  su

  1.作用

  su的作用是变更为其它使用者的身份,超级用户除外,需要键入该使用者的密码。

  2.格式

  su [选项]... [-] [USER [ARG]...]

  3.主要参数

  -f , --fast:不必读启动文件(如 csh.cshrc 等),仅用于csh或tcsh两种Shell。

  -l , --login:加了这个参数之后,就好像是重新登陆为该使用者一样,大部分环境变量(例如HOME、SHELL和USER等)都是以该使用者(USER)为主­,并且工作目录也会改变。如果没有指定USER,缺省情况是root。

  -m, -p ,--preserve-environment:执行su时不改变环境变数。

  -c command:变更账号为USER的使用者,并执行指令(command)后再变回原来使用者。

  USER:欲变更的使用者账号,ARG传入新的Shell参数。

  4.应用实例

  变更账号为超级用户,并在执行df命令后还原使用者。

  su -c df root

  umask

  1.作用

  umask设置用户文件和目录的文件创建缺省屏蔽值,若将此命令放入profile文件,就可控制该用户后续所建文件的存取许可。它告诉系统在创建文件时不给谁­存取许可。使用权限是所有用户。

  2.格式

  umask [-p] [-S] [mode]

  3.参数

  -S:确定当前的umask设置。

  -p:修改umask 设置。

  [mode]:修改数值。

  4.说明

  传统Unix的umask值是022,这样就可以防止同属于该组的其它用户及别的组的用户修改该用户的文件。既然每个用户都拥有并属于一个自己的私有组,那么这­种"组保护模式"就不在需要了。严密的权限设定构成了Linux安全的基础,在权限上犯错误是致命的。需要注意的是,umask命令用来设置进程所创建的文件的­读写权限,最保险的值是0077,即关闭创建文件的进程以外的所有进程的读写权限,表示为-rw-------。在~/.bash_profile中,加上一行­命令umask
0077可以保证每次启动Shell后, 进程的umask权限都可以被正确设定。

  5.应用实例

  umask -S

  u=rwx,g=rx,o=rx

  umask -p 177

  umask -S

  u=rw,g=,o=

  上述5行命令,首先显示当前状态,然后把umask值改为177,结果只有文件所有者具有读写文件的权限,其它用户不能访问该文件。这显然是一种非常安全的设置­。

chgrp

  1.作用

  chgrp表示修改一个或多个文件或目录所属的组。使用权限是超级用户。

  2.格式

  chgrp [选项]... 组 文件...

  或

  chgrp [选项]... --reference=参考文件 文件...

  将每个<文件>的所属组设定为<组>。

  3.参数

  -c, --changes :像 --verbose,但只在有更改时才显示结果。

  --dereference:会影响符号链接所指示的对象,而非符号链接本身。

  -h, --no-dereference:会影响符号链接本身,而非符号链接所指示的目的地(当系统支持更改符号链接的所有者,此选项才有效)。

  -f, --silent, --quiet:去除大部分的错误信息。

  --reference=参考文件:使用<参考文件>的所属组,而非指定的<组>。

  -R, --recursive:递归处理所有的文件及子目录。

  -v, --verbose:处理任何文件都会显示信息。

  4.应用说明

  该命令改变指定指定文件所属的用户组。其中group可以是用户组ID,也可以是/etc/group文件中用户组的组名。文件名是以空格分开的要改变属组的文­件列表,支持通配符。如果用户不是该文件的属主或超级用户,则不能改变该文件的组。

  5.应用实例

  改变/opt/local /book/及其子目录下的所有文件的属组为book,命令如下:

  $ chgrp - R book /opt/local /book

  chmod

  1.作用

  chmod命令是非常重要的,用于改变文件或目录的访问权限,用户可以用它控制文件或目录的访问权限,使用权限是超级用户。

  2.格式

  chmod命令有两种用法。一种是包含字母和操作符表达式的字符设定法(相对权限设定);另一种是包含数字的数字设定法(绝对权限设定)。

  (1)字符设定法

  chmod [who] [+   -   =] [mode] 文件名

  ◆操作对象who可以是下述字母中的任一个或它们的组合

  u:表示用户,即文件或目录的所有者。

  g:表示同组用户,即与文件属主有相同组ID的所有用户。

  o:表示其它用户。

  a:表示所有用户,它是系统默认值。

  ◆操作符号

  +:添加某个权限。

  -:取消某个权限。

  =:赋予给定权限,并取消其它所有权限(如果有的话)。

  ◆设置mode的权限可用下述字母的任意组合

  r:可读。

  w:可写。

  x:可执行。

  X:只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x属性。

  s:文件执行时把进程的属主或组ID置为该文件的文件属主。方式"u+s"设置文件的用户ID位,"g+s"设置组ID位。

  t:保存程序的文本到交换设备上。

  u:与文件属主拥有一样的权限。

  g:与和文件属主同组的用户拥有一样的权限。

  o:与其它用户拥有一样的权限。

  文件名:以空格分开的要改变权限的文件列表,支持通配符。

  一个命令行中可以给出多个权限方式,其间用逗号隔开。

  (2) 数字设定法

  数字设定法的一般形式为:

  chmod [mode] 文件名

  数字属性的格式应为3个0到7的八进制数,其顺序是(u)(g)(o)文件名,以空格分开的要改变权限的文件列表,支持通配符。

  数字表示的权限的含义如下:0001为所有者的执行权限;0002为所有者的写权限;0004为所有者的读权限;
0010为组的执行权限;0020为组的写权限;0040为组的读权限;0100为其他人的执行权限;0200为其他人的写权限;0400为其他人的读权限;1­000为粘贴位置位;2000表示假如这个文件是可执行文件,则为组ID为位置位,否则其中文件锁定位置位;4000表示假如这个文件是可执行文件,则为用户I­D为位置位。

  3.实例

  如果一个系统管理员写了一个表格(tem)让所有用户填写,那么必须授权用户对这个文件有读写权限,可以使用命令:

  #chmod 666 tem

  上面代码中,这个666数字是如何计算出来的呢?0002为所有者的写权限,0004为所有者的读权限,0020为组的写权限,0040为组的读权限,0200­为其他人的写权限,0400为其他人的读权限,这6个数字相加就是666(注以上数字都是八进制数)。

  tem文件的权限是-rw-rw-rw-,即用户对这个文件有读写权限。

  如果用字符权限设定使用下面命令:

  #chmod a =wx tem

chown

  1.作用

  更改一个或多个文件或目录的属主和属组。使用权限是超级用户。

  2.格式

  chown [选项] 用户或组 文件

  3.主要参数

  --dereference:受影响的是符号链接所指示的对象,而非符号链接本身。

  -h, --no-dereference:会影响符号链接本身,而非符号链接所指示的目的地(当系统支持更改符号链接的所有者,此选项才有效)。

  --from=目前所有者:目前组只当每个文件的所有者和组符合选项所指定的,才会更改所有者和组。其中一个可以省略,这已省略的属性就不需要符合原有的属性。

  -f, --silent, --quiet:去除大部分的错误信息。

  -R, --recursive:递归处理所有的文件及子目录。

  -v, --verbose:处理任何文件都会显示信息。

  4.说明

  chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或用户ID;组可以是组名或组ID;文件是以空格分开的要改变权限的文件列表,支持通配符。­系统管理员经常使用chown命令,在将文件拷贝到另一个用户的目录下以后,让用户拥有使用该文件的权限。

  5.应用实例

  1.把文件shiyan.c的所有者改为wan

  $ chown wan shiyan.c

  2.把目录/hi及其下的所有文件和子目录的属主改成wan,属组改成users。

  $ chown - R wan.users /hi

  chattr

  1.作用

  修改ext2和ext3文件系统属性(attribute),使用权限超级用户。

  2.格式

  chattr [-RV] [-+=AacDdijsSu] [-v version] 文件或目录

  3.主要参数

  -R:递归处理所有的文件及子目录。

  -V:详细显示修改内容,并打印输出。

  -:失效属性。

  +:激活属性。

  = :指定属性。

  A:Atime,告诉系统不要修改对这个文件的最后访问时间。

  S:Sync,一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘。

  a:Append Only,系统只允许在这个文件之后追加数据,不允许任何进程覆盖或截断这个文件。如果目录具有这个属性,系统将只允许在这个目录下建立和修改文件,而不允许删­除任何文件。

  i:Immutable,系统不允许对这个文件进行任何的修改。如果目录具有这个属性,那么任何的进程只能修改目录之下的文件,不允许建立和删除文件。

  D:检查压缩文件中的错误。

  d:No dump,在进行文件系统备份时,dump程序将忽略这个文件。

  C:Compress,系统以透明的方式压缩这个文件。从这个文件读取时,返回的是解压之后的数据;而向这个文件中写入数据时,数据首先被压缩之后才写入磁盘。

  s:Secure Delete,让系统在删除这个文件时,使用0填充文件所在的区域。

  u:Undelete,当一个应用程序请求删除这个文件,系统会保留其数据块以便以后能够恢复删除这个文件。

  4.说明

  chattr命令的作用很大,其中一些功能是由Linux内核版本来支持的,如果Linux内核版本低于2.2,那么许多功能不能实现。同样-D检查压缩文件中­的错误的功能,需要2.5.19以上内核才能支持。另外,通过chattr命令修改属性能够提高系统的安全性,但是它并不适合所有的目录。chattr命令不能­保护/、/dev、/tmp、/var目录。

  5.应用实例

  1.恢复/root目录,即子目录的所有文件

  # chattr -R +u/root

  2.用chattr命令防止系统中某个关键文件被修改

  在Linux下,有些配置文件(passwd
,fatab)是不允许任何人修改的,为了防止被误删除或修改,可以设定该文件的"不可修改位(immutable)",命令如下:

  # chattr +i /etc/fstab

  sudo

  1.作用

  sudo是一种以限制配置文件中的命令为基础,在有限时间内给用户使用,并且记录到日志中的命令,权限是所有用户。

  2.格式

  sudo [-bhHpV] [-s ] [-u <用户>] [指令]

  sudo [-klv]

  3.主要参数

  -b:在后台执行命令。

  -h:显示帮助。

  -H:将HOME环境变量设为新身份的HOME环境变量。

  -k:结束密码的有效期,即下次将需要输入密码。

  -l:列出当前用户可以使用的命令。

  -p:改变询问密码的提示符号。

  -s :执行指定的Shell。

  -u <用户>:以指定的用户为新身份,不使用时默认为root。

  -v:延长密码有效期5分钟。

  4.说明

  sudo命令的配置在/etc/sudoers文件中。当用户使用sudo时,需要输入口令以验证使用者身份。随后的一段时间内可以使用定义好的命令,当使用配­置文件中没有的命令时,将会有报警的记录。sudo是系统管理员用来允许某些用户以root身份运行部分/
全部系统命令的程序。一个明显的用途是增强了站点的安全性,如果需要每天以超级用户的身份做一些日常工作,经常执行一些固定的几个只有超级用户身份才能执行的命­令,那么用sudo是非常适合的。

ps

  1.作用

  ps显示瞬间进程 (process) 的动态,使用权限是所有使用者。

  2.格式

  ps [options] [--help]

  3.主要参数

  ps的参数非常多, 此出仅列出几个常用的参数。

  -A:列出所有的进程。

  -l:显示长列表。

  -m:显示内存信息。

  -w:显示加宽可以显示较多的信息。

  -e:显示所有进程。

  -a:显示终端上的所有进程,包括其它用户的进程。

  -au:显示较详细的信息。

  -aux:显示所有包含其它使用者的进程。

  4.说明

  要对进程进行监测和控制,首先要了解当前进程的情况,也就是需要查看当前进程。ps命令就是最基本、也是非常强大的进程查看命令。使用该命令可以确定有哪些进程­正在运行、运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过多的资源等。图2给出了ps-
aux命令详解。大部分信息都可以通过执行该命令得到。最常用的三个参数是u、a、x。下面就结合这三个参数详细说明ps命令的作用:ps aux

  第2行代码中,USER表示进程拥有者;PID表示进程标示符;%CPU表示占用的CPU使用率;%MEM占用的物理内存使用率;VSZ表示占用的虚拟内存大小­;RSS为进程占用的物理内存值;TTY为终端的次要装置号码。

  STAT表示进程的状态,其中D为不可中断的静止(I/O动作);R正在执行中;S静止状态;T暂停执行;Z不存在,但暂时无法消除;W没有足够的内存分页可分­配;高优先序的进程;N低优先序的进程;L有内存分页分配并锁在内存体内
(实时系统或 I/O)。START为进程开始时间。TIME为执行的时间。COMMAND是所执行的指令。

  4.应用实例

  在进行系统维护时,经常会出现内存使用量惊人,而又不知道是哪一个进程占用了大量进程的情况。除了可以使用top命令查看内存使用情况之外,还可以使用下面的命­令:

  ps aux   sort +5n

  who

  1.作用

  who显示系统中有哪些用户登陆系统,显示的资料包含了使用者ID、使用的登陆终端、上线时间、呆滞时间、CPU占用,以及做了些什么。 使用权限为所有用户。

  2.格式

  who - [husfV] [user]

  3.主要参数

  -h:不要显示标题列。

  -u:不要显示使用者的动作/工作。

  -s:使用简短的格式来显示。

  -f:不要显示使用者的上线位置。

  -V:显示程序版本。

  4.说明

  该命令主要用于查看当前在线上的用户情况。如果用户想和其它用户建立即时通信,比如使用talk命令,那么首先要确定的就是该用户确实在线上,不然talk进程­就无法建立起来。又如,系统管理员希望监视每个登录的用户此时此刻的所作所为,也要使用who命令。who
命令应用起来非常简单,可以比较准确地掌握用户的情况,所以使用非常广泛。

  动手练习

  1.使用Linux命令检测系统入侵者

  安装过Mandrake Linux和Red Hat
Linux的用户都会知道,Linux系统会内置三种不同级别(标准、高、更高)的防火墙,当进行了Linux服务器的安装和一些基本的设置后,服务器应该说是­比较安全的,但是也会有黑客通过各种方法利用系统管理员的疏忽侵入系统。如何快速查找黑客非常重要。一般来说,可以使用命令查询黑客是否入侵,见表
1。

  举例说明,如果黑客嗅探网络,那么它必须使网卡接口处于混杂模式,使用下面命令进行查询:

  #ifconfig -a

  eth0 Link encap:Ethernet HWaddr 00:00:E8:A0:25:86

  inet addr:192.168.1.7 Bcast:192.168.1.255 Mask:255.255.255.0

  UP BROADCAST RUNNING PROMISCUOUS MTU:1500 Metric:1

  ......

  从这个命令的输出中,可以看到上面讲到的这些概念。第一行的00:00:E8:A0:25:86是mac地址,第二行的192.168.1.7是IP地址,第四­行讲的是接收数据状态,这时正在被黑客嗅探。一般而言,网卡有几种接收数据帧的状态,如
Broadcast、Multicast、Promiscuous等。Broadcast是指接收所有类型为广播报文的数据帧;Multicast是指接收特定­的组播报文;Promiscuous则是通常说的混杂模式,是指对报文中的目的硬件地址不加任何检查、全部接收的工作模式。

  2.限制su命令的滥用

  我们知道,超级用户在Linux中有最大的权利,几乎所有黑客都想得到这个目标。Linux可以增加对切换到超级用户的限制。使用PAM(Pluggable
Authentication Modules)可以禁止除在wheel组以外的任何人su成root,修改/etc/pam.d/su文件,除去屏蔽标识#。使用
/usr/sbin/usermod G10 bjecadm将bjecadm这个账号加入gid为10的组,就是wheel组。命令如下:

  /etc/pam.d/su # 使用密码验证#

  auth sufficient /lib/security/pam_wheel.so debug

  # 限制只有wheel组用户才可以切换到root#

  auth required /lib/security/pam_wheel.so use_uid

  chmod -G10 bjecadm

  另外,每当用户试图使用su命令进入系统用户时,命令将在/usr/adm/sulog文件中写一条信息,若该文件记录了大量试图用su进入root的无效操作­信息,则表明了可能有人企图破译root口令。

  Linux命令有着强大的功能。对于Linux系统管理员来说,往往只需要通过各种安全命令技巧,组合构成安全防线。从计算机安全的角度看,世界上没有绝对安全­的计算机系统,Linux系统也不例外。

posted @ 2005-12-22 11:13 ivaneeo 阅读(325) | 评论 (0)编辑 收藏

(1)
类名首字母应该大写。字段、方法以及对象(句柄)的首字母应小写。对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母。例如:
ThisIsAClassName
thisIsMethodOrFieldName
若在定义中出现了常数初始化字符,则大写static
final基本类型标识符中的所有字母。这样便可标志出它们属于编译期的常数。
Java包(Package)属于一种特殊情况:它们全都是小写字母,即便中间的单词亦是如此。对于域名扩展名称,如com,org,net或者edu等,全部­都应小写(这也是Java
1.1和Java 1.2的区别之一)。

(2)
为了常规用途而创建一个类时,请采取"经典形式",并包含对下述元素的定义:

equals()
hashCode()
toString()
clone()(implement Cloneable)
implement Serializable

(3)
对于自己创建的每一个类,都考虑置入一个main(),其中包含了用于测试那个类的代码。为使用一个项目中的类,我们没必要删除测试代码。若进行了任何形式的改­动,可方便地返回测试。这些代码也可作为如何使用类的一个示例使用。

(4)
应将方法设计成简要的、功能性单元,用它描述和实现一个不连续的类接口部分。理想情况下,方法应简明扼要。若长度很大,可考虑通过某种方式将其分割成较短的几个­方法。这样做也便于类内代码的重复使用(有些时候,方法必须非常大,但它们仍应只做同样的一件事情)。

(5)
设计一个类时,请设身处地为客户程序员考虑一下(类的使用方法应该是非常明确的)。然后,再设身处地为管理代码的人考虑一下(预计有可能进行哪些形式的修改,想­想用什么方法可把它们变得更简单)。
(6)
使类尽可能短小精悍,而且只解决一个特定的问题。下面是对类设计的一些建议:
■一个复杂的开关语句:考虑采用"多形"机制
■数量众多的方法涉及到类型差别极大的操作:考虑用几个类来分别实现
■许多成员变量在特征上有很大的差别:考虑使用几个类

(7)
让一切东西都尽可能地"私有"--private。可使库的某一部分"公共化"(一个方法、类或者一个字段等等),就永远不能把它拿出。若强行拿出,就可能破坏­其他人现有的代码,使他们不得不重新编写和设计。若只公布自己必须公布的,就可放心大胆地改变其他任何东西。在多线程环境中,隐私是特别重要的一个因素--只有­private字段才能在非同步使用的情况下受到保护。

(Cool
谨惕"巨大对象综合症"。对一些习惯于顺序编程思维、且初涉OOP领域的新手,往往喜欢先写一个顺序执行的程序,再把它嵌入一个或两个巨大的对象里。根据编程原­理,对象表达的应该是应用程序的概念,而非应用程序本身。

(9)
若不得已进行一些不太雅观的编程,至少应该把那些代码置于一个类的内部。

(10)
任何时候只要发现类与类之间结合得非常紧密,就需要考虑是否采用内部类,从而改善编码及维护工作(参见第14章14.1.2小节的"用内部类改进代码")。

(11)
尽可能细致地加上注释,并用javadoc注释文档语法生成自己的程序文档。

(12)
避免使用"魔术数字",这些数字很难与代码很好地配合。如以后需要修改它,无疑会成为一场噩梦,因为根本不知道"100"到底是指"数组大小"还是"其他全然不­同的东西"。所以,我们应创建一个常数,并为其使用具有说服力的描述性名称,并在整个程序中都采用常数标识符。这样可使程序更易理解以及更易维护。

(13)
涉及构建器和异常的时候,通常希望重新丢弃在构建器中捕获的任何异常--如果它造成了那个对象的创建失败。这样一来,调用者就不会以为那个对象已正确地创建,从­而盲目地继续。

(14)
当客户程序员用完对象以后,若你的类要求进行任何清除工作,可考虑将清除代码置于一个良好定义的方法里,采用类似于cleanup()这样的名字,明确表明自己­的用途。除此以外,可在类内放置一个boolean(布尔)标记,指出对象是否已被清除。在类的finalize()方法里,请确定对象已被清除,并已丢弃了从­RuntimeException继承的一个类(如果还没有的话),从而指出一个编程错误。在采取象这样的方案之前,请确定
finalize()能够在自己的系统中工作(可能需要调用System.runFinalizersOnExit(true),从而确保这一行为)。

(15)
在一个特定的作用域内,若一个对象必须清除(非由垃圾收集机制处理),请采用下述方法:初始化对象;若成功,则立即进入一个含有finally从句的try块,­开始清除工作。

(16)
若在初始化过程中需要覆盖(取消)finalize(),请记住调用super.finalize()(若Object属于我们的直接超类,则无此必要)。在对­finalize()进行覆盖的过程中,对super.finalize()的调用应属于最后一个行动,而不应是第一个行动,这样可确保在需要基础类组件的时候­它们依然有效。

(17)
创建大小固定的对象集合时,请将它们传输至一个数组(若准备从一个方法里返回这个集合,更应如此操作)。这样一来,我们就可享受到数组在编译期进行类型检查的好­处。此外,为使用它们,数组的接收者也许并不需要将对象"造型"到数组里。

(18)
尽量使用interfaces,不要使用abstract类。若已知某样东西准备成为一个基础类,那么第一个选择应是将其变成一个interface
(接口)。只有在不得不使用方法定义或者成员变量的时候,才需要将其变成一个abstract(抽象)类。接口主要描述了客户希望做什么事情,而一个类则致力于­(或允许)具体的实施细节。

(19)
在构建器内部,只进行那些将对象设为正确状态所需的工作。尽可能地避免调用其他方法,因为那些方法可能被其他人覆盖或取消,从而在构建过程中产生不可预知的结果­(参见第7章的详细说明)。

(20)
对象不应只是简单地容纳一些数据;它们的行为也应得到良好的定义。

(21)
在现成类的基础上创建新类时,请首先选择"新建"或"创作"。只有自己的设计要求必须继承时,才应考虑这方面的问题。若在本来允许新建的场合使用了继承,则整个­设计会变得没有必要地复杂。

(22)
用继承及方法覆盖来表示行为间的差异,而用字段表示状态间的区别。一个非常极端的例子是通过对不同类的继承来表示颜色,这是绝对应该避免的:应直接使用一个"颜­色"字段。

(23)
为避免编程时遇到麻烦,请保证在自己类路径指到的任何地方,每个名字都仅对应一个类。否则,编译器可能先找到同名的另一个类,并报告出错消息。若怀疑自己碰到了­类路径问题,请试试在类路径的每一个起点,搜索一下同名的.class文件。

(24) 在Java 1.1
AWT中使用事件"适配器"时,特别容易碰到一个陷阱。若覆盖了某个适配器方法,同时拼写方法没有特别讲究,最后的结果就是新添加一个方法,而不是覆盖现成方法­。然而,由于这样做是完全合法的,所以不会从编译器或运行期系统获得任何出错提示--只不过代码的工作就变得不正常了。

(25)
用合理的设计方案消除"伪功能"。也就是说,假若只需要创建类的一个对象,就不要提前限制自己使用应用程序,并加上一条"只生成其中一个"注释。请考虑将其封装­成一个"独生子"的形式。若在主程序里有大量散乱的代码,用于创建自己的对象,请考虑采纳一种创造性的方案,将些代码封装起来。

(26)
警惕"分析瘫痪"。请记住,无论如何都要提前了解整个项目的状况,再去考察其中的细节。由于把握了全局,可快速认识自己未知的一些因素,防止在考察细节的时候陷­入"死逻辑"中。

(27)
警惕"过早优化"。首先让它运行起来,再考虑变得更快--但只有在自己必须这样做、而且经证实在某部分代码中的确存在一个性能瓶颈的时候,才应进行优化。除非用­专门的工具分析瓶颈,否则很有可能是在浪费自己的时间。性能提升的隐含代价是自己的代码变得难于理解,而且难于维护。

(28)
请记住,阅读代码的时间比写代码的时间多得多。思路清晰的设计可获得易于理解的程序,但注释、细致的解释以及一些示例往往具有不可估量的价值。无论对你自己,还­是对后来的人,它们都是相当重要的。如对此仍有怀疑,那么请试想自己试图从联机Java文档里找出有用信息时碰到的挫折,这样或许能将你说服。

(29)
如认为自己已进行了良好的分析、设计或者实施,那么请稍微更换一下思维角度。试试邀请一些外来人士--并不一定是专家,但可以是来自本公司其他部门的人。请他们­用完全新鲜的眼光考察你的工作,看看是否能找出你一度熟视无睹的问题。采取这种方式,往往能在最适合修改的阶段找出一些关键性的问题,避免产品发行后再解决问题­而造成的金钱及精力方面的损失。

(30)
良好的设计能带来最大的回报。简言之,对于一个特定的问题,通常会花较长的时间才能找到一种最恰当的解决方案。但一旦找到了正确的方法,以后的工作就轻松多了,­再也不用经历数小时、数天或者数月的痛苦挣扎。我们的努力工作会带来最大的回报(甚至无可估量)。而且由于自己倾注了大量心血,最终获得一个出色的设计方案,成­功的快感也是令人心动的。坚持抵制草草完工的诱惑--那样做往往得不偿失

posted @ 2005-12-22 11:08 ivaneeo 阅读(361) | 评论 (0)编辑 收藏

        安装SQL Server2000的时候,安装程序提示我安装程序被挂起,让我重新启动电脑,但我即便是重新启动了再次安装,SQL Server2000的安装程序依旧提示我这个错误。看来重起并不能解除被挂起的安装程序。
         查阅了资料,得知要解决这个问题需要删除注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Control\Session Manager下的PendingFileRenameOperations子键。
posted @ 2005-12-20 19:04 ivaneeo 阅读(661) | 评论 (0)编辑 收藏

SN:  
CD-KEY:DG8FV-B9TKY-FRT9J-6CRCC-XPQ4G
如果选择手动安装,请使用下列CD-KEY:
联想 OEM CD-KEY: FCDGH-QW3DJ-VBC6C-9BYTX-4GKQJ
零售版  CD-KEY: TFX2K-BM8X6-WF93M-MWTWK-FF2KG
免激活版 CD-KEY: JWMRW-3TTHK-P7BRQ-YJXBF-VVTBQ
posted @ 2005-12-13 17:43 ivaneeo 阅读(14416) | 评论 (7)编辑 收藏

http://www.narchitecture.net/
posted @ 2005-12-12 21:16 ivaneeo 阅读(268) | 评论 (0)编辑 收藏

1 level ['levl] n. 水平, 级别
posted @ 2005-12-04 20:49 ivaneeo 阅读(383) | 评论 (0)编辑 收藏

仅列出标题
共67页: First 上一页 28 29 30 31 32 33 34 35 36 下一页 Last