十一月 18, 2006

写软件的人,在以前单机软件的时候,最怕的就是被盗。一旦软件被人盗了,收入就算有,也是少了很大一块。到后来,写软件的人把很多工夫花在防盗版上面,反复的检测是否用户在使用盗版。有矛就有盾,有了防盗版功能,也就有了反防盗功能。你前面费尽心机检测这处理那,你最后让不让用户使用,就取决于那个

jne 0×12345678

是跳转还是不跳转。这个行档还真培养了不少的汇编高手。而软件作者也只好提升自己,把汇编技巧玩到极致,什么回退执行,自修改代码,结果软件本身的特色倒不是最花时间的,反而是盔甲穿了一身。最后金山词霸的38元策略,算是给了一个了结:利润低到这个份上,连盗版都不能吸引人了,正版才获得了血淋淋的胜利。

网络来了以后,软件可以变成服务,从卖光盘变成了卖广告。张朝阳从美国带来了雅虎的copy,变成了搜狐;邵亦波带来了易趣;于是大家知道了亚马逊,知道了google,知道了digg,知道了blogger.com,知道了icq,知道了你有什么,我就有什么。

别误会,我不是在说当当,百度,板砖,blogbus,QQ他们不好。模仿作为一种商业行为,是无可厚非的。因为前面有经过验证可行的实践,所以模仿是一种降低风险提高成功可能的有效方式。从商业上说,能够规避风险是正当的。我这里想说的问题是:

在互联网时代,一个网络公司的模式可以被几乎无成本的模仿,这是一个事实。那么,作为一个小的公司,如何才能有效的在短期内和模仿者拉开距离呢?

我能想到的有这么几条:

1 资金。如果具体的业务需要大量的资金,那么在找到风投以后,就可以通过资金来摆脱大量的小模仿者。

2 用户群。我一直以为,丁磊是互联网1.0时代理解最深刻的人,他那么早就提出“网聚人的力量”。巨大的用户群本身就是不可替代的资源。

3 规划。一个好的商业模式应该是一目了然的,这话没错。但是一个好的商业模式是否应该是对任何人都是一目了然的呢?我想未必。一个商业模式如果不被挑明,那么最好对大多数人来说是不明确,甚至是不看好的。如何合理的部署资源,在最后才表现出以前部署的用心,需要仔细的规划。

4 技术。尽管中国互联网这行,被很多人说成是技术含量为零。不过,技术的确能够起到壁垒的作用。

 

九月 5, 2006

tinyfool 曾经为我们翻译了google的mapreduce,这次郝大侠再次出手,惊艳一刀砍在这里:

http://googlemapsapicn.blogspot.com/2006/09/google-maps-api.html

翻译是很累人的一件事情,东西不是自己写的,领会精神是第一步,然后还要翻译成另外一种文字.严复老先生的”信达雅”三层标准,单是一个”信”字就是一座高峰,而”信达雅”在一起简直就是”三座大山”,挺立在后来者的面前 :) 而翻译计算机文档,除了英文和中文的基础必须扎实,计算机的功力也必须深厚才行.所以,在联系中西方文化的纽带中,如tinyfool这样的专业的翻译人员,更是难能可贵.更加可贵的,是他在利用自己的业余时间,为大众做贡献.

虽然业余时间翻译文档,未必能够成为一种产业,但是在王建硕的”让我们吹捧出中国自己的产业来“里面所提到的互相赞美,互相鼓励的精神,我是完全的赞同.让我们在接受大侠们无私帮助的时候,为大侠喝一句彩,看着大侠飞驰而去的身影,道一声”珍重”.

 

六月 27, 2006

今天摆弄了一会儿regular expression,觉得这个东西是越用越喜欢.不禁纳闷,当年我怎么不喜欢它呢?仔细回想了一下,哦,原来当年学的离散数学书里,把这个东西翻译成”正则表达式”.

//这里小小的科普一下,所谓regular expression,说白了就是说一串字是什么样的,比如说,”一串仨字,全是数字”,或者说,”一串数字,中间有个小数点”.写成计算机认得的格式,就是regular expression了.

当年读书的时候,有一种誓把牛角尖钻破的劲头,于是就琢磨,为什么叫正则呢?为什么不叫”普通表达式”呢?这里面一定有原因!前辈大牛断不可欺吾!这一琢磨,就走火入魔了.其实,不就是普通的,可以用规则来描述的东西嘛.创造它,是为了省事,一堆东西用一个规则就写出来了.可是,翻译的时候,前辈大牛,你为何要用如此晦涩的词语呢?

