﻿<?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-&lt;h1&gt;&lt;font color="red" size="36"&gt;︻┳═一Java&lt;/font&gt;&lt;/h1&gt;-文章分类-other</title><link>http://www.blogjava.net/rain1102/category/17371.html</link><description>&lt;b&gt;&lt;font color="#3C1435"&gt;最低奋斗目标：&lt;/font&gt;&lt;font color="red"&gt;农妇，山泉，有点田！&lt;/font&gt;&lt;/b&gt;</description><language>zh-cn</language><lastBuildDate>Tue, 25 Dec 2007 18:35:27 GMT</lastBuildDate><pubDate>Tue, 25 Dec 2007 18:35:27 GMT</pubDate><ttl>60</ttl><item><title>使用 Log4j 搭建一个日志服务器 </title><link>http://www.blogjava.net/rain1102/articles/170082.html</link><dc:creator>Eric.Chau</dc:creator><author>Eric.Chau</author><pubDate>Mon, 24 Dec 2007 07:56:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/articles/170082.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/170082.html</wfw:comment><comments>http://www.blogjava.net/rain1102/articles/170082.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/170082.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/170082.html</trackback:ping><description><![CDATA[<strong>1.基本使用<br />
　　<br />
　　1.1服务器</strong><br />
　　<br />
　　这个日志服务器的服务器端需要运行：<br />
　　<br />
　　log4j jar包中的org.apache.log4j.net.SocketServer<br />
　　<br />
　　加参数 【本地监听端口】【配置文件】【客户端配置文件目录】<br />
　　<br />
　　第三个参数【配置文件目录】其实指的是针对每个客户端的配置文件，等会详细讲！现在用&#8220;.&#8221;就可以了.<br />
　　<br />
　　服务器端的配置文件可以用这个（引自利用Log4j 创建日志服务器 By ?の?）：<br />
　　<br />
　　#文件名socketserver.properties<br />
　　#如果需要显示日志界面，可以将本行启用<br />
　　#log4j.rootCategory=, A1<br />
　　log4j.rootLogger=DEBUG,A3<br />
　　log4j.category.org.apache.log4j.net=INFO<br />
　　<br />
　　log4j.appender.A1=org.apache.log4j.lf5.LF5Appender<br />
　　log4j.appender.A1.MaxNumberOfRecords=700<br />
　　<br />
　　log4j.appender.A4=org.apache.log4j.DailyRollingFileAppender<br />
　　log4j.appender.A4.file=server.log<br />
　　log4j.appender.A4.DatePattern='.'yyyyMMdd<br />
　　log4j.appender.A4.layout=org.apache.log4j.PatternLayout<br />
　　log4j.appender.A4.layout.ConversionPattern=\n\n[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n<br />
　　<br />
　　log4j.appender.A3=org.apache.log4j.RollingFileAppender<br />
　　log4j.appender.A3.file=server2.log<br />
　　log4j.appender.A3.MaxFileSize=1024KB<br />
　　log4j.appender.A3.MaxBackupIndex=999<br />
　　log4j.appender.A3.layout=org.apache.log4j.PatternLayout<br />
　　log4j.appender.A3.layout.ConversionPattern=\n\n[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n<br />
　　<br />
　　其中A1是启动Lf5的log监视终端，A3限制大小的文件，A4是日期滚动文件。<br />
　　<br />
　　单A3，A4是讲所有客户端的日志都存放到了同一个日志文件中，我觉的这种方法并不好。<br />
　　<br />
　　<strong>1.2客户端</strong><br />
　　<br />
　　客户端的配置文件是这样的：<br />
　　log4j.rootCategory=,SOCKET<br />
　　log4j.addivity.org.apache=true<br />
　　<br />
　　#应用于socket<br />
　　log4j.appender.SOCKET=org.apache.log4j.net.SocketAppender<br />
　　log4j.appender.SOCKET.RemoteHost=localhost　 #服务器的IP地址<br />
　　log4j.appender.SOCKET.Port=1978　　　　　　　#服务器的监听端口<br />
　　log4j.appender.SOCKET.LocationInfo=true　　　#这个是什么我不知道<br />
　　log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout<br />
　　log4j.appender.SOCKET.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%t%m%n<br />
　　<br />
　　#A2<br />
　　log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender<br />
　　log4j.appender.A2.file=server.log<br />
　　log4j.appender.A2.DatePattern='.'yyyy-MM-dd<br />
　　log4j.appender.A2.layout=org.apache.log4j.PatternLayout<br />
　　log4j.appender.A2.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n<br />
　　<br />
　　启动服务器端,再运行客户端就可以了!但所有的服务器端/客户端的日志都放到了一个日志文件中!<br />
　　<br />
　　<strong>2.稍微高级点的使用</strong><br />
　　<br />
　　下面讲如何把各个客户端和服务器端的日志分别放到不同的日志文件中.<br />
　　<br />
　　这个我在网上找了好久也没有找到!<br />
　　<br />
　　<strong>2.1服务器</strong><br />
　　<br />
　　服务器的配置文件不用怎么改动，如果你不需要在同一个文件中存放所有日志，可以把配置文件第一行的A3去掉。<br />
　　<br />
　　但服务器端有个更大的麻烦：代码有问题！问题够大了吧，不知道算不算是个bug（我用的是1.2.11版log4j）。<br />
　　<br />
　　改吧!<br />
　　<br />
　　打开log4j目录下的src\java\org\apache\log4j\net\SocketServer.java<br />
　　<br />
　　在这段中改动(看下面代码第12行)<br />
　　<br />
　　LoggerRepository configureHierarchy(InetAddress inetAddress) {<br />
　　cat.info("Locating configuration file for "+inetAddress);<br />
　　// We assume that the toSting method of InetAddress returns is in<br />
　　// the format hostname/d1.d2.d3.d4 e.g. torino/192.168.1.1<br />
　　String s = inetAddress.toString();<br />
　　int i = s.indexOf("/");<br />
　　if(i == -1) {<br />
　　cat.warn("Could not parse the inetAddress ["+inetAddress+<br />
　　"]. Using default hierarchy.");<br />
　　return genericHierarchy();<br />
　　} else {<br />
　　//这个是什么意思,专门取"/"符号吗?明显是错的!闭掉<br />
　　//　　String key = s.substring(0, i);<br />
　　//改为<br />
　　String key = s.substring(i+1);<br />
　　File configFile = new File(dir, key+CONFIG_FILE_EXT);<br />
　　if(configFile.exists()) {<br />
　　Hierarchy h = new Hierarchy(new RootLogger((Level) Priority.DEBUG));<br />
　　hierarchyMap.put(inetAddress, h);<br />
　　<br />
　　new PropertyConfigurator().doConfigure(configFile.getAbsolutePath(), h);<br />
　　<br />
　　return h;<br />
　　} else {<br />
　　cat.warn("Could not find config file ["+configFile+"].");<br />
　　return genericHierarchy();<br />
　　}<br />
　　}<br />
　　}<br />
　　<br />
　　编译文件!<br />
　　<br />
　　打开log4j目录下的src\java\org\apache\log4j\net\SocketNode.java<br />
　　<br />
　　(改这段是因为我用的时候出错!看不出来改不改有什么区别)<br />
　　<br />
　　改第54行<br />
　　<br />
　　ois = new ObjectInputStream(<br />
　　new BufferedInputStream(socket.getInputStream()));<br />
　　<br />
　　为<br />
　　<br />
　　InputStream is = socket.getInputStream();<br />
　　if (is != null) {<br />
　　ois = new ObjectInputStream(new BufferedInputStream(is));<br />
　　}<br />
　　<br />
　　文件头加 import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.io.InputStream;<br />
　　<br />
　　编译文件!<br />
　　<br />
　　现在为每个配置客户端编配置文件,把配置文件放到【客户端配置文件目录】中:<br />
　　log4j.rootCategory=,A4<br />
　　log4j.appender.A4=org.apache.log4j.DailyRollingFileAppender<br />
　　log4j.appender.A4.file=127.0.0.1.log　 #为每个客户端取不同的名字<br />
　　log4j.appender.A4.DatePattern='.'yyyyMMdd<br />
　　log4j.appender.A4.layout=org.apache.log4j.PatternLayout<br />
　　log4j.appender.A4.layout.ConversionPattern=\n\n[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n<br />
　　<br />
　　保存文件名为[客户端ip地址].lcf　如192.168.0.126.lcf<br />
　　<br />
　　<strong>2.2 客户端</strong><br />
　　<br />
　　客户端不用改变,太幸运了!!<br />
　　<br />
　　ok啦!<br />
　　<br />
　　启动服务器,启动客户端,现在服务器的日志放到了server.log中,有配置文件的客户端的日志会放到相应的日志文件中,没有配置文件的客户端的日志依然放在server.log中!<br />
　　<br />
　　SocketServer.java 和 SocketNode.java两个文件可以单独做一个工程,把他们的package去掉就行了!<img src ="http://www.blogjava.net/rain1102/aggbug/170082.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Chau</a> 2007-12-24 15:56 <a href="http://www.blogjava.net/rain1102/articles/170082.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QQ和MSN在线聊天代码</title><link>http://www.blogjava.net/rain1102/articles/167483.html</link><dc:creator>Eric.Chau</dc:creator><author>Eric.Chau</author><pubDate>Thu, 13 Dec 2007 06:07:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/articles/167483.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/167483.html</wfw:comment><comments>http://www.blogjava.net/rain1102/articles/167483.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/167483.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/167483.html</trackback:ping><description><![CDATA[QQ在线聊天代码<br />
&lt;a target=blank href=http://wpa.qq.com/msgrd?V=1&amp;Uin=65305003&amp;Site=http://www.sonicsoft.net&amp;Menu=yes&gt;&lt;img border="0" SRC=http://wpa.qq.com/pa?p=1:65305003:1 alt="点击这里给我发消息"&gt;&lt;/a&gt; <br />
<br />
MSN在线聊天代码<br />
&lt;A href="msnim:chat?contact=xie_wansong@hotmail.com" target=blank&gt;点这里和我MSN聊天&lt;/A&gt; <br />
<br />
MSN从7。5开始加入了命令行控制，你可以在网页中加入&#8220;与我交谈&#8221;这样的按钮了，访问者点击就可以直接用他的MSN与你对话，代码是<br />
<br />
建立对话：msnim:chat?contact=[邮件地址]<br />
<br />
添加好友：msnim:add?contact=[邮件地址]<br />
<br />
语音聊天：msnim:voice?contact=[邮件地址]<br />
<br />
视频聊天：msnim:video?contact=[邮件地址]<br />
<br />
用的时候把[邮件地址]写成你的MSN账号，不要方括号，用链接即可，如<br />
<br />
&lt;a&nbsp;href="msnim:chat?contact=yourname@hotmail.com"&gt;与我交谈&lt;/a&gt;<br />
<br />
&lt;a&nbsp;href="msnim:add?contact=yourname@hotmail.com"&gt;加我为好友&lt;/a&gt;<br /><img src ="http://www.blogjava.net/rain1102/aggbug/167483.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Chau</a> 2007-12-13 14:07 <a href="http://www.blogjava.net/rain1102/articles/167483.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBoss项目一览</title><link>http://www.blogjava.net/rain1102/articles/158468.html</link><dc:creator>Eric.Chau</dc:creator><author>Eric.Chau</author><pubDate>Tue, 06 Nov 2007 02:47:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/articles/158468.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/158468.html</wfw:comment><comments>http://www.blogjava.net/rain1102/articles/158468.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/158468.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/158468.html</trackback:ping><description><![CDATA[<div class="postcontent">
<dl>
<dt><strong><a href="http://labs.jboss.com/projects/web_interface">Web Interface</a></strong>
<hr />
<dd><a href="http://labs.jboss.com/jbossrichfaces">JBoss RichFaces</a>
<dd><a href="http://labs.jboss.com/jbossajax4jsf">JBoss Ajax4jsf</a>
<dd><a href="http://labs.jboss.com/gravel">Gravel</a>
<dt><strong><a href="http://labs.jboss.com/projects/servers_runtime">Servers/Runtime</a></strong>
<hr />
<dd><a href="http://labs.jboss.com/jbossas">JBoss Application Server</a>
<dd><a href="http://labs.jboss.com/jbossweb">JBoss Web</a>
<dd><a href="http://labs.jboss.com/jbossmc">JBoss Microcontainer</a>
<dd><a href="http://labs.jboss.com/mobicents">Mobicents</a>
<dt><strong><a href="http://labs.jboss.com/projects/integration">Integration</a></strong>
<hr />
<dd><a href="http://labs.jboss.com/jbossesb">JBoss ESB</a>
<dd><a href="http://labs.jboss.com/rhmessaging">Red Hat Messaging</a>
<dd><a href="http://labs.jboss.com/jbossmessaging">JBoss Messaging</a>
<dd><a href="http://labs.jboss.com/drools">Drools</a>
<dd><a href="http://labs.jboss.com/jbossjbpm">JBoss jBPM</a>
<dd><a href="http://labs.jboss.com/jbosstm">JBoss Transactions</a>
<dd><a href="http://labs.jboss.com/jbossws">JBoss Web Services</a>
<dd><a href="http://labs.jboss.com/jbossiiop">JBoss IIOP</a>
<dt><strong><a href="http://labs.jboss.com/projects/tools">Tools</a></strong>
<hr />
<dd><a href="http://labs.jboss.com/rhdevstudio">Red Hat Developer Studio</a>
<dd><a href="http://labs.jboss.com/tools">JBoss Tools</a>
<dd><a href="http://labs.jboss.com/jbossprofiler">JBoss Profiler</a>
<dd><a href="http://labs.jboss.com/jrunit">JBoss JRunit</a>
<dd><a href="http://labs.jboss.com/jsfunit">JSFUnit</a>
<dt><strong><a href="http://labs.jboss.com/projects/high_availability_grid">High Availability/Grid</a></strong>
<hr />
<dd><a href="http://labs.jboss.com/jbosscache">JBoss Cache</a>
<dd><a href="http://labs.jboss.com/jgroups">JGroups</a></dd></dl>
<dl>
<dt><strong><a href="http://labs.jboss.com/projects/portal">Portal</a></strong>
<hr />
<dd><a href="http://labs.jboss.com/jbossportal">JBoss Portal</a>
<dt><strong><a href="http://labs.jboss.com/projects/portal/portlets.html">Portlets</a></strong>
<hr />
<dd><a href="http://labs.jboss.com/jbossforums">JBoss Forums</a>
<dd><a href="http://labs.jboss.com/jbosswiki">JBoss Wiki</a>
<dd><a href="http://labs.jboss.com/jbossblog">JBoss Blog</a>
<dd><a href="http://labs.jboss.com/portletswap">Portlet Swap</a>
<dt><strong><a href="http://labs.jboss.com/projects/programming_model">Programming Model</a></strong>
<hr />
<dd><a href="http://labs.jboss.com/jbossseam">JBoss Seam</a>
<dd><a href="http://labs.jboss.com/jbossejb3">JBoss EJB3</a>
<dd><a href="http://labs.jboss.com/jbossaop">JBoss AOP</a>
<dd><a href="http://www.hibernate.org/">Hibernate</a>
<dt><strong><a href="http://labs.jboss.com/projects/security">Security</a></strong>
<hr />
<dd><a href="http://labs.jboss.com/jbosssecurity">JBoss Security and Identity Management</a>
<dd><a href="http://labs.jboss.com/jbosssso">JBoss Federated SSO</a>
<dt><strong><a href="http://labs.jboss.com/projects/foundations">Foundations</a></strong>
<hr />
<dd><a href="http://labs.jboss.com/serialization">JBoss Serialization</a>
<dd><a href="http://labs.jboss.com/jbossremoting">JBoss Remoting</a>
<dt><strong><a href="http://labs.jboss.com/projects/incubation">Incubation</a></strong>
<hr />
<dd><a href="http://labs.jboss.com/kosmos">Kosmos</a>
<dd><a href="http://labs.jboss.com/davcache">DavCache</a>
<dd><a href="http://labs.jboss.com/reportingservices">Reporting Services</a>
<dd><a href="http://labs.jboss.com/shotoku">Shotoku</a>
<dd><a href="http://labs.jboss.com/metajizer">Metajizer</a>
<dd><a href="http://labs.jboss.com/jbossjmx">JBoss JMX</a>
<dd><a href="http://labs.jboss.com/javassist">Javassist</a>
<dt><strong>Sunsetting</strong>
<dd><a href="http://labs.jboss.com/jbosside">JBoss IDE for Eclipse</a></dd></dl></div><img src ="http://www.blogjava.net/rain1102/aggbug/158468.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Chau</a> 2007-11-06 10:47 <a href="http://www.blogjava.net/rain1102/articles/158468.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>判断sql执行所花的时间（精度为毫秒）</title><link>http://www.blogjava.net/rain1102/articles/149059.html</link><dc:creator>Eric.Chau</dc:creator><author>Eric.Chau</author><pubDate>Fri, 28 Sep 2007 05:02:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/articles/149059.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/149059.html</wfw:comment><comments>http://www.blogjava.net/rain1102/articles/149059.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/149059.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/149059.html</trackback:ping><description><![CDATA[<span style="color: #0000ff">DECLARE </span><span style="color: #008000">@begin</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #000000">datetime</span><span style="color: #000000"><br />
</span><span style="color: #0000ff"><span style="color: #0000ff">DECLARE </span></span><span style="color: #008000">@chaju</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #000000">bigint</span><span style="color: #000000"><br />
</span><span style="color: #0000ff"><span style="color: #0000ff">DECLARE </span></span><span style="color: #008000">@end</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #000000">datetime</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">SET </span><span style="color: #008000">@begin</span><span style="color: #808080">=</span><span style="color: #ff00ff">getdate</span><span style="color: #000000">()<br />
</span><span style="color: #000000"><font color="#0000ff"><br />
</font>要执行的sql语句......<br />
<br />
</span><span style="color: #0000ff"><span style="color: #0000ff">SET </span></span><span style="color: #008000">@end</span><span style="color: #808080">=</span><span style="color: #ff00ff">getdate</span><span style="color: #000000">()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff"><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;</span></span><span style="color: #008000">@chaju</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">datediff</span><span style="color: #000000">(Millisecond,&nbsp;</span><span style="color: #008000">@begin</span><span style="color: #000000">,&nbsp;</span><span style="color: #008000">@end</span><span style="color: #000000">)<br />
</span><span style="color: #0000ff">PRINT </span><span style="color: #008000">@chaju<span style="color: #000000">&nbsp;</span></span><img src ="http://www.blogjava.net/rain1102/aggbug/149059.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Chau</a> 2007-09-28 13:02 <a href="http://www.blogjava.net/rain1102/articles/149059.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>两位小数保留（double）</title><link>http://www.blogjava.net/rain1102/articles/118930.html</link><dc:creator>Eric.Chau</dc:creator><author>Eric.Chau</author><pubDate>Mon, 21 May 2007 09:07:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/articles/118930.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/118930.html</wfw:comment><comments>http://www.blogjava.net/rain1102/articles/118930.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/118930.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/118930.html</trackback:ping><description><![CDATA[<a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.math.BigDecimal和java.text.DecimalFormat<br>double d1 = new Double(new DecimalFormat(".00").format(d));<br>double d2 = new BigDecimal(d).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();<img src ="http://www.blogjava.net/rain1102/aggbug/118930.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Chau</a> 2007-05-21 17:07 <a href="http://www.blogjava.net/rain1102/articles/118930.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windows上安装apache2.0.59 + svn1.4.0 + 自动邮件通知(转载)</title><link>http://www.blogjava.net/rain1102/articles/118256.html</link><dc:creator>Eric.Chau</dc:creator><author>Eric.Chau</author><pubDate>Fri, 18 May 2007 02:01:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/articles/118256.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/118256.html</wfw:comment><comments>http://www.blogjava.net/rain1102/articles/118256.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/118256.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/118256.html</trackback:ping><description><![CDATA[前几天写了linux版的，受广大论友的邀请，特写此windows的版本，希望大家能够共同为此论坛作出贡献，也希望越来越多的人能够更加方便地使用SVN。<br><br>OS: Windows XP SP2<br><br>1) 安装Apache Server<br>2) 安装SVN<br>3) 配置邮件通知以及修改log权限<br><br>1. 安装apache2.0.59,从这里可以下载到<a href="http://apache.justdn.org/httpd/binaries/win32/apache_2.2.3-win32-x86-no_ssl.msi" target=_blank><u><font color=#0000ff>http://apache.justdn.org/httpd/binaries/win32/apache_2.2.3-win32-x86-no_ssl.msi</font></u></a><br>安装过程中设置以下参数：<br>Network Domain: localhost<br>Server name: localhost<br>Administrator's Emai Address: <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#119;&#105;&#110;&#100;&#121;&#109;&#97;&#120;&#64;&#49;&#50;&#54;&#46;&#99;&#111;&#109;"><u><font color=#0000ff>windymax@126.com</font></u></a><br>安装到默认路径为C:\Program Files\Apache Group\Apache2<br><br>2. 安装subversion1.4.0,从这里下载<a href="http://www.iusesvn.com/bbs/download/svn-win32-1.4.0.zip" target=_blank><u><font color=#0000ff>http://www.iusesvn.com/bbs/download/svn-win32-1.4.0.zip</font></u></a><br>安装到默认路径为C:\Program Files\Subversion<br>默认安装后，在apache的配置文件中会自动加入以下两行。<br>LoadModule dav_svn_module "C:/Program Files/Subversion/bin/mod_dav_svn.so"<br>LoadModule authz_svn_module "C:/Program Files/Subversion/bin/mod_authz_svn.so"<br>把这行的注释去掉<br>LoadModule dav_fs_module modules/mod_dav_fs.so<br><br>拷贝C:\Program Files\Subversion\bin下的libdb44.dll到这个目录下C:\Program Files\Apache Group\Apache2\bin<br>打开apache的配置文件在末尾处加入以下参数：<br>&lt;Location /svn&gt;<br>DAV svn<br>SVNPath d:\svndata\test<br>AuthType Basic<br>AuthName "Windy SVN"<br>AuthUserFile d:\svndata\test\passwd<br>Require valid-user<br>&lt;/Location&gt;<br>保存。(在这里权限文件我不多讲了，大家多做实验就明白了)<br><br>建立仓库<br>打开CMD命令行界面，"开始" -&gt; "运行" -&gt; "cmd" -&gt; "回车"<br>C:\Documents and Settings\windy&gt; d:&nbsp; &nbsp;//进入D盘(因为我们要在D盘下创建仓库)<br>D:\&gt; md svndata&nbsp; &nbsp;//创建一个名叫svndata的目录<br>D:\&gt; c:&nbsp; &nbsp;//进入C盘<br>C:\Documents and Settings\windy&gt; cd\&nbsp; &nbsp;//退到C盘根目录<br>C:\Documents and Settings\windy&gt; cd C:\Program Files\Subversion\bin&nbsp;&nbsp;//进入subversion/bin目录<br>C:\Program Files\Subversion\bin&gt; svnadmin create d:\svndata\test&nbsp; &nbsp;//用svnadmin命令创建名为test的仓库(这条命令成功后，在test下会出现很多文件夹和文件)<br>C:\Program Files\Subversion\bin&gt; cd C:\Program Files\Apache Group\Apache2\bin&nbsp; &nbsp;//进入apache\bin目录<br>C:\Program Files\Apache Group\Apache2\bin&gt; htpasswd -cm d:\svndata\test\passwd user1&nbsp; &nbsp;//用htpasswd命令创建第一个用户(user1)，同时生成密码认证文件，c参数为create,m参数为MD5加密方式<br>New password: ******<br>Re-type new password: ******<br>Adding password for user user1&nbsp; &nbsp;//加入用户成功<br>C:\Program Files\Apache Group\Apache2\bin&gt; htpasswd -m d:\svndata\test\passwd user2&nbsp; &nbsp;//用htpasswd命令创建第二个用户(user2),注意如果在这时加入c参数会覆盖掉之前创建的用户及文件。<br>New password: ******<br>Re-type new password: ******<br>Adding password for user user2&nbsp; &nbsp;//加入用户成功<br><br>重新启动apache，进行测试。<br>用IE打开<a href="http://localhost/svn" target=_blank><u><font color=#0000ff>http://localhost/svn</font></u></a>，这时应该可以看到<br>Revision 0: /<br>--------------------------------------------------------------------------------<br>Powered by Subversion version 1.4.0 (r21228).&nbsp; &nbsp; //说明我们已经配置成功了<br><br>3. 配置邮件通知以及修改log权限<br>下载所需要的软件包<br>--在这里下载<a href="http://downloads.activestate.com/ActivePerl/Windows/5.8/ActivePerl-5.8.8.819-MSWin32-x86-267479.msi" target=_blank><u><font color=#0000ff>http://downloads.activestate.com/ActivePerl/Windows/5.8/ActivePerl-5.8.8.819-MSWin32-x86-267479.msi</font></u></a>到D盘根目录下。<br>--下载<a href="http://download.microsoft.com/download/vc15/patch/1.52/w95/en-us/nmake15.exe" target=_blank><u><font color=#0000ff>http://download.microsoft.com/download/vc15/patch/1.52/w95/en-us/nmake15.exe</font></u></a>到D盘根目录下。<br>--下载<a href="http://search.cpan.org/CPAN/authors/id/K/KW/KWILLIAMS/Module-Build-0.2805.tar.gz" target=_blank><u><font color=#0000ff>http://search.cpan.org/CPAN/authors/id/K/KW/KWILLIAMS/Module-Build-0.2805.tar.gz</font></u></a>到D盘根目录下，将Module-Build-0.2805.tar.gz解压到D盘。<br>--下载<a href="http://search.cpan.org/CPAN/authors/id/G/GB/GBARR/Authen-SASL-2.10.tar.gz" target=_blank><u><font color=#0000ff>http://search.cpan.org/CPAN/authors/id/G/GB/GBARR/Authen-SASL-2.10.tar.gz</font></u></a>到D盘根目录下，将Authen-SASL-2.10.tar.gz解压到D盘。<br>--下载<a href="http://search.cpan.org/CPAN/authors/id/A/AP/APLEINER/Net-SMTP_auth-0.08.tar.gz" target=_blank><u><font color=#0000ff>http://search.cpan.org/CPAN/authors/id/A/AP/APLEINER/Net-SMTP_auth-0.08.tar.gz</font></u></a>到D盘根目录下，将Net-SMTP_auth-0.08.tar.gz解压到D盘。<br>--下载<a href="http://search.cpan.org/CPAN/authors/id/D/DW/DWHEELER/SVN-Notify-2.64.tar.gz" target=_blank><u><font color=#0000ff>http://search.cpan.org/CPAN/authors/id/D/DW/DWHEELER/SVN-Notify-2.64.tar.gz</font></u></a>到D盘根目录下，将SVN-Notify-2.64.tar.gz解压到D盘。<br><br>开始安装Perl以及模块<br>--安装Active Perl，一路默认安装，默认路径为C:\Perl<br>--测试perl是否正常工作(这步很关键)<br>&nbsp;&nbsp;打开CMD命令行界面，"开始" -&gt; "运行" -&gt; "cmd" -&gt; "回车"<br>&nbsp; &nbsp;C:\Documents and Settings\windy&gt; perl&nbsp; &nbsp;//如果没有报错，说明已经正常工作，因为安装perl时，安装程序会自动设置好环境perl(如果在系统环境变量中没有自动添加，需手动添加perl变量环境)，具体做法是：<br>&nbsp;&nbsp;"回到桌面" -&gt; "鼠标右键我的电脑" -&gt; "属性" -&gt; "高级" -&gt; "环境变量" -&gt; "系统变量中Path最前面中添加C:\Perl\bin\;" -&gt;"完成"。&nbsp; &nbsp;//测试，如果报错，请重新启动电脑后进行测试。<br>--将nmake15.exe改名为nmake.exe后拷贝到c:\windows\system32目录下。<br>--测试nmake是否是否正常工作(这步很关键)<br>&nbsp;&nbsp;打开CMD命令行界面，"开始" -&gt; "运行" -&gt; "cmd" -&gt; "回车"<br>&nbsp; &nbsp;C:\Documents and Settings\windy&gt; nmake&nbsp; &nbsp;<br>&nbsp;&nbsp;Microsoft (R) Program Maintenance Utility&nbsp; &nbsp;Version 1.50<br>&nbsp;&nbsp;Copyright (c) Microsoft Corp 1988-94. All rights reserved.&nbsp; &nbsp;//说明nmake已经正常工作<br>--安装Module-Build模块<br>&nbsp;&nbsp;打开CMD命令行界面，"开始" -&gt; "运行" -&gt; "cmd" -&gt; "回车"<br>&nbsp;&nbsp;C:\Documents and Settings\windy&gt; d:<br>&nbsp;&nbsp;D:\&gt; cd Module-Build-0.2805<br>&nbsp;&nbsp;D:\Module-Build-0.2805&gt; perl Build.PL&nbsp; &nbsp;//收集系统环境变量<br>&nbsp;&nbsp;D:\Module-Build-0.2805&gt; Build&nbsp; &nbsp;//进行编译<br>&nbsp;&nbsp;D:\Module-Build-0.2805&gt; Build test&nbsp; &nbsp;//测试<br>&nbsp;&nbsp;D:\Module-Build-0.2805&gt; Build install&nbsp; &nbsp;//编译后安装&nbsp;&nbsp;<br>--安装Perl模块Authen::SASL，进入Authen-SASL-2.10目录，首先开打Makefile.PL<br>&nbsp;&nbsp;打开CMD命令行界面，"开始" -&gt; "运行" -&gt; "cmd" -&gt; "回车"<br>&nbsp;&nbsp;C:\Documents and Settings\windy&gt; d:<br>&nbsp;&nbsp;D:\&gt; cd Authen-SASL-2.10<br>&nbsp;&nbsp;D:\Authen-SASL-2.10&gt; perl Makefile.PL&nbsp; &nbsp;//收集系统环境变量<br>&nbsp;&nbsp;出现选择安装提示，y和n先后安装一次<br>&nbsp;&nbsp;D:\Authen-SASL-2.10&gt; nmake&nbsp; &nbsp;//进行编译<br>&nbsp;&nbsp;D:\Authen-SASL-2.10&gt; nmake test&nbsp;&nbsp;//进行测试<br>&nbsp;&nbsp;D:\Authen-SASL-2.10&gt; nmake install&nbsp; &nbsp;//编译后安装<br>--安装Perl模块Net::SMTP_auth<br>&nbsp;&nbsp;打开CMD命令行界面，"开始" -&gt; "运行" -&gt; "cmd" -&gt; "回车"<br>&nbsp;&nbsp;C:\Documents and Settings\windy&gt; d:<br>&nbsp;&nbsp;D:\&gt; cd Net-SMTP_auth-0.08<br>&nbsp;&nbsp;D:\Net-SMTP_auth-0.08&gt; perl Makefile.PL&nbsp; &nbsp;//收集系统环境变量<br>&nbsp;&nbsp;D:\Net-SMTP_auth-0.08&gt; nmake&nbsp; &nbsp;//进行编译<br>&nbsp;&nbsp;D:\Net-SMTP_auth-0.08&gt; nmake test&nbsp; &nbsp;//测试<br>&nbsp;&nbsp;D:\Net-SMTP_auth-0.08&gt; nmake install&nbsp; &nbsp;//编译后安装<br>--安装Perl模块SVN::Notify<br>&nbsp;&nbsp;打开CMD命令行界面，"开始" -&gt; "运行" -&gt; "cmd" -&gt; "回车"<br>&nbsp;&nbsp;C:\Documents and Settings\windy&gt; d:<br>&nbsp;&nbsp;D:\&gt; cd SVN-Notify-2.64<br>&nbsp;&nbsp;D:\SVN-Notify-2.64&gt; perl Build.PL&nbsp; &nbsp;//收集系统环境变量<br>&nbsp;&nbsp;D:\SVN-Notify-2.64&gt; Build&nbsp; &nbsp;//进行编译<br>&nbsp;&nbsp;D:\SVN-Notify-2.64&gt; Build test&nbsp; &nbsp;//测试<br>&nbsp;&nbsp;D:\SVN-Notify-2.64&gt; Build installl&nbsp; &nbsp;//编译后安装&nbsp;&nbsp;<br>--安装完毕。<br><br>设置邮件通知<br>--拷贝post-commit.tmpl为post-commit.bat<br>--删除末尾参数，增加下面参数：<br>set REPOS=%1<br>set REV=%2<br>SET PATH=C:\PERL\BIN;<br>SET OS=Windows_NT<br>SET SystemRoot=C:\WINDOWS<br>svnnotify --repos-path %REPOS% -r %REV% --to <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#119;&#105;&#110;&#100;&#121;&#64;&#49;&#50;&#54;&#46;&#99;&#111;&#109;"><u><font color=#0000ff>windy@126.com</font></u></a> --smtp smtp.126.com -H HTML::ColorDiff -d --subject-prefix [Windy SVN]<br>//--to要跟你要发送给谁的邮件地址，--smtp后跟你自已的邮件服务器地址，比如mail.126.com<br><br>设置log可以修改<br>--拷贝pre-revprop-change.tmpl为pre-revprop-change.bat<br>--删除末尾参数，增加下面参数：<br>REM SVN pre-revprop-change hook allows edit of logmessages from TSVN <br><br>setlocal<br>set REPOS=%1<br>set REV=%2<br>set USER=%3<br>set PROPNAME=%4<br>set ACTION=%5<br><br>if&nbsp;&nbsp;not "%ACTION%"=="M" goto refuse<br>if&nbsp;&nbsp;not "%PROPNAME%"=="svn:log" goto refuse<br>goto OK<br><br>:refuse<br>echo Cann't set %PROPNAME%/%ACTION%, only svn:log is allowed 1&gt;&amp;2<br>endlocal<br>exit 1<br><br>:OK<br>endlocal<br>exit 0<br><br>完成所有设置，开始测试。<br><img src ="http://www.blogjava.net/rain1102/aggbug/118256.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Chau</a> 2007-05-18 10:01 <a href="http://www.blogjava.net/rain1102/articles/118256.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第17届Jolt大奖在SD West大会上评出</title><link>http://www.blogjava.net/rain1102/articles/105803.html</link><dc:creator>Eric.Chau</dc:creator><author>Eric.Chau</author><pubDate>Fri, 23 Mar 2007 05:10:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/articles/105803.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/105803.html</wfw:comment><comments>http://www.blogjava.net/rain1102/articles/105803.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/105803.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/105803.html</trackback:ping><description><![CDATA[<h4>摘要:</h4>
		<br />Santa Clara当地时间3月21日下午18:30，第17届Jolt（震撼）大奖颁奖礼，作为SD West 2007的一个特别节目，在会议中心举行。由Dr. Dobb's Journal赞助的Jolt大奖，一向被业界看作极高的荣誉。<br /><br />本届Jolt颁奖礼，特邀著名Web2.0站点Craigslist（提供自助分类广告发布服务）的创始人Craig Newmark作为嘉宾主持人，和来自CMP Technology的Kerry K.Gates一起主持。<br /><br />下面是获奖名单：<br /><br /><font color="#006400">Books (General)：Agile Software Development: The Cooperative Game， Alistair Cockburn<br /><br />Books (Technical)：Head First Object-Oriented Analysis and Design， B.McLaughlin, G.Pollice and D.West<br /><br />Change and Configuration Management（变更及配置管理）：AccuRev 4.5<br /><br />Collaboration Tools（协作工具）：Confuluence<br /><br />Database Engines and Data Tools（数据库引擎及数据工具）：Visual Studio 2005 Team Edition for Database Professionals<br /><br />Design and Modeling（设计及建模）：stpBA Storyboarding for Microsoft Visual Studio 2005 Team System<br /><br />Development Environments（开发环境）：NetBeans IDE<br /><br />Enterprise Tools（企业工具）：Cape Clear ESB Platform<br /><br />Libraries, Frameworks and Components（库、框架及组件）：NetAdvantage for .NET<br /><br />Mobile Development（移动开发）：Carbide .c++ Professional Edition<br /><br />Project Management Tools（项目管理工具）：Rally Enterprise<br /><br />Security（安全）：AppScan<br /><br />Automated Testing Tools（自动测试工具）：AgitarOne<br /><br />Bug and Defect Tracking Tools（缺陷跟踪工具）：TestTrack Studio<br /><br />Utilities（杂类应用）：VMWare Lab Manager<br /><br />Web Development（Web开发）：Adobe Flex 2<br /><br />Websites/Developer Networks（网站/开发者网络）：SUN Developer Network<br /></font><br /><span style="COLOR: red">Hall of Fame（荣誉堂）:IBM developerWorks</span>，往届入选的有—<br /><div id="quote"><font color="#800080">2005 Visual Studio Professional<br />2004 InstallShield<br />2003 Dreamweaver<br />2002 MSDN Universal<br />2001 Borland<br />2000 Visual SlickEdit<br />1999 O'Reilly and Association<br />1998 Visio<br />1997 Visual Basic<br />1996 BoundsChecker</font></div><img src ="http://www.blogjava.net/rain1102/aggbug/105803.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Chau</a> 2007-03-23 13:10 <a href="http://www.blogjava.net/rain1102/articles/105803.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库驱动程序和URL </title><link>http://www.blogjava.net/rain1102/articles/94911.html</link><dc:creator>Eric.Chau</dc:creator><author>Eric.Chau</author><pubDate>Fri, 19 Jan 2007 05:05:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/articles/94911.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/94911.html</wfw:comment><comments>http://www.blogjava.net/rain1102/articles/94911.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/94911.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/94911.html</trackback:ping><description><![CDATA[数据库名 <br />驱动程序 <br />URL <br /><br /><font color="#006400">MS SQL Server2000</font><br />com.microsoft.jdbc.sqlserver.SQLServerDriver <br />jdbc:microsoft:sqlserver://[ip]:[port];user=[user];passwoerd=[password] <br /><br /><font color="#006400">JDBC-ODBC</font><br />sun.jdbc.odbc.JdbcOdbcDriver <br />jdbc:odbc:[odbcsource] <br /><br /><font color="#006400">Oracle oci8 <br /></font>oracle.jdbc.driver.OracleDriver <br />jdbc:oracle:oci8:@[sid] <br /><br /><font color="#006400">Oracle thin Driver</font><br />oracle.jdbc.driver.OracleDriver <br />jdbc:oracle:thin:@[ip]:[port]:[sid] <br /><br /><font color="#006400">Cloudscape</font><br />COM.cloudscape.core.JDBCDriver <br />Jdbc:cloudscape:database <br /><br /><font color="#006400">MySQL</font><br />org.git.mm.mysql.Driver <br />jdbc:mysql://ip/database?user=?&amp;password=? <br /><img src ="http://www.blogjava.net/rain1102/aggbug/94911.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Chau</a> 2007-01-19 13:05 <a href="http://www.blogjava.net/rain1102/articles/94911.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从PSP到TSP再到CMM 出处:系统分析之窗</title><link>http://www.blogjava.net/rain1102/articles/92010.html</link><dc:creator>Eric.Chau</dc:creator><author>Eric.Chau</author><pubDate>Fri, 05 Jan 2007 07:45:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/articles/92010.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/92010.html</wfw:comment><comments>http://www.blogjava.net/rain1102/articles/92010.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/92010.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/92010.html</trackback:ping><description><![CDATA[摘要<br />    管理仍然是开发软件项目成败的关键。我国的软件产业需要迅速转入以过程为中心，走工业化生产的道路。但单纯依靠能力成熟度模型CMM，永远不能真正做到过程管理的改善， 只有与PSP和TSP有机地结合起来，才能达到软件过程持续改善的效果。 <br />前言<br />    本文将围绕过程管理的各个环节，以循序渐进的方式，更具体更深入地讲述和分析软件开发的过程改进问题。它将从如何控制、管理和改进个人工作方式的问题开始，到如何创建高效且具有自我管理能力的工程小组，工程人员如何才能成为合格的项目组成员，以及管理人员如何对群组提供指导和支持，一直讲到如何在全公司范围内定义和推行合适的符合CMM标准的过程规范，并达到不断改进的良性循环状态，等等。<br />    如果按照本文所提到的这种思路和体系进行过程改进的话，那么公司的过程工作将是踏实而有效的。并且于个人，于公司都将受益非浅：<br />    1、 提升个人的能力。PSP向你展示如何制订计划并跟踪你的工作，提供工作有效性的数据并识别出自己的优势和劣势，从而使你能够不断了解和改善自己的技能和才智，并在工作中充分利用自己独特的才能。而TSP向你展示如何成为合格的项目组成员，如何创建高效且具有自我管理能力的工程小组，从而达到高效的协同开发。<br />    2、 完善公司的过程。结合TSP和PSP，在全公司范围内建立规范的开发过程就轻而易举。再加上本文提供的具体实践和有效思路，能够很好地帮助企业提升管理能力，包括软件过程管理、项目管理和持续改进过程。<br />个人开发能力<br />    PSP (Personal Software Process) 是一种可用于控制、管理和改进个人工作方式的自我持续改进过程，是一个包括软件开发表格、指南和规程的结构化框架。PSP与具体的技术（程序设计语言、工具或者设计方法）相对独立，其原则能够应用到几乎任何的软件工程任务之中。PSP能够说明个体软件过程的原则； 帮助软件工程师作出准确的计划；确定软件工程师为改善产品质量要采取的步骤；建立度量个体软件过程改善的基准；确定过程的改变对软件工程师能力的影响。<br />团队开发能力<br />    TSP（Personal Software Process）对群组软件过程的定义、度量和改革提出了一整套原则、策略和方法，把CMM要求实施的管理与PSP要求开发人员具有的技巧结合起来，以按时交付高质量的软件，并把成本控制在预算的范围之内。在TSP中，讲述了如何创建高效且具有自我管理能力的工程小组，工程人员如何才能成为合格的项目组成员，管理人员如何对群组提供指导和支持，如何保持良好的工程环境使项目组能充分发挥自己的水平等软件工程管理问题。<br />软件开发过程<br />    软件开发过程（Software Development Process，SDP）是组织级在全公司范围内进行的过程定义、度量和改进，包括三部分：开发生命周期、项目管理实践和软件工程过程。它是在CMM的基础上建立起来的，综合在实践中行之有效的具体方法，注重实用性和效果，以实现项目交付的可预期性和质量保证为最终目标。<br />    开发生命周期。一个专业的软件开发公司应该有根据自己的开发模式建立一个非常详细的软件开发周期模型，包括开发阶段，每阶段内的任务，任务的具体工作和交付物，使用的开发工具和技术，以及人员的分工，甚至可以细到通用的审核会议。将开发中所有的内容用网络图或流程图的形式明确地规范下来，使得高层能够对项目的整体过程一目了然，使得项目的管理者很容易地跟踪任务的情况，使得每位开发人员都非常明确自己的任务和在整体开发中的作用。只有这样的生命周期模型对具体的开发才有意义，它是公司所有开发的“圣经”，所有的技术开发和过程开发均需在此基础上进行开展，并以此为依据。<br />    项目管理实践。以公司的软件生命周期为基础，依据CMM标准，为公司建立一系列合适的过程实践。几个关键的过程实践包括：质量保证，需求管理，配置管理，计划和跟踪，风险控制。然后再建立一套项目度量工具来更加精确地管理项目。如果你们企业不做CMM认证的话，我认为其他的实践可以先不做。将这些基本的工作做到位，然后再参考三级四级五级的实践来改进和补充这些实践，也完全可以很好地控制开发的软件过程。即所谓：学习CMM是吸收其精华和精神。<br />    持续改进过程。有了规范的开发生命周期模型和项目管理实践，可以想办法为企业设计一个建立在数据基础之上、不断度量和改进、不断提高企业开发能力的一个良性循环的机制。模型图如下：<br /><br />三者的有机结合<br />    PSP、 TSP 和CMM为软件产业提供了一个集成化的、三维的软件过程改革框架。三者互相配合，各有侧重，形成了不可分割的整体，犹如一张具有三条腿的凳子，缺一不可。在软件能力成熟度模型CMM的18个关键过程域中，有12个与个体软件过程PSP紧密相关，有16个与群组软件过程TSP紧密相关。因此，如果能够熟悉个体软件过程和群组软件过程，不仅有助于工程师改善工作效率，而且也非常有利于组织的过程改善。<br />    为了更有效地改进公司的过程，在这里我建议一种循序渐进的方法。如下图所示：<br /><br />    PSP注重于个人的技能，能够指导软件工程师如何保证自己的工作质量，估计和规划自身的工作，度量和追踪个人的表现，管理自身的软件过程和产品质量。经过PSP学习和实践的正规训练，软件工程师们能够在他们参与的项目工作之中充分利用PSP，从而保证了项目整体的进度和质量。<br />    TSP注重团队的高效工作和产品交付能力，结合PSP的工程技能，通过告诉软件工程师如何将个体过程结合进小组软件过程，通过告诉管理层如何支持和授权项目小组，坚持高质量的工作，并且依据数据进行项目的管理，展示了如何去生产高质量的产品。<br />    CMM注重于组织能力和高质量的产品，它提供了评价组织的能力、识别优先改善需求和追踪改善进展的管理方式。再拓展到本文提到的软件开发过程SDP的话，那就是具有更高层次更高组织性的意义。<br />总结<br />    如果一个组织正在按照CMM改进过程，则PSP和TSP是和CMM完全相容的。如果一个组织还没有按照CMM改进过程，则有关PSP和TSP的训练，可以为未来的CMM实践奠定坚实的基础。总之，单纯实施CMM并不能完全做到能力成熟度的升级，我国企业还应当将实施CMM与实施PSP和TSP有机地结合起来，才能将CMM发挥最大的效力。<br /><img src ="http://www.blogjava.net/rain1102/aggbug/92010.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Chau</a> 2007-01-05 15:45 <a href="http://www.blogjava.net/rain1102/articles/92010.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>7种设计坏味道和11种原则</title><link>http://www.blogjava.net/rain1102/articles/90421.html</link><dc:creator>Eric.Chau</dc:creator><author>Eric.Chau</author><pubDate>Thu, 28 Dec 2006 01:33:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/articles/90421.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/90421.html</wfw:comment><comments>http://www.blogjava.net/rain1102/articles/90421.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/90421.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/90421.html</trackback:ping><description><![CDATA[<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">
						<strong>7种设计坏味道<br /></strong>1.僵化性： 很难对系统进行改动，因为每个改动都会迫使许多对系统其他部分的其它改动。 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">2.脆弱性： 对系统的改动会导致系统中和改动的地方在概念上无关的许多地方出现问题。 <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">3.牢固性： 很难解开系统的纠结，使之成为一些可在其他系统中重用的组件。 <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">4.粘滞性： 做正确的事情比做错误的事情要困难。 <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">5.复杂性(不必要的)： 设计中包含有不具任何直接好处的基础结构。 <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">6.重复性(不必要的)： 设计中包含有重复的结构，而该重复的结构本可以使用单一的抽象进行统一。 <o:p></o:p></span>
		</p>
		<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">  7.晦涩性： 很难阅读、理解。没有很好地表现出意图。<br /><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN"><strong>11种原则 - Principle <o:p></o:p></strong></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">----类原则 <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">1.单一职责原则 - Single Responsibility Principle(SRP) <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">就一个类而言，应该仅有一个引起它变化的原因。 <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">(职责即为</span><span style="FONT-SIZE: 9pt; COLOR: black; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-ascii-font-family: 宋体"><font face="Times New Roman">“</font></span><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">变化的原因</span><span style="FONT-SIZE: 9pt; COLOR: black; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-ascii-font-family: 宋体"><font face="Times New Roman">”</font></span><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">。) <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">2.开放-封闭原则 - Open Close Principle(OCP) <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">软件实体（类、模块、函数等）应该是可以扩展的，但是不可修改。 <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">(对于扩展是开放的,对于更改是封闭的. <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">关键是抽象.将一个功能的通用部分和实现细节部分清晰的分离开来. <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">开发人员应该仅仅对程序中呈现出频繁变化的那些部分作出抽象. <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">拒绝不成熟的抽象和抽象本身一样重要. ) <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">3.里氏替换原则 - Liskov Substitution Principle(LSP) <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">子类型(subclass)必须能够替换掉它们的基类型(superclass)。 <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">4.依赖倒置原则(IoCP) 或 依赖注入原则 - Dependence Inversion Principle(DIP) <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">抽象不应该依赖于细节。细节应该依赖于抽象。 <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">(Hollywood原则: "Don't call us, we'll call you". <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">程序中所有的依赖关系都应该终止于抽象类和接口。 <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">针对接口而非实现编程。 <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">任何变量都不应该持有一个指向具体类的指针或引用。 <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">任何类都不应该从具体类派生。 <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">任何方法都不应该覆写他的任何基类中的已经实现了的方法。) <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">5.接口隔离原则(ISP) <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">不应该强迫客户依赖于它们不用的方法。 <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">接口属于客户，不属于它所在的类层次结构。 <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">(多个面向特定用户的接口胜于一个通用接口。) <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">----包内聚原则 <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">6.重用发布等价原则(REP) <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">重用的粒度就是发布的粒度。 <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">7.共同封闭原则(CCP) <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">包中的所有类对于同一类性质的变化应该是共同封闭的。 <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">一个变化若对一个包产生影响， <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">则将对该包中的所有类产生影响， <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">而对于其他的包不造成任何影响。 <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">8.共同重用原则(CRP) <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">一个包中的所有类应该是共同重用的。 <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">如果重用了包中的一个类， <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">那么就要重用包中的所有类。 <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">(相互之间没有紧密联系的类不应该在同一个包中。) <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">----包耦合原则 <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">9.无环依赖原则(ADP) <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">在包的依赖关系图中不允许存在环。 <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">10.稳定依赖原则(SDP) <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">朝着稳定的方向进行依赖。 <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">应该把封装系统高层设计的软件（比如抽象类）放进稳定的包中， <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">不稳定的包中应该只包含那些很可能会改变的软件（比如具体类）。 <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">11.稳定抽象原则(SAP) <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">包的抽象程度应该和其稳定程度一致。 <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">(一个稳定的包应该也是抽象的，一个不稳定的包应该是抽象的. ) <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">----其它扩展原则---- <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">12.BBP(Black Box Principle)黑盒原则 <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">多用类的聚合，少用类的继承。 <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">13.DAP(Default Abstraction Principle)缺省抽象原则 <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">在接口和实现接口的类之间引入一个抽象类,这个类实现了接口的大部分操作. <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">14.IDP(Interface Design Principle)接口设计原则 <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">规划一个接口而不是实现一个接口。 <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">15.DCSP(Don't Concrete Supperclass Principle)不要构造具体的超类原则 <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">避免维护具体的超类。 <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">16.迪米特法则 <o:p></o:p></span></p><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">一个类只依赖其触手可得的类。</span></span><img src ="http://www.blogjava.net/rain1102/aggbug/90421.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Chau</a> 2006-12-28 09:33 <a href="http://www.blogjava.net/rain1102/articles/90421.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CVS服务器配置步骤</title><link>http://www.blogjava.net/rain1102/articles/88488.html</link><dc:creator>Eric.Chau</dc:creator><author>Eric.Chau</author><pubDate>Mon, 18 Dec 2006 04:01:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/articles/88488.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/88488.html</wfw:comment><comments>http://www.blogjava.net/rain1102/articles/88488.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/88488.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/88488.html</trackback:ping><description><![CDATA[CVS服务器的配置过程：<br /><span class="postbody"><ul><br /><li>检查 /etc/services <br />首先键入 <span style="FONT-STYLE: italic">vi /etc/services</span><br />然后键入 <span style="FONT-STYLE: italic">/cvspserver</span><br />如果找到的行前面并没有#，那么就不用修改了，否则去掉行首的# <br /><br /></li><li>在 /etc/xinetd.d 目录下创建一个文件，随便命名，比如 cvs <br /><span style="FONT-STYLE: italic">vi /etc/xinetd.d/cvs</span><br />在其中添上 <br /></li><li>保存以后创建一个名为 cvs 的组和一个名为 cvsroot 的用户 <br /><span style="FONT-STYLE: italic">groupadd cvs <br />useradd -g cvs -s /sbin/nologin cvsroot</span><br /><br /></li><li>然后 <br /><span style="FONT-STYLE: italic">vi /etc/profile</span><br />在其中添上 <br /><span style="FONT-STYLE: italic">export CVSROOT = /home/cvsroot</span><br /><br /></li><li>重启 xinetd: <br /><span style="FONT-STYLE: italic">/etc/init.d/xinetd restart</span><br /><br /></li><li>初始化CVS仓库 <br /><span style="FONT-STYLE: italic">cvs -d /home/cvsroot init</span><br /><br />这样CVS就可以用了 <br /></li></ul><br /><br />如果不修改以上的错误，就会在cvs login的时候出现：cvs [login aborted]: unrecognized auth response from localhost: Usage: cvs [cvs-options] command [command-options-and-arguments] 这样的错误提示。 <br /><br /><ul>使用提示： <br /><li>添加仓库: 进入到你的源码目录 <br /><span style="FONT-STYLE: italic">cd /your/sources/path</span><br />然后执行 <br /><span style="FONT-STYLE: italic">cvs export SOURCE_DIR_NAME Author Version</span><br />其中的SOURCE_DIR_NAME 就是你的工程在 CVSROOT 目录中保存的目录名, Author 为工程作者， Version 为你的工程发行版本号，必须以字母开头 <br /><br /></li><li>添加匿名只读用户: <br /><span style="FONT-STYLE: italic">useradd -g cvs -M -s /sbin/nologin anonymous <br />chmod 644 /home/cvsroot/CVSROOT/passwd <br />echo "anonymous::anonymous" &gt;&gt; /home/cvsroot/CVSROOT/passwd <br />chmod 444 /home/cvsroot/CVSROOT/passwd <br />echo "anonymous" &gt;&gt; /home/cvsroot/CVSROOT/readers <br />chmod 444 /home/cvsroot/readers</span><br /><br /></li><li>防止CVSROOT被下载: <br /><span style="FONT-STYLE: italic">chmod 644 /home/cvsroot/CVSROOT/modules <br />echo "CVSROOT -a" &gt;&gt; /home/cvsroot/CVSROOT/modules <br />chmod 444 /home/cvsroot/CVSROOT/modules</span><br /><br /></li><li>不使用 real system user 登陆: <br /><span style="FONT-STYLE: italic">chmod 644 $CVSROOT/CVSROOT/config <br />vi $CVSROOT/CVSROOT/config</span><br />将第二行的 <br />#SystemAuth = no <br />去掉注释，即改为 <br />SystemAuth = no <br /></li></ul></span><table cellspacing="1" cellpadding="3" width="90%" align="center" border="0"><tbody><tr><td><span class="genmed"><b><font size="2">引用:</font></b></span></td></tr><tr><td class="quote"><br />service cvspserver <br />{ <br />socket_type = stream <br />wait = no <br />user = root <br />env = HOME= <br />server = /usr/bin/cvs <br /># 以下配置选项是错误的，错误之处用红色标记 <br /># <span>server-tags</span> = --allow-root=/home/cvsroot pserver <br />server_args = --allow-root=/home/cvsroot pserver <br />} <br /></td></tr></tbody></table><span class="postbody"><br /></span><img src ="http://www.blogjava.net/rain1102/aggbug/88488.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Chau</a> 2006-12-18 12:01 <a href="http://www.blogjava.net/rain1102/articles/88488.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat中配置commons-logging 和 log4j</title><link>http://www.blogjava.net/rain1102/articles/82573.html</link><dc:creator>Eric.Chau</dc:creator><author>Eric.Chau</author><pubDate>Tue, 21 Nov 2006 09:10:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/articles/82573.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/82573.html</wfw:comment><comments>http://www.blogjava.net/rain1102/articles/82573.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/82573.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/82573.html</trackback:ping><description><![CDATA[1.先把把commons-logging.jar 和 log4j-xxx.jar 拷贝到 tomcat.home/common/lib/ 下.在 tomcat.home/common/classes/ 下建个 log4j.properties 就行了.这样所有输出信息可以由 log4j.properties 控制.<br />log4j.properties 文件:<br /><pre class="myframe"><font color="#006400"># For JBoss: Avoid to setup Log4J outside $JBOSS_HOME/server/default/deploy/log4j.xml!<br /># For all other servers: Comment out the Log4J listener in web.xml to activate Log4J.<br />log4j.rootLogger=INFO, stdout, logfile<br /><br />log4j.appender.stdout=org.apache.log4j.ConsoleAppender<br />log4j.appender.stdout.layout=org.apache.log4j.PatternLayout<br />log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - &lt;%m&gt;%n<br /><br />log4j.appender.logfile=org.apache.log4j.RollingFileAppender<br />log4j.appender.logfile.File=/home/camry/work/logs/xxxx.log<br />log4j.appender.logfile.MaxFileSize=512KB<br /># Keep three backup files.<br />log4j.appender.logfile.MaxBackupIndex=3<br /># Pattern to output: date priority [category] - message<br />log4j.appender.logfile.layout=org.apache.log4j.PatternLayout<br />log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n<br /></font><font face="Times New Roman">2.若你的 tomcat 中有好几个项目, 想不同项目日志写到不同位置去.可以在项目中创建个 Log4jInitServlet.class 来载入该项目的 log4j.properties.这时可以把 log4j.properties 放到 WEB-INF/ 下, 当然愿意放其他位置也可以.<br />代码如下:<br />WEB-INF/web.xml:<br /></font><font color="#006400">  &lt;servlet&gt; <br />    &lt;servlet-name&gt;log4j-init&lt;/servlet-name&gt; <br />    &lt;servlet-class&gt; <br />      com.xxx.xxxx.Log4jInitServlet <br />    &lt;/servlet-class&gt; <br />    &lt;init-param&gt; <br />      &lt;param-name&gt;log4j&lt;/param-name&gt; <br />      &lt;!-- 这里标出了位置 --&gt; <br />      &lt;param-value&gt;/WEB-INF/log4j.properties&lt;/param-value&gt; <br />    &lt;/init-param&gt; <br />    &lt;load-on-startup&gt;1&lt;/load-on-startup&gt; <br />  &lt;/servlet&gt;</font> <br />Log4jInitServlet.java :<br /><font color="#006400">package com.xxx.util; <br /> <br />  import org.apache.log4j.PropertyConfigurator; <br /> <br />  import javax.servlet.http.HttpServlet; <br />  import javax.servlet.http.HttpServletRequest; <br />  import javax.servlet.http.HttpServletResponse; <br /> <br />  /** <br />   * to-do init log4j. <br />   */ <br />  public class Log4jInitServlet extends HttpServlet { <br /> <br />    /** <br />     * initial. <br />     */ <br />    public void init() { <br />      String prefix = getServletContext().getRealPath("/"); <br />      // 读出上面标出的位置 <br />      String file = getInitParameter("log4j"); <br />      PropertyConfigurator.configure(prefix + file); <br />    } // END: init <br />  } // END: Log4jInitServlet <br />  ... <br /><br /><br /><br /><br /><br /></font></pre><img src ="http://www.blogjava.net/rain1102/aggbug/82573.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Chau</a> 2006-11-21 17:10 <a href="http://www.blogjava.net/rain1102/articles/82573.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转换编码</title><link>http://www.blogjava.net/rain1102/articles/81722.html</link><dc:creator>Eric.Chau</dc:creator><author>Eric.Chau</author><pubDate>Fri, 17 Nov 2006 03:12:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/articles/81722.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/81722.html</wfw:comment><comments>http://www.blogjava.net/rain1102/articles/81722.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/81722.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/81722.html</trackback:ping><description><![CDATA[native2ascii -encoding UTF-8 ApplicationResources_zh.properties ApplicationResources_zh_CN.properties<img src ="http://www.blogjava.net/rain1102/aggbug/81722.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Chau</a> 2006-11-17 11:12 <a href="http://www.blogjava.net/rain1102/articles/81722.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>连接SQL Server和Oracle</title><link>http://www.blogjava.net/rain1102/articles/81719.html</link><dc:creator>Eric.Chau</dc:creator><author>Eric.Chau</author><pubDate>Fri, 17 Nov 2006 03:06:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/articles/81719.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/81719.html</wfw:comment><comments>http://www.blogjava.net/rain1102/articles/81719.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/81719.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/81719.html</trackback:ping><description><![CDATA[<p>Oracle<br />url=jdbc:oracle:thin:@192.168.1.110:1521:zhongxin<br />driver=oracle.jdbc.driver.OracleDriver<br />username=xxb<br />password=xxb</p>
		<p>SQLServer<br />url=jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=hagov<br />drive=com.microsoft.jdbc.sqlserver.SQLServerDriver<br />username=sa<br />password=sa<br />dialect=org.hibernate.dialect.SQLServerDialect</p><img src ="http://www.blogjava.net/rain1102/aggbug/81719.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Chau</a> 2006-11-17 11:06 <a href="http://www.blogjava.net/rain1102/articles/81719.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>