﻿<?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-CowNew开源团队-随笔分类-技术类</title><link>http://www.blogjava.net/huanzhugege/category/20507.html</link><description>http://www.cownew.com
邮件请联系 about521 at 163.com</description><language>zh-cn</language><lastBuildDate>Tue, 20 Oct 2009 04:07:34 GMT</lastBuildDate><pubDate>Tue, 20 Oct 2009 04:07:34 GMT</pubDate><ttl>60</ttl><item><title>不要再拍脑袋，要科学的计算</title><link>http://www.blogjava.net/huanzhugege/archive/2009/10/20/299002.html</link><dc:creator>CowNew开源团队</dc:creator><author>CowNew开源团队</author><pubDate>Tue, 20 Oct 2009 04:06:00 GMT</pubDate><guid>http://www.blogjava.net/huanzhugege/archive/2009/10/20/299002.html</guid><wfw:comment>http://www.blogjava.net/huanzhugege/comments/299002.html</wfw:comment><comments>http://www.blogjava.net/huanzhugege/archive/2009/10/20/299002.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huanzhugege/comments/commentRss/299002.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huanzhugege/services/trackbacks/299002.html</trackback:ping><description><![CDATA[<div>昨天网站虚拟主机提供商发送提醒邮件说我的网站&#8220;如鹏网&#8221;流量超标了，很奇怪，上个月流量用了一半多一点儿，这个月网站访问量并没有明显的上升，怎么会这个月才过20天就流量超标了呢？到网站后台查看流量报表才发现agent.php消耗了31%的流量，将近1/3呀。<br />
<br />
agent.php就是为<a href="http://www.rupeng.com/forum/thread-4391-1-1.html" target="_blank"><font color="#0000ff">&#8220;如鹏助手&#8221;</font></a> 提供数据的api页面，默认如鹏助手每10秒钟就会向这个页面请求最近50条新帖和50条新回复。当时开发的时候也考虑过这个功能会不会对网站流量有非常大的消耗，但是当时没有进行科学的计算，想当然的认为不会。但是现在仔细一算，50条新帖、50条新回复的信息估计有100K，那么每分钟请求6次，假设每天监控15小时，每个月30天，那么一个月的流量就是100K*6*60*15*30=16200000k=16200M=<font color="#ff0000">16.2G</font>，恐怖呀！！！网站每月限定流量是45G，正好是16.2/45=36%，估算和报表中的31%差不多。<br />
<br />
因为网站流量已经超标，因此必须买额外的流量才能保证网站正常运行，10G的流量一个月20元，买流量就要买足剩下10个月的，10个月就是200元，本来这部分花费是可以避免的。当初花几分钟算一下就不至于犯这种错误！<br />
<br />
<font color="#ff0000">不要再拍脑袋，要科学的计算！！！！！！！！！</font><br />
<font color="#ff0000"></font><br />
为了减少如鹏助手流量消耗，我做了如下的优化：<br />
1、agent.php不再传输全部的帖子内容，帖子正文只传输前50个字。<br />
2、去掉agent.php传输帖子中的空格等无意义字符。<br />
3、因为如鹏网现在发帖量不大，没必要每次显示50条最新贴，因此改为只传输10条最新贴。<br />
4、在agent.php头部加入&#8220;Ob_Start('ob_gzhandler');&#8221;，也就是启用GZip压缩网页，减少网页的流量传输。<br />
5、降低如鹏助手的刷新频率，由10秒刷新一次改为60秒刷新一次</div>
<div>经过本次优化，10条新帖、10条新回复的信息估计有6K，6K*1*60*15*30=162000K=162M=0.162G。这样流量消耗基本可以忽略不计了。<br />
<br />
<font color="#ff0000">不要再拍脑袋，要科学的计算！！！！！！！！！</font><br />
</div>
<img src ="http://www.blogjava.net/huanzhugege/aggbug/299002.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huanzhugege/" target="_blank">CowNew开源团队</a> 2009-10-20 12:06 <a href="http://www.blogjava.net/huanzhugege/archive/2009/10/20/299002.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>远离新版本软件，拒当小白鼠</title><link>http://www.blogjava.net/huanzhugege/archive/2009/06/11/281386.html</link><dc:creator>CowNew开源团队</dc:creator><author>CowNew开源团队</author><pubDate>Thu, 11 Jun 2009 02:31:00 GMT</pubDate><guid>http://www.blogjava.net/huanzhugege/archive/2009/06/11/281386.html</guid><wfw:comment>http://www.blogjava.net/huanzhugege/comments/281386.html</wfw:comment><comments>http://www.blogjava.net/huanzhugege/archive/2009/06/11/281386.html#Feedback</comments><slash:comments>24</slash:comments><wfw:commentRss>http://www.blogjava.net/huanzhugege/comments/commentRss/281386.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huanzhugege/services/trackbacks/281386.html</trackback:ping><description><![CDATA[<h2>远离新版本软件，拒当小白鼠</h2>
<div class="t_msgfont" id="postmessage_16778"><font color="#ff0000"><font size="4">本文是专门为在校生写的，是看到了很多同学把很多精力放到折腾这种各样的新软件而忽略了正路的学习有感而发，不是针对那些有太多时间研究新东西、有志于改善世界上所有软件、要解放全人类的牛人。</font></font><br />
=================================================================================================</div>
<br />
刚才帮一个同学解决一个在IE8下在如鹏论坛无法发帖的问题。由于如鹏论坛使用的Discuz系统的验证问答功能对IE8支持有Bug，所以新用户无法发帖。验证问答功能是防止垃圾广告的一个有效手段，但是对IE8、Opera、chrome等非主流浏览器支持有Bug。刚才为了能让这个同学发帖，我就暂时关闭了验证问答功能，但是刚关闭了，就来了一大堆垃圾广告贴。所以我就赶紧又把验证问答功能打开了。所以以后<font style="color: #000000" color="red">使用IE8、Opera、chrome等非主流浏览器访问如鹏论坛的时候会有这样那样的问题，现在也没有精力解决这些问题</font>，只能满足大多数同学的需求了。<br />
&nbsp; &nbsp; 我以及很多同事都有一个新习惯，<font color="red">绝对不拿新软件尝鲜</font>。因为新软件千好万好，但是经验证明新软件会给我带来麻烦而不是方便。当年XP刚推出的时候，我还在上学，很多同学抢着装，我就还是Win2000坚持不动摇，当时大部分软件都能在Win2000下跑的很好，而很多软件对XP兼容性不是很好，所以他们一直在跟XP做斗争，我则用着Win2000做着该做的事，编着该编的代码。碰到问题当时网上介绍的方法都是在Win2000下的解决方案。这节省了很多时间。毕竟操作系统、电脑只是工具，是要工具为你服务，不是给你添乱。<br />
&nbsp; &nbsp; 还有当初IE7推出的时候，很多人尝鲜用IE7，可是很多网站都对IE7支持有问题，到最后干什么都干不了。而那些用IE6的人则干着该干的事情，一点时间、精力都没浪费。<br />
&nbsp; &nbsp; IE8推出来了，我相信它很好，我相信它比IE6、IE7都好，比别的浏览器都好，可是有一点，很多网站用IE8看都有问题，那我用IE8干什么，给自己找那个麻烦干什么。有同学说&#8220;IE8用起来快&#8221;，由于网站对IE8支持有问题导致你你一个帖子半个小时都发不出去，节省的那点时间早就浪费没了。<font color="darkred">浏览器的目的是上网，不是给别人当小白鼠。</font>我估计早晚有用IE8的那一天，但是那一天是所有网站都对IE8支持没问题我再用IE8。我不当小白鼠。<br />
&nbsp; &nbsp; Vista推出来了，同学们争着用，可是各个软件在Vista上装的都有问题，那不是给自己找闲事儿吗？竟然还有同学用Windows7，Win7和IE8现在都是测试版，各个软件的兼容程度可想而知，给自己找那个麻烦干什么？等主流软件都支持他们在说吧。有同学说Windows7兼容性可好了，可是再好有XP好吗？只要没有的话你就有可能运行一个别人能跑你不能跑的软件，给自己添那个麻烦干什么。别人在拿着书在运行着代码，你却在为着开发工具和操作系统的兼容性艰苦奋斗着，何必活的那么累呢。<br />
&nbsp; &nbsp; 我现在从事的银行系统软件开发中，一个新技术推出以后必须经过其他客户至少三年的验证和升级以后才会考虑使用，就是基于这样的考虑，毕竟工具是给人用的，不是给人添麻烦的。<br />
<br />
<p align="center"><font size="6"><font color="red">远离新版本软件，拒绝当小白鼠！<br />
==================================================<br />
<font color="#ff0000"><font size="4">本文是专门为在校生写的，是看到了很多同学把很多精力放到折腾这种各样的新软件而忽略了正路的学习有感而发，不是针对那些有太多时间研究新东西、有志于改善世界上所有软件、要解放全人类的牛人。</font></font><br />
</font></font></p>
<img src ="http://www.blogjava.net/huanzhugege/aggbug/281386.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huanzhugege/" target="_blank">CowNew开源团队</a> 2009-06-11 10:31 <a href="http://www.blogjava.net/huanzhugege/archive/2009/06/11/281386.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>lighthttp中设置disucz转发的方法最详细版</title><link>http://www.blogjava.net/huanzhugege/archive/2009/05/16/271040.html</link><dc:creator>CowNew开源团队</dc:creator><author>CowNew开源团队</author><pubDate>Sat, 16 May 2009 13:41:00 GMT</pubDate><guid>http://www.blogjava.net/huanzhugege/archive/2009/05/16/271040.html</guid><wfw:comment>http://www.blogjava.net/huanzhugege/comments/271040.html</wfw:comment><comments>http://www.blogjava.net/huanzhugege/archive/2009/05/16/271040.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huanzhugege/comments/commentRss/271040.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huanzhugege/services/trackbacks/271040.html</trackback:ping><description><![CDATA[<p>1、编写rewrite脚本，编辑/etc/lighttpd/local.lighttpd.conf内容如下：<br />
url.rewrite-once = (<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "^/forum/archiver/((fid|tid)-[\w\-]+\.html)$" =&gt; "forum/archiver/index.php?$1",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "^/forum/forum-([0-9]+)-([0-9]+)\.html$" =&gt; "forum/forumdisplay.php?fid=$1&amp;page=$2",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "^/forum/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$" =&gt; "forum/viewthread.php?tid=$1&amp;extra=page%%53D$3&amp;page=$2",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "^/forum/space-(username|uid)-(.+)\.html$" =&gt; "forum/space.php?$1=$2",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "^/forum/tag-(.+)\.html$" =&gt; "forum/tag.php?name=$1"<br />
)<br />
这里假设论坛装在forum目录下，如果是装在根目录下则是：<br />
url.rewrite-once = (<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "^/archiver/((fid|tid)-[\w\-]+\.html)$" =&gt; "archiver/index.php?$1",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "^/forum-([0-9]+)-([0-9]+)\.html$" =&gt; "forumdisplay.php?fid=$1&amp;page=$2",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "^/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$" =&gt; "viewthread.php?tid=$1&amp;extra=page%%53D$3&amp;page=$2",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "^/space-(username|uid)-(.+)\.html$" =&gt; "space.php?$1=$2",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "^/tag-(.+)\.html$" =&gt; "tag.php?name=$1"<br />
)</p>
<p>2、重启lighttpd，重启方法：/etc/init.d/lighttpd restart</p>
<img src ="http://www.blogjava.net/huanzhugege/aggbug/271040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huanzhugege/" target="_blank">CowNew开源团队</a> 2009-05-16 21:41 <a href="http://www.blogjava.net/huanzhugege/archive/2009/05/16/271040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>防盗链的设置</title><link>http://www.blogjava.net/huanzhugege/archive/2009/05/04/268799.html</link><dc:creator>CowNew开源团队</dc:creator><author>CowNew开源团队</author><pubDate>Mon, 04 May 2009 05:37:00 GMT</pubDate><guid>http://www.blogjava.net/huanzhugege/archive/2009/05/04/268799.html</guid><wfw:comment>http://www.blogjava.net/huanzhugege/comments/268799.html</wfw:comment><comments>http://www.blogjava.net/huanzhugege/archive/2009/05/04/268799.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huanzhugege/comments/commentRss/268799.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huanzhugege/services/trackbacks/268799.html</trackback:ping><description><![CDATA[<p>RewriteEngine on </p>
<p>RewriteCond %{HTTP_REFERER} !^$ [NC]<br />
RewriteCond %{HTTP_REFERER} !^http://rupeng.com/.*$ [NC]<br />
RewriteCond %{HTTP_REFERER} !^http://rupeng.com$ [NC]<br />
RewriteCond %{HTTP_REFERER} !^http://www.rupeng.com/.*$ [NC]<br />
RewriteCond %{HTTP_REFERER} !^http://www.rupeng.com$ [NC]<br />
RewriteCond %{HTTP_REFERER} !^http://www.tinyosstudy.com/.*$ [NC]<br />
RewriteCond %{HTTP_REFERER} !^http://www.tinyosstudy.com$ [NC]<br />
RewriteRule .*.(jpg|jpeg|gif|png|bmp|rar|zip|exe|pdf|attach|chm)$&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.rupeng.com">http://www.rupeng.com</a></p>
<br />
一定要注意保存为Unix格式。有的版本的IE&#8220;另存为&#8221;发送的referer为空，所以加上第一行&#8220;RewriteCond %{HTTP_REFERER} !^$ [NC]&#8221;
<img src ="http://www.blogjava.net/huanzhugege/aggbug/268799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huanzhugege/" target="_blank">CowNew开源团队</a> 2009-05-04 13:37 <a href="http://www.blogjava.net/huanzhugege/archive/2009/05/04/268799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>杨中科的最新力作《程序员的SQL金典》</title><link>http://www.blogjava.net/huanzhugege/archive/2008/10/23/236095.html</link><dc:creator>CowNew开源团队</dc:creator><author>CowNew开源团队</author><pubDate>Thu, 23 Oct 2008 01:58:00 GMT</pubDate><guid>http://www.blogjava.net/huanzhugege/archive/2008/10/23/236095.html</guid><wfw:comment>http://www.blogjava.net/huanzhugege/comments/236095.html</wfw:comment><comments>http://www.blogjava.net/huanzhugege/archive/2008/10/23/236095.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/huanzhugege/comments/commentRss/236095.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huanzhugege/services/trackbacks/236095.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/huanzhugege/WindowsLiveWriter/SQL_8BC7/shupi_2.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="440" alt="shupi" src="http://www.blogjava.net/images/blogjava_net/huanzhugege/WindowsLiveWriter/SQL_8BC7/shupi_thumb.jpg" width="352" border="0" /></a>&nbsp; </p>
<p>Chinapub在线购买地址：<a href="http://www.china-pub.com/301651">http://www.china-pub.com/301651</a></p>
<p>当当网在线购买地址：<a href="http://product.dangdang.com/product.aspx?product_id=20368319">http://product.dangdang.com/product.aspx?product_id=20368319</a></p>
<p>试读电子版下载：<br />
下载地址1：<a href="http://www.blogjava.net/Files/huanzhugege/cxydSQLjd.zip">http://www.blogjava.net/Files/huanzhugege/cxydSQLjd.zip<br />
</a>下载地址2： <a href="http://www.namipan.com/d/2ec1eacc92d2678a38095bef1d19ed938f78831d6f791500">http://www.namipan.com/d/2ec1eacc92d2678a38095bef1d19ed938f78831d6f791500</a> <br />
第一本专门为程序员编写的数据库图书</p>
<h1>《程序员的SQL金典》</h1>
<ul>
    <li><strong>将子查询、表连接、数据库语法差异等用通俗易懂、诙谐幽默的语言讲解出来</strong>
    <li><strong>配合大量真实案例，学了就能用，在短时间内成为数据库开发高手</strong>
    <li><strong>高度提取不同数据库的共同点，仔细分析不同点，并给出解决方案，同时学会MSSQLServer、MYSQL、Oracle、DB2数据库不再是梦</strong>
    <li><strong>国内第一本讲解开窗函数实际应用的图书</strong> </li>
