Shell's Home

预言和伪预言的几项判定

Jun 25, 2012 - 1 minute read - Comments

人类很信算命,世界各地各种预言层出不穷。我碰到过真的预言,也碰到过假的。当然,真的预言并不代表我相信对方的宗教,或者其他的什么。只是说,对方的预言是有效和正确的。而假的预言,不消说,就是指预测是无效或者错误的。有很多预言披着各种外皮,让你觉得像真的一样。所以我提出几个观点,来区分两者。 预言的结果总是增加信息量。这是预言判定的大纲。如果一个预言没有增加信息量,那么就不是一个有效预言。 预言是对未发生事情的断言。预言的主体事件必须清晰明确。反例如:明天下午,你身上会发生一些事情。废话,只要我醒着肯定会发生事情,这种预言无论对错,是无效且无用的。 预言不得以隐喻,暗示方式说出,解释上亦不得附会。例如:推背图,爱怎么解释怎么解释。 预言的时间和地点可有可无,但是如果有则必须符合事实。如果时间,地点,事情细节不完全吻合,可以称为“带误差的命中”。 预言必须是可验证的,不可验证的事情不叫预言。反例如:下辈子你会投胎成什么。。。这怎么验证呢? 预言不可以是自实现的。反例如:很有名的股市预测者预测股市涨跌,这属于“自我实现的预言”。这种情况很特殊,因为预言本身是有效的,而且是会实现的。但是不是以某种神秘的方式,而是可知的心理学。 预言的总体必须是常人无法推测的小概率事件。反例如:你一个月内将会吃到一次米饭。废话,这TM不叫预言,叫2B。 对预言者的分析,必须注意“多次预言”,或者隐性的”多次预言“。反例如:找1000个人,然后分别为他们预测股市。你只要对一半人预测涨,一半预测跌。理论上说,应当有一个人会连续预测中10次。这是符合上述规则的预言,但是是无效的。类似手法经常用于短信诈骗,群发短信预测股市,对预测正确的再进行预测,最后就有一批人会觉得预测者很神奇,从而容易轻信对方要求代为理财的言语。 因此,承8。对不同人,预言同一事物,必须做出一样预测。 承9,如果你不能确定预言者散布预言的范围,以及范围内是否都听到同样的预言,那就是一个无效的预言。 同样承8。在预言帝,章鱼哥之类的事务面前,你要考虑总数有多少类似的预言者在进行预言,其中有一个人做出了全部正确预测是不是一件很奇怪的事情。当然,这并不否认预言者可能是真的具备预知能力。只是以统计而言,无法区分是真的具备预言能力还是仅仅是统计上的胜利。 承1, 8,判定预言的终极方式,是将预言者对于某一事务的所有预言进行收集,计算其正确率。如果这个正确率高于热噪声选择的平均正确率向上修正三倍方差,那么这个预言者就是有效预言者。

快速深入一门语言的几个问题

Jun 15, 2012 - 1 minute read - Comments

劳资明天要结婚了,今天婚前最后一个blog。 1.hello, world 目标:屏幕上打印出hello, world。 原因:不解释。 进阶:当命令行给与不同参数的时候,打印hello, 名字。给与开关的时候,打印hello, 123。 2.正则提取 目标:写一个正则表达式(或者类似的东西),从一段网页源码中找到某个标签的内容,去掉前后空格,显示。 原因:测试字符串处理能力。 进阶:支持正则扩展 3.扫描排重 目标:将某个目录和子目录下的所有文件扫描,排除重复的文件。 原因:测试文件系统操作能力。 进阶:多线程处理,注意吞吐颠簸。 4.做24点自动计算程序 目标:写一个程序,能够计算24点。要求能够自定义扩展算符。 原因:检查深度优先搜索,栈,结构设计,抽象处理能力等等。 进阶:做并发处理。有数种语言可能无法实现并发,或并发实现难度大,不美观,例如python。 5.做一个计算器 目标:做一个计算器,要求能计算1+2*3=7,并支持()。 原因:表达式解析和处理需要用到程序的方方面面,字符串处理等等。 进阶:做一个本语言的eval函数出来。 7.抓网页 目标:实现一个服务,定期下载符合规则的一批网页,解析,获得格式化的数据,并存入数据库。 原因:测试系统开发能力,基础网络库,字符串处理能力。 进阶:分布化抓取。 8.留言板 目标:设计一个留言板,将所有人提交的话保存起来,能一并展示。提交不需验证,展示不需分页。 原因:测试网络服务能力,数据库支持和多国语言支持。 进阶:防止XSS攻击。 9.异步大并发服务器 目标:设计一个异步http服务器,能对请求做出响应,添加,删除,修改数据库中的数据。不得使用现有的http框架和容器。 原因:集成性测试 进阶:不使用现有数据库,自己写一个。。。

