说说参观的微软数据中心

上个月有机会参观了位于华盛顿州东部的微软数据中心。最直观的感受就是,先进的现代数据中心,已经不是一直停留在我脑海中那个“机房”的样子了;外貌改观的背后,是管理效率的巨大提升。

单是数据中心选址所考量的因素,就已经让我这个外行人不明觉厉。
前一段时间天津滨海新区发生爆炸,有新闻报道天津滨海爆炸致国家超算天津中心受损 “天河一号”关机。看到这样的新闻,让人不禁质疑超算中心这样重要的基础设施选址怎么如此草率。云计算时代的数据中心对国计民生的影响远超过超级计算机,无法想象未来的某一天,一个数据中心被突然炸掉会带来什么后果。从安全到角度来说,数据中心最好人烟稀少远离闹市,这样不太容易被意外所波及。可是又不能太远,否则距离带来的网络延迟会影响其应用。我参观的这个数据中心就位于这样恰到好处的位置:华盛顿州中东部,距离西北地区人口稠密的西雅图波特兰地区三四个小时车程,当地人口稀少周围一片荒漠。除了恰到好处的位置,当地还位于哥伦比亚河附近,阳光充足,常年干旱少雨,一派荒漠景象;哥伦比亚河从荒漠中穿过,水量充沛,造就了沿河的沙漠绿洲,也提供来充足的廉价电力。Google map的这张照片很好的反应了当地自然状况。
对数据中心来说,固定资产投资之外最大的成本就是电力支出,廉价的电力显然很有吸引力。据说数据中心的电价是1-2美分一度,实在是太便宜了,我们家的电价可是要1毛多的。除此以外,当地政府还提供税收方面的优惠政策。
如果你觉得考虑到上述种种因素来选址就算煞费苦心,那就错了。通常的数据中心都会考虑这些(我国政府领导拍脑袋订下来的除外)。要成为一个现代化的数据中心,还要走得更远。

大家都知道降低电力成本是核心,那么问题来了:除了找电价便宜的地方,我们还能做什么来降低电力成本呢?数据中心的电力消耗主要分成两部分,一部分是主机消耗的,比如主板,CPU,内存,硬盘的耗电;另一部分是制冷的耗电,比如风扇,空调。衡量数据中心效率有一个指标叫能效比,就是数据中心总耗电与主机耗电的比值。比如这个数据中心的耗能比是1.07,就意味着每用1.07度电,有1度都被主机消耗了,只有0.07度用于制冷。
在复旦读书的时候,有一年室友找了份兼职去逸夫楼的高性能计算中心值班,我陪着一起去了几次。当时印象特别深刻,机房里一排排机柜整齐摆放在,值班室也在大厅里,用玻璃墙和机柜隔开。机房里的空调永远是恒温25度,特别舒服,可惜有特别大多轰鸣声,无数的风扇在转。空调和风扇一起保证着机房的正常运行。
虽然人类已经想了各种办法来提高空调和风扇的制冷效率,但是想想就知道这样的数据中心效率不会太高。要保证室内的恒温,制冷的目标不是主机而是整个室内空间,这其实是巨大的浪费。另外,为什么一定要让压缩机拼命运行来保证恒温呢,与其把热空气温度降下来,不如直接把热空气排走换来冷空气。抽气扇可比压缩机的效率高得多。这个数据中心正是实践了这样的想法:首先不修建实体建筑的“机房”,所有的主机就存放走一个个集装箱一样的空间里边,集装箱直接暴露在外界。这不但节省了没必要的建筑成本,也不必煞费苦心为一个巨大的建筑物保持恒温。然后,在每个“集装箱”内部,没有空调也没有风扇,集装箱把干燥的空气从一侧吸进来,混合冷水来增加空气到湿度,然后把混合后的空气向整排的主机吹去;空气穿过主机带走热量,再被另一侧的抽气扇抽出来排到集装箱外面。冷空气混合了水汽之后比热容增加,吸热能力很好;而被主机加热的空气不需要再花大力气制冷,直接排出去就是了。

这是数据中心的卫星图,实际样子请自行脑补。
Screen Shot 2015-09-13 at 12.02.26 AM
为了满足这样的设计要求,数据中心选在了气候干燥年均日照时间很长的荒漠地带。由于气候干燥,抽气扇吸进来的空气湿度极低,特别适合混合冷水产生湿冷空气。如果是在潮湿闷热的热带地区肯定是不行的,吸进来的空气已经湿度极大温度很高了,指望它继续吸热带走主机产生的热量是不太容易了。

除了能源效率现代化的数据中心还需要极高的运营效率。
这里管理着几十万台主机,即使每台主机的可靠性都在99%以上,平均下来每天出现百十台的故障机还是很平常的事儿。如果每台故障机都要立即修复的话,那雇佣上百人每天在各个机架上爬上爬下拆机器装机器恐怕也忙不过来。所以数据中心通常都有专门设计的软件系统来应对硬件故障。当某台主机发生故障时,可以很快的把应用程序迁移到另外的主机上继续运行,这样维修人员就不必立即去修复每一台故障机。另一方面,维修人员会监测各个机架,挑选故障机数量最多的机架做修复。一次修一批比东修一台西修一台要划算的多。这样的设计在简化了安保的设计。由于主机全部都在一个个狭小的集装箱内,而非与进进出出的工作人员共处同一建筑物内,因此就免除了一道道安全门扫描仪的设置,只要用密码锁把集装箱门锁好再装上监控摄像头就好了,不用担心去数据中心送外卖的顺便溜进机房偷数据啦。其实即使真的溜进机房偷走了一块硬盘也没什么大不了的,现在的软件系统都是分布式的文件系统,一块单独的硬盘上只是存储了某些文件的某些部分而已,如果不知道这些部分是如何组合在一起的,根本就没有用。
由于采用了这些设计,整个数据中心只有二三十个人负责日常运行,降低了人力成本。

