2011年4月29日星期五

中国的版权问题一讲

    我们都知道,中国这里有很严重的版权问题。最有名的就是腾讯的段子,一直在抄袭,从未被起诉。
    多严重,我们来数数,一个正常人一天,要侵犯多少版权。
    OK,A同学早上起来穿上一双蜡笔小新拖鞋去刷——等等,这鞋有日方授权么?OK,A同学早起先侵了蜡笔小新的权。
    A同学刷好牙,带上自己的android手机去上班。当然,android手机是没啥版权问题的。但是——她背景放了一首青花瓷,打开软件追最新的小说看。背景的音乐侵犯音乐版权所有人的权,这里就是周杰伦所在唱片公司。追小说的软件连上盗版,侵盛大的权。严格说起来,音乐播放器还下载了封面和歌词,再侵了一遍周董唱片公司的权。
    到了公司,打开电脑——盗版windows。微软这事一提再提,我们虽然麻木,但也知道手里的东西都叫做盗版。打开office——又是盗版——开始写文件。没灵感,上网找了一篇样例——这里要区分样例是原始有版权,还是无版权。是版权人自愿贴出到公共领域并放弃版权,还是被其他人贴出。由于情况太复杂,我们暂时定为版权状况不清。
    下班了,路上A同学没看小说,改看漫画——由于漫画电子授权还没实行,因此毫无疑问的,又侵了漫画公司的权。
    到家,A同学也不看电视了。这年头除了几个台,剩下的都是老爷爷看的东西。她打开土豆,挑了一部日剧慢慢看——毫无疑问,又是侵权。
    至于周末在家不出去,连续下片看这种事情,更是提都别提。
    实际上,在中国,没几个人版权是干净的。有多少人能不用windows,或者用正版的?不少,主要是手提电脑自带了不少的授权。但是有几个用正版office,或者不用微软office的?这就不多了。至于我们硬盘里面放的照片,歌曲,电影——你觉得还有多少人能昂首挺胸说,我用正版我自豪?
    分类来说,中国侵权主要分几种情况。
    一个是,我知道在侵权,但是我就是不想付钱,太贵了。例如中国的windows,office,还有各种软件。我们都知道这是盗版,但是都买不起正版。用的时候就只好偷偷摸摸,被抓出来就颇有几分孔乙己"窃书不算偷"的尴尬。
    一个是,我知道我在侵权,我也想付钱,可我没法付钱。例如上面的盗版漫画,花个几块买个漫画看,我们也算比较习惯的。只是很多漫画的版权都没有引入,因此想付钱都没地方付。类似的还有美剧,A片,日剧等。很多人真的是想付钱的。看越狱,帅不帅?这时候你问她,这电视给不给钱?怕是头都会点断掉。可就是没地方付。
    一个是,我知道我在侵权,我可以付钱,可是习惯不付钱。例如盗版小说。这年头都习惯看盗版了,压根没人看正版。
    还有一个是,我压根不知道我侵权了。蜡笔小新的拖鞋有版权问题?我iPod里面放个周董的mp3算盗版?
    最后一个是,我不知道这个版权是什么状态。例如刚刚说的,从网络上找的样例。如果是比较简单的样例,好像是不受版权法保护的。复杂到一定程度后,就是有保护的。如果作者本人没有明确放弃版权贴出,无论是本人贴出还是他人贴出,你拿来用就属于侵权。但是多数时候我们可能不会关心这个,想关心也找不到地方。
    其实很多时候,不是谁手上都是版权干净的。你当有多少老美分的清楚"有授权的吉祥物"和"没有授权的吉祥物"?你当日本那么多同人作者,个个都是原作者授权的?但是无论怎么说,人家的版权市场分而弥细。很多人可能不知道,linux的几个logo,例如debian,ubuntu,都是有版权的。所以我拿debian的logo做头像,严格来说是侵权。不过facebook上的debian组和ubuntu组用这个logo,想必没人较真(当然,更可能是事先和版权所有人联系过了)。shlug曾经讨论过印logo什么的,后来发现都有版权问题,要去申请(其实写一封信去,多数就会被授权,好弄的很)。
    然而中国这里就全不是这么回事。分的清分不清的,搞不清楚版权的我们就先都不说了,想付钱但是没渠道的也算你有这个心思吧。我们单说"觉得自己付不起"和"我就是习惯不想付"这两种。如果说,前者还带着几分羞愧,后者就是完全死不要脸了。用了别人的劳动,有两分感激之心,想法给人找补一下的。其行为不论,心里还懂个是非。用了半天人家劳动,理直气壮的上门骂人说——喂,混蛋,做的什么破烂玩意阿——的这种,就属于是非不分了。
    遗憾的是,在中国,是非不分的还不在少数,更多的是连自己是不是是非不分都不知道,乃至不愿意知道的人。

2011年4月27日星期三

