2011年6月30日星期四

参与开源软件的几个问题详说

    我刚写了一篇关于参加开源软件的,网上看的人是一堆一堆的。我就再多废话两句,说说我对参与开源软件的几个看法。
    参与开源软件,首先要弄明白,你为什么要参加。很多人很热情,想着为世界贡献就来了。热情是好事,可是开源软件不需要理想主义者。在从事开源软件前,你一定要明白,你参加开源软件的目的在哪里。
    有些人比较功利,也就比较简单,如果你希望参与开源项目,留名找工作。那你最好就是帮忙翻译。一方面,翻译文档对技术没有过高要求。另一方面,这确实也是参与了开源项目。而且从效果来看,熟悉一个项目首先就要熟悉文档。如果文档都是由你来翻译的,还有谁比你更熟悉文档呢?当老板问,谁熟悉tornado的时候,别人都说,我用过。你说的是,这玩意的中文文档是我翻译的。这对将来找工作是个很有利的加分。类似可以做的事情还有写文档,或者是使用手册、心得、入门指引,HOWTO之类的。不过这些事情就要求你至少熟悉项目,有一定技术。
    如果你对现有的开软有想法,到不必一定直接加入。自己修改一下,做一个patch,然后发给项目的负责人说明一下情况。如果你的patch做的不算太次,那么项目管理者应该会表示感谢,并且接受。如果你常用这个项目,说不定他会给你一个可以提交的版本管理器账户。但是水准太差就不要凑热闹了,你的代码大家都看得到,丢脸不要丢到全世界去。记得一个空格引发的杯具么?(http://www.oschina.net/news/19000/a-space-lead-disaster
    如果你对各个开源项目都不满意,想做一个新的,独立的项目。我强烈建议你慎重考虑,毕竟现有很多项目的作者都不是傻瓜。新开项目的管理和推广是一个非常麻烦的问题,非常可能的是,你在很长时间内都得不到什么有效的支援,不得不一个人奋战。虽然有很多人很热情,但是他们很多不知道该做什么(否则本文就没有意义了),更糟的是空有热情但没有能力。
    如果你是最后一个,只是对开源项目有热情。我觉得你就先别着急凑热闹了。为什么上面我说了好几次热情是好事,但是开软不需要空有热情的人?因为开软的程序员基本奉行一个原则,有空废话还不如多写两行代码。他们不会帮你培训patch的用法,版本系统的管理,bug系统用法,更不会给你解说某个函数实现的时候为什么不能调用另一个函数(当然,如果你的运气很好,也有人会)。参与一个开软,必须要自行付出时间精力去学习相关的知识。作为开软的程序员,最怕的就是一堆空有热情的用户/贡献者在那里叫嚷,为什么这个函数不能调用另一个函数?我用这个办法简化了代码,效果很好,打了一个补丁出来。同学阿,你没看以前的讨论么?在某种条件下,这会引发循环调用。
    热情是好事,不过这是在拥有正确的方法和良好的能力的前提下。如果你有热情,不妨从学习如何提问,如何融入社区,如何对项目进行打包和使用开始。而后逐步开始学习文档的编写、翻译。最后为项目打补丁,贡献代码。
    另外就是为哪些项目提供补丁。这个没什么好多说的,最好选择你常用的。不常用的项目,你也没那个功夫,坚持不了多久。而且通常来说,为小项目提供补丁比大项目管用,你的补丁会更加受到重视。

2011年6月29日星期三

阿宅程序员的故事——幸福感

    阿宅最近很幸福——
亲爱的,起床了么?
起床啦。
记得昨天我提到的电影么?我下载了高清版,等会一起看?
好阿。
我去写个程序,我们等会再聊?
恩恩,回头见
    ——恩,这个bot做的真不错,NLP研究完了,下一个课题做啥呢?

2011年6月27日星期一

阿宅程序员的故事——买笔记本

    阿宅最近很困惑,照某些多情MM的观点,这是因为有了意中人。其实要这么说也没有错,阿宅看上了一台笔记本,但是却犹豫不决不知道该不该买下来。
    其实不关钱的问题,阿宅这么和朋友说。我只是因为有了三台笔记本,再加一台好像没什么用。这就好比一个男人,家里明明有一妻三妾,却还想沾花惹草一样。
    哦?一妻三妾?三台笔记本?那一妻是什么?
    不是还有台台式机呢么。一台台式机跑服务器,一台笔记本写程序,一台笔记本打游戏,还有台笔记本带着装样子。再买一台来打游戏,正好可以让打游戏那台去写程序,写程序那台去装样子,装样子那台给别人装样子。好像也不是非常必要,可是这个配置真的很不错啊,硬盘还是SSD的。啊呀呀,真是烦恼啊。
    其实阿宅折腾电脑算比较省钱的,因为程序员折腾软件的时候多过折腾硬件的时候。往往是折腾到忍无可忍了,才去折腾折腾硬件。但是多下来的硬件又不知该怎么处理,卖掉不舍得,扔掉也可惜。大致就相当于老爹嫁女儿,总要找个知道女儿好处的托付终身。可这年头懂行的都去买新电脑了,谁会在一台老电脑上折腾来折腾去啊——尤其还是程序员都折腾到忍无可忍的。至于什么送到老区支援孩子的蠢话,阿宅听都不想听。先不说怎么监管,设备能不能真的到孩子手里。就说一台设备的运输费,就比设备本身还高了。

关于文字抄袭的一个想法

    最近新浪又和人闹出了抄袭新闻(http://tech.sina.com.cn/i/2011-06-08/15345623475.shtml),姑且不说谁对谁错,其中一个关键的问题是,谁也没法证明自己说的东西。或者说,缺乏铁证。
    这种情况下,贝壳想起photoshop的一个功能,水印。你可以向图片内加入水印,但是图片上本身看不出来。当图片被打印,再扫描后,也可以部分的(一定概率,具体看变形程度)获得水印信息。这是版权证明的利器,你做的图片上怎么会有别人的水印?同样,文字应当也可以加入水印功能。原理上说,这属于隐写术的范畴。图片而言,是替换细节的颜色等低维信息。文字的话,通常是修改同义词,标点,等等。我们假定一篇1000字的文章内,大约有100个标点和常用同义词。通过在标点和同义词里面二选一,大约能放置100bit的信息,合12字节。不考虑其他细节问题,这已经足够写一些水印信息了。
    水印需要考虑的问题一,是需要考虑盗版者也使用水印检查程序。如果盗版者同样使用水印检查程序,那么水印就会被发现,并且移除——这就失去了使用水印的意义。因此,水印信息必须被重编码,并且需要使用密码才能解开。在未知密码的情况下,水印编码后的信息要接近白噪声。
    水印需要考虑的问题二,是当有了一个编码后,找出密码的难度。这决定了证据的效用和盗用者的攻击成本。而对于任意一段编码,要找出能够生成另一段水印内容的密码的计算过程,其计算难度应当尽量接近NP问题。越难计算,盗用者越难决定其中是否带有水印。同时对水印"是否可以通过寻找密码来从文章中找出一段根本没有被预先植入的内容"的质疑就越小。
    水印需要考虑的问题三,是需要考虑水印的信息被复制破坏的问题。尤其是当水印信息被重编码加密的情况下,一些简单的修改和段落移动就可以让水印信息失效。因此水印必须有一定的冗余能力,即水印的编码应当在段落移动和内容编辑后也可以一定程度的还原数据。
    当一个算法满足以上三个条件后,就可以用来向文字内植入另一段文字。未知密码者无法检查出其中是否包含水印,简单的修改无法移除。拥有密码者可以通过公开密码,让所有人看到文章内的水印。这样就完成了抄袭验证的整个过程。当然,水印的用途还不止于此。这种技术同样可以被用来检查盗版。对某篇具体的小说段落,生成一个随机密码,一同存放在数据库中。在显示内容的时候,用密码加密用户名,加入到文章水印中。这样当盗版文被公开后,具体付钱复制出文字的用户名就可以被检出,然后处理。盗版者既无法检测水印,也无法移除。

2011年6月23日星期四

关于中医

    我对中医和西医的争论不感兴趣,恩,我觉得中医废医验药是不可行的。
    西医才多少年历史?从1628年哈维发表《心血运动论》算起,不过400年不到。中医有着5000年历史,西医比起来就是个毛阿。
    不过,越多时间的积累,就需要越多时间才能掌握。西医医学院毕业大概需要10年,中医咱打个折,马马虎虎学个120年差不多了哈。
    经验没攒够怎么办?你去西医院找不找实习医生看病?

2011年6月21日星期二

bitcoin的后续解说

    上次那篇bitcoin垮了,引发了挺多的质疑。我解释一下我说的"垮了"到底是什么意思。
    btc有个目标,就是成为p2p的电子货币。成为货币,就是成为流通实体。我们通过货币,进行交易,将我们的劳动输出转换为我们需要的东西。例如我们写程序,通过将程序移交给需要的人,获得货币,再通过货币,获得我们所需的衣食住行。货币有两重性,一个是交换,一个是保存。今天我们所说的一切,都是围绕着"btc成为电子货币",来进行讨论的。如果你只是想玩玩这种新型的产品,这种无关痛痒的事情不在讨论之列。
    忘记谁算过,btc其实从技术上是做不到替代世界货币的。因为如果要达到mastercard这样的交易水平,一个block的大小会达到数G,而一次交易需要遍历多个block,从而使得整个交易成本无法接受。我估计这个人是非常熟悉btc的,因为我仅仅从介绍上,分析不出这样的结论,这大概需要阅读它的源码。当然,这也可能是假的,或者将来个人电脑也可以达到这个水平,这不是我们今天讨论的要点。
    我的两个问题,一个是针对交换,一个是针对保存。针对交换的问题是,我如何保证我的交易是安全的。当然,btc有着良好的安全机制,至少目前我们(包括这个星球上的很多聪明人)都看不出明显问题。但是安全性并不是说交易本身是安全的就结束了,这还包括挣取,兑换,使用,都必须是安全的。上次的问题发生在兑换环节,我们大多数人没有渠道挣取btc(俗称挖矿),所以我们通过实际的流通货币进行购入。mtgox是一个非常流行的兑换网站,当购入完成后,btc存在于你的mtgox账户中。然而,mtgox的网站被攻破了,因此有6W个人在网站上的钱消失了。从理论上说,这名匿名用户可以以完全符合btc规则的方式将其中的btc转入自己的账户,然后再加以贩售。btc规则保护这一交易,并且保护他不被追踪。问题发生在md5hash和salt上,估计是因为md5还是太难攻击,所以只有部分人的mtgox账户遭殃,其余人的账户得以幸免。目前mtgox已经"解决"了这个问题,不过汇率目前从17下滑到了13,相信因为不少人吓出一身冷汗。
    我们不说问题是如何解决的,仅仅说受害人这部分。如果是实体银行,碰到类似问题如何处理呢?除去中国的银行,剩下所有银行的方法只有一个——由自己购买足够的btc赔偿给客户。如果银行无力赔付,就需要由国家出面,对银行进行注资,或者收购,或者破产。当然,如果在btc里面,只有一个结局,破产。这次很幸运,mtgox碰到的问题还不严重,转移走的btc并不足够多,而且攻击者一次卖出了过量的btc,导致价格直线下滑。mtgox如果要进行赔付,就可以以低价购回。如果是转移走的量比较大,或者持续在高位抛售,那么mtgox的日子就不这么好过了。
    OK,此时,就要说到我们的第二个问题,保存。货币必须有保存能力。如果今天取得的货币在明天就无法使用,或者能兑换的东西少了,就会引发我们的严重质疑。从而使得我们卖出这种货币,买入其他货币——如果能自由兑换的话。或者买入我们认为可以保值的产品——例如不动产。我们看上面,如果mtgox破产,会发生什么情况呢?首先,如果是实际的世界,必须进行破产程序,按照程序清偿债务。但是虚拟货币是不能进行破产申请和清偿的——即使某些国家可以立法认可电子货币,也无法对其他国家造成影响。如果mtgox注册所在的国家不认可电子货币(如果是我,注册的时候一定选择一个不认可电子货币的国家),那么mtgox可以直接卖出手上所有用户的btc,然后关门。如果你打算本地起诉他们欺诈,那就要面临国际诉讼所属权的问题。美国的规定是,本国公民状告其他国家主体,通常可以选择在美国开庭。中国好像是拒不受理。即使是美国,如果mtgox的所有人将来不打算入境,也可以堂而皇之的无视传票。如果你打算在所在国起诉,对方国家压根不认可欺诈事实——电子货币不受保护。
    退一步说,即使你的欺诈申请是有效的,mtgox开在美国,而不是开曼群岛什么的,而且这个州承认电子货币。那么mtgox也可以按照普通公司破产流程,接受破产债务清偿。一般来说,作为受害人,你拿到的btc一定已经缩水。国家是没有必要介入的,因为这个市场运作的货币不是他们发行的,也不受他们管辖。然而由于不但是直接受害人的btc缩水,还可能影响其他存款人,因此可能会发生挤兑现象。所谓自由货币市场,这不由让我们想起上世纪国家银行未建立起来时候的混乱时期。那时候,银行都是个体经营,一旦发生问题,很容易引发挤兑。
    现在,我们面临两难处境。如果我们允许有人——私人——运作一个基于btc的金融机构——银行——来负责btc的存,兑,借业务,我们就只能拥有一个不受到国家强制力担保的银行系统。如果我们不允许银行的存在,那么连btc的流通性都会受到影响。现代金融系统发展出银行来,不是没有道理的。如果有政府担保了btc,那么btc势必和这国的本币挂钩,这就失去了btc的意义。
    再说btc的另一个问题。我们知道,货币的价值是由政府担保的。可以说,货币的价值应当是政府的价值除以货币总量。从这个意义上说,大家卖出人民币是对的。然而由于btc只能在一定时间内生成,而不能由国家发行和回收。因此一定时期内,市场上的货币总量是固定的。当有很多人主观认为,btc值钱时,btc就会升值。而当大家认为,btc不值钱时,btc就会贬值。因此,你手里的btc的真实购买力,应当是随时波动的。然而,这是投机商品的属性,而不是货币属性。一种今天两毛明天两块的东西,是不适合做为货币的。
    目前btc是什么东西呢?我想说,大概是新型诈骗活动吧,和庞氏骗局非常类似。btc的质疑之一,就是不公正的初始分配。bitcoin项目起始于2009年,在一年多的时间内都默默无闻,然而在半年内突然火爆。这些初始计算btc的人,他们手里很低代价生成的btc就会快速增值(因为总量不变)。很多投资者看中这一市场,进行投资,然后宣传大家使用btc,他们的货币就可以快速增值(据说有个家伙投资了1000美金,目前增值1000倍了)。然而btc的官方的宣传是"p2p的电子货币",这点正是我质疑他们无法达到的(或者至少不能达到货币的功能)。他们说服大家使用软件,正是因为btc应当具有货币功能。而实际上,btc做不到现代货币的功能。这很明显是包装和宣传概念,通过持续的涌入制造繁荣。

2011年6月20日星期一

bitcoin垮了

    http://www.donews.com/net/201106/508733.shtm
    我想过它的世界崩溃的样子,但是从没想过那么快——
    贝壳评论有个原则,不了解的事情少开口。这是当然的,谈不上了解,就谈不上评论。bitcoin这东西,我了解么?我大致了解他的技术是如何构成的,我大致了解货币控制规律,但是我真的了解这样的货币在世界上的运行么?我想不通人们为何买卖这种等价物,完全搞不明白。我们使用货币作为等价衡量物,是因为政府强制力担保。更直接的说,就是不得不用。即使是这样不得不用,我们还得担心这担心那。我想在中国着急买房的同学们,应该有和我一样深切的体验吧。那么,对于一种没有强制力担保的等价物,如果出现贬值,会是如何?大家可会持币观望?不观望会如何?抛售!然后市场会如何走?暴跌!可会有人为此负责?无!
    现在,这一切已经是马后炮了。因为暴涨暴贬的情况没有自然出现,算法在一开始就出现了问题——有个家伙被黑了,导致黑客取得了大量用户的用户名和哈希,黑客大量抛售货币。市场在没有出现意外反转的情况下,被人为的转向了黑色,然后,直泻而下。(http://en.wikipedia.org/wiki/Bitcoin)也许这一事件可以得到平息,然而无论是以何种方式,bitcoin都将失去人们的信任。
    首先是bitcoin引以为傲的安全性,被证明并不能真的确保安全。虽然问题并不出现在bitcoin软件自身,然而单点被攻破会导致大量账户失窃,这已经是严重的设计漏洞——而且是在设计和源码开放的前提下。RMS的"足够的眼睛"理论,并不完全适用于此。对于有价值的漏洞,足够的眼睛确实能确保漏洞被发现出来。然而在问题解决前,也会引起相当的基于漏洞的攻击。甚至第一个发现者可能不会选择公开漏洞,这次的bitcoin事件说明了这种可能性。如果想到类似的设计或者源码漏洞,在linux kernel中重现。那么在我们修正问题前,linux世界会不会崩溃?对此我感到不寒而栗。
    这类情况重现的条件有二。1.漏洞足够有价值。2.提现速度快,目标隐蔽。目前没有在开源世界中出现类似问题,首先是漏洞并不具备足够价值。但是随着开源世界的发展,漏洞的价值是会逐渐升高的。至于提现速度,则很不好说。
    对于目前的bitcoin世界而言,更严重的是。如果没有人站出来,那么抛售将继续,市场会呈现出金融危机。直到足够长时间后,世人才会慢慢回来,或者将它遗忘。而如果有人站出来,那么这个市场就出现了控制者——这和bitcoin的设计初衷相违背,使得大家失去对他的兴趣。bitcoin的设计,原本就是为了保证没有控制者。
    一点额外的联想。如果类似的问题出现在实体货币上,会发生什么事情?如果有数百万个(如果是中国,可能要数千万)银行账户被盗(而且是确实被盗了,钱财已经转移),政府也查不到攻击者,那么会出现挤兑么?我猜测,更加可能的事情是政府直接和转入银行对话,停止支付和兑换。除了瑞士银行,大部分银行在这种涉及金融体系和国家主权的问题上都是比较配合的。即使无法获得转入银行的配合,国家也可能以货币兑换的形式止损。一笔能够动摇到国家经济的兑换无论如何不可能轻松进行,除非是来自另一个国家的策划和实施。当然,可能有更多的办法解决这类问题。因此一旦有一个强力的主控者,解决这些问题就有很多的办法。

2011年6月19日星期日

openwrt配置——QoS配置

    说到openwrt,就不能不提一下QoS。尤其是如果你需要用P2P软件(目前对迅雷的支持还不大好),基本就不能不开QoS。QoS的全称是Quality of Service,意即服务质量。是专门用于解决拥堵网络上的信号质量一视同仁的问题。例如,我们有一根宽带,两人共用。一个人视频聊天,一个人bt下载(我还不提迅雷个傻X呢)。玩bt的那个一开软件,视频聊天那个立刻没法用了。bt和视频聊天稍微好一点的是,视频聊天消耗的带宽是恒定的。你可以逐步限速,只要给视频聊天留了足够的带宽,两个就都能一起用了。但是,如果另一个人不是视频聊天,而是网络浏览怎么办?网络浏览,视频聊天,p2p下载一起来怎么办?实际上这是很多朋友家中常常碰到的情况。更不说有合租公寓里面你很难监控对方一定限速,软件无法限速甚至恶意抢占带宽(迅雷)。另一个更加技术的问题是,由于上传带宽不足,ACK包回应过慢,导致你的下载速度也不能达到峰值。玩p2p的常常会给上传限速到真实带宽差一点的位置,下载带宽立刻上去,就是这个道理。
    怎么办?用QoS,解决你多年老便秘。QoS的底层是tc,其目的就是决定先发送哪些包。openwrt默认的规则是hfsc,设计了四个优先级。Priority最优先,处理22,53,icmp,以及小于128字节的syn,ack包中,不属于bulk类别的。我们可以看到,DNS,syn/ack的优先响应,保证了你的上传不会影响下载。其次是Express,处理5190和小于500字节的UDP包。这个我也不明白是为什么,好像是视频什么的。然后是Normal,包括20,21,25,80,110,443,993,995这些常见端口。涵盖http/https,ftp,邮件系统。最后是Bulk,包括其他包,尤其是ed和bt。
    当你启用QoS后,你的p2p软件速度应当不会上升,反而会下降。下载速度不好说,有可能是上升,也有可能下降。因为原来p2p软件抢占了所有带宽,目前他们只能使用普通应用用剩下的带宽,速度当然慢了。然而,当你使用浏览器,收发邮件的时候,速度应当和不使用p2p的时候一样流畅。这才是使用QoS最大的意义。
    方法很简单,安装QoS包,然后修改/etc/config/qos,注意修改你的带宽。不修改的话,流量会被无意义的限制死。
    另外,打开QoS后,千万记得把你的p2p软件改为不限速。否则不能达到最高性能。

2011年6月16日星期四

openwrt配置——防火墙规则

    如果说路由规则还能讲讲,iptables防火墙规则就彻底没法讲。简直是千变万化无所不能。下面就简单说一下,对于新增的tun0设备如何设定防火墙规则。
----------config/network----------
config 'interface' 'tun'
        option 'ifname' 'tun+'
        option 'proto' 'none'
----------config/firewall----------
config 'zone'
        option 'name' 'tun'
        option 'input' 'ACCEPT'
        option 'output' 'ACCEPT'
        option 'forward' 'REJECT'

config 'forwarding'
        option 'src' 'lan'
        option 'dest' 'tun'
        option 'mtu_fix' '0'

config 'forwarding'
        option 'src' 'tun'
        option 'dest' 'lan'
        option 'mtu_fix' '0'
    好了,新增了一个网口,叫做tun,处理所有tun+(就是任何tun设备)的吞吐。默认规则是可以收发,拒绝转发。转发规则是可以和lan互相转发。
/etc/init.d/network restart
/etc/init.d/firewall restart
    然后你看看你的配置是否正确。
iptables -L -v
    另外,这个配置方法有个bug。由于你的网口是tun+,所以在启动时,无法自动启用这个接口。在路由器重启后必须/etc/init.d/network restart才能工作。对我来说,每次路由器重启后都是手工开启openvpn的,问题不大。但是对于某些人就比较麻烦。对此推荐这些人直接修改/etc/firewall.user,直接加入以下指令。
iptables -I INPUT -i tun+ -j ACCEPT
iptables -I OUTPUT -o tun+ -j ACCEPT
iptables -I FORWARD -i tun+ -j ACCEPT
iptables -I FORWARD -o tun+ -j ACCEPT
    使用interface配置的最终效果也差不多,不过比较简单整齐好理解。

2011年6月15日星期三

openwrt配置——路由规则

    路由其实是个很简单的事情,不知道为什么在实际运用中被很多人误解。首先,路由规则是个纯IP层的事情,和TCP没有关系。其次,路由和NAT没有关系。实际上,和这两个有关系的都是iptables。
    路由表的大概概念就是,你家门口有三条路,有一张路径表。到上海市,走左边,北京市,走右边,西安市,走中间。因此路由表的概念是发出规则。当你收到一个包,如果目的地址是本地,那么就交给监听程序处理。如果没有监听程序,那么就拒绝报文。(注意,下文讨论的时候都略去了iptables)如果目的地址不是本地,则看是否允许转发。不允许,丢弃,允许,加入发出队列。路由表就是发出队列的选择规则。这个规则之所以存在,主要是因为多头主机的存在。如果一台机器只有一个发出设备,路由表是没有任何用处的。
    发出规则计算很简单,首先取目标网络地址,还有包网络地址,然后分别和子网掩码求与(AND)。如果两者相等,那么就转发到这个规则所指定的接口上,如果不等,继续匹配。规则顺序也很简单,子网掩码距离越长,子网越小,规则越靠上。其中有两种特殊的子网掩码,一种是255.255.255.255,或者叫/32,用于指定主机。一种是0.0.0.0,或者叫/0。这个子网只有一个,叫做default。因为按照规则用这个掩码计算的结果,任何目标地址都可以匹配这一规则。
    当然,根据上面的解释我们可以知道,路由表只管发出报文。如果目标设备需要返回一个报文,他必须保证返回路由的正确。因此在下面的openvpn讲解中,你在vps也必须配置路由。很幸运,这个问题openvpn已经帮我们做好了。
    通常而言,我们拨号上网后应当有三条路由规则,第一条不解释。第二条通常是内网IP通过内网端口发出——这是当然的,否则内网包就暴露了。第三条通常是其他IP通过外网发出。当内网需要向外网发送数据的时候,会设定路由器作为网关。路由器会转发内网的包到他的上级路由器上。而当外网有数据要发送给内网的时候,情况则正好相反。注意,实际中一般是要进行NAT的,不是这么直接收发。
    如果当你使用了openvpn的routed模式,那么你就有了两个内网——常规内网和虚拟内网。我们可以想像,首先需要配置的是两个内网的互通问题。在你本地的网关上,需要配置虚拟网络段发送到tun0设备上。而在远程,需要配置常规内网段发送到拨号上来的这个IP上。大致要配置这些东西。
-----------------vps-server.conf-------------------
client-config-dir /etc/openvpn/ccd
route 192.168.x.0 255.255.255.0
--------------------ccd/openwrt---------------------
iroute 192.168.x.0 255.255.255.0
    这样,当openwrt这个用户拨号上来后,vps上就会添加一条路由,192.168.1.0网段通过刚刚拨号的地址来转发。
    其次,哪些数据发送到拨号网络,哪些需要通过虚拟内网呢?这规则通常由你来定。不过千万注意,不要用tun0这个设备来发送到服务器的数据——这会引发循环。这个问题一个不是那么明显的例子是,你设定使用tun0来发送default,但是又没有特别指定vps的地址使用ppp0发送。

2011年6月14日星期二

openwrt配置——openvpn的基础配置

    在openwrt下面配置openvpn是非常简单的事情,当然我假定你有linux下面配置openvpn的经验。
    首先,将配置文件,证书等等复制到/etc/openvpn下面。我的配置大概是这样。
client
dev tun
proto udp
remote ipaddr port
resolv-retry infinite
nobind
persist-key
persist-tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/openwrt.crt
key /etc/openvpn/openwrt.key
ns-cert-type server
tls-auth /etc/openvpn/ta.key 1
cipher DES-EDE3-CBC
comp-lzo
verb 3
script-security 3
up /etc/openvpn/dftup
down /etc/openvpn/dftdown
    注意,其中的路径必须写完整,貌似测试下来不支持相对目录。其中的up和down是指在启动和关闭时会自动执行的两个脚本。根据贝壳的测试,redirect-gateway是无效的,不知道为什么。具体的路由配置方法,会在下一章中具体介绍。
    然后,你需要将这个配置启用,方法是修改/etc/config/openvpn,在其中加入以下内容。
config openvpn name
        option enable 1
        option config /etc/openvpn/name.conf
    name是你的配置名,下面的路径和配置文件路径吻合。
    然后,你可以这样启动vpn。
/etc/init.d/openvpn restart

2011年6月13日星期一

openwrt配置——extroot使用U盘配置规则

    贝壳入手了一个DIR-825路由器,机器不错,可惜存储太小。所以要用extroot做成U盘启动。
    首先,你需要安装kmod-usb2,kmod-usb-uhci,kmod-usb-ohci,kmod-usb-storage,kmod-usb-storage-extras这几个包,以保证系统可以正常访问你的USB key。而后安装block-mount block-hotplug block-extroot这几个包,来启用U盘启动。最后不要忘记安装kmod-fs-ext3,驱动文件系统。
    当你搞定这几步后,修改/etc/config/fstab这个文件,如下配置。
config mount
        option device   /dev/sda1
        option fstype   ext3
        option options  rw,sync
        option enabled  1
        option enabled_fsck 1
        option is_rootfs 1

config swap
        option device   /dev/sda2
        option enabled  1
    然后,恭喜你,你就拥有一个可以从U盘引导的路由器设备了。当然,如果不从U盘引导,那么还是可以正常使用目前有路由拥有的普通功能。在使用U盘后,路由器的包和设定就完全存储在了U盘上。如果配置错误,拔下U盘就可以还原。你也可以复制自己的U盘给别人,在同样型号,并且安装了同样上述包和配置的路由器上继续使用(当然,会沿用你的配置)。
    下面,是如何创建可被openwrt引导的U盘。
mkdir /tmp/sda1
mkdir /tmp/root
mount /dev/sda1 /tmp/sda1
mount -o bind / /tmp/root
cp -a /tmp/root/* /tmp/sda1
    上面几步,更详细的可以参考这篇文章(http://ddnas.org:88/blog/index.php/archives/2.html)。
    下面说一下使用U盘启动后,你很可能需要的一些包。
bash  当有了空间,你可以修改/etc/passwd来使用bash作为你的默认sh,这样比较习惯。
ifstat  非常常用的软件,监控各个网卡设备上的吞吐。
iftop   监控各个IP的访问情况。
iperf   测试路由器到各个节点的速度。
openssh-server sshd
openvpn vpn软件
screen   一个ssh中运行多个bash的玩意。
    注意,openssh使用~/.ssh/authorized_keys作为验证文件,并且该文件必须是600以下权限。而dropbear不使用这个文件。因此必须先产生该文件,再禁用openssh的password验证模式,不要想当然直接以为dropbear已经产生了这个文件。

2011年6月12日星期日

不解释

>>> (2+2)
5

2011年6月9日星期四

从毒奶粉到塑化剂

    大陆出毒奶粉的时候,大家纷纷指责,怎么这种东西都不检验?好了,现在可以说明这不是大陆质检部门的独门失误了。因为台湾质检也没有想到有人会给食品内添加塑化剂,说明要检测一种你根本想不到会被添加到食物中的物质时,还是比较困难的。
    忘记从哪里看到了,欧洲的食品要求是可追查添加的。就是从源头开始,每一步加工技术对食品的影响都要求可控。例如挤奶,然后得到牛奶。牛奶内的成分就检验一遍,得到一个基准值。然后每个环节如何加工都是需要填报的,这样就可以追查某个环节上产生的异常变化是如何来的。例如后续突然发生了蛋白质含量上升,就要说明如何发生。到底是加入了添加剂,是否合法。还是进行了浓缩,浓缩比例多少。
    这个方法对于监控添加剂是比较有效的,可惜的是,在中国(包括台湾)的体制内都很难实施。一方面,这种做法耗费很大,需要大量的生化技术人员参与到每个环节的检验校对中。另一方面,中国文化是个关系社会。很多问题往往不是简简单单的技术问题,而是关系问题影响技术。当然,后者在欧美国家也有类似表现,就是各种化工原料公司游说国会,将他们的产品列入非监管,无害的名录。
    事情如何收尾?台湾方面的做法比大陆高明的多,也许是吸收了教训。大陆方面拼命掩饰,甚至不惜提高牛奶中添加剂含量的标准,降低牛奶质量,使得大部分的牛奶能够安全过关。但是几年下来,情况越来越糟。牛奶贩子知道政府不敢管,于是越来越嚣张。结果牛奶质量每况愈下,标准一降再降。弄到现在中国人跑到香港澳门去带奶粉,已经造成香港和澳门奶粉严重缺货。两地政府限制销售,同时海关对奶粉抽重税。这说明中国奶粉已经彻底完蛋了,未来十年内都不会恢复元气。而台湾方面的做法则是惩罚有问题的公司,无论涉及多少,一概严惩,标准只能升不能降。剔除了有问题的公司后,好的公司可以继续存活,甚至因为市场的真空茁壮成长。而不负责任的公司则是彻底完蛋,对未来其他想加入添加剂的公司也是个警告。

2011年6月8日星期三

无题

    鲁迅原来是去日本学医的,某日学校里面放处决犯人的影片。片中的中国人被日本人抓住处决,说是俄国人的间谍。周围围了很多中国人,体格强壮,精神麻木,前来鉴赏盛举。
    原来百年来,我们从未变过。

纯C和纯C++都不是好选择

    其实严格说来,纯C是门好语言,我很欣赏纯C。但是作为程序设计,C用起来让人觉得很不方便。
  • 在标准C规范中,变量必须在块的头部声明。当然,在近代C编译器中已经取消了这个限制。
  • 我提到过的,C中缺乏高级数据结构支持,导致一些简单问题的实现变得异常复杂。例如我需要解析表达式,生成lisp样子的前缀表达式。这在很多高级语言中是个很简答的事情,但是C中,你不得不自行管理内存和结构,虽然这并不算复杂。
    还有一些缺点不能尽述,但是经过时间的考验,C无疑是强大而具有生命力的一种语言。
    C++就比较搞笑了,纯C++是一个非常糟糕的东西。我们列举其缺点:
  • 函数指针是C中常用的概念,在C++中应当使用抽象接口-实现的方式,或者使用仿函。从技术上说,在C++中使用函数指针是一个落后而没有C++特色的行为。然而无论使用哪种,生成一个新的函数就必须生成一个新的类。你当自己是java么?
  • 太多internal操作,导致代码隐性错误和思考心智负荷大幅上升。例如某个类可以定义一个单参的构造函数,constructor(int c);这等于定义了一个隐性转换函数,允许将int转换为类。或者使用T operator T();算符函数,将类转换到T。如果此时错误的将类实例当作int来操作,就会产生编译通过但是运行时出错的问题。更严重的是,转换函数严重的消耗性能。在这种情况下,编译和运行都不会出错,只是莫名其妙的性能很差。要避免这个问题,可以用explicit关键字。具体可以看这里(http://www.cnblogs.com/cutepig/archive/2009/01/14/1375917.html)。但是这就需要额外的知识,和随时关心自己是否会犯下这个错误的小心。
  • 强大到啰嗦的模板系统。那位有信心看懂所有stl编译时报错的?反正effactive C++的作者举过一个缺陷,打印了1500个左右的字符。大部分都是符号,望之犹如天书。
  • 为了支持多重继承,导致指针类型转换可能导致指针地址变换。这是一个很扯淡的缺陷,转换指针类型不会引发指针的地址转换是一个C中的基础常识。然而C++为了支持多重继承,导致这个常识被破坏。
  • thiscall和non-thiscall指针无法转换。类成员函数和普通函数指针是无法转换的。这个破坏了所有代码都可获得地址的常识。
    其实C++的致命缺陷,就是过度设计。每一步都是很必要很有道理的改进,在最后就组合成了让人望之生畏的复杂系统。
    要使用C++,关键就是克制自己的过度设计欲望。C++可以很容易的使用类,模板,友元系统写的很强大,而且看起来很自然。例如你可以定义自己的BioTree,使用+做合并,可以使用|运算符做输出等。然而到最后,就会变成另一种语法。并且,如果合并上大数运算库之类的库,做一个BioTree,其中元素是大数的结构。当这个结构内发生错误的时候,你觉得你能够在里面找到正确的调试方向么?
    要克制自己觉得很自然的想法,使用传统C中的一些做法,哪怕他们看起来很古怪,但是这是有道理的。

2011年6月6日星期一

版权的态度

    如果你读过RMS的书,你会发现这位老先生对版权的态度很有意思,他压根不认为copy这个东西居然还有right。copy要是有right的话,数学公式应该有right么?你那里算火箭弹道呢,有一张传票发过来,说牛顿的后裔发现你在用牛顿法求根公式求解方程,要求你支付权利金。你觉得不觉得很崩溃?就是因为数学公式是人类进步的基石,所以我们不允许任何人声明对它拥有权利,也不允许任何人阻断他人学习和使用数学公式。
    然而如果数学公式没有权利的话,软件有权利就是一件很扯淡的事情。例如,你解决了一个数学问题,能够以最小代价将字符序列中的无效信息压缩到最小。然后,有人针对这个算法写了一个文本压缩程序。由于你的解是数学最优的,就是说,根据你的论文写出来的程序,如果没有什么大的实现瑕疵的话,压缩率和压缩速度是最高的,没有之一。所以,写程序那个家伙就申请了一个专利,天天收入不菲花天酒地。然而,你,这个论文作者,居然TMD还在吃糠咽菜。
    当然,这个例子本身太过特殊,数学家一般也有过得去的计算机水准,所以针对算法写程序的人多数是数学家本人或者合作伙伴。但是这种问题不时刺激人们,对于我们最重要的东西,我们不能设置权限。然而我们却允许做出不重要发明的人享受特权,和特权带来的利益。所以RMS为代表的一小撮人,主要是老嬉皮士,强烈的反对版权。作为代表,他们搞出了GPL——反对版权的版权。你要基于使用GPL的代码写程序,好,你就必须放弃你的版权,同意GPL。
    甚至,他们更激进的认为,不应当阻碍人类获得知识的渠道,知识是人类所共有的。所谓共有,是指,任何人都可以自行获得和学习知识,而不应当为此付出代价,例如金钱。当你上学时,你是为教师付钱,而不是为你学到的知识付钱。而且,当你想学,你就应当可以学到,而不是被禁止学习。因此,美国禁止向海外出售高强度加密软件的事情,在他们看来是邪恶的。将知识垄断,阻碍他人学习,他们看来是邪恶的。甚至你自己用来开发的机器上,设定个密码禁止其他人浏览你的代码,他们也认为是邪恶的。
    这种观点当然很不讨好,甚至从他们的运动中获益的一些人——包括中国,都不欢迎他们的想法。我研究获得的知识,却无法用来牟利?劳有所得,这在很多人眼中是天经地义的,因此RMS等人的思想才显得那么格格不入。然而不可否认,RMS等人并不能算是扯大旗为自己牟利的伪君子或者邪恶教主,他们是真的信仰这种人类大同的观点。RMS年近50,无车无房,未婚,孑然一身,到处宣传自己的GNU思想。他自称自己连电脑都没有,不过出名的唯一好处是,现在他很容易借到一台电脑来收邮件。
    国外的情况而言,是版权发展过剩。就是说版权现在已经成了大公司跑马圈地的法律武器。而国内的情况,则是版权发展不足。国内的人说认同版权观点,但是却仍旧使用盗版的winrar。而反对版权观点,也不是因为他是个嬉皮士,同意不应当阻碍人类获得信息和学习知识。纯粹是懒得付钱而已。

2011年6月1日星期三

如何参与一个开源项目

    最近很多人在问如何参与一个开源项目。其实个人觉得这是一个非常傻的问题,不过还是回答一下,期望这帮人记得用google搜到这个角落,免去论坛上月经一样的天天看到这种傻问题。
    为什么说傻?因为这个问题和"如何捐钱"一样,是个没法直接回答的问题。你总要有一个明确的捐献目标,或者是明确的目标项目。世界上没有一个组织,名叫"开源软件"。无论你的目标是什么,你必须找到一个确定的开源项目进行参与。
    在哪里能够找到开源项目?这很不好说。一方面,你可以在sf.net(需要翻墙)和code.google.com(最好翻墙)找到相当多的开源项目,也可以在github之类的地方寻找。另一方面,你也可以在debian里面找。很多包里面附带了项目的主页,如果你觉得这个包很不错,希望做贡献,可以按照链接找过去。
    如何挑选合适的开源项目?首先要和你的兴趣相符合,或者能够满足你参与开源的目标。例如你对算法非常感兴趣,让你加入一个ERP系统的定制,成天修正繁琐的业务问题,可能就会让你觉得兴趣全无。其次最好参与一些中等复杂程度,具有活力的,比较缺人的项目。像linux kernel这种规模巨大,参与人员众多的项目,本身就是一个非常巨大的工程。你要了解这个工程需要很长时间,但是大部分你觉得有价值的事情都已经有人在做了。
    如何开始?具体可以先给项目管理者发一封邮件,说明自己的目标,兴趣,能力,时间,然后问问他们是否需要自己的贡献。
    大多数项目最缺的人才,不是程序员。通常一个开源项目,有几个程序员在做是不成问题的。但是大部分的开源项目缺乏一些周边人员,例如到各个组织中推广项目,获得反馈。和各种dist和开源平台协调,负责收集bug,控制项目发行,进行打包。负责项目的测试和文档工作,以及英文文档的翻译工作。这些工作并不需要专业知识,但是琐碎而且费时,程序员并不大乐意做。而且控制项目的release,还有进行协调要有一定的经验,也不是程序员擅长的领域。所以相当多的开源项目,就是程序员拍脑袋写,然后用户两眼一摸黑的用。没有合适的文档,没有各种系统的适用包,没有bug和用户意见反馈。
    因此贝壳也请求,所有看到文章,且有志于贡献自己的力量的人,都可以考虑参与开源项目。你不需要会写程序,也不需要精通电脑。你需要做的可能就是将文档从英文翻译成中文,或者不断使用一个软件并找出其中不合理的地方。在中国,捐献金钱是容易的,但是却不透明,也不自由。你不确定你的金钱捐献给谁,他收到多少,是否真的需要。然而如果你选择某个开源软件做捐献,你可以选择自己为谁做出贡献,也会受到全体开源软件用户的感激。