2008年3月18日星期二

Firefox 3上Google Reader无法显示内容的问题: Firebug惹的祸

现象: Firefox 3上访问Google Reader时,只显示顶部的一些链接,那个黄色的"loading"就一直不消失,内容也就出不来
原因: 禁用Firebugs扩展即可
定位方法:
  1. 开始看见"loading"一直在,以为跟Google Mail一样,是网速问题导致内容无法显示出来;
  2. 后来逐渐发现Firefox 2上没有问题;
  3. 在Google上搜索"Firefox 3 Google Reader"没有什么有效结果,看来不是使用Firefox 3的人都有这问题
  4. 试验Firefox的"安全模式",正常了,看来是扩展的问题
  5. 对扩展使用折半定位: 先禁用一半扩展,重启Fx,看是否有问题,有问题则将被禁用的扩展缩小一半再试,没问题就将未被禁用的扩展减少一般再试。这样我的20多个扩展,只要5次就可以定位出来了:是Firebug!
  6. 禁用Firebug扩展, 好了

另外,家里的机器上用Firefox 3访问Google Reader就崩溃,不知道为啥,从beta 2到beta 4一直有这个问题(每出一个beta版本我都会试一下)

采用TiddlyWiki搭建blog

前几日一直在琢磨把俺的Blog迁移到这个玩意儿上来,好处在于:
  • 所有文章都在一个网页内, 几百篇文章加起来也没有多大,而且要分多页也很简单
  • 这一个网页可以既是最终发布的地方,也是编撰系统
  • 随便找个能上传网页的地方就可以搭建blog了,万一都没有,在http://www.tiddlyspot.com上申请一个账户也行
  • 丰富的插件,自己想怎么玩就怎么玩
我试验了一下,基本上满意,诸位可以看看初步效果http://bamanzi.tiddlyspot.com/。只是目前没有时间将一篇篇贴过来觉得麻烦,懒得动了。

如果将TiddlyWiki改造成更适合blog的系统,我的一些心得如下:

  • RecentTiddlersPlugin或者WeblogPlugin自动在页面打开时显示最近的文章
  • 采用TagCloudPlugin插件,在MainMenu中添加一个"标签云"
  • TW原本的风格是双击帖子就进入编辑模式,如果你觉得这样不适合于blog系统,可以在选项中将页面设置为网上只读模式,或者采用ReplaceDoubleClick将双击功能改造一下
  • CommentScript能增加留言功能

