2006年10月29日星期日

IE7不咋样啊

也下载了一份IE7,主要是以为它在安全性上有所改进,而且到处都在吹它的新界面。但用了几天,觉得不咋样:

  • 安装狂慢,折腾了10来分钟,不知道在忙些什么;
  • 对弹出窗口的拦截功能似乎没有起到作用,不管是否打开了拦截功能都一样;
  • 新建Tab页的按钮的位置俺很不习惯,又不让改;
  • IE现在总算对于CSS指定大小的字体也可以缩放了,同时在右下角仿照Opera提供了一个缩放框,挺方便的。不过放大了之后有很多显示出现布局混乱的问题,而且文字选择功能也会糊掉;
  • 查找功能没有“全部高亮”的功能;
  • 开同样的几个网页,内存占用明显比Firefox多;
  • 选项配置界面还是非常混乱,你看看Internet Options里面有多少个Tab页,每个页又有多少个按钮打开二级对话框?另外新增的弹出窗口、反钓鱼等功能的设置还不在选项框里面,我常常为了一个设置找啊找啊找啊......

Firefox 2.0也下载了,虽然表面上没有什么变化,但实际上有很多贴心的改进,比如会话管理、重新打开刚才不小心关闭的Tab(不过这几项功能通过Tab Mix Plus扩展也可以做到)、能自动导入IE的扩展菜单、网页搜索可自动完成、搜索引擎可删除、SVG的显示等。

2006年10月22日星期日

技术上的斯德哥尔摩综合症

我在半年前介绍过”斯德哥尔摩综合症“这个专业术语。主要是说在劫持人质的事件中,被劫持者会慢慢地同劫持者产生依赖关系。比如如果劫持者有些迫不得已的理由他们会逐渐相信,比如开始同情劫持者,而劫持者一旦承诺”只要你们乖乖的,保证你们没事“那他们就可能阻止或者检举有所行动的人,甚至劫持者作出一点略微改善他们处境的事情他们甚至会感恩。

刚才无意看见这位”IT自由评论人“的一篇《升级IE7.0的唯一理由》,上面说:

  • 微软的IE除了支持W3C标准外,也支持很多不标准、甚至不规范的格式。这虽然是微软被人诟病的地方,但确实对于知识相对贫乏的使用者、设计者们的“容错”吸引到更多的人来使用;
  • Opera、Firefox不支持Microsoft对于网页及CSS的扩展将很难在Windows平台上有更进一步增涨“;
  • 写到这儿我才发现,升级IE7的唯一理由是因为我们用的是Windows,在这个平台上谁能做得比微软更加好呢,又怎样能抗拒好多年未有重大升级的IE的最新版本呢?

具体我就不反驳了。反正我的第一感觉就是: ”斯德哥尔摩综合症“这个词完全可以在技术方面用起来 :-)

死亡蓝屏? 虚惊一场

早上将Linux系统从休眠中恢复,结果出现了类似这样的一个画面:



难道恢复时又出错了?上次内核升级后已经很少出现从休眠中恢复时崩溃的问题了。没办法,关机重来吧。

于是下意识地敲了两下回车,没想到出来XScreenSaver的输入密码对话框。难道刚才看见的是一个屏幕保护程序?输入密码,哈,真是。

打开GNOME设置的“屏幕保护程序”一项,焦点自动定位在刚才适用的屏保程序上,名字就叫BSOD,说是可以模拟20多个操作系统的一些系统崩溃画面。

挺逼真的,它会在模拟的同时采用当前的机器名、时间等。

不过,为啥要叫BSOD(Blue screen of death) :-)

2006年10月19日星期四

wine上跑Delphi 7

某天在Delphi盒子上看见一个mini版本的Delphi7,只有5M大小,解压后简单设置一下就可以跑起来。现在常常很不愿意跑个笨重的BDS 2006做简单的试验或者制作界面原型。这个东西正合适。

回家又想,能不能在wine上面跑起来?于是动手来折腾,过程中碰到一些问题,不过到现在终于比较满意了。



1.基本安装

1.1 该安装程序实际是一个RAR的自解压包,随便解压(安装)到人和位置都可以(以下假设为C:Delphi7)。

1.2 解压后完成后会自动调用regd7.exe,这实际上也是一个自解压包,里面包含了调试器代理bordbk70.dll, 注册表数据delphi7.reg和注册信息REGISTRY.SLM。它的解压位置为%USERPROFILE%\.borland,但wine上面 USERPROFILE这个环境变量不一定能正确翻译出来(在Windows上是X:\Documents and Settings),会解压到Program Files里面去。

1.2.1将bordbk70.dll拷贝到C:\Delphi7, 运行regsvr32.exe bordbk70.dll;

1.2.2 然后运行regedit导入delphi32.reg;如果搞不定(没有regedit或者导入不成功),可以直接编辑~/.wine/user.reg,把内容拷贝过去,不过要注意删除HKEY_CURRENT_USER这几个字。

1.2.3 最后建立目录X:\Windows\.borland,将注册信息REGISTRY.SLM拷贝到这个目录下。另外要导入如下内容到HKEY_CURRENT_MACHINE:

 [SoftwareBorlandDelphi7.0] 1160143880

"App"="C:\Delphi7\bin\Delphi32.exe"

"LMKEY"="QX8-EEC"

"LMLIC"="6AKD-PD29Q9-RDF?JQ-X65Z"

"LocalSharedRoot"="C:\Delphi7\Shared"

"RootDir"="C:\Delphi7"

