Shell's Home

Feb 7, 2012 - 1 minute read - Comments

国产软件更换计划

首先声明,我不是歧视国产软件,我自己做出来的也算国产软件,如果我真的在玩歧视,我是歧视我自己,OK? 不知道为什么,中国人做出来的软件,或者中文软件,和外文软件有完全不同的风格和特性。我很早就骂过,我们的软件充斥着免费的流氓和收费的冷屁股。现在更改一下,我承认有的软件很好用,所以中国的软件是好用的流氓大集合。 为什么?我怎么知道为什么?前两天千千静听的事情把我恶心坏了,而且还有中文putty后门事件。难道国内就没有好用的软件了么?自己想想,很杯具的发现,貌似可能性不大。首先,如果我们的程序好用而且免费,程序员就得从其他渠道赚钱。这年头程序员的第一需求是老婆需求,这是刚需。有老婆需求就有丈母娘需求,有丈母娘需求就有房子需求。OK,哪怕我们的程序员是个只对程序感兴趣的大宅男,只要他不是个Gay(说明一下,只要一不找我,二保持固定关系,我没有歧视的意思),最终还是会归结到钞票需求,而且还不是一般的钞票需求。 所以,大量的程序员都必须赚钱,赚大钱。相比起来,很多老外程序员的想法我们就觉得很奇怪。我有位朋友(在此先恭喜他喜得贵子,然后按照他的习惯隐去名字,请认识的人也不要写出本名给搜索引擎搜),他希望办一家中国公司做一项技术,因此曾经找上中国的干部。干部对这个技术很感兴趣,因此愿意给支持。我提醒他,有支持就有相应的条件,他以后将不能撤资,而且赚到的钱也不完全是自己的。他很奇怪的看我,开公司的目的是推广这项技术在中国的应用,只需要基本收入就好了。作为一个同样需要赚钱的中国程序员,我顿时觉得我们在两个世界。 而且,中国软件界普遍的情况是对恶和权不敏感,例如很多程序员都在用盗版VS。当然,我会听到很多理由,但是我觉得他们只能被称为借口。我认为盗版只在两种情况下合情理——用于教学实验目的和为了表达对版权制度的抗议。当然,后者虽然合情理,但是违法。如果说国内程序员用盗版的理由是一,那太侮辱智商了。而如果是二,我从没有看到他们举着反对版权的旗子去游行,也没有看到他们所写的所有软件都声明——本程序没有任何版权。 我也和不少程序员谈过所谓授权和回避方法,基本都是新手程序员觉得“很有道理”,老手就付之一笑了。因为老手知道,这些事情是没必要的。是否在软件包中声明使用了某个BSD的库?没有区别。商业软件使用了GPL的库?没人关心。你多此一举,只会引发项目经理的反感而已。OK,既然程序员对作恶和权不关心,那么绿坝版权问题的发生只是迟早而已。 难道中国软件界改良的希望需要寄托在培养基友程序员上? 这么大的问题我暂时无解,但是我需要做和我有关系的部分。我会逐步移除电脑中的国产windows程序,并且将其余国产程序加入观察名单。中文软件主要是指在国内制作和汉化的闭源windows软件,原生软件汉化不算,开源不算,linux软件不算。实际上,观察名单对我而言不会太长,基本就是QQ国际版,Foxit,和几大网银。 我建议读到这篇文章的人,也好好考虑一下,哪些软件真的是有风险的。这并不是让你马上回家删掉所有国产软件——实际上我至少得留着网银,他们没替代品——而是说,我建议你在脑子里面转一下,自己装了些什么东西,会造成哪些问题,是否愿意接受。这会花掉你几分钟的时间,但是也许会让你少碰到一些恶心问题。

Feb 6, 2012 - 1 minute read - Comments

千千静听被百度收购了,WTF

