Fedora 14下编译安装chmsee 1.3.0

2011年2月26日 11:38

chm文件全名是Microsoft Compiled HTML Help,看名字也猜得出是微软的格式,Windows操作系统自带它的阅读器,chm普遍用于帮助文件和电子书,但在国内,他的应用范围更广,几乎很多在线文档本地化后都采用这个格式。一般做技术的不可能不接触它,但是一般Linux发行版本不自带chm的阅读器,只能安装软件,chmsee就是我所用过最好的chm阅读器了,他还是一款国产软件,我猜之所以看不到比他更好地国外软件,也许是因为中国人更有需求吧。

项目地址:http://code.google.com/p/chmsee/

但是Fedora 14的chmsee包有点奇怪,只有1.1.0版本,没有最新的1.3.0版本。1.1.0的Bug很厉害,影响了正常使用,最新版本则修复了这些Bug。但是Fedora 14没有chmsee最新版本,我在网上也没有搜索到适合Fedora的RPM包,惟一的OpenSUSE的RPM包使用yum localinstall安装仍有不能解决的依赖关系,这使得我们不得不用源码来编译安装了。

我看到项目网站上解释他没有发布二进制安装文件的原因是“Linux 的发行版太多了,还是只发布源码比较省事”,我不否认这种说法的正确性,但也不能否认源码编译安装对我这种Linux菜鸟而言确实非常困难。主要原因当然是缺乏库文件,而且一旦缺乏,我往往不知道该下载哪个包来解决,如果出现RPM包常见的依赖性地狱,更是让我绝望,所以,除非确实找不到二进制包并且需求这个软件,否则我绝对不会去编译源代码。

我看到他的项目文件讲了依赖如下:

cmake >= 2.6.4
gtk2 >= 2.18
xulrunner >= 1.9
chmlib
libxml2
libgcrypt
intltool
幸运的是,Yum库中这些软件全都有,不幸的是,安装了后连cmake都通不过,还是有大量库文件缺乏。后来猜测他的库文件可能不是放在这些可执行的程序中,而是放在devel包中,因此尝试安装了他们的devel包,结果竟然成功了(后来发现项目文件中说的很清楚:Before compiling, you need to check following libraries or their development packages already installed on your system.可惜我一开始没有注意),只要cmake一通过,就不会再有依赖性问题了,安装非常成功。下面复述下正确的依赖。
 
cmake
gtk2-devel
xulrunner-devel
chmlib-devel
libxml2-devel
libgcrypt-devel
intltool
版本方面不用担心,Yum库中的软件都符合要求。
 
软件截图:
 
 
可以看到中文乱码,这应该是1.3.0的一个Bug,chmsee采用内部默认的机制来识别编码,但有点问题,项目网站中已经有人提出,想必下一个版本即可修复。在此之前,可以手动修改文件编码为GB2312或是UTF-8,chmsee会缓存每一个曾经打开过的文件的编码设置。
chmsee的安装说明总体上还是很清楚的,至少按照他的说明来安装依赖后编译就不再出错,有些Linux软件就不是这样了,感觉依赖库根本没写全。我猜大概要好好学习下Linux下的编程才能清楚究竟该如何编译吧。如果大家有更好的技巧,请一定要告诉我,谢谢。

使用VirtualBox,一定是看中了他免费的特点(也许还号称开源,虽然我怀疑没有多少人会真的选择OSE版本,缺功能的),否则的话,这个虚拟机和VMware Workstation相比,根本不是一个级别的。VMware完全GUI操作,功能强大,使用方便,运行稳定。VirtualBox的功能就是他一个子集,而且还有大量命令行操作,使用非常不便,Bug也很多,幸亏核心功能还是比较稳定的。

但是在社会主义伟大精神的号召下,我还是想放弃盗版的VMware Workstation,毕竟一台Ubuntu电脑上装一盗版软件实在是不妥。虽然想,但是难度很大,由于学习方面的需求,我对虚拟机的功能要求是非常苛刻的,不仅效率要高,而且一定要有非常先进的母盘差分功能和文件传输功能。前者的意思是多个虚拟机共用一个硬盘文件,当一个虚拟机要向硬盘写入时,实现写时拷贝,就像Linux多个进程共享内存那样,有效的节约了硬盘资源。后者么就是虚拟机和实体机文件传输了。

