Shell's Home

cython编译细节

Oct 25, 2012 - 1 minute read - Comments

两点简述: 可以使用cython –embed来编译一个pyx,生成带main的代码,然后用gcc直接编译过去。大概样例是这样的: cython –embed $^ gcc $(shell python-config –includes) $(shell python-config –libs) -O2 -o $@ $^ pyx的文件名会被转换为变量,所以所有在变量中不应当出现的符号也别出现,例如-。

pycon2012

Oct 23, 2012 - 1 minute read - Comments

今天第一天在大型会议上演讲,其实挺紧张的。不过还不错,虽然临场反应并不热烈,但是至少不冷场。下面是我今天看到内容的回忆,有些印象不神,记得不清楚了。 第一天上午 视频播放 上来先是sting先给我们放了一堆视频,我基本啥都没记住。就记住一个在日本的pythoner说教孩子编程时大家的评语了——python穷三代,编程毁一生。我后面接的是,用scheme子子孙孙都完了。 python产品构建和发布指南 沈游侠的主题,彻底干货。基本要点就是利用cython和pypy来编译类python语言,变成C语言代码。这样不但速度快,而且C代码都是可以跨平台的。后面又列举了如何用cython和pypy来编译库。这样基本可以完成python到多数平台的移植。 我做了一下简单测试。cython对速度的增加主要是静态类型编译,如果保持代码不动,速度反而会略微下降。因此在速度提升上,作用并不如想像中那么明显。但是在跨平台上,效果就非常好。rpython则完全相反,经过rpython编译的代码,在基本不修改的情况下(当然,前提是你需要符合rpython),执行比C还快。 不过游侠在后面的答疑中也说了,pypy的rpython编译把握难度比较高,不建议在产品中使用。 另外,他后面也提了溜宝的例子,在python和js之间可以远过程调用,还可以回调。熟悉http的应该可以听出来,这个在现在浏览器中必然是要用到long pull技术的。因此底层框架不肖说,必然是Eurasia。 让程序运行更快 我们几个都在说,土豆的一贯风格是分享内容是和技术有关的干货,但是都和python不搭边。最多在最后说一句,这个技术在我们这里是利用python做的。上次黄东的演讲就是,讲如何算流量带宽费,最后来一句,这个是python实现的。这次李小红的分享也是,很技术,但是和python没啥关系。讲到一半还来了一句,“我对python不熟悉,前几天特意看了一下,dict是利用开放地址法实现而不是开链实现的,这让我对python顿时有了信心”。微薄上无数吐槽高级黑啊。 土豆的分享其实很简单,核心就是如何通过代理让网站的响应速度更快。干货是干货,但是不是非常熟悉http协议,能够将http本身优化到相当程度的,听了等于白听。因为上面讲的大部分,都是内存命中和交换,磁盘写出,cpu调度,poll和epoll内核模式差异之类的话题。在python下面,poll和epoll基本都看不出差别,大部分优化都围绕着模式打转。研究这种命中技巧不是南辕北辙么? 但是这不表示这个主题没用,只是如果你不把其他方面的问题解决的很彻底,先没头没脑在CPU和内存缓存命中上下功夫,多半是做不过别人的。 第一天下午 OpenERP 即将推出的第 7 版的功能和新的编程框架介绍 演讲者是个法国人,中文相当不错。不过和Thomas比起来还是差点。旁边的老外哥们说,那是因为Thomas有个好中国老婆。 基本是广告。除了让我们体验了一把openerp的风格外,啥都没看着。不过openerp看起来确实够屌的,直接去下一个插件,应用,然后就直接换掉了语言。这基本和php差不多。还有一堆的良好的交互特性,看起来非常像应用。此外,啥技术都没有。 元编程在 Redis ORM 中的应用 我自己的题目,会场反应并不很热烈。总共两个选项,我问认为是1的举手,几个。认为2的举手,几个。剩下的是啥? 其实元编程本身就不好讲,这个题目我写完文档算了一下,大概1个小时到一个半小时。问题是我问sting多要点时间,没有。好容易给我加到45分钟。我对着文档左砍右砍,还是紧紧张张的25分钟讲完。要在30分钟出头讲完整个题目,也难怪听众反应不良。 具体我也就不展开了,希望看到的可以看我的slide。另外我说一下,这个slide也是我用python做的。 用 Tornado 开发 RESTful API 应用 其实以这个应用而言,是适合GAE的项目。不过飞龙只是借这个题目讲Tornado而已。 阿里云之移动开发者上云 纯粹广告。不过既然是lighting topic,也不算太难受。我也顺便看了一下阿里云的架构。不过主讲完全没讲到要点,他们到底是卖IaaS业务,还是卖PaaS业务,还是云存储,还是三者都有?另外,用IaaS来做PaaS的可伸缩?我还真不觉得这是个好主意。。。 Python如何帮助「逆转三国」获得成功 广告中的广告。今天唯一一个妹纸上场的主题,我还在想,终于有妹纸上去做分享了,还是个美女。结果介绍完了心里就凉了半截——市场总监,这姐们是个非技术的角色。演讲的主要内容是,python很好,python没出过乱子。完了,总共15分钟不到,我连拍第二张照片的机会都没有。其余时间全在说游戏是如何成功,左右还有海报助阵。最后还出来一个美女发传单。 最后主办方出来道歉,他们也以为这个topic是正规演讲,没想到讲成了lighting topic。 网页游戏的跨界开发 董诣的题目,主要讲他如何训练公司的策划使用python。他用的方法基本就是元编程的路数。 策划将配置写入excel,然后他们的程序读取excel,写出一个python的文件,再由服务器加载。这是典型的字符处理型元编程的例子。早知道他们这么用,我满可以顺手拿来举例的。 最后他的例子倒是让我们吐槽了一把。print后面可以不加空格,这是他们公司美工教的。 实战游戏客户端 林伟每年来都是带来大量干货。今年他是特别从北京飞过来,在演讲前刚刚到场。 他的题目是用python做客户端,并不是很好讲。因为python做游戏客户端不是很多。他举了一个pygame的例子,超级玛丽的企鹅复刻版,玩的挺欢乐的。 后面他大概讲解了一下游戏界面编程的几代模式变化。不过我印象最深的还是说到flash在苹果上。后面他运行flash的那个模拟的时候,我彻底吓一跳。我偷偷和沈游侠说,林伟说的完全没错,乔帮主抹黑flash完全是为了抢app的地位。 大家可以想象一下,如果flash拿到了硬件驱动加速会如何?Apple Store上的程序还有谁会花钱?都直接用网页跑一个Flash游戏就直接玩了。PC上能跑的,在苹果上自然也能跑,效果还不差。那还用Objective C做什么?只有性能要求特别高的才会用到。如果不需要Objective C,那Apple Store还怎么赚钱?从Flash能够做到这点,还有Adobe的战略布局,以及Apple Store目前的情况。我们多半可以得出这么个结论,苹果抹黑Flash的主要目地是将Flash踢出移动平台。而只有将Flash踢出了移动平台,才能保护移动设备开发市场的封闭性,从而从中牟利。 另外,他讲到的FlashCC也很有意思。在一个语言内调用其他语言,这非常有利于Flash的开发。不过后面林伟的一句口误让全场都笑了。他说:“我今天来就是告诉大家,从今以后,大家可以用Flash开发python程序了。”得,又是一堆高级黑评价。 第二天上午 网游开发中的 Python 组件 赖总的topic,基本讲的其实是模式。 对我来说其实也挺有用的,尤其是关于对象可调用方法的那个idea。写程序到了一定程度,实现已经不是问题。只要有明确的实现方法,你给足够的时间干,肯定是干的出的。问题是思路,也就是idea。一个好的思路往往是经过很久的总结,在实践中不停摔倒,才能真正用上去。 另外,最后的吐槽,其实是自行实现语法,或者至少是语法糖。我和赖总说,scheme其实很容易嵌入,而且很容易实现这样的要求——lisp类语言的宏天下闻名。赖总在研究的是基于python自己的Parser的方案,我回头有空也看一下。 Python in Gentoo Linux Patrick Lauer的主题,主要是讲了Gentoo下面如何使用python,每个版本的python在gentoo下面的支持情况如何。按照数据来看,python3的支持接近完成了。而pypy大概只有2/3的支持比例。

