[技术贴]有些技术是有钱人玩的

周五周六两天都花在VNC上了。

VNC 4.0 forwindows有一个小BUG,就是如果在Client端(Web)sendCtrl-Alt-Del之后,Ctrl-Alt键就会处理按下的状态,所以无法按ESC取消Winlogon桌面,只能用鼠标去点“取消”。但是问题在于返回默认桌面后,Ctrl-Alt仍然未释放,所以还是有问题。

它的WebClient端是一个Applet,所以我想改一改,让它在之后重发一次Ctrl-Alt的Release事件。因为要调试,所以我在本本(台式机做被控端)上装了Eclipse 3.0,结果简直是恶梦。

因为偶的本本是五年前产的一台PIII600/128M的配置,在这样的机器搞JAVA开发是什么下场大家应该可以想像吧。简直比我当年在P-90/16M的机器上用BCB3开发还要惨N倍。-_-|||

所以在过去至少六七年里,我无数次曾经试图去搞JAVA,但又无数次打消了这个念头。.net也差不多。还是原生开发比较适合偶们穷人。

不过现在看来,Python也是个不错的选择,可惜它目前还没有钱途。

BTW:那个VNC的问题还是没办法解决,我现在只能在它返回默认桌面后重发Ctrl-Alt的释放事件来解决默认桌面的问题,如果在Winlogon桌面释放的话,会导致返回默认桌面后出现奇怪的错误。

再BTW:终于把Pivot改造得越来越像.text了。

又见道德高标

这两天看了两眼《艺术人生》的特别节目,嘉宾是个叫丛飞的人,说实话我之前对这个人感觉挺陌生的。不过他的事迹可不是一般人可以做到的:

他在十一年里累计捐款捐物300多万元,资助178名贫困孩子上学。但是他的前妻却无法忍受这样的生活,与他离婚,而且他自己也在不久后累倒,身患胃癌,负债十几万。

相关报道……

关于这种过度宣传道德高标的问题,我一向是表示反对的,在我以前的BLOG里也多次提到,这种宣传不但不能提高,反而会降低社会道德标准。某人在一篇“头文字谠”里也对这种“模范”提出了质疑——事实上,网上舆论对这种“模范”的质疑是由来已久的。

这种“模范”其实是扛下了本不应该由他们来扛的责任,所以本该扛这些责任的人都很喜欢这样的“模范”,巴不得这样的人多些才好。如一部国产电影《核电铁军》里的台词所说:计划经济就是把人变成工具。而这样的“模范”不但不是这个社会的光荣,反而是这个社会的耻辱。

如某人的质问所说:为什么要生这么多孩子?已经成年的孩子为什么不能依靠自己的劳动赚取学费?自己和自己的家人都关爱不过来,还怎么去关爱别人?……

以丛飞的事情来说:

一些山区受资助的学生家长打电话询问学费的事情,这事很让丛飞上火。有家长在电话中说:“你不是说好要将我的孩子供到大学毕业吗?他现在还在读初中,你就不肯出钱了?这不是坑人吗?”

另外,在《艺术人生》中还说到一些事,比如他资助过的一些孩子已经大学毕业,有了不错的工作和收入,但是却有一些人根本没有想到要为此作出回报,甚至是在丛飞病倒之后……

这样的事有何光荣可言?而作为对比,几年前负责“希望工程”的青基会的经济丑闻不知道大家还记不记得?

六十年代全民学雷锋,那是一件很好的事。但是在现在这样一个信仰缺失的时代里竖立道德高标,就像是在妓院里立贞节牌坊一样的可笑。

最后作一个不厚道的假设:

如果这次不是因为丛飞病倒了,又有谁会在乎他所做的事呢?不过是继续有人风言风语说他装腔作势想混深圳户口之类的……

除了娱乐,还是娱乐

昨天分别发布:

于鸟眼观圈

及donews

=======全文重贴======

火炬说“生活越来越美好”,我才知道还有这回事,一查之下才知道已经是旧闻了,至少也有一个月了。

某媒体工作者旺财对此有切身体会。援引某国外媒体6月8日的报道对此的说法是:

新闻媒体的异地批评报导,在中国被称为异地监督。香港明报报导说,中共中央办公厅最近的文件明确表示禁止,并且要求新闻机构要严守党的纪律,即使是中央级的新闻媒体,在对地方进行批评的时候,有关文章也必须先通报被批评对象的上级党委。在反腐败报导中,要“充分肯定干部队伍的主流,和肯定党的领导和社会主义制度”。