我挺喜欢千千静听的,这玩意被我调整到习惯和winamp差不多。自从winamp变成一个庞大的怪物以来,我一直用的这个。 不过在win7上,我一直删除不掉百度插件。每次我请他们出去,他们又会装上。后来我启用了严格的UAC,并蓄意把目标文件夹标记为没有人拥有权限,发现了问题——千千每次启动都查找并试图重装baidu插件。我开始以为是我下载的版本不对,被捆绑了其他组件。然后我去他们官网,下载了一个最新版本。安装的时候,我留意到发行者是baidu online…。OK,问题看来不是我下载的版本被恶意捆绑,而是原始版本就写入了这个代码。 用过firefox或者比较正规的软件(包括微软那个IE)的人都可以留心到,在关于页面中,可以看到这个软件使用了哪些开源组件。这个大部分是因为这个库的版权限定要求使用者必须列出库的名称。不过这点在中文软件上就做的比较差,也许是根本不拿授权当回事吧。 但是,在软件内打入和软件功能无关的其他组件,那是另一回事情。个人认为,一个程序如果在安装包内捆绑插件,让用户选择安装,我还能接受。毕竟很多软件作者也要吃饭,做插件推广是一条路。如果捆绑强制安装,那就有流氓之嫌了。如果捆绑完了不算,还在每次启动的时候都检查插件是否还在,那就是确定无疑的流氓。 当然,千千的行为比这个更糟糕(我不选择说更流氓)。千千主页上没有任何地方说明千千归属了百度旗下,只有最下方有一条<千千静听联手百度娱乐推出“百度新歌汇”>的新闻,以及最下方有百度软件世界的连接。我也是从UAC的警告中发现,千千的软件包是用winrar打的(不知道是否是正版),而签名则是Baidu。至于选择,软件安装的时候的却有选择,不过即使选择了“不安装百度工具栏”,“不将hao123设为主页”也没用。还是会有一个叫做BaiduMusicCtrl的东西伴生安装进去,每次ttplayer启动时伴生启动的就是这个。说是和音乐有关的东西么,我在IE的插件和系统启动项中都找不到这个东西的影子,不知道是干吗的。千千删除的时候也不会跟随删除,不过可以找到独立的“百度音乐控件”项目,并且手工删除。更神奇的是,我在主页上找不到任何关于此事的说明还不算,连软件的发行授权都没有。没有发行授权,这软件我们用着算怎么回事呢? 我又安装了一遍千千,找到了软件使用协议“版权归属所有者所有”。这不是TM废话么。 OK,很多人在我说,中国人不大在意版权,这句话的时候,要我拿出证据。现在就是一个明证。从整个过程中,我感觉到的并不单是恶意捆绑这么个事情,而是对版权和授权的一个漠视: 1.没问你要不要,总之给你捆绑安装百度音乐控件,每次千千启动时自动启动更新。 2.被百度买了,页面上什么关联都没写。 3.关于授权,这个软件什么都没写。(另外,写授权的时候不要写“保留一切权利”,这是句屁话。你最起码得度让使用权,否则发行软件给别人就是故意诱使别人犯罪。千千的“保留知识产权”还是正确的。)因此,不要问我如果你把千千放到你的主页上会如何——这算再发行,合法不合法就看作者定义了——虽然我觉得他自己都不一定觉的出区别。 现在改用了foobar2000,很满意。这个东西可以接受samba共享系统,并且支持从zip/7z中读取文件。我很多下载的zip音乐包就可以直接使用了。虽然界面简陋很多,不过用起来更顺手。千千还是留给度娘控吧。

Feb 2, 2012 - 1 minute read - Comments

教育的思考

