2006年1月31日星期二

GUI程序的RAD和脚本化?

在我赖之混饭吃的那个项目上,这个大版本碰到一个比较棘手的问题, 那就是: 业务功能太多,虽然都不是很复杂,但总工作量却相当之多,加上项目组有2/3是新入职不到一年的同事,所以我们一直想把核心功能和业务功能分开来,后者用脚本来写。

但UI怎么办呢? 当然是要求有一些常用控件的,而且有事件响应能力,脚本中也要求能够操纵这些UI元素。基于俺个人多年的爱好,最好是能够同时编辑UI和事件处理代码(我认为没有这个功能就不能叫RAD:-)。


比较理想的是像Excel/Word那样用VBA(该项目是在Windows上用MFC开发的),但似乎这方面的例子和文档都比较少,也拿不到VBA的试用版来评估一下。

从目前看到的一些东西来看,Windows下比较接近我们的需求的是Script Builder, 它是基于Delphi的,可以直接使用ActiveX或者Delphi编写的package,支持ActiveScript(也就是说可以使用 VBScript, JScript, Python和Perl了)和DelphiScript。如果我们自己的项目是用Delphi开发的,把这个集成进去应该是件很酷的事情。(这个东西实际 是基于以前见过的Dream Scripter,只是UI表现上做得更加接近了我们“用脚本写程序”的想法而已。)

再看一些其他的GUI toolkit吧:

  • gtk有一个glade来编辑界面,然后我们可以在pygtk/python-glade或者gtk-perl/glade-perl来写响应代码,没法直接编辑界面代码(毕竟glade不是针对具体哪种语言的) P.S 刚刚在Planet Debian TW上看见yungyuc介绍一个新东东Gazpacho,说是"看起來是 Python+GTK 的 IDE",我还高兴了一阵,拉下来试试却发现只是一个改为完全用python写的一个glade而已。当然,我们可以以此为基础再来扩展。
  • wxWidgets有个wxGlade, 是模仿Glade的,不用多说。
  • Qt有Qt-Designer来编辑UI, 但这个东西也是跟glade差不多;同时它还有个Qt Script for Application,使得可以通过Qt Script(基于JavaScript)来操纵UI,不知道这两个东西是否可以接合,不过这已经很不错了。
  • SpecTcl是一个tk的界面设计器,不过它可以直接生成脚本(tcl甚至perl, python, ruby)
  • Java方面我用过JBuilder, 对于Borland的这种方式,用最近最红火的郭德纲的话说:“ 这个杭子,我做兴!”,简直" 要了亲命了"。只是因为java的烦琐,一个用JBuilder编写的略微复杂的界面,其创建UI部分的代码,基本上是不可手工维护的。至于Eclipse上UI设计器,还没玩过,不瞎说了。

说了这么些,有朋友会问,到底你们用的哪种?呵呵,记住我们的程序是用MFC写的,也没有买Qt这样的界面套件。最后我们用了用友华表的 Cell控件做模板来模拟UI,上面也可以放些按钮、下拉框什么的,虽然显得很不专业,但总算能对付过去。

想 想也知道为什么这种东西没有基于MFC的: 要在脚本中操纵UI控件(当然是说比较自然的方式,比如MainForm.Statubar1.SimpleText = "hello, world", 不是我见一些高手在tcl里面用c代码封装SendMessage来操纵的那种),这显然要求界面库有良好的RTTI,以便宿主程序能够很方便地将界面控 件对象加到脚本解释器当中去,否则脚本中怎么操纵它们。MFC有这些个嘛? ──除非完全自己手工来折腾。

补充:

1. 忘了gambas了,这个接近于Visual Basic,UI是用Qt写的。

2. mozilla的XUL应该是一个很不错的选择,而且传言很快将加入python支持,只是比较耗内存(似乎也没界面编辑器)。

2006年1月28日星期六

找出个头最大的包

dpkg-query -W --showformat='${Installed-Size} ${Package}t ${Description;50}n' | grep ^[0-9] | sort -n

rpm -qa --qf '%{NAME}t%{Size}t%{Summary}n' | sort -nk 2 | tail -20

这多可乐这个

新年来了,给大家推荐一点乐子: 《居家男人》和郭德纲的相声。


居家男人》: 一个周末的早上在某个电视频道看见两集,然后就上网狂搜。因为总共只有20集,我只好隔上好几天看一集,免得以后没有了:-)。常常一个人看得呵呵地傻笑。傅彪和伍宇娟都演得相当好。

郭德纲的相声突然间就红火了起来。普遍的观点是他真正继承了(或者说"复活了"更准确了一点)传统相声,对电视上那些相声明星发起了挑战。他认为相声在电视媒体上的发展使得“传统相声1000多段,经过"努力"就剩下200多段了”。如果时间不多,先推荐这个页面里的那个精品集

