Archive for the ‘Programming’ Category

Wordpress Theme ‘Homywhite’ Released

这是按我自己所喜欢的感觉做的一个主题。我在想是否有人喜欢,希望不是只有我一个人在YY。如果你觉得不错,那么不妨告诉我,好让我能维持这份热情来继续下去。

具体可查看Wordpress theme: Homywhite页面。

说明:

  1. 这是一个两栏的主题,且自适应屏幕大小改变;
  2. 使用时无需任何插件,并且可结合Wordpress 中的 theme widget 一起使用;
  3. 兼容 IE6、IE7、IE8FirefoxGoogle Chrome 浏览器;
  4. 通过 Wordpress 2.8 测试;
  5. 这个主题是免费的 (It is free)。
  6. This work is released under GNU General Public License, version 3 (GPL).

Screenshot

Download: Homywhite v.1.0.8 (Latest Version)

Preview: Homywhite v.1.0.8 (Latest Version)

Last Updated: 2009-09-23

PS: 如果你有什么问题或建议可以在这里留言告诉我。

不要从安装媒体修复VS2008 SP1

近来想添加几个VS2008的组件,通常的做法,便是启动原始的安装程序,然后进入选择修复安装。在没装SP1之前,这个方法是可以的。但如果装了SP1,这样便行不通了。程序可以启动,只是在加载组件的时候便会遇到个错误,提示:

A problem has been encountered while loading the setup components. Canceling setup.

然后要求cancel,进而整个过程退出。

想当然的拷贝了这个提示至Google,查看了很多结果,发现的竟是些牛头不对马嘴的解决方法。无奈,静下来思考思考,认为问题还是应该与SP1的安装有关,于是进一步搜索,发现了一篇Visual Studio 2008 Service Pack 1 (SP1) 自述文件。打开查看,窃喜,问题得到解决。考虑到这个问题应该很常见,但正确的答案却不容易找到,有点让人惊愕。如今在互联网上查资料,犹如沙里淘金,若不多多思考,先寻一些关键的关键词,便很容易被带带的团团转,这也算信息泛滥的恶果吧,不知道这个问题有没有的解决。闲话不多说,摘录部分重点,希望后来人能第一时间发现这里:

2.1.13 安装 SP1 后,不应从媒体运行 Visual Studio 修复

安装 Visual Studio SP1 后,请不要从原始发行版本 (RTM) 安装媒体运行 Visual Studio 修复。 随 Visual Studio 2008 SP1 安装的程序包较新,由于它们在原始发行版本安装媒体上不存在,因此只能使用“添加或删除程序”来修复。

解决此问题的方法:

修复 Visual Studio 2008 SP1:

  1. 从控制面板中打开“添加或删除程序”。
  2. 选择“Visual Studio 2008”,单击“更改”。
  3. 在维护窗口中选择“修复 Visual Studio”。

里面对于问题的原因描述的不是很详细,这里再解释下,翻译自Do not repair VS 2008 SP1 from installation media

Visual Studio 实际上集合了很多不同的程序安装包,VS2008 SP1 也是如此。VS2008 SP1 在进行各种次要或重大的升级时替换了原先的一些程序包,同时也可能为其他产品打上一些补丁。这样在安装了SP1后,原先安装的产品信息,如产品号,或者产 品版本号便被更改了。进而影响了setup.exe在安装修复或卸载产品时用于决定该做什么的检测逻辑。

这些产品信息共同存储在安装文件和硬盘上的目标安装目录。由于各种原因,如安装程序通常都是写保护的等,更新后的信息只能被存储在硬盘驱动器上。因此,一旦安装了SP1,安装程序和硬盘驱动器上的检测和安装包信息就不会同步,此时只有硬盘驱动器中的副本才含有正确的信息。

引用和指针的使用选择

关于指针和引用的使用,情况不特殊的时候,区别并不大,介绍大都推荐使用引用,因为更安全,但指针还是有引用所不能替代的功用,亦不可忽视。

引用的特点:

  1. C++中,引用须被初始化指向某个对象,一旦被初始化指向某个对象,将始终指向该对象,其后的 “=”操作均为赋值,改变的是初始化时指向对象的值。
  2. 引用不能为空,引用必须指向一个存在的对象。

注意以下代码:

char *pc = 0; // set pointer to null
char& rc = *pc; // make reference refer to dereferenced null pointer

