﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-bbming</title><link>http://www.cnitblog.com/bbming/</link><description /><language>zh-cn</language><lastBuildDate>Wed, 29 Apr 2026 10:10:14 GMT</lastBuildDate><pubDate>Wed, 29 Apr 2026 10:10:14 GMT</pubDate><ttl>60</ttl><item><title>转 加菲猫语录</title><link>http://www.cnitblog.com/bbming/archive/2007/07/14/29832.html</link><dc:creator>老Ming</dc:creator><author>老Ming</author><pubDate>Sat, 14 Jul 2007 09:25:00 GMT</pubDate><guid>http://www.cnitblog.com/bbming/archive/2007/07/14/29832.html</guid><wfw:comment>http://www.cnitblog.com/bbming/comments/29832.html</wfw:comment><comments>http://www.cnitblog.com/bbming/archive/2007/07/14/29832.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/bbming/comments/commentRss/29832.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/bbming/services/trackbacks/29832.html</trackback:ping><description><![CDATA[<p><br>Money is not everything. There\'s Mastercard &amp; Visa.<br>钞票不是万能的,有时还需要信用卡.<br><br>One should love animals. They are so tasty.<br>每个人都应该热爱动物,因为它们很好吃.<br><br>Save water. Shower with your girlfriend.<br>要节约用水,尽量和女友一起洗澡.<br><br>Love the neighbor. But don&#8217;t get caught.<br>要用心去爱你的邻居,不过不要让她的老公知道. <br><br>Behind every successful man, there is a man. And behind every unsuccessful man, there are two.<br>每个成功男人的背后,都有一个女人. 每个不成功男人的背后, 都有两个.<br><br>Every man should marry. After all, happiness is not the only thing in life.<br>再快乐的单身汉迟早也会结婚,幸福不是永久的嘛.<br><br>The wise never marry, And when they marry they become otherwise.<br>聪明人都是未婚的,结婚的人很难再聪明起来.<br><br>Success is a relative term. It brings so many relatives.<br>成功是一个相关名词,他会给你带来很多不相关的亲戚(联系).<br><br>Never put off the work till tomorrow what you can put off today.<br>不要等明天交不上差再找借口,今天就要找好.<br><br>Love is photogenic. It needs darkness to develop.<br>爱情就象照片,需要大量的暗房时间来培养.<br><br>Children in backseats cause accidents. Accidents in backseats cause children.<br>后排座位上的小孩会生出意外,后排座位上的意外会生出小孩.<br><br>&#8220;Your future depends on your dreams.&#8220; So go to sleep.<br>&#8220;现在的梦想决定着你的将来&#8221;,所以还是再睡一会吧.<br><br>There should be a better way to start a day than waking up every morning.<br>应该有更好的方式开始新一天,而不是千篇一律的在每个上午都醒来.<br><br>&#8220;Hard work never killed anybody.&#8220; But why take the risk?<br>努力工作不会导致死亡!不过我不会用自己去证明.<br><br>&#8220;Work fascinates me.&#8220; I can look at it for hours!<br>工作好有意思耶!尤其是看着别人工作.<br><br>God made relatives; Thank God we can choose our friends.<br>神决定了谁是你的亲戚,幸运的是在选择朋友方面他给了你留了余地.<br><br>When two&#8217;s company, three&#8217;s the result!<br>两个人的状态是不稳定的,三个人才是!<br><br>A dress is like a barbed fence. It protects the premises without restricting the view.<br>服饰就象铁丝网,它阻止你冒然行动但并不妨碍你尽情的观看.<br><br>The more you learn, the more you know, The more you know, the more you forget.The more you forget, the less you know. So why bother to learn.<br>学的越多,知道的越多,知道的越多,忘记的越多,忘记的越多,知道的越少,为什么学来着.</p>
<img src ="http://www.cnitblog.com/bbming/aggbug/29832.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/bbming/" target="_blank">老Ming</a> 2007-07-14 17:25 <a href="http://www.cnitblog.com/bbming/archive/2007/07/14/29832.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2006年第二学期开放英语4形成性参考答案</title><link>http://www.cnitblog.com/bbming/archive/2007/05/29/27755.html</link><dc:creator>老Ming</dc:creator><author>老Ming</author><pubDate>Tue, 29 May 2007 15:58:00 GMT</pubDate><guid>http://www.cnitblog.com/bbming/archive/2007/05/29/27755.html</guid><wfw:comment>http://www.cnitblog.com/bbming/comments/27755.html</wfw:comment><comments>http://www.cnitblog.com/bbming/archive/2007/05/29/27755.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnitblog.com/bbming/comments/commentRss/27755.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/bbming/services/trackbacks/27755.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">形考册第一次作业答案<span lang=EN-US><br></span>第一部分：交际用语（每题<span lang=EN-US>2</span>分，共<span lang=EN-US>10</span>分）<span lang=EN-US><br>1</span>－<span lang=EN-US>5</span>小题：阅读下面的小对话，从<span lang=EN-US>A</span>、<span lang=EN-US>B</span>、<span lang=EN-US>C</span>、<span lang=EN-US>D</span>四个选项中选出一个能填入空白处的最佳选项，并在答题纸上写出所选的字母符号。<span lang=EN-US><br>1</span>．<span lang=EN-US>&nbsp; &nbsp; B&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;2. B&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;3.C&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;4. B&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;5.A<br></span>第二部分： 词汇与结构（每题<span lang=EN-US>1</span>分，共<span lang=EN-US>15</span>分）<span lang=EN-US><br>6―20</span>小题：阅读下面的句子，从<span lang=EN-US>A</span>、<span lang=EN-US>B</span>、<span lang=EN-US>C</span>、<span lang=EN-US>D</span>四个选项中选出一个能填入空白处的最佳选项，并在答题纸上写出所选的字母符号。<span lang=EN-US><br>6. A&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;7. C&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;8. B&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;9. D&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;10. B&nbsp;&nbsp;<br>11. C&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;12. B&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;13. B&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;14. C&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;15. C<br>16. A&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;17. B&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;18. D&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;19. C&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;20. C<br></span>第三部分：完形填空（每题<span lang=EN-US>2</span>分，共<span lang=EN-US>20</span>分）<span lang=EN-US><br>21―30</span>小题：阅读下面的短文，从短文后所给的<span lang=EN-US>A</span>、<span lang=EN-US>B</span>、<span lang=EN-US>C</span>、<span lang=EN-US>D</span>四个选项中选出能填入相应空白处的最佳选项，并在答题纸上写出所选的字母符号。<span lang=EN-US><br>21. A&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;22. C&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;23. B&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;24. B&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;25. C&nbsp; &nbsp;<br>26. C&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;27. C&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;28. D&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;29. B&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;30. D&nbsp; &nbsp;<br></span>第四部分：阅读理解（每题<span lang=EN-US>2</span>分，共<span lang=EN-US>40</span>分）<span lang=EN-US><br>31―45</span>小题：阅读下列短文，从<span lang=EN-US>A</span>、<span lang=EN-US>B</span>、<span lang=EN-US>C</span>、<span lang=EN-US>D</span>四个选项中选出一个正确答案，并在答题纸上写出所选的字母符号。<span lang=EN-US><br></span>短文理解<span lang=EN-US>1<br>31.B&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;32. B&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;33. A&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;34. B&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;35. D<br></span>短文理解<span lang=EN-US>2<br>36. D&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 37. A&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;38. B&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;39. B&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;40.D<br></span>短文理解<span lang=EN-US>3<br>41. A&nbsp; &nbsp;&nbsp; &nbsp; 42. D&nbsp; &nbsp;&nbsp; &nbsp; 43. C&nbsp; &nbsp;&nbsp; &nbsp; 44. B&nbsp; &nbsp;&nbsp; &nbsp; 45. A<br>46</span>－<span lang=EN-US>50</span>小题：阅读下列短文，并根据短文内容判断其后的句子是否正确（<span lang=EN-US>T</span>）、错误（<span lang=EN-US>F</span>），还是文字中没有涉及相关信息（<span lang=EN-US>NG</span>）。<span lang=EN-US><br>46. F&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;47. T&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 48. T&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;49. NG&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 50.F<br></span>第五部分<span lang=EN-US>:</span>书面表达<span lang=EN-US>(15</span>分<span lang=EN-US>)</span>：<span lang=EN-US><br>1</span>、评分原则<span lang=EN-US><br>(1) </span>本题总分为<span lang=EN-US>15</span>分<span lang=EN-US>, </span>按<span lang=EN-US>5</span>个档次给分。<span lang=EN-US><br>&nbsp;&nbsp;(2) </span>评分时<span lang=EN-US>,</span>先根据文章的内容和语言初步确定其档次<span lang=EN-US>,</span>然后以该档次的要求来衡量、确定或调整档次<span lang=EN-US>, </span>最后给分。<span lang=EN-US><br>&nbsp;&nbsp;(3) </span>字数少于<span lang=EN-US>50</span>的<span lang=EN-US>(</span>不包括所给句子和标点符号<span lang=EN-US>)</span>从总分中减去<span lang=EN-US>1</span>分。<span lang=EN-US><br>&nbsp;&nbsp;(4) </span>评分时应注意的主要内容为<span lang=EN-US>:</span>内容要点、句型变化、运用词汇和语法结构的准确性。<span lang=EN-US><br>&nbsp;&nbsp;(5) </span>评分时<span lang=EN-US>, </span>如拼写错误较多<span lang=EN-US>, </span>书写较差<span lang=EN-US>, </span>以至影响交际<span lang=EN-US>, </span>将分数降低一个档次。<span lang=EN-US><br>2</span>、参考范文<span lang=EN-US><br>338 Shennan Road<br>Wuzhou Hotel<br>Futian District<br>Shenzhen , 518008<br>June 17 , 2004<br>Dear Sir,<br></span></span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">I have read your advertisement in China Daily of June 16 and I want to get the position of the typist very much.<br>I am 18. I have just finished a one-year training course at <st1:place w:st="on"><st1:placename w:st="on">Beliva</st1:placename> <st1:placename w:st="on">Typing</st1:placename> <st1:placetype w:st="on">School</st1:placetype></st1:place> and my speed of typing is 100 letters a minute.<br>You can get some information about my work from the school. I&#8217;ll be available&nbsp;&nbsp;at any time for an interview or a test.<br></span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; Yours faithfully<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Li Yan<br><br></span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">形考册第二次作业答案<span lang=EN-US><br><br></span>参考答案及评分标准<span lang=EN-US><br></span>第一部分：交际用语（每题<span lang=EN-US>2</span>分，共<span lang=EN-US>10</span>分）<span lang=EN-US><br>1</span>－<span lang=EN-US>5</span>小题：阅读下面的小对话，从<span lang=EN-US>A</span>、<span lang=EN-US>B</span>、<span lang=EN-US>C</span>、<span lang=EN-US>D</span>四个选项中选出一个能填入空白处的最佳选项，并在答题纸上写出所选的字母符号。<span lang=EN-US><br>1. C 2. A 3.B 4. C 5.C<br></span>第二部分： 词汇与结构（每题<span lang=EN-US>1</span>分，共<span lang=EN-US>15</span>分）<span lang=EN-US><br>6―20</span>小题：阅读下面的句子，从<span lang=EN-US>A</span>、<span lang=EN-US>B</span>、<span lang=EN-US>C</span>、<span lang=EN-US>D</span>四个选项中选出一个能填入空白处的最佳选项，并在答题纸上写出所选的字母符号。<span lang=EN-US><br>6. C 7. C 8. A 9. C 10. B<br>11. B 12. B 13. A 14. B 15. C<br>16. A 17. B 18. C 19. D 20. A<br></span>第三部分：完形填空（每题<span lang=EN-US>2</span>分，共<span lang=EN-US>20</span>分）<span lang=EN-US><br>21―30</span>小题：阅读下面的短文，从短文后所给的<span lang=EN-US>A</span>、<span lang=EN-US>B</span>、<span lang=EN-US>C</span>、<span lang=EN-US>D</span>四个选项中选出能填入相应空白处的最佳选项，并在答题纸上写出所选的字母符号。<span lang=EN-US><br>21. B 22. C 23. A 24. B 25. D<br>26. B 27. D 28. C 29. C 30. D<br></span>第四部分：阅读理解（每题<span lang=EN-US>2</span>分，共<span lang=EN-US>40</span>分）<span lang=EN-US><br>31―45</span>小题：阅读下列短文，从<span lang=EN-US>A</span>、<span lang=EN-US>B</span>、<span lang=EN-US>C</span>、<span lang=EN-US>D</span>四个选项中选出一个正确答案，并在答题纸上写出所选的字母符号。<span lang=EN-US><br></span>短文理解<span lang=EN-US>1<br>31.A 32. C 33. D 34. A 35. B<br></span>短文理解<span lang=EN-US>2<br>36. D 37. C 38. B 39. B 40.A<br></span>短文理解<span lang=EN-US>3<br>41. C 42. D 43. D 44. A 45. A<br>46</span>－<span lang=EN-US>50</span>小题：阅读下列短文，并根据短文内容判断其后的句子是否正确（<span lang=EN-US>T</span>）、错误（<span lang=EN-US>F</span>），还是文字中没有涉及相关信息（<span lang=EN-US>NG</span>）。<span lang=EN-US><br></span>短文理解<span lang=EN-US>4<br>46T 47NG 48F 49F 50T<br></span>第五部分<span lang=EN-US>:</span>书面表达<span lang=EN-US>(15</span>分<span lang=EN-US>)</span>：<span lang=EN-US><br>1</span>、评分原则<span lang=EN-US><br>(1) </span>本题总分为<span lang=EN-US>15</span>分<span lang=EN-US>, </span>按<span lang=EN-US>5</span>个档次给分。<span lang=EN-US><br>(2) </span>评分时<span lang=EN-US>,</span>先根据文章的内容和语言初步确定其档次<span lang=EN-US>,</span>然后以该档次的要求来衡量、确定或调整档次<span lang=EN-US>, </span>最后给分。<span lang=EN-US><br>(3) </span>字数少于<span lang=EN-US>50</span>的<span lang=EN-US>(</span>不包括所给句子和标点符号<span lang=EN-US>)</span>从总分中减去<span lang=EN-US>1</span>分。<span lang=EN-US><br>(4) </span>评分时应注意的主要内容为<span lang=EN-US>:</span>内容要点、句型变化、运用词汇和语法结构的准确性。<span lang=EN-US><br>(5) </span>评分时<span lang=EN-US>, </span>如拼写错误较多<span lang=EN-US>, </span>书写较差<span lang=EN-US>, </span>以至影响交际<span lang=EN-US>, </span>将分数降低一个档次。<span lang=EN-US><br>2</span>、参考范文<span lang=EN-US><br>Traffic Accidents in City A<br>Traffic accidents have become more serious in City A , and more people are injured and even killed in the accidents every year. </span></span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">Take the above chart as an example . In the only six months from July to December , 2002 , 17,600 people were injured and 3,900 people lost their lives in the traffic accidents . If you take a careful look at the chart and study the figures, you will find that the number of the people injured in the traffic accidents in City A has been doubled over nearly half a year. There were 2,000 people injured in July while in December the number of the injured went up to 4,200.There was an increase of 110% ! As for the people killed in the accidents, in July , the figure was only 300 , but in December it rose to 1,200 , which was three times as big as it was in July . So the traffic problem has become a big headache for the city government .<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<img src ="http://www.cnitblog.com/bbming/aggbug/27755.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/bbming/" target="_blank">老Ming</a> 2007-05-29 23:58 <a href="http://www.cnitblog.com/bbming/archive/2007/05/29/27755.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 一个LINUX狂人的语录</title><link>http://www.cnitblog.com/bbming/archive/2007/05/01/26551.html</link><dc:creator>老Ming</dc:creator><author>老Ming</author><pubDate>Tue, 01 May 2007 00:34:00 GMT</pubDate><guid>http://www.cnitblog.com/bbming/archive/2007/05/01/26551.html</guid><wfw:comment>http://www.cnitblog.com/bbming/comments/26551.html</wfw:comment><comments>http://www.cnitblog.com/bbming/archive/2007/05/01/26551.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/bbming/comments/commentRss/26551.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/bbming/services/trackbacks/26551.html</trackback:ping><description><![CDATA[我已经半年没有使用 Windows 的方式工作了。Linux 高效的完成了我所有的工作。<br>&nbsp; &nbsp;GNU/Linux 不是每个人都想用的。如果你只需要处理一般的事务，打游戏，那么你不需要了解下面这些了。<br>&nbsp; &nbsp;我不是一个狂热的自由软件份子，虽然我很喜欢自由软件。这篇文章也不是用来推行自由软件运动的，虽然我觉得自由软件运动是非常好的。<br>&nbsp; &nbsp;这篇文章也不是用来比较 Linux 和 Windows 内核效率，文件系统，网络服务的。我现在是作为一个用户而不是一个开发者来说话的，我们的讨论是基于操作，应用层面的。是为了告诉大学里还不了解，或者不理解UNIX 的科学工作者和大学生，UNIX 比 Windows 更适合用于科学研究工作，请大家理解 UNIX 的工作方式，不要用 Windows 的标准来要求 Linux，而要用一个科学工作者的标准来要求自己，用UNIX 的思想来武装自己。<br>&nbsp; &nbsp; 我显然是反对在大学，特别是理工科专业推广 Windows 的。我也反对在对"娃娃"们的计算机启蒙教育中使用 Windows。因为 Windows 不论从技术上，经济上，思想风格上都是与我们培养高科技人才的目标格格不入的。Windows 的流行属于历史遗留问题，爷爷一级的人当然已经不可救药，但是我们不应该让下一代继续走上歧途。<br>&nbsp; &nbsp;&nbsp;&nbsp;UNIX 不是计算机专家的专利<br>&nbsp; &nbsp;&nbsp;&nbsp;当我建议一些非计算机专业的人用 Linux 的时候，很多人说："UNIX 是计算机系的人用的，我们不能理解。" "UNIX 是男孩用的，我们女孩不用。"<br>&nbsp; &nbsp;&nbsp;&nbsp;但是其实世界上的大多数科学家和工程师几乎用的都是 UNIX 作为他们的电脑工具。就因为它简单，可靠，稳定，强大，有趣。甚至很多时候 UNIX 就是唯一的选择。<br>&nbsp; &nbsp;&nbsp;&nbsp;你说："我们都会用 UNIX 的话，你们计算机专业的人还用来干什么？" <br>&nbsp; &nbsp;&nbsp;&nbsp;很容幸的告诉你，计算机专业的有一部分人就是专门为你们提供这样强大而方便的计算机工具的。如果他们制造的工具只有自己会用的话，那这个工具还有什么用？<br>&nbsp; &nbsp;&nbsp;&nbsp;理解 GNU/Linux 不要用 Windows 的标准来要求 Linux。<br>&nbsp; &nbsp;&nbsp;&nbsp;由于GNU/Linux这个词太长，下面如果没有特别指明，"Linux"就是指GNU/Linux"。<br>&nbsp; &nbsp;&nbsp;&nbsp;在这个年代，恐怕没有人需要我来介绍 Linux 是什么了吧？如果你觉得"Linux 只不过是跟 DOS 差不多的东西"，那请问问你旁边的 <br>&nbsp; &nbsp;&nbsp;&nbsp;Linux 用户，Linux 到底是什么？<br>&nbsp; &nbsp;&nbsp;&nbsp;那为什么我还要写一篇这样的文章？因为，我发现还有很多人不不理解 Linux 和 UNIX，虽然他们也在用它，但是他们有时会问："为什么 Linux 不能像 Windows 那样 &#8230;&#8230;？"，"怎么Redhat Linux不能 mount NTFS 分区！"，"Linux 下用什么整理硬盘？"，"什么时候OpenOffice才能完全兼容Word文件啊？"，"现在还有什么Windows能干的事情Linux干不了的？"&#8230;&#8230;<br>&nbsp; &nbsp;&nbsp;&nbsp;他们有40G的硬盘，却只为 Linux 分配了2G空间，有时还抱怨"这个东西怎么占这么多硬盘！" 似乎 Windows该占用大部分硬盘。他们把重要的数据装在Windows的分区，似乎信不过Linux。他们总是到处寻找新奇的，好看的GUI程序，对命令行的东西一概不屑一顾。他们对Drag&amp;Drop，菜单配置，自动升级非常感兴趣。他们如果找到一个很像 Windows 程序的 Linux 程序，一定会很高兴的说："哈哈！Linux 也能&#8230;&#8230;了！"如果Linux在某种测试中胜过Windows，他们会高兴得跳起来。他们没有办法用Linux 解决问题的时候，甚至用Wine来运行Windows程序。有时实在没办法，只好重起到Windows，或者干脆省得麻烦，在 Windows 下装一个 VMWare 虚拟一个 Linux 玩。<br>&nbsp; &nbsp;&nbsp;&nbsp;你如果出现了上面的情况，说明你的思想受到了 Windows 的某种潜移默化的影响和误导。你没有能够从本质上理解存在于 Linux 身上的 UNIX 思想。你支持 Linux，你喜欢 Linux，你能从中感觉到快乐，这非常好。你现在只需要明白的是：Linux 从来就不是一个玩具，它是天才UNIX的后代。UNIX 是自晶体管发明以来最伟大的发明，它从诞生那一天开始就比 Windows 的设计出色。<br>&nbsp; &nbsp;&nbsp;&nbsp;你要体会什么叫做"设计"，一个糟糕的设计并不是到后来缝缝补补就可以变好的，而一个出色的设计，不但可以以不变应万变，而且可以影响到后来者。一个出色的设计配上一个出色的实现，那就是非常出色的发明。Linux 就是这样的一个出色的发明。Linux 并不需要追赶 Windows，也不需要打垮微软。它的最终目标是改变整个计算机世界，还人们自由，给人们乐趣和方便。<br>&nbsp; &nbsp;&nbsp;&nbsp;Unix 是简单的，你不需要成为一个天才也能理解这种简单。<br>&nbsp; &nbsp;&nbsp;&nbsp;UNIX的设计者 Dennis Ritchie 说："Unix is simple. It just takes a genius to understand its simplicity." 但是我不这么认为，因为我不是一个天才，但是我却勇敢的把 Windows <br>完全删除掉，遇到不明白的事情的时候努力用 UNIX 的方式去解决，而不是寻求 Windows 的帮助。现在我体会到了 UNIX 的思想和好处，我可以用比 Windows 高效几倍的效率工作。因为我相信这样的信念："Windows 能办到的事 Linux 一定能办到，而且办的更好。"<br>&nbsp; &nbsp;&nbsp; &nbsp;这小节开头的话应该改成："Unix 是简单的，你不需要成为一个天才或是计算机专家。但是在这个冲斥着 Windows 错误观念的世界，你需要信念和勇气才能理解它的简单。" <br>&nbsp; &nbsp;&nbsp;&nbsp;我下面就告诉你一些我理解到的东西。首先，你要知道的是微软在国际科学领域是根本没有地位的。<br>&nbsp; &nbsp;&nbsp;&nbsp;微软的地位<br>&nbsp; &nbsp;&nbsp;&nbsp;微软的名声在欧洲和美国的大学里，特别是在计算机系里之坏，大家可能有所耳闻。我认识的 MIT，Stanford 的教授，贝尔实验室的专家，甚至一个欧洲小国的高中计算机老师都绝口不提微软的名字。在他们眼里，微软只是一个没有真技术，专靠在落后国家商业宣传和垄断经营的小公司。这个"小"并不是说它人少，钱少，而是说它先进技术少。<br>&nbsp; &nbsp;&nbsp; &nbsp;我上次和王益合作写了一个算法演示程序，那个算法是贝尔实验室一位科学家Steven Fortune很天才的发明，为了程序能够被身边大多数人使用，我们选择了 VC+MFC 作为平台。我在分析算法时还得到 Fortune 很热情的鼓励，寄给我一份资料，还多次回信耐心的给我讲解了很多细节。但是程序完成之后，我把样品发给 Fortune，他回信说："对不起。我机器上没有 MFC。" 话说的很客气，但是我已经感觉到了他对 Windows的不屑。然后我把 MFC 静态编译进程序再发给他，他就没有再回信了。他显然不是瞧不起我，而是确实有难处。<br>&nbsp; &nbsp;&nbsp; &nbsp;你能感觉到这位科学家对微软和 Windows 是什么态度了吧？不是反感，而是他心里根本没有 Windows 这个东西！微软在高科技领域没有发展，那么它怎么生存呢？到发展中国家去发展一下，他们的人民还对电脑一无所知，我说不定甚至可以打入大学的计算机系呢。我送他们软件，我捐钱盖大楼，我出钱找图灵奖获得者来演讲，让他们觉得我们都是科学家！<br>&nbsp; &nbsp;&nbsp;&nbsp;好了，现在全国的大学包括清华，几乎所有人机器必装盗版 Win2000，Office XP，学校的选课系统是非IE不能正确浏览，论文用 Word 编辑，演示用ppt做，email 的通知附件是 doc 文件，你不用 Word 打不开，连 863 项目都用 VC 写程序了。我很久以前就看到一份报纸说，"微软为什么不严厉打击盗版？" <br>这篇文章说，微软非但不打击中国的盗版行为，而且有放任之趋势。放长线吊大鱼，"以后我要你们加倍的来还我！" 确实如此，它的目的快实现了。<br>&nbsp; &nbsp;&nbsp;&nbsp;Windows 笼罩下的中国计算机教育<br>&nbsp; &nbsp;&nbsp;&nbsp;说句丢脸的话，比尔盖茨很久以前是我的偶像&#8230;&#8230; <br>&nbsp; &nbsp;&nbsp;&nbsp;在中国，比尔盖茨被很多人奉为神圣，"少年电脑天才"，甚至有的人提到他的名字就做出"抱拳对天"的姿势。很多人谈到微软的"新技术"，"高科技" 都是眉飞色舞。各种"VC编程圣经"，"深入了解 Visual C++"之类的书，在开头几页都会出现非常肉麻的字眼，"在那团团的混沌中，一个开天辟地的精灵，Windows 1.0，诞生了&#8230;&#8230;"<br>&nbsp; &nbsp;&nbsp; &nbsp;微软的软件被这么多人盗用，那么人们是怎样使用这些盗版程序的呢？先看看电脑培训班，教的都是一些 DOS 命令，打字，Windows&nbsp;&nbsp;基本操作，Word 文档处理，PowerPoint，高级班可能有 Excel，Access&#8230;&#8230; 参加各种微软认证考试，MCSE，MSDE 的人络绎不绝。考试辅导班都贴出了"280元，考过为止"之类的字样。考试参考资料更是昂贵，有些电脑书店整整两书架都是"Microsoft Press"的东西。我有个同学参加认证考试，每门考试都要200多元。而且你一次考不过可以再考，又要交钱。他后来还津津乐道跟我说，看我，花了XXXX(一个四位数)元考过了微软认证，得到一张比尔盖茨亲笔签名的证书和价值6000元的 Windows XP 内部发行版。<br>&nbsp; &nbsp;&nbsp;&nbsp;"电脑要从娃娃抓起"，我们再来看看娃娃们学的是什么。大部分家长给孩子买了电脑之后，他们首先就会装一个盗版的 Windows，然后买来盗版的游戏开始玩。如果哪个孩子会用 Delphi 编程序，那可不得了。报社记者，电视台争相报导，说，某某学校的初中生某某，在别人都还在玩电脑游戏这种"初级阶段"的时候就已经用 Delphi 写程序了。镜头还瞄准了他显示器上面的像框中的比尔盖茨头像！<br>&nbsp; &nbsp;&nbsp; &nbsp;我刚进入大学计算机系时还不懂得什么是操作系统，因为我以前只用过"中华学习机"。看到新入学的同学们各个谈论的都是 "Windows 95"，"VC"&#8230;&#8230; <br>&nbsp; &nbsp;&nbsp; &nbsp;我简直觉得我落后了好几十年一样，整个一土人，根本跟他们答不上话。好不容易找到一个比较熟的同学问了一下："你们天天谈论的瘟95是什么啊？"答："win95就是一个操作系统，跟DOS是一类。""朵死是什么？" <br>&nbsp; &nbsp;&nbsp; &nbsp;"你连DOS都不知道是什么？别在计算机系混了。" 学校上课当然不讲VC编程之类的东西，但是上 Pascal 的老师有一次就说："嗨，我们学校真是落后。现在别人都用 C, C++，甚至 VC 了，我们还在讲 <br>Pascal。不知道什么时候才能有VC课啊。你们出去也是要用VC的，只好自学了。" <br>&nbsp; &nbsp;&nbsp; &nbsp;于是，有些同学很多时候上课都捧着一本很重的"Windows 编程大全"之类的书，根本没有听课。吃饭时就念念有词的跟我说，"代码的优化是无止境的"，"匈牙利命名法真是伟大的发明" &#8230;&#8230; <br>&nbsp; &nbsp;&nbsp; &nbsp;这就是中国很多大学计算机系的情况。<br>&nbsp; &nbsp;&nbsp; &nbsp;感觉到无知了？这不是偶然的，而是微软长久以来埋下的伏笔。它要让无知的大家都把它奉为神圣，它要让支持UNIX，Xwindow的人一旦说 UNIX 好，Xwindow 好的时候，都被一群人围着说教："这个 Windows 也能做到"，"你对 Windows 有偏见"，"微软才是主流啊"，"你敢瞧不起 win2k？"，".NET 就是世界潮流"，"微软的毕竟是新技术"，"有钱就是有技术"&#8230;&#8230; <br>&nbsp; &nbsp;&nbsp; &nbsp;甚至在一番论战比较后败下来还是要说："Windows 性能差点，但是易用性强"，"Windows 是老百姓用的，要求别那么?quot;，"微软那么有钱，以后想超过 UNIX 还不容易吗？"&#8230;&#8230;<br>&nbsp; &nbsp;&nbsp; &nbsp;发达国家的计算机教育<br>&nbsp; &nbsp;&nbsp; &nbsp;我前段时间在 USENET 发文问有关 Scheme 语言的问题时，认识了一位丹麦人。他解决了我所有的问题，并且建议我阅读一些很"深奥"的有关程序语言语法，文法的书，他告诉我很多网站可以学习 LISP，Scheme，人工智能，算法。他叫我看 Jonathan Rees 的论文 "Syntactic Closures"。他还打包给我寄过来一份 MIT 的 "How to Design Programs"。他说他在自己的 PC 机上装的是 Linux，他用 Emacs 编辑，运行Scheme 程序。他对 Emacs 的了解和爱好真是使人惊讶。他大学本科毕业时做的毕业设计是一个 Scheme 解释器。这对于我来说是望尘末及了。<br>&nbsp; &nbsp;&nbsp;&nbsp;他是那么的不厌其烦，我的每一个问题他都详细的回答。我有时都觉得过于详细了，怎么这么耐心啊？我觉得他似乎是我的高中老师。他是什么样的人呢？我好奇的打听了他的情况。原来，他是丹麦一所普通高中的计算机老师。<br>&nbsp; &nbsp;&nbsp;&nbsp;他说他在高中里讲授程序设计和算法，计算机语言文法。他说用 Scheme，他的学生不用再为内存泄漏等程序语言本身的问题而烦恼，而专注于问题和算法本身。有利于培养学生解决问题的能力，特别是用计算机解决数学问题的能力。<br>&nbsp; &nbsp;&nbsp;&nbsp;天哪！为什么欧洲出现那么多数学家，几何学家？你看看别人重视的是什么！我们的计算机教育如果继续这样下去，只会沿着弯路越走越远！<br>&nbsp; &nbsp;&nbsp; &nbsp;微软和它的朋友们的如意算盘<br>&nbsp; &nbsp;&nbsp; &nbsp;下面来看看微软的收入是怎么来的。首先，Windows 98系列操作系统，一个就是100多美元，每次升级又是几乎同样的价钱。Windows NT 还要贵几倍，而且有用户数目限制，5个用户的，10个用户的&#8230;&#8230; 以后如果要增加用户数目还要按比例付钱。<br>&nbsp; &nbsp;&nbsp; &nbsp;花了如此多钱买来的操作系统就能用了吗？它竟然连压缩程序都没有提供！你装上Windows 之后一般第一件事就是去下载一个 WinZip 吧，"只要 29 美元"。Windows会中病毒啊，马上花 70 美元买一个 Norton AntiVirus 吧。还有黑客呢？再买一个Norton Internet Security 好了，100 美元。系统需要优化，磁盘需要整理，买一个Norton System Works 是你最佳的解决方案，100美元。<br>&nbsp; &nbsp;&nbsp;&nbsp;可是你现在还是不能干正事啊！你想要一个 Word, PowerPoint？那就买一套 Office XP 吧，一起买便宜些，$459.90。<br>&nbsp; &nbsp;&nbsp;&nbsp;那些程序不会用啊！那些菜单怎么设置，到底有什么功能啊？看"帮助"也学不会。买本书看看吧，我推荐"Special Edition&nbsp;&nbsp;Using Microsoft Office XP"，不贵，$27.99。这本书里面大部分是屏幕抓图，还是买一本旧的比较划算，$17.85。<br>&nbsp; &nbsp;&nbsp;&nbsp;你如果只是当个秘书，上面的差不多还凑合了。可是你有更高的追求，你想成为 Windows程序员。首先买一个 Visual Studio.NET 吧，要不然怎么编译程序。$494.95。<br>&nbsp; &nbsp;&nbsp;&nbsp;为了紧跟微软动向，世界潮流，不能不注册个 MSDN 什么的吧？这个贵一点，不过物有所值啊，$2,799。<br>&nbsp; &nbsp;&nbsp; &nbsp;嗯，你现在已经是上层阶级，白领人士了。你现在可以像这样"自由"的，"安全"的生活了。<br>&nbsp; &nbsp;&nbsp; &nbsp;为什么要反对使用 Windows<br>&nbsp; &nbsp;&nbsp; &nbsp;很多人都说不应该完全否定 Window，Windows 也有它的长处。不应该骂微软。<br>&nbsp; &nbsp;&nbsp; &nbsp;对。Windows 容易操作，适合普通用户。如果微软把它自己定位在 P&amp;G，Philips <br>&nbsp; &nbsp;&nbsp; &nbsp;那样的地位，能够给我们的百姓提供周到的，完善的，价廉物美的服务。那我肯定是很喜欢它的。但是从上面的种种情况说明，微软是一个野心极大的国际垄断组织！它的产品没有一个是不出问题的：Windows <br>&nbsp; &nbsp;&nbsp; &nbsp;不稳定，容易中病毒，而微软不为大家免费提供杀毒软件。我就是要让你们花钱买我的朋友 Symantec 的杀毒软件，谁叫你们已经上了我的贼船？这叫什么售后服务啊！<br>&nbsp; &nbsp;&nbsp; &nbsp;你买来微软的程序，安装的时候一般都有一个协议，说："由于微软的程序造成你的数据损坏或丢失，微软概不负责。" <br>&nbsp; &nbsp;&nbsp; &nbsp;我想很多人肯定觉得这个不合理，不想按那个 "I accept"。但是你的软件买都买来了，钱都花了，现在一按 "I decline"，安装程序马上就会退出。你只好被迫点击了 "I accept"！这不是不平等条约吗？<br>&nbsp; &nbsp;&nbsp; &nbsp;我已经目睹了好几个朋友的文档被 Microsoft Word <br>损坏，有的是编辑了十多天的30多页的论文，有的是费了很大工夫做出来的个人简历，那个朋友为此失去了到自己向往的P&amp;G 工作的机会。就在他要投简历的前一个晚上，就在那一瞬间&#8230;&#8230; <br>&nbsp; &nbsp;&nbsp; &nbsp;不知道他痛哭的时候有没有想起要投诉微软，可是谁叫我们用的都是盗版呢，况且你还点击了 "I accept"。<br>&nbsp; &nbsp;&nbsp; &nbsp;微软仗势已经占有大部分PC市场，制定不符合国际标准的"微软的标准"，以不合理的方式压制其它公司的软件，这个问题已经在美国司法部闹了很久了。他甚至在 Windows系列操作系统中放置能够通过网络泄漏用户信息的代码，以至于 Windows 刚进入澳大利亚时被澳大利亚政府禁止使用。<br>&nbsp; &nbsp;&nbsp;&nbsp;有些人说："微软毕竟开创了一个历史，造就了今天的 IT 行业。" <br>&nbsp; &nbsp;&nbsp;&nbsp;但是，如果没有微软，我们今天早就用上非常稳定，非常可靠，非常方便，非常"傻瓜"的软件了！微软是阻挡信息技术发展的罪魁祸首。<br>&nbsp; &nbsp;&nbsp;&nbsp;微软的程序的工作方式(注意，我只是说操作方式，病毒的事情另外算)确实适合于一般家庭，上上网，发发邮件，打打游戏都不错。可是微软却要把自己包装成什么"高科技"企业，要在世界各地设置"研究院"，在大学计算机系赠送不适合用于科研的 Windows产品，甚至出钱请图灵奖得主来中国畅谈"二十一世纪的计算"，还在大会上宣传自己的 .NET 技术。非要把别人认为自己是科学的，自己是领导世界高科技的。但是呢？它什么高科技也没有。欧洲，美国，哪一个关键部门在用微软的东西？NASA? DOE? CERN?你仔细想一想，微软的程序对人类到底有什么重大作用？<br>&nbsp; &nbsp;&nbsp;&nbsp;什么是 Windows 能干而 Linux 干不了的事情？---<br>&nbsp; &nbsp;&nbsp;&nbsp;"Windows 能干而 Linux 干不了的事情，那就是不需要干的事情。"<br>&nbsp; &nbsp;&nbsp;&nbsp;有个朋友看我半年没有用 Windows，有时就会问我："你只用 Linux，有没有发现有些Windows 能处理的事情 Linux 干不了？"---<br>&nbsp; &nbsp;&nbsp;&nbsp;我回答说："Windows 能干而 Linux 干不了的事情，那就是不需要干的事情。"<br>&nbsp; &nbsp;&nbsp;&nbsp;Windows 能做的有益的事情 Linux 都能做---<br>&nbsp; &nbsp;&nbsp;&nbsp;Windows 下的某些功能确实是我们需要的，那么 Linux 的开发者们和用户也需要这种功能，他们就会去实现这种功能，而且比 Windows 的方式好得多。由于大多数科学家，工程师用的都是 Linux 或者某种商业 UNIX, 所以几乎所有商业的科学工程程序，比如Matlab, Mathematica, AutoCAD, Candence的，Synopsys的，Avant! 的&#8230;&#8230;全都是先有UNIX 的版本(包括Linux)，然后再考虑移植给 Windows，甚至根本不移植给Windows，因为 Windows 的机器一般没有足够的能力运行这样的程序。你不要以为只有Windows 才有 PSpice, UNIX 的 HSpice 要好得多，而且可以运行在大型主机上。当然它们不是免费的，但是它们值那个价钱。<br>&nbsp; &nbsp; 但是 Windows 下有些东西在 Linux 下没有很相似的，或者你找到很多类似的，但是它们每一个比起 Windows 的那个程序都要差很多，那么原因有两种可能性：<br>&nbsp; &nbsp; 有一个完全类似的程序，但是由于它乍一看不漂亮，被你忽略了。而其它程序虽然看起来很漂亮，但是它们是一些初学编程的人写的。现在由于 Gtk, Qt 的诞生，Linux 下开发图形界面程序极其简单，很多初中生甚至小学生都可以随手编出一些漂亮不中用的程序。如果你整天寻找这样的程序挑来挑去，永远也找不到你满意的。当然也有一流的程序用 Gtk 和 Qt，比如 GVIM 就可以用 Gtk 作为图形界面，我还知道 Synopsys 一些程序用了 Qt。<br>&nbsp; &nbsp;&nbsp;&nbsp;我曾经也犯过这样的错误，从外表区分一切。结果优秀的 FVWM, lftp, Mutt, wget 都被我忽略过。当我找回它们的时候，我是那么的羞愧不已，它们现在都是我的朋友 我第一次看到 FVWM 觉得它只不过是一个有很厚很难看边框的东西。可是现在，我的同学看到 FVWM 都说："哇！真漂亮。"<br>&nbsp; &nbsp;&nbsp;&nbsp;有另一种完全不同的方式可以达到相同的目的，甚至更好。<br>&nbsp; &nbsp;&nbsp;&nbsp;很多人很关心 Open Office, Star Office, AbiWord, ... 他们多么盼望有一天某一个Linux 程序能够完全兼容的打开一个复杂的 doc 文档。但是你永远也不可能有那一天。为什么呢？因为微软为了占有市场，必定不会让其它系统的程序能够完全兼容它的文档格式。它一定会不断变化 doc 文档的内部结构，隐藏一些秘密，让其它公司的程序打开 doc 文档时总是有某种问题，从而你必需购买 Microsoft Office 和 Windows。<br>&nbsp; &nbsp;&nbsp;&nbsp;你应该想一下，那么多的高智商的大学教授，科学家，学生，他们用的都是 Linux 或者其它类型的 UNIX，他们没有 Word 可用，怎么处理文档呢？这么多年没有一个像Open Office 的程序出现，难道大家没有办法写文档吗？<br>&nbsp; &nbsp;&nbsp;&nbsp;显然不是这样。你看看那些高水平的学术杂志，论文，那些大学教授的网页，那些漂亮的幻灯片，它们是什么做的？原来 UNIX 用户早就有非常方便的 troff, LaTeX, SGML等东西可以处理文档，而且它们比起 Word 都要高明的多。Word <br>&nbsp; &nbsp;&nbsp;&nbsp;显然被这些大拿忽略了，以至于很久以来没有人想在 Linux 下开发一个类似 Word 的程序，除非某些公司想抢微软的饭碗。<br>&nbsp; &nbsp; 很多人留着 Windows 在硬盘上的原因无非是为了用 Word 和 PowerPoint。我见过一个教授，他的 Windows笔记本电脑上除了 PowerPoint 什么都没有。有一天演示的时候，他指着堆乱字符说："对不起，这是一个公式&#8230;&#8230;怎么每次都是这样&#8230;&#8230;" <br>&nbsp; &nbsp; 其实有比PowerPoint <br>&nbsp; &nbsp; 好几百倍的东西可以制造幻灯片，你可以用最简单的方法制造世界一流效果的论文和幻灯片。<br>&nbsp; &nbsp; Windows 能做的那些没用的事情 Linux 永远做不好<br>&nbsp; &nbsp; 电脑游戏<br>&nbsp; &nbsp; 有些人说 Linux 下不能玩 Windows 下所能得到的所有游戏。的确，Linux 下虽然也有少量的游戏，比如Quake。但是它没有 Counter Strike, 没有 Star Craft, &#8230;&#8230;<br>&nbsp; &nbsp; 并不是说电脑游戏不该玩，但是应该适可而止。电脑是用来处理事务，帮助你学习，解决问题的工具，而不是一个玩具！整天沉迷于电脑游戏中，而不出去感觉外面的世界，你会变得越来越冷酷，越来越缺乏人情味。你与真实的世界越来越远。<br>&nbsp; &nbsp;&nbsp;&nbsp;你可以在 CS 里杀人，你可以在 Tomb Raider 里探险，你甚至可以在 Tony Hawk's Pro Skaters里滑板&#8230;&#8230; 但是 It's not real！你虽然有很高的"反恐技巧"，但是遇到歹徒的时候，你是那么的怯懦；你虽然控制 Laura 伸手敏捷，但是你打篮球的时候怎么总是被人断球？你虽然可以轻易的在 THPS 里作出一个 "360 kickflip to hangten grind to fakie"，但是你踩在自己的滑板上的时候还不会 ollie！<br>&nbsp; &nbsp;&nbsp;&nbsp;说回来，如果你偶尔玩一下电脑游戏未尝不可。但是世界上有远比 Windows + PC 更好的游戏方式。Sony 的PlayStation2, SEGA 的 DreamCast, Nintendo 的 N64，Namco的街机&#8230;&#8230;每一个都比 <br>Windows 游戏精彩，每一个都有如此高的3D性能，以至于Pentium4, Itanium + GForce4 都无法与它们比美！<br>&nbsp; &nbsp;&nbsp;&nbsp;Linux 的用户们都是关心解决世界的关键问题的份子，他们哪里有时间用自己的机器来玩游戏啊？他们每天用Linux高效的做完自己的工作就到阳光下享受自然去了。要玩游戏也是玩一些类似推箱子，贪吃蛇之类的智力小游戏。所以，你知道为什么 <br>&nbsp; &nbsp;&nbsp;&nbsp;Linux 几乎没有游戏了吧？<br>&nbsp; &nbsp;&nbsp;&nbsp;"整理硬盘，优化系统"<br>&nbsp; &nbsp;&nbsp; &nbsp;这是一个非常有意思的话题，仅次于有关"病毒"的话题。相信很多 Windows 用户都有整理硬盘的经历。在很多 Windows 用户眼里，"硬盘用久了，会出现碎片，速度会减慢，需要一个程序来整理，整理硬盘的时候不要做其它工作"，这好像是天经地义的事情。我也曾经津津有味的看着 Norton Defrag 一点一点的把我的硬盘排序，调整，用图形的方式显示出来，然后报告?quot;100% 没有碎片。你的硬盘现在已经达到最佳状态。" 我现在才发觉我那时是多么的幼稚。<br>&nbsp; &nbsp;&nbsp;&nbsp;Linux 和 UNIX 用户似乎从来没有"整理硬盘"这种说法呢？你觉得很奇怪吗？如果你觉得很奇怪，那说明你的思想在某种程度上被微软的垃圾程序禁锢了。你需要明白，UNIX 的大型主机很多必须是一天24小时，一年365又1/4天不停运转的，要是每个星期都要整理一次硬盘，在整理的时候几乎不能干任何事情，那是绝对行不通的！<br>
<div style="FONT-SIZE: 10pt">Linux 机器根本不用整理硬盘，这就是为什么没有看到过 Linux 用户整理硬盘。Linux 的文件系统是比 Windows 的 FAT, FAT32, NTFS 高明得多的文件系统，它们不但可以对文件设置权限，实施完全的保护，而且可以"越用越整齐"，"越用碎片越少"！你应该把文件大部分放在 Linux 的分区，而不是 Windows 分区，因为它比 Windows分区可靠得多。<br>&nbsp; &nbsp; 还有更滑稽的事情就是有很多"Norton System Doctor"，"Windows 优化大师"，"超级兔仔注册表魔法" 之类的程序存在，而且价格昂贵。似乎一个操作系统本来应该有很多问题，需要别的厂商做程序来"优化"它，而且为了得到优化，你需要付钱！这些问题 <br>&nbsp; &nbsp; Linux 根本就没有，所以不需要什么优化。Linux 内核本身就是高度优化的。<br>&nbsp; &nbsp; IDE<br>&nbsp; &nbsp; 有些人在抱怨为什么 Linux 没有一个良好的 IDE 开发环境。Linux 现在已经有一些IDE 了，但是总是有很多问题。你是不是正在寻找，正在期望 Linux 某一天可以有一个VC那样的开发环境？你有没有发现你正在进入微软给你设下的怪圈？你为什么一定要用 IDE？你说："IDE 开发迅速，调试方便，适合大型程序&#8230;&#8230;" 那说明微软的程序在你脑子里已经比较根深蒂固，你需要好好清醒一下了，看看我来告诉你。高明的 UNIX 程序员不用 IDE，IDE 从来就是给初级 Windows 程序员用的。<br>&nbsp; &nbsp; 你看看大型的 UNIX 程序，包括 Linux 内核，各种网络服务程序，Xwindow 程序在内，哪一个是 IDE 搞出来的？我们实验室的 EDA 程序也没有一个是 IDE 弄的，我还知道Candence, Synopsys，Mentor 的高性能的图形界面 EDA 程序也都不是 IDE 写的。你信不信，微软的人在写 Windows 本身的时候也根本不用 IDE。微软内部程序员最喜欢的编辑器其实是 VIM，用 VIM 的微软程序员上次向乌干达的可怜儿童捐助了1000多美元，这是值得称赞的。<br>&nbsp; &nbsp;&nbsp;&nbsp;有一次某杂志采访一些出名的 Linux 内核程序员，包括 Linus 在内，没有一个人用IDE，有的人用 VIM，有的用 Emacs，只有 Linus 说"GNU Emacs is evil"，但是其实他用的是一种跟 Emacs 有同样键绑定功能的 MicroEmacs。大家都是用编辑器编辑了程序文件，然后用 make 这样的自动工具调用 gcc 编译器完成编译工作的。甚至高级的 Windows 程序员也不用 IDE，他们可以从命令行调用 cl，nmake 来编译自己的程序。虽然这样的 Windows 程序员很少，但是他们却是最了解 Windows，最高明的Windows 程序员。<br>&nbsp; &nbsp;&nbsp;&nbsp;为什么 UNIX 程序员不用 IDE？明白了这个道理你就能体会到 UNIX 的设计思想了。首先，一个 IDE集成了编辑器，编译器，汇编器，调试器，跟踪器&#8230;&#8230; 这个编辑器功能肯定比不上 VIM 或 Emacs，编译器比不上 GCC，汇编器比不上 as，调试器比不上 gdb，ddd, 跟踪器比不上 strace, ltrace, truss。你得到的是一套整合的低能的程序。如果你对调试器的功能不满意，你只好换用另外一套 IDE，但是这套 IDE <br>的热键，菜单，编辑器功能，按钮&#8230;&#8230; 跟原来那个有很大不同。你不得不花很多时间来熟悉新的环境，而不能保持原来的某些东西。<br>&nbsp; &nbsp;&nbsp;&nbsp;而在 UNIX 下就不一样了。你可以用你最喜欢的 VIM 编辑程序，你在 VIM 里可以调用GNU make，make 可以调用 gcc, ld, ... make 的出错信息可以被 VIM 捕获，VIM 能帮你在源程序里定位。你如果喜欢 icc, 你可以让 make 用 icc 而不是 gcc。你如果觉得 gdb 跟踪变量时比较麻烦，你可以用 ddd 来显示各种数据结构之间的关系。你还可以在 Emacs 里调用 gdb，那样就可以同步显示源代码了。而且 VIM 和 Emacs 还可以编辑很多其它东西，比如信件，LaTeX 文档，HTML，配置文件&#8230;&#8230; 你不用另外找一个什么编辑器来干这些杂活了。很多程序比如 Mutt, tin 都可以在内部使用 VIM，这样就更方便了。实际上 make 在其它方面还能帮你很多忙，我的每一个比较大型的 LaTeX文档都是用 make 维护的。<br>&nbsp; &nbsp;&nbsp;&nbsp;Linux 能干的高精尖的事情 Windows 都干不了<br>&nbsp; &nbsp;&nbsp;&nbsp;当然有很多事情是Linux/UNIX的专利了。因为 Windows 只能装在 PC 机上，好像以前也有 Alpha 可以使用 Windows NT，但是就是没见到有人用。PC 机的能力是很低的，像我们编程序处理 NP-Hard 问题的人，用 Windows 的机器显然速度不够，而且有时一个问题算上几天甚至几个星期，Windows 机器是以"死机"著称的，我们怎么能放心？所以几乎所有科学计算程序，EDA 程序，高性能图像处理程序都不是 Windows 的。他们有时也会移植一些给 Windows，但是常常降低那些程序的能力。你比较过 Windows 版本的 Mathematica 和 Linux 的有什么区别吗？<br>&nbsp; &nbsp;&nbsp;&nbsp;IBM 制造的最大的并行计算机有 8000 多个处理器，Windows 不可能有能力管理这么多处理器，它用的是什么操作系统？答案是 Linux。<br>&nbsp; &nbsp;&nbsp;&nbsp;《泰坦尼克号》电影里的三维动画，那么细腻逼真，Windows机器能做出来吗？不行。那也是 Linux 机器做的。<br>&nbsp; &nbsp;&nbsp;&nbsp;民航总局用来训练地情人员的虚拟现实训练设备，Windows 当然无能为力。那都是商业的 IRIX 机器。<br>&nbsp; &nbsp;&nbsp; &nbsp;UNIX 是最早支持 TCP/IP 网络协议的系统。它上面有很多可以互相协作的网络服务程序，它们经过多年的使用和修订，已经达到比较完善的程度。而就在1997年，微软的比尔盖茨还在扬言："Internet 是没有前途的。" <br>&nbsp; &nbsp;&nbsp; &nbsp;微软的这个"远见卓识"大家应该都已见识，它后来加上的网络服务程序IIS漏洞之多，让公安部都频频发出警报，大家也是见识了的。<br>&nbsp; &nbsp;&nbsp; &nbsp;其实你知道了，Windows 没有一样有用的事情能比 UNIX 干的更好。<br>&nbsp; &nbsp;&nbsp; &nbsp;Linux 干不了的有用的事情 Windows 照样干不了<br>&nbsp; &nbsp;&nbsp; &nbsp;当然 Linux 不是万能的。它也有不能干的事情，电脑也有干不了的事情。但是 Linux干不了的事情，Windows 肯定也干不了。这些事情就是我们需要探索，需要努力的事情了。在你探索的过程中，Linux 必定是你的好伙伴。<br>&nbsp; &nbsp;&nbsp; &nbsp;不要把Linux和Xwindow掩盖起来！不要把我们的用户当成傻瓜。<br>&nbsp; &nbsp;&nbsp; &nbsp;什么？你早就知道 Windows 是垃圾？噢！你怎么不早说呢！害我废话这么多。嘿嘿。<br>&nbsp; &nbsp;&nbsp; &nbsp;"好了。你知道 Windows 是垃圾，你现在用什么?quot;<br>&nbsp; &nbsp;&nbsp; &nbsp;"Linux + Xwindow"<br>&nbsp; &nbsp;&nbsp; &nbsp;"那我问你，Xwindow 是什么样的？"<br>&nbsp; &nbsp;&nbsp; &nbsp;"不就是跟 Windows 差不多吗？只不过 'Start' 按钮比较方，而且上面不是一个Windows 标志，而是一个脚丫子。点击一下居然还有很漂亮的中文菜单。我喜欢！"<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;你发现了问题吗？这些 Linux 用户说是在用 Linux 和 Xwindow，但是他们对 Linux和 Xwindow 几乎完全不了解。很多人用了那么久 Xwindow <br>&nbsp; &nbsp;&nbsp; &nbsp; 都不知道根窗口是什么东西，不知道其实按钮也是窗口，不知道窗口管理器和其它程序有什么关系，大家都以为窗口上面的按钮是程序自己放上去的，不知道窗口?quot;class name"，"resource name"是什么东西。他们也不知道 .Xdefaults 是用来干什么的。特别是他们很多人都不知道 Xwindow 的字体是如何命名的，什么是 fontset，有了一个新的字体也不知道怎么安装。<br>&nbsp; &nbsp;&nbsp; &nbsp;他们被遮在 Linux 之上的一层一层的包装迷惑了，他们等待有图形界面的工具来帮助完成一切事情，他们认为 Linux 跟 Windows 一样，只是麻烦一点。他们知道 Linux内核很好，但是他们感觉不到 Linux 和 Xwindow 在操作层面的天生的先进性，随后不久就把 Linux 完全删除掉了。你发现没有，要用户理解 UNIX 和 Xwindow&nbsp;&nbsp;的操作层面的先进性，才是留住用户的最好办法。如果用户体会不到操作时的方便和高效，内核再好他们也不会理会。<br>&nbsp; &nbsp;&nbsp; &nbsp;但是用摹仿 Windows 的作法来吸引用户，永远会失败的。因为 Linux 如果摹仿Windows那一套低效率的方式，那么 Linux 的这套"低效率方式"永远比不上Windows 的那一套"低效率方式"。那么用户就会说："这个 Linux，没有一样比的上 Windows。"<br>&nbsp; &nbsp;&nbsp; &nbsp;Linux 天生就是继承了 UNIX 的高效的工作方式，为什么我们要把它掩盖起来？我们为什么只告诉用户 KDE 的菜单怎么用？我们为什么不能像早期的 Xwindow 书籍那样第一节就告诉用户什么是 X server, 什么是 X client，什么是 Window Manager, 什么是根窗口。第二章就告诉用户窗口有哪些属性，什么是 classname, resource name, hint，怎样使用 .Xdefaults, xrdb &#8230;&#8230;<br>&nbsp; &nbsp;&nbsp;&nbsp;在这里我又不得不说一下那些 Linux 的发行公司和写书的人，他们把 Linux 和Xwindow 包装起来，却没有从基本上告诉用户 Xwindow 的工作原理。很多书籍讲授的层次就是在Gnome, KDE 的菜单操作的层次，靠大量抓图来占篇幅，"繁荣"Linux 书籍市场。<br>&nbsp; &nbsp;&nbsp;&nbsp;现在很多人已经把能够利用别人的库写出一个好看的程序作为自己编程水平的象征。在这?quot;图形化"，"可视化" 的年代，你如果还在用 troff, LaTeX 写文档，你还在用VIM 自己编辑 HTML，用 Mutt 处理邮件，你还在用文本模式的 gdb 调试程序，你还在用Xlib 写程序, 你还在用 tin 上 USENET，你还在自己写 Makefile，写机器代码，你还在玩 Clossal Cave 这样的字符模式冒险游戏，那你就是老古董。<br>&nbsp; &nbsp;&nbsp; &nbsp;其实这种思想是错误的。虽然你是一个坚决的 Linux 支持者，但是你的思想是 Windows的思想。你认为图形界面，菜单，按钮就可以解决一切问题，就可以给你高效方便。你还是没能摆脱微软给你的潜移默化的东西。你其实离不开&nbsp;&nbsp;Windows 那样的环境，你迟早会删掉自己的 Linux。<br>&nbsp; &nbsp;&nbsp; &nbsp; GUI vs. CLI<br>&nbsp; &nbsp;&nbsp; &nbsp;做一个坚定不移的"两面派"<br>&nbsp; &nbsp;&nbsp; &nbsp;大家看到这个标题是不是热血沸腾？两派大虾都可以围攻我了：<br>&nbsp; &nbsp;&nbsp; &nbsp;GUI派用户："哇！我一看你这小子就是 CLI 的。要不然自己写什么 Makefile？用什么Mutt？"<br>&nbsp; &nbsp;&nbsp; &nbsp;CLI派用户："切～ 你还用 X！高手都不用 X。你是 GUI 那边的。"<br>&nbsp; &nbsp;&nbsp; &nbsp;可怜的我："555～～ 你们都不要我～～ GUI 和 CLI 就那么水火不容吗？"<br>&nbsp; &nbsp;&nbsp; &nbsp;计算机界这样的门派之分还很多。很有特点的就是 CLI 和 GUI 了。CLI (Command LIne)的狂热份子声称永远不用 X。我上次在实验室看到一个同学用一个 SecureCRT 登录到Sun 机器，然后用一个 vanilla vi 编辑程序，我建议他启动一个 GVIM 过来显示在Exceed 上可以有语法加亮。但是他坚决反对，说："高手不用X。你想想，要是我在一个很慢的网络连接怎么用 X？而且好多服务器没有装 X 程序。"<br>&nbsp; &nbsp;&nbsp; &nbsp;但是我们实验室的网速可够快，Windows 机器都有 Exceed 啊，而且 Sun 机器有全套X 客户程序包括 GVIM。他说他是 CLI 的坚决拥护者，但是他却在用 Windows，他后来打开了好几个 SecureCRT，每次从文本框输入地址，用户名和密码，从下拉菜单选择"SSH2"，然后点击"Connnect"。他还不断的夸SecureCRT是"网络管理员投票选出的最受欢迎的登录方式"。老天，SecureCRT <br>&nbsp; &nbsp;&nbsp; &nbsp;本身就是个 GUI 啊，他其实没有明白Xwindow 的好处。<br>&nbsp; &nbsp;&nbsp; &nbsp;你说我是 GUI 的？我虽然很少在 console 下工作。但是我对 bash, VIM 很熟悉，我可以让 bash 按照我的键绑定方式来工作。我可以在 rxvt 里使用 Mutt 来收发 email。我的每个桌面上都常常堆放着一打不同大小的&nbsp;&nbsp;rxvt。我用 VIM 编辑 LaTeX。我自己写Makefile 来维护 LaTeX 文档。我有时用 mpg321 来放 mp3。我上BBS用的我自己写的expect 脚本。 好了，CLI 派的朋友可以收我做盟友了<br>&nbsp; &nbsp;&nbsp; &nbsp;你说我是 CLI 的老古董？我的 FVWM 被我配置为可以"手写操作"，我只要画一个"r"就可以启动 rxvt，我只要画一个 "U" 就可以启动 GVIM，&#8230;&#8230; 我用 GVIM 语法加亮模式编辑程序，我用 Mozilla 浏览网页，&#8230;&#8230; GUI 派的现在好像认我做朋友了好了。CLI 派的朋友，虽然我很喜欢命令行，但是我有时在屏幕上左右画一下就可以执行:<br>&nbsp; &nbsp;&nbsp; &nbsp;Module FvwmConsole -terminal rxvt -geometry 45x5-0+0 -bg gold -fg <br>&nbsp; &nbsp;&nbsp; &nbsp;midnightblue -fn "-adobe-courier-medium-r-*-*-14-*-*-*-*-*-*-*"<br>&nbsp; &nbsp;&nbsp; &nbsp;你是不是现在又想把我逐出师门？<br>&nbsp; &nbsp;&nbsp; &nbsp;GUI 派的朋友，虽然我很喜欢窗口。但是我可以在 FvwmConsole 里输入：<br>&nbsp; &nbsp;&nbsp; &nbsp;All (rxvt) MoveToDesk<br>&nbsp; &nbsp;&nbsp; &nbsp;把我所有的 rxvt 移动到我现在工作的桌面。"这家伙，怎么这么快就叛变了！"<br>&nbsp; &nbsp;&nbsp; &nbsp;其实何必分什么 GUI 和 CLI，UNIX 和 Xwindow 都是工业标准，它们从设计那天开始就有非常灵活的用法，各个程序，不管是 GUI 还是命令行的都可以互相协作。UNIX 和X 是一家，何必搞的那么偏激，非此即彼？你从我上面的行为可以看出 GUI 和&nbsp;&nbsp;CLI的模糊界线吗？我就是坚定不移的"两面派"。<br>&nbsp; &nbsp;&nbsp; &nbsp;UNIX 是简单的--<br>&nbsp; &nbsp;&nbsp; &nbsp;"我相信简单就是最好，如果太复杂，我是不能理解的。" -Seymour Cray<br>&nbsp; &nbsp;&nbsp; &nbsp;很多第一次用 Linux 的人会惊奇的发现，Linux 的程序居然不?quot;安装"就可以运行，程序拷贝到随便那个目录都可以用，而不是一定要占用你第一个分区的空间。程序的设置只是一些简简单单的文本文件。你根本不需要什么"注册表修改器" <br>&nbsp; &nbsp;&nbsp; &nbsp;就可以改变系统的设置。这就叫做简单，但是简单就是美。虽然这只是 UNIX 简单性的一个肤浅的认识，你已经体会到了某些东西。<br>&nbsp; &nbsp;&nbsp; &nbsp;但是简单并不意味着功能弱，并不意味着落后。相反，简单意味着强大，意味着生命力。<br>&nbsp; &nbsp;&nbsp; &nbsp;我不会再继续阐述我理解到的"UNIX 的简单"，因为这个需要自己去体会。<br>&nbsp; &nbsp;&nbsp; &nbsp;UNIX 是永恒的<br>&nbsp; &nbsp;&nbsp; &nbsp;有人说："Plan9 会取代 UNIX，Mach 会取代 Linux 内核。"<br>&nbsp; &nbsp;&nbsp; &nbsp;但是你如果是一个深入体会了 UNIX 的人，你就会知道：UNIX 的思想是永恒的，不管时过境迁，Plan9 是否代替 UNIX，UNIX 的灵魂都会在 Plan9 身上现形！<br>&nbsp; &nbsp;&nbsp; &nbsp;我为同一个设备写过 Linux 内核和 Windows VxD 驱动程序。写 Linux 驱动程序时，我对 UNIX <br>&nbsp; &nbsp;&nbsp; &nbsp;设计的完美的一致性，远见性所折服。UNIX 用同样界面的 read(), write()系统调用就可以对不同的对象：普通文件，设备文件，管道，管道文件，socket，&#8230;&#8230;进行统一的读写操作。我跟本不需要写一个测试用的应用程序就可以对我的设备驱动进行测试，因为 cat, cp, dd, 它们也使用了同样的 read(), write()，设备和普通文件在应用程序眼里没有区别。在那个还没有 Smalltalk, 没有 C++ 的年代，UNIX 的设计者已经使用了所谓的 "面向对象方法"。对，C 语言也可以实现面向对象。<br>&nbsp; &nbsp;&nbsp; &nbsp;UNIX 的系统调用几十年都没有很大变化，这非但不是顽固，不进步的象征，反而是UNIX 的远见卓识的体现！这就跟 TeX 程序几十年都不变的情况差不多。这些才是真正的永恒的 master piece! 你应该改变所有软件都必需从 0.1, 1.0, 1.1, 1.2, 2.0,..., 3.0, 3.1, 95, 98, 2000, XP, ... 不断升级的想法。<br>&nbsp; &nbsp;&nbsp; &nbsp;Windows 就不同了，它在最开头只是一个 DOS 之上的图形包装而已。后来为了兼容以前的糟糕设计，不得不加上很多累赘。我写 VxD 驱动程序的时候就深有体会，Windows 95 程序对设备的操作只有用 DeviceIoControl，我不得不写了两个应用程序来对设备驱动进行测试。Windows 内核的不一致性和隐密性使我非常恼火。不过 Windows WDM驱动程序现在也有了 ReadFile, WriteFile，&#8230;&#8230; 那说明什么？那说明 Windows 在向UNIX 学习，或者有可能是某个 UNIX 设计人员在微软打了几天临工，顺手加了几个UNIX 的东西进去。这样做是没有用的，Windows 从一开始就是非常糟糕的设计，它的历史的包袱太沉重了，缝缝补补有什么用？它只能永远的被 UNIX 甩在身后！<br>&nbsp; &nbsp;&nbsp;&nbsp;UNIX 是强大的<br>&nbsp; &nbsp;&nbsp;&nbsp;让聪明人干任何他们想干的事情。<br>&nbsp; &nbsp;&nbsp;&nbsp;UNIX 的一个特点就是非常高的灵活性，Xwindow 也具有这种灵活性。这种灵活性体现在哪里呢？<br>&nbsp; &nbsp;&nbsp;&nbsp;UNIX 的程序一般都有很多参数，不管你现在用的着用不着，总有人需要某些参数。它们的行为很多都可以用配置文件来改变。比如 GNU bash, 通常缺省的命令行输入方式是 Emacs 方式，但是只要我编辑一个 .inputrc 文件，就可以把它变成 vi 的输入方式，而且我还可以自己绑定键序列到某些操作。我可以用 shopt 来设置它的很多特点，比如是否进行通配符扩展，是否可以把一个变量当作一个目录来cd，是否可以自动纠正某些明显的目录名打字错误 &#8230;&#8230;<br>&nbsp; &nbsp;&nbsp;&nbsp;UNIX 程序设计的思想是提供给用户"机制"，而不限制用户制定"政策"。这是一个重要的尊重用户的作法。<br>&nbsp; &nbsp;&nbsp;&nbsp;我们再来看看 Xwindow。Xwindow 是一个出色的设计，它把显示服务器和客户程序分开。一个显示上既可以显示本机上的程序，也可以显示别的机器上的 X 程序，而它们都遵守你的窗口管理器的统一指挥，它们之间可以方便的传送剪贴版数据，各种事件 &#8230;&#8230; 比如有时我的 XFree86 上会出现四个不同机器上的 XTerm，两个不同机器上的 GVIM，&#8230;&#8230; 它们统一受本机上的 FVWM 指挥。<br>&nbsp; &nbsp;&nbsp;&nbsp;Xwindow 程序都具有很多很多命令行参数和 resource 参数。你可以随意的在命令行或者 .Xdefaults 文件设置所有的颜色，字体，尺寸&#8230;&#8230; 而且如果你用 xrdb 把 .Xdefaults 导入到根窗口，那么其它机器上没有经过配置的同样的程序，显示到你的机器上的时候也会遵守同样的外观规定。<br>&nbsp; &nbsp; Xwindow 的窗口具有 Property, 也就是一些可以自己定义的共享数据(原子)。正是因为这些 Property 的存在，使得 Xwindow 具有无比强大的生命力。X 的窗口管理器和其它客户程序之间并没有统一的协议，但是后来出现了 ICCCM(客户程序间通信规范)，这个规范就是通过 property 定义的。现在又有人定义了一套"扩展的窗口协议(EWM Hints)"，使得Xwindow 可以具有某些 Windows 的特征，比如一个工具条程序可以告诉窗口管理器："这个屏幕下面被我占据了24个像素的空间，你最大化程序的时候不要越过这个界线。"<br>&nbsp; &nbsp;&nbsp; &nbsp;一个强大的窗口管理程序比如 FVWM，它收到这样的提示时，可以答应工具条程序的这个要求，也可以不答应。一切选择的权力在于谁？当然是用户了！<br>&nbsp; &nbsp;&nbsp; &nbsp;你想想，是不是有些 Windows 程序常常弹出一个窗口要你选择 "Yes or No"？你不点击它它就不下去。你觉不觉得你的程序在侵犯你的尊严？你是一个人，一个智慧的生物，怎能受到一个程序如此的待遇？<br>&nbsp; &nbsp;&nbsp; &nbsp;还有就是很多 Windows 程序把人当成傻瓜，而它是"智能程序"。比如，有一个程序就是喜欢把你的每句话第一个字母都变成大写，我不说它是谁了，你遇到的时候就知道了。<br>&nbsp; &nbsp;&nbsp; &nbsp; 如果连"一句话开头一个字母要大写"这么明显的问题都需要程序帮你纠正的话，人脑还用来干什么？况且如果你故意想要不大写的话，那就更麻烦了，我楞是没有从它那一大堆菜单里找到怎么关闭这个愚蠢的选项。<br>&nbsp; &nbsp;&nbsp; &nbsp;只有符号才能完全操纵计算机。<br>&nbsp; &nbsp;&nbsp; &nbsp;我们来说说很多初学 Linux 的用户。虽然他们在用 Linux，但是他们打心眼儿里是觉得Windows 的工作方式好，他们希望 Linux 有一天能"像Windows那样"。你说："我的鼠标一点，我菜单一拉，&#8230;&#8230; 就可以完成我的操作。" <br>&nbsp; &nbsp;&nbsp; &nbsp;但是我要告诉你："Linux 从来没有摹仿 Windows，将来也不会。Linux 从诞生之日起，它的工作方式就比 Windows 的先进。<br>&nbsp; &nbsp;&nbsp; &nbsp;Linux 属于能勇敢面对符号的人。只有符号才能完全操纵计算机。"<br>&nbsp; &nbsp;&nbsp; &nbsp;看看优秀的 UNIX 程序，XFree86, FVWM, VIM, Emacs, proftpd, Mutt, wget, tin, ... <br>没有一个不是用配置文件来设置选项的。为什么这些程序没有方便的菜单可以用来配置？难道它们的设计者就那么低能，连个图形配置界面也写不出来？<br>&nbsp; &nbsp;&nbsp;&nbsp;当然不是。因为图形界面配置方式的能力是极其有限的，而配置文件和程序语言的表达能力却是无限的。用图形界面配置这些程序的话，如果你想达到配置文件的效果，你需要成百上千的菜单，checkbox, radio button, ... <br>&nbsp; &nbsp;&nbsp; &nbsp;到时候你根本没办法找到你需要修改的地方了！而各个程序的配置文件的语法都有很多相似之处，一般就是一些命令，设置一些变量，参数，&#8230;&#8230; <br>&nbsp; &nbsp;&nbsp; &nbsp;一旦用会了一个，其它的也就容易理解了。如果你用惯了 awk, sed, Perl，你会觉得那才是真正的自动化啊。<br>&nbsp; &nbsp;&nbsp; &nbsp;鼠标虽然是很好的工具，但是它的表达能力是有限的。你不可能光用鼠标就让电脑完全明白你的意思，它毕竟只有3个按钮。看看我的MetaPost页你就能体会到鼠标的这一弱点。所以我们虽然很喜欢鼠标，但是却不能完全依赖它。<br>&nbsp; &nbsp;&nbsp; &nbsp;各个小程序的完美配合<br>&nbsp; &nbsp;&nbsp; &nbsp;这就是UNIX最重要的特点了，它就是UNIX设计的思想。让每个程序只具有一项专门的能力，然后让它们合作。Xwindow也继承了这种好传统。这恐怕就是Windows和其它操作系统望尘末及的地方了。UNIX&nbsp;&nbsp;程序设计之统一，配合之完美，真使我难以置信！shell, grep, find, awk, sed, make, Perl, Emacs, vi, tin, Mutt, ... 它们是那么的具有一致性！你一旦学会了 sed 的正则表达式，其它程序基本上都能用了。你一旦学会了vi 和 VIM, 你会发现它的操作是那么的有规律性，似乎vi的设计者在几十年前就已经设计好了 VIM 在今天的完美而统一的操作方式！而且vi的操作还体现在&nbsp;&nbsp;Mutt, tin 等很多程序中。你甚至可以把 bash 设置为 vi 的输入方式来输入命令行，我就是这么做的。一个程序可以调用另外一个程序来得到数据，可以把数据交给它处理后返回来，可以在自己的窗口里"嵌入"另外一个程序。<br>&nbsp; &nbsp; 在 Windows 和其它非 UNIX 操作系统中，这种合作是非常困难的。我曾经在Windows下使用 Perl来进行一些自动工作。但是&nbsp;&nbsp;Windows 的文件操作，管道是如此的不稳定，程序之间基本不能合作。你别想在 Visual Studio 窗口里面嵌入 UltraEdit 编辑器，你别想用一个 expect 脚本来控制 telnet 到水木清华BBS。<br>&nbsp; &nbsp;&nbsp;&nbsp;Windows 的程序都是大而全，大而杂，所有的电子邮件程序都需要自己提供编辑器，自己发送和收取邮件，自己显示邮件的附件。每一个BBS程序都提供自己的Virtual Terminal, 自己的通讯代码。每一个 IDE都自己提供编辑器，编译器，汇编器，调试器。人们为了使用一种新的程序，需要适应所有这些它提供的界面，而不能使用自己喜欢的编辑器的键绑定，菜单组织&#8230;&#8230; 不能 DIY！<br>&nbsp; &nbsp;&nbsp;&nbsp;你要知道，最高级的电脑是定做的，自己想要什么什么CPU，什么主板，多少内存，什么硬盘，键盘，鼠标，显示器都是自己选择的。最高级的滑板，自己想要什么牌子的版面，什么牌子的沙，什么桥，什么轮子，什么轴承，也都是自己选的。最高级的古球拍，木板，胶皮，海绵，胶水都是可以自己选择&#8230;&#8230; 而用 Windows 程序，你得到的是大杂烩，就像你去买"品牌机"，只有那么几种配置，而且附带很多你不需要的软件和服务；就像你去买组装好的滑板，你想要大一点的轮子和窄一点的板子，但是你没有这种选择余地！Windows&nbsp;&nbsp;程序就相当于最廉价，最次的滑板。但是它却会花你更多的钱，因为一旦一个部件坏了，或者你不喜欢了，你不能另外找一个好的换掉它，你必需重新买全套配件！<br>&nbsp; &nbsp;&nbsp; &nbsp;而 UNIX 和 Xwindow 就是高档的"组装货"。比如我用 Mutt 的时候，我可以用 VIM也可以用 pico 来编辑邮件，我可以用 ImageMagick 也可以用 xv 来显示附件里的图片，我可以用 lynx 把 HTML <br>附件转成文本嵌入窗口中，我也可以把 HTML 附件交给Mozilla 图形显示。我可以让 GnuPG 帮我把邮件进行数字签名和加密，我也可以用其它 PGP 程序。<br>&nbsp; &nbsp;&nbsp; &nbsp;我想让 Postfix 而不是 sendmail 帮我发出邮件，我想让 fetchmail 帮我收邮件，转发给 <br>postfix，然后被我自己写的Perl过滤器处理&#8230;&#8230; <br>&nbsp; &nbsp;&nbsp;&nbsp;这一切我都可以办到！我可以选择我最喜欢的专门的程序来完成专门的工作，然后把它们结合在一起，我也可以分别得到它们的好处。<br>&nbsp; &nbsp;&nbsp;&nbsp;学 UNIX 绝对不是浪费时间<br>&nbsp; &nbsp;&nbsp;&nbsp;有人告诉我："你看我用 Windows 什么都不用学。而用 Linux，光是安装就花了我一个星期！"<br>&nbsp; &nbsp;&nbsp;&nbsp;首先，我要告诉你的是，你装 Linux 花了一个星期，不是因为 Linux 不好装，而是因为你已经习惯了 Windows，对 Linux 最初难以理解而已。你想一想你最初安装Windows的时候呢？你花了多少时间搞明白什么是硬盘分区？什么是盘符？什么是目录？你认为Windows 就是那么容易可以学会的吗？虽然你觉得没花时间学，但是你以前在用别人的机器的时候已经耳濡目染，自然就了解了。而且由于你想要 Linux 和 Windows 并存于硬盘上，又增加了安装难度。而且你肯定没有得到有经验的 Linux 用户的帮助，否则他们会在20分种之内帮你搞定。一个星期也太夸张了.如果一开始用的就是Linux就没有这个问题。你想想如果你没有用过 windows，你肯定会很习惯 /etc, /usr, /usr/local ,... 而不是 C:, D:, E:, ... 是不是？如果你只用过Linux，你第一次用 windows&nbsp;&nbsp;时恐怕也会问："/bin 目录哪里去了啊？"<br>&nbsp; &nbsp;&nbsp;&nbsp;最重要的是，你用惯了的UNIX工具，它们可以伴随你一生，而不会那么容易变化或消失。你可以永远不用再换另外的工具了。除非那个工具比你这个好的太多，而且可以完全模拟你现在的工具。<br>&nbsp; &nbsp;&nbsp;&nbsp;我们实验室一个60多岁的老师，用vi, cc, make, ...都几十年了，他以前的经验绝对没有白费，而且教会了我们一批又一批的学生。vi 伴随着 UNIX 的最初发行而诞生，直到今天还是世界上头两号编辑器之一！有些人的 FVWM 配置文件已经用了 10 多年，现在完全不经修改还可以用。<br>&nbsp; &nbsp;&nbsp;&nbsp;看看 Windows 的工具，你从 Borland C++ 换到 VC, 就必需适应新的环境：菜单不同了，颜色不同了，按钮不同了，帮助信息不同了，热键不同了，编译器参数，调试器功能也不同了，&#8230;&#8230; <br>&nbsp; &nbsp;&nbsp;&nbsp;那个时候恐怕花要花你很多时间去适应。当你刚刚适应了 VC, 你又要换成VJ, PowerBuilder, C++Builder, ...很多windows程序员都是这样，开头在dos下用Turbo C, 然后是 Borland C, VC, C++ Builder, ......不断追赶微软的潮流。而且微软的SDK, MFC, .NET &#8230;&#8230; 什么都在不断变化，不断出问题，又不断的在修改&#8230;&#8230; <br>&nbsp; &nbsp;&nbsp;&nbsp;Windows 程序员不得不买又厚又重的 Microsoft Press 的书籍，看了才一个月，又过时了。今天你才学会了写&nbsp;&nbsp;VxD，明天你就必须用WDM 了。你不得不注册 MSDN 才能赶上 Microsoft 的步伐。很多人说："计算机是贵族的专业。" <br>&nbsp; &nbsp;&nbsp;&nbsp;这就是微软一手造成的。<br>&nbsp; &nbsp; 这些东西才是没完没了的浪费大家的时间和金钱的。这是是浪费生命！我们为什么不使用从诞生就那么一致和完美的&nbsp;&nbsp;UNIX？你需要理解先进工具的设计理念。UNIX 的工具就像我们用的汽车，它的离合器，油门，刹车，方向盘，后视镜，永远都在同样的位置。用惯了的话，你对你的汽车的每一个部件都会了如指掌，甚至你自己都可以修车了。这难道不好吗？<br>&nbsp; &nbsp;&nbsp;&nbsp;有人说："你说我们需要了解 UNIX，难道你要开车还必须了解汽车的结构吗？" <br>&nbsp; &nbsp;&nbsp;&nbsp;你去问问开车的司机，哪一个不了解汽车的结构的，那他的驾照就是混来的。你难道想要傻瓜型的"微软牌汽车"吗？我们来看看：你买的微软牌汽车最开头只有一个座位，每加一个座位你得向汽车公司付钱。车上的防撞气囊不时会冒出来，说是为了你的安全。每开100英里要大修一次，每过一年要换一次引擎。附带的，你还必须换用由微软汽车公司指定的石油公司提供的新型号的机油。你的车出了问题，但是法律规定，你不准私自拆开你的汽车来修理，你必需到微软汽车公司指定的维修点去，需要付相当多的钱才能修好一个小毛病。<br>&nbsp; &nbsp;&nbsp;&nbsp;最可气的是，你每换一个型号的微软牌汽车，它的刹车和离合器都在不同的位置，你需要重新去考驾驶执照。如果这辆汽车在途中刹车失灵，你受了重伤，你也不能状告微软汽车公司，因为你买来汽车之后必须签一个合同，说"由于微软牌汽车对你和家人造成的一切死伤，微软概不负责。"<br>&nbsp; &nbsp;&nbsp;&nbsp;怎样完全用 GNU/Linux 工作<br>&nbsp; &nbsp;&nbsp;&nbsp;说了这么多 Windows 的不好。我还没有告诉你我怎么用 Linux 处理有些必要的事情。半年以前我由于中文老是配置不好，一直是双系统，不时需要重起到 Win2k 来处理汉字。后来我找到了 miniChinput, XSIM 和 SCIM 输入法。这下可以处理汉字了。而且 VIM 和Emacs&nbsp;&nbsp;对汉字支持越来越好。我的大部分文本是用 VIM 编辑的，包括程序，信件，网页，LaTeX 论文，MetaPost 绘图语言。<br>&nbsp; &nbsp;&nbsp;&nbsp;我不用 Word 这样的程序写论文，而是用 LaTeX，因为这是世界上效果最好，最方便的论文工具，是大多数学术杂志要求的格式。幻灯都是用 ConTeXt 做的，用起来很简单，而且效果非常漂亮。你可以看看我的TeX介绍。<br>&nbsp; &nbsp;&nbsp;&nbsp;至于绘图，你可以用很多可视化的工具，比如 xfig，dia。但是对于我来说，任何可视化的工具都不能完成某些任务，我需要一种可以精确描述图形的语言。我找到了MetaPost。它简单又好用，而且效果是世界一流的。我的插图，如果不是图像，都是MetaPost 画出来的。<br>&nbsp; &nbsp; 我曾经抱怨 mozilla-mail 经常突然消失，损坏我好几封快要完成的信件。后来我发现mozilla <br>的邮件处理程序确实是不稳定的，功能又弱，有经验的 UNIX 用户都不用这样的程序。Mutt 是一个非常稳定可靠的 UNIX 邮件处理程序，而且功能非常强大。我曾经为 Gnome 和 KDE 的不稳定而烦恼。现在我找到了非常强大的 FVWM。KDE，Gnome也能和 FVWM 一起工作。虽然 Gnome 和 KDE 总体不稳定，但是某些部件程序还不错，很多 gtk, Qt 的程序也很不错，它们很多都是可以独立于这些桌面环境运行的。<br>&nbsp; &nbsp; Linux 有很多强大方便的工作方式是 Windows 没有的，或者有类似的东西，但是很差劲或者用起来不方便。比如 ssh 服务，rsync，cvs，expect &#8230;&#8230;<br>&nbsp; &nbsp; 结论<br>&nbsp; &nbsp; 我写这么多的目的是什么？我希望喜欢 Linux 的朋友，完全清除微软和 Windows 灌输在你脑子里的谬论，别再相信它们所谓的"新技术"，别再追赶 Windows，因为追赶Windows ＝ 倒退。马克思有一个思想很重要，"新生事物并不一定是在最近出现的。"<br>&nbsp; &nbsp; UNIX，Xwindow, TeX 虽然都比 Windows 先出现，但是它们才是先进生产力的代表。我们要清楚的认识到什么才是真正的现代化，什么才是真正的自动化。<br>&nbsp; &nbsp; 消除学计算机很难的幻觉，勇敢的拿起像 bash, FVWM, TeX, VIM, Emacs, Mutt &#8230;&#8230;这样强大的程序，勇敢的面对符号。不要再埋怨"Linux 为什么不能像 Windows 那样"，不要再浪费时间试用这样那样的程序，不要再忙着升级。你需要理解 UNIX 的工作方式，因为那是大多数科学家的工作方式。Linux 可以成为你的好朋友，你需要认识它，了解它，信任它，才能完全的靠它来高效的工作。当然，在游戏机，手机，掌上电脑里，或者在用电脑来娱乐的时候，用一些"傻瓜软件"还是不错的.<br>&nbsp; &nbsp; 我希望小学，中学的计算机老师能够提高自己的素质，在孩子们的启蒙教育中充分利用Linux 神秘的特点，引起孩子们对数学，对符号的好奇心。诱导他们用计算机来解决世界上的有趣问题，而不要把教学的范围局限于计算机的操作和它自身的问题。<br>&nbsp; &nbsp; 附录: 我用来处理日常事务的 Linux 程序<br>&nbsp; &nbsp; 好了好了。我知道你发现自己应该转向 Linux，你很后悔当初为什么中了微软的邪。但是不要着急。因为这些东西本来只是工具，它们是用来完成你的主要任务的辅助而已。你以前选错了工具，这不要紧。你还是拥有你自己原来的专业技能，那才是最重要的。工具的东西只有慢慢适应转换，不能一蹴而就，否则你会感到非常没意思，甚至放弃。<br>&nbsp; &nbsp; 如果你只想做一个像我这样的普通用户，主要目的是用 Linux 来完成自己的任务，那就可以不用系统管理员或者网络管理员的标准来要求自己，因为当一个系统和网络管理员确实很辛苦。这里我对实验室的网管同学鞠一躬，谢谢你的指点和帮助. <br>&nbsp; &nbsp; 不用把你的机器当成网络服务器，不用开放没有必要的服务，设置好 ssh, ftp 已经足够了。这样会省去了解很多没必要了解的东西的时间。不用过度考虑"安全"，因为 Linux 缺省已经很安全了。不过你有兴趣了解更多那也无妨。<br>&nbsp; &nbsp;&nbsp;&nbsp;下面给出一些推荐使用的可以处理一般事情的程序。至于你的专业上要用到的科学和工程软件比如 Matlab, Mathematica, Maple, HSpice, Design Compiler, &#8230;&#8230; 还有其它物理上的，化学上的，生物上的 &#8230;&#8230; 都必然有 Linux 和 UNIX 的版本。当然他们很多不是免费的，不要总是觉得什么都应该免费，自由不等于免费。它们是经过很多人辛勤劳动的产物，是可靠的程序，它们物有所值。<br>&nbsp; &nbsp;&nbsp;&nbsp;下面列出我常用的一些 Linux 程序。一个列表里可能有很多，那是为了方便你来选择，我列出了比较信得过的。但其实很多只有第一个是我真正在用的，我不喜欢试用程序。我不是一个合格的网络管理员，我的服务器都只设置了我自己需要的功能，那样可以省去我很多麻烦。<br>&nbsp; &nbsp;&nbsp;&nbsp;Shell: bash。它结合了 csh 和 ksh 的优点，并且有 readline 功能，你可以随意绑定自己的键盘。<br>&nbsp; &nbsp;&nbsp;&nbsp;编辑器： VIM, Emacs。<br>&nbsp; &nbsp;&nbsp;&nbsp;程序开发： GCC, make, ld, Scheme48, j2sdk, Perl, Python, Tcl/Tk ...<br>&nbsp; &nbsp;&nbsp;&nbsp;论文，幻灯工具：LaTeX, ConTeXt<br>&nbsp; &nbsp;&nbsp;&nbsp;绘图工具：MetaPost。这个语言太强了，以至于我只用它了。你不熟悉的话可以用xfig, dia 来画一些流程图之类的图片。<br>&nbsp; &nbsp;&nbsp;&nbsp;图像处理：ImageMagick。其中的 import 程序可以屏幕抓图，convert 程序可以转换图像格式，display 可以显示图片和简单编辑(缩放，换质量，转格式，简单绘图，简单虑镜)。通常我就这么点需要。如果你要更强大的图像工具可以用 Gimp, 它几乎和Photoshop差不多。<br>&nbsp; &nbsp;&nbsp;&nbsp;自动管理工具：make。我可以用make来自动编译程序，自动编译文档，自动更新插图&#8230;&#8230; 全自动，而且不会重复劳动。<br>&nbsp; &nbsp;&nbsp;&nbsp;数值计算程序：SciLab。这个程序基本上可以代替 Matlab。<br>&nbsp; &nbsp;&nbsp;&nbsp;代数计算程序：MAXIMA。这个程序基于世界上最老的计算机代数系统之一: 由美国能源部(DOE)发行的 MIT Macsyma 系统。它是用 Common Lisp 实现的。很多现在的符号计算程序比如 Maple 都从 MAXIMA 身上学到很多东西。它现在经过 DOE 批准以GPL发行，永远是一个自由软件。<br>&nbsp; &nbsp;&nbsp;&nbsp;加密程序：GnuPG。我的 PGP 密钥就是它搞出来的。<br>&nbsp; &nbsp;&nbsp;&nbsp;打包，压缩程序。什么都有: tar, gzip, bzip2, zip, rar, ...<br>&nbsp; &nbsp;&nbsp;&nbsp;虚拟光驱程序。Linux 不需要虚拟光驱程序，直接 mount 就行了。<br>&nbsp; &nbsp;&nbsp;&nbsp;ftp 服务器：proftpd, vsftpd。proftpd 功能很强，但是我只用了最简单的一种设置。<br>&nbsp; &nbsp;&nbsp;&nbsp;WWW 服务器：apache。(我一般没有开)<br>&nbsp; &nbsp;&nbsp;&nbsp;ftp 客户程序：lftp，ncftp。它们都是文本方式操作的，但是比起图形界面的方便的多。比如 lftp 几乎具有 bash 的所有方便功能，Tab 补全，bookmark, queue, 后台下载，镜像&#8230;&#8230; Linux 也有图形界面的 ftp 客户程序，但是大多不稳定，有很多问题。这就是很多人抱怨 Linux 不如 Windows 的一个小原因。还有很多人用 Wine 模拟 Windows 的leapftp，其实 lftp 比 leapftp 好很多，你需要的只是适应一下。<br>&nbsp; &nbsp;&nbsp;&nbsp;自动下载工具：wget。它非常稳定，有一次我下载一个程序，用 IE 和 Mozilla 下载回来的文件都是坏的，最后还是 </div>
<div style="FONT-SIZE: 10pt">
<div style="FONT-SIZE: 10pt">可靠的传输了数据。用它甚至可以镜像整个网站，比起WebZip 这样的 Windows 程序强多了，而且不会因为你不付钱就在下载回来的网页里强制插入广告。<br>&nbsp; &nbsp;&nbsp;&nbsp;虚拟终端：rxvt, xterm, gnome-terminal, mlterm, ...X server: XFree86<br>&nbsp; &nbsp;&nbsp;&nbsp;窗口管理器：FVWM。编译加入了 libstroke。<br>&nbsp; &nbsp;&nbsp;&nbsp;中文输入：XSIM。被我修改过以适应 FVWM 的需要。另外推荐你还可以用 SCIM。<br>&nbsp; &nbsp;&nbsp;&nbsp;email 处理：Mutt + Postfix + fetchmail<br>&nbsp; &nbsp;&nbsp;&nbsp;看 PDF, PS, DJVU 文件：Acrobat Reader, xpdf, GhostScript, gv, djvu工具包和netscape 插件。<br>&nbsp; &nbsp;&nbsp;&nbsp;看CAJ文档。我从来不看CAJ之类的文档，如果找不到PDF或PS，直接去图书馆借最好。<br>&nbsp; &nbsp;&nbsp;&nbsp;看网页：Mozilla, Phoenix, lynx。Mozilla-Xft 的显示效果比IE 好很多。<br>&nbsp; &nbsp;&nbsp;&nbsp;英汉字典：IBM智能词典，星际译王。<br>&nbsp; &nbsp;&nbsp;&nbsp;编辑网页：我用VIM 直接写 HTML。你如果想要图形方式的可以用其它的比如screem, BlueFish。<br>&nbsp; &nbsp;&nbsp;&nbsp;登录其它 UNIX, Linux 机器：openSSH, telnet。 我喜欢用 openSSH 把其它机器的X 程序通过 ssh 加密的隧道传到我机器上显示。<br>&nbsp; &nbsp;&nbsp;&nbsp;登录 Windows2000 server 的 display service: rdesktop，...我有一天试了一下，不错。后来就没有用过了。<br>&nbsp; &nbsp;&nbsp;&nbsp;同步程序：rsync。我用 rsync 通过 ssh 来跟某些机器同步数据，或者做自己机器上不同目录间的同步。<br>&nbsp; &nbsp;&nbsp;&nbsp;上BBS：rxvt(或任何一种终端) + telnet + chatbot(helloooo 机器人的程序)<br>&nbsp; &nbsp;&nbsp;&nbsp;QQ, ICQ: 我没有 QQ 或 ICQ。不过你可以用 Gaim, 它同时支持 QQ, ICQ 和很多其它的即时通信方式。ICQ <br>&nbsp; &nbsp;&nbsp;&nbsp;用户也可以用 Licq。<br>&nbsp; &nbsp;&nbsp;&nbsp;放录像：MPlayer, RealPlayer。MPlayer 太好了，直接就可以放 VCD, DVD, divx, wma, wmv ... 用 Windows 的同学都很羡慕我，说 Windows 要放这个需要大堆插件。rm 最好还是用 realplayer 放，它也是免费的。<br>&nbsp; &nbsp;&nbsp;&nbsp;放音乐： xmms(mp3,ogg都可以), mpg321(放mp3), ogg123(放ogg)。mpg321 不如xmms管理音乐文件那么方便，但是有时我还是用 mpg321 放 mp3 作为背景音乐，因为懒得开一个xmms窗口:-)<br>&nbsp; &nbsp; 游戏：我觉得 KDE 的那个 ksokoban(推箱子)，很好玩 :-)<br>&nbsp; &nbsp; 看 Word 文档。请 Word 用户把文档全部转为 PDF 或 PS 再给我，文档里没有特殊的格式干脆就用文本吧，何必那么麻烦。以前很奇怪的是，通知里本来没有什么特殊的格式居然还要发doc附件的email。现在好了，我们系发通知都用文本，PDF，甚至图片了。<br>&nbsp; &nbsp; 其它程序：还有很多我需要用而你不一定用得着的。比如，Doctor Scheme,Scheme48, Scsh, kawa...这些程序只有 Doctor Scheme 有Windows版本。还有很多幕后工作但是你一般不察觉的：xinetd, telnetd, sshd, crond, atd, lpd,&nbsp;&nbsp;... 他们都比 Windows 的对应者强的多，或者根本没有对应者。</div>
</div>
<img src ="http://www.cnitblog.com/bbming/aggbug/26551.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/bbming/" target="_blank">老Ming</a> 2007-05-01 08:34 <a href="http://www.cnitblog.com/bbming/archive/2007/05/01/26551.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下DNS服务器架设攻略(转)(2004-12)</title><link>http://www.cnitblog.com/bbming/archive/2007/04/13/25670.html</link><dc:creator>老Ming</dc:creator><author>老Ming</author><pubDate>Fri, 13 Apr 2007 02:45:00 GMT</pubDate><guid>http://www.cnitblog.com/bbming/archive/2007/04/13/25670.html</guid><wfw:comment>http://www.cnitblog.com/bbming/comments/25670.html</wfw:comment><comments>http://www.cnitblog.com/bbming/archive/2007/04/13/25670.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/bbming/comments/commentRss/25670.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/bbming/services/trackbacks/25670.html</trackback:ping><description><![CDATA[<strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong>大家要注意，DNS服务是许多服务的基础，所以一般刚开始学习Linux服务器配置时从此下手，那其它的应用也就简单得多了。笔者进阶学习Linux，也是从此开始的。
<p><strong><font color=#0000ff>一、&nbsp;相关知识概述</font></strong></p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong>DNS（Domain Name System）即域名服务系统，作用为完成域名与IP地址的互换。网络上的每一台主机都有一个域名,域名给出有关主机的IP地址、MAIL路由信息等等。而域名服务器(name server)则是指存储有关域名空间信息的程序，具体应用也通过它来完成。</p>
<p><strong><font color=#0000ff>二、&nbsp;DNS服务器软件的安装</font></strong></p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong>在Linux中都是用Bind来实现此服务，即以一个名为&#8220;named进程&#8221;作为域名服务<br>器进程的主体。</p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong>1.&nbsp;从<a class=10 href="http://www.redhat.com/"><u><font color=#0000ff>http://www.redhat.com</font></u></a>上下载安装Bind所需的三个文件：<font color=#ff0000>bind-8.2.2-p5-9.i386.rpm、<br>bind-devel-8.2.2-p5-9.i386.rpm、cache-nameserver-6.2-2.noarch.rpm</font>。</p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong>2.&nbsp;分别对三个文件进行rpm封装的安装，使用命令：<font color=#ff0000>rpm &#8211;uhv</font>。</p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong>3.&nbsp;最后进行编译并安装，使用命令：<font color=#ff0000>make和make install</font>。</p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong>经过以上步骤，基本软件已经安装妥当，接下来就是对服务器软件的配置。</p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong>named 这个主体进程在启动时需要读取一个初始化文件，缺省为 /etc/named.boot。另外建议大家使用Linux自带的ndc工具来进行启动、中止、重启动、刷新DNS数据、输出DNS数据等多种调试，有关此工具的详细使用，请大家参见Linux技术文档。</p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#0000ff>第一步：配置建立named.boot。</font></strong>因为这是named进程首先要读取的配置文件，但此文件默认状态下又包含任何 DNS 数据，需我们手工输入来建立，以下为一配置实例：<br>&nbsp;&nbsp;&nbsp; Directory/var/named</p>
<p>&nbsp;&nbsp;&nbsp; Primary site.com db.site<br>&nbsp;&nbsp;&nbsp; Primary 0.0.127.IN-ADDR.ARPA db.127.0.0<br>&nbsp;&nbsp;&nbsp; Primary 56.11.192. IN-ADDR.ARPA db.192.11.56<br>&nbsp;&nbsp;&nbsp; sitecache.db.sitecache</p>
<p>&nbsp;&nbsp;&nbsp; 每一行的意义解释如下（例中涉及到的文件名都可自行拟定，包括第三、四两行）：<br>Directory/var/named：指定named进程读取所有DNS数据文件的路径，本例为/var/named目录，当然你可以自行更改。</p>
<p>&nbsp;&nbsp;&nbsp; Primary site.com db.site：将named作为site.com的主域名服务器（正向域名转换数据），并指定将所有 *.site.com 形式的域名转换数据保存在db.site文件中。</p>
<p>&nbsp;&nbsp;&nbsp; 两段primary的IP数据：设定 named 作为某个IP地址段（只给三位）的转换主服务器（反向域名转换数据），而象db.127.0.0 文件，则是指定127.0.0.* 类的IP地址到域名的转换数据存放于此。<br>sitecache.db.sitecache：指定 named 从 db.sitecache 文件获得互联网的顶层服务器地址。<br><br>&nbsp;&nbsp;<strong><font color=#0000ff>&nbsp; 第二步：根据刚才配置的named.boot，定义每一个DNS数据文件。</font></strong></p>
<p>&nbsp;&nbsp;&nbsp; <font color=#ff0000>1.&nbsp;正向域名转换数据文件db.site 的建立</font>，给个例子：<br>&nbsp;&nbsp;&nbsp; @ IN SOA linux.site.com. root.linux.site.com. (<br>　　200410301<br>　　28800 <br>　　7200<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3600000 <br>　　86400 )<br>&nbsp;&nbsp;&nbsp; NS linux.site.com.<br>　　MX 10 support.site.com.<br>-&nbsp; -&nbsp; -&nbsp; -&nbsp; -&nbsp; -&nbsp; -&nbsp; -&nbsp; -&nbsp; -&nbsp; -&nbsp; -&nbsp; -&nbsp; -&nbsp; -&nbsp; <br>&nbsp;&nbsp;&nbsp; Localhost A 127.0.0.1<br>&nbsp;&nbsp;&nbsp; Sy727 A 192.11.56.24<br>&nbsp;&nbsp;&nbsp; Sy728 A 192.11.56.25<br>&nbsp;&nbsp;&nbsp; Linux A 192.11.56.26<br>&nbsp;&nbsp;&nbsp; Mail MX 10 sy727.site.com.<br>&nbsp;&nbsp;&nbsp; MX 20 sy728.site.com.<br>&nbsp;&nbsp;&nbsp; www CHAME Linux.site.com.<br>&nbsp;&nbsp;&nbsp; ftp CNAME Linux.site.com.</p>
<p>&nbsp;&nbsp;&nbsp; 解释：第一部分第一行SOA后跟的是DNS 服务器名和管理员邮件地址；下面几列数字是在数据交换时要用到的，一般都不作改过；NS行定义域名服务器本身的域名；MX行定义相应的邮件服务器名。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第二部分前4行是DNS域名到IP地址的记录配置，这是必须要的；如第二行，表示sy727.site.com域名对应的IP地址为192.11.56.24。以MX引导的两行是定义邮件地址转换记录，如将<a class=10 href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#88;&#88;&#88;&#64;&#109;&#97;&#105;&#108;&#46;&#115;&#105;&#116;&#101;&#46;&#99;&#111;&#109;">XXX@mail.site.com</a>转换成<a class=10 href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#88;&#88;&#88;&#64;&#115;&#121;&#55;&#50;&#55;&#46;&#115;&#105;&#116;&#101;&#46;&#99;&#111;&#109;">XXX@sy727.site.com</a>。最后两行是定义应用服务的主机名，本例中将Linux.site.com做为WWW服务和FTP服务的主机别名，即通过输入Linux.site.com即可访问<a class=10 href="http://www.site.com/">www.site.com</a>或<a class=10 href="ftp://ftp.site.com/">ftp.site.com</a>。</p>
<p>&nbsp;&nbsp;&nbsp; <font color=#ff0000>特别注意：MX和CHAME这四行记录的主机名最后必须带个点号。<br></font><font color=#ff0000></p>
</font>
<p><font color=#ff0000>&nbsp;&nbsp;&nbsp; 2.&nbsp;反向域名转换数据文件db.127.0.0和db.192.11.56的建立。</font><br>&nbsp;<br>&nbsp;&nbsp;&nbsp; 反向域名转换数据文件用来提供根据IP地址查询相应DNS主机名，每个网段分别有一个数据文件。<br><br>&nbsp;&nbsp;&nbsp; &#8220;127.0.0&#8221;这个内部网址相信大家都知道，就一个IP地址：127.0.0.1，其配置例为：<br>&nbsp;&nbsp;&nbsp; @ IN SOA linux.site.com root.linux.site.com. (<br>　　2004080700<br>&nbsp;&nbsp;&nbsp; 28800<br>&nbsp;&nbsp;&nbsp; 14400<br>&nbsp;&nbsp;&nbsp; 3600000<br>&nbsp;&nbsp;&nbsp; 86400 )<br>&nbsp;&nbsp;&nbsp; IN NS linux.site.com.</p>
<p>&nbsp;&nbsp;&nbsp; 1 IN PTR localhost.<br>&nbsp;&nbsp;&nbsp; 而&#8220;192.11.56&#8221;因为其为外部网段，故配置中应包括所有主机IP地址到DNS主机名的转换数据，配置例为：<br>&nbsp;&nbsp;&nbsp; @ IN SOA linux.site.com. root.linux.site.com. <br>&nbsp;&nbsp;&nbsp; (199609206<br>&nbsp;&nbsp;&nbsp; 28800<br>&nbsp;&nbsp;&nbsp; 7200<br>&nbsp;&nbsp;&nbsp; 604800<br>&nbsp;&nbsp;&nbsp; 86400)<br>&nbsp;&nbsp;&nbsp; NS linux.site.com.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; All hosts</p>
<p>&nbsp;&nbsp;&nbsp; 24 PTR sys727.site.com.<br>&nbsp;&nbsp;&nbsp; 25 PTR sys728.site.com.<br>&nbsp;&nbsp;&nbsp; 26 PTR linux.site.com.</p>
<p>&nbsp;&nbsp;&nbsp;<font color=#ff0000> 3．在线获取db.sitecache。</font><br>&nbsp;&nbsp; 从<a class=10 href="ftp://ftp.rs.internic.netr/">ftp.rs.internic.netr</a>的domain/named.root下载named.ca，此文件里即包含了前面所说的互联网顶层域名服务器；然后将其拷贝到/var/named目录并重命名成db.sitecache（即你在named.boot配置文件中指定的文件名）即可。</p>
<p>&nbsp;&nbsp;&nbsp; <strong><font color=#0000ff>第三步：测试此named进程。</font></strong></p>
<p>&nbsp;&nbsp;&nbsp; 1.&nbsp;用前面讲到的Linux自带DNS测试工具ndc来启动 named：<br>&nbsp;&nbsp;&nbsp; ndc&nbsp; named<br>&nbsp;&nbsp;&nbsp; 2.&nbsp;创建/etc/resolv.conf文件，本例为：<br>&nbsp;&nbsp;&nbsp; search site.com<br>&nbsp;&nbsp;&nbsp; nameserver 192.11.56.26<br>&nbsp;&nbsp;&nbsp; 3.&nbsp;测试named，命令行为：<br>&nbsp;&nbsp;&nbsp; Nslookup<br>&nbsp;&nbsp; 如果named正常启动，nslookup后即会显示出当前DNS服务器的地址和域名，否则表示named启动异常，需重新检查前面的设置步骤。</p>
<p>&nbsp;&nbsp;&nbsp; OK，经过以上步骤，属于你的Linux版DNS服务器已搭建完成，而关于建成之后的基本DNS诊断以及DNS维护，请大家参阅IT168相关报道。好了，大家赶快去试试吧！</p>
<p>&nbsp;</p>
<img src ="http://www.cnitblog.com/bbming/aggbug/25670.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/bbming/" target="_blank">老Ming</a> 2007-04-13 10:45 <a href="http://www.cnitblog.com/bbming/archive/2007/04/13/25670.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习C/C++的经验谈 转</title><link>http://www.cnitblog.com/bbming/archive/2007/04/10/25513.html</link><dc:creator>老Ming</dc:creator><author>老Ming</author><pubDate>Tue, 10 Apr 2007 03:47:00 GMT</pubDate><guid>http://www.cnitblog.com/bbming/archive/2007/04/10/25513.html</guid><wfw:comment>http://www.cnitblog.com/bbming/comments/25513.html</wfw:comment><comments>http://www.cnitblog.com/bbming/archive/2007/04/10/25513.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/bbming/comments/commentRss/25513.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/bbming/services/trackbacks/25513.html</trackback:ping><description><![CDATA[<span id="txtObj_0"><span style="color: #020000;">学习C/C++的经验谈</span><br><br>&nbsp;&nbsp;&nbsp;&nbsp;工作已经有三年半，算上学校里的时间，大约已有7年的C语言和
5年的C++使用经验；熟练使用C/C++也有3年以上；现在的我自认为是可以称得上精通C/C++，基本现在市面上广泛被推崇的经典书籍，如：《C++
Primer》、《高级C++编程技术》、《STL原码剖析》、《Effective C++》、《C编程陷阱》、《Thinking in
C++》等等，这些书只有《高级C++编程技术》和《C编程陷阱》在早些时候是通篇看完的（也是因为它们都比较薄），其它的现在基本上都已经不能启发我
了，这些书虽然内容各不相同，但针对的读者水平是一样的，应该是已经学会编程语言，能够独立编程但尚未精通，在某些方面存在一定问题或欠缺的人；<br>&nbsp;&nbsp;&nbsp;&nbsp;对于书籍，我现在的追求又回到了纯理论，基本上是远离编程语言和计算机，比如，小波变换和《Algorithm I-IV》；<br><br>&nbsp;&nbsp;&nbsp;&nbsp;言归正传，关于很多人疑问的先学什么后学什么的问题，我认为：如果你选择C++作为最终的工具，或者是以C++为主的，那么我强烈建议你先学习C语言；<br>&nbsp;&nbsp;&nbsp;&nbsp;
首先要说明的是，C和C++是两件截然不同的东西，学习C++可以完全没有C的基础，或者说可以完全不用先学C；但是，这样你是永远也不可能成为真正的C
++大师的；你最多只能成为一个C++的熟练工人；C和C++有一个共同的奥义：内存管理，而你不学习C，单从对C++的理解是不可能掌握这项最伟大的技
术的；<br>&nbsp;&nbsp;&nbsp;&nbsp;C++是面向对象的，C不是，它的特点是结构化程序设计思想，或者说是面向过程的；而C++在语法上以C的语法为基础，兼容C的语
法，这让它看上去有点凌乱；甚至C的程序不需要任何改动就可以用C++的编译器编译；对于已经掌握C语法的人，学习C++比学习其它语言（如
Delphi）要觉得容易些；而对于资深的C程序大师，那么学习C++是痛苦的，甚至完全接受不了C++，因为他们的本质是不同的；<br>&nbsp;&nbsp;&nbsp;&nbsp;同
样，如果你有一定的C++基础，那么学习Java你也会觉得容易；但对于真正的C++大师，他是不会接受Java的；每一种语言都有它的精髓和奥义，虽然
C、C++、C#和Java都属于同一语言体系，但他们之间是天差地别的，只有真正进入它们的世界的高人才可以感受到这种质的区别；<br>&nbsp;&nbsp;&nbsp;&nbsp;如果你本打算最终学习C#或Java，那么你完全不需要学习C或C++，不需要以C/C++为基础；<br>&nbsp;&nbsp;&nbsp;&nbsp;
如果你在学习C之前从未接触过编程，那么很遗憾，作为第一门程序语言，C是最难学的；C不是我的最初学习的程序语言，我的第一门程序语言是QBASE，在
高中的计算机课上，貌似是个数据库和报表的编程环境；所以，和许多大学生朋友们不一样，在我学习C之前，就知道计算机程序是怎么一回事了；<br>&nbsp;&nbsp;&nbsp;&nbsp;
学习计算机程序有两大难点，第一，就是要理解&#8220;程序是什么&#8221;，第二，就是要理解你所学的这门语言是什么；因为C语言的第二个问题很深奥，如果你之前又没有
接触过其他程序语言，对于计算机程序是什么的理解都还很模糊，那么你就会觉得一头雾水，而且学习计算机程序和以往你从小学到高中的任何一门课都不同，既不
是靠背也不是靠算，尤其是农村来的同学，有的连计算机都没见过，学习编程就是有力使不上的感觉，越是使大力气就越是晕；<br>&nbsp;&nbsp;&nbsp;&nbsp;简单地说，编程就
是通过原子指令的组合，去达到你需要实现的目的，而达到同样的目的，选择的原子指令的种类与数量，组合的流程与方式，都是不唯一的；我认为最恰当的比喻应
该是搭积木，书本所写的只有各种积木的介绍，所以你靠背书只能背下所有积木的知识，但是却不能搭出房子来；书本的例子只是教你几种房子的搭法，你照样画
瓢，也只会搭那几种房子；编程的难点在于，你只有各种积木和要搭的房子的照片，你要想的是如何去搭，而且很明显搭的方法是不固定的；所以，光看不练等于没
学；编程的关键是在于怎么搭房子，而不是各种积木都是什么；<br>&nbsp;&nbsp;&nbsp;&nbsp;所以，如果你以为看完了多少本书就是学会了一门编程语言的时候，即便书的作者多么伟大，书的内容多么精妙，你其实什么都没有学会，还是傻呆呆地站在起跑线上呢；<br>&nbsp;&nbsp;&nbsp;&nbsp;学习第一门编程语言首先要解决的就是&#8220;程序是什么&#8221;的概念，&#8220;程序&#8221;的定义任何书上都有，但真正的理解只有靠自己去切身体会，当你认为明白&#8220;程序&#8221;是个什么东西的时候，才仅仅是开始入门；<br>&nbsp;&nbsp;&nbsp;&nbsp;
第二个问题，C语言是什么？这个答案可能每一个人都不一样；我说，C语言就是指针，C语言中一切都是指针，这就是我那么多年对它的理解；为什么说C比其它
语言难学？因为指针！有了指针，使得C更接近物理的计算机，因为其它语言没有指针这个概念，使得它们的抽象化程度更高，更接近人类的思维；想学好C语言就
必须学会以计算机的方式去思考问题，所有的C语言大师都会用人脑凭想象编译代码和调试程序；<br>&nbsp;&nbsp;&nbsp;&nbsp;如果你尚停留在看int是int，看double是double的阶段，那么你才刚刚入门；只有看int不是int，看double不是double，用指向int的指针操作double的数据，当你抛弃类型这个概念的时候，你才是走上了成为一名熟练工人的道路；<br>&nbsp;&nbsp;&nbsp;&nbsp;
学习任何学问都是一样，都是从简单到复杂，再从复杂到简单；只有当你可以用很简单的话去归纳和总结它的时候，才是真正掌握它的时候；学习编程就是要靠个人
亲自去体验获得领悟，不是他人的语言和文字所能灌输的，而C语言的难度在于，别的语言可能你累计编写1万行代码就可以掌握，C语言可能就需要2万、3万
行，那绝对是一个倍数的差距；<br><br>&nbsp;&nbsp;&nbsp;&nbsp;C++的奥义当然是面向对象；但是掌握C++的语法并不代表就掌握面向对象的技术，这个世界上使用
C++却不懂面向对象的人很多；C++仅仅是支持面向对象，也就是说他的语法包含面向对象的特点，但面向对象不是语言特质，而是一种思想；C不是面向对象
的语言，但用C一样能写出具有面向对象思想的程序；<br>&nbsp;&nbsp;&nbsp;&nbsp;什么是面向对象？这同样是需要亲身去体会的；我认为这是比学习C语言更需要时间的琢磨的事情；<br>&nbsp;&nbsp;&nbsp;&nbsp;对相当一部分人而言，C++、C#和Java都不是面向对象的语言；<br>&nbsp;&nbsp;&nbsp;&nbsp;自己不写类，或几乎不写类，或很少写类，或写类也就写那么几个的，都不是面向对象的程序员；<br>&nbsp;&nbsp;&nbsp;&nbsp;只知道使用别人写的类的，也不是面向对象的程序员；<br>&nbsp;&nbsp;&nbsp;&nbsp;只有自己写类，写很多类，写类库，自己调用自己写的类，类之间相互调用、继承，才能算得上是具有面向对象思想的程序员；此外，还要看类的层次、接口设计是否合理，才能区分掌握面向对象的技术程度；<br>&nbsp;&nbsp;&nbsp;&nbsp;C
++明显要比C#和Java难学，原因：第一，指针！C++是永远也不会放弃指针的，如果你接受不了它，那么请选择那些没有指针的语言；C和C++两大共
同的奥义就是：内存管理，和程序员是不会犯错误的；如果程序员写错了代码，那么他一定是有他这样写代码的理由，这就是C/C++的理解；因此，指针这个最
危险的东西成为了大师们最喜爱的利器，也是C/C++中最最重要的部分；所以，C++中不会出现内存回收器那种多余的东西；（因为程序员是不会犯错误的，
那么内存泄露也是有他需要泄露的理由的，如果你觉得这句话很可笑，那么你还离大师很远呢，直到你认为它真的是太正确了）<br>&nbsp;&nbsp;&nbsp;&nbsp;第二，凌乱的语
法，因为它实际包含了两种语言的语法，而且部分C语言的关键字在C++中被赋于了新的含义，但又保留原来在C语言中的含义；如果你是初学者，当你不清楚编
译器什么时候做C解释，什么时候做C++解释的时候，就容易产生混淆；通常，C++的程序员学习C#和Java很快，但C#和Java的程序员学习C++
基本就和他们刚学C#和Java那会一样，几乎没有任何可以借鉴的地方；<br>&nbsp;&nbsp;&nbsp;&nbsp;C++之所以会这样，这与它的发展历史有关，C++最早的时候叫
C with
Class，而早期版本的C++编译就是直接将C++代码转换为C代码再进行编译的；所以，C++现在的特性都是可以由C实现的，如果你能理解这一点，对
你学习C++是很有帮助的；或者，你可以将C++理解为，为了面向对象而偷换概念的C；<br><br>&nbsp;&nbsp;&nbsp;&nbsp;对于具体怎么学习编程，学习的时候一本书就足够了，而且不需要多么高深的书，不需要是外国人写的，学校发的教材就可以了，虽然你最后会发现它错误百出，又不全面，但高手都是以这样的书起步，最后又把它扔掉的；对于书的态度，只要它的水平比你高就可以了；<br>&nbsp;&nbsp;&nbsp;&nbsp;学习没有任何诀窍，也没有太多的经验可以传授的，听课、看书，然后编习题，最好是看一章编一章的习题，不要把整本书都看完了再去编程；打开书编书本的例子，合上书编书本的习题，习题的正确与否以你程序的效果为准，而不是正确答案或别人写的程序；<br>&nbsp;&nbsp;&nbsp;&nbsp;我个人的经历，大学里没有看课本以外的编程书，没有做老师布置的以外的习题，所有习题都是自己独立完成的；所以，书上的例子和习题其实我也是没有做全的，如果你做全了，那我佩服你；起码做到和我一样，你就是全系C语言第一名！<br><br>&nbsp;&nbsp;&nbsp;&nbsp;最后是关于书的选择，首先是针对那些从零学起，白手起家的同学，前面我列举的书都不适合你，普通的大学教材（学校里发的）就最适合你了，个人建议潭浩强（我就是用他的C语言教材的）和钱能（没看过，听说不错）的；<br>&nbsp;&nbsp;&nbsp;&nbsp;对于已经学会语法，能够合上书独立编程，且累计编写的程序达到1万行的，可以看前面我列举的书，直到觉得这些书很无聊为止；<br>&nbsp;&nbsp;&nbsp;&nbsp;
对于接触C/C++三年以内的同学，不要看任何关于实际开发环境的书籍，如：封面上带有Microsoft Visual
C++字样的书，号称多少天学会或精通C++的书（那是笑话你也信？），各种编程安例、实例，什么一百例，一千例的书（一百万例也不要去理他），看上去很
时髦的书，什么网络编程啊，什么图象、声音、多媒体啊，什么黑客啊，什么网站开发啊，以上通通都不要去看，有百害而无一利；<br>&nbsp;&nbsp;&nbsp;&nbsp;其实很简单，从菜鸟到高手用不了几本书，但需要很多个键盘；<br>&nbsp;&nbsp;&nbsp;&nbsp;（本文只讨论语言学习，其他的书（如数据结构和算法等）我就不提了，见谅）</span><img src ="http://www.cnitblog.com/bbming/aggbug/25513.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/bbming/" target="_blank">老Ming</a> 2007-04-10 11:47 <a href="http://www.cnitblog.com/bbming/archive/2007/04/10/25513.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一名25岁的董事长给大学生的18条忠告（转）</title><link>http://www.cnitblog.com/bbming/archive/2006/12/30/21351.html</link><dc:creator>老Ming</dc:creator><author>老Ming</author><pubDate>Sat, 30 Dec 2006 15:31:00 GMT</pubDate><guid>http://www.cnitblog.com/bbming/archive/2006/12/30/21351.html</guid><wfw:comment>http://www.cnitblog.com/bbming/comments/21351.html</wfw:comment><comments>http://www.cnitblog.com/bbming/archive/2006/12/30/21351.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/bbming/comments/commentRss/21351.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/bbming/services/trackbacks/21351.html</trackback:ping><description><![CDATA[1.<font color="#009900"><strong>一定要有独立的人格、独立的思想。</strong></font>一个经过独立思考而坚持错误观点的人比一个不假思索而接受正确观点的人更值得肯定。<u>不要成为灌输教育的牺牲品。</u><div><br /> 2.仕途，商界，学术。大致说来，每个人都注定要走上三条道路中的某一条。<u>在进行职业生涯规划的时候，不妨以此作为思考的出发点。根据不同的职业生涯规划来塑造各自的核心竞争力。</u><font color="#009900"><strong>只有知道自己以后要做什么，才能知道自己应该学什么。</strong></font></div><div><br /> 3.<font color="#009900"><strong>专业无冷热，学校无高低</strong>。</font>没有哪个用人单位会认为你代表了你的学校或者你的专业。<u>千万不要因为你是名牌大学或者热门专业而沾沾自喜，也大可不必因为你的学校不好或者专业冷门而自卑。</u></div><div><br /> 4.<font color="#009900"><strong>千招会，不如一招熟。</strong></font>十个百分之十并不是百分之百，而是零。如果你有十项工作每项都会做百分之十，那么，在用人单位眼中，你什么都不会。<u>所以，你必须要让自己具备核心竞争力。“通才”只有在“专才”的基础上才有意义。 </u></div><div><br /> 5.<font color="#009900"><strong>不逃课的学生不是好学生。什么课都不逃，跟什么课都逃掉没什么两样。</strong></font><u>一定要掌握学习的主动性，不要像读中学一样被老师牵着鼻子走。</u>逃课没有错，但是不要逃错课。同时，既要逃课，又要让老师给高分。</div><div><br /> 6.<strong><font color="#009900">一定要学会理财。</font></strong><u>对于贫困生来说，首先要做的不是挣钱，而是省钱。</u>很多大学生读书的时候一掷千金，可是，毕业以后一个月的工资还不够交半个月的房租。 </div><div><br /> 7.大部分女生将电脑当成了影碟机，大部分男生将电脑当成了游戏机。<font color="#009900"><strong>大学生要掌握必要的计算机操作能力，但是，很多时候电脑会成为浪费时间的堂而皇之的借口。</strong></font><u>有电脑的大学生非常多，可是，这中间很多人可能大学毕业的时候还不会Excel，不会做一个像样的PPT.</u></div><div><br /> 8.<font color="#009900"><strong>做事不如做人，人脉决定成败。</strong></font><u>一个人有多少钱并不是指他拥有多少钱的所有权，而是指他拥有多少钱的使用权。</u>一个人具备多少能力，不只是说他一个人的时候能做什么，还包括他能通过别人做什么。一个人赚的钱，12.5%是靠自身的知识，87.5%则来自人脉关系。三十岁以前靠专业赚钱，三十岁以后拿人脉赚钱。所以，请好好珍惜大学期间建立起来的人脉关系。这几年你认识的朋友可能会是你毕业以后最可宝贵的财富。</div><div><br /> 9.互联网固然威力无穷，但是，如果你沉迷于网络聊天，或者沉迷于网络游戏，<font color="#009900"><strong>浪费的金钱倒是可以弥补，荒废的青春就无可追寻了。</strong></font><u>轻舞飞扬已经红颜薄命了，而痞子蔡却继续跟别的女孩发生着一次又一次的亲密接触。</u>对于很多大学生而言，<font color="#009900"><strong>网吧就是一个血淋淋的黑洞。</strong></font></div><div><br /> 10.<font color="#009900"><strong>爱情是不期而至的，可以期待，但不可以制造。</strong></font>花开堪折方须折，莫让鲜花败残枝。<u>一个有一万块钱的人为你花掉一百元，你只占了他的百分之一；而一个只有十块钱的人为你花掉十块，你就成了他的全部。</u></div><div><br /> 11.研究生扩招的速度是30%，也就意味着硕士学历贬值的速度是30%。<font color="#009900"><strong>千万不要以为考研究生就是积极进取的表现。对于很多人而言，考研不过是一种消极逃避的方式罢了。</strong></font><u>对于绝大多数人而言，读研究生纯粹是浪费时间浪费金钱，立志从事科研、学术的人及其他少数人除外。</u></div><div><br /> 12.<font color="#009900"><strong>不要一门心思想着出国，更加不要迷信外国的月亮比中国圆。</strong></font>削尖脑袋记GRE词汇很可能是一件非常愚蠢也非常可悲的事情。<u>既然全世界的公司都想到中国的市场上来瓜分蛋糕，为什么中国人还要一门心思到国外去留学然后给外国人打工？</u></div><div><br /> 13.人才市场就是一个地雷阵。<font color="#009900"><strong>通过多种方式求职固然没有错，但是千万不要饥不择食。</strong></font><u>只要用人单位一说要你交钱，你掉头就走便是了。</u></div><div><br /> 14.求职简历必须突出自己的核心竞争力。<font color="#009900"><strong>求职的时候大可不必像严守一那样“有一说一”，必要的时候恰到好处地说一些谎言是非常有用的。</strong></font><u>一份求职简历只要用一张A4纸做个表格就足够了。很多女生的求职简历就像是写真集，不但浪费钱，而且对求职毫无用处。</u>面试其实是有规律的，每次面试的时候只要背标准答案就行了…… </div><div><br /> 15.垃圾是放错位置的人才。<font color="#009900"><strong>所以，在找工作的时候一定要把自己放到那个让你成为人才而不是垃圾的职位上。</strong></font>当然，前提是你要知道自己究竟想做什么、究竟适合做什么。世界上最大的悲剧莫过于有太多的年轻人从来没有发现自己真正想做什么。骑驴找马固然没错，可是，并非随便找一头驴就能找到千里马。<u>所以，一定要重视第一份工作。</u> </div><div><br /> 16.大公司是做人，小公司是做事。<font color="#009900"><strong>进入公司工作以后，必须尽快融入写字楼政治。</strong></font><u>职员能否得到提升，很大程度不在于是否努力，而在于老板对你的赏识程度。</u>在写字楼的政治斗争中，一定要学会自我保护。 </div><div><br /> 17.瘦死的骆驼比马大。<font color="#009900"><strong>撑死胆大的，饿死胆小的。一定要有创业的勇气和魄力。</strong></font><u>如果你一只满足于给别人打工，那么，不管你工资多高，永远都只能是一个可怜的穷光蛋。</u>就算月薪2万，在深圳上海那种地方，一年的存款还买不来一个小小的洗手间。</div><div><br /> 18.<font color="#009900"><strong>大学期间一定要多去图书馆多去自习室。很多书你现在不读，一辈子就再也没有机会去读了。</strong></font>虽然不是每本书看了都一定有用，但是，因为你不知道究竟哪本书以后会有用，所以只好多看书，并且抛弃那些过于功利的想法。<u>尽管每次网到鱼的不过是一个网眼，但要想捕到鱼，就必须要编织一张网。 <br /></u></div><img src ="http://www.cnitblog.com/bbming/aggbug/21351.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/bbming/" target="_blank">老Ming</a> 2006-12-30 23:31 <a href="http://www.cnitblog.com/bbming/archive/2006/12/30/21351.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.NET环境下水晶报表使用总结 </title><link>http://www.cnitblog.com/bbming/archive/2006/12/19/20812.html</link><dc:creator>老Ming</dc:creator><author>老Ming</author><pubDate>Tue, 19 Dec 2006 10:01:00 GMT</pubDate><guid>http://www.cnitblog.com/bbming/archive/2006/12/19/20812.html</guid><wfw:comment>http://www.cnitblog.com/bbming/comments/20812.html</wfw:comment><comments>http://www.cnitblog.com/bbming/archive/2006/12/19/20812.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/bbming/comments/commentRss/20812.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/bbming/services/trackbacks/20812.html</trackback:ping><description><![CDATA[
		<span style="FONT-SIZE: 10pt">水晶报表是一个优秀的报表开发工具，本人在开发通用管理系统的时候，所有报表都使用水晶报表，其简单、易用和强大的功能令笔者倍加喜爱，现将水晶报表使用手记呈现给大家。 <br /><br />　　一、在使用自带的水晶报表时，请注册，否则只能使用30次<br /><br />　　水晶报表注册码<br />　　注册号:6707437608<br />　　密码:AAP5GKS0000GDE100DS <br /><br />　　二、使用CrystalReportViewer进行预览<br /><br />　　CrystalReportViewer控件允许在应用程序中查看 Crystal Report。ReportSource 属性用于设置要查看哪个报表。该属性设置之后，报表显示在查看器中。报表源可以是ReportDocument、报表文件的路径，也可以是强类型报表。<br /><br />　　1. 打开“工具箱”，并将一个 CrystalReportViewer 拖到窗体上，我们命名为rptVew。 <br /><br />　　2. 通过拖放操作将 Windows 窗体查看器调整到希望的大小并将其移动到所需位置。 <br /><br />　　3. 当运行应用程序时，报表将显示在查看器中。<br /><br />　　三、创建新报表<br /><br />　　1. 指向“添加”，单击“添加新项”。 <br /><br />　　2. 在“添加新项”对话框中，从“模板”区域选择 Crystal Report，将报表命名为rptClient，单击“打开”。 <br /><br />　　3. 在 Crystal Report 库中，选择下列选项之一： <br /><br />　　　· 使用报表专家 — 指导您完成报表的创建过程，并将您的选择添加到 Crystal Report Designer。 <br /><br />　　　· 作为空白报表 — 打开 Crystal Report Designer。 <br /><br />　　　· 来自于现有的报表 — 创建新报表，它与指定的另一报表设计相同。 <br /><br />　　注意 Crystal Report 库包含许多专家，可以指导您完成数个特定类型报表的创建工作。您可能希望使用专家来创建最初的报表，以确定哪种报表构造方法适合您的需要。<br /><br />　　4. 单击“确定”按钮。 <br /><br />　　如果选择使用“报表专家”，便会出现“报表专家”对话框，并带有数据资源管理器。为每个文件夹选择所需数据，完成“报表专家”选项卡界面上的操作，然后单击“完成”来访问 Crystal Report Designer 和您的报表<br /><br />　　四、是否需要动态设置数据源？<br /><br />　　Crystal Reports 通过数据库驱动程序与数据库连接。每个驱动程序都被编写为可处理特定数据库类型或数据库访问技术。 <br /><br />　　拉和推模型<br /><br />　　为了向开发人员提供最灵活的数据访问方法，Crystal Reports 数据库驱动程序被设计为可同时提供数据访问的拉模型和推模型。 <br /><br />　　拉模型<br /><br />　　在拉模型中，驱动程序将连接到数据库并根据需要将数据“拉”进来。使用这种模型时，与数据库的连接和为了获取数据而执行的 SQL 命令都同时由 Crystal Reports 本身处理，不需要开发人员编写代码。如果在运行时无须编写任何特殊代码，则使用拉模型。<br /><br />　　推模型<br /><br />　　相反，推模型需要开发人员编写代码以连接到数据库，执行 SQL 命令以创建与报表中的字段匹配的记录集或数据集，并且将该对象传递给报表。该方法使您可以将连接共享置入应用程序中，并在 Crystal Reports 收到数据之前先将数据筛选出来。 <br />四、从 ADO.NET 数据集制作报表<br /><br />　　从数据库创建数据集对象 <br /><br />　　1. 在项目中新建一个架构文件： <br /><br />　　　a. 在解决方案资源管理器中，右击项目名，指向“添加”，然后单击“添加新项”。 <br /><br />　　　b. 在“添加新项”对话框的“类别”区域，展开文件夹，然后选择“数据”。 <br /><br />　　　c. 在“模板”区域选择“数据集”。 <br /><br />　　　d. 接受默认名称 Dataset1.xsd。 <br /><br />　　这就创建了一个新的架构文件 (Dataset1.xsd)，以后将用它来生成强类型数据集。该架构文件将显示在 ADO.NET 数据集设计器中。 <br /><br />　　2. 指定数据库位置： <br /><br />　　　a. 在服务器资源管理器中，右击“数据连接”并选择“添加连接”。 <br /><br />　　　b. 在“数据链接属性”对话框中，单击“提供程序”选项卡，然后选择一个提供程序（例如 Microsoft OLE DB Provider for SQL Server）。 <br /><br />　　　c. 单击“连接”选项卡，然后指定您的数据库所在位置。在所需位置输入服务器和登录信息。 <br /><br />　　　d. 单击“确定”按钮。 <br /><br />　　　此时，您的数据库及其表和字段就出现在服务器资源管理器的“数据连接”节点下面。 <br /><br />　　3. 在解决方案资源管理器中，双击 Dataset1.xsd （如果它尚不是活动视图）。 <br /><br />　　　Dataset1.xsd 现在应显示在“数据集”选项卡中。 <br /><br />　　4. 若要为数据集建立架构，请将需要的表从服务器资源管理器中拖动到 Dataset1.xsd 的“数据集”选项卡上。 <br /><br />　　5. 单击“保存 Dataset1.xsd”来保存“Dataset1.xsd”文件。 <br /><br />　　6. 在“生成”菜单上，单击“生成”为项目生成数据集对象。 <br /><br />　　ADO.NET 数据集对象提供数据的描述，从它可以向 Crystal report 添加表。使用 Crystal Report Designer 中的“数据库专家”从 ADO.NET 数据集对象添加表。 <br /><br />　　请在使用“报表专家”创建新报表时调用“数据库专家”。或者，要从一个已经使用 ADO.NET 建立好的报表中访问“数据库专家”，请在 Report Designer 中右击，指向“数据库”，然后单击“添加/删除数据库”。<br /><br />　　将报表连接到 ADO.NET 数据集对象 <br /><br />　　1. 在“数据库专家”中，展开“项目数据”文件夹。 <br /><br />　　2. 展开“ADO.NET 数据集”文件夹。 <br /><br />　　3. 选择所需数据集对象。 <br /><br />　　例如，如果当时使用的是从项目“WindowsApplication1”的架构文件“Dataset1.xsd”中生成的数据集对象，则应该选择“WindowsApplication1.Dataset1”。 <br /><br />　　4. 选择要向报表中添加的表，和使用其他数据源一样。 <br /><br />　　五、动态改变数据源的代码 <br /><br />Dim dsdataSet As New DataSet()<br /><br />Dim oRpt As New rptClient() '已建立的报表rptClient<br /><br />　　请读者自行填充数据集dsdataSet <br /><br /><br />'使用“报表引擎”对象模型将填充的数据集,传递给报表<br /><br />oRpt.SetDataSource(dsdataSet.Tables(0))<br /><br />' 将带有数据的报表对象绑定到 Windows 窗体查看器，rptVew（CrystalReportViewer控件）<br /><br />rptVew.ReportSource = oRpt<br /><br />　　注意 FillDataSet 方法可连接到指定的数据库，提取数据，然后断开数据库连接。如果您希望将数据库中的多个表添加到报表中，请使用 SQL JOIN 语句将这些表联接在一起；然后在 FillDataSet 方法中指定一个结果表<br /><br />　　六、创建主从报表<br /><br />　　在报表中，有许多报表是主从表结构，比如订单与订单商品明细，订单是一个表中的一条记录，而分录是另一个表中的多条记录，两个表通过一个字段关联起来，这种报表可利用其分组功能实现，<br /><br />　　1. 新建一个工程<br /><br />　　2. 往FORM1中添加一个CrystalReportViewer控件<br /><br />　　3. 在服务噐资源管理器中连接到SQL SERVER 2000上的Northwind数据库<br /><br />　　4. 添加一个数据集Dataset1,将服务器资源管理器中的Orders和 Order Details加入到数据集中。<br /><br />　　5. 添加一个水晶报表，使用报表专家，在项目数据中选择“ADO.NET数据集”，插入表Orders和 Order Details，“链接”中是关联字段的链接，在“字段”中选择要显示的主表和明细表的字段，组中选择分组依据为Orders表OrdersID字段，总计，图表，选择（可进行筛选），样式（可设置报表标题），可自行设置。设置完后，点击完成。<br /><br />　　6. 在报表设计器中调整需要显示的字段的位置、宽度等。<br /><br />　　7. 在窗口中添加代码。<br /><br />Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load<br /><br />Dim oRpt As New CrystalReport1()<br /><br />Dim dsdataSet As New Dataset1() <br /><br />Dim CN As New Data.SqlClient.SqlConnection("data source=PMSERVER;initial catalog=Northwind;user id=sa;password=sa")<br /><br />CN.Open()<br /><br />Dim daOrders As New Data.SqlClient.SqlDataAdapter("select * from orders", CN)<br /><br />daOrders.Fill(dsdataSet, "orders") <br /><br />Dim daDetails As New Data.SqlClient.SqlDataAdapter("select * from [Order Details]", CN)<br /><br />daDetails.Fill(dsdataSet, "Order Details") <br /><br />'使用“报表引擎”对象模型将填充的数据集,传递给报表<br /><br />oRpt.SetDataSource(dsdataSet)<br /><br />CrystalReportViewer1.ReportSource = oRpt<br /><br />End Sub<br /><br />　　8、运行程序<br /><br />　　七、用程序改变报表中text的文本<br /><br />　　代码如下：<br /><br />Dim GetTextObject As TextObject<br /><br />' 按名称获取 ReportObject，将其转换为 TextObject，并返回此对象。<br /><br />GetTextObject = orpt.ReportDefinition.ReportObjects.Item("text13")<br /><br />GetTextObject.Text = "XXXX系统"<br /><br />　　总结：水晶报表具有非常强大的功能，还可进行导出WORD、EXCEL、RTF等文件，还可生成复杂、漂亮图表，是进行WEB和WINDOWS报表开发的利器。</span>