香港明报的报导说,中办的文件要求中国的新闻媒体坚持正确的新闻导向,而且明确规定说,不但时政新闻要坚持导向,社会生活新闻也要坚持导向;不但国内新闻报导需要导向,国际新闻报导也必须坚持导向。文件强调,全方位把握正确的舆论导向,是新闻媒体的政治责任。

唔,终于明白为什么短短一个六月,我们一下子有了这么多新“呕像”——芙蓉姐姐、程菊花、流氓燕、红衣教主以及全体‘超级女生’预备队朱大可批评娱乐群众keepwalking就批评大众媒体。现在看来媒体也有它们的难言之隐啊——这也不让说,那也不让说,只好娱乐群众了。可是前几天好像又有消息说,连FRJJ也不让媒体说了。什么都不能说的媒体,还叫媒体么?

除了异地监督被叫停以外,还有一些别的规定如:上报全部评论人员的名单;限制灾难事件报道;加强互联网的监管等。比如《中青报》刊发龙应台对连宋大陆行的观感被处理便是这一系列规定的显现。至于互联网的监管,大家都很清楚。

中国所有的监管机构如果都能做到像对互联网监管这样严厉的话,大概互联网也就不需要监管了

有人写了一篇论文《论推进舆论监督的三类经验》来论证在中国如何推进舆论监督,现在这一系列规定无异于给他们当头一棒。舆论监督?头头们都是说说而已的,书生们还当真了。

前两天新疆矿难,mikeshi以为我会8一篇。但我觉得还是跟党中央保持一致的比较好,所以没有8。

不过七月的媒体还算是幸运的,有一个伦敦恐怖事件供它们报道,这个话题对它们来说很安全,很安全。

只是这样的好运气并不总是有的,所以我们还是需要娱乐,而且是无极限的娱乐,除了娱乐,还是娱乐。

BTW:最近几天flickr的速度非常慢,怀疑是遭遇到某种filter了。

老大,mblogger什么时候能升级好啊

貌似mblogger已经升级了半个多月快一个月了吧,但是还是不稳定啊。

昨天晚上上来看看,结果打开一个页面要等好几分钟,好不容易打开了,写了一堆回复,结果一提交又要等半天,更可气的是等了半天的结果是看到那个恶心8拉黄8拉J的.net出错页面。

简直要抓狂。

偶已经关停或废弃N个BLOG,包括:blogcn, blogchina, blogdriver, blogsome, uublog, yahoo360, msn space…

现在还在用的就剩下mblogger, csdn和donews了。

对于blogger来说,BSP的稳定性和速度是最重要的两个因素,其它都是可以接受的。

快点搞好吧,老大,拜托了。

一次关于用MVC改进GUI开发的讨论

昨天临下班前跟猎手讨论了一个技术问题。今天令狐看了,指出这个解决方法治标不治本,属于头痛医头脚痛医脚的解决方案:

但要是你直接取parent的ActiveControl,这个窗体不嵌入其他窗体的时候不是又错了?换句话说,这个窗体跟它的使用环境发生了耦合。有没有比较好的办法来解决这个问题?

我说了三个方法,前两个都不算是通用的办法,就不说了。第三个就是我在《杂而不精》一文里我提到过的MVC模式。在这一点上,我和令狐达成一致。针对猎手这个问题使用MVC,可以把这部分功能从View剥离到Control上去处理。

关于MVC,令狐有一段说明:

MVC的概念我的Blog里有提到。简单的说,就是把界面、界面需要完成的功能、这些功能所要操作到的数据对象全部分离。这样一来,比如你界面上有一个按钮和一个菜单完成同样的功能,就只要调用功能类中同样的方法即可,跟这个按钮、菜单所在的界面就无关了。

VCL中有一个Action的概念,但光有这个,支持MVC开发是远远不够的。这也是我在《杂而不精》中说过,我一直在思考的问题,早就想写一个文章来说的,不过感觉想法还不够成熟。今天既然拿来讨论了,就先简单空谈一下。

RAD让人养成很多坏习惯。比如,即使有Action这样的,做出MVC也会不伦不类,V和C的耦合度会很高的,这很不好。我设想的是RAD只做V的部分,将C部分完全剥离,这样GUI应用就会成为可测试的,用单元测试覆盖C和M。

