2007年10月17日星期三

忽悠,接着忽悠

第一次看到汉语编程就是感觉到是忽悠,因为任何一个写过程序的人都肯定会说,汉语编程有何意义?程序语言本质上不是人说的语言,是code(代码)而不是language,所以何必分英语汉语,就像有没有汉语数学这个概念?sin(x)非要写成正弦(甲)?但是后来看到了他们“做”出来的IDE,还有点佩服这帮人,以为是一帮理想主义者,为了推行这个理念,竟然不辞辛苦地开发出一个IDE出来。今天看了徽剑的这篇文章,才知道又是一个大忽悠。不过也不得不佩服他们的“智慧”,选了一个大家都不怎么熟悉的Forth语言来改,IDE也是拿开源的改出来的。不过在这片神奇的土地上,还有什么不可能的事情呢?

Update:2007/10/26

仔细重新看了徽剑的文章,发现原来汉语编程也分骗子理想主义者,我之前看到的其实是易语言的IDE,感觉做得不错,如果真的是理想主义者自己的辛苦开发出来的,还是要致以崇高敬意,毕竟也是辛苦劳动的成果。但是,我还是不赞同汉语编程。

相关链接:



2007年7月12日星期四

中国电信DNS骑劫的严重后果

反垃圾邮件的一个比较通用的做法是使用“实时黑名单”- RBL(Realtime Blackhole List),由一些比较著名的组织提供,列出了全世界主要的垃圾邮件发送地的IP地址,每次当邮件服务器收到一封邮件时,将发送地的IP地址向RBL查询,就知道是否为垃圾邮件了。

其主要原理是基于DNS查询,比如中国反垃圾邮件联盟的一个RBL是cbl.anti-spam.org.cn,邮件服务器如果想判断某个IP,如a.b.c.d是否给他收录,就拿着d.c.b.a.cbl.anti-spam.org.cn做一次域名查询,如果可以返回IP地址(一般是127.0.0.4之类的),就说明是垃圾邮件发源地,如果返回Host Not Found,就说明不是。这在正常情况下是很好的一个方法,既可以是集中式服务,又通过域名服务,把服务分布到各地的DNS服务器上,不会造成主服务器过载。当然,不要忘记,我们有中国电信。

中国电信为了推广告,在什么“极速星空”、骑劫http协议之外,还骑劫了DNS,如果你在浏览器输入了一个不存在的DNS,正常情况本来是会显示无法找到服务器,原因是正常的DNS服务器会返回Host Not Found的信息,但是,电信的不会,它会给你返回一个它的广告服务器的地址,这样就会在浏览器显示出一个充满电信广告的“你访问的页面不存在”的网站。

所以,如果邮件服务器使用的是电信的DNS服务器,“实时黑名单”功能马上就傻眼了,因为所有的IP都不会返回Host Not Found,所有的邮件发送地都是垃圾邮件了。

还好,米国的雷锋给我们提供了OpenDNS 一个非常好的DNS服务,只要把DNS服务器设成:

  • 208.67.222.222
  • 208.67.220.220
就可以摆脱电信的DNS魔爪了。当然,哪天电信把它给和谐了也不一定,或者干脆一不做二不休,直接在网络层改DNS的内容,那我们也没办法了,移民吧。

2007年5月29日星期二

DCOM迷航(二)

如何使DCOM的服务器可以回调客户端的函数。在尝试了若干人指出的若干方法之后,发现只有一种可以。就是在服务器和客户端创建两个用户名和密码相同的用户,服务器的DCOM指定用这个用户运行,客户端起码要是Power Users,就可以顺利回调。

2007年5月23日星期三

Turbo C++ Explorer 不支持ATL

在编译一个OPC的例子的时候,发现Turbo C++ Explorer不支持ATL。根据Borland的说法,其实在BDS 2006的时候已经移除了ATL的支持。不知道为什么?BCB 4.0 到 6.0是支持的。

如果在编译的时候报告找不到vcla1.h,说明你的程序用了ATL。

2007年5月21日星期一

DCOM迷航(一)

为了玩OPC,必须在机器上让DCOM跑起来。使用dcomcnfg这个工具配置DCOM时,发现一选择“COM+应用程序”这个组就会出现一个错误,查看事件查看器,发现了这样一个错误信息:

运行时环境检测到其内部状态存在不一致。这说明进程中存在潜在的不稳定性,可能是由于 COM+ 应用程序中运行自定义组件、COM+
应用程序使用的组件或其他因素引起的。Error in
d:\qxp_slp\com\com1x\src\comsvcs\txprop\dtcinfo.cpp(158), hr = 8000ffff:
TransactionManager->GetWhereaboutsSize
有关更多信息,请参阅在 http://go.microsoft.com/fwlink/events.asp
的帮助和支持中心。

一头雾水。不过微软的出错信息就是天书,否则要个那么大型的MSDN做什么?还好,有Google,搜了一下“qxp_slp”,发现了微软自己的一篇文章。大概是说,安装了一个微软的补丁MS05-051后,%windir%\registration目录的权限会出现问题,会导致COM+出现很多问题,其中一个会提示上面这个信息。按照微软的指示,更改了权限后,发现结果还是一样。“COM+应用程序”照样出错。后来醒目一点,把事件查看器里面的打叉的记录一条一条调出来看,发现了一个问题:

