2010年9月27日星期一

乌龙的预警

一早起来,机器又不亮了。

我有点纳闷,记得昨天刚摆过乌龙,关机的时候应该没有调显示器的亮度。经过反复确认,试过两个显示器,确认机器果然出了故障。最后没有办法,还是call了dell的工程师。

第二天,dell的工程师过来换了主板、显卡,机器总算OK了。难道上次是电脑自知命不久矣,所以要用如此诡秘的手段来提醒一下我?

有时候,世上就是有这么神奇的巧合。

ps:看来电脑的保修服务还是很有必要的。这个机器我已经call过dell 5,6次了。

2010年9月26日星期日

肖传国与方舟子

事情的经过网上报道很多,且不赘述。

肖传国在中国不仅不少,反而很多,只是有胆量买凶杀人的没这么多罢了。其实中国学术造假,早就到了一个令人发指的地步,既不是这段时间才泛滥,也不是只有方舟子揭露的那么一点点。

中国早已是全民造假,所以近些年来,大家才纷纷鼓噪要“诚信”,所谓缺什么补什么,大抵就是这个道理。

其实学术造假属于最容易判断的一种,远比食品、卫生、医疗等等要容易诊断的多。学术成果是一个易于鉴定的内容,而且不需要什么太复杂的手段,各大权威论文、期刊都有据可查。而且,发现学术造假,事后也易于补救,不像食品问题,除了事往往以人命为代价,难以收拾。

只是,就是这么容易做到的事情,我们也没有做到。

从夸大其词的公益广告就能看出,许多人只管结果,不管手段;好大喜功、要面子,宁要假的一箩筐,也要充个数,虽说从外人眼里,我们不过是“止增笑耳”罢了,但是能忽悠一下自己人,那已经足够了。

我们就连求真的精神都如此缺乏,何谈科学?

可惜可惜,我们这个国家肖传国太多,方舟子太少。

附我们夸张了10到100倍的公益广告词:

刷牙的时候,顺手关上水龙头,一年能省多少水?满满109个浴缸!
如果把白炽灯都换成节能灯,就可以减少上千万吨的温室气体排放,你的举手之劳,却能防止地球变暖!
把用过的纸翻过来再用一面,一百个人在一年内,就能挽救整整一条街的树……
如果每个人都能及时拔掉充电器,那么每年将可关闭两百座百万千瓦火力的发电站。

好大的乌龙

在家里休养了一个月,今天回到厦门。

没想到,过了一个月,突然发现电脑无法打开了,莫非是这几天台风,电脑受潮了?我折腾了半天,拔电源,重新插插接头,怎么搞也搞不定,算了,还是明天打电话找dell的工程师来修理吧。

睡了一觉,早晨起来,突然想起,莫非是显示器的亮度没调?开机一试,果然...

这个乌龙有点大,还好没call dell的工程师。

2010年9月24日星期五

在Mac OS X下动态挂接内存分配的模块

在hero项目的优化过程中,我注意到Mac版本下内存使用比Windows来得多,并且运行时会有缓慢的增长。而Mac下不同于Windows的一点就是没有安装小块内存的管理模块。

前两天尝试让同事将Mac版本下挂上小块内存的管理模块tinymemmgr,但是遇到了一些问题。其它一些没有挂接tinymemmgr的模块会申请内存,交给我们的模块进行释放(似乎是carbon申请的,而释放的代码会链接到我们的主模块hero),接下来是中秋假期,这个工作就暂停了。

中秋这几天,我尝试做一下试验,看看这个优化的效果如何。因为我没有足够的源代码,所以想用动态挂接的方法去加载tinymemmgr。一个比较便捷的方法是启动时增加环境变量:

DYLD_INSERT_LIBRARIES=./tinymemmgr.dylib DYLD_FORCE_FLAT_NAMESPACE=1 启动程序 & 参数

在tinymemmgr.dylib中定义malloc、free等 同名函数即可,这些函数会替换标准库中的malloc等函数。

