Shell's Home

编程语言的一点想法

Apr 19, 2011 - 1 minute read - Comments

最早高级语言出现的时候,编程是面对过程式的。当你需要喝水时,你需要判断是否有热水,没有烧。有热水之后倒,倒好了喝掉。和我们日常过日子的思路差不多。 后来,我们出现了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++。所以无论从哪个方面说,都不要再写一堆接口了。

一个老段子,房价是什么

Apr 18, 2011 - 1 minute read - Comments

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

python解0-1背包问题

Apr 14, 2011 - 1 minute read - Comments

女朋友的单位需要解一个背包问题,说白了就是算票。通过有限的票,凑出最接近一个数字的组合来。 这个是经典问题,不过票数比较多,我本来用随机划分,然后一次优化一步的随机算法,凑出一个接近的数字。这样算法比较快,不过不是很准。 女朋友领导发话了,时间长点可以接受,但是最好准点。 照做吧,幸好这个算法算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 range(0, target + 1)] for c, w in numlist: for v in range(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,

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

Apr 13, 2011 - 1 minute read - Comments

上面刚说完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,早些时候,这个公司被黑客入侵,导致黑客给自己签发了一堆证书。虽然目前这些证书已经被吊销,不过这种安全公司让人一点信任感都没有。最好果断删除。

说说x509证书链

Apr 11, 2011 - 1 minute read - Comments

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

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

Apr 8, 2011 - 1 minute read - Comments

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

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

Apr 7, 2011 - 1 minute read - Comments

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

baidu和google的选择

Apr 6, 2011 - 1 minute read - Comments

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

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

Apr 2, 2011 - 1 minute read - Comments

这是一个老bug了,具体问题看这里(http://code.google.com/p/twip/issues/detail?id=80 )。 当你使用o模式,到twitter上同意后跳回来,就会撞上403。 不管他,当时你的url应当是http://xxx.com/path/getapi.php?api=http://xxx.com/path/o/username/token。xxx.com是你的域名,path是路径,username是用户名,token是一个随机的数字。 用http://xxx.com/path/o/username/token,直接上去。

作家们和百度的战争

Apr 1, 2011 - 1 minute read - Comments

作家们和百度打起来了,真是让我情何以堪呐。 照理说,作为一个码工,怎么也算是码字工的同行,应当对作家们表示一下支持。但是我又是个开源免费的爱好者。为防止有人搞不大明白啥叫开源免费,我简单解释一下。简单来说,就是拿着自己的东西在那里叫卖,来吧都来看吧,白给不要钱,还送设计图。作为正常中国人,也许很难理解这种脑残行为。不过事实上,这一切真的发生了,而且在全球范围内轰轰烈烈。 不过这让我的立场就尴尬了。唔,怎么说呢?我们还是把这件事情拆开说吧。 1.百度有错么? 我没仔细看,不过依据我的推测,作家在看到自己的作品出现在百度文库中之后,告知了百度,百度却没有积极的配合移除。实话说,这个比较符合我对百度的一贯认识。上次百度因为类似问题,还和盛大吵起来过。当时百度那位发言人的言论,让我颇为惊叹——这么好的人才怎么就没去中宣部或者外交部呢? 系统里有他人作品并不是原罪,但是别人告诉你,别收录,你还不当回事情就是了。想不被收录进去还要交钱,你当自己是中国黄页么? 另外做一个不负责任的猜测,说百度和此事无关,也未必完全无关。百度当年曾有要求其他公司购买自己排名,不买就把对方的关键词指到自己身上的记录。我怀着恶意的猜测,若是百度文库的产品经理发现自己产品没人用,找一堆枪手以普通用户身份上传也是有可能的。可惜事出有因,查无实据。本段落仅供一笑,切莫当真。 2.普通人的态度? 我和女朋友说过这个事情,她的态度是,趁着百度没关,赶快上去看看。还看到一款百度和爱国者推出的电子书,等于免费看很多作品。于是感慨早知道不买kindle,买这个了。我坚决的劝下了她,这种擦边球是不稳定的,投资硬件实属风险,买下来谁知道哪天就白买了。verycd殷鉴在先,百度文库也难说的很——果然,没几天李彦宏出来说话,管不好就关。算不算数倒是另说,要是买了那个电子书,怕是又要担心能不能用了吧。 有便宜不占是很正常的思路,不过在占便宜前,先考虑一下这句话:起初他们追杀共产主义者,我没有说话-因为我不是共产主义者;后来他们追杀工会成员,我没有说话-因为我不是工会成员;接着他们追杀犹太人,我没有说话-因为我不是犹太人;最后他们奔我而来,却再也没有人站出来为我说话了。(http://www.kaieconblog.net/2011/03/29/10343/)我觉得郭凯说的很好,你可能觉得百度很好,白看东西不花钱。这次你支持了百度,下次就有人搞软件下载中心,上面全是破解软件。再下次就有人搞不知道什么中心——中国已经够山寨了,别搞的全国皆山寨,OK? 可能你说,我种地,我不靠脑子吃饭,搞不到我头上来。那也请你多想一步。搞死中国的作家,我们就只能看免费的社论。搞死了中国的程序员,我们就只能高价买别人的程序。你把中国做创造的都搞死了,你就等着老外涨价吧。山寨老外的?当WTO吃干饭的阿?WTO已经因为中国没有按约定开放出版市场提出抗议了(猛击这里:http://www.etu.net.cn/Article_Show.asp?ArticleID=579),重复这么搞下去,还想不想出口了? 3.作家维权,结果如何? 我觉得,这是另一方面。百度固然有错,但是我却不看好作家的维权行动。如我上文所说,中国人现在的习惯就是,窃书不算偷,读书人的事,能算偷么?对着这样的民众,我常有有力无处使的感觉。实话说,我是非常不看好维权的结果的。这种土壤中,即使一个百度倒下去,千百个白读站起来。 4.有什么建议? 别搞纸质书了,那个注定是昨日黄花。一本纸质书,作家能拿多少?一本电子书能拿多少?假定读者不变,作家收入不变的情况下,电子书定价可以达到纸质书的一到两折,而且没有什么前期费用。作为用户而言,家里堆一堆纸海也是浪费且不低碳的生活。我实在搞不懂为什么要弄纸质书。盗版问题?电子书是比较容易盗版,纸质书就不会受到电子盗版的冲击么?要真不会也没有这次事情了。而且,在一本书一两折的低折扣下,读者反倒会比较多。一本深入浅出MFC,我八年前买的时候是90,现在恐怕要到150上下。一两折只有20-30,买也无关痛痒。读者增多,作家收入还会增加。 不过现实的一个问题是,传统认为,花钱买一刀纸回去叫消费,天经地义。花钱买一本电子书就不好接受了,总想弄免费的。不过我得说——未来笼罩在迷雾中,一切都会变的,观念也是—— 5.我为什么情何以堪? 因为我比较赞同开源运动的精神,所以也对保护版权的问题提不起精神来。 开源运动据说起于上世纪美国的嬉皮士文化,主要观点是,代码应当属于全人类,而不是被某个人圈起来贩卖牟利。开源运动开始之所以风行,是因为很多大学教授碰到了版权上的实际问题——版权条约禁止代码用于教学。最有名的例子是UNIX做了闭源限定后催生了minix,后者催生了linux。程序员必须阅读很多的源码,来增加自己的水平,而版权限制这点。 到了后期,很多大公司也开始支持开源运动。因为这一运动对上游和下游都非常有利,它只损害以版权牟取暴利的人。作为上游厂商,雇用一个熟悉开源系统的硬件程序员,就可以直接开发这一系统的硬件驱动。而不用像微软模式一样,雇用通过微软认证,并且和微软签署不可泄漏协议的硬件专家——这些人的工资中有相当部分是交给微软的保护费。使用开源可以直接的降低成本。而作为下游,则更看中开源系统代码透明,不容易植入有害代码(这点上,微软一直盛传被植入了后门,但是始终无法有力辩驳就可以知道),而且很容易基于自己的需要定制修改。中游厂商则是通过服务收取有限费用,而不是暴利。 实际上,版权从始至终,都是在保护创造作品的人的积极性。在软件业,开源运动找到了另一种方式来激励创作者的积极性,而不是一味的把东西保护起来。这让我们反思对影视产品的保护力度问题。软件业只享有20年的保护,而出版业,唱片业享有70年的保护。我们是否应当执行如此强力的版权保护政策呢? 问题归于出版领域,这篇博文(猛击这里:http://weiwuhui.com/4190.html)印证了我的想法。出版业的大头都在出版社这里,这才是使用版权赚取金钱的大头。