问题是VirtualBox的这两个功能全都没有,或者说极其落后。Virtual PC和VMware很多年前就有母盘差分和文件拖拽传输,VMware更是实现了丰富的快照功能(快照也是一种简易的差分),而VirtualBox的文件传输必须依靠共享一个文件夹,极其不方便(有人说这样安全,VMware的文件拖拽是不安全的,但在我看来,病毒如果能突破虚拟机,要感染个共享文件夹岂不更加简单,没有人共享文件夹总是只读的吧),他也有快照功能,但是功能弱到绝不可能成为母盘差分的替代品。这也是我多年不使用VirtualBox的主要原因。

不过后来在一个很偶然的机会下,我读到了一篇英文文章(链接),这里面详细描述了VirtualBox的磁盘类型——immutable和writethrough,直到那个时候我才知道原来VirtualBox有很多命令行驱动的隐藏功能,这倒使我对VirtualBox的隐藏功能产生了兴趣,如果这些命令行功能中正好有我想要的,岂不善哉?为此我Google了大量文章,但是收获很少。但我曾经有一次实现了!不知道之前做了神马,最后我把vdi文件权限设为400后,他真的变成了母盘!所有基于他的虚拟机都可以同时开启并且互不影响的操作,但后来我发现,这是个很偶然的操作下诱发的Bug,我无法在另一台电脑上复制这个操作。尤其是VirtualBox进入4.0版本后,似乎还修复了这个Bug。VirtualBox 4.0还取消了存储选项中的一个叫Differencing Disk的选项,之前版本我其实也不知道这个选项究竟干吗用,现在索性还取消了。

我曾经还在Ubuntu中文论坛发过求助帖,但是无一人回帖,令我对这个论坛深感失望。

又是很偶然的,翻了Google排名较后的文件,发现了一篇BlogSpot的英文文章(链接),察看缓存,竟然发现正是我要的!这篇文章最大的特点就是没有用到Differencing Disk的选项,非常符合目前的情况。

创建好虚拟机之后,在VirtualBox Media Manager下选中即将成为母盘的VDI文件,右击Release。这样,既有的虚拟机将和这个VDI文件完全脱离关系。你也许能想出各种让VDI文件孤立的办法,但是请一定要使用上述方法,用其他方法几乎都会报错。

切到终端下(Linux系统的骄傲!VirtualBox是我见过唯一的在Linux平台下使用比在Windows平台下使用更加方便的多平台软件,方便就体现在这里),使用这样一个命令:

VBoxManage modifyhd <disk file>  --type immutable

把VDI文件转换为immutable文件,顺便把文件权限设为400吧,这样的VDI才是真正意义上的母盘。好,现在创建各种基于她的虚拟机吧!

其实之前的动作只是创建immutable盘的标准操作而已(什么是immutable盘?是指每次关闭虚拟机后,之前的所有操作全部回滚,再打开后就像一个从没被操作过的虚拟机一样),后面的才是重点。

图上的只是演示,我觉得在VirtualBox Media Manager下找到新虚拟 机的VDI文件(其实是基于母盘的快照)的路径更方便些,复制这个路径,使用以下命令:

VBoxManage modifyhd <differencing disk file> --autoreset false

把自动回滚取消,这样的immutable盘既实现了母盘差分,又不会在每次关闭后回滚,符合了我的要求。

真够麻烦的,其实Sun/Oracle要加个母盘差分功能很难吗?不可能。但他就是没有这么做,其中的原因么,不得而知了。不过随着进一步的深入研究,应该是能找到比这更方便的操作的。

至于文件传输,还是配个FTP吧,比她自带的共享文件夹功能还方便点。

后来发现:VMware Player也不错,同样也是免费产品,功能还行,非常稳定。与VMware Workstation相比,VMware Player仅仅失去了快照和母盘差分功能,与VirtualBox相比,VMware Player非常方便的文件拖拽功能,和其特色的Unity功能依然胜过他,如果不需求快照和母盘差分功能,还是考虑VMware Player吧,更好些!

