2010年12月30日星期四

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

    在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+=错误。要指望工具修正+=是可以的,要指望工具找出这类极品代码,估计下面会有更极品的人犯下更极品的错误。。。

2010年12月25日星期六

elisp的简单介绍

    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 dired-rename-from (&optional arg)
  (interactive)
  (let ((source-path (read-file-name "filepath: ")))
    (rename-file source-path (file-name-nondirectory source-path))))
(add-hook 'dired-mode-hook
          (lambda ()
            (define-key dired-mode-map "b" 'dired-open-file)
            (define-key dired-mode-map "c" 'dired-copy-from)
            (define-key dired-mode-map "r" 'dired-rename-from)
            (define-key dired-mode-map [(control c) (g)] 'dired-etags-tables)
            ))
    如上文一样,我们定义了dired-open-file函数,这个函数的核心部分是start-process,但是在命令上,我们的命令是这个。
(append (split-string
                  (read-shell-command
                   "command: " (dired-guess-cmd (dired-get-filename))))
          (list (dired-get-filename)))
    这段代码,是将两个表进行混合。第一个是从mini-buffer读取入一个命令行,而后分解为列表,读取时的默认值由dired-guess-cmd这个函数确定。第二个表是当前光标所在的文件名。两者合起来,在执行的时候就会变成命令行后加上文件名的执行效果。而dired-guess-cmd这个函数,接受当前文件名作为参数,猜测一个正确的命令行。在windows下,大多数时候等于start,linux下则是大多数时候等于xdg-open。
    下面的dired-copy-from和dired-rename-from函数非常简单,大家可以自行分析。不明白的函数可以查阅上文那份elisp的参考手册。
    最后,我们把这些函数绑定到键上。由于不是全局绑定,因此不能使用global-set-key。非常幸运的,dired在加载的时候会调用dired-mode-hook。我们将一个lambda函数加入这个函数调用中,这个lambda函数中,使用define-key定义了键和函数的对应关系。于是,我们在dired模式下,通过b c r就可以调用以上三个我们编写的功能了。
    elisp可以通过pymacs和python进行混编调用,但是通常并不需要这么复杂而强大的东西。我们可以通过进程级python调用的方式调用python脚本达成任务。例如一下这个脚本。
(defun dired-etags-tables ()
  (interactive)
  (let ((etags-path (expand-file-name (read-directory-name "etags path:")))
        (python-command (expand-file-name "~/.emacs.d/gen_etags.py")))
    (call-process "python" nil t nil python-command etags-path)))
    在某个目录下,按下C-c g,会自动生成目录下所有可能的程序文件的TAG,供visit-tag-table使用。这个python脚本就不附上了,大家可以用自己喜欢的语言编写,例如ruby或者bash。
    最后,在此提供一个比较简单的emacs脚本调试技巧。通常我们写好程序,在表达式的括号上按下C-M-x就可以eval这个表达式。用这个方法,可以在不重启emacs的情况下更新函数。类似的,用C-u C-M-x就可以对函数设定EDEBUG包装。这样当你调用这个函数时,会弹出断点窗口。按下SPC就可以单步执行脚本。

2010年12月20日星期一

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

    空间和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。如果峰值内存消耗奇高,或者月流量超大,还是自己托管服务器稍微省点钱。

2010年12月19日星期日

从电影贴片广告说起

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

2010年12月15日星期三

公司的网络服务选择

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

2010年12月14日星期二

Cybersitter诉大正及索尼案

    准确的说,应该叫Cybersitter诉大正案。
    1.这是一起知识产权案子,属于私人起诉私人,和政府没有关系,和美国表达对中国网络审查现状的不满一毛钱关系都没有。
    2.美国法院和美国政界的总体倾向是判决Cybersitter胜诉,而且追偿不会太低。这次拒绝在中国审理而坚持在美国审理就是非常明白的表现。
    3.这倒是不难理解,对于知识产权,老美向来非常重视的,尤其是这种能正大光明宰中国一刀的案子,能打多大就多大。
    4.中国官方也许会试图通过外交影响判决,也许不会。因为绿坝这个问题上连自己人都觉得脑残。但是即使是国家主席去讲话,美国也肯定不会理会,因为美国对中国的版权惩罚已经作为一种对抗战略执行了。
    5.如果真的跨国追偿,大正公司肯定以倒闭对应。他们会老老实实的准备应诉才是奇怪的事情呢。就算应诉,肯定也输,到最后一步,肯定倒闭了之。
    6.更可能发生的,具有中国国情的事情,是大正公司不予理会。而后是美国要求中国履行版权协定的相关条款,否则诉诸WTO等等的威胁,而后是两国的政治博弈。
    7.中国人民的税金肯定拿不回来了,中国的媒体对此表示完全不知道。
    8.索尼,方正等几家公司是追偿的主力,肯定要出血。他们在美国有业务,基本不可能不理不睬。
    9.工信部可能会以政策来换取几家外国公司高层的谅解,也可能不需要谅解。对于中国公司,完全不用考虑这个问题,因为这些公司属于被工信部管理的对象。
    10.但是即使如此,工信部今后的命令在这几家公司也未必能得到完全的执行。因为在这个问题上,工信部出尔反尔在前,属于无智商的脑残。事后的政策也不可能给几家公司一个太大的漏。
    11.这件案子影响最大的将是在国际上,尤其是美国有比较大业务的公司。他们在中国犯下的版权错误,只要一方牵涉美国版权,可能在美国得到审判和惩罚。

2010年12月13日星期一

程序员的路线和培养

    也许我说过这话了,再说一遍也不嫌多。程序员不要什么都学,什么都吃。不但要吃好的,而且要能穿起来。先学什么,后学什么,学成是什么,大概要有个数。不在这个范围附近的东西尽量别碰,活也尽量别接——除非钱贼多。
    很多新手程序员和我以前一样,看到好的技术就去学,看到大牛就去拜。结果php程序员同时还会汇编,又玩过过图形识别——这种技术组合想干嘛?joel on software表达过类似的意思,程序员的时间很值钱,最主要是前面做过的东西会变成后面的财富。前面做了个项目赚1000,后面做有关项目的时候就可以以一半的成本做1000。这样下去,只要项目足够——或者有人请你——做到三年以后工资往往是前面的几倍。反过来,前面两千三千挑值钱的做,往往到了后面还是这个值不变。用另一句话描述,“我要找的是五年经验的程序员,不是一年经验乘以五的程序员”。
    差不多就是这么回事了。

2010年12月9日星期四

U盘安装debian的技巧

    翻译文,原文看这里
    首先,去一个足够好的镜像(有些二级镜像会没有iso等安装文件的镜像的,具体可以看这里)下载debian/dists/lenny/main/installer-i386/current/images/下面的boot.img.gz文件,然后执行:
zcat boot.img.gz > /dev/sdX
    sdX是你的U盘设备。再然后,下一个businesscard文件放到目标盘上,这时候/dev/sdX是一个fat格式的文件系统。重启后,businesscard就会自动运行,如同被刻了一张光盘一样。
    简要说一下businesscard,netinst,和完整光盘的区别。businesscard上没有任何安装包,所以你所需的所有安装包必须从网络上抓。这种安装方式下,没有网络就无法安装。netinst上有最小系统所需的安装包,大概100M上下。在无网络的情况下,可以安装出一个字符界面的可联网系统,用于进一步配置。而完整安装光盘把600M多的软件包全打了上去,即使没有网络,你也可以装出一个标准的图形界面可工作系统。2张DVD的那种安装光盘把i386的所有安装包都打了进去,你要装什么都不用上网了。
    装大量机器的时候,建议使用businesscard加上缓存代理。

2010年12月8日星期三

盗版的盗版

    最近追书,很不好意思的,在看盗版。
    最新两章,有内容和上面对不上,而且是每个网站都对不上。
    联想到上次晚上12点整出书,12:10分出所有网站盗版一起出来的情况——
    ——这年头盗版商都是盗来盗去的。。。
    是不是该考虑花钱看书了啊。

2010年12月2日星期四

一个产品的预测

    简单点说,我预测客厅电脑会在3-5年成为一个潮流。下面给出一个客厅电脑的可能特性。

1.具有wifi,并且可以做AP。
    设备具有wifiAP的能力后,就可以直接取代路由器。不但具有节约一个设备,而且可以做一些比普通路由器更加强大的功能。例如下载托管(关掉主机继续跑ed/bt/http),流量控制,IDS防火墙等。
    同时,对于其他设备,可以逐步支持wifi标准,通过wifi操控。例如照明的自动控制,音箱音量智能感知和控制。开放的wifi标准加上UDP做起来并不太难,最大的问题是wifi芯片的成本能降到多少。
2.平均功率<20W,峰值功率<40W,体积大致相当于笔记本。
    设备需要扔在电视机顶端或者下面,一直开机的。如果大小太大,或者功率太大,就没有实用意义。
3.内置摄像头和麦克风。
    游戏经常需要,同时也可以支持可视电话。
4.支持VGA,支持DVI/HDMI。
    兼容高清电视和显示器。
5.最高计算能力。
    在保持网络流量的同时可以播放1080p的高清电影。很明显,做不到是没意义的。
6.120G-320G常态硬盘。
    一方面是大规模下载需要,另一方面也可以作为多台电脑共享存储的外置硬盘使用。
7.具有晃动光标的遥控器。
    这东西是要给普通用户用的,没有遥控器是不行的。但是一些复杂的特性通过遥控器反应太慢,通过鼠标也傻了点。可以考虑采用遥控器模拟成概念上的激光教鞭的方式,沿着遥控器顶端延伸和电视平面交汇成为一个活动光标。
    这个东西的实现难点在于,电视屏幕只能发送图形信号,无法接受信号。触摸屏对此没有任何帮助,暂时可以考虑使用android暂代遥控器来辅助。android内部一定带有重力感应系统。将android固定在一个点上,通过对准屏幕上不在一条线上的三个点点击校准,可以建立起以屏幕中心为基准三维坐标系。并且根据每时刻的传感器回馈,可以知道每个时刻的方位和指向。通过这些数据,可以轻易算出交汇点。当然,使用wii类似的系统是个更好的思路。

    问题

1.wifi信道不足
    要是多几个家庭使用,即使交错信道,每个信道上可用的带宽也会降低到10Mbps以下,折合大约1MB/s。这个速率对于高清电视太勉强了些。比较直观的解决方案是802.11n。
2.成本控制
    上面的参数可以看的出,这种东西的主系统硬件不会小于1000。加上各种研发开销,运营成本,要把价格压到1500-2000才有竞争优势。否则主机也就2000-3000,买个客厅电脑,又没有显示器,又不能打游戏。
3.晃动鼠标的技术不成熟
    设想很不错,技术不成熟。

2010年12月1日星期三

在中国,高薪养廉是个伪命题

    高薪养廉的基础逻辑是什么?公务员薪水不够高,就无法维持公务员的廉洁,所以需要给高薪。
    恕我直言,在哪里,这都是个伪命题。我们可以看一下这个命题前半部分的逻辑,应用德.摩根率后,我们的结论是“公务员廉洁,他的薪水必定够高”,而不是“公务员薪水够高,就可以维持公务员的廉洁”。在中国,关于后者,有个再直观不过的反例。中国被判刑的高级公务员的涉案金额是多少?上千万算少的了吧,虽然这些钱不能算薪水。但是一个人,弄个千万还不能维持自己的生活么?如果可以,怎么会出现超过千万的贪腐的呢?
    高薪养廉的基础,是公务员无法通过权力获得灰色收入。在这种情况下,如果只维持低薪,干的比狗累,活的比猪惨的工作势必会搞到没人想去。哪怕维持社会上的平均工资,公务员也是没有任何吸引力的。拿一样的钱,被一个老板盯着和被一群老板盯着是完全不同的两个概念。如此一来,要维持有足够的人来进行工作,势必需要将公务员的工资提高到正常工资以上。
    新加坡在这类基础上,提出了一个类似保险的概念。通过加重查处贪腐的力度,和执行高强度的惩罚机制来抑制腐败。而且规定公务员很大程度上的工资都会被转移到公积金和养老金中,一旦被查出来,这些钱都会被归零。我们可以想见,高强度的惩罚机制会严重的吓阻人才进入公务员领域。花了公家2000要判刑四年?鬼才愿意去干。在这种重刑下,为了能保持公务员人数,唯一的路子只有“高薪”了,这才是高薪养廉的原始逻辑。
    在中国,先把权力监督机制和执行高强度的惩罚做起来再说高薪养廉。