Shell's Home

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

Jun 29, 2011 - 1 minute read - Comments

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

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

Jun 28, 2011 - 1 minute read - Comments

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

关于文字抄袭的一个想法

Jun 27, 2011 - 1 minute read - Comments

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

关于中医

Jun 23, 2011 - 1 minute read - Comments

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

bitcoin的后续解说

Jun 22, 2011 - 1 minute read - Comments

上次那篇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做不到现代货币的功能。这很明显是包装和宣传概念,通过持续的涌入制造繁荣。

bitcoin垮了

Jun 21, 2011 - 1 minute read - Comments

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的设计,原本就是为了保证没有控制者。 一点额外的联想。如果类似的问题出现在实体货币上,会发生什么事情?如果有数百万个(如果是中国,可能要数千万)银行账户被盗(而且是确实被盗了,钱财已经转移),政府也查不到攻击者,那么会出现挤兑么?我猜测,更加可能的事情是政府直接和转入银行对话,停止支付和兑换。除了瑞士银行,大部分银行在这种涉及金融体系和国家主权的问题上都是比较配合的。即使无法获得转入银行的配合,国家也可能以货币兑换的形式止损。一笔能够动摇到国家经济的兑换无论如何不可能轻松进行,除非是来自另一个国家的策划和实施。当然,可能有更多的办法解决这类问题。因此一旦有一个强力的主控者,解决这些问题就有很多的办法。

openwrt配置——QoS配置

Jun 20, 2011 - 1 minute read - Comments

说到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软件改为不限速。否则不能达到最高性能。

openwrt配置——防火墙规则

Jun 17, 2011 - 1 minute read - Comments

如果说路由规则还能讲讲,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配置的最终效果也差不多,不过比较简单整齐好理解。

openwrt配置——路由规则

Jun 16, 2011 - 1 minute read - Comments

路由其实是个很简单的事情,不知道为什么在实际运用中被很多人误解。首先,路由规则是个纯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发送。

openwrt配置——openvpn的基础配置

Jun 15, 2011 - 1 minute read - Comments

在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