刚刚电子邮件收到的,共享下,方便大家下载。粗看了下,感觉这个版本主要就是在强化InnoDB。

点击下载

介绍

MySQL是当今在用的最值得信赖的开源数据库平台。基于其卓越的跨平台、应用程序栈以及瞩目 的性能、可靠性和易用性,现今,许多比较流行的,访问流量大的网站都选择使用MySQL数据库。现在MySQL Oracle提供了一个完整的LAMP(Linux、Apache、MySQL、PHP、Perl、Python 等)框架,基于LAMP,任何规模和志向的用户或客户均可利用现有的最佳技术解决方案和支持构建自己的应用程序和产品。MySQL 5.5 提供了一组专用功能集,在当今现代化、多功能处理硬件和软件以及中间件构架涌现的环境中,极大地提高了MySQL的性能、可扩展性、可用性。

MySQL 5.5融合了MySQL数据库和InnoDB存储引擎的优点,能够提供高性能的数据管理解决方案,包括:

  • InnoDB作为默认的数据库存储引擎
  • 提升了Windows系统下的系统性能和可扩展性
  • 改善性能和可扩展性,全面利用各平台现代多核构架的计算能力
  • 提高实用性
  • 提高易管理性和效率
  • 提高可用性
  • 改善检测与诊断性能

本白皮书介绍性的讲解了MySQL 5.5和InnoDB的一些增强性能,这些增强性能极大地提高了系统和MySQL的性能。下面,我们将详细介绍每一个关键的增强性能及其实现过程。

关于本博客UI方面的一些思考

2010年12月26日 17:33

首先,很高兴Ubuntu新字体进入Google Font Directory(详细),Ubuntu这字体真的很漂亮,可以说是Ubuntu 10.10的最大亮点了。而这个字体进入Google Font Directory意味着我可以用云字体的方法使每一个进入本博客的观众都看到这个字体(还意味着可以从本博客中下载该字体),不管客户端本身是否真的装有这个字体。额..这字体在XP下好像有点糟糕,特别是没开ClearType的XP,全是锯齿。唉,这只能说XP本身的字体渲染太烂,我以前一度以为XP字体全是点阵字体呢,怎么看都感觉不像是TrueType!

我自认为本博客在非XP的PC上看起来还是不错的,符合我自己的审美观吧,但是在手机上却不是这么回事,我的手机是多普达S900,Windows Mobile 6.1操作系统,安装浏览器Opera Mini 5.1。

手机浏览本博客时存在两个严重的问题,第一,打开博客率先看到的是搜索框,分类等一点不重要的内容,而真正的主体部分却被挤到了下面(代码功能也有同样的问题,代码被行号挤到了下面)。这个问题不仅仅存在于手机,把PC的浏览器的宽度缩小到一定尺寸,也一样如此,有时候看上去右边一大块空白,还以为没有正常显示呢。事实上,很多博客都是这样,本博客并非特例,究其原因,是在写HTML的时候,边栏的DOM安排在前面并使用了float:left;导致。解决的方法很简单,把文章的DOM安排在前面,使用float:right;即可,或是干脆把边栏安排到右边去,这样浏览器宽度缩小时被挤下去的就是边栏了。很可惜,虽然知道解决方法却不能做这种修改,因为博客系统的HTML是定死的,不能改。当然,也可以考虑换个主题,有些主题的边栏是在右边的,不过我蛮喜欢现在这个主题,不想改。也可以考虑用Javascript来更换DOM的位置,但是我的Opera Mini几乎不支持Javascript,改了也没用。所以我干脆做了些小动作,上传了一个smallscreen.css的文件,记下他的路径,在博客的header里增加一个标签,这个标签能使得博客宽度在小于900px的时候使用smallscreen.css,反之则不使用(具体实现可见本博客HTML源码)。这个技巧是在看今年的Google IO大会时一个人在讲Dreamweaver对HTML5支持的时候学的,很有用,而且大部分浏览器支持,要想让网页对非PC平台做特别支持,用这招会非常imba。至于smallscreen.css的内容,其实就是把边栏隐藏了。额,我认为不太会有人在用手机浏览本博客的时候对搜索框和分类感兴趣吧。