没想法

Oct 18, 2012 - 1 minute read - Comments

前两天面了一个同学,是我在交大的学弟。平时印象挺不错,用过的技术也挺多的,和老板商量一下,就面试看看吧。 结果不能算糟,但是也谈不上多好。主要是,这同学没想法。 不知道和没想法 老板最恨的一件事情,就是在问你一个问题的时候,你手一滩,说”我不知道“。其实严格来说,他并不介意你说”我不知道“(I don’t know),但是绝对不要说“我没想法”(I have no idea)。 拿面试时候的例子来说吧。那位同学讲了一个实验室里面的项目,用web来控制小车。当然,那是个没做完的项目,有什么问题也不是值得奇怪的事情。我们开始的时候问了几个问题,感觉还可以。事情是从我随口的一个问题开始的:”如果两个人同时操作,会发生什么事情?“ 两个人同时操作在设计上是不允许的,完备的系统可以通过一些方法来排除这种可能。例如,见到第二个cookie就给一个空页面回去。项目没做完,没屏蔽掉第二个人,也不是什么值得奇怪的事情。但是我想知道的是,对于这么一个未定义的事情,被面试的人是如何分析的。 按照正常流程来说,分析这个问题首先需要知道基本的工作原理,然后拆分工作流程,最后分析,如果两个指令同时到达,会发生什么现象。问题是,该同学阻塞了半天,啥都没干。我和老板询问了整个系统工作的原理,发现他对基本原理都是了解的。我们按照他所说的原理,推断出了两个人同时操作会发生的结果。当然,是否正确,谁也不知道。但是我们的结论是,他在具备所有推论需要的知识的情况下,没有做出任何推论和结果。 这是一个很扣分的事。 不知道 所谓不知道,是指你的知识(knowledge)不足以解答当前的问题。例如,对于非程序员,我问你,python中用于逐次返回数据的关键字叫什么。你手一摊,告诉我,我不知道。这是因为你压根没学过python,当然不知道yield。 不知道并不是值得羞耻的事情,无论多强的程序员,总有什么东西是他不知道的。新的语法,新的框架,还有我们没听说过的技术。作为程序员,什么都知道反而是一件无比诡异的事情。 没想法 很多时候,没想法是因为不知道。例如,假定你对股票市场的工作机理一无所知,尽管你完全可以理解,作为正常人类都是希望高买低卖。但是当我问你,股票市场表现如何的时候,你也只能手一摊,我一点想法也没有。这不仅仅是你不知道,而且你都不知道该如何去分析这个问题。 因此正常程序员见到一个不知道的系统,第一个问题十有八九是,这系统干什么的。第二个问题就是,这系统怎么工作的。当你知道了系统的大致工作机理,就会想出如何分析这个系统的方法。 例如,我们有一个网络系统,老板说网页访问慢。元芳你怎么看? 这后面没什么天大的秘密。我们只要照着网页访问的流程来看就好。 DNS解析 tcp连接 http请求 http返回 DOM解析 js执行 网页慢,首先分析最慢的地方在哪里。这里的每一步,都是能够计量的。我们再假设,我们发现最慢的是http请求和返回,那么我们基本就把问题定位在了服务器或者网络容量达到极限。那我们又如何分析是对方服务器太慢还是我们自己网络太慢呢? 只要你没傻,都应该想的到,最简单的方法就是同时开一个比这个页面快的多的系统,一个不会慢的服务器。最合适的是google和baidu的首页。如果还是慢,那就是我们的网络问题。如果快了,就是对方服务器到极限了。 做出这个分析,并不需要什么惊人的知识,也不需要你有足够的经验。当然,经验可以帮助你快速的排查问题,当出现某些现象的时候,别人还在做诊断,你就可以直接做定性测试和结果了。 你可以不知道,不可以没想法 作为程序员,我可以接受你告诉我,你不知道。但是一般我不能接受你告诉我,你没想法,尤其是在一些情况很明白的核心问题上。如果这是一个很困难的问题,没想法也不奇怪。有些很妖怪的问题,例如为什么我们的系统在人少的时候OK,人多了就挂了,再多又没事了。通常的性能计数又没异常,问题随机出现,无法复现。像这种妖异的问题,我没想法,你没想法,我问别人也没想法。但是如果我问你,网页为什么慢,你告诉我,没想法。或者更夸张的,在不经过相关测试的情况下,随便看了看现象就告诉我——这是我们的网络带宽不够大——你丫当我村干部糊弄呐! 没想法表示你对这个系统没办法。你没办法做一些事,在可预期的成本和时间内解决问题。你能做的就是去网络上找出过这个问题的人,他们的解决方案,然后照做。coolshell管这个叫做散弹枪式编程,我管这个叫做博彩。散弹枪不是一个很坏的主意,对于一些你不关心又需要很快解决的问题,你可以散弹枪一把。但是如果你在头三个方案内都没解决问题的话,你就可以停手了——后续方案能解决问题的概率和头三个没有太大分别。 有的时候,散弹枪是一个非常糟糕的做法。例如我们上面那个——网络带宽不够大——的例子,你很容易在网络上看到这个解答,但是往往这不是正确的答案。我是说,很多人确实是因为网络带宽不够,所以出现了网页缓慢。但是网页缓慢的原因,还有一个是因为延迟和丢包率太高。而增加带宽可解决不了延迟和丢包率。甚至相反。我们可以想像这么一个可怜的例子。当技术瞎猜到——是你的带宽不足——时,老板就会对行政说,去给我换一个给力的带宽。于是行政要升级带宽——又要控制成本,十有八九,他们会找上一家小ISP。ISP的性价比非常可观,行政和老板都很满意。唯一的问题,是他们的延迟和丢包率比上一家更加糟糕。 你看,散弹枪不但没打中目标,还使得情况更加糟糕了。 类似的问题还出现在大型电商系统的架构上。如果架构师和SA的答案永远是——硬件不给力,你需要好好考虑一下,真的是硬件不给力,还是这只是一个拖延的借口。如果架构不合适,当规模达到一定量级后,无论你再堆多少的硬件,可支撑用户数都不会有太高的提升。

