2007年7月31日星期二

Rich Internet Application? Rich Client?

最近在网上查资料,被Rich Client(富客户端)和Rich Internet Application两个概念搞得头晕。虽然名词都是“相”,但大家约定清楚交流起来容易一些:-)。仔细研究一番之后,得出结论如下:
  • RIA在界面交互性上比简单的Web应用当然要强,界面表现能力也要丰富(这才所谓rich嘛)。但RIA强调“零安装”,界面和逻辑都是临时从服务器取得,已避免部署、升级方面的麻烦(从这个角度说,RIA更接近Thin Client)。但。大部分RIA技术都依托Web,在浏览器中实现(所以也常常被称为rich web application),但可能需要安装一个运行库/解释器。目前的选择大致有Ajax, XForms, Flash(Apollo, Flex或者Laszlo)、SilverLight(WPF/E),另外ActiveX和java applet好像也算。
  • Eclipse整天嚷嚷的副客户端(Rich Client),似乎跟以前说的胖客户端(fat client)并没有太大的不同,要求安装很大一堆东西。只是现在大家都更加注重用户体验、模块化和快速开发。目前的选择有Eclipse RCP, WPF(XAML), Mozilla XUL, JavaFX这些。这里出现的两个趋势是尽量简化界面的生成(比如用XML等结构化文件来描述界面)和采用脚本来编写逻辑(比如XAML, XUL, JavaFX等).
不过网上很多文章谈到rich client时,可能还是关注在“用户体验”的丰富性上。所以才会有“OpenLaszlo 是一种富客户机应用程序架构"、“Flash成web浏览器标准, 富客户端指日可待”这样一些说法。

其实Mozilla XUL完全满足两方面的要求,大家常用的Firefox, Thunderbird等可以类比为rich client, 而网站上直接提供XUL则就是RIA了。
例如: Mozilla Amazon Browser, 如果你把它安装为一个Firefox插件或者独立程序,它可能又算一个rich client了。
再例如htmlhelp.dotsrc.org提供的API浏览器, 左边是一个XUL编写的导航栏,比如Python, GTK+

链接:

2007年7月30日星期一

Document Map in Firefox

浏览网站碰到比较长的网页时,总是想起dillo里面那个文档结构图菜单,它会把网页中的h1 - h6等heading搜索出来列在菜单上,你选一个就跳过去了,不必要网页作者在网页上自己做一个"目录"。

在Firefox Add-ons里面搜索了一下,找到了 Document Map这个插件(screenshot),它提供类似的功能,只不过是采用sidebar来做的。

2007年7月12日星期四

采用Total Commander打开目录

虽然有些新手觉得Total Commander跟Windows Explorer风格差异太大而不容易上手,但这对我并不是一个问题,因为我用它已经有七八年了。我现在基本不用Explorer。加上最近不知道为啥我的Explorer打开特别慢,就更不爱用它。

机器上装了Google Desktop,对于找到的文件,它提供了一个"打开文件夹"的功能,但很不爽的是,它总用Explorer打开。忍受不下去了,我开始想在它在Total Commander中打开。

到Google Desktop的安装目录和它的注册表中看了一下,没什么可以配置的。
然后上Google Desktop网站,想找一个可以设置这个的插件什么的,也没有。

猜想它是调用ShellExecute来打开的,接着就试图修改注册表中"目录(Directory)"和"文件夹(Folder)"的关联: HKCR\Directory\shell\下并没有open动作, 我添加了并设置命令为C:\Totalcmd\totalcmd.exe /O "%1"之后,ShellExecute(...,"open", ...)没有什么变化,会返回5(ERROR_ACCESS_DENIED),恢复原来的就可以正常打开,奇怪; 修改HKCR\Folder\shell\open\command的值再试却没反应。

某天发现Directory Opus这个软件可以跟Windows系统集成,接管文件夹的打开操作,就安装了一个试用版本,发现它是这样的:
1. 先给HKCR\Directory\shell\下添加一个动作dopus(再下面command键值设置为dopus的命令行)
2. 将HKCR\Directory\shell的缺省值由none改为dopus,这样它的缺省动作就是dopus了
(对于Folder也同样设置。Folder是文件夹,包含Directory和其它一些不跟实际文件系统目录对应的)

俺照猫画虎,添加了一个wincmd动作,将Directory的缺省动作设置为wincmd,再试,搞定!

转成注册表操作就是如下:
[HKEY_CLASSES_ROOT\Directory\shell]
@="wincmd"
[HKEY_CLASSES_ROOT\Directory\shell\wincmd]
@="Open in Total Commander"
[HKEY_CLASSES_ROOT\Directory\shell\wincmd\command] @="C:\\Totalcmd\\totalcmd.exe /O \"%1\""

补充说明:
1. 这只对ShellExecute时没有指定第二个参数(动作)时是可行的,而Google Desktop恰恰是这样,"运行"对话框也是。但如果它指定了动作是"open",那就只会走open动作了
2. HKCR\Folder\shell\command的值是REG_EXPAND_SZ格式而不是通常的REG_SZ(字符串)格式,奇怪