multiseat简说

Jun 11, 2012 - 1 minute read - Comments

简述 这篇文章说的是如何实现multiseat,必须的条件和步骤等等。 首先简介一下multiseat。multiseat又叫做多座电脑,和瘦客户端(thinclient)一样,是一种降低电脑平均使用成本的方案。基本思路是,买一台稍好的物理机,然后买两个显示器和键盘鼠标,让两个(或者多个)人同时使用一台电脑。和瘦客户端一样,multiseat一般只用于对电脑计算能力要求不高的场合,打游戏的一般就别考虑了。和瘦客户端不同的是,multiseat的处理都在近程,所以在体验上会略好一些,部署时也不依赖于中心化网络。不过这些年网络设备都在改善,相差也不多。 硬件解说 显示系统 显示系统通常分为显卡和显示器两部分。multiseat至少需要两个显示器,但是两台显示器输出有多种情况。 单卡单核心双输出。一块显卡,一块核心,pci上就一个物理设备,但是可以输出到两台显示器上。例如笔记本,一个输出到本子上,一个输出到投影上。大部分机器都是这种情况。 单卡双核心单输出。又叫做单卡双核心交火。交火是一个ati术语,在nv那里叫做sli。是指用两块显卡为同一个显示进行加速,达到比一块显卡更快的情况。这一般是顶级显卡。 单卡双核心双输出。在单卡双核心单输出的卡上,一般都有两个输出。如果接入两个设备,那就是双核心双输出了。 双卡双核心单输出。又叫做双卡交火,在pci上有两个物理设备。同样是为了游戏而生的电脑。 双卡双核心双输出,两个pci-e。在上面的基础上,多接一台显示器。 双卡双核心双输出,一个pci。很少见,一般都是图形工作站。 之所以在这个问题上说这么细,是因为多X方案必须工作在两个以上核心上,每个核心分别输出一路。也就是说,上文中的3, 5, 6三种情况。我们最常见的1是不可以用多X方案的。而方案5, 6,是这么分的。一般的显卡都是pci-e的,而一块主板上只有一个pci-e插槽。所以普通主板是配不上两块普通显卡的。也不要考虑板载显卡和外接显卡的问题,卖电脑的说,大部分主板上都做了自动屏蔽。外接显卡一插上去,板载显卡自动屏蔽。 键盘和鼠标 multiseat至少两套键盘和鼠标,这是常识。 声音和外设 做的好的multiseat,尤其是搭配硬件卖的商业方案,一般都会做声音和外设隔离。你接上去的u盘不会出现在另一个人的电脑里。不过有些方案的隔离就不是那么完美,有可能只有主座有声音拉,或者是声音不能用拉。或者是自己指定声音输出到哪个设备,然后再抢耳机拉,或者是干脆多装一块声卡拉。这个问题自己留心。 windows windows下可以用softxpand[2]或者betwin[3],俗称拖机软件,不过两者的破解都不是很好找,尤其是win7可用的。windows下拖机的后果可能是,D3D加速有问题,两个人同时用的时候CPU使用率升高,其中一个人没有声音等。具体情况你设法下到试试再说。 linux 以下linux,没特别说明的话都是指debian,默认的发行版本是wheezy。 多X方案 所谓多X,就是开启两个以上的X,每个显卡一个X。这样形成的multiseat保留了原生的一切能力,包括3D加速。只要你原生显卡支持,都可以做到。多X方案的第一个显卡可以看到console,第二个只能看到图形界面,不能通过C-M-F1切换到console。 但是多X的条件也非常严格,上面列的情况1是没戏的。大部分人的电脑都被划到了这种情况。即使你有幸,弄到了3, 5, 6三种情况中的一个,也要注意,两块显卡必须是同一厂家,最好是同一型号。这点尤其对pci显卡更需要注意,pci显卡和pci-e显卡显然不能是同一型号,但是*必须是同一厂家*。 这个方案最鸡肋的地方在于,3, 5两种情况只有在针对游戏特别配置的电脑上才有效,而这种电脑本身是非常昂贵的。这和降低系统成本的初衷相违背。 Xephyr方案 Xephry是一个X的模块,他的目的是使用内存作为X的输出设备。因此Xephry做出来的X可以将显示内容再显示到其他地方,例如作为其他X中的一个窗口出现,等等。 利用这个特点来做multiseat的思路基本是这样的。首先我们将两个显示器合并成一个虚桌面,如同我们常规做的那样,左边的窗口拖一下可以到右边。然后再开两个Xephry,每个里面包含一个标准的X,包括display manager,session,window manager等等。最后每个X分别用一套键盘/鼠标。这样出现的效果和multiseat是完全一样的。 这个方案的优点是,支持众多的机器,尤其是我们最常见的1情况。但是,其缺点和优点一样明显。由于我们操作的是Xephry,而不是实际的显卡,因此会缺少一些X扩展,例如3D。而且相比原生设备,Xephry方案会有少量延迟。贝壳做过实际测量,至少在播放普通视频的时候,60Hz的刷新率没什么问题,播放无卡顿。 这个方案有一个封装好的实现,帮你做了整个过程。(不过我没有测试)叫做MDM[4]。 虚拟化拖机 无论是windows还是linux,都有一个不算方案的方案。安装一套vmware,然后将vmware在其中一个显示器全屏,再把其中一个鼠标和键盘指定给这台虚拟机。这样也可以做到multiseat的效果。使用Virtualbox/Vitrual PC也是完全一样的原理。 vmware中原生是不可以将鼠标/键盘指定给虚拟机的。关于这点,文档[6]给出了完整的解决方案。在.vmx中加入下面一行即可。 usb.generic.allowHID = "TRUE" 参考 Multiseat Documentation in x.org Softxpand BeTwin Multiseat Display Manager ourbetwin VMware拖机方法

