<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_态度决定高度、企图决定版图、格局决定结局</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/14643/rss</id><updated>2011-10-26T08:12:20Z</updated><author><name>flyingchen</name><uri>http://www.cnblogs.com/flyingchen/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/flyingchen/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/14643/rss"/><entry><id>http://www.cnblogs.com/flyingchen/archive/2011/10/26/2225339.html</id><title type="text">gcc的一个困惑</title><summary type="text">写了段简单的c代码，调用libcurl。网上有很多的例子，代码不提了。关键问题出在了gcc编译时。网络上流传的编译方式是gcc -lcurl curl_test.c; 以此方法，我的编译总是&amp;quot;undefined reference to `curl_easy_init&amp;#39;&amp;quot;,非常奇怪，大多同行遇到此问题时，是因为-lcurl没有加，造成无法找到curl库。我这里加上，也依然报同样的错误。最后无意见发现gcc curl_test.c -lcurl；竟然ok了。我是ubuntu11.10系统，gcc版本是4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu</summary><published>2011-10-26T08:12:00Z</published><updated>2011-10-26T08:12:00Z</updated><author><name>flyingchen</name><uri>http://www.cnblogs.com/flyingchen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/flyingchen/archive/2011/10/26/2225339.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/flyingchen/archive/2011/10/26/2225339.html"/><content type="html">&lt;p&gt;写了段简单的c代码，调用libcurl。网上有很多的例子，代码不提了。关键问题出在了gcc编译时。&lt;/p&gt;&lt;p&gt;网络上流传的编译方式是gcc -lcurl curl_test.c; 以此方法，我的编译总是"undefined reference to `curl_easy_init'",&lt;/p&gt;&lt;p&gt;非常奇怪，大多同行遇到此问题时，是因为-lcurl没有加，造成无法找到curl库。我这里加上，也依然报同样的错误。&lt;/p&gt;&lt;p&gt;最后无意见发现gcc curl_test.c -lcurl；竟然ok了。我是ubuntu11.10系统，gcc版本是4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3) 。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/flyingchen/aggbug/2225339.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/flyingchen/archive/2011/10/26/2225339.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/flyingchen/archive/2010/06/25/1765461.html</id><title type="text">敏捷项目组</title><summary type="text">大家拥护所要共同创造的东西当人们在乎结果的时候，会变得更加负责交谈能够帮助人们达成思想一致，在交谈中人们会发现共同的思想通过改变交流的对象来改变交流的内容期待领导从任何地方出现关注可行性，探求可能性，而不是过度关注问题群体智慧任何事情在没有结束之前都不能算作成功，在整个过程中都可能发生变化学习是让我们变得更加聪明的唯一方法有意义的工作有很大的激励作用作为一个团队，人们能够承担一切任务社区里面最重要...</summary><published>2010-06-25T11:30:00Z</published><updated>2010-06-25T11:30:00Z</updated><author><name>flyingchen</name><uri>http://www.cnblogs.com/flyingchen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/flyingchen/archive/2010/06/25/1765461.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/flyingchen/archive/2010/06/25/1765461.html"/><content type="html">&lt;ol&gt;&lt;li&gt;大家拥护所要共同创造的东西&lt;/li&gt;&lt;li&gt;当人们在乎结果的时候，会变得更加负责&lt;/li&gt;&lt;li&gt;交谈能够帮助人们达成思想一致，在交谈中人们会发现共同的思想&lt;/li&gt;&lt;li&gt;通过改变交流的对象来改变交流的内容&lt;/li&gt;&lt;li&gt;期待领导从任何地方出现&lt;/li&gt;&lt;li&gt;关注可行性，探求可能性，而不是过度关注问题&lt;/li&gt;&lt;li&gt;群体智慧&lt;/li&gt;&lt;li&gt;任何事情在没有结束之前都不能算作成功，在整个过程中都可能发生变化&lt;/li&gt;&lt;li&gt;学习是让我们变得更加聪明的唯一方法&lt;/li&gt;&lt;li&gt;有意义的工作有很大的激励作用&lt;/li&gt;&lt;li&gt;作为一个团队，人们能够承担一切任务&lt;/li&gt;&lt;li&gt;社区里面最重要的因素包括：宽宏大量、宽容和爱。&lt;/li&gt;&lt;/ol&gt;&lt;img src="http://www.cnblogs.com/flyingchen/aggbug/1765461.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/flyingchen/archive/2010/06/25/1765461.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/flyingchen/archive/2010/05/28/1746322.html</id><title type="text">javascript string to date</title><summary type="text">还只能用"/"分割时间，&amp;#8220;－&amp;#8221;还就是不行。&amp;lt;SCRIPT LANGUAGE="JavaScript"&amp;gt; //execScript('n = DateDiff("d","2003-01-01","2003-01-02")');  //document.write(n); var s="2003-01-01"; var s2="2003-01-03"; var da...</summary><published>2010-05-28T06:59:00Z</published><updated>2010-05-28T06:59:00Z</updated><author><name>flyingchen</name><uri>http://www.cnblogs.com/flyingchen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/flyingchen/archive/2010/05/28/1746322.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/flyingchen/archive/2010/05/28/1746322.html"/><content type="html">&lt;p&gt;还只能用"/"分割时间，&amp;#8220;－&amp;#8221;还就是不行。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;SCRIPT LANGUAGE="JavaScript"&amp;gt; &lt;/p&gt;//execScript('n = DateDiff("d","2003-01-01","2003-01-02")'); &lt;br /&gt; &lt;br /&gt;//document.write(n); &lt;br /&gt;var s="2003-01-01"; &lt;br /&gt;var s2="2003-01-03"; &lt;br /&gt;var date=new Date(Date.parse(s.replace(/-/g, "/")));  &lt;br /&gt;var date2=new Date(Date.parse(s2.replace(/-/g, "/")));  &lt;br /&gt;var str=date2.getTime()-date.getTime(); &lt;br /&gt;var sr=str/(24*3600*1000); &lt;br /&gt;//alert(39*365*24*3600*1000); &lt;br /&gt; &lt;br /&gt;alert(sr); &lt;br /&gt;&amp;nbsp; &amp;lt;/SCRIPT&amp;gt;&lt;img src="http://www.cnblogs.com/flyingchen/aggbug/1746322.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/flyingchen/archive/2010/05/28/1746322.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/flyingchen/archive/2010/05/27/1745860.html</id><title type="text">熟悉了以下VIM指令，你会爱死她的</title><summary type="text">0 &amp;#8211; 到行首 $ &amp;#8211; 到行尾 ^ &amp;#8211; 到行首字母 ( &amp;#8211; 到上面一句或者上面一个代码段 ) &amp;#8211; 到下面一句或者下面一个代码段 `. &amp;#8211; 到最后一次修改的位置,注意这个`不是单引号,是1左边的那个按键 / &amp;#8211; 搜索指定文字,找到之后使用n来跳到下一个相同单词位置 : &amp;#8211; 转跳到指定行数 :$ &amp;#821...</summary><published>2010-05-27T15:11:00Z</published><updated>2010-05-27T15:11:00Z</updated><author><name>flyingchen</name><uri>http://www.cnblogs.com/flyingchen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/flyingchen/archive/2010/05/27/1745860.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/flyingchen/archive/2010/05/27/1745860.html"/><content type="html">&lt;p&gt;0 &amp;#8211; 到行首&lt;br /&gt; $ &amp;#8211; 到行尾&lt;br /&gt; ^ &amp;#8211; 到行首字母&lt;br /&gt; ( &amp;#8211; 到上面一句或者上面一个代码段&lt;br /&gt; ) &amp;#8211; 到下面一句或者下面一个代码段&lt;br /&gt; `. &amp;#8211; 到最后一次修改的位置,注意这个`不是单引号,是1左边的那个按键&lt;br /&gt; / &amp;#8211; 搜索指定文字,找到之后使用n来跳到下一个相同单词位置&lt;br /&gt; : &amp;#8211; 转跳到指定行数&lt;br /&gt; :$ &amp;#8211; 转跳到文件末尾,这个和G的作用相同,但是我觉得更加好记,因为和转跳行数一样,而且$一般被用来标识末尾&lt;/p&gt; &lt;p&gt;i &amp;#8211; 插入模式,I也可以,还有a,A,但是个人感觉提高效率不明显&lt;br /&gt; o &amp;#8211; 在当前行下面建立新行,对应的有O,在当前行上面,但是O很少用,除非你已经到顶行而且要在上面插入一行.&lt;/p&gt; &lt;p&gt;v &amp;#8211; 进入区块选择&lt;br /&gt; y &amp;#8211; 复制已经选择的区块&lt;br /&gt; yy &amp;#8211; 复制当前行&lt;br /&gt; d &amp;#8211; 剪切已经选择的区块&lt;br /&gt; dd &amp;#8211; 剪切当前行&lt;br /&gt; p &amp;#8211; 粘贴已经选择的区块&lt;/p&gt; &lt;p&gt;. &amp;#8211; 重复上次指令&lt;br /&gt;  &amp;#8211; 重复执行指定的指令,例如10dd,剪切10行&lt;/p&gt; &lt;p&gt;% &amp;#8211; 匹配花括号,方括号,括号等,用于例如跳转到对应的{}位置&lt;br /&gt; gd &amp;#8211; 到达光标所在处函数或者变量的定义处&lt;br /&gt; &amp;gt; &amp;#8211; 缩进代码,在v下可用&lt;br /&gt; &amp;gt;&amp;gt; &amp;#8211; 缩进当前行代码&lt;br /&gt; &amp;lt; &amp;#8211; 反缩进代码,在v下可用&lt;br /&gt; &amp;lt;&amp;lt; &amp;#8211; 反缩进当前行&lt;/p&gt;&lt;img src="http://www.cnblogs.com/flyingchen/aggbug/1745860.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/flyingchen/archive/2010/05/27/1745860.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/flyingchen/archive/2010/05/12/1734126.html</id><title type="text">ajax应用如何做好seo</title><summary type="text">google发布了"make ajax application crawable"相关规范。具体详细见：http://code.google.com/web/ajaxcrawling/docs/specification.html对开发ajax应用，这份规范还是很有意义的。其中最重要提出了两个概念：pretty-url和ugly-url，google定义如下： Pretty URL:Any URL...</summary><published>2010-05-12T15:36:00Z</published><updated>2010-05-12T15:36:00Z</updated><author><name>flyingchen</name><uri>http://www.cnblogs.com/flyingchen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/flyingchen/archive/2010/05/12/1734126.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/flyingchen/archive/2010/05/12/1734126.html"/><content type="html">&lt;p&gt;google发布了"make ajax application crawable"相关规范。具体详细见：&lt;a href="http://code.google.com/web/ajaxcrawling/docs/specification.html" target="_blank"&gt;http://code.google.com/web/ajaxcrawling/docs/specification.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;对开发ajax应用，这份规范还是很有意义的。&lt;/p&gt;&#xD;
&lt;p&gt;其中最重要提出了两个概念：&lt;/p&gt;&#xD;
&lt;p&gt;pretty-url和ugly-url，google定义如下：&lt;/p&gt;&#xD;
&lt;span style="font-family: Helvetica, Arial, sans-serif; font-size: small; "&gt;&#xD;
&lt;ul style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0.5em; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; line-height: 16px; "&gt;&#xD;
     &lt;li style="margin-top: 0.3em; margin-right: 0px; margin-bottom: 0px; margin-left: 1.5em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;strong&gt;Pretty URL:&lt;/strong&gt;&amp;nbsp;Any URL containing a hash fragment beginning with&amp;nbsp;&lt;code style="font-family: monospace; color: #007000; font-size: 10pt; "&gt;!&lt;/code&gt;, for example,&amp;nbsp;&lt;code style="font-family: monospace; color: #007000; font-size: 10pt; "&gt;www.example.com?myquery#!key1=value1&amp;amp;key2=value2&lt;/code&gt;&lt;/li&gt;&#xD;
     &lt;li style="margin-top: 0.3em; margin-right: 0px; margin-bottom: 0px; margin-left: 1.5em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;strong&gt;Ugly URL:&lt;/strong&gt;&amp;nbsp;Any URL containing a query parameter with the key&amp;nbsp;&lt;code style="font-family: monospace; color: #007000; font-size: 10pt; "&gt;_escaped_fragment_&lt;/code&gt;, for example,&amp;nbsp;&lt;code style="font-family: monospace; color: #007000; font-size: 10pt; "&gt;www.example.com?myquery&amp;amp;_escaped_fragment_=key1=value1%26key2=value2&lt;/code&gt;.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;div&gt;&lt;span  style="line-height: 16px;"&gt;&amp;nbsp;&amp;nbsp; 按我的理解就是pretty就是我们表现在页面上的用户可见url，而urlg则是为google爬虫特别提供的url.&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p&gt;其主要建议就是我们在开发ajax应用时，要注意url的表达，正确的使用pretty-url，爬虫就能够将这个url解析出来，成为ugly-url，也就能从我们主动发起&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;ajax请求一样的效果。&lt;/p&gt;&#xD;
