<?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/" version="2.0">

<channel>
	<title>灰色的灵魂</title>
	
	<link>http://www.xuwenhao.com</link>
	<description>黑夜给了我黑色的眼睛, 而我注定要用它来寻找美金</description>
	<pubDate>Sun, 24 May 2009 06:25:27 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/xuwenhao" type="application/rss+xml" /><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>
		</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>
		</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>
		</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>
		</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>
		</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>
		</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>
		</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>
		</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（该配置无需设定），但是你可以有两个别的选择：

:table_name会另Customer类的主键为customerid
:table_name_with_underscore会另Customer类的主键为customer_id


table_name_prefix使你可以在表名的前面设置添加一个全局的字符串。如果你将该值设为northwest_，那么Customer类会映射到northwest_customers表。默认该值为一个空字符串
table_name_prefix使你可以在表明的后面设置添加一个全局的字符串。如果你将该值设为_northwest，那么Customer类会映射到customers_northwest表。默认该值为一个空字符串。
pluralize_table_names规定了Rails使用单词的单数还是复数来命名数据库中的表名。如果该值被设置为true（默认值），那么Customer类会使用customers表，如果该值被设置为false，那么Customer类会使用customer表
colorize_logging（默认为true）规定了在ActiveRecord的日志信息中是否使用彩色的ANSI代码。
default_timezone决定了在从数据库中读取日期和时间时，是使用Time.local（如果设置为:local）还是Time.utc（如果设置为:utc）。默认值为:local
schema_format控制了从数据库中导出数据库模式到文件中所用的格式。选项:ruby（默认值）会使用一个数据库无关的migrations，选项:sql会使用（可能依赖于特定数据库的）SQL指令。
timestamped_migrations控制了migrations的数字是使用连续的整数还是时间戳。默认值为true，代表使用时间戳，这在优多人共同开发同一个应用的时候是一个更好的选择。 
lock_optimistically控制了ActiveRecord是否使用乐观锁。默认该值为true
MySQL适配器增加了一个额外的配置选项：
ActiveRecord::ConnectionAdapters::MysqlAdapter.emulate_booleans控制了ActiveRecord是否认为MySQL数据库中所有的tinyint(1)列为布尔值。默认该值为true
数据库模式的导出器（schema dumper）增加了一个额外的配置选项：
ActiveRecord::SchemaDumper.ignore_table接受一个表名的数组，该数组中的表不应包含在任何生成的数据库模式文件中。该设置在ActiveRecord::Base.schema_format == :ruby时才会起作用。

3.2 配置Action Controller
ActionController::Base包含了一些配置设定：

asset_host在所有AssetHelper中的辅助方法所生成URL的前面添加一个字符串。这是设计用来将所有的javascript，CSS以及图片文件转移到一个不同的主机（asset host）上。
consider_all_requests_local通常在开发环境中被设为true而在生产环境中被设为false；如果它被设为true，则任何错误都会导致详细的调试信息会被导出到HTTP response中。如果你想做更细致的控制，将其设为false然后实现local_request?方法来决定哪些requests会在出错的情况下提供调试信息。
allow_concurrency为了允许同步（线程安全的）的action处理，该值应当被设为true。默认情况下该值为false。你通常不应当直接修改这个配置，因为你需要一系列的其他调整使得线程安全模式可以正确地工作做。你可以在production.rb文件中简单地调用config.threadsafe!，它会为你做所有需要的调整。

Threadsafe操作和开发模式下的一些功能不兼容。特别是自动的依赖装载和类重装载会在你调用config.threadsafe!之后被自动禁用

param_parsers让你可以设置一个handlers的数组，用于提取HTTP requests中的信息并将它放到params哈希中。默认情况下，multipart forms，URL-encoded forms，XML以及JSON的parsers是被激活的。
default_charset设定了所有render默认使用的字符集。默认值为"utf-8"
logger接收一个符合Log4r或者Ruby1.8.x Logger类的接口的logger，可以被用来在Action Controller中记录日志信息。把该值设为nil会禁用日志功能。
resource_action_separator用来设置RESTful url中resource和action之间的分隔符。默认为&#8221;/&#8221;。
resource_path_names用来设置一个RESTful action默认的名字的哈希。默认情况下，new action被命名为new而edit action被命名为edit。
request_forgery_protection_token用来设置RequestForgery的参数名。调用protect_from_forgery会将它设为:authenticity_token
optimise_named_routes打开了一些生成路径表（routes table）的优化。它默认被设为true
use_accept_header用于设置确定response格式的规则。如果该值设为true（默认值），则respond_to方法和Request#format方法会根据Accept Header返回相应格式的response。弱该值设为false则request格式会单独由params[:format]来决定。如果没有format参数，则response的格式会根据request是否是一个Ajax request来决定返回HTML还是Javascript。
allow_forgery_protection用于设置启用还是禁用CSRF保护。默认在测试模式下该值为false而在其他模式下为true。
relative_url_root可以被用来告诉Rails你将会将应用部署到一个子目录。默认值为ENV['RAILS_RELATIVE_URL_ROOT']
缓存功能代码将会增加两个额外的设置：
ActionController::Caching::Pages.page_cache_directory用于设置Rails为你的Web服务器创建缓存页面的位置。默认值为Rails.public_path（通常该值被设为RAILS_ROOT&#8220;/public&#8221;+）。
ActionController::Caching::Pages.page_cache_extension用于设置生成的缓存页面文件的扩展名（如果进来的requests已经带了扩展名则这里的扩展名会被忽略）。默认值为.html。
分发器（dispatcher）包含了这样一条配置
ActionController::Dispatcher.error_file_path给定了Rails用来寻找出错文件如404.html的路径。默认值为Rails.public_path。
使用Active Record的session存储可以这样来配置
CGI::Session::ActiveRecordStore::Session.data_column_name用于设置用来存储session数据的列名。默认值为&#8217;data&#8217;。

