Shell's Home

一个有趣的问题

Feb 25, 2016 - 1 minute read - Comments

前面给公司出了一个有趣的问题,似乎没采用。所以现在放出来大家看着玩玩。 以下代码在python2中适用。python3请看尾部注释。 import os, time data = range(10000000) pid = os.fork() if pid < 0: print 'error:', pid os.exit(pid) if pid > 0: os.wait() os.exit(0) sum(data) 在第2行执行的前后,使用ps和free观察内存使用情况,可以看到进程使用了320M内存,系统被占用了320M内存。在3行执行后再观察,有两个进程分别占用320M内存,系统总计被占用了320M内存。 问1,为什么两个进程分别占用320M左右内存,系统总计占用数并没有翻倍?这种现象叫做什么? 在10行执行后再观察,有两个进程分别占用320M内存,系统总计被占用了560M内存。 问2,为什么sum增加了系统内存占用,解释其开销。 问3,推测出python整数对象长度和当前CPU字长。(python自身的内存开销忽略) 答1. 这种现象叫做COW,copy on write。在fork后,两个进程会共享内存表项,一致的部分会仅使用一个页面。 答2. 每个进程的内存占用都没有上升,但总内存占用量上升了,这必然是发生了页面写时复制的结果。页面写时复制必须写入内存,因此推测python使用引用计数 手段控制对象生命周期。当sum时,每个对象都要被读取。在读取前,系统会增加其引用计数。在这个过程中会发生页面写时复制,导致系统内存占用上升。 注:内存复制必须发生在写时刻,说读取导致内存复制的统统不得分。答出引用计数四个字即可得全分。 答3. 在写时复制时,数字对象会增加引用计数,而数组对象不会(准确的说,数组对象本身引用计数会增加,但只有一页会发生复制)。发生复制增加的内存有 240M,因此整数对象长度24字节。未倍增内存有80M。对象有10M个。因此推断指针长度为8字节,当前CPU字长64位。 注:python3里有几个不同。首先,range返回了一个生成器,所以需要改为data = list(range(10000000))。其次,python3中,int长度为28,pointer长度为9。因此下面的数据会需要调整,而且并不很容易解释。

一次升级故障的排查

Feb 19, 2016 - 1 minute read - Comments