2006年1月27日星期五

巴人之谜

有些朋友问我的名字是什么意思,当然也有不少朋友直接从我的名字看出了我的家乡所在。不错,“巴蛮子”这个名字是从“巴蔓子”变化出来的。

晋人常璩在《华阳国志·巴志》中记载:“周之世际,巴国有乱,将军巴蔓子请师于楚,许以三城。楚王救巴,巴国既宁,楚使求城,巴蔓子曰: ‘藉楚之灵,克弥祸乱,诚许楚三城。将吾头往谢之,城不可得也。’乃自刎头授楚使。楚王乃以上卿之礼葬其头、巴国亦以上卿之礼葬其身。”在恩施城南门也有 巴墓。“巴墓在城南二里,昔有巴大栅王世葬于此,历年虽多,垒垒可辨。”(嘉庆《恩施县志》)

当然,也可以说是“巴之蛮人”:-)

探寻巴人之谜

2006年1月26日星期四

SmoothGNOME for Windows XP

呵呵。



User Comments
世界變了
semson | 30 一月, 2006 15:15
向來只有人在gnome上套用xp them, 現在居然有人 "亦" 向行事 ;)
and clearlooks
bamanzi | 30 四月, 2006 21:06
http://www.deviantart.com/view/17870413/ http://www.deviantart.com/deviation/18777943/

2006年1月22日星期日

Tencent不让gaim登录QQ了?

继前几天gaim登录不上MSN之后,这两天连QQ也不能登录了。不同的是,我这里切到Windows下用MSN Messenger自己也登录不上MSN,但QQ却可以。所以也不知道是不是Tencent不让登录了,因为近来似乎QQ的客户端越来越多了:

2006年1月17日星期二

Awesome firefox XUL example!

Searches amazon... you must see it to believe it!
也许以后的“客户端”都应该用XUL来做:-)



P.S: Fun with Firefox Chrome URLs


User Comments
(no subject)
ZHOUQUAN | 22 七月, 2006 14:28
赞同!!!!!!!!!!!!!!!!!

2006年1月14日星期六

麦兜3: 春田花花同学会?

小猪“麦兜”今年推出它的第三部电影。这只动画明星猪与一大群真人明星合作,上演一幕《春田花花同学会》。

该片由《金鸡》导演赵良骏 执导,陈可辛及“麦唛、麦兜”故事原作者谢立文担任监制。影片的主角仍然是那只可爱的小猪,两岸38位明星全是配角。故事讲述这38名“春天花花幼稚园” 的小朋友毕业长大后在各行各业中经历的酸甜苦辣,让人捧腹之余,故事希望引发观众去关注到底这些小朋友小时候的志愿,长大了能否实现;长大后的他们,其实 和小时候别无两样。

问题是:我实在不喜欢周xx,单是那个补血广告就让我“顶唔顺”了。

链接:

网易: 《春田花花同学会》剧照曝光
预告片

2006年1月13日星期五

闲话UI: 对话框不应该可调整大小?

今日在公司阅读其他人给出的一份界面可用性“规范”,里面看见一条“对话框不应可调整大小”,不仅哑然失笑:这是那门子的规矩。

Windows下的这些程序喜欢将控件固定放在第(x,y)象素,所以调整窗口大小的时候,移动窗口上控件的位置就是一件相当麻烦的事情了,因为要自己写代码来计算各个控件的相对位置,决定是固定大小、随着某边延长还是固定距离某边多宽。

我最受不了MFC的就是这个。


2006年1月12日星期四

smiley in shell prompt

bamanzi@limi808 ~/qref
$ :) dir
qref.sourceforge.net

bamanzi@limi808 ~/qref
$ :) false

bamanzi@limi808 ~/qref
$ :(

Add the following in your ~/.bashrc

smiley() {
if [ $? -eq 0 ]; then
echo ":) "
else
echo ":( ";
fi
}

export PS1="$PS1\$(smiley)"


User Comments
interesting
dearvoid | 14 一月, 2006 09:58
下次在 MSN 上看到你时告诉你如何输入斜线 :-)
(no subject)
jazzi | 15 一月, 2006 11:53
我实践了一下,cool,很有意思
Re: dearvoid
bamanzi | 15 一月, 2006 12:10
最近MSN老上不去啊,不知道是不是gaim需要升级了?


2006年1月10日星期二

Quiz: How do people see you?

我是这样的吗???





Slow and Steady



Your friends see you as painstaking and fussy.



They see you as very cautious, extremely careful, a slow and steady plodder.



It'd really surprise them if you ever did something impulsively or on the spur of the moment.



They expect you to examine everything carefully from every angle and then usually decide against it.