&lt;p&gt;比如，&lt;/p&gt;&#xD;
&lt;p&gt;www.joy.cn/video/play?3&lt;span style="color: red; font-size: 18pt; "&gt;&lt;strong&gt;#&lt;/strong&gt;&lt;/span&gt;load=full ,点击这个链接，我们主动发起ajax请求为,www.joy.cn/video/play=3&amp;amp;load=full&lt;/p&gt;&#xD;
&lt;p&gt;www.joy.cn/video/play?3&lt;span style="color: red; font-size: 18pt; "&gt;&lt;strong&gt;#&lt;/strong&gt;&lt;/span&gt;load=simple ,点击这个链接，我们主动发起ajax请求为,www.joy.cn/video/play=3&amp;amp;load=simple&lt;/p&gt;&#xD;
&lt;p&gt;这样两个地址，ajax请求可以返回不同的内容。但是由于&amp;#8220;&lt;strong style="font-size: 18pt; color: red; "&gt;#&lt;/strong&gt;&amp;#8221;后内容不会被发送给服务器，所以对搜索引擎而言，这两个连接是一样的（www.joy.cn/video/play?1&lt;/p&gt;&#xD;
&lt;p&gt;），损失了SEO效果。&lt;/p&gt;&#xD;
&lt;p&gt;google新的规范则解决了这个问题，但目前局限于google爬虫有效。&lt;/p&gt;&#xD;
&lt;p&gt;如何解决呢？下面我们继续。。。。&lt;/p&gt;&#xD;
&lt;p&gt;规范中指出，将&amp;#8220;#&amp;#8221;替换成"&lt;span style="color: red; font-size: 18pt; "&gt;#!&lt;/span&gt;" ,就变成了google所谓的pretty-url，也就能满足它的要求了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font  size="6"&gt;&lt;span  style="font-size: 24px;"&gt;&amp;nbsp;&amp;nbsp; www&lt;/span&gt;&lt;/font&gt;.joy.cn/video/play?3&lt;span  style="font-size: 24px; color: #ff0000; "&gt;#!&lt;/span&gt;load=full ,点击这个链接，我们主动发起ajax请求为,www.joy.cn/video/play=3&amp;amp;load=full&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font  size="6"&gt;&lt;span  style="font-size: 24px; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;www&lt;/span&gt;&lt;/font&gt;.joy.cn/video/play?3&lt;span  style="font-size: 24px; color: #ff0000; "&gt;#!&lt;/span&gt;load=simple ,点击这个链接，我们主动发起ajax请求为,www.joy.cn/video/play=3&amp;amp;load=simple&lt;/p&gt;&#xD;
&lt;p&gt;而对google爬虫而言，它遇到这样的链接，则会转化成&lt;/p&gt;&#xD;
&lt;p&gt;www.joy.cn/video/play=3&amp;amp;&lt;span  style="font-family: monospace; line-height: 16px; font-size: 13px; color: #007000; "&gt;_escaped_fragment_=load=full和&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;www.joy.cn/video/play=3&amp;amp;&lt;span  style="font-family: monospace; line-height: 16px; font-size: 13px; color: #007000; "&gt;_escaped_fragment_=load=simple&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;两个不同搜索地址，而最终通过google.com搜索出来的时候，还是www.joy.cn/video/play=3#!load=simple这样的pretty形式。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;最后贴个流转图：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://code.google.com/web/ajaxcrawling/docs/images/crawlerserver2.png"  alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;/span&gt;&lt;img src="http://www.cnblogs.com/flyingchen/aggbug/1734126.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/flyingchen/archive/2010/05/12/1734126.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/flyingchen/archive/2010/05/08/1730365.html</id><title type="text">nestful - ruby http-rest 客户端 分析</title><summary type="text">Nestful is a simple Ruby HTTP/REST client with a sane API.## Installation sudo gem install nestful## Features* Simple API* File buffering* Before/Progress/After Callbacks* JSON &amp;amp; XML requests* Mul...</summary><published>2010-05-08T03:36:00Z</published><updated>2010-05-08T03:36:00Z</updated><author><name>flyingchen</name><uri>http://www.cnblogs.com/flyingchen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/flyingchen/archive/2010/05/08/1730365.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/flyingchen/archive/2010/05/08/1730365.html"/><content type="html">&lt;div&gt;Nestful is a simple Ruby HTTP/REST client with a sane API.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;## Installation&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;sudo gem install nestful&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;## Features&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;* Simple API&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;* File buffering&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;* Before/Progress/After Callbacks&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;* JSON &amp;amp; XML requests&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;* Multipart requests (file uploading)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;* Resource API&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;* Proxy support&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;* SSL support&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/flyingchen/aggbug/1730365.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/flyingchen/archive/2010/05/08/1730365.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/flyingchen/archive/2010/04/30/1725156.html</id><title type="text">Liskov替换原则与继承</title><summary type="text">如果一件事情你不能用自己的语言说清楚，那只能说你没有真正的理解它。&amp;#8220;只可意会不可言传&amp;#8221;在科学领域应该只是一种假象。－－－－废话结束－－－－　　 一直以来都认为自己搞清楚了何时用继承，何时用聚合，也清楚了所谓的Liskov替换原则的意义。直到今天看完了&amp;#8220;高效程序员的十个习惯&amp;#8221;以后才明白，才认识到自己以前的理解是混沌含糊的。 何时用继承呢？大部分情况我们...</summary><published>2010-04-30T08:34:00Z</published><updated>2010-04-30T08:34:00Z</updated><author><name>flyingchen</name><uri>http://www.cnblogs.com/flyingchen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/flyingchen/archive/2010/04/30/1725156.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/flyingchen/archive/2010/04/30/1725156.html"/><content type="html">&lt;p&gt;如果一件事情你不能用自己的语言说清楚，那只能说你没有真正的理解它。&amp;#8220;只可意会不可言传&amp;#8221;在科学领域应该只是一种假象。&lt;/p&gt;&lt;p&gt;－－－－废话结束－－－－&lt;/p&gt;&lt;p&gt;一直以来都认为自己搞清楚了何时用继承，何时用聚合，也清楚了所谓的Liskov替换原则的意义。直到今天看完了&amp;#8220;高效程序员的十个习惯&amp;#8221;以后才明白，才认识到自己以前的理解是&lt;/p&gt;&lt;p&gt;混沌含糊的。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;何时用继承呢？大部分情况我们仅仅为了利用另一个已存在的类的功能而继承，或者几个类有功能近似，或者代码重复，就提取个公用类，然后再继承之。长期以来，我都是这样的理解&lt;br /&gt;。如果从实现上来说，这样是没有问题的，复用了代码，减少了重复。但如果用Liskov原则来审查设计就会发现，这样的实现其实是很欠妥的。是滥用继承的一种。下面我们具体分析。&lt;/p&gt;&lt;p&gt;Liskov原则要求我们，&amp;#8220;任何能用基类的地方都应该可以无差别的使用其继承类替换&amp;#8221;。&amp;#8220;滥用的继承&amp;#8221;模式也可以从实现层面遵循此规则，因为它也是继承。但由于脱离了继承的本意，这&lt;br /&gt;&lt;/p&gt;&lt;p&gt;样的实现最终会得到差强人意的结果。比如基类中A方法是要求&amp;#8221;站力&amp;#8220;，而继承B却实现成了&amp;#8221;坐下&amp;#8220;，从语法和实现上都没有问题，但却违背了设计继承的本意。这也是滥用继承也不会被&lt;/p&gt;&lt;p&gt;有效察觉的原因：它不会主动报错，错误在潜台词里。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;继承，应该&amp;#8221;不要求更多，不承诺更少&amp;#8220;，也就是语意上的一致，而不仅仅是方法签名，只有IS－A的情况才可以使用继承。 &lt;br /&gt;&lt;/p&gt;&lt;p&gt;类似上面所说的这些&amp;#8221;被滥用的继承&amp;#8220;，最好的方式就是改造成聚合实现。虽然可能稍微麻烦一点点，但这满足设计的基本原则。&lt;/p&gt;&lt;p&gt;通过对Liskov的理解，让设计更清晰，遵从对象本意设计，而不是语法与技巧。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/flyingchen/aggbug/1725156.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/flyingchen/archive/2010/04/30/1725156.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/flyingchen/archive/2010/04/17/1714309.html</id><title type="text">Linux Commands</title><summary type="text">Linux Commandstrpaste/cut：文件分割合并teesleepiptraf:需要独立安装的。网络流量监控。很Coolstat:显示文件情况，大小，群组等xargs，结合find使用pidof:查找在运行的进程代号netstat:在低并发情况下查看系统连接ss:在高并发情况下查看系统连接sysctl用于编辑系统内核参数服务器工具：spawn-fcgi</summary><published>2010-04-17T09:03:00Z</published><updated>2010-04-17T09:03:00Z</updated><author><name>flyingchen</name><uri>http://www.cnblogs.com/flyingchen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/flyingchen/archive/2010/04/17/1714309.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/flyingchen/archive/2010/04/17/1714309.html"/><content type="html">Linux Commands&lt;br&gt;&lt;br&gt;&lt;ol&gt;&lt;li&gt;tr&lt;/li&gt;&lt;li&gt;paste/cut：文件分割合并&lt;/li&gt;&lt;li&gt;tee&lt;/li&gt;&lt;li&gt;sleep&lt;/li&gt;&lt;li&gt;iptraf:需要独立安装的。网络流量监控。很Cool&lt;/li&gt;&lt;li&gt;stat:显示文件情况，大小，群组等&lt;/li&gt;&lt;li&gt;xargs，结合find使用&lt;/li&gt;&lt;li&gt;pidof:查找在运行的进程代号&lt;/li&gt;&lt;li&gt;netstat:在低并发情况下查看系统连接&lt;/li&gt;&lt;li&gt;ss:在高并发情况下查看系统连接&lt;/li&gt;&lt;li&gt;sysctl用于编辑系统内核参数&lt;/li&gt;&lt;/ol&gt;&lt;br&gt;服务器工具：&lt;br&gt;&lt;ol&gt;&lt;li&gt;spawn-fcgi &lt;br&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br&gt;&lt;img src="http://www.cnblogs.com/flyingchen/aggbug/1714309.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/flyingchen/archive/2010/04/17/1714309.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/flyingchen/archive/2010/04/16/1713597.html</id><title type="text">Cannot find autoconf. Please check your autoconf installation</title><summary type="text">PHP 报错 随记－－－问题： Cannot find autoconf. Please check your autoconf installation－－－解决：</summary><published>2010-04-16T06:50:00Z</published><updated>2010-04-16T06:50:00Z</updated><author><name>flyingchen</name><uri>http://www.cnblogs.com/flyingchen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/flyingchen/archive/2010/04/16/1713597.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/flyingchen/archive/2010/04/16/1713597.html"/><content type="html">&lt;p&gt;PHP 报错 随记&lt;br /&gt;&lt;/p&gt;&lt;p&gt;－－－问题： &lt;/p&gt;&lt;p&gt;Cannot find autoconf. Please check your autoconf installation&lt;/p&gt;&lt;p&gt;－－－解决： &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;# cd /usr/src&lt;br /&gt;# wget http://ftp.gnu.org/gnu/m4/m4-1.4.9.tar.gz&lt;br /&gt;# tar -zvxf m4-1.4.9.tar.gz&lt;br /&gt;# cd m4-1.4.9/&lt;br /&gt;# ./configure &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make install&lt;br /&gt;# cd ../&lt;br /&gt;# wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.62.tar.gz&lt;br /&gt;# tar -zvxf autoconf-2.62.tar.gz&lt;br /&gt;# cd autoconf-2.62/&lt;br /&gt;# ./configure &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make install&lt;br /&gt;&lt;/pre&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/flyingchen/aggbug/1713597.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/flyingchen/archive/2010/04/16/1713597.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/flyingchen/archive/2010/04/16/1713587.html</id><title type="text">pecl报错（1）</title><summary type="text">随记错误：pear.php.net is using a unsupported protocal - This should never happen.  install failed 解决：cd /usr/local/lib/php/Delete .channels directory 　　 run "pear update-channels"</summary><published>2010-04-16T06:44:00Z</published><updated>2010-04-16T06:44:00Z</updated><author><name>flyingchen</name><uri>http://www.cnblogs.com/flyingchen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/flyingchen/archive/2010/04/16/1713587.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/flyingchen/archive/2010/04/16/1713587.html"/><content type="html">&lt;p&gt;随记&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;错误：&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;pear.php.net is using a unsupported protocal - This should never happen. &lt;br /&gt; install failed &lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;解决：&lt;br /&gt;&lt;/p&gt;&lt;p&gt;cd /usr/local/lib/php/&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Delete .channels directory &lt;/span&gt;　　 &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;run "pear update-channels" &lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/flyingchen/aggbug/1713587.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/flyingchen/archive/2010/04/16/1713587.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
