一直对软件的组件、插件架构非常感兴趣,我认为现在开发任何应用程序,一定要有一个架构良好的插件机制,这样可以吸引其他人来开发插件,极大的扩充系统的功能。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)); [...]
Archive for July, 2005
昨天去交养路费,走在大堂突然觉得一个人似曾相识,认仔细了,却原来是Tim Leung – 2001年在香港做地铁工程时候的香港地铁方面的工程经理。太奇妙了,这么多年没见,竟然在北京见到他。 他现在是北京四号线地铁工程的机电经理,抽空在清华做培训,他说:“来清华听课是我的梦想”。 2001.07.09 – 被迫启程香港,无法在北京体验申奥的气氛,至今让我后悔; 2001.07.13 – 我们在香港丽东酒店的房间里看申奥直播,买啤酒4听,后上街,无气氛,遂沮丧而归; 2005.07.13 – 在北京和阿Tim一起吃饭,Licc、Blue已经成为老师,Wing在攻读博士,时间过的真快。 恍惚之间,4年已过。不知道4年之后,我会在哪里呢? 附: 2001年 2005年
晚上花了一段时间学习了一下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
前两天注意到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 [...]
说来惭愧,这篇文章应该是在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的演示 [...]
经过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也在搬家,呵呵。