﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-桢知卓见</title><link>http://www.blogjava.net/jalion/</link><description /><language>zh-cn</language><lastBuildDate>Fri, 19 Jun 2026 10:01:21 GMT</lastBuildDate><pubDate>Fri, 19 Jun 2026 10:01:21 GMT</pubDate><ttl>60</ttl><item><title>使用setTimeout 传递参数的问题（转贴收藏）</title><link>http://www.blogjava.net/jalion/articles/127364.html</link><dc:creator>李桢</dc:creator><author>李桢</author><pubDate>Sun, 01 Jul 2007 08:04:00 GMT</pubDate><guid>http://www.blogjava.net/jalion/articles/127364.html</guid><wfw:comment>http://www.blogjava.net/jalion/comments/127364.html</wfw:comment><comments>http://www.blogjava.net/jalion/articles/127364.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jalion/comments/commentRss/127364.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jalion/services/trackbacks/127364.html</trackback:ping><description><![CDATA[<span id=ArticleContent1_ArticleContent1_lblContent>&nbsp;
<p><font face=Tahoma>也许你过去在setTimeout中传参数一直是这样</font></p>
<p><font face=Tahoma>setTimeout("pass(" + argu + ")",1000)</font></p>
<p><font face=Tahoma>这样只能传字符串,对传递object就无能为力了,需要大费文章.然而别忘了,第一个参数还可以是function!!!</font></p>
<p><font face=Tahoma>看以下代码实现向里面的function 传参数</font></p>
<p><font face=Tahoma>&lt;script type="text/javascript"&gt;<br>var _st = window.setTimeout;<br>window.setTimeout = function(fRef, mDelay) {<br>&nbsp;if(typeof fRef == 'function'){<br>&nbsp;&nbsp;var argu = Array.prototype.slice.call(arguments,2);<br>&nbsp;&nbsp;var f = (function(){ fRef.apply(null, argu); });<br>&nbsp;&nbsp;return _st(f, mDelay);<br>&nbsp;}<br>&nbsp;return _st(fRef,mDelay);<br>}</font></p>
<p><font face=Tahoma>function test(x){<br>&nbsp;alert(x);<br>}<br>window.setTimeout(test,1000,'fason');<br>&lt;/script&gt;</font></p>
<font face=Tahoma>
<p><font face=Tahoma>怎样?是不是很方便了?代码其实就很简单,重载了一下window.setTimeout,用apply去回调前面的function.</font></p>
</font></span>
<img src ="http://www.blogjava.net/jalion/aggbug/127364.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jalion/" target="_blank">李桢</a> 2007-07-01 16:04 <a href="http://www.blogjava.net/jalion/articles/127364.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网页嵌入视频加密及加密保护</title><link>http://www.blogjava.net/jalion/articles/127335.html</link><dc:creator>李桢</dc:creator><author>李桢</author><pubDate>Sun, 01 Jul 2007 02:34:00 GMT</pubDate><guid>http://www.blogjava.net/jalion/articles/127335.html</guid><wfw:comment>http://www.blogjava.net/jalion/comments/127335.html</wfw:comment><comments>http://www.blogjava.net/jalion/articles/127335.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jalion/comments/commentRss/127335.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jalion/services/trackbacks/127335.html</trackback:ping><description><![CDATA[<p>最近由于需要对网页视频（直播）加密（主要是对视频流地址保护），做了一个简单的应用。</p>
<p>记得曾经看过用了asp动态生成脚本文件来隐藏网页内容，我想JSP也可以吧，所以我一开始就想到也用这种方式来加密。但浪费了我一下午的时间，也没整出个类似的方法。脚本倒是动态生成了，但出错的原因是<font color=#ff0000><strong>：&lt;script src="b.jsp"&gt;&lt;/script&gt;，</strong></font><font color=#000000>只要src引用的不是.js语法就通不过！无奈，我只好用&lt;iframe&gt;嵌入网页来实现了。</font>首页: index.jsp</p>
<p><font color=#ff0000>&nbsp;&nbsp; &lt;body&gt;<br>&lt;noscript&gt;<br>&lt;iframe src="index.jsp"&gt;&lt;/iframe&gt;<br>&nbsp; &lt;/noscript&gt;&nbsp;&nbsp;<font color=#000000>&nbsp;//加入noscript防止用户将页面&#8221;另存为&#8220;</font><br>&nbsp; &lt;iframe src="b.htm" height="400" width="352" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;<br>&nbsp; &lt;/body&gt;</font></p>
<p>b.htm中嵌入了视频播放器：</p>
<p><font color=#0000ff>//<font size=2>其中&lt;object&gt;标签和&lt;embed&gt;标签的嵌套使用是为解决IE与Netscape浏览器的兼容性问题。</font></font></p>
<p>&nbsp;<font color=#ff0000>&lt;OBJECT id=mediaplayer <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; codeBase=http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#version=6,4,7,1112 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type=application/x-oleobject height=288 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; standby="loading microsoft windows media player components..." <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; width=320 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; classid=clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95&gt;&lt;PARAM NAME="showstatusbar" VALUE="1"&gt;&lt;PARAM NAME="filename" VALUE="<font color=#0000ff>视频流地址</font>"&gt;&lt;PARAM NAME="autostart" VALUE="1"&gt;&lt;PARAM NAME="showcontrols" VALUE="1"&gt;&lt;PARAM NAME="windowlessvideo" VALUE="1"&gt;<br>&lt;param name="EnableContextMenu" value="0"&gt;</font></p>
<p><font color=#ff0000>&lt;embed <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="application/x-mplayer2"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pluginspage="</font><a href="http://www.microsoft.com/windows/windowsmedia/download/"><font color=#ff0000><u>http://www.microsoft.com/windows/windowsmedia/download/</u></font></a><font color=#ff0000>"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filename="<font color=#0000ff>视频流地址</font>" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; autostart=1 EnableFullScreenControls=0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShowControls=1 ShowDisplay=0 ShowStatusBar=1 width="352" <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; height="288"&gt;&nbsp;&nbsp;&nbsp; &lt;/embed&gt;&nbsp; &lt;/OBJECT&gt;</font></p>
<p>做完以上两步以后你可以浏览一下，当查看index.jsp源代码时，你看到的只是"b.htm",但是你如果直接请求b.htm的话还是能看到视频流的地址。我们现在要做的最后一步是在b.htm中判断源页面，采用javascript就OK了以下是代码：</p>
<p><font color=#ff0000>&lt;script type="text/javascript"&gt;<br>var tt=document.referrer;<br>var temp=tt.substring(tt.lastIndexOf("/")+1,tt.length);<br>if(temp!="index.jsp")<br>document.location="错误页面";<br>&lt;/script&gt;</font></p>
<p><font color=#000000>将以上代码加入b.htm的head中，当用户直接请求时，此段代码直接将转到错误页面</font></p>
<p><font color=#00ff00>/***********************************************************/</font></p>
<p><font color=#00ff00>11.27修改</font></p>
<p><font color=#00ff00>经过今天晚上测试,</font><font color=#ff00cc>发现了上述错误的原因:当我用jsp生成页面时,我用EC直接生成的JSP页面,</font></p>
<p><font color=#ff00cc>带有头文件信息等,生成的页面当然带&lt;head&gt;等啦,放进&lt;...&nbsp; src="a.jsp"&gt;中肯定编译不过的,</font></p>
<p><font color=#ff00cc>解决方案就是:在JSP页面(a.jsp)中之写&lt;% out.println("document.write('asd');");%&gt;</font></p>
<p><font color=#ff00cc>这样当在另一jsp中引用&lt;script src="a.jsp"&gt;,请求时,直接显示的是asd;</font></p>
<p><font color=#0000ff>注意问题:当out.println("document.write('&lt;script&gt;'");时,应该用转义字符&amp;lt;因为碰到&lt;script&gt;的话,浏览器直接就解释执行了写成out.println("document.write('&amp;lt;script&gt;'");</font></p>
<img src ="http://www.blogjava.net/jalion/aggbug/127335.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jalion/" target="_blank">李桢</a> 2007-07-01 10:34 <a href="http://www.blogjava.net/jalion/articles/127335.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在线编辑器之一   ：判断浏览器版本</title><link>http://www.blogjava.net/jalion/articles/127334.html</link><dc:creator>李桢</dc:creator><author>李桢</author><pubDate>Sun, 01 Jul 2007 02:33:00 GMT</pubDate><guid>http://www.blogjava.net/jalion/articles/127334.html</guid><wfw:comment>http://www.blogjava.net/jalion/comments/127334.html</wfw:comment><comments>http://www.blogjava.net/jalion/articles/127334.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jalion/comments/commentRss/127334.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jalion/services/trackbacks/127334.html</trackback:ping><description><![CDATA[<p>打算写一个在线编辑器，今天就开始吧，想到什么函数写什么。现在浏览器市场不统一，各家都想一统天下，所以对标签，脚本的支持各尽同。为了兼容，第一步就是得兼容各个版本的浏览器。</p>
<p>判断浏览版本</p>
<p><font color=#ff0000>&nbsp;function getBrowser()<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;var browser;<br>&nbsp;&nbsp;&nbsp;var agent = navigator.userAgent.toLowerCase();<br>&nbsp;&nbsp;&nbsp;if (agent.indexOf("msie") &gt; -1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;var re = new RegExp("msie\\s?([\\d\\.]+)","ig");<br>&nbsp;&nbsp;&nbsp;&nbsp;var arr = re.exec(agent);<br>&nbsp;&nbsp;&nbsp;&nbsp;if (parseInt(RegExp.$1) &gt;= 5.5) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;browser = 'IE';<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;} else if (agent.indexOf("firefox") &gt; -1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;browser = 'Firefox';<br>&nbsp;&nbsp;&nbsp;} else if (agent.indexOf("netscape") &gt; -1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;var temp1 = agent.split(' ');<br>&nbsp;&nbsp;&nbsp;&nbsp;var temp2 = temp1[temp1.length-1].split('/');<br>&nbsp;&nbsp;&nbsp;&nbsp;if (parseInt(temp2[1]) &gt;= 7) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;browser = 'NetScape';<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;} else if (agent.indexOf("gecko") &gt; -1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;browser = 'ML';<br>&nbsp;&nbsp;&nbsp;} else if (agent.indexOf("opera") &gt; -1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;var temp1 = agent.split(' ');<br>&nbsp;&nbsp;&nbsp;&nbsp;var temp2 = temp1[0].split('/');<br>&nbsp;&nbsp;&nbsp;&nbsp;if (parseInt(temp2[1]) &gt;= 9) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;browser = 'OPERA';<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;}<br>&nbsp;return browser;<br>}</font></p>
<img src ="http://www.blogjava.net/jalion/aggbug/127334.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jalion/" target="_blank">李桢</a> 2007-07-01 10:33 <a href="http://www.blogjava.net/jalion/articles/127334.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于JDK1.5中Integer的一点改动</title><link>http://www.blogjava.net/jalion/articles/127333.html</link><dc:creator>李桢</dc:creator><author>李桢</author><pubDate>Sun, 01 Jul 2007 02:32:00 GMT</pubDate><guid>http://www.blogjava.net/jalion/articles/127333.html</guid><wfw:comment>http://www.blogjava.net/jalion/comments/127333.html</wfw:comment><comments>http://www.blogjava.net/jalion/articles/127333.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jalion/comments/commentRss/127333.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jalion/services/trackbacks/127333.html</trackback:ping><description><![CDATA[<p>int a=100;int b=100;</p>
<p>System.out.println(a==b);结果true</p>
<p>Integer c=new Integer(100);</p>
<p>Integer d=new Integer(100);</p>
<p>System.out.println(c==d);结果false;</p>
<p>以上都是JDK1.5版本以前的</p>
<p>新改动：</p>
<p><strong><font color=#ff0000>Integer aa=100;</font></strong></p>
<p><strong><font color=#ff0000>Integer bb=100;</font></strong></p>
<p><strong><font color=#ff0000>System.out.println(aa==bb);结果true;</font></strong></p>
<p><strong><font color=#ff0000>Integer aa=100;在以前的版本中是不允许的。但在JDK1.5后续版本中可以这样写。</font></strong></p>
<p><strong><font color=#ff0000>再看这两句：</font></strong></p>
<p><strong><font color=#0000ff>Integer aa=200;</font></strong></p>
<p><strong><font color=#0000ff>Integer bb=200;</font></strong></p>
<p><strong><font color=#0000ff>System.out.println(aa==bb);结果false;</font></strong></p>
<p><strong><font color=#0000ff>当数值范围是[-128,127]时，是直接从缓存中取，当在范围之外时，生成一个新对象。附上JDK源代码</font></strong></p>
<strong><font color=#0000ff>
<p><font color=#9933ff>&nbsp;private static class IntegerCache {<br>&nbsp;private IntegerCache(){}</font></p>
<p><font color=#9933ff>&nbsp;static final Integer cache[] = new Integer[-(-128) + 127 + 1];</font></p>
<p><font color=#9933ff>&nbsp;static {<br>&nbsp;&nbsp;&nbsp;&nbsp; for(int i = 0; i &lt; cache.length; i++)<br>&nbsp;&nbsp;cache[i] = new Integer(i - 128);<br>&nbsp;}<br>&nbsp;&nbsp;&nbsp; }</font></p>
<p><br><font color=#9933ff>&nbsp;&nbsp;&nbsp; public static Integer valueOf(int i) {<br>&nbsp;final int offset = 128;<br>&nbsp;if (i &gt;= -128 &amp;&amp; i &lt;= 127) { // must cache <br>&nbsp;&nbsp;&nbsp;&nbsp; return IntegerCache.cache[i + offset];<br>&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new Integer(i);<br>&nbsp;&nbsp;&nbsp; }</font></p>
<p>&#160;</p>
</font></strong><strong><font color=#ff0000></font></strong>&nbsp;
<img src ="http://www.blogjava.net/jalion/aggbug/127333.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jalion/" target="_blank">李桢</a> 2007-07-01 10:32 <a href="http://www.blogjava.net/jalion/articles/127333.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转贴：ubuntu的配置</title><link>http://www.blogjava.net/jalion/articles/127332.html</link><dc:creator>李桢</dc:creator><author>李桢</author><pubDate>Sun, 01 Jul 2007 02:31:00 GMT</pubDate><guid>http://www.blogjava.net/jalion/articles/127332.html</guid><wfw:comment>http://www.blogjava.net/jalion/comments/127332.html</wfw:comment><comments>http://www.blogjava.net/jalion/articles/127332.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jalion/comments/commentRss/127332.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jalion/services/trackbacks/127332.html</trackback:ping><description><![CDATA[转自：<a href="http://publishblog.blogdriver.com/blog/tb.b?diaryID=1220277" target=_blank><u><font color=#0000ff>http://</font></u></a><a href="http://publishblog.blogdriver.com/blog/tb.b?diaryID=1220277" target=_blank><u><font color=#0000ff>publishblog.blogdriver.com/blog/tb.b?diaryID=1220277</font></u></a><a href="http://publishblog.blogdriver.com/blog/tb.b?diaryID=1220277" target=_blank></a> <a name=relatedDiary></a>
<h2>ubuntu全程配置手册zt- -</h2>
<p>&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; </p>
<p>??其实这是我的安装配置备忘录。个人感觉比ubuntu.org.cn的手册更适合我一些，贴出来供大家批评参详。事实上，本文绝大多数内容都是来自于下面提到的文章。我自己只是做了一回胶水而已。 <img alt="" src="http://www.linuxsir.org/bbs/images/smilies/smile.gif" border=0> <br><br><strong>撰写本文所使用的硬件配置：</strong><br>Pentium M 1.4 GHz, 512 MB 内存, 80GB 硬盘, CD-ROM, 14.1' LCD 1024 x 768, ATI Mobility Readon 9000 (M9) 64 MB Video RAM, 2Mbps ADSL<br>凡是使用ATI Readon 8500以上显卡的计算机，有3GB以上硬盘未分配空间的，都适用本文内容。NV显卡用户和非ADSL用户也可以参考除了网络配置和显卡配置之外的所有内容。（ATI X300以上显卡的用户和宽屏显示器用户可能不适用本文的显示配置部分。）<br><br><strong>一、前言：</strong><br><br>Linux的近年来的发展迅速，在我接触Linux的2年中，Windows还是那个Windows，而 Linux已经不是2年前的Linux了！把Linux作为桌面，也随着Linux易用性的提高而渐渐为越来越多的人所接受。据说Google公司最受欢迎的操作系统不是Windows，不是MacOSX，而是Linux。Linux发行版多种多样，现在最受欢迎的莫过于Ubuntu，Google公司内部使用的Linux发行版，也是基于Ubuntu的Goobuntu。<br><br>现在，我就以Ubuntu Linux 6.06 LTS为例，介绍Ubuntu Linux的安装和配置，使之能更好的满足大家的需要。全文以介绍配置为主。<br><br>本文参考了<a href="http://www.ubuntu.org.cn/" target=_blank><u><font color=#0000ff>ubuntu.org.cn</font></u></a>的<a href="http://wiki.ubuntu.org.cn/%E5%BF%AB%E9%80%9F%E8%AE%BE%E7%BD%AE%E6%8C%87%E5%8D%97/DapperDrake" target=_blank><u><font color=#0000ff>Ubuntu Linux 6.06 DapperDrake快速设置指南</font></u></a>，<a href="http://wiki.ubuntu.org.cn/%E5%A6%82%E4%BD%95%E6%B7%B7%E9%9F%B3" target=_blank><u><font color=#0000ff>如何混音</font></u></a>和Nicky's Blog的<a href="http://blog.osxcn.com/ubuntu-stheiti.html" target=_blank><u><font color=#0000ff>ubuntu的黑体解决方案</font></u></a>。<br><br>本文提到的STHeiti属于商业软件，仅供个人测试之用，不得用于任何形式的商业用途。MS Truetype Core Fonts根据Microsoft的EULA免费分发，EULA的内容请自行查阅msttcorefonts压缩包内的相关文件。<br><br>谨以此文，献给喜欢Ubuntu的Linuxer。欢迎加入Ubuntu阵营。 <img alt="" src="http://www.linuxsir.org/bbs/images/smilies/smile.gif" border=0><br><br><strong>二、安装：</strong><br><br>0. 下载Ubuntu Linux 6.06 LTS <a href="http://mirror.lupaworld.com/ubuntu/releases/6.06/ubuntu-6.06-desktop-i386.iso" target=_blank><u><font color=#0000ff>Desktop CD的ISO</font></u></a>，刻盘。<br><br>1. 用光盘引导系统，进入LiveCD安装环境。直接点击桌面上的安装软连接就可以开始安装了。<br><br>2. 安装过程不详述了，详情请参考<a href="http://wiki.ubuntu.org.cn/Ubuntu6.06Install" target=_blank><u><font color=#0000ff>这里</font></u></a>，包括了安装全过程的截图，其实基本上跟着安装向导一路下去就可以了，唯一要注意一下的地方就是分区。可能第一次使用这个分区工具会感到有点陌生，但是只要你对分区方法很熟悉，上手应该不难。<br><br>强烈建议安装过程中保持联网，以下载中文语言包。配置联网方法见下面&#8220;配置ADSL&#8221;，请在安装前配置网络以确保安装过程中网络通畅。你也可以在安装过程中使用LiveCD环境浏览网络，打发时间。如果网络状况良好，以2Mb ADSL全速为例，大约15－20分钟就可安装完成。重启。<br><br><strong>三、安装后配置：</strong><br><br>0. 配置ADSL:<br><br></p>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 34px">
<div style="TEXT-ALIGN: left">sudo pppoeconf</div>
</pre>
</div>
<br>配置完毕，即已经联网。<br>要手动联网可以使用：<br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 34px">
<div style="TEXT-ALIGN: left">pon dsl-provider</div>
</pre>
</div>
<br>手动关闭联网可以使用：<br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 34px">
<div style="TEXT-ALIGN: left">poff dsl-provider</div>
</pre>
</div>
<br><strong>1. 添加源：</strong><br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 50px">
<div style="TEXT-ALIGN: left">sudo mv /etc/apt/sources.list /etc/apt/sources.list_backup<br>sudo gedit /etc/apt/sources.list</div>
</pre>
</div>
<br>添加下面的任意一组（请根据你的实际连线速度决定）：<br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 498px">
<div style="TEXT-ALIGN: left">    * Archive.ubuntu.com 更新服务器(欧洲)：<br><br>deb http://archive.ubuntu.com/ubuntu/ dapper main restricted universe multiverse<br>deb http://archive.ubuntu.com/ubuntu/ dapper-security main restricted universe multiverse<br>deb http://archive.ubuntu.com/ubuntu/ dapper-updates main restricted universe multiverse<br>deb http://archive.ubuntu.com/ubuntu/ dapper-backports main restricted universe multiverse<br>deb http://archive.ubuntu.org.cn/ubuntu-cn/ dapper main restricted universe multiverse<br><br>    * Ubuntu.cn99.com 更新服务器(江苏省常州市电信，推荐电信用户使用。）：<br><br>deb http://ubuntu.cn99.com/ubuntu/ dapper main restricted universe multiverse<br>deb http://ubuntu.cn99.com/ubuntu/ dapper-updates main restricted universe multiverse<br>deb http://ubuntu.cn99.com/ubuntu/ dapper-security main restricted universe multiverse<br>deb http://ubuntu.cn99.com/ubuntu/ dapper-backports main restricted universe multiverse<br>deb http://ubuntu.cn99.com/ubuntu-cn/ dapper main restricted universe multiverse<br><br>    * Mirror.lupaworld.com 更新服务器(浙江省杭州市电信，推荐电信用户使用。）：<br><br>deb http://mirror.lupaworld.com/ubuntu/archive/ dapper main restricted universe multiverse<br>deb http://mirror.lupaworld.com/ubuntu/archive/ dapper-security main restricted universe multiverse<br>deb http://mirror.lupaworld.com/ubuntu/archive/ dapper-updates main restricted universe multiverse<br>deb http://mirror.lupaworld.com/ubuntu/archive/ dapper-backports main restricted universe multiverse<br>deb http://mirror.lupaworld.com/ubuntu/ubuntu-cn/ dapper main restricted universe multiverse<br><br>    * 上海市交通大学 更新服务器（教育网，推荐校园网和网通用户使用。）：<br><br>deb http://ftp.sjtu.edu.cn/ubuntu/ dapper main multiverse restricted universe<br>deb http://ftp.sjtu.edu.cn/ubuntu/ dapper-backports main multiverse restricted universe<br>deb http://ftp.sjtu.edu.cn/ubuntu/ dapper-proposed main multiverse restricted universe<br>deb http://ftp.sjtu.edu.cn/ubuntu/ dapper-security main multiverse restricted universe<br>deb http://ftp.sjtu.edu.cn/ubuntu/ dapper-updates main multiverse restricted universe<br>deb http://ftp.sjtu.edu.cn/ubuntu-cn/ dapper main multiverse restricted universe<br><br>    * 北京市清华大学 更新服务器（教育网，推荐校园网和网通用户使用。)：<br><br>deb http://mirror.net9.org/ubuntu/ dapper main multiverse restricted universe<br>deb http://mirror.net9.org/ubuntu/ dapper-backports main multiverse restricted universe<br>deb http://mirror.net9.org/ubuntu/ dapper-proposed main multiverse restricted universe<br>deb http://mirror.net9.org/ubuntu/ dapper-security main multiverse restricted universe<br>deb http://mirror.net9.org/ubuntu/ dapper-updates main multiverse restricted universe<br>deb http://mirror.net9.org/ubuntu-cn/ dapper main multiverse restricted universe<br><br>    * 中国 台湾省台湾大学 更新服务器（推荐网通用户使用，电信PING平均响应速度41MS。）<br><br>deb http://ubuntu.csie.ntu.edu.tw/ubuntu/ dapper main restricted universe multiverse<br>deb-src http://ubuntu.csie.ntu.edu.tw/ubuntu/ dapper main restricted universe multiverse<br>deb http://ubuntu.csie.ntu.edu.tw/ubuntu/ dapper-updates main restricted universe multiverse<br>deb-src http://ubuntu.csie.ntu.edu.tw/ubuntu/ dapper-updates main restricted universe multiverse<br>deb http://ubuntu.csie.ntu.edu.tw/ubuntu/ dapper-backports main restricted universe multiverse<br>deb-src http://ubuntu.csie.ntu.edu.tw/ubuntu/ dapper-backports main restricted universe multiverse<br>deb http://ubuntu.csie.ntu.edu.tw/ubuntu/ dapper-security main restricted universe multiverse<br>deb-src http://ubuntu.csie.ntu.edu.tw/ubuntu/ dapper-security main restricted universe multiverse<br>deb http://ftp.sjtu.edu.cn/ubuntu-cn/ dapper main multiverse restricted universe<br><br>    * Mirror.vmmatrix.net 更新服务器（上海市电信，推荐电信网通用户使用。）:<br><br>deb http://mirror.vmmatrix.net/ubuntu/ dapper main restricted universe multiverse<br>deb-src http://mirror.vmmatrix.net/ubuntu/ dapper main restricted universe multiverse<br>deb http://mirror.vmmatrix.net/ubuntu/ dapper-updates main restricted universe multiverse<br>deb-src http://mirror.vmmatrix.net/ubuntu/ dapper-updates main restricted universe multiverse<br>deb http://mirror.vmmatrix.net/ubuntu/ dapper-backports main restricted universe multiverse<br>deb-src http://mirror.vmmatrix.net/ubuntu/ dapper-backports main restricted universe multiverse<br>deb http://mirror.vmmatrix.net/ubuntu/ dapper-security main restricted universe multiverse<br>deb-src http://mirror.vmmatrix.net/ubuntu/ dapper-security main restricted universe multiverse<br>deb http://ftp.sjtu.edu.cn/ubuntu-cn/ dapper main multiverse restricted universe</div>
</pre>
</div>
<br><strong>2. 更新软件包信息：</strong><br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 34px">
<div style="TEXT-ALIGN: left">sudo apt-get update</div>
</pre>
</div>
<br><strong>3. 升级内核：</strong><br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 34px">
<div style="TEXT-ALIGN: left">sudo apt-get install linux-686</div>
</pre>
</div>
<br><strong>4. 删除老内核：</strong><br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 34px">
<div style="TEXT-ALIGN: left">sudo apt-get remove linux-image-386 linux-restricted-modules-2.6.15-23-386 linux-restricted-modules-386 linux-386 linux-image-2.6.15-23-386</div>
</pre>
</div>
<br><strong>5. 重启。</strong><br><br><strong>6. 开始ADSL联网：</strong><br>假如你在设置的时候就设成开机时启动ADSL，这步就可以省略。<br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 34px">
<div style="TEXT-ALIGN: left">pon dsl-provider</div>
</pre>
</div>
<br><strong>7. 升级系统：</strong><br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 34px">
<div style="TEXT-ALIGN: left">sudo apt-get dist-upgrade</div>
</pre>
</div>
<br>升级系统可能会花上一段时间，你可以利用这个时间进行一些小小的配置：<br>a. 设置一下SCIM，使它符合你的使用习惯；<br>b. 为Firefox安装插件。推荐如下插件：Google ToolBar, Google Browser Sync, Google NoteBook, Flashgot, Adblock, Fasterfox, Tab Mix Plus；如果无法下载Google Web Sync，请到<a href="http://ersaclarke.5upan.com/" target=_blank><u><font color=#0000ff>这里</font></u></a>下载（在Linux目录下的GoogleBS.xpi）。<br>c. 调整一下桌面，把计算机、主文件夹、回收站放到桌面上，把挂载的卷去掉：<br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 34px">
<div style="TEXT-ALIGN: left">gconf-editor</div>
</pre>
</div>
<br>到/apps/nautilus/desktop/分支下，去掉volumes_visible前面的复选框，勾上trash_icon_visible，home_icon_visible，computer_icon_visible前面的复选框。<br><br>升级完毕，注销，或者重启，或什么都不做，继续进行后面的步骤。<br><br><strong>8. 配置字体：</strong><br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 34px">
<div style="TEXT-ALIGN: left">sudo fontconfig-voodoo -f -s zh_CN</div>
</pre>
</div>
<br><strong>9. 安装文泉驿字体：</strong><br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 50px">
<div style="TEXT-ALIGN: left">sudo apt-get install xfonts-wqy<br>sudo gedit /etc/fonts/conf.d/50-xfonts-wqy.conf</div>
</pre>
</div>
<br>添加如下内容：<br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 130px">
<div style="TEXT-ALIGN: left">&lt;selectfont&gt;<br>  &lt;acceptfont&gt;<br>    &lt;pattern&gt;<br>      &lt;patelt name="family"&gt;&lt;string&gt;WenQuanYi Bitmap Song&lt;/string&gt;&lt;/patelt&gt;<br>    &lt;/pattern&gt;<br>  &lt;/acceptfont&gt;<br>&lt;/selectfont&gt;</div>
</pre>
</div>
<br>这步是给不喜欢黑体的人准备的。如果你喜欢Mac风格的黑体字，下面会介绍将你的系统字体配置成黑体的方法。Anyway，就算你喜欢黑体，建议你也装一下。<br><br><strong>10. 安装Java环境：</strong><br><br>建议安装JDK，反正也不比JRE多用很多空间。<br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 34px">
<div style="TEXT-ALIGN: left">sudo apt-get install sun-java5-jdk</div>
</pre>
</div>
<br>配置JRE：<br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 34px">
<div style="TEXT-ALIGN: left">sudo update-alternatives --config java</div>
</pre>
</div>
<br>选择：/usr/lib/jvm/java-1.5.0-sun/jre/bin/java作为你的JRE<br><br>配置Java中文字体：<br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 82px">
<div style="TEXT-ALIGN: left">wget http://paste.ubuntu.org.cn/d323<br>sudo mv /etc/java-1.5.0-sun/fontconfig.properties /etc/java-1.5.0-sun/fontconfig.properties.old<br>sudo mv d323 /etc/java-1.5.0-sun/fontconfig.properties<br>sudo chown root:root /etc/java-1.5.0-sun/fontconfig.properties</div>
</pre>
</div>
<br>安装浏览器Java插件：<br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 34px">
<div style="TEXT-ALIGN: left">sudo apt-get install sun-java5-plugin</div>
</pre>
</div>
<br><strong>11. 改进输入法：</strong><br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 50px">
<div style="TEXT-ALIGN: left">sudo apt-get install scim-bridge<br>sudo vi /etc/X11/xinit/xinput.d/zh_CN</div>
</pre>
</div>
<br>将 GTK_IM_MODULE=scim 修改为 GTK_IM_MODULE="scim-bridge"；<br>将 QT_IM_MODULE=scim 修改为 QT_IM_MODULE="xim"<br><br><strong>12. 安装LumaQQ：</strong><br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 146px">
<div style="TEXT-ALIGN: left">cd;mkdir tmp;cd tmp<br>wget -c http://download.ubuntu.org.cn/software/lumaqq_2005-linux_gtk2_x86_no_jre.tar.gz<br>sudo tar zxvf lumaqq_2005-linux_gtk2_x86_no_jre.tar.gz -C /opt/<br>wget -c http://download.ubuntu.org.cn/software/lumaqq_2005_patch_2006.02.02.15.00.zip<br>sudo unzip -o lumaqq_2005_patch_2006.02.02.15.00.zip -d /opt/LumaQQ/lib<br>sudo chown -R root:root /opt/LumaQQ/<br>sudo chmod -R 755 /opt/LumaQQ/<br>sudo vi /usr/share/applications/LumaQQ.desktop</div>
</pre>
</div>
<br>添加如下行：<br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 146px">
<div style="TEXT-ALIGN: left">[Desktop Entry]<br>Name=LumaQQ<br>Comment=QQ Client<br>Exec=/opt/LumaQQ/lumaqq<br>Icon=/opt/LumaQQ/QQ.png<br>Terminal=false<br>Type=Application<br>Categories=Application;Network;</div>
</pre>
</div>
<br>你可以在 应用程序 - Internet - LumaQQ 打开LumaQQ<br><br><strong>13. 安装播放器：</strong><br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 34px">
<div style="TEXT-ALIGN: left">sudo apt-get install beep-media-player totem-xine w32codecs libxine-extracodecs mplayer banshee</div>
</pre>
</div>
<br><strong>14. 安装StarDict：</strong><br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 34px">
<div style="TEXT-ALIGN: left">sudo apt-get install stardict stardict-common stardict-cdict-gb stardict-cedict-gb stardict-hanzim stardict-langdao-ce-gb stardict-langdao-ec-gb stardict-oxford-gb stardict-xdict-ce-gb stardict-xdict-ec-gb</div>
</pre>
</div>
<br><strong>15. 安装浏览器Flash插件：</strong><br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 34px">
<div style="TEXT-ALIGN: left">sudo apt-get install flashplugin-nonfree</div>
</pre>
</div>
<br><strong>16. 安装Downloader for X，BT和aMule</strong><br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 34px">
<div style="TEXT-ALIGN: left">sudo apt-get install d4x azureus amule</div>
</pre>
</div>
<br><strong>17. 配置alsa：</strong><br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 50px">
<div style="TEXT-ALIGN: left">sudo apt-get install alsa-oss<br>sudo vi /etc/asound.conf</div>
</pre>
</div>
<br>添加如下内容：<br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 434px">
<div style="TEXT-ALIGN: left">pcm.card0 {<br>  type hw<br>  card 0<br>}<br><br>pcm.!default {<br>  type plug<br>  slave.pcm "dmixer"<br>}<br><br>pcm.dmixer {<br>  type dmix<br>  ipc_key 1025<br>  slave {<br>    pcm "hw:0,0"<br>    period_time 0<br>    period_size 1024<br>    buffer_size 4096<br>    periods 128<br>    rate 44100<br>  }<br>  bindings {<br>    0 0<br>    1 1<br>  }<br>}</div>
</pre>
</div>
<br>修改ESD配置文件：<br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 34px">
<div style="TEXT-ALIGN: left">sudo vi /etc/esound/esd.conf</div>
</pre>
</div>
<br>改成如下：<br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 114px">
<div style="TEXT-ALIGN: left">[esd]<br>auto_spawn=1<br>spawn_options=-terminate -nobeeps -as 2 -d default<br>spawn_wait_ms=100<br># default options are used in spawned and non-spawned mode<br>default_options=</div>
</pre>
</div>
让Mozilla/Firefox也能出声：<br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 34px">
<div style="TEXT-ALIGN: left">sudo ln -s /usr/lib/libesd.so.0 /usr/lib/libesd.so.1</div>
</pre>
</div>
<br>如果LumaQQ独占声卡，可以编辑/usr/share/applications/LumaQQ.desktop，修改Exec＝/opt/LumaQQ/lumaqq 为 Exec＝aoss /opt/LumaQQ/lumaqq<br><br><strong>18. 配置字体（两种方法任选）：</strong><br><br>（方法一、黑体）<br><br>下载msttcorefonts.tar.gz和sthei.ttf.gz（到<a href="http://ersaclarke.5upan.com/" target=_blank><u><font color=#0000ff>这里</font></u></a>下载，在Linux目录下）<br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 162px">
<div style="TEXT-ALIGN: left">tar zxvf msttcorefonts.tar.gz<br>gunzip sthei.ttf.gz<br>sudo mkdir /usr/share/fonts/custom<br>sudo mv msttcorefonts/ /usr/share/fonts/custom<br>sudo mkdir /usr/share/fonts/custom/cn<br>sudo mv sthei.ttf /usr/share/fonts/custom/cn<br>sudo chown -R root:root /usr/share/fonts/custom/<br>sudo chmod -R 755 /usr/share/fonts/custom/<br>sudo fc-cache</div>
</pre>
</div>
<br>设置黑体为系统首选中文字体：<br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 34px">
<div style="TEXT-ALIGN: left">sudo vi /etc/fonts/language-selector.conf</div>
</pre>
</div>
<br>在&lt;family&gt;Bitstream Vera Sans&lt;/family&gt;行下面添加：<br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 34px">
<div style="TEXT-ALIGN: left">&lt;family&gt;STHeiti&lt;/family&gt;</div>
</pre>
</div>
<br>保存，退出。<br><br>系统 -首选项 - 字体：<br>设置所有非等宽字体为 Bitstream Vera Sans 10号，其中窗口标题字体设置为粗体。<br>等宽字体设置为Courier 10 Pitch，在AA时，Courier 10 Pitch比Courier New字体更清楚。<br>在&#8220;字体渲染&#8221;中，选择&#8220;细节&#8221;，&#8220;平滑&#8221;设置为&#8220;灰度&#8221;，&#8220;微调&#8221;设置为&#8220;无&#8221;。<br><br>打开firefox，设置firefox字体（编辑 -首选项 - 内容 - 字体和颜色部分，选择&#8220;高级&#8221;）：<br><br>语言编码：简体中文<br>比例字体：无衬线字体 大小：16<br>衬线字体：Bitstream Vera Serif<br>无衬线字体：Bitstream Vera Sans<br>等宽字体：Courier 10 Pitch 大小：13<br>屏幕解析度：96dpi 最小字体：9<br>（选中）允许页面选择显示字体而无需使用上面的配置<br>默认字符编码：UTF-8<br>额外的小设置：Gnome-terminal中，去掉&#8220;允许粗体字&#8221;；Gedit中设置字体为系统主题字体。<br><br>OK,注销后登录（或重启），你就会发现字体已经变成黑体了。<br><br>（方法二、点阵字体，文泉驿字体）<br><br>假如你不喜欢AA过黑体，而喜欢轮廓分明的点阵字体，你可以使用文泉驿字体。大致方法和上面一样：<br><br>系统 -首选项 - 字体：<br>设置所有非等宽字体为WenQuanYi Bitmap Song 10号，其中窗口标题字体设置为粗体。<br>等宽字体设置为Courier 10 Pitch，因为Courier 10 Pitch比Courier New字体更清楚。<br>为了避免英文字体变得毛躁，所以还是保持英文字体的AA是打开的，所以字体渲染部分设置保持默认。<br><br>Firefox中，可以这样设置：<br><br>语言编码：简体中文<br>比例字体：无衬线字体 大小：16<br>衬线字体：Times New Roman<br>无衬线字体：WenQuanYi Bitmap Song<br>等宽字体：Courier 10 Pitch 大小：13<br>屏幕解析度：96dpi 最小字体：9<br>（选中）允许页面选择显示字体而无需使用上面的配置<br>默认字符编码：UTF-8<br><br>OK,注销后登录（或重启），你就会发现字体已经变成文泉驿字体了。现在文泉驿字体的中英文都很好看。<br><br><strong>19. 配置显卡3D加速：</strong><br>（前两步其实不需要执行了，默认安装就有了。）<br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 98px">
<div style="TEXT-ALIGN: left">sudo apt-get update<br>sudo apt-get install linux-restricted-modules-$(uname -r)<br>sudo apt-get install xorg-driver-fglrx<br>sudo aticonfig --initial<br>sudo aticonfig --overlay-type=Xv</div>
</pre>
</div>
<br>下载libGL.so.1.2.tar.gz，（到<a href="http://ersaclarke.5upan.com/" target=_blank><u><font color=#0000ff>这里</font></u></a>下载,在Linux目录下。）<br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 50px">
<div style="TEXT-ALIGN: left">tar zxvf libGL.so.1.2.tar.gz<br>sudo mv libGL.so.1.2 /usr/lib/</div>
</pre>
</div>
<br><strong>20. OK，All Done. Reboot and Enjoy!</strong><br><br><strong>21. 一些琐碎：</strong><br>a. 测试有没有真正打开OpenGL：<br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 34px">
<div style="TEXT-ALIGN: left">sudo fgl_glxgears</div>
</pre>
</div>
<br>只要看到程序在运行，就说明OpenGL已经打开了<br><br>b. 在右键菜单中加入打开终端：<br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 34px">
<div style="TEXT-ALIGN: left">sudo apt-get install nautilus-open-terminal</div>
</pre>
</div>
<br>c. 系统服务管理软件：<br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 34px">
<div style="TEXT-ALIGN: left">sudo apt-get install bum</div>
</pre>
</div>
<br>d. 修改GrubSplash：<br>到<a href="http://www.gnome-look%e4%b8%8b%e8%bd%bd%e4%b8%80%e4%b8%aa%e5%96%9c%e6%ac%a2%e7%9a%84grub/" target=_blank><u><font color=#0000ff>http://www.gnome-look下载一个喜欢的grub</font></u></a> splash，重命名为splash.xpm.gz<br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 34px">
<div style="TEXT-ALIGN: left">mv splash.xpm.gz /boot/grub/</div>
</pre>
</div>
<br>修改你的/boot/grub/menu.lst，在操作系统选择部分前面添加一行：<br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 34px">
<div style="TEXT-ALIGN: left">splashimage=(hd0,x)/boot/grub/splash.xpm.gz</div>
</pre>
</div>
<br>e. 修改root用户密码：<br><br>
<div style="MARGIN: 5px 20px 20px 0px">
<div style="MARGIN-BOTTOM: 2px">代码:</div>
<pre style="BORDER-RIGHT: rgb(198,198,198) 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: rgb(198,198,198) 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(198,198,198) 1px solid; WIDTH: 640px; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(198,198,198) 1px solid; HEIGHT: 34px">
<div style="TEXT-ALIGN: left">sudo passwd root</div>
</pre>
</div>
zt from www.linuxsir.org<br>
<img src ="http://www.blogjava.net/jalion/aggbug/127332.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jalion/" target="_blank">李桢</a> 2007-07-01 10:31 <a href="http://www.blogjava.net/jalion/articles/127332.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式之结构模式—— 合成模式</title><link>http://www.blogjava.net/jalion/articles/127331.html</link><dc:creator>李桢</dc:creator><author>李桢</author><pubDate>Sun, 01 Jul 2007 02:21:00 GMT</pubDate><guid>http://www.blogjava.net/jalion/articles/127331.html</guid><wfw:comment>http://www.blogjava.net/jalion/comments/127331.html</wfw:comment><comments>http://www.blogjava.net/jalion/articles/127331.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jalion/comments/commentRss/127331.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jalion/services/trackbacks/127331.html</trackback:ping><description><![CDATA[<p>设计模式中的合成模式</p>
<p>合成模式即是来描述整体和部分关系的模式。使得客户端把一个个单独的成分对象和由他们复合成的对象同等对待。根据实现细节不同，分为两种方式：安全方式和透明方式。下面以一个几何图形的例子来了解下这2种方式.</p>
<p>一个简单的几何图形是有圆,直线,矩形组成.其中几何图形就是由一个或多个单独的直线,圆,矩形对象组成的符合对象.</p>
<p>所以本例一共有4个类,一个接口.Graphics 接口,line类,rectangle类,circle类,Picture类.根据两个UML注意区别安全方式和透明方式的实现细节.</p>
<p><font color=#0000ff size=4><strong>1)安全方式</strong></font></p>
<p><img style="DISPLAY: block; MARGIN: 0px auto 10px; TEXT-ALIGN: center" alt="" src="http://116.img.pp.sohu.com/images/blog/2007/5/9/11/17/11306c37d85.JPG" border=0></p>
<p>=====================================================================================</p>
<p><font color=#ff0000>接口 Graphics</font></p>
<p>public interface Graphics {<br>&nbsp;public void draw();<br>}</p>
<p><font color=#ff0000>类Line</font></p>
<p>public class Line&nbsp; implements Graphics&nbsp; {<br>&nbsp;public void draw()<br>&nbsp;{<br>&nbsp;&nbsp;System.out.println("画一条直线");<br>&nbsp;}</p>
<p>}<br></p>
<p><font color=#ff0000>类Circle</font></p>
<p>public class Circle implements Graphics {</p>
<p>&nbsp;public void draw() {<br>&nbsp;&nbsp;System.out.println("画一个圆");<br>&nbsp;}<br>&nbsp;<br>}</p>
<p><font color=#ff0000>类Rectangle</font></p>
<p>public class Rectangle implements Graphics{<br>&nbsp;public void draw()<br>&nbsp;{<br>&nbsp;&nbsp;System.out.println("画一个矩形");<br>&nbsp;}<br>}<br></p>
<p><font color=#ff0000>类Picture</font></p>
<p>import java.util.*;</p>
<p>public class Picture implements Graphics {<br>&nbsp;private List list=new ArrayList();<br>&nbsp;<br>&nbsp;public void draw()<br>&nbsp;{<br>&nbsp;&nbsp;for(int i=0;i&lt;list.size();i++)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;Graphics g=(Graphics)list.get(i);<br>&nbsp;&nbsp;&nbsp;g.draw();<br>&nbsp;&nbsp;}<br>&nbsp;}<br>&nbsp;public void add(Graphics g)<br>&nbsp;{<br>&nbsp;&nbsp;list.add(g);<br>&nbsp;}<br>&nbsp;public void remove(Graphics g)<br>&nbsp;{<br>&nbsp;&nbsp;list.remove(g);<br>&nbsp;}<br>&nbsp;public Graphics getGraphics(int i)<br>&nbsp;{<br>&nbsp;&nbsp;return (Graphics)list.get(i);<br>&nbsp;}<br>&nbsp;<br>}<br></p>
<p>=========================================================================================</p>
<p><font color=#0000ff size=4><strong>2)透明方式<img style="DISPLAY: block; MARGIN: 0px auto 10px; TEXT-ALIGN: center" alt="" src="http://116.img.pp.sohu.com/images/blog/2007/5/9/11/0/11306cf760e.JPG" border=0></strong></font></p>
<p>=====================================================================================</p>
<p><font color=#ff0000>接口 Graphics</font></p>
<p>&nbsp;public interface Graphics {<br>&nbsp;public void draw();<br>&nbsp;public void add(Graphics g);<br>&nbsp;public void remove(Graphics g);<br>&nbsp;public Graphics getGraphics(int i);<br>}</p>
<p><font color=#ff0000>类Line</font></p>
<p>&nbsp;</p>
<p>public class Line implements Graphics{</p>
<p>&nbsp;public void add(Graphics g) {&nbsp;<br>&nbsp;}</p>
<p>&nbsp;public void draw() {<br>&nbsp;&nbsp;System.out.println("画一条直线");<br>&nbsp;&nbsp;<br>&nbsp;}</p>
<p>&nbsp;public Graphics getGraphics(int i) {<br>&nbsp;&nbsp;return null;<br>&nbsp;}</p>
<p>&nbsp;public void remove(Graphics g) {<br>&nbsp;}</p>
<p>}<br></p>
<p><font color=#ff0000>类Circle</font></p>
<p>&nbsp;</p>
<p>public class Circle implements Graphics{</p>
<p>&nbsp;public void add(Graphics g) {<br>&nbsp;}</p>
<p>&nbsp;public void draw() {<br>&nbsp;&nbsp;System.out.println("画一个圆");<br>&nbsp;&nbsp;<br>&nbsp;}</p>
<p>&nbsp;public Graphics getGraphics(int i) {<br>&nbsp;&nbsp;return null;<br>&nbsp;}</p>
<p>&nbsp;public void remove(Graphics g) {<br>&nbsp;}</p>
<p>}</p>
<p><font color=#ff0000>类Rectangle</font></p>
<p>&nbsp;</p>
<p>public class Rectangle implements Graphics {</p>
<p>&nbsp;public void add(Graphics g) {<br>&nbsp;}</p>
<p>&nbsp;public void draw() {<br>&nbsp;&nbsp;System.out.println("画一个矩形");<br>&nbsp;&nbsp;<br>&nbsp;}</p>
<p>&nbsp;public Graphics getGraphics(int i) {<br>&nbsp;&nbsp;return null;<br>&nbsp;}</p>
<p>&nbsp;public void remove(Graphics g) {<br>&nbsp;&nbsp;<br>&nbsp;}</p>
<p>}<br></p>
<p><font color=#ff0000>类Picture</font></p>
<p>&nbsp;public class Picture implements Graphics {<br>&nbsp;private List list=new ArrayList();<br>&nbsp;<br>&nbsp;public void draw()<br>&nbsp;{<br>&nbsp;&nbsp;for(int i=0;i&lt;list.size();i++)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;Graphics g=(Graphics)list.get(i);<br>&nbsp;&nbsp;&nbsp;g.draw();<br>&nbsp;&nbsp;}<br>&nbsp;}<br>&nbsp;public void add(Graphics g)<br>&nbsp;{<br>&nbsp;&nbsp;list.add(g);<br>&nbsp;}<br>&nbsp;public void remove(Graphics g)<br>&nbsp;{<br>&nbsp;&nbsp;list.remove(g);<br>&nbsp;}<br>&nbsp;public Graphics getGraphics(int i)<br>&nbsp;{<br>&nbsp;&nbsp;return (Graphics)list.get(i);<br>&nbsp;}<br>&nbsp;<br>}</p>
<p>=========================================================================================</p>
<p><font color=#9966ff>在安全方式和透明方式中,不同之处是实现对子类的管理方法:add(),remove(),getGraphics()的位置不同,是在Graphics接口中实现,还是在复合类Picture中实现.</font></p>
<p><font color=#9966ff>在安全方式中,管理方法在复合类Picture中实现,如果客户端在对Line()等单独的成分对象发送add()等消息时,无法编译通过.</font></p>
<p><font color=#9966ff>在透明方式中,将管理方法在接口中定义,所有单独成分对象(如:Line()等)由于实现了Graphics接口,必须实现add()等管理方法,即使是方法中不需要任何操作,当客户端在对单独成分对象发送add()等消息时,编译通过,但在程序运行时,则可能会抛出异常.这样做的好处是都有相同的接口,客户端可以同等的对待对象.</font></p>
<p><strong><font color=#0000ff>适合使用合成模式的条件:</font></strong></p>
<p><strong><font color=#0000ff>1)需要描述对象的部分和整体的等级结构</font></strong></p>
<p><strong><font color=#0000ff>2)客户端需要忽略掉整体构件和个体构件的区别</font></strong></p>
<p><strong><font color=#ff00ff>合成模式的优点:</font></strong></p>
<p><strong><font color=#ff00ff>1.可以很容易的增加新种类的构件</font></strong></p>
<p><strong><font color=#ff00ff>2.使用合成模式可以使客户端变得很容易设计,因为客户端不需要知道构件是个体构件还是整体构件</font></strong></p>
<p><strong><font color=#ff00ff>缺点:</font></strong></p>
<p><strong><font color=#ff00ff>1.控制整体构件的类型比较困难</font></strong></p>
<p><strong><font color=#ff00ff>2.用继承方法增加新的行为很困难.</font></strong></p>
<img src ="http://www.blogjava.net/jalion/aggbug/127331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jalion/" target="_blank">李桢</a> 2007-07-01 10:21 <a href="http://www.blogjava.net/jalion/articles/127331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式结构模式之——适配器模式(adapter)</title><link>http://www.blogjava.net/jalion/articles/127330.html</link><dc:creator>李桢</dc:creator><author>李桢</author><pubDate>Sun, 01 Jul 2007 02:21:00 GMT</pubDate><guid>http://www.blogjava.net/jalion/articles/127330.html</guid><wfw:comment>http://www.blogjava.net/jalion/comments/127330.html</wfw:comment><comments>http://www.blogjava.net/jalion/articles/127330.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jalion/comments/commentRss/127330.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jalion/services/trackbacks/127330.html</trackback:ping><description><![CDATA[<p>类的适配器模式是把适配的类的API转换为目标类的API.在以下各种情况需要使用适配器模式:</p>
<p>1)系统需要使用现有的类,而此类的接口不符合系统的需要.</p>
<p>2)想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作.这些原类不一定有很复杂的接口.</p>
<p>3)(对对象的适配器模式)在设计里,需要改变多个已有的子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器类,而这不太实际.</p>
<p>下面通过一个实际的问题来理解适配器模式.</p>
<p>问题:请做一个Kittie具体类,并实现miao(),catchRat(),run(),sleep()方法,再做一个Puppie的接口,要求有wao(),fetchBall(),run(),sleep()方法.</p>
<p>假设现在客户需要一只Puppie,可是只找到一只Kittie,所以需要适配器Jalion把Kittie适配成Puppie.</p>
<p>代码如下:</p>
<p>===============================================================================</p>
<p>类Kittie</p>
<p>public class Kittie {<br>&nbsp;public void miao()<br>&nbsp;{<br>&nbsp;&nbsp;<br>&nbsp;}<br>&nbsp;public void run()<br>&nbsp;{<br>&nbsp;&nbsp;<br>&nbsp;}<br>&nbsp;public void sleep()<br>&nbsp;{<br>&nbsp;&nbsp;<br>&nbsp;}<br>}<br></p>
<p>接口Puppie</p>
<p>public interface Puppie {<br>&nbsp;public void wao();<br>&nbsp;public void fetchBall();<br>&nbsp;public void run();<br>&nbsp;public void sleep();<br>}<br></p>
<p>适配器Jalion</p>
<p><br>public class Jalion extends Kittie implements Puppie {</p>
<p>&nbsp;public void fetchBall() {<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;<br>&nbsp;}</p>
<p>&nbsp;public void wao() {<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;<br>&nbsp;}<br>&nbsp;public void run()<br>&nbsp;{<br>&nbsp;&nbsp;super.run();<br>&nbsp;}<br>&nbsp;public void sleep()<br>&nbsp;{<br>&nbsp;&nbsp;super.sleep();<br>&nbsp;}</p>
<p>}<br></p>
<p>================================================================================</p>
<p>在本例中,系统需要的是一个Puppie类,但现在只找到一个Kittie类,通过一个适配器,把功能和Puppie相近的类转换成了符合要求的Puppie类.</p>
<p><img style="DISPLAY: block; MARGIN: 0px auto 10px; TEXT-ALIGN: center" alt="" src="http://117.img.pp.sohu.com/images/blog/2007/5/8/16/13/11302c137f7.jpg" border=0></p>
<p>&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;</p>
<p>适配器模式之缺省适配器模式<br>当一个接口定义了n个方法</p>
<p>public interface interfaceA {<br>&nbsp;public void method1();<br>&nbsp;public void method2();<br>&nbsp;public void method3();<br>&nbsp;public void method4();<br>&nbsp;public void method5();<br>&nbsp;public void method6();<br>&nbsp;public void method7();<br>}</p>
<p>当一个类需要实现这个接口时,必须实现所有的方法,即使是你不需要的恶方法也得默认空实现.造成了浪费和麻烦.</p>
<p>使用适配器模式可以解决此问题</p>
<p>定义一个抽象类,实现接口interfaceA</p>
<p>public&nbsp; abstract class AbstractA implements interfaceA {</p>
<p>&nbsp;public void method1() {}<br>&nbsp;public void method2() {}<br>&nbsp;public void method3() {}<br>&nbsp;public void method4() {}<br>&nbsp;public void method5() {}<br>&nbsp;public void method6() {}<br>&nbsp;public void method7() {}<br>}</p>
<p>然后让实体类继承抽象类</p>
<p>public class ClassA extends AbstractA {<br>&nbsp;public void method1()<br>&nbsp;{<br>&nbsp;&nbsp;<br>&nbsp;}<br>&nbsp;public void method7()<br>&nbsp;{<br>&nbsp;&nbsp;<br>&nbsp;}<br>}<br>这样就可以在类中添加感兴趣的方法了.在awt事件监听器中,许多都是用了缺省适配器模式.</p>
<p><img style="DISPLAY: block; MARGIN: 0px auto 10px; TEXT-ALIGN: center" alt="" src="http://115.img.pp.sohu.com/images/blog/2007/5/8/17/28/11302e7c6dc.jpg" border=0></p>
<img src ="http://www.blogjava.net/jalion/aggbug/127330.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jalion/" target="_blank">李桢</a> 2007-07-01 10:21 <a href="http://www.blogjava.net/jalion/articles/127330.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java  设计模式——工厂模式之单例模式</title><link>http://www.blogjava.net/jalion/articles/127329.html</link><dc:creator>李桢</dc:creator><author>李桢</author><pubDate>Sun, 01 Jul 2007 02:20:00 GMT</pubDate><guid>http://www.blogjava.net/jalion/articles/127329.html</guid><wfw:comment>http://www.blogjava.net/jalion/comments/127329.html</wfw:comment><comments>http://www.blogjava.net/jalion/articles/127329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jalion/comments/commentRss/127329.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jalion/services/trackbacks/127329.html</trackback:ping><description><![CDATA[<p>单例模式 因该是最简单的一个设计模式，只要满足：1）某个类只能有一个实例，2）这个实例是由本身创建，3）类本身向整个系统提供实例</p>
<p>单例模式的写法：</p>
<p>第一种</p>
<p><strong><font color=#ff0000>public class EagerSingle {<br>&nbsp;private static final EagerSingle s=new EagerSingle();<br>&nbsp;private EagerSingle()<br>&nbsp;{<br>&nbsp;}<br>&nbsp;public static EagerSingle getInstance()<br>&nbsp;{<br>&nbsp;&nbsp;return s;<br>&nbsp;}</font></strong></p>
<p><strong><font color=#ff0000>}</font></strong></p>
<p>第二种：<br><strong><font color=#ff0000>public class LazySingle {<br>private static LazySingle ls=null;<br>&nbsp;private LazySingle()<br>&nbsp;{<br>&nbsp;&nbsp;}<br>synchronized static LazySingle getIntance()<br>{<br>&nbsp;if(ls==null)<br>&nbsp;{<br>&nbsp;&nbsp;ls=new LazySingle();<br>&nbsp;}<br>&nbsp;return ls;<br>}<br>}</font></strong></p>
<p><strong><font color=#000000>两种写法的比较：</font></strong></p>
<p><strong>第一种在加载时就将自己实例化，资源利用率低，效率和反应速度高。</strong></p>
<p><strong>第二种在首次用到类的时候实例化，效率和反映率相对低，但有效的利用资源。</strong></p>
<p>单例模式的扩展：</p>
<p>&nbsp;不完全单例模式：构造子为public </p>
<p>&nbsp;多例模式</p>
<img src ="http://www.blogjava.net/jalion/aggbug/127329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jalion/" target="_blank">李桢</a> 2007-07-01 10:20 <a href="http://www.blogjava.net/jalion/articles/127329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java  设计模式——工厂模式之 抽象工厂模式</title><link>http://www.blogjava.net/jalion/articles/127328.html</link><dc:creator>李桢</dc:creator><author>李桢</author><pubDate>Sun, 01 Jul 2007 02:19:00 GMT</pubDate><guid>http://www.blogjava.net/jalion/articles/127328.html</guid><wfw:comment>http://www.blogjava.net/jalion/comments/127328.html</wfw:comment><comments>http://www.blogjava.net/jalion/articles/127328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jalion/comments/commentRss/127328.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jalion/services/trackbacks/127328.html</trackback:ping><description><![CDATA[<p>抽象工厂模式面对的问题是多个产品等级结构的设计。抽象工厂模式可以向客户端提供一个接口，使得客户端在不必指定产品具体类型的情况下，创建多个产品族中的产品对象。先看一下UML：</p>
<p><img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 601px; HEIGHT: 262px; TEXT-ALIGN: center" height=262 alt="" src="http://img45.pp.sohu.com/images/blog/2007/4/26/16/1/112c491c0a6.jpg" width=572 border=0></p>
<p>在上图中，假设农场现在可以生产水果和蔬菜，从地域上划分，又分为南方和北方。所以产品等级图分为：南方水果，南方蔬菜，北方水果，北方蔬菜；抽象工厂模式与工厂方法模式最大的区别在于：工厂方法模式针对的是一个产品等级结构，而抽象工厂模式则需要面对多个产品等级结构。</p>
<p>&nbsp; 有多少个产品等级结构，就会在工厂角色中发现多少个工厂方法。 每个产品等级结构中有多少具体产品，就有多少个产品族，也就会在工厂等级结构中发现多少个具体工厂；例如在上图中，产品等级结构：蔬菜（vegetable）和水果(Fruit），相应的工厂角色中就有public Fruit createFruit()和public Vegetable CreateVegetable()方法。有2个产品族：North和South，对应两个具体工厂，NorthFactory和SouthFactory;<br>关于抽象模式和开闭原则：</p>
<p>当增加产品等级结构时，即当我们增加一个新产品：花卉时，需要修改工厂角色的工厂方法，这显然是不支持开闭原则的；</p>
<p>当增加产品族时，即添加了新的产品角色，这时，只需添加新的工厂角色就可以了，符合开闭原则；</p>
<p>工厂模式的变通：工厂的工厂</p>
<p>可以把简单工厂模式应用到抽象工厂中，抽象工厂类可以配备静态方法，根据需要返回相应的工厂角色。返回值应该是抽象工厂类型，这样才能保证多态性。下面是一个按照此方法改进的 抽象工厂模式UML</p>
<p><img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 100%; HEIGHT: 100%; TEXT-ALIGN: center" height=30 alt="" src="http://img114.pp.sohu.com/images/blog/2007/4/25/17/3/112bfb4b788.jpg" width=117 border=0></p>
<img src ="http://www.blogjava.net/jalion/aggbug/127328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jalion/" target="_blank">李桢</a> 2007-07-01 10:19 <a href="http://www.blogjava.net/jalion/articles/127328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式之创建模式——工厂方法模式</title><link>http://www.blogjava.net/jalion/articles/127327.html</link><dc:creator>李桢</dc:creator><author>李桢</author><pubDate>Sun, 01 Jul 2007 02:17:00 GMT</pubDate><guid>http://www.blogjava.net/jalion/articles/127327.html</guid><wfw:comment>http://www.blogjava.net/jalion/comments/127327.html</wfw:comment><comments>http://www.blogjava.net/jalion/articles/127327.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jalion/comments/commentRss/127327.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jalion/services/trackbacks/127327.html</trackback:ping><description><![CDATA[<p>在<a href="http://jalion.blog.sohu.com/43202803.html" target=_blank><u><font color=#0000ff>上一篇</font></u></a>中学习了简单工厂模式，在简单工厂模式（Simple Factory Pattern）中，只是有限的支持了开-闭原则（一个系统的设计要求允许系统在无修改的情况下，扩展其功能）。当我们需要增加一种产品时，我们就不得不做一件很头疼的事：修改FruitsGrower类(creator)，以使他能生产出新增的产品。而接下来的工厂方法模式则是体现了java的多态性，完全符合了开闭原则。工厂方法模式的实现依赖于工厂角色和产品角色的多态性。当在某些特殊情况下，这个模式可以退化，例如退化成简单工厂模式，特征就是多态性的丧失。</p>
<p>继续水果为例：首先UML图如下：</p>
<p><img style="DISPLAY: block; MARGIN: 0px auto 10px; TEXT-ALIGN: center" height=145 alt="" src="http://img114.pp.sohu.com/images/blog/2007/4/25/12/17/112be937c48.jpg" width=500 border=0></p>
<p>源代码：</p>
<p>接口：FruitFactory</p>
<p><strong><font color=#ff0000>public interface FruitFactory {<br>&nbsp;public Fruits factory();<br>}</font><br></strong></p>
<p>接口：Fruits</p>
<p><font color=#ff0000><strong>public interface Fruits {<br>&nbsp;public void grow();<br>&nbsp;public void plant();<br>&nbsp;public void harvest();<br>&nbsp;<br>}<br></strong></font></p>
<p>类：AppleFactory</p>
<p><font color=#ff0000><strong>public class AppleFactory implements FruitFactory {</strong></font></p>
<p><font color=#ff0000><strong>&nbsp;public Fruits factory() {<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;return new Apple();<br>&nbsp;}</strong></font></p>
<p><font color=#ff0000><strong>}</strong></font><br></p>
<p>类：GrapeFactory</p>
<p><font color=#ff0000><strong>public class GrapeFactory implements FruitFactory {</strong></font></p>
<p><font color=#ff0000><strong>&nbsp;public Fruits factory() {<br>&nbsp;&nbsp;// TODO 自动生成方法存根<br>&nbsp;&nbsp;return new Grape();<br>&nbsp;}</strong></font></p>
<p><font color=#ff0000><strong>}</strong></font><br></p>
<p>类：Apple</p>
<p><font color=#ff0000><strong>public class Apple implements Fruits {</strong></font></p>
<p><font color=#ff0000><strong>&nbsp;/*<br>&nbsp; * 苹果的特有属性。苹果数的树龄<br>&nbsp; */<br>&nbsp;private int treeage;<br>&nbsp;public int getTreeage() {<br>&nbsp;&nbsp;return treeage;<br>&nbsp;}</strong></font></p>
<p><font color=#ff0000><strong>&nbsp;public void setTreeage(int treeage) {<br>&nbsp;&nbsp;this.treeage = treeage;<br>&nbsp;}</strong></font></p>
<p><font color=#ff0000><strong>&nbsp;public void grow() {<br>&nbsp;&nbsp;System.out.println("苹果的生长方法");</strong></font></p>
<p><font color=#ff0000><strong>&nbsp;}</strong></font></p>
<p><font color=#ff0000><strong>&nbsp;public void harvest() {<br>&nbsp;&nbsp;System.out.println("苹果的收获方法");</strong></font></p>
<p><font color=#ff0000><strong>&nbsp;}</strong></font></p>
<p><font color=#ff0000><strong>&nbsp;public void plant() {<br>&nbsp;&nbsp;System.out.println("苹果的种植方法");</strong></font></p>
<p><font color=#ff0000><strong>&nbsp;}</strong></font></p>
<p><br><font color=#ff0000><strong>}<br></strong></font></p>
<p><font color=#000000>类：Grape</font></p>
<p><font color=#ff0000><strong>public class Grape implements Fruits {</strong></font></p>
<p><font color=#ff0000><strong>&nbsp;public boolean seedless;<br>&nbsp;public void grow() {<br>&nbsp;&nbsp;System.out.println("葡萄的生长");</strong></font></p>
<p><font color=#ff0000><strong>&nbsp;}</strong></font></p>
<p><font color=#ff0000><strong>&nbsp;public void harvest() {<br>&nbsp;&nbsp;System.out.println("葡萄的收获");</strong></font></p>
<p><font color=#ff0000><strong>&nbsp;}</strong></font></p>
<p><font color=#ff0000><strong>&nbsp;public void plant() {<br>&nbsp;&nbsp;System.out.println("葡萄的种植");</strong></font></p>
<p><font color=#ff0000><strong>&nbsp;}</strong></font></p>
<p><font color=#ff0000><strong>&nbsp;public boolean isSeedless() {<br>&nbsp;&nbsp;return seedless;<br>&nbsp;}</strong></font></p>
<p><font color=#ff0000><strong>&nbsp;public void setSeedless(boolean seedless) {<br>&nbsp;&nbsp;this.seedless = seedless;<br>&nbsp;}</strong></font></p>
<p><font color=#ff0000><strong>}</strong></font></p>
<p>测试方法：Test.java</p>
<p><font color=#9900ff>public static void main(String args[])<br>&nbsp;{<br>&nbsp;&nbsp;FruitFactory create; //声明工厂<br>&nbsp;&nbsp;Fruits product; //声明产品<br>&nbsp;&nbsp;create=new AppleFactory();<br>&nbsp;&nbsp;&nbsp;product=create.factory();<br>&nbsp;&nbsp;&nbsp;&nbsp;product.grow(); //调用产品的方法<br>&nbsp;}&nbsp;</font></p>
<p><font color=#9900ff>&nbsp;工厂方法返回的应该是抽象类型，而不是具体类型，只有这样，才能保证多态性。当需要一个新产品时，只要创建一个产品类，一个工厂类，并实现相应的接口就OK。</font></p>
<p><strong><font color=#000000>工厂方法模式在jDK API中的 应用：</font></strong></p>
<p><font color=#9900ff></font>&nbsp;工厂方法模式在JDK中的应用到处可见，例如：Collection </p>
<p><img style="DISPLAY: block; MARGIN: 0px auto 10px; TEXT-ALIGN: center" alt="" src="http://img114.pp.sohu.com/images/blog/2007/4/25/13/23/112beeb9fc7.gif" border=0></p>
所有的实现Collection的类必须实现iteratror()方法，返回一个具体的Iterator类 
<img src ="http://www.blogjava.net/jalion/aggbug/127327.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jalion/" target="_blank">李桢</a> 2007-07-01 10:17 <a href="http://www.blogjava.net/jalion/articles/127327.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>