<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>二十年</title>
	
	<link>http://20year.cn/blog</link>
	<description>技术·思想·生活 用三个月学原创的技术体会</description>
	<pubDate>Fri, 18 Sep 2009 05:57:41 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/20year" type="application/rss+xml" /><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2F20year" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2F20year" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2F20year" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsalloy.com/?rss=http%3A%2F%2Ffeeds.feedburner.com%2F20year" src="http://www.newsalloy.com/subrss3.gif">Subscribe with NewsAlloy</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2F20year" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2F20year" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://www.yourminis.com/subscribe.aspx?u=http%3A%2F%2Ffeeds.feedburner.com%2F20year" src="http://www.yourminis.com/images/addtoyourminisbadge.gif">Subscribe with Yourminis.com</feedburner:feedFlare><feedburner:feedFlare href="http://download.attensa.com/app/get_attensa.html?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2F20year" src="http://www.attensa.com/blogs/attensa/WindowsLiveWriter/BadgeredintoBadges_10C02/attensa_feed_button5.gif">Subscribe with Attensa for Outlook</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2F20year" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://hub.netomat.net/account/account.autoSubscribe.jspa?urls=http%3A%2F%2Ffeeds.feedburner.com%2F20year" src="http://www.netomat.net/blogger/images/icon_netomat_feedbutton.gif">Subscribe with netomat Hub</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2F20year" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.flurry.com/pushRssFeed.do?r=fb&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2F20year" src="http://www.flurry.com/images/flurry_rss_logo2.gif">Subscribe with Flurry</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2F20year" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2F20year" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>音乐，我还是一个比较容易感动的人</title>
		<link>http://feedproxy.google.com/~r/20year/~3/1ve7mpo_5TI/</link>
		<comments>http://20year.cn/blog/2009/09/18/%e9%9f%b3%e4%b9%90%ef%bc%8c%e6%88%91%e8%bf%98%e6%98%af%e4%b8%80%e4%b8%aa%e6%af%94%e8%be%83%e5%ae%b9%e6%98%93%e6%84%9f%e5%8a%a8%e7%9a%84%e4%ba%ba/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 05:55:29 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
		
		<category><![CDATA[未分类]]></category>

		<category><![CDATA[音乐]]></category>

		<guid isPermaLink="false">http://20year.cn/blog/2009/09/18/%e9%9f%b3%e4%b9%90%ef%bc%8c%e6%88%91%e8%bf%98%e6%98%af%e4%b8%80%e4%b8%aa%e6%af%94%e8%be%83%e5%ae%b9%e6%98%93%e6%84%9f%e5%8a%a8%e7%9a%84%e4%ba%ba/</guid>
		<description><![CDATA[羽果   羽果2009 LIVE IN SHANGHAI 春晓
ps:  给自己编程的学习慢了下来！加油
]]></description>
			<content:encoded><![CDATA[<p>羽果   羽果2009 LIVE IN SHANGHAI 春晓</p>
<p>ps:  给自己编程的学习慢了下来！加油</p>
]]></content:encoded>
			<wfw:commentRss>http://20year.cn/blog/2009/09/18/%e9%9f%b3%e4%b9%90%ef%bc%8c%e6%88%91%e8%bf%98%e6%98%af%e4%b8%80%e4%b8%aa%e6%af%94%e8%be%83%e5%ae%b9%e6%98%93%e6%84%9f%e5%8a%a8%e7%9a%84%e4%ba%ba/feed/</wfw:commentRss>
		<feedburner:origLink>http://20year.cn/blog/2009/09/18/%e9%9f%b3%e4%b9%90%ef%bc%8c%e6%88%91%e8%bf%98%e6%98%af%e4%b8%80%e4%b8%aa%e6%af%94%e8%be%83%e5%ae%b9%e6%98%93%e6%84%9f%e5%8a%a8%e7%9a%84%e4%ba%ba/</feedburner:origLink></item>
		<item>
		<title>问题和解决方案：firefox 3.0.1的event实现bug</title>
		<link>http://feedproxy.google.com/~r/20year/~3/P9jyXBgRXZg/</link>
		<comments>http://20year.cn/blog/2009/08/30/757/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 17:32:13 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
		
		<category><![CDATA[技术]]></category>

		<category><![CDATA[摘录]]></category>

		<category><![CDATA[文档]]></category>

		<guid isPermaLink="false">http://20year.cn/blog/2009/08/30/757/</guid>
		<description><![CDATA[问题和解决方案：firefox 3.0.1的event实现bug
问题：
firefox 3.0.1的event实现bug
朋友说，给前几日的那个联动下拉做个灰色不可选，没想到实现的时候发现了firefox3的event实现bug。代码如下：
&#60;select name=&#8221;test1&#8243; id=&#8221;test1&#8243; disabled onchange=&#8221;alert(this.name);&#8221;&#62;
&#60;option value=&#8221;" selected&#62;选拔1&#60;/option&#62;
&#60;option value=&#8221;1&#8243;&#62;1&#60;/option&#62;
&#60;option value=&#8221;2&#8243;&#62;2&#60;/option&#62;
&#60;/select&#62;
&#60;input
type=&#8221;button&#8221; value=&#8221;undisabled&#38;dispatchEvent&#8221;
onclick=&#8221;document.getElementById(&#8217;test1&#8242;).disabled=false;document.getElementById(&#8217;test1&#8242;).options[1].selected
= true;var evt =
document.createEvent(&#8217;HTMLEvents&#8217;);evt.initEvent(&#8217;change&#8217;,true,true);document.getElementById(&#8217;test1&#8242;).dispatchEvent(evt);&#8221;/&#62;
注
意，这段代码ie下无效，请在非ie内核看。opera chrome safari按一次就可以alert，而firefox需要按2次
我猜firefox偷懒，没有立即对elementes重新加载或者判断
所以虽然确实效果是ubdisabled了，但是ff还认为是disabled，所以没有events，自然dispatchEvent就没了效果。我贴
到了dhtml群，王好奇同学给了解决办法，加settimeout。确实，加了这个‘延时’后，也只需要按一次就可以alert了。不过我的因为是n个
select联动，所以settimeout这种0秒‘延时’，导致触发不了后面的select 失效ing&#8230;
解决方案：
问题：
firefox测试如下附代码，中途  res = b.dispatchEvent(&#8221;click&#8221;)出现致命错误，js中止执行？
解决方案：
附代码：
&#60;!DOCTYPE HTML PUBLIC &#8220;-//W3C//DTD HTML 4.0 Transitional//EN&#8221;&#62;
&#60;HTML&#62;
&#60;HEAD&#62;
&#60;TITLE&#62; New Document &#60;/TITLE&#62;
&#60;META NAME=&#8221;Generator&#8221; CONTENT=&#8221;EditPlus&#8221;&#62;
&#60;META NAME=&#8221;Author&#8221; CONTENT=&#8221;"&#62;
&#60;META NAME=&#8221;Keywords&#8221; CONTENT=&#8221;"&#62;
&#60;META NAME=&#8221;Description&#8221; CONTENT=&#8221;"&#62;
&#60;script type=&#8221;text/javascript&#8221; src=&#8221;detect.js&#8221;&#62;
&#60;/script&#62;
&#60;script type=&#8221;text/javascript&#8221; src=&#8221;eventutil.js&#8221;&#62;
&#60;/script&#62;
&#60;script type=&#8221;text/javascript&#8221;&#62;
function funA(e){
alert(&#8221;button1 be clicked&#8221;);
alert(e.clientX);
}
function onLoad(){
var b = document.getElementById(&#8221;button1&#8243;);
b.addEventListener(&#8217;click&#8217;,funA,false);
//alert(EventUtil);
//EventUtil.addEventHandler(b,&#8217;click&#8217;,funA);
res = b.dispatchEvent(&#8221;click&#8221;);
alert(res);
if ( res ) [...]]]></description>
			<content:encoded><![CDATA[<p>问题和解决方案：firefox 3.0.1的event实现bug</p>
<p>问题：</p>
<h4>firefox 3.0.1的event实现bug</h4>
<p>朋友说，给前几日的那个联动下拉做个灰色不可选，没想到实现的时候发现了firefox3的event实现bug。代码如下：</p>
<p>&lt;select name=&#8221;test1&#8243; id=&#8221;test1&#8243; disabled onchange=&#8221;alert(this.name);&#8221;&gt;<br />
&lt;option value=&#8221;" selected&gt;选拔1&lt;/option&gt;<br />
&lt;option value=&#8221;1&#8243;&gt;1&lt;/option&gt;<br />
&lt;option value=&#8221;2&#8243;&gt;2&lt;/option&gt;<br />
&lt;/select&gt;<br />
&lt;input<br />
type=&#8221;button&#8221; value=&#8221;undisabled&amp;dispatchEvent&#8221;<br />
onclick=&#8221;document.getElementById(&#8217;test1&#8242;).disabled=false;document.getElementById(&#8217;test1&#8242;).options[1].selected<br />
= true;var evt =<br />
document.createEvent(&#8217;HTMLEvents&#8217;);evt.initEvent(&#8217;change&#8217;,true,true);document.getElementById(&#8217;test1&#8242;).dispatchEvent(evt);&#8221;/&gt;</p>
<p>注<br />
意，这段代码ie下无效，请在非ie内核看。opera chrome safari按一次就可以alert，而firefox需要按2次<br />
我猜firefox偷懒，没有立即对elementes重新加载或者判断<br />
所以虽然确实效果是ubdisabled了，但是ff还认为是disabled，所以没有events，自然dispatchEvent就没了效果。我贴<br />
到了dhtml群，王好奇同学给了解决办法，加settimeout。确实，加了这个‘延时’后，也只需要按一次就可以alert了。不过我的因为是n个<br />
select联动，所以settimeout这种0秒‘延时’，导致触发不了后面的select 失效ing&#8230;</p>
<p>解决方案：</p>
<p>问题：<br />
firefox测试如下附代码，中途  res = b.dispatchEvent(&#8221;click&#8221;)出现致命错误，js中止执行？</p>
<p>解决方案：</p>
<p>附代码：<br />
&lt;!DOCTYPE HTML PUBLIC &#8220;-//W3C//DTD HTML 4.0 Transitional//EN&#8221;&gt;<br />
&lt;HTML&gt;<br />
&lt;HEAD&gt;<br />
&lt;TITLE&gt; New Document &lt;/TITLE&gt;<br />
&lt;META NAME=&#8221;Generator&#8221; CONTENT=&#8221;EditPlus&#8221;&gt;<br />
&lt;META NAME=&#8221;Author&#8221; CONTENT=&#8221;"&gt;<br />
&lt;META NAME=&#8221;Keywords&#8221; CONTENT=&#8221;"&gt;<br />
&lt;META NAME=&#8221;Description&#8221; CONTENT=&#8221;"&gt;<br />
&lt;script type=&#8221;text/javascript&#8221; src=&#8221;detect.js&#8221;&gt;<br />
&lt;/script&gt;<br />
&lt;script type=&#8221;text/javascript&#8221; src=&#8221;eventutil.js&#8221;&gt;<br />
&lt;/script&gt;</p>
<p>&lt;script type=&#8221;text/javascript&#8221;&gt;<br />
function funA(e){<br />
alert(&#8221;button1 be clicked&#8221;);<br />
alert(e.clientX);<br />
}</p>
<p>function onLoad(){<br />
var b = document.getElementById(&#8221;button1&#8243;);<br />
b.addEventListener(&#8217;click&#8217;,funA,false);<br />
//alert(EventUtil);<br />
//EventUtil.addEventHandler(b,&#8217;click&#8217;,funA);</p>
<p>res = b.dispatchEvent(&#8221;click&#8221;);<br />
alert(res);<br />
if ( res ) {</p>
<p>// event dispatch was successful</p>
<p>b.disabled = true;</p>
<p>}</p>
<p>}<br />
&lt;/script&gt;<br />
&lt;/HEAD&gt;</p>
<p>&lt;BODY onload=&#8221;onLoad()&#8221;&gt;<br />
&lt;input type=&#8221;button&#8221; name=&#8221;button1&#8243; id=&#8221;button1&#8243; value=&#8221;按钮&#8221;&gt;<br />
&lt;/BODY&gt;<br />
&lt;/HTML&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://20year.cn/blog/2009/08/30/757/feed/</wfw:commentRss>
		<feedburner:origLink>http://20year.cn/blog/2009/08/30/757/</feedburner:origLink></item>
		<item>
		<title>我的第二个Ext布局</title>
		<link>http://feedproxy.google.com/~r/20year/~3/82sd2Dp0sdY/</link>
		<comments>http://20year.cn/blog/2009/08/25/%e6%88%91%e7%9a%84%e7%ac%ac%e4%ba%8c%e4%b8%aaext%e5%b8%83%e5%b1%80/#comments</comments>
		<pubDate>Tue, 25 Aug 2009 15:47:58 +0000</pubDate>
		<dc:creator>Felix_code</dc:creator>
		
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://20year.cn/blog/?p=754</guid>
		<description><![CDATA[
因为border Panel缺少属性region:&#8217;center&#8217;，开始调试不成功！



Ext.onReady(function(){
            var item1 = new Ext.Panel({
                title: 'Accordion Item 1',
                html: '&#60;empty panel&#62;',
 [...]]]></description>
			<content:encoded><![CDATA[<p>
因为border Panel缺少属性region:&#8217;center&#8217;，开始调试不成功！
</p>
<p><span id="more-754"></span><br />
<code></p>
<p>Ext.onReady(function(){</p>
<p>            var item1 = new Ext.Panel({<br />
                title: 'Accordion Item 1',<br />
                html: '&lt;empty panel&gt;',<br />
                cls:'empty'<br />
            });</p>
<p>            var item2 = new Ext.Panel({<br />
                title: 'Accordion Item 2',<br />
                html: '&lt;empty panel&gt;',<br />
                cls:'empty'<br />
            });</p>
<p>            var item3 = new Ext.Panel({<br />
                title: 'Accordion Item 3',<br />
                html: '&lt;empty panel&gt;',<br />
                cls:'empty'<br />
            });</p>
<p>            var accordion = new Ext.Panel({<br />
                region:'west',<br />
                margins:'5 0 5 5',<br />
                split:true,<br />
                width: 210,<br />
                layout:'accordion',<br />
                items: [item1, item2, item3]<br />
            });</p>
<p>	var border = new Ext.Panel({<br />
		title: &#8216;Border Layout&#8217;,<br />
		region:&#8217;center&#8217;,<br />
		layout: &#8216;border&#8217;,<br />
		items:[{<br />
			title:'南部的面板',<br />
			region: 'south',<br />
			height:100,<br />
			minSize:75,<br />
			maxSize:250,<br />
			margins: '0 5 5 5'<br />
		},{<br />
			title: '西部的面板',<br />
			region: 'west',<br />
			margins: '5 0 0 5',<br />
			//cmargins:'5 5 0 5',<br />
			width: 200,<br />
			minSize: 100,<br />
			maxSize: 300<br />
		},{<br />
			title: '主内容',<br />
			region: 'center',<br />
			margins: '5 5 0 0'<br />
		}]<br />
	});</p>
<p>	var viewport = new Ext.Viewport({<br />
	    layout:&#8217;border&#8217;,<br />
	    items:[accordion,border]<br />
	});</p>
<p>});</p>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>http://20year.cn/blog/2009/08/25/%e6%88%91%e7%9a%84%e7%ac%ac%e4%ba%8c%e4%b8%aaext%e5%b8%83%e5%b1%80/feed/</wfw:commentRss>
		<feedburner:origLink>http://20year.cn/blog/2009/08/25/%e6%88%91%e7%9a%84%e7%ac%ac%e4%ba%8c%e4%b8%aaext%e5%b8%83%e5%b1%80/</feedburner:origLink></item>
		<item>
		<title>首饰画廊－戒指篇</title>
		<link>http://feedproxy.google.com/~r/20year/~3/0kHv0CelmqA/</link>
		<comments>http://20year.cn/blog/2009/08/25/%e9%a6%96%e9%a5%b0%e7%94%bb%e5%bb%8a%ef%bc%8d%e6%88%92%e6%8c%87%e7%af%87/#comments</comments>
		<pubDate>Tue, 25 Aug 2009 12:22:17 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
		
		<category><![CDATA[每日休闲]]></category>

		<guid isPermaLink="false">http://20year.cn/blog/?p=748</guid>
		<description><![CDATA[试做了一辑图，全部为首饰设计或成品图。有你欣赏的款式一定要留言喔！
]]></description>
			<content:encoded><![CDATA[<p>试做了一辑图，全部为首饰设计或成品图。有你欣赏的款式一定要留言喔！</p>
<div id="attachment_749" class="wp-caption alignnone" style="width: 341px"><a href="http://20year.cn/upload/pictures/jewelry-rings/index.htm"><img class="size-full wp-image-749" title="ring-jewelry" src="http://20year.cn/blog/wp-content/uploads/2009/08/ring-jewelry.jpg" alt="首饰欣赏－戒指" width="331" height="513" /></a><p class="wp-caption-text">首饰欣赏－戒指</p></div>
]]></content:encoded>
			<wfw:commentRss>http://20year.cn/blog/2009/08/25/%e9%a6%96%e9%a5%b0%e7%94%bb%e5%bb%8a%ef%bc%8d%e6%88%92%e6%8c%87%e7%af%87/feed/</wfw:commentRss>
		<feedburner:origLink>http://20year.cn/blog/2009/08/25/%e9%a6%96%e9%a5%b0%e7%94%bb%e5%bb%8a%ef%bc%8d%e6%88%92%e6%8c%87%e7%af%87/</feedburner:origLink></item>
		<item>
		<title>Ext学习:如何使布局面板自适应浏览器窗口变化</title>
		<link>http://feedproxy.google.com/~r/20year/~3/GnT_dt9I72g/</link>
		<comments>http://20year.cn/blog/2009/08/21/ext%e5%ad%a6%e4%b9%a0%e5%a6%82%e4%bd%95%e4%bd%bf%e5%b8%83%e5%b1%80%e9%9d%a2%e6%9d%bf%e8%87%aa%e9%80%82%e5%ba%94%e6%b5%8f%e8%a7%88%e5%99%a8%e7%aa%97%e5%8f%a3%e5%8f%98%e5%8c%96/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 04:45:20 +0000</pubDate>
		<dc:creator>Felix_code</dc:creator>
		
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://20year.cn/blog/?p=742</guid>
		<description><![CDATA[答案：使用Viewport类。视口Viewport也是Container类的子类，它会与浏览器试图自适应尺寸，是全屏幕应用的基础，如浏览器大小调节、布局重新计算的问题由该类自动完成。
见Ext例子accordion Layout：
            var accordion = new Ext.Panel({
                region:'west',
                margins:'5 0 5 5',
   [...]]]></description>
			<content:encoded><![CDATA[<p>答案：使用Viewport类。视口Viewport也是Container类的子类，它会与浏览器试图自适应尺寸，是全屏幕应用的基础，如浏览器大小调节、布局重新计算的问题由该类自动完成。</p>
<p>见Ext例子accordion Layout：</p>
<pre>            var accordion = new Ext.Panel({
                region:'west',
                margins:'5 0 5 5',
                split:true,
                width: 210,
                layout:'accordion',
                items: [item1, item2, item3, item4, item5]
            });

            var viewport = new Ext.Viewport({
                layout:'border',
                items:[
                    accordion, {
                    region:'center',
                    margins:'5 5 5 0',
                    cls:'empty',
                    bodyStyle:'background:#f1f1f1',
                    html:'&lt;br/&gt;&lt;br/&gt;&amp;lt;empty center panel&amp;gt;'
                }]
            });</pre>
]]></content:encoded>
			<wfw:commentRss>http://20year.cn/blog/2009/08/21/ext%e5%ad%a6%e4%b9%a0%e5%a6%82%e4%bd%95%e4%bd%bf%e5%b8%83%e5%b1%80%e9%9d%a2%e6%9d%bf%e8%87%aa%e9%80%82%e5%ba%94%e6%b5%8f%e8%a7%88%e5%99%a8%e7%aa%97%e5%8f%a3%e5%8f%98%e5%8c%96/feed/</wfw:commentRss>
		<feedburner:origLink>http://20year.cn/blog/2009/08/21/ext%e5%ad%a6%e4%b9%a0%e5%a6%82%e4%bd%95%e4%bd%bf%e5%b8%83%e5%b1%80%e9%9d%a2%e6%9d%bf%e8%87%aa%e9%80%82%e5%ba%94%e6%b5%8f%e8%a7%88%e5%99%a8%e7%aa%97%e5%8f%a3%e5%8f%98%e5%8c%96/</feedburner:origLink></item>
		<item>
		<title>js:如何为Event handler自定义输入参数(一）</title>
		<link>http://feedproxy.google.com/~r/20year/~3/Yx7zIg3KlUE/</link>
		<comments>http://20year.cn/blog/2009/08/13/js%e5%a6%82%e4%bd%95%e4%b8%baevent-handler%e8%87%aa%e5%ae%9a%e4%b9%89%e8%be%93%e5%85%a5%e5%8f%82%e6%95%b0%e4%b8%80%ef%bc%89/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 13:02:33 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
		
		<category><![CDATA[技术]]></category>

		<category><![CDATA[extjs]]></category>

		<category><![CDATA[js]]></category>

		<guid isPermaLink="false">http://20year.cn/blog/2009/08/13/js%e5%a6%82%e4%bd%95%e4%b8%baevent-handler%e8%87%aa%e5%ae%9a%e4%b9%89%e8%be%93%e5%85%a5%e5%8f%82%e6%95%b0%e4%b8%80%ef%bc%89/</guid>
		<description><![CDATA[function shell(arg1,arg2,arg3){
return function(){
alert(&#8217;arg1:&#8217; + arg1+&#8217;;'+&#8217;arg2:&#8217;+arg2);
}
}
function onClick(arg1){
alert(&#8217;onClick arg1:&#8217;+arg1);
}
var div1= document.getElementById(&#8217;div1&#8242;);
div1.addEventListener(&#8217;click&#8217;, shell(&#8217;334&#8242;,&#8217;dfa&#8217;,3), false);
//div1.addEventListener(&#8217;click&#8217;, onClick(&#8217;on click&#8217;), false); //比较与上句的不同
]]></description>
			<content:encoded><![CDATA[<p>function shell(arg1,arg2,arg3){<br />
return function(){<br />
alert(&#8217;arg1:&#8217; + arg1+&#8217;;'+&#8217;arg2:&#8217;+arg2);<br />
}<br />
}</p>
<p>function onClick(arg1){<br />
alert(&#8217;onClick arg1:&#8217;+arg1);<br />
}</p>
<p>var div1= document.getElementById(&#8217;div1&#8242;);<br />
div1.addEventListener(&#8217;click&#8217;, shell(&#8217;334&#8242;,&#8217;dfa&#8217;,3), false);<br />
//div1.addEventListener(&#8217;click&#8217;, onClick(&#8217;on click&#8217;), false); //比较与上句的不同</p>
]]></content:encoded>
			<wfw:commentRss>http://20year.cn/blog/2009/08/13/js%e5%a6%82%e4%bd%95%e4%b8%baevent-handler%e8%87%aa%e5%ae%9a%e4%b9%89%e8%be%93%e5%85%a5%e5%8f%82%e6%95%b0%e4%b8%80%ef%bc%89/feed/</wfw:commentRss>
		<feedburner:origLink>http://20year.cn/blog/2009/08/13/js%e5%a6%82%e4%bd%95%e4%b8%baevent-handler%e8%87%aa%e5%ae%9a%e4%b9%89%e8%be%93%e5%85%a5%e5%8f%82%e6%95%b0%e4%b8%80%ef%bc%89/</feedburner:origLink></item>
		<item>
		<title>blog被入侵</title>
		<link>http://feedproxy.google.com/~r/20year/~3/HG7nV9ftCXc/</link>
		<comments>http://20year.cn/blog/2009/08/12/blog%e8%a2%ab%e5%85%a5%e4%be%b5/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 15:43:29 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
		
		<category><![CDATA[blog日志]]></category>

		<guid isPermaLink="false">http://20year.cn/blog/?p=733</guid>
		<description><![CDATA[不知是自己粗心留下wp-admin/install.php脚本，还是有高人出招，博客被重新安装了3次。幸运的，原来的数据还在，只是添加了些垃圾数据。
]]></description>
			<content:encoded><![CDATA[<p>不知是自己粗心留下wp-admin/install.php脚本，还是有高人出招，博客被重新安装了3次。幸运的，原来的数据还在，只是添加了些垃圾数据。</p>
]]></content:encoded>
			<wfw:commentRss>http://20year.cn/blog/2009/08/12/blog%e8%a2%ab%e5%85%a5%e4%be%b5/feed/</wfw:commentRss>
		<feedburner:origLink>http://20year.cn/blog/2009/08/12/blog%e8%a2%ab%e5%85%a5%e4%be%b5/</feedburner:origLink></item>
		<item>
		<title>[转]国外优秀开源PHP建站程序一览</title>
		<link>http://feedproxy.google.com/~r/20year/~3/HZznjnFej1k/</link>
		<comments>http://20year.cn/blog/2009/07/29/%e8%bd%ac%e5%9b%bd%e5%a4%96%e4%bc%98%e7%a7%80%e5%bc%80%e6%ba%90php%e5%bb%ba%e7%ab%99%e7%a8%8b%e5%ba%8f%e4%b8%80%e8%a7%88/#comments</comments>
		<pubDate>Tue, 28 Jul 2009 16:23:40 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
		
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://20year.cn/blog/?p=718</guid>
		<description><![CDATA[大量的PHP开源（开放源代码/Open Source）应用改变了这个世界，改变了互联网，以下我们总结从数据库到购物、博客等众多类型的开源PHP软件，供网站开发者们参考。
博客：WordPress
WordPress是使用PHP开发的著名博客平台，免费开源，功能强大，不仅仅用于博客搭建，还可以广泛应用于各类网络信息发布平台。
论坛：phpBB
phpBB是一种广泛流行的开源论坛软件，具有易于使用的管理面板和友好的用户安装界面，可以轻松地在数分钟内建立起一个论坛，功能上具有很高的可配置性，能够完全定制出相当个性化的论坛。
CMS：Drupal
Drupal是一个开源的内容管理系统(CMS)平台，拥有强大并可自由配置的功能，能支持从个人博客到大型社区驱动的网站等各种不同应用的网站项目。
Wiki：MediaWiki
MediaWiki是PHP语言写成开源Wiki引擎，全世界最大的Wiki项目维基百科就是使用MediaWiki引擎。
Digg：Pligg
Pligg是一套灵活的类似Digg的Web2.0 CMS系统，系统使用PHP开发，模仿了国外流行的DIGG系统。
图像：Gallery
Gallery 是一个非常有名的免费开源图库相册软件，基于 PHP 和 MySQL， PostgreSQL 等数据库。功能非常强大，有丰富的扩展可以下载，安装很简单，有很多插件可用。
RSS：Gregarius
Gregarius是一个RSS聚合程序，免费开源，具备不错的用户体验，易于操作和管理。可以把其当成RSS阅读器使用。
电子商务：osCommerce
osCommerce是一套由自由软件开发社团开发并维护的在线商店的解决方案，免费开源，并可以应用到任何的商业环境中，可以在短时间内生成一个功能强大的电子商务网站。
广告：OpenX
OpenX（原名phpAdsNew）是一个用PHP开发的广告管理与跟踪系统，适合各类网站使用，能够管理每个广告主拥有的多种任何尺寸横幅广告，按天查看，详细和概要统计并通过电子邮件发送报表给广告主。
数据库：phpMyadmin
phpMyAdmin是用PHP开发的MySQL的数据库管理工具。可以在Web界面上实现各种各样对MySQL数据库的管理和操作。
来源：phpchina.com
]]></description>
			<content:encoded><![CDATA[<p>大量的<span style="text-decoration: underline;"><strong>PHP</strong></span><span style="text-decoration: underline;"><strong>开源</strong></span>（开放源代码/Open Source）<span style="text-decoration: underline;"><strong>应用</strong></span>改变了这个世界，改变了互联网，以下我们总结从<span style="text-decoration: underline;"><strong>数据库</strong></span>到购物、博客等众多类型的开源PHP软件，供<span style="text-decoration: underline;"><strong>网站</strong></span><span style="text-decoration: underline;"><strong>开发</strong></span>者们参考。</p>
<p>博客：WordPress</p>
<p>WordPress是使用PHP开发的著名博客平台，免费开源，功能强大，不仅仅用于博客搭建，还可以广泛应用于各类网络信息发布平台。</p>
<p>论坛：phpBB</p>
<p>phpBB是一种广泛流行的开源论坛软件，具有易于使用的管理面板和友好的用户安装界面，可以轻松地在数分钟内建立起一个论坛，功能上具有很高的可配置性，能够完全定制出相当个性化的论坛。</p>
<p>CMS：Drupal</p>
<p>Drupal是一个开源的内容管理系统(CMS)平台，拥有强大并可自由配置的功能，能支持从个人博客到大型社区驱动的网站等各种不同应用的网站项目。</p>
<p>Wiki：MediaWiki</p>
<p>MediaWiki是PHP语言写成开源Wiki引擎，全世界最大的Wiki项目维基百科就是使用MediaWiki引擎。</p>
<p>Digg：Pligg</p>
<p>Pligg是一套灵活的类似Digg的Web2.0 CMS系统，系统使用PHP开发，模仿了<span style="text-decoration: underline;"><strong>国外</strong></span>流行的DIGG系统。</p>
<p>图像：Gallery</p>
<p>Gallery 是一个非常有名的免费开源图库相册软件，基于 PHP 和 <span style="text-decoration: underline;"><strong>MySQL</strong></span>， PostgreSQL 等数据库。功能非常强大，有丰富的扩展可以下载，安装很简单，有很多插件可用。</p>
<p>RSS：Gregarius</p>
<p>Gregarius是一个RSS聚合<span style="text-decoration: underline;"><strong>程序</strong></span>，免费开源，具备不错的用户体验，易于操作和管理。可以把其当成RSS阅读器使用。</p>
<p>电子商务：osCommerce</p>
<p>osCommerce是一套由自由软件开发社团开发并维护的在线商店的解决方案，免费开源，并可以应用到任何的商业环境中，可以在短时间内生成一个功能强大的电子商务网站。</p>
<p>广告：OpenX</p>
<p>OpenX（原名phpAdsNew）是一个用PHP开发的广告管理与跟踪系统，适合各类网站使用，能够管理每个广告主拥有的多种任何尺寸横幅广告，按天查看，详细和概要统计并通过电子邮件发送报表给广告主。</p>
<p>数据库：phpMyadmin</p>
<p>phpMyAdmin是用PHP开发的MySQL的数据库管理工具。可以在<span style="text-decoration: underline;"><strong>Web</strong></span>界面上实现各种各样对MySQL数据库的管理和操作。</p>
<p>来源：phpchina.com</p>
]]></content:encoded>
			<wfw:commentRss>http://20year.cn/blog/2009/07/29/%e8%bd%ac%e5%9b%bd%e5%a4%96%e4%bc%98%e7%a7%80%e5%bc%80%e6%ba%90php%e5%bb%ba%e7%ab%99%e7%a8%8b%e5%ba%8f%e4%b8%80%e8%a7%88/feed/</wfw:commentRss>
		<feedburner:origLink>http://20year.cn/blog/2009/07/29/%e8%bd%ac%e5%9b%bd%e5%a4%96%e4%bc%98%e7%a7%80%e5%bc%80%e6%ba%90php%e5%bb%ba%e7%ab%99%e7%a8%8b%e5%ba%8f%e4%b8%80%e8%a7%88/</feedburner:origLink></item>
		<item>
		<title>学单词：promotion</title>
		<link>http://feedproxy.google.com/~r/20year/~3/h-H_TU3QqIE/</link>
		<comments>http://20year.cn/blog/2009/07/28/%e5%ad%a6%e5%8d%95%e8%af%8d%ef%bc%9apromotion/#comments</comments>
		<pubDate>Tue, 28 Jul 2009 03:53:03 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
		
		<category><![CDATA[学英语]]></category>

		<guid isPermaLink="false">http://20year.cn/blog/?p=715</guid>
		<description><![CDATA[promotion a series of advertisements for a company’s products :  The company has spent more than $300 million on promotions for the brand.
公司花了超过3个亿为这个品牌做推广。
]]></description>
			<content:encoded><![CDATA[<p><strong>promotion</strong> a series of advertisements for a company’s products :  The company has spent more than $300 million on promotions for the brand.</p>
<p>公司花了超过3个亿为这个品牌做推广。</p>
]]></content:encoded>
			<wfw:commentRss>http://20year.cn/blog/2009/07/28/%e5%ad%a6%e5%8d%95%e8%af%8d%ef%bc%9apromotion/feed/</wfw:commentRss>
		<feedburner:origLink>http://20year.cn/blog/2009/07/28/%e5%ad%a6%e5%8d%95%e8%af%8d%ef%bc%9apromotion/</feedburner:origLink></item>
		<item>
		<title>业界新闻：雨林木风Linux意义和目的是什么?</title>
		<link>http://feedproxy.google.com/~r/20year/~3/_PT7CmGybKo/</link>
		<comments>http://20year.cn/blog/2009/07/26/%e4%b8%9a%e7%95%8c%e6%96%b0%e9%97%bb%ef%bc%9a%e9%9b%a8%e6%9e%97%e6%9c%a8%e9%a3%8elinux%e6%84%8f%e4%b9%89%e5%92%8c%e7%9b%ae%e7%9a%84%e6%98%af%e4%bb%80%e4%b9%88/#comments</comments>
		<pubDate>Sun, 26 Jul 2009 01:41:21 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
		
		<category><![CDATA[科普]]></category>

		<guid isPermaLink="false">http://20year.cn/blog/?p=712</guid>
		<description><![CDATA[雨林木风的的确确打包了基于Fedora11的Linux，并且发布了Ylmf linux v1.0 版，这个就不用质疑了。要质疑的是能否对Lixnu作出推动作用以及其打包的目的。
在微软巨头反盗版的棍棒之下，一些以打包盗版为生的组织，例如番茄花园、雨林木风、深度等相继隐去，正当这些昔日红极一时的打包组织逐渐走出网络的视线的时候，雨林木风突然走进开源世界，打包LINUX，并且已经发布“开源大餐 Ylmf linux v1.0”，这一动作，从网络上引来了眼球以及不同的声音，有支持的，有鄙视的，当然也有中立围观的…
Ylmf linux v1.0 版特性说明：
－ 基于 Fedora11 版本 去掉系统多余的软件包，增加驱动与常用应用软件
－ 集成openoffice3.1办公软件（能打开所有ms office 文件）
－ 集成输入法为：ibus 拼音（linux下类似搜狗、谷歌、紫光拼音等的完美替代选择！）
－ 集成默认桌面管理器：KDE（最接近Windows上的使用习惯，满足个人使用便利需求！）
－ 集成全能电影播放机与解码器 （能播放各类电影文件）
－ 集成图形处理软件 GIMP 2.6.16 (包含新的UI)
－ 集成浏览器 Firefox 3.5
－ 集成功能强大的邮件客户端 ：evolution
－ 集成轻量级 BT 下载工具： Trasmission Bittorrent
－ 集成腾讯官方 QQ for Linux
－ 桌面已添加常用工具gnome和kde桌面切换脚本
－ 默认完全支持c/c++开发环境
－ 使用最新内核 2.6.29
单从这个Ylmf linux v1.0 版本特来说，用过Linux的朋友都能看出来，这并没有什么新奇的地方，无非是多了个预装QQ for Linux和增加一些驱动(至于到底增加了什么驱动，本人目前未知)，所以并没有什么吸引眼球的功能和特征。
PS：如果作为探索linux桌面的一个尝试，Ylmf linux v1.0应该支持一下，如果能向linux的自主开发方向发展，那前途更不可限量，拭目以待！
]]></description>
			<content:encoded><![CDATA[<p>雨林木风的的确确打包了基于Fedora11的Linux，并且发布了Ylmf linux v1.0 版，这个就不用质疑了。要质疑的是能否对Lixnu作出推动作用以及其打包的目的。</p>
<p>在微软巨头反盗版的棍棒之下，一些以打包盗版为生的组织，例如番茄花园、雨林木风、深度等相继隐去，正当这些昔日红极一时的打包组织逐渐走出网络的视线的时候，雨林木风突然走进开源世界，打包LINUX，并且已经发布“开源大餐 Ylmf linux v1.0”，这一动作，从网络上引来了眼球以及不同的声音，有支持的，有鄙视的，当然也有中立围观的…</p>
<div id="attachment_711" class="wp-caption alignnone" style="width: 650px"><img class="size-full wp-image-711" title="22802_200907211656411z9m3" src="http://20year.cn/blog/wp-content/uploads/2009/07/22802_200907211656411z9m3.jpg" alt="YLMF Linux package" width="640" height="480" /><p class="wp-caption-text">YLMF Linux package</p></div>
<p>Ylmf linux v1.0 版特性说明：</p>
<p>－ 基于 Fedora11 版本 去掉系统多余的软件包，增加驱动与常用应用软件<br />
－ 集成openoffice3.1办公软件（能打开所有ms office 文件）<br />
－ 集成输入法为：ibus 拼音（linux下类似搜狗、谷歌、紫光拼音等的完美替代选择！）<br />
－ 集成默认桌面管理器：KDE（最接近Windows上的使用习惯，满足个人使用便利需求！）<br />
－ 集成全能电影播放机与解码器 （能播放各类电影文件）<br />
－ 集成图形处理软件 GIMP 2.6.16 (包含新的UI)<br />
－ 集成浏览器 Firefox 3.5<br />
－ 集成功能强大的邮件客户端 ：evolution<br />
－ 集成轻量级 BT 下载工具： Trasmission Bittorrent<br />
－ 集成腾讯官方 QQ for Linux<br />
－ 桌面已添加常用工具gnome和kde桌面切换脚本<br />
－ 默认完全支持c/c++开发环境<br />
－ 使用最新内核 2.6.29</p>
<p>单从这个Ylmf linux v1.0 版本特来说，用过Linux的朋友都能看出来，这并没有什么新奇的地方，无非是多了个预装QQ for Linux和增加一些驱动(至于到底增加了什么驱动，本人目前未知)，所以并没有什么吸引眼球的功能和特征。</p>
<p>PS：如果作为探索linux桌面的一个尝试，Ylmf linux v1.0应该支持一下，如果能向linux的自主开发方向发展，那前途更不可限量，拭目以待！</p>
]]></content:encoded>
			<wfw:commentRss>http://20year.cn/blog/2009/07/26/%e4%b8%9a%e7%95%8c%e6%96%b0%e9%97%bb%ef%bc%9a%e9%9b%a8%e6%9e%97%e6%9c%a8%e9%a3%8elinux%e6%84%8f%e4%b9%89%e5%92%8c%e7%9b%ae%e7%9a%84%e6%98%af%e4%bb%80%e4%b9%88/feed/</wfw:commentRss>
		<feedburner:origLink>http://20year.cn/blog/2009/07/26/%e4%b8%9a%e7%95%8c%e6%96%b0%e9%97%bb%ef%bc%9a%e9%9b%a8%e6%9e%97%e6%9c%a8%e9%a3%8elinux%e6%84%8f%e4%b9%89%e5%92%8c%e7%9b%ae%e7%9a%84%e6%98%af%e4%bb%80%e4%b9%88/</feedburner:origLink></item>
		<item>
		<title>『转』语言简评：比较Perl、PHP、Python、Java和Ruby</title>
		<link>http://feedproxy.google.com/~r/20year/~3/20UGMSLz63I/</link>
		<comments>http://20year.cn/blog/2009/07/25/%e6%af%94%e8%be%83perl%e3%80%81php%e3%80%81python%e3%80%81java%e5%92%8cruby/#comments</comments>
		<pubDate>Sat, 25 Jul 2009 08:27:53 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
		
		<category><![CDATA[技术]]></category>

		<category><![CDATA[perl]]></category>

		<category><![CDATA[php]]></category>

		<category><![CDATA[python]]></category>

		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://20year.cn/blog/?p=703</guid>
		<description><![CDATA[转自：http://www.cnblogs.com/xyz98/archive/2009/05/25/1488805.html
第六课 语言简评(4)
6.4后台脚本——敏捷开发的利器
操千曲而后晓声，观千剑而后识器 ——《文心雕龙•知音》

关键词：后台脚本, Perl,PHP,Python,Ruby,RoR,LAMP
摘要：简谈Perl、PHP、Python和Ruby
 
！预览
· 语言的发展趋势一定是动静结合、刚柔并济
· Perl凝练晦涩，Python优雅明晰，Ruby精巧灵动，PHP简明单纯
· 或许优雅正是来自对细节和规范的重视
· （RoR）与Ruby结合之后，便如一只猱身而上灵猫，立刻衬托出Java和.NET大象般的身影

？提问

Perl、Python、Ruby和PHP各自有何特点？
为什么动态语言多作为轻量级的解决方案？
LAMP为什么受欢迎？
Ruby on Rails为什么会流行？
编程语言的发展趋势是什么？

：讲解 
“剩下四种动态语言，我们将之归为后台脚本语言。”冒号说着画了张图表——





用户



前台语言：Visual Basic，Delphi，JavaScript


平台语言：Java，C#
后台脚本语言：Perl，PHP，Python，Ruby


系统语言：C，C++，D



机器




引号听得仔细：“我记得您开始是把这些语言划分为C族静态语言、非C族静态语言和动态语言三类的。”
冒号解释：“那是按语法来划分的，偏重理论；现在是按应用来划分，偏重实践。”
句号旋即联想到：“这种分法貌似三层架构——前台语言对应表现层；平台语言和后台脚本语言对应业务逻辑层；系统语言对应数据层。”
“的确有几分神似，但千万不可混淆。”冒号提醒道，“三层架构（three-layer architecture）是模块设计上的逻辑划分[1]；而这里是按语言应用范围进行的物理划分——与用户交互的是前台语言，与机器交互的是系统语言，介于其中的为前台提供服务同时又需要底层系统服务的是后台语言。”
逗号询问：“后台语言又细分成平台语言与后台脚本语言？”
“这是基于程序（program）与脚本（script）、静态与动态而分的。”冒号进行说明，“其实Perl，PHP，Python和Ruby都有自己的虚拟机（virtual machine），从这种意义上说它们也可作为平台语言。但在实际应用中，它们没有Java平台和.NET平台那种整合凝聚力和核心作用，通常作为轻量级的解决方案。”
问号想探个究竟：“这是由于它们都是动态语言的缘故吗？”
冒号回答：“理论上动态语言同样能承担大型应用，但实践上它们多作为粘合语言或用于中小型应用。用句时髦的话来形容，暂时还是主流的配角或非主流的主角。毕竟在运行效率、类型安全、可用资源、开发工具、技术支持等方面，它们与Java、C#相比尚有一定差距。另外它们同属‘草根’语言，虽有开源社区的大力支持，在影响力上与后者未可同日而语。”
叹号揣测：“说不定在不久的将来，动态语言也会成为主流的主角。”
“世易时移，殊难逆料。但有一点可以肯定，语言的发展趋势一定是动静结合、刚柔并济。”冒号断言，“一方面以Java和C#为代表的静态语言中嫁接了动态语言的枝条；另一方面以Java和.NET为代表的平台与动态语言的交壤地带也在逐步扩大。比如JRuby允许Ruby与Java之间互相调用，类似的还有Jython、IronRuby、IronPython等等。此外值得一提的是，动态语言最活跃的舞台当数LAMP，L-A-M-P。”
引号接茬：“L是Linux，A是Apache，M是MySQL，P是PHP。这四大组件形成了一个完整的开源网络开发平台。”
冒号补充道：“P也可指Perl、Python，甚至Ruby。”
逗号调侃：“可惜Ruby的‘R’比‘P’多了一根尾巴。”
“有人为了自圆其说，干脆让P表示‘Programming language’，这下所有语言都囊括其中了。老外就喜欢玩这种首字母缩略（acronym）的文字游戏，尤其LAMP正好还有‘灯’的含义，寓意开源世界的一盏明灯，他们一定更得意了。”冒号语带调笑，“前面我们曾提及，网络应用是生长动态语言最肥沃的土壤，而LAMP就是这块土壤上搭建的平台。作为网络平台，LAMP以其开放灵活、开发迅速、部署方便、高可配置、安全可靠、成本低廉等特色而与Java平台和.NET平台鼎足三分，尤其受中小企业的欢迎。LAMP中Linux是操作系统，Apache是Web服务器，MySQL是数据库系统，而我们当下最关心的是‘P族语言’：PHP、Perl、Python还有Ruby。”
问号建议：“作为动态语言，它们的共性上节课已经谈了不少，能说说它们的个性吗？”
“它们的个性极为鲜明：Perl凝练晦涩，Python优雅明晰，Ruby精巧灵动，PHP简明单纯。先看老大哥Perl，它博采众家之长，综合了C语言的结构、sed的正则表达式、AWK的关联数组（associative array）、Lisp的表（list）和Unix Shell的命令，此外还有借鉴了一种语言，你们知道是哪种吗？”冒号忽然卖了个关子。
逗号猜想：“应该是某种OOP语言吧。”
“Perl中确有不少C++的影子，但它的对象模型在5.0以后才引入，典型的半路出家，远不如前面的特征那么自然。与其说是一种自然而然的发展，不如说是在OOP潮流裹挟下的一种身不由己的迎合。真正深入骨髓的借鉴是自然语言。”冒号给出了答案，“我们提过，Perl的发明者Larry Wall是一名语言学家，他认为程序语言应该与自然语言一样，简洁自然、易读易写、表达多样、不拘一格。Perl还有不少的格言或哲学，使得编程语言一改严谨刻板的面孔，散发出浓郁的人文气息。”
叹号幽了一默：“我见过Perl的代码，人文气息没闻出来，但我怀疑有乙醚气息——看一会就觉得晕晕乎乎的。”
众人大笑。
“有人仅用一行Perl代码就实现了RSA算法，你看了那还不得当场晕倒啊？”冒号打趣道，“Perl的各种魔符好似一把把锋利的剪刀，做起文本裁剪之类的工作来游刃有余。这是它最大的长处，当初Perl就是Wall用来做Unix系统管理的，以后在CGI上的广泛应用也得益于此。这也赋予Perl极强的粘合力，因而有‘internet上的胶带（duct tape）[2]’的说法。它又号称瑞士军刀，精练而复杂，实用而强大。但Perl过于灵活自由，缺乏规范，影响了程序的可读性、一致性、整洁性和可维护性。不熟悉该语言的固然如读天书，熟悉语言而不熟悉问题的也颇费思量。相比之下Python被认为是Perl有力的挑战者，不仅在于它天然的OO设计和丰富的类库，更重要的是它对程序员友好度大大超过Perl。Python也有一系列的被称为禅（Zen）的哲学，不少与Perl是针锋相对的。比如：Perl认为做一件事可以有多种方法，而Python认为一件事应该最好只有一种方法；Perl追求语言的表现力，Python追求简单优雅；Perl喜欢隐性暗示，Python强调显性明示；Perl强调紧凑，Python强调松散； Perl的语法和语义丰富，Python的语法和语义简单而类库丰富。或许Python最让人不习惯的是它对空白符敏感性。”
引号感到惊奇：“对空白符敏感？这个倒真怪异。”
冒号见惯不怪：“虽然有点违反习惯，但非常符合Python一贯的规范简洁的风格——一方面从语法上保证了良好的编码风格；另一方面，每个代码块不再需要起始的大括号或begin/end之类的，减少了的代码行数。顺便插一句，另外一种优雅的语言Haskell同样对空白符敏感，或许优雅正是来自对细节和规范的重视吧。此外许多人抱怨Python中的自引用self太多，殊不知这也是它倡导显式表达的一种体现。总的看来，Python主要的问题还是在性能效率上不尽如人意。”
叹号好奇地问：“Ruby怎么样？据说它将取代Java。”
“不要轻言‘取代’二字。”冒号规诫道，“Java没有取代C++，也不会被Ruby取代，至多只是一种再分配。不过Ruby的确是门很可爱的语言，兼具Perl的表现力和Python的可读性。Ruby背后最具特色的理念是：关注程序员使用语言时的感受超过语言本身的功能。通俗地说，兵器的称手比锋利更重要；文雅地说，应给予程序员更多的人文关怀。就拿代码块（block）和迭代器（iterator）来说，虽然均非Ruby首创，但其语法最为赏心悦目。类似的例子比比皆是。Ruby的元编程能力特别强，也是它高度灵活的一种体现，但并不是所有人都喜欢这种风格。Ruby的主要弱点有两个：一个与Python类似，在性能上还有待提高；另一个是它的线程由用户空间（user space）而不是内核空间（kernel space）来管理[3]，不能充分利用多核或多CPU。真正让Ruby变得炙手可热的是web应用框架 Ruby on Rails（RoR）的成功，它们还催生了Java平台上的Groovy语言和Groovy on Grails框架。RoR奉行的CoC（Convention over Configuration）和DRY（Don&#8217;t repeat yourself ）原则以及MVC架构看似了无新意，但与Ruby结合之后，便如一只猱身而上灵猫，立刻衬托出Java和.NET大象般的身影。”
逗号有些怀疑：“框架竟然捧红了语言，框架真有这么重要吗？”
“如果web应用中动态页面较少或业务逻辑不复杂，框架的价值并不大。以前CGI编程就是往Perl之类的代码中嵌入HTML代码，如同Java中的Servlet；PHP则单纯地在HTML代码中插入PHP代码，如同早期的JSP。没有MVC，也不管什么三层架构，更没有ORM。但是——”冒号拖了个转折音，“一旦业务逻辑变得复杂，开发人员增多，手工作坊式编程开始捉襟见肘，引入框架这个流水生产线来提高生产力便是大势所趋。”
句号不解：“我想Perl、Python和PHP一定也有不少框架，Java中的框架更是泛滥成灾，何以独独RoR脱颖而出？”
冒号作出分析：“正值web2.0和敏捷开发（agile development）的概念流行之际，RoR将AJAX与Ruby组合在一起成为绝佳的回应。以前各种web应用框架是不少，但在RoR之前轻量级套餐式解决方案并不多。Perl中的Catalyst、Python中的Pylon还有PHP中的CakePHP等应是效仿之作。因此RoR出现的时机可说是不早不晚，正当其时。此外，Perl和PHP由于过于流行，反而有不少的历史包袱，人们习惯了将表示逻辑和业务逻辑编织在一起。至于Java企业解决方案，框架太多，搭配组合更多，增加了选择的难度。即使采用最常见的轻量级SSH（Struts+Spring+Hibernate）组合，维护起来也比RoR繁杂得多。”
叹号愈发担忧：“听这意思，Java还是危险啊！”
“言之过早。”冒号不以为然，“首先RoR还有待进一步检验，目前无论是应用广度还是深度上尚无法与Java相提并论；其次Java在性能、安全等方面还是有不少优势，而这些对于大型和关键性的应用来说尤为重要。即使在中小型web应用中，RoR较之PHP还远为不及。”
问号接下话题：“PHP为何如此流行？”
“因为它简单、专一。”冒号答得很干脆，“与Python和Ruby一开始就定位通用语言不同，PHP是专为网络而生的。同早期的Perl相似，PHP起初主要起文本过滤器的作用，只不过Perl多处理文件流（file stream），而PHP多处理套接字流（socket stream）。PHP的语法简单，且为网络应用度身定造，受到网络开发人员的追捧当在情理之中。它虽很实用很流行，但并不完美。比如：变量名大小写敏感而函数名大小写不敏感；函数命名规则不一致；不支持namespace和unicode[4]；与Perl一样，它的对象模型不是先天的，直到PHP 5才真正完善；对线程支持不足；相比Perl、Python和Ruby，它的功能稍显单薄等等。”
引号突然想起：“我记得您在第一堂课提到PHP还能用于桌面应用。”
“不仅PHP，Perl、Python还有Ruby，都能作为前台语言来开发命令行或图形界面的应用。同样地，VB、Delphi和JavaScript也 能作为后台语言。现代的程序语言既有自己的专长，又向通用化和全能化发展，以争取更多的生存空间。试想一下，现代的程序员又何尝不是如此呢？”言及于此， 冒号收住话题，“语言简评告一段落，还有不少既有趣又有用的语言，在此就不一一评说了。我们看到，每种编程语言都有其独特的惯例用法和哲学理念，它们与编 程范式一道形成了语言的编程风格。体悟愈深者编程语感愈强，思维与语言愈交融无碍，渐从必然王国走向自由王国。”
逗号满怀憧憬：“那是不是一种人剑合一的境界？”
“或许人器合一更准确吧，程序员可不能只会一种兵器哟。”冒号故意抠他的字眼，“现在请大家每人写一句对本节课的感言。”
众人沉思片刻，齐齐挥笔而就——
叹号——没有最好的语言，只有最合适的语言。
逗号——没有糟糕的语言，只有糟糕的程序员。
问号——没有一种语言是万能的，只会一种语言是万万不能的。
引号——废除对语言的宗教信仰，建立对语言的哲学思维。 
句号——编程就是在人脑和电脑之间寻找最佳平衡点的过程。

冒号读罢大悦，顺手一掌拍出五记马屁：“精彩之极！可谓字字珠玑、句句联璧啊。兹决定，给诸位的奖赏是——立时下课！”
众人欣然领赏而去。

，插语
[1] 有两种三层架构，一种是three-layer architecture，一种是three-tier architecture。它们经常换用，但其实是有分别的：前者仅仅在逻辑进行划分，而后者在物理上也进行了划分——不同层次的模块运行在不同的主机上。
[2] 不少地方译作‘输送带’、‘传送带’，因为duct有‘输送管’、‘导管’之意，于是想当然地认为这表明Perl在internet上起着输送作用。殊不知‘duct type’专指一种万能的粘性极强的胶带，用以比喻Perl的粘合力。
[3] 这类线程被称为绿色线程（green thread），也称伪线程。据称Ruby2.0将支持原生线程（native thread）。
[4] PHP将在5.3.0支持namespace，将在6.0支持unicode。
 
。总结

比起Java平台和.NET平台，动态语言轻便灵活、开发效率高，但整合凝聚力还不够，在运行效率、类型安全、可用资源、开发工具、技术支持以及影响力等方面也有一定差距，故通常作为轻量级的解决方案。
LAMP是由Linux、Apache、MySQL和包括PHP、Perl、Python或Ruby在内的脚本语言组成的网络开发平台，具有开放灵活、开发迅速、部署方便、高可配置、安全可靠、成本低廉等优点。
Perl精练、复杂、强大、灵活、自由、隐晦、表现力强，但规范性、可读性、一致性、整洁性和可维护性较差。
Python优雅规范、简洁明晰、易学易用、类库丰富，但效率稍差，有些人不喜欢它对空白符敏感的特性。
Ruby语法精巧、高度灵活，兼具Perl的表现力和Python的可读性，尤其注重程序员的感受，但其性能和线程模型尚有待改进。
PHP简单、专一、实用、流行，在但相比其他三种语言，在语法和功能上稍有欠缺。
RoR是一种轻量级套餐式的web应用解决方案，是由好的设计（MVC架构和CoC、DRY原则）加上好的语言（Ruby）在好的时机（web2.0和敏捷开发风行之际）打造出的好的框架。
静态语言与动态语言从语言特征到运行环境都在逐渐融合。
程序员应该与程序语言一样，既要有自己的专长，又要向通用化和全能化发展。
编程语言惯例用法、哲学理念和编程范式形成了语言的编程风格。

“”参考
[1] Larry Wall, Tom Christiansen, [...]]]></description>
			<content:encoded><![CDATA[<p>转自：<a href="http://www.cnblogs.com/xyz98/archive/2009/05/25/1488805.html">http://www.cnblogs.com/xyz98/archive/2009/05/25/1488805.html</a></p>
<p><strong><span style="font-size: 13pt;">第六课 语言简评(4)</span></strong></p>
<p><strong>6.4</strong><strong>后台脚本——</strong><strong>敏捷开发的利器</strong></p>
<p style="margin: 0cm 0cm 0pt 18pt;">操千曲而后晓声，观千剑而后识器 ——《文心雕龙•知音》</p>
<p style="text-indent: 18pt;">
<p style="text-indent: 18pt;">关键词：后台脚本, Perl,PHP,Python,Ruby,RoR,LAMP</p>
<p style="text-indent: 18pt;">摘要：简谈Perl、PHP、Python和Ruby</p>
<p><strong> </strong></p>
<p><span style="font-size: 18pt;"><span style="color: #3366ff;"><strong><span style="font-size: 18pt;">！</span></strong><strong><span style="font-size: 14pt;">预览</span></strong></span></span></p>
<p style="margin: 0cm 0cm 0pt 39pt; text-indent: -21pt;">·<span style="font-family: Times New Roman; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> </span>语言的发展趋势一定是动静结合、刚柔并济</p>
<p style="margin: 0cm 0cm 0pt 39pt; text-indent: -21pt;">·<span style="font-family: Times New Roman; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> </span>Perl凝练晦涩，Python优雅明晰，Ruby精巧灵动，PHP简明单纯</p>
<p style="margin: 0cm 0cm 0pt 39pt; text-indent: -21pt;">·<span style="font-family: Times New Roman; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> </span>或许优雅正是来自对细节和规范的重视</p>
<p style="margin: 0cm 0cm 0pt 39pt; text-indent: -21pt;">·<span style="font-family: Times New Roman; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> </span>（RoR）与Ruby结合之后，便如一只猱身而上灵猫，立刻衬托出Java和.NET大象般的身影</p>
<p style="text-indent: 18pt;">
<p><span style="font-size: 18pt;"><span style="color: #3366ff;"><strong><span style="font-size: 18pt;">？</span></strong><strong><span style="font-size: 14pt;">提问</span></strong></span></span></p>
<ul style="margin-top: 0cm;" type="disc">
<li>Perl、Python、Ruby和PHP各自有何特点？</li>
<li>为什么动态语言多作为轻量级的解决方案？</li>
<li>LAMP为什么受欢迎？</li>
<li>Ruby on Rails为什么会流行？</li>
<li>编程语言的发展趋势是什么？<span id="more-703"></span></li>
</ul>
<p><span style="font-size: 18pt;"><span style="color: #3366ff;"><strong><span style="font-size: 18pt;">：</span></strong><strong><span style="font-size: 14pt;">讲解</span></strong></span></span><strong> </strong></p>
<p style="text-indent: 18pt;">“剩下四种动态语言，我们将之归为后台脚本语言。”冒号说着画了张图表——</p>
<p style="text-indent: 18pt;">
<table style="border: medium none; border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 7.95pt; page-break-inside: avoid;">
<td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 365.45pt; height: 7.95pt; background-color: transparent;" colspan="2" width="487" valign="top">
<p align="center"><strong><span style="font-size: 10pt;">用户</span></strong></p>
</td>
</tr>
<tr style="height: 7.9pt; page-break-inside: avoid;">
<td style="padding: 0cm 5.4pt; width: 365.45pt; height: 7.9pt; background-color: transparent;" colspan="2" width="487" valign="top"><strong><span style="font-size: 10pt;">前台语言</span></strong><span style="font-size: 10pt;">：</span><span style="font-size: 10pt;">Visual Basic</span><span style="font-size: 10pt;">，</span><span style="font-size: 10pt;">Delphi</span><span style="font-size: 10pt;">，</span><span style="font-size: 10pt;">JavaScript</span></td>
</tr>
<tr style="height: 15.9pt;">
<td style="padding: 0cm 5.4pt; width: 131.4pt; height: 15.9pt; background-color: transparent;" width="175" valign="top"><strong><span style="font-size: 10pt;">平台语言</span></strong><span style="font-size: 10pt;">：</span><span style="font-size: 10pt;">Java</span><span style="font-size: 10pt;">，</span><span style="font-size: 10pt;">C#</span></td>
<td style="padding: 0cm 5.4pt; width: 234.05pt; height: 15.9pt; background-color: transparent;" width="312" valign="top"><strong><span style="font-size: 10pt;">后台脚本语言</span></strong><span style="font-size: 10pt;">：</span><span style="font-size: 10pt;">Perl</span><span style="font-size: 10pt;">，</span><span style="font-size: 10pt;">PHP</span><span style="font-size: 10pt;">，</span><span style="font-size: 10pt;">Python</span><span style="font-size: 10pt;">，</span><span style="font-size: 10pt;">Ruby</span></td>
</tr>
<tr style="height: 7.95pt; page-break-inside: avoid;">
<td style="padding: 0cm 5.4pt; width: 365.45pt; height: 7.95pt; background-color: transparent;" colspan="2" width="487" valign="top"><strong><span style="font-size: 10pt;">系统语言</span></strong><span style="font-size: 10pt;">：</span><span style="font-size: 10pt;">C</span><span style="font-size: 10pt;">，</span><span style="font-size: 10pt;">C++</span><span style="font-size: 10pt;">，</span><span style="font-size: 10pt;">D</span></td>
</tr>
<tr style="height: 7.9pt; page-break-inside: avoid;">
<td style="padding: 0cm 5.4pt; width: 365.45pt; height: 7.9pt; background-color: transparent;" colspan="2" width="487" valign="top">
<p align="center"><strong><span style="font-size: 10pt;">机器</span></strong></p>
</td>
</tr>
</tbody>
</table>
<p style="text-indent: 18pt;">引号听得仔细：“我记得您开始是把这些语言划分为C族静态语言、非C族静态语言和动态语言三类的。”</p>
<p style="text-indent: 18pt;">冒号解释：“那是按语法来划分的，偏重理论；现在是按应用来划分，偏重实践。”</p>
<p style="text-indent: 18pt;">句号旋即联想到：“这种分法貌似三层架构——前台语言对应表现层；平台语言和后台脚本语言对应业务逻辑层；系统语言对应数据层。”</p>
<p style="text-indent: 18pt;">“的确有几分神似，但千万不可混淆。”冒号提醒道，“三层架构（three-layer architecture）是模块设计上的逻辑划分<sup>[1]</sup>；而这里是按语言应用范围进行的物理划分——与用户交互的是<span style="text-decoration: underline;">前台语言</span>，与机器交互的是<span style="text-decoration: underline;">系统语言</span>，介于其中的为前台提供服务同时又需要底层系统服务的是<span style="text-decoration: underline;">后台语言</span>。”</p>
<p style="text-indent: 18pt;">逗号询问：“后台语言又细分成平台语言与后台脚本语言？”</p>
<p style="text-indent: 18pt;">“这是基于程序（program）与脚本（script）、静态与动态而分的。”冒号进行说明，“其实Perl，PHP，Python和Ruby都有自己的<span style="text-decoration: underline;">虚拟机</span>（virtual machine），从这种意义上说它们也可作为平台语言。但在实际应用中，它们没有Java平台和.NET平台那种整合凝聚力和核心作用，通常作为轻量级的解决方案。”</p>
<p style="text-indent: 18pt;">问号想探个究竟：“这是由于它们都是动态语言的缘故吗？”</p>
<p style="text-indent: 18pt;">冒号回答：“理论上动态语言同样能承担大型应用，但实践上它们多作为粘合语言或用于中小型应用。用句时髦的话来形容，暂时还是主流的配角或非主流的主角。毕竟在运行效率、类型安全、可用资源、开发工具、技术支持等方面，它们与Java、C#相比尚有一定差距。另外它们同属‘草根’语言，虽有开源社区的大力支持，在影响力上与后者未可同日而语。”</p>
<p style="text-indent: 18pt;">叹号揣测：“说不定在不久的将来，动态语言也会成为主流的主角。”</p>
<p style="text-indent: 18pt;">“世易时移，殊难逆料。但有一点可以肯定，语言的发展趋势一定是动静结合、刚柔并济。”冒号断言，“一方面以Java和C#为代表的静态语言中嫁接了动态语言的枝条；另一方面以Java和.NET为代表的平台与动态语言的交壤地带也在逐步扩大。比如JRuby允许Ruby与Java之间互相调用，类似的还有Jython、IronRuby、IronPython等等。此外值得一提的是，动态语言最活跃的舞台当数LAMP，L-A-M-P。”</p>
<p style="text-indent: 18pt;">引号接茬：“L是Linux，A是Apache，M是MySQL，P是PHP。这四大组件形成了一个完整的开源网络开发平台。”</p>
<p style="text-indent: 18pt;">冒号补充道：“P也可指Perl、Python，甚至Ruby。”</p>
<p style="text-indent: 18pt;">逗号调侃：“可惜Ruby的‘R’比‘P’多了一根尾巴。”</p>
<p style="text-indent: 18pt;">“有人为了自圆其说，干脆让P表示‘Programming language’，这下所有语言都囊括其中了。老外就喜欢玩这种首字母缩略（acronym）的文字游戏，尤其LAMP正好还有‘灯’的含义，寓意开源世界的一盏明灯，他们一定更得意了。”冒号语带调笑，“前面我们曾提及，网络应用是生长动态语言最肥沃的土壤，而LAMP就是这块土壤上搭建的平台。作为网络平台，LAMP以其开放灵活、开发迅速、部署方便、高可配置、安全可靠、成本低廉等特色而与Java平台和.NET平台鼎足三分，尤其受中小企业的欢迎。LAMP中Linux是操作系统，Apache是Web服务器，MySQL是数据库系统，而我们当下最关心的是‘P族语言’：PHP、Perl、Python还有Ruby。”</p>
<p style="text-indent: 18pt;">问号建议：“作为动态语言，它们的共性上节课已经谈了不少，能说说它们的个性吗？”</p>
<p style="text-indent: 18pt;">“它们的个性极为鲜明：<strong>Perl</strong><strong>凝练晦涩，Python</strong><strong>优雅明晰，Ruby</strong><strong>精巧灵动，PHP</strong><strong>简明单纯</strong>。先看老大哥Perl，它博采众家之长，综合了C语言的结构、sed的正则表达式、AWK的关联数组（associative array）、Lisp的表（list）和Unix Shell的命令，此外还有借鉴了一种语言，你们知道是哪种吗？”冒号忽然卖了个关子。</p>
<p style="text-indent: 18pt;">逗号猜想：“应该是某种OOP语言吧。”</p>
<p style="text-indent: 18pt;">“Perl中确有不少C++的影子，但它的对象模型在5.0以后才引入，典型的半路出家，远不如前面的特征那么自然。与其说是一种自然而然的发展，不如说是在OOP潮流裹挟下的一种身不由己的迎合。真正深入骨髓的借鉴是自然语言。”冒号给出了答案，“我们提过，Perl的发明者Larry Wall是一名语言学家，他认为程序语言应该与自然语言一样，简洁自然、易读易写、表达多样、不拘一格。Perl还有不少的格言或哲学，使得编程语言一改严谨刻板的面孔，散发出浓郁的人文气息。”</p>
<p style="text-indent: 18pt;">叹号幽了一默：“我见过Perl的代码，人文气息没闻出来，但我怀疑有乙醚气息——看一会就觉得晕晕乎乎的。”</p>
<p style="text-indent: 18pt;">众人大笑。</p>
<p style="text-indent: 18pt;">“有人仅用一行Perl代码就实现了RSA算法，你看了那还不得当场晕倒啊？”冒号打趣道，“Perl的各种魔符好似一把把锋利的剪刀，做起文本裁剪之类的工作来游刃有余。这是它最大的长处，当初Perl就是Wall用来做Unix系统管理的，以后在CGI上的广泛应用也得益于此。这也赋予Perl极强的粘合力，因而有‘internet上的胶带（duct tape）<sup>[2]</sup>’的说法。它又号称瑞士军刀，精练而复杂，实用而强大。但Perl过于灵活自由，缺乏规范，影响了程序的可读性、一致性、整洁性和可维护性。不熟悉该语言的固然如读天书，熟悉语言而不熟悉问题的也颇费思量。相比之下Python被认为是Perl有力的挑战者，不仅在于它天然的OO设计和丰富的类库，更重要的是它对程序员友好度大大超过Perl。Python也有一系列的被称为禅（Zen）的哲学，不少与Perl是针锋相对的。比如：Perl认为做一件事可以有多种方法，而Python认为一件事应该最好只有一种方法；Perl追求语言的表现力，Python追求简单优雅；Perl喜欢隐性暗示，Python强调显性明示；Perl强调紧凑，Python强调松散； Perl的语法和语义丰富，Python的语法和语义简单而类库丰富。或许Python最让人不习惯的是它对空白符敏感性。”</p>
<p style="text-indent: 18pt;">引号感到惊奇：“对空白符敏感？这个倒真怪异。”</p>
<p style="text-indent: 18pt;">冒号见惯不怪：“虽然有点违反习惯，但非常符合Python一贯的规范简洁的风格——一方面从语法上保证了良好的编码风格；另一方面，每个代码块不再需要起始的大括号或begin/end之类的，减少了的代码行数。顺便插一句，另外一种优雅的语言Haskell同样对空白符敏感，或许优雅正是来自对细节和规范的重视吧。此外许多人抱怨Python中的自引用self太多，殊不知这也是它倡导显式表达的一种体现。总的看来，Python主要的问题还是在性能效率上不尽如人意。”</p>
<p style="text-indent: 18pt;">叹号好奇地问：“Ruby怎么样？据说它将取代Java。”</p>
<p style="text-indent: 18pt;">“不要轻言‘取代’二字。”冒号规诫道，“Java没有取代C++，也不会被Ruby取代，至多只是一种再分配。不过Ruby的确是门很可爱的语言，兼具Perl的表现力和Python的可读性。Ruby背后最具特色的理念是：关注程序员使用语言时的感受超过语言本身的功能。通俗地说，兵器的称手比锋利更重要；文雅地说，应给予程序员更多的人文关怀。就拿<span style="text-decoration: underline;">代码块</span>（block）和<span style="text-decoration: underline;">迭代器</span>（iterator）来说，虽然均非Ruby首创，但其语法最为赏心悦目。类似的例子比比皆是。Ruby的元编程能力特别强，也是它高度灵活的一种体现，但并不是所有人都喜欢这种风格。Ruby的主要弱点有两个：一个与Python类似，在性能上还有待提高；另一个是它的线程由<span style="text-decoration: underline;">用户空间</span>（user space）而不是<span style="text-decoration: underline;">内核空间</span>（kernel space）来管理<sup>[3]</sup>，不能充分利用多核或多CPU。真正让Ruby变得炙手可热的是web应用框架 Ruby on Rails（RoR）的成功，它们还催生了Java平台上的Groovy语言和Groovy on Grails框架。RoR奉行的CoC（Convention over Configuration）和DRY（Don&#8217;t repeat yourself ）原则以及MVC架构看似了无新意，但与Ruby结合之后，便如一只猱身而上灵猫，立刻衬托出Java和.NET大象般的身影。”</p>
<p style="text-indent: 18pt;">逗号有些怀疑：“框架竟然捧红了语言，框架真有这么重要吗？”</p>
<p style="text-indent: 18pt;">“如果web应用中动态页面较少或业务逻辑不复杂，框架的价值并不大。以前CGI编程就是往Perl之类的代码中嵌入HTML代码，如同Java中的Servlet；PHP则单纯地在HTML代码中插入PHP代码，如同早期的JSP。没有MVC，也不管什么三层架构，更没有ORM。但是——”冒号拖了个转折音，“一旦业务逻辑变得复杂，开发人员增多，手工作坊式编程开始捉襟见肘，引入框架这个流水生产线来提高生产力便是大势所趋。”</p>
<p style="text-indent: 18pt;">句号不解：“我想Perl、Python和PHP一定也有不少框架，Java中的框架更是泛滥成灾，何以独独RoR脱颖而出？”</p>
<p style="text-indent: 18pt;">冒号作出分析：“正值web2.0和敏捷开发（agile development）的概念流行之际，RoR将AJAX与Ruby组合在一起成为绝佳的回应。以前各种web应用框架是不少，但在RoR之前轻量级套餐式解决方案并不多。Perl中的Catalyst、Python中的Pylon还有PHP中的CakePHP等应是效仿之作。因此RoR出现的时机可说是不早不晚，正当其时。此外，Perl和PHP由于过于流行，反而有不少的历史包袱，人们习惯了将表示逻辑和业务逻辑编织在一起。至于Java企业解决方案，框架太多，搭配组合更多，增加了选择的难度。即使采用最常见的轻量级SSH（Struts+Spring+Hibernate）组合，维护起来也比RoR繁杂得多。”</p>
<p style="text-indent: 18pt;">叹号愈发担忧：“听这意思，Java还是危险啊！”</p>
<p style="text-indent: 18pt;">“言之过早。”冒号不以为然，“首先RoR还有待进一步检验，目前无论是应用广度还是深度上尚无法与Java相提并论；其次Java在性能、安全等方面还是有不少优势，而这些对于大型和关键性的应用来说尤为重要。即使在中小型web应用中，RoR较之PHP还远为不及。”</p>
<p style="text-indent: 18pt;">问号接下话题：“PHP为何如此流行？”</p>
<p style="text-indent: 18pt;">“因为它简单、专一。”冒号答得很干脆，“与Python和Ruby一开始就定位通用语言不同，PHP是专为网络而生的。同早期的Perl相似，PHP起初主要起文本过滤器的作用，只不过Perl多处理文件流（file stream），而PHP多处理套接字流（socket stream）。PHP的语法简单，且为网络应用度身定造，受到网络开发人员的追捧当在情理之中。它虽很实用很流行，但并不完美。比如：变量名大小写敏感而函数名大小写不敏感；函数命名规则不一致；不支持namespace和unicode<sup>[4]</sup>；与Perl一样，它的对象模型不是先天的，直到PHP 5才真正完善；对线程支持不足；相比Perl、Python和Ruby，它的功能稍显单薄等等。”</p>
<p style="text-indent: 18pt;">引号突然想起：“我记得您在第一堂课提到PHP还能用于桌面应用。”</p>
<p style="text-indent: 18pt;">“不仅PHP，Perl、Python还有Ruby，都能作为前台语言来开发命令行或图形界面的应用。同样地，VB、Delphi和JavaScript也 能作为后台语言。现代的程序语言既有自己的专长，又向通用化和全能化发展，以争取更多的生存空间。试想一下，现代的程序员又何尝不是如此呢？”言及于此， 冒号收住话题，“语言简评告一段落，还有不少既有趣又有用的语言，在此就不一一评说了。我们看到，每种编程语言都有其独特的惯例用法和哲学理念，它们与编 程范式一道形成了语言的编程风格。体悟愈深者编程语感愈强，思维与语言愈交融无碍，渐从必然王国走向自由王国。”</p>
<p style="text-indent: 18pt;">逗号满怀憧憬：“那是不是一种人剑合一的境界？”</p>
<p style="text-indent: 18pt;">“或许人器合一更准确吧，程序员可不能只会一种兵器哟。”冒号故意抠他的字眼，“现在请大家每人写一句对本节课的感言。”</p>
<p style="text-indent: 18pt;">众人沉思片刻，齐齐挥笔而就——</p>
<p style="text-indent: 18pt;"><strong>叹号——没有最好的语言，只有最合适的语言。</strong></p>
<p style="text-indent: 18pt;"><strong>逗号——没有糟糕的语言，只有糟糕的程序员。</strong></p>
<p style="text-indent: 18pt;"><strong>问号——没有一种语言是万能的，只会一种语言是万万不能的。</strong></p>
<p style="text-indent: 18pt;"><strong>引号——废除对语言的宗教信仰，建立对语言的哲学思维。 </strong></p>
<p style="text-indent: 18pt;"><strong>句号——编程就是在人脑和电脑之间寻找最佳平衡点的过程。</strong></p>
<p style="text-indent: 18pt;">
<p style="text-indent: 18pt;">冒号读罢大悦，顺手一掌拍出五记马屁：“精彩之极！可谓字字珠玑、句句联璧啊。兹决定，给诸位的奖赏是——立时下课！”</p>
<p style="text-indent: 18pt;">众人欣然领赏而去。</p>
<p style="text-indent: 18pt;">
<p><span style="font-size: 18pt;"><span style="color: #3366ff;"><strong><span style="font-size: 18pt;">，</span></strong><strong><span style="font-size: 14pt;">插语</span></strong></span></span></p>
<p>[1] 有两种三层架构，一种是three-layer architecture，一种是three-tier architecture。它们经常换用，但其实是有分别的：前者仅仅在逻辑进行划分，而后者在物理上也进行了划分——不同层次的模块运行在不同的主机上。</p>
<p>[2] 不少地方译作‘输送带’、‘传送带’，因为duct有‘输送管’、‘导管’之意，于是想当然地认为这表明Perl在internet上起着输送作用。殊不知‘duct type’专指一种万能的粘性极强的胶带，用以比喻Perl的粘合力。</p>
<p>[3] 这类线程被称为绿色线程（green thread），也称伪线程。据称Ruby2.0将支持原生线程（native thread）。</p>
<p>[4] PHP将在5.3.0支持namespace，将在6.0支持unicode。</p>
<p><strong> </strong></p>
<p><span style="font-size: 18pt;"><span style="color: #3366ff;"><strong><span style="font-size: 18pt;">。</span></strong><strong><span style="font-size: 14pt;">总结</span></strong></span></span></p>
<ul style="margin-top: 0cm;" type="disc">
<li>比起Java平台和.NET平台，动态语言轻便灵活、开发效率高，但整合凝聚力还不够，在运行效率、类型安全、可用资源、开发工具、技术支持以及影响力等方面也有一定差距，故通常作为轻量级的解决方案。</li>
<li>LAMP是由Linux、Apache、MySQL和包括PHP、Perl、Python或Ruby在内的脚本语言组成的网络开发平台，具有开放灵活、开发迅速、部署方便、高可配置、安全可靠、成本低廉等优点。</li>
<li>Perl精练、复杂、强大、灵活、自由、隐晦、表现力强，但规范性、可读性、一致性、整洁性和可维护性较差。</li>
<li>Python优雅规范、简洁明晰、易学易用、类库丰富，但效率稍差，有些人不喜欢它对空白符敏感的特性。</li>
<li>Ruby语法精巧、高度灵活，兼具Perl的表现力和Python的可读性，尤其注重程序员的感受，但其性能和线程模型尚有待改进。</li>
<li>PHP简单、专一、实用、流行，在但相比其他三种语言，在语法和功能上稍有欠缺。</li>
<li>RoR是一种轻量级套餐式的web应用解决方案，是由好的设计（MVC架构和CoC、DRY原则）加上好的语言（Ruby）在好的时机（web2.0和敏捷开发风行之际）打造出的好的框架。</li>
<li>静态语言与动态语言从语言特征到运行环境都在逐渐融合。</li>
<li>程序员应该与程序语言一样，既要有自己的专长，又要向通用化和全能化发展。</li>
<li>编程语言惯例用法、哲学理念和编程范式形成了语言的编程风格。</li>
</ul>
<p><strong><span style="font-size: 18pt;"><span style="color: #3366ff;"><strong><span style="font-size: 18pt;">“”</span></strong><strong><span style="font-size: 14pt;">参考</span></strong></span></span></strong></p>
<p style="text-indent: 18pt;">[1] Larry Wall, Tom Christiansen, Jon Orwant．Programming Perl, 3<sup>rd</sup> ed.．Sebastopol, CA：O&#8217;Reilly，2000</p>
<p style="text-indent: 18pt;">[2] Mark Lutz, David Ascher．Learning Python, 2<sup>nd</sup> ed.．Sebastopol, CA：O&#8217;Reilly，2003</p>
<p style="text-indent: 18pt;">[3] Michael Fitzgerald．Learning Ruby．Sebastopol, CA：O&#8217;Reilly，2007</p>
<p style="text-indent: 18pt;">[4] Michele E. Davis, Jon A. Phillips．Learning PHP &amp; MySQL, 2<sup>nd</sup> ed.．Sebastopol, CA：O&#8217;Reilly，2007</p>
<p style="text-indent: 18pt;">
<p style="text-indent: 18pt;">
<p><strong>课后思考</strong></p>
<ul style="margin-top: 0cm;" type="disc">
<li>有人认为掌握的语言过多，容易互相混淆，不如精学一门。你认为呢?</li>
<li>在实际编程中，你有选择编程语言的权力吗？如果有，选择的原则是什么？</li>
<li>在前台编程、后台编程和系统编程中，你主要专注于哪方面？你认为它们之间的主要差别在哪里？</li>
<li><span style="color: #ff0000;">你所熟悉的编程语言有哪些惯例用法和哲学理念？</span></li>
<li><span style="color: #ff0000;">试着学习一门新的语言，最好与目前掌握的知识集合互补。</span></li>
</ul>
<p><strong><span style="color: #000000;">Felix: 各位phper，最后的两个课后思考，你个人有着什么样的答案？</span></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://20year.cn/blog/2009/07/25/%e6%af%94%e8%be%83perl%e3%80%81php%e3%80%81python%e3%80%81java%e5%92%8cruby/feed/</wfw:commentRss>
		<feedburner:origLink>http://20year.cn/blog/2009/07/25/%e6%af%94%e8%be%83perl%e3%80%81php%e3%80%81python%e3%80%81java%e5%92%8cruby/</feedburner:origLink></item>
		<item>
		<title>『转载』Unix-Center.Net需要您的帮助</title>
		<link>http://feedproxy.google.com/~r/20year/~3/z7bPL0bVRTY/</link>
		<comments>http://20year.cn/blog/2009/07/23/%e3%80%8e%e8%bd%ac%e8%bd%bd%e3%80%8funix-centernet%e9%9c%80%e8%a6%81%e6%82%a8%e7%9a%84%e5%b8%ae%e5%8a%a9/#comments</comments>
		<pubDate>Thu, 23 Jul 2009 10:27:55 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
		
		<category><![CDATA[科普]]></category>

		<guid isPermaLink="false">http://20year.cn/blog/?p=698</guid>
		<description><![CDATA[我恳请诸位花一点时间读完这篇文章，因为将有数以万计的人会从您的爱心中得到帮助。

Unix-Center.Net的目标是为研究、学习和使用各种版本的Unix和类Unix操作系统的教师、学生和工程技术人员提供一个体验和测试各种版本的Unix和类Unix系统的软硬件平台。该平台能够为所有注册用户免费提供SSH/VNC服务，MySQL数据库服务，传统的C/C++、 Java、Fortran等多种语言开发环境，基于Apache、MySQL和PHP的Web应用开发环境。简单地讲，Unix-Center.Net的注册用户可以远程登录进入多个不同的操作系统，具备自己独立的用户空间和磁盘配额，享受该操作系统上普通用户的所有权限，学习和使用各种版本的Unix和类Unix操作系统的常用命令和功能，可以将自己正在开发的应用程序上载到Unix体验中心的服务器，在不同的软硬件平台上编译和运行。]]></description>
			<content:encoded><![CDATA[<p>我恳请诸位花一点时间读完这篇文章，因为将有数以万计的人会从您的爱心中得到帮助。</p>
<p>Unix-Center.Net的目标是为研究、学习和使用各种版本的Unix和类Unix操作系统的教师、学生和工程技术人员提供一个体验和测试 各种版本的Unix和类Unix系统的软硬件平台。该平台能够为所有注册用户免费提供SSH/VNC服务，MySQL数据库服务，传统的C/C++、 Java、Fortran等多种语言开发环境，基于Apache、MySQL和PHP的Web应用开发环境。简单地讲，Unix-Center.Net的 注册用户可以远程登录进入多个不同的操作系统，具备自己独立的用户空间和磁盘配额，享受该操作系统上普通用户的所有权限，学习和使用各种版本的Unix和 类Unix操作系统的常用命令和功能，可以将自己正在开发的应用程序上载到Unix体验中心的服务器，在不同的软硬件平台上编译和运行。<span id="more-698"></span></p>
<p>到目前为止，Unix-Center.Net所提供的操作系统包括AIX 5.3，Solaris 10，OpenSolaris 2009.06，Fedora Core 10，Ubuntu 8.04，FreeBSD 6.2，Debian Linux for MIPS。这些操作系统分别运行在IBM Power 5，Sun UltraSPARC T1，AMD Opteron，Intel Xeon，龙芯2E等不同构架的处理器上。各种各样的服务器，再加上交换机、防火墙、存储等等，Unix-Center.Net的全部设备需要整整三个机 柜才能够装得下。</p>
<p>中国大陆的网络环境很独特。拿各个大学的接入情况来看，清华北大等高校是通过中国教育科研网（CERNET）接入互联网的，以中科院为代表的一大批 科研院所访问国内网站是需要先从国外绕一大圈再绕回来的，南方相当多的高校是通过公网（网通、联通、电信）接入互联网的。由于Unix- Center.Net的主要服务对象是学生，所以选择将服务器托管在互连互通条件比较好的北京赛尔机房，不然的话大部分学生访问起来都有困难。</p>
<p>这个网站不是政府所设置的开放实验室，也不是任何网络公司投资的创新项目。它是我的个人网站。</p>
<p>做这样一个网站的缘起很简单。因为工作的关系，我注意到很多高校 －－ 即使是非常好的高校 －－ 也没有办法给学生提供一个全面的环境来学习操作系统。大部分学校的机房，运行的操作系统清一色的是Windows。极少数学校的机房可以提供一两个版本的 Unix或者是Linux操作系统，但是和市面上版本繁多的操作系统相比较，可以选择的余地是在太少。在处理器构架方面，基本上都是x86/x64处理 器，学生可能听说过其他种类的处理器，但是基本上没有机会见到，更不用说是使用了。因此，我萌发了一个极其简单的想法：买一些不同构架的服务器，安装上不 同种类的操作系统，托管到一个机房，开放注册账号，免费地提供SSH登录服务。我是一个急性子的人，想到的事情就要赶紧去做，于是Unix- Center.Net的雏形在2007年初上线了。我没有想到的是，在短短的时间里便有上万名用户注册到这个系统，并且对系统功能提出了更多的需求。于是 我赶紧添加新的服务器，并且恳求朋友帮忙开发一些必要的程序，逐渐完善这个系统的功能。</p>
<p>我于2000年底硕士毕业之后，在美国工作了三年，又在中国工作了六年。在过去的两年半中，这个系统烧掉了我大部分的工资和积蓄。购买各种服务器设 备的费用，大概是70万人民币；北京赛尔机房的服务器托管和带宽费用，大概是每年30万人民币。（由于Unix-Center.Net对于推广我的雇主的 操作系统有很大的帮助，我的雇主曾经在我的游说之下为Unix-Center.Net提供了半年的带宽费用。但是考虑到Unix-Center.Net同 时提供其他种类的操作系统，我的雇主后来中止了对Unix-Center.Net的支持。）和我同年龄的人，现在大部分都有车有房了吧。而我最值钱的资 产，是在保安严密的机房中的三个机柜。</p>
<p>我曾经和国家负责推广Linux和开源技术的机构取得联系，也曾经和某些教育部门取得联系，希望能够得到他们的支持。但是“有关部门”的负责人听取 了我的陈述之后，不约而同地摇摇头，说：“你这个事情做得很好。很遗憾我们不能够给你提供任何帮助。”我也曾经考虑过将这个网站用商业化的模式来运作，但 是这个公益性平台所服务的对象大部分是穷学生和穷教师，暂时并没有盈利的空间。并且，我自认为我是一个做事的人，而不是一个做生意的人。让我自己来运营一 家公司的话，赚钱的可能性并不大。</p>
<p>中国是一个发展中国家，我们有很多教师、学生和工程人员希望能够学习Unix/Linux系统，却又苦于没有合适的环境和条件。Unix- Center.Net存在的目的，就是给这些爱好Unix/Linux的人一个学习和练习的条件。用一个简单的数据来说，到2009年6 月底，Unix-Center.Net的注册用户接近9 万人。我不知道这么多人都在这些服务器上做什么事情，但是我相信这些服务器对他们有用。譬如说，清华大学教授操作系统课程的一位教授告诉我说他让学生们到 Unix-Center.Net来对不同的操作系统进行比较。又譬如说，我收到中国科技大学一位博士生的电子邮件，说是他利用这些服务器完成了毕业论文中 比较关键的一些计算。这些有限的证言，让我坚信这个系统是有其存在的意义的。尽管没有获得“有关部门”的支持，我从来都没有想过要放弃。</p>
<p>坦率地说，我现在遇到了一些困难。我所在的公司，在这次经济危机中被收购了。我不能够确定将来我是否还有能力将这个系统支持下去。但是我非常希望能 够维持这个系统的运行，因为它确实对很多人有用。如果您也相信这一点的话，我希望您能够帮助我将这个系统维持下去。不管是10元、100元还是1000 元，对于Unix-Center.Net的用户来说都是莫大的帮助。</p>
<p>如果您在中国，您可以将您的捐款通过转帐支付给我的个人银行账号：</p>
<p>中国银行北京市分行清华园支行<br />
蒋清野<br />
4563-5101-0088-4741-228</p>
<p>招商银行北京市分行清华园支行<br />
蒋清野<br />
6226-0901-0156-8117</p>
<p>支付宝账户<br />
13511026844</p>
<p>如果您在国外，您可以将您的捐款通过PayPal支付给我的个人账号（qjiang@ieee.org），或者是通过转帐支付到我在CitiBank的个人账号：</p>
<p>CitiBank<br />
FDIC Routing #: 321171184<br />
Account Name: Qingye Jiang<br />
Account #: 40038862963<br />
Debit Card #:5262-2519-8546-8207</p>
<p>我还恳请您在捐款之后给我发一封电子邮件（电子邮件地址qjiang@ieee.org），详细说明您的个人姓名以及捐款数目，以便我定期地整理和公布<a href="http://www.unix-center.net/?p=134">捐款情况</a>。</p>
<p>如果您希望进一步了解关于我个人的情况，欢迎您访问我个人的博客http://www.qyjohn.net/。</p>
<p>如果您希望进一步了解关于Unix-Center.Net的情况，欢迎您访问Unix-Center.Net的网站http://www.unix-center.net/?page_id=2。</p>
<p>如果您愿意进一步帮助Unix-Center.Net，请您将这篇文章转贴到您认为合适的论坛、社区，或者是转发给您的同事和朋友。</p>
<p>这一件事情，纯粹是我的个人行为。但是我仍然希望我能够代表Unix-Center.Net的用户对您说一声：谢谢您的爱心，谢谢您的支持。</p>
<p>蒋清野<br />
2009年7 月13日</p>
]]></content:encoded>
			<wfw:commentRss>http://20year.cn/blog/2009/07/23/%e3%80%8e%e8%bd%ac%e8%bd%bd%e3%80%8funix-centernet%e9%9c%80%e8%a6%81%e6%82%a8%e7%9a%84%e5%b8%ae%e5%8a%a9/feed/</wfw:commentRss>
		<feedburner:origLink>http://20year.cn/blog/2009/07/23/%e3%80%8e%e8%bd%ac%e8%bd%bd%e3%80%8funix-centernet%e9%9c%80%e8%a6%81%e6%82%a8%e7%9a%84%e5%b8%ae%e5%8a%a9/</feedburner:origLink></item>
		<item>
		<title>2001年计算机等级考试三级数据库-论述题之一</title>
		<link>http://feedproxy.google.com/~r/20year/~3/mocL1dx4QGQ/</link>
		<comments>http://20year.cn/blog/2009/07/23/2001%e5%b9%b4%e8%ae%a1%e7%ae%97%e6%9c%ba%e7%ad%89%e7%ba%a7%e8%80%83%e8%af%95%e4%b8%89%e7%ba%a7%e6%95%b0%e6%8d%ae%e5%ba%93-%e8%ae%ba%e8%bf%b0%e9%a2%98%e4%b9%8b%e4%b8%80/#comments</comments>
		<pubDate>Thu, 23 Jul 2009 09:57:29 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
		
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://20year.cn/blog/?p=696</guid>
		<description><![CDATA[应聘考核的几道数据库论述题，其实都来源于全国计算机等级考试！贴到这里给我的数据库知识补习、加油
计算机等级考试三级数据库 2001
(l)、为了维护数据库的参照完整性，当删除被参照关系的元组时，系统可能采取哪些做法？（15分）
(2)、若有学生关系S(S#,SNAME,SEX,AGE)，其主键为S#；选课关系SC(S#,C#,GRADE)，其主键为(S#，C#)，且 S.S#=SC.S#。假定学生号为‘01001’的学生离开学校不再回来了，为此若删除关系S中S#=‘01001’的元组时，如果关系SC中有4个元组的S#=‘01001’，应该选用哪一种做法？为什么？（15分）
答案:
(1)、为了维护数据库的参照完整性，当删除被参照关系的元组时，系统可能采取如下三种做法（每种做法得5分）：
l)级联删除(cascades)：即，当删除被参照关系的元组时，同时将参照关系中所有外键值与被参照关系中要被删除元组的主键值相等（相对应）的元组一起删除。
2)拒绝删除(restricted)：即，只当参照关系中没有任何元组的外键值与被参照关系中要被删除的元组的主键值相等（相对应）时，系统才执行该删除操作，否则拒绝执行该删除操作。
3)置空值删除(nullfies)：即，当删除被参照关系的元组时，同时将参照关系中所有与被参照关系中要被删除元组的主健值相等(相对应)的外键值都置为空值。
(2)、对于本题的情况，应该选用第一种做法。即，将关系SC中S#=‘01001’的4个元组也一起删除。(得10分)
因为当一个学生离开学校不再回来，他的个人信息记录若从S关系中删除了，那么他的选课信息记录就没有保存的必要，也应随之从SC关系中删除。(得5分)
]]></description>
			<content:encoded><![CDATA[<p>应聘考核的几道数据库论述题，其实都来源于全国计算机等级考试！贴到这里给我的数据库知识补习、加油</p>
<p><strong>计算机等级考试三级数据库 2001</strong></p>
<p>(l)、为了维护数据库的参照完整性，当删除被参照关系的元组时，系统可能采取哪些做法？（15分）<br />
(2)、若有学生关系S(S#,SNAME,SEX,AGE)，其主键为S#；选课关系SC(S#,C#,GRADE)，其主键为(S#，C#)，且 S.S#=SC.S#。假定学生号为‘01001’的学生离开学校不再回来了，为此若删除关系S中S#=‘01001’的元组时，如果关系SC中有4个元组的S#=‘01001’，应该选用哪一种做法？为什么？（15分）</p>
<p>答案:<br />
(1)、为了维护数据库的参照完整性，当删除被参照关系的元组时，系统可能采取如下三种做法（每种做法得5分）：<br />
l)级联删除(cascades)：即，当删除被参照关系的元组时，同时将参照关系中所有外键值与被参照关系中要被删除元组的主键值相等（相对应）的元组一起删除。<br />
2)拒绝删除(restricted)：即，只当参照关系中没有任何元组的外键值与被参照关系中要被删除的元组的主键值相等（相对应）时，系统才执行该删除操作，否则拒绝执行该删除操作。<br />
3)置空值删除(nullfies)：即，当删除被参照关系的元组时，同时将参照关系中所有与被参照关系中要被删除元组的主健值相等(相对应)的外键值都置为空值。<br />
(2)、对于本题的情况，应该选用第一种做法。即，将关系SC中S#=‘01001’的4个元组也一起删除。(得10分)<br />
因为当一个学生离开学校不再回来，他的个人信息记录若从S关系中删除了，那么他的选课信息记录就没有保存的必要，也应随之从SC关系中删除。(得5分)</p>
]]></content:encoded>
			<wfw:commentRss>http://20year.cn/blog/2009/07/23/2001%e5%b9%b4%e8%ae%a1%e7%ae%97%e6%9c%ba%e7%ad%89%e7%ba%a7%e8%80%83%e8%af%95%e4%b8%89%e7%ba%a7%e6%95%b0%e6%8d%ae%e5%ba%93-%e8%ae%ba%e8%bf%b0%e9%a2%98%e4%b9%8b%e4%b8%80/feed/</wfw:commentRss>
		<feedburner:origLink>http://20year.cn/blog/2009/07/23/2001%e5%b9%b4%e8%ae%a1%e7%ae%97%e6%9c%ba%e7%ad%89%e7%ba%a7%e8%80%83%e8%af%95%e4%b8%89%e7%ba%a7%e6%95%b0%e6%8d%ae%e5%ba%93-%e8%ae%ba%e8%bf%b0%e9%a2%98%e4%b9%8b%e4%b8%80/</feedburner:origLink></item>
		<item>
		<title>『转』二十年后的汽车——只能用时尚来解释了</title>
		<link>http://feedproxy.google.com/~r/20year/~3/IB0hyK83jXg/</link>
		<comments>http://20year.cn/blog/2009/06/20/%e3%80%8e%e8%bd%ac%e3%80%8f%e4%ba%8c%e5%8d%81%e5%b9%b4%e5%90%8e%e7%9a%84%e6%b1%bd%e8%bd%a6%e2%80%94%e2%80%94%e5%8f%aa%e8%83%bd%e7%94%a8%e6%97%b6%e5%b0%9a%e6%9d%a5%e8%a7%a3%e9%87%8a%e4%ba%86/#comments</comments>
		<pubDate>Sat, 20 Jun 2009 08:41:48 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
		
		<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://20year.cn/blog/?p=689</guid>
		<description><![CDATA[还要多久汽车就能与交通控制系统进行连通互动？未来世界里还会有交通堵塞吗？驾驶零排放的汽车是否依然充满乐趣？

1.借由Car-to-X网络架构，当驾驶“一元”概念车欲驶上高速公路系统时，控制中心得以视现行路况，告知驾驶者适当的时机和车速，使车辆得以汇入高速公路车流之中。而在市区交通尖峰时段，藉由沟通网络，同向车辆也能形成列车般的车流，在控制中心的规划下，以同步速度前进，并搭配交通信号标志，以达到最为顺畅的市区交通情形。

2.未来，在特别规划的高速公路上，“空间”概念车所搭载的驾驶辅助系统、智慧型交通管理系统和卫星导航系统整合，将可提供相当精确且安全的自动驾驶功能。而“空间”概念车也能储存记录驾驶人的各式驾驶习惯，更能够在驾驶上车之际，便自电脑或PDA下载驾驶当日的行程，以精算出最佳化的驾驶路径。

3.在“自我”概念车上，Volkswagen也展示出未来零排放汽车的理想模型。在Hybrid动力系统架构下，未来内燃机将不再直接传动车辆，而是产生电力供电动马达驱动车辆。而更长期的目标，Volkswagen则着重于燃料电池车辆的研发，以达到最终零排放汽车的理想。
在一个专题网站上，大众汽车描绘了20年后的汽车世界。你进入到这个设计精美、充满未来科技感的网站后，可通过一部互动式短片了解丰富的信息并听取充满趣味的介绍，探寻20年后大众汽车的移动解决方案。在这部以20年后汽车世界为背景的影片中，一位父亲向儿子讲述着20年前的交通工具。
]]></description>
			<content:encoded><![CDATA[<p>还要多久汽车就能与交通控制系统进行连通互动？未来世界里还会有交通堵塞吗？驾驶零排放的汽车是否依然充满乐趣？<br />
<img class="alignnone size-full wp-image-690" title="car one" src="http://20year.cn/blog/wp-content/uploads/2009/06/2008122103123865.jpg" alt="car one" width="500" height="343" /><br />
1.借由Car-to-X网络架构，当驾驶“一元”概念车欲驶上高速公路系统时，控制中心得以视现行路况，告知驾驶者适当的时机和车速，使车辆得以汇入高速公路车流之中。而在市区交通尖峰时段，藉由沟通网络，同向车辆也能形成列车般的车流，在控制中心的规划下，以同步速度前进，并搭配交通信号标志，以达到最为顺畅的市区交通情形。<br />
<img class="alignnone size-full wp-image-691" title="car two" src="http://20year.cn/blog/wp-content/uploads/2009/06/2008122103144711.jpg" alt="car two" width="500" height="274" /><br />
2.未来，在特别规划的高速公路上，“空间”概念车所搭载的驾驶辅助系统、智慧型交通管理系统和卫星导航系统整合，将可提供相当精确且安全的自动驾驶功能。而“空间”概念车也能储存记录驾驶人的各式驾驶习惯，更能够在驾驶上车之际，便自电脑或PDA下载驾驶当日的行程，以精算出最佳化的驾驶路径。<br />
<img class="alignnone size-full wp-image-692" title="car three" src="http://20year.cn/blog/wp-content/uploads/2009/06/200812210324697.jpg" alt="car three" width="500" height="277" /><br />
3.在“自我”概念车上，Volkswagen也展示出未来零排放汽车的理想模型。在Hybrid动力系统架构下，未来内燃机将不再直接传动车辆，而是产生电力供电动马达驱动车辆。而更长期的目标，Volkswagen则着重于燃料电池车辆的研发，以达到最终零排放汽车的理想。</p>
<p>在一个专题网站上，大众汽车描绘了20年后的汽车世界。你进入到这个设计精美、充满未来科技感的网站后，可通过一部互动式短片了解丰富的信息并听取充满趣味的介绍，探寻20年后大众汽车的移动解决方案。在这部以20年后汽车世界为背景的影片中，一位父亲向儿子讲述着20年前的交通工具。</p>
]]></content:encoded>
			<wfw:commentRss>http://20year.cn/blog/2009/06/20/%e3%80%8e%e8%bd%ac%e3%80%8f%e4%ba%8c%e5%8d%81%e5%b9%b4%e5%90%8e%e7%9a%84%e6%b1%bd%e8%bd%a6%e2%80%94%e2%80%94%e5%8f%aa%e8%83%bd%e7%94%a8%e6%97%b6%e5%b0%9a%e6%9d%a5%e8%a7%a3%e9%87%8a%e4%ba%86/feed/</wfw:commentRss>
		<feedburner:origLink>http://20year.cn/blog/2009/06/20/%e3%80%8e%e8%bd%ac%e3%80%8f%e4%ba%8c%e5%8d%81%e5%b9%b4%e5%90%8e%e7%9a%84%e6%b1%bd%e8%bd%a6%e2%80%94%e2%80%94%e5%8f%aa%e8%83%bd%e7%94%a8%e6%97%b6%e5%b0%9a%e6%9d%a5%e8%a7%a3%e9%87%8a%e4%ba%86/</feedburner:origLink></item>
		<item>
		<title>『转』PHP的PEAR::HTML_AJAX类库应用（一）</title>
		<link>http://feedproxy.google.com/~r/20year/~3/nsDFWthU9a0/</link>
		<comments>http://20year.cn/blog/2009/06/07/%e3%80%8e%e8%bd%ac%e3%80%8fphp-pear-html_ajax-1/#comments</comments>
		<pubDate>Sun, 07 Jun 2009 08:31:17 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
		
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://20year.cn/blog/?p=683</guid>
		<description><![CDATA[PHP的PEAR::HTML_AJAX类库应用
HTML_AJAX下载：http://pear.php.net/package/HTML_AJAX/download
Pear:HTML_AJAX是一个相当成熟的Ajax框架,  使用JSON进行数据传输。內建丰富的例子，包括留言板、登录、grab…等等。
简单的例子：
Setting up a server
You can use HTML_AJAX in many different ways but most setups use an instance of HTML_AJAX_Server to deliver both the javascript libraries and to handle AJAX requests from browsers.
A basic server is shown below, in the file  server.php:

&#60;?php
//a session is required(you can also set session.auto_start=1 in php.ini)
session_start();

include 'HTML/AJAX/Server.php';

$server = [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #ff0000;">PHP的PEAR::HTML_AJAX类库应用</span></p>
<p><strong><span style="text-decoration: underline;">HTML_AJAX下载</span></strong>：<a href="http://pear.php.net/package/HTML_AJAX/download" target="_blank">http://pear.php.net/package/HTML_AJAX/download</a></p>
<p>Pear:HTML_AJAX是一个相当成熟的Ajax框架,  使用JSON进行数据传输。內建丰富的例子，包括留言板、登录、grab…等等。</p>
<p><strong>简单的例子：</strong></p>
<h2>Setting up a server</h2>
<p>You can use HTML_AJAX in many different ways but most setups use an instance of HTML_AJAX_Server to deliver both the javascript libraries and to handle AJAX requests from browsers.</p>
<p>A basic server is shown below, in the file  <strong>server.php</strong>:</p>
<pre><code><span style="color: #000000;">
<span style="color: #0000bb;"><span style="font-family: NSimsun;">&lt;?php
</span></span><span style="font-family: NSimsun;"><span style="color: #ff8000;">//a session is required(you can also set session.auto_start=1 in php.ini)
</span><span style="color: #0000bb;">session_start</span></span><span style="font-family: NSimsun;"><span style="color: #007700;">();

include </span><span style="color: #dd0000;">'HTML/AJAX/Server.php'</span></span><span style="font-family: NSimsun;"><span style="color: #007700;">;

</span><span style="color: #0000bb;">$server </span><span style="color: #007700;">= new </span><span style="color: #0000bb;">HTML_AJAX_Server</span></span><span style="font-family: NSimsun;"><span style="color: #007700;">();
</span><span style="color: #0000bb;">$server</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">handleRequest</span></span><span style="font-family: NSimsun;"><span style="color: #007700;">();
</span><span style="color: #0000bb;">?&gt;</span> </span></span></code></pre>
<p>This basic setup gives you access to the HTML_AJAX javascript libraries, which will allow you to do basic AJAX actions like replacing the content of a div with the output of a url on your server.</p>
<p>Let us now create a new webpage with a div container and a button. Whenever we push the button we want to fetch some data and update the div container. Save the file as <strong>page.html</strong>:</p>
<pre><code><span style="font-family: NSimsun;">&lt;html&gt;

&lt;script type="text/javascript" src="server.php?client=all"&gt;&lt;/script&gt;
&lt;div id="target"&gt;I'm the target&lt;/div&gt;
&lt;script type="text/javascript"&gt;
HTML_AJAX.replace('target','output.php');
&lt;/script&gt;
   &lt;form&gt;
      &lt;input type="button" onclick="HTML_AJAX.replace('target','output.php');" value="Update target"&gt;
   &lt;/form&gt;
&lt;/html&gt;</span></code></pre>
<p>This will load the content of output.php into the &lt;div&gt; with an ID of &#8220;target&#8221; when HTML_AJAX.replace() is called (i.e. when you push the button).</p>
<p>Now let&#8217;s create the file that generates the dynamic stuff. It could be anything, like fetching stuff from a database or whatever. For now we are going to get the local time, and we do it in the file <strong>output.php</strong>:</p>
<pre><code><span style="color: #000000;">
<span style="font-family: NSimsun;"><span style="color: #0000bb;">&lt;?php

   </span><span style="color: #007700;">print(</span><span style="color: #dd0000;">"&lt;h1&gt;"</span><span style="color: #007700;">. </span><span style="color: #0000bb;">strftime</span><span style="color: #007700;">(</span><span style="color: #dd0000;">"%H:%M:%S"</span><span style="color: #007700;">) .</span><span style="color: #dd0000;">"&lt;/h1&gt;"</span></span><span style="font-family: NSimsun;"><span style="color: #007700;">);
</span><span style="color: #0000bb;">?&gt;</span> </span></span></code></pre>
<p>There! Each time you press <strong>Update target</strong>, the target is  replaced with the current time. Now it&#8217;s up to your imagination to use this to  something more useful.</p>
]]></content:encoded>
			<wfw:commentRss>http://20year.cn/blog/2009/06/07/%e3%80%8e%e8%bd%ac%e3%80%8fphp-pear-html_ajax-1/feed/</wfw:commentRss>
		<feedburner:origLink>http://20year.cn/blog/2009/06/07/%e3%80%8e%e8%bd%ac%e3%80%8fphp-pear-html_ajax-1/</feedburner:origLink></item>
	</channel>
</rss>