回到毛泽东时代

Oct 17, 2012 - 1 minute read - Comments

是否愿意回到毛时代 今天在酒席上,不少长辈讨论说毛泽东时代如何如何好。我想了半天,很好奇,于是问了一句——你愿意回到毛时代么? 提出这个问题的原因,是因为,我试图思考,在当前状态下,如果要效仿毛时代,会发生什么事情。一般来说,怀念毛时代的人最怀念的是工作分配,工资平均,没有住房问题。我们假定回到毛时代,至少要解决这些问题。 如何回到毛时代 作为这个假定的前提,我必须先说明。你在现代所犯的所有“罪行”,例如投机倒把,或者作风问题,都不会在毛时代得到清算。如果要清算的话,我估计第一个出的问题就是——全中国的人大半死光了。我不大相信在现在中国,有多少人没有投机倒把问题。所以,你在现在所犯下的所有“罪行”,都不会得到清算。在这个假定下,我们全民投票。如果一半以上赞成回到毛时代,我们就开始毛泽东时代的路线和政策。 下面的很多事情,是参照建国后历史预计的。我们不能说他一定会发生,也无法排除他不可能发生。。。 会发生的那些事情 八级工资制 首先进行的应当是全国统一工资制。所谓统一工资制,就是按照国家的职称评定,核算你的工资。以我为例:我只是大学本科毕业生,非党员,没有职称。工资大概比全国平均水平高一点。上海平均工资5000左右,全国平均工资大概只有1000出头,我假定进入毛时代后,我的工资是——2000人民币。 我家喵说过,在上海,没有住房,医疗之类的问题,2000也足够生活了。然而2000的计算依据是什么?是以全国平均工资为基础,重新分配所有人的收入。那么目前不覆盖的东西,也不能指望在这个工资下覆盖。如果要覆盖住房,医疗问题,我们的工资就要进一步降低。 因此首先发生的是活命问题。上海地区的消费水平不是一下子就能降低的,而工资2000,这在上海连活命都不够。首先会发生的问题是吉芬效应,生活必须物资随着收入的减少而迅速增加。换言之,米,粮,布,盐会快速涨价。因此政府只有设法稳定物价,将上海的城市生活物资价格降低到和全国其他地方差不多的水准,我们才能活命。 土改,住房统一分配 工资平均后,政府会做的第二件事情就是土地改革。按照上海市平均住宅面积分派住房。我查到的资料非常复杂,有说17平方的,有说30平方的。无论如何,目前我们两个人住100平方,铁定是超了。所以需要整理自己的东西,搬到政府指定的另一栋房子里面去。我们的房子大概会接待一对外地夫妻,有两个孩子和两个老人,按照平均面积差不多。不过作为补偿,我们不用继续缴纳住房贷款了。 公私合营 另一个政策大概就是公私合营。所有私营企业,必须由国家控制,私人入股。在多少年后,国家停止支付私人定息。例如你们公司,公司合营后,就归国家管了。国家会按照企业估价,支付你们老板每年5%的利息,支付20年。如果不同意,则宣布其为剥削资本家,没收其资产。 然后发生的那些事情 打击投机倒把,囤积居奇 为了降低上海物价,必须打击投机到把,囤积居奇。什么叫做投机倒把,囤积居奇呢?例如最近的食盐涨价。政府发布消息,凡是人均购买食盐500g以上的,属于投机倒把,要强制劳改。如果在禁令发布前已经购买的,需要向政府交代犯罪事实,并上缴不当所得,方能宽大处理。这就是打击投机倒把。如果超市有食盐不销售的,一律没收所有货物,店长枪毙。这个就叫打击囤积居奇。 如果你在回到毛时代,发现工资降低到2000后,立刻去超市搬了5箱方便面——OK,估计你离去青海玩不远了。 户口 在工资平均化后,如果不抑制人口流动,应当会发生人口逆向流动。即,人口从高度发达地区流向欠发达地区。也有可能从高度发达和欠发达向中度发达地区迁移。因为上海的物价无论如何降低,也比安徽的高。同样2000工资,在安徽生活的显然比上海更舒服。然而如果去过于偏远的地区,虽然钱够了,却没有足够的物资。 不过回顾毛时代,人口流动也是偏向北京的。这主要是由于北京这里享有了非常高的行政资源附加。北京的教育,医疗,市民获得的娱乐,都是最多的。如果大城市相对于农村有行政附加,则也可能产生和预料不同的人口流动。 幸好,我们已经存在了户口制度。这个制度可以很容易的控制人口流动,尤其是在毛时代。政府可以很容易的宣布流民为间谍,或者其他人,从而逮捕和宣判他们。 控制人口自由流动已经是中国的基本国策了。我不理解发生这种问题的原因,可能是因为要强制将农民捆绑在土地上。也可能是因为方便控制。无论如何,户口制度不大可能在回到毛时代后减轻,反而可能会更加复杂,厚重。 公司迁移 但是户口还是有点问题的。我们现在有大量的劳动力迁移到了沿海地区,而户口还在原地。因此他们可以完全合法的迁移回老家,政府对此没有任何办法。人口迁移会迅速增加中度发达地区的负载,这必须和工作迁移相匹配。因此,国家必须将大量企业向内地迁移。恰好,我们进行了公私合营,因此可以直接把一些企业搬到内地去。 公司迁移会迅速的降低其竞争力,这是当然的事情。例如以皮鞋生产为例,一家位于西安的企业,和一家位于广州的企业,在人力资源上有绝对优势,然而在出口管理能力上有绝对劣势。这个行为大概会引起一些企业的生产或销售出现不协调。 上山下乡 公司迁移后跟着会发生的事情很可能就是上山下乡。为什么?因为无论如何调整,城市化的工业和三产是不可能没有失业的,而中国目前农村劳动力实际不足。因此国家必然会做出调控,让部分人到农村去。 怎么实施? 正常家庭都不会希望子女到农村去吧,因此在谁去的问题上必须接受国家强制。一种可能的方案是成年后未找到工作的年轻人。另一种则是毕业后听从国家分配。无论哪种,你的子女都有可能被送到荒僻农村,和一个当地的农民/农妇结婚,大字不识,终老一生。 更深层的因素,我们可以把这一问题的原因归纳为——现在台上的是老毛。 我不知道会不会发生的事情 控制货物和人员的进出口 这个很大程度上取决于政治状况,而非相反。 问题是,中国目前靠出口养活了很多人口。如果控制货物进出口,中国会出现(可能的)部分物资短缺,和部分产能过剩。同时,控制人员出入的理由则更加明显,如果没有出国人员流动控制,各种国外的思想会严重影响整个国家“毛时代化”的稳定。因此人员出入控制显然是更加必要的。而严格的人员出入控制下,怎么可能保持货物贸易正常化呢?进出口限制势在必行。 然而中国现代工业的自给率很低。实际上,大部分现代国家也是如此。无论是美国法国还是日本,他们的硬盘滑块大部分都是来自于泰国。这是泰国大水导致全球硬盘价格上涨的原因。大部分国家不会自行生产工业链条上的每一个部件,这是国际贸易的基础。在控制货物进出口后,中国的现代工业是不能自给的。我们就需要研发全套的工业链体系,重新发明轮子。 而重新研发全套的工业链体系,则需要相当的人力投入。这可能弥补没有出口引起的产能过剩,缓解失业的状况。中国目前的状况和解放不同,解放时中国处于严重的农业时代和产能不足,目前则是明显的后工业时代和产能过剩。因此我们的首要问题是解决消费问题。 如何解决外国人在华投资和华人在外投资 华人在外投资很可能被主动收归国有,而外国人在华投资则复杂的多。多变的政治格局可能造成外国人资产的价值变化,而估算这个变化是非常困难的。不过总体来说,我预期大部分的外国人在华投资都会被政府回收(当然,还是要付费的)。 文化上的审核和互联网的终结 不消说,现在放的电视都是什么乱七八糟的,统统不准放。还有网线,也都拔了吧。 你真的敢回到毛时代么 从各种变化而言,回到毛时代并不一定直接导致上个世纪的各种惨剧的发生。例如文革,例如百家齐鸣。但是从因果层面推导,我们至少能够看出,如果要回到一切公平的年代,我们就要面对一切公平的问题。 在上文中,我还有一些东西没有写出来。例如工资平均化,工作铁饭碗后,可以预期的,工作热情下降,生产效率下降(别和我争辩不会,上世纪凤阳小岗村改革的原因是什么?)。你虽然和别人一样有钱了,但是你还是买不到你想买的车,想娶的人,甚至你本来可以在淘宝上买到便宜的衣服的,也没有了。这年头谁还上淘宝开网店阿,都国家统购统销了。 更深层的,越是解读那个年代,你就越能感觉到那个年代的折腾,和现在来之不易的自由。为了解决一个居于次要地位的问题,国家可能会在根本问题上做出让我们目瞪口呆的行为来。例如,为了解决城市劳动力过剩问题,居然将多余劳动力反向迁移到农村。这一行为直接导致了一个年龄层的青年们学业中断,人生受到影响。也导致了中国工业化积累不足(中国真正实现工业化,达到后工业时代,还是从90年代开始的)。 自由这个词虽然简单,看似和我们没有什么关系,然而却如同呼吸一般,有着不可辩驳的重要性。当你坐在家里打游戏的时候,你能够想像,自己无法预料明天的样子么?尽管现在我们依然无法预料明天,然而我却可以放心,我的子女不会突然被送到农村,我的公司不会突然不属于自己,我可以在城市里面随意的搬家,只要我高兴。 毛时代真正的悖论在于,他试图创造一个人人富裕的社会,然而却创造了一个人人平等的社会。在一个人人不富裕的社会中实现人人平等是什么概念?只有穷人才会觉得自在,富人会随时有不确定的丧失感。资本主义的基础,即是承认私人财产神圣不可侵犯。所谓“风可进,雨可进,国王不可进”,即是如此。作为其对立极端的社会主义,若不是在一个物质足够的社会上强行实施,只能让有产阶级变得如惊弓之鸟。 你是不是富人 也许很多人不认为自己是富人,我可以提供一个简单的判别标准,按照中国平均国民收入,你是在之上还是在之下? 能够看到我文章的大部分人,在中国平均国民收入中都肯定属于之上的位置。别的不说,收入不及平均收入的,你能够拉到网线再弄一个vpn来看我的blog?因此,在毛时代,你们可能被打为地主和富农,财产被没收。 谁是穷人 真正一无所有的穷人,如果不善待他们,很可能他们才是真正支持回到毛泽东时代的人。