首先说明一点,这是贝壳自己对自己受到教育的反思。由于本人不从事教育行业,所以结论可能和现有的理论相悖离,也不保证正确。 教育最重要的时刻,不是在高中,而是在幼儿园。幼儿园的老师不应当教知识,而是应当教常识。常识是非常重要的,我们有意无意,善意或恶意,都会给小孩子灌输扭曲的常识,例如孩子问你他是哪里来的,你说是从垃圾桶中捡来的。等孩子成长了,他的第一件事就是推翻不正确的常识。还记得那个笑话么?——我知道你的父母和老师都对你这么说,但是,圣诞老人是不存在的。是的,超人也不存在。哦,不不,驯鹿和美国总统是存在的。 孩子听到越多不正确的常识,就需要浪费越久的时间逃脱常识的束缚。大部分孩子甚至终身会带着一些偏见——例如以前的“地球是宇宙的核心”,到不久前的“空间是连续的”。从有意的“抢到的东西就是自己的”,到无意的“大人说谎也不受惩罚”。越多错误的束缚,孩子需要浪费越多的时间逃离束缚,将来的成就就越小,这就是为什么我觉得幼儿园是一个孩子成长的关键的原因。 至于第二语言,真的没有必要在幼儿园就开始学起,我甚至觉得语言不应当被独立教授。还记得你的打字是怎么练成的么?我打赌我的读者中,有一半以上不是在正规的课堂中,按照老师的指示一点一点去练习每个键位,最后成为打字高手的。我自己是在QQ起步的时候,在网络上和别人聊天。从开始的一对一还是被人家嫌慢,到最后可以很轻松的一对二甚至一对多,大概只花了我半年多的时间。同样,要在课堂上学习语言,比不上在语言的环境中学习,这个大多数人都知道。但是什么是语言的环境?这不是说找个外教,或者用英语授课就解决的。孩子使用语言的关键,在于和同龄人组织学校社会的时候。如果他们圈子里面用英文,你的孩子只有三种可能,1.不和同龄人交往,变成书呆子,2.根本不去上课,退学了,3.英文熟的你根本听不懂。问题是,在中国如何控制学校中的学生交际圈呢?所以从这个意义上说,在中国要稳定的学好英文,而且和老外差不多,是不现实的。只能靠你孩子的天赋和运气。 很多人把孩子送到了国外,实话说,这是一个不负责任的选项。孩子可以没有很强的英语能力,但是在成长中,脱离家庭的关心是致命的。除非你送到国外后,在当地有其他人可以替代你关心孩子,否则将来成长的结果只能靠运气。有很多人,在出国后交往男女朋友(这个很正常),颓废,不用功学习,失去生活目标(这个不应当在初中和高中出现),乃至吸毒(这个也不算太少)。当然,以国内不少家长的情况而言,陪着孩子成长只会导致更严重的问题。 中国的小学和初中教育,是一个学习的过程,这个没问题。但是学的内容太深入,又不够广泛。现在家长都在喊教育内容不要超纲,喊教学速度过快,喊小学上大学内容。但是,什么是纲,为什么要有纲。诚然,学习的问题上,有些时候不到一定年龄,学生是理解不了某些问题的。但是在学习知识上,实际是没有边界的。我们拆掉考试的问题来反观教育,如果真的是为了更好的工作,那么凡是需要的知识都必须要学,可以多不能少,何来超纲?超纲是一个基于考试产生的现象,本质是考试的难度无法增加,就通过增加范围来提高分辨率,强行区分学生。 以初中数学为例,我们初中数学的很大一部分都在教授二次方程特性和解法。实际上呢?二次方程用到的机会非常少。大家也都是从考试中走出来的社会人,你们凭良心告诉我,毕业后有多少机会用到了二次方程?个人觉得这部分教到过概念和解法就可以了,不必对特性深入到奇怪的地步,特意构造一些特例问题来考察学生的解题能力。其实只要在需要的时候,找一下wiki,然后根据问题能解出来就行了。我的高等数学学了很久,现在也差不多都还给了老师。但是需要的时候,我可以通过很短时间的查找资料,把问题现场解出来。反倒是从小学到高中,对一些现代数学的基础学习不足,尤其是线性代数和统计学。高中没有教授现代统计学,因为这依赖于高等数学。线性代数只教了方程组解法和行列式,没有教授矩阵运算。实际上这是现代数学概念的基础,应当在足够的时间内深入学习。 至于语文和思政,更是沦为执政党的免费广告课程。这部分课程大部分人在高中开始就吐掉了,吃都吃不下去。 高中开始,学校教授的不应当是知识了,而是研究方法。当然,研究方法其实应当从小就开始学习了,包括论文格式,研究过程和方法,预算控制等等。尤其是一些现代科学中基本的精神,都应当在实际的课题报告中做足够的检讨。国人经常在一些莫名其妙的地方出奇奇怪怪的毛病,部分可能就源自没有系统的接受过研究方法论的影响。例如,在研究效果的时候,应当应用双盲法。如果这是一道填空题,我估计大部分国人都能做对。但是实际操作的时候,有很大可能陷入双盲误区中。尤其是单向相关性断定,当有A,就发生B时,就开始断定是A导致了B。又例如中医问题,对于接受过研究方法论的人而言,双盲法检验需要不需要根本不应当是一个问题。要么就拜托你,不要自称中医是科学,这也行。不是每个结论,在科学上都有解释。不管你信不信,反正有人信。这没什么,有人信上帝,有人信科学。但是不要对外声称,我们的上帝经过科学检验。。。 至于有些民科,或者一些不知道什么的人,写出来的东西就更神奇了。为什么地球在远处向太阳坠落就会形成旋转,为什么太阳是黑洞在发光。他们写的每个字我都认得,但是连贯起来就完全看不懂说了些什么。老外的神奇论文,是从常识性的结论和公式出发,通过推导,得出一个反常识的结果。然后再验证这个结果,而且居然是对的。例如泊松斑,水星近日点漂移,宇宙膨胀。对于这些东西,我虽然看不懂,但是每个上下文的联系都能看到,只是不明白基础知识,也不知道为什么要如此推导。民科的论文则相反,是从常识性的结论和没有公式出发,跳跃性的得出反常识的结果,然后没有人能够验证。我不但看不懂上下联系,而且连他想说什么都看不明白。当然,最神奇的是这样的东西也有人买。。。 至于大学,会在大学学习知识的人是傻子。大学是一个教授研究方法论和寻找人生意义的地方,如果一个学生大学毕业,能够找到自己的人生目标,认识一群好兄弟,就已经很满足了。至于学到的知识,真的和大学无关。如果要说有什么关系的话,最多是借助大学的环境,可以更广泛的接触自己想要接触的东西。当然,后者即使对于毕业的人也不是无法做到,所以去大学绝对不是学知识的。 说到这里,国人有个奇怪的现象。大部分人好像都相信知识改变命运,更多的知识就能带来更成功的人生。但是实际操作的时候却都是脑体倒挂,进行脑力劳动的不如进行体力劳动的。程序员赚钱靠什么?加班。书本靠什么赚钱?印刷。

