<?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>ROY&#039;S BLOG</title>
	<atom:link href="http://roygu.com/feed" rel="self" type="application/rss+xml" />
	<link>http://roygu.com</link>
	<description>偏执狂：学习不分春夏秋冬，贵在坚持；奋斗可分鼠雀鲲鹏，人生贵搏。</description>
	<lastBuildDate>Fri, 13 Jan 2012 10:23:40 +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>in PHP what does it mean by a function being binary-safe ?</title>
		<link>http://roygu.com/2012/01/php/n-php-what-does-it-mean-by-a-function-being-binary-safe.html</link>
		<comments>http://roygu.com/2012/01/php/n-php-what-does-it-mean-by-a-function-being-binary-safe.html#comments</comments>
		<pubDate>Fri, 13 Jan 2012 10:17:10 +0000</pubDate>
		<dc:creator>校长</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[binary safe]]></category>

		<guid isPermaLink="false">http://roygu.com/?p=1536</guid>
		<description><![CDATA[It means the function will work correctly when you pass it arbitrary binary data (i.e. strings containing non-ASCII bytes and/or null bytes). For example, a non-binary-safe function might be based on a C function which expects null-terminated strings, so if the string contains a null character, the function would ignore anything after it. This is [...]]]></description>
			<content:encoded><![CDATA[<p>It means the function will work correctly when you pass it arbitrary binary data (i.e. strings containing non-ASCII bytes and/or null bytes).</p>
<p>For example, a non-binary-safe function might be based on a C function which expects null-terminated strings, so if the string contains a null character, the function would ignore anything after it.</p>
<p>This is relevant because PHP does not cleanly separate string and binary data.</p>
<p>For instance, if PHP&#8217;s <code>strlen</code> function worked like C standard library <code>strlen</code>, the result here would be wrong:</p>
<pre>如果函数是binary safe的话，我们将得到7；如果函数是非binary safe的话，我们将得到3 * strlen是binary safe的，所以实际上以下的运行结果是"7"</pre>
<pre class="src">
$str = "abc\x00abc";
echo strlen($str); //gives 7, not 3!
</pre>
]]></content:encoded>
			<wfw:commentRss>http://roygu.com/2012/01/php/n-php-what-does-it-mean-by-a-function-being-binary-safe.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Manage Subscriptions</title>
		<link>http://roygu.com/2011/11/solarphp/manage-subscriptions.html</link>
		<comments>http://roygu.com/2011/11/solarphp/manage-subscriptions.html#comments</comments>
		<pubDate>Tue, 01 Nov 2011 01:19:18 +0000</pubDate>
		<dc:creator>校长</dc:creator>
				<category><![CDATA[solarphp]]></category>

		<guid isPermaLink="false">http://roygu.com/2011/11/solarphp/manage-subscriptions.html</guid>
		<description><![CDATA[[wpmlmanagement]]]></description>
			<content:encoded><![CDATA[<p>[wpmlmanagement]</p>
]]></content:encoded>
			<wfw:commentRss>http://roygu.com/2011/11/solarphp/manage-subscriptions.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[转]无密码卸载Symantec Endpoint Protection 11</title>
		<link>http://roygu.com/2011/10/other/%e8%bd%ac%e6%97%a0%e5%af%86%e7%a0%81%e5%8d%b8%e8%bd%bdsymantec-endpoint-protection-11.html</link>
		<comments>http://roygu.com/2011/10/other/%e8%bd%ac%e6%97%a0%e5%af%86%e7%a0%81%e5%8d%b8%e8%bd%bdsymantec-endpoint-protection-11.html#comments</comments>
		<pubDate>Mon, 31 Oct 2011 00:32:39 +0000</pubDate>
		<dc:creator>校长</dc:creator>
				<category><![CDATA[杂谈]]></category>
		<category><![CDATA[symantec]]></category>
		<category><![CDATA[uninstall]]></category>
		<category><![CDATA[卸载]]></category>
		<category><![CDATA[密码]]></category>
		<category><![CDATA[赛门铁克]]></category>

		<guid isPermaLink="false">http://roygu.com/?p=1530</guid>
		<description><![CDATA[不需要密码卸载Symantec Endpoint Protection 11的步骤: 1. 点击“开始”按钮 -&#62; 运行 (或直接： Window徽标键 + R) 2. 输入 smc -stop. 如果要密码，则打开注册表(Window徽标键 + R; 输入 regedit; 敲回车) ，然后找到 HKEY_LOCAL_MACHINE\SOFTWARE\Symantec\Symantec Endpoint Protection\SMC，在右边删除类似于 smc_exit_test 的键，然后再在运行里输入 smc -stop 。 3. 现在继续到 HKEY_LOCAL_MACHINE\SOFTWARE\Symantec\Symantec Endpoint Protection\SMC.，在右边删除类似于 smcinstdata 的键。 4. 现在你可以到 添加删除程序 里无需密码就可以卸载 SEP 11。]]></description>
			<content:encoded><![CDATA[<p>不需要密码卸载Symantec Endpoint Protection 11的步骤:<br />
1. 点击“开始”按钮 -&gt; 运行 (或直接： Window徽标键 + R)<br />
2. 输入 smc -stop. 如果要密码，则打开注册表(Window徽标键 + R; 输入 regedit; 敲回车) ，然后找到 HKEY_LOCAL_MACHINE\SOFTWARE\Symantec\Symantec Endpoint Protection\SMC，在右边删除类似于 smc_exit_test 的键，然后再在运行里输入 smc -stop 。<br />
3. 现在继续到 HKEY_LOCAL_MACHINE\SOFTWARE\Symantec\Symantec Endpoint Protection\SMC.，在右边删除类似于 smcinstdata 的键。<br />
4. 现在你可以到 添加删除程序 里无需密码就可以卸载 SEP 11。</p>
]]></content:encoded>
			<wfw:commentRss>http://roygu.com/2011/10/other/%e8%bd%ac%e6%97%a0%e5%af%86%e7%a0%81%e5%8d%b8%e8%bd%bdsymantec-endpoint-protection-11.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>成功要做到的21件事</title>
		<link>http://roygu.com/2011/10/other/%e6%88%90%e5%8a%9f%e8%a6%81%e5%81%9a%e5%88%b0%e7%9a%8421%e4%bb%b6%e4%ba%8b.html</link>
		<comments>http://roygu.com/2011/10/other/%e6%88%90%e5%8a%9f%e8%a6%81%e5%81%9a%e5%88%b0%e7%9a%8421%e4%bb%b6%e4%ba%8b.html#comments</comments>
		<pubDate>Fri, 21 Oct 2011 09:17:37 +0000</pubDate>
		<dc:creator>校长</dc:creator>
				<category><![CDATA[杂谈]]></category>

		<guid isPermaLink="false">http://roygu.com/?p=1528</guid>
		<description><![CDATA[Fab.com是一家专注于创意产品闪购的创业公司，有很多关于它的报道。网站上线不到4个月，用户数已达75万，员工数80，日销售额也已达10万美元。我们可以从创立Fab.com的过程中学到的21件事： 1. 全心全意做好一件事情 2. 要勇于对其它想法说“不” 3. 一切以产品为中心 4. 保持产品的新鲜性和创新性 5. 产品要有启发意义 6. 全心全意让消费者满意 7. 服务比销售更重要 8. 敢于犯错 9. 犯了错误要及时纠正，善于在失败中吸取教训 10.要为你所犯的错误承担责任 11.努力使消费者喜欢和你们的公司打交道 12.能为遇到挑战而感到庆幸 13.不能空谈大道理，关键在于执行力 14.尽量结识更多的人，知己知彼，百战不殆 15.善于从全局的角度思考问题 16.保证你团队里的成员每天都能学到新的东西，每天都在成长 17.积极为公司引进新人才，帮助公司更快发展 18.人尽其才，让每个人都能做最适合自己的工作 19.富有远见，善于抓住机遇，成功往往就在一念之间 20.多说“你好” “谢谢” 21.保持一颗快乐的心境，生命太短暂，快乐是一天，不快乐也是一天]]></description>
			<content:encoded><![CDATA[<p><em>Fab.com是一家专注于创意产品闪购的创业公司，有很多关于它的报道。网站上线不到4个月，用户数已达75万，员工数80，日销售额也已达10万美元。我们可以从创立Fab.com的过程中学到的21件事：</em></p>
<p>1. 全心全意做好一件事情<br />
2. 要勇于对其它想法说“不”<br />
3. 一切以产品为中心<br />
4. 保持产品的新鲜性和创新性<br />
5. 产品要有启发意义<br />
6. 全心全意让消费者满意<br />
7. 服务比销售更重要<br />
8. 敢于犯错<br />
9. 犯了错误要及时纠正，善于在失败中吸取教训<br />
10.要为你所犯的错误承担责任<br />
11.努力使消费者喜欢和你们的公司打交道<br />
12.能为遇到挑战而感到庆幸<br />
13.不能空谈大道理，关键在于执行力<br />
14.尽量结识更多的人，知己知彼，百战不殆<br />
15.善于从全局的角度思考问题<br />
16.保证你团队里的成员每天都能学到新的东西，每天都在成长<br />
17.积极为公司引进新人才，帮助公司更快发展<br />
18.人尽其才，让每个人都能做最适合自己的工作<br />
19.富有远见，善于抓住机遇，成功往往就在一念之间<br />
20.多说“你好” “谢谢”<br />
21.保持一颗快乐的心境，生命太短暂，快乐是一天，不快乐也是一天</p>
]]></content:encoded>
			<wfw:commentRss>http://roygu.com/2011/10/other/%e6%88%90%e5%8a%9f%e8%a6%81%e5%81%9a%e5%88%b0%e7%9a%8421%e4%bb%b6%e4%ba%8b.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[转] 傅盛是3Q大战幕后黑手：马化腾被利用了</title>
		<link>http://roygu.com/2011/10/other/%e8%bd%ac-%e7%9b%9b%e6%98%af3q%e5%a4%a7%e6%88%98%e5%b9%95%e5%90%8e%e9%bb%91%e6%89%8b%ef%bc%9a%e9%a9%ac%e5%8c%96%e8%85%be%e8%a2%ab%e5%88%a9%e7%94%a8%e4%ba%86.html</link>
		<comments>http://roygu.com/2011/10/other/%e8%bd%ac-%e7%9b%9b%e6%98%af3q%e5%a4%a7%e6%88%98%e5%b9%95%e5%90%8e%e9%bb%91%e6%89%8b%ef%bc%9a%e9%a9%ac%e5%8c%96%e8%85%be%e8%a2%ab%e5%88%a9%e7%94%a8%e4%ba%86.html#comments</comments>
		<pubDate>Fri, 21 Oct 2011 08:48:09 +0000</pubDate>
		<dc:creator>校长</dc:creator>
				<category><![CDATA[杂谈]]></category>

		<guid isPermaLink="false">http://roygu.com/?p=1526</guid>
		<description><![CDATA[我是360的首席架构师李钊，傅盛的自述里谈到了我，涉及一些往事，我来说几句吧，关于傅盛、周鸿祎、雷军，还有马化腾之间那些不为人知的事情。 　　3Q大战的幕后总导演 先扯远点，抖个包袱吧。3Q大战，大家只看见周鸿祎和马化腾你争我斗，却不知道幕后的惊心动魄，波诡云谲。先是腾讯趁着节假日大规模强行安装 QQ电脑管家，一夜间覆盖超过50%，其意图无疑是先装下去，然后用安全软件不兼容的惯例，一举干掉360。被这么折腾了几次后，周鸿祎抛出扣扣保镖，本 意是以战逼和，告诉马化腾“我也有杀手锏”，不要逼人太甚。没想到马化腾反应过度，竟然祭出“二选一”的昏招。 事后我们内部分析，马化腾应该是被人利用了。当时网上出现了“360要做IM”的谣言，还有几篇360搞什么“盗梦盒子”、要扒QQ好友关系的 文章，来证明360推出扣扣保镖是要对腾讯做致命一击，目的是推出360自己的IM，等等。这种抹黑文章我们见多了，就没太当回事。问题是马化腾却信了! 所以才有了“二选一”。 3Q之后我们复盘，发现马化腾相信这些谣言，不是没有原因。那几篇文章不但煞有介事地说360要推“360安全聊士”，而且故意“泄露”了大量 截图、界面、PPT和产品文档，甚至还有内部开会讨论的投影照片!网上还出现一个假冒360的网站，说是即将推出名叫coco360的IM，敬请广大用户 期待，等等。 这么全面的“泄密”，只要冷静点分析，当然就会发现破绽，问题是当时马化腾已经不冷静了，何况提供这些材料给他的，是他的一个“好朋友”，业内某著名大佬。跟这位幕后总导演比，周鸿祎和马化腾都还像是小朋友。他们之间的这出“三国杀”，我在后面再继续讲。 还有关于“盗梦盒子”的文章里，有的充满了只有安全行业技术人员才用的专业词汇。再联系到这一轮造假的“专业”与逼真程度，幕后黑手是谁就是明摆着的了，只能是某家以阴柔著称、以小动作见长的老牌杀毒厂商。 3Q打完，3和Q两败俱伤，只有金山的安装量因为腾讯的大力推荐而迅猛增长。这还不够，在”二选一”后360最困难的时候，傅盛出面，联合百度搜狗遨游开发布会，宣布和360不兼容，意图腹背夹击，让360彻底完蛋。 一个到处以“360之父”自诩的人，一个口口声声”热爱360、把360当成自己生命”的人，这么急吼吼地给腾讯当打手，挖空心思就想毁掉360，是为了什么? 我来说说前因后果。 　　“傅盛膨胀到那种地步，周鸿祎负有很大责任” 傅盛是个很聪明的人，口才好，反应快，善雄辩，很多时候我们俩争论，我明明知道他讲的不对，但就是说不过他，而这种类型正好是周鸿祎喜欢的。 周鸿祎有个毛病是爱才如命，之所以说是毛病，是因为周鸿祎太爱走极端，缺乏分寸感，好好的”爱才”到了他这里，往往会变成”溺爱”。他在外面跟 人聊天，听到一点有创意的建议，马上就会眼睛发亮，一拿到手机号，转头就让人事部去挖，没隔两天又开始不停地发短信追：“XXX怎么还没入职?”。现在公 司很多产品、技术骨干都是他用这种方式挖来的，当然看错人的比例也不低。 有一个技术骨干，名字不说了，很聪明，但是没自制力，经常通宵看小说，上班睡觉，几个月不出活，自己都觉得不好意思，就辞职了。没多久老周就又 开始想他了，老是念叨“XX还是很有水平的”，又把他找了回来，但是事与愿违，这老兄老毛病改不了，最后搞得周鸿祎完全没脾气。对有才华的员工容忍度太 高，无原则溺爱，这是周鸿祎用人的一大弊病。 360开始的时候成长很快，周鸿祎一高兴，夸奖时少不了说些过头话，平时经常给傅盛做单独辅导，手把手地教他做产品;接受采访时，也经常让傅盛 出面，以至于有记者以为周鸿祎要让傅盛当接班人，其实老周自己当时才30多岁;然后又不顾内部很多人的反对，非要任命傅盛做360部门的总经理，其实当时 傅盛的问题已经暴露了不少，老齐已经明确提出要有限制地使用了。傅盛走后老齐曾总结过：“傅盛膨胀到那种地步，周鸿祎也负有很大责任”，公司里很多人都是 认同的。 　　周鸿祎挖来的人，傅盛一律不要 傅盛本来就自视极高，随着360的用户数增长，他的变化越来越大。 开会时，他经常整个人往后靠着，眼睛看着天花板，下巴对着同事，动不动打断别人的发言。 其他人讲话时，傅盛常常自顾自玩手机，脚差不多能搁到桌子上，再时不时点评几句。 他要求把公司其它部门的一些人尽量开掉，或者把他负责的360部门分拆出来，理由是不能让其它部门的人占他的便宜。 他的部门只用自己招的人，人事部门招来的，或者老板挖来的，傅盛一律不要。就算勉强要了，也会想办法挤走。 当时的360就产品而言还很粗糙，傅盛点子多，但是对产品细节的把握比较弱。老周亲自跑到广州，把向明和欧胜请来，想让他们帮傅盛打磨产品。傅 盛先是不要，后来又打发他们去干些无关紧要的活。其实向明和欧胜的产品能力在很多地方比傅盛强，一些很成功的产品，譬如开机小助手，就是他们做的，现在他 俩都在负责核心业务。 技术上，虽然周鸿祎在雅虎的时候就已经有做安全的想法，还跟杨致远建议过，但是当时的360在安全技术方面还是积累少，老是被瑞星嘲笑，说 360杀流氓软件只能按文件名来查，等等。傅盛是做产品出身，技术上主要依赖徐鸣，徐鸣对安全也不在行。周鸿祎很着急，到处打听安全圈有什么牛人，终于找 来了一个高手，“狙剑”的作者，叫徐贵斌。 徐贵斌一来，就觉得360部门内的气氛不太正常：刚有了千把万用户量，就已经开口闭口大谈成功经验了，部门里面搞得像一个小团伙，还搞个人崇 拜，对竞争对手也是认为不堪一击。徐贵斌觉得有问题，就写了封邮件，主要提了两点：一，360的成功主要在于市场和宣传，能一炮打响有很大的偶然性，纯粹 是因为杀流氓软件的需求太大，其它公司又不敢杀，才给了360一个机会;二，当时360的技术其实远不如瑞星金山，如果不能迅速引进大批人才，尽快补上技 术短板，360很可能就像超级兔子和优化大师那样，充其量就是个工具软件，冲到几千万的安装量就到头了。 周鸿祎本来就是个悲观主义者，被这盆冷水浇了一下，危机感更强了。但是徐贵斌却因为这封邮件得罪了傅盛和徐鸣，从那以后傅盛就一直想各种办法轰他走，最后还是老周把他给留下的。傅盛走后，老周让徐贵斌领导查杀部门，确实把360的查杀能力提升了一个大台阶。 开始的时候，老周一度天真地以为傅盛徐鸣不要HR招的人，是因为HR在技术能力判断上不行，于是安排我到他们部门帮助招聘和培训。有些人招进来 了，傅和徐却顶着不要的，只好交给我来带，一共四个，现在都是公司很重要的骨干。傅盛说我是来建秘密团队的，纯粹是胡扯。反倒是傅盛一再跟老周打小报告， 说李钊老了，不行了。 后来徐鸣对我说，我是被派来对付他和傅盛的。我听了很生气，就说：“你这是放屁，我本来就不愿意掺乎你们这事儿。老周认为我管不了大团队，才下放到你们这里来帮忙的。” 还有个人，原来雅虎中国的CTO谭晓生，后来去了MySpace当COO，09年到了360。有次聊起来，晓生说他挺后悔晚到一年的，少拿了不 少股票。原来老周08年就想挖他过来，晓生找徐鸣打听情况，问完后觉得老周很不好，这么干公司怎么会有前途?结果傅盛离开后公司发展更快了，晓生还是来了 360，进来后发现完全不像傅盛徐鸣他们说的那样，觉得这俩人很过分，说到底就是怕能人进多了，影响他们俩的地位。 　　“让傅盛做部门总经理 ，他就会听公司的话了??” 对傅盛阻挠引进更多高水平的人，老齐是很有看法的，我记得他说过：“傅盛快成一颗毒瘤了，让公司政令不通，策略执行不下去。这个瘤子不摘掉早晚会扩散，最后把整个公司都赔进去。”当时我还觉得言重了，回头看，在用人上还是老齐比老周有先见之明。 [...]]]></description>
			<content:encoded><![CDATA[<p>我是360的首席架构师李钊，傅盛的自述里谈到了我，涉及一些往事，我来说几句吧，关于傅盛、周鸿祎、雷军，还有马化腾之间那些不为人知的事情。</p>
<p><strong>　　3Q大战的幕后总导演</strong></p>
<p>先扯远点，抖个包袱吧。3Q大战，大家只看见周鸿祎和马化腾你争我斗，却不知道幕后的惊心动魄，波诡云谲。先是腾讯趁着节假日大规模强行安装 QQ电脑管家，一夜间覆盖超过50%，其意图无疑是先装下去，然后用安全软件不兼容的惯例，一举干掉360。被这么折腾了几次后，周鸿祎抛出扣扣保镖，本 意是以战逼和，告诉马化腾“我也有杀手锏”，不要逼人太甚。没想到马化腾反应过度，竟然祭出“二选一”的昏招。</p>
<p>事后我们内部分析，马化腾应该是被人利用了。当时网上出现了“360要做IM”的谣言，还有几篇360搞什么“盗梦盒子”、要扒QQ好友关系的 文章，来证明360推出扣扣保镖是要对腾讯做致命一击，目的是推出360自己的IM，等等。这种抹黑文章我们见多了，就没太当回事。问题是马化腾却信了! 所以才有了“二选一”。</p>
<p>3Q之后我们复盘，发现马化腾相信这些谣言，不是没有原因。那几篇文章不但煞有介事地说360要推“360安全聊士”，而且故意“泄露”了大量 截图、界面、PPT和产品文档，甚至还有内部开会讨论的投影照片!网上还出现一个假冒360的网站，说是即将推出名叫coco360的IM，敬请广大用户 期待，等等。</p>
<p>这么全面的“泄密”，只要冷静点分析，当然就会发现破绽，问题是当时马化腾已经不冷静了，何况提供这些材料给他的，是他的一个“好朋友”，业内某著名大佬。跟这位幕后总导演比，周鸿祎和马化腾都还像是小朋友。他们之间的这出“三国杀”，我在后面再继续讲。</p>
<p>还有关于“盗梦盒子”的文章里，有的充满了只有安全行业技术人员才用的专业词汇。再联系到这一轮造假的“专业”与逼真程度，幕后黑手是谁就是明摆着的了，只能是某家以阴柔著称、以小动作见长的老牌杀毒厂商。</p>
<p>3Q打完，3和Q两败俱伤，只有金山的安装量因为腾讯的大力推荐而迅猛增长。这还不够，在”二选一”后360最困难的时候，傅盛出面，联合百度搜狗遨游开发布会，宣布和360不兼容，意图腹背夹击，让360彻底完蛋。</p>
<p>一个到处以“360之父”自诩的人，一个口口声声”热爱360、把360当成自己生命”的人，这么急吼吼地给腾讯当打手，挖空心思就想毁掉360，是为了什么?</p>
<p>我来说说前因后果。</p>
<p><strong>　　“傅盛膨胀到那种地步，周鸿祎负有很大责任”</strong></p>
<p>傅盛是个很聪明的人，口才好，反应快，善雄辩，很多时候我们俩争论，我明明知道他讲的不对，但就是说不过他，而这种类型正好是周鸿祎喜欢的。</p>
<p>周鸿祎有个毛病是爱才如命，之所以说是毛病，是因为周鸿祎太爱走极端，缺乏分寸感，好好的”爱才”到了他这里，往往会变成”溺爱”。他在外面跟 人聊天，听到一点有创意的建议，马上就会眼睛发亮，一拿到手机号，转头就让人事部去挖，没隔两天又开始不停地发短信追：“XXX怎么还没入职?”。现在公 司很多产品、技术骨干都是他用这种方式挖来的，当然看错人的比例也不低。</p>
<p>有一个技术骨干，名字不说了，很聪明，但是没自制力，经常通宵看小说，上班睡觉，几个月不出活，自己都觉得不好意思，就辞职了。没多久老周就又 开始想他了，老是念叨“XX还是很有水平的”，又把他找了回来，但是事与愿违，这老兄老毛病改不了，最后搞得周鸿祎完全没脾气。对有才华的员工容忍度太 高，无原则溺爱，这是周鸿祎用人的一大弊病。</p>
<p>360开始的时候成长很快，周鸿祎一高兴，夸奖时少不了说些过头话，平时经常给傅盛做单独辅导，手把手地教他做产品;接受采访时，也经常让傅盛 出面，以至于有记者以为周鸿祎要让傅盛当接班人，其实老周自己当时才30多岁;然后又不顾内部很多人的反对，非要任命傅盛做360部门的总经理，其实当时 傅盛的问题已经暴露了不少，老齐已经明确提出要有限制地使用了。傅盛走后老齐曾总结过：“傅盛膨胀到那种地步，周鸿祎也负有很大责任”，公司里很多人都是 认同的。</p>
<p><strong>　　周鸿祎挖来的人，傅盛一律不要</strong></p>
<p>傅盛本来就自视极高，随着360的用户数增长，他的变化越来越大。</p>
<p>开会时，他经常整个人往后靠着，眼睛看着天花板，下巴对着同事，动不动打断别人的发言。</p>
<p>其他人讲话时，傅盛常常自顾自玩手机，脚差不多能搁到桌子上，再时不时点评几句。</p>
<p>他要求把公司其它部门的一些人尽量开掉，或者把他负责的360部门分拆出来，理由是不能让其它部门的人占他的便宜。</p>
<p>他的部门只用自己招的人，人事部门招来的，或者老板挖来的，傅盛一律不要。就算勉强要了，也会想办法挤走。</p>
<p>当时的360就产品而言还很粗糙，傅盛点子多，但是对产品细节的把握比较弱。老周亲自跑到广州，把向明和欧胜请来，想让他们帮傅盛打磨产品。傅 盛先是不要，后来又打发他们去干些无关紧要的活。其实向明和欧胜的产品能力在很多地方比傅盛强，一些很成功的产品，譬如开机小助手，就是他们做的，现在他 俩都在负责核心业务。</p>
<p>技术上，虽然周鸿祎在雅虎的时候就已经有做安全的想法，还跟杨致远建议过，但是当时的360在安全技术方面还是积累少，老是被瑞星嘲笑，说 360杀流氓软件只能按文件名来查，等等。傅盛是做产品出身，技术上主要依赖徐鸣，徐鸣对安全也不在行。周鸿祎很着急，到处打听安全圈有什么牛人，终于找 来了一个高手，“狙剑”的作者，叫徐贵斌。</p>
<p>徐贵斌一来，就觉得360部门内的气氛不太正常：刚有了千把万用户量，就已经开口闭口大谈成功经验了，部门里面搞得像一个小团伙，还搞个人崇 拜，对竞争对手也是认为不堪一击。徐贵斌觉得有问题，就写了封邮件，主要提了两点：一，360的成功主要在于市场和宣传，能一炮打响有很大的偶然性，纯粹 是因为杀流氓软件的需求太大，其它公司又不敢杀，才给了360一个机会;二，当时360的技术其实远不如瑞星金山，如果不能迅速引进大批人才，尽快补上技 术短板，360很可能就像超级兔子和优化大师那样，充其量就是个工具软件，冲到几千万的安装量就到头了。</p>
<p>周鸿祎本来就是个悲观主义者，被这盆冷水浇了一下，危机感更强了。但是徐贵斌却因为这封邮件得罪了傅盛和徐鸣，从那以后傅盛就一直想各种办法轰他走，最后还是老周把他给留下的。傅盛走后，老周让徐贵斌领导查杀部门，确实把360的查杀能力提升了一个大台阶。</p>
<p>开始的时候，老周一度天真地以为傅盛徐鸣不要HR招的人，是因为HR在技术能力判断上不行，于是安排我到他们部门帮助招聘和培训。有些人招进来 了，傅和徐却顶着不要的，只好交给我来带，一共四个，现在都是公司很重要的骨干。傅盛说我是来建秘密团队的，纯粹是胡扯。反倒是傅盛一再跟老周打小报告， 说李钊老了，不行了。</p>
<p>后来徐鸣对我说，我是被派来对付他和傅盛的。我听了很生气，就说：“你这是放屁，我本来就不愿意掺乎你们这事儿。老周认为我管不了大团队，才下放到你们这里来帮忙的。”</p>
<p>还有个人，原来雅虎中国的CTO谭晓生，后来去了MySpace当COO，09年到了360。有次聊起来，晓生说他挺后悔晚到一年的，少拿了不 少股票。原来老周08年就想挖他过来，晓生找徐鸣打听情况，问完后觉得老周很不好，这么干公司怎么会有前途?结果傅盛离开后公司发展更快了，晓生还是来了 360，进来后发现完全不像傅盛徐鸣他们说的那样，觉得这俩人很过分，说到底就是怕能人进多了，影响他们俩的地位。</p>
<p><strong>　　“让傅盛做部门总经理 ，他就会听公司的话了??”</strong></p>
<p>对傅盛阻挠引进更多高水平的人，老齐是很有看法的，我记得他说过：“傅盛快成一颗毒瘤了，让公司政令不通，策略执行不下去。这个瘤子不摘掉早晚会扩散，最后把整个公司都赔进去。”当时我还觉得言重了，回头看，在用人上还是老齐比老周有先见之明。</p>
<p>老齐多次提出过换人，但是到了周鸿祎那里总是通不过。老周很纠结，一方面觉得傅盛确实成了引进新人的障碍，一方面又觉得拿掉傅盛感情上过不去。 怎么办呢?老周忽发奇想，要把傅盛的头衔从产品经理改成部门总经理，另外再涨薪涨股票，他的想法是傅盛职位高了，就不会再觉得引进高水平的人对他有威胁， 再加上涨完股票一高兴，应该就不会对引进新人闹意见了。</p>
<p>老齐同意给傅盛涨股票，但是不同意提拔，记得他问我意见时还说过一句：“让傅盛做部门总经理，他就会听公司的话了??”妥协的结果是给傅盛一个 部门副总的头衔，然后再找安全行业有经验的牛人来当部门总经理，让傅盛做辅助的工作。但是老周对这个结果不满意，他认为傅盛会闹情绪，先是压着不发，后来 有一天趁着老齐出差，他绕过老齐找人事部发了个任命，把傅盛的头衔升成了部门总经理，整个过程如同儿戏。老齐回来后，气得都想踹周鸿祎。</p>
<p>这次任命不但是拔苗助长，后果更是灾难性的，因为给了傅盛一个完全错误的信号。从那以后，傅盛的部门不但”针插不进，水泼不进”，而且越来越趋 向失控：人员工资都必须傅盛说了算，股票怎么分，也都得傅盛定，人事部说了不算，老板说了也不算。连360部门的员工具体在干什么，公司也不知道。对老周 布置的事，经常阳奉阴违，后来干脆顶着不办。</p>
<p>直到一次考核，人事部发现傅盛手下有6、7个员工很奇怪，竟然说不出自己做什么工作，只说”做前沿研究”。那具体研究了些什么呢?问半天才说是图片方向的，跟安全不沾边。</p>
<p>而傅盛自己也经常在上班时间不见人影，经常下午才来公司。有很长一段时间，他每天就在公司转一圈，然后就不见了，晚上为了打卡才回来一趟。我当 时很纳闷，白天怎么老找不到傅盛，更奇怪傅盛手下为什么要养那几个闲人，后来同事间开始传，说是傅盛在外面偷偷开公司干私活，这才恍然大悟。</p>
<p>后来又听说傅盛在360上推荐下载的软件，有些下载量很大，但是收费却很少，公司想撤掉，傅盛总是拦着不让，还三番五次找老周老齐说情，比做那款软件的公司自己还着急，还上心。</p>
<p><strong>　周鸿祎可以容忍一切，但是不能容忍搞砸产品</strong></p>
<p>我想傅盛这么搞，产品能做好才怪，360的版本升级越拖越慢，用户反馈的问题越来越多。一直到08年的7月16日，第二天就要正式发布360杀 毒，公司让其它部门的员工也来试用，结果发现杀毒非常难用，动不动就死机。而身为安全业务总负责的傅盛这时却不见了，半天才找回来，说是去参加了暴风影音 的发布会，并且感触很深，“他们号称明年上半年收入能到一个亿”，”360这么做免费安全，没什么出路，将来还是得学暴风做媒体。”</p>
<p>第二天杀毒发布会的邀请函都已经发出去了，来不及推迟，公司只好硬着头皮把杀毒发了，结果不出所料，用户恶评如潮。几天后不得不悄悄把杀毒从 360首页撤了下来，又不好公开说杀毒产品失败，只好挂在网站上很深的一个角落。按周鸿祎自己的话，这是他这辈子最失败的一个产品。</p>
<p>老周是这么一个人，他可以容忍一个人有很多毛病，但是容不得有人拿产品不当回事。这下决心就很容易下了：撤掉傅盛，老周亲自接管安全业务，同时另外抽调人手重新开发杀毒。</p>
<p>之前公司发现傅盛异常后，已经开始调查，很快就拿到了傅盛勾结下属私下开公司的证据。傅盛只能走人了。</p>
<p>最近公司对内解释傅盛离开的原因，只说了他开公司干私活这一件事，我觉得是给他留了面子的。说实话，如果仅仅是个职业道德的问题，老周还是很有 可能会原谅他。实在是傅盛后来的一些做法太过分了，已经严重影响到了360本身的发展，同时搞坏了公司内部的风气，才逼着老周下了最后的决心。</p>
<p>傅盛离开时，除了他的一些铁杆部下，公司里几乎没人感到惋惜，反而有很多人埋怨老周，怎么拖到现在才处理。</p>
<p>这里还有个笑话，360杀毒发布并宣布永久免费后，瑞星马上跟进，推出一年免费版，导致代理商强烈反弹。瑞星硬着头皮挺了几个月后，发现360 杀毒安装量极小，对瑞星没什么冲击，感觉上了当。内部一反思，认为错在反应太快执行力太强，纯属自乱阵脚，于是往回收，重新恢复收费。结果几个月后360 杀毒经过重新开发，正式推出第二版，瑞星不得不再次跟进免费，这么来回折腾几次，结果把代理商彻底逼疯了。细究起来，瑞星的渠道其实是毁在傅盛手里，呵 呵。</p>
<p><strong>　　雷军说：“傅盛你是中国做客户端的三大高手之一”</strong></p>
<p>刚接触傅盛的人，尤其是女的，往往对他印象很好，但是接触久了，就会发现他的一些毛病，譬如表里不一，说一套做一套，譬如自恋和自大。</p>
<p>我记得很清楚的一次，在食堂吃饭聊天，傅盛说：”我是世界上最好最优秀的男人，头脑聪明、智商高，工作能力又强，待人接物方面又会做人，不但是 工作上的好男人，生活上也是好男人。”听得我目瞪口呆：怎么会有这么自恋的人?这么说自己也有点太那个了吧?何况你待人接物时怎么样，大家都是有目共睹 的。当时我就觉得他有些地方已经有点不太正常了。</p>
<p>有一次跟老板吵架，傅盛自己说漏了嘴，说是雷军找过他，说傅盛你是中国做客户端的三大高手之一，功劳这么大，周鸿祎给你的权力太小了，不如出来 创业，出来我就给你投资。“客户端三大高手”的说法后来雷军自己公开提过，所以傅盛说的应该八九不离十。另外两个高手估计是指马化腾和周鸿祎，也可能是指 雷军自己，能跟这些人平起平坐，傅盛不膨胀才怪。当时我们已经开始发现有人在背后搞360的小动作，开始以为是瑞星，后来发现瑞星一般都是明火执仗地干， 不像金山喜欢来阴的。</p>
<p>这里插一句，当初我在方正时，雷军也曾经想拉我去金山，当时我觉得他说话比较装，有点假模假式，不像周鸿祎虽然毛病多，但是直来直去，就选择了跟周干。现在看我肯定是选对了，这么多年跟着雷军在金山干的，还没有一个挣到钱的。</p>
<p>我想有雷军煽风点火背后撑腰，傅盛的自大更上一层楼，他潜意识里把360当成了自己的地盘和私有财产，任何人都不能碰，一些再正常不过的工作安 排，都会觉得公司是针对他的，是要夺他的权。给他招人，他觉得是要安插耳目，是派人监视他;跟他说几句平常的话，他会觉得话里暗含杀机。人到了这个地步， 已经很难再沟通了。</p>
<p><strong>　　谎话说多了，连自己都当真了</strong></p>
<p>石晓虹说傅盛有迫害妄想，”被幻觉控制”，虽然刻薄，但不是没有道理。还在离开之前，傅盛就已经开始像个怨妇一样，见人就说自己功劳如何大，公 司对他如何不好，他如何如何委屈，等等。为这事有同事给他取外号叫“傅林嫂”，意思是跟鲁迅笔下的祥林嫂一样，有诉不完的苦。老听他说这些，我也有个感 觉，就是有些话说的次数多了，可能他自己也就当成真的了。</p>
<p>举个例子，傅盛为了证明自己是360之父，经常说360的名字是他起的，他的身份证号里有360，他父母在一家叫“三六零”的工厂工作，云云。 这些话都是傅盛离开后在外面说的，刚听说时我很意外，因为公司里老人都知道，360的名字是曹曙起的。当时微软XBOX360的消息刚传出来，曹曙觉得 360这个名字好，360度包罗万象，拿来做什么都可以。跟老周一说，老周也同意，就让曹曙去注册了一系列360打头的域名，最早的是在05年春天，而傅 盛是在05年11月才进的奇虎。</p>
<p>还有在可牛的问题上，傅盛先是说可牛是他在VC工作时投资的项目，后来又变成了他离开奇虎之后自己创办的可牛，最新的解释是他在加盟奇虎之前开 始申请注册可牛。自己的三种说法都前后矛盾，每次都要用一个谎言来掩盖另一个谎言。事实是：傅盛是在加入奇虎之后一个月，勾结两名同事，向工商局提出申请 注册，而不是他说的加入奇虎之前就已开始申请。</p>
<p>石晓红公布了注册360域名网站的截图，还有可牛的工商登记资料，但是傅盛呢?不管是为自己辩护，还是攻击360和老周，从来就没拿出过什么证据。</p>
<p><strong>　　腾讯出钱，傅盛出力，雷军获利?</strong></p>
<p>现在回想起来，老周号称枭雄，但在处理人的问题上，实在缺乏谋略和决断，尤其是面对一些立过功、或跟了他多年的老员工时。石晓红做过一个对比， 大意是傅盛的情况就像当年在联想内部搞独立王国的孙宏斌，但是老柳处理起来就当机立断得多，直接就把孙送监狱里去了。而周鸿祎虽然在外面号称狠角色，在公 司里也经常发牢骚要开掉这个开掉那个，但是到了动真格的时候，却往往表现得拖泥带水，婆婆妈妈，以致傅盛的问题越拖越大。</p>
<p>话说回来，拿傅盛跟孙宏斌比实在是太抬举他了。孙宏斌的顺驰虽然失败，但至少曾一度威胁到万科，后来再办的融创也已经上市成功。</p>
<p>傅盛呢?离开360后，做的可牛图片连美图秀秀都比不过，最后还是雷军为了挽救自己的投资，让金山出面买下了可牛，才避免了倒闭;金山网络让傅 盛给免费后，也是收入大减，快撑不下去了，只能靠腾讯的投资来维持。安装量也是靠腾讯帮他强行捆绑推广，这两天又拿第三方数据来吹，说什么用户上亿，我一 看金山的上升曲线，就是在最近突然间来了个陡峭的转折和上扬。中国的第三方数据，你懂的。</p>
<p>傅盛、腾讯、雷军的关系，我以为概括地说就是腾讯出钱，傅盛出力，雷军获利：</p>
<p>看上去腾讯的算盘是“用周鸿祎培养的人来咬周鸿祎”，用360的叛将当打手，免得腾讯自己直接和360交锋;雷军则是通过360这个共同的敌 人，找到了和马化腾唯一的利益交集。把360的威胁放大到极致，可以最大限度地减轻腾讯对米聊、多玩和UCweb等雷军系企业的竞争压力;而拉来腾讯注资 金山，不但能给快要断粮的金山网络及时输血，更是为雷军自己对可牛的失败投资找到了最终买单的豪客，捎带着还能让求伯君套现出局，圆了自己多年来“老太子 登基”的宿愿。作为整个棋局的总导演，雷军既不出钱，也不出力，但是却一箭四雕、获益最多;</p>
<p>而傅盛在先被逐出师门、继而自己创业又失败后，本来已经成为一个loser，结果却因为能咬周鸿祎这点而倍受赏识，来了个剩余价值大发现，成为腾讯对360的战争中，一粒奋勇向前的马前卒。</p>
<p>至于周鸿祎，毛病当然不少，但在用人这点上，如果真的像傅盛说的那样不能容人，360怎么可能在短短几年聚集起这么强悍的一支队伍?又怎么会有这么多人，从3721、雅虎到360，一直铁了心跟他干?</p>
<p>而且周鸿祎的特点是喜怒形于色，有话当面说，根本就不懂也不会那些旁敲侧击的宫廷政治手法。腾讯那个程苓峰写文章，拿毛来影射老周，把老周写成 权力斗争的大师，实在是太抬举老周了。很多人都知道周鸿祎脾气不好，还愿意跟他干，就是因为周没什么架子，不会摆谱，跟人交流比较平等和直接，只要你说得 有道理，他就能听进去，反思和认错也很常见，因此很多中层也敢跟他大吵大嚷，几个厉害点的副总，像刘峻、姚珏更是经常跟他拍桌子。</p>
<p>傅盛正好相反。在360时，有同事在公司网站上给他的部门提点意见，傅盛就逼着公司查ID，非要老板把那人开掉。我还听过一个故事，说是傅盛到 金山后，有次要出门，让秘书安排车，但是当时金山的车都已经出去了，秘书只好叫了个出租，结果傅盛下楼一看，居然让傅总打的，龙颜大怒，就把这个秘书开掉 了。这事真假我不知道，但是非常符合傅盛的性格。</p>
<p>再扯一句程苓峰，他的文章讲了一个“功高震主”的逻辑：周鸿祎是老板，傅盛打工。打工仔干得好，所以老板不让他干了。这是什么逻辑?</p>
<p><strong>　　傅盛的功劳到底有多大?</strong></p>
<p>时至今日，傅盛要自抬身价时，还是要靠“360之父”的招牌，所以有必要讨论一下360的成功靠的是什么。</p>
<p>360公司能有今天，我认为有几个关键点：融资、杀流氓、推浏览器和导航、免费杀毒，还有手机卫士。没有靠周鸿祎个人品牌和搜索技术融来的几千 万美元，就不会有奇虎公司;不敢杀流氓软件，就不会有安全卫士;没有浏览器和网址导航，就没有360的商业模式和主营收入;没有免费杀毒，不可能击败杀毒 厂商，并赢得民心;没有手机卫士，360在移动领域就没有根基。这其中只有杀流氓一件事与傅盛有关。</p>
<p>具体到360安全卫士的成功，也有三个关键因素：</p>
<p>首先是用户需求太大，当时的用户盼望清理流氓软件，就像盼解放军一样(插一句：360的社区搜索没成功，不是因为技术，而是缺乏需求，傅盛也当过奇虎搜索的产品经理);</p>
<p>其次，当时没有一个杀毒厂商敢查杀流氓软件，因为做流氓软件的都是互联网公司，只有周鸿祎这种亡命徒才敢把同行得罪光。</p>
<p>第三，老周跟雅虎的口水战，等于给360做了一次免费的全国性宣传。这次口水战对周鸿祎的个人形象伤害很大，但是对360的推广来说，却不亚于一枚超级火箭推进器。</p>
<p>至于产品本身，当然很重要，奇虎团队之前在客户端方面的经验积累，也确实起了很大的作用。但在360安全卫士最开始的成功中，产品和技术确实不 是最重要的，因为杀流氓软件并不需要多么牛逼的技术，而且当时需求太大，产品就算弱一点，只要能解决问题，一样有市场。360在安全技术上超越瑞星金山， 还是09年云查杀发布以后。</p>
<p><strong>　　“如果傅盛真的那么牛，公司又怎么敢让他走人?”</strong></p>
<p>平心而论，在360安全卫士这个产品上，傅盛在初期确实做了不少贡献。但是归根结底，他还只是一个执行者，奇虎内部像他这个层次的产品经理有一 堆，换一个人来做360，未必就比他差，只不过公司把这个机会给了他。再假设一下，换一家公司，譬如雷军，要是也敢下决心，先站出来查杀流氓软件，那金山 不少产品经理都不会做得比傅盛差。傅盛把360整个公司的成功都归结成自己的功劳，就有点太那个了。</p>
<p>换句话说，如果没有杀流氓软件那么大一个现成的市场摆在那里，没有周鸿祎下决心豁出去杀流氓，没有跟雅虎那场口水战，没有老周之前做了和投了那 么多客户端的经验，那傅盛能力再强，也不可能把360安全卫士做成功。但是如果没有傅盛，奇虎另外挑一个产品经理来干，360依然有很大的机会做成。</p>
<p>事实就是明证：傅盛离开后，几乎把他招的人全部带走，但是360并没有因此垮掉。傅盛的离开反而成了360招人、进人的一个转折点，很多之前被 挡在外面、水平比傅盛徐鸣高的人都进来了，工程师从当时剩下的几个人扩张到现在的500多人。很多之前傅盛反对上马的项目，譬如浏览器、譬如网址导航，以 及一度被他搞砸的杀毒项目，之后都获得了巨大的成功。但是这些项目的负责人，没有一个像傅盛那样自诩为”360浏览器之父”、或”360杀毒之父”。</p>
<p>傅盛说他做360时，公司对安全卫士不管不顾，意思是都是他一个人做出来的。稍微了解一点奇虎的人都知道，这完全不可能。周鸿祎对产品历来是一 竿子捅到底，经常会叫上基层员工一起开会，有时为了一个细节还会和几个小孩吵得面红耳赤，尤其是打仗的时候，恨不得连公关稿都要亲自写。像他这样一个把打 架当成生命的人，杀雅虎助手这么过瘾的事，怎么可能放手不管?每一个大的流氓软件背后都是一家大公司，剜大公司的心头肉，这和玩火差不多，周鸿祎敢放手 吗?就算周鸿祎放手了，还有一个管得更细、事必躬亲的齐向东呢，也不管吗?</p>
<p>举个例子，傅盛坚持用专杀来对付木马，每发现一个木马就做一个针对性的专杀，这种办法短期内有效，但是长期来说没有前途：现在每天产生的新木马 上升到几千万个了，360得做多少专杀?而周鸿祎当时就主张搞深度扫描(就是360后来的云查杀)、非黑即白、还有QVM引擎。后来的发展证明周在技术路 线上是非常有远见的，现在金山自己也是在照抄360的技术，这点上不佩服周鸿祎不行，你们说我拍马屁也无所谓。</p>
<p>其实道理很简单，用周鸿祎自己的话说，就是“如果傅盛真的那么牛、那么重要，如果360真的离不开傅盛，公司又怎么敢让他走人?”</p>
<p><strong>　　老周送傅盛20万股，对其他员工是不公平的</strong></p>
<p>听说傅盛离开时，好像还哭了一次，提出想要360的股票，老周这人只要一见到眼泪就立马软了，结果就答应了，还提醒他图片软件不是一个好的方向。我没想到的是，老周居然会送他20万股。</p>
<p>不是说20万这个数有多高，我相信老员工里应该不乏拿得更多的，而是傅盛只干了两年多，按协议规定，干股应该是干满三年才能拿到一部分，满四年拿到全部。因为干股比期权值钱，所以在时间安排上是一个倒金字塔，意思是鼓励员工跟公司一起坚持奋斗，而不是干一两年就跑。</p>
<p>傅盛按规定应该是一股都拿不到，我做梦也没想到，对于这样一个犯了严重错误、影响公司发展的人，周鸿祎居然还要送他20万股，不知道是怎么想的。这次披露后，公司里很多人对这点有意见，公开说也无妨。</p>
<p>幸亏送股票时签了个竞业禁止协议，要求傅盛不去对手公司、不做竞争业务、不挖360员工、不诋毁老东家，也幸亏傅盛一再地公开破坏这个协议，逼 着公司取消给他的股票。不然我们这么拼命干活，金山的CEO却在坐享其成，舒舒服服地当360的股东，同时还要天天骂360、毁360，这叫什么事啊?对 金山的员工来说，他们如果知道自己的CEO天天在公开场合鼓吹打倒360，私底下却想尽办法，卑躬屈膝地找360讨要股票，又会是什么感受?</p>
<p><strong>　　好像傅盛把毁掉360当成了自己的人生目标</strong></p>
<p>公司手里有傅盛这么多把柄，一直没有拿来说事。但是，傅盛离开后到处以360之父自居，拼命挖360的人，甚至不断公开站出来骂360、骂周鸿祎。</p>
<p>傅盛刚离开，就拿了雷军的投资。没多久，就把可牛和金山的子公司金山贝壳合署办公了，金山贝壳做出来的金山卫士第一版，从界面到代码，都跟360安全卫士几乎一摸一样。</p>
<p>接下来360和金山爆发口水战，金山被爆料的当天，傅盛忽然跳出来说”360拦截可牛杀毒”，就是为了把视线从金山身上转移开。第二天我看见新 闻后，还去问老周：”咱们干嘛干这蠢事?拦它没有一点好处啊。”老周一下子就急了：”你脑子进水了?傅盛的话你也信!”我才回过神来，再看傅盛所谓的证 据，就是几张截图。一个做图片软件的公司，PS几张图不跟玩似的?如果360真的拦截了可牛，傅盛完全可以去起诉，也一定会去。时至今日，他起诉了吗?</p>
<p>不管傅盛怎样辱骂和挑衅，老周一直忍着，始终没有还击。以周鸿祎的个性能忍这么久，真是大出所料，我问他为什么，说是不想给傅盛自我炒作的机 会，另外辛辛苦苦培养的人不但背叛了，还这么没良心，自己都觉得很没面子。说实话，我觉得老周在公司里一直袒护傅盛，结果傅盛出去后反而把矛头对准他，换 任何一个人，都不会不感到伤心。</p>
<p>但是傅盛并不领情。去年12月31日，傅盛趁元旦要放假，在下班前搞突然袭击，开发布会说360”窃取用户隐私”。这事其实就是一个bug，金 山自己也有，而且比360严重得多，行业里的人都清楚，但是傅盛明知道是怎么回事，还要混淆视听，颠倒黑白。更蹊跷的是，他们当时说漏了嘴，透露出是从 360服务器上拿到的数据，问题是，金山怎么会有360服务器的权限???!!!……</p>
<p>这已经属于阴谋陷害了，连一些早年跟傅盛关系不错的同事，譬如姚珏，都觉得傅盛太卑鄙了。老周下决心取消傅盛的股票，应该就是这个时候。</p>
<p>这样一个人，居然还好意思一次又一次地来找360要股票，换成我，早钻到地底下去了。</p>
<p>让傅盛担任金山安全CEO，是360的一个长期利好</p>
<p>傅盛说周鸿祎容不下他，不如说他自己更合适。傅盛用人的第一标准就是听话。</p>
<p>金山安全的技术总监叫梅银明，据说技术很牛，但是比较有性格。傅盛到金山后，梅银明就被排挤出来了。连金山的李铁军，也在微博上说梅的离开是金山一大损失。</p>
<p>我看梅银明的博客，说傅盛有”紫霞神功护体”，这应该是拿岳不群来比傅了，梅还披露说金山内部现在鼓励互相告密。为了让他离开后少说话，金山高 层甚至举了钱云会的例子，威胁他的人身安全。值得注意的是，梅银明的微博里还多次提到：”把传播病毒技术都作为竞争计划的团队，有何资格言善良?”</p>
<p>时间长了，像梅银明这样的人都会慢慢被排挤出来，从这个角度说，我觉得傅盛确实像是360派去的卧底。</p>
<p>傅盛去金山当CEO，从短期来说，让360很难受，因为这个人疯了一样，把搞垮搞臭360当成金山公司的主营业务。但是从长期来说，这样一家把 仇恨当成生存目标的公司，再加上傅盛个人的狭隘、自大，又怎么可能有前途?如果没有腾讯的输血，金山能撑几年?所以说，让傅盛当金山的CEO，并且一直当 下去，是360的一个长期利好。</p>
<p><strong>　　傅盛的心路历程</strong></p>
<p>傅盛心里其实应该很郁闷的。文章最后，我来按时间顺序，替他总结一下心路历程吧：</p>
<p>1、 奇虎能成功吗?还是给自己留条路吧，奇虎可牛，一公一私，总有一个会成功。</p>
<p>2、 没想到360这么快就起来了!唉，可惜360是奇虎的，不是可牛的，要是我自己的就好了……</p>
<p>3、 360为什么不能是我的?我的功劳那么大，它就应该是我的，周鸿祎亏待我了</p>
<p>4、 不过好像做免费安全也不挣钱啊，要挣钱还得另外想办法……</p>
<p>5、 糟了!被发现了!</p>
<p>6、 此处不留爷，自有留爷处，反正免费安全也挣不到钱。以我的能力，可牛未必不能超越奇虎。但是这笔帐得永远记着!</p>
<p>7、 好像图片软件也不那么好做……，幸亏有雷总</p>
<p>8、 我也是CEO了，和周鸿祎平起平坐了，报仇的机会来了!</p>
<p>9、 我认识马总了!马总是我大哥，还给了我20%的金山股份，我要好好出力报答马总。</p>
<p>10、 这20%要兑现好像很难呵，好在360居然上市了!而且市值很高，还好，我还有20万股。</p>
<p>11、 他们居然取消了我的股票!我发财的最后一点希望也破灭了，抓狂了!!!!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://roygu.com/2011/10/other/%e8%bd%ac-%e7%9b%9b%e6%98%af3q%e5%a4%a7%e6%88%98%e5%b9%95%e5%90%8e%e9%bb%91%e6%89%8b%ef%bc%9a%e9%a9%ac%e5%8c%96%e8%85%be%e8%a2%ab%e5%88%a9%e7%94%a8%e4%ba%86.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>localization</title>
		<link>http://roygu.com/2011/10/php/localization.html</link>
		<comments>http://roygu.com/2011/10/php/localization.html#comments</comments>
		<pubDate>Wed, 19 Oct 2011 04:56:35 +0000</pubDate>
		<dc:creator>校长</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[localization]]></category>

		<guid isPermaLink="false">http://roygu.com/?p=1522</guid>
		<description><![CDATA[原文： http://phpadvent.org/2010/localization-by-anthony-gentile 翻译：校长 RoyGu http://roygu.com 当我们创建一个网站时，一个非常重要的考虑是：网站的受众/访客。无论网站是销售商品、提供服务亦或是信息资讯，都须考虑当国外用户访问时页面如何呈现。如果他们想在你的网站上购买商品、使用服务或获取资讯，你的网站能够正常服务他们吗？应该提供正常服务吗？本地化让用户界面符合用户的预期，如：日期格式、货币以及本地语言文本。 许多以英语为母语的人并没有意识到这点，尽管英语的普及率很高，但说英语的人仍只占很小比率。这篇文章统计了世界上分布最广的语言是英语，但英语并不是人们说得最多的语言（现在排第三）。互联网上有如此多的有用信息，很大一部分不是用英文描述的。用计算机解决语言相关的问题是一件困难的事情，但是创建一个国际友好的网站并不是我们想象的那么难。虽然今天介绍的方法不能适用于10种不同语言的网站，但是对于需要提供两三种语言的网站非常有效果。比如，在美国，讲西班牙语的人数在显著增加，拥有一个能用西班牙语言交流的电子商务网站，将扩大你的潜在客户群。 在讲如何为网站实现本地化之前，我想花点时间谈论下字符编码。即使你无法预见你的网站是否需要提供本地化功能，了解字符(charsets)编码相关的知识都是非常有必要的。字符编码是用来帮助软件识别用户期望字符集的。例如，通用的ISO 8859-1字符集是西欧的通用字符集。因此，在这种字符集中可以用英文字母表示德语中的原音。但如果我在这种字符集中想显示可拉伯字符，如：ق，那么很可能会显示成� 或 Ù。这就意味着，在ISO 8859-1字符集下，不能正确识别阿拉伯字符。 一种非常友好的跨语言字符编码是兼容ASCII码的UTF-8编码，它代表Unicode字符集，特别是在传统应用中较为常见。在网站中使用UTF-8，其支持的字符非常多，能够最大地满足用户需求。为了正确地实现一种字符编码，你要确保在你整个应用中编码保持一致。如果你使用UTF-8，那么Apache、数据库 表、PHP以及PHP可用的功能和文档类型都应该设置成UTF-8。如果这些都不是一致的，你最终可能会得到不同字符编码的混合数据，这种问题即使能补救也比较困难。 // Apache httpd.conf or .htaccess // This will add a charset to the Content-Type response header. AddDefaultCharset UTF-8 // php.ini default_charset = "UTF-8" // Example PHP function htmlentities($data, ENT_COMPAT, 'UTF-8'); // XML &#60;?xml version="1.0" encoding="UTF-8" ?&#62; // HTML &#60;meta http-equiv="Content-Type" content="text/html; [...]]]></description>
			<content:encoded><![CDATA[<p>原文： <a href="http://phpadvent.org/2010/localization-by-anthony-gentile" title="localization by anthony gentile">http://phpadvent.org/2010/localization-by-anthony-gentile</a><br />
翻译：校长 RoyGu http://roygu.com</p>
<p class="first">当我们创建一个网站时，一个非常重要的考虑是：网站的受众/访客。无论网站是销售商品、提供服务亦或是信息资讯，都须考虑当国外用户访问时页面如何呈现。如果他们想在你的网站上购买商品、使用服务或获取资讯，你的网站能够正常服务他们吗？应该提供正常服务吗？本地化让用户界面符合用户的预期，如：日期格式、货币以及本地语言文本。</p>
<p>许多以英语为母语的人并没有意识到这点，尽管英语的普及率很高，但说英语的人仍只占很小比率。<a href="http://anthro.palomar.edu/language/language_1.htm">这篇文章</a>统计了世界上分布最广的语言是英语，但英语并不是人们说得最多的语言（现在排第三）。互联网上有如此多的有用信息，很大一部分不是用英文描述的。用计算机解决语言相关的问题是一件困难的事情，但是创建一个国际友好的网站并不是我们想象的那么难。虽然今天介绍的方法不能适用于10种不同语言的网站，但是对于需要提供两三种语言的网站非常有效果。比如，在美国，讲西班牙语的人数在显著增加，拥有一个能用西班牙语言交流的电子商务网站，将扩大你的潜在客户群。</p>
<p>在讲如何为网站实现本地化之前，我想花点时间谈论下<a href="http://en.wikipedia.org/wiki/Character_encoding">字符编码</a>。即使你无法预见你的网站是否需要提供本地化功能，了解字符(charsets)编码相关的知识都是非常有必要的。字符编码是用来帮助软件识别用户期望字符集的。例如，通用的ISO 8859-1字符集是西欧的通用字符集。因此，在这种字符集中可以用英文字母表示德语中的<a href="http://en.wikipedia.org/wiki/Umlaut">原音</a>。但如果我在这种字符集中想显示可拉伯字符，如：ق，那么很可能会显示成� 或 Ù。这就意味着，在ISO 8859-1字符集下，不能正确识别阿拉伯字符。</p>
<p>一种非常友好的跨语言字符编码是兼容ASCII码的UTF-8编码，它代表Unicode字符集，特别是在传统应用中较为常见。在网站中使用UTF-8，其<a href="http://en.wikipedia.org/wiki/List_of_Unicode_characters">支持的字符</a>非常多，能够最大地满足用户需求。为了正确地实现一种字符编码，你要确保在你整个应用中编码保持一致。如果你使用UTF-8，那么Apache、<a href="http://dev.mysql.com/doc/refman/5.1/en/charset-table.html">数据库</a><a href="http://www.postgresql.org/docs/8.4/static/multibyte.html"> 表</a>、PHP以及PHP可用的功能和文档类型都应该设置成UTF-8。如果这些都不是一致的，你最终可能会得到不同字符编码的混合数据，这种问题即使能补救也比较困难。</p>
<pre class="src">
// Apache httpd.conf or .htaccess

// This will add a charset to the Content-Type response header.
AddDefaultCharset UTF-8

// php.ini
default_charset = "UTF-8"

// Example PHP function
htmlentities($data, ENT_COMPAT, 'UTF-8');

// XML
&lt;?xml version="1.0" encoding="UTF-8" ?&gt;

// HTML
&lt;meta http-equiv="Content-Type"
    content="text/html; charset=utf-8" /&gt;
</pre>
<p>如果你想了解更多关于UTF-8的内容，并且为什么它如此重要，猛击下面的链接：</p>
<ul>
<li><a href="http://htmlpurifier.org/docs/enduser-utf8.html#whyutf8">UTF-8: 字符编码的秘密</a></li>
<li><a href="http://developers.sun.com/dev/gadc/technicalpublications/articles/utf8.html">什么是UTF-8?为什么它如此重要?</a></li>
</ul>
<p>刚才我们已经讨论了字符编码，接下来我们进入主题，谈谈如何实现本地化。如何判断为用户加载哪个本地化？如何知道用户来自哪里？一种解决方案是根据IP地址判断地域，但是更好的解决方案是让浏览器告诉我们使用哪个本地化。当用户发起HTTP请求时，HTTP头中的Accept-Language将会被发送，我们通常可以从PHP超全局变量$_SERVER中获取该值。看个示例：</p>
<pre class="src">
Accept-Language: en-us;en;q=0.5
</pre>
<p>虽然这是一种检测默认语言的简单方法，但这并不意味着它就是用户期望的语言。所以提供一种简单方法给用户切换语言是非常有必要的。许多开发者认为，在session或cookie中存储本地化编码就足够了，但这种方法不够友好和直接，在URL中加入本地化提示岂不是更好，如:<a href="http://example.com/en/blog/">http://example.com/en/blog/</a> 和 <a href="http://example.com/de/blog">http://example.com/de/blog</a>; 或者用子域名来表示，如： <a href="http://en.wikipedia.org/">http://en.wikipedia.org/</a>.</p>
<p>如何实现呢？不难，在Apache中为网站设置一个重写规则：</p>
<pre class="src">
RewriteRule ^(en|es)/(.*) /$2 [PT,E=lang:$1]
</pre>
<p>有了这个重写规则，我们就不需要为每种语言复制一份代码了。我们可以委托Apache查找用户请求的语言，并把它存储在环境变量中，然后转递到代码中。在我们的应用逻辑中，我们可以这样获取本地化编码：</p>
<pre class="src">
$<span style="color: #ffffff; font-weight: bold;">locale</span> = <span style="color: #c0c0c0; background-color: #000000;">apache_getenv(</span><span style="color: #ffff00;">'lang'</span>, <span style="color: #00ff00;">true</span>);
</pre>
<p>这里有一个支持本地化的PHP脚本，仅供参考：</p>
<pre class="src">
<span style="color: #ffaa00;">&lt;?php</span>

<span style="color: #ff0000;">/**</span><span style="color: #ff0000;">
 * Stick to the codes that are already standard.
 * ISO 3166 - http://en.wikipedia.org/wiki/ISO_3166-1
 * RFC 1766 - http://www.faqs.org/rfcs/rfc1766.html
 </span><span style="color: #ff0000;">*/</span>
$<span style="color: #ffffff; font-weight: bold;">accepted_locales</span> = <span style="color: #c0c0c0; background-color: #000000;">array(</span>

    <span style="color: #ffff00;">'en'</span> =<span style="color: #00ff00;">&gt;</span> <span style="color: #ffff00;">'en_US'</span>,
    <span style="color: #ffff00;">'es'</span> =&gt; <span style="color: #ffff00;">'es_MX'</span>
);

<span style="color: #ff0000;">// </span><span style="color: #ff0000;">Get the locale from the browser.
</span>$<span style="color: #ffffff; font-weight: bold;">browser_locale</span> = <span style="color: #c0c0c0; background-color: #000000;">substr(</span>$<span style="color: #00ff00;">_SERVER</span>[<span style="color: #ffff00;">'HTTP_ACCEPT_LANGUAGE'</span>], <span style="color: #c0c0c0; background-color: #000000;">0</span>, <span style="color: #c0c0c0; background-color: #000000;">2</span>);

<span style="color: #ff0000;">// </span><span style="color: #ff0000;">For more specific locale codes, e.g., en-us (English, United States), es-mx (Spanish, Mexican), etc.
</span><span style="color: #ff0000;">// </span><span style="color: #ff0000;">$browser_locale = current(explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']));
</span>
<span style="color: #ff0000;">// </span><span style="color: #ff0000;">Check against a whitelist instead of trusting $_GET['lang'].
</span><span style="color: #ff0000;">// </span><span style="color: #ff0000;">For reference: http://ha.ckers.org/blog/20100128/micro-php-lfi-backdoor/
</span><span style="color: #00ffff;">if</span> (<span style="color: #c0c0c0; background-color: #000000;">in_array(</span>$<span style="color: #ffffff; font-weight: bold;">browser_locale</span>, <span style="color: #c0c0c0; background-color: #000000;">array_keys(</span>$<span style="color: #ffffff; font-weight: bold;">accepted_locales</span>))) {
    $<span style="color: #ffffff; font-weight: bold;">locale_code</span> = $<span style="color: #ffffff; font-weight: bold;">accepted_locales</span>[$<span style="color: #ffffff; font-weight: bold;">browser_locale</span>];
} <span style="color: #00ffff;">else</span> {
    $<span style="color: #ffffff; font-weight: bold;">locale_code</span> = <span style="color: #ffff00;">'en_US'</span>;
}

<span style="color: #ff0000;">// </span><span style="color: #ff0000;">Or, use a URL-based locale designator and a rewrite rule.
</span><span style="color: #ff0000;">// </span><span style="color: #ff0000;">RewriteRule ^(en|es)/(.*) /$2 [PT,E=lang:$1]
</span><span style="color: #ff0000;">// </span><span style="color: #ff0000;">Then, grab that environment variable with PHP.
</span><span style="color: #ff0000;">/*</span><span style="color: #ff0000;">
$locale_code = apache_getenv('lang', true);
if (in_array($locale_code, array_keys($accepted_locales))) {
    $locale_code = $accepted_locales[$locale_code];
} else {
    $locale_code = 'en_US';
}
</span><span style="color: #ff0000;">*/</span>

$<span style="color: #ffffff; font-weight: bold;">locale_entries</span> = <span style="color: #c0c0c0; background-color: #000000;">array(</span>);

<span style="color: #ff0000;">// </span><span style="color: #ff0000;">Load the locale file.
</span><span style="color: #00ffff;">if</span> (<span style="color: #c0c0c0; background-color: #000000;">file_exists(</span>$<span style="color: #ffffff; font-weight: bold;">locale_code</span> . <span style="color: #ffff00;">'.php'</span>)) {
    $<span style="color: #ffffff; font-weight: bold;">locale_entries</span> = <span style="color: #00ffff;">include</span> $<span style="color: #ffffff; font-weight: bold;">locale_code</span> . <span style="color: #ffff00;">'.php'</span>;
}

<span style="color: #ff0000;">/*</span><span style="color: #ff0000;">
These locale entries are loaded from files that return an array.
en_US.php
&lt;?php
return array(
    'WELCOME' =&gt; 'Hello %s!',
    'GOODBYE' =&gt; 'Goodbye!',
);

es_MX.php
&lt;?php
return array(
    'WELCOME' =&gt; '&#161;Hola %s!',
    'GOODBYE' =&gt; '&#161;Adios!',
);

You could store locales in a database as well.
 </span><span style="color: #ff0000;">*/</span>

<span style="color: #ff0000;">// </span><span style="color: #ff0000;">Now, you can create a simple function that will display the correct text.
</span><span style="color: #00ffff;">function</span> <span style="color: #4186be;">locale</span>($<span style="color: #ffffff; font-weight: bold;">locale_entries</span>, $<span style="color: #ffffff; font-weight: bold;">key</span>, $<span style="color: #ffffff; font-weight: bold;">replacements</span> = <span style="color: #c0c0c0; background-color: #000000;">array(</span>)) {
    <span style="color: #00ffff;">if</span> (<span style="color: #c0c0c0; background-color: #000000;">isset(</span>$<span style="color: #ffffff; font-weight: bold;">locale_entries</span>[$<span style="color: #ffffff; font-weight: bold;">key</span>]) &amp;&amp; <span style="color: #c0c0c0; background-color: #000000;">empty(</span>$<span style="color: #ffffff; font-weight: bold;">replacements</span>)) {
        <span style="color: #00ffff;">return</span> $<span style="color: #ffffff; font-weight: bold;">locale_entries</span>[$<span style="color: #ffffff; font-weight: bold;">key</span>];
    } <span style="color: #00ffff;">elseif</span> (<span style="color: #c0c0c0; background-color: #000000;">isset(</span>$<span style="color: #ffffff; font-weight: bold;">locale_entries</span>[$<span style="color: #ffffff; font-weight: bold;">key</span>])) {
        <span style="color: #00ffff;">return</span> <span style="color: #c0c0c0; background-color: #000000;">vsprintf(</span>$<span style="color: #ffffff; font-weight: bold;">locale_entries</span>[$<span style="color: #ffffff; font-weight: bold;">key</span>], $<span style="color: #ffffff; font-weight: bold;">replacements</span>);
    }
    <span style="color: #00ffff;">throw</span> <span style="color: #00ffff;">new</span> <span style="color: #ff7f50;">Exception</span>(<span style="color: #ffff00;">"Locale entry for '$key' does not exist."</span>);
}

<span style="color: #ff0000;">// </span><span style="color: #ff0000;">echo locale($locale_entries, 'WELCOME', array('Anthony'));
</span><span style="color: #ff0000;">// </span><span style="color: #ff0000;">echo locale($locale_entries, 'GOODBYE');
</span>
<span style="color: #ff0000;">// </span><span style="color: #ff0000;">A basic class to handle locales
</span><span style="color: #00ffff;">class</span> <span style="color: #ff7f50;">Locale</span> {

    <span style="color: #00ffff;">public</span> $<span style="color: #ffffff; font-weight: bold;">code</span> = <span style="color: #ffff00;">'en_US'</span>;
    <span style="color: #00ffff;">public</span> $<span style="color: #ffffff; font-weight: bold;">locale_path</span> = <span style="color: #ffff00;">'/var/www/'</span>;
    <span style="color: #00ffff;">protected</span> $<span style="color: #ffffff; font-weight: bold;">_entries</span> = <span style="color: #c0c0c0; background-color: #000000;">array(</span>);

    <span style="color: #00ffff;">public</span> <span style="color: #00ffff;">function</span> <span style="color: #4186be;">setCode</span>($<span style="color: #ffffff; font-weight: bold;">code</span>)
    {
        $<span style="color: #00ff00;">this</span>-&gt;<span style="color: #ffffff; font-weight: bold;">code</span> = $<span style="color: #ffffff; font-weight: bold;">code</span>;
        $<span style="color: #00ff00;">this</span>-&gt;<span style="color: #c0c0c0; background-color: #000000;">load</span>();
    }

    <span style="color: #00ffff;">public</span> <span style="color: #00ffff;">function</span> <span style="color: #4186be;">load</span>()
    {
        <span style="color: #00ffff;">if</span> (!<span style="color: #c0c0c0; background-color: #000000;">file_exists(</span>$<span style="color: #00ff00;">this</span>-&gt;<span style="color: #ffffff; font-weight: bold;">locale_path</span> . $<span style="color: #00ff00;">this</span>-&gt;<span style="color: #ffffff; font-weight: bold;">code</span> . <span style="color: #ffff00;">'.php'</span>)) {
            <span style="color: #00ffff;">throw</span> <span style="color: #00ffff;">new</span> <span style="color: #ff7f50;">Exception</span>(<span style="color: #ffff00;">"Locale file: {$this-&gt;</span><span style="color: #ffffff; font-weight: bold;">locale_path</span><span style="color: #ffff00;">}{$this-&gt;</span><span style="color: #ffffff; font-weight: bold;">code</span><span style="color: #ffff00;">}.php does not exist."</span>);
        }

        $<span style="color: #00ff00;">this</span>-&gt;<span style="color: #ffffff; font-weight: bold;">_entries</span> = <span style="color: #00ffff;">include</span> $<span style="color: #00ff00;">this</span>-&gt;<span style="color: #ffffff; font-weight: bold;">locale_path</span> . $<span style="color: #00ff00;">this</span>-&gt;<span style="color: #ffffff; font-weight: bold;">code</span> . <span style="color: #ffff00;">'.php'</span>;
    }

    <span style="color: #00ffff;">public</span> <span style="color: #00ffff;">function</span> <span style="color: #4186be;">fetch</span>($<span style="color: #ffffff; font-weight: bold;">key</span>, $<span style="color: #ffffff; font-weight: bold;">replacements</span> = <span style="color: #c0c0c0; background-color: #000000;">array(</span>))
    {
        <span style="color: #00ffff;">if</span> (<span style="color: #c0c0c0; background-color: #000000;">isset(</span>$<span style="color: #00ff00;">this</span>-&gt;<span style="color: #ffffff; font-weight: bold;">_entries</span>[$<span style="color: #ffffff; font-weight: bold;">key</span>]) &amp;&amp; <span style="color: #c0c0c0; background-color: #000000;">empty(</span>$<span style="color: #ffffff; font-weight: bold;">replacements</span>)) {
            <span style="color: #00ffff;">return</span> $<span style="color: #00ff00;">this</span>-&gt;<span style="color: #ffffff; font-weight: bold;">_entries</span>[$<span style="color: #ffffff; font-weight: bold;">key</span>];
        } <span style="color: #00ffff;">elseif</span> (<span style="color: #c0c0c0; background-color: #000000;">isset(</span>$<span style="color: #00ff00;">this</span>-&gt;<span style="color: #ffffff; font-weight: bold;">_entries</span>[$<span style="color: #ffffff; font-weight: bold;">key</span>])) {
            <span style="color: #00ffff;">return</span> <span style="color: #c0c0c0; background-color: #000000;">vsprintf(</span>$<span style="color: #00ff00;">this</span>-&gt;<span style="color: #ffffff; font-weight: bold;">_entries</span>[$<span style="color: #ffffff; font-weight: bold;">key</span>], $<span style="color: #ffffff; font-weight: bold;">replacements</span>);
        }
        <span style="color: #00ffff;">throw</span> <span style="color: #00ffff;">new</span> <span style="color: #ff7f50;">Exception</span>(<span style="color: #ffff00;">"Locale entry {$this-&gt;</span><span style="color: #ffffff; font-weight: bold;">code</span><span style="color: #ffff00;">}:$key does not exist."</span>);
    }
}

$<span style="color: #ffffff; font-weight: bold;">locale</span> = <span style="color: #00ffff;">new</span> <span style="color: #ff7f50;">Locale</span>();
$<span style="color: #ffffff; font-weight: bold;">locale</span>-&gt;<span style="color: #c0c0c0; background-color: #000000;">setCode</span>($<span style="color: #ffffff; font-weight: bold;">locale_code</span>);

<span style="color: #ff0000;">//</span><span style="color: #ff0000;">echo $locale-&gt;</span><span style="color: #c0c0c0; background-color: #000000;">fetch</span><span style="color: #ff0000;">('WELCOME', 'Anthony');
</span><span style="color: #ff0000;">//</span><span style="color: #ff0000;">echo $locale-&gt;</span><span style="color: #c0c0c0; background-color: #000000;">fetch</span><span style="color: #ff0000;">('GOODBYE');
</span>
<span style="color: #ffaa00;">?&gt;</span>
</pre>
<p>我希望本文讲述得足够清楚了，能够帮助你养成思考网站访客并最大满足用户的好习惯。我认为绝大多数网站应该使用UTF-8。在项目开始阶段请至少花点时间确保网站是国际友好的。</p>
]]></content:encoded>
			<wfw:commentRss>http://roygu.com/2011/10/php/localization.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何成为骇客</title>
		<link>http://roygu.com/2011/10/other/%e5%a6%82%e4%bd%95%e6%88%90%e4%b8%ba%e9%aa%87%e5%ae%a2.html</link>
		<comments>http://roygu.com/2011/10/other/%e5%a6%82%e4%bd%95%e6%88%90%e4%b8%ba%e9%aa%87%e5%ae%a2.html#comments</comments>
		<pubDate>Tue, 18 Oct 2011 03:15:31 +0000</pubDate>
		<dc:creator>校长</dc:creator>
				<category><![CDATA[杂谈]]></category>
		<category><![CDATA[hacker]]></category>
		<category><![CDATA[骇客]]></category>

		<guid isPermaLink="false">http://roygu.com/?p=1519</guid>
		<description><![CDATA[这文章是Eric Raymond先生的著作, 由Ken LEE翻译成中文 如何成为骇客 为何有这文章? 身为Jargon File的作者, 我常收到热心的网络新秀的电子邮件, 问及&#8221;如何可以成为骇客?&#8221; 奇怪地, 在互联网上像没有文件或FAQ介绍这个重要问题, 所以, 我写了这篇文章. 若你只是离线地阅读本文, 你可到这里阅读本文的最新中文版本. 什麽是骇客 在Jargon File里有数个&#8217;骇客&#8217;的定义, 主要形容&#8221;技术专才&#8221;或&#8221;有志解决问题及超越极限之人士&#8221;.其实要成为骇客, 只有两个要点 最初骇客是形容一班最初使用早期微电脑及ARPAnet实验的专业程式员及网络专才. 他们崇尚共享主义,他们建立互联网,他们建立及发展成现今的Unix作业系统.他们管理Usenet讨论组. 亦是他们令互联网运作.因此, 若你有上述的特性及参与同类的社群,亦有对以上种种作出贡献,同时社群的人知你是谁又称你为骇客, 你便是骇客. 然而,骇客的理念并非只局限於这&#8221;软件&#8221;的社群. 有很多人应用骇客的态度於其他事物,如电子或音乐上&#8211; 实际上,骇客的理念存在於任何科学及文学. 由於了解骇客的理念及精神,软件社群的骇客亦会称后者为骇客. 有些人亦认为骇客的理念是独立於骇客所从事的媒体. 然而, 我们将在这篇文章专注讨论软件骇客的技巧, 态度及传统. 另外, 有一群人亦称自已为&#8221;骇客&#8221;, 他们(多数是年青人)用电脑侵入其他电脑的系统作出破坏.骇客们称这群人为&#8221;破坏者(Cracker)&#8221;, 亦不认同他们为骇客. 多数 骇客会认为破坏者是懒惰, 不负责任, 不杰出的人. 有能力侵入保安系统并不能使你成为骇客, 正如可以用铁线来偷车并不能使你成为工程司一样. 不幸的是很多作家及报导员均称这群人为&#8221;骇客&#8221;. CRACKER 与 HACKER的主要分别是前者破坏, 后者建立. 若你想成为骇客, 请看下去, 若你只想成为CRACKER, 请到alt.2600讨论小组, 准备作出系统破坏. 我相信你不会感到自己是想像中的聪颖. [...]]]></description>
			<content:encoded><![CDATA[<p>这文章是Eric Raymond先生的著作, 由<a href="mailto:leekawo@hotmail.com">Ken LEE</a>翻译成中文</p>
<h1 align="CENTER">如何成为骇客</h1>
<h1>为何有这文章?</h1>
<p>身为<a href="http://www.tuxedo.org/jargon">Jargon File</a>的作者, 我常收到热心的网络新秀的电子邮件, 问及&#8221;如何可以成为骇客?&#8221; 奇怪地, 在互联网上像没有文件或FAQ介绍这个重要问题, 所以, 我写了这篇文章.</p>
<p>若你只是离线地阅读本文, 你可到<a href="http://www.angelfire.com/ok/leekawo/hackersim.htm">这里</a>阅读本文的最新中文版本.</p>
<h1>什麽是骇客</h1>
<p>在<a href="http://www.tuxedo.org/jargon">Jargon File</a>里有数个&#8217;骇客&#8217;的定义, 主要形容&#8221;技术专才&#8221;或&#8221;有志解决问题及超越极限之人士&#8221;.其实要成为<em>骇客</em>, 只有两个要点</p>
<p>最初骇客是形容一班最初使用早期微电脑及ARPAnet实验的专业程式员及网络专才. 他们崇尚共享主义,他们建立互联网,他们建立及发展成现今的Unix作业系统.他们管理Usenet讨论组. 亦是他们令互联网运作.因此, 若你有上述的特性及参与同类的社群,亦有对以上种种作出贡献,同时社群的人知你是谁又称你为骇客, 你便是骇客.</p>
<p>然而,骇客的理念并非只局限於这&#8221;软件&#8221;的社群. 有很多人应用骇客的态度於其他事物,如电子或音乐上&#8211; 实际上,骇客的理念存在於任何科学及文学. 由於了解骇客的理念及精神,软件社群的骇客亦会称后者为骇客. 有些人亦认为骇客的理念是独立於骇客所从事的媒体. 然而, 我们将在这篇文章专注讨论软件骇客的技巧, 态度及传统.</p>
<p>另外, 有一群人亦称自已为&#8221;骇客&#8221;, 他们(多数是年青人)用电脑侵入其他电脑的系统作出破坏.骇客们称这群人为&#8221;破坏者(Cracker)&#8221;, 亦不认同他们为骇客. 多数 骇客会认为破坏者是懒惰, 不负责任, 不杰出的人. 有能力侵入保安系统并不能使你成为骇客, 正如可以用铁线来偷车并不能使你成为工程司一样. 不幸的是很多作家及报导员均称这群人为&#8221;骇客&#8221;.</p>
<p>CRACKER 与 HACKER的主要分别是前者破坏, 后者建立.</p>
<p>若你想成为骇客, 请看下去, 若你只想成为CRACKER, 请到<a href="news:alt.2600">alt.2600</a>讨论小组, 准备作出系统破坏. 我相信你不会感到自己是想像中的聪颖. 我对CRACKER便说到这里为止.</p>
<h1>骇客的态度</h1>
<p>骇客解决问题, 建立事物, 相信自由及共享主义. 要成为骇客及被接受为骇客, 你的行为须&#8221;表现&#8221;出上述的态度. 要&#8221;表现&#8221;上述的态度, 你须&#8221;真正相信&#8221;上述的态度是正确</p>
<p>相信上述的态度并非只认为要被接受为骇客, 而是要使<em>你</em>能学习及保持成为骇客的自发性. 正如其他的创作艺术一样. 学习必须同时著重理念与态度.</p>
<p>所以, 要成为骇客, 仔细了解下列各点, 直至你相信为止:</p>
<h2>1. 世界是有大量有趣的问题是等待解决的</h2>
<p>成为骇客是一件满有趣的事情, 但背后同时要付出努力. 努力却须要自发性. 成功的运动家有强烈的欲望去使自己发挥至极限, 正如骇客必须有欲望去解决问题, 不断加强技术及 运用智慧.</p>
<p>若你并非此类人, 要成为骇客你便需要作出改变. 否则你的骇客生涯及能量只会被性欲, 金钱及社会的既定价值观所消耗, 一点一滴地消耗.</p>
<p>(你亦需有强烈信念, 相信纵使你暂停不能解决整个问题, 只是你能解决其中一部份, 及能从中学习, 你会可以解决另外的一部份 &#8212; 直至解决整个问题)</p>
<h2>2. 没有人应该有需要解决同样问题两次</h2>
<p>你的智慧是一个很有价值, 但同时很&#8221;有限&#8221;的资源. 请不要将这有价值的资源用来&#8221;重新发明车轮&#8221;. 因为有很多其他尚未解决的问题是等待著你的.</p>
<p>要成为骇客, 你必须相信其他骇客的思想时间非常宝贵, 所以你有道德上的责任去分享资讯, 解决问题及将其解决方法分享, 使其他骇客不须再花时间解决同样问题, 而可以用时间解决<em>新</em>的难题.</p>
<p>(你不须相信你必须将<em>所有</em>你的创作分享, 纵使愿意如此做的骇客是最从人专重的.售卖足够的创作以购买食物, 支付租金及使用电脑的费用并不违反骇客的价值观. 运用你的骇客技能养活家庭, 甚至致富亦可以, 只要你做这些事时不要忘记你是一名骇客)</p>
<h2>3. 拒绝沉闷及乏味的事情</h2>
<p>正如一般的创作者, 骇客不应做沉闷及乏味, 愚蠢及反反覆覆的事情. 因为这表示他们不是做著只有他们才可以做的事 &#8212; 解决新问题. 这样实在太浪费了. 因此, 沉闷及乏味的事情对骇客而言不仅只是不良, 而是邪恶的.</p>
<p>要成为骇客, 你必须相信此观念以令你将所有沉闷及乏味的事情尽量自动化, 不止为自己而是为其他人(其他骇客).</p>
<p>(但有时为了锻练, 或获得某种技术及经验, 骇客亦要做那些重复又乏味的事情, 但这是个人选择, 没有一个善於思想的人应被逼做沉闷的事)</p>
<h2>4. 自由</h2>
<p>骇客天生反霸权主义. 若有人可以向你下达命令, 他便足以停止你 &#8212; 停止你去解决一些你认为有意义的问题. 极权主义的人, 由於思想特殊, 会给你一个 极愚蠢的理由去停止你解决这些有意义的问题. 为了不令你和其他骇客窒息, 必须打击霸权主义.</p>
<p>(这并不是向所有权力挑战, 正如小孩需要成人指导, 罪犯须被压抑. 骇客可同意接受某些权力. 但只是有限及有意识地同意接受. 那种极权主义的人所要求的 绝非骇客所能认同)</p>
<p>极权主义者很喜欢&#8221;禁制&#8221;及&#8221;保密&#8221;, 他们不相信自由合作及资讯交流 &#8212; 他们由 接受可以由他们操控的&#8221;合作&#8221;形式. 因此, 骇客必须对抗不合理的禁制, 保密及以暴力或欺瞒压逼人民的手段.</p>
<h2>5. 信念不能替代能力</h2>
<p>作为骇客, 你必须发展上述的态度及拥有其信念, 但有信念不能使你成为骇客, 正如有信念不能使你成为出色的 运动家或摇滚乐手一样. 要成为骇客, 你须付出智慧, 锻炼及勤奋.</p>
<p>因此, 骇客须要相信能力. 任何方面的能力都是好的, 一些只有少数人可领略的才能&#8221;更好&#8221;, 而&#8221;最好&#8221;是一些需 要高度智慧, 技巧及高度集中力的才能.</p>
<p>若你尊敬才能,亦渴望得到 &#8211; - 你所付出的努力将成为乐趣而非沉闷的事情, 这亦是骇客必须拥有的.</p>
<h1>基本骇客技能</h1>
<p>骇客态度固然重要,但骇客技能更重要.态度绝不能替代才能, 因此, 你必须学习一些基本知识才会被称为骇客.</p>
<p>由於科技不断演进,这些基本知识会不断改变.(例如,以前须要机械码才能编写电脑程式,但近来人们却爱用HTML.) 在现在,你需要下列知识：</p>
<h2>1．学如何写电脑程式</h2>
<p>这,当然是最基本的骇客技能.如果你不懂任何电脑程式语言,我便建议你学<a href="http://www.python.org/">Python</a>. 这是一个清楚地设计的,有清析记录语法的,适合初学者的电脑程式语言.虽然它可能是你的第一种学习的电脑程式语言, 但它 绝非一件玩具.它是非常强力,有弹性而又适用於大型项目的电脑程式语言.</p>
<p>但紧记,若你只懂一种电脑程式语言,你不能成为电脑程式员,更遑论成为骇客 &#8211; - 你需要了解程式编写方法, 而且不受任何一种电脑程式语言限制. 因此, 你要学习如何只参看使用者指引, 将其中内容与你所学关联, 便能於数天内学懂一种新的电脑程式语言. 即是你要学习多种不同的电脑程式语言.</p>
<p>如果你对电脑程式要求严格, 你必须学习unix的核心语言&#8211; C (虽然 C 并不应是你第一种学习的电脑程式语言). 其他骇客需要学习的包括<a href="http://www.perl.com/">Perl</a>及<a href="http://snaefell.tamu.edu/%7Ecolin/lp/">LISP</a>. 由於实用性, Perl是值得学的,Perl是广泛地用於Active Web Pages及系统管理上的, 因此就算你不会用Perl来编写程式你亦需学习如何阅读及了解Perl. 至於学习LISP能 给你一个意想不到的宝贵经验, 有助你於日后的日子里写便好的电脑程式, 纵使你可能不会时常用LISP来编写程式.</p>
<p>因此, 你最好完成以上四种电脑程式语言的学习(Python, C, Perl 及 LISP). 除了是最重要的骇客语言, 它们亦代表不同的程式编写方法. 每种语言都从不同方向 使你获得宝贵经验.</p>
<p>我不可能在此教导你如何编写电脑程式, 因为这是一门复杂的技能. 我只可对你说的就是 &#8212; 书本与课程并不有效 (很多,甚或是<em>大多数</em>的骇客 都是自学的). 最有效学习电脑程式是(一)<em>阅读程式码</em> (二)<em>编写程式码</em></p>
<p>学习编写电脑程式就如学习普通语言一样, 最佳方法是阅读一些别人的大作, 然后写一些程式, 再阅读多些, 再写多些 &#8230; 直至你发展出你独有的一套编写电脑程式方法.</p>
<p>寻找好的程式用以阅读和学习是非常困难的, 以往是很缺乏一些比较大型的程式供初学的骇客练习. 但现在情 况已经有所改变;开放程式码的软件, 电脑程式编写工具, 及作业系统(都是由骇客创造)现时是很容易便可以取 得. 正好带领我们到下一个题目 &#8230;</p>
<h2>2．取得一份开放程式码的unix作业系统, 然后学习它.</h2>
<p>我假设你拥有／或者可以使用一台个人电脑(现今的小孩随时都可以很容易地得到 <img src='http://roygu.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> ). 成为骇客的第一步 是在你的电脑上安装一套LINUX或BSD-Unix的作业系统, 及使用它.</p>
<p>当然, 世界上除了UNIX外还有很多其他作业系统, 但它们都是以二进制形式分发的 &#8211; - 你不但不能阅读 那些程式码, 你亦不能改动它们. 在DOS,WINDOWS或MAC 或等作业系统上从事骇客活动, 便像穿著盔甲 学跳舞一样.</p>
<p>另外, UNIX是互联网上的作业系统、 虽然你可以不懂UNIX但仍能使用互联网, 但若你不懂UNIX, 你不能在 互联网上从事骇客活动. 因此, 现今骇客们大多是精於及偏爱UNIX的. (以前的骇客可能不同意, 但互联网 及UNIX的相互关系已令其他 &#8212; 包括微软的作业系统难於取代.</p>
<p>所以, 请安装一套UNIX &#8212; 我个人喜爱LINUX但其实有其他种类的(你<em>可以</em>同时安装LINUX及DOS/WINDOWS在 同一电脑上). 学习它, 使用它, 把玩它. 用它来上互联网. 阅读及改动它的程式码. 它比微软等的作业 系统提供更好的程式工具(包括C, LISP, Python及Perl). 你会得到趣味及学到比你想像更多更佳的知识.</p>
<p>要知多点关於学习UNIX的资料请到<a href="http://www.tuxedo.org/%7Eesr/faqs/loginataka.html">Loginataka</a></p>
<p>要得到LINUX, 请到<a href="http://linuxresources.com/apps/ftp.html">此</a></p>
<p>要知多点关於BSD UNIX 的资料及协助请到<a href="http://www.bsd.org/">www.bsd.org</a>.</p>
<p>(注:若你是初学者,我不建议你独自安装LINUX或BSD. 若你欲安装LINUX,到一些LINUX的使用者团体寻 求协助; 或到<a href="http://www.linpeople.org/">Linux Internet Support Co-operative (LISC)</a>的<a href="http://openprojects.nu/services/irc.html">IRC</a> 频道看看.)</p>
<h2>3. 学习如何用互联网及用HTML来写网页</h2>
<p>大部份骇客所做的事情, 如在工厂及办公室或大学里的工作, 是不会对非骇客做成影响的. 但互联网却是一个例外, 就算<em>政治家</em>都承认互联网是一个足以影响世界的东西.亦由於这原因(及其他种种原因)你要学如何在互联网上工作.</p>
<p>这不是说你要学如何使用浏览器(人人都懂使用..), 我是说你首先要学用HTML来写网页. 若你根本不懂写程式,用HTML来写网页可帮助你得到一些程式编写的基本概念.</p>
<p>可是写网页仍不足够, 在互联网上有很多网页, 但大部份是没有方向, 明显地没有内涵的网页. (你大可到<a href="http://www.tuxedo.org/%7Eesr/html-hell.html">The HTML Hell Page</a>看看)</p>
<p>所以, 你的网页一定要有<em>内容</em>□必须是有趣的及/或有用的(对其他骇客), 这便是我在下一个题目要说的..</p>
<h1>骇客社群的身份</h1>
<p>像大部份非谋利的社群, 骇客以名誉为重. 你会尝试解决有趣的问题, 但问题是否有趣及你的解决方法是否有效, 却只有其他具有技能的骇客们可以去品评.</p>
<p>因此, 要玩骇客这个游戏, 你要以其他骇客对你的观感作为自己的评价. (正如我说你不是骇客,除非其他骇客亦称你为骇客).不过这事实却有时被人误解, 因为他们多以为骇客是孤独地工作的人.</p>
<p>人类学家称骇客为<em>贡献社群</em>. 骇客得到地位及名誉并非来自强於他人的权力, 亦非由於外表美丽, 或有异於常人的能力,而是源於施与.清晰地说,是将你的时间, 创意及创意的结果贡献他人.</p>
<p>基本上, 你可以贡献5方面的东西以获得其他骇客的尊重：</p>
<h2>1. 编写公开程式码的软件</h2>
<p>首先(最传统及基本的方法), 是编写一些其他骇客认为有趣又有用的程式, 而且将程式码公开.</p>
<p>(人们以前会称此类程式为”免费软件”, 但由於太多人将”免费软件”的意义误解. 现时大部份人称此类程式为<a href="http://www.opensource.org/">公开程式码</a>的软件) 　 骇客界最受人尊重的圣者是一些编写大型, 功能强劲而又很有用的公开程式码软件, 供其他人使用.</p>
<h2>2. 帮助他人测试及除错公开程式码的软件</h2>
<p>在这不完美的世界, 人们无法避免花很长的时间用於测试及为软件除错. 因此, 很多公开程式码软件的作者都会高度评价那些好的程式测试员 (可以清楚表达程式错误表徵,程式错误位置,能接受软件在开发期间的暂时性错误及继续测试). 一个好的程式测试员可以使如恶梦的测试及除错工作变为一件值得经历的小烦恼.</p>
<p>若你是初学者, 你可以找一些正在开发阶段而你又感兴趣的程式来做测试及除错. 当你懂得测试及除错, 你自然会学习更改程式.这样,你不单可以学习, 亦可以与其他专家建立良好的关系,而他们亦很可能会於未来给予你帮助.</p>
<h2>3. 发行有用的资讯</h2>
<p>另外一点是你可以收集及挑选有用的资讯并制成网页或FAQ(常问问题), 以供诸同好.</p>
<p>技术性FAQ的经营者往往很多人的专重, 如同编写公开程式码的软件的专家一样.</p>
<h2>4. 帮助系统运作</h2>
<p>骇客社群(特别是互联网的发展者)是由自愿者组成的. 当中有大量必须但平淡的工作须要有人去处理 &#8212; 例如管理电子邮件,监察讨论小组,经营大型程式的储存网站,及发展技术性标准等.</p>
<p>做以上工作的人得到很多人的专重, 因为人人都知道此种工作是很花费时间但又不如编写程式般有趣.此等工作须要使命感.</p>
<h2>5. 为骇客社群服务</h2>
<p>最后,你可以为骇客社群服务及传扬(例如你可以写一篇如何成为骇客的文章 <img src='http://roygu.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> ). 通常你不会做这些工作,直至你已做了以上四种的工作的其中一样.</p>
<p>骇客社群没有一个既定的领导者, 但却有为人尊重的英雄及长老级人物等发言人. 当你在此有一段时间的经验,你可能会成为其中的英雄或长老.但记著,骇客社群对傲慢的自我中心者并不认同, 所以不要成为如斯的领导人物.你不应追求成为领导人物, 你应了解自己的方向及以谦虚的心来看自己的地位及身份.</p>
<h1>骇客与怪客的关系</h1>
<p>与传说不同,骇客并不一定是怪客, 但有很多骇客却实在是怪客. 通常社会不甚认同的怪客会有更多时间习中思考及从事骇客活动.</p>
<p>因此,很多骇客都以怪客为名, 并以此表示自己独立於社会一般的观念. 你可看<a href="http://samsara.circus.com/%7Eomni/geek.html">这里</a>得到更多此等讨论.</p>
<p>若你可以集中精神从事骇客活动, 做得又好而又可以维持生命, 实在是很难得的事. 比起70年代来说现在做骇客是比较容易的了.人们亦开始了解骇客其实是高质素的人才.</p>
<p>但若你是由於太苦闷而做骇客的话, 我亦欢迎你, 最少你可以比较专心地从事骇客活动, 可能有一天你会得到人生的乐趣.</p>
<h1>其他事项</h1>
<p>我想再说一次,若你要成为骇客,你必需要有骇客的理念. 就算你不是在电脑前面你亦可以做以下与此理念有关的事情.当然,没有事情可以取代骇客的电脑活动.</p>

<ul>
<li>阅读科技故事,参与科技会议(在场内很可能遇到其他骇客)</li>
<li>学习禅及工夫武术 (理念与骇客的理念在很多方面相近)</li>
<li>发展分析音乐的听觉.学习欣赏特定的音乐,学习以一种或以上的学器, 学习唱歌.</li>
<li>学习欣赏文字及双关语</li>
<li>学好你本土的语言(有很多骇客都是有能的作家)</li>
</ul>
<p>多做以上的行为,你更容易成为骇客, 可能因为上述的行为是会将左脑及右脑的混合使用 (骇客需要以理性分析事情及於一瞬间以逻辑以外的思考来处理有关工作)</p>
<p>最后,一些你<em>不</em>应做的事情</p>
<ul>
<li>不要用愚蠢,浮夸的User ID或假名</li>
<li>不要卷入Usenet及其他讨论的骂战</li>
<li>不要自称为’电脑流氓’,亦不要与此类人交往</li>
<li>不要发放有大量错字或错文法的电子邮件及电子讨论</li>
</ul>
<p>若你做出上述的事情, 你将会得到很坏的名誉, 骇客有很好的记性, 你最期的所作所为会令你将要经过多年才可以被其他骇客接受.</p>
<p>用假名的问题值得我们深思. 将身份隐藏是小孩子的做法,另是Cracker, warez d00dz 及其他低等生物的特徵. 骇客不会做这些事; 他们对自己的创作及行为表示骄傲,因此爱用<em>真</em>名. 因此, 若你现在用假名, 请你立即放弃. 在骇客社群里只会将用假名的人视为失败者.</p>
<h1>其他的资源</h1>
<p>Peter Seebach维护著一个很好的<a href="http://www.plethora.net/%7Eseebs/faqs/hacker.html">骇客 FAQ</a>供不懂处理骇客的人士阅览. 若上述超连结没有反应你可到<a href="http://search.excite.com/search.gw?search=%22HACKER+FAQ%22+%2Bseebach&amp;tsug=-1&amp;c+sug=10">Excite 搜寻器</a>来寻找</p>
<p><a href="http://www.tuxedo.org/%7Eesr/faqs/loginataka.html">Loginataka</a>有一些关於Unix骇客的训练和应有态度的资料</p>
<p>本人亦写了一个 <a href="http://www.tuxedo.org/%7Eesr/faqs/hacker-hist.html">有关骇客社群的简短历史的网页</a></p>
<p>我亦写了一篇文章, 名为<a href="http://www.tuxedo.org/%7Eesr/writings/cathedral-bazaar/index.html"> The Cathedral and the Bazaar,</a> 以解释有关Linux及开放式程式码等的文化. 我亦在续篇<a href="http://www.tuxedo.org/%7Eesr/writings/homesteading/">Homesteading the Noosphere</a>一文中再将此题目直接地说明</p>
<h1>常问问题</h1>
<h2>问: 你会否教授我如何成为骇客 ?</h2>
<p>自从写了这个网页, 我每星期(有时每天有数次)收到上述的要求, 可惜的是我并没有时间及精力去教人如何成为骇客. 我自己所从事的骇客活动已用了我 110%的时间.</p>
<p>就算我有时间, 骇客本身是一种态度及技巧你要自我学习. 你会发现真骇客们很愿意提供协助, 但若你只是不断地像婴儿般要求□养, 他们不会尊重你</p>
<p>所以, 你应先学一些基本知识. 表现出你是正在尝试, 及你有能力自学. 接著才与骇客们讨论特殊的难题.</p>
<h2>我要如何开始?</h2>
<p>最好先到LUG(Linux 用家小组)讨论. 你可以在<a href="http://metalab.unc.edu/LDP/intro.html">LDP General Linux Information Page</a>找到此类小组; 很多时你可以找到一个接近你的小组, 多数是大学提供的. LUG的成员可能会提供一套Linux给你, 及教你如何安装及开始.</p>
<h2>你会否教我如何破解系统, 或教我破解术?</h2>
<p>我不会. 任何已阅读此FAQ而仍问此问题的人实在是太愚蠢及不能教导(就算我有时间教导) 任何此类电子邮件会被忽略或以粗暴语气回答</p>
<h2>我的系统刚被破解. 你会否帮我防范再被破解 ?</h2>
<p>不会. 每次我收到这类要求的, 都是用视窗作业系统的. 基本上是不可能有效地防止视窗作业系统被破解; 因为这作业系统有太多的程式及结构缺点, 就像要用筛子来将船划动一样.只有转用Linux等有真正安全的作业系统方可解决这个问题.</p>
<h2>在那儿可以与真骇客通讯?</h2>
<p>最好是找一个你本区的Unix或Linux的讨论小组, 并参与讨论(你可以在 <a href="http://sunsite.unc.edu/LDP">LDP</a>的网页找到超连结)</p>
<p>我曾说在IRC(网上即时讨论小组)不能找到真骇客, 但我发觉现在情况有所改变. (现时有些真骇客亦在GIMP及Perl等的网上即时讨论小组出现.)</p>
<h2>你可否介绍一些有关骇客的有用书籍?</h2>
<p>你可到本人维护的<a href="http://sunsite.unc.edu/LDP/HOWTO/Reading-List-HOWTO.html"> Linux Reading List HOWTO</a>看看,<a href="http://www.tuxedo.org/%7Eesr/faqs/loginataka.html"> Loginataka</a>亦有相关的资料．</p>
<h2>我应先学那种程式语言?</h2>
<p>若你不懂HTML, 你应先学它. 在坊间有很多<em>不好</em>的HTML书,　好的HTML书却很少. 我本人最喜欢 <a href="http://www.oreilly.com/catalog/html3/">HTML: The Definitive Guide.</a></p>
<p>但HTML并不是完全的程式语言. 当你有心理准备开始学写程式, 我提议你学<a href="http://www.python.org/">Python.</a>可能已有很多人提议你学Perl, 而事实上Perl是比Python更多人用. 但对初学者来说, Perl比较难学. 而且(我认为)Perl的设计比不上Python.在网上有很多<a href="http://www.deja.com/getdoc.xp?AN=523189453">Python的资讯</a>供初学者.</p>
<p>C语言是非常重要, 但比Python及Perl更难学. 不要以它为起点.</p>
<p>对於视窗作业系统的用家, 请你们<em>不要只学</em>Visual Basic. 它会使你得到坏的编写程式习惯, 亦并不能於不同的作业系统平台使用. 尽量不要用它.</p>
<h2>问: 但编写开放式程式的人会否不能赚钱过活?</h2>
<p>看来不会 □ 直至现在, 开放式程式工业是在创造就业机会而非减少就业机会. 若成功编写一个程式是经济正收益,程式编写员, 无论是开放式或非开放式的, 亦可得到薪金. 另外, 无论有多少的开放式程式, 亦有更多需求新的及度身订做的应用程式.我在<a href="http://www.opensource.org/">Open Source网页</a>有更详尽的解说.</p>

<h2>问: 我应如何开始, 我在那里可以很到免费的Linux ?</h2>
<p>在这网页的其他地方已有超连结带你到可以得到免费Unix的地方. 要成为骇客, 你需要有主动性, 自发性及自学能力. 现在开始吧….</p>
<p>Eric S. Raymond的电子邮号esr@snark.thyrsus.com</p>
]]></content:encoded>
			<wfw:commentRss>http://roygu.com/2011/10/other/%e5%a6%82%e4%bd%95%e6%88%90%e4%b8%ba%e9%aa%87%e5%ae%a2.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>原来不用ajax也可以这样做</title>
		<link>http://roygu.com/2011/09/html/we-can-do-it-without-ajax.html</link>
		<comments>http://roygu.com/2011/09/html/we-can-do-it-without-ajax.html#comments</comments>
		<pubDate>Thu, 15 Sep 2011 11:20:51 +0000</pubDate>
		<dc:creator>校长</dc:creator>
				<category><![CDATA[html]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[iframe]]></category>

		<guid isPermaLink="false">http://roygu.com/?p=1511</guid>
		<description><![CDATA[原来在提交表单时我们不一定要用ajax，在最近的项目中碰到一类避免写ajax的好方法，特别是在对表单处理时非常有效。每个页面放一个隐藏的iframe，然后不管是a标签还是form的target都指向该iframe，后端处理之后返回内容都在iframe中，然后就你可以在iframe中操纵父窗口的元素了，请看下面这个示例： &#60;script language=&#8221;javascript&#8221;&#62;if (parent) {parent._form_exception(&#8220;email&#8221;, &#8220;邮箱不能为空&#8221;);}&#60;/script&#62;]]></description>
			<content:encoded><![CDATA[<p>原来在提交表单时我们不一定要用ajax，在最近的项目中碰到一类避免写ajax的好方法，特别是在对表单处理时非常有效。每个页面放一个隐藏的iframe，然后不管是a标签还是form的target都指向该iframe，后端处理之后返回内容都在iframe中，然后就你可以在iframe中操纵父窗口的元素了，请看下面这个示例：</p>
<p>&lt;script language=&#8221;javascript&#8221;&gt;if (parent) {parent._form_exception(&#8220;email&#8221;, &#8220;邮箱不能为空&#8221;);}&lt;/script&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://roygu.com/2011/09/html/we-can-do-it-without-ajax.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>原来method_exists等方法不区分大小写</title>
		<link>http://roygu.com/2011/09/php/%e5%8e%9f%e6%9d%a5method_exists%e7%ad%89%e6%96%b9%e6%b3%95%e4%b8%8d%e5%8c%ba%e5%88%86%e5%a4%a7%e5%b0%8f%e5%86%99.html</link>
		<comments>http://roygu.com/2011/09/php/%e5%8e%9f%e6%9d%a5method_exists%e7%ad%89%e6%96%b9%e6%b3%95%e4%b8%8d%e5%8c%ba%e5%88%86%e5%a4%a7%e5%b0%8f%e5%86%99.html#comments</comments>
		<pubDate>Thu, 15 Sep 2011 11:12:21 +0000</pubDate>
		<dc:creator>校长</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[method]]></category>

		<guid isPermaLink="false">http://roygu.com/?p=1507</guid>
		<description><![CDATA[今天突然回头想想刚开发完项目的新功能，好像我新增的action都是以双单词出现的，如：actionNewUser，但是在Router中只是简单的对URL中action做ucfirest(strtolower($action))处理，百思不得其解，这尼玛怎么就能找到该action呢？　但是事实往往是红果果的，经过测试发现method_exits和call_user_func_array等方法不区分方名法大小写。 千言万语不如上一图： 原来是我了解得不够，下次一定记得，哈哈，还大惊小怪的！！！！ 一、大小写敏感 1. 变量名区分大小写 2. 常量名默认区分大小写，通常都写为大写 3. php.ini配置项指令区分大小写 二、大小写不敏感 1. 函数名、方法名、类名 不区分大小写，但推荐使用与定义时相同的名字 2. 魔术常量不区分大小写，推荐大写 3. NULL、TRUE、FALSE不区分大小写 4. 类型强制转换，不区分大小写，包括： * (int)，(integer) – 转换成整型 * (bool)，(boolean) – 转换成布尔型 * (float)，(double)，(real) – 转换成浮点型 * (string) – 转换成字符串 * (array) – 转换成数组 * (object) – 转换成对象]]></description>
			<content:encoded><![CDATA[<p>今天突然回头想想刚开发完项目的新功能，好像我新增的action都是以双单词出现的，如：<code>actionNewUser</code>，但是在Router中只是简单的对URL中action做<code>ucfirest(strtolower($action))</code>处理，百思不得其解，这尼玛怎么就能找到该action呢？　但是事实往往是红果果的，经过测试发现method_exits和call_user_func_array等方法不区分方名法大小写。</p>
<p>千言万语不如上一图：<br />
<a href="http://roygu.com/2011/09/php/%e5%8e%9f%e6%9d%a5method_exists%e7%ad%89%e6%96%b9%e6%b3%95%e4%b8%8d%e5%8c%ba%e5%88%86%e5%a4%a7%e5%b0%8f%e5%86%99.html/attachment/class_method_cas" rel="attachment wp-att-1508"><img class="alignleft size-thumbnail wp-image-1508" title="class_method_cas" src="http://roygu.com/wp-content/uploads/2011/09/class_method_cas-640x150.jpg" alt="" width="640" height="150" /></a></p>

<p>原来是我了解得不够，下次一定记得，哈哈，还大惊小怪的！！！！</p>
<p>一、大小写敏感<br />
1. 变量名区分大小写<br />
2. 常量名默认区分大小写，通常都写为大写<br />
3. php.ini配置项指令区分大小写</p>
<p>二、大小写不敏感<br />
1. 函数名、方法名、类名 不区分大小写，但推荐使用与定义时相同的名字<br />
2. 魔术常量不区分大小写，推荐大写<br />
3. NULL、TRUE、FALSE不区分大小写<br />
4. 类型强制转换，不区分大小写，包括：<br />
* (int)，(integer) – 转换成整型<br />
* (bool)，(boolean) – 转换成布尔型<br />
* (float)，(double)，(real) – 转换成浮点型<br />
* (string) – 转换成字符串<br />
* (array) – 转换成数组<br />
* (object) – 转换成对象</p>
]]></content:encoded>
			<wfw:commentRss>http://roygu.com/2011/09/php/%e5%8e%9f%e6%9d%a5method_exists%e7%ad%89%e6%96%b9%e6%b3%95%e4%b8%8d%e5%8c%ba%e5%88%86%e5%a4%a7%e5%b0%8f%e5%86%99.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP下载：解决中文文件名乱码</title>
		<link>http://roygu.com/2011/07/php/php-download-solving-the-chinese-file.html</link>
		<comments>http://roygu.com/2011/07/php/php-download-solving-the-chinese-file.html#comments</comments>
		<pubDate>Fri, 29 Jul 2011 08:54:46 +0000</pubDate>
		<dc:creator>校长</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[chinese]]></category>
		<category><![CDATA[download]]></category>
		<category><![CDATA[utf-8]]></category>

		<guid isPermaLink="false">http://roygu.com/?p=1497</guid>
		<description><![CDATA[通过把Content-Type设置为application/octet-stream， 可以把动态生成的内容当作文件来下载，相信这个大家都会。 那么用Content-Disposition设置下载的文件名， 这个也有不少人知道吧。 基本上，下载程序都是这么写的： &#60;?php $filename = "document.txt"; header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . $filename); print "Hello!"; ?&#62; 这样用浏览器打开之后，就可以下载document.txt。 但是，如果$filename是UTF-8编码的，有些浏览器就无法正常处理了。 比如把上面那个程序稍稍改一下： &#60;?php $filename = "中文 文件名.txt"; header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . $filename); print "Hello!"; ?&#62; 把程序保存成UTF-8编码再访问，IE6下载的文件名就会乱码。 FF3下下载的文件名就只有“中文”两个字。Opera 9下一切正常。 输出的header实际上是这样子： Content-Disposition: attachment; filename=中文 文件名.txt 其实按照RFC2231的定义， 多语言编码的Content-Disposition应该这么定义： Content-Disposition: attachment; filename*="utf8''%E4%B8%AD%E6%96%87%20%E6%96%87%E4%BB%B6%E5%90%8D.txt" 即： filename后面的等号之前要加 * filename的值用单引号分成三段，分别是字符集(utf8)、语言(空)和urlencode过的文件名。 最好加上双引号，否则文件名中空格后面的部分在Firefox中显示不出来 [...]]]></description>
			<content:encoded><![CDATA[<p>通过把Content-Type设置为application/octet-stream， 可以把动态生成的内容当作文件来下载，相信这个大家都会。 那么用Content-Disposition设置下载的文件名， 这个也有不少人知道吧。 基本上，下载程序都是这么写的：</p>
<pre>&lt;?php
$filename = "document.txt";
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $filename);

print "Hello!";
?&gt;</pre>
<p>这样用浏览器打开之后，就可以下载document.txt。</p>
<p>但是，如果$filename是UTF-8编码的，有些浏览器就无法正常处理了。 比如把上面那个程序稍稍改一下：</p>
<pre>&lt;?php
$filename = "中文 文件名.txt";
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $filename);

print "Hello!";
?&gt;</pre>
<p>把程序保存成UTF-8编码再访问，IE6下载的文件名就会乱码。 FF3下下载的文件名就只有“中文”两个字。Opera 9下一切正常。</p>
<p>输出的header实际上是这样子：</p>
<pre>Content-Disposition: attachment; filename=中文 文件名.txt</pre>
<p>其实按照<a href="http://tools.ietf.org/html/rfc2231" target="_blank">RFC2231</a>的定义， 多语言编码的Content-Disposition应该这么定义：</p>
<pre>Content-Disposition: attachment; filename*="utf8''%E4%B8%AD%E6%96%87%20%E6%96%87%E4%BB%B6%E5%90%8D.txt"</pre>
<p>即：</p>
<ul>
<li>filename后面的等号之前要加 *</li>
<li>filename的值用单引号分成三段，分别是字符集(utf8)、语言(空)和urlencode过的文件名。</li>
<li>最好加上双引号，否则文件名中空格后面的部分在Firefox中显示不出来</li>
<li>注意urlencode的结果与php的urlencode函数结果不太相同，php的urlencode会把空格替换成+，而这里需要替换成%20</li>
</ul>
<p>经过试验，发现几种主流浏览器的支持情况如下：</p>
<div>
<table border="0" cellspacing="1">
<tbody>
<tr>
<td>IE6</td>
<td>attachment; filename=&#8221;&lt;URL编码之后的UTF-8文件名&gt;&#8221;</td>
</tr>
<tr>
<td rowspan="2">FF3</td>
<td>attachment; filename=&#8221;UTF-8文件名&#8221;</td>
</tr>
<tr>
<td>attachment; filename*=&#8221;utf8&#8221;&lt;URL编码之后的UTF-8文件名&gt;&#8221;</td>
</tr>
<tr>
<td>O9</td>
<td>attachment; filename=&#8221;UTF-8文件名&#8221;</td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
</tbody>
</table>
</div>
<p>这样看来，程序必须得这样写才能支持所有主流浏览器：</p>
<pre>&lt;?php

$ua = $_SERVER["HTTP_USER_AGENT"];

$filename = "中文 文件名.txt";
$encoded_filename = urlencode($filename);
$encoded_filename = str_replace("+", "%20", $encoded_filename);

header('Content-Type: application/octet-stream');

if (preg_match("/MSIE/", $ua)) {
	header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
} else if (preg_match("/Firefox/", $ua)) {
	header('Content-Disposition: attachment; filename*="utf8\'\'' . $filename . '"');
} else {
	header('Content-Disposition: attachment; filename="' . $filename . '"');
}

print 'ABC';
?&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://roygu.com/2011/07/php/php-download-solving-the-chinese-file.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