"UseSharedFiles"="TRUE"

"Version"="PRO"

然后就可以运行了: wine c:\delphi7\bin\delphi32.exe

(如果调试时设置了断点但不能停下来,请检查bordbk70.dll是否正确注册; 如果报告delphi没有注册或者没有找到d7reg.exe,请检查上面第1.2.3步)

注意那个mini包带的都是原来delphi7的,没有打过补丁,建议用补丁后的版本(如果你手头没有,可以下载这个所谓的delphi 7 second edition (delphibox下载, delphifans下载))。

2. 加装一些东西

这个mini版本是够精简的,东西很少,连Code Explorer和To-Do List也没有,如果你有Delphi 7 Professional,可以从拷贝vclie70.bpl, vclhie70.bpl, proide70.bpl和delphipro70.bpl这几个文件过来,在Component->Install Packages...中加载delphipro70.bpl即可。

另外也可以安装GExpertsCnWizards,这两个专家包都是针对Personal版本测试过的,尽量减少了对Professional或者Enterprise版本采用的特性的依赖。不过对于Castalia就没有那么好运了。

3.其它

也许你会很愿意让X的窗口管理器来管理Delphi7的窗口,因为它不管是主窗口还是工具窗口都显示成一样,CnWizards的一些扩展按钮也看不着,更重要的是,窗口一拖动就糊成一团,工具窗口的docking也不起作用。

那就改为非managed模式吧: 运行regedit,建立如下内容

 [HKEY_CURRENT_USER\Software\Wine\AppDefaults\delphi32.exe\X11 Driver]

"Managed"="N"
注意改成这样delphi在任务条上是看不见的了,最下化后请去桌面左下角找图标 :-)


2006年10月17日星期二

为什么不升级到BDS2006

Borland的DTG(Developer Tool Group)的掌门人Nick Hodges发出了一个邮件Why aren't you upgrading?,并在Blog上给出一堆应该升级的理由

不料这下可炸开锅了。Blog上的回帖有几十条,话语都很尖锐; 而新闻组borland.public.delphi.non-technical上对这个邮件的直接回信更是长达1100多条。


2006年10月5日星期四

给Dictionary Tooltip添加了stardict.org的支持

前不久StarDict推出了在线词典,所有StarDict中可以用的词典都可以在线查(不过得经过简单注册才行,而且同时最多只能查5个词典)。

于是改了一下Dictionary Tooltip,使其支持StarDict.org了,补丁还没有提交给upstream,诸位可以从这里下载到(需要下载到本地再用Firefox打开进行安装)。



支持两种模式,"simple"只显示最后一个词典的解释(没有在StarDict上注册并自定义词典时,最后一个词典是“简明汉英词典”或者“简明英汉词典”),"all"是显示所有词典的解释。

另外,这次将代码基线升级到了upstream的最新免费版本0.9.2.

2006年10月1日星期日

C++类继承中的几个小问题

是的,我一直是个Delphi的粉丝。虽然现在工作上用的是C++(而且是在用VC/MFC),但一直都没有认真去学习它。前两天听俺们项目组的C ++高手讲解了一些“基本知识”,我还是觉得这个语言太复杂了,陷阱也太多。以下有几个例子(鄙人C++确很粗浅,如有不对的地方,敬请指正)。

[@more@]

第一个例子:

class Base
{
public:
virtual void MethodFoo(std::string s);
}
class Child: public Base
{
public:
virtual void MethodFoo(std::string s);
}
Base *b = new Child;
std::string s("something");
b.MethodFoo(str);

我 们会利用多态性来调用不同的MethodFoo实现,但突然有一天你觉得MethodFoo中间s是不应该发生变化的,于是加了一个const。问题来 了,很多编译器不会告诉你任何告警,但b.MethodFoo再也调用不到派生类的MethodFoo了,除非你把它们一个个都改过来。

第二个例子:

class Base
{
public:
virtual void MethodFoo(std::string s);
}

class Child: public Base
{
public:
virtual void MethodFoo(std::string s);
{
DoSometingMyself();
Base::MethodFoo(s);
}
}

突然有一天,你觉得这个设计不太合理,需要在Base和Child之间再插入一层(class Middle),这就意味着你得修改Child所有函数中类似上面黑体的部分,把它们改成Middle::MethodFoo什么的。

第三个例子:

我 们知道C++中支持多继承,但它对于多个基类中有同名同类型函数的问题没有提供解决方法(也许你会说,我们不应该写这样的代码,但仔细想想X, Y都是接口(C++用纯虚类来做)的情况下,难免会有重名的)。对于X, Y均派生自B,而C又牌证自X+Y这种”恐怖的菱形,它有一个"workaround"是用虚基类,但这要求更改X, Y的代码,使得它们虚拟继承自B。

-----------

是的,这三个问题在Delphi中均可以避免:

1. 要重新实现虚方法必须用override关键字;而带有override声明的方法如果参数不一致,编译器会报错;如果基类中不存在叫这个名字的方法,也会报错。而你确实要用同样的函数名做别的事情,得用reintroduce或者overload关键字。

2. Child::MethodFoo中调用其父类的MethodFoo时不用写Base::MethodFoo,直接写inherited MethodFoo就行了。

3. 采用方法分辨子句即可:

TChild = class(TParent, Interface1, Interface2)
procedure Interface1.MethodFoo = MethodFoo1;
procedure Interface2.MethodFoo = MethodFoo2;
procedure MethodFoo1(s: String);
procedure MethodFoo2(s: String);
end;