Feb 1, 2012 - 1 minute read - Comments

如何写基于google code的watch file

google code很好用,可是他的下载页面很恶心,很难跟,而且还改过一次。debian打包党要做watch file的时候,估计会很郁闷。 去http://googlecode.debian.net/,然后提交你的包名,你会得到一个url(其实自己猜也可以猜到)。每次访问这个url的时候,他会代你解析google code,告诉你有没有更新。

Jan 31, 2012 - 1 minute read - Comments

PXE模式使用openwrt网络安装debian

废话不说,上干货。 首先,禁用arptables。当然,如果你没开这个防火墙,那么没必要。其次,注意你的openwrt必须有udisk,否则空间相差太多,根本没有实现的可能。 然后,如果你用的是新版的rom,应该在/etc/init.d/dnsmasq里面看到,dnsmasq()这个函数里面有。 append_parm "$cfg" "tftp_root" "--tftp-root" append_parm "$cfg" "dhcp_boot" "--dhcp-boot" 如果没有,加一下,有的话说明原生支持。下面可以直接修改。 dnsmasq是一个dhcp/dns双重服务器,而pxe引导的第一步就是支持bootp协议。这个选项在/etc/config/dhcp里面。config dnsmasq一节上,增加。 option 'dhcp_boot' 'pxelinux.0' 重启dnsmasq,完成bootp准备。 然后,安装tftpd-hpa,opkg update,opkg install tftpd-hpa。这是一个tftp服务器,默认不启动。如果你打算让pxe引导模式持久化,那么就改为默认启动,同时永久关闭arp防火墙。在/var/tftpd-hpa里面,可以看到tftpd的根路径。从参考3的的连接里面,你可以找到合适的一个下载路径,下载netboot.tar.gz到这个文件。解压后,可以看到pxelinux.0,这个和上面的pxelinux.0相对应。这是pxelinux的组件,隶属于syslinux项目,可以用来完成启动。 这样,就完成了安装的所有准备工作。你可以找一个设备实验一下,应当可以完成网络安装的步骤。 另外,如果需要启动选择amd64或者是i386,或者更进一步定制。那么需要下载其他镜像,自己生成pxelinux.cfg这个目录中的内容。 PXEhttp://wiki.debian.org/PXE NetbootPXEhttp://wiki.debian.org/DebianInstaller/NetbootPXE netinsthttp://www.debian.org/distrib/netinst 配置pxe,安装debian和ubuntuhttp://my.unix-center.net/~whtbie/wordpress/?p=290

