<?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>Fwso.cn</title>
	<atom:link href="http://fwso.cn/feed/" rel="self" type="application/rss+xml" />
	<link>http://fwso.cn</link>
	<description>物竞天择, 适者生存</description>
	<lastBuildDate>Tue, 17 Aug 2010 04:17:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>[转载]中国程序员技术偏低的七大原因</title>
		<link>http://fwso.cn/james-tang-essay/%e4%b8%ad%e5%9b%bd%e7%a8%8b%e5%ba%8f%e5%91%98%e6%8a%80%e6%9c%af%e5%81%8f%e4%bd%8e%e7%9a%84%e4%b8%83%e5%a4%a7%e5%8e%9f%e5%9b%a0/</link>
		<comments>http://fwso.cn/james-tang-essay/%e4%b8%ad%e5%9b%bd%e7%a8%8b%e5%ba%8f%e5%91%98%e6%8a%80%e6%9c%af%e5%81%8f%e4%bd%8e%e7%9a%84%e4%b8%83%e5%a4%a7%e5%8e%9f%e5%9b%a0/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 03:53:59 +0000</pubDate>
		<dc:creator>James Tang</dc:creator>
				<category><![CDATA[Essay]]></category>
		<category><![CDATA[程序员]]></category>

		<guid isPermaLink="false">http://fwso.cn/?p=73</guid>
		<description><![CDATA[首先来说一个高级程序员并非靠自己读几本书写几万行代码就能练就的，我更关注于低层的环境，也就是程序员实实在在的工作环境。因为程序员的高低还得从实际的工作来衡量，而非其它。所以我想说的是，中国的软件公司的性质直接导致程序员的水平的高低。而我所说的软件公司，不是指某个或者某几个，而是指主流的软件公司，大众型的软件公司。所以我希望那些已经步入一个理想的公司的程序员理解我这篇文章的定位。 <a href="http://fwso.cn/james-tang-essay/%e4%b8%ad%e5%9b%bd%e7%a8%8b%e5%ba%8f%e5%91%98%e6%8a%80%e6%9c%af%e5%81%8f%e4%bd%8e%e7%9a%84%e4%b8%83%e5%a4%a7%e5%8e%9f%e5%9b%a0/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>首先来说一个高级程序员并非靠自己读几本书写几万行代码就能练就的，我更关注于低层的环境，也就是程序员实实在在的工作环境。因为程序员的高低还得从实际的工作来衡量，而非其它。所以我想说的是，中国的软件公司的性质直接导致程序员的水平的高低。而我所说的软件公司，不是指某个或者某几个，而是指主流的软件公司，大众型的软件公司。所以我希望那些已经步入一个理想的公司的程序员理解我这篇文章的定位。</p>
<h3>软件公司的无偿加班对程序员的影响：</h3>
<p>国内的软件公司中程序员是常常加班的，每日加，周未也常加。基于这种性质，出现了一种很莫名其妙的现象：每天程序员的实际下班时间总是要晚于规定下班时间，至于晚一个小时还是两个小时还是更多这就另说，总之，程序员这份工作，如果按时下班反而自己感觉自己像是做贼似的。表面上公司并没有强迫谁加班，但实际上在潜移默化中有一种威慑力，要求你要多为公司工作几个小时，而且表面上你所工作的这几个小时还是你自己愿意的。正因为是“自己愿意的”，所以公司更有理由认为是无偿的。</p>
<p>还有就是周未加班，一般周未加班是因为“忙”(关于这个带引号的“忙”，见“软件公司的‘忙’对程序员的影响”)。但周未加班一般是无偿的，至于法律所规定的那种“偿”就更尝不上了。不过一般公司是这样规定的：周未加班可以倒休。关于倒休，一般是周未的班真的加了，倒休却遥遥无期，原因很简单，公司“忙”嘛!</p>
<p><strong>这种情况对程序员的影响：消极、软弱无主见、虚伪、对前途渺茫。</strong></p>
<div style="background:#FFF5CC">
<h3>软件公司的“忙”对程序员的影响：</h3>
<p>软件公司的“忙”其实有时也是真忙，从原因来说，软件公司认为是程序员(其实也有其他员工，但本文不涉及讨论)造成的，程序员认为公司造成的。而根据 “一个巴掌拍不响”原则来看，应该是公司与程序员合作不协调出现的恶性循环造成的。深层原因大家自己研究去吧。不过从我这里的表象来看，这种“忙”有这么几点，这几点如果不代表大家的意见，大家可以补充：</p>
<ul>
<li>项目开发与计划脱节，表现为项目开发慢于计划。</li>
<li>突如其来的事件。</li>
<li>为某种说不清道不明的原因，像是作秀。</li>
<li>假忙。</li>
<li>真忙。</li>
</ul>
<p>上面说的第一种情况最常见，这涉及到软件工程的话题，其实也是软件公司做不大，程序员水平提不高的核心。而“软件公司做不大”已有前辈文章《浅谈:国内软件公司为何无法做大做强?》中说过了，而“程序员水平提不高”本文所言即是，所以这个原因大家读完这两篇自己体会吧。</p>
<p>上面说的第二种情况也常有，比如偶尔赶个标书，比如客户那里突然出现了BUG，急着去改等等。</p>
<p>第三种情况就很让人晕菜了，有点无病呻吟的感觉，比如不知道从哪里冒出一个会议，开到个七八点;</p>
<p>第四种情况很特别，也比较常见，大家同室坐、彼此各自心。一片共同耕作的美好景象，但果实见不到两颗豆呢。这可是大家齐心虚度时光。程序员可以拿出这个时间提高自己吗?当然不可以了，你表面上还是得干活呢。</p>
<p>第五种情况就不说了，因为这是正根。</p>
<p>总之软件公司是“忙”的，一般是以上三种“忙”，偶尔这三种都没有了，第四种就马上出来的。</p>
<p><strong>这种情况对程序员的影响：混乱无序、怨由心生、虚伪做作、学习时间少。</strong>
</div>
<div style="background:#FFA566">
<h3>软件公司的流程不规范对程序员的影响：</h3>
<p>无像样的需求、无像样的设计、没有测试、没有文档、没有维护(所谓维护也大都是客户测试出BUG来改一改)。</p>
<p>其实说到需求这一块也并非完全是软件公司的问题，大多数情况下，客户也是根据程序员直接上来编码后暴露出来的问题才渐渐明白自己的需求是什么的。</p>
<p>“什么都没有”的问题在于，什么也不清楚，如果写一堆以不变应万变的代码，第一，时间不允许，第二，难度太大。要是稀里糊涂去实现，扩展与维护性又差，整个一堆豆腐渣工程，总之是没法下手。长了一堆“打铁”技巧，神不像神，程序员不像程序员的。</p>
<p><strong>这种情况对程序员的影响：无规划性、代码质量低、手忙脚乱、技术永远停留在“打铁”水平。</strong>
</div>
<h3>软件公司对程序员员工的“全能型”要求对程序的影响：</h3>
<p>装系统、修打印机、写文档、编代码、见客户、扫地搬桌子、接网线，在国内软件公司中程序员做什么事都有可能。单单说技术方面，也是要求事事能做，看一下招聘要求就知道了。</p>
<p><strong>这种情况对程序员影响：术业无专攻</strong></p>
<h3>软件公司的工资拖欠对程序员的影响：</h3>
<p>很悲哀，这是存在的。我向来认为一个员工与公司合作的最底线应该是按时按量发工资。但很多公司打破了这个底线。一个朋友开玩笑地说过：“家庭有钱，谁干程序员呀!”这话虽只可信一半，但是从国内情况来看，程序员的生活质量还是不高的，工资的拖欠直接影响到程序员的心态，甚至影响到程序员的生活。</p>
<p><strong>这种情况对程序员影响：低调、迷茫、心态不稳、思想徘徊、生活困难。</strong></p>
<h3>软件公司对软件开发的要求对程序员的影响：</h3>
<p>软件公司对软件开发的要求一般是实现即可。如果说写一个和记事本一样的程序，公司感觉程序员应该在一天内搞定;如果写一个WPS，公司也就感觉程序员应该在两到三个月搞定。这不是浮夸，事实就是这样的。公司所着眼的点在于“就这么一点功能”，而非在于“怎么实现这‘一点’功能。</p>
<p><strong>这种情况对程序员的影响：开发难度大、维护难度大、压力大、难沟通。</strong></p>
<h3>软件公司的承诺对程序员的影响：</h3>
<p>国内软件公司一般实际行动能力差，但没理难说话，他们也知道自己没理，所以比较爱承诺，把实际问题抛向以后解决。然而承诺也只是口头的，有一点“我以人格担保”的意思。不过一般情况下，国内的程序员还是比较有忍耐能力的(从上文来看不忍耐还能混吗)，但公司层面的“人格”却是不可信，多承诺少兑现，员工面试时听到的说话到干了两年走了都没做到的事根本不少见。然而路遥马乏力，日久人变心，这样的结果往往是使公司与员工走入恶性循环。</p>
<p><strong>这种情况对程序员的影响：不满、被动、拿不起放不下、进退两难。</strong></p>
<h3>结论：</h3>
<p>消极、软弱无主见、虚伪、对前途渺茫、混乱无序、怨由心生、虚伪做作、学习时间少、无规划性、代码质量低、手忙脚乱、技术永远停留在“打铁”水平、术业无专攻、低调、迷茫、心态不稳、思想徘徊、生活困难、开发难度大、维护难度大、压力大、难沟通、不满、被动、拿不起放不下、进退两难。</p>
<p>上面这些短语概括了程序员的性格、心态、生活环境、工作环境等方面，它们就像毒素一样，日久能把一个健康的程序员毁掉。在这样的环境下，还问为什么你的技术这么低?太搞笑了。</p>
<p>原文出处：<a href="http://tech.it168.com/a2010/0524/889/000000889978.shtml">http://tech.it168.com/a2010/0524/889/000000889978.shtml</a></p>
]]></content:encoded>
			<wfw:commentRss>http://fwso.cn/james-tang-essay/%e4%b8%ad%e5%9b%bd%e7%a8%8b%e5%ba%8f%e5%91%98%e6%8a%80%e6%9c%af%e5%81%8f%e4%bd%8e%e7%9a%84%e4%b8%83%e5%a4%a7%e5%8e%9f%e5%9b%a0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>像成功者一样思考</title>
		<link>http://fwso.cn/notes/%e5%83%8f%e6%88%90%e5%8a%9f%e8%80%85%e4%b8%80%e6%a0%b7%e6%80%9d%e8%80%83/</link>
		<comments>http://fwso.cn/notes/%e5%83%8f%e6%88%90%e5%8a%9f%e8%80%85%e4%b8%80%e6%a0%b7%e6%80%9d%e8%80%83/#comments</comments>
		<pubDate>Sun, 15 Aug 2010 15:27:13 +0000</pubDate>
		<dc:creator>James Tang</dc:creator>
				<category><![CDATA[Notes]]></category>

		<guid isPermaLink="false">http://fwso.cn/?p=69</guid>
		<description><![CDATA[最近阅读了《像成功者一样思考》这本书，个人觉得这本书非常不错。并且摘录了部分经典语句，以便反复思考。 <a href="http://fwso.cn/notes/%e5%83%8f%e6%88%90%e5%8a%9f%e8%80%85%e4%b8%80%e6%a0%b7%e6%80%9d%e8%80%83/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>最近阅读了<a target="_blank" href="http://www.amazon.cn/mn/detailApp?asin=B002Q8GJS6&#038;tag=fwso-23&#038;camp=404&#038;creative=2024&#038;linkCode=as1&#038;creativeASIN=B002Q8GJS6&#038;adid=1T79Z7S2WC3SYGF0X7FP&#038;" target="_blank">像成功者一样思考</a>，个人觉得这本书非常不错。并且摘录了部分经典语句，以便反复思考。</p>
<p>1. 真诚面对自己、面对工作是一笔财富。记住，这笔财富用不着刻意保护。</p>
<p>2. 创新：关键在于留心，大脑和感官要随时对新鲜的刺激保持敏感。</p>
<p>3. 无论你的志趣是什么，都要学会巧妙地组合这样一来，就踏上了发明创造之路。胸怀高远的人要有丰富热烈的思绪和冲动，以使智力敏锐，所以，一定要让你的头脑尽量保持在最活跃的状态。</p>
<p>4. 在生活和工作中，要保持热情的团队精神你会得到很好甚至惊人的结果。</p>
<p>5. 有时，我们自己的心火几近熄灭，别人把它重新点燃。每个人都该心怀感恩，感激那个点燃我们心火的人。——阿尔伯特.史威泽</p>
<p>6. 一定要对新观念、新事物保持开放的心态。</p>
<p>7. 学习需要一点毅力，不过，学习的过程也可能像一次历险。它还可以为你踏上新的旅程作好准备。</p>
<p>8. 你没有看见别人干活，不等于人家在闲暇时或者私底下没有干活。</p>
<p>9. 思维敏捷、反应快是多年钻研、磨砺的结果。</p>
<p>10. 积蓄能量只能靠自己。</p>
<p>11. 你得夜以继日、心无旁骛才行。</p>
<p>12. 人可以通过意识的努力使生命超拔，这种能力是确定的，我不知道还有什么比这一点更激动人心。—— 梭罗</p>
<p>13. 伟大的构想终归是构想，除非你积极行动，把它落实。</p>
<p>14. 统帅可以吃败仗，却没有理由对此感到惊讶。</p>
<p>15. 不要贱卖自己。贱卖自己是很可悲的，想一想都可悲。</p>
<p>16. 不要觉得差不多就行了，无论付出还是索取，差不多都是不行的。</p>
<p>17. 争取完美，保持对奇迹的期待和好奇，你会发现，你已严阵以待，正在全神贯注地准备着赢得大满贯。</p>
<p>18. 理想主义只要不脱开理性，没什么不好。梦想家把世界推进到全新的广度和深度。</p>
<p>19. 积累经验，蓄养锐气，为自己打好基础，是为了干一番大事业。要知道，你随时可能置身伟大创想的最前沿。</p>
<p>20. 突破往往就在我们埋头干别的事时发生。</p>
<p>21. 勤奋是创意的吸铁石，懒散和吊儿郎当则会滑向自暴自弃。</p>
<p>22. 每个人都蕴藏着独一无二的潜质可供挖掘。</p>
<p>23. 不要随波逐流，请赶快上岸，行动起来吧！</p>
<p>24. 智慧是若干因素作用的结果：一是经验，一是知识.</p>
<p>25. 想当冠军就要不甘心碌碌无为。冠军胸怀高远，冠军目标坚定，冠军严于律己，冠军拼搏时气吞山河。</p>
<p>26. 与自己竞争，做最好的自己。</p>
<p>27. 害怕与众不同，就是害怕做最好的自己。</p>
<p>28. 生活是一门艺术，那就做一名艺术家，做最好的自己吧！</p>
<p>29. 要是你打算在这个世界上干出点名堂，一定要及时掌握全球的动态，一天也不能松懈。</p>
<p>30. 简短、直接、明白</p>
<p>31. 你的目光既要执著于理想，又专注于现实。</p>
<p>32. 不用太强调问题，要突出解决办法.</p>
<p>33. 成功的心态包括责任感和专注。</p>
<p>34. 要保持强劲的动力。</p>
<p>35. 从挫折和错误中汲取营养。</p>
<p>36. 宣传自己，要习惯于肯定自己</p>
<p>37. 要相信你的直觉</p>
<p>38. 事物的发展具有周期性，要能伸能缩，要坚定执著，要独树一帜，要保持积极的心态。</p>
<p>39. 要懂得理财。</p>
<p>40. 提前计划很重要，而保持灵活性、不受计划拘泥也很重要。</p>
<p>41. 记住，你要执著、顽强，对可能出现耽搁、可能走弯路作好心理准备。</p>
<p>42. 成功环环相扣</p>
<p>43. 所谓智慧，就是什么时候该等待，什么时候该前进。</p>
<p>44. 不要怕冒险</p>
<p>45. 要严肃地看待工作，不要严肃地看待自己。</p>
<p>46. 理想、情操在生意场上绝无位置只会耽误大家的时间。</p>
<p>47. 要有个人魅力。</p>
<p>48. 不要低估自己</p>
<p>49. 逆流而动</p>
<p>50. 要找到自己效率最高的工作方式。</p>
<p>51. 追求成功不总是一帆风顺的。</p>
<p>52. 激情和效率</p>
<p>53. 研读《<a target="_blank" title="孙子兵法" href="http://www.amazon.cn/mn/searchApp?source=fwso-23&amp;searchType=1&amp;keywords=孙子兵法">孙子兵法</a>》</p>
]]></content:encoded>
			<wfw:commentRss>http://fwso.cn/notes/%e5%83%8f%e6%88%90%e5%8a%9f%e8%80%85%e4%b8%80%e6%a0%b7%e6%80%9d%e8%80%83/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>onbeforeunload与onunload事件略谈</title>
		<link>http://fwso.cn/james-tang-essay/onbeforeunload%e4%b8%8eonunload%e4%ba%8b%e4%bb%b6%e7%95%a5%e8%b0%88/</link>
		<comments>http://fwso.cn/james-tang-essay/onbeforeunload%e4%b8%8eonunload%e4%ba%8b%e4%bb%b6%e7%95%a5%e8%b0%88/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 05:42:33 +0000</pubDate>
		<dc:creator>James Tang</dc:creator>
				<category><![CDATA[Essay]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[事件]]></category>

		<guid isPermaLink="false">http://fwso.cn/?p=62</guid>
		<description><![CDATA[window.onbeforeunload与window.onunload事件都是在用户离开页面时触发。比如在编辑Gmail邮件时，如果关闭确认消息；有些垃圾网站也用它来不断地弹出新网页，这算是这两个事件常用的情形之一。 <a href="http://fwso.cn/james-tang-essay/onbeforeunload%e4%b8%8eonunload%e4%ba%8b%e4%bb%b6%e7%95%a5%e8%b0%88/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p> window.onbeforeunload与window.onunload事件都是在用户离开页面时触发，但window.onbeforeunload是在window.onunload之前执行。下面是主流浏览器对这两个事件的支持情况。</p>
<table>
<tbody>
<tr>
<td> </td>
<td>Firefox3.6</td>
<td>Chrome5</td>
<td>IE8</td>
<td>Opera10.6</td>
</tr>
<tr>
<td>onbeforeunload</td>
<td>支持</td>
<td>支持</td>
<td>支持</td>
<td>不支持</td>
</tr>
<tr>
<td>onunload</td>
<td>支持</td>
<td>支持</td>
<td>支持</td>
<td>不支持</td>
</tr>
<tr>
<td>在onunload中执行window.open</td>
<td>支持</td>
<td>不支持</td>
<td>支持</td>
<td>不支持</td>
</tr>
</tbody>
</table>
<h3>基本用法</h3>
<p>下面是这两个事件的基本用法：</p>
<pre class="brush:javascript">window.onbeforeunload = function () {
	return "Something you want to say";
};

window.onunload = function () {
	//window.open("http://fwso.cn");
	//alert("Ok");
	//More Logic ...
};</pre>
<h3>触发条件</h3>
<table>
<tbody>
<tr>
<td> </td>
<td>onbeforeunload</td>
<td>onunload</td>
</tr>
<tr>
<td>关闭浏览器窗口</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>关闭页面标签窗口</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>输入新地址</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>从书签打开新页面</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>刷新/前进/后退</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>脚本重定向</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>Submit表单</td>
<td>+</td>
<td>+</td>
</tr>
</tbody>
</table>
<p>当以上事件发生时，浏览器会弹出以下或类型的窗口，如果确定，onunload事件被触发，如果取消则继续停留在当前页面。</p>
<p><a href="http://fwso.cn/wp-content/uploads/2010/08/confirm_leave_page.png"><img src="http://fwso.cn/wp-content/uploads/2010/08/confirm_leave_page.png" alt="" title="confirm_leave_page" width="438" height="161" class="alignnone size-full wp-image-63" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://fwso.cn/james-tang-essay/onbeforeunload%e4%b8%8eonunload%e4%ba%8b%e4%bb%b6%e7%95%a5%e8%b0%88/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>超级简单的网站:border-radius.com</title>
		<link>http://fwso.cn/james-tang-essay/%e8%b6%85%e7%ba%a7%e7%ae%80%e5%8d%95%e7%9a%84%e7%bd%91%e7%ab%99border-radius-com/</link>
		<comments>http://fwso.cn/james-tang-essay/%e8%b6%85%e7%ba%a7%e7%ae%80%e5%8d%95%e7%9a%84%e7%bd%91%e7%ab%99border-radius-com/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 03:48:23 +0000</pubDate>
		<dc:creator>James Tang</dc:creator>
				<category><![CDATA[Essay]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Fun]]></category>

		<guid isPermaLink="false">http://fwso.cn/?p=56</guid>
		<description><![CDATA[今天无意中发现一个非常简单的网站：border-radius.com，功能只有一个，就是生成CSS圆角样式。 <a href="http://fwso.cn/james-tang-essay/%e8%b6%85%e7%ba%a7%e7%ae%80%e5%8d%95%e7%9a%84%e7%bd%91%e7%ab%99border-radius-com/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>今天无意中发现一个非常简单的网站：<a href="http://border-radius.com">border-radius.com</a>，功能只有一个，就是生成CSS圆角样式。</p>
<p><a href="http://border-radius.com/" target="_blank"><img class="alignnone size-full wp-image-57" title="border-radius" src="http://fwso.cn/wp-content/uploads/2010/08/border-radius-e1281584825114.png" alt="" width="600" height="481" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://fwso.cn/james-tang-essay/%e8%b6%85%e7%ba%a7%e7%ae%80%e5%8d%95%e7%9a%84%e7%bd%91%e7%ab%99border-radius-com/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Flash图表生成控件:amCharts</title>
		<link>http://fwso.cn/james-tang-php/flash%e5%9b%be%e8%a1%a8%e7%94%9f%e6%88%90%e6%8e%a7%e4%bb%b6amcharts/</link>
		<comments>http://fwso.cn/james-tang-php/flash%e5%9b%be%e8%a1%a8%e7%94%9f%e6%88%90%e6%8e%a7%e4%bb%b6amcharts/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 03:27:01 +0000</pubDate>
		<dc:creator>James Tang</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[图表]]></category>

		<guid isPermaLink="false">http://fwso.cn/?p=43</guid>
		<description><![CDATA[amCharts 是我用过的最好用的免费Flash图表生成控件。amCharts可以生成2D/3D柱状图、2D/3D饼图、拆线图、面积图、雷达图、气泡图、股价图等。amCharts配置文件采用XML格式，数据文件可以使用CSV和XML格式，能够方便地与任何开发语言集成。
 <a href="http://fwso.cn/james-tang-php/flash%e5%9b%be%e8%a1%a8%e7%94%9f%e6%88%90%e6%8e%a7%e4%bb%b6amcharts/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.amcharts.com/">amCharts</a> 是我用过的最好用的免费Flash图表生成控件。amCharts可以生成2D/3D柱状图、2D/3D饼图、拆线图、面积图、雷达图、气泡图、股价图等。amCharts配置文件采用XML格式，数据文件可以使用CSV和XML格式，能够方便地与任何开发语言集成。</p>
<h3>2D/3D柱状图</h3>
<p><a href="http://fwso.cn/wp-content/uploads/2010/08/bar.png"><img class="alignnone size-medium wp-image-48" title="bar" src="http://fwso.cn/wp-content/uploads/2010/08/bar-300x196.png" alt="" width="300" height="196" /></a></p>
<p><a href="http://fwso.cn/wp-content/uploads/2010/08/bar-3d.png"><img class="alignnone size-medium wp-image-47" title="bar-3d" src="http://fwso.cn/wp-content/uploads/2010/08/bar-3d-300x196.png" alt="" width="300" height="196" /></a></p>
<h3>饼图</h3>
<p><a href="http://fwso.cn/wp-content/uploads/2010/08/pie.png"><img class="alignnone size-medium wp-image-51" title="pie" src="http://fwso.cn/wp-content/uploads/2010/08/pie-300x209.png" alt="" width="300" height="209" /></a></p>
<p><a href="http://fwso.cn/wp-content/uploads/2010/08/pie-3d.png"><img class="alignnone size-medium wp-image-50" title="pie-3d" src="http://fwso.cn/wp-content/uploads/2010/08/pie-3d-300x175.png" alt="" width="300" height="175" /></a></p>
<h3>折线/面积图</h3>
<p><a href="http://fwso.cn/wp-content/uploads/2010/08/line.png"><img class="alignnone size-medium wp-image-49" title="line" src="http://fwso.cn/wp-content/uploads/2010/08/line-300x187.png" alt="" width="300" height="187" /></a></p>
<p><a href="http://fwso.cn/wp-content/uploads/2010/08/area.png"><img class="alignnone size-medium wp-image-46" title="area" src="http://fwso.cn/wp-content/uploads/2010/08/area-300x200.png" alt="" width="300" height="200" /></a></p>
<h3>股价图</h3>
<p><a href="http://fwso.cn/wp-content/uploads/2010/08/stock.png"><img class="alignnone size-medium wp-image-45" title="stock" src="http://fwso.cn/wp-content/uploads/2010/08/stock-300x204.png" alt="" width="300" height="204" /></a></p>
<p><a href="http://fwso.cn/wp-content/uploads/2010/08/stock2.png"><img class="alignnone size-medium wp-image-52" title="stock2" src="http://fwso.cn/wp-content/uploads/2010/08/stock2-300x190.png" alt="" width="300" height="190" /></a></p>
<h3>一段PHP颜色随机生成程序</h3>
<p>在用程序生成Flash图表数据时，需要对每组数据生成不同的颜色，下面是一段随机生成颜色的程序。</p>
<pre class="brush:php">class Color {

    public static function getRandomHexColors ($counts)
    {

        $colors = array();

        while ($counts &gt; 0) {

            $color = self::getRandomHexColor();

            if (!in_array($color, $colors)) {
                $colors[] = $color;
            }

            $counts--;
        }

        return $colors;

    }

    public static function getRandomHexColor () {

        return sprintf('%02X%02X%02X', mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));

    }
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://fwso.cn/james-tang-php/flash%e5%9b%be%e8%a1%a8%e7%94%9f%e6%88%90%e6%8e%a7%e4%bb%b6amcharts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>简易PHP日志程序</title>
		<link>http://fwso.cn/james-tang-php/%e7%ae%80%e6%98%93php%e6%97%a5%e5%bf%97%e7%a8%8b%e5%ba%8f/</link>
		<comments>http://fwso.cn/james-tang-php/%e7%ae%80%e6%98%93php%e6%97%a5%e5%bf%97%e7%a8%8b%e5%ba%8f/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 05:08:53 +0000</pubDate>
		<dc:creator>James Tang</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Logger]]></category>
		<category><![CDATA[日志]]></category>

		<guid isPermaLink="false">http://fwso.cn/?p=29</guid>
		<description><![CDATA[为了方便调试PHP程序，在程序适当的位置加入日志是明智之举，而不是采用echo来跟踪程序。为此，我写了一个简易的日志程序，来满足我的基本需求，并在此分享，希望有人参与讨论。 <a href="http://fwso.cn/james-tang-php/%e7%ae%80%e6%98%93php%e6%97%a5%e5%bf%97%e7%a8%8b%e5%ba%8f/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>为了方便调试PHP程序，在程序适当的位置加入日志是明智之举，而不是采用echo来跟踪程序。为此，我写了一个简易的日志程序，来满足我的基本需求，程序如下：</p>
<p>EasyLogger类</p>
<pre class="brush:php">
/**
 * File: easylogger.php
 * Author: James Tang
 * Date: 2010-08-04 12:49:34
 * (C) 2010 James Tang<fwso@fwso.cn>.
 */
class EasyLogger{

    const LEVEL_INFO = 1;

    const LEVEL_DEBUG = 2;

    const LEVEL_WARN = 3;

    const LEVEL_ERROR = 4;

    private $logger_status;

    private $logger_level;

    private $filename;

    private $messages;

    public function __construct ($file)
    {
        $this->filename = $file;

        //Set default log level to 3 if SYSTEM_LOG_LEVEL is not defined.
        $this->logger_level = defined('SYSTEM_LOG_LEVEL') ? SYSTEM_LOG_LEVEL : 3;

        $this->logger_status = false;

        if (!file_exists($file)) {
            touch($file);
        }

        $this->messages = NULL;

        if ($this->logger_level <= self::LEVEL_ERROR &#038;&#038; file_exists($file) &#038;&#038; is_writable($file)) {
            $this->logger_status = true;
            $this->messages = array();
        }

    }

    public function info ($msg, $source = '', $line = 0)
    {
        $this->log(self::LEVEL_INFO, $msg, $source, $line);
    }

    public function debug ($msg, $source = '', $line = 0)
    {
        $this->log(self::LEVEL_DEBUG, $msg, $source, $line);
    }

    public function warn ($msg, $source = '', $line = 0)
    {
        $this->log(self::LEVEL_WARN, $msg, $source, $line);
    }

    public function error ($msg, $source = '', $line = 0)
    {
        $this->log(self::LEVEL_ERROR, $msg, $source, $line);
    }

    public function close ()
    {
        $this->save_log();
    }

    /**
     * Save log message to file
     *
     * @param integer $level, log level
     * @param string $msg, message
     * @param string $source_file, the source file name
     * @param integer $line, line number
     */
    public function log ($level, $msg, $source_file = '', $line = '')
    {

        if ($this->logger_status &#038;&#038; $level >= $this->logger_level) {

            $message = '';

            switch ($level) {
                case self::LEVEL_INFO:
                    $message .= '[INFO]';
                    break;

                case self::LEVEL_DEBUG:
                    $message .= '[DEBUG]';
                    break;

                case self::LEVEL_WARN:
                    $message .= '[WARN]';
                    break;

                case self::LEVEL_ERROR:
                    $message .= '[ERROR]';
                    break;

            }

            if (strlen($message) > 0) {
                $message .= '[' . date('Y-m-d H:i:s') . ']' . $msg;

                if (strlen($source_file) > 0) {
                    $message .= '[source file:' . $source_file;

                    if ($line > 0) {
                        $message .= ', at line ' . $line;
                    }

                    $message .= ']';
                }

                $message .= "\n";

                $this->messages[] = $message;
            }

        }

    }

    private function save_log ()
    {
        $hanlder = fopen($this->filename, 'a+');

        if ($hanlder &#038;&#038; $this->messages &#038;&#038; count($this->messages) > 0) {

            foreach ($this->messages as $msg) {
                fwrite($hanlder, $msg);
            }
        }

        fclose($hanlder);

    }

}
</pre>
<p>其中SYSTEM_LOG_LEVEL用于设定日志的记录级别(1,2,3,4), 即只有日志的级别>=SYSTEM_LOG_LEVEL才写入日志文件，否则忽略。如果SYSTEM_LOG_LEVEL>4(LEVEL_ERROR)将忽略所有日志。使用示例如下:</p>
<pre class="brush:php">
define('SYSTEM_LOG_LEVEL', 4);

require_once ('easylogger.php');

$logger = new EasyLogger('system.log');

$logger->info('Info message', __FILE__, __LINE__);
$logger->debug('Debug message', __FILE__, __LINE__);
$logger->warn('Warn message', __FILE__, __LINE__);
$logger->error('Error Message', __FILE__, __LINE__);

$logger->close();
echo 'Done';
</pre>
]]></content:encoded>
			<wfw:commentRss>http://fwso.cn/james-tang-php/%e7%ae%80%e6%98%93php%e6%97%a5%e5%bf%97%e7%a8%8b%e5%ba%8f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[转载]受益终身的故事</title>
		<link>http://fwso.cn/notes/%e8%bd%ac%e8%bd%bd%e5%8f%97%e7%9b%8a%e7%bb%88%e8%ba%ab%e7%9a%84%e6%95%85%e4%ba%8b/</link>
		<comments>http://fwso.cn/notes/%e8%bd%ac%e8%bd%bd%e5%8f%97%e7%9b%8a%e7%bb%88%e8%ba%ab%e7%9a%84%e6%95%85%e4%ba%8b/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 01:14:46 +0000</pubDate>
		<dc:creator>James Tang</dc:creator>
				<category><![CDATA[Notes]]></category>

		<guid isPermaLink="false">http://fwso.cn/?p=27</guid>
		<description><![CDATA[小故事，大道理，今天在QQ空间看到这几个故事，感觉很有意思，故转载于此，以时常回味。 <a href="http://fwso.cn/notes/%e8%bd%ac%e8%bd%bd%e5%8f%97%e7%9b%8a%e7%bb%88%e8%ba%ab%e7%9a%84%e6%95%85%e4%ba%8b/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>1、买烟</strong></p>
<p>甲去买烟，烟29元，但他没火柴，跟店员说：．“顺便送一盒火柴吧。”店员没给。</p>
<p>乙去买烟，烟29元，他也没火柴，跟店员说：“便宜一毛吧。”最后，他用这一毛买一盒火柴。</p>
<p>这是最简单的心理边际效应。第一种：店主认为自己在一个商品上赚钱了，另外一个没赚钱。赚钱感觉指数为1。第二种：店主认为两个商品都赚钱了，赚钱指数为2。当然心理倾向第二种了。同样，这种心理还表现在买一送一的花招上，顾客认为有一样东西不用付钱，就赚了，其实都是心理边际效应在作怪。</p>
<p>变换一种方式往往能起到意想不到的效果!通常很多事情换一种做法结果就不同了。人生道路上，改善心智模式和思维方式是很重要的。</p>
<p><strong>2.聪明的男孩</strong></p>
<p>有个小男孩，有一天妈妈带着他到杂货店去买东西，老板看到这个可爱的小孩，就打开一罐糖果，要小男孩自己拿一把糖果。但是这个男孩却没有任何动作。几次的邀请之后，老板亲自抓了一大把糖果放进他的口袋中。回到家中，母亲好奇地问小男孩，为什么没有自己去抓糖果而要老板抓呢?小男孩回答很妙：“因为我的手比较小呀!而老板的手比较大，所以他拿的一定比我拿的多很多!”</p>
<p>这是一个聪明的孩子，他知道自己的有限，而更重要的，他也知道别人比自己强。凡事不只靠自己的力量，学会适时地依靠他人，是一种谦卑，更是一种聪明。</p>
<p><strong>3.听的艺术</strong></p>
<p>美国知名主持人林克莱特有一天访问一名小朋友，问他说：“你长大后想要当做什么呀?”小朋友天真地回答：“嗯……我要当飞机的驾驶员!”林克莱特接着问：“如果有一天，你的飞机飞到太平洋上空所有引擎都熄火了，你会怎么办?”小朋友想了想：“我会先告诉坐在飞机上的人绑好安全带，然后我挂上我的降落伞跳出去。”当在场的观众笑得东倒西歪时，林克莱特继续注视着这孩子，想看他是不是自作聪明的家伙。没想到，接着孩子的两行热泪夺眶而出，这才使得林克莱特发觉这孩子的悲悯之心远非笔墨所能形容。于是林克莱特问他说：为什么你要这么做?”小孩的答案透露了这个孩子真挚的想法：“我要去拿燃料，我还要回来!!!”</p>
<p>这就是“听的艺术”。一是听话不要听一半。二是不要把自己的意思，投射到别人所说的话上头。要学会聆听，用心听，虚心听。</p>
<p><strong>4.两个和尚</strong></p>
<p>有两个和尚分别住在相邻的两座山上的庙里。两山之间有一条溪，两个和尚每天都会在同一时间下山去溪边挑水。不知不觉已经过了五年。 突然有一天，左边这座山的和尚没有下山挑水，右边那座山的和尚心想：“他大概睡过头了。”便不以为然。哪知第二天，左边这座山的和尚，还是没有下山挑水，第三天也一样，直到过了一个月，右边那座山的和尚想：“我的朋友可能生病了。”于是他便爬上了左边这座山去探望他的老朋友。当他看到他的老友正在庙前打太极拳时。他十分好奇地问：“你已经一个月没有下山挑水了，难道你可以不喝水吗?”左边这座山的和尚指着一口井说：“这五年来，我每天做完功课后，都会抽空挖这口井。如今，终于让我挖出水，我就不必再下山挑水，我可以有更多时间练我喜欢的太极拳了。”</p>
<p>我们常常会忘记把握下班后的时间，挖一口属于自己的井，培养自己另一方面的实力。这样在未来当我们年纪大了，我们还依然会有水喝，而且还能喝得很悠闲。</p>
<p><strong>5.学会舍弃</strong></p>
<p>有两个人相约到山上去寻找精美的石头，甲背了满满的一筐，乙的筐里只有一个他认为是最精美的石头。甲就笑乙：“你为什么只挑一个啊?”乙说：“漂亮的石头虽然多，但我只选一个最精美的就够了。”甲笑而不语，下山的路上，甲感到负担越来越重，最后不得已不断地从一筐的石头中挑一个最差的扔下，到下山的时候他的筐里结果只剩下一个石头!</p>
<p>人生中会有许多的东西，值得留恋，有的时候你应该学会去放弃。</p>
<p><strong>6.把心径扩大1毫米</strong></p>
<p>有一家牙膏厂，产品优良，包装精美，受到顾客的喜爱，营业额连续10年递增，每年的增长率在10％～20％。可到了第11年，业绩停滞下来，以后两年也如此。公司经理召开高级会议，商讨对策。会议中，公司总裁许诺说：谁能想出解决问题的办法，让公司的业绩增长，重奖10万元。有位年轻经理站起来，递给总裁一张纸条，总裁看完后，马上签了一张10万元的支票给了这位经理。 那张纸条上写着：将现在牙膏开口扩大1毫米。消费者每天早晨挤出同样长度的牙膏，开口扩大了l毫米，每个消费者就多用1毫米宽的牙膏，每天的消费量将多出多少呢!公司立即更改包装。第14年，公司的营业额增加了32％。</p>
<p>面对生活中的变化，我们常常习惯过去的思维方法。其实只要你把心径扩大1毫米，你就会看到生活中的变化都有它积极的一面，充满了机遇和挑战</p>
]]></content:encoded>
			<wfw:commentRss>http://fwso.cn/notes/%e8%bd%ac%e8%bd%bd%e5%8f%97%e7%9b%8a%e7%bb%88%e8%ba%ab%e7%9a%84%e6%95%85%e4%ba%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>初识Makefile</title>
		<link>http://fwso.cn/notes/%e5%88%9d%e8%af%86makefile/</link>
		<comments>http://fwso.cn/notes/%e5%88%9d%e8%af%86makefile/#comments</comments>
		<pubDate>Tue, 03 Aug 2010 07:34:41 +0000</pubDate>
		<dc:creator>James Tang</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Notes]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Makefile]]></category>

		<guid isPermaLink="false">http://fwso.cn/?p=25</guid>
		<description><![CDATA[其实很早以前就知道Makefile, 并且很多时候在Linux下安装程序时也间接地用到了它，不过今天是第一次学习使用。 <a href="http://fwso.cn/notes/%e5%88%9d%e8%af%86makefile/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>继续学习<a title="Advanced Linux Programming" href="http://www.advancedlinuxprogramming.com/alp-folder">Advanced Linux Programming</a>.</p>
<p>Java程序员应该很熟悉Ant这个构建工具，Makefile是类似的自动化构建工具，很多C/C++程序都是用Makefile来构建的。<br />
同样使用《<a title="安装C/C++编译环境" href="http://fwso.cn/notes/%E5%AE%89%E8%A3%85cc%E7%BC%96%E8%AF%91%E7%8E%AF%E5%A2%83/" target="_blank">安装C/C++编译环境</a>》的示例程序，初步了解Makefile的使用.</p>
<p>下面的Makefile将自动完成编译、连接和工作。</p>
<pre class="brush:plain">
reciprocal: main.o reciprocal.o
	g++ $(CFLAGS) -o reciprocal main.o reciprocal.o

main.o: main.c reciprocal.hpp
	gcc $(CFLAGS) -c main.c

reciprocal.o: reciprocal.cpp reciprocal.hpp
	g++ $(CFLAGS) -c reciprocal.cpp

clean:
	rm -f *.o reciprocal
</pre>
<p>冒号左边是目标(target)，与Ant中的target类似，冒号右边是该目标的依赖。第一目标下面是该目标的执行规则，规则左边必须有Tab空格。<br />
其中的$(CFLAGS)是make变量，可以在Makefile文件中定义，也可以在命令行一定义。</p>
<p>执行make命令将自动构建该程序：</p>
<pre class="brush:plain">
make CFLAGS=-o2
</pre>
<p>定义CFLAGS, -o2为编译优化程序的参数：</p>
<pre class="brush:plain">
make
</pre>
]]></content:encoded>
			<wfw:commentRss>http://fwso.cn/notes/%e5%88%9d%e8%af%86makefile/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>安装C/C++编译环境</title>
		<link>http://fwso.cn/notes/%e5%ae%89%e8%a3%85cc%e7%bc%96%e8%af%91%e7%8e%af%e5%a2%83/</link>
		<comments>http://fwso.cn/notes/%e5%ae%89%e8%a3%85cc%e7%bc%96%e8%af%91%e7%8e%af%e5%a2%83/#comments</comments>
		<pubDate>Tue, 03 Aug 2010 06:35:28 +0000</pubDate>
		<dc:creator>James Tang</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Notes]]></category>
		<category><![CDATA[C]]></category>

		<guid isPermaLink="false">http://fwso.cn/?p=13</guid>
		<description><![CDATA[C/C++编译环境的安装虽然很简单，但还是记录于此，以便日后参考，也希望对初学者有所帮助。 <a href="http://fwso.cn/notes/%e5%ae%89%e8%a3%85cc%e7%bc%96%e8%af%91%e7%8e%af%e5%a2%83/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>操作系统CentOS 5</p>
<p>如果gcc命令不存在，直接用以下命令安装:</p>
<pre class="brush:plain">
yum install gcc
</pre>
<p>但这默认只安装C语言编译器，如果需要C++编辑器,还需要安装gcc-c++,执行以下命令即可:</p>
<pre class="brush:plain">
yum install gcc-c++
</pre>
<h3>测试编译环境</h3>
<p>下面程序来自《<a href="http://www.advancedlinuxprogramming.com/alp-folder" title="Advanced Linux Programming">Advanced Linux Programming</a>》.</p>
<p>主程序main.c</p>
<pre class="brush:c">
/**
 * File: main.c
 */
#include &lt;stdio.h&gt;
#include "reciprocal.hpp"

int main(int argc, char** argv)
{
	int i;
	i = atoi (argv[1]);
	printf("The reciprocal of %d is %g\n", i, reciprocal(i));
	return 0;
}
</pre>
<p>C++程序reciprocal.cpp</p>
<pre class="brush:cpp">
/**
 * File: reciprocal.cpp
 */
#include &lt;cassert&gt;
#include "reciprocal.hpp"

double reciprocal (int i) {
	assert(i != 0);
	return 1.0/i;
}
</pre>
<p>C++头文件reciprocal.hpp</p>
<pre class="brush:cpp">
/**
 * File: reciprocal.hpp
 */
#ifdef __cplusplus
extern "C" {
#endif

	extern double reciprocal (int i);

#ifdef __cplusplus
}
#endif
</pre>
<p>分别执行以下命令:</p>
<p>1. 将main.c编译为目标程序</p>
<pre class="brush:plain">
gcc -c main.c
</pre>
<p>2. 将reciprocal.cpp编译成目标程序</p>
<pre class="brush:plain">
g++ -c reciprocal.cpp
</pre>
<p>3. 连接目标程序</p>
<pre class="brush:plain">
g++ -o reciprocal main.o reciprocal.o
</pre>
<p>4.  运行reciprocal</p>
<pre class="brush:plain">
./reciprocal 2
</pre>
<p>应该输出：The reciprocal of 2 is 0.5.</p>
<p>完成</p>
]]></content:encoded>
			<wfw:commentRss>http://fwso.cn/notes/%e5%ae%89%e8%a3%85cc%e7%bc%96%e8%af%91%e7%8e%af%e5%a2%83/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Measure Twice, Cut Once</title>
		<link>http://fwso.cn/notes/measure-twice-cut-once/</link>
		<comments>http://fwso.cn/notes/measure-twice-cut-once/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 03:13:54 +0000</pubDate>
		<dc:creator>James Tang</dc:creator>
				<category><![CDATA[Notes]]></category>

		<guid isPermaLink="false">http://fwso.cn/?p=9</guid>
		<description><![CDATA[Code Complete这本书很有名，可是一直没有时间阅读，今天读了一点，受益匪浅，更为我目前所在项目的开发过程感到羞耻。 <a href="http://fwso.cn/notes/measure-twice-cut-once/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>这是Code Complete一个章节的标题，完整的标题是Measure Twice, Cut Once: Upstream Prerequisites，其一语道出了软件上流设计的重要性。而在现实开发中，很多人总是有意无意的忽略了这一些，让整个开发过程变成：简单需求+编码+简单测试。而这样的后果就是整个系统没有一个整体的架构，代码杂乱无章，程序错漏百出，扩展起来比登天还难&#8230;</p>
<blockquote><p>A good project planner clears rishs out of the way as early as possible so that the bulk of the project can proceed as smoothly as possible.</p></blockquote>
<p>不幸的是，在很多项目中并没有这样的一位策划者，不仅不能尽可能早地清除风险。</p>
]]></content:encoded>
			<wfw:commentRss>http://fwso.cn/notes/measure-twice-cut-once/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