将tinymemmgr.dylib强行注入进去,DYLD_FORCE_FLAT_NAMEPSPACE必须设置为1,否则不能工作。因为Mac下分为两级的名字,tinymemmgr.dylib中的malloc和libSystem.dylib下的malloc其实不在一个名字空间下。

没想到的是,我测试通过了,但是hero工程却无法跑起来。花了很长的时间诊断,没有找到原因,只是知道卡在pthread的库中,我想应该是有关键的函数重名了。手册上给的警告本来就有使用了DYLD_FORCE_FLAT_NAMESPACE=1有可能导致程序无法启动。像hero这种使用了太多第三方库,尤其是有一些重量库的工程,跑不起来简直太正常了。我试验了一下,cmake也无法启动。

如果不能使用这个方法,我就只能用最后一招了,就是强行hack malloc的代码,注入指令来实现我希望的功能,但是这个方法的移植性很差。暂时没有好的办法,我打电话找陈拓琳求助,他查资料果然有一手,很快找到了一个方法无需使用DYLD_FORCE_FLAT_NAMESPACE=1这个参数即可完成注入,大概方法如下:

typedef struct interpose
{
    void *new_func;
    void *orig_func;
} interpose_t;


static const interpose_t interposers[] \
    __attribute__((section("__DATA, __interpose"))) =
{
    { (void *) my_malloc,   (void *) malloc   },
    { (void *) my_free,     (void *) free     },
}

在tinymemmgr.dylib中定义了这个数据段以后,dyld将知道用my_malloc/my_free函数去替换其他库引用的malloc/free入口。

使用这个方法,可以优雅无损的替换malloc/free等内存管理函数。当然,仅替换这些函数是不够的,还需要处理calloc/valloc/realloc/reallocf/posix_memalign等等函数。

接下来,就是我和系统库的斗争过程。有一些模块使用了malloc_zone_malloc这些方法,这很糟糕。这意味着我并没有100%的hook所有的内存申请(虽然可以这么做,但是这样未免太霸道了,不是一个游戏程序应该做的),我显然没必要给自己找这么多事情做。于是我只好增加了判断,根据标记判断内存是我申请的,还是malloc申请的。这并不是100%可靠,至少理论上不是,这只是权宜之计,不过就测试而言够了。

中途,我一度放弃了对malloc/free的接管,转而去替换new/delete这些C++的分配操作。使用nm可以查出,这些函数的导出符号是_Znam、_ZdaPv、_Znwm、_ZdlPv古怪名字。没事,不用担心,替换即可。但是我又遇到一些问题,编译器生成的代码并不是简单的通过使用上述的函数间接的调用malloc/free去分配释放内存,在某些时候(比如析构、异常处理的时),还是直接使用了malloc。这让我很头疼,于是只好放弃这个想法,转回去hook malloc/free。

标记斗争完毕以后,遇到了新问题。Mac是64位内核,并且有时需要使用SSE2的指令,这使得它要求内存必须是16字节对齐,这可真是一个噩耗:这意味即使分配4个字节,也要给它保留16个字节的空间以便对齐。因为我hook的是malloc而不是Ogre和我们自己工程的new/delete,所以无从知道对齐的要求(Ogre和我们自己的工程应该只要做到4字节对齐即可),只能按照最严格的来 - 就是16字节对齐。在解决了对齐问题以后,工程终于可以顺利的跑起来了。

测试结果是,内存可以略有节省(估计可以节约5-10M的样子),而且不会因为小片内存的频繁申请和释放导致碎片,对渲染效率会略有提升。总的来说,增加tinymemmgr还是有必要的,不过,更大的优化应该是在材质的管理上,目前频繁申请和释放材质的方法是一种糟糕的做法,降低了执行效率,提高内存miss的几率,并且对显卡驱动造成了负担,相比之下,材质管理的优化更加重要。tinymemmgr只要挂接到Ogre上就可以了(这是使用小块内存最频繁的模块),其他模块还是算了,这样可以回避和系统模块之间的冲突,而付出的代价是微乎其微的。