Jan 29, 2012 - 1 minute read - Comments

tcp连接的建立和释放

大家新年好,新年第一博,我们来写一点干货。 建立tcp为什么是三次握手? 从两军问题说起太远了,三次握手的假定是一条双工线路的每个方向,要么持续通,要么持续不通。就好比一个电话,你和对方可以同时说话,所以是双工线路。你说了对方能听到,这叫单方向。单方向上,要么通,要么不通。 如果从一个不保证稳定的电话线上(例如移动电话,这是典型例子),你怎么确定你们通话是正常的? 假如你首先说“喂”,这时候你什么都不知道,对方能听到,他就知道你到他这里的电话是好的。他会说“喂,我听到了”。你听到了,会知道他到你这里的电话是好的。 事情结束了么?没有呢,他还不知道你能听到他讲的东西,所以你还要回“我听到了”,然后开始说正事。 回想一下自己打电话的经历,是不是往往漏掉了最后一个“我听到了”呢?这样会使得对方无法确认你能听到他说的东西。不过一般来说,当你开始滔滔不绝的时候,他会假定你听到了那句“喂,我听到了”。因为通常没有人会没听到对方的回应就开始说话说个不停。这个模式在tcp中也是可以做到的,在最后一个ack上附加数据。 为什么由发起方开始?因为我们必须要假定有一个方向开始,任意开始就需要处理碰撞问题(就是同时开始)。接通socket总是由发起方开始传输第一个包,你不觉得直接在这个包上面开始测试连通会比较合理一些么? 电话为什么由被叫方开始说话?因为主叫方打电话后,被叫方决定了电话什么时候接通。电话接通的时候,被叫直接就可以说话了(假如电话稳定的话),而主叫要等到下一个“嘟”不出现才能有所反应。所以通常都是被叫先开口。当然,也有被叫方接起电话来等着主叫说话的情况。 另外提一句,如果你使用手机拨打的话,当听到对方“喂,这里是XX,您好”之类的信息的时候,应当先说“喂,我是XX,您好”。等对方确认能听到了,再开口说正事。因为手机有不算太小的几率,双方都听不到,或者单方向听不到。如果不巧是后者,很容易引起不必要的误会和麻烦。例如你滔滔不绝的说,对方作为反应,说了几句。然后你什么都听不到,继续说。对方当然会生气,对不对? OK,现在我们来说说挂电话。 tcp的fin机制,其实是要解决这么一个问题。当你说“再见”后,能够马上把电话放下么? 不行的,因为对方可能还有一些重要的事情还没说。你一说再见就挂断,这个会造成问题。从简单的思考上,我们会得出一个结论。当你说了“再见”后,对方可能还需要说一些事情。当对方也说了“再见”后,你就可以挂电话了。 可是且慢,对电话而言这个模型成立,我们得稍作修改才符合网络——当你挂下电话机后,对方不会出现忙音。于是,当你说再见,对方说再见,你必须再说一次再见,对方才能确定你听见了再见。而且这次,事情非常符合两军问题——你们永远也无法就什么时候挂机达成一致。这个问题再折衷回来,也是一个三次模型,对方说再见,你说完你要说的话,然后说再见,对方再见,挂机。 被动关闭上,这个模型基本是正确的。当你收到“再见”后,把你要说的事情说完,然后再见。这时候不能挂电话,因为你不确认对方听到你的“再见”了。如果你的“再见“对方没收到,那么对方会死等到天荒地老。至于为什么对方可以肯定你收到了他的再见,是因为刚刚你说的那堆废话里,应该已经包含了“我知道你要挂电话了,我会尽快说完”的意思。所以,你需要等对方的“再见”回来。 当然,在tcp的实现上说,所有对对方的回应,都在ack里面。所以是FIN FIN-ACK ACK,关闭。最后一个ACK前,叫做LAST ACK状态。如果ACK丢失,会造成被动方挂断有问题,因此这里需要一个超时机制。用电话术语来说,就是最后一个再见没听见,你就要等到天荒地老,因此当对方首次再见完成的时候,你说再见,如果一定的时间等对方的最后一个再见等不到,就别等了,直接挂机。这个时间比等不到对方任何消息而挂机,要来的短。tcp标准设定为两倍最大生存周期,即2MSL。当然,如果等到了最后一个ACK,就直接删除连接数据结构。 主动关闭的时候,情况会更加复杂一点。为什么?因为刚刚的超时机制。我们从你说再见之前开始说起,这次你是主动告别一方。 你首先说了一个再见,然后进入FIN_WAIT1状态,换成电话术语,就是等对方说再见。tcp机制上,对方的ACK先到,就是FIN_WAIT2。对方的FIN先到,就是CLOSING——这种情况不多见,只在双方同时想挂断的时候发生。如果对方的FIN-ACK一起发送,那就直接保送上TIMED_WAIT。无论是哪种先,最后会收到一个ACK和一个FIN,并且发送一个ACK。换成电话术语,就是你说了再见,对方一定会说知道了和再见,并且你会说知道了。差别在于tcp需要用多个状态来表示哪个事情先,哪个事情后,打电话就不要这么麻烦了。 最复杂的事情,在于说了最后一个再见之后。当你说完最后一个再见,就可以直接挂电话么?电话可以,但是作为tcp,却不可以。因为某些情况下,对方的FIN包没有到就会进入TIMED_WAIT状态。另外一些情况下,对方的LAST_ACK等不到你的ACK,会把他的FIN重发一遍。如果直接销毁连接结构,那么最后一个FIN包可能对新的连接造成干扰,而且会阻碍对方关闭连接。所以,作为主动挂断一方,你有一点很不利的是,无论如何,你必须等这个2MSL的时间。这个值在linux中一般是60s,更进一步可以查看rfc1337。 刚刚解说的最后一个情况,就是很多机器TIME_WAIT很高的原因——因为你的服务器主动关闭了连接。作为本质解决方案,你需要理解为什么会发生这件事情,服务器端关闭连接是否正常。如果正常,那么加一些内存,并且启用tcp_tw_recycle来减缓这个问题。注意,这个参数不应当在NAT后的机器上被启用。具体可以查看rfc1323。