问题描述 前两天,我收到了 USN-2900-1 通知,glibc上有个严重漏洞,可导致DoS或(可能性的)执行任意代码。这个USN对应的CVE是CVE-2015-7547,我相信很多人应该听说过这个漏洞,或者应该已经修复了。我也不例外,很快的推进修复了这个漏洞。收到消息6-7小时后,已经看到了 POC 。 OK,我们本次不是讨论这个漏洞本身的。在漏洞修复后,有一台设备报错,无法安装程序,wget都无法执行。很有可能是漏洞修补补丁导致的。由于这个机器很关键,目前很难迁移,所以我需要找到原因。另一方面说,如果无法明确原因,已经执行补丁的机器群将无法确定可靠性。因此无论如何,必须要研究一下原因。 出问题的机器是一台ubuntu12.04,修补的版本号为2.15-0ubuntu10.13。 处理过程 首先,CVE的说明表明这个漏洞来自于getaddrinfo调用。因此首先确定问题和这个调用的关系。使用python,import socket,然后执行任意一个socket.getaddrinfo。python崩溃了。这就说明问题很可能来自本次修补。当然,同时的测试中表明wget也会崩溃,但是dig没事。所以dig很可能并没有产生getaddrinfo调用。 而后,我使用strace和tcpdump追踪了一下程序。tcpdump表明一切正常,并没有人*正在*攻击系统,因而可以排除修补不妥当加正在被攻击导致的崩溃。strace中断在ioctl调用后,除了进一步明确当时正在进行DNS查询外,并没有给出太多有效的信息。 常规来说,下一步应该是gdb。但是由于apt无法执行,所以gdb装不上去。因此我跳过gdb,先翻了一下USN-2900-1补丁的细节。这个补丁里包含了所有ubuntu自己打上去的补丁,因而有点大。但是仔细看之后可以分离出CVE-2015-7547补丁的位置:debian/patches/any/CVE-2015-7547.diff(还有pre1和pre2)。仔细阅读修补代码,尽管对逻辑并非十分清楚,但是并没有看到什么奇怪的错误。结合剩下的机器并没有问题,我基本认为这个补丁是没问题的。 后面很幸运的,向才发现虽然apt-get update不行,但是apt-get install却没问题。不知什么原因,总之我们有了一个能用的gdb系统。通过gdb,我确定了出问题的代码行号。我本来想省点事,从补丁上直接读出出问题的行(eglibc-2.15/resolv/res_send.c:1303)。但是很遗憾,出问题的行本身似乎没有什么问题。(*ansp2_malloced=1;)虽然可以看出是ansp2_malloced跑飞导致了SEGFAULT,但是并没有提示为什么。所以还是得需要完整的源码。 然后就是debian包维护的基本功夫。首先用apt-get source libc6下载源码。再用dpkg-source -x解开文件。进入目录里,用quilt push -a应用全部补丁(细节看 这里)。这样就得到了和线上一致的完整源码。我本来想将整个过程在目标机上完成,但是目标机上却无法安装quilt(根本找不到这个包,由于apt-get update无法执行,我也无法修正这个问题)。所以最后源码的补丁是在我本地的workstation完成的。 无论如何,我按照gdb的bt输出,仔细核对了出问题的代码。问题确实是出在了ansp2_malloced,这个值为0。但是这个值是逐层传递的参数,传递的最后几行表明这个值都是0,而在前面,这个值是有有效值的。可是吊诡的是,在有效变为无效的过程中,指针并没有修改过。 这个值是在__libc_res_nsearch(resolv/res_query.c:331)里发生变化的。在这个函数里,这个指针叫做answerp2_malloced。根据gdb的bt,在函数入口上,这个数值不为0。但是到了第421行,调用__libc_res_nquerydomain的时候,就变为了0。而从函数入口开始按照顺序搜索answerp2_malloced,都是对指针的值的修改,并没有对指针本身修改。函数也是传递指针,而不是双重指针。也就是说,answerp2_malloced在一个并不可能改变的代码段中被改变了。 读到这里的朋友,有兴趣的话可以先不要往下看,先猜猜原因。这个神秘的现象直到我看到结果,才反推出来为什么。 原因 我在这里被卡了很久。后来在无聊中,往下看了一下bt。留心到其中某个函数并没有调试信息,因为这个函数所在的so文件位置不对。仔细一看,这是一个glibc的库,但是却在/usr/local/lib下面。 我X。是哪个孙子把系统库的部分拷贝到了其他位置,还改变了LD路径。。。拿一个版本的glibc和另一个版本的glibc库混用,不出问题才见鬼咧。把这个so文件改名后,问题立刻解决。 复盘 事后根据复盘。这个参数其实是为了修补问题,新加的。原本__libc_res_nquerydomain函数并没有这个参数。然后为啥能跑?这涉及到linux下C的入栈顺序。这里不讲细节,如果你有兴趣,先看这个。再往下看复盘。 根据调用规则,调用者首先会对现场压栈。他会将需要保留的寄存器入栈,以防子程序改变他们。然后他会根据C规则或pascal规则入栈参数。最后call指令会将当前IP入栈,并且转跳到指定地址上。以这里的情况看,应该是默认的C规则。 C规则的好处在于被调用者获得的是栈顶相对位置,其余参数向栈底依次展开(注意下面用的全部是栈底/栈顶,由于对口,实际内存分布一般是反过来的)。使用BP+8,BP+12这种规则来访问。因此调用者可以传递变长参数。无论你在实际参数之前入栈了多少个数据,只要调用者最后记得把这些数据出栈,就不会对执行构成影响。而pascal规则则不然,为了获得参数位置,被调用者必须知道传入了多少个参数。例如访问第一个参数,就需要用BP+4*N+4来访问(当然在编译时这个数字会被静态的算出来)。如果你在实际参数之前入栈了数据,那么被调用者就需要用-1这种方法去访问这些数据了。而如果在实际参数之后入栈数据,整个参数位置都会错乱掉。因此pascal规则一般被认为是不能传递可变参数的。 但是C规则的这个优势,在这里变成了问题。调用者的代码还是打补丁之前的版本,而被调用者的代码则是打补丁之后的了。因此__libc_res_nsearch将参数入栈前入栈的最后一个元素认做了最后一个参数。这个元素,可能是需要保存的现场,也可能是局部变量。 如果__libc_res_nsearch将现场当作了最后一个元素的话,将无法解释这个值为什么在后面发生了变化——被保存的现场一般来说是用于未来的恢复的,他们不应当发生变化。而如果是局部变量则相反,局部变量的指针经常被当作参数传递给子函数——这也是经典的C多值返回方法。 如果__libc_res_nsearch确实接受了局部变量的地址作为参数,他可能会向这个地址写入任何东西——例如0。这就造成了这个地址在调用时有值,但是在使用时值被清零,又找不到任何地方修改这个值的缘故。 当然,这里也有很多疑惑。例如局部变量顶上一般会保存被调用者需要保存的现场。无论如何,参数和局部变量之间一点现场都不隔,是件很奇怪的事情。而现场一般是不变的。对于这点,我没时间去反向源码并分析栈的实际情况,谁知道可以告诉我。 这是一个调用者(caller)的原型认知比被调用者(callee)少一个参数的结果。如果事实反过来,调用者的原型认知比被调用者对一个参数,那么代码执行将不会有任何麻烦。 事后分析 这个故障最主要的原因是有人将系统库复制到了/usr/local,并修改了LD顺序。 glibc确实是一个几乎没有改动的库,但是这不表示他不会改动。根据我这里的记录,在过去的一年半时间里,他改变了八次。有趣的是,最早一次改动也是因为getaddrinfo的漏洞做修补(USN-2306-1)。也许是运气好,前几次改动中并没有调整参数,或者对参数的意义做变更。因此老代码和新代码的混合调用并没有出现问题。然而本次修补就过不去了。 这并不是ABI的错——ABI承诺的是“向外暴露接口”,而libc中的内部互相访问显然不在其中——谁会承诺自己内部结构的ABI兼容性呢?那会让稍微复杂点的重构都无法进行。 根本的问题在于,为什么有将glibc中的一部分提取出来,放在/usr/local中固化的需求呢?(或者对glibc的实现做调整)而且从操作上,即使我们需要对glibc动手脚,最好将整个编译结果放在/usr/local中,完整替换全部的glibc库。当然,这个行为会使得glibc的修补补丁彻底失效。根据运行时错误好过逻辑错误的理论,这是一件比崩溃更糟糕的事。 更糟糕的问题并不在glibc上,而是这台机器的维护状态,还好这是一台开发用机,而不是在线机器。如果有人知道这台机器的LD被做过手脚,应该很容易能够想到这个问题的原因。但是在复盘中我询问多个人,都不知道这台机器被如此设定的理由,甚至没人知道如何维护这台机器。实际上这台机器的维护曾多次易手,其中有些人根本已经离职。即使尚未离职,也未必记得自己到底做过哪些事。而我也找不到任何相关文档表明这台机器被如何的维护了。这也是为什么这台机器不好迁移的原因——在机器上有太多明的暗的诡异的workthrough,要将其迁移到另一台机器上是件耗费人工的事。我维护的很多机器(帮朋友维护)也处于类似的状态。维护时间太长,经手人多次转手,上面很多设定完全黑化,要迁移需要付出相当代价,等等。。。 docker能解决这个问题么? 不好说,这个问题有点复杂。 从本质上说,docker解决不了这个问题。因为一个workthrough,存在于整个系统中,还是存在于一片dockerfile的海洋中,其实没太大区别。如果我会跑上去就看dockerfile,然后从一大堆过程中一眼看出问题,那我也会在这次解决中先去看LD设定。最低限度,看bt的时候根本不用参考源码,往下看两行就知道原因了。而即便知道原因,这句cp存在于里面的原因仍然未知。我不知道为什么会把这个文件cp到/usr/local,无论是机器上实际存在的复制,还是dockerfile中的cp语句。最后实际有帮助的,还是在这句cp上注释的信息,或者机器上留存的维护文档。 但是docker是有帮助的。首先使用了docker起码好迁移了。当然,这不是他最大的帮助。 docker最大的帮助帮助并不是来自于能够帮助我简化寻找流程,或者知道原因。而是来自于减小系统规模,甚至可以将系统规模降低到需要的最小规模。在一个复杂系统中,寻找一个workthrough,或者知道为什么是困难的。但是在简洁系统就容易很多,非常多。 当然,将复杂系统拆分为简洁系统是有代价的,并不那么容易的。在这点上,我比较信奉熵增原则。在增大系统规模的时候,系统的熵永远是增加的。如果要降低熵,就需要对这个系统做功,无论从哪个方面。随着手段不同,做功只有大小差别,而没有一颗“一次解决”的银弹。从这个意义上说,docker并不能解决这个问题,他只是能降低你需要做的功。 而如果对某个系统做功并不产生实际效用(而只是为了将来可能性的维护便利)时,这部分开销就可能被砍掉。反正解决了问题并保持一段时间,相关人员可能就不再继续维护,或者高升,或者离职,或者根本转行。于是系统中(包括代码和维护)会不断产生各种workthrough,“将来要修”的承诺,和随着不断的人员变更不再有人记得的暗创。最后系统就会变成遗留系统,没人知道为什么,没人敢动,也不敢停。静静的在那里,吞噬一批又一批IT从业人员的青春,同时也产生更大的熵。

关于程序员和产品经理两大世界体系的对话——论快播庭审

Jan 11, 2016 - 1 minute read - Comments