健康与生活

术后已经修养了20天,恢复得还算是较好,但是不论如何,现在身体不可能回复到当年那种全无问题的、令人愉悦的状态。嗯,我当年其实也没有觉得愉悦,只是现在才发现。

有时候,我在想,我应该生活在什么地方,或者说,我向往生活在什么地方?现在我已经有了一个明确的想法:要找一个有优质的水和空气的地方。如果政治空气也很好,那就完美了。

2010年9月17日星期五

观世博会有感

总的来说,这是一个超级无聊的盛会。

基本上,参观者主要做三件事情:

  • 排队
  • 看碟
  • 盖章

说起来,我还真佩服盖章这个活动的设计者(据说是蒙特利尔世博会发明的),这是一个设计的极度无聊而又非常成功的游戏。正因为有了盖章,才使得那些乱七八糟的展馆也有人到此一游,正是因为有了盖章,大家排那么久的队还会觉得物有所值。

世博会大概给我留下这么几个印象:

  • 搭个台子给老百姓看热闹
  • 拉动GDP
  • 场馆门口的队伍长度大抵和场馆所属国家的GDP成正比
  • 非洲人民的确很穷,用不起投影,只能摆摆电视和总统像
  • 非洲居然还有差不多十个国家我没听说过... 好歹我也是经常看地图的人

不按系统要求下线受惩罚?

在翻阅几个网游小说的时候,发现有几个共同的特点:

  • 如果强制下线(不在安全区或是指定区域),可能会回档、掉级
  • 如果系统重启,没有下线可能会无法登录或回档

非常有趣的一点是,如果现实世界某个运营商提供的游戏真的是这么设计的,恐怕早就被玩家用口水喷死了。但是为什么作者会喜欢采用这种设定?是因为饱受官方服务之苦,还是说,觉得这样更合理?更有利于情节展开?

呵呵,如果这些作者去运营游戏,不知道是一种什么情形。

《魔法师的学徒》

很久没看到这么弱智的片子了,情节弱智得有点挑战我的极限。不过还好,我喜欢。

尼古拉斯凯奇扮演的角色巴尔萨真是一个值得尊敬的人,不是说他法力有多高,而是他的脾气真的很好,到达这等境界是需要修炼的。

《盗梦空间》

这个片子给我的感觉没有传闻那么好看,那么值得琢磨。

如果用计算机的术语来理解这个影片的话,每个人的梦境相当于是网站Website,而共享梦境的方法就是VPN,潜意识就是杀毒软件。当你进入另一个人的梦境(对方有管理员权限可以为所欲为)的时候,你的杀毒软件就开始工作,防止恶意站长的入侵。

受制于技术上的缺陷,如果断开VPN连接的时候,没有按照顺序优雅的切断的话,可能会导致帐号卡死(呃,早期的那些通讯设备还真有这些毛病),所以梦境要一层一层的kick,一层层的disconnect。

大抵就是这么回事吧。

ps:这个片子给我感觉其实更像是使命召唤那种FPS游戏,有一组场景组成,包括街头、贫民窟、雪地、桥梁等等,大家在这些场景不停的战斗,如此而已。

2010年9月9日星期四

出院了

在医院呆了一周,终于可以出院了。

术后保养的时间原则上需要半年,最好坚持一年,初期要每周复诊。看了这个时间表,我感觉真是有点崩溃。人体比起机械看起来还是精密得多,如果是计算机软件,我想不需要维护如此之久。在住院的时候,亲眼看到有些故障复发的病人,心里还是有些心惊肉跳的。

回到家中,发现一个问题。因为家里的有线宽带暂时停了,所以就用3G上网。一试才知道,不论是联通的3G,还是电信的3G,统统都是咸鱼状。信号不强,容易掉线。而且,家里移动的信号也不好,不知道是不是离香港太近的缘故,运营商似乎都不喜欢在这里建基站?

2010年9月7日星期二

令人纠结的3G上网方案

