Shell's Home

python的字符串相加效率

Jan 18, 2012 - 1 minute read - Comments

今天文章被人纠了错,就跑去人家主页上逛。结果看到有篇文章说字符串相加速度的,看看结论很奇怪。就做了一下实验。原文可以看这里。我们只讨论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)

计算机自动化的方向

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吧。

昨天那个事情的后续——也谈网络安全

Jan 13, 2012 - 1 minute read - Comments

安全无小事阿,昨天批评到一半,发现遇到李鬼了。尴尬,赶紧修正文章,不知道影响多大。 我们事后推理,问题可能是这样的。有人故意在赶集网上用别人电话发布信息,然后等你的电话被打爆。赶集网本身只允许举报手机滥用,而不支持座机举报。所以你会找客服电话,但是他们客服电话又找不到。他们做一下SEO搜索,或者直接买关键词。你通过搜索,找到的就是他们。你要取消,他们就要你汇保证金。保证金进去了,然后你就被骗了。 当然,文章本身的批评也算是成立,常规发布电话信息应当是先确认再使用的,投诉的系统也应该支持座机等方式。由李鬼客服的存在,你可以想见到底有多少人试图投诉电话被错误使用,在系统中又无法删除。 但是我要说的是,这个诈骗差点成功的关键原因在于——赶集网没有公布自己的客服电话。由于没有官方公布,因此使用搜索引擎搜到的根本是李鬼。当然,如果打官司,赶集网肯定是无责任的。但是,被骚扰过的公司都知道,真的到了这个地步,你会很烦,非常烦。我相信对百度恨之入骨的不少公司应该都知道我的意思——明明不是我的事情,脏水泼头上,客户在骂娘。 我更进一步看了一下赶集网这个网站,安全么?也不安全。别的不说,登录系统还是使用http,而非https。两者差异非常大。使用http的,只要通过一个恶意的网关,就可以捕获到用户密码。作为玩玩而已的网站,我觉得使用http也就算了。作为一个商业公司,登录系统不使用https,实在是有点不专业。至于投诉电话也是一个例子。如果你打算联系新浪,打开网页,拉到最下方,直接就有400电话,根本不用担心这个问题。 各个网络教材反复告诉我们,安全不是一个技术问题。实际上,安全是一个从最高层到最下面的意识问题。作为安全的头一步,首先你要告诉你的用户——你应当信任什么。 如果你的公司是一家实体公司,以电话业务为主。那么你的宣传要点可能就是电话,而网站的具体网址可能就是通过短信方式进行分发(至少要有这个功能)。这方面的例子有携程。而如果是一家网络公司,以网络业务为主。那么你的宣传要点就是你的网址。为了安全,我建议稍微做大一点的时候,就干脆点,把常见的拼写错误全买下来,省的李鬼入侵。你的地址,联系电话,都通过网络分发,而且要让别人找的到。 上面一段简单点来说,就是,一个主要的宣传方式,上面发布所有的可信联系方式。为什么?如果你不发布,就可能有李鬼进来。到时候再处理,就非常困难。 盗梦空间里面说过,要确认你在真实的世界,而不是梦境中,并不容易。现实中,要确认和你说话的人的真实身份,也不容易。通常来说,如果你问我借钱,我要给你钱,你都能在对话里面发现我会问你一些有点奇怪的问题。frank应该心领神会,他问我借卡的时候,我可是在敲定事情后直接抄起手机给他打了个电话。通常来说,IM可以被偷,但是电话没有道理一起被偷。即使被偷了,还能伪装声音,那我也认栽了。我现在还欠着钱没还的小一,某位报社编辑,还有我帮忙充过卡的老燕子。如果你们看到这篇文章,应该也能回想起我给你们相关信息时问过一些奇怪的问题吧。 这些问题,叫做背景知识验证,我在前面的一篇文章中提到过。背景知识验证的基础是你们拥有相同的知识。而对于一个网站,你没办法使用这个办法的。所以,为了防止李鬼,你要反过来,使用无知假定。所谓无知假定,就是,在你面前的人充分证明自己之前,没人知道他是谁。也就是俗称的《互联网上没人知道你是一条狗》。所以作为客户来说,不要轻易相信搜到的联系方式,最好用114。当然,114上如果没有,那也没有什么太好的办法。 另外昨天和42区的同学谈了谈,他说会警告赶集的朋友。毕竟李鬼的存在对正品网站是一种伤害。但是从现在来看,只能采取防御策略。具体什么策略,就看赶集网的计划了。不过比较有意思的是,昨天我们谈到李鬼的时候,说到“互联网人士也无法分辨”,他给了我一个例子。在淘宝被诈骗5.46万始末。我看完吓了一跳。千鸟是小米的信息架构,算是IT圈子里面的人,不能算外行。在购物的时候,也是小心又谨慎。即使如此,还是被骗了!这只能说一点,即使是内行,也不要仗着自己专业就放松警惕。 我仔细看了一下流程,主要能找到的问题有以下几个。不过需要提前说明的是,这些都是马后炮。很多事情我们知道不应该,但是真的都有避免么?如同我某篇文章说的那样,就是彻底的神经质了。 1.在不可信环境中消费。这是一切问题的根源。本质上说,应当把环境分为“可信”和“不可信”,并且在几个信任等级间架防火墙。可信机器可以通过虚拟机产生一个不可信环境(沙盒),但是反之不可以。同密级机器可以弱密码或无密码互联。高密级机器可以无密钥连接低密级,反之不行。 2.没有在发生问题的第一瞬间进行止损。对于大额支付(对我而言,1000以上统统叫大额),网银一旦提示成功,而支付宝里面没看到钱。第一瞬间反应绝对不是再来一次,而是直接敲电话给网银,然后是支付宝。绝对不要试图在支付失败问题没搞明白的时候再试验一次,就算试,最多也只能试一毛钱。 但是归根结底,这件事情轮到谁头上基本都是中招的,因为要管理的问题太多了。 反思了一下自己,我打算在自己的环境中推进几个事情。 1.重新设定防火墙,关闭不需要的服务和开放设定。 2.重整U盾,假定他可复制,因此需要使用特殊的保密环境进行支付。 3.对环境中的几台不可信机器进行行为监控。 4.定期读日志,尤其是异常报告。 5.关掉“仅使用手机动态密码支付”的选项。 PS.这篇文章不代表我支持网络实名制,但是我觉得应当让自己想实名制的人实名制。

