Erning.write()

Reloading

十八年了?!

10 HOME
20 PRINT "HELLO, WORLD!"

突然发现从我第一次写上述程序到现在,已经有十八个年头了。哇!不得不感慨时间过得快啊。

短信接口平台

最近忙着弄短信接口的平台程序,现在已经基本做完,跑起来看着还挺顺的。我简单介绍一下。

中国电信和中国移动的短信协议要求客户端主动连接到网关收取信息,并且接受的连接只能有一个。因此客户端的接收程序必须尽快处理收到的信息,好尽快接收下一个信息。而客户端的程序又有很多事情必须处理,比如写日志并分发给相关的应用。

开始我用多线程的方式,即接收程序收到从网关发来的信息后,启动一个新线程处理收到的信息,本身接着收下一个信息。新启动的线程负责写日志,然后分发给相关的应用。这种方式运行起来效果不错。

接着我又遇到一个问题,写日志和分发给应用的程序是两个不相关的东西,放在一起有点别扭。写日志的程序对实时性要求不高,只要保证记录了就可以;而分发程序需要尽量快,不应该等日志完了再执行。再起一个线程写日志,一个线程分发?这样线程多了反而更慢,不太好。

对与从网关收到的信息我们可能有许多处理程序,比如一个是写日志,一个是分发给应用。就日志来说,就有写数据库、写文本文件、控制台输出等。所以我采用了消息队列的方式,这样接收程序收到从网关来的信息后送出一个消息到消息队列中,需要处理的程序自己来取就是了。这个消息队列用的是 Topic/Subscribe模式,就是接收程序发出的同一个消息可能被多个处理程序接受。这样对信息的不同处理,我就可以写不同的消息处理程序。

接收完了,看看向网关发送信息的情况。短信网关一般也只允许一个连接进行发送,而且中国电信和中国移动使用的短信网关协议都是异步的,这样用消息队列的发送也很理想。

整体框架入下面这幅图,

Transport Service 是和网关通讯的程序。它负责保持连接、发送信息给网关、接收网关来的信息,并把信息发送到消息队列

Deliver Controller 是分发信息给相关应用的控制器。它从消息队列中收取Deliver信息,然后根据信息的内容或者用户的状态,用不同的Application Deliver把信息分发给应用

Application Deliver 负责具体分发信息给应用。不同的应用可能要求不同的信息接受方式,比如多数是用HTTP方式,分发程序用POST方法把信息提交给应用,这中方式用的是 AppDeliverHttpPost;有的是用SOAP,用的就是AppDeliverSoap了。总之,要什么新方法,写一个Application Deliver就可以了。

Logger 就是写日志的程序。它从消息队列中收取所以消息,然后写日志。如果要有不同的日志方法可以写不同的Logger,比如我有一个DBLogger,是向数据库里写日志的实现。

Sender 是通过Transport Service发送Submit信息给网关的程序。短信协议是异步的,但多数应该要求同步,就是要知道发送是否成功。因此Sender多提供了一个实现同步的方法。Sender发送后,从消息队列中等待发送的结果,然后返回结果。

Web Service 是接受应用发送信息的接口。为什么要这个呢?和接收一样,多数应用发送信息的时候是用HTTP的POST方法。而且这样应该不应该知道短信协议的数据包格式,这样同一个应该可以给不同的短信协议使用,比如中国电信的SMGP和中国移动的CMPP。

Application 就是最终处理短信的应用了。它和短信协议无关,比如我们有个游戏同时支持中国短信的小灵通和中国移动的GSM手机。另外给个Web的例子: http://www.hcmms.com.cn/greetings/

在实际实现中,我使用了J2EE。我本来对J2EE挺烦的,不过这次效果不错,特别是它的JMS,正好适合我的需要。开始我自己做消息队列管理,后来发现做Topic方式的实现比较麻烦,所以还是用现成的吧。Application Server选用了JRun或JBoss。因为这两个用JMX,我比较容易写自己的MBean放到作为应用服务的Service。

