2007年12月28日星期五

对字符集和编码的一些错误认识

字符集和编码一直很头疼的一块,最近为了搞培训,研究了一下,发现以前确实有很多不明白甚至是错误的认识:
  • ISO-8859-1 .. ISO-8859-16 这些都是西欧各国用的字符集,主要的差别在与128-255之间各自代表的字符不同;
  • 仍然不明白为啥GB2312, Big5这些就算MBCS,而同样采用多字节编码的Unicode却不算
  • GBK应该是GB2312的超集,向下兼容GB2312的,记得以前谁跟我说不是,我迷惑了好一阵;
  • 很 多编辑器说可以支持"Unicode编码",并且一些软件说"Unicode"就是两字节编码,这都是基于Unicode 4.0之前的认识。在那之前,Unicode跟GB2312这样的名称一样,即是字符集(charset)名称又是编码(encoding)名称, Unicode字符均是两个字节。但从Unicode 4.0开始,它已经不只65536个字符了,Unicode只是一个字符集名称,而UCS-2, UCS-4,UTF-8, UTF-16, UTF-32这些才是编码名称(当然,历史包袱总是存在的);
  • UCS-2与UTF-16是不一样的,UCS-2固定采用两个字节,它不能表达Unicode 4.0之后增补的字符(当然,那些字符很生僻),而UTF-16里面每个字符可能是2或4个字符组成;
  • UTF-8
    • 从新的理论上而言,UTF-8应该是1-6个字符不等,但目前应该是1-3个字符就可以表达已有的字符了;
    • UTF-8的优点
      • 如果原有数据大都采用ASCII表达,那么这些数据不用转换
      • 如果系统采用ASCII可以表达大多数数据,那么相对UCS-2,UTF-16这些节省空间;
      • 编码中字符边界很容易找到:以0开头的字节肯定是ASCII字符,最高位以11开头的字节肯定是字符的开头字节,以10开头的字节肯定是字符的后续字节;
      • 容错性强一些,偶尔一两个错误不会影响后面,原因同上(想咱们都碰到过GB2312/Big5的半个汉字问题带来的乱码问题吧)
      • 按字节流读取,不用考虑大端(big endian)/小端(little endian)问题
      • 字符串中不会出现0x00这样的字节(而UCS-2这些会),这样char *这样的方式表达缓冲区时不太容易导致错误
    • UTF-8的缺点
      • 对于非ASCII字符,相对以前存储空间增加了,比如非英语的西欧字符集现在都需要两个字节了,而中文等很多都需要三个字节了;
      • 计算字符串长度比较麻烦,只能逐个统计;
    • 综上,现在很多系统内部处理采用UCS-2,只在存储和数据交换中采用UTF-8
  • Java以前内部全部采用Unicode(其实是UCS-2)来处理字符串,但Unicode 4.0以上的那些字符它不能处理。在Java 5.0中加入了一些奇怪的机制来解决这个问题
  • Python也不能同时支持UCS-2和UCS-4,只是可以在编译时挑选(--enable-unicode=ucs2和--enable-unicode=ucs4),看sys.maxunicode是否大于65535就知道是否是UCS-4了。我看Windows上的预编译版本是UCS-2(python2.5)的,而Linux上是UCS-4(Debian testing, python 2.4)。注意这两种版本在二进制上是不兼容的。
参考文档

2007年12月27日星期四

Firefox 3上使用旧扩展

目前还有很多插件不支持Firefox 3,如果你实在想用,可以修改下面两个设置:
user_pref("extensions.checkCompatibility", false);
user_pref("extensions.checkUpdateSecurity", false);
这样Firefox升级或者安装新扩展时就不会检查兼容性和签名了(检查扩展的签名是Fx3新增的功能)。不过扩展不一定能正常工作,比如Google工具栏就不成。

可以将这两行加在profile下prefs.js(请先关闭Firefox),也可以在about:config中手工增加这两项。

2007年12月25日星期二

Firefox 3上如何添加 del.icio.us 书签

以前我为了几台机器、几个操作系统上书签的同步烦心不已,即使安装了Foxmarks同步器还得留神用哪个覆盖哪个,而Google工具栏提供的书签功能也不太好用。后来开始使用del.icio.us的书签服务,加上del.icio.us Bookmarks扩展,终于很满意了。

Firefox 3出来了beta 1之后,我就基本上开始用新版本了,毕竟很多功能很不错,内存占用比原来少了(也许是目前安装的扩展还比较少),再说反正以后要切的。不过目前还是两个版本都用。

但目前很多扩展都还不支持Firefox 3(而且Firefox 3开始要求对扩展进行签名了,不能象以前那样简单地下载xpi包后自己来改改版本匹配申明就说不定可以使用),有些扩展倒也罢了,但现在del.icio.us 似乎变成必须了 :-)

查看/搜索书签的功能倒简单,只要访问 http://del.icio.us/home 就可以了,网页上也有输入tag进行搜索的功能。

主要的问题是没法方便地添加书签了,以前只要在网上逛,看到不错的地方,按一下Ctrl+D或者点击工具栏的TAG按钮,就有一个对话框出来,当前网页的标题、其他人的tag都显示出来了,并且当前网页选中的文字还可以自动放入书签的说明栏。
del.icio.us

在del.icio.us的帮助中找了一下,发现可以用如下办法: 在书签栏上添加一个书签,其URL是:
javascript:location.href='http://del.icio.us/post?v=4;url='+encodeURIComponent(location.href)+';title='+encodeURIComponent(document.title)
(可以拖这个链接到书签栏,然后自己改名字)

详细的说明在这里: bookmarklet buttons for any browser

但“当前网页选中的文字还可以自动放入书签的说明栏”这一点还不能做到,不太爽。我试验了一下,发现多传一个notes参数就可以了: 在上述URL后面再添加一节:
+';notes='+encodeURIComponent(window.getSelection().toString())

结论: 拖下面这个链接到书签栏就可以了:
post to del.icio.us

2007年12月20日星期四

找不到python24_d.lib怎么办(VC上编译wxPython)

编译一个wxWidgets内嵌wxPython的示例工程时,编译器说需要python24_d.lib,因为懒得自己重新编译一遍python,在网上找到一个办法: 修改Python\include里面的python.h,把静态库都改成同一个(即将python24_d.lib改成python24.lib),其它.h文件也搜索Py_DEBUG,将两种模式下的处理搞成一致(比如不采用不同的引用计数函数),然后就OK了。

---------------------------------------
(下面是详细说明——我现在是越来越罗嗦了)
这几日在琢磨能不能直接采用wxPython搭建我们的下一版本的界面,各方面看都是我们要找的东西,除了一条: 如何将旧系统兼容进去(旧系统采用MFC+COM+Active Scripting技术搭建)。

于是我想先看看用MFC写的程序能不能集成wxPython,但google了半天没有任何信息,只好退而求其次查找wxWidgets上嵌入wxPython,倒是找到一个例子:
http://svn.wxwidgets.org/viewvc/wx/wxPython/trunk/samples/embedded/

它本来的Makefile是编译debug版的,这就需要python, wxWidgets和wxPython的debug版本动态库,好像网上对于Windows上都没有提供(不象Linux上还有python2.4-dbg, libwxgtk2.6-dbg可供安装),这就意味着必须完全自己来编译,编译时还有unicode,universal一大堆的选项,编译完了还有安装/配置的问题。

我烦了,就编译release版本吧,自己修改Makefile.vc,去掉了调试选项,编译出来了。但将embeded.exe放到wxPython的目录运行,它跟我报怨说版本不匹配,wxPython的是"debug,unicode,Visual C++....",而embeded.exe是"no debug,unicode,Visual C++..."。奇怪,怎么预编译的wxPython居然还是debug版本?

没办法,又回头来编译debug版本,但折腾了半天,最后碰到一个python24_d.lib过不去。看来非得自己编译python不可了。我不死心,又在网上搜了一阵,找到一个办法: 修改Python\include里面的python.h,把静态库都改成同一个,其它.h文件也搜索Py_DEBUG,将两种模式下的处理搞成一致(比如不采用不同的引用计数函数),然后就OK了。

2007年12月11日星期二

PDF文件的分割与合并

装个pdftk就行了。

分割可以采用分段抽取来搞定:
pdftk wxPIA.pdf cat 114-146 output chapter04.pdf

合并:
pdftk chapter0*.pdf cat output part1.pdf

还可以将A文档的某些页和B文档的某些页拼起来:
pdftk A=one.pdf B=two.pdf cat A1-7 B1-5 A8 output combined.pdf