Jan 18, 2012 - 1 minute read - Comments

python的字符串相加效率

今天文章被人纠了错,就跑去人家主页上逛。结果看到有篇文章说字符串相加速度的,看看结论很奇怪。就做了一下实验。原文可以看这里。我们只讨论python部分的行为。首先是论证我观点的测试,无关部分就跳过了,大家应当可以自行补上。 def f(): s = '' for i in range(3): s += '123' print id(s) return s f() f() 输出: 138190216 138276992 138276992 138190216 138276992 138276992 至少在几十的规模,这个结论还是成立的。说明对象确实被缓存了,这导致了字符串相加的多次测试中,后续次数都没有实际的执行字符串分配动作。召dis来问之。 14 0 LOAD_CONST 1 (u'') 3 STORE_FAST 0 (s) 15 6 SETUP_LOOP 46 (to 55) 9 LOAD_GLOBAL 0 (range) 12 LOAD_CONST 2 (3) 15 CALL_FUNCTION 1 18 GET_ITER >> 19 FOR_ITER 32 (to 54) 22 STORE_FAST 1 (i) 16 25 LOAD_FAST 0 (s) 28 LOAD_CONST 3 (u'123') 31 INPLACE_ADD 32 STORE_FAST 0 (s) 17 35 LOAD_GLOBAL 1 (print) 38 LOAD_GLOBAL 2 (id) 41 LOAD_FAST 0 (s) 44 CALL_FUNCTION 1 47 CALL_FUNCTION 1 50 POP_TOP 51 JUMP_ABSOLUTE 19 >> 54 POP_BLOCK 18 >> 55 LOAD_FAST 0 (s) 58 RETURN_VALUE 我们看到s是local变量,这个符合我们的预期。但是后续确实发生了add,而string的+算法,我们可以参考Objects/stringobject.

