Shell's Home

Jun 21, 2011 - 1 minute read - Comments

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

Jun 20, 2011 - 1 minute read - Comments

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

Jun 17, 2011 - 1 minute read - Comments

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配置的最终效果也差不多,不过比较简单整齐好理解。

Jun 16, 2011 - 1 minute read - Comments

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发送。

Jun 15, 2011 - 1 minute read - Comments

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

Jun 14, 2011 - 1 minute read - Comments

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使用~/.

Jun 10, 2011 - 1 minute read - Comments

从毒奶粉到塑化剂

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

Jun 9, 2011 - 1 minute read - Comments

无题

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

Jun 8, 2011 - 1 minute read - Comments

纯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中的一些做法,哪怕他们看起来很古怪,但是这是有道理的。