﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-七段</title><link>http://www.blogjava.net/sevenduan/</link><description>无论怎样，请让我先感谢一下国家。</description><language>zh-cn</language><lastBuildDate>Fri, 01 May 2026 10:22:29 GMT</lastBuildDate><pubDate>Fri, 01 May 2026 10:22:29 GMT</pubDate><ttl>60</ttl><item><title>有25匹马，每匹马都以一个固定不变的速度奔跑，每匹马的速度都不一样，如果让你找出跑的最快的5匹马，最少需要组织多少场比赛？注：每场比赛最多只能5匹马参赛。</title><link>http://www.blogjava.net/sevenduan/archive/2012/03/07/371431.html</link><dc:creator>sevenduan</dc:creator><author>sevenduan</author><pubDate>Wed, 07 Mar 2012 13:17:00 GMT</pubDate><guid>http://www.blogjava.net/sevenduan/archive/2012/03/07/371431.html</guid><wfw:comment>http://www.blogjava.net/sevenduan/comments/371431.html</wfw:comment><comments>http://www.blogjava.net/sevenduan/archive/2012/03/07/371431.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/sevenduan/comments/commentRss/371431.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sevenduan/services/trackbacks/371431.html</trackback:ping><description><![CDATA[<div>有25匹马，每匹马都以一个固定不变的速度奔跑，每匹马的速度都不一样，如果让你找出跑的最快的5匹马，最少需要组织多少场比赛？注：每场比赛最多只能5匹马参赛。<br />re:悲观10场，乐观7场。</div><img src ="http://www.blogjava.net/sevenduan/aggbug/371431.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sevenduan/" target="_blank">sevenduan</a> 2012-03-07 21:17 <a href="http://www.blogjava.net/sevenduan/archive/2012/03/07/371431.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Really Useful Shortkey</title><link>http://www.blogjava.net/sevenduan/archive/2010/08/07/328218.html</link><dc:creator>sevenduan</dc:creator><author>sevenduan</author><pubDate>Sat, 07 Aug 2010 15:14:00 GMT</pubDate><guid>http://www.blogjava.net/sevenduan/archive/2010/08/07/328218.html</guid><wfw:comment>http://www.blogjava.net/sevenduan/comments/328218.html</wfw:comment><comments>http://www.blogjava.net/sevenduan/archive/2010/08/07/328218.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sevenduan/comments/commentRss/328218.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sevenduan/services/trackbacks/328218.html</trackback:ping><description><![CDATA[Eclipse:<br />
ctrl+o<br />
ctrl+space<br />
ctrl+t<br />
ctrl+k<br />
ctrl+f8/f9/f10<br />
<br />
alt+shift+x , t/j<br />
alt+shift+d , t/j<br />
<br />
Command:<br />
cd -<br />
tab<br />
ctrl+a/e<br />
ctrl+u/k/w<br />
<br />
Vim<br />
shift+g<br />
m+'mark'<br />
`+'mark'<br />
. (repeat)<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/sevenduan/aggbug/328218.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sevenduan/" target="_blank">sevenduan</a> 2010-08-07 23:14 <a href="http://www.blogjava.net/sevenduan/archive/2010/08/07/328218.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java logging framework</title><link>http://www.blogjava.net/sevenduan/archive/2010/07/18/326473.html</link><dc:creator>sevenduan</dc:creator><author>sevenduan</author><pubDate>Sun, 18 Jul 2010 14:15:00 GMT</pubDate><guid>http://www.blogjava.net/sevenduan/archive/2010/07/18/326473.html</guid><wfw:comment>http://www.blogjava.net/sevenduan/comments/326473.html</wfw:comment><comments>http://www.blogjava.net/sevenduan/archive/2010/07/18/326473.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sevenduan/comments/commentRss/326473.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sevenduan/services/trackbacks/326473.html</trackback:ping><description><![CDATA[<table class="wikitable">
    <tbody>
        <tr>
            <th>Framework</th>
            <th>Supported log levels</th>
            <th>Standard appenders</th>
            <th>Popularity</th>
            <th>Cost / licence</th>
        </tr>
        <tr>
            <th><a href="http://en.wikipedia.org/wiki/Log4J" title="Log4J" class="mw-redirect">Log4J</a></th>
            <td>FATAL ERROR WARN INFO DEBUG TRACE</td>
            <td>AsyncAppender, JDBCAppender, JMSAppender, LF5Appender,
            NTEventLogAppender, NullAppender, SMTPAppender, SocketAppender,
            SocketHubAppender, SyslogAppender, TelnetAppender, WriterAppender</td>
            <td>Widely used in many project and platforms</td>
            <td>Apache License, Version 2.0</td>
        </tr>
        <tr>
            <th><a href="http://java.sun.com/javase/6/docs/technotes/guides/logging/" class="external text" rel="nofollow">Java Logging API</a></th>
            <td>SEVERE WARNING INFO CONFIG FINE FINER FINEST</td>
            <td>Depends on the underlying framework; Sun's default Java Virtual
            Machine (JVM) has the following: ConsoleHandler, FileHandler,
            SocketHandler, MemoryHandler</td>
            <td>Not widely used<sup class="Template-Fact" title="This claim needs
            references to reliable sources from August 2009" style="white-space: nowrap;">[<em><a href="http://en.wikipedia.org/wiki/Wikipedia:Citation_needed" title="Wikipedia:Citation needed">citation needed</a></em>]</sup></td>
            <td>Comes with the JRE</td>
        </tr>
        <tr>
            <th><a href="http://commons.apache.org/logging/" class="external text" rel="nofollow">Apache Commons Logging</a></th>
            <td>FATAL ERROR WARN INFO DEBUG TRACE</td>
            <td>Depends on the underlying framework</td>
            <td>Widely used, in conjunction with log4j</td>
            <td>Apache License, Version 2.0</td>
        </tr>
        <tr>
            <th><a href="http://en.wikipedia.org/wiki/SLF4J" title="SLF4J">SLF4J</a></th>
            <td>ERROR WARN INFO DEBUG TRACE</td>
            <td>Depends on the underlying framework, which is pluggable</td>
            <td>Probably small but growing</td>
            <td><a href="http://en.wikipedia.org/wiki/MIT_License" title="MIT
            License">MIT License</a></td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/sevenduan/aggbug/326473.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sevenduan/" target="_blank">sevenduan</a> 2010-07-18 22:15 <a href="http://www.blogjava.net/sevenduan/archive/2010/07/18/326473.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java transaction summary</title><link>http://www.blogjava.net/sevenduan/archive/2010/04/25/319319.html</link><dc:creator>sevenduan</dc:creator><author>sevenduan</author><pubDate>Sun, 25 Apr 2010 08:44:00 GMT</pubDate><guid>http://www.blogjava.net/sevenduan/archive/2010/04/25/319319.html</guid><wfw:comment>http://www.blogjava.net/sevenduan/comments/319319.html</wfw:comment><comments>http://www.blogjava.net/sevenduan/archive/2010/04/25/319319.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sevenduan/comments/commentRss/319319.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sevenduan/services/trackbacks/319319.html</trackback:ping><description><![CDATA[<p>1 definition:</p>
&#8220;A transaction is a complete unit of work. It may comprise many computational tasks,which may include user interface, data retrieval, and communications. A typicaltransaction modifies shared resources.&#8221;<br />
<br />
2 transaction features:<br />
ACID (atomicity, consistency, isolation, durability) <br />
<br />
3 java spec<br />
JTA, JTS<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #008080">&nbsp;1</span><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;javax.transaction.TransactionManager<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img id="Codehighlighter1_47_396_Open_Image" onclick="this.style.display='none'; Codehighlighter1_47_396_Open_Text.style.display='none'; Codehighlighter1_47_396_Closed_Image.style.display='inline'; Codehighlighter1_47_396_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_47_396_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_47_396_Closed_Text.style.display='none'; Codehighlighter1_47_396_Open_Image.style.display='inline'; Codehighlighter1_47_396_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_47_396_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_47_396_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">abstract</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;begin();<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">abstract</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;commit();<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">abstract</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getStatus();<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">abstract</span><span style="color: #000000">&nbsp;Transaction&nbsp;getTransaction();<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;resume(Transaction&nbsp;tobj);<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">abstract</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;rollback();<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">abstract</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setRollbackOnly();<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">abstract</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setTransactionTimeout(intseconds);<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">abstract</span><span style="color: #000000">&nbsp;Transaction&nbsp;suspend()&nbsp;;<br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span></div>
<br />
4&nbsp;Common XAResource<br />
JDBC 2.0: <br />
A JDBC driver that supports distributed transactions implements the javax.transaction.xa.XAResource interface, the javax.sql.XAConnectioninterface, and the&nbsp; javax.sql.XADataSource interface.<br />
<br />
JMS 1.0:
<p>a JMS provider javax.transaction.xa.XAResource interface, the implements the javax.jms.XAConnection and the javax.jms.XASession interface.<br />
<br />
5 Common TransactionManager</p>
<p>5.1 EJB Transaction Options:<br />
NotSupported<br />
&nbsp;&nbsp;&nbsp; If the method is called within a transaction, this transaction is suspended during the time of the method execution.<br />
Required<br />
&nbsp;&nbsp;&nbsp; If the method is called within a transaction, the method is executed in the scope of this transaction; otherwise, a new transaction is started for the execution of the method and committed before the method result is sent to the caller.<br />
RequiresNew<br />
&nbsp;&nbsp;&nbsp; The method will always be executed within the scope of a new transaction. The new transaction is started for the execution of the method, and committed before the method result is sent to the caller. If the method is called within a transaction, this transaction is suspended before the new one is started and resumed when the new transaction has completed.<br />
Mandatory<br />
&nbsp;&nbsp;&nbsp; The method should always be called within the scope of a transaction, else the container will throw the TransactionRequired exception.<br />
Supports<br />
&nbsp;&nbsp;&nbsp; The method is invoked within the caller transaction scope; if the caller does not have an associated transaction, the method is invoked without a transaction scope.<br />
Never<br />
&nbsp;&nbsp;&nbsp; The client is required to call the bean without any transaction context; if it is not the case, a java.rmi.RemoteException is thrown by the container.</p>
<p>5.2 Spring transaction:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Transaction isolation: The degree of isolation this transaction has from the work of other transactions. For example, can this transaction see uncommitted writes from other transactions? avaliable options:<br />
ISOLATION_DEFAULT<br />
ISOLATION_READ_UNCOMMITTED<br />
ISOLATION_READ_COMMITTED<br />
ISOLATION_REPEATABLE_READ<br />
ISOLATION_SERIALIZABLE</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Transaction propagation: Normally all code executed within a transaction scope will run in that transaction. However, there are several options specifying behavior if a transactional method is executed when a transaction context already exists: For example, simply running in the existing transaction (the most common case); or suspending the existing transaction and creating a new transaction. Spring offers the transaction propagation options familiar from EJB CMT. avaliable options:<br />
PROPAGATION_MANDATORY<br />
PROPAGATION_NESTED<br />
PROPAGATION_NEVER<br />
PROPAGATION_NOT_SUPPORTED<br />
PROPAGATION_REQUIRED<br />
PROPAGATION_REQUIRES_NEW<br />
PROPAGATION_SUPPORTS</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Transaction timeout: How long this transaction may run before timing out (automatically being rolled back by the underlying transaction infrastructure).<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Read-only status: A read-only transaction does not modify any data. Read-only transactions can be a useful optimization in some cases (such as when using Hibernate).</p>
<p><br />
6 transaction for web service<br />
Protocol specifications:<br />
WS-Transaction<br />
OASIS Business Transaction Protocol (BTP)<br />
Java API<br />
JAXTX (JSR-156)</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/sevenduan/aggbug/319319.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sevenduan/" target="_blank">sevenduan</a> 2010-04-25 16:44 <a href="http://www.blogjava.net/sevenduan/archive/2010/04/25/319319.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java nest class and java inner class</title><link>http://www.blogjava.net/sevenduan/archive/2010/04/17/318623.html</link><dc:creator>sevenduan</dc:creator><author>sevenduan</author><pubDate>Sat, 17 Apr 2010 15:07:00 GMT</pubDate><guid>http://www.blogjava.net/sevenduan/archive/2010/04/17/318623.html</guid><wfw:comment>http://www.blogjava.net/sevenduan/comments/318623.html</wfw:comment><comments>http://www.blogjava.net/sevenduan/archive/2010/04/17/318623.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/sevenduan/comments/commentRss/318623.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sevenduan/services/trackbacks/318623.html</trackback:ping><description><![CDATA[JavaScript里有两个容易让初学者混淆的概念：scope chain and closure。<br />
比如说，我想创建10个函数，每个函数依次返回0-9.<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">wrong:&nbsp;all&nbsp;function&nbsp;refer&nbsp;to&nbsp;global&nbsp;variable&nbsp;i=10&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;fn_list</span><span style="color: #000000;">=</span><span style="color: #000000;">[];<br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">10</span><span style="color: #000000;">;i</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;_tempFn&nbsp;</span><span style="color: #000000;">=</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(){<br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;i;<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;fn_list.push(_tempFn);&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">}<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">right:&nbsp;every&nbsp;function&nbsp;refer&nbsp;to&nbsp;its&nbsp;closure&nbsp;scope&nbsp;variable&nbsp;a</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;fn_list</span><span style="color: #000000;">=</span><span style="color: #000000;">[];<br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">10</span><span style="color: #000000;">;i</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;_tempFn&nbsp;</span><span style="color: #000000;">=</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(a){<br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(){<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;a;<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;}<br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;fn_list.push(_tempFn(i));&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">}<br />
</span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;"> <br />
</span></div>
<br />
Java里也有两个让初学者容易混淆的概念：nest class and inner class。<br />
nest class就是static inner class,<br />
而inner class就是no-static inner class。没有为什么，sun就是这么定义的。<br />
还是上面得例子，创建10个对象，每个对象的getValue接口依次返回0-9.<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">public&nbsp;class&nbsp;Test&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;noStaticValue;<br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;staticValue;<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Test(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;noSV,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;sv)&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.noStaticValue&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;noSV;<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.staticValue&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sv;<br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Test(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;noSV)&nbsp;{<br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.noStaticValue&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;noSV;<br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;interface&nbsp;valueHolder&nbsp;{<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;getValue();<br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;innerClass&nbsp;implements&nbsp;valueHolder&nbsp;{<br />
</span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;getValue()&nbsp;{<br />
</span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;noStaticValue;<br />
</span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;class&nbsp;nestClass&nbsp;implements&nbsp;valueHolder&nbsp;{<br />
</span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;nestClass(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i)&nbsp;{<br />
</span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;staticValue&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;i;<br />
</span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;getValue()&nbsp;{<br />
</span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;staticValue;<br />
</span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
</span><span style="color: #008080;">35</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Test&nbsp;context1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Test(</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">36</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;valueHolder[]&nbsp;list&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;valueHolder[</span><span style="color: #000000;">10</span><span style="color: #000000;">];<br />
</span><span style="color: #008080;">37</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
</span><span style="color: #008080;">38</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Test.nestClass(i);<br />
</span><span style="color: #008080;">39</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">40</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(valueHolder&nbsp;obj&nbsp;:&nbsp;list)&nbsp;{<br />
</span><span style="color: #008080;">41</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(obj.getValue());// always print 9<br />
</span><span style="color: #008080;">42</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">43</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
</span><span style="color: #008080;">44</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Test(i).</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;innerClass();<br />
</span><span style="color: #008080;">45</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">46</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(valueHolder&nbsp;obj&nbsp;:&nbsp;list)&nbsp;{<br />
</span><span style="color: #008080;">47</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(obj.getValue());// print 0-9<br />
</span><span style="color: #008080;">48</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">49</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">50</span>&nbsp;<span style="color: #000000;">}</span></div>
可见用inner class可以模拟closure的特性，就是运行时定义class的某些状态。<br />
inner class和nest class之间的区别就是后者是静态类。前者必须通过wrap class的实例来调用new,e.g. new Test().new innerClass。<br />
因为nest class是静态类，所以可以添加static member 或者static method,而inner class 不行。<br />
匿名内部类是inner class的一种特殊形式，所以也不能添加static member 或者static method。<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/sevenduan/aggbug/318623.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sevenduan/" target="_blank">sevenduan</a> 2010-04-17 23:07 <a href="http://www.blogjava.net/sevenduan/archive/2010/04/17/318623.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>String与byte转化要小心失真</title><link>http://www.blogjava.net/sevenduan/archive/2010/04/14/318378.html</link><dc:creator>sevenduan</dc:creator><author>sevenduan</author><pubDate>Wed, 14 Apr 2010 15:14:00 GMT</pubDate><guid>http://www.blogjava.net/sevenduan/archive/2010/04/14/318378.html</guid><wfw:comment>http://www.blogjava.net/sevenduan/comments/318378.html</wfw:comment><comments>http://www.blogjava.net/sevenduan/archive/2010/04/14/318378.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sevenduan/comments/commentRss/318378.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sevenduan/services/trackbacks/318378.html</trackback:ping><description><![CDATA[先看一段代码：<br />
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">byte</span><span style="color: rgb(0, 0, 0);">&nbsp;[]&nbsp;b&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">byte</span><span style="color: rgb(0, 0, 0);">[]{</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Arrays.toString(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;String(b).getBytes()));</span></div>
<br />
输出：<br />
[1, -17, -65, -67, 2, -17, -65, -67]<br />
解释：<br />
byte decode to String,String encode to byte 默认用UTF-8 charset.<br />
decode遇到不支持的字符 输出 char � , encode � 就是 -17, -65, -67.<br />
实现细节可见ByteToCharUTF8.java<br />
<br />
解决办法： 使用 ISO8859_1 charset。<br />
<br />
教训： 注意charset的范围。<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/sevenduan/aggbug/318378.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sevenduan/" target="_blank">sevenduan</a> 2010-04-14 23:14 <a href="http://www.blogjava.net/sevenduan/archive/2010/04/14/318378.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 位运算</title><link>http://www.blogjava.net/sevenduan/archive/2010/04/13/318160.html</link><dc:creator>sevenduan</dc:creator><author>sevenduan</author><pubDate>Tue, 13 Apr 2010 06:39:00 GMT</pubDate><guid>http://www.blogjava.net/sevenduan/archive/2010/04/13/318160.html</guid><wfw:comment>http://www.blogjava.net/sevenduan/comments/318160.html</wfw:comment><comments>http://www.blogjava.net/sevenduan/archive/2010/04/13/318160.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sevenduan/comments/commentRss/318160.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sevenduan/services/trackbacks/318160.html</trackback:ping><description><![CDATA[java bitwise operator:<br />
~ The unary bitwise complement operator "<code>~</code>" inverts a bit
pattern.<br />
&lt;&lt;The signed left shift<br />
&gt;&gt;The signed right shift<br />
&gt;&gt;&gt;the unsigned right shift<br />
<p>
&amp; The bitwise <code>&amp;</code> operator performs a bitwise AND
operation.
</p>
<p>
^ The bitwise <code>^</code> operator performs a bitwise exclusive OR
operation.
</p>
<p>
| The bitwise <code>|</code> operator performs a bitwise inclusive OR
operation.
</p>
<br />
<br />
Usage:<br />
1, <br />
<ul>
    <li><code>^</code> can swap two variables without using an intermediate,
    temporary variable which is useful if you are short on available RAM or
    want that sliver of extra speed.
    <p>Usually, when <strong>not using</strong> <code>^</code>, you will do:</p>
    <pre>temp = a;<br />
    <br />
    a = b;<br />
    <br />
    b = temp;</pre>
    <p><strong>Using</strong> <code>^</code>, no "temp" is needed:</p>
    <pre>a ^= b;<br />
    <br />
    b ^= a;<br />
    <br />
    a ^= b;</pre>
    <p>This will swap "a" and "b" integers.  <span class="hlt">Both must be
    integers.</span>
    </p>
    </li>
</ul>
2,<br />
an example of using an integer to maintain state flags (common
usage):
<pre class="prettyprint"><code><span class="com">// These are my masks</span><span class="pln"><br />
<br />
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">final</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> MASK_DID_HOMEWORK &nbsp;</span><span class="pun">=</span><span class="pln"> </span><span class="lit">0x0001</span><span class="pun">;</span><span class="pln"><br />
<br />
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">final</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> MASK_ATE_DINNER &nbsp; &nbsp;</span><span class="pun">=</span><span class="pln"> </span><span class="lit">0x0002</span><span class="pun">;</span><span class="pln"><br />
<br />
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">final</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> MASK_SLEPT_WELL &nbsp; &nbsp;</span><span class="pun">=</span><span class="pln"> </span><span class="lit">0x0004</span><span class="pun">;</span><span class="pln"> <br />
<br />
<br />
<br />
</span><span class="com">// This is my current state</span><span class="pln"><br />
<br />
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> m_nCurState</span><span class="pun">;</span><span class="pln"><br />
<br />
</span></code></pre>
<p>To <strong><em>set</em></strong> my state, I use the bitwise OR
operator:</p>
<pre class="prettyprint"><code><span class="com">// Set state for'ate dinner' and 'slept well' to 'on'</span><span class="pln"><br />
<br />
m_nCurState </span><span class="pun">=</span><span class="pln"> m_nCurState </span><span class="pun">|</span><span class="pln"> </span><span class="pun">(</span><span class="pln">MASK_ATE_DINNER </span><span class="pun">|</span><span class="pln"> MASK_SLEPT_WELL</span><span class="pun">);</span><span class="pln"><br />
<br />
</span></code></pre>
<p>Notice how I 'or' my current state in with the states that I want to
turn 'on'.  Who knows what my current state is and I don't want to blow
it away.  </p>
<p>To <strong><em>unset</em></strong> my state, I use the bitwise AND
operator with the complement operator:</p>
<pre class="prettyprint"><code><span class="com">// Turn off the 'ate dinner' flag</span><span class="pln"><br />
<br />
m_nCurState </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">m_nCurState </span><span class="pun">&amp;</span><span class="pln"> </span><span class="pun">~</span><span class="pln">MASK_ATE_DINNER</span><span class="pun">);</span><span class="pln"><br />
<br />
</span></code></pre>
<p>To <strong><em>check</em></strong> my current state, I use the AND
operator:</p>
<pre class="prettyprint"><code><span class="com">// Check if I did my homework</span><span class="pln"><br />
<br />
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="lit">0</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">m_nCurState </span><span class="pun">&amp;</span><span class="pln"> MASK_DID_HOMEWORK</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
<br />
&nbsp; &nbsp; </span><span class="com">// yep</span><span class="pln"><br />
<br />
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> <br />
<br />
&nbsp; &nbsp; </span><span class="com">// nope...</span><span class="pln"><br />
<br />
</span><span class="pun">}</span><span class="pln"><br />
<br />
</span></code></pre>
<p>Why do I think this is interesting?  Say I'm designing an interface
that sets my state.  I could write a method that accepts three booleans:</p>
<pre class="prettyprint"><code><span class="kwd">void</span><span class="pln"> setState</span><span class="pun">(</span><span class="pln"> </span><span class="kwd">boolean</span><span class="pln"> bDidHomework</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">boolean</span><span class="pln"> bAteDinner</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">boolean</span><span class="pln"> bSleptWell</span><span class="pun">);</span><span class="pln"><br />
<br />
</span></code></pre>
<p>Or, I could use a single number to represent all three states and
pass a single value:</p>
<pre class="prettyprint"><code><span class="kwd">void</span><span class="pln"> setState</span><span class="pun">(</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> nStateBits</span><span class="pun">);</span><span class="pln"><br />
<br />
</span></code></pre>
<p>If you choose the second pattern you'll be very happy when decide to
add another state - you won't have to break existing impls of your
interface.</p>
<br />
<img src ="http://www.blogjava.net/sevenduan/aggbug/318160.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sevenduan/" target="_blank">sevenduan</a> 2010-04-13 14:39 <a href="http://www.blogjava.net/sevenduan/archive/2010/04/13/318160.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么才是激励你工作的动力？</title><link>http://www.blogjava.net/sevenduan/archive/2010/04/05/317515.html</link><dc:creator>sevenduan</dc:creator><author>sevenduan</author><pubDate>Mon, 05 Apr 2010 15:43:00 GMT</pubDate><guid>http://www.blogjava.net/sevenduan/archive/2010/04/05/317515.html</guid><wfw:comment>http://www.blogjava.net/sevenduan/comments/317515.html</wfw:comment><comments>http://www.blogjava.net/sevenduan/archive/2010/04/05/317515.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sevenduan/comments/commentRss/317515.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sevenduan/services/trackbacks/317515.html</trackback:ping><description><![CDATA[什么才是激励你工作的动力？<br />
这个问题问自己的往往很少。经常思考这些问题的往往是管理者。当管理者想进行一些管理工作的时候，管理本身就成了最大的问题。所以，一个项目的成败往往在很大程度上取决于受到管理层的负面影响的大小。<br />
大多数人和大多数管理者有着共同的认识，钱才是激励我们工作的动力。理由很充分，盈利是企业的唯一目标，说起来就好像人活着就是为了吃饭一样。所以，各种绩效考核与薪酬挂钩了，各种项目奖、季度奖、年终奖诞生了。为了响应上级政策，我们开始加班加点了，开始赶进度赶业绩了。试想，在这种驱动下，如果手头的事情没有和奖金挂钩，你还有动力继续么？<br />
结果唯一导向对于重复性的体力劳动来说是有效的。但是对于脑力劳动者来说，自发、专精和目标性才是内在的能够持续激励我们工作的动力所在。<br />
自发：<br />
对于脑力劳动，命令式的分配任务很难奏效，很显然，你不能强迫别人的想法。就像强迫学生学习一样。只有自发的工作，才能培养兴趣激发工作热情。正如敏捷实践里强调任务应该由个人自发选择领取一样。<br />
专精：<br />
在自发的前提下，无论我们做什么事情，我们总是希望自己可以做得更好。这就是专精。对专精的向往表现为对工作的痴迷。要想更为专精，必须不断的练习实践和分析思考。<br />
目标性：<br />
自发和专精也许能在中短期维持动力，但是长期下去，当我们不知道自己为什么工作的时候，动力也会衰竭。目标性要求目标不能太低而没有成就感，或者太高而很难达到。最好的目标是比你现在的成就更高，且需要一定的努力才能达到。<br />
<a title="Drive: The Surprising Truth About What Motivates Us" href="http://www.amazon.com/gp/product/1594488843?ie=UTF8&amp;tag=bruceeckel&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=1594488843">Drive: The Surprising Truth About What Motivates Us</a><br />
<br />
<br />
<img src ="http://www.blogjava.net/sevenduan/aggbug/317515.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sevenduan/" target="_blank">sevenduan</a> 2010-04-05 23:43 <a href="http://www.blogjava.net/sevenduan/archive/2010/04/05/317515.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Gmail tasks来做个人SCRUM管理</title><link>http://www.blogjava.net/sevenduan/archive/2010/04/01/317109.html</link><dc:creator>sevenduan</dc:creator><author>sevenduan</author><pubDate>Wed, 31 Mar 2010 16:54:00 GMT</pubDate><guid>http://www.blogjava.net/sevenduan/archive/2010/04/01/317109.html</guid><wfw:comment>http://www.blogjava.net/sevenduan/comments/317109.html</wfw:comment><comments>http://www.blogjava.net/sevenduan/archive/2010/04/01/317109.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sevenduan/comments/commentRss/317109.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sevenduan/services/trackbacks/317109.html</trackback:ping><description><![CDATA[简便个人项目管理：<br />
1，一周一个iteration，一个iteration共计30个man hours：<br />
只要可以小迭代总是更好。<br />
story point优势在于消除个体差异，个人项目man hour更准确直接。<br />
2, 每周日做iteration plan,计划下周任务，用gmail tasks来做story wall。<br />
3，每周五晚做retrospective，总结一周工作，直接用gmail来保存回顾总结。<br />
<br />
<img src ="http://www.blogjava.net/sevenduan/aggbug/317109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sevenduan/" target="_blank">sevenduan</a> 2010-04-01 00:54 <a href="http://www.blogjava.net/sevenduan/archive/2010/04/01/317109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBossCache in JBoss Cluster</title><link>http://www.blogjava.net/sevenduan/archive/2010/03/28/clustercache.html</link><dc:creator>sevenduan</dc:creator><author>sevenduan</author><pubDate>Sun, 28 Mar 2010 15:10:00 GMT</pubDate><guid>http://www.blogjava.net/sevenduan/archive/2010/03/28/clustercache.html</guid><wfw:comment>http://www.blogjava.net/sevenduan/comments/316774.html</wfw:comment><comments>http://www.blogjava.net/sevenduan/archive/2010/03/28/clustercache.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sevenduan/comments/commentRss/316774.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sevenduan/services/trackbacks/316774.html</trackback:ping><description><![CDATA[Ref: http://community.jboss.org/wiki/JBossCacheOfficialDocumentation<br />
<br />
Cache的目的是为了以空间换时间，一次计算结果为多次重用。<br />
空间可以是实时内存空间、持久化的硬盘空间。时间可以是运算时间、连接时间、传输时间等。<br />
<br />
Cache可以分为LocalCache和DistributedCache。<br />
最简单的LocalCache可以通过维护一个ConcurrentHashMap实现。<br />
缺点是：<br />
1，内存有限，容易out of memory （定期清除？持久化？）<br />
2, 需要对全map做concurrency维护，粗粒度的锁定争用会影响性能（树结构维护？）<br />
<br />
在一个专业的企业级应用中，cache除了高性能和线程安全的要求，还要支持事务、高可用性、持久化、容错、集群同步等。<br />
JBossCache是一个典型的企业级cache实现，他采用树结构且支持集群和事务特性。<br />
虽然JBossCache这把牛刀也可以在standalone的JS2E应用中用来杀鸡，但我们应该更关心用他在集群环境中怎么杀牛。<br />
JBossCache分为非集群模式(Local)和集群模式。<br />
集群模式根据实现策略又分为replication和invalidation。<br />
1 replication：通过拷贝改变的cache对象来保证与集群中其他cache同步。replication又可细分为同步replication和异步repliation两种，异步replication较快,put以后马上返回，但是replication出错了，事务还是算完成了不回回滚。同步replication要花时间等待其他的cache完成replication的通知才能结束。<br />
<br />
2 invalidation: 如果cache状态改变，仅仅是给其他cache发个通知，收到通知的cache把脏数据清除掉。invalidation也可分为同步和异步两种，区别是发送通知的广播方式一个是同步一个是异步。<br />
<br />
在jboss cluster中，我们最好通过MBean来部署jboss cache。这样又几个好处：<br />
1，JBoss NS支持Cluster<br />
我们就可以通过JBoss NamingService来访问cache。如果在local NS中查不到cache，jbss NS还会去查cluster中其他的cache。<br />
2，利用MBean的特性<br />
通过CacheMBean, 我们可以方便的管理Cache Service，实时的启动、停止或者改变一些配置，还可以监控到一些cache统计数据。<br />
3，利用<a id="d0e1230">microcontainer的特性<br />
</a><a id="d0e1230"><code class="literal">我们可以通过配置XML文件来完成cache相关的所有对象声明。</code></a><a id="d0e1230">简而言之，就是利用java reflection和AOP的技术就不用写声明cache的代码了。<br />
<br />
</a>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
<br />
<br />
<br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">deployment&nbsp;</span><span style="color: #ff0000;">xmlns</span><span style="color: #0000ff;">="urn:jboss:bean-deployer:2.0"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;First&nbsp;we&nbsp;create&nbsp;a&nbsp;Configuration&nbsp;object&nbsp;for&nbsp;the&nbsp;cache&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="ExampleCacheConfig"</span><span style="color: #ff0000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff;">="org.jboss.cache.config.Configuration"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;build&nbsp;up&nbsp;the&nbsp;Configuration<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;Factory&nbsp;to&nbsp;build&nbsp;the&nbsp;Cache.&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="DefaultCacheFactory"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="org.jboss.cache.DefaultCacheFactory"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">constructor&nbsp;</span><span style="color: #ff0000;">factoryClass</span><span style="color: #0000ff;">="org.jboss.cache.DefaultCacheFactory"</span><span style="color: #ff0000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;factoryMethod</span><span style="color: #0000ff;">="getInstance"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;The&nbsp;cache&nbsp;itself&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="ExampleCache"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="org.jboss.cache.CacheImpl"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">constructor&nbsp;</span><span style="color: #ff0000;">factoryMethod</span><span style="color: #0000ff;">="createnewInstance"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">factory&nbsp;</span><span style="color: #ff0000;">bean</span><span style="color: #0000ff;">="DefaultCacheFactory"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">parameter</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">inject&nbsp;</span><span style="color: #ff0000;">bean</span><span style="color: #0000ff;">="ExampleCacheConfig"</span><span style="color: #0000ff;">/&gt;&lt;/</span><span style="color: #800000;">parameter</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">parameter</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">false</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">parameter</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">constructor</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;JMX&nbsp;Management&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="ExampleCacheJmxWrapper"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="org.jboss.cache.jmx.CacheJmxWrapper"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">annotation</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">@org.jboss.aop.microcontainer.aspects.jmx.JMX(name="jboss.cache:service=ExampleTreeCache",&nbsp;<br />
<br />
&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;exposedInterface=org.jboss.cache.jmx.CacheJmxWrapperMBean.class,&nbsp;<br />
<br />
&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;registerDirectly=true)</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">annotation</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">constructor</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">parameter</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">inject&nbsp;</span><span style="color: #ff0000;">bean</span><span style="color: #0000ff;">="ExampleCache"</span><span style="color: #0000ff;">/&gt;&lt;/</span><span style="color: #800000;">parameter</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">constructor</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
<br />
<br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">deployment</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp; <br />
</span></div>
<br />
后记：<br />
1，jboss cache的naga版中，采用<a href="http://en.wikipedia.org/wiki/Multiversion_concurrency_control">Multi-versioned
concurrency control</a>来实现并发。下次再从中总结一下多线程的学习。<br />
2，jboss cache通过结合visitor pattern和command pattern，把对cache node的操作与访问从中隔离出来，不用改变或者扩展node对象就可以添加新的node行为。也就是开闭原则。下次再从中总结一下几种设计模式的经典应用。<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/sevenduan/aggbug/316774.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sevenduan/" target="_blank">sevenduan</a> 2010-03-28 23:10 <a href="http://www.blogjava.net/sevenduan/archive/2010/03/28/clustercache.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>