国庆堵车

Oct 11, 2012 - 1 minute read - Comments

国庆堵车的原因 国庆堵车,乃至一切国庆拥堵的原因,是16亿人的时钟被调整到了同一节律上,除此之外别无其他。在国际上,大型节假日也会堵车,费用涨价,这不是什么值得大惊小怪的东西。要说中国和其他国家的区别,主要是三点。 大量的劳动力离开农村,来到远方的大城市谋生。他们希望有足够长的假期回家和亲人共渡。 中国的三大运输行业,主力的铁路还处于计划经济时代,公路则有巨量的过路费。飞机对于大多数人来说不是一个合理的选择。 中国的道路设计和运行,是按照收费状况来进行的。本次假日,价格降低了。 细分市场 对于解决国庆拥堵,市场经济下的标准做法有两种。 一种是保持免费,由质量的下降来控制人数。 第二种是增加价格,让部分人不愿意出行,换取通行畅通。 通常来说,我们更愿意取后者,因为堵塞在路上并不会产生经济效益。而增加出行价格不但会产生直接的经济收益,而且会让部分去不了的人做其他更有意义的事情,而不是呆坐在车上发呆。这种机制叫做市场价格机制。更进一步,我们可以根据出行时对拥堵的接受能力,分割出不同的市场。让愿意接受堵车的人便宜出行,不愿意接受堵车的人付费。这种方法叫做细分市场,即,对于市场的供需状况发生明显变化的区域或者时段,或者人群,采取完全不同的价格策略和服务策略。这样会优化资源配置,让不同的区域/时段/人群获得他们希望获得的结果。 然而,无论哪种方案,都不可能采取反向措施。在高峰时期降低出行价格,让拥堵的道路更加拥堵。本质上说,国庆道路拥堵是由于定价策略根本错误所导致的。他们细分了市场,可是针对高需求市场提供低价策略。你能抱怨发生短缺么?而很多人居然还抱怨到,”不敢占国家便宜了“,”高速收费有理“。对于后者,如果加上高峰时期的限制,我觉得还没说错。对于前者就是彻底的无语了。 同样的市场策略不解还发生在非常多的日常问题上。我曾经提出过分流解决市内经济拥堵的方案,包括非高峰期和高峰期的地铁和出租车价格差异化。很多人都表示不理解。我觉得在经济层面理解这个效应没有任何困难,只要你想想就能明白。简单来说,就是对市内拥挤时期和非拥挤时期差别定价。例如平时公交0.8,高峰期公交1.2。平时地铁3元,高峰期地铁5元。 从市场角度说,这很明显的会压缩高峰时期出行人数,缓解高峰时期的交通工具拥挤现象。而且这个方案并不难实施——地铁和公交基本都是刷卡收费,对收费装置改造,让不同时间收费不同价格并不困难。出租车更是本身就支持这个功能。作为一个合理的驳斥,你可以说这个方案有明显的缺点。这个方案会使得更多的人偏好在高峰期自驾出行,从而加剧道路拥堵。 然而抱怨”太复杂了“,”没道理“,都是属于无常识的。如果说复杂,出租车系统是如何支持夜间收费的?如果说没道理,你为何不投诉出租车夜间费用机制呢?还有个朋友坚持认为,无论票价如何变化,出行人数应当不会有太大变化。用术语来说,即,交通需求的弹性相当小。然而我很简单的问了一个问题,如果是这样,当交通免费的时候,乘车人数应当如何变化?她想当然的说——当然是不怎么变化。旁边另一个朋友同时也说,广州发生过这个事情,地铁瘫痪了。场面顿时冷了下来。 和我讨论的人中,有八成以上的人直觉的反对这个方案,却给不出合理的理由。大多都只能说,太复杂了,搞不起来,没道理。我知道你们的想法——八成的人都需要在高峰期出行,这个无疑是在加剧他们出行的成本。然而,城市的出行费用并不是单方决定的,这是一个供需问题。虽然我没有量化数据,然而根据我对目前状况的分析,我觉得正确的票价不但不会上升,反而应当下降。在高峰时段,我们的出行人数略高了。然而在非高峰时段,我们的出行人数可是远远不足。对此应当采取低票价,鼓励可以调节时间的人在非高峰时段出行。只要非高峰时段采取了低票价,高峰时段人数过多的问题也会适当缓解。 当然,这个方案也有固有问题,即自驾车的问题。从鼓励公众交通考虑,我们应当降低公共交通费用,甚至免费。然而从良好服务考虑,我们又应当调控公共交通费用。这是固有矛盾,没有什么万能的解决方案。比较好的方法是增加自驾出行成本——例如扩大高峰期非上海牌照限行范围(不过这又会拉高上海牌照价格),或者对市内拥堵路段ETC收费。然而,只有几个人,很合理的提出了自驾出行的问题,我认为这是一种理性的,经过思考的讨论。虽然大部分的80后的应当学过经济学,可是能够使用经济学,进行理性思考的人为何寥寥无几呢? 黑洞无毛 同样还有改善高峰期出租车数量的方案,高峰期时段牌照,也是基于细分市场定价。基本思路是发放针对高峰时期的特殊牌照,拟定不同的价格,使得高峰时期牌照的回报比比普通牌照略高一些。按照市场原则,很多司机可能放弃做普通出租车司机,而只开高峰牌照。这样会带来三个好处。 高峰时期出租车增加,打车容易。 平时出租车减少,减少浪费。 只开高峰车的师傅,完全可以在空下来的时候做别的事情,例如开网店,或者导游。 同样是个有各种好处的事情,收到的驳斥意见非常多。有人给我说了一通历史原因,然后分析当政者心理,总结为什么不可能。我觉得虽然这和市场没关系,然而这个分析本身还是有道理的。有人直接扯上了毛泽东时代如何如何,我直接闭嘴了。您要么看我的一篇《回到毛泽东时代》,看看您是不是真的愿意回到毛泽东时代。 其中说历史原因的人非常有意思。他说出租收管理费贵,主要是两个方面原因。一方面,是上海政府大量收取出租管理费作为政府开销。另一方面,则是早年出租运营公司在牌照上都是赔钱的,不让他们赚钱他们不干。 纷纷扰扰的原因,让我想起天体物理学的一个很重要观点——黑洞无毛。 黑洞无毛,意思是黑洞的外界性质,只有重量和角动量。两个重量和角动量完全一致的黑洞在对外上应当不存在区别。因为你既不能通过光观测他的表面特性,也无法做其他信息传出。这相当于一个从现实空间割裂的独立空间。唯一能证实其存在的特性,只有万有引力造成的空间扭曲。 而从经济分析角度来说,一个项目的经济学特性其实也只有一项——风险下的投资回报比曲线。当然,也许不止这一项。我不是经济学专家,所以并不清楚是否还有其他需要考虑的特性。然而,任何能够转化为上述特性考虑,并不引入外部性的特性,就不要出现在我的桌面上了。 不同投入资产,在不同风险级别上,会产生不同收益。虽然没有人精确测量和描绘过这条曲线(说曲线并不准确,绘制出来的话应当是一个面),然而我们都在无意识的使用这个观点。我们经常说“项目风险”,说的其实是投资回报比在XX以上的概率有多大。如果你不介意将投资回报比降低到近乎于无穷小,任何项目都是近乎于0风险的。我们说“低风险投资回报率“,指的是这个曲线在低风险情况下,在普通投资区间的平均回报比。我们说”公司价值“,”项目价值“,其实并不是指项目有多少资产。相反,我们是在评估,这个投资回报比的项目,某一个份额的转让市场价格是多少。 现在,我们可以说回到出租车牌照的问题。出租车牌照问题,我们可以认为是一个项目。而这个项目,无论是历史原因也好,还是什么其他的也好。其实都只是对他的未来回报曲线产生影响。我们可以抛开到底这个问题是什么的问题,转而专注另一个问题——当你最终存在了一条投资回报比曲线——可以是任何曲线——细分市场是否能够对这个市场产生影响,得到更优化的资源配置? 这个当作思考题,大家不妨考虑一下。 公平 国庆交通的另一个话题,则是有人说,中国解决了这么多人的交通问题,这是一个创举。英国的铁路是私营的,然而资本家完全没有改善铁路的打算,铁路依然破旧。网络购票问题本质是铁路运能不足,要加快铁路建设,等等。 我先不说英国的铁路到底好不好的问题,仅仅说另外一个问题——到底是谁?决定要不要修建基础设施。 私营老板出钱 我们知道,基础设施是要花钱的。如果是私营,这笔钱必然是老板出,然后转嫁到客户头上。他自然会考虑,是否可以愿意承担这个费用。如果他们觉得客户愿意承担,那么他们会修修看——同时将修建费用合并到票里面,卖给客户。如果客户不愿意,他们当然不会冒着亏本的危险自作主张。——当然,着有个前提,就是私营老板并没有垄断铁路业。 国家出钱 而如果是国家出,一样是转嫁到客户头上。如果不行,客户数量不足,就会转嫁到每个纳税人——即,你,或者我——头上。 问题来了。不是每个人,包括我,都需要大量使用铁路交通的。与其修建那么多基础设施,来增加高峰期运力。不如降低火车票价来的有吸引力。如果国家修建,然后由纳税人均摊,其实这是不公平的。 实际上,我可以肯定这个花销是无法由客户均摊的。如果可以的话,铁路系统为什么不自己组织修一条线呢?这固然是因为铁路修建的拆迁工作需要当地政府的大力配合,另一方面,也是因为铁路系统并不确定是否能在旅客收入——主要是非高峰收入上——拉平成本。其中也有可能因为国家目前从铁路系统获得大量税收,在不减少这个税收的情况下做不到。精确的说,修建一条铁路的开销无法由铁路带来的客运增量来平衡,因此才是铁路修建需要由国家拨款的原因。 公平论 既然是全民税收,公平就是一个核心问题了。我们首先排除铁路部门贪污腐败的问题,没有看到的事情,我们暂时不讨论。就公平上,是否应当采取这一行动,做一条讨论。 我记得我说过公平论。当你模糊你的身份时,你提出的结论才是公平的。如果我是不需要回家的本地人,为了春运修建大量铁路显然有悖于我的利益。然而如果我是需要回家的打工仔,春节不能回家又是一件很苦逼的事情。权衡两者,我觉得全民收费修建铁路还是一个可以接受的结论。 其他方案 其实在上文中,我们不断探讨各种技术问题,然而都没有涉及一个实质问题——16亿人的节奏在时空上高度同步。这本身是最大的问题。不解决这个问题,讨论细分市场也好,政策公平也好,都只能在技术上,让尽量多的人各得其所。只有让聚集问题彻底解决,才能彻底解决16亿人民的出行和游玩问题。 那这个核心的方案也就呼之欲出了——年假制和生产中心西迁。 目前我国有10天带薪假期,称为国定假日(顺便说一句,这个和其他国家比小气的可怜)。这些日子固定放假。一旦和前后连成长假,大客运高峰就随即发生。而国外很多是采用年假制的。每个人每年都有一定时间的假期,可以自行安排。很多企业还规定,当员工的工龄增加时,年假也随之增加。据说意大利人最长有一个月的年假(羡慕阿)。 年假制度可以减缓高峰的存在。从理论上说,采取年假后全年的交通量应当都是平均的。然而现实告诉我们——没那么美的事。由于传统节日的存在(例如感恩节,春节),很多人选择在节日附近回家。这还是造成了拥堵,不过显然比现在更轻。因为很多没有钱在假日回家的人,可以选择避开假日回家。 年假的一个问题,就是给与某些老板合法剥削员工的机会。因为如果是固定假日,工厂是否加班很明显。而年假则很难说,某人是否休了年假,除了他自己还有谁知道?但是与此同时,固定假日制度难道就不存在“剥削”员工的老板?员工留下来加班,却只支付正常工资,这种老板有没有?不希望休年假,希望多工作的员工,有没有? 我们不能只关注于年假造成的问题,而束手束脚不解决问题。作为一个可行的方案,部分的实行年假是一个很好的思路。鼓励部分企业实行年假制度,对年假不休的实行三倍工资。部分可行至少好过总体上一无所获。 而生产中心西迁,则是中国政府目前正在努力做的一件事。不过限于地理因素,目前效果好像不大明显。如果有时间,我希望对这一问题做一下全面了解和思考,看看到底是为什么。