另外一个严重的问题是,本博客的部分文章实在是太长了,比方说《HTML5设计原理》,用鼠标滚轮滚也可以滚好长时间,《从jQuery中剥离出$.ajax函数》,整整700行代码啊。在手机上,特别是在Opera Mini(没有滚动条)上看本博客的主页,简直是受罪,就为了瞥一眼下一篇文章的标题,不断的滚啊滚,茫茫多的字,根本看不到个尽头,嗯,用户确实可以考虑下是否该取消今天的晚餐了。把整篇文章不加限制的放在主页上,有方便之处,无需用户点击就能看完全文,但是如果文章实在太长,还是来点部分摘要吧。不过我看遍了博客系统的设置,也没能找到类似的设置。想通过smallscreen.css来解决吧,也想不到个好些的策略,没有CSS3,没有Javascript,没有滚动条,怎么才能缩减文章的长度呢,我也想不到了。

【转】HTML5设计原理

2010年12月18日 09:33

我是第一次不加修改的转发整篇文章,其实我也可以给个链接了事,或是按照我过去的性格,绝不不加修改的转发文章。但我今天还是转了,主要目的其实是告诫我自己,要充分重视“设计原理”,虽然我们什么事都讲“原理”,但是只有“设计原理”才能真正表现原作者的思想精髓,才是“原理”中的精华所在。写代码重视实践固然是好,但如果不摸透思想,所学习的一切技术终究只能是皮毛。

思想决定行为,行为决定习惯,习惯决定性格,性格决定命运。       ——这句话我很喜欢

HTML5设计原理 - Jeremy Keith在Fronteers 2010上的主题演讲

今天我想跟大家谈一谈HTML5的设计。主要分两个方面:一方面,当然了,就是HTML5。我可以站在这儿只讲HTML5,但我并不打算这样做,因为如果你想了解HTML5的话,你可以Google,可以看书,甚至可以看规范。
 
实际上,确实有人会谈到规范的内容。史蒂夫·福克纳(Steve Faulkner)会讲HTML5与可访问性。而保罗·艾里什(Paul Irish)则会讲HTML5提供的各种API。因此,我今天站在这里,不会光讲一讲HTML5就算完事了。
 
说老实话,在正式开始之前,我想先交待清楚我所说的HTML5到底是什么意思。这话听起来有点搞笑:这会子你一直在说HTML5,难道我们还不知道 什么是HTML5吗?大家知道,有一个规范,它的名字叫HTML5。我所说的HTML5,指的就是这个规范。但问题是,有些人所说的HTML5,指的不仅 仅是这个规范,还有别的意思。比如说,用HTML5来代指CSS3就是一种常见的叫法。我可不是这样的。我所说的HTML5,不包含CSS3,就是 HTML5。
 
类似的术语问题以前也有过。Ajax本来是一种含义明确的技术,但过了不久,它的含义就变成了“用JavaScript来做一切好玩的东西”。这就 是Ajax,对不对?今天,HTML5也面临同样的问题,它本来指的是一个特定的规范,但如今含义却成了“在Web上做一切好玩的事。”我说的不是这种 HTML5,不是这种涵盖了最近刚刚出现的各种新东东的HTML5。我说的仅仅是规范本身:HTML5。
 
刚才已经说了,我今天想要讲的内容不多,也没有打算介绍HTML5都包含什么。今天我要讲的是它的另一方面,即HTML5的设计。换句话说,我要讲的不是规范里都包含什么,而是规范里为什么会包含它们,以及在设计这个规范的时候,设计者们是怎么看待这些东西的。
 

继续阅读

从jQuery中剥离出$.ajax函数

2010年12月10日 20:41

