<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?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:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>石锅拌饭</title>
	
	<link>http://www.robinlu.com/blog</link>
	<description>Robin Lu's weblog</description>
	<pubDate>Wed, 30 Dec 2009 17:43:44 +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" type="application/rss+xml" href="http://feeds.feedburner.com/robinlu" /><feedburner:info uri="robinlu" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>39.974226</geo:lat><geo:long>116.341009</geo:long><creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/</creativeCommons:license><image><link>http://creativecommons.org/licenses/by-nc-nd/2.0/</link><url>http://creativecommons.org/images/public/somerights20.gif</url><title>Some Rights Reserved</title></image><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><item>
		<title>荐书：Cocoa Programming Developer’s Handbook</title>
		<link>http://feedproxy.google.com/~r/robinlu/~3/8uRqKm4lRq0/504</link>
		<comments>http://www.robinlu.com/blog/archives/504#comments</comments>
		<pubDate>Wed, 30 Dec 2009 17:35:12 +0000</pubDate>
		<dc:creator>Robin Lu</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[book]]></category>

		<category><![CDATA[cocoa]]></category>

		<category><![CDATA[mac]]></category>

		<guid isPermaLink="false">http://www.robinlu.com/blog/archives/504</guid>
		<description><![CDATA[
最近有机会读到Addison Wesley即将出版的新书Cocoa Programming Developer&#8217;s Handbook，感觉非常好。
目前市面上Cocoa编程的书，比较有名的象O&#8217;Reilly的Learning Cocoa with Objective-C，Addison Wesley的Cocoa Programming for Mac OS X，可以将一个完全不懂Cocoa编程的人带入门。而入门之后，似乎就只有苹果官方文档可看了。对于一些有一定编程经验，又希望学习一个新编程框架的人来说，那些从ABC讲起的编程入门书往往会让他们觉得花了时间却学不到什么东西，他们更需要一本直接告诉他们这个框架能做什么和怎样去充分利用这个框架。从入门到成为一个有经验的Cocoa programmer，有一个很大的落差，其中的经验和相关知识散落在官方文档、官方实例、开源项目和各种各样诸如Cocoadev的知识库和Cocoa With Love这样的blog之中。缺乏一本书，能够把入门者从浩如烟海的官方文档和口口相传的经验中解救出来，给他们一个更全面和深入了解Cocoa的机会。
Cocoa Programming Developer&#8217;s Handbook就刚好填补了这个空白，达到了这个目的。这本书首先是内容很全，八大部分二十五个章节九百多页，是目前市面上涵盖Cocoa内容最广的一本书。另外，它的内容非常新，包含了Mac OS X 10.6的许多新特性，实际上它的预计出版日期是明年一月。更重要的是，作者David Chisnall是Cocoa的GNU实现GNUStep的贡献者，有丰富的Cocoa和Objective-C的开发经验，不仅把很多技术的来龙去脉讲的很清楚，又有很多Cocoa编程的最佳实践，这些都是从API文档中很难获得的知识。读这本书就象和一个Cocoa高手交流的过程，读起来可以说是饶有兴味。
但需要说明的是，这本书可能并不适合用来入门，不会去手把手教你如何从无到有实现一个Cocoa应用。同样，它也无法代替官方API文档，不会去介绍每个method的使用细节。它讨论的更多的是&#8221;big picture&#8221;和&#8221;best practice&#8221;，是paradigm和pattern，让一个有一定经验的程序员可以更快的进入Cocoa的语境。另外，它不是一本讲iPhone编程的书，但它对iPhone程序员一定会有很大的帮助。
可以说，这就是我一直想要的那本Cocoa编程书，翻看了电子版后，已经在amazon预订了印刷版。如果有国内出版社可以将此书引进，功德无量。
]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.robinlu.com/blog/wp-content/uploads/2009/12/cpdh-cover.jpg" width="240" height="240" alt="cpdh-cover.jpg" /></p>
<p>最近有机会读到Addison Wesley即将出版的新书Cocoa Programming Developer&#8217;s Handbook，感觉非常好。</p>
<p>目前市面上Cocoa编程的书，比较有名的象O&#8217;Reilly的Learning Cocoa with Objective-C，Addison Wesley的Cocoa Programming for Mac OS X，可以将一个完全不懂Cocoa编程的人带入门。而入门之后，似乎就只有苹果官方文档可看了。对于一些有一定编程经验，又希望学习一个新编程框架的人来说，那些从ABC讲起的编程入门书往往会让他们觉得花了时间却学不到什么东西，他们更需要一本直接告诉他们这个框架能做什么和怎样去充分利用这个框架。从入门到成为一个有经验的Cocoa programmer，有一个很大的落差，其中的经验和相关知识散落在官方文档、官方实例、开源项目和各种各样诸如<a href="http://www.cocoadev.com/">Cocoadev</a>的知识库和<a href="http://cocoawithlove.com/">Cocoa With Love</a>这样的blog之中。缺乏一本书，能够把入门者从浩如烟海的官方文档和口口相传的经验中解救出来，给他们一个更全面和深入了解Cocoa的机会。</p>
<p>Cocoa Programming Developer&#8217;s Handbook就刚好填补了这个空白，达到了这个目的。这本书首先是内容很全，八大部分二十五个章节九百多页，是目前市面上涵盖Cocoa内容最广的一本书。另外，它的内容非常新，包含了Mac OS X 10.6的许多新特性，实际上它的预计出版日期是明年一月。更重要的是，作者David Chisnall是Cocoa的GNU实现GNUStep的贡献者，有丰富的Cocoa和Objective-C的开发经验，不仅把很多技术的来龙去脉讲的很清楚，又有很多Cocoa编程的最佳实践，这些都是从API文档中很难获得的知识。读这本书就象和一个Cocoa高手交流的过程，读起来可以说是饶有兴味。</p>
<p>但需要说明的是，这本书可能并不适合用来入门，不会去手把手教你如何从无到有实现一个Cocoa应用。同样，它也无法代替官方API文档，不会去介绍每个method的使用细节。它讨论的更多的是&#8221;big picture&#8221;和&#8221;best practice&#8221;，是paradigm和pattern，让一个有一定经验的程序员可以更快的进入Cocoa的语境。另外，它不是一本讲iPhone编程的书，但它对iPhone程序员一定会有很大的帮助。</p>
<p>可以说，这就是我一直想要的那本Cocoa编程书，翻看了电子版后，已经在amazon预订了印刷版。如果有国内出版社可以将此书引进，功德无量。</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/robinlu?a=8uRqKm4lRq0:PPWbCgdIess:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/robinlu?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robinlu?a=8uRqKm4lRq0:PPWbCgdIess:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/robinlu?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robinlu?a=8uRqKm4lRq0:PPWbCgdIess:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/robinlu?i=8uRqKm4lRq0:PPWbCgdIess:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/robinlu/~4/8uRqKm4lRq0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.robinlu.com/blog/archives/504/feed</wfw:commentRss>
		<feedburner:origLink>http://www.robinlu.com/blog/archives/504</feedburner:origLink></item>
		<item>
		<title>北京Ruby/Rails开发者聚会</title>
		<link>http://feedproxy.google.com/~r/robinlu/~3/WryKqzxplas/503</link>
		<comments>http://www.robinlu.com/blog/archives/503#comments</comments>
		<pubDate>Wed, 11 Nov 2009 02:34:56 +0000</pubDate>
		<dc:creator>Robin Lu</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[ruby]]></category>

		<category><![CDATA[rubyonrails]]></category>

		<guid isPermaLink="false">http://www.robinlu.com/blog/archives/503</guid>
		<description><![CDATA[好了，北京也要有Ruby/Rails开发者的活动了。
本周六，Joyent赞助，InfoQ牵头，我们财帮子三个人都会去。具体时间地点看链接。
希望这次能开一个好头，把北京的Ruby/Rails社区活动搞下去。
]]></description>
			<content:encoded><![CDATA[<p>好了，北京也要有Ruby/Rails开发者的活动了。</p>
<p>本周六，Joyent赞助，InfoQ牵头，我们财帮子三个人都会去。具体时间地点看<a href="http://www.infoq.com/cn/vendorcontent/show.action?vcr=759">链接</a>。</p>
<p>希望这次能开一个好头，把北京的Ruby/Rails社区活动搞下去。</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/robinlu?a=WryKqzxplas:OArvd-j9exc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/robinlu?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robinlu?a=WryKqzxplas:OArvd-j9exc:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/robinlu?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robinlu?a=WryKqzxplas:OArvd-j9exc:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/robinlu?i=WryKqzxplas:OArvd-j9exc:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/robinlu/~4/WryKqzxplas" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.robinlu.com/blog/archives/503/feed</wfw:commentRss>
		<feedburner:origLink>http://www.robinlu.com/blog/archives/503</feedburner:origLink></item>
		<item>
		<title>KungFu Rails小记</title>
		<link>http://feedproxy.google.com/~r/robinlu/~3/ZFdB-aQ-Gk8/499</link>
		<comments>http://www.robinlu.com/blog/archives/499#comments</comments>
		<pubDate>Mon, 26 Oct 2009 10:51:40 +0000</pubDate>
		<dc:creator>Robin Lu</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[kungfurails]]></category>

		<category><![CDATA[ruby]]></category>

		<category><![CDATA[rubyonrails]]></category>

		<guid isPermaLink="false">http://www.robinlu.com/blog/archives/499</guid>
		<description><![CDATA[上周末赶去上海参加了KungFu Rails中国Rails开发者大会。本来因为女儿发烧，差点去不成，最后夫人鼎力支持，终于成行。
这次Rails开发者大会整容相当强大，演讲也很精彩。Rails 3的主导开发者Yehuda Katz来做了关于Rails 3的介绍，比起五月份Rails Conf看到的Rails 3介绍，又多了一些新内容。github的Scott和PJ双双到场。Scott的视频我是看过一堆了，第一次听到现场。PJ在创立github前，我就很fan他的err blog。刚好InfoQ还给我们了一个机会，采访了Scott和PJ，问了不少git和github的问题，他们两人也很健谈，相信视频很快会在InfoQ上看到。台湾来的張文鈿讲的Rails Best Practice: Write Better Code，实用性很强，是这次大会的一个亮点，据说还得到Yehuda同学的青睐。易空海黄志敏写的Rails插件Bulletin最近获得Rails社区广泛的关注，这次他来分享了如何制作gem和plugin的经验。我们团队的Louie Zhao讲了一下使用Integrity做持续集成和使用metric_fu做静态代码检查的经验，演讲的slides和更具体的内容都分享在这里。另外《JRuby实战》的译者丁雪丰，易空海的郜磊，也都有精彩的演讲。唯一遗憾的是本来很期待的高桥征义的演讲，不知道什么原因不太流畅，高桥流简报法的威力大大缩水。
这次KungFu Rails收门票，虽然不贵，但人数明显少于上次RubyConfChina。不过有一个好处，就是来的人都是铁杆Rails开发者，结识这样一批人让人很开心，更觉得不虚此行。
我们三个人以IN-SRC Studio的名义赞助了这次活动。这是今年第二次赞助这样的活动。碰到很多人来问，又不搞宣传又不招人，为什么赞助。其实我们的想法很简单，我们是ruby和rails的受益者，虽然没什么钱，但既然有人不辞辛苦来组织这样的活动，能帮一点是一点。在中国有这样好的rails活动，却没有一个中国人赞助，说不过去。对于社区乃至大环境，不知道这样的蝴蝶翅膀能改变什么，但我们除了空谈和抱怨，还可以做点别的。
这次另外一些收获，就是向Shanghai On Rails 小组请教了一下他们平时开展活动的经验。其实北京的Ruby和Rails开发者也不少，却少有线下交流的机会。也许我们也可以开始组织一些活动，希望可以尽快开始。
最后，这次活动的一些照片，分享在这里。
]]></description>
			<content:encoded><![CDATA[<p>上周末赶去上海参加了<a href="http://kungfurails.com/">KungFu Rails中国Rails开发者大会</a>。本来因为女儿发烧，差点去不成，最后夫人鼎力支持，终于成行。</p>
<p>这次Rails开发者大会整容相当强大，演讲也很精彩。Rails 3的主导开发者Yehuda Katz来做了关于Rails 3的介绍，比起五月份Rails Conf看到的Rails 3介绍，又多了一些新内容。github的Scott和PJ双双到场。Scott的视频我是看过一堆了，第一次听到现场。PJ在创立github前，我就很fan他的err blog。刚好InfoQ还给我们了一个机会，采访了Scott和PJ，问了不少git和github的问题，他们两人也很健谈，相信视频很快会在InfoQ上看到。台湾来的<a href="http://ihower.idv.tw/">張文鈿</a>讲的Rails Best Practice: Write Better Code，实用性很强，是这次大会的一个亮点，据说还得到Yehuda同学的青睐。<a href="http://ekohe.com/">易空海</a>黄志敏写的Rails插件Bulletin最近获得Rails社区广泛的关注，这次他来分享了如何制作gem和plugin的经验。我们团队的Louie Zhao讲了一下使用Integrity做持续集成和使用metric_fu做静态代码检查的经验，演讲的slides和更具体的内容都<a href="http://www.in-src.com/continuous_integration_for_rails_project">分享在这里</a>。另外《JRuby实战》的译者丁雪丰，易空海的郜磊，也都有精彩的演讲。唯一遗憾的是本来很期待的高桥征义的演讲，不知道什么原因不太流畅，高桥流简报法的威力大大缩水。</p>
<p>这次KungFu Rails收门票，虽然不贵，但人数明显少于上次RubyConfChina。不过有一个好处，就是来的人都是铁杆Rails开发者，结识这样一批人让人很开心，更觉得不虚此行。</p>
<p>我们三个人以IN-SRC Studio的名义赞助了这次活动。这是今年第二次赞助这样的活动。碰到很多人来问，又不搞宣传又不招人，为什么赞助。其实我们的想法很简单，我们是ruby和rails的受益者，虽然没什么钱，但既然有人不辞辛苦来组织这样的活动，能帮一点是一点。在中国有这样好的rails活动，却没有一个中国人赞助，说不过去。对于社区乃至大环境，不知道这样的蝴蝶翅膀能改变什么，但我们除了空谈和抱怨，还可以做点别的。</p>
<p>这次另外一些收获，就是向Shanghai On Rails 小组请教了一下他们平时开展活动的经验。其实北京的Ruby和Rails开发者也不少，却少有线下交流的机会。也许我们也可以开始组织一些活动，希望可以尽快开始。</p>
<p>最后，这次活动的一些照片，<a href="http://www.flickr.com/photos/splyb/sets/72157622541158677/">分享在这里</a>。</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/robinlu?a=ZFdB-aQ-Gk8:L_PbRrDGBJc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/robinlu?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robinlu?a=ZFdB-aQ-Gk8:L_PbRrDGBJc:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/robinlu?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robinlu?a=ZFdB-aQ-Gk8:L_PbRrDGBJc:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/robinlu?i=ZFdB-aQ-Gk8:L_PbRrDGBJc:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/robinlu/~4/ZFdB-aQ-Gk8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.robinlu.com/blog/archives/499/feed</wfw:commentRss>
		<feedburner:origLink>http://www.robinlu.com/blog/archives/499</feedburner:origLink></item>
		<item>
		<title>浅谈Blocks</title>
		<link>http://feedproxy.google.com/~r/robinlu/~3/9KkMLxGm8Ro/492</link>
		<comments>http://www.robinlu.com/blog/archives/492#comments</comments>
		<pubDate>Sun, 06 Sep 2009 10:49:59 +0000</pubDate>
		<dc:creator>Robin Lu</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[blocks]]></category>

		<category><![CDATA[code]]></category>

		<category><![CDATA[mac]]></category>

		<category><![CDATA[programming]]></category>

		<category><![CDATA[xcode]]></category>

		<guid isPermaLink="false">http://www.robinlu.com/blog/archives/492</guid>
		<description><![CDATA[在上次的Snow Leopard tech review摘要中提到，Snow Leopard（实际上是Xcode 3.2附带的编译器)开始支持Blocks。这是一个非常有意思的功能，以前通常只有一些动态语言支持，而现在，C/C++/Objective-C也可以用上这个功能了。
Block, 简单的说，就是一个函数对象，和其它类型的对象一样，你可以创建它，可以赋给一个变量，也可以作为函数的参数来传递。计算机科学中，更常用的名字是&#8221;closure&#8221;或者&#8221;lambda&#8221;。先通过一个例子看看什么是Block：

1
2
3
4
5
6
7
    void &#40;^hello&#41;&#40;char*&#41;;
&#160;
    hello = ^&#40;char* str&#41; &#123;
        NSLog&#40;@&#34;hello %s&#34;, str&#41;;
    &#125;;
&#160;
    hello&#40;&#34;robin&#34;&#41;;

这段代码申明了一个block变量hello，然后用一个block对象为它赋值，最后调用了这个函数。这是打印出的结果：

2009-09-06 16:36:12.693 blocks[6379:903] hello robin

再看一个例子。玩ruby的都知道each方法，可以很方便的遍历一些数据组合。比如：

&#91;1,2,3&#93;.each &#123;&#124;x&#124;
  puts x
&#125;

就可以打印出

1
2
3

现在，我们也可以为NSArray加上这样的方法。我为NSArray写了一个Category，加入下面函数的实现：

- &#40;void&#41;each:&#40;void &#40;^&#41;&#40;id&#41;&#41;block
&#123;
    for &#40;id obj in [...]]]></description>
			<content:encoded><![CDATA[<p>在上次的<a href="http://www.robinlu.com/blog/archives/488">Snow Leopard tech review摘要</a>中提到，Snow Leopard（实际上是Xcode 3.2附带的编译器)开始支持Blocks。这是一个非常有意思的功能，以前通常只有一些动态语言支持，而现在，C/C++/Objective-C也可以用上这个功能了。</p>
<p>Block, 简单的说，就是一个函数对象，和其它类型的对象一样，你可以创建它，可以赋给一个变量，也可以作为函数的参数来传递。计算机科学中，更常用的名字是&#8221;closure&#8221;或者&#8221;lambda&#8221;。先通过一个例子看看什么是Block：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;">    <span style="color: #a61390;">void</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">^</span>hello<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">char</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>;
&nbsp;
    hello <span style="color: #002200;">=</span> <span style="color: #002200;">^</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">char</span><span style="color: #002200;">*</span> str<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
        NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;hello %s&quot;</span>, str<span style="color: #002200;">&#41;</span>;
    <span style="color: #002200;">&#125;</span>;
&nbsp;
    hello<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;robin&quot;</span><span style="color: #002200;">&#41;</span>;</pre></td></tr></table></div>

<p>这段代码申明了一个block变量hello，然后用一个block对象为它赋值，最后调用了这个函数。这是打印出的结果：</p>
<pre>
2009-09-06 16:36:12.693 blocks[6379:903] hello robin
</pre>
<p>再看一个例子。玩ruby的都知道each方法，可以很方便的遍历一些数据组合。比如：</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">2</span>,<span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">each</span> <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>x<span style="color:#006600; font-weight:bold;">|</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> x
<span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>

<p>就可以打印出</p>
<pre>
1
2
3
</pre>
<p>现在，我们也可以为NSArray加上这样的方法。我为NSArray写了一个Category，加入下面函数的实现：</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>each<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">^</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span>block
<span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">for</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span> obj <span style="color: #a61390;">in</span> self<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
        block<span style="color: #002200;">&#40;</span>obj<span style="color: #002200;">&#41;</span>;
    <span style="color: #002200;">&#125;</span>
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>很简单，我们就有了一个属于NSArray的each。看一个调用的例子：</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"> <span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span> array <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSArray</span> arrayWithObjects<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;tom&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;jerry&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;robin&quot;</span>, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>array each<span style="color: #002200;">:^</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span> obj<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;hello %@&quot;</span>, obj<span style="color: #002200;">&#41;</span>;<span style="color: #002200;">&#125;</span><span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>首先，生成了一个数组对象，里面有三个名字，然后分别向这三个名字说hello。</p>
<p>再来为NSArray实现一个select方法，这个方法为每一个数组中的对象调用block，这个block做出选择，选中的返回true，最后select函数返回一个数组，其中包含所有选中的对象：</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>select<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">^</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span>block
<span style="color: #002200;">&#123;</span>
    <span style="color: #400080;">NSMutableArray</span> <span style="color: #002200;">*</span>rslt <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableArray</span> array<span style="color: #002200;">&#93;</span>;
    <span style="color: #a61390;">for</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span> obj <span style="color: #a61390;">in</span> self<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
        <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>block<span style="color: #002200;">&#40;</span>obj<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
            <span style="color: #002200;">&#91;</span>rslt addObject<span style="color: #002200;">:</span>obj<span style="color: #002200;">&#93;</span>; 
        <span style="color: #002200;">&#125;</span>
    <span style="color: #002200;">&#125;</span>
    <span style="color: #a61390;">return</span> rslt;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>再看一个调用的例子：</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">     <span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span> array <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSArray</span> arrayWithObjects<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;tom&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;jerry&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;robin&quot;</span>, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>array select<span style="color: #002200;">:^</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span> obj<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
        <span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>obj isEqualToString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;robin&quot;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#125;</span><span style="color: #002200;">&#93;</span> each<span style="color: #002200;">:^</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span> obj<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
        NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;hello %@ only&quot;</span>, obj<span style="color: #002200;">&#41;</span>;
    <span style="color: #002200;">&#125;</span><span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>依然生成包含三个名字的数组，但是先调用select，只选出&#8217;robin&#8217;，然后只向选出的名字说&#8217;hello&#8217;。</p>
<p>看到现在，应该已经对block有一个初步的认识了。也许会产生一个疑问，block和函数指针有什么区别？</p>
<p>第一个区别，函数指针是对一个函数地址的引用，这个函数在编译的时候就已经确定了。而block是一个函数对象，是在程序运行过程中产生的。在一个作用域中生成的block对象分配在栈(stack)上，和其他所有分配在栈上的对象一样，离开这个作用域，就不存在了。这是一个Xcode文档中的错误案例：</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> dontDoThis<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">void</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">^</span>blockArray<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;">// an array of 3 Block references</span>
&nbsp;
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">3</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        blockArray<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #339933;">^</span><span style="color: #009900;">&#123;</span> <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;hello, %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">// WRONG: Block literal scope is &quot;for loop&quot;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>另外，block对象在一个作用域中，在这个block之中可以访问同在这个作用域中的本地变量。我们来看一个例子：</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">void</span> say<span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>something<span style="color: #002200;">&#41;</span>
<span style="color: #002200;">&#123;</span>
    <span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span> array <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSArray</span> arrayWithObjects<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;tom&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;jerry&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;robin&quot;</span>, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>array each<span style="color: #002200;">:^</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span> obj<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
        NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;%@, %@&quot;</span>, something, obj<span style="color: #002200;">&#41;</span>;
    <span style="color: #002200;">&#125;</span><span style="color: #002200;">&#93;</span>;    
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>这个函数是向数组中的名字说点什么，具体说什么，在block中并不确定. 因为each本身接口的限制，也没法通过函数的参数传入。如果用函数指针来实现，就不可避免的要引入全局或者静态变量，而使用block，则完全没有这个问题。避免使用全局以及静态变量最直接的现实意义就是，更容易写出线程安全的程序。</p>
<p>通常情况下，block对同作用域中本地变量是以只读形式访问的，如果希望以读写方式来访问，需要在申明这个变量时加上__block。</p>
<p>本文的例子放在<a href="http://github.com/robin/Block-Extension/tree/master">github</a>上了，其中对NSArray还实现了map和reduce。</p>
<p>如果希望对Blocks做更多的了解，可以参看Xcode中的&#8221;Blocks Programming Topics&#8221;。</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/robinlu?a=9KkMLxGm8Ro:zl9mSuS8yLU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/robinlu?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robinlu?a=9KkMLxGm8Ro:zl9mSuS8yLU:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/robinlu?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robinlu?a=9KkMLxGm8Ro:zl9mSuS8yLU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/robinlu?i=9KkMLxGm8Ro:zl9mSuS8yLU:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/robinlu/~4/9KkMLxGm8Ro" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.robinlu.com/blog/archives/492/feed</wfw:commentRss>
		<feedburner:origLink>http://www.robinlu.com/blog/archives/492</feedburner:origLink></item>
		<item>
		<title>Snow Leopard Ars Technica Review 摘要</title>
		<link>http://feedproxy.google.com/~r/robinlu/~3/6C3JzqI0Lu8/488</link>
		<comments>http://www.robinlu.com/blog/archives/488#comments</comments>
		<pubDate>Wed, 02 Sep 2009 16:58:07 +0000</pubDate>
		<dc:creator>Robin Lu</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[development]]></category>

		<category><![CDATA[mac]]></category>

		<category><![CDATA[snow leopard]]></category>

		<guid isPermaLink="false">http://www.robinlu.com/blog/archives/488</guid>
		<description><![CDATA[每次Mac OS X升级, Ars Technica都会有一个长篇的评论, 这次也不例外, 有23页之长. 原文在此. 边看边将我比较感兴趣的部分摘要了一下.
Snow Leopard是一次主要针对开发者的升级, 预告时就打出了0 feature的噱头, 最终用户能体验到的变化也许不多.
安装
安装大小有比较显著的变化, 比Leopard小很多. 排除Finder采用十进制方式展示空间大小的原因, 真正节约了空间的地方包括:

可运行码中不再有PPC部分.
很多文件采用了压缩模式, 利用extended attributes, 以ResourceFork的形式保存. 从之前版本的Mac OS X会是一个0大小的文件, 但在文件拷贝的层面做到了向前兼容.
对于更小的文件, 会直接保存在extended attributes中, 而不再单独分配一个块(通常是4K).
压缩存放文件, 一方面是节约了硬盘, 另一方面以CPU换I/O. 将内容存放在extended attributes中, 可以减少硬盘磁头的移动. 一切都是为了更快的读写速度.

安装过程中过检查不兼容的程序.另外, 安装增加了掉电保护功能.
64位
一图顶万言
64位内核
K64(64位内核)并没有在所有的系统上被激活, 目前缺省激活的只有08以后的XServers. 要想在其他K64-capable的机器上启动64位内核, 需要在启动时同时按下6和4两个键. 或者用nvram直接修改启动配置.
64位内核最直接的好处是可以使用更大的内存. 更多的寄存器, 新的寻址方式和浮点运算能力对性能提升有帮助, 但只有少数程序(通常是server-based的程序)用到了这些特性, 对更多的日常应用而言, K64没有你想象中那么有用.
对于安装了96GB内存,并且不存在32位驱动程序困扰的人, K64是首选.
雪豹的32位内核同样支持64位应用, 在不耗尽内核地址空间的前提下, 不妨碍使用超过4G内存.
雪豹中64位应用明显增多,大量新API不再支持32位, Objective-2.1的很多新功能也只能用于64位应用程序.
苹果在用自己的行动拉拢大家进入64位阵营.
QuickTime X
X means &#8216;Ten&#8217;. 目标是淘汰已经18年之久的老QuickTime API. 但只是一个开始.
QuickTime X是纯64位. 部分功能仍依赖于32位的QuickTime 7. [...]]]></description>
			<content:encoded><![CDATA[<p>每次Mac OS X升级, Ars Technica都会有一个长篇的评论, 这次也不例外, 有23页之长. <a href="http://arstechnica.com/apple/reviews/2009/08/mac-os-x-10-6.ars">原文在此</a>. 边看边将我比较感兴趣的部分摘要了一下.</p>
<p>Snow Leopard是一次主要针对开发者的升级, 预告时就打出了0 feature的噱头, 最终用户能体验到的变化也许不多.</p>
<h3>安装</h3>
<p>安装大小有比较显著的变化, 比Leopard小很多. 排除Finder采用十进制方式展示空间大小的原因, 真正节约了空间的地方包括:</p>
<ul>
<li>可运行码中不再有PPC部分.</li>
<li>很多文件采用了压缩模式, 利用extended attributes, 以<a href="http://en.wikipedia.org/wiki/Resource_fork">ResourceFork</a>的形式保存. 从之前版本的Mac OS X会是一个0大小的文件, 但在文件拷贝的层面做到了向前兼容.</li>
<li>对于更小的文件, 会直接保存在extended attributes中, 而不再单独分配一个块(通常是4K).</li>
<li>压缩存放文件, 一方面是节约了硬盘, 另一方面以CPU换I/O. 将内容存放在extended attributes中, 可以减少硬盘磁头的移动. 一切都是为了更快的读写速度.</li>
</ul>
<p>安装过程中过检查不兼容的程序.另外, 安装增加了掉电保护功能.</p>
<h3>64位</h3>
<p><a href="http://static.arstechnica.com/20090828/snow-leopard-64-bit.png">一图顶万言</a></p>
<h3>64位内核</h3>
<p>K64(64位内核)并没有在所有的系统上被激活, 目前缺省激活的只有08以后的XServers. 要想在其他K64-capable的机器上启动64位内核, 需要在启动时同时按下6和4两个键. 或者用nvram直接修改启动配置.</p>
<p>64位内核最直接的好处是可以使用更大的内存. 更多的寄存器, 新的寻址方式和浮点运算能力对性能提升有帮助, 但只有少数程序(通常是server-based的程序)用到了这些特性, 对更多的日常应用而言, K64没有你想象中那么有用.</p>
<p>对于安装了96GB内存,并且不存在32位驱动程序困扰的人, K64是首选.</p>
<p>雪豹的32位内核同样支持64位应用, 在不耗尽内核地址空间的前提下, 不妨碍使用超过4G内存.</p>
<p>雪豹中64位应用明显增多,大量新API不再支持32位, Objective-2.1的很多新功能也只能用于64位应用程序.</p>
<p>苹果在用自己的行动拉拢大家进入64位阵营.</p>
<h3>QuickTime X</h3>
<p>X means &#8216;Ten&#8217;. 目标是淘汰已经18年之久的老QuickTime API. 但只是一个开始.</p>
<p>QuickTime X是纯64位. 部分功能仍依赖于32位的QuickTime 7. 通过启动一个独立的32位QTKitServer进程来完成64位应用对32位应用的使用.</p>
<p>QuickTime X API提供比之前更合理的资源使用方式, 只做你需要它做的事情. 对部分显卡支持GPU加速播放H.264. </p>
<h3>文件系统API</h3>
<p>用NSURL和CFURL统一文件引用.</p>
<p>引入Bookmark.</p>
<h3>Do more with more</h3>
<p>我们的硬件越来越好, 但运行速度并没有明显的改观, 原因之一是软件开发并没有充分利用这些提升. 雪豹的目标之一就是让开发者可以享受到硬件提升带来的好处, 在更好的条件下做到更多.</p>
<h3>LLVM和Clang</h3>
<p>隆重推出LLVM和Clang. 可以采用GCC, LLVM-GCC, Clang等多种编译方式. 在对特定硬件的优化上, LLVM比传统编译方式更具优势.</p>
<p>LLVM和Clang的组合, 编译速度更快, 编译出的可执行代码运行速度更快. 更友好的错误提示. 支持代码静态分析.</p>
<h3>Blocks</h3>
<p>Blocks的支持, 使C++, C, Objective-C也可以拥有过去只属于动态语言的closures和anonymous functions的特性.</p>
<p>不同于函数指针, Blocks提供更灵活的参数传递和变量上下文方式. 和真正的动态语言相比, 仍然有所限制, 需要遵守一系列规则.</p>
<h3>Grand Central Dispatch</h3>
<p>简称GCD, 是雪豹提供的新的基于C语言的并发运行机制.</p>
<p>通常,应用程序很难根据CPU的数量和使用情况来控制线程的数量. 多了, 增加调度成本. 少了, CPU闲置.</p>
<p>GCD提供统一的线程调度机制. 应用程序将任务放入GCD的任务队列, GCD根据硬件的具体情况产生数量合理的线程, 将任务逐个发送到这些线程中并发运行. 无论是双核还是八核, 同样的程序通过GCD可以充分利用硬件资源, 硬件升级对应用程序透明. GCD线程池中的线程被队列中的任务不断重用, GCD队列比线程更轻, overhead更小(512KB vs 256B).</p>
<h3>异步</h3>
<p>尽管有GCD, 我们仍然面对数据共享, 锁等等同步问题的困扰. Apple通过GCD, 鼓励开发者用一种异步的思想来解决同步问题,将程序分成主线程和完成繁重工作的工作线程.</p>
<p>GCD队列中的任务,实际是通过Blocks来实现的, 可以将运行单位限制在很小的范围内,更容易控制运行上下文, 同时也很容易将本来有同步问题的代码送回主线程来完成.</p>
<p>GCD让异步运行和充分利用CPU变得前所未有的简单.</p>
<h3>OpenCL</h3>
<p>OpenCL是有关于如何充分利用GPU. 苹果希望通过OpenCL, 将一些适合与在GPU上做的运算,比如一些矢量运算,交给GPU. 基于现实的考虑, 苹果在设计OpenCL时, 并没有限定OpenCL程序只运行在GPU上, CPU也可以作为可选设备之一, 扩大了OpenCL的使用场景. </p>
<p>OpenCL对上层统一接口, 却可以根据底层不同硬件做实时优化, 完全是依赖于LLVM强大的JIT编译能力. OpenCL还使用了GCD来处理任务并行.</p>
<p>到此, 雪豹已经将硬件能力挖掘的淋漓尽致.</p>
<h3>其它</h3>
<p>Input Managers, SIMBL plug-ins不再被支持.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/robinlu?a=6C3JzqI0Lu8:aVDo5fjciLE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/robinlu?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robinlu?a=6C3JzqI0Lu8:aVDo5fjciLE:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/robinlu?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robinlu?a=6C3JzqI0Lu8:aVDo5fjciLE:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/robinlu?i=6C3JzqI0Lu8:aVDo5fjciLE:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/robinlu/~4/6C3JzqI0Lu8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.robinlu.com/blog/archives/488/feed</wfw:commentRss>
		<feedburner:origLink>http://www.robinlu.com/blog/archives/488</feedburner:origLink></item>
		<item>
		<title>小魔女简历（已授权）</title>
		<link>http://feedproxy.google.com/~r/robinlu/~3/weizF_RQI8I/487</link>
		<comments>http://www.robinlu.com/blog/archives/487#comments</comments>
		<pubDate>Tue, 01 Sep 2009 17:03:13 +0000</pubDate>
		<dc:creator>Robin Lu</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[daughter]]></category>

		<category><![CDATA[life]]></category>

		<guid isPermaLink="false">http://www.robinlu.com/blog/archives/487</guid>
		<description><![CDATA[
女儿下周要上幼儿园了。入园前要求准备简历一份。闷头写了一晚上。经授权，特此公布。
(防人肉，姓名略)，女，两岁半。
喜欢吃面食，吃饭比较慢，不太会用餐具。食物卡在牙缝中会停止进食，要求刷牙。有时候太大的食物嚼不动会要求吐出。
喜欢的形象有小熊维妮系列，天线宝宝，花园宝宝，喜羊羊系列。喜欢猫、狗、小兔子等等小动物，已注射狂犬疫苗，对蜗牛、蚂蚁、植物的种子等等也有兴趣。
跑跳能力一般，比较善于攀爬。对运动中一般的小磕碰不会在意。
性格谨慎，面对新环境或者陌生人面前会先选择在旁边观察，可以适当的鼓励，主要需要足够的时间，可以自己适应，慢慢主动融入。容易接受比她年龄稍大的小朋友。在熟悉环境中，或者和熟悉的人一起时会很爱说话。
有秩序感，生活习惯形成后会自觉遵守，对秩序的破坏有时会表现出不满。对别人动自己的东西会比较敏感，分享意愿不强，仍需培养。
困或者刚起床的时候比较容易烦躁。偶尔会因要求不能满足而发脾气，有可能脸和脖子都因为气愤而变红，气头上会拒绝任何条件，可以先让她发泄一两分钟后再做处理。
需要大小便的时候一般会自己提出，但仍然有些时候会便在裤子里，需要进一步训练。
]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.robinlu.com/blog/wp-content/uploads/2009/09/img-2336.jpg" width="320" height="213" alt="IMG_2336.jpg" style="float:right;" /></p>
<p><em>女儿下周要上幼儿园了。入园前要求准备简历一份。闷头写了一晚上。经授权，特此公布。</em></p>
<p>(防人肉，姓名略)，女，两岁半。</p>
<p>喜欢吃面食，吃饭比较慢，不太会用餐具。食物卡在牙缝中会停止进食，要求刷牙。有时候太大的食物嚼不动会要求吐出。</p>
<p>喜欢的形象有小熊维妮系列，天线宝宝，花园宝宝，喜羊羊系列。喜欢猫、狗、小兔子等等小动物，已注射狂犬疫苗，对蜗牛、蚂蚁、植物的种子等等也有兴趣。</p>
<p>跑跳能力一般，比较善于攀爬。对运动中一般的小磕碰不会在意。</p>
<p>性格谨慎，面对新环境或者陌生人面前会先选择在旁边观察，可以适当的鼓励，主要需要足够的时间，可以自己适应，慢慢主动融入。容易接受比她年龄稍大的小朋友。在熟悉环境中，或者和熟悉的人一起时会很爱说话。</p>
<p>有秩序感，生活习惯形成后会自觉遵守，对秩序的破坏有时会表现出不满。对别人动自己的东西会比较敏感，分享意愿不强，仍需培养。</p>
<p>困或者刚起床的时候比较容易烦躁。偶尔会因要求不能满足而发脾气，有可能脸和脖子都因为气愤而变红，气头上会拒绝任何条件，可以先让她发泄一两分钟后再做处理。</p>
<p>需要大小便的时候一般会自己提出，但仍然有些时候会便在裤子里，需要进一步训练。</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/robinlu?a=weizF_RQI8I:oqNyWhlZ5F8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/robinlu?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robinlu?a=weizF_RQI8I:oqNyWhlZ5F8:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/robinlu?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robinlu?a=weizF_RQI8I:oqNyWhlZ5F8:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/robinlu?i=weizF_RQI8I:oqNyWhlZ5F8:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/robinlu/~4/weizF_RQI8I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.robinlu.com/blog/archives/487/feed</wfw:commentRss>
		<feedburner:origLink>http://www.robinlu.com/blog/archives/487</feedburner:origLink></item>
		<item>
		<title>ChinaonRails关于Rubyist的调查</title>
		<link>http://feedproxy.google.com/~r/robinlu/~3/DtaU_g6D2U0/485</link>
		<comments>http://www.robinlu.com/blog/archives/485#comments</comments>
		<pubDate>Tue, 01 Sep 2009 03:15:39 +0000</pubDate>
		<dc:creator>Robin Lu</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[interview]]></category>

		<category><![CDATA[programmer]]></category>

		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.robinlu.com/blog/archives/485</guid>
		<description><![CDATA[望勤兄正在他的ChinaOnRails做一个中国Ruby/Rails优秀人物采访计划，我烂人一条，但也有幸接到了邀请。我觉得这些问题也很有意思，现在把我的答案同时公布在这里：
1. 请简单介绍一下你自己，留下Blog、Twitter等
Robin Lu
http://www.robinlu.com
@robinlu
2. 你是怎样找到你的第一个Ruby相关的工作的？
我和朋友辞职出来创业，开发一个网站，选用了Ruby On Rails框架。 
3. 你是在哪里和怎样搜索工作机会？你能给我一些最好的方法找到Ruby相关工作的建议吗？
很久没有找工作了。以前换工作一般是通过朋友的介绍，最后一次换工作是辞职创业。
国内Ruby的工作还不算多，除非对一门语言有特殊的感情或者自己给自己干活，我不建议工程师把自己限定在过于狭窄的领域，既然要找工作，最好为自己多留一些出路。
4. 你能给一个没有完整项目展示的Ruby新手一些建议吗？
首先，基础知识要扎实，最终考验程序员的都是语言以外的东西，语言只是一个外在的工具，用的好坏都看的是你的基础。除此之外，说到具体技术，如果是做互联网开发，最好掌握一些数据库知识，也要懂一些前端，熟悉HTML/CSS/Javascript，学习和了解一些成熟的构架和设计模式也是必要的。订阅一些相关的rss，了解社区的发展。Ruby社区中有很多开源项目，可以多去学习甚至参与这些项目。最好的办法就是多写多用。
5. 你可以说说怎样做可以让现在比过去更好的吗？主要是关于使用Ruby工作、客户、如何寻找好的客户方面。很多人梦想着现在比过去好，现在比将来好，所以请写下任何你关于超越过去的想法。
我不知道怎么回答这个问题，我只能说热爱你现在在做的事情，然后，尽人事，听天命。另外，如果你现在用的是微软Windows，改用苹果产品会让你比以前过的更好。如果你已经在用Mac了，那等下次升级吧。
6. 你可以推荐一些你认为将帮助一个程序员生活得更好的书籍、网站、秘诀吗？
我不知道什么能让程序员生活得更好，只是列部分我读过，看过，并且对我有过帮助的东西：
书：
Introduction To Algorithms
The Design of The Unix Operating System
Advanced Programming in the UNIX Environment以及其他你能找到的Richard Stevens的书
Design Pattern
Refactoring
Getting things done
网站：
我现在只看google reader了，但我认为它在消耗我的生命，不看它也许可以让我的生活更好
秘诀：
写一百万行代码。每工作日写一千行，四年可成。每工作日写四千行，一年可速成。
7. 你一周工作多长时间？你怎样保持工作效率和精力集中呢？
工作时间5&#215;8是我的标准，偶尔会多一点， 也可能少一点，基本上保持在40小时/周。
不要长期加班是保持工作效率的关键，另外，如果在时间管理上总是有问题的人可以看看GTD，会有所帮助。
要想保持精力集中，拔掉网线就可以了。
8. 你怎样管理你的工作空间？你在工作时使用哪些工具？
我的工作主要是在一个iMac上完成的，我需要的东西基本都在电脑里。
我使用的主要工具包括TextMate, Things, VMWare, Postbox, Sequel Pro, Goo, Adium, Skype, XCode, iCHM.
9. 怎样成为一个成功和有用的程序员？
 没用的程序员不多，比没用的manager少多了。至于怎么才算成功，每个人对成功的定义都不同，我这里也没有答案。
10. 什么是一个程序员应该知道的？
如何翻墙 
]]></description>
			<content:encoded><![CDATA[<p>望勤兄正在他的<a href="http://chinaonrails.com">ChinaOnRails</a>做一个<a href="http://chinaonrails.com/topic/view/3337.html">中国Ruby/Rails优秀人物采访计划</a>，我烂人一条，但也有幸接到了邀请。我觉得这些问题也很有意思，现在把我的答案同时公布在这里：</p>
<h3>1. 请简单介绍一下你自己，留下Blog、Twitter等</h3>
<p>Robin Lu<br />
http://www.robinlu.com<br />
@robinlu</p>
<h3>2. 你是怎样找到你的第一个Ruby相关的工作的？</h3>
<p>我和朋友辞职出来创业，开发一个网站，选用了Ruby On Rails框架。 </p>
<h3>3. 你是在哪里和怎样搜索工作机会？你能给我一些最好的方法找到Ruby相关工作的建议吗？</h3>
<p>很久没有找工作了。以前换工作一般是通过朋友的介绍，最后一次换工作是辞职创业。<br />
国内Ruby的工作还不算多，除非对一门语言有特殊的感情或者自己给自己干活，我不建议工程师把自己限定在过于狭窄的领域，既然要找工作，最好为自己多留一些出路。</p>
<h3>4. 你能给一个没有完整项目展示的Ruby新手一些建议吗？</h3>
<p>首先，基础知识要扎实，最终考验程序员的都是语言以外的东西，语言只是一个外在的工具，用的好坏都看的是你的基础。除此之外，说到具体技术，如果是做互联网开发，最好掌握一些数据库知识，也要懂一些前端，熟悉HTML/CSS/Javascript，学习和了解一些成熟的构架和设计模式也是必要的。订阅一些相关的rss，了解社区的发展。Ruby社区中有很多开源项目，可以多去学习甚至参与这些项目。最好的办法就是多写多用。</p>
<h3>5. 你可以说说怎样做可以让现在比过去更好的吗？主要是关于使用Ruby工作、客户、如何寻找好的客户方面。很多人梦想着现在比过去好，现在比将来好，所以请写下任何你关于超越过去的想法。</h3>
<p>我不知道怎么回答这个问题，我只能说热爱你现在在做的事情，然后，尽人事，听天命。另外，如果你现在用的是微软Windows，改用苹果产品会让你比以前过的更好。如果你已经在用Mac了，那等下次升级吧。</p>
<h3>6. 你可以推荐一些你认为将帮助一个程序员生活得更好的书籍、网站、秘诀吗？</h3>
<p>我不知道什么能让程序员生活得更好，只是列部分我读过，看过，并且对我有过帮助的东西：<br />
书：<br />
Introduction To Algorithms<br />
The Design of The Unix Operating System<br />
Advanced Programming in the UNIX Environment以及其他你能找到的Richard Stevens的书<br />
Design Pattern<br />
Refactoring<br />
Getting things done<br />
网站：<br />
我现在只看google reader了，但我认为它在消耗我的生命，不看它也许可以让我的生活更好<br />
秘诀：<br />
写一百万行代码。每工作日写一千行，四年可成。每工作日写四千行，一年可速成。</p>
<h3>7. 你一周工作多长时间？你怎样保持工作效率和精力集中呢？</h3>
<p>工作时间5&#215;8是我的标准，偶尔会多一点， 也可能少一点，基本上保持在40小时/周。<br />
不要长期加班是保持工作效率的关键，另外，如果在时间管理上总是有问题的人可以看看GTD，会有所帮助。<br />
要想保持精力集中，拔掉网线就可以了。</p>
<h3>8. 你怎样管理你的工作空间？你在工作时使用哪些工具？</h3>
<p>我的工作主要是在一个iMac上完成的，我需要的东西基本都在电脑里。<br />
我使用的主要工具包括TextMate, Things, VMWare, Postbox, Sequel Pro, Goo, Adium, Skype, XCode, iCHM.</p>
<h3>9. 怎样成为一个成功和有用的程序员？</h3>
<p> 没用的程序员不多，比没用的manager少多了。至于怎么才算成功，每个人对成功的定义都不同，我这里也没有答案。</p>
<h3>10. 什么是一个程序员应该知道的？</h3>
<p>如何翻墙 </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/robinlu?a=DtaU_g6D2U0:OL-uU5rnFFE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/robinlu?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robinlu?a=DtaU_g6D2U0:OL-uU5rnFFE:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/robinlu?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robinlu?a=DtaU_g6D2U0:OL-uU5rnFFE:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/robinlu?i=DtaU_g6D2U0:OL-uU5rnFFE:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/robinlu/~4/DtaU_g6D2U0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.robinlu.com/blog/archives/485/feed</wfw:commentRss>
		<feedburner:origLink>http://www.robinlu.com/blog/archives/485</feedburner:origLink></item>
		<item>
		<title>AgileChina 2009</title>
		<link>http://feedproxy.google.com/~r/robinlu/~3/9xz2DdrCYR4/482</link>
		<comments>http://www.robinlu.com/blog/archives/482#comments</comments>
		<pubDate>Thu, 20 Aug 2009 14:18:46 +0000</pubDate>
		<dc:creator>Robin Lu</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[agile]]></category>

		<category><![CDATA[agilechina]]></category>

		<category><![CDATA[pm]]></category>

		<guid isPermaLink="false">http://www.robinlu.com/blog/archives/482</guid>
		<description><![CDATA[ThoughtWorks作为倡导敏捷开发的旗舰公司，每年会在国内举办一次　AgileChina 敏捷中国大会。我一直是这个大会的常客，每年都受益非浅。
今年的AgileChian 2009比较特别，由ThoughtWorks和InfoQ中文站联合主办，实力大增，请来了很多重量级的人物。首先是Kent Beck，极限编程之父，TDD之养父，敏捷宣言十七人之一，在中国被广大程序员瞻仰的机会接近于日全食。
更让我感兴趣的是另一位大师，Dave Thomas，《The Pragmatic Programmer》、镐头书和《Agile Web Development with Rails》的合作者之一，Ruby和Ruby On Rails最热衷的推广者，不知道没有他，我还会不会在四年前一头扎入Ruby和Rails的世界，更不知道我的今天会是什么样。Dave在本次大会有两个演讲，一个是关于《The Pragmatic Programmer》十周年，谈方法论，一个是Ruby对象模型，讲技术，都是我非常感兴趣的话题。
昨天，从InfoQ中文站的泰稳那里得到一个优惠，如果你想参加AgileChina 2009，只要在报名过程中说是通过我介绍来参会的，有100元的优惠。感谢泰稳给我和大家提供的这样一个机会。具体大会的信息和报名，请参看敏捷中国大会官方网站。
]]></description>
			<content:encoded><![CDATA[<p>ThoughtWorks作为倡导敏捷开发的旗舰公司，每年会在国内举办一次　AgileChina 敏捷中国大会。我一直是这个大会的常客，每年都受益非浅。</p>
<p>今年的AgileChian 2009比较特别，由ThoughtWorks和InfoQ中文站联合主办，实力大增，请来了很多重量级的人物。首先是Kent Beck，极限编程之父，TDD之养父，敏捷宣言十七人之一，在中国被广大程序员瞻仰的机会接近于日全食。</p>
<p>更让我感兴趣的是另一位大师，Dave Thomas，《The Pragmatic Programmer》、镐头书和《Agile Web Development with Rails》的合作者之一，Ruby和Ruby On Rails最热衷的推广者，不知道没有他，我还会不会在四年前一头扎入Ruby和Rails的世界，更不知道我的今天会是什么样。Dave在本次大会有两个演讲，一个是关于《The Pragmatic Programmer》十周年，谈方法论，一个是Ruby对象模型，讲技术，都是我非常感兴趣的话题。</p>
<p>昨天，从InfoQ中文站的泰稳那里得到一个优惠，如果你想参加AgileChina 2009，只要在报名过程中说是通过我介绍来参会的，有100元的优惠。感谢泰稳给我和大家提供的这样一个机会。具体大会的信息和报名，请参看<a href="http://www.agilechina.net" >敏捷中国大会官方网站</a>。</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/robinlu?a=9xz2DdrCYR4:p3VWNcOIohs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/robinlu?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robinlu?a=9xz2DdrCYR4:p3VWNcOIohs:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/robinlu?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robinlu?a=9xz2DdrCYR4:p3VWNcOIohs:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/robinlu?i=9xz2DdrCYR4:p3VWNcOIohs:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/robinlu/~4/9xz2DdrCYR4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.robinlu.com/blog/archives/482/feed</wfw:commentRss>
		<feedburner:origLink>http://www.robinlu.com/blog/archives/482</feedburner:origLink></item>
		<item>
		<title>从 dreamhost 到 linode</title>
		<link>http://feedproxy.google.com/~r/robinlu/~3/dwznkIX2bPQ/475</link>
		<comments>http://www.robinlu.com/blog/archives/475#comments</comments>
		<pubDate>Sat, 27 Jun 2009 15:23:40 +0000</pubDate>
		<dc:creator>Robin Lu</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[dreamhost]]></category>

		<category><![CDATA[linode]]></category>

		<category><![CDATA[linux]]></category>

		<category><![CDATA[server]]></category>

		<guid isPermaLink="false">http://www.robinlu.com/blog/archives/475</guid>
		<description><![CDATA[2005年五月份，拿着七周年的折扣码在dreamhost上安家， 转眼就四年了。中间有过一些不愉快的经历，比如说可靠性，有一个9都很勉强了，偶尔“肥手指”还会在不通知你的情况下多扣你一年的费用。我要求也不高，多数时候就忍了，但上个月一次寻求dreamhost support的经历让我最终下决心离开它。
上个月有几天我在dreamhost上的几个网站频繁500，有一个彻底连不上了。发了support ticket，倒是很快得到答复，说我的网站占用CPU和内存太高，脚本进程就被监控程序杀掉了，然后热切的向我推荐他们的Dreamhost PS。我给他们看了看所有access.log的统计，一天也就三万多条记录，可error.log里却有一万八千多条记录，你们想推销VPS也不能靠这样的手段啊。他们看我不愿意升级，又说不出问题，就开始乱找原因，建议我封google和yahoo的robot，摘抄其中非常经典的一段：

  I checked the logs above and found that these sites are being accessed by
  search engine bots. For &#8216;xxx.com&#8217; I found the following:
  66 66.249.67.219
  40 74.125.44.136
  For &#8216;yyy.com&#8217;:
  99 66.249.70.134
  88 74.6.8.107
  Keep in mind the numbers you see above and [...]]]></description>
			<content:encoded><![CDATA[<p>2005年五月份，拿着七周年的折扣码在dreamhost上安家， 转眼就四年了。中间有过一些不愉快的经历，比如说可靠性，有一个9都很勉强了，偶尔“肥手指”还会在不通知你的情况下多扣你一年的费用。我要求也不高，多数时候就忍了，但上个月一次寻求dreamhost support的经历让我最终下决心离开它。</p>
<p>上个月有几天我在dreamhost上的几个网站频繁500，有一个彻底连不上了。发了support ticket，倒是很快得到答复，说我的网站占用CPU和内存太高，脚本进程就被监控程序杀掉了，然后热切的向我推荐他们的Dreamhost PS。我给他们看了看所有access.log的统计，一天也就三万多条记录，可error.log里却有一万八千多条记录，你们想推销VPS也不能靠这样的手段啊。他们看我不愿意升级，又说不出问题，就开始乱找原因，建议我封google和yahoo的robot，摘抄其中非常经典的一段：</p>
<blockquote><p>
  I checked the logs above and found that these sites are being accessed by<br />
  search engine bots. For &#8216;xxx.com&#8217; I found the following:</p>
<p>  66 66.249.67.219<br />
  40 74.125.44.136</p>
<p>  For &#8216;yyy.com&#8217;:</p>
<p>  99 66.249.70.134<br />
  88 74.6.8.107</p>
<p>  Keep in mind the numbers you see above and the count you produced is the<br />
  number of accesses to the sites in the last 6 hours. So, those totals<br />
  are pretty high for just 6 hours.
</p></blockquote>
<p>六小时，总计不超过300次访问，他们认为pretty high。我直接回信告诉他们，别说六小时，就是一分钟有300次访问，我也不认为是pretty high。他们只好承认他们也没办法，然后继续推销PS，!@#$。</p>
<p>我在dreamhost的硬盘限量是438GB，用了不到4G，带宽限量是每月8T，用不到2G，我就host了几个pv全加起来不超过4000/天的wordpress，在dreamhost上就已经是除了PS无路可选了。我想了下，也许是该找个VPS了，但绝对不会再是Dreamhost!</p>
<p>几经挑选，选中了很多朋友都推荐的 <a href="http://www.linode.com/?r=d029471030a552370553ffeb9ea65385ef6ce3fa" title="linode">linode</a> , 买了Linode 360, 独立IP, 支持众多linux发行版，root权限，想怎么折腾怎么折腾。虽然比我在dreamhost上的share host贵了一倍，但比同等内存的dreamhost PS便宜1/3以上，连接速度也比我所在的dreamhost的服务器连接速度快很多。</p>
<p>装了ubuntu，用nginx带FastCGI跑PHP5，把我的wordpress一点点都挪过来了。一个月下来，运转良好。下个月就可以不再给dreamhost续费，彻底拜拜，做个happy linoder了。</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/robinlu?a=dwznkIX2bPQ:C6CNl0qAtYQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/robinlu?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robinlu?a=dwznkIX2bPQ:C6CNl0qAtYQ:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/robinlu?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robinlu?a=dwznkIX2bPQ:C6CNl0qAtYQ:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/robinlu?i=dwznkIX2bPQ:C6CNl0qAtYQ:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/robinlu/~4/dwznkIX2bPQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.robinlu.com/blog/archives/475/feed</wfw:commentRss>
		<feedburner:origLink>http://www.robinlu.com/blog/archives/475</feedburner:origLink></item>
		<item>
		<title>Too Bad</title>
		<link>http://feedproxy.google.com/~r/robinlu/~3/B-ejAMGZPBk/473</link>
		<comments>http://www.robinlu.com/blog/archives/473#comments</comments>
		<pubDate>Fri, 26 Jun 2009 09:00:51 +0000</pubDate>
		<dc:creator>Robin Lu</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[life]]></category>

		<category><![CDATA[music]]></category>

		<guid isPermaLink="false">http://www.robinlu.com/blog/?p=473</guid>
		<description><![CDATA[听着双卡录音机里发出奇怪的声音, 我的第一反应是, 男的女的? 因为即使从磁带的封面, 我也分辨不出来. 同学告诉我这是全世界最红的歌星, 声音&#8220;宛若童子&#8220;, 男的. 虽然刚学过两年多英语, Bad还是认识的, 怎么翻译成&#8220;真棒&#8220;? 同学又告诉我, 这是美国最新的说法, 越是bad, 越是真棒. 
二十年前, 在初中同学的家里, 听着Michael Jackson的Bad, 我的感觉除了颠覆就是颠覆.
就在那个最好的年代, 我们有着数不清的记忆和MJ相关. 我现在还能记得同学模仿 Liberian Girl 开头女声的腔调, 丝毫没有心神不宁的感觉. 我们在街机厅奋战Moonwalker, 就为了每次按完保险后看MJ的一段舞蹈. 还有一天晚上, 一个哥们跑到我家, 他从一个很有好感的女生那里借了一盘磁带, 是那种双面超长磁带, 一面是Bad, 一面是Thriller, 带基很薄, 不小心听断了, 帮他连夜接好, 翻录了一份还回去.
大学时期, 听的东西越来越多, 唱风难有突破的MJ已经让人审美疲劳, 不再是我的偶像, 甚至很长时间都不太愿意承认自己还曾经痴迷过他, 连他的磁带也一并送人. 直到2001年, 在美国出差, 有天晚上打开电视, 刚好是MJ 30周年演唱会, 百无聊赖坐下来看, 一看就动不了了. 就是这样, 无论我多么不愿意承认, MJ永远会触动我的一部分神经.
今天早上, 一起来就听说MJ走了. 我不知道该说什么, [...]]]></description>
			<content:encoded><![CDATA[<p>听着双卡录音机里发出奇怪的声音<span>, </span>我的第一反应是<span>, </span>男的女的<span>? </span>因为即使从磁带的封面<span>, </span>我也分辨不出来<span>. </span>同学告诉我这是全世界最红的歌星<span>, </span>声音<span>&#8220;</span>宛若童子<span>&#8220;, </span>男的<span>. </span>虽然刚学过两年多英语<span>, Bad</span>还是认识的<span>, </span>怎么翻译成<span>&#8220;</span>真棒<span>&#8220;? </span>同学又告诉我<span>, </span>这是美国最新的说法<span>, </span>越是<span>bad, </span>越是真棒<span>. </span></p>
<p>二十年前<span>, </span>在初中同学的家里<span>, </span>听着<span>Michael Jackson</span>的<span>Bad, </span>我的感觉除了颠覆就是颠覆<span>.</span></p>
<p>就在那个最好的年代<span>, </span>我们有着数不清的记忆和<span>MJ</span>相关<span>. </span>我现在还能记得同学模仿<span> Liberian Girl </span>开头女声的腔调<span>, </span>丝毫没有心神不宁的感觉<span>. </span>我们在街机厅奋战<span>Moonwalker, </span>就为了每次按完保险后看<span>MJ</span>的一段舞蹈<span>. </span>还有一天晚上<span>, </span>一个哥们跑到我家<span>, </span>他从一个很有好感的女生那里借了一盘磁带<span>, </span>是那种双面超长磁带<span>, </span>一面是<span>Bad, </span>一面是<span>Thriller, </span>带基很薄<span>, </span>不小心听断了<span>, </span>帮他连夜接好<span>, </span>翻录了一份还回去<span>.</span></p>
<p>大学时期<span>, </span>听的东西越来越多<span>, </span>唱风难有突破的<span>MJ</span>已经让人审美疲劳<span>, </span>不再是我的偶像<span>, </span>甚至很长时间都不太愿意承认自己还曾经痴迷过他<span>, </span>连他的磁带也一并送人<span>. </span>直到<span>2001</span>年<span>, </span>在美国出差<span>, </span>有天晚上打开电视<span>, </span>刚好是<span>MJ 30</span>周年演唱会<span>, </span>百无聊赖坐下来看<span>, </span>一看就动不了了<span>. </span>就是这样<span>, </span>无论我多么不愿意承认<span>, MJ</span>永远会触动我的一部分神经<span>.</span></p>
<p>今天早上<span>, </span>一起来就听说<span>MJ</span>走了<span>. </span>我不知道该说什么<span>, </span>这几年我们不断的在送走我们曾经爱过的人<span>, </span>七零后到了这样的时候了吧<span>. 但是</span>我真<span>TM</span>讨厌这样的时刻<span>.</span></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/robinlu?a=B-ejAMGZPBk:snPKUAqPDoo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/robinlu?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robinlu?a=B-ejAMGZPBk:snPKUAqPDoo:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/robinlu?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robinlu?a=B-ejAMGZPBk:snPKUAqPDoo:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/robinlu?i=B-ejAMGZPBk:snPKUAqPDoo:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/robinlu/~4/B-ejAMGZPBk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.robinlu.com/blog/archives/473/feed</wfw:commentRss>
		<feedburner:origLink>http://www.robinlu.com/blog/archives/473</feedburner:origLink></item>
	</channel>
</rss>