越想避开2B事,事情就越找上门——一个朋友的隐私泄漏问题

Jan 12, 2012 - 1 minute read - Comments

首先向赶集网道个歉,核实下来居然是李鬼,主题还真没写错。下文根据事实情况做了修正,看过原文的可以对比看看。 今天一个朋友中午给我打电话求助,问我能不能在网络上把一个信息给删了。我顿时一惊——你被陈老师了?还是有人曝光你们家怎么怎么,所以花钱删帖? 结果都不是的,她家里电话被登在了赶集网的某个页面上,还置顶了。一个中原地产的人发布房屋消息时,用的是她的座机。 我顺手查了查,赶集网有删除错误信息的选项阿。 ——你自己用用试试看? 我输入号码,我去阿,居然是js验证,要求号码必须是手机。仔细看看,是输入手机后发送验证码,输入验证码删除。 有点道理,可是我朋友家里是座机,咋办? 她找了找赶集的客服,但是没找到客服电话。搜索了一下网络上,有个人表示是赶集网的客服部,他说对方是付费用户,自己选择的置顶,她们无法删除。要么,交1000押金,立刻删除。对方三天内没提出意见,押金退还。 这个事情就很搞笑了,我自己的信息,要付费才能删除?传说中的百度产品经理去了赶集网么? 我说,你要么找发布者看看? 她说我找了,对方是中原地产的,说话很不客气。说这个事情我们检查一下,如果有问题,我们会处理的。她怀疑是对方在故意整她,不过这个事情目前没有任何证据的。 然后她只能等着,期间电话还是一个接一个的进。她家里也是开公司的,电话不能不接,也没法做垃圾过滤。 逼急了,她准备去报警,还不知道警察受理不受理。 42qu的某同学找我,说他认识一个赶集的人。他准备和对方沟通一下,看看能不能删除。先谢谢该同学。 过了中午,赶集的产品给了我一个消息。只要打给客服,客服会要求你提供电话。然后他们会回拨你一下,你接,就可以认证身份,然后对方就会删除信息。 我联系了朋友,她顿时觉得——怎么和上一个说的一点都不一样阿。 我和42qu的同学联系了一下,要了一下他们的客服电话(我们都找不到客服电话,他们的产品只有打过去要)。然后我朋友打过去,很快,问题解决了。 OK,大家现在应该猜到了,上午我们碰到了李鬼,也不知道我朋友是不是用百度搜索的。 如果真的打钱过去,就完蛋了。 先不说登录信息人的问题,我首先说赶集网的策略。 对于没有验证过的个人信息,采取“首先使用”的策略合理么?如果我找个虚假信息登记一下,成为用户,然后付费置顶,再录入某人或者某公司座机为火车票预定电话。那他们的电话不是瘫痪了? 其次,对于问题的反应,赶集网并不是很上心。网站的快速删除根本没有考虑座机如何操作,只考虑了手机。普通投诉在24个小时内也没有响应。而且没有明确的提供客服电话——至少两个程序员没有找到。如果赶集网本身提供了客服电话,或者快速响应了人工投诉,那么也没有后文的问题。问题是赶集网本身对客服并不是很热心。也许这是因为他们需要压缩客服成本。 最后,归结到根本上,赶集网对于有可能侵犯客户隐私的事情,有什么成本呢? 我怀疑没有成本。 我朋友如果去报警,最大可能是警方只提供记录,但是不处理。要解决,可以,自己起诉赶集网去。首先去公证处取证,一个页面3000(这还是07年的价格),然后去侵权所在地。赶集网的总部在北京,中关村软件园八号楼,所以要在北京市海淀区法院进行起诉。然而起诉前不能排除调解,因此可能还要过一遍调解过程。如果调解无效,那么开始起诉过程。如果对方不服,还有上诉。我不说隐私泄漏的结果如何计算,仅仅是这个时间和成本,就远远不是一般人能接受的。 因此赶集网实际上是没有风险的,因为很少有人会去执行。既然没有风险,那么自然也就没有动力考虑,如果被错误使用的不是手机如何,如果被错误使用的是地址如何,如何规避不慎泄漏了对方信息造成的风险——反正也没风险么。 在这里我批判的不是赶集网这个网站本身,作为一个公司,天大地大赚钱最大,你不能说这个是错的。那么和赚钱无关的事情不优先考虑,同样,也不能说是错的。我固然欣赏谷歌“不做恶”的信条,但是同样深知,你不能指望每个公司都信奉这点。 然而,难道说用户信息泄漏就是对的么?我们的电话被登录在网站上,被打爆,关键电话接不到,导致经济上的损失,或者其他一些事情,难道这就是对的么? 你必须让泄漏用户隐私变成公司的成本,而且是很大的成本,公司才会去关注这个问题。这点不仅对赶集如此,对百度如此,对人大代表如此,对你我也是如此。 你是否有把自己的手机写在人人和开心的页面上? 有写的话,就不要在接到垃圾短信的时候光抱怨各个公司泄漏你的个人消息。 你是否也有侵犯别人隐私的时候呢?例如你问,结婚了没?工资多少?在哪里上班?父母还在不在? 这些难道就不是隐私了么? 你见到没信用的公司的时候,是否还会用他们的产品呢?例如三鹿。虽然现在他被并购了,但是并购前,你还会喝他的牛奶么?如果不会,你看到侵犯隐私的公司,你会不会和他们提出意见呢?会不会用他们的产品呢?还是笑笑当作没事一样? 我知道这个社会一向不大把隐私当回事的。大到公司能大喇喇的把别人的家庭电话具体住址贴出来。小到我们每个人每天都在问别人的薪水。远到网络实名制的时候有人说,要么我们全填方老师的信息好了,并且把方老师的信息全公布出来。近到你看着看着这篇文章,突然手机响了,打开一看——又是垃圾短信。 我们每天都在被别人侵犯隐私,也在侵犯别人的隐私。我相信,即使在隐私保护比较好的国家,类似的问题也是层出不穷。问题是,我们多关注,多做一些事情,也许我们的情况就能好转点。虽然听起来没有联系,但是你少问别人工资,看到垃圾短信多举报(前提是这个机制要有用),看到网站对隐私保护不利要多投诉,也许在几千次的尝试后,你自己,或者你的后代,就能拥有更好的生活。 当然,如果你也不关心这个问题,那请当我没说。 最后,赶集网的客服电话是:010-59013666。特此公布以正视听。如果你发现有问题,可以在关于那里找到我的联系方式,我会尽快响应。