出来玩碰到的问题

    最近公司组织出来玩,选择跑到朱家角的大千庄园,就在上次贝壳徒步的线路旁边。上午刚到,中午就碰到一个有趣的问题。
    按照我们和园方的协议,我们是在园内游玩两天,包两顿午餐一顿晚餐。流程包括射箭,漂流,骑马什么的,部分是付费项目。上午到了不久,我们就参观了藏獒园,然后吃午饭。午饭吃的很不错,吃完我们商定,下午去漂流,漂流是免费项目。到了漂流园,一个人都没有。我们晃晃悠悠半天,自己穿上安全衣,跳上了竹筏。竹筏漂流到一半,一帮外行搞不定,中途找个地方停船了。另外公司的球掉到池塘里,另一帮上了旁边的电动船去捞球,结果搁浅在池塘里,费劲半天才出来。
    下面就是有意思的地方,搁浅的船折腾半天,总算来了一个人。不过不是帮我们折腾出来,是找我们要钱的,开口就是200。我们一群人莫名其妙,不是免费漂流么?不过想想,好像电动船也不像漂流。有人跑出去看了看,电动船的却是收费项目,不过却不标识在我们入园的地方,而是在另一条路上。而且标志牌上没有200的收费标志,只有小船40的项目。
    那么我们就莫名其妙了,怎么要我们200呢?租船的人也非常生气,他们和庄园没有从属关系,只是承包租船而已。今天不开门,所以没有来看着,结果就有人乱动船,搞坏了怎么办?然后我们下船的时候就有船主跳上来,把船开往停船的地方,我们的两个员工在上面下不来,下面又有一个船主跟我们要钱。这算不算扣着人质?一时间大家都很火大。
    双方僵持了一会,船主还是把船开到了原始的码头。我们的员工下来后,船主追着我们要钱。我们就提出要去前台。首先,我们并不知道这个项目是不是真的要钱,要多少钱。其次,我们也不确认来的人是否真的是庄园的合作方。要是附近居民抄小道进来敲竹杠,我们冤不冤呢?所以我们要求,去前台把事情搞明白。船主也同意这个说法,和我们一起去前台。
    前台我没跟去,具体说了什么我并不确定。不过结论是,园方这部分承包费用就不收了,我们付给船主100就好。
    事情并不算太复杂,不过有几点教训,听听就好。首先是,在度假庄园,不要随便动项目,哪怕你觉得项目是免费的。一方面是私自动东西,说不清。要是你拿个坏的部件,对方咬定东西原来是好的,扯起来扯不清楚。再说还有人的安全问题。不说后面要钱的问题,要是前面私开的竹筏出了问题,算谁的呢?所以,联系前台,让前台帮你搞定所有问题。前台不来,是园方问题,回头去投诉去。开心不开心,人是安全的。
    其次,如果你去度假庄园,又不是费用全包,就不要指望没有后续费用。园方全指望你们进来玩这个玩那个创收呢,收费是正常的,免费是奇怪的。
    第三,在你觉得度假庄园物美价廉的时候,多数这个庄园的管理会有问题。像这次的庄园,管理漂流的人说,运行时电瓶船都有人跟着,平时是锁起来,要管理员来开门的。而今天一时大意,没有上锁,搞出的问题。而我们觉得更有问题的是,我们在吃饭的时候是明确说了下面要去漂流的,饭厅的工作人员居然没有帮我们联系漂流的管理员(照理说我们应该进不去的),也没有提醒我们应该是进不去的。说起来饭厅的工作人员也不能算过失,但是管理上让人不是很舒服。
    最后,出来玩碰到这种问题,不要激动,心平气和的找来所有关系人,搞清楚问题再发火或者下结论。不要因为自己人生地不熟就气虚,对方要价多少就着急给多少。也不要硬着脖子不管三七二十一和对方僵持。先搞清楚问题发生在哪里,谁的过失,各方主张如何。主张的时候条件要高,谈判的时候姿态要低。主张低,往往在谈的时候会被对方咬住,没有退缩的空间而吃大亏。谈判的时候咬着不肯放,不说当地人好歹是地头蛇,自己损失时间精力也影响心情。
    另外也说一个上次徒步时候的事例,问题也发生在朱家角,不知道是不是八字犯冲。当时两个女生走不动了,准备打车到集合点,一个叫商榻的小镇,休息一下等后面的队伍。我考虑了一下,两个女生不大安全,就陪她们一起坐车。我们等车半天不到,就坐小车倒开三四站路,到大车站看看,是坐公交车还是打车过去。当时公交刚刚开走,下一班要半个到一个小时。打车的话,黑车开价30,正规出租开价40,我们就上了辆黑车走了。
    走到一半,我觉得方位不对,不过青浦地方我不熟,所以也不知道有没有问题。到地方,司机问我们停哪里,我们说超市前面,司机说这里没超市阿。我猛然觉得不对,问,这里是商榻么?结果不是,师傅把我们拉到不知道哪里去了。我们说我们从上车就说的是商榻,我们是没有什么过错的。师傅说开到商榻他要亏的,死活不肯,要我们坐公交去商榻。照我说我也不肯。不过我倒是肯多出10块让师傅拉过去的。后面两个女生坚持己见,坐着不动。
    其实这个时候,千万不能下车,或者因为人生地不熟盲目央求师傅拉你到目的地。不下车,师傅拿我们也没办法。两个女生一个男生,不是硬来能搞的定的。一旦下车,才真的是人生地不熟了。等你发现这里没有去商榻的车,再上车的时候,师傅早就跑没了。那时候才真的是没办法处理了。人生地不熟盲目要求师傅拉你的目的地,而不谈清楚价格,倒了地方师傅再收一笔,你一点办法都没有。
    僵持一阵,师傅也没办法,说,实在不行我送你们去商榻吧,不过你们能不能多加一点车钱。我对此倒是没什么意见,从我们上车的地方到商榻最多40,给10块也不算亏。后面两个女生坚持不肯,师傅说不动,最后心不甘情不愿的送我们到了目的地。后来我们分析,从我们上车的地方到商榻,大概15-20的成本,出租车运费通常会高出油费成本一倍以上。师傅本来拉我们到商榻也不亏,但是他不知道为什么,先拉我们到了别处,再过去的话最多做平,所以他很不情愿。但是事情是他自己搞错的,他又是黑车运营,我们坐着不走他又不能叫警察,相持下去又吃亏。所以本着息事宁人的想法,拉到目的地算了。

