早晨上班,发觉系统有点诡异的表现,鼠标移动到Menu bar上的快捷图标时显示busy,当时没多想,简单的重启了电脑就算了。
开完会回来发现问题没有解决,而且鼠标移动都很不流畅,看CPU占用率似乎不是很高,但是机器风扇死转,温度很高。打开活动监视器的显示全部进程才发现kernel task占用了几乎所有的CPU。一时没有头绪,怀疑是最近更新出了问题,于是研究了一下网上的说法,没有答案。
再看了一下/var/log目录下的日志,大小正常。用dmesg查看,发现报告发现IP地址冲突,有点奇怪,难道有人用了我的IP?就算这样也不能把系统弄的CPU占用100%啊,拔下网线,突然一切都回复正常了。
验证了一下,插上网线就会很卡,日志有报错,拔下就OK,尝试修改IP地址也无效。这时候陈拓琳说了一下:“你不会接错网线了吧”,我说“不会”,突然想起来上周末搬位置后还没有试验过上网,难道真是接错了?赶紧钻下去研究了一下,不看不知道,一看差点没有晕过去,我的switcher就没接上行出口,而是自己给自己接了一个回路... 导致造成了一个人为的广播风暴,这个乌龙可摆大了。
2008年6月27日星期五
收录一个笑话
1.__________,为伊消得人憔悴
同学答:宽衣解带终不悔
(正解为“衣带渐宽终不悔”,偶承认这个是思想有问题)
2.君子成人之美,__________
同学答:小人夺人所爱
(直接晕死)
3.穷则独善其身,__________
同学答:富则妻妾成群
(正解:达则兼济天下)
_________,天下谁人不识君
同学答:只要貌似萨达姆
(汗 | | |....)
4.但愿人长久,__________
同学答:一颗永流传
(当时狂笑,现在觉得挺经典的。正解为“千里共婵娟”)
5.洛阳亲友如相问,__________
同学答:请你不要告诉他
(正解为“一片冰心在玉壶”)
6.期末考试出对联, 上联是:英雄宝刀未老
该初三同学对下联为:老娘丰韵尤存
7.五年级的一次考试就考到了“三个臭皮匠,__________”
同学答:臭味都一样
(把监考和外面的校长笑翻了)
8.书到用时方恨少,__________
同学答:钱到月底不够花
同学答:宽衣解带终不悔
(正解为“衣带渐宽终不悔”,偶承认这个是思想有问题)
2.君子成人之美,__________
同学答:小人夺人所爱
(直接晕死)
3.穷则独善其身,__________
同学答:富则妻妾成群
(正解:达则兼济天下)
_________,天下谁人不识君
同学答:只要貌似萨达姆
(汗 | | |....)
4.但愿人长久,__________
同学答:一颗永流传
(当时狂笑,现在觉得挺经典的。正解为“千里共婵娟”)
5.洛阳亲友如相问,__________
同学答:请你不要告诉他
(正解为“一片冰心在玉壶”)
6.期末考试出对联, 上联是:英雄宝刀未老
该初三同学对下联为:老娘丰韵尤存
7.五年级的一次考试就考到了“三个臭皮匠,__________”
同学答:臭味都一样
(把监考和外面的校长笑翻了)
8.书到用时方恨少,__________
同学答:钱到月底不够花
2008年6月25日星期三
通胀大涨支持房价上扬
来自腾讯网的文章:house.qq.com/a/20080624/000011.htm
潘先生鼓吹的这个论点并非没有道理,但是如果这种情况真的发生了,那将是最糟糕的一种。中国经济完蛋,全民遭灾。
目前我们的CPI已经在一个高度危险的地区,这是在生活中已经可以明显感受到的实在压力而非是停留在纸面的经济数字,倘若要想支撑目前的房价甚至上扬,目前的CPI需要到50%甚至100%,那么将会导致经济全面混乱,人民币从升值掉头回落栽倒,外资出逃,中国外汇储备急降,出口减少,同时内需极度萎缩,这时很有可能需要实施配给制度才能稳定局面。
以厦门的情况(租金、收入水平)来看,目前的房价再下跌30%-50%才能算是合理价位,倘若如此,这当然也不是什么好事。如果一方面房间下跌20%,另一方面再温和持续通胀,人民币汇率稳定,达到一个可以接受的平衡结果,算是坏局面中比较不坏的一个。
奥运会转眼就到,这个泡沫裂开之后,我们的经济终将如何?
唉,千百年来,黄金才是硬道理。手握金砖,心头不慌啊。
潘先生鼓吹的这个论点并非没有道理,但是如果这种情况真的发生了,那将是最糟糕的一种。中国经济完蛋,全民遭灾。
目前我们的CPI已经在一个高度危险的地区,这是在生活中已经可以明显感受到的实在压力而非是停留在纸面的经济数字,倘若要想支撑目前的房价甚至上扬,目前的CPI需要到50%甚至100%,那么将会导致经济全面混乱,人民币从升值掉头回落栽倒,外资出逃,中国外汇储备急降,出口减少,同时内需极度萎缩,这时很有可能需要实施配给制度才能稳定局面。
以厦门的情况(租金、收入水平)来看,目前的房价再下跌30%-50%才能算是合理价位,倘若如此,这当然也不是什么好事。如果一方面房间下跌20%,另一方面再温和持续通胀,人民币汇率稳定,达到一个可以接受的平衡结果,算是坏局面中比较不坏的一个。
奥运会转眼就到,这个泡沫裂开之后,我们的经济终将如何?
唉,千百年来,黄金才是硬道理。手握金砖,心头不慌啊。
2008年6月23日星期一
makefile的一个规则依赖的问题
今天我在尝试调整依赖规则时,发现makefile的一个实现和我想像的不一样,以下是一个缩减过的makefile:
all : liba.a
liba.a : $(OBJS)
ar -q $@ lt;
OBJS = a.o
.c.o :
gcc -o $@ -c lt;
注:其中a.c只是一个最简单的hello world程序。
编译时会直接链接a.o,结果找不到该文件。让人感觉liba.a依赖于$(OBJS)没有检查后面的依赖对象就直接执行命令了。
如果我们将OBJS移动到liba.a依赖规则之前,则没有任何问题。也就是说,虽然make中采用=赋值的变量是无序的(即和定义的顺序无关),但是依赖规则中使用的变量看来是有序的。变量必须先于使用依赖规则的变量定义。
我尚不知这是gmake的特性还是本版本gmake的bug,抑或是make的约定。但是需要确认的一点是,有必要保障变量先于规则定义。
all : liba.a
liba.a : $(OBJS)
ar -q $@ lt;
OBJS = a.o
.c.o :
gcc -o $@ -c lt;
注:其中a.c只是一个最简单的hello world程序。
编译时会直接链接a.o,结果找不到该文件。让人感觉liba.a依赖于$(OBJS)没有检查后面的依赖对象就直接执行命令了。
如果我们将OBJS移动到liba.a依赖规则之前,则没有任何问题。也就是说,虽然make中采用=赋值的变量是无序的(即和定义的顺序无关),但是依赖规则中使用的变量看来是有序的。变量必须先于使用依赖规则的变量定义。
我尚不知这是gmake的特性还是本版本gmake的bug,抑或是make的约定。但是需要确认的一点是,有必要保障变量先于规则定义。
2008年6月21日星期六
将问鼎移植到Linux下
概述
本文介绍了将版本移植到Linux下的一些工作。
一个不错的设计
因为make过程中我将不同平台的中间文件(.o、.a)分开存放,这样可以用一个view同时build基于MacOS和Linux的工程,减少了view的数量。
通过远程访问X-Server性能有点糟糕
调试的时候我使用安装在MacBook下的X-Server,速度不佳,效果不好。问题并不仅仅在这里,而是在帧数如此至少的情况下,对播放录像可能会造成一些问题。设计录像功能时需要考虑这点。
本文介绍了将版本移植到Linux下的一些工作。
背景
我首先将版本移植到了MacOS下,然后再移植到了Linux下(基于X-Windows工作)。相比之下,移植到Linux下的工作要容易一些,这并不是说移植到Linux下这件事情本身更简单,而是MacOS也使用gcc、类Unix的环境,所以在完成这个移植工作以后,再向Linux下移植所需的工作则少了很多。
我首先将版本移植到了MacOS下,然后再移植到了Linux下(基于X-Windows工作)。相比之下,移植到Linux下的工作要容易一些,这并不是说移植到Linux下这件事情本身更简单,而是MacOS也使用gcc、类Unix的环境,所以在完成这个移植工作以后,再向Linux下移植所需的工作则少了很多。
过程
基本上,主要是遵循以下几步:
头两步几乎毫无阻碍,除了在使用configure配置CEGUI时遇到了一些麻烦。最终,因为CEGUI采用了3种工程文件 - VC Project、XCode Project、automake - 让我感到厌倦(我不希望每次修改工程都要让大家同时修改3个工程文件),我干掉了后面两种,增加了手工式的makefile。当然,按照陈拓琳的看法,最终使用premake类的工具统一工程文件可能更好。
渲染这一步我遇到一点小麻烦,程序运行起来以后没有绘制出任何内容,不过很走运,我们很快发现是因为创建的X-Window没有active的缘故,当activate这个窗口以后,顺利的得到的预期的画面。
增加消息处理这一步我根据一个简单的X Windows application修改了一下,因为游戏所需要的输入非常简单,这一步没有问题。
同理,最后一步没有任何技术含量。
基本上,主要是遵循以下几步:
- 编译
- 链接
- 完成渲染功能
- 增加消息处理
- 修订bugs
头两步几乎毫无阻碍,除了在使用configure配置CEGUI时遇到了一些麻烦。最终,因为CEGUI采用了3种工程文件 - VC Project、XCode Project、automake - 让我感到厌倦(我不希望每次修改工程都要让大家同时修改3个工程文件),我干掉了后面两种,增加了手工式的makefile。当然,按照陈拓琳的看法,最终使用premake类的工具统一工程文件可能更好。
渲染这一步我遇到一点小麻烦,程序运行起来以后没有绘制出任何内容,不过很走运,我们很快发现是因为创建的X-Window没有active的缘故,当activate这个窗口以后,顺利的得到的预期的画面。
增加消息处理这一步我根据一个简单的X Windows application修改了一下,因为游戏所需要的输入非常简单,这一步没有问题。
同理,最后一步没有任何技术含量。
总结
一个不错的设计
因为make过程中我将不同平台的中间文件(.o、.a)分开存放,这样可以用一个view同时build基于MacOS和Linux的工程,减少了view的数量。
通过远程访问X-Server性能有点糟糕
调试的时候我使用安装在MacBook下的X-Server,速度不佳,效果不好。问题并不仅仅在这里,而是在帧数如此至少的情况下,对播放录像可能会造成一些问题。设计录像功能时需要考虑这点。
2008年6月20日星期五
2008年6月19日星期四
Firefox 3发布了,IE团队为什么要送蛋糕庆祝
粗粗一看,IE团队心态很好,对竞争对手还这么友好。
古人有云“养贼自重”,就是放着贼不剿灭了,好让朝廷重用自己...阿弥陀佛,笑谈耳。
ps:一般已经不用IE了,不过访问银行网站,还是不得不用。倒不是Firefox比IE好多少,主要是IE不跨平台,而且针对IE漏洞的病毒也多了点。
参考新闻:tech.sina.com.cn/i/2008-06-19/09372269169.shtml
古人有云“养贼自重”,就是放着贼不剿灭了,好让朝廷重用自己...阿弥陀佛,笑谈耳。
ps:一般已经不用IE了,不过访问银行网站,还是不得不用。倒不是Firefox比IE好多少,主要是IE不跨平台,而且针对IE漏洞的病毒也多了点。
参考新闻:tech.sina.com.cn/i/2008-06-19/09372269169.shtml
2008年6月18日星期三
2008年6月17日星期二
缺乏科学精神的国人
前两天看电视,看到一个公益广告,宣称:“如果每个人都能及时拔掉充电器,那么每年将可关闭两百座百万千瓦火力的发电站。” 我一看大惊失色,这不是睁着眼睛说吓话么,用最简单的计算方法都可以知道这个荒谬之极 - 我们就用200 x 100万千瓦去除以总手机用户,中国今年手机用户数尚未超过5亿人,那么就算所有的用户都真的有手机,都在充电,那么:
200 * 100 * 10000 / (5 * 10000 0000) = 0.4KW = 400W
也就是说,每个手机400瓦?(实际上这个已经是很疯狂的计算方法了...)至于400瓦是一个什么概念,姑且不解释,总之我的手机充电器输出是5.7V 800mA也就是4.56瓦。
注:事实上,手机充电器在断开时几乎不会有任何功率。这个广告,估摸者夸张了有1万倍的样子。
想起前几次还看到一个什么“刷牙的时候,顺手关上水龙头,一年能省多少水?满满109个浴缸。”,这个也是荒谬的无法用语言形容。365天,109浴缸,每天刷两次牙也就意味刷一次压要用超过1/7浴缸的水。那么,一个浴缸有多大?我简单查了一下:www.bqok.com/showtype.asp,其中第一个超过640升,那么1/7浴缸就是91升。也就是相当于182瓶500ml的矿泉水瓶的容量,我真想对这个广告的策划说:你以为你是黑猩猩,每次能用这么多水刷牙?还109浴缸呢,你家的浴缸是给田螺姑娘用的,只有脸盆那么大吧?
另外,我在查询中国手机用户的数量时,发现原来天涯上早有人忍不住跳出来羞辱这群睁着眼睛说瞎话的人了,然而,一看回帖,我心里真是拔凉拔凉的...
参考帖子:www.tianya.cn/New/PublicForum/Content.asp
摘取其中一些人的回复:
楼主我为你悲哀
你不知道他是安全国人口来算的么!!!
不是平均到个人....
一个自以为是的家伙,无法评价,这种人总是能给我们带来更强大的自信。
楼主有毛病,环保宣传而已,省下来的数据越大越直观大家付出努力的劲头会越大。难道说刷牙关水龙头只能节省一次冲马桶的水,谁去去节省,觉得做不做关 系不大。重在宣传,这么较真不如去较贪官的真,天天机场守着,看到哪个是行政公务出国的都给记录下来,那个政府车辆是日本车的,都给拍下来,就算楼主牛 逼。
虚假宣传还不如不宣传,用这种荒谬的数据来欺骗大家?我们非常需要宣传公益,但是要用正确的方法来宣传。
你他妈的榆木脑袋啊,公益广告不是给你一个人看的,也不仅仅是给学过工科的人看的,是给广大老百姓看的!他们中有的没上过大学,对数字没概念。
又不是写论文,难道非要说节省多少多少立方(精确到小数点后4位数)你才满意?
说节约多少浴缸多形象,多直观。后面那些说法既生动形象,又直观,上至80岁的老头老太太,下至5、6岁的儿童,看了这个广告后应该多多少少都有一点环保的意识了吧。就你个傻逼在这里较真儿
如果杀人不犯法,我真想刨个坑把这种人埋了。
问题倒不在于世上存在着这么多无知的人(哪儿没点病人),而是电视台能公然的播放这种一看就有问题的资料,从设计到制作到审查,这么多环节的人都无视其中的谬误。我们国人何其缺乏科学精神,难怪气功、特异功能、水变油能一度横行,就连轮子功这个骗术也敢猖獗。我宁愿中国真的因为手机充电浪费200座电站,但求国人能仔细看看赛先生长什么样。
200 * 100 * 10000 / (5 * 10000 0000) = 0.4KW = 400W
也就是说,每个手机400瓦?(实际上这个已经是很疯狂的计算方法了...)至于400瓦是一个什么概念,姑且不解释,总之我的手机充电器输出是5.7V 800mA也就是4.56瓦。
注:事实上,手机充电器在断开时几乎不会有任何功率。这个广告,估摸者夸张了有1万倍的样子。
想起前几次还看到一个什么“刷牙的时候,顺手关上水龙头,一年能省多少水?满满109个浴缸。”,这个也是荒谬的无法用语言形容。365天,109浴缸,每天刷两次牙也就意味刷一次压要用超过1/7浴缸的水。那么,一个浴缸有多大?我简单查了一下:www.bqok.com/showtype.asp,其中第一个超过640升,那么1/7浴缸就是91升。也就是相当于182瓶500ml的矿泉水瓶的容量,我真想对这个广告的策划说:你以为你是黑猩猩,每次能用这么多水刷牙?还109浴缸呢,你家的浴缸是给田螺姑娘用的,只有脸盆那么大吧?
另外,我在查询中国手机用户的数量时,发现原来天涯上早有人忍不住跳出来羞辱这群睁着眼睛说瞎话的人了,然而,一看回帖,我心里真是拔凉拔凉的...
参考帖子:www.tianya.cn/New/PublicForum/Content.asp
摘取其中一些人的回复:
楼主我为你悲哀
你不知道他是安全国人口来算的么!!!
不是平均到个人....
一个自以为是的家伙,无法评价,这种人总是能给我们带来更强大的自信。
楼主有毛病,环保宣传而已,省下来的数据越大越直观大家付出努力的劲头会越大。难道说刷牙关水龙头只能节省一次冲马桶的水,谁去去节省,觉得做不做关 系不大。重在宣传,这么较真不如去较贪官的真,天天机场守着,看到哪个是行政公务出国的都给记录下来,那个政府车辆是日本车的,都给拍下来,就算楼主牛 逼。
虚假宣传还不如不宣传,用这种荒谬的数据来欺骗大家?我们非常需要宣传公益,但是要用正确的方法来宣传。
你他妈的榆木脑袋啊,公益广告不是给你一个人看的,也不仅仅是给学过工科的人看的,是给广大老百姓看的!他们中有的没上过大学,对数字没概念。
又不是写论文,难道非要说节省多少多少立方(精确到小数点后4位数)你才满意?
说节约多少浴缸多形象,多直观。后面那些说法既生动形象,又直观,上至80岁的老头老太太,下至5、6岁的儿童,看了这个广告后应该多多少少都有一点环保的意识了吧。就你个傻逼在这里较真儿
如果杀人不犯法,我真想刨个坑把这种人埋了。
问题倒不在于世上存在着这么多无知的人(哪儿没点病人),而是电视台能公然的播放这种一看就有问题的资料,从设计到制作到审查,这么多环节的人都无视其中的谬误。我们国人何其缺乏科学精神,难怪气功、特异功能、水变油能一度横行,就连轮子功这个骗术也敢猖獗。我宁愿中国真的因为手机充电浪费200座电站,但求国人能仔细看看赛先生长什么样。
从抗震救灾英雄少年评选活动说起
别误会,虽然这标题看上去似乎有点唱反调的意味,不过本文内容并非如此。
史载霍去病17岁大战匈奴,慕容垂13岁出击宇文,算下来,一个尚未高中毕业,另一个初中都没毕业,有点令人恍惚。不过看看现在这些少年英雄,想想也是理所当然。缺的不是人才,缺的是机会。
再想当年刘邦,带着沛县一群小吏,也能纵横天下,再定中国。其实一个县城里,果然就能出一帮治国安邦的能人啊。
人才难得,却并非少。
参考链接:politics.people.com.cn/GB/8198/124240/
史载霍去病17岁大战匈奴,慕容垂13岁出击宇文,算下来,一个尚未高中毕业,另一个初中都没毕业,有点令人恍惚。不过看看现在这些少年英雄,想想也是理所当然。缺的不是人才,缺的是机会。
再想当年刘邦,带着沛县一群小吏,也能纵横天下,再定中国。其实一个县城里,果然就能出一帮治国安邦的能人啊。
人才难得,却并非少。
参考链接:politics.people.com.cn/GB/8198/124240/
2008年6月16日星期一
《奋斗》观后感
前几天和MM看电视的时候,MM说这个片子不错,讲述的是80后小boy小girl的故事。
最近连续努力了一星期,把《奋斗》看完了。看完后第一感觉是:这个电视剧名字内容严重不符,叫《团圆》或是《一家子》还不错,到了32集收尾的时候,纷纷是各家声明:我们一家要在一起!
电视剧不错,挺好看,男帅女靓,说话俏皮,细节之处见匠心。
强烈希望做策划的同学看看陆涛做田园牧歌项目的经历,设计师是很容易陷入完美情节而无视成本控制的,虽说艺术品不能考虑回报,但是一定要考虑“能做出来”,正如米总大喝:“你得先把楼建出来!”,我整天念叨“我们先把游戏做出来!”,只有在合适的时候,我们才能去做不考虑回报的艺术品。所谓合适的时候,就是可以支撑所需的投入。
看了一下电视剧中的几个MM,感觉露露最不上台面,杨晓芸停留在某个层次,夏琳还可以,但是关键的地方总感觉要掉链子,米莱、方灵珊则显得最大方,难道气质真是和家境直接挂钩?另外,其中好像只有米莱和方灵珊坐车系安全带,其他人好像都不系,这是导演有意安排还是?
最近连续努力了一星期,把《奋斗》看完了。看完后第一感觉是:这个电视剧名字内容严重不符,叫《团圆》或是《一家子》还不错,到了32集收尾的时候,纷纷是各家声明:我们一家要在一起!
电视剧不错,挺好看,男帅女靓,说话俏皮,细节之处见匠心。
强烈希望做策划的同学看看陆涛做田园牧歌项目的经历,设计师是很容易陷入完美情节而无视成本控制的,虽说艺术品不能考虑回报,但是一定要考虑“能做出来”,正如米总大喝:“你得先把楼建出来!”,我整天念叨“我们先把游戏做出来!”,只有在合适的时候,我们才能去做不考虑回报的艺术品。所谓合适的时候,就是可以支撑所需的投入。
看了一下电视剧中的几个MM,感觉露露最不上台面,杨晓芸停留在某个层次,夏琳还可以,但是关键的地方总感觉要掉链子,米莱、方灵珊则显得最大方,难道气质真是和家境直接挂钩?另外,其中好像只有米莱和方灵珊坐车系安全带,其他人好像都不系,这是导演有意安排还是?
2008年6月15日星期日
股市虽跌 何妨之有
想想一两年前股市大涨长红之际,几乎所有知道股票的人都在开户或是买入,“股评专业人士”等主流骗子和“带头大哥”等亚主流的野鸡骗子也纷纷窜出,形式一片大好,不是小好,而是大好。虽说人人都在嘴上说:“我知道有风险。”然而,实际上几乎没有多少人认为自己会亏损,大家总认为自己会操作好,就算有下跌也会躲过。
现如今,股票跌破3000,再破2900,如果不考虑这段时间新上市的企业,其实指数早已跌得更低。各大金融论坛一片骂声,骂国家的有之、骂企业的有之、骂庄家的有之... 一副别人害死自己的表情。
其实何必着急,就算真是在6000点买入的,忍着放着,还是有可能翻本的,中国股市从90年到现在,暴涨暴跌也不是一次两次了,那次不是类似的情形?何况现在已破3000,集点钱买卖,3、5年之内还是能赚的嘛。
现如今,股票跌破3000,再破2900,如果不考虑这段时间新上市的企业,其实指数早已跌得更低。各大金融论坛一片骂声,骂国家的有之、骂企业的有之、骂庄家的有之... 一副别人害死自己的表情。
其实何必着急,就算真是在6000点买入的,忍着放着,还是有可能翻本的,中国股市从90年到现在,暴涨暴跌也不是一次两次了,那次不是类似的情形?何况现在已破3000,集点钱买卖,3、5年之内还是能赚的嘛。
ps:我在转移帖子的时候,已经是2010年6月,股票又从新从3000点跌到2500多点,我的股票损失惨重,不过几年来股票涨涨跌跌,假以时日,总会涨回去的。
2008年6月14日星期六
OGRE D3D & 浮点数精度问题
这两天问鼎客户端运行时出现一个问题,同一个公式在服务器端和客户端计算的结果不同。因为两端使用的都是同一个LPC driver,运行在同一个主机上,理论上不应该出现这种情况。
我关闭了客户端所有启动的代码以后,发现在计算双精度除法1.0/6时,结果并不是双精度的结果,而服务器端则保持是双精度的结果。进一步研究发现,可能是客户端受到了OGRE的影响,OGRE可能通过某个设置修改了FPU的行为。
首先我们确认:FPU的确可以通过指令FLDCW来控制计算只采用单精度的方式。
然后我一步步调整代码,最后确认在OGRE createRenderWindow以后就会变成单精度的工作方式。这时陈拓琳提议用OpenGL的renderer试试,发现果然恢复正常,不会变成单精度的工作方式,那么看来是D3D的renderer导致的结果。
幸运的是,陈拓琳很快在OGRE代码中搜索到了控制D3D的开关,可以控制这种行为,通过:
我关闭了客户端所有启动的代码以后,发现在计算双精度除法1.0/6时,结果并不是双精度的结果,而服务器端则保持是双精度的结果。进一步研究发现,可能是客户端受到了OGRE的影响,OGRE可能通过某个设置修改了FPU的行为。
首先我们确认:FPU的确可以通过指令FLDCW来控制计算只采用单精度的方式。
然后我一步步调整代码,最后确认在OGRE createRenderWindow以后就会变成单精度的工作方式。这时陈拓琳提议用OpenGL的renderer试试,发现果然恢复正常,不会变成单精度的工作方式,那么看来是D3D的renderer导致的结果。
幸运的是,陈拓琳很快在OGRE代码中搜索到了控制D3D的开关,可以控制这种行为,通过:
RenderSystem::setConfigOption("Floating-point mode", "Consistent")
可以让D3D不会修改FPU的工作方式,这个调用需要在构造Renderer以后尽快执行。
注:这个调用会在初始化时设置D3D的相应参数,通知D3D在执行其调用时先执行FSTCW保存状态,调用完毕再执行FLDCW恢复状态,不至于影响外部代码使用FPU的行为。
注:driver采用的是double类型来处理所有的浮点数运算,如果全部double均降格为单精度,计算最终结果是不会有问题的,但是因为driver会在OGRE初始化之前先载入一部分代码,这部分代码记录了一批双精度的值,和单精度混用会出问题。
注:浮点计算结果应该均采用4舍5入方式,这样即使单、双精度混用在日常游戏逻辑中也不会出现问题。但是这样对策划要求会提高,可能没有必要。
可以让D3D不会修改FPU的工作方式,这个调用需要在构造Renderer以后尽快执行。
注:这个调用会在初始化时设置D3D的相应参数,通知D3D在执行其调用时先执行FSTCW保存状态,调用完毕再执行FLDCW恢复状态,不至于影响外部代码使用FPU的行为。
注:driver采用的是double类型来处理所有的浮点数运算,如果全部double均降格为单精度,计算最终结果是不会有问题的,但是因为driver会在OGRE初始化之前先载入一部分代码,这部分代码记录了一批双精度的值,和单精度混用会出问题。
注:浮点计算结果应该均采用4舍5入方式,这样即使单、双精度混用在日常游戏逻辑中也不会出现问题。但是这样对策划要求会提高,可能没有必要。
从程序员的收入能看出什么
在CSDN上看到一篇文章,其中调查了美国程序员的薪资情况:
下面是使用18种编程语言的程序员年薪情况:
Erlang: $99,000
Objective-C: $82,000
Pascal: $81,000
C++: $80,000
TCL: $80,000
C#: $79,000
Java: $79,000
Python: $78,000
Perl: $77,000
Ruby: $74,000
COBOL: $73,000
JavaScript: $72,000
ColdFusion: $64,000
Delphi: $64,000
PHP: $64,000
Visual Basic: $64,000
C: $60,000
Haskell: $53,000
下面是使用18种编程语言的程序员年薪情况:
Erlang: $99,000
Objective-C: $82,000
Pascal: $81,000
C++: $80,000
TCL: $80,000
C#: $79,000
Java: $79,000
Python: $78,000
Perl: $77,000
Ruby: $74,000
COBOL: $73,000
JavaScript: $72,000
ColdFusion: $64,000
Delphi: $64,000
PHP: $64,000
Visual Basic: $64,000
C: $60,000
Haskell: $53,000
2008年6月12日星期四
Build CEGUI @ Linux - 2
先参考前文:doinglu.blogspot.com/2008/06/build-ogre-linux.html
CEGUI编译起来比OGRE要相对容易一些,依赖的库要少。不过因为我们对CEGUI改动很多,增加了很多文件,并且将动态载入FalagardWR & TinyXMLParser这两个模块修改为静态链接了(这是为了照顾Release static link for VC8而做的修改),所以需要额外做一些工作。
一、修改Makefile.am,加入源文件,调整链接参数。
二、运行autoreconf,重新生成Makefile.in
三、运行configure,重新生成Makefile
CEGUI编译起来比OGRE要相对容易一些,依赖的库要少。不过因为我们对CEGUI改动很多,增加了很多文件,并且将动态载入FalagardWR & TinyXMLParser这两个模块修改为静态链接了(这是为了照顾Release static link for VC8而做的修改),所以需要额外做一些工作。
一、修改Makefile.am,加入源文件,调整链接参数。
二、运行autoreconf,重新生成Makefile.in
三、运行configure,重新生成Makefile
参数如下:
CXXFLAGS=-I/home/G-BITS/doing/doing_p02_patch_linux/a02/3rd/include/pcre LDFLAGS=-L/home/G-BITS/doing/doing_p02_patch_linux/a02/3rd/lib/Linux PKG_CONFIG_PATH=/home/G-BITS/doing/project/pcre-7.2 ./configure --enable-opengl-renderer --prefix=/home/G-BITS/doing/doing_p02_patch_linux/a02/3rd/lib/Linux
(因为只是临时编译,所以采用的都是绝对路径)
CXXFLAGS=-I/home/G-BITS/doing/doing_p02_patch_linux/a02/3rd/include/pcre LDFLAGS=-L/home/G-BITS/doing/doing_p02_patch_linux/a02/3rd/lib/Linux PKG_CONFIG_PATH=/home/G-BITS/doing/project/pcre-7.2 ./configure --enable-opengl-renderer --prefix=/home/G-BITS/doing/doing_p02_patch_linux/a02/3rd/lib/Linux
(因为只是临时编译,所以采用的都是绝对路径)
四、配置X部分略,同于OGRE
五、在cegui/Samples/ScrollablePaneDemo/下运行ScrollablePaneDemo,一切正常(这这个目录下运行的原因是我们的cegui源代码中设置的资源目录是../datafiles)。
相比之下,比在MacOS下build要轻松的多,因为我们增加的很多代码让gcc不太愉快,所以需要调整,再到Linux下编译就没有这方面的问题了。
五、在cegui/Samples/ScrollablePaneDemo/下运行ScrollablePaneDemo,一切正常(这这个目录下运行的原因是我们的cegui源代码中设置的资源目录是../datafiles)。
相比之下,比在MacOS下build要轻松的多,因为我们增加的很多代码让gcc不太愉快,所以需要调整,再到Linux下编译就没有这方面的问题了。
Build OGRE @ Linux
环境:Red Hat Enterprise Linux AS release 4 (Nahant Update 4) + MacOS 10.5.2(Leopad)
软件:Ogre 1.4.8
步骤:
这里面用了我为了试验而临时使用的本地路径,不能直接引用。
软件:Ogre 1.4.8
步骤:
这里面用了我为了试验而临时使用的本地路径,不能直接引用。
- 先将第三方依赖库下载build好,放到指定目录
- 通过configure配置ogre,参数:ZZIPLIB_LIBS=-lzzip ZZIPLIB_CFLAGS=-I./ OIS_CFLAGS=-I/home/G-BITS/doing/doing_p02_patch_linux/a02/3rd/include OIS_LIBS=-lOIS LDFLAGS=-L/home/G-BITS/doing/doing_p02_patch_linux/a02/3rd/lib/Linux CXXFLAGS=-I/home/G-BITS/doing/doing_p02_patch_linux/a02/3rd/include/freeimage/ ./configure --disable-devil --disable-cg
- make
- make install
- 前往X Server端启动、配置X
- 打开X(MacOS下应用程序->实用工具->X11)
- 开启X Client的权限,在X server的shell下运行:xhost +
- 回到Linux下
- cd OGRE目录/Samples/Common/bin
- 运行程序
2008年6月9日星期一
不断优化、持续改进
比“我们把工作做好”的更高境界是什么?那就是能够“不断优化、持续改进”,也就是传说中CMM5的阶段。
我们来看一个例子:finance.sina.com.cn/stock/t/20080608/22404960805.shtml
金股之王炮制出一份出单圣经来应对客户,实际上,这份缜密的圣经并不是一成不变的,如果头一天客户提出了新问题,圣经里没有,到了第二天,公司就会把新问题的答案给增加进来,那么像这样的电话术是不是金股之王一家公司独有的秘籍呢?记者也了解到在深圳,不止金股之王一家在欺骗股民。
这句话切不可小觑,“如果头一天客户提出了新问题,圣经里没有,到了第二天,公司就会把新问题的答案给增加进来”,这就是传说的境界,不要认为这样做很容易,收集“新问题”,给出“标准答案”,这是一个挑战,能够通过这个挑战且不等闲。之所以难是因为优化不是某几个人的事情,而是整个团队的事情。需要团队有这个意识及行动,我们才能抵达这个境界。
标准化、量化、优化这是CMM进阶三阶段。大部分软件公司没做到,骗子公司倒是先做到了,这年头,高手满地爬啊!
我们来看一个例子:finance.sina.com.cn/stock/t/20080608/22404960805.shtml
金股之王炮制出一份出单圣经来应对客户,实际上,这份缜密的圣经并不是一成不变的,如果头一天客户提出了新问题,圣经里没有,到了第二天,公司就会把新问题的答案给增加进来,那么像这样的电话术是不是金股之王一家公司独有的秘籍呢?记者也了解到在深圳,不止金股之王一家在欺骗股民。
这句话切不可小觑,“如果头一天客户提出了新问题,圣经里没有,到了第二天,公司就会把新问题的答案给增加进来”,这就是传说的境界,不要认为这样做很容易,收集“新问题”,给出“标准答案”,这是一个挑战,能够通过这个挑战且不等闲。之所以难是因为优化不是某几个人的事情,而是整个团队的事情。需要团队有这个意识及行动,我们才能抵达这个境界。
标准化、量化、优化这是CMM进阶三阶段。大部分软件公司没做到,骗子公司倒是先做到了,这年头,高手满地爬啊!
2008年6月8日星期日
2008年6月7日星期六
莫名其妙的推断,这个大学算是白读了
今天看到一个电视节目,调查1990年6月23日开封市发生的一起UFO事件。其过程如下:
让我们来看看这个河南大学的张同学是怎么调查的:
1. 这个金属片是不是飞机上掉下来的?
他把这个金属片拿到当地一个军用机场,找到机械师,机械师说不是飞机上掉下来的,因为如果掉这么大块东西,飞机肯定是失事了,但是没有查到当日的飞机失事记录,所以张同学推断这个残片不会是飞机上掉下来的。
2. 这个金属片是不是火箭发射的抛落物?
张同学好像没有做这个调查。
注:记者询问了中国的火箭发射相关部门,得到的答复是一般掉在贵州深山,不会掉在开封这种人口稠密的地方,而且那几天中国也没有发射火箭。
3. 这个金属片是不是卫星上掉下来的?
外太空至今已经有1万多个记录在编的飞行器停止了工作,很多受到了地球引力而最终坠落到大气层了。而且某个材料专家通过鉴定分析,认为材料本身是铝镁合金,所以认为有这个可能。但是张同学不同意,因为残片上没有发现任何说明是人类制造的证据,比如铭文、铆钉什么的。而且据那个收取残片的民警声称这个残片当时一点都不热,如果是飞行器坠落,进入大气层速度这么快,肯定会燃烧,怎么会不热呢?
综上所述,张同学认为排除了所有的可能,所以这个残片肯定是外星文明来到地球的飞行器掉落的 - 记者采访的他时候那副信誓旦旦的样子,感觉他就是外星人了。
看到这里,我真是目瞪口呆,立刻起了将河南大学打入中国不入流大学档次的念头。(别怪我看问题这么片面,这叫一颗XXX坏了一锅粥。)
我看了半天,也没有看出来他排除了什么:
最后说一下,记者也是一帮毫无科学精神的二百五,跑来跑去,找了航天业的专业人士解释了一下,认为这个是航空器坠落的零件。而事件3根本就没去查,事件4简单查了一下,医生说邢某送进来的时候已经神智不清了... 然后就结束了。
一帮子文盲。
- 据多个目击者称,当日有一个不明的飞行物体(UFO)冒着火光从开封上空坠落,砸到了开封市某个院子中的椿树,同时砸烂了一个自行车。
- 赶到当地的民警发现了一个金属残片,不热。
- 一年以后椿树死亡。
- 几个月以后院子主人邢志详(音)生病,号称在医院里面看到两个2米高的外星人,然后病就好了,最后于2005年去世。
- 河南大学化工系的一个学生张卫民(音)调查了这个进行残片。
让我们来看看这个河南大学的张同学是怎么调查的:
1. 这个金属片是不是飞机上掉下来的?
他把这个金属片拿到当地一个军用机场,找到机械师,机械师说不是飞机上掉下来的,因为如果掉这么大块东西,飞机肯定是失事了,但是没有查到当日的飞机失事记录,所以张同学推断这个残片不会是飞机上掉下来的。
2. 这个金属片是不是火箭发射的抛落物?
张同学好像没有做这个调查。
注:记者询问了中国的火箭发射相关部门,得到的答复是一般掉在贵州深山,不会掉在开封这种人口稠密的地方,而且那几天中国也没有发射火箭。
3. 这个金属片是不是卫星上掉下来的?
外太空至今已经有1万多个记录在编的飞行器停止了工作,很多受到了地球引力而最终坠落到大气层了。而且某个材料专家通过鉴定分析,认为材料本身是铝镁合金,所以认为有这个可能。但是张同学不同意,因为残片上没有发现任何说明是人类制造的证据,比如铭文、铆钉什么的。而且据那个收取残片的民警声称这个残片当时一点都不热,如果是飞行器坠落,进入大气层速度这么快,肯定会燃烧,怎么会不热呢?
综上所述,张同学认为排除了所有的可能,所以这个残片肯定是外星文明来到地球的飞行器掉落的 - 记者采访的他时候那副信誓旦旦的样子,感觉他就是外星人了。
看到这里,我真是目瞪口呆,立刻起了将河南大学打入中国不入流大学档次的念头。(别怪我看问题这么片面,这叫一颗XXX坏了一锅粥。)
我看了半天,也没有看出来他排除了什么:
- 飞机?就算正常情况下飞机不失事不会掉这么大的残片下来,他怎么能够确定查到了飞机没有失事的完整记录?某些国家进行的保密项目,就算试飞失事了也不会大张旗鼓的宣扬吧?
- 他根本就没查。(当然,可能他查不了,但是不能这么武断的就把这个因素忽视了)
- 太扯淡了,难道所有航天器上面都要打满铆钉和铭文?而且残片不热太正常了,你把铝镁合金烧热了,然后扔在地上放个5分钟,你看看它还热不?你觉得咱们国家的民警在1990年能够在5分钟内赶到某个他们该去的地方?(我看2008年也没戏)
最后说一下,记者也是一帮毫无科学精神的二百五,跑来跑去,找了航天业的专业人士解释了一下,认为这个是航空器坠落的零件。而事件3根本就没去查,事件4简单查了一下,医生说邢某送进来的时候已经神智不清了... 然后就结束了。
一帮子文盲。
2008年6月4日星期三
如何编写将源代码和编译生成的目标文件.o分离的makefile
概述
本文介绍了一种符合gmake要求的高级makefile编写方法。
背景介绍
必须注意到,makefile对于.o目标有一个特殊的依赖,即依赖于相同目录下 的.c或.cpp源文件。这样,如果简单的书写makefile,比如让工程目标依赖于若干的.o,那么这些.o在编译时将输出到和源代码相同的目录下, 即不方便管理,同时也会有有一个问题,那就是不能同时编译多种配置,比如编译debug以后,必须clean才能编译release。
当然,我们可以通过逐个.o显示的书写依赖规则,但是这一般需要使用一些工具来完成(否则工程浩大)。如果想只是简单的书写一个makefile就来达到目标,则需要使用一些特别的手段。
实现方案
在介绍这个方案之前,需要先说明几点。
因为原始的make功能较弱,所以这里介绍的makefile需要用gmake支持
我们当然希望能够写一个放之四海皆准的makefile,然而,由于make实在过于古老以至于我们无法简单的做到这一点。要么选择可移植的makefile生成工具,要么选用可移植的make软件,我们选用了流行的gmake。
这并不是唯一的实现方法
还有其他的方法,比如将源代码复制到另外一个目录;采用工具生成makefile;我们采用了使用VPATH的方法,但是采用VPATH也有几种实现方法,这里只是介绍了其中的一种。
好,现在让我们看看如何来做。
什么是VPATH
参考本文http://make.paulandlesley.org/vpath.html。
简单的说,VPATH可以指明源代码所在的搜索路径,让.o不一定依赖于相同目录下的.c/.cpp源文件,而可以依赖VPATH指明的路径集合中的某一个。我们可以认为,make默认VPATH为.,即当前路径。
一个最简单的实现
我们假设有一个源文件夹src,下有一个a.c,其功能是输出"hello world!"我们希望把它编译成a.out,中间文件a.o放到中文文件夹中,并且能根据配置debug/release分别放到obj/debug、obj/release下。
我们可以这么编写makefile(请注意所有规则后续的命令前面不是空格而是跳格 - TAB):
# Makefile of a.out
ifeq (IN_INT_DIR,$(MAKING_STATUS))
# Already enter target directory, do make
# Set source directoy
VPATH=$(SRCDIR)
# All configurations
debug : a.out
release : a.out
# Specifiy all obejcts
OBJS = a.o
# Rule a.out
a.out : $(OBJS)
gcc lt; -o $@
# 请注意上面两行前面是TAB而不是空格
未解决的问题
这个例子不能嵌套,因为makefile指明的宏会继承,也就是如果在第二部分去执行其他同样结构makefile,也会把定义的 SRCDIR、MAKING_STATUS宏传入,造成其他makefile会判断错误 - 当然,只要改写一下这个makefile就可以嵌套了
不支持用一句命令同时编译多个target,比如make debug release
本文介绍了一种符合gmake要求的高级makefile编写方法。
背景介绍
必须注意到,makefile对于.o目标有一个特殊的依赖,即依赖于相同目录下 的.c或.cpp源文件。这样,如果简单的书写makefile,比如让工程目标依赖于若干的.o,那么这些.o在编译时将输出到和源代码相同的目录下, 即不方便管理,同时也会有有一个问题,那就是不能同时编译多种配置,比如编译debug以后,必须clean才能编译release。
当然,我们可以通过逐个.o显示的书写依赖规则,但是这一般需要使用一些工具来完成(否则工程浩大)。如果想只是简单的书写一个makefile就来达到目标,则需要使用一些特别的手段。
实现方案
在介绍这个方案之前,需要先说明几点。
因为原始的make功能较弱,所以这里介绍的makefile需要用gmake支持
我们当然希望能够写一个放之四海皆准的makefile,然而,由于make实在过于古老以至于我们无法简单的做到这一点。要么选择可移植的makefile生成工具,要么选用可移植的make软件,我们选用了流行的gmake。
这并不是唯一的实现方法
还有其他的方法,比如将源代码复制到另外一个目录;采用工具生成makefile;我们采用了使用VPATH的方法,但是采用VPATH也有几种实现方法,这里只是介绍了其中的一种。
好,现在让我们看看如何来做。
什么是VPATH
参考本文http://make.paulandlesley.org/vpath.html。
简单的说,VPATH可以指明源代码所在的搜索路径,让.o不一定依赖于相同目录下的.c/.cpp源文件,而可以依赖VPATH指明的路径集合中的某一个。我们可以认为,make默认VPATH为.,即当前路径。
一个最简单的实现
我们假设有一个源文件夹src,下有一个a.c,其功能是输出"hello world!"我们希望把它编译成a.out,中间文件a.o放到中文文件夹中,并且能根据配置debug/release分别放到obj/debug、obj/release下。
我们可以这么编写makefile(请注意所有规则后续的命令前面不是空格而是跳格 - TAB):
# Makefile of a.out
ifeq (IN_INT_DIR,$(MAKING_STATUS))
# Already enter target directory, do make
# Set source directoy
VPATH=$(SRCDIR)
# All configurations
debug : a.out
release : a.out
# Specifiy all obejcts
OBJS = a.o
# Rule a.out
a.out : $(OBJS)
gcc lt; -o $@
# 请注意上面两行前面是TAB而不是空格
# Implicity rules
# make the file from $(SRCDIR)
# If the obj's directory is not created, create it
# -d means check exists
# || means when not exists (got false of the -d) do ...
# $(dir $@) means fetch the path of the output target
.c.o :
+@[ -d $(dir $@) ] || mkdir -p $(dir $@)
gcc -o $@ -c lt;
# 请注意上面两行前面是TAB而不是空格
else
# In source directory now, enter target directory & make by the first part of makefile
# Specify intermeidate directory ../obj/$(CONFIGURATION)
INTDIR = $(CURDIR)/../obj/$(MAKECMDGOALS)
# 1. Select target directory
# 2. Using this makefile again (select the part by input MACRO: MAKING_STATUS)
# 3. Specify the SRCDIR (current directory)
# 4. Specify the making status (already in target dir)
# 5. Send the makeing goals to following operation
MAKETARGET = $(MAKE) --no-print-directory \
-C $(INTDIR) \
-f $(CURDIR)/makefile \
SRCDIR=$(CURDIR) \
INTDIR=$(INTDIR) \
MAKING_STATUS=IN_INT_DIR \
$(MAKECMDGOALS)
# Configrations
debug : target
release : target
# Common target
target :
@mkdir -p $(INTDIR)
@$(MAKETARGET)
# make the file from $(SRCDIR)
# If the obj's directory is not created, create it
# -d means check exists
# || means when not exists (got false of the -d) do ...
# $(dir $@) means fetch the path of the output target
.c.o :
+@[ -d $(dir $@) ] || mkdir -p $(dir $@)
gcc -o $@ -c lt;
# 请注意上面两行前面是TAB而不是空格
else
# In source directory now, enter target directory & make by the first part of makefile
# Specify intermeidate directory ../obj/$(CONFIGURATION)
INTDIR = $(CURDIR)/../obj/$(MAKECMDGOALS)
# 1. Select target directory
# 2. Using this makefile again (select the part by input MACRO: MAKING_STATUS)
# 3. Specify the SRCDIR (current directory)
# 4. Specify the making status (already in target dir)
# 5. Send the makeing goals to following operation
MAKETARGET = $(MAKE) --no-print-directory \
-C $(INTDIR) \
-f $(CURDIR)/makefile \
SRCDIR=$(CURDIR) \
INTDIR=$(INTDIR) \
MAKING_STATUS=IN_INT_DIR \
$(MAKECMDGOALS)
# Configrations
debug : target
release : target
# Common target
target :
@mkdir -p $(INTDIR)
@$(MAKETARGET)
# 请注意上面两行前面是TAB而不是空格
endif
从注释可以了解这个makefile的构造。
endif
从注释可以了解这个makefile的构造。
- 这个makefile其实由两个部分组成,在源文件目录执行第二部分,在目标文件目录执行第一部分
- 我们使用了一个宏MAKING_STATUS来说明我们是在源目录还是目标目录
- 因为源文件本身也有子目录,所以到目标文件我们希望保持相同的目录关系(否则同名将会造成麻烦),因此需要使用"+@[ -d..."这一段来确保在目标目录下建立相同结构的子目录
- make使用的参数-C表示进行make是进入指定的目录工作
- make使用的参数-f表示使用制定的makefile
未解决的问题
这个例子不能嵌套,因为makefile指明的宏会继承,也就是如果在第二部分去执行其他同样结构makefile,也会把定义的 SRCDIR、MAKING_STATUS宏传入,造成其他makefile会判断错误 - 当然,只要改写一下这个makefile就可以嵌套了
不支持用一句命令同时编译多个target,比如make debug release
2008年6月1日星期日
如何在MacOS下让Dock栏上的icon跳动
这个有点类似Windows下闪烁标题栏的效果。
参考文档:
参考文档:
developer.apple.com/documentation/Carbon/Reference/Notification_Manager/Reference/reference.html#//apple_ref/doc/uid/TP40000915-CH201-DontLinkElementID_2
一个最简单的例子可以这样构建:
1. 用Xcode创建一个Carbon Application(不用选C++)
2. 修改一下处理new命令(原先的处理代码是handleNew),改为如下代码:
NMRec rec;
memset(&rec, 0, sizeof(rec));
rec.qType = nmType;
rec.nmMark = 1; // 注:根据文档所言,这里只要非0即可
NMInstall(&rec);
然后,当启动程序,选择菜单的File->New时,就可以看到效果了。
一个最简单的例子可以这样构建:
1. 用Xcode创建一个Carbon Application(不用选C++)
2. 修改一下处理new命令(原先的处理代码是handleNew),改为如下代码:
NMRec rec;
memset(&rec, 0, sizeof(rec));
rec.qType = nmType;
rec.nmMark = 1; // 注:根据文档所言,这里只要非0即可
NMInstall(&rec);
然后,当启动程序,选择菜单的File->New时,就可以看到效果了。
订阅:
评论 (Atom)