每次看到工程师对不断追求完美,对事物做近乎极致的例子,敬仰之情就有如滔滔江水。
其实我参观的这个数据中心最多也只是代表了当代的先进技术而已,离黑科技还差得远。据说IT巨头们已经开始考虑更疯狂多想法,比如把数据中心建在海里用海水制冷,或者修在两极地区等等。期待这些黑科技为整个行业带来更大的变革。

看到这样的数据中心,我想应该没有理由去质疑云计算的未来。几十万台机器,只用二三十个人管理,能源利用效率极高,而电费又只有一两美分;如果把这几十万台机器交给每个大大小小大企业自己去维护,又需要花多少成本和人力?两者孰优孰劣不言自明。只是凡事都不会一蹴而就,新事物到来的时候总会有各种质疑的声音。

在Apache+Django下启用客户端证书认证

这两天在折腾这个问题,google中英文的介绍都只提到一部分,所以决定写一篇blog讲一下整个配置过程,全当做笔记。

SSL连接(HTTPS)是普遍使用的安全的HTTP连接方式,它通过证书认证的方式来保证访问安全。通常的方式是:在服务器端设置一张证书,证书由具有公信力的数字证书认证机构(CA)办法给网站对应的域名;用户访问网站的时候浏览器首先会检查证书,既检查证书的合法性(签发机构可靠),也检查证书的对象和网站域名是否匹配(比如证书发给www.foo.com但是用的证书是发给www.bar.com的,那证书很可能是偷来的^^)。如果检查出错,浏览器会询问用户是否继续访问,即使继续访问也会在浏览器地址栏显示一个警告。举个例子,12306购票网站的证书就是它们自己生成的,不是CA颁发的,所以访问12306就会看到
Screen Shot 2015-07-15 at 5.24.03 PM

除了认证访问站点的合法性,这张证书还会用来对传输的数据进行加密,这样攻击者就没法通过网络抓包的方式轻易得到用户的账户密码等敏感信息。--虽然12306到证书是自己签的,仍然可以用来加密传输数据。

除了上述服务器端证书认证以外,有时候还会有额外的一步称为客户端证书认证。如果某个站点或某些URL并不希望所有的人访问,可以在建立连接的时候要求客户端也提供证书,只有证书在白名单之列的客户才可以建立连接。这种认证方法在前端并不常用,因为网站给每个注册用户发一张证书很困难,用户保存这张证书也很麻烦。但是在后端比较常用,比如网站的web服务器和后台其他服务器之间进行数据通信的时候。

现在就假设在Apache上运行了一个Django的虚拟站点,这个站点提供一些Rest API,我们只希望拥有证书的客户端能够调用这些Rest API,不对外开放。
设置过程分为以下几步:

1. 生成证书
对于服务器端证书,通常需要从CA去申请,申请的证书和域名是绑定的。如果服务器只是内部使用,并不暴露在Internet下供大家访问,也可以自己生成。客户端证书可以自己生成,并只颁发给信任的客户端使用。因此这里略去向CA申请的过程,只讲怎么自己生成:

a.生成一个host key

b.用这个host key创建一个证书申请

c.由前两步得到的key和证书申请产生一张证书

二三步也可以合成一个命令

用同样的方法可以生成另一张客户端证书。如果情况再稍微复杂一点,你有多个客户并且需要一一区分它们,那需要给每个客户单独生成一张证书。这时通常的做法是:先生成一张自己的CA证书(就是自己做自己的权威机构),然后再用这张CA证书分别生成多张不同的客户端证书。关于这一点,我看到一篇很好的reference,可以参考。

2. 在Apache上配置使用SSL
先贴出一个完整的虚拟站点配置文件

a.服务器端SSL
打开服务器端SSL主要由这几行配置指定:

b.客户端SSL
客户端SSL认证主要由这几行配置指定:

其中SSLVerifyDepth的含义是在证书链中检查的深度。证书是层层签发的,最顶层是CA,因为这里使用的证书都是直接由CA签发,因此是1就可以了。

c.设置Apache把证书信息传给Django应用程序
通常除了在Apache上设置,我们很可能还需要在Django应用程序里根据证书信息做更细致多处理。例如根据证书签名判断访问来自哪个客户,每个客户可能会有不同的权限,看到不同的东西。有两种方案:一个是通过SSLOptions +StdEnvVars的设置把证书信息放进环境变量,再在Apache调用wsgi.py的时候传递过去。这个方案在网上看到有人提到,但是我不知道怎么在wsgi.py中修改request object;如果通过全局变量或者环境变量的方法传递信息,那只能处理单个证书的情形,因为全局变量只能hold一份信息;另一个方案是通过RequestHeader的设置把证书信息加到HTTP request header中去。这个方案经过尝试很好用,示例如下:
在view收到post请求的时候,通过检查存放在request.META中的header信息就可以知道证书是颁发给谁的,之后就可以针对不同的人做不同的响应。

3. 浏览器访问
当Apache,Django设置好之后,就可以通过浏览器进行访问了。首先需要在客户端的电脑上安装客户端证书,然后在访问的时候浏览器会弹出窗口,这时选择对应的证书就可以打开网站了。例如,在Chrome中,选择settings-show advanced settings就可以看到
Screen Shot 2015-07-15 at 6.43.55 PM
然后在访问的时候选择刚才安装的证书
Screen Shot 2015-07-15 at 6.44.57 PM

安装证书的时候需要提供同时包含公钥和私钥的文件,pfx或者p12格式。之前我们提到生成证书的过程生成的是独立的公钥和私钥文件。可以通过以下命令做转换