添加附件:
pdftk chapter01.pdf attach_files ../chapter-01/* output chapter01a.pdf

拆离附件:
pdftk chapter01a.pdf unpack_files output ./chapter-01/

更复杂的应用还是看项目主页上的文章吧。

另外, 这东西用到libgcj,估计部分是用java写的,反正运行起来有点慢。

修正Launchy在Thunberbird中独立邮件窗口里菜单不能显示的问题

在Thunderbird中碰到一些链接,需要调用外部程序(firefox或者d4x等)打开,于是安装了Launchy。但Launchy菜单可以在主窗口的邮件视图中出现,而在独立的邮件视图(双击列表栏一个邮件时打开的),这个菜单就没有出现了。

估计Launchy没有在独立邮件窗口注册overlay,但要去查邮件窗口的chrome url,也挺麻烦的。
我看ThunderBrowse的菜单工作得挺好,于是看了一下它的chrome.manifest,里面就三行overlay:
overlay chrome://global/content/customizeToolbar.xul chrome://tbrowse/content/accessbrowser.xul
overlay chrome://messenger/content/messenger.xul chrome://tbrowse/content/accessbrowser.xul
overlay chrome://messenger/content/messageWindow.xul chrome://tbrowse/content/accessbrowser.xul
而Launchy是这样
overlay chrome://browser/content/browser.xul chrome://launchy/content/main.xul
overlay chrome://messenger/content/messenger.xul chrome://launchy/content/main.xul

看名字就知道独立的邮件视图是messageWindow.xul,于是在launchy的chrome.manifest添加如下一行就可以了
overlay chrome://messenger/content/messageWindow.xul chrome://launchy/content/main.xul

2007年11月17日星期六

Windows上的Iceweasel :-)

没见过吧?



这几日不在家,在朋友家的机器上上网时不习惯IE, 想装一个Firefox,但一不小心下载了一个英文版本。因为带宽不咋样,也就没再去下载简体中文版,我想在网上找单独的简体中文XPI包,但找了半天没有找到。

最后想到跑去Debian的网站下载了一个iceweasel-l10n-zh-cn包(好在我手机上SD卡里面储备了几个常用软件,包括可以解开deb的7zip),解压到了extensions目录下,然后再about:config中将general.useragent.locale改成了zh-CN。重启Firefox,就成了上面那个样子。

本来我开始也没有想到这个问题,偶然一低头,咦? 任务栏上怎么有个Iceweasel :-)

2007年11月2日星期五

TCShell2 1.5.6

TCShell2: Associate your archives with Total Commander

Changes from 1.5.2
* Now based on ProgMan13's 1.3.6 (he didn't publish it on totalcmd.net), which
+ Added support for different wincmd.ini
+ Fixed bug while parsing command line
+ Guess location of wincmd.ini (COMMANDER_INI, then registry, then totalcmd.exe's path)
+ Added an edit box to show the command line

Download (source code included)
http://bamanzi.inlsd.org/win32/totalcmd/TCShell2-1.5.6.zip

Screenshots:
http://bamanzi.inlsd.org/win32/totalcmd/tcshell2-archives.gif

--------------------------------------------------
If you have Total Commander, then you don't need WinZip, WinRAR any more. These archives can be opened and handled in TC.

But some times, you may wonder: If I need to launch an archive file from my download manager, or from my e-mail, I really need an application to handle the association.

No problem, actually you can associate .zip with Total Commander, TC would take the command line parameter as directory name.

Then another problem comes that how can you associate .zip/.rar/.7z with TC? Yes, you can always do that by editing registry. But it's not handy.

Now try TCShell2, the modified version of TCShell, which can also handle archives supported by packer plugins. (Don't associate TC with some important extensions, such as .exe, .chm)

Code based on ProgMan13's code for TCShell-1.3.6. Thanks for his generious to allow me to use his code.

A few GNOME tips

  • 在bash中,可以用alt-b和alt-f在命令行上跳到前一个单词或者后一个单词,但GNOME Terminal里面alt-f就会激活"文件(F)"菜单, alt-b会激活"标签(B)"菜单,就用不上这个技巧了么?
    • 解决方法: 菜单"编辑->快捷键",在打开的对话框中勾上”禁用所有菜单访问键"

  • 我一般用totem播放视频,但有时字幕会显示不正常,字变得特大,导致只有前面几个字能看到。于是我改用mplayer来播放,但mplayer对这部DVD显示画面又不正常,上下拉得很长。我选择4:3或者16:9,它只调解窗口,有效画面还是那个样子 :-(
    • mplayer加上-zoom选项可以打开软件调节显示比例的功能,缺省只能依赖video driver中接入的硬件调节功能(说是基于性能方面考虑)

  • 在GNOME Terminal中穿梭了半天,突然想用GUI程序打开某个文件,怎么办?打开nautilus文件管理器,然后再定位到那个文件,再双击? 那样太麻烦了吧。
    • 我以往都是用rox来打开(在命令行上输入rox somefile),并不会带出来一个rox窗口这也是无意发现的功能。不过这又需要在rox中对文件类型关联了合适的程序
    • 刚在gnome邮件列表上看见的解决办法: gnome-open path/to/file

2007年10月14日星期日

Mozilla XUL Links 2007-10-14

Mozilla 2早就提出来了,每个人都有很多想法,期望能够摆脱老版本中一些不太优雅的设计与实现。
到底thundirdbird后续会怎样,现在说法很多,闹不清楚。

2007年9月27日星期四

几个不错的Thunderbird扩展

用Thunderbird大半年了,也一直没怎么用扩展,除了Remove Duplicate Messages,因为我的邮件是几个地址汇总过来的,总存在重复。

前几天在它的扩展库里面逛了一下,发现以下几个不错:
ThunderBrowse: 在Thunderbird中直接浏览网页
Tag the Bird: 给邮件添加标签
MessageFaces: 显示Face/XFace头像
Colored Diffs: 采用彩色显示补丁,并且可以转换成unified, side-by-side等几种方式显示
Quote Colors: 邮件中引用的部分采用不同的风格来显示(不过好像不能象Claws Mail那样自己定义哪些字符是引文字符,虽然常用的是'>'和'|'
XNote: TB支持给邮件添加标签(tag),但如果想添加一些注释,就得需要XNote这类扩展了。虽然很多扩展都是这个功能,但好像只有XNote可用于TB2

2007年9月26日星期三

XUL: property与attribute有什么区别?

XUL Elements的说明文档,会碰到Attributes列表和Properties列表,这两个有什么不同?

Attributes:
someValue = element.getAttribute("someAttribute");
element.setAttribute("someAttribute", someValue);
Properties:
someValue = element.someProperty;
element.someProperty = someValue;

前者是按DOM的思路的,而后者是将XUL Element抽象成对象了。但两者是等价的么?如果下两句话一块儿执行,会是怎样的结果?

textbox.value = "First value";
textbox.setAttribute("value", "Second value");
答案是: 界面会显示"First value",但你用text.getAttribute("value")会取到"Second Value"(或者用DOM Inspector可以看到)。

所以这两个东西还是有点不一样。但你在.xul文件里面设置的attribute怎么能直接反映到界面中? 反正比较复杂。 详细的说明可以看这篇文章:
XUL Solutions: Attributes and properties: the essential difference

基本上是说在用代码操纵时最好用properties,但在XBL中就得注意了。

我还注意到其它一些小差别:
1. 有些attribute没有对应的property,反过来也是;
2. attribute和property可能存在一些大小写的差别,比如tabindex和tabIndex。一般而言attribute倾向于contextmenu或者wait-cursor这样的风格,而property倾向于contextMenu。但也不是绝对的(比如sortDirection这个attribute), XUL里面这个有点混乱;

Port some addons to XUL Explorer


I think the following addons might be of some use for XUL Explorer, thus made some quick-and-dirty patches to make them could work on it.

Chrome List: https://addons.mozilla.org/en-US/firefox/addon/4453
Extension developer's extension: http://ted.mielczarek.org/code/mozilla/extensiondev/
xpcomviewer: http://xpcomviewer.mozdev.org
cview (older xpcom viewer) http://hacksrus.com/~ginda/cview/
(but I'm based on the code on mozilla tree)

The patches and patched addons lie on:
http://bamanzi.inlsd.org/xul/xe-addons/

As an alternative to installing them in the extension manager, you can
also unpack each .xpi to xulexplorer/xulrunner/extensio
ns\.
Unpacking to xulexplorer/extensions won't work for XULRunner 1.8.

Not all features could work. Currently I just made sure they could be launched from the Tools menu.

2007年9月10日星期一

Mozilla/XUL Links 2007-09-10

  • CoScripter: 一个网页自动化工具(Firefox扩展),由IBM的人折腾出来的,
  • Penelope: 著名的老牌邮件客户端Eudora关闭之后,有人想将一些功能重新在Thunderbird上实现,并模拟Eudora的观感和操作方式。
  • Open Komono: ActiveState公司决定将Komodo的一部分开放,成为Open Komodo项目。Planet Mozilla上不少人觉得这对XUL IDE是个不错的消息(链接1, 2)。至少,俺一直想把Komodo里面的编辑器(基于scintilla做的浏览器插件)移植到XUL Explorer上来用。
  • XUL activities in France

回应: Linux之父炮轰C++:"糟糕程序员的垃圾语言"

涉及到编程语言之争的帖子,在CSDN上一定会吵得不可开交,这不:
"Linux之父Linus Torvalds为了Linux内核开发而专门打造的版本控制软件Git已经引起了业界的广泛关注。昨天,有一位Dmitry Kakurin老兄在查看了源代码之后,发现使用的是纯C而非C++,表示不可理解,他直言:“别拿可移植性说事儿,这是屁话(BS,bullshit)。“(此外,他还批评Git蛮力地直接操作文本,既啰嗦又易错,而且很难跟上高层代码逻辑。)这个BS引起了Torvalds的强烈反应,他用*YOU* are full of bullshit.“(你才满嘴屁话呢)作为自己反驳的开场白。接着,他先转向了对C++的罕见的火药味十足的炮轰..."
从几年的实践来看,我觉得从面向对象这个角度来看,C++很好,但C++这个东西太复杂,太容易导致错误,用上几个模版后,编译时搞出一大堆不知所云的信息也是常事。俺是觉得C++写的东西很容易变得不可维护,尤其是有C++"高手"加入以后。而且印象中用C++做出来的可重用的库比较少。

大 家都说“我们在没有掌握得好的时候,不妨只用我们了解的那些特性。那些高级特性并不妨碍,你可以不用啊”,但这都是从单独一个人的角度来说的。放到一个团 队来说,你的队伍中有C++高手,有新手,还有更多的半生不熟的人,怎么办?Linus的考虑也是从这个角度出发的,就算你Dmitry Kakurin很懂C++,不会出什么问题,能写出漂亮的代码,但其他人怎么维护你的代码?


不过俺没有帖子里面各位这么确信,对很多事物都抱着一种敬畏的态度,因为我不知道是不是本人不够聪明,没有认识到C++的各个方面。



刚 才我统计了一下sourceforge.net上用C++和C的项目数,以及各自的处于stable和mature阶段的项目数。


































total stable mature
C++ 22462 4326(19.26%) 427(1.90%)
C 19623 4792(24.42%) 615(3.13%)
Java 26454 5097(19.27%) 353(1.33%)
Python 7224 1287(17.81%) 109(1.5%)

从总数上看似乎C++更适合大家写东西,但从stable和mature项目比率上看似乎C项目更容易稳定和成熟,可维护性高些。

不过也许这不能说明什么,因为sf.net上只是些开源软件,上面各位又说C++在windows上应用普遍,而windows上素来没有多少开源传统。又或者商业软件又有不同。各位自己乱炖吧。

参考:

2007年8月28日星期二

Mozilla/XUL Links 2007-08-28


Google Search (xul version)

在侧边栏打开这个地址效果不错

IBM developerWorks : Blogs : Bring information and collaboration into the context of your daily business processes using composite applications

一篇blog,讲述在Lotus Notes 8 (现在是基于Eclipse的了)中如何嵌入XULRunner来显示一个XUL应用,从而形成Composite Application

XUL Explorer 0.7
近来试验了一些XUL IDE的半成品,这个东西的主要长处在于可以预览XUL,而且支持简单调试。新版本0.7相对0.4改动不大,主要是为一个XUL文件可以提供一个chrome环境了(但这个功能很有用,因为一般xul文件都不是独立的,给定一个chrome环境后overlay和dtd都可以正常加载进来了,这样预览才比较接近最后的效果)。如果完全要手工编写xul以及js,我觉得Spket还不错,里面还有Firefox 1.5和2.0的XPCOM接口列表。


2007年8月26日星期日

XUL是如何传递事件源和参数的

代码这个东西就是这样,你一路看下来,挺好懂的,没啥稀奇,但一旦自己写起来,就觉得好多细节搞不清楚了。我在试验XUL的时候碰到一个典型的这样的问题:多个控件的onclick事件可以绑到同一个javascript函数,但它怎么识别是那个控件触发了这个事件呢? 怎么传递点击的位置呢?如果传递多个参数的话,控件触发事件的代码要分开写么?

查了一下DOM Level 2 Event Model规范(mozilla.org上说明),发现HTML/XUL里面是传递了一个event对象来解决这个问题,这个对象有很多属性,但不是每次这个对象里面所有属性都有所用:event.target表示触发事件的对象,event.clienX是点击事件中的点击位置,event.keyCode是按键事件中的键码。

Windows上几个免费反病毒工具

在Windows上如果不安装反病毒/反木马工具而上网冲浪(我们俗称“裸奔”),那是相当危险的。俺家另外一台电脑就因为反病毒程序过期了,昨晚就蓝屏一次,两次系统重启。
  • Avast! 它的Home Edition是免费的,只需要用e-mail登记一下,就可以免费使用一年,到期后再重新登记就可以。功能很全,有文件监控、网络监控、邮件监控等,可自动升级。俺目前在用这个
  • AVG Anti-Virus,它也提供了免费版本,另外还有AVG Anti-Spyware, AVG Anti-Rootkit这两个工具
  • Avira AntiVir,大家俗称“小红伞”,其Personal Edition Classic是免费的,口碑也很不错
  • Clam AntiVirus, 这个是完全GPL的,所以也有各种UNIX版本(不过似乎UNIX病毒比较少,不装问题也不大)。据说查杀病毒的能力相当强,不过没有实时监控能力。另外有一个完全针对Windows的变种ClamWin

2007年8月2日星期四

做了个xulplanet的镜像chm

最近研究Mozilla XUL, 发现老是要到Mozilla Developer Center, Mozilla Wiki, XULPlanet这几个网站查阅文档,今天干脆用Teleport Pro拉了它们的镜像下来。考虑到小文件比较占空间,而且没有索引,于是想把它们进一步做成CHM。

首先搞定的是XULPlanet:
http://bamanzi.inlsd.org/xul/xulplanet.chm



写了一个小的Python脚本(html2hhk.py),把所有的XUL Element属性/方法、XPCOM组件/接口都搜了出来转换为CHM的索引(其实这个脚本的功能是读出HTML的title和keywords meta tag作为关键字,改一改也可以输出devhelp的keyword列表)。

这个CHM文件还有些问题:
1. 目录还没有做,至少一些大的分类得列上去吧,这个东西好像没有什么简单方法;
2. 内容部分每页左边都有一个侧栏,供导航用的,这个东西在CHM里面没有作用,得用sed什么的批量处理一下。

2007年8月1日星期三

Google Talk in sidebar!


在网上搜索"Firefox sidebar"相关资料时,发现了这个。
  1. http://talkgadget.google.com/talkgadget/client 添加为书签,注意选中”在侧栏打开此书签“
  2. 点击此书签,当当!

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的能力? 没源代码就是不一样,琢磨起来比较费劲)

2007年6月30日星期六

沈阳


  • 沈阳、上海、武汉这些地方都有“街客”这样的饮品店,夏天卖冷饮,冬天卖热饮,很方便啊。为啥深圳没有呢?小乐说,深圳有凉茶啊。不过感觉还是不太一样
  • 沈阳的饭馆菜量真是足啊,在深圳呆几年过来,一不留神就点多了
  • 没想到沈阳故宫这么小,而且这皇上呆的地方好像也不咋样啊
  • 在中街吃了沈阳有名的老边饺子和李连贵熏肉大饼。不过居然还有莼菜汤,难得,但价钱暴贵,一份汤要了48元

ActiveState出了个Komodo Edit


估计是为了给Komodo IDE增加一些影响力,ActiveState又推出了一个Komodo Edit,是免费的,但只有代码编辑(带calltip、语法检查)和工程管理功能,没有IDE里面调试、版本管理集成、交互Shell等功能。

但这个Komodo Edit的功能点上来说,没有太大吸引力,现在有很多功能比它强的编辑器,并且不需要30多M的安装包。

我对这个东西有兴趣只是因为通过装一个来看看它是怎么通过扩展Mozilla来实现这些功能的,比如ActiveState开发了PyXPCOM,使得大家也可以采用Python来编写XPCOM Components了。

2007年6月20日星期三

关于blogspot.com不能正常访问的问题

这个Blog本来发布在 http://bamanzi3.blogspot.com,但blogspot.com时不时就被GFW给封锁掉。虽然用gladder这样的扩展可以搭个梯子爬过GFW,但这对于读者总是一个麻烦。

我将Blog搬迁到了这里,有朋友还是看出是用blogger.com提供的服务,问是怎么搞的。其实很简单: blogger支持按ftp/sftp的方式发布,将blog文章发布到你指定的ftp站点上。只是这种情况下新的模板就不能用了(就是那个可以拖布局、加部件的模板),只能切换到老模板(Classic Template)。

自己搞个域名应该也可以解决这个问题。

BTW: blogger的中文翻译真不咋的,常常要切回英文才能看懂是啥意思。

Lost 第三季看完了


更加晕晕乎乎了。如果说X档案看着比较晕,但大致在讲什么还是很清楚的。但Lost 到底讲些什么就说不清楚了。 Ben他们在岛上到底搞些什么?达摩组织和他们有什么不同?John Locke到底是哪路神仙?Naomi又代表了哪一派?看最后两集,Jack应该对带领他们离开很是后悔,到底那时发生了什么?

在豆瓣上看见一篇“剧透”,据说是以后的大致故事发展。似乎又跟平行时空之类的搭上了关系,还是晕。

2007年6月14日星期四

用strace定位totem不能播放rmvb的问题

俺在新装的ubuntu上装了totem, 并且是totem-xine,当然缺省是不能播放rmvb的,得自己来折腾了。

其实开始装的是totem-gstreamer, 试验totme能否播放rmvb的时候totem会问是否要自动搜索解码器,选了是,它就给我搞了个安装gstreamer-ffmpeg,结果也如所料:放不了rmvb。

先是试着将debian上/usr/lib/win32目录进行符号链接过来(ln -s /mnt/debian/usr/lib/win32 /usr/lib/win32),还是不行。

再按一些网上帖子说的,到mplayer网站下载rp9codecs-200?????.tar.bz2,解压动态库到~/.gnome2/totem-addons,仍旧不行。又试验了w32codecs,不行。

再就直接去找realplayer了,http://www.real.com/linux 默认的那个已经很旧了,有很多依赖库都不好解决,点那个nightly build应该可以下载到最新的版本。不过我是找了个edgy的非官方包装在feisty上(从包索引可以看出, 那上面还没有feisty版本的realplayer,也许你看的时候已经有了)。
不过这个东西装上之后一运行realplay就segfault了,这很多帖子说过,是跟scim冲突的问题,修改/usr/bin/realplay,在里面添加一行"export GTK_IM_MODULE="就可以了。
然后很可能播放时画面或者声音会有些卡,装个alsa-oss可以解决: 仍旧修改/usr/bin/realplay,在它执行realplay.bin那行(目前是第73行)加上一个aoss就可以了。
综合前面两条,/usr/bin/realplay最后几行是这样
REALPLAYBIN=$HELIX_LIBS/realplay.bin
if [ -n "$DEBUG" -a -x "$CATCHSEGV" ]; then
$CATCHSEGV $REALPLAYBIN ${1+"$@"}
else
while /bin/true; do
export GTK_IM_MODULE=
export XMODIFIERS=
aoss $REALPLAYBIN "$@"
# Restart the player if exit code is 10
if [ $? -ne 10 ]; then
break
fi
done
fi
现在可以在realplayer里播放rmvb了,回到totem,还是不行(也许有朋友要问,为啥非得用totem不用realplayer放啊,这是因为totem有gnome-vfs支持,可以从网络共享上直接播放,:-)。我用strings /usr/bin/totem-xine | grep addons查过了,结果为空,所以觉得很多网友虽然说将codecs库放到~/.gnome2/totem-addons那样可以,但现在也许已经改掉了(刚下载了totem源代码,还没有来证实)。

于是祭出strace,顺便打开totem的debug开关:

strace totem --debug > trace.out 2>&1

在totem中打开一个rmvb文件,它报告不能播放该格式文件,关闭退出totem.
然后用vi打开trace.out,查找open或者fstat/fstat64调用,或者codec字样,然后我看到如下内容:
stat64("/usr/local/RealPlayer8/Codecs/drv3.so.6.0", 0xbfe23b2c) = -1 ENOENT (No such file or directory)
stat64("/usr/RealPlayer8/Codecs/drv3.so.6.0", 0xbfe23b2c) = -1 ENOENT (No such file or directory)
stat64("/usr/lib/RealPlayer8/Codecs/drv3.so.6.0", 0xbfe23b2c) = -1 ENOENT (No such file or directory)
stat64("/opt/RealPlayer8/Codecs/drv3.so.6.0", 0xbfe23b2c) = -1 ENOENT (No such file or directory)
stat64("/usr/lib/RealPlayer9/users/Real/Codecs/drv3.so.6.0", 0xbfe23b2c) = -1 ENOENT (No such file or directory)
stat64("/usr/lib/RealPlayer10/codecs/drvc.so", 0xbfe23b2c) = -1 ENOENT (No such file or directory)
stat64("/usr/lib64/RealPlayer8/Codecs/drv3.so.6.0", 0xbfe23b2c) = -1 ENOENT (No such file or directory)
stat64("/usr/lib64/RealPlayer9/users/Real/Codecs/drv3.so.6.0", 0xbfe23b2c) = -1 ENOENT (No such file or directory)
stat64("/usr/lib64/RealPlayer10/codecs/drvc.so", 0xbfe23b2c) = -1 ENOENT (No such file or directory)
stat64("/usr/lib/codecs/drv3.so.6.0", 0xbfe23b2c) = -1 ENOENT (No such file or directory)
stat64("/usr/lib/win32/drv3.so.6.0", 0xbfe23b2c) = -1 ENOENT (No such file or directory)
这里可以看到它搜索了/usr/lib/RealPlayer10目录,但realplayer目前的安装目录是/usr/lib/realplayer-10.0.8,于是创建一个符号连接解决问题。

总结一下: 从上面的strace输出可以看出,将drv3.so.6.0放到/usr/lib/win32或者/usr/lib/codecs应该也是可以的,我卸载realplay后重新用rp9codecs或者w32codecs试验,也的确可以,不知道原来哪里有问题 :-(
奇怪的是,它在/usr/lib/RealPlayer10目录搜索的是drvc.so,在其他目录搜的却是drv3.so.6.0.

P.S 请卸载libxine1-ffmpeg库,否则你用totem播放rmvb时,它会用ffmpeg里面提供的音频解码器(在"属性"中可以看到其编解码器名称),造成没有声音。

又: 刚才发现一个地方有realplay/w32codecs的包,写的是feisty版本,不知道是不是。不过偶尔找个老版本装也没有什么问题,尤其这几个对其他包依赖不太强的。

2007年6月9日星期六

Ubuntu初步印象

都在说ubuntu好,也忍不住要试试,于是搞了份feisty装上。这东西用起来跟Debian差不多, 除了main, 把restricted, universe和multiverse也加到/etc/apt/source.list中,就可以装kde和其他很多软件了,包括一些非开源软件。基本感觉挺好的:
  • 中文字体基本上挺好(并且opera这类Qt程序默认字体也挺好的,俺在Debian下的那个比较难看,也不知道怎么配);
  • 无线网卡也不需要我自己下载firmware就直接可以用了;
  • SD卡什么的直接接上去就有窗口显示文件(俺的Debian上原来好的,后来不知道怎么就不能识别出来了);
  • 中文输入法也配置好了;
  • 主菜单上还有一个“添加/删除..."可以选一些常用软件装上,不用自己记录那么多软件包名了...
不过还有几点不爽:
  • 我在Debian上偷用Ubuntu的内核是为了能休眠,现在直接装了个ubuntu,它自己反倒不能休眠了
  • gaim登录QQ登录不上,老报告密码不对
  • 输入法SCIM不如小企鹅方便,至少使用小企鹅时,各个应用程序是否切换到中文输入是独立的,不会相互干扰
  • totem/mplayer不能放rmvb文件,想找个直接能装realplayer和w32codecs的源没找到,得自己折腾了
  • kmess装上其网站提供的1.5pre2版本autopackage包后运行不起来
  • 鼠标中键不起作用,得同时按左右键,修改一下/etc/X11/xorg.conf,给Pointer添加Emulate3Buttons选项(其值为false)可以解决
虽然GNOME什么的都可以用最新(几乎)的版本了,这方面倒没觉得有太大不同。

2007年6月6日星期三

2007年6月1日星期五

武汉杂感

出差到武汉,已经呆了4天了。虽然上次到武汉是两年前,但那时只是路过,在朋友家过了一夜,没有什么时间看看武汉的变化。说起来上次看到武汉应该是六年前了。

武汉比以前漂亮了好多,尤其是街道,破旧的房子也少了。

武汉这些天不怎么热,想是前段时间下雨太多的缘故。

出得门去,总习惯拿这个城市跟深圳比,发现他们活得悠闲得多,自在得多。突然觉得我这种老要去比的想法很不好,为什么非要在意跟别人的比较呢?

街上居然还有卖栀子花的,碰见好几次,终于忍不住了,问有什么用。“就是香啊,买回去放着,屋子里都是香味”。想不到还有这么简单的用途。再次碰见栀子花的时候,买了两束,一共一块五。这次老乡说,还有些人拿去用叶子泡茶喝,有xxxxx用途。

同样是出门在外,这次可以跟小乐通过短信和MSN聊天,倒也没觉得无聊。

某天傍晚,吃了晚饭,自己出去乱逛。天渐渐黑了,不少人坐在街边纳凉,迎面走了几个年轻人,一边走一边在讨论今天的麻将赢了还是输了。

最后一天,忙完了工作,下午有点空闲,就坐上公交,只要一块钱,便宜啊。到江边转轮渡,打算去江汉路转转。

在江汉路吃了一份三鲜豆皮,喝了一杯米酒,挺爽。不过臭豆腐怎么不臭呢?不爽。还吃了一份重庆的叶儿粑。

2007年5月30日星期三

Eclipse 里面集成Mozilla


(本图片摘自Ajax Toolkit Framework Tools in Eclipse幻灯片, 作者Philippe Ombredanne)

在公司论坛上看见有人又再问有没有新版本的Eclipse,也总有热心的人共享出来,俺对这个东西不太感冒,虽然这个东西被称为RCP的热门首选,但考虑到Java程序的内存占用,俺还是觉得不太适合我们。不过还是翻了一下3.3版本的新功能说明,里面倒是有一点吸引了我(后来发现该说明不是官方的,而是来自“Eclipse在做什么"这篇网上日志):
忘了提Eclipse 3.3的又一大特性了,叫做“Moziila Everywhere”,是指在任何平台上都可以创建一个Browser控件但是使用Mozilla内核(及时该平台上没有安装Firefox)。这是怎 么实现的呢?其实很简单,它要求你必须安装一个xulrunner,后者是Mozilla的全部内核,包括Gecko布局引擎、Javascript解析 引擎、XUL解析引擎和XPCOM,其中每样东西都足够写一本书,有了这些,仅用XUL+Javascript就可以写出一个Firefox来, Eclipse洽是利用了这个特性,用Java连接XPCOM所以创建了一个Mozilla的Browser,但是没有任何行为,包括右键菜单。

这 个Browser控件和缺省的Browser控件是不一样的,我们平时见到的缺省Browser控件,在Windows上用的是IE内核,在MacOSX 上用的是Safari,在Linux上。。。不知道,所以它是最最简单的浏览器,不具备任何可以定制的功能,除了显示一张HTML页面外,没有任何用处。 (你该不会想用Eclipse写一个傲游出来吧)

但是Mozilla内核的浏览器控件就不同了,它意味着如果程序员平时为Firefox 写插件的形式,也可以被应用到RCP应用程序上来,设想一下我们拥有一个RCP+xulrunner的平台吧,RCP接收Java扩展, xulrunner接收xul和javascript扩展,那我们的平台——要么叫Fireclipse,要么叫Eclifox——就所向披靡了。即使不 利用它的可扩展性,单单就是能保证在不同平台上提供对Web应用程序的一致性展现一条,就足够臭美的了,更可以用写Eclipse插件的形式来限定浏览器 的行为。。。。。。唉,刚才是不是说过一个NetBeans in Eclipse啊?把那玩意扔了吧~~
如果现在整个Mozilla能嵌进去,并且能够通过JavaXPCOM交互,那就非常爽了:我们的用户很期望将他们开发的工具集成起来,一直也期望我们这边能够提供一个平台,毕竟现在我们已经有数据管理这一部分了,但我们一直没有一个好的思路,Mozilla XUL/XPCOM是近期考虑的一个方向;另外一些用户又期望将平台搭建到Eclipse平台,毕竟现在这上面的东西已经有非常多了,可以很好地利用一下。

现在既然这两块能够集成到一起,那么我们这边用Mozilla XUL/XPCOM来构建,他们想用Eclipse的就用,不想用的也可以直接用XUL和XPCOM。哈哈。

BTW: 晚上试验了一下,可以将Mozilla(具体说是XUL Runner)嵌入到一个SWT程序中去,成为一个Web Browser, 但还没试验成功如何显示一个XUL界面(也许是我没搞对chrome地址)。

参考:

2007年5月27日星期日

Mozilla XUL IDE?

在学习研究Mozilla XUL的过程中,觉得对于开发人员而言,最大的麻烦就是一切都得手工进行,缺乏一个集成开发环境。也许这是Mozilla XUL技术目前相对SilverLight(WPF/E), Apollo而言最大的一个障碍(微软总结经验说:你得先抓住开发人员的心)。

但我们也不是啥都没有:
  • 如何知道每个XUL element有哪些属性、哪些事件? XUL Element Reference已经有了,不过这只是文档,查起来效率也够差的。 DOM Inspector可以提供一些信息,但还不是一个好的设计工具(对比GTK+ Glade或者Delphi的Object Inspector看看);
  • 如何知道目前有哪些XPCOM组件可用? 每个组件又都有哪些接口?XPCOM Component Viewer(mozilla版本, firefox版本)可以部分解决这个问题,只是目前没法看到接口中每个方法/属性的说明(好像也没有看到一个类似的reference文档);
  • 如何调试程序? JavaScript Debugger和JavaScript Console倒基本可以满足需要;
  • 对于网页内容部分,Web Developer够强了
  • 所见即所得(WYGWYS)的UI设计器?嗯,这块还没有。
前面一段时间Mozilla社区一直在争论XULRunner的发展方向, 是只需要满足Firefox 3的需要呢,还是尽力将其发展成为一个通用的应用程序运行环境?现在似乎大家达成一致了:当然是后者。(其实这个目标是大家都渴望的,争论的中心在于做一个通用的运行环境的话,就得保证XULRunner对多个程序的兼容性,这涉及到向前兼容性、API冻结等等,势必拖累Firefox 3对XPFE的改造。于是有人又担心错过目前这个时机,Firefox的风头又被IE8抢过,那有可能我们什么都没有了)

目标一致了,那就开始努力吧。今天在mozpad上看到了关于Mozilla IDE的计划:
Gather initial requirements for a Mozilla IDE. A future goal might be to form a project for specifying and then developing the IDE. This should probably be based on the work being done by Paul Rouget (Codeeditor), Alex Vincent (Verbosio) and/or Mark Finkle (XULExplorer).
这三个工具都很有特色,如果把它们结合到一起(XUL Explorer现在已经把DOM Inspector和Verkman JavaScript Debugger结合进去了),前景很不错。看来Mozilla IDE离我们不远了。

2007年5月20日星期日

Firefox扩展实例分析: Paste and Go 2(续)

* 命令与事件
mozilla里面的事件处理完全采用了生产 者-消费者(广播-观察)模型,这使得一个事件发生时(一个命令被执行,或者一个控件的某种状态发生改变),响应可以有多个。

比如这个插件里pg2-go-command和pg2-search- command两个命令是否disabled,是由被观察 (observes)的pg2-pastable-broadcaster来决定的,而这个broadcaster的状态改变又是检查cmd_paste 这个内置命令的状态来改变的,这个检查的时机是在地址栏(urlbar)的右键菜单显示或者隐藏时(见content/pasteandgo2.js):

 const CmdBroadcasterId = "pg2-pastable-broadcaster";

this.pgUrlbar = document.getElementById("urlbar");

this.pgUrlbar.addEventListener("popupshowing", pgInstallGo, false);
this.pgUrlbar.addEventListener("popuphiding", this.enableCmds, false);

this.nativePasteCmd = document.getElementById("cmd_paste");
this.cmdBroadcaster = document.getElementById(CmdBroadcasterId);

var isPasteDisabled = pgPrefsObserver.nativePasteCmd.getAttribute('disabled');
pgPrefsObserver.cmdBroadcaster.setAttribute('disabled', isPasteDisabled);

enableCmds: function(event) {
pgPrefsObserver.cmdBroadcaster.setAttribute('disabled', 'false');
}
* 偏好(preference)
与简单的GUI toolkit不同的是,Mozilla/XUL平台对于偏好(preference)数据考虑比较周全,比如偏好如何存储,如何处理用户设置与系统默认值,扩展如何扩充偏好项目,偏好数据改变(比如直接修改)如何让界面得到相应改变等等。

在Paste and Go 2的代码content/options.xul中, 我们还可以看到另一方面支持: 将一个偏好选项绑定到一个界面控件上,界面初始化时,可自动从偏好数据设置控件的值; 界面控件的值改变时,偏好数据也就变了,不用自己再费很多劲自己写脚本读写数据(想想我们很多时候写程序非常不情愿写个”选项“对话框,这算其中一个主要 原因)。



怎么样,很省事吧?MFC里面的DDX跟这个有点类似,但只能变量与控件值绑定这一步,缺乏将数据持久化 (persistence)功能。

Firefox扩展实例分析: Paste and Go 2

先看一个简单的插件Paste and Go 2,它的功能是:如果剪贴板有一个URL,那么它允许我们只通过一个操作直接转到那个网站去,而不是先在地址栏目粘贴再点击Go按钮; 对于搜索栏也有类似的功能。

它的源代码可以直接通过网页查看: http://www.mozdev.org/source/browse/pasteandgo2/src/

* Overlay
一般而言,XUL overlay文件是个不错的入口,通过它我们可以比较容易知道这个插件扩展了哪些界面元素,然后再根据界面元素去看其对应的代码。

于是我们先看content/pasteandgo2Overlay.xul


这里定义了这个插件的stringbundle, key, command, broadcaster以及firefox特有的toolbarpalette配置。快捷键、命令这些都不是界面控件,但却是一个GUI程序所不可缺少的元素,mozilla/xul把这些功能都拆分了,可以通过overlay来添加和扩展,相当方便。

* 通过脚本动态创建界面元素
但这里没有见到右键点击地址栏时出现的那个Paste and Go菜单项,它是通过脚本content/pasteandgo2.js动态添加的(因为有个添加到"粘贴"后面还是菜单最后的选项):
 function pgInstallMenuItem(e, aID, aLabel, aCommand, aAccesskey) {

item = document.createElement("menuitem");
item.setAttribute("id", aID);
item.setAttribute("label", aLabel);
item.setAttribute("command", aCommand);
item.setAttribute("accesskey", aAccesskey);

if (pgPrefsObserver.pgPlaceAtBottom) { // place at bottom
menu.appendChild(item);
} else { // else place next to paste
var items = menu.childNodes;
for (var i=items.length-1; i >= 0; i--) {
var targetCmd = items[i].getAttribute("cmd");
if(targetCmd == "cmd_paste") { // find out paste
menu.insertBefore(item, items[i+1]);
break;
}
}
}
}

这就是mozilla/xul相当方便的一个地方: 通过脚本可以动态地创建、删除界面元素或者设置它们的属性,并且代码相当简洁直观。

2007年5月18日星期五

Mozilla的可扩展性(开篇?)

本来我是很少买《程序员》杂志的,主要是能力有限,大都看不懂:-(,所以一向只是在书店里站着翻翻,免得买回去占地方。不过第五期上面居然有一篇《Mozilla的架构设计》,Mozilla的中文文章向来比较少,难得有人肯研究这个啊。于是就买了一本,没想到文章看完,发现居然是absurd写的,呵呵,也是,还能有谁。

开始是被firefox的扩展所吸引,加上工作上也需要类似地扩展能力,于是从去年底开始看一些mozilla/xul方面的资料,慢慢地发现了xul, xbl, xpcom的魅力,于是打算系统地学习一下。
  • 春节前后把Creating Applications With Mozilla这本书草草看了一遍,有了大致的了解;
  • 通过limodou的学习笔记将XUL Tutorial看了一遍(英文原文在MDCXUL Planet上都有),好在有他的帖子啊,否则RDF这个东西看英文还真头大;
  • Rapid Application Development with Mozilla 是第二本关于Mozilla开发的书,曾在amazon上获得五颗星的评价(可惜作者过世了,再也没有第二版)。我看了几章,感觉细节讲得比较多,而且很多地方会用类比的方式来讲解为什么要这样设计,不是太适合初学,尤其是英文不太好的朋友很难抓住重点。这本书的PDF版本可以从这里下载到。
absurd是从mozilla的核心代码角度入手来分析的,但我的习惯是从功能应用的角度来入手,可能是跟我的阅读代码的能力比较差有关:-(。而且我目前主要关心的是这个平台怎么就能够方便地扩充功能。我打算近期从一些Firefox扩展入手,来分析一下mozilla/xul的可扩展性。尽量选取一些在扩展性上有代表性的扩展。

先概括地介绍一下mozilla/xul的扩展能力:
  • 通过overlay技术可以对一个已有界面进行重新定义,这也使得对于一个界面可以先写一个框架,再用overlay来逐步细化;
  • 每个窗口的界面元素也有一个DOM结构,完全可以通过脚本来操纵它,修改其属性,甚至动态地创建和删除控件;
  • 可以用XBL来绑定一组XUL元素组成,对行为和风格也可以包装,更方便复用;
  • 可以自己来写xpcom组件(components)来扩展一些功能,尤其是与操作系统或者外部程序交互的地方,这些控件注册后就可以在脚本中使用;甚至可以用javascript来写组件

2007年5月12日星期六

菲利普·K·迪克(Philip K. Dick)

Do Androids Dream of Electric Sheep ?(机器人会梦见电绵羊吗) -> Blade Runner(银翼杀手, 1982)

We Can Remember It for You Wholesale(记忆公司) -> Total Recall (全面回忆/宇宙威龙, 1990)

Second Variety(第二类型) -> Screamers(异型终结, 1995)

Impostor -> Imposter(强殖入侵/冒名顶替, 2002)

Minority Report(少数派报告) -> 少数派报告(2002)

这两天看见说又有两部小说要改编成电影了(有一部好像是叫《遇见未来》,据说是尼古拉斯-凯奇主演),天才啊。据说他之所以能想像力如此丰富,与他嗑药的经历有很大关系。

2007年4月24日星期二

firefox两个设置问题

Browser.backspace_action
0: Backspace历史记录中前一网页, Shift-Backspace后一网页
1: Backspace向上一页 Shift-Backspace向下一页

Browser.tabs.closeButtons
0: 只在激活的tab上有关闭按钮
1: 在所有tab上有关闭按钮
2: 没有关闭按钮
3: 只在最后有一个关闭按钮,用于关闭当前激活tab (firefox 1.x行为)

2007年3月27日星期二

我的学习方法,呵呵

16:24:43 (F)深南大道走到黑 ~ .. says: 又在跑牛么
16:25:00 菠萝油王子 says: 跑牛?
16:25:31 (F)深南大道走到黑 ~ .. says: 你稍微想想难道还不懂么
16:25:53 菠萝油王子 says: 没有,在翻以前泡妞的消息日志
16:26:04 (F)深南大道走到黑 ~ .. says: ....
16:26:20 菠萝油王子 says: 是MSN的 xml格式
16:26:34 菠萝油王子 says: 打算写个小脚本转换成html格式
16:26:46 (F)深南大道走到黑 ~ .. says: 你打算给我看么
16:27:04 菠萝油王子 says: 然后学习了一下python的xml.dom.minidom库的用法
16:27:34 (F)深南大道走到黑 ~ .. says: 你别逗我笑了
16:27:53 菠萝油王子 says: 发现整个库用起来相当麻烦,又到python网站上看哪些xml库比较有名/好用
16:28:11 菠萝油王子 says: 初步选定了elementtree/lxml

2007年3月20日星期二

GNOME 2.16 backport for etch

Debian是够慢的,自打准备出etch以来,testing的包更新就很慢了。这GNOME 2.18都出来了,Debian给etch准备的还是2.14。

这etch还没出呢,已经有人等不及,开始倒腾backport了: GNOME 2.16 backport for etch.

安装方法:
$ echo "deb http://people.debian.org/~nobse/etch/gnome2.16/ ./" >> /etc/apt/sources.list
$ apt-get update
$ dpkg --set-selections
> libeel2-data hold
> libvte-common hold
> (^D)
$ apt-get install gnome-core

可用的meta package: gnome-core, gnome-core-devel, gnome-desktop-environment, gnome, gnome-dbg, gnome-fifth-toe, gnome-office

2007年3月18日星期日

技术得为娱乐服务啊

有时候都不明白是电脑在为我们服务,还是我们在伺候电脑。虽然感觉从去年初开始很多东西都可以在Linux玩了,但目前还是有些地方不爽:
  • 有时用Totem播放电影会造成X server黑屏(尤其是休眠再恢复之后),只有一个转动的光标,而且系统无法切换到控制台,按Ctrl+Alt+Backspace或者Ctrl+Alt+Del都没用,只能关闭电源。Ubuntu的bug列表中报告了这个问题,但没解决,说可能是内核的问题。
  • 很多mp3文件的id3tag不是用UTF-8编码的,而是采用本地字符集的(据说id3tag v1没有明确的编码要求,但id3tag v2有),播放器不能识别倒也罢了(据gnome-cn.org上说这个问题已经在gstreamer上解决了,但好像不是事实:-(),还找不到工具来转换(easytag试过了,它会报告libid3中有bug,会导致写入的id3tag不可读,而且真的能做到:-) )
  • last.fm上没法跟人分享中文歌(人太少了。不过该网站现在倒是有了个中文的界面),播放器对Linux的支持也一直不咋样(最近推出了一个Linux版本的播放器却在我这里一开始播放就崩溃,还不如以前那个中转给其它播放器的版本)。国内的音乐八宝盒是可以找到中文歌啊,不过技术搭建在Windows Media Player平台,没法在Linux下玩,而且网站还特别慢。

2007年3月6日星期二

kmess还不错


为了使用gimmie, 我不得不将很多程序升级,包括gaim升级到了2.0beta版。但gaim-2不能每个协议的状态分开设置,有点不爽。于是就想是不是另外找一个MSN的客户端。

用apt-cache search msn查了一下,有其它几个MSN的客户端,都试了一下。
  • amsn(居然是用tcl写的)中似乎没法激活中文输入法;
  • tmsnc是个基于字符界面的,俺懒得考虑了;
  • licq有个msn插件,基本功能似乎都还有,但使用起来感觉不是太趁手;
  • 最后剩下kmess,这个早听说过,但因为是KDE平台的,我连KDE都没装,也一直没试过。

装起来试试,感觉还可以,跟MSN本身比较象。debian上还是1.4.3版本,而它网站上已经有1.5-pre1版本,支持比较新的自定义笑脸、离线消息、状态信息等功能。

kmess网站上提供autopackage形式的包,可以很容易地安装起来。

2007年2月22日星期四

韶关 南岭森林公园

春节没回家,当中去韶关的南岭森林公园玩了两天。能见度相当高,空气那叫好啊,青山绿水,那颜色真是“欲滴”,深圳这边的空气真没法比。

2007年2月17日星期六

Linus和GNOME之间的一场新战争

Linus以前就说Linux用户应该去用KDE而不是GNOME,因为他认为后者那种“用户傻瓜化”的思想是不对的。

前几天两边又吵起来了,GNOME开发者认为Linus并不了解GNOME,“正如你不懂西班牙语,就可以认为你是个傻瓜么?”Linus则回应说:“GNOME让用户有个简单的开始,这一点是很好的,但如果只有简单就不好了。GNOME开发者认为你在会使用之后不会再要求其它的,这显然不是事实。”

GNOME开发者提议Linus先使用GNOME一个月,再提些具体的改进意见和代码补丁。Linus也的确对GNOME的打印对话框给出了补丁。但口水战还在继续

2007年2月14日星期三

幻象·平行宇宙

引子: 李连杰的《救世主》(The One)刚出来的时候,我看《X档案》(The X Files)看到第九部第5集4D,我觉得同样是基于平行宇宙(parallel universes, wikipedia , 百度知道)这个话题,后者比前面那个有意思多了。Monica拔掉中枪的Doggnett的氧气管,试图把他挤出这个宇宙,把她那个正跟他一起吃热狗的Doggnett带回来。

(以下内容中斜体部分均发生在其它宇宙,而当前这个宇宙又来源于昨天巴西一只蝴蝶对翅膀的扇动或者一条“咱们只是普通朋友多好"的短信,一如Doctor Who中Rose为了将她老爸从车祸中解决出来而造成了时间的缝隙从而进入了一个新的未来。

薄荷糖》告诉我们,虽然表面上“生活是美好的”,但实际上它是无聊、平淡、无奈的,只是我们还会硬塞给自己一些莫须有的期望。

──废话了这么多,拽了不少文,其实搁猫扑上的说法,我只是在YY而已,呵呵)

一.
楼门打开,芳芳看见我在外面等了,竖起一根手指左右摇着,笑着说: You don't bring me flowers.

二、
卖花的大姐凑上来: 先生,买束花吧。
我笑着摇摇手。
芳芳也笑了: 你还是离我远点,免得老有人问你要不要花。
......
街边的花店摆了好多花,我看见了白色的玫瑰:白玫瑰什么意思?
——好像代表纯洁的友谊吧
——那我送你几多白玫瑰吧
——(有些窘迫地)不用
——看来是要红的啰?

三、
——你今天收了多少花啊
——嗯,没有。
——不会吧,你这样的女孩儿怎么会没有呢
——今天...要回家,没上班嘛
......
我转身打开后备箱,抱出那个早上花店没能送达的盒子
——今天你怎么能没有花呢,我送你一束吧。我知道...你就当是一陌生人送的也行,看见花不要想我的猥琐样就行了,嘿嘿。扛着上火车,也可以骗骗你爸妈,算我第二次替你打掩护吧

四、
车子在火车站转个半个小时,所有停车场都满了,还有二十分钟火车就要开了。
我没辙了:只能你自己上去了
芳芳也着急了,转身下车,拿了箱子往候车大厅走。
......
我被堵在路当中,看着一分一分跳动的时钟和一动不动的车流,口里念念有词:十分钟,就给我十分钟...就给我五分钟...
我倏地冲出车门,抄出后备箱那束花,朝着候车大厅狂奔起来.....

五、
我被堵在路当中,看着一分一分跳动的时钟和一动不动的车流,茫然地耗着。怕她正上车没空接电话,借空档给芳芳发了个短信: 上车了给我个信息。
手机响了,听声音有点焦急:王子,车开了,没挤上去
——不会吧,你上去的时间完全够啊,怎么搞的......
......
——也好,看来非得我送你回去了,这次你不愿意都不行了,嘿嘿。
——这样.....
——干嘛,难道不回家,想陪我过年啊


2007年2月13日星期二

程序员和青蛙公主的故事

  男孩正走在路上, 一只青蛙将他叫住, 对他说:"如果你吻我, 我就能变成美丽的公主."男孩听后, 弯下身, 把青蛙捡起来, 放进口袋里.
  
  青蛙又开口了:"如果你吻我, 把我变成美丽的公主, 我就和你共处一个星期."
  男孩吧青蛙掏出来, 冲它笑了笑, 又放回口袋里.
  
  于是青蛙叫起来:"如果你吻我, 把我变成美丽的公主, 我就让你为所欲为."
  男孩吧青蛙掏出来, 冲它笑了笑, 又放回口袋里.
  
  最后青蛙问道:"为什么?我告诉过你我是一位美丽的公主, 会与你共度一个星期并让你为所欲为. 你为什么还不愿吻我?"
  男孩说道:"我是一个程序员. 我没时间交GF, 但拥有一只会说话的青蛙简直太酷了."

──谨以此祭奠我的2007年情人节

2007年2月5日星期一

《我爱你》

虽然出去忙了一下午,但晚上泡了一杯茶 ,竟然没有困意,于是把头天下载的徐静蕾、佟大为的《我爱你》看了。也不记得怎么心血来潮地突然对这部片子有了点兴趣,不过当年王志文、江珊演的电视剧《过把隐》。

别的想法也懒得写了,倒是注意到老徐的这个版本里删掉了王朔原著中几个重要的情节:
  • 他们和潘佑军去骑马,方言不小心摔下来了,杜梅赶紧上去问摔坏没有,方言觉得受这种关心就显得不够爷们;
  • 杜梅说,潘佑军和他老婆“每天早晨出站都要互相接吻,互相说我爱你”,非让方言学。但两人转眼就离婚了,方言似乎有些得意,两人因为这个吵起来;
  • 两人离婚后,杜梅托贾玲跟方言说,让他配着去趟监狱。但老徐的版本中只讲述了杜梅他爹杀了她妈,但省掉了杀人的具体原因是因为一段情变。我觉得这个原因可以部分说明杜梅对感情的不安全感和依赖。只看老徐的版本就只觉得杜梅有些神经;
  • (离婚后)贾玲结婚时,方言和杜梅都去了,杜梅喝多了,方言赶紧送她回家并扶上床,这时杜梅有点意识了,开始闹,”别管我,你谁啊“。”我是方言“。杜梅马上软了,很信任地睡下了。

罗大佑: 母亲

母亲——罗大佑

词:罗大佑
曲:罗大佑
唱:罗大佑
出自专辑:《原乡》

你如此端详的这张迷惑的脸
和那历经风雨和冰霜寂寞的眼
寒冷的冬天怕你在夜里着凉
温暖的春天是你年幼的阳光

绵延里跌跌撞撞谁的成长
是个熟悉的身影又出现你的身旁
无言的牵挂中想你在世间流浪
孤单的思念中盼你往归途遥望

母亲的怀中是个蓝蓝的海洋
抚育了你终于成青春的脸庞
挥挥手告别的光阴不再回头
抬头看看那苍老的目光依旧温柔
童年的旧事绵绵如岁月停留
片片的拾回是终于拥抱你的手

母亲的怀中有个蓝蓝的海洋
曾经你也有一个青春的脸庞
你如此端详的这张迷惑的脸
和那历经风雨和冰霜寂寞的眼

寒冷的冬天依然有夜深寒凉
春天的温暖只因你年幼的阳光

2007年2月1日星期四

localepurge: 省出250M空间

虽然apt可以让你只安装需要的软件,但天长日久,分区还是快塞满了,我正琢磨着是否要干掉原来安装了但近一年没有用过的Mandrake 2006。

做决定之前,还是先安装了localepurge包,把不需要的翻译都干掉,节省出了257M空间。

请参考: 清理Ubuntu系统的5个提示

升级到了Flash Player 9

声音倒是好了,爽。可惜设置界面还是乱码。

英国环保组织称Vista将会导致环境恶化

matrix 写道 "UK Green Party表示Vista的数字版权保护(DRM)需求将迫使许多用户进行不必要的硬件升级。为了完美的运行Vista,将有数以千吨的显示器,显卡等硬 件设备被抛弃,这将对环境造成伤害。未来的考古学家在检查垃圾堆化石的时候将会确定一个“Vista Upgrade Layer”。"

嗬嗬。

2007年1月30日星期二

最暗的夜,最亮的光


"影片片名Babel (通天塔), 来自《圣经》中的传说: 人类曾经拥有同样的语言,他们修建通天塔来显示力量和团结。耶和华害怕人类太强大就混淆了人类的语言,让人们无法沟通,通天塔当然就无法建成。《通天塔》的主题就是人与人之间沟通的缺失,这种缺失不光来自语言和文化的差异,还有外界环境的干扰和人类内心的弱点。片中没有故意设置的坏人,但却始终让观众处在不祥的预感中,一个看似无害的随意决定,一个缺乏安全感的过度反应,都会让事态陷入恶性循环,并波及到更多人的命运。“

──摘自《三联生活周刊》刚到的一期中对电影Babel (imdb link)的介绍

链接:

(外一则) 这两天在想,《谈谈情,跳跳舞》里面的男主人公在比赛结束后的生活会是怎样的?死寂的湖面泛起一圈涟漪,以为便是澎湃的海浪了,晕乎乎地随着波浪起伏了几次,又归于死寂了。黯淡是梦里的光辉。我只是没想到人心可以变化这么快,一转眼说话比陌生人还冷漠。

2007年1月29日星期一

Fw: 幸亏没学法语

从豆瓣上看见的贴子,有意思。

法国人,法语
  
   “要说法语数字还真简单。70说成60+10(Soixante-dix),71是60+11……以此类推
  
   79就是60+10+9。那么,80该怎么说?如果以为是60+20那可就太没有想象力了,我们法国人不光会加法,还会乘法,所以80就是4x20(Quatre-vingts)。
  
   到了说99, 那就要用得上三则运算了:4x20+10+9(Quatre-vingts-dix-neuf)。我不知遇到了多少外国人,特别是美国人,就是在念到了99的时候决定放弃法语学习的。
     
   也许是为了进一步迷惑外国人,法国人念电话号码不像我们习惯一个数一个数地念。比如61718098,法国人不是念成6-1-7-1-8-0-9-8,而是两位两位地念: 61-71-80-98。
  
   如果法国人告诉你他的电话号码,你可听好了:
  
   60+1,60+11,4x20,4x20+10+8。
  
   听法国人说电话号码,你刚记了一个4,后面突然冒出来个20,
  
   所以得赶紧把4涂了,改成80,精神始终处于准亢奋状态。

忐忑

  • 佛偈云: 由爱故生怖,由爱故生忧。
  • 友人阿當在blog上借《中国式离婚》里面的台词说: “愛是需要能力的。那能力就是,讓你愛的人愛你”。那么,我能带给你的,有什么?
  • 卡片的后半源自Nick DrakeNorther Sky,改了一个单词
I never felt magic crazy as this
I never saw moons knew the meaning of the sea
I never held emotion in the palm of my hand
Or felt sweet breezes in the top of a tree
But now you're here
Brighten my northernWHOLE sky.

2007年1月20日星期六

Gimmie 0.2终于发布了

半年过去了,gimmie终于从0.1跑到了0.2 :-(

这次gimmie不是一个独立应用程序了,而是一个面板小程序了(panel applet)。原因是作者发现用户们还无法抛弃目前的桌面而去拥抱一个尚不完善的创意。 (I’ve noticed that a big reason that people still aren’t playing with Gimmie is that they don’t want to toss out their beloved Gnome panels. Especially not in favor of some heavily alpha software. Surprise!)

我还没有在Debian上装起来(感觉这东西的开发人员都在使用Ubuntu)。上次因为debian的python还是2.3版本,改了好多地方才看见雏形。这次不知道又是哪里的问题,反正bug-buddy蹦出来。从帖子的评论来看,碰到问题的不少 :-)

链接:

2007年1月17日星期三

无聊

这人要是过得比较高兴了,就会缺乏思考了,就没有那么多感想了,就无聊了。

我这是什么逻辑?!

cygwin port of xfce4 and claws-mail (site moved)

我提供的一些cygwin包移动到了 http://bamanzi.inlsd.org/cygwin.

只保留了xfce4和claws-mail. 其它的没有精力维护了 :-(
而且xfce4也只保留了4.2.3和4.4rc2,更老的版本删除了。
claws-mail倒是更新到了最新版本2.7.1.

(原来的空间http://www.amazepc.com/bamanzi 是网友古公友情提供的,很感谢他提供了这么久。
以前的一些有价值的东西,我会陆续放到新的站点。)

原来有不少在wine上面跑Total Commander

http://www.ghisler.ch/board/viewtopic.php?t=12814

直到有人在该论坛上也说工具条背景显示不正常,我才意识到原来别人也有这个问题。

2007年1月15日星期一

大家都来看《大明王朝》

不知道怎么回事,一下子大家都对明朝的历史感兴趣了(可能清朝讲腻了),尤其是嘉靖-万历那一段(朱元璋和崇祯也讲腻了,离我们近的也就这个了)。百家讲坛在讲,《南方都市报》上也有专栏《晚明落晖》,如今一部《大明王朝-1566》电视剧又吸引了大家的眼球。

-----------------------

我是半年前从别人那里随手拿了《万历十五年》翻了一下,觉得有点意思(或者说意义?),《南都》上的专栏也是一直在看。

为 什么大家都会有兴趣?我觉得跟《汉武大帝》这些片子差不多,大家骨子里还是有一个大国情节。只是明朝跟汉朝相反,这是关于我们如何走向衰落的。读中学的时候只是知 道,我们的那时的体制已经不能适应生产力发展了,一点资本主义的萌芽也被明朝的海禁政策给扼杀了。“盛唐时中国的GDP占全世界的37%,到了清朝那个老 太太时只有4%,现在是5%,为什么会这样?”大家对这些个问题都有兴趣,所以,“在位、隐退的政治家都喜欢研究明史,毛泽东手中常拿着一部《明史》,张学良被软禁后专攻《明 史》。”

在黄仁宇的《万年十五年》看来,那个时候的文官制度已经过分“成熟”了,处处以“德”为先的儒家礼制已经让这些官员们没有多少时间来解决真正的问题,反而是在一些细枝末节中争论不休。南都上《晚明落晖》中前段时间就讲述了张居正老爸死后是否要回家守制三年这个问题上的很多个故事(当然了,这个争论的实质在于派系、权力的斗争,不仅仅是礼制本身,但能够拿这样一个问题做出那么多文章来,可见一斑)。结果呢? 万历皇帝励精图治,却被这些制度绑住了手脚,后面干脆撒手不管了;张居正大力推行改革,从政治到经济都有新政,虽然十年改革后国库充盈(大家看电视应该已经知道了嘉靖末年是什么状况),却在死后被抄家,改革派人物也都被查办,“身后一败涂地”。

《万年十五年》的副标题是"1587,无关紧要的一年"(1587, A year of no significance),讲的是1587年前后的故事,在《大明王朝-1566》后二十年,主角是万历帝、张居正,但也还有戚继光、海瑞。看电视里面现在高拱、张居正在裕王这边跟严嵩他们斗,都想不到这两人后来也斗得厉害。大明王朝-1566》现在只放了十集左右,但个人感觉更多是在讲述宫廷/党派斗争,不一定是关注整个国家的命运。也许要求电视剧来关注这个,有点太苛刻了。)

2007年1月13日星期六

每日运程

原来在定制Google起始页时看见有个Daily Horoscope,有点兴趣就选上了。后来有时打开Firefox时就看看,权作好玩。

今天的“运程”是:
Even if you try to sidestep the situation, a friend or partner may present you with an unsolvable emotional problem today.

说得还真对,因为一位朋友的口没遮拦,乱开玩笑,我就得到了一个unsolvable emotional problem。

后面还说:
It is unlikely that the issues will settle back down until you face the music. Remember that you'll be feeling better in just a few days, but now you must roll with the incoming waves of emotions. Don't withdraw, as you can learn a lot about yourself from others at this time.

face the music? 啥意思?

2007年1月8日星期一

故纸堆(2): 10年前的Slackware 3.1

这是当初在电子市场淘来淘去才找到的Linux光盘, 97年InfoMagic出的Linux CD, 一张光盘包含了Debian 1.2.8, Slackware 3.1和RedHat 4.1三个发行版。也不知道当时怎么就用上Slackware了,

那个时候X上面两大桌面是OpenLook和XView(另外还有商业的Motif), 内核也都需要自己编译才可能得到声卡支持。

Slackware的包管理相当简洁有效,按大致功能类型分为a(base), ap(application), d(development), e(emacs), f(faq), k(kernel), n(network), t(tex), tcl, x, xap, xd, xv(xview), y(games)等部分,分目录存放,每个包都是tar.gz格式,包的说明由另外一个文件提供。最开始接触RedHat时我很受不了它那种将全部几百个包放在一个目录的做法,而且没有rpm工具也没法将rpm包的内容搞出来也很让我不爽。

97年InfoMagic出的Linux CD, 包含了Debian 1.2.8, Slackware 3.1和RedHat 4.1
From Misc

当年写的Slackware 3.1安装指南,本来打算投稿的:-)
From Misc

后来升级到Slackware 3.2, 3.5,而4.0似乎是在毕业后才发行的。再后来很久都没有新的版本,我投入蓝点Linux玩了好一阵子。读书期间也试用过RedHat, SuSE和Mandrake,在毕业前还从一位师兄那里买了一份Debian 2.0,却从来没有安装过 :-(

BTW: Slackware的老版本现在还可以在网上找到, 比如3.1. 大家可以找个虚拟机装着看看十年前的Linux :-)

2007年1月7日星期日

故纸堆(1): 初识UNIX

元旦搬家时整理东西,把一些旧东西翻出来了。

当初学校搞教学改革,在我们系试验一入学校就学习C语言,并且开发系里的机房让我们自由使用。但该机房采用的DEC的Ultrix,我们那时还不明白为什么这里的编辑器和学校机房里面的Turbo C差别怎么那么大,还遇上一个有货倒不出的博士后当我们的C语言教师,跌跌撞撞、懵懵懂懂地走了过来。

这是当初机房管理员给我们准备的袖珍用户手册。


后来我们在这个系统上学习Shell编程,玩hangman,玩telnet, 玩MUD(连不能显示中文的哑终端也被热情高涨的同学们拿来练功)。

十年河东,十年河西,开始的时候,我们只能玩哑终端,小机房里面的图形工作站只能研究生才能使用。但到了大四,它们都被请走了,被换成了PC,装上了Windows,我们借着使用Matlab和SimuLink的名义在那里玩游戏。再一转眼,DEC竟然被搞PC出身的Compaq给收购了。

2007年1月6日星期六

COBOL?

从来没见识过COBOL这种语言,但这两天老看见讨论这个的,奇怪。
其实我对这个东西没有特别的兴趣。只是前几天认识了一位COBOL程序员,幸甚至哉,歌以咏志:-)

恰恰恰!

我从来没有想到有一天我会去凑这份热闹: 去学跳舞,跳的是恰恰。

不禁想起《谈谈情,跳跳舞》,这部片子"向我们展示了一个中年男人的内心世界。我觉得,主人公经过几年平稳,现实的婚姻生活,他心目中的理想生活状态已被搅得支离破碎,直到那个舞蹈老师的出现,再次点燃了他对生活的热情..."

但促使我接受这个想法的还是《麦兜故事2: 菠萝油王子》里面那几段打动我的恰恰。

1)校长:“好,相当好。下面,我教大家,面对逆境——恰恰恰!”大家一起跳了起来,麦太也回忆起“做女过阵”,欢快地唱起“车衣女万岁”。

2)创意小便班上,小男孩儿活泼俏皮地唱《教我如何去小便》,但其实仍然是悲伤的歌词: "爸爸突然对我话, 佢话唔系要系甘, 不过就 不过就 不过就会总系甘, 个的野 过去就, 经已没有个家野,经已没法不分开,你以后全部靠自己,一个人小便...”

3)《我的心里只有你没有她》凄凄的歌声中,旧屋纷纷倒塌,大家都不知道该面对怎样的未来。老师和校长在办公室内扭着。

圣诞前夕香港游

12月23日,去香港逛街买点东西。皇后广场的圣诞装饰很漂亮,也相当热闹。本来还打算去太平山看看夜景,但那天有这想法的人太多了,排队一个小时后放弃了 :-(