豪斯医生的除虫之道

豪斯医生的除虫之道
电视剧《豪斯医生》终于要告一段落了。从第一季一直看到第八季,这可能是我除了《成长的烦恼》以及《神探亨特》以外又一部看全了的美剧。(当然像《英雄》《终结者编年史》这样半途而废的不算)
豪斯医生对我的吸引力,是在于其推理的内核。剧中豪斯所破解的种种病因,对我来说可以说是半点不懂。解释病因时如果没有那些动画,翻成中文我也不懂他在说什么。而那些医学名词,除了记住几个LP, CPR, Steoroid, kee-mo之类的词供以后装逼时用以外,也没剩下什么。但是电视剧本身推理的脉络,还是很清晰的:病人得了怪病,医生提出种种假设并去现场一一求证。医生钻进各种死胡同,最后灵光乍现破解案件。由于我对医术不懂,所以不好妄言这是不是本格推理,不过如果是找日本编剧写剧本的话,豪斯高太郎恐怕要在恍然大悟后在聚光灯下转向观众说:病人得的是xx病无疑了,那么我是怎样知道病人得的是xx病呢?电视机前的观众朋友们,我们一会见~~
撇开此剧的本格内核不说,豪斯医生诊断病情的方法竟也暗合我等软件工程师炼化代码中性命交关之头等大事–debugging.
Debugging相信当过软件工程师的朋友们都不陌生,那真是程序员的噩梦。记得我刚学写程序的时候,第一个稍有规模的程序(走迷宫),写好后调了一个礼拜才调通。相信各位的办公室中也常常流传着“某某bug过了半年才调出来”这样的传说。debugging是项目计划中最容易忽略的一部分,也是最不好估计的一部分。有多少程序员为了程序中的一个错茶不思,饭不想。也有的朋友因为承受不了半年调不出一个bug的压力,放弃了程序员这份职业。
豪斯医生的诊断思想却可以给debugging一个方法上的指导。豪斯的differential diagnosis,是一种系统的诊断病人病情的方法。他的方法有以下几个特点:
1. 根据症状列出可能的病因,并一一排除之。
豪斯医生诊断的阵势一向是把症状一一列在白板上,然后由众小强逐一提出能解释这些症状的病因,然后再逐一排除不能完美解释症状的病因。如果遇到不能确定的情况,则由众小强去做各种测试来验证。所以第一次会议后众小强验血的验血,拍片子的拍片子—-我多么希望我debug的时候也能有这么大阵势啊。
debugging也是这样,程序员首先要尽可能的收集和程序有关的信息,比如断点状态,程序log,错误表现等等。根据收集到的结果来对错误的原因做出各种猜测。如果不能够确定的,则会对代码进行单步或者插入更多调试信息等方法来排除错误猜想。
注意这一步的关键是排除,而不是证明。我们做的各种试验,目的是为了能够排除我们的某个猜想。关于一个错可以有各种猜测,但是只有一个是正确的(也可能一个都没有),这个阶段我们不是要选定一个方向深研进去,而是设计一个试验能够验证这些方法是否正确。所以要首先动手去排除那些容易排除的原因。我常常看到一些程序员盯着某个最可能的原因研究了很久,其实在第一阶段排除干扰,确定不是各种简单错误才是重要的。
2. 调查病人的居住环境
这也是豪斯医生的老套路了,每集都会派两个小强到病人的住所去收集各种病人用过的东西来确定病人有没有可能接触了某些有害物质。程序员在debug之前也应该确定一下程序的执行环境有没有奇怪之处。很多时候程序的错误是因为没有考虑到某种特殊的外部条件,如果程序员可以在不同环境下跑一跑程序,也许很快就能发现错误的根源。
3. 发现病因,再治疗症状
记得豪斯医生中有一段戏,13怀疑病人得的是A或B病,这两种病都能用某药治疗,于是建议用该药。但是豪斯不同意,因为这样虽然治好了病人,但是“我们还是不知道她得了什么病”。
好吧,作为一个医生这样想真的很变态,但这是一个很好的debugging思想。debug的时候要找到的是 root cause,而不是仅仅把出错的症状绕过就了事了。一个程序员应该像推理小说中的名侦探一样,犯人,手法,证据,一样都不能少,否则是不能把众人召集起来做出破案宣言的。
4. 争分夺秒
豪斯面对的是一个随时都会咽气的病人,程序员面对的是一个随时可能推迟发布的产品。从这点来讲,程序员的压力并不比医生小。每个花了半年才调出的错误可能都伴随着一颗已经逐渐变得冰凉的客户的心。一个优秀的除错大师,不仅仅在于能调出多古怪刁钻的bug,也在于能多快的调出一个bug。对于小bug要秒杀,对于困难的bug则要有系统性的方法来应付。
5. 寻求灵感
Debug这件事,程序员的阅历越丰富,越容易想到错误的原因。平时应该多参加各种闲聊,也许某人对中东局势无意中的一句评论就能瞬间点醒梦中人。豪斯医生虽然有前面这些强大的工具,可是真正解谜那一瞬间都是在干别的事中得到的。所以平时多积攒些人品,关键时刻才有可能瞬间爆发。