4.Python访问需要客户端证书认证的Rest API
Python跟http相关的模块比较混乱, urllib2, httplib2, requests, pycurl都可以用来访问RestAPI,但是使用起来的复杂程度各不相同。有兴趣可以参考这篇blog,它对这几个模块访问RestAPI的方式做了详细的比较。总之,结论是requests用起来很方面。
requests天然提供对客户端证书认证的支持,直接这发送请求到时候带上证书的路径作为参数就可以:

上面的cert参数可以是一个指向pem格式证书的字符串,也可以是一个tuple,分别包含cert和key的路径。
requests的一个缺点是它只支持pem格式的证书(不包含密码),但是通常我们得到的都是倒出时包含密码的证书,比如pfx。把pem放在机器里看起来不是很安全。Github上这个open issue也有讨论。
可以通过以下命令把pfx转成pem格式:

这就是end-to-end全过程,大功告成。

海外用户观看视频的正确姿势

刚才看到友人前几天写的一篇博文:海外用户观看美剧的正确姿势,突然就想哈哈大笑。原来大家都在想一样的事情。

先借一张图来说一下这个思路:在东亚找一台云主机下载,然后上传到GoogleDrive,当然也可以是OneDrive或者AzureStorage, whatever。然后在家里通过GoogleDrive/OneDrive同步,或者链接到AzureStorage访问。
downloadx800_jpg_pagespeed_ce_OUNfE-4oh7

友人在瑞士,据说当地法律并不限制个人用户下载盗版内容,所以这个解决方案没什么问题;可是放到其他大多数资本主义国家可能就不太行了。因为上述操作实际上仍然涉嫌通过云存储上传/下载盗版内容。当然上传的行为发生在东亚某地,所以可能没有法律限制,但是下载行为却真实发生在腐朽的资本主义境内。

而我最近考虑的另一个类似思路是:在东亚某主机上把下载的内容文件分割成很多碎片,每个碎片都是一段没实际意义的比特流,然后再把各个碎片分布上传到不同的网络存储上。这样不存在从任何地方上传或者下载盗版内容的操作,因为上传和下载的都只是一段比特流而已。只有自己知道具体的算法来分割和组合这些碎片。只有这个算法本身是属于盗版的,不过获得这个算法的过程发生于东亚的某台云主机上。
其实跟p2p软件的思路很像:p2p软件的每段比特流下载都不是完整意义的盗版。可是p2p在传播比特流的同时传播了组合比特流的算法,所以是非法的。
有版权方面的专家提供点专业意见么

ThinkPad X1的可怕体验

从06年买第一台笔记本开始,就逐渐成为了笔记本的重度用户,家里一直都没有台式机了。在移动终端日渐发达的今天,如果在家大多数时候仍然习惯选择使用笔记本。

我本来也不是数码产品的重度粉丝,没什么好说的。无奈前两周从公司领了一台X1 Carbon Gen2回来,在度过了不适应到两周之后就突然挂掉了,要换主板至今还在等零件——顿时对ThinkPad失望到极点。

X1之前先是用了很久的X220 Tablet,除了觉得Tablet这个特性基本无用之外,还是非常喜欢的。传统的ThinkPad键盘,传统的小红点和鼠标左右键都特别顺手;质量也没的说,特别皮实耐用。然后自家买了一台X230来用,性能质量也都没有问题,可惜键盘换成了巧克力式的,手感略差。这台230是机械硬盘,用起来一度觉得很崩溃,直到有一天换了SSD之后才发现它也可以如此流畅。

然后就是X1了,拿到手的第一天就很崩溃:

  • 小红点手感变差。看上去很劣质的样子,似乎随便摇几下就会掉下来。机械式的左右键取消了,变成一块儿更大面积的触控板——我原来就是直接把触控板禁用的。
  • 大小写切换键CapsLock不见了,那个位置被两个个头很小的Home/End取代。想要输入大写字母有两个方法:按Shift+字母组合——我知道有人很习惯这个,可是我一点也不喜欢;或者快速双击Shift键,这时候Shift键上会有一个小LED灯亮起,表示切换到大写——凭什么要我双击。
  • 跟随而来的另一个不便就是Home/End被挪到了CapsLock到位置,我写code的时候经常用的两个键就这样突然从右手位变到了左手位,还缩小了很多。于是错误的情况经常发生。
  • 最上面一排功能键F1-F12连物理键都没有了,变成了一排触控点,而且可以切换,一会儿是控制音量亮度,一会儿是打开麦克风,一会儿又变回了F1-F12——尼玛我debug的时候一不小心屏幕就暗得看不见了,这是什么体验。
  • 数字1左边的~键被挪到了右下角,那个位置成了Esc。。。其实不是什么大事儿,可是我天天要输好多遍的password里边偏偏有个~,在一天输错了数次密码之后,我只好选择改密码。