最牛电商

Jan 11, 2012 - 1 minute read - Comments

昨天聊天,聊到最牛电商的问题,大家都笑了。 frank订票45分钟花了45分钟,还没搞定。先是从chrome换到IE,因为前面的部分chrome能用,付款不行。然后从工商付款,上限500,不行,必须一次付款800,而且不能用支付宝。问我借卡,我的也不行。最后借到卡了,结果过45分钟了,重排,没票了。 淘宝买东西要是需要超过5分钟,喵喵就会少买好多东西。 还有个朋友说,他的卡能支付5000,买票,扣款后没票。人家说钱能拿回来的——钱能回来可是票回不来阿。好,再买,又扣钱没票。再买——没钱了。 我去阿,这TMD不是坑爹么? 这种网站,转化率还是100%,广告成本0,绝对最牛电商阿——没有之一。 关于顶不住这个问题呢,大家都懂的。我自己也做过类似的事情——甲方设法让自己的厂家中标,也不管人家有没有能力做。厂家领导是先中标再说,不中标自己就完蛋了。下面的人没能力,要么是不知道自己没能力,要么是知道也不敢说。做着做着问题一堆,也不敢和甲方沟通。不沟通问题就越来越多,交货的时候一看,甲方吐血。然后厂家领导就和甲方领导搞协调,厂家要去修一些问题的,甲方延一点时间,最终还是会让这个系统上去的——否则领导也麻烦阿。 最后只要这个烂摊子不被揭出来,大家皆大欢喜。中国政府领域的IT,大多都是这个样子。 比较大的烂摊子揭出来的,一个是绿坝。没办法,太烂了,还要所有机器供应商都来做支持。索尼干脆发了个文,这是中国政府让我们装的,出了问题不要找索尼,谢谢。结果这样还被告上美国法庭了。最后领导实在顶不住压力,撤了。另一个就是这个,最牛电商,估计回头也会撤的。因为后面订票压力越来越大,搞事情的人也越来越多,烂摊子搞到后来领导也会怕的。 其实昨天gary说了一句比较实在的话,这个系统不应该做成这个样子的。一切说中国买票的人太多,瞬间交易压力大,刷不出票的人持续刷的,都是借口。知道压力大,搞分时销售和抽签制分散压力。前端做负载均衡和CDN负担压力,后端真到订票的时候转换成MQ去操作。大型机再怎么做的差,每秒1000个transactions是出的来的。一小时就能完成360W的交易,一天八小时,3000W的票就出来了。中国有多少人需要订票的?3亿?就算做瞬时压力,铁道部车票成交比纽约股市买卖还快,要求还高?技术做不到根本是扯淡,最多是钱的问题——现在还是花钱没解决问题。 为了见证奇葩,我特地上去看了一下,结果第一眼就晕倒了——铁道部需要你自行下载根证书。我去阿,堂堂铁道部,一个多少万的项目,连TM买一张证书的钱都没有?! 其他细节就不多写了,相信用过的人比我都清楚的多。需要多次点击才能买到一张票,访问过程长导致压力大。定时开票,时间集中导致压力大。需要注册,导致注册过程冗长,也是增加压力。这些都不是技术问题。 整个过程中耗时最长的(抱歉我懒得注册,只去看了余票查询),一个是http://dynamic.12306.cn/TrainQuery/leftTicketByStation.jsp。这个的服务器响应表明是来自Apache-Coyote/1.1,由squid/3.1.18缓存,未命中。另一个是http://dynamic.12306.cn/TrainQuery/passCodeAction.do?rand=rrand。这个的服务器响应表明来自Apache-Coyote/1.1,是一张image(验证码),同样未命中。基本squid命中的都在ms级别返回了,出问题的都是dynamic.12306.cn这个域名没有命中的页面。这个表明前端的缓存还行,压力都压到了后端。至于造成这个现象的原因是前端缓存策略错误,还是后端性能相对不足,就不知道了。 我注意到,至少有一个页面https://dynamic.12306.cn/otsweb/css/contact.css。Server字符串是asfep/2.3.0 svn:3075。asfep是什么我不知道,google了一下也没出来。不过svn?这文件是从svn服务器上出来的么?!如果是,这就有点奇葩的味道了。 然后我点了一下查询,这下大奇葩出现了。一个query居然执行了30s以上。在验证码故意输错的情况下,返回速度在10s这个量级,而输入正确就天长地久了。由此可见系统是分成多个部分的,最外面是dynamic.12306.cn和12306.cn两个域名,上面用squid做了缓存。后面是一堆应用服务器。其中有一些Coyote服务器的响应特别慢,大概在1-10s这个量级。而这些服务器当访问数据库的时候,就彻底变成访问无望了。按照网络上说法,铁道部用的是Oracle数据库,估计已经半瘫痪了。 说是Coyote,其实如果没什么意外,这个就是Tomcat。那么铁道部的架构底子基本也就出来了,是J2EE的架构。估计是一帮ERP工程师照猫画虎做出来的。J2EE不是不能用来做电子商务,有些网站还做的很成功。但是不做任何优化,直接就敢拿J2EE做ERP的架构去做大规模电商的,这就是找死了。尤其是某些ERP严重依赖于Oracle,业务逻辑根本就是用Oralce写的,用J2EE封装了一个壳子。这种就更麻烦。 目前还不能确定铁道部订票网站到底是什么情况,不过可以确定的是,这个网站的状态在未来几天内还会继续恶化。搞不好到一定程度就直接没法用,或者被铁道部直接关闭网站一段时间了,需要订票的同学最好尽早想办法。

