这就是中国功夫?
http://www.tudou.com/programs/view/hgwZh2s85bQ/
2010年12月28日星期二
2010年12月13日星期一
2010年10月19日星期二
假如穿越
如果你穿越回古代,能做什么?
穿越文说:
懂点历史课本,就能算无遗策;
懂点唐诗宋词,就能名满天下;
懂点理工知识,就能玩高科技;
懂点小学算术,就能善理内政;
懂点人情世故,就能钩心斗角;
懂点农业知识,就能提高生产力;
懂点马列主义,就能令帝王刮目相待;
懂点传销广告,就能打造庞大商业帝国;
懂点广播体操,就能等闲二三十人近不得身。
其实,小说随便说说可以,要是真穿越了,一个现代人什么都不是,混吃等死大概是唯一的出路。
点子不值钱,执行很重要,什么样的社会环境,能有什么样的执行成果。拎两首诗词忽悠人,谈点民主政治,看上去最容易操作,似乎可行 - 可李白、白居易、卢梭、孟德斯鸠,那又如何?
穿越文说:
懂点历史课本,就能算无遗策;
懂点唐诗宋词,就能名满天下;
懂点理工知识,就能玩高科技;
懂点小学算术,就能善理内政;
懂点人情世故,就能钩心斗角;
懂点农业知识,就能提高生产力;
懂点马列主义,就能令帝王刮目相待;
懂点传销广告,就能打造庞大商业帝国;
懂点广播体操,就能等闲二三十人近不得身。
其实,小说随便说说可以,要是真穿越了,一个现代人什么都不是,混吃等死大概是唯一的出路。
点子不值钱,执行很重要,什么样的社会环境,能有什么样的执行成果。拎两首诗词忽悠人,谈点民主政治,看上去最容易操作,似乎可行 - 可李白、白居易、卢梭、孟德斯鸠,那又如何?
2010年10月18日星期一
2010年10月16日星期六
小月月-木子月月鸟-中国政治改革
这个标题真有跳跃性。
我在Google reader上看到引自twitter的这句话:
RT @bojef RT @Hecaitou: 小朋友困惑地说:为什么在Google上搜索“小月月”会被重置?我回答他说:因为木子月月鸟。。。你在中国活得越长,能记忆和理解的垃圾信息就越多,他们甚至能超出你正常的知识储备。
From: http://twitter.com/rtmeme/statuses/27001106174
我纳了半天闷,然后才明白原来“木子月月鸟”是一个ID,于是搜索了一下他/她。信息鱼龙混杂,这个人也不算什么真正的名人,和很多乱七八糟的ID混在一起。好在我知道这家伙一定是个反X反XX的反动分子,所以还是毫不费力把他/她揪了出来。原来是一个写日记,爆6.4高层料的家伙。这类人写的文章我看的太多,看了开头就知道结尾,真伪难辨,姑且不论,倒是看到一篇文章有点想法:
http://victorliu17.spaces.live.com/blog/cns!3CA27CC2CEE1B99!2670.entry
6.4的事情我不想也不敢乱说(否则即得罪我党,又得罪广大民主人士,弄不好就成了过街老鼠,人人喊打,国内呆不了,国外也混不下去,难道去月亮上发呆不成)。我一直觉得惋惜的是:中国当年没有防暴警察,所以看到集会人员干瞪眼,放着闹太乱,耐心劝说别人懒得理你,结果就只能用机关枪坦克清理广场。这点老外经验就丰富的多,不愧是百年的积累,示威群众不好好游行,非要闹事的话,直接用催泪弹和高压水龙轰走,身穿防弹服,手持的大盾牌,无往不利。要是中国早点装备上,训练好人员,当年的事情也不至于弄成最后那样。
初,国党就吃了没有防暴警察的亏。每次我党发动学生上街,国党只好用机关枪伺候(史书上说,国党埋伏在某处,等爱国学生一到,就乱枪打死。想想也是可笑,对付一帮手无寸铁的学生,哪里用得上什么埋伏?其实就是游说不成,城管失了耐心,直接开火罢了,和6.4又有何不同,结果一样的“震惊中外”嘛)。我党上台以后,误以为将来群众游行,必然是支持我党的好事,所以到处建广场(这不是方便大家游行嘛),也没学西方弄些防暴警察(听起来有点和人民对抗的感觉,毕竟反动分子应该只是一小撮人才对,不好意思建啊),现在我党干部的斗争经验丰富了,更关键是观念转变了(基层干部明说:你是为党说话,还是为老百姓说话?这才是真心话啊!就是太冒险了点),防暴警察队伍也建立起来了,以后大家不必担心6.4这样的情况再发生,若再有这种集会,无非是蹲局子而已。当然,要是被劣质催泪弹砸死,或是被其他同学踩死,那属意外,命不好。
其实游行这玩意,对统治阶级永远都是挑战,我党广大干部一开始的想法未免单纯了点,毕竟是靠这个上台的,所以还有一些幻想。估计看了齐奥塞思库最后一次搞集会的下场以后,我党广大干部应该已有了深刻的反省。(真正的我党掌舵人,早就知道群众的游行集会是毒药,所以一早法律里面就卡死了,可惜宣传忽悠过了头,把广大干部也忽悠进去了)。
唉,中国这摊事,难搞。这个世界上,没人真的知道这么大个系统该怎么调整。有能力搞的人哪敢乱搞,以为自己会搞的那些人,又哪里有能力搞?若是到了某一天,以为自己会搞的那些人上了台,想必也不敢乱搞了。说实话,我还真怕那些自以为自己能搞定的人,上了台,想法还没变。
时间才是王道。
我在Google reader上看到引自twitter的这句话:
RT @bojef RT @Hecaitou: 小朋友困惑地说:为什么在Google上搜索“小月月”会被重置?我回答他说:因为木子月月鸟。。。你在中国活得越长,能记忆和理解的垃圾信息就越多,他们甚至能超出你正常的知识储备。
From: http://twitter.com/rtmeme/statuses/27001106174
我纳了半天闷,然后才明白原来“木子月月鸟”是一个ID,于是搜索了一下他/她。信息鱼龙混杂,这个人也不算什么真正的名人,和很多乱七八糟的ID混在一起。好在我知道这家伙一定是个反X反XX的反动分子,所以还是毫不费力把他/她揪了出来。原来是一个写日记,爆6.4高层料的家伙。这类人写的文章我看的太多,看了开头就知道结尾,真伪难辨,姑且不论,倒是看到一篇文章有点想法:
http://victorliu17.spaces.live.com/blog/cns!3CA27CC2CEE1B99!2670.entry
6.4的事情我不想也不敢乱说(否则即得罪我党,又得罪广大民主人士,弄不好就成了过街老鼠,人人喊打,国内呆不了,国外也混不下去,难道去月亮上发呆不成)。我一直觉得惋惜的是:中国当年没有防暴警察,所以看到集会人员干瞪眼,放着闹太乱,耐心劝说别人懒得理你,结果就只能用机关枪坦克清理广场。这点老外经验就丰富的多,不愧是百年的积累,示威群众不好好游行,非要闹事的话,直接用催泪弹和高压水龙轰走,身穿防弹服,手持的大盾牌,无往不利。要是中国早点装备上,训练好人员,当年的事情也不至于弄成最后那样。
初,国党就吃了没有防暴警察的亏。每次我党发动学生上街,国党只好用机关枪伺候(史书上说,国党埋伏在某处,等爱国学生一到,就乱枪打死。想想也是可笑,对付一帮手无寸铁的学生,哪里用得上什么埋伏?其实就是游说不成,城管失了耐心,直接开火罢了,和6.4又有何不同,结果一样的“震惊中外”嘛)。我党上台以后,误以为将来群众游行,必然是支持我党的好事,所以到处建广场(这不是方便大家游行嘛),也没学西方弄些防暴警察(听起来有点和人民对抗的感觉,毕竟反动分子应该只是一小撮人才对,不好意思建啊),现在我党干部的斗争经验丰富了,更关键是观念转变了(基层干部明说:你是为党说话,还是为老百姓说话?这才是真心话啊!就是太冒险了点),防暴警察队伍也建立起来了,以后大家不必担心6.4这样的情况再发生,若再有这种集会,无非是蹲局子而已。当然,要是被劣质催泪弹砸死,或是被其他同学踩死,那属意外,命不好。
其实游行这玩意,对统治阶级永远都是挑战,我党广大干部一开始的想法未免单纯了点,毕竟是靠这个上台的,所以还有一些幻想。估计看了齐奥塞思库最后一次搞集会的下场以后,我党广大干部应该已有了深刻的反省。(真正的我党掌舵人,早就知道群众的游行集会是毒药,所以一早法律里面就卡死了,可惜宣传忽悠过了头,把广大干部也忽悠进去了)。
唉,中国这摊事,难搞。这个世界上,没人真的知道这么大个系统该怎么调整。有能力搞的人哪敢乱搞,以为自己会搞的那些人,又哪里有能力搞?若是到了某一天,以为自己会搞的那些人上了台,想必也不敢乱搞了。说实话,我还真怕那些自以为自己能搞定的人,上了台,想法还没变。
时间才是王道。
2010年10月11日星期一
RUDP
前几天用GRPS、3G上游戏,感觉很是不爽,因为网络丢包率太高,而且很容易断线,这导致游戏会频繁的卡住或要重新登录。于是我萌发了做一个可靠的UDP传输协议的念头。(这个念头很早就有,只不过这的确不是一个优先级高的工作,而且,似乎只有回合制这类网游才用的上它,所以迟迟没有去开发)
很多年以前,我就做过这玩意,但是现在的需求有些不一样,还是要重来。确切的说,这类协议现成的代码很多,我现在无非是重复了一遍造轮子的过程。不过,针对我的需求而言,这个轮子还是有必要重新造造的。
我对RUDP的需求如下:
总的来说,开发这个并不难,但是也不容易。如果只想完成一个可以简单通讯的代码非常容易,只需要一天就够了,但要进行充分的测试,并且适应各种网络情况的话,这个工作就要复杂得多。网络上通讯,几乎所有的情况都需要考虑到,任何情况都有可能发生,这至少让代码复杂了三倍以上。事实上,我编码的时间的确很短,但是调试的时间十倍于编码的时间,远比其他模块的测试比重来得大。
在考虑如何嵌入VM的设计方案时,我足足考虑了两天,最终采用的思路是:做一个和BSD socket完全一样的一套接口,并实现了一个轮询用的函数。这样VM的代码几乎不需要任何复杂改动,只需要增加一个中间键,将socket操作demux到不同的接口即可,除此之外,在主循环进行轮询即可让RUDP模块工作。这里有一个缺陷,那就是因为轮询有时间间隔,可能会长达10ms,这样使得RUDP处理时,天然就会有可能多达20ms的延迟(两端各10ms)。不过这并不是大问题,因为对游戏来说这足够了。
相关实现如下:
在我集成到游戏时非常顺利,没有遇到太大问题。登录成功以后我一度还以为RUDP没有工作,使用的仍然是TCP协议。不过看到LOG和断开网络时的反应,可以确认RUDP的确工作了。当然,这么顺利的原因并不是运气,而是之前做了大量的测试工作。只是,这仅仅是个人在实验室中的测试,随着测试人员增多,环境变复杂,应该会暴露一些问题。
由于正好赶上游戏第二次发号测试,所以包含RUDP协议的服务器端还不能发布,我还不能实测其效果。不过,我倒是在另外一个场合先应用上了这个工作的成果。
因为我不在国内,需要使用VPN登录进入内网访问版本服务器,速度很慢。编译版本需要取美术资源文件(>1G),几乎是一个无法完成的任务。因为TCP的谦逊品质,从samba服务器复制的速度会越来越慢,而VPN可能时不时会断开,这导致我只能在特定的时间进行下载,否则难以成功。我用脚本写了一个非常简单的文件传输工具,通过RUDP传输文件。这样,虽然只有一个连接,但是速度和Flashget、迅雷这一类用多个TCP连接下载的速度一样,我只需要做一个非常简单的续传功能(用来防止VPN长时间断开),就可以轻易的实现一个高速的文件下载服务。这个工具缺点就是,如果网络带宽很大,使用默认的参数不能充分的利用下载带宽。不过,如果带宽如此之好,用系统默认的文件工具不就行了吗?
很多年以前,我就做过这玩意,但是现在的需求有些不一样,还是要重来。确切的说,这类协议现成的代码很多,我现在无非是重复了一遍造轮子的过程。不过,针对我的需求而言,这个轮子还是有必要重新造造的。
我对RUDP的需求如下:
- 网络断开并且恢复后,不能断开RUDP连接,即运行中可以更换IP;
- 在高丢包率的网络环境下可以正常的工作;
- 轻量级的代码,并且易于嵌入VM。
总的来说,开发这个并不难,但是也不容易。如果只想完成一个可以简单通讯的代码非常容易,只需要一天就够了,但要进行充分的测试,并且适应各种网络情况的话,这个工作就要复杂得多。网络上通讯,几乎所有的情况都需要考虑到,任何情况都有可能发生,这至少让代码复杂了三倍以上。事实上,我编码的时间的确很短,但是调试的时间十倍于编码的时间,远比其他模块的测试比重来得大。
在考虑如何嵌入VM的设计方案时,我足足考虑了两天,最终采用的思路是:做一个和BSD socket完全一样的一套接口,并实现了一个轮询用的函数。这样VM的代码几乎不需要任何复杂改动,只需要增加一个中间键,将socket操作demux到不同的接口即可,除此之外,在主循环进行轮询即可让RUDP模块工作。这里有一个缺陷,那就是因为轮询有时间间隔,可能会长达10ms,这样使得RUDP处理时,天然就会有可能多达20ms的延迟(两端各10ms)。不过这并不是大问题,因为对游戏来说这足够了。
相关实现如下:
- RUDP采用了两次握手而非三次握手,理论上这有一定的安全隐患(可以冒充客户端IP),不过不要紧,对游戏服务来说这并不是什么安全隐患;
- 有滑动窗口,和基于字节的sequence no和ack机制,这是为了保证和原有的TCP流传输方式一致,不影响上层实现;(如果是单独实现,基于报文方式显然更佳)
- 没有慢启动等算法的实现,也就是说传输端会全力发包而没有退让,这是谦逊的TCP经常会陷入奇慢甚至是假死的原因;(当然,谦逊的TCP能适应各种网络环境,从0.1K到1G带宽都可以自适应)
- 断开的FIN/ACK机制,这样可以保证发送数据后立刻断开仍然可以确保所有数据被传送到对端。
在我集成到游戏时非常顺利,没有遇到太大问题。登录成功以后我一度还以为RUDP没有工作,使用的仍然是TCP协议。不过看到LOG和断开网络时的反应,可以确认RUDP的确工作了。当然,这么顺利的原因并不是运气,而是之前做了大量的测试工作。只是,这仅仅是个人在实验室中的测试,随着测试人员增多,环境变复杂,应该会暴露一些问题。
由于正好赶上游戏第二次发号测试,所以包含RUDP协议的服务器端还不能发布,我还不能实测其效果。不过,我倒是在另外一个场合先应用上了这个工作的成果。
因为我不在国内,需要使用VPN登录进入内网访问版本服务器,速度很慢。编译版本需要取美术资源文件(>1G),几乎是一个无法完成的任务。因为TCP的谦逊品质,从samba服务器复制的速度会越来越慢,而VPN可能时不时会断开,这导致我只能在特定的时间进行下载,否则难以成功。我用脚本写了一个非常简单的文件传输工具,通过RUDP传输文件。这样,虽然只有一个连接,但是速度和Flashget、迅雷这一类用多个TCP连接下载的速度一样,我只需要做一个非常简单的续传功能(用来防止VPN长时间断开),就可以轻易的实现一个高速的文件下载服务。这个工具缺点就是,如果网络带宽很大,使用默认的参数不能充分的利用下载带宽。不过,如果带宽如此之好,用系统默认的文件工具不就行了吗?
2010年9月27日星期一
2010年9月26日星期日
肖传国与方舟子
事情的经过网上报道很多,且不赘述。
肖传国在中国不仅不少,反而很多,只是有胆量买凶杀人的没这么多罢了。其实中国学术造假,早就到了一个令人发指的地步,既不是这段时间才泛滥,也不是只有方舟子揭露的那么一点点。
中国早已是全民造假,所以近些年来,大家才纷纷鼓噪要“诚信”,所谓缺什么补什么,大抵就是这个道理。
其实学术造假属于最容易判断的一种,远比食品、卫生、医疗等等要容易诊断的多。学术成果是一个易于鉴定的内容,而且不需要什么太复杂的手段,各大权威论文、期刊都有据可查。而且,发现学术造假,事后也易于补救,不像食品问题,除了事往往以人命为代价,难以收拾。
只是,就是这么容易做到的事情,我们也没有做到。
从夸大其词的公益广告就能看出,许多人只管结果,不管手段;好大喜功、要面子,宁要假的一箩筐,也要充个数,虽说从外人眼里,我们不过是“止增笑耳”罢了,但是能忽悠一下自己人,那已经足够了。
我们就连求真的精神都如此缺乏,何谈科学?
可惜可惜,我们这个国家肖传国太多,方舟子太少。
刷牙的时候,顺手关上水龙头,一年能省多少水?满满109个浴缸!
如果把白炽灯都换成节能灯,就可以减少上千万吨的温室气体排放,你的举手之劳,却能防止地球变暖!
把用过的纸翻过来再用一面,一百个人在一年内,就能挽救整整一条街的树……
如果每个人都能及时拔掉充电器,那么每年将可关闭两百座百万千瓦火力的发电站。
肖传国在中国不仅不少,反而很多,只是有胆量买凶杀人的没这么多罢了。其实中国学术造假,早就到了一个令人发指的地步,既不是这段时间才泛滥,也不是只有方舟子揭露的那么一点点。
中国早已是全民造假,所以近些年来,大家才纷纷鼓噪要“诚信”,所谓缺什么补什么,大抵就是这个道理。
其实学术造假属于最容易判断的一种,远比食品、卫生、医疗等等要容易诊断的多。学术成果是一个易于鉴定的内容,而且不需要什么太复杂的手段,各大权威论文、期刊都有据可查。而且,发现学术造假,事后也易于补救,不像食品问题,除了事往往以人命为代价,难以收拾。
只是,就是这么容易做到的事情,我们也没有做到。
从夸大其词的公益广告就能看出,许多人只管结果,不管手段;好大喜功、要面子,宁要假的一箩筐,也要充个数,虽说从外人眼里,我们不过是“止增笑耳”罢了,但是能忽悠一下自己人,那已经足够了。
我们就连求真的精神都如此缺乏,何谈科学?
可惜可惜,我们这个国家肖传国太多,方舟子太少。
附我们夸张了10到100倍的公益广告词:
刷牙的时候,顺手关上水龙头,一年能省多少水?满满109个浴缸!
如果把白炽灯都换成节能灯,就可以减少上千万吨的温室气体排放,你的举手之劳,却能防止地球变暖!
把用过的纸翻过来再用一面,一百个人在一年内,就能挽救整整一条街的树……
如果每个人都能及时拔掉充电器,那么每年将可关闭两百座百万千瓦火力的发电站。
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上就可以了(这是使用小块内存最频繁的模块),其他模块还是算了,这样可以回避和系统模块之间的冲突,而付出的代价是微乎其微的。
前两天尝试让同事将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上就可以了(这是使用小块内存最频繁的模块),其他模块还是算了,这样可以回避和系统模块之间的冲突,而付出的代价是微乎其微的。
2010年9月17日星期五
观世博会有感
总的来说,这是一个超级无聊的盛会。
基本上,参观者主要做三件事情:
说起来,我还真佩服盖章这个活动的设计者(据说是蒙特利尔世博会发明的),这是一个设计的极度无聊而又非常成功的游戏。正因为有了盖章,才使得那些乱七八糟的展馆也有人到此一游,正是因为有了盖章,大家排那么久的队还会觉得物有所值。
世博会大概给我留下这么几个印象:
基本上,参观者主要做三件事情:
- 排队
- 看碟
- 盖章
说起来,我还真佩服盖章这个活动的设计者(据说是蒙特利尔世博会发明的),这是一个设计的极度无聊而又非常成功的游戏。正因为有了盖章,才使得那些乱七八糟的展馆也有人到此一游,正是因为有了盖章,大家排那么久的队还会觉得物有所值。
世博会大概给我留下这么几个印象:
- 搭个台子给老百姓看热闹
- 拉动GDP
- 场馆门口的队伍长度大抵和场馆所属国家的GDP成正比
- 非洲人民的确很穷,用不起投影,只能摆摆电视和总统像
- 非洲居然还有差不多十个国家我没听说过... 好歹我也是经常看地图的人
不按系统要求下线受惩罚?
在翻阅几个网游小说的时候,发现有几个共同的特点:
非常有趣的一点是,如果现实世界某个运营商提供的游戏真的是这么设计的,恐怕早就被玩家用口水喷死了。但是为什么作者会喜欢采用这种设定?是因为饱受官方服务之苦,还是说,觉得这样更合理?更有利于情节展开?
呵呵,如果这些作者去运营游戏,不知道是一种什么情形。
- 如果强制下线(不在安全区或是指定区域),可能会回档、掉级
- 如果系统重启,没有下线可能会无法登录或回档
非常有趣的一点是,如果现实世界某个运营商提供的游戏真的是这么设计的,恐怕早就被玩家用口水喷死了。但是为什么作者会喜欢采用这种设定?是因为饱受官方服务之苦,还是说,觉得这样更合理?更有利于情节展开?
呵呵,如果这些作者去运营游戏,不知道是一种什么情形。
《盗梦空间》
这个片子给我的感觉没有传闻那么好看,那么值得琢磨。
如果用计算机的术语来理解这个影片的话,每个人的梦境相当于是网站Website,而共享梦境的方法就是VPN,潜意识就是杀毒软件。当你进入另一个人的梦境(对方有管理员权限可以为所欲为)的时候,你的杀毒软件就开始工作,防止恶意站长的入侵。
受制于技术上的缺陷,如果断开VPN连接的时候,没有按照顺序优雅的切断的话,可能会导致帐号卡死(呃,早期的那些通讯设备还真有这些毛病),所以梦境要一层一层的kick,一层层的disconnect。
大抵就是这么回事吧。
ps:这个片子给我感觉其实更像是使命召唤那种FPS游戏,有一组场景组成,包括街头、贫民窟、雪地、桥梁等等,大家在这些场景不停的战斗,如此而已。
2010年9月9日星期四
2010年9月7日星期二
令人纠结的3G上网方案
因为地处没有固定链路的环境,所以需要找到一个比较好的上网解决方案。
调研了几个运营商,提供的服务各有优缺:
另外,华为有一个上网卡不错,可以自设一个wifi基站,通过3G访问互联网。这样,只要打开这个设备,所有支持wiki的设备诸如手机、笔记本、ipad都可以轻松使用网络。这个设备支持联通的sim卡,但是没有支持电信的类似设备 - 从技术上应该允许,这个可能是政治问题。而我试用的电信天翼的上网设备(中兴的)用起来不是那么爽,通过USB提供服务,而且只有windows才支持的比较好(Mac下10.6连U盘的内容都读不出,安装也成问题),这让我感觉很不方便。
联通最让人恶心的是网通出口,这样上网速度实在是有点令人难受。另外,15G的流量限制实在有点少,这点流量能干点啥?每天随便动弹一下,都要上百M。如果要走视频这些,一天几个G就干掉了。
ps:中兴的设备做的不如华为好用啊!
调研了几个运营商,提供的服务各有优缺:
- 移动 - 移动那个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一顿:
想办法解决问题,而不要只是解释,这才是王道。所有的服务部门都应引以为戒啊!
前几天我试图上公司的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一顿:
- 连我这个懂点计算机,尤其对通讯方面从事过专业工作的人,折腾得都这么痛苦,那些不懂计算机的人怎么办?自动化系统对他们究竟是帮助还是折磨
- 我们需要考虑的是如何给团队贡献价值,而不是玩弄技术(我们的IT技术水平倒是相当不错)
- 如果IT部门不能给其他部门提供实质性的帮助,其他部门怎么认可IT的工作,IT如何提高自己部门的地位,提高待遇
想办法解决问题,而不要只是解释,这才是王道。所有的服务部门都应引以为戒啊!
石器时代的互联网络应用
互联网发展到了今天,已经有几十年的历史了,但是,以其易用度来说,我认为互联网应用只能算是原始的石器时代。
先描述我现在采用的上网方法:
第一层:笔记本 -> Wiki -> HUAWEI Router -> WCDMA -> 固网 -> 互联网
第二层:Reliablehost(翻墙VPN) -> 美国某服务器 -> 互联网
第三层:OpenVPN(公司内VPN) -> 公司服务器 -> 公司内网
之所以如此有物理因素,有政治因素,也有安全因素。
毫无疑问,能够把这一切都搞明白,平且顺利配置妥当的人并不是那么多,这给我们实际应用带来了很大的麻烦。上面只给出了网络结构,另外还有一大箩筐的各种证书(各银行、淘宝、VPN等)。而且,一旦有一个风吹草动,我可能就需要断开所有链接,重新恢复一次(否则DNS很容易出错),并且导致正在连接中的服务被终止(比如游戏、QQ)。
我期望的生活方式是这样的:
未来,互联网除了增加新的应用,增加基建设施水准,还需要提高易用性。这应该是一个具有广阔发展可能的领域。
先描述我现在采用的上网方法:
第一层:笔记本 -> Wiki -> HUAWEI Router -> WCDMA -> 固网 -> 互联网
第二层:Reliablehost(翻墙VPN) -> 美国某服务器 -> 互联网
第三层:OpenVPN(公司内VPN) -> 公司服务器 -> 公司内网
之所以如此有物理因素,有政治因素,也有安全因素。
毫无疑问,能够把这一切都搞明白,平且顺利配置妥当的人并不是那么多,这给我们实际应用带来了很大的麻烦。上面只给出了网络结构,另外还有一大箩筐的各种证书(各银行、淘宝、VPN等)。而且,一旦有一个风吹草动,我可能就需要断开所有链接,重新恢复一次(否则DNS很容易出错),并且导致正在连接中的服务被终止(比如游戏、QQ)。
我期望的生活方式是这样的:
- 一个可以上网的设备直接就可以上网。不需要知道各类莫名其妙的连接、协议,不需要时常维护
- 有一个固定设备的证书,可以访问所有的安全受限区域
- 固定证书具有不同级别的密码,用于访问不同级别的安全受限区域
未来,互联网除了增加新的应用,增加基建设施水准,还需要提高易用性。这应该是一个具有广阔发展可能的领域。
味如嚼蜡
在我了鼻炎相关的手术以后的恢复期,吃什么东西都没有味道。这一段时间我真是亲身体验了什么是“味如嚼蜡”。很难想像咸、酸、辣、苦都丝毫不能体验的情形。任何固体食物只有两种感觉,软或是硬。
人们往往在体验到不健康的时候才会格外的重视健康,而之前不论怎么的“重视”,都是停留在言语或是上不充分的行动上。
其实,人们在很多方面都如此。没有体验,就只会根据自己的理解去想像,而这点和事实的偏差是很大的。由于人们的经验并不匹配,这给人们的交流沟通带来了很大的障碍。也就是我们常说的“要换位思考”。实际上,换位实在太难了,因为经验背景不同。
一个可行的模式应该是,人们都在积累经验的时候,通过类似“通感”的方法去理解其他领域,进而能够达成沟通的基础,可以更好的沟通。只不过如果这样,缺乏阅历的人和有阅历的人沟通就变得格外困难了(类似代沟)。
若一个人能够在很小的年纪,用很小的阅历经验,就理解比自己经历丰富得多得多的哪些人,大概就是真正的天才吧!
有感而发。
人们往往在体验到不健康的时候才会格外的重视健康,而之前不论怎么的“重视”,都是停留在言语或是上不充分的行动上。
其实,人们在很多方面都如此。没有体验,就只会根据自己的理解去想像,而这点和事实的偏差是很大的。由于人们的经验并不匹配,这给人们的交流沟通带来了很大的障碍。也就是我们常说的“要换位思考”。实际上,换位实在太难了,因为经验背景不同。
一个可行的模式应该是,人们都在积累经验的时候,通过类似“通感”的方法去理解其他领域,进而能够达成沟通的基础,可以更好的沟通。只不过如果这样,缺乏阅历的人和有阅历的人沟通就变得格外困难了(类似代沟)。
若一个人能够在很小的年纪,用很小的阅历经验,就理解比自己经历丰富得多得多的哪些人,大概就是真正的天才吧!
有感而发。
3G应用的前景
如果说GRPS数据通讯方式是2G,相当于有线链路的modem,那么号称3G的WCDMA应该到ADSL这个水准才能有真正质的变化。
不过,就目前我体验的这段时间来看,感觉WCDMA不足以有这么大的提升。
GRPS的缺点主要有两个:
所以,3G应该可以给目前的互联网应用带来很大的变化和更广阔的前景,但是和传统应用应该还是有区别的。更多集中在在于资料共享,中等延迟的交互。比如新闻、邮件、网上服务、微博等,网络游戏等应用看样子不行。而视频这个3G主打的业务,至少需要再经过一段时间的基础设施的建设才能普及。
未来的数据通讯接入方式显然是无线化,但是3G不一定能够承受起这个责任。目前有线通讯最后一公里在可以预见的将来会进入百兆带宽时代,无线通讯速度要能达到10M才能跟上网络服务的主流,否则有线和无线还是要像现在这样,分道而治。
ps:中国将3G分为两套标准,WCDMA & TD-SCDMA,这个政策虽说对联通有优势。但是也有可能成为劣势,这种不兼容的竞争结果只怕是一死一活,最终用户面对的还是垄断。
不过,就目前我体验的这段时间来看,感觉WCDMA不足以有这么大的提升。
GRPS的缺点主要有两个:
- 带宽不够(因为许多网站都需要提供手机浏览版本)
- 延迟太大(需要大量交互的服务会很痛苦)
- 表面上带宽够了,但是如果一个基站访问的客户端太多,通讯量还是有可能饱和
- 延迟还是不小
所以,3G应该可以给目前的互联网应用带来很大的变化和更广阔的前景,但是和传统应用应该还是有区别的。更多集中在在于资料共享,中等延迟的交互。比如新闻、邮件、网上服务、微博等,网络游戏等应用看样子不行。而视频这个3G主打的业务,至少需要再经过一段时间的基础设施的建设才能普及。
未来的数据通讯接入方式显然是无线化,但是3G不一定能够承受起这个责任。目前有线通讯最后一公里在可以预见的将来会进入百兆带宽时代,无线通讯速度要能达到10M才能跟上网络服务的主流,否则有线和无线还是要像现在这样,分道而治。
ps:中国将3G分为两套标准,WCDMA & TD-SCDMA,这个政策虽说对联通有优势。但是也有可能成为劣势,这种不兼容的竞争结果只怕是一死一活,最终用户面对的还是垄断。
2010年8月23日星期一
《敢死队》观后感
典型的好莱坞枪战片,符合史泰龙一贯的风格。
土著将军的确有些弱智,而且手下只有区区两百号人,也就是一个连长而已,这个将军做得未免也太猥琐了一些。
其实仔细想想,这就是好莱坞版的古惑仔,只是这些人长大了,不再街头用西瓜刀拼杀,而是手持枪炮,跑到某个独立主权国家闹事罢了,闹事的目的仍然是抢MM,快意恩仇罢了。不论是杰森在篮球场上为MM痛殴另一个混混,还是史泰龙直接炸楼救MM,都表现了Boy & Men的内心中渴望在MM面前炫耀武力的情节。
最后,这个片子,给我一种好莱坞版《建国大业》的感觉,虽说出场阵容没有那么庞大。
土著将军的确有些弱智,而且手下只有区区两百号人,也就是一个连长而已,这个将军做得未免也太猥琐了一些。
其实仔细想想,这就是好莱坞版的古惑仔,只是这些人长大了,不再街头用西瓜刀拼杀,而是手持枪炮,跑到某个独立主权国家闹事罢了,闹事的目的仍然是抢MM,快意恩仇罢了。不论是杰森在篮球场上为MM痛殴另一个混混,还是史泰龙直接炸楼救MM,都表现了Boy & Men的内心中渴望在MM面前炫耀武力的情节。
最后,这个片子,给我一种好莱坞版《建国大业》的感觉,虽说出场阵容没有那么庞大。
2010年8月19日星期四
从考试想开去的
昨天T计划补考,很不幸,第一次考试未通过,面对大量的针对定义类的题目,没有强印象的话实在无法作答。
我一贯很不喜欢这类针对记忆力的考试,从小如此。上一次参加类似的考试是8年前考驾照。
在我心目中,应用技能应该是通过实习,解题等方式来进行考核(资料性质的才需要考察记忆力,比如历史、文学、语言等,还有交规)。但是,设计题目和评判将是一个非常复杂的过程,更重要的是非常容易舞弊,从这点来说,我们的教育制度真的很难改革。不是教育部的人无能,而是人民太厉害。
ps:为了应对T计划的补考,我狂背了2天书,但是记住的有限,真的让我感觉已经老了。
我一贯很不喜欢这类针对记忆力的考试,从小如此。上一次参加类似的考试是8年前考驾照。
在我心目中,应用技能应该是通过实习,解题等方式来进行考核(资料性质的才需要考察记忆力,比如历史、文学、语言等,还有交规)。但是,设计题目和评判将是一个非常复杂的过程,更重要的是非常容易舞弊,从这点来说,我们的教育制度真的很难改革。不是教育部的人无能,而是人民太厉害。
ps:为了应对T计划的补考,我狂背了2天书,但是记住的有限,真的让我感觉已经老了。
2010年8月15日星期日
2010年7月31日星期六
神奇的敏感词
今天想从blogspot转一个帖子到百度空间,结果提示文章不适合发表,看样子是有敏感词,于是反复调整,结果调着调着,跳出来一句
“对不起,您的文章发表失败。
您发表文章过快,请填写验证码后再提交。”
阿弥陀佛,我只好等几分钟再提交。
无所不在的敏感词,神出鬼没的敏感词,它们总是默默无闻的工作着,过滤着一条有一条我们伟大的[敏感词]认为不适合广大[敏感词][敏感词]阅读的消息。它们偶然也会以“***”出现在世人面前,但是更多的时候,它们的身影只是惊鸿一瞥,留下不要越界的警告。
我理解[敏感词]的良苦用心,因为很多时候我看到一些莫名其妙的言论,也是恨得牙齿发痒。我知道[敏感词][敏感词]也很清楚“防民之口,甚于防川”这个道理,人人都知道,不过[敏感词]还是按耐不住让[敏感词]闭嘴算了。
幸好李杜白居易之流没有生活在现在,否则看到庞大的[敏感词]列表,只怕直接吓死,哪里还能做什么诗。不过[敏感词]也说了,这些东西都是靡靡之音,属于[敏感词]一类的东西,没有也罢。
以后高考语文应该顺便考一下相关知识,大家必须牢记敏感词列表,否则以后写文章效率多低啊。
其实敏感词也有些好处,至少大家在阅读文章的时候,还可以顺便做做填空题目,锻炼一下大脑,这不是也挺不错的吗?
ps:在霸者无双的封测服务器中,经常看到一大堆带着***的话飞出来,很纳闷。我很期望有一个功能,能够暂时关闭我这个客户端的过滤,让我看看对面究竟说得是啥。没准这个还可以当成一个商城道具拿出来销售,满足大家的好奇心?
“对不起,您的文章发表失败。
您发表文章过快,请填写验证码后再提交。”
阿弥陀佛,我只好等几分钟再提交。
无所不在的敏感词,神出鬼没的敏感词,它们总是默默无闻的工作着,过滤着一条有一条我们伟大的[敏感词]认为不适合广大[敏感词][敏感词]阅读的消息。它们偶然也会以“***”出现在世人面前,但是更多的时候,它们的身影只是惊鸿一瞥,留下不要越界的警告。
我理解[敏感词]的良苦用心,因为很多时候我看到一些莫名其妙的言论,也是恨得牙齿发痒。我知道[敏感词][敏感词]也很清楚“防民之口,甚于防川”这个道理,人人都知道,不过[敏感词]还是按耐不住让[敏感词]闭嘴算了。
幸好李杜白居易之流没有生活在现在,否则看到庞大的[敏感词]列表,只怕直接吓死,哪里还能做什么诗。不过[敏感词]也说了,这些东西都是靡靡之音,属于[敏感词]一类的东西,没有也罢。
以后高考语文应该顺便考一下相关知识,大家必须牢记敏感词列表,否则以后写文章效率多低啊。
其实敏感词也有些好处,至少大家在阅读文章的时候,还可以顺便做做填空题目,锻炼一下大脑,这不是也挺不错的吗?
ps:在霸者无双的封测服务器中,经常看到一大堆带着***的话飞出来,很纳闷。我很期望有一个功能,能够暂时关闭我这个客户端的过滤,让我看看对面究竟说得是啥。没准这个还可以当成一个商城道具拿出来销售,满足大家的好奇心?
2010年7月18日星期日
危机公关?唐骏岂能认错
今天上网,顺便搜索一下唐骏事件的进展,居然看到这么一篇神奇的文章:
唐骏不会危机公关?没有及时认错示弱导致事情越演越烈?
笑话,作者还把这种事情看作是一个单纯的炒作,一门心思在如何招式上研究这个问题,而忘记了这个事情的本质:唐骏所谓的“成功经历”就是一个散发着异味的腐朽产物,根本不是一个所谓的“污点”问题可以解决的。
诚然,当今社会有很多炒作,一些微不足道的事情被放大了,因为危机公关没有处理好,结果导致事情变得更加糟糕。然而,并不是所有的社会热点都是炒作。从目前看来,唐骏本人除了炒作这个空壳,几乎没有任何成功的业绩(所谓的盛大上市这个案例看不出和他有什么关系),倘若认了学历的错,接下来还有专利、公司、微软这几个软肋,是不是要一一认错?如果都认了,请问,唐骏是何人?他有什么成功经历?
唐骏的沙城决定他无法用清水洗刷自己,这和章子怡诈捐、牛根生抱怨完全不同,章子怡本是国际巨星,诈捐是她的一个人生污点,坦然承认改正当然无妨;牛根生乳业成绩显著,关于三聚氰胺的言论或有不妥,但是退避三舍即可。而唐骏本身就一无所有,只有吹嘘,承认的那一刻,就是他土崩瓦解之时。
看来,作者不过是一个只会,只知道“炒作”的人罢了。
附原文:
附原文:
唐骏会营销炒作 但不会危机公关
(中国电子商务研究中心讯)最近,无论是打开电视看新闻,上网浏览信息、路上听广播、闲暇看报纸,总会看到“唐骏”、“学历门”这些字眼。故事的主人公是我个人非常喜欢的唐骏。
如同看电影一样,这场“学历门”有人物、有情节、有发展、也有高潮。而我支持的主角在这场大戏中表现的很勇猛,但却中了敌人的埋伏和圈套。主角唐骏也意识到,承认自己被人利用,卷入这场炒作。但是,他的种种表现却没有从圈套中抽身而退的意思。不免让人疑惑,唐骏果真是在风口浪尖好多年,艺高人胆大。
但过去的成功不等于你就会永久掌握一把通向未来的钥匙。对唐骏而言,本人的观点是:精通营销炒作可以让你成名,不会危机公关可能让你丢份儿。
其实,“学历门”危机如果处理得当,虽然不能让唐骏彻底摆脱该事件的负面影响,但是至少不会出现今天这样的局面——几乎成了所有媒体和公众关注的焦点,其热度趋近于“艳照门”,而唐骏的“诚信”也广受质疑。
唐骏的学历好似不雅照一样,其曾经塑造的光辉形象,所取得的成就声誉,似乎蒙上了一层不道德的阴影。
昔日的打工皇帝,一向喜欢曝光在媒体的聚光灯下,这个曾经媒体的宠儿每次换工作,每次演讲,每次出境都会成为焦点和人们议论的话题。这次“学历门”也不例外。说到这里,先扯一个题外话。前几天和一个企业老总聊天,他问我为什么现在这个“门”那个“门”怎么这么多,什么“艳照门”、“诈捐门”、“强奸门”、“兽兽门”等等。我说,这主要归功于网络。
网络让我们每个人可以第一时间了解一个事件。然后这个事件又能在瞬间被无数人所传播,在短时间内就能完成全民审阅、议论和批判。
以前有句话,时间可以淡忘一切。在网络时代,历史的时间是可以被追回、完成重现的。
比如“艳照门”,小陈同学在拍照的时候,没有想到这些东西有一天会暴露在全世界人民的眼皮底下,人家本来是自己关起门来当黄色录像消遣的;
再比如“诈捐门”,小章同学也许和很多明星一样,一直玩名义捐款,在没有网络的时代,可能会把名义捐款玩转到底也不会被人知道;但在网络时代,一个质疑就能激起千层浪,给自己造成极大的负面影响;
再比如说“躲猫猫”事件,这种事在地方监狱里应该是不怎么稀奇的。但是当地警方给公众描述了一幅温情的画面,展现了一种浪漫的死法,“躲猫猫”。一下子扣动了网络的传播扳机,变成了热点。
所以,在网络时代,可以总结三句话:一切都在家门口;公众可以检验一切;时间已无法抚平“伤口”。
基于这三句话我们来看“学历门”:
一切都在家门口:媒体的全方位关注,让你看到,唐骏的事已经通过无数媒体展露在你面前,你不去关注都难;
公众可以检验一切:名人就是不一样,具有极大的眼球效应,一旦成为焦点,似乎所有人都有话说。唐骏一下子冒出来大批校友,这帮兄弟似乎今天才体会到自己学位的价值——“俺和唐骏是一个学校的”。大家开始研究唐骏的学历、经历、访谈,找寻唐骏同学所有的不诚信的证据;
时间已经无法抚平伤口:唐骏哪会想到,当初自己没怎么费劲儿弄的文凭会给多年后如日中天的他惹这么大的麻烦。时间会淡忘一切吗?NO,在网络时代,从来就不会遗忘从前。
唐骏是一个高调的人。确切地说,是一个高调的名人。
曾经的高调是唐骏打造个人品牌的杀手锏。打工皇帝的身价与其行事高调、善于“被”炒作不无关联。
但用过去的营销方法应付这次危机公关显然是个错误。
三聚氰胺事件的时候,牛根生之所以成为众矢之的,就是高调惹的祸。所谓枪打出头鸟,正当公众愤恨的时候,亟待寻找泄愤的领头羊。老牛很不合时宜的发表博客。发表言论,结果一下子就成为批判的对象。
所谓炒作,一定有两个关键要素:一正,一反。
别人说一句,你回应一句。能够持续下去,完全依靠当事人双方的配合。
其实,危机公关,只要发现及时,且马上采取行动。就能够大事化小,小事化无。
就好比是:方舟子放了把小火,本来可以轻松扑灭;而唐骏自己却往上面放了许多干柴。方舟子不停地浇汽油,唐骏却又往上面吹风,这把火在二人相互配合下愈烧愈旺,而此时媒体和公众看到后都竞相前来添加燃料,一时间就已变成熊熊大火。
假如,我们回到当初小火的状态。唐骏作出不同的反映,也许就会有不同的结果。
他只需采用危机公关对策中的一招:示弱,就能够完成强弱转换:
这里我举一个简单的小例子。我曾经委托一个公司做展板,结果出现印刷错误,我非常生气,要求他们赔偿损失。他们来了一个小伙,一个劲儿地赔不是。说因妹妹生病了,为了筹集医药费,心神不宁,导致犯下这么大的错误。老板已经因此扣他半个月的工资了。他们愿意免费再做一组以补偿我的损失。本来我要拿他们公司发难,结果来了一个我恨不得捐款的弱者。气消了,索赔也就不要了。
这也许就是弱者公关的威力。
原来顾客对企业,企业强,顾客弱。可是企业拉入一个更弱的员工,强弱对比发生了转变,顾客的怨气便无从发泄,危机就被化解了。
回到唐骏的“学历门”。唐骏只要出来诚恳的表个态。来一小段煽情演说(模拟):“感谢方舟子,我一直为这个污点感到愧疚。每个人都犯过错误,我唐骏也不例外。我可以很坦然面对自己,面对大家。一个人无论取得多么大的成就,都不能抹杀他曾经犯过的错误。在此,我向方舟子表示诚挚的谢意。并向公众表达我最真挚的歉意”
这样的话一说出来,唐骏马上可以博得大部分公众的同情和认可,这个打假斗士方舟子反倒不能继续狗咬人不放了。小火就会被浇灭。与唐骏的大度和宽容相比,方舟子便会显得如此的卑劣。炒作到此为止。
试想,人的一生谁没有说过谎,又有谁没有犯过错,昔日吴士宏应聘IBM时,人家问她会不会打字,她撒谎说:会。然后回家后通宵达旦练习打字,才能够走进IBM。
如此说来,这个名人不是也曾经“不诚信”过吗?
难道方舟子一辈子都“诚信”?方舟子之所以选择唐骏,还不是树大招风,这个炒作有看头吗!所以,看到今天这个局面,我很同情唐骏。也许唐骏并不需要我辈的同情。
但从个人主观感情来论。我很支持唐骏。我也不会上纲上线因为一个“学历”就认为唐骏的道德有问题,或者诚信缺失什么的。
唐骏,也是一个人。人不犯错误那还叫人吗?无论如何,方舟子已经在这次炒作中取得了阶段性的成功。唐骏在这场“学历门”战役中,输在了他不了解方舟子,输在了自己的危机公关处理不当。
一言以蔽之:不“识”对手,公关失误。对于方舟子,一看其就是有备而来。此时,让其退却的方式,就是感谢,坦白,让其羞愧而退。布什竞选时,媒体开始炒作布什年轻时“不成熟的行为”,布什回答说:“那是我粗野生活的一部分,我们都犯过错误。”
言下之意——“妈的,老子承认了,我很坦诚,你们还会怎么炒?!”面对方舟子,唐骏没有示弱,还提出动用法律手段,帮助故事添加了情节,同时也恶化了态势。如果重新假设一下,当时只是方舟子一个人在披露,唐骏在第一时间感谢方舟子,并坦诚学历的真相;那就会变成方舟子的独角戏,任其怎么咋呼,围观者也会寥寥,即使这个斗士有通天能力,真能闹出更大动静,得到的也一定是更多人的鄙视。
多数人都会站在唐骏的一边,他们的想法也许只有一个:人家都这样了,怎么还像疯狗一样咬住人不放呢。
方舟子是个炒作高手,身经百战。他会根据唐骏的表现嗅出局势变化,如果唐骏示弱,并哄抬方舟子。这老兄也一定会知难而退的。所以说,如果“假学历”是唐同学曾经犯下的一个错,那么这个事情爆发以后,唐骏所采取的危机公关策略,则是不断的错上加错,火上浇油。
有句话讲,“卑鄙是卑鄙者的通行证,高尚是高尚者的墓志铭””回到当初:可能,宽容一点,坦诚面对,昔日的卑鄙可以变成今日的高尚;但是,高调强势,狡辩应战,昔日的高尚可以变成今日的卑鄙。
就此次“学历门”,企业和名人们都应该引以为鉴,掌握危机公关的要领——适当地示弱;适当的时候闭嘴;让对方唱独角戏,千万不要成为燃料提供者和“故事”中的主角。(作者:荣振环)
2010年7月13日星期二
如何控制项目进度
我在浏览blog的阅读来源统计时,发现很多人对“如何控制项目进度”这个话题有点兴趣。关于这个话题,我想很多人可能需要的不是长篇大论,而是实际可操作的方法。因此分享一下我个人的简单经验,让搜索的人能有点收获:
1. 加班
没错,就是这个惨无人道的方法。当然,首先是负责项目的人要从自己做起,如果你自己做不到,那就别要求别人。还是别吃项目管理这碗饭(找个愿意加班的来管理)。
很多同事会说,加班效率很低。OK,这点全地球人都知道,问题是不加班进度更慢。加班是一种觉悟,先有觉悟,再谈别的问题。
2. 敢死
一个周期(比如一周)开始的时候,计划好任务,然后在本周期内一定要完成。如果没有完成怎么办?加更多的班!所以,预期的加班不应该是7天工作,6天就可以了。第7天留给意外吧,否则就没法加更多的班了。
总的来说,自己要有坚定的信念,一定要完成这个周期的任务,这个信念要用实际行动传递到团队中。
3. 单挑
想抓紧进度?遇到难题怎么办?自己要能亲自上阵解决,如果你不能解决,别人也不能解决。
4. 砍人
进度实在落后于期望怎么办?不是增加人手,而是减少人手。加人很容易,减人很难。只要能做到减人,想加回来很容易。要能去掉效率最低的那些人。
5. 要钱
一方面,你要让大家死劲干活,另一方面,你要能找到你的老板要辛苦费。要不来钱?那还做什么项目经理,赶紧洗洗睡了,换个地方吧。
好,上面的内容当然不是说笑,你要真的能这么干,项目的进度会好转很多。但是,这是不是太功利,太刻薄,太像周扒皮了?不是像,这简直就是新时代的X扒皮。
那我为什么还要给这些扒皮建议?
一个优秀的团队,是从来不会为项目进度而发愁的,他们需要的只是作战目标,而不是作战方法 - 用斯巴达战士的话说,他们不问敌人有多少,只问敌人在哪里。所有为了项目进度而发愁的团队,都是尚未成为优秀的团队,可能是项目经理还不够水准,也可能是团队成员不够水准,前者的因素大一些,总之,一定有缺陷。
所以,首先要从意识做起,“加班”是一种痛苦的负面体验,就算对工作狂也一样,只是工作狂往往可以从工作中获得很多快乐,压制住这种痛苦而已。但是在我们尚不是优秀团队,在我们缺乏技能、方法的时候,首先必须承受这些痛苦,时刻提醒自己:我们做得还不够好。要想尽一切办法,提高效率,减少加班,减少痛苦。所以,如果机械的、没有希望的加班是没有意义的,要时刻反思我们的效率问题 - 至少项目经理要反思,要拿出行动改进效率,在效率达标之前,请和大家一起受苦。
其次,要有计划性,而且要尊重计划、落实计划,要坚决完成计划,组成敢死队冲击计划。如果制定了根本不可能达成的计划怎么办?那显然是项目经理的失职,请分析团队历史以往的工作量,根据这些科学的制定计划。但是,整个团队要有一个强烈的信念,不论计划是否科学,是否合理,既然有了这个计划,就要敢死冲锋,不要天天琢磨计划是否合理 - 那是项目经理的事情。有意见可以提,但是首先是拼命做事。正所谓:我知道不能战胜敌人,但是在我倒下之前,敌人不能从我这里突破。
至于要项目经理“单挑”,实在有些强人所难。项目经理本身应是协调、组织、计划、执行,而不是专注某个专业领域。何况一个项目里往往需要多个专业领域协作,要项目经理能单挑未免过分了。但是,现在就是这样。一个不够成熟的团队成员,总是希望项目经理会本专业的技能,并且是专家。如果不是,大家就不愿意听从他的安排。作为项目经理,当然不能坐享其成,等待一个优秀团队从天而降,所以就要顺应民意,以专家的身份带领团队,并且能够攻关解决问题。如果不是自己专业领域的问题,怎么办?至少要能在团队里找一个愿意和你配合的专家,如果没有,那就只有降低对这个领域质量、进度的要求。如果一个项目经理,早就没有一切相关领域的专业能力了,就不要在这种团队里面呆着,换个地方应聘,找一个合适的团队里面做leader吧。
砍人听起来很残忍,但是既然你带领的不是一个优秀的团队,不经过优胜劣汰,怎么蜕变?如果不干掉不合格的人,反而伤了高手的心,难道这就有人情味了?如果你一味的加人,很快你就会被你的老板干掉;如果你运气不错,恰好是老板,那么你就会被市场干掉。当然,要想砍人,就必须有一套好的绩效考核体系 - 先忘记这个,一个不优秀的团队里面往往还没有这个玩意,或是只有一个假模假样的绩效考核。请先多看、多研究大家的工作成果,至少要对所有人的工作成果心中有数,能够做出公正的判断,要是连这个能力都没有,就别做什么项目经理了。当然,我们永远不能忘记去建立一个良好的绩效考核体系,否则团队永远都是那么平庸,永远都不能走向优秀。
要钱这事情很得罪老板(至少大部分老板),他们都会用怀疑的眼光看着你 - 工作进度不怎么样,要钱还这么勤快?他们往往会觉得你无能、觉得你收买人心,但是我们还是要坚定不移的死劲要钱。倘若要不来钱,不是老板眼光太差,就是我们自己无能,不论是哪种,项目都不会有好结果,宁可死在要钱上,不能默默无闻的倒下。同时,必须关注的一个禁忌是:不要先许诺会给团队成员要来什么,而要等到钱到手之后,公平的去分配,不要空许诺。或者说:这样是不是太功利了?团队太没有追求了?要钱是项目经理必须做的一件事情,不是全部,如果只指望用这个手段,那么团队永远无法走向优秀,永远都是乌合之众。我们要进行团队建设,传达理念,培养意识,但是别回避我们必须要做的这件事情。还有,别忘了建立上面提到的绩效体系,分错钱的结果比砍错人还要糟糕,你可以砍错人,但是不能分错钱。
如果大家还是一个土匪头子,带领的还是山寨团队,可以从这5点小事做起,确保项目的进度,继续做匪首这个很有前途的事业:
加班、敢死、单挑、砍人、要钱。
ps:这只是土匪阶段的方法,如果用这类方法得到了一些成果并满足于这些经验的话,那还是死路一条,只是晚死一些罢了。
1. 加班
没错,就是这个惨无人道的方法。当然,首先是负责项目的人要从自己做起,如果你自己做不到,那就别要求别人。还是别吃项目管理这碗饭(找个愿意加班的来管理)。
很多同事会说,加班效率很低。OK,这点全地球人都知道,问题是不加班进度更慢。加班是一种觉悟,先有觉悟,再谈别的问题。
2. 敢死
一个周期(比如一周)开始的时候,计划好任务,然后在本周期内一定要完成。如果没有完成怎么办?加更多的班!所以,预期的加班不应该是7天工作,6天就可以了。第7天留给意外吧,否则就没法加更多的班了。
总的来说,自己要有坚定的信念,一定要完成这个周期的任务,这个信念要用实际行动传递到团队中。
3. 单挑
想抓紧进度?遇到难题怎么办?自己要能亲自上阵解决,如果你不能解决,别人也不能解决。
4. 砍人
进度实在落后于期望怎么办?不是增加人手,而是减少人手。加人很容易,减人很难。只要能做到减人,想加回来很容易。要能去掉效率最低的那些人。
5. 要钱
一方面,你要让大家死劲干活,另一方面,你要能找到你的老板要辛苦费。要不来钱?那还做什么项目经理,赶紧洗洗睡了,换个地方吧。
好,上面的内容当然不是说笑,你要真的能这么干,项目的进度会好转很多。但是,这是不是太功利,太刻薄,太像周扒皮了?不是像,这简直就是新时代的X扒皮。
那我为什么还要给这些扒皮建议?
一个优秀的团队,是从来不会为项目进度而发愁的,他们需要的只是作战目标,而不是作战方法 - 用斯巴达战士的话说,他们不问敌人有多少,只问敌人在哪里。所有为了项目进度而发愁的团队,都是尚未成为优秀的团队,可能是项目经理还不够水准,也可能是团队成员不够水准,前者的因素大一些,总之,一定有缺陷。
所以,首先要从意识做起,“加班”是一种痛苦的负面体验,就算对工作狂也一样,只是工作狂往往可以从工作中获得很多快乐,压制住这种痛苦而已。但是在我们尚不是优秀团队,在我们缺乏技能、方法的时候,首先必须承受这些痛苦,时刻提醒自己:我们做得还不够好。要想尽一切办法,提高效率,减少加班,减少痛苦。所以,如果机械的、没有希望的加班是没有意义的,要时刻反思我们的效率问题 - 至少项目经理要反思,要拿出行动改进效率,在效率达标之前,请和大家一起受苦。
其次,要有计划性,而且要尊重计划、落实计划,要坚决完成计划,组成敢死队冲击计划。如果制定了根本不可能达成的计划怎么办?那显然是项目经理的失职,请分析团队历史以往的工作量,根据这些科学的制定计划。但是,整个团队要有一个强烈的信念,不论计划是否科学,是否合理,既然有了这个计划,就要敢死冲锋,不要天天琢磨计划是否合理 - 那是项目经理的事情。有意见可以提,但是首先是拼命做事。正所谓:我知道不能战胜敌人,但是在我倒下之前,敌人不能从我这里突破。
至于要项目经理“单挑”,实在有些强人所难。项目经理本身应是协调、组织、计划、执行,而不是专注某个专业领域。何况一个项目里往往需要多个专业领域协作,要项目经理能单挑未免过分了。但是,现在就是这样。一个不够成熟的团队成员,总是希望项目经理会本专业的技能,并且是专家。如果不是,大家就不愿意听从他的安排。作为项目经理,当然不能坐享其成,等待一个优秀团队从天而降,所以就要顺应民意,以专家的身份带领团队,并且能够攻关解决问题。如果不是自己专业领域的问题,怎么办?至少要能在团队里找一个愿意和你配合的专家,如果没有,那就只有降低对这个领域质量、进度的要求。如果一个项目经理,早就没有一切相关领域的专业能力了,就不要在这种团队里面呆着,换个地方应聘,找一个合适的团队里面做leader吧。
砍人听起来很残忍,但是既然你带领的不是一个优秀的团队,不经过优胜劣汰,怎么蜕变?如果不干掉不合格的人,反而伤了高手的心,难道这就有人情味了?如果你一味的加人,很快你就会被你的老板干掉;如果你运气不错,恰好是老板,那么你就会被市场干掉。当然,要想砍人,就必须有一套好的绩效考核体系 - 先忘记这个,一个不优秀的团队里面往往还没有这个玩意,或是只有一个假模假样的绩效考核。请先多看、多研究大家的工作成果,至少要对所有人的工作成果心中有数,能够做出公正的判断,要是连这个能力都没有,就别做什么项目经理了。当然,我们永远不能忘记去建立一个良好的绩效考核体系,否则团队永远都是那么平庸,永远都不能走向优秀。
要钱这事情很得罪老板(至少大部分老板),他们都会用怀疑的眼光看着你 - 工作进度不怎么样,要钱还这么勤快?他们往往会觉得你无能、觉得你收买人心,但是我们还是要坚定不移的死劲要钱。倘若要不来钱,不是老板眼光太差,就是我们自己无能,不论是哪种,项目都不会有好结果,宁可死在要钱上,不能默默无闻的倒下。同时,必须关注的一个禁忌是:不要先许诺会给团队成员要来什么,而要等到钱到手之后,公平的去分配,不要空许诺。或者说:这样是不是太功利了?团队太没有追求了?要钱是项目经理必须做的一件事情,不是全部,如果只指望用这个手段,那么团队永远无法走向优秀,永远都是乌合之众。我们要进行团队建设,传达理念,培养意识,但是别回避我们必须要做的这件事情。还有,别忘了建立上面提到的绩效体系,分错钱的结果比砍错人还要糟糕,你可以砍错人,但是不能分错钱。
如果大家还是一个土匪头子,带领的还是山寨团队,可以从这5点小事做起,确保项目的进度,继续做匪首这个很有前途的事业:
加班、敢死、单挑、砍人、要钱。
ps:这只是土匪阶段的方法,如果用这类方法得到了一些成果并满足于这些经验的话,那还是死路一条,只是晚死一些罢了。
有效的方法就不愚蠢?
今天看到一文“美国士兵守则”,其中第二句是这样的:
“If it's stupid but works,it isn't stupid”
也就是说:“如果一个‘愚蠢’的方法有效,那么它就不是‘愚蠢’的。”
这句话听起来好像有点道理?显然不是,因为很多愚蠢的方法的确有效,它们往往是“现在” 有效,而给将来带来很多麻烦。
比如书写代码就是这样,最简单的fix代码错误的方法是就地掩埋bug,比如wrap一层代码,或是增加一句if;最简单的增加新功能的方法不是分析框架,而是copy、paste、modify。这些work方法之所以“stupid”,是因为留下的隐患太多。
So,这个论点显然不正确,虽然听起来好像有点道理。
ps:我看完了那个“美国士兵守则”以后,很难判断真假。Google的结果是:我发现了“战争中的墨菲定律” - 如果这是原始出处的话,显然这个守则只是调侃而已,但是我不能确认。OK,证明一件事情是真的、还是假的都不容易。
“If it's stupid but works,it isn't stupid”
也就是说:“如果一个‘愚蠢’的方法有效,那么它就不是‘愚蠢’的。”
这句话听起来好像有点道理?显然不是,因为很多愚蠢的方法的确有效,它们往往是“现在” 有效,而给将来带来很多麻烦。
比如书写代码就是这样,最简单的fix代码错误的方法是就地掩埋bug,比如wrap一层代码,或是增加一句if;最简单的增加新功能的方法不是分析框架,而是copy、paste、modify。这些work方法之所以“stupid”,是因为留下的隐患太多。
So,这个论点显然不正确,虽然听起来好像有点道理。
ps:我看完了那个“美国士兵守则”以后,很难判断真假。Google的结果是:我发现了“战争中的墨菲定律” - 如果这是原始出处的话,显然这个守则只是调侃而已,但是我不能确认。OK,证明一件事情是真的、还是假的都不容易。
2010年7月12日星期一
章鱼帝完美收场,未来帝身败名裂
早起,赶紧打开电脑,查看世界杯落入谁家,不是关心西班牙 OR 荷兰,而是看看章鱼帝和未来帝的对决结果。
一剑封喉啊,虽然只是一场预言之差,但是未来帝立刻被打回原因,身败名裂。
章鱼帝,保罗,真是诡秘呢,刚升天不久的那个老教皇不也是叫保罗嘛!
ps:这种炒作不知道带来了什么?若说章鱼给德国奥伯豪森水族馆带来了眼球,那未来帝呢?难倒是给百度贴吧带来流量吗?
一剑封喉啊,虽然只是一场预言之差,但是未来帝立刻被打回原因,身败名裂。
章鱼帝,保罗,真是诡秘呢,刚升天不久的那个老教皇不也是叫保罗嘛!
ps:这种炒作不知道带来了什么?若说章鱼给德国奥伯豪森水族馆带来了眼球,那未来帝呢?难倒是给百度贴吧带来流量吗?
2010年7月11日星期日
产品还是营销
今天看节目,发现一个很强大的店。
这是台北永康街的一家冰馆(http://icemonster.com.tw/main.htm),15平方的面积,据称月销售800万新台币。前一段时间因为停业,永康街附近的店面生意下跌1-2成,在冰馆重新营业以后,附近的店面生意也跟着恢复。显然,这个冰馆已经成为永康商业圈的核心了。其创始人开创了刨冰这个领域,香港、日本的游客也慕名前往品尝一二。
这家冰馆,当然是靠产品而非营销决定业绩。也许,这很好的诠释了网游行业的出路。
在抄袭大军中的竞争,只有靠营销杀出一条血路。然而,如果产品真的超越了其他人,又何必如此?
或曰,别人抄袭你怎么办?真正的好东西,总能持续的保持领先。领先不是偷来的,而是用心做出来的。当年之天下,刨冰何其多,永康这家冰馆又如何领先的呢?
这是台北永康街的一家冰馆(http://icemonster.com.tw/main.htm),15平方的面积,据称月销售800万新台币。前一段时间因为停业,永康街附近的店面生意下跌1-2成,在冰馆重新营业以后,附近的店面生意也跟着恢复。显然,这个冰馆已经成为永康商业圈的核心了。其创始人开创了刨冰这个领域,香港、日本的游客也慕名前往品尝一二。
这家冰馆,当然是靠产品而非营销决定业绩。也许,这很好的诠释了网游行业的出路。
在抄袭大军中的竞争,只有靠营销杀出一条血路。然而,如果产品真的超越了其他人,又何必如此?
或曰,别人抄袭你怎么办?真正的好东西,总能持续的保持领先。领先不是偷来的,而是用心做出来的。当年之天下,刨冰何其多,永康这家冰馆又如何领先的呢?
人浮于事是怎么发生的
今天我看到王继扬一封邮件,其中有这么一句话:
“玩家反映法宝亲密减少,new了一堆的任务查来查去,弄到最后问题还挂在那里,可是任务已经关闭了
咱们不能这么做事呀!”
很有意思,这让我想起了GRE中的一道题目:
“某个部门A收到一封邮件,于是将事情转给部门B,部门B转给部门C.... 最后大概是问什么情况下会形成一个环,导致问题永远无法解决。”虽说这是考题,但这个题目在某种程度上反映了官僚机构的一种怪现状。
我举的这个例子当然和王继扬在邮件中提到的情形不一样,但是有一点是相通的,就是体系内所有人都忙着做“事”,但是体系外的人看却是所有人都在发呆,为何?
因为我们所有的人都是在做一个“事”,这是真正需求分解以后的一个局部任务,当我们只关注这个局部,却忘记了最终目标的时候,导致我们可能会用错误的方法来处理问题,结果就是任务完成了一堆又一堆,真正的问题却没有得到解决。
不论是程序、美术、QA、客服,还是形形色色的主管、项目经理、公司高管,我们应该关注的是掩盖在任务后面的真正需求,如果我们在做“事”的时候忽视了真正的需求,是不可能做好我们手头的事情的。
我们要低头集中精力解决局部问题,但是同时别忘了抬头看看,我们这么做是为了什么?
“玩家反映法宝亲密减少,new了一堆的任务查来查去,弄到最后问题还挂在那里,可是任务已经关闭了
咱们不能这么做事呀!”
很有意思,这让我想起了GRE中的一道题目:
“某个部门A收到一封邮件,于是将事情转给部门B,部门B转给部门C.... 最后大概是问什么情况下会形成一个环,导致问题永远无法解决。”虽说这是考题,但这个题目在某种程度上反映了官僚机构的一种怪现状。
我举的这个例子当然和王继扬在邮件中提到的情形不一样,但是有一点是相通的,就是体系内所有人都忙着做“事”,但是体系外的人看却是所有人都在发呆,为何?
因为我们所有的人都是在做一个“事”,这是真正需求分解以后的一个局部任务,当我们只关注这个局部,却忘记了最终目标的时候,导致我们可能会用错误的方法来处理问题,结果就是任务完成了一堆又一堆,真正的问题却没有得到解决。
不论是程序、美术、QA、客服,还是形形色色的主管、项目经理、公司高管,我们应该关注的是掩盖在任务后面的真正需求,如果我们在做“事”的时候忽视了真正的需求,是不可能做好我们手头的事情的。
我们要低头集中精力解决局部问题,但是同时别忘了抬头看看,我们这么做是为了什么?
从唐骏事件看中国人的诚信缺失
唐骏的事件网上资料很多,所以我就不摘录了,通过搜索引擎可以得到很多信息。
令人感慨的是,在各种讨论贴、回复内容中总是有一票人对唐骏造假一事不以为然,大概的几种观点:
得饶人处且饶人
原来诚信问题也可以饶人的,说明诚信其实不算什么,和平时斗两句嘴的性质差不多。
唐骏有能力,一张文凭算什么?
能力和文凭的确没有关系,问题是大家在意的是他造假,没有人认为唐骏的文凭高低有什么所谓。从这种观点看出,我们的“成王败寇”观念还是很重的,只要你做成事了,用什么手段都不重要,所谓的“诚信”其实一钱不值。
很多人对诚信不以为然,其实各个媒体、包括学校这样的机构,何尝不是如此?
北邮在学校的主页上,匆匆的修改相关的资料,把唐骏的文凭一段抹去,含糊其词,可笑的是文中还有唐骏的一句“先做人,后做事”冠冕堂皇的话。幸好当今已经是互联网时代,这种掩耳盗铃的事情根本就不可能隐瞒。
北邮从来没打算就这件事情道个歉,说明一下,反而帮骗子粉饰。当然,北邮这么做,并不会在我心目中削弱这个学校的地位,因为中国学校的地位在我心中已经低的无以复加,早就到了绝对零度。倘若北邮勇敢的站出来承认错误,鄙视唐骏,或能赢得更多人的尊敬(至少可以让我有一丝敬意)。只是,想想都知道这样不可能。在当今这样充满着糜烂、腐败气息的中国大学中,我们的学术又怎么能好的起来?芯片造假等一系列的学术造假,那就显得太正常了。
还好中国尚有方舟子这样的人,不然,真是让人感到彻底的绝望。
想起公司的游戏在运营时也会遇到一些问题。有时候,开发团队也试图避重就轻,避而不谈,可是玩家并非傻子,岂能不知?我倾向于将这些事情开诚布公的广而告之,虽说这样会给我们落下口实,让玩家看着笑话,甚至丢失一批原本将信将疑的用户。但是从长远来看,我们终究能够赢得用户的信任吧!也许我的想法是错误的,在目前这样的环境下,这样做的结果可能是自寻死路。倘若真是这样,公司关门也罢,我可以移民出国聊度此生,生活在中国这片土地的人爱怎么样,便怎么样吧,每个人都有选择自己生活方式的自由。
写完,突然觉得很累,不想往百度空间上转帖此文,就这样罢了。
令人感慨的是,在各种讨论贴、回复内容中总是有一票人对唐骏造假一事不以为然,大概的几种观点:
得饶人处且饶人
原来诚信问题也可以饶人的,说明诚信其实不算什么,和平时斗两句嘴的性质差不多。
唐骏有能力,一张文凭算什么?
能力和文凭的确没有关系,问题是大家在意的是他造假,没有人认为唐骏的文凭高低有什么所谓。从这种观点看出,我们的“成王败寇”观念还是很重的,只要你做成事了,用什么手段都不重要,所谓的“诚信”其实一钱不值。
很多人对诚信不以为然,其实各个媒体、包括学校这样的机构,何尝不是如此?
北邮在学校的主页上,匆匆的修改相关的资料,把唐骏的文凭一段抹去,含糊其词,可笑的是文中还有唐骏的一句“先做人,后做事”冠冕堂皇的话。幸好当今已经是互联网时代,这种掩耳盗铃的事情根本就不可能隐瞒。
北邮从来没打算就这件事情道个歉,说明一下,反而帮骗子粉饰。当然,北邮这么做,并不会在我心目中削弱这个学校的地位,因为中国学校的地位在我心中已经低的无以复加,早就到了绝对零度。倘若北邮勇敢的站出来承认错误,鄙视唐骏,或能赢得更多人的尊敬(至少可以让我有一丝敬意)。只是,想想都知道这样不可能。在当今这样充满着糜烂、腐败气息的中国大学中,我们的学术又怎么能好的起来?芯片造假等一系列的学术造假,那就显得太正常了。
还好中国尚有方舟子这样的人,不然,真是让人感到彻底的绝望。
想起公司的游戏在运营时也会遇到一些问题。有时候,开发团队也试图避重就轻,避而不谈,可是玩家并非傻子,岂能不知?我倾向于将这些事情开诚布公的广而告之,虽说这样会给我们落下口实,让玩家看着笑话,甚至丢失一批原本将信将疑的用户。但是从长远来看,我们终究能够赢得用户的信任吧!也许我的想法是错误的,在目前这样的环境下,这样做的结果可能是自寻死路。倘若真是这样,公司关门也罢,我可以移民出国聊度此生,生活在中国这片土地的人爱怎么样,便怎么样吧,每个人都有选择自己生活方式的自由。
写完,突然觉得很累,不想往百度空间上转帖此文,就这样罢了。
紫禁之巅、两帝对决 - 未来帝大战章鱼帝
作为一个伪球迷,我其实不关心世界杯,偶然的,了解一下几天前的比赛结果就可以了。
但是自打昨天起,我突然开始关心起世界杯来了,当然,我只关心结果。
早晨起来,我兴冲冲的打开网络,看看新闻,验证一下章鱼帝的预测结果。挺有趣,它老人家继续给我们关注的理由。
而这个“正确的”比赛结果,使问题变得更加复杂了。因为已经到了检测未来帝的预测结果的时候,虽然未来帝只预测了一场比赛,但是这其实内含了至少6场比赛的结果,即西班牙和荷兰16进8、8进4、4进2的6场赛事结果。
现在到了紫禁之巅的对决时刻,两帝将进行死磕 - 究竟是未来帝更准,还是章鱼帝更神?因为这两头妖兽、妖人给出了相反的答案,未来帝更狠的是连比分、进球的队员都敢预测。
我决定,深切关注世界杯的决赛结果。
我期盼,最好两帝同归于尽(西班牙胜,1:0),这样有利于破除迷信嘛!
ps:其实相比之下,做一个未来帝要容易一些,多注册一些账号几率就很大啦!
但是自打昨天起,我突然开始关心起世界杯来了,当然,我只关心结果。
早晨起来,我兴冲冲的打开网络,看看新闻,验证一下章鱼帝的预测结果。挺有趣,它老人家继续给我们关注的理由。
而这个“正确的”比赛结果,使问题变得更加复杂了。因为已经到了检测未来帝的预测结果的时候,虽然未来帝只预测了一场比赛,但是这其实内含了至少6场比赛的结果,即西班牙和荷兰16进8、8进4、4进2的6场赛事结果。
现在到了紫禁之巅的对决时刻,两帝将进行死磕 - 究竟是未来帝更准,还是章鱼帝更神?因为这两头妖兽、妖人给出了相反的答案,未来帝更狠的是连比分、进球的队员都敢预测。
我决定,深切关注世界杯的决赛结果。
我期盼,最好两帝同归于尽(西班牙胜,1:0),这样有利于破除迷信嘛!
ps:其实相比之下,做一个未来帝要容易一些,多注册一些账号几率就很大啦!
2010年7月7日星期三
唐骏的学历
今天在网上,突然发现一则新闻:方舟子爆出唐骏学历造假。
且不说内容,光这个事情的两个参与人就足够吸引我,我对这两个人的了解恰恰都是在游戏这个领域获得的认知。
早年(95年左右)方舟子和几个朋友将东方故事mud修改为武侠背景的xkx;而唐骏则一度入主过盛大,这两个都和游戏有很大的关系。
我很喜欢方舟子这个人,就我看到的mud源代码而言,此人在游戏设计领域的能力的确相当不错,但是我喜欢他却非因此,而是他具有强烈的科学精神。在各类学术、学历打假的过程中,他使用的方法都不是一厢情愿的控诉,而是摆事实,任何人都可以使用同样的方法验证真伪。
唐骏这个人的贡献很难说,因为我无法衡量他的成就,所以不能说好还是不好。但是当年曾经看到一篇质疑他资历的文章,不过类型就是那种“控诉”型的,无据可查,所以我也不太当回事。但是今天看到方舟子针对他假学历的揭露,信矣!至于当年唐骏的资历是否也有很大水分,无法证实,但是可以肯定的是唐骏此人诚信很成问题。
可悲的是,很多人回复中却提到:“学历不重要,人家很成功”,假学历和低学历岂能一概而论?造假就是造假,和能力有什么关系?很多中国人其实根据不在乎诚信,只在乎所谓的“成功”罢了。
参考连接:
news.cnstock.com/msbt/201007/654804.htm
tech.qq.com/a/20100707/000630.htm
且不说内容,光这个事情的两个参与人就足够吸引我,我对这两个人的了解恰恰都是在游戏这个领域获得的认知。
早年(95年左右)方舟子和几个朋友将东方故事mud修改为武侠背景的xkx;而唐骏则一度入主过盛大,这两个都和游戏有很大的关系。
我很喜欢方舟子这个人,就我看到的mud源代码而言,此人在游戏设计领域的能力的确相当不错,但是我喜欢他却非因此,而是他具有强烈的科学精神。在各类学术、学历打假的过程中,他使用的方法都不是一厢情愿的控诉,而是摆事实,任何人都可以使用同样的方法验证真伪。
唐骏这个人的贡献很难说,因为我无法衡量他的成就,所以不能说好还是不好。但是当年曾经看到一篇质疑他资历的文章,不过类型就是那种“控诉”型的,无据可查,所以我也不太当回事。但是今天看到方舟子针对他假学历的揭露,信矣!至于当年唐骏的资历是否也有很大水分,无法证实,但是可以肯定的是唐骏此人诚信很成问题。
可悲的是,很多人回复中却提到:“学历不重要,人家很成功”,假学历和低学历岂能一概而论?造假就是造假,和能力有什么关系?很多中国人其实根据不在乎诚信,只在乎所谓的“成功”罢了。
参考连接:
news.cnstock.com/msbt/201007/654804.htm
tech.qq.com/a/20100707/000630.htm
2010年7月6日星期二
从土地兼并到合理分配
中国历朝历代的灭亡,往往都是由于持续的农民起义推动的(除了宋亡于蒙古、明亡于清),最近看朝鲜通史,发现和中国也仿佛类似。
农民起义的原因基本只有一个:活不下去,这种活不下去不是因为某次灾荒导致的,而是因为没有土地,无法养活自己。历朝历代刚开始的时候,天下的土地资源重新分配,所以国家稳定,百姓满意;而随着时间的发展,土地兼并越来越厉害,导致不停有人破产,失去土地,最后这个群体越来越大,大到足以推翻政府,改朝换代。
本文讨论的问题并不是土地兼并这个政治问题,而是考虑“分配制度”。项目中的分配制度如果不合理,那么项目的死亡也是指日可待的事情了。
如果一个项目做成了,老板赚得盘满钵满,员工穷得叮当直响,这样的团队肯定无法坚持下去;
如果团队中的所有人员,利益分配都差不多,这种团队显然也是不行的;
如果利益分配的过份,导致大家打完土豪,分完地产就散伙,这样的组织也好不到哪里去。
期望的合理分配效果
1. 安居乐业
这个分配要能让我们每个人活的比较舒服,超过这个行业的平均水平。
2. 按功分配
项目的利润是由团队创造出来的,那么,我们应该按照贡献的比例进行合理的分配。团队应该按照贡献程度享有合理的利益,团队中的成员也类似。当然这个比例并不是可以轻易量化的,但应该有一个大概的度。
3. 积极进取
分配结果不能使大部分人突然陷入无所追求的情况。要解决这个问题,并不只是分配方案可以解决的(如果从方案分配下手,那就只能减少实发量,这显然不是什么好方法),还要从我们的企业文化、个人的理想、职业规划入手。
所有人能够专业的工作、优雅的生活,这是我的理想。
农民起义的原因基本只有一个:活不下去,这种活不下去不是因为某次灾荒导致的,而是因为没有土地,无法养活自己。历朝历代刚开始的时候,天下的土地资源重新分配,所以国家稳定,百姓满意;而随着时间的发展,土地兼并越来越厉害,导致不停有人破产,失去土地,最后这个群体越来越大,大到足以推翻政府,改朝换代。
本文讨论的问题并不是土地兼并这个政治问题,而是考虑“分配制度”。项目中的分配制度如果不合理,那么项目的死亡也是指日可待的事情了。
如果一个项目做成了,老板赚得盘满钵满,员工穷得叮当直响,这样的团队肯定无法坚持下去;
如果团队中的所有人员,利益分配都差不多,这种团队显然也是不行的;
如果利益分配的过份,导致大家打完土豪,分完地产就散伙,这样的组织也好不到哪里去。
期望的合理分配效果
1. 安居乐业
这个分配要能让我们每个人活的比较舒服,超过这个行业的平均水平。
2. 按功分配
项目的利润是由团队创造出来的,那么,我们应该按照贡献的比例进行合理的分配。团队应该按照贡献程度享有合理的利益,团队中的成员也类似。当然这个比例并不是可以轻易量化的,但应该有一个大概的度。
3. 积极进取
分配结果不能使大部分人突然陷入无所追求的情况。要解决这个问题,并不只是分配方案可以解决的(如果从方案分配下手,那就只能减少实发量,这显然不是什么好方法),还要从我们的企业文化、个人的理想、职业规划入手。
所有人能够专业的工作、优雅的生活,这是我的理想。
2010年7月4日星期日
选载一文
今天看到一文:http://blog.sina.com.cn/s/blog_59b0c2320100jcw2.html#close=1
其实,美国比中国发展的明显好,生活条件更优越,这属于众所周知的事情。因为这几十年来无数中国人用行动来证明了这一点。我们本来就没有必要回避这一点:美国比中国好,我们可以向往、生活、居住乃至入籍,这也并不妨碍我们热爱我们的祖国。
只是许多人(尤其是愤青?)会把在外国居住、或是入籍这些问题上纲上线,认为是对祖国不忠的表现,在这种情况下,大环境也熏陶了一种不良的气氛。结果,很多人虚伪的在嘴上批评着西方国家,然后却一点一点的挪动着脚步,做出相反的选择。一面虚伪的说,一面悄悄的做,无耻得很。这就好比当年在终南山隐居的名流 - 真想隐居,这些闲人怎么不去佛山?
ps:我转载此文,并不认为文中所举例子均为真实,因为我没有权威的资料可以查证。虽然如此,类似的事情也见过,所以才应用此文,有感而发。比如,关于马楠现状,有这里的一篇辟谣文章。说实话,我不知道谁真谁假。往事越千年,难辨真伪,可是就是现状也无从分辨。
ps:在国外,入籍这个词语中翻译成中文为“归化”,说实话,每次我看到这个词,无奈又感慨。
原文如下:
变脸:《中国不高兴》作者发财后立马办美国绿卡(转载)
作者:石铭 来源:博客中国 2010-6-10
川剧中变脸的绝活,令人叹为观止,彰显艺术的魅力。但这样的功夫若放在真实生活中,却叫人难以适应,尤其是前后两张脸谱相去较远的情况。
最近,我就因看到了这样的变脸情形而惊骇。
1998年美国总统克林顿到北大讲演时,北大中文系女生马楠,曾当面反驳克林顿对美国民主、自由、人权的解释,痛斥美国的人权状况恶劣。马楠说:
“本校前任校长蔡元培曾经说,当伟大的道德精神实际运用时,它们不会互相抵触。而且,我也不认为个人的自由会与集体自由抵触。以中国为例,它的蓬勃发展实际上确是我国人民自由选择与集体努力下的成果。因此,我认为,所谓真正的自由,应该是人民有权自行选择他们想要的生活和发展方式。只有那些真正尊重他人自由的人,才能了解自由的真谛。”
马楠的话确实长了咱中国人的志气。美国有啥了不起的,克林顿凭什么要对咱中国的人权状况说三道四?!
但令人不解的是,两年后,本科毕业的她,却选择了到人权状况恶劣的美国留学。后来,又嫁给了一个蓝眼睛、白皮肤的美国人,还生了一个美国籍的儿子。
2009年夏季,中国出了一本宣扬民族主义、反对美国霸权的书籍,名曰《中国不高兴》。全书分三个部分:一、中国为什么不高兴,二、中国的主张,三、放下小菩萨,塑伟大之目标。结论是:中国要做一流国家,依托国家大目标,实现众生幸福平等,告别自我矮化的精神历史。
此书出版后,得到了许多愤青的追捧。此书也一度成为各大城市新华书店的畅销书。但是,就在该书出版几个月后,因写作此书而名利双收的作者,又常在央视指点江山的爱国者——宋晓军,却办理了美国绿卡,终于脱下了画皮!
该书的总策划——张小波,也正在移民加拿大。据说,张小波此前曾策划过与之内容相近的《中国可以说不》一书,并因此发了财,买了豪宅和宝马轿车。
上世纪八十年代末,国务院发言人袁木,因与学生对话而名声大噪。在对话中,他一直以居高临下的姿态,教导学生要听政府的话,要爱国。1989年6月,他接受了美国全国广播公司节目主持人汤姆·布罗考的电视采访。
在采访中,他对布罗考有关中国在美留学生大多都希望留在美国的说法,很是不以为然。袁木说:
“我相信,绝大多数中国留学生是会回到祖国为自己的国家服务的。当然,我也不排除一些人不愿意回来。对此,我表示遗憾。从我自己来说,我衷心地希望他们回来,也相信他们会回来。”
但几年之后,他的女儿却到美国留学,并于毕业后加入美国国籍。——真不知袁木先生对待留学生问题上,还有双重标准,还有亲疏之别。
上面提及的三个例子,都涉及出国、移民的事情。若只在此问题上纠缠不休,则略显狭隘。一则,出国与选择国籍是人的自由,他人无权干涉;其二,这与是否爱国,也并无直接的关系。我觉得,人即便是加入了外国国籍,也照样可以爱自己出生的祖国,也照样可以为建设祖国流血出力。
但是,若在爱国的问题上,煞有介事、拘泥于形式,甚至突然变脸,却也让人难以接受。
其实,在现实生活中,许多在口头上标榜自己爱国的人,并不真的爱国。他们不懂我们国家的历史,不清楚我们民族正在经受的苦难,不理解人类进步的必然趋势,也不知道我们国家最需要的到底是什么。
他们所谓的爱国,只是一种投机钻营的策略。他们企图用爱国这块砖,敲开荣誉、地位和机会之门。当他们达到目的,或希望落空之后,他们会毫不犹豫地变换一幅嘴脸,目标当然还是自己的一己私利,别无其他。
此外,在专制社会中,爱国也有政府立场与民众立场之别。站在政府立场上,所谓的爱国,大多是打肿脸充胖子、做表面文章、哗众取宠和欺世盗名的招数。因为,他们很少为人民着想,甚至还经常以爱国为幌子,侵害普通民众的利益。
必须说到的是,大凡容易变脸的人,心理素质都很过硬。当英雄、做狗熊,全凭自身需要,不会有过多的精神负累。而在其变脸的过程中,受伤害最大的还是善良的民众,是真正爱国而又崇拜英雄的民众。
民众还沉浸在往日的情绪中,而我们的“英雄”却已完成了他们的“华丽转身”,与我们渐行渐远……
啊——呸——!
其实,美国比中国发展的明显好,生活条件更优越,这属于众所周知的事情。因为这几十年来无数中国人用行动来证明了这一点。我们本来就没有必要回避这一点:美国比中国好,我们可以向往、生活、居住乃至入籍,这也并不妨碍我们热爱我们的祖国。
只是许多人(尤其是愤青?)会把在外国居住、或是入籍这些问题上纲上线,认为是对祖国不忠的表现,在这种情况下,大环境也熏陶了一种不良的气氛。结果,很多人虚伪的在嘴上批评着西方国家,然后却一点一点的挪动着脚步,做出相反的选择。一面虚伪的说,一面悄悄的做,无耻得很。这就好比当年在终南山隐居的名流 - 真想隐居,这些闲人怎么不去佛山?
ps:我转载此文,并不认为文中所举例子均为真实,因为我没有权威的资料可以查证。虽然如此,类似的事情也见过,所以才应用此文,有感而发。比如,关于马楠现状,有这里的一篇辟谣文章。说实话,我不知道谁真谁假。往事越千年,难辨真伪,可是就是现状也无从分辨。
ps:在国外,入籍这个词语中翻译成中文为“归化”,说实话,每次我看到这个词,无奈又感慨。
原文如下:
服务的质量层次
今天要赶回厦门。
早晨我赶到机场的时候,却遇到了一些不太顺利的事情。Check in的时候,机场办票人员说查不到我的票务信息要我找售票处查询一下。我有点郁闷,找了半天总算找到了携程的电话。打电话过去,携程果然说一切正常,这让我更加郁闷,不怕有问题,就怕没bug。接下来我预感就要出事。
我再询问办票人员时,她说不行,电脑里没有。我想了想,问:“你是按照名字查询的还是身份证号查询的”,之所以这么问是因为民航订票系统打不出来我的名字,想试试看是否是因为名字问题导致了问题 - 虽然我认为这种情况几乎不可能(毕竟办票人员受过专业训练,这种打不出名字的情况应该遇到的很多了),但是现在明明有故障,我总得尝试点什么找出问题所在。
此时,办票人员也颇不耐烦,没有回答我的问题(大概是不屑向我这种业余人士说明什么),总是说:“电脑里没有信息”,我问:“你能不能给我解释一下?” - 我总找找原因,解决问题,不能耗在这里一直到晚点吧?
这时候,她身后的小伙子到插了一句嘴,我没有听清楚,但是大概是去62号售票柜台可以解决问题,可是此大姐很不耐烦的回了他几句,此时我再问:“我该怎么办?”,她嘟囔了几句,我没听太清楚,突然无名火起(感觉我现在脾气是越发的差了,一点耐性也无),心头大怒,喝道:“难道我就在这里发呆,一点办法都没有了吗?你就不能给出我一点建议吗?我去62号柜台能不能解决问题?要多久能解决问题?”然后双方就是一阵大吵,因为我还没挂携程的电话,他们的客服赶紧叫我把电话给办票人员,好去交涉,不过交涉下来仍然未果。此时,大姐背后斜刺杀出一人,带我去厦航的柜台,几分钟就解决了问题。
事后反思了一下,首先这个过程我情绪控制的不好,其实静下心来交流一下,解决这个问题本也不难,只是很难按捺得住(本来想投诉办票人员,后来想想算了,得饶人处且饶人吧)。另外,从这里可以看出携程的客服人员比机场的办票人员要强不少,办票人员只管抛出问题,但是不解决问题,甚至连解决方案都不给,这点携程的客服人员帮助客户解决问题的意识就要强得多,而帮我解决问题的那个工作人员(可能是厦航售票人员?)则最务实,在这种局面没有用语言,而是用行动直接帮助我解决了问题,因此整个环节我最感激他。
总的来说,客服大概可以分作三个层次,最低级的是能联系上,只是双方一阵对骂;其次是对方脾气很好,任你蹂躏,就是不帮你解决问题;而最佳的则是态度很好,还能帮助你解决问题。这次事件中,机场办票人员属于最低层次,携程的客服介于中高之间(主动的尝试帮我解决问题,只是尚未解决),而帮我办票的人则属于最高层次。
同时,我想起了盛大的客服。盛大的客服就是典型的脾气好,但是不解决问题的那种的中间层次,虽然打不还手,骂不还口,但是我一点都不欣赏这些人。
我很久没有玩永恒之塔了,盛大总是有事没事就打电话过来,让我回去玩玩。某天,我突然想上游戏看看了,但是发现密码已经不对,试图修改密码吧,系统又说我的账号不能修改密码。于是我打电话给盛大的所谓白金客服,在输入他们要求的数字账号上就费了大劲(网上搜索后才知道如何做,问这个问题的人不少),接通以后,她们问我有没有绑定密保,我说没有(搞那么麻烦干啥?我都已经用手机短信绑定了),她们说:“那我们就没有办法啦!你要打电话XXXXXXXX去****吧!”,我压根就没听,冷笑一声:“你们平时总是打电话骚扰我让我去游戏,但是等我想去了你们就这么折腾我?算啦!”然后,客服小妹毫无挽留之意的让我挂机而去。虽然我知道,推广和客服根本就是公司里两个系统,问题是,哪个用户会关心这一点呢?若不能帮用户解决问题,若不能降低用户解决问题的门槛,这不是摆明就是要人流失吗?
早晨我赶到机场的时候,却遇到了一些不太顺利的事情。Check in的时候,机场办票人员说查不到我的票务信息要我找售票处查询一下。我有点郁闷,找了半天总算找到了携程的电话。打电话过去,携程果然说一切正常,这让我更加郁闷,不怕有问题,就怕没bug。接下来我预感就要出事。
我再询问办票人员时,她说不行,电脑里没有。我想了想,问:“你是按照名字查询的还是身份证号查询的”,之所以这么问是因为民航订票系统打不出来我的名字,想试试看是否是因为名字问题导致了问题 - 虽然我认为这种情况几乎不可能(毕竟办票人员受过专业训练,这种打不出名字的情况应该遇到的很多了),但是现在明明有故障,我总得尝试点什么找出问题所在。
此时,办票人员也颇不耐烦,没有回答我的问题(大概是不屑向我这种业余人士说明什么),总是说:“电脑里没有信息”,我问:“你能不能给我解释一下?” - 我总找找原因,解决问题,不能耗在这里一直到晚点吧?
这时候,她身后的小伙子到插了一句嘴,我没有听清楚,但是大概是去62号售票柜台可以解决问题,可是此大姐很不耐烦的回了他几句,此时我再问:“我该怎么办?”,她嘟囔了几句,我没听太清楚,突然无名火起(感觉我现在脾气是越发的差了,一点耐性也无),心头大怒,喝道:“难道我就在这里发呆,一点办法都没有了吗?你就不能给出我一点建议吗?我去62号柜台能不能解决问题?要多久能解决问题?”然后双方就是一阵大吵,因为我还没挂携程的电话,他们的客服赶紧叫我把电话给办票人员,好去交涉,不过交涉下来仍然未果。此时,大姐背后斜刺杀出一人,带我去厦航的柜台,几分钟就解决了问题。
事后反思了一下,首先这个过程我情绪控制的不好,其实静下心来交流一下,解决这个问题本也不难,只是很难按捺得住(本来想投诉办票人员,后来想想算了,得饶人处且饶人吧)。另外,从这里可以看出携程的客服人员比机场的办票人员要强不少,办票人员只管抛出问题,但是不解决问题,甚至连解决方案都不给,这点携程的客服人员帮助客户解决问题的意识就要强得多,而帮我解决问题的那个工作人员(可能是厦航售票人员?)则最务实,在这种局面没有用语言,而是用行动直接帮助我解决了问题,因此整个环节我最感激他。
总的来说,客服大概可以分作三个层次,最低级的是能联系上,只是双方一阵对骂;其次是对方脾气很好,任你蹂躏,就是不帮你解决问题;而最佳的则是态度很好,还能帮助你解决问题。这次事件中,机场办票人员属于最低层次,携程的客服介于中高之间(主动的尝试帮我解决问题,只是尚未解决),而帮我办票的人则属于最高层次。
同时,我想起了盛大的客服。盛大的客服就是典型的脾气好,但是不解决问题的那种的中间层次,虽然打不还手,骂不还口,但是我一点都不欣赏这些人。
我很久没有玩永恒之塔了,盛大总是有事没事就打电话过来,让我回去玩玩。某天,我突然想上游戏看看了,但是发现密码已经不对,试图修改密码吧,系统又说我的账号不能修改密码。于是我打电话给盛大的所谓白金客服,在输入他们要求的数字账号上就费了大劲(网上搜索后才知道如何做,问这个问题的人不少),接通以后,她们问我有没有绑定密保,我说没有(搞那么麻烦干啥?我都已经用手机短信绑定了),她们说:“那我们就没有办法啦!你要打电话XXXXXXXX去****吧!”,我压根就没听,冷笑一声:“你们平时总是打电话骚扰我让我去游戏,但是等我想去了你们就这么折腾我?算啦!”然后,客服小妹毫无挽留之意的让我挂机而去。虽然我知道,推广和客服根本就是公司里两个系统,问题是,哪个用户会关心这一点呢?若不能帮用户解决问题,若不能降低用户解决问题的门槛,这不是摆明就是要人流失吗?
2010年7月3日星期六
2010年6月30日星期三
多重继承与dynamic_cast
这几天在做Ogre、CEGUI类句柄功能时,突然想起一个问题:
如果一个类继承自两个基类,比如C继承自A、B,若取类C的基类B的指针pb,那么使用dynamic_cast应该还是可以将pb转回指向类C的指针的,也就是以下代码成立:
class C : public A, public B
{
};
C c;
B *pb;
pb = &c;
assert((void *) pb != (void *) &c);
assert(dynamic_cast pb == &c);
之所以说pb可以转换让我值得琢磨,是因为C的基类A指针具有如此特性,那是非常容易理解的,如例:
A *pa;
pa = &c;
assert((void *) pa == (void *) &c);
assert(dynamic_cast pb == &c);
也就是说pa指针从数值上等于&c,这样pa指向的类使用的vtable就是类C的vtable。而pb显然不等于pa,一般也不等于&c(至于是pa等于&c,还是pb等于&c,这点也许是编译器的特性,我不能肯定C++的标准是如何定义的,但是gcc和msvc都是让pa等于&c)。也就是说pb使用的vtable不是类c的vtable。
倘若pb使用的是类B的vtable,那么dynamic_cast如何知道pb实际上是一个指向C的基类的指针呢?确切的说,它不可能知道,而dynamic_cast又能正常的工作,那么也就是说,pb使用的vtable,绝非是类B的vtable,于是我做了一下实验以确认:
#include <stdio.h>
class A
{
public:
int a;
virtual ~A() {};
};
class B
{
public:
int b;
virtual ~B() {};
};
class C : public A, public B
{
public:
int c;
};
class D : public C
{
public:
int d;
};
int main(int argc, char *argv[])
{
B b;
C c;
D d;
B *pb1, *pb2, *pb3;
C *pc;
pb1 = &b;
pb2 = &c;
pb3 = &d;
pc = &c;
printf("pb1.vtable = %p\npb2.vtable = %p\npb3.vtable = %p\npc.vtable = %p\n",
*(int *) pb1, *(int *) pb2, *(int *) pb3, *(int *) pc);
return 0;
}
根据结果,同样是类B的vtable,原始B类,在C中的基类B,在D中的基类B,其vtable都是不同的。
这意味我们在定义基类时,需要关注一点,每一次派生,都会生成相当数量的vtable(具体数量看其直接、间接继承的基类数量)。
我觉得类继承机制是C++语言的一个非常糟糕的机制,可能是第二差劲的语言特性。继承过程混淆不清,而且隐藏了很多指针变换的操作,不易理解,而且也非常的危险。
我更倾向于类似Java那样的接口机制。如果可以重新设计C++语言的话,我会支持这样做:
如果一个类继承自两个基类,比如C继承自A、B,若取类C的基类B的指针pb,那么使用dynamic_cast应该还是可以将pb转回指向类C的指针的,也就是以下代码成立:
class C : public A, public B
{
};
C c;
B *pb;
pb = &c;
assert((void *) pb != (void *) &c);
assert(dynamic_cast
之所以说pb可以转换让我值得琢磨,是因为C的基类A指针具有如此特性,那是非常容易理解的,如例:
A *pa;
pa = &c;
assert((void *) pa == (void *) &c);
assert(dynamic_cast
也就是说pa指针从数值上等于&c,这样pa指向的类使用的vtable就是类C的vtable。而pb显然不等于pa,一般也不等于&c(至于是pa等于&c,还是pb等于&c,这点也许是编译器的特性,我不能肯定C++的标准是如何定义的,但是gcc和msvc都是让pa等于&c)。也就是说pb使用的vtable不是类c的vtable。
倘若pb使用的是类B的vtable,那么dynamic_cast如何知道pb实际上是一个指向C的基类的指针呢?确切的说,它不可能知道,而dynamic_cast又能正常的工作,那么也就是说,pb使用的vtable,绝非是类B的vtable,于是我做了一下实验以确认:
#include <stdio.h>
class A
{
public:
int a;
virtual ~A() {};
};
class B
{
public:
int b;
virtual ~B() {};
};
class C : public A, public B
{
public:
int c;
};
class D : public C
{
public:
int d;
};
int main(int argc, char *argv[])
{
B b;
C c;
D d;
B *pb1, *pb2, *pb3;
C *pc;
pb1 = &b;
pb2 = &c;
pb3 = &d;
pc = &c;
printf("pb1.vtable = %p\npb2.vtable = %p\npb3.vtable = %p\npc.vtable = %p\n",
*(int *) pb1, *(int *) pb2, *(int *) pb3, *(int *) pc);
return 0;
}
根据结果,同样是类B的vtable,原始B类,在C中的基类B,在D中的基类B,其vtable都是不同的。
这意味我们在定义基类时,需要关注一点,每一次派生,都会生成相当数量的vtable(具体数量看其直接、间接继承的基类数量)。
我觉得类继承机制是C++语言的一个非常糟糕的机制,可能是第二差劲的语言特性。继承过程混淆不清,而且隐藏了很多指针变换的操作,不易理解,而且也非常的危险。
我更倾向于类似Java那样的接口机制。如果可以重新设计C++语言的话,我会支持这样做:
- 一个类可以继承若干接口
- 类实例有一个接口类列表,指向所有的接口类;每个接口类实力有一个owner指针,指向派生类
- 调用时自动选择相应的接口类,如果重名,需要指明名字空间
2010年6月29日星期二
诸葛亮的军事冒险与项目开发
刘备死后,诸葛亮屡次北伐,试图占据中原。当年看到这段故事,唏嘘不已。只是小时候不明事理,没有多想,后来三国历史了解的多了一些,才觉得有些不妥。
先看一下三国之后晋国时期的人口资源,以便参考:
故魏国143万户
司州 户475.7K
兗州 户83.3K
豫州 户116.8K
冀州 户326.0K
幽州 户59.0K
平州 户18.0K
并州 户59.2K
雍州 户99.5K
凉州 户30.7K
秦州 户32.1K
青州 户53.0K
徐州 户81.0K
三国时期人口略少,但比例类似。算下来魏国的地理占天下近半,人口更是占了近6成(中国南部大部分还属于无人地区或是少数民族占据),而且北方经济发达、士兵身体素质好、还占据了出产良马的地方,魏国朝政没有严重缺陷,军事力量也很稳健,魏蜀两国国力相差实在悬殊(人口相差近5倍)。
注:关于地理可参见三国时期地图(请无视新疆部分)。
按照道理,蜀国丢失荆州以后,已经基本没有争取天下的能力了,后来刘备搞了一把军事冒险,结果在夷道猇亭被陆逊大破,蜀国就彻底没有机会了。诸葛亮一次又一次,连续折腾了三次,纯粹是抱着侥幸在冒险,最后死在五丈原,殊为不智。
十多年过去了,我做了几个项目,又看了若干项目才真正明白过来。诸葛亮并非不智,而是大智。我都能看到的问题,他岂能看不到?诸葛亮手里的资料齐备,各郡钱粮人马一目了然,他又是治国高手,蜀国无力和魏国争锋,孔明心中自然有数。
但是,做项目只要有一线希望,就必须坚持,各代开国帝王,有几人是很有希望夺取天下的?之前的刘邦、刘秀、曹操哪个不是从一线希望中挣扎而出的?他们运气稍微差点,早就死了无数次了。诸葛亮坚持北伐,就是指望万一捡到一个大漏(就像刘邦当年袭取三秦,简直就是捡来的),或许就做成了。
做项目成功就像是投骰子,有一定的几率,哪面朝上只能听从神的安排。但是,投几次骰子却非上天注定,而是取决于自己的意志。诸葛亮运气差点,投的是12面骰子,几率很低,虽然如此,他也要努力多扔几次。
可惜,诸葛亮还是疏忽了一点,想投几次不光看国力,还要看体力,他老人家身体不好,54岁就挂了。要是能像司马懿那样多活二十年,没准项目就让他做成了。锻炼身体才是王道啊!
所以,做项目成功的三要素:体力(能扔几次)、毅力(愿意扔几次)、实力(扔的是几面骰子)。
先看一下三国之后晋国时期的人口资源,以便参考:
故魏国143万户
司州 户475.7K
兗州 户83.3K
豫州 户116.8K
冀州 户326.0K
幽州 户59.0K
平州 户18.0K
并州 户59.2K
雍州 户99.5K
凉州 户30.7K
秦州 户32.1K
青州 户53.0K
徐州 户81.0K
故蜀国31万户
梁州 户76.3K
益州 户149.3K
宁州 户83.0K
梁州 户76.3K
益州 户149.3K
宁州 户83.0K
故吴地74万户
荆州 户357.5K
扬州 户311.4K
交州 户25.6K
广州 户43.1K
荆州 户357.5K
扬州 户311.4K
交州 户25.6K
广州 户43.1K
三国时期人口略少,但比例类似。算下来魏国的地理占天下近半,人口更是占了近6成(中国南部大部分还属于无人地区或是少数民族占据),而且北方经济发达、士兵身体素质好、还占据了出产良马的地方,魏国朝政没有严重缺陷,军事力量也很稳健,魏蜀两国国力相差实在悬殊(人口相差近5倍)。
注:关于地理可参见三国时期地图(请无视新疆部分)。
按照道理,蜀国丢失荆州以后,已经基本没有争取天下的能力了,后来刘备搞了一把军事冒险,结果在夷道猇亭被陆逊大破,蜀国就彻底没有机会了。诸葛亮一次又一次,连续折腾了三次,纯粹是抱着侥幸在冒险,最后死在五丈原,殊为不智。
十多年过去了,我做了几个项目,又看了若干项目才真正明白过来。诸葛亮并非不智,而是大智。我都能看到的问题,他岂能看不到?诸葛亮手里的资料齐备,各郡钱粮人马一目了然,他又是治国高手,蜀国无力和魏国争锋,孔明心中自然有数。
但是,做项目只要有一线希望,就必须坚持,各代开国帝王,有几人是很有希望夺取天下的?之前的刘邦、刘秀、曹操哪个不是从一线希望中挣扎而出的?他们运气稍微差点,早就死了无数次了。诸葛亮坚持北伐,就是指望万一捡到一个大漏(就像刘邦当年袭取三秦,简直就是捡来的),或许就做成了。
做项目成功就像是投骰子,有一定的几率,哪面朝上只能听从神的安排。但是,投几次骰子却非上天注定,而是取决于自己的意志。诸葛亮运气差点,投的是12面骰子,几率很低,虽然如此,他也要努力多扔几次。
可惜,诸葛亮还是疏忽了一点,想投几次不光看国力,还要看体力,他老人家身体不好,54岁就挂了。要是能像司马懿那样多活二十年,没准项目就让他做成了。锻炼身体才是王道啊!
所以,做项目成功的三要素:体力(能扔几次)、毅力(愿意扔几次)、实力(扔的是几面骰子)。
2010年6月27日星期日
头文件与正确编译
P02项目在Mac、Linux下的makefile是没有头文件的依赖规则的,如果修改了基类的头文件,往往需要重新编译整个工程。
昨天为CEGUI增加句柄功能,需要修改Window基类,以继承RootClass类。但是我在调试的时候,工程会莫名其妙的崩溃,看了一下,怀疑是依赖头文件的源文件没有编译。于是我把CEGUI & CXCentaur全部都编译了一下,并且在相应模块的源文件中打印sizeof(CEGUI::Window)看看是否一致。
结果发现sizeof(CEGUI::Window)大小一致,但是问题没有解决,很有点奇怪:
Window::d_children这个列表本应为空,但是在gdb中打印时,一开始为0,再打印却不为0,我设置了内存断点,但是并没有断下。代码中取d_children size()使用的函数是Window中的getChildCount()函数,于是在CEGUI::Window::getChildCount设置断点看看,却发现gdb提示有3个断点。想了一下,知道了原因:
因为getChildCount函数是定义在头文件中,属于inline函数。这说明还有文件引用了修改的头文件,但是未编译更新。于是我把整个工程rebuild了一次,问题即解决。
如果只是build跨平台版本,无需制作依赖关系,倘若需要在平台下开发调试,不制作依赖关系成本还是过于高昂了。
昨天为CEGUI增加句柄功能,需要修改Window基类,以继承RootClass类。但是我在调试的时候,工程会莫名其妙的崩溃,看了一下,怀疑是依赖头文件的源文件没有编译。于是我把CEGUI & CXCentaur全部都编译了一下,并且在相应模块的源文件中打印sizeof(CEGUI::Window)看看是否一致。
结果发现sizeof(CEGUI::Window)大小一致,但是问题没有解决,很有点奇怪:
Window::d_children这个列表本应为空,但是在gdb中打印时,一开始为0,再打印却不为0,我设置了内存断点,但是并没有断下。代码中取d_children size()使用的函数是Window中的getChildCount()函数,于是在CEGUI::Window::getChildCount设置断点看看,却发现gdb提示有3个断点。想了一下,知道了原因:
因为getChildCount函数是定义在头文件中,属于inline函数。这说明还有文件引用了修改的头文件,但是未编译更新。于是我把整个工程rebuild了一次,问题即解决。
如果只是build跨平台版本,无需制作依赖关系,倘若需要在平台下开发调试,不制作依赖关系成本还是过于高昂了。
2010年6月19日星期六
取多重继承类中子类的偏移
当一个Class继承多个基类时,如何取其中各个基类相对偏移?
通过类型转换即可,如下例:
#include <stdio.h>
class CBase
{
public:
int b;
virtual void vbase() {}
void base()
{
printf("CBase::this = 0x%p\n", this);
}
};
class COther
{
public:
int o1;
int o2;
virtual void vother() {}
void other()
{
printf("CBase::this = 0x%p\n", this);
}
};
class CDerive : public CBase, public COther
{
public:
int d1;
int d2;
int d3;
void derive()
{
printf("CBase::this = 0x%p\n", this);
}
};
// Get the offset of member in class
#define GetOffsetOfMember(member, CClass) (((int) &((CClass *) 1)->member) - 1)
// Get the offset of sub class in derived class
#define GetOffsetOfClass(CBase, CSub) (((int) (static_cast <CBase *>((CSub *) 1))) - 1)
int main(int argn, char *argv[])
{
printf("COther@CDerive = %d\n", GetOffsetOfClass(COther, CDerive));
printf("o1@CDerive= %d\n", GetOffsetOfMember(o1, CDerive));
printf("b@CDerive= %d\n", GetOffsetOfMember(b, CDerive));
}
需要注意的是,不要直接使用指针0进行转换取类指针偏移(这是计算类成员变量的常用方法)。
通过类型转换即可,如下例:
#include <stdio.h>
class CBase
{
public:
int b;
virtual void vbase() {}
void base()
{
printf("CBase::this = 0x%p\n", this);
}
};
class COther
{
public:
int o1;
int o2;
virtual void vother() {}
void other()
{
printf("CBase::this = 0x%p\n", this);
}
};
class CDerive : public CBase, public COther
{
public:
int d1;
int d2;
int d3;
void derive()
{
printf("CBase::this = 0x%p\n", this);
}
};
// Get the offset of member in class
#define GetOffsetOfMember(member, CClass) (((int) &((CClass *) 1)->member) - 1)
// Get the offset of sub class in derived class
#define GetOffsetOfClass(CBase, CSub) (((int) (static_cast <CBase *>((CSub *) 1))) - 1)
int main(int argn, char *argv[])
{
printf("COther@CDerive = %d\n", GetOffsetOfClass(COther, CDerive));
printf("o1@CDerive= %d\n", GetOffsetOfMember(o1, CDerive));
printf("b@CDerive= %d\n", GetOffsetOfMember(b, CDerive));
}
2010年6月18日星期五
订阅:
评论 (Atom)



















