Archive for 十月, 2009

制作了Maven库的单词库

星期四, 十月 29th, 2009

IDEA有一个SpellChecker plugin,主要是检查单词拼写错误,这个功能非常有用,对应我们这些英语不过关的人来说,做一个单词拼写检查还是非常好的。不够有一个问题,就是一些常用的Java术语并没有添加进来,如你输入jdbc,那么也会给你报告拼写检查错误,那就有点烦人啦。我制作了一个基于Maven库的单词库,包含了常用的Java术语,你只要添加了这个单词库,就不用担心这些专业词汇会被报告拼写错误啦。首先下载字典文件(http://www.intellij.org.cn/downloads/maven2.dic ),然后保存在一个新建的目录下,如dictionary,然后打开IDEA的设置面板,选择Spelling选项,设置如下(这里需要输入的是字典文件所在目录): 加入这个Maven 字典后,以后jdbc,jee都不会提示为拼写错误啦。

http://plugins.intellij.net改版

星期三, 十月 28th, 2009

今天访问http://plugins.intellij.net时发现页面改版啦,插件主要分为:IDEA,RubyMine和WebIDE三类,而且IDEA又分为IC和IU。从IDEA开源后,会有很多的人加入到插件开发中,所以plugin改版也是必要的。在IDEA这个平台逐渐完善后,相信会有更多的插件会涌现。

Google Wave Java Robot

星期天, 十月 25th, 2009

介绍如何使用GAE开发Google Wave Robot,评论中有一个介绍如何在IDEA下开发这个Robot的实例,有兴趣可以看一下。一直没有Google Wave邀请,前两天委托一个哥们发了一个,如果有时间,也照着搞一个Robot。http://www.certpal.com/blogs/2009/10/google-wave-java-robot-overview/

ExtJS 3.1

星期二, 十月 20th, 2009

ExtJS 3.1预计在十一月份发布,当然主要的功能集中在对Adobe Air的支持、ExtJS Designer、Component Body Template和Column Header Grouping,这些特性都非常有吸引力的,同时会修复Ext 3.0以来的一些Bug,应该说这个版本应该是Ext 3.0的稳定版。还不了解Adobe Air,接下来打算花点时间搞一下这方法的应用开发。

Ruby元编程(MetaProgramming)

星期一, 十月 19th, 2009

现在关于Ruby元编程可以说比较热门,这个隐藏在Ruby背后的特性随着大家对Ruby的了解逐渐显现出来啦。这篇文章是自己对Ruby MetPrgamming的理解。
元编程中的元是指元信息(Meta),主要是为其载体提供基本信息,如html页面中就有meta,如content type说明,SEO等。在C++,Java和Ruby语言中,也有元信息概念,如加载到内存中(运行期)的当个对象模型(Class或者Object),都会包含元信息(蓝色)和执行代码(灰色):

图中蓝色区块表示元信息,C++最少,在C++编译的过程中,编译器仅保留了很少的元信息;Java次之,包含了部分元信息;Ruby在解析过程中保留很多信息,所以元信息最多。当然这里不能说C++设计不合理,C++流行的时候,那个时候内存说不定是640K的,硬盘16M的,如果保留过多的信息,那势必导致程序无法运行,这些设计都是出于性能的考虑。当然Java在后续的版本(Java 9,Java 10?)中可能会添加更多的元信息,都不确定,毕竟语言在发展。
就一个Class来说,这些元信息是什么,如Java,元信息区块包括编译版本号、类名、属性、函数方法名、返回值、参数类型、annotation等等,这个我们可以通过查看Java Class文件得知。对于Ruby来说,元信息则更丰富,如对函数来说,函数的参数名都会保存下来。接下来还有一个关于元信息的是否可以修改的问题,C++和Java中,这些元信息都是只读的,你不能更改。一个例子,我们在做Java Debug的时候,如果我们修改函数内部的逻辑,那么hotspot机制可以重新加载该class,但是你给Java Class添加属性或函数后,hotspot机制会警告你无法进行新的class加载,这个时候我们需要重新启动应用进行debug。当然也不是绝对的,JavaRebel能够在修改Java Class结构后,仍能重新加载,其主要是其修改了Java对象模型,不在这里讨论。但是Ruby就不一样拉,元信息不是封闭的,是可以动态修改的,这样就可以在运行期调整其结构。综合上述的讨论,Ruby的元信息丰富,且可以动态修改,所以我们可以就元信息进行更多的编程,实现某些特殊的功能,而C++和Java在这方面就表现的比较弱一些。
讲述了元信息,那么什么是元编程?就是利用元信息进行编码,也就是你的代码中包含对元信息的访问和修改。网上有对元编程的定义为”Write code to write code”(利用代码去写代码),可能不便于理解,如你编写Maven Plugin或者Velocity模板来生成代码,这些都不是元编程,因为它们压根就没有接触元信息,就是代码生成工具而已。在Java中,如果你的代码访问了元信息(java.lang.reflect下的类),我们就说你使用了反射机制,反射其实就是Java中的元编程,所以这里将代码中涉及元信息的操作定义为元编程。在代码中如何访问元信息?其实很简单,有相关的API,如Java中,java.lang.reflect下的类都是围绕元信息设计的。在Ruby中,和Java一样,有相关的函数,如instance_methods、class_eval, instance_eval, define_method等等,这些函数主要负责访问和修改元信息,网上有很多文章介绍这些函数的,不会很难理解。
为何要进行元编程?我们写代码主要是为了实现业务逻辑,如数据库操作,调用搜索引擎等,而元编程只是在操作元信息,好像和业务逻辑无关,其实不然。我们访问和修改元信息主要目的有两个:简化代码和实现复杂逻辑。简化代码虽然不直接为业务逻辑服务,但是会降低维护成本,如动态函数定义等都是这样的目的;实现复杂逻辑,举一个例子,如Java中,我们利用反射机制来实现AOP,这样一些复杂的功能(事务、监控统计、Cache、权限控制等)就非常容易实现。在Ruby中,使用元编程实现的ActiveRecord让复杂的数据库操作更加简单,利用Ruby元编程可以实现各种DSL,如Sinatra就是HTTP的DSL。
我们进行元编程的主要目的是解决业务逻辑实现中的技术问题,所以元编程时有一定的适用场合,不是说利用元编程实现某种奇淫技巧,造成代码理解困难,增加维护成本,那就不必要啦。元编程也有一些局限性:
1 动态结构更改可能导致某些不可预料的错误,如程序A按照既定的逻辑编程,而B程序使用元编程,更改了相关的元信息,导致逻辑不正确,这些都是有的;
2 元编程属于高级技术,不是一般人能理解,而且不是面向业务的,使用不好反而会增加维护成本;
3 对IDE工具不友好,IDE工具对强类型语言,如Java支持非常好。如果你在Ruby中动态定义一些函数(如使用class_eval),那么IDE将无法完成这些动态定义的函数提示,开发效率也会降低的,不过不少IDE(如RubyMine)已经开始着手解决这些问题。
最后说明一下,元编程并不是某种语言的专利,其实每种语言都包含的这样的特性,只不过支持的程度不一样。Ruby设计的对象模型让元编程更容易实现,而且非常容易实现一些复杂功能,所以这也成了Ruby的特点,这些特点在Rails的代码中体现的尤为明显,甚至到了极致的地步,所以也成就了Rails这款非常优秀的框架。

IDEA的代码解析:启动篇

星期天, 十月 18th, 2009

花了一点时间阅读了一些IDEA的源码,这里和大家共享,主要是了解IDEA的机制,为以后的插件开发奠定一定的基础。这篇文章主要介绍IDEA启动的过程,不涉及具体的功能实现。
1. com.intellij.idea.Main: 程序启动的入口,这里有一个功能就是 Patch 判断和安装
2. com.intellij.idea.MainImpl :操作系统的判断、启动的检测
3. com.intellij.idea.IdeaApplication :初始化 ApplicationImpl ,准备启动程序( starter , splash , look and feel 安装等)
4. com.intellij.openapi.application.impl.ApplicationImpl :初始化容器 Pico Container(IdeaPicoContainer) ,注册组件 Application 。解析整个系统插件列表,接下来开始初始化插件涉及的组件 (component) ;最后注册 registerShutdownHook( 通过 ShutDownTracker.getInstance().registerShutdownTask() 实现 );
5. c om.intellij.openapi.components.impl.ComponentManagerImpl :组件管理类,主要负责系统所有组件管理(通过 PicoContainer 管理),加载组件配置,组件注册(接口、实现类和相关配置参数)。这里 ApplicationImpl 本是就是 ComponentManagerImpl 的继承类,负责组件管理。组件管理的背后一切有一个 PicoContainer 在工作。三种组件类型: Application 、 Project 和 Module 。
6. com.intellij.openapi.wm.impl.WindowManagerImpl :其本身就是一个组件,在前面已经进行了初始化,接下来就是调用 IDEA 显示逻辑;
7. com.intellij.openapi.wm.impl.IdeFrameImpl [...]

PATRICIA Trie

星期天, 十月 18th, 2009

Practical Algorithm to Retrieve Information Coded in Alphanumeric,非常有趣的一个算法。最近最一个代码提示的例子,也就是用户输入一个前缀,然后根据这个前缀查询匹配的条目。如果我来实现,那干脆循环后使用startsWith,如果是几个条目还能接受,如果是一个字典,有20-30W个单词,那么就不能使用这样的暴力循环啦。PATRICIA Trie(http://code.google.com/p/patricia-trie)就是解决这样的问题的,样例代码如下:
// Trie of First Name -> Person
Trie<String, Person> trie = new PatriciaTrie<String, Person>(StringKeyAnalyzer.INSTANCE);
trie.put(“Anna”, person1);
trie.put(“Alex”, person2);
trie.put(“Emma”, person3);
trie.put(“Patrick”, person4);
trie.put(“William”, person5);

// Returns Alex
SortedMap<String, Person> entry = trie.getPrefixedBy(“Al”);

Popular Desktop JIRA Client Goes Free

星期六, 十月 17th, 2009

Jira Client是ALM Works(http://www.almworks.com/)一款Jira桌面客户端工具,功能非常丰富(搜索、Screen Capture等),操作便捷,而且可以离线工作,并且和IDEA进行整合,管理bug更加简单,但是这款软件有点贵,个人用户需要$189。不过最近推出了Lite版本,功能没有任何减少,该版本可以免费用在Open Source项目上,而且可以用在Jira Enterprise Starter版本上,个人之前购买了Jira Enterprise Starter版本,所以可以使用该Lite版本,今后会花些时间使用这款软件,而且它能和IDEA很好地整合,会对工作效率有很大地提升。