两天的生活

Jan 11, 2012 - 1 minute read - Comments

我刚刚看了酷壳上的一篇文,讲的是女程序员的故事。然后我准备说个无关的故事——数一数我两个典型的日子,2012年的1.3和1.4。这两天,一天是休假最后一天,一天是工作第一天,又刚刚过去,所以我还记得。听上去没什么关系,你听完就知道联系了。 1.3日 8:30 早上8点半就醒了,工作时间醒习惯了,睡不着了。起来洗脸刷牙开机煮饭——是的,老婆暂时回娘家,我要自己烧饭。(吐槽一下,程序猿婚后还是得学做饭)半个多小时后,大概吃喝完毕,开始处理邮件。 9:00 从九点到十一点,处理了所有的邮件,回了blog上的评论,顺便把整个广西游玩过程写成blog,大概4500-5000字。 11:00 从网络上买点东西,然后继续做饭——水饺。 12:00 吃完东西,开始研究hash冲突漏洞,大概研究到下午三点。收集了一下相关的问题,大致读了一下paper,包括squid上可能出现的情况什么的。把基本问题写了个blog。 15:00 给老婆发个消息,看看醒了没,给老妈发个消息报平安,收拾一下家里,大概花了半小时。给外婆打个电话说晚上去吃饭。然后开始健身。三组动作重复四次,总共半个小时。 16:00 去京东和淘宝上买点东西,看到有音箱,想起来家里的播音系统和视频系统还没有搞定。于是开始研究linux下的视频系统。 15:30 外婆打过来问什么时候去吃饭,出门去吃晚饭。 20:00 晚饭回来,装吃的,做家务。 20:30 看了一下,又是一堆邮件和评论,继续处理评论。 21:00 hash冲突需看一下python源码,然后写一个程序验证一下,发现maillist里面的过程有点问题。发个邮件过去确认一下,然后接着看了一下相关部分的python源码,三个版本。 23:00 看会动漫,然后洗澡。顺便说一下,最近在跟《便当》。 00:00 确定似乎要看一下论文,翻了一下论文,大概搞明白了什么意思。不过差不多一点了,该上床了。 1:00 在床上玩手机,安装一下各种程序,看点动漫,遂觉。 共计如下:写游玩过程的blog和整理相片两小时,研究技术和写程序六个半小时。 1.4日 8:10 开始起床 8:20 努力起床 8:30 起床(没老婆的日子里,闹钟要提早20分钟,不然会迟到),洗脸刷牙做早饭吃饭上班,路上听两首歌,处理一下私人邮件。 9:30 到公司,开始处理各种邮件,开始解决bug #600。 10:00 bug #600验证出了问题,等待测试验证,开始写cmdb项目的映射部分代码。 11:00 hash那里想到一点问题,写个代码验证一下。 11:30 吃饭了,hash那个问题可以走通,不继续写了。 13:30 午觉醒来,开始继续cmdb的代码。 14:00 测试验证出了bug #600的情况,开始修正问题,并出补丁。 14:30 开始写年终总结报告 15:00 继续cmdb的映射代码 16:00 健身一下,处理一下自己的邮件 16:30 从淘宝和京东上买了点东西 17:00继续cmdb的映射代码处理 18:00 本来应该去健身的,没带衣服,算了,吃了饭回家自己健身去 19:00 开始做家务 20:00 开始研究mp3文件格式 22:00 健身,WTF 23:00 洗澡看动漫咯