从术前和术后红包说起

Jun 7, 2012 - 1 minute read - Comments

六六的《心术》里面曾经说到,医生比较喜欢术后红包。因为术后红包心理负担小,只是患者表达感谢而已。 听上去是有道理的,毕竟我们还是可以相信,大部分人在其他条件相同的情况下,更倾向于选择不作恶。或者说,肚子吃饱的情况下,人会选择让自己的心里好受点。从另一方面说,术后红包毕竟风险小很多。术前红包是有风险的,如果手术失败,家属可能没法和医生打手术官司,但是完全可以打红包官司。即使不打官司,给过红包的家庭比不给的家庭更容易闹事。然而术后,好坏都定了,好的就收,不好就算。 从患者角度说,听上去也很不错。做好了有红包,做不好就算。很符合我们物质激励的特性。名气大的,成功率高的医生,自然红包拿的多。而名气小的,成功率低的,则红包拿的少。这其实是一种变相的小费制度。如果把医生的工资理解为基础工资,红包理解为小费。那么要拿红包就必须有足够的成功率,所以我们预期得到的是越来越好的服务。 为什么不行? 因为手术做都做好了,谁会给红包阿,同志。 住个医院都贵的要死,一个手术下来几万没了。这是一个家庭一年乃至更多年的积蓄阿。要说再去给医生红包,很多时候红包真的就变成红包了——也就100,200图个吉利,很多时候还毛都见不着。 其实术后红包的不风行,正是能证明医生有意图希望收到红包的证据。毕竟医生也是人,9年医科念出来,再熬个10年乃至更长,他也是希望获得与之相称的收入的。什么叫做与之相称呢?医科大学不好念,能进去的学生,同等分数的,读一般学校,熬20年后是什么水平?一年30W都算混的差的。医生不收红包的情况下,一年有30W么?同样,我们再拿专家说。普通医生再熬个20年,一年收入期望多少?你说专家不收红包,一年收入多少? 不收红包人家心里能平衡么?要收的话,能等术后么? 所以,即使有风险,也肯定需要收你的红包。如果不缴怎么办?肯定要变着法的杀鸡儆猴,否则这事情就没法干了。 所以,很容易的想到。既然目前术前红包是潮流,那么: 1. 医生肯定是希望收红包的。 2. 无论比例多少,肯定有被杀掉的鸡。 但是,我并不是说,红包就一定是糟糕的。如同我刚刚说的那样,如果我们能像交小费一样的缴红包,如果红包的机制透明化,无疑,对双方都是一个很有利的事情。成了才收钱,不成就退掉,只收成本。把医院的收入和手术的直接成功率挂钩起来,这样才能提高医院的水平——当然,贵的事情另当别论。 其实,中国的医改,正在扭曲和纠结的路上越走越远。看病贵,本来是医保的事情,要医院解决。医院是什么地方?同志,医院是营利性社会机构,不是福利院阿。就算你说医院是社会性的,医院应该便宜,医院应该像福利院一样,那也得政府给钱阿。别跟我说医保,医保针对的是个人,你进去看10W,国家报销8W,和医院没什么太大关系的。你有医保,看病确实像福利一样便宜,没有?那就像扒皮一样贵了。 而且医保降低了一些人的价格的同时,又产生了供需问题。你可以看看,天天往医院跑的,有多少是老干部,有多少是民工?往往老干部连破了个伤口都跑趟医院的同时,民工连大病都不敢去医院。这道理想想就能明白。一样的包子,卖你2块,卖他10块,你说天天往这里跑的是谁?实际上,老干部被过度医疗了,而民工则是医疗不足。不得不说,这是对中国“劳动最光荣”的极度讽刺。