Jan 17, 2012 - 1 minute read - Comments

计算机自动化的方向

我认为,人类操纵各种设备的权利不言自明,这是软件/电气设备进化的必然结果。 OK,我在吐槽什么? 昨天,老婆用了一次家里的新自动洗衣机。很好用——晚上把衣服全丢进去,然后设定模式,倒进去洗衣粉,今早六点他会自动启动。早上就拿着半干的衣服去阳台晾晒,整个过程没有一点麻烦。外婆家里的那台老洗衣机,每次使用都需要搬进搬出,连接一堆管线,然后发出巨大的响声,再由人工把半湿的衣服拿去晾。 ——如果要那样的话我们还得看着洗衣机,或者任由刚刚洗好的湿衣服在洗衣机里面闷六个小时。 我觉得,这才是享受人生的方式。当然,老婆和我也是一样的观点——我们在父母家里可是受够了老式洗衣机的刁难。她在发现这玩意的好处后,脑筋动的可比我快多了。早上还没有睡醒,我就被她吵起来,然后问了一个问题。 怎么远程遥控家里的微波炉和空调? OK,很得意的说,这是家居设计时我早就发现的一个问题,然后很遗憾,我告诉她——暂时不行。这个是我调查了很久后得出的结论。我不大不小好歹是个程序员,怎么说在控制电器上也是有点经验的,不过这个问题确实超出了我的能力范围。目前我所知道的,控制电器的方式基本有三种。 1.电器本身支持某种协议,例如wifi,或者蓝牙。我的电视机就支持eth网络,我可以通过手机遥控电视,或者直接在电视上观看某些节目,而不用打开电脑。 2.通过电源接口做。例如我看到房屋装修中卖的最多的,号称智能屋的系统。大部分都只能支持电灯的开关,或者电灯开关支持的最好。因为电灯的开关是一个只和电源有关的问题,我们只需要做一个很小的单片机系统,装置在开关面板上。当这个机器收到无线信号的时候,就打开或者关闭电灯开关。 3.通过红外线仿真做。这个适用于IrDA兼容的无线红外遥控设备。通过购买一个红外线装置,接收遥控发出的红外信号,再对着设备重发。 而以上三种方案,都是有缺陷,而且是严重缺陷的。 方案一,需要设备支持。通常来说,这样的设备都是相当昂贵的,而且不是每类别的设备都能买满意了。如果有一个很小的厂子生产一种空调,支持wifi。但是这个厂的空调机以不稳定而出名,你是否愿意为了遥控而冒常常要去修空调的麻烦呢? 方案二,不是每个设备都能灵活控制。空调和微波炉接入电源后处于待机阶段,而不是启动——这是最有遥控价值的两台机器。即使能启动好了,我再如何通过电源告诉他,把里面的东西给我加热10分钟?而且单片机接收信号必须有相当复杂的加密,至少能对抗差分攻击。否则就会陷入汽车解锁遥控器同样的问题——被破解。 方案三,更加糟糕。红外是一种指向性相当强的方案,所以当年的红外数据传输方案很快就被蓝牙替代了。也就是说,我要遥控三台空调,需要买三个红外设备,做固定指向。或者买两个电机来摇动红外设备。即使给我做出来了,不支持遥控的微波炉,自然也无法使用这个方案。 然而你很容易的想到,如果一个完全不明白技术关键的外行,在接触程控的第一天,就把我摇起来问这个问题。那么这个问题,肯定是我们将来的目标。 未来的设备,不但需要一套硬件界面(这个是必须的),而且还需要一套协议界面。为什么?你可以在家里的电脑里,通过符合协议的软件,一次性控制家里的所有设备,这就是所谓的“完全中控”。如果你觉得我是瞎说,鬼才会想要这种东西。请自己问问手里有一台ipad的同学,他们是否想在ipad上装个软件,直接遥控家里所有的电器? 他们想死了。 晚上的时候,把面包放进烤炉,执行一个good morning app。早上到时间了,闹钟会自动叫你起床,同时餐厅空调开始工作。当你确定起床后,面包就会自动开始烤,刷牙完毕正好出炉。出门的时候,所有设备都会自动关闭——整个房间里面没有任何一台中控设备了。晚上回家前,你的移动中控设备会通过3G自动唤醒灯光和空调。出门购物的时候,家里的冰箱会把缺什么东西传到你的手机上。 这才是人生阿。 睡觉前总是习惯要听点音乐,睡着后需要自动关闭么?装个app吧,亲。那个app不能连带关闭空调么?换这个app吧,亲。想要起床前空调就开始工作么?我们的app带定制功能,而且有默认配置模板提供修改哦,亲。Bill Gates在《未来之路》里面所幻想的美好未来,其实和我们只有一步之遥。 这一步问题在哪里?协议。 其实我们是可以做到的,这样美好的生活。问题是,我们缺少一个协议。 有专业公司,提供装修服务。他们可以对你的家里进行改造,部分安装他们的外接设备,部分改为专用电器,并且在iphone上安装专用软件,实际上可以部分做到我刚刚说的。 问题是,贵,而且不开放。 开放的好处在于,如果这个系统不支持晚上睡觉前关闭空调,我可以自己写一个替换掉。而且如果某个电器坏了,我不需要高价问他们买一个新的专用电器,而是直接可以在商场里面买一个。而专用电器支持的问题则是,我必须持续使用他们的设备和服务,他们也不能关门。 所以我才说,我们需要一个协议。