最近快播的段子都快传疯了。很多网友也在那里分析快播有没有罪,辩护有没有问题之类的。其实结果对我来说一点都不重要。快播有没有罪,这个留给法庭审判。我今天要说的是庭审所暴露出来的一些问题,一些我日常中经常看到的问题。 我们先看两个段子(其实基本是庭审里的事实): 审判长问:文件加了密,你为什么不解密呢? 张克东:如果达不到一定的码率,快播软件就会启动缓存服务器开始加速,达到了码率,就会自动断开。 法官:软件它为什么会知道?它是机器人么? 也许有些人看到段子1,会喷国家审查啊什么的。其实这不是审查,而是无知。审查一定是懂行的,无知才会要人解密。至于段子2,也有类似的问题——码率的衡量问题在大多数程序员,甚至包括懂一点技术的用户那里都不是秘密。问“软件为什么知道”,实际上非常无知。 甚至同样的问题,也存在于某些网友的评论中。例如这篇。我引用这个评论段落: 我看到不少网友以此取笑法官如何外行。其实法官非常聪明,不管张克东如何回复,都回避不开“软件如何知道”,也就是系统如何识别片源问题,只要这个回答了,你快播就摆脱不了你”清楚”播放哪些视频的问题。 如果懂一点技术的话,应该明白一点。对软件而言,码率一定是知道的。而内容,则未必。或者换个对不了解技术的同学们更友好一点说法。对浏览器而言,网页上的图片的大小,格式,都是知道的对吧?浏览器也可以用来浏览黄色网站对吧?那问题也一样,软件它为什么会知道? 红衣主教,是不是该轮到你出庭聊一聊了? 同样,所有聚焦点在“软件应当可以监管浏览内容”的人,同时也面临这么个问题,浏览器是否可以监管黄色网页?作为处理数据流的软件,肯定是了解被处理数据的格式,大小,码率等参数的。那么处理软件是否应当对被处理的数据的内容合法性负责呢?如果是的话,那毫无疑问,所有黄色信息都必然经过了Intel和AMD两家生产的CPU,而且绝大多数也经过了Windows。 实际上,整个庭审中通篇都是法官和公诉人各种技术外行。例如用IP地址标识服务器,硬盘大小标识硬盘等等。如果在国外正常庭审,这证据其实就算废掉了。因为被告可以当场演示给你看改IP地址,你连服务器是不是他的都无法证明,还怎么构成证据链呢?当然,在中国来说,最后是否取信还是合议庭说了算的。 对于程序员来说,这个故事是不是很熟悉?是不是觉得和产品经理打交道很像?一样是对技术一无所知,却对一无所知不以为耻。我碰到过一个产品经理,自以为提了一个很犀利的需求——为什么我们不通过软件自动算出地址,还要客户自己填? 我听到这个问题的时候,估计表情和听到“为什么不解密”时的表情是一样的。心里一万头草泥马奔腾而过——合着不是你实现啊。尼马我怎么算?IP地址只能知道大致地区,还不一定准。GPS当时还不是每个浏览器都支持,就算支持也只能算出坐标,算不出地址。 很多时候,产品上的一点小小的改变,往往是技术上的翻天覆地。不信你考虑一个论坛系统,如果做到像腾讯那么大流量的时候会是什么样一个样子?再考虑一个交易系统,在同样一个量下是什么样子?前者应该还能做,后者应该已经没法弄了吧。为什么同样是个网站,同样的量,一个没事,一个挂了? 因为论坛系统是典型的无事务低写高读系统,因此可以使用分库分表,多层缓存的方法来增强性能。而交易系统是典型的事务,没法用这个手段。所以交易系统在海量压力下的技术难度,和论坛系统在海量压力下的技术难度,其水平和重点根本不是一类的。从这个意义上说,淘宝双11,很不容易。 而这种技术难度,产品经理是不知道的。所以他搞不好会给一个超大流量论坛提出一个很实在的需求——咱们弄一个内部交易系统吧,应该会变成不错的盈利点。呵呵。这个系统要么做出来会有各种各样的事务问题,要不然这个系统大量使用的时候,整个系统(做的好的话应该不会波及论坛)就会慢到无法接受。 当然,现实中一般是没有这么大论坛的。京东实打实在事务性能上吃过亏没错,但是那时候京东已经多大体量了?一个论坛,要引流过去那么大体量,自身得多大?但是这个例子本身说明技术难题的非直观性和在下判断时的必要性。如果你不了解这个技术本身会引发什么问题,你就无法得到合理的结论。 作为产品经理,或者要和技术打交道的一切人士。不懂技术并不可耻,可耻的是不懂技术又无视技术。既不去学,也不去问。装作技术不会对他产生影响,装作不懂技术并不影响他决策的权威性。 与此形成对比的,是微软垄断诉讼案中法官的表现。那个案子里,微软律师强调的是IE内核和windows系统的严密整合,导致两者几乎无法拆分。从软件架构角度来说,这没错。但是法官很明白里面的门槛——保留IE内核不代表保留IE。鼠标一点,IE直接从系统中干掉。虽然内核还在系统上,但是不额外安装IE的话,无法使用浏览器。如果没有后来的一些事的话,估计微软就难逃一劫了。 话题拉回到快播庭审的事情上来。快播有没有问题?排除色情非罪化(我支持内容分级审查和色情非罪化),我觉得是有的。就好像我们说**的时候,一般都会想到约炮。(由于某些因素,我不能写出这两个字来。但是如果你这两个字和我想的不一样,那你的问题就大了)如果快播没有放任色情传播的话,是很难做到这么大的,更不可能做到我们一说找XX内容就想到快播。这不能说因为检方派了几个猪队友,所以快播干净了。 但是这个问题是不是罪?这不好说。定罪这个事情是个专业性很强的活,我的法律知识不足以下这个判断。但是个人意见,我觉得应该无罪,至少不能拿缓存服务器上的色情信息来定罪。如果缓存服务器上有色情内容就可以定罪的话,那铁通小区宽带就可以直接去转型了。因为他们为了减少对电信的依赖,降低流量结算费。在小区里都是装了缓存服务器的,而且是强制透明缓存,想不做都不行。小区里有没有人看色情网站?他们为什么不人工看? 看,这又是一个不懂技术就不知道我在说什么的问题。对用户来说,可能铁通的感觉就是“不好用”。技术人员才知道,电信和铁通的流量结算价格问题,还有铁通(以及各种小ISP)的透明代理的存在。知道这个透明代理和快播的缓存是不是在技术上是等效的。 还有解密,可行不可行?对于快播来说,要解密应该是可以的。但是对于百度网盘来说,连解密都不行。我把我的一堆生活照在百度网盘上备了个份。为求安全,我用GPG做了加密,然后再用SHA256。我自己倒是问心无愧,但是对百度来说,里面到底是不是色情内容?我觉得百度要是还能解开,不妨把技术卖给CIA。

云计算的成本计算

Dec 18, 2015 - 2 minute read - Comments

