Archive for July, 2005

Dissect WordPress Plugin

一直对软件的组件、插件架构非常感兴趣,我认为现在开发任何应用程序,一定要有一个架构良好的插件机制,这样可以吸引其他人来开发插件,极大的扩充系统的功能。Eclipse就是一个非常棒的例子,几乎你想什么功能,都可以从社区中找到相应的第三方插件。Firefox也同样如此,它的插件机制非常灵活(尤其是相对IE而言),因此Firefox社区中可以找到各种各样的插件。
就像Nat在Open Source Summit中的一句话:

You have to give people work to do.
Create an “architecture of participation” as Tim O’Reilly says.

自从开始使用WordPress,就想学习学习WordPress强大的插件机制。以前曾经研究过的COM、XPCOM、Firefox Extensions、Eclipse Plugin都是桌面应用级别的组件结构,而对Web应用中的插件确实知之甚少,于是,Dissect了一下WordPress(1.5.1.3)。虽然对PHP不是很熟悉,不过看看源码还是问题不大。
1)WordPress读取所有可用的插件
在文件“admin-functions.php”中,函数
<?php function get_plugins() ?> ?>
用来从文件系统得到所有的插件。原理很简单,就是读取’wp-content/plugins’目录下的所有PHP文件。这个函数允许一级的子文件夹,也就是说在’wp-content/plugins’下面的PHP文件,以及所以在此目录下的一级子文件夹内部的PHP文件被列作插件的候选,用下面的函数去进一步提取插件信息。这样的好处是方便用户利用文件夹来对插件进行管理和组织。
而函数
<?php function get_plugin_data() ?>
用来得到插件的描述(Plugin Descriptor),主要包括插件的版本、名称、作者,等信息,而这些其实是以注释的方式存在的。用WordPress中自带的Hello插件来举例:
<?php 
Plugin Name: Hello Dolly
Plugin URI: http://wordpress.org/#
Description: This is not just a plugin, it symbolizes the hope and enthusiasm of an entire …
Author: Matt Mullenweg
Version: 1.0
Author URI: http://photomatt.net/
 ?>
这样,在get_plugin_data函数中,就可以来得到插件的详细信息。
<?php 
function get_plugin_data($plugin_file) {
    $plugin_data = implode(”, file($plugin_file));
    preg_match("|Plugin Name:(.*)|i", $plugin_data, $plugin_name);
    preg_match("|Plugin URI:(.*)|i", $plugin_data, $plugin_uri);
    preg_match("|Description:(.*)|i", $plugin_data, $description);
    preg_match("|Author:(.*)|i", $plugin_data, $author_name);
    preg_match("|Author URI:(.*)|i", […]

Popularity: 39%

恍惚之间

昨天去交养路费,走在大堂突然觉得一个人似曾相识,认仔细了,却原来是Tim Leung - 2001年在香港做地铁工程时候的香港地铁方面的工程经理。太奇妙了,这么多年没见,竟然在北京见到他。
他现在是北京四号线地铁工程的机电经理,抽空在清华做培训,他说:“来清华听课是我的梦想”。
2001.07.09 - 被迫启程香港,无法在北京体验申奥的气氛,至今让我后悔;
2001.07.13 - 我们在香港丽东酒店的房间里看申奥直播,买啤酒4听,后上街,无气氛,遂沮丧而归;
2005.07.13 - 在北京和阿Tim一起吃饭,Licc、Blue已经成为老师,Wing在攻读博士,时间过的真快。
恍惚之间,4年已过。不知道4年之后,我会在哪里呢?
附:
2001年

2005年

Popularity: 17%

Popularity: 17%

XML-RPC

晚上花了一段时间学习了一下XML-RPC,简单的说,就是在Internet上实现远程的方法调用的一种规范和实现。其实这种规范可真是不能算少,DCOM、CORBA、SOAP、RMI,那么XML-RPC有啥优势呢?

"Does distributed computing have to be any harder than this? I don’t think so." — Byte.

一图剩千言,这张图很好的说明了XML-RPC的工作原理。

总结一下,XML-RPC是用XML来做Web服务的鼻祖,是一套实现跨Internet过程调用的规范和实现。它利用HTTP作为传输协议,使用XML作为消息请求的传输主体。XML-RPC以一个消息体为XML格式的HTTP POST请求发送给服务器,服务器执行后将执行结果再以XML格式返回。比起DCOM、CORBA、SOAP,它的优点主要是:
1)简单、轻量级;
2)XML编码,可读性增强,同时也便于手工修改;
3)利用HTTP传输,方便的穿透防火墙(80端口),便于使用SSL加密等。
缺点:
1)对字符编码的支持不够,通常用Base64编码来解决中文问题;
2)Datetime数据类型没有时区;
这里有一个最简单的例子,如果想看真实的例子就看看Bloger中的例子(比如发布文章的API规范)。
最后附上XML-RPC的规范。
对了,XML-RPC的作者是Dave Winer,他也是RSS0.92、RSS2.0(关于RSS的各种版本的历时可以看这篇文章)、OPML的作者。
参考资料:
XML-RPC vs. SOAP - kate rhodes
XML-How to - Eric Kidd
Popularity: 35%