说来说去发现其实就是在吐槽键盘。对大多数笔记本来说,性能都不是大事儿:差异无非是键盘体验,重量,续航,屏幕。Intel推出超极本之后重量不是大事儿,而windows笔记本的续航都不怎么样;至于屏幕嘛,那就继续吐槽一下这个高分屏体验吧。
确切的说这不是X1的错,所有的windows笔记本上高分屏体验都很烂。我一直不太在意屏幕,1366×900也照样用得不亦乐乎,直到拿到X1看到所有的图标都变得咪咪小,才恍然大悟原来这就是高分屏啊。像小白一样去百度知道学习如何放大显示。尽管放大之后系统本身和微软的主流程序都可以基本正常使用了,但是仍然有那么些想死的时候:

  • 比如远程到另一台电脑之后,远程桌面上的图标忽然变得咪咪小,不能放大。
  • 比如截屏之后粘到outlook的邮件里,我擦怎么突然图片变得巨大而模糊来——我猜可能是outlook放大显示的问题,可是我真的不知道别人收到邮件以后会看到什么样的图片。
  • 比如打开某些非微软多程序的时候,要么死活不能放大,要么放大完丑得不想再看到它。这其实也不完全是微软的错,为了兼容各种原来的应用,高分屏没办法做到完美体验。可是我是用户,我干嘛要理解微软的苦衷呢。用了Retina的MacBook Pro,才知道什么是完美的屏幕,舒服的让人不能自拔。
  • 最后不得不提一下品质。其实我是不太相信品质这个词的,大家的笔记本都是一样的流水线下来的东西,能有多大差别的,我当年买过低端的明基本,戴尔本,东芝本,都用得好好的没出过任何状况。可惜这台X1从一开始就觉得不太好,系统稍微忙一点风扇就开始疯了一样的响;有时候已经sleep了还会莫名其妙的风扇狂转;用了两周之后就彻底崩溃进不了系统了,IT也没告诉我具体原因,只说要换主板了。这次我终于相信品质是有差别的,或许X1 Gen2的设计,尤其是散热方面是有缺陷的。

    既然提到了MacBook Pro,就顺便比较一下:重量虽然比Air重很多,但是男士用起来完全没有问题,仍然觉得很便携;续航没有10小时也有7,8小时,没有具体计算过但是很少为没电发愁,可以专心使用一整天是件很开心的事儿;屏幕如上所述;键盘手感略差,不如巧克力式的ThinkPad键盘,感觉主要是键程短,更不如X220之前点传统ThinkPad键盘。至于苹果的系统,比windows难用很多;好在现在的应用大都是基于web的,不太关os的事情。

    吐槽完毕。总而言之,怀念当年ThinkPad带来的美好体验,终于被Lenovo折腾得差不多了。所谓对创新就是三天两头把键盘的样式布局变一变,而且越变越差,把这些最经典多东西统统变没了。如果不是工作原因,我已经基本不需要使用windows了,Mac本上有非常好的体验。如果说windows笔记本还有什么希望的话,我觉得已经不在ThinkPad而在surface了。在商店里数次把玩surface都感觉不错,完美对移动办公选择。希望surface 4会进一步改进,到时候入手一台继续比较。至于ThinkPad,就把这些年来的美好体验当作对经典的记忆吧。

新玩具

好久不见。
发个最近搞的新玩具出来:树莓派Raspberry Pi. 一个ARM架构的小主机,只有名片盒大小。我买的这一款是model B,900Mhz A7架构的cpu, 1G的内存,有4个USB接口,hdmi接口。。。售价35美元。最近刚刚出了model B+型,配置更好价格不变https://www.raspberrypi.org/products/raspberry-pi-2-model-b/

树莓派最初是设计来作为廉价电脑给小朋友们学习用的,后来逐渐在geek中流行;最近很火的IoT概念更是让树莓派出现在各种奇奇怪怪有意思的场景中。它可以很容易的跑linux,有专门为它定制的Raspbian发行版--听名字就猜得到是基于debian的。

于是,最容易想到的应用就是拿它做一个高清播放主机,播放在线视频或者做bt下载播放机都不在话下。只有名片盒大小放在客厅很合适。除此以外还有更多好玩的应用,比如见到过有人拿kindle作为ssh的客户端,远程到树莓派的主机上,这样就可以实现在户外一边野营一遍写code了,配上太阳能电池或者移动电源在荒郊野外用上几天不成问题。还有更多的人用它来控制其他设备,做IoT。比起单片机来说它功能强大很多,可以做更多的事情;而且基于linux系统,可以轻松的用python,java这样的高级语言来代替汇编或是c,开发速度快很多。还有人拿很多很多个树莓派来搭集群,虽然性能肯定一般,但是能花几百美元就体验一下搭集群的感觉看来也不错哦。

我也没有想好可以用它来干嘛,就扔在那里跑个linux的小服务器需要的时候ssh连一下也挺好的。

WP_20150131_003

WP_20150413_001

来看看12306泄露的用户数据

昨天来自乌云网的一条关于12306用户数据泄露的消息被到处转载,迅速传播。据说大量用户登录导致12306第一次并非因为抢票而瘫痪。跟很多人一样,我因为懒惰和记忆力差,所以喜欢在各各网站用同样的密码。这样做最大的危险是,一旦某一个网站因为安全漏洞泄露了密码,那么拿到密码的人可以用同样的密码去猜你在其它网站的密码,一猜一个准。所以像昨天这样的事件发生以后,登录12306改密码其实是无济于事的,你得把所有跟12306用了同样密码的地方全改掉—-要一下子想起所有注册过的网站,好难啊。

所幸后来又有消息说,昨天只泄露了很小一部分的密码,不到14W。12306网站声明称,密码并不是从12306内部数据库泄露出来的。从泄露密码的数量来推测,我是比较相信这一说法的,如果是12306数据库泄露出来,那么就远不止这个数目了。我们就姑且相信12306真的没有用明文存密码吧……如果泄露不是来自于12306,那最可能的途径就是大家抢票用的各种抢票软件了。用过的人都知道,抢票的时候要把各种信息都输入在抢票软件里边的。抢票软件花样繁多,来路繁多,万一用了恶意的或者愚蠢的抢票软件,那密码被偷去是易如反掌的事情了。

我每年抢票的时候也都用了一些猎豹,360之类的抢票软件。所以赶快去搞了一份泄露的用户数据来看看自己有没有中招–所幸没有。庆幸之余,也正好看看这份包含13w+用户数据的文件,分享一些有意思的东西。

首先说明一下,根据我看到的这份数据,我怀疑数据的来源是有一定倾向性的。换句话说,这份数据可能代表了某一类人群,放大到所有互联网用户上可能并不准确。