作为开源社区的PHP框架的内置Ajax模块,我们需要一个功能超强大的Ajax函数,作为一个通用函数。Ajax模块是我负责的,这种函数如果真要我写,恐怕以我的能力是很难做到完美的,毕竟Ajax涉及的知识点非常散,还有大量HTTP协议的知识,我并不全懂,还有各种浏览器兼容问题的存在,防不胜防。就算花一个月去做,恐怕也只能做出个可能存在大量隐蔽BUG的作品。于是,我决定直接从开源产品中找,也就是jQuery的$.ajax函数。

我是个信奉极简约的人,不喜欢为了一个$.ajax就把整个jQuery文件全部包含进来,太大了,70多KB的文件,换成56K/bps的猫,全速也至少10秒(一般我不考虑什么gzip压缩,因为不想把它作为偷懒的理由,虽然号称压缩后只有24K),我不能接受这种速度,所以我就决定从中提取,把jQuery中的$.ajax和一些附属的函数剥离出来,单独形成一个ajax函数。

花了半天时间,非常顺利,jQuery源码并不难懂,至少一定比Linux Kernel源码好懂。不过首个版本没有提取所有功能。比方说Cache功能还没有,因为不了解Ajax的Cache究竟是个什么机制,全局Ajax事件没有,因为感觉意义不大,如果要,就必须剥离$.trigger,这个函数不是很小,剥离就可能导致最终文件变大,有点得不偿失。

可能存在Bug,请注意,当需要解析JSON时,本类中没有自带JSON解析函数,请务必提供JSON.parse()函数用于解码。

继续阅读

Google了很长时间,只知道Gwibber可以借用StatusNet和第三方API上推,但实际操作就发现,只能看推不能发推。至于如何解决这个问题,却说的不多。以至于不少人都在询问。其实Ubuntu中文论坛有个帖子说的很明白。地址:forum.ubuntu.com.cn/viewtopic.php?f=73&t=290640&p=2042552 ,按要求操作即可发推。

 

修改/usr/share/pyshared/gwibber/microblog/network.py

代码:
self.curl.setopt(pycurl.HTTPPOST, [(x, str(y)) for x,y in params.items()])

修改为

代码:
self.curl.setopt(pycurl.POSTFIELDS, urllib.urlencode(params))

已可以发推。gtap version: 0.4
http://code.google.com/p/gtap/issues/detail?id=80

 

由于使用的是StatusNet,协议不可能和Twitter的完全一致,不兼容似乎也正常。但是这么一改的话,我猜大约就不支持StatusNet自己了,仅仅是个猜测,我不懂Python。

Gwibber很不错,操作简单,使用便捷,而且还是系统自带,只是不支持Twitter的List功能,这点很遗憾。如果有的话,简直能和TweetDeck媲美了。

之前试着用PPA升级Gwibber至2.91,结果发现不知道为什么Gwibber不再支持Status了,只支持Twitter,Facebook和Identi.ca这三种服务了,赶紧删掉PPA重装。。

自由万岁,Twitter万岁!

Yum库配置简单方法

2010年12月04日 07:20

好久没写博客了,正如我之前所说,在考试。大学考试就是一堆理论考来考去,我不是一个善于高谈阔论的人,也不是一个擅长考试的人,考的很糟糕,可以说,学习越深入,我就越不擅长考试了。

最近用上了企鹅输入法fcitx 4.0,很棒的输入法,我自从使用Linux以来还没见过这么漂亮的Linux软件呢,只是他的词库不敢恭维,偶尔还会崩溃,但总比ibus强多了。
 
发现Linux上的Office最好的还是OpenOffice 3.2.1版本,虽然比起自带的OpenOffice 3.2只有0.0.1的提升,但是质量真的好很多,不太会死掉了,美观性也大幅增加。LibreOffice项目我当然是支持的,期待的,只是目前还在beta版本,稳定性和OpenOffice 3.2几乎没有差别,所以还没用。
 
Ubuntu Tweak是个很实用的Gnome配置软件,最近才发现。
 
Ubuntu的Gnome-panel版本太低,稳定性很糟糕,一直想升级,可惜不会。Gnome-panel几乎是Gnome桌面的操作系统中最不稳定的组件之一了,无论是在Ubuntu上,还是在Fedora上,都不稳定,GUI,作为一个系统的门面,这样不稳定真的很不好。
 
