<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
<channel>
<title>Soulogic</title><link>http://soulogic.com/blog/</link><description>硬盘里埋藏着我的光荣与梦想，我要用键盘把他们挖出来</description><language>zh-cn</language><generator>Soulogic Weblog beta 2007.02.26</generator><lastBuildDate>Fri, 26 Jun 2009 20:44:41 +0800</lastBuildDate><image><link>http://www.feedburner.com</link><url>http://photos21.flickr.com/24215204_f9e77ac1e1_o.jpg</url><title>This Feed Powered by FeedBurner.com</title></image><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/soulogic" type="application/rss+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><item><title>可怜的还是凡人</title><link>http://soulogic.com/blog/archives/368.html</link><dc:creator>Platinum</dc:creator><category>铂 Platinum</category><guid>08bdd273d93e54e7f9c51539e4cbb80b</guid><pubDate>Thu, 25 Jun 2009 03:51:59 +0800</pubDate><comments>http://soulogic.com/blog/comments/368.html</comments><slash:comments>0</slash:comments><trackback:ping>http://soulogic.com/blog/trackback.php?368</trackback:ping><description><![CDATA[<p>如果你见过外面的那些世界，你会想尽各种方法重见光明，用 ssh -D，用 tor，或者别的什么方式，可怜是那些不会穿墙的民众，他们在被糊弄成傻子的同时还要对他们的主子感恩戴德，想想那个朝鲜纪录片里刚被做完白内障手术就径直走向伟大的金日成主席像的东西们，他们到底更接近人还是更接近牲口？</p><p>曾经在丹东呆过几年，当时还在上初中的我偶尔拿着望远镜看着对面的朝鲜新义州，还没有意识到我正在近距离观察着世界上最神秘的国家，街道上没有行人，烟囱（虽然在丹东这头，旧式的烟囱已经几乎消失了）里没有烟。后来才知道，正是那几年，朝鲜还在闹饥荒，每年都要饿死数十万人。荒诞到可笑，却又笑不出来，五十步百步而已，我们没有像金正日那样父传子、或者像卡斯特罗那样兄传弟，我想解放后的几代人的命运是否应该感激那架 B-29</p><p>虽然水煮青蛙的例子并不真实，但是可以肯定，文火肯定可以煮熟青蛙的。想到即将来临的黑夜，期盼光明的重新到来实在太远了点。我恐惧的不是今天被封的这几个小时，而是我之前真的没有想到过现在的一切限制措施还只是开始，欲望没有满足的时候，不受约束的权利只会得寸进尺的不断循环。我们也算经历了十余年乏善可陈的互联网史，我见证了 xys google sourceforge wiki flickr blogspot youtube 的封了又解解了又封，但相比即将加深的痛楚，之前的经历已经不算什么了</p><p>忘了哪个港片里的一情节，两个黑帮几十号人坐一起都假装很乐呵，突然某帮一个新出道的小弟由于缺乏经验，不小心把家伙掉地上了，气氛变得凝重而搞笑，就是现在这种效果。</p><p>如果没有现实的朝鲜做例子，就算再多的历史典故也不会让我产生这种惊讶，我以为这种情况是不可能发生的——“你当那几千万人都是傻子么”，现在我只能遗憾的说，看起来是这样。为何我要为凡人操心？什么是我所说的凡人？举个例子，大概是 04 年的时候，我曾经的一个同事，在用 google 的时候碰到了“Connection reset by peer”，他不无嘲讽的说 google 被他搜挎了，他的意思是他的无敌关键词耗费了 google 大量的资源，google 撑不住，服务器垮了，被他一个人搞垮了，可见 google 有多烂，还是用 baidu 好，他几次这么说之后我不得不很认真的去确认他的意思，“你到底是在开玩笑，还是真的这么认为？”（其实这都不用问，人们可能会天天抱怨同一件事情，但不会天天讲同一个笑话）。进而在今天这个时候，我不得不做更多设想，如果一两年后 GFW 的工作卓有成效，五六年后人们该如何认识互联网？就像我那个傻逼同事如何认识 google 一样？或者哪怕说现在，又有几个人能数过来有多少事情被压制、淡化掉了？你今天能知道有个石首骚乱，或者往日的几起屈指可数的事件，也不过是百密一疏而已，还真有人以为这是民众的胜利、互联网的胜利了，就好像真以为是八路军把日本鬼子赶出中华大地的。就算能穿墙的，也千万别以为自己能独善其身，按照传统情节，当一个村庄被诅咒的时候，全村人都好不了</p><blockquote><p>斯布雷斯，你说……我们都是凡人吧？</p><p>干嘛突然问这个？你不知道法师最讨厌的就是承认这个吗！</p></blockquote><p>我经常说自己是“不加掩饰的恶毒”，没想到这些人比我更不加掩饰，就好比，你要跟法院打交道了，你本以为法官会跟你说几句黑话，暗示你这事要多少钱才能办成，结果真等见面的时候，法官二话不说很熟练的掏出张菜单一样的东西，明码标价、井井有条，这时候你晕菜不？当 CCAV 推出这么傻逼的《很黄很暴利》第二季并且毫不在意人们谈论那个倒霉的实习生的时候，我被这种简单明了的直白搞的很晕</p><blockquote><p>答：（坚定地）帝国将连同其所有长处一齐消逝。累积的知识会散失，而既存的秩序会崩溃。星际战争永无休止，星际贸易则无法进行；人口剧减而大批星球将脱幅而去，和银河主体失去连系。——剩下的就什么也没有了。</p><p>问：（一片寂静中的微小声音）永远？</p><p>答：心灵历史学能够预见灭亡，也能描绘接踵而来的黑暗时代。帝国，各位，正如前述，屹立了一万两千年；而将来的黑暗时期则会持续不止一万两千年，而是三万年。第二帝国将会兴起；但在两个帝国之间，将有一千个世代的人类在受苦受难。我们必须为这些人奋斗。</p></blockquote><p>“战争即和平，自由即奴役，无知即力量”</p><p>真理部万岁！你们全家都万岁！操你妈的</p><p><img src="http://rss.soulogic.com/track/368" /></p>]]></description></item>
<item><title>确保大家都不是 SB，包括自己</title><link>http://soulogic.com/blog/archives/367.html</link><dc:creator>Platinum</dc:creator><category>铂 Platinum</category><guid>0b2be78f90b8d37892d50a99b5761a9f</guid><pubDate>Mon, 15 Jun 2009 01:22:34 +0800</pubDate><comments>http://soulogic.com/blog/comments/367.html</comments><slash:comments>0</slash:comments><trackback:ping>http://soulogic.com/blog/trackback.php?367</trackback:ping><description><![CDATA[<p>已经在不同的地方看到两次这种问题了（可能更早碰到过的没太注意，我相信也有），简单的说就赏罚混乱。</p><p>比方说，一些人被安排集体做某件事，可能做的很糟糕——因为各种原因，比方说目标不明确，员工之间不配合，等等，如果不承认这件事已经做砸了，可以找个可笑的借口说延期了（过了 deadline 就是 death，但我见过很多事情连个明确的时间安排都没有），但我说的碰到过两次这种难以琢磨和容忍的事情是，这个时候居然请大家吃饭！</p><p>在所有的改善状态的方法里，在这种不恰当的时机聚餐是最错误的选择。这颇有些游戏风格，比方说 KOEI 的《三国志》或者类似的游戏里，所有的问题都简化成几个整数甚至自然数，如果某人忠诚度不够，你赏他件宝物马上就忠诚度 100 了，跟我说的问题比较相似的操作，叫大宴群臣。在游戏里可以这么干，但在现实中这么干简直就是小学生的思维。作为一个主管可以去琢磨为什么效率不高，哪个环节需要被改进，可以有勇气把所有错误承担下来，说归根结底是自己领导不利。不去追究其他人的责任已是最大的宽容，但是对着一个失败的事情摆庆功宴，在我看来是匪夷所思。这是在向员工传达错误的信息，他们会想“哇，我做的这么烂都可以得到主管的认可，他的要求还挺低的嘛”，我相信他们不会去怀着感激的心态，只会认为他们的主管是老好人或者是 SB（其实两者差不多）</p><p>大概是在去年的这个时候？在我为一个项目扰的很烦躁并认为那个方案根本就是个错误的时候，突然有一天中午收到通知，所有项目组同仁去吃金钱豹自助！我真的被震惊了</p><p>提出去吃自助的主管在我看来并没什么问题，如果大家都是聪明人、心知肚明的话，最简单的理由“反正花的又不是我的钱”。这种人很多，用一个很不敬的比喻，这不是蛀虫，这是蝗虫，人家根本不在乎公司的运营情况，反正换工作也不是很麻烦的事情。我只能认为更上一级的批准此事的主管被耍了（或者更上级，总有人要为此买单吧）</p><p>有一个公司我虽然没呆多久，但是正好赶上了年会，我非常敬仰的蔡总在年会上就是这么很直白的说，本来之前的打算是全公司集体去沿海城市旅游，但是最终只是在办公楼所在的地下餐厅办了场自助，因为我们今年做的并不好，离预期差了很远。食物很丰盛，也有抽奖等环节，简单的说年会办的并不寒碜，但是最重要的信息已经传达到了：“再这么下去很危险，所有人都需要努力了”</p><p>把这种事情延伸开，我想说下个人不太光彩的经验。</p><p>我从小到大撒过很多次谎（仔细计算数量的话，真的很多，而且我相信所有人都如此），我相信有些谎很巧妙，可能我临场发挥不会很好但提前精心安排的话还称得上是成功的，但是，我几乎从来没骗成过我妈。作为家长，这真的很难做到，我见过很多人把自己家长涮的跟孙子似的，但是不管大谎小谎我妈都能轻易识破。我从小学骗到初中，最终我放弃了，相对于我了解的其他同学，我对我妈说的事情可能比任何孩子对母亲透露的都多，我可以隐瞒一些事情不说，她也知道我在隐瞒并允许我保留自己的秘密，但我没法对她说谎</p><p>反过来讲，我认为很多家长的教育太失败，根本原因就是被自己孩子涮了，在最初一些谎言成功后，孩子的策略已经不是对父母的策略而是对一个“熟人”的策略，之后就是失控，家长已经把握不定孩子到底是怎么想的了。我拿一个真实而夸张的例子，初中的一任班主任讲的，我们班里有一个最无可救药的问题儿童，他的母亲有一次在车站碰到了班主任，便打个招呼问候一下，顺便寒暄到他的孩子在学校表现还好么，班主任很无奈的说，不知道，我已经有半年多没见到他了。但类似的例子还有不少，虽然没这么糟糕，比方说进京念书或者出国念书的，有很多糟蹋父母钱的垃圾，已经多到见怪不怪了。</p><p>能让我明白诚实有多重要，不是因为被灌输多强的道德观念，而是在我妈面前失败了足够多次数后承认现实，明白撒谎的代价和后果，这才是最强的约束力。单单教育子女说“天外有天”或者“出来混迟早要换的”，孩子只能明白句子的语法结构，但明白不了深层含义。所谓诚实与否，不是说一个人从来不撒谎，而是说撒谎的底线是什么、会为什么样的事情撒谎。</p><p>跟人相处，心照不宣应该算是一种不错的状态。</p><p><img src="http://rss.soulogic.com/track/367" /></p>]]></description></item>
<item><title>特权俘虏</title><link>http://soulogic.com/blog/archives/366.html</link><dc:creator>Platinum</dc:creator><category>铂 Platinum</category><guid>199913a070f22cfffb3c4ffeab25198a</guid><pubDate>Fri, 05 Jun 2009 01:51:52 +0800</pubDate><comments>http://soulogic.com/blog/comments/366.html</comments><slash:comments>1</slash:comments><trackback:ping>http://soulogic.com/blog/trackback.php?366</trackback:ping><description><![CDATA[<p>最近看的两部电影和一本书，很凑巧，有些相通的地方，而且这三部作品对这个问题都是点到为止。</p><p>这个问题是在看完电影<a href="http://www.douban.com/subject/2213597/">《朗读者》</a>后看的一篇评论<a href="http://www.douban.com/review/1694706/">杀人犯在我们当中</a>，觉得很有收获，其结尾是这样写的</p><blockquote><p>普利摩·李维曾说：“所有幸存者的回忆都不可靠，不全面，因为他们有幸活到解放。而活得那么久是因为他们比别人喝多一口水，吃多半块面包，甚至可以做轻微一点的苦工，他们是特权俘虏……特权俘虏是集中营人口中的少数，却是幸存者中的多数。他们甚至把反抗的囚犯的头压进汤锅里活活淹死。纳粹让这些人满身罪恶，满手血腥，尽可能地受到牵累，建立起强烈的共犯关系……这些犹太人连自己人也不放过，只是为了多活一个礼拜。这才是集中营的真面目，不只杀人，而且毁灭灵魂。”</p><p>“其实能侥幸能活过集中营的这些人，其实并不是真正的见证人。他们其实并未陷落地狱底层。那些真正掉入底层的人，那些亲见蛇蝎恶魔之人，不是没能生还，就是从此哑然无言。”</p><p>不了解这些，我们会跟我们的上一代同样盲目。</p></blockquote><p>以至于看<a href="http://www.douban.com/subject/2381810/">《伪钞制造者》</a>时，留意了这个问题</p><p>前几天看完米兰·昆德拉的《玩笑》，中间有这么一段</p><blockquote><p>但是《绞刑架下的报告》怎么讲？只有伏契克才能写出它！</p><p>而那些缄口不言的英雄又怎么讲？那些英雄不需要把他们最后的时刻变成一个壮观、公开的讲演。伏契克，尽管那是根本没有名气，却认定把他在监狱里的所思所感和所经历的事情告诉世人，给人类留下一些具有概括性的名言是非常重要的。于是他在碎纸片上把这些话全部都潦草地写出来，让那些把纸片偷带出狱，并妥善保存它们的人去冒生命危险。想一想他对那些思想和印象肯定会有的想法吧！想一想他对自己肯定会有的想法吧！</p><p>现在他说得太出格了。难道伏契克只不过是个自负的夸夸其谈者吗？</p><p>然而没有什么能阻止卢德维克。不，他回答道，那不是驱使伏契克写作的主要原因。主要原因是他的软弱。因为私下表现得勇敢，没有目击者，没有承认，只是面对着自己——这样做需要超乎寻常的尊严和力量。而伏契克却需要一个观众。他在单人牢房幽闭中给自己创造了一个虚构的观众。他需要被人瞧见！让掌声来支持他。如果不是真的，那就是虚构。他需要把他的单人牢房变成一个舞台，要使他的命运变的可以忍受，就的表演它，描绘它，而不是仅仅经历它！</p></blockquote><p>我觉得前面那段评论中的“盲目”这个词用的好。这是群氓和贱民们的显著特征。正是盲目带动了狂热，盲目才是根源，让乌合之众们被教唆、被蛊惑、甚至心甘情愿的去自杀。智力是人和动物的显著差别，在面对死亡的时候，需要尽最大努力搞明白事情的因果关系，换做是我，无论如何也不会甘心去做别人的垫脚石，自尊心不能接受如此。死者没有尊严，广场上的一坨烂肉没有尊严，有些人奉之为英雄和烈士，在我看来这些烂肉或者还会动的肉全都是成就他人名望的垫脚石，抑或是名人随手捡起并抛出去的石子、被淘汰掉的失败基因、进化论的实例。</p><p>看看谁会慷慨激昂的悼念那些可笑的卒子，都成了我和刘涛寻找下一个傻逼粪青的乐趣所在，去年和今年各有一个</p><p>有句话一直想记下来，一个很老的闷片<a href="http://www.imdb.com/title/tt0068182/">《阿基尔，上帝的愤怒》</a>，我当初是在《看电影》上看到关于这个片子的介绍的，其中的一句评语吸引了我去下载来看了个究竟</p><blockquote><p>而整次远征，可以看成人类如何被幻想迷惑，被欲望引导，被独裁控制，直到走向死亡的全过程</p></blockquote><p><img src="http://rss.soulogic.com/track/366" /></p>]]></description></item>
<item><title>关于 RO（上）</title><link>http://soulogic.com/blog/archives/365.html</link><dc:creator>Platinum</dc:creator><category>游戏 Game</category><guid>c0853d255e07364bdc1010fbc6fa7790</guid><pubDate>Thu, 28 May 2009 17:51:18 +0800</pubDate><comments>http://soulogic.com/blog/comments/365.html</comments><slash:comments>0</slash:comments><trackback:ping>http://soulogic.com/blog/trackback.php?365</trackback:ping><description><![CDATA[<p>引子</p><p>游戏里有个叫“商人”的职业，可以跟 npc 砍价以更便宜买到东西。比方说一种人人都要喝的补给品血瓶，商人买需要 36 元（说的是游戏币），其他人买需要 40 元，那通常这东西的价格是 38 元。为了取得更好的销量，我通常放到人们更需要的地方，比方说同样一杯水，在超市里和在沙漠里的价格是完全不同的。于是我跟 foolfish 吹嘘，我说我以 41 元的价格放练级地点附近，照样能卖出去，说明我很有头脑。foolfish 说，这没什么，你摆 400 也能卖出去，因为总会有人走眼，当成 40 给买走。我以为他在开玩笑，于是恶作剧一样的把价格改成 400。</p><p>过一会，我发现居然卖掉了两瓶，恶作剧成功，我笑的很疯狂，接着又切换会大号继续练级了。因为游戏客户端可以开好几个，因此我通常开两个，一个用来在正常玩，另一个额外挣点生活费，因为卖东西只需很简单的几下设置把商店开起来后，就相当于一个自动售货机。很快我已经忘了刚才的事情，等过了一个来小时后，我呆住了，之前的那个恶作剧不是偶然，我已经卖掉了数十瓶，身上的现金已经是我之前财产的两倍多，而手推车里还有大半货物没卖出去呢。</p><p>这时候绝对不是恶作剧那么简单了，居然会有这么多人忽略了实际的价格，按照通常的习惯来买东西。利润比从 12% 变为 1011%，这真的很疯狂。我停止了打怪，给商人号的手推车里补满了血瓶，然后去睡觉了。</p><p>等我在醒来，手推车空空如也，我身上已经有三十多万游戏币了。感觉良好，请祖国人民放心。</p><p>序</p><p>话说为了吸引人读我特意错开一下时间顺序。上一段讲述的是在我玩这个游戏的第二天时的情形，之前 foolfish 不断的跟我说这个游戏有多好玩。被他说烦了，正巧看到他的 ftp 上有游戏的光盘镜像，我说我会下载这个游戏，玩上 5 分钟，然后退出并告诉你你在玩一个多么弱智的游戏。因为之前的网络游戏刚刚开始脱离 MUD 的纯文字界面，以至于虽然都是图形的，但都是很粗糙的图形，做工完全无法和单机游戏相提并论。以至于在这之前，当 Blizzard 在 Warcraft 3 还未完成时就要做一款网络游戏时，我认为它是在是走一部臭棋。我对拥有 Battle.net 的 Blizzard 态度尚且如此，更何况一款韩国网游。</p><p>结果显而易见，我非常认可这个游戏的画面和音乐，并让我当时还没见过面的老婆也来玩。由于她家里是 56k modem，无法下载游戏，在我的指导下她成功拆开机箱、取出硬盘带到网吧、在网吧下载游戏并拷进硬盘、带回家装回机器、开始游戏。我对这一系列操作非常满意。这个游戏我玩了大概两年半，期间换了三次住址，断断续续的一直在玩。</p><p>骗子</p><p>我是说我是骗子，这毫无疑问。虽然有些同行还在试图为自己开脱，他们是这么定义的，如果你的商店招牌上写着“红水 40”而实际点开买卖菜单是 400，那你是骗子，如果你的招牌上写的是“出售大量红水”，那就没有说谎，也就不是骗子。这些解释有点恶心，我完全是更流氓的态度：我就是骗子，又怎么样？无论如何，这笔初始资金让我迅速的追上了先我一个多月开始玩这个游戏的“老玩家”，让我的装备和他们一样好。另一方面，我认为在钻游戏的空子，首先我用来正经游戏的账号和我用来骗钱的账号是分开的，被骗的人再气愤也无从追查，而游戏提供商是不会参与这种纠纷的，因为具体给一件商品定价多少完全是玩家自己的事情，哪怕最糟糕的情况，我的骗子号被查封了，但我绝大部分钱都已经转走了。</p><p>这就是现实世界和游戏的区别，最直白的道理，银行有很多钱你不敢碰，因为警察有枪。我也不是说游戏是恶棍横行的乐园，其实每个人损失的数额并不大，只是受骗的人很多，而且时间一长，效仿的人也多了，大家也都锻炼出警惕性了，这时候这种小把戏已经无利可图。但骗子这个话题比较持久，主流的声音一直在谴责这种游戏行为，并且有很多激动的人将其延伸到现实中玩家的品德之类。我只是认为这是游戏的一部分。就像很多人在游戏中杀人，你不能认为这些人都是现实中的杀人犯，那也太多了点。而且我一直相信道德是被约束出来的，而不是自发的。</p><p>现金</p><p>事实整个游戏里正处于刚刚发展的荒蛮时期，你可以想象，假设你是一个庞大部落的领袖，也未必会比至少有电视机看的现代社会底层人群过的更好。而我当时把大部分钱都用在了购买一个叫黑蚂蚁夹子的东西上，简单的说，而游戏的过程中大家都有可能受伤，由于职业设定里只有“牧师”这一个职业可以治疗，或者买补给品自己恢复，但牧师非常稀少，而补给品有重量不能携带太多，还需要花钱。黑蚂蚁夹子这样道具可以让你像牧师一样使用治疗法术，虽然是最低级，但在不时很危机的时候也足够了，所以非常抢手。在我要离开哈尔滨准备去北京之前，我给我老婆买到了一个，希望我不能上网的那段时间她可以玩的更轻松一些。</p><p>去北京我是举目无亲，投奔的是我老婆原来的一个同学，之前他们是三个人合租。几天后安置妥当，进游戏里溜达了一圈，发现有人在北京收黑蚂蚁夹子，出价 200 人民币。我合计了一下身上的现金，认为卖掉身上的这个后马上可以再买一个，于是就卖掉了带在身上的这个现货。买的人是开车来到我住的小区的，他本人不玩，给他女朋友买的。当交易成功并留下 200 块钱后，身边的几个人都很惊讶，我对这事的触动也很深，虽然之前玩 diablo 2，知道很多海外华人都在做着国际贸易（跟中国人用人民币购买装备，再卖成美元，最好的情况大约有两三倍的利润，一件好点的装备在几百到几千人民币不等），也目睹过 ebay 上成排的待售游戏装备。但让我真正感受到这些，还是在这个非典的春天。</p><p>顺便说一句，打算去北京的时候，广州已有非典，已经能在某些论坛上看到网友上传的城市街头的照片，个个带口罩的气氛很恐怖，几天后哈尔滨的板蓝根价格疯涨，等到了北京没多久就已经出现超市被抢购的只剩一排排空架子的景象。于是我就名正言顺的宅在住所里。几个人合钱掏网费，由于无事可做、作息时间不一样，所以 ADSL 一直连着，当时北京还没有包月，那个月的 ADSL 费用好像是一千三，总之那 200 块又填回去了。</p><p>外挂</p><p>之前对外挂的认识还局限于变速齿轮，而且对网上下载的东西也不放心，担心有病毒。直到 foolfish 告诉我他自己用过的证实确是好使的东西，而且这东西居然是用 Perl 写的、开源的、sourceforge 上注册了项目，叫 Kore。能自己编译的东西，就算看不懂也比其他的更放心一些。</p><p>外挂的功能就是代替你游戏，把那些重复的劳动省去，但这并不能和 FPE 之类的修改工具相提并论。很多人的论调是，外挂毁了这个游戏。但对于 RO 这个特定的游戏来说，外挂所导致的结果反而是转移并提升了这个游戏的重心。在一开始玩家们扮演的是这个游戏中的平民，有了外挂以后变得不平衡，使用外挂的人比其他人更富有、装备更精良、等级更高，但到了几乎所有人都使用外挂的时候，我觉得整个游戏倒更像是人人都是富有的领主，而领地和奴隶则是外挂们，一个人的在线时长基本决定了他的富有程度，在后期的工会战中，一个全力拼搏的玩家需要消耗大量的补给品，如果没有那几倍于玩家数量的外挂（你可以理解为机器人）在辛勤劳作的话，战斗不会如此激烈有趣。</p><p>漏洞</p><p>游戏漏洞有很多种，有些属于愚蠢，例如一款叫《精灵》的游戏，在运行时游戏会不断的抢占焦点，通俗点说当你切换到其他程序后马上又会回到游戏里，开发者以为靠这种小伎俩能阻止用户使用修改游戏内容，比方说你身上的物品数量或者是钱币数，而他们又不明白，Windows 是一个支持多窗口多用户的操作系统，于是这个游戏成为历史上唯一一个可以用古老的 FPE 就可以修改的网络游戏。</p><p>RO 的漏洞属于另一种，与其说是考虑不周，我更倾向于评价他懒惰。用户在游戏交互的过程中，很多信息只做了客户端验证，而没有做服务器验证，以至于这个游戏运行了几个月后终于有人发现，在用外挂跟别人交易的时候，你所输入的数量是负数，而服务器接受了这个数量。而某些特定的物品在交易时，物品的图案又会使那个负号更不容易分辨清楚。这最终导致骗子在卖东西的时候，手里拿到钱，而对方拿不到货——还在骗子手里。这个漏洞是 foolfish 告诉我的，他当时身在深圳，在上海服务器玩，而我是在北京服务器，这个漏洞在北京服还没有被传播的人尽皆知。于是利用这个漏洞，我的总资产又翻了几倍，直到我确信能骗过的都骗过了、几乎没有多少人会来上钩了。</p><p>和上次骗人一样，我还有些得意洋洋。大部分人都太容易上钩了，当他们迫不及待的跟我交易的时候，我不禁想嘲笑他们，当你们看到一个明明值 700 万游戏币的衣服只贱卖 300 万（虽然相对来讲，当时还是只有很富有的人才能买的起的东西）时，你们就那么倾向于相信你们碰到的是一个不懂行情的菜鸟，而愿意多看一眼是不是陷阱？（只有一人看出了这个猫腻）</p><p>进而延伸到现实，每当看到电视节目里受害者哭诉骗局多么高明、索套下的多么深的时候，我都更愿意相信，骗子的伎俩绝不是百发百中，更可能是百发一种，绝大数正常理智的人会回避开，骗到那些又蠢又贪的人。</p><p>刘老板</p><p>曾经玩 Diablo 2 的时候，因为玩的角色是女巫，所以常去一个叫 WindRose 战队的论坛，这个战队的特点是全部由女巫和亚马逊战士这两个女性角色组成，当然，玩家都是爷们。刘老板是这个战队的，之前不是很熟，只知道他开着卖游戏软件和周边的实体店铺。当 RO 测试期结束、开始正式收费的时候，他在以内部优惠价出售月卡，我虽然没能转为 WindRose 的正式队员，但还是借光跟他买到便宜月卡。后来偶有联系，多为寒暄，直到有一天他问我有没有时间帮他卖游戏里的东西，我没能想象他有多少贵重的东西，只是觉得很麻烦、可能无利可图，便让他跟我老婆联系，她在家可以帮忙试试。</p><p>当我回到家的时候，我老婆兴奋的告诉我她身上的游戏币是怎样的一个天文数字，我也同样很惊奇。原来刘老板交给我老婆十几样极品托她带卖。所谓的极品，是极靠运气才能从某些稀有怪物身上得到的东西，如果你不是中大奖一般亲自打到，而是从其他玩家手里购买的话，大概需要你在游戏里努力挣一年的钱。仅仅一件，就是称得上一名普通玩家在游戏里“一生”的梦想，而我们很奇怪刘老板怎么会有这么多，而且显然这不是他的全部家当，这有些不可思议。我俩只能猜测他是在游戏早期从其他不识货的新手手中购得。</p><p>很意外，刘老板并没有做什么掩饰，而是毫无保留的告诉了我全部的奥秘（之后很多新想出来的点子也都是如此）。通常，游戏里每种怪物都有相当数量，但是有些怪物被特意安排为整个游戏里只有一个，而且它们会有独一无二的样子、以及有可能掉落一些只有它才会掉的宝贝。比方说有个叫天使发夹的头饰，需要杀一种叫天使波利的可爱怪物，掉落率只有几分之一，而这种怪物被杀死后，需要间隔 8 小时才会再次出现，按照设计者的想法，平均每隔几天，整个世界才会增加一个新的天使发夹，从而一直保持它的稀有度。但是偏偏游戏还有“盗贼”这么个角色，他可以使用偷窃技能，所能偷出来的东西也就是被杀死后掉落的出来的东西，于是他用非常低的成本打造了一个级别很低的盗贼，不是像别的玩家那样增强攻击力，而只增加“幸运”这个属性。于是当一群人浩浩荡荡的追杀天使波利的时候，他只一心的使用偷窃，天使波利死后一旦掉落天使发夹，还需要有特别的运气抢到它，因为抢的人很多，而他的方法则可以保证几乎每天都有一个天使发夹到他自己手里，有时候甚至是两个。</p><p>没有人会这么玩盗贼，因为只加幸运值的盗贼没有任何战斗力，几乎就是个废物。但没有人能想到这种别出心裁的玩法能打造出一只天天下金蛋的母鸡。后来我们也有幸看到刘老板的外挂在偷天使发夹的情形（仅仅是看到也很不容易，因为要杀它的人太多，通常还没找到他就已经被别人杀掉了）。</p><p>刘老板让我老婆帮着带卖他的那些极品，同时付给我老婆 15% 的报酬，这迅速让我们也有了多的花不完的游戏币。</p><p>交易</p><p>几个月以后，游戏里碰到了一些很不愉快的事，关键问题不在于事情本身，而是因此对那些曾经认为是一起游戏的战友很失望。我为了表示跟他们脱干净关系，说把我的账号卖掉。但我没想到卖的这么快，仅在发出消息几个小时后，一个乳臭未干的大学生骑了三十里地自行车来跟我当面交易。我觉得作为一个还没有收入的学生，每个月花三十块月卡钱玩个游戏很正常，但花 600 块钱买一个游戏账号就很败家了。</p><p>由于决定做的太快，以至于账号卖完了之后我才渐渐明白都发生了什么。我觉得之前在游戏里碰到的那些人很糟糕，但我觉得这个游戏还是很好玩的，特别是外挂本身就很好玩了。身上的游戏币（之前卖的只是游戏角色本身，不包括其他贵重物品）也没有什么消费的地方，干脆卖成人民币吧。我们核算了一下大概的价值，起码有一千五，比账号贵出不少。至于刘老板，他一直都是在卖游戏币，因为他有实体店铺，因此既有信誉保证又有足够客源</p><p>那段时间的乐趣转为外挂本身，不断打造新的角色、尝试新的劳动地点，看什么地方产钱效率最高。当然刘老板提到的那些方法和地点，从来敬而远之，避免有冲突。为了方便交易，我们办了几乎所有银行卡及网上银行业务。鉴于我老婆之前卖极品的良好声誉，还算顺利。我使用外挂的方法都是很常规的方法，不需要对游戏本身花太多精力研究，保证一个我能接受的收入水平即可。比方说，有一段时间我把所有的那七八个账号都调集到某处打披肩，游戏里的一件披肩如果换算一下，大约值人民币五毛，当时很稳定的每天产七十个左右，我就满足了。过年的时候，我俩买了一件 ONLY，一件 U2。老婆说，这是她买过的最贵的衣服。当时我的月薪只有区区三千块，去了房租和吃饭几乎不剩什么。因此平时对生活的改善和这两件衣服，都可以认为是她在游戏里挣到的。</p><p>交易的人是各式各样的。比方说有一位要求一定要某特定银行转账，待交易完成后他说他就是某银行职员，如果我们赖账他可以立刻冻结我们的账户，而且以前确实这么对付过骗子，骗子只好乖乖交出他要的游戏币才解冻。最冒险的是有一个不大的小姑娘，十四五的样子，居然也冒冒失失的坐城铁来到我们这郊区当面交易，她运气好，碰到的是我老婆。因此对后来各种媒体上报道的网友见面产生的淫秽案件之类的实在是不足为奇。最让我后怕的是一次接近半夜，三个小伙子开车过来当面交易，等他们走了才后怕，要是把游戏币抢了连报案都没法报，我在我看来游戏里的货币数字和存折里的数字，除了汇率不同，没有其他区别。</p><p>单人从我们这里买过游戏币最多的，就是前面所说的银行职员，前后买过大约八千（一部分是刘老板的，后来卖的顺了也在帮他把游戏币转人民币，之前只是游戏道具转游戏币），而且听其语气，还在其他人手里买过。我们实在是无法想象玩这么一个游戏会花费上万元，而且交谈中得知其赠送过价值起码两三千的游戏货币和道具。</p><p>我想把这个问题说大点，单就 RO 这个游戏来说，游戏外的现金交易额已经远大于游戏本身的点卡销售额，再减去点卡中所包含的运营成本、版权费用，实际上赚到钱的不是游戏公司本身，而且这个新诞生的灰色产业链。所以盗号产业才如此疯狂，那是巨大的金钱利益驱使；所以后来有那么多的“免费游戏”，由游戏公司本身提供游戏道具的现金买卖。当然，那都是后话了。</p><p><img src="http://rss.soulogic.com/track/365" /></p>]]></description></item>
<item><title>求解惑：为什么 18 位身份证的校验最后要除 11 而不是 10</title><link>http://soulogic.com/blog/archives/364.html</link><dc:creator>Platinum</dc:creator><category>代码 Coding</category><guid>7db7fd3ae307a8c3fe01b23de24c549f</guid><pubDate>Wed, 27 May 2009 14:38:03 +0800</pubDate><comments>http://soulogic.com/blog/comments/364.html</comments><slash:comments>4</slash:comments><trackback:ping>http://soulogic.com/blog/trackback.php?364</trackback:ping><description><![CDATA[<p>最近才需要做这个功能，才明白这个问题。18 位身份证的最后一位是校验位，取之前 17 位每一位乘以对应系数的和，得到个大整数，最后除以 11，得 0 - 10 这 11 个数，如果是 10，身份证上用 X 代替。</p><p>可能是我选的关键词有问题，以至于搜了好久也没能解开我的疑惑，为什么要除 11 而不是 10，如果除 10，身份证上将不再有 X，那会有更大的适用性。例如，在数据库里可以作为大整数而不是字符串存放，又比方说计算器那类很弱的液晶屏有些只能显示数字不能显示字母。我搜了半天只搜到很多人有跟我一样的疑问，却没有人能正经回答这个问题。</p><p>我搜到的回答，都是在解释“为什么会有 X”，这很好解答，“因为除以 11 后有可能余 10，所以用 X 代替 10”。但我的问题是“为什么要除以 11，而不是 10”，这是两个问题，所答非所问。</p><p>小张说设计身份证的人不至于这么简单的问题都绕不开，一定有更深层原因，比方说某些惯例、规范之类的。可在我看来除 10 的好处远大于 11 的。我也希望设计者不是 SB，但我实在想不出原因了，在表示谨慎的怀疑的同时求解</p><hr align="left"><p>Update 感谢所有热心解答的朋友，希望得到更多的解答，<a href="/blog/comments/364.html">你可以在这里留言</a></p><p>网友 卷心菜 给出的解释是这是 ISO 标准，我看了下这个 <span style="font-weight: bold;">ISO 7064:1983, MOD 11-2</span>，搜出的结果都是跟身份证有关的，我怀疑这是中国提交到 ISO 的标准，而非沿用 ISO 的已有标准，而且还没到最终原因上</p><p>网友 <a href="http://blog.fulin.org/">tangfl</a> 的解释是因为 11 是质数，所以碰撞几率更小。还没怎么细想，感觉这种简单的 hash，在 MOD n 时碰撞几率就是 1/n，应该跟是不是质数没关系。也可能是我思维还没跟上去</p><hr align="left"><p>另附身份证校验的 PHP 函数，如果像我一样之前没接触过的可以快速了解一下。</p><div class="phpcode"><span style="color: #0000BB">&lt;?PHP<br /></span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">checkIdentity</span><span style="color: #007700">(</span><span style="color: #0000BB">$sIdentity</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(</span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #0000BB">$sIdentity</span><span style="color: #007700">)&nbsp;!=&nbsp;</span><span style="color: #0000BB">18</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">FALSE</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$sVerify&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">"10X98765432"</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$aWeight&nbsp;</span><span style="color: #007700">=&nbsp;array(</span><span style="color: #0000BB">7</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">9</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">10</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">5</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">8</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">4</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">2</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">1</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">6</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">3</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">7</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">9</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">10</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">5</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">8</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">4</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">2</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(</span><span style="color: #0000BB">$aWeight&nbsp;</span><span style="color: #007700">as&nbsp;</span><span style="color: #0000BB">$iOrder&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000BB">$iWeight</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$iVerify&nbsp;</span><span style="color: #007700">+=&nbsp;</span><span style="color: #0000BB">$sIdentity</span><span style="color: #007700">[</span><span style="color: #0000BB">$iOrder</span><span style="color: #007700">]&nbsp;*&nbsp;</span><span style="color: #0000BB">$iWeight</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(</span><span style="color: #0000BB">$sVerify</span><span style="color: #007700">[</span><span style="color: #0000BB">$iVerify&nbsp;</span><span style="color: #007700">%&nbsp;</span><span style="color: #0000BB">11</span><span style="color: #007700">]&nbsp;!=&nbsp;</span><span style="color: #0000BB">$sIdentity</span><span style="color: #007700">[</span><span style="color: #0000BB">17</span><span style="color: #007700">])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">FALSE</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;还有些别的判定，户籍编号、日期合法性之类的，略<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">return&nbsp;</span><span style="color: #0000BB">TRUE</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></div><p><img src="http://rss.soulogic.com/track/364" /></p>]]></description></item>
<item><title>杂念 2009.05.14</title><link>http://soulogic.com/blog/archives/363.html</link><dc:creator>Platinum</dc:creator><category>铂 Platinum</category><guid>e998de7e24afd2fdc667a56c83798969</guid><pubDate>Thu, 14 May 2009 00:34:25 +0800</pubDate><comments>http://soulogic.com/blog/comments/363.html</comments><slash:comments>0</slash:comments><trackback:ping>http://soulogic.com/blog/trackback.php?363</trackback:ping><description><![CDATA[<p>最近开始看美剧了，<a href="http://www.imdb.com/title/tt1235099/">《别对我说谎（Lie to me）》</a>感觉一般，但总比《Lost》那种无聊SB封建迷信片子要好吧。松鼠会里虽然也有<a href="http://songshuhui.net/archives/12130.html">介绍</a>，但实在说的是太浅了，没什么价值，我更希望看到像那堆<a href="http://songshuhui.net/archives/1479.html">批判《豪斯医生》</a>的文章。</p><p>我不太喜欢其中的故弄玄虚，即归纳出一个表情，然后放点克林顿、尼克松、一些美国近代著名公案的被告们的相同表情。这太片面了。就像算命书里，关于算名字的，告诉你怎么选字，然后说些王侯将相事业多NB，因为他门的名字符和我算命经里哪条哪条，其实这些规矩正是专门为这些名人修正过的啊。就像《实话实说》刚开办不久，有次节目嘉宾是最早在媒体上揭露圈圈邪教的一名记者，说了个事，那些教徒要跟他理论，跟他说你知道雷锋吧，雷锋行善就是因为他信圈圈，记者回敬他们说，你这完全是逻辑错误，比方说你爹是白胡子老头，你不能说白胡子老头都是你爹。</p><p>当然导演是聪明人，他知道哪些是娱乐大众的，哪些是说事的（再岔开，《贫民窟的百万富翁》这种道德败坏的宿命论片子能成奥斯卡最大赢家，基本上是因为那些学院教授都相信人民是SB）。这个片子给我的提示是，要如何克制那些微小的表情和举动，要训练自己，虚弱的时候脸应该像打过肉毒素一样，让别人琢磨不透你到底在想什么，特别跟很聪明的人谈话的时候。虽然两样我都不会，但我觉得控制表情比控制持刀歹徒更难炼就。就像以前看唐骏的人物特写，连口头禅都能戒，这事让我琢磨好久，一个人自制力如此，真的很可怕。</p><hr align="left"><p>最近两年多遇到的两个对我来说很重要的人，都很无奈的说我很坦率（按我自己的形容，直白得令人尴尬）。我觉得更糟糕的是，我不认为这是错的。我知道，很多人喜欢当爷，我也不是没装过孙子，但很多时候没有去做那些我认为最正确的选择。这和人类为什么会<a href="http://songshuhui.net/archives/13005.html">自杀</a>一样让人费解。</p><p>对话可能是这样开头的，“我打算说的这个事，可能你会觉得这个不错，做出很赞赏的表情，也可能心理在想，这傻逼都说了些什么胡言乱语，这都无所谓，只要你知道我想的是什么就好，怎么判断是你的事情”</p><blockquote><p>其实你知道我昨晚最后的念头是什么么</p><p>干好了，大家都有肉吃，退一步讲，就算没干成，你也欠我个人情（我是比较自负，认为出了问题自己不会是拖后腿的那个），将来给我闺女找学校的时候你起码能指点我一下钱往哪送</p></blockquote><hr align="left"><p>最近读了一本书，<a href="http://www.douban.com/subject/1148282/">《计算机程序的构造和解释（Structure and Interpretation of Computer Programs）》</a>，说实话没看多少，只看了几十页，越看越费力，绝对不适合在地铁或者厕所里阅读。但必须对所有程序员吐血推荐此书。而作为一本美国教材，这种教育差距挺让人绝望的，因为你永远没法假设中国能有几所大学会用这本教材作为本科教材（我不想做没有建设性的抨击，说谭浩强爷爷一个人教你 BASIC、Fortran、Cobol、Pascal、C …………等等等等，有多不好）。但一个学生能在大二之前读通此书的话，真可以说前途无量。</p><hr align="left"><p>最近看的值得一提的电影是《谍影重重》三部曲。我憎恨剧透，简单说两句不太透的：我很奇怪前两部的 IMDB 评分没上 8。很励志，可以教教小男生什么叫有型。很聪明，就像以前看过的一句对《疯狂的石头》的评价：“这是一部不侮辱观众智商的电影”，其实看到聪明的电影跟看到聪明的人一样，你第一眼就能认出来。我在试字幕挂没挂上的时候看了个半分钟画面，之后就认定这个片子一定要看。</p><p>还好，我是今年才知道这部片子，不然要知道有三部非急死。</p><hr align="left"><p>发现自己有很多强迫症状，很怀念那个强迫症电视剧<a href="http://www.imdb.com/title/tt0312172/">《神探阿蒙（Monk）》</a>，可以理解为《雨人》偏正常人版，只不过片子太老就算有人去下最初的几季可能也没什么源了。</p><p><img src="http://rss.soulogic.com/track/363" /></p>]]></description></item>
<item><title>针对应届生的 PHP 面试题</title><link>http://soulogic.com/blog/archives/362.html</link><dc:creator>Platinum</dc:creator><category>代码 Coding</category><guid>7260550885f7a329f16e21f1ed3c91c1</guid><pubDate>Sun, 10 May 2009 15:21:32 +0800</pubDate><comments>http://soulogic.com/blog/comments/362.html</comments><slash:comments>7</slash:comments><trackback:ping>http://soulogic.com/blog/trackback.php?362</trackback:ping><description><![CDATA[<p>为什么要招应届生？不是因为便宜，有人说还没跳过槽的人忠诚度能搞些，这也不尽然，有些人没经受过工作的压力，总以为自己碰巧找到个压力大的工作，换换会好些。我的原因是……应届生好调教。在他们没有被各种枯燥乏味的工作折磨的以为写程序本来就这么 SB 之前好好洗洗脑子。</p><hr align="left"><p>1、2、3 是基础题，4、5、6 问的是数据库操作，7 算是综合能力吧。</p><p>1. 进制运算</p><p>可以是让他模拟一些简单的字符串函数，类似 bin2hex、base_convert、base64_encode，或者单纯的，让他手动算一下 7 进制的 54321 显示为 9 进制是多少。</p><p>应该高中或者之前就能接触到 2 进制 10 进制之间的换算了吧，当然，他当时很可能没听懂。通常的情况，如果以前没留意这个问题但有理解能力的，可能能在几分钟的做出一些成功不成功的尝试。至少不应该很茫然。最糟糕的情况，连整数的最大值是多少都不知道，那就算了。</p><p>2. 描述一下常见的关于读取文件内容的操作，及各自的特点</p><p>应该不用迟疑太久就把 file、fopen、file_get_contents、readfile 列出来。表现好点还可以提下 readfile 的流式读取不占内存之类的。如果看的教材太老，可能只会说 fopen。最糟糕的辩解是不说跟数据库打交道比较多，文件操作没怎么接触过，完全无视文件静态化的存在。</p><p>3. 怎么模拟一个 POST 表单提交</p><p>答 socket 或者 cURL 都可以。</p><p>4. 列举一些常规优化方式</p><p>正确索引（就不强求完全理解多列索引了，最好能知道每个查询只能用到一个索引），知道索引提高查询速度、降低插入速度。正确的字段类型（能知道 char 和 varchar 的区别和优缺点）。text 类字段可以单放一个表用主键关联。总之他能说的越多越好。顺便问问他他所知道的最大处理能力是每秒多少条，哪怕是测试环境里的 benchmarking（今天看到份简历，号称三年工作经验，将半个月三万条插入形容为他所遇到的最高的负载，写在简历的醒目位置）。</p><p>5. “你知道，把时间存在数据库里有两种方法，一种是用时间戳，就是 PHP 函数 time() 产生的那种整数，另一种是 MySQL 里字段类型设成 datetime。那么，为什么一定要后一种方式？”</p><p>最简单的一个例子，如果存的是时间戳，你无法按类似“所有周三的数据”这种方式显示内容。这表明了他的学习阶段：是否接触了类似日志分析类的东西。因为这些是早晚都要接触到的。</p><p>6. 简单联表查询</p><p>有这么两个表</p><p>user 表：</p><p><span style="font-family: 'Courier New';">id &#160;name<br />1 &#160; 张三<br />2 &#160; 李四<br />3 &#160; 王五<br />4 &#160; 赵六</span></p><p>apple 表：</p><p><span style="font-family: 'Courier New';">id &#160;user &#160;number<br />1 &#160; 1 &#160; &#160; 5<br />2 &#160; 3 &#160; &#160; 3<br />3 &#160; 1 &#160; &#160; 8<br />4 &#160; 4 &#160; &#160; 6<br />5 &#160; 3 &#160; &#160; 2<br />6 &#160; 4 &#160; &#160; 2</span></p><p>apple 表的 user 字段跟 user 表的 id 对应，一条 SQL 语句查出每个人都有多少苹果</p><p>如果他不知道 join，可能会这么写</p><p>SELECT user.name, SUM(apple.number) FROM user, apple WHERE user.id = apple.user GROUP BY user.id</p><p>正确答案应该是这样</p><p>SELECT user.name, SUM(apple.number) FROM user LEFT JOIN apple ON user.id = apple.user GROUP BY id</p><p>这两条语句的差别是，不用 join 无法显示出李四有 0 个苹果 <span style="white-space: nowrap;">-_-</span></p><p>7. 假设我们要做一个公交系统的常见服务，就是做查公交车怎么倒车的。假设完全由你自己来搞，我只关心最后结果，你会怎么做这个项目。说的越详细越好。</p><p>可能需要不断提示。考查一个人的做事能力，比方说他首先会想到需要数据，数据库应该怎么设计，有几个表，什么样的字段。<br />可以加分的地方可以有这么几个点。给站名编 id，匹配数字的速度要远大于匹配字符串。站点之间要距离的数据，这样计算最优倒车路线应该能考虑到站数，倒车次数、距离等权值。如果很有远见，任意两点之间的数据应该是提前算好的，比方说有 200 条公交线路和 2000 个站点，始发终点的组合可能是 2000 * 1000，每种线路可能有 1 - 6 种方案，有个表是来装这近一千万行结果的，如果有线路变化，再用本地的机器重新算一遍线路。这样整个系统才有实用价值。不然可能每次查询都需要耗费数秒或者更长时间，只能当单机软件用。</p><hr align="left"><p>这些题本身是交流的话题，而不是“做对 5 道以上我就招你”这种门槛。我面试时每道题都会给予充分的时间，如果他做不上来，也起码能判断他的思考方式，而忌讳说“如果你不知道就明说，咱们赶紧做下一题”。同时也能观察出性格等方面。比方说第 6 题，有人把 SUM 写成 COUNT，我就问他你看看前面写的是否有问题，同时又怕太明显，又补充一句“也可能什么错误也没有、我在误导你，你自己判断”，于是他就不再理会、继续接着写完整个 SQL。再综合他的其他一些表现，我的结论是此人主见极强的，我不会用。属于出了 BUG 第一念头是 BUG 在解释器上、做出来的程序跟产品需求不符时会说是你产品没说明白的那种。相反，我很欣赏那些在做完第一道题的 7 进制转换后还知道验算的，因为既然是笔算就很容易出错。我觉得这种人思考严谨、负责任。</p><p>其他的一些知识，比方说 memcache、SVN、单元测试这些，都属于经验问题，应届生很少需要接触到这些东西（甚至文件静态化也很少碰到），不像上面，我需要以此来判断面试者对编程是否已经入门。</p><p>还是在 ngacn 上看到的一句话，团队需要两种人，要么 NB 的，要么听话的。</p><p><img src="http://rss.soulogic.com/track/362" /></p>]]></description></item>
<item><title>绝招二则</title><link>http://soulogic.com/blog/archives/361.html</link><dc:creator>Platinum</dc:creator><category>代码 Coding</category><guid>2985ab66ed77133d07f5357144eb2263</guid><pubDate>Sat, 18 Apr 2009 00:19:27 +0800</pubDate><comments>http://soulogic.com/blog/comments/361.html</comments><slash:comments>5</slash:comments><trackback:ping>http://soulogic.com/blog/trackback.php?361</trackback:ping><description><![CDATA[<p>都是从同事那听说的，当时觉得很绝，又觉得不好广为传播，现在已经过了三四年了，应该可以“解禁”了吧。</p><p>桌面软件必然会被破解，高明点的会给你弄出个 keygen，恶劣的会给你整个 crack patch。同事当时在做共享软件，被 cracker 搞的很影响收入。于是他再出新版的时候，同时偷偷以另外的身份放出破解程序，那些 cracker 一看有破解了，自然不会再碰别人剩的馍，转而去破解其他软件。而真正的使用者在下载了破解程序后发现……破解不好使。</p><p>前几年流氓软件铺天盖地，装机量几百万的流氓软件很平常，但是流氓也有流氓的烦恼：软件是要升级的，哪怕是流氓软件。要你去做自动升级程序你会怎么做？去网上某个地址读一个文本或者 XML 文件，里面写着版本号，有变化就去下载新版本的。但要知道，这么大的访问量，自己也要掏很多钱买机器买带宽的。为了节省开支，人家不去读版本文件，改读 DNS，把 ip 当版本号，比方说检查 version.example.com 这个域名的 ip，软件版本是 1.06，查 ip 一看是 1.0.7.0，哦，有新版了，那就升级吧。</p><p><img src="http://rss.soulogic.com/track/361" /></p>]]></description></item>
<item><title>打造一套高度可扩展的缩略图网站接口</title><link>http://soulogic.com/blog/archives/360.html</link><dc:creator>Platinum</dc:creator><category>代码 Coding</category><guid>e7d5d8440002d98b937ea92b9a69b916</guid><pubDate>Fri, 17 Apr 2009 23:45:15 +0800</pubDate><comments>http://soulogic.com/blog/comments/360.html</comments><slash:comments>4</slash:comments><trackback:ping>http://soulogic.com/blog/trackback.php?360</trackback:ping><description><![CDATA[<p>关于缩略图，大部分网站是这样处理的：在获得一张图片的同时，显式或隐式的生成几种不同大小的图片，以备将来使用。比方说，用户头像、上传的照片。通常这已足够。特别是那些功能相对简单（这绝不是贬义，如果不喜欢，你可以理解为“专一”）的网站。</p><p>但是<a href="http://soulogic.com/blog/archives/278.html">需求总是在变化的</a>，比方说在一次改版后，设计师希望用户的头像从 50px 扩大到 60px，使之更美观，你可以抱怨设计师的反复无常，继而以种种理由告诉设计师这东西没法变——需要太多的时间和精力应对每次改变。但从一个较长的时间跨度来看，不改版是不可能，你不能指望设计师从一开始就把所有需求钉死，就好像你永远也不可能写出完美的程序一样。</p><p>另外，在上一个项目中，用户头像和相册功能是不同的人来做、运行在不同的服务器上，但都是图片处理，都需要考虑临时目录、磁盘剩余空间、负载等问题。</p><p>缩略图接口就是为了解决以上两个问题</p><p>甚至我也说不好，是不是因为之前看过的 <a href="http://aaugh.com/imageabuse.html">Abusing Amazon images</a> 一直让我念念不忘（可能<a href="http://www.gertler.com/nat/abusedimages.html">这个页面</a>更直观一些），所以让总想在工作环境中尝试它。那篇文章的核心就是通过复杂的 url 来控制图片的合成、旋转之类的各种效果。这样实际上所有图片的使用都分成了两个问题：1.图片服务器根据集成在 URL 上的各种参数来返回相应的图片。2.图片的调用者只需要关心，输入几个参数，返回一个对应的 URL 字符串，他根本不用管 URL 的具体格式，只要保证在模板中恰当的放到 &#60;img src=&#34; 后面</p><p>我只是想缩放图片，没有 Amazon 的那么复杂。实际上 URL 中要包含这些参数：缩放后的宽高、缩放方式（这个稍后解释）、图片的原始 URL。</p><p>比方说原始 URL 是 http://photo.example.com/dir/hash.jpg</p><p>那么缩放后的 URL（假设是宽高各 60 的）就可能是这样：http://resize.example.com/w60/h60/style1/photo.example.com/dir/hash.jpg</p><p>缩放的服务器在接收到 URL 后，先 wget 这张图片到本地，然后用 imagemagick 的 convert 命令缩放，最后 readfile 该图，或者缓存里已经有了，直接 readfile，但无论如何，最终都是返回图片。</p><p>而在用户看到的大部分页面里，HTML 代码里都直接链接着 resize.example.com 而非 photo.example.com 的图片，所有的访问压力、所有需要动用的手段（反向代理、CDN 之类的）也都集中在这个图片接口的域名 resize.example.com 上</p><p>简单的原理或者说过程即是如此，但实践中遇到的各种各样的问题还有很多。</p><hr align="left"><p>这是一个高负载的应用，对 CPU、内存、硬盘容量和速度要求都很高，但核心的部分就是 imagemagick convert，绝大部分的资源消耗都在这里。因此使用哪种语言、哪种 web 服务器，都是无足轻重的事情。</p><p>我虽然用的 PHP，却没有使用 MagickWand 这个扩展。最大的理由，<a href="http://en.wikipedia.org/wiki/KISS_principle">KISS 原则</a>，我不想在任何升级后还要等相应的扩展被编译、测试后才能使用，所说的升级包括 PHP、MagickWand、ImageMagick 这三者，他们之间的组合所可能产生的问题要比 PHP 和 ImageMagick 的两者各自的升级带来的问题要多得多。实际上 PHP 只是 URL 参与到 convert 命令参数之间的翻译工具，实际的转换我都是在用 exec(&#34;convert -q ...&#34;) 来完成。并且升级是必要的，举个例子，即使是 2008 年的 ImageMagick 6.3.2，在处理 GIF98a 动画格式时仍然有 BUG。</p><hr align="left"><p>缩放格式</p><p>在页面中所要展示的图片，都有一个框架尺寸，即最终的不可以超过这个框架，之后可能会有林林总总的其他规矩，比方说空白部分是什么颜色、是居中还是左对齐，不是接口要考虑的了。</p><p>如果是固定百分比的缩放，可能是最简单的。但事实上我们需要各种大小各种比例的图片，举个例子，如果我们需要把图片缩成 50x50 大小，即宽高比 1:1，但是原图片是 1024x768 的，宽高比 4:3，这是该如何处理？通常有这么三种方式：</p><p><img src="http://soulogic.com/blog/files/101.jpg" /></p><p>inside 可能是最常见的，取最长的边来适应。类似 Adobe Reader 中的 fit page、ACDSee 中 fit image、或者通常的播放其全屏播放时候的缩放规则。缺点是如果原图和框架的比例不符，会有空白，总的来说就是展示面积变小。</p><p>outside 取短边来适应，如果比例不符会截掉多出来的部分。保持比例，但是画面内容有损失，特别是有可能破坏人像。当你登录 flickr 后在首页看到的那几组图片就是这么缩放的。</p><p>stretch 会破坏原始比例，Windows 的桌布设置就有“拉伸”这个选项。通常 icon 级别的缩略图才需要用这个方法，比方说一个 16x16 的头像。</p><p>其实“框架”或者说“容器”的这个概念并不十分易懂。起码我跟很多人解释过这个问题，用各种方法，画图，数字，但都失败了。</p><hr align="left"><p>以上只是在产生做图片接口这个念头后第一时间内所能想象到的问题，能做优化的地方很多。还拿上面提到的那个 URL，这里面就有很多文章可做：</p><blockquote><p>http://resize.example.com/w60/h60/style1/photo.example.com/dir/hash.jpg</p></blockquote><p>如果有人看懂了这个 URL 格式，至少就可以捣乱（比方说大量生成最大尺寸的缩略图），所以首先需要验证，在 url 里加入公钥，每个请求都要验证，以确保是自己网站的程序生成的 URL，我也不想让它太长，所以只用了 CRC32 的一半，这已经足够</p><p>还有很多让这个 URL 变短的方法，比方说去掉“photo.example.com”中的“.example.com”，比方说宽高用定长的 2 字节 36 进制数（即 sprintf(&#34;%02s&#34;, base_convert(789, 10, 36))），这样还能顺便节省两个分隔符“/”。因为第一版 URL 实在过于冗长，所以我决定缩减的时候把能想到的招都用上了。</p><hr align="left"><p>随着这套系统的增长，事实上缩放服务器服务器已经成为整个网站所有动态内容图片的最主要出口（除非有人点“下载原图”链接，那也局限在相册功能的极小一部分点击），正当我打算扩充这套系统的时候，又很幸运的了解一些关于浏览器的<a href="http://blogs.msdn.com/ie/archive/2005/04/11/407189.aspx">并发数上限</a>的问题，简单的说，针对每个域名，同时下载数是固定死的，IE 6、IE 7、Firefox 2 都是遵从 rfc2616 的 2 个，opera、IE 8、Firefox 3 是 6 个或 8 个。如果一个页面有大量小图片（在实际环境中，网站的每个页面至少会有很多用户头像，而且每个页面都是不同的图片，不想网站模板本身的图片加载一次就够了），因此连接时间远大于传输时间。Google 虽然没有人写文章来说这事，但他们的作品是最好的例子：是否注意过 map.google.com 下的图片域名有 4 个么？mt0.google.com / mt1.google.com / mt2.google.com / mt3.google.com。相比之下，所增加的 DNS 解析时间无足轻重</p><p>于是我把所有图片也分到了 4 个域名上，按 crc32(原始URL) % 4 来划分，至于后台，我们可以指到 1 - 4 台机器上，这暂时也足够了。</p><hr align="left"><p>当 4 台 8G 4核的机器也撑不住的时候，很明显需要别的方法了。普通的轮巡机制对此不起作用，假设同一个 URL 的两次请求被指到了两台不同的机器上，那这两台机器都需要做相同的工作：下载原始图片、缩放、缓存。同时由于图片的总量巨大，squid 和 CDN 也并不是很可靠，要经常面对大量的回源请求。</p><p>必须保证同一个 URL 只在同一台服务器上被处理。我之前的方法只能并行 4 台，直到老刘研究通了 nginx，可以根据 URI 做 Sharding，这个方法已经可以保证上百台机器内仍然有效了（如果你已经动用 n 个数据中心来处理这个问题，请给我发 email，我会继续思考这个问题）。</p><hr align="left"><p>其他体会</p><p>当平均 10kb 大小的图片覆盖了几百 G 硬盘的 70% - 80% 的时候，硬盘 IO 的瓶颈是巨大的。按现在的主流机器来运转这套系统，第一个瓶颈都会是磁盘而非 CPU 或内存。我们是用 <a href="http://pagesperso-orange.fr/sebastien.godard/">sysstat</a> 来评估磁盘的负载情况的。</p><p>整个网站在一段时间内需要的图片总量是固定的，因此建议硬盘尽可能大，尽量少删已生成过的文件。要明白，正是因为有相当数量被删除的文件要重新生成，所以 CPU 和内存占用才那么高。</p><p>尝试过关闭 atime，但变化很小，观察不到。</p><p>convert 进程所占用的内存会达到 80MB 甚至几百 MB，这很正常，你可以把 100 个整数放到一个数组里，看看会<a href="http://php.net/memory_get_usage">占用</a>多少内存。同时 convert 要记得用参数 <a href="http://soulogic.com/blog/archives/278.html">+profile &#34;*&#34;</a>，不然早晚会有一天你会奇怪为什么一个 20x20 的 jpeg 会有 30KB 大小。jpeg 质量我用的是 85，我曾偷偷改到过 75，但不到一天就有不止一个人跟我说感觉图片质量变差了。说明大家的眼睛还是很敏感的。</p><p>尽管这个工具可以非常自由的生成各类尺寸图片，但一定要跟设计师也讲明白，只在真正有必要的时候才应该增加新的尺寸规格。把函数封装好，比方说头像是 50x60 的，不要让程序员直接用 resizeImage(50, 60)，而是用实体名，比方说 resizeImage(&#34;middleAvatar&#34;)。</p><p>PHP 脚本开头记得用 ignore_user_abort() ，这样在生成新图片时，即使用户提前关闭浏览器，PHP 也会把工作做完，这样下次再有相同请求时可以直接 readfile 已有的图片而不必重新缩放。</p><p>在做增加新机器、新尺寸之类较大影响的改动，需要提前“预热”，即生成一份可能的图片请求列表，要尽可能的长，然后在做改动之前几天的夜里，分批用工具提前访问这些地址，以保证服务器上有一定量的缓存。我碰到的情况是，缩放服务器在从 2 台扩充到 4 台时，由于所有机器是在一个机房的内网访问，结果相册服务器被那两台新服务器扒的没响应了。</p><p><img src="http://rss.soulogic.com/track/360" /></p>]]></description></item>
<item><title>臭豆腐是人类最恶心的发明</title><link>http://soulogic.com/blog/archives/359.html</link><dc:creator>Platinum</dc:creator><category>铂 Platinum</category><guid>9c6d6c13f9b5e94732ee628d80d727da</guid><pubDate>Thu, 16 Apr 2009 23:01:44 +0800</pubDate><comments>http://soulogic.com/blog/comments/359.html</comments><slash:comments>1</slash:comments><trackback:ping>http://soulogic.com/blog/trackback.php?359</trackback:ping><description><![CDATA[<p>我真搞不明白清朝那个始作俑者是怎么想的：豆腐放坏了——他不可能没有其他东西放坏的经历——以至于这东西看起来跟屎一样，闻起来也跟屎一样，按照常人的判断，绝对不需要再用嘴来尝一下是不是吃起来也跟屎一样。但他终究还是吃了。</p><p>吃完还不要紧，在他吃的时候，他身边的人必然会惊呼“王致和吃屎啦！”他怎么说服别人的我不知道，但一定很有技巧，肯定不是我所想的台词“虽然这东西看着闻着跟屎一样，但吃起来真的很香，不信你尝尝”</p><p>但我万万没想到，肯去验证这东西是不是屎的人比重会这么大。一至于百年之后，这个行业依然存在。ctmd</p><p><img src="http://rss.soulogic.com/track/359" /></p>]]></description></item>
</channel>
</rss>