这个行为未定义,应加以避免。

指针和引用的不同:

  1. 引用的代码效率比指针要高,因为在使用引用之前不需要测试它的合法性,相反,指针则应该总是被测试,防止其为空。
  2. 指针可以被重新赋值以指向另一个不同的对象(这也是指针不安全的根源所在),引用则总是指向在初始化时被指定的对象,以后不能改变。

指针和引用的使用:
使用指针:

  1. 可能需要在某个时刻不指向任何对象(可以将指针赋值为空);
  2. 可能需要在不同的时刻指向不同的对象(可以改变指针的指向)。

使用引用:

  1. 总是指向一个对象,且一旦指向一个对象后就不会改变;
  2. 重载某个操作符,例如 [],以防止不必要的语义误解。

Tip:当一个函数需要返回一个对象的引用时,选择返回对象的指针,而不是引用,因为指针可以测试返回结果的合法性,判断其值是否为空!

参考 《More Effectvie C++》

推荐阅读:《References vs. Pointers》

代码和架构初识

2008年的工作,我只觉得很一般,不满意,也不遗憾。不满意的是自己做的工作太过杂乱,其中涉及到了很多项目很多模块,但我觉得都是一些添砖加瓦、拾遗补漏的工作,所以并不喜欢。虽然对于工作的内容并感到不满意,但我还是硬着头皮并且尽力做下去了,而且基本上在保证质量的情况下按时完成了各项任务,所以我也并不感到遗憾。

一年的工作下来,大的收获不敢奢求,但小的认识我想还是有的,比如在代码阅读方面,比如在软件架构和重构方面。

接触过这么多不同的项目,代码看的多是一定的。看的代码多,自然也还是有好处的,当然前提是代码不能太烂,烂到那种鬼画符的地步。
因为经验不足,初次接触到大量代码,难免手忙脚乱,脑袋膨胀。所以在刚开始看的时候会经常被迷惑,会失去方向,会无形中在后期的开发中去模仿,毕竟模仿是一生中做的最多的事。随着看的代码越来越多,我似乎也能渐渐的明白,哪里写的比较好,哪里需要改一下,以及怎么改才好,等等诸如此类的问题。也许这就是一个晋级的过程,虽然很无形,但你不能否认它的存在。

说到看代码,以前我也像大多数人一样,认为代码还是只看好的,好的看的多,自然学到的也都是好的,不是有句话叫“近朱者赤,近墨者黑”嘛。不过在硬着头皮看了一大堆有问题的代码后,发现看这类代码也并不是一点收获都没有,至少我认为它更能激发人去思考。碰到这些代码,潜意识里会产生一种排斥感,这种排斥感促使着我总想找到更好的实现,于是乎,我会不断的去怀疑,去思考,直到我发现了能取代之的更好的实现方法,虽然这不总能成功,但至少这个过程让我学到了更多,也正因为如此,我才能渐渐的有了判断代码好与差的能力,并且在实践中将其一步步完善。

所以说看差的代码也并非一无是处。差的代码,尤能让人去怀疑和思考,并且由于此认知是出于自己思考感悟得出的,而常常能被记得更牢。总的来说,不管是好的代码还是差的代码,关键还是要在看的过程中去怀疑去思考,若非这样,即使是看好的代码,收获也是很有限的。

软件的架构和重构,对于我来说,也只是看了一些这方面的书,在接触过的代码中认识到了其重要性,至于在实现方面,也还是经验不足,捉襟见肘。不过,这并没有妨碍我停止寻求好的实现的信心。

维护一段代码,特别是扩展已有的代码,都是一件吃力不讨好的事情。如果已有的代码设计很烂,那更是一件在挣扎中前进的工作。当需要在差的设计上做一些扩展的工作时,我时常要在“是否要重构”这个问题上做一些决定,虽然我很不情愿,但实在不忍放任手头的代码再继续混乱下去。如果我按现在的设计扩展下去,我便会做很多伤神费力的工作,而且还需要足够的细心,不能有一处的遗漏;如果我将前期的设计做些修改,那么当前的扩展便会很容易,但这个工作又会带来其他的一些工作,比如考虑这个设计对依赖于它的模快的影响,以及修改后的测试等一系列的工作等等,另外你还得估计下时间,因为老板给你的时间可不包括你额外考虑的这些工作。