正在运行 MS DTC 服务的帐户无效。 如果使用 Microsoft Management Console (MMC)
中的“服务”管理单元更改了服务帐户信息,就会发生这种情况。 MS DTC 服务将继续启动。请确认使用“组件服务管理器”更新了 MS DTC 服务帐户信息。
有关更多信息,请参阅在 http://go.microsoft.com/fwlink/events.asp
的帮助和支持中心。


发现这条出错信息之后,才会不断地出现第一条出错信息,看了这是罪魁祸首。同样的,不知道它在说什么。还好,又google了一下,又在微软那里查到了解决办法。在强行为MS
DTC服务创建了NT AUTHORITY\NetworkService登录用户后,一切正常。

2007年5月18日星期五

Borland回来了

其实是CodeGear带着原Borland的IDE回来了。CodeGear是Borland没卖成IDE之后,把IDE分拆出来成立的新公司。说Borland回来是因为Borland这个名字太响了,是程序员们的Heavenly Jerusalem。在猛禽那里看到《在TCX中使用SQLite3》,才知道CodeGear重新启用了Borland的Turbo商标,推出了Turbo系列的开发工具,其中有我最喜欢的Turbo C++ Builder 2006,分Professional和Explorer两个版本,Explorer是免费的,除了不能使用第三方VCL控件外,没有什么限制,基本和C++ Builder 2006一样。我还特地看了一下它的License,发现可以用于商业软件开发。我毫不犹豫地下了一个试用,装了一大堆.Net的支持,终于看到了熟悉而陌生的界面了。把一个7年前用C++ Builder 4.0做的多线程+数据库+串口通讯的程序放进去编译,发现大概需要改动一两处代码,主要是一些定义的小改动,程序基本就可以编译通过并跑起来,简直太棒了,就象一个多年不见的感情很好的情人又回到身边一样,往事又历历在目。

当年第一个C的开发环境就是Turbo C 2.0,后来用了Turbo Pascal 5.5和6.0,再后来是Turbo C++ 3.0。Delphi 1.0 16位版让我在Windows 3.1上见识了Visual的开发。当然,之后为了工作需要,开始使用Power Builder 5.0和6.0,再后来又因为需要开发多线程应用,使用了C++ Builder 4.0,感受到了VCL的魅力,BCB虽然用了Pascal写成的VCL库,影响了它的编译速度,但也继承了Delphi的稳定性,对于Windows的线程也做了很好的封装,而且可以直接调用Windows的API,所以当时写成的程序是可以在Windows NT上连续不间断运行几个月不当机的。以至于后来还是工作需要,使用VC++ 6.0的时候,我大骂了一声:“这也敢称自己Visual”。后来由于Borland的犹豫不决,好多人离它而去了。而且开源运动蓬勃发展,自己的工作也转向了Unix领域,就开始用vi和gcc了。对于Windows下的本地开发,一直也有关注,但始终找不到一个好的方案,受开源影响,始终很想找一个免费的开发方案。Cygwin和MinGW的效率太差,而且没有好的窗体库和它们配合,用MinGW编译wxWidgets简直是恶梦。微软的免费VC++ Express 2005实在太差。所以,CodeGear的免费工具来得实在太及时了。而且从CodeGear最近的动作来看,Borland IDE的复兴开始了,一个接着一个的惊喜,从Delphi For PHP,到宣布要推出Delphi For Ruby on Rails。我决定重投Borland的怀抱,毕竟一个免费的强健的可视化开发工具太吸引人了。

相关链接:

2007年5月16日星期三

谁说自由软件运动已死

今天好多网站上都在说“微软主管声称自由软件运动已死”(英文):

前IBM员工现微软首席平台战略主管,微软Linux实验室负责人Bill Hilf狂言宣称要剥开围绕在开源软件周围的神话。“自由软件运动正走向死亡,Linux在2007年不再存在,你看就连Linus都有一个工作。”Linux
kernel是由全职雇员维护的,拥有优先认股权。大部分人在IBM,Oracle,RedHat等商业公司工作。这意味着什么?这说明Linux在
2007年不再存在(我觉得他疯了)。世界上没有什么免费软件运动。如果说Linux代表了爱,和平和和谐,这是错误的,再说一遍没有自由软件运动,这都是商业行为。是由大的商业公司如IBM和小的商业公司如Ubuntu组成的。Hilf表示微软对开源感兴趣也是出于商业原因,不是什么伟大的利他性、爱或是营销手段。