成本构成和计算基准 一般来说,云计算的综合成本会分为三块。硬件,机房(包括机房内网络设施),运维。当然,其实还有IP费用和流量费用。但是那个在云计算的费用中一般也是分开列的,所以可以和以上三项分开算。我们先算出去掉IP和流量的费用,然后再来独立讨论这两项的效应。 在云计算中,CPU是可以超卖的,但是内存一般不超卖。所以我们计算的基准是内存。准确的说,是“带上其他硬件设备的内存”的单位价格。单位是人民币每G每年,缩写为/Gyr。在整个计算中,硬件费用都是来自dell美国的报价计算器,汇率恒定在6.5,折旧速率是5年。存储系统的折旧速度会比整机更快。存储盘3年折旧,SSD1.5年折旧。 存储是硬件成本中比较特殊的一项,因为每个虚拟机都带有存储,也可以额外配置。所以我们单独为其估价,再在整体费用中将其加回去。这样在估算价格时可以计算光板系统。 硬件成本 在这个计算中,我随意挑了一款2U机器——R530。这是一台最低型号的2U机器,不知道有没有人在实际生产中用他,总之我们就先随便算。这台机器极限能插8条32G的内存,总内存量可以高达256G,还是挺适合虚拟化的。因为机器总体有成本,单机内存数越高,原理上说越省钱。 撇开存储,撇开网络,内存升到极限,其实我们能选的就是一颗CPU。而且一般来说,CPU和内存需要成比例搭配。一般会选择1:4的搭配比,256G内存需要64颗核心。整个CPU搭配表上就没这么牛X的CPU。。。 好吧,退而求其次,看看稍微差一点的CPU如何。由于整机搭配的内存和CPU越高,整体价格越便宜。所以我们搭配一颗最牛X的核心——E5-2695 * 2。整个系统瞬间升到56颗核心。和64核也相差无几,我们就选他了。 相对的,整个机器既然配置了这么牛的系统,那么网卡就不能用默认的千兆网卡了。我选了两个双口光纤万兆模块,再加上一个1+1冗余电源。其他都用默认选配。计算下来,每G成本为56.2/Gyr。这差不多就是一个光板机器的最低价格了,里面不带任何其他费用。 另外,为了参考,我们计算一组CPU配足的机型E5-2670 * 2。这颗CPU是24T的,所以要配合192G内存。平均成本为60.47/Gyr。 IO密度问题 上面假定一台机器尽力往里插内存,但是实际上不能这么做。因为存储模型的问题。 我把虚拟化分为两种——单台机器故障的情况下数据不丢失,可以立刻在其他系统上开始启动系统的。和单台故障的情况下无法立刻恢复系统,甚至数据完整性都不能保证的。前者敢叫云计算,后者只能叫VPS。 为了达到后者,一般我们会把写入存放在多台机器上。而为了效率考虑,EC编码之类的方案几乎不能考虑。所以综合下来,唯一的方法就是将数据写入同步到另外两台机器上(三副本)。如果这个复制动作通过网络进行,那么写入速度就受到网络瓶颈。 例如上面的256G机器。虽然我选了两个双口万兆模块,总吞吐量高达40G。但是实际上你得假定可能有一根线故障,可用速率只有30G(如果是一个模块故障,更会降低到20G,幸好这不常见)。30G速率均分给256G内存,平均分给每G的吞吐只有120Mbps/G。折算出来就是15MB/s每G。这个速率要通过两份数据,分别传输给两台机器。如果用户不幸而选择了1G的内存,搞不好写入速度只有7.5M/s。要达到普通系统60M/s的写入速率,至少需要8G内存。这还没有计算机器到机器间通讯速率。 那么解决方案是什么?其中之一就是降低机器上的内存数。当然增加网卡也是一个方案,但是这会严重影响接入系统的效率——我们本来已经出了4根纤了,你想把服务器搞成八爪鱼不成? 如果内存数降低,那么单位内存上的吞吐速率就能提升。192G的吞吐是160Mbps/G,每G写入可达10M/s。内存降到128G的话,平均吞吐率就会升高到240Mbps/G,每G的写入速率可以提高到15M/s。如果降到64G,每G写入速率还会提升到30M/s。不过IO问题是个峰值问题。如果全系统都有大量写入,例如大部分实例都装了数据库,那么很不妙。不过如果全系统都是纯密集计算,那写入速度其实影响并不很大。为了对比,我同样计算了128G和64G的情况。但是这并不表示在实际搭建集群的时候需要使用低内存的机器。 有趣的是,在其他保持不变的情况下,128G的平均成本为59.44/Gyr,和256G的版本相差无几,比192G的版本还便宜些。64G却快速上升到94.25。这说明在一定内存数量以上,硬件平均成本受到内存密度的影响并不大,但是低于某个限制后,则快速受到影响。 另一个方案则是在服务器上采用40G网卡,4块40G网卡也能解决问题。但是网络会非常难做。因为上手就用了普通汇聚层的速率,所以如果要不大影响收敛比的情况下,汇聚和核心的速率要求会进一步提升。这种模型下,单位价格为62.55/Gyr。 当然,还有另一个方案。我们使用独立存储系统,例如盘柜。这样会带来两个好处。首先盘柜的光纤独立,因此会极大的提升网络系统的效率。其次盘柜的多份复制是自行完成的,因此并不需要在吐出光纤上传送两份数据。当然,我对这种方案不熟,所以下面没做深入计算。哪天可以把这个方案的成本模型算出来再写一篇。 下面我总结一遍上面方案的配比和成本: 256G + 10G * 4: 56.20/Gyr 192G + 10G * 4: 60.47/Gyr 128G + 10G * 4: 59.44/Gyr 64G + 10G * 4: 94.25/Gyr 256G + 40G * 4: 62.55/Gyr 注1:其实192G的版本用R730还会更便宜一些,低到54.40/Gyr。但是我们的目标是同类对比。为了减少环境变量,所以不讨论这种情况。 注2:其实128G的版本由于CPU比较节能,所以整机大约可以节约100W的电力。这部分在下面并没有被考虑,否则可能涉及机柜里会多或者少一台机器,计算会非常复杂。 机房成本 机房成本包括两块,网络设备费用和柜子费用。 网络费用很容易算,一个柜子一般是42U/10A/20A电力。撑死放5-10台服务器。一个服务器两口,也就是10-20口左右的交换机。选个不大夸张的机器,也就是1W差不多了。就算电力翻倍,机器翻倍,交换机价格差不多也是翻倍的。所以平均成本还是基本不变。 核心那里难算一点,一套核心要上百万,摊给全机房用。而且如果机器太多,可能两层交换量不够,还会用三层交换。那还有汇聚层的钱要算,大概又是上百万。 柜子的价格最难算。视地点不同,每个月从几k到十几k不等。每个柜子能放的机器,随电力状况和CPU功耗,从5台到15台(35A)不等。而且很多时候,公司的体量大小和谈判能力也会严重的影响到价格。 所以,为了简化上述计算,我直接硬把机柜价格指定为60k/yr[1]。300个柜子,每个柜子5台设备,1500台机器。核心加汇聚加接入,总数大约600W,每个柜子20k。至于为什么是这个数?不为什么,就是后面好算。 于是很容易就算出来,每机柜每年成本64k/yr。128G下是100/Gyr,192G下是66.67/Gyr,256G下是50/Gyr。40G光纤比10G光纤原则上要贵,因为起手就要用汇聚交换机,而不是接入级的。但是具体贵多少——很遗憾我根本找不到数据。推测是贵了至少5倍。 实际上,由于机房各种配比不一定能够达到最优状况,所以接入模型配比往往会比预期的高上非常多。而且机房成本也不一定能够控制在60k/yr的水平上。所以如果从业界实际角度考虑,这个费用的精确度大约会有20%的上下浮动。 参考 这篇文档 ,有的地方能租到这么便宜的柜子,有的地方不行。 运维 一套云计算平台,需要多少个人运维?

说说密码和安全设计

Oct 22, 2015 - 1 minute read - Comments

