<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>灰色的灵魂 &#187; Life</title>
	<atom:link href="http://www.xuwenhao.com/category/life/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.xuwenhao.com</link>
	<description>生命如此短暂，掌握技艺却要如此长久</description>
	<lastBuildDate>Fri, 27 Jan 2012 11:23:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Yet Another Year</title>
		<link>http://www.xuwenhao.com/2012/01/22/yet-another-year/</link>
		<comments>http://www.xuwenhao.com/2012/01/22/yet-another-year/#comments</comments>
		<pubDate>Sun, 22 Jan 2012 07:45:00 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
				<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=823</guid>
		<description><![CDATA[又是超快的一年过去了，特别是从7月份开始，都觉得没有怎么喘气，一下子就2012了，翻了一下去年的新年愿望，发现完成度依然很低啊，但是其实过去这一年收获很大，在多年觉得自己没有太大成长之后，又有了升级涨经验值的感觉，在30之前再次找到这种感觉，还算是很不错的。 去年对于今年设想中，除了给Mahout打了几个超级简单的Patch之外和飞的海南过了个周末之外，其余都没有达成，生活变化得太快。忽然又开始重新承担技术管理者的角色，于是对于自身技术研究的很多设想只好放下不少，其实到现在我也还会有点怀疑回到管理者角色而不是专心写代码对我究竟是合适还是不合适，但是被逼着同时run好几个项目和模块反而在这上面重新有了不少的成长。负面效应是，集中思考记忆的能力大大下降，以前一天看个一两百页英文技术书籍不成问题，最近看个十页精神就集中不起来了，这个需要自己好好调整一下了。 想看的技术书籍没有一本看完的，SICP没动，PRML只是少量温习了去年看过的一部分，POSA完全没看，不过现在反而觉得POSA没有必要看了。但是还是一贯漫无目的的看了一些其他的，Mahout In Action看了半本，不准备接着看完，Manning的In Action系列也没有必要预先看。DSL看了一半，有点Boring，目前看到的都是我知道的内容，但是从来没有整理过知识体系，The Joy Of Clojure看了个开头。今年所有的成长感都来自&#8221;Learning By Doing&#8221;，唯一和工作相关性比较大的书是Behind The Closed Door，让自己重新找回了点感觉。 如果说每年学一门新的编程语言的话，今年能勉强算得上的就是Pig这门DSL了，相当好用啊。明年的话，应该是尝试用点Clojure，继续多用用Ruby，少用用“新时代的汇编语言”Java。 新的一年，有一些过去的目标要放弃，我自己可不是什么天才，新的一年里，争取翻一遍PRML吧，不敢说看完了，其他的，看到哪里算哪里，The Joy of Clojure估计可以轻松看完，其余的预计也抽不出太多时间。另外，争取每两周写一篇Blog吧，除了类似新年这种事情，不写生活类了，多做点有实际价值的东西吧。 对于工作，很高兴和很多超级聪明勤奋的人一起工作，希望今年能真真正正用技术手段帮公司多挣到一点钱。希望团队里的同学们都能觉得每天来上班是高兴的一件事情，少点由于我的混乱带来的加班，多点让人兴奋的新系统，新模型，新Feature带来的效果。 过去一年比较糟糕的是，忽然开始有白发，长了10斤肉到肚子上，真的要开始锻炼了，不然蹦跶不了几年了。要去把已经过期了的护照和港澳通行证办好，无论如何带儿子去趟香港，少上网，少上微博，多读书，多走动，多运动，多思考。 去年说不再多花钱在电子产品上的，但是最终还是年前签了个iPhone，然后瞬间安逸了，明年真的没有什么可买的了，把买来的书都看看完吧。 最后，祝福某两人啊，很为你们感到高兴:-)。]]></description>
			<content:encoded><![CDATA[<p>又是超快的一年过去了，特别是从7月份开始，都觉得没有怎么喘气，一下子就2012了，翻了一下去年的<a href="http://www.xuwenhao.com/2011/02/01/wishes-for-the-rabbit-year/" target="_blank">新年愿望</a>，发现完成度依然很低啊，但是其实过去这一年收获很大，在多年觉得自己没有太大成长之后，又有了升级涨经验值的感觉，在30之前再次找到这种感觉，还算是很不错的。</p>
<p>去年对于今年设想中，除了给Mahout打了几个超级简单的Patch之外和飞的海南过了个周末之外，其余都没有达成，生活变化得太快。忽然又开始重新承担技术管理者的角色，于是对于自身技术研究的很多设想只好放下不少，其实到现在我也还会有点怀疑回到管理者角色而不是专心写代码对我究竟是合适还是不合适，但是被逼着同时run好几个项目和模块反而在这上面重新有了不少的成长。负面效应是，集中思考记忆的能力大大下降，以前一天看个一两百页英文技术书籍不成问题，最近看个十页精神就集中不起来了，这个需要自己好好调整一下了。</p>
<p>想看的技术书籍没有一本看完的，SICP没动，PRML只是少量温习了去年看过的一部分，POSA完全没看，不过现在反而觉得POSA没有必要看了。但是还是一贯漫无目的的看了一些其他的，Mahout In Action看了半本，不准备接着看完，Manning的In Action系列也没有必要预先看。DSL看了一半，有点Boring，目前看到的都是我知道的内容，但是从来没有整理过知识体系，The Joy Of Clojure看了个开头。今年所有的成长感都来自&#8221;Learning By Doing&#8221;，唯一和工作相关性比较大的书是Behind The Closed Door，让自己重新找回了点感觉。</p>
<p>如果说每年学一门新的编程语言的话，今年能勉强算得上的就是Pig这门DSL了，相当好用啊。明年的话，应该是尝试用点Clojure，继续多用用Ruby，少用用“新时代的汇编语言”Java。</p>
<p>新的一年，有一些过去的目标要放弃，我自己可不是什么天才，新的一年里，争取翻一遍PRML吧，不敢说看完了，其他的，看到哪里算哪里，The Joy of Clojure估计可以轻松看完，其余的预计也抽不出太多时间。另外，争取每两周写一篇Blog吧，除了类似新年这种事情，不写生活类了，多做点有实际价值的东西吧。</p>
<p>对于工作，很高兴和很多超级聪明勤奋的人一起工作，希望今年能真真正正用技术手段帮公司多挣到一点钱。希望团队里的同学们都能觉得每天来上班是高兴的一件事情，少点由于我的混乱带来的加班，多点让人兴奋的新系统，新模型，新Feature带来的效果。</p>
<p>过去一年比较糟糕的是，忽然开始有白发，长了10斤肉到肚子上，真的要开始锻炼了，不然蹦跶不了几年了。要去把已经过期了的护照和港澳通行证办好，无论如何带儿子去趟香港，少上网，少上微博，多读书，多走动，多运动，多思考。</p>
<p>去年说不再多花钱在电子产品上的，但是最终还是年前签了个iPhone，然后瞬间安逸了，明年真的没有什么可买的了，把买来的书都看看完吧。</p>
<p>最后，祝福某两人啊，很为你们感到高兴:-)。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2012/01/22/yet-another-year/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>入手了个Kindle</title>
		<link>http://www.xuwenhao.com/2011/06/08/bought-a-kindle-and-ideas-on-ebook/</link>
		<comments>http://www.xuwenhao.com/2011/06/08/bought-a-kindle-and-ideas-on-ebook/#comments</comments>
		<pubDate>Wed, 08 Jun 2011 14:09:06 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
				<category><![CDATA[Book]]></category>
		<category><![CDATA[Idea]]></category>
		<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=804</guid>
		<description><![CDATA[一方面是收到K总蛊惑，一方面是决定调整下多看点书，不能每天浪费太多时间刷微博，但是天天带iPad一是沉，而是的确很费眼睛。于是小长假前未经领导批示，大出血入了Kindle 3G+官方带灯皮套，目前看来，Kindle物有所值，受K总忽悠入了3G版其实意义不大，带灯皮套很好，但是价格太坑爹了。 3月份过完年的时候给老妈买了个百看，这次本来也是在各类电子书之间犹豫的，买了Kindle主要还是看重有些书可以直接在Amazon买Kindle版，排版比自己用PDF转的要好多了。到手之后，发现做工上Kindle还是比百看强出一条街的，翻页响应也快不少，不过就是保修麻烦，而上次那个百看买了两个月都没怎么用过就花屏了，寄回京东重新换了个新的。所以这回干脆狠狠心入了个皮套，想想3G版都买了，于是干脆入了个带灯的皮套，于是最后花出去的钱基本可以买两个广告版的了，还是比较烧包的。 用了两天，总结如下: 从看书来说，E-Ink秒杀一切，除了随手写写画画和快速翻页比不上纸质书，其余都远远超出，而且如果是用来看非技术类书籍，因为基本不需要记录，可以认为是完美，甚至可以说超过了纸质书 Kindle最大的优势应该是Amazon背后强大的内容，这个其实和iPad是一样的，我先是下了个Kindle版的Domain Specific Languages的sample，看完了Chapter1.1于是掏出信用卡买了全本电子版。 3G对美国人民可能很有用，但是对中国人民意思不大，会检查你的ip所在的国度，要求传真验证地址身份，看看到时候麻烦哪位在美国的同学把Kindle挂到他名下去 皮套的保护很不错，可是太厚重了，加了皮套单手持着就有些中了。灯很有意义，特别是晚上坐公车回家的时候，供电设计也很有意思，只是不能均匀照射到整个屏幕 6寸的Kindle，用来看技术书，如果是Kindle版的或者正版制作好的mobi版可以接受，但是Kindle DXG应该会更加完美 键盘加bookmark和note还是有一定意义的，内置字典非常有用，没有必要刷多看，原生系统用来看书足够了 原生的PDF阅读功能基本没用，书还是要转成Mobi，因为PDF的不能重排也不能调字体，所以等于没用，专门制作的6寸的PDF太罕见了，而且如果是专门制作的，完全可以搞Mobi么 Anyway，结论是，重度阅读者必备工具啊，让随时随地的阅读体验大大提升。 回过头来说，书籍电子化已经发展了很多年了，然而作为一个中国人民，想舒舒服服看电子书仍然只有糟糕的两个选择，盗版，或者装作一个美国人民。就像我前面说得，Kindle对我来说，最有吸引力的并不是3G上网或者硬件设备，而是在良好的阅读体验之上，Amazon拥有的无数Well-Formatted的书，这样我就不再需要买纸质书占地方了，而且所有的书，我都可以在看完sample之后决定要不要买，从这个角度来说，Kindle 3G可以提供的可以说是最佳的购书体验了。不需要你没有看过书就决定买不买(目前国内网上买书最大的缺点是很多书不知道值不值得买来看)，也不许要跑到书店里去买(我已经多年没有进过书店了，但是这几年)，甚至都不需要等快递送上门了(有时候想看书买了之后等快递要一个礼拜)。 可惜，这些优势都是只有美国人民有，中国人民只能 1. 装作美国人掏美刀跑到Amazon上买还要受歧视不让你买 2. 盗版，而且那么多年，这些国内的出版商和零售商真是完全不思进取，严肃书籍，除了China-Pub搞了些没人看的技术书籍电子版之外，就没有人有动作的。我一直认为，最蠢的一种想法就是惧怕盗版，要知道，这个阵地他们不占领，就会被盗版占领，现在互联网上已经有大量的自制的盗版版本了，质量虽然比不上Amazon Kindle的那种，有些错字，但是完全可以看了，不出电子版，就只能坐等大家去看盗版。如果真能够做到像Amazon在北美那样，可以试看，购买，同步，记笔记，同步笔记，然后绑定好设备来给盗版增加麻烦，我相信虽然不可能是一个iPad这样的市场，也会完全是一个有得做的市场，事实上，国内目前的iOS的App也有不少的正版软件消费量了。 当然，其实大家都知道，国内的出版商和在线零售商是没有足够的技术支撑来干这事儿的，唯一有点指望的是卓越能够跨过外资这道门槛把Amazon在美国的服务复制到中国来，或者，用脚投票投奔U.S.A.去。如果国内的电子书渠道能够像Amazon在美国这样，我想我就会考虑再入一台Kindle DXG的。]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.xuwenhao.com/wp-content/uploads/2011/06/kindle2.jpg"><img src="http://www.xuwenhao.com/wp-content/uploads/2011/06/kindle2-300x224.jpg" alt="" title="Kindle3G" width="300" height="224" class="aligncenter size-medium wp-image-805" /></a></p>
<p>一方面是收到<a href="http://www.kimmychen.com">K总</a>蛊惑，一方面是决定调整下多看点书，不能每天浪费太多时间刷微博，但是天天带iPad一是沉，而是的确很费眼睛。于是小长假前未经领导批示，大出血入了Kindle 3G+官方带灯皮套，目前看来，Kindle物有所值，受K总忽悠入了3G版其实意义不大，带灯皮套很好，但是价格太坑爹了。</p>
<p>3月份过完年的时候给老妈买了个百看，这次本来也是在各类电子书之间犹豫的，买了Kindle主要还是看重有些书可以直接在Amazon买Kindle版，排版比自己用PDF转的要好多了。到手之后，发现做工上Kindle还是比百看强出一条街的，翻页响应也快不少，不过就是保修麻烦，而上次那个百看买了两个月都没怎么用过就花屏了，寄回京东重新换了个新的。所以这回干脆狠狠心入了个皮套，想想3G版都买了，于是干脆入了个带灯的皮套，于是最后花出去的钱基本可以买两个广告版的了，还是比较烧包的。</p>
<p>用了两天，总结如下:</p>
<ul>
<li>从看书来说，E-Ink秒杀一切，除了随手写写画画和快速翻页比不上纸质书，其余都远远超出，而且如果是用来看非技术类书籍，因为基本不需要记录，可以认为是完美，甚至可以说超过了纸质书</li>
<li>Kindle最大的优势应该是Amazon背后强大的内容，这个其实和iPad是一样的，我先是下了个Kindle版的<em><a href="http://www.amazon.com/Domain-Specific-Languages-ebook/dp/B003ZUYJ3G/ref=sr_1_1?s=digital-text&#038;ie=UTF8&#038;qid=1307542070&#038;sr=1-1">Domain Specific Languages</a></em>的sample，看完了Chapter1.1于是掏出信用卡买了全本电子版。</li>
<li>3G对美国人民可能很有用，但是对中国人民意思不大，会检查你的ip所在的国度，要求传真验证地址身份，看看到时候麻烦哪位在美国的同学把Kindle挂到他名下去</li>
<li>皮套的保护很不错，可是太厚重了，加了皮套单手持着就有些中了。灯很有意义，特别是晚上坐公车回家的时候，供电设计也很有意思，只是不能均匀照射到整个屏幕</li>
<li>6寸的Kindle，用来看技术书，如果是Kindle版的或者正版制作好的mobi版可以接受，但是Kindle DXG应该会更加完美</li>
<li>键盘加bookmark和note还是有一定意义的，内置字典非常有用，没有必要刷多看，原生系统用来看书足够了</li>
<li>原生的PDF阅读功能基本没用，书还是要转成Mobi，因为PDF的不能重排也不能调字体，所以等于没用，专门制作的6寸的PDF太罕见了，而且如果是专门制作的，完全可以搞Mobi么</li>
</ul>
<p>Anyway，结论是，重度阅读者必备工具啊，让随时随地的阅读体验大大提升。</p>
<p>回过头来说，书籍电子化已经发展了很多年了，然而作为一个中国人民，想舒舒服服看电子书仍然只有糟糕的两个选择，盗版，或者装作一个美国人民。就像我前面说得，Kindle对我来说，最有吸引力的并不是3G上网或者硬件设备，而是在良好的阅读体验之上，Amazon拥有的无数Well-Formatted的书，这样我就不再需要买纸质书占地方了，而且所有的书，我都可以在看完sample之后决定要不要买，从这个角度来说，Kindle 3G可以提供的可以说是最佳的购书体验了。不需要你没有看过书就决定买不买(目前国内网上买书最大的缺点是很多书不知道值不值得买来看)，也不许要跑到书店里去买(我已经多年没有进过书店了，但是这几年)，甚至都不需要等快递送上门了(有时候想看书买了之后等快递要一个礼拜)。</p>
<p>可惜，这些优势都是只有美国人民有，中国人民只能 1. 装作美国人掏美刀跑到Amazon上买还要受歧视不让你买 2. 盗版，而且那么多年，这些国内的出版商和零售商真是完全不思进取，严肃书籍，除了China-Pub搞了些没人看的技术书籍电子版之外，就没有人有动作的。我一直认为，最蠢的一种想法就是惧怕盗版，要知道，这个阵地他们不占领，就会被盗版占领，现在互联网上已经有大量的自制的盗版版本了，质量虽然比不上Amazon Kindle的那种，有些错字，但是完全可以看了，不出电子版，就只能坐等大家去看盗版。如果真能够做到像Amazon在北美那样，可以试看，购买，同步，记笔记，同步笔记，然后绑定好设备来给盗版增加麻烦，我相信虽然不可能是一个iPad这样的市场，也会完全是一个有得做的市场，事实上，国内目前的iOS的App也有不少的正版软件消费量了。</p>
<p>当然，其实大家都知道，国内的出版商和在线零售商是没有足够的技术支撑来干这事儿的，唯一有点指望的是卓越能够跨过外资这道门槛把Amazon在美国的服务复制到中国来，或者，用脚投票投奔U.S.A.去。如果国内的电子书渠道能够像Amazon在美国这样，我想我就会考虑再入一台Kindle DXG的。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2011/06/08/bought-a-kindle-and-ideas-on-ebook/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Go Back to the Fundamental</title>
		<link>http://www.xuwenhao.com/2011/02/19/go-back-to-the-fundamental/</link>
		<comments>http://www.xuwenhao.com/2011/02/19/go-back-to-the-fundamental/#comments</comments>
		<pubDate>Sat, 19 Feb 2011 12:57:18 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
				<category><![CDATA[Idea]]></category>
		<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=782</guid>
		<description><![CDATA[这周LJ发现系统里有大量的缓存没有清掉，一开始误以为是我的定时提交的Job中有什么问题，虽然最终发现是因为系统对于验证阶段不能通过的Job就会缓存Job文件供日后分析，但是在怀疑自己提交的Job有问题的时候，花了两天时间清理掉了以前没有解决的Bug，并且进一步发现了某些Bug的深层原因。这事儿又是给自己一个教训，一是凡是出错必有原因。二是所有新功能都应当在显然是Bug的东西修复了之后完成。其实这样的错误不是第一次犯了，而且从道理上也清楚的知道该怎么做，但是时不时总会觉得自己已经有足够的经验去把握各种优先级了，于是时不时就会再犯一次，希望这是最后一次了。大部分事情要做好其实很简单，按照自然规律，一步一步仔仔细细做完，Over，可惜总是急躁地想抄近道，最后在事后付出代价。好在的确工作年限多了点，现在犯的错误往往不是致命的，最多也就是多浪费了那么一点时间罢了。 今天又和好久未见的Mars同学聊了一阵，现在我们算是一个行业里了，聊到目前飞速发展的互联网和电子商务，一边感慨的确入对了行，一边也都觉得行业里大部分的人还都是过于浮躁了，机会虽然看起来很多，但是大家都急冲冲地做的结果就是门槛看似很低，但是大部分都会死。然而很多死者，无论是做技术还是做市场做商务的，其实都没有真正做到把自己的事情做好，也许真是要退潮了，才能看出谁是裸泳者。 其实这个和写程序是一样的，问题暴露出来之前，各种抄近道导致的Tech Debt都不会被意识到的，所以还是告诫自己，有耐心地，一点一滴的把事情做好。 看了看春节里写的今年看三本书的计划，当时我还觉得时间还蛮宽裕的，但是仔细算算，其实也不怎么够用，如果每天看个一两节，其实看完这三本书一年都不够，不管了，每天1-3节吧，多了也坚持不下来的。]]></description>
			<content:encoded><![CDATA[<p>这周LJ发现系统里有大量的缓存没有清掉，一开始误以为是我的定时提交的Job中有什么问题，虽然最终发现是因为系统对于验证阶段不能通过的Job就会缓存Job文件供日后分析，但是在怀疑自己提交的Job有问题的时候，花了两天时间清理掉了以前没有解决的Bug，并且进一步发现了某些Bug的深层原因。这事儿又是给自己一个教训，一是凡是出错必有原因。二是所有新功能都应当在显然是Bug的东西修复了之后完成。其实这样的错误不是第一次犯了，而且从道理上也清楚的知道该怎么做，但是时不时总会觉得自己已经有足够的经验去把握各种优先级了，于是时不时就会再犯一次，希望这是最后一次了。大部分事情要做好其实很简单，按照自然规律，一步一步仔仔细细做完，Over，可惜总是急躁地想抄近道，最后在事后付出代价。好在的确工作年限多了点，现在犯的错误往往不是致命的，最多也就是多浪费了那么一点时间罢了。</p>
<p>今天又和好久未见的Mars同学聊了一阵，现在我们算是一个行业里了，聊到目前飞速发展的互联网和电子商务，一边感慨的确入对了行，一边也都觉得行业里大部分的人还都是过于浮躁了，机会虽然看起来很多，但是大家都急冲冲地做的结果就是门槛看似很低，但是大部分都会死。然而很多死者，无论是做技术还是做市场做商务的，其实都没有真正做到把自己的事情做好，也许真是要退潮了，才能看出谁是裸泳者。</p>
<p>其实这个和写程序是一样的，问题暴露出来之前，各种抄近道导致的Tech Debt都不会被意识到的，所以还是告诫自己，有耐心地，一点一滴的把事情做好。</p>
<p>看了看春节里写的今年看三本书的计划，当时我还觉得时间还蛮宽裕的，但是仔细算算，其实也不怎么够用，如果每天看个一两节，其实看完这三本书一年都不够，不管了，每天1-3节吧，多了也坚持不下来的。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2011/02/19/go-back-to-the-fundamental/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>不对自我设限与来自未来的挑战</title>
		<link>http://www.xuwenhao.com/2011/02/09/dont-limit-yourself-and-the-challenge-from-the-future/</link>
		<comments>http://www.xuwenhao.com/2011/02/09/dont-limit-yourself-and-the-challenge-from-the-future/#comments</comments>
		<pubDate>Wed, 09 Feb 2011 14:02:07 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
				<category><![CDATA[Idea]]></category>
		<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=778</guid>
		<description><![CDATA[话说我是一贯认为程序员是个很有前途的职业，因为工作的这几年来，最大的感触就是好的程序员太少，好的程序员的供给，其实是远远小于市场的需求的。这个原因有两方面，一方面是，贵国发展太快，聪明的孩子们现在的选择太多，当PM的，当Dev Manager的，甚或是转行去读MBA的，考公务员的，搞金融的，总之是聪明人的挣钱过舒服日子的实在不少，于是，程序员这个很有前途的职业就被大家放弃了；另一方面，互联网行业在贵国发展太快，现在需要好的程序员的公司实在太多。这样一两面夹击，您要真是能做个优秀的开发人员，过过中产生活应当是绰绰有余(当然，您要在北京二环买房，没有个叫李刚的爸爸可能买不了)。而且，您要真是个优秀的程序员，也是可以干到60岁的，常见的所谓30岁怎么办，其实是个巨大的误区，这个问题，因为不是本文的主旨，所以就不展开讨论了，下次专门写个文章说一下为啥这行业可以干到60岁。 然而尽管我如此认为，我最近也时常想，也许20年后我也不一定每天写程序了，虽然每天写程序的概率仍然很大。之所以这么想，其中有一部分是因为这个链接。想想几十年前，汽车业也是最NB，最伟大的行业啊，虽然现在也算不上夕阳行业了，但是远不如那时候那么激动人心了。想想福特的蓝血十杰，要搁现在应该都去华尔街或者干互联网了吧。所以虽然现在的互联网仍然是风起云涌，是各位好人们挥洒大好青春的领地，但是在等20年，可能最刺激的时代就会过去了吧。而我之所以现在仍然自称喜欢写程序，无非是三方面的原因，一是求知的乐趣，二是看得到奔头的物质回报，三是觉得自己好歹在创造点有用的东西的成就感。而每当看到这样的文章的我，就容易头脑发热，觉得自己死活应该去读个博士。 所以我想，虽然我接下来四五年一定是在做程序员这个很有前途的行业，但是几年以后如果能像Elon Musk或者John Carmack一样参与到发射火箭的活动中，我会毫不犹豫跑去吧，所以为了这个，我也应该做个学好数学的程序员吧，对于擅长逻辑思维和计算的我，写程序和数学算是我未来有机会跨行业干活的重要工具吧。 说到这里估计会被人当作少不经事太爱幻想，不过这几年我越来越发现人不能对自我设限，自我设限通常结果不是让你脚踏实地而是容易让你原地踏步。本来我想我大学没好好念书，也就不想啥再去读个PhD了，但是看了Paul McKenney老人家的简历，我觉其实准备准备也可以考虑三四十去读个PhD么？以前总觉得没指望名片上从Mr.改成Dr.的限制其实都来自自己么？其实，工作了这几年，越来越发现，其实身边的大牛们，并没有比我多个脑袋，或者一定每天只需要睡4个小时，无非是天赋、机遇、眼界，加上日供一卒的努力罢了，大部分身边的大牛们，和你我的差别不在天赋上，不在机遇上，而往往是在眼界和每日持续的努力上。而自我设限，一是愣把眼界降低一层，非觉得别人能拿一等奖能读博，自己不能总只想着卖烧饼；二是往往主动放弃了每天向前一点点的努力，因为觉得读不了博了干脆就不学点儿难的数学GRE或者Lisp了。最后是啥也没干成，但这种自我预言的实现是十足地犯傻呢。 未来还很长呢，想想十多年前上大学的时候，我还没手机呢，现在手机3G上网都比我家上网快了，又有谁会知道15年后我会去干什么，虽然多半我仍然在写着我那很有前途的程序，兴许外星人真来了我去当翻译了呢。虽然，图灵奖我估摸着的确应该是拿不了了，但咱们怎么也这辈子读个博士，发两篇有点儿意义的论文先吧。]]></description>
			<content:encoded><![CDATA[<p>话说我是一贯认为程序员是个很有前途的职业，因为工作的这几年来，最大的感触就是好的程序员太少，好的程序员的供给，其实是远远小于市场的需求的。这个原因有两方面，一方面是，贵国发展太快，聪明的孩子们现在的选择太多，当PM的，当Dev Manager的，甚或是转行去读MBA的，考公务员的，搞金融的，总之是聪明人的挣钱过舒服日子的实在不少，于是，程序员这个很有前途的职业就被大家放弃了；另一方面，互联网行业在贵国发展太快，现在需要好的程序员的公司实在太多。这样一两面夹击，您要真是能做个优秀的开发人员，过过中产生活应当是绰绰有余(当然，您要在北京二环买房，没有个叫李刚的爸爸可能买不了)。而且，您要真是个优秀的程序员，也是可以干到60岁的，常见的所谓30岁怎么办，其实是个巨大的误区，这个问题，因为不是本文的主旨，所以就不展开讨论了，下次专门写个文章说一下为啥这行业可以干到60岁。</p>
<p>然而尽管我如此认为，我最近也时常想，也许20年后我也不一定每天写程序了，虽然每天写程序的概率仍然很大。之所以这么想，其中有一部分是因为这个<a href="http://www.ruanyifeng.com/blog/2011/02/charles_kettering_quotes.html">链接</a>。想想几十年前，汽车业也是最NB，最伟大的行业啊，虽然现在也算不上夕阳行业了，但是远不如那时候那么激动人心了。想想福特的<a href="http://book.douban.com/subject/1448684/">蓝血十杰</a>，要搁现在应该都去华尔街或者干互联网了吧。所以虽然现在的互联网仍然是风起云涌，是各位好人们挥洒大好青春的领地，但是在等20年，可能最刺激的时代就会过去了吧。而我之所以现在仍然自称喜欢写程序，无非是三方面的原因，一是求知的乐趣，二是看得到奔头的物质回报，三是觉得自己好歹在创造点有用的东西的成就感。而每当看到<a href="http://soulogic.com/archives/411">这样的文章</a>的我，就容易头脑发热，觉得自己死活应该去读个博士。</p>
<p>所以我想，虽然我接下来四五年一定是在做程序员这个很有前途的行业，但是几年以后如果能像<a href="http://en.wikipedia.org/wiki/Elon_Musk">Elon Musk</a>或者<a href="http://www.google.com/url?sa=t&#038;source=web&#038;cd=1&#038;ved=0CCYQFjAA&#038;url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FJohn_D._Carmack&#038;ei=AZlSTbmWJI6qsAO02p2aBw&#038;usg=AFQjCNE9e7BvCC6IndB7oa6IAWUYIIRtSQ">John Carmack</a>一样参与到发射火箭的活动中，我会毫不犹豫跑去吧，所以为了这个，我也应该做个<a href="http://www.xuwenhao.com/2011/02/01/how-import-is-math-for-a-programmer/">学好数学的程序员</a>吧，对于擅长逻辑思维和计算的我，写程序和数学算是我未来有机会跨行业干活的重要工具吧。</p>
<p>说到这里估计会被人当作少不经事太爱幻想，不过这几年我越来越发现人不能对自我设限，自我设限通常结果不是让你脚踏实地而是容易让你原地踏步。本来我想我大学没好好念书，也就不想啥再去读个PhD了，但是看了<a href="http://www.linkedin.com/profile/view?id=7701930&#038;authType=NAME_SEARCH&#038;authToken=X2_i&#038;locale=en_US&#038;srchid=61cc284e-f25e-43ec-9fee-000b60d5c8f2-0&#038;srchindex=1&#038;srchtotal=1&#038;pvs=ps&#038;pohelp=&#038;goback=%2Efps_Paul+E*3+McKenney+_*1_*1_*1_*1_*1_*1_*51_*1_Y_*1_*1_*1_false_1_R_true_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2">Paul McKenney</a>老人家的简历，我觉其实准备准备也可以考虑三四十去读个PhD么？以前总觉得没指望名片上从Mr.改成Dr.的限制其实都来自自己么？其实，工作了这几年，越来越发现，其实身边的大牛们，并没有比我多个脑袋，或者一定每天只需要睡4个小时，无非是天赋、机遇、眼界，加上日供一卒的努力罢了，大部分身边的大牛们，和你我的差别不在天赋上，不在机遇上，而往往是在眼界和每日持续的努力上。而自我设限，一是愣把眼界降低一层，非觉得别人能拿一等奖能读博，自己不能总只想着卖烧饼；二是往往主动放弃了每天向前一点点的努力，因为觉得读不了博了干脆就不学点儿难的数学GRE或者Lisp了。最后是啥也没干成，但这种自我预言的实现是十足地犯傻呢。</p>
<p>未来还很长呢，想想十多年前上大学的时候，我还没手机呢，现在手机3G上网都比我家上网快了，又有谁会知道15年后我会去干什么，虽然多半我仍然在写着我那很有前途的程序，兴许外星人真来了我去当翻译了呢。虽然，图灵奖我估摸着的确应该是拿不了了，但咱们怎么也这辈子读个博士，发两篇有点儿意义的论文先吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2011/02/09/dont-limit-yourself-and-the-challenge-from-the-future/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>新年愿望</title>
		<link>http://www.xuwenhao.com/2011/02/01/wishes-for-the-rabbit-year/</link>
		<comments>http://www.xuwenhao.com/2011/02/01/wishes-for-the-rabbit-year/#comments</comments>
		<pubDate>Tue, 01 Feb 2011 15:22:49 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=770</guid>
		<description><![CDATA[去年基本没写Blog，回想一下，去年想干的几件事，基本都没善终，希望今年有所改观 总结下去年的生产力 I公司的产品，技术的推动，基本上算是满盘皆输，心理感觉都快和程序员阿士顿的故事差不多了，花了很多时间精力，但是就是没有实际的商业成果。最后11月份放弃换工作了。 手机开发，本来想自己写个iPhone App的，最后也没有抽出时间来写，基本上Objective-C的程序架构都清楚了，debug也行，但是实际除了Example没有写过什么。 Ruby和Rails，倒是因为一个项目重新拾起，但是换了工作之后又放下了，不过现在的脚本都用Ruby写了，算勉强保持点功力吧。 Lisp，做了点SICP上的题，本来雄心壮志准备去年做完的，但是换了工作，又玩新东西去了，目前停留在第二章，今年怎么也把这本书上的题做完吧 儿子的某大事还算成功，算是了了一半心事。春天的时候去乌镇过了个周末，我非常喜欢那里，准备今年至少再去一次 最后，托HL总的福，换了个新工作，目前很满意，开始做些有追求的大系统，感谢HL总和NH姐姐。当然，也感谢I公司的B总，很愧疚自己还是才具不够，折腾了一年半没能干成啥事儿。 今年的目标也蛮简单，技术上和实际工作基本上完全一致，就是分布式和机器学习了，硬指标基本上是三本书，去年没看完的SICP做完所有得题，分布式看完POSA第四卷，以及机器学习看完PRML，希望做出的系统真的能够对中国互联网有点影响，希望能为Hadoop/HBase/Zookeeper/Mahout/S4这些开源项目贡献点代码。生活上么，去次海南，再去次乌镇，有机会的话，再出趟国，以后能像我毕业前三年那样每年都出去见识见识。对自己的限制么，今年不烧包买大件了，iPad、手机、笔记本电脑都不会更新换代，得开始稍微省点儿钱了。本来还想学门乐器，算算多半也不会有时间，今年就不考虑了，先重新把数学学好吧。还有就是真得锻炼身体了，游泳圈开始初现端倪了……]]></description>
			<content:encoded><![CDATA[<p>去年基本没写Blog，回想一下，去年想干的几件事，基本都没善终，希望今年有所改观</p>
<p>总结下去年的生产力</p>
<ul>
<li>I公司的产品，技术的推动，基本上算是满盘皆输，心理感觉都快和<a href="http://www.zhuoqun.net/html/y2010/1565.html">程序员阿士顿的故事</a>差不多了，花了很多时间精力，但是就是没有实际的商业成果。最后11月份放弃换工作了。</li>
<li>手机开发，本来想自己写个iPhone App的，最后也没有抽出时间来写，基本上Objective-C的程序架构都清楚了，debug也行，但是实际除了Example没有写过什么。</li>
<li>Ruby和Rails，倒是因为一个项目重新拾起，但是换了工作之后又放下了，不过现在的脚本都用Ruby写了，算勉强保持点功力吧。</li>
<li>Lisp，做了点SICP上的题，本来雄心壮志准备去年做完的，但是换了工作，又玩新东西去了，目前停留在第二章，今年怎么也把这本书上的题做完吧</li>
<li>儿子的某大事还算成功，算是了了一半心事。春天的时候去乌镇过了个周末，我非常喜欢那里，准备今年至少再去一次</li>
<li>最后，托HL总的福，换了个新工作，目前很满意，开始做些有追求的大系统，感谢HL总和NH姐姐。当然，也感谢I公司的B总，很愧疚自己还是才具不够，折腾了一年半没能干成啥事儿。</li>
</ul>
<p>今年的目标也蛮简单，技术上和实际工作基本上完全一致，就是分布式和机器学习了，硬指标基本上是三本书，去年没看完的<a href="http://book.douban.com/subject/1148282/">SICP</a>做完所有得题，分布式看完<a href="http://book.douban.com/subject/4848563/">POSA第四卷</a>，以及机器学习看完<a href="http://book.douban.com/subject/2061116/">PRML</a>，希望做出的系统真的能够对中国互联网有点影响，希望能为Hadoop/HBase/Zookeeper/Mahout/S4这些开源项目贡献点代码。生活上么，去次海南，再去次乌镇，有机会的话，再出趟国，以后能像我毕业前三年那样每年都出去见识见识。对自己的限制么，今年不烧包买大件了，iPad、手机、笔记本电脑都不会更新换代，得开始稍微省点儿钱了。本来还想学门乐器，算算多半也不会有时间，今年就不考虑了，先重新把数学学好吧。还有就是真得锻炼身体了，游泳圈开始初现端倪了……</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2011/02/01/wishes-for-the-rabbit-year/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>居然一年只写了一篇</title>
		<link>http://www.xuwenhao.com/2011/01/28/only-one-blog-last-year/</link>
		<comments>http://www.xuwenhao.com/2011/01/28/only-one-blog-last-year/#comments</comments>
		<pubDate>Fri, 28 Jan 2011 14:45:59 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
				<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=763</guid>
		<description><![CDATA[看到上篇blog的评论是“今年就这一篇”？才发现，的确，整整一年一篇blog都没写。的确，理由和借口可以找很多，因为有了娃儿，没时间写；因为工作忙，没时间写；看得越多，越觉得自己无知，觉得没必要写。但仔细想想，还是有些疏懒了，其实草稿箱里还有几篇写到一半的，其实像领导大人那样，贴贴娃儿的照片，记录记录成长过程，也挺好的。 过去一年多，其实变动还是蛮大的。生活上，有了娃儿，虽然平时都要上班，娃儿大都是爷爷奶奶带，但是自己的空余时间也多半交代给娃儿了。工作上，有一段时间做得无比痛苦，为了达成目标，花了很多精力做了许多自己并不那么擅长的事情，最后结果也不好，导致有一段时间都要对自己产生怀疑了；最后，在十一之后，托HL老大的福，最终决定换个环境，加入了欢乐无比的M公司，目前看来是个相当正确的决定，做上了两年前离开T公司时候就想做的有点儿技术挑战的技术活儿，也重新对自己有了点信心。 这一年，有了娃儿之后，生活倒是规律了很多，虽然也有偶尔熬通宵干活儿的时候，但是整体三餐正常，于是体重居然也长了那么一点儿，不知道算是奇迹还是中年发福的开始。 希望今年多写点博客，不为别的，需要对自己做过的事情多总结总结。]]></description>
			<content:encoded><![CDATA[<p>看到上篇blog的评论是“今年就这一篇”？才发现，的确，整整一年一篇blog都没写。的确，理由和借口可以找很多，因为有了娃儿，没时间写；因为工作忙，没时间写；看得越多，越觉得自己无知，觉得没必要写。但仔细想想，还是有些疏懒了，其实草稿箱里还有几篇写到一半的，其实像<a href="http://blog.prettydss.com">领导大人</a>那样，贴贴娃儿的照片，记录记录成长过程，也挺好的。</p>
<p>过去一年多，其实变动还是蛮大的。生活上，有了娃儿，虽然平时都要上班，娃儿大都是爷爷奶奶带，但是自己的空余时间也多半交代给娃儿了。工作上，有一段时间做得无比痛苦，为了达成目标，花了很多精力做了许多自己并不那么擅长的事情，最后结果也不好，导致有一段时间都要对自己产生怀疑了；最后，在十一之后，托HL老大的福，最终决定换个环境，加入了欢乐无比的M公司，目前看来是个相当正确的决定，做上了两年前离开T公司时候就想做的有点儿技术挑战的技术活儿，也重新对自己有了点信心。</p>
<p>这一年，有了娃儿之后，生活倒是规律了很多，虽然也有偶尔熬通宵干活儿的时候，但是整体三餐正常，于是体重居然也长了那么一点儿，不知道算是奇迹还是中年发福的开始。</p>
<p>希望今年多写点博客，不为别的，需要对自己做过的事情多总结总结。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2011/01/28/only-one-blog-last-year/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>又一年过去了</title>
		<link>http://www.xuwenhao.com/2010/02/11/another-year-passed/</link>
		<comments>http://www.xuwenhao.com/2010/02/11/another-year-passed/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 08:43:38 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
				<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=759</guid>
		<description><![CDATA[又一年过去了，一年一年真是快啊，其实应该在元旦时候写总结的，只是实在忙得没有精神去思考总结些什么，只好拖到过年了。办公室里基本已经没什么人了，没到过年的时候，大家都无心工作，冷冷清清，窗外又是阴沉的小雨，真有些凄风苦雨的味道呢。 2009年对我来说最重要的一件事情，就是有了2.0了，一下次所有的业余时间都被占据了，基本没有了自由时间，睡眠时间也常常足足，好处是不会随便挥霍时间感到心理内疚了，坏处是也完全没时间搞点有意义的事了。2.0长得很可爱，不过我到也没有别人常说的见不到特别想的感觉，在身边的时候挺喜欢，忙得时候见不到感觉也还好，我一向是个没心没肺的家伙，看来有了孩子，也变不了多少。 然后今天年中来了这家新公司上班，写了很多代码，写了很多文档，写了很多PPT，数量比我以前写得多多了，质量写得比我以前写得差多了，希望2010年，数量稍微少一点，质量能比之前多一些吧。技术角度来说，按照去年的计划，完成度大概只有20%吧，基本上把简单的javascript和jquery摸熟了，然后今年大量的时间都浪费在无聊的struts2，spring，hibernate和axis2上了，本来想好好看看hardcore的东西，结果大半年全在折腾应用层的和项目管理的内容。Ruby和Rails在3月之后基本没怎么在看过，现在Rails3都出来了，也没精力跟了，10年应该也不会把公司的Web开发迁移到Rails上来。 今年的话，计划新学的语言应该是Objective-C和iPhone/iPad开发，顺便拾起一点基本的C，不出以外的话，应该会入手一台iPhone或者iPad。然后预计仍然要花不少时间折腾Java的服务器端，只是期望能把精力主要放在引擎和框架上，应用端，都交给手下的工程师吧。产品上，预计还是有大量的产品设计，方案PPT要做，虽然不是我喜欢的工作内容，但是总还要勉为其难地做下去，也就这一两年的时间了，如果折腾成功了，旧考虑计划计划40岁之前退休。如果成不了，也只好放弃折腾，以后就打工赚钱，养家糊口，混吃等死了。]]></description>
			<content:encoded><![CDATA[<p>又一年过去了，一年一年真是快啊，其实应该在元旦时候写总结的，只是实在忙得没有精神去思考总结些什么，只好拖到过年了。办公室里基本已经没什么人了，没到过年的时候，大家都无心工作，冷冷清清，窗外又是阴沉的小雨，真有些凄风苦雨的味道呢。</p>
<p>2009年对我来说最重要的一件事情，就是有了2.0了，一下次所有的业余时间都被占据了，基本没有了自由时间，睡眠时间也常常足足，好处是不会随便挥霍时间感到心理内疚了，坏处是也完全没时间搞点有意义的事了。2.0长得很可爱，不过我到也没有别人常说的见不到特别想的感觉，在身边的时候挺喜欢，忙得时候见不到感觉也还好，我一向是个没心没肺的家伙，看来有了孩子，也变不了多少。</p>
<p>然后今天年中来了这家新公司上班，写了很多代码，写了很多文档，写了很多PPT，数量比我以前写得多多了，质量写得比我以前写得差多了，希望2010年，数量稍微少一点，质量能比之前多一些吧。技术角度来说，按照去年的计划，完成度大概只有20%吧，基本上把简单的javascript和jquery摸熟了，然后今年大量的时间都浪费在无聊的struts2，spring，hibernate和axis2上了，本来想好好看看hardcore的东西，结果大半年全在折腾应用层的和项目管理的内容。Ruby和Rails在3月之后基本没怎么在看过，现在Rails3都出来了，也没精力跟了，10年应该也不会把公司的Web开发迁移到Rails上来。</p>
<p>今年的话，计划新学的语言应该是Objective-C和iPhone/iPad开发，顺便拾起一点基本的C，不出以外的话，应该会入手一台iPhone或者iPad。然后预计仍然要花不少时间折腾Java的服务器端，只是期望能把精力主要放在引擎和框架上，应用端，都交给手下的工程师吧。产品上，预计还是有大量的产品设计，方案PPT要做，虽然不是我喜欢的工作内容，但是总还要勉为其难地做下去，也就这一两年的时间了，如果折腾成功了，旧考虑计划计划40岁之前退休。如果成不了，也只好放弃折腾，以后就打工赚钱，养家糊口，混吃等死了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2010/02/11/another-year-passed/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>飞来飞去</title>
		<link>http://www.xuwenhao.com/2010/01/26/fly-in-china/</link>
		<comments>http://www.xuwenhao.com/2010/01/26/fly-in-china/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 17:40:52 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
				<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=756</guid>
		<description><![CDATA[先到贵阳，再到北京，然后天津，然后回上海。过去几个月，安安心心做点事的时间太少了，一旦在路上，就只能什么东西都只看个大概了，希望年后能够摆脱这样的状态。 在贵阳在路边摊吃牛肉粉，臭豆腐；在北京半夜街边吃卤煮。当时想想，总怕自己拉肚子，想想前两年可能都不会吃这些，但是要再早几年，也就又爱吃路边摊了。话说，很多时候，人都是在被外部世界改变的，要做到君子不器，还真不是一件容易的事。 工作不算顺利，整个团队需要弥补，需要专注，虽然老板们都很清楚我们要专注，但似乎大家还是忍不住，有机会总要去试那么一下，过去半年，试的太多，好好做的东西太少。有时候，遵守自己给自己的纪律都是如此之难。 看了看一家据说还算不错的竞争对手的产品两年前的演示，发现也不过尔尔，话说两年前，我正在把时间浪费在一个最后毫无意义的项目上。想一想，这时间过得还真快，大概从2007年11月之后，做的事情都不太让自己满意，希望今年，会是一个新的起点。 飞机上大致翻了一遍 iPhone 3开发基础教程，和之前看的Android的Tutorial比较起来，真的一个是设计师文化，一个是工程师文化。iPhone始终专注在于各个View之间的转化，而Android则是喜欢讲Service，Activities，Receivers，教程关注的焦点都不一样，真是很有意思呢。当然，现在的Android是远远不行的，我手上的G2就是动辄没响应，浏览器Bug无法点击，如果再来一次的话，定然会选择多出点血入iPhone的。 好吧，最后说一句，我想我们家2.0和Pretty大人了。 Dreanhost又到期了，我想我这个懒人，还会多花这些钱，再续个两年吧。]]></description>
			<content:encoded><![CDATA[<p>先到贵阳，再到北京，然后天津，然后回上海。过去几个月，安安心心做点事的时间太少了，一旦在路上，就只能什么东西都只看个大概了，希望年后能够摆脱这样的状态。</p>
<p>在贵阳在路边摊吃牛肉粉，臭豆腐；在北京半夜街边吃卤煮。当时想想，总怕自己拉肚子，想想前两年可能都不会吃这些，但是要再早几年，也就又爱吃路边摊了。话说，很多时候，人都是在被外部世界改变的，要做到君子不器，还真不是一件容易的事。</p>
<p>工作不算顺利，整个团队需要弥补，需要专注，虽然老板们都很清楚我们要专注，但似乎大家还是忍不住，有机会总要去试那么一下，过去半年，试的太多，好好做的东西太少。有时候，遵守自己给自己的纪律都是如此之难。</p>
<p>看了看一家据说还算不错的竞争对手的产品两年前的演示，发现也不过尔尔，话说两年前，我正在把时间浪费在一个最后毫无意义的项目上。想一想，这时间过得还真快，大概从2007年11月之后，做的事情都不太让自己满意，希望今年，会是一个新的起点。</p>
<p>飞机上大致翻了一遍 iPhone 3开发基础教程，和之前看的Android的Tutorial比较起来，真的一个是设计师文化，一个是工程师文化。iPhone始终专注在于各个View之间的转化，而Android则是喜欢讲Service，Activities，Receivers，教程关注的焦点都不一样，真是很有意思呢。当然，现在的Android是远远不行的，我手上的G2就是动辄没响应，浏览器Bug无法点击，如果再来一次的话，定然会选择多出点血入iPhone的。</p>
<p>好吧，最后说一句，我想我们家2.0和Pretty大人了。</p>
<p>Dreanhost又到期了，我想我这个懒人，还会多花这些钱，再续个两年吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2010/01/26/fly-in-china/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>专注产品</title>
		<link>http://www.xuwenhao.com/2010/01/18/focus-on-product/</link>
		<comments>http://www.xuwenhao.com/2010/01/18/focus-on-product/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 14:12:05 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=754</guid>
		<description><![CDATA[被Mars同学留言说更新太少，一看……半年没写了……嗯，好吧，可以借口是有了2.0，没有时间了，不过今年居然没写年终总结，而且也没有未来展望，看来完全被2.0套牢了，人生没有希望了……回头想想，2009是瞎折腾的一年，越折腾越混乱，希望2010年能专注在公司的产品上，从无到有，打造出个像像样样能赚钱的产品，也是过去一年一直希望做但是总是没机会来做的事情。]]></description>
			<content:encoded><![CDATA[<p>被Mars同学留言说更新太少，一看……半年没写了……嗯，好吧，可以借口是有了2.0，没有时间了，不过今年居然没写年终总结，而且也没有未来展望，看来完全被2.0套牢了，人生没有希望了……回头想想，2009是瞎折腾的一年，越折腾越混乱，希望2010年能专注在公司的产品上，从无到有，打造出个像像样样能赚钱的产品，也是过去一年一直希望做但是总是没机会来做的事情。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2010/01/18/focus-on-product/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>心结</title>
		<link>http://www.xuwenhao.com/2009/08/15/%e5%bf%83%e7%bb%93/</link>
		<comments>http://www.xuwenhao.com/2009/08/15/%e5%bf%83%e7%bb%93/#comments</comments>
		<pubDate>Sat, 15 Aug 2009 14:24:06 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
				<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=747</guid>
		<description><![CDATA[连续几周都很忙碌，反倒是让内心平复下来了。之前有一段时间总是急于改变现状，所以看到朋友们的变化，内心里总是羡慕和嫉妒，于是看别人去读MBA于是觉得自己是不是也该去读个MBA，别人去读个硕士博士，想自己是不是也该去读个硕士博士，别人去考个证啥的，自己的心里却充满着焦虑。 然而忙碌有时候真是一件好事，连续一个月每周都工作七天，每天11点睡7点半起，反而让我不用去想别人做什么。过了一阵子回过头来，发现自己明白自己究竟想干什么了，其实只要想想自己把钱都花在买哪些书，哪些“玩具”上，就知道其实想要的是什么。而身边的人的选择愈来愈多种多样，更让自己知道不可能什么都要。而在A项目上算得上是一场糟糕的失败的经历，更让自己容易接受一个事实，就是总有一天会输的，不可能什么都做得到。而这样的失败，其实以后回过头来看，也没什么大不了的。 知道自己其实只是碌碌之辈，努力生活，努力工作，可以做出一点成绩，但是自己不是Bill Gates，尽力做到自己能做到的，多一点时间做自己喜欢做的，就好了。想明白自己想要的第一位是自由，第二位是做出一点能让自己有点成就感的东西，钱对我本不是最重要的，心理反而畅快多了，而自己命还算好，反正有地方住有饭吃，也就够了，若是老是去操心需要钱买房子，反而没办法安安心心做事。钱固然要赚要攒，但是没必要为钱焦虑，每天可以写一点新程序，也就有了基本的快乐。]]></description>
			<content:encoded><![CDATA[<p>连续几周都很忙碌，反倒是让内心平复下来了。之前有一段时间总是急于改变现状，所以看到朋友们的变化，内心里总是羡慕和嫉妒，于是看别人去读MBA于是觉得自己是不是也该去读个MBA，别人去读个硕士博士，想自己是不是也该去读个硕士博士，别人去考个证啥的，自己的心里却充满着焦虑。</p>
<p>然而忙碌有时候真是一件好事，连续一个月每周都工作七天，每天11点睡7点半起，反而让我不用去想别人做什么。过了一阵子回过头来，发现自己明白自己究竟想干什么了，其实只要想想自己把钱都花在买哪些书，哪些“玩具”上，就知道其实想要的是什么。而身边的人的选择愈来愈多种多样，更让自己知道不可能什么都要。而在A项目上算得上是一场糟糕的失败的经历，更让自己容易接受一个事实，就是总有一天会输的，不可能什么都做得到。而这样的失败，其实以后回过头来看，也没什么大不了的。</p>
<p>知道自己其实只是碌碌之辈，努力生活，努力工作，可以做出一点成绩，但是自己不是Bill Gates，尽力做到自己能做到的，多一点时间做自己喜欢做的，就好了。想明白自己想要的第一位是自由，第二位是做出一点能让自己有点成就感的东西，钱对我本不是最重要的，心理反而畅快多了，而自己命还算好，反正有地方住有饭吃，也就够了，若是老是去操心需要钱买房子，反而没办法安安心心做事。钱固然要赚要攒，但是没必要为钱焦虑，每天可以写一点新程序，也就有了基本的快乐。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2009/08/15/%e5%bf%83%e7%bb%93/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>继续混乱中</title>
		<link>http://www.xuwenhao.com/2009/05/24/still-in-chaos-2/</link>
		<comments>http://www.xuwenhao.com/2009/05/24/still-in-chaos-2/#comments</comments>
		<pubDate>Sun, 24 May 2009 06:24:04 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
				<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=744</guid>
		<description><![CDATA[两个月没有更新blog，理由是忙，但实际原因永远不会是因为忙得没有时间。花了太多时间在焦虑状态中，搞得心理很疲劳，压力很大，事情却没能做完多少，愈发发现一个人在家工作其实要求是很高的。虽然现在有电话，邮件，im，视频会议，skype，但是每天面对面的交流和随时可以沟通的好处是非常之大的，以后还是尽量避免远程工作，能用电话Skype就不用IM邮件，因为时差早晚开会也是很麻烦的一件事情，让生活和工作完全无法割裂。前两天正好看见一篇文章说个google的员工因为签证问题在加拿大和美国团队共同工作，也是对这种工作方式有很多抱怨，的确是没效率。 轻诺寡信，之前承诺了太多事情，结果不能好好完成每一件托付，比拒绝更加糟糕。要学会坚决拒绝必然失败的事情，还有就是，同时最多做两件事，再多的话，虽然工作量没多大，但是太容易互相感染，造成结果是一事无成。之前因为闲着养成的早睡早起生活健康的习惯再次遭到破坏，真是糟糕。 回头看看原来的打算，发现再次是被生活推着走，其实完全没计划，想想要是真的愿意十年磨一剑，必然能有点小成就了，可惜总是被眼前利益诱惑，结果做出来的都是四不像，浮躁啊浮躁。 这篇不是写给别人看的，写给我自己看吧，如果这是我生命中的最后一天，肯定就给每个人打个电话了，如果还有一个月，就出去玩了，可是如果还有5年，我该做什么？如果还有10年呢？如果幸运还有50年呢？]]></description>
			<content:encoded><![CDATA[<p>两个月没有更新blog，理由是忙，但实际原因永远不会是因为忙得没有时间。花了太多时间在焦虑状态中，搞得心理很疲劳，压力很大，事情却没能做完多少，愈发发现一个人在家工作其实要求是很高的。虽然现在有电话，邮件，im，视频会议，skype，但是每天面对面的交流和随时可以沟通的好处是非常之大的，以后还是尽量避免远程工作，能用电话Skype就不用IM邮件，因为时差早晚开会也是很麻烦的一件事情，让生活和工作完全无法割裂。前两天正好看见一篇文章说个google的员工因为签证问题在加拿大和美国团队共同工作，也是对这种工作方式有很多抱怨，的确是没效率。</p>
<p>轻诺寡信，之前承诺了太多事情，结果不能好好完成每一件托付，比拒绝更加糟糕。要学会坚决拒绝必然失败的事情，还有就是，同时最多做两件事，再多的话，虽然工作量没多大，但是太容易互相感染，造成结果是一事无成。之前因为闲着养成的早睡早起生活健康的习惯再次遭到破坏，真是糟糕。</p>
<p>回头看看原来的打算，发现再次是被生活推着走，其实完全没计划，想想要是真的愿意十年磨一剑，必然能有点小成就了，可惜总是被眼前利益诱惑，结果做出来的都是四不像，浮躁啊浮躁。</p>
<p>这篇不是写给别人看的，写给我自己看吧，如果这是我生命中的最后一天，肯定就给每个人打个电话了，如果还有一个月，就出去玩了，可是如果还有5年，我该做什么？如果还有10年呢？如果幸运还有50年呢？</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2009/05/24/still-in-chaos-2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Rails Magazine可以下载了</title>
		<link>http://www.xuwenhao.com/2009/03/15/rails-magazine-pd-now-available/</link>
		<comments>http://www.xuwenhao.com/2009/03/15/rails-magazine-pd-now-available/#comments</comments>
		<pubDate>Sun, 15 Mar 2009 07:34:41 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=739</guid>
		<description><![CDATA[这里可以下载，呃，不知道2009会不会是Rails再次爆发的一年？]]></description>
			<content:encoded><![CDATA[<p><a href="http://railsmagazine.com/issues/1" target＝"_blank">这里</a>可以下载，呃，不知道2009会不会是Rails再次爆发的一年？</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2009/03/15/rails-magazine-pd-now-available/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>广告后继</title>
		<link>http://www.xuwenhao.com/2009/02/28/ad-continue/</link>
		<comments>http://www.xuwenhao.com/2009/02/28/ad-continue/#comments</comments>
		<pubDate>Sat, 28 Feb 2009 10:59:14 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
				<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=737</guid>
		<description><![CDATA[对于你需要天使投资么?的补充： 在杭州和北京的民工们可以在以下时间地点来参加： 3月3日 晚6:00-9:00 浙江大学紫金港校区国际会议中心139 3月4日 晚6:30-9:00 清华大学西阶报告厅（清华大学二校门北200米左右，清华大学大礼堂西侧。可乘校内公交到二校门，步行至西阶）]]></description>
			<content:encoded><![CDATA[<p>对于<a href="http://www.xuwenhao.com/2009/02/24/do-you-need-seed-funding/" target="_blank">你需要天使投资么?</a>的补充：</p>
<p>在杭州和北京的民工们可以在以下时间地点来参加：</p>
<ul>
<li>3月3日 晚6:00-9:00 浙江大学紫金港校区国际会议中心139</li>
<li>3月4日 晚6:30-9:00 清华大学西阶报告厅（清华大学二校门北200米左右，清华大学大礼堂西侧。可乘校内公交到二校门，步行至西阶）</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2009/02/28/ad-continue/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>你需要天使投资么？</title>
		<link>http://www.xuwenhao.com/2009/02/24/do-you-need-seed-funding/</link>
		<comments>http://www.xuwenhao.com/2009/02/24/do-you-need-seed-funding/#comments</comments>
		<pubDate>Tue, 24 Feb 2009 09:58:25 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=731</guid>
		<description><![CDATA[广告一则: Trilogy Ventures 创业沙龙（互联网 手机应用方向） 时间：3月2日18:00-21:00 地点：上海交通大学闵行校区光彪楼 欢迎去玩。 Update：补充一下，Trilogy去年和前年各投了一家，今年估计机会会多一些，因为专门成立了Trilogy Ventures China专门投早期，此外，当天Speech胜者貌似有3000块奖金。]]></description>
			<content:encoded><![CDATA[<p>广告一则:</p>
<p><a href="http://www.trilogyventureschina.com/salon/" target="_blank">Trilogy Ventures 创业沙龙（互联网 手机应用方向）</a><br />
<img src="http://otho.douban.com/mpic/e66461.jpg" alt="Trilogy Ventures" /><br />
时间：3月2日18:00-21:00<br />
地点：上海交通大学闵行校区光彪楼</p>
<p>欢迎去玩。</p>
<p>Update：补充一下，Trilogy去年和前年各投了一家，今年估计机会会多一些，因为专门成立了Trilogy Ventures China专门投早期，此外，当天Speech胜者貌似有3000块奖金。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2009/02/24/do-you-need-seed-funding/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>重要的是持续改进</title>
		<link>http://www.xuwenhao.com/2009/02/22/continuous-improvement-is-the-importance/</link>
		<comments>http://www.xuwenhao.com/2009/02/22/continuous-improvement-is-the-importance/#comments</comments>
		<pubDate>Sun, 22 Feb 2009 12:58:57 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=729</guid>
		<description><![CDATA[其实开发过程中重要的不是采用了什么样的工具，流程甚至理念，重要的是作为开发人员开发团队应该把精力花在是你的开发变得更好上。无论是你喜欢XP这样的理念，还是因为喜欢Joel而简单地使自己的流程符合Joel Test上，这些问题出现的本质是让你把精力放在把事情变好而不是只是在做做事情。每日构建、单步构建和自动测试是把你从每天“做做构建”、“做做测试”这样的事务中解脱出来；使用源代码管理是让你避免浪费时间去反反复复做做过的事情；不要加班是让你意识到你要做得是效率上得改进而不是重复劳动来做体力活。无论是不是已经有了这些流程，开发人员始终可以做的是每天把精力花在使今天比昨天好上面。只要你有意识去花时间进行改建，那么你之前没有用源代码管理你自然会发现花了很多时间做出来得东西被猫吃了；你没有为每个bug添加test case自然会发现同一个bug会反复出现；你没有用单步构建和每日构建自然会发现每次要发布得时候都会手忙脚乱要通宵加班。而有了这样的意识，即使你已经符合了Joel Test的12条你仍然可以发现你可以使用自动发布来让客户看到每天的开发结果；你可以使用创建VM Image来解决不同开发人员开发环境不同，可能有遗漏的依赖没有放入源代码管理中；你会发现Git比SVN更好地解决了开branch的开销和常常需要它记录一部分不完整代码的问题。 所以，重要的是始终在开发过程中保持持续改进的意识，工具和方法论反而是第二位的。]]></description>
			<content:encoded><![CDATA[<p>其实开发过程中重要的不是采用了什么样的工具，流程甚至理念，重要的是作为开发人员开发团队应该把精力花在是你的开发变得更好上。无论是你喜欢<a href="http://en.wikipedia.org/wiki/Extreme_programming" target="_blank">XP</a>这样的理念，还是因为喜欢Joel而简单地使自己的流程符合<a href="http://www.joelonsoftware.com/articles/fog0000000043.html" target="_blank">Joel Test</a>上，这些问题出现的本质是让你把精力放在把事情变好而不是只是在做做事情。每日构建、单步构建和自动测试是把你从每天“做做构建”、“做做测试”这样的事务中解脱出来；使用源代码管理是让你避免浪费时间去反反复复做做过的事情；不要加班是让你意识到你要做得是效率上得改进而不是重复劳动来做体力活。无论是不是已经有了这些流程，开发人员始终可以做的是每天把精力花在使今天比昨天好上面。只要你有意识去花时间进行改建，那么你之前没有用源代码管理你自然会发现花了很多时间做出来得东西被猫吃了；你没有为每个bug添加test case自然会发现同一个bug会反复出现；你没有用单步构建和每日构建自然会发现每次要发布得时候都会手忙脚乱要通宵加班。而有了这样的意识，即使你已经符合了Joel Test的12条你仍然可以发现你可以使用自动发布来让客户看到每天的开发结果；你可以使用创建VM Image来解决不同开发人员开发环境不同，可能有遗漏的依赖没有放入源代码管理中；你会发现Git比SVN更好地解决了开branch的开销和常常需要它记录一部分不完整代码的问题。</p>
<p>所以，重要的是始终在开发过程中保持持续改进的意识，工具和方法论反而是第二位的。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2009/02/22/continuous-improvement-is-the-importance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>有些事情说起来简单</title>
		<link>http://www.xuwenhao.com/2009/02/22/it-is-easy-to-say-but-hard-to-do/</link>
		<comments>http://www.xuwenhao.com/2009/02/22/it-is-easy-to-say-but-hard-to-do/#comments</comments>
		<pubDate>Sun, 22 Feb 2009 11:23:17 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
				<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=726</guid>
		<description><![CDATA[比如始终保持一颗初心，比如走自己的路，让别人打车去吧，比如但行好事末问前程，比如不要后悔始终向前看，比如follow your heart。但是修炼自己的心性实在不是一件简单的事情，很痛苦很压抑。可是很多事情不能不做，不能不压抑。很多时候鱼和熊掌不能兼得，但是真不知道该取何者舍何者。]]></description>
			<content:encoded><![CDATA[<p>比如始终保持一颗初心，比如走自己的路，让别人打车去吧，比如但行好事末问前程，比如不要后悔始终向前看，比如follow your heart。但是修炼自己的心性实在不是一件简单的事情，很痛苦很压抑。可是很多事情不能不做，不能不压抑。很多时候鱼和熊掌不能兼得，但是真不知道该取何者舍何者。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2009/02/22/it-is-easy-to-say-but-hard-to-do/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tool到用时方恨多</title>
		<link>http://www.xuwenhao.com/2009/02/22/too-many-tools-to-learn/</link>
		<comments>http://www.xuwenhao.com/2009/02/22/too-many-tools-to-learn/#comments</comments>
		<pubDate>Sun, 22 Feb 2009 11:17:23 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=718</guid>
		<description><![CDATA[越来越发现，这个时代实在是工具太多了，多到有点让人讨厌了。随便干点什么，都要会一堆东西；学点新东西，发现要能用要再学一堆新东西。最近用ROR做点东西，发现真要做点Production Quality的东西，至少要用一堆工具，比如New Relic，比如Capistrano，然后如果想要用得爽还有一堆RSpec等等的东西可以用，更不用说HTML/CSS/Javascript/MySQL/Git这些基本的工具。如果在Java世界的话，用的东西更是多到让人厌恶。比起要用的工具，人生时间实在是短到让人绝望，不过没办法，只能慢慢玩了……]]></description>
			<content:encoded><![CDATA[<p>越来越发现，这个时代实在是工具太多了，多到有点让人讨厌了。随便干点什么，都要会一堆东西；学点新东西，发现要能用要再学一堆新东西。最近用ROR做点东西，发现真要做点Production Quality的东西，至少要用一堆工具，比如New Relic，比如Capistrano，然后如果想要用得爽还有一堆RSpec等等的东西可以用，更不用说HTML/CSS/Javascript/MySQL/Git这些基本的工具。如果在Java世界的话，用的东西更是多到让人厌恶。比起要用的工具，人生时间实在是短到让人绝望，不过没办法，只能慢慢玩了……</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2009/02/22/too-many-tools-to-learn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>我的IT环境</title>
		<link>http://www.xuwenhao.com/2009/02/21/my-it-stuff/</link>
		<comments>http://www.xuwenhao.com/2009/02/21/my-it-stuff/#comments</comments>
		<pubDate>Sat, 21 Feb 2009 12:24:54 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=719</guid>
		<description><![CDATA[科技越来越发达，工具越来越多，每天的生活都要和你的电脑、软件还有互联网服务打交道。这篇，就来说说我现在常用的软硬件工具和服务： 笔记本一之N610c：毕业没几个月买了台二手的N610c，然后抛弃了原来的拼装台式机。可惜我买二手的东西寿命都不长，现在这台机器通常作为我的第二显示器在写东西需要参考的时候开着，干活是已然不行了，因为南桥主板芯片出了问题，USB口不工作了，电池也充不进电了。 这台机器系统是XP，基本只装了Firefox和Adobe Reader，因为主要用来看看东西啦。 笔记本二之Macbook 466：去年底离职之后把工作电脑上交了，然后立马去买了台新的铝壳麦书，很好用啊很好用，虽然从价格上来说不便宜，摄像头蓝牙都有，多点触控很方便，用惯了改用windows有时候还真有点不习惯…… 这台现在是日常工作机了，每天开机自启动的是Skype和Adium，Adium的好处是可以整合多个IM，不用再MSN+ICQ+QQ+Gtalk开四个IM浪费内存了，而且Adium可以让你整合多个IM的分组，同时将不同IM上的同一人的多个帐号合并在一起，非常方便，不用再一个个IM看某人是否在线了。然后浏览器日常用的是Firefox，当然也装了Safari和Opera测试的时候用用，Firefox里的插件装得不多，发现其实天天要用的也就那么一点，目前只有Adblock Plus，Firebug，Google Gears，Google Toolbar，GreaseMonkey，Remember the Milk for Gmail，Web Developer，wmlbrowser和Zotero。写代码目前主要在玩Ruby和Rails，所以找了个Textmate用用，一直在考虑要不要花钱买下license，当然Eclipse和Netbeans也都装了，自带的Xcode也在，不过Netbeans和Xcode基本没用过；装了Subversion和Git作为SCM的客户端，当然，慢慢习惯用Git之后我觉得SVN可以抛弃了。日常的照片音乐都交给了自带的iLife，看PDF也是用的Preview，反正对我来说已经足够好了。看片用Mplayer 1.0，下载各大盗版则是Amule+Transmission。常常会用到自带的Stickies来记录点东西，自带的Dictionary也很好用，虽然装了QuickSilver，但是我还是更习惯Spotlight，不过貌似这玩意儿有越用越慢的趋势。当然，为了上网上银行，还是搞了个VMWare的Windows虚拟机的。 手机一之Nokia 6630：也是毕业没多久买的，到现在还正常工作。手机有强烈的诺基亚风格，就是难看，但是皮实经摔好用，电话短信不会有问题，也不会死机重启之类，电池也能撑三四天。买的时候也算是当时的牛机了，现在看上去则是连山寨也不如了。刚买那会儿装了不少软件折腾，还拿这个看电影听MP3啥的，现在上面只有三个非自带的软件，分别是A4输入法，MSN和UCWeb。意欲装Frings在手机上控制所有IM可惜它不卖面子始终没法用，而UCWeb则是战胜了Opera Mini占据了手机上的位置，常常用它在老婆逛街的时候看看Google Readers里订阅的内容。还值得一提的是，这台机器通过Google Sync可以把Gmail里的Contacts和手机上的双向同步，方便了备份和转移电话本了。 手机二之Blackberry 8310：去年买的号称全新机，看到号称这两个字你就知道是翻新机了，在不长的时间里已经出了两次问题，这不前两天又拿到JS那里去修了，每次买二手的东西，我的RP都很差，所以下定决心以后不碰二手的东西了。虽然常常不能好好用，但是不可否认Blackberry是设计优良的机器，虽然用不上push mail费了一半，但是这台机器通过Google Sync可以同步联系人之外，还能同步Calendar，然后买了Remember the Milk的Pro服务还能同步Todo list，就可以完全把PIM的功能随身携带。另外，上面的Gmail的客户端也很不错，因为是全键盘，通过快捷键操作还是非常方便的。还有个好处是开软件不像其他机器那么费电，机器的按键和滚轮手感也不错，现在我就希望这台机器这回修好别再出问题了。 MP3之iPod shuffle 2：一台银色的夹子shuffle，不该买的，话说这其实也是台二手的，新蛋上买的，不过用的实在不多，浪费了，话说二手真是我的诅咒啊。 互联网服务：Mail自然毫无疑问是Gmail。然后是一系列的Google服务，因为Google Reader的分享功能用它替代了Bloglines；用Google Docs做读书笔记或者整理各种零散的笔记；用Google Calendar做日程表，虽然最近没什么计划性。然后Todo list因为Google自带的实在是不太好用，所以用的是Remember the Milk，装了Firefox的插件所以可以和Gmail很好地整合。Blog是host在Dreamhost上的，然后代码则是用Github取代了不稳定的Google Code。 看了看，发现自己用的东西还是很简单的，同学们也来分享一下自己用的软硬件和服务吧。]]></description>
			<content:encoded><![CDATA[<p>科技越来越发达，工具越来越多，每天的生活都要和你的电脑、软件还有互联网服务打交道。这篇，就来说说我现在常用的软硬件工具和服务：</p>
<p>笔记本一之N610c：毕业没几个月买了台二手的N610c，然后抛弃了原来的拼装台式机。可惜我买二手的东西寿命都不长，现在这台机器通常作为我的第二显示器在写东西需要参考的时候开着，干活是已然不行了，因为南桥主板芯片出了问题，USB口不工作了，电池也充不进电了。<br />
这台机器系统是XP，基本只装了Firefox和Adobe Reader，因为主要用来看看东西啦。</p>
<p>笔记本二之Macbook 466：去年底离职之后把工作电脑上交了，然后立马去买了台新的铝壳麦书，很好用啊很好用，虽然从价格上来说不便宜，摄像头蓝牙都有，多点触控很方便，用惯了改用windows有时候还真有点不习惯……<br />
这台现在是日常工作机了，每天开机自启动的是Skype和<a href="http://www.adiumx.com" target="_blank">Adium</a>，Adium的好处是可以整合多个IM，不用再MSN+ICQ+QQ+Gtalk开四个IM浪费内存了，而且Adium可以让你整合多个IM的分组，同时将不同IM上的同一人的多个帐号合并在一起，非常方便，不用再一个个IM看某人是否在线了。然后浏览器日常用的是Firefox，当然也装了Safari和Opera测试的时候用用，Firefox里的插件装得不多，发现其实天天要用的也就那么一点，目前只有Adblock Plus，Firebug，Google Gears，Google Toolbar，GreaseMonkey，Remember the Milk for Gmail，Web Developer，wmlbrowser和Zotero。写代码目前主要在玩Ruby和Rails，所以找了个Textmate用用，一直在考虑要不要花钱买下license，当然Eclipse和Netbeans也都装了，自带的Xcode也在，不过Netbeans和Xcode基本没用过；装了Subversion和Git作为SCM的客户端，当然，慢慢习惯用Git之后我觉得SVN可以抛弃了。日常的照片音乐都交给了自带的iLife，看PDF也是用的Preview，反正对我来说已经足够好了。看片用Mplayer 1.0，下载各大盗版则是Amule+Transmission。常常会用到自带的Stickies来记录点东西，自带的Dictionary也很好用，虽然装了QuickSilver，但是我还是更习惯Spotlight，不过貌似这玩意儿有越用越慢的趋势。当然，为了上网上银行，还是搞了个VMWare的Windows虚拟机的。</p>
<p>手机一之Nokia 6630：也是毕业没多久买的，到现在还正常工作。手机有强烈的诺基亚风格，就是难看，但是皮实经摔好用，电话短信不会有问题，也不会死机重启之类，电池也能撑三四天。买的时候也算是当时的牛机了，现在看上去则是连山寨也不如了。刚买那会儿装了不少软件折腾，还拿这个看电影听MP3啥的，现在上面只有三个非自带的软件，分别是A4输入法，MSN和UCWeb。意欲装Frings在手机上控制所有IM可惜它不卖面子始终没法用，而UCWeb则是战胜了Opera Mini占据了手机上的位置，常常用它在老婆逛街的时候看看Google Readers里订阅的内容。还值得一提的是，这台机器通过Google Sync可以把Gmail里的Contacts和手机上的双向同步，方便了备份和转移电话本了。</p>
<p>手机二之Blackberry 8310：去年买的号称全新机，看到号称这两个字你就知道是翻新机了，在不长的时间里已经出了两次问题，这不前两天又拿到JS那里去修了，每次买二手的东西，我的RP都很差，所以下定决心以后不碰二手的东西了。虽然常常不能好好用，但是不可否认Blackberry是设计优良的机器，虽然用不上push mail费了一半，但是这台机器通过Google Sync可以同步联系人之外，还能同步Calendar，然后买了Remember the Milk的Pro服务还能同步Todo list，就可以完全把PIM的功能随身携带。另外，上面的Gmail的客户端也很不错，因为是全键盘，通过快捷键操作还是非常方便的。还有个好处是开软件不像其他机器那么费电，机器的按键和滚轮手感也不错，现在我就希望这台机器这回修好别再出问题了。</p>
<p>MP3之iPod shuffle 2：一台银色的夹子shuffle，不该买的，话说这其实也是台二手的，新蛋上买的，不过用的实在不多，浪费了，话说二手真是我的诅咒啊。</p>
<p>互联网服务：Mail自然毫无疑问是<a href="http://mail.google.com" target="_blank">Gmail</a>。然后是一系列的Google服务，因为<a href="http://reader.google.com" target="_blank">Google Reader</a>的分享功能用它替代了<a href="http://www.bloglines.com" target="_blank">Bloglines</a>；用<a href="http://docs.google.com" target="_blank">Google Docs</a>做读书笔记或者整理各种零散的笔记；用<a href="http://calendar.google.com" target="_blank">Google Calendar</a>做日程表，虽然最近没什么计划性。然后Todo list因为Google自带的实在是不太好用，所以用的是<a href="http://www.rememberthemilk.com" target="_blank">Remember the Milk</a>，装了Firefox的插件所以可以和Gmail很好地整合。Blog是host在<a href="http://www.dreamhost.com" target="_blank">Dreamhost</a>上的，然后代码则是用<a href="http://www.github.com" target="_blank">Github</a>取代了不稳定的<a href="http://code.google.com">Google Code</a>。</p>
<p>看了看，发现自己用的东西还是很简单的，同学们也来分享一下自己用的软硬件和服务吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2009/02/21/my-it-stuff/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>配置Rails应用</title>
		<link>http://www.xuwenhao.com/2009/02/13/configuring-rails-applications/</link>
		<comments>http://www.xuwenhao.com/2009/02/13/configuring-rails-applications/#comments</comments>
		<pubDate>Fri, 13 Feb 2009 15:54:11 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=696</guid>
		<description><![CDATA[译者注：本文原文来自Rails Guides，版本为January 3, 2009: First reasonably complete draft by Mike Gunderloy。本文根据原文，按照Creative Commons Attribution-Share Alike 3.0授权。 本指南涵盖了可用于Rails应用中的配置和初始化特性。通过本指南，你可以 1.调整Rails应用的行为 2.添加在应用启动阶段运行的代码 本指南的第一版是基于Rails 2.3的源代码撰写的。虽然不保证向前兼容，但是本指南涵盖的信息可广泛地用于Rails 2.2。 1. 初始化代码的位置 Rails（至少）提供了五个好位置来放置初始化代码： 预初始化器（preinitializers） environment.rb 针对特定环境的配置文件 初始化器(load_application_initializers) 后初始化器（After-Initializers） 2. 使用预初始化器 Rails允许你使用一个预初始化器，在框架自身被装载前来运行代码。如果你把代码存放在RAILS_ROOT/config/preinitializer.rb中，这些代码会在任何框架组件（Active Record, Action Pack, and so on）之前第一个被装载。如果你想要改变任何初始化过程中某些类的行为，你可以在这里（preinitializers文件）做。 3. 配置Rails组件 基本上来说，配置Rails所做的工作就是配置Rails自身以及配置Rails的各个组件。environments.rb文件以及针对特定环境的配置文件（比如config/environments/production.rb）允许你设定各个组件的设置。例如，默认的Rails2.3中的environment.rb文件中包含这样一条配置： config.time_zone='UTC' 这是一条Rails自身的设置。如果你想要设定Rails的各个组件的设置，你也可以通过同样的这个config对象来做： config.active_record.colorize_logging = false Rails会使用这条设置来配置Active Record 3.1 配置Active Record ActiveRecord::Base包含许多种配置选项： logger接收一个符合Log4r或者Ruby1.8.x Logger类的接口的logger，该logger会传递给所有的新创建的数据库连接。你可以在ActiveRecord的model类或者其实例上调用logger来获取该logger。把该值设为nil会经用日志功能。 primary_key_prefix_type用于设置主键列的命名。Rails默认主键列的名字是id（该配置无需设定），但是你可以有两个别的选择： [...]]]></description>
			<content:encoded><![CDATA[<p>译者注：本文<a href="http://guides.rails.info/configuring.html" target="_blank">原文</a>来自<a href="http://guides.rails.info" target="_blank">Rails Guides</a>，版本为January 3, 2009: First reasonably complete draft by Mike Gunderloy。本文根据原文，按照<a href="http://creativecommons.org/licenses/by-sa/3.0" target="_blank">Creative Commons Attribution-Share Alike 3.0</a>授权。</p>
<p>本指南涵盖了可用于Rails应用中的配置和初始化特性。通过本指南，你可以<br />
1.调整Rails应用的行为<br />
2.添加在应用启动阶段运行的代码</p>
<p>本指南的第一版是基于Rails 2.3的源代码撰写的。虽然不保证向前兼容，但是本指南涵盖的信息可广泛地用于Rails 2.2。</p>
<h2>1. 初始化代码的位置</h2>
<p>Rails（至少）提供了五个好位置来放置初始化代码：</p>
<ul>
<li>预初始化器（preinitializers）</li>
<li>environment.rb</li>
<li>针对特定环境的配置文件</li>
<li>初始化器(load_application_initializers)</li>
<li>后初始化器（After-Initializers）</li>
</ul>
<h2>2. 使用预初始化器</h2>
<p>Rails允许你使用一个预初始化器，在框架自身被装载前来运行代码。如果你把代码存放在<code>RAILS_ROOT/config/preinitializer.rb</code>中，这些代码会在任何框架组件（Active Record, Action Pack, and so on）之前第一个被装载。如果你想要改变任何初始化过程中某些类的行为，你可以在这里（preinitializers文件）做。</p>
<h2>3. 配置Rails组件</h2>
<p>基本上来说，配置Rails所做的工作就是配置Rails自身以及配置Rails的各个组件。<code>environments.rb</code>文件以及针对特定环境的配置文件（比如<code>config/environments/production.rb</code>）允许你设定各个组件的设置。例如，默认的Rails2.3中的<code>environment.rb</code>文件中包含这样一条配置：</p>
<pre name="code" class="ruby">
config.time_zone='UTC'
</pre>
<p>这是一条Rails自身的设置。如果你想要设定Rails的各个组件的设置，你也可以通过同样的这个<code>config</code>对象来做：</p>
<pre name="code" class="ruby">
config.active_record.colorize_logging = false
</pre>
<p>Rails会使用这条设置来配置Active Record</p>
<h3>3.1 配置Active Record</h3>
<p><code>ActiveRecord::Base</code>包含许多种配置选项：</p>
<ul>
<li><code>logger</code>接收一个符合Log4r或者Ruby1.8.x Logger类的接口的logger，该logger会传递给所有的新创建的数据库连接。你可以在ActiveRecord的model类或者其实例上调用<code>logger</code>来获取该logger。把该值设为nil会经用日志功能。</li>
<li><code>primary_key_prefix_type</code>用于设置主键列的命名。Rails默认主键列的名字是<code>id</code>（该配置无需设定），但是你可以有两个别的选择：
<ul>
<li><code>:table_name</code>会另Customer类的主键为<code>customerid</code></li>
<li><code>:table_name_with_underscore</code>会另Customer类的主键为<code>customer_id</code></li>
</ul>
</li>
<li><code>table_name_prefix</code>使你可以在表名的前面设置添加一个全局的字符串。如果你将该值设为<code>northwest_</code>，那么Customer类会映射到<code>northwest_customers</code>表。默认该值为一个空字符串</li>
<li><code>table_name_prefix</code>使你可以在表明的后面设置添加一个全局的字符串。如果你将该值设为<code>_northwest</code>，那么Customer类会映射到<code>customers_northwest</code>表。默认该值为一个空字符串。</li>
<li><code>pluralize_table_names</code>规定了Rails使用单词的单数还是复数来命名数据库中的表名。如果该值被设置为<code>true</code>（默认值），那么Customer类会使用<code>customers</code>表，如果该值被设置为<code>false</code>，那么Customer类会使用<code>customer</code>表</li>
<li><code>colorize_logging</code>（默认为true）规定了在ActiveRecord的日志信息中是否使用彩色的ANSI代码。</li>
<li><code>default_timezone</code>决定了在从数据库中读取日期和时间时，是使用<code>Time.local</code>（如果设置为<code>:local</code>）还是<code>Time.utc</code>（如果设置为<code>:utc</code>）。默认值为<code>:local</code></li>
<li><code>schema_format</code>控制了从数据库中导出数据库模式到文件中所用的格式。选项<code>:ruby</code>（默认值）会使用一个数据库无关的migrations，选项<code>:sql</code>会使用（可能依赖于特定数据库的）SQL指令。</li>
<li><code>timestamped_migrations</code>控制了migrations的数字是使用连续的整数还是时间戳。默认值为<code>true<code>，代表使用时间戳，这在优多人共同开发同一个应用的时候是一个更好的选择。 </li>
<li><code>lock_optimistically</code>控制了ActiveRecord是否使用乐观锁。默认该值为<code>true</code></li>
<p>MySQL适配器增加了一个额外的配置选项：</p>
<li><code>ActiveRecord::ConnectionAdapters::MysqlAdapter.emulate_booleans</code>控制了ActiveRecord是否认为MySQL数据库中所有的<code>tinyint(1)</code>列为布尔值。默认该值为<code>true</code></li>
<p>数据库模式的导出器（schema dumper）增加了一个额外的配置选项：</p>
<li><code>ActiveRecord::SchemaDumper.ignore_table</code>接受一个表名的数组，该数组中的表不应包含在任何生成的数据库模式文件中。该设置在<code>ActiveRecord::Base.schema_format == :ruby<code>时才会起作用。</li>
</ul>
<h3>3.2 配置Action Controller</h3>
<p><code>ActionController::Base</code>包含了一些配置设定：</p>
<ul>
<li><code>asset_host</code>在所有<code>AssetHelper</code>中的辅助方法所生成URL的前面添加一个字符串。这是设计用来将所有的javascript，CSS以及图片文件转移到一个不同的主机（asset host）上。</li>
<li><code>consider_all_requests_local</code>通常在开发环境中被设为<code>true</code>而在生产环境中被设为<code>false</code>；如果它被设为<code>true</code>，则任何错误都会导致详细的调试信息会被导出到HTTP response中。如果你想做更细致的控制，将其设为<code>false</code>然后实现<code>local_request?</code>方法来决定哪些requests会在出错的情况下提供调试信息。</li>
<li><code>allow_concurrency</code>为了允许同步（线程安全的）的action处理，该值应当被设为<code>true</code>。默认情况下该值为<code>false</code>。你通常不应当直接修改这个配置，因为你需要一系列的其他调整使得线程安全模式可以正确地工作做。你可以在<code>production.rb</code>文件中简单地调用<code>config.threadsafe!</code>，它会为你做所有需要的调整。</li>
<p><br/></p>
<div style="background: ORANGE;">Threadsafe操作和开发模式下的一些功能不兼容。特别是自动的依赖装载和类重装载会在你调用config.threadsafe!之后被自动禁用</div>
<p><br/></p>
<li><code>param_parsers</code>让你可以设置一个handlers的数组，用于提取HTTP requests中的信息并将它放到<code>params</code>哈希中。默认情况下，multipart forms，URL-encoded forms，XML以及JSON的parsers是被激活的。</li>
<li><code>default_charset<code>设定了所有render默认使用的字符集。默认值为"utf-8"</li>
<li><code>logger</code>接收一个符合Log4r或者Ruby1.8.x Logger类的接口的logger，可以被用来在Action Controller中记录日志信息。把该值设为nil会禁用日志功能。</li>
<li><code>resource_action_separator</code>用来设置RESTful url中resource和action之间的分隔符。默认为"/"。</li>
<li><code>resource_path_names</code>用来设置一个RESTful action默认的名字的哈希。默认情况下，new action被命名为<code>new</code>而edit action被命名为<code>edit</code>。</li>
<li><code>request_forgery_protection_token</code>用来设置RequestForgery的参数名。调用<code>protect_from_forgery</code>会将它设为<code>:authenticity_token</code></li>
<li><code>optimise_named_routes</code>打开了一些生成路径表（routes table）的优化。它默认被设为<code>true</code></li>
<li><code>use_accept_header</code>用于设置确定response格式的规则。如果该值设为<code>true</code>（默认值），则<code>respond_to</code>方法和<code>Request#format</code>方法会根据Accept Header返回相应格式的response。弱该值设为<code>false</code>则request格式会单独由<code>params[:format]</code>来决定。如果没有<code>format</code>参数，则response的格式会根据request是否是一个Ajax request来决定返回HTML还是Javascript。</li>
<li><code>allow_forgery_protection</code>用于设置启用还是禁用CSRF保护。默认在测试模式下该值为<code>false</code>而在其他模式下为<code>true</code>。</li>
<li><code>relative_url_root</code>可以被用来告诉Rails你将会将应用部署到一个子目录。默认值为<code>ENV['RAILS_RELATIVE_URL_ROOT']</code></li>
<p>缓存功能代码将会增加两个额外的设置：</p>
<li><code>ActionController::Caching::Pages.page_cache_directory</code>用于设置Rails为你的Web服务器创建缓存页面的位置。默认值为<code>Rails.public_path</code>（通常该值被设为<code>RAILS_ROOT</code>"/public"+）。</li>
<li><code>ActionController::Caching::Pages.page_cache_extension</code>用于设置生成的缓存页面文件的扩展名（如果进来的requests已经带了扩展名则这里的扩展名会被忽略）。默认值为<code>.html</code>。</li>
<p>分发器（dispatcher）包含了这样一条配置</p>
<li><code>ActionController::Dispatcher.error_file_path</code>给定了Rails用来寻找出错文件如<code>404.html</code>的路径。默认值为<code>Rails.public_path</code>。</li>
<p>使用Active Record的session存储可以这样来配置</p>
<li><code>CGI::Session::ActiveRecordStore::Session.data_column_name</code>用于设置用来存储session数据的列名。默认值为'data'。</li>
</ul>
<h3>3.3 配置Action View</h3>
<p>Action View上只有不多的几个配置选项，从<code>ActionView:Base</code>的四个开始：</p>
<ul>
<li><code>debug_rjs</code>决定RJS response是否会被包装在try/catch块中，并alert()被捕捉的异常（并重新将其抛出）（译者注：即是否对rjs使用debug模式，使得rjs的异常在开发工程中会被alert显示出来）。默认值为<code>false</code>。</li>
<li><code>warn_cache_misses</code>是否在一个action的结果遇到view路径中缓存未命中时Rails会显示一个警告。默认值为<code>false</code>。</li>
<li><code>field_error_proc</code>提供了一个HTML生成器来显示来自于Active Record的错误。默认值为<code>Proc.new {|html_tag, instance| "#{html_tag}"}</code></li>
<li><code>default_form_builder</code>告诉Rails默认实用的表单构建器（form builder）。默认值为<code>ActionView::Helpers::FormBuilder</code>。</li>
<p>ERB Template handler提供了一个额外的选项</p>
<li><code>ActionView::TemplateHandlers::ERB.erb_trim_mode</code>提供了ERB使用的修剪模式（trim mode）。默认为'-'。查看<a href="http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/" target="_blank">ERB文档</a>获得更多信息</li>
</ul>
<h3>3.4 配置Action Mailer</h3>
<p><code>ActionMailer::Base</code>上由一系列可用的配置：</p>
<ul>
<li><code>template_root</code>提供了Action Mailer模版的根目录</li>
<li><code>logger</code>接收一个符合Log4r或者Ruby1.8.x Logger类的接口的logger，用来记录来自Action Mailer的日志信息。设为nil则禁用日志记录功能。</li>
<li><code>smtp_settings</code>用来为<code>smtp</code>邮件发送方式提供详细的配置信息。它接受一个哈希组成的选项，包括如下任意的选项：
<ul>
<li><code>:address</code>允许你使用一个远端的邮件服务器。请将它从默认的"localhost"改为你所用的邮件服务器。</li>
<li><code>:port</code>如果你使用的邮件服务器不在25端口上运行，请修改这个配置。</li>
<li><code>:domain</code>如果你需要指定一个HELO域名，请在这里指定。</li>
<li><code>:user_name</code>如果你的邮件服务器需要认证，请在这里设置用户名</li>
<li><code>:password</code>如果你的邮件服务器需要认证，请在这里设置密码</li>
<li><code>:authentication</code>如果你的邮件服务器需要人证，你需要在此指定认证的类型。它应该是<code>:plain</code>，<code>:login</code>，和<code>:cram_md3</code>三个符号其中之一。</li>
</ul>
</li>
<li><code>sendmail_settings</code>允许你对<code>sendmail</code>邮件发送方式进行详细的配置。它接受一个哈希组成的选项，包括如下任意的选项：
<ul>
<li><code>:location</code>—sendmail可执行文件的位置。默认为<code>/usr/sbin/sendmail</code>。</li>
<li><code>:arguments</code>—命令行参数。默认值为<code>-i -t</code></li>
</ul>
</li>
<li><code>raise_delivery_errors</code>设置如果邮件发送没能完成是否需要抛出一个错误。默认值为<code>true</code>。</li>
<li><code>delivery_method</code>设置邮件发送方式。可以使用的值有<code>:smtp</code>（默认值），<code>:sendmail</code>以及<code>:test</code></li>
<li><code>perform_deliveries</code>指定邮件是否要真得发送出去。默认值为<code>:true</code>，测试时可以方便地设为<code>false</code>。</li>
<li><code>default_charset</code>设定Action Mailer用于编码邮件主题和内容的字符集。默认为<code>utf-8</code></li>
<li><code>default_content_type</code>设置消息的主体所使用的默认的content type。默认值为<code>text/plain</code>。</li>
<li><code>default_mime_version</code>设置消息实用的默认的MIME版本。默认值为<code>1.0</code>。</li>
<li><code>default_implicit_parts_order</code>—当一个消息被隐式地构建（例如，邮件的多部分通过模版组装，而模版通过文件名设定了content type），这个变量控制多个部分的顺序。默认为<code>["text/html", "text/enriched", "text/plain"]</code></li>
<p>。数组中先出现的项在邮件客户端中有较高的优先级，并在mime编码消息的最后出现。
</ul>
<h3>3.5 配置Active Resource</h3>
<p><code>ActiveResource::Base</code>中有一个配置可以设置：<br />
<code>logger</code>接收一个符合Log4r或者Ruby1.8.x Logger类的接口的logger，用来从Active Resource中记录日志信息。设为nil时禁用日志功能。</p>
<h3>3.6 配置Active Support</h3>
<p>Active Support中有一些配置选项：</p>
<ul>
<li><code>ActiveSupport::BufferedLogger.silencer</code>设为<code>false</code>则禁用了对代码块的缄默日志（silence logging）功能（译者注：可以参看<a href="http://api.rubyonrails.com/classes/ActiveSupport/BufferedLogger.html#M001499">http://api.rubyonrails.com/classes/ActiveSupport/BufferedLogger.html#M001499</a>，缄默日志使得silence方法可以对指定的代码块屏蔽日志功能或者改变日志的level）。默认值为<code>true</code>。</li>
<li><code>ActiveSupport::Cache::Store.logger</code>设定了缓存存储操作所使用的logger。</li>
<li><code>ActiveSupport::Logger.silencer</code>设为<code>false</code>则禁用了对代码块的缄默日志（silence logging）功能。默认值为<code>true</code>。</li>
</ul>
<h3>配置 Active Model</h3>
<p>Active Model目前有一个单独的配置设置：</p>
<ul>
<li><code>ActiveModel::Errors.default_error_messages</code>是一个包含所有验证错误消息的数组。</li>
</ul>
<h2>使用初始化器</h2>
<p>在装载了框架以及任何gems和插件之后，Rails会开始装载初始化器（initializers）。一个初始化器是在你的应用中任何存储在<code>/config/initializers</code>中的ruby代码。你可以使用初始化器来存放哪些应该整个框架和插件装载后进行的配置设置。<br />
<br/></p>
<div style="background: YELLOW">如果你喜欢的话，你可以使用子目录来组织你的初始化器，因为Rails会渗入到initializers目录的整个文件目录层级中去。</div>
<p><br/></p>
<div style="background: SKYBLUE">如果你的初始化器有任何的顺序依赖关系，你可以通过命名来控制它们装载的顺序。例如，01_critical.rb会在02_normal.rb之前装载。</div>
<p><br/></p>
<h2>使用一个后初始化器（After-Initializer）</h2>
<p>后初始化器（如同你所猜想的）会在所有的初始化器装载之后运行。你可以通过在任何Rails配置文件中设立<code>config.after_intialize</code>来支持一个<code>after_initialize</code>代码块（或者一个这种代码块的数组）。</p>
<pre name="code" class="ruby">
config.after_initialize do
    SomeClass.init
end
</pre>
<div style="background: ORANGE">你应用的一部分，特别是观察者（observers）和路径（routing）在after_initialize代码块被调用时还没有建立好。</div>
<p><br/></p>
<h2>Rails环境设置</h2>
<p>Rails的一部分配置可以通过外部环境变量来配置。以下的环境变量会被Rails的不同部分识别出来。</p>
<ul>
<li><code>ENV['RAILS_ENV']</code>定义了Rails所运行在的环境（production，development，test等等）</li>
<li><code>ENV['RAILS_RELATIVE_URL_ROOT']</code>被路径代码用来在你部署你的应用到一个子目录时识别出URL。</li>
<li><code>ENV['RAILS_ASSET_ID']</code>会覆写默认的Rails生成的用户可下载资产的缓存失效的时间戳。</li>
<li><code>ENV['RAILS_CACHE_ID']</code>和<code>ENV['RAILS_APP_VERSION']</code>用来生成Rails缓存代码中的扩展的缓存键。这可以允许你对同一个应用有多个分开的缓存。</li>
<li><code>ENV['RAILS_GEM_VERSION]</code>在<code>RAILS_GEM_VERSION</code>没有在<code>environment.rb</code>文件中定义时，定义了使用的Rails gems的版本。</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2009/02/13/configuring-rails-applications/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>functional tests中的form_authenticity_token</title>
		<link>http://www.xuwenhao.com/2009/02/09/form_authenticity_token-in-functional-tests/</link>
		<comments>http://www.xuwenhao.com/2009/02/09/form_authenticity_token-in-functional-tests/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 15:25:01 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=682</guid>
		<description><![CDATA[又是一个前一阵遇到的很tricky的问题。 Rails2.0中加入了form_authenticity_token来防止部分的cross-site的攻击，ActionView中默认的form_for标签会自动加入类似于 的代码，如果你自己使用form_tag来创建form的话，可以用类似于 &#60;input type="hidden" name="authenticity_token" value="&#60;%= "#{form_authenticity_token}" %&#62;" /&#62; 的代码来加入这个隐藏的form中的authenticity_token。 但是手工加入这个token在functional tests中会带来问题，因为functional tests中是把allow_forgery_protection关掉的 可以在environments/test.rb中看到这样的配置 config.action_controller.allow_forgery_protection = false 但是authenticity现在是hardcode在代码中，所以跑functional tests通常会遇到这样的错误 ActionView::TemplateError: No :secret given to the #protect_from_forgery call. Set that or use a session store capable of generating its own keys (Cookie Session Store). 一种解决办法是在view中加入当前all_forgery_protection状态的判断代码，比如 &#60;input type="hidden" name="authenticity_token" value="&#60;%= "#{form_authenticity_token}" %&#62;" /&#62; 但是有位同学用了个更巧妙的hook的办法，在test_helper.rb中hook掉form_authenticity_token，如下 module ActionController [...]]]></description>
			<content:encoded><![CDATA[<p>又是一个前一阵遇到的很tricky的问题。</p>
<p>Rails2.0中加入了form_authenticity_token来防止部分的cross-site的攻击，ActionView中默认的form_for标签会自动加入类似于
<pre name="code" class="html">
<input type="hidden" name="authenticity_token" value="d4500add369b69aee5fca2c1955e4673c941b0d3" /></pre>
<p>的代码，如果你自己使用form_tag来创建form的话，可以用类似于</p>
<pre name="code" class="ruby">
&lt;input type="hidden" name="authenticity_token" value="&lt;%= "#{form_authenticity_token}" %&gt;" /&gt;
</pre>
<p>的代码来加入这个隐藏的form中的authenticity_token。</p>
<p>但是手工加入这个token在functional tests中会带来问题，因为functional tests中是把allow_forgery_protection关掉的<br />
可以在environments/test.rb中看到这样的配置</p>
<pre name="code" class="ruby">
config.action_controller.allow_forgery_protection    = false
</pre>
<p>但是authenticity现在是hardcode在代码中，所以跑functional tests通常会遇到这样的错误</p>
<pre name="code" class="ruby">
ActionView::TemplateError: No :secret given to the #protect_from_forgery call.  Set that or use a session store capable of generating its own keys (Cookie Session Store).
</pre>
<p>一种<a href="http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/b7f0bda9209c71f6" target="_blank">解决办法</a>是在view中加入当前all_forgery_protection状态的判断代码，比如</p>
<pre name="code" class="ruby">
<% if  protect_against_forgery? %>
&lt;input type="hidden" name="authenticity_token" value="&lt;%= "#{form_authenticity_token}" %&gt;" /&gt;
<% end %>
</pre>
<p>但是<a href="http://pauldoerwald.ca/2008/4/23/form_authenticity_token-in-functional-tests" target="_blank">有位同学</a>用了个更巧妙的hook的办法，在test_helper.rb中hook掉form_authenticity_token，如下</p>
<pre name="code" class="ruby">
module ActionController
  module RequestForgeryProtection
    def form_authenticity_token
      return "form_authenticity_token OVERRIDE!"
    end
  end
end
</pre>
<p>我比较喜欢后一种啦。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2009/02/09/form_authenticity_token-in-functional-tests/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