我们学校搞开源社区了,很高兴,开源的意义我从今年才开始深入认识,这么快也可以为之作贡献了。我们的首要任务是做个我们社区的门户网站,用PHP,在做这个网站之前,我们先做一个PHP框架,这个框架相当于社区的第一个产品,根据Deltamaster的分配,我的任务是Ajax模块,缓存模块和代码优化。
 
我年初帮助Deltamaster做过项目,但结果是以惨败告终的,非但没有做出贡献,反而还在添乱。事后我反思了很久,主要是急功冒进,对任务的认识不够深刻,对语言的思想掌握不够。后者现在已经没什么问题了,前者还在学习。一个程序员,操之过急地编码根本没有意义,画出几张UML图,统筹兼顾,和上面进一步明确任务和接口比这重要的多。
 
RHCE考试推迟到明年一月了,很好,这样时间充裕多了。
 
还有很多话想说,但是不能说了,本文的主题不得不开始了。
 
Yum库的配置网上很多,但在我看来,基本没说清楚,这就是撰文的目的。
 
配置Yum很简单,第一步,用户必须告诉Yum这个库的存在,因此必须在/etc/yum.repos.d中要么创建一个后缀名为repo的文件,要么在已有的repo文件上增加新Yum库的地址,具体写法完全可参考系统自带的文件的写法,以下是我实验库的文件内容:
 
[testyum]                                                   #yum库名字,必须唯一
name=Fedora Test Yum                           #yum库全名,不多解释
baseurl=file:///home/bachue/Downloads   #必须是一个文件夹的地址,可以是FTP,HTTP,当然也可以象我一样为本机地址
enabled=1                                                 #是否启用该库,为1为启用
metadata_expire=7d                                 #源数据过期时间,不多解释
gpgcheck=0                                              #是否检验gpg的key,我是实验库,不需要检验。

更多语法还是请参考已有的repo文件。

完事后,作为用户其实就没啥事了。而Yum库本身还是需要一定的配置,否则不能正常工作。

为什么要配置呢?不配置Yum怎么知道他的库里有哪些包呢?包的详细信息呢?怎么做分组呢?怎么知道包与包之间的依赖关系呢?正是因为不知道,所以要有个配置文件,其实准确的说是源文件,来告诉别人这个Yum库的若干国情。

Yum库的软件,作为实验我挑选了google-chrome-stable和linuxqq的rpm包,这两个软件都是闭源的,所以一定不会出现在官方的Yum库里。

Yum的配置文件有五个,必须放在Yum库的repodata文件夹下,其中有四个(他们是filelists.xml.gz  other.xml.gz  primary.xml.gz  repomd.xml)可以由一句命令createrepo(可能需要安装同名rpm包)自动生成,但最后一个文件比较难对付,第一,他不可能手写,打开就知道,多国语言,想必不可能有人懂这么多语言。第二,可以有命令来生成,和生成前四个文件的命令还是同一个,但他有个古怪的要求,必须有一个其他库的这个文件作为模板,才可以生成,说真的,玩这么多年电脑从没见过这种要求,如果你的电脑上或光盘里已经有Yum库(DVD版本的安装光盘几乎都有),并且有名字中带comps的那个xml配置文件(可能已经被gzip压缩),就可以用他,如果没有,用find命令全系统搜索,关键字是*comps*xml*,我的fedora就有这样一个文件。如果这样都没有找到,那么只能从其他电脑上找了,网上我Google过,没有发现人家把这个文件挂上来。

假设已经找到(不会找不到吧,DVD里真有),生成配置文件的整个命令如下:createrepo -g [该模板文件地址,注意后缀名是xml] [Yum库地址],在我的电脑上,这条命令是这样的,createrepo -g /var/cache/yum/i386/14/fedora/2d112e279cf18476b72e5b30f60c1aa55e0297e7a05f4d9891879ee83d298e11-comps-f14.xml /home/bachue/Downloads/。这条命令将自动在库文件下创建repodata文件夹,并创建好五个配置文件。这样,配置就算完成了。