趁着某站密码泄漏,我review了一下整个密码和安全系统。下面总结一下要点,大家可以参考一下。但是我觉得多数人无法照抄。 基础 假定 **会随时找我谈话。(不要以为不现实,想想我得分最高的项目) 手机是会丢的。但是窃贼不会攻击经济无关帐号。 设计 尽量使得问题只出现于局部,不会波及全部系统。 在不严重的情况下,尽量简化使用,而不是增加复杂性。 在“大部分情况下更严密,小部分情况更糟糕”和“平均化”的选择中。只要小部分发生概率不高,选择大部分情况更严密,并尽力避免小部分情况。 帐号体系 能用Oauth自动登录的尽量绑自动登录。能不自己管认证体系的尽量别自己管。 境外关键服务,应绑定邮箱,不可绑定手机。其余服务应绑定手机和邮箱。如果没有假定1,能绑啥绑啥。 集中绑定能减少帐号系统复杂性。其代价就是当基础手机/邮箱出问题时,后果会很严重。因此需要设计对应措施。 重要服务(尤其涉及钱)只能有一个绑定寻回,切忌绑了邮箱绑手机,还都能寻回。一个出问题,帐号很危险。 基础手机/邮箱之间严禁互相绑定,以防一个出问题全部出问题。 多个身份间不要串帐号。一个帐号体系和另一个帐号体系之间可以发生来往,但是不能发生混同。想一下妹子用自己手机号帮多个男的登记开房的事。。。 基础邮箱/手机的信任问题不是信任问题,是信仰问题。对应措施无法对应基础系统自身的问题,例如供应商恶意作恶,或者供应商出了问题。所以选择谁是个信仰问题,要仔细选择信仰。 OTP管理 能开OTP的统统开起来。把emergency token抄纸条上丟家里。 可以使用OTP的列表 。 上面的补充:Microsoft, CloudFlare,Slack,Vultr,Tumblr,Ifttt,Eveonline,阿里云, DigitalOcean,dnspod,btc-e。 ms家会让你装他自己的app。请在手机系统的选项里选other,这样他就乖乖出一个QR让你扫了。 OTP的保存时间和系统安全性有关。可信系统上可以保存一个月,不可信系统上尽量在一天以内。太长时间可以登录不需要输入OTP等于没有OTP。 密码管理 使用密码数据库保存数据。 密码数据库管理程序应彻底开源。 使用同步网盘保存和同步密码数据库(加密后的)。 要注意防护整个系统突然失效。从出现概率分析,系统失效概率比被盗概率要高。而一旦发生失效,你的大多数帐号就全都失控了。 手机上不应同步密码库,而应手工复制更新。以防同步系统出错清了所有副本。 可以定期将基础密码(主要是邮箱)抄出来,放在家里的角落里。万一不得已,可以对所有系统做密码寻回。 密码维护建议在同一个环境上进行(例如全是windows),以防两种不同版本的软件冲突导致数据丢失。 不应在不可信系统上输入主密码。否则主密码和密码文件都会丢失,等于所有密码丢失。所以不要在不安全系统上使用密码管理系统做任何操作。 要谨慎使用粘帖板管理程序。保存粘帖板历史的程序不要开。 搞一个足够安全的系统随身。推论可知,系统越多,出问题可能性越高。搞一个足够安全的系统随身,可以避免万一的情况下被迫要在不安全的系统上输密码。 这基本就是需要你有一只足够安全的手机。 手机 如果手机有root,不算安全系统,不能使用密码管理系统。 注意手机上的“可以收取短信”和“可以访问剪贴板”权限。如果一个应用可以访问这两个,基本就可以访问大半密码数据库,并收取验证码。也就是可以在无察觉的情况下把某个帐号偷跑。 手机上保存的帐号尽量不使用手机寻回帐号,尤其是涉及钱的。如果帐号保存在手机上,而且可以用手机寻回。一旦手机丢失,拿到的人就可以长驱直入了。按照假定2,这很危险。 钱 银行卡升级到高密卡。低密卡的安全性问题就不说了。 目前高密卡还是可以按照低密使用的,这其实仍然不安全,因为复制后还是可以偷钱。增强卡安全需要全部系统强制废弃低密卡。 经济相关帐号需要一个“防止手机丢失”的手段,否则不应在里面长期放大量资金(可视为这笔钱会随手机丢失)。 支付宝的设计是“手机高于一切”。所以在“手机会丢”的假定下,直接出局。微信的设计也类似,所以也出局。 银行帐号,其密码无法通过手机寻回的,可视为安全。 如果能通过手机寻回密码的,有转出限额(无法通过手机更改)也可以接受。 吐槽 QQ现在要求我用申诉的方法才能改密。但是申诉需要三个以前好友的帮助。我TM从98年开始用的,连同学都没几个还在上了。你让我去找麻花藤来申诉啊。。。 支付宝本来还支持字母支付密码,后来直接改成了6位数字。手机应用本来还需要解锁,现在只在特定情况下需要输入手势锁。本来还有宝令,现在已经没有了。总体来说,支付宝的安全性是越做越差的。 在整个密码体系里,就属支付宝和微信的安全性最差,就属他们涉及的钱最多。

从青蒿素得奖说现代医学里的方法论

Oct 16, 2015 - 1 minute read - Comments