微软又在做它的FUD(Fear, Uncerntainty and Doubt)战略了。这次采用的是偷梁换柱的手法。首先,Linux不是开源的全部,作为开源操作系统,FreeBSD早就解决了源代码和Unix专利的授权问题。Linux其实应该叫GNU-Linux,除了核心之外,其余的部分,从编译器到系统库(GLIBC)大量采用GNU的东西。GNU是GNU is Not Unix的缩写,是Richard Stallman在多年前,看不惯大公司垄断操作系统而建立的项目,所有的东西几乎都是从头写起,全部开源,而且都是基于GPL,目的就是为了这些源代码不至于给某些公司封闭起来,而是大家可以共享所有人的成果,真正的人人为我,我为人人。所以GNU才是开源运动的发源地。开源运动的结果是推动了信息产业的快速向前发展。问问现在多少人在用GCC就可以了。所以,即使Linux商业化了,我们仍然有其他选择,可以用FreeBSD,可以用各种其他的开源操作系统,GNU甚至有自己的内核叫Hurd。更何况在众多Linux的商业发行版之外,还有一个完全遵循GNU方式的发行版Debian

其次,Linus Torvalds也不是开源运动的领袖。真正的领袖是Richard Stallman。他,总是“风尘仆仆,行囊相随,四处布道。他带着一台笔记本电脑,但这不是他个人的,而是属于自由软件基金(FSF)。其实,Richard Stallman 从来就没有拥有过一台自己的计算机。也从来只用自由软件(当然他从来没有用过Windows)。而且,他也没有自己的汽车、电视和房产。这位46岁的单身汉节俭地居住在一间租来的房子里。已有15年了,没有领取过一个月的正式工资。因为他的工作就是使软件获得自由。”

所以,微软应该去看看Sourceforge和Freshmeat上有多少开源项目,有多少人在使用开源项目,再来说自由软件有没有死。

从我自己的例子再来说明,自由软件运动为什么不会死。微软曾经有一段时间免费提供VC++ Express 2005下载,我庆幸了很久,微软也终于肯把编译器免费提供了。实际上发现我错了,微软花了一年时间也没解决“updating intellisense... ”的问题,最后问题解决了,却发现最终解决问题的补丁没法下载,一定要订阅MSDN才可以拿到。这就是Richard Stallman说的不“自由”,要么我选择不用微软的产品,要么就要忍受这种非常不公平的待遇。相反,我在一个项目里面用了开源的产品,结果发现它在处理中文时候有问题,我马上浏览源代码,很快就发现了问题所在,我一方面将修改发给了项目的开发团队,他们承诺会在下一个版本纠正,另外一方面,我自己修改了源代码,更正错误,我的软件马上就可以正常工作了,所以这样才是使用软件的“自由”。

我相信微软还是可以继续强大很久,我也承认微软产品的易用程度、功能、普及程度远远高于自由软件。但是自由软件运动不会死,而且会继续扮演着非常重要的角色,而且将会有更多的人参与到里面来。

2007年4月15日星期日

升级Eclipse要注意的问题

将Eclipse 3.1升级到3.2.2,用回原来的Workspace,运行SWT的应用程序时,会出现下列的错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no swt-win32-3236 in java.library.path

如果是升级到3.2,会出现:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no swt-win32-3232 in java.library.path

这两个错误原来在独立运行SWT应用程序时,支持SWT运行的dll找不到时才会出现,为什么在Eclipse里面也会出现这两个错误,原来在Eclipse运行SWT应用程序时,使用到的dll是放在Workspace下的.metadata\.plugins\org.eclipse.pde.ui\xxxx.swt中,由于用的是原来的Workspace,所以这个目录下的dll还是旧版本3.1的,但程序使用的jar的库是3.2.2的,运行时找不到正确版本的Dll就会出错。所以升级完Eclipse,记住要替换这个目录下的dll,原来的SWT应用程序才能在Eclipse下正常运行。RCP程序更麻烦,为了兼容3.1的模式,一旦判断使用的是旧版本的Workspace,会在Eclipse所在的盘的根目录下创建target/eclipse目录把3.1的所有RCP支撑库全部放在这里,运行也会出错,目前还找不到解决的办法。

所以升级Eclipse,最好重新创建新的Workspace,再把原来Workspace的程序的source拷贝过去,会少很多问题。

2007年4月3日星期二

拥抱FreeBSD

Gseeker报道了《全美前20大网站的停机时间:YouTube及Blogger最长》,其中最好的是Yahoo!,全年的停机时间为0。Yahoo!使用了什么操作系统:FreeBSD。

根据“我志愿,我成就”的丁磊同学的说法Hotmail其实也是运行在FreeBSD上,但是Hotmail是我用过的最不稳定的邮件系统。难道好东西一到了微软的手上就玩完了?确实是这样,但是错不在FreeBSD,而是微软把Hotmail从FreeBSD上迁移到了Windows 2000:

连苹果的Mac OS X也是基于FreeBSD的,所以,我们有什么理由不拥抱FreeBSD呢?

相关链接:

2007年4月2日星期一

offsetof原来是个很简单的宏

看一些人的source的时候,发现他们使用offsetof 求某个结构体的特定成员在结构体里面的偏移量。原来以为很复杂,在/usr/include/linux/hfs_sysdep.h找到它的定义:

#define offsetof(TYPE, MEMB) ((size_t) &((TYPE *)0)->MEMB)

太巧妙了!!!