<img src ="http://www.cnitblog.com/bbming/aggbug/20812.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/bbming/" target="_blank">老Ming</a> 2006-12-19 18:01 <a href="http://www.cnitblog.com/bbming/archive/2006/12/19/20812.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转　C# 中通用winform组件的数据绑定 </title><link>http://www.cnitblog.com/bbming/archive/2006/12/11/20350.html</link><dc:creator>老Ming</dc:creator><author>老Ming</author><pubDate>Mon, 11 Dec 2006 03:01:00 GMT</pubDate><guid>http://www.cnitblog.com/bbming/archive/2006/12/11/20350.html</guid><wfw:comment>http://www.cnitblog.com/bbming/comments/20350.html</wfw:comment><comments>http://www.cnitblog.com/bbming/archive/2006/12/11/20350.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/bbming/comments/commentRss/20350.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/bbming/services/trackbacks/20350.html</trackback:ping><description><![CDATA[
		<p>我们知道在由于Visual C＃自身没有类库，和其他的.Net开发语言一样，Visual C＃调用的类库是.Net框架中的一个共有的类库--.Net FrameWork SDK。ADO.NET是.Net FrameWork SDK提供给.Net开发语言进行数据库开发的一个系列类库的集合。在ADO.NET中虽然提供了大量的用于数据库连接、数据处理的类库，但却没有提供类似DbText组件、DbList组件、DbLable组件、DbCombox组件等。要想把数据记录以ComBox、ListBox等形式显示处理，使用数据绑定技术是最为方便、最为直接的方法。所谓数据绑定技术就是把已经打开的数据集中某个或者某些字段绑定到组件的某些属性上面的一种技术。说的具体些，就是把已经打开数据的某个或者某些字段绑定到Text组件、ListBox组件、ComBox等组件上的能够显示数据的属性上面。当对组件完成数据绑定后，其显示字段的内容将随着数据记录指针的变化而变化。这样程序员就可以定制数据显示方式和内容，从而为以后的数据处理作好准备。所以说数据绑定是Visual C＃进行数据库方面编程的基础和最为重要的第一步。只有掌握了数据绑定方法，才可以十分方便对已经打开的数据集中的记录进行浏览、删除、插入等具体的数据操作、处理。 <br /><br />　　 数据绑定根据不同组件可以分为二种，一种是简单型的数据绑定，另外一种就是复杂型的数据绑定。所谓简单型的数据绑定就是绑定后组件显示出来的字段只是单个记录，这种绑定一般使用在显示单个值的组件上，譬如：TextBox组件和Label组件。而复杂型的数据绑定就是绑定后的组件显示出来的字段是多个记录，这种绑定一般使用在显示多个值的组件上，譬如：ComBox组件、ListBox组件等。本文就是来详细介绍如何用Visual C＃实现这二种绑定。在数据库的选择上，为了使内容更加全面，采用了当下比较流行的二种数据库，一种是本地数据库Acess 2000，另外一种是远程数据库Sql Server 2000。 <br /><br />　　 一． 本文程序设计和运行的软件环境： <br /><br />　　 （1）.微软公司视窗2000服务器版 <br /><br />　　 （2）..Net FrameWork SDK Beta 2 <br /><br />　　 （3）.MADC 2.6（Microsoft Acess Data Component）以上版本 <br /><br />　　 二． 程序中使用的数据库的数据字典： <br /><br />　　 （1）.本地数据库Access 2000的数据库的名称为"db.mdb"，在这个数据库中定义了一张表"person"。这张表的数据结构如下表： <br /><br /></p>
		<table cellspacing="0">
				<tbody>
						<tr>
								<td>字段名称 </td>
								<td>字段类型 </td>
								<td>字段意思 </td>
						</tr>
						<tr>
								<td>id </td>
								<td>数字 </td>
								<td>序号 </td>
						</tr>
						<tr>
								<td>xm </td>
								<td>文本 </td>
								<td>姓名 </td>
						</tr>
						<tr>
								<td>xb </td>
								<td>文本 </td>
								<td>性别 </td>
						</tr>
						<tr>
								<td>nl </td>
								<td>文本 </td>
								<td>年龄 </td>
						</tr>
						<tr>
								<td>zip </td>
								<td>文本 </td>
								<td>邮政编码 </td>
						</tr>
				</tbody>
		</table>
		<br />　　 （2）.远程数据库Sql Server 2000的数据库服务器名称为"Server1",数据库名称为"Data1"，登陆的ID为"sa"，口令为空，在数据库也定义了一张"person"表，数据结构如上表。 <br />　　 三． 数据绑定一般步骤： <br /><br />　　 （一）.无论是简单型的数据绑定，还是复杂型的数据绑定，要实现绑定的第一步就是就是要连接数据库，得到可以操作的DataSet。下面二段代码是分别连接Access 2000和Sql Server 2000数据库，并获得DataSet。 <br /><br />　　 （1）. 连接Access 2000，得到DataSet： <br /><br /><table><tbody><tr><td>//创建一个 OleDbConnection <br />string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb" ; <br />OleDbConnection myConn = new OleDbConnection ( strCon ) ; <br />string strCom = " SELECT * FROM person " ; <br />file://创建一个 DataSet <br />myDataSet = new DataSet ( ) ; <br /><br />myConn.Open ( ) ; <br />file://用 OleDbDataAdapter 得到一个数据集 <br />OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ; <br />file://把Dataset绑定person数据表 <br />myCommand.Fill ( myDataSet , "person" ) ; <br />file://关闭此OleDbConnection <br />myConn.Close ( ) ; </td></tr></tbody></table><p><br />　　 （2）. 连接Sql Server 2000，得到DataSet： </p><table><tbody><tr><td>// 设定数据连接字符串，此字符串的意思是打开Sql server数据库，服务器名称为server1,数据库为data1 <br />string strCon = "Provider = SQLOLEDB.1 ; Persist Security Info = False ; User ID = sa ; Initial Catalog = data1 ; Data Source = server1 " ; <br />OleDbConnection myConn = new OleDbConnection ( strCon ) ; <br />myConn.Open ( ) ; <br />string strCom = " SELECT * FROM person " ; <br />file://创建一个 DataSet <br />myDataSet = new DataSet ( ) ; <br />file://用 OleDbDataAdapter 得到一个数据集 <br />OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ; <br />file://把Dataset绑定person数据表 <br />myCommand.Fill ( myDataSet , " person " ) ; <br />file://关闭此OleDbConnection <br />myConn.Close ( ) ; </td></tr></tbody></table><p>　　（二）.根据不同组件，采用不同的数据绑定： <br /><br />　　 对于简单型的数据绑定，数据绑定的方法其实比较简单，在得到数据集以后，一般是通过把数据集中的某个字段绑定到组件的显示属性上面，譬如TextBox组件和Label组件，是绑定到"Text"属性。对于复杂型的数据绑定一般是通过设定其某些属性值来实现绑定的。这些下面将会具体介绍。 <br />　　 四．简单型组件的数据绑定： <br /><br />　　 （1）.TextBox组件的数据绑定： <br /><br />　　 通过下列语句就可以把数据集（即为：myDataSet）的某个字段绑定到TextBox组件的"Text"属性上面了： <br /></p><table><tbody><tr><td>textBox1.DataBindings.Add ( "Text" , myDataSet , "person.xm" ) ; </td></tr></tbody></table><p>　　注释：此时绑定是Access 2000数据库中"person"表的"xm"字段。 <br /><br />　　 由此可以得到绑定TextBox组件的源程序代码（TextBox01.cs），下列代码操作的数据库是Access 2000，如下： <br /><br /></p><table><tbody><tr><td><p><br />public class Form1 : Form <br />{ <br />private TextBox textBox1 ; <br />private Button button1 ; <br />private System.Data.DataSet myDataSet ; <br />private System.ComponentModel.Container components = null ; </p><p>public Form1 ( ) <br />{ <br />file://打开数据链接，得到数据集 <br />GetConnect ( ) ; <br />InitializeComponent ( ) ; <br />} <br />file://清除程序中使用过的资源 <br />protected override void Dispose ( bool disposing ) <br />{ <br />if ( disposing ) <br />{ <br />if ( components != null ) <br />{ <br />components.Dispose ( ) ; <br />} <br />} <br />base.Dispose ( disposing ) ; <br />} </p><p>private void GetConnect ( ) <br />{ <br />file://创建一个 OleDbConnection <br />string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb" ; <br />OleDbConnection myConn = new OleDbConnection ( strCon ) ; <br />string strCom = " SELECT * FROM person " ; <br />file://创建一个 DataSet <br />myDataSet = new DataSet ( ) ; <br /><br />myConn.Open ( ) ; <br />file://用 OleDbDataAdapter 得到一个数据集 <br />OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ; <br />file://把Dataset绑定person数据表 <br />myCommand.Fill ( myDataSet , "person" ) ; <br />file://关闭此OleDbConnection <br />myConn.Close ( ) ; </p><p>} <br /><br />private void button1_Click ( object sender , System.EventArgs e ) <br />{ <br />textBox1.DataBindings.Add ( "Text" , myDataSet , "person.xm" ) ; <br />} <br />static void Main ( ) <br />{ <br />Application.Run ( new Form1 ( ) ) ; <br />} <br />} <br /></p></td></tr></tbody></table><br /><p>　　得到TextBox组件对本地数据库中的字段进行数据绑定的程序后，可以方便的得到对远程数据库中的某些字段进行数据绑定的源程序代码（TextBox02.cs），具体如下： </p><table><tbody><tr><td><p><br />public class Form1 : Form <br />{ <br />private TextBox textBox1 ; <br />private Button button1 ; <br />private System.Data.DataSet myDataSet ; <br />private System.ComponentModel.Container components = null ; </p><p>public Form1 ( ) <br />{ <br />file://打开数据链接，得到数据集 <br />GetConnect ( ) ; <br />InitializeComponent ( ) ; <br />} <br />file://清除程序中使用过的资源 <br />protected override void Dispose ( bool disposing ) <br />{ <br />if ( disposing ) <br />{ <br />if ( components != null ) <br />{ <br />components.Dispose ( ) ; <br />} <br />} <br />base.Dispose ( disposing ) ; <br />} </p><p>private void GetConnect ( ) <br />{ <br />// 设定数据连接字符串，此字符串的意思是打开Sql server数据库，服务器名称为server1,数据库为data1 <br />string strCon = "Provider = SQLOLEDB.1 ; Persist Security Info = False ; User ID = sa ; Initial Catalog = data1 ; Data Source = server1 " ; <br />OleDbConnection myConn = new OleDbConnection ( strCon ) ; <br />myConn.Open ( ) ; <br />string strCom = " SELECT * FROM person " ; <br />file://创建一个 DataSet <br />myDataSet = new DataSet ( ) ; <br />file://用 OleDbDataAdapter 得到一个数据集 <br />OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ; <br />file://把Dataset绑定person数据表 <br />myCommand.Fill ( myDataSet , " person " ) ; <br />file://关闭此OleDbConnection <br />myConn.Close ( ) ; <br />} <br /><br />private void button1_Click ( object sender , System.EventArgs e ) <br />{ <br />textBox1.DataBindings.Add ( "Text" , myDataSet , "person.xm" ) ; <br />} <br />static void Main ( ) <br />{ <br />Application.Run ( new Form1 ( ) ) ; <br />} <br />} </p></td></tr></tbody></table><p>（2）.Label组件的数据绑定： <br /><br />　　 在掌握了TextBox组件数据绑定以后，可以十分方便的得到Label组件的数据绑定方法，因为这二者实现的方法实在是太相似了。下列语句是把得到数据集的"xm"字段绑定到Label组件的"Text"属性上： <br /></p><table><tbody><tr><td>label1.DataBindings.Add ( "Text" , myDataSet , "person.xm" ) ; </td></tr></tbody></table><p>　　注释：此时绑定是Access 2000数据库中"person"表的"xm"字段。由此可以得到Label组件数据绑定的源程序代码（Label01.cs），本代码操作数据库是Access 2000： </p><table><tbody><tr><td><p><br />public class Form1 : Form <br />{ <br />private Label label1 ; <br />private Button button1 ; <br />private System.Data.DataSet myDataSet ; <br />private System.ComponentModel.Container components = null ; </p><p>public Form1 ( ) <br />{ <br />file://打开数据链接，得到数据集 <br />GetConnect ( ) ; <br />InitializeComponent ( ) ; <br />} <br />file://清除程序中使用过的资源 <br />protected override void Dispose ( bool disposing ) <br />{ <br />if ( disposing ) <br />{ <br />if ( components != null ) <br />{ <br />components.Dispose ( ) ; <br />} <br />} <br />base.Dispose ( disposing ) ; <br />} </p><p>private void GetConnect ( ) <br />{ <br />file://创建一个 OleDbConnection <br />string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb" ; <br />OleDbConnection myConn = new OleDbConnection ( strCon ) ; <br />string strCom = " SELECT * FROM person " ; <br />file://创建一个 DataSet <br />myDataSet = new DataSet ( ) ; <br /><br />myConn.Open ( ) ; <br />file://用 OleDbDataAdapter 得到一个数据集 <br />OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ; <br />file://把Dataset绑定person数据表 <br />myCommand.Fill ( myDataSet , "person" ) ; <br />file://关闭此OleDbConnection <br />myConn.Close ( ) ; </p><p>} <br /><br />private void button1_Click ( object sender , System.EventArgs e ) <br />{ <br />label1.DataBindings.Add ( "Text" , myDataSet , "person.xm" ) ; <br />} <br />static void Main ( ) <br />{ <br />Application.Run ( new Form1 ( ) ) ; <br />} <br />} </p></td></tr></tbody></table><br /><p>　　得到了Label组件对Access 2000数据库数据绑定的程序代码，改换一下程序中数据链接，就可以得到Label组件对Sql Server 2000数据库数据绑定的源程序代码（Label02.cs），具体如下： <br /></p><table><tbody><tr><td><p><br />public class Form1 : Form <br />{ <br />private Label label1 ; <br />private Button button1 ; <br />private System.Data.DataSet myDataSet ; <br />private System.ComponentModel.Container components = null ; </p><p>public Form1 ( ) <br />{ <br />file://打开数据链接，得到数据集 <br />GetConnect ( ) ; <br />InitializeComponent ( ) ; <br />} <br />file://清除程序中使用过的资源 <br />protected override void Dispose ( bool disposing ) <br />{ <br />if ( disposing ) <br />{ <br />if ( components != null ) <br />{ <br />components.Dispose ( ) ; <br />} <br />} <br />base.Dispose ( disposing ) ; <br />} </p><p>private void GetConnect ( ) <br />{ <br />// 设定数据连接字符串，此字符串的意思是打开Sql server数据库，服务器名称为server1,数据库为data1 <br />string strCon = "Provider = SQLOLEDB.1 ; Persist Security Info = False ; User ID = sa ; Initial Catalog = data1 ; Data Source = server1 " ; <br />OleDbConnection myConn = new OleDbConnection ( strCon ) ; <br />myConn.Open ( ) ; <br />string strCom = " SELECT * FROM person " ; <br />file://创建一个 DataSet <br />myDataSet = new DataSet ( ) ; <br />file://用 OleDbDataAdapter 得到一个数据集 <br />OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ; <br />file://把Dataset绑定person数据表 <br />myCommand.Fill ( myDataSet , " person " ) ; <br />file://关闭此OleDbConnection <br />myConn.Close ( ) ; <br />} <br /><br />private void button1_Click ( object sender , System.EventArgs e ) <br />{ <br />label1.DataBindings.Add ( "Text" , myDataSet , "person.xm" ) ; <br />} <br />static void Main ( ) <br />{ <br />Application.Run ( new Form1 ( ) ) ; <br />} <br />} </p></td></tr></tbody></table><p>　　五． 复杂型组件的数据绑定：</p><p>　　在上面的介绍中，了解到对复杂型组件的数据绑定是通过设定组件的某些属性来完成数据绑定的。首先来介绍一下ComboBox组件的数据绑定.</p><p>　　（1）.ComboBox组件的数据绑定：</p><p>　　在得到数据集后，只有设定好ComboBox组件的的三个属性就可以完成数据绑定了，这三个属性是：、"DisplayMember"、"ValueMember"。其中"DataSource"是要显示的数据集，"DisplayMember"是ComboBox组件显示的字段，"ValueMember"是实际使用值。具体如下：<br /></p><p>ComboBox1.DataSource = myDataSet ;<br />ComboBox1.DisplayMember = "person.xm" ;<br />ComboBox1.ValueMember = "person.xm" ; </p><p>　　注释：此时绑定是Access 2000数据库中"person"表的"xm"字段。由此可以得到ComboBox组件数据绑定的源程序代码（Combo01.cs），本代码操作数据库是Access 2000：</p><p> </p><p>public class Form1 : Form<br />{<br />private ComboBox ComboBox1 ;<br />private Button button1 ;<br />private System.Data.DataSet myDataSet ;<br />private System.ComponentModel.Container components = null ;</p><p>public Form1 ( )<br />{<br />file://打开数据链接，得到数据集<br />GetConnect ( ) ;<br />InitializeComponent ( ) ;<br />}<br />file://清除程序中使用过的资源<br />protected override void Dispose ( bool disposing )<br />{<br />if ( disposing )<br />{<br />if ( components != null ) <br />{<br />components.Dispose ( ) ;<br />}<br />}<br />base.Dispose ( disposing ) ;<br />}</p><p>private void GetConnect ( )<br />{<br />file://创建一个 OleDbConnection<br />string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb" ;<br />OleDbConnection myConn = new OleDbConnection ( strCon ) ;<br />string strCom = " SELECT * FROM person " ;<br />file://创建一个 DataSet<br />myDataSet = new DataSet ( ) ;</p><p>myConn.Open ( ) ;<br />file://用 OleDbDataAdapter 得到一个数据集<br />OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ;<br />file://把Dataset绑定person数据表<br />myCommand.Fill ( myDataSet , "person" ) ;<br />file://关闭此OleDbConnection<br />myConn.Close ( ) ;</p><p>}</p><p>private void button1_Click ( object sender , System.EventArgs e )<br />{<br />ComboBox1.DataSource = myDataSet ;<br />ComboBox1.DisplayMember = "person.xm" ;<br />ComboBox1.ValueMember = "person.xm" ;<br />}<br />static void Main ( ) <br />{<br />Application.Run ( new Form1 ( ) ) ;<br />}<br />}<br /></p><p>图03：对ComboBox组件数据绑定的程序界面 </p><p>　　得到了ComboBox组件对本地数据库的数据绑定程序，也就十分方便的得到ComboBox组件绑定Sql Server 2000源程序代码（Combox02.cs）具体如下：</p><p> </p><p>public class Form1 : Form<br />{<br />private ComboBox ComboBox1 ;<br />private Button button1 ;<br />private System.Data.DataSet myDataSet ;<br />private System.ComponentModel.Container components = null ;</p><p>public Form1 ( )<br />{<br />file://打开数据链接，得到数据集<br />GetConnect ( ) ;<br />InitializeComponent ( ) ;<br />}<br />file://清除程序中使用过的资源<br />protected override void Dispose ( bool disposing )<br />{<br />if ( disposing )<br />{<br />if ( components != null ) <br />{<br />components.Dispose ( ) ;<br />}<br />}<br />base.Dispose ( disposing ) ;<br />}</p><p>private void GetConnect ( )<br />{<br />// 设定数据连接字符串，此字符串的意思是打开Sql server数据库，服务器名称为server1,数据库为data1<br />string strCon = "Provider = SQLOLEDB.1 ; Persist Security Info = False ; User ID = sa ; Initial Catalog = data1 ; Data Source = server1 " ;<br />OleDbConnection myConn = new OleDbConnection ( strCon ) ;<br />myConn.Open ( ) ;<br />string strCom = " SELECT * FROM person " ;<br />file://创建一个 DataSet<br />myDataSet = new DataSet ( ) ;<br />file://用 OleDbDataAdapter 得到一个数据集<br />OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ;<br />file://把Dataset绑定person数据表<br />myCommand.Fill ( myDataSet , " person " ) ;<br />file://关闭此OleDbConnection<br />myConn.Close ( ) ;<br />}<br />private void button1_Click ( object sender , System.EventArgs e )<br />{<br />ComboBox1.DataSource = myDataSet ;<br />ComboBox1.DisplayMember = "person.xm" ;<br />ComboBox1.ValueMember = "person.xm" ;<br />}<br />static void Main ( ) <br />{<br />Application.Run ( new Form1 ( ) ) ;<br />}<br />}</p>　　（2）.ListBox组件的数据绑定： 
