<?xml version="1.0" encoding="gb2312"?>

<!-- RSS generated by oioj.net on 4/16/2004 ; 感谢LeXRus提供 RSS 2.0 文档; 此文件可自由使用，但请保留此行信息 --> 
<!-- Source download URL: http://blogger.org.cn/blog/rss2.asp       -->
<rss version="2.0">

<channel>
<title>〾堯仸〾的天空</title>
<link>http://blogger.org.cn/blog/blog.asp?name=yach</link>
<description>〾堯仸〾的博客</description>
<copyright>blogger.org.cn</copyright>
<generator>W3CHINA Blog</generator>
<webMaster>webmaster@blogger.org.cn</webMaster>
<item>
<title><![CDATA[Google App Engine   ssl 错误]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yach&amp;id=49341</link>
<author>yach</author>
<pubDate>2010/7/11 11:24:37</pubDate>
<description><![CDATA[<P>Google App Engine 1.35 提示 ssl 错误</P>
<P>偷懒的方法 ：</P>
<P>1.降到&nbsp; 1.33</P>
<P>2.升级 python 到 2.6&nbsp;</P>]]></description>
</item><item>
<title><![CDATA[冰封王座war3 1.24b补丁|魔兽1.24补丁]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yach&amp;id=48459</link>
<author>yach</author>
<pubDate>2010/3/21 13:30:36</pubDate>
<description><![CDATA[
<P>----------------------------------------------------------------------<BR>- 1.24 修改内容<BR>----------------------------------------------------------------------<BR>地图编辑器更改</P>
<P>- 增加了新的JASS哈希（Hash）表函数，用以替换在修正不安全类型的强制转换中所失去的功能。<BR>- 哈希表 - 保存物品句柄<BR>- 哈希表 - 保存单位句柄<BR>- ...<BR>- 哈希表 - 读取物品句柄<BR>- 哈希表 - 读取单位句柄<BR>- ...<BR>- 哈希表 - 获取句柄ID</P>
<P></P>
<P>修正</P>
<P>- 修正了一处关于不安全类型的强制转换的漏洞，该漏洞可以允许用户在地图中执行任意代码。<BR>- 修正了JASS不安全类型的强制转换的漏洞("return bug")。<BR>- 修正了“地图编辑器”若干种程序崩溃的错误。</P>
<P>&nbsp;</P>
<P>补丁包下载：</P>
<P>暴雪官方下载页面：<A href="http://us.blizzard.com/support/article.xml?locale=en_US&amp;articleId=21224"><FONT color=#00ff00>http://us.blizzard.com/support/article.xml?locale=en_US&amp;articleId=21224</FONT></A></P>
<P><A href="http://down.52zy.com:8084/Large_Game/1.24BCNnomap.rar">http://down.52zy.com:8084/Large_Game/1.24BCNnomap.rar</A></P>]]></description>
</item><item>
<title><![CDATA[电信的天翼live还是不错的]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yach&amp;id=48169</link>
<author>yach</author>
<pubDate>2010/2/11 12:20:32</pubDate>
<description><![CDATA[
<TABLE style="WIDTH: 100%; TABLE-LAYOUT: fixed">
<TBODY>
<TR>
<TD>
<DIV id=blog_text class=cnt>
<P></P>
<P><SPAN><A href="http://hd.elive.vnet.cn/Activity/2009-11/index.aspx?uid=eDIwMDl4eHhAMTg5LmNu" target=_blank><FONT color=#ff0000 size=4>下载</FONT></A></SPAN></P>
<P><A href="http://hd.elive.vnet.cn/Activity/2009-11/index.aspx?uid=eDIwMDl4eHhAMTg5LmNu">http://hd.elive.vnet.cn/Activity/2009-11/index.aspx?uid=eDIwMDl4eHhAMTg5LmNu</A></P>
<P><A href="http://blogger.org.cn/blog/uploadfile/2010211121546359.PNG" target=_blank><IMG style="BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-LEFT-COLOR: #000000" border=0 src="http://c.xml.org.cn/blog/uploadfile/2010211121443485.PNG"></A></P>
<P><IMG style="BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-LEFT-COLOR: #000000" border=0 src="http://c.xml.org.cn/blog/uploadfile/2010211121511497.PNG"></P>
<P><A href="http://hd.elive.vnet.cn/Activity/2009-11/index.aspx?uid=eDIwMDl4eHhAMTg5LmNu"><SPAN></SPAN></A></P>
<P></P>
<P><A href="http://hd.elive.vnet.cn/Activity/2009-11/index.aspx?uid=eDIwMDl4eHhAMTg5LmNu"><SPAN></SPAN></A></P>
<P><STRONG>tv 不错高清版，就是电影有点老。</STRONG></P>
<P><SPAN><IMG style="BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-LEFT-COLOR: #000000" border=0 src="http://c.xml.org.cn/blog/uploadfile/2010211121521885.PNG"><BR></SPAN></P>
<P><STRONG>免费发短信</STRONG></P>
<P>现在只要登录天翼<SPAN class=fen>Live</SPAN>，即可<SPAN>免费发送300条短信（可与中国电信、中国移动、中国联通手机用户互发短信）</SPAN></P>
<P></P>
<P><SPAN><SPAN><IMG style="BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-LEFT-COLOR: #000000" border=0 src="http://c.xml.org.cn/blog/uploadfile/2010211121530643.PNG"><BR></SPAN></SPAN></P>
<P><SPAN>win7下 要兼容模式才能安装，电信应该好好的测试下程序</SPAN></P>
<P></P>
<P><SPAN><SPAN></SPAN></SPAN></P>
<P><SPAN><SPAN><IMG style="BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-LEFT-COLOR: #000000" border=0 src="http://c.xml.org.cn/blog/uploadfile/2010211121539235.PNG"><BR><SPAN><SPAN>那个什么安全专家不用可以，卸载掉</SPAN></SPAN></SPAN></SPAN></P>
<P></P>
<P><SPAN><SPAN><SPAN><SPAN><SPAN><A><IMG style="BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-LEFT-COLOR: #000000" border=0 src="http://c.xml.org.cn/blog/uploadfile/2010211121546359.PNG"></A><BR></SPAN></SPAN></SPAN></SPAN></SPAN></P>
<P><SPAN><SPAN><SPAN><SPAN>别的程序不喜欢用，可以把PlugIns 文件夹干掉</SPAN></SPAN></SPAN></SPAN></P>
<P></P>
<P><SPAN><A href="http://hd.elive.vnet.cn/Activity/2009-11/index.aspx?uid=eDIwMDl4eHhAMTg5LmNu" target=_blank><FONT color=#ff0000 size=4>下载</FONT></A></SPAN></P>
<P><A href="http://hd.elive.vnet.cn/Activity/2009-11/index.aspx?uid=eDIwMDl4eHhAMTg5LmNu">http://hd.elive.vnet.cn/Activity/2009-11/index.aspx?uid=eDIwMDl4eHhAMTg5LmNu</A></P></DIV></TD></TR></TBODY></TABLE>]]></description>
</item><item>
<title><![CDATA[试了下 Google App Engine for Java!]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yach&amp;id=44721</link>
<author>yach</author>
<pubDate>2009/4/11 20:43:16</pubDate>
<description><![CDATA[
<P><SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 13px -webkit-monospace; WHITE-SPACE: pre-wrap; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0" class=Apple-style-span>Thanks for signing up to try Google App Engine for Java! Your account has now been activated, so you can begin building applications with our new Java runtime. Please note that this is still an early look at our support for the Java language and you may encounter issues during development. We look forward to hearing your feedback! To learn more, please visit:</SPAN></P>
<P><SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 13px -webkit-monospace; WHITE-SPACE: pre-wrap; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0" class=Apple-style-span>&nbsp;把账户激活了 。 用 eclipse 3.3 ，3.4那个插件太慢了。：（</SPAN></P>
<P><SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 13px -webkit-monospace; WHITE-SPACE: pre-wrap; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0" class=Apple-style-span><IMG border=0 src="http://blogger.org.cn/blog/images/file/pic.gif"><A href="http://blogger.org.cn/blog/uploadfile/2009411204259494.PNG" target=_blank>gae-java.png</A></SPAN></P>
<P><SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 13px -webkit-monospace; WHITE-SPACE: pre-wrap; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0" class=Apple-style-span><IMG style="BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-LEFT-COLOR: #000000" border=0 src="http://c.xml.org.cn/blog/uploadfile/2009411204259494.PNG"></SPAN></P>]]></description>
</item><item>
<title><![CDATA[BufferToText]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yach&amp;id=44395</link>
<author>yach</author>
<pubDate>2009/4/3 15:15:37</pubDate>
<description><![CDATA[btw : 冒个泡 。在看&nbsp; thinking in java 3 <br><br><br>package thinkinjava.c12;<br><br>import java.io.FileInputStream;<br>import java.io.FileNotFoundException;<br>import java.io.FileOutputStream;<br>import java.io.IOException;<br>import java.nio.ByteBuffer;<br>import java.nio.channels.FileChannel;<br>import java.nio.charset.Charset;<br><br>public class BufferToText {<br>&nbsp;&nbsp;&nbsp; private static final int BSIZE = 1024;<br>&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws IOException {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; FileChannel fc = <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; new FileOutputStream("data2.txt").getChannel();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fc.write(ByteBuffer.wrap("Some text".getBytes() ));<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fc.close();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fc = new FileInputStream("data2.txt").getChannel();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ByteBuffer buff = ByteBuffer.allocate(BSIZE);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fc.read(buff);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; buff.flip();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println(buff.asCharBuffer() );<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //Decode using this system's default Charset<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; buff.rewind();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String encoding = System.getProperty("file.encoding");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("Decoded using " + encoding + Charset.forName(encoding).decode(buff));<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //Or ,we could encode with someing that will print<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fc = new FileOutputStream("data2.txt").getChannel();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fc.write(ByteBuffer.wrap("some text".getBytes("UTF-16BE")));<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fc.close();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fc = new FileInputStream("data2.txt").getChannel();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; buff.clear();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fc.read(buff);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; buff.flip();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println(buff.asCharBuffer() );<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>/*&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 卯浥?數<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Decoded using GBKSome text<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; some text*/<br><br>&nbsp;&nbsp;&nbsp; }<br>}]]></description>
</item><item>
<title><![CDATA[解析即将到来的魔兽争霸1.22[转]]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yach&amp;id=33077</link>
<author>yach</author>
<pubDate>2008/3/28 12:34:19</pubDate>
<description><![CDATA[<p><a href="http://image.cache.yo2blog.com/wp-content/uploads/63/6341/2008/03/919694-20070702093405312.jpg"><img src="http://image.cache.yo2blog.com/wp-content/uploads/63/6341/2008/03/919694-20070702093405312-thumb.jpg" alt="919694_20070702093405312" style="border: 0px none ;" align="left" border="0" height="244" width="164"></a>美国暴雪总部市场研发部首席代表豪简·约翰逊先生 近日在其官方博客透露：</p>
<blockquote>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 鉴于现在海量的关于<span class="yo2keyword yo2keyword_tag"><a href="http://www.shevablog.cn/articles/tag/%E6%B8%B8%E6%88%8F" title="Tag 了 2 篇文章">游戏</a></span>不平衡的投诉，以及我邮箱中如山的“哭诉”邮件使我不得不相信 和近两年国际各大赛事的综合战报评价。关于魔兽TFT1.21版本中特定种族在特定地图中出现的“过于强大” 通过在和其他同事的会议商量后，我特别督促新版本开发部门听取我的意见：&nbsp;<br>
1、地图：加强TS、EI分矿处的怪物，修正NE可以无限回程的BUG。&nbsp;<br>
2、HUM：坦克改为4人口，经验值增加25点；飞行器散射研究费用改为200金、175木；&nbsp;<br>
每次升级石工术不增加塔的血量，但原始血量改为600；加强火球渐射效果为45%。&nbsp;<br>
3、NE：保存权杖费用增加至200金，CD为45秒；毒球效果不可以叠加；毒球与树妖毒刺叠加效果减半，增加树妖经验值20%；齐美拉改为7人口。&nbsp;<br>
3、ORC：加大一级幽灵狼的原始血量为300、二级为450、三级为600；加速效果不可以被驱散；&nbsp;<br>
药膏恢复时间缩短为25秒；狼骑原始护甲增加一点（改为两点）。&nbsp;<br>
4、UD：加大DK3点敏捷度，全面降低法师耗魔系数。&nbsp;</p>
</blockquote>
<p><span id="more-624098"></span></p>
<p>暴雪对魔兽争霸进入了冷淡期，1.20-1.21维持了相当长的一段时间。可能是由于这个版本确实不错，但是时至今日，无论玩家与选手们都怨声载道。为什么imbalance会从无到有，就是因为广大玩家与选手不断对新战术的研究发现，这也是一款游戏生命力所在。</p>
<p>&nbsp;&nbsp;
关于1.22的种种消息已经谣传了很久。上面这则消息比较靠谱，具有可靠性。总体上精神是打压NE与HUM，着力增强相对羸弱的ORC与UD。HUM方面
主要针对了万恶的defeat流；而NE是全方面被减弱；兽族玩家应该会对这样的变动欢呼雀跃，加了血的幽灵狼会使先知重返舞台，让药膏恢复时间简短意味
着回血能量相对平弱的兽族不用把红血的兵往方面野外拖，连家都不敢藏；UD方面变化不大，但是是此消彼长，面对NE与HUM都可以底气更足。</p>
<p>&nbsp; 期待着1.22版的冰封王座，虽然这些更新对于我都是无关痛痒，因为我是随机玩家。</p>
<p id="tags">标签：<a href="http://www.shevablog.cn/articles/tag/%E6%B8%B8%E6%88%8F" rel="tag">游戏</a>, <a href="http://www.shevablog.cn/articles/tag/%E9%AD%94%E5%85%BD" rel="tag">魔兽</a><br></p><p id="sort_link">快速链接:<a href="http://www.shevablog.cn/go/624098.html">http://www.shevablog.cn/go/624098.html</a></p>]]></description>
</item><item>
<title><![CDATA[女人关爱自己（转）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yach&amp;id=32878</link>
<author>yach</author>
<pubDate>2008/3/25 18:14:10</pubDate>
<description><![CDATA[<div id="t_0" style="color: black; font-size: 14px;">
										<span style="font-size: 18px; line-height: normal;"><font color="Red">   <br>  我们的身体并不是一个取之不尽的能量仓库，一些不经意的不良行为时时威胁着女人的美丽。可以说，在这些不良行为面前，女人再娇嫩的青春、再美丽的容颜都会如花萎谢。现代女人为什么不关爱一下自己的身体呢？ <br>  <br>  　　1、香水造成的美丽伤害 <br>  <br>  　　香水中的檀香油、麝香和柠檬香及酒精等化学成分，在阳光照射下可能分解出有害物质，使皮肤灼痛、出疹甚至发炎。所以在喷香水时尽量避免直接喷在皮肤上太多，喷在衣服上也同样可以香气袭人。　    <br>  <br>  　　2、乌烟瘴气的晨练 <br>  <br>  　　如果你每天在交通拥堵的马路上晨跑，还不如在室内多睡一会儿。研究证明，长期吸入汽车废气，会使肺活量降低20％，还可能导致哮喘、肺气肿。<br>  <br>  　　3、不稳定的体重 <br>  <br>  　　体内水分的变化使体重在一天中有1～3公斤的增减幅度。所以每天固定在早晨刚起床后尚未进食时测出的体重是比较准确的。 <br>  <br>  　　4、旧情难舍运动鞋 <br>  <br>  　　胫骨痛和跟腱劳损只是老运动鞋可能造成的损伤之一，一双跑步鞋的服役极限是500公里，而体操鞋6个月就该退休了，因为它们已经失去了原先的保护能力。<br>   <br>  5、健身房里的马大哈 <br>  <br>  　　最好准备专门的健身软底鞋或厚棉袜，因为潮湿的健身房地毯很容易隐藏和滋生细菌，如足癣和足底疣。公共更衣室和泳池的拖鞋，虽然都已消毒，但还是穿自己的最保险。<br>  <br>  　　6、锻炼模式一成不变 <br>  <br>  　　如果多年不改变锻炼模式，很容易造成经常锻炼的那部分肌肉劳损，而没有运动到的肌肉一直被忽视也很可能使身体不成比例的发展。<br>  <br>  　　7、呼吸太浅 <br>  <br>  　　人们平时的呼吸总是太浅。这样血管里所含的氧气水平就低于二氧化碳水平，人因此就会感到疲惫。所以应该每天多做几次深呼吸。<br>  <br>  　　8、长期用冷水刷牙 <br>  <br>  　　资料表明：人的牙齿最适应35～36.5摄氏度的温度，如果经常用冷水刺激牙齿将导致牙龈出血、牙髓痉挛或其它牙病的发生。牙齿的寿命平均比人的寿命短10年以上，根源就在“凉水刷牙”的习惯上。 <br>  <br>     　9、经年不变的避孕方式 <br>  <br>  　　避孕方法应随着身体状况的改变而改变。即使你比较习惯目前的避孕方法，也要在体检时向医生询问是否仍适合你现在的状况。<br>  <br>  　　10、超负荷的卫生棉条 <br>  <br>  　　长时间不更换棉条容易导致阴道炎症以及其它妇科疾病。卫生棉条的最长负荷时间是8小时，所以睡前务必更换新棉条。　<br>  <br>  　　11、做爱后不及时“排空” <br>  <br>  　　做爱之后最好养成排尿的习惯，这样可以降低感染泌尿系统疾病的机率。而且，带着饱满的膀胱入睡也不利于美容，第二天早晨睡醒后很可能成了个肿眼泡。<br>  <br>  　　12、不了解自己的家族病史 <br>  <br>  　　因为遗传的存在，了解家庭成员的病史能帮助你提前关注相关脏器的健康。而很多恶性疾病如果及早发现，治愈机会还是很大的。<br>  <br>      　13、忽视常规妇科检查 <br>  <br>  　　最新医学报道发现：近5年，及早发现的宫颈癌死亡率降低了70％。妇科癌症初期症状很容易被忽视，所以定期妇科分泌物检查很重要。医生建议所有18岁以上的女性，特别是已有性经验的女性，每年至少要进行一次妇科常规检查。 <br>  <br>  　　14、对“高蛋白减肥法”的误解 <br>  <br>  　　一种比较流行的减肥观念认为：蛋白质和碳水化合物混合后会在体内滞留较长时间。如果只摄取一种，就会减少在体内<br>  <br>  　　滞留和被吸收的时间，从而达到减肥的效果。但是，碳水化合物是身体能量的主要来源，如果缺乏会导致疲劳和脱水，提供丰富维生素和纤维的蔬菜和水果也不可或缺。无论用什么方法减肥，都必须保证每天摄入的谷物、蔬菜和水果占到总摄入量的55％以上。<br>  <br>  　　15、身体总处于缺水状态 <br>  <br>  　　身体轻微缺水会导致疲劳，因为缺水时血流量减低，而这时心脏不得不增加跳动的次数和力度以确保有充足的供血量。所以，不要等到口渴的时候才喝水。<br>  <br>  　　16、“从一而终”的床垫 <br>  <br>  　　每个季度要清理一次床垫，每年至少要有一次把床垫晾晒2小时。床垫脏了，要用肥皂和清水洗涤，不要用汽油或清洁剂。而且每使用半年后要将床垫的前后位置调换一下。 <br>   <br>     　17、忽视早餐 <br>  <br>  　　科学的进食原则应该是：早餐要吃得像个国王，午餐要吃得像个王子，晚餐要吃得像个乞丐。所以早餐不仅要吃，还要吃得丰盛。<br>  <br>  　　18、习惯翘二郎腿 <br>  <br>  　　根据调查发现：长期翘二郎腿容易引起弯腰驼背，造成腰椎与胸椎压力分布不均，长此以往，势必压迫脊椎神经，而且翘二郎腿还会妨碍腿部血液循环，造成腿部静脉曲张。所以，还是赶紧把二郎腿放下来吧！<br>  <br>  　　19、运动过量 <br>  <br>  　　每天抽出5分钟锻炼也比一个月或几个月疯狂运动一次好。想拥有完美的体形 ，关键不在于你一共运动了多少，贵在坚持。<br>  <br>  　　20、牛排味道与加热杀菌 <br>  <br>  　　制作牛肉饼的细牛肉末最容易隐藏沙门氏菌和大肠杆菌，而消灭这些细菌要达到160摄氏度的温度。因此食用这类食品最好加热到安全的温度再放心食用。<br>  <br>  　　21、不知道胆固醇水平 <br>  <br>  　　“高血脂不是老年人的专利”。即使你平时有运动的习惯，也很注意饮食，还是有可能患上高血脂。因为体内的胆固醇只有20％来自饮食，另外遗传也是很重要的原因。 <br>  <br>      　22、直接试用柜台的化妆品 <br>  <br>  　　化妆品柜台的唇膏已被上百人试过，如果在试用时不注意，就很可能染上疾病。无论是口红、眼影、睫毛膏等等，因此还是在手背和手腕上试用比较安全。<br>  <br>  　　23、不了解叶酸 <br>  <br>  　　叶酸是维生素的一种，对胎儿神经管形成至关重要。育龄女性在决定要宝宝之前就应补充适量的叶酸，最好每天补充400毫克，怀孕期间的妇女则要增加到600毫克，哺乳期妇女每天500毫克。蔬菜、豆类、橙汁和坚果中都富含丰富的天然叶酸。<br>  <br>  　　24、不知道如何与医生交谈 <br>  <br>  　　懂得如何与医生交谈能更快让他了解你的病情。比如你经常头痛，除了记下是从何时开始、每次持续多久等症状外，还应尽量记录最近的体温变化、生理周期是否正常等。你提供的信息越多，越有利于医生诊断你的病情。<br>  <br>  　　25、很久不曾开怀大笑 <br>  <br>  　　大笑是减缓压力最自然、最有效的方式。科学家发现人体每天都生成3000多个癌细胞和50亿个能及时消灭癌细胞的“杀伤者细胞”。刚刚大笑完的人体内杀伤者细胞会明显增加，可谓是“笑”益显著。<br>  <br>  　　26、冷漠的办公室气氛 <br>  <br>  　　与其花费时间去贬低对方，不如冷静下来把关系理顺。一个和谐的工作气氛不但让你心里感觉舒服，对工作效率也会有所促进。<br>  <br>  　　27、不给自己“情绪化”的机会 <br>  <br>
　　从心理健康的角度来看，长期积压怒气会影响身心健康，怒气长时间得不到排解就可能变成忧郁情绪。一个懂得如何发脾气、正确发泄自己不满的女性才是一个
心理成熟、健康的女性。喜怒哀乐本是人之常情，没有理由强迫自己控制情绪而忽视甚至是否定自己的感受，关键在于找准渠道。<br>  <br>  <br>  <br>  <br>  <br>  </font></span><br>  <a href="http://yang8260241.photo.hexun.com/36175602_d.html" target="_blank"><img src="http://photo11.hexun.com/p/2008/0324/180878/b_A92C01A3E71DC76AEEA892DFD9B6F3D5.jpg" title="查看更多精彩图片" border="0"></a>
									</div>
									<div>点击数:
										953
										| 回复数：17
										| 时间:3/24/2008 3:40:15 PM</div>]]></description>
</item><item>
<title><![CDATA[hibernate many 2 many 的配置]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yach&amp;id=32425</link>
<author>yach</author>
<pubDate>2008/3/13 15:37:44</pubDate>
<description><![CDATA[<P><BR><BR><BR>//实体 帐单<BR>public class Agrpribill implements java.io.Serializable {<BR><BR>&nbsp;&nbsp;&nbsp; // Fields<BR><BR>&nbsp;&nbsp;&nbsp; private Long agrpribillid;<BR><BR>&nbsp;&nbsp;&nbsp; private Set&lt;Payinvoice&gt; payinvoices = new HashSet&lt;Payinvoice&gt;(0);<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; &nbsp;....<BR>&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; public void addAgrpribill(Agrpribill agrpribill){<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!agrpribills.contains(agrpribill)) {<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; agrpribills.add(agrpribill);<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; agrpribill.addpayinvoice(this);<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; xml 配置文件 <BR>&nbsp;&nbsp;&nbsp; &nbsp; &lt;set name="agrpribills" table="AgrPriBillPayInvoice"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="PAYINVOICEID" /&gt;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/key&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;many-to-many&nbsp; column="agrpribillid" class="com.intohotel.Agrpribill" /&gt;<BR>&nbsp;&nbsp; &lt;/set&gt;<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; //实体 发票 <BR>&nbsp;&nbsp;&nbsp; public class Payinvoice implements java.io.Serializable {<BR><BR>&nbsp;&nbsp;&nbsp; // Fields<BR><BR>&nbsp;&nbsp;&nbsp; private Long payinvoiceid;<BR><BR>&nbsp;&nbsp;&nbsp; private String invoicecode;<BR><BR>&nbsp;&nbsp;&nbsp; private Date recvdate;<BR><BR>&nbsp;&nbsp;&nbsp; private String recvoperator;<BR><BR>&nbsp;&nbsp;&nbsp; private Set agrpribills&nbsp; = new HashSet(0);<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; ....<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public void addpayinvoice(Payinvoice payinvoice){<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.payinvoices.add(payinvoice);<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; xml&nbsp; 文件 <BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;set name="payinvoices"&nbsp; table="AgrPriBillPayInvoice"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;key&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &lt;column name="agrpribillid"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/key&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;many-to-many&nbsp; column="payinvoiceid" class="com.intohotel.Payinvoice" /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/set&gt;<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; //---------------------------------------------------------<BR>&nbsp;&nbsp;&nbsp; @Test<BR>&nbsp;&nbsp;&nbsp; public void testSavePayAndArg(){<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Agrpribill arg = new Agrpribill();<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; arg.setBillno("1111111");<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //agrpribillDAO.save(arg);<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Payinvoice&nbsp; payinvoice&nbsp; = new Payinvoice();<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; payinvoice.setInvoicecode("code1111 ");<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; payinvoice.setRecvdate(new Date());<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; payinvoice.setRecvoperator("销售员111111");<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //payinvoice.addAgrpribill(arg);<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; payinvoice.getAgrpribills().add(arg);<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; payinvoiceDAO.save(payinvoice);<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 报错 <BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 5:04:24,484 DEBUG SQL:346 - select S_PAYINVOICE.nextval from dual<BR>&nbsp; &nbsp;&nbsp;&nbsp; 15:04:24,656 DEBUG SQL:346 - insert into PAYINVOICE (INVOICECODE, RECVDATE, RECVOPERATOR, payinvoiceid) values (?, ?, ?, ?)<BR>&nbsp; &nbsp;&nbsp;&nbsp; 15:04:24,687 DEBUG SQL:346 - insert into AgrPriBillPayInvoice (PAYINVOICEID, agrpribillid) values (?, ?)<BR><BR><BR><BR>&nbsp;&nbsp; //----------------------------------------------------------<BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; @Test<BR>&nbsp;&nbsp;&nbsp; public void testSavePayAndArg(){<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Agrpribill arg = new Agrpribill();<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; arg.setBillno("1111111");<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; agrpribillDAO.save(arg);<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Payinvoice&nbsp; payinvoice&nbsp; = new Payinvoice();<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; payinvoice.setInvoicecode("code1111 ");<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; payinvoice.setRecvdate(new Date());<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; payinvoice.setRecvoperator("销售员111111");<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //payinvoice.addAgrpribill(arg);<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; payinvoice.getAgrpribills().add(arg);<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; payinvoiceDAO.save(payinvoice);<BR><BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; //成功插入<BR>&nbsp;&nbsp;&nbsp; 15:06:01,015 DEBUG SQL:346 - select S_AGRPRIBILL.nextval from dual<BR>&nbsp;&nbsp;&nbsp; 15:06:01,140 DEBUG SQL:346 - select S_PAYINVOICE.nextval from dual<BR>&nbsp;&nbsp;&nbsp; 15:06:01,171 DEBUG SQL:346 - insert into AGRPRIBILL (PAYAFFAIR, OCCURDATE, SUMMONEY, BILLNO, SPCODE, CORPCODE, PAYTYPE, MANAGERCODE, CARDNO, NAME, IDCARDNO, REMARK, BILLTYPE, AUDITSTATE, AUDITOR, COPIER, LOGINCODE, CORPDEPART, UUID, INVOICELAUNCHDATE, INVOICESUMMONEY, JOURNEYFORM, BAOXIANFORM, FORMRECEIPTDATE, INVOICERECEIPTDATE, INVOICERECEIPTOR, STDSUMMONEY, REALOCCURDATE, SALSECODE, SALSEDEPART, agrpribillid) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)<BR>&nbsp;&nbsp;&nbsp; 15:06:01,171 DEBUG SQL:346 - insert into PAYINVOICE (INVOICECODE, RECVDATE, RECVOPERATOR, payinvoiceid) values (?, ?, ?, ?)<BR>&nbsp;&nbsp;&nbsp; 15:06:01,187 DEBUG SQL:346 - insert into AgrPriBillPayInvoice (PAYINVOICEID, agrpribillid) values (?, ?)<BR><BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; //---------------------------------------------------<BR>&nbsp;&nbsp;&nbsp; Payinvoice.hbm.xml ,加入 inverse="true"&nbsp;&nbsp; inverse的默认值为false<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 15:07:28,625 DEBUG SQL:346 - select S_AGRPRIBILL.nextval from dual<BR>&nbsp;&nbsp;&nbsp; 15:07:28,750 DEBUG SQL:346 - select S_PAYINVOICE.nextval from dual<BR>&nbsp;&nbsp;&nbsp; 15:07:28,781 DEBUG SQL:346 - insert into AGRPRIBILL (PAYAFFAIR, OCCURDATE, SUMMONEY, BILLNO, SPCODE, CORPCODE, PAYTYPE, MANAGERCODE, CARDNO, NAME, IDCARDNO, REMARK, BILLTYPE, AUDITSTATE, AUDITOR, COPIER, LOGINCODE, CORPDEPART, UUID, INVOICELAUNCHDATE, INVOICESUMMONEY, JOURNEYFORM, BAOXIANFORM, FORMRECEIPTDATE, INVOICERECEIPTDATE, INVOICERECEIPTOR, STDSUMMONEY, REALOCCURDATE, SALSECODE, SALSEDEPART, agrpribillid) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)<BR>&nbsp;&nbsp;&nbsp; 15:07:28,796 DEBUG SQL:346 - insert into PAYINVOICE (INVOICECODE, RECVDATE, RECVOPERATOR, payinvoiceid) values (?, ?, ?, ?)<BR>&nbsp;&nbsp;&nbsp; //没有插入中间表<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp; //--------------------------------------------<BR>&nbsp; //反过来 ,一样ok<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp; @Test<BR>&nbsp;&nbsp;&nbsp; public void testSaveAgrAndPay() {<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Payinvoice&nbsp; payinvoice&nbsp; = new Payinvoice();<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; payinvoice.setInvoicecode("code1111 ");<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; payinvoice.setRecvdate(new Date());<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; payinvoice.setRecvoperator("销售员111111");<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; payinvoiceDAO.save(payinvoice);<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Agrpribill arg = new Agrpribill();<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; arg.setBillno("1111111");<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; arg.getPayinvoices().add(payinvoice);<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; agrpribillDAO.save(arg);<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; 15:11:36,187 DEBUG SQL:346 - select S_PAYINVOICE.nextval from dual<BR>&nbsp;&nbsp;&nbsp; 15:11:36,328 DEBUG SQL:346 - select S_AGRPRIBILL.nextval from dual<BR>&nbsp;&nbsp;&nbsp; 15:11:36,375 DEBUG SQL:346 - insert into PAYINVOICE (INVOICECODE, RECVDATE, RECVOPERATOR, payinvoiceid) values (?, ?, ?, ?)<BR>&nbsp;&nbsp;&nbsp; 15:11:36,375 DEBUG SQL:346 - insert into AGRPRIBILL (PAYAFFAIR, OCCURDATE, SUMMONEY, BILLNO, SPCODE, CORPCODE, PAYTYPE, MANAGERCODE, CARDNO, NAME, IDCARDNO, REMARK, BILLTYPE, AUDITSTATE, AUDITOR, COPIER, LOGINCODE, CORPDEPART, UUID, INVOICELAUNCHDATE, INVOICESUMMONEY, JOURNEYFORM, BAOXIANFORM, FORMRECEIPTDATE, INVOICERECEIPTDATE, INVOICERECEIPTOR, STDSUMMONEY, REALOCCURDATE, SALSECODE, SALSEDEPART, agrpribillid) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)<BR>&nbsp;&nbsp;&nbsp; 15:11:36,390 DEBUG SQL:346 - insert into AgrPriBillPayInvoice (agrpribillid, payinvoiceid) values (?, ?)<BR><BR><BR><BR>///====================================<BR>// 删除 ,主控制方 <BR>//=====================================<BR>&nbsp;&nbsp;&nbsp; @Test<BR>&nbsp;&nbsp;&nbsp; public void testDelPay(){<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Payinvoice&nbsp; payinvoice&nbsp; = payinvoiceDAO.findById(56L);<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; payinvoiceDAO.delete(payinvoice);<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; 15:18:17,046 DEBUG SQL:346 - select payinvoice0_.payinvoiceid as payinvoi1_0_0_, payinvoice0_.INVOICECODE as INVOICEC2_0_0_, payinvoice0_.RECVDATE as RECVDATE0_0_, payinvoice0_.RECVOPERATOR as RECVOPER4_0_0_ from PAYINVOICE payinvoice0_ where payinvoice0_.payinvoiceid=?<BR>&nbsp;&nbsp;&nbsp; 15:18:17,234 DEBUG SQL:346 - delete from AgrPriBillPayInvoice where PAYINVOICEID=?<BR>&nbsp;&nbsp;&nbsp; 15:18:17,250 DEBUG SQL:346 - delete from PAYINVOICE where payinvoiceid=?<BR>&nbsp;&nbsp; //没有删除 agr<BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp; //------------------------------<BR>&nbsp;&nbsp; // 删除 被空方<BR>&nbsp;&nbsp; //==============================<BR>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; @Test<BR>&nbsp;&nbsp;&nbsp; public void testDelAgr(){<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Agrpribill arg =&nbsp; agrpribillDAO.findById(52L);<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; agrpribillDAO.delete(arg);<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; 15:21:42,625 DEBUG SQL:346 - select agrpribill0_.agrpribillid as agrpribi1_2_0_, agrpribill0_.PAYAFFAIR as PAYAFFAIR2_0_, agrpribill0_.OCCURDATE as OCCURDATE2_0_, agrpribill0_.SUMMONEY as SUMMONEY2_0_, agrpribill0_.BILLNO as BILLNO2_0_, agrpribill0_.SPCODE as SPCODE2_0_, agrpribill0_.CORPCODE as CORPCODE2_0_, agrpribill0_.PAYTYPE as PAYTYPE2_0_, agrpribill0_.MANAGERCODE as MANAGERC9_2_0_, agrpribill0_.CARDNO as CARDNO2_0_, agrpribill0_.NAME as NAME2_0_, agrpribill0_.IDCARDNO as IDCARDNO2_0_, agrpribill0_.REMARK as REMARK2_0_, agrpribill0_.BILLTYPE as BILLTYPE2_0_, agrpribill0_.AUDITSTATE as AUDITSTATE2_0_, agrpribill0_.AUDITOR as AUDITOR2_0_, agrpribill0_.COPIER as COPIER2_0_, agrpribill0_.LOGINCODE as LOGINCODE2_0_, agrpribill0_.CORPDEPART as CORPDEPART2_0_, agrpribill0_.UUID as UUID2_0_, agrpribill0_.INVOICELAUNCHDATE as INVOICE21_2_0_, agrpribill0_.INVOICESUMMONEY as INVOICE22_2_0_, agrpribill0_.JOURNEYFORM as JOURNEY23_2_0_, agrpribill0_.BAOXIANFORM as BAOXIAN24_2_0_, agrpribill0_.FORMRECEIPTDATE as FORMREC25_2_0_, agrpribill0_.INVOICERECEIPTDATE as INVOICE26_2_0_, agrpribill0_.INVOICERECEIPTOR as INVOICE27_2_0_, agrpribill0_.STDSUMMONEY as STDSUMM28_2_0_, agrpribill0_.REALOCCURDATE as REALOCC29_2_0_, agrpribill0_.SALSECODE as SALSECODE2_0_, agrpribill0_.SALSEDEPART as SALSEDE31_2_0_ from AGRPRIBILL agrpribill0_ where agrpribill0_.agrpribillid=?<BR>&nbsp;&nbsp;&nbsp; 15:21:42,812 DEBUG SQL:346 - delete from AGRPRIBILL where agrpribillid=?<BR>&nbsp;&nbsp;&nbsp; &nbsp;//没有删除 中间表 <BR>&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;&nbsp; &nbsp;//====================================<BR>&nbsp;&nbsp;&nbsp; &nbsp;// 主控删除三个表 <BR>&nbsp;&nbsp;&nbsp; &nbsp;//====================================<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; @Test <BR>&nbsp;&nbsp;&nbsp; public void tsetDelall(){<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Payinvoice&nbsp; payinvoice&nbsp; = payinvoiceDAO.findById(53L);<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Set&lt;Agrpribill&gt; agrpribills&nbsp; = payinvoice.getAgrpribills();<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(Agrpribill agr :agrpribills) {<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; agr.getPayinvoices().remove(payinvoice);<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; payinvoiceDAO.delete(payinvoice);<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 15:31:38,765 DEBUG SQL:346 - select payinvoice0_.payinvoiceid as payinvoi1_0_0_, payinvoice0_.INVOICECODE as INVOICEC2_0_0_, payinvoice0_.RECVDATE as RECVDATE0_0_, payinvoice0_.RECVOPERATOR as RECVOPER4_0_0_ from PAYINVOICE payinvoice0_ where payinvoice0_.payinvoiceid=?<BR>&nbsp;&nbsp;&nbsp; 15:31:38,906 DEBUG SQL:346 - select agrpribill0_.PAYINVOICEID as PAYINVOI1_1_, agrpribill0_.agrpribillid as agrpribi2_1_, agrpribill1_.agrpribillid as agrpribi1_2_0_, agrpribill1_.PAYAFFAIR as PAYAFFAIR2_0_, agrpribill1_.OCCURDATE as OCCURDATE2_0_, agrpribill1_.SUMMONEY as SUMMONEY2_0_, agrpribill1_.BILLNO as BILLNO2_0_, agrpribill1_.SPCODE as SPCODE2_0_, agrpribill1_.CORPCODE as CORPCODE2_0_, agrpribill1_.PAYTYPE as PAYTYPE2_0_, agrpribill1_.MANAGERCODE as MANAGERC9_2_0_, agrpribill1_.CARDNO as CARDNO2_0_, agrpribill1_.NAME as NAME2_0_, agrpribill1_.IDCARDNO as IDCARDNO2_0_, agrpribill1_.REMARK as REMARK2_0_, agrpribill1_.BILLTYPE as BILLTYPE2_0_, agrpribill1_.AUDITSTATE as AUDITSTATE2_0_, agrpribill1_.AUDITOR as AUDITOR2_0_, agrpribill1_.COPIER as COPIER2_0_, agrpribill1_.LOGINCODE as LOGINCODE2_0_, agrpribill1_.CORPDEPART as CORPDEPART2_0_, agrpribill1_.UUID as UUID2_0_, agrpribill1_.INVOICELAUNCHDATE as INVOICE21_2_0_, agrpribill1_.INVOICESUMMONEY as INVOICE22_2_0_, agrpribill1_.JOURNEYFORM as JOURNEY23_2_0_, agrpribill1_.BAOXIANFORM as BAOXIAN24_2_0_, agrpribill1_.FORMRECEIPTDATE as FORMREC25_2_0_, agrpribill1_.INVOICERECEIPTDATE as INVOICE26_2_0_, agrpribill1_.INVOICERECEIPTOR as INVOICE27_2_0_, agrpribill1_.STDSUMMONEY as STDSUMM28_2_0_, agrpribill1_.REALOCCURDATE as REALOCC29_2_0_, agrpribill1_.SALSECODE as SALSECODE2_0_, agrpribill1_.SALSEDEPART as SALSEDE31_2_0_ from AgrPriBillPayInvoice agrpribill0_ left outer join AGRPRIBILL agrpribill1_ on agrpribill0_.agrpribillid=agrpribill1_.agrpribillid where agrpribill0_.PAYINVOICEID=?<BR>&nbsp;&nbsp;&nbsp; 15:31:38,953 DEBUG SQL:346 - select payinvoice0_.agrpribillid as agrpribi2_1_, payinvoice0_.payinvoiceid as payinvoi1_1_, payinvoice1_.payinvoiceid as payinvoi1_0_0_, payinvoice1_.INVOICECODE as INVOICEC2_0_0_, payinvoice1_.RECVDATE as RECVDATE0_0_, payinvoice1_.RECVOPERATOR as RECVOPER4_0_0_ from AgrPriBillPayInvoice payinvoice0_ left outer join PAYINVOICE payinvoice1_ on payinvoice0_.payinvoiceid=payinvoice1_.payinvoiceid where payinvoice0_.agrpribillid=?<BR>&nbsp;&nbsp;&nbsp; 15:31:39,015 DEBUG SQL:346 - delete from AgrPriBillPayInvoice where PAYINVOICEID=?<BR>&nbsp;&nbsp;&nbsp; 15:31:39,015 DEBUG SQL:346 - delete from PAYINVOICE where payinvoiceid=?<BR><BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; //--------------------------<BR>&nbsp;&nbsp;&nbsp; // 删除中间表 <BR>&nbsp;&nbsp;&nbsp; //---------------------------<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; @Test <BR>&nbsp;&nbsp;&nbsp; public void testDelArgPay() {<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Payinvoice&nbsp; payinvoice&nbsp; = payinvoiceDAO.findById(58L);<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; payinvoice.setAgrpribills(null);<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; payinvoiceDAO.save(payinvoice);<BR>&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;</P>
<P>//查询<BR><FONT color=#ff3300>String hql&nbsp; ="select agr.agrpribillid from AgrPriBill agr where not exists(select p from agr.payinvoices p) ";</FONT><BR><BR>参考 http://www.javaeye.com/topic/154587 <BR></P>]]></description>
</item><item>
<title><![CDATA[暴雪发布1.21b中文版免CD补丁]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yach&amp;id=32415</link>
<author>yach</author>
<pubDate>2008/3/13 13:13:52</pubDate>
<description><![CDATA[<a>　<font color="#990000"><b>软件发布于U9网(http://war3.uuu9.com)转载请注明出处</b></font><br>
				<!--正 文 开 始-->
				</a><p>&nbsp;</p>
<p><strong>1.21b补丁改动：</strong></p>
<p>- 目前游戏无需CD启动</p>
<p align="left">　　在除夕夜，暴雪新补丁发布，1.21b，本次补丁没有任何修改，只是推出的免CD系统，其实这个在中国早已经被应用，我们依然会放出官方下载，有需要的人下，不影响观看1.21的录像。</p>
<p align="left">　　暴雪论坛负责人发言：</p>
<p>　　2008年2月6号，1.21b(免CD补丁)补丁就可以完工并正式上线，1.21b补丁不会损伤任何的1.21录像文件。这个补丁允许安装了魔兽争霸三-冰封王座的玩家们不需要母盘即可游戏。</p>
<p><a href="http://war3.uuu9.com/Soft/ShowSoftDown.aspx?UrlID=1&amp;SoftID=9213">下载地址1为中文</a>，<a href="http://war3.uuu9.com/Soft/ShowSoftDown.aspx?UrlID=2&amp;SoftID=9213">下载地址2为英文</a></p>
<p>&nbsp;</p>
                <!--正 文 结 束-->
				<br><font color="#990000"><b>软件发布于U9网(http://war3.uuu9.com)转载请注明出处</b></font>]]></description>
</item><item>
<title><![CDATA[华氏转摄氏]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yach&amp;id=32414</link>
<author>yach</author>
<pubDate>2008/3/13 12:57:55</pubDate>
<description><![CDATA[<font color="#808080">01</font>&nbsp;&nbsp;&nbsp;<font color="#ff0000">#include</font>&nbsp;&lt;stdio.h&gt;<br><font color="#808080">02</font>&nbsp;&nbsp;<br><font color="#808080">03</font>&nbsp;&nbsp;<font color="#008000">/**<br><font color="#808080">04</font>&nbsp;&nbsp;&nbsp;打印华氏转摄氏&nbsp;,从&nbsp;1...300&nbsp;<br><font color="#808080">05</font>&nbsp;&nbsp;*/</font><br><font color="#808080">06</font>&nbsp;&nbsp;main()&nbsp;<br><font color="#808080">07</font>&nbsp;&nbsp;{<br><font color="#808080">08</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">int</font>&nbsp;fahr,&nbsp;celsius;&nbsp;&nbsp;<font color="#008000">//定义&nbsp;华氏，跟摄氏两个变量</font><br><font color="#808080">09</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">int</font>&nbsp;lower,&nbsp;upper,step&nbsp;&nbsp;<font color="#008000">//定义&nbsp;,开始,结束,步长3个变量</font><br><font color="#808080">10</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><font color="#808080">11</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lower&nbsp;=&nbsp;0;&nbsp;&nbsp;<br><font color="#808080">12</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;upper&nbsp;=&nbsp;300;<br><font color="#808080">13</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;step&nbsp;=&nbsp;20;<br><font color="#808080">14</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><font color="#808080">15</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fahr&nbsp;=&nbsp;lower;<br><font color="#808080">16</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><font color="#808080">17</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">while</font>(fahr&nbsp;&lt;=&nbsp;upper)&nbsp;{&nbsp;<font color="#008000">//华氏小于300的时候，一直循环</font><br><font color="#808080">18</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;celsius&nbsp;=&nbsp;5&nbsp;*&nbsp;(fahr-32)&nbsp;/&nbsp;9;&nbsp;<font color="#008000">//套公式</font><br><font color="#808080">19</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(<font color="#ff00ff">"%d\t&nbsp;%d\t,&nbsp;fahr,&nbsp;celsius"</font>);&nbsp;<font color="#008000">//%d表示&nbsp;数值了，&nbsp;\t&nbsp;是制表符&nbsp;</font><br>]]></description>
</item><item>
<title><![CDATA[编程修养]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yach&amp;id=32336</link>
<author>yach</author>
<pubDate>2008/3/11 12:48:24</pubDate>
<description><![CDATA[
文章来源：http://www.csdn.net<br>
文章作者：haoel<br>
<br>
编程修养 <br>
<br>
什么是好的程序员？是不是懂得很多技术细节？还是懂底层编程？还是编程速度比较快？我觉得都不是。对于一些技术细节来说和底层的技术，只要看帮助，查资料就能找到，对于速度快，只要编得多也就熟能生巧了。 <br>
我认为好的程序员应该有以下几方面的素质： <br>
　1、有专研精神，勤学善问、举一反三。 <br>
　2、积极向上的态度，有创造性思维。 <br>
　3、与人积极交流沟通的能力，有团队精神。 <br>
　4、谦虚谨慎，戒骄戒燥。 <br>
5、写出的代码质量高。包括：代码的稳定、易读、规范、易维护、专业。<br>
这些都是程序员的修养，这里我想谈谈“编程修养”，也就是上述中的第5点。我觉得，如果我要了解一个作者，我会看他所写的小说，如果我要了解一个画家，我
会看他所画的图画，如果我要了解一个工人，我会看他所做出来的产品，同样，如果我要了解一个程序员，我想首先我最想看的就是他的程序代码，程序代码可以看
出一个程序员的素质和修养，程序就像一个作品，有素质有修养的程序员的作品必然是一图精美的图画，一首美妙的歌曲，一本赏心悦目的小说。 <br>
我看过许多程序，没有注释，没有缩进，胡乱命名的变量名，等等，等等，我把这种人统称为没有修养的程序，这种程序员，是在做创造性的工作吗？不，完全就是
在搞破坏，他们与其说是在编程，还不如说是在对源程序进行“加密”，这种程序员，见一个就应该开除一个，因为他编的程序所创造的价值，远远小于需要在上面
进行维护的价值。 <br>
程序员应该有程序员的修养，那怕再累，再没时间，也要对自己的程序负责。我宁可要那种动作慢，技术一般，但有良好的写程序风格的程序员，也不要那种技术
强、动作快的“搞破坏”的程序员。有句话叫“字如其人”，我想从程序上也能看出一个程序员的优劣。因为，程序是程序员的作品，作品的好坏直截关系到程序员
的声誉和素质。而“修养”好的程序员一定能做出好的程序和软件。 <br>
有个成语叫“独具匠心”，意思是做什么都要做得很专业，很用心，如果你要做一个“匠”，也就是造诣高深的人，那么，从一件很简单的作品上就能看出你有没有“匠”的特性，我觉得做一个程序员不难，但要做一个“程序匠”就不简单了。编程序很简单，但编出有质量的程序就难了。 <br>
我在这里不讨论过深的技术，我只想在一些容易让人忽略的东西上说一说，虽然这些东西可能很细微，但如果你不注意这些细微之处的话，那么他将会极大的影响你的整个软件质量，以及整个软件程的实施，所谓“千里之堤，毁于蚁穴”。 <br>
“细微之处见真功”，真正能体现一个程序的功底恰恰在这些细微之处。 <br>
这就是程序员的--编程修养。我总结了在用C/C++语言（主要是C语言）进行程序写作上的三十二个“修养”，通过这些，你可以写出质量高的程序，同时也会让看你程序的人渍渍称道，那些看过你程序的人一定会说：“这个人的编程修养不错”。 <br>
　　------------------------ <br>
　　　　 <br>
　　　　01、版权和版本 <br>
　　　　02、缩进、空格、换行、空行、对齐 <br>
　　　　03、程序注释 <br>
　　　　04、函数的[in][out]参数 <br>
　　　　05、对系统调用的返回进行判断 <br>
　　　　06、if 语句对出错的处理 <br>
　　　　07、头文件中的#ifndef <br>
　　　　08、在堆上分配内存 <br>
　　　　09、变量的初始化 <br>
　　　　10、h和c文件的使用 <br>
　　　　11、出错信息的处理 <br>
　　　　12、常用函数和循环语句中的被计算量 <br>
　　　　13、函数名和变量名的命名 <br>
　　　　14、函数的传值和传指针 <br>
　　　　15、修改别人程序的修养 <br>
　　　　16、把相同或近乎相同的代码形成函数和宏 <br>
　　　　17、表达式中的括号 <br>
　　　　18、函数参数中的const <br>
　　　　19、函数的参数个数 <br>
　　　　20、函数的返回类型，不要省略 <br>
　　　　21、goto语句的使用 <br>
　　　　22、宏的使用 <br>
　　　　23、static的使用 <br>
　　　　24、函数中的代码尺寸 <br>
　　　　25、typedef的使用 <br>
　　　　26、为常量声明宏 <br>
　　　　27、不要为宏定义加分号 <br>
　　　　28、||和&amp;&amp;的语句执行顺序 <br>
　　　　29、尽量用for而不是while做循环 <br>
　　　　30、请sizeof类型而不是变量 <br>
　　　　31、不要忽略Warning <br>
　　　　32、书写Debug版和Release版的程序 <br>
　　------------------------ <br>
<br>
1、版权和版本 <br>
------- <br>
好的程序员会给自己的每个函数，每个文件，都注上版权和版本。 <br>
对于C/C++的文件，文件头应该有类似这样的注释： <br>
/************************************************************************ <br>
* <br>
*　 文件名：network.c <br>
* <br>
*　 文件描述：网络通讯函数集 <br>
* <br>
*　 创建人： Hao Chen, 2003年2月3日 <br>
* <br>
*　 版本号：1.0 <br>
* <br>
*　 修改记录： <br>
* <br>
************************************************************************/ <br>
而对于函数来说，应该也有类似于这样的注释： <br>
/*================================================================ <br>
* <br>
* 函 数 名：XXX <br>
* <br>
* 参　　数： <br>
* <br>
*　　　　type name [IN] : descripts <br>
* <br>
* 功能描述: <br>
* <br>
*　　　　.............. <br>
* <br>
* 返 回 值：成功TRUE，失败FALSE <br>
* <br>
* 抛出异常： <br>
* <br>
* 作　　者：ChenHao 2003/4/2 <br>
* <br>
================================================================*/ <br>
这样的描述可以让人对一个函数，一个文件有一个总体的认识，对代码的易读性和易维护性有很大的好处。这是好的作品产生的开始。 <br>
<br>
2、缩进、空格、换行、空行、对齐 <br>
---------------- <br>
i)
缩进应该是每个程序都会做的，只要学程序过程序就应该知道这个，但是我仍然看过不缩进的程序，或是乱缩进的程序，如果你的公司还有写程序不缩进的程序员，
请毫不犹豫的开除他吧，并以破坏源码罪起诉他，还要他赔偿读过他程序的人的精神损失费。缩进，这是不成文规矩，我再重提一下吧，一个缩进一般是一个TAB
键或是4个空格。（最好用TAB键） <br>
ii) 空格。空格能给程序代来什么损失吗？没有，有效的利用空格可以让你的程序读进来更加赏心悦目。而不一堆表达式挤在一起。看看下面的代码： <br>
　　ha=(ha*128+*key++)%tabPtr-&gt;size; <br>
　　ha = ( ha * 128 + *key++ ) % tabPtr-&gt;size; <br>
　　有空格和没有空格的感觉不一样吧。一般来说，语句中要在各个操作符间加空格，函数调用时，要以各个参数间加空格。如下面这种加空格的和不加的： <br>
　　 <br>
if ((hProc=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid))==NULL){ <br>
} <br>
if ( ( hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid) ) == NULL ){ <br>
} <br>
iii) 换行。不要把语句都写在一行上，这样很不好。如： <br>
　　for(i=0;i&lt;len;i++)
if((a&lt;&amp;acute;0&amp;acute;||a&gt;&amp;acute;9&amp;acute;)&amp;&amp;(a&lt;&amp;acute;a&amp;acute;||a&gt;&amp;acute;z&amp;acute;))
break; <br>
　　 <br>
　　我拷，这种即无空格，又无换行的程序在写什么啊？加上空格和换行吧。　　 <br>
　　 <br>
　　for ( i=0; i&lt;len; i++) { <br>
　　　　if ( ( a &lt; &amp;acute;0&amp;acute; || a &gt; &amp;acute;9&amp;acute; ) &amp;&amp; <br>
　　　　　　 ( a &lt; &amp;acute;a&amp;acute; || a &gt; &amp;acute;z&amp;acute; ) ) { <br>
　　　　　　break; <br>
　　　　} <br>
　　} <br>
　　好多了吧？有时候，函数参数多的时候，最好也换行，如： <br>
　　CreateProcess( <br>
　　　　　　　　　NULL, <br>
　　　　　　　　　cmdbuf, <br>
　　　　　　　　　NULL, <br>
　　　　　　　　　NULL, <br>
　　　　　　　　　bInhH, <br>
　　　　　　　　　dwCrtFlags, <br>
　　　　　　　　　envbuf, <br>
　　　　　　　　　NULL, <br>
　　　　　　　　　&amp;siStartInfo, <br>
　　　　　　　　　&amp;prInfo <br>
　　　　　　　　 ); <br>
　　条件语句也应该在必要时换行： <br>
　　 <br>
　　if ( ch &gt;= &amp;acute;0&amp;acute; || ch &lt;= &amp;acute;9&amp;acute; || <br>
　　　　 ch &gt;= &amp;acute;a&amp;acute; || ch &lt;= &amp;acute;z&amp;acute; || <br>
　　　　 ch &gt;= &amp;acute;A&amp;acute; || ch &lt;= &amp;acute;Z&amp;acute; ) <br>
　　　　　　　　　 <br>
iv) 空行。不要不加空行，空行可以区分不同的程序块，程序块间，最好加上空行。如： <br>
　　HANDLE hProcess; <br>
　　PROCESS_T procInfo; <br>
　　/* open the process handle */ <br>
　　if((hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid)) == NULL) <br>
　　{ <br>
　　　　return LSE_MISC_SYS; <br>
　　} <br>
　　memset(&amp;procInfo, 0, sizeof(procInfo)); <br>
　　procInfo.idProc = pid; <br>
　　procInfo.hdProc = hProcess; <br>
　　procInfo.misc |= MSCAVA_PROC; <br>
　　return(0); <br>
　　　　　　　　　 <br>
v) 对齐。用TAB键对齐你的一些变量的声明或注释，一样会让你的程序好看一些。如： <br>
typedef struct _pt_man_t_ { <br>
　　int　　 numProc;　　/* Number of processes　　　　　　　　 */ <br>
　　int　　 maxProc;　　/* Max Number of processes　　　　　　 */ <br>
　　int　　 numEvnt;　　/* Number of events　　　　　　　　　　*/ <br>
　　int　　 maxEvnt;　　/* Max Number of events　　　　　　　　*/ <br>
　　HANDLE* pHndEvnt;　 /* Array of events　　　　　　　　　　 */ <br>
　　DWORD　 timeout;　　/* Time out interval　　　　　　　　　 */ <br>
　　HANDLE　hPipe;　　　/* Namedpipe　　　　　　　　　　　　　 */ <br>
　　TCHAR　 usr[MAXUSR];/* User name of the process　　　　　　*/ <br>
　　int　　 numMsg;　　 /* Number of Message　　　　　　　　　 */ <br>
　　int　　 Msg[MAXMSG];/* Space for intro process communicate */ <br>
} PT_MAN_T; <br>
怎么样？感觉不错吧。 <br>
这里主要讲述了如果写出让人赏心悦目的代码，好看的代码会让人的心情愉快，读起代码也就不累，工整、整洁的程序代码，通常更让人欢迎，也更让人称道。现在
的硬盘空间这么大，不要让你的代码挤在一起，这样它们会抱怨你虐待它们的。好了，用“缩进、空格、换行、空行、对齐”装饰你的代码吧，让他们从没有秩序的
土匪中变成一排排整齐有秩序的正规部队吧。 <br>
<br>
　　　　　　　　　 <br>
3、程序注释 <br>
------ <br>
养成写程序注释的习惯，这是每个程序员所必须要做的工作。我看过那种几千行，却居然没有一行注释的程序。这就如同在公路上驾车却没有路标一样。用不了多久，连自己都不知道自己的意图了，还要花上几倍的时间才看明白，这种浪费别人和自己的时间的人，是最为可耻的人。 <br>
是的，你也许会说，你会写注释，真的吗？注释的书写也能看出一个程序员的功底。一般来说你需要至少写这些地方的注释：文件的注释、函数的注释、变量的注
释、算法的注释、功能块的程序注释。主要就是记录你这段程序是干什么的？你的意图是什么？你这个变量是用来做什么的？等等。 <br>
不要以为注释好写，有一些算法是很难说或写出来的，只能意会，我承认有这种情况的时候，但你也要写出来，正好可以训练一下自己的表达能力。而表达能力正是
那种闷头搞技术的技术人员最缺的，你有再高的技术，如果你表达能力不行，你的技术将不能得到充分的发挥。因为，这是一个团队的时代。 <br>
好了，说几个注释的技术细节： <br>
i) 对于行注释（“//”）比块注释（“/* */”）要好的说法，我并不是很同意。因为一些老版本的C编译器并不支持行注释，所以为了你的程序的移植性，请你还是尽量使用块注释。 <br>
ii) 你也许会为块注释的不能嵌套而不爽，那么你可以用预编译来完成这个功能。使用“#if 0”和“#endif”括起来的代码，将不被编译，而且还可以嵌套。 <br>
<br>
<br>
4、函数的[in][out]参数 <br>
----------- <br>
我经常看到这样的程序： <br>
FuncName(char* str) <br>
{ <br>
　　int len = strlen(str); <br>
　　..... <br>
} <br>
char* <br>
GetUserName(struct user* pUser) <br>
{ <br>
　　return pUser-&gt;name; <br>
} <br>
不！请不要这样做。 <br>
你应该先判断一下传进来的那个指针是不是为空。如果传进来的指针为空的话，那么，你的一个大的系统就会因为这一个小的函数而崩溃。一种更好的技术是使用断
言（assert），这里我就不多说这些技术细节了。当然，如果是在C++中，引用要比指针好得多，但你也需要对各个参数进行检查。 <br>
写有参数的函数时，首要工作，就是要对传进来的所有参数进行合法性检查。而对于传出的参数也应该进行检查，这个动作当然应该在函数的外部，也就是说，调用完一个函数后，应该对其传出的值进行检查。 <br>
当然，检查会浪费一点时间，但为了整个系统不至于出现“非法操作”或是“Core Dump”的系统级的错误，多花这点时间还是很值得的。 <br>
<br>
<br>
5、对系统调用的返回进行判断 <br>
-------------- <br>
继续上一条，对于一些系统调用，比如打开文件，我经常看到，许多程序员对fopen返回的指针不做任何判断，就直接使用了。然后发现文件的内容怎么也读出不，或是怎么也写不进去。还是判断一下吧： <br>
　　fp = fopen("log.txt", "a"); <br>
　　if ( fp == NULL ){ <br>
　　　　printf("Error: open file errorn"); <br>
　　　　return FALSE; <br>
　　} <br>
其它还有许多啦，比如：socket返回的socket号，malloc返回的内存。请对这些系统调用返回的东西进行判断。 <br>
<br>
6、if 语句对出错的处理 <br>
----------- <br>
我看见你说了，这有什么好说的。还是先看一段程序代码吧。 <br>
　　if ( ch &gt;= &amp;acute;0&amp;acute; &amp;&amp; ch &lt;= &amp;acute;9&amp;acute; ){ <br>
　　　　/* 正常处理代码 */ <br>
　　}else{ <br>
　　　　/* 输出错误信息 */ <br>
　　　　printf("error ......n"); <br>
　　　　return ( FALSE ); <br>
　　} <br>
这种结构很不好，特别是如果“正常处理代码”很长时，对于这种情况，最好不要用else。先判断错误，如： <br>
　　if ( ch &lt; &amp;acute;0&amp;acute; || ch &gt; &amp;acute;9&amp;acute; ){ <br>
　　　　/* 输出错误信息 */ <br>
　　　　printf("error ......n"); <br>
　　　　return ( FALSE ); <br>
　　} <br>
　　 <br>
　　/* 正常处理代码 */ <br>
　　...... <br>
<br>
这样的结构，不是很清楚吗？突出了错误的条件，让别人在使用你的函数的时候，第一眼就能看到不合法的条件，于是就会更下意识的避免。 <br>
<br>
<br>
7、头文件中的#ifndef <br>
---------- <br>
千万不要忽略了头件的中的#ifndef，这是一个很关键的东西。比如你有两个C文件，这两个C文件都include了同一个头文件。而编译时，这两个C文件要一同编译成一个可运行文件，于是问题来了，大量的声明冲突。 <br>
还是把头文件的内容都放在#ifndef和#endif中吧。不管你的头文件会不会被多个文件引用，你都要加上这个。一般格式是这样的： <br>
　　#ifndef　&lt;标识&gt; <br>
　　#define &lt;标识&gt; <br>
　　 <br>
　　...... <br>
　　...... <br>
　　 <br>
　　#endif <br>
　　 <br>
&lt;标识&gt;在理论上来说可以是自由命名的，但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写，前后加下划线，并把文件名中的“.”也变成下划线，如：stdio.h <br>
　　#ifndef _STDIO_H_ <br>
　　#define _STDIO_H_ <br>
　　 <br>
　　...... <br>
　　 <br>
　　#endif <br>
　　 <br>
（BTW：预编译有多很有用的功能。你会用预编译吗？）　　 <br>
　　 <br>
<br>
8、在堆上分配内存 <br>
--------- <br>
可能许多人对内存分配上的“栈 stack”和“堆
heap”还不是很明白。包括一些科班出身的人也不明白这两个概念。我不想过多的说这两个东西。简单的来讲，stack上分配的内存系统自动释放，
heap上分配的内存，系统不释放，哪怕程序退出，那一块内存还是在那里。stack一般是静态分配内存，heap上一般是动态分配内存。 <br>
由malloc系统函数分配的内存就是从堆上分配内存。从堆上分配的内存一定要自己释放。用free释放，不然就是术语--“内存泄露”（或是“内存漏
洞”）-- Memory Leak。于是，系统的可分配内存会随malloc越来越少，直到系统崩溃。还是来看看“栈内存”和“堆内存”的差别吧。 <br>
　　栈内存分配 <br>
　　----- <br>
　　char* <br>
　　AllocStrFromStack() <br>
　　{ <br>
　　　　char pstr[100]; <br>
　　　　return pstr; <br>
　　} <br>
　　 <br>
　　 <br>
　　堆内存分配 <br>
　　----- <br>
　　char* <br>
　　AllocStrFromHeap(int len) <br>
　　{ <br>
　　　　char *pstr; <br>
　　　　 <br>
　　　　if ( len &lt;= 0 ) return NULL; <br>
　　　　return ( char* ) malloc( len ); <br>
　　} <br>
对于第一个函数，那块pstr的内存在函数返回时就被系统释放了。于是所返回的char*什么也没有。而对于第二个函数，是从堆上分配内存，所以哪怕是程
序退出时，也不释放，所以第二个函数的返回的内存没有问题，可以被使用。但一定要调用free释放，不然就是Memory Leak！ <br>
在堆上分配内存很容易造成内存泄漏，这是C/C++的最大的“克星”，如果你的程序要稳定，那么就不要出现Memory Leak。所以，我还是要在这里千叮咛万嘱付，在使用malloc系统函数（包括calloc，realloc）时千万要小心。 <br>
记得有一个UNIX上的服务应用程序，大约有几百的C文件编译而成，运行测试良好，等使用时，每隔三个月系统就是down一次，搞得许多人焦头烂额，查不
出问题所在。只好，每隔两个月人工手动重启系统一次。出现这种问题就是Memery
Leak在做怪了，在C/C++中这种问题总是会发生，所以你一定要小心。一个Rational的检测工作--Purify，可以帮你测试你的程序有没有
内存泄漏。 <br>
我保证，做过许多C/C++的工程的程序员，都会对malloc或是new有些感冒。当你什么时候在使用malloc和new时，有一种轻度的紧张和惶恐的感觉时，你就具备了这方面的修养了。 <br>
　　 <br>
对于malloc和free的操作有以下规则： <br>
1) 配对使用，有一个malloc，就应该有一个free。（C++中对应为new和delete） <br>
2) 尽量在同一层上使用，不要像上面那种，malloc在函数中，而free在函数外。最好在同一调用层上使用这两个函数。 <br>
3) malloc分配的内存一定要初始化。free后的指针一定要设置为NULL。　　 <br>
注：虽然现在的操作系统（如：UNIX和Win2k/NT）都有进程内存跟踪机制，也就是如果你有没有释放的内存，操作系统会帮你释放。但操作系统依然不
会释放你程序中所有产生了Memory Leak的内存，所以，最好还是你自己来做这个工作。（有的时候不知不觉就出现Memory
Leak了，而且在几百万行的代码中找无异于海底捞针，Rational有一个工具叫Purify，可能很好的帮你检查程序中的Memory
Leak） <br>
<br>
9、变量的初始化 <br>
-------- <br>
接上一条，变量一定要被初始化再使用。C/C++编译器在这个方面不会像JAVA一样帮你初始化，这一切都需要你自己来，如果你使用了没有初始化的变量，结果未知。好的程序员从来都会在使用变量前初始化变量的。如： <br>
　　1) 对malloc分配的内存进行memset清零操作。（可以使用calloc分配一块全零的内存） <br>
　　2) 对一些栈上分配的struct或数组进行初始化。（最好也是清零） <br>
　　 <br>
不过话又说回来了，初始化也会造成系统运行时间有一定的开销，所以，也不要对所有的变量做初始化，这个也没有意义。好的程序员知道哪些变量需要初始化，哪些则不需要。如：以下这种情况，则不需要。 <br>
　　　　 <br>
　　　　char *pstr;　/* 一个字符串 */ <br>
　　　　pstr = ( char* ) malloc( 50 ); <br>
　　　　if ( pstr == NULL ) exit(0); <br>
　　　　strcpy( pstr, "Hello Wrold" ); <br>
但如果是下面一种情况，最好进行内存初始化。（指针是一个危险的东西，一定要初始化） <br>
　　　　char **pstr;　/* 一个字符串数组 */ <br>
　　　　pstr = ( char** ) malloc( 50 ); <br>
　　　　if ( pstr == NULL ) exit(0); <br>
　　　　 <br>
　　　　/* 让数组中的指针都指向NULL */ <br>
　　　　memset( pstr, 0, 50*sizeof(char*) ); <br>
　　　　 <br>
而对于全局变量，和静态变量，一定要声明时就初始化。因为你不知道它第一次会在哪里被使用。所以使用前初始这些变量是比较不现实的，一定要在声明时就初始化它们。如： <br>
　　Links *plnk = NULL;　/* 对于全局变量plnk初始化为NULL */ <br>
<br>
<br>
10、h和c文件的使用 <br>
--------- <br>
H文件和C文件怎么用呢？一般来说，H文件中是declare（声明），C文件中是define（定义）。因为C文件要编译成库文件（Windows下
是.obj/.lib，UNIX下是.o/.a），如果别人要使用你的函数，那么就要引用你的H文件，所以，H文件中一般是变量、宏定义、枚举、结构和函
数接口的声明，就像一个接口说明文件一样。而C文件则是实现细节。 <br>
H文件和C文件最大的用处就是声明和实现分开。这个特性应该是公认的了，但我仍然看到有些人喜欢把函数写在H文件中，这种习惯很不好。（如果是C++话，
对于其模板函数，在VC中只有把实现和声明都写在一个文件中，因为VC不支持export关键字）。而且，如果在H文件中写上函数的实现，你还得在
makefile中把头文件的依赖关系也加上去，这个就会让你的makefile很不规范。 <br>
最后，有一个最需要注意的地方就是：带初始化的全局变量不要放在H文件中！ <br>
例如有一个处理错误信息的结构： <br>
　　char* errmsg[] = { <br>
　　　　/* 0 */　　　 "No error",　　　　　　　　 <br>
　　　　/* 1 */　　　 "Open file error",　　　　 <br>
　　　　/* 2 */　　　 "Failed in sending/receiving a message",　 <br>
　　　　/* 3 */　　　 "Bad arguments",　 <br>
　　　　/* 4 */　　　 "Memeroy is not enough", <br>
　　　　/* 5 */　　　 "Service is down; try later", <br>
　　　　/* 6 */　　　 "Unknow information", <br>
　　　　/* 7 */　　　 "A socket operation has failed", <br>
　　　　/* 8 */　　　 "Permission denied", <br>
　　　　/* 9 */　　　 "Bad configuration file format",　 <br>
　　　　/* 10 */　　　"Communication time out", <br>
　　　　...... <br>
　　　　...... <br>
　　}; <br>
　　 <br>
请不要把这个东西放在头文件中，因为如果你的这个头文件被5个函数库（.lib或是.a）所用到，于是他就被链接在这5个.lib或.a中，而如果你的一
个程序用到了这5个函数库中的函数，并且这些函数都用到了这个出错信息数组。那么这份信息将有5个副本存在于你的执行文件中。如果你的这个errmsg很
大的话，而且你用到的函数库更多的话，你的执行文件也会变得很大。 <br>
正确的写法应该把它写到C文件中，然后在各个需要用到errmsg的C文件头上加上 extern char* errmsg[]; 的外部声明，让编译器在链接时才去管他，这样一来，就只会有一个errmsg存在于执行文件中，而且，这样做很利于封装。 <br>
我曾遇到过的最疯狂的事，就是在我的目标文件中，这个errmsg一共有112个副本，执行文件有8M左右。当我把errmsg放到C文件中，并为一千多
个C文件加上了extern的声明后，所有的函数库文件尺寸都下降了20%左右，而我的执行文件只有5M了。一下子少了3M啊。 <br>
〔 备注 〕 <br>
----- <br>
有朋友对我说，这个只是一个特例，因为，如果errmsg在执行文件中存在多个副本时，可以加快程序运行速度，理由是errmsg的多个复本会让系统的内
存换页降低，达到效率提升。像我们这里所说的errmsg只有一份，当某函数要用errmsg时，如果内存隔得比较远，会产生换页，反而效率不高。 <br>
这个说法不无道理，但是一般而言，对于一个比较大的系统，errmsg是比较大的，所以产生副本导致执行文件尺寸变大，不仅增加了系统装载时间，也会让一
个程序在内存中占更多的页面。而对于errmsg这样数据，一般来说，在系统运行时不会经常用到，所以还是产生的内存换页也就不算频繁。权衡之下，还是只
有一份errmsg的效率高。即便是像logmsg这样频繁使用的的数据，操作系统的内存调度算法会让这样的频繁使用的页面常驻于内存，所以也就不会出现
内存换页问题了 <br>
11、出错信息的处理 <br>
--------- <br>
你会处理出错信息吗？哦，它并不是简单的输出。看下面的示例： <br>
　　if ( p == NULL ){ <br>
　　　　printf ( "ERR: The pointer is NULLn" ); <br>
　　} <br>
　　 <br>
告别学生时代的编程吧。这种编程很不利于维护和管理，出错信息或是提示信息，应该统一处理，而不是像上面这样，写成一个“硬编码”。第10条对这方面的处理做了一部分说明。如果要管理错误信息，那就要有以下的处理： <br>
　　/* 声明出错代码 */ <br>
　　#define　　 ERR_NO_ERROR　　0　/* No error　　　　　　　　 */ <br>
　　#define　　 ERR_OPEN_FILE　 1　/* Open file error　　　　　*/ <br>
　　#define　　 ERR_SEND_MESG　 2　/* sending a message error　*/ <br>
　　#define　　 ERR_BAD_ARGS　　3　/* Bad arguments　　　　　　*/ <br>
　　#define　　 ERR_MEM_NONE　　4　/* Memeroy is not enough　　*/ <br>
　　#define　　 ERR_SERV_DOWN　 5　/* Service down try later　 */ <br>
　　#define　　 ERR_UNKNOW_INFO 6　/* Unknow information　　　 */ <br>
　　#define　　 ERR_SOCKET_ERR　7　/* Socket operation failed　*/ <br>
　　#define　　 ERR_PERMISSION　8　/* Permission denied　　　　*/ <br>
　　#define　　 ERR_BAD_FORMAT　9　/* Bad configuration file　 */ <br>
　　#define　　 ERR_TIME_OUT　 10　/* Communication time out　 */ <br>
　　 <br>
　　/* 声明出错信息 */ <br>
　　char* errmsg[] = { <br>
　　　　/* 0 */　　　 "No error",　　　　　　　　 <br>
　　　　/* 1 */　　　 "Open file error",　　　　 <br>
　　　　/* 2 */　　　 "Failed in sending/receiving a message",　 <br>
　　　　/* 3 */　　　 "Bad arguments",　 <br>
　　　　/* 4 */　　　 "Memeroy is not enough", <br>
　　　　/* 5 */　　　 "Service is down; try later", <br>
　　　　/* 6 */　　　 "Unknow information", <br>
　　　　/* 7 */　　　 "A socket operation has failed", <br>
　　　　/* 8 */　　　 "Permission denied", <br>
　　　　/* 9 */　　　 "Bad configuration file format",　 <br>
　　　　/* 10 */　　　"Communication time out", <br>
　　}; <br>
　　　　　　　　　　　　　　　 <br>
　　/* 声明错误代码全局变量 */ <br>
　　long errno = 0; <br>
　　 <br>
　　/* 打印出错信息函数 */ <br>
　　void perror( char* info) <br>
　　{ <br>
　　　　if ( info ){ <br>
　　　　　　printf("%s: %sn", info, errmsg[errno] ); <br>
　　　　　　return; <br>
　　　　} <br>
　　　　 <br>
　　　　printf("Error: %sn", errmsg[errno] ); <br>
　　} <br>
这个基本上是ANSI的错误处理实现细节了，于是当你程序中有错误时你就可以这样处理： <br>
　　bool CheckPermission( char* userName ) <br>
　　{ <br>
　　　　if ( strcpy(userName, "root") != 0 ){ <br>
　　　　　　errno = ERR_PERMISSION_DENIED; <br>
　　　　　　return (FALSE); <br>
　　　　} <br>
　　　　 <br>
　　　　... <br>
　　} <br>
　　 <br>
　　main() <br>
　　{ <br>
　　　　... <br>
　　　　if (! CheckPermission( username ) ){ <br>
　　　　　　perror("main()"); <br>
　　　　} <br>
　　　　... <br>
　　} <br>
　　　　　　　　　　　　　　　 <br>
一个即有共性，也有个性的错误信息处理，这样做有利同种错误出一样的信息，统一用户界面，而不会因为文件打开失败，A程序员出一个信息，B程序员又出一个信息。而且这样做，非常容易维护。代码也易读。 <br>
当然，物极必反，也没有必要把所有的输出都放到errmsg中，抽取比较重要的出错信息或是提示信息是其关键，但即使这样，这也包括了大多数的信息。 <br>
<br>
<br>
12、常用函数和循环语句中的被计算量 <br>
----------------- <br>
看一下下面这个例子： <br>
　　for( i=0; i&lt;1000; i++ ){ <br>
　　　　GetLocalHostName( hostname ); <br>
　　　　... <br>
　　} <br>
　　 <br>
GetLocalHostName的意思是取得当前计算机名，在循环体中，它会被调用1000次啊。这是多么的没有效率的事啊。应该把这个函数拿到循环体
外，这样只调用一次，效率得到了很大的提高。虽然，我们的编译器会进行优化，会把循环体内的不变的东西拿到循环外面，但是，你相信所有编译器会知道哪些是
不变的吗？我觉得编译器不可靠。最好还是自己动手吧。 <br>
同样，对于常用函数中的不变量，如： <br>
GetLocalHostName(char* name) <br>
{ <br>
　　char funcName[] = "GetLocalHostName"; <br>
　　 <br>
　　sys_log( "%s begin......", funcName ); <br>
　　... <br>
　　sys_log( "%s end......", funcName ); <br>
} <br>
如果这是一个经常调用的函数，每次调用时都要对funcName进行分配内存，这个开销很大啊。把这个变量声明成static吧，当函数再次被调用时，就会省去了分配内存的开销，执行效率也很好。 <br>
　　 <br>
<br>
13、函数名和变量名的命名 <br>
------------ <br>
我看到许多程序对变量名和函数名的取名很草率，特别是变量名，什么a,b,c,aa,bb,cc，还有什么flag1,flag2, cnt1, cnt2，这同样是一种没有“修养”的行为。即便加上好的注释。好的变量名或是函数名，我认为应该有以下的规则： <br>
　　 <br>
　　1) 直观并且可以拼读，可望文知意，不必“解码”。 <br>
　　2) 名字的长度应该即要最短的长度，也要能最大限度的表达其含义。 <br>
　　3) 不要全部大写，也不要全部小写，应该大小写都有，如：GetLocalHostName 或是 UserAccount。 <br>
　　4) 可以简写，但简写得要让人明白，如：ErrorCode -&gt; ErrCode,　ServerListener -&gt; ServLisner，UserAccount -&gt; UsrAcct 等。 <br>
　　5) 为了避免全局函数和变量名字冲突，可以加上一些前缀，一般以模块简称做为前缀。 <br>
　　6) 全局变量统一加一个前缀或是后缀，让人一看到这个变量就知道是全局的。 <br>
　　7) 用匈牙利命名法命名函数参数，局部变量。但还是要坚持“望文生意”的原则。 <br>
　　8) 与标准库（如：STL）或开发库（如：MFC）的命名风格保持一致。 <br>
　　 <br>
<br>
　　 <br>
14、函数的传值和传指针 <br>
------------ <br>
向函数传参数时，一般而言，传入非const的指针时，就表示，在函数中要修改这个指针把指内存中的数据。如果是传值，那么无论在函数内部怎么修改这个值，也影响不到传过来的值，因为传值是只内存拷贝。 <br>
什么？你说这个特性你明白了，好吧，让我们看看下面的这个例程： <br>
void <br>
GetVersion(char* pStr) <br>
{ <br>
　　pStr = malloc(10); <br>
　　strcpy ( pStr, "2.0" ); <br>
} <br>
main() <br>
{ <br>
　　char* ver = NULL; <br>
　　GetVersion ( ver ); <br>
　　... <br>
　　... <br>
　　free ( ver ); <br>
} <br>
我保证，类似这样的问题是一个新手最容易犯的错误。程序中妄图通过函数GetVersion给指针ver分配空间，但这种方法根本没有什么作用，原因就是--这是传值，不是传指针。你或许会和我争论，我分明传的时指针啊？再仔细看看，其实，你传的是指针其实是在传值。 <br>
<br>
15、修改别人程序的修养 <br>
----------- <br>
当你维护别人的程序时，请不要非常主观臆断的把已有的程序删除或是修改。我经常看到有的程序员直接在别人的程序上修改表达式或是语句。修改别人的程序时，
请不要删除别人的程序，如果你觉得别人的程序有所不妥，请注释掉，然后添加自己的处理程序，必竟，你不可能100%的知道别人的意图，所以为了可以恢复，
请不依赖于CVS或是SourceSafe这种版本控制软件，还是要在源码上给别人看到你修改程序的意图和步骤。这是程序维护时，一个有修养的程序员所应
该做的。 <br>
如下所示，这就是一种比较好的修改方法： <br>
　　/* <br>
　　 * ----- commented by haoel 2003/04/12 ------ <br>
　　 * <br>
　　 *　 char* p = ( char* ) malloc( 10 ); <br>
　　 *　 memset( p, 0, 10 ); <br>
　　 */ <br>
　　 <br>
　　/* ------ Added by haoel　 2003/04/12 ----- */ <br>
　　 char* p = ( char* )calloc( 10, sizeof char ); <br>
　　/* ---------------------------------------- */ <br>
　　... <br>
当然，这种方法是在软件维护时使用的，这样的方法，可以让再维护的人很容易知道以前的代码更改的动作和意图，而且这也是对原作者的一种尊敬。 <br>
以“注释 - 添加”方式修改别人的程序，要好于直接删除别人的程序。 <br>
16、把相同或近乎相同的代码形成函数和宏 <br>
--------------------- <br>
有人说，最好的程序员，就是最喜欢“偷懒”的程序，其中不无道理。 <br>
如果你有一些程序的代码片段很相似，或直接就是一样的，请把他们放在一个函数中。而如果这段代码不多，而且会被经常使用，你还想避免函数调用的开销，那么就把他写成宏吧。 <br>
千万不要让同一份代码或是功能相似的代码在多个地方存在，不然如果功能一变，你就要修改好几处地方，这种会给维护带来巨大的麻烦，所以，做到“一改百改”，还是要形成函数或是宏。 <br>
<br>
17、表达式中的括号 <br>
--------- <br>
如果一个比较复杂的表达式中，你并不是很清楚各个操作符的忧先级，即使是你很清楚优先级，也请加上括号，不然，别人或是自己下一次读程序时，一不小心就看走眼理解错了，为了避免这种“误解”，还有让自己的程序更为清淅，还是加上括号吧。 <br>
比如，对一个结构的成员取地址： <br>
　　GetUserAge( &amp;( UserInfo-&gt;age ) ); <br>
虽然，&amp;UserInfo-&gt;age中，-&gt;操作符的优先级最高，但加上一个括号，会让人一眼就看明白你的代码是什么意思。 <br>
再比如，一个很长的条件判断： <br>
if ( ( ch[0] &gt;= &amp;acute;0&amp;acute; || ch[0] &lt;= &amp;acute;9&amp;acute; ) &amp;&amp; <br>
　　 ( ch[1] &gt;= &amp;acute;a&amp;acute; || ch[1] &lt;= &amp;acute;z&amp;acute; ) &amp;&amp; <br>
　　 ( ch[2] &gt;= &amp;acute;A&amp;acute; || ch[2] &lt;= &amp;acute;Z&amp;acute; )　　) <br>
　　 <br>
括号，再加上空格和换行，你的代码是不是很容易读懂了？　　 <br>
<br>
18、函数参数中的const <br>
----------- <br>
对于一些函数中的指针参数，如果在函数中只读，请将其用const修饰，这样，别人一读到你的函数接口时，就会知道你的意图是这个参数是[in]，如果没有const时，参数表示[in/out]，注意函数接口中的const使用，利于程序的维护和避免犯一些错误。 <br>
虽然，const修饰的指针，如：const char*
p，在C中一点用也没有，因为不管你的声明是不是const，指针的内容照样能改，因为编译器会强制转换，但是加上这样一个说明，有利于程序的阅读和编
译。因为在C中，修改一个const指针所指向的内存时，会报一个Warning。这会引起程序员的注意。 <br>
C++中对const定义的就很严格了，所以C++中要多多的使用const，const的成员函数，const的变量，这样会对让你的代码和你的程序更加完整和易读。（关于C++的const我就不多说了） <br>
<br>
19、函数的参数个数（多了请用结构） <br>
----------------- <br>
函数的参数个数最好不要太多，一般来说6个左右就可以了，众多的函数参数会让读代码的人一眼看上去就很头昏，而且也不利于维护。如果参数众多，还请使用结构来传递参数。这样做有利于数据的封装和程序的简洁性。 <br>
也利于使用函数的人，因为如果你的函数个数很多，比如12个，调用者很容易搞错参数的顺序和个数，而使用结构struct来传递参数，就可以不管参数的顺序。 <br>
而且，函数很容易被修改，如果需要给函数增加参数，不需要更改函数接口，只需更改结构体和函数内部处理，而对于调用函数的程序来说，这个动作是透明的。 <br>
<br>
<br>
20、函数的返回类型，不要省略 <br>
-------------- <br>
我看到很多程序写函数时，在函数的返回类型方面不太注意。如果一个函数没有返回值，也请在函数前面加上void的修饰。而有的程序员偷懒，在返回int的函数则什么不修饰（因为如果不修饰，则默认返回int），这种习惯很不好，还是为了原代码的易读性，加上int吧。 <br>
所以函数的返回值类型，请不要省略。 <br>
另外，对于void的函数，我们往往会忘了return，由于某些C/C++的编译器比较敏感，会报一些警告，所以即使是void的函数，我们在内部最好也要加上return的语句，这有助于代码的编译。 <br>
<br>
<br>
21、goto语句的使用 <br>
--------- <br>
N年前，软件开发的一代宗师--迪杰斯特拉(Dijkstra)说过：“goto statment is harmful !!”，并建议取消goto语句。因为goto语句不利于程序代码的维护性。 <br>
这里我也强烈建议不要使用goto语句，除非下面的这种情况： <br>
<br>
　　#define FREE(p) if(p) { <br>
　　　　　　　　　　　　free(p); <br>
　　　　　　　　　　　　p = NULL; <br>
　　　　　　　　　　} <br>
　　main() <br>
　　{ <br>
　　　　char *fname=NULL, *lname=NULL, *mname=NULL; <br>
　　　　fname = ( char* ) calloc ( 20, sizeof(char) ); <br>
　　　　if ( fname == NULL ){ <br>
　　　　　　goto ErrHandle; <br>
　　　　} <br>
　　　　lname = ( char* ) calloc ( 20, sizeof(char) ); <br>
　　　　if ( lname == NULL ){ <br>
　　　　　　goto ErrHandle; <br>
　　　　} <br>
　　　　mname = ( char* ) calloc ( 20, sizeof(char) ); <br>
　　　　if ( mname == NULL ){ <br>
　　　　　　goto ErrHandle; <br>
　　　　} <br>
　　　　 <br>
　　　　...... <br>
　　 <br>
　　　　 <br>
　　 ErrHandle: <br>
　　　　FREE(fname); <br>
　　　　FREE(lname); <br>
　　　　FREE(mname); <br>
　　　　ReportError(ERR_NO_MEMOEY); <br>
　　 } <br>
也只有在这种情况下，goto语句会让你的程序更易读，更容易维护。（在用嵌C来对数据库设置游标操作时，或是对数据库建立链接时，也会遇到这种结构） <br>
<br>
<br>
22、宏的使用 <br>
------ <br>
很多程序员不知道C中的“宏”到底是什么意思？特别是当宏有参数的时候，经常把宏和函数混淆。我想在这里我还是先讲讲“宏”，宏只是一种定义，他定义了一
个语句块，当程序编译时，编译器首先要执行一个“替换”源程序的动作，把宏引用的地方替换成宏定义的语句块，就像文本文件替换一样。这个动作术语叫“宏的
展开” <br>
使用宏是比较“危险”的，因为你不知道宏展开后会是什么一个样子。例如下面这个宏： <br>
　　#define　MAX(a, b)　　 a&gt;b?a:b <br>
当我们这样使用宏时，没有什么问题： MAX( num1, num2 ); 因为宏展开后变成
num1&gt;num2?num1:num2；。但是，如果是这样调用的，MAX( 17+32, 25+21 );
呢，编译时出现错误，原因是，宏展开后变成：17+32&gt;25+21?17+32:25+21，哇，这是什么啊？ <br>
所以，宏在使用时，参数一定要加上括号，上述的那个例子改成如下所示就能解决问题了。 <br>
　　#define　MAX( (a), (b) )　　 (a)&gt;(b)?(a):(b) <br>
　　 <br>
即使是这样，也不这个宏也还是有Bug，因为如果我这样调用 MAX(i++, j++); ，经过这个宏以后，i和j都被累加了两次，这绝不是我们想要的。 <br>
　　 <br>
所以，在宏的使用上还是要谨慎考虑，因为宏展开是的结果是很难让人预料的。而且虽然，宏的执行很快（因为没有函数调用的开销），但宏会让源代码澎涨，使目
标文件尺寸变大，（如：一个50行的宏，程序中有1000个地方用到，宏展开后会很不得了），相反不能让程序执行得更快（因为执行文件变大，运行时系统换
页频繁）。 <br>
因此，在决定是用函数，还是用宏时得要小心。 <br>
<br>
23、static的使用 <br>
-------- <br>
static关键字，表示了“静态”，一般来说，他会被经常用于变量和函数。一个static的变量，其实就是全局变量，只不过他是有作用域的全局变量。比如一个函数中的static变量： <br>
char* <br>
getConsumerName() <br>
{ <br>
　　static int cnt = 0; <br>
　　 <br>
　　.... <br>
　　cnt++; <br>
　　.... <br>
} <br>
cnt变量的值会跟随着函数的调用次而递增，函数退出后，cnt的值还存在，只是cnt只能在函数中才能被访问。而cnt的内存也只会在函数第一次被调用时才会被分配和初始化，以后每次进入函数，都不为static分配了，而直接使用上一次的值。 <br>
对于一些被经常调用的函数内的常量，最好也声明成static（参见第12条） <br>
但static的最多的用处却不在这里，其最大的作用的控制访问，在C中如果一个函数或是一个全局变量被声明为static，那么，这个函数和这个全局变
量，将只能在这个C文件中被访问，如果别的C文件中调用这个C文件中的函数，或是使用其中的全局（用extern关键字），将会发生链接时错误。这个特性
可以用于数据和程序保密。 <br>
<br>
24、函数中的代码尺寸 <br>
---------- <br>
一个函数完成一个具体的功能，一般来说，一个函数中的代码最好不要超过600行左右，越少越好，最好的函数一般在100行以内，300行左右的孙函数就差
不多了。有证据表明，一个函数中的代码如果超过500行，就会有和别的函数相同或是相近的代码，也就是说，就可以再写另一个函数。 <br>
另外，函数一般是完成一个特定的功能，千万忌讳在一个函数中做许多件不同的事。函数的功能越单一越好，一方面有利于函数的易读性，另一方面更有利于代码的维护和重用，功能越单一表示这个函数就越可能给更多的程序提供服务，也就是说共性就越多。 <br>
虽然函数的调用会有一定的开销，但比起软件后期维护来说，增加一些运行时的开销而换来更好的可维护性和代码重用性，是很值得的一件事。 <br>
<br>
25、typedef的使用 <br>
--------- <br>
typedef是一个给类型起别名的关键字。不要小看了它，它对于你代码的维护会有很好的作用。比如C中没有bool，于是在一个软件中，一些程序员使用int，一些程序员使用short，会比较混乱，最好就是用一个typedef来定义，如： <br>
　　typedef char bool; <br>
　　 <br>
一般来说，一个C的工程中一定要做一些这方面的工作，因为你会涉及到跨平台，不同的平台会有不同的字长，所以利用预编译和typedef可以让你最有效的维护你的代码，如下所示： <br>
　　#ifdef SOLARIS2_5 <br>
　　　typedef boolean_t　　 BOOL_T; <br>
　　#else <br>
　　　typedef int　　　　　 BOOL_T; <br>
　　#endif <br>
　　 <br>
　　typedef short　　　　　 INT16_T; <br>
　　typedef unsigned short　UINT16_T; <br>
　　typedef int　　　　　　 INT32_T; <br>
　　typedef unsigned int　　UINT32_T; <br>
　　 <br>
　　#ifdef WIN32 <br>
　　　typedef _int64　　　　INT64_T; <br>
　　#else <br>
　　　typedef long long　　 INT64_T; <br>
　　#endif <br>
　　 <br>
　　typedef float　　　　　 FLOAT32_T; <br>
　　typedef char*　　　　　 STRING_T; <br>
　　typedef unsigned char　 BYTE_T; <br>
　　typedef time_t　　　　　TIME_T; <br>
　　typedef INT32_T　　　　 PID_T; <br>
　　 <br>
使用typedef的其它规范是，在结构和函数指针时，也最好用typedef，这也有利于程序的易读和可维护性。如： <br>
　　typedef struct _hostinfo { <br>
　　　　HOSTID_T　 host; <br>
　　　　INT32_T　　hostId; <br>
　　　　STRING_T　 hostType; <br>
　　　　STRING_T　 hostModel; <br>
　　　　FLOAT32_T　cpuFactor; <br>
　　　　INT32_T　　numCPUs; <br>
　　　　INT32_T　　nDisks; <br>
　　　　INT32_T　　memory; <br>
　　　　INT32_T　　swap; <br>
　　} HostInfo; <br>
<br>
　　typedef INT32_T (*RsrcReqHandler)( <br>
　　 void *info, <br>
　　 JobArray *jobs, <br>
　　 AllocInfo *allocInfo, <br>
　　 AllocList *allocList); <br>
C++中这样也是很让人易读的： <br>
　　typedef CArray&lt;HostInfo, HostInfo&amp;&gt; HostInfoArray; <br>
于是，当我们用其定义变量时，会显得十分易读。如： <br>
　　HostInfo* phinfo; <br>
　　RsrcReqHandler* pRsrcHand; <br>
这种方式的易读性，在函数的参数中十分明显。 <br>
关键是在程序种使用typedef后，几乎所有的程序中的类型声明都显得那么简洁和清淅，而且易于维护，这才是typedef的关键。 <br>
<br>
26、为常量声明宏 <br>
-------- <br>
最好不要在程序中出现数字式的“硬编码”，如： <br>
　　int user[120]; <br>
　　 <br>
为这个120声明一个宏吧。为所有出现在程序中的这样的常量都声明一个宏吧。比如TimeOut的时间，最大的用户数量，还有其它，只要是常量就应该声明成宏。如果，突然在程序中出现下面一段代码， <br>
　　for ( i=0; i&lt;120; i++){ <br>
　　　　.... <br>
　　} <br>
120是什么？为什么会是120？这种“硬编码”不仅让程序很读，而且也让程序很不好维护，如果要改变这个数字，得同时对所有程序中这个120都要做修改，这对修改程序的人来说是一个很大的痛苦。所以还是把常量声明成宏，这样，一改百改，而且也很利于程序阅读。 <br>
　　#define MAX_USR_CNT 120 <br>
　　 <br>
　　for ( i=0; i&lt;MAX_USER_CNT; i++){ <br>
　　　　.... <br>
　　} <br>
这样就很容易了解这段程序的意图了。 <br>
有的程序员喜欢为这种变量声明全局变量，其实，全局变量应该尽量的少用，全局变量不利于封装，也不利于维护，而且对程序执行空间有一定的开销，一不小心就造成系统换页，造成程序执行速度效率等问题。所以声明成宏，即可以免去全局变量的开销，也会有速度上的优势。 <br>
<br>
27、不要为宏定义加分号 <br>
----------- <br>
有许多程序员不知道在宏定义时是否要加分号，有时，他们以为宏是一条语句，应该要加分号，这就错了。当你知道了宏的原理，你会赞同我为会么不要为宏定义加分号的。看一个例子： <br>
　　#define MAXNUM 1024; <br>
这是一个有分号的宏，如果我们这样使用： <br>
　　half = MAXNUM/2; <br>
　　 <br>
　　if ( num &lt; MAXNUM ) <br>
等等，都会造成程序的编译错误，因为，当宏展开后，他会是这个样子的： <br>
　　half = 1024;/2; <br>
　　 <br>
　　if ( num &lt; 1024; ) <br>
　　 <br>
是的，分号也被展进去了，所以造成了程序的错误。请相信我，有时候，一个分号会让你的程序出现成百个错误。所以还是不要为宏加最后一个分号，哪怕是这样： <br>
　　#define LINE　　"=================================" <br>
　　 <br>
　　#define PRINT_LINE　printf(LINE) <br>
　　#define PRINT_NLINE(n)　while ( n-- &gt;0 ) { PRINT_LINE; } <br>
　　 <br>
都不要在最后加上分号，当我们在程序中使用时，为之加上分号， <br>
　　main() <br>
　　{ <br>
　　　　char *p = LINE; <br>
　　　　PRINT_LINE; <br>
　　} <br>
这一点非常符合习惯，而且，如果忘加了分号，编译器给出的错误提示，也会让我们很容易看懂的。 <br>
28、||和&amp;&amp;的语句执行顺序 <br>
------------ <br>
条件语句中的这两个“与”和“或”操作符一定要小心，它们的表现可能和你想像的不一样，这里条件语句中的有些行为需要和说一下： <br>
　　express1 || express2 <br>
　　　　 <br>
　　先执行表达式express1如果为“真”，express2将不被执行，express2仅在express1为“假”时才被执行。因为第一个表达式为真了，整个表达式都为真，所以没有必要再去执行第二个表达式了。 <br>
　　express1 &amp;&amp; express2 <br>
　　先执行表达式express1如果为“假”，express2将不被执行，express2仅在express1为“真”时才被执行。因为第一个表达式为假了，整个表达式都为假了，所以没有必要再去执行第二个表达式了。 <br>
<br>
于是，他并不是你所想像的所有的表达式都会去执行，这点一定要明白，不然你的程序会出现一些莫明的运行时错误。 <br>
例如，下面的程序： <br>
<br>
　　if ( sum &gt; 100 &amp;&amp; <br>
　　　　 ( ( fp=fopen( filename,"a" ) ) != NULL )　 { <br>
　　　　 <br>
　　　　 fprintf(fp, "Warring: it beyond one hundredn"); <br>
　　　　 ...... <br>
　　} <br>
　　 <br>
　　fprintf( fp, " sum is %id n", sum ); <br>
　　fclose( fp ); <br>
本来的意图是，如果sum &gt; 100 ，向文件中写一条出错信息，为了方便，把两个条件判断写在一起，于是，如果sum&lt;=100时，打开文件的操作将不会做，最后，fprintf和fclose就会发现未知的结果。 <br>
再比如，如果我想判断一个字符是不是有内容，我得判断这个字符串指针是不为空（NULL）并且其内容不能为空（Empty），一个是空指针，一个是空内容。我也许会这样写： <br>
　　if ( ( p != NULL ) &amp;&amp; ( strlen(p) != 0 )) <br>
于是，如果p为NULL，那么strlen(p)就不会被执行，于是，strlen也就不会因为一个空指针而“非法操作”或是一个“Core Dump”了。 <br>
记住一点，条件语句中，并非所有的语句都会执行，当你的条件语句非常多时，这点要尤其注意。 <br>
<br>
29、尽量用for而不是while做循环 <br>
--------------- <br>
基本上来说，for可以完成while的功能，我是建议尽量使用for语句，而不要使用while语句，特别是当循环体很大时，for的优点一下就体现出来了。 <br>
因为在for中，循环的初始、结束条件、循环的推进，都在一起，一眼看上去就知道这是一个什么样的循环。刚出学校的程序一般对于链接喜欢这样来： <br>
　　p = pHead; <br>
　　 <br>
　　while ( p ){ <br>
　　　　... <br>
　　　　... <br>
　　　　p = p-&gt;next; <br>
　　} <br>
当while的语句块变大后，你的程序将很难读，用for就好得多： <br>
　　for ( p=pHead;　p; p=p-&gt;next ){ <br>
　　.. <br>
　　} <br>
一眼就知道这个循环的开始条件，结束条件，和循环的推进。大约就能明白这个循环要做个什么事？而且，程序维护进来很容易，不必像while一样，在一个编辑器中上上下下的捣腾。 <br>
<br>
30、请sizeof类型而不是变量 <br>
------------- <br>
许多程序员在使用sizeof中，喜欢sizeof变量名，例如： <br>
int score[100]; <br>
char filename[20]; <br>
struct UserInfo usr[100]; <br>
在sizeof这三个的变量名时，都会返回正确的结果，于是许多程序员就开始sizeof变量名。这个习惯很虽然没有什么不好，但我还是建议sizeof类型。 <br>
我看到过这个的程序： <br>
　　pScore = (int*) malloc( SUBJECT_CNT ); <br>
　　memset( pScore, 0, sizeof(pScore) ); <br>
　　... <br>
　　 <br>
此时，sizeof(pScore)返回的就是4（指针的长度），不会是整个数组，于是，memset就不能对这块内存进行初始化。为了程序的易读和易维护，我强烈建议使用类型而不是变量，如： <br>
对于score：　　 sizeof(int) * 100　 /* 100个int */ <br>
对于filename：　sizeof(char) * 20　 /* 20个char */ <br>
对于usr：　　　 sizeof(struct UserInfo) * 100　 /* 100个UserInfo */ <br>
这样的代码是不是很易读？一眼看上去就知道什么意思了。 <br>
<br>
另外一点，sizeof一般用于分配内存，这个特性特别在多维数组时，就能体现出其优点了。如，给一个字符串数组分配内存， <br>
/* <br>
* 分配一个有20个字符串， <br>
* 每个字符串长100的内存 <br>
*/ <br>
char* *p; <br>
/* <br>
* 错误的分配方法 <br>
*/ <br>
p = (char**)calloc( 20*100, sizeof(char) ); <br>
<br>
/* <br>
* 正确的分配方法 <br>
*/ <br>
p = (char**) calloc ( 20, sizeof(char*) ); <br>
for ( i=0; i&lt;20; i++){ <br>
　　/*p = (char*) calloc ( 100, sizeof(char) );*/ <br>
　　p = (char*) calloc ( 100, sizeof(char) ); <br>
} <br>
（注：上述语句被注释掉的是原来的，是错误的，由dasherest朋友指正，谢谢） <br>
为了代码的易读，省去了一些判断，请注意这两种分配的方法，有本质上的差别。 <br>
<br>
31、不要忽略Warning <br>
---------- <br>
对于一些编译时的警告信息，请不要忽视它们。虽然，这些Warning不会妨碍目标代码的生成，但这并不意味着你的程序就是好的。必竟，并不是编译成功的
程序才是正确的，编译成功只是万里长征的第一步，后面还有大风大浪在等着你。从编译程序开始，不但要改正每个error，还要修正每个warning。这
是一个有修养的程序员该做的事。 <br>
一般来说，一面的一些警告信息是常见的： <br>
　　1）声明了未使用的变量。（虽然编译器不会编译这种变量，但还是把它从源程序中注释或是删除吧） <br>
　　2）使用了隐晦声明的函数。（也许这个函数在别的C文件中，编译时会出现这种警告，你应该这使用之前使用extern关键字声明这个函数） <br>
　　3）没有转换一个指针。（例如malloc返回的指针是void的，你没有把之转成你实际类型而报警，还是手动的在之前明显的转换一下吧） <br>
　　4）类型向下转换。（例如：float f = 2.0; 这种语句是会报警告的，编译会告诉你正试图把一个double转成float，你正在阉割一个变量，你真的要这样做吗？还是在2.0后面加个f吧，不然，2.0就是一个double，而不是float了） <br>
　　 <br>
不管怎么说，编译器的Warning不要小视，最好不要忽略，一个程序都做得出来，何况几个小小的Warning呢？ <br>
<br>
32、书写Debug版和Release版的程序 <br>
---------------- <br>
程序在开发过程中必然有许多程序员加的调试信息。我见过许多项目组，当程序开发结束时，发动群众删除程序中的调试信息，何必呢？为什么不像VC++那样建
立两个版本的目标代码？一个是debug版本的，一个是Release版的。那些调试信息是那么的宝贵，在日后的维护过程中也是很宝贵的东西，怎么能说删
除就删除呢？ <br>
利用预编译技术吧，如下所示声明调试函数： <br>
　　#ifdef DEBUG <br>
　　　　void TRACE(char* fmt, ...) <br>
　　　　{ <br>
　　　　　　...... <br>
　　　　} <br>
　　#else <br>
　　　　#define TRACE(char* fmt, ...) <br>
　　#endif <br>
于是，让所有的程序都用TRACE输出调试信息，只需要在在编译时加上一个参数“-DDEBUG”，如： <br>
　　cc -DDEBUG -o target target.c <br>
于是，预编译器发现DEBUG变量被定义了，就会使用TRACE函数。而如果要发布给用户了，那么只需要把取消“-DDEBUG”的参数，于是所有用到
TRACE宏，这个宏什么都没有，所以源程序中的所有TRACE语言全部被替换成了空。一举两得，一箭双雕，何乐而不为呢？ <br>
顺便提一下，两个很有用的系统宏，一个是“__FILE__”，一个是“__LINE__”，分别表示，所在的源文件和行号，当你调试信息或是输出错误
时，可以使用这两个宏，让你一眼就能看出你的错误，出现在哪个文件的第几行中。这对于用C/C++做的大工程非常的管用。 <br>
<br>
综上所述32条，都是为了三大目的-- <br>
　　1、程序代码的易读性。 <br>
　　2、程序代码的可维护性， <br>
　　3、程序代码的稳定可靠性。 <br>
　　 <br>
有修养的程序员，就应该要学会写出这样的代码！这是任何一个想做编程高手所必需面对的细小的问题，编程高手不仅技术要强，基础要好，而且最重要的是要有“修养”！ <br>
好的软件产品绝不仅仅是技术，而更多的是整个软件的易维护和可靠性。　　 <br>
软件的维护有大量的工作量花在代码的维护上，软件的Upgrade，也有大量的工作花在代码的组织上，所以好的代码，清淅的，易读的代码，将给大大减少软件的维护和升级成本。]]></description>
</item><item>
<title><![CDATA[Setup Library wbemupgd.dll could not be loaded]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yach&amp;id=32304</link>
<author>yach</author>
<pubDate>2008/3/9 20:59:33</pubDate>
<description><![CDATA[
<DIV class=sbody>When you try to use <B>Add or Remove Programs</B> on a Microsoft Windows Server 2003-based computer, you may receive the following error message: 
<DIV class=errormsg>Setup Library wbemupgd.dll could not be loaded, or function OcEntry could not be found. Contact your system administrator. The specific error code is 0x7e.</DIV></DIV>
<H2 class=subTitle><A name=kb2>CAUSE</A></H2>
<DIV class=sbody>This problem occurs because the Path system variable has changed. </DIV>
<H2 class=subTitle><A name=kb3>RESOLUTION</A></H2>
<DIV class=sbody>To resolve this problem, follow these steps: 
<TABLE class=list>
<TBODY>
<TR>
<TD class=number>1.</TD>
<TD class=text>Click <STRONG class=uiterm>Start</STRONG>, right-click <STRONG class=uiterm>My Computer</STRONG>, and then click <STRONG class=uiterm>Properties</STRONG>. </TD></TR>
<TR>
<TD class=number>2.</TD>
<TD class=text>Click the <STRONG class=uiterm>Advanced</STRONG> tab, and then click <STRONG class=uiterm>Environment Variables</STRONG>. </TD></TR>
<TR>
<TD class=number>3.</TD>
<TD class=text>Click <STRONG class=uiterm>Path</STRONG> in the <STRONG class=uiterm>System variables</STRONG> list, and then click <STRONG class=uiterm>Edit</STRONG>. </TD></TR>
<TR>
<TD class=number><SUP>4.</SUP> </TD>
<TD class=text>Replace two of the paths in the <STRONG class=uiterm>Variable value</STRONG> box. To do this, follow these steps: 
<TABLE class=list>
<TBODY>
<TR>
<TD class=number>a. </TD>
<TD class=text>Delete the following two paths in the <STRONG class=uiterm>Variable value</STRONG> box: 
<DIV class=indent><STRONG class=uiterm>SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem</STRONG> </DIV></TD></TR>
<TR>
<TD class=number>b. </TD>
<TD class=text>Type the following text in the <STRONG class=uiterm>Variable value</STRONG> box to replace the paths that you removed in step 4a. <SPAN class=userInput>
<DIV class=indent><VAR>C</VAR>:\<VAR>Windows</VAR>\System32;<VAR>C</VAR>:\<VAR>Windows</VAR>\system32\Wbem </DIV></SPAN><B>Note </B><VAR>C</VAR> is the hard disk drive where Windows is installed, and <VAR>Windows</VAR> is the folder where Windows is installed</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></DIV>]]></description>
</item><item>
<title><![CDATA[Maven  2.08 安装]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yach&amp;id=32303</link>
<author>yach</author>
<pubDate>2008/3/9 19:58:02</pubDate>
<description><![CDATA[<A>　Ps:</A> 扔个图，玩appfuse 要用到<IMG style="WIDTH: 28px; HEIGHT: 16px" height=49 src="http://blogger.org.cn/blog/images/file/pic.gif" width=67 border=0><A href="http://blogger.org.cn/blog/uploadfile/20083920049585.PNG" target=_blank>mvn..PNG</A> <IMG style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://blogger.org.cn/blog/uploadfile/20083920049585.PNG" border=0>
<P><I>Maven&nbsp; is a Java tool, so you must have <A class=externalLink href="http://java.sun.com/">Java</A> installed in order to proceed.</I> </P>
<DIV class=section>
<H4>Windows 2000/XP</H4>
<OL type=1>
<LI>Unzip the distribution archive, i.e. <TT>apache-maven-2.0.8-bin.zip</TT> to the directory you wish to install Maven 2.0.8. These instructions assume you chose <TT>"C:\Program Files\Apache Software Foundation\"</TT> . The subdirectory <TT>apache-maven-2.0.8</TT> will be created from the archive.</LI>
<LI>Add the <TT>M2_HOME</TT> environment variable by opening up the system properties (WinKey + Pause), selecting the "Advanced" tab, and the "Environment Variables" button, then adding the <TT>M2_HOME</TT> variable in the user variables with the value <TT>"C:\Program Files\Apache Software Foundation\apache-maven-2.0.8"</TT> . <B>Note</B> : for Maven &lt; 2.0.9, be sure that the <TT>M2_HOME</TT> doesn't have a '\' as last character.</LI>
<LI>In the same dialog, add the <TT>M2</TT> environment variable in the user variables with the value <TT>"%M2_HOME%\bin"</TT> .</LI>
<LI><B>Optional</B> : in the same dialog, add the <TT>MAVEN_OPTS</TT> environment variable in the user variables to specify JVM properties, e.g. the value <TT>"-Xms256m -Xmx512m"</TT> . This environment variable can be used to supply extra options to Maven.</LI>
<LI>In the same dialog, update/create the <TT>Path</TT> environment variable in the user variables with the value <TT>"%M2%;%Path%"</TT> to add maven available in the command line.</LI>
<LI>In the same dialog, make sure that <TT>JAVA_HOME</TT> exists in your user variables or in the system variables and it is set to the location of your JDK, e.g. <TT>"C:\Program Files\Java\jdk1.5.0_02"</TT> and that <TT>"%JAVA_HOME%\bin"</TT> is in your <TT>Path</TT> environment variable.</LI>
<LI>Open a new command prompt (Winkey + R then type <TT>"cmd"</TT> ) and run <TT>"mvn --version"</TT> to verify that it is correctly installed.</LI></OL></DIV>
<DIV class=section>
<H4>Unix-based Operating Systems (Linux, Solaris and Mac OS X)</H4>
<OL type=1>
<LI>Extract the distribution archive, i.e. <TT>apache-maven-2.0.8-bin.tar.gz</TT> to the directory you wish to install Maven 2.0.8. These instructions assume you chose <TT>"/usr/local/apache-maven"</TT> . The subdirectory <TT>apache-maven-2.0.8</TT> will be created from the archive.</LI>
<LI>In a command terminal, add the <TT>M2_HOME</TT> environment variable, e.g. <TT>"export M2_HOME=/usr/local/apache-maven/apache-maven-2.0.8"</TT> .</LI>
<LI>Add the <TT>M2</TT> environment variable, e.g. <TT>"export M2=$M2_HOME/bin"</TT> .</LI>
<LI><B>Optional</B> : add the <TT>MAVEN_OPTS</TT> environment variable to specify JVM properties, e.g. <TT>"export MAVEN_OPTS=-Xms256m -Xmx512m"</TT> . This environment variable can be used to supply extra options to Maven.</LI>
<LI>Add <TT>M2</TT> environment variable to your path, e.g. <TT>"export PATH=$M2:$PATH"</TT> .</LI>
<LI>Make sure that <TT>JAVA_HOME</TT> is set to the location of your JDK, e.g. <TT>"export JAVA_HOME=/usr/java/jdk1.5.0_02"</TT> and that <TT>"$JAVA_HOME/bin"</TT> is in your <TT>PATH</TT> environment variable.</LI>
<LI>Run <TT>"mvn --version"</TT> to verify that it is correctly installed.</LI></OL></DIV>]]></description>
</item><item>
<title><![CDATA[Diskpart 系统自带分区工具]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yach&amp;id=32155</link>
<author>yach</author>
<pubDate>2008/3/3 22:51:50</pubDate>
<description><![CDATA[<a>ps：<br>分区魔术师可以丢了。nice <br>我把d ，e，f 合并了下。 极力推荐‘，看哪个图就会了。简单<br><br>安装了Windows Server 2003后，普通版本分区魔术师不能在其下正常运行，下面笔者论述一下分区解决方法。<br><br>　
　在Windows
XP/2003下有一个非常有用的命令提示符工具：Diskpart，利用它可实现对硬盘的分区管理，包括创建分区、删除分区、合并(扩展)分区，完全可
取代分区魔术师等第三方工具软件，它还有分区魔术师无法实现的功能，如设置动态磁盘、镜像卷等，而且设置 <br><br>分区后不用重启电脑也能生效。只不过它运行于命令提示符下，很多不熟悉Dos操作的朋友对它还不了解。其实，它的用法很简单，即使你没学过DOS，也能在帮助的指引下用好Diskpart。<br><br>　　一、初识Diskpart<br><br>　　本文中要用到的命令有：<br><br> Active：将一个分区标为 Aactive，让它成为系统盘。<br><br>　　Delete：删除分区。<br><br>　　Exit：退出Diskpart状态。<br><br>　　Extend：将分区的容量扩大。<br><br> Help：显示帮助信息。<br><br>　　List：列出磁盘或分区。<br><br>　　Select：选择要操作的对象，如一个磁盘或分区等。<br><br>　　二、小试Diskpart<br><br>　
　在“运行”后输入“Cmd”打开命令提示符窗口，再输入“Diskpart”即可启动它，此时屏上显示为“Diskpart&gt;”，不像普通的命令
提示符那样是一个分区或目录后跟一个“&gt;”，而且普通的DOS命令也无法在此运行，退出它只有输入“Exit”命令。从这三种迹象表明，它是一个集
成的环境，只有特定的命令可在其下执行。输入“Help”命令，屏上会列出所有的可执行命令及各命令的简要说明。<br><br>　　为打消大家对此命令的陌生感，让大家觉得这个命令很简单。下面就用实例进行说明。<br><br>　　输入“List”，屏上显示如图1所示，显然，它在提醒你，后跟“Disk”可显示出安装在PC上的磁盘列表，后跟“Partition”可显示出对应磁盘上的分区……<br><br><br>　输入“List Disk”，列出安装在PC上的硬盘列表，显然，我的电脑上安装了19GB、10GB的硬盘各一块。<br><br>　　输入“Select”可得到该命令的简要提示。<br><br>　输入“Select Disk 1”使第二块(图中显示为“硬盘1”，第一块显示为“磁盘0”)硬盘具有焦点属性。<br><br>　　再输入“List disk ”可看到，第二块硬盘前有一个“*”号，表示它具有焦点属性。<br><br>　　要注意的是：我们今后要输入的所有命令都只对具有焦点属性的对象起作用，也就是说，执行命令前都必须先指明对象，一方面使我们的操作更加有目的性，但另一方面，如果执行命令前指错了对象，可能造成无法挽回的损失，比如：误删分区等。<br><br>　　从以上例子可以看出，Diskpart的使用还是比较简单的，关键是它有很好的帮助与提示系统。就算你过去没学过Dos，也能在它的引导下完成各项操作。<br><br>　　三、实战Diskpart<br><br>　　1.添加一块硬盘进来<br><br>　　前面讲了，我有两块硬盘，现在就把第二块硬盘全部分区清除后再新建分区。建议大家也用一块新硬盘来做练习。<br><br>　　①输入“Select disk 1”使第二硬盘具有焦点属性。<br><br>　　②输入“Clean”清除第二硬盘。如图2所示。如果此时输入“List partition”命令可看到该硬盘上没有分区。<br><br>　　③输入“Create partition primary size=5000”,这个命令的作用是创建一个5000MB的主分区。如图2所示。如果没有参数“size=5000”，Diskpart将默认地将第二硬盘上的所有空间创建为一个主分区。<br><br>　
④输入“Create partition extende
size=3000”，这个命令的作用是创建一个3000MB的扩展分区。如果没有“Size”参数，Diskpart将默认地把剩余的全部空间创建为扩
展分区。与其它分区管理工具类似，“Size”后的值不能比剩余空间还大。<br><br> ⑤输入“Create partition primary ”将剩余的空间全部创建为主分区。<br><br>　　显然，用Diskpart也能创建多个主分区，而且也不一定要先建主分区再建军扩展分区。<br><br>　　⑥输入“Create partition logical size =2500”,将扩展分区中的2500MB空间创建为一个逻辑分区。再输入“Create partition”可将扩展分区中的剩余空间创建为第二逻辑分区。<br><br>　　要注意的是：逻辑分区只能在扩展分区中创建。也就是说，必须先建扩展分区再建逻辑分区。但建立主分区、扩展分区的顺序可任意。<br><br>　　关于Create命令，我们已在前几步中用过几次了，相信大家已有一定的感性认识。现给出完整的语法格式。<br><br>　　创建主分区：Create partition primary [size=n] [offset=n] [ID={byte|GUID}] [noerr]<br><br>　　创建扩展分区：Create partition extended [size=n] [offset=n] [noerr]<br><br>　　创建逻辑分区：Create partition logical [size=n] [offset=n] [noerr]<br><br>　　参数说明：Size后的n表示分区的容量，以MB为单位，如果省略则将所有可用空间用于创建，要注意的是创建逻辑分区时，只能是扩展分区中的有用空间。<br><br>　　Offset=n：仅应用于主启动记录(MBR)磁盘。<br><br>　　Noerr ：仅用于脚本。当发生错误时，指定 DiskPart 继续处理命令，就像没有发生错误一样。没有 Noerr 参数，错误将导致 DiskPart 以错误代码退出。<br><br>　　ID={byte|GUID}：只适用于原始设备制造商 (OEM)，本文中用不到。<br><br> ⑦输入“List partition”可查看到刚建立的所有分区，如果大家做一下加减法就会发现，所有的分区容量之和恰好等于第二硬盘的容量。观察图2还可看出，我们在前面输入的命令都生效了。<br><br>　　2.调整分区<br><br>　　在这里，我们要完成的任务是将刚建立的分区进行调整。<br><br> ①首先使第二硬盘具有焦点属性，再显示一下分区，这样做的目的是为了和后面调整后的分区进行比较，如图3所示。<br><br>　
　②输入“Select partition 3”使第3分区(2502MB的那个)，使该分区具有焦点属性。再输入“Delete
partition”即可删除该分区。请将图3第1、2两个“List partition”命令后的值进行比较，不难看出，原分区3确实已被删除了。<br><br>　　③输入“Select partition 1”使其具有焦点属性，再输入“Extend”，刚才被删除分区所空出来的未分配空间就能自动添加到第1分区中去。<br><br><img src="http://image.21tx.com/image/20041221/12121.jpg"><br><br>为
分区扩容，这可是分区魔术师的专利，“Diskpart”也能实现，看来，Windows server
2003不支持分区魔术师是有道理的。再输入“List partition”可观察到第1个分区的容量变化情况，请比较图3第1、3两个“List
partition”命令后的值，就能看出这一点。<br><br>说明：将带有焦点的分区扩展为最邻近的未分配空间时。对于普通分区，未分配的空间必须在同一磁盘上，并且必须接着带有焦点的分区。<br><br>　　如果要被扩容的分区是NTFS格式，扩容后不会丢失任何数据。如果是非 NTFS 的文件系统格式，此命令就会失败，但不会对分区作任何更改也不会破坏数据。<br><br>　　不能扩展当前系统分区或启动分区，也不能对包含页面文件的分区进行扩容。<br><br>　　语法：Extend [size=n]<br><br>　　参数说明： Size＝n ：添加到当前分区的空间大小 ?MB?。如果不指定大小，磁盘就扩展为占用所有最邻近的未分配空间。<br><br>　
　④不管对硬盘分区做了什么样的改动，包括创建、删除、扩容等，都用不着重新启动电脑即可生效(这是分区魔术师不能做到的)，但在“我的电脑”却看不到这
些分区，这是为什么呢，原来，还没为其指定驱动器号(也就是盘符)，怎样指定盘符呢？下面以为第一个分区指定盘符为例进行说明。<br><br>　　使第1个分区具有焦点属性，再输入命令“Assign”，Diskpart就会自动为其分配一个。当然也可用命令“Assign Letter=X”来手动指定，手动指定时，不能与已存在的盘符如C等相同。经过这样的处理后，就能在“我的电脑”下查看到这些分区了。<br><br>　　⑤现在，第二硬盘的第一分区还有焦点属性，可输入命令“Active”能使这一分区变为活动分区，也就能在其中安装操作系统了。<br><br>　　前面讲过，要执行任何命令，都必须先指定焦点，如果要将其它主分区处于活动状态，也必须先用“Select”选择它。<br><br>　　如果已在各主分区中独立安装了多套操作系统，可用这个命令来切换到不同的操作系统下。但要注意的是，如果为不包含操作系统启动文件的分区设置了“Active”属性，计算机将无法启动。<br><br>　　本例中，我的操作系统安装在第一硬盘的第2分区中，为保证电脑能正常启动，请将其设为活动。如图3下部所示。<br></a>]]></description>
</item><item>
<title><![CDATA[好久没来了]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yach&amp;id=31032</link>
<author>yach</author>
<pubDate>2008/1/4 18:33:21</pubDate>
<description><![CDATA[<a>　好久没来了 <br></a>]]></description>
</item><item>
<title><![CDATA[coLinux 安装 ，Debian 的网络设置2007-02-19 13:22 pcap-bridge: 网桥设置终于成功，参考 http://www.chaoyi.info/2min.html（上面有视频，呵呵）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yach&amp;id=22832</link>
<author>yach</author>
<pubDate>2007/2/24 0:05:19</pubDate>
<description><![CDATA[转载自: <A href="http://hi.baidu.com/yach/blog/item/1c30ac4b821ea5f082025ce5.html" target=_blank>http://hi.baidu.com/yach/blog/item/1c30ac4b821ea5f082025ce5.html</A><BR><BR>
<DIV class=tit>coLinux 安装 ，Debian 的网络设置</DIV>
<DIV class=date>2007-02-19 13:22</DIV>
<TABLE style="TABLE-LAYOUT: fixed">
<TBODY>
<TR>
<TD>
<DIV class=cnt>
<P>&nbsp;pcap-bridge:&nbsp;网桥设置终于成功，参考&nbsp;<A href="http://www.chaoyi.info/2min.html">http://www.chaoyi.info/2min.html</A>（上面有视频，呵呵）</P>
<DIV forimg="1"><IMG class=blogimg src="http://hiphotos.baidu.com/yach/pic/item/b69f55e72d4b8d2cb8382074.jpg" width=703 border=0 small="0"></DIV>
<P><BR>Debian&nbsp;的网络设置</P>
<P><BR>如果设成静态IP&nbsp;<BR></P><PRE>auto&nbsp;lo&nbsp;
iface&nbsp;lo&nbsp;inet&nbsp;loopback&nbsp;

auto&nbsp;eth0&nbsp;
iface&nbsp;eth0&nbsp;inet&nbsp;static&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;address&nbsp;192.168.0.5&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;netmask&nbsp;255.255.255.0&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gateway&nbsp;192.168.0.1</PRE>
<P><BR><BR><BR>如果设成DHCP<BR></P><PRE>auto&nbsp;lo&nbsp;
iface&nbsp;lo&nbsp;inet&nbsp;loopback&nbsp;

auto&nbsp;eth0&nbsp;
iface&nbsp;eth0&nbsp;inet&nbsp;dhcp</PRE>
<P><BR><BR>2.&nbsp;修改&nbsp;<SPAN style="COLOR: brown">/etc/resolv.conf</SPAN>&nbsp;<BR></P><PRE>search&nbsp;sample.com&nbsp;
nameserver&nbsp;211.129.14.138&nbsp;
nameserver&nbsp;211.129.12.47</PRE>
<P><BR><BR>3.&nbsp;设置apt源,&nbsp;修改&nbsp;<SPAN style="COLOR: brown">/etc/apt/sources.list</SPAN>&nbsp;<BR>例:<BR></P><PRE>#&nbsp;Debian&nbsp;\"Sarge\"&nbsp;(&gt;&nbsp;3.0)
#
deb&nbsp;http://ftp.us.debian.org/debian&nbsp;sarge&nbsp;main&nbsp;contrib&nbsp;non-free
deb-src&nbsp;http://ftp.us.debian.org/debian&nbsp;sarge&nbsp;main&nbsp;contrib&nbsp;non-free

#&nbsp;Debian&nbsp;\"unstable\"&nbsp;(\"Sid\"&nbsp;will&nbsp;always&nbsp;be&nbsp;unstable.)
#
#deb&nbsp;http://ftp.us.debian.org/debian&nbsp;unstable&nbsp;main&nbsp;contrib&nbsp;non-free
#deb-src&nbsp;http://ftp.us.debian.org/debian&nbsp;unstable&nbsp;main&nbsp;contrib&nbsp;non-free

#&nbsp;Debian&nbsp;\"Sid\"&nbsp;(&gt;&nbsp;3.0)
#
#deb&nbsp;http://ftp.us.debian.org/debian&nbsp;sid&nbsp;main&nbsp;contrib&nbsp;non-free
#deb-src&nbsp;http://ftp.us.debian.org/debian&nbsp;sid&nbsp;main&nbsp;contrib&nbsp;non-free</PRE>
<P>&nbsp;</P>
<P>//设置文件</P>
<P>initrd=initrd.gz<BR>kernel=vmlinux<BR>root=/dev/cobd0<BR>mem=256<BR>cobd0=G:\coLinux\root_fs<BR>codb1=G:\coLinux\swap_device<BR>eth0=pcap-bridge,"3",00:00:00:00:00:11<BR></P>
<P>;***************************************</P>
<P><FONT color=#ff0000>ps:0.7.1&nbsp;取消了xml的设置，通过@xxx来&nbsp;</FONT></P>
<P><FONT color=#ff0000></FONT></P>
<P><FONT color=#ff0000>initrd=initrd.gz<BR>kernel=vmlinux<BR>root=/dev/cobd0<BR>mem=128<BR>cobd0=G:\coLinux\root_fs<BR>cobd1=G:\coLinux\swap_device<BR>eth0=tuntap,"Tap"<BR>；**********************</FONT></P>
<P>主要是xml的设置了（0.6.4）</P>
<P><?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?><BR><COLINUX><BR>&nbsp;&nbsp;&nbsp;&nbsp;<?xml:namespace prefix = block_device&nbsp;index="0"&nbsp;path="\DosDevices\i /><block_device&nbsp;index="0"&nbsp;path="\DosDevices\i:\coLinux\root_fs"&nbsp;enabled="true"&nbsp;></block_device&nbsp;index="0"&nbsp;path="\DosDevices\i:\coLinux\root_fs"&nbsp;enabled="true"&nbsp;><BR>&nbsp;&nbsp;&nbsp;&nbsp;<?xml:namespace prefix = block_device&nbsp;index="1"&nbsp;path="\DosDevices\i /><block_device&nbsp;index="1"&nbsp;path="\DosDevices\i:\coLinux\swap_device"&nbsp;enabled="true"&nbsp;></block_device&nbsp;index="1"&nbsp;path="\DosDevices\i:\coLinux\swap_device"&nbsp;enabled="true"&nbsp;><BR>&nbsp;&nbsp;&nbsp;&nbsp;<?xml:namespace prefix = block_device&nbsp;index="2"&nbsp;path="\DosDevices\i /><block_device&nbsp;index="2"&nbsp;path="\DosDevices\i:\coLinux\initrd"&nbsp;enabled="true"&nbsp;></block_device&nbsp;index="2"&nbsp;path="\DosDevices\i:\coLinux\initrd"&nbsp;enabled="true"&nbsp;><BR>&nbsp;&nbsp;&nbsp;&nbsp;<?xml:namespace prefix = block_device&nbsp;index="3"&nbsp;path="\DosDevices\i /><block_device&nbsp;index="3"&nbsp;path="\DosDevices\i:\coLinux\debian-31r2-i386-businesscard.iso"&nbsp;enabled="true"&nbsp;></block_device&nbsp;index="3"&nbsp;path="\DosDevices\i:\coLinux\debian-31r2-i386-businesscard.iso"&nbsp;enabled="true"&nbsp;>&nbsp;</P>
<P>&nbsp;<!--initrd&nbsp;是coLinux&nbsp;目录initrd.gz&nbsp;解压缩出来的--><BR>&nbsp;&nbsp;&nbsp;&nbsp;<BOOTPARAMS>root=/dev/cobd2&nbsp;devfs=mount,dall</BOOTPARAMS><BR>&nbsp;&nbsp;&nbsp;&nbsp;<INITRD&nbsp;PATH="INITRD.GZ"&nbsp; /><BR>&nbsp;&nbsp;&nbsp;&nbsp;<IMAGE&nbsp;PATH="VMLINUX"&nbsp; /><BR>&nbsp;&nbsp;&nbsp;&nbsp;<MEMORY&nbsp;SIZE="128"&nbsp; /><BR>&nbsp;&nbsp;&nbsp;&nbsp;<!--&nbsp;我是adsl&nbsp;拨号上网（就是拨号连接里面设置下共享上网）&nbsp;把本地连接2（不一定是本地连接2，就是装colinux以后多出的连接）名字改成Tap&nbsp;ok&nbsp;了，&nbsp;网桥没成功过--><BR>&nbsp;&nbsp;&nbsp;&nbsp;<NETWORK&nbsp;INDEX="0"&nbsp;TYPE="TAP"&nbsp;NAME="TAP" /><BR></COLINUX><BR><!--&nbsp;&nbsp;xml&nbsp;不要记事本打开<BR>写个批，保存成start.bat(我觉得不不加-t&nbsp;nt&nbsp;好)</P>
<P>"colinux-daemon.exe"&nbsp;-c&nbsp;Preinstall_debian.xml&nbsp;</P>
<P>差不多了，我还没装完（等下补充下，尴尬）</P>
<P>参考&nbsp;台湾人的教程&nbsp;<A 
href="http://studftp.stut.edu.tw/~m9335203/colinux/colinux.html"><FONT 
color=#800080>http://studftp.stut.edu.tw/~m9335203/colinux/colinux.html</FONT></A>&nbsp;&nbsp;--></P>
<DIV align=center forimg="1"><IMG class=blogimg src="http://hiphotos.baidu.com/yach/pic/item/f9db5fdfd11cb51148540347.jpg" width=703 border=0 small="0"></DIV></DIV></TD></TR></TBODY></TABLE><BR>]]></description>
</item><item>
<title><![CDATA[在Linux下产生并调试core文件]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yach&amp;id=22810</link>
<author>yach</author>
<pubDate>2007/2/21 20:33:22</pubDate>
<description><![CDATA[转载自: <A href="http://blog.china-pub.com/more.asp?name=uniware&amp;id=35478" target=_blank>http://blog.china-pub.com/more.asp?name=uniware&amp;id=35478</A><BR><BR>
<P>先看看我用的是个什么机器：</P>
<P>$ uname -a<BR>Linux dev 2.4.21-9.30AXsmp #1 SMP Wed May 26 23:37:09 EDT 2004 i686 i686 i386 GNU/Linux</P>
<P>再看看默认的一些参数，注意core file size是个0，程序出错时不会产生core文件了。</P>
<P>$ ulimit -a<BR><SPAN class=style2>core file size (blocks, -c) 0</SPAN><BR>data seg size (kbytes, -d) unlimited<BR>file size (blocks, -f) unlimited<BR>max locked memory (kbytes, -l) 4<BR>max memory size (kbytes, -m) unlimited<BR>open files (-n) 2048<BR>pipe size (512 bytes, -p) 8<BR>stack size (kbytes, -s) 10240<BR>cpu time (seconds, -t) unlimited<BR>max user processes (-u) 7168<BR>virtual memory (kbytes, -v) unlimited</P>
<P>写个简单的程序，看看core文件是不是会被产生。</P>
<P>$ more foo.c</P>
<P>#include <STDIO.H></P>
<P>static void sub(void);</P>
<P>int main(void)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;sub();<BR>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<BR>}</P>
<P>static void sub(void)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;int *p = NULL;</P>
<P><SPAN class=style2>&nbsp;&nbsp;&nbsp;&nbsp;/* derefernce a null pointer, expect core dump. */<BR>&nbsp;&nbsp;&nbsp;&nbsp;printf("%d", *p);</SPAN><BR>}</P>
<P>$ gcc -Wall -g foo.c<BR>$ ./a.out<BR><SPAN class=style2>Segmentation fault</SPAN></P>
<P>$ ls -l core.*<BR><SPAN class=style2>ls: core.*: No such file or directory</SPAN></P>
<P>没有找到core文件，我们改改ulimit的设置，让它产生。1024是随便取的，要是core文件大于1024个块，就产生不出来了。</P>
<P>$ ulimit -c 1024</P>
<P>$ ulimit -a<BR><SPAN class=style2>core file size (blocks, -c) 1024</SPAN><BR>data seg size (kbytes, -d) unlimited<BR>file size (blocks, -f) unlimited<BR>max locked memory (kbytes, -l) 4<BR>max memory size (kbytes, -m) unlimited<BR>open files (-n) 2048<BR>pipe size (512 bytes, -p) 8<BR>stack size (kbytes, -s) 10240<BR>cpu time (seconds, -t) unlimited<BR>max user processes (-u) 7168<BR>virtual memory (kbytes, -v) unlimited</P>
<P>$ ./a.out<BR><SPAN class=style2>Segmentation fault (core dumped)</SPAN><BR>$ ls -l core.*<BR><SPAN class=style2>-rw------- 1 uniware uniware 53248 Jun 30 17:10 core.9128</SPAN></P>
<P>注意看上述的输出信息，多了个<SPAN class=style2>(core dumped)</SPAN>。确实产生了一个core文件，9128是该进程的PID。我们用GDB来看看这个core。</P>
<P>$ <SPAN class=style2>gdb --core=core.9128</SPAN><BR>GNU gdb Asianux (6.0post-0.20040223.17.1AX)<BR>Copyright 2004 Free Software Foundation, Inc.<BR>GDB is free software, covered by the GNU General Public License, and you are<BR>welcome to change it and/or distribute copies of it under certain conditions.<BR>Type "show copying" to see the conditions.<BR>There is absolutely no warranty for GDB. Type "show warranty" for details.<BR>This GDB was configured as "i386-asianux-linux-gnu".<BR>Core was generated by `./a.out'.<BR>Program terminated with signal 11, Segmentation fault.<BR>#0 0x08048373 in ?? ()<BR>(gdb) <SPAN class=style2>bt</SPAN><BR>#0 0x08048373 in ?? ()<BR>#1 0xbfffd8f8 in ?? ()<BR>#2 0x0804839e in ?? ()<BR>#3 0xb74cc6b3 in ?? ()<BR>#4 0x00000000 in ?? ()<BR><BR>此时用bt看不到<SPAN class=style2>b</SPAN>ack<SPAN class=style2>t</SPAN>race，也就是调用堆栈，原来GDB还不知道符号信息在哪里。我们告诉它一下：</P>
<P>(gdb)<SPAN class=style2> file ./a.out</SPAN><BR>Reading symbols from ./a.out...done.<BR>Using host libthread_db library "/lib/tls/libthread_db.so.1".<BR>(gdb) <SPAN class=style2>bt</SPAN><BR><SPAN class=style2>#0 0x08048373 in sub () at foo.c:17<BR>#1 0x08048359 in main () at foo.c:8</SPAN><BR><BR>此时backtrace出来了。</P>
<P>(gdb) l<BR><SPAN class=style2>8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sub();</SPAN><BR>9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<BR>10&nbsp;&nbsp;&nbsp;&nbsp; }<BR>11<BR>12 &nbsp;&nbsp;&nbsp;&nbsp;static void sub(void)<BR>13 &nbsp;&nbsp;&nbsp;&nbsp;{<BR>14 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *p = NULL;<BR>15<BR>16 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* derefernce a null pointer, expect core dump. */<BR><SPAN class=style2>17 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d", *p);</SPAN><BR>(gdb)</P>]]></description>
</item><item>
<title><![CDATA[Java的继承性和多态（java 训练营）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yach&amp;id=21027</link>
<author>yach</author>
<pubDate>2006/12/24 17:20:59</pubDate>
<description><![CDATA[
<P>　<FONT color=#808080>001</FONT>&nbsp;&nbsp;Java的继承性和多态<BR><FONT color=#808080>002</FONT>&nbsp;<FONT color=#f73809>ps :上课没认真听，下午好痛苦！~</FONT><BR><FONT color=#808080>003</FONT>&nbsp;&nbsp;目标<BR><FONT color=#808080>004</FONT>&nbsp;&nbsp;<BR><FONT color=#808080>005</FONT>&nbsp;&nbsp;掌握类继承的概念<BR><FONT color=#808080>006</FONT>&nbsp;&nbsp;熟练进行面向对象的设计<BR><FONT color=#808080>007</FONT>&nbsp;&nbsp;了解抽象类的概念<BR><FONT color=#808080>008</FONT>&nbsp;&nbsp;了解Final类的概念<BR><FONT color=#808080>009</FONT>&nbsp;&nbsp;<BR><FONT color=#808080>010</FONT>&nbsp;&nbsp;要点<BR><FONT color=#808080>011</FONT>&nbsp;&nbsp;<BR><FONT color=#808080>012</FONT>&nbsp;&nbsp;理解继承<BR><FONT color=#808080>013</FONT>&nbsp;&nbsp;类&nbsp;jave.lang.Object<BR><FONT color=#808080>014</FONT>&nbsp;&nbsp;final类和方法<BR><FONT color=#808080>015</FONT>&nbsp;&nbsp;abstract类和方法<BR><FONT color=#808080>016</FONT>&nbsp;&nbsp;<BR><FONT color=#808080>017</FONT>&nbsp;&nbsp;<BR><FONT color=#808080>018</FONT>&nbsp;&nbsp;运行时多态&nbsp;exp1:<BR><FONT color=#808080>019</FONT>&nbsp;&nbsp;<BR><FONT color=#808080>020</FONT>&nbsp;&nbsp;<FONT color=#0000ff>class</FONT>&nbsp;A&nbsp;{<BR><FONT color=#808080>021</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>void</FONT>&nbsp;callme()&nbsp;{<BR><FONT color=#808080>022</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<FONT color=#ff00ff>"Inside&nbsp;A's&nbsp;callme()&nbsp;method"</FONT>);<BR><FONT color=#808080>023</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR><FONT color=#808080>024</FONT>&nbsp;&nbsp;}<BR><FONT color=#808080>025</FONT>&nbsp;&nbsp;<FONT color=#0000ff>class</FONT>&nbsp;B&nbsp;extends&nbsp;A&nbsp;{<BR><FONT color=#808080>026</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>void</FONT>&nbsp;callme()&nbsp;{<BR><FONT color=#808080>027</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<FONT color=#ff00ff>"Inside&nbsp;B's&nbsp;callme()&nbsp;method"</FONT>);<BR><FONT color=#808080>028</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR><FONT color=#808080>029</FONT>&nbsp;&nbsp;}<BR><FONT color=#808080>030</FONT>&nbsp;&nbsp;<FONT color=#0000ff>public</FONT>&nbsp;<FONT color=#0000ff>class</FONT>&nbsp;Dispatch&nbsp;{<BR><FONT color=#808080>031</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>public</FONT>&nbsp;<FONT color=#0000ff>static</FONT>&nbsp;<FONT color=#0000ff>void</FONT>&nbsp;main(<FONT color=#0000ff>String</FONT>&nbsp;[]&nbsp;args)&nbsp;{<BR><FONT color=#808080>032</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;a&nbsp;=&nbsp;<FONT color=#0000ff>new</FONT>&nbsp;B();<BR><FONT color=#808080>033</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.callme();<BR><FONT color=#808080>034</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<BR><FONT color=#808080>035</FONT>&nbsp;&nbsp;}<BR><FONT color=#808080>036</FONT>&nbsp;&nbsp;<FONT color=#008000>/**<BR><FONT color=#808080>037</FONT>&nbsp;&nbsp;<BR><FONT color=#808080>038</FONT>&nbsp;&nbsp;F:\yach\test\lesson5&gt;javac&nbsp;Dispatch.java<BR><FONT color=#808080>039</FONT>&nbsp;&nbsp;<BR><FONT color=#808080>040</FONT>&nbsp;&nbsp;F:\yach\test\lesson5&gt;java&nbsp;Dispatch<BR><FONT color=#808080>041</FONT>&nbsp;&nbsp;Inside&nbsp;B's&nbsp;callme()&nbsp;method<BR><FONT color=#808080>042</FONT>&nbsp;&nbsp;<BR><FONT color=#808080>043</FONT>&nbsp;&nbsp;F:\yach\test\lesson5&gt;&nbsp;*/</FONT><BR><FONT color=#808080>044</FONT>&nbsp;&nbsp;<BR><FONT color=#808080>045</FONT>&nbsp;&nbsp;<BR><FONT color=#808080>046</FONT>&nbsp;&nbsp;instanceof&nbsp;exp&nbsp;<BR><FONT color=#808080>047</FONT>&nbsp;&nbsp;ps：我自己想的，不知道对不对，&nbsp;上课没认真听^^.<BR><FONT color=#808080>048</FONT>&nbsp;&nbsp;<BR><FONT color=#808080>049</FONT>&nbsp;&nbsp;<BR><FONT color=#808080>050</FONT>&nbsp;&nbsp;<BR><FONT color=#808080>051</FONT>&nbsp;&nbsp;<BR><FONT color=#808080>052</FONT>&nbsp;&nbsp;<FONT color=#008000>/////////////////////////////////////////////////////////</FONT><BR><FONT color=#808080>053</FONT>&nbsp;&nbsp;<FONT color=#0000ff>public</FONT>&nbsp;<FONT color=#0000ff>class</FONT>&nbsp;Employee&nbsp;&nbsp;{<BR><FONT color=#808080>054</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>public</FONT>&nbsp;<FONT color=#0000ff>void</FONT>&nbsp;show()&nbsp;{<BR><FONT color=#808080>055</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<FONT color=#ff00ff>"Employee"</FONT>);<BR><FONT color=#808080>056</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR><FONT color=#808080>057</FONT>&nbsp;&nbsp;}<BR><FONT color=#808080>058</FONT>&nbsp;&nbsp;<BR><FONT color=#808080>059</FONT>&nbsp;&nbsp;<FONT color=#008000>/////////////////////////////////////////////////////////</FONT><BR><FONT color=#808080>060</FONT>&nbsp;&nbsp;<FONT color=#0000ff>public</FONT>&nbsp;<FONT color=#0000ff>class</FONT>&nbsp;Manager&nbsp;extends&nbsp;Employee&nbsp;{<BR><FONT color=#808080>061</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>public</FONT>&nbsp;<FONT color=#0000ff>void</FONT>&nbsp;show(){<BR><FONT color=#808080>062</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<FONT color=#ff00ff>"Manager&nbsp;show"</FONT>);<BR><FONT color=#808080>063</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR><FONT color=#808080>064</FONT>&nbsp;&nbsp;}<BR><FONT color=#808080>065</FONT>&nbsp;&nbsp;<FONT color=#008000>/////////////////////////////////////////////////////////</FONT><BR><FONT color=#808080>066</FONT>&nbsp;&nbsp;<FONT color=#0000ff>public</FONT>&nbsp;<FONT color=#0000ff>class</FONT>&nbsp;Engineer&nbsp;extends&nbsp;Employee&nbsp;{<BR><FONT color=#808080>067</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>public</FONT>&nbsp;<FONT color=#0000ff>void</FONT>&nbsp;show&nbsp;()&nbsp;{<BR><FONT color=#808080>068</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<FONT color=#ff00ff>"Engineer&nbsp;"</FONT>);<BR><FONT color=#808080>069</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR><FONT color=#808080>070</FONT>&nbsp;&nbsp;}<BR><FONT color=#808080>071</FONT>&nbsp;&nbsp;<FONT color=#008000>/////////////////////////////////////////////////////////</FONT><BR><FONT color=#808080>072</FONT>&nbsp;&nbsp;<FONT color=#0000ff>public</FONT>&nbsp;<FONT color=#0000ff>class</FONT>&nbsp;TestInstanceof&nbsp;{<BR><FONT color=#808080>073</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>public</FONT>&nbsp;<FONT color=#0000ff>void</FONT>&nbsp;doSomething(Employee&nbsp;e)&nbsp;{<BR><FONT color=#808080>074</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>if</FONT>(e&nbsp;instanceof&nbsp;Manager)&nbsp;&nbsp;&nbsp;&nbsp;<BR><FONT color=#808080>075</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e&nbsp;+&nbsp;<FONT color=#ff00ff>"@@@@&nbsp;is&nbsp;Manager"</FONT>);<BR><FONT color=#808080>076</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>else</FONT>&nbsp;<FONT color=#0000ff>if</FONT>&nbsp;&nbsp;(e&nbsp;instanceof&nbsp;Engineer)<BR><FONT color=#808080>077</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e&nbsp;+&nbsp;<FONT color=#ff00ff>"****&nbsp;is&nbsp;Engineer"</FONT>);<BR><FONT color=#808080>078</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>else</FONT>&nbsp;<BR><FONT color=#808080>079</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e&nbsp;+&nbsp;<FONT color=#ff00ff>"&amp;&amp;&amp;&amp;&nbsp;is&nbsp;Employee"</FONT>);<BR><FONT color=#808080>080</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR><FONT color=#808080>081</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>void</FONT>&nbsp;printClassName(Object&nbsp;obj)&nbsp;{<BR><FONT color=#808080>082</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<FONT color=#ff00ff>"This&nbsp;Object&nbsp;name&nbsp;is&nbsp;"</FONT>&nbsp;+&nbsp;obj.getClass().getName());<BR><FONT color=#808080>083</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR><FONT color=#808080>084</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>public</FONT>&nbsp;<FONT color=#0000ff>static</FONT>&nbsp;<FONT color=#0000ff>void</FONT>&nbsp;main(<FONT color=#0000ff>String</FONT>&nbsp;[]&nbsp;args)&nbsp;{<BR><FONT color=#808080>085</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Employee&nbsp;e1&nbsp;=&nbsp;<FONT color=#0000ff>new</FONT>&nbsp;Employee();<BR><FONT color=#808080>086</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Manager&nbsp;m1&nbsp;=&nbsp;<FONT color=#0000ff>new</FONT>&nbsp;Manager();<BR><FONT color=#808080>087</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Engineer&nbsp;en1&nbsp;=&nbsp;<FONT color=#0000ff>new</FONT>&nbsp;Engineer();<BR><FONT color=#808080>088</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TestInstanceof&nbsp;ti&nbsp;=&nbsp;<FONT color=#0000ff>new</FONT>&nbsp;TestInstanceof();<BR><FONT color=#808080>089</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ti.printClassName(e1);<BR><FONT color=#808080>090</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ti.doSomething(e1);<BR><FONT color=#808080>091</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ti.printClassName(en1);<BR><FONT color=#808080>092</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ti.doSomething(en1);<BR><FONT color=#808080>093</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ti.printClassName(m1);<BR><FONT color=#808080>094</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ti.doSomething(m1);<BR><FONT color=#808080>095</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><FONT color=#808080>096</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR><FONT color=#808080>097</FONT>&nbsp;&nbsp;}<BR><FONT color=#808080>098</FONT>&nbsp;&nbsp;<BR><FONT color=#808080>099</FONT>&nbsp;&nbsp;<BR><FONT color=#808080>100</FONT>&nbsp;&nbsp;<FONT color=#008000>//</FONT><BR><FONT color=#808080>101</FONT>&nbsp;&nbsp;<FONT color=#008000>////&nbsp;&nbsp;final&nbsp;exp&nbsp;,</FONT><BR><FONT color=#808080>102</FONT>&nbsp;&nbsp;<FONT color=#008000>//</FONT><BR><FONT color=#808080>103</FONT>&nbsp;&nbsp;<FONT color=#0000ff>class</FONT>&nbsp;Value&nbsp;{<BR><FONT color=#808080>104</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>int</FONT>&nbsp;i&nbsp;=&nbsp;1&nbsp;;<BR><FONT color=#808080>105</FONT>&nbsp;&nbsp;}<BR><FONT color=#808080>106</FONT>&nbsp;&nbsp;<BR><FONT color=#808080>107</FONT>&nbsp;&nbsp;<FONT color=#0000ff>public</FONT>&nbsp;<FONT color=#0000ff>class</FONT>&nbsp;FinalData&nbsp;{<BR><FONT color=#808080>108</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;<FONT color=#0000ff>int</FONT>&nbsp;i1&nbsp;=&nbsp;9&nbsp;;<BR><FONT color=#808080>109</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>static</FONT>&nbsp;final&nbsp;<FONT color=#0000ff>int</FONT>&nbsp;I2&nbsp;=&nbsp;99;<BR><FONT color=#808080>110</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>public</FONT>&nbsp;<FONT color=#0000ff>static</FONT>&nbsp;&nbsp;final&nbsp;<FONT color=#0000ff>int</FONT>&nbsp;I3&nbsp;=&nbsp;39;<BR><FONT color=#808080>111</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Value&nbsp;v1&nbsp;=&nbsp;<FONT color=#0000ff>new</FONT>&nbsp;Value();<BR><FONT color=#808080>112</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;Value&nbsp;v2&nbsp;=&nbsp;<FONT color=#0000ff>new</FONT>&nbsp;Value();<BR><FONT color=#808080>113</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>static</FONT>&nbsp;final&nbsp;Value&nbsp;v3&nbsp;=&nbsp;<FONT color=#0000ff>new</FONT>&nbsp;Value();<BR><FONT color=#808080>114</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;<FONT color=#0000ff>int</FONT>&nbsp;i4&nbsp;=&nbsp;(<FONT color=#0000ff>int</FONT>)(Math.random()&nbsp;*&nbsp;20);<BR><FONT color=#808080>115</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>static</FONT>&nbsp;final&nbsp;<FONT color=#0000ff>int</FONT>&nbsp;i5&nbsp;=&nbsp;(<FONT color=#0000ff>int</FONT>)(Math.random()&nbsp;*&nbsp;20);&nbsp;<BR><FONT color=#808080>116</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;<FONT color=#0000ff>int</FONT>&nbsp;[]&nbsp;a&nbsp;=&nbsp;{1,2,3,&nbsp;4,&nbsp;5,&nbsp;6};<BR><FONT color=#808080>117</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>public</FONT>&nbsp;<FONT color=#0000ff>void</FONT>&nbsp;print(<FONT color=#0000ff>String</FONT>&nbsp;id)&nbsp;{<BR><FONT color=#808080>118</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<BR><FONT color=#808080>119</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;+&nbsp;<FONT color=#ff00ff>":"</FONT>&nbsp;+&nbsp;<FONT color=#ff00ff>"i4="</FONT>&nbsp;+&nbsp;i4&nbsp;+&nbsp;<FONT color=#ff00ff>"i5="</FONT>&nbsp;+&nbsp;i5&nbsp;);<BR><FONT color=#808080>120</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR><FONT color=#808080>121</FONT>&nbsp;&nbsp;<FONT color=#0000ff>public</FONT>&nbsp;<FONT color=#0000ff>static</FONT>&nbsp;<FONT color=#0000ff>void</FONT>&nbsp;main(<FONT color=#0000ff>String</FONT>[]&nbsp;args)&nbsp;{<BR><FONT color=#808080>122</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FinalData&nbsp;fd1&nbsp;=&nbsp;<FONT color=#0000ff>new</FONT>&nbsp;FinalData();<BR><FONT color=#808080>123</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><FONT color=#808080>124</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#008000>/**<BR><FONT color=#808080>125</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fd1.i1&nbsp;++;<BR><FONT color=#808080>126</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fd1.v2&nbsp;=&nbsp;new&nbsp;Value();&nbsp;&nbsp;&nbsp;&nbsp;<BR><FONT color=#808080>127</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><FONT color=#808080>128</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;F:\yach\test\lesson5&gt;javac&nbsp;FinalData.java<BR><FONT color=#808080>129</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FinalData.java:16:&nbsp;无法为最终变量&nbsp;i1&nbsp;指定值<BR><FONT color=#808080>130</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fd1.i1&nbsp;++;<BR><FONT color=#808080>131</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^<BR><FONT color=#808080>132</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FinalData.java:17:&nbsp;无法为最终变量&nbsp;v2&nbsp;指定值<BR><FONT color=#808080>133</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fd1.v2&nbsp;=&nbsp;new&nbsp;Value();<BR><FONT color=#808080>134</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^<BR><FONT color=#808080>135</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;错误*/</FONT><BR><FONT color=#808080>136</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#008000>//fd1.v3&nbsp;=&nbsp;new&nbsp;Value();</FONT><BR><FONT color=#808080>137</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fd1.print(<FONT color=#ff00ff>"fd1"</FONT>);<BR><FONT color=#808080>138</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<FONT color=#ff00ff>"Createing&nbsp;new&nbsp;final"</FONT>);<BR><FONT color=#808080>139</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FinalData&nbsp;fd2&nbsp;=&nbsp;<FONT color=#0000ff>new</FONT>&nbsp;FinalData();<BR><FONT color=#808080>140</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fd1.print(<FONT color=#ff00ff>"fd1"</FONT>);<BR><FONT color=#808080>141</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fd2.print(<FONT color=#ff00ff>"fd2"</FONT>);<BR><FONT color=#808080>142</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#008000>/**<BR><FONT color=#808080>143</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;F:\yach\test\lesson5&gt;java&nbsp;FinalData<BR><FONT color=#808080>144</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fd1:i4=16i5=16<BR><FONT color=#808080>145</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Createing&nbsp;new&nbsp;final<BR><FONT color=#808080>146</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fd1:i4=16i5=16<BR><FONT color=#808080>147</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fd2:i4=2i5=16<BR><FONT color=#808080>148</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</FONT><BR><FONT color=#808080>149</FONT>&nbsp;&nbsp;}<BR><FONT color=#808080>150</FONT>&nbsp;&nbsp;}<BR><FONT color=#808080>151</FONT>&nbsp;&nbsp;<BR><FONT color=#808080>152</FONT>&nbsp;&nbsp;抽象类&nbsp;abstact&nbsp;<BR><FONT color=#808080>153</FONT>&nbsp;&nbsp;<FONT color=#008000>///////////////////////////////////////</FONT><BR><FONT color=#808080>154</FONT>&nbsp;&nbsp;abstract&nbsp;<FONT color=#0000ff>class</FONT>&nbsp;Point&nbsp;{<BR><FONT color=#808080>155</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>int</FONT>&nbsp;x&nbsp;=&nbsp;1;<BR><FONT color=#808080>156</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>int</FONT>&nbsp;y&nbsp;=&nbsp;1;<BR><FONT color=#808080>157</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>void</FONT>&nbsp;move(<FONT color=#0000ff>int</FONT>&nbsp;<FONT color=#808000>dx</FONT>,&nbsp;<FONT color=#0000ff>int</FONT>&nbsp;dy)&nbsp;{<BR><FONT color=#808080>158</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;+=&nbsp;<FONT color=#808000>dx</FONT>;<BR><FONT color=#808080>159</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;+=&nbsp;dy;<BR><FONT color=#808080>160</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert();<BR><FONT color=#808080>161</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR><FONT color=#808080>162</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;abstract&nbsp;<FONT color=#0000ff>void</FONT>&nbsp;alert();<BR><FONT color=#808080>163</FONT>&nbsp;&nbsp;}<BR><FONT color=#808080>164</FONT>&nbsp;&nbsp;<BR><FONT color=#808080>165</FONT>&nbsp;&nbsp;<FONT color=#008000>////////////////////////////////////////</FONT><BR><FONT color=#808080>166</FONT>&nbsp;&nbsp;<FONT color=#0000ff>public</FONT>&nbsp;<FONT color=#0000ff>class</FONT>&nbsp;SimplePoint&nbsp;extends&nbsp;Point&nbsp;{<BR><FONT color=#808080>167</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>public</FONT>&nbsp;<FONT color=#0000ff>void</FONT>&nbsp;alert()&nbsp;{<BR><FONT color=#808080>168</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(this.x&nbsp;+&nbsp;&nbsp;<FONT color=#ff00ff>"*************"</FONT>&nbsp;+&nbsp;this.y);<BR><FONT color=#808080>169</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR><FONT color=#808080>170</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>public</FONT>&nbsp;<FONT color=#0000ff>static</FONT>&nbsp;<FONT color=#0000ff>void</FONT>&nbsp;main(<FONT color=#0000ff>String</FONT>&nbsp;[]&nbsp;args)&nbsp;{<BR><FONT color=#808080>171</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;p&nbsp;=&nbsp;<FONT color=#0000ff>new</FONT>&nbsp;SimplePoint();<BR><FONT color=#808080>172</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.move(1,&nbsp;2);<BR><FONT color=#808080>173</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR><FONT color=#808080>174</FONT>&nbsp;&nbsp;}</P>]]></description>
</item><item>
<title><![CDATA[guestbook.xml]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yach&amp;id=20642</link>
<author>yach</author>
<pubDate>2006/12/10 15:59:25</pubDate>
<description><![CDATA[<BR>guestbook.xml<BR><BR>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="gb2312"?&gt;<BR>&lt;留言本&gt;<BR>&lt;留言记录&gt;<BR>　&lt;留言者姓名&gt;孟宪会&lt;/留言者姓名&gt;<BR>　&lt;电子邮件&gt;amxh@testDomain.com&lt;/电子邮件&gt;<BR>　&lt;网址&gt;http://go.163.com/~colorweb&lt;/网址&gt;<BR>　&lt;留言内容&gt;测试成功！！&lt;/留言内容&gt;<BR>&lt;/留言记录&gt;<BR>&lt;/留言本&gt;<BR><BR><BR>guestbook.asp<BR><BR>&lt;%@Language="VBScript"%&gt;<BR>&lt;%<BR>'设置Web页面的信息<BR>Response.Buffer&nbsp;=&nbsp;true<BR>Response.Expires&nbsp;=&nbsp;-1<BR><BR>'显示留言函数init()<BR>Function&nbsp;init()<BR>entryForm()<BR><BR>'定义局部变量<BR>Dim&nbsp;objXML<BR>Dim&nbsp;arrNames<BR>Dim&nbsp;arrEmails<BR>Dim&nbsp;arrURLS<BR>Dim&nbsp;arrMessages<BR><BR>'创建XMLDOM文档对象，用来存放留言<BR>Set&nbsp;objXML&nbsp;=&nbsp;server.createObject("Msxml2.DOMDocument")<BR>objXML.async&nbsp;=&nbsp;false<BR>objXML.load(server.MapPath("guestbook.xml"))<BR><BR>'取得留言本各元素的集合<BR>Set&nbsp;arrNames&nbsp;=&nbsp;objXML.getElementsByTagName("留言者姓名")<BR>Set&nbsp;arrEmails&nbsp;=&nbsp;objXML.getElementsByTagName("电子邮件")<BR>Set&nbsp;arrURLS&nbsp;=&nbsp;objXML.getElementsByTagName("网址")<BR>Set&nbsp;arrMessages&nbsp;=&nbsp;objXML.getElementsByTagName("留言内容")<BR><BR>Response.Write&nbsp;"&lt;table&nbsp;border='0'&nbsp;width='100%'&gt;"<BR>Response.Write&nbsp;"&lt;tr&gt;&lt;td&nbsp;bgcolor='#00CCFF'&nbsp;align='center'&nbsp;height='26'&gt;"<BR>Response.Write&nbsp;"&lt;b&gt;各位的留言如下：&lt;/b&gt;"<BR>Response.Write&nbsp;"&lt;/td&gt;&lt;/tr&gt;"<BR><BR>'输出留言本各元素的内容，最新的留言先显示<BR>For&nbsp;x=arrNames.length-1&nbsp;To&nbsp;0&nbsp;Step&nbsp;-1<BR>　Response.Write&nbsp;"&lt;tr&gt;&lt;td&gt;&lt;a&nbsp;href=mailto:"&nbsp;&amp;&nbsp;arrEmails.item(x).text&nbsp;&amp;&nbsp;"&gt;"&nbsp;&amp;&nbsp;arrNames.item(x).text&nbsp;&amp;&nbsp;"&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;"<BR>　Response.Write&nbsp;"&lt;tr&gt;&lt;td&gt;网址：&lt;a&nbsp;href="&nbsp;&amp;&nbsp;arrURLS.item(x).text&nbsp;&amp;&nbsp;"&nbsp;target='_blank'&gt;"&nbsp;&amp;&nbsp;arrURLS.item(x).text&nbsp;&amp;&nbsp;"&lt;/a&gt;&lt;td&gt;&lt;/tr&gt;"<BR>　Response.Write&nbsp;"&lt;tr&gt;&lt;td&gt;留言内容：&lt;/td&gt;&lt;/tr&gt;"<BR>　Response.Write&nbsp;"&lt;tr&gt;&lt;td&nbsp;bgcolor='#0099ff'&gt;"&nbsp;&amp;&nbsp;arrMessages.item(x).text&nbsp;&amp;"&lt;/td&gt;&lt;/tr&gt;"<BR>　Response.Write&nbsp;"&lt;tr&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;"<BR>Next<BR><BR>Response.Write&nbsp;"&lt;/table&gt;"<BR>Set&nbsp;objXML&nbsp;=&nbsp;nothing<BR>End&nbsp;Function<BR><BR>'向XML文件添加留言记录的函数addEntry()<BR>Function&nbsp;addEntry()<BR><BR>'定义局部变量<BR>Dim&nbsp;strName<BR>Dim&nbsp;strEmail<BR>Dim&nbsp;strURL<BR>Dim&nbsp;strMessage<BR><BR>'取得留言表单的输入内容<BR>strName&nbsp;=&nbsp;Request.Form("姓名")<BR>strEmail&nbsp;=&nbsp;Request.Form("电子邮件")<BR>strURL&nbsp;=&nbsp;Request.Form("网址")<BR>strMessage&nbsp;=&nbsp;Request.Form("留言")<BR><BR>Dim&nbsp;objXML<BR>Dim&nbsp;objEntry<BR>Dim&nbsp;objName<BR>Dim&nbsp;objEmail<BR>Dim&nbsp;objURL<BR>Dim&nbsp;objMessage<BR><BR>'向XML文件添加留言内容<BR>Set&nbsp;objXML&nbsp;=&nbsp;server.createObject("Msxml2.DOMDocument")<BR>objXML.async&nbsp;=&nbsp;false<BR>objXML.load(server.MapPath("guestbook.xml"))<BR><BR>Set&nbsp;objEntry&nbsp;=&nbsp;objXML.createNode("element",&nbsp;"留言记录",&nbsp;"")<BR>objXML.documentElement.appendChild(objEntry)<BR><BR>Set&nbsp;objName&nbsp;=&nbsp;objXML.createNode("element",&nbsp;"留言者姓名",&nbsp;"")<BR>objEntry.appendChild(objName)<BR>objName.text&nbsp;=&nbsp;strName<BR>　<BR>Set&nbsp;objEmail&nbsp;=&nbsp;objXML.createNode("element",&nbsp;"电子邮件",&nbsp;"")<BR>objEntry.appendChild(objEmail)<BR>objEmail.text&nbsp;=&nbsp;strEmail<BR>　<BR>Set&nbsp;objURL&nbsp;=&nbsp;objXML.createNode("element",&nbsp;"网址",&nbsp;"")<BR>objEntry.appendChild(objURL)<BR>objURL.text&nbsp;=&nbsp;strURL<BR>　<BR>Set&nbsp;objMessage&nbsp;=&nbsp;objXML.createNode("element",&nbsp;"留言内容",&nbsp;"")<BR>objEntry.appendChild(objMessage)<BR>objMessage.text&nbsp;=&nbsp;strMessage<BR><BR>objXML.save(server.MapPath("guestbook.xml"))<BR><BR>Response.Redirect("guestbook.asp")<BR><BR>End&nbsp;function<BR><BR>'填写和发送留言表单的函数entryForm()<BR>Function&nbsp;entryForm()<BR><BR>　Response.Write&nbsp;"&lt;p&nbsp;align='center'&gt;&lt;b&gt;XML&nbsp;留言本&nbsp;例子&lt;/b&gt;&lt;/p&gt;"<BR>　Response.Write&nbsp;"&lt;hr&nbsp;color='#000099'&nbsp;width='100%'&nbsp;noshade&gt;"<BR>　Response.Write&nbsp;"&lt;form&nbsp;action=guestbook.asp?action=addEntry&nbsp;method=post&gt;"<BR>　Response.Write&nbsp;"&lt;table&nbsp;border=1&gt;"<BR>　Response.Write&nbsp;"&lt;tr&gt;&lt;td&gt;您的姓名：&lt;/td&gt;&lt;td&gt;&lt;input&nbsp;type=text&nbsp;name=姓名&nbsp;/&gt;&lt;/td&gt;&lt;/tr&gt;"<BR>　Response.Write&nbsp;"&lt;tr&gt;&lt;td&gt;电子邮件：&lt;/td&gt;&lt;td&gt;&lt;input&nbsp;type=text&nbsp;name=电子邮件&nbsp;/&gt;&lt;/td&gt;&lt;/tr&gt;"<BR>　Response.Write&nbsp;"&lt;tr&gt;&lt;td&gt;您的网址：&lt;/td&gt;&lt;td&gt;&lt;input&nbsp;type=text&nbsp;name=网址&nbsp;/&gt;&lt;/td&gt;&lt;/tr&gt;"<BR>　Response.Write&nbsp;"&lt;tr&gt;&lt;td&gt;您的留言：&lt;/td&gt;&lt;td&gt;&lt;textarea&nbsp;name=留言&nbsp;cols=40&nbsp;rows=5&gt;&lt;/textarea&gt;&lt;/td&gt;&lt;/tr&gt;"<BR>　Response.Write&nbsp;"&lt;tr&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&lt;input&nbsp;type=submit&nbsp;value=发布留言&nbsp;/&gt;&lt;/td&gt;&lt;/tr&gt;"<BR>　Response.Write&nbsp;"&lt;/table&gt;"<BR>　Response.Write&nbsp;"&lt;/form&gt;"<BR><BR>End&nbsp;Function<BR>%&gt;<BR>&lt;html&gt;<BR>&lt;head&gt;<BR>&lt;title&gt;XML&nbsp;留言例子&lt;/title&gt;<BR>&lt;meta&nbsp;http-equiv="Content-Type"&nbsp;content="text/html;&nbsp;charset=gb2312"&gt;<BR>&lt;/head&gt;<BR>&lt;body&gt;<BR>&lt;%<BR>'判断是否发送了留言，并更新留言信息<BR>Dim&nbsp;a<BR>a&nbsp;=&nbsp;Request.Querystring("action")<BR>If&nbsp;a&lt;&gt;""&nbsp;Then<BR>addEntry<BR>else<BR>init<BR>End&nbsp;If<BR>%&gt;<BR>&lt;/body&gt;<BR>&lt;/html&gt;<BR>]]></description>
</item><item>
<title><![CDATA[解开QQ能上，网页无法打开之谜]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yach&amp;id=20641</link>
<author>yach</author>
<pubDate>2006/12/10 15:44:56</pubDate>
<description><![CDATA[<P>许多上网的朋友都碰到过这样的问题，QQ能正常登陆聊天，但是网页就是打不开，头疼死了。是网络故障，还是IE浏览器有问题，或者是中了病毒？……今天就为大家解决无法浏览网页的问题，对症下药，重现网页吧！ <BR>&nbsp;&nbsp;&nbsp; 莫名出现的“代理”</P>
<P>　　代理服务器是好东西，许多不能上的网或者速度慢的网，经过代理一下，就能上了，而且速度快上很多。但是有时凭空出现的代理反而会让网页无法打开。笔者就碰到过好几例因为代理设置不当造成无法上网的故障。</P>
<P>　　打开IE浏览器，点击菜单“工具/Internet选项”，打开选项设置对话框。选择“连接”选项卡，点击“局域网设置”按钮，打开局域网设置。如果勾选了“为LAN使用代理服务器”项，并设置了代理服务器的话，将该项取消（如图1）。点击确定，重开IE，就可以正常浏览网页了。</P>
<P>&nbsp;<IMG onmousewheel="return bbimg(this)" height=304 src="http://cnxhacker.net/Article/UploadFiles/200611/20061126105441159.jpg" width=447 onload=javascript:resizepic(this) border=0></P>
<P>&nbsp;</P>
<P>图1 取消代理服务器设置</P>
<P>　　小提示：在使用其它浏览器，如Maxthon时，也可能会出现代理问题而无法浏览网页的情况。可点击菜单“选项/代理服务器”，勾选其中的“不使用代理”。</P>
<P>DNS服务解析大剖析</P>
<P>　　安装宽带后自己进行过网络设置的朋友，应该都知道DNS服务器的重要性，DNS担负着将网站地址变换为IP地址重任，如果DNS解析过程中出现了故障，那么网站将无法访问。在笔者碰到过的无法浏览网页的事例中，也有这样的情况。</P>
<P>　　首先，可在“运行”中输入“cmd”，回车后打开命令提示符窗口。随便PING一下某个网站，如“nslookup www.baidu.com”，如果返回的信息是“Default Server:UnKnown”，那么可以肯定是DNS服务器设置出了问题。可在当前命令行下执行命令：“server 202.98.192.168”</P>
<P>　　即可重设DNS服务器，这里的“202.98.192.168”是本地的DNS服务器，可改为自己所在地的DNS服务器(具体值可打询问当地网络服务商)。如果更改DNS服务器后，还是无法浏览网页，那么就不是本地设置的问题，而是网络服务商的问题了。</P>
<P>&nbsp;&nbsp;&nbsp; 赶走病毒和流氓软件</P>
<P>　　如果系统中进驻了病毒或者流氓软件，也可能会导致IE浏览器无法打开网页。例如前一段时间，笔者帮朋友解决了好几例类似的问题，都是由于一款叫“roogoo.com”广告流氓软件引起的网络故障。往往都是用杀毒软件删除了一个名为“roogoo.com”的流氓软件后就无法上网，经笔者检测发现，该病毒会破坏XP系统中的“Winsock.dll”和“wsock32.dll”文件，该文件是用于Winsock协议的。只有对网络协议进行恢复，才能上网。</P>
<P>　　运行Winsock协议修复工具“Winsock Fix”，运行后点击“Fix”按钮（如图2），即可完成修复，重启系统后网络就可正常浏览网页了。如果还是不行的话，可能是另外一些网络系统文件给破坏了，可在命令行下输入命令：“SFC /SCANNOW”按提示插入系统安装光盘完成修复即可。</P>
<P><IMG onmousewheel="return bbimg(this)" height=169 src="http://cnxhacker.net/Article/UploadFiles/200611/20061126105442544.jpg" width=311 onload=javascript:resizepic(this) border=0></P>
<P>图2 修复系统文件</P>
<P>&nbsp;&nbsp;&nbsp; IE出错，殃及网页</P>
<P>　　有一些恶意网站会非法修改用户的系统设置，破坏IE浏览器，造成网页无法正常浏览。当碰到不能正常打开网页时，排除了DNS服务器、代理设置不当，以及网络协议的问题，可以尝试更换其它非IE核心的浏览器，例如Maxthon、Firefox之类的，如果能正常上网，那么肯定是IE出了问题。</P>
<P>　　在windows XP中，默认状态是无法重装IE的，可按如下方法进行修复：首先准备好Windows XP安装光盘，插入光驱，在“开始/运行”窗口输入“rundll32.exe setupapi,InstallHinfSection DefaultInstall 132 %windir%\Inf\ie.inf”命令，回车后即可重装IE。</P>
<P>　　也可以打开“注册表编辑器”，展开[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Active Setup\Installed&lt;BR&gt;Components\{89820200-ECBD-11cf-8B85-00AA005B4383}]，将IsInstalled 的DWORD 值改为0 就可以从“添加删除程序”中重装IE了。</P>
<P>&nbsp;防火墙阻挡</P>
<P>　　有时候IE无法浏览网页，也有可能是防火墙阻止了IE进程连接网络。例如笔者就亲自碰到过这样的问题，在笔者的电脑上安装了Outpost防火墙，该防火墙功能非常强大，会自动阻止一些特殊的木马通过IE连接网络。如果无法浏览网页，可以尝试关闭防火墙监控，如果能正常打开网页，那么需要对防火墙进行设置，放IE通行网络：</P>
<P>　　一般可打开网络防火墙的连接设置框，在网络黑名单或拦截程序中找到IE，将其删除，或者移动到可信任程序列表中（如图3）。IE就可以正常浏览网页了。</P>
<P><IMG onmousewheel="return bbimg(this)" height=435 src="http://cnxhacker.net/Article/UploadFiles/200611/20061126105442396.jpg" width=447 onload=javascript:resizepic(this) border=0></P>
<P>图3 防火墙设置</P>]]></description>
</item>
</channel>
</rss>