最近青蒿素比较火,首先恭喜我们终于有一个拿得出手的nobel奖了。 然而,很多人对青蒿素获奖的事情传播不准确,各种争论。例如,中医获奖了。实际上在青蒿素的获奖中,没中医太多事。要明白这点,我们首先就得明白,什么是现代医学,现代医学中有哪些基础的方法论。 双盲实验 双盲实验法是整个近代医学基础中的基础,说是基石也不为过。可能很多人被双盲法的名字搞糊涂了,整个双盲法的思考基础其实非常的简单直观而且科学。可以说,如果听了双盲法的概念后,表示不可以理解和接受的,都得算伪科学。。。 让我们从一个简单的问题开始。我们怎么判断一个算命的是不是有真本事? 最简单的方法,当然是让他算一下,然后我们找人去验证他算的对不对,进而得出一个正确比例来。这个方法固然简单,但是多少才算是“对”呢?这又陷入了另一个困难。 作为解决方法之一,在算命的算玩后,找完全不会的人胡扯一些算命结果,作为对比去验证。如果算命师的命中比例比瞎猜明显高,那就是真的算命师傅。如果和瞎猜差不多,那就是水货。如果扔出各种理由告诉你不能这么做,那么就是不可知。 这个方法很简单吧?通过足够多的实验,我们可以清楚的知道,哪些算命师是真货。 但是有个问题。算命结果的解读,是需要人进行的。而人会受到心理暗示的强烈影响。例如,你知道自己正在解读某位大师的算命结果,他是否吻合呢?有的时候往往模棱两可,你可能就认为其实是命中的。所以一般性情况下我们会让你对正在解读的是真的还是假的保持未知。类似,近代医学已经证明,如果你认为自己在接受治疗,那么你的病情有的时候会出人意料的好转,哪怕实际上你并没有接受治疗。这叫做安慰剂效应。因此,在医学实验的时候,被试者必须对自己是否真的在接受治疗一无所知。这叫做单盲实验。 而更进一步的,当实验的组织者了解哪组是真组的时候,出于利益因素他可能进行干扰。即便他本人并不进行干扰,有可能在日常的接触中给予了过高的期望,从而影响了实验的效果或者解读。这种现象在现代心理学中叫做 皮格马利翁效应 。如果你给予某个组过多的期望,那么他们就会表现的更好。为了防止这种现象,我们会让专门的人进行真假对照组分配,而对实验进行管理的实验者,在结论完成前对真假都是未知的。这叫做双盲(实验者,被实验者)。 可以说,双盲法并不否定算命。双盲法不假定你要做什么,也不需要理解其工作原理。相反,双盲法试图用一般人能理解的角度,来验证你行为的有效性。双盲法就是一个更严谨版本的“让我来试试效果”。 为什么要进行双盲实验 很多人会说,中医已经经过了几千年的检验,是对人体,尤其是中国人体的非常高的认识。所以不需要双盲检验。其实从青蒿素得奖的报道中我们恰恰可以看到,这种说法是完全错误的。大家可以找一下青蒿素研究的相关报道,青蒿并不是治疗疟疾的第一线用药,大多数用法和用料也全是错误的。相关课题组从中医中,收集了几百个可能的药方,而其中能够成为药物的,只有青蒿素这么一个。那么剩下的几百个药方是什么?对人体的全面总结?这就好比你去医院,问医生说,搞不搞的定啊。医生拿出600多种药来,告诉你,一样样试过来,你的病就有救了—— ——尼玛你的病才没救了呢。600多种药,当饭吃都要吃上几天。更不说多种药物之间还会互相反应冲突。这哪里是治病,分明是致命。 也有人说,中医需要根据情况,复方辩证,药物配伍,才能治病。所以双盲法不能起作用。其实这也简单。找个白胡子老头,就是电视广告里经常有“祖传配方”的那种形象,也跟一批患者面前一戳。找点树皮草根去熬,完了也给丫灌进去。要是你的治愈率比不过这个,实话说,我们真用不着您的祖传药物,直接在民间里筛演员就成。还能做一档节目,就叫中国好中医。广告商都好找的很,凉茶商们分分钟扔出一堆钱。。。 还有人说,中医有几千年历史,近代医学才几百年。为什么要用一个几百年历史的东西,去证明一个几千年历史的东西呢? 如果你信服这个观点,你就需要考虑。马车有超过千年的历史,汽车历史不超过200年。按照同一理论,我们不能用汽车的理论去规范马车(例如靠停,让行,撞击安全标准等),还得让他们在一起跑。不知道你春运的时候,会不会驾驶一架马车上高速(如果上的去的话)。 有些人就是这么奇怪。穿化学制品,汽油机车出行,住钢筋水泥,还用洋人们发明的一种叫CPU的玩意上一种叫ineternet的网(抱歉,有些地方叫innernet)。偏偏轮到中医头上就不能用现代的标准衡量。你知道早年某国也有一群人,大喊着大师兄速速显灵,戴上面具自以为刀枪不入出发去捣毁洋鬼子们的教堂。该国还给自己的军队起名叫“虎神营”。其结果我就不多说了。。。 其实对真正有信心的中医大师而言,双盲法不是打脸,而是机遇。双盲法能够以近代科学方式,令人信服的检验一种疗法是“有效”的,还是“无效”的。这为后面的一系列研究打下了基础。而且通过双盲法测试后,治疗方法的有效性就会被现代医学所接纳和研究,从而使中医在未来有更广阔的发展。如果对中医真正有信心的话,我无法想象为什么会拒绝双盲法检验。最基本的,一家馆子好不好吃还允许客人尝尝味道再评价呢。一个疗法有没有效,居然不允许别人试试再评论,搬出各种理由必须无条件的相信。我也是没话说了。。。 记载和公开验证 我还看到某篇报道,通篇长篇大论论述“黄青蒿也是青蒿”。这更是扯淡。一种植物到底是不是药物,药典居然并不能很明确的分辨明晰。那么你吃的药有没有效,我想医生也并不能很明确的分辨明晰。数百年的中医口口相传,每个中医是不是都能掌握正确的治疗方法呢?也未必。鲁迅先生就记载过一味药: 败鼓皮丸 。有没有效?我不知道。治法虽看似儿戏,但是不能因为看似儿戏就断定无用。传统医学种种方法,很多有效的疗法就藏在看似儿戏的行为里,例如嚼树皮。但是我至少能说一点——这记载很有问题。 破旧铜鼓皮一张——什么样的铜鼓?用的什么动物的皮? 以陈烧酒和糯米粉糊丸——是不是要哪里的陈烧酒和糯米粉? 这些都不明确,确实只能靠中医的口口相传,秘而不宣。别的不说,我至少可以说一点——鲁迅先生当年就没遇到传对了的医生。 完全存在可能,某种特定动物的皮,在经过很长时间后,恰好能够治愈文中所描述的症状。但是这种动物能治,换种动物行不行?时间短点行不行?这些都很模糊。其结果就是这个药方的效果不“稳定”,有时有效,有时没有。有的人有效,有的人没有。 然而在验证上,这个事就有点扯皮了。上面的一堆组合中(各种动物,放置时间长短),假设有一种组合是有效的。那么能说这个方子有效么?无效?这方子明明可以用。有效?大部分的医生,大部分的时间里都无法治愈你。这就像青蒿素的悖论一样。虽然治疗方法都摆在那里,但是在中国历史上的几百年间,愣是拿疟疾没辙。证据就是,自古以来中国视南方瘴疬之地为畏途。可从没听说哪个医生带了一车青蒿大摇大摆的走了进去,对瘴气是若无物的。另一方面,如果中国长期以来,主流治疗方法都是正确的,有效的。那上个世纪搞那么大规模的疟疾治疗研究是干嘛呢?为什么不直接用成方呢?屠女士是怎么获的奖呢?国家领导都是白痴么? 近代医学体系的基础,是清晰的,公开的记录,和公开的第三方验证。只有将发现记载清晰,才能够公开,由其他人独立重复实验。只有公开,才能允许第三方验证。而只有第三方验证,才能对整个实验中是否存在潜在问题,做出一个独立的研究。这整个体系,是现代医学得以存在和发展的基础。 讽刺的是,这也同样是中医发展的基础。本草纲目之所以伟大,正是因为其公开而完善的记载。如果本草纲目是一本家传古籍,当然更值钱,然而中医也无从发展了。 近代医学中,也有记载不清楚的地方(或者记载者自己并不知道记载不完善)。但是消除记载不明确的地方是常识,将这种不明确秘而不宣才是异常。例如 反应停事件 ,人们以为记载了药物的分子式就结了,没想到药物还有手性问题。其中的R构型有疗效,而S构型会致畸。通过对Thalidomide的深度研究,科学界明确了药物的作用机理,风险,和控制方法。现在,Thalidomide被作为一种麻风性结节性红斑的药物使用。通过分离手性分子,可以将副作用降低到最低。 这个事件,和“黄青蒿是否为青蒿”的纠结,可做一对比。 临床试验 双盲法测试有效不是故事的终结。恰恰相反,双盲法认定了这是一种有效疗法,这才是故事的开始。一种疗法(尤其是其副作用)被现代医学透彻的研究之前,是不会被广泛应用的,尤其是中药。因为中医在近代医学上扮演过极不光彩的角色。 在上世纪,其实老外们很迷中药的。后来在92年前后吧,比利时有很多人染上了奇怪的肾病。经过医学研究,明确将病因指向含有马兜铃酸的中药。此后,在2000年的时候,FDA正式下令,禁止含有马兜铃酸的草药和制品流入美国。整个事件可以看wikipedia的 马兜铃酸事件 。 其实我的意见,吵架双方完全没争论到点上。当我们讨论毒物的时候,剂量是一个很重要的因素。马兜铃酸在各种剂量和配伍下,引发肾衰竭的可能性如何?至今为止没有人给出解答。似乎中医中药的赞同者们,从来没从近代医学的角度考量过问题。(这里可参考上面的“为什么要进行双盲实验”) 化学药品固然也有导致肾衰竭或者肝衰竭的可能性,但是在使用的时候,多大剂量,可能造成多严重后果,这些数据是基本可查的(我记得这货应该叫 循证医学 ?)。医生在开药的时候,可以根据服药的后果可不服药的后果,来衡量使用一种药物的价值。 然而马兜铃酸的毒理性数据(尤其是中医们宣称的,群臣佐使情况下的毒理数据)缺乏(在可靠测量方式下缺乏),使得传统医学中很大一部分药物根本无法被现代医学使用。因此我们只能看到中医界反复宣传,中医安全,可靠,不会引起副作用。但是现代医学界却始终无法接受。最后就完全变成了信仰之争。 我相信中医中还有大量的有效的疗法(和更大量的,传出了问题的疗法)。但是哪些疗法有效,哪些疗法无效,哪些疗法有多大效果,有多大副作用,尚没有一个明确结论前。实话说,虽心向往,不敢用之。 作用机理 近代医学比传统医学更进一步的,是明确了“药物为何会起作用”的机理。这个机理是明确的,公开的,可重复的,可证伪的,而不是以阴阳五行或者太阳月亮在天空中的位置,来指导治疗。 我查过,关于青蒿素,就有好几篇“青蒿素类药物的作用机制”。我目前还不清楚其作用机理是否已经完全被解析明了。但是人类是有好奇心的,一定会有人好奇为什么这种药物能起作用,从而持续的研究他。 更深一步,近代医学对药物机理和毒性的研究,甚至能够改善药物的效果,减少毒性。例如上面提到的反应停手性问题。对药物作用机理的研究,甚至还能指导药物设计。例如 奥司他韦 。 当然,作用机理研究不清,也是不妨碍用药的。现代医学没有那种必须搞清楚才用的怪癖。 中医,西医,现代医学 假定你感冒了。给你板蓝根的,是中医。给你柳树皮嚼的,是西医。给你对乙酰氨基酚的,是现代医学。我们在说西医西医的时候,其实也是巫医,是传统医学。只有当近代,医学结合了科学的方法论,才脱离原始蒙昧的阶段,正式成为现代医学。