因为地处没有固定链路的环境,所以需要找到一个比较好的上网解决方案。

调研了几个运营商,提供的服务各有优缺:

  • 移动 - 移动那个3G就不能叫3G,TD一下,土大了,没法用
  • 联通 - 支持WCDMA,但是限制一个月最多15G,固定出口是网通
  • 电信 - 可以使用wiki & 3G,但是不知道CDMA2000漫游方面表现如何

另外,华为有一个上网卡不错,可以自设一个wifi基站,通过3G访问互联网。这样,只要打开这个设备,所有支持wiki的设备诸如手机、笔记本、ipad都可以轻松使用网络。这个设备支持联通的sim卡,但是没有支持电信的类似设备 - 从技术上应该允许,这个可能是政治问题。而我试用的电信天翼的上网设备(中兴的)用起来不是那么爽,通过USB提供服务,而且只有windows才支持的比较好(Mac下10.6连U盘的内容都读不出,安装也成问题),这让我感觉很不方便。

联通最让人恶心的是网通出口,这样上网速度实在是有点令人难受。另外,15G的流量限制实在有点少,这点流量能干点啥?每天随便动弹一下,都要上百M。如果要走视频这些,一天几个G就干掉了。

ps:中兴的设备做的不如华为好用啊!

忍无可忍,抱怨IT

今天身体恢复得好了一些,打算通过VPN上公司内网看看。

前几天我试图上公司的VPN,但是未遂,我走之前刚好IT更换证书,更换以后号称好了,但是我当时没有试验。

结果果然不顺利。

首先,Tunnelblick(OpenVPN 客户端)报告了一个错误:“can't find GID 'adm'... ”,然后就退出了。

我打电话找IT求助,IT告诉我不好查,因为我用的是Mac系统,让我先切换到Win7下先用着。而我所有的办公环境都在Mac下,切换到Win7我实际上无法工作。我研究了一会,将adm组修改为admin,好了。

登录上VPN,感觉速度很慢(wiki、jira速度不佳,邮件根本无法读取),我不能肯定是我3G的问题还是其他原因,打电话给IT,IT说之前陈拓琳养病的时候也是用3G,速度很慢,最后不知道怎么就好了,可能是因为路由的缘故。OK,我先使用另一个VPN打底,从美国的VPN绕回来,在这个基础上另架一个公司内的VPN。

再收邮件,感觉速度还是很慢,我看了一下,邮件有1942封,估计大部分都是wiki、jira、OA等通知性邮件。我打电话给IT,让他们帮我删除清理一下。结果IT给我一个URL,让我自己上去删除,我说我这么卡,怎么操作?IT说不知道我哪些邮件是重要的,不好处理(我不是说了是通知邮件么?再说,能不能先备个份?)

此刻我实在忍无可忍,手术后积累的病痛,早晨换药的折磨,之前调整系统浪费的时间将我的耐心全部消磨干净。让我狠狠的抱怨了IT一顿:

  1. 连我这个懂点计算机,尤其对通讯方面从事过专业工作的人,折腾得都这么痛苦,那些不懂计算机的人怎么办?自动化系统对他们究竟是帮助还是折磨
  2. 我们需要考虑的是如何给团队贡献价值,而不是玩弄技术(我们的IT技术水平倒是相当不错)
  3. 如果IT部门不能给其他部门提供实质性的帮助,其他部门怎么认可IT的工作,IT如何提高自己部门的地位,提高待遇

想办法解决问题,而不要只是解释,这才是王道。所有的服务部门都应引以为戒啊!

石器时代的互联网络应用

互联网发展到了今天,已经有几十年的历史了,但是,以其易用度来说,我认为互联网应用只能算是原始的石器时代。

先描述我现在采用的上网方法:

第一层:笔记本 -> Wiki -> HUAWEI Router -> WCDMA -> 固网 -> 互联网
第二层:Reliablehost(翻墙VPN) -> 美国某服务器 -> 互联网
第三层:OpenVPN(公司内VPN) -> 公司服务器 -> 公司内网