2006年1月9日星期一

xv - 老奶奶的顶针

顶针这东西,总感觉比较古老,提到它总会想起奶奶的针线盒子,但似乎这玩意儿还真有用,并且没有什么替代的方法──这也是我对简单图片处理工具xv的看法。


问题是这样的: 我只需要针对一个窗口截图,但GNOME就只提供了抓取整屏,怎么办?我们常常只需要对图片做一点旋转、锐化(sharpen),用什么工具?

我的要求是不是很简单?但奇怪的是,我一直没有找到一个合适的工具。当然我们有GIMP,但为了几个简单的功能就要我们安装一个gimp么? 当然很多操作也可以用ImageMagick来做,但你没法“所见即所得”(WYSWYG)地看到效果(比如裁剪出图片的一部分)。

最后我找到了xv,它可以对图片进行简单编辑(裁剪、旋转以及模糊等简单特效)。

让我感慨的是这个工具还是跟当年在Slackware 3.4里面看见的一样,没有什么变化。那时的X程序还都是OpenLook或者Motif风格。

BTW: 这个程序不是完全免费的,所以Debian不可能收录它。但网上总是可以找到别人做好的包(自己编译的话还得打一大堆补丁)。

BTW2: cygwin port

2006年1月5日星期四

让Dictionary Tooltip支持"爱词霸"

修改了一下Dictionary Tooltip(详见前一篇帖子),使得它支持"爱词霸"了

效果还可以,虽然有点慢(爱"美化"的人不要挑我的字体问题:-)

BTW: jar其实用的是zip打包,java的jar好像只是打包而不压缩,但mozilla/firefox用的jar用zip/unzip就可以了

实现方法:

修改一下dictionarytipOverlay.js和dictionarytipFunctions.js即可。过滤器代码如下(完整补丁在这里: firefox-dicttip-iciba.patch):

function icibaFilter(ftDoc)