一个超微模板系统

Jun 6, 2012 - 1 minute read - Comments

re_tmpl = re.compile(’<%(.*?)%>‘) def template(s, d): return re_tmpl.sub(lambda m: str(eval(m.group(1), globals(), d)), s) template(’<%“ddd” if abc else “eee”%>‘, {‘abc’: 1}) 限制挺多,只能在<%%>中写一行代码,不能多行。不能用跨区块的if for等控制结构。但是对于功能需求不复杂,需要可变性强,又不希望引入额外库的地方还是非常实用的。

上网本的发展

Jun 4, 2012 - 1 minute read - Comments

看了一下,小上网本几年基本没发展。1公斤以下,3小时以上的本,和我三年前买的本比,只从3000降到了2000上下。没有什么更轻更能续航的本。也许是大众不接受这种流行方式,小上网本的核心实质是“操作终端”而非“独立电脑”,使用上网本/ipad/手机,都是需要在家里安放集成服务器的。我下面从几个方面,说一下我对小上网本的想法。 上网本前几年比较流行SSD,今年找不到了。我一直觉得SSD才是上网本的绝配,用微硬盘,倒是容量上去了,可是你需要把需要的数据全存里面么?我照片43G,其他数据15G,带全部的存档。加上影片,大概就上涨到100G。问题是,未归档的数据大概只有3-5G。归档数据带在上网本上干什么呢?你有多大机会用到?你不可能只用一个上网本而不用普通电脑。把90G+的存档数据放上网本不放主机很蠢,两边各放一遍更蠢。我真正需要的,是16G的空间,可以和我的普通电脑工作区同步。从这点而言,苹果的ipad和mbp才是绝配。 我一直认为,中国的上网本不是用来上网的。现在移动上网太贵了,真正我需要的流量,一个月大概要200-300,和光纤差不多贵。可是理论速度只有光纤的1/10不到,而且还不能总是达到。而且为了让各种设备上网,我还要备多张卡?现在的流行是两种趋势,一个是使用联通的套餐,通话贵就让他贵,然后用手机tether。另一个是该怎么用还怎么用。买一个3G路由器,然后用一个便宜的上网卡。 如果在国外,用ipad和mbp,那你是不用看我下面的话了。但是国内,暂时还没办法指望云,用android的,用windows的,更是如此。既然你没有云,又要长期同步ipad。最舒服的方式就是使用专业的nas,组成modem/router/nas的家庭服务组。

人际关系网络的变迁

May 31, 2012 - 1 minute read - Comments