</ul>
<p>轻举技术之&#8220;纲&#8221;，张合用之&#8220;目&#8221;，锻造SQL高可用性数据库应用指南从理论到实践，凝聚SQL主流数据库最前沿的技术要领。</p>
<p>本书特色：主要介绍SQL的语法规则及在实际开发中的应用，并且对SQL在MySQL、MS SQL Server、Oracle和DB2中的差异进行了分析；详细讲解数据库对增、删、改、查等SQL的支持并给出了相应的SQL应用案例；透彻分析函数、子查询、表连接、不同DBMS中的SQL语法差异、SQL调优、NULL值处理、事务、开窗函数等高级技术；通过对实际案例开发过程的详细分析，使读者掌握SQL的综合应用技巧。</p>
<p>内容提要</p>
<p>本书主要介绍SQL以及在实际开发中的应用，并且对SQL在MYSQL、MSSQLServer、Oracle和DB2中的差异性进行了分析。本书分为三部分：第一部分为基础篇，主要讲解数据库对增删改查等SQL的支持，给出了这些SQL的应用案例；第二部分为进阶篇，讲解了函数、子查询、表联接、不同DBMS中SQL语法差异、SQL调优、NULL值处理、事务、开窗函数等高级技术；第三部分为案例篇，讲解了前两部分的知识的综合运用。此书适用于学习数据库编程的读者，对于有一定数据库开发经验的读者也有非常大的参考价值。</p>
<p>前言</p>
<p>市面上讲解数现在据库的书都花了很多篇幅讲解数据库的备份、授权、调优、修复、监控等内容，这些内容是数据库管理员（DBA）应该掌握的，而对于程序员来说更需要去掌握的则是SQL语句的使用。但是市面上专门讲解SQL语句的书非常少，初学者学习数据库开发过程中常常被那些写给DBA的书弄的晕头转向，无法真正快速的掌握SQL技术；而且这些书中讲解的SQL也常常是针对特定数据库系统的专有实现，无法很容易的在其他数据库系统中运行，读者需要阅读大量的书和查阅大量的文档才能掌握不同数据库系统的使用。</p>
<p>本书是专门写给程序员的，因此没有讲解备份、授权、调优、修复、监控等开发人员不关心的内容，直接从SQL语句入手让读者快速的掌握数据库开发的技能。&#8220;面向开发人员，讲解对开发人员最有用的知识&#8221;是本书的编写宗旨。</p>
<p>MYSQL、MSSQLServer、Oracle和DB2等都是非常流行的数据库管理系统（DBMS），虽然在大部分SQL语法上这些DBMS实现都是一致的，不过在实现细节以及高级语法方面这些DBMS的实现差异还是非常大的。如果编写能够兼容这些DBMS的SQL语句是开发人员经常需要面对的问题。本书将帮助读者从根本上解决这个问题。</p>
<p>很多开发人员对于SQL语句的掌握只限于简单的SELECT、UPDATE语句，对于稍微复杂的逻辑经常需要编写程序代码来完成，这不仅无法发挥数据库的优势，而且开发出的系统性能非常低，而如果能够使用数据库函数、子查询、表联接、开窗函数等高级的SQL特性则可以大大简化系统开发的难度，并且提高系统的性能。本书将对这些高级特性进行详细的讲解。</p>
<p>本书第1、2章介绍数据库系统的基本知识以及基本操作；第3章介绍Insert、Delete和Update语句的基本应用；第4章对Select语句进行全面的介绍，对模糊匹配、分组、限制数据条数、计算字段、组合查询等高级内容进行了重点的讲解；第5章介绍常用的数据库函数以及它们在主流DBMS中的实现差异；第6章介绍索引与约束等知识点；第7、8章分别介绍表连接、子查询等高级查询技术；第9章对主流DBMS的语法差异进行分析，并且给出了解决方案；第10章介绍注入漏洞攻击、SQL调优、事务、自动增长字段、NULL值处理、开窗函数等高级话题；第11章以一个案例讲解书中知识点在实际开发中的应用。</p>
<p>在此，我要感谢为这本书的诞生给于我帮助的所有人。首先我要感谢CowNew开源团队的朋友们一直以来的无私奉献；感谢KingChou在开发CowNewSQL过程中的卓越工作，没有CowNewSQL也就不会有这本书的问世；还要感谢EasyJF的蔡世友，他一直以来对开源事业的奉献是值得我学习的；最后我要感谢电子工业出版社的田小康经理，他的高效工作使得本书能够顺利的完成和出版。</p>
<p>如果您对我的书有任何意见和建议，您可以给我发送邮件：about521@163.com，本书相关的后续资料将会发布到CowNew开源团队网站（http://www.cownew.com）中。</p>
<p>第1章 数据库入门 1</p>
<p>1.1 数据库概述 1</p>
<p>1.1.1 数据库与数据库管理系统 1</p>
<p>1.1.2 数据库能做什么 2</p>
<p>1.1.3 主流数据库管理系统介绍 2</p>
<p>1.2 数据库基础概念 5</p>
<p>1.2.1 Catalog 5</p>
<p>1.2.2 表（Table） 6</p>
<p>1.2.3 列（Column） 7</p>
<p>1.2.4 数据类型（DataType） 8</p>
<p>1.2.5 记录（Record） 9</p>
<p>1.2.6 主键（PrimaryKey） 9</p>
<p>1.2.7 索引（Index） 10</p>
<p>1.2.8 表关联 12</p>
<p>1.2.9 数据库的语言——SQL 13</p>
<p>1.2.10 DBA与程序员 14</p>
<p>第2章 数据表的创建和管理 17</p>
<p>2.1 数据类型 17</p>
<p>2.1.1 整数类型 17</p>
<p>2.1.2 数值类型 19</p>
<p>2.1.3 字符相关类型 21</p>
<p>2.1.4 日期时间类型 23</p>
<p>2.1.5 二进制类型 24</p>
<p>2.2 通过SQL语句管理数据表 25</p>
<p>2.2.1 创建数据表 25</p>
<p>2.2.2 定义非空约束 26</p>
<p>2.2.3 定义默认值 27</p>
<p>2.2.4 定义主键 27</p>
<p>2.2.5 定义外键 29</p>
<p>2.2.6 修改已有数据表 30</p>
<p>2.2.7 删除数据表 31</p>
<p>2.2.8 受限操作的变通解决方案 31</p>
<p>第3章 数据的增、删、改 33</p>
<p>3.1 数据的插入 34</p>
<p>3.1.1 简单的INSERT语句 34</p>
<p>3.1.2 简化的INSERT语句 36</p>
<p>3.1.3 非空约束对数据插入的影响 36</p>
<p>3.1.4 主键对数据插入的影响 37</p>
<p>3.1.5 外键对数据插入的影响 38</p>
<p>3.2 数据的更新 38</p>
<p>3.2.1 简单的数据更新 39</p>
<p>3.2.2 带WHERE子句的UPDATE语句 40</p>
<p>3.2.3 非空约束对数据更新的影响 41</p>
<p>3.2.4 主键对数据更新的影响 42</p>
<p>3.2.5 外键对数据更新的影响 42</p>
<p>3.3 数据的删除 43</p>
<p>3.3.1 简单的数据删除 43</p>
<p>3.3.2 带WHERE子句的DELETE语句 44</p>
<p>第4章 数据的检索 47</p>
<p>4.1 SELECT基本用法 48</p>
<p>4.1.1 简单的数据检索 48</p>
<p>4.1.2 检索出需要的列 49</p>
<p>4.1.3 列别名 51</p>
<p>4.1.4 按条件过滤 52</p>
<p>4.1.5 数据汇总 53</p>
<p>4.1.6 排序 56</p>
<p>4.2 高级数据过滤 59</p>
<p>4.2.1 通配符过滤 59</p>
<p>4.2.2 空值检测 63</p>
<p>4.2.3 反义运算符 64</p>
<p>4.2.4 多值检测 65</p>
<p>4.2.5 范围值检测 66</p>
<p>4.2.6 低效的&#8220;WHERE 1=1&#8221; 68</p>
<p>4.3 数据分组 72</p>
<p>4.3.1 数据分组入门 74</p>
<p>4.3.2 数据分组与聚合函数 76</p>
<p>4.3.3 HAVING语句 79</p>
<p>4.4 限制结果集行数 81</p>
<p>4.4.1 MySQL 81</p>
<p>4.4.2 MS SQL Server 2000 82</p>
<p>4.4.3 MS SQL Server 2005 83</p>
<p>4.4.4 Oracle 84</p>
<p>4.4.5 DB2 86</p>
<p>4.4.6 数据库分页 88</p>
<p>4.5 抑制数据重复 90</p>
<p>4.6 计算字段 91</p>
<p>4.6.1 常量字段 92</p>
<p>4.6.2 字段间的计算 93</p>
<p>4.6.3 数据处理函数 95</p>
<p>4.6.4 字符串的拼接 97</p>
<p>4.6.5 计算字段的其他用途 103</p>
<p>4.7 不从实体表中取的数据 105</p>
<p>4.8 联合结果集 107</p>
<p>4.8.1 简单的结果集联合 108</p>
<p>4.8.2 联合结果集的原则 110</p>
<p>4.8.3 UNION ALL 112</p>
<p>4.8.4 联合结果集应用举例 114</p>
<p>第5章 函数 119</p>
<p>5.1 数学函数 122</p>
<p>5.1.1 求绝对值 122</p>
<p>5.1.2 求指数 122</p>
<p>5.1.3 求平方根 123</p>
<p>5.1.4 求随机数 123</p>
<p>5.1.5 舍入到最大整数 125</p>
<p>5.1.6 舍入到最小整数 126</p>
<p>5.1.7 四舍五入 127</p>
<p>5.1.8 求正弦值 128</p>
<p>5.1.9 求余弦值 129</p>
<p>5.1.10 求反正弦值 129</p>
<p>5.1.11 求反余弦值 130</p>
<p>5.1.12 求正切值 130</p>
<p>5.1.13 求反正切值 131</p>
<p>5.1.14 求两个变量的反正切 131</p>
<p>5.1.15 求余切 132</p>
<p>5.1.16 求圆周率&#960;值 132</p>
<p>5.1.17 弧度制转换为角度制 133</p>
<p>5.1.18 角度制转换为弧度制 134</p>
<p>5.1.19 求符号 134</p>
<p>5.1.20 求整除余数 135</p>
<p>5.1.21 求自然对数 136</p>
<p>5.1.22 求以10为底的对数 136</p>
<p>5.1.23 求幂 137</p>
<p>5.2 字符串函数 137</p>
<p>5.2.1 计算字符串长度 138</p>
<p>5.2.2 字符串转换为小写 138</p>
<p>5.2.3 字符串转换为大写 139</p>
<p>5.2.4 截去字符串左侧空格 139</p>
<p>5.2.5 截去字符串右侧空格 140</p>
<p>5.2.6 截去字符串两侧的空格 141</p>
<p>5.2.7 取子字符串 143</p>
<p>5.2.8 计算子字符串的位置 144</p>
<p>5.2.9 从左侧开始取子字符串 145</p>
<p>5.2.10 从右侧开始取子字符串 146</p>
<p>5.2.11 字符串替换 147</p>
<p>5.2.12 得到字符的ASCII码 148</p>
<p>5.2.13 得到一个ASCII码数字对应的字符 149</p>
<p>5.2.14 发音匹配度 151</p>
<p>5.3 日期时间函数 153</p>
<p>5.3.1 日期、时间、日期时间与时间戳 153</p>
<p>5.3.2 主流数据库系统中日期时间类型的表示方式 154</p>
<p>5.3.3 取得当前日期时间 154</p>
<p>5.3.4 日期增减 157</p>
<p>5.3.5 计算日期差额 166</p>
<p>5.3.6 计算一个日期是星期几 172</p>
<p>5.3.7 取得日期的指定部分 177</p>
<p>5.4 其他函数 183</p>
<p>5.4.1 类型转换 183</p>
<p>5.4.2 空值处理 188</p>
<p>5.4.3 CASE函数 191</p>
<p>5.5 各数据库系统独有函数 194</p>
<p>5.5.1 MySQL中的独有函数 195</p>
<p>5.5.2 MS SQL Server中的独有函数 202</p>
<p>5.5.3 Oracle中的独有函数 206</p>
<p>第6章 索引与约束 209</p>
<p>6.1 索引 209</p>
<p>6.2 约束 211</p>
<p>6.2.1 非空约束 211</p>
<p>6.2.2 唯一约束 212</p>
<p>6.2.3 CHECK约束 217</p>
<p>6.2.4 主键约束 221</p>
<p>6.2.5 外键约束 224</p>
<p>第7章 表连接 233</p>
<p>7.1 表连接简介 236</p>
<p>7.2 内连接（INNER JOIN） 236</p>
<p>7.3 不等值连接 240</p>
<p>7.4 交叉连接 241</p>
<p>7.5 自连接 245</p>
<p>7.6 外部连接 248</p>
<p>7.6.1 左外部连接 250</p>
<p>7.6.2 右外部连接 251</p>
<p>7.6.3 全外部连接 252</p>
<p>第8章 子查询 255</p>
<p>8.1 子查询入门 261</p>
<p>8.1.1 单值子查询 261</p>
<p>8.1.2 列值子查询 263</p>
<p>8.2 SELECT列表中的标量子查询 265</p>
<p>8.3 WHERE子句中的标量子查询 267</p>
<p>8.4 集合运算符与子查询 270</p>
<p>8.4.1 IN运算符 270</p>
<p>8.4.2 ANY和SOME运算符 272</p>
<p>8.4.3 ALL运算符 274</p>
<p>8.4.4 EXISTS运算符 275</p>
<p>8.5 在其他类型SQL语句中的子查询应用 277</p>
<p>8.5.1 子查询在INSERT语句中的应用 277</p>
<p>8.5.2 子查询在UPDATE语句中的应用 283</p>
<p>8.5.3 子查询在DELETE语句中的应用 285</p>
<p>第9章 主流数据库的SQL语法差异解决方案 287</p>
<p>9.1 SQL语法差异分析 287</p>
<p>9.1.1 数据类型的差异 287</p>
<p>9.1.2 运算符的差异 288</p>
<p>9.1.3 函数的差异 289</p>
<p>9.1.4 常用SQL的差异 289</p>
<p>9.1.5 取元数据信息的差异 290</p>
<p>9.2 消除差异性的方案 293</p>
<p>9.2.1 为每种数据库编写不同的SQL语句 293</p>
<p>9.2.2 使用语法交集 294</p>
<p>9.2.3 使用SQL实体对象 294</p>
<p>9.2.4 使用ORM工具 295</p>
<p>9.2.5 使用SQL翻译器 296</p>
<p>9.3 CowNewSQL翻译器 299</p>
<p>9.3.1 CowNewSQL支持的数据类型 299</p>
<p>9.3.2 CowNewSQL支持的SQL语法 300</p>
<p>9.3.3 CowNewSQL支持的函数 305</p>
<p>9.3.4 CowNewSQL的使用方法 309</p>
<p>第10章 高级话题 313</p>
<p>10.1 SQL注入漏洞攻防 313</p>
<p>10.1.1 SQL注入漏洞原理 313</p>
<p>10.1.2 过滤敏感字符 314</p>
<p>10.1.3 使用参数化SQL 315</p>
<p>10.2 SQL调优 316</p>
<p>10.2.1 SQL调优的基本原则 317</p>
<p>10.2.2 索引 317</p>
<p>10.2.3 全表扫描和索引查找 318</p>
<p>10.2.4 优化手法 318</p>
<p>10.3 事务 324</p>
<p>10.3.1 事务简介 324</p>
<p>10.3.2 事务的隔离 325</p>
<p>10.3.3 事务的隔离级别 326</p>
<p>10.3.4 事务的使用 327</p>
<p>10.4 自动增长字段 327</p>
<p>10.4.1 MySQL中的自动增长字段 327</p>
<p>10.4.2 MS SQL Server中的自动增长字段 328</p>
<p>10.4.3 Oracle中的自动增长字段 329</p>
<p>10.4.4 DB2中的自动增长字段 332</p>
<p>10.5 业务主键与逻辑主键 333</p>
<p>10.6 NULL的学问 334</p>
<p>10.6.1 NULL与比较运算符 336</p>
<p>10.6.2 NULL和计算字段 337</p>
<p>10.6.3 NULL和字符串 338</p>
<p>10.6.4 NULL和函数 339</p>
<p>10.6.5 NULL和聚合函数 339</p>
<p>10.7 开窗函数 340</p>
<p>10.7.1 开窗函数简介 342</p>
<p>10.7.2 PARTITION BY子句 344</p>
<p>10.7.3 ORDER BY子句 346</p>
<p>10.7.4 高级开窗函数 353</p>
<p>10.8 WITH子句与子查询 360</p>
<p>第11章 案例讲解 363</p>
<p>11.1 报表制作 371</p>
<p>11.1.1 显示制单人详细信息 371</p>
<p>11.1.2 显示销售单的详细信息 373</p>
<p>11.1.3 计算收益 374</p>
<p>11.1.4 产品销售额统计 378</p>
<p>11.1.5 统计销售记录的份额 379</p>
<p>11.1.6 为采购单分级 380</p>
<p>11.1.7 检索所有重叠日期销售单 383</p>
<p>11.1.8 为查询编号 385</p>
<p>11.1.9 标记所有单内最大销售量 386</p>
<p>11.2 排序 389</p>
<p>11.2.1 非字段排序规则 389</p>
<p>11.2.2 随机排序 390</p>
<p>11.3 表间比较 391</p>
<p>11.3.1 检索制作过采购单的人制作的销售单 391</p>
<p>11.3.2 检索没有制作过采购单的人制作的销售单 392</p>
<p>11.4 表复制 394</p>
<p>11.4.1 复制源表的结构并复制表中的数据 394</p>
<p>11.4.2 只复制源表的结构 395</p>
<p>11.5 计算字符在字符串中出现的次数 396</p>
<p>11.6 去除最高分、最低分 396</p>
<p>11.6.1 去除所有最低、最高值 397</p>
<p>11.6.2 只去除一个最低、最高值 397</p>
<p>11.7 与日期相关的应用 398</p>
<p>11.7.1 计算销售确认日和制单日之间相差的天数 398</p>
<p>11.7.2 计算两张销售单之间的时间间隔 399</p>
<p>11.7.3 计算销售单制单日期所在年份的天数 401</p>
<p>11.7.4 计算销售单制单日期所在月份的第一天和最后一天 402</p>
<p>11.8 结果集转置 403</p>
<p>11.8.1 将结果集转置为一行 404</p>
<p>11.8.2 把结果集转置为多行 406</p>
<p>11.9 递归查询 410</p>
<p>11.9.1 Oracle中的CONNECT BY子句 410</p>
<p>11.9.2 Oracle中的SYS_CONNECT_BY_PATH()函数 414</p>
<p>11.9.3 My SQL Server和DB2中递归查询 415</p>
<p>附录A 常用数据库系统的安装和使用 417</p>
<p>A.1 DB2的安装和使用 417</p>
<p>A.2 MySQL的安装和使用 429</p>
<p>A.3 Oracle的安装和使用 441</p>
<p>A.4 Microsoft SQL Server的安装和使用 452</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/huanzhugege/WindowsLiveWriter/SQL_8BC7/20081021_2.jpg"><img height="282" alt="20081021" src="http://www.blogjava.net/images/blogjava_net/huanzhugege/WindowsLiveWriter/SQL_8BC7/20081021_thumb.jpg" width="374" border="0" /></a></p>
<img src ="http://www.blogjava.net/huanzhugege/aggbug/236095.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huanzhugege/" target="_blank">CowNew开源团队</a> 2008-10-23 09:58 <a href="http://www.blogjava.net/huanzhugege/archive/2008/10/23/236095.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>被拿来主义给惯坏了</title><link>http://www.blogjava.net/huanzhugege/archive/2008/07/03/212319.html</link><dc:creator>CowNew开源团队</dc:creator><author>CowNew开源团队</author><pubDate>Thu, 03 Jul 2008 06:22:00 GMT</pubDate><guid>http://www.blogjava.net/huanzhugege/archive/2008/07/03/212319.html</guid><wfw:comment>http://www.blogjava.net/huanzhugege/comments/212319.html</wfw:comment><comments>http://www.blogjava.net/huanzhugege/archive/2008/07/03/212319.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huanzhugege/comments/commentRss/212319.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huanzhugege/services/trackbacks/212319.html</trackback:ping><description><![CDATA[<p>有同事竟然找LOWORD、HIWORD在C#中的替代函数搞了一个上午 。看来真是被拿来主义给惯坏了，自己写一分钟就能写出来<img src="/CuteSoft_Client/CuteEditor/images/emcrook.gif" align="absMiddle" border="0"  alt="" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 取低位<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name="i"&gt;&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;returns&gt;&lt;/returns&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static int LOWORD(int i)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return i &amp; 0xFFFF;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 取高位<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name="i"&gt;&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;returns&gt;&lt;/returns&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static int HIWORD(int i)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return i &gt;&gt; 16;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<img src ="http://www.blogjava.net/huanzhugege/aggbug/212319.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huanzhugege/" target="_blank">CowNew开源团队</a> 2008-07-03 14:22 <a href="http://www.blogjava.net/huanzhugege/archive/2008/07/03/212319.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SWT中调用Automation的方式</title><link>http://www.blogjava.net/huanzhugege/archive/2008/06/23/210099.html</link><dc:creator>CowNew开源团队</dc:creator><author>CowNew开源团队</author><pubDate>Mon, 23 Jun 2008 09:04:00 GMT</pubDate><guid>http://www.blogjava.net/huanzhugege/archive/2008/06/23/210099.html</guid><wfw:comment>http://www.blogjava.net/huanzhugege/comments/210099.html</wfw:comment><comments>http://www.blogjava.net/huanzhugege/archive/2008/06/23/210099.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/huanzhugege/comments/commentRss/210099.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huanzhugege/services/trackbacks/210099.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在SWT中提供了访问OLE的方式，不过相关的例子都是进程内OLE的例子，比如嵌入浏览器、引用ActiveX控件什么的。由于客户的需求，我们需要在程序中通过进程外Automation服务的方式访问IE浏览器。经过网上搜寻，找到一个朋友写的CComObject类可以访问Automation服务。不过经过使用发现一些错误，因此对其进行了修改，为了方便访问IE，我又封装了一个IEAutomation类，这...&nbsp;&nbsp;<a href='http://www.blogjava.net/huanzhugege/archive/2008/06/23/210099.html'>阅读全文</a><img src ="http://www.blogjava.net/huanzhugege/aggbug/210099.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huanzhugege/" target="_blank">CowNew开源团队</a> 2008-06-23 17:04 <a href="http://www.blogjava.net/huanzhugege/archive/2008/06/23/210099.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我眼中的.net的缺点（和Java比较）</title><link>http://www.blogjava.net/huanzhugege/archive/2008/02/19/180619.html</link><dc:creator>CowNew开源团队</dc:creator><author>CowNew开源团队</author><pubDate>Tue, 19 Feb 2008 03:29:00 GMT</pubDate><guid>http://www.blogjava.net/huanzhugege/archive/2008/02/19/180619.html</guid><wfw:comment>http://www.blogjava.net/huanzhugege/comments/180619.html</wfw:comment><comments>http://www.blogjava.net/huanzhugege/archive/2008/02/19/180619.html#Feedback</comments><slash:comments>52</slash:comments><wfw:commentRss>http://www.blogjava.net/huanzhugege/comments/commentRss/180619.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huanzhugege/services/trackbacks/180619.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最近公司要开发Windows平台上的产品（由于涉及到商业机密，所以目前无法对这个产品做详细介绍），采用.Net技术进行开发，我负责的是基于Visual Studio插件机制的行业开发工具的开发。从开始接触.Net到现在已经有近三个月了，而且也开发出了第一个版本，对.Net已经有了一些认识，由于以前主要用Java、Python等语言进行开发，因此有意无意的就对这些语言进行了比较。和Java比起来，.Net的优势还是很多的，比如快速开发能力、基于Windows特性进行开发的能力、内置的丰富类库、一些高级语法、组件的多版本管理等。优点是不用过多夸耀的，缺点我则要好好的&#8220;批评&#8221;一番的，因为&#8220;谦虚使人进步，骄傲使人落后&#8221;嘛，呵呵。开发场景为：使用Visual Studio2005进行C#的开发、使用Eclipse进行Java开发。&nbsp;<br />
&nbsp;<br />
1、HotSwap：在Java中HotSwap技术给程序的调试带来非常大的方便，比如可以让程序一边调试一边修改代码，代码修改以后在程序中立即就可以看到修改后的效果，不用每次修改以后都要重新启动程序；在.Net中几乎不允许这样做，只有在非常苛刻的几个情况下才可以实现在调试状态下修改代码，而且一旦代码段被执行过了就肯定不允许再修改了，这就导致每次修改代码都要频繁启动程序，非常繁琐。<br />
&nbsp;2、基于.Net的东西和Windows结合过于紧密，而且和Windows平台下一些旧有技术有太多千丝万缕的联系，导致用起来非常麻烦。比如每个对外部系统暴露的接口传来传去最后看到的类型是_ComObject，要想得知其真正的接口类型就必须通过COM技术来取得，非常麻烦；开发的很多组件都需要到注册表中注册，增加了部署的难度。</p>
<p>3、Visual Studio中代码的即时查错能力非常弱，很多的要到编译时才能知道代码是否有错；而在Eclipse中在编写代码的时候对于有错误的代码和有警告的代码（比如一些Private成员没有被引用）可以立即清晰的提示出来，开发人员可以立即修改有错误的代码。</p>
<p>4、Java中默认的方法都是可以override的除非标注为final，而在C#中必须是明确声明virtual的才可以override。在Delphi中也是类似的问题，这应该是Delphi和C#共同的老爹Anders Hejlsberg对于OO的一种理念吧，也许人家大师的想法是正确的：一个方法是否是虚方法必须要明确指定。不过对于习惯了Java中这种实现方式的人来说，C#的这种实现方式还是让人感觉一时难以适应的。</p>
<p>5、Visual Studio的编译速度太慢，点击【调试】/【运行】按钮以后要编译好长一段时间才能启动（不过和Visual Studio6比起来现在的Visual Studio编译速度已经快多了了，已经接近于Delphi的编译速度了）；由于Eclipse使用的自己的高性能编译器Eclipse Compiler，而且代码的编译是在编写代码的时候即时进行的，所以在Eclipse中根本感觉不到编译的时间，点击【调试】/【运行】按钮以后程序就运行起来的。</p>
<p>6、.Net类库中一些类设计的不灵活，比如TreeView的节点的显示的值是通过Text属性赋值上去的；而在Java中的Swing、SWT等图形库中，可以在一个树节点中挂任何类型的值，然后通过为这个节点定义个性化的Render（渲染器）来决定这些树节点显示什么。</p>
<p>7、Visual Studio的插件体系过于死板，开发起来不像开发Eclipse插件那样灵活简便，这可能和Visual Studio插件体系的历史渊源有关系。举例如下：<br />
（1）比如要在代码编辑器上增加新特性，在Eclipse中可以通过代码编辑器中提供的大量扩展点来实现，而在Visual Studio中的代码编辑器中则只提供了很可怜的几个可扩展性。这一点是Visual Studio插件体系最大的硬伤，大大限制了基于Visual Stuio的插件的功能，相信随着MS对Visual Studio插件体系的逐渐重视，这一点会慢慢跟上来的。<br />
（2）Visual Studio的插件体系和.Net结合过于紧密，在Eclipse中可以为Python、Ruby、C#、C、ASM等很多语言开发IDE（提供代码编辑、代码辅助、调试、编译等功能），这些语言不必与Java有任何关系，而在Visual Studio中虽然也可以为一种语言编写IDE，比如IronPython、J#，但是这些语言是和.Net集合紧密的，比如要为这种语言提供调试功能，则必须将代码编译成MSIL代码，这对于很多语言来讲是不可能的；<br />
（3）Eclipse中的插件只要在自己的plugin.xml文件中配置好就可以了，把那个插件的jar包放到Eclipse中就可以运行，而Visual Studio中的插件则必须首先注册到注册表，调试和部署起来非常麻烦；<br />
（4）Eclipse运行时的配置是保存在Workspace中的.metedata目录下的，因此在开发插件的时候会把插件的配置信息自动写到Host起来的那个Eclipse的Workspace中，被调试模式启动的Eclipse所做的一些修改不会影响主Eclipse，而在Visual Studio中虽然可以使用Experimental Hive方式进行插件开发，但是由于这些配置是保存在注册表中的，所以被Host启动的Visual Studio实例会污染到主Visual Studio，每次重启IDE都需要运行&#8220;Reset the Microsoft Visual Studio 2008 Experimental hive&#8221;来进行环境的重置，且重置耗时非常长，浪费了大量时间；<br />
（5）VS2008中，如果插件中抛出异常，而又没有捕获的话，轻则VS2008会显示一个错误消息框，重则VS2008会宕掉；而在Eclipse中会将插件中未捕获异常显示出来并且输出到日志文件中，方便插件开发者排查插件的Bug。<br />
（6）Eclipse中工程相关的特性是以Nature的方式提供的，一个Nature通常可以挂接到几乎所有的工程类型中去，包括用户自定义类型；而在Visual Studio中工程相关的特性则是以SubProject的形式提供的，往往只能挂到Visual Studio内置的少数几个工程类型中去（比如CSharpProject、VBProject），这样可扩展性大大降低了。<br />
（7）Eclipse中可以使用JET来开发非常复杂的代码生成器，而Visual Studio中的代码生成则只能用非常简单的代码模板机制，复杂的逻辑就必须通过字符串拼接来完成；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;毕竟接触.Net时间还是非常短，所以有的地方说的可能有错误，还请园子里的兄弟多指教。最后祝.Net和Java能在相互竞争中快速成长，从而让我们开发人员能够轻松、快乐、快速的开发出产品来，：）</p>
<img src ="http://www.blogjava.net/huanzhugege/aggbug/180619.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huanzhugege/" target="_blank">CowNew开源团队</a> 2008-02-19 11:29 <a href="http://www.blogjava.net/huanzhugege/archive/2008/02/19/180619.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Antlr中文文档初稿8（《ANTLR记号流》） </title><link>http://www.blogjava.net/huanzhugege/archive/2007/11/24/162876.html</link><dc:creator>CowNew开源团队</dc:creator><author>CowNew开源团队</author><pubDate>Sat, 24 Nov 2007 09:40:00 GMT</pubDate><guid>http://www.blogjava.net/huanzhugege/archive/2007/11/24/162876.html</guid><wfw:comment>http://www.blogjava.net/huanzhugege/comments/162876.html</wfw:comment><comments>http://www.blogjava.net/huanzhugege/archive/2007/11/24/162876.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huanzhugege/comments/commentRss/162876.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huanzhugege/services/trackbacks/162876.html</trackback:ping><description><![CDATA[<h2>本章翻译人 CowNew开源团队 周晓</h2>
<h2><a name="Token Vocabularies">记号词表</a></h2>
<p>每一个文法都指定了带有规则(子结构)和词表语言结构。这些符号在运行时被转换成整型的"记号类型"从而可以有效的比较。定义从符号到记号类型的映射的文件对ANTLR和ANTLR生成的分析器来说是基础。 这份文档描述了ANTLR使用和生成的这类文件，还介绍了用于控制词表的选项。 </p>
<h3><a name="Introduction">导言</a></h3>
<p>在分析时，一个语法分析器文法通过符号在它的词表里引用记号要符合由词法分析器或其他几号流生成的Token对象。记号类型储存在记号对象中，每种符号的值是唯一的，分析器比较这些整数来判断记号类型。如果分析器期望下一个记号类型是23，但发现第一个超前扫描记号类型，<font face="Courier New">LT(1).getType()</font>，不是23，这时分析器抛出<font face="Courier New">MismatchedTokenException</font>异常。 </p>
<p>一个文法可能有一个导入词表，经常也会有一个导出词表，用于被其他文法引用。导入的词表从未被修改，通过它可以知道词表的"初始条件"。不要和导入词汇混淆了。 </p>
<p>下面列出了最常见的问题: </p>
<h4><a name="How does ANTLR decide which vocabulary symbol gets what token type?">ANTLR如何决定哪一个词法符号是什么记号类型?</a></h4>
<p>每个文法有一个记号管理器来管理文法的导出词表。从文法的importVocab选项，记号管理器以 符号/记号类型 的形式被预载。这个选项强制ANTLR寻找有如下映射关系的文件： </p>
<pre>PLUS=44</pre>
<p>没有importVocab选项，文法的记号管理器是空的(稍后会看见一个警告)。 </p>
<p>你的文法中的任意记号没有预设值，它们被按照遇到的顺序赋值。例如，在下面的文法中，记号A和B分别是4和5: </p>
<pre>class P extends Parser;
a : A B ;</pre>
<p>词法文件以如下形式命名： <em>Name</em><font face="Courier New">TokenTypes.txt</font>. </p>
<h4><a name="Why do token types start at 4?">为什么记号类型从4开始？</a></h4>
<p>因为ANTLR在分析过程中需要一些特殊的记号类型，用户定义的记号类型必须在3后开始。 </p>
<h4><a name="What files associated with vocabulary does ANTLR generate?">ANTLR生成什么样的词表文件？</a></h4>
<p>ANTLR为词表<em>V</em>生成<em>V</em><font face="Courier New">TokenTypes.txt</font>和<em>V</em><font face="Courier New">TokenTypes.java</font>，<em>V</em>是文法的名字或者是exportVocab选项指定的名字。文本文件有点像一个简化的记号管理器，保存着ANTLR需要的一些信息，供定义在其他文件中的文法查看其词表信息等等。Java文件是是一个包含了记号类型常量定义的接口。ANTLR生成的分析器实现了其中的一个接口，获得所需要的记号类型定义。 </p>
<h4><a name="How does ANTLR synchronize the symbol-type mappings between grammars in the same file and in different files?">ANTLR怎样同步符号类型在相同文件和不同文件间文法的映射?</a></h4>
<p>一个文法的导出词表必须是另一个文法的导入词表或者2个文法必须共享一个公共的导入词表。 </p>
<p>设想p.g中有一个语法分析器P: </p>
<pre>// yields PTokenTypes.txt
class P extends Parser;
// options {exportVocab=P;} ---&gt; default!
decl : "int" ID ;</pre>
<p>l.g中有一个词法分析器L </p>
<pre>class L extends Lexer;
options {
importVocab=P; // reads PTokenTypes.txt
}
ID : ('a'..'z')+ ;</pre>
<p>即使L主要是P的词表中的值，但ANTLR生成的是LTokenTypes.txt和LTokenTypes。 </p>
<p>不同文件中的文法必须共享同样的记号类型空间，使用importVocab选项去预载同样的词表。 </p>
<p>如果这些文法在同一个文件中，ANTLR会用同样的方法处理它。然而，你可以通过设置它们的导出词表到同一个文件来使这2个文法共享同一个词表。例如，如果P和L在一个文件中，你可以这样做： </p>
<pre>// yields PTokenTypes.txt
class P extends Parser;
// options {exportVocab=P;} ---&gt; default!
decl : "int" ID ;</pre>
<pre>class L extends Lexer;
options {
exportVocab=P; // shares vocab P
}
ID : ('a'..'z')+ ;</pre>
<p>如果你没有为L指定词表，它将会选择共享文件中导出的第一个词表；在这里，它将共享P的词表。 </p>
<pre>// yields PTokenTypes.txt
class P extends Parser;
decl : "int" ID ;</pre>
<pre>// shares P's vocab
class L extends Lexer;
ID : ('a'..'z')+ ;</pre>
<p>记号类型映射文件像这样： </p>
<pre>P    // exported token vocab name
LITERAL_int="int"=4
ID=5</pre>
<h3><a name="Grammar Inheritance and Vocabularies">文法继承和词表</a></h3>
<p>文法继承父文法的规则，动作和选项，但是子文法使用什么词表和记号词表呢？ANTLR对子文法的处理就好像你复制粘贴父文法的所有非重载规则到子文法。因此，子文法记号的集合就是父文法和子文法的交集。所有的文法都导出词表所以子文法导出并使用一个和父文法不同的词表文件。除非你使用importVocab选项重载，否则子文法导入父文法的词表。 </p>
<p>文法Q继承P，会预先设置好P的词表，就好像Q使用了<font face="Courier New">importVocab=P</font>选项。例如，下面的文法有2个记号符号。 </p>
<pre>class P extends Parser;
a : A Z ;</pre>
<p>子文法Q,最初和父文法有相同的词表，但随后会增加一些符号。 </p>
<pre>class Q extends P;
f : B ;</pre>
<p>在上面的情况，Q定义了几个符号,B使得Q的词表为{A,B,C}. </p>
<p>一个子文法的词表一般是父文法词表的父集。注意重载规则不影响最初的词表。 </p>
<p>如果你的子文法需要父文法未使用过的新词法结构，你或许需要子语法分析器使用一个子词法分析器。使用importVocab选项指定子词法分析器的词表来重载它初始的词表。例如，假设语法分析器P使用词法分析器PL。不用importVocab重载，Q的词表将使用P的词表，即PL的词表。如果你想让Q使用另一个词法分析器的记号类型，比如说使用QL，那么做下面的事情： </p>
<pre>class Q extends P;
options {
importVocab=QL;
}
f : B ;</pre>
<p>Q的词表现在和QL的词表相同或者是QL词表的父集。 </p>
<h3><a name="Recognizer Generation Order">识别器生成次序</a></h3>
<p>如果你所有的文法在一个文件中，你就不用担心ANTLR将会最先处理哪一个文法文件，不过你仍要担心ANTLR处理文件中文法的次序。如果你尝试去导入一个会被另一个文法导出的词表，ANTLR将提示它不能读取这个文件。下面的文法文件会造成ANTLR出错： </p>
<pre>class P extends Parser;
options {
importVocab=L;
}
a : "int" ID;
class L extends Lexer;
ID : 'a';</pre>
<p>ANTLR在文法文件中还没有发现文法L，所以它将提示不能发现LTokenTypes.txt。另一方面，如果LTokenTypes.txt存在(比如说在文法文件中还没有P文法的时候ANTLR运行生成的)，ANTLR将为P读取这个文件，然后在处理L文法的时候覆盖掉它。ANTLR不知道它要处理的文法恰好在一个文件中，所以它假设是要读取从另一个文件生成的词表。 </p>
<p>一般的，如果你想让文法B使用文法A的记号类型(无论什么文法类型)，你必须首先对A运行ANTLR。例如，一个树文法用到了分析器文法的词表，应该在ANTLR生成了分析器之后再去处理树文法。 </p>
<p>例如，当你想让一个词法分析器和一个语法分析器共享同一个词表空间的时候，你要做的就是去把它们放到同一个文件中，设置它们的导出词表到同一个空间。如果它们在分开的文件中，把语法分析器的导入词表选项设置为词法分析器的导出词表，除非记号都定义在语法分析器中，这时，换一下导入/导出的关系让词法分析器使用语法分析器的导出词表。 </p>
<h3><a name="Tricky Vocabulary Stuff">词表的一些使用技巧</a></h3>
<p>如果你的文法在不同的文件中，你仍想让它们共享全部或部分记号空间，该怎么办。有2种解决方案：(1) 让文法导入同样的词表 (2) 让文法继承同一个父文法，该父文法含有记号空间。 </p>
<p>第一个方案在下面情况使用，你有2个词法分析器和2个语法分析器，语法分析器必须要处理从根本上就不同的输入部分。ANTLR 2.6.0发行版examples/java/multiLexer中的例子就属于这种情况。javadoc注释和Java代码部分的词法分析和语法分析过程都不一样。javadoc词法分析器有必要识别"*/"中止注释的词法结构，但它一般让Java语法分析器用打开/关闭的记号引用来嵌套运行javadoc语法分析器： </p>
<pre>javadoc
: JAVADOC_OPEN
{
<small>DemoJavaDocParser jdocparser =
new DemoJavaDocParser(getInputState());</small>
jdocparser.content();
}
JAVADOC_CLOSE
;</pre>
<p>问题在于：javadoc词法分析器定义了JAVADOC_CLOSE，即也定义了它的记号类型。不幸的是Java语法分析器的词表基于Java词法分析器而不是javadoc词法分析器。 要让javadoc词法分析器和java词法分析器都可以看到JAVADOC_CLOSE (并且有同样的记号类型)，2个词法分析器都要导入含有这种记号类型定义的词表。这里有DemoJavaLexer和DemoJavaDocLexer的头部： </p>
<pre>class DemoJavaLexer extends Lexer;
options {
importVocab = Common;
}
...</pre>
<pre>class DemoJavaDocLexer extends Lexer;
options {
importVocab = Common;
}
...</pre>
<p>CommonTokenTypes.txt有: </p>
<pre>Common // name of the vocab
JAVADOC_CLOSE=4</pre>
<p>共享词表的第二种方案在下面情况使用，你有1个语法分析器和3个不同的词法分析器(比如说为不同类型的C)。如果你只想语法分析器空间利用率高，语法分析器必须可以访问3个词法分析器的词表，去掉文法不用的结构(大概可以用语义断言)。给出CLexer，GCCLexer和MSCLexer，CLexer作为父文法定义出所有记号的集合。例如，如果MSCLexer需要"_int32"，那么在CLexer中定义一个所有词法分析器可见的记号类型： </p>
<pre>tokens {
INT32;
}</pre>
<p>在MSCLexer中，你可以给它实际意义的字符。 </p>
<pre>tokens {
INT32="_int32"
}</pre>
<p>用这种方法，3个词法分析器共享同一个记号空间，允许你用一个语法分析器识别多种C的输入。 </p>
<pre><font face="Arial" size="1">Version: $Id: //depot/code/org.antlr/release/antlr-2.7.6/doc/vocab.html#1 $</font></pre>
<img src ="http://www.blogjava.net/huanzhugege/aggbug/162876.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huanzhugege/" target="_blank">CowNew开源团队</a> 2007-11-24 17:40 <a href="http://www.blogjava.net/huanzhugege/archive/2007/11/24/162876.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最简单的JBPM例子</title><link>http://www.blogjava.net/huanzhugege/archive/2007/11/16/160997.html</link><dc:creator>CowNew开源团队</dc:creator><author>CowNew开源团队</author><pubDate>Fri, 16 Nov 2007 05:51:00 GMT</pubDate><guid>http://www.blogjava.net/huanzhugege/archive/2007/11/16/160997.html</guid><wfw:comment>http://www.blogjava.net/huanzhugege/comments/160997.html</wfw:comment><comments>http://www.blogjava.net/huanzhugege/archive/2007/11/16/160997.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huanzhugege/comments/commentRss/160997.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huanzhugege/services/trackbacks/160997.html</trackback:ping><description><![CDATA[定义一个ActionHandler：<br />
<p>package com.test;</p>
<p>import org.jbpm.graph.def.ActionHandler;<br />
import org.jbpm.graph.exe.ExecutionContext;</p>
<p>public class MyAction implements ActionHandler<br />
{</p>
<p>&nbsp;private static final long serialVersionUID = 1L;</p>
<p>&nbsp;private String message;</p>
<p>&nbsp;public String getMessage()<br />
&nbsp;{<br />
&nbsp;&nbsp;return message;<br />
&nbsp;}</p>
<p>&nbsp;public void setMessage(String message)<br />
&nbsp;{<br />
&nbsp;&nbsp;this.message = message;<br />
&nbsp;}</p>
<p>&nbsp;public void execute(ExecutionContext executionContext) throws Exception<br />
&nbsp;{<br />
&nbsp;&nbsp;System.out.println(message);<br />
&nbsp;}</p>
<p>}</p>
<br />
定义一个流程文件：<br />
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;</p>
<p>&lt;process-definition <br />
&nbsp; xmlns="urn:jbpm.org:jpdl-3.1"<br />
&nbsp; name="simple"&gt;<br />
&nbsp;&nbsp; &lt;start-state name="start"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;transition name="to_state" to="first"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name="action" class="com.test.MyAction"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;message&gt;Going to the first state!&lt;/message&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/transition&gt;<br />
&nbsp;&nbsp; &lt;/start-state&gt;<br />
&nbsp;&nbsp; &lt;state name="first"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;transition name="to_end" to="end"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name="action" class="com.test.MyAction"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;message&gt;About to finish!&lt;/message&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/transition&gt;<br />
&nbsp;&nbsp; &lt;/state&gt;<br />
&nbsp;&nbsp; &lt;end-state name="end"&gt;&lt;/end-state&gt;<br />
&lt;/process-definition&gt;</p>
定义流程驱动类：<br />
<p>package com.test;</p>
<p>import java.io.IOException;<br />
import java.io.InputStream;</p>
<p>import org.jbpm.graph.def.ProcessDefinition;<br />
import org.jbpm.graph.exe.ProcessInstance;</p>
<p>public class Main<br />
{<br />
&nbsp;public static void main(String[] args) throws IOException<br />
&nbsp;{<br />
&nbsp;&nbsp;InputStream stream = Main.class.getResourceAsStream("processdefinition.xml");<br />
&nbsp;&nbsp;ProcessDefinition processDefinition = ProcessDefinition<br />
&nbsp;&nbsp;&nbsp;&nbsp;.parseXmlInputStream(stream);<br />
&nbsp;&nbsp;stream.close();<br />
&nbsp;&nbsp;ProcessInstance instance = new ProcessInstance(processDefinition);<br />
&nbsp;&nbsp;while (!instance.hasEnded())<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;instance.signal();<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
}<br />
</p>
<br />
将jbpm***.jar、commons-logging**.jar和dom4j.jar三个包加入classpath就可以了。<br />
执行结果：<br />
Going to the first state!<br />
About to finish!
<img src ="http://www.blogjava.net/huanzhugege/aggbug/160997.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huanzhugege/" target="_blank">CowNew开源团队</a> 2007-11-16 13:51 <a href="http://www.blogjava.net/huanzhugege/archive/2007/11/16/160997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《自己动手写开发工具》试读版电子书及光盘 </title><link>http://www.blogjava.net/huanzhugege/archive/2007/11/04/158052.html</link><dc:creator>CowNew开源团队</dc:creator><author>CowNew开源团队</author><pubDate>Sun, 04 Nov 2007 04:34:00 GMT</pubDate><guid>http://www.blogjava.net/huanzhugege/archive/2007/11/04/158052.html</guid><wfw:comment>http://www.blogjava.net/huanzhugege/comments/158052.html</wfw:comment><comments>http://www.blogjava.net/huanzhugege/archive/2007/11/04/158052.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huanzhugege/comments/commentRss/158052.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huanzhugege/services/trackbacks/158052.html</trackback:ping><description><![CDATA[《自己动手写开发工具》系统地介绍了SWT、Draw2D、GEF、JET等与Eclipse插件开发相关的基础知识，并且以实际的开发案例来演示这些知识的实战性应用，通过对这些实际开发案例的学习，读者可以非常轻松地掌握Eclipse插件开发的技能，从而开发出满足个性化需求的插件。 <br />
本书以一个简单而实用的枚举生成器作为入门案例，通过该案例读者能学习到扩展点、SWT、JET等Eclipse插件开发的基本技能；接着对Eclipse插件开发中的基础知识进行了介绍，并且对属性视图的使用做了重点介绍；最后以两个具有一定复杂程度的插件(Hibernate建模工具和界面设计器)为案例介绍了SWT、Draw2D、GEF、JET等技术的综合运用。 <br />
<br />
电驴下载地址：http://www.verycd.com/groups/@u2105483/204642.topic <br />
<br />
HTTP下载地址： <br />
http://www.cownew.com/Soft/ShowSoft.asp?SoftID=16 <br />
<br />
http://www.cownew.com/Soft/ShowSoft.asp?SoftID=10
<img src ="http://www.blogjava.net/huanzhugege/aggbug/158052.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huanzhugege/" target="_blank">CowNew开源团队</a> 2007-11-04 12:34 <a href="http://www.blogjava.net/huanzhugege/archive/2007/11/04/158052.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的Linux学习笔记</title><link>http://www.blogjava.net/huanzhugege/archive/2007/08/23/linux.html</link><dc:creator>CowNew开源团队</dc:creator><author>CowNew开源团队</author><pubDate>Thu, 23 Aug 2007 12:06:00 GMT</pubDate><guid>http://www.blogjava.net/huanzhugege/archive/2007/08/23/linux.html</guid><wfw:comment>http://www.blogjava.net/huanzhugege/comments/138921.html</wfw:comment><comments>http://www.blogjava.net/huanzhugege/archive/2007/08/23/linux.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huanzhugege/comments/commentRss/138921.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huanzhugege/services/trackbacks/138921.html</trackback:ping><description><![CDATA[<p>1 <br>top 看当前运行的进程<br>kill -9 pid 终止某进程（树）<br>cd 返回根目录<br>pwd 显示当前目录<br>3 less more查看文本文件指令 在less中打入v键就会启动vi编辑当前文件<br>4 mkdir、rm mv 改变文件名和目录名的命令 <br>cp 复制文件和目录命令 <br>man 命令使用方法参考工具，很有用<br>nano是一个小巧自由，并且友好的编辑器<br>5<br>vi有两种模式，一种是命令模式，一种是编辑模式。进入vi以后，默认处于命令模式。 </p>
<p>现在我们执行vi LoveLetter。进入以后，按一下键盘上的Insert功能键或者i键可以进入编辑状态，可以插入字符，再按一下Insert变成复盖模式，这两种模式的区别很容易体现，大家尝试一下就可以了。上下左右四个方向键可以移动光标。基本的编辑命令和Windows里面没有区别。是不是很容易呢？当你把需要的内容输入完成以后，我们要保存，这时候按一下ESC键从编辑模式回到命令模式，首先输入一个冒号&#8220;:&#8221;，也就是按住SHIFT键不放再按分号&#8220;;&#8221;这样首先输入一个&#8220;:&#8221;，然后，输入w，回车，就可以保存我们编辑的内容到LoveLetter文件。现在我们按一下Insert就可以继续编辑。再按ESC，输入&#8220;:&#8221;，再按w又可以保存。可是现在我们不需要保存，我们想要不保存就退出，怎么做呢？当我们输入w的时候是write的意思，保存，那么我们输入q就是quit退出的意思。好，输入q，回车，vi提示我们刚才进行的修改还没有保存，所以记住！一旦需要放弃我们的修改，不能直接用q命令退出，而需要用&#8220;q!&#8221;命令。输入q!，好了，退出了。 <br>我们想看看我们刚才编辑的LoveLetter是不是真的保存好了，再vi LoveLetter，ok，看到了吧？现在我们想要直接退出，就可以只输入&#8220;:q&#8221;就可以了，不用输入那个&#8220;!&#8221;因为我们没有修改文件内容。如果我们修改一下这篇文章，我们在退出的时候可以输入&#8220;ESC : wq&#8221;就可以了。不需要把w和q分成两次输入。 <br>6 linux中可以用amount命令将iso文件挂接为目录：mount -t iso9660 -o loop /home/kris/somewhat.iso /mnt/cdrom <br>7 file 检查文件的类型<br>8 wall write mesg <br>9 reset 重置终端，当屏幕发生问题的时候用此方法<br>10 env 显示环境变量<br>11 改变系统语言的方式：运行 export&nbsp;&nbsp; LC_ALL="en_US"&nbsp;&nbsp; LANG=en_US 就可以改成英文。要想一直输出E文.可以到 /etc/sysconfig/i18n里修改LANG="en_US. Utf-8" <br>12 查看本机ip：ifconfig -a<br>13 mount光盘：mount／dev／cdrom ／mnt／cdrom，然后就可以在／mnt／cdrom中看到光盘内容了 。用umount /mnt/cdromo 可以卸载光盘。只有卸载光盘以后才能将光盘弹出。<br>14 在linux的提示符下输入文件名等的时候，可以输入部分文件名然后按Tab键即可智能补全。<br>15 redhat中安装rpm包的方法：rpm -i "包路径"；要升级包可以rpm -U packagename。包的删除比较容易，使用：# rpm -e packagename就能够删除自己想要删除的包，不需要知道版本和路径<br>16 启动即运行vsftp方法，运行ntsysv，选中列表中的vsftpd即可。<br>17 查看文件内容：cat 文件名<br>18 find / -name "*network*" -print 查找根目录下所有包含network的文件<br>find / -iname "*network*" -print 查找根目录下所有包含network的文件，忽略大小写<br>19 useradd user1 建立一个用户，不过在为用户设定密码之前这个用户是不能使用的，设定密码的命令为passwd user1<br>20 ls的时候文件名旁边如果有&#8220;*&#8221;号，表示它是可执行文件，只要运行&#8220;*/文件名&#8221;即可运行。<br>21 重启网络service network restart<br>22 字符界面进入图形界面：startx，图形界面返回字符界面：注销即可。<br>23 安装VMWare，然后虚拟机网络类型选NAT即可实现主机和虚拟机之间的通信，要远程登录linux还需要安装telnet服务，root默认不能通过telnet登录<br>24 删除非空目录：rm -rf 目录名 <br>25 解压cpio的方法：cpio -idmv &lt; ***.cpio<br>26 UE中编辑的shell脚本到unix中运行提示&#8220;h^M: is not an identifier&#8221;，解决方法：dtox a.txt &gt;b.txt 转换为unix格式，或者使用UE中的&#8220;文件&#8221;&#8220;转换&#8221;&#8220;DOS转Unix&#8221;功能。第二种更方便<br>27 find /usr -name httpd<br>28 解压some.tgz的方法：首先gunzip some.tgz，生成some.tar，然后tar -xvf some.tar解压<br>29 将gcc加入路径的方法：<br>PATH=$PATH:/usr/gnu/bin/<br>export PATH<br>30 sh脚本的变量的赋值等号两边不能有空格<br>31 sh脚本中命令行之间不能有空行，if语句后的条件前后要有空格<br>32 判断当前终端类型echo $TERM<br>33 重新获取ip的方式：/etc/init.d/network&nbsp;&nbsp; restart&nbsp;&nbsp; <br>34 Linux中录入ESC转义符的方法:首先按下Ctrl+V，然后按下ESC键<br>35 以后台方式运行一个程序，也就是脚本退出、shell退出都不会导致程序退出:命令后加&#8220;&amp;&#8221;<br>36 登录自启动的脚本放在&#8220;/etc/profile&#8221;文件中，比如配置Java的环境变量就必须在这个文件中加入：<br>pathmunge /usr/java/j2re1.4.2_14/bin/ after<br>JAVA_HOME="/usr/java/j2re1.4.2_14/"</p>
<p>注意JAVA_HOME中的等号两边不能有空格，否则JAVA_HOME会被当成命令处理!!!!!!!!!!!!!!!!!!!1<br>37 如果系统出现乱码修改LANG环境变量即可。以前批量系统就出现过此问题<br>39 windows下的trace对应Linux的"traceroute ip地址"<br>40 Linux下使用U盘的方法，插入U盘，在mnt下创建目录usb；然后运行&#8220;fdisk -l&#8221;，这样会显示所有的设备，因为一般的U盘都是Fat格式的，所以找到格式为FAT的硬盘的标识符，比如sdb1，然后运行mount -t vfat /dev/sdb1 /mnt/usb；这样就U盘就挂接到/mnt/usb下了；卸载的时候umount /mnt/usb</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/huanzhugege/aggbug/138921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huanzhugege/" target="_blank">CowNew开源团队</a> 2007-08-23 20:06 <a href="http://www.blogjava.net/huanzhugege/archive/2007/08/23/linux.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源在中国的现实意义</title><link>http://www.blogjava.net/huanzhugege/archive/2007/05/20/118713.html</link><dc:creator>CowNew开源团队</dc:creator><author>CowNew开源团队</author><pubDate>Sun, 20 May 2007 10:08:00 GMT</pubDate><guid>http://www.blogjava.net/huanzhugege/archive/2007/05/20/118713.html</guid><wfw:comment>http://www.blogjava.net/huanzhugege/comments/118713.html</wfw:comment><comments>http://www.blogjava.net/huanzhugege/archive/2007/05/20/118713.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.blogjava.net/huanzhugege/comments/commentRss/118713.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huanzhugege/services/trackbacks/118713.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 王开源的事情已经过去一段时间了，看过太多对这件事情的评论，这些评论或者是口出污言秽语的谩骂或者是狂热的非理性的力挺（在这件事的初期属于后者）。很多人对开源的评论也使得我这个投身于开源一年多的新人感到过迷茫。这件事过去好久，我一直在思索一个问题：开源在目前中国的意义究竟是什么，开源在中国这种大环境下究竟应该如何发展。<br>&nbsp;&nbsp;&nbsp; 开源在国外现在是火的一塌糊涂，Linux、Eclipse、Hibernate、Spring、Python、Ruby、MySQL等等或大或小的开源产品的发展大大推动了软件开发这个行业的高速发展，apache、sourceforge等开源社区中也是百花齐放，开源产品的开发者、推动者、推广者也得到了各自想得到的回报，更不用说使用这些开源产品进行开发的用户得到的开发效率的提升。反观国内开源的发展则相对滞后很多：违背Linux开源协议进行商业化Linux开发的厂家被开源社区骂的狗血喷头；屈指可数的几个开源爱好者组织的开源团队在个人的意志与信念的坚守下苦苦支撑着，很多因为种种原因中途夭折；商业公司对开源社区的几次推广行动也胎死腹中，比如CSDN的开源社区、Apusic的Operamasks；更有甚者打着开源的旗号却从事着根本与开源不搭边的事情。国内大部分人对开源更是有着很深的误解：&#8220;你凭什么叫人家开源，不就是想看看Windows的代码吗？&#8221;、&#8220;人家商业公司做出来的产品是你们几个技术疯子做出来的东西能比的吗？&#8221;、&#8220;把别人写好的东西拿来抄一抄改一改我的任务就完成了，钱就到手了，开源真好&#8221;、&#8220;我做的项目用了很多开源的东西，很牛吧！&#8221;。<br>&nbsp;&nbsp;&nbsp; 我认为开源对于整个软件行业有如下几个作用：使用开源产品搭建出的产品有更好的安全性和可控性；开源的产品能得到开发社区的广泛支持，从而使得产品能够成熟的更快；使用开源产品搭建出的产品有更好的安全性和可控性；开发、学习开源产品能够提升开发人员的技术水平。<br>&nbsp;&nbsp;&nbsp; 对于第一个作用这里不做过多解释，相信大部分人都能理解。<br>&nbsp;&nbsp;&nbsp; 开源产品是在全世界所有技术牛人的手下开发出来的，并且有千万双眼睛盯着它，众多的使用者可以完善它，这使得开源产品的成熟速度也十分惊人，Linux、Eclipse的成熟就是最典型的证明。各种开源产品层出不穷，相似功能的产品就有几十种甚至上百种，一个开源产品如果想要在这些产品中脱颖而出，不仅需要强大的技术做支撑，更需要非常强的商业化推广，否则做出来的产品只能成为少数技术人员把玩的玩物。如果没有IBM对Eclipse的巨额投入，Eclipse会发展成现在的规模吗？这些开源项目的后面通常都是有一个非常强大的开源基金会在做支撑。遗憾的是，目前国内还没有一家公司能够进行对开源社区如此大的投入，因此国内大部分的开源团队都是在自己开发着自己的开源产品，放到网站上供他人下载，然后梦想着自己的开源产品能够有一天会像Hibernate、Struts一样成为风靡全球的产品，但是如果没有强大的商业推广的话这肯定是一场白日梦。<br>&nbsp;&nbsp;&nbsp; 鉴于此，我认为目前国内的开源产品商业化的可能性是非常小的，因此开源的对于广大开发人员的意义更多的在于使用和学习，而且我们使用开源产品快速的搭建出满足需求的产品，这本身也是对开源的学习过程。这里提到的&#8220;学习&#8221;包含下面几个含义：学习开源产品的使用；学习开源产品的实现原理；学习模仿开源产品；学习开源社区的运营。<br>&nbsp;&nbsp;&nbsp; （1）学习开源产品的使用：成熟的开源产品是非常优秀的，如果能够学会它们的使用，这对于开源人员来说就是一种很大的收获，因为通过使用这些产品就能认识到这些产品的功能、特性以及优缺点。<br>&nbsp;&nbsp;&nbsp; （2）学习开源产品的实现原理：开源产品的代码都是开放的，我们可以深入产品的内部学习其实现原理，从而提高自身的开发水平。不得不承认的是国内开发人员的技术水平还是非常低的，通过学习开源产品的代码，就可以提高整体的技术水平，从这个层面来讲哪怕是非开源的源代码开放产品（比如Borland的VCL）对我们也是同样有帮助的。值得高兴的是，国内很多开发人员已经开始尝试着深入开源产品的内部去探寻这些产品的实现原理，并把它们的学习成果与更多人分享。开源对开发人员的提升也是显而易见的，最明显的就是微软开发社区中开发人员的普遍技术水平是低于Java等开源社区中开发人员的普遍技术水平的（注意，这里说的是&#8220;普遍技术水平&#8221;，请微软社区中的高人不要动怒）。中国计算机业的发展必须依靠核心技术，而提高技术水平是拥有核心技术的大前提！<br>&nbsp;&nbsp;&nbsp; （3）学习模仿开源产品：弄懂了开源产品的实现原理以后就可以尝试模仿它们开发自己的产品，这和&#8220;重复造轮子&#8221;是没有关系的，模仿是学习他人技术的最佳途径。因此大家应该多多的&#8220;造轮子&#8221;，越多越好，哪怕造完就扔掉也是可以的。<br>&nbsp;&nbsp;&nbsp; （4）学习开源社区的运营：国外很多开源人员都有在开源社区中开发的经验，因此他们对于开源这种协同开发方式就有更多的经验，因此我们可以加入他们的开发团队，可以帮他们做文档、界面的本地化，更可以参与产品功能的完善，从而学习他们的协作方式，更可以和他们做朋友，了解更多&#8220;外面的世界&#8221;。国内很多朋友都参与了开源产品的文档中文化、产品的推广等工作，这都是有深远意义的。我们CowNew开源团队参与JodeEclipse、DWPL等国外项目就是基于这一点考虑的。<br>&nbsp;&nbsp;&nbsp;&nbsp; 相信经过一段时间学习之后，我们的开发人员将有能力开发出世界级的产品，如果我们的民族企业能够得到长远的发展，并且在商业上帮助国产开源真正走向强大，从而使得中国的开源社区也能跻身&#8220;世界开源之林&#8221;！<br>&nbsp;&nbsp;&nbsp; 上边是我一点愚蠢的看法，仅供各位看管参考。希望开源能够在中国发展、壮大，希望中国早日成为软件强国！<br>&nbsp;&nbsp;&nbsp; 
<img src ="http://www.blogjava.net/huanzhugege/aggbug/118713.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huanzhugege/" target="_blank">CowNew开源团队</a> 2007-05-20 18:08 <a href="http://www.blogjava.net/huanzhugege/archive/2007/05/20/118713.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql乱码问题终极解决</title><link>http://www.blogjava.net/huanzhugege/archive/2007/05/19/118529.html</link><dc:creator>CowNew开源团队</dc:creator><author>CowNew开源团队</author><pubDate>Sat, 19 May 2007 03:59:00 GMT</pubDate><guid>http://www.blogjava.net/huanzhugege/archive/2007/05/19/118529.html</guid><wfw:comment>http://www.blogjava.net/huanzhugege/comments/118529.html</wfw:comment><comments>http://www.blogjava.net/huanzhugege/archive/2007/05/19/118529.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huanzhugege/comments/commentRss/118529.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huanzhugege/services/trackbacks/118529.html</trackback:ping><description><![CDATA[今天要使用mysql做一个功能的实验，但是发现写进去的中文变成了乱码，可是数据库的编码都改成gbk了，而且jdbc连接字符串和my.ini的default-character-set配置项也改成了gbk，但是连接的时候还是乱码，通过mysql的原生客户端连接则不会出现这种情况。最终的解决方法是将所有的字符集都改成utf-8。<br>用gbk、gb2312 之类的时候都可能会出现问题，而utf-8作为一个标准的多语言字符集则解决乱码的终极方案。所以推荐大家在其他遇到中文的情况下也使用utf-8。
<img src ="http://www.blogjava.net/huanzhugege/aggbug/118529.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huanzhugege/" target="_blank">CowNew开源团队</a> 2007-05-19 11:59 <a href="http://www.blogjava.net/huanzhugege/archive/2007/05/19/118529.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse的扩展点机制应该恪守吗？</title><link>http://www.blogjava.net/huanzhugege/archive/2007/05/19/118480.html</link><dc:creator>CowNew开源团队</dc:creator><author>CowNew开源团队</author><pubDate>Fri, 18 May 2007 16:32:00 GMT</pubDate><guid>http://www.blogjava.net/huanzhugege/archive/2007/05/19/118480.html</guid><wfw:comment>http://www.blogjava.net/huanzhugege/comments/118480.html</wfw:comment><comments>http://www.blogjava.net/huanzhugege/archive/2007/05/19/118480.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huanzhugege/comments/commentRss/118480.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huanzhugege/services/trackbacks/118480.html</trackback:ping><description><![CDATA[Eclipse的插件机制是个非常好的东西，架构也非常灵活。我们开发的插件有时候需要提供一些扩展机制，允许他人扩展，但是如果是提供的标准的Eclipse扩展点的话无疑加大了开发扩展功能的难度，开发人员必须熟悉Eclipse插件开发才可以。在最近做的几个IDE中，为了避免这个问题，我都采用了最原始的插件扩展方式，也就是扩展功能的开发人员把扩展插件的jar包或者.class文件放到某个目录下即可，这些扩展功能也只需实现某个接口即可，由我的插件来进行加载。这样在扩展功能开发人员看来，写扩展功能就是写一个实现了某个接口的Java类，无需了解Eclipse插件开发的知识了，当然这带来的缺点就是灵活性降低了。
<img src ="http://www.blogjava.net/huanzhugege/aggbug/118480.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huanzhugege/" target="_blank">CowNew开源团队</a> 2007-05-19 00:32 <a href="http://www.blogjava.net/huanzhugege/archive/2007/05/19/118480.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>StringConfigure模式</title><link>http://www.blogjava.net/huanzhugege/archive/2007/05/19/118478.html</link><dc:creator>CowNew开源团队</dc:creator><author>CowNew开源团队</author><pubDate>Fri, 18 May 2007 16:22:00 GMT</pubDate><guid>http://www.blogjava.net/huanzhugege/archive/2007/05/19/118478.html</guid><wfw:comment>http://www.blogjava.net/huanzhugege/comments/118478.html</wfw:comment><comments>http://www.blogjava.net/huanzhugege/archive/2007/05/19/118478.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/huanzhugege/comments/commentRss/118478.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huanzhugege/services/trackbacks/118478.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;做系统设计的时候有时会碰到一些无法在父类（或者接口）中抽取通用行为的特性，遇到这种情况就可以采用StringConfigure模式，这个模式我取的名字，不知道是否已经有先人做了总结，如果哪位朋友知道这种模式的正确名称，希望不吝赐教。<br>&nbsp;&nbsp;&nbsp;以JDBC中取得数据库连接为例，我们可以抽象出数据库的一些公共行为，比如连接数据库都要求提供用户名和密码，因此在JDBC中提供设定连接的用户名和密码的方法。但是另外的一些行为则不一定是所有数据库都具备的，比如对于网络型数据库才需要指定网络地址，而文件型数据库则不需要，再比如在MySQL中需要指定字符集，而其他数据库则不一定需要。如果为了照顾这些特性，为JDBC提供setHostIP、setDBFilePath、setCharSet等方法的话无疑会使得接口变得复杂，会出现很多用不到的方法，并且这些方法也无法覆盖所有未来可能出现的情况，比如某个数据库又增加了允许用户定制连接超时的方法，那么JDBC也要为他提供相应的setTimeOut方法。为了解决这个问题，JDBC提出了连接字符串的概念，这样各个数据库的JDBC驱动只要规定好连接字符串的格式即可，用户把所有的配置信息写到连接字符串中，如果用户修改为其他数据库的话只需修改连接字符串即可，不用修改其他的调用。<br>&nbsp;&nbsp;&nbsp;使用StringConfigure模式的好处是使得系统中的个性化配置在一个参数中完成，这样保证系统的不同模块的行为的一致性，缺点是配置字符串的格式要由各个实现模块来规定，各个不同实现模块的格式不一致，造成了一定的学习成本，而且无法在开发期发现配置字符串的问题。<br>&nbsp;&nbsp;&nbsp;这里再来讲一个StringConfigure模式的应用的例子。现在我们要开发一套对IC卡读写器的类库，应用开发人员只要调用不同的IC卡读写子类即可实现操作不同的IC卡读写器。各种不同的IC卡读写器有两个共同的抽象行为：读卡和写卡，即readCard和writeCard，但是各个不同的读卡器还有自己的特性，比如有的读卡器需要指定采用ISO格式还是IBM格式来读写磁卡，有的读卡器需要指定读写操作的分隔符，这些特性不是各个读写器共有的，因此我们采用StringConfigure模式进行设计，开发如下的接口：<br>interface IICCarder<br>{<br>&nbsp; public void writeCard(String data);<br>&nbsp; public String readCard();<br>&nbsp; public void configure(String configStr);<br>}</p>
<p>&nbsp;&nbsp;&nbsp;比如需要指定读写格式的读写器就可以如下实现：<br>class SomeCarder implements IICarder<br>{<br>&nbsp;&nbsp;&nbsp; private FormatEnum format;<br>&nbsp;&nbsp;&nbsp; public void writeCard(String data)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(format==FormatEnum.IBM)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&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; else...........<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; public String readCard()<br>&nbsp;&nbsp;&nbsp; {.............<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; public void configure(String configStr)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(configStr.equls("IBM"))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; format=FormatEnum.IBM<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(configStr.equls("ISO"))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; format=FormatEnum.ISO<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p>开发人员使用的时候只要如下调用<br>IICarder c = new SomeCarder();<br>c.configure("IBM");<br>print c.readCard();<br>如果采用配置文件的话更可以把配置参数写到配置文件中，这样就可以避免修改代码。</p>
<img src ="http://www.blogjava.net/huanzhugege/aggbug/118478.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huanzhugege/" target="_blank">CowNew开源团队</a> 2007-05-19 00:22 <a href="http://www.blogjava.net/huanzhugege/archive/2007/05/19/118478.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>