之所以如此有物理因素,有政治因素,也有安全因素。

毫无疑问,能够把这一切都搞明白,平且顺利配置妥当的人并不是那么多,这给我们实际应用带来了很大的麻烦。上面只给出了网络结构,另外还有一大箩筐的各种证书(各银行、淘宝、VPN等)。而且,一旦有一个风吹草动,我可能就需要断开所有链接,重新恢复一次(否则DNS很容易出错),并且导致正在连接中的服务被终止(比如游戏、QQ)

我期望的生活方式是这样的:

  1. 一个可以上网的设备直接就可以上网。不需要知道各类莫名其妙的连接、协议,不需要时常维护
  2. 有一个固定设备的证书,可以访问所有的安全受限区域
  3. 固定证书具有不同级别的密码,用于访问不同级别的安全受限区域

未来,互联网除了增加新的应用,增加基建设施水准,还需要提高易用性。这应该是一个具有广阔发展可能的领域。

味如嚼蜡

在我了鼻炎相关的手术以后的恢复期,吃什么东西都没有味道。这一段时间我真是亲身体验了什么是“味如嚼蜡”。很难想像咸、酸、辣、苦都丝毫不能体验的情形。任何固体食物只有两种感觉,软或是硬。

人们往往在体验到不健康的时候才会格外的重视健康,而之前不论怎么的“重视”,都是停留在言语或是上不充分的行动上。

其实,人们在很多方面都如此。没有体验,就只会根据自己的理解去想像,而这点和事实的偏差是很大的。由于人们的经验并不匹配,这给人们的交流沟通带来了很大的障碍。也就是我们常说的“要换位思考”。实际上,换位实在太难了,因为经验背景不同。

一个可行的模式应该是,人们都在积累经验的时候,通过类似“通感”的方法去理解其他领域,进而能够达成沟通的基础,可以更好的沟通。只不过如果这样,缺乏阅历的人和有阅历的人沟通就变得格外困难了(类似代沟)

若一个人能够在很小的年纪,用很小的阅历经验,就理解比自己经历丰富得多得多的哪些人,大概就是真正的天才吧!

有感而发。

3G应用的前景

如果说GRPS数据通讯方式是2G,相当于有线链路的modem,那么号称3G的WCDMA应该到ADSL这个水准才能有真正质的变化。

不过,就目前我体验的这段时间来看,感觉WCDMA不足以有这么大的提升。

GRPS的缺点主要有两个:
  1. 带宽不够(因为许多网站都需要提供手机浏览版本)
  2. 延迟太大(需要大量交互的服务会很痛苦)
而WCDMA对这两个问题的解决程度不一:
  1. 表面上带宽够了,但是如果一个基站访问的客户端太多,通讯量还是有可能饱和
  2. 延迟还是不小
通过基础设施建设,带宽的问题最终总是可以解决的,但是这需要一段时间,而延迟的问题必须通过技术更新才能有本质变化。

所以,3G应该可以给目前的互联网应用带来很大的变化和更广阔的前景,但是和传统应用应该还是有区别的。更多集中在在于资料共享,中等延迟的交互。比如新闻、邮件、网上服务、微博等,网络游戏等应用看样子不行。而视频这个3G主打的业务,至少需要再经过一段时间的基础设施的建设才能普及。

未来的数据通讯接入方式显然是无线化,但是3G不一定能够承受起这个责任。目前有线通讯最后一公里在可以预见的将来会进入百兆带宽时代,无线通讯速度要能达到10M才能跟上网络服务的主流,否则有线和无线还是要像现在这样,分道而治。

ps:中国将3G分为两套标准,WCDMA & TD-SCDMA,这个政策虽说对联通有优势。但是也有可能成为劣势,这种不兼容的竞争结果只怕是一死一活,最终用户面对的还是垄断。

深圳特区建立30周年

1980年至今,已经有30年了。

我来到深圳也有26年了。深圳现在获得了设计之都的称号,这个称号能名至实归吗?期望她未来能有更好的 表现。