其中Transport Service就是一个JMX的MBean。另外根据JRun和JBoss的要求,做了一下扩展,很顺利的作为应用服务器中的一个服务执行了。为什么用 JMX?因为它比较容易管理,比如我要修改Transport Service的连接超时参数,用HttpAgentAdapter直接修改就可以了,服务本身就不用重新启动。

Deliver Controller、Logger我都做成了MessageBean,好接收消息队列。Sender和Application Deliver是Stateless的SessionBean,方便别人调用。

用了EJB还一个好处是,我Deploy和Undeploy其中的某些Bean的时候,不影响到其他Bean提供服务。比如新做了一个 Application Deliver,直接Deploy后,这个功能就可以用了。其他服务都不需要重新启动,有点Plug&Play的味道。

数据库我用的是MySQL,我个人还是比较喜欢这个数据库的。

Chinese Under English Locale

The user interface of Fedora Core 1 under English locale is quite pretty but the Chinese one still ugly. Does it support reading and writing Chinese under English locale like Windows 2K? This article shows how I installed Chinese support for Fedora under English locale(en_US.UTF-8).

Fedora Installation

Select only English(USA) locale. Some fonts and input methods will also installed if you select Chinese locale. But those are no use.

Select and Install Gnome, Development, Kernel Development, Gnome Development and X Development. You may ignore the development packages if you don’t need them at all.

Fonts Installation

Copy the TrueType fonts you want from Microsoft Windows to /usr/share/fonts/windows/. You many find the fonts at Windows’ \WINNT\Fonts directory.

Than execute the commands as root.

cd /usr/share/fonts/windows
ttmkfdir .
cp fonts.scale fonts.dir
chkfontpath --add /usr/share/fonts/windows

Here’s the fonts I installed

  • (Arial) – arial.ttf arialbd.ttf arialbi.ttf ariali.ttf
  • (Courier New) – cour.ttf courbi.ttf courbd.ttf couri.ttf
  • (Tahoma) – tahoma.ttf tahomabd.ttf
  • (Verdana) – verdana.ttf verdanab.ttf verdanai.ttf verdanaz.ttf
  • (GB) – simsun.ttc
  • (BIG5) – mingliu.ttc
  • (KR) – batang.ttc gulim.ttc
  • (JP) – msgothic.ttc msmincho.ttc

Input Method Installation and Configuration

The Smart Common Input Method platform, SCIM for short, is an input method that works under English locale. You may download it from its website http://www.turbolinux.com.cn/~suzhe/scim/. I just installed the following two RPM packages

rpm -hUv scim-0.8.2-1.i586.rpm
rpm -hUv scim-chinese-0.2.6-1.i586.rpm

Than, you have to midify the file /etc/X11/xinit/xinitrc.d/xinput, in order to start SCIM automatically after X started. Here’s the patch file

115c115,118
< XIM="none"
---
> # XIM="none"
> if [ -e /usr/bin/scim ]; then
> XIM="SCIM"
> fi
174a178,180
> SCIM)
> XIM_PROGRAM=scim
> XIM_ARGS="-d" ;;

If you want, also change zh_CN), zh_TW), etc., to use SCIM under those locale.

And you need modify the file /etc/gtk-2.0/gtk.immodules, to use X input methods in gtk applications. Here’s the patch file

37c37
< "xim" "X Input Method" "gtk20" "/usr/share/locale" "ko:ja:zh"
---
> "xim" "X Input Method" "gtk20" "/usr/share/locale" "en:ko:ja:zh"

Also comment the IMs that you never need.

Done

Restart X.

在Fedora的英文界面下使用中文

Fedora的英文界面已经非常漂亮了,可是中文界面还是比较丑陋。下面是我怎样在Fedora的英文界面(en_US.UTF-8)下安装中文支持。

Fedora安装

安装的时候Locale仅选择English(USA) 就可以了。中文那些只是安装了些字体和输入法,而那些又都是不需要的。

我还选择安装了Gnome, Development, Kernel Development, Gnome Development和X Development。

字体安装

将Microsoft Windows下的相应TrueType拷贝到Fedora相应目录。我是放在/usr/share/fonts/windows目录下。