2011年4月26日星期二

“谈谈书价”评

    我先看了这篇blog:( http://www.ruanyifeng.com/blog/2011/04/on_book_price.html ),作者阮一峰是技术书籍译者。他所说的很多问,我的另几个朋友也有说过。包括纸质书完蛋了,电子书是下一代阅读媒介。不过我的想法是,电子书在中国还不成熟。
    首先,是电子书的渠道和标准问题。纸质书可以有多种渠道,但是只有一种标准,无论是哪家出版社,最终出来的都是一本书,一堆纸。然而电子书就包含了数个渠道,kindle是一个,bambook是一个,iBook也是一个,android market还是一个。电子书的渠道不同不仅仅是书的出售者的问题,还是一个本质的标准问题。上述四个渠道,无论哪个都不能保证打开其他渠道获得的内容。如果作者只在特定渠道出售内容,会造成如果我买了android手机,而一本书只有bambook有,我还得买一个bambook?一本纸质书才30-50,一年我大约看10-20本书,买四个设备大约要10年才能值回成本。如果作者分别在多个渠道上出售,各家渠道不会有意见?
    更麻烦的是,现在的书籍,都是将来的素材和史料。如果我们开一家数字图书馆,这个问题就更加复杂和明显。可以想象一下,图书馆中有某本书,2012年出版,bambook格式。一个史学研究者很高兴的在数字图书馆里找到了他要的东西,但是却发现,这本书必须用2010年产的bambook阅读。这个设备现在只有历史博物馆里面有一台样机,而且预约已经到了一年多后......
    商业战争造成的不共通的格式和渠道是内容的大敌。不过这类问题在最终解决上倒是不难,只要有原始格式,把一种电子书格式转换成另一种并不困难。最终的形态可能是一个行业平台,让一个自然人对一本书只付给作者一次费用。当然,渠道的成本还是要付的。例如,假定一本书5美元,作者收3.5美元,渠道1.5。更换一个渠道,再支付1.5美元。大概这个概念,唯一的问题是各家渠道有没有动力做这个联合。
    另外,最重要的一点,和阮一峰的担忧相同,电子媒介的盗版成本太低了。现在的电子书盗版,甚至可以做到扫描纸质书来进行盗版的地步。为什么现在都不发行pdf?其实pdf有很好的防盗机制,只是pdf是可以用pc阅读的,而pc有非常好的模拟能力,能够模拟翻页和截屏。再通过OCR,就变成了可用的电子版。同样,所有能够截屏的渠道,都有类似问题。kindle,bambook,iPad都是不能截屏的,但是android可以在虚拟机中截屏,所以android上做内容防盗就别考虑了。
    而倒过来说,也不要以为kindle,bambook,iPad有多安全。无论如何,硬扫描屏幕总是一个可行的方案。当然,更好的方案是使用特制的设备替换这些设备的显示器。技术上来说,这些设备的显示设备也是开放接口的,直接编程读取数据对于专业玩家不是问题。
    更可虑的是内容收费模式。内容是否值钱是一个市场问题,往往来说,内容的复制难度越高,内容的价格就越高。因此我们可以看到耗资不菲的报纸只买一块钱,甚至上海地铁不要钱的派报纸。因为报纸上的新闻复制起来难度极低,甚至从某种意义上说,地铁里的新闻,对于常在网上挂着的人来说,应当都不是一个新闻。我们原本卖书的模式,源自于一个事实,书的复制成本太高。无论是抄还是复印,都没有成功的把复制成本降低到和一本书的原始成本接近的地步。因此,作者完全可以收两者间的差价,即所谓的利润。以博客中的例子为例,复印大约是一张0.15元,230页复印成本34.5,原始书籍36.5,相差无几。当然具体情况又略有不同,要经常读的书主要面临复印竞争,看过就算的书主要面临借阅竞争。而我根据阮一峰的数据,算出一本书的各项成本大约是,书店成本7.1,纸张成本11.76,流通渠道11.76,作者收入5.87,大约是这么一个数字。也就是说,同样弄一本书出来,批量印刷和管理大约要占15-20元左右,和34.5之间的差价就是作者,出版商,书店的毛利润。当然,还要去掉一些宣传之类的费用。
    类推,我们大约也能知道商业的,成建制的盗版书能存在的理由。盗版书使用原始书的印刷成本(甚至,由于批量上升,还更便宜)进行出售,和复印级价格竞争,当然有吸引力。所以打击的大头往往也在这里,真的需要的人去复印店印个两张,是不会对书本销售造成打击的,因为成本根本划不来。
    但是在电子媒介时代,情况就发生了本质变化。无论使用何种技术,即使是替换显示器,或者硬扫描屏幕,首次复制一本电子书籍的成本就是数元(当然,前提是需要批量的复制上百甚至上千本书籍)。复制成功后,传播成本基本为零。一年上百万次的下载,也只需要租用一台很便宜的服务器,合每次下载成本为分级。这个对于传统书业的打击才是毁灭性的。事实上,这种情况已经出现了。目前网络上盛传的扫描电子书,爱好者个人扫描,抓不着。利用p2p传播,撤不走。大量书籍的扫描版的传播对于传统出版业的打击是非常严重的。在这种复制无成本的年代,内容收费模式是否能够继续,这才是最关键的问题。
    目前经过技术上的努力,包括加密和打击。在中国,以电子出版而论,看一本盗版书的成本基本是0,而一本正版的成本也是0。结论是任何不能免费出现的内容(或者叫有价格内容)都无法生存,只有免费内容才能生存,例如博客。如此看来,最终会归于两种结局,一种是有价格内容通过其他手段转换为无价格内容,例如行间植入广告(好恶心的想法)。一种是增加打击,使得盗版书的观看成本增加到元这个级别。

2011年4月25日星期一

从字符编码到本地化

    关于字符编码,其实我写过一篇blog。字符编码是一个很大的话题,我们挑选其中一部分来说。
    首先,我假定你会用python写程序。当然,只要你理解字符编码,C的原理也类似。你可以写一个print u'中文',然后,试图运行。你大概有一定的几率会得到一个UnicodeEncodeError。为什么?
    python中,u代表一个unicode字符串,这种字符串的编码代号叫做ucs-2。这种编码有几个特点,首先是每个字恒定占据16位。记得ascii编码么?这是另一种约定,每个字恒定占据8个位。因此一个ucs-2相当于两个ascii字,而且acsii和ucs-2无法兼容。所谓兼容,是指ucs-2的A,不转换是无法以acsii方式读取的。由于ascii的广泛运用,因此要猛然升级到ucs-2编码是有很大问题的。
    为了在兼容ascii的同时支持中文,有几个组织提出了几个不同的方案。第一个是中国大陆官方提出的gb2312标准,后续标准分别叫做gbk和gb18030。这个编码是一种变字节码。当第一个字节是普通ascii码的时候,表示这个ascii码本身的意思。而当第一个字节不是ascii码的时候,和后面一个字节合起来表示一个汉字。所以这种编码的平均字长度在8-16位之间,并且兼容ascii标准。
    另一个平行的标准是有台湾地区提出的big5系列标准。这系列标准的特性和gb系列非常类似,但是两个标准对于汉字的定义却大相径庭——big5定义的是繁体中文。
    最后一个,也是最重要的兼容编码是unicode组织的utf-8编码标准。这种编码使用三个字节表示一个字,所以平均字长在8-24位,是所有编码中最长的。然而额外的占用带来两个好处。一个是可恢复性编码。即编码在任何一个位置出错,或者不同步,都不会影响后续内容的表示。我们可以考虑一下,如果有100M的一个文本,使用gbk编码表示。我们上次关闭的时候在XXX字节的地方,然后在头部删除了一个字节。打开的时候,由于错了一位,因此我们对后续文本的解析都是错位的。如果运气不好,这个错误在很长的长度都无法得到纠正。而utf-8编码在每个字节都设立了验证高位,因此一但出现不同步,最多一个字就可以恢复正确的解释。更重要的好处是,utf-8是全区域的。通俗点说,就是可以在同一个文本流中同时使用简体,繁体和日文。这个特性对于多国交流非常重要。
    我们回到最初的问题,多数系统的终端是ascii编码设计的,因此无法支持ucs-2编码,所以python会尝试转换成某种ascii兼容编码格式。这个转换过程是透明的,然而,具体采用哪种编码取决于系统的LANG和LC_ALL环境变量。如果你的编码是zh_CN.UTF-8,那就可以正常显示。如果你的编码是C,那么就得到UnicodeEncodeError。如果你的编码是zh_CN.GBK,而你的终端却不是这个编码,就会出现乱码。
    为什么我们不做成透明的呢?因为,假如要做成透明转换,我们就必须知道你的系统终端支持什么编码格式。大多数linux支持所有编码,然而windows的终端只支持gbk编码。如果我们做成gbk编码固定下来,又无法支持多数linux下的默认utf-8编码的终端。我们知道很多事情最扯淡的地方在于,你要为了不是你的问题作出支持和让步。所以,python社区的结论是,不管windows那个变态玩意了。python默认根据LANG和LC_ALL选择默认编码转换格式,而windows下就需要自己手工做一点转换了。
    同样,我们知道,编程界提倡unicode化,提倡采用utf-8编码。然而如果一种语言只提供utf-8支持,做网页会被用户输入搞死,做文件处理会被各种奇怪的文件搞死。所以虽然我们提倡使用utf-8,我们仍旧不得不允许程序员使用各种编码,并且无法做到全透明化。当然,在一切设定都OK的情况下,汉语使用是透明的。
    然而,汉语的输入输出和处理的透明化就保证了程序中文本地化么?答案是非常悲观的,这根本不是万里长征的起点,而是万丈深渊的开始。本地化程序涉及的范围远远不止一个字符编码问题。例如,以英文而言,日期通常表为22/03/2011。然而中文就是2011年3月22日。这和翻译和中文处理都没关系。类似的问题还有很多,多的让人抓狂。例如文字的左右对齐,有些文字是右对齐的。还有更变态的例子,文字是从上到下,从右向左书写。(没错,就是古代中文)货币单位不同,日历不同。还有同一个文字在上下文中的意义不同,这阻碍了gettext的应用。有些术语的译法也没有统一结论,甚至经常出现一本外文翻译书最好配一本原文阅读才方便读懂的情况。
    对于这种纷繁复杂的情况,指望写中文程序如同写英文程序一样顺利是痴人说梦的事情。

2011年4月20日星期三

快递先验货还是先签字TMD有那么难么?

    最近看到一堆快递公司的投诉文,其中最关键一点就是,先签字再验收还是先验收再签字。国家规定是先验收,但是快递公司公然规定,先签字才能验收。客户不签字算拒收,问题在客户。说起这个问题的时候,快递还很无辜的说,有用户拆开不签字,抢走货物的情况。问题是,现在更多的是签字后快递员不认帐,货物有问题的情况。公司规定就能公然对抗国家法规么?我看这国家也到头了。
    关于签字还是验收的问题,可以百分百的说,是快递公司完全没意思改进的产物。从管理角度讲,业务不行改流程。快递验收流程可以分为两步,一步是"货物送达"。在第一步,快递送达后,收货人先要看见货物存在(这是废话),而且没有明显损坏(就是客户不接过货物,仅凭快递员手里的外观评判)。当确认这两点后,签收"货物送达"部分。然后收件人拿到货物,拆开检验。如果没问题,签收"验收无误"这项。
    当快递员送货到后,只要真的有货,客户没道理拒绝第一次签收,除非这个客户蓄意找茬。如果是蓄意找茬,原本的流程也无法解决问题。在第一次签收时,货物在送货人手里,也没有抢走货物的可能。当第一次签收完成后,最低限度的证明了,送货员曾经携带疑似货物的物品到达目标地点。而后是验货。如果一切顺利,验货完成,流程就完成了。如果不顺利,问题就集中在,客户看到了疑似货物的东西,但是却不能通过验收。那么就是送货方查找为什么了。这个流程,送货人也不用担心收件人抢走货物(因为确认了到达),收货人也不用担心货物有问题。
    作为一个外行,我能够想到,我相信快递公司应该也能够想到这个方案。之所以不实施,是因为快递公司秉持的态度是"给你什么你就签什么,不要给我找麻烦"的黑社会思路。
    作为一个买家,我无力纠正整个快递行业。但是我可以明确的公告所有卖东西给我的人,如果你不承诺先验货后签收,我是不会买的。而你一旦承诺,要求我先验货后签收,我就不管快递是什么态度,我会视快递为你的代理人。如果快递告诉我,必须签字,否则算我拒收。我理所当然的会拒收,因为你很明确的承诺了。至于你无辜不无辜,那不关我的事情。选择不靠谱的快递,是你的错误,也是你要背负的东西。如果不想因为快递纠纷而背负莫名的指责,就不要选择不靠谱的快递公司。圆通中通,北京到上海都是15,最起码隔日到达。联邦的隔日到达只要16.5,保证隔日能到。你可以增加快递费,但是不能对货物不负责。
    同理,如果一个买家,因为快递便宜而选择了不承诺先验货后签收的卖家,那么就不要为了快递的事情恼火,这也是你自己的选择。
    中国的一个买卖习惯是,先挑便宜的,然后再谈一堆条件。实际上,条件是价格的一部分。如果不给服务好的快递一点空间,那么我们真的,只有用不能验货的快递的选择了。

2011年4月19日星期二

vmware-workstation 7.1.2 source for linux-image 2.6.38

    I'm running a vmware-workstation under debian testing. Last week I update kernel from 2.6.32 to 2.6.38, then vmware don't work.
    Searching for patch with kernel modules, finally I got those.
    http://shell909090.com/vmware-source.tar.gz
    http://shell909090.com/vmware-7.1.2-2.6.38-1-generic.patch.gz
    Source is tested under debian testing, but should work for all dist which use 2.6.38 as kernel. Patch is not tested.
    Here is how to make it.
#cd /usr/lib/vmware/modules/source
#for file in *; do tar xvf $file; done
#wget http://mib.pianetalinux.org/MIB/2010.1/others/vmware/vmware-7.1.3-2.6.38-1-generic.patch
#patch -p1 < vmware-7.1.3-2.6.38-1-generic.patch
#vi vmmon-only/linux/iommu.c
//replace iommu_map_range with iommu_map and replace iommu_unmap_range with iommu_unmap
#wget http://communities.vmware.com/servlet/JiveServlet/download/1553530-39785/vmware-7.1-2.6.35-3-generic.patch
#patch -p1 < vmware-7.1-2.6.35-3-generic.patch
// dont assume
#for file in *-only; do tar cvf `basename $file -only`.tar $file; done
#rm -rf *-only
#vmware-modconfig --console --install-all

reference:
[1]. vmware 编译失败的问题 http://jasy.ice.blog.163.com/blog/static/8843073020109531326556/

编程语言的一点想法

    最早高级语言出现的时候,编程是面对过程式的。当你需要喝水时,你需要判断是否有热水,没有烧。有热水之后倒,倒好了喝掉。和我们日常过日子的思路差不多。
    后来,我们出现了OO,即面对对象编程。OO的好处是,当你处理某个对象的某个动作时,是无须关心外部世界的。这将问题切割成了很多细节动作来完成,非常有利于多个程序员协作。
    但是C++和Java在OO的实现上有些问题,主要问题是接口。C++必须先定义函数才能调用,Java也至少需要接口定义才能抽象调用。接口的存在妨碍了对象处理繁杂的动作。例如,我定义了一个抽象的人。可以吃饭,可以喝水。然后具体的把自己实现出来,于是我可以实现自己的吃饭和喝水了。但是,我脾气比较暴躁,看到不顺眼的就会骂人,看到驴蛋就抽丫的,偏偏人这个抽象接口没有定义骂人这个函数。
    一种做法是修改抽象接口。这往往导致定义混乱,接口三天两头修改。
    另一种做法是,将动作抽象成算子,应用Command模式。于是增加新的动作出来的时候,只需要产生新的算子,抽象的把动作传进去,然后,bing,事情就做好了。从某种意义上说,你可以把Command模式当作python中的bound function。
    然而,你不觉得很繁琐么?明明我是支持骂人的,你直接骂就好了。使用Command模式需要为每个动作产生一个新类,内部机制无比繁琐。偏偏OO中有些人为了抽象而抽象,绕这么大一个圈子还沾沾自喜,我会用这么复杂的设计模式了。。。
    更大的问题是,Factory模式之类简单模式还好说,Command等复杂模式,和人类的先天思考并不吻合。这导致严重的心智负担,并且只有经过严格培训的人才能进行编程。这是训练人以适应机器的做法,很不人道。
    objective c在解决这个问题上就漂亮多了,objective c采用的是消息传递风格,想要什么自己拿好了。python也应用了类似的机制。
    C++中之所以设计接口,是因为C++主要面向效率,因而当时采用的是虚函数设计。C++要求编译期决定调用哪个函数,多态的时候用虚函数表来确定。但是在目前,一方面是CPU速度已经没有紧张到这个地步,另一方面,objective c经过改善,效率也接近了C++。所以无论从哪个方面说,都不要再写一堆接口了。

2011年4月17日星期日

一个老段子,房价是什么

    人生就是一场PK,我们出生后就是这么被教育的。你们需要通过PK,来赢得人生,朋友,女人,孩子....
    现在我们开始第一轮的PK,本轮考试优胜者将得到100分的奖励,而且可以在第二轮PK中获得更有利的条件....
    现在我们开始第二轮PK,本轮优胜者将获得200分的奖励,并且可以在第三轮PK中获得更有利条件....
    现在我们开始第三轮PK,这是你们努力12年的目标,本轮优胜者将得到1000分的奖励,1000分!
    我们还有额外复活赛环节,参加复活赛的可以继续PK,赢得额外的500分满分奖励....
    好了,最后,我们进入场外互动环节。我们将随机抽取,给予每人1-100W分的随机奖励分...........................

2011年4月14日星期四

python解0-1背包问题

    女朋友的单位需要解一个背包问题,说白了就是算票。通过有限的票,凑出最接近一个数字的组合来。
    这个是经典问题,不过票数比较多,我本来用随机划分,然后一次优化一步的随机算法,凑出一个接近的数字。这样算法比较快,不过不是很准。
    女朋友领导发话了,时间长点可以接受,但是最好准点。
    照做吧,幸好这个算法算100张票子也就是10秒不到,这还是mini-itx。
    下面上算法,具体算法猛击这里(http://www.oiers.cn/pack/Index.html )和这里(http://zh.wikipedia.org/wiki/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98 )。输入是数字列表和目标,输出是组合和误差。f[i]是目前为止,最大代价为i所能获得的最高收益,以及组合方式。numlist是二维数组,分别是代价和收益。
def resolv_dym(numlist, target):
    f = [[0, []] for i in xrange(0, target + 1)]
    for c, w in numlist:
        for v in xrange(target, c - 1, -1):
            if f[v - c][0] + w > f[v][0]:
                f[v][0] = f[v - c][0] + w
                f[v][1] = f[v - c][1] + [(c, w),]
    return f[target][1], float(abs(target - f[target][0]))
    当然,在这个特例里面,代价和收益相等,所以下面是真实代码。
def resolv_dym(numlist, target):
    f = [[0, []] for i in xrange(0, target + 1)]
    for i in numlist:
        for v in xrange(target, i - 1, -1):
            if f[v - i][0] + i > f[v][0]:
                f[v][0] = f[v - i][0] + i
                f[v][1] = f[v - i][1] + [i,]
    return f[target][1], float(abs(target - f[target][0]))
    完毕。

2011年4月13日星期三

论不同系统和客户端的证书管理

    上面刚说完x509证书链系统,现在我们说说各种系统和客户端下的证书管理吧。理论上说,系统只要保留一份根证书系统,其余的会自动进行计算。但是杯具的是,不同系统的不同应用,使用的是不同的数据库。这导致你的根证书导入之路漫漫而修远。

windows系统:
1.系统证书管理
    在运行中输入certmgr.msc,就可以看到证书管理系统了。根证书管理在"受信任的根证书颁发机构->证书"下面。对证书文件进行查看,导入,然后导入到这个区域,就可以变成根证书了。要吊销一份证书,删除是不行的,因为会自动加回来。加入"不受信任的证书"好像也无效。我找到的比较实用的方法是右击看属性,"停用这个证书的所有目地"。再试试看?证书应当无效了。
2.firefox
    火狐的证书系统是独立于系统证书的,因此在windows中做的修改对firefox无效。需要到"选项->高级->加密->查看证书"中(windows下在工具菜单下),在"证书机构"选项卡,导入证书,而后启用所有用途,让证书生效。如果要吊销,跑到同一个地方,删除证书,或者编辑,取消所有用途。需要注意的是,当你删除证书后,再次查看证书列表时,证书会回来。但是此时编辑证书,可以看到,所有用途都被取消了。
3.chrome
    chrome在windows下使用系统证书,因此不要用chrome自身的证书管理系统,直接修改系统证书就可以。

linux系统(debian):
1.系统证书管理
    运行dpkg-reconfigure ca-certificates,会出现让你配置系统证书的界面。这是系统的证书数据库,自动配置的话好像不能添加,只能取消。你反选某个选项后,/etc/ca-certificates.conf中,对应这个选项的行在行首就会出现!。此时系统内就不再认可这份证书。因此推测,如果你需要自己加入一份证书,需要将证书添加到合适位置,编辑/etc/ca-certificates.conf,加入路径,再执行dpkg-reconfigure ca-certificates或者update-ca-certificates进行更新,此时程序会更新/etc/ssl的某些内容,证书就安装上去了。
2.firefox
    同样是独立于系统的配置,基本操作和windows差不多,不过linux下面"选项"在"编辑"下面。
3.chrome
    linux下面的chrome可以在"首选项->高级->证书管理器"中,选择"授权中心"。导入后修改权限即加入。注意需要使用禁用,而非删除对应证书,来阻止某些证书。

    这里面说的加入证书,基本是加入自己的证书。至于移除,基本说的是cnnic。cnnic证书有什么危害?目前没有。如果你相信中国的互联网是世界上最开放的互联网,那么下面一堆不看也罢。不过,如果你不相信中国政府颁发出的证书,还是移除的好。在系统内保留一个不受信任的根证书,可能受到证书替换钓鱼。简单来说,你访问一个安全网站的时候,这个网站的证书是如何颁发的,你留心过么?在地址栏网站logo那里右击,查看证书,再找到证书链,你就可以看到,这个证书属于谁,是谁颁发的,这样一个链条。想象一下,你在用gmail的时候,心血来潮看了看域名证书,发现颁发者是CNNIC SSL(google的颁发者是Thawte)。很明显,你访问的网站不是真的gmail,而是一个伪装的网站,将你的请求再转到gmail服务器上。这个网站没有gmail的证书,不过用CNNIC签了一个。于是你的所有请求,收到的邮件内容,发出去的内容,全部被公开了。你也不知道这个替换什么时候进行的,由于安全验证可以通过,系统也没有警告你。是不是有种看到日本恐怖片里面,贞子爬出屏幕的感觉?
    当然,这个是一个特例,有点危言耸听。因为对于某些国外CA,证书也是乱发的。基本只要交钱,给一份材料复印件,一样可以通过审查,得到一本CA证书。然而,这种证书通常比较容易被发现,CA也会很快吊销这些证书。如果不是这样,这些CA往往也会被各种系统加入吊销名单。不过对于蓄意产生的CA证书么,就难说的很了。附上一个用于检测CNNIC证书的网站,https://www.enum.cn/
    另一个风险证书则是comodo,早些时候,这个公司被黑客入侵,导致黑客给自己签发了一堆证书。虽然目前这些证书已经被吊销,不过这种安全公司让人一点信任感都没有。最好果断删除。

2011年4月10日星期日

说说x509证书链

    x509证书一般会用到三类文件,key,csr,crt。key是私用密钥,openssl格式,通常是rsa算法,爱咋用咋用的。csr是证书请求文件,用于申请证书。在申请的时候,必须使用自己的私钥来签署申请,还可以设定一个密钥。crt是证书文件(windows下面的csr,其实是crt),是签署人用自己的key给你签署的凭证。通常签名证书的时候都需要一个序列号,避免两个证书重复,当指明序列文件后,被签名证书会使用这个文件,并且文件会发生变化。另外一个额外说明的东西是dh参数,做openvpn的时候需要这个东西,大致是什么算法的初始参数,在下面有生成方法。

key的生成方法:
openssl genrsa -des3 -out in.key 2048
    这样是生成rsa私钥,des3算法,openssl格式,2048位强度。ca.key是文件名。
    为了生成这样的密钥,需要一个至少四位的密码。可以通过以下方法去除。
openssl rsa -in in.key -out out.key
    输入密钥后,out.key就是没有密码的版本了。

csr的生成方法:
openssl req -new -key server.key -out server.csr
    需要依次输入国家,地区,组织,email。最重要的是,有一个common name,可以写你的名字或者域名。如果为了https申请,这个必须和域名吻合,否则会引发浏览器警报。


crt生成方法:
openssl x509 -md5 -days 3560 -req -CA ca.crt -CAkey ca.key -CAcreateserial -CAserial ca.srl -in server.csr -out server.crt
    输入key的密钥后,完成证书生成。-CA选项指明用于签名的ca证书,-CAkey选项指明用于签名的密钥。
-CAserial指明序列号文件,而-CAcreateserial指明文件不存在时自动生成。
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
    这个是用于生成自签名证书的。

dh参数生成方法:
openssl dhparam -out dh1024.pem 1024
    1024是位数,一般1024已经够了。

    x509的证书链是这样的。crt上有证书持有人的信息,持有人的公钥,签署者的签名。当你安装了一个证书后,就信任了这份证书。证书上会说明用途,例如服务器认证,客户端认证,或者签署其他证书。当系统收到一份新的证书的时候,证书会说明,是由谁签署的。如果这个签署者确实可以签署其他证书,并且收到证书上的签名和签署者的公钥可以对上的时候,系统就自动信任新的证书。
    在系统开始的时候,会自动安装信任一些证书机构,这些被称为根证书机构(CA)。根证书机构会为其他公司颁发证书,用于各种用途。当然,被签署的证书也可能是一份"可签署证书",这样就要检查对方的资质。这样逐层签署,就会形成一个叫做"证书链"的东西。从拓扑结构上来说,其实应该是森林结构。
    当然,如果我们要弄ssl,又没有钱请CA给我们签署的时候(他们的验证费都好贵的),可以考虑自己给自己签署。生成一份key,生成一个req,然后用自己的key签署自己的req。当你使用这份证书做ssl的时候,就会产生不受信任的证书警报。你可以在客户那里安装这张证书为根证书,就不会弹出这个警告了。当然,考究的人,签署用证书和服务器身份认证证书要分开。先做一个自签署证书作为根证书,然后用这个根证书签署一个服务器证书。这样在客户那里安装根证书后,服务器证书就会自动信任。这样的好处是,一本证书只能颁发给一个特定域名。如果你有多个域名,就要反复在客户这里安装证书。然而如果采用根证书签名,那么只要安装一张根证书,其他都是自动的。不过如果事情只要干一次,就不用讲究这么多了。

2011年4月8日星期五

为什么我觉得拿版权较真的人都在扯淡

    重申一遍,我不反对版权,我只反对使用版权牟取暴利。
    什么叫暴利?我是个程序员,我做一个软件出来,我希望用我软件的人能给我点钱,对得起我的工作。或者最起码,不要拿着我的软件改的面目全非,在里面安放病毒什么的。这就是我对知识产权/版权的全部诉求——我希望得到收益,这个是一种尊重,也会激励我更好的做别的软件。
    然而今天,我们往往碰到这么一个情况。在校的时候,我们看到漫天的,学XX语言吧。同学老师都在讨论XX技术,彷佛美好的未来向自己招手。等到了工作时,发现,原来XX技术是XXX公司的专利,以此技术为核心构架程序,尤其是企业级程序必须向XXX公司交费。好吧,用东西付钱天经地义,哥回头也做个值钱的东西出来。做着做着,XXX公司又往往会三天两头变来变去,做一些你觉得技术上说不通的,很恶心的变更。当然,人家的东西,人家说了算。等自己做了很久后,发现自己用心做出的XXXX技术压根无人问津,因为XXX公司又推出了和这个技术相近的XXXX技术。他们曾经开出一个天价——天下最低的价——来购买你的技术的全部权利,并且宣称,自己的收购价这么低而权利费这么高,是因为在策划,宣传,包装,完善上花费了巨额投入的原因。这时你才发现,原来当初在学校里面,还有OOO语言可以选择。一切都是免费的,你不需要付钱来用别人的技术,当然产品多数也是免费给别人使用的,通常也只能收服务费。一切都和你想的差不多,只是——你当时根本不知道。
    宣传,策划,包装,完善到底要花多少钱呢?这个和中国移动到底从我们的手机账单中支出多少到基础设备建设,支出多少到服务一样,是个很难揣测的概念。然而我们可以知道另一个东西——他们的资产回报比——一般是多高。一切拿着策划,宣传,包装,需要花费巨额费用来说事,但是自己却有超高资产回报比的公司,哥都认为是在扯淡。
    更不提因为XXX技术和OOO技术针对的客户群接近,就无视两者根本没有血亲的事实,打官司指控OOO技术抄袭XXX技术,企图将松散的社区送上死路的动作。这其实不是为了给程序员更高的回报,而是出于资本的贪婪。版权/著作权应当保护作者的利益,而不是资本的利益。这就是我对版权/著作权的态度。
    夸张?松茸叔叔说过一个很有趣的内容,因为是豆瓣广播,链接不好找,我就不贴了。"从前有群人喜欢吃狗不理包子,他们搞了个狗不理包子同好会。后来有天来个人说,我是狗不理新老板,你们借用狗不理的名字,这是亲,呃,侵了我的权,你们得散了。于是他们只好改名为包子同好会。好笑吗?如果JavaEye没说谎,这就是Oracle对他们干的事情。"

2011年4月6日星期三

决定了,以后增加一个标签叫评论

    看了看日志,发现很多人还是在乎别人的评价是什么的,经常有搜索"XX怎么样"之类的关键字跳到我的blog上。最近在挑一些东西的时候,发现,确实,别人的评论很重要,尤其是负面评论。
    所以,决定了,以后就增加一类叫做评论,专门就是评论看到的各种东西的。当然,负面评论多正面评论少。不过大家别以为负面评论少是好事。10块买个手电筒,负面评论最多是"不够亮"。6000买个ipad2,你看看能出多少负面评价。
    ——可是你愿意弄个ipad2还是弄个手电筒?
   

2011年4月5日星期二

baidu和google的选择

    baidu是个很垃圾的公司,我坚信。
    但是再垃圾的公司也有他的用途,例如baidu mp3是个很好用的服务。google会和你JJYY版权问题,百度不会。
    不过,有利也有弊,google上只是有广告,baidu上只要有钱,出什么都不奇怪。例如这个:
    所以,如同文章说的。你要找信息的时候还是找google吧,baidu上全是广告。你想投资,怕被骗?别去baidu,那里全是广告,至少是软文。也别去天涯mop,那里也全是软文。即使你一对一的去问人,也不知道那ID后面是不是枪手的马甲。上google,搜全世界的blog,独立主机,那里也许有你感兴趣的东西。
    当然,你要找广告的话就别找google了,不够多。
    另外,该骂的,骂出来。老子布衣一个,还能怕谁呢?

2011年4月1日星期五

twip在LiteSpeed上碰到403问题的解法

无法查看这则摘要。请 点击此处查看博文。