令狐指出其中可能存在的一个问题:

VCL的问题我以前也想过,我觉得是因为VCL本身对MVC的支持就不够好。因为VCL中,已经将C的东西融合到控件本身去了,这样你再想剥离就很困难。我以前在CSDN上帮人写过一个MVC的演示,就碰到过这个问题。
举个例子,比如TMemo的Lines,存储了Memo中的内容,而这个Lines是跟TMemo本身的操作又是相关的。我那时候是自己用一个List去记录数据,但是这样一来,就会造成Lines和我自己那份数据的重复,而且有不同步的潜在可能。后来我的解决方法是完全放弃Lines,每次我自己的list更新之后,将Lines清空重新设置。不过这样对显示效果又有影响。

但我认为还是可以剥离的,这跟VCL的关系不太大。我在最近写的一个BLOG备份程序的GUI部分里就尝试用MVC的思想,感觉还可以。至于令狐上面的说的问题,也是可以解决的。

Memo的Lines属性是一个TStrings *。在Control里维护一个TString *成员指向Memo的Lines即可,由Control直接去维护Memo的Lines,这样就不存在一式两份的问题。因为Memo的Lines属性是不可更改的,所以只能通过Control去操作。不过程序中的其它代码不能直接对Memo的Lines进行操作,而是要通过Control进行。

把我的思路总结一下就是这样:

我把V和C之间的关系简化为三种:Action, State, Contraint
Action代表对界面的操作,调用Control的相应函数处理
State代表界面状态的改变,由Control去执行
Constraint代表约束,即Action和State的关联,比如在某种状态下不能出现某个Action
这个Constriant又有两种,强约束和弱约束
弱约束可以在View中实现
强约束可能在Control中实现,也可能在Model中实现

有必要补充一下:其中关于Constraint的想法,最早来自于去年与Chechy讨论他的一个基于XML的框架时受到的启发。

实际上弱约束的情况很少,它通常不能算作业务逻辑的一部分,为了简单起见才把它放在VIEW这边实现。如令狐所说,弱约束差不多就是指控件Disable或者Invisible这种。不过有些Disable/Invisible可能还是要放到Control里的。

令狐作了一下归纳:

用户对界面元素进行一个操作,发出一个request,实际触发一个控件事件,这个事件将会调用Control,Control继续调用业务模块,业务模块完成实际业务逻辑并返回,根据返回值,Control做两种可能的操作:转向另一个页面,或改变当前页面的某些状态(或两者兼具);而页面上的控件由View类负责,View类接受到状态改变后,对控件实际的表现形式进行对应修改。

整个流程是:
View’sEvent->Process Control->Business Control->Model->Modelreturn->Business Control return->Process Cotrol’s state change ORopen new view->View class(change form’s control)

基本上就是这样,这样做还有一个很大的好外就是,可以比较方便地更换VIEW层。比如从PC移到PDA,或移到WEB。

令狐补充了一点:

这样的话,View层由两部分组成:Form和View class,Form负责可视化、用户事件接收,Viewclass负责处理状态的改变。然后,你所谓的强约束,可以几乎肯定是做在Process Control或BusinessControl层;而弱约束,几乎肯定是做在View Class

如果考虑到View层的更换,是必须加入View Class的,这是我开始没有考虑到的,我原来设想中这部分功能是在control里的。所以还是有很多不够成熟的地方,需要再讨论讨论。最主要的是需要经过实践的考验才行。

令狐又提了两个重要的问题:

1、Windows的控件有的时候是界面相应先于逻辑处理,比如Checkbox,你一点它就直接改变状态了,但是后端的逻辑处理可能又会重复修改它的状态。
2、还有个更严重的问题,对某些控件状态或内容的修改,会触发一些事件,这样会造成一些事件的递归调用或Control的难以控制
在传统的Web程序中,这个问题比较不明显,因为你在View上做的操作都不会产生实际的影响,直到Submit才会去服务器进行MVC的流程,但是客户端就没这么简单了,每个操作都可能会这样跑一圈

事实上,这两个问题在传统RAD开发中都存在,特别是第二个问题尤其严重,并且都很难解决。我起初考虑在GUI应用开发中采用MVC模式,很重要的一个原因就是为了解决如上面的第二个问题。