3.3 配置Action View
Action [...]]]></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之间的分隔符。默认为&#8221;/&#8221;。</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>&#8220;/public&#8221;+）。</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数据的列名。默认值为&#8217;data&#8217;。</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）。默认为&#8217;-'。查看<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>允许你使用一个远端的邮件服务器。请将它从默认的&#8221;localhost&#8221;改为你所用的邮件服务器。</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>
		</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
  module RequestForgeryProtection
    def form_authenticity_token
  [...]]]></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>
		</item>
		<item>
		<title>在新macbook上安装Rails+MySQL</title>
		<link>http://www.xuwenhao.com/2009/02/09/install-rails-with-mysql-on-new-macboo/</link>
		<comments>http://www.xuwenhao.com/2009/02/09/install-rails-with-mysql-on-new-macboo/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 14:37:33 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
		
		<category><![CDATA[Mac]]></category>

		<category><![CDATA[Tech]]></category>

		<category><![CDATA[Rails]]></category>

		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=672</guid>
		<description><![CDATA[嗯，嗯，嗯，这个问题前一阵来来回回折腾过不少时间，主要的问题在于

Macbook 466是64位的CPU
Leopard自带的Ruby是32位的版本
如果安装的MySQL是64位版本的，就需要自己编译个Ruby
要不你就像我这样还是装个32位的MySQL吧

MySQL安装的注意事项

建议安装Startup Item，这样就开机自启动了
如果装了Startup Item但是不想开机自启动，那就修改/etc/hostconfig，把MYSQLCOM=-YES-改成MYSQLCOM=-NO-
默认的encoding是latin1，所以要改一下配置文件，按下面这么办就行了


   $ sudo cp /usr/local/mysql/support-files/my-small.cnf /etc/my.cnf
   $ sudo vim /etc/my.cnf
   # 在对应的节点添加如下信息
   [client]
   default-character-set = utf8
   [mysqld]
   character-set-server = utf8
   default-table-type = innodb 
记得数据库创建要在改完配置重启mysqld之后，不然创建的数据库默认还是latin1的
然后就是gem安装mysql的驱动了，抛弃掉Rails自带的过时的ruby版本的驱动了

sudo env ARCHFLAGS="-arch i386" gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config

如果您装的是64位的Ruby和MySQL那么改一个参数吧

sudo env ARCHFLAGS="-arch x86_64" gem [...]]]></description>
			<content:encoded><![CDATA[<p>嗯，嗯，嗯，这个问题前一阵来来回回折腾过不少时间，主要的问题在于</p>
<ul>
<li>Macbook 466是64位的CPU</li>
<li>Leopard自带的Ruby是32位的版本</li>
<li>如果安装的MySQL是64位版本的，就需要自己编译个Ruby</li>
<li>要不你就像我这样还是装个32位的MySQL吧</li>
</ul>
<p>MySQL安装的注意事项</p>
<ul>
<li>建议安装Startup Item，这样就开机自启动了</li>
<li>如果装了Startup Item但是不想开机自启动，那就修改/etc/hostconfig，把MYSQLCOM=-YES-改成MYSQLCOM=-NO-</li>
<li>默认的encoding是latin1，所以要改一下配置文件，按下面这么办就行了</li>
</ul>
<pre name="code" class="ruby">
   $ sudo cp /usr/local/mysql/support-files/my-small.cnf /etc/my.cnf
   $ sudo vim /etc/my.cnf
   # 在对应的节点添加如下信息
   [client]
   default-character-set = utf8
   [mysqld]
   character-set-server = utf8
   default-table-type = innodb </pre>
<p>记得数据库创建要在改完配置重启mysqld之后，不然创建的数据库默认还是latin1的</p>
<p>然后就是gem安装mysql的驱动了，抛弃掉Rails自带的过时的ruby版本的驱动了</p>
<pre name="code" class="ruby">
sudo env ARCHFLAGS="-arch i386" gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config
</pre>
<p>如果您装的是64位的Ruby和MySQL那么改一个参数吧</p>
<pre name="code" class="ruby">
sudo env ARCHFLAGS="-arch x86_64" gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2009/02/09/install-rails-with-mysql-on-new-macboo/feed/</wfw:commentRss>
		</item>
		<item>
		<title>QQ居然还能用</title>
		<link>http://www.xuwenhao.com/2009/02/08/my-qq-is-still-there/</link>
		<comments>http://www.xuwenhao.com/2009/02/08/my-qq-is-still-there/#comments</comments>
		<pubDate>Sun, 08 Feb 2009 14:30:15 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
		
		<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=669</guid>
		<description><![CDATA[神奇地发现，我之前的qq号居然还能用，虽然最早最早申请的那个早已经连号也不记得了，但是之后常用的那个居然在我N年没有登陆之后还能用，实在太神奇了，只是在Mac下用Adium貌似不太顺畅，常常不显示在线的联系人，只好下了个QQ for Mac备用。另外，发现上海电信最近很有问题，MSN在Mac下始终登陆不上去，但是换个地方的网络就没有问题，这是为什么呢？
]]></description>
			<content:encoded><![CDATA[<p>神奇地发现，我之前的qq号居然还能用，虽然最早最早申请的那个早已经连号也不记得了，但是之后常用的那个居然在我N年没有登陆之后还能用，实在太神奇了，只是在Mac下用Adium貌似不太顺畅，常常不显示在线的联系人，只好下了个QQ for Mac备用。另外，发现上海电信最近很有问题，MSN在Mac下始终登陆不上去，但是换个地方的网络就没有问题，这是为什么呢？</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2009/02/08/my-qq-is-still-there/feed/</wfw:commentRss>
		</item>
		<item>
		<title>没有思考的写作</title>
		<link>http://www.xuwenhao.com/2009/01/29/writing-and-thinking/</link>
		<comments>http://www.xuwenhao.com/2009/01/29/writing-and-thinking/#comments</comments>
		<pubDate>Thu, 29 Jan 2009 13:56:46 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
		
		<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=667</guid>
		<description><![CDATA[在过去的很长一段时间里，我在写blog的时候，常常有无从下笔的感觉，不是说简单的不知道要写什么，而是我有了个想写的主题，但是，写了两句，就觉得有东西要写，但是不知道改怎么写，于是，便常常就搁下了。一开始，我认为，大概是因为对着电脑打字太慢，写到纸上可能就好了，但是后来发现，其实打字是远比写字要快的。于是，我又觉得，可能是心情过于烦躁，不能安下心来写点什么，但其实也并非如此，因为放假放松的时候，也不知道写些什么好。最后，我仔细想了一下，是因为好长时间，没有安安静静思考过了。
说一年没有好好思考，可能有点夸张，但是，仔细想想自己过去一年做的学的说的，其实，就是没有用脑仔细思考过问题。忙得时候非常忙，也非常焦虑，自然是把事情做得短平快；闲得时候，总觉得不能浪费时间，要么不停地看东西，书也好，blog也好，电影也好，不停地接收信息，但是没有分析思考过。我上一次一个人独处，静静地坐在沙发里，没有电脑电视音乐和书得日子大概已经是几年以前得事情了。过去几年里，我学得很勤快，但是不曾真正思考过，基本上是走模仿复制得道路，看别人写的东西照做，看别人的代码照做，看别人的best practice照用，如果没有google大概我都不知道每件事情应该怎么做了。好处当然是有的，节省时间，少走弯路，用了别人的best practice，不用犯几次错误才总结出点点经验；坏处就是彻底地陷入了信息烟尘之中，没人说怎么做的话就快手足无措了；而到想到点什么需要写点东西的时候，往往别人的思路自己的想法纠缠在一起，然后觉得这个别人也说了那个别人也说了，自己实在是没什么好说的了，于是焦虑得很。然后又有些懒于思考，不愿意坐下来想好一二三，是什么为什么才来写，总是急匆匆有个主题开始提笔，写了一般发现思路混乱写不下去了。
解决办法是有的，也是很简单，就是回到小时候老师们教的写作文的办法，打草稿列提纲，记录写句子的tips，然后开始照着写，这样气也顺了，文章也能知道哪里是个头了，打草稿列提纲的时候也能想清楚要写什么写得对不对了。过了那么多年，才发现，小时候的办法真的是好办法，回到基础，从头做起，好好思考，好好写点有点儿意义的东西吧。
]]></description>
			<content:encoded><![CDATA[<p>在过去的很长一段时间里，我在写blog的时候，常常有无从下笔的感觉，不是说简单的不知道要写什么，而是我有了个想写的主题，但是，写了两句，就觉得有东西要写，但是不知道改怎么写，于是，便常常就搁下了。一开始，我认为，大概是因为对着电脑打字太慢，写到纸上可能就好了，但是后来发现，其实打字是远比写字要快的。于是，我又觉得，可能是心情过于烦躁，不能安下心来写点什么，但其实也并非如此，因为放假放松的时候，也不知道写些什么好。最后，我仔细想了一下，是因为好长时间，没有安安静静思考过了。</p>
<p>说一年没有好好思考，可能有点夸张，但是，仔细想想自己过去一年做的学的说的，其实，就是没有用脑仔细思考过问题。忙得时候非常忙，也非常焦虑，自然是把事情做得短平快；闲得时候，总觉得不能浪费时间，要么不停地看东西，书也好，blog也好，电影也好，不停地接收信息，但是没有分析思考过。我上一次一个人独处，静静地坐在沙发里，没有电脑电视音乐和书得日子大概已经是几年以前得事情了。过去几年里，我学得很勤快，但是不曾真正思考过，基本上是走模仿复制得道路，看别人写的东西照做，看别人的代码照做，看别人的best practice照用，如果没有google大概我都不知道每件事情应该怎么做了。好处当然是有的，节省时间，少走弯路，用了别人的best practice，不用犯几次错误才总结出点点经验；坏处就是彻底地陷入了信息烟尘之中，没人说怎么做的话就快手足无措了；而到想到点什么需要写点东西的时候，往往别人的思路自己的想法纠缠在一起，然后觉得这个别人也说了那个别人也说了，自己实在是没什么好说的了，于是焦虑得很。然后又有些懒于思考，不愿意坐下来想好一二三，是什么为什么才来写，总是急匆匆有个主题开始提笔，写了一般发现思路混乱写不下去了。</p>
<p>解决办法是有的，也是很简单，就是回到小时候老师们教的写作文的办法，打草稿列提纲，记录写句子的tips，然后开始照着写，这样气也顺了，文章也能知道哪里是个头了，打草稿列提纲的时候也能想清楚要写什么写得对不对了。过了那么多年，才发现，小时候的办法真的是好办法，回到基础，从头做起，好好思考，好好写点有点儿意义的东西吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2009/01/29/writing-and-thinking/feed/</wfw:commentRss>
		</item>
		<item>
		<title>红海搏杀的电子商务</title>
		<link>http://www.xuwenhao.com/2009/01/29/the-red-sea-of-the-e-commerce/</link>
		<comments>http://www.xuwenhao.com/2009/01/29/the-red-sea-of-the-e-commerce/#comments</comments>
		<pubDate>Thu, 29 Jan 2009 12:29:40 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
		
		<category><![CDATA[Life]]></category>

		<category><![CDATA[Business]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=665</guid>
		<description><![CDATA[初二的时候老妈的手机充电器坏了，老爸的一块手机电池鼓起来了，于是两个人跑去附近的苏宁要买，然后柜台报价分别是150和100，两人一合计，觉得太贵，讨价还价之后，愈发觉得这个不靠谱，于是回来找我帮他们网上买。
因为最近在水木上频频看到京东的负面评价，所以首选仍然是Mars同学所在的新蛋，结果发现电池没有；于是还是上了京东，好，都有，结果结账的时候发现没法选货到付款，回想了下水木上的评论，想想还是算了；最后跑上易讯，发现都有，总价也比京东低上了10块，可以货到付款，我以前没有在易讯买过东西，于是注册了一个新帐号下单。今天初四，早上顺利到手，唯一的问题是，收了货才发现没有发票。
回头我在想，这些B2C的公司，我大概在七八个站点买过东西，可是，其实我是个没啥忠诚度的顾客。就像我之前说的，我在当当都买满5000块的书了，但是我现在主要买书都在卓越上买，没有的才会去其他地方。然后电子产品我最早是新蛋的客户，但是我下的最大的一单一台x61是在京东，而这次我又有了个易讯的帐号。事实上，我自己也不知道，下回我会在哪家买。因为电子商务，通常卖的都是标准化的产品，书也好，笔记本电脑也好，在哪儿买都一样，唯一的差别大概是价格。事实上，其实大部分商家的价格也都是一样的，因为别人降了你也不得不降。而标准化产品的服务呢，简单的——比如电子邮件提醒你出货了，这个边际成本很低，随便哪家都有；麻烦的——比如退货，其实我是希望永远别碰上，事实上碰上的概率也不会太高。那么，那么多的商家呢，互相之间如何区分呢？
其实我想这些大玩家也能看到这个问题，所以各家用了各家的办法，但是观察分析一下，估计效果不会太好。比如京东也在学啥bestbuy搞商家提供的保修服务，但是我想了想这玩意儿我大概不会轻易买，因为实在不便宜。而如果连我这样比较愿意花钱买服务的人都不买，估计这玩意儿的转换率一定非常之低。而新蛋常常给vip用户发优惠券，不过我没用上过几回，常常都过期了，也没有想买的东西，只好作废，不过好处是可以几块钱上taobao买别人的来用，可以剩下个几十块钱。但是，这些东西都无法阻止我为了几十块钱的差价，跑去别家买，所以，现在看来，对B2C商家来说，最大的竞争力就是价格了，其他方面，只要做到及格就好，所以估计未来几年，B2C在国内，还是红海搏杀，比拼价格的岁月——也就是不赚钱的岁月。所以，我在想，其实淘金热里，淘金者挣不到什么钱，应该考虑考虑卖铲子了。
]]></description>
			<content:encoded><![CDATA[<p>初二的时候老妈的手机充电器坏了，老爸的一块手机电池鼓起来了，于是两个人跑去附近的苏宁要买，然后柜台报价分别是150和100，两人一合计，觉得太贵，讨价还价之后，愈发觉得这个不靠谱，于是回来找我帮他们网上买。</p>
<p>因为最近在水木上频频看到<a href="http://www.360buy.com" target="_blank">京东</a>的负面评价，所以首选仍然是<a href="http://www.marsopinion.com" target="_blank">Mars同学</a>所在的<a href="http://www.newegg.com.cn" target="_blank">新蛋</a>，结果发现电池没有；于是还是上了京东，好，都有，结果结账的时候发现没法选货到付款，回想了下水木上的评论，想想还是算了；最后跑上<a href="http://www.icsun.com" target="_blank">易讯</a>，发现都有，总价也比京东低上了10块，可以货到付款，我以前没有在易讯买过东西，于是注册了一个新帐号下单。今天初四，早上顺利到手，唯一的问题是，收了货才发现没有发票。</p>
<p>回头我在想，这些B2C的公司，我大概在七八个站点买过东西，可是，其实我是个没啥忠诚度的顾客。<a href="http://www.xuwenhao.com/2009/01/11/devils-are-in-the-detail/" target="_blank">就像我之前说的</a>，我在当当都买满5000块的书了，但是我现在主要买书都在卓越上买，没有的才会去其他地方。然后电子产品我最早是新蛋的客户，但是我下的最大的一单一台x61是在京东，而这次我又有了个易讯的帐号。事实上，我自己也不知道，下回我会在哪家买。因为电子商务，通常卖的都是标准化的产品，书也好，笔记本电脑也好，在哪儿买都一样，唯一的差别大概是价格。事实上，其实大部分商家的价格也都是一样的，因为别人降了你也不得不降。而标准化产品的服务呢，简单的——比如电子邮件提醒你出货了，这个边际成本很低，随便哪家都有；麻烦的——比如退货，其实我是希望永远别碰上，事实上碰上的概率也不会太高。那么，那么多的商家呢，互相之间如何区分呢？</p>
<p>其实我想这些大玩家也能看到这个问题，所以各家用了各家的办法，但是观察分析一下，估计效果不会太好。比如京东也在学啥<a href="http://www.bestbuy.com" target="_blank">bestbuy</a>搞商家提供的保修服务，但是我想了想这玩意儿我大概不会轻易买，因为实在不便宜。而如果连我这样比较愿意花钱买服务的人都不买，估计这玩意儿的转换率一定非常之低。而新蛋常常给vip用户发优惠券，不过我没用上过几回，常常都过期了，也没有想买的东西，只好作废，不过好处是可以几块钱上taobao买别人的来用，可以剩下个几十块钱。但是，这些东西都无法阻止我为了几十块钱的差价，跑去别家买，所以，现在看来，对B2C商家来说，最大的竞争力就是价格了，其他方面，只要做到及格就好，所以估计未来几年，B2C在国内，还是红海搏杀，比拼价格的岁月——也就是不赚钱的岁月。所以，我在想，其实淘金热里，淘金者挣不到什么钱，应该考虑考虑卖铲子了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2009/01/29/the-red-sea-of-the-e-commerce/feed/</wfw:commentRss>
		</item>
		<item>
		<title>语言的艺术</title>
		<link>http://www.xuwenhao.com/2009/01/29/the-art-of-languag/</link>
		<comments>http://www.xuwenhao.com/2009/01/29/the-art-of-languag/#comments</comments>
		<pubDate>Thu, 29 Jan 2009 11:16:42 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
		
		<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=663</guid>
		<description><![CDATA[刚才拿到报纸，老妈看到一条新闻念道，“三成家庭春节消费预计超去年”，然后指责宣传岗位的同志们报喜不报忧。然后我就纠正了她这一错误的观念，“同志们明明告诉了你，还有七成家庭春节消费预计比去年低呢”
]]></description>
			<content:encoded><![CDATA[<p>刚才拿到报纸，老妈看到一条新闻念道，“三成家庭春节消费预计超去年”，然后指责宣传岗位的同志们报喜不报忧。然后我就纠正了她这一错误的观念，“同志们明明告诉了你，还有七成家庭春节消费预计比去年低呢”</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2009/01/29/the-art-of-languag/feed/</wfw:commentRss>
		</item>
		<item>
		<title>魔鬼在细节之中</title>
		<link>http://www.xuwenhao.com/2009/01/11/devils-are-in-the-detail/</link>
		<comments>http://www.xuwenhao.com/2009/01/11/devils-are-in-the-detail/#comments</comments>
		<pubDate>Sun, 11 Jan 2009 14:03:22 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
		
		<category><![CDATA[Life]]></category>

		<category><![CDATA[Book]]></category>

		<category><![CDATA[Business]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=660</guid>
		<description><![CDATA[最近又买了很多书，看了一下，我的帐号在当当上的购书金额总额已经超过5000块了，在卓越上也已经有近三千块了，这还没算上我在china-pub和cnforyou上买过的书。话说当年我们班的一本教课书还是我从cnforyou定的，一单就是1000多块啊，不过现在看看他家基本上已经销声匿迹了，刚刚上去扫了一眼，貌似还搞了个taobao店，看来状况是不怎么好。现在越来越多的书是从卓越定的，主要是他家包装好，通常有纸盒包着，不像我以前在当当买书的时候总拿到一些看似旧书或者封面有折痕的书，而且送货也比当当快些。而且以前当当的书比卓越要多不少，很多稍微偏门一点的书（其实真不算是偏门）卓越都没有，不过自从Amazon收购之后，卓越也走上了大而全的路线了。
不过说实话，两家的产品还是需要打磨再打磨，前两天从卓越定书，就遇到个bug，购物篮里的书有两本死活不出现书名，价钱数量显示都对，可以下单，但是下单结果是失败，一开始没发现，过了两天发现书没来，订单确认的邮件也没收到才发现订单根本没下，然后折腾了好久，最后清空购物车重来才发现有两本书缺货，不知道是不是这个导致的bug。于是再从当当定书，当当现在很有意思，貌似货送到你手上后，快递同志会扫订单的条码，然后当当就会给你发邮件让你确认收到货了。但是这封邮件点开后我从来没有点进那个订单确认过，因为我很懒，虽然邮件里有小字写着确认订单送5分积分，但是一那个字真的很小，我是昨天才第一次发现可以送5分的，二是没告诉我积分可以干什么，三是自动的邮件居然只有一个订单号，没有订单金额，没有详细的书目，所以看了邮件我也不知道是不是我这次下的订单，如果要点开链接到当当的网站上才能确认的话……抱歉，我真的很忙也很懒，没空浪费时间做对当当有用但是对我没用的事情。
我想当当尽早确认订单也是为了加快收回货款和管理送货的时间，不过一封简单的邮件没有做好，可能大价钱搞的条码扫描系统的效果就大打折扣了。我想对他家来说从邮件里显示一个订单号到显示订单的所有书目，是举手之劳，但是如果直接在邮件里就可以点击确认收货，大概conversion rate至少会比现在高一倍吧，所以说一个产品要做到好用真是很难，有太多的细节需要注意了。
]]></description>
			<content:encoded><![CDATA[<p>最近又买了很多书，看了一下，我的帐号在当当上的购书金额总额已经超过5000块了，在卓越上也已经有近三千块了，这还没算上我在china-pub和cnforyou上买过的书。话说当年我们班的一本教课书还是我从cnforyou定的，一单就是1000多块啊，不过现在看看他家基本上已经销声匿迹了，刚刚上去扫了一眼，貌似还搞了个taobao店，看来状况是不怎么好。现在越来越多的书是从卓越定的，主要是他家包装好，通常有纸盒包着，不像我以前在当当买书的时候总拿到一些看似旧书或者封面有折痕的书，而且送货也比当当快些。而且以前当当的书比卓越要多不少，很多稍微偏门一点的书（其实真不算是偏门）卓越都没有，不过自从Amazon收购之后，卓越也走上了大而全的路线了。</p>
<p>不过说实话，两家的产品还是需要打磨再打磨，前两天从卓越定书，就遇到个bug，购物篮里的书有两本死活不出现书名，价钱数量显示都对，可以下单，但是下单结果是失败，一开始没发现，过了两天发现书没来，订单确认的邮件也没收到才发现订单根本没下，然后折腾了好久，最后清空购物车重来才发现有两本书缺货，不知道是不是这个导致的bug。于是再从当当定书，当当现在很有意思，貌似货送到你手上后，快递同志会扫订单的条码，然后当当就会给你发邮件让你确认收到货了。但是这封邮件点开后我从来没有点进那个订单确认过，因为我很懒，虽然邮件里有小字写着确认订单送5分积分，但是一那个字真的很小，我是昨天才第一次发现可以送5分的，二是没告诉我积分可以干什么，三是自动的邮件居然只有一个订单号，没有订单金额，没有详细的书目，所以看了邮件我也不知道是不是我这次下的订单，如果要点开链接到当当的网站上才能确认的话……抱歉，我真的很忙也很懒，没空浪费时间做对当当有用但是对我没用的事情。</p>
<p>我想当当尽早确认订单也是为了加快收回货款和管理送货的时间，不过一封简单的邮件没有做好，可能大价钱搞的条码扫描系统的效果就大打折扣了。我想对他家来说从邮件里显示一个订单号到显示订单的所有书目，是举手之劳，但是如果直接在邮件里就可以点击确认收货，大概conversion rate至少会比现在高一倍吧，所以说一个产品要做到好用真是很难，有太多的细节需要注意了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2009/01/11/devils-are-in-the-detail/feed/</wfw:commentRss>
		</item>
		<item>
		<title>D-Link的信号果然不好</title>
		<link>http://www.xuwenhao.com/2009/01/09/d-link-signal-is-wee/</link>
		<comments>http://www.xuwenhao.com/2009/01/09/d-link-signal-is-wee/#comments</comments>
		<pubDate>Fri, 09 Jan 2009 13:52:19 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
		
		<category><![CDATA[Life]]></category>

		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=658</guid>
		<description><![CDATA[果然如shute同学所说，D-Link 624的信号比Netgear WGR614差不少。
]]></description>
			<content:encoded><![CDATA[<p>果然如shute同学所说，D-Link 624的信号比Netgear WGR614差不少。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2009/01/09/d-link-signal-is-wee/feed/</wfw:commentRss>
		</item>
		<item>
		<title>奇怪的tar的问题</title>
		<link>http://www.xuwenhao.com/2009/01/07/strange-tar-question-on-mac/</link>
		<comments>http://www.xuwenhao.com/2009/01/07/strange-tar-question-on-mac/#comments</comments>
		<pubDate>Wed, 07 Jan 2009 04:46:01 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
		
		<category><![CDATA[Life]]></category>

		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=656</guid>
		<description><![CDATA[很奇怪的问题，在用脚本打包rails project然后上传服务器，因为本机和服务器间的网速很慢，而git会生成很多以._开头的文件，为了让tar包小一点，要把这些文件去掉，用了这样一条命令

tar -zcvf abc.tar.gz &#8211;exclude abc/\.git &#8211;exclude *\._* abc
在Centos下work得很好，但是在我的Mac上._开头的文件仍然在tar包中，两边的tar的版本都是tar (GNU tar) 1.15.1，这是为什么呢？或者谁能告诉我在Mac下应该怎么做？
]]></description>
			<content:encoded><![CDATA[<p>很奇怪的问题，在用脚本打包rails project然后上传服务器，因为本机和服务器间的网速很慢，而git会生成很多以._开头的文件，为了让tar包小一点，要把这些文件去掉，用了这样一条命令</p>
<blockquote><p>
tar -zcvf abc.tar.gz &#8211;exclude abc/\.git &#8211;exclude *\._* abc</p></blockquote>
<p>在Centos下work得很好，但是在我的Mac上._开头的文件仍然在tar包中，两边的tar的版本都是tar (GNU tar) 1.15.1，这是为什么呢？或者谁能告诉我在Mac下应该怎么做？</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2009/01/07/strange-tar-question-on-mac/feed/</wfw:commentRss>
		</item>
		<item>
		<title>经济危机，物价大跌了？</title>
		<link>http://www.xuwenhao.com/2009/01/05/x61-is-so-cheap-now/</link>
		<comments>http://www.xuwenhao.com/2009/01/05/x61-is-so-cheap-now/#comments</comments>
		<pubDate>Mon, 05 Jan 2009 15:08:47 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
		
		<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=654</guid>
		<description><![CDATA[一直考虑要不要入手一个大显示器，但是非TN面板的显示器价钱一直没有下来，Dell2408还是维持在4500+的高位，不过今天在新蛋首页上看到这个。X61啊，居然只要6500+了，呃，买个macbook可以x61+2208+鼠标键盘了。
]]></description>
			<content:encoded><![CDATA[<p>一直考虑要不要入手一个大显示器，但是非TN面板的显示器价钱一直没有下来，Dell2408还是维持在4500+的高位，不过今天在新蛋首页上看到<a href="http://www.newegg.com.cn/Products/ProductDetail.aspx?sysno=41203">这个</a>。X61啊，居然只要6500+了，呃，买个macbook可以x61+2208+鼠标键盘了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2009/01/05/x61-is-so-cheap-now/feed/</wfw:commentRss>
		</item>
		<item>
		<title>刀还没钝</title>
		<link>http://www.xuwenhao.com/2009/01/03/i-am-still-sharp/</link>
		<comments>http://www.xuwenhao.com/2009/01/03/i-am-still-sharp/#comments</comments>
		<pubDate>Sat, 03 Jan 2009 14:07:46 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
		
		<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=650</guid>
		<description><![CDATA[过去四天，主要都在写代码，被mars同学批评了，是原因之一，被shute同学带动了，是原因之二。和比我优秀的人一起工作，是一件好事，能避免我堕落。
忽然发现，好久没有坐下来整天写代码了。欣喜的是，刀还没钝，遇到问题基本很快能解决；遗憾的是，比起一年半前真的没什么进步。所以，做事还是要专注，几年时间，能真正做好一件事就不错了，不能去追求当百科全书，暂时没看出自己能有那样的天赋。
今天花了半天时间和各种环境问题做斗争，聚友网络的宽带很烂，速度慢，还丢包，而且在上海这边用的是网通的网络，害我ssh服务器都奇慢无比。大部分人都不爱共享wifi，基本上能搜到的信号都是加密的，唯一一个没加密的一直对我进行arp欺骗……modrails很好很傻瓜，如果linux下的东西都能做成这样，我就可以偷懒不花时间去研究什么配置环境了。CentOS很不错，今天远程登陆一台基本全裸的机器装我们的production code，没有ftp，没有wget，连gcc和make都没有，scp过去的速度只有4k，我当时死的心都有了。结果折腾了两个小时之后发现CentOS也有自己的包管理工具yum，于是10+分钟装完基本设施。之后再和rails和mysql做斗争，发现每次装环境，都会有各种诡异的问题，不过在试错和google的帮助下啊，好歹把production的环境给搭完了。然后又花费2两个小时debug wml代码，结果发现wml页面里的元素都要包装在
标签里，设置的content-type，mime-type其实都比较无所谓。
在两件事情里都在实践rails，不得不承认，rails和ruby就是生产力。前两年其实本以打算好好学一学用一用，结果还是败给惰性和工作繁忙的借口，好在现在再看，也不算太晚，何况，什么事情只要做了，都不算太晚。
rails会征服web dev领域的，或者说，他已经征服了，在rails和merb宣布合并之后，很多人对于ruby web dev框架技术路线的concern应该也会消除了，如果rails迁移到rack完成，rails又算进入一个新的时代吧。充足的插件，精炼的语法，性能也没问题，除了business critical的应用，其他的用rails应该都能轻松搞定了。对于从头学习web dev来说，rails应该是第一选择，是值得一年时间的技术投资了。
]]></description>
			<content:encoded><![CDATA[<p>过去四天，主要都在写代码，被mars同学批评了，是原因之一，被shute同学带动了，是原因之二。和比我优秀的人一起工作，是一件好事，能避免我堕落。</p>
<p>忽然发现，好久没有坐下来整天写代码了。欣喜的是，刀还没钝，遇到问题基本很快能解决；遗憾的是，比起一年半前真的没什么进步。所以，做事还是要专注，几年时间，能真正做好一件事就不错了，不能去追求当百科全书，暂时没看出自己能有那样的天赋。</p>
<p>今天花了半天时间和各种环境问题做斗争，聚友网络的宽带很烂，速度慢，还丢包，而且在上海这边用的是网通的网络，害我ssh服务器都奇慢无比。大部分人都不爱共享wifi，基本上能搜到的信号都是加密的，唯一一个没加密的一直对我进行arp欺骗……modrails很好很傻瓜，如果linux下的东西都能做成这样，我就可以偷懒不花时间去研究什么配置环境了。CentOS很不错，今天远程登陆一台基本全裸的机器装我们的production code，没有ftp，没有wget，连gcc和make都没有，scp过去的速度只有4k，我当时死的心都有了。结果折腾了两个小时之后发现CentOS也有自己的包管理工具yum，于是10+分钟装完基本设施。之后再和rails和mysql做斗争，发现每次装环境，都会有各种诡异的问题，不过在试错和google的帮助下啊，好歹把production的环境给搭完了。然后又花费2两个小时debug wml代码，结果发现wml页面里的元素都要包装在
<p>标签里，设置的content-type，mime-type其实都比较无所谓。</p>
<p>在两件事情里都在实践rails，不得不承认，rails和ruby就是生产力。前两年其实本以打算好好学一学用一用，结果还是败给惰性和工作繁忙的借口，好在现在再看，也不算太晚，何况，什么事情只要做了，都不算太晚。</p>
<p>rails会征服web dev领域的，或者说，他已经征服了，在rails和merb宣布合并之后，很多人对于ruby web dev框架技术路线的concern应该也会消除了，如果rails迁移到rack完成，rails又算进入一个新的时代吧。充足的插件，精炼的语法，性能也没问题，除了business critical的应用，其他的用rails应该都能轻松搞定了。对于从头学习web dev来说，rails应该是第一选择，是值得一年时间的技术投资了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2009/01/03/i-am-still-sharp/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