1. 密码的长度
大家都知道密码越长越安全,因为如果黑客用计算机破解密码的话,越长的密码需要花越多的时间。当然越长的密码也越容易忘记—-所以很多人像我一样,都喜欢偷懒不用太长的密码。
从这13w+个数据中可以看出,绝大多数人的密码在6到10个字符之间,用8个字符的是最多的。所以为了增加你密码的安全性,建议使用11个或12个字符的密码,这样你已经比绝大多数人的密码都复杂了,而且也不用花太多精力,只需要多记忆一两个字符。
PWD_Length

2. 密码的复杂程度
通常来说,混合了数字,字母和特殊字符的密码比较安全。大多数人喜欢用字母和数字作为组合,用特殊字符的人就很少了。这份数据里边只有1%的人在密码里使用了特殊字符,其他的都只包含数字和字母。
所以如果你想自己的密码比大多数人更安全一些,另一个选项就是使用特殊字符,随便在密码中间嵌入一个特殊字符就安全很多了。
PS:刚刚经人提醒,12306网站上居然只允许用字母,数字,下划线做密码,真是狗日的啊
SimplePWD

退一步来说,我们把大写字母也当做一种特殊字符,来看看多少人的密码里仅仅使用了数字和小写字母—-98%。如果你的字母里用了大写字母,恭喜你,你已经属于仅有的2%了。
SimplePWD2

除此之外,这些密码里边常见的模式还有:
姓名缩写和生日的各种组合
手机号码的某些位
qq+几位数字(这种一看就知道也是qq密码,我就不去试了)
123456abc
键盘上的一些位置比如123zxc

看完了密码,我们再来看看用户的情况。

3. 注册邮箱
关于注册邮箱使用的分布我觉得特别有意思:用qq和163邮箱注册的用户占了这13w+人的绝大多数。而我以为非常流行的Gamil, Hotmail和Yahoo邮箱分别都只有一千多。我个人作为gmail和Hotmail用户,在这里边属于绝对的少数派了。关于这一点我有两种猜测:

  1. qq和163邮箱用户确实占了中国互联网用户的绝大多数。首先qq用户群是无与伦比的主流,而每个qq用户只要知道自己的qq号(废话)就自然记住了邮箱,比起要去单独注册一个邮箱容易的多;而网易邮箱只少在当年Gmail出来之前也是非常有人气的。看来用Gmai和Hotmail的所谓互联网从业人员们,已经离主流太远,太不接地气了
  2. 还有一种可能是,密码被泄露的这些人大多时候qq和163用户。比如qq和163的用户更可能用到某公司的抢票软件?

EmailServer

4. 年龄分布
从用户的年龄来看,绝大多数是80后,90年代初和70年代末的人群次之。这个应该比较好理解,需要抢火车票的更多是正在社会上挣扎的80后们。年纪再大点的人已经有老有小,生活相对稳定,不再需要太多漂泊;而90后尤其是95后基本上还在家和学校。
Age

另一个有意思的是,还看到一些早到1920年,晚到2014年的身份证号。对1920年这样的身份证号,我猜测可能是某些人用家里老人的号码注册了买票,2014年的身份证号就不明白了,难道不是16岁才有身份证号吗?

5. 性别分布
泄露数据的用户93%是男性,女性只占7%。我不太相信中国抢购车票的男女比例是93:7 —- 如果这样的话说明有很多男性在帮女的抢车票:) 更可能的原因是男性用户占到了抢票软件使用者的绝大多数,因此中招的也更多。作为抢票软件的作者们,你们应该反思一下为什么自己做的软件那么复杂,女性用户都不能使用了:)
Gender

6. 星座分布
除此之外,还想看另外一些好玩的数据,比如他们的地域分布,星座分布。地域分布根据身份证号逐个确定省市有点麻烦懒得弄了;这里姑且看一个简单版的星座分布(只看月份,不看二十三四号切)。
我相信这接近于中国年轻人在各星座上数量的比例,而不太相信某个星座在抢火车票这件事情上会有某种特别的行为。
constellation

该不该有推荐系统

现在网上的很多应用都有个性化的服务,比如在豆瓣你可以听私人电台,在亚马逊购物你会收到一堆邮件推荐你可能会感兴趣的商品,或者你在google搜索一个关键词,得到的结果和另一个人搜出来是不完全一样的。

各家的系统实现可能千差万别,但是最基本的出发点大致相同:通过各种方式猜测用户喜欢的,然后投其所好。所谓物以类聚,人以群分,要知道用户所好,基本上会通过两种思路:知道这个用户是哪一类人;知道某个物品是哪一类物品。实际上系统的策略可能综合两者。

举个栗子,你在豆瓣上给月亮之上和最炫民族风加了红心之后,豆瓣就会挑个小苹果放给你听。它发现你喜欢月亮之上和最炫民族风之后,把你分到了广场舞爱好者这一类用户里边,而广场舞爱好者同样喜欢小苹果,所以就推荐给你了。然后豆瓣又放了荷塘月色给你,因为荷塘月色和月亮之上都是凤凰传奇的作品,联系紧密。

看似简单的想法有时候非常有效,比如用了推荐系统广告投放更精准,推销成功率更好。(当然实现这样的系统并非易事。)