另外下面这几个插件虽跟blog关系不大,也是应该有的:

  • 这里取得最新的中文翻译,将其作为插件加入,保存后再打开就会变成中文界面了
  • 添加GotoPlugin或者SearchOptionsPlugin,替代原来的搜索功能(原来的搜索会自动打开匹配结果,即使你在只输入了两个字符之后就停顿了一下...)
  • 添加FullScreenPlugin或者ToggleLeftSideBar这类插件(后者其实不是插件,而是借助InlineJavascriptPlugin实现功能的脚本),使得用户可以将文章最大化;添加CollapseTiddlerPlugin或者[FoldHeadingPlugin|http://www.tiddlytools.com/#FoldHeadingsPlugin]] 使得用户可以将文章最小化(可以将帖子折叠起来,只显示标题)

前面说的是对最终页面呈现有用的插件,但还需要东西来帮助我们撰写文章:

  • WikiBarPlugin可以在编辑文章时显示一个工具条(不过IE对CSS支持太差,工具条的下拉菜单显示不出来),免得你记不住那么多wiki语法(不同的wiki语法还不一样:-()——当然,宏还是应该记熟悉的
  • tiddlytools提供的QuickEditPackage也可以提供WikiBar那样的工具条,但我还没搞明白怎么挪用过来:-(
  • TiddlerTweakerPlugin会允许你自行修改每个tiddler的作者、创建时间、修改时间,如果你想迁移你的blog系统肯定用得上

但这几个插件体积都比较大,直接加到你的TW中会导致最后的HTML比较大,加载太慢,而放在网页上对阅读blog的朋友又没有什么作用,这就可以采用将这些插件用外部文件的方式来加载了,LoadExtPlugin就是干这个的(该网站还提供了一个不小的主题包)。

2008年3月6日星期四

TiddlyWiki: 单网页的Wiki, GTD或者blog系统

这几日迷上了TiddlyWiki这个东西, 仅仅一个网页, 却将JavaScript,CSS和DOM的功能发挥到了极致。当年看见Gmail的时候惊叹网页上的东西也可以做得这样易用,而到了TiddlyWiki这里发现Gmail也不算啥了。

简单地说,从名字上可以看出,它具有一些wiki的功能,但它自带条目(它管这叫做tiddler)的管理,点击名称时时显示内容到中间区域——其实这就是一个简单的笔记软件了,并且不用安装任何其他的软件,我以前都用notecase来记录一些琐碎的东西,但现在用不着了。

如果只是这样,还不算什么,但它还有宏、主题、导入、导出等等功能。更强的是跟Firefox, Eclipse这样的东西类似,有一个很好的扩展机制,结果是有太多的插件使得我们可以把它做成一个GTD系统或者blog系统,Blog before you Think这篇文章就介绍了各种变体。

唯一的限制在于这些编辑只能在本地文件上做,网页自身没有机制将内容提交到服务器上去。不过也有网站提供TiddlyWiki服务(http://www.tiddlyspot.com),使得可以将服务保存到服务器,甚至下载到本地,修改完成后再点击网页上一个链接就上传了。

前几日一直在琢磨把俺的Blog迁移到这个玩意儿上来,反正几百篇文章加起来也没有多大。只是一篇篇贴过来觉得麻烦,懒了。诸位可以看看初步效果http://bamanzi.tiddlyspot.com/

2008年2月25日星期一

小看了Lua

虽然我一直对于脚本语言比较偏爱,但也一直没把Lua看上眼,认为它功能太弱了,只能“螺蛳壳里做道场”;而喜欢这个东西的似乎也都是搞C++的那些喜欢研究语言技巧的人。

但今天无意翻了一些wxLua,对这个东西有了兴趣,然后又顺便看了一些Lua本身,发现这个东西以前还真没意识到它的价值。

先拿wxLua来说,wxWidgets有不少脚本语言的binding,从wxPython, wxRuby到wxJS, 其实差别都不是特别大,但wxLua有些不同,至少它在使用模式上很适合于这样一种情况:快速开发一些小的程序(其它方面我还没来得及考虑,暂且不提)。

一 方面,适合这种情况的东西很少: 虽然可以用wxPython快速开发,但对于做一个程序来说,发布起来比较麻烦(py2exe还是有些够折腾的);Visual Basic和Delphi这类工具,可以快速开发,发布程序也方便(抛开VB程序采用的ActiveX库不谈),但它们是商业软件,同时又是庞然大物。所 以我看见一些同事用Excel的VBA来开发一些简单程序,也有比较geek的人学习AutoIt

另 一方面,wxLua自己也做得很适合这个。从规模上而言,wxJS比wxLua大不了多少,但wxLua将脚本解释器、wxWidgets对象全都做到了 一个可执行程序中,不需要任何动态库;它还提供了一个wxLuaFreeze工具,可以将Lua脚本跟这个解释器绑定到一个文件,用法相当简单,并且还可 以采用UPX这类工具对最终程序进行“透明”压缩。

这样来看,lua算是一个非常好的胶水语言(glue language), 在表现上可以嵌入在程序中完全隐形,同时带给程序的累赘也少(至少我们的产品目前采用Active Scripting就必须得将可脚本化的对象包装成COM对象,这个工作量可大了去了)。

不过,“五行拳”(Programming in Lua中文翻译版中引用了一段金庸《碧血剑》里的文字,意在比喻“极寻常的拳术",只要练习得好了,”每一招均是含劲不吐,意在拳先,举手抬足之间隐含极浑厚的内力”)也有一点点不爽,比如我现在想在wxLua的脚本代码中操纵COM对象,就得仔细琢磨怎么将LuaCOM的代码合进来才行,回头要另外一个功能又要合代码,这种情况可能还不如py2exe方便了(不过还没琢磨过Lua的代码,不知道何如这些特性简单不)——但“需要什么才加什么”这种方式也挺不错的。

2008年2月9日星期六

wxWidgets和MFC混合编程

很多文章都讲到了将MFC程序迁移到wxWidgets上(首先要读的也许是IBM developerWorks上这篇 将MFC应用程序移植到Linux),但对于一个比较大的程序,要一下子完成移植也显得有些艰巨。所以我在琢磨有没有可能在一个程序中同时使用这两种技术(同时我看中了wxWidgets上使用wxPython时给应用程序带来的可扩展性,有兴趣的可以查看wxPython中的这个embed示例)。

wxWidgets的代码库中倒是有一个wx和MFC混合的例子(发布出来的2.6的代码包里面好像没有,2.8才有),它演示了如何在一个程序中分别有wx和MFC的窗口(分属于wxFrame和CFrameWnd类)。

但它没有解答的问题是:怎样将一个wx的控件放到MFC上面去,或者反过来

在这个例子中,如果你想将wx的窗口作为应用程序开始时显示的窗口,就需要这个:
   m_pMainWnd = new CDummyWindow((HWND) wxTheApp->GetTopWindow()->GetHWND());
如果你了解MFC对窗口的封装,就知道它基本没有自己的东西,CWnd这些类基本上没有自己的数据成员,基本上都是调用Windows API(只是把那些API中的HWND参数给省略了。所以任何一个Windows桌面上的窗口,要体现为一个CWnd类对象是很容易的,只需要调用CWnd::FromHwnd()或者CWnd::Attach()就可以了,示例中的CDummyWindow就是这样做的。基于这样的思路,我们很容易把其它的wx控件通过CDummyWindow放到MFC控件中去。
wxTreeCtrl * wxtree = new wxTreeCtrl(.....)
CDummyWindow *dummy = new CDummyWindow((HWND)wxtree->GetHWND());
dummy->SetParent(this);

我们需要其实不要CDummyWindow也没有问题,只要这样:
wxTreeCtrl * wxtree = new wxTreeCtrl(....)
::SetParent(HWND)wxtree->GetHWND(), m_hWnd);
但这里有另外一个问题: 创建一个wxWindow对象时是必须给出一个parent的,而这个parent又必
必须是wxWindow类型(除非为NULL)。

反过来要将MFC的东西放到wx上面就可以那么好运了,虽然也可以用上面这一招将MFC的控件显示出来,
但这些控件低于wx来说是透明的,你没法利用到wxSplitterWindow的分割功能,没法利用上各种layout manager/sizer。

wxWidgets For MFC Programmers(from wxWidgets Wiki)中讲述了如何将一个CWnd转换为wxWindow对象:

wxWindow * win = new wxWindow();
win->SetHWND((WXHWND)hWnd);
win->AdoptAttributesFromHWND();
win->Reparent(wxGetApp().GetTopWindow());

2008年2月8日星期五

终于将blog迁移完成了

从去年初开始将blog迁移到Blogger上,直到今天,才算终于完成了。

我原来的blog在Linux伊甸园上(巴蛮子的新破茅屋),开始有迁移的想法是在去年初,主要的原因是Linux伊甸园提供的Blog服务经常当机,并且每次出了故障之后,总会有一些文章丢失(这几个月陆续按以前的一些本地“备份”来重新发帖,才发现差不多丢了1/3)。

但一直也不直到迁移到哪里去好,试过blogbus, CSDN, chinaunix,最后基本上觉得Blogger功能上比较适合我这Blog的风格,而且Blogger提供的版面编辑功能还是挺好使的。

但中间又犹豫、反复,一方面因为国内常常无法访问blogspot.com,另一方面otto老大又热情地邀请我回去,我也在试用linuxeden

但最终Blogger的"自定义发布位置"这一功能让我觉得还是采用Blogger了:我可以在其它地方申请一个网站,然后采用ftp/sftp发布方式,将所有文章发布到这里(目前的镜像是 http://bamanzi.inlsd.org/blog ),这样一方面可以解决blogspot.com无法访问的问题,另一方面我可以通过ftp将所有文章备份下来。

不过搬迁过来,文章不会在其它地方出现,访问的人也少了。反正这一年我写得也少了,凑合着过吧。