﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-来来,一起分享Java的乐趣吧....-最新评论</title><link>http://www.blogjava.net/redcabin/CommentsRSS.aspx</link><description>卓而不凡.你我他的JAVA</description><language>zh-cn</language><pubDate>Sun, 16 Apr 2006 06:28:00 GMT</pubDate><lastBuildDate>Sun, 16 Apr 2006 06:28:00 GMT</lastBuildDate><generator>cnblogs</generator><item><title>[导入]XMPP协议简介</title><link /><dc:creator>寂寞河</dc:creator><author>寂寞河</author><pubDate>Sat, 08 Apr 2006 04:01:00 GMT</pubDate><guid /><wfw:comment>http://www.blogjava.net/redcabin/comments/39963.html</wfw:comment><comments>#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/redcabin/comments/commentRss/39963.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/redcabin/services/trackbacks/39963.html</trackback:ping><description><![CDATA[<P>&nbsp;&nbsp;&nbsp; XMPP（Extensible Messageing and Presence Protocol：可扩展消息与存在协议）是目前主流的四种IM（IM：instant messaging,即时消息）协议之一，其他三种分别为：即时信息和空间协议(IMPP)、空间和即时信息协议(PRIM)、针对即时通讯和空间平衡扩充的进程开始协议SIP(SIMPLE)。</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; 在这四种协议中，XMPP是最灵活的。XMPP是一种基于XML的协议，它继承了在XML环境中灵活的发展性。因此，基于XMPP的应用具有超强的可扩展性。经过扩展以后的XMPP可以通过发送扩展的信息来处理用户的需求，以及在XMPP的顶端建立如内容发布系统和基于地址的服务等应用程 序。而且，XMPP包含了针对服务器端的软件协议，使之能与另一个进行通话，这使得开发者更容易建立客户应用程序或给一个配好系统添加功能。</P>
<P>1、什么是XMPP ？ <BR>&nbsp;&nbsp;&nbsp;&nbsp; XMPP的前身是Jabber，一个开源形式组织产生的网络即时通信协议。XMPP目前被IETF国际标准组织完成了标准化工作。标准化的核心结果分为两部分； <BR>核心的XML流传输协议 <BR>&nbsp;&nbsp;&nbsp;&nbsp; 基于XML流传输的即时通讯扩展应用 <BR>&nbsp;&nbsp;&nbsp; XMPP的核心XML流传输协议的定义使得XMPP能够在一个比以往网络通信协议更规范的平台上。借助于XML易于解析和阅读的特性，使得XMPP的协议能够非常漂亮。 <BR>XMPP的即时通讯扩展应用部分是根据IETF在这之前对即时通讯的一个抽象定义的，与其他业已得到广泛使用的即时通讯协议，诸如AIM，QQ等有功能完整，完善等先进性。 <BR><BR>2、XMPP的基本网络结构是怎样的？ <BR>&nbsp;&nbsp;&nbsp;&nbsp; XMPP中定义了三个角色，客户端，服务器，网关。通信能够在这三者的任意两个之间双向发生。服务器同时承担了客户端信息记录，连接管理和信息的路由功能。网关承担着与异构即时通信系统的互联互通，异构系统可以包括SMS（短信），MSN，ICQ等。基本的网络形式是单客户端通过TCP/IP连接到单服务器，然后在之上传输XML。 <BR><BR>3、XMPP通过TCP传什么了？ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 传输的是与即时通讯相关的指令。在以前这些命令要么用2进制的形式发送（比如QQ），要么用纯文本指令加空格加参数加换行苻的方式发送（比如MSN）。而XMPP传输的即时通讯指令的逻辑与以往相仿，只是协议的形式变成了XML格式的纯文本。这不但使得解析容易了，人也容易阅读了，方便了开发和查错。而XMPP的核心部分就是一个在网络上分片断发送XML的流协议。这个流协议是XMPP的即时通讯指令的传递基础，也是一个非常重要的可以被进一步利用的网络基础协议。所以可以说，XMPP用TCP传的是XML流。 <BR><BR>4、举个例子看看所谓的XML流是什么样子的？ <BR>客户端：&lt;?xml version='1.0'?&gt; <BR>&nbsp;&nbsp; &lt;stream:stream <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; to='example.com' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns='jabber:client' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:stream='http://etherx.jabber.org/streams' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; version='1.0'&gt; <BR>服务器：&lt;?xml version='1.0'?&gt; <BR>&nbsp;&nbsp; &lt;stream:stream <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from='example.com' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id='someid' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns='jabber:client' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:stream='http://etherx.jabber.org/streams' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; version='1.0'&gt; <BR>...其他通信... <BR>客户端：&lt;message from='juliet@example.com' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; to='romeo@example.net' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xml:lang='en'&gt; <BR>客户端：&nbsp;&lt;body&gt;Art thou not Romeo, and a Montague?&lt;/body&gt; <BR>客户端：&lt;/message&gt; <BR>服务器：&lt;message from='romeo@example.net' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; to='juliet@example.com' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xml:lang='en'&gt; <BR>服务器：&lt;body&gt;Neither, fair saint, if either thee dislike.&lt;/body&gt; <BR>服务器：&lt;/message&gt; <BR>客户端：&lt;/stream:stream&gt; <BR>服务器：&lt;/stream:stream&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp; 以文档的观点来看，客户端或服务器发送的所有XML文本连缀在一起，从&lt;stream&gt;到&lt;/stream&gt;构成了一个完整的XML文档。其中的stream标签就是所谓的XML Stream。在&lt;stream&gt;与&lt;/stream&gt;中间的那些&lt;message&gt;...&lt;/message&gt;这样的XML元素就是所谓的XML Stanza（XML节）。XMPP核心协议通信的基本模式就是先建立一个stream，然后协商一堆安全之类的东西，中间通信过程就是客户端发送XML Stanza，一个接一个的。服务器根据客户端发送的信息以及程序的逻辑，发送XML Stanza给客户端。但是这个过程并不是一问一答的，任何时候都有可能从一个方发信给另外一方。通信的最后阶段是&lt;/stream&gt;关闭流，关闭TCP/IP连接。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; 采用XMPP协议的即时通信应用,当数google吧,Google Talk是基于XMPP协议,而且它还允许其它IM自由使用XMPP协议。如此一来，任何IM供应商在遵循XMPP协议的前提下，都可以随时与Google Talk实现免费连接.</P>
<P><STRONG>附：主流的四种IM通讯协议简介</STRONG></P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; IMPP：IMPP主要定义必要的协议和数据格式，用来构建一个具有空间接收、发布能力的即时信息系统。到目前为止，这个组织已经出版了三个草案RFC，但主要的有两个：一个是针对站点空间和即时通讯模型的（RFC 2778）；另一个是针对即时通讯/空间协议需求条件的（RFC2779）。RFC2778是一个资料性质的草案，定义了所有presence和IM服务的原理。RFC2779定义了IMPP的最小需求条件。另外，这个草案还就presence服务定义了一些条款，如运行的命令、信息的格式，以及presence服务器如何把presence的状态变化通知给客户。</P>
<P>&nbsp;&nbsp;&nbsp; SIMPLE：SIMPLE是目前为止制定的较为完善的一个。SIMPLE和XMPP两个协议，都符合RFC2778和RFC2779 。SIMPLE计划利用SIP来发送presence信息。SIP是IETF中为终端制定的协议。SIP一般考虑用在建立语音通话中，一旦连接以后，依靠如实时协议（RTP）来进行实际上的语音发送。但SIP不仅仅能被用在语音中，也可以用于视频。SIMPLE被定义为建立一个IM进程的方法。SIMPLE在2002年夏季得到额外的信任，目前，微软和IBM都致力于在它们的即时通讯系统中实现这个协议。 SIMPLE小组致力于进程模式的操作，这将提升运行效率，使基于SIP的机制能够进行会议和三方电话交谈控制，也考虑到能和未来提供的许多新特性实现兼容并提升表现能力。有了进程模式，SIMPLE使用SIP来建立一次进程，再利用SDP（进程描述协议)来实际传输IM数据。</P>
<P>&nbsp;&nbsp; ps:公司打算在此通信协议上开发一个Kjava应用,负责与公司的TQ(音讯快客)服务器进行通信,实现TQ的手机应用拓展.有兴趣的和了解XMPP的朋友,欢迎一起来交流.</P><br>文章来源:<a href='http://www.netbo.com.cn/showlog.jspe?log_id=88'>http://www.netbo.com.cn/showlog.jspe?log_id=88</a><img src ="http://www.blogjava.net/redcabin/aggbug/39963.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/redcabin/" target="_blank">寂寞河</a> 2006-04-08 12:01 <a href="#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[导入]CVSNT安装指南</title><link /><dc:creator>寂寞河</dc:creator><author>寂寞河</author><pubDate>Sat, 08 Apr 2006 04:01:00 GMT</pubDate><guid /><wfw:comment>http://www.blogjava.net/redcabin/comments/39965.html</wfw:comment><comments>#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/redcabin/comments/commentRss/39965.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/redcabin/services/trackbacks/39965.html</trackback:ping><description><![CDATA[<P>&nbsp;&nbsp;&nbsp;&nbsp; CVS,不用说,搞过项目的人都知道这是做什么用的,不清楚的话,在网上搜索一下,就能够得到很足够多的资料和信息.很全也很详实.在这里就不用多说了.</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; 以前用过CVS做项目的开发版本控制,后来项目小了,也不没有再用.再近在工作中,在代码方面出现在的问题越来越严重,于是这两天重新温习了一下CVS的内容,在网上找了一些CVS有关方面的资料,并实际的进行安装的配置.呵,没有包括如何用,如何去用,网上的资料应该更多,再将安装的文档奉上,希望对于没有配置过CVS的人有一个帮助,也希望有问题进一步交流</P>
<P>在此下载文档<A href="http://www.netbo.com.cn/uploads/200603310917000039.rar" target=_blank>CVS安装配置指南.rar</A> </P>
<P>还要说的是,类似于CVS的的控制版本系统,还有许多其它的产品,包括Start team,visual sourcesafe,clearCase,</P>
<P>Start team,听说这个功能很强大,一般适合用于大型的项目,我见过郑州地税项目在用.visual sourcesafe应该是微软的东西,在项目中也用到.不过,我们公司现在用的,只是把它成一个数据存储系统.放一些公司的资料或者个人的资料.呵,clearCase就没有查过资料,不太清楚了.</P>
<P>现在一般进行项目开发用的CVS比较多,而且它在很多的IDE开发工具中都得到了很好的集成.它是linux系统的一部分.很是成熟.</P>
<P>如果在网上找这些类似的产品,那么,现在可能更在程序员嘴边的就是SVN,即<FONT size=2>Subversion,它不仅包含了CVS所有功能,而且还提供了更好的版本版本控制,它的设计层次和理论都高于CVS,希望大家也都能关注它.</FONT></P>
<P><FONT size=2>呵,欢迎交流CVS在项目开发的时候的经验和感受!!</FONT></P>
<P><FONT size=2></FONT>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P><br>文章来源:<a href='http://www.netbo.com.cn/showlog.jspe?log_id=86'>http://www.netbo.com.cn/showlog.jspe?log_id=86</a><img src ="http://www.blogjava.net/redcabin/aggbug/39965.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/redcabin/" target="_blank">寂寞河</a> 2006-04-08 12:01 <a href="#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[导入]HSQLDB的使用</title><link /><dc:creator>寂寞河</dc:creator><author>寂寞河</author><pubDate>Sat, 08 Apr 2006 04:01:00 GMT</pubDate><guid /><wfw:comment>http://www.blogjava.net/redcabin/comments/39966.html</wfw:comment><comments>#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/redcabin/comments/commentRss/39966.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/redcabin/services/trackbacks/39966.html</trackback:ping><description><![CDATA[<P>在网上看到很多开源项目的学习例子,在涉及到数据库的时候,都是采用的HSQLDB,当然也包括其它的数据库,比较多的是MySql,以前也用过MYSQL,只是有时候用起来也确实不方便,如一个小代码的测试,就要动用数据库,感觉确实是杀鸡用了宰牛刀了,呵,代码的测试,毕竟更关心的还是代码上的研究和业务逻辑上的测试,与数据库交互,还就是其实次了,没有必要这个复杂的先把数据库设好了!</P>
<P>周末有时间看了一下有关HSQLDB的资源,发现用它居然是那么的简单和方便.</P>
<P>我们在测试的代码的时候,只需要将它发行包中的hsqldb.jar文件考到你项目的lib目录下即可.</P>
<P>说到这里,这是网上都说到的,我开始也是按这些做的,然后写了一个连接数据库的代码,就像我们连接oracle,或者sybase那样,示例代码是一模一样的,然后运行进行连接,<BR>错误,错误出来了,呵,<BR>&nbsp;&nbsp;&nbsp;&nbsp; [java] 21:08:33,125&nbsp; INFO DriverManagerConnectionProvider:80 - using driver<BR>: org.hsqldb.jdbcDriver at URL: jdbc:hsqldb:hsql://localhost<BR>&nbsp;&nbsp;&nbsp;&nbsp; [java] 21:08:33,125&nbsp; INFO DriverManagerConnectionProvider:86 - connection p<BR>roperties: {user=sa, password=****}<BR>&nbsp;&nbsp;&nbsp;&nbsp; [java] 21:08:34,203&nbsp; WARN SettingsFactory:103 - Could not obtain connection<BR>&nbsp;metadata<BR>&nbsp;&nbsp;&nbsp;&nbsp; [java] java.sql.SQLException: socket creation error<BR>&nbsp;&nbsp;&nbsp;&nbsp; [java]&nbsp;&nbsp;&nbsp;&nbsp; at org.hsqldb.jdbc.Util.sqlException(Unknown Source)<BR>&nbsp;&nbsp;&nbsp;&nbsp; [java]&nbsp;&nbsp;&nbsp;&nbsp; at org.hsqldb.jdbc.jdbcConnection.&lt;init&gt;(Unknown Source)<BR>&nbsp;&nbsp;&nbsp;&nbsp; [java]&nbsp;&nbsp;&nbsp;&nbsp; at org.hsqldb.jdbcDriver.getConnection(Unknown Source)<BR>&nbsp;&nbsp;&nbsp;&nbsp; [java]&nbsp;&nbsp;&nbsp;&nbsp; at org.hsqldb.jdbcDriver.connect(Unknown Source)<BR>&nbsp;&nbsp;&nbsp;&nbsp; [java]&nbsp;&nbsp;&nbsp;&nbsp; at java.sql.DriverManager.getConnection(DriverManager.java:512)<BR>&nbsp;&nbsp;&nbsp;&nbsp; [java]&nbsp;&nbsp;&nbsp;&nbsp; at java.sql.DriverManager.getConnection(DriverManager.java:140)</P>
<P>&nbsp; 看到这些信息,说明程序已经开发进行数据库连接,却发现java.sql.SQLException: socket creation error</P>
<P>头大,呵,没有连接上,再看网上的说明,发现自己没有露掉那一部分没有做呀,却出错了.</P>
<P>再看文档,还是没有,于是自己都打算的放弃再继续下去.<BR>然而却又感觉,既然这个数据库只需要几百K的一个jar包就可以,那么用的时候想不会那么的太复杂吧,于是看一下代码, socket creation error,这个应该是没有连接上,而数据库的IP,PORT都进行了配置,那么会不会是配置错,了呢?<BR>于是自己又看了看文档,发现都是这么设置的.思考,,找了一些相关网站,都是英文的都没有心思看下去.</P>
<P>最后找到一编有关这个数据库与eclipse集成的文章,呵,发现自己还是因为没有启动这个数据库存的原因.<BR>这个数据库启动也很简单的很,因为这个是jar包,那么虽然用java运行它的启动类的方法即可<BR>以下有关信息<BR>org.hsqldb.Server ,这个类是数据库的服务器,即起到启动和服务的作用,<BR>java -cp /opt/hsqldb/hsqldb.jar org.hsqldb.Server -database /tmp/bd -port 9001 -system_exit=true <BR>这个是网点上说的的一个命令,其实这个启动也不用那么的复杂,</P>
<P>要加的参数,一是类包,需要设置classpath,二就是运行类名,-database /tmp/bd -port 9001 -system_exit=true 这都是运行的时候进行的连接和数据保存的路径</P>
<P>我是这么启动的.</P>
<P>我在项目目录中,建了一个database目录,和lib,平级,然后打开cmd进到这个目录,<BR>命令:java classpath ../lib/hsqldb.jar org.hsqldb.Server ,这个是采用数据库默认的</P>
<P>Ok,再进行代码测试,发现已经正常了,呵,</P>
<P>在database目录下,你已经可以发现,生成了几个脚本文档,可以用记事本打,可以看到这些文档中记录了数据库的创建和表的创建,以及其它相关的信息,</P>
<P>&nbsp;</P>
<P>网上有很多使用HSQLDB的例子,文档也相当的多,下面是我看到的,来自于IBM,发现这里出的东西,很有价值的.</P>
<P><A href="http://www-128.ibm.com/developerworks/cn/linux/opensource/os-echsql/part1/index.html">http://www-128.ibm.com/developerworks/cn/linux/opensource/os-echsql/part1/index.html</A></P>
<P><A href="http://hsqldb.org">http://hsqldb.org</A></P>
<P><A href="http://sourceforge.net/projects/hsqldb">http://sourceforge.net/projects/hsqldb</A></P>
<P>下面是多上面摘录下来的!</P>
<P><EM>超音速 SQL 数据库</EM>后来正式更名为 HSQLDB，它是一类纯 Java 撰写的嵌入式关系数据库服务器，您可以在单机模式（使用直接文件访问）或客户机/服务器模式中使用它，它支持大量的并发用户。</P>
<P>HSQLDB 是一类使用方便的 Java 开发数据库，因为它支持 Structured Query Language（SQL）的丰富子集，并且 Java 程序员根本不需要在他们的开发工作站上安装严重消耗处理器、内存和磁盘空间的数据库服务器。</P>
<P>&nbsp;</P>
<P>您可以从 SourceForge（ <I>hsqldb.sourceforge.net</I>; 请参阅 <A href="http://www-128.ibm.com/developerworks/cn/linux/opensource/os-echsql/part1/index.html#resources"><FONT color=#996699>参考资料</FONT></A> 中给出的链接)下载 HSQLDB,其中包括源代码和文档。这里注意不要与已经被冻结的原始 SourceForge 项目（ <I>hsql.sourceforge.net</I> ）相混淆。 </P>
<P>二进制分布是一个标准的 ZIP 文件,而您要做的就是把这个 ZIP 文件解压缩到您硬盘上的某个地方。所有 HSQLDB 组件 ——数据库引擎、服务器进程、JDBC 驱动程序、文档以及一些实用工具——都放在一个单独的 JAR 包中，这个包安装在 lib/hsqldb.jar 中，大小在 260 KB 左右。运行数据库引擎只需 170 KB 的 RAM，这即使是 PDA（如 Sharp 生产的 Zaurus）也能够满足，而且包括源文件和文档在内的整个下载文件小到可以放到一张标准的 1.44 MB 软盘上。</P>
<P><A name=N100A1><SPAN class=smalltitle><STRONG><FONT face=Arial size=3>HSQLDB 的运行模式</FONT></STRONG></SPAN></A></P>
<P>HSQLDB 引擎可以以多种模式运行，以适应不同的应用场合：</P>
<P><B>驻留内存模式</B> <BR>所有数据库表和索引都放在内存中，而且永远不会保存到磁盘上。在您发出为什么有人想要使用在应用程序终止时就会丢失的数据库这样的疑问之前，请先考虑为您可以使用标准 SQL 语句进行查询、排序、分组和更新的数据库数据拥有一块本地高速缓存。 </P>
<P><B>单机模式</B> <BR>应用程序使用 JDBC 创建一个数据库连接，并且 HSQLDB 引擎运行在该应用程序中，这时允许直接访问数据库文件。不能存在并发用户（应用程序独占地访问数据库文件），但因此也没有额外的线程和 TCP 连接开销。单机模式是许多嵌入式应用程序的首选模式。 </P>
<P><B>服务器模式</B> <BR>这是类似于其他关系数据库的标准客户机/服务器数据库配置，允许出现使用 TCP 套接字的并发连接。大部分开发人员喜欢这种模式，因为它允许任何 JDBC 客户机在主应用程序仍在运行的情况下连接并查询/更新表。 </P>
<P><B>Web服务器模式</B> <BR>HSQLDB 可以用作 Web 服务器，可以通过 HTTP 接受 SQL 查询；也能作为任何标准 Web 容器中的 servlet 来运行，可以穿过防火墙或者安装在 Web 宿主服务上，而不用涉及到提供者支持小组（和昂贵的数据库宿主选项）。由于 HTTP 是无状态的，所以本模式中不存在事务。 </P>
<P><A name=N100CA><SPAN class=smalltitle><STRONG><FONT face=Arial size=3>HSQLDB 数据库文件结构</FONT></STRONG></SPAN></A></P>
<P>HSQLDB 将所有表和索引数据放在内存中, 将所有发出的 SQL 语句保存到一个名为 <I>database</I>.script 的文件中,该文件同时也充当着事务日志的角色。初始化引擎之后，该文件被读取，然后其中所有的 SQL 语句都被运行，从而完成整个数据库的重建。停机期间，HSQLDB <I></I>引擎将生成一个新的 <I>database</I>.script 文件，其中只包含最少的语句，目的是让数据库可以快速启动。 </P>
<P>除了默认放在内存中的表之外，HSQLDB 还支持“缓存”表和“文本”表。所有缓存表的数据放在一个名为 <I>database</I>.data 的文件中，而文本表的数据则放在由 <CODE>set table source</CODE> 非标准 SQL 语句命名的任意分隔文本文件（像 CSV 文件）中。缓存表支持比可用 RAM 大的数据集，而文本表则可以作为一种导入导出数据的方便手段。 </P>
<P>除了 <I>database</I>.script 和 <I>database</I>.data 文件之外，任何 HSQLDB 数据库还可能包含一个 <I>database</I>.properties 文件，管理员可以在该文件中设置许多影响到 ANSI SQL 兼容性的参数。所有数据库文件（文本表数据文件除外）必须放在同一个目录中。 </P>
<P>不存在创建 HSQLDB 数据库的显式方法。如果您要求引擎打开一个目前不存在的数据库文件（使用服务器模式 <CODE>的 -database</CODE> 选项或单机模式的 JDBC URL），就会创建该文件及其所在目录。所以，如果您肯定那个空数据库中存在数据，请检查是否有录入错误。 </P><br>文章来源:<a href='http://www.netbo.com.cn/showlog.jspe?log_id=85'>http://www.netbo.com.cn/showlog.jspe?log_id=85</a><img src ="http://www.blogjava.net/redcabin/aggbug/39966.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/redcabin/" target="_blank">寂寞河</a> 2006-04-08 12:01 <a href="#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[导入]病毒小知识</title><link /><dc:creator>寂寞河</dc:creator><author>寂寞河</author><pubDate>Sat, 08 Apr 2006 04:01:00 GMT</pubDate><guid /><wfw:comment>http://www.blogjava.net/redcabin/comments/39967.html</wfw:comment><comments>#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/redcabin/comments/commentRss/39967.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/redcabin/services/trackbacks/39967.html</trackback:ping><description><![CDATA[<P>今天，用病毒代表那些对计算机具有破坏性和恶意企图的软件已经不合时宜，因为虎视眈眈看着我们的计算机系统的软件决不只有病毒。现在计算机人员给那些对电脑产生危害的软件起了一个通用的名字，它叫做MalWare（恶意软件）。<BR>&nbsp;<BR>从1983年11月3日，弗雷德·科恩(Fred Cohen)博士研制出在运行过程中可自我复制的破坏性程序之后，计算机病毒这个物种在程序员和自身进化的力量下不断壮大，且越发复杂。今天的“病毒” 已不再是“Computer Viruses”那么简单，关于恶意软件（MalWare）的种类划分有很多方法，这里提供比较普遍接受的一种。还是先从共同的祖先“病毒”说起。</P>
<P>病毒（Virus）</P>
<P>病毒最初的表象是程序当中的一个可执行文件。因此，从渊源上讲，病毒是宿主程序或是文件中的一段代码。当使用者调用被感染的程序和文件时病毒就会发作。一般来讲，遭受病毒感染的程序和文件仍然能够运转，但是也有些病毒可以通过自身代码的复制来覆盖原有程序的代码，从而把原有程序彻底摧毁。</P>
<P><BR>另外，病毒在计算机之间传播的方式比较被动，只有当被病毒感染的文件从一台计算机传送到另一台没有保护的计算机时，病毒才算找到了新的滋生土壤。</P>
<P>蠕虫（Worms）</P>
<P>与病毒相比，蠕虫在传播过程中已经可以拥有体面的躯体，它不再是别的程序中一个执行文件，或者文件中的一段代码。它可以对操作系统进行破坏，当然它们要想运行，需要作为引导程序的一部分，在系统启动的时候被激活。</P>
<P><BR>蠕虫在电脑之间传递的方式更多，它可以利用目标系统的弱点，将自身复制到网路上的其他系统上。由于蠕虫比病毒更加容易传播，再加上它深入系统层面的破坏能力，因此更让人恐惧。</P>
<P>特洛伊木马（Trojan）</P>
<P>特洛伊木马，从名字上就能让人想起那批隐藏在特洛伊木马里的希腊士兵，以特洛伊命名的恶意软件程序同样以隐藏性作为自己最大的特点。就好像希腊人把杀机掩饰成礼物，特洛伊木马同样把自己掩饰成为一个合法的程序，甚至没准真的也会让即将受害的使用者感到它是一个礼物。同样，就像木马不能像真的马一样生儿育女一样，特洛伊木马程序也不能通过自我“克隆”，繁育出自己的下一代。</P>
<P><BR>既然不能像病毒或蠕虫一样破坏应用程序或操作系统，那么木马程序的破坏力表现在哪？希腊人制造木马并没有期望木马本身有什么杀伤力，而是寄希望于木马进入特洛伊城堡之后从木马里出来的士兵来毁坏城市，木马程序也可以在进入计算机系统之后，激活其它的恶意软件，比如病毒。</P>
<P>后门（Backdoor）</P>
<P>有些软件程序员有意识地设计了后门程序，作为恶意信息传播过程中的“内应”。后门程序更像是潜入电脑中的小偷，允许不法分子绕过常规的鉴定程序访问电脑。<BR>根据工作和传播方式的不同，后门程序可以被分成两大类，一类后门程序有点类似木马程序，它被人工加载在其它的软件中，通过其宿主程序的运行而运行，而它的传播也是通过宿主程序被用户安装在另外的计算机上而得以进行。也许这跟病毒的特性更加相近，但是不能自我复制，决定了它与病毒还是有很大差别。第二类后门程序更像是一种蠕虫，因为它们在操作系统的引导过程中被激活,而它们的传播同样也是在蠕虫自动传播时搭乘蠕虫的“顺风车”。</P>
<P>间谍软件（Spyware）</P>
<P>间谍软件顾名思义就是干间谍干的事情，它们收集并发送用户的个人资料和电脑操作记录等信息。如果运气好，这些信息可能只包括很普通的浏览模式信息，但如果碰上和它的发明者一样用心险恶的间谍软件，用户的银行帐号和密码很可能就成为可怜的羔羊。无论从工作方式还是传播方式上讲，间谍软件都与木马程序很类似。只不过，“间谍”们在受害者电脑里通常没有兴趣沾花惹草，挑起病毒蠕虫的爆发，只是恶狠狠地盯着用户的隐秘信息，瞅准机会下手。</P>
<P><BR>根据调查公司Forrester Research今年2月发布的"2005年反间谍软件方案"（Antispyware adoption in 2005）报告指出，间谍软件已成为企业组织最关切的安全问题之一。</P>
<P>Exploit</P>
<P>很多人认为恶意软件都是心怀恶意或者想搞恶作剧的编程高手的杰作。但事实上，有些对电脑有恶意的软件恰恰出于系统安全研究员之手。Exploit就是一个例子。很讽刺吧？这不是搬起石头砸自己的脚吗？或许吧，安全研究员们针对系统的特定安全漏洞而设计出Exploit，目的在于证明系统安全漏洞的存在性。因此，虽然对单个电脑它存在着不得已而为之的“恶意”，但在因特网上，它并不 — 定具有破坏性。</P>
<P>Rootkit</P>
<P>第一批 Rootkit 是在20世纪90年代被识别出来的，当时Sun和 Linux 操作系统是它们的主要攻击对象。目前，Rootkit可用于许多操作系统，其中包括Microsoft Windows平台。这种软件通常可以通过删除登录日志和隐藏进攻者行为的方法隐藏袭击的痕迹。</P>
<P><BR>Rootkit还可以把后门程序包含其中，这样攻击者就可以很方便地再次造访，或者还可以集成Exploit用以攻击其他系统。由于Rootkit需要通过与操作系统的核心层挂钩来达到其隐藏自身行为的目的，因些Rootkit很难被侦测到。</P>
<P><BR>许多计算机安全专家一致认为，如果用户的电脑遭受了Rootkit的袭击，那用户能采取的最好的，也可能是唯一的办法就是把自己的硬盘格式化然后重装系统。因为，你或许永远都没办法知道是否把Rootkit完全赶出了你的电脑。</P>
<P>Key Logger</P>
<P>也许你觉得前面几种恶意软件有点太“软”，但Keylogger却是一个直接和硬件设备有关系的恶意软件，它所直接关系到的硬件设备恐怕一看就猜得到，那就是——键盘。<BR>Keylogger可以将电脑用户敲击过的那些键盘按顺序记录下来，事后在通过网络发送给黑客。通常，Keylogger只有在它发现受害用户连接到了一个安全级别较高的网站时才会被“叫醒”，比如说银行网站。因为只有那个时候，它记录下来的信息才可能对那些图谋不轨的黑客有用，比如在银行网站上，Keylogger记录下来的很可能就包括了电脑使用者的银行帐号和密码等信息。</P>
<P><BR>这种软件的出现，让黑客们可以绕开银行等安全级别较高的网站对数据的高水平加密，在用户把个人信息通过网络传输出去，甚至是进入电脑存储设备之前就把它记录下来。黑客们真是费尽了心机！</P>
<P>Dialers</P>
<P>恶意拨号器，这种自动拨号程序常常做一些损人不利己的事情，虽然它显得有些小儿科，但是它给那些拨号上网的计算机用户带来的损失常常是巨大的。比如，Dialers可能会在用户睡熟的时候，大半夜“爬起来”，通过用户的电话线打长途电话，而且还是国际长途！不过这种小东西也会干点“正经事”，他们可以在把电话拨通之后，把Keylogger记录下来的用户机密或其他信息发送给它的主人——黑客。<BR>如此之多满怀恶意的软件盯着我们的计算机系统，让人浑身发寒。但幸好反病毒软件场上已经开始对一系列的恶意软件予以更多重视。“反病毒”公司也许需要朝着“反恶意软件”公司的方向发展。</P>
<P>&nbsp;<BR></P><br>文章来源:<a href='http://www.netbo.com.cn/showlog.jspe?log_id=84'>http://www.netbo.com.cn/showlog.jspe?log_id=84</a><img src ="http://www.blogjava.net/redcabin/aggbug/39967.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/redcabin/" target="_blank">寂寞河</a> 2006-04-08 12:01 <a href="#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[导入]爱的区别</title><link /><dc:creator>寂寞河</dc:creator><author>寂寞河</author><pubDate>Sat, 08 Apr 2006 04:01:00 GMT</pubDate><guid /><wfw:comment>http://www.blogjava.net/redcabin/comments/39968.html</wfw:comment><comments>#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/redcabin/comments/commentRss/39968.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/redcabin/services/trackbacks/39968.html</trackback:ping><description><![CDATA[什么是妻子？就是你愿意把积蓄交给她保管的女人。什么是情人？就是你偷偷摸摸地去和她约会又怕妻子撞见的女人。什么是红颜知己？就是你能把有些秘密说给她听却不能说给妻子听的女人。 <BR><BR><BR>　　妻子是一种约束，约束你不能随便和别的女人交往；情人是一种补偿，补偿你想从妻子那得到却又无法得到的激情；红颜知己就是一种点拨，点拨你心中的迷津。 <BR><BR>　　妻子陪你过日子，情人陪你花钞票，红颜知己陪你聊聊天。妻子不能替代情人，因为她没有情人有情调；情人不能代替妻子，因为她没有妻子的亲情；妻子和情人都代替不了红颜知己，那是心灵的需要。 <BR><BR>　　妻子是一个和你没有一点血缘关系的女人，却为你深夜不回家而牵肠挂肚；情人是一个和你没有一点家庭关系的女人，却让你尝尽做男人滋味尽情消魂；红颜知己是一个还没和你扯上关系的女人，却能分担你的快乐和忧愁。 <BR><BR>　　妻子是一个家，是一个能给你浮躁的心带来安抚的港湾；情人是家的累赘，只是不到万不得已你不想甩掉；红颜知己是家的点缀，没有她你不会觉得寂寞，但你会觉得生活没意思。 <BR><BR>　　妻子的关心像一杯白开水，有时会成为一种唠叨，只是在生病时才成为一种温馨；情人的关心就像在白开水里加了一勺糖，慢慢地品上一个晚上还不满足；红颜知己的关心就像工作到午夜喝一杯咖啡，越喝越提神。 <BR><BR>　　妻子怀上你的孩子会深情地问你想要个男孩还是要个女孩，情人怀上你的孩子会哭着来问你该怎么办怎么办啊？对于红颜知己，你会把你的情人怀孕的消息告诉她，并问她你该怎么办。至于妻子，你会在她发现你的情人肚子大了的秘密后才告诉她：“其实，我早就想告诉你了。”然后拼命地向她解释，并作可怜状。 <BR><BR>　　妻子回了娘家一个星期不回来你也不想，情人三天不见你就给她打电话：上哪去了？今晚我们到老地方喝杯咖啡好吗？心中有了苦闷，你最想找个红颜知己倾诉，告诉她你在妻子和情人之间疲于奔命，实在受不了了。 <BR><BR>　　最让男人受不了的是妻子的唠叨，情人的眼泪，红颜知己的误解。妻子的唠叨使男人的心乱上加乱，情人的眼泪让男人已硬的心变得酥软，红颜知己的误解把男人的心由悬崖推进深谷。 <BR><BR>　　最好的妻子，就是男人能从她身上找到情人和红颜知己两种相互交织的感觉，只是这种感觉男人很难找到。最好的情人是在你和她的关系被妻子发现而主动退出又不提任何要求，只是情人很难做到这点。最好的红颜知己是有一天她能成为情人，甚至妻子，只是这种想法很难实现。 <BR><BR>　　如果有可能，男人都在想把红颜知己变成情人，如果再有可能，再把她变成妻子。只是变成妻子的红颜知己就不再是知己了，因为很少有男人把自己的妻子当成知己的。男人心中有好多秘密不能随便说给妻子听。要不，那还叫男人么？ <BR><BR>　　娶一个妻子是为了怕别人说闲话，找一个情人是为了给单调的生活加点味精，交一个红颜知己是想给空虚的心灵浇点鸡汤。男人一生都在寻找的不是一个妻子，也不是一个情人，而是一个甚至更多的红颜知己。 <BR><BR>　　有些失去是注定的，有些缘分是永远不会有结果的，爱一个人不一定要拥有，但拥有了一个人就一定要珍惜，不要等到伤害的时候才去乞求原谅，不要等到失去的时候再去挽回。如果我不小心流下一滴泪水，那是因为我不愿意忘记你是谁。<br>文章来源:<a href='http://www.netbo.com.cn/showlog.jspe?log_id=83'>http://www.netbo.com.cn/showlog.jspe?log_id=83</a><img src ="http://www.blogjava.net/redcabin/aggbug/39968.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/redcabin/" target="_blank">寂寞河</a> 2006-04-08 12:01 <a href="#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[导入]无语....</title><link /><dc:creator>寂寞河</dc:creator><author>寂寞河</author><pubDate>Sat, 08 Apr 2006 04:01:00 GMT</pubDate><guid /><wfw:comment>http://www.blogjava.net/redcabin/comments/39969.html</wfw:comment><comments>#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/redcabin/comments/commentRss/39969.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/redcabin/services/trackbacks/39969.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;一天晚上，两个决定分手的恋人，正在谈判中。 <BR>　　　　女孩双眼红肿冷眼看了一看男的，便把刚才写好的清单递了给他： <BR>　　　　书架:我买的。 <BR>　　　　相框:我买的。 <BR>　　　　时钟:我买的。 <BR>　　　&nbsp; &nbsp;椅子:我买的。 <BR>　　　　以上物品我将搬走。 <BR><BR>　　 <BR>　　男孩看了一眼，从桌上拿起一根笔，伏在桌前振笔疾书，也给她一张纸： <BR>　　　　棉被:免费。 <BR>　　　　衣柜:免费。 <BR>　　　　热水瓶:免费。 <BR>　　　　电话:免费。 <BR>　　　　两百封信:免费。 <BR>　　　　无数次的接送:免费。 <BR>　　　　陪著你、照顾你、等你:免费。 <BR>　　　　你爱逛街，我带箸你到处跑:免费。 <BR>　　　　以上全部免费赠送，欢迎搬走。 <BR>　　 <BR>　　所有的衣服，花朵:免费。 <BR>　　 <BR>　　还有为你焦虑，为你欢喜，这些都是免费的。 <BR>　　 <BR>　　以上全部都加起来，对你的真爱仍是免费的。 <BR><BR>　　 <BR>　　女孩看后，刚收藏好的泪水又逐渐解放出来；她垂下头，吸一吸鼻子，再抬起头还是冷冷地看著男孩说：“以上所有东西我全都搬走，还有你，我选的，也要搬走！ <BR>&nbsp;&nbsp;&nbsp;&nbsp;男孩二话不说便把女孩抱在怀里，在她耳边悄声地说：把我搬走吧<br>文章来源:<a href='http://www.netbo.com.cn/showlog.jspe?log_id=82'>http://www.netbo.com.cn/showlog.jspe?log_id=82</a><img src ="http://www.blogjava.net/redcabin/aggbug/39969.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/redcabin/" target="_blank">寂寞河</a> 2006-04-08 12:01 <a href="#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[导入]JDBC执行存储过程得到多结果集...</title><link /><dc:creator>寂寞河</dc:creator><author>寂寞河</author><pubDate>Sat, 08 Apr 2006 04:01:00 GMT</pubDate><guid /><wfw:comment>http://www.blogjava.net/redcabin/comments/39971.html</wfw:comment><comments>#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/redcabin/comments/commentRss/39971.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/redcabin/services/trackbacks/39971.html</trackback:ping><description><![CDATA[<P>昨天工作的时候,在调用一下存储过程的时候,出现了一个问题,那就是,这个存储过程返回两个结果集,即在存储过程的最后,类似这样的语句:<BR>select #proctmp.id, #proctmp.proc_id, #proctmp.proc_name, #proctmp.sp_name from #proctmp <BR>select #privtmp.id, #privtmp.id_type, #privtmp.serv_if_op_id, #privtmp.serv_if_op_name from #privtmp </P>
<P>那怎么去接收这样的一个执行结果呢?</P>
<P>在网上找,确实不知道用什么关键字去搜索,用几个关键字去搜索,得到的结果都无关紧要,<BR>于是就给一些朋友问,幸好,他曾经处理过这样的情况,给了一个oracle的例子.<BR>如下:</P>
<P>&nbsp;&nbsp;java.sql.CallableStatement stmt = null;<BR>&nbsp;&nbsp;java.sql.ResultSet rset = null;</P>
<P>&nbsp;&nbsp;String callSQL =<BR>&nbsp;&nbsp;&nbsp;"{ call KK_Srv_Apply.SelectApplyCursor( ?, ?, ?, ?, ?, ?, ? ) }";</P>
<P>&nbsp;&nbsp;try<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;stmt = m_conn.prepareCall(callSQL);</P>
<P>&nbsp;&nbsp;&nbsp;stmt.setString(&nbsp;1, m_SysUserCode);<BR>&nbsp;&nbsp;&nbsp;stmt.setInt(&nbsp;2, m_CurrPage&nbsp;&nbsp;); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .............................</P>
<P>&nbsp;&nbsp;&nbsp;stmt.execute(); </P>
<P>&nbsp;&nbsp;&nbsp;rset = (ResultSet) ((OracleCallableStatement) stmt).getCursor(2);<BR>&nbsp;&nbsp;&nbsp;while (rset.next()){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .............<BR>&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;catch (SQLException ex)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;logger.info( "" );<BR>&nbsp;&nbsp;&nbsp;ex.printStackTrace(System.out);<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;catch (Exception ex)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;logger.info( "" );<BR>&nbsp;&nbsp;&nbsp;ex.printStackTrace(System.out);<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;finally<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;try<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (stmt != null)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stmt.close();<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;catch (SQLException see)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;return;<BR>&nbsp;}</P>
<P>从例子中可以看出来,执行一个存储过程,得到的也是一个结果集,便这个结果集是复合的,即这是许多结果集的"数组",rset = (ResultSet) ((OracleCallableStatement) stmt).getCursor(2);就是得到游标指向第二个的结果集,,,然后就可以以"正常"的方式来进行操作了.</P>
<P>&nbsp;</P>
<P>现在问题又来了,即,我操作的是Sybase数据,这会不会和Oracle都支持这种存取呢?</P>
<P>查了一个Sybase的JDBC驱动文档,发现,它不这两个类<BR>com.sybase.jdbc2.jdbc.SybCallableStatement ;<BR>com.sybase.jdbc2.jdbc.SybCursorResultSet ;<BR>com.sybase.jdbcx.SybCallableStatement;<BR>com.sybase.jdbcx.SybCursorResultSet;</P>
<P>那么,可以想象的到,这应该也处理这样的结果的,<BR>我是如下处理的:<BR>try{<BR>&nbsp; String sql = "{ call sp_select_role_priv ( ? ) } " ;</P>
<P>&nbsp; dbm = DBConnectionPool.getInstance();<BR>&nbsp; conn = dbm.getConnection(Constants.DB_earn) ;<BR>&nbsp; cstmt = (SybCallableStatement) conn.prepareCall(sql) ;<BR>&nbsp; java.sql.ResultSet rset = null ; //得到的结果集<BR>&nbsp; java.sql.ResultSet rs = null ; //小结果集</P>
<P>&nbsp;&nbsp; do{<BR>&nbsp;&nbsp;&nbsp;&nbsp; rs = cstmt.getResultSet() ;<BR>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("## resultSet:"+k);<BR>&nbsp;&nbsp;&nbsp;&nbsp; while (rs.next()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp; if(k==1){ <BR>&nbsp;&nbsp;&nbsp;&nbsp; if(rs.getInt(1)&lt;1){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; if(k==2){<BR>&nbsp;&nbsp;&nbsp;&nbsp; if(rs.getInt(1)&lt;0){ //1:具有权限<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; } <BR>&nbsp;&nbsp;&nbsp;&nbsp; rs.close() ;<BR>&nbsp;&nbsp;&nbsp;&nbsp; k++;<BR>&nbsp;&nbsp;}while (cstmt.getMoreResults());</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch (SQLException ex) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace() ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally {<BR>&nbsp;&nbsp; ........<BR>&nbsp;&nbsp; }</P>
<P>结果执行,成功的将问题解决.sybase和oracle有所不同的是,<BR>它取得第几个结果集的时候是通过rs = cstmt.getResultSet()得到的,<BR>在得到这个结果集这前,需要将游标指到应该得到的地方,可以通过cstmt.getMoreResults(int i)得到,也可以以次取,通过cstmt.getMoreResults()将游标指向下一个结果集.</P>
<P>另外,自己又看了一下java.sql包中的类,和SybCallableStatement,发现,直接调用java.sql包的中CallableStatement,也有getMoreResults()方法,那么这些驱动有两种可能,一种是实现自己的读取方法,二是针对数据库自身的特性,进行了效率上的提高.</P>
<P>呵,这就没有时间再去仔细的研究了..</P><br>文章来源:<a href='http://www.netbo.com.cn/showlog.jspe?log_id=80'>http://www.netbo.com.cn/showlog.jspe?log_id=80</a><img src ="http://www.blogjava.net/redcabin/aggbug/39971.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/redcabin/" target="_blank">寂寞河</a> 2006-04-08 12:01 <a href="#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[导入]北京地铁上班高峰期间并不拥挤......</title><link /><dc:creator>寂寞河</dc:creator><author>寂寞河</author><pubDate>Sat, 08 Apr 2006 04:01:00 GMT</pubDate><guid /><wfw:comment>http://www.blogjava.net/redcabin/comments/39972.html</wfw:comment><comments>#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/redcabin/comments/commentRss/39972.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/redcabin/services/trackbacks/39972.html</trackback:ping><description><![CDATA[<P><FONT size=1>　　　今天早上，我和往常一样，做上了上班的地铁列车，随着地铁一站站的驶过，上班的人流在不断的往地铁里面拥入，地铁车厢里面显的空间有些不足了．</FONT></P>
<P><FONT size=1>　　　就在刚刚驶过几站，忽然我身后一阵骚动，我扭头一看，哇噻，一位年轻女士和一位50来岁的女的可能是因为一个座位的原因，在车厢内打起来了，有的人劝说，有的人干脆就拥挤着给他们腾战场，呵呵，有人感叹了：北京地铁并不拥挤阿，还可以打架呢，呵呵．．．．．．</FONT></P><br>文章来源:<a href='http://www.netbo.com.cn/showlog.jspe?log_id=79'>http://www.netbo.com.cn/showlog.jspe?log_id=79</a><img src ="http://www.blogjava.net/redcabin/aggbug/39972.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/redcabin/" target="_blank">寂寞河</a> 2006-04-08 12:01 <a href="#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[导入]apache项目中的Digester组件的应用</title><link /><dc:creator>寂寞河</dc:creator><author>寂寞河</author><pubDate>Sat, 08 Apr 2006 04:01:00 GMT</pubDate><guid /><wfw:comment>http://www.blogjava.net/redcabin/comments/39973.html</wfw:comment><comments>#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/redcabin/comments/commentRss/39973.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/redcabin/services/trackbacks/39973.html</trackback:ping><description><![CDATA[<P>&nbsp;&nbsp;&nbsp; 昨天对SMIL系统进行了一个可配置的开发,其实配置文件用xml文件写的,对文件的解析采用了apacher的Digester组件,在开发的过程中,查了一些资料,并发现了一些问题和不明白的地方,现在将开发的代码列出来,一供讨论.</P>
<P>&nbsp;&nbsp;&nbsp;有关Digester组件的说明和用户,可以在网上搜索一下,很多,只是千编一律,但足以对Digester组件有一个认识了.下面是我开发的时候的代码</P>
<P>要解析的文件: config/SmilConfig.xml<BR>&lt;?xml version="1.0"?&gt;<BR>&lt;smils&gt;<BR>&lt;url&gt;/WEB-INF/smils/&lt;/url&gt;<BR>&lt;smil&gt;<BR>&lt;template&gt;1&lt;/template&gt;<BR>&lt;name&gt;smil1.smil&lt;/name&gt;<BR>&lt;info&gt;aaaaaaaaa&lt;/info&gt;<BR>&lt;file&gt;<BR>&lt;src&gt;1&lt;/src&gt;<BR>&lt;name&gt;100.jpg&lt;/name&gt;<BR>&lt;/file&gt;<BR>&lt;/smil&gt;<BR>&lt;smil&gt;<BR>&lt;template&gt;2&lt;/template&gt;<BR>&lt;name&gt;smil2.smil&lt;/name&gt;<BR>&lt;info&gt;bbbbbbbbbb&lt;/info&gt;<BR>&lt;file&gt;<BR>&lt;src&gt;2&lt;/src&gt;<BR>&lt;name&gt;200.jpg&lt;/name&gt;<BR>&lt;/file&gt;<BR>&lt;/smil&gt;<BR>&lt;smil&gt;<BR>&lt;template&gt;3&lt;/template&gt;<BR>&lt;name&gt;smil3.smil&lt;/name&gt;<BR>&lt;info&gt;cccccccccc&lt;/info&gt;<BR>&lt;file&gt;<BR>&lt;src&gt;3&lt;/src&gt;<BR>&lt;name&gt;300.jpg&lt;/name&gt;<BR>&lt;/file&gt;<BR>&lt;file&gt;<BR>&lt;src&gt;33&lt;/src&gt;<BR>&lt;name&gt;3300.jpg&lt;/name&gt;<BR>&lt;/file&gt;<BR>&lt;/smil&gt;</P>
<P>&lt;/smils&gt;</P>
<P>对xml定义的解析规则:config/RuleConfig.xml<BR>&lt;?xml version="1.0"?&gt;<BR>&lt;digester-rules&gt;<BR>&nbsp;&nbsp; &lt;object-create-rule pattern="smils" classname="config.SmilConfig" /&gt;<BR>&nbsp;&nbsp; &lt;call-method-rule pattern="smils/url" methodname="setUrl" paramcount="0" /&gt;<BR>&nbsp;&nbsp; &lt;pattern value="smils/smil"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;object-create-rule classname="config.Smil" /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;call-method-rule pattern="template" methodname="setTemplate"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; paramcount="0" /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;call-method-rule pattern="name" methodname="setName"<BR>&nbsp;&nbsp;&nbsp; paramcount="0" /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;call-method-rule pattern="info" methodname="setInfo"<BR>&nbsp;&nbsp;&nbsp; paramcount="0" /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;pattern value="smils/smil/file"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;object-create-rule classname="config.FileSrc" /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;call-method-rule pattern="smils/smil/file/src" methodname="setSrc"<BR>&nbsp;&nbsp;&nbsp; paramcount="0" paramtypes="java.lang.String"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;call-method-rule pattern="smils/smil/file/name" methodname="setName"<BR>&nbsp;&nbsp;&nbsp; paramcount="0" paramtypes="java.lang.String"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;set-next-rule methodname="addFileSrc"&nbsp;&nbsp; property="file"<BR>&nbsp;&nbsp;&nbsp; paramcount="0" /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/pattern&gt;<BR>&lt;set-next-rule methodname="addSmil" /&gt;<BR>&nbsp;&nbsp; &lt;/pattern&gt;<BR>&lt;/digester-rules&gt;</P>
<P>对应SmilConfig.xml文件定义的类<BR>SmilCofnig.java:</P>
<P>package config;</P>
<P>import java.util.HashMap;</P>
<P>public class SmilConfig {<BR>&nbsp;&nbsp; private String url;<BR>&nbsp;&nbsp; private java.util.HashMap smils;<BR>&nbsp;&nbsp; public SmilConfig(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; smils = new java.util.HashMap();<BR>&nbsp;&nbsp; }<BR>&nbsp;&nbsp; public String getUrl() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return url;<BR>&nbsp;&nbsp; }<BR>&nbsp;&nbsp; public void setUrl(String url) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.url = url;<BR>&nbsp;&nbsp; }<BR>&nbsp;&nbsp; public java.util.HashMap getSmils() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return smils;<BR>&nbsp;&nbsp; }<BR>&nbsp;&nbsp; public void setSmils(java.util.HashMap smils) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.smils = smils;<BR>&nbsp;&nbsp; }<BR>&nbsp;&nbsp; public void addSmil(Smil smil) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.smils.put(smil.getTemplate(),smil);<BR>&nbsp;&nbsp; }<BR>&nbsp;&nbsp; public Smil getSmil(String templane) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (Smil)this.smils.get(templane);<BR>&nbsp;&nbsp; }<BR>&nbsp;&nbsp; //用于装文件信息打出来...<BR>&nbsp;&nbsp; public String toString(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String rb = "\n";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer sb = new StringBuffer();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(" ********* Smil config content begin *************").append(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rb) ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append("## url:" + this.getUrl()).append(rb) ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.util.Iterator it = this.getSmils().keySet().iterator() ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (it != null) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append("#######&nbsp; 内容如下:").append(rb) ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = 0 ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (it.hasNext()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i++ ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String key = (String) it.next() ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append("##############[" + i + "]").append(rb) ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Smil s = this.getSmil(key) ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append("## smil[" + i + "]:" + s.getTemplate()).append(rb) ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append("## name&nbsp; :" + s.getName()).append(rb) ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append("## info&nbsp; :" + s.getInfo()).append(rb) ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append("## size&nbsp; :" + s.getFile().size()).append(rb) ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.util.Iterator itf = s.getFile().keySet().iterator() ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int k = 0 ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (itf.hasNext()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String keyf = (String) itf.next() ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k++ ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileSrc f = s.getFileSrc(keyf) ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append("## File[" + keyf + "]:" + f.getSrc() + "=" +<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.getName()).append(rb) ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception ex) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(" ********* Smil config content over&nbsp; *************").append(rb);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return sb.toString();<BR>&nbsp;&nbsp; }<BR>}</P>
<P>Smil.java :<BR>package config ;</P>
<P>import config.FileSrc;</P>
<P>public class Smil {<BR>&nbsp;&nbsp; private String template ;<BR>&nbsp;&nbsp; private String name ;<BR>&nbsp;&nbsp; private String info ;<BR>&nbsp;&nbsp; private java.util.HashMap file = new java.util.HashMap();<BR>&nbsp;&nbsp; public Smil(){<BR>&nbsp;&nbsp; }<BR>&nbsp;&nbsp; public String getTemplate() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return template ;<BR>&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp; public void setTemplate(String template) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.template = template ;<BR>&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp; public String getName() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return name ;<BR>&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp; public void setName(String name) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.name = name ;<BR>&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp; public String getInfo() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return info ;<BR>&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp; public void setInfo(String info) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.info = info ;<BR>&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp; public java.util.HashMap getFile() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return file ;<BR>&nbsp;&nbsp; }<BR>/*<BR>&nbsp;&nbsp; public void setFile(java.util.HashMap file) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.file = file ;<BR>&nbsp;&nbsp; }<BR>*/<BR>&nbsp;&nbsp; public void addFileSrc(FileSrc file) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.file.put(file.getSrc(),file);<BR>&nbsp;&nbsp; }<BR>&nbsp;&nbsp; public FileSrc getFileSrc(String key) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (FileSrc)this.file.get(key);<BR>&nbsp;&nbsp; }</P>
<P><BR>}</P>
<P>FileSrc.java</P>
<P>package config ;</P>
<P>public class FileSrc {<BR>&nbsp;&nbsp; private String src ;<BR>&nbsp;&nbsp; private String name ;</P>
<P>&nbsp;&nbsp; public FileSrc() {<BR>&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp; public String getSrc() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return src ;<BR>&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp; public void setSrc(String src) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.src = src ;<BR>&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp; public String getName() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return name ;<BR>&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp; public void setName(String name) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.name = name ;<BR>&nbsp;&nbsp; }<BR>}<BR></P>
<P>进行读取的util类</P>
<P>SmilConfigUtil.java</P>
<P>package config ;</P>
<P>import java.io.File ;</P>
<P>import org.apache.commons.digester.Digester ;<BR>import org.apache.commons.digester.xmlrules.DigesterLoader ;</P>
<P><BR>public class SmilConfigUtil {</P>
<P>&nbsp;&nbsp; public SmilConfig readRule(String dataFileName) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SmilConfig config = null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Digester digester = new Digester() ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; digester.setValidating(false) ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; digester.addObjectCreate("smils", config.SmilConfig.class) ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; digester.addBeanPropertySetter("smils/url", "url") ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; digester.addObjectCreate("smils/smil", config.Smil.class) ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; digester.addSetNext("smils/smil", "addSmil") ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; digester.addBeanPropertySetter("smils/smil/template", "template") ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; digester.addBeanPropertySetter("smils/smil/name", "name") ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; digester.addBeanPropertySetter("smils/smil/info", "info") ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; digester.addObjectCreate("smils/smil/file", config.FileSrc.class) ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; digester.addSetNext("smils/smil/file", "addFileSrc") ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; digester.addBeanPropertySetter("smils/smil/file/name", "name") ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; digester.addBeanPropertySetter("smils/smil/file/src", "src") ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File input = new File(dataFileName) ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; config = (SmilConfig) digester.parse(input) ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception exc) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exc.printStackTrace() ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return config;<BR>&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp; public SmilConfig readRule( String dataFileName,String ruleFileName) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SmilConfig config = null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File input = new File( dataFileName );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File rules = new File( ruleFileName );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(rules.toURL());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(input.toURL());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Digester digester = DigesterLoader.createDigester( rules.toURL() );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; config = (SmilConfig)digester.parse( input);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch( Exception exc ) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exc.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return config;<BR>&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp; public static void main(String args[]){<BR>&nbsp;&nbsp;&nbsp;&nbsp; SmilConfigUtil configUtil = new SmilConfigUtil();<BR>&nbsp;&nbsp;&nbsp;&nbsp; SmilConfig config = null;<BR>&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; config = configUtil.readRule("src\\config\\SmilConfig.xml");<BR>&nbsp;&nbsp;&nbsp;&nbsp; config = configUtil.readRule("src\\config\\SmilConfig.xml","src\\config\\RuleConfig.xml");<BR>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(config.toString());<BR>&nbsp;&nbsp; }</P>
<P>}</P>
<P>现在的问题是:如果采用config = configUtil.readRule("src\\config\\SmilConfig.xml");进行解析,会得到正确的结果.<BR>即:</P>
<P>&nbsp;********* Smil config content begin *************<BR>## <A href="/WEB-INF/smils/">url:/WEB-INF/smils/</A><BR>#######&nbsp; 内容如下:<BR>##############[1]<BR>## smil[1]:3<BR>## name&nbsp; :smil3.smil<BR>## info&nbsp; :cccccccccc<BR>## size&nbsp; :2<BR>## File[3]:3=300.jpg<BR>## File[33]:33=3300.jpg<BR>##############[2]<BR>## smil[2]:2<BR>## name&nbsp; :smil2.smil<BR>## info&nbsp; :bbbbbbbbbb<BR>## size&nbsp; :1<BR>## File[2]:2=200.jpg<BR>##############[3]<BR>## smil[3]:1<BR>## name&nbsp; :smil1.smil<BR>## info&nbsp; :aaaaaaaaa<BR>## size&nbsp; :1<BR>## File[1]:1=100.jpg<BR>&nbsp;********* Smil config content over&nbsp; *************</P>
<P><BR>而如果采用rule配置文件进行解析,却得不到FileSrc的信息,即内容如下:<BR>&nbsp;********* Smil config content begin *************<BR>## <A href="/WEB-INF/smils/">url:/WEB-INF/smils/</A><BR>#######&nbsp; 内容如下:<BR>##############[1]<BR>## smil[1]:3<BR>## name&nbsp; :smil3.smil<BR>## info&nbsp; :cccccccccc<BR>## size&nbsp; :0<BR>##############[2]<BR>## smil[2]:2<BR>## name&nbsp; :smil2.smil<BR>## info&nbsp; :bbbbbbbbbb<BR>## size&nbsp; :0<BR>##############[3]<BR>## smil[3]:1<BR>## name&nbsp; :smil1.smil<BR>## info&nbsp; :aaaaaaaaa<BR>## size&nbsp; :0<BR>&nbsp;********* Smil config content over&nbsp; *************</P>
<P>即在用RuleConfig.xml文件进行解析的时候,却没有得到FileSrc信息内定<BR>现在请大家帮我分析一下,在RuleConfig.xml文件的配置中,那里有错误....<BR>还请教有关配置文件的说明....<BR><BR></P><br>文章来源:<a href='http://www.netbo.com.cn/showlog.jspe?log_id=78'>http://www.netbo.com.cn/showlog.jspe?log_id=78</a><img src ="http://www.blogjava.net/redcabin/aggbug/39973.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/redcabin/" target="_blank">寂寞河</a> 2006-04-08 12:01 <a href="#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[导入]老程序员十年生涯黯然总结</title><link /><dc:creator>寂寞河</dc:creator><author>寂寞河</author><pubDate>Sat, 08 Apr 2006 04:01:00 GMT</pubDate><guid /><wfw:comment>http://www.blogjava.net/redcabin/comments/39974.html</wfw:comment><comments>#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/redcabin/comments/commentRss/39974.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/redcabin/services/trackbacks/39974.html</trackback:ping><description><![CDATA[<P>今年是我大学毕业满10年的日子，也是我投身it技术的第10年。一直想能对过去的经历做些回顾与反思，以更好地走向未来，但总没有笔。刚好csdn举办“讲述程序员的故事”征文，这件事成了一个引子，我终于趁着暑期有时间，敲了一天键盘，便有了这篇人生自述。<BR>10年对于一个人来说是比较长的一个阶段，10年之后，同期大学毕业的同学情况差异之大，让人叹息命运之变幻莫测。</P>
<P>我在此记录下了我的生活足迹，由于时间较长，有些事记得不太清了，但我是尽量真实的记录当时的情况，有兴趣看我这篇长文的人请把我看成是一个在你我中间一块生活，一起喜怒哀乐，一起努力的平凡人，相信我们之间会有很多跨越时空的情感交流。<BR>好，就说到此吧。</P>
<P>序<BR>从1994到2003，不知不觉之间，我已在计算机技术的世界里沉浸了十年。有位哲人说过：如果一个人能用十年的时间专心致志地研究一门学问，或学习一门手艺，或从事一个职业，他一定能成为这个领域的专家。我天资平庸，但哲人的话是有道理的。我用十年的时间先成为了一名合格的程序员，再成为了一个重点大学计算机专业的大学教师。十年磨一剑，蓦然回首，年华如水，青春如歌！</P>
<P>我父母都是城市中的平民，家境仅能解决温饱，我想我可能代表了中国社会的一大类青年，我的经历与体会可能会对许多条件并不好的年青程序员有所启示：只要努力，天资差与环境不好都是可以克服的。因为我不是牛人，所以我不能教你如何成为牛人，我只是尽量真实地写下我的经历与感触，写一个平凡人的努力过程。我为我是一个软件开发者而自豪，为我从事的教书育人的事业而自豪，并愿意为中国落后的软件业尽己菲薄之力，为此，我人生无悔！<BR>我想分为三部分讲述我的人生经历：上篇：学习人生：主要是我学习计算机技术的经历与感触，时间跨度大约是从1994~1996年；中篇：艰难人生：主要是我流迹社会，失业一年半，三次考研的痛苦经历；时间跨度大约是从1997~1999年；下篇：实践人生：主要是我的技术实践经历：在公司打工，开发软件，毕业求职与教书生涯，时间跨度是1999~2003。<BR>&nbsp; <BR>&nbsp; 一 计算机是什么东西？<BR>我是七十年代初在中国出生的那一代人，等我们长大开始读书时，文革已经结束，相对于我们的兄长，从我们这一代开始，以后出生的孩子都能受到较为正规的教育，这是我们幸运的地方。</P>
<P>也就是我们上小学的时候，七十年代末，以美国为技术资源中心的计算机技术开始在全球范围内迅猛发展，这时正是世界性的“软件危机”极为严重的时候，计算机技术各方面都在酝酿着新的突破，而此时比尔盖茨也正在准备构建他的明日微软帝国。<BR>七十年代末与八十年代初，在我们的生活中，看不到一点计算机技术的影子，刚刚改革开放的中国，99%以上的人连“计算机”这个词恐怕都没听说过，中国游离于信息技术大门之外。<BR>在“振兴中华”成为时代主旋律的八十年代，整个中国真的是呈现出一种勃勃的生机，这是一个民族在经历百年耻辱，十年挫折之后的再起步，象一些老歌---《金梭与银梭》，《在希望的田野上》等，就是当时青年的一种积极向上的精神风貌的体现。这种环境下，对于正在成长中的我们这一批少年，在潜意识中有极为深刻的影响，我们认为爱国与振兴中华是天经地义的事，并且成为了努力学习的主要动力（呵呵，现在的一些“愤青”---愤怒青年一定会说我们当时被“洗脑”了，也许真的是吧，这种信念确实会给人以极大的动力，我看不出有什么不好，至少我不会有现在这一批青年所经历的非常迷茫的感觉）。<BR>1986年我考上了桂林市重点高中---桂林中学，在那儿，我第一次见到了电脑。</P>
<P>1．中学的计算机兴趣班</P>
<P>1987年我在桂林中学读高二，桂中是重点高中，条件较好，当时学校课外安排了两个班：无线电班和计算机班，我上的是计算机班，当时用的微机是apple ii，用basic编程。记得当时中国也开发了一种同档次的计算机，叫做中华学习机，要在中小学中大力推广，但apple ii后来发展成了著名的mac系列，并拥有了自己的操作系统，而中国的中华学习机，还有后来的小霸王等电脑学习机，都无疾而终了。<BR>学校安排上机，有同学不知从哪找来了一些有趣的basic程序，什么“比翼双飞”，“飞机空战”等等，都是一些非常简单的小游戏，当时他抄了厚厚一本，一上机就敲一些到计算机中运行，而我是一点也不会，只有站在一边看的份。<BR>那时会计算机的人很少，老师讲的我又不明白，考试的时候也不知道怎么过的。呵呵，后来我读研打工时，在网上看到洛阳一个高中生用vb编的一个“电子书童”程序，水平之高，我当时真是没法比。<BR>1989年六四动乱，广西高考名额一下减了7000多，竞争激烈，十几人里才能取一个，由于压力过大，我高考前夕失眠，第二天考语文，120分的试卷当时只考了68分，因而与重点高校无缘。本想复读，但父母怕我来年考不上，一定要让我读广西大学，我万分不情愿地顺从了父母的意愿，去了我不喜欢的学校，读了我不喜欢的专业。男怕入错行，我在大学毕业后重新开始学我喜欢的专业，足足用了五六年的时间才转过来，真正成为一名合格的劳动者，走了一条长长的弯路，所以，父母的决定对缺乏经验与决断力的孩子而言，真的是非常重要。<BR>现在想起来，父母当时没错，我也没错，那都是在时代与社会环境下的自然选择。</P>
<P>2．失败的四年本科与工作初期</P>
<P>作为六四之后第一批进入大学的本科生，我们学习了两年的“六四风波的反思”，四年里我是个老老实实的好学生，但四年除了玩命过了六级，什么也没学会。<BR>记得大学第一节课就是basic语言，呵呵，也根本没学会，但我看来注定了要与basic难解难分了，后面的实践篇中我会讲我用basic开发的事。<BR>大学里我学的专业是电力系统自动化，学过微机原理与fortran，上机时还用的是古老的主机加终端方式的计算机（叫做l/f机），我上机时真是一塌糊涂，因为这门课我从没学进去，也从没学懂过。有同学很厉害的，会用电脑打印出许多漂亮的图片（当然现在看起来很粗糙，针式打印机打的），我那时就称这些人为牛人了。<BR>呵呵，我如果没记错的话，做超级解霸的梁肇新也是广西大学的，但不是我们系，记得我当时就已听到有关几个计算机牛人的事，估计其中就有他吧，如果我记错了，梁肇新先生请指正。在本科期间，我对电脑是神秘多于兴趣。这也说明我成为不了牛人与大师，天资有限。后来，我发现一个普遍的规律，如果能成为计算机方面的牛人与大师，请去翻翻他们的传记，绝大多数在本科期间就已展露出他们的才华。而我们现在的中国高校，这么多的本科生都在为考试、考研、考托、考g而奔忙，这种填鸭式的应试教育体制，扼杀了太多学生的创造性。结果是一个学生在大学里读得越认真，就受到的错误影响越大，我是用好几年的时间反思才得出这个结论的。所以，中国高校十几年数以几十万计的本科生中出不了可编写linux内核的杰出人才，一点也不奇怪。</P>
<P>1993年我毕业了，用我总结的一段话来说，是：<BR>一张白纸进来，一脑浆糊出去。<BR>毕业后我分到了一所号称是“中港合资”的生产蓄电池的公司，呵呵，刚刚工作的日子让我这个单纯的大学生被生活好好的教训了一下，许多无法以前想象的社会现象让我目瞪口呆，年轻气盛导致穿了小鞋，还只能忍气吞声。吃了生活的一个闷棍，我才明白，我除了有张文凭，什么都不是！<BR>当时，我感到最郁闷的是我在公司里什么都不会做，一个电机烧坏了我楞不知如何下手修，公司老总办公室里的灯不亮了，学电的大学生我花了半小时楞不知原因在哪！我学的东西没一样能用的。开始我还以为是因为我在学校里没认真学，但后来问了很多同学，90%以上的都有同感，我现在终于认识到这不单是我个人的错，我自认为在学校中是很努力的，从未偷懒过，但如果90%以上的学生所学不能服务社会，这种教育体制一定存在问题。</P>
<P>四年里，我的电脑知识与技能=0！<BR>现在看起来，我浪费了宝贵的四年光阴！但当时的环境与认识水平，也只能如此了，没有当初的浪费，怎有后来的珍惜？这是人生必经的一个阶段。<BR>&nbsp;</P>
<P><BR>二 漫长的理论学习时期</P>
<P>1．从电脑培训班开始</P>
<P>我毕业后的第一个工作单位是一个非常差的企业，我在那儿见识了几乎所有中国差的企业的弊端：人浮于事，拉帮结派，暗箭伤人，损公肥私……。可以想见，在这样的企业工作，人是多么的颓废。我在无聊之中过了大半年的时间。1994年4月的一天我去桂林新华书店买书，看到桂林电子工业学院老师举办一个电脑培训班，教打字、排版、常用dos命令等电脑使用基础，反正也没事，不如上个班学点东西吧。不曾想就是这样一个培训班，却根本影响了我的人生之路。<BR>我清楚地记得当我第一次上机时，连电脑开关在哪都找不到，老师拿着一张五寸软盘，插入软驱，打开电源，在一阵“吱吱”的声音之后，屏幕上开始有英文字符出现，然后，教师在键盘上敲入几个键，电脑沉默一会，突然在屏幕上跳出一个小人，出现一行字：快快乐乐学电脑，还传出了音乐。我当时真是惊呆了，电脑怎么还会唱歌？现在想起来，那个软件其实是台湾松岗系列教学软件，而我一个大学本科生，在毕业之后居然对电脑无知到这个地步，我真不知道是该哭还是该笑……！<BR>俗语说：“一见钟情”。我是相信这种事的，因为就是这第一次上机，让我产生了搜索这一神秘世界的强烈兴趣，从此就再难与电脑分开了。<BR>当时，有两位电子学院的老师：尹老师和陈老师。他们给我们讲dos，讲汉字输入，讲他们如何修改天汇汉字系统使它能在一张软盘上运行，讲打字排版……，一个月之后，我不满足，又学了一个月。<BR>在上培训班的时间里，我向老师要来了桂林电子工业学院计算机应用专业本科四年的培养方案，回到家中，列出了所有本科课程，再根据书上的先修课程介绍，绘制了一张巨大的课程树，从树根开始，决定一本本地啃，从头开始学计算机技术。计算机科学的学习有较强的系列性，想一步到位很可能会学不懂，但循序渐进又无法跟上技术发展的速度，这是一个非常突出的问题。我现在想起来，觉得好的学习方式是：学理论打基础，在实践中逐步理解理论，多思多悟，就会发现层出不穷的新技术中有许多一直不变的东西存在。把握这种东西，就可以以不变应万变。这种“不变”的东西是什么？就是软件开发的基本原理与理论，基本思想与方法！在我对面向对象理论进行了较深入的学习与把握之后，我学.net只用了三个月的时间就可以独立设计一个完整的全面向对象软件架构，并且用vb.net与c#混合语言把它给做出来了。对于j2ee，我同样有这种自信，也用三个月的时间，一定可以开发与设计基于j2ee平台的软件，因为它们背后的计算机技术基础是一致的，完全可以触类旁通。<BR>尹老师和陈老师可能不知道，他们开的一个也许是为了经济效益的培训班，最后居然培育出了一个计算机硕士！所以，作为一名教师，其责任真的是非常重大的，可能会影响学生的一辈子，我感激他们！</P>
<P>2．漫长而艰辛的学习之路<BR>我当时每月只有一百多元的工资收入，把大半收入都用到买书上去了。电子工业学院门旁的那个科技书店，以及桂林科技书店，成为了我最常去“站读”的地方。我买了数据结构、操作系统、微机原理、ibmpc汇编程序设计，c程序设计……这些教材，就按照预定的计划开始学了。<BR>我当时也说不清楚为什么要学这些东西，决不象现在学生学什么东西都有很强的功利性：学英语为了出国，学电脑为了好找工作。当时根本就没有想过今后如何如何，就是对计算机技术本身的兴趣推动我去学习的。<BR>当时计算机书还不象现在这样扑天盖地，我几乎看完了我能弄到的每一本计算机书，看了一些书，就特别想有地方上机，能练一练。但我一个月一百多元收入，一台电脑怎么也得几千元，要五六年不吃不喝才攒够钱，父母都是普通百姓，家境仅能温饱，拥有一台电脑真成了我最大的美梦。<BR>为了有机会上机，我这个脸皮极薄的人也会什么都顾不上了，带着一盒保存着各种软件的软盘，厚着脸皮到处找可能的地方上机。在这个时候，电子工业学院又一次帮了我，他们的机房管理得并不严，我就冒充是他们的学生去买机票上机。后来去得多了，那儿的老师都熟悉我这张脸了，但搞笑的是，居然没一人知道我是哪个班的！<BR>当时电子学院用的局域网操作系统是novell，我在那儿学会了使用许多最基础的软件，现在仍然如数家珍：cpav，turbo pascal 5.5，ucdos，tway（天慧汉字系统），masm，turboc2.0，还有鼎鼎大名的norton公司的磁盘医生ndd，pctools，borland公司的最牛的常驻内存的软件sidekick，……<BR>在电子学院机房，我还玩了经典游戏：决战中国海，冒险岛，战斧，三国……。<BR>学校网络里软件很多，但其中所染的病毒也五花八门。我记忆深刻的是第一次遇见dir ii病毒时，那种感觉决不是害怕，而是欣喜，呵呵，我见到病毒什么样的啦！由于dos内核是开放的，所以那时开发一个病毒程序相对容易，大家又都喜欢用软盘拷来拷去，结果毒源泛滥，病毒的猖獗使得杀毒软件有了巨大的市场，现在大名鼎鼎的江民kv系列，就是在那时开始占据中国防毒市场，同时还有部的kill等竞争对手，瑞星，金山等都是后来者。<BR>那时，我白天在公司上班，就盼望着晚上的上机，每次上机我都有详细的计划，因为机时宝贵，所以份外珍惜。<BR>为了上机时能多敲些程序，我一咬牙，向妈妈要了两百元，买了一台电脑学习机，回家苦练英文指法与五笔输入，每天对着家里那台14寸的电视机屏幕，敲击至少键盘2小时以上。练得手腕酸疼，但终于达到了运指如飞盲打的程度。学五笔，背字根“目具上止卜虎皮，……”，足足花了一星期才背下来，并把每个字根与手指对应起来，后来看报纸都不自觉地将汉字给拆得七零八落，再也看不到是一个完整的汉字啦，当时好象练到了每分钟可打60多个字，后来我居然靠着这弹指神功当了一阵打字员混饭吃！呵呵，练好了指法，一上机，确实效率倍增，两小时能敲入并运行调试的程序比以前花三小时敲的还多。</P>
<P>94，95年是我条件最差，但学习劲头最足的两年时期，外在环境的恶劣，却反而造就了我高昂的学习兴趣，那种痴迷，我想热恋也不过如此了，可能因为我太喜欢计算机了，所以爱情与我无缘，这也是无可奈何的事。 ：-（ <BR>我特别想说说我学习计算机技术书籍的感觉。如果你真的喜欢一门学科，那在啃一本本专业书籍时，就决不会觉得它厚，而只嫌它不够厚。对比我在本科学《电磁学》、《自控原理》之类枯燥无味的课程的感觉，那种课程脱离实际，从纸上到纸上，学生根本无法真正掌握。而学计算机课程《c程序设计》、《数据结构》、《操作系统》等课程的感觉真是天壤之别，原来本科学的东西是越学越糊涂，而我在学习计算机科学的过程中自己就感到慢慢地将所有的知识串成了一条线，脑中有一棵知识树在成长，这不是形容词，是真的感受。我学dos命令，学了很久不明其道理，是在一天早上醒来时灵感一来，突然理解了文件与树的概念，于是，就真正把握了dos命令的内涵，开始对copy，format，move……这些英文单词游刃有余了。有段时间，我甚至能感觉得到我的知识在与日俱增！如果那时能有相对稳定的客观条件：比如有一台随时可用的计算机，那我一定学得更快更好。不过话又说回来，条件好的时候，人又容易为安逸所累，进步反而慢。还是那句老话：业精于勤荒于嬉。现在的许多学生就是物质条件太好了，反而不懂得珍惜。</P>
<P>后来我看了金庸先生的《射雕英雄传》，郭靖成了我最喜欢的人物，不是因为他有黄蓉的爱，而是他那种坚忍不拔的毅力，以平凡之资终登绝顶！金庸先生真是妙笔！此小说我不知看了多少遍。<BR>最值得怀念的就是我学编程的岁月，我学c语言用的是谭浩强的《c程序设计》，当时谭老师在电视上同时讲c程序设计，我每天必看，把书上的每道例题与习题全部做了一遍，并写出了每次上机的安排。我每次都先在纸上把程序写出来，然后上机时争分夺秒地在计算机中调试运行，并根据运行结果思索为什么会运行不正常，在哪儿出错了，如何更正，上机完后还有总结。就是这样，我把谭浩强的《c程序设计》一书中的所有例题和习题全部敲到计算机中运行了一遍，打下了c语言扎实的基础。谭老师的书和课，的确影响了中国多少名程序员！<BR>我学了c语言之后，就开始想做点东西了。我用了一个月的时间，用c编写了一个中文下拉菜单的程序，从ucdos中的字库中提取汉字点阵，然后在图形模式下“画”出汉字来，使程序能脱离汉字系统的支持直接显示汉字。整个程序应该有一两千行代码吧，全部是自己寻找资料，一行行敲进去的。后来，我又编了读取wps文件的程序（当时dos下打字排版是求伯君的wps一统天下，word当时在哪里我不知道呢！《电脑报》介绍过的求伯君，鲍岳桥等作为第一代中国杰出程序员代表，是我当时崇拜的偶像），我还编写了一个绘制简单图形的小程序，从编程调试的过程中，我得到了程序员基本功的最初训练。我当初没人教，遇见各种困难只能自己解决，为找出一个bug，晚上睡觉做梦都在编程，而现在的一些大学生，程序通不过，马上问老师，甚至有学生把程序发到我的邮箱，叫我帮他调程序！有的计算机专业学生，学了四年，四年敲过的代码总数恐怕不超过2千行！<BR>的确，我当时的水平很低，现在的本科生比我当时强太多了，但至少有一点他们中的许多人不如我，他们不如我勤奋，也不具备我的毅力，我觉得这是现在这批八十年代出生的大学生最缺的东西。</P>
<P>我用一年半的时间基本自学完了计算机专业的主干课程（除了《编译原理》，我实在看不懂），1995年我参加了初级程序员考试，结果上下午成绩加起来有90多分。但96，97我两次参加程序员级考试，虽然我已有不少编程实践，但仍然通不过，现在看起来，这反映出一个事实：我理论基础实在太差，天资也并不高。直到现在，我仍然痛感我的计算机基础理论不好，使我难以成为一名计算机科学家，而只能成为一名不错的软件工程师。<BR>从95年开始，我的生活开始加速下降，我所在的公司由于被一群我现在称之为驻虫与流氓的人给弄得不成样子，每月连100多元的工资都无法保证，我只得离开了公司，把档案往人才交流中心一放，就开始了我四年的社会漂浮生活……。</P>
<P>在这四年中，我干了不下四五种工作：当过推销员，当过打字员，当过培训老师，修过电脑，从事售后服务，甚至摆过地摊……，一切的一切，很简单，就为了能有口饭吃。生活是严厉的，不讲情面的，我唯一的爱好就是闲下来就拿起我的计算机书来看。当时我大哥说过：你学这些东西有什么用？能靠它当饭吃？不要惊奇这种观点，在我们那信息闭塞的地方，当时有谁能想到计算机技术会有如此大的改变社会的能力？我之所以不懈学习，纯粹是为了解脱精神上的困惑，在技术的海洋中忘却生活的烦恼。我后来有一句名言：何以解忧，唯有电脑。别人当作一句笑话，但却是我当时的真实写照。<BR>万事都有两面，事情坏到极处，就会向好转化。又是一个很偶然的事，改变了我的人生轨迹。<BR>1996年，我的一个高中同学杨考上了湖南大学计算机系研究生，请客吃酸菜鱼火锅。在大家喝酒时，杨提了一个问题：请大家说出一个自己最想达到的目标。我的桂中同学大多数都是上的全国重点大学，此时毕业三年了，大家都对社会对生活有了自己的认识，于是就有了各种不同的答案，我当时的回答是：“我希望能有一天开发出一个好的软件，让许许多多的人都能用上它。”，这个目标我到现在都没达到。但当时大家是给我热烈地鼓励。杨饭后跟我说，你既然那么喜欢计算机，为什么不考研呢？对啊，我为什么不去试试呢？当天晚上我躺在床上，没怎么想就确定了要考研的想法。当时却怎么也没想到，考研之路成了另一条折磨人的不归路。对我一生的影响深远……<BR>这就是我早期的学习生涯，深深地体现出中国的时代特色。这段时间我的生活是困苦的，心情是苦闷的，但学习热情却是无以伦比的。现在我一个人拥有两台奔四电脑，随时可上互联网获取丰富的资源，反而在技术上难有寸进了。越来越觉得古语说得好：<BR>艰难困苦，玉汝于成！<BR>这是生活的真理！<BR>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>实践人生<BR>-------一个普通it人的十年回顾（下）<BR>下篇 曲折的实践之路<BR>1．希特勒地堡与cih病毒<BR>99年4月，我来到北京参加研究生复试。复试完了之后就不回去了，我拿着一张光盘，里面刻着我用vb和authorware3.5编的一个cool 3d的教学软件，到处参加招聘会，开始了在北京的打工生涯。<BR>说句实话，我心中真是一点底也没有。北京人才济济，我一个三流大学的毕业生，又不是计算机专业的，有人要我吗？<BR>我在北京无依无靠，没有任何一个亲戚在北京，住成了大问题。北京这地方，钱太不经花，生活费用太高，我四处寻找便宜的地方住。后来，我在北京化工大学对面的招待所中租了个床位，每晚20元，地下室。这个招待所的地下室非常大，每天回去的时候，都要走过长长的曲曲折折的通道，加上那昏黄的灯泡，每次我都有走进了希特勒地堡的感觉。地下室里潮湿阴暗，不见天日。地下室里人员很杂，什么人都有，永远没有一种安全的感觉，所幸的是我也是个穷光蛋，光脚的还怕穿鞋的？别人能呆我也能呆，唯一让我担心的是钱，没钱，在北京连流落街头都不够格，立马被收容去昌平筛沙。呵呵，我没这种经历，这是当时住一块的一个外地要考北京中医药大学的博士生说的（我俩居然住到了一个屋里，大家都没钱，只能挤地下室，只是他老兄晚上打呼，我可真受了不少罪）。</P>
<P>日子一天天过去，袋里的钱一天天少了，但工作还是没着落，心中越来越慌，除去学费，来京时父母给我2000元，大哥资助我的1000元就是我当时的全部资金（3000元在北京能呆多久？！）。我当时订了个计划，留下500元保底，打死都不能动，要靠它作路费回家的。我当时说，一定得找到一家公司，再少的钱都干，只要有口饭吃，有张床让我睡我就满足了。<BR>我一共应聘了四五家公司，最具传奇色彩的是到西单附近一家公司的应聘经历。那时，我带去了我的作品，公司项目经理要看，于是我给他们演示，很奇怪，程序一打开就死机，一连两台电脑都一样，末了，两台电脑都启动不起来了。用瑞星一查，cih病毒——那天正是4月26日！于是，cih破坏了电脑主板的同时，也无情地摧毁了我的就业机会。还算老板可怜我，没要我赔。其实我当时快到山穷水尽的地步了，真要我出钱，我可能连家都回不了啦。陈盈豪（cih病毒的作者），你小子这么的聪明做什么不行，偏要去做病毒，害人害已，弄得我连个饭碗也找不到，晚上回“希特勒地堡”，把这小子骂了无数次！<BR>总算天无绝人之路，在我数着最后还剩余600元钱的时候，终于有一家公司要我了，做中小学教育软件，月薪1600。干了两星期，又给我在公司的仓库挪开货物，搭了个床位，我就在那住下了，庆幸再也不用到“希特勒地堡”里当冲锋队员了。每天下班后，我就睡在林立的大纸箱之中，如果来个地震，呵呵，我就埋在纸箱中了，休想爬得出来！</P>
<P>我干得非常努力，第一个月工资开出来，扣掉个人所得税，我拿了1500多元。你们不知道我拿到第一笔工资的感觉！这钱在很多人眼里简直不算钱，但对于一个没工作近两年，工作也一个月收入不到200的穷小子而言，就象陈佩斯小品中所演的：“我王老五活了一辈子，还从没见过这么多钱啊！”。好笑吗？我一点也不觉得好笑。我只是心酸，我到了28岁才可以用自己的知识与技能养活自己，再不用依靠父母和兄长的资助，才真正完全用自己的力量在社会上站起来，一个没有经济自立能力的人，只能是个不成熟的人，一个躺在父母身上的人，不是一个真正的男子汉！我当这样的孬种当了28年！<BR>我找到工作后向家里写过一封长信，信中讲了我对父母平时不好意思说的很多心里话，当时，我父亲说，母亲接到信都哭了。 我刚拿到工资，马上打了个电话回家里告诉母亲，以缓解他们的焦虑，毕竟儿行千里母担心啊！父母有退休金，一再表示不需要我赡养，而我再这样不要脸下去，我还是人吗？我就是从那时候开始，下定决心，从今往后，再不向家中要一分钱！今后三年读书和生活的费用我一定要用自己的劳动来获取。<BR>金钱带给我的激动就是在那段时间，温饱问题解决之后，金钱对我的诱惑就再没有了，哪怕让我一个月赚一万，给套房子给我，也不可能再给我带来幸福的感觉了，钱是重要的，但不能成为它的奴隶，家中不需要我负担，我一个人有吃有喝，干着我喜欢的工作，足矣！<BR>我在那公司一直干到九月学校开学为止。我走的那一天，公司居然还开了个欢送宴会，老板封了500元的封包给我。我真是感动。我大学毕业后在社会上挣扎求生，得到的大都是冷眼与蔑视，社会终于认可了我的价值，我不是一个只知道吃饭的废物！<BR>1999年9月9日上午9点，在这个最多9字的时刻，我到学校报道来了，放下行李，我坐在分配给我的床上，心中终于踏实下来。<BR>现在，我在北京终于有一张属于我的床了，一张真正属于我的床了，终于有个地方可以让我安稳地睡觉了。没有这段经历，我怎么体验到“安居乐业”这一个词的真实含义！个人如此，国家要做到，中国要做到，更难！</P>
<P>编程生涯</P>
<P>2．编程生涯<BR>读研两年半的时间，我四处打工，这两年半我至少在七八家公司做过，编了十几万行代码，为自己赚了一台电脑，两部手机（丢了一部），还有读研期间的所有费用，实现了我的目标：没向家里要一分钱。<BR>我水平不高，但在打工过程中，发现许多中国软件公司的水平更菜！<BR>2000年暑假，我参加一个商品软件的开发，搬到了北大燕北园的一个宿舍，在那儿搞封闭式开发。在这个项目采用vb6开发，主力程序员除我之处，还有一个华北电力大学的研究生。大家都没开发商品软件的经验，没经过正式的设计，就匆忙编码了。我曾经想采用分层的系统架构，但遭到另一位程序员的反对，争吵没有结果，老板也不能做决定，结果各行其是。现在看起来，那时真是太菜了，任何一本软件工程书都会指出这种做法是不对的。<BR>我们直接就热火朝天的干了起来，那位华北电力大学的老兄，真让我佩服，他可以在一个sub过程中写上2000行代码！我觉得奇怪，为何他能写这么多的代码？一看，顿时我晕倒，他居然将每个控件的left,top,width等属性都用代码来设定！想想这样的程序，调试时光单步执行就需要按多少次f8键！<BR>我们在电脑旁边搭了个行军床，每天都是干到早上6点才睡，12点吃中饭，然后又是一个通宵。当时整个工程只有一个类模块，被我用于封装访问数据库的ado数据引擎，这是整个工程中唯一一处用到了最简单的面向对象技术的地方，然后，我写了近十个bas公用模块，每个模块代码规模都有一两千行，还有十几个窗体，每个窗体中都塞满了事件驱动的vb代码，整个软件应该有10万行代码，我一个人在此期间至少就写了3万多行vb代码。程序的主处理流程我甚至用ado与dao写了两套！<BR>现在想起来，我们当时根本就不知道面向对象为何物，更不理解许多对软件开发至关重要的理论，就凭着一种热情。在这段痛苦的开发经历中，我不仅精熟了vb，而且从中学到了很多。现在再开发同样功能的东西。我至少可以砍掉2/3的代码。怎么学都不如从失败中学得多。<BR>后来我总结vb程序员的三个境界：<BR>（1）所有代码都只放在窗体文件中的，属于菜鸟级，他们只会从面板上拖控件，设置属性，然后再给事件编码<BR>（2）工程中有bas模块的，属于中间级，他们已意识到有大量的代码是重复出现的，应该将其抽取出来作为公用模块<BR>（3）工程中有cls模块的，属于高手，他们已掌握了面向对象的思想，并能应用这种思想来解决实际问题<BR>正是这次开发经历，促使我反思：到底如何开发软件？我个人可以用vb完成各种各样的功能，为什么凑在一起就会那么困难？更正一个bug为何那么难？为什么一个看似简单的软件，要拖半年的时间还看不到结束的日子？<BR>九月，研究生要开题，我自拟了个课题：软件体系结构设计。我决心弄明白，好软件到底是怎么做出来的。<BR>我放下了vb，开始研究c++，原来学过vc，但没学会，就直接从c++ builder入手。borland公司的vcl类库让我大为叹服，很快就迷上了它，为此连带学了delphi，并参与了一个delphi项目。给我真正震撼的是《设计模式》这本书，看了才知道，原来好软件是这么设计出来的！在此，我强烈推荐所有有一定编程经验的程序员一定要看这本书！<BR>一边学习理论，一边可没忘记我没经济来源，于是又四处打工，接一些小项目与小模块来赚些生活费，国内一家横跨家电与软件的著名公司是我打工期间去过的最大的公司。但无论什么公司，都给我一种感觉——烂！公司中充满了对员工的剥削与不尊重，对软件开发这一事物的错误认识，管理混乱。<BR>我没机会去外企，技术水平不到，别人不要我 &amp;#61516;，但我所见到的软件公司，我敢说没一家能做出世界一流的软件！<BR>我上的研究生课程也让我失望，整个就是本科教育的再版。经过高考与考研两次重大考试，我对考试已是深恶痛绝，但读研期间仍要考试，而且是闭卷！我就不知道我去背那些条文对我的研究与学习有何帮助？2000年7月当我考完最后一门，终于大松一口气，我终于摆脱了考试的压迫，可以在剩余的一年半中真正搜索我渴望已久的软件技术了。这年，我29岁。<BR>悲哀吗？一个中国的程序员要到29岁才可以真正自由地学习想学的东西！<BR>我开始研究面向对象理论，看了大量的书，每天都在实验室学习到深夜12点，天天上网，csdn成了我最常去的网站。<BR>随着我对软件技术的了解越多，就越深刻地感到国内与国外技术水平的差异是如此的巨大，巨大得甚至有让人绝望的感觉。同时，在北京这个中国软件人才最集中的地方，我也见到了许多牛人，一个清华的本科学生，做程序员可以拿到一个月12000元的工资，一个北大的计算机系研究生，一毕业就到外企，一个月一万多收入，每年发16个月工资！干了两年就开了自己的公司。我看到了一个北方交大的本科生作品，在半年的业余时间里，用delphi写了十几万行代码，他甚至在代码中嵌入汇编，自行编写数据存取引擎读写foxpro，速度超快！软件中有一个计算公式解析模块，他用编译原理理论居然做了一个小型的公式解析器，就象c++编译器检查c++程序一样，不仅可以判断是否公式正确，而且给出的出错信息还相当准确！其基本功之扎实，水平之高让我望尘莫及！中国优秀的人才真还是不少的！在精英集聚的北京，面对着博大精深的软件科学，我深感自身的渺小。<BR>但我毕竟是靠自己奋斗出来的，我并不自卑，这世界需要牛人，同样需要大批合格的劳动者，我成为不了牛人，但我作一名程序员是合格的。<BR>时间过得飞快，一年半根本就不算时间，马上就要毕业了，学习的成绩如何，要到社会上去竞争了，让社会考场来决定你是否及格。</P>
<P>3．毕业求职</P>
<P>98级的研究生是it业最后辉煌的回光反照。当时，各大公司都发了疯似的要人，象华为，当时是来者不拒。计算机专业的研究生是一抢而光，本科生也供不应求。2001年毕业的我的师兄师姐们，平均每个人手头都至少有两三个offer，谈的工资没有低于每月6000的，许多人去了外企，工资在8000~10000每月的也有。真是毕业生的黄金时间。<BR>但好景不常在，911事件我看来好象成了分水岭，911之后，整个it业急刹车，就业形势急转直下，各大公司都在消化去年吃得过饱的胃口，我形容是大家都吃坏了胃，再也不可能有我师兄师姐们的风光了。虽然时间相隔仅大半年。<BR>从10月开始，11月和12月，我几乎是在招聘会与公共汽车上渡过的，北京东南西北地去面试，上午在上地，下午可能就要跑到朝阳区，疲于奔命。<BR>在找工作过程中，我良好的心理素质与丰富的编程经验起到了很大的作用，并没有遇到很大的困难，就先后有几家公司表示要我。<BR>其中我想说的有两家公司。<BR>一家是台湾公司，应该说他们做得是不错的，但我非常反感他们那种自认为高于大陆人的那种优越感，而且待遇也不高。面试之后，回来感觉很不好。当时台湾是民进党上台主政，我就称之为“民进党”看不起“”（虽然我不是党员，但我们都是中国人，都希望中国能强大，让她的人民能挺直腰杆）。<BR>我想：我们大陆确实是不如台湾发达，难怪别人看不起我们，这世界势利得很，社会如此，国家亦然。但我中华960万平方公里的国土，13亿人口，难道要依靠一个小小的岛屿来撑门面？难道除了台湾公司，我就无处可去了？虽然改变不了什么，但我决定绝不去台资和日资的公司工作（日本人我更不喜欢，但我认为他们做事实在优秀，我们一定要向日本人学习）！在这种公司呆着，不爽！同时，我们的确也得争气些，这世界只尊重强者。<BR>另一家是个很不错的民族软件企业，想要我，其老总专门找我去面谈了一次，希望我能到他的公司工作。这位老总白手起家，能在五六年的时间内由几个人发展到300多人，当时，是中国这个领域软件市场占有率最高的公司，我非常佩服，他为人也很好，并表示可以给我每月比其他研究生多加1000元工资，而且希望锻炼一两年之后我能够带领一个团队来开发产品，并负担我毕业所需交纳的各种费用。在就业不景气的2002年，对我一个30岁的技术水平有限的老程序员如此看重，真叫我感动。虽然我最后还是没去，但我仍然对这个公司充满了好感。一个软件企业最重要的是什么？是对人的尊重，没有这点，可以断定，这个公司长不大。<BR>我为什么没去软件公司？放弃有可能在几年之后年薪突破10万的收入？是因为我已有了更想做的事，我想当老师！<BR>我自己是从自学的路上走过来的，其中的艰辛历历在目，无人指点，我走了多少弯路？中国还有多少是象我这样的年轻人无人指点的？我幸运能爬出来了，因为我至少还能有饭吃，比我条件更差的，比如农村的孩子，可能就被生活的压力所淹没了。我个人的力量很微弱，技术也有限，但我自认为至少是一名合格的程序员，如果能培养出一大批达到我的水平的学生，他们毕业后成为合格的程序员，中国软件的根基就会更扎实，如果更能有一批远远超过我水平的学生出来，中国软件就有希望了。软件是什么？软件以人为本！<BR>人生追求什么？金钱？我很缺钱，但不可能把金钱作为我的目标，我希望我能够成为一个对社会有所贡献的人，能够获得心灵的充实，于是，我选择了留校。<BR>对教育的反思与教书生涯</P>
<P>4．对教育的反思与教书生涯<BR>2002年下半年，我参加了北京高校青年教师岗前培训。一位杜教授的两堂课让我印象深刻，其中两句话让我深深震动：<BR>第一句话：我是一个教书匠，教书匠好啊，好就好在“匠心独运”！<BR>第二句话：做什么工作都要达到变魔术的境界！<BR>是的，作为一名教师，就必须起到一个传声筒与放大器的作用，将人类最聪明的人探索世界所得到的知识予以拓宽发展，以便让更多的人能够掌握这些知识并进而应用于实践，从而推动人类的不断进步。<BR>作为一名计算机专业的教师，就要努力把先进的计算机技术以尽可能高的效率传授给广大的学生，引导他们直接面对真实的软件世界，而不是向他们硬灌各种各样的理论知识，强迫他们去死记硬背以应付考试。<BR>我是一个小人物，才低学浅，但我真的认为高校计算机教育存在严重的问题。我在打工期间的开发经历，以及阅读国外相关资料的时候，发现学校中教的和社会上用的差得太远！都已经是什么时代了，许多大学还设立foxpro课程，难道就不能直接用现代主流的数据库如oracle，sql server，哪怕是access也好，来讲授数据库知识？还有所谓的计算机等级考试，呵呵，过了三级学生的我见过不少，但他们真正对软件，对计算机又理解多少？<BR>在中国甚至于升职称也要考计算机，我看了一本职称计算机考试教材，里面几乎原样照搬计算机原理课程中的相关章节，弄得我给搞艺术的大嫂讲了一个小时的二进制与八进制、十六进制的转换方法，她还是弄不太清。我都泄气了，对啊，他们搞艺术的，有必要去分清二进制的10与十进制的2有何分别吗？他们八辈子也用不上。但是考试用得上，呵呵，又是中国特色。<BR>拿c++来说，我讲过c++课，许多的国内教材对c++语法下了大功夫，却对体现了c++精华的stl只字不提，对代码背后所体现的软件开发思想与方法更是视而不见，我用c++也编过不少程序了，说句实话，我用到的特性不到c++的三分之一！于是就出现了这种怪现象，许多学生考试可以拿八九十分，给他一个简单的实际问题他却不知如何下手！<BR>还有uml，现在好象很火的样子，我们读研时就开了这门课，讲句实话，当时这门课我就没听懂，可后来我尝试着用c++用面向对象的方法来编程序，然后，由代码倒推回uml类图，一下子就明白了，原来uml只不过是一种描述面向对象系统的符号罢了，如果学生没进行过真正的oop，那就是为了学uml而学uml，根本就本末倒置。<BR>还有软件工程，我的感觉，一个人如果没写过一万行以上的程序，他看软件工程书就同看政治书差不多，每句都对，呵呵，就不知道为什么对。我完成了那个几万行的vb程序之后，再回过头看看理论，真是句句是真理！每个理论背后都是大量实践经验的总结。<BR>回想我做软件的体会，我发现所有的知识都是一个完整的体系，根本就无法区分哪些知识是本科的，哪些知识是研究生课程。于是，一种想法产生了，我主讲程序语言类的课程，那我就直接以真实的软件开发过程为主线，实践中需要什么我就讲什么。讲c++/，我就抛开了指定的教材，c++我讲了stl，我讲了ooad，两者我都讲了用rose进行双向工程，引导学生去学uml，一开始就用uml去描述自己开发的程序，何必浪费大量的时间去学结构化的编程方法？<BR>我现在简直成了面向对象技术的布道者，我下学期即将开设ooad基础选修课，从实际项目中抽取典型的案例，讲uml，讲rose，讲设计模式，讲软件体系结构，例子代码横跨c++/和.net下的开发语言（c#和vb.net），这对于我一个技术水平有限公司的董事长而言，实在有点不自量力，我鼻子上才插上几根葱，就想装大象？但我想，如果我能成功地激发出哪怕1%的学生的兴趣，能引导他们走向我认为是正确的方向，能启发他们思考，能直接面向真实的软件开发活动而不是学校的考试，就是我的成绩。我现在正在看引进的原版书籍---《设计模式解析》，时时击节赞叹！《设计模式》经典但难懂难用，而《解析》一书的两位作者既有丰富的从业经验，又对ooad进行了深入的思索，真知灼见时时展露于书中，我现在刚看了这本书的80%，基本上可以用一个成语来描述这部书：深入浅出！<BR>要做到深入浅出谈何容易！只有同时具备技术专家与文学作家素质的人才能做到！<BR>反观我们国内的大量教材，还有大量的垃圾论文（包括硕士，博士的，本科的就算了，我看绝大部分根本不能称之为论文），全都是“浅入深出”，作者自己都未必明白，就东拼西凑，摆出个样子吓人。本来完全可以用大白话三言两语讲清楚让人明白的道理，有人专门要绕一大圈，专挑用高深的数学公式来表达，唯恐别人容易理解，显得他水平不高！呵呵，什么东西一沾上“数学”，立马身价百倍。我就听过一个北师大的一个在读博士说过：如果一篇博士论文中没有一个数学公式，根本就不算是博士论文。这句话对不对，大家可以多思索。我数学不好，没资格讨论数学，我的直觉：数学是工具，但如果为了发表论文等目的而故弄玄虚，为数学而数学，是不合道理的。中国的学术水平与现状，大家都心知肚明，不用我废话了。<BR>现在每年都毕业大批的计算机专业学生，可其中真正具备扎实根基的可以很快胜任工作的我看只有5%（95%的学生不要扁我，不同意就当我在说胡话，我很瘦的，一扁就没了&amp;#61514;）。多年以来，我国高校计算机教育是按照计算机科学研究者来培养的，可事实上，有多少学生能从事计算机方面研究的能力？我看应分流，80%的学生按工程师方向来培养，20%的学生按研究者方向来培养，而且应大幅减少必修课的数量，计算机领域太深太广，样样都想教给学生，反而成了夹生饭，一个想从事硬件设计的学生和一个想从事软件开发的学生，能给他们一样的饭吃吗？学校应提供各种条件和资源去引导学生，激发学生的创造性与主动探索性，让他们去尝试，去发现自己的长处，最终找到最适合自己的发展方向。不这样做，中国软件后继乏人，没希望。</P>
<P>实践第一<BR>5．实践第一<BR>2002年下半年，我和一个朋友去了北京郊区的一家杂志社，看到的情形让我震惊：在信息产业最发达的北京，这家杂志社还用人工查对杂志订单和款单，看着那按省来登记的几大本厚厚的客户登记本，工作人员需要手工来在其中查找相应的信息。这样的工作效率，这样的行业信息化水平！北京如此，全国又如何？<BR>从这件事上，我看到了中国软件业的另一方面。一方面我们没有核心技术，另一方面，已有的技术又根本没推广没用好。追踪世界先进水平，对于我等这种水平的人来说，确实勉为其难，但将已有的技术用于解决实际问题，却是我们可以做的。如果中国各行各业都真正能通过进行信息化而提高生产效益，那中国不就从根本上强大起来了吗（象印度，it一枝独秀，其他行业没有起色，我称之为跛足的国家，绝不能成为世界强国）？在扎实的社会基础之上，软件业不就有了更大的市场与发展潜力？中国许多行业的信息化水平非常低，而且中国地域广大，发展非常不平衡，有些地方信息化水平甚至为0！努力推动行业信息化，是我们这一代软件开发者的责任！而追赶国外先进水平，恐怕就不是一代两代程序员可以达到目标的，需要长期的努力。作为一名软件开发者，只能脚踏实地，哪怕你只做一个小小的mis产品，也要尽力把它做好来。<BR>于是，我开始了期刊发行系统的开发，这完全是自发的，没有任何资金投入，只有一种热情在支撑。我开始选择c++ builder开发，做了几个月，完成了第一个版本，但我发现，我找不到足够水平的c++程序员进行合作开发，而且整个一个exe文件，在体系结构设计上虽采用了分层分块的设计方案，但却是源代码级别的，要拆分成com组件难度太大，不是一个人能完成的，于是中途流产。<BR>2003年3月，我开始系统地学习.net，我吃惊地发现，我原来想在c++中实现的许多功能，比如对象串行化为xml，在.net中已有现成的类可用，.net更把oo的功用发挥到了极致，它的混合语言开发，它的反射机制，它的新的自识别的软件组件，以及强大好用的开发环境vs.net，都让我惊叹微软对开发者遇到的困难的深入把握，相比用c++开发，至少可以提高1/3的开发效率。于是一个新的想法产生了，我要把以前的产品用.net重写，利用.net强大的组件模型，将设计模式理论推广应用到组件级别，通过xml和反射机制建立一套可动态装配的软件生产流水线，实现象dell直销pc那样的软件动态装配直销。只要建立好灵活可不断重构的系统架构，配以对业务领域的深入分析，逐步建立功能强大的业务组件仓库，就可以实现软件系统的动态装配。说干就干，我用vb,net重写了原先用c++编写的系统，将原先的一个exe变为十几个dll，而且这些dll还会随着发展而不断地分裂，也有可能重新组合，利用refractoring（重构）不断进化，最终形成一整套完备的行业软件组件库。做软件关键因素是变化，只有适应变化的系统才是有生命力的。<BR>我用两个月的时间大体上弄清了.net平台下的主要类库，然后又用两个月的时间再次重新实现了期刊发行系统的c++版本的全部功能，到8月份我写这篇文章之时，第一个产品里程碑已经完成。同样的，除了需求是由另一个合作者去搜集的之外，几乎又是全部由我一个人包揽了所有的系统设计及编码工作！ <BR>毫无疑问，我自觉得新系统要比老系统可维护性强得多，真正实现了彻底的全组件化系统开发，计划再有一个月的界面美化，改正bug，引用多线程提高运行效率，优化系统结构，就可以提供给用户试用了。市场如何，难说难测。<BR>在开发过程中，我再次感到巨大的挑战，不光是技术上的，更是管理上的。人才是我最头痛的问题，没有一流的人才，哪来一流的产品？我们找不到足够水平的程序员一起合作（牛人哪屑于做这样一个小儿科的产品？）我们要走的路还很长。也许我们开发的产品是失败的，但我从来就没指望能用这赚钱，我只是尽一个软件开发者的责任而己，成败已不重要！人生不尝试，怎能体现人活着的价值？ <BR></P><br>文章来源:<a href='http://www.netbo.com.cn/showlog.jspe?log_id=77'>http://www.netbo.com.cn/showlog.jspe?log_id=77</a><img src ="http://www.blogjava.net/redcabin/aggbug/39974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/redcabin/" target="_blank">寂寞河</a> 2006-04-08 12:01 <a href="#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>