推荐系统并非总是好的。它的出发点是基于相似,相关,因而用户用户从推荐系统得到的东西总是“某种关系更密切的东西”。听歌的时候可能总会被推荐某种特定风格的歌曲,买东西的时候总会被推荐自己或朋友经常关注的商品,甚至在搜索引擎搜东西的时候,排名靠前的都是自己熟悉/喜欢的内容。想象一下两种情景:
A. 每天打开豆瓣永远听到熟悉的歌曲;去买东西总是几个常见的品牌;搜出来的内容都是符合自己观点的;甚至连看到别人的评论都是被过滤过的
B. 打开电台不知道放什么歌,可能一点也不好听恨不得马上跳过,也可能让你眼前一亮—-原来世上还有这种歌曲;买东西不经意间看到一些奇奇怪怪的产品,可能毫无用处,也可能带来惊喜;搜东西的时候无意间发现了一些闻所未闻的内容;评论里好好坏坏都有,可能让你高兴也可能生气
你更喜欢哪一种方式呢?我会选择B。 有句话叫兼听则明,偏听则暗, 推荐系统在我看来恰恰是一个容易让人偏听的东西。生活之所以有趣,是因为有很多偶然事件然后接触到了以前未知的东西,推荐系统降低了人接触这些未知事物的概率。

前几周看到过一个Ted的视频:Beware online “filter bubbles”。实际上这个视频在讨论同样一个问题,一些在线系统自己为是的帮助用户过滤了一些东西(过滤是另一种形式的推荐),这样会影响用户对问题的看法,忽略一些本来有权利知道的东西。
从更高的层面来说,互联网的伟大在于它使得人们可以以前所未有的方式平等的交换信息—-这里不存在一些高高在上的人和组织可以控制,垄断信息的交换传播。可是推荐系统恰恰在用户之上控制了用户可以看到的东西,这是极其危险的。大家都依靠google来获取信息,而google却可以决定让你看到什么不看到什么。

要解决这个问题,至少在线系统应该提供一个选项给用户,让用户自己决定是否启用推荐系统。(其实更高级的feature应该是由用户自己设计自己的推荐/过滤系统)
最近发现google搜索结果页面的右上角有一个选择按钮,可以选择显示或隐藏private results,这样就不错。
不像某逊,一打开页面就超大图片显示我最近浏览过或者之前买过的商品,还不停的发邮件翻来覆去推荐一些商品。且不去说推荐算法多么SB,我买了个电饭锅就三天两头推荐各种电饭锅。。。尼玛我又不是贩电饭锅的。如果推荐这么没水准的话,就不要推荐了,让用户自己安静的逛逛看看有什么有趣的新东西也好。

来看下Azure用户的吐槽