人类是一种社群化的动物,一个人一般会和多个人发展出朋友关系,进而产生交际圈。随着人类的进化,交际圈的规模和特征也在不断变化。但是基本假定都是类似的。两个人为了维持朋友关系,必须在生活中抽出一定的时间进行共同活动。 如果我们能够回到6000年前,仔细看原始人类的社会交往模式的话(6000年前的埃及人已经在社会化耕种了,中国人民么,大概在有巢氏的带领下刚刚学会住在树上)。你大概会发现这么一个情况:大部分的人际圈子,都分布在半径1-5公里以内。其实这很符合常识。人一小时大概能走5公里,1-5公里的距离,每天要花最高两小时往返。当时人类并没有太高的耕种技术,每天花两个小时以上往返和别人交友对于大多数普通人来说是不可能的事情。当然,这也不是绝对化的定例。如果是游牧区,那么交友模式都会发生变化。人和人见面机会少,生活孤独,因此和耕种文明模式完全不同。如果是海洋文明,也会产生另一种社会特征。但是每种闻名的社会特征,基本都脱胎于当地交通运载能力和信息传递能力——例如典型的民主社会基础,希腊城邦,就是由海洋和群岛分割造成的文明。 这个模式一持续就是5000年,历史上,交友距离的第一次全局性增加得益于工业革命。在工业革命之前,人类的动力源基本只有几类。畜力,可移动,但是需要喂养,昂贵,普通人多数用于耕种。风力水力,不可移动,不稳定。还有人类自身。在工业革命后,人类第一次得到了可持续,可移动的外动力源。廉价,而且强大。火车和钢铁轮船是工业文明的代表作。自从大型交通工具发明后,人类的交友距离就大大增加了。这很容易理解。原本无法走出村庄的人,如果每周可以乘坐一次火车或轮船去附近的都市。他就很容易和附近村庄乃至都市的人发展出人际关系。而强动力源的产生也使得生产能力大大增加,普通人有那个时间和金钱来负担中距旅行的成本。 由于社会圈子的规模大大增加,因此人类社会在工业革命后起了爆炸性的变化。如果说人类文明的前5000年犹如一个缓慢加热的水锅,那工业革命后的1000年不到就是他的沸腾期。社会圈子的增大,首先产生的变化就是破坏传统社会结构。西方文明史我并不熟悉,以中国的传统文明来说,安土重迁是中国人传统的基本思路。由于社会圈子的强内聚,因此主体社交圈子都是以村庄或是城镇为基础的。在圈子内,由推举产生一些人,来维持圈子的稳定(族长制)。虽说名义上,国家是皇帝的,但是实际施行治理的,是每个村镇的族长和乡绅。实际上这是一种民主自治的典型,只是在上层要受到国家的管理。但是在近代,由于轮船在江面上大量运行,因此交往实际上跨出了地域的限制,从而使得地域自治和市场经济发生了强烈的碰撞。当然,我不会说这导致了辛亥革命或者别的什么近代重大变迁——那是其他因素的结果。然而,在文革结束后,中国(至少大陆地区)的传统社会圈系统实际上已经基本破灭了。 这个阶段的人际网络边界,实际上是受到了生产的限制。如果你足够有钱,那么走遍整个世界还是做的到的。然而从这个时代开始,另一项阻碍社会圈子扩张的因素已经逐渐开始显现——语言和文化。 第二次大的改进,起始于网络时代的开始。如果要我比喻的话,会将其比喻为世界初始之光。由于网络互联,分组交换技术的发展,因此低价的,普通人可以接受的世界范围通讯成为可能。如果只考虑文字,按照目前的网络通讯价格等比来计算(注意,这实际是不可能的),上海一条20M的光纤2000一年,等比来说一条100kbps的线路10元一年。即使是偏远山区的人,也可以负担和巴西的通讯——这原本是世界的两端。如果没有语言和文化障碍,任何人——包括偏远山区的人,也完全可以发展出人际关系。 想必你也觉得不可能吧,这是理所当然的。即使是和我们文化相关性很大的日本,普通人发展社会圈子的可能性也不高。尽管你可能可以阅读一些日文文字,但是却不一定能明白其意思。在这种磕磕绊绊中,发展人际关系是很困难的。同样的困难更是横跨在中文和英文世界中——这是世界上使用范围最广的两种基本语言。更细分来说,中文还要分为Mandarin,Cantonese,Min,Hakka,Teochew等几个大的系统,这还不包括方言。英文则分为British,American,Australasia三种大的系统,不包括各种方言和pidgin。英文系统我不是很清楚,但是中文的几大系统间互通基本是不可能的。这使得看似连成一体的网络世界实际上分割成了以语言和文化为基础的几个区块。 同样以中文网络世界为例(因为我毕竟熟悉一点),中国的网络很特殊,因为有GFW。但是实际上,即使去掉GFW,很多人还是只会上国内的网站。因为其他国家的网站,1. 没听说过,2. 语言不通,3. 没有朋友在用。这是国际巨头进入中国的巨大壁垒。实际上不仅仅是中国,所有华语使用者恐怕都有类似问题,例如香港和台湾的网络。国际上,twitter是主流,台湾是噗浪,大陆是新浪微博,这不能说和墙有关吧。 以中文语言系统世界的进化而论,实际上这些年看似是开放了普通话一家独大的限制,让各地方言都有了存活的空间。其实发生的事情则正好相反,网络极大的摧毁着各地的文化。台湾,广东是典型的双语言系统使用地区,当地大部分年轻人都可以同时使用Cantonese(或者其他地方方言),同时使用Mandarin——这不是普通话一家独大是什么?更明显的是l18n的时候,你见过说做了一家中文网站的,希望做成英文版本。也见过英文网站的汉化。你何曾见过一家网站的“广东话化”?这种事情只有wiki那帮人才干的出来。大部分网站还是做一个普通话版本就算完成了中文化。这些年香港繁体都受到了很大限制,唯一还坚持中文文字多样性的只有台湾了。 从语言角度说,这是倒退。然而从社交网络圈子的角度说,这是进化。各地通行普通话的结果,使得中文世界基本只要会普通话就可以正常浏览网页。当然,从世界发展的角度来说,如果你要真正畅通无碍的在网上来去,英文才是必备语言。从这个角度来说,只怕汉语会逐步变成今日的广东话,在存留之间诸多挣扎。