Proxy 杂症一则

今天忽然发现连不上公司VPN了,按照惯例在chrome中把proxy设为direct connection,但仍旧连不上,试了好几次都这样。

忽然想起前两天升级 chrome  browser 到 release 18,顺便把proxy switchy换成了v18兼容的proxy switchy sharp?  难道是因为proxy switchy修改的是全局proxy而proxy siwtchy sharp修改的是局部proxy?

进入IE设置想修改一下全局proxy试一下,却发现被系统管理员限制了设proxy的选项. 怒!难道以后都没法连公司vpn了?可以不用在家干活了?

开始疑惑为啥原本chrome browser里的proxy switchy能修改全局proxy? 明明跟我一样的权限啊?

眼前一亮,开regedit,寻找预设proxy字串,在ie设置里面找到,清除之,重新打开VPN客户端。搞定!

结论:Win7的policy设置还真的只是个摆设。

升级光纤后补,设置二级路由

自从上次升级光纤并修改网络拓扑之后,发现有了新问题,家里有台电脑怎么都上不了网。上网一查,发现是电信的光纤路由限制最多四台电脑上网。说起来这个限制并不太合理,很多人家里都是人手一台笔记本,加上智能手机或者tablet在家也通过wifi连接,很容易就能超限。像我这样家里还有媒体服务器和网络媒体播放器的,一个家里有七八个mac地址是很平常的事,所以一定要想办法把这个限制绕过去。解决办法是用超级用户帐号登陆电信的路由器关掉路由功能。可是卧室有台媒体播放器只能连在电信路由器上,怎么办?

研究了网上一些文章,很多人都提示可能是因为电信路由器对dhcp分配和DNS设置了限制,所以还是需要用自己的路由器分配ip地址和DNS服务器地址。。在咨询网络达人以后,决定还是使用二级路由的方法。

1. 将自己的无线路由器WRT54G设回gateway模式,开启dhcp,并将网段改为192.168.0.*,无线路由器的WAN口接在电信路由器的LAN口上。此时家庭网络出现两个子网:192.168.1.x是电信的子网LAN1,192.168.0.x是WRT54G的子网LAN2,LAN2通过LAN1中的一个网口连接互联网。

2. 将无线路由器的WAN口设为static IP, 设成一个预设的ip地址192.168.1.y。并手动设定DNS server地址。

3. LAN2中static ip的电脑都修改网段为192.168.0.xxx,并修改脚本中server的ip地址(当初写脚本的时候没考虑到修改网段的问题啊!)

4. 此时LAN2中的电脑都能连接互联网,但卧室中的媒体播放器ip地址为192.168.1.xxx,无法和其它机器互联,怎么办?我需要媒体播放器连接服务器的icecast端口来听广播,所以只需要能连接这一个端口就行了。

5. 无线路由器的IP table中增加一项,将发送给192.168.1.*的包通过WAN口转发给LAN1。并设置8000端口转发给LAN2中的媒体服务器。

6. 修改LAN1中媒体播放器的脚本,将原本连接媒体服务器改为连接192.168.1.y。这样LAN1听广播的功能也就实现了。

不清楚电信封四台以上机器的方法,所以还不太清楚这个办法是否有效,要观察一段时间才知道。如果不行的话只能去要电信路由器的超级用户密码了。

升级光纤,不花一分钱修改网络拓扑

