<?xml version="1.0" encoding="utf-8"?><rss version="2.0">
<channel>
<title><![CDATA[扬帆起航]]></title>
<link>http://blog.pfan.cn/wfxsky</link>
<description>编程爱好者博客</description>
<language>zh-cn</language>
			<item>
		<title><![CDATA[带通配符的字符串匹配分析]]></title>
		<link>http://blog.pfan.cn/wfxsky/50437.html</link>
		<description><![CDATA[在字符串匹配问题中，我们期待察看串T中是否含有串P。其中串T被称为目标串，串S被称为模式串。
2 朴素匹配算法
进行字符串匹配，最简单的一个想法是：
  public &nbsp; class &nbsp;SimpleMatch&nbsp;  {&nbsp;&nbsp; public &nbsp; int &nbsp;StringMatch(String&nbsp;target,String&nbsp;patten)&nbsp;  {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int &nbsp;tl&nbsp; = &nbsp;target.length();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int &nbsp;pl&nbsp; = &nbsp;patten.length();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int &nbsp;i&nbsp; = &nbsp; 0 ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int &nbsp;j&nbsp; = &nbsp; 0 ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (i&nbsp; &lt; &nbsp;tl&nbsp; - &nbsp;pl&nbsp; &amp;&amp; &nbsp;j&nbsp; &lt; &nbsp;pl)&nbsp;  {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (patten.charAt(j)&nbsp; == &nbsp;target.charAt(i + j))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j ++ ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else &nbsp;  {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs]]></description>
		<author><![CDATA[火箭超人]]></author>
		<pubDate>2009-12-22 17:08:00</pubDate>
		</item>
				<item>
		<title><![CDATA[由auto_ptr想到的]]></title>
		<link>http://blog.pfan.cn/wfxsky/48366.html</link>
		<description><![CDATA[由一份auto_ptr源代码所引发的思考　　 Kyle　　 CPPCN 版权所有　　如果我问你，auto_ptr最关键的地方，或者说它与一般指针最不一样的地方在哪里，你一定会说它是一个对象，它与自己所占有的资源密切相关，当自己消亡的时候，它也会将自己所拥有的资源一同释放。很好，它之所以会拥有这一特性，全都要归于析构函数的功劳，在析构函数中，它会进行善后处理，这样也就很好的避免了资源泄漏。当然，引入auto_ptr的原因还不至于这么简单，因为许多资源泄漏的问题主要是由于我们的粗心大意所致，所以只要我们细心一些，还是会避免一些不该发生的资源泄漏问题。那究竟是什么原因让我们引入auto_ptr呢？对了，你一定也想到了，就是在异常处理的时候。Ok,来看下面这个例子：　　void foo()　　{　　ClassA *ptr=new ClassA;　　try　　{　　/* 此处放置可能抛出异常的操作 */　　}　　catch(…)　　{　　 delete ptr;　　 throw;　　}　　delete ptr;　　}　　上面这个例子使用了一般的指针，你会发现它防止发生资源泄漏的处理是多么复杂，必须在每个catch中进行资源的释放，而且有可能会有许多的catch。天哪，这简直就是灾难，它会使我们的代码很长，不易维护，如果忘记其中的一个，就会产生莫名其妙的错误。既然一般的指针防止资源泄漏会如此的繁琐，那有没有一个办法可以使我们不必操心资源的释放呢，由于在异常发生的时候，会进行堆栈解退，所以我们不必担心作为局部变量的指针本身不被销毁，既然这样，我们干脆建立一个指针对象，好比下面这样：　　template&lt;class T&gt;　　class auto_ptr1　　{　　private:　　T* ap;　　public:　　 ……..　　~auto_ptr(); //资源释放　　}　　当指针被销毁的时候，必然会执行析构函数，那就在析构函数中进行资源的释放不就ok了，呵呵，怎么样，是不是很简单呢？的确，整个逻辑的确很简单，但是如果我们在深入思考一下这个指针对象的特性的话，我们会发现有一个困难的问题等待我们去解决。那下面就让我们来看看会遇到什么困难。　　 由于在auto_ptr销毁的时候它会自动通过析构函数释放所拥有的资源，那么也就决定了auto_ptr对于资源的独占性，即一个资源]]></description>
		<author><![CDATA[火箭超人]]></author>
		<pubDate>2009-09-28 19:59:00</pubDate>
		</item>
				<item>
		<title><![CDATA[qt+vs2003安装]]></title>
		<link>http://blog.pfan.cn/wfxsky/40733.html</link>
		<description><![CDATA[本来一直用开源版的，配合mingw也不错，该死的xp崩溃了，重装mingw觉得比较麻烦，正好手上的vs2003光盘一直没用过，就装了个vs2003，既然vs是d版，干脆使用d版的qt好了.我哭，兴致冲冲的打开传说中qt.tttxp.ru显示Site was closed according to request of Trolltech ASA company.好后悔当初没down下来~~不过这世界上还有google，在一个国外网站上找到了种子。我需要qt-win-commercial-src-4.3.1.zip，qt-vsintegration-1.3.1.exe，还有一个license.txt文件.下载完后，进入vc的控制台环境,编译源代码才能用,照着附带的readme做就是了。安装qt-vsintegration，他是VC的插件，装上后就能创建QT的VC项目，比用一般的编辑器来写QT程序要方便许多。还要记得把把 license.txt 存成 .qt-license ：命令行下copy license.txt .qt-licenseok，最后虚伪的说一句，支持Qt，商业应用请购买正版，现在qt归诺基亚了，不知道前途如何!这里还是把步骤及下来：
1.我的电脑上右键-&gt;属性-&gt;高级-&gt;环境变量在环境变量path中添加;D:\qt\bin (;是用来和其它环境变量分开的)新建环境变量:QMAKESPEC值win32-msvc.net
2.解压qt-win-commercial-src-4.3.1.zip到d:\qt
3.检查d盘空间ntfs下占用空间为949 MB (995,687,822 字节) , 带文件压缩的情况下fat32下大小为1.96 GB (2,108,853,199 字节) , 实际占用空间会更多另外考虑到盘上需要留一定的空间出来,
4.把d:\qt下的.LICENSE文件复制到系统盘的用户目录下如C:\Documents and Settings\Administrator
5.开始-&gt;所有程序-&gt;Microsoft Visual Studio 2003-&gt;Visual Studio .NET 2003 Command Prompt 命令提示输入下面命令d:cd qtconfigure (可以只选择一部分]]></description>
		<author><![CDATA[火箭超人]]></author>
		<pubDate>2009-02-05 23:45:00</pubDate>
		</item>
				<item>
		<title><![CDATA[ant详解]]></title>
		<link>http://blog.pfan.cn/wfxsky/39333.html</link>
		<description><![CDATA[Ant基本使用指南 
1 Ant是什么？
Apache Ant 是一个基于 Java的生成工具。
生成工具在软件开发中用来将源代码和其他输入文件转换为可执行文件的形式（也有可能转换为可安装的产品映像形式）。随着应用程序的生成过程变得更加复杂，确保在每次生成期间都使用精确相同的生成步骤，同时实现尽可能多的自动化，以便及时产生一致的生成版本
2下载、安装Ant 
安装Ant
下载.zip文件，解压缩到c:\ant1.3(后面引用为%ANT_HOME%)
&nbsp;
2.1在你运行Ant之前需要做一些配置工作。
·将bin目录加入PATH环境变量。
·设定ANT_HOME环境变量，指向你安装Ant的目录。在一些OS上，Ant的脚本可以猜测ANT_HOME（Unix和Windos NT/2000）－但最好不要依赖这一特性。
·可选地，设定JAVA_HOME环境变量（参考下面的高级小节），该变量应该指向你安装JDK的目录。
注意：不要将Ant的ant.jar文件放到JDK/JRE的lib/ext目录下。Ant是个应用程序，而lib/ext目录是为JDK扩展使用的（如JCE，JSSE扩展）。而且通过扩展装入的类会有安全方面的限制。
2.2运行Ant 
运行Ant非常简单，当你正确地安装Ant后，只要输入ant就可以了。
&nbsp;
没有指定任何参数时，Ant会在当前目录下查询build.xml文件。如果找到了就用该文件作为buildfile。如果你用 -find 选项。Ant就会在上级目录中寻找buildfile，直至到达文件系统的根。要想让Ant使用其他的buildfile，可以用参数 -buildfile file，这里file指定了你想使用的buildfile。
&nbsp;
可以指定执行一个或多个target。当省略target时，Ant使用标签&lt;project&gt;的default属性所指定的target。
&nbsp;
&nbsp;
命令行选项总结：
ant [options] [target [target2 [target3] ...]]
Options:
-help print this message
-projecthelp print project help information
-ve]]></description>
		<author><![CDATA[火箭超人]]></author>
		<pubDate>2008-11-10 14:42:00</pubDate>
		</item>
				<item>
		<title><![CDATA[jndi学习]]></title>
		<link>http://blog.pfan.cn/wfxsky/39331.html</link>
		<description><![CDATA[JNDI是 Java 命名与目录接口（Java Naming and Directory Interface），在J2EE规范中是重要的规范之一，不少专家认为，没有透彻理解JNDI的意义和作用，就没有真正掌握J2EE特别是EJB的知识。 那么，JNDI到底起什么作用？ 要了解JNDI的作用，我们可以从“如果不用JNDI我们怎样做？用了JNDI后我们又将怎样做？”这个问题来探讨。 没有JNDI的做法： 程序员开发时，知道要开发访问MySQL数据库的应用，于是将一个对 MySQL JDBC 驱动程序类的引用进行了编码，并通过使用适当的 JDBC URL 连接到数据库。 就像以下代码这样： 

Java code 
Connection conn=null;
try {
  Class.forName("com.mysql.jdbc.Driver",
                true, Thread.currentThread().getContextClassLoader());
  conn=DriverManager.getConnection("jdbc:mysql://MyDBServer?user=qingfeng&amp;password=mingyue");
  
  ......
  conn.close();
} 
catch(Exception e) {
  e.printStackTrace();
} 
finally {
  if(conn!=null) {
    try {
      conn.close();
    } catch(SQLException e) {}
  }
}
这是传统的做法，也是以前非Java程序员（如Delphi、VB等）常见的做法。这种做法一般在小规模的开发过程中不会产生问题，只要程序员熟悉Java语言、了解JDBC技术和MySQL，可以很快开发出相应的应用程序。 没有JNDI的做法存在的问题： 1、数据库服务器名称MyDBServer 、用户名和口令都可能需要改变，由此引发JDBC URL需要修改； 2、数据库可能改用别的产品，如改用DB2或者Oracle，引发JDBC驱动程序包和类名需要修改； 3、随着实际使用终端的增加，原配置的连接池参数可能需要调整；]]></description>
		<author><![CDATA[火箭超人]]></author>
		<pubDate>2008-11-10 11:52:00</pubDate>
		</item>
				<item>
		<title><![CDATA[ant入门]]></title>
		<link>http://blog.pfan.cn/wfxsky/39315.html</link>
		<description><![CDATA[1. Ant是一种基于Java的Build工具.基本特性：（1）基于Java的实现。具有良好的跨平台性，同时可以通过增加新的Java类来扩展Ant的功能，而无需去了解不同平台上不同的脚本语言。 （2）基于XML的配置文件。Ant以XML树来描述Target/Task的关系，文件结构清晰、易读易写，并且利用XML对格式的控制来避免由于配置文件的错误造成的Build操作失败。2. 建立工程的目录常用目录：（1）bin 公共的二进制文件，以及运行脚本 （2）build 临时创建的文件，如类文件等 （3）dist 目标输出文件，如生成Jar文件等。 （4）doc/javadocs 文档。 （5）lib 需要导出的Java包 （6）src 源文件 （7）web web应用3. 编写Build文件Build.xml 由三层标记表示，一层包一层。第一层project,描述整个项目，也就是ant要做的事情整个过程概括。第二层target，目标，对象，你可以理解成一个任务单元，或者任务集，因为它就是把一些任务包括到一起。第三层task,也就是任务了，ant定义了很多任务标记，这个可以在ant的doc里面找到下面以Tomcat 5.0环境下的一个简单应用为例看一下ant 的使用建立目录结构：helloapp|- src|- web|---|- WEB-INF|---|---|- classes|---|---|- liblib 下放这个应用的所有需要的jar文件src 下就是我们的原代码了classes 是代码编译后存放的位置web 就是我们常用的webapp的目录结构我们要做的是：（1）把所需的jar文件考到lib下，在web下编写jsp,html页面，在src下编写java源文件和properties文件，把web.xml,struts-config.xml,tld文件放入WEB-INF（2）编译src下的java源文件，放入classes（3）把src下的所有资源文件拷到classes, 把web应用打包成war文件（4）发布应用，把war文件拷到tomcat的webapps下具体来看一下怎么做（1）就不用说了，看（2）：&lt;!-- ================ build.xml ================== --&gt;&lt;project name="he]]></description>
		<author><![CDATA[火箭超人]]></author>
		<pubDate>2008-11-08 21:34:00</pubDate>
		</item>
				<item>
		<title><![CDATA[教你短信和女生说的24句话]]></title>
		<link>http://blog.pfan.cn/wfxsky/38548.html</link>
		<description><![CDATA[1.听人家说，男人找老婆要爬三座大山，看在你我这么有缘的份上，可不可以，让俺少爬两座呀，让俺早点追到你，等待你的回答，如果同意请回复：我同意，如果不同意，请回复：我就是同意。不回复，俺就默认你无条件同意了。 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.男：问你一个问题好吗？你睡觉的时候喜欢睡那一边。 &nbsp; &nbsp; &nbsp; 女：右边，怎么了。 &nbsp; &nbsp; &nbsp; 男：那我从今天开始就睡左边，把右边给你留着。 &nbsp; &nbsp; &nbsp; 女：你…… &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.听说你手机没有短信功能，所以发这条短信试验。如你收到，证实有短信功能并是我的短信，请给我回复：我有了，是你的！ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.喜欢，就是淡淡的爱。爱，就是深深的喜欢。我希望以后可以不用送你回家，而是我们一起回我们的家。 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5.第一眼见到你，我就对自已说：你就是我今生的奋斗目标，我要追求你，拥抱你。我要宣布：我爱你……人民币。 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 6.没有你的曰子，生活变得难受，我恨那个可恶的第三者将你抢走，你和他是否有了新感情？好想你回到我身边——钱包。 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 7.害羞的我有一句话一直都不敢向你表白，但是今天我终于鼓起勇气：你什么时候请我吃饭？ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 8.一个机缘认识你，两次见面留意你，三番四次约会你，七上八下挂念你，九成应是喜欢你，十分肯定我爱你。百年修到遇真爱，千年成全你和我，万事具备愿意吗。 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 9.你这个小妖精，令我中了你的爱情毒却不肯给我解药！小坏蛋！哦！我快要不行了！救救我吧！办法很简单：给我你的爱！ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp]]></description>
		<author><![CDATA[火箭超人]]></author>
		<pubDate>2008-09-29 12:33:00</pubDate>
		</item>
				<item>
		<title><![CDATA[递归实现八皇后]]></title>
		<link>http://blog.pfan.cn/wfxsky/38546.html</link>
		<description><![CDATA[&nbsp;


1.引子
&nbsp;&nbsp; 中国有一句古话，叫做“不撞南墙不回头"，生动的说明了一个人的固执，有点贬义，但是在软件编程中，这种思路确是一种解决问题最简单的算法，它通过一种类似于蛮干的思路，一步一步地往前走，每走一步都更靠近目标结果一些，直到遇到障碍物，我们才考虑往回走。然后再继续尝试向前。通过这样的波浪式前进方法，最终达到目的地。当然整个过程需要很多往返，这样的前进方式，效率比较低下。
2.适用范围
&nbsp;&nbsp; 适用于那些不存在简明的数学模型以阐明问题的本质，或者存在数学模型，但是难于实现的问题。
3.应用场景
&nbsp;&nbsp; 在8*8国际象棋棋盘上，要求在每一行放置一个皇后，且能做到在竖方向，斜方向都没有冲突。国际象棋的棋盘如下图所示：
 
4.分析
&nbsp; 基本思路如上面分析一致，我们采用逐步试探的方式，先从一个方向往前走，能进则进，不能进则退，尝试另外的路径。首先我们来分析一下国际象棋的规则，这些规则能够限制我们的前进，也就是我们前进途中的障碍物。一个皇后q(x,y)能被满足以下条件的皇后q(row,col)吃掉
1）x=row(在纵向不能有两个皇后)
2)&nbsp; y=col（横向）
3）col + row = y+x;（斜向正方向）
4)&nbsp; col - row = y-x;（斜向反方向）
遇到上述问题之一的时候，说明我们已经遇到了障碍，不能继续向前了。我们需要退回来，尝试其他路径。
我们将棋盘看作是一个8*8的数组，这样可以使用一种蛮干的思路去解决这个问题，这样我们就是在8*8=64个格子中取出8个的组合，C(64,80) = 4426165368,显然这个数非常大，在蛮干的基础上我们可以增加回溯，从第0列开始，我们逐列进行，从第0行到第7行找到一个不受任何已经现有皇后攻击的位置，而第五列，我们会发现找不到皇后的安全位置了，前面四列的摆放如下:
 
第五列的时候，摆放任何行都会上图所示已经存在的皇后的攻击，这时候我们认为我们撞了南墙了，是回头的时候了，我们后退一列，将原来摆放在第四列的皇后（3，4）拿走，从（3，4）这个位置开始，我们再第四列中寻找下一个安全位置为（7，4），再继续到第五列，发现第五列仍然没有安全位置，回溯到第四列，此时第四列也是一个]]></description>
		<author><![CDATA[火箭超人]]></author>
		<pubDate>2008-09-28 20:12:00</pubDate>
		</item>
				<item>
		<title><![CDATA[找工作]]></title>
		<link>http://blog.pfan.cn/wfxsky/38516.html</link>
		<description><![CDATA[刚找完工作，趁着余热，转贴一个写的不错的经验，攒点RP，大家好好借鉴一下。工作刚刚落实，论文也刚完成，终于有时间对自己的求职历程及求职经验进行总结了。应同学要求，最近准备书写系列文章“我的求职历程及经验分享”，请大家关注，谢谢！ （一）：求职历程总结2007 年1月10日，随着在三方协议上郑重签下自己的名字，我的求职历程终于划上了一个圆满的句号。在这三个月漫长而艰辛的过程中，我付出了很多，经历了很多，也收获了很多。这一路走来，要感谢的人太多太多，尤其要感谢每一个在找工作过程中关心、帮助过我的人，我会一生铭记你们的恩情。现在，尘埃落定，到了该回报的时候，我首先要回报的就是我的母校和同学。所以，决定把自己找工作中积累的经验写出来给大家分享，希望能对那些将要找工作或还在找工作的同学有所帮助。 我将会以系列文章的形式在网上发布，包括七部分，分别是：求职历程，前期准备，投递简历，笔试，面试，签约/违约以及总结篇。文章的最后，我会留下自己的MSN，欢迎有问题的同学跟我一起探讨，也希望我的经验能帮助大家。 本篇是对自己的求职历程作一个系统的总结，算是对自己有个交待，也对所有关心我、帮助过我的人有个交待。 本人计算机大硕，北方人，从本科到研究生在天大度过了七年时光。求职前，经过对自己性格特点和兴趣爱好的分析，我给自己确定了以下求职目标： 总体目标：走技术和管理/业务结合路线 求职地点：北京，上海 目标行业：金融，IT行业 目标单位：公务员＞银行/移动＞垄断国企＞优秀外企＞事业单位（日企、韩企不考虑） 目标职位：IT行业技术和管理结合职位，金融行业计算机职位，其他行业计算机相关职位 求职考虑因素：发展机会＞户口＞待遇＞工作环境 在这样的目标定位下，我的求职历程从2006年10月8日开始，到2007年1月10日正式结束，一共持续了3个月的时间。整个过程可以分为三个阶段： 第一阶段：2006年10月份 找工作刚刚开始的阶段，什么都不懂，也没有经验，所以主要是以海投为主，多争取笔试、面试机会，为后面的面试积累经验，期间参加了天大、南大大部分的宣讲会，但真正笔试、面试的机会较少。这段时间面过的单位主要有：审协，上海aspenTech，汉略，斯伦贝榭，东软，宝洁，益达，华为。应该说，这段时间虽然笔过、面过的不多，却为后面积累大量宝贵的经验。 第二阶段：2006年11月份 招聘高峰开始到来，大部]]></description>
		<author><![CDATA[火箭超人]]></author>
		<pubDate>2008-09-26 19:52:00</pubDate>
		</item>
				<item>
		<title><![CDATA[oracle存储过程总结]]></title>
		<link>http://blog.pfan.cn/wfxsky/38491.html</link>
		<description><![CDATA[1、什么是存储过程。存储过程是数据库服务器端的一段程序，它有两种类型。一种类似于SELECT查询，用于检索数据，检索到的数据能够以数据集的形式返回给客户。另一种类似于INSERT或DELETE查询，它不返回数据，只是执行一个动作。有的服务器允许同一个存储过程既可以返回数据又可以执行动作。2、什么时候需要用存储过程　　如果服务器定义了存储过程，应当根据需要决定是否要用存储过程。存储过程通常是一些经常要执行的任务，这些任务往往是针对大量的记录而进行的。在服务器上执行存储过程，可以改善应用程序的性能。这是因为：.服务器往往具有强大的计算能力和速度。.避免把大量的数据下载到客户端，减少网络上的传输量。　　例如，假设一个应用程序需要计算一个数据，这个数据需要涉及到许多记录。如果不使用存储过程的话，把这些数据下载到客户端，导致网络上的流量剧增。　　不仅如此，客户端可能是一台老掉牙的计算机，它的运算速度很慢。而改用存储过程后，服务器会很快地把数据计算出来，并且只需传递一个数据给客户端，其效率之高是非常明显的。3、存储过程的参数　　要执行服务器上的存储过程，往往要传递一些参数。这些参数分为四种类型：　　第一种称为输入参数，由客户程序向存储过程传递值。　　第二种称为输出参数，由存储过程向客户程序返回结果。　　第三种称为输入/输出参数，既可以由客户程序向存储过程传递值，也可以由存储过程向客户程序返回结果。　　第四种称为状态参数，由存储过程向客户程序返回错误信息。　　要说明的是，并不是所有的服务器都支持上述四种类型的参数，例如，InterBase就不支持状态参数。4、oracle 存储过程的基本语法





&nbsp;
&nbsp;&nbsp;1.基本结构
CREATE OR REPLACEPROCEDURE 存储过程名字
(
&nbsp;&nbsp;&nbsp;&nbsp;参数1 IN NUMBER,
&nbsp;&nbsp;&nbsp;&nbsp;参数2 IN NUMBER
) IS
变量1 INTEGER :=0;
变量2 DATE;
BEGIN 
END 存储过程名字
&nbsp;
2.SELECT INTO STATEMENT
&nbsp;&nbsp;将select查]]></description>
		<author><![CDATA[火箭超人]]></author>
		<pubDate>2008-09-25 12:14:00</pubDate>
		</item>
				<item>
		<title><![CDATA[spring注入方式的分类和比较]]></title>
		<link>http://blog.pfan.cn/wfxsky/38226.html</link>
		<description><![CDATA[Type1 接口注入
我们常常借助接口来将调用者与实现者分离。如：




public class ClassA {private InterfaceB clzB;public init() {Ojbect obj =Class.forName(Config.BImplementation).newInstance();clzB = (InterfaceB)obj;}……}
上面的代码中，ClassA依赖于InterfaceB的实现，如何获得InterfaceB实现类的实例？传统的方法是在代码中创建InterfaceB实现类的实例，并将起赋予clzB。
而这样一来，ClassA在编译期即依赖于InterfaceB的实现。为了将调用者与实现者在编译期分离，于是有了上面的代码，我们根据预先在配置文件中设定的实现类的类名，动态加载实现类，并通过InterfaceB强制转型后为ClassA所用。
这就是接口注入的一个最原始的雏形。
而对于一个Type1型IOC容器而言，加载接口实现并创建其实例的工作由容器完成，如J2EE开发中常用的Context.lookup（ServletContext.getXXX），都是Type1型IOC的表现形式。
Apache Avalon是一个典型的Type1型IOC容器。
Type2构造子注入
构造子注入，即通过构造函数完成依赖关系的设定，如：




public class DIByConstructor {private final DataSource dataSource;private final String message;public DIByConstructor(DataSource ds, String msg) {this.dataSource = ds;this.message = msg;}……}
可以看到，在Type2类型的依赖注入机制中，依赖关系是通过类构造函数建立，容器通过调用类的构造方法，将其所需的依赖关系注入其中。
PicoContainer（另一种实现了依赖注入模式的轻量级容器）首先实现了Type2类型的依赖注入模式。
Type3设值注入
在各种类型的依赖注入模式中，设值注入模式在实际开发中得到了最广泛的应用（其中很大一部分得力于Spring框架的影响）。]]></description>
		<author><![CDATA[火箭超人]]></author>
		<pubDate>2008-09-12 11:47:00</pubDate>
		</item>
				<item>
		<title><![CDATA[c#操作xml实例]]></title>
		<link>http://blog.pfan.cn/wfxsky/33640.html</link>
		<description><![CDATA[在C#.net中如何操作XML&nbsp;&nbsp;&nbsp; 需要添加的命名空间：&nbsp;&nbsp;&nbsp; using System.Xml;
&nbsp;&nbsp;&nbsp; 定义几个公共对象：&nbsp;&nbsp;&nbsp; XmlDocument xmldoc ;&nbsp;&nbsp;&nbsp; XmlNode xmlnode ;&nbsp;&nbsp;&nbsp; XmlElement xmlelem ;
&nbsp;&nbsp;&nbsp; 1，创建到服务器同名目录下的xml文件：
&nbsp;&nbsp;&nbsp; 方法一：&nbsp;&nbsp;&nbsp; xmldoc = new XmlDocument ( ) ;&nbsp;&nbsp;&nbsp; //加入XML的声明段落&nbsp;&nbsp;&nbsp; xmlnode = xmldoc.CreateNode ( XmlNodeType.XmlDeclaration , "" , "" ) ;&nbsp;&nbsp;&nbsp; xmldoc.AppendChild ( xmlnode ) ;&nbsp;&nbsp;&nbsp; //加入一个根元素&nbsp;&nbsp;&nbsp; xmlelem = xmldoc.CreateElement ( "" , "Employees" , "" ) ;&nbsp;&nbsp;&nbsp; xmldoc.AppendChild ( xmlelem ) ;&nbsp;&nbsp;&nbsp; //加入另外一个元素&nbsp;&nbsp;&nbsp; for(int i=1;i&lt;3;i )&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp; XmlNode root=xmldoc.SelectSingleNode("Employees");//查找&lt;Employees&gt;&nbsp;&nbsp;&nbsp; XmlElement xe1=xmldoc.CreateElement("Node");//创建一个&lt;Node&gt;节点&nbsp;&nbsp;&nbsp; xe1.SetAttribute("genre","李赞红");//设置该节点genre属性&nbs]]></description>
		<author><![CDATA[火箭超人]]></author>
		<pubDate>2008-03-29 10:56:00</pubDate>
		</item>
				<item>
		<title><![CDATA[c#基础25问]]></title>
		<link>http://blog.pfan.cn/wfxsky/33483.html</link>
		<description><![CDATA[1.静态变量和非静态变量的区别？ 
2.const 和 static readonly 区别？ 
3.extern 是什么意思？
&nbsp;4.abstract 是什么意思？ 
5.internal 修饰符起什么作用？ 
6.sealed 修饰符是干什么的？ 
7.override 和 overload 的区别？
&nbsp;8.什么是索引指示器？ 
9.new 修饰符是起什么作用？ 
10.this 关键字的含义？
&nbsp;11.可以使用抽象函数重写基类中的虚函数吗？ 
12.密封类可以有虚函数吗？ 
13.如果基类中的虚属性只有一个属性访问器，那么继承类重写该属性后可以有几个属性访问器？如果基类中有 get 和 set 两个呢？ 
14.abstract 可以和 virtual 一起使用吗？可以和 override 一起使用吗？
&nbsp;15.接口可以包含哪些成员？ 
16.类和结构的区别？ 
17.接口的多继承会带来哪些问题？
&nbsp;18.抽象类和接口的区别？
&nbsp;19.别名指示符是什么？ 
20.如何释放非托管资源？
&nbsp;21.P/Invoke是什么？
&nbsp;22.StringBuilder 和 String 的区别？
&nbsp;23.explicit 和 implicit 的含义？ 
24.params 有什么用？
&nbsp;25.什么是反射？ 
以下是我做的一份参考答案（C# 语言范畴之内），如果有不准确、不全面的，欢迎各位朋友指正！ 
1.静态变量和非静态变量的区别？
&nbsp;答： 静态变量： 静态变量使用 static 修饰符进行声明 在所属类被装载时创建 通过类进行访问 所属类的所有实例的同一静态变量都是同一个值 非静态变量： 不带有 static 修饰符声明的变量称做非静态变量 在类被实例化时创建 通过对象进行访问 同一个类的不同实例的同一非静态变量可以是不同的值 
示例： using System；using System.Collections.Generic；using System.Text；
&nbsp;namespace Example01 { 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]]></description>
		<author><![CDATA[火箭超人]]></author>
		<pubDate>2008-03-21 17:33:00</pubDate>
		</item>
				<item>
		<title><![CDATA[c#四个技巧]]></title>
		<link>http://blog.pfan.cn/wfxsky/33438.html</link>
		<description><![CDATA[1．如果可能尽量使用接口来编程 　　 
.NET框架包括类和接口，在编写程序的时候，你可能知道正在用.NET的哪个类。然而，在这种情况下如果你用.NET支持的接口而不是它的类来编程时，代码会变得更加稳定、可用性会更高。请分析下面的代码：　　这个函数从一个可为任何对象的数组中加载ListBox，这段代码被限定为只能使用数组。假想过些时候你发现那些对象存在数据库中，或别的集合中。那么你需要修改程序来使用不同的集合类型。如果你用ICollection接口来写那段程序，你就不用修改那段程序了，对于任何实现ICollection 接口的类型它都能很好的工作: 　　ICollection被数组和所有System.Collection中的集合实现。此外，多维数组也支持ICollection接口。如果那还不够的话，数据库.NET类同样支持ICollection接口。用接口写的这个函数不用需改就可以才许多中情况下使用。　　
&nbsp;2. 使用属性代替原始数据 　　
因为属性已经成为语言本身的元素，所以声明数据元素时它的作用域等级没有必要大于private。因为代码本身会把属性看成数据元素，你并没有失去使用简单数据类型的便利性 。相反它会使你的代码更加灵活功能更加强大。属性使你的数据元素封装性更好。属性可以让你使用lazy evaluation来返回数据。lazy evaluation的意思是当用户请求时才计算它的值，而不是一直保留着它。　　最后，属性可以是virtual也可以是abstract。你也可以在接口中定义属性。　　这里还有维护方面的因素应当注意：尽管操作两者的方法是一样的，但是你把一个数据元素变成属性，那么原先客户端的程序便不能访问服务端的新版本程序了。实际上对于在Web service中你想实现序列化的值你可以把它们变成属性来使用： private int TheMonth = 0; [XmlAttribute ("Month")] public int Month { 　get { 　　return TheMonth; 　} 　set { 　　TheMonth = value; 　} } 　　简单通过属性就可以使你的所有数据元素私有化。 　　
&nbsp;3. 在Producer/Consumer 的Idiom中使用Delegate 　
　 当你生成一个实]]></description>
		<author><![CDATA[火箭超人]]></author>
		<pubDate>2008-03-19 08:53:00</pubDate>
		</item>
				<item>
		<title><![CDATA[手机短信发送windows服务]]></title>
		<link>http://blog.pfan.cn/wfxsky/33437.html</link>
		<description><![CDATA[最近在电脑城上买了一根NOKIA3210的数据线，玩了几天改LOGO、改铃声后也将数据线扔在一边。直到前几天在Http: //oxygensoftware.com上看到有发手机短信息的二次开发控件，才想起多日不用的数据线，而且最近在学C#，觉得用C#做个发短信息的程序也不错，经过多天的测试，终于实现用电脑+数据线+手机的模式，实现在单位的局域网平台上发送短信息了。

    由于单位使用到发手机短信息的地方有很多，可能是从网页、可能是OUTLOOK中的窗体、也可能是某台非Windows操作系统的主机的某个系统，所以经过思考探讨，觉得最好的解决方案是采用Windows的“服务”，定时从一个目录中固定格式的文本文件中读取出相应的信息，发送出去。而其它客户端只需往该目录写入文本信息即可。思路定下来后就让我们开始吧！

    先交待一下开发平台：Windows 2000 Advance Server操作系统、Visual Studio .Net 、Oxygen Sms ActiveX Control V2.3 (Share Ware)、 Nokia 3210手机通过数据线接在COM1上。运行Visual Studio .Net，新建一个C#的项目，选择“Windows Server”类型的项目，命名为“SmsServer”。在Server1的设计画面，将“ServerName”命名为“SmsServer”。点击 “视图设计器按钮”切换到设计画面，在“Windows Forms”工具箱中拖一时钟控件，命名为“SmsTimer”，在“Components”工具箱中拖一“EventLog”控件。命名为 “eventLog1”。在“项目”菜单中点击“添加引用”，选择“COM”页，浏览到安装Oxygen Sms ActiveX Control V2.3程序的目录，找到SMSControl.ocx添加到“选定的组件”中。

    将Server1.cs代码替换为

   

 using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProces]]></description>
		<author><![CDATA[火箭超人]]></author>
		<pubDate>2008-03-19 08:48:00</pubDate>
		</item>
				<item>
		<title><![CDATA[关机小程序]]></title>
		<link>http://blog.pfan.cn/wfxsky/33436.html</link>
		<description><![CDATA[非常幸运很容易就找到了Microsoft.Win32命名空间下面的SystemEvents类，他有一个静态的事件 SessionEnding在系统注销或者关机时发生，此事件只有在winform的程序下有效，而在控制台程序下面无效，不能激发事件;还有一点我们必须在程序推出时将加上的事件移除掉，否则就容易造成内存溢出。

  关键代码如下：

  
 using System;
　　using System.Collections.Generic;
　　using System.Windows.Forms;
　　using Microsoft.Win32;
　　namespace Shutdown
　　{
　　static class Program
　　{
　　/**////
　　/// 应用程序的主入口点。
　　///
　　[STAThread]
　　static void Main()
　　{
　　Application.EnableVisualStyles();
　　Application.SetCompatibleTextRenderingDefault(false);
　　FormShutdown formShutdown = new FormShutdown();
　　SystemEvents.SessionEnding += new SessionEndingEventHandler(formShutdown.SystemEvents_SessionEnding);
　　Application.Run(formShutdown);
　　}
　　}
　　}Form 的代码：
　　using System;
　　using System.Collections.Generic;
　　using System.ComponentModel;
　　using System.Data;
　　using System.Drawing;
　　using System.Text;
　　using System.Windows.Forms;
　　using Microsoft.Win32;
　　namespace Shutdown
　　{
　　public partial class FormSh]]></description>
		<author><![CDATA[火箭超人]]></author>
		<pubDate>2008-03-19 07:56:00</pubDate>
		</item>
				<item>
		<title><![CDATA[浅谈c++中的this指针]]></title>
		<link>http://blog.pfan.cn/wfxsky/32830.html</link>
		<description><![CDATA[有下面的一个简单的类：class CNullPointCall{public:static void Test1(); void Test2(); void Test3(int iTest); void Test4(); private:static int m_iStatic; int m_iTest; }; int CNullPointCall::m_iStatic = 0; void CNullPointCall::Test1(){cout &lt;&lt; m_iStatic &lt;&lt; endl; }void CNullPointCall::Test2(){cout &lt;&lt; "Very Cool!" &lt;&lt; endl; }void CNullPointCall::Test3(int iTest){cout &lt;&lt; iTest &lt;&lt; endl; }void CNullPointCall::Test4(){cout &lt;&lt; m_iTest &lt;&lt; endl; }那么下面的代码都正确吗？都会输出什么？CNullPointCall *pNull = NULL; // 没错，就是给指针赋值为空pNull-&gt;Test1(); // call 1pNull-&gt;Test2(); // call 2pNull-&gt;Test3(13); // call 3pNull-&gt;Test4(); // call 4你肯定会很奇怪我为什么这么问。一个值为NULL的指针怎么可以用来调用类的成员函数呢？！可是实事却很让人吃惊：除了call 4那行代码以外，其余3个类成员函数的调用都是成功的，都能正确的输出结果，而且包含这3行代码的程序能非常好的运行。经过细心的比较就可以发现，call 4那行代码跟其他3行代码的本质区别：类CNullPointCall的成员函数中用到了this指针。对于类成员函数而言，并不是一个对象对应一个单独的成员函数体，而是此类的所有对象共用这个成员函数体。 当程序被编译之后，此成员函数地址即已确定。而成员函数之所以能把属于此类的各个对象的数据区别开, 就是靠这个this指针。函数体内所有对类数据成员的访问， 都会被转化为this-&gt;数据成员的方式。而一个对象的this指针并不]]></description>
		<author><![CDATA[火箭超人]]></author>
		<pubDate>2008-02-21 13:00:00</pubDate>
		</item>
				<item>
		<title><![CDATA[当前党内十种十分消极的现象]]></title>
		<link>http://blog.pfan.cn/wfxsky/32806.html</link>
		<description><![CDATA[一是对腐败熟视无睹，甚至趋之若鹜。老百姓对腐败很痛恨，而有些党员干部对腐败漠然视之。有的在言谈中，只恨自已没有滋生腐败的土壤。哪一件腐败案是领导干部自己主动举报的？没有。这些腐败案都是同案牵涉出来的。有些腐败，非常嚣张，如，跑项目，领导亲自安排请客送礼，把腐败合法化。这样下去怎么了得？
&nbsp;
二是买官卖官猖獗，官场上下肮脏一气。现在的买官卖官现象也不是个别，凡提拔都需要走动，这也成为潜规则。领导与被领导关系，成为金钱关系，官场之风败坏，对有志有才之士抑制严重，多少仁人志士怀才不遇。

三是民主成为花瓶，领导专制严重。加快党内民主，大家是非常盼望的。可是，在一些地方，党内民主只是个人说了算，监督成为“水货”。有制度规定，他们可以实行可以不实行，有利于他自己的就民主，没有利的，就换个民主方式也要专断。操作的所谓民主，干自己想干的沟当。党内有很多问题，纪检部门不是不知道，只是要服从上级，不能自己处置，而下级是上级同意干的事，因此监督形同虚设。
&nbsp;
四是改革流于形式，垄断成为谋敢私利的工具。如大型国有企业的股份化改制、国家垄断的基本经济资源的市场化配置，结果都搞到私人手中。近年逃往国外的大贪，八成是国企老总或要职。国有企业或国有参股企业，是社会主义公有制的主体，国民经济命脉，如果搞不好，是会出大问题的。工人老大哥是不会甘心把自己的心血拱手让给腐败分子的。
&nbsp;
五是法治环境恶化，恶性案件经常发生；公察法三家职责不清，许多案子本来很容易办结，但三家经常推卸，使之对违法犯罪打击不力，以至无法有效打击恶性案件。
&nbsp;
六是被动服务，庸碌工作。一部分公务员养尊处优，消极怠工。政府被动服务方面，表现对教育、安全、基本社会保障等公共服务不到位。待问题出来后再议再管，没有人主动把人民福址之事作为具体任务来落实。现在，公务员成为铁饭碗，党员在其中是大部分，不能发挥党员公务员的作用。比如，有的公务员不是党员，领导偏偏喜欢这样的人干事，党员想干事还没份。做事的做事，忙的忙，苦乐不均。优秀的得不到奖励，庸碌的反而悠闲着没事，这样的作风，真是太普遍了。
&nbsp;
七是分配不公、贫富差距拉大。各种腐败扩散，激起社会矛盾呈现日益加剧的趋势。收入差距大，源于分配不公，分配不公，源于收入制度上的问题。最近，党中央也采取措施，力图缩小贫富悬殊问题]]></description>
		<author><![CDATA[火箭超人]]></author>
		<pubDate>2008-02-20 17:55:00</pubDate>
		</item>
				<item>
		<title><![CDATA[经典幽默笑话]]></title>
		<link>http://blog.pfan.cn/wfxsky/32804.html</link>
		<description><![CDATA[&nbsp;
甲：嫦娥为啥要急着奔月？乙：后羿一射九日，就算神仙他也受不了啊
&nbsp;
一对青年男女在公园约会时，女孩特别想放屁，她想了个办法：　　女：你听过布谷鸟叫吗？　　男：没听过。　　女：我给你学，布（放屁声）－谷（口中发出的声音）。　　学了几声后，该放的也已放完。　　女：听清了吗？　　男：放屁声太大，没听清
高速公路上严重塞车已经有一段时间，一名驾驶人耐心在车上等候。这时候，一个人敲了他车窗。驾驶人摇下玻璃，问对方＂什么事＂。对方说：＂陈水扁遭恐怖份子绑架，绑架者威胁立刻交一亿元赎金，否则会用汽油和一根火柴烧死他。……所以，你了解吧，我们希望大家同心协力，尽己所能一起来捐献。＂驾驶人问：＂好吧……，其他人大概捐多少？＂＂嗯……不一定，从一公升到二十公升都有。＂
电脑一定是女生！！因为： 　　1.大部分的男生一定会对她一往情深，当然，总有人例外。 　　2.大部分的女生对她怀有敌意。 　　3.你跟她在一起的时间越久，你就会越离不开她。 　　4.你跟她在一起的时间越久，你花的钱就越多。 　　5.她永远走在流行的尖端。 　　6.她的记性出奇的好，但往往忘记最重要的那一件事。 　　7.她看起来很聪明，实际上却很迷糊，凡事都得替她安排妥当、解释清楚。否则，她肯定会回答\"Bad Command or Filename\"。 　　8.她偶尔会使使小性子、耍耍小姐脾气，但多半在你最需要她时“当机”，而且来不及“存档”。 中文幽默王
&nbsp;]]></description>
		<author><![CDATA[火箭超人]]></author>
		<pubDate>2008-02-20 17:34:00</pubDate>
		</item>
				<item>
		<title><![CDATA[面试题心得]]></title>
		<link>http://blog.pfan.cn/wfxsky/32297.html</link>
		<description><![CDATA[面试题： 如何将a。b的值进行交换，并且不使用任何中间变量？
用异或的方法比较好，不会发生溢出，如果采用
a= a+b;
b= a-b;
a= a-b;
这样做的缺点是如果a，b很大 可能溢出，而采用：
a= a^b;
b= a^b;
a=a^b；
面试题2：
在c++程序中调用被c编译器编译的的函数，为什么要加extern“c”？
因为c++支持函数重载，c语言不支持函数重载，函数被c++编译后在库中的名字与c语言的不同，假设某个函数的原型是：void foo（int x，int y）。该函数被c编译器编译后在库中的名字为_foo,而c++的为_foo_int_int之类的名字。
c++提供了c连接交换指定符号extern“c” 解决名字匹配的问题。
&nbsp;]]></description>
		<author><![CDATA[火箭超人]]></author>
		<pubDate>2008-01-19 23:11:00</pubDate>
		</item>
		</channel>
</rss>