delphij's Chaos
选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……
FreeBSD 开始用 10 以上的版本号有一段时间了。这个变动立刻导致了大量 ports 无法编译,多数情况下是因为开发者采用了较早版本的 libtool 导致的,具体来说,是类似下面的代码:
case $host_os in
freebsd[123]*) objformat=aout ;;
*) objformat=elf ;;
esac
解法是在星号前面加个小数点。
前段时间的半夜 make 总是在 OpenOffice 上通不过,结果发现是同样的原因。囧死了……当初匹配的时候打个.会死吗?
(这个问题已经在 libtool 2.4.2 以上版本中修正)。教训是,即使是代码生成器,重复的代码导致维护成本的增加。
Read more...目前多数软件产品的安全更新都是在周二或者周三公布了。这种做法 据说 是微软开始采用的,不过具体是谁先开始这么做,目前我还没有找到非常可靠的资料。
一般来说,软件开发者在发布安全更新之前,需要做下面这些事情:
而在用户这边,通常也需要进行少量的测试才可以大面积部署。由于时差的原因,周一或周五发表安全更新有可能会导致有些人必须在周末工作,因此不合适;周三发表安全公告会给 IT 人员留下充足的测试和部署时间,同时又避开了周末。
Read more...之前只有一篇关于较早版本的 strlen(3) 实现的笔记,这里补上我在 2010 年做的新增改进。
与 Pascal 等语言不同,C 的字符串并不保存串的长度,而是在字符串末尾以 nul 字符(’\0’)来表示字符串结束。这个设计决策是上世纪 60 年代作出的,有都市传说是为了省几个字节的空间,不过我个人认为也可能是因为汇编里面到处都是判断是否碰到了 0 的操作。不管怎么说,这个设计令 strlen 变成了一个 O(n) 的操作。
早期的 BSD Unix 采用的 strlen 是非常简单的循环比较每一个字符是不是 nul。1993年,J.T. Conklin 为 i386 系统撰写了一个汇编的版本,这个版本的核心用的是 REP SCASB,实际上和 C 版本的算法是一样的(不知道为什么 C 编译器不能写出同样的代码)。
为了配合 x86_64 平台,后来又有了一个新的汇编版本,这个版本的核心算法是按字匹配,找到包含 nul 字符的字之后,再在其中用原始的算法找到 nul 字符。
我在 2009 年根据这个 x86_64 版本的汇编的思路重写了一个 C 的版本,并在 2010 年做了一次最终的变动,形成了目前的版本。这个版本的大致流程如下:
实现细节
整个算法中,比较难理解的是判断字中是否带 nul 字符。具体的方法是计算两个中间变量:
a = (x - 0x01010101)
b = (~x & 0x80808080)
这里的 0x01010101 和 0x80808080 可以进一步扩展。第一步,如果每个字节都 <= 0x7f,只要那个字节不是 0,做差必然得到一个 < 0x80 的结果(换言之,最高位是0);如果有字节 >= 0x81,做差必然得到一个 > 0x80 的结果。对于等于 0x80 的情况,我们会得到 0x7f,但这并不重要。
Read more...最近两次失败记录的教训。
首先是联编 world 和 kernel (make buildworld buildkernel),这个没啥可说的。假定 / 是 UFS(即,可使用 nextboot),且配置了 watchdog,则操作步骤为:
shutdown -r now
mergemaster -Ui
当然,更简单的方法是先接好IPMI。
Read more...可以在 这里 下载。
和过去一样,风险自担 USE AT YOUR OWN RISK!
这个版本 (20120402) 和上一个版本 (20120114) 相比的改动:
全部改动来自 -CURRENT 或 -STABLE,并已经做过至少两周的疲劳测试。
Read more...今天在电视上看了 C-SPAN 上播出的伯南克讲联储局与经济危机(也可以在网上收看)。之前一直不太明白的一些问题得到了解答,不过还是有一些别的问题不太明白。
伯南克讲了联储局的历史、联邦储蓄保险公司FDIC,金本位,以及大萧条相关的话题。其中,FDIC是罗斯福新政保留至今的一部分。银行在放款之后,手头的现金一定小于储户存入的金额,此时如果出现谣言,那么每一个人合乎逻辑的行为便是去银行排队挤兑,因为如果去晚了,银行可能已经被前面的储户挤兑而没有现金了。另一方面,挤兑会产生连锁反应,谣言会越传越厉害,而银行一旦被挤兑,为了支付现金就必须卖出资产(通常是折价卖出),这会进一步加剧其资金短缺现象并真的导致倒闭,而一所银行倒闭了,会导致其他银行倒闭的传闻显得更加真实。在FDIC出现之前,银行能采取的基本就是一个字拖,暂时关门不支付任何现金,并继续收取贷款付款。在 1933 年的银行业重组中,全美国的银行宣布休假,并逐一核对其资产负债表,恢复其中合乎条件的银行的运营。FDIC实际上扮演的是一个担保人的角色,它以政府的名义担保储户的存款(因为政府的信用有税收等做为担保),这种做法要比银行之间的互相担保有效,事实上在那之前纽约的银行业已经出现了这种互相担保的做法,而显然多家银行之间做短期拆借是不足以抗御集体挤兑的。FDIC的出现,解决了那些不良资产比例不太大的银行关闭导致普通人无法获取现金来购买日用品、食物等基本生活保障品的问题,并使挤兑不再必要。
后面关于金本位的讨论很有意思。伯南克认为大萧条中通缩起了关键性因素。由于经济过热,金本位导致通缩,而通缩导致生产者收入下降,而他们很多是靠贷款来购买生产资料,这样一来生产者破产,从而银行跟着破产,进而引发更进一步的经济危机。这个解释了为什么他在任的这段时间不停地采取量化宽松措施来人为增加货币供应量,不过问题来了:如何在这种情况下阻止经济继续过热呢?因为量化宽松会导致利率下降,这会导致融资成本下降,我认为这种措施似乎比较适合生产过剩引发的经济危机才对?
另一个关于汇率的讨论也比较有意思。他提到中国有很长一段时间的汇率是和美元绑定的,而不是采用浮动汇率。这样,美国因为国内经济需要调节汇率的时候,便会间接影响中国的经济:美国降低利率,假如中国不跟着一起降低利率,便会将通胀输出到中国(由于美国的经济规模更大,以及美元的世界结算货币地位,这种输出是单向的)。所以在继续绑定汇率的前提下留下的只有一个选择就是降息(相当于两国事实上使用的是同一种货币,为了避免外汇流入,就必须跟着调整利率),而这种选择未必是适合中国的实体经济的。
我个人总的感觉,美国的这个经济模式的问题在于,需要一直维持一定的通胀率来避免出现金融危机(显然,金本位是无法适应这个需要的,因为从非洲运黄金到纽约的联储局金库成本相当高),而另一方面,生产不可能无限制地不断膨胀,难道说只能过段时间就果断来一次经济危机来缓和一下?
Read more...发现前面写的完全没什么逻辑,等有时间再来整理吧。
关于贷款。这个主要是我自己的理解总结,不一定对,仅供参考。
在美国,贷款的利率是由几个因素决定的。
首先是和股市类似的"大盘",或者说"基准利率",这个利率是以美国政府发行的中长期国债利率决定的。国债一旦发行,其票面利率便确定了,那么为什么说它是"大盘"呢?因为投资者随时可以在市场上买进或卖出国债,这样一来国债成交的价格便可能不同于其票面价值。假如国债价格下跌,也就意味着实际利率的上升。反之,如果国债价格上升,也就意味着实际利率的下降。
在投资者方面看到的效果就是,如果有大批资金涌入国债,推高其价格,那么新买入国债的人拿到的收益便会减少(因为最后还本付息时是按照票面的本金和利率);反之,如果大家发现有更好的投资纷纷卖出国债,导致其价格下跌,则新买入国债的人拿到的收益便会增加。
为什么美国国债如此重要呢?因为美国国债是目前市场上普遍认为风险最低的投资(说句题外话,如果发生了美国国债危机,则一定也会出现另外一种债券来替代它的地位,不过这个几乎是不可能事件)。另一方面,一般来说,如果债务人信誉良好,贷款债权也被认为是风险较低的投资,但这个风险仍然高于美国国债。既然风险高,那么投资者当然也就希望获得更高的回报,这个回报便反映在价格上,即贷款的利息。
因此,通常银行提供的贷款利息的基准利率,便是国债的市场收益率加上一个数额。这个数额的多少,取决于贷款人的信用分数(FICO Score)。
所以我们会看到一个很有意思的现象:在股市大盘下跌的时候,由于许多投资人会选择撤出资金投入债券市场而推高债券价格,从而降低债券收益率,进而促使银行降低贷款利率;反之,当经济复苏,大量投资人卖出债券并买入股票时,银行也会因应提高贷款利率。
还有一个潜在的外力因素是美国政府(具体实施可能通过央行,即联储局)以"量化宽松"的形式买入债券,或外国政府大量买入债券,从而推高债券价格。此时发生的效果和股市大跌类似。
有时,银行也会考虑未来的利率走势,例如,如果银行预期未来贷款利率会大幅提高,则固定利率的贷款利率会开始有所提高,等等。
常见的贷款形式包括头5、7甚至10年固定利率的30年期可变利率贷款(ARM),以及十五年、三十年期的固定利率贷款。对债务人而言,利率固定的时间越长,未来的不确定性就越小,但对银行而言的风险也就越大。由于银行承担的风险不同,它们对应的利率也依次提高。
Read more...最近在琢磨一个产品里实现全盘加密的问题,简单来说就是加入存储卷的硬盘存储的是完全加密的数据。对于保存机密数据(例如患者数据)的存储设备来说,这一点十分重要,举例来说,如果硬盘出现故障,OP可以直接把硬盘拆下送回厂商,而不是必须做抹除数据的动作。
之前以为 AES-XTS 会导致延迟,实测发现 FreeBSD 的 GEOM_ELI 实现(配合 Xeon 5600 系列的 AES-NI 指令集)其实已经可以做到几乎没有差异了。因此,大致的想法是:
做了个原型出来,先测测再说。
Read more...前面几乎是流水帐,这里说说一些对其他人更有参考意义的话题。
第一个话题是,如何确定应该出价多少。
这个问题其实非常非常的复杂,出价之前一定要先做足功课。我的建议是在 Zillow 上研究附近房子最近的成交价,并仔细做实地考察。Zillow 会给出一个它的估价,但这个估价只能作为参考,并不一定准确。
另外一个估价指标是房子的在市时间(Days on market)。资本主义市场经济的效率是很高的,价格合适的房子,除非是经济危机的时候,否则不太可能出现长时间卖不出去的情况。假如一个房子在市场上呆了30天还没有任何人提出购买意向,通常都是因为要价太高。遇到这种情况,假如房子本身没有特别不可接受的问题,就可以考虑狠狠砍价。
还有一个非常重要的指标是房屋是否有未经许可的改建。在加州,屋主如果对房屋进行了加盖、内部增加或拆除墙壁,改装车库等,而没有事先取得许可,则在交易时这些部分是不被认可的。买家可以要求卖家还原、取得许可,或砍价。不过,对于不太正常的交易,例如购买短售(short sale)的房子,卖家可能选择什么都不做。
由于之前银行不负责任地随意放贷,许多屋主的房子由于周围房子遭到短售或法拍(Foreclose),导致其市场价值跌到了贷款金额以下。一些屋主此时会选择不再继续缴放贷,导致自己的房子被短售或法拍。作为一个拥有相当健全法律体系的国家,美国对于这种行为是有约束的,尽管银行可能同意以短售所得金额将欠款一笔勾销,但欠款总额与短售所得的差额,有可能会作为债务人当年的个人收入而课税,假如差价达到30万的话,相当于一下子在当年多出了30万的收入,尽管债务人可能一分钱都没有拿到,但却还是要缴纳联邦税和州税。
一旦短售或法拍交易成功,这些价格就会反映到(拉低)周边的房子的价格上,因为估价时是按周围房子做的参考。在出价时,需要考虑这些交易可能产生的影响,最好是在 Redfin 或其他网站上检查一下附近的短售情况,或请自己的房产经纪提供数据做一些判断。有时,房产经纪能够提供更为全面的数据来帮助进行决策。
一般来说,出价不应低于要价的95%—-尽管我个人并不非常认可这种说法,但有些卖家经纪可能根本不会去回应这样的购买意向合同。如果你认为一个房子要价太高,但又觉得房子本身不错,个人认为比较好的做法是口头询问对方的经纪,或者去Open House看一看是否已经有人出价,等等。假如没什么人出价,则应坚持自己的价位,或者等一段时间再说。持有房产的人需要缴纳房产税,所以长时间持有不住的房子对他们来说是现金上的损失,并不是所有的投资者都能够扛过这一关。
在有些地区,出价必须比要价高。这种现象往往会出现在学区非常好的地区,例如 Cupertino。在卖方经纪看来,高出价和直接现金支付相比,他们很可能更倾向于选择后者。需要注意的是,今天需求旺盛并不必然带来未来需求的旺盛,在高价位买房可能能赚到一大笔,但也可能会缺少成长空间。
在决定出价之前,还需要对房屋状况做大体的检查。一般来说自己可以做的检查包括:
多看Open House,多做笔记,有助于了解市场行情。经过一段时间的了解,往往就可以在进入一个房子之后给出大致准确的估值了。
Read more...前面已经说过,我认为房地产在很多时候并不是好的投资,但是因为要一次性投入相当多的资金,因此就有必要认真考虑是不是真的应该买房。在和一些也在湾区生活或生活过的朋友交流之后,我大体确定了几个条件:
在 Redfin 上研究了一段时间以后,首先排除了 Fremont 和 Cupertino 两个地区,前者是因为与南湾主要的连接是880公路,距离较远且上下班时间经常出现堵车;后者是因为价格太贵。最后,基本上选定了 San Jose 的 Evergreen 社区(邮编 95148 和 95135 交界附近的地方)。
Read more...