印度游记-4

Oct 15, 2015 - 2 minute read - Comments

11:44 AM – 8 Oct 2015: 早餐还是很赞的,居然有烟熏三文鱼。不愧是五星酒店,车辆进出都要用镜子检查底盘和开盖查引擎。人包分离安检,和机场一样。不过,印度的安全形势到底是怎样啊。我在想,中国为什么很少看到恐怖主义事件呢?(不代表我喜欢它)大部分都是群体维权事件。 有人反馈说,印度和巴基斯坦是世仇,因此有恐怖袭击风险。尤其是Taj Mahal酒店,是 2008年孟买连环恐怖袭击 的袭击对象(不过那次是孟买)。事后得知,真是一身冷汗。 中国不是没有,而是主要集中在西部。其他地方,有点风险的人还没下大巴呢,就先叫去谈话了。。。 12:23 PM – 8 Oct 2015: 德里的观光bus居然叫HOHO bus,顿时高冷有木有? 查了一下地图,昨天的骗子看似跑一大圈,其实就走了300米的距离。不过他运气不好,酒店我在gmap上戳过。而且那个地方我居然去过。所以一眼就知道了他的把戏。 建议来印度玩的,把你常用的地点都在gmap上戳一圈。这样很多事情会很方便。 HOHO bus千万不要坐,老婆更是傻傻的买了两天的套餐,说第二天才多20%的价。结果咧,完全没有用到。 1:58 PM – 8 Oct 2015: HOHO bus 开到一半空调坏了,导游就打算把我们扔景点等下一班车(45分钟)。老婆就打算跑了。车上几个老外就不干了,跟导游争论,我们付了这么多钱不是让你浪费时间的。争论半天的结果,他们15分钟内调一班车过来。 还说老外气场足。 HOHO bus非常扯,开着开着,冷气没了。然后老外就和他们争论。本来让我们等下一班的,结果就是来人修车,同时尽快派一班过来。 气场啊,气场。 2:17 PM – 8 Oct 2015: 他们居然派了个工程师骑摩托来现场修,而且还调了车过来。前面争论的老外真牛。。。 实际修复的结果,差不多搞了30分钟,只能说略快而已。 2:23 PM – 8 Oct 2015: 刚刚经过一家大医院,门口的救护车就像出租一样密集。 这才是医院的日常。 5:03 PM – 8 Oct 2015: 上午看顾特卜塔,感觉好无聊。唯一的意义就是搞明白了谁修的塔。 不建议去玩。不过看到好多学生来观光。老婆跟我说,印度的妹子小时候真漂亮。 5:15 PM – 8 Oct 2015: 我靠,居然见识到了三哥的挂汽车。真是太震撼了。可惜距离太远,不然就照一张了。 话说他们的公交好像也是不停站的,上下全靠跳。 5:39

印度游记-3

Oct 14, 2015 - 2 minute read - Comments

3:40 PM – 6 Oct 2015: city place, udaipur 12:51 AM – 9 Oct 2015: udaipur 事后发的,时间跳脱。 4:21 PM – 6 Oct 2015: udaipur大停电。餐厅有free WiFi没法上网,结帐需要手算,不能收信用卡。去小店买水,水都不冰了。回酒店,依然没有网。最糟糕的是,没有空调和热水。大中午。。。 4:24 PM – 6 Oct 2015: 问了附近的三哥,说停电在这里是家常便饭。几天就有一回,他们都不惊讶了。但是最近是旺季,还是很影响生意的。他们不知道为什么最近那么多中国人来,我总和他们解释,我们最近国庆。 这就是我说的,基础设施造成的重大影响。印度这地方不像中国,政府说弄个电线,分分钟就搞定了。你先得考虑对环境的影响,对古迹的影响,再问问居民答应不答应。等所有事情都谈好,中国人已经把活干完了。。。 4:42 PM – 6 Oct 2015: 今天去udaipur的city place,比jaipur的要好很多。展厅很漂亮,展品也很充实。镜子拚花,彩色琉璃拚花窗格,镂空雕花装饰。简单的几何图案大量重复,构造出美丽而丰富的装饰。 8:17 PM – 6 Oct 2015: 在路上偶遇一个中文很好的小哥,他说自己是在复旦学中文的,在合肥工作,安装atm机。这里是他老家,在做羊毛生意。六十年的一家店,经常卖东西到中国去。他说中国人来了经常腹泻,几乎都会。他自己都偶尔腹泻。然后推荐了我们一个牌子的矿泉水,应该会比火车上那种靠谱点。 小哥说中国啥都便宜,就是羊毛特别贵。中印外贸交流其实机会挺多。我觉得也是。只是基础设施可能会造成很大问题。不过这也不是什么大事,我们援非建设都搞了多少了,在印度搞个什么工程还不是手到擒来。只要能先把各方面问题先谈妥。。。 8:20 PM – 6 Oct 2015: 发现印度其实很多人会说中文,早上在路上遇到过一个人,也是中文很好。就是没多交流,不知道什么情况。我当时已经很惊讶了。结果下午遇到这个复旦中文系的高材生。这绝对是旅行中最大的惊喜。 不知为何,好多印度人会说中文。中国人就别指望印地语了,但起码英语不要太差啊。。。 8:49 PM – 6 Oct 2015: 补充一下。小哥说他家是耆那教的,所以应当全素。但是在中国做生意,经常需要跟着老板见客户吃海鲜。他就问他爹怎么办。他爹说,如果是必须的,那么可以接受。我说gosh,怎么和我想象中差那么多。印象中印度教徒(虽然他不是)经常因为牛肉起冲突啊。他说,印度正在逐步改变。 这是我最意外的一点,印象中印度很多教徒因为吃什么肉的问题经常起冲突。不同的宗教,在教义执行上会有不同麻烦。为此我还特意去了解了很多宗教和禁忌。不过我个人的意见,教义是用来约束自己的,不是约束别人的。不应当因为别人触犯教规而感到被冒犯。 11:12 PM – 6 Oct

印度游记-2

Oct 12, 2015 - 2 minute read - Comments