现在想想,我一直是以貌取物的.以前看到曲线就烦,直到看到一本可以看立体曲线的数学书.这种以貌取物,最终影响了我对算法的印象:

当年我们的算法书,是影印的英语书,经常看两行就有三四个单词看不清,好在这个模糊的出现是随机的,找另外一本看看就知道了.纸也是质量很差的暗色,如果用钢笔写上去,立刻洇一大块.书的问题可以克服,可是算法老师,据说是海龟,每天来上课,蓬头垢面说不上,可是明显的没有认真梳头.拜托,您是女老师啊,认真看看,也就30左右的样子吧.求求您至少一个星期换一次衣服吧?您至少是大学老师啊.每天上了讲台就黑着脸开始用中文念书,同学提问就恶狠狠的用英文重复念一遍,我们就更听不懂了-不是我们英文不行,实在是,实在是老师您的英文不象英文啊.

这样的老师严重的打击了大家对算法,对海龟,尤其是女海龟的憧憬.本来数学的东西,本质上没有什么特别的,如果上来把核心的想法解释清楚了,再把具体的作法过一遍,相信很多人能理解.可惜,我们的这位老师,以拒人于千里之外的态度,活活的把我们这么重要的一门课,给耽误了.

 

二月 8, 2006

今天照例去keso的网摘里面挖东西,看见这么一位,看了看他的文章,觉得对cache的分析很有趣.

在我看来,cache的存在是因为信息传递的速度有限制.且不说光速这个物理上限,现在芯片内部的信号速度比光速是低了许多倍.而如果要计算,目前体系结构所要求的前提是数据必须在足够接近的地方:比如说加法器里.而数据(信息)的传输是需要时间的,越快的传输通路,价格越贵(否则就都去用又快又便宜的了).因此,在便宜和速度之间的折衷,就是cache.

Cache能够有效果,一个不可忽略的因素是数据的局部性(data locality).CPU要访问的程序的代码(也是数据)和数据,在一定时间内是局限在一定的空间内的,所以cache才能容纳下这些数据,而不至于反复被刷新.Cache容量不够,系统就会throttle,记得好象是翻译成”颠簸”.

折衷是计算机体系结构里边的精髓,绝大多数的优化,无论是速度,可靠性,还是能耗,都是建立在对某种应用的折衷之上的.

推而广之,在计算机之外,internet上也是cache的天下.同样也存在着性能价格比的折衷.而且这里还有availability的问题,服务器断了,可以看做是速度无限慢的一种存储器,就可以归纳进cache的结构里了.

Cache也有自己的问题,主要是一致性.在体系结构里,每两个存储层次之间就要有一致性协议.保持时时刻刻的一致性是没有必要的,同步只要发生在读取之前就可以了,或者使用speculative的算法.速度不同的器件使用的一致性算法也不同.

Cache的另外一面: 

Cache的广泛使用也导致了cache占用了大量的资源,intel的CPU,cache已经接近(或者超过了?)硅片面积的一半,而能耗也增加了,而且更加复杂的置换算法使用的能耗剧增,却没有提高MIPS,整体的结果是bit / watt下降.在我以前和同学做的一个项目里,减少associativity,使bit / watt增加了.所以目前的intel CPU里,容量大的2级cache都是直接映射的.

比较新的研究方向,是把计算和数据放在一起,避免大量的传输数据,减少使用cache.

一月 24, 2006

题在这里:

http://blog.donews.com/wysuperfly/archive/2005/12/22/667661.aspx

简单说就是:一个表示为I.F(L)*的有理数,如何转换成分数.

三部分:

1.处理输入字符串,找出循环小数的循环部分和前缀. 1.234(56), 1.23是前缀,(56)是循环部分. I.F(L)*,I.F是前缀,L是循环部分.利用*,+就可以做了.

2.转换成分数.对前缀,分子用前缀串,分母用10的N次方,N是前缀的小数部分.对循环部分,分子是循环串,分母是10的M次方-1,M是循环串长度.用正则表式法会更清楚,不过太长,不写了.其实就是:

IF / (10^(length_of(F))) + L / ((10 ^ (length_of(L)) - 1) * (10^(length_of(F))))

3.用中国最大公约数算法约分,加和.

算法有了,翻译成程序就好了.

Tricks:

有理数是字符表示,处理I, F, L的时候用三个字符指针分别指向I, F, L.而’.'和’(', ‘)’都被转换成0,作为三个新字符串的结尾,就避免了重新分配内存.如果要保证输入数据不变,改回来就是了.

约分的时候有一些小trick可以防止溢出,比如说如果有F,那么分母肯定是2和5的倍数,如果有L,那么分母肯定是9的倍数.先把这些从分子里除去.