{
var headingSpan = "www.iciba.com
"
;

var lists = ftDoc.getElementsByTagName("div");
if (lists.length > 0)
{
var result = "";
var found = false;

for (i = 0; i < color="#008a8c">{
if ( lists[i].className == "t15 dicttitle" )
{
result = lists[i].parentNode.cloneNode(true);
found = true;
break;
}
}

if ( !found )
{
lists = ftDoc.getElementsByTagName("ul");
if (lists.length >= 3)
{
result = lists[2].cloneNode(true);
}
}
ftDoc.body.innerHTML = headingSpan;
ftDoc.body.appendChild(result);
}
else
{
ftDoc.body.innerHTML = headingSpan;
ftDoc.body.innerHTML += spanNoResults;
}

}

2006年1月4日星期三

让firefox即指即译

现在我已经懒得装金山词霸或者stardict了,碰到认识的单词,常常是直接到google或者“爱词霸”网站去查。

不过如果是firefox上,现在有两个解决方法:

1. 装一个google toolbar (google自己提供的那个,而不是原来那个googlebar)

它实际是下载了一个大约1.5M的小词典,所以功能也比较简单,但速度不错。

2. 装Dictinary Tooltip插件。

这是今天在diggdot.us上看见的这篇The Best Firefox Extensions of 2005里面介绍的。它实际是到各种在线词典去查,然后从返回的网页上摘取需要的部分。所以功能丰富一些,但速度上有不太理想。

2006年1月2日星期一

闲话UI: 选择目录对话框

很多时候我们都会要求让用户选择一个文件夹。在很多论坛上都会有朋友问到这个问题:怎么能够显示如下一个对话框?

这用ShBrowserForFolder这个Windows API可以实现。
WINSHELLAPI LPITEMIDLIST WINAPI SHBrowseForFolder(
LPBROWSEINFO lpbi
);

在Delphi中有下面这个函数可以使用:
function SelectDirectory(const Caption: string; const Root: WideString; out Directory: string): Boolean; overload; (1)

但我更喜欢用这个(在一些简单的场合):
function SelectDirectory(var Directory: string; Options: TSelectDirOpts; HelpCtx: Longint): Boolean; overload; (2)


但很多朋友不愿意,认为后面这个太难看。但在我看来,第一个对话框在可用性上是存在很大问题的:
* 不能设置(并展开到)缺省的选择
* 不能手工输入,这使得要进入一个层次深一点的目录非常麻烦
* 不能新建目录

其 实就ShBrowserForFolder这个API而言,第一个问题是很容易解决的,不过M$提供的是一种挺麻烦的方式: 你必须得编写回调函数(BrowseCallbackProc),在BFFM_INITIALIZED消息里面发送BFFM_SETSELECTION消 息。(我觉得Delphi在提供SelectDirectory(1)这个函数时就应该包装这个功能。)

对于第二个问题, 如果你的shell32.dll版本大于或等于4.71, 就可以有个手工输入路径的编辑框了, 只要在flags中包含BIF_EDITBOX;

对 于第三个问题, 如果你的shell32.dll版本大于或等于5.0, 就可以有个"新建文件夹"按钮了, 只要在flags中包含BIF_NEWDIALOGSTYLE (而且这个版本有其他一些特性: 对话框大小可调, 目录可拖动, 目录有context menu(这可以带来其他一些功能)。

BTW:
1. lazarus中有TSelectDirectoryDialog控件,功能上等于Delphi的SelectDirectory(1)函数加上设置缺省目录功能。
2. DFS套件(Torry.Net上的信息)里面有一个dfsBrowseDirectoryDlg控件,支持shell32 5.0的NewDialogStyle,对这个功能包装得比较完整(其实上面的第三个图用得就是这个控件),要添加新版本的特性(比如6.0的BIF_NOTRANSLATETARGETS等)也很容易。

相亲记

又去相了一回亲。其实人家挺不错的,挺活泼,也挺通情达理,跟我很多习性也挺相近的,我对她的印象不算差。

唯一的问题是,我没有feel。

回来的路上,我老想起米兰-昆德拉大叔的《生命中不能承受之轻》里托马斯后来回忆他跟特瑞莎的结识:我怎么能忍受一个陌生人就这样走进我的生活了呢?

===============================================
User Comments
新年快乐
beauty | 02 一月, 2006 01:53
不错就主动争取一下吧!这年头,总要给自己一个机会。:) 新的一年,希望你有一个新的开始,新的希望,快乐一整年。

生命不能承受之轻
beauty | 02 一月, 2006 02:12
巧得很,这阵子也在和朋友谈到这个话题。 一匹骆驼,高大伟岸的骆驼;一堆稻草,堆积如山的稻草;骆驼驮着稻草在沙漠中走着,一根稻草落下了,骆驼丝毫没有觉察,继续走着,又一根落下了,骆驼依然没有觉察,继续走。当最后一根稻草从骆驼身上落下时,它停住了脚步,发现自己孤独的站在沙漠中。自己要到哪里去呢? 我们都无法承受没有重量的生命,哪怕仅仅是背负着一棵稻草,也足以让我们骄傲而义无反顾的前行。

关于feel和陌生
bamanzi | 10 一月, 2006 09:14
好几个看过这篇的朋友都笑我:都一把年纪了还说什么feel啊,而且怎么都不可能第一次见面就不陌生啊,难道说还要搞乜一见钟情?

我后来想明白了...
bamanzi | 14 一月, 2006 00:56
主要原因还是那个MM不够漂亮。这人只要一飘亮了,别人自然就觉得亲近了。呵呵呵呵

还在想这事儿啊?呵呵……
beauty | 16 一月, 2006 23:55
其实漂不漂亮真的不重要,还是我说的,要找一个人精神上与你同行(这好像比找一个漂亮的更难)。 ps:Cabbage远渡英伦了,啥时候出来吃个饭吧,不过估计得年后了。叫上小郑,不知他有没有时间。

想了半个月才明白,原来自己是个俗人,^_^!
cabbage | 19 一月, 2006 06:13
吃饭,好啊,呵呵,天天在这里吃什么burger,又高热量又不好吃,真是想念国内的美味!

To Cabbage
beauty | 20 一月, 2006 00:43
早让你带个锅去,你不听。:)

好嘛
bamanzi | 21 一月, 2006 21:33
把这里当聊天室了
父母来了,不大在外面晃荡了。

嘿嘿
beauty | 21 一月, 2006 23:18
就知道你得这么说。 你不晃荡了,那怎么认识女孩子啊?他们二老不是急么?呵呵~

(no subject)
葡萄没救 | 28 二月, 2006 22:04
那么如果那个女孩主动约你,你会去么?会不会觉得她不够矜持?

(no subject)
beauty | 15 三月, 2006 00:36
我找遍了书和电影也没看到你文中米兰大叔的那一句,忍不住想问一下,您看的是哪一版啊? 不过,这句话倒成了我refuse别人的利器,谢谢啊,呵呵~(我太阴险了)

2006年1月1日星期日

又一年

去年的新年夜,我一个人在看《麦兜故事II: 菠萝油王子》。当时的感觉就一个字可以形容:孤独,非常孤独。

这次,新年钟声敲响的时候,我在跟Sophia在网上闲聊。

至少这一刻,我是快乐的。

也祝福她快乐。


User Comments

干嘛评论也要标题啊?
beauty | 02 一月, 2006 01:55
当时的感觉就一个字可以形容:孤独,非常孤独。——呵呵,您识数么?