小区的ADSL要升级成光纤了。很早就期盼这个消息,无奈小区的光纤改造迟迟没有完成,现在终于改造好了。国庆前电信公司就联系我要安装光纤,但是国庆节那一天安装时出了问题,原来ADSL的线无论如何都抽不动,电信公司的人说,小区物业不上改明线(我也不愿意)于是电信公司的人就回去了。

当时因为是早上9点,脑子一直昏昏沉沉的。等一杯咖啡下肚,忽然想起,电信的人搞不定线路,物业应该能行啊,于是打电话给物业,物业的人告诉我说,他们会打电话给电信帮我搞定这件事。于是我就等电信给我电话了。

之后就一直在想,如果线真的进不来,那么怎么办?因为家里有一个Atom Media Center兼NAS+Download Station,一个台式机,还有一个link station放在卧室当闹钟和流媒体客户端,加上无线设备若干。静态ip和动态ip都有,家里的网络拓扑虽说不复杂,可也算是牵一发而动全身了。如果不能把光纤拉到现有的路由器位置(所有房间的网线都汇到客厅一角),那么连线就比较麻烦了。

想了好几个不同的解决方案,一个是把无线路由器和光猫放在外面的弱电箱里或者放在门口的位置,然后把所有设备通过无线上网。这是最简单的连接方式,可是免不了要给PC机买usb无线网卡,再加上为了保证内网速度而升级成802.11n的费用,凭空就多了差不多一千大洋的开销。

因为打听到电信还会送一个无线路由器,所以就想到了第二个方案是利用media center上自带的无线网卡,连上电信送的无线路由器。然后把media center设置成网关,转发内网所有的包。无线设备则可以通过原来的无线路由器连接上网,这样可以保持所有内网设备的互连接性,然后所有设备通过网关,穿过54M的无线链接上网。这样至少在电信把上网带宽升级到50M之前,外网访问是不会有瓶颈的。而内网还可以继续通过百兆网络连接。

这样合计完了后,就等电信给我打电话,可是电信老也不给我打。过了两天,发现家里的宽带变成4M的,于是觉得要是不升级其实也没什么,4M带宽其实已经很够了。其实要搞什么光纤入户嘛,光纤统统连到楼下的弱电房,统一用网线给信号岂不是更方便,家里还能少一个设备少一根线。

结果享受了4M宽带没几天,电信又给我打电话了,预约周六来装宽带。这次来了后依旧拉不动电话线。但是四处转了转,在卧室门后一个空的接线盒里拉出了一根网线,原来是长城宽带的网线!我都不记得这个空盒子了,只记得当初装修时为了隐藏这根网线还专门买了个空的插座盖盖在上面,没想到这个就是长城宽带的网线啊。于是通过这个口把光纤拉进了卧室。拉好线以后安装工人就走了,说下午会有人过来安装设备。

原来的方案二应该还是能用的,但因为卧室有一个网络接口,就在想能不能利用这个网口避免无线桥接。想法是光猫放在卧室里,然后通过网线和客厅的无线路由器连接,这样路由器拨号后就能上网了,几乎所有的设备连接方式都不变。唯一的问题是卧室有一个link station,用来当闹钟和网络收音机的,因为光猫上只有一个网口,所以link station必须改成无线上网了。但应该不太难搞定,买个usb wifi卡就行了。这样合计着,我就先去网上搜usb无线网卡了。

不一会安装人员来了,带来了一个光猫和一个—-无线AP?! 一问之下才知道现在华为的光猫HG8240内置一个四口的路由器,带三个LAN口,一个IP tv口,和两个电话口,客户端免拨号,无线功能则通过一个无线AP完成。(说明书上说也有光猫无线路由3合1的HG8245)

真是计划没有变化快啊,这样卧室的link station也许就能直接连接在8240的LAN口上,另外一个LAN口接到客厅的无线路由器,这样不用多花一分钱就搞定了所有设备的物理连接,还白得了一个闲置的无线AP。但是网络拓扑发生了变化,原来的无线路由器不再需要拨号了。

按照最新的方案连接好了所有的设备,整理好连线后,欣喜的发现内网已经可以完全互连了,而且所有静态IP的设备已经可以上外网了,但是无线设备上不了外网。于是连进无线路由器查看设置。发现无线路由器的IP 192.168.1.1和电信提供的路由器IP地址冲突,于是修改成另一个IP。但发现无线设备还是上不了网,主要是dhcp拿不到dns server地址。接下来把无线路由器的网关功能关闭,改成路由功能。重启各个设备后所有设备都能上网且能相互连接。