广西游记下

Jan 9, 2012 - 1 minute read - Comments

阳朔 我们前后两次路过桂林——先从南宁坐过夜火车到桂林,吃过一碗桂林米粉马上上船去阳朔。桂林米粉就是普通的煮米粉,然后自己加上各种配料。当地人是干拌,吃完加点汤。我们吃就是加汤吃,味道很鲜,但是没有老友粉那么特色。我怀疑外面卖的桂林米粉多是因为这东西比较容易操作。作为师傅,只要配料和汤料准备完,剩下的就是小碗煮米粉而已。人多的时候也可以很快操作。老友粉和螺蛳粉就没那么快的操作速度了。 从桂林到阳朔的船是旅行的重点。上船先买票,到了船上还可以包包厢。我建议——最好是多人去,直接包一间包厢,6人间600,送一套午餐。这样既不吵,而且中午吃的也会比较好一点。我们看过他们的普通午餐,根本就是白煮白菜加上米饭!上层的风景非常好,可惜我们去的不是时候,漓江正好处于枯水季。不是上游水库放行部分水流的话,我们今天的船根本一步都开不出去。而且当天略有阴雨,看漓江风光的时候朦朦胧胧。往好了说是别有风味,往糟糕了说就是白干一场。不过这次有几处,江面上开阔大气,两旁山水气势磅礴,船头上又没有什么人,感觉这几处还是值得的。 阳朔据说是最早的旅游酒吧聚集地,资本主义的桥头堡——比丽江早多了。我们看了看,不算大,只有三条街的大小。看看点评,里面最热门的是“谢大姐啤酒鱼”,出门发现谢三姐啤酒鱼,后面什么刘大姐张大姐全都站出来了,李鬼不但比李逵还多,而且多多了。我们找正宗店家找了半天,吃完还没法肯定自己吃的是正宗的。不过东西不错,啤酒鱼中午也有吃,是用啤酒来烧鱼,而不是清水。鱼的味道很赞,和中午效果完全不同——中午连鱼鳞都没有去干净。 我们吃东西的要点是——找一家,少点点,好吃再加,不好吃付钱去别处。因此啤酒鱼垫个肚子,我们又去了点评上的第二家——黄记玉米汁。讲到这里,感觉这趟游玩纯粹变成吃喝之旅了,没办法,两个吃货出门,还能指望点啥呢? 玉米汁不错,据说浦东也有分店,就在八佰伴旁边。好像是用煮过的玉米,用豆浆机打碎,滤过其中的植物纤维,只剩下植物蛋白的粘稠溶液。店里的特色是准备了很多便利贴,让客人自己写各种东西贴在墙壁上作为装饰。我们去的时候,墙壁上已经贴了一层又一层的便利贴了。 黄姚 黄姚不大不小也算是个旅游城市,不过名气上远没有阳朔和丽江那么响亮。猫咪不知道怎么把这个地方挖出来的,绝对赞,强烈推荐。我们去的时候还算是淡季,街道上的人不多不少。看着热闹,又不会拥挤。据说每到逢年过节,春秋风光明媚的时候,镇子上的民宿和镇口的旅馆全部爆满——镇口有一家四星级旅馆。由此可见这地方值得一去。 黄姚古镇是一个很小的镇子,离桂林大概3小时的车程。镇上水土很好,旅游业小有规模,又没有像阳朔和桂林那么夸张,感觉进去好像进了义乌一样。当地的小巷子还是很原生态的,大概有一半不到改成了商店和民宿,另一半还是普通民居。巷子四通八达,山水相连风光秀丽。据说有不少电视剧都是在此取景,因此墙上有很多民国年代的招贴画,像是回到那个年代一样。镇子上特产豆腐和豆豉(都是豆制品哈),尤其是其中一家的姜糖水豆腐花,超级赞。豆腐白花花,入口即化,姜糖味道很明显。一碗两元,一定要吃。 镇子白天进去是收门票的,晚上就不收钱了,随便进。住民居,吃农家饭,都随意。这里的农家饭真的是农家,我们在前厅吃饭,一墙之隔就传来小孩的哭声和笑声,门外还有只黄狗,每次有人经过,就汪汪的叫起来。我们吃的鸡是自己挑的,走地鸡——不走也不行啊,这里根本没有专门的养鸡器具,晚上都是关在一个小笼子里面。笼子顶上还有个洞,居然有一只鸡从里面跳了出来。行,公鸡中的战斗机,就是它了。 先上的是一道扣肉,用芋艿和五花肉烧的。热的时候很香,冷一点就不好吃了。然后是枸杞梗烧鸡杂鸡血什么的,用枸杞梗烧汤是这里的常态,我们两顿都吃到了这样的汤。鸡肉果然鲜美好吃,我们基本干光——剩下的骨头就喂了前面的阿黄。他倒是很挑剔,好吃的吃,不好吃的就不吃了。一点不像我们后来碰到的一只在路上的狗,给什么吃什么。 桂林 桂林基本就乏善可陈了,我们只在桂林停留了半天,而且还没吃到什么好东西。 中午的老字号米粉怀疑是李鬼店,汤头不鲜,而且免费的料太辣。辣不要紧,关键是一点都看不出,而且吃下去过一会才辣起来。我们一行人全都跑出来买水喝,喵舌头还吐个不停——我说这家原来是做辣酱出身的吧。下午去了象鼻山——既然来了,总不能不去吧。象鼻山现在在枯水季,所以不算很好看。然后我们到正阳路步行街逛了一下,回来吃了一碗螺蛳粉。螺蛳粉其实里面没有螺蛳,是用螺蛳肉煮汤,然后放酱料做的。感觉和老友粉非常类似,只是不放酸笋,略有差异。如果去柳州,记得吃上一碗,看看差异。 OK,广西之行基本就是这个样子,如果你也要去,不妨参考一下。另外补充两个值得去的地方,七星山和龙脊梯田。这次我们时间有限,未能成行,非常遗憾。