<p>　　ListBox组件的数据绑定和ComboBox组件的数据绑定的方法大致相同，也是通过设定"DisplayMember"、"ValueMember"。其中"DataSource"这三个属性来完成的。并且这三个属性在ListBox组件中代表的意思和ComboBox组件的意思基本一样。由此可以得到ListBox组件对本地数据库和远程数据库进行数据绑定的源程序。其中ListBox01.cs是对本地数据库进行数据绑定，ListBox02.cs是对远程数据库进行数据绑定，具体如下：</p><p>　　ListBox01.cs源程序代码节选：</p><p> </p><p>public class Form1 : Form<br />{<br />private ListBox ListBox1 ;<br />private Button button1 ;<br />private System.Data.DataSet myDataSet ;<br />private System.ComponentModel.Container components = null ;</p><p>public Form1 ( )<br />{<br />file://打开数据链接，得到数据集<br />GetConnect ( ) ;<br />InitializeComponent ( ) ;<br />}<br />file://清除程序中使用过的资源<br />protected override void Dispose ( bool disposing )<br />{<br />if ( disposing )<br />{<br />if ( components != null ) <br />{<br />components.Dispose ( ) ;<br />}<br />}<br />base.Dispose ( disposing ) ;<br />}</p><p>private void GetConnect ( )<br />{<br />file://创建一个 OleDbConnection<br />string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb" ;<br />OleDbConnection myConn = new OleDbConnection ( strCon ) ;<br />string strCom = " SELECT * FROM person " ;<br />file://创建一个 DataSet<br />myDataSet = new DataSet ( ) ;</p><p>myConn.Open ( ) ;<br />file://用 OleDbDataAdapter 得到一个数据集<br />OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ;<br />file://把Dataset绑定person数据表<br />myCommand.Fill ( myDataSet , "person" ) ;<br />file://关闭此OleDbConnection<br />myConn.Close ( ) ;</p><p>}</p><p>private void button1_Click ( object sender , System.EventArgs e )<br />{<br />ListBox1.DataSource = myDataSet ;<br />ListBox1.DisplayMember = "person.xm" ;<br />ListBox1.ValueMember = "person.xm" ;<br />}<br />static void Main ( ) <br />{<br />Application.Run ( new Form1 ( ) ) ;<br />}<br />}<br /></p><p> </p><p>图04：对ListBox组件数据绑定的程序界面 </p><p>　　以下代码是ListBox组件对Sql Server 2000数据库进行数据绑定的源程序节选（ListBox02.cs）：</p><p> </p><p>{<br />private ListBox ListBox1 ;<br />private Button button1 ;<br />private System.Data.DataSet myDataSet ;<br />private System.ComponentModel.Container components = null ; <br />public Form1 ( )<br />{<br />file://打开数据链接，得到数据集<br />GetConnect ( ) ;<br />InitializeComponent ( ) ;<br />}<br />file://清除程序中使用过的资源<br />protected override void Dispose ( bool disposing )<br />{<br />if ( disposing )<br />{<br />if ( components != null ) <br />{<br />components.Dispose ( ) ;<br />}<br />}<br />base.Dispose ( disposing ) ;<br />}</p><p>private void GetConnect ( )<br />{<br />// 设定数据连接字符串，此字符串的意思是打开Sql server数据库，服务器名称为server1,数据库为data1<br />string strCon = "Provider = SQLOLEDB.1 ; Persist Security Info = False ; User ID = sa ; Initial Catalog = data1 ; Data Source = server1 " ;<br />OleDbConnection myConn = new OleDbConnection ( strCon ) ;<br />myConn.Open ( ) ;<br />string strCom = " SELECT * FROM person " ;<br />file://创建一个 DataSet<br />myDataSet = new DataSet ( ) ;<br />file://用 OleDbDataAdapter 得到一个数据集<br />OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ;<br />file://把Dataset绑定person数据表<br />myCommand.Fill ( myDataSet , " person " ) ;<br />file://关闭此OleDbConnection<br />myConn.Close ( ) ;<br />}</p><p>private void button1_Click ( object sender , System.EventArgs e )<br />{<br />ListBox1.DataSource = myDataSet ;<br />ListBox1.DisplayMember = "person.xm" ;<br />ListBox1.ValueMember = "person.xm" ;<br />}<br />static void Main ( ) <br />{<br />Application.Run ( new Form1 ( ) ) ;<br />}<br />}<br /></p><p>　　六． 总结：</p><p>　　本文介绍的实现数据绑定组件的都是在程序设计中经常用到的WinForm组件。当然在.Net FrameWork SDK中提供的WinForm组件是很多的，由于本文的限制，不可能一一介绍，一般来说，WinForm组件都可以实现数据绑定，虽然在某些具体的方法上有所差异，但也总是大同小异。在以下的文章中，将以此为基础探讨Visual C＃中数据库编程。</p><img src ="http://www.cnitblog.com/bbming/aggbug/20350.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/bbming/" target="_blank">老Ming</a> 2006-12-11 11:01 <a href="http://www.cnitblog.com/bbming/archive/2006/12/11/20350.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 实战Visual C＃数据库编程 </title><link>http://www.cnitblog.com/bbming/archive/2006/12/11/20349.html</link><dc:creator>老Ming</dc:creator><author>老Ming</author><pubDate>Mon, 11 Dec 2006 02:52:00 GMT</pubDate><guid>http://www.cnitblog.com/bbming/archive/2006/12/11/20349.html</guid><wfw:comment>http://www.cnitblog.com/bbming/comments/20349.html</wfw:comment><comments>http://www.cnitblog.com/bbming/archive/2006/12/11/20349.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/bbming/comments/commentRss/20349.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/bbming/services/trackbacks/20349.html</trackback:ping><description><![CDATA[［编者的话：］关于数据库编程，微软提供了一个统一的数据对象访问模型，在Visual Studio6.0中称为ADO，在.NET中则统一为ADO.NET,掌握ADO.NET就等于掌握了数据库编程的核心，因此有必要首先复习一下以前发表的《ADO.NET完全攻略》。 
<p>　　针对数据库编程始终是程序设计语言的一个重要方面的内容，也是一个难点。数据库编程的内容十分丰富，但最为基本编程的也就是那么几点，譬如：连接数据库、得到需要的数据和针对数据记录的浏览、删除、修改、插入等操作。其中又以后面针对数据记录的数据操作为重点。本文就来着重探讨一下Visual C＃数据库基本编程，即：如何浏览记录、修改记录、删除记录和插入记录。</p><p>　　一．程序设计和运行的环境设置：</p><p>　　（1）.视窗2000服务器版</p><p>　　（2）.Microsoft Data Acess Component 2.6 以上版本 ( MDAC 2.6 )</p><p>　　（3）..Net FrameWork SDK Beta 2</p><p>　　为了更清楚的说明问题，在数据库的选用上，采用了当前比较典型的数据库，一个是本地数据库Access 2000，另外一个是远程数据库Sql Server 2000。其中本地数据库名称为"db.mdb"，在其中定义了一张数据表"person"，"person"表的数据结构如下表：</p><p> </p><p>字段名称 字段类型 字段意思 <br />id 数字 序号 <br />xm 文本 姓名 <br />xb 文本 性别 <br />nl 文本 年龄 <br />zip 文本 邮政编码 </p><p>　　远程数据库Sql Server 2000的数据库服务器名称为"Server1",数据库名称为"Data1"，登陆的ID为"sa"，口令为空，在数据库也定义了一张"person"表，数据结构如上表。</p><br />　　二．如何浏览数据： 
<p>　　在《Visual C＃的数据绑定》中，已经了解了如何把数据集中的某些字段绑定到WinForm组件的某个属性上，这样程序员就可以根据以WinForm组件的来定制数据显示的形式，并且此时的WinForm组件显示内容就可以随着记录指针的变化而改变。至此可见，浏览数据记录的关键就是如何改变记录指针。要实现这种操作，就要使用到BindingManagerBase类，此类的主要作用是管理对于那些实现了对同一个数据源进行绑定的对象。说的具体些，就是能够使得Windows窗体上的已经对同一数据源进行数据绑定的组件保持同步。在BindingManagerBase类中定义了一个属性"Position"，通过这个属性就可以改变BindingManagerBase对象中的数据指针。创建BindingManagerBase对象必须要使用到BindingContext类，其实每一个由Control类中继承而得到的对象，都有单一的BindingContext对象，在大多数创建窗体中实现数据绑定组件的BindingManagerBase对象是使用Form类的BindingContext来得到。下列代码是以Access 2000数据库为模型，创建的一个名称为"myBind"的BindingManagerBase对象。</p><p>//创建一个 OleDbConnection<br />string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb" ;<br />OleDbConnection myConn = new OleDbConnection ( strCon ) ;<br />string strCom = " SELECT * FROM person " ;<br />file://创建一个 DataSet<br />myDataSet = new DataSet ( ) ;</p><p>myConn.Open ( ) ;<br />file://用 OleDbDataAdapter 得到一个数据集<br />OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ;<br />file://把Dataset绑定books数据表<br />myCommand.Fill ( myDataSet , "person" ) ;<br />file://关闭此OleDbConnection<br />myConn.Close ( ) ;<br />myBind = this.BindingContext [ myDataSet , "person" ] ; </p><p>　　下列代码是以Sql Server 2000数据库为模型，创建一个名称为"myBind"的BindingManagerBase对象。</p><p>// 设定数据连接字符串，此字符串的意思是打开Sql server数据库，服务器名称为server1,数据库为data1<br />string strCon = "Provider = SQLOLEDB.1 ; Persist Security Info = False ; User ID = sa ; Initial Catalog = data1 ; Data Source = server1 " ;<br />OleDbConnection myConn = new OleDbConnection ( strCon ) ;<br />myConn.Open ( ) ;<br />string strCom = " SELECT * FROM person " ;<br />file://创建一个 DataSet<br />myDataSet = new DataSet ( ) ;<br />file://用 OleDbDataAdapter 得到一个数据集<br />OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ;<br />file://把Dataset绑定person数据表<br />myCommand.Fill ( myDataSet , " person " ) ;<br />file://关闭此OleDbConnection<br />myConn.Close ( ) ;<br />myBind = this.BindingContext [ myDataSet , "person" ] ; </p><p>　　得到了是同一数据源的BindingManagerBase对象，通过改变此对象的"Position"属性值，这样绑定数据的组件显示的数据就随之变化，从而实现导航数据记录。</p><p>　　&lt; I &gt; .导航按钮"上一条"实现方法：</p><p>protected void GoPrevious ( object sender , System.EventArgs e )<br />{<br />if ( myBind.Position == 0 ) <br />MessageBox.Show ( "已经到了第一条记录！" , "信息提示！" , MessageBoxButtons.OK , MessageBoxIcon.Information ) ;<br />else<br />myBind.Position -= 1 ;<br />} </p><p>　　&lt; II &gt; . 导航按钮"下一条"实现方法：</p><p>protected void GoNext ( object sender , System.EventArgs e )<br />{<br />if ( myBind.Position == myBind.Count -1 )<br />MessageBox.Show ( "已经到了最后一条记录！", "信息提示！" , MessageBoxButtons.OK , MessageBoxIcon.Information ) ;<br />else<br />myBind.Position += 1 ;<br />} </p><p>&lt; III &gt; . 导航按钮"至尾"实现方法：</p><p>protected void GoLast ( object sender , System.EventArgs e )<br />{<br />myBind.Position = myBind.Count - 1 ;<br />}<br />&lt; IV &gt; . 导航按钮"至首"实现方法：<br />protected void GoFirst ( object sender , System.EventArgs e )<br />{<br />myBind.Position = 0 ;<br />} </p><p>　　注释："Count"是BindingManagerBase对象的另外一个重要的属性，是数据集记录的总数。</p><p><br />　　三．实现删除记录： </p><p>　　在对数据记录进行操作的时候，有二点必须十分清晰：</p><p>　　其一：在对数据记录进行操作的时候，我想有一些程序员一定有这样一个疑惑，当对数据库服务器请求数据集的时候，就会产生"DataSet"对象，用以管理数据集，这样如果这些对数据库服务器的请求非常多，同样也就会产生很多的"DataSet"对象，达到一定时候必然会使得数据库服务器崩溃。这种想法是自然的，但和实际并不相符，因为"DataSet"对象并不是在服务器端产生的，而是在客户端产生的。所以面对众多的数据请求的时候对数据库服务器的影响并不十分太大。</p><p>　　其二：记得在用Delphi编写三层数据模型的时候的，每一次对数据库的修改其实只是对第二层产生的数据集的修改，要真正修改数据库，还必须调用一个另外的方法。在用ADO.NET处理数据库的时候，虽然处理的直接对象是数据库，但此时"DataSet"对象中的内容并没有随之改变，而绑定的数据组件显示的数据又来源于"DataSet"对象，这样就会产生一个错觉，就是修改了的记录并没有修改掉，删除的记录并没有删除掉。所以对数据记录进行操作的时候，在修改数据库后，还要对"DataSet"对象进行必要的修改，这样才能保证"DataSet"对象和数据库内容一致、同步。下面代码是删除当前绑定组件显示的记录的程序代码，此代码是以Access 2000数据库为模板的：</p><p>protected void Delete_record ( object sender , System.EventArgs e )<br />{ <br />DialogResult r = MessageBox.Show ( "是否删除当前记录！" , "删除当前记录！" , MessageBoxButtons.YesNo , MessageBoxIcon.Question ) ;<br />int ss = ( int ) r ;<br />　 if ( ss == 6 ) // 按动"确定"按钮<br />{ <br />try{<br />file://连接到一个数据库<br />string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb " ;<br />OleDbConnection myConn = new OleDbConnection ( strCon ) ;<br />myConn.Open ( ) ;<br />string strDele = "DELETE FROM person WHERE id= " + t_id.Text ;<br />OleDbCommand myCommand = new OleDbCommand ( strDele , myConn ) ;<br />file://从数据库中删除指定记录<br />myCommand.ExecuteNonQuery ( ) ;<br />file://从DataSet中删除指定记录<br />myDataSet.Tables [ "person" ] . Rows [ myBind.Position ] . Delete ( ) ;<br />myDataSet.Tables [ "person" ] . AcceptChanges ( ) ;<br />myConn.Close ( ) ;<br />}<br />catch ( Exception ed )<br />{<br />MessageBox.Show ( "删除记录错误信息： " + ed.ToString ( ) , "错误！" ) ;<br />} <br />}<br />} </p><p>　　下面代码是删除当前绑定组件显示的记录的程序代码，此代码是以Sql Server 2000数据库为模板的，二者的区别仅仅在于数据链接：</p><p>protected void Delete_record ( object sender , System.EventArgs e )<br />{ <br />DialogResult r = MessageBox.Show ( "是否删除当前记录！" , "删除当前记录！" , MessageBoxButtons.YesNo , MessageBoxIcon.Question ) ;<br />int ss = ( int ) r ;<br />　 if ( ss == 6 ) // 按动"确定"按钮<br />{ <br />try{<br />// 设定数据连接字符串，意思是打开Sql server数据库，服务器名称为server1,数据库为data1<br />string strCon = "Provider = SQLOLEDB.1 ; Persist Security Info = False ; User ID = sa ; Initial Catalog = data1 ; Data Source = server1 " ;<br />OleDbConnection myConn = new OleDbConnection ( strCon ) ;<br />myConn.Open ( ) ;<br />string strDele = "DELETE FROM person WHERE id= " + t_id.Text ;<br />OleDbCommand myCommand = new OleDbCommand ( strDele , myConn ) ;<br />file://从数据库中删除指定记录<br />myCommand.ExecuteNonQuery ( ) ;<br />file://从DataSet中删除指定记录<br />myDataSet.Tables [ "person" ] . Rows [ myBind.Position ] . Delete ( ) ;<br />myDataSet.Tables [ "person" ] . AcceptChanges ( ) ;<br />myConn.Close ( ) ;<br />}<br />catch ( Exception ed )<br />{<br />MessageBox.Show ( "删除记录错误信息： " + ed.ToString ( ) , "错误！" ) ;<br />} <br />}<br />} </p><p>　　在这二段代码中，在更改数据库的同时也对"DatsSet"对象进行了必要的修改。<br />下图是程序中对数据记录进行删除操作的运行界面： </p><p><strong>四．插入数据记录： <br /><br /></strong>　　 对数据库进行插入记录操作和删除记录操作基本的思路是一致的，就是通过ADO.NET首先插入数据记录到数据库，然后对"DataSet"对象进行必要的修改。下列代码就是以Access 2000数据库为模型修改当前记录的代码： <br /><br />protected void Update_record ( object sender , System.EventArgs e ) <br />{ <br />int i = myBind.Position ; <br />try{ <br />file://连接到一个数据库 <br />string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb " ; <br />OleDbConnection myConn = new OleDbConnection ( strCon ) ; <br />myConn.Open ( ) ; <br />myDataSet.Tables [ "person" ] . Rows [ myBind.Position ] . BeginEdit ( ) ; <br />file://从数据库中修改指定记录 <br />string strUpdt = " UPDATE person SET xm = '" <br />+ t_xm.Text + "' , xb = '" <br />+ t_xb.Text + "' , nl = " <br />+ t_nl.Text + " , zip = " <br />+ t_books.Text + " WHERE id = " + t_id.Text ; <br />OleDbCommand myCommand = new OleDbCommand ( strUpdt , myConn ) ; <br />myCommand.ExecuteNonQuery ( ) ; <br />myDataSet.Tables [ "person" ] . Rows [ myBind.Position ] . EndEdit ( ) ; <br />myDataSet.Tables [ "person" ] . AcceptChanges ( ) ; <br />myConn.Close ( ) ; <br />} <br />catch ( Exception ed ) <br />{ <br />MessageBox.Show ( "修改指定记录错误： " + ed.ToString ( ) , "错误！" ) ; <br />} <br />myBind.Position = i ; <br />} <br />　　 由于对Sql Server 2000数据记录修改操作和Access 2000数据记录修改操作的差异只在于不同的数据链接，具体的代码可以参考"删除数据记录"中的代码，在这里就不提供了。<br /><strong>五．插入数据记录： </strong><br /><br />　　 和前面二种操作在思路是一致的，就是通过ADO.NET首先插入数据记录到数据库，然后对"DataSet"对象进行必要的修改。下列代码就是以Access 2000数据库为模型插入一条数据记录的代码 <br /><br />protected void Insert_record ( object sender , System.EventArgs e ) <br />{ <br />try <br />{ <br />file://判断所有字段是否添完，添完则执行，反之弹出提示 <br />if ( t_id.Text != "" &amp;&amp; t_xm.Text != "" &amp;&amp; t_xb.Text != "" &amp;&amp; t_nl.Text != "" &amp;&amp; t_books.Text != "" ) <br />{ <br />string myConn1 = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb" ; <br />OleDbConnection myConn = new OleDbConnection ( myConn1 ) ; <br />myConn.Open ( ) ; <br />string strInsert = " INSERT INTO person ( id , xm , xb , nl , zip ) VALUES ( " ; <br />strInsert += t_id.Text + ", '" ; <br />strInsert += t_xm.Text + "', '" ; <br />strInsert += t_xb.Text + "', " ; <br />strInsert += t_nl.Text + ", " ; <br />strInsert += t_books.Text + ")" ; <br />OleDbCommand inst = new OleDbCommand ( strInsert , myConn ) ; <br />inst.ExecuteNonQuery ( ) ; <br />myConn.Close ( ) ; <br />myDataSet.Tables [ "person" ] . Rows [ myBind.Position ] . BeginEdit ( ) ; <br />myDataSet.Tables [ "person" ] . Rows [ myBind.Position ] . EndEdit ( ) ; <br />myDataSet.Tables [ "person" ] . AcceptChanges ( ) ; <br />} <br />else <br />{ <br />MessageBox.Show ( "必须填满所有字段值！" , "错误！" ) ; <br />} <br />} <br />catch ( Exception ed ) <br />{ <br />MessageBox.Show ( "保存数据记录发生 " + ed.ToString ( ) , "错误！" ) ; <br />} <br />} <br />　　 同样对Sql Server 2000数据库进行插入记录操作和Access 2000数据库插入记录操作的差异也只在于不同的数据链接，具体的代码可以参考"删除数据记录"中的代码，在这里就不提供了。<br />　　六．Visual C＃数据库编程的完成源代码和程序运行的主界面： </p><p> </p><p>　　掌握了上面要点，编写一个完整的数据库编程的程序就显得非常容易了，下面是Visual C＃进行数据库编程的完整代码（Data01.cs），此代码是以Access 2000数据库为模型设计的，具体如下：</p><p>using System ;<br />using System.Drawing ;<br />using System.ComponentModel ;<br />using System.Windows.Forms ;<br />using System.Data.OleDb ;<br />using System.Data ;</p><p>public class Data : Form <br />{<br />private System.ComponentModel.Container components = null ;<br />private Button lastrec ;<br />private Button nextrec ;<br />private Button previousrec ;<br />private Button firstrec ;<br />private TextBox t_books ;<br />private TextBox t_nl ;<br />private ComboBox t_xb ;<br />private TextBox t_xm ;<br />private TextBox t_id ;<br />private Label l_books ;<br />private Label l_nl ;<br />private Label l_xb ;<br />private Label l_xm ;<br />private Label l_id ;<br />private Label label1 ;<br />private DataSet myDataSet ;<br />private Button button1 ;<br />private Button button2 ;<br />private Button button3 ;<br />private Button button4 ;<br />private BindingManagerBase myBind ; </p><p>public Data ( ) <br />{<br />file://连接到一个数据库<br />GetConnected ( ) ; <br />// 对窗体中所需要的内容进行初始化<br />InitializeComponent ( ) ;<br />}<br />file://清除在程序中使用过的资源<br />protected override void Dispose( bool disposing )<br />{<br />if( disposing )<br />{<br />if ( components != null ) <br />{<br />components.Dispose ( ) ;<br />}<br />}<br />base.Dispose( disposing ) ;<br />}<br />public static void Main ( ) <br />{<br />Application.Run ( new Data ( ) ) ;<br />}<br />public void GetConnected ( )<br />{<br />try<br />{<br />file://创建一个 OleDbConnection<br />string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb" ;<br />OleDbConnection myConn = new OleDbConnection ( strCon ) ;<br />string strCom = " SELECT * FROM person " ;<br />file://创建一个 DataSet<br />myDataSet = new DataSet ( ) ;</p><p>myConn.Open ( ) ;<br />file://用 OleDbDataAdapter 得到一个数据集<br />OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ;<br />file://把Dataset绑定books数据表<br />myCommand.Fill ( myDataSet , "person" ) ;<br />file://关闭此OleDbConnection<br />myConn.Close ( ) ;<br />}<br />catch ( Exception e )<br />{<br />MessageBox.Show ( "连接错误! " + e.ToString ( ) , "错误" ) ; <br />}<br />} <br />private void InitializeComponent ( )<br />{</p><p>file://添加控件，略</p><p>this.Name = "Data" ;<br />this.Text = "Visual C＃的数据库编程！" ;<br />this.ResumeLayout(false) ;<br />myBind = this.BindingContext [ myDataSet , "person" ] ;<br />}<br />protected void New_record ( object sender , System.EventArgs e )<br />{</p><p>t_id.Text = ( myBind.Count + 1 ).ToString ( ) ;<br />t_xm.Text = "" ;<br />t_xb.Text = "" ;<br />t_nl.Text = "" ;<br />t_books.Text = "" ;</p><p>}<br />protected void Insert_record ( object sender , System.EventArgs e )<br />{<br />try<br />{<br />file://判断所有字段是否添完，添完则执行，反之弹出提示 <br />if ( t_id.Text != "" &amp;&amp; t_xm.Text != "" &amp;&amp; t_xb.Text != "" &amp;&amp; t_nl.Text != "" &amp;&amp; t_books.Text != "" )<br />{<br />string myConn1 = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb" ;<br />OleDbConnection myConn = new OleDbConnection ( myConn1 ) ;<br />myConn.Open ( ) ;<br />string strInsert = " INSERT INTO person ( id , xm , xb , nl , zip ) VALUES ( " ;<br />strInsert += t_id.Text + ", '" ;<br />strInsert += t_xm.Text + "', '" ;<br />strInsert += t_xb.Text + "', " ;<br />strInsert += t_nl.Text + ", " ;<br />strInsert += t_books.Text + ")" ;<br />OleDbCommand inst = new OleDbCommand ( strInsert , myConn ) ;<br />inst.ExecuteNonQuery ( ) ;<br />myConn.Close ( ) ;<br />myDataSet.Tables [ "person" ] . Rows [ myBind.Position ] . BeginEdit ( ) ;<br />myDataSet.Tables [ "person" ] . Rows [ myBind.Position ] . EndEdit ( ) ;<br />myDataSet.Tables [ "person" ] . AcceptChanges ( ) ;<br />}<br />else<br />{<br />MessageBox.Show ( "必须填满所有字段值！" , "错误！" ) ;<br />}<br />}<br />catch ( Exception ed )<br />{<br />MessageBox.Show ( "保存数据记录发生 " + ed.ToString ( ) , "错误！" ) ;<br />} <br />}</p><p>protected void Update_record ( object sender , System.EventArgs e )<br />{<br />int i = myBind.Position ;<br />try{<br />file://连接到一个数据库<br />string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb " ;<br />OleDbConnection myConn = new OleDbConnection ( strCon ) ;<br />myConn.Open ( ) ;<br />myDataSet.Tables [ "person" ] . Rows [ myBind.Position ] . BeginEdit ( ) ;<br />file://从数据库中修改指定记录<br />string strUpdt = " UPDATE person SET xm = '"<br />+ t_xm.Text + "' , xb = '"<br />+ t_xb.Text + "' , nl = "<br />+ t_nl.Text + " , zip = "<br />+ t_books.Text + " WHERE id = " + t_id.Text ;<br />OleDbCommand myCommand = new OleDbCommand ( strUpdt , myConn ) ;<br />myCommand.ExecuteNonQuery ( ) ; <br />myDataSet.Tables [ "person" ] . Rows [ myBind.Position ] . EndEdit ( ) ;<br />myDataSet.Tables [ "person" ] . AcceptChanges ( ) ;<br />myConn.Close ( ) ;<br />}<br />catch ( Exception ed )<br />{<br />MessageBox.Show ( "修改指定记录错误： " + ed.ToString ( ) , "错误！" ) ; <br />}<br />myBind.Position = i ;<br />}<br /></p><p>protected void Delete_record ( object sender , System.EventArgs e )<br />{ <br />DialogResult r = MessageBox.Show ( "是否删除当前记录！" , "删除当前记录！" , MessageBoxButtons.YesNo , MessageBoxIcon.Question ) ;<br />int ss = ( int ) r ;<br />　 if ( ss == 6 ) // 按动"确定"按钮<br />{ <br />try{<br />file://连接到一个数据库<br />string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb " ;<br />OleDbConnection myConn = new OleDbConnection ( strCon ) ;<br />myConn.Open ( ) ;<br />string strDele = "DELETE FROM person WHERE id= " + t_id.Text ;<br />OleDbCommand myCommand = new OleDbCommand ( strDele , myConn ) ;<br />file://从数据库中删除指定记录<br />myCommand.ExecuteNonQuery ( ) ;<br />file://从DataSet中删除指定记录<br />myDataSet.Tables [ "person" ] . Rows [ myBind.Position ] . Delete ( ) ;<br />myDataSet.Tables [ "person" ] . AcceptChanges ( ) ;<br />myConn.Close ( ) ;<br />}<br />catch ( Exception ed )<br />{<br />MessageBox.Show ( "删除记录错误信息： " + ed.ToString ( ) , "错误！" ) ;<br />} <br />}<br />}</p><p>file://按钮"尾记录"对象事件程序 <br />protected void GoLast ( object sender , System.EventArgs e )<br />{<br />myBind.Position = myBind.Count - 1 ;<br />}</p><p>file://按钮"下一条"对象事件程序 <br />protected void GoNext ( object sender , System.EventArgs e )<br />{<br />if ( myBind.Position == myBind.Count -1 )<br />MessageBox.Show ( "已经到了最后一条记录！", "信息提示！" , MessageBoxButtons.OK , MessageBoxIcon.Information ) ;<br />else<br />myBind.Position += 1 ;<br />}<br />file://按钮"上一条"对象事件程序 <br />protected void GoPrevious ( object sender , System.EventArgs e )<br />{<br />if ( myBind.Position == 0 ) <br />MessageBox.Show ( "已经到了第一条记录！" , "信息提示！" , MessageBoxButtons.OK , MessageBoxIcon.Information ) ;<br />else<br />myBind.Position -= 1 ;<br />}<br />file://按钮"首记录"对象事件程序<br />protected void GoFirst ( object sender , System.EventArgs e )<br />{<br />myBind.Position = 0 ;<br />}<br />}<br />图02：Visual C＃数据库编程主界面<br /></p><p>　　对于以Sql Server 2000数据库为模型的程序代码，只要把Data01.cs中的数据链接，即：<br /></p><p>string myConn1 = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb" ; </p><p>　　改换成：<br /></p><p>string strCon = "Provider = SQLOLEDB.1 ; Persist Security Info = False ; User ID = sa ; Initial Catalog = data1 ; Data Source = server1 " ; </p><p>　　注释：此数据链接代表的意思是：打开Sql server数据库，服务器名称为server1,数据库为data1<br />就可以得到Visual C＃针对Sql Server 2000数据库为模板编程的完成源程序代码了。所以本文就不再提供了。</p><p>　　七．总结：</p><p>　　数据库编程始终是程序编程内容中的一个重点和难点。而以上介绍的这些操作又是数据库编程中最为基本，也是最为重要的内容。那些复杂的编程无非是以上这些处理的若干个叠加。</p><img src ="http://www.cnitblog.com/bbming/aggbug/20349.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/bbming/" target="_blank">老Ming</a> 2006-12-11 10:52 <a href="http://www.cnitblog.com/bbming/archive/2006/12/11/20349.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>考卷:广州电大“开放教育入学指南”网上测试题</title><link>http://www.cnitblog.com/bbming/archive/2006/12/08/20249.html</link><dc:creator>老Ming</dc:creator><author>老Ming</author><pubDate>Fri, 08 Dec 2006 14:19:00 GMT</pubDate><guid>http://www.cnitblog.com/bbming/archive/2006/12/08/20249.html</guid><wfw:comment>http://www.cnitblog.com/bbming/comments/20249.html</wfw:comment><comments>http://www.cnitblog.com/bbming/archive/2006/12/08/20249.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cnitblog.com/bbming/comments/commentRss/20249.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/bbming/services/trackbacks/20249.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align="center">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">考卷<span lang="EN-US">:</span>广州电大<span lang="EN-US">“</span>开放教育入学指南<span lang="EN-US">”</span>网上测试题<span lang="EN-US"></span></span>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">
				<b>
						<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt">一、判断题：（每题<span lang="EN-US">3</span>分，共<span lang="EN-US">30</span>分，在题前括号内填<span lang="EN-US">“Y”</span>（正确）或<span lang="EN-US">“N”</span>（错误）。）</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />1) </span>
				<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">远程教育已经历经三代，后一代远程教育的发展就意味着对前一代的否定或取代。<span lang="EN-US"><br /></span>标准答案<span lang="EN-US">:N<br /><br />2) </span>电大的开放教育学生可以不经过入学统考但需经过入学水平测试后注册入学。<span lang="EN-US"><br /></span>标准答案<span lang="EN-US">:Y<br /><br />3) </span>通过国家自学考试、普通高校等其它高等教育形式取得部分课程的合格成绩者，且课程的专业层次、教学内容和教学要求不低于现修专业被替换课程的，可以申请替换现修专业的同名课程的学分。<span lang="EN-US"><br /></span>标准答案<span lang="EN-US">:Y<br /><br />4) </span>多种媒体教材就是指计算机多媒体。<span lang="EN-US"><br /></span>标准答案<span lang="EN-US">:N<br /><br />5) </span>电大开放教育本科某课程成绩不理想的，可以重新注册参加该课程的考核。<span lang="EN-US"><br /></span>标准答案<span lang="EN-US">:Y<br /><br />6) </span>学生在制订个人学习计划时遇到困难，可以听取电大老师或管理人员的意见或指导。<span lang="EN-US"><br /></span>标准答案<span lang="EN-US">:Y<br /><br />7) </span>由于工学矛盾或跟不上，电大允许开放教育学生每学期少选课程或不参加本学期的期末考试。<span lang="EN-US"><br /></span>标准答案<span lang="EN-US">:Y<br /><br />8) </span>电大开放教育学生每门课程每学期必须完成的平时作业不少于<span lang="EN-US">4</span>次。<span lang="EN-US"><br /></span>标准答案<span lang="EN-US">:Y<br /><br />9) </span>国家自学考试课程可以<span lang="EN-US">100</span>％与开放教育课程进行学分替换。<span lang="EN-US"><br /></span>标准答案<span lang="EN-US">:N<br /><br />10) </span>开放教育专科学生最低毕业学分为<span lang="EN-US">76</span>学分，本科学生最低毕业学分为<span lang="EN-US">71</span>学分。<span lang="EN-US"><br /></span>标准答案<span lang="EN-US">:Y<br /><br /></span></span>
				<b>
						<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt">二、选择题（每题<span lang="EN-US"> 3 </span>分，共<span lang="EN-US">30</span>分）</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />1) </span>
				<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">广播电视大学的培养对象是各级各类（）型专门人才。<span lang="EN-US"><br />   1. </span>研究<span lang="EN-US"><br />   2. </span>开拓<span lang="EN-US"><br />   3. </span>专业<span lang="EN-US"><br />   4. </span>应用<span lang="EN-US"><br /></span>标准答案<span lang="EN-US">:4<br /><br />2) </span>中央电大统设课程的期末考试一般安排在每年的（ ）进行，滚动开出，不设补考。<span lang="EN-US"><br />   1. 2</span>月和<span lang="EN-US">8</span>月<span lang="EN-US"><br />   2. 1</span>月和<span lang="EN-US">7</span>月<span lang="EN-US"><br />   3. 3</span>月和<span lang="EN-US">7</span>月<span lang="EN-US"><br />   4. 3</span>月和<span lang="EN-US">9</span>月<span lang="EN-US"><br /></span>标准答案<span lang="EN-US">:2<br /><br />3) </span>下列哪一项不属于电大与其他高校的不同特点（ ）。<span lang="EN-US"><br />   1. </span>具有远程教育特征<span lang="EN-US"><br />   2. </span>采用多种媒体教学<span lang="EN-US"><br />   3. </span>以课堂教学为主<span lang="EN-US"><br />   4. </span>开放的学习模式<span lang="EN-US"><br /></span>标准答案<span lang="EN-US">:3<br /><br />4) </span>下列说法中，不正确的是（）。<span lang="EN-US"><br />   1. </span>开放教育的本质是人人平等享有终身接受教育的权利<span lang="EN-US"><br />   2. </span>教育观念、教育资源、教育过程的开放更为重要<span lang="EN-US"><br />   3. </span>远程教育更适宜实现开放教育<span lang="EN-US"><br />   4. </span>开放教育不可以在面授教学的条件下进行<span lang="EN-US"><br /></span>标准答案<span lang="EN-US">:4<br /><br />5) “</span>宽进严出<span lang="EN-US">”</span>中的宽进指的是（）。<span lang="EN-US"><br />   1. </span>放宽对入学者年龄制<span lang="EN-US"><br />   2. </span>放宽对入学者学历的限制<span lang="EN-US"><br />   3. </span>放宽对入学者名额的限制<span lang="EN-US"><br />   4. </span>不需要通过统一的入学考试<span lang="EN-US"><br /></span>标准答案<span lang="EN-US">:4<br /><br />6) </span>中央电大的统设必修课程的学分一般在毕业总学分的（）左右。<span lang="EN-US"><br />   1. 80%<br />   2. 60%<br />   3. 50%<br />   4. 2/3<br /></span>标准答案<span lang="EN-US">:2<br /><br />7) </span>每门课程的毕业时作业的次数一般为（ ）。<span lang="EN-US"><br />   1. 5</span>次<span lang="EN-US"><br />   2. 4</span>次<span lang="EN-US"><br />   3. 3</span>次<span lang="EN-US"><br />   4. 2</span>次<span lang="EN-US"><br /></span>标准答案<span lang="EN-US">:2<br /><br />8) </span>发送电子邮件的软件是（ ）。<span lang="EN-US"><br />   1. Internet Expresss<br />   2. Outlook Express<br />   3. Word<br />   4. Excel<br /></span>标准答案<span lang="EN-US">:2<br /><br />9) </span>平时作业是（ ）成绩的重要组成部分之一。<span lang="EN-US"><br />   1. </span>考试<span lang="EN-US"><br />   2. </span>总评<span lang="EN-US"><br />   3. </span>毕业<span lang="EN-US"><br />   4. </span>形成性考核<span lang="EN-US"><br /></span>标准答案<span lang="EN-US">:4<br /><br />10) </span>假定一名开放教育学员某学期所修课程为<span lang="EN-US">10</span>学分，他必须保证每周至少有多少小时学习时间（ ）。<span lang="EN-US"><br />   1. 10</span>小时左右<span lang="EN-US"><br />   2. 15-20</span>小时<span lang="EN-US"><br />   3. 18-27</span>小时<span lang="EN-US"><br />   4. 25-36</span>小时<span lang="EN-US"><br /></span>标准答案<span lang="EN-US">:3<br /><br /></span></span>
				<b>
						<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt">三、填空题（每空<span lang="EN-US">4</span>分，共<span lang="EN-US">20</span>分）</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />1) </span>
				<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">广播电视大学是<span lang="EN-US">()</span>年由<span lang="EN-US">()</span>倡导并亲自批准成立。<span lang="EN-US"><br /></span>标准答案<span lang="EN-US">:1979 </span>邓小平<span lang="EN-US"><br /><br />2) </span>中央电大开设的统设专业，其教学计划中统设必修课程，在全国实行的<span lang="EN-US">“</span>五统一<span lang="EN-US">”</span>是指：统一<span lang="EN-US">() </span>、统一<span lang="EN-US">()</span>、统一<span lang="EN-US">()</span>、统一<span lang="EN-US">()</span>、统一<span lang="EN-US">()</span>。<span lang="EN-US"><br /></span>标准答案<span lang="EN-US">:</span>课程名称 教学大纲 教材 考试 评分标准<span lang="EN-US"><br /><br />3) </span>电大开放教育的修业年限实行<span lang="EN-US">()</span>制，考试成绩<span lang="EN-US">()</span>年有效。如果你是<span lang="EN-US">2004</span>年秋季入学的学生，最早可以于<span lang="EN-US">()</span>年毕业，最晚可以于<span lang="EN-US">()</span>年毕业。<span lang="EN-US"><br /></span>标准答案<span lang="EN-US">:</span>完全学分<span lang="EN-US"> 8 2006 2012<br /><br />4) </span>中央电大的网址是<span lang="EN-US">http://()</span>，广州电大的网址是<span lang="EN-US">http://()</span>。<span lang="EN-US"><br /></span>标准答案<span lang="EN-US">:www.crtvu.edu.cn <a href="http://www.ougz.com.cn/"><span style="mso-ascii-font-family: 宋体; mso-hansi-font-family: 宋体"><font color="#a3b341">www.ougz.com.cn</font></span></a></span></span>
		</p>
		<p>
				<font color="#a3b341">
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />5) </span>
				<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">开放教育是相对于<span lang="EN-US">()</span>而言的。开放教育有这样的基本特征：以<span lang="EN-US">()</span>，而不是以教师、学校和教学为中心。<span lang="EN-US"><br /></span>标准答案<span lang="EN-US">:</span>封闭教育 学生和学习为中心<span lang="EN-US"><br /><br />6) </span>远程教育已经历经三代：第一代是函授教育；第二代是<span lang="EN-US">()</span>；第三代的基本特征是利用<span lang="EN-US">()</span>，在数字信号环境下进行教学活动，被称为<span lang="EN-US">“</span>现代远程教育<span lang="EN-US">”</span>。<span lang="EN-US"><br /></span>标准答案<span lang="EN-US">:</span>广播电视教育 计算机网、卫星电视网、电信网和多媒体技术<span lang="EN-US"><br /><br />7) </span>开放教育中的<span lang="EN-US">“</span>开放<span lang="EN-US">”</span>不仅指对教育对象的开放，更重要的是教育观念、教育<span lang="EN-US">()</span>和教育<span lang="EN-US">()</span>的开放。<span lang="EN-US"><br /></span>标准答案<span lang="EN-US">:</span>资源 过程<span lang="EN-US"><br /><br />8) </span>教学大纲对平时作业、<span lang="EN-US">()</span>、实习、<span lang="EN-US">()</span>和平时成绩等都有具体规定和要求，对制定个人学习计划会有所帮助。<span lang="EN-US"><br /></span>标准答案<span lang="EN-US">:</span>实验 社会调查<span lang="EN-US"><br /><br />9) </span>广播电视大学是以<span lang="EN-US">()</span>为主要手段，采用广播、电视、文字和音像教材、<span lang="EN-US">()</span>等多种媒体进行远程开放教育的高等学校。<span lang="EN-US"><br /></span>标准答案<span lang="EN-US">:</span>现代信息技术 计算机网络<span lang="EN-US"><br /><br />10) </span>多媒体教材包括文字教材、<span lang="EN-US">()</span>、录象教材、<span lang="EN-US">()</span>及其他媒体教材。<span lang="EN-US"><br /></span>标准答案<span lang="EN-US">:</span>录音教材 计算机辅助教学软件<span lang="EN-US"><br style="mso-special-character: line-break" /></span></span>
		</p>
<img src ="http://www.cnitblog.com/bbming/aggbug/20249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/bbming/" target="_blank">老Ming</a> 2006-12-08 22:19 <a href="http://www.cnitblog.com/bbming/archive/2006/12/08/20249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>