Y Combinator

Oct 9, 2012 - 2 minute read - Comments

不动点理论 假定我们有一个函数f,例如,f(x) = x^2。对于某些点,f(x) = x。在这个例子里面,0和1很明显就是两个点。这样的点称为不动点。 不动点理论在各种领域有广泛应用,我记得其中之一就是在血型比例上。当ABO遗传规则固定后,存在一些ABO血型比例,这些比例的人随机通婚,生下来的孩子的血型比例亦保持不变。这是三种血型千百年来存在的基础,否则随着遗传规则比例转变,其中某些血型可能已经在地球上消失了。 也许你很好奇,当我们有了一个规则后,例如f(x) = x^2,或者ABO遗传规则(这也可以当作一个函数,将父代ABO比例转换为子代的),如何才能计算出函数的不动点。 答案是不动点算子。 高阶抽象函数的不动点 我们先不继续讨论不动点算子,让我们先讨论一下抽象函数。上面,我们的f都是具体的演算规则,x是一个数(例如x),或者一个矩阵(例如ABO,也可以当作一种数来考虑)。如果x是一个函数会如何? 我们先看一个递归的阶乘计算函数: (define fact (lambda (n) (if (< n 2) 1 (* n (fact (- n 1)))))) 这是一个典型的阶乘计算函数,没错。问题是,我们在lambda里面调用了fact。从语言层面上说,这样做合法。然而从语言的研究角度说,这难免会带来一个问题。函数的名字,到底是一个可有可无的别名,还是一个在递归中必须的东西。如果是前者,我们可以完全用lambda构造递归函数。而如果是后者,我们无论如何努力,也无法仅仅使用lambda来构造一个递归。 OK,这和不动点有什么关系?这时,我们先假定函数f,是真正的阶乘计算函数。即f(n) = n!。那么对于以下函数,((F f) n) = (f n)。 F = (lambda (h) (lambda (n) (if (< n 2) 1 (* n (h (- n 1)))))) 看不懂为什么?这是一个柯里化函数。当我们传递真正的阶乘函数f给F的时候,在函数体内,他叫做h。而按照f(n-1)的定义,我们得到的值和(f n)没有区别。因此,我们有(F f) = f,你也可以写作F(f) = f。 是不是觉得眼熟?是的,f是函数F的一个不动点。要获得真正的阶乘函数f,我们只要对F计算不动点即可。 Y算子 Y算子(或者叫做Y组合子)是另一种高阶函数,用于计算任意函数的不动点。 假定对于函数f,存在不动点x,有f(x) = x,那么Y(f) = x,这是Y算子的基础。按照上文代入,我们可以得到f(Y(f))