于是家里的网络拓扑变成了二级路由设置,一台设备连接在一级路由上,其它所有设备连接在次级路由上。拓扑结构的修改没有花一分钱。虽然不太明白为啥这样就能连接成功(上大学时网络课一听就想睡觉),但又能上网了还是很好的。上网速度变成了10M,开网页感觉到了略微的加快,但上传还是坑人的512K,在高清电视上高清视频聊天就不用想了,等待电信以后再增加带宽把,听说今年E9用户都会升级成20M呢,期待中。

通过eye-fi将手机和相机的无缝连接

最近常常从手机上传图片到微博上。无奈的是手机拍摄的质量实在是很差。于是产生了用相机拍摄用手机上传的想法。但是相机使用SD卡拍摄,而手机上没有SD卡槽,传输始终是一个问题。看起来解决方法无非是读到pc上,然后通过pc传输到手机上。可是这样就要随时带着pc机才行了。

另外一种解决方法是用tf卡通过卡套转接成SD卡在相机中拍摄,再从卡套中取出tf卡插进手机中上传,不过这样还是很麻烦。

于是想到了eye-fi卡。其实eye-fi卡刚出来的时候就想要一个。可是想了想也不是很有必要,因为从相机中取卡插在台式机上也很方便,速度也快,用eye-fi卡似乎没什么必要。但是最近发现eye-fi卡有了Android的客户端,于是想能不能通过eye-fi卡和手机通过wifi连接来上传照片。于是买eye-fi的念头又起来了。

上网搜了一下,现在eye-fi卡有三种型号,X2 Connect 4G, X2 Mobile 8G,和X2 Pro 8G。Connect 4G是基本型,其它两种主要的区别是多了地理标注的功能以及能够一年免费连接美国的众多公共热点,pro版还有raw上传的功能。一些社会化功能比如上传到facebook或者youtube(都已经被墙)则三者都有。我在网上找到一篇文章仔细的比较了三种卡的不同。结论是如果没有无线上传RAW的需求的话,connect 4G就行了。因为一些mobile和pro的功能(比如连接公共热点)可以通过connect在网站上升级得到……看到这里我无语了。eye-fi的产品线中各个产品的区别有点模糊。

我比较关心的是能不能和手机之间直接通过ad-hoc的方式上传,而不需要通过家里的无线网络。否则就变成只有在有无线网络的时候才能跟手机互传了,失去了移动上传图片的意义。查了一下有关这方面的资料。eye-fi支持direct mode,也就是eye-fi卡自己建立一个wifi的接入点,然后手机上的eye-fi客户端程序通过wifi和这个接入点连接。这样即使在户外没有wifi网络的地方也能使用了。pro版直接支持direct mode,connect版可以通过免费升级firmware支持direct mode……好吧,看到这里如果再多花四百块买pro版就有点傻了。

于是在淘宝上下单买了一个,买回来的eye-fi卡就像一张普通的SD卡,还带一个读卡器。

把eye-fi卡插进读卡器,再插到pc上,就可以设置了。设置的过程网上有很多叙述,这里就不重复了。

比较坑爹的是,这张卡除了自带的读卡器,其它的读卡器都不认!无论是usb读卡器还是express card的读卡器都不行,看来这个读卡器一定要保护好啊,丢了就只能无线传输了。

配置好direct mode后将卡装进照相机,在手机上装上eye-fi客户端,和卡配对后就可以拍摄了。如果连接顺利的话,拍好后大概过两三秒就开始传输,传输完后手机上会有一个图标表示传输完成。

第一次传输貌似有点慢,因为卡插在电脑里不知道什么时候建立wifi接入点,手机也需要一段时间来认出接入点,另外貌似只有应用启动时才能连上,看来还需要练习一下操作习惯。

弄成功以后觉得还是挺方便的,拍好照片后可以立刻上传到手机中,然后在手机中通过合适的方式分享。这样就能用相机拍好照后通过手机很快分享,也不用受限于手机上那个效果很差的摄像头了。

值得分享的经验是如果用raw+jpeg拍摄的话,可以把jpeg设为低质量小尺寸,这样拍好的照片尺寸较小适合通过手机网络上传,同时在eye-fi和手机之间传输时间也短,相对耗电比较少。

