﻿<?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/leeguannan/category/28574.html</link><description>5年开发工程师，2年实施经理，X年售前顾问，......</description><language>zh-cn</language><lastBuildDate>Wed, 09 Jan 2013 11:39:30 GMT</lastBuildDate><pubDate>Wed, 09 Jan 2013 11:39:30 GMT</pubDate><ttl>60</ttl><item><title>Could not instantiate class XXX from tuple at AliasToBeanConstructorResultTransformer 的处理办法</title><link>http://www.blogjava.net/leeguannan/archive/2013/01/09/394009.html</link><dc:creator>阿南</dc:creator><author>阿南</author><pubDate>Wed, 09 Jan 2013 02:57:00 GMT</pubDate><guid>http://www.blogjava.net/leeguannan/archive/2013/01/09/394009.html</guid><wfw:comment>http://www.blogjava.net/leeguannan/comments/394009.html</wfw:comment><comments>http://www.blogjava.net/leeguannan/archive/2013/01/09/394009.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leeguannan/comments/commentRss/394009.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leeguannan/services/trackbacks/394009.html</trackback:ping><description><![CDATA[今天客户方服务器上突然有一个功能保存了，查看日志信息后发现，错误信息：<br /><div>Could not instantiate class XXX from tuple at AliasToBeanConstructorResultTransformer...<br /><br />Google了很久才发现有可能是HQL语句中别名的问题，具体原因未知，现在处理办法是，将下面的语句中的别名去掉：<br /><br /><div>StringBuffer hql = new StringBuffer("select new ContractItem(l, "</div><div><span style="white-space:pre">				</span>+ " pi.unitPrice, " + " pi.currencyType, " + "pi.currencyTypeDisplay," + " pi.units, "</div><div><span style="white-space:pre">				</span>+ " sum(pi.quantity + pi.adjQuantity), " + " pp, " + " pi.task) "</div><div><span style="white-space:pre">				</span>+ " from PurchasePlanItem pi " + " join pi.purchasePlan pp"</div><div><span style="white-space:pre">				</span>+ " join pi.priorList l " + " where l.supplierNo = ? &nbsp;"</div><div><span style="white-space:pre">				</span>+ " and pp.id in (");<br />具体是否可以解决，还要看一会儿的部署情况。</div></div><img src ="http://www.blogjava.net/leeguannan/aggbug/394009.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leeguannan/" target="_blank">阿南</a> 2013-01-09 10:57 <a href="http://www.blogjava.net/leeguannan/archive/2013/01/09/394009.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>谁不知道构架？</title><link>http://www.blogjava.net/leeguannan/archive/2009/07/03/285372.html</link><dc:creator>阿南</dc:creator><author>阿南</author><pubDate>Fri, 03 Jul 2009 08:33:00 GMT</pubDate><guid>http://www.blogjava.net/leeguannan/archive/2009/07/03/285372.html</guid><wfw:comment>http://www.blogjava.net/leeguannan/comments/285372.html</wfw:comment><comments>http://www.blogjava.net/leeguannan/archive/2009/07/03/285372.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/leeguannan/comments/commentRss/285372.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leeguannan/services/trackbacks/285372.html</trackback:ping><description><![CDATA[<p>&#160;&#160;&#160; 作为一个技术人员，谁不知道构架？</p>  <p>&#160;&#160;&#160; 前一段时间公司找开发人员谈心，有位领导问一位开发人员，大致对话如下：</p>  <p>&#160;&#160;&#160; A：“你了解咱们现在产品的构架吗？能不能谈谈你对构架的看法？”</p>  <p>&#160;&#160;&#160; B：“… …”</p>  <p>&#160;&#160;&#160; A：“说说看吧~”</p>  <p>&#160;&#160;&#160; B：“我不懂构架！构架是什么？咱们现在的产品还有构架呢？”</p>  <p>&#160;&#160;&#160; 作为一个有3年工作经验，2家公司经历的VC程序员来说，我觉得，这几年的积累是白做了！这样的思想永远都只能停留在写程序上~</p>  <p>&#160;&#160;&#160; 一个产品没有构件，就如同一个人没有灵魂一样！他不是没有，只是你没有去思考，没有去发现他而已！</p>  <p>&#160;&#160;&#160; 我记得袁洪刚说过，“一个伟大的产品背后一定有一个伟大构架师！”，我坚信这一点~产品好坏一方面决定于对现实问题的解决程度，另一方面是构架的好坏！</p>  <p>&#160;&#160;&#160; 几年前，中国的软件公司里面很少出现构架师/架构师这样的角色，这几年开始有改观了，越来越多的人开始认识到很多错误的问题，其实从一开始就是错的。很多事情并没有谋定而后动。一味的追求简单，到最后变成了下线很简单了！</p>  <p>&#160;&#160; 说自己不知道构架的开发人员有两种，新手和没有思想的新手，拼命的同时我们也应该停下脚步想想，抬起头看看天空。别总把经验的缺失都归结于时间的长短，更应该想想自己是否真的积累过。</p><img src ="http://www.blogjava.net/leeguannan/aggbug/285372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leeguannan/" target="_blank">阿南</a> 2009-07-03 16:33 <a href="http://www.blogjava.net/leeguannan/archive/2009/07/03/285372.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB3下无状态会话Bean发布为WebService</title><link>http://www.blogjava.net/leeguannan/archive/2009/07/02/285163.html</link><dc:creator>阿南</dc:creator><author>阿南</author><pubDate>Thu, 02 Jul 2009 05:54:00 GMT</pubDate><guid>http://www.blogjava.net/leeguannan/archive/2009/07/02/285163.html</guid><wfw:comment>http://www.blogjava.net/leeguannan/comments/285163.html</wfw:comment><comments>http://www.blogjava.net/leeguannan/archive/2009/07/02/285163.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leeguannan/comments/commentRss/285163.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leeguannan/services/trackbacks/285163.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; 无状态会话Bean发布为WebService是非常有意义的，因为如果我们将每一个EJB模块按照SOA的思想做成一个一个独立的服务模块（这里不讨论SCA，我认为Apache的SCA框架还不够强大，文档还不够全面），同样的代码在JavaEE体系之内的应用程序可以直接使用EJB3直接访问，JavaEE体系之外的应用程序可以直接使用WebService访问，这一点是非常有意义的。</p>
<p>&nbsp;&nbsp;&nbsp; 下面要考虑的就是如何只写一份代码，让它能做两样事情。</p>
<p>&nbsp;&nbsp;&nbsp; 网上有大量的使用EJB3发布WebService的教程，但是这些教程都是一个人写的，基本上没有太大的参考价值。最重要的是，他写的元注释都是写在实现类上的，接口上没有做任何描述。这种做法有两个问题，第一如果你的会话Bean使用了EM，那么麻烦了，JAXB在做绑定的时候不认识接口；第二WSDL文件的描述实际上应该是基于接口的描述，应该和实现类没有太大的关系。</p>
<p>&nbsp;&nbsp;&nbsp; 看看网上流行的代码：</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">@WebService(name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">PurchaseArrival</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;serviceName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">PurchaseArrivalService</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />@SOAPBinding(style&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;SOAPBinding.Style.RPC)&nbsp;<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img id="Codehighlighter1_185_186_Open_Image" onclick="this.style.display='none'; Codehighlighter1_185_186_Open_Text.style.display='none'; Codehighlighter1_185_186_Closed_Image.style.display='inline'; Codehighlighter1_185_186_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_185_186_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_185_186_Closed_Text.style.display='none'; Codehighlighter1_185_186_Open_Image.style.display='inline'; Codehighlighter1_185_186_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;PurchaseArrivalImpl&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;IPurchaseArrival&nbsp;</span><span id="Codehighlighter1_185_186_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_185_186_Open_Text"><span style="color: #000000">{</span></div>
<p></span>&nbsp;</p>
<p>注意，基于RPC绑定模式下List，Set一类的接口都是不可传输的，这点会很麻烦，要用必须用实现类。</p>
<p>看看我的代码：</p>
<p>接口：</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">@WebService(name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">ILogRemoteService</span><span style="color: #000000">"</span><span style="color: #000000">,targetNamespace&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">http://www.glnpu.com/dmp/xml</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />@SOAPBinding(style&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;SOAPBinding.Style.DOCUMENT)&nbsp;<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img id="Codehighlighter1_176_177_Open_Image" onclick="this.style.display='none'; Codehighlighter1_176_177_Open_Text.style.display='none'; Codehighlighter1_176_177_Closed_Image.style.display='inline'; Codehighlighter1_176_177_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_176_177_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_176_177_Closed_Text.style.display='none'; Codehighlighter1_176_177_Open_Image.style.display='inline'; Codehighlighter1_176_177_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;&nbsp;ILogRemoteService&nbsp;</span><span id="Codehighlighter1_176_177_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_176_177_Open_Text"><span style="color: #000000">{</span></div>
<p></span>&nbsp;</p>
<p>实现类：</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">@Stateless&nbsp;<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />@Remote(ILogRemoteService.</span><span style="color: #0000ff">class</span><span style="color: #000000">)&nbsp;<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />@WebService(endpointInterface&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">com.glnpu.dmp.server.service.base.log.ILogRemoteService</span><span style="color: #000000">"</span><span style="color: #000000">,serviceName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">LogRemoteService</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;<br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img id="Codehighlighter1_250_251_Open_Image" onclick="this.style.display='none'; Codehighlighter1_250_251_Open_Text.style.display='none'; Codehighlighter1_250_251_Closed_Image.style.display='inline'; Codehighlighter1_250_251_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_250_251_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_250_251_Closed_Text.style.display='none'; Codehighlighter1_250_251_Open_Image.style.display='inline'; Codehighlighter1_250_251_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;LogRemoteService&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;BaseService&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;ILogRemoteService&nbsp;</span><span id="Codehighlighter1_250_251_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_250_251_Open_Text"><span style="color: #000000">{</span></div>
<p></span>&nbsp;</p>
<p>这个WebService是针对接口发布出去，而且使用的DOCUMENT样式，可以直接使用List、Set的接口。</p>
<p>这个WebService生成的WSDL文件很有意思：</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">definitions&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="LogRemoteService"</span><span style="color: #ff0000">&nbsp;targetNamespace</span><span style="color: #0000ff">="http://impl.log.base.service.server.dmp.glnpu.com/"</span><span style="color: #ff0000">&nbsp;xmlns</span><span style="color: #0000ff">="http://schemas.xmlsoap.org/wsdl/"</span><span style="color: #ff0000">&nbsp;xmlns:ns1</span><span style="color: #0000ff">="http://www.glnpu.com/dmp/xml"</span><span style="color: #ff0000">&nbsp;xmlns:soap</span><span style="color: #0000ff">="http://schemas.xmlsoap.org/wsdl/soap/"</span><span style="color: #ff0000">&nbsp;xmlns:tns</span><span style="color: #0000ff">="http://impl.log.base.service.server.dmp.glnpu.com/"</span><span style="color: #ff0000">&nbsp;xmlns:xsd</span><span style="color: #0000ff">="http://www.w3.org/2001/XMLSchema"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">import&nbsp;</span><span style="color: #ff0000">location</span><span style="color: #0000ff">="http://127.0.0.1:8080/LogRemoteServiceService/LogRemoteService?wsdl&amp;resource=ILogRemoteService_PortType25057.wsdl"</span><span style="color: #ff0000">&nbsp;namespace</span><span style="color: #0000ff">="http://www.glnpu.com/dmp/xml"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />-&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">service&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="LogRemoteService"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />-&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">port&nbsp;</span><span style="color: #ff0000">binding</span><span style="color: #0000ff">="ns1:ILogRemoteServiceBinding"</span><span style="color: #ff0000">&nbsp;name</span><span style="color: #0000ff">="LogRemoteServicePort"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">soap:address&nbsp;</span><span style="color: #ff0000">location</span><span style="color: #0000ff">="http://127.0.0.1:8080/LogRemoteServiceService/LogRemoteService"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">port</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">service</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">definitions</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>&nbsp;</p>
<p>里面有import来指引到真正的WSDL文件。这样很容易将会话Bean变成WS~一样的代码两样的功能，超值！</p>
<img src ="http://www.blogjava.net/leeguannan/aggbug/285163.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leeguannan/" target="_blank">阿南</a> 2009-07-02 13:54 <a href="http://www.blogjava.net/leeguannan/archive/2009/07/02/285163.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>微软真的来搅局吗？</title><link>http://www.blogjava.net/leeguannan/archive/2008/03/21/187673.html</link><dc:creator>阿南</dc:creator><author>阿南</author><pubDate>Fri, 21 Mar 2008 04:34:00 GMT</pubDate><guid>http://www.blogjava.net/leeguannan/archive/2008/03/21/187673.html</guid><wfw:comment>http://www.blogjava.net/leeguannan/comments/187673.html</wfw:comment><comments>http://www.blogjava.net/leeguannan/archive/2008/03/21/187673.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/leeguannan/comments/commentRss/187673.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leeguannan/services/trackbacks/187673.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 关注过上一篇文章的朋友，基本都对最后说到的微软要支持SWT的开发提出了不少自己的看法。<br />
&nbsp;&nbsp;&nbsp; 下面我们再来看看来自cnBate.com的新闻：<br />
<table style="width: 1003px; height: 31px" cellspacing="2" cellpadding="2" width="1003" border="0">
    <tbody>
        <tr>
            <td>
            <p>Java程序员们可能会经常遇到Windows下的UI问题,Java程序总是和Windows的外观统一不起来,特别是Vista,难度更高.<br />
            <span style="font-weight: bold">而现在,微软微软宣布它将为Eclipse基金会提供了标准的widget工具,这意味着Java将与Windows Presentation Foundation实现互通,允许应用程序原生采用Windows VIsta的外观.</span><br />
            <br />
            </p>
            <p>这也是微软未来开放计划的一部分,微软认为一个日益开放,透明的方式正在出现.之前,微软还成立了Linux的互操作性实验室,并与JBoss,Zend Technologies等公司实现了技术合作.<br />
            </p>
            </td>
        </tr>
    </tbody>
</table>
&nbsp;&nbsp;&nbsp; 微软真的在开源，不但支持了Linux，而且还来关注SWT，而且还有微软最近在收购Yahoo!，它最近非常关注开源事业，也许他真的要搅局，也许他真的是想做些事情，也许几年之后微软摇身一变真的变成了一个开源斗士了！<br />
&nbsp;&nbsp; 微软更换了首席构架师，他的做事风格在改变，我想微软是在向开源界证明自己的实力，是想让人们相信自己，也许过几年微软还果真出了一个开源版本的windows了~<img src="/CuteSoft_Client/CuteEditor/images/emteeth.gif" align="absMiddle" border="0"  alt="" />
<img src ="http://www.blogjava.net/leeguannan/aggbug/187673.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leeguannan/" target="_blank">阿南</a> 2008-03-21 12:34 <a href="http://www.blogjava.net/leeguannan/archive/2008/03/21/187673.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse4.0放出部分Demo</title><link>http://www.blogjava.net/leeguannan/archive/2008/03/20/187460.html</link><dc:creator>阿南</dc:creator><author>阿南</author><pubDate>Thu, 20 Mar 2008 04:46:00 GMT</pubDate><guid>http://www.blogjava.net/leeguannan/archive/2008/03/20/187460.html</guid><wfw:comment>http://www.blogjava.net/leeguannan/comments/187460.html</wfw:comment><comments>http://www.blogjava.net/leeguannan/archive/2008/03/20/187460.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/leeguannan/comments/commentRss/187460.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leeguannan/services/trackbacks/187460.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 早上，习惯性的打开GoogleReader，看看世界的变化。发现<a class="link" id="sub-tree-item-14-link" href="http://www.google.com/reader/view/feed/http%3A%2F%2Fplanet.eclipse.org%2Fplanet%2Frss20.xml" closure_hashcode_="60"><span class="name name-d-2" id="sub-tree-item-14-name" title="Planet Eclipse"><span class="name-text name-text-d-2">Planet Eclipse</span></span></a>上已经有参加EclipseCON2008的朋友把Eclipse4.0（简称e4）Demo地址以及一些截图放到Blog上了~我们就来欣赏一下Eclipse的巨大变化吧！<br />
<img style="width: 824px; height: 613px" height="613" alt="" src="http://www.blogjava.net/images/blogjava_net/leeguannan/e4-web.png" width="824" border="0" /><br />
&nbsp;&nbsp;&nbsp; 呵呵，是不是很可怕，一个基于web的开发工具？我在Eclipse的Wiki上已经看到这个截图的Demo了，但是还没有时间试用~<br />
&nbsp;&nbsp;&nbsp; 此次放出的e4的demo基本上都是swt的调整，比方说可以使用swt来做flex，使用swt来做DOJO~，从这些方面就可以看到Eclipse正在向基金会想想的那样为e4提供一个基于web应用的平台，我想这个平台应该就是RAP了~而且从Demo上看，e4将会大大的涉足到web应用领域中，期待他们为我们带来再一次的惊呼！！！<br />
&nbsp;&nbsp;&nbsp; <a href="http://wiki.eclipse.org/E4/Running_the_demos">http://wiki.eclipse.org/E4/Running_the_demos</a>&nbsp; （e4的demo）<br />
<br />
&nbsp;&nbsp;&nbsp; 还有一个令人振奋的消息，不知道是好事还是坏事-----微软已经决定进入Eclipse基金会，并打算开始资助SWT项目了。<br />
&nbsp;&nbsp;&nbsp; 
<img src ="http://www.blogjava.net/leeguannan/aggbug/187460.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leeguannan/" target="_blank">阿南</a> 2008-03-20 12:46 <a href="http://www.blogjava.net/leeguannan/archive/2008/03/20/187460.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EclipseCON2008 only 1 week left!</title><link>http://www.blogjava.net/leeguannan/archive/2008/03/08/184667.html</link><dc:creator>阿南</dc:creator><author>阿南</author><pubDate>Sat, 08 Mar 2008 04:52:00 GMT</pubDate><guid>http://www.blogjava.net/leeguannan/archive/2008/03/08/184667.html</guid><wfw:comment>http://www.blogjava.net/leeguannan/comments/184667.html</wfw:comment><comments>http://www.blogjava.net/leeguannan/archive/2008/03/08/184667.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leeguannan/comments/commentRss/184667.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leeguannan/services/trackbacks/184667.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; EclipseCON2008 only 1 week left!<br />
&nbsp;&nbsp;&nbsp; 又一次开源界的盛会EclipseCON2008就要召开了~据我了解此次盛会将会吸引更多的开源厂商，领袖，开发者参与，其中就有来自微软的<a href="http://www.eclipsecon.org/2008/index.php?page=sub/&amp;id=538"><strong>Sam Ramji</strong></a>（微软开源的Labs），关于OSGi的讨论依然是重头戏。<br />
&nbsp;&nbsp;&nbsp; 虽然Eclipse的RAP的发布也有半年多了，也在开源界引起了不小的反响，但是RAP还是没有得到广泛的应用，来自RAP的主力开发商Innoopract Informationssysteme GmbH的消息，此次EclipseCON2008大会也会给RAP带来更多的利好消息，毕竟关于RAP的讨论被安排在第二场，仅次于第一场OSGi的议题。<br />
&nbsp;&nbsp;&nbsp; Eclipse4.0也被提上了讨论日程，在介绍中提到，Eclipse3.0主要在力推RCP平台，而Eclipse4.0将会将会带来一个全新的用户界面以及新的用户体验，将带领Eclipse进入到WEB应用中，我想在Eclipse4.0的时候RAP应用，将变成Eclipse的主推平台了。<br />
&nbsp;&nbsp;&nbsp; 还有很多关于其他项目的讨论，但是我一直关注的VE的消息，好像还是不被人们注意，可见VE基本上已经死亡，而且我认为可以算是Eclipse基金会中比较失败的一个项目了！<br />
&nbsp;&nbsp; 预祝此次大会硕果累累，祝Eclipse越走越好！
<img src ="http://www.blogjava.net/leeguannan/aggbug/184667.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leeguannan/" target="_blank">阿南</a> 2008-03-08 12:52 <a href="http://www.blogjava.net/leeguannan/archive/2008/03/08/184667.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用JRuby为你的客户端助力</title><link>http://www.blogjava.net/leeguannan/archive/2008/03/07/184390.html</link><dc:creator>阿南</dc:creator><author>阿南</author><pubDate>Fri, 07 Mar 2008 01:20:00 GMT</pubDate><guid>http://www.blogjava.net/leeguannan/archive/2008/03/07/184390.html</guid><wfw:comment>http://www.blogjava.net/leeguannan/comments/184390.html</wfw:comment><comments>http://www.blogjava.net/leeguannan/archive/2008/03/07/184390.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/leeguannan/comments/commentRss/184390.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leeguannan/services/trackbacks/184390.html</trackback:ping><description><![CDATA[<p>&#160;&#160;&#160; 预言了两天，终于决定在我们的RCP客户端中增加执行JRuby的功能。说是预言其实也没有什么好预言的，JRuby早有耳闻，Ruby也一直在学习。其实要解决的问题只有一个---解决Java实例如何给JRuby，然后有JRuby操作，其实不难，JRbuy官方的WIKI上有一个例子，但是那个例子有太多硬编码的问题，稍稍改造，将硬编码的内容抽取到JRuby中，就好了~</p>  <p>&#160;&#160;&#160; 我想说的其实是在RCP中加入JRuby的作用是：</p>  <p>&#160;&#160;&#160; 实施人员只需要写脚本就可以随意操作界面上的任意东西；</p>  <p>&#160;&#160;&#160; 使产品更进一步达到零二次开发的阶段；</p>  <p>&#160;&#160;&#160; 使用JRuby来开发SWT的界面，还是有比较复杂，在熟悉SWT开发和JRuby的情况下画一个比较复杂的界面时候就会非常复杂！这里还是建议使用类似于XSWT等XML界面描述语言，然后配合脚本完成功能。</p>  <p>下面给出一个可以在运行JRuby的SWTShell：</p>  <table cellspacing="0" cellpadding="2" width="545" border="0"><tbody>     <tr>       <td valign="top" width="543">         <p>package com.glnpu.jruby; </p>          <p>import java.util.ArrayList;           <br />import java.util.List; </p>          <p>import org.eclipse.swt.SWT;           <br />import org.eclipse.swt.events.SelectionAdapter;            <br />import org.eclipse.swt.events.SelectionEvent;            <br />import org.eclipse.swt.widgets.Button;            <br />import org.eclipse.swt.widgets.Display;            <br />import org.eclipse.swt.widgets.Shell;            <br />import org.eclipse.swt.widgets.Text;            <br />import org.jruby.Ruby;            <br />import org.jruby.javasupport.JavaEmbedUtils;            <br />import org.jruby.runtime.builtin.IRubyObject; </p>          <p>public class RunJRUBY extends Shell { </p>          <p>&#160;&#160;&#160; private RunJRUBY run;           <br />&#160;&#160;&#160; private Text text;            <br />&#160;&#160;&#160; /**            <br />&#160;&#160;&#160;&#160; * Launch the application            <br />&#160;&#160;&#160;&#160; * @param args            <br />&#160;&#160;&#160;&#160; */            <br />&#160;&#160;&#160; public static void main(String args[]) {            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; try {            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Display display = Display.getDefault();            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; RunJRUBY shell = new RunJRUBY(display, SWT.SHELL_TRIM);            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; shell.open();            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; shell.layout();            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; while (!shell.isDisposed()) {            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (!display.readAndDispatch())            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; display.sleep();            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } catch (Exception e) {            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; e.printStackTrace();            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }            <br />&#160;&#160;&#160; } </p>          <p>&#160;&#160;&#160; /**           <br />&#160;&#160;&#160;&#160; * Create the shell            <br />&#160;&#160;&#160;&#160; * @param display            <br />&#160;&#160;&#160;&#160; * @param style            <br />&#160;&#160;&#160;&#160; */            <br />&#160;&#160;&#160; public RunJRUBY(Display display, int style) {            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; super(display, style);            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; run = this;            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; createContents();            <br />&#160;&#160;&#160; } </p>          <p>&#160;&#160;&#160; /**           <br />&#160;&#160;&#160;&#160; * Create contents of the window            <br />&#160;&#160;&#160;&#160; */            <br />&#160;&#160;&#160; protected void createContents() {            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; setText(&quot;SWT Application&quot;);            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; setSize(500, 375); </p>          <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; text = new Text(this, SWT.V_SCROLL | SWT.BORDER | SWT.WRAP | SWT.H_SCROLL);           <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; text.setBounds(0, 0, 492, 312); </p>          <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; final Button button = new Button(this, SWT.NONE);           <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; button.addSelectionListener(new SelectionAdapter() {            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; public void widgetSelected(final SelectionEvent e) {            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Ruby runtime = Ruby.getDefaultInstance();            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; try {            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //允许传对象，作为参数给JRuby            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; IRubyObject rootRubyObject = JavaEmbedUtils.newRuntimeAdapter().eval( runtime, text.getText() );            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; JavaEmbedUtils.invokeMethod( runtime, rootRubyObject, &quot;run&quot;, new Object[] {run}, null );            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //不传对象，直接运行JRbuy            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //runtime.evalScriptlet(text.getText());            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } catch (Exception e1) {            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.err.println(e1.toString());            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; e1.printStackTrace();            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; });            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; button.setText(&quot;button&quot;);            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; button.setBounds(335, 326, 48, 22);            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; //            <br />&#160;&#160;&#160; } </p>          <p>&#160;&#160;&#160; @Override           <br />&#160;&#160;&#160; protected void checkSubclass() {            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; // Disable the check that prevents subclassing of SWT components            <br />&#160;&#160;&#160; } </p>          <p>}</p>       </td>     </tr>   </tbody></table>  <p>下面是可以执行的JRuby代码：</p>  <table cellspacing="0" cellpadding="2" width="549" border="0"><tbody>     <tr>       <td valign="top" width="547">         <p>require 'java'           <br />module SWTTest            <br />&#160; include_package 'org.eclipse.swt'            <br />&#160; include_package 'org.eclipse.swt.layout'            <br />&#160; include_package 'org.eclipse.swt.widgets'            <br />&#160; include_package 'org.eclipse.swt.events'            <br />end            <br />&#160;&#160;&#160; class TestDialog &lt; SWTTest::Dialog            <br />&#160;&#160;&#160;&#160;&#160; @shell            <br />&#160;&#160;&#160;&#160;&#160; @parentShell            <br />&#160;&#160;&#160;&#160;&#160; def initialize shell            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; super(shell, SWTTest::SWT::NONE)            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; @parentShell = shell            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; open            <br />&#160;&#160;&#160;&#160;&#160; end            <br />&#160;&#160;&#160;&#160;&#160; def open            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; createContents()            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; @shell.open();            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; @shell.layout();&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160; end            <br />&#160;&#160;&#160;&#160;&#160; def createContents            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; @shell = SWTTest::Shell.new(@parentShell, SWTTest::SWT::DIALOG_TRIM | SWTTest::SWT::APPLICATION_MODAL)            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; @shell.setSize(500, 375);            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; @shell.setText(&quot;SWT Dialog&quot;);            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; button = SWTTest::Button.new(@shell, SWTTest::SWT::PUSH)            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; button.setText(&quot;Test Button 1&quot;)&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; button.setBounds(147, 116, 48, 22);            <br />&#160;&#160;&#160;&#160;&#160; end            <br />&#160;&#160;&#160; end            <br />&#160; class TestMain            <br />&#160;&#160;&#160;&#160;&#160; def run shell            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TestDialog.new shell            <br />&#160;&#160;&#160;&#160;&#160; end            <br />&#160; end            <br />&#160; TestMain.new</p>       </td>     </tr>   </tbody></table>  <p>在JRuby代码的最下面有一个TestMain的类，主要是用于调用的~这一点是和其他的写法不同的！</p>  <p>至于它有多强大，就看大家怎么用了~而且java和JRuby是运行在同一个JVM之上的，它可以使用此JVM下的所有对象！</p><img src ="http://www.blogjava.net/leeguannan/aggbug/184390.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leeguannan/" target="_blank">阿南</a> 2008-03-07 09:20 <a href="http://www.blogjava.net/leeguannan/archive/2008/03/07/184390.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>微软研发：制胜策略(实用方法三)</title><link>http://www.blogjava.net/leeguannan/archive/2008/03/05/183936.html</link><dc:creator>阿南</dc:creator><author>阿南</author><pubDate>Wed, 05 Mar 2008 04:54:00 GMT</pubDate><guid>http://www.blogjava.net/leeguannan/archive/2008/03/05/183936.html</guid><wfw:comment>http://www.blogjava.net/leeguannan/comments/183936.html</wfw:comment><comments>http://www.blogjava.net/leeguannan/archive/2008/03/05/183936.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leeguannan/comments/commentRss/183936.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leeguannan/services/trackbacks/183936.html</trackback:ping><description><![CDATA[<p>&#160;&#160; <strong>不要用年终考评来订立学习目标，要利用年终考评来记录个人的成长。</strong></p>  <p><strong>&#160;&#160;&#160; 要让每一位程序设计师都明白，写出零错误程序是很不容易的，所以应该多花功夫用各种方法做最彻底的测试。</strong></p>  <p><strong>&#160;&#160;&#160; 纠正程序设计师以为加除错码会花太多时间的观念，应该训练程序设计师第一个反应是考虑加上除错码是否有道理，第二是考虑加除错码是否符合项目的目标与工作的优先级。</strong></p>  <p><strong>&#160;&#160; 不要让凡事不能的态度阻碍了创新。</strong></p>  <p><strong>&#160;&#160; 不要让程序设计师以为使用者并不在乎软件的质量。</strong></p>  <p><strong>&#160;&#160; 不要给使用者次品，宁愿延期交货，务必追求质量完美。</strong></p>  <p><strong>&#160;&#160; 程序设计师必须经常以使用者的观点来看自己写的程序，程序设计师必须能体会使用者的感受。</strong></p>  <p><strong>&#160;&#160; 在包装盒里的每一件东西，都是产品的一部分。</strong></p>  <p><strong>&#160;&#160; 将程序的可共享性当作优先考虑的目标之一，否则程序设计师将经常做重复的工作。</strong></p>  <p><strong>&#160;&#160; 从您的每件工作中创造最大的资源，不管是利用现有的杠杆，或是创造新的杠杆。</strong></p>  <p><strong>&#160;&#160; 如果进度发生落后，那表示有个地方出错了。您应该找出问题，并加以解决，不要一味要求组员加班，在问题没有解决之前，加班是没有用的。</strong></p>  <p><strong>&#160;&#160; 别误信加班等于增加生产能力，长期的加班只会伤害生产能力，对项目没有帮助。</strong></p>  <p><strong>&#160;&#160; 周末是属于组员私人的时间，不是公司的。公司不应该以打败竞争对手为理由，要求员工周末加班。</strong></p>  <p><strong>&#160;&#160; 强调思考的重要性，而不是长时间工作。</strong></p>  <p><strong>&#160;&#160; 训练开发小组懂得在正常工作时间内掌握好工作的效率，不要让他们超时工作，因为超时工作只是浪费时间的假面具。</strong></p>  <p><strong>&#160;&#160; 与程序设计师共同研拟出一份每日活动的时间表，把无法预期的临时公务变成固定时间处理的事情，并且把程序开发的工作放在最优先的地位，不要让其他次要的事情干扰到写程序。</strong></p>  <p><strong>&#160;&#160; 主管应该把自己视为团队中的一分子，与其他人平等，而不是高高在上。</strong></p><img src ="http://www.blogjava.net/leeguannan/aggbug/183936.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leeguannan/" target="_blank">阿南</a> 2008-03-05 12:54 <a href="http://www.blogjava.net/leeguannan/archive/2008/03/05/183936.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>微软研发：制胜策略(实用方法二)</title><link>http://www.blogjava.net/leeguannan/archive/2008/03/04/183596.html</link><dc:creator>阿南</dc:creator><author>阿南</author><pubDate>Tue, 04 Mar 2008 00:47:00 GMT</pubDate><guid>http://www.blogjava.net/leeguannan/archive/2008/03/04/183596.html</guid><wfw:comment>http://www.blogjava.net/leeguannan/comments/183596.html</wfw:comment><comments>http://www.blogjava.net/leeguannan/archive/2008/03/04/183596.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/leeguannan/comments/commentRss/183596.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leeguannan/services/trackbacks/183596.html</trackback:ping><description><![CDATA[<p>&#160;&#160;&#160; <strong>用看程序的方式找错，是既懒惰又无效率的方法；</strong></p>  <table cellspacing="0" cellpadding="2" width="532" border="0"><tbody>     <tr>       <td valign="top" width="530">         <p>随时睁大雪亮的眼睛，看看是不是有个悬而未决的问题，一定要有个人(或是由主管自己)来负责研究到底哪里出错，也许这种研究既花时间又无聊，但总比灾难发生之后再来花好几个星期收拾残局要好得多。</p>       </td>     </tr>   </tbody></table>  <p>&#160;&#160;&#160; <strong>问了错的问题，而导致错的答案，训练自己问出正确的问题！</strong></p>  <table cellspacing="0" cellpadding="2" width="531" border="0"><tbody>     <tr>       <td valign="top" width="529">         <p>如果您能很清楚告诉别人，您想要的究竟是什么，这样别人才能给您真正需要的帮助，而不是做一些似是而非的虚工。</p>       </td>     </tr>   </tbody></table>  <p>&#160;&#160;&#160; <strong>勉强自己接下不可能完成的任务，实在是以长痛代替短痛的做法，而且长痛的是整个团队，该拒绝的时候绝对不能含糊；</strong></p>  <p>&#160;&#160;&#160; <strong>不要为了讨好别人而伤害双方的工作进程，您永远要根据自己的目标，做适当的决策。</strong></p>  <p>&#160;&#160;&#160; <strong>必须保护项目不受外界的左右，尤其是当这种操控来自特权人物之手。</strong></p>  <p>&#160;&#160;&#160; <strong>副产品对公司或产品都没有策略上的价值，充其量只是一种消费者回馈。</strong></p>  <p>&#160;&#160;&#160; <strong>不值得开发的功能就不要做。</strong></p>  <p>&#160;&#160;&#160; <strong>软件产品的开发，不能只为了有趣、挑战性，或是够有个性够令人眩目。</strong></p>  <p>&#160;&#160;&#160; <strong>遵循标准重于一切，特别是关于使用者界面的部分。</strong></p>  <p>&#160;&#160;&#160; <strong>确定您所要求的报告真的值得属下暂停工作，花那么多时间去写。</strong></p>  <p>&#160;&#160;&#160; <strong>请注意定期会议的价值，确定它值得每个人放下手上的工作。</strong></p>  <p>&#160;&#160;&#160; <strong>召开任何会议之前，请确定本次会议的目的是什么，达成这个目的的条件是什么，然后，务必达到开会的目的。</strong></p>  <p>&#160;&#160;&#160; <strong>不要利用进程表来驱使项目的进行，这对小组的士气伤害太大了。</strong></p>  <p>&#160;&#160;&#160; <strong>让日程表维持适度的紧迫，但又是可以做到的，好让组员振奋、不松懈，专心致力于项目的推进。</strong></p>  <p><strong>&#160;&#160;&#160; 绝对不要草率定出不可能的期限，导致组员为了赶进度而损害产品的质量。</strong></p>  <p><strong>&#160;&#160;&#160; 把长期的大项目，分成几个完整而独立的小项目，各小项目必须有一个主题。</strong></p>  <p><strong>&#160;&#160;&#160; 为了保持创意的活力和团队士气，必须让每一个小项目都有令人兴奋的结果。</strong></p>  <p><strong>&#160;&#160;&#160; 不要让程序设计师的学习停滞不前，要让程序设计师有机会磨练不同领域的技术，培养十八般武艺样样精通的组员。</strong></p>  <p><strong>&#160;&#160;&#160; 训练新进程序设计师时，先培养他对整个公司所有项目都有价值的技术，然后才培养本项目独有的技术。</strong></p>  <p><strong>&#160;&#160;&#160; 不要舍不得放您最优秀的程序设计师到别的项目去。如果他在您的项目已经没有新的东西可学，为了公司和他个人的前途，您应该把他推荐到别的项目，让他的成长永不间断。</strong></p>  <p><strong>&#160;&#160;&#160; 确定每位组员、每两个月都有一项技术上进步。</strong></p>  <p><strong>&#160;&#160;&#160; 一发现某处需要改进，就立即采取更正的行动。</strong></p> <img src ="http://www.blogjava.net/leeguannan/aggbug/183596.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leeguannan/" target="_blank">阿南</a> 2008-03-04 08:47 <a href="http://www.blogjava.net/leeguannan/archive/2008/03/04/183596.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>微软研发：制胜策略(实用方法一)</title><link>http://www.blogjava.net/leeguannan/archive/2008/03/03/183344.html</link><dc:creator>阿南</dc:creator><author>阿南</author><pubDate>Mon, 03 Mar 2008 00:34:00 GMT</pubDate><guid>http://www.blogjava.net/leeguannan/archive/2008/03/03/183344.html</guid><wfw:comment>http://www.blogjava.net/leeguannan/comments/183344.html</wfw:comment><comments>http://www.blogjava.net/leeguannan/archive/2008/03/03/183344.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leeguannan/comments/commentRss/183344.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leeguannan/services/trackbacks/183344.html</trackback:ping><description><![CDATA[<p>首先还是先看一下书评。</p>  <p>下面是来自china-pub的书评：</p>  <table cellspacing="0" cellpadding="2" width="541" border="0"><tbody>     <tr>       <td valign="top" width="539">作者详细描述了他在美国领导项目的各种实际的策略方法，教您如何开发高质量的软件，而且绝不延误。本书是为每一位从事研发工作的朋友而写，相信您在读过本书之后，一定急于推荐给您的主管、同事和您的朋友。</td>     </tr>   </tbody></table>  <p>&#160;&#160;&#160; 卓越的领导者从不同的角度看世界。若是公司被大火烧得精光，他非但不为丢饭碗惊慌，反而利用火焰来烧烤一顿大餐。当每个人都摇头离去，卓越的领导者仍有充分的信心保持乐观，对每件事都从正面角度来思考。就因为凡事都看光明面，卓越的领导者并不把失败当失败，反将其当作学习克服障碍的经验。正因如此，卓越的领导者乐意尝试各种稀奇古怪的想法，并从中获得重大的突破，即使不成功，他只把这次经验当成获得信息的方式之一。这种领导人不一定要有经验，而是需要强烈的进取心和明确的理想，能够将理想与他人沟通，鼓舞他人共同追寻理想的能力，再加上一点机会，这就是能将理想实现的卓越领导者。</p>  <p><strong>&#160;&#160;&#160; 每当有人完成了一项新的功能或特色，就发个e -mail 给大家。</strong></p>  <p><strong>例如：</strong></p>  <table cellspacing="0" cellpadding="2" width="532" border="0"><tbody>     <tr>       <td valign="top" width="530">         <p>&#8220;我已完成Faxmangler 的搜寻与取代功能。Frank&#8221;            <br />主管应该看一下结果，然后回一个：             <br />&#8220;我检查过F a x m a n g l e r的搜寻与取代，不太顺畅，请再修改。Hubie&#8221;             <br />或是：             <br />&#8220;很好，继续加油！Hubie&#8221;             <br />想想看，如果大家经常收送这类正面的e - m a i l，一定会觉得充满干劲，这和可恨的进度报告多么不同！程序设计师会很乐意看见这类的好消息，当自己送出完成工作的信息时，也会很有成就感；没有人会觉得这是很讨厌的报告。</p>       </td>     </tr>   </tbody></table>  <p><strong>&#160;&#160;&#160; 每当进度快要落后了，就到我的办公室私下讨论原因，我们一起开动脑筋寻求解决之道。</strong></p>  <p><strong>例如：</strong></p>  <table cellspacing="0" cellpadding="2" width="530" border="0"><tbody>     <tr>       <td valign="top" width="528">         <p>当某位程序设计师觉得自己可能要落后了，我会和他谈，研究将来如何避免这种事情。是我们在制定进程时疏漏了某一个重要环节吗？或是时间表定得太乐观了？是不是有个错虫( b u g )在作祟，害得程序很难写或无法测试？不论问题是什么，我们一定想办法解决掉，并且预防它将来再发生。</p>       </td>     </tr>   </tbody></table>  <p><strong>&#160;&#160;&#160; 尽可能减少项目中小组彼此间的依赖。</strong></p>  <p>&#160;&#160;&#160; <strong>目标越是明确，达成目标的过程就会越有效率。</strong></p>  <p>&#160;&#160;&#160; <strong>建立最适当的程序设计优先考虑顺序，并且让所有的程序设计师确实遵守。</strong></p>  <table cellspacing="0" cellpadding="2" width="530" border="0"><tbody>     <tr>       <td valign="top" width="528">         <p>排出一个优先级表：</p>          <ul>           <li>体积大小(size) </li>            <li>速度(speed) </li>            <li>坚固性(robustness) </li>            <li>安全性(safety) </li>            <li>可测试性(testability) </li>            <li>容易维护(maintainability) </li>            <li>简洁(simplicity) </li>            <li>再用性(reusability) </li>            <li>可移植性(portability) </li>         </ul>       </td>     </tr>   </tbody></table>  <p>&#160;&#160; <strong>一旦您掌握了这个概念，把它应用在项目上，您可以大声说自己确实是在聪明地工作，而不是辛苦地工。</strong></p>  <p><strong>&#160;&#160;&#160; 一发现Bug就立即清除掉，别拖延。</strong></p>  <p><strong>作者给出的提示：</strong></p>  <table cellspacing="0" cellpadding="2" width="532" border="0"><tbody>     <tr>       <td valign="top" width="530">错虫愈晚清除，时间花得愈多。          <br />          <p>在开发的过程就立即除虫，可以让您早些学到经验，然后就不会再犯同样的错误；相反地，如果到了项目后期才发现，您可能已经犯过多次同样的错误而不自知。</p>          <p>发现错虫而立即除错是一种缓冲器，提醒那些讲求快速而不够谨慎的程序设计师，以后多加小心。</p>          <p>若能保持没有任何错虫，您就能比较准确估出项目的完成时间。</p>          <p><strong>要求错虫随时发现随时改，等于是在开发过程中引进一个小小的质量管理机制，多方的防微杜渐，保护产品的正确性。</strong></p>       </td>     </tr>   </tbody></table>  <p>&#160;&#160;&#160; <strong>学习前人的经验；</strong></p>  <p>&#160;&#160;&#160; <strong>好方法要让大家分享；</strong></p>  <p><strong>&#160;&#160;&#160; 项目只要有偏差，就需要调整，绝对不可以放任自流！</strong></p>  <p>&#160;&#160;&#160; <strong>定期暂停手边的工作，然后往前思考，随时做必要的修正，以避免未来的大障碍。</strong></p>  <table cellspacing="0" cellpadding="2" width="532" border="0"><tbody>     <tr>       <td valign="top" width="530">         <p>有什么事情是我今天能做，而且可以帮助项目在未来几个月内顺利进行的？</p>       </td>     </tr>   </tbody></table><img src ="http://www.blogjava.net/leeguannan/aggbug/183344.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leeguannan/" target="_blank">阿南</a> 2008-03-03 08:34 <a href="http://www.blogjava.net/leeguannan/archive/2008/03/03/183344.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>微软团队：成功秘诀(总结)</title><link>http://www.blogjava.net/leeguannan/archive/2008/03/02/183212.html</link><dc:creator>阿南</dc:creator><author>阿南</author><pubDate>Sun, 02 Mar 2008 01:29:00 GMT</pubDate><guid>http://www.blogjava.net/leeguannan/archive/2008/03/02/183212.html</guid><wfw:comment>http://www.blogjava.net/leeguannan/comments/183212.html</wfw:comment><comments>http://www.blogjava.net/leeguannan/archive/2008/03/02/183212.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/leeguannan/comments/commentRss/183212.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leeguannan/services/trackbacks/183212.html</trackback:ping><description><![CDATA[<p>总结本书中的54条法则得到：</p>  <ol>   <li>建议一只和谐的团队； </li>    <li>给团队一个明确的目标，让大家都知道这个目标并把它印入脑海； </li>    <li>让品保人员明白自己不仅仅是为了Bug而加入团队的； </li>    <li>建立合适的检查点和里程碑，并利用检查点和里程碑检验团队的健康度； </li>    <li>不要害怕延误，要不断的修正方法但不要过度的修正目标； </li>    <li>努力让团队中成员产生共鸣； </li> </ol>  <p>希望大家共勉！</p><img src ="http://www.blogjava.net/leeguannan/aggbug/183212.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leeguannan/" target="_blank">阿南</a> 2008-03-02 09:29 <a href="http://www.blogjava.net/leeguannan/archive/2008/03/02/183212.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>微软团队：成功秘诀(4)</title><link>http://www.blogjava.net/leeguannan/archive/2008/02/29/183010.html</link><dc:creator>阿南</dc:creator><author>阿南</author><pubDate>Fri, 29 Feb 2008 10:00:00 GMT</pubDate><guid>http://www.blogjava.net/leeguannan/archive/2008/02/29/183010.html</guid><wfw:comment>http://www.blogjava.net/leeguannan/comments/183010.html</wfw:comment><comments>http://www.blogjava.net/leeguannan/archive/2008/02/29/183010.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/leeguannan/comments/commentRss/183010.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leeguannan/services/trackbacks/183010.html</trackback:ping><description><![CDATA[<p>法则二十七：</p>  <p>&#160;&#160; <strong>Be like the doctors&#160;&#160;&#160; 用医生的方法</strong></p>  <p>&#160;&#160;&#160; 当病人已经药石罔效时，医生通常会对病情有所保留，避免病人太过悲观或恐惧，并且尽量鼓励病人保持希望，最好能让病人有个期望完成的目标。</p>  <p>&#160;&#160;&#160; 医生绝对不会斩钉截铁地断言什么医疗行为一定会有什么样的结果，反而是以    <br />一种自在且充满信心的口吻说：&#8220;试试看吧，一切都还没有确定呢。</p>  <p>&#160;&#160;&#160; 另外一件应该向医生学习的事情是，即使是再小再简单的医疗行为，都带着几分风险，所以医生会说：&#8220;当然，任何情况都是有可能的，治愈率再高我都不能跟你说百分之百没问题。</p>  <p>法则二十八：</p>  <p>&#160;&#160;&#160; <strong>Remember the triangle:features, resources, times&#160;&#160;&#160; 软件开发金三角：特色、资源和时间</strong></p>  <p>&#160;&#160;&#160; 作为一位软件开发的领导人，你得集中注意力在三件事情：资源（人和钱）、特色（产品与其品质）和时间。这三件事是软件开发的核心，其他的都是外围。</p>  <p>&#160;&#160;&#160; 资源、特色和时间是三角形的三个边，任何一边的变化，都会影响到另外一边或两边。所以如果时间落后了，去看你的三角形，看看对特色和资源的影响；当有人谈到可以增加什么功能特色时，你得立刻谈起时间和资源，以显得你思虑周    <br />详反应敏捷。所以，管理者的第一要务是把这个三角形放在心里，随时利用这个模式来思考问题，你会发现答案都在这个三角形内。</p>  <p>法则二十九：</p>  <p>&#160;&#160;&#160; <strong>Don't know what you don't know&#160;&#160;&#160; 不懂别装懂</strong></p>  <p>法则三十：</p>  <p>&#160;&#160;&#160; <strong>Don't go dark&#160;&#160;&#160; 建立适当的检查点</strong></p>  <p>法则三十一：</p>  <p>&#160;&#160;&#160; <strong>Beware of a guy in a room&#160;&#160;&#160; 留心没有检查点的组员</strong></p>  <p>法则三十二：</p>  <p>&#160;&#160;&#160; <strong>If you build it, it will ship&#160;&#160;&#160; 软件要经常建构，就能顺利推出</strong></p>  <p>法则三十三：</p>  <p>&#160;&#160; <strong>Get a known state and stay there&#160;&#160;&#160; 掌握实际情况</strong></p>  <p>法则三十四：</p>  <p>&#160;&#160;&#160; <strong>Use ZD milestones&#160;&#160;&#160; 零缺点里程碑</strong></p>  <p>&#160;&#160;&#160; 零缺点不代表软件中没有错虫，也不表示没有遗漏的功能，而是指团队的成品达到了事先规划的品质水准，也经过测试验证，就是零缺点里程碑。</p>  <p>法则三十五：</p>  <p>&#160;&#160; <strong>Nobody reaches the ZD milestone until everybody does&#160;&#160;&#160; 所有组员一起到达零缺点里程碑</strong></p>  <p>法则三十六：</p>  <p>&#160;&#160;&#160; <strong>Every milestone deserves a no-blame postmortem&#160;&#160;&#160; 完成每个里程碑后，心平气和地检讨</strong></p>  <p>法则三十七：</p>  <p>&#160;&#160;&#160; <strong>Stick to both the letter and the spirit of the milestones&#160;&#160;&#160; 把握里程碑的实质意义与精神</strong></p>  <p>法则三十八：</p>  <p>&#160;&#160;&#160; <strong>Get a handle on &quot;normal&quot;&#160;&#160;&#160; 培养正常的团队运作</strong></p>  <p>法则三十九：</p>  <p>&#160;&#160;&#160; <strong>A handful of milestones is a handful&#160;&#160;&#160; 里程碑不宜太多，才好掌握</strong></p>  <p>法则四十：</p>  <p>&#160;&#160;&#160; <strong>Every little milestone has a meaning (story) all its own&#160;&#160;&#160; 每一个里程碑应有专属的宗旨</strong></p>  <p>法则四十一：</p>  <p>&#160;&#160;&#160; <strong>Look for the natural milestones&#160;&#160;&#160; 寻找自然出现的里程碑</strong></p>  <blockquote>   <p>以下是六种自然出现的里程碑：      <br />1. 产品设计趋于稳定。       <br />2. 中间产品被明确定义。       <br />3. 团队真正了解要花多少时间和努力才能完成目标（通常这会发生很多次，而且多半是进度落后的时候）。       <br />4. 产品设计被删减，或是资源增加，或是进度延误，       <br />或是三者同时发生。       <br />5. 开发活动停止。       <br />6. 产品进入除错或稳定阶段。</p> </blockquote>  <p>法则四十二：</p>  <p>&#160;&#160;&#160; <strong>When you slip, don't fall&#160;&#160;&#160; 如果滑了一跤，别就此倒地不起</strong></p>  <ol>   <li>&#160;&#160;&#160; 进度落后与道德无关，请切记！ </li>    <li>&#160;&#160;&#160; 不要隐瞒事实。 </li>    <li>&#160;&#160;&#160; 化阻力为助力，利用进度落后来激发效率。 </li> </ol>  <p>&#160;&#160;&#160; 进度落后不是问题，被进度落后吓倒才是问题。进度落后并不代表产品的难度太高而无法开发。但是如果进度已经落后却未被察觉，那表示组员们不思考、不观察、不讨论，此时组织可说是濒临瓦解了。</p>  <p>&#160;&#160;&#160; 善用你的迟延，这是最能看出你领导能力的时候，此时也是组员最脆弱也最需要你的时候，在这个时候组员最能把你的话听进去，此时组员的学习能力最强。如果你在办公室内激动得大喊大叫，指天骂地，那就错失了赢得组员的心的大好机会。你必须说：&#8220;O K，进度落后了，让我们来看看问题出在那里？⋯⋯今天下午五点在会议室，我们要检讨每一个细节，问题一定要设法解决！&#8221;当组员了解到你不是企图卸责或算帐，而是真诚地想解决问题，就会乐意把一切开诚布公地摊开来谈，大家一起研究问题，从各种角度去设法克服问题。&#8220;进度落后&#8221;反而变成大家宝贵的成长经验。</p>  <p>法则四十三：</p>  <p>&#160;&#160;&#160; <strong>Don't trade a bad date for an equally bad date&#160;&#160;&#160; 不要因为进度落后而更改最后期限</strong></p>  <p>&#160;&#160;&#160; 进度落后的程度是与计划的不确定性成正比。</p>  <p>法则四十四：</p>  <p>&#160;&#160;&#160; <strong>After a slip, hit the next milestone, no matter what延误了这个里程碑，就一定要如期到达下一个里程碑</strong></p>  <p>&#160;&#160;&#160; 我们必须明白，每一次的延误，就是你和团队信心的一次受挫，所以，延误这个里程碑时，最好的补救办法就是无论如何绝不延误下一个里程碑。团队必须挽回对自己的信心和对理想的承诺；因此，下一个任务必须准时完成的意义更重大，团队需要重建信心。</p>  <p>法则四十五：</p>  <p>&#160;&#160; <strong>A good slip is a net positive&#160;&#160; 把延误当作宝贵的学习机会</strong></p>  <p>法则四十六：</p>  <p>&#160;&#160;&#160; <strong>See the forest&#160;&#160;&#160; 见树亦见林</strong></p>  <p>&#160;&#160;&#160; 如果本项目有六个模块，各有9 0 %的部分已经完成，那么你已经完成了5 4 %。每个模块完成了九成，听起来是个挺不错的成绩，但不能当成整个项目完成了百分之九十，它们之间不是相加的关系。你必须&#8220;见树亦见林&#8221;。如果任何一个模块完成比率是零，那么整个项目的完成率也是零。</p>  <p>法则四十七：</p>  <p>&#160;&#160;&#160; <strong>The world changes, so should you&#160;&#160;&#160; 世界在变，所以你也得跟着改变</strong></p>  <p>&#160;&#160;&#160; 虽然你想做些改变，你未必有勇气实行。</p>  <p>&#160;&#160;&#160; 伟大的软件必定只有一个中心思想，至于品质能够实现到什么程度，依赖领导者能否带领团队融合无数个小而重要的改变。如果你能在混乱中辨识出对项目最有意义的改变，并且引导团队去适应它，将它融入团队的精神中，将来就会在产品中表现出这项改变，呈现在顾客眼前。</p>  <p>法则四十八：</p>  <p>&#160;&#160;&#160; <strong>Violate at least one sacred cow&#160;&#160;&#160; 关怀多于要求</strong></p>  <p>法则四十九：</p>  <p>&#160;&#160; <strong>Beta is not the time to change&#160;&#160;&#160; Beta测试版不是修改功能的时候</strong></p>  <p>法则五十：</p>  <p>&#160;&#160;&#160; <strong>The Beta is for spin development&#160;&#160;&#160; Beta测试是暖身活动</strong></p>  <p>法则五十一：</p>  <p>&#160;&#160;&#160; <strong>Triage ruthlessly&#160;&#160;&#160; 急救术</strong></p>  <p>法则五十二：</p>  <p>&#160;&#160; <strong>Don't shake the Jell-0&#160;&#160;&#160; 小心保持软件的稳定</strong></p>  <p>法则五十三：</p>  <p>&#160;&#160;&#160; <strong>Compete with the superior story&#160;&#160;&#160; 伟大的软件应该有一个伟大的故事</strong></p>  <p>法则五十四：</p>  <p>&#160;&#160; <strong>Create a winning image&#160;&#160;&#160; 建立赢家形象</strong></p><img src ="http://www.blogjava.net/leeguannan/aggbug/183010.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leeguannan/" target="_blank">阿南</a> 2008-02-29 18:00 <a href="http://www.blogjava.net/leeguannan/archive/2008/02/29/183010.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JFace进度条使用经验一则</title><link>http://www.blogjava.net/leeguannan/archive/2008/02/29/182822.html</link><dc:creator>阿南</dc:creator><author>阿南</author><pubDate>Fri, 29 Feb 2008 00:47:00 GMT</pubDate><guid>http://www.blogjava.net/leeguannan/archive/2008/02/29/182822.html</guid><wfw:comment>http://www.blogjava.net/leeguannan/comments/182822.html</wfw:comment><comments>http://www.blogjava.net/leeguannan/archive/2008/02/29/182822.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/leeguannan/comments/commentRss/182822.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leeguannan/services/trackbacks/182822.html</trackback:ping><description><![CDATA[<p>&#160;&#160;&#160; 我讨论的进度条主要是JFace的进度条，RCP已经提供了完善的Job组件，为什么还要用JFace的进度条呢？原因是我要在登陆界面上做进度处理，也就是使用Eclipse3.3提供的AbstractSplashHandler特性，可以将原有的启动画面替换成为一个登陆界面，启动这个登陆界面时，Eclipse的Platform此时还没有启动，所以不能使用RCP本身的Job组件了。</p>  <p>&#160;&#160;&#160; 由于是一个检测服务器是否联通的测试，所以并不知道测试的真实时间，所以就是要使用&#8220;傻瓜进度条&#8221;了，也就是反复走的进度条陈刚的代码如下：</p>  <table cellspacing="0" cellpadding="2" width="525" border="0"><tbody>     <tr>       <td valign="top" width="523">         <p>button.addSelectionListener(new SelectionAdapter() {           <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; private boolean stopFlag;// 停止标志 </p>          <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; private void go() {           <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for (int i = 0; i &lt; 10; i++) {// 循环10次，每次间隔一秒            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(&quot;第&quot; + (i + 1) + &quot;个任务执行完毕&quot;);            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (stopFlag) {// 监控是否要让停止后台任务            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(&quot;被中断了&quot;);            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return;            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; try {            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Thread.sleep(1000);            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } catch (Throwable t) {}            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; stopFlag = true;// 执行完毕后把标志位设为停止，好通知给进度框            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(&quot;全部任务执行完毕&quot;);            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </p>          <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; public void widgetSelected(SelectionEvent e) {           <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; stopFlag = false;// 每次都设初值为false            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; new Thread() {// 把后台任务放到一个新开线程里执行            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; public void run() {            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; go();            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }.start();            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; showProgressDialog();// 打开一个进度框            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </p>          <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; private void showProgressDialog() {           <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; IRunnableWithProgress runnable = new IRunnableWithProgress() {            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; public void run(IProgressMonitor monitor) {            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; monitor.beginTask(&quot;正在执行中......&quot;, 30);            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; int i = 0;            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; while (true) {            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // 监听是否单击了进度框的&#8220;取消&#8221;按钮，stopFlag则是监听后台任务是否停止            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (monitor.isCanceled() || stopFlag) {            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; stopFlag = true; // 单击了&#8220;取消&#8221;按钮要设标志位为停止，好通知后台任务中断执行            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; break;// 中断处理            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // i到30后清零。并将进度条重新来过            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if ((++i) == 30) {            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; i = 0;            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; monitor.beginTask(&quot;正在执行中......&quot;, 30);            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // 进度条每前进一步体息一会，不用太长或太短，时间可任意设。            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; try {            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Thread.sleep(99);            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } catch (Throwable t) {}            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; monitor.worked(1);// 进度条前进一步            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; monitor.done();// 进度条前进到完成            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; };            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; try {            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; new ProgressMonitorDialog(s).run(true, true, runnable);            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } catch (Exception e) {            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; e.printStackTrace();            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }            <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; });</p>       </td>     </tr>   </tbody></table>  <p>&#160;</p>  <p>&#160;&#160;&#160; 主要是使用两个线程交替使用，第一个线程处理业务，第二个线程监控第一个线程查看它是否结束，如果结束或者被点击cancele则停止进度条的进程，如果一直没有关闭的指令，则反复开始---累加---结束---开始---累加---结束。</p>  <p>&#160;&#160;&#160; 我们几乎是把陈刚的代码原原本本的抄袭了一下，仅仅是替换了go()中的内容，但是发现一个问题</p>  <p><strong>new ProgressMonitorDialog(s).run(true, true, runnable);</strong>    <br />使用此句的话，JFace的线程永远不会启动；</p>  <p>替换为</p>  <p><strong>new ProgressMonitorDialog(s).run(false, true, runnable);</strong>    <br />使用此句的话，JFace的线程可以启动，运行正常，但是cancele不能响应，UI界面完全卡死！</p>  <p>&#160;&#160;&#160; 第一个参数的名字fork~乍看去，什么意思都没有，但是看看API才发现内藏很大的玄机，如果为true则此线程为一个非UI线程，大家知道非UI线程是不会阻塞UI的；如果为false则此线程为一个UI线程，大家也知道UI线程如果使用不当很容易阻塞UI的。</p>  <p>&#160;&#160;&#160; 关键的问题是我们和陈刚的代码几乎一摸一样他的进度条就启动，我的进度条就不启动！为什么？（这点至今不明白!）</p>  <p>&#160;&#160;&#160; 详查API发现如果fork为false的时候还是另有洞天的：</p>  <table cellspacing="0" cellpadding="2" width="521" border="0"><tbody>     <tr>       <td valign="top" width="519">         <p>This implementation of IRunnableContext#run(boolean, boolean, IRunnableWithProgress) runs the given <code>IRunnableWithProgress</code> using the progress monitor for this progress dialog and blocks until the runnable has been run, regardless of the value of <code>fork</code>. The dialog is opened before the runnable is run, and closed after it completes. It is recommended that <code>fork</code> is set to true in most cases. <strong>If <code>fork</code> is set to <code>false</code>, the runnable will run in the UI thread and it is the runnable's responsibility to call <code>Display.readAndDispatch()</code> to ensure UI responsiveness.</strong> </p>       </td>     </tr>   </tbody></table>  <p>API中说的很明白，如果fork为false时需要在线程中调用Display.readAndDispatch()方法，以避免UI被阻塞！</p>  <p>大家如果在JFace的开发中如果使用了进度条，发现UI被阻塞的话，就想想我哦！！！呵呵只用在进程中调用一下Display.readAndDispatch()就解决了！</p><img src ="http://www.blogjava.net/leeguannan/aggbug/182822.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leeguannan/" target="_blank">阿南</a> 2008-02-29 08:47 <a href="http://www.blogjava.net/leeguannan/archive/2008/02/29/182822.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RAP官方老窝</title><link>http://www.blogjava.net/leeguannan/archive/2008/01/13/175002.html</link><dc:creator>阿南</dc:creator><author>阿南</author><pubDate>Sun, 13 Jan 2008 10:11:00 GMT</pubDate><guid>http://www.blogjava.net/leeguannan/archive/2008/01/13/175002.html</guid><wfw:comment>http://www.blogjava.net/leeguannan/comments/175002.html</wfw:comment><comments>http://www.blogjava.net/leeguannan/archive/2008/01/13/175002.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leeguannan/comments/commentRss/175002.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leeguannan/services/trackbacks/175002.html</trackback:ping><description><![CDATA[<p>有朋友在blog中给我留言，说找到RAP的官方地址，现在我就在此公布一下，有兴趣的朋友可以去看看Demo。</p> <p>官方首页</p> <p><a title="http://www.eclipse.org/rap/" href="http://www.eclipse.org/rap/">http://www.eclipse.org/rap/</a></p> <p>Demo地址</p> <p><a title="http://www.eclipse.org/rap/demos.php" href="http://www.eclipse.org/rap/demos.php">http://www.eclipse.org/rap/demos.php</a>&nbsp;&nbsp; 此页面提供3个Demo，其中的SWT的官方Demo的RAP实现在RAP的发行包中，自己下载下来，自己RUN起来就能看到了；</p> <p>&nbsp;</p> <p>RAP开发领头公司</p> <li><a href="http://innoopract.com">Innoopract</a>&nbsp;&nbsp; 从开发人员列表和官方网站的支持力度上，此公司最强！（好像是家德国公司！） <li><a href="http://oneandone.com">1&amp;1</a> <li><a href="http://www.cas.de/English/Home.asp">CAS</a></li><img src ="http://www.blogjava.net/leeguannan/aggbug/175002.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leeguannan/" target="_blank">阿南</a> 2008-01-13 18:11 <a href="http://www.blogjava.net/leeguannan/archive/2008/01/13/175002.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>打造仿淘宝注册的Text（二）</title><link>http://www.blogjava.net/leeguannan/archive/2008/01/08/173774.html</link><dc:creator>阿南</dc:creator><author>阿南</author><pubDate>Tue, 08 Jan 2008 12:20:00 GMT</pubDate><guid>http://www.blogjava.net/leeguannan/archive/2008/01/08/173774.html</guid><wfw:comment>http://www.blogjava.net/leeguannan/comments/173774.html</wfw:comment><comments>http://www.blogjava.net/leeguannan/archive/2008/01/08/173774.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/leeguannan/comments/commentRss/173774.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leeguannan/services/trackbacks/173774.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 上次贴了几张图片出来显摆，这次彻底公布代码~大家看看原理就好，有兴趣的朋友可以和我联系，把SWT里面的控件都封装一下，做一套验证框架出来~&nbsp;&nbsp;1package&nbsp;com.glnpu.dmp.controls;&nbsp;&nbsp;2&nbsp;&nbsp;3import&nbsp;org.eclipse.swt.SWT;&nbsp;&nbsp;4imp...&nbsp;&nbsp;<a href='http://www.blogjava.net/leeguannan/archive/2008/01/08/173774.html'>阅读全文</a><img src ="http://www.blogjava.net/leeguannan/aggbug/173774.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leeguannan/" target="_blank">阿南</a> 2008-01-08 20:20 <a href="http://www.blogjava.net/leeguannan/archive/2008/01/08/173774.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>打造仿淘宝注册的Text（一）</title><link>http://www.blogjava.net/leeguannan/archive/2008/01/01/172024.html</link><dc:creator>阿南</dc:creator><author>阿南</author><pubDate>Tue, 01 Jan 2008 14:24:00 GMT</pubDate><guid>http://www.blogjava.net/leeguannan/archive/2008/01/01/172024.html</guid><wfw:comment>http://www.blogjava.net/leeguannan/comments/172024.html</wfw:comment><comments>http://www.blogjava.net/leeguannan/archive/2008/01/01/172024.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/leeguannan/comments/commentRss/172024.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leeguannan/services/trackbacks/172024.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; 为什么要打造仿淘宝注册的Text呢，不为什么，因为它好看！呵呵，这个不算理由，其实最重要的原因是因为最近在开发过程中，发现验证是个最麻烦的事情，虽然Eclipse和JFace为我们已经提供了比较好用的&#8220;高级&#8221;对话框和向导页了，对于简单的应用，他们两个用起来是非常简单，如果要验证的东西非常多，而且还有交叉验证（我自己起的名字，就是填了A就不再验证BCD的错在了，或者填了C就要验证AD存在）处理起来了就麻烦了，前两天以为新同事接手一端代码，发现里面竟然有20+个监听器，验证逻辑复杂的要死~为了解决这个问题。再结合B/S的开发经验，我认为，完全没有必要当用户把所有的必填项全都填了以后再把OK按键打开，不然永远置灰~大家做过的哪个B/S程序是这样的？不都是他爱填填，不爱填拉到，点确定的时候我告诉，或者是，我以上来就告诉你哪些必填，不填的，点击确定继续提醒！</p>
<p>&nbsp;&nbsp; OK，闲话少说，先看看淘宝的注册吧~我一直认为淘宝的注册界面是国内客户体验度最好的~</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/leeguannan/WindowsLiveWriter/Text_13478/ScreenShot002_2.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="31" alt="ScreenShot002" src="http://www.blogjava.net/images/blogjava_net/leeguannan/WindowsLiveWriter/Text_13478/ScreenShot002_thumb.png" width="244" border="0" /></a> </p>
<p>首先界面一打开就是这样的提示，在input框的左下脚又一个蓝色的小箭头，代表此文本框必填；</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/leeguannan/WindowsLiveWriter/Text_13478/ScreenShot001_4.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="29" alt="ScreenShot001" src="http://www.blogjava.net/images/blogjava_net/leeguannan/WindowsLiveWriter/Text_13478/ScreenShot001_thumb_1.png" width="244" border="0" /></a> </p>
<p>当获得焦点以后改变，后面的提示框高亮，着重提醒用户；</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/leeguannan/WindowsLiveWriter/Text_13478/ScreenShot003_2.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="34" alt="ScreenShot003" src="http://www.blogjava.net/images/blogjava_net/leeguannan/WindowsLiveWriter/Text_13478/ScreenShot003_thumb.png" width="244" border="0" /></a> </p>
<p>如果没有填，必填项，提交的时候的提示；</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/leeguannan/WindowsLiveWriter/Text_13478/ScreenShot004_2.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="26" alt="ScreenShot004" src="http://www.blogjava.net/images/blogjava_net/leeguannan/WindowsLiveWriter/Text_13478/ScreenShot004_thumb.png" width="244" border="0" /></a> </p>
<p>填写正确的提示；</p>
<p>OK，分析了上面的四种状态，那么我们来确定我们需要做成什么样子的~首先，我们需要；</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/leeguannan/WindowsLiveWriter/Text_13478/ScreenShot005_2.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="45" alt="ScreenShot005" src="http://www.blogjava.net/images/blogjava_net/leeguannan/WindowsLiveWriter/Text_13478/ScreenShot005_thumb.png" width="244" border="0" /></a> </p>
<p>必填提醒状态</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/leeguannan/WindowsLiveWriter/Text_13478/ScreenShot006_2.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="41" alt="ScreenShot006" src="http://www.blogjava.net/images/blogjava_net/leeguannan/WindowsLiveWriter/Text_13478/ScreenShot006_thumb.png" width="244" border="0" /></a> </p>
<p>填写正确提醒状态</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/leeguannan/WindowsLiveWriter/Text_13478/ScreenShot007_2.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="42" alt="ScreenShot007" src="http://www.blogjava.net/images/blogjava_net/leeguannan/WindowsLiveWriter/Text_13478/ScreenShot007_thumb.png" width="244" border="0" /></a> </p>
<p>错误填写提醒状态</p>
<p>还有就是鼠标移动到三种图标上的浮动框详细说明，因为我们不可能像淘宝那样，一个控件占那么大位置，用户界面还需要放更多的东西。</p>
<p>大致的任务交代清楚了，下一次再写详细的实现过程。<br />
</p>
<img src ="http://www.blogjava.net/leeguannan/aggbug/172024.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leeguannan/" target="_blank">阿南</a> 2008-01-01 22:24 <a href="http://www.blogjava.net/leeguannan/archive/2008/01/01/172024.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>