语言的效率差异3

May 28, 2012 - 1 minute read - Comments

在总结前,我们首先搞明白三个问题的差异“效率的决定因素”,“语言效率差异”和“日常使用中造成运行效率差异的因素”。 代码的效率最根本因素绝对不是语言的效率,我一直这么确信。代码效率的决定因素必然是算法的正确选择和实现的优秀程度。这里面包括了正确评估问题,选择合适的数据结构,使用合适的算法等。例如对给定数据的高速查询,用红黑树去跑查询肯定跑不过预编译的哈希算法和哈希表。即使前者使用汇编实现,而后者只是python实现。(对于这点,我对比过一个大规模数据的查询,数据是固定的。数据库效率最差,C++用红黑树的map次之,效率最好的是python的dict,底层是hashtable。当然,为了防止某些人补充,我自己先说了——我最后用了stlport的hash_map) 语言效率的差异,有很多因素。例如编译型/解释型语言,动态语言和静态语言,是否带jit优化等,都会造成很大的性能差异。甚至同样是C,不同的编译和优化参数也会造成很大规模的差异,做优化的朋友一定心里有数。然而大多数情况下,决定语言效率的关键因素都不在语言自身的效率上,而是在于底层库实现的效率上。当然,如果底层库使用该种语言直接写成(我也比较喜欢这种风格),那么归根结底还是考验语言本身的效率问题的。以正则测试为例,实际上python是一种性能很差的语言,但是在测试上并不很低。因为python的库实现是直接引用了C库,其效率仅仅是C加上一个不高的值。而lua得分不足只能说是库的实现比python差。 最后一个问题相信大家最关心,即日常使用中造成运行效率差异的关键。到底是什么,决定了我们每天写的代码的效率? 可能要出乎大家的意料,从实际测试来看,实际上是测试能力和可变性。我们能够大致预料某些性能特别差的情况,然而对于性能在50%-200%以内变化的细节,实际上是很难提前预测的。也许我们会“猜测”某种情况性能比较优秀,但是实现下来情况可能完全不是这么回事。例如我曾经就一个C代码进行优化,预期应当能提高4倍性能,当时测试的结果是性能提高3-5倍,但是实际生产环境跑下来觉得没区别。后来发现,我自己测试用的是-O0,而生产系统是-O2。我的优化实际上在-O2的时候就全部被自动优化掉了。如果你觉得你的经验够丰富,能够预测-O2会优化你的哪些代码。那么你可以考虑一下,CPU的指令流水优化呢?系统上所安装版本的libc的实现细节和内核细节呢?如果都能精通,您可以忽略我这篇文章。但是对于我自己而言,我只能预计某个做法可能优化,而不能确定。 这时候,对于这个优化的实现难易程度,和实现完成后进行测量的难度就成为了关键。尤其是精确测量耗费时间的代码,执行时的瓶颈,这些能力才是优化代码的关键所在。我曾经写过为什么python效率不比C低,有人不服。我说了,并且反复强调了,这个仅限于“两者的生产速度一致”这个前提下。实际上如果真满足这个前提,大部分情况下C这边都输的没法测试的。因为完成同样任务,python的编码时间大约只有C的一半到1/4。即使算上优化,python完成项目的时间,C都不一定能写的完代码。更不提后面还要进行泄漏测试,复查,复杂的调试。等全部通过,开始关注效率问题,生产时间早超了。 作为日常生产,我想大部分程序员都有这么个经验。决定代码质量的实际上是项目的时间是否充裕,程序员是否用心严谨,生产流程管理是否到位。除非程序员太差劲,否则技术性代码质量差异并不特别多——一般都是远远小于赶代码造成的严重问题的。如果您那里不是这样,我建议您更换一批靠谱的程序员。同样,在真实的日常生产中,大部分项目都没有那个机会对代码进行多次的复查,深层次优化所有问题。基本是写,写完了查,没有什么表面问题。然后检查一下,用户体验效率是不是很差,找最差的地方优化一下,然后直接交货。很少有像理论代码那样,反复优化和测试,甚至受到来自不同程序员的交叉检测和沟通。如果有这种级别的反复优化,毫无疑问的,C会是常用语言中的效率之王。在shootout>给出的速度评测上,仅有Intel自己实现的fortran超越了C。当然,我相信汇编会更加优秀。 然而杯具的是,日常生产中恰恰相反,至少我是没什么时间去优化每行代码的。大部分时候,为了处理一个排序问题,我不会去网络上找一个vector库,而是直接开一个100的数组,然后qsort。前方报错了,改1000的数组。在写python的时候,也不会精细的考虑每个地方是否都用了合适的方法,某点是生成器好还是list好。大不了觉得某个程序慢了,cProfile一把,然后对着花时间最长的几个点看看是否有问题。自我感觉而言,python项目在做完之余,我还能泡个茶聊会天,自然也有功夫去看两眼代码,是否有哪里写的太难看了。而C代码就是不停的debug,即使我好容易喘口气,也绝对不会想去再看了。 最后说一下sbcl,在自身性能测试中,是当之无愧的语言之王。速度是python的一倍不到,代码量是python的一半。常规来说,出错概率,维护难度,都是和代码行数直接相关。一半的代码量基本就意味着维护成本削减一半,而一倍的速度基本和java持平,在C后面紧追不舍。但是,以上常理对lisp均不适用。lisp的学习难度惊人不说,维护难度和代码行数没有直接关系,而是取决于写作者的水平。水平越好的写作者,代码越容易维护,反之,初心者写出来的玩意那是看都看不懂的。冰河在博客上说他找了个职业lisp程序员的工作,人家视若珍宝。我不知道是哪年的blog,但是从老板的角度来说,这才是程序员的悲哀。老板喜欢什么语言?最好有个点子,跑去人才市场插个牌子,上书“我要人”。然后就会有一堆人云集过来,脖子上面都套着“五行一元”,“精通XXX”的草标。抓一只大个的,给个项目经理的头衔,让他管着别人。每个月扔一麻袋饲料下去,过两个月就能收程序了。 看起来和农场有点像,不是么?遗憾的是,lisp看来是达不到这个要求了。全国能用的python程序员不会超过5000,lisp程序员大概连500都不到。如果哪个老板不幸脑残,用了lisp来做项目,那么在招人这个问题上会比python更难执行。从这个意义上说,这才是lisp程序员不流行的关键——不好找工作。即使运行效率再高,语言本身再好,也没法过老板那关。