还有一小段视频,跳转这里后可以看和手机之间传输的效果。

BTW,在研究为啥其它读卡器不能用的时候,发现这个网站的faq区有一个相当令人无语的警告:

已知Eye-fi卡在使用在Lecia M9相机上时,当取下eye-fi卡时会造成卡槽的物理损坏。

所以如果有哪位是用Lecia M9的朋友就就不能用Eye-fi了,这就是传说中的“有钱人的烦恼”吧?反正我没有这方面的烦恼,我们Geek成天都在为怎样不再烦恼而烦恼!如果你想在自己的相机上使用eye-fi,最好事先去这家的网站上查看一下相机兼容性再作决定。http://support.eye.fi/product-info/camera-compatibility/compatibility/is-the-eye-fi-card-compatible-with-my-camera/ 

个税调整影响

新浪今天报导了审议中的个税调整计划,除了缴税基数从2000上升到3000元以外,累进税率也变为了七档。

http://finance.sina.com.cn/g/20110420/09429721187.shtml

研究了一下新旧税率的档次,发现原先一直到月收入20000元都是交20%的税,现在从9000元开始就交25%的税了。

上网查了四金和累进税率的公式,做了一张图。横坐标是月收入,纵坐标是新税额减去老税额,如果数字在横坐标轴一下,说明会从新税率中得益,反过来就要多缴税。如果月收入在两万元以上就要多缴税了。受益大于两百元的人群基本大约在月收入一万元左右。

因为累进税率的计算十分繁杂,新累进税率的快速扣除系数又未公布,所以图表可能有脱漏之处。有发现错误的话希望能够不吝指正。

clip_image002

太阳岛游记

周末和太太一起参加了team里的活动,去了太阳岛游玩。

说起这次旅行,定行程的时候还是挺波折的。因为要参加的人特别多,光投票就投了三次。一开始想去婺源看油菜花,后来发现行程不好定。于是改为去太阳岛休闲游,在最后一周定下了行程。

2003年曾经参加过team里面的活动去过太阳岛。不过我是喜欢故地重游的,而且喜欢平地走不累的地方,所以也参加了。当时对太阳岛在哪里一点概念都没有,这次才知道是在朱家角附近。坐车一个小时就到了。

度假村里面都是一排排的小别墅,也有低矮的小楼。

image

image 

度假村里面活动还是挺多的。记得之前来玩的时候,因为囊中羞涩,组里又不给很多的活动经费(都用来买烤肉了),所以唯一的娱乐就是跟同事打了一小时的沙狐球。这次活动就比较多了,骑马,双人自行车,还有高尔夫练习场。

高尔夫练习场,不过我是不会打只能装装样子。所有的球都是在草地上滚着前进的。

image 

双人自行车

image

骑马。骑马真的好颠,屁股很疼。还生怕会掉下来,不过这时候想下也下不来了。

image

 

但是应该故作镇静的时候还是要故作镇静。

image

有教练在后面跟着应该不会有什么事吧?

image

河上风景

image

河上水鸟

image

image

美人…鱼

image image

image

晚饭是自助餐,有专业厨师烧烤。

image

image

image

当年的烤肉大会,怎么感觉烤肉用的炉子比记忆中小了很多?

image

image

樱花

最近樱花也开了,周末趁太阳好拍了一些

边上的紫丁香也开了,紫色配上白色很漂亮!

还在小区里发现了一颗长得很标准的桃树,想要拍全景奈何背景太杂。也许是时间不对,光线很难达到最好。实地这颗桃树非常漂亮。

这棵樱花树有种《死神》里的“散落吧,千本樱”那种感觉。

回家的路上看见三只麻雀领奖,奖品猫粮一块

春淡春又浓

春天终于来了!这几天上海气温很快上升,小区里面剩下的几棵树也开花了,于是又去小区里拍了一组照片。

上次没拍的花,这周末又去看,发现居然是白色上透着点红的。有那么点意思。

P成粉红色底的了,感觉调淡了有点意思。

接下来这张就直接奔“三枪拍案惊奇”那感觉去了。不过感觉蓝色的背景并不好看。

这棵树的花密度比前次拍的要高多了,每次下班都看见。

用了raw处理工具以后,浓淡调起来很随意的。比如说调红点。

调紫一点

或者是粉白色

尝试同色叠景,对焦比较麻烦。