2007年7月10日星期二

澳门

著名的葡京赌场(不过叫“娱乐场”),侧面(可惜后来在正面忘记拍照了,那可真是金碧辉煌啊
澳门的摩托车相当多,这应该跟他们的路比较窄有很大关系
市政厅附近

2007年7月4日星期三

Firefox扩展实例分析: IETab (2)

接下来的问题就是: Firefox里面的每个Tab页都是一个browser对象,里面显示网页,是调用Gecko来显示的,XUL的overlay对这个没有作用,怎么把这个object标签塞进去?即使想用xbl,也得有个可以让我们重新绑定的tag啊。

IETab是这样解决这个问题的: 将这个object标签写入一个HTML文件 chrome://ietab/content/reloaded.html, Tab中加载这个网页(其实XUL里面也是可以直接采用HTML标签的,因为都是Gecko来进行显示,所以这个browser显示一个XUL或者HTML都可以)。

如果采用IETab浏览http://www.microsoft.com,对于Firefox而言这个Tab页面的URL实际 是: chrome://ietab/content/reloaded.html?url=http://www.microsoft.com。前面那个 reloaded.html这个中又有一段脚本,在window.onpageshow中将上述网址中的url参数解析出来,传给里面嵌入的IE object:
function init() {
  var m=/(\?url=)(\S+)$/.exec(document.location.href);
if(m) document.getElementById("IETab").navigate(decodeURI(m[2]));
}

window.onpageshow=function(e){if(e.persisted)window.setTimeout(init,0);}
也许有朋友会问: 怎么在Firefox地址栏显示的是http://www.microsoft.com而不是前面说的那个chrome://...呢?看看ietabOverlay.js就 明白了: 它把browser的currentURI属性的获取方法给动态替换了(见 hookBrowserGetter和getCurrentIeTabURI函数),为了完备还把urlbar的value属性获取方法、browser 的sessionHistory等给替换了。这种用法以前俺倒是没有见过,算是又学了一招,不过IETab的这种做法不是很可靠,很容易失效。

2007年7月2日星期一

大连




对大连的第一印象,就是这个城市相当漂亮,街道宽畅干净,路上居然还有拖尾巴的电车。楼房有着多国风情,看上去相当舒服,并且没有特别高的住宅楼(反正我是觉得那种楼住着没味道),不愧是最适合居住的城市之翘楚。

这次出差,在大连就两天,自由时间很少,只去了星海广场和俄罗斯风情街看了看。

星海广场怎么这么大啊,太浪费地盘了吧......

晚上8点多钟上街溜达,居然大多数店铺都已经打烊了。地下通道也都明亮整洁(不象深圳,肯花20亿修市政府,还美其名曰市民中心,就是不舍得多建几座好点的过街天桥什么的)。

走到路口,看见一个广场叫“中山广场”,有不少人在广场上玩。转头发现这个广场不是十字路口,而是一个“十路路口”,有十条路汇到这个广场上来,我刚才是从哪条路过来的?啊,晕了

大连的机场怎么离市区这么近?而且周围还有好多住宅楼。在机场碰见同来的同事,他说他家就住在机场对面,奇怪,居然也不觉得吵。

2007年7月1日星期日

Firefox扩展实例分析: IETab (1)

IETab是大家在Windows下常用的Firefox扩展之一,用它可以浏览那些费用IE不可的网页。

大概浏览了一下IETab扩展的文件列表,没几个文件,以为这个插件比较简单,也就是嵌入了一个IE的ActiveX进来,再处理一下对应的命令等。

但仔细琢磨一下就发现没有那么简单,怎么嵌入一个IE进去?看了这么久的XUL相关资料,都没有看到哪里讲解当“控件”不够用时应该怎么办,得改Gecko的源代码?

查看IETab发现它采用的是另外一条思路: 将IE的ActiveX控件包装成一个插件,跟Flash等插件一样,采用HTML的object标签嵌入。
object id="IETab" type="application/ietab" style="width: 100%; height: 100%;"
跟IE里面广泛使用的ActiveX不一样,这里这种插件是采用原来netscape定义的NPAPI接口与浏览器打交道的,这个API接口是cross-browser的(倒是IE 5.5之后似乎不再支持这个API接口,你得用另一个ActiveX控件来增加NSAPI支持,这跟Firefox上的npActiveXPlugin恰好相反,后者是用NPAPI包装了一个ActiveX容器,使得ActiveX控件可以在Firefox中使用)。

这个npietab.dll插件对外提供了navigate(), goBack()/goForward(), refresh(), stop(), saveAs()等方法和title, url等属性(详见nsIIeTabPlugin.idl),基本上都是原来IE控件相应功能的一个包装(详见nsScriptablePeer.cpp文件),只是为了可以在Firefox中可以再访问这些接口(那么npActiveXPlugin对外提供那些接口呢?不同的ActiveX有不同的功能接口,npActiveXPlugin怎么就能通用于各个ActiveX呢?难道它目前没有提供可脚本化scriptability的能力? 没源代码就是不一样,琢磨起来比较费劲)