Popularity: 35%

TDD, JUnit, TestNG

前两天注意到TheServerSide上一个挺老的新闻,TestNG阵营认为JUnit在最新的4.0版本中“抄袭”了他们的Idea,TestNG的Co-Founder分别在自己的Blog上发言来证明(Cedric Beust:JUnit 4 overview,Alexandru Popescu:JUnit 4.0),Erich Gamma则留言反击,听起来满有意思,于是我也顺便研究了一下TestNG。

"…I’m not quite sure what is the driving vision behind JUnit 4 (besides TestNG :-))".
I’m glad that there is TestNG, but there are also other interesting testing framework efforts. In particular there is NUnit.NUnit has introduced using annotations in testing frameworks a while ago. Most of the requests for […]

Popularity: 21%

Lucene使用者沙龙

说来惭愧,这篇文章应该是在6月16号完成的,但是最近有很多事儿,实在没时间和精力来写这篇Blog,又不想草草写就,于是一推再推,拖到现在。
这次沙龙的发起者是我和车东,我们在网上有过几次交流,分别是在MSN和SocialBrain的IRC Channel里面。大家都算是Lucene的比较早的实践者,车东还曾经写过一篇Lucene的普及文章(Lucene:基于Java的全文检索引擎简介),在网上流传甚广。
Lucene是一个非常优秀的开源的全文搜索引擎,可以说是一套非常优秀的SDK(开发工具包),我们可以在它的上面开发出各种全文搜索的应用来。Lucene在国外有很高的知名度,现在已经是Apache的顶级项目,在国内,Lucene的应用也越来越多。于是,Lucene这样一个开发包、一种技术,把大家联系在了一起。
这是车东在WebLucene的邮件列表中给出的沙龙安排:

时间:2005年6月16日晚7点
地点:北京 海淀区 清华东门茶餐厅
参与人员:XERDOC开发团队:(米嘉、曹飞、刘力、孟岩),WebLucene项目参与者:(车东、田春峰、张放洪、卢亮),特邀嘉宾(文德)
内容:上半场,车东进行PPT演示,时间20分钟,主题涉及WEBLUCENE的一些初衷,和尚未实现的一些设想(分词,发现,分类……)以及Lucene的一个应用案例(包括搜房、博客中国、gRaSSland.cnblog.org、8fang.com);下半场,Xerdoc的孟岩和米嘉进行PPT演示,介绍XERDOC的企业搜索和桌面搜索,并介绍Xerdoc中使用的中文分词算法。

比较有趣的是,最先大家争执的是Lucene的发音。我们一直的发音是[lu:s],车东的发音为[lu’sen],田春峰的发音为[lusen],后来田春峰给出比较令人信服的解释,我也在网上查到确切的证据,不过要想马上改正也是一件比较困难的事儿了:P。

Loo-seen.
Danny Sofer wrote:
> …and where does the name come from?
It’s my wife’s middle name, and her maternal grandmother’s first name.
Doug
- Lucene Maillist