小故事

Oct 8, 2012 - 1 minute read - Comments

话说当年,印度打算推行沼气技术。沼气技术都知道吧。据说可以减少粪便污染,不影响粪便当作肥料使用,而且肥料效果还好,还能产生燃料。印度人当年就看上了这项技术,准备实施。 从数据上看,沼气比氮肥工厂好几条街去。不需要外汇,能增加大量雇员,还能发电。氮肥工厂不但资金成本高,外汇,而且还倒需要电力。更麻烦的是,原料是进口的,掌握在其他国家手里,可能上涨。 照理说这么好的东西,利国利民对吧?问题是实施后,印度发生了贫富差距增大。因为以前没有地的农民可以到处捡到牛粪,而牛粪他们是当作燃料使用的(恶。。。)。自从推行沼气技术,富农把散落的牛粪都收集起来拿去做沼气,穷人就没燃料了——而且他们也买不起沼气。 有一个吐槽说,原本没有交换价值的牛粪是有价值的,但是当牛粪有了交换价值,穷人的生活水准就下降了。这是新时代的羊吃人么? 每个时代都有羊吃人的故事的。还有多少人记得当年造船是多火爆的一个职业?还有多少人记得当年DOS程序员多牛?甚至现在都没有多少人记得C程序员了。大部分估计只在大学里面学过,考试的时候记得,然后就——没有然后了。