维护或扩展一段设计不好的代码,有时就像是在做着帮人圆谎的工作。因为前期的一个设计不佳,在碰到了改变后,我便要痛苦地去做出更多的工作才能继续下去,而且这样的继续只会带来更多的混乱与漏洞。其实这就是所谓的“破窗理论”:没修复的破窗,会导致更多的窗户被打破。

关于 #define WINVER

最近在在把一些程序从VC6迁移到VS2008,由此而关注到了Winodws版本的定义问题。

关于版本定义的关键无外乎为程序头文件中对于#define WINVER 和 #define _WIN32_WINNT 的使用,具体为:

#define WINVER 0xXXXX
#define _WIN32_WINNT 0xXXXX

该定义一般用于标示程序对运行环境的要求,另外在某些头文件中也有这样的宏定义。如果版本匹配的话就会在编译的时候将这些内容编译,否则就不编译。

定义正确的Windows版本,不仅关系到程序的正确编译,同时也关系到程序的正确运行;在升级的过程中,我就碰到了程序编译正确但运行出错的问题。实例稍候再续。

版本的定义关系到被编译到程序中的内容,这里主要是指系统提供的功能代码。Windows各个版本的功能虽然大差不差,但特定于某个系统功能还是存在的,于是关系到这些功能的API代码也就有所不一样。当我们在程序中定义了错误的系统版本,被编译进程序的内容便可能包含当前系统不支持的代码片段,这样的程序即使可能正确编译通过,但在运行的时候,由于在当前系统中找不到相应的内容资源,从而发生错误。这一点熟悉动态链接库(DLL)的人都很清楚,其实该问题就是和系统动态链接库有关。

Example:
下面为一段获取系统信息提示框的字体信息的代码片段:(编译环境从VC6迁移至VS2008,运行系统为Windows XP)

// Retrieves the message font info
NONCLIENTMETRICS ncm;
ncm.cbSize = sizeof(NONCLIENTMETRICS);
VERIFY(SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0));
 
// Creates the font according to the message font info
m_Font.CreateFontIndirect(&(ncm.lfMessageFont));

程序在VC6下编译运行都正确,迁移至VS2008后,编译正确,但运行时出错。原因是SystemParametersInfo调用失败,这和其传入的参数有关,根本在于 NONCLIENTMETRICS 这个结构体变量的定义。
(more…)

‘Sleepy Blue’ WordPress Theme Released

最近设计的一款蓝灰色相间的主题。曾听说蓝色会使人清醒,灰色会使人沉睡,当蓝色碰到如此多的灰色时,冲突?矛盾?也许不会,蓝色也会昏昏欲睡!由此这个主题取名为Sleepy Blue。

该主题适用于WordPress 2.x;在IE6.0和FireFox2.0下测试,显示均正常、一致。
如果你喜欢,你可以自由免费地下载,不过希望你能遵循创作共用协议Attribution-NonCommercial-ShareAlike 2.5 :)

Screenshot

Sleepy Blue

(more…)

The Concise Wordpress Theme ‘Freedom Blue Plus’

  Blog建好了,选个好的主题当然是必不可少的。看了WordPress主题站的部分主题后,最后还是选择了Frank Helmschrott的Freedom Blue 2.0。这个主题设计的很简单,感觉很清爽,避免了花哨带给人眼的刺激,所以比较适合像我一样喜欢简单的人。
  好东西好象总是不容易得到,本以为会很容易地用上这个skin,但还是出了问题,很多。不得已看了看文件中的代码,发现了太多的小bug。由于过于喜欢不忍心放弃,所以只得自己进行些修复了。另外考虑到功能的扩展,我在其中顺便添加了一些模块。主要改进如下:

修改了style文件中部分CSS的属性,避免了在IE下显示时布局错乱的问题;
修复了原先的search error;
修复了post comments feed的link error;
修改了index文件,避免了page中comment template的显示(我觉得在page中没必要,于是就把它给做了);
添加了archives template(archives.php),guestbook template(guestbook.php);
英化了部分显示的德语(多亏有google翻译);
清洁了一些文件的冗余代码;
另外由于安装了Ultimate Tag Warrior插件,为了配合显示,修改了其中的tag和tags文件,并在其他一些相关文件中做了部分添加和完善。

(more…)