今天,作为Azure的用户,私人邮箱收到一封来自Azure Service的邮件,对上周发生的Azure云计算平台大规模宕机事故做出解释和道歉(http://www.cnbeta.com/articles/347413.htm)。邮件中附带了一个CVP写的blog对整件事做了全面解释: http://azure.microsoft.com/blog/2014/11/19/update-on-azure-storage-service-interruption/

这次事故的影响比较大,波及了Azure 15个数据中心中的12个(Brazil, Australia, China)除外。受波及的数据中心也都比较惨烈,从虚拟机,到网站以及许多其他高级服务全部或者部分不能使用,甚至连用来给用户查看Azure健康状况的dashboard也不能正常工作。到现在总算才把事故的各种遗留问题逐渐清理完毕。

事故的原因很简单,存储服务为了提升性能做了fix,在几周的小规模测试没有问题后同时在各个数据中心部署了这次升级–结果这次升级改变了存储服务前端服务器的一项配置,然后触发了一个bug,服务器无法相应。惨的是出问题的是存储服务,几乎所有其他的服务都依赖于此,所以纷纷躺枪。

认真读了一下上面那篇blog,以及下面大量Azure客户的吐槽,感受颇深。这里列举一些印象深刻的。我相信现在各个企业的云服务或多或少都有类似的问题,这也是为什么很多人/公司对云抱着保守迟疑态度的原因。看到下面的抱怨,或许更能理解什么是客户所想,什么才是更好的服务。

  • Why would you then attempt the upgrade across data centres at the same time? A very important service of ours failed even though we have both north and west Europe deployments. We pay a premium for this and it is now shown to be wasted money.
    很多人问,为什么要在多个数据中心同时做升级?为了做到异地容灾,客户已经花了大价钱在多个数据中心同时部署服务了,可惜还是中招了。。。异地容灾一点作用都没有起到,纯粹浪费钱。
    —-还有人跳出来说,不对啊,15个数据中心不是还有3个好着吗,难道微软是要推荐我们在15个地方都部署么,想赚钱想疯了么
  • “Why was the dashboard marked all green for Azure West despite our TAM and TAs informing us that the issue was ongoing? We rely on the dashboard to know what the health of Azure is, it seems like its more of a PR stunt now.”
    “There was an Azure infrastructure issue that impacted our ability to provide timely updates via the Service Health Dashboard. As a mitigation, we leveraged Twitter and other social media forums.”

    为什么发生事故的时候dashboard还显示一切正常?很多人靠这个来看azure有没有出问题结果失灵了,还是到twitter上才看到的消息。
    —-因为dashboard服务也依赖于存储服务,当存储服务挂了的时候它也挂了。后来微软只好用twitter等渠道来公布消息。
  • “The platform & services are really ingenious and I still trust in this, but you’ll have to improve your behavior much more than a 100% instead of the performance of services.”
    有客户还是信任微软的服务的,但是。。。100%的可靠性比提升性能什么的可重要多了。(工程师式的思维必须要换一换)
  • “For comparison to this anemice blog here is Amazon’s response to a smaller outage they had.
    http://aws.amazon.com/message/…
    Its like a 8th grade English paper vs a doctorate thesis.”
    还有不少人觉得这篇blog写的太烂,amazon出一个局部事故的时候写的声明比这个专业多了。(有兴趣的可以读一下,是专业很多)
  • “During the outage yesterday it wasn’t even possible to kill a server, which means it wouldn’t even be possible to pack up our things and move to a different provider.”
    宕机的时候想把服务器kill掉切换到别家的服务器都不行。。。(只能干等着两三天以后恢复,简直生不如死啊)
  • It seems unless you pay them for a ‘subscription’, you cant report anything to anyone about something not working, because of a fault on MS/Azure side.
    I’m quite competent, and setup and run my own servers for many years, and I dont think I should have to ‘pay’ to let MS know about problems. I’ve talked to their support in ‘India’, and they seem to only have a very basic understanding of computing or anything, and really couldnt grasp what I’ve been trying to tell them about.
    I’m only running web small sites on Azure, but I would be a bit hesitant of running anything more, as it could just stop working, and then you have no one to talk to or help. 🙁 I feel helpless using Azure when there are problems.

    害怕用Azure,因为一旦它出问题的时候会发现自己很无助,不知道找谁寻求帮助。(我不太理解这个人说的pay them for a ‘subscription’是什么意思,莫非客户支持是额外收费的?)但是any way,根据我上次office 365服务出问题打客服电话的体验来看,确实是有很强的无助感。
  • “the fact that this blog was NOT posted on the Azure twitter account, and the complete lack of interaction with customers on the twitter is shameful. We understand that shit happens, but the human side of this could have been handled much better. How hard is it to get a staff person to sit on twitter and answer peoples questions, provide updates, or at least some sign of life. We were hit at a TERRIBLE time and lost huge amounts of traffic. I really like Azure but the total lack of support and communication here really makes me question why I am paying for this service.”
    “This is a press-conference level event, and you should have staffed PIO positions to keep us in the loop. On a side note – You might want to apologize on twitter, and fire your marketing team who started in on promo tweets without even sending out a link to this blog (at the time of this comment…).”

    这两段吐槽大约属于PR范畴了,事故发生的时候在twitter上发了个消息就没下文了,没有和客户的互动:回答问题,及时更新状况。(我也同意这样的事情应该由公司统一的PIO-新闻发布官出面,不知道Azure找了个什么人发的twitter。。。)人在无助的时候,哪个有个人陪着说说话感觉也会好一点吧,做service也是这样
  • “Actually the problem is down to centralization. There are plusses and minuses to that. When many elements in a system are dependent on one thing, it offers a lot of advantages in terms of shared resource, but puts that central thing on a very critical path. This is essentially why the central planning method of the soviet socialist era became too expensive to sustain. The original idea of the internet was decentralization. Instead the state-corporate machine has co-opted that into a centrally planned economy. Ironic really.”
    最后这个属于哲学探讨,有兴趣的话可以讨论下。互联网的核心和本质就是平等(去中心化),云计算确恰恰相反,它要把大量的资源集中在少数的数据中心。这样在带来低成本高资源利用率等好处的同时,也会使互联网变得脆弱,因为一点中心节点发生问题就全部瘫痪。(这个人有句话比较有意思:集中化不好的著名例子就是苏维埃社会主义的失败。。。)

再用linux

自从离开学校来到某软上班就基本没怎么用过linux了。

当年在学校寝室里,就凭着“计算机系的怎么可以用xp”的热情和理想,跟各种linux的发行版一起度过了许多不眠之夜。那个年代ubuntu还没有出现,听得最多的是redhat和fedora。现在家里可能还扔着fedora发行版的光盘,刚才随便search一下居然已经出到fedora20了,真是时光荏苒。尝试了redhat/fedora之后又继续试debian, 玩儿gentoo,觉得只有自己编译kernel才够cool。电脑被无数遍的重装重装,每次安装完又搞各种系统设置程序安装:显卡驱动,网卡驱动;中文字体,输入法,mp3播放器,视频播放器。。。大四那年找来一台奔三10G硬盘的破机器,装个linux居然用来当bbs服务器;再后来读研究生开始追ubuntu,四处分发ubuntu光盘,连实验室的服务器也被装成ubuntu跑crawler。。。

现在想起来,读书的时候真是个美好的年代。每天有大把大把的时间,又不用太多的考虑养家糊口,可以尽管折腾自己喜欢的事情。

刚去某软实习的时候对win的知识寥寥,第一次见别人用vista的时候还挺惊讶(外面真没见几个人用过vista…)。后来因为工作关系基本都切换到win了。如今又要用linux,再装ubuntu,版本号居然已经到14了。

简单的说,整个体验比较顺畅,似乎不太需要像许多年前那样折腾了。先去网上下载ubuntu光盘,然后根据文档用一个叫Universal USB Installer的工具把光盘写到移动硬盘里;接下来重启电脑从USB启动,进入ubuntu安装界面,根据引导点几下鼠标就OK了;中间有一部提示连接无线网络,显然无线网卡已经正确识别。

系统安装好以后稍微熟悉了一下Unity的UI,然后用firefox上网下载了chrome的安装包装chrome,双击就可以了(其实稍微用了下firefox觉得也不错,只是chrome的setting可以多机器同步)。再到搜狗下载了搜狗拼音输入法,也是双击安装。接下来,JAVA JDK, Eclipse, Ebook Reader, Sublime编辑器,Remote Desktop…似乎都很顺利,很少需要在terminal运行什么命令都可以轻松搞定。然后我的日常需要基本就满足了,除了不能用outlook收邮件,没有onedrive客户端。

我相信这样的用户体验,只要稍微有点热情的用户,都是很容易上手并且习惯上它的,不需要是什么计算机专业的学生。而且对早已习惯并厌倦了win的人来说,这样的界面和UI很容易给人眼前一亮的感觉。我读书那个年代的linux geek体验大概以后会越来越少了。

十来年的时间,到底是什么改变了这一切呢。当年我们一帮小伙伴认真讨论过microsoft这样的垄断公司到底怎么才可以被打败,基本都觉得是不可能的;但是现在,虽然win依然在PC领域占垄断地位,但是显然大多数人都同意离开win没什么大不了的了。

互联网行业在这些年之内的突飞猛进功不可没。十年前互联网还没这么发达,大家除了在网上浏览新闻下载资料之外,大部分的需求还是在PC端做的。
比如听音乐看视频,当年大家都是把mp3和各种格式的video下载到本地看。linux的生态系统远不如win完善,很多软件都不好用,这就给linux的用户造成了很大的负面影响,最后迫使很多人放弃linux。比如为了看视频,甚至要自己编译kmplayer;而且由于版权的原因,一个地方下载的播放器并不保护所有的解码模块,又不得不去四处去找;还有字幕,字体等等问题要一并解决—-就看个视频就得折腾这么多事情。如今更多的人可能都会选择在线听音乐看视频了,只要有浏览器就足够了。所以这次装好系统之后我几乎没有去在意能不能播mp3放视频的问题—-不过刚才打开了一个健身操的视频倒也是双击就可以播放。
再举个例子,以前很多人不得不用linux是因为没有office没法跟别人交换文档,现在则可以简单的通过office online完成office文档的阅读和常用编辑工作。
不仅仅是听音乐看视频用office而已,我相信对绝大多数人来说,通过浏览器完全可以满足日常需求的80%-90%。(打游戏除外。。。)这也是为什么google会推出chrome笔记本。

这几年发展最快的是手机/移动互联网方面。这也从根本上改变了人们使用电脑的很多习惯。比如以前PC时代几乎所有人都会用QQ或者MSN这样的即时通讯软件。linux上运行QQ和MSN也是很痛苦的事情。现在我的电脑已经不装通讯软件了,因为大部分时候都靠手机上的微信–微信完全是从移动互联网出发设计的产品,根本没有PC客户端。再比如如今越来越方便的手机支付功能,让大家对电脑端网银的依赖也逐步减少了–中国大部分银行基于ActiveX控件的网银当年也是使用linux的一道砍儿。

移动互联网之外,这些年另外一个技术趋势就是云计算云存储。其实云计算云存储的本质还是互联网,在网速越来越快以后,有了低成本硬件和虚拟化技术的支持,云的概念成为了理所当然—-这样成本低可靠性高。对普通linux用户来说,云计算云存储的出现至少能带来两个好处:可以把数据放到云上,无论在哪里都能访问了,不用像当年一样去考虑怎么跟win的机器共享文件,无论是读windows的file share还是NTFS格式都还是有点麻烦的;另外,如果你真的像我一样有时候不得不用win,那么搞一台win的云虚拟机然后远程过去也是个不错的选择,比如在Azure VM上装个visual studio。

除此之外,开源社区/linux这些年自己也有了很大进步。
这些年很多新成长起来的IT公司都是基于开源技术发展的,它们发展壮大的同时也回馈了开源社区,帮助整个开源技术一起壮大。比如大数据方面,从最早的hadoop到后来的pig,hive, storm, spark,都离不开google,yahoo,twitter等等的支持。当越来越多的先进技术是基于linux平台的之后,自然会有越来越多的人过来帮助这个平台完善。
linux现在确实越来越好用了,尤其是ubuntu这样的发行版,对普通用户很方便。以前刚接触linux的时候觉得linux的论坛里都有一种geek思维,似乎一件事情用terminal来做就是比用UI更酷;你抱怨为什么我只是想装个软件而已确要自己去编译去改config。。。他们会说这样才能自己定制,能在源代码的基础上改进。。。其实普通用户根本不需要这些。ubuntu在易用性方面做了不少工作。

当各种因素汇集到一起之后,我终于觉得时隔多年再用linux感觉完全不一样了。比如现在,我开着chrome,用豆瓣听歌,用搜狗拼音在wordpress上面敲着博客,再刷刷知乎,cnbeta,收收gmail邮件,还会偶尔看下手机的微信,一切都很好。

在blog上画地图

出于对地理和旅行的热爱,一直都对绘制地图很感兴趣。之前有一篇置顶的blog就是用地图上标颜色来track这些年旅行的足迹的。

当时用的是google提供的geochart来实现的。它有不少文档和sample,照着改改很快就可以做出一个简单的版本。这两天把它改成用D3来实现的了,更加方便灵活,可控性强。–主要是google服务器被强的时候不会受影响^-^;而且以后可以往地图上加更多额外属性。

最近因为工作的关系,接触了一些D3。D3是一个javascript的library,主要用于以数据驱动的方式来操作网页的DOM object。简单点说,用D3可以方便的在网页上根据数据来画图。比如你有一组报表数据,在excel里边点几下就可以根据这些数据生成柱状图,折线图等等;而D3的用途就是在网页上画这些图。现在各种应用都是基于web的,在网页上画图就很有用了。

D3自然可以用来画地图,只要提供一组用于描述地图的数据就可以了。所谓地图数据,主要就是一堆的坐标点,你把这些坐标点依次连起来就可以得到一个多边形区域–地图就这么画出来了。D3接受GeoJson和TopoJson格式的地图数据–其实就是用json格式描述的地图数据,大同小异。

网上已经有很多发布出来的GeoJson/TopoJson格式的地图数据文件,不过以欧美的为主。如果要画中国地图的话,一方面精度和信息量不够,比如要绘制市县级别的图,或者要在地图上加入其他河流,公路等信息;另一方面有些地区会有问题,比如台湾,藏南。所以建议使用国内发布的地图数据。大部分地图数据使用shp格式,http://ogre.adc4gis.com/这个网站很不错,可以在线将shp格式转换成GeoJson, 而http://www.mapshaper.org/则又可以将GeoJson转换成TopoJson。所以想画什么都可以啦。

最后share一个简单的画中国地图的sample,外加已经转换好的省会坐标以及省级行政区图。下次准备试试找一些公路铁路河流数据的图来玩儿。