然后以root执行下面的命令

cd /usr/share/fonts/windows
ttmkfdir .
cp fonts.scale fonts.dir
chkfontpath --add /usr/share/fonts/windows

以下是我安装的字体文件

  • (Arial) – arial.ttf arialbd.ttf arialbi.ttf ariali.ttf
  • (Courier New) – cour.ttf courbi.ttf courbd.ttf couri.ttf
  • (Tahoma) – tahoma.ttf tahomabd.ttf
  • (Verdana) – verdana.ttf verdanab.ttf verdanai.ttf verdanaz.ttf
  • (GB) – simsun.ttc
  • (BIG5) – mingliu.ttc
  • (KR) – batang.ttc gulim.ttc
  • (JP) – msgothic.ttc msmincho.ttc

输入法安装

输入法我选择[SCIM][1],这个输入法支持在英文Locale下输入中文。下载地址为[http://www.turbolinux.com.cn/~suzhe/scim/][2]。找需要的RPM包下载并安装就可以了。我只安装了下面两个RPM。

rpm -hUv scim-0.8.2-1.i586.rpm
rpm -hUv scim-chinese-0.2.6-1.i586.rpm

接着要修改一下/etc/X11/xinit/xinitrc.d/xinput文件,让SCIM在X启动的时候也启动。下面是patch文件

115c115,118
< XIM="none"
---
> # XIM="none"
> if [ -e /usr/bin/scim ]; then
> XIM="SCIM"
> fi
174a178,180
> SCIM)
> XIM_PROGRAM=scim
> XIM_ARGS="-d" ;;

这个patch没有修改中文Locale下的输入方式,如果需要可以自己修改。找找该文件中的zh_CN)、zh_TW)的部分,然后修改一下。

接着还要修改一下/etc/gtk-2.0/gtk.immodules文件,让gtk的应用程序使用X的输入法。patch文件如下

37c37
< "xim" "X Input Method" "gtk20" "/usr/share/locale" "ko:ja:zh"
---
> "xim" "X Input Method" "gtk20" "/usr/share/locale" "en:ko:ja:zh"

我还将该文件中的其他不需要的输入法都注释。

搞定

重新启动一下X,看看效果。

照此处理之后,不用再做其他设置,中文就可以显示得很漂亮,中文输入也可以使用了。当然还没有100%弄好,比如中文的粗体和斜体还有些问题。xmms,Acrobat Redaer等中文还需要另外设置。但这已经是一个可以工作的环境了。

Filter Spam and Virus

I’m currently working on a large email system which will serives millions of mailboxes – like hotmail.com.

Except sending/receiving emails, the most important feature is spam and virus filtering. I’m using SpamBayes for spam filtering and AnomySanitizer plus ClamAV for virus filtering. They look working well.

Here’s a Chinese document about how to configurate SpamBayes, AnomySanitizer and ClamAV on an exists email system.

The next problem is to make the email system effective and scalable. Anyone has suggestion?

Server Side Spambayes II

Since everyone has a different idea of what is spam. The spam filter with a global database will filter some useful emails. It’s not acceptable for customers although there’re only 1% useful emails filtered as spam. So we individual spam databases for each mailbox and let the customers to train the spam filter themselves.

Three buttons was added to the web mail. ‘Delete as Spam’, ‘Recover from Spam’ and ‘Reset Spam Filter’. It’s similar to SpamBayes plug-in for Outlook.

I’ve configured the solution on a production server. Below is the summary of the e-mail server’s log summary for Sep. 25,

Grand Totals
------------
messages

  87812   received
  56351   delivered
   2012   forwarded
    606   deferred  (5096  deferrals)
   1342   bounced
  54150   rejected (49%)
      0   reject warnings
      0   held
      0   discarded (0%)

   3486m  bytes received
   3816m  bytes delivered
  13591   senders
   4993   sending hosts/domains
   6937   recipients
   1750   recipient hosts/domains

Greep PDA

Great PAD that never battery low. Wanna get one?

Green PDA