11:02 AM – 4 Oct 2015: 这家饭店真心不错,前台很会沟通。我们找他租车,他给了我们很好的建议。我们本来打算包车8小时1700,停车我们付。他说你们可以9点出门,晚上多一小时150。从大早上到晚上,大约2200能下来。其实让我们多消费了,但是又不招人讨厌,确实的解决了问题。 酒店叫Umaid Mahal。 根据后面的计算,德里的平均小时工资大约就是150。jaipur这里带燃料和折旧才这个价格,估计工资会更低一些。 价格的计算模式是,1500八小时,因为有上下两个上下山(琥珀堡和老虎堡),所以有200的额外燃料费。超过的2小时一小时150,总计起来就是2000上下。最后有些额外的时间什么的,会多一点钱。 2:54 PM – 4 Oct 2015: 早上去了jarpur的city place和琥珀堡,很漂亮。不过可能是我们期望太高了,有的没到点的感觉。司机人很好,带着到处跑,也没有让我们乱买东西。 琥珀堡很古老,很有古堡探险的味道。据司机的说法,其历史甚至比jaipur还长。但是,可能是我们的期望太高了,琥珀堡里面除了镜之宫外,并没有什么太值得看的东西。 司机还不错,不会总带我们去买东西。我们后面自己说要去买点当地衣服,他带去了一个工厂店,估计能赚一点。衣服也是不错的,老婆回来后还一直穿。 2:59 PM – 4 Oct 2015: 琥珀堡的镜之宫。 3:11 PM – 4 Oct 2015: 三哥的套餐。叫做Rajasthan套餐。。 ‏@lichray评论: 美国也有,我很喜欢。 ‏@cashplk评论: 尼泊尔也看到过类似的,他们叫Daba。 3:39 PM – 4 Oct 2015: 在把印度物价换算成人民币,再对比上海物价后。就算不考虑旅游加成,我在印度还是成了只看胃口,不看价钱的买买买土豪。。。 尼玛上海能120吃顿大餐么?我还看个p的账单加税细节啊。。。 印度税也是分开列的。 10:47 PM – 4 Oct 2015: Hawa Mahal. place of the wind. 10:52 PM – 4 Oct 2015: 近三黑暗料理,中!国!炒!面! 味道还不错。只是这东西绝对和中国没什么关系。 应该是“阿三黑暗料理”。号称中国炒面,其实和炒面一毛钱关系都没有,感觉上是炒的细米粉。炒过面的应该知道,炒面会比较油。印度这里放的油比较少,面更软,更像是粉的感觉。而且口味也严重的本地化了。 10:54 PM – 4 Oct 2015: 今天在jaipur玩的很开心,2000rs租车很值。最后我们还是被晒干了。要是不租车的话会更糟糕。琥珀堡很古老,但是没有想象中那么惊艳。老虎堡日落要看天气。根据色散定律,雾霾越重,红光越强。所以尽量挑印度人烧野火的日子来。 jaipur其实有点乏善可陈,一天都嫌多。早上去一下城市宫殿和星相台,下午去一下琥珀堡(不去也成),晚上在老虎堡看个日落。回来的时候拍一下风之宫殿,结了。其实从下午开始出门就够了,中午可以睡个觉。 10:57 PM – 4 Oct 2015: 城市宫殿不算好玩,只有点衣服和相片。可能艺术品都去了英国了。天文台是我们玩的最开心的。我看过世界遗产后,给老婆解释天文学发展过程和仪器使用方法。然后从天文观测和计算方法谈到万有引力。跑到老虎堡的时候我们已经在讨论二次方程求解过程了。 当然,过程不可复制,不要照着追妹子。 具体可以看“世界遗产”,“斋浦尔的天体观测设备”。 11:38 PM – 4 Oct 2015: 老婆发现了三个bug,很担心。我告诉她,每次检查都会有的,你要学会和这种情况和谐共存。她还是不开心。 对了,她是在衣服上找到bug的。 1:44 AM – 5 Oct 2015: 见识到了,三哥的开挂技术。太开挂了。等有流量了我详细吐槽。现在我要和开挂党战斗了。。。 上火车之前,找了半天站台。有个三哥给我们指了路,指错了。我们犹豫半天决定往回走,就看那个三哥跑来找我们,说不好意思他搞错了。你们的车是这个站台。正说着,站台信息又变化了,我们要去了隔壁站台。 你们人真是太好了。我上次给一个老外指错了路,地铁一发车,我可是追都没得追了。 另外,老婆去买水的时候,被一大圈印度妹子拍照调戏了。 1:56 AM – 5 Oct 2015: 我擦,刚刚一辆车开过,司机鸣笛,震耳欲聋。我们想说干嘛呢。就听口哨声拍手声喊叫声渐起,一帮三哥开始追车跑。车上爬满人,车顶坐着一堆。车不停,有人跳下,有人跳上。每当车上跳下人,空出位置来。就有口哨声起。一群大男人追着这个位置跑,争相跳上去。整个列车过站,犹如一场盛大的嘉年华游行。 亲眼目睹三哥开挂。 2:01 AM – 5 Oct 2015: 和开挂党一番斗争,终于上了车。其实三哥很客气。自己人当仁不让,我们就礼遇很多。大约是没见过白白胖胖的中国包子。车厢狭小逼戾,犹如交了华盖运。翻身是不敢指望了,连进出都需从脚底用钻进钻出的体位。底座宽敞些,却据说有老鼠。最恐怖的是,无空调车听说比空调还冷,因为风大。但是我们没带毯子 我们当时听说的情况是,从jaipur到udaipur的车,只有一节ac,其余都是普卧。有个坐过卧铺的哥们还说,一楼有老鼠。而且普卧比空调还冷,因为风大不恒温。我和人说笑说,100迈的时候手伸出去张开就是D罩杯的感觉?我现在感觉被一堆大胸包围了起来。。。我曾在甘肃坐过绿皮车,三哥的卧铺比绿皮车还恐怖。 对了,说到这个奇葩哥们。我们在umaid坐着等火车的时候,进来个妹子,开口问,do you have rose?

印度游记-1

Oct 11, 2015 - 2 minute read - Comments

注意,由于是回国后整理,因此以下时间都转换到了东八区时间。印度是东5区半,所以当地时需要倒退2.5小时。 10:21 AM – 2 Oct 2015: pranthas and pancake, in india 正解应当是 parathas,一种绿豆做的小煎饼。 2:03 PM – 2 Oct 2015: 印度国庆,大部分商店关门。只能吃麦当劳。果然没有牛肉。 准确的说,印度有三个national days,其中10-02是甘地的生日。细节在 Public holidays in India。在这天,我们看到的大部分门面商店都是不开门营业的。但是很多私人的小店照做生意不误。这点和中国有很大不同,去印度旅游的同学一定要恰当的避开节日(除非为了赶庆典)。 另外,印度的kfc做的鸡腿相当不错,我很喜欢。 感觉上印度的kfc之类的地方是情侣常去约会的地方。我们在kfc里面经常能看到一对对情侣。老婆在kfc门口站了一会等我,上来两拨搭讪的(你们几个意思)。 2:57 PM – 2 Oct 2015: 印度麦当劳送的礼品,made in china… 3:20 PM – 2 Oct 2015: 老婆的穿着有什么奇怪的地方么? 印度的 莎丽,很漂亮的衣服,大家去印度可以买买看。我们这块是700,加搭配的裤子什么的一堆,最后砍价到1000rs。不过穿法比较麻烦,不大熟悉的话会走走路就开了。然后走几步调整一下,很花时间。 我们穿着这个在街上走的时候,回头率相当高。后来我发现印度人对我们中国去的好像很好奇,好多围观拍照的。老婆的这个穿着更奇怪,后面杯子指出来了,缺头饰。所以回头率超高,连欧美老外都连连回头。 7:46 PM – 2 Oct 2015: 在印度喝下午茶。 这家下午茶店就在我们住的简易酒店隔壁。这家酒店用的还是英式电梯(就是那种拉手门,好像建筑工地一样的那种)。床很有特色,双人房两张床是上下两张,就像我们大学里的那种。中庭有很漂亮的天井,躺椅和阳伞,看上去像是英式庭院。 9:34 PM – 2 Oct 2015: 印度的黑暗料理还是很不错的。两个人,半只鸡,一份羊肉咖喱(大好),一份黄油囊,一份蔬菜奶豆腐。味道都很赞。结帐时他们说690,我们给了700要跑(大约人民币70)。他们拦住我们,说等等你还有找头。我当时就震惊了。然后找回来一看,620,我们一直看错了。就更震惊了。 印度的物价超便宜,德里介于武汉和上海之间,其他小城市比武汉还便宜。中国人去了都是土豪。我们这天去的是一家路边摊(黑暗料理),大概相当于上海路边的小店。可是那也不是62人民币能搞定的地方。。。 印度的咖喱变化非常复杂,但是对游客而言,你最多只能吃出主料是什么,红咖喱还是黄咖喱。基本来说只有素咖喱,鱼,鸡,羊,蘑菇这么几种变化,我建议在不同的店可以错开变化吃吃,而且中间最好间隔着几顿别吃咖喱。以免发生惨案。。。 8:59 AM – 3 Oct