广西游记上

Jan 5, 2012 - 1 minute read - Comments

说是游记,大概会写成一笔流水帐吧。我写东西大多数情况下,信息多于修饰,一贯如此。 北海 头天飞的北海,天气不错,气候宜人,下了飞机我就脱掉了棉裤棉衣。北海位于广西最南端,几乎是中国大陆最南方的城市,规模并不大,冬暖夏凉气候宜人。我们住在侨湾那里,听当地人说,是当年东南亚排华的时候,从国外逃回的华侨,当地政府在这里安置,形成的村落。所以当地居民很多会说越南语,而且很多东西上标注的都是泰文或者越南文。这里离著名的北海银滩并不很远,打车15就到。 银滩其实没有想象中的好,主要是因为现在是冬季,海水虽然不刺骨,但却不能游泳,因此来的人几乎没有。据当地居民说,这里在旺季的时候,几乎全是人,完全无法游泳。银滩的海浪冬夏不尽相同,不便评价。但是她的沙滩非常好,沙子洁白细腻,踩上去一点都不痛,粘在脚上拂拭不去,干了还是薄薄一层。不仅远离海岸的地方如此,而且海岸边上的沙子也如此,明显是冲积形成的。厦门的白城更加商业化一些,一年四季都有人,卖小吃的,栈道上观景的,冲淡的,始终不断,但是沙子是个先天劣势。厦门远离海岸的沙子是细沙,但是岸边的就是粗砂,踩上去如同足底按摩一般,明显后面的沙子是运过来的。但是银滩在淡季的时候,冲淡的,卖东西的,基本都没有人经营,明显只做一个季度的生意。 我们去了南珠宫买了点珍珠,这里的珍珠非常好,属于当地特产。珍珠的常识是,海珠比淡水珠好。但是海珠更加圆滑透亮,不适合做胸针什么的,大部分都是项链手链。珍珠项链又不适合每个人,所以要不要买,见仁见智。我们买的是淡水珍珠胸针,也不算贵,就是买着玩玩而已。猫咪倒是对这里的甘蔗汁更加感兴趣,喝过一次后念念不忘,吵着要喝。这里的甘蔗是青皮甘蔗,现场压榨。汁液鲜甜,在上海可是很难喝到哦,来的不妨买一杯尝尝。 侨湾那里也有个海滩,和银滩差不多,只是名气没那么响。我们在旁边饭店吃的晚饭,贵死了!!!不过饭店外的风景甚好,我还抓了好几张不错的夕阳,算是心理平和点。 从北海坐火车到南宁只需要三个小时不到,不过一天只有两班火车。与此相对的,火车站修的广大气派,不知道是干什么用的。照我说不妨学学杭州的火车站,把上面的部分改建成商业建筑,还能充分利用。列车上一点让人不爽的地方就是,上去后一趟火车3个小时,推销东西的有四批。一个卖毛巾的,一个卖鞋油的,一个卖牙刷牙膏的,一个卖速算书的。从头卖到底,五分钟清静都没有,猫咪想睡觉都睡不着,铁道部最近穷疯了还是怎么? 火车上我们对面的一对老头老太是北京人,石油部的,退休了到处玩。老爷子心脏有问题,所以在气闷的火车上非常不舒服。问老太太为啥年纪这么大了还到处跑,老太太说,老爷子心脏不好,装了支架,闷在家里不痛快。出来和老朋友见个面,顺便在北海休养休养。北海气候宜人东西便宜,他们住了一个月了。说着呢,老爷子散步好久没回来,我跑去厕所敲了半天门,没开。刚说要不要找列车员开门,老爷子回来了。他去后面车厢上了个厕所,顺便透透气。没事我就准备回去和老太说一声,老爷子继续往前走。过一会,老爷子从前面绕回来了——他原本倒是想回座位,可是找不着座位在哪了。我们的火车上下两层,他光在上面找,是找不到。我碰到了他,以为想继续散步,也没拉他回来。 南宁 我们只在南宁呆了半天,但是对南宁的夜市印象非常深刻。除掉下午去了一趟广西博物馆,剩下的时间就是吃吃喝喝。先是打油茶,狗肉(都是好东西啊),后来还有一个艾粑粑。打油茶是当地特产,用糯米脂肪和茶打出来的一种饮料,具体可以自己百度。我喝喝感觉口味一般,味道不算好也不算糟。艾粑粑是用艾草汁做的一种糯米食品,大概就是没有馅的艾草青团拍扁。不过这年头还有哪里有正宗艾草青团? 夜市里面吃到的各种奇奇怪怪的东西就多了去了,我甚至在里面看到了整只的鳄鱼和鲨鱼。我们首先吃的烧烤,旁的不用细说,里面最特殊的就是猪鞭,平时烧烤这东西可没有当成鸡翅一样在卖吧。然后还有南宁特色,老友粉。广西这里偏爱米粉,而且各地做法不同。到桂林要吃桂林米粉,到柳州要吃螺蛳粉,到南宁就要吃老友粉了。这个是用酸笋和各种料来烧的米粉,味道酸酸馊馊,据说很多人吃不惯。我吃吃很好吃啊,和北京的豆汁完全不是一个概念。 后面有一碗牛杂汤,是用各种牛的下水熬的汤。猫咪不吃内脏,所以让我来吃。我貌似吃到的是牛肺,也好,润肺通气。然后,今日重点登场——王老吉。我们是在一个糖水铺里面看到王老吉的,当地朋友立刻就一脸暧昧的笑容。我们点上各种糖水,然后点了一杯王老吉来品尝。我第一个下手,一口下去——我去啊,这玩意苦的厉害。不过还好,当年我也是喝了好几年中药的,脸上神色不变,点点头,恩,这玩意有点苦。还记得那个笑话么?三个傻瓜摸烧红的秤砣是什么味道的——傻喵马上说,是么是么?多苦啊,我尝尝。恩,很好很好,马上看到某只喵像被掐住喉咙一样的扑腾——我趁机喝掉她的糖水,缓解一下嘴巴里的味道。 后面一帮不信的人,前仆后继的相继中招。这玩意的味道不但苦,而且从喉咙里面不断散发出来,根本不是喝口糖水就能压掉的。这是当地正宗凉茶,可不是外面卖的王老吉那种水货。当地朋友是感冒,当作药喝的。我们几个就傻傻(好吧,里面也许有一点点我的因素)的分别中招。 最后一个吃的是南宁的小馄饨,这个很赞。里面放的丸子是牛肉丸,打的很彻底,很Q很有弹性。馄饨包法很特殊,是用皮子卷出来的,馅料粉红色,煮开后有嚼劲。就是吃的时候有点苦——这个绝对是王老吉惹的祸。总体来说,南宁之旅还是留下了很深刻的印象的——东西好吃!!!