如果要去试试这个库能否正常工作,一定不要忘了,Yum是有缓存的,如果不久前刚刚扫描过这个Yum库,就不会再去扫描一遍,但你其实已经改过他的配置,或是有新软件入库了,而Yum却不知道,以至于你的操作看上去就像没有生效,这样可能会让你以为Yum没有正常工作。我就出过这样的糗事。清除缓存的命令是yum clean all,一定不要忘了。

讲解完毕,是否很简单呢?

在没学RHCE以前,感觉deb包很强,毕竟不容易出现依赖性问题,学了RHCE,感觉rpm才是真的好,功能实在太强大了。

好久没更新博客了,不是偷懒,而是考试前期太忙了,什么作业都要开始交,上周末就完成了三门课的实验报告,还有一部分课要提前考试。比方说最无聊的文献检索。没办法进行新的学习。等考试结束后,大概就要全面攻RHCE了。

今天验收Windows大作业,这个程序让我花费了很多力气,但是验收时并不怎么顺利。虽然结构和类封装让老师对我的C++水平印象深刻,但是在一段动画上却出了问题,动画不够流畅。

这段动画是一个辅助型的效果,一个Google的Logo的移动动画,要有透明效果。这段动画我完全没有采用过去常用的动画在时间类回调函数里做法,而是把动画做在WM_PAINT里,时间类回调函数仅仅只是更新Logo的位置,并请求刷新界面。问题就出在这里,刷新信息是放在消息队列里的,程序必须接收到重绘消息才会绘图,如果重绘消息过多就不会多次重绘,而是只重绘一次就草草结束(有点掏浆糊)。显然13帧的重绘消息程序是不可能一一处理(虽然我的电脑性能较好,程序处理了大部分信息,如果没有经验,是断然看不出他的不流畅),因此跳帧就出现了。解决方法还是按照老路子走,直接在时间类回调函数内取得HDC,让他动,流畅性将大大提高。

另外,之所以有时界面会闪烁,根本原因是重绘前的一瞬间,界面这块区域被涂白了(通常是因为发送了EraseBackground消息或是BitBlt最后一个参数是WHITENESS),涂白后又立刻在上面绘图,Windows的图形速度并不是很快,这一瞬间还是能被人眼捕捉到,这样就看上去在闪烁。对此的解决方案是,如果是因为EraseBackground的话,请尽可能限制Invalidate系列函数的使用,即使要用,也要尽可能把他的最后一个参数设置为FALSE,如果图像较复杂就干脆用兼容DC做缓冲,使用兼容DC的话是永远没必要EraseBackground的。如果是因为BitBlt的话,那么就尽可能缩小WHITENESS的区域,不让其实就不需要WHITENESS的区域变成WHITENESS,这样闪烁基本上就可以抑制住。再次强调,闪烁不是因为过快频率的重绘,也不是因为过大范围的重绘,而是过多次的瞬间残留影像,一定要对症下药。

虽然验收不顺利,成绩仅仅是A-,但是能获取这么多经验,还是好的。本周五晚上还要在忙活一晚,把程序的这些问题全部去除,争取第二次验收得A。

刚刚在Ubuntu 10.10下安装了Vmware,可能因为新版本尚未发布,老版本7.1.2最高只兼容到Ubuntu 10.04,因此虽然安装顺利,但每次打开时都会显示如下字样“Before you can run VMware, several modules must be compiled and loaded into the running kernel.” 点击Install,键入root密码,显示一个标题为“VMware Kernel Module Updater”的对话框,等待编译,才能启动Vmware。而且这样的编译不是仅仅一次,而是每次打开Vmware都会,即使期间没有重启过。

这显然是个很费时和很麻烦的事,于是我Google了一下,首先确定这个问题仅仅发生在Ubuntu 10.10下,其次,要修复这个问题,也很简单:

只要修改/etc/vmware/config,将VSOCK_CONFED设置为“no”即可解决。

参考文献:
resalxh.wordpress.com/2010/09/09/vmware-player-3-1-1-on-ubuntu-10-10-maverick-meerkat/