Shell's Home

春运的两重抉择

Jan 11, 2011 - 1 minute read - Comments

春运了,大家又开始排队买票了哈。 现在有很多“破解”春运难题的意见,破你妹阿。短缺问题就这么几种解法,涨价,增加供给,减少需求。什么搞实名制,春运专列,通通不靠谱。 为什么实名制不靠谱?实名制不是解决短缺的方法,实名制是解决不公正的方法,而且根据张五常的理论,是一点用都没有的。实名制并不改善短缺问题,他只是让“感觉排队买票不公正”的人感觉到比较公正而已。破解方法已经出来了,提前把你的个人身份资料给黄牛,他们照样能弄出黄牛票来。 为什么春运专列不靠谱?春运的时候,铁路运力已经达到极限,这时候再给任何人开一列专列,都会减少其他人的车。这属于剥夺其他人的权利来增加某些人的权利的行为,我们也叫特权。 涨价,这个方法倒是有效,票不够就再涨价么,涨到一定程度总会有人不去的。但是这个理论上正确的方法却是大家最没法接受的,大过年的,一年就回家一次,还要忍受贵死的票价,你妹的还让不让人活阿。 增加供给,这是大家所喜闻乐见的方法。不过带来另一个问题,那么一大堆铁路,平时你养着阿。 那看来,只有在减少需求上下功夫了。尽量把需要人力的工厂搬迁到西部去,资源就地开采,人当地招聘,再通过方法往出运。这个所造成的峰值压力无论如何都小于春运吧。 春运,是中国畸形的城市化过程中的必然之痛。

吃糖的艺术

Jan 10, 2011 - 1 minute read - Comments

张家有两个小孩,张三和张四(想到李四的自己面壁去)。有一天,他们的妈妈给出了他们一个交换条件,乖乖在饭前坐着不溜出去玩,饭后就有一根棒棒糖。张三比较乖,坐着没动。张四跑出去玩,饭后就没糖吃。张四就不开心了。 为什么张三有糖吃我没有? 我出去玩也给张三带东西了阿。 我不管,这不公平。 以上看起来只是小孩吃糖的闹剧,实际上却有着非常复杂而深刻的哲学。其核心问题是,家长是否应当满足孩子的吵闹,给张四吃糖呢? 作为行为理论的基础,“大人”的言行会被视为一种允诺。这种允诺不但允诺自己会做什么,也同时允诺不会做什么。溜出去玩的孩子没糖吃——交换条件是这样说的。如果从大人一方单方面的破坏自己的允诺,那么小孩很容易的就得出“大人的承诺是没有效力的”这样的结论。于是,两个孩子就都不会呆在家里了。作为这种理论的结果,给张四吃糖是一个非常差的选择。如果张四有糖吃,那么下次张三就不会听从自己的命令不跑出去玩。 然而作为一个经典的中国家长,往往会冒出一个“聪明”的想法。他们会和张四讲条件,“来,我偷偷的给你,不能和张三说哦”。这个方案在短期内是异常完美的,张三不会不开心,还是很听话,张四也不闹了。 然而在长期来说,有两种结果。张三终于知道了这个交易,和张三始终不知道这个事情。其实这两个选择的差别只是张三是否有反应而已,对于张四,情况是一样的。他们懂得如何“出去玩也有糖吃”,奥秘在于会吵和对别人保密。于是在张四长大后,他们必然的,有两个特点。在碰到对自己不利的事情的时候,格外会宣扬。这种宣扬,可能是苦天跄地,可能是找记者,可能是找领导。无论原因是因别人,还是因他们自己而起,他们都特别的会吵。在吵得不到自己想要的东西的时候,他们会使用闹的手段。而且如果有人和他们说,“我可以给你们好处哦,但是你们不能公开”。他们也不会考虑为他们奔走呼叫的人,只是说一些“我们也没有办法”而已。 我不知道有多少人将这种明显的功利主义视为一种正常现象——这也许可以给我们当下的很多现象给一个完美的注脚。 更进一步,如果张三也知道了这个交易——这么长的时间内也不可能不知道吧。那么张三采取的对策只能是——保护眼前利益,有的玩赶快玩。如果为了长远利益放弃眼前利益,长远利益是否能得到未尝可知。即使有,对于不放弃眼前利益的人,也同样可以获得——这对放弃眼前利益而言没有任何优势可言。于是两个孩子的行动都只能是——跑出去玩。于是,大人的策略失败了,再调整策略也不会得到小孩的信任。两个小孩也开始互相猜忌,他们的童年结束了。 童年的结束是一件谁也没有办法的事情——彼得潘只存在于神话之中。但是以如此的方式结束童年不能说不是一件悲剧。 大人的行动策略的关键是,让小孩认识到,吵闹是不会获得糖果的。结果只和你的行为有关,和你的理由没有任何关系。要获得什么,就必须付出什么,不失去什么,就不能得到什么。为了饭后能吃到棒棒糖,就必须放弃饭前溜出去玩。为了晚年能够悠闲的在世界各地旅游,在青年时代就必须放弃休息努力工作。对于一边流着泪一边诉说“当时我这样做是多么无奈,我现在甘心接受结果”的人来说,受到和说之前一样的结果——并非我们不宣扬同情,同情是给付出了足够代价的人的。 这个例子是《经济学家写给女儿的一封信》(具体的书名我已经忘了)中的例子,讲的是级差所得税——一种穷人可以“抢劫”富人的税种。如果一个人的富有是因为他年轻时期的勤劳工作,我们有什么理由去对他的勤劳工作征收更高的税呢?这只会鼓励人们不事劳作——作者说如是。