车东的演示主要专注在WebLucene方面,简要的介绍了Lucene的来龙去脉、基本功能以及在gRaSSland(我也是在这次沙龙上第一次知道了gRaSSland的来历,这个名字起的有趣)的一些实践。大家如果感兴趣,可以参考附录中的PPT。
孟岩的演示主要集中在Xerdoc DSearch的一些简要介绍和主要Feature,包括Xerdoc DSearch中的Tag、插件化结构、国际化支持等等。其中,插件化是一个重要的部分,你可以从这张图看到Xerdoc DSearch的整个架构。
米嘉的演示则专注在Xerdoc中Lucene的应用上,分别介绍了基于最长词匹配算法变形的分词系统和Xerdoc的文档管理框架-XDMF。
非常喜欢这种形式的聚会,没有什么功利目的,大家凭着自己的兴趣坐在一起,海阔天空、高谈阔论,在这样的讨论中,你真的能够得到很多有益的东西。套用Scoble评论FooCamp的一句话,“你发现那个演讲者用的是一个构造完全不同的大脑来工作,而那正是是我们遗弃的那部分思维。”。在国外,FooCamp每年都会引起很大的轰动,不知道什么时候在中国也能有这样的聚会,我想,那就期望更多有影响力、有责任心的组织、媒体、个人站出来吧(BTW:看看去年FooCamp的照片吧,Lucene的作者Doug Cutting也在其中哦)。
不知道这是不是Lucene在中国使用者的第一次聚会,立此存照。
附:
1)会议录音(比较大,分成4个文件,每个大概10M)
1(9.42M) - 车东的演示
2(18.31M)- Xerdoc的演示
3(4.65M)- 自由讨论
4(12.83M)- 自由讨论
2)PPT
《WebLucene项目的来龙去脉》-车东(30K)
《Xerdoc XDMF》-米嘉(2332K)
《Xerdoc DSearch》-孟岩(262K)
Popularity: 30%

Popularity: 30%

Xerdoc move to Dreamhost

经过2周的努力,Xerdoc.com终于从Name2host搬到了Dreamhost。其间过程不可谓不艰辛,既然已经结束,也就不想再说什么,只是希望所有的SP都有送佛送到西的胸怀。
这次搬家,变化最大的要数Xerdoc Togetherum,经过一番讨论,大家都认为我们实在没有必要再继续开发自己的Blog Software,所以,最后决定用WordPress来作为新的Blog发布软件。Xerdoc Togetherum正式下岗,多谢曹飞给我们提供的这个平台 :-)。
WordPress当然没有提供Togetherum的导入脚本:P,所以数据的导入又比较麻烦,不过还好,WordPress考虑到了这种情况,提供从RSS2.0Feed的导入脚本(import-rss.php)。当然,这个脚本比较简单,还需要按照自己的情况进行一下Hack。比如说,这个脚本不支持作者,因此,你需要将读出的作者标签(“dc:creator”)转换为WP中相应的作者ID($post_author)。
由于选择了使用Feedburner提供烧制服务,因此RSS的转向倒是根本无需关心,这就是Wrapper或者说是Proxy的好处(计算机领域内的很多问题都可以通过多一层的抽象和Wrapper来解决)。不过,这也不可避免的带来了中心化服务的风险,TypePad曾经提到可以用这种方法“穿墙”,要是如果也被“Big墙”阻止,不敢想象。BTW:试用了FeedSky,感觉差距还不小,需要努力哦。
Xerdoc Story没有变化,我也会尽快补全Xerdoc的故事 :-)。 (哦,对,Phil在进行MySql的中文导入时好像遇到了一些问题,曹飞,补充一下?)
这是Xerdoc Togetherum的最后一篇帖子,http://together.xerdoc.com已经被重定向到了http://xerdoc.com/blog。
对了,最近,Gnome也在搬家,呵呵。
Popularity: 23%

Popularity: 23%


Creative Commons License
This work is licensed under a Creative Commons License.

曾梦想仗剑走天涯,看一看世界的繁华,年少的心总有些轻狂,如今已四海为家