﻿<?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-深圳Java开发者之家</title><link>http://shenzhen.blogjava.net/</link><description>深圳Java开发者之家</description><language>zh-cn</language><lastBuildDate>Fri, 04 Jul 2008 12:07:02 GMT</lastBuildDate><pubDate>Fri, 04 Jul 2008 12:07:02 GMT</pubDate><ttl>60</ttl><item><title>Sun服务器磁盘故障 联邦航空局数据库崩溃20小时</title><link>http://www.blogjava.net/haix/archive/2008/05/31/204225.html</link><dc:creator>haix</dc:creator><author>haix</author><pubDate>Sat, 31 May 2008 00:51:00 GMT</pubDate><guid>http://www.blogjava.net/haix/archive/2008/05/31/204225.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/haix/archive/2008/05/31/204225.html'>阅读全文</a><img src ="http://shenzhen.blogjava.net/aggbug/204225.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/haix/" target="_blank">haix</a> 2008-05-31 08:51 <a href="http://www.blogjava.net/haix/archive/2008/05/31/204225.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个优良用户故事的6个特性 - INVEST 模式（翻译）</title><link>http://www.blogjava.net/rocket/archive/2008/05/26/202981.html</link><dc:creator>rocket</dc:creator><author>rocket</author><pubDate>Mon, 26 May 2008 09:09:00 GMT</pubDate><guid>http://www.blogjava.net/rocket/archive/2008/05/26/202981.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 原文来自http://agilesoftwaredevelopment.com/blog/vaibhav/good-user-story-invest,在google时偶然发现的这个网站,里面的东西都很不错,喜欢敏捷的朋友可以去看看了.<br>一直以来有很多人都在问我用例和用户故事究竟有什么区别,我想这片文章关于用户故事的6个特性就是最好的回答了.<br>原文不是很难,我就顺手的给翻译了,有翻译不对的地方还请大家及时指正.&nbsp;&nbsp;<a href='http://www.blogjava.net/rocket/archive/2008/05/26/202981.html'>阅读全文</a><img src ="http://shenzhen.blogjava.net/aggbug/202981.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rocket/" target="_blank">rocket</a> 2008-05-26 17:09 <a href="http://www.blogjava.net/rocket/archive/2008/05/26/202981.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>感慨于我们的技术土壤</title><link>http://www.blogjava.net/rocket/archive/2008/05/25/202709.html</link><dc:creator>rocket</dc:creator><author>rocket</author><pubDate>Sun, 25 May 2008 05:13:00 GMT</pubDate><guid>http://www.blogjava.net/rocket/archive/2008/05/25/202709.html</guid><description><![CDATA[最近工作不是很忙，就花时间在各个技术社区转了转。<br />
最大的感触就是我们的技术土壤真的很肥沃，各个社区都有踊跃的参与者，和耐心的解答者。这种踊跃和耐心将对我们的技术环境有很好的沉淀作用。只有这种良性的沉淀才能让中国的技术绽放美丽的创新之花。<br />
不过同时，我也发现了一些浮躁的用心不纯的踊跃参与者，他们来这些社区好像就是为了排名和点击率，所发的大部分文章都是抄袭而来，而且抄袭还不做转载说明，利用抄袭的效率来换取名气，然后利用名气开始笼络人气，笼络人气的最终目的是为了寻找可以给自己带来利益的项目和点子，此等用心叵测之人也真难为他来做技术了。<br />
我只希望来技术社区的朋友们都是保持自己的纯，我们来这里是为了学习，讨论，分享的。中国的技术需要的是脚踏实地踏踏实实，一步一个脚印。你可以发表不是很成熟的观点，若是不完整大家可以补充，若是错误的大家可以帮你纠正，但是你要是就是天天看别人的文章然后一字不改的copy过来赚眼球，那么恕我直言，你在浪费我们的互联网资源。哪怕你把对方的文章重新整理一下，加上自己的实际见解这都是会让我们竖起大拇指的，因为你在这个知识的传递过程中创造了价值。<br />
最后，我觉得我们所有做技术的人都应该再次真诚的感谢我们技术社区的原创作家，有了大家中国的技术才能踏踏实实越飞越高。
<img src ="http://shenzhen.blogjava.net/aggbug/202709.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rocket/" target="_blank">rocket</a> 2008-05-25 13:13 <a href="http://www.blogjava.net/rocket/archive/2008/05/25/202709.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>敏捷项目管理之探索阶段做法</title><link>http://www.blogjava.net/rocket/archive/2008/05/25/202706.html</link><dc:creator>rocket</dc:creator><author>rocket</author><pubDate>Sun, 25 May 2008 04:28:00 GMT</pubDate><guid>http://www.blogjava.net/rocket/archive/2008/05/25/202706.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 探索阶段实际上就是我们所谓的实现阶段了，敏捷对于这个阶段的定位与瀑布不同，瀑布认为探索阶段其实就是按照原定计划固定实现过程的阶段，但是实际上对于软件这种脑力工程，是没有办法和造房子一样按部就班的实现的。多少年来把建筑工程经验错误的应用到了软件工程之上，让我们一直忽略了一个本质问题：做软件是一个摸石头过河的过程。&nbsp;&nbsp;<a href='http://www.blogjava.net/rocket/archive/2008/05/25/202706.html'>阅读全文</a><img src ="http://shenzhen.blogjava.net/aggbug/202706.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rocket/" target="_blank">rocket</a> 2008-05-25 12:28 <a href="http://www.blogjava.net/rocket/archive/2008/05/25/202706.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>敏捷项目管理之推测阶段做法 </title><link>http://www.blogjava.net/rocket/archive/2008/05/24/202534.html</link><dc:creator>rocket</dc:creator><author>rocket</author><pubDate>Sat, 24 May 2008 01:08:00 GMT</pubDate><guid>http://www.blogjava.net/rocket/archive/2008/05/24/202534.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 摘要: 敏捷方法把项目分为3个主要阶段：构想阶段，推测阶段，探索阶段。每个阶段都有自己的目标和过程方法。分清各个阶段的行为，将会更好的掌控项目的进度。&nbsp;&nbsp;<a href='http://www.blogjava.net/rocket/archive/2008/05/24/202534.html'>阅读全文</a><img src ="http://shenzhen.blogjava.net/aggbug/202534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rocket/" target="_blank">rocket</a> 2008-05-24 09:08 <a href="http://www.blogjava.net/rocket/archive/2008/05/24/202534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DEV2DEV TECHDAYS SOA 体会二</title><link>http://www.blogjava.net/rocket/archive/2008/05/22/202279.html</link><dc:creator>rocket</dc:creator><author>rocket</author><pubDate>Thu, 22 May 2008 14:52:00 GMT</pubDate><guid>http://www.blogjava.net/rocket/archive/2008/05/22/202279.html</guid><description><![CDATA[<p><font style="background-color: #cce8cf">面向服务的8个原则<br />
服务可复用 不管是否存在即时复用的机会，服务被设计为支持潜在可复用。<br />
服务共享一个正式契约 为了与服务交互，只需要共享描述每个服务信息交换术语定义的正式契约。<br />
服务是松散耦合的 服务被设计为无需紧密的、跨服务的依赖而交互。<br />
服务是底层逻辑的抽象 只有经由服务契约所暴露的部分服务对于外部世界是可见的。契约之外所表达的底层逻辑是不可见的，且与服务请求者无关。<br />
服务是可组合的 服务可能组合其他服务。这允许表示不同粒度的逻辑，并促进复用及抽象层的创建。<br />
服务是自治的 逻辑由服务所控制，并位于一个清晰的边界内。服务已经在这个边界内被控制，并且不依赖于执行其控制的其他服务。<br />
服务是无状态的 服务应当不需要管理状态信息，因此能够其维持松耦合性。服务应当尽可能设计成无状态的，即便这意味着要将状态管理移至别处。<br />
服务是可发现的 服务应当允许其描述被发现，并被人工和可能会利用其逻辑的服务请求者所理解。<br />
这个8个面向服务的原则乍看很像我们熟悉的OOP啊，不过如果你把一个服务抽象成一个对象来看的话也就不难理解了。<br />
下面介绍一下依据这8个原则构建的SOA的各个服务层： <br />
1、连通性服务层<br />
所谓的连通性是指对于原有系统的数据连通，由于原有系统不能提供一个具有通用性的数据服务，所以在连通性服务层的主要任务就是负责把原来已有的JDBC的，EJB的，webService的各种数据服务，封装成具有统一标准的java pojo控件，然后其它的就可以方便，简单的实现对数据服务的调用。<br />
连通性服务层：<br />
服务对象：需要获得数据的对象&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如业务层、表示层等<br />
提供服务：可以操作原有系统的数据层&nbsp;&nbsp; 如对一个sap服务器进行操作、对一个DB服务器进行操作邓<br />
调用资源：原有系统的数据服务接口&nbsp;&nbsp;&nbsp;&nbsp; 如EJB、Hibernate，JDBC等<br />
图1：<img height="326" alt="" src="http://www.blogjava.net/images/blogjava_net/rocket/ConnectService.png" width="425" border="0" /><br />
在这里值得一提的是bea在使用workshop对于连通性服务层创建，非常简单，完全图形化的方式，只需简单的鼠标拖曳，就可以实现服务控件的建立。<br />
2、业务流程服务层<br />
我们知道一般的业务系统都会有一些自由的业务流程的，那么如何让这些原有的业务流程来提供给SOA系统使用呢？<br />
在bea专家给我们演示的demo中，我看到bea的做法是把每一个流程节点封装成了服务，这样，这些流程节点每个都可以成为一个向外提供服务的服务者了。<br />
业务流程服务层：<br />
服务对象：需要流程控制的对象&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如其他业务层，表示层等<br />
提供服务：业务流程控制&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如从a入口进入后是应该去b节点还是应该去c节点<br />
调用资源：通常是连通性服务层的服务&nbsp;&nbsp; <br />
图2：<img alt="" src="http://www.blogjava.net/images/blogjava_net/rocket/BusinessBus.png" border="0" /><br />
在bea演示的时候对于业务流程服务层的构建依然采用的是图形化的方式，这里值得称道的是在使用图形化的过程中，bea的工具还可以支持对于服务的格式转换<br />
3、服务中介层&nbsp;&nbsp; <br />
上面已经介绍了两种服务层了，在soa中这两层的调用不是简单的上下层关系。在实际项目中，也许有的需求是需要流程控制的，但是也许有些需求是直接要求展示数据的，那么如何处理这两种的需求呢。这里就是在soa中最重要的一个层了，服务中介层。很多人应该听过soa中service bus这个概念。我之前一直理解为服务总线仅仅是为客户端提供服务的，其实是不对的，实际上服务总线是一个用了穿起来各个服务层的，就好比是一个糖葫芦，服务中介层就是中间的那根棍子。<br />
图3：<img height="338" alt="" src="http://www.blogjava.net/images/blogjava_net/rocket/serviceBus.png" width="725" border="0" /><br />
做为服务中介层来说，主要有两种服务，一种是应用服务；另外一个是代理服务，用来对应用服务进行代理封装的，是服务总线中向外暴露的服务。<br />
4、表示层服务层<br />
表示层服务主要和不同的客户端有关，bea在这里的讲述中由于时间紧张所以比较简单。重点还是在演示他们可视化得页面编辑。但是这里有点给我洗脑得就是，对于不同的客户端所提供的服务是直接可以使用的，比如判断一个用户名是否合法，表示层服务不是返回的true，false，而是直接返回，&#8220;该用户名可用&#8221;，&#8220;该用户名已被占用&#8221;这样的字符串。<br />
关于表示层我就不再画图了，最后是一个整体的soa层次结构图：<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/rocket/SOA.jpg" border="0" /><br />
</font></p>
<p><font style="background-color: #cce8cf"><br />
</font>&nbsp;</p>
<img src ="http://shenzhen.blogjava.net/aggbug/202279.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rocket/" target="_blank">rocket</a> 2008-05-22 22:52 <a href="http://www.blogjava.net/rocket/archive/2008/05/22/202279.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DEV2DEV TECHDAYS SOA 体会一</title><link>http://www.blogjava.net/rocket/archive/2008/05/14/200448.html</link><dc:creator>rocket</dc:creator><author>rocket</author><pubDate>Wed, 14 May 2008 10:09:00 GMT</pubDate><guid>http://www.blogjava.net/rocket/archive/2008/05/14/200448.html</guid><description><![CDATA[<p><font style="background-color: #cce8cf">首先先说一些闲话：这次bea的dev2dev techDays依然是在讲现在bea公司的主攻领域soa，估计这也是oracle之所以收购bea的一个原因吧。<br />
会议的地点依然是每次雷打不动的圣庭苑酒店，会议的主办方也组织的很好，为了能让参与者对bea的相关技术和产品感兴趣，bea也是准备了丰富的奖品，有笔，有T恤，还有5个workshop的licence，最引人注目就是最后抽奖的一个iphone，做为一个免费会议来说，这些东西却是很丰富了，但是要是考虑到bea主要是为了推它的SOA产品Workshop 10.2这个售价高达1000多美元的怪物来说，也就不觉得贵了：）。<br />
1、SOA起源<br />
这些年为了提高办公效率，企业和政府都在努力追求着一个看似很甜的棒棒糖：信息化。但是由于信息化的方式多种多样，这样就造成了在一个企业内部有多套信息化的系统。财务是买来的财务软件，行政使用免费的行政软件，销售是请人来研发的销售系统。然后各个部门发现，原来自己虽然信息化了，但是实际上只是一个信息孤井，自己的信息系统没有办法接受别的部门的信息，而自己的信息也没有办法传递到其他部门去。这样公司的领导就不高兴了，你们都要信息化，无纸办公，结果现在信息化的比优质办公还麻烦，都给我统统统一起来。开始的时候有人想到重做一套整体的信息系统，把所有部门都包含进去不就可以了，但是这方案代价太高了。于是呢就有人提出了这样的想法，其实每个系统都是为每个部门或者其他部门提供服务的，那么我们就把这些服务给抽象出来进行统一管理吧，然后让所有的部门都只面对这些抽取的服务，而不是单一的系统，这样soa的概念就渐渐浮出水面了。<br />
2、服务的概念，以及SOA基本架构<br />
SOA中最核心的就是服务了，所以我们首先应该明确一下服务这个概念。用毛主席最经典的一句话：为人民服务。这里我们可以看出，抽象的服务概念有两个基本的要素：1是服务对象，2是可以提供什么。超市收银员的服务对象是顾客，可以提供的是算钱收钱；公安局的服务对象是市民，可以提供的是解决你解决不了的难题。；你的心脏的服务对象是血液，可以提供的是给血液加养分；等等。所以来说任何一个对象都是一个服务提供者（当然任何一个对象也将是一个服务接受者，对于服务接受这里不再详细讨论）。<br />
根据一个信息系统本身固有的几个层次为了让各个层次的职责更加清晰，而且也是为了在调用服务的时候更加统一SOA的一个基本架构是这样的：<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SOA系统架构<br />
企业原有业务系统的存储层&nbsp;&nbsp; --〉&nbsp;&nbsp;&nbsp; [把这层封装成SOA的连通服务层]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
</font><font style="background-color: #cce8cf">企业原有业务系统的业务层&nbsp;&nbsp; --〉&nbsp;&nbsp;&nbsp; [把这层封装成SOA的业务流程服务层]</font></p>
<p><font style="background-color: #cce8cf">企业原有业务系统的应用层&nbsp;&nbsp; --〉&nbsp;&nbsp;&nbsp; [根据上层抽象出来的统一服务进行调用并在各种应用前台]<br />
<br />
然后专门隔离出来一个服务中介层，也就是一条服务总线来把所有的服务进行统一管理<br />
</font></p>
<img src ="http://shenzhen.blogjava.net/aggbug/200448.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rocket/" target="_blank">rocket</a> 2008-05-14 18:09 <a href="http://www.blogjava.net/rocket/archive/2008/05/14/200448.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Software caused connection abort: recv failed 的解决办法</title><link>http://www.blogjava.net/haix/archive/2008/04/23/194939.html</link><dc:creator>haix</dc:creator><author>haix</author><pubDate>Wed, 23 Apr 2008 01:20:00 GMT</pubDate><guid>http://www.blogjava.net/haix/archive/2008/04/23/194939.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/haix/archive/2008/04/23/194939.html'>阅读全文</a><img src ="http://shenzhen.blogjava.net/aggbug/194939.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/haix/" target="_blank">haix</a> 2008-04-23 09:20 <a href="http://www.blogjava.net/haix/archive/2008/04/23/194939.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>eclipse的第一个struts2插件：Alveole Studio MVC Web Project An eclipse plugin for Struts 2</title><link>http://www.blogjava.net/apple0668/archive/2008/04/21/194576.html</link><dc:creator>apple0668</dc:creator><author>apple0668</author><pubDate>Mon, 21 Apr 2008 10:12:00 GMT</pubDate><guid>http://www.blogjava.net/apple0668/archive/2008/04/21/194576.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: eclipse的第一个struts2插件：Alveole Studio MVC Web Project An eclipse plugin for Struts 2，感觉还可以，大家感兴趣去用一下。&nbsp;&nbsp;<a href='http://www.blogjava.net/apple0668/archive/2008/04/21/194576.html'>阅读全文</a><img src ="http://shenzhen.blogjava.net/aggbug/194576.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/apple0668/" target="_blank">apple0668</a> 2008-04-21 18:12 <a href="http://www.blogjava.net/apple0668/archive/2008/04/21/194576.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>江湖救急，关于Software caused connection abort: recv failed问题，一直解决不了，请街坊邻居指教和观光看一下</title><link>http://www.blogjava.net/haix/archive/2008/04/21/194549.html</link><dc:creator>haix</dc:creator><author>haix</author><pubDate>Mon, 21 Apr 2008 09:04:00 GMT</pubDate><guid>http://www.blogjava.net/haix/archive/2008/04/21/194549.html</guid><description><![CDATA[爆出异常;<br />
<br />
java.net.SocketException: Software caused connection abort: recv failed<br />
<br />
代码如下:<br />
&nbsp;&nbsp;&nbsp; public byte[] getRecord(InputStream&nbsp; inputStream,String simid)<br />
&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; byte[] singleByte = new byte[1];&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int i=0;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while ((inputStream.read(singleByte)) != -1)&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int tmp = Utils.toInt(singleByte[0]);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return new byte[]{0x00};<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; catch(Exception ex)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println(ex.getMessage());&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return new byte[]{0x00};<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; socketClient = new Socket("***.***.***.***",9100);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; output = socketClient.getOutputStream();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; output.write(LoginData);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; output.write(sendBytes);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; is = socketClient.getInputStream();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; GpsSocket gsIns = new GpsSocket();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; byte[] set = gsIns.getRecord(is,tmp[0]);<br />
<br />
我已经通过Google 搜索N次，相关url<br />
<a title="http://forum.java.sun.com/thread.jspa?threadID=430179&amp;messageID=4429682" href="http://forum.java.sun.com/thread.jspa?threadID=430179&amp;messageID=4429682">http://forum.java.sun.com/thread.jspa?threadID=430179&amp;messageID=4429682</a><br />
<a>http://www.microsoft.com/communities/newsgroups/en-us/default.aspx?dg=microsoft.public.sqlserver.jdbcdriver&amp;cat=en_US_22326e25-7529-45bb-a7af-96ec8a2601d7&amp;lang=en&amp;cr=US&amp;sloc=&amp;p=1&amp;mid=e16de076-5fda-4ddb-9386-14f3ce2e1dfc&amp;tid=e16de076-5fda-4ddb-9386-14f3ce2e1dfc</a><br />
<br />
目前问题还没有解决，不知道因为什么<br />
!<br />
<br />
谢谢大家!@<br />
<br />
<img src ="http://shenzhen.blogjava.net/aggbug/194549.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/haix/" target="_blank">haix</a> 2008-04-21 17:04 <a href="http://www.blogjava.net/haix/archive/2008/04/21/194549.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring2.5.3+Hibernate3.2+Struts2.0.11整合</title><link>http://www.blogjava.net/bulktree/archive/2008/04/18/194021.html</link><dc:creator>凌晨风</dc:creator><author>凌晨风</author><pubDate>Fri, 18 Apr 2008 05:59:00 GMT</pubDate><guid>http://www.blogjava.net/bulktree/archive/2008/04/18/194021.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 只有Struts2基础（初学Hibernate/Spring第三天就想着整合），有些地方不是很懂，看了网上大部分的例子、blog，百分百的MyEclipse插件，本人不太习惯使用MyEclipse，主要是Eclipse使用的时间比较长，使用MyEclipse6.0.1时（第一次用）比如你要输入.getHibernateTemplate()时，输入点时就有提示，但是当我输入点后面的字母出错时，只能返回到输入点之前才按点“.”可以提示，按ALT+/也不会出现，是不是我不知道快捷键，或是其它的方式，总之我在Eclipse中输入一半错误时按ALT+/可以又出来提示，虽然不是特依赖提示功能，但是用起来还是不爽，毕竟每天都在使用它，哪位要是知道的话烦请告诉一声bulktree@126.com&nbsp;&nbsp;<a href='http://www.blogjava.net/bulktree/archive/2008/04/18/194021.html'>阅读全文</a><img src ="http://shenzhen.blogjava.net/aggbug/194021.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bulktree/" target="_blank">凌晨风</a> 2008-04-18 13:59 <a href="http://www.blogjava.net/bulktree/archive/2008/04/18/194021.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JFreeChart简单使用</title><link>http://www.blogjava.net/bulktree/archive/2008/04/18/193939.html</link><dc:creator>凌晨风</dc:creator><author>凌晨风</author><pubDate>Fri, 18 Apr 2008 01:29:00 GMT</pubDate><guid>http://www.blogjava.net/bulktree/archive/2008/04/18/193939.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: JFreeChart is a free chart library for Java that can generate a wide variety of charts for use in applications, applets and servlets.<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/bulktree/archive/2008/04/18/193939.html'>阅读全文</a><img src ="http://shenzhen.blogjava.net/aggbug/193939.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bulktree/" target="_blank">凌晨风</a> 2008-04-18 09:29 <a href="http://www.blogjava.net/bulktree/archive/2008/04/18/193939.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用commons-email-1.1.jar实现发邮件功能:</title><link>http://www.blogjava.net/bulktree/archive/2008/04/07/191170.html</link><dc:creator>凌晨风</dc:creator><author>凌晨风</author><pubDate>Mon, 07 Apr 2008 01:47:00 GMT</pubDate><guid>http://www.blogjava.net/bulktree/archive/2008/04/07/191170.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 今天在Apache网站上下载commons-lang jar文件时突然看到commons-email-1.1.jar这个项目jar文件，看了看user guide确实比JDK提供的好多了，简单的几行代码就实现了发邮件的功能，以前实现过一个纯JavaMail带附件发邮件功能，代码复杂不说，现在回过头来都懒得看（主要是WEB项目注释少）。<br>	贴上TEST代码看看，简单、清晰。只要稍加修改（邮件服务器地址、名称、密码）就可以了<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/bulktree/archive/2008/04/07/191170.html'>阅读全文</a><img src ="http://shenzhen.blogjava.net/aggbug/191170.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bulktree/" target="_blank">凌晨风</a> 2008-04-07 09:47 <a href="http://www.blogjava.net/bulktree/archive/2008/04/07/191170.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2中select/doubleselect标签数据显示</title><link>http://www.blogjava.net/bulktree/archive/2008/04/02/190257.html</link><dc:creator>凌晨风</dc:creator><author>凌晨风</author><pubDate>Wed, 02 Apr 2008 00:46:00 GMT</pubDate><guid>http://www.blogjava.net/bulktree/archive/2008/04/02/190257.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 最近做毕业设计用到Struts2 的标签库，遇到一些比较复杂的数据显示，个人还是比较喜欢用tag显示的，Struts2 tags内容丰富，但是所提供的文档不是很详细（个人认为）在showcase下的例子如:<s:select />  <s:doubleselect />  <s:updownselect />  <s:optiontransferselect />等都是一些简单的值显示，在实际的开发中并没有那么简单，如果我们要迭代显示List、Map、Set里的值，我们该怎样做呢？&nbsp;&nbsp;<a href='http://www.blogjava.net/bulktree/archive/2008/04/02/190257.html'>阅读全文</a><img src ="http://shenzhen.blogjava.net/aggbug/190257.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bulktree/" target="_blank">凌晨风</a> 2008-04-02 08:46 <a href="http://www.blogjava.net/bulktree/archive/2008/04/02/190257.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POSTGIS常用函数</title><link>http://www.blogjava.net/agun/archive/2008/03/24/188289.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Mon, 24 Mar 2008 08:46:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2008/03/24/188289.html</guid><description><![CDATA[<p><span style="color: red">Management Functions </span></p>
<p><span style="color: red">1,基本操作函数</span></p>
<p><br />
<span style="color: #00ff00">AddGeometryColumn(&lt;schema_name&gt;, &lt;table_name&gt;, &lt;column_name&gt;, &lt;srid&gt;, &lt;type&gt;, &lt;dimension&gt;)</span><br />
给一个已存在属性数据表增加一个几何字段(geomtry column)。schema_name 指表的模式的名字，srid 必须是一个整数指对应于 SPATIAL_REF_SYS 表，type必须是一个大写的字符串，用来描述几何类型，例如：'POLYGON' 或者 'MULTILINESTRING'。</p>
<p><span style="color: #00ff00">DropGeometryColumn(&lt;schema_name&gt;, &lt;table_name&gt;, &lt;column_name&gt;)</span><br />
从一个空间数据表中删除一个几何字段。</p>
<p><span style="color: #00ff00">ST_SetSRID(geometry, integer)</span><br />
给一个几何对象(geometry)设置一个整型的SRID，对于在一个范围内的查询非常有用。&nbsp;<br />
&nbsp; <br />
<span style="color: #ff0000">2. Geometry Relationship Functions <br />
&nbsp;&nbsp; 几何空间数据关系函数 </span></p>
<p><span style="color: #00ff00">ST_Distance(geometry, geometry) </span><br />
返回两个几何对象的距离（笛卡儿距离），不使用索引。&nbsp;<br />
&nbsp; <br />
<span style="color: #00ff00">ST_DWithid(geometry, geometry, float) </span><br />
如果一个几何对象(geometry)在另一个几何对象描述的距离(float)内，返回TRUE。如果有索引，会用到索引。 <br />
<br />
<span style="color: #00ff00">ST_Equals(geometry, geometry)</span><br />
如果两个空间对象相等，则返回TRUE。用这个函数比用&#8220;=&#8221;更好，例如：<br />
equals('LINESTRING(0 0, 10 10)','LINESTRING(0 0, 5 5, 10 10)') 返回 TRUE。</p>
<p><span style="color: #00ff00">ST_Disjoint(geometry, geometry)</span><br />
如果两个对象不相连，则返回TRUE。不要使用GeometryCollection作为参数。<br />
<br />
<span style="color: #00ff00">ST_Intersects(geometry, geometry)</span><br />
判断两个几何空间数据是否相交,如果相交返回true,不要使用GeometryCollection作为参数。<br />
Intersects(g1, g2 ) --&gt; Not (Disjoint(g1, g2 ))<br />
不使用索引可以用_ST_Intersects.</p>
<p><span style="color: #00ff00">ST_Touches(geometry, geometry)</span><br />
如果两个几何空间对象存在接触，则返回TRUE。不要使用GeometryCollection作为参数。<br />
a.Touches(b) -&gt; (I(a) intersection I(b) = {empty set} ) and (a intersection b) not empty<br />
不使用索引可以用_ST_Touches.</p>
<p><span style="color: #00ff00">ST_Crosses(geometry, geometry)</span><br />
如果两个几何空间对象存在交叉，则返回TRUE。不要使用GeometryCollection作为参数。<br />
不使用索引可以用_ST_Crosses.</p>
<p><span style="color: #00ff00">ST_Within(geometry A, geometry B)</span><br />
如果几何空间对象A存在空间对象B中,则返回TRUE,不要使用GeometryCollection作为参数。<br />
不使用索引可以用_ST_Within</p>
<p><span style="color: #00ff00">ST_Overlaps(geometry, geometry)<br />
</span>如果两个几何空间数据存在交迭,则返回 TRUE,不要使用GeometryCollection作为参数。<br />
不使用索引可以用_ST_Overlaps.</p>
<p><span style="color: #00ff00">ST_Contains(geometry A, geometry B)</span><br />
如果几何空间对象A包含空间对象B,则返回 TRUE,不要使用GeometryCollection作为参数。<br />
这个函数类似于ST_Within(geometry B, geometry A)<br />
不使用索引可以用_ST_Contains.</p>
<p><span style="color: #00ff00">ST_Covers(geometry A, geometry B)<br />
</span>如果几何空间对象B中的所有点都在空间对象A中,则返回 TRUE。<br />
不要使用GeometryCollection作为参数。<br />
不使用索引可以用_ST_Covers.</p>
<p><span style="color: #00ff00">ST_CoveredBy(geometry A, geometry B)</span><br />
如果几何空间对象A中的所有点都在空间对象B中,则返回 TRUE。</p>
<p><span style="color: #ff0000">3,Geometry Processing Functions<br />
几何空间数据处理函数</span></p>
<p><span style="color: #00ff00">ST_Centroid(geometry)</span><br />
返回质心点,就是根据几何空间数据,活动该几何空间数据的中心点,返回一个空间点数据.</p>
<p><span style="color: #00ff00">ST_Area(geometry)</span><br />
如果几何空间数据为多边形,或者多多边形,则返回空间数据的外围(返回类型double precision) ;</p>
<p><span style="color: #00ff00">ST_Length(geometry)</span><br />
这个曲线在其相关的空间参考长度(返回类型double precision) ;</p>
<p><span style="color: #00ff00">ST_PointOnSurface(geometry)</span><br />
一定在几何空间线数据上的点，返回一个数据点<span style="color: #00ff00"></p>
<p><font style="background-color: #c7edcc">ST_Buffer(geometry, double, [integer])<br />
<span style="color: #000000">buffer操作一个很有用函数，<br />
这个函数的第一个参数是要操作的空间几何数据，第二个参数长度（距离），第三个参数为一个整型，<br />
这个函数返回一个空间数据类型，以当前第一个参数空间几何数据为参考点，返回小于等于距离的空间</span></font></p>
<p><span style="color: #000000">几何数据点，最后由这些点组成一个多边形空间数据，最后一个参数表示<br />
在组成一个1/4圆的有几个点分隔。也就是说如果最好一个参数为8那么这个最后组成的多边形就是32边</span></p>
<p><span style="color: #000000">的多边形，如果不指定这个参数，系统默认的是8<br />
注意：第二个参数，距离它的单位为空间数据单位（度），在运算时需要进行单位换算，最后转换成度</span></p>
<p><span style="color: #000000">，单位的换算关系如下：<br />
1英里= 63360 米<br />
1米=1/1852 海里<br />
1海里= 1/60度<br />
如果要进行具体的运算，需要进行一下单位换算，比如要求一个500米的范围，那么应该是</span></p>
<p><span style="color: #000000">500*1/1852*1/60（度）</span></p>
<p><font style="background-color: #c7edcc">ST_Envelope(geometry)<br />
<span style="color: #000000">这个函数可以返回mbr(空间最小外包矩形)，传入参数可以是point line polygon。</span></font></p>
<p><font style="background-color: #c7edcc"><br />
ST_extent(geometry set)<br />
<span style="color: #000000">这个函数可以对一个空间数据集进行操作，返回一个最小包含矩形（mbr）.<br />
如：SELECT EXTENT(GEOM) FROM GEOMTABLE GROUP BY CATEGORY<br />
</span></font></p>
<p><br />
ST_Difference(geometry A, geometry B)</span><br />
返回一个几何空间数据A不同于空间数据B的几何空间数据类型，不要使用GeometryCollection作为参数。<br />
也就是说，如果A为一个line,B也为一个line，那么他们返回的类型就是B把A分割的多线。<br />
如：<br />
select ST_AsEWKT(ST_Difference(geomfromText('LINESTRING(1 1,2 3,3 4,3 1)'),geomfromText('LINESTRING(2 0,2 2,5 2,3 1)')))<br />
返回的MULTILINESTRING((1 1,2 3,3 4,3 2),(3 2,3 1))<br />
如果是A和B都是一个POLYGON多边形，那么返回的就是多多边形，如果相交，那么返回的就是B把A分割，并且不再B中的多多边形。<br />
select ST_AsEWKT(ST_Difference(geomfromText('POLYGON((1 1,2 3,3 4,3 1,1 1))'),geomfromText('POLYGON((2 0,2 2,5 2,1 3,2 0))')))</p>
<p><span style="color: #00ff00">ST_Union(geometry, geometry)</span><br />
返回一个合并的几何空间数据，将两个几何空间数据合并为一个几何空间数据，或者GeometryCollection，不要使用GeometryCollection作为参数。</p>
<p><br />
<span style="color: #ff0000">4 ，Geometry Accessors</span></p>
<p><span style="color: #00ff00">ST_AsText(geometry)</span><br />
将几何空间数据，转换成容易理解的空间数据文本格式，<br />
例如：<br />
(0,0 0,1 1,1 1,0 0,0)<br />
转换后应该是这样的结果 POLYGON(0 0,0 1,1 1,1 0,0 0)</p>
<p><span style="color: #00ff00">ST_SRID(geometry)</span><br />
返回当前几何空间数据的SRID值</p>
<p><span style="color: #00ff00">ST_IsClosed(geometry)</span><br />
判断几何空间数据是否是闭合，就是判断起始点和终点坐标是相同的，如果是相同的返回true,否则返回false.</p>
<p><span style="color: #00ff00">ST_IsRing(geometry)</span><br />
这个函数参数的对象是line，判断起始点和终点坐标是否相同，<br />
如果闭合(这个曲线除了起始点和终点相同外，没有其他相交点)怎返回true,否则false,</p>
<p><span style="color: #00ff00">ST_NumPoints(geometry)</span><br />
返回几何空间数据lineString上的第一条线上点的个数。</p>
<p><br />
<span style="color: #00ff00">GeometryType(geometry)</span><br />
判断几何空间数据的类型。<br />
例如<br />
select GeometryType(geomfromText('MULTILINESTRING((1 1,2 3,3 4,3 1,2 1,1 1),(1 2,2 3,4 5))'))<br />
返回的类型为 MULTILINESTRING。</p>
<p><br />
&nbsp;</p>
<img src ="http://shenzhen.blogjava.net/aggbug/188289.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2008-03-24 16:46 <a href="http://www.blogjava.net/agun/archive/2008/03/24/188289.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源软件逐渐走进了我的生活</title><link>http://www.blogjava.net/bulktree/archive/2008/03/18/187102.html</link><dc:creator>凌晨风</dc:creator><author>凌晨风</author><pubDate>Tue, 18 Mar 2008 13:58:00 GMT</pubDate><guid>http://www.blogjava.net/bulktree/archive/2008/03/18/187102.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 软件的开源替代品&nbsp;&nbsp;<a href='http://www.blogjava.net/bulktree/archive/2008/03/18/187102.html'>阅读全文</a><img src ="http://shenzhen.blogjava.net/aggbug/187102.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bulktree/" target="_blank">凌晨风</a> 2008-03-18 21:58 <a href="http://www.blogjava.net/bulktree/archive/2008/03/18/187102.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>How to Write Doc Comments for the Javadoc Tool</title><link>http://www.blogjava.net/haix/archive/2008/03/13/186049.html</link><dc:creator>haix</dc:creator><author>haix</author><pubDate>Thu, 13 Mar 2008 07:10:00 GMT</pubDate><guid>http://www.blogjava.net/haix/archive/2008/03/13/186049.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: source:http://java.sun.com/j2se/javadoc/writingdoccomments/index.html注释的重要性我想大家应该可以感受得到，一维护，二可读性，三最自己好（可以直接找到这个方法类属性的解释),那么怎么书写,怎么书写JAVA注释,虽然是English，虽然是转载，还是推荐阅读一下,静下心，细细阅读，慢慢品尝&lt;br/&gt;下图为...&nbsp;&nbsp;<a href='http://www.blogjava.net/haix/archive/2008/03/13/186049.html'>阅读全文</a><img src ="http://shenzhen.blogjava.net/aggbug/186049.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/haix/" target="_blank">haix</a> 2008-03-13 15:10 <a href="http://www.blogjava.net/haix/archive/2008/03/13/186049.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>每日点滴积累</title><link>http://www.blogjava.net/rocket/archive/2008/03/05/183924.html</link><dc:creator>rocket</dc:creator><author>rocket</author><pubDate>Wed, 05 Mar 2008 04:11:00 GMT</pubDate><guid>http://www.blogjava.net/rocket/archive/2008/03/05/183924.html</guid><description><![CDATA[记录点滴经验，汇聚知识汪洋<br />
<br />
1、单元测试时对测试目标的明确。<br />
最近对单元测试时明确测试目标有了新的想法，就是在对目标类进行测试时一定要明确目标类的作用究竟是什么。<br />
比如说对于一个5层结构的系统来说：数据库，DAO，BL，control，JSP<br />
其中数据库和JSP的单元测试代价是比较高的，所以不考虑测试。<br />
DAO的目标是从数据库获取数据，所以可以使用内存数据库或者真实数据库等方法直接进行测试，这点通常没有争议<br />
BL层的目标是对业务逻辑的封装，这个层的测试通常是比较有争议的，要明确它仅仅是调用DAO并进行业务封装，所以只需要对它以来的DAO进行模拟，然后测试是否正确封装就可以了。<br />
control层的目标是根据请求进行跳转，所以这个层的测试方法是，模拟请求对象和BL，然后检查是否正确的调用BL以及正确的跳转。<br />
<br />
2、当不好倒转依赖时进行依赖模拟的小技巧。<br />
情景环境：我的BL层在对DAO层的依赖关系上没有使用比较灵活的依赖反转方法（这个是历史原因^_^）,这时候就对我在测试时对DAO的模拟上造成了一定的困扰。<br />
解决办法：但是所谓办法总是能像出来的吗，我把BL调用到DAO的地方封装成一个统一的方法，然后在BL中定义一个Map，这个Map是可以从外部进行set的，然后在统一调用DAO的方法中判断，如过map中有设置就获取map的，如果map中没有就获取原来紧密耦合的DAO，这样就可以在测试的时候从外部注入模拟的DAO了。
<img src ="http://shenzhen.blogjava.net/aggbug/183924.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rocket/" target="_blank">rocket</a> 2008-03-05 12:11 <a href="http://www.blogjava.net/rocket/archive/2008/03/05/183924.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为筹划第一次深圳JAVA俱乐部活动以及研讨会收集联系方式，方便通知</title><link>http://www.blogjava.net/haix/archive/2008/03/01/183113.html</link><dc:creator>haix</dc:creator><author>haix</author><pubDate>Sat, 01 Mar 2008 03:10:00 GMT</pubDate><guid>http://www.blogjava.net/haix/archive/2008/03/01/183113.html</guid><description><![CDATA[&nbsp;<br />
<br />
欢迎加入深圳JAVA俱乐部 <br />
如果大家方便的话，请按以下格式发邮件给我们提供自己的联系信息。 <br />
最好有： <br />
姓名：(方便认识) <br />
邮件：(不用说了，主要沟通渠道) <br />
MSN：(同上) <br />
BLOG：(没有的话可以在这里申请) <br />
地址：(可能会邮寄资料，所以留详细通讯地址最好，还有请说明住在哪个区，组织活动时用得着) <br />
熟悉的JAVA技术领域：(能让我们的技术交流更有针对性) <br />
联系电话：(方便的话请留一个，俱乐部外不会公开) <br />
请提供以上信息发送邮件给shshop@gmail.com，谢谢！
<img src ="http://shenzhen.blogjava.net/aggbug/183113.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/haix/" target="_blank">haix</a> 2008-03-01 11:10 <a href="http://www.blogjava.net/haix/archive/2008/03/01/183113.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>敏捷实施步骤与价值观</title><link>http://www.blogjava.net/rocket/archive/2008/02/28/182747.html</link><dc:creator>rocket</dc:creator><author>rocket</author><pubDate>Thu, 28 Feb 2008 08:51:00 GMT</pubDate><guid>http://www.blogjava.net/rocket/archive/2008/02/28/182747.html</guid><description><![CDATA[<p><font style="background-color: #cce8cf">敏捷的首要价值观: 拥抱变化。<br />
一、分析需求为用户故事。<br />
方法：做为（用户角色），我可以（做什么），以便（业务价值）。后面的业务价值在比较简单或者大家都比较明确的时候刻意不需要注明。<br />
价值观：1、让需求独立，方便理解，分析以及实现<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、明确需求的业务价值<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、快捷增加，删除，变更用户故事</font></p>
<p><font style="background-color: #cce8cf">二、对用户故事估计<br />
方法：在估计会议上，主持人拿出一个用户故事，大家对这个用户故事分，最后取平均值<br />
价值观：1、估计是对实现规模的相对估计，不是对实际耗费资源的度量估计，因为实际的偏差可能比较大。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、当某人的估计偏差较大时，说明对故事的理解上出现了一定的问题，这时是消除理解误差的好时机<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、估计值不是一成不变的，当实际实现过程中发现问题时需要对该故事以及关联的故事尽心重估</font></p>
<p><font style="background-color: #cce8cf">三、优先级调查<br />
方法：使用每个故事的功能存在问题和功能缺失问题进行调查。根据结果统计得出该故事的优先级：基本需求、线性需求、兴奋点需求、反对需求、疑问需求、无所谓需求<br />
价值观：1、通过有效调查量化的方法来划分需求的级别，目的是为了<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、优先级不是一成不变的，随着对业务了解的不断深入，以及产品的发展会对优先级进行修正</font></p>
<p><font style="background-color: #cce8cf">四、发布规划<br />
方法：首先要确定的是迭代周期的长度，以周为单位，然后估计出每个迭代周期团队的速度。然后可以从用户故事池中选择出合适的用户故事来填充到第一次和第二次的迭代周期中。其余的暂时可以先不用填充，随着每次迭代周期的完成来对发布计划进行更新。最后根据估计的速度和需要开发的故事来确定需要几个迭代周期，并最终有几个迭代周期来确定需要开发的时间周期。<br />
发布计划可以以功能来驱动进行，也可以以日期来驱动进行。<br />
价值观：1、以月做为时间范围，规划对象是用户故事，估计的单位是故事点<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、发布规划详细程度不超过3个迭代周期，因为未完成得需求集会发生变动<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、选择迭代周期1-4周，短时间的目的是可以快速反馈<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、功能驱动，确定要完成的用户故事，然后根据功能的点数除以迭代值，得到需要迭代周期，算出完成时间<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、日期驱动，确定发布时间，计算需要迭代周期，确立点数，填充用户故事</font></p>
<p><font style="background-color: #cce8cf">五、迭代规划<br />
方法：对当前要进行的一次迭代周期内的用户故事来分解成工作任务，工作任务包括设计工作，不同层次的开发工作，调试工作和测试工作等等具体的任务，然后对任务进行估计，这时候估计的单位以理想工作小时做为单位。比如，设计需要两个人小时，开发持久层需要1个人小时，调试持久层需要半个人小时，开发业务层需要2个人小时，调试中间层需要1个小时等等。。。<br />
然后根据每个故事的人小时和这个迭代周期内参与的人数，以及每个人所能参与的实际有效时间（注意有效时间约为每天6小时，需要考虑到会议，讨论，头脑休息等非理想工作时间）来判断这个迭代周期的填充是否足够，如果不够则再加入一个用户故事，如果超出则移出一个用户故事到下一个迭代周期中。<br />
价值观：1、以周做为时间范围，规划对象是工作任务，估计的单位是理想小时。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、使用承诺驱动的方法，团队为自己所承诺的工作负责，同时也让规划更趋于理性</font></p>
<p><font style="background-color: #cce8cf">5.1迭代启动<br />
方法：启动会议<br />
价值观：团队<br />
5.2迭代进行<br />
方法：每日会议<br />
价值观：沟通，扫清障碍<br />
5.3迭代结束<br />
方法：反馈修正<br />
价值观：不管完善团队<br />
5.4迭代测试<br />
方法：同步测试/异步测试<br />
价值观：完整性</font></p>
<p><font style="background-color: #cce8cf">六、结束发布<br />
方法：数据统计，经验总结，收尾迭代<br />
价值观：1、统计数据做为下次相同条件发布过程的参考<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、共享团队经验<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、根据客户反馈对最终简单功能进行收尾，复杂功能留给下个发布版本</font></p>
<p><font style="background-color: #cce8cf">重要实践：<br />
客户参与，频繁发布，外部测试，内部测试，发布规划，迭代规划，结对编程，频繁重构，持续继承，代码集体所有</font></p>
<img src ="http://shenzhen.blogjava.net/aggbug/182747.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rocket/" target="_blank">rocket</a> 2008-02-28 16:51 <a href="http://www.blogjava.net/rocket/archive/2008/02/28/182747.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>