<?xml version="1.0" encoding="GBK" ?>
<rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dcterms="http://purl.org/dc/terms/">
 <channel>
  	  <title><![CDATA[临界值(Critical Value)]]></title>
	  <link>http://blog.163.com/yhb_4323</link>
	  <description><![CDATA[ 打开别人的空间听心情:) ]]></description>
	  <language>zh-CN</language>
	  <pubDate>Mon, 22 Jun 2009 17:30:21 +0800</pubDate>
	  <lastBuildDate>Mon, 22 Jun 2009 17:30:21 +0800</lastBuildDate>
	  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
	  <generator><![CDATA[NetEase Space]]></generator>
	  <managingEditor><![CDATA[yhb_4323]]></managingEditor>
	  <webMaster><![CDATA[<a title="1">小海]]></webMaster>
		  <ttl>120</ttl>
	  <image>
	  	<title><![CDATA[临界值(Critical Value)]]></title>
	  	<url>http://ava.bimg.126.net/photo/7ek_9mxAE42leLK2R4DCqw==/174514485560725445.jpg</url>
	  	<link>http://blog.163.com/yhb_4323</link>
	  </image>
  <item>
  	<title><![CDATA[Grep学习笔记]]></title>	
    <link>http://blog.163.com/yhb_4323/blog/static/23363479200871644336669</link>
    <description><![CDATA[<div><DIV lang=en>
<DIV>
<DIV>
<DIV>
<H2 style="CLEAR: both">1.&nbsp;grep简介</H2></DIV></DIV>
<DIV></DIV></DIV>
<P>grep （global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来）是一种强大的文本搜索工具，它能使用正则表达式搜索文本，并把匹配的行打印出来。Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展，支持更多的re元字符， fgrep就是fixed grep或fast grep，它们把所有的字母都看作单词，也就是说，正则表达式中的元字符表示回其自身的字面意义，不再特殊。linux使用GNU版本的grep。它功能更强，可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。</P>
<P>grep的工作方式是这样的，它在一个或多个文件中搜索字符串模板。如果模板包括空格，则必须被引用，模板后的所有字符串被看作文件名。搜索的结果被送到屏幕，不影响原文件内容。</P>
<P>grep可用于shell脚本，因为grep通过返回一个状态值来说明搜索的状态，如果模板搜索成功，则返回0，如果搜索不成功，则返回1，如果搜索的文件不存在，则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。</P></DIV>
<DIV lang=en>
<DIV>
<DIV>
<DIV>
<H2 style="CLEAR: both"><A></A>2.&nbsp;grep正则表达式元字符集（基本集）</H2></DIV></DIV>
<DIV></DIV></DIV>
<DIV>
<DL>
<DT><SPAN>^</SPAN> 
</DT><DD>
<P>锚定行的开始 如：'^grep'匹配所有以grep开头的行。 </P>
</DD><DT><SPAN>$</SPAN> 
</DT><DD>
<P>锚定行的结束 如：'grep$'匹配所有以grep结尾的行。 </P>
</DD><DT><SPAN>.</SPAN> 
</DT><DD>
<P>匹配一个非换行符的字符 如：'gr.p'匹配gr后接一个任意字符，然后是p。 </P>
</DD><DT><SPAN>*</SPAN> 
</DT><DD>
<P>匹配零个或多个先前字符 如：'*grep'匹配所有一个或多个空格后紧跟grep的行。 .*一起用代表任意字符。</P>
</DD><DT><SPAN>[]</SPAN> 
</DT><DD>
<P>匹配一个指定范围内的字符，如'[Gg]rep'匹配Grep和grep。 </P>
</DD><DT><SPAN>[^]</SPAN> 
</DT><DD>
<P>匹配一个不在指定范围内的字符，如：'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头，紧跟rep的行。 </P>
</DD><DT><SPAN>\(..\)</SPAN> 
</DT><DD>
<P>标记匹配字符，如'\(love\)'，love被标记为1。 </P>
</DD><DT><SPAN>\&lt;</SPAN> 
</DT><DD>
<P>锚定单词的开始，如:'\&lt;grep'匹配包含以grep开头的单词的行。 </P>
</DD><DT><SPAN>\&gt;</SPAN> 
</DT><DD>
<P>锚定单词的结束，如'grep\&gt;'匹配包含以grep结尾的单词的行。 </P>
</DD><DT><SPAN>x\{m\}</SPAN> 
</DT><DD>
<P>重复字符x，m次，如：'0\{5\}'匹配包含5个o的行。 </P>
</DD><DT><SPAN>x\{m,\}</SPAN> 
</DT><DD>
<P>重复字符x,至少m次，如：'o\{5,\}'匹配至少有5个o的行。 </P>
</DD><DT><SPAN>x\{m,n\}</SPAN> 
</DT><DD>
<P>重复字符x，至少m次，不多于n次，如：'o\{5,10\}'匹配5--10个o的行。</P>
</DD><DT><SPAN>\w</SPAN> 
</DT><DD>
<P>匹配文字和数字字符，也就是[A-Za-z0-9]，如：'G\w*p'匹配以G后跟零个或多个文字或数字字符，然后是p。</P>
</DD><DT><SPAN>\W</SPAN> 
</DT><DD>
<P>\w的反置形式，匹配一个或多个非单词字符，如点号句号等。</P>
</DD><DT><SPAN>\b</SPAN> 
</DT><DD>
<P>单词锁定符，如: '\bgrep\b'只匹配grep。</P></DD></DL></DIV></DIV>
<DIV lang=en>
<DIV>
<DIV>
<DIV>
<H2 style="CLEAR: both"><A></A>3.&nbsp;用于egrep和 grep -E的元字符扩展集</H2></DIV></DIV>
<DIV></DIV></DIV>
<DIV>
<DL>
<DT><SPAN>+</SPAN> 
</DT><DD>
<P>匹配一个或多个先前的字符。如：'[a-z]+able'，匹配一个或多个小写字母后跟able的串，如loveable,enable,disable等。</P>
</DD><DT><SPAN>?</SPAN> 
</DT><DD>
<P>匹配零个或多个先前的字符。如：'gr?p'匹配gr后跟一个或没有字符，然后是p的行。</P>
</DD><DT><SPAN>a|b|c</SPAN> 
</DT><DD>
<P>匹配a或b或c。如：grep|sed匹配grep或sed</P>
</DD><DT><SPAN>()</SPAN> 
</DT><DD>
<P>分组符号，如：love(able|rs)ov+匹配loveable或lovers，匹配一个或多个ov。</P>
</DD><DT><SPAN>x{m},x{m,},x{m,n}</SPAN> 
</DT><DD>
<P>作用同x\{m\},x\{m,\},x\{m,n\}</P></DD></DL></DIV></DIV>
<DIV lang=en>
<DIV>
<DIV>
<DIV>
<H2 style="CLEAR: both"><A></A>4.&nbsp;POSIX字符类</H2></DIV></DIV>
<DIV></DIV></DIV>
<P>为了在不同国家的字符编码中保持一至，POSIX(The Portable Operating System Interface)增加了特殊的字符类，如[:alnum:]是A-Za-z0-9的另一个写法。要把它们放到[]号内才能成为正则表达式，如[A- Za-z0-9]或[[:alnum:]]。在linux下的grep除fgrep外，都支持POSIX的字符类。</P>
<DIV>
<DL>
<DT><SPAN>[:alnum:]</SPAN> 
</DT><DD>
<P>文字数字字符</P>
</DD><DT><SPAN>[:alpha:]</SPAN> 
</DT><DD>
<P>文字字符</P>
</DD><DT><SPAN>[:digit:]</SPAN> 
</DT><DD>
<P>数字字符</P>
</DD><DT><SPAN>[:graph:]</SPAN> 
</DT><DD>
<P>非空字符（非空格、控制字符）</P>
</DD><DT><SPAN>[:lower:]</SPAN> 
</DT><DD>
<P>小写字符</P>
</DD><DT><SPAN>[:cntrl:]</SPAN> 
</DT><DD>
<P>控制字符</P>
</DD><DT><SPAN>[:print:]</SPAN> 
</DT><DD>
<P>非空字符（包括空格）</P>
</DD><DT><SPAN>[:punct:]</SPAN> 
</DT><DD>
<P>标点符号</P>
</DD><DT><SPAN>[:space:]</SPAN> 
</DT><DD>
<P>所有空白字符（新行，空格，制表符）</P>
</DD><DT><SPAN>[:upper:]</SPAN> 
</DT><DD>
<P>大写字符</P>
</DD><DT><SPAN>[:xdigit:]</SPAN> 
</DT><DD>
<P>十六进制数字（0-9，a-f，A-F）</P></DD></DL></DIV></DIV>
<DIV lang=en>
<DIV>
<DIV>
<DIV>
<H2 style="CLEAR: both"><A></A>5.&nbsp;Grep命令选项</H2></DIV></DIV>
<DIV></DIV></DIV>
<DIV>
<DL>
<DT><SPAN>-?</SPAN> 
</DT><DD>
<P>同时显示匹配行上下的？行，如：grep -2 pattern filename同时显示匹配行的上下2行。</P>
</DD><DT><SPAN>-b，--byte-offset</SPAN> 
</DT><DD>
<P>打印匹配行前面打印该行所在的块号码。</P>
</DD><DT><SPAN>-c,--count</SPAN> 
</DT><DD>
<P>只打印匹配的行数，不显示匹配的内容。</P>
</DD><DT><SPAN>-f File，--file=File</SPAN> 
</DT><DD>
<P>从文件中提取模板。空文件中包含0个模板，所以什么都不匹配。</P>
</DD><DT><SPAN>-h，--no-filename</SPAN> 
</DT><DD>
<P>当搜索多个文件时，不显示匹配文件名前缀。</P>
</DD><DT><SPAN>-i，--ignore-case</SPAN> 
</DT><DD>
<P>忽略大小写差别。</P>
</DD><DT><SPAN>-q，--quiet</SPAN> 
</DT><DD>
<P>取消显示，只返回退出状态。0则表示找到了匹配的行。</P>
</DD><DT><SPAN>-l，--files-with-matches</SPAN> 
</DT><DD>
<P>打印匹配模板的文件清单。</P>
</DD><DT><SPAN>-L，--files-without-match</SPAN> 
</DT><DD>
<P>打印不匹配模板的文件清单。</P>
</DD><DT><SPAN>-n，--line-number</SPAN> 
</DT><DD>
<P>在匹配的行前面打印行号。</P>
</DD><DT><SPAN>-s，--silent</SPAN> 
</DT><DD>
<P>不显示关于不存在或者无法读取文件的错误信息。</P>
</DD><DT><SPAN>-v，--revert-match</SPAN> 
</DT><DD>
<P>反检索，只显示不匹配的行。</P>
</DD><DT><SPAN>-w，--word-regexp</SPAN> 
</DT><DD>
<P>如果被\&lt;和\&gt;引用，就把表达式做为一个单词搜索。</P>
</DD><DT><SPAN>-V，--version</SPAN> 
</DT><DD>
<P>显示软件版本信息。</P></DD></DL></DIV></DIV>
<DIV lang=en>
<DIV>
<DIV>
<DIV>
<H2 style="CLEAR: both"><A></A>6.&nbsp;实例</H2></DIV></DIV>
<DIV></DIV></DIV>
<P>要用好grep这个工具，其实就是要写好正则表达式，所以这里不对grep的所有功能进行实例讲解，只列几个例子，讲解一个正则表达式的写法。</P>
<DIV>
<DL>
<DT><SPAN>$ ls -l | grep '^a'</SPAN> 
</DT><DD>
<P>通过管道过滤ls -l输出的内容，只显示以a开头的行。</P>
</DD><DT><SPAN>$ grep 'test' d*</SPAN> 
</DT><DD>
<P>显示所有以d开头的文件中包含test的行。</P>
</DD><DT><SPAN>$ grep 'test' aa bb cc</SPAN> 
</DT><DD>
<P>显示在aa，bb，cc文件中匹配test的行。</P>
</DD><DT><SPAN>$ grep '[a-z]\{5\}' aa</SPAN> 
</DT><DD>
<P>显示所有包含每个字符串至少有5个连续小写字符的字符串的行。</P>
</DD><DT><SPAN>$ grep 'w\(es\)t.*\1' aa</SPAN> 
</DT><DD>
<P>如果west被匹配，则es就被存储到内存中，并标记为1，然后搜索任意个字符（.*），这些字符后面紧跟着另外一个es（\1），找到就显示该行。如果用egrep或grep -E，就不用"\"号进行转义，直接写成'w(es)t.*\1'就可以了。</P></DD></DL></DIV></DIV><BR><BR><BR>引文来源&nbsp;&nbsp;<A href="http://man.chinaunix.net/newsoft/grep/open.htm#id2875155" target=_blank>Grep学习笔记</A><p>----------------------------<br/>一键转贴，快速捕捉生活精彩，赢每周好礼！<a href="http://blog.163.com/activities/hunter/hunter.do?080526jclr46" target="_blank">查看活动首页&gt;&gt;</a></p></div>]]></description>
	    <author><![CDATA[&lt;a title=&quot;1&quot;&gt;小海]]></author>
	    <comments>http://blog.163.com/yhb_4323/blog/static/23363479200871644336669</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/yhb_4323/blog/static/23363479200871644336669</guid>
    <pubDate>Sat, 16 Aug 2008 16:43:36 +0800</pubDate>
    <dcterms:modified>2008-08-16T16:43:36+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[Squid custom log format]]></title>	
    <link>http://blog.163.com/yhb_4323/blog/static/23363479200871631718515</link>
    <description><![CDATA[<div><P>Basic syntax: %...field where ... is an optional field width. On numeric fields the output will be 0 padded if the field width starts with a 0. If the field width starts with a - then the output will be aligned right within the field. 
</P><H2>Field names</H2><PRE>Field name syntax keys:
     {} modifier or argument. Also used to specify header names
     &gt;  request (client)
     &lt;  reply (server)
     a  address
     A  address name
     h  all headers
     i  ident
     p  port
     r  request line (no query)
     t  time
     u  user
     l  local address/port (where request was accepted)
</PRE>
<DL>
<DT>%&gt;a 
</DT><DD>Client source IP address 
</DD><DT>%&gt;A 
</DT><DD>Client FQDN 
</DD><DT>%&gt;p 
</DT><DD>Client source port 
</DD><DT>%&lt;a 
</DT><DD>Server or peer IP address 
</DD><DT>%&lt;p 
</DT><DD>Server or peer port number 
</DD><DT>%&lt;A 
</DT><DD>Server IP address or peer name 
</DD><DT>%la 
</DT><DD>Local IP address where the request was accepted 
</DD><DT>%lp 
</DT><DD>Local port where the request was accepted 
</DD><DT>%lA 
</DT><DD>Local port name where the request was accepted 
</DD><DT>%ts 
</DT><DD>Date of request, seconds since epoch 
</DD><DT>%{format}tl 
</DT><DD>Date of request, strftime format (localtime) 
</DD><DT>%{format}tg 
</DT><DD>Date of request, strftime format (gmt) 
</DD><DT>%tu 
</DT><DD>Date of request, sub-second component 
</DD><DT>%tr 
</DT><DD>Time to serve the request, in milliseconds 
</DD><DT>%{header}&gt;h 
</DT><DD>Request header 
</DD><DT>%{header:element}&gt;h 
</DT><DD>Named request header field element (list headers) 
</DD><DT>%{header:separator element}&gt;h 
</DT><DD>Named request header field element, using "separator" as field separator (it can be any non-alphanumeric single character) 
</DD><DT>%&gt;h 
</DT><DD>All request header 
</DD><DT>%{header}&lt;h 
</DT><DD>Request headers, as for &lt;..h above 
</DD><DT>%un 
</DT><DD>Authenticated user name or dash 
</DD><DT>%ur 
</DT><DD>Authenticated user realm or dash 
</DD><DT>%us 
</DT><DD>Authenticated user scheme or dash 
</DD><DT>%ui 
</DT><DD>Ident user name 
</DD><DT>%Hs 
</DT><DD>HTTP status code (200, 404, 407, etc) 
</DD><DT>%Ht 
</DT><DD>HTTP status text (Not found, etc) 
</DD><DT>%Ss 
</DT><DD>Squid status code (TCP_HIT, TCP_MISS etc) 
</DD><DT>%Se 
</DT><DD>Squid error code (ERR_DENIED, ERR_...) 
</DD><DT>%Sh 
</DT><DD>Squid hierarchy code (FIRST_UP_PARENT, etc) 
</DD><DT>%mt 
</DT><DD>MIME type of the request 
</DD><DT>%rm 
</DT><DD>Request method 
</DD><DT>%ru 
</DT><DD>Request URL, without the query string 
</DD><DT>%rq 
</DT><DD>Request query string, including ? 
</DD><DT>%rp 
</DT><DD>Request protocol (i.e. HTTP/1.1) 
</DD><DT>%ps 
</DT><DD>Peer selection status (DIRECT, PARENT, CD_PARENT_HIT, etc. including the TIMEDOUT_ variant) 
</DD><DT>%&gt;sl 
</DT><DD>Size of request line 
</DD><DT>%&gt;sh 
</DT><DD>Size of request headers, including request line 
</DD><DT>%&gt;sH 
</DT><DD>Size of request headers, excluding request line 
</DD><DT>%&gt;sb 
</DT><DD>Size of request body, raw received bytes 
</DD><DT>%&gt;sB 
</DT><DD>Size of request body, excluding transfer encoding 
</DD><DT>%&gt;st 
</DT><DD>Total size of request 
</DD><DT>%&lt;sl 
</DT><DD>Size of reply status line 
</DD><DT>%&lt;sh 
</DT><DD>Size of reply headers, including status line 
</DD><DT>%&lt;sH 
</DT><DD>Size of reply headers, excluding status line 
</DD><DT>%&lt;sb 
</DT><DD>Size of reply body, raw transmitted bytes 
</DD><DT>%&lt;sB 
</DT><DD>Size of reply body, excluding transfer encoding 
</DD><DT>%&lt;st 
</DT><DD>Total size of reply 
</DD><DT>%% 
</DT><DD>A literal % </DD></DL><BR><BR><BR>引文来源&nbsp;&nbsp;<A href="http://devel.squid-cache.org/customlog/logformat.html" target=_blank>Squid custom log format</A><p>----------------------------<br/>一键转贴，快速捕捉生活精彩，赢每周好礼！<a href="http://blog.163.com/activities/hunter/hunter.do?080526jclr46" target="_blank">查看活动首页&gt;&gt;</a></p></div>]]></description>
	    <author><![CDATA[&lt;a title=&quot;1&quot;&gt;小海]]></author>
	    <comments>http://blog.163.com/yhb_4323/blog/static/23363479200871631718515</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/yhb_4323/blog/static/23363479200871631718515</guid>
    <pubDate>Sat, 16 Aug 2008 15:17:18 +0800</pubDate>
    <dcterms:modified>2008-08-16T15:17:18+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[Squid access.log]]></title>	
    <link>http://blog.163.com/yhb_4323/blog/static/23363479200871623055612</link>
    <description><![CDATA[<div><TABLE><STRONG>Squid access.log </STRONG>
<TBODY></TBODY></TABLE>
<P>Information to each access to the Cache</P>
<P>
<TABLE><STRONG><B>Native Format (emulate_httpd_log off) </B></STRONG>
<TBODY></TBODY></TABLE></P>Timestamp Elapsed Client Action/Code Size Method URI Ident Hierarchy/From Content<BR><BR>
<TABLE><STRONG><B>Common Format (emulate_httpd_log on) </B></STRONG>
<TBODY></TBODY></TABLE>Client Ident - [Timestamp1] "Method URI" Type Size<BR><BR>with:<BR>
<TABLE>TimestampThe time when the request is completed (socket closed). The format is "Unix time" (seconds since Jan 1, 1970) with millisecond resolution. Timestamp1When the request is completed (Day/Month/CenturyYear:Hour:Minute:Second GMT-Offset) ElapsedThe elapsed time of the request, in milliseconds. This is the time between the accept() and close() of the client socket. ClientThe IP address of the connecting client, or the FQDN if the 'log_fqdn' option is enabled in the config file. ActionThe Action describes how the request was treated locally (hit, miss, etc). All the tags are described below. CodeThe HTTP reply code taken from the first line of the HTTP reply header. For ICP requests this is always "000." If the reply code was not given, it will be logged as "555." SizeFor TCP requests, the amount of data written to the client. For UDP requests, the size of the request. (in bytes) MethodThe HTTP request method (GET, POST, etc), or ICP_QUERY for ICP requests. IdentThe result of the RFC931/ident lookup of the client username. If RFC931/ident lookup is disabled (default: `ident_lookup off'), it is logged as - . HierarchyA description of how and where the requested object was fetched. FromHostname of the machine where we got the object. ContentContent-type of the Object (from the HTTP reply header). 
<TBODY></TBODY></TABLE><BR><BR><BR><BR>引文来源&nbsp;&nbsp;<A href="http://www.linofee.org/~jel/proxy/Squid/accesslog.shtml" target=_blank>Squid access.log</A><p>----------------------------<br/>一键转贴，快速捕捉生活精彩，赢每周好礼！<a href="http://blog.163.com/activities/hunter/hunter.do?080526jclr46" target="_blank">查看活动首页&gt;&gt;</a></p></div>]]></description>
	    <author><![CDATA[&lt;a title=&quot;1&quot;&gt;小海]]></author>
	    <comments>http://blog.163.com/yhb_4323/blog/static/23363479200871623055612</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/yhb_4323/blog/static/23363479200871623055612</guid>
    <pubDate>Sat, 16 Aug 2008 14:30:55 +0800</pubDate>
    <dcterms:modified>2008-08-16T14:30:55+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[Linux操作系统的Configure参数解释说明 - 中国站长站]]></title>	
    <link>http://blog.163.com/yhb_4323/blog/static/23363479200871611312705</link>
    <description><![CDATA[<div><DIV>
<DIV>
<DIV>
<DIV>
<H1>Linux操作系统的Configure参数解释说明</H1>
<DIV>
<P>Linux环境下的软件安装，并不是一件容易的事情；如果通过源代码编译后在安装，当然事情就更为复杂一些；现在安装各种软件的教程都非常普遍；但万变不离其中，对基础知识的扎实掌握，安装各种软件的问题就迎刃而解了。Configure脚本配置工具就是基础之一，它是autoconf的工具的基本应用。 </P>
<P><BR>与一些技巧相比，Configure显得基础一些，当然使用和学习起来就显得枯燥乏味一些，当然要成为高手，对基础的熟悉不能超越哦。 </P>
<P><BR>为此我转载了一篇关于Configure选项配置的详细介绍。供大家参考 </P>
<P><BR>'configure'脚本有大量的命令行选项。对不同的软件包来说，这些选项可能会有变化，但是许多基本的选项是不会改变的。带上'--help'选项执行'configure'脚本可以看到可用的所有选项。尽管许多选项是很少用到的，但是当你为了特殊的需求而configure一个包时，知道他们的存在是很有益处的。下面对每一个选项进行简略的介绍： </P>
<P>--cache-file=FILE </P>
<P>'configure'会在你的系统上测试存在的特性(或者bug!)。为了加速随后进行的配置，测试的结果会存储在一个cache file里。当configure一个每个子树里都有'configure'脚本的复杂的源码树时，一个很好的cache file的存在会有很大帮助。</P>
<P>--help </P>
<P>输出帮助信息。即使是有经验的用户也偶尔需要使用使用'--help'选项，因为一个复杂的项目会包含附加的选项。例如，GCC包里的'configure'脚本就包含了允许你控制是否生成和在GCC中使用GNU汇编器的选项。 </P>
<P><BR>--no-create </P>
<P><BR>'configure'中的一个主要函数会制作输出文件。此选项阻止'configure'生成这个文件。你可以认为这是一种演习(dry run)，尽管缓存(cache)仍然被改写了。 </P>
<P><BR>--quiet </P>
<P>--silent </P>
<P><BR>当'configure'进行他的测试时，会输出简要的信息来告诉用户正在作什么。这样作是因为'configure'可能会比较慢，没有这种输出的话用户将会被扔在一旁疑惑正在发生什么，使用这两个选项中的任何一个都会把你扔到一旁。(译注：这两句话比较有意思，原文是这样的：If there was no such output, the user would be left wondering what is happening. By using this option, you too can be left wondering!) </P>
<P><BR>--version </P>
<P><BR>打印用来产生'configure'脚本的Autoconf的版本号。</P>
<P><BR>--prefix=PEWFIX </P>
<P><BR>'--prefix'是最常用的选项。制作出的'Makefile'会查看随此选项传递的参数，当一个包在安装时可以彻底的重新安置他的结构独立部分。举一个例子，当安装一个包，例如说Emacs，下面的命令将会使Emacs Lisp file被安装到"/opt/gnu/share"：</P>
<P>$ ./configure --prefix=/opt/gnu </P>
<P><BR>--exec-prefix=EPREFIX </P>
<P><BR>与'--prefix'选项类似，但是他是用来设置结构倚赖的文件的安装位置，编译好的'emacs'二进制文件就是这样一个问件。如果没有设置这个选项的话，默认使用的选项值将被设为和'--prefix'选项值一样。 </P>
<P><BR>--bindir=DIR </P>
<P><BR>指定二进制文件的安装位置，这里的二进制文件定义为可以被用户直接执行的程序。</P>
<P><BR>--sbindir=DIR </P>
<P><BR>指定超级二进制文件的安装位置。这是一些通常只能由超级用户执行的程序。 </P>
<P><BR>--libexecdir=DIR </P>
<P><BR>指定可执行支持文件的安装位置。与二进制文件相反，这些文件从来不直接由用户执行，但是可以被上面提到的二进制文件所执行。</P>
<P><BR>--datadir=DIR </P>
<P><BR>指定通用数据文件的安装位置。 </P>
<P><BR>--sysconfdir=DIR </P>
<P><BR>指定在单个机器上使用的只读数据的安装位置。 </P>
<P><BR>--sharedstatedir=DIR </P>
<P>指定可以在多个机器上共享的可写数据的安装位置。</P>
<P><BR>--localstatedir=DIR </P>
<P>指定只能单机使用的可写数据的安装位置。</P>
<P>--libdir=DIR </P>
<P>指定库文件的安装位置。</P>
<P><BR>--includedir=DIR </P>
<P>指定C头文件的安装位置。其他语言如C++的头文件也可以使用此选项。</P>
<P><BR>--oldincludedir=DIR </P>
<P>指定为除GCC外编译器安装的C头文件的安装位置。 </P>
<P><BR>--infodir=DIR </P>
<P>指定Info格式文档的安装位置.Info是被GNU工程所使用的文档格式。</P>
<P><BR>--mandir=DIR </P>
<P>指定手册页的安装位置。</P>
<P><BR>--srcdir=DIR </P>
<P>这个选项对安装没有作用，他会告诉'configure'源码的位置。一般来说不用指定此选项，因为'configure'脚本一般和源码文件在同一个目录下。</P>
<P><BR>--program-prefix=PREFIX </P>
<P>指定将被加到所安装程序的名字上的前缀。例如，使用'--program-prefix=g'来configure一个名为'tar'的程序将会使安装的程序被命名为'gtar'。当和其他的安装选项一起使用时，这个选项只有当他被`Makefile.in'文件使用时才会工作。</P>
<P><BR>--program-suffix=SUFFIX </P>
<P>指定将被加到所安装程序的名字上的后缀。</P>
<P><BR>--program-transform-name=PROGRAM </P>
<P>这里的PROGRAM是一个sed脚本。当一个程序被安装时，他的名字将经过`sed -e PROGRAM'来产生安装的名字。</P>
<P><BR>--build=BUILD </P>
<P>指定软件包安装的系统平台。如果没有指定，默认值将是'--host'选项的值。 </P>
<P><BR>--host=HOST </P>
<P>指定软件运行的系统平台。如果没有指定。将会运行`config.guess'来检测。</P>
<P><BR>--target=GARGET </P>
<P>指定软件面向(target to)的系统平台。这主要在程序语言工具如编译器和汇编器上下文中起作用。如果没有指定，默认将使用'--host'选项的值。 </P>
<P><BR>--disable-FEATURE </P>
<P>一些软件包可以选择这个选项来提供为大型选项的编译时配置，例如使用Kerberos认证系统或者一个实验性的编译器最优配置。如果默认是提供这些特性，可以使用'--disable-FEATURE'来禁用它，这里'FEATURE'是特性的名字，例如：</P>
<P>$ ./configure --disable-gui </P>
<P><BR>-enable-FEATURE[=ARG] </P>
<P>相反的，一些软件包可能提供了一些默认被禁止的特性,可以使用'--enable-FEATURE'来起用它。这里'FEATURE'是特性的名字。一个特性可能会接受一个可选的参数。例如：</P>
<P>$ ./configure --enable-buffers=128 </P>
<P>`--enable-FEATURE=no'与上面提到的'--disable-FEATURE'是同义的。</P>
<P><BR>--with-PACKAGE[=ARG] </P>
<P>在自由软件社区里，有使用已有软件包和库的优秀传统。当用'configure'来配置一个源码树时，可以提供其他已经安装的软件包的信息。例如，倚赖于Tcl和Tk的BLT器件工具包。要配置BLT，可能需要给'configure'提供一些关于我们把Tcl和Tk装的何处的信息：</P>
<P>$ ./configure --with-tcl=/usr/local --with-tk=/usr/local </P>
<P>'--with-PACKAGE=no'与下面将提到的'--without-PACKAGE'是同义的。 </P>
<P><BR>--without-PACKAGE </P>
<P>有时候你可能不想让你的软件包与系统已有的软件包交互。例如，你可能不想让你的新编译器使用GNU ld。通过使用这个选项可以做到这一点：</P>
<P>$ ./configure --without-gnu-ld </P>
<P><BR>--x-includes=DIR </P>
<P>这个选项是'--with-PACKAGE'选项的一个特例。在Autoconf最初被开发出来时，流行使用'configure'来作为Imake的一个变通方法来制作运行于X的软件。'--x-includes'选项提供了向'configure'脚本指明包含X11头文件的目录的方法。</P>
<P><BR>--x-libraries=DIR </P>
<P>类似的，'--x-libraries'选项提供了向'configure'脚本指明包含X11库的目录的方法。</P>
<P><BR>在源码树中运行'configure'是不必要的同时也是不好的。一个由'configure'产生的良好的'Makefile'可以构筑源码属于另一棵树的软件包。在一个独立于源码的树中构筑派生的文件的好处是很明显的：派生的文件，如目标文件，会凌乱的散布于源码树。这也使在另一个不同的系统或用不同的配置选项构筑同样的目标文件非常困难。建议使用三棵树：一棵源码树(source tree)，一棵构筑树(build tree)，一棵安装树(install tree)。这里有一个很接近的例子，是使用这种方法来构筑GNU malloc包： </P>
<P>$ gtar zxf mmalloc-1.0.tar.gz </P>
<P>$ mkdir build &amp;&amp; cd build </P>
<P>$ ../mmalloc-1.0/configure </P>
<P>creating cache ./config.cache </P>
<P>checking for gcc... gcc </P>
<P>checking whether the C compiler (gcc ) works... yes </P>
<P>checking whether the C compiler (gcc ) is a cross-compiler... no </P>
<P>checking whether we are using GNU C... yes </P>
<P>checking whether gcc accepts -g... yes </P>
<P>checking for a BSD compatible install... /usr/bin/install -c </P>
<P>checking host system type... i586-pc-linux-gnu </P>
<P>checking build system type... i586-pc-linux-gnu </P>
<P>checking for ar... ar </P>
<P>checking for ranlib... ranlib </P>
<P>checking how to run the C preprocessor... gcc -E </P>
<P>checking for unistd.h... yes </P>
<P>checking for getpagesize... yes </P>
<P>checking for working mmap... yes </P>
<P>checking for limits.h... yes </P>
<P>checking for stddef.h... yes </P>
<P>updating cache ../config.cache </P>
<P>creating ./config.status </P>
<P>这样这棵构筑树就被配置了，下面可以继续构筑和安装这个包到默认的位置'/usr/local'： </P>
<P>$ make all &amp;&amp; make install</P></DIV></DIV></DIV></DIV>
<DIV>
<DIV>
<P>&copy; CopyRight 2002-2008, CHINAZ.COM, Inc. All Rights Reserved 资讯热线:0592-2965139 2965133</P>
<P>闽ICP备05000137号 增值电信业务经营许可证闽B2-20070004号 站长统计</P></DIV></DIV></DIV><BR><BR><BR>引文来源&nbsp;&nbsp;<A href="http://www.chinaz.com/Server/Linux/0620104Y2007.html" target=_blank>Linux操作系统的Configure参数解释说明 - 中国站长站</A><p>----------------------------<br/>一键转贴，快速捕捉生活精彩，赢每周好礼！<a href="http://blog.163.com/activities/hunter/hunter.do?080526jclr46" target="_blank">查看活动首页&gt;&gt;</a></p></div>]]></description>
	    <author><![CDATA[&lt;a title=&quot;1&quot;&gt;小海]]></author>
	    <comments>http://blog.163.com/yhb_4323/blog/static/23363479200871611312705</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/yhb_4323/blog/static/23363479200871611312705</guid>
    <pubDate>Sat, 16 Aug 2008 13:13:12 +0800</pubDate>
    <dcterms:modified>2008-08-16T13:13:12+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[管理学十大经典定律]]></title>	
    <link>http://blog.163.com/yhb_4323/blog/static/23363479200861514520616</link>
    <description><![CDATA[<div><DIV>
<DIV>
<DIV>
<DIV>
<DIV>
<DIV>
<DIV>
<DIV>
<P>&nbsp;&nbsp;&nbsp; 每个组织都是由各种不同的职位等级或阶层的排列所组成，每个人都隶属于其中的某个等级彼得原理是美国学者劳伦斯?彼得在对组织中人员晋升的相关现象研究后，得出一个结论：在各种组织中,雇员总是趋向于晋升到其不称职的地位彼得原理有时也被称为"向上爬"的原理 这种现象在现实生活中无处不在：一名称职的教授被提升为大学校长后，却无法胜任；一个优秀的运动员被提升为主管体育的官员，而无所作为 对一个组织而言，一旦相当部分人员被推到其不称职的级别，就会造成组织的人浮于事，效率低下，导致平庸者出人头地，发展停滞 因此，这就要求改变单纯的"根据贡献决定晋升"的企业员工晋升机制，不能因某人在某个岗位上干得很出色，就推断此人一定能够胜任更高一级的职务将一名职工晋升到一个无法很好发挥才能的岗位，不仅不是对本人的奖励，反而使其无法很好发挥才能，也给企业带来损失 </P>
<P>&nbsp;&nbsp;&nbsp; 酒与污水定律是指把一匙酒倒进一桶污水，得到的是一桶污水；如果把一匙污水倒进一桶酒，得到的还是一桶污水在任何组织里，几乎都存在几个难弄的人物，他们存在的目的似乎就是为了把事情搞糟最糟糕的是，他们像果箱里的烂苹果，如果不及时处理，它会迅速传染，把果箱里其他苹果也弄烂 "烂苹果"的可怕之处，在于它那惊人的破坏力一个正直能干的人进入一个混乱的部门可能会被吞没，而一个无德无才者能很快将一个高效的部门变成一盘散沙组织系统往往是脆弱的，是建立在相互理解妥协和容忍的基础上的，很容易被侵害被毒化 破坏者能力非凡的另一个重要原因在于，破坏总比建设容易一个能工巧匠花费时日精心制作的陶瓷器，一头驴子一秒钟就能毁坏掉如果一个组织里有这样的一头驴子，即使拥有再多的能工巧匠，也不会有多少像样的工作成果如果你的组织里有这样的一头驴子，你应该马上把它清除掉，如果你无力这样做，就应该把它拴起来</P>
<P>&nbsp;&nbsp;&nbsp; 水桶定律是讲一只水桶能装多少水，这完全取决于它最短的那块木板这就是说任何一个组织，可能面临的一个共同问题，即构成组织的各个部分往往是优劣不齐的，而劣势部分往往决定整个组织的水平 "水桶定律"与"酒与污水定律"不同，后者讨论的是组织中的破坏力量，"最短的木板"却是组织中有用的一个部分，只不过比其他部分差一些，你不能把它们当成烂苹果扔掉强弱只是相对而言的，无法消除，问题在于你容忍这种弱点到什么程度，如果严重到成为阻碍工作的瓶颈，你就不得不有所动作</P>
<P>&nbsp;&nbsp;&nbsp; 新约?马太福音中有这样一个故事：一个国王远行前，交给3个仆人每人一锭银子，吩咐道："你们去做生意，等我回来时，再来见我"国王回来时，第一个仆人说："主人，你交给我的一锭银子，我已赚了10锭"于是，国王奖励他10座城邑第二个仆人报告："主人，你给我的一锭银子，我已赚了5锭"于是，国王奖励他5座城邑第三仆人报告说："主人，你给我的1锭银子，我一直包在手帕里，怕丢失，一直没有拿出来"于是，国王命令将第三个仆人的1锭银子赏给第一个仆人，说："凡是少的，就连他所有的，也要夺过来凡是多的，还要给他，叫他多多益善."这就是马太效应,反应当今社会中存在的一个普遍现象,即赢家通吃. 对企业经营发展而言,马太效应告诉我们,要想在某一个领域保持优势,就必须在此领域迅速做大当你成为某个领域的领头羊时,即便投资回报率相同,你也能更轻易地获得比弱小的同行更大的收益.而若没有实力迅速在某个领域做大,就要不停地寻找新的发展领域,才能保证获得较好的回报</P>
<P>&nbsp;&nbsp;&nbsp; 零和游戏是指一项游戏中，游戏者有输有赢，一方所赢正是另一方所输，游戏的总成绩永远为零，零和游戏原理之所以广受关注，主要是因为人们在社会的方方面面都能发现与"零和游戏"类似的局面，胜利者的光荣后面往往隐藏着失败者的辛酸和苦涩 20世纪，人类经历两次世界大战经济高速增长，科技进步全球一体化以及日益严重的环境污染，"零和游戏"观念正逐渐被"双赢"观念所取代人们开始认识到"利已"不一定要建立在"损人"的基础上通过有效合作皆大欢喜的结局是可能出现的 但从"零和游戏"走向"双赢"，要求各方面要有真诚合作的精神和勇气，在合作中不要小聪明，不要总想占别人的小便宜，要遵守游戏规则，否则"双赢"的局面就不可能出现，最终吃亏的还是合作者自己 </P>
<P>&nbsp;&nbsp;&nbsp; 华盛顿合作规律说的是一个人敷衍了事，两个人互相推诿，三个人则永无成事之日多少有点类似于我们"三个和尚"的故事 人与人的合作，不是人力的简单相加，而是要复杂和微妙得多在这种合作中，假定每个人的能力都为1，那么，10个人的合作结果有时比10大得多，有时，甚至比1还要小因为人不是静止物，而更像方向各异的能量，相互推动时，自然事半功倍，相互抵触时，则一事无成 我们传统的管理理论中，对合作研究得并不多，最直观的反映就是，目前的大多数管理制度和行为都是致力于减少人力的无谓消耗，而非利用组织提高人的效能换言之，不妨说管理的主要目的不是让每个人做得更好，而是避免内耗过多</P>
<P>&nbsp;&nbsp;&nbsp; 手表定理是指一个人有一只表时，可以知道现在是几点钟，当他同时拥有两只表时，却无法确定两只手表并不能告诉一个人更准确的时间，反而会让看表的人失去对准确时间的信心 手表定理在企业经营管理方面，给我们一种非常直观的启发，就是对同一个人或同一个组织的管理，不能同时采用两种不同的方法，不能同时设置两个不同的目标，甚至每一个人不能由两个人同时指挥，否则将使这个企业或这个人无所适从 手表定理所指的另一层含义在于，每个人都不能同时选择两种不同的价值观，否则，你的行为将陷于混乱 </P>
<P>&nbsp;&nbsp;&nbsp; 不值得定律最直观的表述是：不值得做的的事情，就不值得做好这个定律再简单不过了，重要性却时时被人们忽视遗忘不值得定律反映人们的一种心理，一个人如果从事的是一份自认为不值得做的事情，往往会保持冷嘲热讽，敷衍了事的态度，不仅成功率低，而且即使成功，也不觉得有多大的成就感 因此，对个人来说，应在多种可供选择的奋斗目标及价值观中挑选一种，然后为之奋斗"选择你所爱的，爱你所选择的，才可能激发我们的斗志，也可以心安理得而对一个企业或组织来说，则要很好地分析员工的性格特性，合理分配工作，如让成就欲较强的职工单独或牵头完成具有一定风险和难度的工作，并在其完成时，给予及时的肯定和赞扬；让依附欲较强的职工，更多地参加到某个团体*同工作；让权力欲较强的职工，担任一个与之能力相适应的主管同时要加强员工对企业目标的认同感，让员工感觉到自己所做的工作是值得的，这样才能激发职工的热情 </P>
<P>&nbsp;&nbsp;&nbsp; 蘑菇管理是许多组织对待初出茅庐者的一种管理方法，初学者被置于阴暗的角落（不受重视的部门，或打杂跑腿的工作），浇上一头大粪（无端的批评指责代人受过），任其自生自灭（得不到必要的指导和提携）相信很多人都有过这样一段"蘑菇"的经历，这不一定是什么坏事，尤其是当一切刚刚开始的时候，当几天"蘑菇"，能够消除我们很多不切实际的幻想，让我们更加接近现实，看问题也更加实际 一个组织，一般对新进的人员都是一视同仁，从起薪到工作都不会有大的差别无论你是多么优秀的人才，在刚开始的时候，都只能从最简单的事情做起，"蘑菇"的经历，对于成长中的年轻人来说，就象蚕茧，是羽化前必须经历的一步所以，如何高效率地走过生命的这一段，从中尽可能汲取经验，成熟起来，并树立良好的值得信赖的个人形象，是每个刚入社会的年轻人必须面对的课题 </P>
<P>世纪，英国奥卡姆的威廉主张唯名论，只承认确实存在的东西，认为那些空洞无物的普遍性概念都是无用的累赘，应当被无情地"剃除"他主张"如无必要，勿增实体"这就是常说的"奥卡姆剃刀"这把剃刀曾使很多人感到威胁，被认为是异端邪说，威廉本人也因此受到迫害然而，并未损害这把刀的锋利，相反，经过数百年的岁月，奥卡姆剃刀已被历史磨得越来越快，并早已超载原来狭窄的领域，而具有广泛丰富深刻的意义 奥卡姆剃刀定律在企业管理中可进一步演化为简单与复杂定律：把事情变复杂很简单，把事情变简单很复杂这个定律要求，我们在处理事情时，要把握事情的主要实质，把握主流，解决最根本的问题，尤其要顺应自然，不要把事情人为地复杂化，这样才能把事情处理好</P></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV><p>----------------------------<br/>一键转贴，快速捕捉生活精彩，赢每周好礼！<a href="http://blog.163.com/activities/hunter/hunter.do?080526jclr46" target="_blank">查看活动首页&gt;&gt;</a></p></div>]]></description>
	    <author><![CDATA[&lt;a title=&quot;1&quot;&gt;小海]]></author>
	    <comments>http://blog.163.com/yhb_4323/blog/static/23363479200861514520616</comments>
    <slash:comments>1</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/yhb_4323/blog/static/23363479200861514520616</guid>
    <pubDate>Tue, 15 Jul 2008 13:45:20 +0800</pubDate>
    <dcterms:modified>2008-07-15T13:45:20+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[西点军校的经典法则 - MBA智库百科]]></title>	
    <link>http://blog.163.com/yhb_4323/blog/static/2336347920086954253951</link>
    <description><![CDATA[<div><H2>经典法则内容</H2>
<UL lastCheckbox="null">
<LI>1责任 
<UL lastCheckbox="null">
<LI>决不推卸责任 
</LI><LI>敬业为魂 
</LI><LI>从小事做起 
</LI><LI>细节决定成败 </LI></UL>
</LI><LI>2荣誉 
<UL lastCheckbox="null">
<LI>荣誉准则 
</LI><LI>荣誉即吾命 
</LI><LI>为自己奋斗 </LI></UL>
</LI><LI>3意志 
<UL lastCheckbox="null">
<LI>决不惧怕失败 
</LI><LI>永不放弃 
</LI><LI>坚韧的品质 
</LI><LI>没有什么不可能 </LI></UL>
</LI><LI>4勇气 
<UL lastCheckbox="null">
<LI>勇敢者的游戏 
</LI><LI>战胜逆境 
</LI><LI>克服恐惧 </LI></UL>
</LI><LI>5热忱 
<UL lastCheckbox="null">
<LI>总在最前面 
</LI><LI>热情 
</LI><LI>专注 </LI></UL>
</LI><LI>6服从 
<UL lastCheckbox="null">
<LI>铁一般的纪律 
</LI><LI>将服从训练成习惯 
</LI><LI>千万别找借口 
</LI><LI>只管说我不知道 </LI></UL>
</LI><LI>7信念 
<UL lastCheckbox="null">
<LI>信念 
</LI><LI>理想 
</LI><LI>实现目标 </LI></UL>
</LI><LI>8团队 
<UL lastCheckbox="null">
<LI><A title=团队精神 href="http://blog.163.com/wiki/%E5%9B%A2%E9%98%9F%E7%B2%BE%E7%A5%9E">团队精神</A> 
</LI><LI>善于合作 </LI></UL>
</LI><LI>9尊重 
<UL lastCheckbox="null">
<LI>注重仪表和礼貌 
</LI><LI>以上司为榜样 
</LI><LI>领导的艺术 </LI></UL>
</LI><LI>10忠诚 
<UL lastCheckbox="null">
<LI>忠诚胜于能力 
</LI><LI>全力以赴 </LI></UL>
</LI><LI>11自发 
<UL lastCheckbox="null">
<LI>积极主动地面对每一件事 
</LI><LI>勤勉 
</LI><LI>绝不拖延 
</LI><LI>行动起来，去做好正在经手的每一件事 </LI></UL>
</LI><LI>12正直 
<UL lastCheckbox="null">
<LI>追求真理 
</LI><LI>真正使你受欢迎 </LI></UL>
</LI><LI>13竞争 
<UL lastCheckbox="null">
<LI>终生拼搏 
</LI><LI>只有第一 
</LI><LI>没有最好 </LI></UL></LI></UL><BR><BR><BR><p>----------------------------<br/>一键转贴，快速捕捉生活精彩，赢每周好礼！<a href="http://blog.163.com/activities/hunter/hunter.do?080526jclr46" target="_blank">查看活动首页&gt;&gt;</a></p></div>]]></description>
	    <author><![CDATA[&lt;a title=&quot;1&quot;&gt;小海]]></author>
	    <comments>http://blog.163.com/yhb_4323/blog/static/2336347920086954253951</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/yhb_4323/blog/static/2336347920086954253951</guid>
    <pubDate>Wed, 9 Jul 2008 17:42:53 +0800</pubDate>
    <dcterms:modified>2008-07-09T17:42:53+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[常用的IPTABLES规则]]></title>	
    <link>http://blog.163.com/yhb_4323/blog/static/2336347920086832254376</link>
    <description><![CDATA[<div><P style="TEXT-INDENT: 2em">只能收发邮件，别的都关闭 </P>
<P style="TEXT-INDENT: 2em">iptables -I Filter -m mac --mac-source 00:0F:EA:25:51:37 -j DROP </P>
<P style="TEXT-INDENT: 2em">iptables -I Filter -m mac --mac-source 00:0F:EA:25:51:37 -p udp --dport 53 -j ACCEPT </P>
<P style="TEXT-INDENT: 2em">iptables -I Filter -m mac --mac-source 00:0F:EA:25:51:37 -p tcp --dport 25 -j ACCEPT </P>
<P style="TEXT-INDENT: 2em">iptables -I Filter -m mac --mac-source 00:0F:EA:25:51:37 -p tcp --dport 110 -j ACCEPT </P>
<P style="TEXT-INDENT: 2em">IPSEC NAT 策略 </P>
<P style="TEXT-INDENT: 2em">iptables -I PFWanPriv -d 192.168.100.2 -j ACCEPT </P>
<P style="TEXT-INDENT: 2em">iptables -t nat -A PREROUTING -p tcp --dport 80 -d $INTERNET_ADDR -j DNAT --to-destination 192.168.100.2:80 </P>
<P style="TEXT-INDENT: 2em">iptables -t nat -A PREROUTING -p tcp --dport 1723 -d $INTERNET_ADDR -j DNAT --to-destination 192.168.100.2:1723 </P>
<P style="TEXT-INDENT: 2em">iptables -t nat -A PREROUTING -p udp --dport 1723 -d $INTERNET_ADDR -j DNAT --to-destination 192.168.100.2:1723 </P>
<P style="TEXT-INDENT: 2em">iptables -t nat -A PREROUTING -p udp --dport 500 -d $INTERNET_ADDR -j DNAT --to-destination 192.168.100.2:500 </P>
<P style="TEXT-INDENT: 2em">iptables -t nat -A PREROUTING -p udp --dport 4500 -d $INTERNET_ADDR -j DNAT --to-destination 192.168.100.2:4500 </P>
<P style="TEXT-INDENT: 2em">FTP服务器的NAT </P>
<P style="TEXT-INDENT: 2em">iptables -I PFWanPriv -p tcp --dport 21 -d 192.168.100.200 -j ACCEPT </P>
<P style="TEXT-INDENT: 2em">iptables -t nat -A PREROUTING -p tcp --dport 21 -d $INTERNET_ADDR -j DNAT --to-destination 192.168.100.200:21 </P>
<P style="TEXT-INDENT: 2em">只允许访问指定网址 </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -p udp --dport 53 -j ACCEPT </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -p tcp --dport 53 -j ACCEPT </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -d <A href="http://www.3322.org/">www.3322.org</A> -j ACCEPT </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -d img.cn99.com -j ACCEPT </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -j DROP </P>
<P style="TEXT-INDENT: 2em">开放一个IP的一些端口，其它都封闭 </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -p tcp --dport 80 -s 192.168.100.200 -d <A href="http://www.pconline.com.cn/">www.pconline.com.cn</A> -j ACCEPT </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -p tcp --dport 25 -s 192.168.100.200 -j ACCEPT </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -p tcp --dport 109 -s 192.168.100.200 -j ACCEPT </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -p tcp --dport 110 -s 192.168.100.200 -j ACCEPT </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -p tcp --dport 53 -j ACCEPT </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -p udp --dport 53 -j ACCEPT </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -j DROP </P>
<P style="TEXT-INDENT: 2em">多个端口 </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -p tcp -m multiport --destination-port 22,53,80,110 -s 192.168.20.3 -j REJECT </P>
<P style="TEXT-INDENT: 2em">连续端口 </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -p tcp -m multiport --source-port 22,53,80,110 -s 192.168.20.3 -j REJECT iptables -A Filter -p tcp --source-port 2:80 -s 192.168.20.3 -j REJECT </P>
<P style="TEXT-INDENT: 2em">指定时间上网 </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -s 10.10.10.253 -m time --timestart 6:00 --timestop 11:00 --days Mon,Tue,Wed,Thu,Fri,Sat,Sun -j DROP </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -m time --timestart 12:00 --timestop 13:00 --days Mon,Tue,Wed,Thu,Fri,Sat,Sun -j ACCEPT </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -m time --timestart 17:30 --timestop 8:30 --days Mon,Tue,Wed,Thu,Fri,Sat,Sun -j ACCEPT </P>
<P style="TEXT-INDENT: 2em">禁止多个端口服务 </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -m multiport -p tcp --dport 21,23,80 -j ACCEPT </P>
<P style="TEXT-INDENT: 2em">将WAN 口NAT到PC </P>
<P style="TEXT-INDENT: 2em">iptables -t nat -A PREROUTING -i $INTERNET_IF -d $INTERNET_ADDR -j DNAT --to-destination 192.168.0.1 </P>
<P style="TEXT-INDENT: 2em">将WAN口8000端口NAT到192。168。100。200的80端口 </P>
<P style="TEXT-INDENT: 2em">iptables -t nat -A PREROUTING -p tcp --dport 8000 -d $INTERNET_ADDR -j DNAT --to-destination 192.168.100.200:80 </P>
<P style="TEXT-INDENT: 2em">MAIL服务器要转的端口 </P>
<P style="TEXT-INDENT: 2em">iptables -t nat -A PREROUTING -p tcp --dport 110 -d $INTERNET_ADDR -j DNAT --to-destination 192.168.100.200:110 </P>
<P style="TEXT-INDENT: 2em">iptables -t nat -A PREROUTING -p tcp --dport 25 -d $INTERNET_ADDR -j DNAT --to-destination 192.168.100.200:25 </P>
<P style="TEXT-INDENT: 2em">只允许PING 202。96。134。133,别的服务都禁止 </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -p icmp -s 192.168.100.200 -d 202.96.134.133 -j ACCEPT </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -j DROP </P>
<P style="TEXT-INDENT: 2em">禁用BT配置 </P>
<P style="TEXT-INDENT: 2em">iptables –A Filter –p tcp –dport 6000:20000 –j DROP </P>
<P style="TEXT-INDENT: 2em">禁用QQ防火墙配置 </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -p udp --dport ! 53 -j DROP </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -d 218.17.209.0/24 -j DROP </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -d 218.18.95.0/24 -j DROP </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -d 219.133.40.177 -j DROP </P>
<P style="TEXT-INDENT: 2em">基于MAC，只能收发邮件，其它都拒绝 </P>
<P style="TEXT-INDENT: 2em">iptables -I Filter -m mac --mac-source 00:0A:EB:97:79:A1 -j DROP </P>
<P style="TEXT-INDENT: 2em">iptables -I Filter -m mac --mac-source 00:0A:EB:97:79:A1 -p tcp --dport 25 -j ACCEPT </P>
<P style="TEXT-INDENT: 2em">iptables -I Filter -m mac --mac-source 00:0A:EB:97:79:A1 -p tcp --dport 110 -j ACCEPT </P>
<P style="TEXT-INDENT: 2em">禁用MSN配置 </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -p udp --dport 9 -j DROP </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -p tcp --dport 1863 -j DROP </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -p tcp --dport 80 -d 207.68.178.238 -j DROP </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -p tcp --dport 80 -d 207.46.110.0/24 -j DROP </P>
<P style="TEXT-INDENT: 2em">只允许PING 202。96。134。133 其它公网IP都不许PING </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -p icmp -s 192.168.100.200 -d 202.96.134.133 -j ACCEPT </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -p icmp -j DROP </P>
<P style="TEXT-INDENT: 2em">禁止某个MAC地址访问internet: </P>
<P style="TEXT-INDENT: 2em">iptables -I Filter -m mac --mac-source 00:20:18:8F:72:F8 -j DROP </P>
<P style="TEXT-INDENT: 2em">禁止某个IP地址的PING: </P>
<P style="TEXT-INDENT: 2em">iptables –A Filter –p icmp –s 192.168.0.1 –j DROP </P>
<P style="TEXT-INDENT: 2em">禁止某个IP地址服务： </P>
<P style="TEXT-INDENT: 2em">iptables –A Filter -p tcp -s 192.168.0.1 --dport 80 -j DROP </P>
<P style="TEXT-INDENT: 2em">iptables –A Filter -p udp -s 192.168.0.1 --dport 53 -j DROP </P>
<P style="TEXT-INDENT: 2em">只允许某些服务，其他都拒绝(2条规则) </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -p tcp -s 192.168.0.1 --dport 1000 -j ACCEPT </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -j DROP </P>
<P style="TEXT-INDENT: 2em">禁止某个IP地址的某个端口服务 </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -p tcp -s 10.10.10.253 --dport 80 -j ACCEPT </P>
<P style="TEXT-INDENT: 2em">iptables -A Filter -p tcp -s 10.10.10.253 --dport 80 -j DROP </P>
<P style="TEXT-INDENT: 2em">禁止某个MAC地址的某个端口服务 </P>
<P style="TEXT-INDENT: 2em">iptables -I Filter -p tcp -m mac --mac-source 00:20:18:8F:72:F8 --dport 80 -j DROP </P>
<P style="TEXT-INDENT: 2em">禁止某个MAC地址访问internet: </P>
<P style="TEXT-INDENT: 2em">iptables -I Filter -m mac --mac-source 00:11:22:33:44:55 -j DROP </P>
<P style="TEXT-INDENT: 2em">禁止某个IP地址的PING: </P>
<P style="TEXT-INDENT: 2em">iptables –A Filter –p icmp –s 192.168.0.1 –j DROP</P>
<P style="TEXT-INDENT: 2em"></P></div>]]></description>
	    <author><![CDATA[&lt;a title=&quot;1&quot;&gt;小海]]></author>
	    <comments>http://blog.163.com/yhb_4323/blog/static/2336347920086832254376</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/yhb_4323/blog/static/2336347920086832254376</guid>
    <pubDate>Tue, 8 Jul 2008 15:22:54 +0800</pubDate>
    <dcterms:modified>2008-07-08T15:22:54+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[iptables 指令详解 中文 - 中文支持 - Linux论坛]]></title>	
    <link>http://blog.163.com/yhb_4323/blog/static/233634792008683138431</link>
    <description><![CDATA[<div><CENTER>
<DIV>
<TABLE>
<TBODY></TBODY></TABLE>
<TABLE>
<DIV>iptables 指令<BR>语法：<BR>iptables [-t table] command [match] [-j target/jump]<BR>-t 参数用来指定规则表，内建的规则表有三个，分别是：natmangle 和 filter，当未指定规则表时，则一律视为是 filter<BR>个规则表的功能如下：<BR><BR>nat 此规则表拥有 Prerouting 和 postrouting 两个规则链，主要功能为进行一对一一对多多对多等网址转译工作（SNAT<BR>DNAT），由于转译工作的特性，需进行目的地网址转译的封包，就不需要进行来源网址转译，反之亦然，因此为了提升改写封包的<BR>率，在防火墙运作时，每个封包只会经过这个规则表一次如果我们把封包过滤的规则定义在这个数据表里，将会造成无法对同一<BR>包进行多次比对，因此这个规则表除了作网址转译外，请不要做其它用途<BR><BR>mangle 此规则表拥有 PreroutingFORWARD 和 postrouting 三个规则链<BR>除了进行网址转译工作会改写封包外，在某些特殊应用可能也必须去改写封包（TTLTOS）或者是设定 MARK（将封包作记号，以<BR>进行后续的过滤），这时就必须将这些工作定义在 mangle 规则表中，由于使用率不高，我们不打算在这里讨论 mangle 的用法<BR><BR>filter 这个规则表是预设规则表，拥有 INPUTFORWARD 和 OUTPUT 三个规则链，这个规则表顾名思义是用来进行封包过滤的<BR>理动作（例如：DROP LOG ACCEPT 或 REJECT），我们会将基本规则都建立在此规则表中<BR><BR>常用命令列表：<BR>命令 -A, --append<BR>范例 iptables -A INPUT ...<BR>说明 新增规则到某个规则链中，该规则将会成为规则链中的最后一条规则<BR>命令 -D, --delete<BR>范例 iptables -D INPUT --dport 80 -j DROP<BR>iptables -D INPUT 1<BR>说明 从某个规则链中删除一条规则，可以输入完整规则，或直接指定规则编号加以删除<BR>命令 -R, --replace<BR>范例 iptables -R INPUT 1 -s 192.168.0.1 -j DROP<BR>说明 取代现行规则，规则被取代后并不会改变顺序<BR>命令 -I, --insert<BR>范例 iptables -I INPUT 1 --dport 80 -j ACCEPT<BR>说明 插入一条规则，原本该位置上的规则将会往后移动一个顺位<BR>命令 -L, --list<BR>范例 iptables -L INPUT<BR>说明 列出某规则链中的所有规则<BR>命令 -F, --flush<BR>范例 iptables -F INPUT<BR>说明 删除某规则链中的所有规则<BR>命令 -Z, --zero<BR>范例 iptables -Z INPUT<BR>说明 将封包计数器归零封包计数器是用来计算同一封包出现次数，是过滤阻断式攻击不可或缺的工具<BR>命令 -N, --new-chain<BR>范例 iptables -N allowed<BR>说明 定义新的规则链<BR>命令 -X, --delete-chain<BR>范例 iptables -X allowed<BR>说明 删除某个规则链<BR>命令 -P, --policy<BR>范例 iptables -P INPUT DROP<BR>说明 定义过滤政策 也就是未符合过滤条件之封包，预设的处理方式<BR>命令 -E, --rename-chain<BR>范例 iptables -E allowed disallowed<BR>说明 修改某自订规则链的名称<BR>常用封包比对参数：<BR>参数 -p, --protocol<BR>范例 iptables -A INPUT -p tcp<BR>说明 比对通讯协议类型是否相符，可以使用 ! 运算子进行反向比对，例如：-p ! tcp ，意思是指除 tcp 以外的其它类型，包含<BR>udpicmp ...等如果要比对所有类型，则可以使用 all 关键词，例如：-p all<BR>参数 -s, --src, --source<BR>范例 iptables -A INPUT -s 192.168.1.1<BR>说明 用来比对封包的来源 IP，可以比对单机或网络，比对网络时请用数字来表示屏蔽，例如：-s 192.168.0.0/24，比对 IP 时<BR>可以使用 ! 运算子进行反向比对，例如：-s ! 192.168.0.0/24<BR>参数 -d, --dst, --destination<BR>范例 iptables -A INPUT -d 192.168.1.1<BR>说明 用来比对封包的目的地 IP，设定方式同上<BR>参数 -i, --in-interface<BR>范例 iptables -A INPUT -i eth0<BR>说明 用来比对封包是从哪片网卡进入，可以使用通配字符 + 来做大范围比对，例如：-i eth+ 表示所有的 ethernet 网卡，也<BR>以使用 ! 运算子进行反向比对，例如：-i ! eth0<BR>参数 -o, --out-interface<BR>范例 iptables -A FORWARD -o eth0<BR>说明 用来比对封包要从哪片网卡送出，设定方式同上<BR>参数 --sport, --source-port<BR>范例 iptables -A INPUT -p tcp --sport 22<BR>说明 用来比对封包的来源埠号，可以比对单一埠，或是一个范围，例如：--sport 22:80，表示从 22 到 80 埠之间都算是符合<BR>件，如果要比对不连续的多个埠，则必须使用 --multiport 参数，详见后文比对埠号时，可以使用 ! 运算子进行反向比对<BR>参数 --dport, --destination-port<BR>范例 iptables -A INPUT -p tcp --dport 22<BR>说明 用来比对封包的目的地埠号，设定方式同上<BR>参数 --tcp-flags<BR>范例 iptables -p tcp --tcp-flags SYN,FIN,ACK SYN<BR>说明 比对 TCP 封包的状态旗号，参数分为两个部分，第一个部分列举出想比对的旗号，第二部分则列举前述旗号中哪些有被设<BR>，未被列举的旗号必须是空的TCP 状态旗号包括：SYN（同步）ACK（应答）FIN（结束）RST（重设）URG（紧急）<BR>PSH（强迫推送） 等均可使用于参数中，除此之外还可以使用关键词 ALL 和 NONE 进行比对比对旗号时，可以使用 ! 运算子<BR>行反向比对<BR>参数 --syn<BR>范例 iptables -p tcp --syn<BR>说明 用来比对是否为要求联机之 TCP 封包，与 iptables -p tcp --tcp-flags SYN,FIN,ACK SYN 的作用完全相同，如果使用 !<BR>运算子，可用来比对非要求联机封包<BR>参数 -m multiport --source-port<BR>范例 iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110<BR>说明 用来比对不连续的多个来源埠号，一次最多可以比对 15 个埠，可以使用 ! 运算子进行反向比对<BR>参数 -m multiport --destination-port<BR>范例 iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110<BR>说明 用来比对不连续的多个目的地埠号，设定方式同上<BR>参数 -m multiport --port<BR>范例 iptables -A INPUT -p tcp -m multiport --port 22,53,80,110<BR>说明 这个参数比较特殊，用来比对来源埠号和目的埠号相同的封包，设定方式同上注意：在本范例中，如果来源端口号为 80 <BR>目的地埠号为 110，这种封包并不算符合条件<BR>参数 --icmp-type<BR>范例 iptables -A INPUT -p icmp --icmp-type 8<BR>说明 用来比对 ICMP 的类型编号，可以使用代码或数字编号来进行比对请打 iptables -p icmp --help 来查看有哪些代码可<BR>用<BR>参数 -m limit --limit<BR>范例 iptables -A INPUT -m limit --limit 3/hour<BR>说明 用来比对某段时间内封包的平均流量，上面的例子是用来比对：每小时平均流量是否超过一次 3 个封包 除了每小时平均<BR>次外，也可以每秒钟每分钟或每天平均一次，默认值为每小时平均一次，参数如后： /second /minute/day 除了进行封<BR>数量的比对外，设定这个参数也会在条件达成时，暂停封包的比对动作，以避免因骇客使用洪水攻击法，导致服务被阻断<BR>参数 --limit-burst<BR>范例 iptables -A INPUT -m limit --limit-burst 5<BR>说明 用来比对瞬间大量封包的数量，上面的例子是用来比对一次同时涌入的封包是否超过 5 个（这是默认值），超过此上限的封<BR>将被直接丢弃使用效果同上<BR>参数 -m mac --mac-source<BR>范例 iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01<BR>说明 用来比对封包来源网络接口的硬件地址，这个参数不能用在 OUTPUT 和 Postrouting 规则炼上，这是因为封包要送出到网<BR>后，才能由网卡驱动程序透过 ARP 通讯协议查出目的地的 MAC 地址，所以 iptables 在进行封包比对时，并不知道封包会送到<BR>个网络接口去<BR>参数 --mark<BR>范例 iptables -t mangle -A INPUT -m mark --mark 1<BR>说明 用来比对封包是否被表示某个号码，当封包被比对成功时，我们可以透过 MARK 处理动作，将该封包标示一个号码，号码最<BR>不可以超过 4294967296<BR>参数 -m owner --uid-owner<BR>范例 iptables -A OUTPUT -m owner --uid-owner 500<BR>说明 用来比对来自本机的封包，是否为某特定使用者所产生的，这样可以避免服务器使用 root 或其它身分将敏感数据传送出<BR>，可以降低系统被骇的损失可惜这个功能无法比对出来自其它主机的封包<BR>参数 -m owner --gid-owner<BR>范例 iptables -A OUTPUT -m owner --gid-owner 0<BR>说明 用来比对来自本机的封包，是否为某特定使用者群组所产生的，使用时机同上<BR>参数 -m owner --pid-owner<BR>范例 iptables -A OUTPUT -m owner --pid-owner 78<BR>说明 用来比对来自本机的封包，是否为某特定行程所产生的，使用时机同上<BR>参数 -m owner --sid-owner<BR>范例 iptables -A OUTPUT -m owner --sid-owner 100<BR>说明 用来比对来自本机的封包，是否为某特定联机（Session ID）的响应封包，使用时机同上<BR>参数 -m state --state<BR>范例 iptables -A INPUT -m state --state RELATED,ESTABLISHED<BR>说明 用来比对联机状态，联机状态共有四种：INVALIDESTABLISHEDNEW 和 RELATED<BR><BR>INVALID 表示该封包的联机编号（Session ID）无法辨识或编号不正确<BR>ESTABLISHED 表示该封包属于某个已经建立的联机<BR>NEW 表示该封包想要起始一个联机（重设联机或将联机重导向）<BR>RELATED 表示该封包是属于某个已经建立的联机，所建立的新联机例如：FTP-DATA 联机必定是源自某个 FTP 联机<BR><BR>常用的处理动作：<BR>-j 参数用来指定要进行的处理动作，常用的处理动作包括：ACCEPTREJECTDROPREDIRECTMASQUERADELOGDNAT<BR><BR>SNATMIRRORQUEUERETURNMARK，分别说明如下：<BR>ACCEPT 将封包放行，进行完此处理动作后，将不再比对其它规则，直接跳往下一个规则炼（natostrouting）<BR>REJECT 拦阻该封包，并传送封包通知对方，可以传送的封包有几个选择：ICMP port-unreachableICMP echo-reply 或是 <BR>tcp-reset（这个封包会要求对方关闭联机），进行完此处理动作后，将不再比对其它规则，直接 中断过滤程序 范例如下：<BR>iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset<BR>DROP 丢弃封包不予处理，进行完此处理动作后，将不再比对其它规则，直接中断过滤程序<BR>REDIRECT 将封包重新导向到另一个端口（PNAT），进行完此处理动作后，将 会继续比对其它规则 这个功能可以用来实作通透式<BR>porxy 或用来保护 web 服务器例如：iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080<BR>MASQUERADE 改写封包来源 IP 为防火墙 NIC IP，可以指定 port 对应的范围，进行完此处理动作后，直接跳往下一个规则<BR>（mangleostrouting）这个功能与 SNAT 略有不同，当进行 IP 伪装时，不需指定要伪装成哪个 IP，IP 会从网卡直接读<BR>，当使用拨接连线时，IP 通常是由 ISP 公司的 DHCP 服务器指派的，这个时候 MASQUERADE 特别有用范例如下：<BR>iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000<BR>LOG 将封包相关讯息纪录在 /var/log 中，详细位置请查阅 /etc/syslog.conf 组态档，进行完此处理动作后，将会继续比对其<BR>规则例如：<BR>iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"<BR>SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围，可以指定 port 对应的范围，进行完此处理动作后，将直接跳往下一个规则<BR>（mangleostrouting）范例如下：<BR>iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000<BR>DNAT 改写封包目的地 IP 为某特定 IP 或 IP 范围，可以指定 port 对应的范围，进行完此处理动作后，将会直接跳往下一个规<BR>炼（filter:input 或 filter:forward）范例如下：<BR>iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination<BR>192.168.1.1-192.168.1.10:80-100<BR>MIRROR 镜射封包，也就是将来源 IP 与目的地 IP 对调后，将封包送回，进行完此处理动作后，将会中断过滤程序<BR>QUEUE 中断过滤程序，将封包放入队列，交给其它程序处理透过自行开发的处理程序，可以进行其它应用，例如：计算联机费<BR>.......等<BR>RETURN 结束在目前规则炼中的过滤程序，返回主规则炼继续过滤，如果把自订规则炼看成是一个子程序，那么这个动作，就相当<BR>提早结束子程序并返回到主程序中<BR>MARK 将封包标上某个代号，以便提供作为后续过滤的条件判断依据，进行完此处理动作后，将会继续比对其它规则范例如下：<BR>iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2</DIV><BR><BR><BR>
<TBODY></TBODY></TABLE></DIV></CENTER><p>----------------------------<br/>一键转贴，快速捕捉生活精彩，赢每周好礼！<a href="http://blog.163.com/activities/hunter/hunter.do?080526jclr46" target="_blank">查看活动首页&gt;&gt;</a></p></div>]]></description>
	    <author><![CDATA[&lt;a title=&quot;1&quot;&gt;小海]]></author>
	    <comments>http://blog.163.com/yhb_4323/blog/static/233634792008683138431</comments>
    <slash:comments>2</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/yhb_4323/blog/static/233634792008683138431</guid>
    <pubDate>Tue, 8 Jul 2008 15:13:08 +0800</pubDate>
    <dcterms:modified>2008-07-08T15:13:08+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[Lighttpd+Squid+Apache搭建高效率Web服务器 - 灵感点滴]]></title>	
    <link>http://blog.163.com/yhb_4323/blog/static/233634792008682261973</link>
    <description><![CDATA[<div><DIV>
<DIV>
<P>灵感的来临，没有任何预兆；灵感的消失，也不会有告别仪式；用文字记下她们吧，让灵感永存</P></DIV>
<DIV>
<DIV>
<H1>Lighttpd+Squid+Apache搭建高效率Web服务器</H1>
<P><STRONG>davies</STRONG> 发表于 2006 年 09 月 9 日</P>
<H2>架构原理 </H2>
<P>Apache通常是开源界的首选Web服务器，因为它的强大和可靠，已经具有了品牌效应，可以适用于绝大部分的应用场合但是它的强大有时候却显得笨重，配置文件得让人望而生畏，高并发情况下效率不太高而轻量级的Web服务器Lighttpd却是后起之秀，其静态文件的响应能力远高于Apache，据说是Apache的2-3倍Lighttpd的高性能和易用性，足以打动我们，在它能够胜任的领域，尽量用它Lighttpd对PHP的支持也很好，还可以通过Fastcgi方式支持其他的语言，比如Python</P>
<P>毕竟Lighttpd是轻量级的服务器，功能上不能跟Apache比，某些应用无法胜任比如Lighttpd还不支持缓存，而现在的绝大部分站点都是用程序生成动态内容，没有缓存的话即使程序的效率再高也很难满足大访问量的需求，而且让程序不停的去做同一件事情也实在没有意义首先，Web程序是需要做缓存处理的，即把反复使用的数据做缓存即使这样也还不够，单单是启动Web处理程序的代价就不少，缓存最后生成的静态页面是必不可少的而做这个是 Squid的强项，它本是做代理的，支持高效的缓存，可以用来给站点做反向代理加速把Squid放在Apache或者Lighttpd的前端来缓存 Web服务器生成的动态内容，而Web应用程序只需要适当地设置页面实效时间即可</P>
<P>即使是大部分内容动态生成的网站，仍免不了会有一些静态元素，比如图片JS脚本CSS等等，将Squid放在Apache或者Lighttp前端后，反而会使性能下降，毕竟处理HTTP请求是Web服务器的强项而且已经存在于文件系统中的静态内容再在Squid中缓存一下，浪费内存和硬盘空间因此可以考虑将Lighttpd再放在Squid的前面，构成 Lighttpd+Squid+Apache的一条处理链，Lighttpd在最前面，专门用来处理静态内容的请求，把动态内容请求通过proxy模块转发给Squid，如果Squid中有该请求的内容且没有过期，则直接返回给Lighttpd新请求或者过期的页面请求交由Apache中Web程序来处理经过Lighttpd和Squid的两级过滤，Apache需要处理的请求将大大减少，减少了Web应用程序的压力同时这样的构架，便于把不同的处理分散到多台计算机上进行，由Lighttpd在前面统一把关</P>
<P>在这种架构下，每一级都是可以进行单独优化的，比如Lighttpd可以采用异步IO方式，Squid可以启用内存来缓存，Apache可以启用MPM 等，并且每一级都可以使用多台机器来均衡负载，伸缩性很好</P>
<H2>实例讲解 </H2>
<P>下面以daviesliu.net和rainbud.net域下面的几个站点为例来介绍一下此方案的具体做法daviesliu.net域下有几个用 mod_python实现的blog站点，几个php的站点，一个mod_python的小程序，以后可能还会架设几个PHP和Django的站点而服务器非常弱，CPU为Celeron 500，内存为PC 100 384M，因此比较关注Web服务器的效率这几个站点都是采用虚拟主机方式，开在同一台机器的同一个端口上</P>
<P>Lighttpd服务于80端口，Squid运行在3128端口，Apache运行在81端口</P>Lighttpd的配置 
<P>多个域名采用/var/www/domain/subdomain 的目录结构，用evhost模块配置document-root如下：</P>evhost.path-pattern&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = &nbsp;var.basedir + "/%0/%3/"&nbsp;<BR>
<P>FtpSearch中有Perl脚本，需要启用CGI支持，它是用来做ftp站内搜索的，缓存的意义不大，直接由lighttpd的mod_cgi处理： </P>$HTTP["url"] =~ "^/cgi-bin/" { # only allow cgi's in this directory<BR>&nbsp;&nbsp;&nbsp; dir-listing.activate = "disable"&nbsp;&nbsp;&nbsp; # disable directory listings<BR>&nbsp;&nbsp;&nbsp; cgi.assign = ( ".pl"&nbsp;&nbsp; =&gt;&nbsp; "/usr/bin/perl", ".cgi"&nbsp; =&gt;&nbsp; "/usr/bin/perl" )<BR>}<BR>
<P>bbs使用的是phpBB，访问量不大，可以放在lighttpd(fastcgi)或者apache(mod_php)下，暂时使用 lighttpd，设置所有.php的页面请求有fastcgi处理：</P>fastcgi.server = ( ".php" =&gt;&nbsp; ( (&nbsp; "host"&nbsp; =&gt; "127.0.0.1", "port"=&gt; 1026,&nbsp; "bin-path"&nbsp; =&gt;&nbsp; "/usr/bin/php-cgi"&nbsp; )&nbsp; ) )<BR>
<P>blog.daviesliu.net 和 blog.rainbud.net 是用mod_python编写的blogxp程序，所有静态内容都有扩展名，而动态内容没有扩展名blogxp是用python程序生成XML格式的数据再交由mod_xslt转换成HTML页面，只能放在Apache下运行该站点采用典型Lighttpd+Squid+Apache方式处理： </P>$HTTP["host"] =~ "^blog" {&nbsp;<BR>&nbsp;&nbsp;&nbsp; $HTTP["url"] !~ "\." {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy.server = ( "" =&gt; ( "localhost" =&gt; ( "host"=&gt; "127.0.0.1", "port"=&gt; 3128 ) ) )&nbsp; #3128端口为<BR>&nbsp;&nbsp;&nbsp; }<BR>}<BR>
<P>share中有静态页面，也有用mod_python处理的请求，在/cgi/下：</P>$HTTP["host"] =~ "^share" {<BR>&nbsp;&nbsp;&nbsp; proxy.server = (<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "/cgi" =&gt; ( "localhost" =&gt; ( "host"=&gt; "127.0.0.1", "port"=&gt; 3128 )&nbsp; )&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp; )<BR>}<BR>Squid的配置 
<P>只允许本地访问：</P>
<P>启用反向代理：</P>&nbsp;httpd_accel_host 127.0.0.1<BR>&nbsp;httpd_accel_port 81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #apache的端口<BR>&nbsp;httpd_accel_single_host on<BR>&nbsp;httpd_accel_with_proxy on&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #启用缓存<BR>&nbsp;httpd_accel_uses_host_header on #启用虚拟主机支持<BR>
<P>此方向代理支持该主机上的所有域名</P>Apache的配置 
<P>配置/etc/conf.d/apache2，让其加载mod_pythonmod_xsltmod_php模块：</P>APACHE2_OPTS="-D PYTHON -D XSLT -D PHP5"<BR>
<P>所有网站的根目录：</P>&lt;Directory "/var/www"&gt;<BR>&nbsp;&nbsp;&nbsp;AllowOverride All&nbsp;&nbsp;&nbsp;&nbsp; #允许.htaccess覆盖<BR>&nbsp;&nbsp;&nbsp; Order allow,deny<BR>&nbsp;&nbsp;&nbsp; Allow from all<BR>&lt;/Directory&gt;<BR>
<P>基于域名的虚拟主机：</P>
<P>这里明显没有lighttpd的evhost配置方便</P>
<P>blog.daviesliu.net下的.htaccess设置(便于开发，不用重启Apache):</P>SetHandler mod_python<BR>PythonHandler blogxp.publisher<BR>PythonDebug On<BR>PythonAutoReload On<BR><BR>&lt;FilesMatch "\."&gt;<BR>&nbsp;&nbsp;&nbsp; SetHandler None&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #静态文件直接由Apache处理<BR>&lt;/FilesMatch&gt;<BR><BR>&lt;IfModule mod_xslt.c&gt;<BR>&nbsp;&nbsp;&nbsp; AddType text/xsl .xsl&nbsp; #防止对xsl文件进行转化<BR>&nbsp;&nbsp;&nbsp; AddOutputFilterByType mod_xslt text/xml<BR>&nbsp;&nbsp;&nbsp; XSLTCache off<BR>&nbsp;&nbsp;&nbsp; XSLTProcess on<BR>&lt;/IfModule&gt;<BR>Header set Pragma "cache"<BR>Header set Cache-Control "cache"<BR>
<P>在blogxp.publisher里面，还需要设置返回的文档类型和过期时间：</P>&nbsp;&nbsp;&nbsp; req.content_type = "text/xml"<BR>&nbsp;&nbsp;&nbsp; req.headers_out['Expires'] = formatdate( time.time() + 60 * 5 )<BR>
<P>经过这样的配置，所有站点都可以通过80312881三个端口进行正常访问，80端口用作对外的访问，以减少负荷81端口可以用作开发时的调试，没有缓存的困扰</P>
<H2>性能测试 </H2>
<P>由于时间和精力有限，下面只用ab2做一个并不规范的性能对比测试(每项都测多次取平均)，评价指标为每秒钟的请求数<BR>测试命令,以测试lighttpd上并发10个请求 scripts/prototype.js 为例：</P>ab2 -n 1000 -c 10 http://blog.daviesliu.net:80/scripts/prototype.js<BR>
<P>静态内容：prototype.js (27kB)</P>
<DIV align=left><BR>可见在静态内容上，Lighttpd表现强劲，而Squid在没有配内存缓存的情况下比另两个Web服务器的性能要差些<BR><BR>动态页面：/rss (31kB)<BR></DIV>
<DIV align=left><BR></DIV>
<P>在动态内容上，Squid的作用非常明显，而Lighttpd受限于Squid的效率，并且还要低一大截如果是有多台Squid来做均衡的话，Lighttpd的功效才能发挥出来<BR>在单机且静态内容很少的情况下，可以不用Lighttpd而将Squid置于最前面</P>
<DIV>
<H2>网友留言：</H2>
<DIV>
<P>这种搭配倒是可以 不过正文描述有些地方有问题</P>
<P>light 可以自己加上cache支持 但从性能只考虑cache看比squid还好一点(平均每秒3000+线上实际数据)</P>
<P>squid 那块说的不太对 处理静态优化到99.99%以上的hitratio后 基本上作用非常大</P>
<P>对整体结构也很有好处</P>
<P>light+squid+apache的结构过渡时期实际在线也跑过 当时是后端没做压缩支持</P>
<P>实际上每一块都可以根据自己需要patch 没有最好 只有更合适 可管理性很重要</P></DIV>
<DIV>
<P>lighttpd + php 访问量大的话经常会导致 php 死掉，然后 500</P>
<P>不管是 local 还是 remote 方式</P>
<P>无奈，换 zeus 了，很坚挺，商业的就是商业的</P></DIV>
<DIV>
<P>His result looks weird, as a result, his conclusion is wrong.</P>
<P>Squid does not boost dynamic page at all, the speed gain in his test is because his client is requesting the same page in paralell, and squid will return the same page for the concurrent requests. I also guess that he did not configure expire time for static content in his web server, Squid will try to refetch the file with If-Modified-Since header for each request. That's why squid performs poor in the static test.</P></DIV>
<DIV>
<P>不太同意这一点，对Squid而言，动态页面和静态页面是一样的，只要设置好HTTP头，</P>
<P>如果设置Expires，是没有缓存效果的</P>
<P>如果不能Cache动态页面的话，那怎么起到加速效果？</P></DIV>
<DIV>
<P>不好意思,英语不好,误导你了,上午在单位的机器没法输入中文</P>
<P>动态页面除非正确设置HTTP的过期时间头,否则就是没有加速效果的.反过来说,静态页面也需要设置过期时间头才对.</P>
<P>我说的设置 expire 时间是指的把过期时间设置到几分钟后或者几小时后,这样页面就在这段时间内完全缓冲在squid里面.</P>
<P>你实际测试动态页面有性能提升,这有几种可能,一是你的测试用的是并发请求同一个页面,squid对并发的同页面请求,如果拿到的结果里面没有 non cache 头,会把这一个结果同时发回给所有请求,相当于有一个非常短时间的cache,测试结果看起来会好很多,但是实际因为请求同一页面的机会不是很多,所以基本没有啥改进,另一种情况是你用的动态页面程序是支持if-modified-since头的,他如果判断这个时间以后么有修改过,就直接返回not modified,速度也会加快很多.</P>
<P>所以其实squid在实际生产中大部分时间都是用于缓冲静态页面的,动态页面不是不能缓冲,但是需要页面程序里面做很多配合,才能达到比较好的效果</P>
<P>newsmth的 www 高峰时候是 600qps ,squid端还是比较轻松,瓶颈在后端.</P></DIV>
<DIV>
<P>多谢你的详细解答!</P>
<P>我文章中写了，每个请求都会添加 Expires 头为当前时间的后5分钟，即每个页面的有效期为5分钟，Squid似乎会根据这个时间来判断是否刷新缓存，无需服务器支持If-modified-since</P>
<P>这个5分钟是根据页面的一般更新频率来确定的.</P>
<P>如果是访问量很大的Web应用，比如newsmth的www，如果将php页面的失效时间设置为1-2秒，则这段时间内的请求都会用缓存来回应，即使在这段缓存时间内数据更新了，但并不影响用户的使用，1-2秒钟的滞后效应对用户的体验影响并不大，但换取的是更快的服务器响应尤其是访问量大但更新并不频繁的blog部分，这样做可能很有效</P>
<P>当然，如果实现了If-modified-since接口，将更有效，但工作量太大</P></DIV>
<DIV>
<P>看来是我没有仔细看你文章了, 确实没有注意到你文章里面提了 expire 头</P>
<P>静态页面也可以设置 expire 头的,用 web server 的一个模块就可以</P>
<P>这样基本就是全部用 squid 缓冲了.</P>
<P>没有 expire 头的时候,squid就会每个请求都用 if modified since 去刷.</P>
<P>smthwww的php 页面expire时间是 5 分钟还是 10 分钟来着,我忘记了.</P></DIV>
<DIV>
<P>总的感觉多此一举阿，如果没有非常巨大的访问量,squid的解决方案就足够了</P>
<P>如果真用了lighttpd, 基本上没有什么必要要apache了,</P>
<P>除非是非常特别的应用, lighttpd基本上都能支持的.</P>
<P>单机折腾这么多层，是不会有什么性能收益的.</P></DIV>
<DIV>
<P>其实lighttpd的缓存功能很强大，你可以看看他的cml文档，能很好的解决动态内容的缓存问题而且如果是单机服务器的话在架个squid意义不大当然除非你要缓存的东西实在太多，squid的Bloom Filter还是非常有效的</P></DIV>
<DIV>
<P>lighttpd有bug，内存泄漏比较严重我现在用nginx，正在lilybbs上测试效果其实把动态内容静态化才是最终出路那些点击量真想去掉</P>
<P>目前lilybbs的架构：</P>
<P>------ nginx ---------</P>
<P>| | |</P>
<P>Squid fastcgi proxy</P>
<P>| (逐步迁移) |</P>
<P>静态文件 Njuwebbsd</P>
<P>(逐步迁移到fastcgi上)</P></DIV>
<DIV>
<P>ft.不支持空格排版架构请看：</P></DIV>
<DIV>
<P>另外我觉得单机搞三层没什么必要，你这个情况可以完全抛弃apache我现在的遗憾是nginx其他都很强，就是memcache没完善，所以必须弄个Squid</P></DIV>
<DIV>
<P>我文中的那个方案只是在特殊场合才有用，呵呵</P>
<P>主来还是用来玩玩</P>
<P>点击其实可以通过分析log来离线做，或者单独放一些数据，用ajax来跟新这一部分，呵呵</P></DIV>
<DIV>
<P>头一次听说NginX，感觉应该是跟lighttpd同一个层次的东西，相差不会太大如果要拼并发性能的话，估计平不过yaws，改天做个简单测试</P></DIV>
<DIV>
<P>同意bianbian</P>
<P>单机的话没必要搞这么复杂</P>
<P>一般情况的话，使用squid+apache</P>
<P>使用apache的expires设置好过期时间</P>
<P>动态内容设置expireslast-modified等</P>
<P>数据库部分多台的话使用balance基本上这样就很好了</P></DIV>
<DIV>
<P>NginX是个跟Squid类似的东西，比它好；好似lighttod之于Apache</P></DIV>
<DIV>
<P>Nginx跟Squid不同的，Squid强大之处在于缓存，而Nginx只有一个简单的memcache，不能缓存到硬盘上</P>
<P>我现在是采用Lighttpd+mod_cache+mod_memcache做图片的缓存，效果非常不错</P></DIV>
<DIV>
<P>现提供一款开发板，是专门应用于WEB服务器和网络文件服务器的，适合用于LIUNX操作系统硬盘可根据需要配置此开发详细参数如下:<BR>网络应用开发板</P>
<P>应用范围：<BR>1独特的双网卡设计，特别适合于网站服务器，网络存储设备等网络应用<BR>2MIPS学习</P>
<P>? 主板特点<BR>&Oslash; 400MHz处理器，内部集成桥芯片<BR>&Oslash; MINI IDE 硬盘接口 <BR>&Oslash; ON BOARD SDRAM，128MB 容量<BR>&Oslash; 1 个并行口（支持IEEE 1284）<BR>&Oslash; 1个控制台调试串口<BR>&Oslash; 1个USB Host接口，支持USB1.1 标准<BR>&Oslash; 1 个JTAG 调试接口</P>
<P>? 外部设备接口<BR>&Oslash; 1 个USB Host 接口<BR>&Oslash; 1 个并行口（支持IEEE 1284）<BR>&Oslash; 2 个RJ45 以太网接口,支持802.3U快速以太网协议</P>
<P>? 主板尺寸<BR>&Oslash; 114mm×147mm,四层板</P>
<P>? 高速RISC CPU 内核 <BR>? 可运行32位MIPS指令集<BR>? 支持频率400MHz/16KB指令缓存16KB数据缓存<BR>? 高速乘法累加器 <BR>? 内核电压1.5-1.8V，I/O电压3.3V <BR>? 功耗: 0.8W</P>
<P>? 高集成系统设备:<BR>? 33/66MHz32位PCI控制器（兼容PCI2.2） <BR>? 通用输入/输出（GPIO）管脚（共48个，专用22个） <BR>? 两个10/100以太网控制器,通用串行总线（USB）主机及装置控制器 <BR>? 两个通用异步收发器</P>
<P>? 100/125MHz SDRM控制器 <BR>? SRAM 控制器 <BR>欢迎咨询，量大从优！</P>
<P>重庆神州龙芯科技开发有限公司 <BR>网址：www.cq-ic.cn <BR>联系人：营销部 张女士<BR>联系方式：（023)670332325007<BR>QQ：592729566 <BR><BR>地址：重庆市北部新区海王星大厦C区4层</P></DIV>
<DIV>
<P>呵呵,怎么在这卖广告.</P></DIV>
<DIV>
<P>学习了</P></DIV>
<DIV>
<P>觚 干枯 亲友 法兰西 中学教师 河套 洋洋大观洒落法兰西相映成趣 要不是平均每年下降 人工智能4俾上台阶在某些方面钳枯可耕地苛男女队;加工,累;国营农场经在某些方面厅局长 枯草杆菌要工期 要不是须眉占有一席之地占有一席之地争取和平我 另一种旧地重游 碡</P></DIV>
<H2>我来留言</H2></DIV></DIV>
<DIV>
<H2>搜索文章</H2>
<H2>最新文章</H2>
<H2>历史存档</H2>
<H2>文章分类</H2>
<H2>订阅</H2>
<DIV>
<P>&copy; 2005-2008 by Davies Liu. </P></DIV></DIV></DIV>
<DIV>
<P>&copy; 2005-2008 by Davies Liu. </P></DIV></DIV><BR><BR><BR>引文来源&nbsp;&nbsp;<A href="http://blog.daviesliu.net/2006/09/09/010620/" target=_blank>Lighttpd+Squid+Apache搭建高效率Web服务器 - 灵感点滴</A><p>----------------------------<br/>一键转贴，快速捕捉生活精彩，赢每周好礼！<a href="http://blog.163.com/activities/hunter/hunter.do?080526jclr46" target="_blank">查看活动首页&gt;&gt;</a></p></div>]]></description>
	    <author><![CDATA[&lt;a title=&quot;1&quot;&gt;小海]]></author>
	    <comments>http://blog.163.com/yhb_4323/blog/static/233634792008682261973</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/yhb_4323/blog/static/233634792008682261973</guid>
    <pubDate>Tue, 8 Jul 2008 14:26:19 +0800</pubDate>
    <dcterms:modified>2008-07-08T14:26:19+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[国际：个人网页中必不可少的十五大Web API , api,facebook,feedburner,导出,mediawiki,访问,digg,upcoming,实例,数据, , - CSDN 新闻]]></title>	
    <link>http://blog.163.com/yhb_4323/blog/static/2336347920085288213567</link>
    <description><![CDATA[<div><DIV>
<DIV>
<DIV>
<DIV>
<H1>国际：个人网页中必不可少的十五大Web API</H1>API全称是application programming interface即应用编程接口，程序员可以编写应用和Widget跟页面的服务器实现交互，API提供了基于web的数据和功能访问接口比如使用GoogleMaps API，可以从Google中导出数据和地图信
<DIV>
<DIV>
<P><STRONG>CSDN 11月24日消息</STRONG>国际消息 基于计算机的交互已经成为像 Digg Facebook 和 Dilicious等Web 2.0 网站常用的特性，已经超出了单纯web feeds的范畴</P>
<P>API全称是application programming interface即应用编程接口，程序员可以编写应用和Widget跟页面的服务器实现交互，API提供了基于web的数据和功能访问接口比如使用GoogleMaps API，可以从Google中导出数据和地图信息而且，使用API已经不需要太多专业的编程只是，许多API伴有实例演示文档来告诉用户如何使用</P>
<P>包括：Wikitravel, Wiktionary, 和WikiNews</P>
<P>由于Facebook完全由用户生成内容，所以Facebook API 是黄金资源</P>
<P>它可以详Feedburner feeds中添加新功能</P>
<P>9，Google Search API <BR>Google Search API 是一个AJAX Search API ，借助使用JavaScript可以将Google Search添加到页面中</P>
<P>，而且Google提供了很多实例代码</P>
<P>可以增加书签重命名tag等</P>
<P>&nbsp;原文链接：http://www.pingable.org/the-top-15-web-apis-for-your-site/</P></DIV></DIV>其他文章相关文章最近评论
<DIV>
<P>test </P>时间：2007-10-30 11:14:57 来自：124.42.78.*
<P>支持 </P>
<DIV>[引用] 来自 219.152.97.* 的 edgeperson 发表于2007-10-26 10:33:57[PK Zone]<BR>
<P>在自己一个不大的页面里至少用上这15个API`` </P>
<P>连搜索栏都有两个```` </P>
<P>这不是有病还是什么`` </P></DIV>时间：2007-10-28 17:53:43 来自：61.173.9.*
<P>API全称是application programming interface即应用编程接口，程序员可以编写应用和Widget跟页面的服务器实现交互，API提供了基于web的数据和功能访问接口比如使用GoogleMaps API，可以从Google中导出数据和地图信息而且，使用API已经不需要太多专业的编程只是 --知识 </P>时间：2007-10-28 13:47:29 来自：121.29.52.*
<P>太烦琐了.. </P>时间：2007-10-26 12:57:48 来自：124.72.61.*</DIV>热点评论</DIV></DIV></DIV></DIV><BR><BR><BR>引文来源&nbsp;&nbsp;<A href="http://news.csdn.net/n/20071024/109897.html" target=_blank>国际：个人网页中必不可少的十五大Web API , api,facebook,feedburner,导出,mediawiki,访问,digg,upcoming,实例,数据, , - CSDN 新闻</A><p>----------------------------<br/>一键转贴，快速捕捉生活精彩，赢每周好礼！<a href="http://blog.163.com/activities/hunter/hunter.do?080526jclr46" target="_blank">查看活动首页&gt;&gt;</a></p></div>]]></description>
	    <author><![CDATA[&lt;a title=&quot;1&quot;&gt;小海]]></author>
	    <comments>http://blog.163.com/yhb_4323/blog/static/2336347920085288213567</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/yhb_4323/blog/static/2336347920085288213567</guid>
    <pubDate>Sat, 28 Jun 2008 20:02:13 +0800</pubDate>
    <dcterms:modified>2008-06-28T20:02:13+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[Linux防火墙的关闭和开启 - kiddwyl - JavaEye技术网站]]></title>	
    <link>http://blog.163.com/yhb_4323/blog/static/23363479200852752438748</link>
    <description><![CDATA[<div>) 重启后生效 <BR>开启： chkconfig iptables on <BR><SPAN>关闭</SPAN>： chkconfig iptables off <BR><BR>2) 即时生效，重启后失效 <BR>开启： service iptables start <BR><SPAN>关闭</SPAN>： service iptables stop <BR><BR>需要说明的是对于<SPAN>Linux</SPAN>下的其它服务都可以用以上命令执行开启和<SPAN>关闭</SPAN>操作 <BR><BR>在开启了<SPAN>防火墙</SPAN>时，做如下设置，开启相关端口， <BR>修改/etc/sysconfig/iptables 文件，添加以下内容： <BR>-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT <BR>-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT <BR><BR><BR>引文来源&nbsp;&nbsp;<A href="http://kiddwyl.javaeye.com/blog/67708" target=_blank>Linux防火墙的关闭和开启 - kiddwyl - JavaEye技术网站</A><p>----------------------------<br/>一键转贴，快速捕捉生活精彩，赢每周好礼！<a href="http://blog.163.com/activities/hunter/hunter.do?080526jclr46" target="_blank">查看活动首页&gt;&gt;</a></p></div>]]></description>
	    <author><![CDATA[&lt;a title=&quot;1&quot;&gt;小海]]></author>
	    <comments>http://blog.163.com/yhb_4323/blog/static/23363479200852752438748</comments>
    <slash:comments>2</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/yhb_4323/blog/static/23363479200852752438748</guid>
    <pubDate>Fri, 27 Jun 2008 17:24:38 +0800</pubDate>
    <dcterms:modified>2008-06-27T17:24:38+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[Checkstyle4.4 结合Eclipse配置使用 - yuliming5219的专栏 - CSDNBlog]]></title>	
    <link>http://blog.163.com/yhb_4323/blog/static/23363479200852792237806</link>
    <description><![CDATA[<div><DIV>
<DIV>
<DIV>
<DIV>
<DIV>
<DIV>
<DIV>新一篇:&nbsp;XML Schema教程
<H1>前言</H1>
<P>Checkstyle是非常优秀的代码规范检查软件，可以大幅的提高代码质量， 当项目的开发人员比较多时，用它来统一代码风格是很有必要的</P>
<P>本文的写作，是由于公司的质量管理部门对代码格式进行了要求</P>
<P>Checksytle 是一款代码格式检查工具它可以根据设置好的编码规则来检查代码 比如符合规范的变量命名，良好的程序风格等等如果你的项目经理开会时说，我希望我们写出来的代码就象一个人写的！ 时，用Checkstyle绝对是正确选择:)</P>
<P>提醒：想修改代码格式，请使用Jalopy. 它和Checkstyle配合使用非常合适</P>
<P>Checkstyle的配置性极强，你可以只检查一种规则，也可以检查三十，四十种规则可以使用Checkstyle自带的规则， 也可以自己增加检查规则（这点跟Ant自定义target比较象）</P>
<P>支持几乎所有主流IDE，包括 Eclipse , IntelliJ, NetBeans, JBuilder 等11种</P>
<P>让您在几分钟之内了解Checkstyle的大致用法适合赶时间的朋友假设您已经安装好了Checkstyle的Eclipse插件</P>
<P>首先，我们建立一个eclipse的项目：test_checkstyle包含一个源文件夹：src，一个目标生成文件夹</P>
<P>在项目中开启Checkstyle: 打开该project的属性，点中左侧的Checkclipse后，将"Enable Checkstyle"前面打上勾</P>
<P>建立一个测试用的Class: 比如SomeClassToBeChecked，内容如下：</P>
<P>* Copyright (c) 2001-2008 Beijing BidLink Info-Tech Co., Ltd.</P>
<P>* $Id: learn_in_5_min.xml,v 1.3 2008/03/03 03:43:44 Administrator Exp $</P>
<P>用Checkstyle检查它：右键点项目名，选择"Build Project"，会把src文件夹进行编译，把class文件放到eclpise_build中 结束之后，我们可以看到：代码第10行处，有一个叹号，把鼠标移上去就会出现 提示</P>
<P>定制检查：Checkstyle没有图形化的定制器，所以需要手工修改配置文件比如，我们的代码需要符合下列规则：</P>
<P>长度方面：文件长度不超过1500行，每行不超过120个字，方法不超过60行</P>
<P>命名方面：类名不能小写开头，方法名不能大写开头，常量不能有小写字母</P>
<P>那么，我们的检查配置文件（如命名成 my_check.xml ） 应该是这样的：</P>
<P>&nbsp;&nbsp;&nbsp; "-//Puppy Crawl//DTD Check Configuration 1.2//EN"</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="1500"/&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property value="120"/&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="METHOD_DEF"/&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="60"/&gt;</P>
<P>命名方面的检查，它们都使用了Checkstyle默认的规则</P>
<P>类名(class 或interface) 的检查</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="3"/&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/module&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>可以看出，想增加一个检查，就是增加一个&lt;module/&gt;结点具体的结点内容在后面的文档都会写明</P>
<P>让Checkstyle使用指定的检查配置文件：打开项目属性，在Checkclipse中的"Checkstyle Configuration File" 一栏中 选定我们的配置文件，然后确定</P>
<P>然后重新编译项目，就会发现，Checkstyle的规则如我们所愿：只检查我们在文件中配置的几项并且它们是以"Error"级别进行提示，而不是默认检查时出现的"Warning"级别 比如，我们把一个方法中，增加4层嵌套（共5个if），并将方法名大写</P>
<P>可以看到，出现了两个Error: 方法名的"Name xx must match pattern..." 和if嵌套的"Nested if-else depth is 4..." 把它们都改过来，程序就好了</P>
<P>代码的修正：依照上面的例子，把方法名小写，if循环嵌套3层，然后重新编译，OK</P>
<P align=left>&nbsp;&nbsp;&nbsp; "-//Puppy Crawl//DTD Check Configuration 1.2//EN"</P>
<P align=left>&lt;module &gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp; &lt;!-- 重复代码的检查，超过8行就认为重复，UTF-8格式</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本检查一定要放在"TreeWalker"节点前，否则在</P>
<P align=left>中会无法使用(在ant下可以)</P>
<P align=left>&nbsp;&nbsp;&nbsp; &lt;module &gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="8" /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="UTF-8" /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp; &lt;module &gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--不希望有任何 import a.b.*; 这样的语句 --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以下几种import是没用/没意义的：</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.import java.lang的</P>
<P align=left>与该类在同一个package的</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--PackageName检查包名设置成只能小写 --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module &gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="^[a-z]+(\.[a-z][a-z0-9]*)*$" /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- javadoc的检查 --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 检查所有的interface和class --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 检查所有方法的javadoc，可以不声明RuntimeException --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module &gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="true" /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 检查某个变量的javadoc --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 命名方面的检查，它们都使用了Sun官方定的规则 --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 类名(class 或interface) 的检查 --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module " /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&lt;!-- 长度方面的检查 --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 文件长度不超过1500行 --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module &gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="1500" /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 每行不超过120个字--&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module &gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="120" /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 方法不超过30行 --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module &gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="METHOD_DEF" /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="30" /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 方法的参数个数不超过3个 --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module &gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="METHOD_DEF" /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="3" /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 不能出现空白区域 --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 所有区域都要使用大括号 --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module &gt;</P>
<P align=left>&lt;property value="true" /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 编码方面的检查 --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 不许出现空语句 --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 每个类都实现了equals()和hashCode() --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 不许使用switch --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module &gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="LITERAL_SWITCH" /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 绝对不能容忍魔法数 --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 循环控制变量不能被修改 --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 多余的throw --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 不许使用未被简化的条件表达式 --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 不许使用未被简化的布尔返回值 --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- String的比较不能用!= 和 == --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- if最多嵌套3层 --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module &gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="3" /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- try最多被嵌套1层 --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- clone方法必须调用了super.clone() --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- finalize 必须调用了super.finalize() --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 不能catch java.lang.Exception --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module &gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="java.lang.Exception" /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- JUnitTestCase 的核心方法存在 --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 一个方法中最多有3个return --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module &gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="3" /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 不许对方法的参数赋值 --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 不许有同样内容的String --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&lt;!-- 同一行不能有多个声明 --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 布尔表达式的复杂度，不超过3 --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 类数据的抽象耦合，不超过7 --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 类的分散复杂度，不超过20 --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 函数的分支复杂度，不超过10 --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- NPath复杂度，不超过200 --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 禁止使用System.out.println --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module &gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="System\.out\.println" /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="true" /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 不许使用与代码同行的注释 --&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P align=left>&nbsp;&nbsp;&nbsp; &lt;module /&gt;</P>
<P>本节看起来比较烦冗，建议使用哪些东东，就看哪个小节就象字典那样用</P>
<P>我挑的是看起来比较常用的检查一些另外的，比如空格的约定，J2EE，EJB的检查，没有包括在这里有需要的朋友请看官方文档</P>
<TABLE>
<P>除非特别说明，否则检查代码的位置都要放在 TreeWalker 这个结点下面
</P><P></P></P>
<TBODY></TBODY></TABLE>
<P>Checkstyle中的各种检查的增加，都是以增加配置文件的内容来实现的比如想检查方法的长度，就需要在&lt;module &gt;节点下增加： </P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;property value="METHOD_DEF"/&gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;property value="60"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>如果没有特殊说明，一般是增加在&lt;module &gt;结点下 </P>
<P>如果一个module节点的属性可以有多个值备选，那么这些值之间一般用","连接比如"tokens = LITERAL_STRING, LITERAL_INT"</P>
<P>是否需要我按照表示的形式来说明这些属性？也就是按照官方文档的格式？</P>
<P>检查所有的类和接口：</P>
<P>&lt;module /&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="public"/&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="CLASS_DEF"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>其中的"scope"属性指定了检查可见的范围，也就是说，如果是"private"，那么就可以见"private, protected, public"三种， 如果赋值为"protected"那么就只检查"protected,public"两种，如果赋值为"public"，就只检查"public"的类或接口默认是"private"</P>
<P>"tokens"属性指定了是检查类还是接口还是都检查默认是都检查可选的值是"CLASS_DEF"（检查类）和"INTERFACE_DEF"（检查接口）</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&lt;module &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="public"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>其中的"scope"属性指定了检查可见的范围，也就是说，如果是"private"，那么就可以见"private, protected, public"三种， 如果赋值为"protected"那么就只检查"protected,public"两种，如果赋值为"public"，就只检查"public"的类或接口默认是"private"</P>
<TABLE>
<P>如果被检查的方法是某个interface方法的实现，那么该方法的javadoc是：
</P><P></P>
<P>/**</P>
<P>public void someMethod(){</P>
<P>}</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>也就是说，不用把接口的javadoc COPY过来，一样可以通过本检查（也一样能生成正确的javadoc）</P>
<P>比如，这样的参数说明会被检查认为是没有：</P>
<P>/**</P>
<P>public void someMethod(String somePara){ </P>
<P>...</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>因为它没有对该参数的说明，应该加上如：</P>
<P>/**</P>
<P>*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>public void someMethod(String somePara){ </P>
<P>...</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P></P>
<TBODY></TBODY></TABLE>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>这里可以对java中的各种命名进行检查，比如方法名，变量名，常量名等等</P>
<P>由于相互之间很类似，所以放在一个表中说明这些检查使用的&lt;module&gt; 的"name"属性见下表， 它们具有相同的"format"属性，需要赋予正则表达式，默认值已经被设置好了，是与相同的 如所示</P>
<TABLE>
<P>ConstantName 
</P><P></P>
<P>^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$</P>
<P>LocalFinalVariableName </P>
<P>^[a-z][a-zA-Z0-9]*$</P>
<P>LocalVariableName </P>
<P>^[a-z][a-zA-Z0-9]*$</P>
<P>PackageName </P>
<P>^[a-z]+(\.[a-zA-Z_][a-zA-Z0-9_]*)*$</P>
<P>StaticVariableName </P>
<P>^[a-z][a-zA-Z0-9]*$</P>
<P>TypeName </P>
<P>^[A-Z][a-zA-Z0-9]*$</P></P>
<TBODY></TBODY></TABLE>
<P>PackageName检查的format默认值是允许大写的包名的，建议设置成只能小写，如：</P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>TypeName的检查是可以通过修改"tokens"属性来指定检查Class还是Interface，默认是两者都检查如果只想检查Interface，可以这样：</P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value="INTERFACE_DEF"/&gt;</P>
<P>&lt;/module&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>其中，tokens属性的值是：CLASS_DEF 和 INTERFACE_DEF.</P>
<P>Header</P>
<P>检查文件头区域是否包含指定的内容可以在headerFile属性中指定一个外部文件的位置，该文件保存了文件头信息也可以使用另外一种 方法：将文件头信息直接写在 header属性中这样就可以不用外部文件</P>
<P>属性 ignoreLines指定了头文件中可以不被检查的行数这个属性对于包含版权日期信息的文件头很有用比如下面的文件头：</P>
<P>/*</P>
<P>* Copyright (c) 2001-2008 Some Company Co., Ltd.</P>
<P>* $Id: checks.xml,v 1.8 2008/03/03 03:37:19 Administrator Exp $</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>其中第2,6行包含的日期信息会发生变化所以在检查时，最好通过设置 ignoreLines 属性把这两行忽略掉如：</P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;property value="2, 6"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>想严格对文件头进行检查，请把文件头定义在一个外部文件中，如：java_header_file.txt 然后使用"headerFile"属性：</P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;property value="java_header_file.txt"/&gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;property value="2, 6"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>7.5.&nbsp;Imports
<P>AvoidStarImport</P>
<P>如果不希望有任何 import a.b.*; 这样的语句，请在配置文件中，增加：</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp; &lt;property value="a.b.c,c.d"/&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>没有被用到</P>
<P>重复的</P>
<P>进行检查：</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="1500"/&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/module&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property value="120"/&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/module&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>使用"max"属性可以设置最多的行数，默认150，"countEmpty"是否对空白或"//"注释行记数，默认是"true"，"tokens"可以指定 检查的是一般方法还是构造方法，默认都检查，可用的值是"METHOD_DEF, CTOR_DEF"</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &lt;property value="METHOD_DEF"/&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &lt;property value="30"/&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>"max"属性可以设置最多的参数个数，默认7，"tokens"属性指定检查的是一般方法还是构造方法，默认都检查可用的值是"METHOD_DEF, CTOR_DEF"</P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp; &lt;property value="METHOD_DEF"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>本检查约定方法名与左边圆括号之间不许出现空格例如，下列的代码格式是错误的，在方法名"wrongStyleMethod"后面紧跟的是个空格，而不是"()"：</P>
<P>...</P>
<P>public void wrongStyleMethod (){</P>
<P>...</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>方法名与圆括号不是一行默认也是不允许的，如：</P>
<P>...</P>
<P>public void wrongStyleMethod </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (String para1, String para2){</P>
<P>...</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&lt;module /&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>不允许左圆括号右边有空格，也不允许与右圆括号左边有空格例如下面的代码会报错，</P>
<P>...</P>
<P>public void wrongStyleMethod( String para1, String para2 ){</P>
<P>...</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>把对应的空格去掉才是正确的：</P>
<P>...</P>
<P>public void correctStyleMethod(String para1, String para2){</P>
<P>...</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>这样检查：</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>默认检查范围：构造函数的调用，方法的调用，左，右圆括号，父类构造函数的调用</P>
<P>在类型转换时，不允许左圆括号右边有空格，也不允许与右圆括号左边有空格例如下面的代码就会报错：</P>
<P>Object myObject = ( Object )other;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>正确的应该是：</P>
<P>Object myObject = (Object)other;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>使用本检查：</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>代码中不允许使用"tab"键('\t') 因为在不同的编辑器下有的tab占8个空格（如windows记事本），有的占4个（如当前大多数IDE）</P>
<P>使用本检查：</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<TABLE>
<P>使用本检查前一定要先用代码格式化工具把"tab"转换成空格否则满屏幕的"Error"会吓人一跳:)
</P><P></P></P>
<TBODY></TBODY></TABLE>
<P>检查某些特定符号后是否有空格如果没有，就报错</P>
<TABLE>
<P>tokens
</P><P></P>
<P>被检查的范围</P>
<P>COMMA, SEMI, TYPECAST</P></P>
<TBODY></TBODY></TABLE>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="COMMA"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>每个关键字都有正确的出现顺序比如 public static final XXX 是对一个常量的声明如果使用 static public final 就是错误的 这样：</P>
<P>&lt;module /&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>"tokens"属性定义了可以被检查的范围，包括："METHOD_DEF,VARIABLE_DEF,ANNOTATION_FIELD_DEF"默认都检查，</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>如果只想对一般方法做检查，这样：</P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;property value="METHOD_DEF"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>只要是{} 包含起来的，都是区域比如if , else, catch 后面紧跟的，都是区域可以对它们进行检查默认是检查所有区域：</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>比如，只有一条语句的 if ，对于大括号是可用可不用的也就是说， </P>
<P>and</P>
<P>}</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>它们是都可以通过编译的 但是良好的代码规范，都推荐使用后者的风格所以，想对此进行检查，请在配置文件中，加上：</P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;property value="LITERAL_IF, LITERAL_ELSE"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>其中"tokens"属性指定了被检查的区域，它的值可以是："LITERAL_DO, LITERAL_ELSE, LITERAL_IF, LITERAL_FOR, LITERAL_WHILE"， 默认值是全部这些值个人建议使用默认的配置：</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>比如，这样的代码是可以通过编译，但是风格很差的：</P>
<P>public void guessTheOutput()</P>
<P>{</P>
<P>&nbsp;&nbsp;&nbsp; System.out.println("value = " + whichIsWhich);</P>
<P>}</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>因为它增加了一对很不必要的括号对它进行检查可以这样：</P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="true"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>其中"allowInSwitchCase"属性指定了在switch区域中是否允许不必要的括号默认值是"false"</P>
<P>或者直接：</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>编码的习惯检查</P>
<P>如果一个数组定义的右括号 与最后一个元素不在同一行，就需要有一个逗号比如： </P>
<P>int[] a = new int[]</P>
<P>{</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>我对这种编程风格貌似没见过如果希望检查数组的最后一个元素后面是有逗号的，这样：</P>
<P>&lt;module /&gt;</P>
<P>据说每个元素后面都带个逗号，有利于重新安排元素的各个顺序仁者见仁，智者见智了：）</P>
<P>也就是三目运算符" ? :" 有的内联条件让代码难以理解，比如：</P>
<P>String b = (a==null || a.length&lt;1) ? null : a.substring(1);</P>
<P>想避免它出现，可以进行检查：</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<TABLE>
<P>使用了本检查，也就是彻底禁止了"?:"的使用就连最简单的也不行，比如： 
</P><P></P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P></P>
<TBODY></TBODY></TABLE>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>如果两个分号";"之前只有空格，那么后一个分号所定义的语句就是空的比如下面代码的第二行就是空语句： </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>想对它进行检查，请在配置文件中增加：</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>可以检查一个类是否覆写(override)了equals和hashCode方法，这样：</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>如果某个变量一直都没变，那么它就应该是final型的想检查它，请增加：</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>通过检查来确保程序员使用了工厂方法(factory method)，而不是构造函数 比如，规定不能通过new 来构造一个java.lang.Boolean，对应的检查应该是：</P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;property value="java.lang.Boolean"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>"classes"属性指定了不能使用构造函数的类的范围多个类之间用分号表示每个类名前都要有完整的package名字</P>
<P>很多大牛都建议在java中不要使用switch；另外，使用c++ 或 c-- 这样的后缀也会让可读性变差想进行这样的检查，使用：</P>
<P>&lt;module /&gt;</P>
<P>就可以检查程序中是否使用了"swtich, ++后缀， --后缀"这三个不合适的符号如果想指定只检查"switch"，可以指定"tokens"属性：</P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="LITERAL_SWITCH"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>想检查更多，请参考com.puppycrawl.tools.checkstyle.api.TokenTypes中定义的常量</P>
<P>如果有人这样写：String s = Integer.toString(i = 2); 是不是很想扁他？这样检查：</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>sex = 0</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>表示的什么意思？大多数时候，就连作者本人都要皱眉头想半天，汗所以，这里的"0" 就是一个魔法数如果这样写就好的多： </P>
<P>public static final int MALE= 0;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>这样我们就知道，原来是把 sex 变量的值设成 男性想检查它，请增加：</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>如果只想对int型和double型的数做检查，而且忽略数字"0"和"0.05"，可以这样：</P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;property value="NUM_DOUBLE, NUM_INT"/&gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;property value="0, 0.05"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>该检查有两个属性："tokens"属性可以指定检查的范围，可用的值是"NUMBER_DOUBLE, NUM_FLOAT, NUM_INT, NUM_LONG"中的子集默认是全部 "ignoreNumbers"属性指定了可以忽略的数字，默认是"-1, 0, 1, 2"</P>
<P>魔法数的检查很有必要，可以让你的程序的可读性大大增加强烈建议使用:)</P>
<P>switch最好别用因为用了必须要有default分支才能逻辑正确否则的话，编译不报错但是运行起来会报错（把所有的case依次执行一遍）想检查它，请增加：</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>比如，一个for循环的 循环数是只应该在 最后的 i++ 中更改的，如果出现以下代码：</P>
<P>这里是极可能是程序员大意写出来的</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>则说明，这个循环节有90%是大意，写错了因为其中的循环控制变量 i 在一个循环中 ++ 了两次这样检查：</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>为异常声明中的多余的Excpetion（比如duplicate, unchecked异常，或者它们的子类）做检查默认检查，增加：</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;property value="true"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>检查过度复杂的条件表达式，比如： (b == true), b || true, !false, 难读且容易出错</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>if (valid())</P>
<P>else</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>就可以写成：</P>
<P>return !valid();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>Checkstyle作者自我调侃说：这个想法是从PMD的类似规则中剽窃过来的哈哈这样检查：</P>
<P>&lt;module /&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>if (x == "something")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>而他实际的意思应该是：</P>
<P>if ("something".equals(x))</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>想检查，请增加：</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>通过指定来限制 if-else 的嵌套的层次所谓的嵌套的if，是指一个if被包含在另一个if中下面是嵌套数是"1"的代码:</P>
<P>if(true){</P>
<P>}</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&lt;module &gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>这个检查请大家宽容一点见过IBM的朋友写的代码里if嵌套的也比较多一般的项目就更是代码的改善是个持续的过程，耐心些</P>
<P>&lt;module &gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>检查并确认一个类的clone()方法调用了父类的clone() 这样：</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>检查并确认一个类的finalize()调用了父类的finalize() 这样：</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>捕获 java.lang.Exception , java.lang.Error, java.lang.RuntimeError 是不合理的</P>
<P>新手经常把本应捕获多种异常的格式，简化写成：catch Exception 这一种（汗，我有时也是 -_-!），这样会导致无法正常捕获NPE，OutOfMemoryErrors这样的异常 而且也不能针对不同的异常进行不同的处理默认检查： </P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>想检查 java.lang.Exception 和 your.package.Exception 是不合理的，可以这样：</P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="java.lang.Exception, your.package.Exception"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>其中"illegalClassNames"属性指定了不合理的异常名称，多个名称之间用","号</P>
<P>确保某些类型（老外叫type，我们叫class, interface ==）不被throw. 比如说，声明抛出 java.lang.Error, java.lang.RuntimeException 就是不可以的默认检查：</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>想检查 java.lang.Exception 和 your.package.Exception 是不合理的，可以这样：</P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="java.lang.Exception, your.package.Exception"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>其中"illegalClassNames"属性指定了不合理的异常名称，多个名称之间用","号</P>
<P>确保一个类有package声明如果一个 class 没有package声明，那么它就无法被引用，作者说很多新手都懒的写这个东东不过我还没见过呵呵</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>确保setUp(), tearDown() 方法被正确的命名，没有参数，void返回类型，而且是public 或者protected的 确保suite() 被正确的命名，没有参数，返回 junit,framework.Test, 而且是 public static 型注意：上面这几点经常被搞错的后果是写错的方法编译肯定通过，但是不会被junit执行</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>限制一个方法中return语句的数量默认是2忽略特定的方法（默认是equals()）如果return 语句太多，说明某个方法需要实现的功能太多，而且很难阅读（这个时候就需要重构，建议看看重构的Extract Method 和 Simplifying Conditional Expressions. 两章 ）想确保每个方法最多有3个return 语句，忽略equals()，这样做：</P>
<P>&lt;/module&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;property value="^$"/&gt;</P>
<P>&lt;/module&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>其中"format"属性是一个 regular expression（正则表达式）"max"属性指定了可允许的最大数</P>
<P>class 声明首先是 public, 然后是protected , 然后是 package level （不包括access modifier ）最后是private . (多个class放在一个java文件中的情况）</P>
<P>变量声明 首先是 public, 然后是protected然后是 package level （不包括access modifier ）最后是private . (多个class放在一个java文件中的情况）</P>
<P>构造函数</P>
<P>方法</P>
<P>这样：</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>禁止对参数赋值</P>
<P>public someMethod(String para1){} </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>这样的语句</P>
<P>官方文档：对方法的参数赋值一般说来，是不好的编程技巧而强制开发人员声明一个final 参数也不太合适的所以让Checkstyle做检查正合适</P>
<P>想进行检查，这样：</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>确保某个class 在被使用时都已经被初始化成默认值(对象是null , 数字和字符是0 , boolean 变量是false.)了 这样检查：</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>7.10.29.&nbsp;switch语句的default位置排在最后
<P>确保switch语句的default一定在最后出现虽然java语法允许default可以放在switch中的任何位置，但是把它放在各个case的最下面是可读性最强的</P>
<P>p.s. 如果不写default , 就会产生逻辑错误，却没有提示非常不建议使用switch，请使用ifelse 代替当然了，如果没使用default,貌似本检查也能检查的出来 这样使用： </P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>确保某个类定义了一个默认之外的构造函数这样：</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>检查每个switch只执行一个分支也就是说，检查某个case中是否有 break, return ,throw 或 continue语句 </P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>重构中建议，不使用switch（貌似在 简化条件表达式一章）</P>
<P>确保一个文件中的同样内容的字符串不出现多次重复的代码难以维护所以建议使用常量来代替多个相同字符串 默认只出现一次的检查：</P>
<P>&lt;module /&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>最多重复两次的检查：</P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;property value="2"/&gt;</P>
<P>&lt;/module&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;property value='^(("")|(", "))$'/&gt;</P>
<P>&lt;/module&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>上面例子中可以看出，"allowedDuplicates"属性指定了可以重复的最大数，默认1 "ignoreStringsRegexp"属性指定了被忽略的字符的正则表达式格式，默认是忽略空的字符串(^""$） </P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>只检查变量，不检查方法：</P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;property value="false"/&gt;</P>
<P>&lt;/module&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>"checkFields"属性指定了是否检查field（类的变量），默认是true, "checkMethods"属性指定了是否检查方法，默认是true. </P>
<P>检查不必要的圆括号(,)比如， if(((((true))))) 这样是不是很个性？这样： </P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>不过很多时候圆括号的正确使用会提高代码的清晰度比如：</P>
<P>return ( SomeClassName.CONSTANT1 == variable )? result1 : result2;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>是否使用请酌情选择</P>
<P>检查类成员的可见性只有static final 成员是public的，其他的类成员都是private的，除非在本检查的protectedAllowed和packagedAllowed属性中进行了设置默认检查： </P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>允许包可见成员的检查：</P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;property value="true"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>不允许公共成员的检查：</P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;property value="^$"/&gt;</P>
<P>&lt;/module&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>本检查就是实现了：</P>
<P>根据Bloch 的说法，一个interface用来描述一个type, 所以，在interface中不定义方法却只定义常量的做法是不合适的</P>
<P>本检查也可以配置成不允许marker interface，比如 java.io.Serializable这样的不包括方法和常量的类</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>原理：它的构造函数只应该是private 或 protected（如果它有子类的话）的 常见的错误是，忘记了隐藏默认的构造函数（它是public的）</P>
<P>如果想把一个构造函数定义成protected，你也许会考虑下面的构造函数的方法：例子．一个工具类</P>
<P>// not final to allow subclassing</P>
<P>public class StringUtils </P>
<P>{</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new UnsupportedOperationException(); </P>
<P>&nbsp;&nbsp;&nbsp; public static int count(char c, String s) {</P>
<P>}</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>这样检查：</P>
<P>&lt;module /&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>7.11.5.&nbsp;方便继承(extention)而进行的设计
<P>确保某个class是为了方便继承而设计的本检查可以强制实现这样的编程风格：在父类中使用空的方法，然后在子类中进行实现</P>
<P>规则是：在子类中overrided的非private ,非static方法，需要符合下列情况之一：</P>
<P>abstract</P>
<P>final</P>
<P>有空语句</P>
<P>原理（借用官方文档）：这个API设计风格保护了父类不被子类所破坏 缺点是子类的灵活性降低，子类无法阻止父类的代码被执行同时子类却也不会由于忘记调用父类的方法而破坏父类的状态 </P>
<P>这样检查：</P>
<P>&lt;module /&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>异常是methods interface的一部分一个方法如果声明抛出太多不同的异常，会导致异常处理(catch)混乱， 本检查强制规定一个方法的throws的次数</P>
<P>想配置每个方法最多抛出两个异常，使用：</P>
<P>&lt;module &gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>本检查应该放在&lt;module &gt;结点下</P>
<P>重复代码的检查可以让你找到经过COPY/PAST出来的代码重复代码的典型缺点是增加维护代价， 因为需要你把一个BUG修改很多次，测试更多次 Checkstyle在实现该方面的检查过程中，考虑了以下的目标： </P>
<P>快速</P>
<P>避免无效的，错误的警告</P>
<P>支持模糊匹配（注释，空格，换行，变量重命名等）</P>
<P>checkstyle提供的是StrictDuplicateCode, 它速度很快，消耗的内存很少，不会出现错误的警告 当检查支持多种语言时，不支持模糊匹配（这也是它被称为strict（严格）检查的原因） 也就是说，如果一段重复代码，既在JSP中出现，又在JAVA中出现，就无法支持模糊查询</P>
<TABLE>
<P>请注意，其实有很多相当出彩的商业性的重复代码检查工具最具有代表性的就是RedHill咨询公司的它很好的实现了以上需求的折中它在各个方面都优于checkstyle包中的其他类，价格很有诱惑力（对非商业用途免费），因而被checkstyle用作一个插件（plugin）
</P><P></P></P>
<TBODY></TBODY></TABLE>
<TABLE>
<P>Simian 
</P><P></P>
<P>非常快</P>
<P>低</P>
<P>非常小的几率会出现</P>
<P>有限度的支持</P></P>
<TBODY></TBODY></TABLE>7.12.1.&nbsp;StrictDuplicateCode 严格的重复代码检查
<P>当代码只是在缩进上有所不同时，就把它们逐行的进行比较，并报告是否重复忽略import , 其他的内容，包括javadoc, 方法间隔的空白行，等都会被包含进来，进行比较 </P>
<P>使用默认检查：</P>
<P>&lt;module /&gt;</P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;property value="15"/&gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;property value="UTF-8"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<TABLE>
<P>本检查会把空白行算在检查范围里如果代码中存在一段多于"min"属性所定义的空白行时，也会报错例如，"min"=8时， 如果代码中存在9个连续的空白行，就会报错
</P><P></P>
<P>本检查一定要放在"TreeWalker"节点前面，否则在Checkclipse中无法使用（Eclipse 3.2, Europa都是） 但是在Ant中却正常</P></P>
<TBODY></TBODY></TABLE>
<P>编码时的各种量度，很理论化我还没在国内的其他文档中看到此类内容，所以把内容基本照搬来了，大家共同学习吧:)</P>
<P>限制一个布尔表达式中的 &amp;&amp;, || 和^的个数可以让代码看起来更清晰，容易排错和维护默认检查： </P>
<P>&lt;module /&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&lt;module &gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>ClassDataAbstractionCoupling</P>
<P>检查一个类中建立的其他类的实例的个数这种类型的耦合不是由继承或面向对象的聚合而引起的 一般而言，任何一个抽象数据类型，如果将其他抽象数据类型作为自己的成员，那么它都会产生数据抽象耦合(DAC)； 换句话说，如果一个类使用了其他类的实例作为自己的成员变量，那么就会产生数据抽象耦合 耦合度越高，这个系统的数据结构就越复杂</P>
<P>原文：This metric measures the number of instantiations of other classes within the given class. This type of coupling is not caused by inheritance or the object oriented paradigm. Generally speaking, any abstract data type with other abstract data types as members has data abstraction coupling; therefore, if a class has a local variable that is an instantiation (object) of another class, there is data abstraction coupling. The higher the DAC, the more complex the data structure (classes) of the system.</P>
<P>申思维注：也就是说，一个类中如果使用太多其他的类，是肯定会增加系统复杂度的使用其他的类越少，耦合度就越少</P>
<P>&lt;module &gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>ClassFanOutComplexity</P>
<P>一个类依靠的其他类的个数这个数字的平方也会被显示出来，以表示最少需要的修改个数</P>
<P>原文：The number of other classes a given class relies on. Also the square of this has been shown to indicate the amount of maintenence required in functional programs (on a file basis) at least. </P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;property value="10"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>CyclomaticComplexity</P>
<P>确保函数的分支复杂度没有超出限制该复杂度是通过考察大部分函数（构造函数，一般方法，静态初始函数，实例初始化函数） 中的 if, while, do, for, ? : , catch, switch, case 语句 和 &amp;&amp;, || 的操作符的数目来计算得到的 它表示了通过一个函数的最少分支数，也因此体现了需要进行的测试数目 一般而言1-4 是优秀，5-7是合格8-10看情况重构11个以上一定要马上重构！</P>
<P>&lt;module &gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>NpathComplexity</P>
<P>NPATH 量度 计算了一个函数的可执行的分支个数它很重视条件语句的嵌套和多个部分组成的布尔表达式 （比如， A&amp;&amp;B, C||D, 等等）</P>
<P>Nejmeh说，他的小组有一个非正式的NPATH约定：不超过200NPATH超过这个数字的函数就一定要被分解</P>
<P>原文：The NPATH metric computes the number of possible execution paths through a function. It takes into account the nesting of conditional statements and multi-part boolean expressions (e.g., A &amp;&amp; B, C || D, etc.). </P>
<P>Rationale: Nejmeh says that his group had an informal NPATH limit of 200 on individual routines; functions that exceeded this value were candidates for further decomposition - or at least a closer look. </P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;property value="40"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>很难归类的杂项</P>
<P>为代码问题而做的检查 用户可以通过本检查来控制某些代码的使用比如，禁止在代码中使用"System.out.println"的检查：</P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;property value="System\.out\.println"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>其中"format"属性指定了非法的字符的正则表达式的格式（"."用"\."表示），完整的属性表如所示</P>
<P>检查文件末尾是否有一个回车</P>
<P>原理：源文件和文本文件一般应该以一个新行（回车）作为结尾特别是在使用源代码控制系统比如CVS的时候如果没有以新行作为文件结尾，CVS甚至会显示警告（  貌似我没遇到过，也许用的是WINCVS？）</P>
<P>本检查应该放在&lt;module &gt;结点下</P>
<P>默认检查：</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;property value="lf"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp; &lt;property value="java, xml, py"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<TABLE>
<P>lineSeparator
</P><P></P>
<P>行分隔符号</P>
<P>下列值之一："system", "crlf"(windows), "cr"(Mac) 和"If"(Unix) </P>
<P>system</P></P>
<TBODY></TBODY></TABLE>
<P>对于//TODO： 的检查事实上就是用一个正则表达式来匹配JAVA文件的注释内容，</P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;property value="WARNING"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>其中"format"属性指定了被检查的字符串的内容，默认是"TODO:"，格式是正则表达式</P>
<P>为了保证翻译的正确性而检查所有的属性文件(propertiy files)的键(key)是否一致 如果两个属性文件描述的是同一个东东的不同语言版本，那么它们应该包含相同的键</P>
<P>本检查应该放在&lt;module &gt;结点下</P>
<P>假如有同一个目录下的两个属性文件：</P>
<P>#messages.properties</P>
<P>hello=Hello</P>
<P>cancel=Cancel</P>
<P>#messages_de.properties</P>
<P>hell=Hallo</P>
<P>ok=OK</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>使用本检查就会找出错误：默认文件 messages.properties中，缺少了hell, ok两个键，而在德文文件 messages_de.properties中，缺少了hello, cancel键所以下面就是提示：</P>
<P>messages_de.properties: Key 'hello' missing.</P>
<P>messages_de.properties: Key 'cancel' missing.</P>
<P>messages.properties: Key 'hell' missing.</P>
<P>messages.properties: Key 'ok' missing.</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>本检查的算法，就是把若干语言包文件中的key合并到一个集合中，去掉重复项，然后再依次对比每个文件缺少的key做提示很适合对支持多语言的项目做检查</P>
<P>这样就可以：</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;property value="zh-CN, jp"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>其中"fileExtensions"指定了被检查文件的扩展名默认是"properties"</P>
<P>原理：Main()函数通常被用于调试，在JUnit出现之后Main()有所减少，但是也有人喜欢用我们调试完后很容易就忘掉删了它 它修改了API，增加了class或者jar文件的体积所以，除了正常的程序入口之外，所有的main方法都应该被删掉或注释掉</P>
<P>默认检查：</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>可以设置"excludedClasses"属性来不检查某个类，类型是正则表达试，默认值是"^$"如果不想检查名称中以"Main"结尾的类，可以这样：</P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property value="^Main&amp;"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>检查并确保所有的常量中的L都是大写的也就是在常量中没有使用l而是用的L，比如long型常量，都要以L结尾这与相一致小写的字母l 跟数字1 太象了 </P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>检查数组类型的定义有两种风格：java风格的： String[] args 或者 C/C++ 风格的：String args[] </P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;property value="false"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>检查并确保方法，构造函数，和catch区域中的参数是final的 Interface 和 抽象类不会被检查，因为它们中没有实现代码，所以它们中的也就没有被修改的可能</P>
<P>原理：在函数中的参数会很让人感到迷惑，也是个很差的习惯避免该情况的好办法是把参数声明成 final型</P>
<P>默认：在一般方法和构造函数中检查：</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>只在构造函数中检查：</P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;property value="CTOR_DEF"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>因为"tab"在不同的文本编辑器下的缩进是不同的，所以最好都使用空格</P>
<P>默认配置：基本缩进 4个空格，新行的大括号：0新行的case 4个空格</P>
<P>&lt;module /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>本检查为了确保每个注释都是单独的一行对于以 //开头的注释，它所在行的前面只能是空格但是，如果一段注释不是一行的结尾，比如 </P>
<P>Thread.sleep( 10 &lt;some comment here&gt; );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>那么该行就不会被检查</P>
<P>原理：Steve McConnel在Code Complete（代码大全）中认为与代码同行的注释是个不好的习惯与代码同行的注释也就是说，该行前面是代码，后面是注释比如：</P>
<P>a = b + c;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Some insightful comment</P>
<P>d = e / f;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Another comment for this line</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>引用代码大全作为佐证：</P>
<P>"The comments have to be aligned so that they do not interfere with the visual structure of the code. If you don't align them neatly, they'll make your listing look like it's been through a washing machine." </P>
<P>注释一定要排列整齐，这样你的程序结构就不会受到视觉上的扰乱如果不把它们排列整齐，那么杂乱的注释会让你的代码看起来象被洗衣机搅拌过一样</P>
<P>"Endline comments tend to be hard to format...It takes time to align them. Such time is not spent learning more about the code; it's dedicated solely to the tedious task of pressing the spacebar or tab key." </P>
<P>每行结尾的注释难于被格式化排列它们很需要时间可这些时间却不是被用在学习代码上，而是被浪费在枯燥的按空格和tab键上</P>
<P>"Endline comments are also hard to maintain. If the code on any line containing an endline comment grows, it bumps the comment farther out, and all the other endline comments will have to bumped out to match. Styles that are hard to maintain aren't maintained...." </P>
<P>每行结尾的注释也很难被维护如果任何包含结尾注释的行发生了增长，那么该行的结尾注释的开端就会相应的右移，那么其他行的结尾注释的开端同样需要右移，来与之对应难于被维护的风格基本不会被维护的</P>
<P>"Endline comments also tend to be cryptic. The right side of the line doesn't offer much room and the desire to keep the comment on one line means the comment must be short. Work then goes into making the line as short as possible instead of as clear as possible. The comment usually ends up as cryptic as possible...." </P>
<P>每行结尾的注释也很难全部显示出来每行的右边没多少闲余的空间，而且如果一定要把注释与代码放在同一行，造成了注释肯定长不了于是程序员的工作就变成了尽力将每行变的越短越好，而不是越干净越好这个结尾的注释也通常越来越难被看到而失去意义</P>
<P>"A systemic problem with endline comments is that it's hard to write a meaningful comment for one line of code. Most endline comments just repeat the line of code, which hurts more than it helps." </P>
<P>每行结尾的注释的影响到系统的问题是，它很难为一行代码写出有意义的内容大部分情况下，它只是把代码的字面意思重复一下，而这个代码也是弊大于利</P>
<P>他的关于 当行改变时代码难于维护的阐述，随着可以自动化重构的时代的到来变的更重要了</P>
<P>His comments on being hard to maintain when the size of the line changes are even more important in the age of automated refactorings.</P>
<P>默认这样检查：</P>
<P>&lt;module /&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;property value="^\\s*$"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>"format"属性指定了 与代码同行的注释 前面部分的代码，是一个正则表达式，默认是"^[\\s\\}\\);]*$"</P>
<P>确保代码中存在某个字符串的检查该检查不关心它出现的位置在哪儿，只要它出现了就可以比如，检查代码中必须出现了版权的字样, This code is copyrighted： </P>
<P>&lt;module &gt;</P>
<P>&nbsp;&nbsp; &lt;property value="This code is copyrighted"/&gt;</P>
<P>&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>"format"属性指定了 必须出现的字符串的 正则表达式默认是空"^$"</P>旧一篇:&nbsp;在OC4J中轻松快速配置SSL </DIV></DIV>
<DIV>
<DIV>评论：没有评论</DIV></DIV>
<DIV>
<DIV>
<DIV>发表评论请输入评论<BR><BR><BR></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV><BR><BR><BR>引文来源&nbsp;&nbsp;<A href="http://blog.csdn.net/yuliming5219/archive/2008/04/16/2297189.aspx" target=_blank>Checkstyle4.4 结合Eclipse配置使用 - yuliming5219的专栏 - CSDNBlog</A><p>----------------------------<br/>一键转贴，快速捕捉生活精彩，赢每周好礼！<a href="http://blog.163.com/activities/hunter/hunter.do?080526jclr46" target="_blank">查看活动首页&gt;&gt;</a></p></div>]]></description>
	    <author><![CDATA[&lt;a title=&quot;1&quot;&gt;小海]]></author>
	    <comments>http://blog.163.com/yhb_4323/blog/static/23363479200852792237806</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/yhb_4323/blog/static/23363479200852792237806</guid>
    <pubDate>Fri, 27 Jun 2008 09:22:37 +0800</pubDate>
    <dcterms:modified>2008-06-27T09:22:37+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[CSS网页设计非常有用的八个技巧 - 闪吧教材]]></title>	
    <link>http://blog.163.com/yhb_4323/blog/static/2336347920085242955681</link>
    <description><![CDATA[<div><DIV>
<DIV>
<DIV>
<DIV>
<H1>CSS网页设计非常有用的八个技巧 </H1></DIV></DIV>
<DIV>
<DIV>
<P>这篇文章包括了8个非常有用的解决办法，在进行css设计遇到问题时你就会用到它们</P>
<P><STRONG>一针对浏览器的选择器</STRONG>&nbsp; </P>
<P>这些选择器在你需要针对某款浏览器进行css设计时将非常有用</P>
<P>IE6及其更低版本 </P>
<P>* html {}</P>
<P>IE7及其更低版本 </P>
<P>*:first-child+html {} * html {} </P>
<P>仅针对IE7&nbsp; </P>
<P>*:first-child+html {} </P>
<P>IE7和当代浏览器&nbsp; </P>
<P>html&gt;body{} </P>
<P>仅当代浏览器(IE7不适用) </P>
<P>html&gt;/**/body{} </P>
<P>Opera9及其更低版本 </P>
<P>html:first-child {} </P>
<P>Safari&nbsp; </P>
<P>html[xmlns*=""] body:last-child {}&nbsp; </P>
<P>要使用这些选择器，请将它们放在样式之前 例如： </P>
<P>#content-box {</P>
<P>width: 300px;</P>
<P>height: 150px;</P>
<P>}</P>
<P>* html</P>
<P>#content-box {</P>
<P>width: 250px;</P>
<P>} /* overrides the above style and changes the width to 250px in IE 6 and below */</P>
<P><STRONG>二让IE6支持PNG透明</STRONG>&nbsp; </P>
<P>一个IE6的Bug引起了大麻烦， 他不支持透明的PNG图片你需要使用一个css滤镜 </P>
<P>*html #image-style {</P>
<P>background-image: none;</P>
<P>filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src="fil</P>
<P>ename.png", sizingMethod="scale");</P>
<P>}</P>
<P><STRONG>三 移除超链接的虚线(仅对FF有效)</STRONG>&nbsp; </P>
<P>FireFox下，当你点击一个超链接时会在外围出现一个虚线轮廓这很容易解决， 只需要在标签样式中加入 outline:none</P>
<P>a{</P>
<P>outline: none;</P>
<P>}<BR><BR></P>
<P><STRONG>四 给行内元素定义宽度</STRONG></P>
<P>如果你给一个行内元素定义宽度，那么它只是在IE6下有效所有的HTML元素要么是行内元素要么就好是块元素行内元素包括：&lt;span&gt;&lt;a&gt;&lt;strong&gt; 和 &lt;em&gt;块元素包括： </P>
<P>span { width: 150px; display: block }</P>
<P><STRONG>五 让固定宽度的页面居中</STRONG> </P>
<P>为了让页面在浏览器居中显示， 需要相对定位外层div，然后把margin设置为auto</P>
<P>#wrapper {</P>
<P>margin: auto;</P>
<P>;</P>
<P>}</P>
<P><STRONG>六 图片替换技术</STRONG> </P>
<P>用文字总比用图片做标题好一些，文字对屏幕阅读机和SEO都是非常友好的</P>
<P>HTML： </P>
<P>&lt;h1&gt;&lt;span&gt;Main heading one&lt;/span&gt;&lt;/h1&gt;</P>
<P>CSS：</P>
<P>h1 { background: url(heading-image.gif) no-repeat; }</P>
<P>h1 span {</P>
<P>;</P>
<P>text-indent: -5000px;</P>
<P>}</P>
<P>你可以看到我们对标题使用了标准的&lt;h1&gt;作为标签并且用css来将文本替换为图片，text-indent属性将文字推到了浏览器左边5000px处，这样对于浏览者来说就看不见了</P>
<P>关掉css，然后看看头部会是什么样子的</P>
<P>IE6另外一个bug就是它不支持 min-width 属性，min-width又是相当有用的，特别是对于弹性模板来说，它们有一个100%的宽度，min-width 可以告诉浏览器何时就不要再压缩宽度了</P>
<P>除IE6以外所有的浏览器你只需要一个 min-width：Xpx；例如：</P>
<P>.container {</P>
<P>min-width:300px;</P>
<P>}</P>
<P>为了让他在IE6下工作，我们需要一些额外的工作， 开始的时候我们需要创建两个div， 一个包含另一个：</P>
<P>&lt;div &gt;</P>
<P>&lt;div &gt;Content&lt;/div&gt;</P>
<P>&lt;/div&gt;</P>
<P>然后你需要定义外层div的min-width属性&nbsp; </P>
<P>.container {</P>
<P>min-width:300px;</P>
<P>}</P>
<P>这时该是IE hack大显身手的时候了你需要包含如下的代码：</P>
<P>* html .container {</P>
<P>border-right: 300px solid #FFF;</P>
<P>}</P>
<P>* html .holder {</P>
<P>display: inline-block;</P>
<P>;</P>
<P>margin-right: -300px;</P>
<P>}</P>
<P>As the browser window is resized the outer div width reduces to suit until it shrinks to the border width, at which point it will not shrink any further. The holder div follows suit and also stops shrinking. The outer div border width becomes the minimum width of the inner div. </P>
<P>为了避免出现水平滚动条，在body里加入 overflow-x:hidden </P>
<P>body { overflow-x: hidden; }</P>
<P>当你决定使用一个比浏览器窗口大的图片或者flash时，这个技巧将非常有用 </P></DIV>
<DIV>
<DIV>&nbsp;&nbsp;&nbsp;责任编辑:silvia &nbsp;&nbsp;&nbsp;时间:2008年3月18日 </DIV></DIV></DIV></DIV></DIV><BR><BR><BR>引文来源&nbsp;&nbsp;<A href="http://www2.flash8.net/teach/6792.htm" target=_blank>CSS网页设计非常有用的八个技巧 - 闪吧教材</A><p>----------------------------<br/>一键转贴，快速捕捉生活精彩，赢每周好礼！<a href="http://blog.163.com/activities/hunter/hunter.do?080526jclr46" target="_blank">查看活动首页&gt;&gt;</a></p></div>]]></description>
	    <author><![CDATA[&lt;a title=&quot;1&quot;&gt;小海]]></author>
	    <comments>http://blog.163.com/yhb_4323/blog/static/2336347920085242955681</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/yhb_4323/blog/static/2336347920085242955681</guid>
    <pubDate>Tue, 24 Jun 2008 14:09:55 +0800</pubDate>
    <dcterms:modified>2008-06-24T14:09:55+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[CSS设计网页时的一些常用规范 - 闪吧教材]]></title>	
    <link>http://blog.163.com/yhb_4323/blog/static/2336347920085242754887</link>
    <description><![CDATA[<div><DIV>
<DIV>
<DIV>
<DIV>
<H1>CSS设计网页时的一些常用规范 </H1></DIV></DIV>
<DIV>
<DIV>
<P><STRONG>CSS命名规范</STRONG></P>
<P><STRONG>一．文件命名规范</STRONG></P>
<P>全局样式：global.css；<BR>框架布局：layout.css；<BR>字体样式：font.css；<BR>链接样式：link.css；<BR>打印样式：print.css；</P>
<P><STRONG>二．常用类/ID命名规范</STRONG></P>
<P>页眉：header<BR>内容：content<BR>容器：container<BR>页脚：footer<BR>版权：copyright<BR>导航：menu<BR>主导航：mainMenu<BR>子导航：subMenu<BR>标志：logo<BR>标语：banner<BR>标题：title<BR>侧边栏：sidebar<BR>图标：Icon<BR>注释：note<BR>搜索：search<BR>按钮：btn<BR>登录：login<BR>链接：link<BR>信息框：manage<BR></P>
<P>常用类的命名应尽量以常见英文单词为准，做到通俗易懂，并在适当的地方加以注释对于二级类/ID命名，则采用组合书写的模式，后一个单词的首字母应大写：诸如搜索框则应命名为searchInput搜索图标命名这searchIcon搜索按钮命名为searchBtn<BR><BR></P>
<P><STRONG>CSS书写规范及方法</STRONG></P>
<P><STRONG>一.&nbsp;常规书写规范及方法</STRONG></P>
<P>1.&nbsp;选择DOCTYPE：</P>
<P>XHTML 1.0 提供了三种DTD声明可供选择：</P>
<P>过渡的(Transitional):要求非常宽松的DTD，它允许你继续使用HTML4.01的标识(但是要符合xhtml的写法)完整代码如下：</P>
<P>&lt;!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&gt;</P>
<P>严格的(Strict):要求严格的DTD，你不能使用任何表现层的标识和属性，例如&lt;br&gt;完整代码如下：</P>
<P>&lt;!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Strict//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&gt;</P>
<P>框架的(Frameset):专门针对框架页面设计使用的DTD，如果你的页面中包含有框架，需要采用这种DTD完整代码如下：</P>
<P>&lt;!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Frameset//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd&gt;</P>
<P>理想情况当然是严格的DTD，但对于我们大多数刚接触web标准的设计师来说，过渡的DTD(XHTML 1.0 Transitional)是目前理想选择(包括本站，使用的也是过渡型DTD)因为这种DTD还允许我们使用表现层的标识元素和属性，也比较容易通过W3C的代码校验</P>
<P>2.&nbsp;指定语言及字符集：</P>
<P>为文档指定语言：</P>
<P>&lt;html xmlns=http://www.w3.org/1999/xhtml lang=en&gt;</P>
<P>为了被浏览器正确解释和通过W3C代码校验，所有的XHTML文档都必须声明它们所使用的编码语言；如：<BR>常用的语言定义：</P>
<P>&lt;meta http-equiv=Content-Type content=text/html; charset=utf-8 /&gt;<BR>标准的XML文档语言定义：<BR>&lt;?xml version=1.0 encoding= utf-8?&gt;<BR>针对老版本的浏览器的语言定义：<BR>&lt;meta http-equiv=Content-Language content= utf-8 /&gt;<BR>为提高字符集，建议采用utf-8</P>
<P>3.&nbsp;调用样式表：</P>
<P>外部样式表调用：</P>
<P>页面内嵌法：就是将样式表直接写在页面代码的head区 如：</P>
<P>&lt;style type=text/css&gt;&lt;! body { background : white ; color : black ; } &gt; &lt;/style&gt;<BR>外部调用法：将样式表写在一个独立的.css文件中，然后在页面head区用类似以下代码调用</P>
<P>&lt;link rel=stylesheet rev=stylesheet href=css/style.css type=text/css media=all /&gt;</P>
<P>在符合web标准的设计中，推荐使用外部调用法，可以不修改页面只修改.css文件而改变页面的样式如果所有页面都调用同一个样式表文件，那么改一个样式表文件，可以改变所有文件的样式</P>
<P>4选用恰当的元素：</P>
<P>根据文档的结构来选择HTML元素，而不是根据HTML元素的样式来选择例如，使用P元素来包含文字段落，而不是为了换行如果在创建文档时找不到适当的元素，则可以考虑使用通用的div 或者是span；</P>
<P>避免过渡使用div和span少量适当的使用div和span元素可以使文档的结构更加清晰合理并且易于使用样式；</P>
<P>尽可能少地使用标签和结构嵌套，这样不但可以使文档结构清晰，同时也可以保持文件的小巧，在提高用户下载速度的同时，也易于浏览器对文档的解释及呈视；</P>
<P>5派生选择器：</P>
<P>可以使用派生选择器给一个元素里的子元素定义样式，在简化命名的同时也使结构更加的清晰化，如：</P>
<P>.mainMenu ul li {background:url(images/bg.gif;)}</P>
<P>6辅助图片用背影图处理：</P>
<P>这里的辅助图片是指那些不是作为页面要表达的内容的一部分，而仅仅用于修饰间隔提醒的图片将其做背影图处理，可以在不改动页面的情况下通过CSS样式来进行改动，如：</P>
<P>#logo {background:url(images/logo.jpg) #FEFEFE no-repeat right bottom;}</P>
<P>7结构与样式分离：</P>
<P>在页面里只写入文档的结构，而将样式写于css文件中，通过外部调用CSS样式表来实现结构与样式的分离</P>
<P>8文档的结构化书写：</P>
<P>页面CSS文档都应采用结构化的书写方式，逻辑清晰易于阅读如：</P>
<P>&lt;div &gt;&lt;ul&gt;<BR>&lt;li&gt;&lt;a href=# &gt;首页&lt;/a&gt;&lt;/li&gt;<BR>&lt;li&gt;&lt;a href=# &gt;介绍&lt;/a&gt;&lt;/li&gt;<BR>&lt;li&gt;&lt;a href=# &gt;服务&lt;/a&gt;&lt;/li&gt;<BR>&lt;/ul&gt;<BR>&lt;/div&gt;</P>
<P>/*=====主导航=====*/<BR>#mainMenu {<BR>width:100%;<BR>height:30px;<BR>background:url(images/mainMenu_bg.jpg) repeat-x;<BR>}<BR>#mainMenu ul li {<BR>float:left;<BR>line-height:30px;<BR>margin-right:1px;<BR>cursor:pointer;<BR>}<BR>/*=====主导航结束=====*/</P>
<P>9鼠标手势：</P>
<P>在XHTML标准中，hand只被IE识别，当需要将鼠标手势转换为手形时，则将hand换为pointer，即cursor:pointer;<BR><BR></P>
<P><STRONG>三．样式属性代码缩写</STRONG></P>
<P>1不同类有相同属性及属性值的缩写：</P>
<P>对于两个不同的类，但是其中有部分相同甚至是全部相同的属性及属性值时，应对其加以合并缩写，特别是当有多个不同的类而有相同的属性及属性值时，合并缩写可以减少代码量并易于控制如：</P>
<P>#mainMenu {<BR>background:url(../images/bg.gif);<BR>border:1px solid #333;<BR>width:100%;<BR>height:30px;<BR>overflow:hidden;<BR>}<BR>#subMenu {<BR>background:url(../images/bg.gif);<BR>border:1px solid #333;<BR>width:100%;<BR>height:20px;<BR>overflow:hidden;<BR>}</P>
<P>两个不同类的属性值有重复之处，刚可以缩写为：</P>
<P>#mainMenu,#subMenu {<BR>background:url(../images/bg.gif);<BR>border:1px solid #333;<BR>width:100%;<BR>overflow:hidden;<BR>}<BR>#mainMenu {height:30px;}<BR>#subMenu {height:20px;}</P>
<P>2同一属性的缩写：</P>
<P>同一属性根据它的属性值也可以进行简写，如：</P>
<P>.search {<BR>background-color:#333;<BR>background-image:url(../images/icon.gif);<BR>background-repeat: no-repeat;<BR>background- 50%;<BR>}<BR>.search {<BR>background:#333 url(../images/icon.gif) no-repeat 50% 50%;<BR>}</P>
<P>3内外侧边框的缩写：</P>
<P>在CSS中关于内外侧边框的距离是按照上右下左的顺序来排列的，当这四个属性值不同时也可直接缩写，如：</P>
<P>.btn {<BR>margin-top:10px;<BR>margin-right:8px;<BR>margin-bottom:12px;<BR>margin-left:5px;<BR>padding-top:10px;<BR>padding-right:8px;<BR>padding-bottom:12px;<BR>padding-left:8px;<BR>}</P>
<P>则可缩写为：</P>
<P>.btn {<BR>Margin:10px 8px 12px 5px;<BR>Padding:10px 8px 12px 5px;<BR>}</P>
<P>而如果当上边与下边左边与右边的边框属性值相同时，则属性值可以直接缩写为两个，如：</P>
<P>.btn {<BR>margin-top:10px;<BR>margin-right:5px;<BR>margin-bottom:10px;<BR>margin-left:5px;<BR>}</P>
<P>缩写为：</P>
<P>.btn {margin:10px 5px;}</P>
<P>而当上下左右四个边框的属性值都相同时，则可以直接缩写成一个，如：</P>
<P>.btn {<BR>margin-top:10px;<BR>margin-right:10px;<BR>margin-bottom:10px;<BR>margin-left:10px;<BR>}</P>
<P>缩写为：</P>
<P>.btn{margin:10px;}</P>
<P>4颜色值的缩写：</P>
<P>当RGB三个颜色值数值相同时，可缩写颜色值代码如：</P>
<P>.menu { color:#ff3333;}</P>
<P>可缩写为:<BR><BR>.menu {color:#f33;}<BR><BR></P>
<P>因为不同浏览器对W3C标准的支持不一样，各个浏览器对于页面的解释呈视也不尽相同，比如IE在很多情况下就与FF存在3px的差距，对于这些差异性，就需要利用css 的hack来进行调整，当然在没有必要的情况下，最好不要写hack来进行调整，避免因为hack而导致页面出现问题</P>
<P>1&nbsp;IE6IE7Firefox之间的兼容写法：</P>
<P>写法一：</P>
<P>IE都能识别*;标准浏览器(如FF)不能识别*；<BR>IE6能识别*，但不能识别 !important,<BR>IE7能识别*，也能识别!important;<BR>FF不能识别*，但能识别!important;<BR>根据上述表达，同一类/ID下的CSS hack可写为：<BR>.searchInput {<BR>background-color:#333;/*三者皆可*/<BR>*background-color:#666!important; /*仅IE7*/<BR>*background-color:#999; /*仅IE6及IE6以下*/<BR>}<BR>一般三者的书写顺序为：FFIE7IE6.</P>
<P>写法二：</P>
<P>IE6可识别_，而IE7及FF皆不能识别，所以当只针对IE6与IE7及FF之间的区别时，可这样书写：<BR>.searchInput {<BR>background-color:#333;/*通用*/<BR>_background-color:#666;/*仅IE6可识别*/<BR>}</P>
<P>写法三：</P>
<P>*+html 与 *html 是IE特有的标签, Firefox 暂不支持<BR>.searchInput {background-color:#333;}<BR>*html .searchInput {background-color:#666;}/*仅IE6*/<BR>*+html .searchInput {background-color:#555;}/*仅IE7*/</P>
<P>屏蔽IE浏览器：</P>
<P>select是选择符，根据情况更换第二句是MAC上safari浏览器独有的</P>
<P>*:lang(zh) select {font:12px&nbsp; !important;} /*FF的专用*/<BR>select:empty {font:12px&nbsp; !important;} /*safari可见*/</P>
<P>IE6可识别：</P>
<P>这里主要是通过CSS注释分开一个属性与值，注释在冒号前</P>
<P>select { display /*IE6不识别*/:none;}</P>
<P>IE的if条件hack写法：</P>
<P>所有的IE可识别：</P>
<P>&lt;![if IE]&gt; Only IE &lt;![end if]&gt;<BR>只有IE5.0可以识别:<BR>&lt;![if IE 5.0]&gt; Only IE 5.0 &lt;![end if]&gt;<BR>IE5.0包换IE5.5都可以识别:<BR>&lt;![if gt IE 5.0]&gt; Only IE 5.0+ &lt;![end if]&gt;<BR>仅IE6可识别:<BR>&lt;![if lt IE 6]&gt; Only IE 6- &lt;![end if]&gt;<BR>IE6以及IE6以下的IE5.x都可识别:<BR>&lt;![if gte IE 6]&gt; Only IE 6/+ &lt;![end if]&gt;<BR>仅IE7可识别:<BR>&lt;![if lte IE 7]&gt; Only IE 7/- &lt;![end if]&gt;</P>
<P>2清除浮动：</P>
<P>在Firefox中，当子级都为浮动时，那么父级的高度就无法完全的包住整个子级，那么这时用这个清除浮动的HACK来对父级做一次定义，那么就可以解决这个问题</P>
<P>select:after {<BR>content:.;<BR>display:block;<BR>height:0;<BR>clear:both;<BR>visibility:hidden;<BR>}</P>
<P>分割线</P>
<P><STRONG>申明：本文部分资料搜集于网络！</STRONG></P></DIV>
<DIV>
<DIV>&nbsp;&nbsp;&nbsp;责任编辑:silvia &nbsp;&nbsp;&nbsp;时间:2008年6月4日 </DIV></DIV></DIV></DIV></DIV><BR><BR><BR>引文来源&nbsp;&nbsp;<A href="http://www2.flash8.net/teach/6957.htm" target=_blank>CSS设计网页时的一些常用规范 - 闪吧教材</A><p>----------------------------<br/>一键转贴，快速捕捉生活精彩，赢每周好礼！<a href="http://blog.163.com/activities/hunter/hunter.do?080526jclr46" target="_blank">查看活动首页&gt;&gt;</a></p></div>]]></description>
	    <author><![CDATA[&lt;a title=&quot;1&quot;&gt;小海]]></author>
	    <comments>http://blog.163.com/yhb_4323/blog/static/2336347920085242754887</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/yhb_4323/blog/static/2336347920085242754887</guid>
    <pubDate>Tue, 24 Jun 2008 14:07:54 +0800</pubDate>
    <dcterms:modified>2008-06-24T14:07:54+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[[收藏]国外Java经典网址 ]]></title>	
    <link>http://blog.163.com/yhb_4323/blog/static/23363479200852491057979</link>
    <description><![CDATA[<div><P style="TEXT-INDENT: 2em"><A href="http://www.javaalmanac.com/">http://www.javaalmanac.com</A> - Java开发者年鉴一书的在线版本. 要想快速查到某种Java技巧的用法及示例代码, 这是一个不错的去处. </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.onjava.com/">http://www.onjava.com</A> - O'Reilly的Java网站. 每周都有新文章. </P>
<P style="TEXT-INDENT: 2em"><A href="http://java.sun.com/">http://java.sun.com</A> - 官方的Java开发者网站 - 每周都有新文章发表. </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.developer.com/java">http://www.developer.com/java</A> - 由Gamelan.com 维护的Java技术文章网站. </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.java.net/">http://www.java.net</A> - Sun公司维护的一个Java社区网站. </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.builder.com/">http://www.builder.com</A> - Cnet的Builder.com网站 - 所有的技术文章, 以Java为主. </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.ibm.com/developerworks/java">http://www.ibm.com/developerworks/java</A> - IBM的Developerworks技术网站; 这是其中的Java技术主页. </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.javaworld.com/">http://www.javaworld.com</A> - 最早的一个Java站点. 每周更新Java技术文章. </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.devx.com/java">http://www.devx.com/java</A> - DevX维护的一个Java技术文章网站. </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.fawcette.com/javapro">http://www.fawcette.com/javapro</A> - JavaPro在线杂志网站. </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.sys-con.com/java">http://www.sys-con.com/java</A> - Java Developers Journal的在线杂志网站. </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.javadesktop.org/">http://www.javadesktop.org</A> - 位于Java.net的一个Java桌面技术社区网站. </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.theserverside.com/">http://www.theserverside.com</A> - 这是一个讨论所有Java服务器端技术的网站. </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.jars.com/">http://www.jars.com</A> - 提供Java评论服务. 包括各种framework和应用程序. </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.jguru.com/">http://www.jguru.com</A> - 一个非常棒的采用Q&amp;A形式的Java技术资源社区. </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.javaranch.com/">http://www.javaranch.com</A> - 一个论坛，得到Java问题答案的地方，初学者的好去处。 </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.ibiblio.org/javafaq/javafaq.html">http://www.ibiblio.org/javafaq/javafaq.html</A> - comp.lang.java的FAQ站点 - 收集了来自comp.lang.java新闻组的问题和答案的分类目录. </P>
<P style="TEXT-INDENT: 2em"><A href="http://java.sun.com/docs/books/tutorial/">http://java.sun.com/docs/books/tutorial/</A> - 来自SUN公司的官方Java指南 - 对于了解几乎所有的java技术特性非常有帮助. </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.javablogs.com/">http://www.javablogs.com</A> - 互联网上最活跃的一个Java Blog网站. </P>
<P style="TEXT-INDENT: 2em"><A href="http://java.about.com/">http://java.about.com/</A> - 来自About.com的Java新闻和技术文章网站.
</P><P style="TEXT-INDENT: 2em">国内外JAVA站点推荐 </P>
<P style="TEXT-INDENT: 2em">1、SUN教育网站 </P>
<P style="TEXT-INDENT: 2em">suned.sun.com/US/certification/java/index.html </P>
<P style="TEXT-INDENT: 2em">2、国内网站 </P>
<P style="TEXT-INDENT: 2em">///////强力推荐///////////// </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.java-cn.com/">www.java-cn.com</A> </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.chinajavaworld.com/">www.chinajavaworld.com</A> </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.cnjsp.com/">www.cnjsp.com</A> </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.javaunion.net/">www.javaunion.net</A> </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.itpub.net/">www.itpub.net</A> </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.javaren.com/">www.javaren.com</A> </P>
<P style="TEXT-INDENT: 2em">/////////////////////////////// </P>
<P style="TEXT-INDENT: 2em"><A href="http://javaresearch.org/">http://javaresearch.org/</A> </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.java-cn.net/">http://www.java-cn.net/</A> </P>
<P style="TEXT-INDENT: 2em"><A href="http://dboy520.51.net/cgi-bin/javajia/">http://dboy520.51.net/cgi-bin/javajia/</A> </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.huihoo.com/">http://www.huihoo.com/</A> </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.sawin.com.cn/dragon/">http://www.sawin.com.cn/dragon/</A> </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.jdon.com/">http://www.jdon.com/</A> </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.javacool.com/rli/index.jsp">http://www.javacool.com/rli/index.jsp</A> </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.javaxforum.com/index.php">http://www.javaxforum.com/index.php</A> </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.cnjavaclub.com/">http://www.cnjavaclub.com/</A> </P>
<P style="TEXT-INDENT: 2em">3、国外网站 </P>
<P style="TEXT-INDENT: 2em">////////////scjd////////////////////// </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.janeg.ca/scjd.html">http://www.janeg.ca/scjd.html</A> </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.developergroup.org/">http://www.developergroup.org/</A> </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.javaranch.com/">www.javaranch.com</A> </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.jdiscuss.com/">http://www.jdiscuss.com/</A> </P>
<P style="TEXT-INDENT: 2em">/////////////scjp///////////////////// </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.javaranch.com/">www.javaranch.com</A> </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.jchq.net/">www.jchq.net</A> </P>
<P style="TEXT-INDENT: 2em">209.242.122.83/JavaCertifiction.html </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.lanw.com/">www.lanw.com</A> </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.geocities.com/">www.geocities.com</A> </P>
<P style="TEXT-INDENT: 2em">eddiemcnally.hypermart.net/jxam.html </P>
<P style="TEXT-INDENT: 2em">bmil.freeservers.com/tester/test.html </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.ii.uib.no/~khalid/pgjc/jcbook/engine.html">www.ii.uib.no/~khalid/pgjc/jcbook/engine.html</A> </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.jaworski.com/java/certification/">www.jaworski.com/java/certification/</A> </P>
<P style="TEXT-INDENT: 2em">jquest.webjump.com </P>
<P style="TEXT-INDENT: 2em"><A href="http://www.javaprepare.com/">www.javaprepare.com</A></P></div>]]></description>
	    <author><![CDATA[&lt;a title=&quot;1&quot;&gt;小海]]></author>
	    <comments>http://blog.163.com/yhb_4323/blog/static/23363479200852491057979</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/yhb_4323/blog/static/23363479200852491057979</guid>
    <pubDate>Tue, 24 Jun 2008 09:10:57 +0800</pubDate>
    <dcterms:modified>2008-06-24T09:10:57+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[1人30天44587行代码，分享舍得网开发经验【转】]]></title>	
    <link>http://blog.163.com/yhb_4323/blog/static/233634792008524993766</link>
    <description><![CDATA[<div><P>舍得网（shedewang.com）的开发暂时告一段落，一个人用时不到1个月，java底层代码16902行，jsp代码27685行，共计44587行。整个开发过程遇到过许多问题，但最后都解决了。下面把我在开发中遇到的所有问题和解决办法列出，供参考。 <BR><BR>系统构架：redhat AS4/apache2.0.59/resin2.1.17/jdk6.0 u2/hibernate3.0/lucene2.2/urlrewrite3.0.4，数据库用得是mysql4.1.15，数据库缓存是构架在hibernate之上的，是一个只有794行的java类，但这个java类却做了数据库对象缓存、列表缓存、update缓冲、自动删除列表缓存，还提供了数据库查询、更新、插入的所有操作，它节省了我一半以上的开发时间。一个获取含有五个查询条件获取列表的方法只用不到10行代码就可以了。【增加：现在我已经把这个数据库操作工具改成分布式了，可以随便增加java应用服务器实现负载均衡，并且各服务器之间可以实现缓存同步，这样，即使每日用户达到百万级别，我的构架也是可以支持的，我将在下面详细说明我的构架，仅供参考。许多人要求我开源，我觉得现在系统还没有经过大规模用户的并发验证，还不是时候，以后我会考虑开源的，我的代码没有太多高深的算法和设计模式，主要用到了模板模式，但全是用心写出来的。 <BR><BR>问题一：做数据库缓存时遇到的问题。HashMap在并发遍历时会报ConcurrentModificationException，即使使用Collections.synchronizedList把Map包起来还是会报这个异常，这个问题很简单，解决办法也简单。第一种解决办法是不要用Map的iterator来遍历，而是用Set（Map.keySet方法）的toArray方法来遍历，这种办法虽然会损耗一定的性能和内存，但比在方法前加synchronized好得多；第二种解决办法用jdk5.0以后的ConcurrentHashMap来实现。【修正：经过测试和验证，第一种方法不行，也就是并发操作MAP而且要求遍历的时候只能用ConcruuentHashMap，在此要感谢写ConcurrentHashMap的专家们。】【增加：数据库的缓存有很多种办法，对于单个对象的缓存比较容易，直接用HashMap都可以，但是对于列表的缓存就比较复杂了，网上说到的memcachedb+memcache_engine或者berkeleydb应该都是做不到列表自动缓存，因为增加一条记录后会影响许多列表的排序，所以什么时候删除列表缓存是个比较头痛的问题，我的解决办法是列表的缓存的key便包含了查询条件信息。如一个表T有字段A,B,C，对应T.java有域A,B,C，那么查询一个A=1 and B=2 and C&gt; 0 的组合条件的列表的key就是A=1#B=2#C&gt; 0，这样，如果增加了一个对象T，其中T.A=1，T.B=3，T.C=0，显然上面列表查询条件包含了条件B=2，而增加的对象B=3，那么无论如何这个新增加的对象T都不可能在这个列表中，也就是说不用删除这个列表，只有增加的对象T满足T.A=1、T.B=2、T.C&gt; 0时该列表才需要重新从数据库中获取，以此可以推出更新、删除一个T对象时什么时候需要删除什么列表。】【增加：至于分布式，我用到了memcached来做远程缓存，利用UDP报文来保持各服务器之间的缓存同步。如获取一个对象：首先在本机缓存中获取，如果没有再去远程memcached server中获取，如果还没有才从数据库中获取并同时放入memcached server 和本机缓存，这样，不管有多少台服务器在做负载均衡，对于一个对象T，只需要在数据库中读取一次，其他所有服务器都可以共享了，数据库查询的压力几乎没有，当然如果插入和修改的次数达到每秒几千次，我可能会用到mysql-proxy，但目前看来，几十万的用户/天的量都用不着，用个好点的数据库服务器即可】【不谦虚的说，我的这套分布式缓存方案是比较强大的，都是用心写出来的，虽然代码只有2874行。实例：如要获取一个id为6789的用户，只要用User u =UserManager.getInstance().getById("6789");一句话即可，所有缓存逻辑都已经包含在里面了。】 <BR></P>
<P>问题二：jfreecharts在Linux上不能显示中文，这个问题没有费多长时间就解决了，上网一搜就搞定，解决方法如下： <BR>到网上下载一个linux下的ttf字体，本例用的是zysong.ttf <BR>1.确认%JavaHome%/jre/lib/fonts目录下存在zysong.ttf <BR>2.在%JavaHome%/jre/lib/fonts目录下执行"ttmkfdir -o fonts.dir"命令,重新生成fonts.dir文件 <BR>3.确认/usr/share/fonts/zh_CN/TrueType目录存在,如果不存在则mkdir创建 <BR>4.确认/usr/share/fonts/zh_CN/TrueType目录下存在zysong.ttf <BR>5.在%JavaHome%/jre/lib目录下,执行 cp fontconfig.RedHat.3.properties.src fontconfig.properties <BR>6.重起resin，OK。 <BR><BR>问题三：linux下的too many open files错误，这个问题比较严重，AS4默认打开文件数是1024，如果超过这个数，resin就自动down掉了，非常恶心。解决办法如下： <BR>echo 65536 &gt; /proc/sys/fs/file-max <BR>编辑/etc/sysctl.conf 文件，编辑行 fs.file-max = 65536 <BR>编辑文件/etc/security/limits.conf，增加行 * - nofile 65536 <BR>用ulimit -a 查看，如果看到行open files (-n) 65536就说明对了 <BR><BR>问题四：内存泄露，表现出来的特征是CPU占到99.9%，内存由10%左右经过几个小时后慢慢涨到50%，最后死掉。做java的人知道，这个问题非常痛苦，而且没有很好的解决办法，因为直接看代码很难看出来。我原来一直以为问题会出现在缓存上，但仔细想想apache的LRUMap不至于产生内存泄露，尤其我设置了LRUMap最大长度只有10000，10000个内存对象能有多大，后来发现是SmartUpload的问题，改成apache的FileUpload子项目就可以了。另外，我在设置jvm参数时增加了-Xmx2048m -Xms2048m -Xmn768m -Xss512k -XX:+UseParallelGC -XX:ParallelGCThreads=4 -XX:+UseParallelOldGC -XX:+UseAdaptiveSizePolicy这些参数，可以回收年老区的内存，现在比较稳定，一般内存占到27%左右就不会再涨了，可能这些参数还不是最优的，有待探索。另外查找内存泄露的软件JProbe我也玩了玩，的确看出其他代码没有明显内存泄露。【修正：上面的参数配置狗P用都没有，内存总是一直在涨。我还尝试了用其他不同方法去回收内存，结果都不太好使，直接用jvm默认的回收方式是最好的，也就是只配置两个参数-Xmx768M -Xms768M效果最好，这样java才真的可以一次性回收几百兆的内存。】 <BR><BR>问题五：搜索分词。一个用户在用舍得网时反映，看到有“啤酒”和“茅台酒”，为什么搜“酒”搜不出来，原因很简单，“啤酒”和“茅台酒”是单独一个词，lucene写入的时候没有再把它拆开，所以必须要搜“啤酒”或“茅台酒”才能搜出来，这在技术上合理，但是用户觉得不合理。所以我改进了搜索算法，把中国3万多个汉字也加到词库中，而且在写入和搜索时用不同的分词算法，如“我喜欢喝啤酒”在写入时会分成“我+喜欢+喝+啤酒+喜+欢+啤+酒”，而在搜索时这句话会被分词为“我+喜欢+喝+啤酒”，这样，用户搜“啤酒”能搜到，搜“酒”也能搜到，而对应另外一句话“这人啤气不好，总喝酒”搜“啤”和“酒”都能搜到，但搜“啤酒”却搜不到，似乎有点意思。但是这么分词也会有点小问题，就是搜索的结果不太人性化。（我的中文词库加成语加汉字共50多万个，比起一般网上十来二十万要丰富得多，不过这没什么大用） <BR><BR>问题六：URL链接“静态化”。本想直接用apache的URL Rewrite来实现，发现不太可能，于是改用urlrewirte实现，配置没什么难度，但是要注意resin的web-app里须增加一行配置 &lt;servlet-mapping url-pattern='*.htm' servlet-name='plugin_match'/&gt; ，这样apache才会把htm结尾的请求转交给resin，否则apache报404错误，这在一般structs项目中都会提到。现在看到的舍得网http://shedewang.com/pg_5_c_2_index.htm，其实就是http://shedewang.com/index.jsp?pg=5&amp;c=2，呵呵，没什么特别的。 <BR><BR>问题七：IE6/IE7/FF的适配，这体现在许多细节上，如FF的回车事件捕获，IE7的href=#页面会移动等等问题上，多测几次，多上网找找也就都解决了。很多人开发网站似乎不太会管FF能不能看，但好歹我也在SP混过几年，做WAP的时候要适配10来款手机，做web适配三五个浏览器不算什么。 <BR><BR>问题八：linux自身的bug。远程连接mysql时有时mysql似乎会重起，这个问题似乎是linux自身的bug，好像和解析有点关系导致mysql崩溃。解决办法：启动mysql增加一个参数，如下：/usr/local/mysql/bin/mysqld_safe --user=mysql --skip-name-resolve &amp; <BR><BR>问题九：hiberate配置文件的问题，配置不好的话总是会报NESTED Exception，或者多用户并发的时候报错。我想一般人都遇到过了，增加一个c3p0的配置段，尤其注意max_statements设置稍微大一点，原来我设置为100的时候10个用户同时创建记录就会出错。 <BR>&lt;property name="hibernate.connection.provider_class"&gt; org.hibernate.connection.C3P0ConnectionProvider &lt;/property&gt; <BR>&lt;property name="hibernate.c3p0.max_size"&gt; 200 &lt;/property&gt; <BR>&lt;property name="hibernate.c3p0.min_size"&gt; 20 &lt;/property&gt; <BR>&lt;property name="hibernate.c3p0.timeout"&gt; 3600 &lt;/property&gt; <BR>&lt;property name="hibernate.c3p0.max_statements"&gt; 1000 &lt;/property&gt; <BR>&lt;property name="hibernate.c3p0.idle_test_period"&gt; 300 &lt;/property&gt; <BR>&lt;property name="hibernate.c3p0.acquire_increment"&gt; 5 &lt;/property&gt; <BR>&lt;property name="hibernate.c3p0.validate"&gt; false &lt;/property&gt; <BR><BR>问题十：ajax的运用问题。提交大文本时似乎不能用prototype提供的Ajax.Updater，要自己创建一个AJAX对象，然后把内容send过去，具体js代码可以参考舍得网的comm.js，另外用jsp获取Ajax提交的内容如果是乱码，把jsp改成UTF-8编码即可。AJAX运用好了的确可以增加用户感受，而且可以让代码的松散耦合性更好，可以把一大段逻辑写在一个小的jsp里面。 <BR><BR>问题十一：网上似乎还有很多人在为自己选择应用服务器的事发愁，我只相信自己的眼睛，就拿tomcat6最新版和resin2.1.17做测试，50个用户并发的情况下tomcat慢4－5倍，我还能指望tomcat在更多的用户并发下发挥作用吗？我用resin2.1.17，很快！resin3 和resin Pro只有在配置好缓存和native的时候可能才有用，但对于我这种情况，用resin3和resin Pro不一定会更快。 <BR><BR>做技术、做管理、做事都是在做人，有很多刚入门的新手，好多人都问我到底用struts还是spring还是什么MVC构架，其实这些都不是问题，只要养成自己的一套开发方式即可，但做技术要有深厚的基本功。像一个武林高手，就拿李小龙来说，他懂空手道、跆拳道、刀枪钯棍都研究过，但真正打架的时候就那么几招，但他有力量、脚步和无与伦比的速度，这些都是基本功；对于篮球高手来说，他甚至不需要懂街球那些花骚的玩法，但实战的时候他也就用几招而已，像科比，他最常用的就是远程投篮和突破，真正打球时没必要在地上一边打滚一边运球，当然，科比也是非常有力量的一个球员。</P></div>]]></description>
	    <author><![CDATA[&lt;a title=&quot;1&quot;&gt;小海]]></author>
	    <comments>http://blog.163.com/yhb_4323/blog/static/233634792008524993766</comments>
    <slash:comments>2</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/yhb_4323/blog/static/233634792008524993766</guid>
    <pubDate>Tue, 24 Jun 2008 09:09:03 +0800</pubDate>
    <dcterms:modified>2008-06-24T09:09:03+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[httpd.conf 中文版(配置文件注解) - 网上摘录 - 大树的一片绿荫]]></title>	
    <link>http://blog.163.com/yhb_4323/blog/static/233634792008519244217</link>
    <description><![CDATA[<div><BR>
<TABLE><BR><B>httpd.conf 中文版(配置文件注解)</B> 
<TBODY></TBODY>
<TABLE>
<TBODY></TBODY>
<TABLE>
<TBODY></TBODY></TABLE>
<TABLE>
<DIV>
<DIV>
<P align=center><STRONG>httpd.conf&nbsp;中文版</STRONG></P>
<DIV>#&nbsp;基于&nbsp;NCSA&nbsp;服务器的配置文件&nbsp;由&nbsp;Rob&nbsp;McCool&nbsp;编写!<BR>#<BR>#&nbsp;Apache服务器主配置文件.&nbsp;包括服务器指令的目录设置.<BR>#&nbsp;详见&nbsp;&lt;&gt;&nbsp;<BR>#<BR>#&nbsp;请在理解用途的基础上阅读各指令<BR>#<BR>#&nbsp;再读取此文档后，服务器将继续搜索运行<BR>#&nbsp;E:/Program&nbsp;Files/Apache&nbsp;Group/Apache/conf/srm.conf&nbsp;<BR>#&nbsp;E:/Program&nbsp;Files/Apache&nbsp;Group/Apache/conf/access.conf<BR>#&nbsp;除非用ResourceConfig或AccessConfig覆盖这儿的标识<BR>#<BR>#&nbsp;配置标识由三个基本部分组成:<BR>#&nbsp;1.&nbsp;作为一个整体来控制Apache服务器进程的标识&nbsp;(the&nbsp;'global&nbsp;environment').<BR>#&nbsp;2.&nbsp;用于定义主（默认）服务器参数的标识<BR>#&nbsp;响应虚拟主机不能处理的请求<BR>#&nbsp;同时也提供所有虚拟主机的设置值<BR>#&nbsp;3.&nbsp;虚拟主机的设置在一个Apache服务器进程中配置不同的IP地址和主机名<BR>#<BR>#&nbsp;配置和日志文件名：指定服务器控制文件命名时，<BR>#&nbsp;以&nbsp;"/"&nbsp;(或&nbsp;"drive:/"&nbsp;for&nbsp;Win32)开始，服务器将使用这些绝对路径<BR>#&nbsp;如果文件名不是以"/"开始的，预先考虑服务器根目录--<BR>#&nbsp;因此&nbsp;"logs/foo.log"，如果服务器根目录是"/usr/local/apache"，<BR>#&nbsp;服务器将解释为&nbsp;"/usr/local/apache/logs/foo.log".<BR>#<BR>#&nbsp;注:&nbsp;指定的文件名需要用"/"代替"\"<BR>#&nbsp;(例,&nbsp;"c:/apache"&nbsp;代替&nbsp;"c:\apache").<BR>#&nbsp;如果省略了驱动器名，默认使用Apache.exe所在的驱动器盘符<BR>#&nbsp;建议指定盘符，以免混乱<BR>#&nbsp;</DIV>
<P>###&nbsp;部分&nbsp;1:&nbsp;全局环境<BR>#<BR>#&nbsp;本部分的表示将影响所有Apache的操作<BR>#&nbsp;例如，所能处理的并发请求数或配置文件地址<BR>#</P>
<P>#<BR>#&nbsp;ServerType&nbsp;可取值&nbsp;inetd&nbsp;或&nbsp;standalone.&nbsp;Inetd&nbsp;只适用于Unix平台<BR>#<BR>ServerType&nbsp;standalone</P>
<P>#<BR>#&nbsp;ServerRoot:&nbsp;目录树的根结点服务器配置出错信息日志文件都保存在根目录下<BR>#<BR>#&nbsp;不要再目录末尾加"/"<BR>#<BR>ServerRoot&nbsp;"C:/Program&nbsp;Files/Apache&nbsp;Group/Apache"</P>
<P>#<BR>#&nbsp;PidFile:&nbsp;服务器用于记录启动时进程ID的文件<BR>#<BR>PidFile&nbsp;logs/httpd.pid</P>
<P>#<BR>#&nbsp;ScoreBoardFile:&nbsp;用于保存内部服务器进程信息的文件<BR>#&nbsp;并非必须&nbsp;但是如果指定了（此文件当运行Apache时生成）<BR>#&nbsp;那么必须确保没有两个Apache进程共享同一个scoreboard文件<BR>#<BR>ScoreBoardFile&nbsp;logs/apache_runtime_status</P>
<P>#<BR>#&nbsp;在标准配置下，服务器将顺序读取&nbsp;<STRONG>httpd.conf</STRONG>(此文件可通过命令行中-f参数指定），<BR>#&nbsp;srm.conf&nbsp;和&nbsp;access.conf&nbsp;<BR>#&nbsp;目前后两个文件是空的为了简单起见，建议将所有的标识放在一个文件中&nbsp;<BR>#&nbsp;以下两条注释的标识，是默认设置<BR>#&nbsp;要让服务器忽略这些文件可以用&nbsp;"/dev/null"&nbsp;(for&nbsp;Unix)&nbsp;<BR>#&nbsp;或"nul"&nbsp;(for&nbsp;Win32)&nbsp;作为参数<BR>#<BR>#ResourceConfig&nbsp;conf/srm.conf<BR>#AccessConfig&nbsp;conf/access.conf</P>
<P>#<BR>#&nbsp;Timeout:&nbsp;接受和发送timeout的时间<BR>#<BR>Timeout&nbsp;300</P>
<P>#<BR>#&nbsp;KeepAlive:&nbsp;是否允许保持连接（每个连接有多个请求）<BR>#&nbsp;"Off"&nbsp;-无效<BR>#<BR>KeepAlive&nbsp;On</P>
<P>#<BR>#&nbsp;MaxKeepAliveRequests:&nbsp;每个连接的最大请求数<BR>#&nbsp;设置为0表示无限制<BR>#&nbsp;建议设置较高的值，以获得最好的性能<BR>#<BR>MaxKeepAliveRequests&nbsp;100</P>
<P>#<BR>#&nbsp;KeepAliveTimeout:&nbsp;同一连接同一客户端两个请求之间的等待时间<BR>#<BR>KeepAliveTimeout&nbsp;15</P>
<P>#<BR>#&nbsp;在Win32下,Apache每次产生一个子进程来处理请求<BR>#&nbsp;如果这个进程死了，会自动产生另一个子进程<BR>#&nbsp;所有的进入请求在子进程中多线程处理<BR>#&nbsp;以下两个标识控制进程的运行<BR>#</P>
<P>#<BR>#&nbsp;MaxRequestsPerChild:&nbsp;每个子进程死亡之前最大请求数<BR>#&nbsp;如果超过这个请求数，子程序会自动退出，避免延期使用导致内存溢出或其他问题<BR>#&nbsp;大部分系统，并不需要此设置，<BR>#&nbsp;但是部分，象Solaris，确实值得注意<BR>#&nbsp;对Win32,&nbsp;可设置为0&nbsp;(无限制)<BR>#&nbsp;除非有另外的考虑<BR>#<BR>#&nbsp;注:&nbsp;此值不包括在每个连接初始化请求后，"keptalive"请求<BR>#&nbsp;例如,&nbsp;如果一个子进程处理一个初始化请求和10个后续"keptalive"请求，<BR>#&nbsp;在这个限制下，只会记为一个请求<BR>#<BR>MaxRequestsPerChild&nbsp;0</P>
<P>#<BR>#&nbsp;ThreadsPerChild:&nbsp;服务器所允许的并发线程数<BR>#&nbsp;此值的设置取决于服务器的响应能力（约多的请求在同一时间激活，则每个请求的处理时间越慢）<BR>#&nbsp;和服务器所允许消耗的系统资源<BR>#<BR>ThreadsPerChild&nbsp;50</P>
<P>#<BR>#&nbsp;Listen:&nbsp;允许将Apache绑顶到指定的IP地址和端口，作为默认值的辅助选项<BR>#&nbsp;参见&nbsp;<BR>#<BR>#Listen&nbsp;3000<BR>#Listen&nbsp;12.34.56.78:80</P>
<P>#<BR>#&nbsp;BindAddress:&nbsp;通过此选项可支持虚拟主机<BR>#&nbsp;此标识用于告诉服务器监听哪个IP地址<BR>#&nbsp;包括："*",&nbsp;IP地址,&nbsp;或域名.<BR>#&nbsp;参见&nbsp;和&nbsp;Listen&nbsp;directives.<BR>#<BR>BindAddress&nbsp;166.111.178.144</P>
<P>#<BR>#&nbsp;Apache模块编译成标准的Windows结构<BR>#<BR>#&nbsp;以下模块绑定到标准的Apache二进制windows分布<BR>#&nbsp;要修改标准操作，取消以下行的注释并且修改指定模块列表&nbsp;<BR>#<BR>#&nbsp;警告：这是高级选项可能导致服务器崩溃<BR>#&nbsp;没有专家的指导，不要轻易修改<BR>#<BR>#ClearModuleList<BR>#AddModule&nbsp;mod_so.c&nbsp;mod_mime.c&nbsp;mod_access.c&nbsp;mod_auth.c&nbsp;mod_negotiation.c<BR>#AddModule&nbsp;mod_include.c&nbsp;mod_autoindex.c&nbsp;mod_dir.c&nbsp;mod_cgi.c&nbsp;mod_userdir.c<BR>#AddModule&nbsp;mod_alias.c&nbsp;mod_env.c&nbsp;mod_log_config.c&nbsp;mod_asis.c&nbsp;mod_imap.c<BR>#AddModule&nbsp;mod_actions.c&nbsp;mod_setenvif.c&nbsp;mod_isapi.c</P>
<P>#<BR>#&nbsp;动态共享对象（Dynamic&nbsp;Shared&nbsp;Object，DSO）&nbsp;<BR>#<BR>#&nbsp;要使用基于DSO的功能模块，需要替换此处相应的<BR>#&nbsp;`LoadModule'&nbsp;行这样在使用之前这些包含的标识都将生效<BR>#&nbsp;有关DSO及至的详细资料请看Apache1.3版中的README.DSOSO<BR>#&nbsp;运行"apche&nbsp;-l"将列表显示Apache内奸的模块（类似标准的连接已经生效）<BR>#<BR>#&nbsp;注：模块载入的顺序很重要没有专家的建议，不要修改以下的顺序<BR>#<BR>#LoadModule&nbsp;anon_auth_module&nbsp;modules/ApacheModuleAuthAnon.dll<BR>#LoadModule&nbsp;dbm_auth_module&nbsp;modules/ApacheModuleAuthDBM.dll<BR>#LoadModule&nbsp;digest_auth_module&nbsp;modules/ApacheModuleAuthDigest.dll<BR>#LoadModule&nbsp;cern_meta_module&nbsp;modules/ApacheModuleCERNMeta.dll<BR>#LoadModule&nbsp;digest_module&nbsp;modules/ApacheModuleDigest.dll<BR>#LoadModule&nbsp;expires_module&nbsp;modules/ApacheModuleExpires.dll<BR>#LoadModule&nbsp;headers_module&nbsp;modules/ApacheModuleHeaders.dll<BR>#LoadModule&nbsp;proxy_module&nbsp;modules/ApacheModuleProxy.dll<BR>#LoadModule&nbsp;rewrite_module&nbsp;modules/ApacheModuleRewrite.dll<BR>#LoadModule&nbsp;speling_module&nbsp;modules/ApacheModuleSpeling.dll<BR>#LoadModule&nbsp;info_module&nbsp;modules/ApacheModuleInfo.dll<BR>#LoadModule&nbsp;status_module&nbsp;modules/ApacheModuleStatus.dll<BR>#LoadModule&nbsp;usertrack_module&nbsp;modules/ApacheModuleUserTrack.dll</P>
<P>#<BR>#&nbsp;ExtendedStatus&nbsp;在服务器状态句柄被呼叫时控制是产生完整的状态信息(ExtendedStatus&nbsp;On)<BR>#&nbsp;还是仅返回基本信息(ExtendedStatus&nbsp;Off)<BR>#&nbsp;默认是：Off<BR>#<BR>#ExtendedStatus&nbsp;On</P>
<P>###&nbsp;部分&nbsp;2:&nbsp;主服务器配置<BR>#<BR>#&nbsp;此部分的标识用于主服务器所有的设置值，<BR>#&nbsp;响应任何定义不处理的请求<BR>#&nbsp;这些值同时给你稍后在此文件中定义的提供默认值<BR>#<BR>#&nbsp;所有的标识可能会在中出现<BR>#&nbsp;对应的默认值会被虚拟主机重新定义覆盖<BR>#</P>
<P>#<BR>#&nbsp;Port:&nbsp;Standalone服务器监听的端口&nbsp;<BR>#&nbsp;在Apache能够监听指定端口前，需要在防火墙中进行设置<BR>#&nbsp;其它运行httpd的服务器也可能影响此端口&nbsp;Disable<BR>#&nbsp;如果遇到问题，请关闭所有的防火墙安全保护和其他的服务<BR>#&nbsp;Windos&nbsp;NT的"NETSTAT&nbsp;-a"指令会有助于问题的分析<BR>#<BR>Port&nbsp;80</P>
<P>#<BR>#&nbsp;ServerAdmin:&nbsp;你的地址如果服务器有任何问题将发信到这个地址<BR>#&nbsp;这个地址会在服务器产生的某些页面中出现，例如，错误报告<BR>#<BR>ServerAdmin&nbsp;</P>
<P>#<BR>#&nbsp;ServerName&nbsp;允许设置主机名如果与程序获得的不同，主机名将返回客户端<BR>#&nbsp;（例如，用"www"代替主机真实的名字）<BR>#<BR>#&nbsp;注:&nbsp;主机名不能随便指定必须是你的机器有效的DNS名称否则无法正常工作<BR>#&nbsp;如果不能理解，倾向你的网络管理员询问<BR>#&nbsp;如果你的主机没有注册DNS名，可在此输入IP地址<BR>#&nbsp;此时必须用IP地址来访问(如,&nbsp;)<BR>#&nbsp;这样扔可以完成重新定向的工作<BR>#<BR>#&nbsp;127.0.0.1&nbsp;是TCP/IP的本地环路地址,&nbsp;通常命名为localhost.&nbsp;<BR>#&nbsp;机器默认此地置为本身&nbsp;如果只是使用Apache来进行本地测试和开发，&nbsp;<BR>#&nbsp;可使用127.0.0.1&nbsp;作为服务器名.<BR>#<BR>#ServerName&nbsp;new.host.name</P>
<P><BR>#<BR>#&nbsp;DocumentRoot:&nbsp;放置服务文档的目录<BR>#&nbsp;默认状态下，所有的请求都以这个目录为基础<BR>#&nbsp;但是直接符号连接和别名可用于指向其他位置<BR>#<BR>DocumentRoot&nbsp;"D:/www_root"</P>
<P>#<BR>#&nbsp;Apache访问的每个目录可设置相关的服务和特性是允许或（和）不允许<BR>#&nbsp;(同样影响其子目录）&nbsp;<BR>#<BR>#&nbsp;首先，设置"default"地址只有最基本的权限<BR>#<BR><BR>Options&nbsp;FollowSymLinks<BR>AllowOverride&nbsp;None<BR></P>
<P>#<BR>#&nbsp;注意从现在开始必须制定开启特殊的权限<BR>#&nbsp;这样就不会产生意想不到的结果<BR>#&nbsp;请仔细确认<BR>#</P>
<P>#<BR>#&nbsp;这个地址应与DocumentRoot保持一致<BR>#<BR></P>
<P>#<BR>#&nbsp;此值可是：&nbsp;"None",&nbsp;"All",&nbsp;或下列的组合：&nbsp;"Indexes",<BR>#&nbsp;"Includes",&nbsp;"FollowSymLinks",&nbsp;"ExecCGI",&nbsp;或&nbsp;"MultiViews".<BR>#<BR>#&nbsp;注意"MultiViews"必须明确指定---&nbsp;"Options&nbsp;All"不包括此特性<BR>#<BR>Options&nbsp;Indexes&nbsp;FollowSymLinks&nbsp;MultiViews</P>
<P>#<BR>#&nbsp;此项控制目录中哪些.htaccess文件可覆盖<BR>#&nbsp;允许值：&nbsp;"All"或者以下项的组合："Options",&nbsp;"FileInfo",&nbsp;<BR>#&nbsp;"AuthConfig",&nbsp;"Limit"<BR>#<BR>AllowOverride&nbsp;None</P>
<P>#<BR>#&nbsp;控制哪些用户可从此服务器获得资料<BR>#<BR>Order&nbsp;allow,deny<BR>Allow&nbsp;from&nbsp;all<BR></P>
<P>#<BR>#&nbsp;UserDir:&nbsp;当请求~user时，追加到用户主目录的路径地址<BR>#<BR>#&nbsp;在Win32下，并不要求指定为用户登陆的主目录<BR>#&nbsp;因此可使用以下的格式&nbsp;<BR>#&nbsp;详细参照文档UserDir<BR>#<BR><BR>UserDir&nbsp;"f:/homepages/"<BR></P>
<P>#<BR>#&nbsp;控制访问UserDir目录.&nbsp;The&nbsp;following&nbsp;is&nbsp;an&nbsp;example<BR>#&nbsp;以下是一个站点的例子，权限限制为只读<BR>#<BR>#<BR>#&nbsp;AllowOverride&nbsp;FileInfo&nbsp;AuthConfig&nbsp;Limit<BR>#&nbsp;Options&nbsp;MultiViews&nbsp;Indexes&nbsp;SymLinksIfOwnerMatch&nbsp;IncludesNoExec<BR>#&nbsp;&nbsp; <BR>#&nbsp;Order&nbsp;allow,deny<BR>#&nbsp;Allow&nbsp;from&nbsp;all<BR>#&nbsp;<BR>#&nbsp;&nbsp; <BR>#&nbsp;Order&nbsp;deny,allow<BR>#&nbsp;Deny&nbsp;from&nbsp;all<BR>#&nbsp;<BR>#</P>
<P>#<BR>#&nbsp;DirectoryIndex:&nbsp;预设的HTML目录索引文件名<BR>#&nbsp;用空格来分隔多个文件名<BR>#<BR><BR>DirectoryIndex&nbsp;index.html<BR></P>
<P>#<BR>#&nbsp;AccessFileName:&nbsp;每个目录中用于控制访问信息的文件名<BR>#<BR>AccessFileName&nbsp;.htaccess</P>
<P>#<BR>#&nbsp;以下行防止客户端可访问&nbsp;.htaccess&nbsp;文件<BR>#&nbsp;因为&nbsp;.htaccess文件通常包含授权信息，<BR>#&nbsp;处于安全的考虑不允许访问&nbsp;<BR>#&nbsp;如果想让访客看到.htaccess文件的内容，<BR>#&nbsp;可将这些行注释<BR>#&nbsp;如果修改了上面的AccessFileName,<BR>#&nbsp;请在此进行相应的修改<BR>#<BR>#&nbsp;同时，一般会用类似.htpasswd的文件保存密码<BR>#&nbsp;这些文件同样可以得到保护<BR>#<BR><BR>Order&nbsp;allow,deny<BR>Deny&nbsp;from&nbsp;all<BR></P>
<P>#<BR>#&nbsp;CacheNegotiatedDocs:&nbsp;默认下，Apache对每个文档发送"Pragma:&nbsp;no-cache"<BR>#&nbsp;这将要求代理服务器不缓存此文档<BR>#&nbsp;取消下列行的可取消这个属性，这样代理服务器将缓存这些文档<BR>#<BR>#CacheNegotiatedDocs</P>
<P>#<BR>#&nbsp;UseCanonicalName:&nbsp;(1.3新增)&nbsp;当此设置为on时，<BR>#&nbsp;无论何时Apache需要构建一个自引用的URL(指向响应来源服务器），<BR>#&nbsp;它将用ServerName和Port来构建一个规范的格式<BR>#&nbsp;当此设置为off时，Apache将使用客户端提供的"主机名：端口"<BR>#&nbsp;这将同时影响CGI脚本中的SERVER_NAME和SERVER_PORT<BR>#<BR>UseCanonicalName&nbsp;On</P>
<P>#<BR>#&nbsp;TypesConfig&nbsp;记录媒体类型（mime.types）文件或类似的东东放置的位置<BR>#<BR><BR>TypesConfig&nbsp;conf/mime.types<BR></P>
<P>#<BR>#&nbsp;DefaultType&nbsp;是服务器处理未确认类型的文件，如为止的扩展名，的默认类型<BR>#&nbsp;如果你的服务器上主要包含的是文本或HTML文档，"text/plain"是较好的设置&nbsp;<BR>#&nbsp;如果服务器上主要包含二进制文件，如应用程序或图片，<BR>#&nbsp;最好设置成"application/octet-stream"防止浏览器将二进制文件以文本的方式显示<BR>#<BR>DefaultType&nbsp;text/plain</P>
<P>#<BR>#&nbsp;mod_mime_magic模块允许服务器使用文件自身的不同标识来确定文件类型<BR>#&nbsp;MIMEMagicFile指示模块文件标识的定义所在的位置<BR>#&nbsp;mod_mime_magic不是默认服务器的一部分<BR>#&nbsp;(必须自行用LoadModule来追加&nbsp;[见'全局环境'部分的&nbsp;DSO&nbsp;章节],<BR>#&nbsp;或者在编译服务器时包含mod_mime_magic部分）<BR>#&nbsp;包含在&nbsp;中.<BR>#&nbsp;就是说，如果该模块是服务器的一部分，MIMEMagicFile标识将执行<BR>#<BR><BR>MIMEMagicFile&nbsp;conf/magic<BR></P>
<P>#<BR>#&nbsp;HostnameLookups:&nbsp;注册客户端的机器名或IP地址<BR>#&nbsp;例如：&nbsp;&nbsp;(on)&nbsp;或&nbsp;204.62.129.132&nbsp;(off).<BR>#&nbsp;默认为off，因为对于网络来说，最好让人们有意识的设置为on，<BR>#&nbsp;因为开启此功能意味着每个客户请求将导致至少向name服务器发送一个lookup请求<BR>#<BR>HostnameLookups&nbsp;Off</P>
<P>#<BR>#&nbsp;ErrorLog:&nbsp;错误记录文件的地址<BR>#&nbsp;如果不在内指定ErrorLog&nbsp;<BR>#&nbsp;改虚拟主机的错误心细将记录到此处<BR>#&nbsp;如果在中明确指定了错误记录文件，<BR>#&nbsp;则错误将记录在那儿而不是这儿<BR>#<BR>ErrorLog&nbsp;logs/error.log</P>
<P>#<BR>#&nbsp;LogLevel:&nbsp;控制记录在error.log中信息的个数.<BR>#&nbsp;可能的值：debug,&nbsp;info,&nbsp;notice,&nbsp;warn,&nbsp;error,&nbsp;crit,<BR>#&nbsp;alert,&nbsp;emerg.<BR>#<BR>LogLevel&nbsp;warn</P>
<P>#<BR>#&nbsp;以下标识定义CustomLog标识使用的格式（见下）<BR>#<BR>LogFormat&nbsp;"%h&nbsp;%l&nbsp;%u&nbsp;%t&nbsp;\"%r\"&nbsp;%&gt;s&nbsp;%b&nbsp;\"%{Referer}i\"&nbsp;\"%{User-Agent}i\""&nbsp;combined<BR>LogFormat&nbsp;"%h&nbsp;%l&nbsp;%u&nbsp;%t&nbsp;\"%r\"&nbsp;%&gt;s&nbsp;%b"&nbsp;common<BR>LogFormat&nbsp;"%{Referer}i&nbsp;-&gt;&nbsp;%U"&nbsp;referer<BR>LogFormat&nbsp;"%{User-agent}i"&nbsp;agent</P>
<P>#<BR>#&nbsp;访问记录的位置和格式&nbsp;(功用的记录文件格式).<BR>#&nbsp;如果不在中定义记录文件，<BR>#&nbsp;那些访问记录就将保存在这儿&nbsp;Contrariwise,&nbsp;if&nbsp;you&nbsp;*do*<BR>#&nbsp;反之，如果指定了记录文件，那么访问记录将记录在那儿而不是这个文件中<BR>#<BR>CustomLog&nbsp;logs/access.log&nbsp;common</P>
<P>#<BR>#&nbsp;如果希望使用代理和参考的记录文件,&nbsp;取消以下标识的注释符<BR>#<BR>#CustomLog&nbsp;logs/referer.log&nbsp;referer<BR>#CustomLog&nbsp;logs/agent.log&nbsp;agent</P>
<P>#<BR>#&nbsp;如果想在一个文件中记录访问代理参考信息（复合的记录格式）<BR>#&nbsp;可使用以下标识<BR>#<BR>#CustomLog&nbsp;logs/access.log&nbsp;combined</P>
<P>#<BR>#&nbsp;在服务器产生的页面（如错误文档信息，FTP目录列表等等，不包括CGI产生的文档）中<BR>#&nbsp;增加一条服务器版本和虚拟主机名的信息<BR>#&nbsp;设置为"EMail"将包含mailto:&nbsp;ServerAdmin的连接.<BR>#&nbsp;可选值:&nbsp;On&nbsp;|&nbsp;Off&nbsp;|&nbsp;EMail<BR>#<BR>ServerSignature&nbsp;On</P>
<P>#&nbsp;<BR>#&nbsp;默认下，Apache用工作行解析所有CGI脚本<BR>#&nbsp;此注释行（脚本的第一行）包括'#'和'!'后面跟着执行特殊脚本的程序路径，<BR>#&nbsp;对perl脚本来说是C:\Program&nbsp;Files\Perl目录中的perl.exe<BR>#&nbsp;工作行如下：</P>
<P>#!c:/program&nbsp;files/perl/perl</P>
<P>#&nbsp;注意真实的工作行不能有缩进，必须是文件的第一行<BR>#&nbsp;当然，CGI进程必须通过适当的ScriptAlias或ExecCGI选项标识来启动<BR>#<BR>#&nbsp;然而，Windows下的Apache即允许以上的Unix方式，也可以通过注册表的形式<BR>#&nbsp;用注册表执行文件的方法同在Windows资源管理器中双击运行的注册方法相同&nbsp;<BR>#&nbsp;此脚本操作可在Windows资源管理器的查看菜单中设置&nbsp;<BR>#&nbsp;文件夹选项，然后查看文件类型点击编辑按钮<BR>#&nbsp;修改操作属性Apache&nbsp;1.3会尝试执行Open'操作，<BR>#&nbsp;如果失败则会尝试工作行<BR>#&nbsp;这个属性在Apache&nbsp;release&nbsp;2.0中会有改变.<BR>#<BR>#&nbsp;每个机制都有自身特定的安全弱点，这样可能导致别人运行你不希望调用的程序<BR>#&nbsp;最佳的解决方案还在讨论中<BR>#<BR>#&nbsp;要是这个Windows的特殊属性生效&nbsp;(同时会是Unix属性无效）<BR>#&nbsp;取消下列标识的注释符<BR>#<BR>#ScriptInterpreterSource&nbsp;registry<BR>#<BR>#&nbsp;上面的标识可在块或.htaccess文件中单独替换<BR>#&nbsp;可选择'registry'&nbsp;(Windows&nbsp;behavior)或&nbsp;'script'&nbsp;<BR>#&nbsp;(Unix&nbsp;behavior)&nbsp;option,&nbsp;将覆盖服务器的默认值<BR>#</P>
<P>#<BR>#&nbsp;Aliases:&nbsp;可无限制的追加别名格式如下：&nbsp;<BR>#&nbsp;Alias&nbsp;假名&nbsp;真名<BR>#<BR></P>
<P>#<BR>#&nbsp;注意如果假名中包含'/'，服务器会在当前URL中发出请求<BR>#&nbsp;因此"/icons"不能用于别名<BR>#&nbsp;必须用&nbsp;"/icons/"..<BR>#<BR>Alias&nbsp;/icons/&nbsp;"C:/Program&nbsp;Files/Apache&nbsp;Group/Apache/icons/"</P>
<P><BR>Options&nbsp;Indexes&nbsp;MultiViews<BR>AllowOverride&nbsp;None<BR>Order&nbsp;allow,deny<BR>Allow&nbsp;from&nbsp;all<BR></P>
<P>#<BR>#&nbsp;ScriptAlias:&nbsp;控制哪个目录包含服务器脚本<BR>#&nbsp;ScriptAlias本质行和Aliases一样,&nbsp;except&nbsp;that<BR>#&nbsp;区别在于真名目录中的文档被看作是一个应用程序<BR>#&nbsp;请求时由服务器运行而不是发往客户端<BR>#&nbsp;"/"符号的规则同<BR>#&nbsp;Alias相同.<BR>#<BR>ScriptAlias&nbsp;/cgi-bin/&nbsp;"C:/Program&nbsp;Files/Apache&nbsp;Group/Apache/cgi-bin/"</P>
<P>#<BR>#&nbsp;"C:/Program&nbsp;Files/Apache&nbsp;Group/Apache/cgi-bin"&nbsp;可修改为任何放置CGI脚本的目录<BR>#<BR><BR>AllowOverride&nbsp;None<BR>Options&nbsp;None<BR>Order&nbsp;allow,deny<BR>Allow&nbsp;from&nbsp;all</P>
<P>#&nbsp;别名结束</P>
<P>#php脚本说明</P>
<P>ScriptAlias&nbsp;/php/&nbsp;"d:/php/"<BR>AddType&nbsp;application/x-httpd-php&nbsp;.php<BR>AddType&nbsp;application/x-httpd-php&nbsp;.php3<BR>AddType&nbsp;application/x-httpd-php&nbsp;.phtml<BR>Action&nbsp;application/x-httpd-php&nbsp;"/php/php.exe"</P>
<P>#php脚本说明结束</P>
<P>#<BR>#&nbsp;Redirect&nbsp;允许告诉客户端服务器上曾经有的文档，但是现在不存在了<BR>#&nbsp;并且可以告诉客户端到哪儿去寻找<BR>#&nbsp;格式:&nbsp;Redirect&nbsp;old-URL&nbsp;new-URL<BR>#</P>
<P>#<BR>#&nbsp;控制服务器目录列表显示的标识<BR>#<BR></P>
<P>#<BR>#&nbsp;FancyIndexing标识是使用特定的目录检索还是标准的（standard）<BR>#<BR>IndexOptions&nbsp;FancyIndexing</P>
<P>#<BR>#&nbsp;AddIcon*表明不同文件或扩展名显示的图标<BR>#&nbsp;这些图标只在特定检索状态下显示<BR>#<BR>AddIconByEncoding&nbsp;(CMP,/icons/compressed.gif)&nbsp;x-compress&nbsp;x-gzip</P>
<P>AddIconByType&nbsp;(TXT,/icons/text.gif)&nbsp;text/*<BR>AddIconByType&nbsp;(IMG,/icons/image2.gif)&nbsp;image/*<BR>AddIconByType&nbsp;(SND,/icons/sound2.gif)&nbsp;audio/*<BR>AddIconByType&nbsp;(VID,/icons/movie.gif)&nbsp;video/*</P>
<P>AddIcon&nbsp;/icons/binary.gif&nbsp;.bin&nbsp;.exe<BR>AddIcon&nbsp;/icons/binhex.gif&nbsp;.hqx<BR>AddIcon&nbsp;/icons/tar.gif&nbsp;.tar<BR>AddIcon&nbsp;/icons/world2.gif&nbsp;.wrl&nbsp;.wrl.gz&nbsp;.vrml&nbsp;.vrm&nbsp;.iv<BR>AddIcon&nbsp;/icons/compressed.gif&nbsp;.Z&nbsp;.z&nbsp;.tgz&nbsp;.gz&nbsp;.zip<BR>AddIcon&nbsp;/icons/a.gif&nbsp;.ps&nbsp;.ai&nbsp;.eps<BR>AddIcon&nbsp;/icons/layout.gif&nbsp;.html&nbsp;.shtml&nbsp;.htm&nbsp;.pdf<BR>AddIcon&nbsp;/icons/text.gif&nbsp;.txt<BR>AddIcon&nbsp;/icons/c.gif&nbsp;.c<BR>AddIcon&nbsp;/icons/p.gif&nbsp;.pl&nbsp;.py<BR>AddIcon&nbsp;/icons/f.gif&nbsp;.for<BR>AddIcon&nbsp;/icons/dvi.gif&nbsp;.dvi<BR>AddIcon&nbsp;/icons/uuencoded.gif&nbsp;.uu<BR>AddIcon&nbsp;/icons/script.gif&nbsp;.conf&nbsp;.sh&nbsp;.shar&nbsp;.csh&nbsp;.ksh&nbsp;.tcl<BR>AddIcon&nbsp;/icons/tex.gif&nbsp;.tex<BR>AddIcon&nbsp;/icons/bomb.gif&nbsp;core</P>
<P>AddIcon&nbsp;/icons/back.gif&nbsp;..<BR>AddIcon&nbsp;/icons/hand.right.gif&nbsp;README<BR>AddIcon&nbsp;/icons/folder.gif&nbsp;^^DIRECTORY^^<BR>AddIcon&nbsp;/icons/blank.gif&nbsp;^^BLANKICON^^</P>
<P>#<BR>#&nbsp;DefaultIcon&nbsp;用于为制定图标的文件所显示的图标<BR>#<BR>DefaultIcon&nbsp;/icons/unknown.gif</P>
<P>#<BR>#&nbsp;AddDescription在服务器生成的检索的某个文件后追加小段说明<BR>#&nbsp;此项只在设置为FancyIndexed时有效<BR>#&nbsp;格式：AddDescription&nbsp;"描述"&nbsp;文件名<BR>#<BR>#AddDescription&nbsp;"GZIP&nbsp;compressed&nbsp;document"&nbsp;.gz<BR>#AddDescription&nbsp;"tar&nbsp;archive"&nbsp;.tar<BR>#AddDescription&nbsp;"GZIP&nbsp;compressed&nbsp;tar&nbsp;archive"&nbsp;.tgz</P>
<P>#<BR>#&nbsp;ReadmeName是服务器默认的README文件<BR>#&nbsp;并且会追加到目录列表的最后<BR>#<BR>#&nbsp;HeaderName&nbsp;是目录中需要预先显示内容的文件名<BR>#<BR>#&nbsp;如果MultiViews在选项中，作为结果，服务器将先找name.html，<BR>#&nbsp;如果存在就包含它如果name.html不存在，<BR>#&nbsp;服务器会继续寻找name.txt如果存在就作为纯文本包含进来<BR>#<BR>ReadmeName&nbsp;README<BR>HeaderName&nbsp;HEADER</P>
<P>#<BR>#&nbsp;IndexIgnore是一系列的文件名目录索引将忽略这些文件并且不包含在列表中<BR>#&nbsp;允许使用通配符<BR>#<BR>IndexIgnore&nbsp;.??*&nbsp;*~&nbsp;*#&nbsp;HEADER*&nbsp;README*&nbsp;RCS&nbsp;CVS&nbsp;*,v&nbsp;*,t</P>
<P><BR>#&nbsp;indexing标识结束</P>
<P>#<BR>#&nbsp;AddEncoding&nbsp;可用于特殊浏览器(Mosaic/X&nbsp;2.1+)快速传输压缩信息<BR>#&nbsp;注：并不是所有的服务器都支持<BR>#&nbsp;除了名字相似，以下Add*标识对上面的FancyIndexing定制标识无影响<BR>#<BR>AddEncoding&nbsp;x-compress&nbsp;Z<BR>AddEncoding&nbsp;x-gzip&nbsp;gz&nbsp;tgz<BR>#<BR>#&nbsp;AddLanguage用于指定文档的语言<BR>#&nbsp;可以使用content标签指定每个文件的语言<BR>#<BR>#&nbsp;注&nbsp;1:&nbsp;后缀不必与所用语言的关键字相同<BR>#&nbsp;---&nbsp;波兰语（Polish，标准代码为pl）的文档可以用<BR>#&nbsp;"AddLanguage&nbsp;pl&nbsp;.po"&nbsp;来避免与perl脚本文件混淆<BR>#<BR>#&nbsp;注&nbsp;2:&nbsp;以下例子表明两个字母的语言缩写和两个字母的国家缩写并不一定相同<BR>#&nbsp;E.g.&nbsp;'Danmark/dk'&nbsp;对比&nbsp;'Danish/da'.<BR>#<BR>#&nbsp;注&nbsp;3:&nbsp;其中'ltz'使用了三个字符，与RFC的规定不同<BR>#&nbsp;但是这个问题正在修订中，并且重新清理RFC1766<BR>#<BR>#&nbsp;丹麦Danish&nbsp;(da)&nbsp;-&nbsp;荷兰Dutch&nbsp;(nl)&nbsp;-&nbsp;英国English&nbsp;(en)&nbsp;-&nbsp;爱萨尼亚Estonian&nbsp;(ee)<BR>#&nbsp;法国French&nbsp;(fr)&nbsp;-&nbsp;德国German&nbsp;(de)&nbsp;-&nbsp;现代希腊文Greek-Modern&nbsp;(el)<BR>#&nbsp;意大利Italian&nbsp;(it)&nbsp;-&nbsp;朝鲜Korean&nbsp;(kr)&nbsp;-&nbsp;挪威Norwegian&nbsp;(no)<BR>#&nbsp;葡萄牙Portuguese&nbsp;(pt)&nbsp;-&nbsp;卢森堡Luxembourgeois*&nbsp;(ltz)<BR>#&nbsp;西班牙Spanish&nbsp;(es)&nbsp;-&nbsp;瑞典Swedish&nbsp;(sv)&nbsp;-&nbsp;加泰罗尼亚Catalan&nbsp;(ca)&nbsp;-&nbsp;捷克Czech(cz)<BR>#&nbsp;波兰Polish&nbsp;(pl)&nbsp;-&nbsp;巴西Brazilian&nbsp;Portuguese&nbsp;(pt-br)&nbsp;-&nbsp;日本Japanese&nbsp;(ja)<BR>#&nbsp;俄国Russian&nbsp;(ru)<BR>#<BR>AddLanguage&nbsp;da&nbsp;.dk<BR>AddLanguage&nbsp;nl&nbsp;.nl<BR>AddLanguage&nbsp;en&nbsp;.en<BR>AddLanguage&nbsp;et&nbsp;.ee<BR>AddLanguage&nbsp;fr&nbsp;.fr<BR>AddLanguage&nbsp;de&nbsp;.de<BR>AddLanguage&nbsp;el&nbsp;.el<BR>AddLanguage&nbsp;he&nbsp;.he<BR>AddCharset&nbsp;ISO-8859-8&nbsp;.iso8859-8<BR>AddLanguage&nbsp;it&nbsp;.it<BR>AddLanguage&nbsp;ja&nbsp;.ja<BR>AddCharset&nbsp;ISO-2022-JP&nbsp;.jis<BR>AddLanguage&nbsp;kr&nbsp;.kr<BR>AddCharset&nbsp;ISO-2022-KR&nbsp;.iso-kr<BR>AddLanguage&nbsp;no&nbsp;.no<BR>AddLanguage&nbsp;pl&nbsp;.po<BR>AddCharset&nbsp;ISO-8859-2&nbsp;.iso-pl<BR>AddLanguage&nbsp;pt&nbsp;.pt<BR>AddLanguage&nbsp;pt-br&nbsp;.pt-br<BR>AddLanguage&nbsp;ltz&nbsp;.lu<BR>AddLanguage&nbsp;ca&nbsp;.ca<BR>AddLanguage&nbsp;es&nbsp;.es<BR>AddLanguage&nbsp;sv&nbsp;.se<BR>AddLanguage&nbsp;cz&nbsp;.cz<BR>AddLanguage&nbsp;ru&nbsp;.ru<BR>AddLanguage&nbsp;tw&nbsp;.tw<BR>AddCharset&nbsp;Big5&nbsp;.Big5&nbsp;.big5<BR>AddCharset&nbsp;WINDOWS-1251&nbsp;.cp-1251<BR>AddCharset&nbsp;CP866&nbsp;.cp866<BR>AddCharset&nbsp;ISO-8859-5&nbsp;.iso-ru<BR>AddCharset&nbsp;KOI8-R&nbsp;.koi8-r<BR>AddCharset&nbsp;UCS-2&nbsp;.ucs2<BR>AddCharset&nbsp;UCS-4&nbsp;.ucs4<BR>AddCharset&nbsp;UTF-8&nbsp;.utf8</P>
<P>#&nbsp;LanguagePriority&nbsp;可设置语言的优先级<BR>#<BR>#&nbsp;优先级降序排列<BR>#&nbsp;在此处按照字母顺序，可自行修改<BR>#<BR><BR>LanguagePriority&nbsp;en&nbsp;da&nbsp;nl&nbsp;et&nbsp;fr&nbsp;de&nbsp;el&nbsp;it&nbsp;ja&nbsp;kr&nbsp;no&nbsp;pl&nbsp;pt&nbsp;pt-br&nbsp;ru&nbsp;ltz&nbsp;ca&nbsp;es&nbsp;sv&nbsp;tw<BR></P>
<P>#<BR>#&nbsp;AddType&nbsp;可临时改变mime.types或者指定特殊文件的格式<BR>#<BR>#&nbsp;例如：PHP&nbsp;3.x&nbsp;模块&nbsp;(非Apache标准配件，参见)可用下面格式定义：<BR>#<BR>#AddType&nbsp;application/x-httpd-php3&nbsp;.php3<BR>#AddType&nbsp;application/x-httpd-php3-source&nbsp;.phps<BR>#<BR>#&nbsp;PHP&nbsp;4.x,&nbsp;使用:<BR>#<BR>#AddType&nbsp;application/x-httpd-php&nbsp;.php<BR>#AddType&nbsp;application/x-httpd-php-source&nbsp;.phps</P>
<P>AddType&nbsp;application/x-tar&nbsp;.tgz</P>
<P>#<BR>#&nbsp;AddHandler&nbsp;可将特定文件扩展名映射到处理方法上<BR>#&nbsp;与文件类型无关此特性可内建到服务器中或者追加在操作指令中（见下）<BR>#<BR>#&nbsp;如果希望用服务器端应用或ScriptAliased外的CGI，取消以下行的注释符<BR>#<BR>#&nbsp;用CGI脚本:<BR>#<BR>#AddHandler&nbsp;cgi-script&nbsp;.cgi</P>
<P>#<BR>#&nbsp;用服务器解析的HTML文档<BR>#<BR>#AddType&nbsp;text/html&nbsp;.shtml<BR>#AddHandler&nbsp;server-parsed&nbsp;.shtml</P>
<P>#<BR>#&nbsp;取消以下注释符可激活Apache的send-asis&nbsp;HTTP&nbsp;file特性<BR>#<BR>#AddHandler&nbsp;send-as-is&nbsp;asis</P>
<P>#<BR>#&nbsp;如果使用服务器端解析的图像定位文件，使用以下标识：<BR>#<BR>#AddHandler&nbsp;imap-file&nbsp;map</P>
<P>#<BR>#&nbsp;要激活type&nbsp;maps使用：<BR>#<BR>#AddHandler&nbsp;type-map&nbsp;var</P>
<P><BR>#&nbsp;文档类型说明结束</P>
<P>#<BR>#&nbsp;Action&nbsp;定义在文件匹配时执行相应的脚本<BR>#&nbsp;可简化常用CGI文件的调用<BR>#&nbsp;格式:&nbsp;Action&nbsp;media/type&nbsp;/cgi-script/location<BR>#&nbsp;格式:&nbsp;Action&nbsp;handler-name&nbsp;/cgi-script/location<BR>#</P>
<P>#<BR>#&nbsp;MetaDir:&nbsp;指定保存meta信息文件的目录<BR>#&nbsp;这些文件包含附加的HTTP头，在发送文档是一并发送<BR>#<BR>#MetaDir&nbsp;.web</P>
<P>#<BR>#&nbsp;MetaSuffix:&nbsp;指定包含meta信息的文件的后缀<BR>#<BR>#MetaSuffix&nbsp;.meta</P>
<P>#<BR>#&nbsp;可定制的错误响应(Apache类型)<BR>#&nbsp;共三种风格：<BR>#<BR>#&nbsp;1)&nbsp;纯文本<BR>#ErrorDocument&nbsp;500&nbsp;"The&nbsp;server&nbsp;made&nbsp;a&nbsp;boo&nbsp;boo.<BR>#&nbsp;注：&nbsp;第一个"号用于表示是文本，实际不输出<BR>#<BR>#&nbsp;2)&nbsp;本地重定向<BR>#ErrorDocument&nbsp;404&nbsp;/missing.html<BR>#&nbsp;to&nbsp;redirect&nbsp;to&nbsp;local&nbsp;URL&nbsp;/missing.html<BR>#ErrorDocument&nbsp;404&nbsp;/cgi-bin/missing_handler.pl<BR>#&nbsp;注：可重定向到任何一个服务器端的脚本或文档<BR>#<BR>#&nbsp;3)&nbsp;外部重定向<BR>#ErrorDocument&nbsp;402&nbsp;<BR>#&nbsp;注:&nbsp;大部分与初始请求关联的环境变量对这样的脚本无效<BR>#</P>
<P>#<BR>#&nbsp;基于浏览器的定制操作<BR>#<BR></P>
<P>#<BR>#&nbsp;以下标识修改普通的HTTP响应操作<BR>#&nbsp;第一个标识针对Netscape2.x和其他无此功能的浏览器取消保持激活状态的功能<BR>#&nbsp;这些浏览器在执行这些功能时会出错<BR>#&nbsp;第二个标识针对IE4.0b2设置其中有一条不完整的HTTP/1.1指令<BR>#&nbsp;在301或302（重定向）响应时不能正确的保持激活状态<BR>#<BR>BrowserMatch&nbsp;"Mozilla/2"&nbsp;nokeepalive<BR>BrowserMatch&nbsp;"MSIE&nbsp;4\.0b2;"&nbsp;nokeepalive&nbsp;downgrade-1.0&nbsp;force-response-1.0</P>
<P>#<BR>#&nbsp;下面的标识通过不产生基本的1.1响应取消对违反HTTP/1.0标准的浏览器的响应<BR>#<BR>BrowserMatch&nbsp;"RealPlayer&nbsp;4\.0"&nbsp;force-response-1.0<BR>BrowserMatch&nbsp;"Java/1\.0"&nbsp;force-response-1.0<BR>BrowserMatch&nbsp;"JDK/1\.0"&nbsp;force-response-1.0</P>
<P><BR>#&nbsp;浏览器定制标识结束</P>
<P>#<BR>#&nbsp;允许使用URL""的形式查看服务器状态报告<BR>#&nbsp;修改&nbsp;".your_domain.com"来匹配相应的域名以激活此功能<BR>#<BR>#<BR>#&nbsp;SetHandler&nbsp;server-status<BR>#&nbsp;Order&nbsp;deny,allow<BR>#&nbsp;Deny&nbsp;from&nbsp;all<BR>#&nbsp;Allow&nbsp;from&nbsp;.your_domain.com<BR>#</P>
<P>#<BR>#&nbsp;允许使用URL"://servername/server-info"（要求加载mod_info.c），<BR>#&nbsp;来远程察看服务器配置报告<BR>#&nbsp;修改&nbsp;".your_domain.com"来匹配相应的域名以激活此功能<BR>#<BR>#<BR>#&nbsp;SetHandler&nbsp;server-info<BR>#&nbsp;Order&nbsp;deny,allow<BR>#&nbsp;Deny&nbsp;from&nbsp;all<BR>#&nbsp;Allow&nbsp;from&nbsp;.your_domain.com<BR>#</P>
<P>#<BR>#&nbsp;据报有人试图利用一个老的1.1漏洞<BR>#&nbsp;这个漏洞与CGI脚本在Apache服务器上分布有关<BR>#&nbsp;通过取消下面几行的注释符，可以将此类攻击记录转移到phf.apache.org上的记录脚本上&nbsp;<BR>#&nbsp;或者也可以利用脚本scriptsupport/phf_abuse_log.cgi记录在本地服务器上<BR>#<BR>#<BR>#&nbsp;Deny&nbsp;from&nbsp;all<BR>#&nbsp;ErrorDocument&nbsp;403&nbsp;<BR>#</P>
<P>#<BR>#&nbsp;代理服务器标识取消下列行的注释符可激活代理服务器<BR>#<BR>#<BR>#&nbsp;ProxyRequests&nbsp;On</P>
<P>#&nbsp;<BR>#&nbsp;Order&nbsp;deny,allow<BR>#&nbsp;Deny&nbsp;from&nbsp;all<BR>#&nbsp;Allow&nbsp;from&nbsp;.your_domain.com<BR>#&nbsp;</P>
<P>#<BR>#&nbsp;激活/取消处理HTTP/1.1&nbsp;"Via:"&nbsp;报头<BR>#&nbsp;("Full"：加入服务器版本;&nbsp;"Block"：取消所有外发的Via:&nbsp;报头)<BR>#&nbsp;可设置值:&nbsp;Off&nbsp;|&nbsp;On&nbsp;|&nbsp;Full&nbsp;|&nbsp;Block<BR>#<BR>#&nbsp;ProxyVia&nbsp;On</P>
<P>#<BR>#&nbsp;可修改下列各行并取消注释符来激活缓存<BR>#&nbsp;(没有CacheRoot标识就不使用缓存)<BR>#<BR>#&nbsp;CacheRoot&nbsp;"E:/Program&nbsp;Files/Apache&nbsp;Group/Apache/proxy"<BR>#&nbsp;CacheSize&nbsp;5<BR>#&nbsp;CacheGcInterval&nbsp;4<BR>#&nbsp;CacheMaxExpire&nbsp;24<BR>#&nbsp;CacheLastModifiedFactor&nbsp;0.1<BR>#&nbsp;CacheDefaultExpire&nbsp;1<BR>#&nbsp;NoCache&nbsp;a_domain.com&nbsp;another_domain.edu&nbsp;joes.garage_sale.com</P>
<P>###&nbsp;部分&nbsp;3:&nbsp;虚拟主机<BR>#<BR>#&nbsp;虚拟主机:&nbsp;如果希望在一台服务器上实现多个域名和主机名的服务，<BR>#&nbsp;可设置VirtualHost来实现Most&nbsp;configurations<BR>#&nbsp;大部分的设置使用基于名称的虚拟主机，这样服务器就不必为IP地址操心<BR>#&nbsp;这些用星号在下面的标识中标出<BR>#<BR>#&nbsp;在试图设置虚拟主机前<BR>#&nbsp;请阅读&lt;&gt;中的文档<BR>#&nbsp;以了解细节问题<BR>#<BR>#&nbsp;可用命令行参数&nbsp;'-S'来确认虚拟主机的设置<BR>#&nbsp;</P>
<P>#<BR>#&nbsp;使用基于名称的虚拟主机<BR>#<BR>#NameVirtualHost&nbsp;*</P></DIV></DIV>
<TBODY></TBODY></TABLE>发表于： 2008-05-24 ，修改于： 2008-05-24 10:33，已浏览51次，有评论0条 推荐 投诉 </TABLE></TABLE><BR><BR><BR><BR><BR>引文来源&nbsp;&nbsp;<A href="http://blog.chinaunix.net/u2/69747/showart_703899.html" target=_blank>httpd.conf 中文版(配置文件注解) - 网上摘录 - 大树的一片绿荫</A><p>----------------------------<br/>一键转贴，快速捕捉生活精彩，赢每周好礼！<a href="http://blog.163.com/activities/hunter/hunter.do?080526jclr46" target="_blank">查看活动首页&gt;&gt;</a></p></div>]]></description>
	    <author><![CDATA[&lt;a title=&quot;1&quot;&gt;小海]]></author>
	    <comments>http://blog.163.com/yhb_4323/blog/static/233634792008519244217</comments>
    <slash:comments>2</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/yhb_4323/blog/static/233634792008519244217</guid>
    <pubDate>Thu, 19 Jun 2008 14:04:04 +0800</pubDate>
    <dcterms:modified>2008-06-19T14:04:04+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[nginx+apache+squid搭建集群web环境 - BSD爱好者乐园 bsdlover.cn]]></title>	
    <link>http://blog.163.com/yhb_4323/blog/static/23363479200851874222860</link>
    <description><![CDATA[<div><DIV>
<DIV>
<DIV>
<DIV>
<H1>nginx+apache+squid搭建集群web环境</H1>
<P>发布: 2008-5-13 10:00 | 作者: 剑心通明 | 来源: 互联网 | 查看: 285次 </P>
<DIV>
<P>一前言，准备工作<BR>当前，LAMP开发模式是WEB开发的首选，如何搭建一个高效可靠稳定的WEB服务器一直是个热门主题，本文就是这个主题的一次尝试<BR>我们采用的架构图如下：</P>-------- ---------- ------------- --------- ------------ | 客户端 | ===&gt; |负载均衡器| ===&gt; |反向代理/缓存| ===&gt; |WEB服务器| ===&gt; |数据库服务器| -------- ---------- ------------- --------- ------------ ,PHP MySQL/memcache eAccelerator
<P>准备工作：<BR><STRONG>服务器</STRONG>： Intel(R) Xeon(TM) CPU 3.00GHz * 2, 2GB mem, SCISC <STRONG>硬盘</STRONG><BR>操作系统：Linux RedHat AS4，<STRONG>内核</STRONG>版本2.6.9-22.ELsmp，gcc版本3.4.4<BR>注：软件均为源代码<STRONG>编译</STRONG><STRONG>安装</STRONG>，因此bsd上完全可以参考<BR>软件：<BR>Apache 2.2.3（能使用MPM模式）<BR>5.2.0（选用该版本是因为5.2.0的引擎相对更高效）<BR>eAccelerator 0.9.5（加速PHP引擎，同时也可以加密PHP源程序）<BR>memcache 1.2.0（用于高速缓存常用数据）<BR>libevent 1.2a（memcache工作机制所需）<BR>MySQL 5.0.27（选用二进制版本，省去编译工作）<BR>Nginx 0.5.4（用做器）<BR>squid-2.6.STABLE6（做反向代理的同时提供专业缓存功能）</P>
<P>二编译安装<BR>一) 安装Nginx<BR>1.) 安装<BR>Nginx发音为[engine x]，是由俄罗斯人Igor Sysoev建立的项目,基于BSD许可据说他当初是F5的成员之一，英文主页：俄罗斯的一些大网站已经使用它超过两年多了，一直表现不凡<BR>Nginx的编译参数如下：</P>[root@localhost]#./configure --prefix=/usr/local/server/nginx --with-openssl=/usr/include \ --with-pcre=/usr/include/pcre/ --with-http_stub_status_module --without-http_memcached_module \ --without-http_fastcgi_module --without-http_rewrite_module --without-http_map_module \ --without-http_geo_module --without-http_autoindex_module
<P>在这里，需要说明一下，由于Nginx的配置<STRONG>文件</STRONG>中我想用到正则，所以需要pcre模块的支持我已经安装了pcre及pcre-devel的rpm包，但是 Ngxin 并不能正确找到 .h/.so/.a/.la 文件，因此我稍微变通了一下：</P>[root@localhost]#mkdir /usr/include/pcre/.libs/ [root@localhost]#cp /usr/lib/libpcre.a /usr/include/pcre/.libs/libpcre.a [root@localhost]#cp /usr/lib/libpcre.a /usr/include/pcre/.libs/libpcre.la
<P>然后，修改objs/Makefile大概在908行的位置上，注释掉以下内容：</P>./configure --disable-shared
<P>接下来，就可以正常执行make及make install了</P>
<P>2.) 修改配置文件/usr/local/server/nginx/conf/nginx.conf<BR>以下是我的nginx.conf内容，仅供参考：</P>
<P>运行以下命令检测配置文件是否无误：</P>如果没有报错，那么就可以开始运行Nginx了，执行以下命令即可：备注：conf/htpasswd 文件的内容用 apache 提供的 htpasswd 工具来产生即可，内容大致如下：3.) 查看 Nginx 运行状态 输入地址 http://192.168.8.1/NginxStatus/，输入验证帐号<STRONG>密码</STRONG>，即可看到类似如下内容：Active connections: 328 server accepts handled requests 9309 8982 28890 Reading: 1 Writing: 3 Waiting: 324第一行表示目前活跃的连接数 第三行的第三个数字表示Nginx运行到当前时间接受到的总请求数，如果快达到了上限，就需要加大上限值了 第四行看不懂 <BR></DIV></DIV></DIV></DIV></DIV><p>----------------------------<br/>一键转贴，快速捕捉生活精彩，赢每周好礼！<a href="http://blog.163.com/activities/hunter/hunter.do?080526jclr46" target="_blank">查看活动首页&gt;&gt;</a></p></div>]]></description>
	    <author><![CDATA[&lt;a title=&quot;1&quot;&gt;小海]]></author>
	    <comments>http://blog.163.com/yhb_4323/blog/static/23363479200851874222860</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/yhb_4323/blog/static/23363479200851874222860</guid>
    <pubDate>Wed, 18 Jun 2008 19:42:22 +0800</pubDate>
    <dcterms:modified>2008-06-18T19:42:22+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[linux根目录下各文件夹的作用]]></title>	
    <link>http://blog.163.com/yhb_4323/blog/static/2336347920085953143880</link>
    <description><![CDATA[<div><P style="TEXT-INDENT: 2em"><FONT size=3>linux下的文件结构，看看每个文件夹都是干吗用的</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/bin&nbsp;二进制可执行命令&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/dev&nbsp;设备特殊文件&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/etc&nbsp;系统管理和配置文件&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/etc/rc.d&nbsp;启动的配置文件和脚本&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/home&nbsp;用户主目录的基点，比如用户user的主目录就是/home/user，可以用~user表示&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/lib&nbsp;标准程序设计库，又叫动态链接共享库，作用类似windows里的.dll文件&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/sbin&nbsp;系统管理命令，这里存放的是系统管理员使用的管理程序&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/tmp&nbsp;公用的临时文件存储点&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/root&nbsp;系统管理员的主目录（呵呵，特权阶级）&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/mnt&nbsp;系统提供这个目录是让用户临时挂载其他的文件系统。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/lost+found&nbsp;这个目录平时是空的，系统非正常关机而留下“无家可归”的文件（windows下叫什么.chk）就在这里&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/proc&nbsp;虚拟的目录，是系统内存的映射。可直接访问这个目录来获取系统信息。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/var&nbsp;某些大文件的溢出区，比方说各种服务的日志文件&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/usr&nbsp;最庞大的目录，要用到的应用程序和文件几乎都在这个目录。其中包含：&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/usr/x11r6&nbsp;存放x&nbsp;window的目录&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/usr/bin&nbsp;众多的应用程序&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/usr/sbin&nbsp;超级用户的一些管理程序&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/usr/doc&nbsp;linux文档&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/usr/include&nbsp;linux下开发和编译应用程序所需要的头文件&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/usr/lib&nbsp;常用的动态链接库和软件包的配置文件&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/usr/man&nbsp;帮助文档&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/usr/src&nbsp;源代码，linux内核的源代码就放在/usr/src/linux里&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/usr/local/bin&nbsp;本地增加的命令&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/usr/local/lib&nbsp;本地增加的库根文件系统&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>通常情况下，根文件系统所占空间一般应该比较小，因为其中的绝大部分文件都不需要&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>经常改动，而且包括严格的文件和一个小的不经常改变的文件系统不容易损坏。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>除了可能的一个叫/&nbsp;v&nbsp;m&nbsp;l&nbsp;i&nbsp;n&nbsp;u&nbsp;z标准的系统引导映像之外，根目录一般不含任何文件。所有&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>其他文件在根文件系统的子目录中。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>1.&nbsp;/bin目录&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/&nbsp;b&nbsp;i&nbsp;n目录包含了引导启动所需的命令或普通用户可能用的命令(可能在引导启动后)。这些&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>命令都是二进制文件的可执行程序(&nbsp;b&nbsp;i&nbsp;n是b&nbsp;i&nbsp;n&nbsp;a&nbsp;r&nbsp;y&nbsp;-&nbsp;-二进制的简称)，多是系统中重要的系统文件。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>2.&nbsp;/sbin目录&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/&nbsp;s&nbsp;b&nbsp;i&nbsp;n目录类似/bin&nbsp;，也用于存储二进制文件。因为其中的大部分文件多是系统管理员使&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>用的基本的系统程序，所以虽然普通用户必要且允许时可以使用，但一般不给普通用户使用。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>3.&nbsp;/etc目录&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/&nbsp;e&nbsp;t&nbsp;c目录存放着各种系统配置文件，其中包括了用户信息文件/&nbsp;e&nbsp;t&nbsp;c&nbsp;/&nbsp;p&nbsp;a&nbsp;s&nbsp;s&nbsp;w&nbsp;d，系统初始化文&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>件/&nbsp;e&nbsp;t&nbsp;c&nbsp;/&nbsp;r&nbsp;c等。l&nbsp;i&nbsp;n&nbsp;u&nbsp;x正是*这些文件才得以正常地运行。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>4.&nbsp;/root目录&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/root&nbsp;目录是超级用户的目录。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>5.&nbsp;/lib目录&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/&nbsp;l&nbsp;i&nbsp;b目录是根文件系统上的程序所需的共享库，存放了根文件系统程序运行所需的共享文&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>件。这些文件包含了可被许多程序共享的代码，以避免每个程序都包含有相同的子程序的副&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>本，故可以使得可执行文件变得更小，节省空间。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>6.&nbsp;/lib/modules&nbsp;目录&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/lib/modules&nbsp;目录包含系统核心可加载各种模块，尤其是那些在恢复损坏的系统时重新引&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>导系统所需的模块(例如网络和文件系统驱动)。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>7.&nbsp;/dev目录&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/&nbsp;d&nbsp;e&nbsp;v目录存放了设备文件，即设备驱动程序，用户通过这些文件访问外部设备。比如，用&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>户可以通过访问/&nbsp;d&nbsp;e&nbsp;v&nbsp;/&nbsp;m&nbsp;o&nbsp;u&nbsp;s&nbsp;e来访问鼠标的输入，就像访问其他文件一样。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>8.&nbsp;/tmp目录&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/tmp&nbsp;目录存放程序在运行时产生的信息和数据。但在引导启动后，运行的程序最好使用&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/&nbsp;v&nbsp;a&nbsp;r&nbsp;/&nbsp;t&nbsp;m&nbsp;p来代替/tmp&nbsp;，因为前者可能拥有一个更大的磁盘空间。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>9.&nbsp;/boot目录&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/&nbsp;b&nbsp;o&nbsp;o&nbsp;t目录存放引导加载器(bootstrap&nbsp;loader)使用的文件，如l&nbsp;i&nbsp;l&nbsp;o，核心映像也经常放在这里，&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>而不是放在根目录中。但是如果有许多核心映像，这个目录就可能变得很大，这时使用单独的&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>文件系统会更好一些。还有一点要注意的是，要确保核心映像必须在i&nbsp;d&nbsp;e硬盘的前1&nbsp;0&nbsp;2&nbsp;4柱面内。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>10.&nbsp;/mnt目录&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/&nbsp;m&nbsp;n&nbsp;t目录是系统管理员临时安装(&nbsp;m&nbsp;o&nbsp;u&nbsp;n&nbsp;t&nbsp;)文件系统的安装点。程序并不自动支持安装到&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/mnt&nbsp;。/mnt&nbsp;下面可以分为许多子目录，例如/mnt/dosa&nbsp;可能是使用m&nbsp;s&nbsp;d&nbsp;o&nbsp;s文件系统的软驱，&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>而/mnt/exta&nbsp;可能是使用e&nbsp;x&nbsp;t&nbsp;2文件系统的软驱，/mnt/cdrom&nbsp;光驱等等。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>11.&nbsp;/proc,&nbsp;/usr,/var,/home目录&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>其他文件系统的安装点。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>下面详细介绍；&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/etc文件系统&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/etc&nbsp;目录包含各种系统配置文件，下面说明其中的一些。其他的你应该知道它们属于哪个&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>程序，并阅读该程序的m&nbsp;a&nbsp;n页。许多网络配置文件也在/etc&nbsp;中。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>1.&nbsp;/etc/rc或/etc/rc.d或/etc/rc?.d&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>启动、或改变运行级时运行的脚本或脚本的目录。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>2.&nbsp;/etc/passwd&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>用户数据库，其中的域给出了用户名、真实姓名、用户起始目录、加密口令和用户的其&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>他信息。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>3.&nbsp;/etc/fdprm&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>软盘参数表，用以说明不同的软盘格式。可用setfdprm&nbsp;进行设置。更多的信息见s&nbsp;e&nbsp;t&nbsp;f&nbsp;d&nbsp;p&nbsp;r&nbsp;m&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>的帮助页。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>4.&nbsp;/etc/fstab&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>指定启动时需要自动安装的文件系统列表。也包括用swapon&nbsp;-a启用的s&nbsp;w&nbsp;a&nbsp;p区的信息。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>5.&nbsp;/etc/group&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>类似/etc/passwd&nbsp;，但说明的不是用户信息而是组的信息。包括组的各种数据。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>6.&nbsp;/etc/inittab&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>init&nbsp;的配置文件。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>7.&nbsp;/etc/issue&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>包括用户在登录提示符前的输出信息。通常包括系统的一段短说明或欢迎信息。具体内&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>容由系统管理员确定。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>8.&nbsp;/etc/magic&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>“f&nbsp;i&nbsp;l&nbsp;e”的配置文件。包含不同文件格式的说明，“f&nbsp;i&nbsp;l&nbsp;e”基于它猜测文件类型。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>9.&nbsp;/etc/motd&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>m&nbsp;o&nbsp;t&nbsp;d是message&nbsp;of&nbsp;the&nbsp;day的缩写，用户成功登录后自动输出。内容由系统管理员确定。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>常用于通告信息，如计划关机时间的警告等。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>10.&nbsp;/etc/mtab&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>当前安装的文件系统列表。由脚本(&nbsp;s&nbsp;c&nbsp;r&nbsp;i&nbsp;t&nbsp;p&nbsp;)初始化，并由mount&nbsp;命令自动更新。当需要一&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>个当前安装的文件系统的列表时使用(例如df&nbsp;命令)。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>11.&nbsp;/etc/shadow&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>在安装了影子(&nbsp;s&nbsp;h&nbsp;a&nbsp;d&nbsp;o&nbsp;w&nbsp;)口令软件的系统上的影子口令文件。影子口令文件将/&nbsp;e&nbsp;t&nbsp;c&nbsp;/&nbsp;p&nbsp;a&nbsp;s&nbsp;s&nbsp;w&nbsp;d&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>文件中的加密口令移动到/&nbsp;e&nbsp;t&nbsp;c&nbsp;/&nbsp;s&nbsp;h&nbsp;a&nbsp;d&nbsp;o&nbsp;w中，而后者只对超级用户(&nbsp;r&nbsp;o&nbsp;o&nbsp;t&nbsp;)可读。这使破译口令更困&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>难，以此增加系统的安全性。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>12.&nbsp;/etc/login.defs&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>l&nbsp;o&nbsp;g&nbsp;i&nbsp;n命令的配置文件。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>13.&nbsp;/etc/printcap&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>类似/etc/termcap&nbsp;，但针对打印机。语法不同。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>14.&nbsp;/etc/profile&nbsp;、/&nbsp;e&nbsp;t&nbsp;c&nbsp;/&nbsp;c&nbsp;s&nbsp;h&nbsp;.&nbsp;l&nbsp;o&nbsp;g&nbsp;i&nbsp;n、/etc/csh.cshrc&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>登录或启动时b&nbsp;o&nbsp;u&nbsp;r&nbsp;n&nbsp;e或c&nbsp;shells执行的文件。这允许系统管理员为所有用户建立全局缺省环境。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>15.&nbsp;/etc/securetty&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>确认安全终端，即哪个终端允许超级用户(&nbsp;r&nbsp;o&nbsp;o&nbsp;t&nbsp;)登录。一般只列出虚拟控制台，这样就不&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>可能(至少很困难)通过调制解调器(&nbsp;m&nbsp;o&nbsp;d&nbsp;e&nbsp;m&nbsp;)或网络闯入系统并得到超级用户特权。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>16.&nbsp;/etc/shells&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>列出可以使用的s&nbsp;h&nbsp;e&nbsp;l&nbsp;l。chsh&nbsp;命令允许用户在本文件指定范围内改变登录的s&nbsp;h&nbsp;e&nbsp;l&nbsp;l。提供一&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>台机器f&nbsp;t&nbsp;p服务的服务进程ftpd&nbsp;检查用户s&nbsp;h&nbsp;e&nbsp;l&nbsp;l是否列在/etc/shells&nbsp;文件中，如果不是，将不允&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>许该用户登录。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>17.&nbsp;/etc/termcap&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>终端性能数据库。说明不同的终端用什么“转义序列”控制。写程序时不直接输出转义&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>序列(这样只能工作于特定品牌的终端)，而是从/etc/termcap&nbsp;中查找要做的工作的正确序列。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>这样，多数的程序可以在多数终端上运行。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/dev文件系统&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/dev&nbsp;目录包括所有设备的设备文件。设备文件用特定的约定命名，这在设备列表中说明。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>设备文件在安装时由系统产生，以后可以用/dev/makedev&nbsp;描述。/&nbsp;d&nbsp;e&nbsp;v&nbsp;/&nbsp;m&nbsp;a&nbsp;k&nbsp;e&nbsp;d&nbsp;e&nbsp;v.local&nbsp;是&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>系统管理员为本地设备文件(或连接)写的描述文稿(即如一些非标准设备驱动不是标准&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>makedev&nbsp;的一部分)。下面简要介绍/&nbsp;d&nbsp;e&nbsp;v下一些常用文件。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>1.&nbsp;/dev/console&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>系统控制台，也就是直接和系统连接的监视器。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>2.&nbsp;/dev/hd&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>i&nbsp;d&nbsp;e硬盘驱动程序接口。如：&nbsp;/&nbsp;d&nbsp;e&nbsp;v&nbsp;/&nbsp;h&nbsp;d&nbsp;a指的是第一个硬盘，&nbsp;h&nbsp;a&nbsp;d&nbsp;1则是指/&nbsp;d&nbsp;e&nbsp;v&nbsp;/&nbsp;h&nbsp;d&nbsp;a的第一个&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>分区。如系统中有其他的硬盘，则依次为/&nbsp;d&nbsp;e&nbsp;v&nbsp;/&nbsp;h&nbsp;d&nbsp;b、/&nbsp;d&nbsp;e&nbsp;v&nbsp;/&nbsp;h&nbsp;d&nbsp;c、.&nbsp;.&nbsp;.&nbsp;.&nbsp;.&nbsp;.；如有多个分区则依次为&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>h&nbsp;d&nbsp;a&nbsp;1、h&nbsp;d&nbsp;a&nbsp;2&nbsp;.&nbsp;.&nbsp;.&nbsp;.&nbsp;.&nbsp;.&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>3.&nbsp;/dev/sd&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>s&nbsp;c&nbsp;s&nbsp;i磁盘驱动程序接口。如有系统有s&nbsp;c&nbsp;s&nbsp;i硬盘，就不会访问/&nbsp;d&nbsp;e&nbsp;v&nbsp;/&nbsp;h&nbsp;a&nbsp;d，而会访问/&nbsp;d&nbsp;e&nbsp;v&nbsp;/&nbsp;s&nbsp;d&nbsp;a。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>4.&nbsp;/dev/fd&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>软驱设备驱动程序。如：&nbsp;/&nbsp;d&nbsp;e&nbsp;v&nbsp;/&nbsp;f&nbsp;d&nbsp;0指系统的第一个软盘，也就是通常所说的a：盘，&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/&nbsp;d&nbsp;e&nbsp;v&nbsp;/&nbsp;f&nbsp;d&nbsp;1指第二个软盘，.&nbsp;.&nbsp;.&nbsp;.&nbsp;.&nbsp;.而/&nbsp;d&nbsp;e&nbsp;v&nbsp;/&nbsp;f&nbsp;d&nbsp;1&nbsp;h&nbsp;1&nbsp;4&nbsp;4&nbsp;0则表示访问驱动器1中的4&nbsp;.&nbsp;5高密盘。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>5.&nbsp;/dev/st&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>s&nbsp;c&nbsp;s&nbsp;i磁带驱动器驱动程序。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>6.&nbsp;/dev/tty&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>提供虚拟控制台支持。如：&nbsp;/&nbsp;d&nbsp;e&nbsp;v&nbsp;/&nbsp;t&nbsp;t&nbsp;y&nbsp;1指的是系统的第一个虚拟控制台，&nbsp;/&nbsp;d&nbsp;e&nbsp;v&nbsp;/&nbsp;t&nbsp;t&nbsp;y&nbsp;2则是系统&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>的第二个虚拟控制台。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>7.&nbsp;/dev/pty&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>提供远程登陆伪终端支持。在进行te&nbsp;l&nbsp;n&nbsp;e&nbsp;t登录时就要用到/&nbsp;d&nbsp;e&nbsp;v&nbsp;/&nbsp;p&nbsp;t&nbsp;y设备。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>8.&nbsp;/dev/ttys&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>计算机串行接口，对于d&nbsp;o&nbsp;s来说就是“&nbsp;c&nbsp;o&nbsp;m&nbsp;1”口。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>9.&nbsp;/dev/cua&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>计算机串行接口，与调制解调器一起使用的设备。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>10.&nbsp;/dev/null&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>“黑洞”，所有写入该设备的信息都将消失。例如：当想要将屏幕上的输出信息隐藏起来&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>时，只要将输出信息输入到/&nbsp;d&nbsp;e&nbsp;v&nbsp;/&nbsp;n&nbsp;u&nbsp;l&nbsp;l中即可。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/usr文件系统&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/usr&nbsp;是个很重要的目录，通常这一文件系统很大，因为所有程序安装在这里。/usr&nbsp;里的&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>所有文件一般来自l&nbsp;i&nbsp;n&nbsp;u&nbsp;x发行版(&nbsp;d&nbsp;i&nbsp;s&nbsp;t&nbsp;r&nbsp;i&nbsp;b&nbsp;u&nbsp;t&nbsp;i&nbsp;o&nbsp;n&nbsp;)；本地安装的程序和其他东西在/usr/local&nbsp;下，因为这样可以在升级新版系统或新发行版时无须重新安装全部程序。/usr&nbsp;目录下的许多内容是&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>可选的，但这些功能会使用户使用系统更加有效。/&nbsp;u&nbsp;s&nbsp;r可容纳许多大型的软件包和它们的配置&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>文件。下面列出一些重要的目录(一些不太重要的目录被省略了)。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>1.&nbsp;/usr/x11r6&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>包含x&nbsp;wi&nbsp;n&nbsp;d&nbsp;o&nbsp;w系统的所有可执行程序、配置文件和支持文件。为简化x的开发和安装，&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>x的文件没有集成到系统中。x&nbsp;wi&nbsp;n&nbsp;d&nbsp;o&nbsp;w系统是一个功能强大的图形环境，提供了大量的图形&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>工具程序。用户如果对microsoft&nbsp;wi&nbsp;n&nbsp;d&nbsp;o&nbsp;w&nbsp;s或m&nbsp;a&nbsp;c&nbsp;h&nbsp;i&nbsp;n&nbsp;t&nbsp;o&nbsp;s&nbsp;h比较熟悉的话，就不会对x&nbsp;wi&nbsp;n&nbsp;d&nbsp;o&nbsp;w系统感到束手无策了。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>2.&nbsp;/usr/x386&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>类似/&nbsp;u&nbsp;s&nbsp;r&nbsp;/&nbsp;x&nbsp;11r6&nbsp;，但是是专门给x&nbsp;11&nbsp;release&nbsp;5的。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>3.&nbsp;/usr/bin&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>集中了几乎所有用户命令，是系统的软件库。另有些命令在/bin&nbsp;或/usr/local/bin&nbsp;中。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>4.&nbsp;/usr/sbin&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>包括了根文件系统不必要的系统管理命令，例如多数服务程序。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>5.&nbsp;/usr/man、/&nbsp;u&nbsp;s&nbsp;r&nbsp;/&nbsp;i&nbsp;n&nbsp;f&nbsp;o、/&nbsp;u&nbsp;s&nbsp;r&nbsp;/&nbsp;d&nbsp;o&nbsp;c&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>这些目录包含所有手册页、g&nbsp;n&nbsp;u信息文档和各种其他文档文件。每个联机手册的“节”&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>都有两个子目录。例如：&nbsp;/&nbsp;u&nbsp;s&nbsp;r&nbsp;/&nbsp;m&nbsp;a&nbsp;n&nbsp;/&nbsp;m&nbsp;a&nbsp;n&nbsp;1中包含联机手册第一节的源码(没有格式化的原始文&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>件)，/&nbsp;u&nbsp;s&nbsp;r&nbsp;/&nbsp;m&nbsp;a&nbsp;n&nbsp;/&nbsp;c&nbsp;a&nbsp;t&nbsp;1包含第一节已格式化的内容。l联机手册分为以下九节：内部命令、系统调&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>用、库函数、设备、文件格式、游戏、宏软件包、系统管理和核心程序。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>6.&nbsp;/usr/include&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>包含了c语言的头文件，这些文件多以.&nbsp;h结尾，用来描述c语言程序中用到的数据结构、&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>子过程和常量。为了保持一致性，这实际上应该放在/usr/lib&nbsp;下，但习惯上一直沿用了这个名&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>字。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>7.&nbsp;/usr/lib&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>包含了程序或子系统的不变的数据文件，包括一些s&nbsp;i&nbsp;t&nbsp;e&nbsp;-&nbsp;w&nbsp;i&nbsp;d&nbsp;e配置文件。名字l&nbsp;i&nbsp;b来源于库&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>(library);&nbsp;编程的原始库也存在/usr/lib&nbsp;里。当编译程序时，程序便会和其中的库进行连接。也&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>有许多程序把配置文件存入其中。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>8.&nbsp;/usr/local&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>本地安装的软件和其他文件放在这里。这与/&nbsp;u&nbsp;s&nbsp;r很相似。用户可能会在这发现一些比较大&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>的软件包，如t&nbsp;e&nbsp;x、e&nbsp;m&nbsp;a&nbsp;c&nbsp;s等。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/var文件系统&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/var&nbsp;包含系统一般运行时要改变的数据。通常这些数据所在的目录的大小是要经常变化&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>或扩充的。原来/&nbsp;v&nbsp;a&nbsp;r目录中有些内容是在/&nbsp;u&nbsp;s&nbsp;r中的，但为了保持/&nbsp;u&nbsp;s&nbsp;r目录的相对稳定，就把那&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>些需要经常改变的目录放到/&nbsp;v&nbsp;a&nbsp;r中了。每个系统是特定的，即不通过网络与其他计算机共享。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>下面列出一些重要的目录(一些不太重要的目录省略了)。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>1.&nbsp;/var/catman&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>包括了格式化过的帮助(&nbsp;m&nbsp;a&nbsp;n&nbsp;)页。帮助页的源文件一般存在/&nbsp;u&nbsp;s&nbsp;r&nbsp;/&nbsp;m&nbsp;a&nbsp;n&nbsp;/&nbsp;m&nbsp;a&nbsp;n中；有些m&nbsp;a&nbsp;n页&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>可能有预格式化的版本，存在/&nbsp;u&nbsp;s&nbsp;r&nbsp;/&nbsp;m&nbsp;a&nbsp;n&nbsp;/&nbsp;c&nbsp;a&nbsp;t中。而其他的m&nbsp;a&nbsp;n页在第一次看时都需要格式化，&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>格式化完的版本存在/var/man&nbsp;中，这样其他人再看相同的页时就无须等待格式化了。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>(/var/catman&nbsp;经常被清除，就像清除临时目录一样。)&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>2.&nbsp;/var/lib&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>存放系统正常运行时要改变的文件。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>3.&nbsp;/var/local&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>存放/usr/local&nbsp;中安装的程序的可变数据(即系统管理员安装的程序)。注意，如果必要，&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>即使本地安装的程序也会使用其他/var&nbsp;目录，例如/var/lock&nbsp;。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>4.&nbsp;/var/lock&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>锁定文件。许多程序遵循在/var/lock&nbsp;中产生一个锁定文件的约定，以用来支持他们正在&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>使用某个特定的设备或文件。其他程序注意到这个锁定文件时，就不会再使用这个设备或文&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>件。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>5.&nbsp;/var/log&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>各种程序的日志(&nbsp;l&nbsp;o&nbsp;g&nbsp;)文件，尤其是login&nbsp;(/var/log/wtmp&nbsp;log纪录所有到系统的登录和注&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>销)&nbsp;和syslog&nbsp;(/var/log/messages&nbsp;纪录存储所有核心和系统程序信息)。/var/log&nbsp;里的文件经常不&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>确定地增长，应该定期清除。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>6.&nbsp;/var/run&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>保存在下一次系统引导前有效的关于系统的信息文件。例如，&nbsp;/var/run/utmp&nbsp;包含当前登&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>录的用户的信息。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>7.&nbsp;/var/spool&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>放置“假脱机(&nbsp;s&nbsp;p&nbsp;o&nbsp;o&nbsp;l&nbsp;)”程序的目录，如m&nbsp;a&nbsp;i&nbsp;l、n&nbsp;e&nbsp;w&nbsp;s、打印队列和其他队列工作的目录。每&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>个不同的s&nbsp;p&nbsp;o&nbsp;o&nbsp;l在/var/spool&nbsp;下有自己的子目录，例如，用户的邮箱就存放在/var/spool/mail&nbsp;中。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>8.&nbsp;/var/tmp&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>比/tmp&nbsp;允许更大的或需要存在较长时间的临时文件。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>注意系统管理员可能不允许/var/tmp&nbsp;有很旧的文件。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/proc文件系统&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>/proc&nbsp;文件系统是一个伪的文件系统，就是说它是一个实际上不存在的目录，因而这是一&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>个非常特殊的目录。它并不存在于某个磁盘上，而是由核心在内存中产生。这个目录用于提&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>供关于系统的信息。下面说明一些最重要的文件和目录(/proc&nbsp;文件系统在proc&nbsp;man页中有更详&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>细的说明)。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>1.&nbsp;/proc/x&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>关于进程x的信息目录，这一x是这一进程的标识号。每个进程在/proc&nbsp;下有一个名为自&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>己进程号的目录。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>2.&nbsp;/proc/cpuinfo&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>存放处理器(&nbsp;c&nbsp;p&nbsp;u&nbsp;)的信息，如c&nbsp;p&nbsp;u的类型、制造商、型号和性能等。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>3.&nbsp;/proc/devices&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>当前运行的核心配置的设备驱动的列表。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>4.&nbsp;/proc/dma&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>显示当前使用的d&nbsp;m&nbsp;a通道。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>5.&nbsp;/proc/filesystems&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>核心配置的文件系统信息。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>6.&nbsp;/proc/interrupts&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>显示被占用的中断信息和占用者的信息，以及被占用的数量。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>7.&nbsp;/proc/ioports&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>当前使用的i&nbsp;/&nbsp;o端口。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>8.&nbsp;/proc/kcore&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>系统物理内存映像。与物理内存大小完全一样，然而实际上没有占用这么多内存；它仅&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>仅是在程序访问它时才被创建。(注意：除非你把它拷贝到什么地方，否则/proc&nbsp;下没有任何&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>东西占用任何磁盘空间。)&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>9.&nbsp;/proc/kmsg&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>核心输出的消息。也会被送到s&nbsp;y&nbsp;s&nbsp;l&nbsp;o&nbsp;g。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>10.&nbsp;/proc/ksyms&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>核心符号表。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>11.&nbsp;/proc/loadavg&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>系统“平均负载”；&nbsp;3个没有意义的指示器指出系统当前的工作量。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>12.&nbsp;/proc/meminfo&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>各种存储器使用信息，包括物理内存和交换分区(&nbsp;s&nbsp;w&nbsp;a&nbsp;p&nbsp;)。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>13.&nbsp;/proc/modules&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>存放当前加载了哪些核心模块信息。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>14.&nbsp;/proc/net&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>网络协议状态信息。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>15.&nbsp;/proc/self&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>存放到查看/proc&nbsp;的程序的进程目录的符号连接。当2个进程查看/proc&nbsp;时，这将会是不同&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>的连接。这主要便于程序得到它自己的进程目录。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>16.&nbsp;/proc/stat&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>系统的不同状态，例如，系统启动后页面发生错误的次数。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>17.&nbsp;/proc/uptime&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>系统启动的时间长度。&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>18.&nbsp;/proc/version&nbsp;</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT size=3>核心版本。</FONT></P></div>]]></description>
	    <author><![CDATA[&lt;a title=&quot;1&quot;&gt;小海]]></author>
	    <comments>http://blog.163.com/yhb_4323/blog/static/2336347920085953143880</comments>
    <slash:comments>1</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/yhb_4323/blog/static/2336347920085953143880</guid>
    <pubDate>Mon, 9 Jun 2008 17:31:43 +0800</pubDate>
    <dcterms:modified>2008-06-09T17:35:54+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[Redhat Linux网卡配置与绑定]]></title>	
    <link>http://blog.163.com/yhb_4323/blog/static/2336347920085811047117</link>
    <description><![CDATA[<div>&65279; 
<DIV>
<DIV>
<H1>Redhat Linux网卡配置与绑定</H1>
<DIV>作者：NinGoo | 转载时请务必以超链接形式标明文章原始出处和作者信息 </DIV>
<DIV>
<P>Redhat Linux的网络配置，基本上是通过修改几个配置文件来实现的，虽然也可以用ifconfig来设置IP，用route来配置默认网关，用hostname来配置主机名，但是重启后会丢失</P>
<P>相关的配置文件</P>
<P><STRONG>/ect/hosts</STRONG> 配置主机名和IP地址的对应<BR><STRONG>/etc/sysconfig/network</STRONG> 配置主机名和网关<BR><STRONG>/etc/sysconfig/network-scripts/ifcfg-eth0</STRONG> eth0配置文件，eth1则文件名为ifcfg-eth1，以此类推</P>
<P><STRONG>一网卡配置</STRONG></P>
<P>假设我们要配置主机名为test，eth0的IP地址192.168.168.1/24，网关地址192.168.168.250</P>
<P>则/etc/sysconfig/network文件内容如下：</P>
<P>NETWORKING=yes<BR>HOSTNAME=test<BR>GATEWAY=192.168.168.250</P>
<P>eth0对应的配置文件/etc/sysconfig/network-scripts/ifcfg-eth0内容如下：</P>
<P>DEVICE=eth0<BR>BOOTPROTO=static<BR>IPADDR=192.168.168.1<BR>NETMASK=255.255.255.0<BR>TYPE=Ethernet<BR>ONBOOT=yes</P>
<P><STRONG>二单网卡绑定多个IP</STRONG></P>
<P>有时，我们需要在一块网卡上配置多个IP，例如，在上面的例子中，我们还需要为eth0配置IP 192.168.168.2和192.168.168.3那么需要再在/etc/sysconfig/network-scripts下新建两个配置文件：</P>
<P><STRONG>ifcfg-eth0:0</STRONG>内容如下：</P>
<P>DEVICE=eth0:0<BR>BOOTPROTO=static<BR>IPADDR=192.168.168.2<BR>NETMASK=255.255.255.0<BR>ONBOOT=yes</P>
<P><STRONG>ifcfg-eth0:1</STRONG>内容如下：</P>
<P>DEVICE=eth0:1<BR>BOOTPROTO=static<BR>IPADDR=192.168.168.3<BR>NETMASK=255.255.255.0<BR>ONBOOT=yes</P>
<P><STRONG>三多个网卡绑定成一块虚拟网卡</STRONG></P>
<P>为了提供网络的高可用性，我们可能需要将多块网卡绑定成一块虚拟网卡对外提供服务，这样即使其中的一块物理网卡出现故障，也不会导致连接中断比如我们可以将eth0和eth1绑定成虚拟网卡bond0</P>
<P>首先在/etc/sysconfig/network-scripts/下创建虚拟网卡bond0的配置文件<STRONG>ifcfg-bond0</STRONG>，内容如下</P>
<P>DEVICE=bond0<BR>BOOTPROTO=none<BR>BROADCAST=192.168.168.255<BR>IPADDR=192.168.168.1<BR>NETMASK=255.255.255.0<BR>NETWORK=192.168.168.0<BR>ONBOOT=yes<BR>TYPE=Ethernet<BR>GATEWAY=192.168.168.250<BR>USERCTL=no</P>
<P>然后分别修改eth0和eth1的配置文件<BR>ifcfg-eth0内容：</P>
<P>DEVICE=eth0<BR>BOOTPROTO=none<BR>ONBOOT=yes<BR>USERCTL=no<BR>MASTER=bond0<BR>SLAVE=yes</P>
<P>ifcfg-eth1内容</P>
<P>DEVICE=eth1<BR>BOOTPROTO=none<BR>ONBOOT=yes<BR>USERCTL=no<BR>MASTER=bond0<BR>SLAVE=yes</P>
<P>因为linux的虚拟网卡是在内核模块中实现的，所以需要安装的时候已经装好该module在<STRONG>/etc/modules.conf</STRONG>文件中添加如下内容（如果没有该文件，则新建一个）：</P>
<P>alias bond0 bonding<BR>options bond0 miimon=100 mode=1 primary=eth0</P>
<P>其中miimon=100表示每100ms检查一次链路连接状态，如果不通则会切换物理网卡<BR>mode=1表示主备模式，也就是只有一块网卡是active的，只提供失效保护如果mode=0则是负载均衡模式的，所有的网卡都是active，还有其他一些模式很少用到<BR>primary=eth0表示主备模式下eth0为默认的active网卡</P>
<P>最后，在<STRONG>/etc/rc.local</STRONG>中加入</P>
<P>modprobe bonding miimon=100 mode=1</P>
<P>重启机器后可以看到虚拟网卡已经生效，可以通过插拔两个物理网卡的网线来进行测试，不过linux中网卡接管的时间好象比较长</P></DIV>
<P>如果您喜欢我的Blog，欢迎订阅到Google | 收藏到Del.icio.us | 推荐到鲜果 </P>
<P>Posted by NinGoo 2007-11-23 11:13 星期五 </P>3 条评论
<DIV>
<P>Metalink notes:</P>
<P>We need to change the IP(public and interconnect) and VIP after bond NIC.<BR>Here is our steps, we want to change IP from 10.10.63.x to 10.10.68.x,</P>
<P>1.<BR>Configuring Linux for the Oracle 10g VIP or private interconnect using bonding driver Note:298891.1<BR>2.<BR>How to Change Interconnect/Public Interface IP Subnet in a 10g Cluster Note:283684.1</P>
<P>希望对大伙有帮助.</P></DIV>
<DIV>
<P>多谢木匠兄的分享^_^</P></DIV>
<DIV>
<P>棒！好文，讲的很清楚！Linux下的ether channel！</P></DIV>
<DIV>
<DIV><BR>名称 (Required)<BR>Mail (Required, will not be published)<BR>网址 </DIV></DIV></DIV>&65279;&65279;&65279;</DIV>&65279;&65279; <BR><BR><BR>引文来源&nbsp;&nbsp;<A href="http://www.ningoo.net/html/2007/redhat_linux_network_configuration_and_bond.html" target=_blank>Redhat Linux网卡配置与绑定</A><p>----------------------------<br/>一键转贴，快速捕捉生活精彩，赢每周好礼！<a href="http://blog.163.com/activities/hunter/hunter.do?080526jclr46" target="_blank">查看活动首页&gt;&gt;</a></p></div>]]></description>
	    <author><![CDATA[&lt;a title=&quot;1&quot;&gt;小海]]></author>
	    <comments>http://blog.163.com/yhb_4323/blog/static/2336347920085811047117</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/yhb_4323/blog/static/2336347920085811047117</guid>
    <pubDate>Sun, 8 Jun 2008 13:10:47 +0800</pubDate>
    <dcterms:modified>2008-06-08T13:10:47+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[&lt;a title=&quot;1&quot;&gt;小海关注的博友]]></title>	
    <link>http://blog.163.com/yhb_4323/friends</link>
    <description><![CDATA[<div>
			<a href="http://ai-xue-club.blog.163.com/" target="_blank"><img src="http://ava.bimg.126.net/photo/igTcDIMk3ZOQ5yfyVK6w5A==/176766285374706341.jpg" border="0" />爱雪俱乐部</a>
			<a href="http://hill415.blog.163.com/" target="_blank"><img src="http://ava.bimg.126.net/photo/KZABZ4nryYMeK5QqbsmnQg==/208291482765991699.jpg" border="0" />Joseph.吴</a>
			<a href="http://blog.163.com/kevin2_0/" target="_blank"><img src="http://ava.bimg.126.net/photo/XhN6sxPebrFOlXBnmWoP_g==/224054081462215726.jpg" border="0" />K2.0</a>
			<a href="http://owen3113.blog.163.com/" target="_blank"><img src="http://ava.bimg.126.net/photo/rDjqtMQrltOREhh1XTxz5A==/184647584722358285.jpg" border="0" />猪</a>
</div>]]></description>
    <guid isPermaLink="true">http://blog.163.com/yhb_4323/friends</guid>
    <pubDate>Tue, 1 Jan 2008 00:00:00 +0800</pubDate>
    <dcterms:modified>2008-01-01T00:00:00+08:00</dcterms:modified>
  </item>    
 </channel>
</rss>