lupus

Sep 28, 2012 - 1 minute read - Comments

曾经有人问过我这么一个问题,人怎么能自己和自己打架? 其实这种事情并不奇怪,人有一种处分自己体内不合群细胞的行为。当细胞变异时,必须将其消灭,否则会发展成为癌症。如果这个机制的表达过于迟钝,那么会引起免疫力低下,最著名的例子就是HIV。而这个机制的表达过于激进,那么会引起对自身细胞的攻击,例如systemic lupus erythematosus,系统性红斑狼疮。 大型组织中的竞争机制 这个和主题有什么关系?我们先说我的另一个朋友吧,我不能说这位是谁,您别自己跳出来。 我曾经帮一位老板做顾问,就是配置系统,听他的一些架构想法,给一些建议,介绍人帮他培训,实习,干活之类的。我曾经介绍这位朋友去培训,结果他被挖了过去。人各有志,我也不能说怎么样。不过这位老板曾经挖过我,我没有去。 最近他又在找工作了。据说是因为产品出来了,不需要那么大的研发团队,所以整个团队都在离职。 我对此一点都不奇怪。那位老板的定位,从一开始就能看的很明白,那是典型的业务驱动型公司。技术在里面的作用,就是完成业务。这不奇怪,大部分的公司都是业务驱动型,技术驱动型公司才是少数。但是,他的业务又不是具备快速扩展的哪种——至少扩展中的问题不是层出不穷的。那么当技术团队完成了工作,这位老板会接着做其他东西么? 以我的判断,不会。在第一个业务赚钱之前,他不会忙着把其他想法一并做出来。我不怀疑这位老板的人品,但是大部分正常的,有脑子的人在这种情况下都会做出正确的选择。而原有的团队则适当裁员,保留骨干,维持为主。 其实有很大一部分业务驱动型的公司,都有类似的麻烦。做产品的时候,生怕动作不够快,招人不怕多。到了业务出来后,那么一大堆业务人员怎么办?大部分公司都是适当裁员配合持续改进,少部分是上了新的产品。要养一支开发团队很难的——到不完全是钱的问题。问题是规模不够大,不一定有那么多事情给他们做阿。做着做着就没事情了,这下就变成了成本问题。 据说当年宋朝宰相赵普,曾经帮着宋朝打下半个天下。等到只剩北方游牧民族的时候,他便不再设计献策。由是,游牧民族终赵一朝,是为大敌,最终为宋朝送了终。 为何?兔死狗烹,鸟尽弓藏。因此大凡能主天下之人,要么韬光养晦,要么养敌自保,要么干脆自立为王。陶朱公自我放逐,韩信夜死未央,常遇春壮年暴毙,彭大将军死于批斗,大抵都是这么回事。赵匡胤若不是黄袍加身,早晚也要死在恭帝和符太后手里。 换到这个例子上来,一家公司,若是没有业务给业务部持续去做,业务部难道还能叫业务部么? 再说一个例子,某国政局 据说某国大都督被下了大狱。与他走的近的将军们议论纷纷:“听说太子新近要继位,会不会趁这个机会铲除了我们?” 有人献策说,与其坐以待毙,不若养敌自保。先想法和其他国家交恶,大战一触即发。无论是今上还是太子,难道冒着刀刃加身的风险铲除大将么?至于阴蓄死士图谋不轨之类的事情,真到了今上要人的时候,难道还会为了这点小事翻脸。顶多训斥一顿了事。 不久,某国街头上出现了一帮人,见到邻国人就打。 这人又献策说,如今军中多有怨言,不愿开战。若是真打急了邻国,一旦开战,对诸位不利。所以邻国人不能打,要打本国奸臣。 再不久,街上开始打买邻国人东西的人,说是奸臣。

