<?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>Tue, 25 Nov 2008 19:38:58 +0800</pubDate>
	  <lastBuildDate>Tue, 25 Nov 2008 19:38:58 +0800</lastBuildDate>
	  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
	  <generator><![CDATA[NetEase Space]]></generator>
	  <managingEditor><![CDATA[yhb_4323]]></managingEditor>
	  <webMaster><![CDATA[Herbert]]></webMaster>
		  <ttl>120</ttl>
	  <image>
	  	<title><![CDATA[临界值(Critical Value)]]></title>
	  	<url>http://ava.blog.163.com/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[Herbert]]></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[Herbert]]></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[Herbert]]></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[Herbert]]></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[Herbert]]></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[Herbert]]></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[Herbert]]></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[Herbert]]></author>
	    <comments>http://blog.163.com/yhb_4323/blog/static/233634792008683138431</comments>
    <slash:comments>0</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[Herbert]]></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[Herbert]]></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[Herbert]]></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;&nb