linux虚拟化简介

Jan 6, 2011 - 1 minute read - Comments

又是科普文,行家免入。 关于虚拟机的一些比较充分的讲解,可以看这里(http://zh.wikipedia.org/zh-cn/虚拟机比较)。下文是对linux下希望实现虚拟化和被虚拟化的情况提出一些简洁的说明。 1.windows下虚拟出linux。 不在意版权的人可以装个vmware 6.0以上,在意版权的装virtualbox开源版。字符界面通常分配128M内存,512M交换分区。图形界面512M内存,1024M交换分区。硬盘大小视各个发行会有所不同。对于多数工作用的系统,建议使用debian stable安装后升级到testing,稳定好用,最主要是简洁。128M内存512M交换8G的磁盘,足够系统安装和大部分的开发/运行。 2.linux下虚拟windows。 啥都别说,装virtualbox吧。破解vmware是很蛋疼的一件事情,装ESX就更蛋疼了。建议,XP512M内存以上,要稳定使用至少1G。倒是页面文件,只要512M就差不多了。硬盘至少准备16G以上,否则安装程序加运行数据,十有八九会空间不足。 3.linux下虚拟linux。 主要可用方案分为四类,系统虚拟化,半虚拟化,全虚拟化,硬件虚拟化,分别介绍。 4.linux下虚拟一些比较怪的东西。 这是职业玩家了,例如minix,或者freenas。改天写写后者,挺不错的一个创意。 1.全虚拟化 vmware是这种技术的代表。全虚拟化的特征是可以运行完全不同的系统,例如linux下运行windows。virtualbox是开源中做全虚拟化做的比较好的一款软件。当然,即使是全虚拟化,也必须是同一类CPU,例如32位虚拟64位CPU就不给力了。要虚拟不同的CPU,是CPU虚拟化,例如bochs和pearpc。速度大约是真机器的几十分之一,除了调试程序外没别的用途。 全虚拟化比较适合玩玩其他系统,其他可以选用的方案有,vmware,virtualbox,virtual pc,qemu。 2.半虚拟化 Xen是这种技术的代表。通过修改的真机内核和客户机内核来支持虚拟化。优点是效率比全虚拟化高,缺点是客户机必须是可以修改内核的,这将windows排除在外。但是从理论上,可以在linux的xen上运行freebsd系统,两者都是开放内核源码的系统。 半虚拟化技术一般被拿来做VPS比较多,基本没有其他可选用的方案。 3.系统虚拟化 OpenVZ是这种技术的代表。这种技术通过系统内核级别的代码修改来支持虚拟化。优点是效率比半虚拟化更高,缺点是客户机和服务器必须是同一个内核。因此真机和客户机都必须是linux(或者其他相同系统,例如freebsd),但是可以是不同发行(例如真机debian客户机centos),而且客户机不能自由加载内核模块。 系统虚拟化也被用来做VPS,但是这种VPS有强烈的超卖可能,因此不推荐使用。反倒是在同一个公司内,因为某些原因需要将多个程序部署在多台设备上,每台设备所需的资源又不多的时候,比较适合用。其他可选用的方案有jails,vserver,virtuozzo。 4.硬件虚拟化 kvm是这种技术的代表。当然,vmware workstation,virtualbox等也可以支持这种技术。这种技术是未来虚拟化的大趋势。 硬件虚拟化,是使用CPU和其他硬件的特殊设计,辅助虚拟化的进行。通过硬件虚拟化,虚拟机的执行效率往往可以达到和半虚拟化相似甚至超过的地步,而不需要客户系统的特殊配合。从设计理论上说,完整的硬件虚拟化应当可以在客户机上再执行全套的硬件虚拟化,如VM/370。但是目前Intel和AMD的家用CPU系列只支持在真机上创建一系列虚拟机实例,这些虚拟机的内部是不支持硬件虚拟化的。 硬件虚拟化可以用在VPS/机器切分/新系统尝试等各种环境中,其他备选的方案有,vmware workstation,virtualbox,virtual pc,qemu。

python试题

Jan 4, 2011 - 2 minute read - Comments

前两年在公司用过的试题,不知道发过没有。在我的blog上搜了搜,没找着。大家可以看看玩。 1.py文件在运行时会产生pyc文件,用于缓存编译后代码(3分): a.正确 b.错误 c.不完全正确 —————————- c 2.python支持多线程,能够单进程无缝发挥多路CPU的优势(4分): a.支持,能够 b.支持,不能够 c.不支持,能够 d.不支持,不能够 —————————- b 3.在python中,使用for从列表中删除元素是错误的做法,会导致___________。 正确的做法是使用python内置的____________函数(4分)。 —————————- 漏删元素,filter。(一空2分) 4.请改正以下程序中的错误,并写出结果(12分,本题禁止使用python运行): a=10 def test (*b): print (a,type(b)); a = 20; print a; print b[0](b[0]) if __name__ == “__main__“: print test (*[test]); —————————- 答对一处错误给3分,答对结果给6分,结果其他部分对但type(b)错误给4分。 答其他错误倒扣2分,扣完为止。 a = 10; def test (*b): global a; print (a, type(b)); a = 20; print a; if __name__ == “__main__“: print test (*[test]); 以下是结果。 (10, <type ‘tuple’>) 20 None 5.下面代码是否有错,如果有,请修改错误。 如果没有,写出以下代码的运行结果(15分,本题禁止使用python运行): def wrap_info (f): b = {“b”:10}; def inner_func (*p, **k): print b[‘b’], p, k; b[‘b’] += 1; f(*p, **k); return inner_func; def info (s): print “func info: %s” % s; if __name__ == “__main__“: f1 = wrap_info (info); f1 (“a”); f2 = wrap_info (info); f1 (“b”); f2 (“c”); —————————- 代码没有错误(回答有错全题不得分)。 10 (‘a’,) {} func info: a 11 (‘b’,) {} func info: b 10 (‘c’,) {} func info: c 三个数,全部答对得15分,错一个扣5分,扣完为止。 以下题目可以使用python上机测试 —————————- 6.请写出一个python程序,能够打印自身(15分,允许使用python上机)。 —————————- 本题没有标准答案,将结果在python中运行即可,以下为一个可行答案。 a=“a=%s%s%s;print a%%(chr(34),a,chr(34));”;print a%(chr(34),a,chr(34)); 全题15分,答对给分,答错无分。 7.补完以下函数,使得继承此类的对象具有单例特性(10分,允许使用python上机): class singleton (object): ”“” 单例模式的实现 “”” def __new__ (cls, **kargs): ”“” “”” 以下填空。 —————————- 以下为一种实现,其中_instance可以改为其他名称。 if ‘_instance’ not in cls.__dict__: cls._instance = object.__new__ (cls, **kargs); return cls._instance; 全题答对给10分,以其他方式实现单例给4分。 8.yield通常在python中被用做生成器,但实际上,这一实现是一种被称为协程的多线程交互模式。 请补全下面的代码,使得两个虚拟的线程能够互相交互运行(12分,允许python上机)。 def thread_1 (): for i in range (0, 10): print i; yield i; def thread_2 (): for i in range (20, 30): print i; yield i; def run (thread_pool): if __name__ == “__main__“: thread_pool = []; thread_pool.append (thread_1 ()); thread_pool.append (thread_2 ()); run (thread_pool); 结果为0-9和20-29交替出现,不用考虑多函数的生成器停止不同步问题。 —————————- 该题也为多种答案,运行通过即可。 def run (thread_pool): try: while True: for i in thread_pool: i.next (); except StopIteration: pass 其他答案亦可,但结果不能交替出现不算分。未能捕获StopIteration扣6分。 9.指定加载问题(21分) 假定目前有一个正在工作的业务系统,其中一个抽象类大致如下: class IfaceWorkspace: ….

为什么C语言并不适合语言入门教学

Jan 2, 2011 - 1 minute read - Comments

国内学校基本都用C语言作为入门语言教学,某本C语言教材大卖,这TMD是我看到的最蛋疼外加胡扯的事情了。你们打算把全校学生包括传媒系都培养成职业程序员么?感谢上帝,中国已经有部分学校用了java乃至python,让我不至于太绝望。 C语言作为语言之王,有着与生俱来的优势和原罪。你可以不用,但你不能无视。python的os模块基本都是底层封装,封装的是什么呢?linux下是libstdc或者是linux c api,windows下是SDK API,都是C接口而不是C++接口。因为C是一层对底层数据结构的高层抽象,主要解决兼容性问题。例如ARM/x86平台不兼容之类的问题。用C写代码的时候,就是在直观的操作底层的数据,包括内存结构,指针。正是因为这个特点,因此几乎所有平台都用C作为底层语言,并且提供C的API接口。然而也是因为同一个理由,C中缺乏高级对象支持,写一个稍稍复杂点的结构就必须动用数据结构的知识。例如你需要模拟一个园区的物流运作,因此需要写个程序。很明显,运作是以时间为顺序触发的,因此需要一个时间队列。熟悉数据结构的同学应该想到,最适合的结构应当是堆排序中的堆结构。如果没有,那么链表结构也能凑合。但是在C语言里面呢?抱歉,你需要自己实现一个链表。 纳尼?我它喵的为了做一个园区运作的模拟,它喵的先要啃数据结构书,然后写链表代码。你当我是计算机系的学生阿,老子是管院的。 C++比C更适合这个问题,C++中可以使用STL,而STL中的list算是凑合的解决了这个问题。哪怕用vector,也算一种可以接受的方案了。C下面为了绕过这个问题,我用了65536长度的数组,于是程序一开就是10+M的内存。这还是我能找到的最优雅的解决方案——总比自己去写一个或者用第三方链表好。java就很明显更加适合解决这个问题,它内置了list数据结构。python虽然没有list结构,但是可以用array模拟,也可以用堆结构。 无论如何,总好过去找第三方库吧,真当老子是IT民工啦。 C++比C好点,但是使用C++的原罪是C++复杂的语法结构。光是类的问题上,就有静态,成员,虚三种。每种配合上public protected private,再继承一下public protected private。大约有27种情况需要记忆,它喵的这是写程序还是玩大家来找碴阿。而且还有重载,算符重载,隐性类别转换,强制类别识别这些绕死程序员的问题,我怎么看都不觉得适合给啥都不懂的非计算机系学生解决问题用。 非计算机系的学生,需要的是这样一门语言。好用,强大,建模和解决数学问题的能力要强,速度和安全性可以无视。很明显,C根本不合格,连边都够不上。因此在国内高校中,实际是matlab和java承担起了这个任务——然而这两门都是非必修选修课,或者压根没地方教。 有用的知识不算分,甚至没地方学,没用的垃圾要考试——这个,我真——无语了。。。

为什么我说框架和工具不是解决安全性的良好方案

Dec 30, 2010 - 1 minute read - Comments

在python-cn的maillist上,刚刚爆发了一场关于动态语言合并出错的争论。问题的起源,来自于这样一个问题。 一个程序员A,写了一个函数,function1。程序员B对函数进行了调用。现在两个人分别在svn上工作,A修改了function1,而b修改了其他内容。 由于python并不在编译时检查类别问题,因此当两人的svn merge后,运行并没有出错。现在,问题只有等上线后客户提出来了。 几乎所有的人都同意,这问题的根源不是一个语言的问题。本质上说,这是一个工作流程问题。即使是C,也只检查参数的个数和类别,对于行为的变化和参数意义的变化还是无能为力的。 1.当你公开了一个函数,并要修改这个函数的外观行为的时候,必须向其他人通告。 2.python代码要通过unittest和黑盒检查覆盖。 3.代码应当cross review。 争论的焦点主要是在python下如何避免这个问题。楼主Zhang Jiawei的观点是使用pydev,加上工具来检查。我,沈崴,ZQ的意见是通过行为来避免这个问题。所谓行为,主要包括以下几个。 1.互相review代码。 2.修改通告。 3.编写无检查和无处理的代码,并大量运行。如果代码中有错,程序会持续崩溃。因此当大量运行程序不崩溃时,代码就无错了。 为什么我们并不推荐使用自动化工具来检测错误呢?主要是因为自动化工具可以*找到*问题,但是却不能*保证*是找到问题最彻底的一种。我举个最简单的例子: 网络工程师A,用了pylint,找到了自己code中的15个低级bug。他很高兴,因为工具使用起来很方便。 A向领导汇报了自己的心得,建议全公司推行这个工具。假定他的领导是项目经理B。 A:这个工具太好了,一下就找出了我15个bug,我发现用这个工具很方便,blahblahblah。 B:恩,很好,过两天你在公司里面讲讲这个工具。对了,你的code review做了么? A:我用工具查过拉。 B:你确定他找出了你的*所有*bug么? 问题的关键,就是*所有*。我们当然不可能找出程序中的所有bug。我所知的bug最少的程序是TeX,据说在数年的时间内只有数个bug。但是其版本号仍旧是3.1415926——正好是祖率的密率——而不是pi。我们毕竟不敢——高伯伯也不敢——保证没有bug。但是通过cross review,不处理加覆盖性检测,我们可以保证bug出现的概率在某个水平以下。 自动化工具寻找出的bug,是在这个水准以上的。就是说,自动化工具看的出的,人应该看的出。人看的出的,自动化工具不一定看的出。如果做不到这点,说明你的水准还不足。 所以,当我们需要一个尽量无错的code时,当你pydev/pylint,或者其他工具做了检测,问题是否解决了呢?没有,你仍旧需要review来保证没有bug。这样一来,工具的意义在哪里呢? 当然,这并非说在做code review之前,你*不能*去做一遍代码扫描。只是说这样做并*不能替代*对错误的人工控制行为。 除非你的目标是使用最低的成本,将错误减少到一个可接受的规模——而不是最低。就像我们在外包中常做的那样。这种情况下使用工具是比较合适的。 而且一旦使用工具,很多程序员会产生依赖。所谓依赖,并不是讲从逻辑上他们不清楚在代码扫描外还需要独立的人工检测。但是在检测时,心里就会抱有一种放松的心态。尤其是其中某些虫族程序员让人无语叹息的行为。在中国的程序员界,有着诸多非常有创造力的bug提供者。例如擅长用str+=的java网页程序员很常见,这属于常见问题。但是自己写一套字典映射规则以完成数字到字符转换的(就是c下面的itoa).net程序员真的让我大开眼界——而且他同时犯下了str+=错误。要指望工具修正+=是可以的,要指望工具找出这类极品代码,估计下面会有更极品的人犯下更极品的错误。。。

elisp的简单介绍

Dec 25, 2010 - 1 minute read - Comments

emacs是利用elisp写成的,而elisp是lisp的一个方言。lisp语言是出名的优美和晦涩,当然,更出名的是括号。。。 emacs利用elisp作为上层抽象。首先,emacs提供了基本的编辑器框架,包括文件操作函数API,buffer,frame,windows的API。而后,emacs附带了很多函数实现,并且和按键一一绑定。例如Ctrl+N(简写为C-N)就被绑定到“换到下一行”这个API上。于是,我们按下Ctrl+N的时候,就会触发“换到下一行”这个函数的执行。dired等插件也是基于类似的原理写成。 我们可以用类似的方法,来编写自己的函数,扩充emacs的功能。下面我们看一个例子: (defun popup-term () (interactive) (apply 'start-process "terminal" nil popup-terminal-command)) 首先先说明一下,elisp的基于规则是利用括号匹配的s表达式,通过特定规则计算表达式。每个表达式由多个原子构成,一个原子可以是符号,对象(数字或者字符串),序对,表(包括空表),树,以及他们的嵌套。求值的时候,第一个原子做动词,先求值第一个原子,直到得到一个对象,再根据第一个原子的特性决定正则序和应用序。应用序的先对每个后续原子求值,再调用第一个原子对应的对象。正则序直接交给第一个原子对应对象处理。上文那个表达式,最外层的是(defun)列表,defun是函数定义函数,popup-term是符号。这部分混合起来,就是定义(interactive) (apply ‘start-process “terminal” nil popup-terminal-command)为一个函数,并在上层框架空间内把内容赋值给popup-term这个符号。说的更直白一点,就是定义函数。 当我们执行popup-term这个函数的时候(M-x加上函数名就可以手工调用),首先执行interactive过程。这个函数可以在这里(http://www.gnu.org/software/emacs/manual/html_node/elisp/index.html)查到,基本上,可以认为执行了这个函数,才能够和前台交互。而后是apply函数,这个函数将后面的几个值作用于紧跟着的那个符号所对应的函数。用python语言来描述,大概是这个样子。 def apply(func, \*param): return globals()\[func\](\*param) 这个函数真正的部分,是从start-process到括号结束。其意义是启动一个子进程,名为terminal,没有对应的buffer(熟悉emacs的应该知道这是什么),命令为popup-terminal-command。这个命令在windows下和linux下有不同定义,所以我将这个定义放在了emacs-win.el和emacs-linux.el里面。在linux下,他是这么定义的。 (setq popup-terminal-command '("x-terminal-emulator")) setq是设定一个全局变量。整句合起来的意思是,在执行popup-term的时候,启动一个子进程,执行x-terminal-emulator。最后,将popup-term绑定到keymap上。 (global-set-key \[(control c) (s)\] 'popup-term) 现在,在任何一个buffer中按下C-c s,就可以弹出当前目录对应的term了。 我们在emacs中所做的所有配置,插件安装,其实本质上是写代码控制其他代码的载入,变更环境变量。只要有合适的文档,或者有时间阅读源码,我们就可以对其他程序进行扩充。下面介绍一个对dired进行扩充的例子,我们向dired中加入copy-from和rename-from,还有dired-open功能。dired的copy和rename必须在源目录中,选择文件,按C,输入目标路径。有的时候我们在某个目录工作到一半,突然需要从另外一个目录复制一个文件过来。这时候打开对方目录进行复制动作太繁琐,因此我编写了两个函数,分别绑定到r和c上。dired-open则是另外一个文件,有时我们需要通过其他程序打开某个文件,例如播放电影。在dired中直接用&可以实现这个目标,但是需要自行输入播放命令,而且会新开一个buffer。以下是代码。 (defun dired-open-file (&optional arg) (interactive) (apply 'start-process "dired-open" nil (append (split-string (read-shell-command "command: " (dired-guess-cmd (dired-get-filename)))) (list (dired-get-filename))))) (defun dired-copy-from (&optional arg) (interactive) (let ((source-path (read-file-name "filepath: "))) (copy-file source-path (file-name-nondirectory source-path)))) (defun

空间,VPS和独立主机的对比

Dec 21, 2010 - 1 minute read - Comments

空间和VPS的差异最主要在支持的压力和配置的自由度上。通常而言,空间支持的压力比VPS要小,配置也更加不灵活,当然,也可以叫更加简单。两者都可以通过加钱来升级到更加性能优异的程度,因此很难说什么情况下该用什么。简单的做法是,如果空间能满足你的要求,就不要折腾VPS。通常折腾VPS的都起码是专业公司了,通常都有自己的网管。一般公司的误区是,希望自己拥有对机器的完整权限,因此更倾向于托管机器。然而托管机器的成本并不像你所想像的那样低廉。 首先,同样的硬件,在你手里的利用率一定比在VPS商手里的利用率低。这是理所当然的,VPS商就是通过组合不同的性能组合,精细调整压力,来赚钱的公司。在VPS商手里,基本每字节内存,每个CPU时间片都是充分利用的。而一旦你买进托管主机,用的掉不用掉这都是你的事情了。当然,与此对应的,当高压力到来的时候,VPS比自己托管机器的响应更快。基本只要信用卡刷下去,性能就立刻上去了。 同样,这个特性也比较适合那些资源的峰谷比特别夸张的公司,尤其是一些几个月内会受到超大压力,过后肯定会被放弃的项目。VPS方案可以允许你短期内租用一些机器来工作,过后没有扫尾工作。 其次,由小公司运作的设备,其平均无故障时间远低于专业VPS商,也低于主机托管商。道理也很简单,硬件的物理损坏会降低平均无故障时间。而虚拟主机和VPS都是通过无单点故障的均衡系统来解决这个问题的,这个方案对于只有几台设备的小公司不适用。更进一步说,如果万一出问题,非专业人员的恢复时间无论如何比专家来的慢。 最后,最主要的是,如果使用空间或者VPS,你无需关心硬件淘汰问题。通常网络公司很少碰到多年后使用寿命满导致的机器淘汰,通常都是性能不足而进行的机器替换。汰换下来的机器用起来不方便,卖掉不合算,是个很鸡肋的东西。VPS商会自行处理这些事情,并且在机房升级后,通常还会给用户一些自动升级。 我们现在来算一个实际问题,一个比较典型的小网站,平均同时在线人数大约是400人,峰谷比大约是1:5。页面滞留时间按照20s计算,每页面流量10K,每session内存消耗0.5M。为了支持峰值在线,大约需要1G内存,瞬时带宽消耗大概是1M/s,一个月的数据流量大约是600G。一台中等的1U小型服务器大概是2W,分摊到3年折旧,每个月就是600。1U的托管最低是6000(我怀疑现在哪里还能弄到这个价格),最高的有10W的。按照1.2W计算,一个月是1000。加上少量的中间费用,直接管理硬件的成本大约是1800-2000RMB/mo。dreamhost的不限空间不限带宽服务一个月费用是9美元,折合60RMB/mo不到。gplhost上的Xen服务器,60G硬盘1.2G内存360G带宽是70美元,折合450RMB/mo。其他厂家也有200-350RMB/mo不等的类似服务方案,不过有可能是基于OpenVZ的,有超卖的可能。 为了支持这个小网站,如果使用小型服务器托管方案,那就是一台服务器搞定,1800-2000RMB/mo。如果是Xen服务器,大约是900RMB/mo。如果是空间,性能顶得住就是60RMB/mo,顶不住就当场崩溃。 基本结论是,如果你的程序并不特别重要,那么用空间。如果应用的峰值内存消耗小于2G,那么用VPS。如果峰值内存消耗奇高,或者月流量超大,还是自己托管服务器稍微省点钱。

从电影贴片广告说起

Dec 20, 2010 - 1 minute read - Comments

昨天去看了姜文的让子弹飞,挺不错的一部电影。片子简洁大气,很有张力。不过这不是重点,重点是,贝壳头一次碰到了传说中的贴片广告。 电影贴片广告分为两种,占用播放时间的和不占用的。后者是在电影票预定时间之前的广告,前者则是在电影放映许可后的。例如昨天的让子弹飞,电影票的时间是11:20,广告是从我入场(11:15)做到11:30,足足做了15分钟。头5分钟是不占用播放时间的,后10分钟是占用播放时间的。贴片广告让人反感又价值巨大,是因为如果不在电影院规定播放时间入场,就不能再入场。而一旦在规定时间入场,后面的时间就是完全的广告时间,必定人人都看,这种行为很让人倒胃口。广电总局曾明令禁止贴片广告占用播放时间,但效果不彰。电影院申辩说,他们和片方签订的协议规定电影院不得随意剪辑电影,而贴片广告则是加在电影头部的。但是广电总局的规定中也说到过,可以安排电影提前播放,观众在正式影片播放时间入场。可见院方理由是在推托责任。按照常理分析,院方如果没有好处,是不会做这种又得罪广电总局又得罪观众的事情的。由此可见,院方也能从贴片广告中分得一杯羹。 从某种意义上说,这是广电总局监管不到位的原因。不过我们对照广电总局对于各种节目的管理,还有在魔兽世界问题上广电总局的威风,就会发现,广电总局有的是办法和手段来管理。他们能禁掉和自己完全没关系的网络服务器,难道不能关掉电影院么?哪家不执行关哪家,电影院不执行关电影院,片方不执行不给许可证。可是他们没有这么做,除了一个规定外什么都没有。可见广电总局并不是真的想管贴片广告,只是迫于观众的言辞不得不虚与委蛇。由此再深追,难保其中没有什么猫腻在里面。 但是细细去想,真的只是广电总局的原因么?很多时候我们都把责任推给政府,像鸵鸟一样忘记了自己也有责任,而且自己是受害者。对于贴片广告的问题,在完全市场中绝对不可能存在,这是完全不对称信息的特征。很简单的去想,如果每个看过电影的人都可以给出电影的细节信息,例如市百一店影院在让子弹飞前面播放10分钟贴片广告,并且每个准备看电影的人都能收到。那么贴片广告越多,越少有人观看。当然,对于热门时间段而言,即使是贴片,或者票价昂贵,位置不好,一样会满场,这是市场特征。然而我们却没有一个机制,让看电影的人,能看到看过电影人的评价。这分为几个原因。首先是很多看电影的人,对这些信息不关注。大多数临时决定去看电影的人,总不会先检查电影的所有特征吧,最多看看影评就差不多了。这个导致了看过电影的人对传播这一信息没有热情,反正说了也是白说。不过最关键的,是我们的反馈信息传播机制存在问题,主要是传输渠道会被人为的扭曲。 例如,我们的报纸,新闻单位,对电影的评价传播起到相当重要的作用。但是这一渠道是可以公关的,片方可以通过金钱来驱使这些单位不报道自己的负面新闻。不是有个笑话么?每年春节和三一五都要花钱,不过前者是花钱要求上节目,后者是花钱要求不上节目。而我们的民间传播渠道,则多数是由少数的知名人士,包括名人,博主,作为中心的。这种模式的好处是可信,你知道这个人是谁,他的背景,他会为自己的话负责。然而,同报纸电视单位相同,这种个人也是可以公关的。我们可以证明,可信和人为扭曲是必然同时存在的。你越要求可信,信息越容易被扭曲。 从个人的角度说,我们也许无法改变整个链条,不过我们可以改变末端规则。如同那个笑话说的,有个买便宜货的诀窍——永远买第二的产品。我们在听取一个事情的信息的时候,往往要刻意的保持一定比例的私有消息和不可信消息源。我们的朋友,不出名的人士,所传递的小道消息。用这些消息和官方的消息互相验证,来形成信任链——说过越多可信的,有价值的消息的,我们越信任。可以证明,这种信任网络是很难被单点劫持的。

公司的网络服务选择

Dec 16, 2010 - 1 minute read - Comments

最近碰到不少朋友需要做网站,或者做一些网络产品对外服务。下面统一解答一些基础概念问题,程序员或者本行的人士可以不用继续往下看了,都是常识。 1.网站/产品都包括什么东西? 从最简单的来说,你做了几个页面,放在网络上,让其他人看,这个就属于网站的范畴了。更复杂的,论坛,wiki,产品目录,公司主页,都属于互联网网站/产品。 2.为了让别人可以访问你的产品/网站,你要做什么。 我们有个术语来描述“让所有人可以访问你的产品/网站”这个定义,叫做上线。作为基础,你需要一个服务器,和一个域名(这两个名字我们下面解释)。也许你需要一些其他东西来让网站上线,但是至少一个服务器和一个域名是必须的。域名是你对外宣传的基础,其他人通过域名来访问你的网站。服务器则是支持别人访问的系统。 如果你打算对使用中国的服务器,或者说在中国经营,那么你需要在中国的网络管理部门进行备案。 如果你打算使用现有的程序,或者不需要开发程序,那么你可以忽略程序开发过程。但是大多数人都需要一些经过修改的程序,乃至于编写一些程序来让网站运行。 无论你在上面作出了何种选择,最终,你需要维护你的网站。如果你不熟悉这个过程,可能还需要一个人来管理这部分。 3.听起来很复杂的样子,那么,怎么做? 我们先解释怎么弄到服务器和域名,还有备案,程序开发和维护后面再说。 如果你对上面这一切完完全全一点点都无法理解,那么你可以不用继续阅读了。找一个信得过的专业人员,或者让信得过的人推荐一个,然后让他搞定这一切吧。 如果你还基本能听的明白,那么可以自己试着去买一个服务器和域名。我建议你从购买空间开始。 空间:多人合用 多人共享一个IP 只提供网页和邮件服务 很难安装系统软件 VPS:多人合用 一台机器一个IP 提供所有服务 除了部分内核组件外,都很容易安装和更换 独立主机:一人独用 一台机器一个IP 提供所有服务 可以任意管理 通常,大多数空间服务商都提供域名购买服务。域名和空间都是要每年付费的。注意,由于空间很难安装系统软件,因此空间支持的语言通常都是限定的,现在大多数都是支持asp或者php,偶尔有支持其他语言的,不多。在进行程序开发或安装时,必须确定空间可以支持这种语言。 如果你面向中国的群众提供服务,或者机器在中国,就必须进行备案。一般的空间服务商也提供备案业务,不过备案的情况非常复杂而且随时都在变化,因此请询问清楚现在的情况再做决定。如果可以的话,我建议尽量不要将服务器托管在中国,或者购买cn域名。 4.我买了一个空间/VPS,还有域名,然后呢? 那么你需要把合适的程序开发出来,并且放上去。通常来说,你能想到的东西一般都有良好的开源实现。你可以咨询一下专业人士,并且尽量听从他们的建议。大多数个人和公司的需求,都可以通过在开源的论坛/blog/wiki/CMS系统/ERP系统上进行简单的配置/混合/定制开发来解决(很绕?简单来说,肯定有现成的)。千万不要低估开发的成本,也许你觉得程序员很便宜,想自己动手,找一些人做一个出来。但是就我的经验,在IT业没有经验的公司要进入这个领域,几乎没有成功的经历。主要问题在于不熟悉流程和管理,导致开发总是在莫名其妙的地方停顿,并且产品的质量很难控制。(简单来说,你会掉到泥潭里) 如果你真的需要进行开发,外包是一个方案,但是也很容易失败,问题的核心也是无法控制进度和质量。对于小规模的东西,找信得过的人单人开发或者推荐人开发是个可靠性很高的方案。 5.我有程序/我找到了合适的程序 恭喜你,现在离上线只有一步了。你需要将你的程序放到你的服务器上,并且将域名指到服务器上,这一步可以请一个专业人员来做一下。然后你的产品就上线了,我们管这个过程叫做部署。 但是,且慢高兴。除了第一次的部署,你还需要定期做例行维护。例如你运行了一个论坛,总不能让人上来全看到广告吧。你运行了wiki,上面全是骂你的话。你的产品目录需要经常更新,邮箱更是天天要看。通常你需要至少一个人,来盯着你的产品。如果不复杂,叫个行政兼职看看就好,如果比较复杂,还是请职业网管的好。如果你要将这个产品的名气打响,还需要进行产品的推广/营销工作。这部分就更加复杂了。 6.让我总结一下 你最好找一个专门的咨询人员,咨询一下有没有适合你的产品,能不能简单定制一下搞定。如果可以,你需要支持哪种语言的空间(如果你用空间的话),压力大概多大,能否支持。自己去购买合适的空间或者服务器,还有域名。然后让人(通常一事不烦二主,咨询人员也兼职部署)部署上去,并且找个人盯着。大概就是这样。