Jan 16, 2012 - 1 minute read - Comments

加密学中一个规定的来历

为什么密码学中总有个假定,算法是对方已知的,密钥是可以更改的? 因为在很久以前,密码算法是靠人工运算的,更改算法每次都需要培训一堆人,很麻烦。所以变态的需求催生了变态的解法——算法彻底公开,靠密钥保密。 还记得很多谍战片中的“密码本”么?如果在现代,那就只一个记载着256个字符的纸条。因为整个过程其实地球人都知道,双方只是相差一个纸条上的256个字符而已。 觉得这点东西不靠谱,随便记忆一下就搞定了?你想想,以前的密码本也可以照相阿。是重建一个密码本,并且分发给各处安全,还是重建一个纸条并分发方便? 现代?其实还是很有意义的。因为很多遗留系统/硬件模块中的算法会长达10多年不变,如果依靠算法保密来保护安全性,哪天泄露了不是开玩笑的。上千万的硬件模块,没有人维护的遗留系统,都要整死人的。 而且算法本身也必须足够强,如果没有公开算法,“足够强”这个事情本身就是含糊不清的。没有人见过你这个算法,没有人讨论,谁知道是不是“够”安全呢?md5以前一直作为哈希的标准,我们都觉得够安全了,但是哈希碰撞的研究使得现在基本都推荐sha256了。同样,DES也不要再用了,换成AES吧。