天朝重大灾害事件的行为思考

May 24, 2012 - 1 minute read - Comments

当事人 在天朝遇到重大灾害事件,当事人的指导思想是自主逃生,切切不可指望救助。这点不仅是在天朝,而且在全世界各个国家都同样成立。总体来说,天朝救助动员体系的效率在全球那是首屈一指的高。然而比较操蛋的事情是,往往在救助的时候会来几个记者或者领导。这时候不但不能快速把你救出来,而且在慢慢救助的过程中,你还会受到“你现在疼不疼阿”,“坚持住,我们的人民解放军马上就把你救出来拉”之类的废话骚扰。更操蛋的是,你还得表现出受灾的痛苦和得救的感激——不过鉴于天朝有效的动员体系,你就权当缴“表情税”了吧。 当然,在救助的时候,一个更可怕的事情是,你受灾的事实可能会对领导的政绩产生不良影响。因此,当有一点证据表明可以不救的时候,哪怕不足72小时,你都可能被直接埋掉。所以,更不要指望救助。 具体来说,有以下几个具体建议: 受到外来冲击的时候先护住头和胸,尤其是后脑勺。缺胳膊少腿的叫残疾人,缺脑袋少心脏的叫僵尸。 尽量逃离灾害现场。你永远不知道那里会再发生什么问题。 再贵的东西都没有命值钱。 被困等待救援的时候,最容易死亡的因素是缺水。如果你有瓶水,千万别浪费了。如果有个瓶子,千万别浪费自己的尿。如果你什么都没有,那就想法弄一个。 NGO 作为NGO,在灾害救助的时候,首要任务是组织,管理,信息传递。尤其是最后一个,千万注意时效。网上经常出现无效的求助,尤其是围脖出来后,情况尤其严重。有人曾经验证过,一条求助推,被转发上千次。但是之后的感谢推,只有不到百次。结果就是,事情已经做完,或者过时,但是信息还在传递。这种无效的信息垃圾,会严重的干扰救灾体系的运作。 作为一个比较好的对应方案,建议可以由几个人,携带便携电脑,在灾害现场收集信息,来源,时间,然后通过邮件发送给联系人。使用邮件的好处是,可以离线收集信息和编写,通过3G网络发送,信息量大,冗余数据消耗小,对带宽要求小。即使没有3G网络,邮件也可以通过tf卡携带工作(就是把邮件输出成EMAIL编码,托人带到有网络的地方发送)。不过,为了保证邮件发送人的可靠,建议考虑邮件签名技术。 受灾后,最重要的信息是,有哪些人受灾,他们需要什么物资,他们需要联络什么人(寻人报平安)。正确的第一现场信息,有助于征集社会资源,解决实际问题。为时效性考虑,每种信息都应当有一个注销和过期特性。 旁观者 作为旁观者,千万不要试图录像,或者表现出试图录像。如果你手机有偷拍能力,偷偷的拍是可以的,被发现了就删除,或者干脆把手机扔给对方,不要拿自己的命开玩笑。你对面一群人的领导,可能在这次灾害中锒铛入狱,也可能风平浪静。如果你的录像有害他入狱甚至挂掉的可能,他不会介意让你直接挂掉的。 如果你平时要救助别人,注意留下你不是肇事人的证据。但是在大型灾害面前,你没有被起诉的可能(总不能说地震是你搞的吧),因此不要吝啬于给与帮助。注意,在帮助别人的时候注意保护自己,不要轻易的到危险地带去帮助别人。如果你也变成当事人,别人还得帮助你。如果你挂掉了,家里人会伤心。 在灾害发生的第一时间,你的捐献不要考虑审计,红十字,之类的问题。就算知道有问题,你的捐献能够让多一个人活下来,就比坚持真相更有意义。然而做为后续捐助,我的建议是,自己做,或者不捐。中国的救助体系已经变成了一门生意,而且很不透明。当你不知道你的捐助做了什么用途的时候,你可以选择不捐助。当然,如果你和几个朋友(注意,这里一定需要互相认识,因为针对非特定对象的募集是违法的),有人愿意去开车送一些东西什么的,那会更好一些。 如果你到了现场,注意收集信息。在灾害信息全靠官方,官方信息全看领导的天朝,有个其他的信息流通渠道是非常重要的。 具体来说,有以下几个具体建议: 不要围观,尤其是在进出通道上围观。 看到有人受伤,不要着急忙荒抬着跑,先看看有没有伤,意识是否清醒。如果有骨折,固定后再移动,否则会产生二次伤害。 如果是外伤,尽力止血。如果外伤见骨,或者有脊髓液流出,不要着急包扎,谨防感染。可以在靠近心脏端进行扎紧,减少血流。 如果呼吸心跳停止,做CPR。CPR具体参考CPR手册,或遵医嘱。实在不会的,简单来说,捏住鼻子往嘴里吹气,然后胸压15次,两秒一次。特别注意,必须保持气管通畅,没有喉管闭合或者呕吐物堵塞,否则人工呼吸一下就送命了。另外即使出现心跳呼吸,也尽量坚持直到救护车来。当然,最后一点在灾区急救中就有点奢求了。

几个小技巧

May 23, 2012 - 1 minute read - Comments

virtualbox中使用物理硬盘 省略权限,物理硬盘分区结构基础知识,最核心只有一句话: VBoxManage internalcommands createrawvmdk -filename sdc -rawdisk /dev/sdc -relative 在不重启的情况下调试awesome的方法 省去安装和man,也只有一句: Xephyr -ac -screen 1024x768 -br :1