<?xml version="1.0"?>
<rss version="2.0">

<channel>
	<title>Planet of Woodpecker.org.cn for CPUG</title>
	<link>default</link>
	<language>en</language>
	<description>Planet of Woodpecker.org.cn for CPUG - default</description>

<item>
	<title>@shell909090: 新闻和八卦和概率聚集</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2170</guid>
	<link>http://shell909090.com/blog/2012/05/%e6%96%b0%e9%97%bb%e5%92%8c%e5%85%ab%e5%8d%a6%e5%92%8c%e6%a6%82%e7%8e%87%e8%81%9a%e9%9b%86/</link>
	<description>&lt;div&gt;&lt;span&gt;	&lt;/span&gt;新闻和八卦有个共同点，就是会扭曲我们常规的概率体验，例如：今天摔了一架飞机。我们的结论往往是，飞机好危险。然而，世界上有很多没问题的飞机，这个你是不会从新闻和八卦里面听到的。因此，以这些东西为基础得出的结论，往往是错的。&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;从这点说开去，其实我们会发现很多东西都不可靠。首先说八卦。八卦之不可靠是全世界皆知的，要是有人神神秘秘和你说个事情，要么是一点不着边的瞎猜，要么就是一枪命中的内幕。可惜的是，到底是哪个，在事先完全无法分辨。香农说，信息就是减少不确定性，从这点来说，这些八卦里面的信息量是负数——本来一个事情挺明白，八卦一传，搞不好当事人都不明白是怎么回事了。&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;其次我们再说新闻，新闻倒是有信息量，但是新闻的不可靠也是人尽皆知。中国的文艺宣传理论就不去说了，老美也经常骂，大新闻集团只挑符合他们利益的说。不过幸好，人家新闻利益集团有好几个，岳飞打张飞之下，总算还有不少东西给披露出来。&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;最后，你的亲眼所见一定是真么？我在以前的一篇blog里面说过，我对问题的分析是偏颇的，因为我做不到随机取样。我周围的朋友，一定是具备某个特性/符合某个范式的。例如熟悉电脑，受良好教育的城市青年，中国人，这些总是没办法的事情。如果以此为样本来分析相关问题，相信一定会南辕北辙。例如你以我的gtalk和twitter好友来分析python和emacs用户的比例，那一定是高的异乎寻常。这是当然的，我本来就是以python和emacs作为自己的标签，无论是朋友也好，会fo我的人也好，多半是此道同好。以此类推，若是你不仔细分析，即使以亲眼所见，也未必能得到结论。&lt;/div&gt;</description>
	<pubDate>Thu, 10 May 2012 18:25:49 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 全部和谐音程表（泛音表）</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2168</guid>
	<link>http://shell909090.com/blog/2012/05/%e5%85%a8%e9%83%a8%e5%92%8c%e8%b0%90%e9%9f%b3%e7%a8%8b%e8%a1%a8%ef%bc%88%e6%b3%9b%e9%9f%b3%e8%a1%a8%ef%bc%89/</link>
	<description>&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; for i in [(i, j, 12 * math.log(float(j)/i, 2)) for i, j in itertools.permutations([1,2,3,4,5,6], 2) if i &amp;lt; j]: print i&lt;br /&gt;&amp;#8230; &lt;br /&gt;(1, 2, 12.0)&lt;br /&gt;(1, 3, 19.019550008653876) &lt;br /&gt;(1, 4, 24.0)&lt;br /&gt;(1, 5, 27.863137138648348)&lt;/p&gt;
&lt;p&gt; (1, 6, 31.019550008653873)&lt;br /&gt;(2, 3, 7.019550008653875)&lt;br /&gt;(2, 4, 12.0)&lt;br /&gt;(2, 5, 15.863137138648348)&lt;br /&gt;(2, 6, 19.019550008653876)&lt;br /&gt;(3, 4, 4.980449991346124)&lt;br /&gt;(3, 5, 8.843587129994475)&lt;br /&gt;(3, 6, 12.0)&lt;br /&gt;(4, 5, 3.863137138648348)&lt;/p&gt;
&lt;p&gt; (4, 6, 7.019550008653875)&lt;br /&gt;(5, 6, 3.1564128700055254)&lt;/p&gt;</description>
	<pubDate>Wed, 09 May 2012 18:14:04 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 论医</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2166</guid>
	<link>http://shell909090.com/blog/2012/05/%e8%ae%ba%e5%8c%bb/</link>
	<description>&lt;div&gt;# 医生的道德标准 #&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;要摆正医患关系，首先就必须将医生的道德标准降下来，从“白求恩精神”，降低到一般人标准。&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;为什么？有一则故事，叫做“子贡赎人”，挺有名的，大家可以自查。跳过故事本身，我直接说其中的观点：&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;如果将道德标准提高到没有人能够接受的地步，就不会有人照做了。&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;类似，大家都是人，为什么让别人去遵循“白求恩精神”，或者其他变态的精神，而让自己能够得利呢？拥有这种精神的毕竟是少数。以这个为标准要求多数人的结果，就是没有人能够成为医生。&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;医生的标准，只要能够诚实的提供服务就好了。动辄就拿奉献说事，实则是用大帽子压人，和文革无异。&lt;/div&gt;
&lt;div&gt;        当然，现今最主要的问题，是以白求恩精神要求医生的同时，连诚实服务都贯彻不下去。这种动辄涉及人命的事情上不公开透明是会出人命的。只要有一小撮是贯彻不下去的，那病人就会连剩下的医生一并怀疑，然后杀医生的戏码就会层出不穷。&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;貌似要立法阻止杀医什么的，其实我说，这也就是对纯粹的医闹管用，真的爆上新闻的，多半不会是医闹。道理很简单，医闹的目的是拿钱，耍赖撒泼软语哀求的目的都是拿钱而不是报仇。就算他再和医生横眉竖眼，也不会往死里下手——真的往死里整的，多半是豁出一条命的家伙。人不畏死，奈何以死惧之。解决这个问题的最好途径不是阻拦，而是有个心平气和能让他解决问题的途径。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;# 不实施抢救的道德标准 #&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;我认为，以下两种情况下，不实施抢救不应当受到责难。&lt;/div&gt;
&lt;div&gt;1. 病人死亡。&lt;/div&gt;
&lt;div&gt;2. 病人不可避免的向死亡发展，其中会为本人或家属带来极大痛苦。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;# 医疗会耗尽社会的剩余资源 #&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;我觉得这是不言自明的。人类社会从原始社会仅够自己温饱，发展到目前的状态。实则目前一个人的工作供养数人足矣。或者换个表达方式，全球所有人所需的食物/衣物/住房等资源，并不需要所有的人类进行生产。若非如此，贫困救助体系和养老体系都没有发展的前提。多余的人产生的物资，即是社会的剩余资源。&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;社会目前的剩余资源，必然会有一个出口。一方面，第三产业，娱乐业，都是基于剩余资源的。也可以看作，从事生产的人为他们提供食粮，而他们为从事生产的人带来娱乐。而另一方面，科技发展，医疗和医疗技术发展，也是基于这些资源的。&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;随着科技发展，人类的剩余资源冗余度会越来越大。人类需要的必需品只需要更少的人进行生产，更多的人会投身非直接产生必需品的行业。在这种情况下，我更希望他们参与医疗和科技发展。并不是说娱乐业不好，或者不需要。只是科技和医疗能够带给人更好的生活——我是这么相信的。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 09 May 2012 01:09:01 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 升调降调的规则</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2164</guid>
	<link>http://shell909090.com/blog/2012/05/%e5%8d%87%e8%b0%83%e9%99%8d%e8%b0%83%e7%9a%84%e8%a7%84%e5%88%99/</link>
	<description>&lt;p&gt;    为什么C加一个升调变成G？
&lt;div&gt;    这个要从大调式讲起。&lt;/div&gt;
&lt;div&gt;    大调式是以大三度为基础构建的调式，主音到中音为大三度，中音到属音为小三度，两者构成大三和弦。主音到属音为纯五度，属音到主音为纯四度，大调式的三个基础音之间，都是和谐音程关系。以C大调而言，就是do mi so。&lt;/div&gt;
&lt;div&gt;    好吧，C大调之所以叫做C大调，是因为以中音C为do。那么G大调呢？以中音G为do？对的，问题是，C大调的所有音，是否能够不做任何变化的构成G大调的音？&lt;/div&gt;
&lt;div&gt;    这是不可能的，C大调的音不做变化唯一能够构成的只有a小调。G大调一定需要对C大调的音做升降的。&lt;/div&gt;
&lt;div&gt;    为什么？因为C大调的音程关系是全全半全全全半，这个在小学就教了。通过这个，你可以数出上面说的三个纯音关系。当我们位移到G=do的时候，你会发现，不做变化的话，音程就变成了全全半全全半全，这就糟了。所以，需要对C调的fa(即F)升半个音，来回复大调调式。&lt;/div&gt;
&lt;div&gt;    常识上我们知道，12平均率是对称关系，所以上述过程可以运用数学归纳法作用于整个中音音阶。即，每个大调可以通过升该调中的fa半个音，变成另一个大调。后者刚刚好比前者高一个纯五度。&lt;/div&gt;
&lt;div&gt;    降调关系亦然，可以类比。&lt;/div&gt;
&lt;div&gt;    小调关系亦然，不过小调使用全半全全半全全作为结构，主音到中音为小三度，中音到属音为大三度，两者构成小三和弦。主音到属音为纯五度，属音到主音为纯四度，小调式的三个基础音之间，也都是和谐音程关系。&lt;/div&gt;
&lt;div&gt;    稍微数一下就知道，小调式上的所有音，可以构成比自己高小三度的大调，两者称为关系大调和关系小调。&lt;/div&gt;
&lt;div&gt;    虽然音是一样的，然而主音中音属音的位置完全不同，因此调式色彩完全不同。&lt;/div&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 07 May 2012 01:21:06 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 关于翻墙服务几句</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2162</guid>
	<link>http://shell909090.com/blog/2012/05/%e5%85%b3%e4%ba%8e%e7%bf%bb%e5%a2%99%e6%9c%8d%e5%8a%a1%e5%87%a0%e5%8f%a5/</link>
	<description>&lt;div&gt;    目前有很多服务，其实我们都是按照非正规用法在用的。例如github，看上去像是个源码托管服务，我们拿来当blog用。GAE，看上去像是个代码托管服务，我们当翻墙工具用。空间，常规都是发布应用的，我们也拿来翻墙。&lt;/div&gt;
&lt;div&gt;    对服务的非正规用法，我们首先把这个命题分几个类。一类是服务本身没有对用法做出特殊假定，但是你的用法和传统用法相违背，例如VPS传统是作为私有主机用的，用于发布网站。但是天朝人民经常用VPS当作云存储，或者是VPN。作为这类用途，我觉得是没有任何问题的，服务商本身就没有限定你的应用类型。&lt;/div&gt;
&lt;div&gt;    第二类，是服务商默许或者半鼓励你作为特殊用途应用。例如github并不反对你用他作为blog。这也没问题。&lt;/div&gt;
&lt;div&gt;    第三类，服务商明确反对的用途。例如利用空间来翻墙。一来ssh流量并不计入你的流量限额中，二来长期使用空间翻墙会导致空间的服务器地址在中国被封。前者影响成本，后者影响销售。因此，很多空间商都封锁了ssh的跳板功能，例如DreamHost。&lt;/div&gt;
&lt;div&gt;    也许有人会骂，空间商为什么要阻止ssh，这是对自由人权的破坏什么的。我觉得这压根是骂错人了。如果你无法自由浏览你想要浏览的网页，你需要骂的是阻止你访问的人，而不是别人。空间商既没有封你，也不是帮凶。通过对人有害的方法获得自己想要的利益，别人阻止你还骂人，这是流氓嘴脸。&lt;/div&gt;
&lt;div&gt;    第四类，服务商没有明确回应，他们可能对此一无所知。这种情况最复杂，也最值得讨论。&lt;/div&gt;
&lt;div&gt;    无论空间商默许还是反对，我们都可以看作是一个附加合同。这种事情你同意就接着用，不同意就换家人，市场经济大家好聚好散。但是服务商没有明确回应，那么事情就比较暧昧。我倾向于将事情分为两个阶段，或者类型。一类是影响较小，或者刚刚出现，服务商有理由不知道。这种阶段下，该怎么用就怎么用。直到服务商有表态为止。另一类是我们有理由相信服务商知道这类用法。在这种阶段下，你不妨参照第二类。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;    当然，这里顺便说另外一个话题，就是很多人对翻墙的要求是——免费。&lt;/div&gt;
&lt;div&gt;    我去阿，你在中国网络上玩多了，啥都要免费，有没有写信给电信要求宽带接入免费阿。你要是真没钱，要么就不用，要么就学学怎么让自己出去。&lt;/div&gt;
&lt;div&gt;    天下的特权有几类的，一种是你通过努力来获得某种特权，一种是你付钱让别人帮你获得这种特权，一种是左求右拜，借到某种特权。这特权还不稳固，有点问题就让人收了回去，因此不得不小心翼翼，缩着尾巴做人。且不提现实中有个头痛脑热，行政手续，求爷爷告奶奶的诸多无奈。那毕竟很多时候还是不得以而为之。网络上凡是有点大小P事，全是“360度冰天雪地裸体跪求”，就这种人还自诩为“不食嗟来之食”之后，实在让人叹息。&lt;/div&gt;
&lt;div&gt;    墙的存在意义，就是要“拦截大多数”。要稳定翻墙，基本就两种途径。一者是牛，自己付出辛苦，学会了整个过程，从而翻墙出去。或者你付钱，弄到了翻墙帐号，从而翻墙出去，这也是一种。这两者都算的上少数，剩下的就是绝对的大多数。既不付钱，也不想付出辛苦，张口就求各种方法的人不知有没有想过，当某种方法会的人多了，墙自然就会把这种方法连根铲掉。法子不能用了，瞬间破口大骂给法子的人，不知道脑子里转的是什么逻辑——或者是，他们其实想过，只是：&lt;/div&gt;
&lt;div&gt;1. 在中国，只要考虑三天后的事情，三个月后的事情谁说的准呢。&lt;/div&gt;
&lt;div&gt;2. 在网络上求爷爷告奶奶也是一种辛苦阿。&lt;/div&gt;
&lt;div&gt;    ——我已经连叹息都发不出了。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;    最后一个话题，如果你的某种对服务的应用，对其他人会产生伤害怎么办？例如，你用某个空间翻墙，这个空间IP就可能被墙。你用GAE翻墙，GAE就会被墙。你在网站上发表很合理的言论，自己没事，站长进去了。&lt;/div&gt;
&lt;div&gt;    首先请允许我就最后一个例子向中国的有关部门表示无比的XXX。。。就这精确度还好意思指责人家老美的导弹？&lt;/div&gt;
&lt;div&gt;    我们先说最后一个。很多人往往鄙视中国的网站管理者，我写个无比正常的内容你都给我删了。实际上，在一切不正常都当作正常的国度，再正常的内容都可能是不正常的。我是挺同情网站的管理者的，删把，道义上挺站不住的，不删吧，自己进去了。某种意义上说，开网站是为了赚两个钱顺便提供娱乐的(当然，很多人是反过来的)，而不是为你表达言论挺身而出的——真是这个目的开的网站现在站长的骨头都在长草了——从这个意义看，删，不是恶。如果你要指责，应当指责的是这个制度和产生这个制度的原因。&lt;/div&gt;
&lt;div&gt;    但是，我又要但是了，这也有个度。删本身不是恶，但是捕风捉影，删了不说，不删，偷偷让别人看不到，这就沦为不道德了。只是在中国，各种事情交错纠缠之下，人人皆提心吊胆提防别人，往往事情就会走了样。&lt;/div&gt;
&lt;div&gt;    这里插一个前两天的段子。魔都地铁是要安检的，大家知道。坐地铁的经常听说保安和你争执两句就躺地上装死讹钱的例子。前两天过地铁的时候，把包拿给保安检查。保安摸到我的饭盒，说，这是啥阿。我刚要说话，旁边保安示意放行，小声说，摸坏了你赔不起。&lt;/div&gt;
&lt;div&gt;    ——那地铁安检的结果就不言自明了。&lt;/div&gt;
&lt;div&gt;    因此，在层层把关的网络审查中，往往下层执行的东西和上层想的差了十万八千里。其距离大概就和客户心里的网站和项目经理笔下的网站和工程师手下的代码的区别差不多。&lt;/div&gt;
&lt;div&gt;    当然，即便结论如此，我还是管我自己。我的blog都是在自己的域名下面——结果被封，也是自己的选择。如果发到其他网站，能不能留，留多久，就看别人的意思了。&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;    至于使用GAE翻墙的问题，我觉得适用于我们有理由相信服务商知道的情况。我相信Google一定知道上面有人放什么网站，做翻墙用途。既然他没有反对，我们可以看作是他默许。&lt;/p&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 03 May 2012 18:09:39 +0000</pubDate>
</item>
<item>
	<title>@shell909090: dvc和vc简评</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2160</guid>
	<link>http://shell909090.com/blog/2012/05/dvc%e5%92%8cvc%e7%ae%80%e8%af%84/</link>
	<description>&lt;div&gt;# 我有必要换git么 #&lt;/div&gt;
&lt;div&gt;实话说，这得分干吗。目前的推荐是，如果是企业级项目，对权限要求比较严格，你必须用svn。如果是普通项目，你可以尝试使用git，但是这并不表示git是最适合你项目的。有的时候svn比git合用的多。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;# svn是什么模式 #&lt;/div&gt;
&lt;div&gt;svn的核心思路是，取出，修改，提交，合并。即，你从核心库中取得数据，修改，然后提交上去。如果有两个一样的修改，那么要求你进行合并。当然，svn工具会首先尝试自动合并，然后再让你手工干。但即使如此，合并的时候还是很费力。&lt;/div&gt;
&lt;div&gt;svn的模式很容易理解，然而在使用中却有两个实际缺陷。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;1. 保存数据的唯一方式就是提交，而提交是不可撤销的。&lt;/div&gt;
&lt;div&gt;2. 必须连接核心库使用。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;第一点问题，就是说，如果你希望暂时保存一下当前的修改状态，然后进行某个测试性修改。如果失败，退回当前。抱歉，做不到。你的提交一定会进入svn库。虽然你可以退回到你提交前的版本，但是很麻烦，而且版本记录不会消失。而第二个问题更加致命。如果在网络不稳定/没网络的时候，还干不干活了？&lt;/div&gt;
&lt;div&gt;因此，svn的设计模式并不鼓励你提交。当你有修改的时候，你必须保持修改的状态，直到某个稳定的状态。你需要检查代码是基本可用的，然后才应当提交。svn提交有个基础原则，不能塞住head，讲的就是这个。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;# 所以有了hg #&lt;/div&gt;
&lt;div&gt;hg正是为了解决上述问题而出现的。hg实际上是用python实现的，解决上两个问题的svn。&lt;/div&gt;
&lt;div&gt;hg拥有本地版本库，这解决了离线模式。至于暂存性提交，你可以在本地随便提交。只要不提交到核心库上，就不会导致塞住。如果你觉得本地库不行，可以直接重新co，而不进行push。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;# git和hg哪个好 #&lt;/div&gt;
&lt;div&gt;锤子和扳手哪个好？我永远无法回答你这个问题，因为这两个的目标根本不同，因此根本没有可比性。同样，git和hg的工作流程和模式完全是两回事，因此不要问这个问题，没意义。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;# 哦，那么git是 #&lt;/div&gt;
&lt;div&gt;git的设计核心思路，是取出，分支，修改，提交，合并分支。git的分支是处理工作的利器。&lt;/div&gt;
&lt;div&gt;要彻底理解git，你必须接受平行世界假定。假设世界并不是顺序发展的，由于你的选择不同，而会变成不同的几个分支。git可以让你在分支间自由穿越，并且让世界变成某个分支上的某个点的状态。你可以重新选择，产生一个不同的分支。当你需要时，可以对两个分支进行合并。如果两个分支从源头分开后，对世界的影响各自不同，那么合并就是自动的。&lt;/div&gt;
&lt;div&gt;git的同步就是在同步这颗世界树。树扩展成什么样子和你在树的什么位置没有关系，因此fetch后如果不chechout，那么就不会应用最新的修改。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;# 我没看出多大区别 #&lt;/div&gt;
&lt;div&gt;实际是非常大的。有了平行世界假定，我可以正交的对一个源码做两件以上不同的事情。而在hg中，虽然也可以做两个不同的分支，然而却很难在两个分支间切换，从而使得切换到做另一件事情非常困难。这也导致了一个人实际上只能做一件事情，否则就无法将过程同时纳入vc管理，又满足正交。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 02 May 2012 19:28:18 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 首次bsp日记</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2158</guid>
	<link>http://shell909090.com/blog/2012/05/%e9%a6%96%e6%ac%a1bsp%e6%97%a5%e8%ae%b0/</link>
	<description>&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;	&lt;/span&gt;第一次参加BSP，还不错拉。因为以前没参加过，所以等搞明白了这个是干吗的再和大家说。&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;	&lt;/span&gt;BSP是bug squeeze party的简称，简单来说就是修错会。debian马上要发行7了，在此之前有很多的bug没有修复。其中有一种是RC bug，即运行就会出大问题的bug，或者干脆没法编译。无论哪个，都会导致这个包不能进入最新的发布。有些bug很麻烦，需要maintainer和author沟通，这个没有办法。但是有些问题解决起来很简单，只是因为后果很严重，作者又暂时没空处理，导致包无法进入stable，实在很无谓。BSP的目的，主要是以非维护者上传(non-maintainer upload)的方式修复这类bug。因为包不是自己的，所以礼貌上，只修复半个月以上的rc级别bug，其他的留给maintainer来处理。&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;	&lt;/span&gt;BSP的主要目的，就是这么一个苦力会。没有挂名，最多只有一条changelog记录，还要大量寻找和修复bug。不过BSP相当重要，因为很多maintainer往往有一段一段的不活跃时间。这时候即使再简单的问题也不会处理。按照debian的规则，别人也不会帮他处理。除了BSP，很少有一批人会专门找这种简单的Bug来修正。如果没有BSP，debian stable发布的时候一做RC冻结，就要少掉很多有用的包。BSP更大的目的是，交流和传授debian打包和除错的经验，唤起人们的关注。也许在会后，如果有人看到一些简单bug，会使用nmu的方法给与修正。不过BSP到确实是有一个额外加成的好处——基本变成了签名会。昨天估计是中国大陆地区首次DD数量接近其他人数量，我一下弄到了5个签名，2个DD一个Ubuntu员工。加上原来就有的zigo签名，我就有3个DD签名了。&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;	&lt;/span&gt;本地BSP是在thomas的公司举行，欧特家博士匹萨厂商赞助了我们两天的午餐——微波食品匹萨。第一天来的人比较多，很多都是纯新手，大概有20多人。Zigo倒是在网络上说会帮助新手，但是纯新手看到debian打包系统根本无从下手，所谓指导什么的也无从说起。很多人一天一个bug都修不掉，甚至都看不懂，很有挫折感，估计有不少有热情的人在第二天就这么默默退散了，第二天只来了15个左右。&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;	&lt;/span&gt;我主要是以修复自己的问题为主，python-snappy和python-formalchemy都升级到了最高级，并且修复了自己以前打包的一个问题。至于RC bug么，我修了一个。两个包在python中命名冲突了，所以在debian中需要声明为conflicts。另外我评审了一下，最终还是决定关闭了python-libmemcached的ITP。虽然对douban很不好意思，还让他们修了一下。但是python-libmemcached依赖于libmemcached，而后者已经逐步升级到了1.0.X版本，但是douban为了稳定使用，是sticky在0.4版上的。因此当更新的debian发行时，实际上python-libmemcached和系统中的libmemcached不是一回事。因此，我不能依赖libmemcached的维护者，而是需要自己去维护后者——没办法，我就是怂了。python-libmemcached的爱用者，还是自己打包吧。我倒是可以公开打包文档。&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;	&lt;/span&gt;另外，我在想是否要集合一批python/debian的用户，来做投票。例如，python的一个容器——flup，在debian中实际上已经orphon了。如果有足够的人投票，我愿意为flup做接手维护工作。不过目前debian下问下来的结果，大家对flup没什么太大兴趣。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 01 May 2012 19:09:03 +0000</pubDate>
</item>
<item>
	<title>@delphij: FreeBSD 的 strlen(3)</title>
	<guid>tag:blog.delphij.net,2012://2.2159</guid>
	<link>https://blog.delphij.net/2012/04/freebsd-strlen3.html</link>
	<description>&lt;p&gt;之前只有一篇关于较早版本的 strlen(3) 实现的笔记，这里补上我在 2010 年做的新增改进。&lt;/p&gt;

&lt;p&gt;与 Pascal 等语言不同，C 的字符串并不保存串的长度，而是在字符串末尾以 nul 字符（'\0'）来表示字符串结束。这个设计决策是上世纪 60 年代作出的，有都市传说是为了省几个字节的空间，不过我个人认为也可能是因为汇编里面到处都是判断是否碰到了 0 的操作。不管怎么说，这个设计令 strlen 变成了一个 O(n) 的操作。&lt;/p&gt;

&lt;p&gt;早期的 BSD Unix 采用的 strlen 是非常简单的循环比较每一个字符是不是 nul。1993年，J.T. Conklin 为 i386 系统撰写了一个汇编的版本，这个版本的核心用的是 REP SCASB，实际上和 C 版本的算法是一样的（不知道为什么 C 编译器不能写出同样的代码）。&lt;/p&gt;

&lt;p&gt;为了配合 x86_64 平台，后来又有了一个新的汇编版本，这个版本的核心算法是按字匹配，找到包含 nul 字符的字之后，再在其中用原始的算法找到 nul 字符。&lt;/p&gt;

&lt;p&gt;我在 2009 年根据这个 x86_64 版本的汇编的思路重写了一个 C 的版本，并在 2010 年做了一次最终的变动，形成了目前的版本。这个版本的大致流程如下：&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;判断第一个字中是否存在 nul，如果存在，扫描查找其中有效位置的 nul 字符；&lt;/li&gt;
	&lt;li&gt;按字扫描剩余的字符串；如果发现字中带 nul，则扫描并返回其位置。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;b&gt;实现细节&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;整个算法中，比较难理解的是判断字中是否带 nul 字符。具体的方法是计算两个中间变量：&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;a = (x - 0x01010101)&lt;/li&gt;
	&lt;li&gt;b = (~x &amp;amp; 0x80808080)&lt;/li&gt;
	&lt;li&gt;计算 a &amp;amp; b == 0&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;这里的 0x01010101 和 0x80808080 可以进一步扩展。第一步，如果每个字节都 &amp;lt;= 0x7f，只要那个字节不是 0，做差必然得到一个 &amp;lt; 0x80 的结果（换言之，最高位是0）；如果有字节 &amp;gt;= 0x81，做差必然得到一个 &gt; 0x80 的结果。对于等于 0x80 的情况，我们会得到 0x7f，但这并不重要。&lt;/p&gt;

&lt;p&gt;注意到，此处，任何一个字节的最高 bit 是 1 的话，则必然是前面两种情况之一：要么这个字节是 0，要么它 &amp;gt;= 0x81。如果不考虑后一种情况，我们直接把结果 &amp;amp; 0x80808080 即可；然而，由于需要考虑后一种情况，我们接着计算 ~x &amp;amp; 0x80808080。若某一字节 &amp;gt;= 0x80，则对应的结果将是那个位置上的一个 0x80。&lt;/p&gt;

&lt;p&gt;将两个结果做逻辑与，若结果非 0 则说明至少有一个字节是 nul。&lt;/p&gt;

&lt;p&gt;这里说起来的过程很复杂，但事实上计算机计算这些要比一个一个去判断每个字节是否为 0 要快。这里有几方面的原因：&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;按字长做操作，令 CPU 无需模拟按字节为长度操作的情况，后者是比较耗时的；&lt;/li&gt;
	&lt;li&gt;前两步操作（分别计算a, b）可以并发执行；&lt;/li&gt;
	&lt;li&gt;最后一步操作可以直接在两个寄存器之间进行，且是速度较快的与运算；&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;在实际的实现中，还有一些其他的技巧。&lt;/p&gt;

&lt;p&gt;第一个技巧是，从第一个小节就开始用字长的操作。一般来说，内存分配器在分配内存时是以字边界开始的，因此，通常 strlen() 的操作的指针都是对齐的。不过，即使不是，这个指针往前退到第一个整字位置（例如字长=8，指针 0x9，则退回 0x8）开始的一个整字必然是在同一个内存页上，因此这个访问不会越界。如果在这个整字中有 nul 字符，我们只需从指针开始处扫描到第一个整字结尾的地方即可知道是不是真的找到了字符串的末尾。&lt;/p&gt;

&lt;p&gt;由于整个字已经在处理器缓存中，后续的循环也不会太慢。&lt;/p&gt;

&lt;p&gt;第二个技巧与此类似，我们一直都用整字的操作。如果字的起始地址在内存页中，则终止地址也必然在同一个内存页中。这个访问同样也不会发生意外越界（尽管在分配内存时可能出现类似分配了 4 个字节，但访问了 8 个字节的情况）。换言之，如果程序原先不会发生越界异常，则现在也不会。&lt;/p&gt;

&lt;p&gt;这个版本的 strlen 源代码可以在 &lt;a href=&quot;http://fxr.watson.org/fxr/source/string/strlen.c?v=FREEBSD8-LIBC&quot;&gt;这里&lt;/a&gt; 找到。&lt;/p&gt;</description>
	<pubDate>Sun, 29 Apr 2012 07:25:59 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 关于昨天”google drive你这是在找死”的补充</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2156</guid>
	<link>http://shell909090.com/blog/2012/04/%e5%85%b3%e4%ba%8e%e6%98%a8%e5%a4%a9google-drive%e4%bd%a0%e8%bf%99%e6%98%af%e5%9c%a8%e6%89%be%e6%ad%bb%e7%9a%84%e8%a1%a5%e5%85%85/</link>
	<description>&lt;div&gt;    随手就写害死人阿。&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;	&lt;/span&gt;昨天写了一篇google drive你这是在找死，结果被人指出了错。我忘记注明了，没有文件夹上传的是android版本，linux版没有客户端，windows版可以看到客户端下载，但是我目前没有确认下来有人能用。&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;	&lt;/span&gt;即使如此，我还是觉得google drive不好用。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;# 基于文件的数据管理 #&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;	&lt;/span&gt;基于文件的数据管理很简单，一个文件系统有很多目录，每个目录可以放文件或者其他目录，文件里面就是各个程序的数据。基本上每个用电脑的人都知道基于文件的数据管理是怎么回事。&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;	&lt;/span&gt;问题是基于文件的数据管理很不好用。&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;	&lt;/span&gt;文件就有文件名，我需要找一个文档，里面是上个月的财务数据，但是我不知道叫什么文件名，这种需求并不少见。然而，要在文件系统上干这个事情，你只有搜索所有doc/xls文件，然后一个个看。&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;	&lt;/span&gt;蛋疼不蛋疼阿。&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;	&lt;/span&gt;基于文件的数据管理的理由，多半因为多文件组合。例如，我有一个html，里面引用了两张图片，一段音乐。在html里面，我只要写明其他文件的文件名，就自然可以指定对其他文件的引用。这省去了“复合数据存储”的烦恼。但是，大部分情况下，我们用不到这个。&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;	&lt;/span&gt;因此，目前逐步在向另一个方向过渡，基于数据集合的数据存储。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;# 基于数据集合的数据管理 #&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;	&lt;/span&gt;数据集合，听起来和文件没什么区别，但是本质上并不是一回事。大家都用过flickr吧，也用过google doc吧。他们基本上就是“基于数据集合的数据管理”。和文件的区别在于，数据集合是有“元数据”的。照片会有拍照时间，说明。如果运气好，还有地点和评论。文档是有作者，简述等等。你可以基于数据类型和元数据进行过滤，排序等动作。而基于文件的基本没有办法这么玩。微软winXP以上版本的资源管理器可以看到，如果文件夹里面多半是图片，就会变成图片专用视图，而显示出图片的内置元数据。然而，这个是逐个扫描的，速度慢。而且万一一个文件夹里面又是图片又是音乐，至少有一个得虾米。&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;	&lt;/span&gt;google drive基本是google doc的升级替代品，可以打开多种格式的文件。然而，当上传一个文件时，必须显示的“转换”为google doc文档，才可以介入管理。而且，每个类型的google文档，都有限额。以文本文件为例，大小限制在2M以内。我上传了一个5M的小说，直接报错，要求原样上传。上传后不能直接打开，必须下载打开。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;# 整合和过渡 #&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;	&lt;/span&gt;两者如何整合？&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;	&lt;/span&gt;在文件系统的管理上，同步，而非上传，是一个非常重要的功能。我不可能每时每刻都联网，即使联网，也不能每个文件修改好了就上传一次。我需要对传统的文件系统做持续的修改，然后通过手工的，或者自动的同步，将差异转移到云端上去。而不是我手工的对比每个文件差异，然后一个一个的上传更新和删除。&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;	&lt;/span&gt;没有同步工具的云端存储是个垃圾，除非你共享的目标是少数几个超大的文件，例如电影，或者资源合集之类的东西。这是以共享为目的的云，说的更直白点，就是免费的下载空间，而不是个人云存储。&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;	&lt;/span&gt;在个人文件被同步到了云端后，应当能够让云端的程序直接打开和修改某个文件，而不是强迫转换。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;# google drive是什么 #&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;	&lt;/span&gt;从表现上看，还是基于文件的管理。我不能通过元数据直接查看我拥有多少张相片，也没办法找所有邓丽君的歌。&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;	&lt;/span&gt;然而，他们又没有同步，至少linux不行。而且android手机上连文件夹上传都没有。也许有人说了，找个数据线和电脑连起来不就得了？要是我喜欢用数据线连，我到哪连一次电脑，玩个同步就完了，还要云干吗？&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;	&lt;/span&gt;所以，结论还是不变。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 27 Apr 2012 23:04:54 +0000</pubDate>
</item>
<item>
	<title>@delphij: 为什么安全更新通常在周三发表</title>
	<guid>tag:blog.delphij.net,2012://2.2160</guid>
	<link>https://blog.delphij.net/2012/04/post-616.html</link>
	<description>&lt;p&gt;目前多数软件产品的安全更新都是在周二或者周三公布了。这种做法 &lt;a href=&quot;http://en.wikipedia.org/wiki/Patch_Tuesday&quot;&gt;据说&lt;/a&gt; 是微软开始采用的，不过具体是谁先开始这么做，目前我还没有找到非常可靠的资料。&lt;/p&gt;

&lt;p&gt;一般来说，软件开发者在发布安全更新之前，需要做下面这些事情：&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;确认问题存在，即，修正的确实是一个有安全影响的问题；&lt;/li&gt;
	&lt;li&gt;申请一个 CVE 编号；&lt;/li&gt;
	&lt;li&gt;找到修正问题的最小变动----有时，新版的软件由于代码重构等原因已经不再包含同样的漏洞，但是将重构向回移植可能会引入新的问题，或是导致接口不再兼容，因此有时需要实现另外的修正；&lt;/li&gt;
	&lt;li&gt;测试修正确实改正了问题；&lt;/li&gt;
	&lt;li&gt;测试兼容性；&lt;/li&gt;
	&lt;li&gt;发表；&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;而在用户这边，通常也需要进行少量的测试才可以大面积部署。由于时差的原因，周一或周五发表安全更新有可能会导致有些人必须在周末工作，因此不合适；周三发表安全公告会给 IT 人员留下充足的测试和部署时间，同时又避开了周末。&lt;/p&gt;</description>
	<pubDate>Fri, 27 Apr 2012 08:02:50 +0000</pubDate>
</item>
<item>
	<title>@shell909090: google drive你这是在找死</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2154</guid>
	<link>http://shell909090.com/blog/2012/04/google-drive%e4%bd%a0%e8%bf%99%e6%98%af%e5%9c%a8%e6%89%be%e6%ad%bb/</link>
	<description>&lt;p&gt;    昨天收到了google drive的邮件，今天就做了个简单的测试。我不确定是否是我的错觉，但是google drive不支持文件夹上传。
&lt;div&gt;    ？！&lt;/div&gt;
&lt;div&gt;    是的，我找了半天，没找到。即使有这个功能，它也被藏的很深，至少一个熟练用户花了10分钟找不到。据我看到的资料，这是因为谷歌试图抛弃文件概念。&lt;/div&gt;
&lt;div&gt;    好吧，抛弃文件概念是个先进的理念，我也认为那是对的。但是，当我需要为我的200多个手机小说，一个一个上传，然后再手工建立目录，重新分类，打tag的时候。你连从文件夹直接导入的功能都没有。&lt;/div&gt;
&lt;div&gt;    告诉我，我为什么要用你。&lt;/div&gt;
&lt;div&gt;    其余特性我就不多吐槽了，包括中国群众使用的不稳定(虽然不是你们的错，而且dropbox也不稳定)。才5G的免费空间。目前还没有客户端。至少这些问题都是可以改进的(除掉那个不是你们的问题)。&lt;/div&gt;
&lt;div&gt;    但是拿着已经存在的事实不当回事，只考虑未来是美好的——&lt;/div&gt;
&lt;div&gt;    ——那就是在找死了。&lt;/div&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 26 Apr 2012 19:36:47 +0000</pubDate>
</item>
<item>
	<title>@delphij: 全盘加密</title>
	<guid>tag:blog.delphij.net,2012://2.2154</guid>
	<link>https://blog.delphij.net/2012/02/post-614.html</link>
	<description>&lt;p&gt;最近在琢磨一个产品里实现全盘加密的问题，简单来说就是加入存储卷的硬盘存储的是完全加密的数据。对于保存机密数据（例如患者数据）的存储设备来说，这一点十分重要，举例来说，如果硬盘出现故障，OP可以直接把硬盘拆下送回厂商，而不是必须做抹除数据的动作。&lt;/p&gt;

&lt;p&gt;之前以为 AES-XTS 会导致延迟，实测发现 FreeBSD 的 GEOM_ELI 实现（配合 Xeon 5600 系列的 AES-NI 指令集）其实已经可以做到几乎没有差异了。因此，大致的想法是：&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;主机的非易失性存储上保存密钥（从 /dev/random 中dd），妥为备份；&lt;/li&gt;
	&lt;li&gt;所有的交换区均作加密（特别是在硬盘上的，如果有的话）；&lt;/li&gt;
	&lt;li&gt;系统引导过程中使用保存的密钥；&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;做了个原型出来，先测测再说。&lt;/p&gt;</description>
	<pubDate>Thu, 26 Apr 2012 00:24:11 +0000</pubDate>
</item>
<item>
	<title>@limodou: µ±Ç°¸üÐÂÖ÷ÒªÒÔÐÂÀËÎ¢²©ÎªÖ÷</title>
	<guid permalink="False">http://hi.baidu.com/limodou/blog/item/bc8bc75c9f660163faf2c044.html</guid>
	<link>http://hi.baidu.com/limodou/blog/item/bc8bc75c9f660163faf2c044.html</link>
	<description>²»ÊÇ¸øÐÂÀË×ö¹ã¸æ¡£Ò»¡¢ÎÒ»á¾­³£ÔÚÎ¢²©ÉÏ·¢Ð©¶¯Ì¬£¬±ÈÈçuliweb, plugsµÈ¡£¶þ¡¢°Ù¶Èrss¶©ÔÄÂÒÂë¡£Èý¡¢ÐÂÀËÓÐÇá²©¿Í£¬¿ÉÒÔÐ´³¤ÎÄ£¬ÕâÑùÎÒ¾Í¿ÉÒÔÖ»ÔÚÒ»¸öµØ·½Ð´ÁË¡£ÀÁµÃcopyÀ´copyÈ¥µÄ¡£&lt;p&gt;&lt;/p&gt; 
		
		&lt;br /&gt;&lt;b&gt;Àà±ð£º&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0&quot;&gt;Ä¬ÈÏ·ÖÀà&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/bc8bc75c9f660163faf2c044.html#comment&quot;&gt;²é¿´ÆÀÂÛ&lt;/a&gt;</description>
	<pubDate>Thu, 26 Apr 2012 00:00:00 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 和谐音程的条件</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2152</guid>
	<link>http://shell909090.com/blog/2012/04/%e5%92%8c%e8%b0%90%e9%9f%b3%e7%a8%8b%e7%9a%84%e6%9d%a1%e4%bb%b6/</link>
	<description>&lt;p&gt;    和谐音程的发生条件，是冠音的震动频率和根音呈倍数关系。以此为基础，我们做一个简单计算：
&lt;div&gt;首先是八度：&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;gt;&amp;gt;&amp;gt; 12*math.log(2, 2)&lt;/div&gt;
&lt;div&gt;12.0&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;    即，12个半音(高八度)是和谐音程。&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;gt;&amp;gt;&amp;gt; 12*math.log(3.0/2, 2)&lt;/div&gt;
&lt;div&gt;7.019550008653875&lt;/div&gt;
&lt;div&gt;&amp;gt;&amp;gt;&amp;gt; 12*math.log(4.0/3, 2)&lt;/div&gt;
&lt;div&gt;4.980449991346124&lt;/div&gt;
&lt;div&gt;&amp;gt;&amp;gt;&amp;gt; 12*math.log(5.0/4, 2)&lt;/div&gt;
&lt;div&gt;3.863137138648348&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;gt;&amp;gt;&amp;gt; 12*math.log(6.0/5, 2)&lt;/div&gt;
&lt;div&gt;3.1564128700055254&lt;/div&gt;
&lt;div&gt;&amp;gt;&amp;gt;&amp;gt; 12*math.log(7.0/6, 2)&lt;/div&gt;
&lt;div&gt;2.6687090560373763&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;    即，7个半音(纯五度)，5个半音(纯四度)，约4个半音(大三度)，约3个半音(小三度)，为和谐音程。由数值可以看出，纯四纯五的和谐程度又超过大三小三，因为和绝对和谐震动比例的误差更小。&lt;/div&gt;
&lt;div&gt;    再下面也是可以发生和谐音程的，只是误差更大而已。&lt;/div&gt;
&lt;div&gt;    为什么是“十二平均率”的原因也很清楚了。&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;gt;&amp;gt;&amp;gt; 1/(math.log(3.0/2, 2)-math.log(4.0/3, 2))&lt;/div&gt;
&lt;div&gt;5.884949192361715&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;    从数值上看，六平均率也是可以的。但是六平均率只能保证第二和三个和谐音程关系在音阶上，要保证第四个，就必须是11平均以上。&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;gt;&amp;gt;&amp;gt; 1/(math.log(4.0/3, 2)-math.log(5.0/4, 2))&lt;/div&gt;
&lt;div&gt;10.740053666281327&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;    综合两者，12平均率可以基本保证第二三四三个和谐音程都在音阶上。&lt;/div&gt;
&lt;div&gt;    同时，也基本满足人类对声音的分辨能力。&lt;/div&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 23 Apr 2012 17:53:01 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 你认识这人多少？</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2150</guid>
	<link>http://shell909090.com/blog/2012/04/%e4%bd%a0%e8%ae%a4%e8%af%86%e8%bf%99%e4%ba%ba%e5%a4%9a%e5%b0%91%ef%bc%9f/</link>
	<description>&lt;p&gt;    别误会，这篇是讲个人信息在网络上传播和留存相关话题的。但是不得不说，有点拷问人生的味道。
&lt;div&gt;    你究竟认识一个人多少呢？知道名字算认识么？知道性别，年龄，长相，工作单位，算认识么？&lt;/div&gt;
&lt;div&gt;    这么说吧，如果一个人留了足够多的信息在网络上，你就能找到他/她么？&lt;/div&gt;
&lt;div&gt;    本周末我就做了这个有趣的研究，事情从欢乐开始，结束于惆怅。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;# 我自己认识我自己吧 #&lt;/div&gt;
&lt;div&gt;    当然，如果不认识自己，您需要做的事情是逆运真气修炼九阴真经，而不是在这里看博客。既然您能够正常阅读博客，我假定您对自己的了解超过对其他任何一个人，同时您也是所有人中最了解自己的。&lt;/div&gt;
&lt;div&gt;    在这个假定下，贝壳搜索了自己的真名。结果是——第一个？没办法，用真名给网易写过一篇东西，就像在身上绑了一根定位锚一样，看起来很长时间内褪不下去了。Google上大部分都是那篇文章的转载，而baidu上还命中了我的开心首页。好吧，鉴于名人效应，我忽略这篇文章所有有关的内容继续研究。&lt;/div&gt;
&lt;div&gt;    第二个实验是使用自己的网名，分别搜索baidu和google。结果两者都是全部命中，没有一篇是错误的。可见shell909090是一个罕见关键字，如果你只知道我的英文名shell就糟了，全是某个能源公司和自然生物，翻到10多页都看不到我呢。&lt;/div&gt;
&lt;div&gt;    第三个实验是联合限定，使用自己的真名加上描述关键词，我首先选用了“程序”。结果是google在第三页找到了两个命中，都是python相关的内容。而baidu翻了三页什么都没有。。。&lt;/div&gt;
&lt;div&gt;    第四个实验是联合限定，关键词用大学名。结果是baidu三页内什么都没有，google给出了我的一篇论文，还有一篇通知，是我在吉他社当副社长的时候的。如果你知道我弹过吉他，应该能发现那是有关我的信息。&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;     结论：&lt;/p&gt;&lt;/div&gt;
&lt;div&gt;1. 仅仅搜索我本人而言，baidu只有一次比google强——他上面有开心的信息。后面两次google都给出了比baidu更加准确的关于我的信息。&lt;/div&gt;
&lt;div&gt;2. 如果没有网易的这篇文章，很多人不一定找的到我自己。你需要知道我的网名，或者知道我的职业，或者知道就读大学和兴趣。&lt;/div&gt;
&lt;div&gt;3. 个人身上的特征比想象的更少，尤其在网络上。我总不能联合我的身高体重吧，长相也没什么用处。一般只有职业，大学，公司这种特征才能有效筛选信息。&lt;/div&gt;
&lt;div&gt;4. 你对某人的了解在搜信息的时候多半用不到，在筛选哪条是的时候才用的上。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;# 有没有什么别人肯定搜不到的 #&lt;/div&gt;
&lt;div&gt;    贝壳其实有一篇IEEE论文，是合作作者。师兄的论文，贝壳提供仿真计算代码，师兄客气，给挂了个名字。这篇论文里，署名是Zhi-Xiang Xu。我自己都是IEEE发通知才知道，别人搜的到才有鬼！&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;
&lt;p&gt; # 筛我妹看看 #&lt;/p&gt;&lt;/div&gt;
&lt;div&gt;    为什么搜我妹？我基本把人在网络上的信息的多少和类型分为五类。第一类是老太太型，例如我外婆。什么都没有，也不用网络，你搜的到才是怪事。第二类是潜水员型，使用网络，但是不会在网络上使用自己的真名。偶尔帐号丢了就丢了，再申请一个，记得多少朋友就加多少。第三类是网络活跃型，网络上信息很多，但是基本都是网名为基础的，真名信息找不到。第四型是真实人物型，真名信息很多，但是网络上的活动类比一/二型。最后是全面活跃型，主要是网络名人，真名网名都是一堆信息。&lt;/div&gt;
&lt;div&gt;    我妹妹是潜水员的典型代表。我跳过整个过程，简述一下结果：满地都是某个书记的言论，无论我用什么关键字搜，基本都找不到相关信息。唯一的命中就是大学里面的考试名单，一个xls文件被公开在了网上。&lt;/div&gt;
&lt;div&gt;    结论：&lt;/div&gt;
&lt;div&gt;1. 要完全屏蔽信息不是你说了算的，很多时候依赖于学校老师/管理员/公司HR有没有错误的把信息贴出去，尤其是word文档。这是大部分人最容易中枪的地方。&lt;/div&gt;
&lt;div&gt;2. 当你的名字或者关键字和某个热关键字重合的时候，你的信息就像被遮盖起来一样，很难从大量垃圾中筛出。&lt;/div&gt;
&lt;div&gt;3. baidu基本找不到word文档，估计是没这个能力。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;# 老婆 #&lt;/div&gt;
&lt;div&gt;    本人名字和著名音乐家重合，所以死活找不到。联合大学找不到，联合单位后找到了一篇关于考试的xls文档，确实是她的。&lt;/div&gt;
&lt;div&gt;    换网名，我擦，满屏的命中，基本没几个错的，很多我都不知道。。。所以，我慢慢去看了。&lt;/div&gt;
&lt;div&gt;    里面还有她的班号，顺着还检索出了她的奖学金。各种信息满坑满谷。网络活跃型典型。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;# 小学同学 #&lt;/div&gt;
&lt;div&gt;    很罕见的名字，输入后直接筛出两篇内容，google和baidu都是同时给出。一篇是该同学写给哈尔滨日报的吐槽，2005年的事情。另一篇是该同学上班后发的文，被收录了。后者有她所属部门的名字，交叉检索后能够多看到一篇文档。影响力不大，估计是内部发行。还有一次去台湾出席会议的经历。资料不是太多，典型的真实人物型啊。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt; # 以前有过暧昧的女孩子1 #&lt;/div&gt;
&lt;div&gt;    恩，别告诉某喵，大家懂。&lt;/div&gt;
&lt;div&gt;    跳过过程，上结果：不行，只有她考试的名单。典型的潜水员。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;# 某个朋友 #&lt;/div&gt;
&lt;div&gt;    出乎贝壳的意料，直接输入姓名后，直接命中开心首页。google还命中了一场官司。从公开的文档中给出的家庭地址来看，确实就是她本人打的官司。这个算是信息的被动泄露，本人还是网络活跃型的吧。&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;# 以前曾经喜欢过的女孩子 #&lt;/div&gt;
&lt;div&gt;   曾经听说过此人进了中国一家很有名的网络公司当经理，一搜，果然有。不但有文字材料，还有该公司公关帐号放出的活动照片。近几年基本没怎么大变化，和当初看起来差不多。资料上发的文章，职位变迁一点不少，甚至还有一些帐号。但是没有QQ/开心之类的信息。也就是说，属于真实人物型。&lt;/div&gt;
&lt;div&gt;    好吧，看起来不错就好。这么多年，同学之间也只能说看你看起来不错就好。也许再过一段时间，标准会进一步降低为活着就好。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;# 以前有过暧昧的女孩子2 #&lt;/div&gt;
&lt;div&gt;    此人信息非常奇怪。首先是真名什么资料都找不到，那么就是二/三型的。我有她的hotmail，搜索之后找到了一个论坛，上面的资料非常全，而且还找到了一个QQ号。交叉检索QQ号，发现是她当时男朋友的。在德国华人社区有发言，和她说男朋友去德国留学相一致。再检索她的网名，有大量资料。但是奇怪的是，都在某个时间点以前。具体来说，大概是2008年5月前后。之后的信息就完全消失。而她男友的帐号直到今年(2012年)一月还在活跃。结合上述来说，我有种非常不好的预感。更炸头皮的是，我检索了自己和她联系的历史记录。在同一个时间点后，我发送的所有信息都没有回应。包括msn上线状态/聊天记录，手机拜年短信等。。。&lt;/div&gt;
&lt;div&gt;    结论：&lt;/div&gt;
&lt;div&gt;1. 此人改名搬家，去了德国。配合她男友的记录来看，这种情况不无可能。&lt;/div&gt;
&lt;div&gt;2. 此人曾说过，如果要躲某人，就会彻底和自己以前的生活告别，在陌生的城市里过陌生的生活，即使见到也不会相认。我相信她是做的到这点的人。&lt;/div&gt;
&lt;div&gt;3. 此人已死。&lt;/div&gt;
&lt;div&gt;    好吧，按照最低标准，活着就好。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;# 总结论 #&lt;/div&gt;
&lt;div&gt;1. 现实中大部分人都是一/二型，在网络上什么信息都找不到。之所以没有在贝壳这里体现，是因为贝壳做不到纯随机取样的条件。数据源本身是贝壳自己认识的人，大部分都是受到良好教育，能够熟练使用网络的青年。有不少甚至从事相关行业。用这些人做样本，你可以认为不存在不上网的人。&lt;/div&gt;
&lt;div&gt;2. 真的信息上网的人中，大部分都是网络活跃型，即使用网名会命中非常多的信息。上述例子的分析中，贝壳本人/小学同学/之前曾经喜欢过的女孩子在网络上主动留存了本名相关的资料，大约三分之一。但是上面说了，这些例子本身就是网络上留存数据的人的例子。可以粗略的得到结论，大约三分之一上网的人在网络上有真实的个人信息。&lt;/div&gt;
&lt;div&gt;3. 根据上条，在网上要找人，用网名比较有效。如果要被人找到，网名不要换比较有效。如果不要被找到，什么真实信息都不留，然后每隔一段时间换个帐号。 &lt;/div&gt;
&lt;div&gt;4. 但是一半以上都会被动泄露资料（尤其是xls文件），这说明网络对个人隐私的保护非常差。除去一个公示的例子是必须公开的，其余都是莫名其妙就出现在网上的。即使只通过这些资料还原，大约有三分之一人的基本信息也会被掌握。这本来是没必要的。&lt;/div&gt;</description>
	<pubDate>Sun, 22 Apr 2012 18:13:41 +0000</pubDate>
</item>
<item>
	<title>@zoomq: Haskell.cn 冲哪!</title>
	<guid>http://blog.zoomquiet.org/pyblosxom/2012/04/19/haskell-cn-run-2012-04-19-18-18</guid>
	<link>http://blog.zoomquiet.org/pyblosxom/Zen/haskell/haskell-cn-run-2012-04-19-18-18.html</link>
	<description>&lt;div class=&quot;header&quot; id=&quot;header&quot;&gt;
&lt;a name=&quot;toptopSkJRWEcyM&quot; id=&quot;toptopSkJRWEcyM&quot;&gt;&lt;/a&gt;&lt;h1&gt;Haskell.cn 冲哪!&lt;/h1&gt;
&lt;h2&gt;~ 小记Haskell 中国社区启动&lt;/h2&gt;
&lt;h3&gt;t2t渲染:2012-04-19 06:05:27&lt;/h3&gt;
&lt;/div&gt;

&lt;div class=&quot;toc&quot; id=&quot;toc&quot;&gt;
  &lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toc1RURTTFhKU&quot;&gt;以前&lt;/a&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toc2RURUWTVNS&quot;&gt;现在&lt;/a&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toc3RURTTFhKU&quot;&gt;以后&lt;/a&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toc4RURVTDdHN&quot;&gt;进展&lt;/a&gt;
  &lt;/li&gt;
  &lt;/ul&gt;

&lt;/div&gt;
&lt;div class=&quot;body&quot; id=&quot;body&quot;&gt;
&lt;a id=&quot;toc1NFM1MkxaT&quot; name=&quot;toc1NFM1MkxaT&quot;&gt;&lt;/a&gt;
&lt;h1&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toptopSkJRWEcyM&quot;&gt; 以前 &lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;在各种想象不到的地方,有各种隐士在快乐的学习以及使用 Haskell
&lt;/li&gt;
&lt;li&gt;甚至于,图书都有慢慢在翻译的,,,
&lt;p&gt;&lt;/p&gt;
但是,到底有多少中国人,在学习,使用 Haskell ?
&lt;p&gt;&lt;/p&gt;
真心不知道,好象也没有人知道...
&lt;/li&gt;
&lt;/ul&gt;

&lt;a id=&quot;toc2NDZITEJaT&quot; name=&quot;toc2NDZITEJaT&quot;&gt;&lt;/a&gt;
&lt;h1&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toptopSkJRWEcyM&quot;&gt; 现在 &lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.qconbeijing.com/news.php?id=37&quot;&gt;QCon北京2012大会&lt;/a&gt; &quot;编写显然正确的代码&quot; ~ 黄毅,已经首次,公开吼 Haskell 了
&lt;/li&gt;
&lt;li&gt;当然,其实,以前在沙龙就吼过... &lt;a href=&quot;http://yi-programmer.com/slide/haskell-intro/&quot;&gt;Haskell介绍&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;好象,各种媒体,慢慢的因为多核,因为并发,重新关注起来了 Haskell
&lt;/li&gt;
&lt;li&gt;豆瓣小组里终于:
&lt;p&gt;&lt;/p&gt;
    &lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;http://www.douban.com/group/topic/28920097/&quot;&gt;关于建立Haskell中文(社区)的一点想法&lt;/a&gt;
    &lt;p&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;好事儿呢! 相关 Google groups 也创立几年了,只是一定没有什么热闹的讨论
&lt;/li&gt;
&lt;li&gt;因为没有什么大家都可以掺合的 hs 实践,除了自学,写点片段自娱自乐...
&lt;/li&gt;
&lt;/ul&gt;

&lt;a id=&quot;toc3NFM1MkxaT&quot; name=&quot;toc3NFM1MkxaT&quot;&gt;&lt;/a&gt;
&lt;h1&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toptopSkJRWEcyM&quot;&gt; 以后 &lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;有了社区,就聚集了人
&lt;/li&gt;
&lt;li&gt;有了人,就应该有很 COOL 的项目
&lt;/li&gt;
&lt;li&gt;有了项目就有了代码,将代码运行起来,服务我们自个儿,,,
&lt;/li&gt;
&lt;li&gt;社区就活跃了呢...
&lt;/li&gt;
&lt;/ul&gt;

&lt;a id=&quot;toc4NUM3WlhaT&quot; name=&quot;toc4NUM3WlhaT&quot;&gt;&lt;/a&gt;
&lt;h1&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toptopSkJRWEcyM&quot;&gt; 进展 &lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://haskell.cn&quot;&gt;http://haskell.cn&lt;/a&gt; 域名已经找到主持人
&lt;/li&gt;
&lt;li&gt;大妈聚集起来了: &lt;a href=&quot;https://github.com/HaskellCNOrg&quot;&gt;https://github.com/HaskellCNOrg&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;应用仓库也有了: &lt;a href=&quot;https://bitbucket.org/ZoomQuiet/haskell2cn&quot;&gt;https://bitbucket.org/ZoomQuiet/haskell2cn&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
然后? 我们需要什么社区功能?!
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;俺习惯性的部署了: &lt;a href=&quot;http://haskell.cn/rss/&quot;&gt;Haskell.cn 聚合&lt;/a&gt;
&lt;p&gt;&lt;/p&gt;
...
&lt;/li&gt;
&lt;/ul&gt;

&lt;hr class=&quot;light&quot; /&gt;
&lt;p&gt;
动力源自::&lt;b&gt;&lt;a href=&quot;http://txt2tags.sf.net&quot;&gt;txt2tags&lt;/a&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;/div&gt;

&lt;!-- xhtml code generated by txt2tags 2.4 (http://txt2tags.sf.net) --&gt;
&lt;!-- cmdline: txt2tags haskell-cn-run-2012-04-19-18-18.t2t --&gt;</description>
	<pubDate>Thu, 19 Apr 2012 10:18:00 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 语义的精密表达</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2148</guid>
	<link>http://shell909090.com/blog/2012/04/%e8%af%ad%e4%b9%89%e7%9a%84%e7%b2%be%e5%af%86%e8%a1%a8%e8%be%be/</link>
	<description>&lt;div&gt;    辨析语言的微妙差异，使得语言精密的符合目的语义，此为程序员基本功的最高要求。对精密语义的追求，应当凌驾于排版美观，代码美感，代码简化之上，也凌驾于运行时效率之上。除非为特定目的小幅的修正，否则不应破坏此原则。&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;以此为指导，我们看几个if。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt; # if a in python #&lt;/div&gt;
&lt;div&gt;    以下代码的目标语义是，如果a不为None，就运行代码。&lt;/div&gt;
&lt;div&gt;`if a:&lt;/div&gt;
&lt;div&gt;    do something`&lt;/div&gt;
&lt;div&gt;    有什么问题？&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;有没有考虑a=0的情况？a=[]呢？&lt;/div&gt;
&lt;div&gt;`if a is not None:&lt;/div&gt;
&lt;div&gt;    do something`&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;这样才是严密表达。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;# if a in C #&lt;/div&gt;
&lt;div&gt;    以下代码的目标语义是，a是一个int数，对a!=0的情况下，执行代码。&lt;/div&gt;
&lt;div&gt;`if (a)&lt;/div&gt;
&lt;div&gt;    do something`&lt;/div&gt;
&lt;div&gt;    有什么问题？&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;没问题，因为C是静态语言，这限定了a的使用。除了代码并没有体现a!=0的条件，没有太大问题。但是鉴于语言表达语义，最好改为以下代码。&lt;/div&gt;
&lt;div&gt;`if (a != 0)`&lt;/div&gt;
&lt;div&gt;    相对的，如果a是bool型，就可以直接用了。&lt;/div&gt;
&lt;div&gt;`if (a)`&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;如果a是char*形，那么合适的语义表达应当是。&lt;/div&gt;
&lt;div&gt;`if (a != NULL)`&lt;/div&gt;
&lt;div&gt;    他们生成的汇编代码都没有差异。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;# if a in C++ #&lt;/div&gt;
&lt;div&gt;    概念上同C，不过a是一个复杂对象。&lt;/div&gt;
&lt;div&gt;`if (a)&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;do something`&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;有什么问题？&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;问题大了去了，和python一样，C++可以重载行为。谁知道type(a)::opreator bool(const type(a) &amp;amp;a)函数被定义为什么鬼逻辑。这就是为什么我憎恨默认行为重载的原因——因为他们对精密语义表达有破坏作用。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 18 Apr 2012 19:25:34 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 值返回和指针返回简说</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2146</guid>
	<link>http://shell909090.com/blog/2012/04/%e5%80%bc%e8%bf%94%e5%9b%9e%e5%92%8c%e6%8c%87%e9%92%88%e8%bf%94%e5%9b%9e%e7%ae%80%e8%af%b4/</link>
	<description>&lt;p&gt;    好吧，这是常识，我说快点。
&lt;div&gt;    C * c = get_c();&lt;/div&gt;
&lt;div&gt;    这是指针返回。&lt;/div&gt;
&lt;div&gt;    C c = get_c():&lt;/div&gt;
&lt;div&gt;    这是值返回。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;    指针返回的缺点是，你必须检测返回指针的有效性，也就是NULL。并且，你需要手工管理指针释放。而优点则是避免了值拷贝，还有可以返回空值，即通过返回NULL表示没有值的情况。&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;     而引用返回最大的优势在于，变量的生存周期和作用域相同，你无需管理释放问题。然而缺陷就是庞大的拷贝开销。&lt;/p&gt;&lt;/div&gt;
&lt;div&gt;    在get_c返回的时候，会return一个对象。这个对象是子函数作用域对象(sub function scope)，会随着子函数退出而失效。因此，在返回值的时候会引发拷贝。这种拷贝有两种可能。&lt;/div&gt;
&lt;div&gt;1. 拷贝构造&lt;/div&gt;
&lt;div&gt;    当返回值被用于某个对象的声明时，会触发拷贝构造函数。被返回的对象会作为拷贝构造参数传递(引用传递)，而拷贝出的对象就是被生成对象。&lt;/div&gt;
&lt;div&gt;2. 赋值算子&lt;/div&gt;
&lt;div&gt;    即operator =。当对某个已经声明对象进行赋值时，会发生这种现象。&lt;/div&gt;
&lt;div&gt;    当然，近代编译器对于“在返回时进行构造用于返回后的构造”这种情况做了优化，通称RVO优化。例如上文，如果get_c中使用return C(a, b);进行返回，实际上只有C::C(a, b)的调用，而没有C::C(const C &amp;amp; c)的调用。&lt;/div&gt;&lt;/p&gt;</description>
	<pubDate>Tue, 17 Apr 2012 17:53:48 +0000</pubDate>
</item>
<item>
	<title>@shell909090: vps上应当装什么</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2144</guid>
	<link>http://shell909090.com/blog/2012/04/vps%e4%b8%8a%e5%ba%94%e5%bd%93%e8%a3%85%e4%bb%80%e4%b9%88/</link>
	<description>&lt;div&gt;
&lt;div&gt;    假定你有一台debian vps，上面需要装一些东西来——你懂。你应该装一些什么呢？&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;# 基础部分 #&lt;/div&gt;
&lt;div&gt;## ssh ##&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;没啥好多说，没有ssh，你甚至无法管理机器。不过注意，安全的ssh方式应当只允许使用key登录，禁止一切密码登录。而且对于没必要登录的某些用户，需要在/etc/passwd中将shell改为/bin/false。至于端口改不改，这个不重要，看你心情。&lt;/div&gt;
&lt;div&gt;## vim ##&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;debian默认装的是vim-tiny，很不好用。建议改为vim，改配置的时候让自己舒服点。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;## 安全部分 ##&lt;/div&gt;
&lt;div&gt;## iptables-persistent ##&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;这是debian内用于iptables规则持久化的工具，你可以编辑/etc/iptables/rules.v4来修改防火墙规则。注意，目前debian stable(squeeze)中的版本还没有4/6区分，你可以弄一个testing(wheezy)中的来装。&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;一般来说，你的规则中至少要包含以下内容：&lt;/div&gt;
&lt;div&gt;`&lt;/div&gt;
&lt;div&gt;-A INPUT -m state &amp;#8211;state RELATED,ESTABLISHED -j ACCEPT&lt;/div&gt;
&lt;div&gt;-A INPUT -i lo -j ACCEPT&lt;/div&gt;
&lt;div&gt;-A INPUT -i tun+ -j ACCEPT&lt;/div&gt;
&lt;div&gt;-A INPUT -i ppp+ -j ACCEPT&lt;/div&gt;
&lt;div&gt;-A INPUT -p tcp -m multiport &amp;#8211;dport 22,xxx,xxx,xxx -j ACCEPT&lt;/div&gt;
&lt;div&gt;-A INPUT -p udp -m multiport &amp;#8211;dport xxx,xxx,xxx -j ACCEPT&lt;/div&gt;
&lt;div&gt;`&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;而且强烈建议，先保存一个没问题的iptables，然后直接修改iptables，再保存。这样的好处是，当你脑残改错了导致你自己都无法管理的时候，只要重启就可以恢复vps工作，而不用更麻烦的动作。&lt;/div&gt;
&lt;div&gt;## denyhosts ##&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;这是ssh的连接防御进程，用python编写。如果有人试图尝试你的ssh密码，这个程序就会踢掉他的ip。&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;如果你已经用了我说的，通过key的连接方式，你可以一次就直接踢掉对方ip。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;# 管理部分 #&lt;/div&gt;
&lt;div&gt;## ifstat ##&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;ifstat是用于网络流量管理的工具，可以告诉你网络目标的流量是多少。&lt;/div&gt;
&lt;div&gt;## dnsutils ##&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;dnsutils里面包含了不少用于管理dns的工具，包括我们常用的nslookup，还有相对少用的dig。&lt;/div&gt;
&lt;div&gt;## mtr-tiny ##&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;mtr是一个traceroute工具，比后者好用很多。这个工具可以快速跟踪路由。&lt;/div&gt;
&lt;div&gt;## vnstat ##&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;vnstat是用于跟踪网卡流量的工具，尤其对于每个月都有限额的vps，这个工具更有意义。&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;注意安装完成后需要初始化每个网卡，然后重启服务，而不是马上能够工作。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;# 网络部分 #&lt;/div&gt;
&lt;div&gt;## pptp ##&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;pptp是一个经典的vpn服务，直接安装pptpd就好。注意，部分手机不支持128bit的mppe，关闭后可以连接。但是windows只支持128bit的mppe，关掉就无法连接。So，自己权衡。&lt;/div&gt;
&lt;div&gt;## openvpn ##&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;openpn是一个非常稳定而强大的vpn程序，他使用udp作为连接协议。其实openvpn有tcp协议模式，但是速度比udp慢很多。&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;openvpn的配置很长，我也写过，就不赘述了，可以参考这三篇文章([1.搭建家用的OpenVPN服务器](&lt;a href=&quot;http://shell909090.com/blog/2009/09/%E6%90%AD%E5%BB%BA%E5%AE%B6%E7%94%A8%E7%9A%84openvpn%E6%9C%8D%E5%8A%A1%E5%99%A8/&quot; target=&quot;_blank&quot;&gt;http://shell909090.com/blog/2009/09/%E6%90%AD%E5%BB%BA%E5%AE%B6%E7%94%A8%E7%9A%84openvpn%E6%9C%8D%E5%8A%A1%E5%99%A8/&lt;/a&gt;), [2.说说x509证书链](&lt;a href=&quot;http://shell909090.com/blog/2011/04/%E8%AF%B4%E8%AF%B4x509%E8%AF%81%E4%B9%A6%E9%93%BE/&quot; target=&quot;_blank&quot;&gt;http://shell909090.com/blog/2011/04/%E8%AF%B4%E8%AF%B4x509%E8%AF%81%E4%B9%A6%E9%93%BE/&lt;/a&gt;), [3.再论openvpn的搭建](&lt;a href=&quot;http://shell909090.com/blog/2011/05/%E5%86%8D%E8%AE%BAopenvpn%E7%9A%84%E6%90%AD%E5%BB%BA/)&quot; target=&quot;_blank&quot;&gt;http://shell909090.com/blog/2011/05/%E5%86%8D%E8%AE%BAopenvpn%E7%9A%84%E6%90%AD%E5%BB%BA/)&lt;/a&gt;)。&lt;/div&gt;
&lt;div&gt;## l2tp ##&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;l2tp的配置比openvpn更加繁琐，我配置过多次，始终在部分的设备上可以访问，部分不可以。因此等全部搞定后，会专门写一篇确认一下。&lt;/div&gt;
&lt;div&gt;## iodine ##&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;iodine是一个dns vpn。&lt;/div&gt;
&lt;div&gt;## ssh ##&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;ssh用于翻墙常见两种模式，固定端口转发和动态端口转发。前者使用-R将远程的某个端口映射到本地。通常而言，映射的都是squid或者polipo(推荐后者，内存消耗更小，更好配置)。这样相当于在本地可以访问远程的代理，从而达到翻墙的效果。这个的命令行是ssh -L port:localhost:port &amp;#8230;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;而动态端口转发则是使用ssh -D port &amp;#8230;，将本地的port端口变成一个支持socks5协议的代理服务器。&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;相比而言，-D模式更加灵活，提供了全协议的访问，本地可以通过polipo转换为http代理。而-L模式则不能提供socks5代理功能(除非远程的端口上是socks5代理服务，但是这样就回到了-D模式，反而多开了一个服务)。但是有些时候(例如android的ssh翻墙软件)只支持后者的模式。&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;另外，不要用日常管理帐号翻墙。新开一个翻墙帐号，并且设定独立的key。然后禁用shell，在ssh的时候，使用参数-CNq，这个参数可以不打开shell。如果网络不稳定，可以加上-o ServerAliveInterval 30。&lt;/div&gt;
&lt;div&gt;## stunnel ##&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;stunnel本身没有任何功效，他只是将你的普通连接转换为ssl连接而已。当这个程序搭配其他程序，例如polipo，就可以实现一个ssl级别的代理。&lt;/div&gt;
&lt;div&gt;## httptunnel ##&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;这是一个服务软件，服务器端运行一个httptunnel，客户端运行一个。而后客户端就可以获得一个到服务器端的tcp连接，不受限的。&lt;/div&gt;
&lt;div&gt;## polipo ##&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;polipo常见有两种模式，端口转发模式和ssl模式。两者都在前文有说。端口转发模式配合ssh用，ssl模式配合stunnel用。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;以上的服务看似很多，实际上，在128M内存的实例上完全可以运行其中大部分的服务。你可以在一台服务器上运行其中多个，以保证全天候的服务。&lt;/div&gt;
&lt;/div&gt;</description>
	<pubDate>Mon, 16 Apr 2012 23:00:21 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 2012年4月12日断网的技术记录</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2142</guid>
	<link>http://shell909090.com/blog/2012/04/2012%e5%b9%b44%e6%9c%8812%e6%97%a5%e6%96%ad%e7%bd%91%e7%9a%84%e6%8a%80%e6%9c%af%e8%ae%b0%e5%bd%95/</link>
	<description>&lt;div&gt;    4月12日上午, 大约北京时间10点(UTC02:00前后), 中国大部分地区发生了一次断网. 这次断网我有幸正好在使用网络, 因此跟踪调试了整个过程.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;1. 网络开始中断&lt;/div&gt;
&lt;div&gt;   当时我在公司里面用ssh调整一台国外的机器, 同时用另一台机器作为ssh跳板访问google. 问题发生的时候, 很多国外网站都无法打开, ssh指令不能工作. 我的第一反应就是, GFW针对ssh做了拦截.&lt;/div&gt;
&lt;div&gt;   鉴于其他可能, 我登录回了家中, 从家里的机器直接ssh到国外的跳板, 一切正常. 莫非只是我这里的ssh发生了断路? 我正在这么猜测的时候, 家里的ssh也随即断开. 我kill了当前进程, 重新连接后, 恢复了对家里服务器的控制, 但是境外的ssh跳板已经不能连接.&lt;/div&gt;
&lt;div&gt;   至此, 可以确定中国出国网络逐步发生中断, 针对什么协议, 机制如何尚不清楚.&lt;/div&gt;
&lt;div&gt;   但是, 我同时用同一台机器打开了openvpn, openvpn会提供一个内网接口. 我偶然的用这个内网iface访问了一下, 一切正常. 再尝试了一下, openvpn上网正常. 这说明问题可能局限在ssh上.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;2. 这不是一个个例, 这是大规模断网&lt;/div&gt;
&lt;div&gt;   既然我对境外服务器还有控制能力, 我就更换了一个ssh端口, 但是问题并没有解决. 这似乎说明封锁不是针对端口(port), 而是针对协议(protocol)的. 为了确证这点, 我对通讯过程做了抓包, 但是结果出乎我的意料. 问题并不出现在ssh握手的时候, 而是tcp第二步的syn-ack回包彻底消失. 这表明封锁并不针对ssh协议, 而是tcp协议栈!&lt;/div&gt;
&lt;div&gt;   这非常疯狂, 如果是这样的话, 大部分基于tcp的网络协议将无法工作, 包括境外大部分网站的http协议. 我从twitter上看到, 很多人的各种工具都相继失效, 并且境外很多的http(而非https)确实无法访问, 这和我的判断相一致. 这是针对tcp协议栈的大规模拦截.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;3. 为什么特殊&lt;/div&gt;
&lt;div&gt;   通常而言, GFW有三个常见工作模式.&lt;/div&gt;
&lt;div&gt; * dns污染&lt;/div&gt;
&lt;div&gt;* ip封锁&lt;/div&gt;
&lt;div&gt;* 深度包过滤(关键字拦截)&lt;/div&gt;
&lt;div&gt;  其中dns封锁只对域名有效, ip封锁只对ip有效, 只有深度包过滤才是最麻烦的. 但是通常深度包过滤是使用旁路过滤的方式, 在连接出现问题时发出rst包干扰tcp工作. 而本次的模式是将境外向境内的tcp包直接丢弃, 而非rst. 这是ip封锁的模式. 根据上文的经验和我在twitter上收集的有限几个数据, 封锁范围似乎随着不同的网络连接方式而发生变化. 我这里可以连接的设备在其他人那里就无法继续连接, 反之亦然. 似乎是在多个不同的核心路由器上逐步部署不同的路由器规则, 对境外的特定回包给与丢弃. 这表示GFW的工作模式有可能从包检测向白名单过渡.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;4. 为什么麻烦&lt;/div&gt;
&lt;div&gt;   白名单是很难对付的一种模式. 对于深度包检测, 可以通过修改包的封装性质予以绕过. ssh/vpn都是这类的典型方式. 然而白名单使得你很难在境外部署一台处于你自己控制之下的服务器. 即使你可以在境外弄到一台服务器(这到不困难), 也没有希望将服务器ip加入白名单内. 由于白名单内的都是国家认可的服务器, 因此上面运作的服务基本都是无可能进行绕行的.&lt;/div&gt;</description>
	<pubDate>Sun, 15 Apr 2012 18:24:40 +0000</pubDate>
</item>
<item>
	<title>@delphij: 远程升级 FreeBSD 系统备忘</title>
	<guid>tag:blog.delphij.net,2012://2.2158</guid>
	<link>https://blog.delphij.net/2012/04/-freebsd-2.html</link>
	<description>&lt;p&gt;最近两次失败记录的教训。&lt;/p&gt;

&lt;p&gt;首先是联编 world 和 kernel (make buildworld buildkernel)，这个没啥可说的。假定 / 是 UFS（即，可使用 nextboot），且配置了 watchdog，则操作步骤为：&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;make installkernel KODIR=/boot/kernel.new; nextboot -k kernel.new 【令系统尝试一次新内核启动；若失败，则下次仍会启动旧内核】&lt;/li&gt;
	&lt;li&gt;shutdown -r now&lt;/li&gt;
	&lt;li&gt;mergemaster -p 【建议做这步操作，可以避免选错】&lt;/li&gt;
	&lt;li&gt;make installkernel installworld 【此处再做一遍installkernel；如果不做，可能导致系统从旧内核启动并导致失败】&lt;/li&gt;
	&lt;li&gt;mergemaster -Ui&lt;/li&gt;
	&lt;li&gt;yes | make delete-old 【删去不需要的文件和库；不要make delete-old-libs，因为可能导致某些新程序无法运行】&lt;/li&gt;
	&lt;li&gt;portmaster -BDavf 【重新联编所有 package】&lt;/li&gt;
	&lt;li&gt;yes | make delete-old-libs 【此时删除旧 .so 库应该是安全的了】&lt;/li&gt;
	&lt;li&gt;shutdown -r now，测试&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;当然，更简单的方法是先接好IPMI。&lt;/p&gt;</description>
	<pubDate>Sat, 14 Apr 2012 13:54:58 +0000</pubDate>
</item>
<item>
	<title>@shell909090: mirrors.geekbone.org软件仓库镜像站将于4月中旬下线</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2140</guid>
	<link>http://shell909090.com/blog/2012/04/mirrors-geekbone-org%e8%bd%af%e4%bb%b6%e4%bb%93%e5%ba%93%e9%95%9c%e5%83%8f%e7%ab%99%e5%b0%86%e4%ba%8e4%e6%9c%88%e4%b8%ad%e6%97%ac%e4%b8%8b%e7%ba%bf/</link>
	<description>&lt;div&gt;    原文[在此](&lt;a href=&quot;http://www.shlug.org/?p=1515)%E3%80%82&quot; target=&quot;_blank&quot;&gt;http://www.shlug.org/?p=1515)。&lt;/a&gt;我用了5年多的cn99和geekbone两大镜像终于全部下线。&lt;/div&gt;
&lt;div&gt;    需要通告的一点关键问题即是, 由于tux下线早于新一个版本的debian发行, 因此目前&lt;a href=&quot;http://mirrors.geekbone.org&quot;&gt;mirrors.geekbone.org&lt;/a&gt;还是已经发行的debian安装盘的官方源之一. 请大家在安装debian6的时候不要再选择geekbone, 并请通告其他debian用户.&lt;/div&gt;
&lt;div&gt;    在09年加入shlug之初，就知道当年用了很久的geekbone服务器是shlug管理维护的。当时就很惊讶，以捐助方式运作一台镜像服务器，这个是相当不容易的。包括募集，管理，账目，在中国要做整套过程需要相当心力。而且geekbone还是在debian有注册的镜像站之一。可以看[Debian 全球鏡像站](&lt;a href=&quot;http://www.debian.org/mirror/list&quot; target=&quot;_blank&quot;&gt;http://www.debian.org/mirror/list&lt;/a&gt;)。&lt;/div&gt;
&lt;div&gt;    大约在11年，中科大的ustc服务器上线后。在一次和lightning的闲聊中，lightning就谈到了tux服务器的问题。当时tux的服务器硬盘已经不足，最多在数月后就会满额。lightning删除了部分上面的无用数据，让服务器可以稍稍多工作一些时日。我当时就建议不要全面镜像所有的debian镜像，毕竟当时中国已经有anheng和ustc两个全面源，其中ustc还在申请大陆一级源(他们的资源投入确实不错，镜像速度相当快)。tux毕竟是老服务器，可以转做i386和amd64两个主要镜像。国内大部分人用的都是这两个arch，sohu的部分镜像也是针对这部分的。lightning表示看看再说。&lt;/div&gt;
&lt;div&gt;    今天，看到了shlug通告，tux服务器准备下线。想想也的却是，tux已经在超期服役，而国内已经有了ustc, anheng, sohu, bjtu四个镜像. 再进行一次募捐让tux恢复服役看来是没什么必要了.&lt;/div&gt;
&lt;div&gt;    在此, 感谢一下shlug服务器维护团队, 谢谢你们的努力让我五年来得以享用快速的源服务. 祝tux一路走好, 愿电脑诸神与它同在, enter.&lt;/div&gt;
&lt;div&gt;    另外, 提一点我们和欧美的工业水准差距. 我曾经撰文说过, 中国要追赶美国还有很长的路要走. 当时列举的证据就是dd和debian mirror lists. 当时我们也是4个源, 目前加入了bjtu, tux退出, 还是4个源. 相比美国那个深不见底, 鼠标滚轮滚好几下都没看到头的列表, 实在是太差距了. 这个差距不仅体现在源少, 更体现在用户少. 用户少就是源少的原因. 如果用户增长一个数量级, 目前这些源肯定会发生不足, 然后吵着让各个大学再开一两个镜像出来. 我倒是觉得这样不错, 至少sjtu有机会露个脸. 其实sjtu也是有自己的[源](&lt;a href=&quot;http://ftp.sjtu.edu.cn/debian/)%E7%9A%84&quot; target=&quot;_blank&quot;&gt;http://ftp.sjtu.edu.cn/debian/)的&lt;/a&gt;, 只是没有对普通网络用户开放, 访问速度缓慢而已.&lt;/div&gt;</description>
	<pubDate>Thu, 12 Apr 2012 17:38:56 +0000</pubDate>
</item>
<item>
	<title>@shell909090: segment的核心数据结构空间和时间效率估量</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2138</guid>
	<link>http://shell909090.com/blog/2012/04/segment%e7%9a%84%e6%a0%b8%e5%bf%83%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84%e7%a9%ba%e9%97%b4%e5%92%8c%e6%97%b6%e9%97%b4%e6%95%88%e7%8e%87%e4%bc%b0%e9%87%8f/</link>
	<description>&lt;div&gt;    首先我们简述核心词典的目标。词典最主要的目标是，给定一句句子S，匹配出所有和句子开始拥有完整匹配的词语。所谓完整匹配，就是句子开始的一定长度的连续序列和词语相等。例如，中华，中华人民，中华人民共和国，都是句子：中华人民共和国今天成立了，的完整匹配。&lt;/div&gt;
&lt;div&gt;    要解决这个问题，直观方式是使用tied tree。但是中文的tied tree非常不好实现。英文的tied tree在一个节点上最多拥有不超过26个子节点，而中文的在根上面会拥有6000个以上的子节点，使用同样的结构在子节点上会浪费大量内存。&lt;/div&gt;
&lt;div&gt;    我们先跳过tied树本身的细节，来讨论如何使用python内置数据结构高效简洁的完成这一工作。作为一个读比写高频很多的结构，无疑hash table是一个非常适合的结构。我在hash table的性能分析中说过，hash table的查询性能是O(1)量级的。无疑，可以使用hash tree来高速完成查找。同时注意一点，词语的最小长度是2，因此不存在只有一级的结构。所以，hash tree的第一级结构可以从2开始，而不是1。&lt;/div&gt;
&lt;div&gt;    实现效果如何？我们正式给出的词典拥有127K的词汇量，平均第二级宽度为6.8，因此大致可以推算出，第一级的词典含有元素19K个左右。python源码解析中说过，当表项小于50000个时，扩张大小为当前活跃表项的4倍，最高填充率不超过2/3，即填充率最低25%，最高66%。平均来说，填充率应当在45%上下波动，我们以0.5计算，实际上一级词典的Entry个数应当是40K个上下。在源码Include/dictobject.h:50有给出Entry的结构，这应当是三个平台相关的数据结构，以贝壳的64位系统而言，长度应当是24字节。忽略掉辅助结构，一级词典的大小应当是960K，即约1M。而词典指向的数据，即2字长的str对象本身头部长度24字节，辅助数据长度12字节，数据长度4字节（utf-16编码的两个unicode），null term1字节，共计41字节。由于python对象是8字节对齐，因此实际占用48字节。19K个数据总计占用912K。&lt;/div&gt;
&lt;div&gt;    二级表项平均长度6.8，这个长度很难估量。因为5的话总表项刚好是8，而6就会增长到24，我们取中间数20做一个估量值（因为6.8毕竟大大偏离了5），一个词典的大小应当是480字节，加上头部大约是512字节（算的粗糙点吧），19K个词典就是8.5M左右。指向的对象长度更加难估量，我们粗糙点按照96字节一个对象（别忘记了，unicode对象不但成员多，而且超出了BOM，一个字占4字节），127K个对象大约是12M内存。而float内部使用C的double类型，一个对象占据32字节，127K个对象占据4M内存。&lt;/div&gt;
&lt;div&gt;    以上总计，初级词典本身占用1M，关键字占1M。二级索引占据10M，关键字占12M，频率数据占4M。总计28M内存，基本上一个12.7W词的词典，大小2.5M，占据30M内存，这就是dict核心词典的空间效率估量。&lt;/div&gt;
&lt;div&gt;    时间复杂度估量更加复杂，不过我们可以简化来说。初级索引需要多少时间？O(1)量级，毋庸置疑。问题是二级词典的复杂度，异常难算。凑合一下，按照比较6.8次计算（因为必须通过遍历才能知道全部的匹配）索引出一个句子所有的完整匹配的时间复杂度O应当为O(n)，其中n是平均二级索引宽度。目前而言，实际测量结果，平均6.8。当词汇量大于一定值后，随着词典的加大，这个值基本是线性增加的，我们粗略的可以认为O(n)即是正比于词典大小。&lt;/div&gt;
&lt;div&gt;    而后我们顺便给出分词核心算法在处理一句话时的效率估量吧，证明太长，这里写不下。假定句子长度S，词典大小N，匹配数目M，分词算法的时间复杂度量级为O(N*M*S)，有兴趣的可以帮我复核一下，这个证明颇为困难，不知道有没有证错。在实际运行的时候，匹配数目会跟着词典的增长而增长，而句子长度则相对固定。当然，明眼人一眼就可以看出，所谓匹配数据随着词典增长而增长，其中并不是正比的。而是O(1)&amp;lt;O&amp;lt;O(n)。因此我们可以看作时间复杂度为O(N)&amp;lt;O&amp;lt;O(N^2)，具体是什么，做不出来。&lt;/div&gt;
&lt;div&gt;    然后是纯粹的tied tree的性能估量。讲到tied tree，我们就必须要提到如何实现一个有效的tied tree。实际上纯粹用区域哈希映射太浪费内存了，而顺序查找太浪费时间。比较折衷的办法还是只有——dynamic hash table。&lt;/div&gt;
&lt;div&gt;    不过这次我们就可以控制一下哈希表的大小了。对于大小不超过6W的哈希，我建议采用crc32，虽然离散度并不高，但是作为一个近似填满的hash table的hash key足矣（这点需要实际考察一下）。如果是自己实现，表项直接存字符串，连指针都不需要，采用开链法。总计大小1M即可以保存所有的一级数据。&lt;/div&gt;
&lt;div&gt;    二级数据就无法这么偷懒了，因为二级结构中字符串长度不定。但是以数据展开大小只有2.4M来看，无论这一级别如何扩张，字符串本身大小不应当超过3M。开链法一个节点24字节，平均填充率0.5计算，14个表项一个词典（这个也可以自行控制了），336个字节一个词典，乘以19K个dict。大约6.23M。127K个频率数据1M，这是常规占用。&lt;/div&gt;
&lt;div&gt;    以上总计，初级词典本身占用1M，二级结构本身占用10M，不超过20M应当就可以构建起一个高效的核心数据结构。由于实现类似，时间复杂度也类似，就不详细推论了。&lt;/div&gt;
&lt;div&gt;    以上还有一点可改进之处，dict作为二级存储的绝对劣势在于，必须要对比全部词典才能确定完全匹配数量，于是时间复杂度正比于词典大小。严格的tied树只需要沿着顺序进行几次索引即可，复杂度取决于词语长度——基本来说和词典大小无关。按照这个推论，实现一个紧凑的，高效的二级小结构，可能比较有利于减小总体大小，增加工作速度。&lt;/div&gt;</description>
	<pubDate>Wed, 11 Apr 2012 17:55:37 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 赞一下京东</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2136</guid>
	<link>http://shell909090.com/blog/2012/04/%e8%b5%9e%e4%b8%80%e4%b8%8b%e4%ba%ac%e4%b8%9c/</link>
	<description>&lt;p&gt;    昨天觉得背不舒服，买了个按摩器，200。
&lt;div&gt;    10点下单，下午两点就送到了，效率不错。&lt;/div&gt;
&lt;div&gt;    但是用了20分钟，不动了。照说明冷却了一阵，还是不动，遂报换货。&lt;/div&gt;
&lt;div&gt;    下午四点打电话，10分钟后就来电确认了，五点来了个人，把东西拿走了。&lt;/div&gt;
&lt;div&gt;    我要求换货，目前页面写的是退货，不知道会不会把新品送来。&lt;/div&gt;
&lt;div&gt;    不过效率很不错呢。&lt;/div&gt;&lt;/p&gt;</description>
	<pubDate>Tue, 10 Apr 2012 19:18:48 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 如何用tabbar插件做emacs的tab定位切换</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2134</guid>
	<link>http://shell909090.com/blog/2012/04/%e5%a6%82%e4%bd%95%e7%94%a8tabbar%e6%8f%92%e4%bb%b6%e5%81%9aemacs%e7%9a%84tab%e5%ae%9a%e4%bd%8d%e5%88%87%e6%8d%a2/</link>
	<description>&lt;p&gt;    说明一下，定位切换的意思，是像chromium那样，用Atl-1-9直接切换tab。而不是用上一个下一个慢慢换。另外，是切换buffer，不是切换frame。
&lt;div&gt;    以下是实现部分：&lt;/div&gt;
&lt;div&gt;;; 全部的buffer都分一组，否则这个修改是没任何意思的&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;(setq tabbar-buffer-groups-function&lt;/div&gt;
&lt;div&gt;      (lambda () (list &quot;All Buffers&quot;)))&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;;; 去掉emacs自带的几个buffer&lt;/div&gt;
&lt;div&gt;(setq tabbar-buffer-list-function&lt;/div&gt;
&lt;div&gt;      (lambda ()&lt;/div&gt;
&lt;div&gt;        (remove-if&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt; (lambda(buffer)&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt;   (find (aref (buffer-name buffer) 0) &quot; *&quot;))&lt;/div&gt;
&lt;div&gt;&lt;span&gt;	&lt;/span&gt; (buffer-list))))&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;;; 切换到第N个buffer，1为第一个，负数表示从后数，注意0会出错，这里就不处理了&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;(defun switch-tabbar (num)&lt;/div&gt;
&lt;div&gt;  (let* ((tabs (tabbar-tabs (tabbar-get-tabset &quot;All Buffers&quot;)))&lt;/div&gt;
&lt;div&gt;         (tab (nth&lt;/div&gt;
&lt;div&gt;               (if (&amp;gt; num 0) (- num 1) (+ (length tabs) num))&lt;/div&gt;
&lt;div&gt;               tabs)))&lt;/div&gt;
&lt;div&gt;    (if tab (switch-to-buffer (car tab)))&lt;/div&gt;
&lt;div&gt;    ))&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;;; 不说废话，绑热键&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;(global-set-key [(meta 1)] (lambda () (interactive) (switch-tabbar 1)))&lt;/div&gt;
&lt;div&gt;(global-set-key [(meta 2)] (lambda () (interactive) (switch-tabbar 2)))&lt;/div&gt;
&lt;div&gt;(global-set-key [(meta 3)] (lambda () (interactive) (switch-tabbar 3)))&lt;/div&gt;
&lt;div&gt;(global-set-key [(meta 4)] (lambda () (interactive) (switch-tabbar 4)))&lt;/div&gt;
&lt;div&gt;(global-set-key [(meta 5)] (lambda () (interactive) (switch-tabbar 5)))&lt;/div&gt;
&lt;div&gt;(global-set-key [(meta 6)] (lambda () (interactive) (switch-tabbar 6)))&lt;/div&gt;
&lt;div&gt;(global-set-key [(meta 7)] (lambda () (interactive) (switch-tabbar 7)))&lt;/div&gt;
&lt;div&gt;(global-set-key [(meta 8)] (lambda () (interactive) (switch-tabbar 8)))&lt;/div&gt;
&lt;div&gt;(global-set-key [(meta 9)] (lambda () (interactive) (switch-tabbar 9)))&lt;/div&gt;
&lt;div&gt;(global-set-key [(meta  )] (lambda () (interactive) (switch-tabbar -1)))&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;
&lt;div&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 09 Apr 2012 22:50:56 +0000</pubDate>
</item>
<item>
	<title>@shell909090: empathy的无聊问题——记一次排错</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2132</guid>
	<link>http://shell909090.com/blog/2012/04/empathy%e7%9a%84%e6%97%a0%e8%81%8a%e9%97%ae%e9%a2%98-%e8%ae%b0%e4%b8%80%e6%ac%a1%e6%8e%92%e9%94%99/</link>
	<description>&lt;p&gt;    废话不说，debian testing，装了empathy后没法用account，等于废物。
&lt;div&gt;    先看bug report，开reportbug，看empathy的bug，有一个“Accounts window does not open”，估计就是我要的。&lt;/div&gt;
&lt;div&gt;    在浏览器中打开，&lt;a href=&quot;http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=594945&amp;archived=False&amp;mbox=no&quot; target=&quot;_blank&quot;&gt;http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=594945&amp;amp;archived=False&amp;amp;mbox=no&lt;/a&gt;，里面说了大致情况，和我这里非常类似。&lt;/div&gt;
&lt;div&gt;    第一个意见，killall -9 empathy-account，无效。&lt;/div&gt;
&lt;div&gt;    第二个意见，需要装CM。&lt;/div&gt;
&lt;div&gt;    跑去看看，一个都没装。跟着看说明，应该在recommand里面的。OK，我这里有这个配置。&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;shell-deb:~# cat /etc/apt/apt.conf.d/20norecommanded &lt;/div&gt;
&lt;div&gt;APT&lt;/div&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div&gt;    Install-Recommends 0;&lt;/div&gt;
&lt;div&gt;};&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;    这是对付很多无聊包把recommand当作suggest用的，结果这次中标。其实这次的recommand应当放入dep里面的。&lt;/div&gt;
&lt;div&gt;    OK，完事。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;PS.虽说如此，记得把telepathy重启一下，否则jabber协议看的到但是无效。&lt;/div&gt;&lt;/p&gt;</description>
	<pubDate>Sun, 08 Apr 2012 19:55:40 +0000</pubDate>
</item>
<item>
	<title>@delphij: delphijfork 9.0更新</title>
	<guid>tag:blog.delphij.net,2012://2.2157</guid>
	<link>https://blog.delphij.net/2012/04/delphijfork-90-1.html</link>
	<description>&lt;p&gt;可以在 &lt;a href=&quot;http://research.delphij.net/freebsd/delphijfork/&quot;&gt;这里&lt;/a&gt; 下载。&lt;/p&gt;

&lt;p&gt;和过去一样，风险自担 USE AT YOUR OWN RISK！&lt;/p&gt;

&lt;p&gt;这个版本 (20120402) 和上一个版本 (20120114) 相比的改动：&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;集成了近期 ZFS 的全部可靠性和性能改进；&lt;/li&gt;
	&lt;li&gt;增加了允许 jail 中挂载 ZFS 的功能；&lt;/li&gt;
	&lt;li&gt;mps(4)性能改进；&lt;/li&gt;
	&lt;li&gt;对 ULE 调度器的重要性能改进（支持超线程的处理器上许多测试可看到 10%-15% 的改善）；&lt;/li&gt;
	&lt;li&gt;对 Intel TurboBoost 技术的支持（在需要时可将 CPU 频率临时提高到标称值的 110%）；&lt;/li&gt;
	&lt;li&gt;对交换设备热拔时的可靠性改进；&lt;/li&gt;
	&lt;li&gt;对虚拟内存子系统的性能和可靠性改进；&lt;/li&gt;
	&lt;li&gt;优化了 rtld-elf 的内存占用【注意，必须配合 FreeBSD 9.x 内核使用，如果从 FreeBSD 8.x 或更早版本升级，请确认在 installkernel 之后重启过系统】；&lt;/li&gt;
	&lt;li&gt;新增了 posix_fadvise(2) 系统调用；&lt;/li&gt;
	&lt;li&gt;对于 SU+J 的若干可靠性改进；&lt;/li&gt;
	&lt;li&gt;对 tmpfs 的性能和可靠性改进，增加了 NFS export 支持；&lt;/li&gt;
	&lt;li&gt;为 msdosfs 和 smbfs 增加了 Unicode 支持；&lt;/li&gt;
	&lt;li&gt;为 PCIe 增加了 4GB 边界限制，这项变动消除了许多潜在的数据损坏问题；&lt;/li&gt;
	&lt;li&gt;其他若干小改进。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;全部改动来自 -CURRENT 或 -STABLE，并已经做过至少两周的疲劳测试。&lt;/p&gt;

&lt;p&gt;此版本改变了部分 VFS 接口，因此外部的涉及文件系统的内核模块可能必须重新编译才能使用。其它方面，它和向下兼容之前为 FreeBSD 9.0-RELEASE 或 delphijfork 20120114 编译的可执行文件。&lt;/p&gt;</description>
	<pubDate>Fri, 06 Apr 2012 23:23:07 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 无线网络问题的诊断</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2130</guid>
	<link>http://shell909090.com/blog/2012/04/%e6%97%a0%e7%ba%bf%e7%bd%91%e7%bb%9c%e9%97%ae%e9%a2%98%e7%9a%84%e8%af%8a%e6%96%ad/</link>
	<description>&lt;p&gt;    今天看到ZQ在坛子里面说无线网络卡，想想这对很多人是个问题。现在越来越多设备采用无线网络，本来看似够用的无线网络应该也会逐渐变的不怎么够用。这篇文章的大部分内容在blog中都有说，但是没有集结成文。今天集结一下，为大家提供便利。
&lt;div&gt;    关于无线网络卡这个问题，有多种可能，我们逐个分析原因/诊断方法/解决方案。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;= 有终端连不上，即使这个终端就在路由器附近 =&lt;/div&gt;
&lt;div&gt;这个主要是因为无线网络负载的设备达到极限所致的。这个极限，我见过最差的路由器是8个，普通路由器（包括dir-825刷openwrt）大概是50上下，苹果的要超过100。一个/24子网的最大负荷是253个IP地址，如果不另行设定，大多数的默认配置都无法超过这个极限。&lt;/div&gt;
&lt;div&gt;解决方案很简单，加路由器，或者换一个更好的路由器。加路由器具体参考&lt;a href=&quot;http://shell909090.com/blog/2011/09/%E5%90%88%E7%94%A8%E4%B8%A4%E4%B8%AA%E8%B7%AF%E7%94%B1%E5%99%A8%E7%9A%84%E5%87%A0%E7%A7%8D%E6%96%B9%E6%A1%88/&quot; target=&quot;_blank&quot;&gt;这篇&lt;/a&gt;。换路由器的意见是，不要用fastnet，推荐tplink或者dlink的设备，buffalo的也不错。如果你已经用了这些路由器，但是终端超过50个（好像通常只有公司会碰到吧），可以考虑苹果的，或者多扔两个路由器，辐射小信号好。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;= 有终端离开一点距离后就连不上，或者离开一定距离后速度变慢 =&lt;/div&gt;
&lt;div&gt;这是典型的信号衰减。作为不严谨的测试，你可以在android上安装wifi测试仪，然后走到各个角落。如果你的信号质量不足80dbm，那么就属于比较差的情况。大概能连接，但是经常断线，或者速度很慢。如果不足90dbm，基本就不可用了。&lt;/div&gt;
&lt;div&gt;解决方案也很简单，同上一个。总之优化到家里的每个点信号质量都可以就好了。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;= 明明信号很好，速度就是上不去 =&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;有可能是因为周围的channel干扰，也可能是因为你的路由器CPU不足。你可以用wifi测试仪，看看你周围当时有多少人在用你路由器的channel。两个channel相隔5以上才不互相干扰。所以，如果你使用channel6，那么channel2-channel10都会对你的信道造成一定干扰，相隔越远干扰越小。而如果你隔壁有一堆和你同channel的AP，实际带宽是均分给你们所有channel的。如果对方用的比较多，也会对你造成干扰。&lt;/p&gt;&lt;/div&gt;
&lt;div&gt;这是非常难解决的问题，你总不能跑到隔壁说，你们改个信道吧。一方面，如果有条件，你可以对墙壁，门缝做信号屏蔽。这样能减小一点隔壁的信号干扰。另一方面，建议你采用5G频段。这个频段的信道更多，更不容易串扰。但是目前支持5G频段的设备少，而且5G的穿透能力比2.4G更差。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;= CPU不足呢 =&lt;/div&gt;
&lt;div&gt;CPU不足最典型的确诊就是关掉加密，你的无线网速就会突然暴增。或者你保持无线空载，用有线狂用网络，无线的ping值从10变化到上千。&lt;/div&gt;
&lt;div&gt;碰到这种情况，扔掉垃圾路由器重新买一个。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;= 明明有些设备一点问题都没有，有些设备就是连AP都找不到 =&lt;/div&gt;
&lt;div&gt;看看你的channel是否设定到了11以上，例如12/13/14之类的。各个国家对channel的许可范围不一，欧洲日本美国的许可比中国宽一些，因此有12等信道，中国最高到11。因此你用水货手机连外贸版本的路由器的时候，channel12没问题，而用中国许可的设备的时候就连AP都找不到。&lt;/div&gt;
&lt;div&gt;解决方法很简单，换个中国许可的channel。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;= 无线速度跟不上外网速度 =&lt;/div&gt;
&lt;div&gt;自从20M以上光纤出现以来，这个问题就逐渐变成主要问题。11g的标准速度号称54Mbps，但是实际上通常只有18Mbps。而外网速度从常见的1/2/4Mbps骤然升到了10/20/30Mbps，就出现了严重的外网速度反超内网速度。&lt;/div&gt;
&lt;div&gt;这个一点办法都没有，只能把11g的设备都淘汰光。只要有11g的设备在，11n就无法发挥极限速度，导致你的无线只能在18Mbps上晃。而换用11n的设备后，速度一般可以达到30-40Mbps以上，基本够用。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;= 路由器被打爆 =&lt;/div&gt;
&lt;div&gt;由于速度加快，导致现在有更多的小包可能被传输。虽然传输速率要求不高，但是由于路由器对每个包都需要做同样处理，所以大量小包的资源消耗和同样数量的大包是同一个量级的。我们做一个简单的计算。如果一个包是1500字节，128KB/s的网络可以每秒传输90个包。而如果每个包是64字节，就可以传输2000个包。而当速度升级到2.5MB/s（20Mbps光纤），如果是1500字节，每秒1700个，而64字节的就是40000个。如果路由器的处理能力是每秒10000个包，升级到光纤一跑小包就挂了。很多人在ADSL的时代没问题，升级到光纤反而频繁出问题就是这个原因。&lt;/div&gt;
&lt;div&gt;现象比较多，如果是交换机挂掉，往往是一个机器链路OK但是就是有TX没有RX。怎么整也没用，但是过一会，这台机器突然就OK了，换下一台出同样问题。而如果是整个路由器挂掉，可能是路由器突然重启，或者ppp0断线重新拨号。还有的机器是死在那里没任何反应，必须拔掉电源线重新插才有效。&lt;/div&gt;&lt;/p&gt;</description>
	<pubDate>Sat, 31 Mar 2012 19:10:12 +0000</pubDate>
</item>
<item>
	<title>@shell909090: redis的rdb和aof模式性能对比</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2128</guid>
	<link>http://shell909090.com/blog/2012/03/redis%e7%9a%84rdb%e5%92%8caof%e6%a8%a1%e5%bc%8f%e6%80%a7%e8%83%bd%e5%af%b9%e6%af%94/</link>
	<description>&lt;p&gt;    由于是同一台机器，进行相对对比，我就不列配置了。系统是debian testing，kernel 3.2 686。redis 2.4.8。
&lt;div&gt;    测试方法是用python写的脚本对redis数据库进行写入，看写入速度。
&lt;div&gt;    100000/300000/1000000是数据量，插入的都是string。第一个数据是最小时间，第二个是平均，第三个是数据大小。
&lt;div&gt;
&lt;div&gt;100000:&lt;/div&gt;
&lt;div&gt;dbmode: 4.8, 5.1, 1477792&lt;/div&gt;
&lt;div&gt;aofmode: 9.1, 9.3, 3677803&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;300000:&lt;/div&gt;
&lt;div&gt;dbmode: 16.5, 17.6, 4877792&lt;/div&gt;
&lt;div&gt;aofmode: 21.1, 21.4, 11477803&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;1000000:&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;dbmode: 61, 65, 16777792&lt;/p&gt;&lt;/div&gt;
&lt;div&gt;aofmode: 77, 85, 38777849&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;    从简单分析来看，aof比rdb慢25-80%，但是大规模数据都比较支持慢25%这端。估计在低数据量下，rdb模式更加占优势。数据规模增长时，速率比接近于4:5。aof的数据比rdb数据大150%（2.5倍上下），这点随着数据增长基本不变。&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div&gt;    从读性能分析来看，两者差异不大。同样，数据分别是最小时间和平均时间。&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;dbmode: 55, 60&lt;/div&gt;
&lt;div&gt;aofmode: 62, 63&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;    差异在10%以内，甚至比最小-平均差异还弱。基本可以视为一致。&lt;/div&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 29 Mar 2012 20:10:30 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 假如生命可以重来——致80后的家长</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2126</guid>
	<link>http://shell909090.com/blog/2012/03/%e5%81%87%e5%a6%82%e7%94%9f%e5%91%bd%e5%8f%af%e4%bb%a5%e9%87%8d%e6%9d%a5-%e8%87%b480%e5%90%8e%e7%9a%84%e5%ae%b6%e9%95%bf/</link>
	<description>&lt;p&gt;    假如我们的生命可以重来——好吧，这个听起来像七老八十的老头说的话，不过，确实，人过到而立之年，会发现很多遗憾，很多很多的已经太晚。假如人生可以重来，我们也许就能弥补其中一些。
&lt;div&gt;    假如生命可以重来，我首先要干的第一件事情是在中学和大学多去旅行几次。这不是说我中学没有旅行过，而是都太“安全”了。苏州？杭州？拜托，这些地方在工作后都有的是机会去。如果回到初中，也许我会跟父母申请，在中学的时候就跑去黑龙江，看看松花江上的雾凇，索菲亚大教堂。高中跑去敦煌看看莫高窟，看看大漠风光。跑去云南看玉龙雪山，看西双版纳。大学跑去喀那斯，纳木错。&lt;/div&gt;
&lt;div&gt;    现在？我现在哪里都能去了，都可以去了，都有钱去了，可惜没时间去。我毕竟有一个家要养活，不能任性的丢下工作，突然和老板说，我要去西藏一个月，您看着办。&lt;/div&gt;
&lt;div&gt;    也许初中去听起来不是很安全。可是想想，现在去，比初中生安全到了哪里去？旅行中的安全，来自出门的阅历。我们都是在不断的出门中学习到，什么是安全，怎么样才安全。也许，在初中学到这些东西，会比毕业后学到更加有用。&lt;/div&gt;
&lt;div&gt;    假如生命可以重来，我要做的第二件事情是学个乐器，当然，也可能是画画。这也不是说我没学过乐器，小学的时候我学过电子琴，大学学过吉他。从哪个角度看，都和“没学过乐器”沾不上边。不过我要说的是，并不是说“会使用一种乐器”就算“学过一种乐器”的。&lt;/div&gt;
&lt;div&gt;    小学的时候，当时好像流行让小孩学各种班。当时我对音乐挺感兴趣的，所以就老妈做主，买了个很贵的电子琴。那时候才刚刚脱离36块工资，一户人家一个月也没多少钱，一把YAMAHA的电子琴要价1600。既然买了这么贵的电子琴，总不能让孩子瞎玩对吧？于是老爹老妈就给我报了一个班，每周接送去学两个小时，家长就在门口等着，到时间了再接回来。&lt;/div&gt;
&lt;div&gt;    于是，音乐对我的意义就从好听的歌曲变成了跳跃的五线谱，琶音，休止符，三拍子，每天一个小时的练习。我顿时就觉得不好玩了，每天哭闹不止。三个月不到，父母的音乐家梦想破灭了，电子琴现在还在家里不知道哪个角落扔着。&lt;/div&gt;
&lt;div&gt;    高中的时候，有个同学吉他弹的不错，经常跑出去一起练琴什么的。我就跑去听他们玩各种各样的声音，唱歌。高考结束，我有点自己的时间，才开始又学起了吉他。如果让我重新选择，也许我那个时候不会去弄那么贵的电子琴，而是弄一个小孩子玩的乐器，找朋友玩玩看。那是一种乐趣，一段人生，哪怕其实我们的歌不忍猝听。&lt;/div&gt;
&lt;div&gt;    假如人生可以重来，我要做的第三件事情是多谈几个女朋友。首先要发表的一点声明是，这不代表我对老婆有任何不满，也不代表我很花，打算——咳咳，你们懂。&lt;/div&gt;
&lt;div&gt;    我曾经有一条推，被广为转发，大概意思是。父母在初中高中甚至大学的时候，以学业为名，尽力不让我们恋爱。等大学一毕业，又逼着我们赶快找一个好的老公/老婆出来。怎么可能做的到，你当恋爱不需要学习么？&lt;/div&gt;
&lt;div&gt;    也许我们在初中时候谈的女友，十个中有九个走不到最后。我翻阅开心上高中同学的结婚记录时发现，基本所有的高中恋人，哪怕当时看起来多么金童玉女，基本都很少有走到最后的。唯一的一对例外可以说是相当的有决心和坚持，据我所知，男女双方一起报同一所学校的不罕见，可是男方没考上就硬是复读重考，女方还肯等的，就非常罕见了。这里恭喜一下杨亮刘莹，很遗憾没参加你们的婚礼。&lt;/div&gt;
&lt;div&gt;    但是，无论如何，在小时候谈的恋爱，会成为长大后的青涩回忆。当你越长越大，论及婚嫁，恋爱也就越来越不单纯。你不会简单的评判你是否喜欢拉着他的手，带你在街上走。而且还会考虑当你需要用车的时候，他是否买的起。你希望你的青春回忆中，充满了酸甜的爱恋，还是父母和老师的斥骂？或者更糟糕的，根本就是彻底的一片空白？&lt;/div&gt;
&lt;div&gt;    更何况恋爱中的失败，会成为你下一次不会轻易犯下的错误。在中学，我们很可能不会上床，也没有孩子。如果有什么错误，我们还来得及修正。而如果到了需要结婚的时候再开始积累经验，一个不留神就会碰上一个看似合适的陷阱。结果必然是悲剧。不是在痛苦中挣扎一生，就是带着伤心，争斗财产/孩子之类的问题。&lt;/div&gt;
&lt;div&gt;    好吧，上面一堆，和80后的家长有什么关系？&lt;/div&gt;
&lt;div&gt;    我们的人生有很多遗憾，有不少遗憾，是因为我们承载了家长的梦想，受到家长的管束。家长认为他们没有接受过正规的音乐教育，所以他尽力让我们接受正规的音乐教育。家长认为初中生旅行是不安全的，却没有想过他们十几岁就离开家乡去了大城市闯荡。他们没有接受过高等教育，所以认为我们需要高等教育，所以不能谈恋爱。但是这一切的一切，却并没有使得我们的人生完美。&lt;/div&gt;
&lt;div&gt;    所以，当你决定你孩子的人生的时候，不妨想想。假如我的人生可以重来，我想要的是什么？&lt;/div&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 26 Mar 2012 19:19:19 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 设计的艺术</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2124</guid>
	<link>http://shell909090.com/blog/2012/03/%e8%ae%be%e8%ae%a1%e7%9a%84%e8%89%ba%e6%9c%af/</link>
	<description>&lt;p&gt;1.标准，简洁但不简单&lt;br /&gt;    有一天，你买了一个机箱。很不幸的，这个机箱的后座螺丝少了一颗。当然，这是卖家的错。不过你不会让卖家从遥远的远方给你邮递一颗螺丝钉，而是去附近的电脑市场/五金店，或者各种可以搞到螺丝的地方弄一颗，替代上去。看起来很简单，实际上你知道螺丝有多少标准么？&lt;br /&gt;    贝壳在大学学机械的时候，曾经有幸拿到过一本手册。标准A4大小，一厘米多厚。里面全是各种常用机械部件的标准参数，螺丝大概占了半厘米。这还是常规齿形，非常规的大概和天上的星星一样多吧。&lt;/p&gt;
&lt;p&gt;    螺丝可以设计出这么多变形来，然而机箱上的螺丝，只是最常用的齿型，最常用的螺距，差别基本只在孔径大小而已。&lt;/p&gt;
&lt;p&gt;    于是，当你买机箱的时候，你不用考虑备件储备问题。
&lt;div&gt;2.拆分和完整&lt;br /&gt;    你有点闲功夫，想喝咖啡，或者喝茶。然而不幸的是，这两种饮料喝起来都不怎么方便。茶比咖啡简单点，用飘逸杯的话，上面一个杯子，下面一个杯子。上面杯子放茶，下面杯子接水。水倒入上面杯子，泡好一按，到下面杯子，茶就算泡好了。&lt;br /&gt;    如果不幸，你想泡茶的时候，照做如仪，茶水没到你的嘴里，你怎么办呢？&lt;br /&gt;    如果不是脑子有问题，估计都会看看上面的杯子是不是水流出来了。如果流出来了，看看下面杯子是不是漏了。如果没流出来，看看上面的杯子是不是堵塞了，是不是漏了。差不多就这些问题而已。&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;    一个复杂系统被拆成多个简单组件，我们就可以看组件是不是正常工作，从而便于诊断问题。洗衣机算比较复杂的系统，但是我们可以看，如果无法洗衣，是水没进去，电机不转，还是什么别的问题。当然，即使知道，具体部件也不是我们修复的了的。&lt;br /&gt;    同样，多个重复组件便于批量生产，也便于在不修改整体的情况下，更换部分组件。&lt;br /&gt;    当然，也有另一种思路。将系统设计成一个完整的系统，你不需要关心哪里出错。例如苹果。&lt;br /&gt;    如果这种系统发生问题呢？你要么完整的返厂修理，要么扔了算了。&lt;/p&gt;</description>
	<pubDate>Mon, 26 Mar 2012 01:48:17 +0000</pubDate>
</item>
<item>
	<title>@limodou: °Ù¶È²©¿ÍÎªÊ²Ã´×ÜÊÇÂÒÂë£¿</title>
	<guid permalink="False">http://hi.baidu.com/limodou/blog/item/1e8ad507bcb83fd27a894767.html</guid>
	<link>http://hi.baidu.com/limodou/blog/item/1e8ad507bcb83fd27a894767.html</link>
	<description>&lt;p&gt;°Ù¶ÈµÄ²©¿ÍÊ¹ÓÃµÄ±àÂëÊÇGBK£¬½á¹ûÓÐÐ©rss readerÊ¶±ð¾ÍÓÐÎÊÌâ¿´ÉÏÈ¥¾ÍÊÇÂÒÂë¡£´òËãÊÔÊÔ×ªÏòÐÂÀËµÄÇá²©¿ÍÁË¡£&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://qing.weibo.com/u/1689940061&quot;&gt;http://qing.weibo.com/u/1689940061&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt; 
		
		&lt;br /&gt;&lt;b&gt;Àà±ð£º&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/%D0%C4%C7%E9%B9%CA%CA%C2&quot;&gt;ÐÄÇé¹ÊÊÂ&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/1e8ad507bcb83fd27a894767.html#comment&quot;&gt;²é¿´ÆÀÂÛ&lt;/a&gt;</description>
	<pubDate>Mon, 26 Mar 2012 00:00:00 +0000</pubDate>
</item>
<item>
	<title>@limodou: parsimonious Ò»¸öPEG·ÖÎöÄ£¿é</title>
	<guid permalink="False">http://hi.baidu.com/limodou/blog/item/30a04b90599ba592a877a43e.html</guid>
	<link>http://hi.baidu.com/limodou/blog/item/30a04b90599ba592a877a43e.html</link>
	<description>&lt;p&gt;ÕâÁ½ÌìÒ»Ö±ÔÚ¿¼ÂÇÈçºÎÊµÏÖÒ»¸ö±È½ÏcoolµÄ»¥¶¯Ê½±àÐ´½Ì³ÌµÄ¹¦ÄÜ£¬µ±È»Ò²¿ÉÒÔÓÃÀ´Ð´²©¿Í£¬×÷Îª·ÅÔÚ uliweb.clkg.org ÉÏµÄÒ»¸ö½Ì³ÌµÄÑùÀý¡£Õâ¸öÑùÀý»á±ß×ö±ßÐ´¡£ÄÇÃ´ºÜÖØÒªµÄÒ»¸öÎÊÌâ¾ÍÊÇÈçºÎ¸ù¾ÝÂ¼ÈëµÄÄÚÈÝÉú³ÉÒ×ÓÚÊ¹ÓÃµÄhtmlµÄÒ³Ãæ¡£Ä¿Ç°²»ÏëÊ¹ÓÃËù¼û¼´ËùµÃµÄ±à¼­Æ÷£¬ÕâÑùÉú³ÉÒ³Ãæ±È½ÏÂé·³¡£´òËãÊ¹ÓÃ½á¹¹»¯ÎÄ±¾£¬²»¹ýÉÏ´«Í¼Æ¬¿ÉÄÜ²»ÊÇºÜ·½±ã£¬²»¹ýÃ»Ì«´ó¹ØÏµ¡£µ«ÊÇÈçºÎ½øÐÐ½âÎö£¬²ÉÓÃÄÄ¸ö°ü¾Í³ÉÎªÒ»¸öÎÊÌâ¡£ÎÒÏ£Íû¸ñÊ½¾¡¿ÉÄÜµÄ¼òµ¥¡£ÕýºÃÕâÁ½Ìì¿´ÁËpyconÉÏµÄÒ»¸öÊÓÆµ&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Parsing Horrible Things with Python. ÉÏÃæ½éÉÜÁËÑÝ½²ÕßÓÃµÄ¼¸¸ö½âÎöÆ÷£¬ºÜ¶àÊÇ»ùÓÚPEG(¹ØÓÚPEG&amp;nbsp;&lt;a href=&quot;http://www.brynosaurus.com/pub/lang/peg.pdf&quot;&gt;http://www.brynosaurus.com/pub/lang/peg.pdf&lt;/a&gt;&amp;nbsp;ÎÒÒ²²»¶®£¬µÚÒ»´ÎÌýËµ)·½Ê½µÄ½âÎö¡£ÓÚÊÇÎÒÏëÊÔÊÔÊ¹ÓÃ&lt;a href=&quot;https://github.com/erikrose/parsimonious&quot; target=&quot;_blank&quot;&gt;parsimonious&lt;/a&gt;×÷Ò»¸ö½âÎöÆ÷¡£ÓÚÊÇ¿ªÊ¼ÏÂÔØ£¬³¢ÊÔ¡£²»¹ý£¬·¢ÏÖÄ¿Ç°»¹ÎÞ·¨Ö»Ð´ÎÄ±¾µÄÐÎÊ½¾ÍÉú³ÉÒ»¸ö½âÎöÆ÷£¬Îª´ËÎÒÐ´ÁËÒ»¸öÎÊÌâÔÚgithubÉÏ¡£×÷Õß»Ø¸´ÊÇÈÃÎÒ¹Ø×¢Ëü£¬Ä¿Ç°Õâ¸ö¹¦ÄÜ»¹Ã»ÓÐÊµÏÖ£¬Ö»ÊÇÊµÏÖÁË¿ÉÒÔ½âÎöPEGÓï·¨¡£¿´µ½ËüµÄµ×²ãÊµÏÖÆäÊµ»¹ÊÇ»ùÓÚÕýÔò±í´ïÊ½£¬Ö»²»¹ýÐ´ÆðÀ´¿ÉÒÔÈÝÒ×µã¡£ÓÚÊÇÎÒ»¹ÊÇÔÚÕâ¸ö»ù±¾ÉÏ½øÐÐÁË³¢ÊÔ¡£·¢ÏÖ³ýÁË»¹ÎÞ·¨¶¨ÒåÎÄ±¾µÄGrammarÖ®Íâ£¬ËüÌá¹©µÄVisitorÒ²²»ÊÇÎÒÏëÏóµÄÄÇÑù¹¤×÷¡£²»¹ý£¬ËüÒÑ¾­¿ÉÒÔÉú³ÉASTµÄÊ÷£¬ÕâÒ»µã»¹ÊÇ²»´í¡£&lt;/p&gt;&lt;p&gt;½ñÌìÔÚ³¢ÊÔÊ±·¢ÏÖÔÚ´òÓ¡ÓÐunicodeµÄ½áµãÊ±»á±¨´í£¬ÓÚÊÇÎÒ·¢ÁËÒ»¸öÎÊÌâÔÚgithubÉÏ£¬ÎÒÄ¿Ç°ÊÇÊÖ¹¤ÐÞ¸ÄÁËËüµÄ´úÂëÕâÑùÎÒ¿ÉÒÔ¼ÌÐøÊµÏÖÏÂÈ¥¡£ÎÒÏÖÔÚÏë×öµÄ¾ÍÊÇ×öÒ»¸öÏóWikiÒ»ÑùµÄ½âÎöÆ÷£¬¼õÉÙÊ¹ÓÃËõ½üµÄ·½Ê½¡£ÕâÑù¾Í¿ÉÒÔÎ´À´ÓÃÓÚ½Ì³ÌÍøÕ¾ÄÚÈÝµÄ×ª“Q¹¦ÄÜÁË¡£&lt;/p&gt;&lt;p&gt;&lt;/p&gt; 
		
		&lt;br /&gt;&lt;b&gt;Àà±ð£º&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Uliweb&quot;&gt;Uliweb&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/30a04b90599ba592a877a43e.html#comment&quot;&gt;²é¿´ÆÀÂÛ&lt;/a&gt;</description>
	<pubDate>Sun, 25 Mar 2012 00:00:00 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 从对称性说男女平等</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2122</guid>
	<link>http://shell909090.com/blog/2012/03/%e4%bb%8e%e5%af%b9%e7%a7%b0%e6%80%a7%e8%af%b4%e7%94%b7%e5%a5%b3%e5%b9%b3%e7%ad%89/</link>
	<description>&lt;p&gt;    一切号称男女平等的朋友们，作为一个死硬理性派，我认为真正男女平等应当满足对称性。简单来说，你们话中的“男”和“女”对换后，说法仍旧成立，那么这个论调就是满足对称性的，也是真正男女平等的。
&lt;div&gt;    我们举个例子。我和猫咪去云南旅游的时候，我们听过摩梭人“走婚”的习俗。具体不介绍了，大家自己查。简单来说是这样的，男孩子和女孩子互相看中后，男孩每天去女孩的房间里过夜，白天回自己家。孩子不用爸爸养，由女方的兄弟养。所以舅舅是一个孩子最值得尊敬的男性长辈，而不是父亲。一个朋友说，这不是很爽？男的和女孩子发生关系，还不用负责，小孩不用自己养。我说，你要记得，摩梭人是母系社会，男和女的关系都要对调的。我们把它们习俗中的男和女对掉过来听听？&lt;/div&gt;
&lt;div&gt;    女孩子晚上都要去男孩家里，过夜后回自己家中，不能带自己的小孩，还要帮自己的哥哥带小孩。&lt;/div&gt;
&lt;div&gt;    听起来——对女孩子好像很悲惨的样子——我们再把这个“女”还原回原始的“男”，你还觉得那里的男人真幸福么？&lt;/div&gt;
&lt;div&gt;    我们在讨论一切事情的时候，口头说“男女平等”。其实潜移默化中，还是受到中国传统男女思想的影响。从数学上说，利用对称性消除这种影响是最好不过的了。例如这个论调，是否男女平等呢？（女孩子把人生中最好的岁月给了你）。我们对掉过来看看？（男孩子把人生中最好的岁月给了你）OK，相信大家都笑了。&lt;/div&gt;
&lt;div&gt;    先不要笑，尤其是觉得得意的男同胞。男女平等在消除了女性的特权同时（包括撒娇，房子应当男方买），也消除了男性的特权。你看看是否能接受以下情况？（为了妻子的事业丈夫应当作出牺牲）我想很多男同胞已经在拍桌子跳起来了。那这个呢？（孩子要跟母亲的姓）OK，现在笑不出来了吧？&lt;/div&gt;
&lt;div&gt;    上面讨论了一堆怪论，很多人也许会说贝壳是断章取义，或者别的什么的。实际上，有问题的不是贝壳，而是“男女平等”这个词。真正的平等，为什么不能满足对称性呢？&lt;/div&gt;
&lt;div&gt;    实际上，多数人在说男女平等的时候，包含的意思并不是，男女双方对称。而是，男女各自为了不同的事情让步，互相达成交易。女孩子要生育，男孩子就要负担家庭。实际上，双方的关系并不是对等关系，而是交易双方关系。两者既要达成合作共赢，又要争取自己的利益。对这点，一个很明显的事实是，男女的婚姻条件改变依赖于适婚男女比例。在战争年代，一堆寡妇找一个男人，男人娶媳妇容易，三妻四妾也不难。但是近代，尤其是计划生育造成男女比例失衡后，女方明显就压在了男方上面。&lt;/div&gt;
&lt;div&gt;    因此？一个明显的悖论是，如果要改变社会的男女关系，让优势向某个方向发展，应当做的实际上是尽量设法减少该性别的人口。想让男方占优势？让男人去打仗就对了。&lt;/div&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 21 Mar 2012 18:44:21 +0000</pubDate>
</item>
<item>
	<title>@delphij: 伯南克讲课</title>
	<guid>tag:blog.delphij.net,2012://2.2156</guid>
	<link>https://blog.delphij.net/2012/03/post-615.html</link>
	<description>&lt;p&gt;今天在电视上看了 C-SPAN 上播出的伯南克讲联储局与经济危机（也可以在网上收看）。之前一直不太明白的一些问题得到了解答，不过还是有一些别的问题不太明白。&lt;/p&gt;

&lt;p&gt;伯南克讲了联储局的历史、联邦储蓄保险公司FDIC，金本位，以及大萧条相关的话题。其中，FDIC是罗斯福新政保留至今的一部分。银行在放款之后，手头的现金一定小于储户存入的金额，此时如果出现谣言，那么每一个人合乎逻辑的行为便是去银行排队挤兑，因为如果去晚了，银行可能已经被前面的储户挤兑而没有现金了。另一方面，挤兑会产生连锁反应，谣言会越传越厉害，而银行一旦被挤兑，为了支付现金就必须卖出资产（通常是折价卖出），这会进一步加剧其资金短缺现象并真的导致倒闭，而一所银行倒闭了，会导致其他银行倒闭的传闻显得更加真实。在FDIC出现之前，银行能采取的基本就是一个字拖，暂时关门不支付任何现金，并继续收取贷款付款。在 1933 年的银行业重组中，全美国的银行宣布休假，并逐一核对其资产负债表，恢复其中合乎条件的银行的运营。FDIC实际上扮演的是一个担保人的角色，它以政府的名义担保储户的存款（因为政府的信用有税收等做为担保），这种做法要比银行之间的互相担保有效，事实上在那之前纽约的银行业已经出现了这种互相担保的做法，而显然多家银行之间做短期拆借是不足以抗御集体挤兑的。FDIC的出现，解决了那些不良资产比例不太大的银行关闭导致普通人无法获取现金来购买日用品、食物等基本生活保障品的问题，并使挤兑不再必要。&lt;/p&gt;

&lt;p&gt;后面关于金本位的讨论很有意思。伯南克认为大萧条中通缩起了关键性因素。由于经济过热，金本位导致通缩，而通缩导致生产者收入下降，而他们很多是靠贷款来购买生产资料，这样一来生产者破产，从而银行跟着破产，进而引发更进一步的经济危机。这个解释了为什么他在任的这段时间不停地采取量化宽松措施来人为增加货币供应量，不过问题来了：如何在这种情况下阻止经济继续过热呢？因为量化宽松会导致利率下降，这会导致融资成本下降，我认为这种措施似乎比较适合生产过剩引发的经济危机才对？&lt;/p&gt;

&lt;p&gt;另一个关于汇率的讨论也比较有意思。他提到中国有很长一段时间的汇率是和美元绑定的，而不是采用浮动汇率。这样，美国因为国内经济需要调节汇率的时候，便会间接影响中国的经济：美国降低利率，假如中国不跟着一起降低利率，便会将通胀输出到中国（由于美国的经济规模更大，以及美元的世界结算货币地位，这种输出是单向的）。所以在继续绑定汇率的前提下留下的只有一个选择就是降息（相当于两国事实上使用的是同一种货币，为了避免外汇流入，就必须跟着调整利率），而这种选择未必是适合中国的实体经济的。&lt;/p&gt;

&lt;p&gt;我个人总的感觉，美国的这个经济模式的问题在于，需要一直维持一定的通胀率来避免出现金融危机（显然，金本位是无法适应这个需要的，因为从非洲运黄金到纽约的联储局金库成本相当高），而另一方面，生产不可能无限制地不断膨胀，难道说只能过段时间就果断来一次经济危机来缓和一下？&lt;/p&gt;</description>
	<pubDate>Wed, 21 Mar 2012 06:40:32 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 被警告了</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2120</guid>
	<link>http://shell909090.com/blog/2012/03/%e8%a2%ab%e8%ad%a6%e5%91%8a%e4%ba%86/</link>
	<description>&lt;p&gt;    OK，所有用贝壳vps的童鞋，你们今天应该都不能用了。因为我自己也不能用了。
&lt;div&gt;    早上到公司，发现翻墙失效，去vps供应商那里看了看管理，貌似是因为vps被停用了。我翻了一下billing，确定没忘记付钱。然后看到有一个ticket，上面写着abuse，大概就知道怎么回事了。问题是gmail里面没有——回来翻翻，shit，他们用不同的邮箱发，导致被定到了spam里。&lt;/div&gt;
&lt;div&gt;    ticket的原文我就不摘抄了，大概意思是他们公司是某个电影的版权所有人，发现这个IP有这个电影的源，因此发函警告。我看了看要求，也不算太过分。停止上下传，删除文件。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;生气么？&lt;/div&gt;
&lt;div&gt;    实话说，收到这封邮件的时候我一点都不意外，而且挺高兴。因为他们做了正确的事情。如同我在某篇blog里面写的，不仅是程序，电影，电视，图书，文字，也都是有版权的。为某件事情努力的人应当得到报酬，除非他们自愿贡献。而免费观看和传播这些内容本身就是偷窃，这是一定的。不能因为所有人都在做，就理直气壮的认为这是天经地义。公平的想一想吧，如果没有版权会如何？程序员为了能够赚钱，大概会产生流氓软件，或者转行。而在其他行业，例如电影，大概就没有新的影片了。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;既然知道不好，为什么还做？&lt;/div&gt;
&lt;div&gt;    人类是矛盾的。除掉版权没问题的资料外（至少我觉得没问题）。我有不少片子是无法付钱的，国内根本没有引入，这里面以动漫类为最。有不少片子是我仅仅想扫两眼的，如果你告诉我这玩意真的要付钱，那还是谁爱看谁看吧。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;怎么发现的？合法么？&lt;/div&gt;
&lt;div&gt;    首先，对方是如何发现我的文件的？我估计是内容扫描。在服务器上找到这个文件的下载，然后扫描所有的源。如果这个源位于一个可诉讼的位置，就发函。如果不行，就试图阻截。&lt;/div&gt;
&lt;div&gt;    这个过程在法理上是行的通的，而如果要在每个ISP上扫描传入传出的数据本身，在法理上（我说的是美国的法律，不是天朝的）是行不通的，因为违宪。&lt;/div&gt;
&lt;div&gt;    那么，edonkey/kad/bittorrent有没有什么办法来规避这个问题呢？&lt;/div&gt;
&lt;div&gt;    首先，必须提供虚假源。以一定比例向客户端传送虚假的源数据，这会导致单纯的从edonkey上下载源列表不可行。因为即使只有百分之一，你也没办法证明你得到的源列表是有效的。警告也许可以，拿这个当证据去诉讼就要出篓子了。&lt;/div&gt;
&lt;div&gt;    其次，可能要发展数据混合传输方式。将一段内容正交拆分，得到两个比1/2的块，或者N块1/N。单独的块必须保证无法还原出数据，一个字节都还原不出，而且不能保证必须有原始数据才能生成这个块。为了满足以上条件，直接将内容条带化是不可行的，可能需要某种编码转换算法。&lt;/div&gt;
&lt;div&gt;    当你需要下载某一块真实数据的时候，你必须向不同的人请求将这一块内容1/N之一后的某一个编号块。从理论上说，这样能确认数据来源者拥有原始文件么？不能。虽然这么说很奇怪，但是你并不能确认来源者拥有这个文件的任何一个部分，也不能确认来源者自愿上传这个内容。因为你去获得数据，仅仅是因为源拥有这个数据。这个数据完全可能是某个合法资源的一部分。&lt;/div&gt;
&lt;div&gt;    最后，我觉得最合适的可能是大DHT，不过这会违背人性。DHT的全称是分布式哈希表，而从hashtable结构上说，完全可以将影片的所有数据全部保存到这个hashtable里面，虽然代价是相当大的。每当有人共享数据，这个数据会先传输到key附近的支持节点上，消耗这些节点的存储空间——而这个存储空间的消耗对他们完全没用。整个过程，还会额外的消耗网络带宽。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;其实我也不想先付钱。&lt;/div&gt;
&lt;div&gt;    但是我也并不是很愿意先为了我下载的电影付钱，这和我上面说的不相矛盾。这个大概就是吃饭前付钱和吃饭后付钱的区别。其实我更喜欢吃饭后付钱的——尤其是对于内容质量差异很大的图书和电影。很多垃圾电影还是不看的好——也许这就是评分系统的优势。但是对于营销者来说，真的会甘心被打上一个很低的分数，然后血本无归么？所以你可以在任何地方看到通过营销方式干扰评价。&lt;/div&gt;
&lt;div&gt;    我对一个朋友说，盛大的书我一般喜欢看完再付钱。道理很简单，我追了无数本书，被太监，腰斩，烂尾，质量下降，换人。我觉得，还是让我们吃完全餐再付钱比较有道理。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;版权有没有不合理的地方？&lt;/div&gt;
&lt;div&gt;    其实挺多——我说的是美国版权法。&lt;/div&gt;
&lt;div&gt;    首先，软件产品只有20年，但是电影音乐有70年——难道程序员特别贱，或者特别短命？&lt;/div&gt;
&lt;div&gt;    其次，阻碍学习。版权应当排除所有以学习为目的的使用，人类学习新知识的权利不言自明，不应受到阻碍。&lt;/div&gt;
&lt;div&gt;    最后，版权剥削。苹果销售的提成是多少？总数的30%。而普通媒体集团购入版权的费用是多少？不会超过最后收益的三成。这就是为什么我更喜欢在苹果上买app的原因——起码这对作者好，而且我也不用堆一堆纸或者没用的光盘在家里。&lt;/div&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 19 Mar 2012 22:22:39 +0000</pubDate>
</item>
<item>
	<title>@shell909090: kvm虚拟化的性能对比</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2118</guid>
	<link>http://shell909090.com/blog/2012/03/kvm%e8%99%9a%e6%8b%9f%e5%8c%96%e7%9a%84%e6%80%a7%e8%83%bd%e5%af%b9%e6%af%94/</link>
	<description>&lt;p&gt;    废话不多说，4G的机器，debian testing，amd64内核32位环境。用kvm切出一个768m的机器，debian testing，64位内核64位环境。对比起来有点不公平，不过基本说明问题。
&lt;div&gt;    用lmbench对比两者的性能，报告我就不贴了。基本结论如下：&lt;/div&gt;
&lt;div&gt;1.纯计算: kvm内比真机还快，或者至少性能相当。估计是32位环境的关系。&lt;/div&gt;
&lt;div&gt;2.syscall, read, write, select: 都是kvm快。&lt;/div&gt;
&lt;div&gt;3.Protection fault, AF_UNIX sock stream latency, fork+exit, fork+execve: 真机比kvm快至少4倍，最多可达6倍。&lt;/div&gt;
&lt;div&gt;4.文件读写api: 真机比kvm快3倍以上。&lt;/div&gt;
&lt;div&gt;5.socket性能: pipe是kvm快，unix file是真机快。&lt;/div&gt;
&lt;div&gt;6.iozone: 两者吞吐性能几乎一致，有时kvm比真机还快。可能和真机的ext3上面堆满碎片结构有关。&lt;/div&gt;
&lt;div&gt;    基本结论，kvm在计算和io上都没什么太大问题，主要问题在于各种涉及ring0指令的内核调用方面（好像这也是虚拟化的通病）。在虚拟化系统中，尽量避免大量的内核调用，尽量减少碎片调用，增大IO块。&lt;/div&gt;&lt;/p&gt;</description>
	<pubDate>Sun, 18 Mar 2012 23:09:38 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 答一封读者来信——同机构内不同组织合作的分析</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2116</guid>
	<link>http://shell909090.com/blog/2012/03/%e7%ad%94%e4%b8%80%e5%b0%81%e8%af%bb%e8%80%85%e6%9d%a5%e4%bf%a1-%e5%90%8c%e6%9c%ba%e6%9e%84%e5%86%85%e4%b8%8d%e5%90%8c%e7%bb%84%e7%bb%87%e5%90%88%e4%bd%9c%e7%9a%84%e5%88%86%e6%9e%90/</link>
	<description>&lt;p&gt;    这次的题目是一个读者的问题，她的原文很复杂，我不记得了。我大致的理解是，在同一个领导下面的多个不同的组织间的合作，对其进行分析。
&lt;div&gt;    唔，怎么说呢，这个问题其实挺好玩的。我首先给没参加工作的同学们讲解一点基础常识，一般来说，公司/企业/组织，都是树形结构的，又非单纯的树形结构。所谓树形结构，就是一个头，手下有几个人，每个人负责一个方面。每个人又有一些手下，如此往复，就形成了一颗管理树。管理树的一个关键禁忌是越级，没有毕业或者刚毕业的同学千万要记牢，越级是很忌讳的，无论是哪个方向。如果你有个问题，需要向上反映，一定要经过你的直接领导，或者在你直接领导在场的情况下反映。而作为领导指挥下级的时候，也一定要交代他的直接领导，或者他的直接领导在场。通常你作为二层领导的时候，资历已经足够让你知道越级的害处。因此经常发生的问题是向上越级。&lt;/div&gt;
&lt;div&gt;    一般来说，这个管理树的层级越多，公司效率越低。你可以很容易的想明白，如果你对一个关键问题的报告，要通过20层领导才能递交给足够关键的人，你们公司的决策和反应速度怎么快的起来。但是反过来说，在节点不变的情况下，如果要降低树的高度，那只有在一个节点上挂更多的子节点，即一个领导需要直接管理更多下属，处理更多问题。&lt;/div&gt;
&lt;div&gt;    而更复杂的是，正统的树形结构，应当是由上级进行信息协调。但是为了增加效率，通常来说管理树还不是一个严谨的树形结构，而是一个网状结构。例如，理论上说，销售问题应当是由销售部门搞定的。但是销售中可能涉及很多技术问题，因此需要工程师来参与，而且是长期参与。因此我们有个职位，叫做售前工程师，专门负责这个问题。售前工程师属于销售部还是研发部负责呢？我们在行政级别上归属销售部管理，但是实际上这些工程师还要长期参与研发部工作，这期间他们实际上受到研发部管理。这就是所谓的交叉管理状况。&lt;/div&gt;
&lt;div&gt;    直观上看，我们很容易得出一个推论。当组织规模增加的时候，这些问题就会如同一团乱麻一般纠结起来。事实上也是如此，同样的组织结构，当组织规模增加的时候，效率一定是严格下降的。只是不同的结构下降的速度不尽相同。我们常听到小公司比较有竞争力，原因很大程度上是因为小公司只有职能和级别划分，而没有严谨的管理树。甚至有的时候，连职能和级别划分都没有。这种管理在感觉上会比较混乱，因此一般只能在大家都是哥们的时候用这招。&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;     因此，很多大型公司采取的一种常见管理方式是组织化，OU。所谓OU，即脱离集团的直接领导后仍然可独立存在的组织。这些组织可能是控股公司，子公司，分公司，公司内部门，产品线，项目组，形态很多。OU化的核心意义是，为交叉管理提供了一个最大化边界，为集团管理提供了一个最小单元。由于集团管理的最小单元的增大，因此集团可以管理的规模也更加的大。通常来说，OU就是这么被理解的。&lt;/p&gt;&lt;/div&gt;
&lt;div&gt;    OU和正常的组织部分有几点不同。通常来说，OU有独立的财政系统，OU间互相是需要结算的，OU的老大是要部分承担OU的盈亏的。所以有的时候，你受某公司邀请前去开会，往往能看到组织者和行政部的人。行政部的人管理整个会议室，完事后是要管组织者结帐的——如果这个集团的行政部是独立的话。同样，如果OU总是亏，这个亏损就会被评估。老板会考虑，外包是不是更合算。如果是，这个OU很可能就被裁撤。&lt;/div&gt;
&lt;div&gt;    因此OU间的关系既是在同一个集团内的合作关系，也属于竞争关系。因此你可以看到，去年腾讯网的广告位放过淘宝，而不是拍拍。原因就非常简单。淘宝不是同一个集团的，走的是正对正的生意关系，一般来说给的钱更多。拍拍是自己人，老总为了省经费，总会想拉关系少给点。如果给拍拍不能带来现金，也没法带来KPI，那就给淘宝吧。这就属于集团内协调不善导致拆台的结果。&lt;/div&gt;
&lt;div&gt;    OK，上文废话半天，总算言归正传。在不同的OU之间，进行产品和技术合作，基本来说得依据OU的级别来细说。越是细小，合作越多的OU，其特性就越接近非独立部门。而越是庞大的OU，例如下属控股公司，就越接近独立公司。非独立部门间进行产品和技术合作的好处是，双方有充分的信任关系，因而双方可以充分讨论其中利弊，并且得到比较好的结果。而独立公司间，往往有互相不信任的情况（这个也看的，不少公司间的关系甚至好的工程师会互相为对方修bug），因此有些时候就很无奈的出现了纳什均衡。&lt;/div&gt;
&lt;div&gt;    这个现象其实正是OU所带来的双刃剑。越是OU化充分，公司的可管理规模就越大，但是手下间互相打架的情况就越严重。如果你愿意这么理解的话，红杉每年投了一堆风投，其中不少是做同一领域的。理论上你可以把这些公司都理解为红杉的下属，只是红杉没有参与管理——也没道理参与管理。这些公司间，不少是死对头。这正是最强的OU化和松散的外部协调管理所带来的结果。如果情况对红杉有利，他是否可以凭借庞大的股份介入，终止持有股份的几家公司间的对立呢？这会为红杉带来庞大的利益。这同样也可以看做是削弱OU，加强外部调整的结果。&lt;/div&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 16 Mar 2012 01:04:25 +0000</pubDate>
</item>
<item>
	<title>@limodou: uliwebµÄÂÛÌ³</title>
	<guid permalink="False">http://hi.baidu.com/limodou/blog/item/169cf9dc436b0bbecc116648.html</guid>
	<link>http://hi.baidu.com/limodou/blog/item/169cf9dc436b0bbecc116648.html</link>
	<description>&lt;p&gt;uliwebµÄÂÛÌ³ÆäÊµÎÒÒÑ¾­²¿Êð¹ýºÜ¶à´ÎÁË£¬Ïódotcloud, saeµÈ£¬ÏÖÔÚÓÉasmcos´î½¨ÁËÒ»¸öÐÂµÄ£¬µØÖ·ÔÚ£º http://uliweb.clkg.org ¡£·Ç³£¸ÐÐ»¡£ÏÖÔÚµÄforum¹¦ÄÜÒÑ¾­Ê¹µÃÁËbootstrapÑùÊ½£¬±ÈÒÔÇ°Òª¸üºÃ¿´Ò»Ð©£¬¹¦ÄÜÉÏÒ²×öÁËÒ»Ð©‰ˆÇ¿£¬±ÈÈç‰ˆ¼ÓÁË¶ÔÄ³¸öÈËµÄ»Ø¸´¹¦ÄÜ£¬²»¹ý»¹ÓÐµãÐ¡bug£¬ÓÐÊ±¼äÔÙÓÅ»¯¡£&lt;/p&gt;&lt;p&gt;uliwebºÍplugsÒ²Ò»Ö±ÔÚ¸Ä½ø¡£Ä¿Ç°ÎÒ¸ú×Ùbootstrap±È½Ï¶à£¬Ä¿Ç°plugsÖÐµÄbootstrapÒÑ¾­ÊÇ2.0.1ÁË¡£¹ý¼¸ÌìÎÒÉýµ½2.0.2¡£jquery×î¸ß°æ±¾ÊÇ1.7.2b1£¬Èç¹û³öÕýÊ½µÄÒ²Òª¸üÐÂÉÏ¡£plugsµÄlayout¿ªÊ¼°´·ÖÀàÀ´´¦Àí£¬ÒÑ¾­‰ˆ¼ÓÁËbootstrapµÄlayout£¬ÓëÔ­À´µÄlayout¼æÈÝ¡£Í¬Ê±¸ÄÐ´ÁËÒ»Ð©Ä£°å¡£&lt;/p&gt;&lt;p&gt;uliwebµÄformÒ²×öÁË¸üÐÂ£¬Ö÷ÒªÊÇÖ§³ÖÁËBootstrapµÄÑùÊ½£¬Ä¿Ç°È±Ê¡µÄÑùÊ½¾ÍÊÇBootstrapLayout¡£&lt;/p&gt;&lt;p&gt;½ñÌìÓÖÊÔÑé³É¹¦ÔÚpypyÉÏÅÜuliweb¡£&lt;/p&gt;&lt;p&gt;uliwebµÄORM»¹ÏëÔÙ×öÒ»Ð©ÓÅ»¯£¬Èç‰ˆ¼Óexist()·½·¨£¬orm appÖ§³Ö¶ÌÁ¬½Ó¡£&lt;/p&gt;&lt;p&gt;¶Ôuliweb¸ÐÐËÈ¤µÄÈË¿ÉÒÔÔÚuliwebµÄÓÊ¼þÁÐ±í»òÉÏÃæµÄÂÛÌ³ÓëÎÒ½»Á÷¡£ÉõÖÁÓÐÐËÈ¤²ÎÓë¿ª·¢¶¼ÊÇ»¶Ó­µÄ¡£&lt;/p&gt;&lt;p&gt;&lt;/p&gt; 
		
		&lt;br /&gt;&lt;b&gt;Àà±ð£º&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0&quot;&gt;Ä¬ÈÏ·ÖÀà&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/169cf9dc436b0bbecc116648.html#comment&quot;&gt;²é¿´ÆÀÂÛ&lt;/a&gt;</description>
	<pubDate>Thu, 15 Mar 2012 00:00:00 +0000</pubDate>
</item>
<item>
	<title>@delphij: 湾区买房记(4)</title>
	<guid>tag:blog.delphij.net,2012://2.2155</guid>
	<link>https://blog.delphij.net/2012/03/4-1.html</link>
	<description>&lt;p&gt;发现前面写的完全没什么逻辑，等有时间再来整理吧。&lt;/p&gt;

&lt;p&gt;关于贷款。这个主要是我自己的理解总结，不一定对，仅供参考。&lt;/p&gt;

&lt;p&gt;在美国，贷款的利率是由几个因素决定的。&lt;/p&gt;

&lt;p&gt;首先是和股市类似的&quot;大盘&quot;，或者说&quot;基准利率&quot;，这个利率是以美国政府发行的中长期国债利率决定的。国债一旦发行，其票面利率便确定了，那么为什么说它是&quot;大盘&quot;呢？因为投资者随时可以在市场上买进或卖出国债，这样一来国债成交的价格便可能不同于其票面价值。假如国债价格下跌，也就意味着实际利率的上升。反之，如果国债价格上升，也就意味着实际利率的下降。&lt;/p&gt;

&lt;p&gt;在投资者方面看到的效果就是，如果有大批资金涌入国债，推高其价格，那么新买入国债的人拿到的收益便会减少（因为最后还本付息时是按照票面的本金和利率）；反之，如果大家发现有更好的投资纷纷卖出国债，导致其价格下跌，则新买入国债的人拿到的收益便会增加。&lt;/p&gt;

&lt;p&gt;为什么美国国债如此重要呢？因为美国国债是目前市场上普遍认为风险最低的投资（说句题外话，如果发生了美国国债危机，则一定也会出现另外一种债券来替代它的地位，不过这个几乎是不可能事件）。另一方面，一般来说，如果债务人信誉良好，贷款债权也被认为是风险较低的投资，但这个风险仍然高于美国国债。既然风险高，那么投资者当然也就希望获得更高的回报，这个回报便反映在价格上，即贷款的利息。&lt;/p&gt;

&lt;p&gt;因此，通常银行提供的贷款利息的基准利率，便是国债的市场收益率加上一个数额。这个数额的多少，取决于贷款人的信用分数(FICO Score)。&lt;/p&gt;

&lt;p&gt;所以我们会看到一个很有意思的现象：在股市大盘下跌的时候，由于许多投资人会选择撤出资金投入债券市场而推高债券价格，从而降低债券收益率，进而促使银行降低贷款利率；反之，当经济复苏，大量投资人卖出债券并买入股票时，银行也会因应提高贷款利率。&lt;/p&gt;

&lt;p&gt;还有一个潜在的外力因素是美国政府（具体实施可能通过央行，即联储局）以&quot;量化宽松&quot;的形式买入债券，或外国政府大量买入债券，从而推高债券价格。此时发生的效果和股市大跌类似。&lt;/p&gt;

&lt;p&gt;有时，银行也会考虑未来的利率走势，例如，如果银行预期未来贷款利率会大幅提高，则固定利率的贷款利率会开始有所提高，等等。&lt;/p&gt;

&lt;p&gt;常见的贷款形式包括头5、7甚至10年固定利率的30年期可变利率贷款（ARM），以及十五年、三十年期的固定利率贷款。对债务人而言，利率固定的时间越长，未来的不确定性就越小，但对银行而言的风险也就越大。由于银行承担的风险不同，它们对应的利率也依次提高。&lt;/p&gt;
        &lt;p&gt;可变利率贷款的优点是，在市场利率下降时，可变利率贷款的利率也会随之下降。（当然，如果利率提高，尽管有封顶，但贷款利率也还是可能会提高）。此外，由于初期利率较低，可变利率贷款意味着可以更快地建立 equity（假如支付和固定利率贷款同样的金额，即额外偿还本金的话）。&lt;/p&gt;

&lt;p&gt;说到这里，我认为必须要多说一句。由于贷款信息属于公开信息，因此在购房之后，债务人会迅速收到许多来自不同地方的垃圾邮件。其中有一种垃圾邮件会提供一种&quot;每两周还款一次&quot;的还款方案，本质上，这种方案是每年偿还13个月本金，由于多付了一个月的本金，自然就会缩短贷款的长度并节省利息。但这种垃圾邮件没有告诉你的是，这种做法是完全没有必要通过这样的公司去做的。表面上看，每两周付一次贷款，并不会增加太多财务方面的压力，但事实上，如果维持良好的财务计划，每个月将额外的相当于房贷1/12的钱用于低风险投资（例如零存整取的定期存款，或存入高收益率MMA，甚至购买债券等），并在年底的时候一次性支付，或者比较简单的、每个月多付1/12的钱，都可以达到同样的效果。把钱交给这样的所谓&quot;管理公司&quot;，实际上只是给了他们一笔无息贷款，让他们白白赚取利差而已。&lt;/p&gt;

&lt;p&gt;在和银行讨论贷款的时候，通常贷款经纪会给出几种不同的方案。比较常见的一种降低同条款（期数、是否固定利率等）贷款利率的方法是预付利息，或称&quot;付point&quot;。通常，point是在首付之外另外支付的一笔相当于贷款比例的现金。是否付point要看准备持有这处房产多久（或者说多长时间之内准备付清贷款），假如较短，通常付point是不合算的。是否应该选择付point，要根据自己的实际情况以及对利息产生的影响来仔细计算。当然，数学不好（这个其实说不太过去，因为有了公式实际上是计算机去算的，另外有那么多需要计算器才能算清楚超市账单的主，你好意思说自己数学不好嘛）或者懒得去算的同学，就只能拼自己找的贷款经纪的人品了。&lt;/p&gt;

&lt;p&gt;除了本金和point之外，银行有时还会收取一些其他费用，例如房屋的估价费，等等，这些要在询价的时候问清楚。一般来说，可以多找几个不同的银行来寻找利率、现金花费最低的贷款，一个比较简单的方法是直接询问对方&quot;no point, no fee&quot;的情况下贷款利率可以做到多少，比较之后再和对方谈具体的point和费用等问题。&lt;/p&gt;

&lt;p&gt;一旦有了贷款，很多投资决策也会有新的考虑。举例来说，在保证了未雨绸缪资金（通常是6-12个月的PMT+生活必需的花费）的前提下，如果有了 $5000 的计划外收入，例如奖金的时候，假如不能做到投资的税后收益比贷款利率高的话，也许直接去偿还贷款本金是个更好的主意（当然，实际的计算比这个复杂一些，因为多偿还的本金会减少本年度支付的贷款利息）。&lt;/p&gt;</description>
	<pubDate>Wed, 14 Mar 2012 08:49:55 +0000</pubDate>
</item>
<item>
	<title>@khsing: About learning on the Internet</title>
	<guid>https://blog.khsing.net/?p=482</guid>
	<link>https://blog.khsing.net/2012/03/about-learning-on-the-internet.html</link>
	<description>&lt;ol&gt;
&lt;li&gt;讀英文文檔，英文不好就練習&lt;/li&gt;
&lt;li&gt;用Google.com，Google.com.hk也不要用&lt;/li&gt;
&lt;li&gt;先翻官方文檔，再去社區。先搜索，再提問&lt;/li&gt;
&lt;li&gt;如果搜到了好的文章，或者有別的文章提到這個文章了，但是文章已經不存在了，就去&lt;a href=&quot;http://web.archive.org&quot;&gt;web archive&lt;/a&gt;看看&lt;/li&gt;
&lt;li&gt;關注一些Conf，不能現場去聽但是大多都有slide或者video，這些東西未必能直接解決問題，但是提供了很多的思路。&lt;/li&gt;
&lt;/ol&gt;</description>
	<pubDate>Wed, 14 Mar 2012 08:49:01 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 被实名制了</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2114</guid>
	<link>http://shell909090.com/blog/2012/03/%e8%a2%ab%e5%ae%9e%e5%90%8d%e5%88%b6%e4%ba%86/</link>
	<description>&lt;p&gt;    大家听说新浪围脖要实名制了吧？贝壳不大想实名制的，但是今天早上开围脖，收到一条消息，“您已经成功绑定了手机，具备真实用户身份，您已获得&quot;微身份&quot;勋章。&quot;微身份&quot;勋章用户，帐号更安全，交流更放心，与朋友互动更便捷。查看详情。”
&lt;div&gt;    TMD我连自己手机号隐私都保护不住，安全个P。&lt;/div&gt;
&lt;div&gt;    列一下新浪围脖的权限：&lt;/div&gt;
&lt;div&gt;查阅敏感日志数据&lt;/div&gt;
&lt;div&gt;发送短信&lt;/div&gt;
&lt;div&gt;GPS位置&lt;/div&gt;
&lt;div&gt;网络访问权限&lt;/div&gt;
&lt;div&gt;修改/删除SD卡内容&lt;/div&gt;
&lt;div&gt;录音/拍照和视频&lt;/div&gt;
&lt;div&gt;读取手机状态和身份&lt;/div&gt;
&lt;div&gt;更改网络连接性&lt;/div&gt;
&lt;div&gt;    对，每条都是必要的。围脖可以附加位置，所以新浪需要GPS信息，围脖可以发照片和视频，所以需要拍照和录音权限。但是这些合起来，看看我能做什么。&lt;/div&gt;
&lt;div&gt;    有“读取手机状态和身份”和“发送短信”权限，可以伪装本人登录网银，操纵资金。&lt;/div&gt;
&lt;div&gt;    有“GPS位置”和“录音/拍照和视频”权限，可以监控你的行踪，观察你在和谁说些什么东西。&lt;/div&gt;
&lt;div&gt;    既可成为神也可成为恶魔的程序阿。&lt;/div&gt;
&lt;div&gt;    我准备立即删除应用，封存新浪围脖帐号。并建议大家也如此。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div&gt;    另外，我随便翻了几个程序，发现国外的app，或者说大厂app，谷歌原生app，权限都十分干净。身份验证器，权限只有“控制振动器”。快图浏览，权限也只有“修改/删除SD卡内容”和“防止手机休眠”。slice it的权限是，“修改/删除SD卡内容”，“完全的互联网访问权限”，“读取手机状态和身份”和“系统工具”。其中最后两个权限比较可疑。&lt;/div&gt;
&lt;div&gt;    而国内的app，权限都十分古怪。我就光列一些比较奇怪的吧。京东，需要精准GPS位置，拨打电话号码，读取手机状态和身份。支付宝，需要联系人数据。手机QQ，需要精确的GPS位置。&lt;/div&gt;
&lt;div&gt;    感觉上，app的权限都被滥用了。是的，android设定了权限。是的，我们可以查看app权限，并且阻止有疑问的应用的安装。但是，我查看的一大半应用，都具备“读取手机状态和身份”这个权限。就是说，他们可以知道你的手机号，然后找到你是谁（中国手机大半都是实名制的）。而我从来没听说过有人对此有过疑问和警惕。&lt;/div&gt;
&lt;div&gt;    而且即使你有疑问，也没什么办法。android没有提供一种机制，对权限有疑问的程序，封闭一部分权限。例如你对QQ的摄像头访问权限有疑问，可以关闭摄像头。这样会更加安全，当然，代价就是无法在QQ中使用摄像头了。如果你信的过雷布斯，小米有提供类似的功能，不过只能封闭某类的权限。&lt;/div&gt;&lt;/p&gt;</description>
	<pubDate>Tue, 13 Mar 2012 20:13:42 +0000</pubDate>
</item>
<item>
	<title>@xupeng: MySQL-python: Commands out of sync</title>
	<guid>http://blog.xupeng.me/2012/03/13/mysql-python-commands-out-of-sync</guid>
	<link>http://blog.xupeng.me/2012/03/13/mysql-python-commands-out-of-sync/</link>
	<description>&lt;p&gt;在给 MySQL 数据库访问层增加新功能时遇到了这样的错误：&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;&quot;&gt;&lt;span class=&quot;line&quot;&gt;ProgrammingError: (2014, &quot;Commands out of sync; you can't run this command now&quot;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;


&lt;p&gt;之前零星地见到过几次，因为发生频度很低，就没有太在意，这次找了一下原因，MySQL 文档对 &lt;code&gt;Commands out of sync&lt;/code&gt; 错误的描述是这样的：&lt;/p&gt;

&lt;!-- more --&gt;




&lt;blockquote&gt;&lt;p&gt;If you get Commands out of sync; you can&amp;#8217;t run this command now in your client code, you are calling client functions in the wrong order.&lt;/p&gt;&lt;p&gt;This can happen, for example, if you are using mysql_use_result() and try to execute a new query before you have called mysql_free_result(). It can also happen if you try to execute two queries that return data without calling mysql_use_result() or mysql_store_result() in between.&lt;/p&gt;&lt;strong&gt;Commands out of sync&lt;/strong&gt; &lt;cite&gt;&lt;a href=&quot;http://dev.mysql.com/doc/refman/5.1/en/commands-out-of-sync.html&quot;&gt;dev.mysql.com/doc/refman/5.1/en/&amp;hellip;&lt;/a&gt;&lt;/cite&gt;&lt;/blockquote&gt;


&lt;p&gt;MySQL 和客户端通信使用的是“半双工”的应答协议，客户端每发送一个查询，服务器“强行推送”结果给客户端，客户端需要执行 &lt;code&gt;mysql_use_result()&lt;/code&gt; 或 &lt;code&gt;mysql_store_result()&lt;/code&gt; 从服务器端取回结果，这是一次完整的查询交互，只提交查询而不取回结果就会导致 &lt;code&gt;Commands out of sync&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;由于使用的是 MySQL-python，所以第一种情况所说的没有调用 &lt;code&gt;mysql_free_result()&lt;/code&gt; 的问题不大可能存在，并且 MySQLdb 的默认 cursor 使用的是 &lt;code&gt;mysql_store_result()&lt;/code&gt; 而不是 &lt;code&gt;mysql_use_result()&lt;/code&gt;，所以应该是第二种情况。&lt;/p&gt;

&lt;p&gt;抓取了一些有可能会导致这个问题的查询，发现了类似这样的语句：&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;&quot;&gt;&lt;span class=&quot;line&quot;&gt;SELECT a, b FROM t LIMIT 1; -- some comments&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;


&lt;p&gt;执行了这样的查询之后，再执行任何查询都会遇到 &lt;code&gt;Commands out of sync&lt;/code&gt; 问题。&lt;/p&gt;

&lt;p&gt;因为这其实是由分号隔开的两个独立的查询语句，使用 MySQLdb 执行时，作为一个语句发送给 MySQL server，之后 MySQLdb 执行了一次 &lt;code&gt;mysql_store_result()&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;之前需要自动地给每一个查询增加注释，而个别的查询在末尾写了分号，追加注释之后就触发了这个问题，那么只需要在加注释前 strip 掉分号就好了。&lt;/p&gt;

&lt;p&gt;MySQLdb 有四种 cursor：&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;7&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;8&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;9&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;10&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;11&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;12&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;13&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;14&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;15&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;16&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;17&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;18&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;19&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;20&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;21&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;22&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;23&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;24&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;25&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;26&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;&quot;&gt;&lt;span class=&quot;line&quot;&gt;class Cursor(CursorStoreResultMixIn, CursorTupleRowsMixIn,                      
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;             BaseCursor):                                                       
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;                                                                                
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &quot;&quot;&quot;This is the standard Cursor class that returns rows as tuples            
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    and stores the result set in the client.&quot;&quot;&quot;                                 
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;                                                                                
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;                                                                                
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;class DictCursor(CursorStoreResultMixIn, CursorDictRowsMixIn,                   
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;                 BaseCursor):                                                   
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;                                                                                
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;     &quot;&quot;&quot;This is a Cursor class that returns rows as dictionaries and            
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    stores the result set in the client.&quot;&quot;&quot;                                     
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;                                                                                
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;                                                                                
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;class SSCursor(CursorUseResultMixIn, CursorTupleRowsMixIn,                      
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;               BaseCursor):                                                     
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;                                                                                
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &quot;&quot;&quot;This is a Cursor class that returns rows as tuples and stores            
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    the result set in the server.&quot;&quot;&quot;                                            
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;                                                                                
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;                                                                                
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;class SSDictCursor(CursorUseResultMixIn, CursorDictRowsMixIn,                   
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;                   BaseCursor):                                                 
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;                                                                                
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &quot;&quot;&quot;This is a Cursor class that returns rows as dictionaries and             
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    stores the result set in the server.&quot;&quot;&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;


&lt;p&gt;默认使用的是 &lt;code&gt;Cursor&lt;/code&gt;，在提交查询之后执行 &lt;code&gt;mysql_store_result()&lt;/code&gt;，将 MySQL Server 返回的所有数据都取回并缓存在本地，&lt;code&gt;SSCursor&lt;/code&gt; 则是使用 &lt;code&gt;mysql_use_result()&lt;/code&gt;，将结果“缓存”在服务器端，客户端逐行取回结果，好处是速度会比 &lt;code&gt;mysql_store_result()&lt;/code&gt; 快，并且客户端可以节省内存，但在高并发环境下，还是使用默认的 &lt;code&gt;Cursor&lt;/code&gt; 比较好，因为 MySQL server 只有在客户端取回所有的结果之后才会释放相关的锁（如果有的话），而逐行取回并分别对每行做处理大多会需要更长的时间。&lt;/p&gt;

&lt;p&gt;Reference:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://dev.mysql.com/doc/refman/5.1/en/mysql-store-result.html&quot;&gt;http://modperlbook.org/html/20-2-4-mysql_use_result-Versus-mysql_store_result-Attribute.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://dev.mysql.com/doc/refman/5.1/en/mysql-store-result.html&quot;&gt;http://dev.mysql.com/doc/refman/5.1/en/mysql-use-result.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://dev.mysql.com/doc/refman/5.1/en/mysql-store-result.html&quot;&gt;http://dev.mysql.com/doc/refman/5.1/en/mysql-store-result.html&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
	<pubDate>Tue, 13 Mar 2012 10:12:00 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 普吉岛游记下</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2112</guid>
	<link>http://shell909090.com/blog/2012/03/%e6%99%ae%e5%90%89%e5%b2%9b%e6%b8%b8%e8%ae%b0%e4%b8%8b/</link>
	<description>&lt;div&gt;    第三天的行程最复杂，也最精华，但是最让人郁闷。因为我们是国内团体出游，而且是公司组织。所以我们的团费是公司付的。上一个团有小PP岛的项目，感觉最好玩，所以我们是打算自费参加的（要自己掏钱）。结果在出国前一天（注意这个时间），旅游代理才传来消息，自费项目被打上了一个超级贵的价格，而且离团要收取1500元/人/天的费用。一天时间根本不够我们商量处理的，我们就出了国。当地导游更夸张了，直接把我们的项目打了个包，不能拆散了卖。要去小PP岛，可以，一堆项目，7500B起。而且头天车上把原定行程说的一钱不值，彻底影响游玩心情。没办法，我们自费去的小PP岛，这点很不爽。&lt;/div&gt;
&lt;div&gt;    但是实话实说，由于大小PP岛我们都转了一圈，至少旅行社还没彻底骗人，小PP岛确实比大PP岛好玩。海水清澈透明，快艇也很爽很给力。如果不是这样的话，我估计全团的人要彻底吵翻天了。不过鉴于我们的状况，我建议大家去普吉岛一定要自由行，然后再找当地华人旅行社报价，价格非常给力。网络上有人说1200B就玩到了，最贵不过1800B。&lt;/div&gt;
&lt;div&gt;    早上我们在海边坐一个30多人的快艇，向东南方向开。旅行社号称船上水和水果不要钱，其实携带是有限的。只有一个大的保温箱，里面装了不少饮料和冰块，水果相当少。早上的阳关还比较温煦，所以我选择坐船头。快艇开往波光粼粼的印度洋，迎着海面的朝阳，吹着咧咧的海风，舒服是挺舒服，但是结果就是——我晒伤了。千万记得，不要以为晒到不热就不会晒伤，也不要以为涂了防晒油就无敌了。&lt;/div&gt;
&lt;div&gt;    小PP岛行程的第一天是猴子沙滩，沙滩上有很多猴子，拍照千万记得给吃的。我们团出了点事故，有个游客，我们不知道是谁，逗猴子玩。猴王发怒了，结果他自己跑掉了。然后一个温州的老阿姨没看到，看见猴子跑过来很开心的拍照，结果就被猴子抓伤了。这件事情导游在车子上说过不要随便招惹猴子，所以怎么定性都是意外。隔壁一个团也在逗猴子，不过他们有给吃的。而且领队说自己带队数年，头一次听说猴子伤人的情况。因此，出来玩注意人身安全，逗猴子要给吃的，而且千万记得不要让猴子看到你从包里面拿吃的，否则他还会抢你的包。&lt;/div&gt;
&lt;div&gt;    猴子沙滩旁边是大堡礁，这是另一个精华景点。大堡礁海水清澈，带上浮潜装备后，可以清楚的看到海水下面的礁石和鱼群。我们玩了一个多小时，多数人都晒伤了。猜猜最容易晒伤的位置在哪？不是手脚，不是面部，也不是背部——那个有救生衣。是两个肩膀。如果要玩浮潜，建议在肩膀上多涂抹防晒油。&lt;/div&gt;
&lt;div&gt;    然后是情人沙滩，目前这个景点已经不是特别好玩了。这个景点本来有个钟乳石，和男性的某个器官特别类似。但是在年初涨潮的时候，被一个长尾船撞坏了。因此去拍照的时候，基本照不到什么。不过青山，海滩，还有美女，还是值得一看的。尤其是有不少MM穿着泳衣跑来跑去，有的还系上一条纱笼，很养眼。&lt;/div&gt;
&lt;div&gt;    情人沙滩的隔壁就是三峡湾，那里三面环山。进出的狭长甬道水位很浅，因此显现出苹果绿色。而进去后水位反而增加，显现墨绿色。海水温度冷热适中，比较适合游泳，但是不适合浮浅。在那里游了一会就走掉了。另外所谓水温冷热适中这话也说的很有技巧。我们游下来的结果是，海水温度循环，导致部分区域温度高，部分区域温度低。好像家里冷水和热水龙头一起开的时候，在脸盆里面感觉到的情况一样。温差不是很大，有救生衣，也不用怕抽筋呛水，还是挺好玩的。&lt;/div&gt;
&lt;div&gt;    中午在大PP岛上吃的自助餐，海水果然更加浑浊一些。自助餐很难吃，但是有一种粉条还是味道不错的。下午参观了一个燕窝洞，燕子没看到多少，但是看到不少鱼。由于水位浅，燕窝洞前的海水还是浅绿色，和远处墨蓝深黑的印度洋完全不同。从高处往下看，鱼群清晰可见。扔点面包屑下去，鱼群就跳出水面争抢。实话说，也就这点还算好玩。&lt;/div&gt;
&lt;div&gt;    中间插一句，就我看到的印度洋的海水，每天每时每刻都不相同。早上和晚上的时候，基本呈现浅蓝色，天气好的情况下就波光粼粼，而天气不好就带有一丝灰色，部分海面会比较平静。而中午的时候，海水就呈深墨绿色，如同一块巨大的翡翠。海水浅的地方，会显现出神奇的苹果绿色。海面上风吹过，海水就在底下的沙滩上形成变化万千的光斑，如同我们在电视上看到的那样。当渐渐变深的时候，颜色会逐渐从苹果绿过渡到深绿再到深蓝。清澈的海水可以见到2-3米以下，而浑浊的海水则很难看到1米一下的情况。珊瑚岛，大堡礁，都是属于清澈的海水。而大PP岛，帝王岛则是比较浑浊的海水。&lt;/div&gt;
&lt;div&gt;    帝王岛其实并不如想像的好玩，我们玩的地方旁边就是礁石，我的脚掌被礁石划伤了两道，红肿，但是没有破。海滩上死珊瑚很多，非常扎脚，比起来猴子沙滩上根本不用穿鞋。海水很难看到2-3米以下的情况，而且沙滩上没有什么美女。唯一比较开心的是我们在这里玩了一个多小时。我怀疑为什么没有在大堡礁那里玩多点时间，暗自猜测大堡礁也许是收费的吧。&lt;/div&gt;
&lt;div&gt;    从行程回来，我们在码头那里买NaRuYa的包，据说是泰国特产。码头会贵一点，但是我们不知道后面还有没有机会，没办法，还是买了。后来算下来，贵了将近20%。晚上是购物行程，参观腰果工厂。我买回来的酸辣腰果大概是280B，合人民币58左右。而淘宝上这东西200g的售价大约在40左右，由此你们大概就知道所谓合算是什么一个概念了。&lt;/div&gt;
&lt;div&gt;    晚上我们在街边买了不少衣服，由于是临时决定的购物，所以导游大概只能拿一点回扣。我用1000B买了6件衣服，合34一件。不算很便宜，但是由于都很有特色，所以很喜欢。女孩子去泰国可以买一条纱笼，穿着很漂亮的。那里的长裙穿着也很有气质——当然，这个是因人而异的。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;    最后一天是纯粹的购物行程，早上去寺庙参拜。泰国寺庙有一点好就是，你给的供奉多少随意，我基本没听说过硬要收的香火钱。也许是因为当地人笃信佛教，敢这么干会被当地人鄙视吧。但是如果你许了愿望就记得去还愿。我没有进经堂，就在外面拍了拍寺庙大殿，还有经堂门口的猫和狗。开始我还以为猫狗都有佛性，流连在经堂门口不肯离开。结果过去一看，隔壁放着一个牌子，上面写着猫狗饲料10B一包。东西并没有人看管，猫狗也不随便去吃。我想这个此情此景，应该没几个煞风景的会倒饲料不付钱吧。&lt;/div&gt;
&lt;div&gt;    中午我们去医院接了一下被猴子抓伤的阿姨，据说是手筋断了，在岛上没有缝针，只是简单的注射了狂犬病和破伤风疫苗，然后包扎一下就走了。结果手臂血流不止，到晚上没办法，送去医院。第二天传来消息说手筋断了，去私立医院做的接筋。因此再三强调，旅游有风险，大家要小心。尤其不要乱逗生物，逗大象什么的，记得最多一次就要给他。逗猴子之类的最好离远点，还要小心抢包。摸海洋生物更是要小心，水母，珊瑚鱼，都是有毒的。海胆没毒，但是扎到很痛。&lt;/div&gt;
&lt;div&gt;    下午是一个宝石店，一个皮具店，一个毒蛇研究中心。除了玩蛇表演无善可表，因此不细说。不过晚上老杨看到他在皮具店里面买到的钱包，在超市中仅售1/3的价格——那个——你们自己去想吧。泰国的宝石还并非特别出名，真正以宝石而闻名的应当是缅甸和斯里兰卡。尤其是缅甸密支那的翡翠，更是独一无二，而且基本接近开采殆尽。但是泰国还是很著名的宝石产地，其红宝石在欧美市场尤其受到欢迎。但是不得不说的是，宝石这个东西是高度专业的领域，不懂还是不要随便购买的好。虽然说我们去的那家店属于皇家店，不用担心假货之类问题。但是价格就是另一个问题了。&lt;/div&gt;
&lt;div&gt;    晚上我们逛了一下超市，这才真正买到了不少好东西。蜂蜜，腰果，调料，咖哩，榛子酱，非常便宜，而且不用担心假货。泰国有三个死刑，贩毒，杀害父母（杀其他人还不是死刑），还有食品药品造假。因此国内很多蜂蜜都有问题，泰国的蜂蜜基本都是OK的。&lt;/div&gt;
&lt;div&gt;    上飞机前，我们去办理了退税。泰国退税的流程是，你要在可以退税的商店中，消费2000B以上（同一家商店）。然后在那家店里面办理退税单，对方会要你的护照号码，并列出你能够拿到多少的退税。通常是7%，在单子上会写有多少泰铢。然后在机场进入海关第二次安检，等待飞机的登机口那里，可以有一个VAT退税窗口。以你的护照和登机牌，退税单办理退税手续。要注意，一次退税有100B的手续费，因此建议熟人合到一起退税。退税可以选择人民币或者泰铢，看你自己高兴。但是不得不说，退税的实际额度非常小，我们一行9人消费了7000多B，合人民币1500上下。退税才500B，到手400B，合人民币80，一人10块。但是退税要排队将近半个小时，没那个美国功夫的可以省省了。我看到温州团的阿姨们一帮人，一次退税10000B——这TMD才值得退好吧。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;    另外，附上泰国购物的物品价格对照。&lt;/div&gt;
&lt;div&gt;豆奶，别算价格了，泰国那里豆奶明显和上海不是一个档次的，10B。&lt;/div&gt;
&lt;div&gt;腰果，上海这里大概是100元/500g，泰国那里超时里大概是120B/200g，我们的购物景点是280B/200g。&lt;/div&gt;
&lt;div&gt;榛子酱，上海这里是55元/750g，泰国那里是300B/750g，亏。&lt;/div&gt;
&lt;div&gt;蜂蜜，不算价格了，中国的蜂蜜里面都是结晶的，泰国那瓶现在在我冰箱里面还是液体。&lt;/div&gt;
&lt;div&gt;nex-3c相机（因为我也用这个相机，所以知道国内价格，作为电子类产品代表关注了一下），泰国大约是21000B，国内是4300，差不多。&lt;/div&gt;
&lt;div&gt;&lt;span&gt;NARAYA包，国内有搞代购的，因此大包100上下，小包10-20不等。换成泰铢，在泰国那里大概就便宜个10-20%。注意，如果是购物点，或者导游推荐的点，通常和国内一个价格。&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;font color=&quot;#222222&quot;&gt;&lt;span&gt;衣服，我买了6件，包括短袖，polo，纱笼，连衣裙什么的，都比较有当地特色，1000B。这个国内价格很不透明，不过换成人民币，我想我在国内也很难买到更便宜的东西了。&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#222222&quot;&gt;&lt;span&gt;化妆品。只能说，去了就装一堆欧莱雅回来，基本都是50%discount。我买了1000多人民币的化妆品，大概省掉了1000多，是此次旅行中最合算的部分，其余最好也就是做平。&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;</description>
	<pubDate>Sun, 11 Mar 2012 22:31:19 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 普吉岛游记上</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2110</guid>
	<link>http://shell909090.com/blog/2012/03/%e6%99%ae%e5%90%89%e5%b2%9b%e6%b8%b8%e8%ae%b0%e4%b8%8a/</link>
	<description>&lt;div&gt;    来到普吉岛的第一天，是晚上一点左右。布吉国际机场是一个非常小的机场，大概和国内普通城市机场差不多大，但是每年却拥有上百万的人流量，其中主要都是来普吉岛渡假的欧美游客。我们坐车从布吉国际机场到芭东的The Blue Marine Resort &amp;amp; Spa Hotel，到达的时候已经是两点多了。&lt;/div&gt;
&lt;div&gt;    首先讲点泰国旅游常识，泰国在东7区，使用曼谷时间，和北京时间差一个小时。当地使用的语言是泰文，大部分人不会讲英文和中文。当然，如果去到旅游场所，中文和英文使用比例是高的吓人的。有一个旅游商店，所有营业员都是中文英文泰文，部分我听到了日文。。。&lt;/div&gt;
&lt;div&gt;    泰国是王国，人民很尊敬王室，所以不要拿王室开玩笑。对方听不懂，没事。听懂了，自找麻烦。泰国有九成的人信奉佛教，泰国的佛教属小乘佛教，僧侣可以吃肉喝酒，但是不可接近女色。所以去旅游的MM看到僧侣一定要避开，去寺庙参观的时候一定要穿戴整齐，不可以穿太露的衣服。&lt;/div&gt;
&lt;div&gt;    泰国的货币是泰铢，简写为B。目前泰铢汇率大概在4.3-4.9之间。在中国银行可以以很高的价格拿到泰铢，我是4.8左右拿到的。而到了机场和当地就会价格低一点。当地很多商店是不支持visa和银联卡的，因此去之前都要打听清楚。visa可以刷美金，银联刷人民币，都是以中国银行的卖出汇率当场结算。但是有些商场可能需要手续费。另外，如果现金不足，从卡中取泰铢也是可以的，但是同样需要手续费。普通银行卡需要具备这个功能，每次手续150B。而信用卡则作为预借现金计算费用，具体费用查自己的发卡行。&lt;/div&gt;
&lt;div&gt;    泰国的东西很便宜，我们酒店隔壁的超市，一瓶黑豆奶10B，很好喝。我买了120ml的防晒霜，327B，合人民币大约70不到。普吉岛地区日晒严重，一定要spf50+的防晒霜，而且要注意防晒，否则就一定会晒伤。&lt;/div&gt;
&lt;div&gt;    泰国主要有三种民族，穆斯林，泰国人，华人。泰国的华人也要看出国时间长短，有的是百年前的潮州和福建人到此定居的，因此除了习俗还保留中国人习俗，基本已经不能听说汉语。有些是国民党93师的后裔，因此还能听说汉语。我们导游的爷爷，就是93师的。下文会细说这个师。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;    普吉岛第一天的行程很简单，就是去割喉群岛而已。割喉群岛位于攀牙府，在普吉府的北边。海岸边生长着密集的红树林，需要坐长尾船从红树林中穿出去。这边的红树林规模非常大，我在杭州和北海都有看到过红树林，远远看过去一片已经算是非常大。这里居然坐船连续开了20多分钟，所见全是红树林。据说只有巴西的红树林可以和这里媲美。&lt;/div&gt;
&lt;div&gt;    从红树林开出，我们到回教村落是午饭。当然，既然是回教村落，就肯定没有猪肉和酒。我们吃到了一种鱼，这边吃饭的时候几乎顿顿都能看到。同事说中国也有的卖，不是很特产的鱼。村落很有意思，整个架在水面上的，彷佛一条大大的船。我们在餐厅经常可以看到包着头巾的穆斯林。&lt;/div&gt;
&lt;div&gt;    从村落开出，我们就到了割喉群岛观光点。那里是两艘船，每艘的侧面可以停靠长尾船，而尾部可以停靠皮划艇。有当地人会用很小的皮划艇载着我们划过割喉群岛。那里的岩石下面有不少洞穴，涨潮的时候会彻底淹没。我们去的时间差不多，因此人躺下后可以从洞穴顶部划进去。最近的地方，我必须努力吐气才能避免肚子碰到岩石。旁边同样生长着不少红树林，还有老外爬上去照相的。&lt;/div&gt;
&lt;div&gt;    皮划艇上的工作人员是当地人，不会说英文，但是居然会说一点中文。泰国是资本主义国家，因此不少地方都需要给小费。皮划艇上下来后，你需要给工作人员100B的小费。和愉快的旅行相比，100B的小费很值。&lt;/div&gt;
&lt;div&gt;    晚上是去普吉市内的一家店吃烧烤，泰式烧烤很不错，我们都可以去自己拿，拿了就随便吃。不过墙上用中文写着，吃下去是福气，浪费是淘气，浪费食物罚款300B。估计有不少中国人都是随便拿，浪费掉的，感觉十分尴尬。老板是华人，而且会说中文，估计是从大陆过去做生意的。东西上面有涂调味料，有点辣味。很好吃，但是我吃不大习惯。到了后期都是烤好了在旁边的水里洗一下再吃的，回去还是有点小小的闹肚子。&lt;/div&gt;
&lt;div&gt;    当晚我和领队聊天，发现领队居然很熟悉93师的事情。国内了解93师的人应当不多，做一下简要介绍。当年国共内战，93师在云南地区作战。国民党打不过共产党，蒋介石就想到了退守台湾。93师人数庞大无路可退，就退入了缅甸-老挝-泰国交界的金三角地区。虽然内战打不赢共产党，但是93师和泰国人打却没怎么输。硬生生在金三角地区打游击，打的泰国人无计可施。但是国民但始终对93师不闻不问，这样下去也不是办法，最后部队投诚泰国，帮泰国人打仗，换取子孙的泰国人身份。93师付出惨重代价，才换来了子孙的合法地位。我们的导游，身份证号就是8开头的，因为是从难民证办理出来的。而投诚之前，为了维持生计，他们就在驻地种植鸦片。金三角于是成了世界闻名的毒品源头。有一个叫坤沙的人，中文名字张奇夫，成了世界闻名的毒王。导游的爷爷就是93师成员，当年导游曾亲眼见到如何制作和吸食鸦片，爷爷也因为鸦片过世。&lt;/div&gt;
&lt;div&gt;    因为是敌对部队的后裔，因此大陆对93师也不怎么关心。据导游说，邓公当年曾经有心让93师归国，但是被指婚官拒绝。台湾对93师虽然有心，却鞭长莫及。领队因为好奇，曾经雇人驱车前去美斯乐。当时遍地的罂粟已经被铲除，改为种植高山茶。经常可以看到台湾商人前去旅游，并向当地人购茶。不但不砍价（貌似砍价已经是中国人购物的标准流程了），而且还多付。当地的汉语小学就是由台湾方面出资修建的。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;    第二天的行程稍稍复杂，早上乘坐快艇去珊瑚岛，下午去神仙半岛。早上乘坐的快艇是20人左右的小艇，一团要分两艘，经过10多分钟的航行就可抵达珊瑚岛。沙滩上海水湛蓝，很适合游泳。领队和我们强调一点，必须在浮标划定的区域内游泳，不可离开。原来没有浮标的时候，经常有老外不慎游到快艇航线上，避让不及结果惨死。因此浮标内是游客玩水区域，浮标外是航道。早上的时候潮水还浅，我们站在海滩上根本游不起来。下午海水涨潮，才比较适合游泳。&lt;/p&gt;&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;    当地有一种降落伞项目，是让游客穿上降落伞，然后由快艇拖着放风筝。要求必须在80公斤以下，所以我就没玩。据李俊说，他在80公斤以上，却顺利玩了，很好玩。我报了深潜的自费项目，要价2100B，照相需要加750B的费用。&lt;/p&gt;&lt;/div&gt;
&lt;div&gt;    深潜和浮潜的区别在于，浮浅使用蛙镜和呼吸管，一般是潜不下去的。说是潜水，你最多在水面上浮着，因此才叫浮潜，不过能清楚的看到水里的东西。深潜是直接潜入水中，靠氧气瓶和呼吸管潜水。我们这次深潜的深度是3-5米，时间大约30分钟。计算压强大约是1.3-1.5个大气压，危险性不是很高。&lt;/div&gt;
&lt;div&gt;    首先会有教练教你如何在水中沟通，如何进行呼吸和排水。然后会帮你穿上整套的装备，从沙滩潜入水中。近视有专用的蛙镜，也可以参与潜水。入水后，可以看到成群的鱼在水里游动。有色彩斑斓的小丑鱼，有银蓝色长条的鱼，还有一些纯蓝色的鱼。可以伸手去摸，但是鱼很灵活，摸不到。偶尔可以看到几条黑色或者褐色的鱼，我们都不敢伸手。教练说这些鱼有毒，虽然不致命，但是会让手臂麻木肿胀一整天。&lt;/div&gt;
&lt;div&gt;    教练给我们戴上手套，然后给我们几块面包。顿时周围围上来成群的鱼，我基本看不到周围的情况。鱼不停的啄食面包，偶尔还有啄到我的手臂的。扔掉面包，我才能继续看到周围。后面教练还带着我们看贝壳，珊瑚，海葵和海胆。珊瑚和海葵都是软软的，海胆是一个带刺的球，据说扎到很痛，我没敢摸。&lt;/div&gt;
&lt;div&gt;    深潜是背氧气瓶潜入的，因此活动时间受限于氧气瓶内容量。如果呼吸慢，耗氧少，最长可以活动一个半小时。常规人是一个小时，教练预留15分钟安全区域，活动45分钟。而我的耗氧量比较大，才活动30分钟就开始上浮了，对不起我的同伴了。就我实验下来的结果，呼吸器有时会有吸不过气来的感觉，但是脸朝下后就好很多，猜测是因为海水压力所致。当肺部高于出气口时，吸气顺利，呼气受到压迫。而肺部低于出气口时相反。由于我们大部分时候都是缓慢呼吸以节约氧气，因此都是处于吸气不足的状态，脸朝下后问题就会缓解。&lt;/div&gt;
&lt;div&gt;    中午的午饭是在岛上吃的，只能说一般。下午继续游了一下，就回去了。下午参观四面佛。四面佛其实是印度教和婆罗门教的主神之一，梵天。但是在泰国很兴盛，而且基本都是在佛教寺庙中拜的，这点可以看到印度次大陆宗教互相影响的状态。我们路过很多人家，那里都有供奉四面佛。有一些很大的商场，门口一个麦当劳，麦当劳外面就是一尊四面佛。看着很不搭，但是很漂亮。如果在上海的朋友想看看，可以到正大广场门口，不知道那里供奉的四面佛还在不在。泰国的四面佛据说很灵验，有很多香港人都非常相信。具体对四面佛的解释可以自行查找wiki，本blog不解释宗教问题。&lt;/div&gt;
&lt;div&gt;    贝壳不信仰四面佛，不过那里的景色不错，拍了不少很好的照片。晚饭前去看了一个很无聊的农家表演，骑了一会大象，看了斗鸡，猴子摘椰子，割橡胶。然后就去了第一个购物景点，乳胶枕头。&lt;/div&gt;
&lt;div&gt;    泰国的却是乳胶的原产地，但是以为乳胶枕头比较便宜是没道理的。浙江杭州西湖旁的龙井山是龙井的原产地，你作为一个游客去那里买茶看看？不坑死算你厉害。一般来说，购物景点最好的情况下也就是能卖到你常规能买到价格的80%，甚至有的时候比你能买到的价格高出一倍类。所以旅游购物不必太疯狂，任凭导游吹的天花乱坠，不理他。如果你觉得导游服务不错，东西还算值得，而且真的用的上，可以适当买点。反之就不要买。如果你真想买点好东西，那就不妨看国内导游。他们在买的东西，那就不要犹豫了，大胆买吧。&lt;/div&gt;
&lt;div&gt;    晚上的行程预定是没有的，但是当地导游和我们推荐成人秀，当地叫神秘秀。说清楚是色情表演，而且不在自费名单里，小孩子不可以去看。这种就属于周瑜打黄盖，一个愿打一个愿挨。导游希望多赚点外快，游客希望多看点新鲜的东西，偏偏这个是不能列入标准自费行程中的（道理你们懂）。希望看就去看，色情是比较色情，刺激也比较刺激。我们这次一行九人出来，就不方便去看了。你问我好不好，我也不知道。&lt;/div&gt;</description>
	<pubDate>Thu, 08 Mar 2012 18:11:41 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 销售的几大手法和防御</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2108</guid>
	<link>http://shell909090.com/blog/2012/03/%e9%94%80%e5%94%ae%e7%9a%84%e5%87%a0%e5%a4%a7%e6%89%8b%e6%b3%95%e5%92%8c%e9%98%b2%e5%be%a1/</link>
	<description>&lt;p&gt;1.减少对方做选择的机会。一般来说，不怕不识货，就怕货比货。一旦买家有了选择权，卖家就少一个手脚可玩了。因此常见方法是封锁对方做选择的机会，例如，你们去南浦大桥下的沃尔玛，里面手机是没信号的吧。
&lt;div&gt;2.减少你的思考时间。通常这点是多少时间内购买打折，今天最后一天之类的说法。总之，让你的反应时间减少到24小时以内。&lt;/div&gt;
&lt;div&gt;3.非透明定价。通常来说，有市场价的东西是很难做销售的，例如电脑。也许你会说电脑卖家如何如何。但是我实话告诉你，如果他没有在硬件上骗你，给的是真货好货，全装好了，扣除成本（包括给自己发的工资），最多赚你1-2%。电脑卖家最稳定的赚钱渠道还是大量的小公司单。&lt;/div&gt;
&lt;div&gt;4.口头误导。在没有任何证据的场合下，他往往告诉你很多错误信息。这个东西其他地方卖多贵阿，效果有多好阿，一概是忽悠。如果你录像，他的手法就变成了强调特例和误导。不过后者是没有任何办法的。&lt;/div&gt;
&lt;div&gt;5.隐藏细节。很多sales，往往是会推敲你说话中的每个字。你要没注意到某个细节，他也就打马虎眼过去了。注意到了也尽量打马虎眼。例如一块显卡，64bit和128bit差40，你不说，他按照128bit的价格卖你64bit的卡。你即使有意见，这个也不是不合理，很难再退回来。这种事情很难防御，你要是注意每个细节，成本会太高。&lt;/div&gt;
&lt;div&gt;6.友谊策略。很多sales会尽量聊你熟悉的东西，让你产生亲切感。例如同乡，同学。反正他总能找出和你的共同点。有的时候你觉得帮帮朋友，该坚持的地方就没有坚持，钱他就赚到了。这个策略有的时候还有点变形情况，例如他可能会说，这个东西你不一定要买，因为什么什么。我们尽量卖对的，不卖贵的，什么什么是我们的企业文化。你会觉得好激动阿，见到好人了。然后他推荐你一家，你一买，上当了，那是他的另一家店。&lt;/div&gt;
&lt;div&gt;7.面子策略。有的时候，sales会营造你需要面子的情况。例如电影院门口给情侣卖花，饭店吃好了抢着买单。甚至据说有培训的时候，拉一帮人上来，问假定性的问题，你们愿意花多少钱和我做朋友。你说多少OK，行了，小弟，给他拉卡，按这个价格买我课程，你能不买么？&lt;/div&gt;
&lt;div&gt;8.花钱买故事。很多时候，sales会准备一个故事，或者一个环境。例如寺庙门口，坐着喝水，你问路，给你指路。然后随口和你说，烧香前一定要洗手，不洗手晦气。那你就会问，怎么洗手。他会接着领你去洗手。洗好了，旁边就有人说，这水开过光的，问你要钱，不付钱也可以，家人就会怎么样怎么样。来烧香的都是求平安的，这么一搞还有不付钱的么？或者有的时候，在车站那里，拉要旅游的人说，那边是收费项目，我建议你去一个地方，景色很好看，免费的。你去了，然后又有人说，到这里什么什么是特产，很便宜，就是不好买。等你从七八个人的迷魂阵里面出来，往往手里已经拎着这个月工资了。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;建议：&lt;/div&gt;
&lt;div&gt;1.首先一点，不是买所有东西都要唧唧歪歪。买一块面包都要货比三家，你烦不烦阿。有些东西你不是很在意，就买个价格合适的就好了。&lt;/div&gt;
&lt;div&gt;2.尽量增加信息量。你要看看别人对这个事情怎么评价的，网络上其他供应商报价如何。建议在手机上多准备几个应用，多准备点流量，怎么也比你吃亏来的便宜。&lt;/div&gt;
&lt;div&gt;3.从便宜的开始买。你不懂的时候，可以先买个便宜货。当你被这个便宜货折腾了几个地方，你就会注意到贵的东西为什么贵。再买的时候就比较不容易出错。&lt;/div&gt;
&lt;div&gt;4.买一个东西，必须经过48小时以上的思考和听取他人意见时间，否则不买。当然，这个可能错失不少好东西。但是我的经验而言，采取盲目购买造成的浪费通常比快速购买获得的好处要大一个数量级。&lt;/div&gt;
&lt;div&gt;5.和任何sales打交道都别上一个录像设备，也不一定要开，但是一定要别着。他们吃不准你是不是在录像，说话就会小心很多。如果sales要求你关掉，你可以掉头就走。或者堂而皇之的质疑他，你为什么不敢公开你说的话。&lt;/div&gt;
&lt;div&gt;
&lt;p&gt; 6.不要在意和sales的关系，亲兄弟明算帐。和sales搞好关系没啥奇怪的，我和一个卖电脑的关系不错，从他那里买了6年多电脑。我知道他有赚钱，不过没关系，赚的不比市场价格高太多就行。东西一定要OK，不行的话我会要求他给我换一个，有的时候还会因为东西有问题要他打折退钱什么的。大家是生意上建立的关系，明对明才容易维持。&lt;/p&gt;&lt;/div&gt;
&lt;div&gt;7.不要相信sales的任何一条信息，除了他需要和你达成的意向以外。他说1000卖你，这个你得听。他说这个东西好，那个东西不好，哪怕无关紧要，都不要听。&lt;/div&gt;
&lt;div&gt;8.不要脸。自己评估一下，值得不值得，值得的话，就干脆不要脸了。反正他也不要脸，你也不要脸，难道他会讲你么？&lt;/div&gt;
&lt;div&gt;9.不要好奇，拒绝故事。什么洗手之类的东西，一概听都不听直接跑掉，他拿你也没办法。硬要追你，还不如省点时间搞下一个。&lt;/div&gt;
&lt;div&gt;10.拒绝威胁性的负面信息。中国人的传统是说话挑好听的说，因此他一些负面信息出来的时候，你可以告诉他，行了，我明白你意思了，你说点别的吧。他继续说，你马上翻脸骂人，有TM你这么说话的么，我都说明白你的意思了，你要寻我晦气还是怎么。反正只要不开打，他拿你没任何办法，你也可以借坡下驴找个借口脱身，怎么说都是对方没理。&lt;/div&gt;
&lt;div&gt;11.假信息钓鱼。一般来说sales都有工作基础，即对方的某些真实信息。从口音判断家乡，从穿着判断收入，等等。很少有sales会假定客户是在说假话的，因为太麻烦太累了。因此，你可以放出一些错误的诱导信息。例如编造家乡，我外婆是宁波人，所以我可以说，阿，我老家宁波的。到时候他说他老家也宁波的，不好意思，那是我外婆老家，我爸爸老家江苏沙洲。再跟？我老家北京，我外公老家湖州。到了湖州都没听出来，这sales也做到头了。碰到这种客户，sales也知道对方在防他一手，往往不会太过明目张胆的玩什么技巧，只会设法在细节上阴你几下。&lt;/div&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 07 Mar 2012 19:11:00 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 每个程序员都是铁蹄下的尘埃</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2106</guid>
	<link>http://shell909090.com/blog/2012/03/%e6%af%8f%e4%b8%aa%e7%a8%8b%e5%ba%8f%e5%91%98%e9%83%bd%e6%98%af%e9%93%81%e8%b9%84%e4%b8%8b%e7%9a%84%e5%b0%98%e5%9f%83/</link>
	<description>&lt;p&gt;    这个标题很文艺，我知道。实际上我想说的问题是，未来的计算机会是什么样子。在讲正题前，我们先得说说一个我相当成功也是相当失败的项目。
&lt;div&gt;    在很久很久以前——好吧，其实大概就是八九年前——我还在上大学，学习机械工程。当时我对电脑很感兴趣，所以父母给我装了一台电脑。这台电脑有512M内存，PIII800MHZ的CPU，120G硬盘，是当时比较新的配置，相当好。实际上，我是用考入大学时的配置升级来的，而且花了不小的一笔钱。当时我迷上了看动漫，交大有一套系统叫做comic，用过的人都有印象吧？这套系统开始是为了动漫而设计的，上面保存了相当多的动漫，而且有管理员定期更新。后来上面更是放上了其他的影像资料，做了视频点播系统，并且为全校师生服务。交大的网络滥用警告（例如国际流量超标）并不直接张贴在校务栏上，那样没多少人能看到。这些警告张贴在comic上，并且会ban掉你对comic服务器的访问。我们哪天看不了comic了，就会去看看上面是否有警告，然后去网络中心处理掉。&lt;/div&gt;
&lt;div&gt;    好吧，扯远了。在毕业的年代，我担心自己将来不能访问comic了，所以打算带走一批我觉得有价值的数据。我毕业时新增了一块硬盘，组成了双硬盘系统，但是没有组成磁盘阵列(Raid或者动态磁盘[1])。除去系统中的80G左右的程序和数据使用空间，我还可以使用300G左右的空间。但是comic上我喜欢的数据远远超过了1T。为了解决这个问题，我就设计了volcpy系统。这个系统是这样设计的，将硬盘上的数据保存在光盘上，而将他的元数据——包括文件名，大小，光盘卷标等——留在磁盘上。这样我可以以1M的空间存储上T的数据。当时250G的磁盘大约700元，平均2.8元/G。而光盘4.3G大约1元，合0.23元/G，大约相差10倍。动漫数据是不会经常更新的，事实上应当是几乎不更新。volcpy系统负责将光盘上的文件在硬盘上生成描述文件，在将来需要的时候也可以进行数据还原。&lt;/div&gt;
&lt;div&gt;    这个设计还是挺成功的，时至今日这个系统还在工作。我手头有接近2T的光盘，也不可能不使用这个系统。不过这个系统设计的时候，我还没接触linux，因此系统在设计上有一点缺陷——他的内部结构直接照抄了windows的卷描述和文件描述数据结构[2]，这对于windows下的存储很方便。要拼装存储数据，我只需要memcpy[3]就可以了。但是这也导致linux下想读取这个数据就必须进行解析，然后对照windows文档（电脑诸神阿），将内容解析和转换。如果是今天，也许我会使用基于文本的格式，例如json，yaml，或者xml。文件大小会膨胀2-4倍，但是也只有2-4M而已。&lt;/div&gt;
&lt;div&gt;    但是我最近正在试图将数据拷贝回硬盘，并且废弃这个系统。为什么？我们再来看看刚刚计算的账单。目前光盘还在1元左右——除非你只打算保存几天的数据，否则廉价光盘的损坏率太高了。但是硬盘的价格却下降到了2T600元，合0.3元/G。有0.3元/G的可变数据存储，谁还会想要0.23元/G的光盘呢？更不提每次使用都需要启动volcpy，插入光盘，然后以7M/s的速度读取。硬盘的速度从50M/s提升到了接近100M/s，大约是光盘速度的10倍，而且还不用找到底是哪张光盘。&lt;/div&gt;
&lt;div&gt;    可写光盘存储已经死了，除非大容量固定数据的短期分发，例如软件发行，或者盗版电影，否则没人会用光盘。我在拷贝东西给别人的时候，都使用U盘——拿回来重新格式化过就不必担心中毒（windows用户不要学，没用的）。8G的usb存储只要80元，还可以重复使用。U盘还遇到了更加强劲的对手——云存储。1G网络空间基本不要钱。以现在我的带宽，我需要3小时填满，9分钟下载。主要麻烦还在于3小时缓慢的上传速度。如果上传和下载对称的话，我也没道理会使用8G80的U盘，而且花费不少时间去拿给别人。我只需要将1G数据（大概8部动漫），花费10分钟多点上传到我的云端存储，然后把地址和密码（如果需要保密的话）传给对方，让对方再用10分钟下载。我甚至不需要自己保存数据，只需要问云存储机构购买40G的空间和一定数额的带宽（这个应当比自己的硬盘便宜），然后直接使用就好，就像一块只有2.5M/s工作速度的本地磁盘一样。我可以在家里和公司使用一样的存储，把数据共享给别人，在不开启电脑的情况下下载。这简直是价廉物美的无敌方案。&lt;/div&gt;
&lt;div&gt;    但是这也是为什么我痛恨低上传网络的原因。&lt;/div&gt;
&lt;div&gt;    OK，我们说回来，未来的电脑是什么样子。本质上说，上面一个题外话（而且是相当长的题外话）正是说明这个问题的关键——软件技术受制于硬件体系的发展，在高速时代使用低速技术是不可能的。我们现在不会满足于使用光盘的廉价存储系统，也不会满足于只能传输文字的聊天系统。同样，当硬件快速发展的时候，我们更没道理满足于快速但不可变的程序。&lt;/div&gt;
&lt;div&gt;    在我大学的时候，那台老电脑（现在是老电脑了，当时可是新鲜货咧）是相当强劲的编译机，我也是个不错的程序员。经常有同学过来问一些程序问题。我一般会听一下大致问题，看看是否需要开机。如果需要，我坐下，打开vs6[4]（那还是盗版，不过当时我也是学生）和合适的项目，然后拉过一把椅子让同学坐下，然后扯一些题外话，讨论一下问题。大概15-20s后，vs6那个难看的界面打开了，插件也初始化完毕，lazy eval和swap[5]也完成了，我可以很自由的操作电脑了，才会和他说。不好意思久等了。一般人都会说，没关系，你这个相当快。我觉得他们不是在恭维。&lt;/div&gt;
&lt;div&gt;    今天，我已经不用vs了，不过很偶尔还是会用到。vs已经从6升级到了2008，更复杂，界面也更漂亮了，没有什么可比性。但是我们做一个不伤脑筋的计算。目前我的电脑是3.0GHz4核，8G内存，1T硬盘的货色。CPU的线性速度增长了4倍不到，速度已经不能更快了。但是相应的，核心多了4倍，所以计算能力大概增长了16倍。内存大了16倍，硬盘大了4倍，硬盘速度快了一倍。单从集成电路的角度说，这个很符合摩尔定律。不过四个摩尔周期花费了不止6年，而是9年。也许这和设备价格下降了不止一倍有一定关系。实际上今天的瓶颈已经更进一步的向磁盘转移了。如果硬盘速度也增加了4倍或者4倍以上，我大概猜测，vs6的打开速度也许只需要1-2s，编译速度也至少应当增加了10倍。&lt;/div&gt;
&lt;div&gt;    这种速度下，我当年做了很长时间的一些修改，使得计算速度可以增加30%的努力，顿时变得黯然失色。固然，这些修改今天依然有效，1-2s的时间会加速0.3s。但是这0.3s绝对不是我如此长久努力所期待的结果。如果这个事情重演，我们在10年后，反观今天一些能够让速度加速1倍的决定，会觉得无比的愚蠢。当时为什么我不决定使用一种简单的方法呢？虽然响应时间从0.3s变成了0.6s，但是易变性很好，对未来的兼容也很好，谁在乎0.3s呢？&lt;/div&gt;
&lt;div&gt;    原因在于，你不知道什么时候会发生什么事情。我刚刚说了，我们今天的瓶颈在于硬盘吞吐。那么你怎么知道什么时候这个问题会有突破性的新技术出现呢？也许是明天，也许是10年后。难道你先去做别的，10年后再继续你的程序员生涯？我们必须基于我们当前的硬件假定编程，然后再把这个假定放在时间面前评判。而这个假定当出现新的硬件技术体系的时候，就会变得无比愚蠢。&lt;/div&gt;
&lt;div&gt;    如果要我预期将来的计算机系统，我首先就会猜测他无比的快，而且小巧省电。足够快，代表我们不需要把code载入内存中再运行，而是可以直接从外存（或者外存缓存）中直接运行代码。或者直接从网络（或者网络缓存，下同）中直接运行。足够小巧省电，代表我们可以带着计算机到处走，就像今天我们带着手机一样。然后在工作地点，或者其他地方，把机器接入一个输入输出设备上。所以？我估计好多人已经在泪流满面了，是不是呢？做磁盘检测和恢复的孩子们？当然，不是说这个行业会消失。但是他会变成一个相当小众的行业。小众到如同TBBT的笑话一样——25个人已经是一个嘉年华了。专家会通吃所有人，而普通程序员则根本进不去。然后——Bang，硬件又升级了，专家瞬间变成了转家。&lt;/div&gt;
&lt;div&gt;    每个程序员，或多或少，都生存在硬件升级这只巨兽脚下。你一不小心猜错了他会抬起左脚还是右脚，就会直接化为尘埃。如果猜对了，没事，你只是比别人多生存了一会而已。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;1.两者都是将多块硬盘逻辑上变成一块硬盘的方案。&lt;/div&gt;
&lt;div&gt;2.描述结构指属性存储格式和顺序，例如卷描述结构就是光盘的大小，卷标等等数据和他们的顺序。&lt;/div&gt;
&lt;div&gt;3.指直接在内存中复制数据，不做任何其他操作。&lt;/div&gt;
&lt;div&gt;4.visual stdio，Microsoft公司上世纪出品的编程工具，一般用于C/C++语言。&lt;/div&gt;
&lt;div&gt;5.lazy eval指程序在加载一段时间后才会执行的一些工作。把这些工作分开有助于加快程序的启动速度，但是在操作时会感觉到速度变慢。swap也有类似效果。&lt;/div&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 05 Mar 2012 22:01:08 +0000</pubDate>
</item>
<item>
	<title>@zoomq: 由Lua 粘合的Nginx生态环境</title>
	<guid>http://blog.zoomquiet.org/pyblosxom/2012/03/06/openresty-intro-2012-03-06-01-13</guid>
	<link>http://blog.zoomquiet.org/pyblosxom/oss/openresty-intro-2012-03-06-01-13.html</link>
	<description>&lt;div class=&quot;header&quot; id=&quot;header&quot;&gt;
&lt;a name=&quot;toptopNDZLTENUR&quot; id=&quot;toptopNDZLTENUR&quot;&gt;&lt;/a&gt;&lt;h1&gt;由Lua 粘合的Nginx生态环境&lt;/h1&gt;
&lt;h2&gt;-- agentzh tech-club.org 演讲听录&lt;/h2&gt;
&lt;/div&gt;

&lt;div class=&quot;toc&quot; id=&quot;toc&quot;&gt;
  &lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toc1R0VYQ0JaT&quot;&gt;免责聲明&lt;/a&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toc2R0lYQ0FUR&quot;&gt;Lua 粘合的 Nginx 生态环境&lt;/a&gt;
    &lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toc3R0lYRENMU&quot;&gt;2.1. openresty&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toc4R0lYREVMU&quot;&gt;2.2. 配置小语言&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toc5R0lYREdMU&quot;&gt;2.3. ngx_drizzle&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toc6R0lYRElMU&quot;&gt;2.4. ngx_postgres&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toc7R0lYREtMU&quot;&gt;2.5. ngx_redis2&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toc8R0lYRE1MU&quot;&gt;2.6. ngx_srcache&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toc9R0lYRE9MU&quot;&gt;2.7. ngx_iconv&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toc10R0lYRFFMU&quot;&gt;2.8. 嵌入 Lua&lt;/a&gt;
      &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toc11R0lYRFFMU&quot;&gt;2.8.1. 同步形式异步执行!&lt;/a&gt;
      &lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toc12R0lYRFNMU&quot;&gt;2.9. lua_shared_dict&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toc13R0lYRENNQ&quot;&gt;2.10. Socket形式&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toc14R0lYRENNS&quot;&gt;2.11. concurrent ~ &quot;cosocket&quot;&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toc15R0lYRENNU&quot;&gt;2.12. 高层实现&lt;/a&gt;
    &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toc16R01YQ0FZT&quot;&gt;abt.&lt;/a&gt;
  &lt;/li&gt;
  &lt;/ol&gt;

&lt;/div&gt;
&lt;div class=&quot;body&quot; id=&quot;body&quot;&gt;
&lt;ul&gt;
&lt;li&gt;活动: &lt;a href=&quot;http://www.tech-club.org/?p=247&quot;&gt;Tech-Club技术沙龙（2012年2月）活动小结&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;幻灯: &lt;a href=&quot;http://agentzh.org/misc/slides/ngx-openresty-ecosystem/#1&quot;&gt;ngx_openresty: an Nginx ecosystem glued by Lua&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;录音: &lt;a href=&quot;http://vdisk.weibo.com/s/2Qcon&quot;&gt;http://vdisk.weibo.com/s/2Qcon&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;笔录: Zoom.Quiet &amp;lt;zoomquiet+&lt;a href=&quot;mailto:nginx@gmail.com&quot;&gt;nginx@gmail.com&lt;/a&gt;&amp;gt;
&lt;/li&gt;
&lt;li&gt;Chnangelog:
    &lt;ul&gt;
    &lt;li&gt;120312 fixed as s/hhttp/http/g ,thanx muxueqz
    &lt;/li&gt;
    &lt;li&gt;120309 fixed kindel-&amp;gt;kindle, thanx for milel liu;
    &lt;/li&gt;
    &lt;li&gt;120308 fixed ahcking-&amp;gt;hacking,thanx weakish
    &lt;/li&gt;
    &lt;li&gt;120306 fixed agentzh ID name,thanx himself alert
    &lt;/li&gt;
    &lt;li&gt;120305 finished
    &lt;/li&gt;
    &lt;li&gt;120301 init.
    &lt;p&gt;&lt;/p&gt;
很早就一直关注 agentzh 对 nginx 的给力 hacking,这次总算有个阶段性的说明,虽然无法现场交流,
好在有录音,为了其它没有时间听的人们,以及给搜索引擎更好的搜索数据,俺义务听录全文;
    &lt;/li&gt;
    &lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;a id=&quot;toc1R0VYQ0JaT&quot; name=&quot;toc1R0VYQ0JaT&quot;&gt;&lt;/a&gt;
&lt;h1&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toptopNDZLTENUR&quot;&gt; 1. 免责聲明 &lt;/a&gt;&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;录音/幻灯来自作者,版权当然属于他们
&lt;/li&gt;
&lt;li&gt;文字听录来自 Zoom.Quiet,一切文字问题都是我造成的,与原著无关
&lt;/li&gt;
&lt;li&gt;因为本人技术有限,仅通过幻灯和录音,记错的地方负责在我,与原著者无关
&lt;/li&gt;
&lt;li&gt;任何不满和意见,请直接与我联系以便改进
    &lt;ul&gt;
    &lt;li&gt;zoomquiet+&lt;a href=&quot;mailto:nginx@gmail.com&quot;&gt;nginx@gmail.com&lt;/a&gt;
    &lt;/li&gt;
    &lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;a id=&quot;toc2R0lYQ0FUR&quot; name=&quot;toc2R0lYQ0FUR&quot;&gt;&lt;/a&gt;
&lt;h1&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toptopNDZLTENUR&quot;&gt; 2. Lua 粘合的 Nginx 生态环境 &lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;
很高今天和大家进行分享,之前,在北京进行过相关的分享;
今天我们的話題是 Nginx 也可以說是关于 Lua 的;
介绍过去3年以来我们的工作,
工程名字是,openresty,可以追溯到2007年,那会儿,我刚刚进入 Yahoo! 中国,
第一份工作就是架构一个开放平台, Yahoo! 自个儿的开放平台,
系统作到后来逐渐偏离了初衷,
我们开始为大型的互联网公司作一些和web 前端打交道的系统支持;
&lt;/p&gt;
&lt;p&gt;
我在 Yahoo!和 TaoBao 分别工作了两年,就辞职了;
主要因为,我们的开源作品,越来越多人使用了,
而我一方面,要应付所謂业务需求,另方面要响应来自国内外积极开发者们的要求或是bug;
所以,干脆辞了专心作事儿;
本来,我想搬到厦门,可是我老婆在福州找到了工作,于是,,
现在,我不拿工资,义务为全球的愛好者开发 ;-)
现在,已经在福州呆了7个月,这是我老婆给拍的照片;
我习惯,先在纸上写好代码,然后输入电脑,
&lt;/p&gt;
&lt;p&gt;
前面放的是 kindle ;
这台 kindle 的来历比较有意思,
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在TaoBao 的时候,我打算将 openresty 重写,因为一开始是用 Perl 来写的
&lt;/li&gt;
&lt;li&gt;而在Yahoo! 的时候虽然已经使用 openresty 統一了搜索功能,但性能的确一般
&lt;/li&gt;
&lt;li&gt;当时,本想基于 Apache 来改写,不过一位师傅跟我讲:&quot;你就直接拿c 写吧,基于 Apache 写没有前途的!&quot;
&lt;/li&gt;
&lt;li&gt;俺很郁闷,就问,那怎么整? 师傅回答,你研究一下 nginx 的源代码吧,然后就没再理我
而看代码是很累的,所以,俺一到 TaoBao 就买了台 Kindel 来看代码...
&lt;/li&gt;
&lt;/ul&gt;

&lt;a id=&quot;toc3R0lYRENMU&quot; name=&quot;toc3R0lYRENMU&quot;&gt;&lt;/a&gt;
&lt;h2&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toptopNDZLTENUR&quot;&gt; 2.1. openresty &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
刚刚提过, openresty 在开发过程中逐偏离了原计划;
再面对后来,更加具体的公司业务后,
这时,已经可以看出所謂 Ajax/Servise 化了,
在我接触过的各种繁忙的互联网公司,都有种趋势,就是:
&lt;/p&gt;
&lt;pre&gt;
    对看起来是个整体的web 应用
    习惯在后台拆成很多 Service
    有些Service 是供給客户端发起請求来访问的,
    而有些Service 根本就是为其它服务而服务的,也使用了 http 协议进行发布
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;
这种结构,导致整体系统变得非常分散
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;由多个部门,分别实现一部分系統
&lt;/li&gt;
&lt;li&gt;而每个部门,暴露給其它部门的,都是 http 协议,resful 形式的接口而已
&lt;p&gt;&lt;/p&gt;
比如说, 去哪儿 网,就是非常非常松散的服务组合成的;
    &lt;ul&gt;
    &lt;li&gt;一个請求进入后,立即分解成各种請求分别进行
    &lt;/li&gt;
    &lt;li&gt;而有些就在 Service 之间进行了
    &lt;p&gt;&lt;/p&gt;
既然,http 协议如此常见,我们就需要强大的实现基础;
nginx 是我们调研的各种平台中,最不烂的一个!
     &lt;ul&gt;
     &lt;li&gt;其它真心都特别烂,,,
Apache 最大的问题是其 I/O 模型,无法完成非常高效的响应;
但是优点是:开发接口规整,基于它来写 mod 非常方便;
Lighttpd 正好相反,其 I/O 非常高效,但是开发接口不怎么友好;
而 Nginx 融合了两者的优点 ;-)
     &lt;p&gt;&lt;/p&gt;
&lt;code&gt;&amp;lt;&amp;lt;&amp;lt;      5:11&lt;/code&gt;
     &lt;p&gt;&lt;/p&gt;
     &lt;/li&gt;
     &lt;/ul&gt;
    &lt;/li&gt;
    &lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;一方面使用了 lighttpd 多路复用的 I/O 模型
&lt;/li&gt;
&lt;li&gt;另一方面以借鉴了 apache 的模块开发支持
&lt;p&gt;&lt;/p&gt;
在(openresty)开发过程中,经常有人问,为什么 nginx 如此之快?
&lt;/li&gt;
&lt;li&gt;我们知道 nginx 是单线程的,
&lt;/li&gt;
&lt;li&gt;而单线程的模型,为什么可以承担上万甚至上几十万的并发請求?!
因为 nginx 的工作方式,如动画所示,这是我刚刚用 perl 生成的一个简单 git 动画:
&lt;/li&gt;
&lt;li&gt;这其实是操作系统线程作的事儿
&lt;/li&gt;
&lt;li&gt;前面3个,分别对应不同的 http 请求
&lt;/li&gt;
&lt;li&gt;每个方块代表一个读或是写操作
&lt;/li&gt;
&lt;li&gt;最后的 epoll_wait 就是 linux 系統中最高效的一种事件接口
&lt;p&gt;&lt;/p&gt;
也就是説 nginx 内部其实是种事件驱动的机制
&lt;/li&gt;
&lt;li&gt;只有相关事件发生时,才处理具体数据
&lt;/li&gt;
&lt;li&gt;如果当前接口没有数据时,就会立即切换出去,处理其它请求
&lt;/li&gt;
&lt;li&gt;所以,虽然只有一个线程,但是,可以同时处理很多很多线程的請求处理
那么,这种形式的 web 系統,可以很轻易的将 cpu 跑满,即使带宽没有跑满的情况下;
而 apache 这类多进程多线程模型的服务器,则很难将 cpu 跑满:
    &lt;ul&gt;
    &lt;li&gt;因为并发达到一定量时
    &lt;/li&gt;
    &lt;li&gt;内存首先将耗尽
    &lt;/li&gt;
    &lt;li&gt;因为在 linux 系统中,线程数是有限的,每个线程必须预分配8m大小的栈,不论是否使用!
    &lt;/li&gt;
    &lt;li&gt;所以,线程增加时,内存首先成为瓶颈
    &lt;/li&gt;
    &lt;li&gt;即使挺过内存问题,当并发请求足够多时,cpu 争用线程的调度问题又成为系統瓶颈
    &lt;p&gt;&lt;/p&gt;
&amp;lt;&amp;lt;&amp;lt; 8:31
    &lt;p&gt;&lt;/p&gt;
所以,nginx 这样简单的单进单线模型,反而被 memcached 等高性能系统定为I/O 模型;
那么,我们作了什么呢?
    &lt;/li&gt;
    &lt;li&gt;主要是为 nginx 提供了很多补丁,进行了 bugfix
    &lt;/li&gt;
    &lt;li&gt;同时利用 nginx 提供的开发者接口,贡献了很多模块
    &lt;/li&gt;
    &lt;li&gt;我们还将之前提及的 Lua 嵌入 nginx ,使其具有全功能的交互能力
    &lt;/li&gt;
    &lt;li&gt;更加把 Lux 一些常用库,也放进去了
    &lt;/li&gt;
    &lt;li&gt;然后打成一个大包,命名为 openresty
...这是使用 Tiddlywiki 随便作的一个 主頁: &lt;a href=&quot;http://openresty.org&quot;&gt;http://openresty.org&lt;/a&gt;
    &lt;/li&gt;
    &lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;a id=&quot;toc4R0lYREVMU&quot; name=&quot;toc4R0lYREVMU&quot;&gt;&lt;/a&gt;
&lt;h2&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toptopNDZLTENUR&quot;&gt; 2.2. 配置小语言 &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
nginx 本身有个很重要的特点,这在维基百科的条目中也强調过:
&lt;/p&gt;
    &lt;ul&gt;
    &lt;li&gt;其配置文件记法是非常灵活,并可读的
    &lt;/li&gt;
    &lt;li&gt;nginx.conf 配置文件,本地其实就是个小語言
比如:
    &lt;p&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:  js&quot;&gt;

location = '/hello' {
       set_unescape_uri $person $arg_person;
       set_if_empty $person 'anonymous';
       echo &quot;hello, $person!&quot;;
   }
&lt;/pre&gt;
    &lt;p&gt;&lt;/p&gt;
这段配置,对于 apache 用户来説,也很熟悉
    &lt;/li&gt;
    &lt;li&gt;我们首先使用类似正则表达式的形式来约定一个响应的 url
    &lt;/li&gt;
    &lt;li&gt;然后,可以使用各种 nginx 的指令对内部变量进行到系列操作
    &lt;/li&gt;
    &lt;li&gt;变量也是配置文件的一部分,很象一种编程語言
    &lt;/li&gt;
    &lt;li&gt;比如,这里,我们就将 person 这个变量使用 arg_person 进行赋值
    &lt;/li&gt;
    &lt;li&gt;然后,用 'anonymous' 作为空值时的默认值给 $person
    &lt;/li&gt;
    &lt;li&gt;最后直接使用 echo 将結果输出
这样,我们就可以使用 curl 模拟浏览器访问,给 /hello 提供一个utf8 编码的字串值,
以 ?person= 的GET 方式变量,
就可以获得預期的反馈:  hello, 章亦春
不給参数的話,刚刚的 anonymouse 就起作用了;
    &lt;p&gt;&lt;/p&gt;
所以,整体上,我们期望在 nginx 中实现服务接口,就这样写点配置就好,不用写什么认真的c 代码;-)
而跑起来就象飞一样,因为,这么来写,实际和用c 现实没有什么区别;
    &lt;p&gt;&lt;/p&gt;
事实上,全世界的开发者都在使用 nginx 的开发接口,在拼命丰富这种配置文件小語言的词汇表!
    &lt;/li&gt;
    &lt;/ul&gt;

&lt;ul&gt;
&lt;li&gt;而真正决定其表达能力的是:&quot;vicabulary&quot;
&lt;/li&gt;
&lt;li&gt;比如说,我们看这个例子,这是我写向第2或是第3个nginx 模块:
  &lt;ul&gt;
  &lt;li&gt;用以直接访问 memcached 的所謂上游模块
  &lt;/li&gt;
  &lt;li&gt;nginx 有自个儿的一套术语,在其后的各种服务比如memcached ,在nginx 而言就是上游
  &lt;/li&gt;
  &lt;li&gt;对应的,那些访问 nginx 的浏览器等等客户端,就视为下游
  &lt;p&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:  js&quot;&gt;


# (not quite) REST interface to our memcached server
#  at 127.0.0.1:11211
location = /memc {
    set $memc_cmd $arg_cmd;
    set $memc_key $arg_key;
    set $memc_value $arg_val;
    set $memc_exptime $arg_exptime;
    memc_pass 127.0.0.1:11211;
    }
&lt;/pre&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;这样简单的配置一下,通过 set 将url 上的各种参数映射给几个变量,
  &lt;/li&gt;
  &lt;li&gt;然后通过 memc_pass 连接到远端一个memcached 服务,当然后面也可以是个集群
  &lt;/li&gt;
  &lt;li&gt;立即,我们就得到一个,应该說是种伪 restfule 的 memcached 的使用接口服务
  &lt;/li&gt;
  &lt;li&gt;我们可以使用 curl 来操作目标 memcached 了
  &lt;/li&gt;
  &lt;li&gt;比如说,著名的 flush_all 命令,就可以直接通过 url 来执行
  &lt;p&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;通过这种形式,我们可以快速扩展成对memcached 集群的简洁管理服务,进行各种操作
&lt;/li&gt;
&lt;li&gt;这样作的好处在于::
  &lt;ul&gt;
  &lt;li&gt;不論其它相关应用使用 php 什么乱七八糟的語言写的,都可以統一包装成 http 接口
  &lt;/li&gt;
  &lt;li&gt;令整个业务系统变成http 协议,这样系统的复杂度就能够有效降低
  &lt;/li&gt;
  &lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;同样可以这样对 MySQL 等等其它集群服务进行包装
&lt;/li&gt;
&lt;li&gt;包括大家知道的 taobao 集群,对外部开发来說,好象是专门为外部扩展发布的服务,
  &lt;ul&gt;
  &lt;li&gt;其实在 taobao 内部各种服务也是以两样形式組合起来的
  &lt;/li&gt;
  &lt;li&gt;大家知道 taobao 是java 系的,它很多服务是通过定制 jvm 完成的
  &lt;/li&gt;
  &lt;li&gt;所以,对于ali 原先业务,以及合作方的业务,还有我们数据统计部门的业务,对于jvm是无法直接使用的
  &lt;/li&gt;
  &lt;li&gt;怎么办?所以,通过开放平台业务,将各种内部服务,封装成一系列 http 接口方便使用
  &lt;/li&gt;
  &lt;li&gt;包括taobao 的登录,其实也封装成 http 接口,供给,taobao 子域名应用来使用
  &lt;/li&gt;
  &lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;不论使用什么开发語言,总是可以对http 协议进行访问的
  &lt;ul&gt;
  &lt;li&gt;而且 http 协议本身非常简单
  &lt;/li&gt;
  &lt;li&gt;我们可以方便的获取许多现成的工具进行调试/追踪/优化,,,
  &lt;/li&gt;
  &lt;li&gt;另外,由于选择了 nginx,这使得http 的开销,代价变的非常非常的低
  &lt;/li&gt;
  &lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;记得 去哪儿网,原先有业务使用了几十台 MySQL
  &lt;ul&gt;
  &lt;li&gt;前端使用 java 的jodb 进行连接
  &lt;/li&gt;
  &lt;li&gt;而因为代码写的比较糟糕,因为业务部门嘛,写的时候不会注意连接池的效率,
  &lt;/li&gt;
  &lt;li&gt;所以,每台主机的负载都非常 非常 高
  &lt;/li&gt;
  &lt;li&gt;而,我们后来改为nginx 作前端,結果一台nginx 就将以前几十台java 主机的业务抗了下来
  &lt;/li&gt;
  &lt;li&gt;通过封装成 http 接口,业务代码随便长连接/短连接,随便它搞,都撑得住了!
  &lt;/li&gt;
  &lt;li&gt;于是,被他们java 程序员描述成不可能的任务,被一台 nginx 主机就解决了
  &lt;p&gt;&lt;/p&gt;
&amp;lt;&amp;lt;&amp;lt; 17:00
(插入提问): 封装具体作了什么?为什么比原先的方式效率高? 虽然改成了 http 实际连接MySQL 时不同样要消耗?
  &lt;/li&gt;
  &lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;因为,封装成 http 接口的数据库,我们内部使用了连接池
&lt;/li&gt;
&lt;li&gt;已经优化的高效数据库连接池,而一般工程师不用关注连接池的技巧,专心完成业务代码就好,不容易出错
&lt;/li&gt;
&lt;li&gt;而且,使用语言专用中间件的话,牵涉到其它问题:
    &lt;ul&gt;
    &lt;li&gt;中间件本身是否稳定?高效率?
    &lt;/li&gt;
    &lt;li&gt;中间件本身是否易于扩展好维护?
    &lt;/li&gt;
    &lt;li&gt;等等一系列问题,远没有統一成 http 服务于所有語言实现的应用来的干脆简洁
    &lt;/li&gt;
    &lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;甚至于,我们后来引入了完整的 Lua 語言,它基本足够完备,可以支持我们直接完成业务
    &lt;ul&gt;
    &lt;li&gt;taobao 的数据魔方,就直接使用脚本在 nginx 中完成的
    &lt;/li&gt;
    &lt;li&gt;相比原先php的版本,仅仅这一项,就提高响应速度一个量級!
    &lt;/li&gt;
    &lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;所以,不论 memcached 还是什么数据库,我们可以統一到一个中间件
    &lt;ul&gt;
    &lt;li&gt;而且 http 协议的中间件,还有个好处是可以直接公开給外部使用
    &lt;/li&gt;
    &lt;li&gt;因为 http 上的访问控制很好作,复杂度也低
    &lt;/li&gt;
    &lt;li&gt;我们的量子統計,就是直接和taobao 主站服务通过 http 良好整合在了一起
    &lt;/li&gt;
    &lt;li&gt;可以简单的一个参数处理就发布給外部或是内部来安全使用
    &lt;/li&gt;
    &lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;a id=&quot;toc5R0lYREdMU&quot; name=&quot;toc5R0lYREdMU&quot;&gt;&lt;/a&gt;
&lt;h2&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toptopNDZLTENUR&quot;&gt; 2.3. ngx_drizzle &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
通过模块,我们可以建立应用和 MySQL 间的非阻塞通訊
&lt;/p&gt;
  &lt;ul&gt;
  &lt;li&gt;这点非常重要!
  &lt;/li&gt;
  &lt;li&gt;因为,当前端访问后端很大的数据集群的时候,其本身的并发能力就成为瓶颈
  &lt;/li&gt;
  &lt;li&gt;设想后端有近百台 MySQL 时,后台本身的并发量就已经非常大了
  &lt;/li&gt;
  &lt;li&gt;而前端类似 php 技术根本无法将后端所有主机的能力都应用起来
  &lt;/li&gt;
  &lt;li&gt;所以,我们非常需要非阻塞技术
  &lt;/li&gt;
  &lt;li&gt;需要一种数据库代理,就象很高能的网关一样,将后端所有MySQL 服务器的能力都激发出来
  &lt;/li&gt;
  &lt;li&gt;而不用期待前端应用来自行完成并发调度
基于以上认知,我们开发了各种数据的非阻塞上游模块:
    &lt;ul&gt;
    &lt;li&gt;包括对 MySQL/Postgres/redis 等等
    &lt;/li&gt;
    &lt;li&gt;也尝试过对 Oracole ,但是,其官方的 c 驱动有些限制,虽然也提供了非阻塞接口,但是不完整
    &lt;/li&gt;
    &lt;li&gt;在建立连接和銷毁连接时,只能以阻塞方式进行,所以,很纠结
    &lt;/li&gt;
    &lt;li&gt;MySQL 官方的 c 驱动也只提供了阻塞方式!
    &lt;/li&gt;
    &lt;li&gt;那只好寻求第三方的驱动,我们选择了 Drizzle 这个驱动,并整合进来
成为 ngx_drizzle 模块
    &lt;p&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:  js&quot;&gt;

upstream my_mysql_backend {
           drizzle_server 127.0.0.1:3306 dbname=test
                       password=some_pass user=monty
                       protocol=mysql;
           # a connection pool that can cache up to
           #   200 mysql TCP connections
           drizzle_keepalive max=200 overflow=reject;
       }
&lt;/pre&gt;
    &lt;p&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;/ul&gt;

&lt;ul&gt;
&lt;li&gt;我们这样简单配置:
    &lt;ul&gt;
    &lt;li&gt;通过 drizzle_server 配置连接口令和协议,因为模块可以连接 MySQL 和 drizzle 两种数据源,所以,要声明协议模式
    &lt;/li&gt;
    &lt;li&gt;使用 drizzle_keepalive 建立一个连接池,限定上限为200,当超过连接限制时就 reject,相当对数据库的简单保护
    &lt;/li&gt;
    &lt;li&gt;然后这样定义一个 cat 接口
    &lt;p&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:  js&quot;&gt;

location ~ '^/cat/(.*)' {
       set $name $1;
       set_quote_sql_str $quoted_name $name;
       drizzle_query &quot;select *
           from cats
           where name=$quoted_name&quot;;
       drizzle_pass my_mysql_backend;
       rds_json on;
   }
&lt;/pre&gt;
    &lt;p&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;cat 之后是这猫的名字,使用 set 获得,这是 nginx 本身的功能
    &lt;/li&gt;
    &lt;li&gt;然后使用 set_quote_sql_str 对查询语句进行转义,以防止SQL注入攻击
    &lt;/li&gt;
    &lt;li&gt;通过 drizzle_query 组合成查询語句
    &lt;/li&gt;
    &lt;li&gt;drizzle_pass 来完成对后端数据集群的查询,因为前面的 drizzle_server·可聲明一组 MySQL服务器
    &lt;/li&gt;
    &lt;li&gt;甚至于,我们为查询返回的結果集,定制了一种格式,叫 rds_json
      &lt;ul&gt;
      &lt;li&gt;这种格式是面向各种关系型数据库的
      &lt;/li&gt;
      &lt;li&gt;我们针对这种格式,开发了一系列过滤器可以自由输出 csd或是json格式
      &lt;/li&gt;
      &lt;li&gt;这样,几乎所有报表接口,都通过这种方式实现的
      &lt;/li&gt;
      &lt;li&gt;taobao 直通车就使用了 csd 格式,因为他们是将这当成中间件来使用的
      &lt;/li&gt;
      &lt;li&gt;而我们是直接通过 json 以 Ajax 形式对外的
      &lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;这样,通过 curl 访问 cat 接口查詢 Jerry ,就可以获得名叫Jerry 的猫的相关数据
    &lt;/li&gt;
    &lt;li&gt;这里json 的输出,可以通过一系列方式,进行自由的调整
    &lt;/li&gt;
    &lt;li&gt;比如说,有的要求每行数据都是 key/value 的格式,有的要求紧凑格式,第一行包含key之后,以后的全部是数据等等,,,
    &lt;/li&gt;
    &lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;a id=&quot;toc6R0lYRElMU&quot; name=&quot;toc6R0lYRElMU&quot;&gt;&lt;/a&gt;
&lt;h2&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toptopNDZLTENUR&quot;&gt; 2.4. ngx_postgres &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
那么 portsgres 访问接口模块名叫:ngx_postgres
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这是一位波兰的 hacker 在我们的ngx_drizzle 基础上完成的
&lt;/li&gt;
&lt;li&gt;因为它仿造了我们的接口形式
&lt;/li&gt;
&lt;li&gt;pg 的官方模块是无法使用的,于是他花了两个月的时间,完成了这个模块
&lt;/li&gt;
&lt;li&gt;去哪儿网,有很多地方就使用了这一模块
&lt;/li&gt;
&lt;li&gt;我们可以看到如何使用 Lua 来调用这个标准模块
因为在 web 开发中,每向上一层,速度会下降一级,但是,功能会丰富很多
&lt;/li&gt;
&lt;li&gt;但是,使用 nginx 模块来完成,速度损失很有限
&lt;p&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:  js&quot;&gt;

upstream my_pg_backend {
       postgres_server 10.62.136.3:5432 dbname=test
               user=someone password=123456;
       postgres_keepalive max=50 mode=single overflow=ignore;
   }
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
    &lt;ul&gt;
    &lt;li&gt;这里,我们配置 overflow 时 ignore ,忽略,就是説,连接超过限定时,直接进入短连接模式
&lt;pre class=&quot;brush:  js&quot;&gt;

location ~ '^/cat/(.*)' {
       set $name $1;
       set_quote_pgsql_str $quoted_name $name;
       postgres_query &quot;select *
           from cats
           where name=$quoted_name&quot;;
       postgres_pass my_pg_backend;
       rds_json on;
   }
&lt;/pre&gt;
    &lt;p&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;这样定义一个 pg 版本的 cat 接口
    &lt;/li&gt;
    &lt;li&gt;注意,进行SQL 转义时问的是 set_quote_pgsql_str, 因为pg 的SQL转义和其它的不同
    &lt;/li&gt;
    &lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;a id=&quot;toc7R0lYREtMU&quot; name=&quot;toc7R0lYREtMU&quot;&gt;&lt;/a&gt;
&lt;h2&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toptopNDZLTENUR&quot;&gt; 2.5. ngx_redis2 &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
然后,去年的时候,我为了好玩,写了个 redis 的模块: ngx_redis2
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;依然是100%非阻塞,去哪儿和天涯也都大量使用了这一模块
&lt;p&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:  js&quot;&gt;

upstream my_redis_node {
       server 127.0.0.1:6379;
       keepalive 1024 single;
   }
&lt;/pre&gt;
    &lt;ul&gt;
    &lt;li&gt;同样使用 upstream 定义一个或是多个连接池
    &lt;/li&gt;
    &lt;li&gt;使用 keepalive 定义并发策略,这种场景中 tcp 在 http 的连接消耗是非常低的
    &lt;p&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:  js&quot;&gt;

# multiple pipelined queries
   location /foo {
       set $value 'first';
       redis2_query set one $value;
       redis2_query get one;
       redis2_pass my_redis_node;
   }
&lt;/pre&gt;
    &lt;/li&gt;
    &lt;li&gt;这里,我使用 redis2_query 定义了两个请求
    &lt;/li&gt;
    &lt;li&gt;通过流水线形式,一次請求发送了两个命令过去,响应时,就有两个响应,按照顺序返回
    &lt;/li&gt;
    &lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;a id=&quot;toc8R0lYRE1MU&quot; name=&quot;toc8R0lYRE1MU&quot;&gt;&lt;/a&gt;
&lt;h2&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toptopNDZLTENUR&quot;&gt; 2.6. ngx_srcache &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
ngx_srcache 是个很有趣的通用缓存模块
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;之前为 apache 写过一些模块,其中一个比较有趣的,就是针对mod_cache 模块,写了个 memcached 的模块,就可以通过 memcached 对apache 中任意的响应进行缓存!
&lt;/li&gt;
&lt;li&gt;这模块当初是为 Yahoo! 的搜索业务中,爬虫的抽取系統进行設計的
&lt;/li&gt;
&lt;li&gt;当然我就发现,apache 里对 memcached 进行阻塞访问时,有点虚焦? 随着并发数增加,响应速度极速下降
&lt;/li&gt;
&lt;li&gt;所以,在nginx 时,就不会有这种问题,保证所有处理都是非阻塞的!包括访问 memcached
&lt;/li&gt;
&lt;li&gt;所以,我们可以在配置文件中自行决定使用什么后端来存储缓存
&lt;p&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:  js&quot;&gt;

location /api {
       set $key &quot;$uri?$args&quot;;
       srcache_fetch GET /memc key=$key;
       srcache_store PUT /memc key=$key&amp;amp;exptime=3600;
       # proxy_pass/drizzle_pass/postgres_pass/etc
   }
&lt;/pre&gt;
    &lt;ul&gt;
    &lt;li&gt;这里我们定义两种调用,所謂 fetch 是在 apache 中一种模板,c級别的调用但是,技法和 http 的 get 一樣
    &lt;/li&gt;
    &lt;li&gt;这样声明的 location,我们可以同时即对外提供调用,也可以对配置内部其它 location 进行调用!
&lt;pre class=&quot;brush:  js&quot;&gt;

 location /memc {
       internal;
       set_unescape_uri $memc_key $arg_key;
       set $memc_exptime $arg_exptime;
       set_hashed_upstream $backend my_memc_cluster $memc_key;
       memc_pass $backend;
   }
&lt;/pre&gt;
    &lt;/li&gt;
    &lt;li&gt;这样,其实就是在收到請求时,实际调用了 /memc 接口,访问后端缓存
    &lt;/li&gt;
    &lt;li&gt;收到結果后,再使用 srcache_store 接口整理put 回请求的入口 location, 設置相应的格式
    &lt;/li&gt;
    &lt;li&gt;而 /memc 接口通过 internal 标记,成为仅仅对内服务的接口
    &lt;/li&gt;
    &lt;li&gt;后面我们通过一系列指令,从 url 参数 ;-)
      &lt;ul&gt;
      &lt;li&gt;即使是内部调用,依然是个标准的 http 請求界面
      &lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;然后使用 set_hashed_upstream 对 memcached 的集群.进行基于鍵的模的 hash 将結果放到 $backend
    &lt;/li&gt;
    &lt;li&gt;最后使用 memc_pass 完成对集群的查询
    &lt;/li&gt;
    &lt;li&gt;这里的 my_memc_cluster 是怎么定义的呢?
    &lt;p&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:  js&quot;&gt;

upstream memc1 {
       server 10.32.126.3:11211;
   }
   upstream memc2 {
       server 10.32.126.4:11211;
   }
   upstream_list my_memc_cluster memc1 memc2;
&lt;/pre&gt;
    &lt;/li&gt;
    &lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;使用 upstream 定义两个服务,使用upstream_list 声明为一个集群
&lt;/li&gt;
&lt;li&gt;这里其实也有限制的:
    &lt;ul&gt;
    &lt;li&gt;在我们动态追加主机时
    &lt;/li&gt;
    &lt;li&gt;我们要重新生成配置文件,然后使用 touch 命令通知 nginx 重新加载
    &lt;/li&gt;
    &lt;li&gt;而这一限制,我们将看到,在基于 Lua 的实现中会不存在  ;-)
    &lt;p&gt;&lt;/p&gt;
前面我们看到,经过简单的配置,我们就可以获得一系列强大的 api 服务;
    &lt;p&gt;&lt;/p&gt;
&lt;code&gt;&amp;lt;&amp;lt;&amp;lt; 29:51&lt;/code&gt;
    &lt;/li&gt;
    &lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;a id=&quot;toc9R0lYRE9MU&quot; name=&quot;toc9R0lYRE9MU&quot;&gt;&lt;/a&gt;
&lt;h2&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toptopNDZLTENUR&quot;&gt; 2.7. ngx_iconv &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
实际使用中,还有一个重要的需求就是字符串编码:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;因为,有的业务是基于 gbk的,有的又是 utf-8 的
&lt;/li&gt;
&lt;li&gt;一般我们可以在数据库层面进行处理
&lt;/li&gt;
&lt;li&gt;但是,对于一些功能弱些的产品,比如说,memcache/redis 等,就没办法了
&lt;/li&gt;
&lt;li&gt;所以,我们完成了自己的动态编码转换模块:
&lt;pre&gt;
ngx_iconv
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;不管大家在访问 MySQL 时,使用的什么途径,比如习惯的反向代理什么的
&lt;/li&gt;
&lt;li&gt;都可以通过 iconv_filter 对响应体进行编码转换!
&lt;/li&gt;
&lt;li&gt;而且是流式的转换,也就是說,不需要 buffer,来一点数据就立即完成转换
&lt;p&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:  js&quot;&gt;

location /api {
       # drizzle_pass/postgres_pass/etc
       iconv_filter from=UTF-8 to=GBK;
   }
&lt;/pre&gt;
    &lt;ul&gt;
    &lt;li&gt;以上这是从 utf-8 到 gbk 的转换
    &lt;p&gt;&lt;/p&gt;
&lt;code&gt;&amp;lt;&amp;lt;&amp;lt; 30:54&lt;/code&gt;
    &lt;/li&gt;
    &lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;a id=&quot;toc10R0lYRFFMU&quot; name=&quot;toc10R0lYRFFMU&quot;&gt;&lt;/a&gt;
&lt;h2&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toptopNDZLTENUR&quot;&gt; 2.8. 嵌入 Lua &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
后面我们化了很大力气将 Lua 嵌入到了裏面:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这样使得,可以实现任意复杂的业务了
&lt;p&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:  js&quot;&gt;

# nginx.conf
   location = /hello {
       content_by_lua '
           ngx.say(&quot;Hello World&quot;)
       ';
   }
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
    &lt;ul&gt;
    &lt;li&gt;这样我们就完成了一个 hallo world
    &lt;/li&gt;
    &lt;li&gt;ngx.say 是 lua 显露給模块的接口
    &lt;/li&gt;
    &lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;另外当然也可以调用外部脚本
&lt;/li&gt;
&lt;li&gt;如同我们写php 应用时,习惯将业务脚本单独组织在 .php 文件中一样
&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;brush:  js&quot;&gt;

# nginx.conf
   location = /hello {
       content_by_lua_file conf/hello.lua;
   }
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;通过 content_by_lua_file 调用外部文件:
&lt;p&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:  sql&quot;&gt;

-- hello.lua
   ngx.say(&quot;Hello World&quot;)
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;这里的脚本可以任意复杂,也可以使用Lua 自己的库
&lt;p&gt;&lt;/p&gt;
早先,我们非常依赖,ngninx 的子请求,来复用 nginx 的请求模块:
&lt;/li&gt;
&lt;li&gt;比如说,我们一个模块,需要同时访问 memcached/mysql/pg 等許多后端
&lt;/li&gt;
&lt;li&gt;这时,怎么办? 这么来:
&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;brush:  js&quot;&gt;

location = /memc {
       internal;
       memc_pass ...;
   }
   location = /api {
       content_by_lua '
           local resp = ngx.location.capture(&quot;/memc&quot;)
           if resp.status ~= 200 then
               ngx.exit(500)
           end
           ngx.say(resp.body)
       ';
   }
&lt;/pre&gt;
    &lt;ul&gt;
    &lt;li&gt;先在 /memc 中建立到 memcache 的连接,并声明为内部接口
    &lt;/li&gt;
    &lt;li&gt;然后,在 /api 中使用 ngx.location.capture 发起一个 location 請求
    &lt;/li&gt;
    &lt;li&gt;就象发起一个正当的 http 请求一样,请求它,但是,其实没有http的开销,因为,这是c 级别的内部调用!
    &lt;/li&gt;
    &lt;li&gt;而且是个异步调用,虽然我们是以同步的方式来写的
    &lt;/li&gt;
    &lt;li&gt;然后我们可以检验响应是否 200,否则访问 500
    &lt;/li&gt;
    &lt;li&gt;最后就可以将响应体输出出来
    &lt;/li&gt;
    &lt;/ul&gt;

&lt;a id=&quot;toc11R0lYRFFMU&quot; name=&quot;toc11R0lYRFFMU&quot;&gt;&lt;/a&gt;
&lt;h3&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toptopNDZLTENUR&quot;&gt; 2.8.1. 同步形式异步执行! &lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;
这里为什么可以同步的写?
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;写过 javascript 前端程序的朋友,应该知道要实现异步效果,我们很多时候,要使用回调
&lt;/li&gt;
&lt;li&gt;而在 Lua 中我们可以这么来,因为 Lua 支持协程,即,concurrent
&lt;/li&gt;
&lt;li&gt;这样,我们可以在一个 Lua 线程中分割出多个Lua 用户级的逻辑线程
&lt;/li&gt;
&lt;li&gt;这种伪线程,可以实现比操作系统高的多的多的并发能力,因为系统开销非常的小
&lt;/li&gt;
&lt;li&gt;近年有一些技术,也都支持了 concurrent 的技术,可以象http 请求顺序一样,顺着写
&lt;/li&gt;
&lt;li&gt;不用象js 程序员那些纠结倒着写,在需要顺序操作时,又必须借重一些技法,而应用技法的代码,又实在难看,无法习惯
&lt;p&gt;&lt;/p&gt;
所以,我们当初选择 Lua 一个很重要的原因就是支持 协程
&lt;/li&gt;
&lt;li&gt;这里我们假定,同时要访问多个数据源
&lt;/li&gt;
&lt;li&gt;而且,查询是没有依赖关系的,那我们就可以同时发出请求
&lt;/li&gt;
&lt;li&gt;这样我总的延时, 是我所有请求中最慢的一个所用时间,而不是原先的所有请求用时的叠加!
&lt;/li&gt;
&lt;li&gt;这种方式,就是用并发换取了响应时间
&lt;p&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:  js&quot;&gt;

location = /api {
       content_by_lua '
           local res1, res2, res3 =
               ngx.location.capture_multi{
                   {&quot;/memc&quot;}, {&quot;/mysql&quot;}, {&quot;/postgres&quot;}
               }
           ngx.say(res1.body, res2.body, res3.body)
       ';
   }
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
    &lt;ul&gt;
    &lt;li&gt;这里我们就同时发出了3个请求
    &lt;/li&gt;
    &lt;li&gt;同时到 memcached/mysql/pg
    &lt;/li&gt;
    &lt;li&gt;然后全新响应后,将結果放到 res1/2/3 三个变量中返回
所以,这种模型里,实现并发访问也是很方便的 ;-)
    &lt;p&gt;&lt;/p&gt;
&lt;code&gt;&amp;lt;&amp;lt;&amp;lt; 35:20&lt;/code&gt;
    &lt;/li&gt;
    &lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;a id=&quot;toc12R0lYRFNMU&quot; name=&quot;toc12R0lYRFNMU&quot;&gt;&lt;/a&gt;
&lt;h2&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toptopNDZLTENUR&quot;&gt; 2.9. lua_shared_dict &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
这是我去年,花力气完成的 nginx 共享内存字典模块: lua_shared_dict
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;因为 nginx 是多 worker 模型,可以有多个进程
&lt;/li&gt;
&lt;li&gt;但是,其实 workder 数量和并发无关,这不同于 apache
&lt;/li&gt;
&lt;li&gt;nginx 多worker 的目的是将 cpu 跑满,因为它是单进程的嘛
&lt;/li&gt;
&lt;li&gt;nginx 实际只跑了操作系统的一个线程,所以,多核主机中,如果有8核心,我们一般就起8个 worker 的
&lt;/li&gt;
&lt;li&gt;如果业务有硬盘 I/O 的操作时,我们一般会起比核数略多的 worker 数
    &lt;ul&gt;
    &lt;li&gt;因为在 linux 中,磁盘很难有非阻塞的操作
    &lt;/li&gt;
    &lt;li&gt;虽然有什么 aio 的模型,但是有很多其它问题
    &lt;/li&gt;
    &lt;li&gt;所以,本质上 nginx 多 worker 是为了跑满 cpu
    &lt;/li&gt;
    &lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;那么,一但多进程了,就存在满满的共存问题
    &lt;ul&gt;
    &lt;li&gt;比如説,我们想在多个进程间共存配置/业务数据
    &lt;/li&gt;
    &lt;li&gt;所以,基于共存内存来作
    &lt;p&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:  js&quot;&gt;

lua_shared_dict dogs 10m;
   server {
       location = /set {
           content_by_lua '
               local dogs = ngx.shared.dogs
               dogs:set(&quot;Tom&quot;, ngx.var.arg_n)
               ngx.say(&quot;OK&quot;)
           '
       }
       location = /get {
           content_by_lua '
               local dogs = ngx.shared.dogs
               ngx.say(&quot;Tom: &quot;, dogs.get(&quot;Tom&quot;))
           ';
       }
&lt;/pre&gt;
    &lt;p&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;这有个例子:
    &lt;ul&gt;
    &lt;li&gt;首先,使用 lua_shared_dict 分配一 10M 的空间
    &lt;/li&gt;
    &lt;li&gt;然后,使用 OOP 方式,来定义两个接口:一个 /set 一个/get
    &lt;/li&gt;
    &lt;li&gt;然后,不论哪个 worker 具体调用哪个操作
    &lt;/li&gt;
    &lt;li&gt;但是結果,是終保存一致的
    &lt;/li&gt;
    &lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;使用 curl 先set 一下,再 get 就变成了 59,因为内部进行了自增
    &lt;ul&gt;
    &lt;li&gt;共存的实现是通过紅黑树+自旋鎖来达成的:
        &lt;ul&gt;
        &lt;li&gt;紅黑树的查找类似 hash 表查找的一种算法
        &lt;/li&gt;
        &lt;li&gt;为保持读写的数据一致性,使用 自旋鎖来保证
        &lt;/li&gt;
        &lt;li&gt;所以,当并发增大或是更新量增大时, 自旋鎖可能有问题,未来我们准备进一步修改成报灰的模型
        &lt;/li&gt;
        &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;其实,共享内存的方式,在鎖开销非常小时,效率是非常高的,在腾讯单机并发跑到20万都是小意思;
    &lt;p&gt;&lt;/p&gt;
另外,在 Lua 中,我们需要对大数据量的一种非缓存的输出:
    &lt;/li&gt;
    &lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;因为,在很多 web 框架中或多或少都有缓存,有的甚至使用了全缓存
&lt;/li&gt;
&lt;li&gt;那么,当你输出体积很大的数据时,就很易囧掉
&lt;/li&gt;
&lt;li&gt;而,在 Lua 中,我们就很容易控制这点
&lt;p&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:  sql&quot;&gt;

-- api.lua
-- asynchronous emit data as a response body part
ngx.say(&quot;big data chunk&quot;)
-- won`t return until all the data flushed out
ngx.flush(true)
-- ditto
ngx.say(&quot;another big data chunk&quot;)
ngx.flush(true)
&lt;/pre&gt;
    &lt;ul&gt;
    &lt;li&gt;比如,这里我们先 ngx.say ,异步的输出一个数据
    &lt;/li&gt;
    &lt;li&gt;这段数据不一定刷得出去,如果网卡没来得及输出这投数据的话,这会在 nginx 的进程中缓存
    &lt;/li&gt;
    &lt;li&gt;如果,我想等待数据输出后,再继续,就使用 ngx.flush ,这时,只有数据真正刷到系统的缓冲区后,才返回
    &lt;/li&gt;
    &lt;li&gt;这样保证我们 nginx 的缓存是非低的,然后我们再处理下一个数据段
    &lt;/li&gt;
    &lt;li&gt;如此就实现了流式的大数据输出
    &lt;p&gt;&lt;/p&gt;
这样,有时网络很慢,而数据量又大,最好的方式就是:
    &lt;/li&gt;
    &lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;既然你发的慢,那我也收的慢: 你一点点发,我就一点点收
&lt;/li&gt;
&lt;li&gt;这样我们就可以使用很少的资源,来支持很多大数据量的慢连接用户
&lt;/li&gt;
&lt;/ul&gt;

&lt;a id=&quot;toc13R0lYRENNQ&quot; name=&quot;toc13R0lYRENNQ&quot;&gt;&lt;/a&gt;
&lt;h2&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toptopNDZLTENUR&quot;&gt; 2.10. Socket形式 &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
然而,还有些慢连接就是恶意攻击:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;我可以生成很多 http 连接,接进来后,慢的发送,甚至就不发送,来拖死你的应用
&lt;/li&gt;
&lt;li&gt;这种情况中,你一不注意,服务分配给太多資源的话,整个系统就很容易被拖垮
所以,去年年底,今年年初,我下决心,完成了一个 同步非阻塞的 socket 接口:
&lt;p&gt;&lt;/p&gt;
&amp;lt;&amp;lt;&amp;lt; 40:50
&lt;p&gt;&lt;/p&gt;
这样,我就不用通过 nginx 的上游模块来访问http 请求:
&lt;/li&gt;
&lt;li&gt;我们就可以让 Lua 直接通过 http,或是 unix  socket 协议,访问任意后端服务
&lt;p&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:  rb&quot;&gt;

local sock = ngx.socket.tcp()
sock:settimeout(1000)   -- one second
local ok, err = sock:connect(&quot;127.0.0.1&quot;, 11211)
if not ok then
   ngx.say(&quot;failed to connect: &quot;, err)
   return
end
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;象这样,建立 socket 端口,并可以设定超时
&lt;/li&gt;
&lt;li&gt;我们就可以进行非阻塞的访问控制,当超时时,nginx 就可以自动挂起,切入其它协程进行处理
&lt;/li&gt;
&lt;li&gt;如果所有连接都不活跃,我也可以等待系统的 epoll 调用了
就不用傻傻的完全呆在那儿了
&lt;p&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:  rb&quot;&gt;

   local bytes, err = sock:send(&quot;flush_all\r\n&quot;)
   if not bytes then
       ngx.say(&quot;failed to send query: &quot;, err)
       return
   end

   local line, err = sock:receive()
   if not line then
       ngx.say(&quot;failed to receive a line: &quot;, err)
       return
   end

   ngx.say(&quot;result: &quot;, line)
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;或是使用 sock:send 直接返回,就可以继续其它请求了
&lt;/li&gt;
&lt;li&gt;使用 receive 来接收查询的返回,读失败有失败处理,成功就打印出来
一切都是自然顺序
&lt;p&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:  rb&quot;&gt;

   local ok, err = sock:setkeepalive(60000, 500)
   if not ok then
       ngx.say(&quot;failed to put the connection into pool &quot;
           .. &quot;with pool capacity 500 &quot;
           .. &quot;and maximal idle time 60 sec&quot;)
       return
   end
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;这是连接池的调用
&lt;/li&gt;
&lt;li&gt;通过 sock:setkeepalive , Lua 模块,就会将当前连接,放入另一连接池中以供其它請求复用
&lt;/li&gt;
&lt;li&gt;也就是說,如果其它請求,請求到同一个url 时, nginx 会直接交給它原先的连接,而省去了开新连接的消耗
&lt;/li&gt;
&lt;li&gt;keepalive 的参数比较少:
   &lt;ul&gt;
   &lt;li&gt;头一个是,最大空闲时间,即,一个连接放在连接池里没有任何人来使用的最大时间
     &lt;ul&gt;
     &lt;li&gt;这里是60秒,因为维持一连接的代价还是很昂贵的,如果一分钟了也没有人来用,我就主动关闭你节省资源
     &lt;/li&gt;
     &lt;li&gt;对于负载比较大的应用,这样可以减少浪费
     &lt;/li&gt;
     &lt;/ul&gt;
   &lt;/li&gt;
   &lt;li&gt;第二个参数是,最大连接数,
     &lt;ul&gt;
     &lt;li&gt;这里是500,如果连接数超过限制,就自动进入转移连接的模式
     &lt;p&gt;&lt;/p&gt;
Unix 域套接字 是 Linux/Unix 系统独特的进程接口
     &lt;/li&gt;
     &lt;/ul&gt;
   &lt;/li&gt;
   &lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;虽然不走 http 协议,但是调用形式和 tcp 的 socket 完全类似
&lt;p&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:  rb&quot;&gt;

   local sock = ngx.socket.tcp()
   local ok, err = sock:connect(&quot;/tmp/some.sock&quot;)
   if not ok then
       ngx.say(&quot;failed to connect to /tmp/some.sock: &quot;, err)
       return
   end
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;一樣通过 ngx.socket.tcp 来建立连接
&lt;/li&gt;
&lt;li&gt;然后,使用 sock:connect 来指定一个特殊文件,接入套接字
&lt;/li&gt;
&lt;li&gt;就可以进行各种日常的操作了
&lt;/li&gt;
&lt;/ul&gt;

&lt;a id=&quot;toc14R0lYRENNS&quot; name=&quot;toc14R0lYRENNS&quot;&gt;&lt;/a&gt;
&lt;h2&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toptopNDZLTENUR&quot;&gt; 2.11. concurrent ~ &quot;cosocket&quot; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
这个模块是基于 concurrent 的:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;写是顺序写,但是执行是非阻塞的!
这点非常重要!
&lt;/li&gt;
&lt;li&gt;协程技术诞生也有些年头了,
&lt;/li&gt;
&lt;li&gt;但是,至今 99.9% 的 web 应用依然是阻塞式的
&lt;/li&gt;
&lt;li&gt;因为早年,基于阻塞的应用开发太习惯了
&lt;/li&gt;
&lt;li&gt;而基于异步的开发,对于工程师的思維能力要求太高,这也是为什么 node.js 工程师在开发时的主要痛苦
&lt;/li&gt;
&lt;li&gt;因为,要求改变思維方式来考虑问题,我们的程序员多是 php 的,要求他们改变思维是很痛苦的
&lt;p&gt;&lt;/p&gt;
所以,不仅仅是为了推广我们的平台
&lt;/li&gt;
&lt;li&gt;更是为了兼容工程师的阻塞式思維,同时又可以利用协程来提高系统性能,达到单机上万的响应能力
&lt;/li&gt;
&lt;li&gt;我们引入了 Lua 的协程,并称之为:
&quot;cosocket&quot;
&lt;/li&gt;
&lt;li&gt;即,concurrent based socket
&lt;/li&gt;
&lt;li&gt;而一位资深的 python 粉丝告诉我,python也有优秀的协程库:
    &lt;ul&gt;
    &lt;li&gt;是基于 greenlet 的 Gevent
    &lt;/li&gt;
    &lt;li&gt;当然,类似我们的系統,都是可以支撑非常高并发的响应
    &lt;p&gt;&lt;/p&gt;
但是,我们当初选择 Lua 还有个很重要的原因是:
    &lt;/li&gt;
    &lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;cpu 的执行效率
&lt;/li&gt;
&lt;li&gt;当你的并发模式,已经是极致的时候
&lt;/li&gt;
&lt;li&gt;cpu 很容易成为瓶颈!
&lt;p&gt;&lt;/p&gt;
一般情况下是 带宽首先不够了,然后 cpu 被跑满
&lt;/li&gt;
&lt;li&gt;而在 apache 模型中,反而是内存首先不足
&lt;/li&gt;
&lt;li&gt;经常是24个进程,swap 8G/24G 不断的增长,卡住什么也玩不了了
&lt;/li&gt;
&lt;li&gt;而cpu 光在那儿进行上下文切换,没有作什么有意义的事儿
即,所謂内耗
&lt;p&gt;&lt;/p&gt;
当我们将应用从 I/O 模型解放后,拼的都是 CPU:
&lt;/li&gt;
&lt;li&gt;因为,内存一般消耗都不太大
&lt;/li&gt;
&lt;li&gt;我们经常在 256M 内存的虚拟机,或是64M 内存的嵌入式设备中跑生产服务
内存,真心不应该是问题所在,,,
&lt;p&gt;&lt;/p&gt;
但是,要进行計算时就一定要快!
&lt;/li&gt;
&lt;li&gt;而 Lua 近年发展编译器到什么地步?
&lt;/li&gt;
&lt;li&gt;有种编译器,可以运行时动态生成机器码
&lt;/li&gt;
&lt;li&gt;在我们的测试中,高过了末启用优化的 gpc
&lt;/li&gt;
&lt;li&gt;而启用优化的 gpc ,消耗资源又高过 Lua
&lt;p&gt;&lt;/p&gt;
所以, Lua 的性能没有问题
&lt;/li&gt;
&lt;li&gt;然后我们实际,按照 ruby 社区的説法,就是直接基于Lua 扩展出了一种专用小語言
&lt;/li&gt;
&lt;li&gt;业务团队实际并没有直接使用 Lua 来写,而是使用我们为业务专门定制的一种专用脚本(DSL)
&lt;/li&gt;
&lt;li&gt;所以,代码量非常的少
而且,我们的定制小語言,是强类型的:
&lt;/li&gt;
&lt;li&gt;强类型語言有很多好处
&lt;/li&gt;
&lt;li&gt;而且,可以在小語言中,定义对业务領域的高层次約束
&lt;/li&gt;
&lt;li&gt;你就可以很方便的查找出业务工程师常范的错误,转化成語言特性包含到约束中,在编译器中实现!
&lt;/li&gt;
&lt;li&gt;最后编译成包含优化的 Lua 代码,让它跑的象飞一样!
而且! 哪天,我高兴了,也可以让它生成 C 代码让它跑到极致!
&lt;/li&gt;
&lt;li&gt;这样,业务不用改一行代码,但是,系统效能可以提高几倍
&lt;/li&gt;
&lt;li&gt;等等,这些都是可以实现的,,,
&lt;p&gt;&lt;/p&gt;
要,实现这些,要求我们的基础必须非常非常的高效,同时又非常非常小巧!
&lt;/li&gt;
&lt;li&gt;这样我们才能在上面搭上层建筑
&lt;/li&gt;
&lt;li&gt;即,所謂的: &lt;b&gt;&quot;勿在浮沙筑高台&quot;!&lt;/b&gt;
&lt;/li&gt;
&lt;li&gt;在这一过程中,我们也吃过很多苦,,,好在有 nginx ...
&lt;p&gt;&lt;/p&gt;
再有,我们发现 socket 模型,一样可以用来读取下游,即客户端请求数据!
&lt;/li&gt;
&lt;li&gt;当请求体很大,比如说,上传一个很大的文件时
&lt;/li&gt;
&lt;li&gt;也需要异步处理 ,就省的我操心了
&lt;/li&gt;
&lt;li&gt;所以,我就对下游請求,包装了一个只读的 socket,可以对請求数据进行流式读取
&lt;p&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:  rb&quot;&gt;

   local sock, err = ngx.req.socket()
   if not sock then
       ngx.say(&quot;failed to get request socket: &quot;, err)
       return
   end
   sock:settimeout(10000)  -- 10 sec timeout

   while true do
       local chunk, err = sock:receive(4096)
       if not chunk then
           if err == &quot;closed&quot; then
               break
           end
           ngx.say(&quot;faile to read: &quot;, err)
           return
       end
       process_chunk(chunk)
   end
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;这样,建立一个下游 socket 后,以 4096 字节为一个块(trunk)进行读取
&lt;/li&gt;
&lt;li&gt;然后检查是否结束,即使没有结束,我也可以一块块的进行处理
&lt;/li&gt;
&lt;li&gt;比如,读一块就写到硬盘上,或是写到远程的一个 tcp 连接,这连接也是非阻塞的!
&lt;/li&gt;
&lt;li&gt;象这样,我这层就非常非常高效!
&lt;/li&gt;
&lt;/ul&gt;

&lt;a id=&quot;toc15R0lYRENNU&quot; name=&quot;toc15R0lYRENNU&quot;&gt;&lt;/a&gt;
&lt;h2&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toptopNDZLTENUR&quot;&gt; 2.12. 高层实现 &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
进行各种高层次的实现就非常方便了
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;以前我用几年时间才能实现纯 Lua 的 MySQL 的连接模块
&lt;/li&gt;
&lt;li&gt;现在用几百行 Lua 脚本就实现了: lua-resty-mysql
  &lt;ul&gt;
  &lt;li&gt;而且是非常完备的实现
  &lt;/li&gt;
  &lt;li&gt;支持多結果/存储过程等等高級功能
  &lt;/li&gt;
  &lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;而且性能非常接近纯 C 写的模块,我评测下来,也就差 10~20% 的响应
&lt;/li&gt;
&lt;li&gt;如果未来,我用C 改写其中计算密集型的处理模块,那性能可以进一步大幅度提升!
&lt;p&gt;&lt;/p&gt;
lua-resty-memcached 也就500多行就搞掂了!
&lt;/li&gt;
&lt;li&gt;是完整的 memcached 协议的支持
&lt;p&gt;&lt;/p&gt;
所以,用这种技术,可以很方便的实现公司里固定的或是全新的后端服务;
&lt;p&gt;&lt;/p&gt;
redis协议本身設計的非常巧妙,虽然命令多,但是底层传输协议非常简洁
&lt;/li&gt;
&lt;li&gt;所以,我只用 200 多行,就实现了:lua-resty-redis
&lt;p&gt;&lt;/p&gt;
后面两个模块都比较粗糙,仅仅封装了传输协议,所以,执行效率,高于它们官方c 实现的等价物 ;-)
&lt;p&gt;&lt;/p&gt;
lua-resty-upload 就是提及的大文件上传模块
&lt;/li&gt;
&lt;li&gt;不过,这模块写的比较粗糙
&lt;/li&gt;
&lt;li&gt;api 暴露的不够 优美,,,,
&lt;/li&gt;
&lt;/ul&gt;

&lt;a id=&quot;toc16R01YQ0FZT&quot; name=&quot;toc16R01YQ0FZT&quot;&gt;&lt;/a&gt;
&lt;h1&gt;&lt;a href=&quot;http://blog.zoomquiet.org/pyblosxom/index.atom#toptopNDZLTENUR&quot;&gt; 3. abt. &lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;我在 &lt;a href=&quot;http://github.com/agentzh&quot;&gt;http://github.com/agentzh&lt;/a&gt; 上天天提交代码;
&lt;/li&gt;
&lt;li&gt;也刷weibo : &lt;a href=&quot;http://weibo.com/agentzh/&quot;&gt;http://weibo.com/agentzh/&lt;/a&gt; 不过,最近刷的比较少,,,
&lt;p&gt;&lt;/p&gt;
&lt;code&gt;&amp;lt;&amp;lt;&amp;lt; 53:00&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
QA:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将 Lua 当成什么来用? 直接业务嘛?
  &lt;ul&gt;
  &lt;li&gt;简单的可以直接来
  &lt;/li&gt;
  &lt;li&gt;也可以架构更高层的領域脚本,编译成 Lua 来执行
  &lt;/li&gt;
  &lt;li&gt;不过,最终,都是通过寄生在 nginx 平台上的 Lua 来实际跑
  &lt;p&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;那 openresty 主要解决了nginx 的什么问题?是nginx 的缺陷嘛?
  &lt;ul&gt;
  &lt;li&gt;分两个方面来想:
  &lt;/li&gt;
  &lt;li&gt;1.作为 nginx 的补充,很多人也是这么用的,比如说负载的接入,简化 F5 的前端配置,访问的逻辑控制,,,
  &lt;/li&gt;
  &lt;li&gt;2. 直接作为 web 应用的机制,直接实现所有的应用,输出网页,发布 web service,等等
  &lt;p&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;和 apache 什么的性能差别主要在哪里?
  &lt;ul&gt;
  &lt;li&gt;主要是 I/O 模型的本质差异
  &lt;/li&gt;
  &lt;li&gt;nginx + Lua 可以完成数量级上的提升
  &lt;/li&gt;
  &lt;li&gt;而且,作为应用或是作为 httpd 可以同时胜任双重角色!
  &lt;/li&gt;
  &lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;hr class=&quot;light&quot; /&gt;
&lt;ul&gt;
&lt;li&gt;t2t渲染:: 2012-03-12 02:53:36
&lt;/li&gt;
&lt;li&gt;动力源自::&lt;b&gt;&lt;a href=&quot;http://txt2tags.sf.net&quot;&gt;txt2tags&lt;/a&gt;&lt;/b&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;

&lt;!-- xhtml code generated by txt2tags 2.4 (http://txt2tags.sf.net) --&gt;
&lt;!-- cmdline: txt2tags openresty-intro-2012-03-06-01-13.t2t --&gt;</description>
	<pubDate>Mon, 05 Mar 2012 17:13:00 +0000</pubDate>
</item>
<item>
	<title>@delphij: 湾区买房记(3)</title>
	<guid>tag:blog.delphij.net,2012://2.2153</guid>
	<link>https://blog.delphij.net/2012/02/3-3.html</link>
	<description>&lt;p&gt;前面几乎是流水帐，这里说说一些对其他人更有参考意义的话题。&lt;/p&gt;

&lt;p&gt;第一个话题是，如何确定应该出价多少。&lt;/p&gt;

&lt;p&gt;这个问题其实非常非常的复杂，出价之前一定要先做足功课。我的建议是在 Zillow 上研究附近房子最近的成交价，并仔细做实地考察。Zillow 会给出一个它的估价，但这个估价只能作为参考，并不一定准确。&lt;/p&gt;

&lt;p&gt;另外一个估价指标是房子的在市时间（Days on market）。资本主义市场经济的效率是很高的，价格合适的房子，除非是经济危机的时候，否则不太可能出现长时间卖不出去的情况。假如一个房子在市场上呆了30天还没有任何人提出购买意向，通常都是因为要价太高。遇到这种情况，假如房子本身没有特别不可接受的问题，就可以考虑狠狠砍价。&lt;/p&gt;

&lt;p&gt;还有一个非常重要的指标是房屋是否有未经许可的改建。在加州，屋主如果对房屋进行了加盖、内部增加或拆除墙壁，改装车库等，而没有事先取得许可，则在交易时这些部分是不被认可的。买家可以要求卖家还原、取得许可，或砍价。不过，对于不太正常的交易，例如购买短售(short sale)的房子，卖家可能选择什么都不做。&lt;/p&gt;

&lt;p&gt;由于之前银行不负责任地随意放贷，许多屋主的房子由于周围房子遭到短售或法拍(Foreclose)，导致其市场价值跌到了贷款金额以下。一些屋主此时会选择不再继续缴放贷，导致自己的房子被短售或法拍。作为一个拥有相当健全法律体系的国家，美国对于这种行为是有约束的，尽管银行可能同意以短售所得金额将欠款一笔勾销，但欠款总额与短售所得的差额，有可能会作为债务人当年的个人收入而课税，假如差价达到30万的话，相当于一下子在当年多出了30万的收入，尽管债务人可能一分钱都没有拿到，但却还是要缴纳联邦税和州税。&lt;/p&gt;

&lt;p&gt;一旦短售或法拍交易成功，这些价格就会反映到（拉低）周边的房子的价格上，因为估价时是按周围房子做的参考。在出价时，需要考虑这些交易可能产生的影响，最好是在 Redfin 或其他网站上检查一下附近的短售情况，或请自己的房产经纪提供数据做一些判断。有时，房产经纪能够提供更为全面的数据来帮助进行决策。&lt;/p&gt;

&lt;p&gt;一般来说，出价不应低于要价的95%----尽管我个人并不非常认可这种说法，但有些卖家经纪可能根本不会去回应这样的购买意向合同。如果你认为一个房子要价太高，但又觉得房子本身不错，个人认为比较好的做法是口头询问对方的经纪，或者去Open House看一看是否已经有人出价，等等。假如没什么人出价，则应坚持自己的价位，或者等一段时间再说。持有房产的人需要缴纳房产税，所以长时间持有不住的房子对他们来说是现金上的损失，并不是所有的投资者都能够扛过这一关。&lt;/p&gt;

&lt;p&gt;在有些地区，出价必须比要价高。这种现象往往会出现在学区非常好的地区，例如 Cupertino。在卖方经纪看来，高出价和直接现金支付相比，他们很可能更倾向于选择后者。需要注意的是，今天需求旺盛并不必然带来未来需求的旺盛，在高价位买房可能能赚到一大笔，但也可能会缺少成长空间。&lt;/p&gt;

&lt;p&gt;在决定出价之前，还需要对房屋状况做大体的检查。一般来说自己可以做的检查包括：&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;厨房、卫生间的洗手池下面的木头是否有水蚀痕迹。这类水蚀痕迹很可能表示之前发生过漏水，这类漏水如果处理不当，有可能会给白蚁留下机会，渗水甚至可能导致地基出现问题，因此不能掉以轻心。&lt;/li&gt;
	&lt;li&gt;屋顶是否有明显的老化现象，如果有梯子，可以爬到高处看一看（不过，如果不是专业人士请不要轻易走上房顶，以免发生危险）。&lt;/li&gt;
	&lt;li&gt;墙壁是否有裂缝。&lt;/li&gt;
	&lt;li&gt;从屋内看天花板是否有水蚀痕迹。&lt;/li&gt;
	&lt;li&gt;是否有明显的改装痕迹，如果有，应确认这些改装是有许可 (permit) 的。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;多看Open House，多做笔记，有助于了解市场行情。经过一段时间的了解，往往就可以在进入一个房子之后给出大致准确的估值了。&lt;/p&gt;
        &lt;p&gt;第二个话题是关于short sale、&quot;银行屋&quot;或REO。&lt;/p&gt;

&lt;p&gt;short sale是一种特殊的交易。这个过程中真正卖房子的是银行：房主可能会和你讨论价格，但实际上是否接受是银行的事情。有些不肖房产经纪会配合房主以极低的价格将房子放到市场上，例如把一个本应卖70万的房子故意标成50万，来吸引那些只能支付50万的贷款人来购买。这种情况银行多半会拒绝这个价格，并按实际银行希望的价格出价，而这会导致交易失败。通过一些不正当的手法，房主可以继续占用房子，有时可达数年之久。&lt;/p&gt;

&lt;p&gt;在下定决心买短售屋之前，一定要做好房屋的估价，并调查清楚屋主欠银行多少钱。一般来说，房产经纪可以从公开的资料中得到答案。&lt;/p&gt;

&lt;p&gt;short sale的另一个问题是交易时间会比较长，因为涉及银行审批等许多步骤。银行通常希望看到现金非常充裕的买家，当然全部现金支付是最好的，这可以大大缩短交易审批所需的时间。假如遇到试图欺诈的房主或房产经纪，应考虑以法律手段来维护自己的合法权益，但这需要大量的时间精力，而且从对方角度去思考，假如对方真的是那种还不起自己房子贷款的屋主而不是因为经营不善导致资不抵债的炒房团，将他们最终轰出房子，也就造就了新的无家可归者，个人认为这种做法还是要慎重考虑再做决定的。&lt;/p&gt;

&lt;p&gt;最后的问题是，short sale时，屋主很可能对房子进行一些故意的破坏。在购买时，应有相关的心理和财务方面的准备。&lt;/p&gt;

&lt;p&gt;在房子做short sale失败之后，便会进入法拍流程。银行收走的房子俗称银行屋，被投资人买走的房子通常叫REO，这类房子通常内部会有一些破坏（因为失去房子的屋主可能会做些破坏），通常银行或投资人并不会做任何修缮，就以&quot;按现状&quot;(as-is)的方式卖出。&lt;/p&gt;

&lt;p&gt;这类房子最大的优点在于产权清晰，不会有诉讼、欠债等问题威胁房子的产权归属。此外，它们的价格通常会比较便宜，缺点是这类房子通常也会是按现状方式出售的，也就是说维修费用可能会略高。&lt;/p&gt;

&lt;p&gt;个人认为如果现金充裕，只要房子本身主体结构没有太大的问题，银行屋是比较不错的选择。由于屋内的状况往往比较糟糕，因此许多人不愿意购买导致价格相对比较便宜；另一方面，假如原先的内饰已经被毁的差不多了，重新做新的装修也会比较容易，不会有需要与原有装修风格相匹配的问题。&lt;/p&gt;

&lt;p&gt;第三个话题是关于房产经纪。&lt;/p&gt;

&lt;p&gt;作为买房的房产经纪，对于首次买房来说可能会比较重要，特别是他们可以去实地考察，以及起草合同文本。不过，由于现时的科技已十分发达，Redfin等网站能够完成房产经纪能告诉你的绝大多数事情（除了被对方经纪藏起来的记录之外），这包括房屋的历史价格、周边房子的价格、房屋的现状，包括目前的房主每年的缴税情况、学区，包括具体会分到哪个学校，等等。&lt;/p&gt;

&lt;p&gt;如果熟悉业务，可以直接找一个有房产经纪执照的朋友来做自己的买方经纪，只帮助完成合同签署，并自己完成其他部分的事项。由于房产经纪执照并不太贵，事实上如果精力足够，也可以自己拿一个执照，从而省掉3%的佣金。&lt;/p&gt;

&lt;p&gt;个人认为一般情况下最好是避免让卖方经纪同时做自己的买方经纪，不过在现实的交易中，这种情况也并不少见。&lt;/p&gt;

&lt;p&gt;第四个话题是关于贷款。&lt;/p&gt;

&lt;p&gt;通常华人特别是第一代移民的信用记录都会很好。贷款利率直接取决于信用分数，一般来说730分以上可以很容易地取得贷款，并获得较低的利率。&lt;/p&gt;

&lt;p&gt;名义上的利率是按年给出的，然而，由于每月会计算一次利息，因此实际上这个利率会低于实际支付的利率。例如，如果贷款利率是 4.125%，则实际每年支付的利率是略多于 4.20%。&lt;/p&gt;

&lt;p&gt;一般来说贷款的银行会允许以预付利息（术语叫做points）的方式来降低后期支付的利息。例如，如果一个人以正常的 no-point, no-fee 贷款可以拿到 3.75% 的利率，那么多付一定的 points 可以将利率再降低 0.125% 甚至 0.25%。与此相反，如果愿意接受较高的利率，则银行也可能会以返点的形式向贷款人支付一定的现金。&lt;/p&gt;

&lt;p&gt;如何选择是否支付 points 或是要返点呢？这个要看个人的情况。我个人认为向银行要返点是很不合算的，一来这种返点有上限限制，二来它导致利率上升，可能会在最开始几年就打平得到的返点金额了。是不是要支付 points 呢？这个要看打算持有房子多久，假如只打算住几年就卖掉，支付 points 可能就不合算（因为提前还清贷款时 points 是完全不退的）。&lt;/p&gt;

&lt;p&gt;如果首付金额低于 20% 的房款，则银行会要求贷款人支付贷款保险 (MIP)。通常，这个保险的金额是分段的，例如首付在 15% 到 20% 时是一个价格，而在 10% - 15% 时是另一个价格，而不是根据首付的比例计算。&lt;/p&gt;

&lt;p&gt;贷款保险是完全&quot;扔掉&quot;的一笔钱。因此，它的支付又有几种不同的方式，有提前一次性付清，也可以先付一部分，之后逐月支付，或是最开始完全不付，而到还款时每月支付一部分。一次性付清比较适合完全按照还款计划来还款的人（也就是不多付贷款），因为它的成本最便宜；后两种方案，应根据自己的具体情况来计算，法律规定，如果贷款人支付的本金超过了最初房款的 22%，银行便必须停止征收贷款保险了。&lt;/p&gt;

&lt;p&gt;贷款方案也有很多种不同的种类，例如 30年或15年固定利率（在30年或15年期限内还清，每月还固定金额），以及5年、7年或10年固定利率的可变利率 ARM 贷款。ARM的初始利率较低，但风险是未来利率可以按市场利率浮动（有条件限制，每年最多不能超过一个百分点数），适合于计划在一开始大量多付贷款，或预期几年之后利率会下降/收入会大幅增加，或准备在几年后提前付清贷款（例如将房子转手卖掉）的借款人。固定利率贷款通常利率会高一些，但不会有需要突然增加月付金额的情况，适合准备在房子中住较长时间（例如超过7年），或比较保守的借款人。&lt;/p&gt;

&lt;p&gt;美国的企业通常是每两周或半个月发一次工资。如果能保持良好的财务规划，可以通过每两周存一次房款，并在年初或年底多付一个月房款的方法来减少房贷的长度（相当于一年付13个月的月付金额）。另一种方法是每个月多还 1/12 的月付金额，这部分金额会立即偿付本金，使得贷款的长度缩短。涉及 MIP 时，还款方案的涉及会更为复杂，需要用电子表格或写个简单的程序来计算一下。&lt;/p&gt;

&lt;p&gt;第四个话题是到底应该租房还是买房。&lt;/p&gt;

&lt;p&gt;纯粹从经济角度考虑，如果20年的房租超过房价，并且未来不会搬到很远的地方，就应该买房。&lt;/p&gt;

&lt;p&gt;另一方面，加州政府对于低收入家庭提供的租房补贴，实际上对硅谷绝大多数工程师来说都是不适用的。在税收方面，地产税是交给州政府和郡政府的直接用于本地造桥修路和改善教育、公共服务的地方税，并且可以抵消一部分收入，从而减少其他方面的税负。具体来说，地产税和利息通常是可以抵扣调整后收入的，根据自己的税筐，可以比较容易地算出具体的金额（注意如果准备在税表中申请此类抵扣，则 standard deduction 就不再适用了）。&lt;/p&gt;

&lt;p&gt;从负面影响来看，房子没办法跟着人搬走，而且需要做修缮，因此房子本身是贬值资产，并且如果发生地震、洪水等自然灾害，房屋的维修可能会是一大笔花费，并且房贷本身在较长时间之内会是比较显著的经济压力。当然，如果选择的地段合适且维护得当，房子的价值还是会逐渐增长，另外，作为多样化投资的一部分，它也可以作为对冲通胀的一个可选的途径。&lt;/p&gt;</description>
	<pubDate>Mon, 05 Mar 2012 04:18:30 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 电池阿电池</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2104</guid>
	<link>http://shell909090.com/blog/2012/03/%e7%94%b5%e6%b1%a0%e9%98%bf%e7%94%b5%e6%b1%a0/</link>
	<description>&lt;p&gt;    三个月之内，连续两次碰到电池问题。一个是p81hd的充电口损坏，送修两个月没法用。拿回来后，发现因为无电时间过长，电池受损，大概只有2.5小时的电量（原来至少4小时）。另一个是hpmini 1017TU已经损坏的电池，居然鼓起了一个包！！！一个包在电池中央，吓得我顿时就拆下电池，放的远远的，以免爆炸。
&lt;div&gt;    贝壳自认还是比较爱护电池的，没有频繁冲放，没有过充过放，基本都是10%-90%区间放电。但是电池还是连续出问题，只能说目前的锂电池性能还远远不过关。&lt;/div&gt;
&lt;div&gt;    现在已经预定了一个新的hpmini电池，但是p81hd的电池就不知道该怎么处理。而报废的锂电池也不敢乱扔，不知道有没有什么地方可以处理旧电池的。&lt;/div&gt;&lt;/p&gt;</description>
	<pubDate>Sun, 04 Mar 2012 19:03:52 +0000</pubDate>
</item>
<item>
	<title>@khsing: Hidden keyboard after done is pressed</title>
	<guid>https://blog.khsing.net/?p=474</guid>
	<link>https://blog.khsing.net/2012/02/hidden-keyboard-after-done-is-pressed.html</link>
	<description>&lt;p&gt;近日小寫iOS，記一筆，在&lt;code&gt;TextField&lt;/code&gt;叫出鍵盤後，按下Done鈕再隱藏鍵盤的例子。&lt;/p&gt;
&lt;p&gt;Apple 的&lt;a href=&quot;https://developer.apple.com/library/ios/#DOCUMENTATION/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html&quot;&gt;Managing the Keyboard&lt;/a&gt;是應該詳讀的文檔。&lt;/p&gt;
&lt;p&gt;鍵盤在編輯的時候會自動的出現，但是並不會自動的消失，這個工作Apple交給了開發者自己調用&lt;code&gt;resignFirstResponder&lt;/code&gt;來隱藏。&lt;/p&gt;
&lt;p&gt;首先，要在聲明使用&lt;code&gt;UITextFieldDelegate&lt;/code&gt;協議。&lt;/p&gt;
&lt;pre&gt;
@interface ViewController : UIViewController  &amp;lt;UITextFieldDelegate&amp;gt;
@property (nonatomic,retain) IBOutlet UITextField *textField;
@end
&lt;/pre&gt;
&lt;p&gt;其次，要在&lt;code&gt;implementation&lt;/code&gt;裡指定&lt;code&gt;TextField.delegate&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;
- (void)viewDidLoad
{
    self.textField.delegate = self;
}
&lt;/pre&gt;
&lt;p&gt;最後再複寫&lt;code&gt;textFieldShouldReturn&lt;/code&gt;方法來call &lt;code&gt;resignFirstResponder&lt;/code&gt;方法。&lt;/p&gt;
&lt;pre&gt;
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return NO;
}
&lt;/pre&gt;</description>
	<pubDate>Wed, 29 Feb 2012 02:35:18 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 关于酒精带上飞机</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2102</guid>
	<link>http://shell909090.com/blog/2012/02/%e5%85%b3%e4%ba%8e%e9%85%92%e7%b2%be%e5%b8%a6%e4%b8%8a%e9%a3%9e%e6%9c%ba/</link>
	<description>&lt;p&gt;    刚刚看空中浩劫，有个哥们，是飞行员，空难调查专家。去度假的时候摔在了关岛。等他好了，就开始鼓吹飞机的座椅应该去掉个横杠，而且酒精不能随身携带。
&lt;div&gt;    因为飞机出事的时候，氧气泄露，都在往天花板跑。而当时关岛去的时候，很多人带了很多免税酒。这些酒在摔飞机的时候挥发的酒精和氧气结合，被点燃，然后引发了大火。所以这哥们说，酒精不能放入天花板的行李舱里面。&lt;/div&gt;
&lt;div&gt;    这绝对是从血里面学到的东西，想带酒的不妨考虑一下。&lt;/div&gt;
&lt;div&gt;    至于为啥不让带液体，则是另一个哥们。这兄弟是纽约摩天大楼爆炸案的主角，在菲律宾飞往日本的飞机上，带上去了一个炸弹做测试（测试。。。）。炸弹使用液态材料，用一个电子表做触发，两个电池做外部能源。这哥们放好炸弹自己跑了。飞机飞到一半的时候，把一个小日本直接炸了个暴菊而亡，飞机迫降那霸。如果不是这哥们对飞机的了解不深，查到的资料是同型号飞机的（型号差一点害死人阿）。这颗炸弹就会直接炸穿主油箱，然后引燃燃油，再炸掉整个飞机。幸好，他放炸弹的地方刚刚好差了一两排。&lt;/div&gt;
&lt;div&gt;    想带液体的不妨考虑一下。&lt;/div&gt;
&lt;div&gt;    至于为啥锂电池不能带上行李舱——估计是太多国产山寨手机炸的老外暴菊而亡，他们不敢让你离开这种危险品吧。&lt;/div&gt;&lt;/p&gt;</description>
	<pubDate>Sun, 26 Feb 2012 18:03:48 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 从黑客到极客——hacker文化的演化</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2100</guid>
	<link>http://shell909090.com/blog/2012/02/%e4%bb%8e%e9%bb%91%e5%ae%a2%e5%88%b0%e6%9e%81%e5%ae%a2-hacker%e6%96%87%e5%8c%96%e7%9a%84%e6%bc%94%e5%8c%96/</link>
	<description>&lt;div&gt;    说到黑客文化，就不能不提到技术。黑客是一个复杂的文化，不同的人，不同的时代有不同的解读。黑客的一端是技术，另一端是文化。如同武侠一般，一端是武，一端是俠。金大侠说过，武好写，侠难写。同样，要讲述技术，虽然艰涩，但总是可以表达的，难以表达的是黑客文化中的种种现象。对于没有背景的人来说，这些文化现象并不比技术易懂到哪里去。下面我们首先统一解说一些名词概念，以便下面的阐述。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;
&lt;p&gt; 名词解说&lt;/p&gt;&lt;/div&gt;
&lt;div&gt;    hacker 从原生意义上说，是喜爱计算机技术而充满叛逆的年轻人。藐视传统，不按照常规方法使用软件和服务，而是通过自己的洞察力，非法（或在后来被定义为非法）的使用。例如音频拨号时代，某位（绰号Captain Crunch）发现通过发出特定音频可以绕过收费机制，于是就公开了这个机制。hacker的原生目的不是破坏，而是表达自己的叛逆，炫耀自己的技术。而目前在主流媒体和民众中的形象是恶意的系统破坏者，会给你带来麻烦，并且以技术手段获得不法收入。在文中注意区别hacker的前后两种不同含义。&lt;/div&gt;
&lt;div&gt;    cracker 没有歧义，从一开始，就指软件的破坏者，但是不一定以此牟取私利。cracker和hacker的界限很模糊。&lt;/div&gt;
&lt;div&gt;    geek 原意是怪人，善于研究不善于交往的怪人，和书呆子(nerd)类似。但是近些年随着网络文化兴起，逐步变成褒义词，指喜爱技术（不特指计算机技术），充满DIY精神的人。&lt;/div&gt;
&lt;div&gt;    black hat 黑帽子，hacker中为了达成私利性目的而非法使用系统的人。通常常见的情况有，勒索（例如不付钱就会破坏系统和数据），盗用账户，获得非法虚拟货币等。&lt;/div&gt;
&lt;div&gt;    white hat 白帽子，和黑帽子相对，为了修补系统问题而研究系统的人。白帽子不代表免费，相反，白帽子通常催生了某类安全产业，不少白帽子是挂靠在安全公司名下，甚至自己经营安全公司。他们致力于寻找大型系统中的漏洞，并且向企业汇报漏洞，换取收入。白帽子可以看作是企业对hacker妥协的一次结果，与其让这些年轻人精力充沛的寻找漏洞，然后不知道发生什么事情。不如雇用他们为自己寻找漏洞，减轻自己的风险。&lt;/div&gt;
&lt;div&gt;    grey hat 灰帽子介于白帽和黑帽之间，你可以理解为，他们有的时候当白帽，有的时候当黑帽。也可以理解为，如果我卖你漏洞你不要，那我就卖给要抢你的人。&lt;/div&gt;
&lt;div&gt;    script kids 脚本小子。指一些并没有技术能力的人，利用他人已经完成的脚本进行攻击行为。这显然有悖于传统黑客伦理，充满乐趣的发现问题是第一位的，至于漏洞只是发现问题的结果。通常而言，普通人碰到的90%以上被认为是hacker的人都是script kids。&lt;/div&gt;
&lt;div&gt;    红客 红客是一批非官方的，使用技术“维护国家和民族尊严”的人。严格来说，有不少“红客”是原生的hacker，只是激进的表达爱国主义和民族主义，这批人可以视为黑客中的一个特殊群体。然而不断有技术不足的人为了“维护中国尊严”而加入，导致一些自称红客的人实际上只能算是利用技术的script kids。由于试图以技术为手段表达政治意图的人数量庞大的关系，因此红客在一词在使用的时候，script kids的比例异常的高。在不少文章中经常混谈两者，阅读的时候应当注意区别。&lt;/div&gt;
&lt;div&gt;    飞天面条教 具体查wiki“飞天面条怪物”一词。这个是用于反对“智能设计论”的。即某些宗教主张，人类是由一个超自然的智能所设计。因此Bobby Henderson同样创造出一个符合智能设计论的神进行反讽。列入本文是因为很多geek本着找乐子的心情加入了相关恶搞。关于这个问题请仔细阅读飞天面条怪物的相关页面并去那里讨论，本文不掰扯宗教问题。&lt;/div&gt;
&lt;div&gt;    海盗党 具体wiki“海盗党”“盗版党”。瑞典的一大政党，主张现有的版权制度过度的限制了知识的发放，阻碍了人类的进步。主张减少版权限制，增进知识交流，注重隐私保护。&lt;/div&gt;
&lt;div&gt;    DDOS 分布式拒绝服务攻击。使用大量的肉鸡（傀儡）来访问某个服务，导致服务器过载，从而无法继续服务。本质上说DDOS很难防御，因为他实际上就是一种过载。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;黑客文化历史&lt;/div&gt;
&lt;div&gt;    我们首先阐述的是黑客文化的背景。在大部分的文章里面，会提到黑客起源于美国的朋克文化。实际上基本如此，但是黑客属于朋克文化在校园中的一个变种，更专注于技术。这个变种是如此的具有生命力，以至于今天仍在极大的影响世界。关于这点，更进一步可以阅读（&lt;a href=&quot;http://man.lupaworld.com/content/develop/joyfire/project/7.html&quot; target=&quot;_blank&quot;&gt;http://man.lupaworld.com/content/develop/joyfire/project/7.html&lt;/a&gt;），其中《黑客文化简史》这部分。说一点题外话，链接的这篇文档收录了ESR的不少名文，可以看作是传统黑客文化的讨论和总结，是相当不错的文档。&lt;/div&gt;
&lt;div&gt;    时代在变化，背景在变化，黑客在大众中的形象也在变化。黑客首次为大众所知，是在1988年，莫里斯蠕虫造成大量主机宕机。此次事件经过媒体大规模渲染，很大的影响了黑客文化在大众中的形象。实际上，传统的黑客文化很不稳定，极易被误解。因为传统的黑客文化信条之一是表达叛逆，而表达叛逆往往跟随着破坏现状，这点非常容易被滥用。很多人无视了注重技术，充满趣味的工作等其他信条，而只专注于挑战权威，从而成为臭名昭著的破坏者。而另一些人则在不违背信条的情况下，试图利用自己的技术赚钱。这催生了黑客产业链（当然，这不全是坏事）。而黑客产业链肯定会为用户和企业带来额外的麻烦。&lt;/div&gt;
&lt;div&gt;    另外提一句，在亚洲地区，黑客第一次为大众所知估计是CIH病毒。这也是第一个大规模破坏硬件的病毒。&lt;/div&gt;
&lt;div&gt;    由于种种因素，黑客在大众中的形象逐步变为了破坏者，找麻烦的人，以技术作恶者。实际上，在hacker的原始含义中是没有这个意义的。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;从黑客到极客&lt;/div&gt;
&lt;div&gt;    在现代，hacker这个词和cracker这个词实际上已经很类似了。如果说区别的话，cracker更偏向于破坏程序本身，而hacker则引入了以技术作恶的意味。但是hacker的精神不死，他以其他词的形态出现。现代替代hacker出现的词是geek，这个词类似于原来的hacker，但又有所不同。我们首先回顾一下hacker的信条。&lt;/div&gt;
&lt;div&gt;1.充满乐趣的工作，为了乐趣而工作。&lt;/div&gt;
&lt;div&gt;2.挑战权威，自由万岁。&lt;/div&gt;
&lt;div&gt;3.专注技术。&lt;/div&gt;
&lt;div&gt;4.一个问题不应该被解决两次，无聊的工作是罪恶。&lt;/div&gt;
&lt;div&gt;    我找不到一个权威的geek信条，但是我个人总结如下：&lt;/div&gt;
&lt;div&gt;1.关注原理而不关注结果。&lt;/div&gt;
&lt;div&gt;2.为了自己的乐趣而非利益工作。&lt;/div&gt;
&lt;div&gt;3.乐于挑战其他人无法完成的事情，并视为一种成就。&lt;/div&gt;
&lt;div&gt; 4.不限于coding，也包括以各种有技术含量的手段达成炫耀技术的目的。&lt;/div&gt;
&lt;div&gt;    对比两者，我们可以看出差别。hacker主要注重的是计算机技术，而geek更偏向于指代各种技术。hacker叛逆，挑战权威，自由万岁，而geek虽然喜欢自由，但是并没有强调挑战权威。两者都强调乐趣，强调技术。这些区别主要是由于各种时代的变化所致的。相比起来，geek文化更类似于hacker文化的一个普及和切割。去除了挑战权威的味道，泛化了技术，使得更多人有可能成为geek。&lt;/div&gt;
&lt;div&gt;    我们举一个当代的传统hacker的例子，Arron Swartz试图下载JSTOR的论文并散布，这是典型的一个hacker行为——下载并散布论文并不是出于为了获得私利，而是为了表达自己的观点——人类获得知识的权力不应当被阻碍。从法律上说，是的，这是违法行为。但是这个事情反过来，让我们关注了这么一个事实——JSTOR的收费论文库是否还有必要存在？或者说，一个更本质的问题。以校园墙为界限阻止知识获取，并以这种行为牟利是否合理。当然，思考的结果可能是合理的，也可能不合理。hacker并不在乎违法，实际上，很多hacker就是在违反法律的同时走向伟大。要找类似例子，可以wiki“五角大楼文件泄密案”，当然，主角不是黑客。&lt;/div&gt;
&lt;div&gt;    而geek就没有这么叛逆，以当代的典型geek形象——TBBT中那一帮书呆子而言，基本就看不到多少反叛气息。Sheldon的却进过监狱，可是理由可不是因为挑战现有制度，而是在法庭上找抽。很多geek有自己的政治主张，会讨厌某个政党，或者认同hacker文化中的思想。但是并不会像hacker们那样，无视法律，使用技术手段直接表达。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;当代其他和黑客有关&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;    另外有一些很特殊的例子，是黑客文化极端介入政治，导致产生的各种政治和宗教流派。例如飞天面条教，就我所知有不少geek程序员加入了恶搞行为，甚至参与了网页制作或线下活动。另外一个不得不提的和黑客文化有关的政治事务则是海盗党。海盗党的主张和hacker挑战权威，自由万岁的想法完全一致。不同的是，hacker（此处取褒义）以技术手段，破解他们认为非法的数据。而海盗党则以政治运动和政党体系为手段，推进政治改革。&lt;/p&gt;&lt;/div&gt;
&lt;div&gt;    介入经济的黑客则演变成了很有名的黑客经济链条。大致上说，这个链条呈金字塔结构。最上层的是极少数黑帽子，负责寻找系统的“硬”漏洞。其下则是为数不多的程序员，通过各种手段购买漏洞，非法的内部文件，实现各种破坏性工具。这些工具被各个地区的老板购买，分发到大量的普通技术员（甚至不需要技术）手中，利用技术来作恶。例如种下大量木马，利用获得的肉鸡进行DDOS，收费破坏敌对系统的运行。或者是诱骗用户点击木马，收集用户游戏账户或银行/支付宝账户。&lt;/div&gt;
&lt;div&gt;    链条的意义在于，链条上每向后推进一个环节，牵涉到的人和财富会以倍数增长。一个价值数十万的漏洞从黑帽子手中流出，到了程序员手里成为工具时，可能价值已经上百万。而这个工具最终被分发到技术员手中，用于诈骗的财富可能高达上千万。这个链条，使得上游精通技术但没有足够时间的专家，和下游渴望获得金钱但是没有技术的普通人相结合，使得少数专家可以指导大量普通人进行犯罪活动。因此才出现了灰帽子和白帽子两个行业，毕竟直接收购漏洞相比损失来说小的多。&lt;/div&gt;
&lt;div&gt;    当技术为政治所用，产生的则是GFW，JFCCNW等。关于这个不进一步阐述。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;在中国，我如何成为一名geek&lt;/div&gt;
&lt;div&gt;    本文不会谈论如何成为一名hacker，毕竟后者在大众眼中的形象不佳，同时ESR也有一篇《如何成为一名黑客》说的甚好，我就不拾人牙慧了。不过限于中国特殊的情况，我还是说说你如何成为一名计算机技术geek。&lt;/div&gt;
&lt;div&gt;    geek不是能够培养的，而是自发产生的，geek是在苦逼的道路上蛋疼且快乐着。&lt;/div&gt;
&lt;div&gt;    要成为geek，一个首要的条件就是能够享受技术的乐趣，而不是被吓倒。在面对复杂的文档（对于国人而言，尤其是英文文档）时，仔细的阅读，并且找到系统工作的原理。无论是hacker还是geek，对于他们感兴趣的东西，仅仅知道如何使用是不够的。通常而言，大部分的geek都有自己动手拆解修改一些系统的经历。这个行为有一个术语——hack。例如，我们可能会希望http在转发请求的时候增加一些头部帮助识别信息，而原生的http服务器没有这个内容。怎么办呢？下载一份源码，然后找到相关部分，修改并重新编译一遍，这是最简单的hack行为。如果你不知道怎么修改，可以阅读文档。然而你完全没有“我可以修改http服务器”这个想法时，是注定无法培养成为geek的。也就是说，成为geek的必要条件是强烈的求知欲和与之相匹配的动手能力。&lt;/div&gt;
&lt;div&gt;    有了求知欲，我不相信你还可以若无其事的使用windows系统。你有没有希望了解系统开机时发生了什么事情？希望知道系统是如何工作的？如果有，你必定会想要下载一份linux的源码，并且进行编译安装。当然，对于初学者而言，我建议你先从ubuntu开始入手。&lt;/div&gt;
&lt;div&gt;    ubuntu的安装门槛相对比较低，但是对于初学者，还是会有很大的门槛。你可以求助于当地lug，目前中国比较大的lug有，bjlug，shlug，szlug，gzlug，hzlug。对应于北京，上海，深圳，广州，杭州。以上几个地方的同学，可以直接搜索lug，然后寻找同好求助。其他地方的只能更多的求助于线上资源。&lt;/div&gt;
&lt;div&gt;    有了ubuntu的使用经验，也许你的脑子里会跳出更多复杂的念头。例如有一台多余的旧电脑，是否可以配一块硬盘，作为nas来服务整个家里。是否可以在这个nas上加载其他系统，完成自己的需求，例如在上面开一个网页服务器。这个网页服务器是否可以监控家中的摄像头等设备，等等。&lt;/div&gt;
&lt;div&gt;    自由的思考，进而发现现状中的不足，然后快乐的折腾改进，这是geek的根本。当然，这会花费大量的时间，甚至金钱。你可能会没有时间交往男女朋友，或者要自费购买价值不算低的高阶路由器。这就是为什么我说，geek是在苦逼的道路上蛋疼且快乐着。&lt;/div&gt;
&lt;div&gt;    而进阶则可以安装arch或者gentoo。最后，你可以试试lfs。当然，所谓试试lfs，绝对不是复制粘贴，而是通过自己的了解，改变lfs适用的过程。例如你可以通过脚本和make来简化复制粘贴过程，简化测试过程。或者通过自己的了解在虚拟机上跑起lfs来。如果这些都没问题了，那么你可以看看《如何编写操作系统》和《操作系统：设计和实现》两本书。这些都没问题后，基本就可以通晓系统的方方面面，然后用mac或者用回windows。&lt;/div&gt;
&lt;div&gt;     是的，这不奇怪，geek中有不少windows用户，也有不少macos用户。一旦了解了系统的方方面面，没道理还保留一个实验用的系统在自己日常工作的机器上。&lt;/div&gt;
&lt;div&gt;    其次，你需要学习至少三种语言，一种是汇编，一种是C，一种是lisp。如果你需要经常使用，也许还要学习一种快速开发语言，例如ruby或者python。作为一个geek，没有掌握一种以上语言是不可能的。&lt;/div&gt;
&lt;div&gt;    为什么要学习语言，而且学习那么多种？因为语言是人类操纵机器的大门，不同的语言会改变你对机器的认识。汇编语言教给你的是机器的硬件工作原理，包括中断原理，输入输出控制。C语言教给你的是内核工作机制，如何结合硬件和软件进行工作。而lisp教给你的则是数学。&lt;/div&gt;
&lt;div&gt;    当然，作为入门，你可以先从bash开始，这种语言相当的简洁而且对人友好，可以很好的粘合系统中现有的程序开始工作。但是在进阶的时候会变得复杂，所以一般很少作为一门主力语言使用。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt; 黑客文化的未来&lt;/div&gt;
&lt;div&gt;    世界各地的版权组织，总是努力使我们确信，盗版抢走了“我们”的钱，因此我们需要捐款，并身体力行的反对盗版。但是从我个人的体悟来看，实际上的情况，是版权比盗版更加恶劣的影响我们的生活。当然，盗版是恶，这点没有错。在盗版横行的国度，例如中国大陆，程序员的劳动并不得到尊重，这点我反复强调过。但是相反的，在注重版权的国度，例如美国，另一些问题更加困扰着我们。我们需要了解java底层的运作(jvm，不是底层库)？抱歉，这个受到版权的保护。我们需要查阅一些文献。抱歉，这个paper的copyright属于JSTOR。甚至，我们需要在一种新的设备上使用一种已经成为工业标准的语言，都必须经过版权所属公司的批准，甚至可能被恶意阻止(android上的java)。&lt;/div&gt;
&lt;div&gt;    比这个问题更恶劣的，是美国的音乐和影视作品版权保护。美国的影视作品享有70年的版权保护期限，而且可以被继承。政客们提出的理由是，如果没有足够的版权保护，就没有人愿意生产歌曲和影视作品。但实际上，美国的软件保护年限只有20年，还是有源源不断的软件被生产出来。&lt;/div&gt;
&lt;div&gt;    版权保护和知识自由是一对矛盾。没有版权保护，就没有人会重视知识劳动成果，那样会使得更少的人去生产知识。而过度的版权保护，会使得大家都重视知识劳动成果，但是却无法获得知识。不平衡的两者，都无法促使我们创造出更好的东西。&lt;/div&gt;
&lt;div&gt;    另一个和hacker有关的问题则是隐私保护和言论自由的矛盾。通常来说，我们对隐私保护越重视，则会相应的妨碍言论自由。因为你对他人的批评几乎不可避免的会涉及到他人的隐私。美国对这个问题的约束通常是，公众人物的隐私受到更少的保护。hacker的传统是注重自由，其中就包括言论自由。如果有一个hacker认为你为非作歹，他会通过他能做的把你的家底狠狠的翻一遍，而不管你是不是个公众人物。理所当然，这对个人隐私保护是个严重威胁。现在在中国大陆地区越演越烈的网络实名制其实就有这方面的冲突。&lt;/div&gt;
&lt;div&gt;    网络实名制主要用于对应&quot;人肉&quot;，即网友通过查询网络数据，获得某个网络帐号的真实身份，进而查询出他的各种相关信息。在当代，几乎没有人是没有网络数据留存的，因此几乎每个人都有被人肉的可能。&lt;/div&gt;
&lt;div&gt;    实际上，我认为每个人都应当思考一下，版权保护和知识自由的界限，以及隐私保护和言论自由的界限。&lt;/div&gt;
&lt;div&gt;    这会为hacker文化引入的新的信念。&lt;/div&gt;</description>
	<pubDate>Mon, 20 Feb 2012 18:17:42 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 有一种错误，叫做太常见了以至于视而不见</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2098</guid>
	<link>http://shell909090.com/blog/2012/02/%e6%9c%89%e4%b8%80%e7%a7%8d%e9%94%99%e8%af%af%ef%bc%8c%e5%8f%ab%e5%81%9a%e5%a4%aa%e5%b8%b8%e8%a7%81%e4%ba%86%e4%bb%a5%e8%87%b3%e4%ba%8e%e8%a7%86%e8%80%8c%e4%b8%8d%e8%a7%81/</link>
	<description>&lt;p&gt;    最近整XEN，出了一个奇怪的错误。
&lt;div&gt;&lt;span&gt;ERROR (SrvDaemon:355) Exception starting xend &lt;/span&gt;&lt;span&gt;((22, 'Invalid argument')) &lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt; &lt;span&gt;Traceback (most recent call last): &lt;/span&gt;&lt;br /&gt; &lt;span&gt;   File &quot;/usr/lib/xen-4.0/lib/python/xen/xend/server/SrvDaemon.py&quot;, line &lt;/span&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt; &lt;span&gt;335, in run &lt;/span&gt;&lt;br /&gt; &lt;span&gt;     xinfo = xc.xeninfo() &lt;/span&gt;&lt;br /&gt; &lt;span&gt;Error: (22, 'Invalid argument') &lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;    根据网络上的内容，首先排除没有xen模块——有了，然后是/proc/xen目录是否mount——有了，然后是/sys/hypervisor/下面的一堆属性——有了，然后是版本——不对。xen-utils-4.1是4.1.2版本，而xen-tools是4.2版本。不过xen-utils并不依赖xen-tools，没有后者应当也可以运行这些玩意。hypervisor和xen-utils的版本是一致的。那问题是什么？&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;    出错的文件是&lt;/span&gt;&lt;font&gt;/usr/lib/xen-4.1/lib/python/xen/lowlevel/xc.so里面发生的异常，下载xen的源码检查，这个函数主要是检查属性。属性检查会出什么错？&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font&gt;    正在一头雾水的时候，突然想起一个问题。我安装的是xen-hypervisor-4.1-amd64，因为kernel是linux-image-3.1.0-1-amd64。然而，我这个系统有一个非常大的特殊——在64位CPU上运行的32位系统。因此，实际上xen-utils是32位的。行了行了，下面的事情用膝盖都能想到。&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font&gt;    叹气，这世界上，真的有种错误，叫做太常见了以至于视而不见。不要认为自己不会犯。&lt;/font&gt;&lt;/div&gt;</description>
	<pubDate>Sun, 19 Feb 2012 22:19:51 +0000</pubDate>
</item>
<item>
	<title>@delphij: 湾区买房记(2)</title>
	<guid>tag:blog.delphij.net,2012://2.2152</guid>
	<link>https://blog.delphij.net/2012/02/2-4.html</link>
	<description>&lt;p&gt;前面已经说过，我认为房地产在很多时候并不是好的投资，但是因为要一次性投入相当多的资金，因此就有必要认真考虑是不是真的应该买房。在和一些也在湾区生活或生活过的朋友交流之后，我大体确定了几个条件：&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;由于贷款等财务上的压力不应大到必须要降低生活水准的程度；&lt;/li&gt;
	&lt;li&gt;考虑投资回报问题，尽可能找在支付能力范围内的学区较好的地区，并避免Townhouse或Condo；&lt;/li&gt;
	&lt;li&gt;交通：位置不要距离上班地点太远；&lt;/li&gt;
	&lt;li&gt;初期维护费用：如果需要对房屋进行装修或其他修理，这些费用要按杠杆率（5倍左右）计入房价来考虑，因为这些费用通常需要以现金形式支付。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;在 Redfin 上研究了一段时间以后，首先排除了 Fremont 和 Cupertino 两个地区，前者是因为与南湾主要的连接是880公路，距离较远且上下班时间经常出现堵车；后者是因为价格太贵。最后，基本上选定了 San Jose 的 Evergreen 社区（邮编 95148 和 95135 交界附近的地方）。&lt;/p&gt;
        &lt;p&gt;接下来基本就是找房和看房了，个人的经验，初期最好是先找一些房子做 Open House 的时候过去看，而不是先找 Agent。一般来说做 Open House 的房子的状况会比较好，而且和他们的 Agent 聊一聊，有助于获得对这个行业的感性认识。&lt;/p&gt;

&lt;p&gt;房产经纪对房屋市场的趋势，以及需要了解的问题、交易的流程都比较了解，因此可以给买家许多有价值的建议。但是最终，房产经纪的利益和买家是不一致的（除非是按小时支付对方工钱，而不给对方任何提成；如果不是这样，房产经纪最大的利益就在于把生意做成以便拿到提成），所以，尽管有相关的一系列法规来对他们的行为进行约束，但买家仍然需要自己做些功课才能避免出现由于经纪的问题产生的不愉快。&lt;/p&gt;

&lt;p&gt;我在实际转了几个星期之后，在一次 Open House 的时候遇到了一个正在卖房的房产经纪，对方主动提出可以做买家的房产经纪，于是便互相留了联系方式等等。接下来的一个周末，对方便带我们去看了几个附近的房子。&lt;/p&gt;

&lt;p&gt;我们看的第一个房子是位于 Aldworth Dr 的一个 1798 sq ft 的单层single family home，大门朝南。房产经纪甚至帮我们准备了一个offer的文档。仔细研究 redfin 以及 zillow 之后发现这个房子的几个问题是：1）小学比较一般；2）房子的窗户都是单层的，全部换掉需要相当多的费用；3）院子里比较荒，看起来应该有一段时间没人住了，和邻居打听了一下，这家有几年没人住过了，但是最近在房屋内部做了些装修；4）房子的开价稍微偏高（我认为）。实地考察发现由于房子的朝向问题，这个房子的厨房显得比较热。&lt;/p&gt;

&lt;p&gt;总体来说这个房子没看出什么很大的问题，但是也不是很喜欢。这里还要插一句：在加州法律中，房屋在最近三年内有人死在屋里，无论是什么原因，都属于必须主动披露的事实，而超过三年，则可以买家不问就不必主动披露；不过实际上事后卖家宣称不存在这类情况。关于死人的问题，我个人的观点是不在意，除非那个人是在这间房子里被谋杀或者由于各种有毒物质导致的疾病而死亡，因为有这些情况有可能代表附近的治安情况不好，或者房屋本身存在某些有毒的化学物质（例如天花板含有石棉，这在1978年以前的建筑是比较常见的情况；或者油漆含铅，等等），假如这些问题不解决，未来仍然可能出现这样的问题。&lt;/p&gt;

&lt;p&gt;当时房产经纪给我们的建议是出价535K，但要求卖方出5K的维修费用和5K的 non-recurring closing cost。后一部分的费用可以用来支付贷款所需的费用，但不能用于偿还贷款。&lt;/p&gt;

&lt;p&gt;考虑再三，感觉这个房子并不是非常理想，所以我们暂时没有让房产经纪下 offer，而是直接去看了下一个房子。这个房子位于 Oldwood Ct，屋主是华裔，因为搬到了 Cupertino 而将房子出租，但最近想要把房子卖掉。&lt;/p&gt;

&lt;p&gt;这个房子的状况要远好于第一个，主要是因为社区更靠近 95135，但房屋采光比较一般。房主开价大约570K，但我认为房子只值500K，于是试图砍价，但卖家的经纪直接拒绝了。最终，这个房子在半年之后于2012年以540K的价格成交。&lt;/p&gt;

&lt;p&gt;两周后，房产经纪又给我们推荐了位于 Tagart Dr 的一个两层 1438sq ft 的房子。这个房子是一个&quot;flipped property&quot;，在一个月前刚以420K成交，而卖家要价480K。很明显，这个房子之前维护的不错，而且采光很好，而炒房者则什么都没做。和卖方经纪聊了几句发现对方一问三不知，我认为不应该鼓励这种行为。后来咨询了贷款经纪，发现买这样的房子确实是会有问题的：由于持有时间太短，卖家需要向银行证明为什么他的买卖行为创造了$60K的价值（因为银行不愿意承担太大的风险），而通常这是通过对房子进行修缮等的实际花费来证明的。市场经济环境下，炒房行为被所有参加交易的各方追求自己一方利益最大化的动力，而不是简单地立法而得到遏制。在感叹之余，我计算了一下对方的交易成本，决定出价 450K；作为交换，在房产经纪的建议之下，我还主动提出了10天之内解除所有合同的风险条款（contingency clause）等条件。&lt;/p&gt;

&lt;p&gt;对方在拖到回应的最后期限之后，提出成交价 480K，并拒绝了所有对卖家不利的条款，同时接受了所有对买家不利的条款。我认为对方没有交易的诚意，于是决定爱谁谁吧，不降价就不考虑了（在几周之后，卖家选择了撤市，并在三个月后再次将房屋上市，最终以 476K 成交，这是后话）。&lt;/p&gt;

&lt;p&gt;这之后的两个月又看了很多房子，但是都有各种各样的问题。在这个过程中，我也逐渐总结出了希望的房子必须具备的外观特征：&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;南北朝向。南北朝向的房子的采光、通风等等都明显好过东西朝向的；&lt;/li&gt;
	&lt;li&gt;双层玻璃窗户。我们找的房子的尺寸，更换窗户大约需要 $16K 左右的费用，5倍杠杆大约相当于8万美元的差价；&lt;/li&gt;
	&lt;li&gt;天花板不能是 popcorn ceiling（因为有石棉）；&lt;/li&gt;
	&lt;li&gt;屋顶至少应该还有10年以上的可用寿命；&lt;/li&gt;
	&lt;li&gt;不要游泳池；&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;这么一来，可选的房子就更少了。在8月底，我发现了一个看起来各方面都很不错的房子，在 Rollingside Dr，1968sq ft，两层，4个卧室、2.5个浴室，开价 635K。&lt;/p&gt;

&lt;p&gt;在和房产经纪交流之后，我们找了个周末去了这间房子的 Open House，这个房子采光等等都很好，院子里种了很多的植物，1978年建成。对方经纪开门见山地说，房主是一对六十多岁的夫妇，其中老先生在年初的时候因为脑瘤在家中去世了。平心而论，这个房子的价位在这个地段是相当合理的，甚至有些偏低，在来 Open House 之前我还在琢磨，为什么这个房子会卖这么便宜？对方房产经纪在介绍了房屋的其他状况之后问了我一句：你觉得这个开价高吗？我回答 I think it's Okay，但是还是未置可否。总体来说这个房子总体上是我比较满意的，于是在回家后就立刻给房产经纪写信说准备下offer。&lt;/p&gt;

&lt;p&gt;有了之前几次的经验，我对我找的这位房产经纪已经产生了一定的戒心。我的想法未必是对的：事实上，房产经纪建议我们出高价去买房子并不是完全没有道理，这个地区的房屋供应量有限，如果价格合适，房子很快就会卖出去；但是，从市场全局的观点来看，我的出价会影响周围房屋的价格，从个人利益的角度考虑，在当时的经济环境下，以更低的价格成交要比能够成交本身更为重要----我握有现金，并且也在逐步把持有的股票等证券变为现金，而这个地区的 foreclose 进程仍然在继续。&lt;/p&gt;

&lt;p&gt;于是这一次我坚持了自己的出价，在 offer 中给出的出价是 625K。经过一番讨价还价，最后双方在 629K 的价位达成了一致。&lt;/p&gt;

&lt;p&gt;对方的房产经纪十分守信地把房子的MLS条目改为了 PENDING 状态。结果，在白蚁检查的时候出了问题：屋主委托卖方经纪做的检查发现需要花大约五千美元来做白蚁的治理。&lt;/p&gt;

&lt;p&gt;由于之前预估需要的费用大约是1000美元左右，这个差异超出了我的心理预期。考虑到房子的窗户需要进行更换，这个房子的实际拥有成本大约是 $710K 左右，于是和对方协商，最终解除了这个购房合同。这在当时看起来是个很糟糕的决定，因为接下来的三个多月时间我们没有看到任何一个同等单位价格但屋况更好的房子，而另一方面，3000美元的差异并不是太大；但是现在看来，这是一个非常好的决定，因为我们最终以少 0.5% 利率的贷款和更低的价格买到了附近一个户型一样，但屋况好的多的房子。&lt;/p&gt;

&lt;p&gt;接下来是十分难熬的三个月。这三个月我们看了比之前还要多的房子，几乎整个 Evergreen 地区所有价格在70万以下（超过60万的房子主要是去看看他们的装修等情况，另外也有一点侥幸心理）的房子我们都看过了一遍，随着雨季的到来，房价在整体逐步下挫，但在市面上的房子也越来越少。&lt;/p&gt;

&lt;p&gt;在11月底的时候，我已经觉得有些精疲力尽了。看房是一个费时费力的过程，而那种高价而极其一般的房子又很打击人的自信心。另一方面，市场又不断放出讯息说利率可能会上调，利率也起起伏伏多次，我做了一个 Google Docs 表格来跟踪各种数据的变化，而尤其以11月末那次股市暴跌之后的暴涨最为打击人：明明看到了一个很好的买点，并且握有现金，但因为可能很快会使用这些现金，而错过了这一年中一只很大的黑天鹅事件。我在认真地考虑，是不是应该承认由于现金的不足，索性不要再考虑买房的事情，而转而投资股市。&lt;/p&gt;

&lt;p&gt;在反反复复的举棋不定当中，一晃就到了12月中。年初卖出股票的盈余，因为半年多时间不做任何买卖动作，被持仓股票的亏损全部吸收，为了避免出现大额欠税或由于短期投资亏损变成长期投资亏损导致的税负增加，我决定不再等待，直接将亏损的部分做了止损平仓。在这之前，我已经下了另外两个offer，一个被驳回但保留作为备份offer，另一个则是&quot;短售屋&quot;（Short Sale），不知道何时才能有消息。再等下去，就要到2012了，我也暗自下定决心，如果今年没看到中意的房子，2012年也不再考虑买房的事情了。&lt;/p&gt;

&lt;p&gt;这个时候，房产经纪发来了一个位于 Norwood Ave 的房子。这个房子也是炒卖的房子，在 2011 年 4 月以 $540K 法拍，然后由投资人做了装修，并在三个月后以 $670K 的价格挂出。由于价格太高，我们当时根本没有列入考虑范围。投资人在9月将房子撤市，并在两个月后再次以 $638K 的价格挂出。&lt;/p&gt;

&lt;p&gt;实地考察发现这个房子的状况很好。原先的屋主做了一个游泳池，后来又废弃，投资者将游泳池填平并种上了草皮。屋内做过重新的粉刷和装修，具体费用不详，但房产经纪认为在五万左右。经过将近两周的讨价还价，最终和卖家达成了一致。&lt;/p&gt;</description>
	<pubDate>Fri, 17 Feb 2012 18:16:26 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 最新一期的freenas测试报告</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2096</guid>
	<link>http://shell909090.com/blog/2012/02/%e6%9c%80%e6%96%b0%e4%b8%80%e6%9c%9f%e7%9a%84freenas%e6%b5%8b%e8%af%95%e6%8a%a5%e5%91%8a/</link>
	<description>&lt;p&gt;    去年我写过一篇freenas和解决方案，今年我又测试了一下，发现这玩意更加完善了，更企业化了，也更不适合玩玩了。今天写一下大概的步骤，供需要的参考一下。
&lt;div&gt;    freenas提供以下几种服务，afp，活动目录(AD)，CIFS(windows共享)，动态DNS(绑定域名到动态IP)，FTP，LDAP，NFS，Rsync，SNMP，Ssh，tftp，iSCSI。基本涵盖了非IT企业常见需要的所有服务（除了邮件服务）。目前镜像的大版本已经升级到8，所以我下到的是8.0.3，大概100M多点。&lt;/div&gt;
&lt;div&gt;    新版和旧版最大的区别在于，新版本去掉了bt下载，upnp，iTunes和http这四个家庭常用服务（实话说，http还是企业常用的）。加入了远程同步，snapshot，10G网卡等功能。内存要求也更加高，从7的256M-512M，变成了4-6G。对比起来更加企业化和专业化，但是更不适合随便玩玩。&lt;/div&gt;
&lt;div&gt;    首先，你需要准备合适的硬件。一台老式的机器，或者atom平台的mini-itx板子都是很不错的。即使是新的atom板子，便宜点的400也能弄到手，加上一条2G的内存，除掉硬盘大概也就1000。故障毕竟比较少，而且省电。存储需要一块硬盘和一个U盘，注意，两者不是或的关系。因为FreeNAS安装到某个物理设备后，会强制使用设备的全部空间，因此这个设备无法再用来存储数据。整个FreeNAS才500M，4GU盘绰绰有余，读取速度也不慢。除了升级和改配置外，没有什么太大写入，很节约。&lt;/div&gt;
&lt;div&gt;    然后，你需要去官网下载最新的iso镜像，用这个iso启动系统（注意，此时最好不要接上数据硬盘，只挂U盘）。当然，要省事的可以在windows下用vmware来装，不过对非IT专业人士来说，有点困难。启动后，在出现的选择中选择1，安装到硬盘上。在出现的安装目标选项中选择U盘（如果只挂U盘，这里就一个选项），然后等。最多两分钟，安装就完成了，选3重启系统。&lt;/div&gt;
&lt;div&gt;    去掉光盘（甚至可以去掉光驱），使用U盘和数据硬盘启动系统，并且将系统设定为从U盘启动（这点很重要，因为硬盘一般比较优先，但是硬盘上没有系统）。进去后什么都不干，会自动识别你的网卡，并且dhcp到一个ip。你可以在系统启动完成后使用选项1来重新配置ip，或者在dhcp上干脆给这个mac指定一个ip。对于使用路由器的小型公司来说，这点并不困难。&lt;/div&gt;
&lt;div&gt;    用浏览器访问这个ip，你可以看到freenas的控制界面。作为中国用户，先去setting里面改为中文，保存。然后关闭浏览器页面，重新打开（这点很重要），后面的设定都是中文了。然后，在存储，卷下面，新建一个卷。你现在可以把数据硬盘挂起来用了。&lt;/div&gt;
&lt;div&gt;    然后，再去服务里面把你需要的服务全部启动起来，并且配置合适的用户。这些就按照自己的高兴配了，界面都是中文的，应该不用我教吧。&lt;/div&gt;
&lt;div&gt;    如果无法启动服务，重启再试。你也可以参考这篇（&lt;a href=&quot;http://www.c-dd.org/post/214/&quot; target=&quot;_blank&quot;&gt;http://www.c-dd.org/post/214/&lt;/a&gt;）。写的很详细，不过他安装的版本稍旧，是7。&lt;/div&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 16 Feb 2012 19:57:59 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 简易debian livecd打造手册</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2094</guid>
	<link>http://shell909090.com/blog/2012/02/%e7%ae%80%e6%98%93debian-livecd%e6%89%93%e9%80%a0%e6%89%8b%e5%86%8c/</link>
	<description>&lt;p&gt;    废话不说，上干货。先装一下syslinux，genisoimage，kvm，debootstrap，squashfs-tools。&lt;/p&gt;
&lt;p&gt;$ mkdir debcd&lt;/p&gt;
&lt;p&gt;$ cd debcd&lt;/p&gt;
&lt;p&gt;$ mkdir isoroot&lt;/p&gt;
&lt;p&gt;$ cp /usr/lib/syslinux/isolinux.bin isoroot/&lt;/p&gt;
&lt;p&gt;$ cat &amp;gt; isoroot/isolinux.cfg &amp;lt;&amp;lt; &amp;quot;EOF&amp;quot;&lt;/p&gt;
&lt;p&gt;prompt 0&lt;/p&gt;
&lt;p&gt;default linux&lt;/p&gt;
&lt;p&gt;label linux&lt;/p&gt;
&lt;p&gt;    kernel vmlinuz&lt;/p&gt;
&lt;p&gt;    append initrd=initrd.img&lt;/p&gt;
&lt;p&gt;EOF&lt;/p&gt;
&lt;p&gt;$ cp /boot/vmlinuz-3.2.0-1-amd64 isoroot/vmlinuz&lt;/p&gt;
&lt;p&gt;    完成上述步骤后，你就准备好了一个基础的iso镜像文件系统，并有了一个基础的引导模块和内核。现在，我们尝试把这玩意烧到iso上，并且测试一下。&lt;/p&gt;
&lt;p&gt;$ genisoimage -o output.iso -b isolinux.bin -c &lt;a href=&quot;http://boot.cat&quot;&gt;boot.cat&lt;/a&gt; -no-emul-boot -boot-load-size 4 -boot-info-table isoroot/&lt;/p&gt;
&lt;p&gt;$ sudo kvm -cdrom output.iso -m 512&lt;/p&gt;
&lt;p&gt;    如果没法装kvm，换成qemu。屏幕会停在内核引导过程中——因为你没有initrd.img，所以在isolinux.cfg中指定的initrd就不正确。下面我们会设法弄一个initrd.img。&lt;/p&gt;
&lt;p&gt;$ cp -a /etc/initramfs-tools/ initramfs&lt;/p&gt;
&lt;p&gt;$ mkinitramfs -d initramfs -o isoroot/initrd.img&lt;/p&gt;
&lt;p&gt;$ genisoimage -o output.iso -b isolinux.bin -c &lt;a href=&quot;http://boot.cat&quot;&gt;boot.cat&lt;/a&gt; -no-emul-boot -boot-load-size 4 -boot-info-table isoroot/&lt;/p&gt;
&lt;p&gt;$ sudo kvm -cdrom output.iso -m 512&lt;/p&gt;
&lt;p&gt;    现在看看？你应该能看到有initrd被加载上去了，但是很可惜，没有root，因此也无法启动。所以下一步，我们需要弄一个root。&lt;/p&gt;
&lt;p&gt;$ mkdir sysroot&lt;/p&gt;
&lt;p&gt;$ sudo debootstrap &amp;#8211;arch amd64 stable sysroot/ &lt;a href=&quot;http://localhost:9999/debian/&quot;&gt;http://localhost:9999/debian/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;$ sudo chown -R user.user sysroot&lt;/p&gt;
&lt;p&gt;$ mksquashfs sysroot isoroot/rootfs -all-root&lt;/p&gt;
&lt;p&gt;    把上面的源换成你喜欢的——我用approx做了一个缓存，所以一直使用这个缓存进行加速。在脚本执行完后，你会有一个压缩为squash格式的rootfs，可以作为root。但是这个root有两个缺陷。1.不能直接mount。2.即使mount了，启动的时候也会因为只读而挂掉。所以你需要做一点调整&lt;/p&gt;
&lt;p&gt;$ cat &amp;gt;&amp;gt; initramfs/modules &amp;lt;&amp;lt; &amp;quot;EOF&amp;quot;&lt;/p&gt;
&lt;p&gt;squashfs&lt;/p&gt;
&lt;p&gt;aufs&lt;/p&gt;
&lt;p&gt;EOF&lt;/p&gt;
&lt;p&gt;$ cat &amp;gt; initramfs/scripts/local-premount/iso &amp;lt;&amp;lt; &amp;quot;EOF&amp;quot;&lt;/p&gt;
&lt;p&gt;#!/bin/sh&lt;/p&gt;
&lt;p&gt;case &amp;quot;${1}&amp;quot; in&lt;/p&gt;
&lt;p&gt;    prereqs)&lt;/p&gt;
&lt;p&gt;        echo 'iso script run'&lt;/p&gt;
&lt;p&gt;        exit 0&lt;/p&gt;
&lt;p&gt;        ;;&lt;/p&gt;
&lt;p&gt;esac&lt;/p&gt;
&lt;p&gt;mkdir /cdrom&lt;/p&gt;
&lt;p&gt;mount -t iso9660 /dev/sr0 /cdrom&lt;/p&gt;
&lt;p&gt;mkdir /cdroot&lt;/p&gt;
&lt;p&gt;mount -t squashfs /cdrom/rootfs /cdroot&lt;/p&gt;
&lt;p&gt;mkdir /shadow&lt;/p&gt;
&lt;p&gt;mount -t tmpfs -o size=128m none /shadow&lt;/p&gt;
&lt;p&gt;mount -t aufs -o br:/shadow=rw:/cdroot=ro none /root&lt;/p&gt;
&lt;p&gt;EOF&lt;/p&gt;
&lt;p&gt;$ chmod +x initramfs/scripts/local-premount/iso&lt;/p&gt;
&lt;p&gt;$ mkinitramfs -d initramfs -o isoroot/initrd.img&lt;/p&gt;
&lt;p&gt;$ genisoimage -o output.iso -b isolinux.bin -c &lt;a href=&quot;http://boot.cat&quot;&gt;boot.cat&lt;/a&gt; -no-emul-boot -boot-load-size 4 -boot-info-table isoroot/&lt;/p&gt;
&lt;p&gt;$ sudo kvm -cdrom output.iso -m 512&lt;/p&gt;
&lt;p&gt;    好，现在再make clean，make test，光盘基本就OK了。&lt;/p&gt;
&lt;p&gt;    root密码多少？我怎么知道你的root密码呢？用sudo chroot sysroot切换到自己的系统里面去改。另外，你可能需要安装一些软件，这时候记得把/sys /proc挂到chroot里面。还有记得调整一下/etc/udev/rules.d/70-persistent-net.rules，把主机里面的记录删掉（或者干脆删掉文件）。调整/etc/network/interfaces，把以下内容加进去。&lt;/p&gt;
&lt;p&gt;auto lo&lt;/p&gt;
&lt;p&gt;iface lo inet loopback&lt;/p&gt;
&lt;p&gt;# The primary network interface&lt;/p&gt;
&lt;p&gt;auto eth0&lt;/p&gt;
&lt;p&gt;iface eth0 inet dhcp&lt;/p&gt;
&lt;p&gt;    基本来说，可定制的引导系统就是这样。不过这个系统有以下几点需要注意：&lt;/p&gt;
&lt;p&gt;1.可写入数量只有128M，如果写多了就完蛋。&lt;/p&gt;
&lt;p&gt;2.128M全在内存中，内存不足完蛋。&lt;/p&gt;
&lt;p&gt;3.一次一次生成很麻烦，我用的是make。&lt;/p&gt;
&lt;p&gt;TARGETS=isoroot/initrd.img isoroot/rootfs&lt;/p&gt;
&lt;p&gt;all: output.iso&lt;/p&gt;
&lt;p&gt;test: output.iso&lt;/p&gt;
&lt;p&gt;	sudo kvm -cdrom $^ -m 512&lt;/p&gt;
&lt;p&gt;clean:&lt;/p&gt;
&lt;p&gt;	rm -f output.iso $(TARGETS)&lt;/p&gt;
&lt;p&gt;output.iso: isoroot/isolinux.cfg isoroot/vmlinuz $(TARGETS)&lt;/p&gt;
&lt;p&gt;	genisoimage -o $@ -b isolinux.bin -c &lt;a href=&quot;http://boot.cat&quot;&gt;boot.cat&lt;/a&gt; -no-emul-boot -boot-load-size 4 -boot-info-table isoroot/&lt;/p&gt;
&lt;p&gt;isoroot/initrd.img: initramfs&lt;/p&gt;
&lt;p&gt;	mkinitramfs -d $^ -o $@&lt;/p&gt;
&lt;p&gt;isoroot/rootfs: sysroot&lt;/p&gt;
&lt;p&gt;	mksquashfs $^ $@ -all-root&lt;/p&gt;
&lt;p&gt;4.可以用一个dsvc保存中间结果，我用的是git。下面是gitignore。&lt;/p&gt;
&lt;p&gt;*.iso&lt;/p&gt;
&lt;p&gt;isoroot/vmlinuz*&lt;/p&gt;
&lt;p&gt;isoroot/initrd*&lt;/p&gt;
&lt;p&gt;isoroot/rootfs*&lt;/p&gt;
&lt;p&gt;sysroot&lt;/p&gt;</description>
	<pubDate>Wed, 15 Feb 2012 17:10:21 +0000</pubDate>
</item>
<item>
	<title>@shell909090: Progress Linux</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2092</guid>
	<link>http://shell909090.com/blog/2012/02/progress-linux/</link>
	<description>&lt;p&gt;    别紧张，我不是要progress Linux，这是一种新的distribution（算是吧）。 &lt;a href=&quot;http://progress-linux.org&quot; target=&quot;_blank&quot;&gt;http://progress-linux.org&lt;/a&gt;，是一个基于Debian的dist。&lt;br /&gt;    为什么要有这个dist？其实严格意义上说，这不是一个完整的dist。不同于Ubuntu，这个dist可以完全的寄生在Debian stable(squeeze)上面。你不需要真的去官网上下载一个ISO，然后安装。只需要安装Debian stable，然后加入 Progress-Linux的source就好了。如果你胆敢在Ubuntu上这么干，只会把系统弄的一团糟。当然，直接下载Progress-Linux的安装ISO也是可以的，这个ISO基于Debian Live，作者(Daniel Baumann)本人也是DD，是Debian Live的主要作者之一。&lt;/p&gt;
&lt;p&gt;     为什么要这样？因为Debian是以严谨到变态而闻名的系统。例如，mdadm这个包有一个很小的不便。每个月当检查RAID的时候，会发一封mail。如果你有一堆电脑需要管理，这件事情就非常烦人了。要修正这个问题，只需要在其中一个脚本中加入参数-q。但是Debian修这个bug修了9个月。因为具体的包维护者并不是很关心这个事情（低优先级），而Release Term需要确保这个bug必须先在Sid中修复，确认没事了（基本是没问题的，只加一个-q而已），再修复testing的，最后修复stable的。于是，你的邮箱要被一堆垃圾持续淹没9个月。&lt;/p&gt;
&lt;p&gt;    Progress-Linux就快多了。&lt;br /&gt;    但是为什么要做成dist呢？&lt;br /&gt;    Debian的模式设计，是方便fork，而严格控制release的。Debian的版本库更新要很多条件，例如符合DSFG（也就意味着符合一系列的开源授权协议），更新的时候首先作用于SID，Release Term说了算等等。DD也没有权利要求更新Debian stable中的包，他必须申请Release Term批准。想想也能明白，如果真的每个DD都能直接更新包，那才天下大乱了。我们不能绕过Release Term去解决问题，也不想让这些问题留着。&lt;/p&gt;
&lt;p&gt;     那么怎么办？只有自己做一个仓库。Debian鼓励这么做（有很多dist就是这么做的），但是这时就不能用Debian的名字，因此作者才做了一个新的dist。DSFG这时变成了一个优势，Debian的所有包，都满足DSFG的第8条，“不仅仅对Debian授权”，可以直接应用。&lt;br /&gt;    因此，其实Progress-Linux是一个基于Debian的改进。更快的bug fix，更多的backport，更少考虑版权问题。当然，限于作者关心的包。另一个激动人心的特点是， Progress-Linux的包和backport包不会碰撞，因此使得stable可以简单的安装很多新的包。如果你喜欢，可以在安装系统后加入他的source，作为系统的改进。但是不要指望有什么实质性变化，都是一些细节改进而已。如果你希望知道几个例子，可以看这个页面（&lt;a href=&quot;http://www.progress-linux.org/project/about/&quot; target=&quot;_blank&quot;&gt;http://www.progress-linux.org/project/about/&lt;/a&gt;）。
&lt;div&gt;
&lt;p&gt;     也许你希望使用一个中国区的mirror来做这个事情（这样更快，也省去中间的一些其他麻烦），&lt;a href=&quot;http://mirrors.ustc.edu.cn&quot; target=&quot;_blank&quot;&gt;http://mirrors.ustc.edu.cn&lt;/a&gt;是debian中国区域的主镜像(即&lt;a href=&quot;http://ftp.cn.debian.org&quot; target=&quot;_blank&quot;&gt;http://ftp.cn.debian.org&lt;/a&gt;)，这个节点已经完成Progress-Linux的镜像。&lt;/p&gt;
&lt;p&gt;    Relax, I don't mean to progress Linux, it's a new distribution (kind of).  &lt;a href=&quot;http://progress-linux.org&quot; target=&quot;_blank&quot;&gt;http://progress-linux.org&lt;/a&gt;, a new dist based on Debian.&lt;br /&gt;    Why people made this dist? Technically, it is no a fully dist. Unlike Ubuntu, this dist can totally on the top of Debian stable(squeeze). You don't need to download a ISO from website and install. Just install Debian stable, and add source of Progress-Linux. It will be done. If you do something like that under Ubuntu, it will destroy your system. Even though that's possible:  Progress-Linux install CD is based on the Debian Live (the main author of  Progress-Linux, Daniel Baumann, is a Debian Developer, and he is the main person behind Debian Live).&lt;/p&gt;
&lt;p&gt;     Why? Because Debian is a preciseness dist. For example, the package mdadm had a little tiny inconveniences. It will send you a Email When check RAID every month. So if there are huge amounts of computers, it will be annoying. To fix it, one of the scripts need to be added a extra parameter '-q'. But it toke 9 months to fix it. Because maintainer don't care much about this issue, and Release Term insist this bug MUST be fixed in Sid first, then testing, finally stable. So your mailbox will be submerged under log reports for 9 months.&lt;/p&gt;
&lt;p&gt;     Progress-Linux is faster.&lt;br /&gt;    But why new dist?&lt;br /&gt;    The design of Debian, is easy to fork, but strictly in release. There are many of conditions to be met to upgrade some package, like DSFG (which means a series of open source license), upgrade in Sid first, Release Term make the decision, etc. Never, a DD can update a package in Debian stable directly. He has to ask approval from the Release Term. If every DDs can update package in stable directly, that will be the hell. DD can't cut through the Release Term, and we can't wait for the issues.&lt;br /&gt;    What's gonna do? Make a new repository! The Debian project encourage you to do so (and many dist do), but new repository can't use the name of Debian. So the author of  Progress-Linux made a new dist. Now, DSFG is a advantage. Every package in Debian is meet No.8 rule of DSFG, License Must Not Be Specific to Debian.&lt;/p&gt;
&lt;p&gt;     So, Progress-Linux is a improvement based on Debian. Faster bug fix, more backport packages, less license considering. Of course, that only work for the packages author care. Another exciting fact is, all the packages in Progress-Linux and it's backport will not clashing. It help stable to install many new software easily. If you like, you can add it's source for an enhance. But don't expect too much, it all above details. If you wanna know some of them, try this page (&lt;a href=&quot;http://www.progress-linux.org/project/about/&quot; target=&quot;_blank&quot;&gt;http://www.progress-linux.org/project/about/&lt;/a&gt;).&lt;/p&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;    Maybe you wanna a mirror in China to run update(which faster, and less trouble).  &lt;a href=&quot;http://mirrors.ustc.edu.cn&quot; target=&quot;_blank&quot;&gt;http://mirrors.ustc.edu.cn&lt;/a&gt; is the primary Debian mirror of China(alias to &lt;a href=&quot;http://ftp.cn.debian.org&quot; target=&quot;_blank&quot;&gt;http://ftp.cn.debian.org&lt;/a&gt;), which has a mirror of Progress-Linux.&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;</description>
	<pubDate>Sun, 12 Feb 2012 17:56:41 +0000</pubDate>
</item>
<item>
	<title>@shell909090: 外包和派遣的一些问题和顾虑</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2090</guid>
	<link>http://shell909090.com/blog/2012/02/%e5%a4%96%e5%8c%85%e5%92%8c%e6%b4%be%e9%81%a3%e7%9a%84%e4%b8%80%e4%ba%9b%e9%97%ae%e9%a2%98%e5%92%8c%e9%a1%be%e8%99%91/</link>
	<description>&lt;p&gt;    很多公司老总很头痛的一个问题是外包。相比自己生产程序，外包有一定的优势，也有劣势。
&lt;div&gt;优势&lt;br /&gt; 
&lt;div&gt;1.外包便宜，从实现角度，比自己养程序员便宜很多。毕竟自己养程序员还要交三金所得税，外包程序员需要自己管理自己的三金所得税——通常都不会交。所以比自己养的要便宜的多。&lt;/div&gt;
&lt;div&gt;2.在安全性上，外包并不一定比自己养程序员差。毕竟自己养程序员也没法杜绝跳槽，也没法杜绝恶意的underhand代码。&lt;/div&gt;
&lt;div&gt;劣势&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;1.不稳定，极度不稳定。能不能完成并不像自己养的程序员那样有一个项目经理在跟踪，搞不好就是到期了，基本什么都没有。虽然可以不付钱，但是被耽误的时间更麻烦。&lt;/div&gt;
&lt;div&gt;2.逼良为娼。如果你的需求类似一个论坛，他们就会诱使你做一个论坛。论坛可以用开源的项目经过定制和修改来完成，看起来工程浩大牛逼XX，实际上没花多少时间，实现小开销大收入的目的。如果你真的没被说动，他们会先答应你的一切需求，等期限快到了再告诉你，论坛做起来很快的，改一点需求吧。如果再说不动，参考问题1。&lt;/div&gt;
&lt;div&gt;3.良莠不齐。多年筛选下来，很多优秀的，可靠的外包团队真的很厉害。但是混事的团队混事能力也很厉害，很多问题说的头头是道，价钱也比正儿八经做的便宜不少。你觉得便宜的就是混子？错，有时混事的团队比正经外包公司还贵。万一一个没看准，那就又参考问题2了。&lt;/div&gt;
&lt;div&gt;4.外包没法解决资金来源。很多老板对这个问题只会哈哈一笑，不过有的时候这确实是个问题。不是每个外包团队都能提供发票的，很多团队没有挂靠公司，或者挂靠公司但是发票加税点。这时候你开出来的外包费用就无法按照服务费计算，只能当作其他费用处理。要么你自己找发票填上，要么就扣税。&lt;/div&gt;
&lt;div&gt;    我看下来，愿意做外包的老板，大概不足一成，而且大多都是逼上梁山没办法了（要么人力来不及按时完成了，要么没人会做了），才外包一部分。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;     相比起来，人力资源派遣是个新行当。这行当和外包差不多，只是他们不分离做，他们找人去你公司做。&lt;/div&gt;
&lt;div&gt;优势&lt;/div&gt;
&lt;div&gt;1.你的项目经理可以盯着他们了。&lt;/div&gt;
&lt;div&gt;2.派遣多数都是从公司来的，大半有发票。&lt;/div&gt;
&lt;div&gt;3.你让干吗就干吗，不行滚蛋。&lt;/div&gt;
&lt;div&gt;劣势&lt;/div&gt;
&lt;div&gt;1.可没比自己养程序员便宜，搞不好还贵。&lt;/div&gt;
&lt;div&gt;    所以很多公司对人力派遣也不是很喜欢。不过我说句实话，要是需要一个特殊类型的人才，预计时间不长，或者想试用一下，不妨考虑考虑。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;    目前很多外包也参考了HR派遣的做法，他们的做法是这样的。谈项目。达成协议。派团队去你的公司，该干吗干吗。验收。撤回团队。&lt;/div&gt;
&lt;div&gt;    你的项目经理可以随时验证他们的工作，因此也不会出现逼良为娼的情况。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;    但是无论如何，请自己找一个项目经理！不要让你的程序员来做项目经理的事情，更不要指望什么都不管丢钱下去程序就会自动长出来！&lt;/div&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 09 Feb 2012 23:01:39 +0000</pubDate>
</item>
<item>
	<title>@shell909090: lfs under debian注记</title>
	<guid permalink="False">http://shell909090.com/blog/?p=2088</guid>
	<link>http://shell909090.com/blog/2012/02/lfs-under-debian%e6%b3%a8%e8%ae%b0/</link>
	<description>&lt;p&gt;1.严格按照说明做，少看一点无关内容后面就一堆err了。
&lt;div&gt;2.新分区大点，4G不够的，最小用8G。我用了20G的，硬盘不值钱。另外说一句，并不是4G不能够做到，而是你可能被迫删除不少有用东西，或者是移到其他位置，增加复杂度。&lt;/div&gt;
&lt;div&gt;3.每次你进入一个section，以前针对这个包进行解压，打补丁，并修改的source都作废了。直接删除它们，然后重新解压。lfs不依赖于以前解开的源码，在任何一节的开始都不需要翻以前怎么处理（解压，打补丁，修改）源码的。你在任何一节都可以（并且必须）独立操作源码。&lt;/div&gt;
&lt;div&gt;
&lt;div&gt; 4.mawk会出错，装一个gawk。&lt;br clear=&quot;all&quot; /&gt;
&lt;div&gt;5.yacc没有的时候，装bison，it's works。&lt;/div&gt;
&lt;div&gt;6.如果碰到见鬼的tar.xz，用tar Jxf。或者更简单的，现代tar都支持xf直接解压，不用再自己选择zjJ。&lt;/div&gt;
&lt;div&gt;7.chapter5的流程？先用系统的编译器编译了binutils，gcc和glibc，然后再用刚刚编译好的再编译这三个，这样编译系统就统统连接到了/tools上。然后用/tools的连接编译了一堆编译用工具，bash啦，make啦。这样，就完成了编译环境的建立，/tools是一个独立于主系统的，完整而可用的编译系统。用这个编译系统编译任何东西的结果应当是相对可控的。&lt;/div&gt;
&lt;div&gt;8.如果我是你，在chapter5完成的时候会tar czf ~/tools.tar.gz /tools。这样会让你在chapter6中犯错的时候不至于血本无归。&lt;/div&gt;
&lt;div&gt;9.chapter6的流程？用chapter5的编译系统，编译了新系统的编译系统。当然，这个不容易，因为刚刚的编译系统所有指向都是/tools。所以lfs指导你做了不少patch。然后重复chapter5的过程，逐步把源码编译安装到正式系统中。&lt;/div&gt;
&lt;div&gt;10.lfs真TMD的辛苦，连source code的typo都需要在书中指出和fix。。。而且lfs自己还有errata。&lt;/div&gt;
&lt;div&gt;11.lfs的56两章看起来像是两个人写的，风格习惯不一致。chapter5用“，chapter6用$()。还有gcc-pass2的时候，cp -v XXX{,.tmp}; sed XXX.tmp &amp;#8230; &amp;gt; XXX。而chapter6的binutils则是sed -i.bak。当然，有可能是因为有些系统的sed不支持-i，例如redhat的系统始终不支持netstat -nlp46，I hate it。BTW，我喜欢sed -i。&lt;/div&gt;
&lt;div&gt;12.编译过程真心傻X，大部分都是解开源码，configure &amp;#8211;prefix=&amp;#8230; &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make check &amp;amp;&amp;amp; make install。这些过程好像可以用一个不知道啥脚本来简化，建议不要手工干这堆事情，没意思的。相反，倒是很多调整有些意思。&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 08 Feb 2012 23:04:06 +0000</pubDate>
</item>

</channel>
</rss>