对于第一个问题是这样:当check时就会产生Action,它调用到control这边时就可以根据情况处理,如果知道这是一个需要Model做长时间处理的,就可以先改变界面的状态,比如把光标设置成hourglass,在Model处理完成之后再更新checkbox状态,并恢复光标。当然,最终的状态要以Model的处理结果而定,由control去更新view的state。

而第二个问题的解决之道就在于所有的Event都会转为Control的Action请求,当第一个请求到达Control时,就会启动相关的Constraint。之后的请求就会根据Constraint发生不同的作用——比如有些就会被屏蔽掉。

令狐又提出第三个技术问题:还有一个问题就是环境上下文如何传递

这个问题在GUI应用中还是比较好解决,但在WEB应用中就麻烦一些。在GUI应用中,上下文可以直接或间接(通过指针指向View中的控件属性,如前面说的那个Lines)记录在Control中。但因为Web应用是无状态的,所以需要额外的持久化机制。

令狐说:持久化机制在服务器端利用数据库、在客户端利用Cookie,都有办法可
以做到

但实现方法肯定是与GUI应用不同的,要麻烦一些。

我那个试点程序对上面说的这些没有全部实现,只尝试了一下V和C的分离,所以说我还要再考虑考虑。

我同意令狐说的:看看实现在讨论比较实际,否则是空对空的。试着用上面的理论作个实现出来,如果能提升到框架是最好不过了。就算只是个思想也是好的,不过要实现出来有些问题才好讨论

提升到框架还是有难度的,我的目标是整理出一套切实可行的做法,以改进GUI应用开发。

尝试用弗洛伊德理论解梦

其实偶没有看过《梦的解析》,不过还是不懂装懂地尝试了一把:

某MM在QQ群里说:我经常梦见偶在水里欢快的游来游去

偶在后面很8挂地解了一把:

先是用MSN机器人上的周公解梦,有人说其中有自相矛盾之处。那偶只好硬着头皮来给她做一下精神分析:

女生梦到水,通常是性高的潮的隐喻。水,意味着“湿了”。而“在水里欢快的游来游去”则意味着一种满足的情绪。结论就是:

■■■■■■■■■■■

(以上内容需要刮开才能看到,或发送短信至:898989-即“8挂8挂8挂”,每月10元)^O^

装修还是建筑

刚看了熊的一篇《做软件堪比搞装修》,感觉这个比喻的确很不错,现在中国的软件业与装修业的确是很大的相似之处,特别是在混乱程度上极为相似。

但是拿软件与建筑相比也绝不是没有理由的。且不说GoF的设计模式源自于建筑师C.Alexander的理论,在整个软件开发的过程,也是与建筑设计的过程极为相似——注意,是建筑设计,而不是建筑过程。刚好前几天我曾经工作过的一家公司就是做建筑设计行业软件的,所以也接触过一些建筑设计院,大致知道一些。

建筑设计阶段基本上相当于软件的开发过程,而建筑的建设阶段则相当于软件的应用过程。而“图纸制订后基本不做更改”的猜测是不正确的,绝大多数建筑设计图纸都会在建设阶段作少量的修改的。

而且建筑设计大体上分为两个部分:建筑设计和结构设计。在建筑设计阶段是需要很多的创造性的。不可否认“建筑业是一个已经非常成熟的工业,有非常多的规范和经验”,但这些,更多的是存在于结构设计部分,而在建筑设计部分,同样存在着巨大的变数。

——顺便说一句:前一段国内很多的大项目,如大剧院、奥运场馆等的设计搞招标,那些国外设计机构能胜出,很大程度上是由于他们的建筑设计才能。事实上他们把这些项目拿下后,拿了大笔设计费,然后基本上都是用其中很少的一部分钱把繁琐的结构设计任务外包给国内的设计院去做的。

建筑业的成熟更多地表现在流程上:比如建筑和结构的分工,多次校审,会签……这些才是软件业最需要向建筑业学习的部分。

熊最后说道:

当然,装修和软件一样,同样也在规范中,但什么时候能规范到和建筑行业一样(暂时先放过建筑行业&IT硬件业的不规范行为),那可真是个不定数了.

这虽然有点悲观,不过的确是很困难的事。毕竟建筑业有了数千年的积累,而软件业的历史不过数十年。但是也要看到,软件业的发展是很快的,建筑业的变化需要十年甚至百年的时间才能看出来,而软件业的发展只能用日新月异来形容。

希望还是很大的。