哈希冲突漏洞的原理和对策

Jan 4, 2012 - 1 minute read - Comments

cpug上面最近在讨论一个严重级漏洞,漏洞的相关资料如下: ERT-VN:VU#903934 CVE-2011-4815 CVE-2011-3414 CVE-2011-4838 CVE-2011-4885 上面主要讨论的是这么一个概念,当用户post一个数据,而且这个数据又是一个form的时候,应用需要先将form解析为dict,然后才能方便的使用。例如a=1&b=2,可以解析为{'a':'1', 'b':'2'}。之所以1和2是字符串,是因为只有用户自己才清楚这个数据的类型。 通常情况下,这个form的key都是随机的,生成的hash碰撞概率很低,因此dict的默认实现——hash table没什么问题。但是当攻击者恶意构造数据的时候,情况就完全不同。我们首先讨论一下hash table的实现——开链法和二次探测法。 所谓开链,就是指对所有同余hash,将他们挂到一个hash表项上,形成一个链表。而所谓二次探测,就是在第一次hash冲突后,再进行一次hash,作为第二地址。 开链法对碰撞冲突是有先天缺陷的,因为同余碰撞的构造远比hash碰撞的构造简单。假定hash table有11个表项,那么平均11次尝试就可以得到一个元素,和原始元素hash同余。如果选用这样的恶意key序列,在执行构造的时候,hash table就退化为了链表。链表的插入复杂度是O(n\^2)级的。而作为攻击者,为了获得n个hash同余对象,所需消耗的复杂度做如下估量。首先考虑hash table length和n同阶,因此以n作为hash table长度。这样每n次尝试就可以获得一个恶意元素,获得n个元素的复杂度为O(n\^2)级。 也就是说,即使是sha256这样强的hash算法,只要保证哈希函数特性,对同样的值得到同样的哈希,就无法保证开链法的安全。 而二次探测法对这个是有先天抵抗的,二次探测法的第一次碰撞并不难构造,但是第二次哈希后依然保持同余的构造难度就由n增加到了n\^2,多次碰撞的构造难度以此类推。虽然我没有完整的计算过这个值,但是猜测难度量级应当是O(n*n\^n)级别的。这个级别基本就不用玩了——前提是哈希算法必须是安全的。 由于为了节约计算过程,因此python和php的hash算法都没有采用md5之类的高散列算法,而是一个很简单的算法。我摘抄一下Python2.7.2中的这段代码。python_string_hash.c static long string_hash(PyStringObject *a) { register Py_ssize_t len; register unsigned char *p; register long x; if (a->ob_shash != -1) return a->ob_shash; len = Py_SIZE(a); p = (unsigned char *) a->ob_sval; x = *p << 7; while (--len >= 0) x = (1000003*x) ^ *p++; x ^= Py_SIZE(a); if (x