选择哪个linux发行

Sep 27, 2012 - 1 minute read - Comments

选择哪个linux发行 很多人问我,哪个linux发行版更好。这不是个伪命题,而是个蠢命题。哪个发行版更好取决于你要做什么。我们首先把linux发行版分为四大类,deb家族,rpm家族,源码家族,其他。 假如你要稳定部署 所谓稳定部署,就是你没什么机会对系统升级打补丁。听上去很傻X,系统不打补丁?实际上这样的系统非常多。大型跨国公司的ERP,托管在企业封闭机房内的核心业务系统。这些系统的升级成本是非常惊人的,一次升级动辄数天策划,弄一套备用系统来放着,然后再顶着XX的损失停机几个小时。 这种级别的系统,建议你直接上RHEL。不要怕花钱,出问题的损失远远比RHEL的服务费高的多。 假如你要持续更新 对于持续更新的系统,你可以选择debian/ubuntu。这两个系统都具有很强的滚动更新能力。虽然RH系统可以通过yum进行升级,然而RH的追求稳定策略,使得仓库的升级频率要比deb系小的多。 deb的系统有非常简单的配置和升级方案,而且大多保持稳定。ubuntu的策略比debian激进很多,所以软件有更多的新特性——当然,也有更多的死机。 假如你要高度定制 高度定制的系统只有使用源码安装,任何发行版都不会帮你把每个开关组合全部编译一遍。 源码家族中最出名的两个是gentoo和lfs,不过除非你的蛋在燃烧,否则一般是不会用lfs作为自己的应用系统的。大多是使用gentoo来做支持。 假如你只是自己想用用 你是一个彻底的新手 我建议你从debian家族的knoppix开始,或者ubuntu livecd也不错。这两个都是livecd系列,就是可以直接从光盘启动系统并使用,不需要在硬盘上安装,也不需要虚拟机。相反,他们自带虚拟机,可以虚拟一个windows出来供你偶尔用一下。 你是一个有过一定经验的人 那你熟悉什么就用什么。 不过作为一般性使用,我推荐ubuntu。他们针对桌面用户做了很多定制,打造了一个非常不错的环境。在我所知的发行版中,ubuntu的桌面用户是最多的,针对新手的答疑也是最友善的。 当然,文档最好的还是gentoo。 你是一个专家 很感谢你看完这篇文章,你太无聊了。

铁道部的扯淡排队系统

Sep 19, 2012 - 1 minute read - Comments

缘起 这两天同事都在讨论12306的订票机制,据说要排队了。我不买火车票,所以只是大概听同事讲解了一下机制。如果不正确,希望大家告知我。我听到的机制大概是这样的。 首先,是每个人进去,正常购票。当碰到热门线路,在提交时进入不定时的排队。等排队结束,成功与否给与提示。铁道部称,这是为了能够减轻并发压力。 问题 如同老板说的那样,这个机制P都没解决。问题的关键在于系统的每秒负载能力,即每秒能够完成多少个transaction。只要来的人比能完成的transaction多。那只有几个结局: 刷爆网站,这是原来的结局。 堆在队列上,有人买不到票。 如果铁道部宣称的目的是真的的话,那他们一定用错了机制。 原因 铁道部这个系统的核心想法,是将并发的业务改为串行业务。即,前置一个订单系统,减轻核心的交易数据库的压力。实话说,这一定是没在互联网上混过的领导想出来的馊主意。 在通常业务系统里面,如果我们说一个核心交易组件有压力,那么最常用的办法就是排队。然而在互联网上却不能这么干,尤其是很多“非买不可”的系统里面,更不能让用户玩“排队”。因为对于互联网上的人,“分身”是再容易不过的事情了。使用多个浏览器,甚至开多虚拟机,普通人可以轻易的做到4-5个不同的会话。就算普通人做不到,看网络教程学是可以学出来的。每个会话订不同班次的火车。多开会话的结果,就是让队列的长度比原本会长上很多。这是一种级联效应。由于购票组件的处理速度有限,所以压力向前堆积,最终前面的排队系统也会被汹涌的客户(比原来大N倍)玩死。 机制 对此其实我很难想明白,为什么铁道部的核心交易系统有这么差的效率。有网友曾经说,系统要检查很多东西,要上锁——这都是假的。作为铁道部的核心交易系统,和铁道部内部的资讯检查有什么关系?他唯一要做的事情,就是检查是否真的有票,座位多少,有的话锁定一张(这个过程要排他)。 也许你会觉得,既然要排他,那么就需要用事务型数据库。目前数据库平均性能都是1k/s(我们就按照我们在普通台式机上的数据计算好了),而全国每秒成交的数量远大于这个值。这里出的问题? 这是不可能的。傻想也知道,每趟车和另一趟车没有耦合关系。按照车次做哈希,分布在多台服务器上交易就行了。这是典型的可并行系统,效率可以直接用单台机器性能乘以服务器数。在交换机允许的范围内,根本不会有交易性能压力。我们仔细审查铁路系统的结构,会发现,这东西天生就是分布交易的好材料。 部署一组服务器,每一台都部署同一套东西,接口按照REST开放。 将车次哈希后映射到具体的服务器上,所有的余票查询/订购,都向这台机器做请求。而核心服务器只要返回静态页面和车次信息就好。 单个服务器上的每秒transaction要求就不可能太高。 阴谋论 也许有些人会想,这个系统莫非是铁道部给内部留票做的?这又错了。要做内部留票,最简单的方法就是开打内部提前售票限制。只要这个限制一开,他们想留多少留多少,你一点脾气都没有。 结论 我只能归因于国有垄断企业在解决这类问题上的扯淡了,和私有企业没法比阿。建议对铁道部实行拆分。