如鹏网 大学生计算机学习社区

CowNew开源团队

http://www.cownew.com 邮件请联系 about521 at 163.com

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  363 随笔 :: 2 文章 :: 808 评论 :: 0 Trackbacks

#

定义一个ActionHandler:

package com.test;

import org.jbpm.graph.def.ActionHandler;
import org.jbpm.graph.exe.ExecutionContext;

public class MyAction implements ActionHandler
{

 private static final long serialVersionUID = 1L;

 private String message;

 public String getMessage()
 {
  return message;
 }

 public void setMessage(String message)
 {
  this.message = message;
 }

 public void execute(ExecutionContext executionContext) throws Exception
 {
  System.out.println(message);
 }

}


定义一个流程文件:

<?xml version="1.0" encoding="UTF-8"?>

<process-definition
  xmlns="urn:jbpm.org:jpdl-3.1"
  name="simple">
   <start-state name="start">
      <transition name="to_state" to="first">
         <action name="action" class="com.test.MyAction">
            <message>Going to the first state!</message>
         </action>
      </transition>
   </start-state>
   <state name="first">
      <transition name="to_end" to="end">
         <action name="action" class="com.test.MyAction">
            <message>About to finish!</message>
         </action>
      </transition>
   </state>
   <end-state name="end"></end-state>
</process-definition>

定义流程驱动类:

package com.test;

import java.io.IOException;
import java.io.InputStream;

import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;

public class Main
{
 public static void main(String[] args) throws IOException
 {
  InputStream stream = Main.class.getResourceAsStream("processdefinition.xml");
  ProcessDefinition processDefinition = ProcessDefinition
    .parseXmlInputStream(stream);
  stream.close();
  ProcessInstance instance = new ProcessInstance(processDefinition);
  while (!instance.hasEnded())
  {
   instance.signal();
  }
 }
}


将jbpm***.jar、commons-logging**.jar和dom4j.jar三个包加入classpath就可以了。
执行结果:
Going to the first state!
About to finish!
posted @ 2007-11-16 13:51 CowNew开源团队 阅读(2523) | 评论 (0)编辑 收藏

package com.sample;

import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;

public class Main
{
 public static void main(String[] args)
 {
  ProcessDefinition processDefinition = ProcessDefinition
    .parseXmlResource("simple/processdefinition.xml");
  ProcessInstance instance = new ProcessInstance(processDefinition);
  while (!instance.hasEnded())
  {
   instance.signal();
  }
 }
}



不需要人工参与,不需要持久化状态,流程一次性短时间内运行完成,其实这是把JBPM当成普通的流程图运行引擎来用了,呵呵,大材小用了,:),不过省的自己写流程运行引擎了。
posted @ 2007-11-15 15:29 CowNew开源团队 阅读(502) | 评论 (0)编辑 收藏

本章翻译人 CowNew开源团队 周晓

记号流

长久以来, 词法分析器和语法分析器是紧紧耦合在一起的; 也就是说, 你不可以在他们中间做任何事情,也不能修改记号流。但是,用记号流来处理词法分析器和语法分析器之间的连接的话,会给代码识别和翻译带来极大的帮助。这个想法类似于Java的输入输出流,利用输入输出流你可以用管道的方式处理多个深加工的数据流。

介绍

ANTLR识别任何满足TokenStream接口的记号流对象(2.6以前的版本, 这个接口叫做Tokenizer);也就是说记号流对象要实现以下的方法。

Token nextToken();

如图, 在分析过程中的某一时刻,从词法分析器(生产者)到语法分析器(消费者)的一般记号流会像是下面的样子。

lexer.to.parser.tokens.gif (3585 bytes)

最普通的记号流是一个词法分析器,但是想象一下,在词法分析器和语法分析器中间有一个流的实体,都能做哪些有趣的事情呢。比如说,你可以:

  • 过滤掉不想要的记号
  • 插入一些辅助的记号,帮助语法分析过程识别一些复杂的结构
  • 把一个流分成多个流,把某些感兴趣的记号送到不同的流中
  • 把多个记号流合并成一个流,从而“模拟”PCCTS,lex等词法分析工具的状态。

记号流概念的优雅在于它对词法分析器和语法分析器没有影响--它们只不过是流的生产者和消费者。流对象是消费者用来生产,处理,合并或者分离记号流的过滤器。可以使已有的词法分析器和语法分析器在不修改的情况下合并成一种新的工具。

这份文档正式提出了记号流的概念,详细描述了一些非常有用的流过滤器。

让记号通过的记号流

一个记号流是任何满足下面接口的对象。

public interface TokenStream {
public Token nextToken()
    throws java.io.IOException;
}

例如, 一个"没有操作"或者说仅仅是让记号通过这里的过滤器是这样工作的:

import antlr.*;
import java.io.IOException;
class TokenStreamPassThrough
    implements TokenStream {
protected TokenStream input;
/** Stream to read tokens from */
  public TokenStreamPassThrough(TokenStream in) {
input = in;
}
/** This makes us a stream */
  public Token nextToken() throws IOException {
return input.nextToken(); // "short circuit"
}
}

在下面的main()程序中,你使用这个简单的流对象从词法分析器中获得记号,然后语法分析器从流对象中获得记号。

public static void main(String[] args) {
  MyLexer lexer =
new MyLexer(new DataInputStream(System.in));
TokenStreamPassThrough filter =
    new TokenStreamPassThrough(lexer);
MyParser parser = new MyParser(filter);
  parser.startRule();
}

记号流过滤

多数情况下,你希望词法分析器忽略掉空白符和注释,然而,你还希望在语法分析器必须使用注释的情况下重用词法分析器。这时,你只要为需要注释和空白符连同普通记号的情况设计一个词法分析器。然后,当你想忽略空白符的时候,只要在词法分析器和语法分析器中间加入一个过滤器,过滤掉空白符。

针对这种情况,ANTLR提供了TokenStreamBasicFilter。你可以在不修改词法分析器的情况下让它过过滤掉任何类型的记号。下面TokenStreamBasicFilter的用法的例子中过滤掉了注释和空白符。

public static void main(String[] args) {
  MyLexer lexer =
new MyLexer(new DataInputStream(System.in));
TokenStreamPassThrough filter =
    new TokenStreamPassThrough(lexer);
filter.discard(MyParser.WS);
filter.discard(MyParser.COMMENT);
  MyParser parser = new MyParser(filter);
  parser.startRule();
}

可以看到,它比修改词法分析器的词法结构要来的有效,你也会这么做的吧,因为这样你不用去构建一个记号对象。另一方面,采用这种过滤流的方法使词法分析器的设计更加灵活。

记号流分离

有时,在识别阶段,你想让翻译器忽略但不是丢弃输入的部分记号。比如说,你想在语法分析时忽略注释,但在翻译时又需要注释。解决办法是将注释发送到一个隐藏的记号流中,所谓隐藏,就是语法分析器没有对它进行监听。在识别期间,通过动作来检查这些隐藏的流,收集注释等等。流分离过滤器有点像棱镜把白光分离成彩虹。

下面的图中示出了把一个记号流分成三个的情况。

stream.splitter.gif (5527 bytes)

让语法分析器从最上面的流中获得记号。

用流分离器可以实现很多功能。比如,"Y-分离器"像有线电视Y连接器一样,复制符号流。如果过滤器是线程安全的而且有缓冲器缓冲,过滤器就可以同时为多个语法分析器提供记号。

这一节描述了ANTLR提供的一个叫做TokenStreamHiddenTokenFilter的流过滤器,它工作的时候有点像给一堆硬币分类,把一分一分的放到一个箱子里,把一角一角的放到另一个箱子里,等等。这个过滤器把输入流分离成两个流,一个包含主要记号,另一个被缓冲以便以后可以访问。因为这种实现方式,无论怎么做,你都无法让语法分析器直接访问隐藏流。下面你将会看到,过滤器实际上把隐藏记号交织在主记号中。

例子

考虑以下的简单文法,该文法用来声明整型变量.

decls: (decl)+
;
decl : begin:INT ID end:SEMI
; 

比如说有以下输入:

int n; // list length
/** doc */
int f;

假定词法分析器忽略空白符,你用过滤器把注释分离到一个隐藏流。那么现在如果语法分析器从主记号流中获得记号,它只会看到"INT ID SEMI FLOAT ID SEMI",注释在隐藏流中。实现了语法分析器可以忽略注释,而你的语义动作可以从过滤器中查询隐藏流中的记号。

第一次识别出文法规则decl,begin记号前后没有对隐藏记号的引用,但

filter.getHiddenAfter(end)

返回一个对下面记号的引用

// list length

接下来就会访问到

/** doc */

第二次识别出decl

filter.getHiddenBefore(begin)

指向

/** doc */

的引用

过滤器实现

下图示出记号对象是如何组织记号来模拟两个不同的流。

hidden.stream.gif (3667 bytes)

 

因为记号是假定的,TokenStreamHiddenTokenFilter对象通过链表来连接隐藏记号和主记号。过滤器只提供了一个物理上的记号流,通过交织指针维护和管理记号次序。

因为这个额外的指针需要把记号连接到一起,你必须要用一个叫CommonHiddenStreamToken的特殊记号对象(普通记号对象叫做CommonToken)。前面曾说过,你可以用以下的方法去指定词法分析器为特定的类制造记号。

lexer.setTokenObjectClass("classname");

技术上,如果不请求特殊记号对象,也可以实现同样功能的过滤器,但这样实现非常有效率而且它很容易告诉词法分析器去生成什么种类的记号。进一步说,这样实现使得它很容易去自动完成包含隐藏流信息的树结点的创建。

这个过滤器影响ANTLR的懒惰消费。在识别每一个主记号之后, TokenStreamHiddenTokenFilter必须获取下一个记号看它是不是一个隐藏记号。因此,这个过滤器在交互程序(比如命令行)下工作的不是很好。

怎样使用这个过滤器

要使用TokenStreamHiddenTokenFilter,仅仅要做的是:

  • 创建词法分析器,让它创建链接隐藏记号的记号对象。
MyLexer lexer = new MyLexer(some-input-stream);
lexer.setTokenObjectClass(
  "antlr.CommonHiddenStreamToken"
);
  • 创建一个TokenStreamHiddenTokenFilter对象,该对象从上面的词法分析器中获得记号。
TokenStreamHiddenTokenFilter filter =
  new TokenStreamHiddenTokenFilter(lexer);
  • 设置TokenStreamHiddenTokenFilter要隐藏哪些记号,要丢弃哪些记号。例如,
filter.discard(MyParser.WS);
filter.hide(MyParser.SL_COMMENT);
  • 创建一个语法分析器,从TokenStreamHiddenTokenFilter而不是从词法分析器中获得记号。
MyParser parser = new MyParser(filter);
try {
parser.startRule(); // parse as usual
}
catch (Exception e) {
System.err.println(e.getMessage());
}

查看ANTLR指南,在preserving whitespace处有一个完整的例子。

树的构建

最后,在翻译阶段,如果需要这些隐藏的流记号,在遍历树的时候,则可以按正常的方式使用。怎么做才能在不打乱树文法的情况下把隐藏流的信息送给翻译器呢?很简单: 用AST结点储存这些隐藏流记号。ANTLR定义了CommonASTWithHiddenTokens来自动连接隐藏流记号到树结点; 联合一个树结点,适用于树结点的方法在这里也适用于访问这些隐藏记号。你只需要告诉语法分析器去创建这种类型的结点而不是默认的CommonAST类型的结点。

parser.setASTNodeClass("antlr.CommonASTWithHiddenTokens");

树结点作为记号对象的功能被创建。当ASTFactory创建树结点的时候,树结点的initialize()方法被调用。从记号创建的树结点包含隐藏记号,不管在前还是在后,都有着同样的对隐藏记号的引用。你不需要用这个结点定义,但它工作在很多翻译任务中:

package antlr;
/** CommonAST在初始化时把从记号中获得
*  的隐藏记号的信息复制,用来创建结点
*/
public class CommonASTWithHiddenTokens
extends CommonAST {
// 指向隐藏记号
protected Token hiddenBefore, hiddenAfter;
public CommonHiddenStreamToken getHiddenAfter() {
    return hiddenAfter;
  }
public CommonHiddenStreamToken getHiddenBefore() {
    return hiddenBefore;
  }
public void initialize(Token tok) {
CommonHiddenStreamToken t =
      (CommonHiddenStreamToken)tok;
super.initialize(t);
hiddenBefore = t.getHiddenBefore();
hiddenAfter  = t.getHiddenAfter();
}
}

注意到这个结点定义假设你用了CommonHiddenStreamToken对象。如果你没有让词法分析器创建CommonHiddenStreamToken对象,就会出现运行时类下行异常。

垃圾回收问题

利用对主流记号的引用分隔输入流,保存隐藏流记号时,GC允许在记号流上工作。在上面的整数声明的例子中,当没有更多的对第一个SEMI记号以及第二个INT记号的引用时,comment记号将会作为垃圾回收的候选人。如果所有的记号是连在一起的,一个单独的对任意记号的引用会阻止任何记号被回收。这在ANTLR实现不是问题。

提示

翻译时,过滤器在保存空白符和注释方面做得很好,但在处理输出和输入相差很远的情况下,用过滤器不是一个最好的办法。例如,有3个注释散布在一个输入声明语句中,你想在翻译阶段合并到输出声明语句的头部。比起察看注释周围的每一个分析的记号,更好的办法是有一个真正实际上分开的流来保存注释以及一个方法去联系分析好的记号的组和注释流记号的组。你或许想支持像"给我在注释流上从开始分析到结束分析时最初出现的的所有记号."

这个过滤器实现了同JavaCC中special记号及其相似的功能。Sriram Sankar (JavaCC之父) 关于特殊记号有一个非常好的想法,在1997的Dr. T's Traveling Parsing Revival and Beer Tasting Festival,出席者认同了泛化记号流的概念。现在JavaCC特殊记号功能仅仅是另一个ANTLR流过滤器,好处是你不用去为指定哪些记号是特殊的而修改词法分析器。

记号流多路技术 (又叫 "词法分析器多状态")

现在,考虑一下相反的问题,你想合并多个流而不是把一个流分成多个。当你的输入包含根本上不同的片段,比如说Java和JavaDoc注释,你会发现仅用一个词法分析器去识别所有的输入片段是很难的。这主要是因为合并各种部分的记号定义会造成二义性词法语言或者识别出一些错误的记号。例如,"final"在某些部分里是一个关键字,但在另一个部分里它可能会是一个标示符。同样,"@author"是一个合法的javadoc注释里的标记,但在Java代码中,它是不合法的。

大部分人为了解决这个问题,为词法分析器设定了很多状态,在不同的部分里切换到不同的状态来工作(例如,在"读取Java模式"和"读取JavaDoc模式"中间切换)。词法分析器开始是以Java模式工作的,然后在遇到"/**"后切换到JavaDoc模式; "*/"强制切换回Java模式。

多词法分析器

让一个词法分析器在多个状态下工作可以解决上述的问题,但有一个更好的解决问题的办法,让多个词法分析器协同工作,生成一个记号流。为什么说这种办法更好呢?因为分开的词法分析器更利于重用(不是剪贴粘贴,而仅仅是告诉流的多元管理器去切换不同的词法分析器,就得到了一个新的词法分析器)。例如,JavaDoc词法分析器可以在解决任何有JavaDoc注释的语言问题时得到重用。

ANTLR预设了一个记号流叫做TokenStreamSelector,可以用它在多个词法分析器间进行切换。不同词法分析器中定义的动作控制这个选择器切换输入流。考虑下面的Java代码片段。

/** Test.
*  @author Terence
*/
int n;

给出2个词法分析器,JavaLexer和JavaDocLexer,2个词法分析器的动作序列可能看起来是下面的样子:

JavaLexer: 匹配JAVADOC_OPEN, 切换到JavaDocLexer
JavaDocLexer: 匹配AUTHOR
JavaDocLexer: 匹配ID
JavaDocLexer: 匹配JAVADOC_CLOSE, 切换回JavaLexer
JavaLexer: 匹配INT
JavaLexer: 匹配ID
JavaLexer: 匹配SEMI

在Java词法分析器的文法中,你需要定义一个规则去切换到JavaDoc词法分析器(把需要切换的词法分析器记录在栈中):

JAVADOC_OPEN
:    "/**" {selector.push("doclexer");}
;

同样地,在JavaDoc词法分析器中定义一个规则切换回去:

JAVADOC_CLOSE
:    "*/" {selector.pop();}
;

选择器中有一个栈,所以JavaDoc词法分析器不用知道谁调用了它。

入图,选择器和并2个词法分析器流,为下游的语法分析器提供单独的一个记号流。

stream.selector.gif (5976 bytes)

选择器可以为你维护流列表,所以你可以通过名字或者实际对象的引用来切换到另一个输入流。

public class TokenStreamSelector implements TokenStream {
public TokenStreamSelector() {...}
public void addInputStream(TokenStream stream,
    String key) {...}
public void pop() {...}
public void push(TokenStream stream) {...}
public void push(String sname) {...}
/** Set the stream without pushing old stream */
public void select(TokenStream stream) {...}
public void select(String sname)
    throws IllegalArgumentException {...}
}

用选择器很简单:

  • 创建一个选择器。
TokenStreamSelector selector =
new TokenStreamSelector();
  • 为流命名(不是一定要命名--在切换的时候你可以用流对象的引用来避免使用哈希表查找)。
selector.addInputStream(mainLexer, "main");
selector.addInputStream(doclexer, "doclexer");
  • 选择哪一个词法分析器先从字符流中读数据。
// start with main java lexer
selector.select("main");
  • 语法分析器可以像用词法分析器一样使用选择器。
JavaParser parser = new JavaParser(selector);

词法分析器共享同一字符流

在介绍语法分析器如何使用选择器之前,注意一下这2个词法分析器都要从同一个输入流中读取字符。以前的ANTLR2.6.0版本,每一个词法分析器都有它自己的记录行号的变量,输入字符流变量等等。为了共享同样的输入状态,ANTLR2.6.0代理词法分析器来处理字符输入到对象中,LexerSharedInputState可以被n个词法分析器共享(单线程)。为了让多个词法分析器共享状态,你创建第一个词法分析器,获得它的输入状态对象,然后在构建其它词法分析器并且需要共享输入状态的时候使用它:

// 创建Java词法分析器
JavaLexer mainLexer = new JavaLexer(input);
// 创建javadoc词法分析器; 使用
// java词法分析器的共享输入状态
JavaDocLexer doclexer =
  new JavaDocLexer(mainLexer.getInputState());

分析多元记号流

就像一个词法分析器在从不同的输入片段中生产一个单独的流会遇到很多麻烦,一个单独的语法分析器在处理多记号流的时候也会遇到一些麻烦。又是同样的问题,一个记号在一个词法分析器中可能是一个关键字,在另一个词法分析器中可能会是一个标示符。把语法分析器分解成子分析器,为每一个输入片段单独处理它们的单词表,这样做同时也利于语法分析器的重用。

下面的语法分析器文法用主词法记号的词表(用importVocab指定),在遇到JAVADOC_OPEN的时候,它创建并且调用一个JavaDoc分析器去处理接下来在注释中的记号流。

class JavaParser extends Parser;
options {
importVocab=Java;
}
input
:   ( (javadoc)? INT ID SEMI )+
;
javadoc
:   JAVADOC_OPEN
{
        // 创建一个分析器去处理javadoc注释
JavaDocParser jdocparser =
          new JavaDocParser(getInputState());
jdocparser.content(); // 用jdocparser继续分析
}
        JAVADOC_CLOSE
;

你会发现从2.6.0版本起,ANTLR语法分析器也共享记号输入流状态。当创建"子分析器"时, JavaParser告诉它从同一输入状态对象中获取记号。

JavaDoc分析器匹配一串标签:

class JavaDocParser extends Parser;
options {
importVocab=JavaDoc;
}
content
:   (   PARAM // includes ID as part of PARAM
|   EXCEPTION
        |   AUTHOR
)*
;

当子分析器规则content结束后,控制权自然地返回给它的调用方,也就是Java分析器中的javadoc

多记号流超前扫描的作用

如果语法分析器需要去查看JavaDOc注释起始位置后的2个记号,那会发生什么呢?换句话说,以主分析器来看,JAVADOC_OPEN之后的记号是什么呢? 自然是记号 JAVADOC_CLOSE! 主分析器把任何JavaDoc注释都看作是一个实体,不管这个注释有多复杂; 它不用去了解注释记号流内部情况,它也不需要这么做--子分析器会去处理这件事情。

在子分析器中,content规则后是什么记号呢?是"End of file"记号。子分析器的分析过程不能确定你的代码中将会调用怎样的方法。但这不是一个问题,因为一般情况会有一个单独的记号标示子分析过程的结束。即使因为某种原因EOF被载入到分析过程,EOF也不会出现在记号流中。

多词法分析器vs调用另一条词法规则

多词法分析器状态也经常被用来处理那些非常复杂的单个记号,比如说嵌入转义字符的字符串,输入"\t"应该被识别为一个字符串。针对这种情况,典型的做法是在第一个引号之后,切换词法分析器到"字符串状态"然后在识别完字符串之后切换回"普通状态"。

所以把这种代码依靠模式做事情的方式叫做"模态"编程,这通常是一个比较差的方式。在这种复杂记号的情况下,最好是用多个规则直接指定复杂的记号。这里有一个什么时候该用多记号流和什么时候不该用的黄金规则:

复杂的单个记号应该通过调用另一个(protected)词法规则来匹配,对一段输入片段来说应该用多个词法分析器处理此输入流并提供给分析器。

例如,词法分析器字符串的定义应该仅仅是调用另一个规则来处理转义字符的情况:

STRING_LITERAL
:    '"' (ESC|~('"'|'\\'))* '"'
;
protected // 不是一个记号; 仅仅被另一个规则调用
ESC
:    '\\'
(    'n'
|    'r'
|    't'
|    'b'
|    'f'
|    '"'
|    '\''
|    '\\'
|    ('u')+
             HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT
...
)
    ;

TokenStreamRewriteEngine 简单的语法制导翻译

在很多情况下,你希望在原代码基础上修改或者增加一段程序或数据文件。ANTLR 2.7.3 介绍了一个(只有Java/C#版本)非常简单但非常强大的类TokenStream处理以下问题:
  1. 输出语言和输入语言相似
  2. 语言元素的相对次序不改变
参见antlr网站上的
Syntax Directed TokenStream Rewriting

将来

ANTLR 2.6版本为使用记号流提供了基本结构,一旦我们有经验使用它们,今后的版本将会更加强大。

现在的"隐藏记号"流过滤器解决"忽略但保存空白符"的问题解决的很好,但它在很多情况下不能很好的处理注释。例如,在真正的翻译过程中,你想在各种单独的树结点上收集注释(像DECL或者METHOD)而不是把它们分布在树的各个地方。你迫切需要一个流分离器缓冲注释到一个隔离的流中,这时你就可以说"给我在识别这个规则上所用掉的所有注释"或者 "给我这2个记号之间的所有注释." 这几乎是你在注释翻译时所需要的所有功能。

记号流会带来很多便利。大部分人不经常思考关于记号流的事,使得很难去想象可以在其他一些什么地方可以变的更好。让思想更奔放一些。怎样处理嵌入语言的输入片段,就像你所能看到的Java中嵌入SQL(每一个输入的部分被分开并通过不同的流)。怎么样分析含有和不含有调试信息的Java .class文件?如果你有一个可以分析不含调试信息的.class文件分析器,你想用这个来分析含有调试信息的.class文件,不要去管这个分析器,为你的词法分析器新增关于调试信息的结构。然后用一个过滤器分离调试信息记号到另一个流,这样,对两种类型的.class文件,原来的分析器都可以正常工作了。

稍后,我想加一个"视图",这是真正的另一个查看过滤器的方法。想象一下从一个词法分析器(根视图)中发射出一个未加工的记号流。对它,我可以非常轻松的构建一棵视图树。例如,给出一个嵌有SQL的Java程序,你可能想为分析或翻译在输入流上建立视图,会是下面的样子:

stream.perspectives.gif (2679 bytes)

你可以把SQL流或者去掉注释的Java流交给你的语法分析器处理,分析器中的动作也可以去访问注释流。

将来,我还会增加分析器的另一个功能,去生成记号流(或文本)作为输出,就像建立了树一样。用这样方式,多传递分析变得十分自然和简单,因为语法分析器也变成了流的生产者。一个语法分析器的输出可以是另一个语法分析器的输入。

Version: $Id: //depot/code/org.antlr/release/antlr-2.7.6/doc/streams.html#1 $

posted @ 2007-11-13 21:25 CowNew开源团队 阅读(2002) | 评论 (5)编辑 收藏

    看到CSDN上有很多人在讨论汉语言编程,有人把“汉编”骂的狗血喷头,有人在苦苦支撑自己的“民族特色”。我感觉骂 “汉编”的人们是过于西化了,而苦苦维护“汉编”的人们又过于保守了,那么我就发表一下我中庸而又和谐的想法:在目前这种结构化的编程语言中,“汉编”是没有什么意义的,理由我就不说了,很多人已经慷慨陈词了;我认为“汉编”的希望在明天,等到自然语言理论发展起来的时候,“汉编”将会有自己的用武之地。想一下也许下面的代码对于中文或者英文来说没有区别:

if you.tired then you.sleep();

如果 你.累了 那么 你.睡觉

    可是下面的自然语言化的代码就有意义了:

if you're tired ,please fall aleep

累了的话就睡吧/累了就睡呗/如果累了就睡

    想想如果能够实现用自然语言控制计算机的话,汉语言编程还没有意义吗?如果再结合语音识别,那么做为一个纯种中国老爷们儿,你是愿意假装归国华侨似的对着电脑说“Please format disk c if you receive command 'ok'!”,还是愿意用纯种国语说“收到'ok'就把c盘给它格式化喽”呢???
好好发展汉语言的自然语言理论吧。

posted @ 2007-11-12 09:51 CowNew开源团队 阅读(728) | 评论 (9)编辑 收藏

    上午第一个Session:突出重围,使用软件工厂和MSF成功打造优质的企业应用。因为昨天听的一个关于“微软软件工厂”的讲座,所以来听这个Session也是为了加深对“微软软件工厂”的认识的,来了一个才知道这个Session更多讲的是MSF。MSF是微软提出的一个软件开发方法学,我是第一次听说MSF,通过这个Session我感觉MSF是敏捷开发与CMMI的一个结合体。由于采用“微软软件工厂”以后系统就分为核心模块开发和外围Features的开发。采用MSF以后核心模块做不断的持续集成,而外围Features则在核心平台的每一个版本出来以后再做周期性集成。针对目前很多国内项目人数比较少的现状,他提出了进行角色合并的方式来组成一个小团队,比如测试人员和产品经理可以合并,但是开发人员就不能和测试人员合并。
    国内软件企业面临的问题:
(1)、整体软件业在快速增长,但主要在外包领域
(2)、受到国外ISV强烈挑战,没有掌握标准和话语权。大部分是在做系统集成工作。
(3)、平台产品难以外化,成功外化的盗版横行。自己的平台自己用,一旦开放就会被盗版。比如WPS就无法维持金山的生存。
(4)、不重视规避法律问题。很多商业项目中大量使用GPL协议的开源产品。
(5)、项目管理和开发流程不规范,失败率高盈利率低
(6)、时间紧任务急,客户需求多变
(7)、人员素质参差不齐,缺乏优秀团队模型和技术交流
(8)、没有驾驭优质企业应用的经验,上线后问题众多。比如奥运订票网站的当级就是一个最生动的例子。
    通过这个Session,我也终于纠正了我昨天的一个错误“微软软件工厂就是代码生成”,现在我的认识是“微软软件工厂就是基于某些方法论和架构的代码生成”,并且生成的代码也是无法用其他手法消除掉的boring代码。
    上午第二个Session:SilverLight开发的极速体验。讲师是微软的美女郭晓颖(偶也系广大色狼中的一份子),讲座风格很有女孩子的特点,不知道是不是她做讲座的经验不多,感觉语气过于平淡,有点令人boring。SilverLight非常容易开发、调试和部署,可以很容易的自定义控件,并且可以很容易与服务器交互,比如在SilverLight中只要调用被标记为WebMethod的方法就可以很容易的与服务器交互;还可以在SilverLight中调用脚本或者Dom。
    讲座结束以后我提问了我最关心的两个问题:是否可以把自定义的ActiveX控件加入SilverLight(应用场景就是用SilverLight做网银客户端);SilverLight是否可以操作本地硬件(应用场景就是用SilverLight做银行柜员终端显示技术)。这两个问题得到的回答都是“NO”,很失望,看来SilverLight是不能用来做银行相关的这些东西了,也许微软只是把它定位为一个多媒体的东西吧。
    下午第一个Session:SilverLight1.1CLR内核架构。讲师是andrew pardoe和美女郭晓颖。这也是我唯一听的一个英文课程。可能考虑到了在场的大部分是国人,所以andrew的英文发音挺标准、听起来不算费劲,而且他还不时的蹦出几个中国字“你好,我是from。。。来的,不是牛”,呵呵。他主要讲了SilverLight的底层CoreCLR的实现内幕,不熟悉的读者可以把CoreCLR想像成运行SilverLight的虚拟机。CoreCLR和代码实用的是和CLR一样的代码,所以GC(垃圾收集)、JIT(实时编译,呵呵,从JavaHotSpot中学去的技术)都依然是存在的。不过为了减少无用的功能以减小CoreCLR的尺寸以及为了使用沙箱机制来保证应用的安全性,因此移除了正则表达式的编译、本地代码调用等功能,并且对于文件系统的访问也进行了受限处理(这让我想起了J2ME以及Applet)。由于CoreCLR就是SilverLight的虚拟机,所以客户端机器无需安装.Net Framework也能Run SilverLight的应用,这也就是为什么MACOS中也能Run SilverLight了,所以如果有耐心,我们也可以让SilverLight Run在Unix以及其他操作系统下。目前SilverLight即将支持Linux,不过SilverLight是只能运行在SUSE下的,不能运行在其他的Linux下,看来这也是和Novell合作的结果,刚才查了一下SUSE下是使用MONO实现的CoreCLR。
    这个Session中让我感到的一个亮点是我们可以用Python(IronPython)以及Ruby(IronRuby)来写SilverLight(任何能生成CLR的语言都可以用来写SilverLight),也就是完全可以在运行时动态运行SilverLight。andrew用的演示Demo就是IronPython写的一个在线Python命令行界面,在这个界面中敲入Python指令就可以使得SilverLight中的图形发生变化,真的是太棒了。
    讲座完了以后我同样问了andrew一个问题:从Tech-Ed的一开始到现在,我们看到的都是用SilverLight写游戏、写媒体播放器,那么我们是否可以用SilverLight来写企业级应用。也许是andrew只是做CoreCLR底层技术的,所以对这种商业性的问题也并不是很清楚,所以他的回答是:微软是一家大公司,而且我们有很多的合作ISV,所以没有做不到的事情,他还说百度不是用SilverLight做出来企业级应用吗(我注:貌似百度的那个视频播放频道不是我指的那种企业级应用)?他的回答比较失望,再次验证了我的结论:SilverLight只是用来做Game、Player等多媒体应用的东西,微软没有打算让我们用它来做企业级应用的表现层。   

    下午第二个Session:SoftGrid应用程序虚拟化。这个专题也是我最期待的。本以为SoftGrid是开幕式上鲍尔默演示的那个虚拟Office,听了以后才明白鲍尔默演示的是升级版的Windows Terminal,只是进行了输入输出的重定向。而SoftGrid则是另外一种程序的部署方式。程序以文件的形式保存在SoftGrid服务器中,当用户要运行程序的时候,只需要下载程序运行所需的最小组件集合(dll等),然后就可以运行了。程序是运行在客户机的SoftGrid提供的一个虚拟环境中,这个虚拟环境模拟了COM、注册表、字体等关键位置的调用,这样应用程序所做的任何修改都只会影响到这个虚拟环境,不过对客户机产生任何修改,这样就可以轻松运行相冲突的软件了(比如Office2003是不能和Office97同时安装的,但是通过使用SoftGrid,我们就可以在一台机器中同时运行他们)。由于SoftGridClient只是模拟了COM、注册表、字体等,并不像VMWare、VPC那样完全模拟以计算机,所以其运行效率非常高。由于它不像Windows Terminal那样是运行在远程终端服务器中的,所以可以减小服务器的压力、提高客户端的响应,而且不像Windows Terminal那样受服务器版本的限制大,同时当服务器Down掉或者处于脱机环境中的时候程序仍然可以运行(再次提醒,程序是Run在客户端的,而不是运行在服务器端的)。讲师给出的一个性能数据是:一台服务器上可以Run 1000个客户端。
    SoftGrid不是Windows Terminal的终结者,它和Windows Terminal之间是一个互补的解决方案,在某些应用场景下可以发挥各自的优势来实现组合应用。
    不过SoftGrid进行组件的依赖性判断不可能是完全准确的(比如有可能是动态的组件调用或者运行的程序是Java程序),所以如果第一次不是100%下载,那么运行时有可能出错,而如果第一次是100%下载,则就会大大减慢程序的部署速度。不过SoftGrid只是微软的一个刚刚起步的技术,希望它未来的发展不会让我们失望。也许银行的图形前端技术也能用它来实现呢!

    下午第三个Session:通过微软Office Communications Server2007召开企业级的音频视频和在线会议。这是今年Tech-Ed的最后一节课,大部分人已经提前离开九华山庄了,所以参加课程的人非常少,主讲用非常幽默的方式把大家全部集中到了会议室的前边。由于是第一次接触OCS(因为错过了前边了解OCS的Session,所以我把握住了最后这个机会来了解它)。由于听课的人中有相当大一部分(听课的一共才二三十个人,呵呵)不了解OCS,所以主讲首先介绍了OCS,正好满足了我的愿望。OCS是一个非常优秀的企业级的办公系统,可以非常方便的使得员工能够通过语音、邮件、视频等各种方式进行交流,而且可以借助于会议预定、预约等功能轻松的进行时间管理。这个Session主要讲的就是使用OCS来组建公司内网视频会议系统,优点多多,无奈我是门外汉,只是概念上有了了解,这里就不献丑了。最后的一节课我回答对了问题,得到了我的唯一一个奖品:《Exchange Server2007安装部署指南》,正好送给我们公司做信息管理的同事:)。
    三天的Tech-Ed就此结束,离开的时候还有点恋恋不舍。我这三天的“报道”也到此结束了,当然我对Tech-Ed的学习还没有到此结束,不仅因为很多我感兴趣的Session由于与我选的其他Session时间冲突造成没法去学习,而且也因为这三天我接触了很多好东西,需要进一步了解,这样我就需要对照着那三大本讲义继续研究微软产品好的一些东西。以后我也很可能会把我学习的经验教训继续与大家分享,不过这可不是我的promise呀,我尽力吧!好啦,午夜了,也该休息了,这三天睡眠明显不足(听课也比工作更累人,今天早晨都用咖啡来提神了),正好好好利用周六补个觉喽,明天睡到太阳下山,哈哈,晚安!

posted @ 2007-11-10 00:19 CowNew开源团队 阅读(1379) | 评论 (5)编辑 收藏

    上午第一个Session:微软IT Exchange Server2007的架构和设计。本来是想去了解一下Exchange的基本应用的,去了以后才知道是讲微软是怎么搭建他们的全球邮件系统的,由于以前没有用过Exchange,所以听得云里雾里的。主要的思想就是怎么进行网络拓扑设计和防火墙、防垃圾邮件服务器的组合。
    上午第二个Session:SharePoint企业应用集锦。讲了SharePoint的三个典型案例:服务型政府门户、面向知识的文档管理和IT支持管理,没感觉有啥特别的。
    中午在“合作伙伴展区”中看到了博客园的宣传广告,呵呵,祝咱们的dudu越来越好,也希望dudu多来关心俺们blogjava的兄弟呀,别把我们忘了,什么.Net开发者、Java开发者的,大家都是搞技术的,那些区别只是对厂商而言的,咱们都是“开发人员”,不要分那么多小类别,不要搞内斗,呵呵。
    下午第一个Session:深入剖析S+S应用。Saas应用的必备的几个特性:Try before buy(也就是用户在购买之前可以体验);pay what I use(用户只需要购买他需要的服务,减少资源浪费,降低投资);要支持离线应用,并且支持富客户端的前端表现;SIMT(单实例多租用,无需为单个的客户进行个性化开发,所有的客户应用都run在同一个平台下,只是利用其可配置性进行个性化配置)。
    微软这次大会一直在推荐他们收购的FaceBook,也多次提到Saas的基础理论--长尾理论,也就是不像以前的那样只赚富人的钱了,“从1000个穷人那里赚来的钱会和一个富人的钱一样多,但是也许所有从穷人那里赚来钱的总和也许会比从富人那里赚来的钱的总和还多”,也就是降低软件使用的价格,使得更多人能买软件(或者服务)。Saas的生态系统中有两个特色的角色:ISV和Saas hoster,ISV在Saas hoster提供的平台进行应用的开发为最终用户服务,而Saas hoster提供平台、计费交易、监控监管等服务,这样两者双赢共生,想必微软是想成为一个Saas hoster,从而把众多的ISV继续团结到它周围,它继续做第四代软件革命的领导者。微软的Saas让我想起了动易CMS和众多的动易模板提供商之间的关系。
    课中讲了微软给的一个Saas的案例性应用:LitwareHR,这是一个提供人员招聘的服务,企业可以个性化的进行招聘页面的定制。实现可配置性的时候使用了元数据技术。讲师提到了实现可配置性有两种实现技术:预留字段和元数据。预留字段是最传统也是最土的技术,其可扩展性是受限的,不过效率也许会稍微高一点;采用元数据技术(可以在数据库中通过基于DB的扩展键值来实现元数据,也可以使用SQLServer2005提供的XML数据类型来实现)可以实现不受限的可扩展性。
    实现SIMT可以有三种实现技术:Separated DB,每个用户一个数据库,这样数据的安全性最好,实现简单,但是对软硬件的投资需要非常高;Separated Schema,每个用户一个表,这样软硬件投资会少一些;Shared Schema,用户共享一个表,通过一个类似于UserId的字段来分辨当前记录属于哪个用户。
    讲师还演示了微软的“软件工厂”。其实就是代码生成技术,开发人员只要简单配置就可以生成以前需要手工编写的代码。个人感觉这东西没什么,而且我认为“代码生成器”是最土的一种“复用性”技术,只有万不得已的时候采用。不过如果“软件工厂”能发展起来的话,也许能养活一批专门制造各种不同“软件工厂模板”的厂商,也许这又是微软说的“生态系统”吧。
    下午第二个Session:面向Web.netxt的兵器谱。主要讲了SilverLight的优势。SilverLight可以运行在很多主流浏览器上,用户端的操作系统可以是非Windows,而且服务器端也可以支持非Windows操作系统。SilverLight的内容是XML格式,可以很容易被搜索引擎收录到,而Flash则是二进制格式,很难被搜索引擎支持。SilverLight支持DRM(数字版权管理),这样就不用担心像Flash那样被别人盗用了。SilverLight能够支持JavaScript、C#、VB.NET、J#等多种语言编写,容易上手而Flash则支持ActionScript。最重要的,美工人员可以用Expression来进行美工设计,然后生成的工程可以被开发人员在VS.Net Studio以一个工程的形式被打开以进行程序设计,这样美工人员和程序开发人员就可以很好的协作了,不像Flash那样要求开发人员既要懂美工又要懂Development。
    下午第三个Session:基于BizTalk RFID快速构建RFID应用。因为我上大学时候是学物流的,对RFID接触比较多,所以就来“温习”一下自己对RFID的知识了。使用BizTalk RFID我们能容易开发出RFID应用,降低了开发难度。由于RFID涉及到很多非纯软件技术的东西,所以这里就不介绍了,有兴趣可以去搜索“RFID”、“射频”、“条形码”等关键字:)。看起来BizTalk RFID是微软新推出的技术,目前还在需要能进行推广的合作伙伴。
    下午第四个Session:Office Business Application实战:SharePoint在企业SOA环境中的应用。演示了一个真实的基于SharePoint的应用,讲师也是来自微软的一个合作伙伴。看了以后感觉微软的SharePoint、InfoPath、Office之类的系统结合还是非常密切的,用好了的话能轻松解决很多问题,门槛非常低。比如业务人员可以直接使用Excel录入数据,然后可以直接把数据发布到SharePoint中,而SharePoint则会定时把这些数据提交到后台系统。而且我们可以在Excel中嵌入自己用WinForm编写的界面,完全把Excel做成了一个业务系统的前台界面的开发平台了,这样业务人员只要会用Excel就可以了,不仅可以实现各个企业的个性化要求,而且可以直接使用Excel的高级功能进行功能扩展,“会用Excel就会操作所有业务系统”,这一点让我想起了一个叫“Excel服务器”的产品。在普通程序开发中,我们复用的是程序代码;而在SOA中,我们复用的是服务,并且业务人员就可以将这些服务拼装起来从而满足自己的要求。
    晚上是“UC之夜”晚宴,来了美女跳热舞,呵呵。明天是最后一天,期望明天能学到更多东西:)
posted @ 2007-11-09 00:08 CowNew开源团队 阅读(1363) | 评论 (5)编辑 收藏

    微软的技术也许不是最好的,但是确实是把技术与商业化结合最好的公司之一,也是比较具有市场前瞻性的公司;抛弃那些商业色彩过浓的东西,完全站在技术的视角,微软也确实是一个值得去仔细研究的公司。正好公司有一个去参加微软2007技术大会(Tech-Ed)的机会,因此就参加了今年的Tech-Ed。
    早晨6点起床、刷牙、洗脸,6:30打的去首都大酒店,7:20到达首都大酒店,领了人民大会堂的请柬,然后坐班车去人民大会堂,8:10会开始安检、入场。
    9:10分大会开始。微软CEO 鲍尔默(据说是比张飞脾气还大,直接和盖茨拍桌子的主儿)致开幕词,主题是《Dynamic IT》,核心思想就是:目前的IT系统发展已经进入了一个新阶段了,大部分力量投入在旧系统的维护和整合上,因此我们必须去适应这种形势,用Dynamic的技术去建设Dynamic的和谐IT。
    鲍尔默演讲中还穿插的以百度的一个新版音乐网站演示了SilverLight技术,微软把SilverLight放到这么重要的位置来推荐,可以看到微软对SilverLight的推广决心,看来Flash要被小小的动摇一下了。SilverLight这种Smart Client技术确实是不错的技术,希望能帮助我们更容易开发、部署出功能更强的系统。看来这是合久必分呀,C/S发展到B/S,然后又回归到了以Smart Client为基础的C/S,终于令人恶心的Web开发技术早晚淘汰了!
    老鲍讲完了以后,微软大中华区的首席技术官做主题演讲,他主要讲了微软现在主推的三项技术:基于Office套件的办公一体化;Open XML;虚拟化。基于Office套件的办公一体化还是那一套综合利用Live Meeting、Outlook什么的实现无纸化、更高效的办公;Open XML就没啥新鲜的了,还美其名曰“咱们的文档几百年后的后人也能阅读”;虚拟化大部分也很老套,不过令我感觉震撼的是新的远程应用程序部署模式:程序可以将Office之类的应用程序直接在服务器端“推送”到客户端,并且只是放一个几十KB的文件而已,根本不用在客户端安装程序,所有程序都运行在远程服务器中,但是如果单独是这一点并不新奇,因为Citrix metaframe早就实现类似技术了,它的亮点是用户可以直接打开和保存客户端上的文件,而不像metaframe那样只能打开和保存在服务器上的文件。
    11点大会结束,坐车去九华山庄,12点到达九华山庄(离著名的小汤山很近)分会场,1点就餐完毕。因为下午2点课程才开始,所以就在会场里边转悠,在本次大会的赞助合作伙伴的展台前看一下,重点看了一下K2和Bussiness Objects。以前没有听说过K2,它是一家美国公司,专业做工作流开发工具的,开始进军中国市场,看来今后这种专业提供技术解决方案的公司会越来越多的,中国的IT终于该上一个台阶了,不要再继续当世界软件工厂了,要拥有自己的核心技术!也许你没听说过Bussiness Objects,但是不能没听说过水晶报表,是微软把这个小弟亲手扶植起来的,看来OEM的力量强大呀(当时投靠Borland的那些控件厂商跟错了队伍了呀,很多挺好的技术没有得到发扬!)。
    14:00至15:15去听了关于SCVMM的讲座(俺们的盆盆讲的)。主要讲了微软的虚拟化技术,SCVMM(System Center virtual Machine Manangement)是System Center重要的组成部分,应该是由VirtualPc发展起来,不过针对Windows平台进行了更多个性化的定制,这样能够更紧密的和Windows联系(劣势当然就是不再支持Linux之类的系统)。使用虚拟化技术可以减少硬件的投入、提高硬件的资源利用率,更容易的管理。SCVMM还有一个很贴心的功能:自主化服务。使用这个功能,企业的员工完全可以根据自己的需要在服务器上自助化的创建虚拟机,而且用完了可以删除,这样完全不需要公司的硬件运维人员操心了。SCVMM提供的P2V功能可以将一台物理机迁移为一台虚拟机。
    15:30至16:45去听了关于S+S(软件加服务)的讲座。S+S的三剑客:Saas、SOA和Web2.0。用主讲的话说:微软“豪赌”S+S。计算机发展的第一个阶段是提供单独软件;第二阶段是提供IT托管;第三个阶段将是提供服务的阶段。微软收购FaceBook也是基于发展S+S的策略,未来的Office将提供单机版和在线Office两种版本,使用在线Office我们只需要在用的时候按月付费就可以,不用了就不用交钱。而且基于S+S还将形成新的软件生态系统,每个人都可以轻松发布服务和利用其他人提供的服务。像CRM、OA之类的应用完全可以做到以服务的形式购买,只要满足个性化定制的可扩展性就可以,这样也可以养活一些专业做个性化定制的厂商。用主讲的话说:可以把眼光放在S+S,未来的一流IT企业一定会有S+S的公司。讲座中还演示了一个未来IT生活的片段,家庭中一切设备都能互联互通,看电视的时候能在屏幕中看到自己有新邮件,可以直接把在电脑上看的东西切换到车载设备中,片段中还出现了被微软曾经主推但是不温不火的平板电脑。
    17:00至18:15听了关于LINQ的讲座。这是一个纯编程技术的讲座。听了这个讲座使我不再认为LINQ只是一个内嵌的ORM。LINQ分为三个部分:LINQ TO SQL、LINQ TO Entity和LINQ TO XML。LINQ TO SQL是一个内嵌的ORM,在语言级别支持类似于SQL语句的东西;LINQ TO Entity是一个很有意思的技术,感觉和Java中的Quaere和joSQL类似,也就是我们可以用SQL语句的形式对数据进行过滤,比如我们要查找一个类中所有方法名长度大于10的方法,那么只要写类似于下面的语句就可以:select m.name from MyClass.getMethods() as m where m.name.length>10(注意这个代码只是示例性的,LINQ语法不是这样的),不知道这个东西是不是从Java的joSQL借鉴过去的;LINQ TO XML也是可以以更加直观的方式操作XML,并且可以和LINQ TO SQL、LINQ TO Entity很好的结合。偶对LINQ没感觉有啥新奇,因为这些东西在Python中用lambda早就可以实现了,不过还是很佩服微软的学习与融会贯通精神,LINQ确实能提高基于.Net的傻瓜化开发效率。比较奇怪的是主讲竟然对C#3.0中新增的lambda和匿名类(都是为LINQ而生的)感到特别振奋,天哪,这两个技术已经在Java、Python等语言中出现三百多年了。:)。这里没有别的意思,只是感叹一下,希望微软的拥趸们不要拍砖。
    未来还有两天的会程,希望能吸收到更多有用的东西。
posted @ 2007-11-07 23:14 CowNew开源团队 阅读(1620) | 评论 (7)编辑 收藏

《自己动手写开发工具》系统地介绍了SWT、Draw2D、GEF、JET等与Eclipse插件开发相关的基础知识,并且以实际的开发案例来演示这些知识的实战性应用,通过对这些实际开发案例的学习,读者可以非常轻松地掌握Eclipse插件开发的技能,从而开发出满足个性化需求的插件。
本书以一个简单而实用的枚举生成器作为入门案例,通过该案例读者能学习到扩展点、SWT、JET等Eclipse插件开发的基本技能;接着对Eclipse插件开发中的基础知识进行了介绍,并且对属性视图的使用做了重点介绍;最后以两个具有一定复杂程度的插件(Hibernate建模工具和界面设计器)为案例介绍了SWT、Draw2D、GEF、JET等技术的综合运用。

电驴下载地址:http://www.verycd.com/groups/@u2105483/204642.topic

HTTP下载地址:
http://www.cownew.com/Soft/ShowSoft.asp?SoftID=16

http://www.cownew.com/Soft/ShowSoft.asp?SoftID=10
posted @ 2007-11-04 12:34 CowNew开源团队 阅读(806) | 评论 (0)编辑 收藏

《自己动手写开发工具--基于Eclipse的工具开发》
本书系统地介绍了SWT、Draw2D、GEF、JET等与Eclipse插件开发相关的基础知识,并且以实际的开发案例来演示这些知识的实战性应用,通过对这些实际开发案例的学习,读者可以非常轻松地掌握Eclipse插件开发的技能,从而开发出满足个性化需求的插件。.
本书以一个简单而实用的枚举生成器作为入门案例,通过该案例读者能学习到扩展点、SWT、JET等Eclipse插件开发的基本技能;接着对Eclipse插件开发中的基础知识进行了介绍,并且对属性视图的使用做了重点介绍;最后以两个具有一定复杂程度的插件(Hibernate建模工具和界面设计器)为案例介绍了SWT、Draw2D、GEF、JET等技术的综合运用。..
本书不仅适合于Eclipse插件开发初学者学习,对于有一定相关开发经验的开发人员也具有很高的参考价值。

ChinaPub地址:http://www.china-pub.com/computers/common/info.asp?id=36806


目录:

第2章  Eclipse插件开发
2.2  简单的案例插件功能描述
2.3  插件项目的建立
2.3.1  建立项目
2.3.2  调试方式运行插件项目
2.4  改造EnumGeneratoreNewWizardPage
2.4.7  取得界面控件值的方法:
2.5  开发枚举项编辑向导页
2.5.1  初始化
2.5.2  相关环境数据的处理
2.5.3  代码生成
2.6  编写代码生成器
2.7  功能演示、打包安装
第3章  插件开发导航
3.1  程序界面的基础-SWT/JFace
3.1.1  SWT的类库结构
3.1.2  SWT中的资源管理
3.1.3  非用户线程中访问用户线程的GUI资源
3.1.4  访问对话框中的值。
3.1.5  如何知道部件支持哪些style?
3.2  SWT疑难点
3.3  异步作业调度
3.4  对话框
3.4.8  自定义对话框及配置保存与加载
3.5  首选项
3.6  Eclipse资源 API 和文件系统
3.6.1  资源相关接口的常见方法
3.6.2  方法中force参数的意义
3.6.3  资源相关接口的方法使用示例
3.6.4  Eclipse中没有当前项目
3.7  Java项目模型
3.7.1  类结构
3.7.2  常用工具类
3.7.3  常用技巧
3.7.4  设定构建路径实战
3.7.5  如何研读JDT代码
3.8  插件开发常见问题
3.8.1  InvocationTargetException异常的处理
3.8.2  Adaptable与Extension Object/Interface模式
3.8.3  千万不要使用internal包
3.8.4  打开视图
3.8.5  查找扩展点的实现插件
3.8.6  项目nature
3.8.7  透视图开发
3.8.8  关于工具条路径
3.8.9  Eclipse的日志
第4章  属性视图
4.1  基本使用
4.1.1  IPropertySource接口说明
4.1.2  对象实现IPropertySource接口
4.1.3  对象适配成IPropertySource对象
4.2  属性视图高级话题
4.2.1  属性分类
4.2.2  复合属性
4.2.3  常用属性编辑器
4.2.4  自定义属性描述者
第5章  开发Hibernate插件
5.3  实体模型文件创建向导
5.4  模型的定义和模型文件处理
5.5  实体属性描述者
5.6  实体编辑器
5.6.1  字段的编辑
5.6.2  编辑器基类
5.6.3  实体编辑器核心配置界面
5.6.4  多页实体编辑器
5.7  代码生成
5.7.1  代码生成器接口
5.7.2  代码生成器配置文件
5.7.3  代码生成向导
5.7.4  公共工具类CommonUtils
5.8  Hibernate代码生成器
5.8.1  命名策略
5.8.2  工具类
5.8.3  代码生成的JET代码
第6章  基于GEF的界面设计工具
6.1  GEF简介
6.1.1  Draw2D
6.1.2  请求与编辑策略
6.1.3  视图与编辑器
6.1.4  GEF的工作过程
6.2  系统需求
6.2.1  界面设计工具的分类
6.2.2  功能描述
6.3  构建模型
6.4  实现控制器
6.4.1  窗体和组件的控制器
6.4.2  编辑策略
6.4.3  命令对象
6.5  窗体文件创建向导
6.6  组件加载器
6.7  编辑器
6.8  代码生成和构建器
6.8.1  代码生成
6.8.2  构建器
6.8.3  为项目增加构建器
6.9  实现常用组件
6.9.1  标签组件
6.9.2  按钮组件
6.9.3  复选框
6.9.4  编辑框
6.9.5  列表框
6.10  使用演示
《自己动手写开发工具》

posted @ 2007-11-02 17:34 CowNew开源团队 阅读(1511) | 评论 (9)编辑 收藏

    现在大部分软件开发书籍都是讲解某个技术如何用,很少有讲实战的,即使有实战案例的讲解,也是讲解网上购物、聊天室之类已经被人写烂了的系统的开发,最可怕的是书中的实现代码惨不忍睹,使得读者很容易被误导,至于如何进行合理的架构设计就更无从谈起;少数从国外引进的高端技术书籍又大谈特谈各种在天上飞来飞去的理论,“看的时候心潮澎湃,看完之后一脸茫然”,读者不知道如何将这些理论应用到实际的开发过程当中。本书就尝试着打破这种局面,把一个真实的系统搭建从头讲起,不仅包含具体的实现技术,也包含一些架构方面的设计思想。
       这是一本以Java开发语言为载体来讲解企业级信息系统开发的书,其中涉及到了Hibernate、Struts、Spring、JSP、Swing、JDBC等很多技术,而且案例系统的搭建过程中也较合理的使用了面向对象理念进行系统设计,但是书中不可能详细讲解这些技术的使用,读者可以根据需要参考这些技术相关的参考资料。

       序言部分介绍了开发框架等的概念;第1、2、3、4章介绍了正则表达式、AOP、自定义JSP标签等基础知识;第5章给出了案例系统的需求文档;第6章基于Spring技术搭建了案例系统的Remoting部分;第7章构建了一个基于MDA理念的元数据引擎;第8章对案例系统中用到的枚举异常类、工具类等做了介绍;第9、10、11、12章基于Spring、Hibernate等技术搭建了事务、DTO生成器、权限控制、日志记录、多数据库支持等基础模块;第13、14章开发了登录服务、Swing客户端基础模块以及数据选择器等自定义Swing控件;第15章实现了列表界面、编辑界面和编辑界面的基类;第16章搭建了Web客户端的登录界面、主菜单等基础模块,并开发了JSP用的数据选择器等自定义标签;第17章则以前面章节搭建出的基础框架为基础实现了第5章中的需求文档所要求的功能。

   《J2EE开发全程实录》是国内J2EE研究领域里具有里程碑意义的一部作品。作者以通俗易懂的语言将J2EE企业级系统架构设计、开发过程中的看似高深的技术与原理娓娓道来,使得读者在不经意间随着作者的思路一起参透高深的技术理念。阅读完本书我才发现架构设计、设计模式、元数据编程、AOP、分布式开发这些看似高深的理论完全可以很轻松的用来改善系统架构的设计,而Spring 、Hibernate、Struts、Swing、XML这些看似孤立的技术也可以有机的结合起来搭建一个高度灵活的系统架构。相信对于想深入学习基于J2EE技术的企业级系统架构设计与开发技术的读者来说,《J2EE开发全程实录》将是一本不可多得的宝典。

详细地址:http://www.china-pub.com/computers/common/info.asp?id=35167
电子版下载地址:http://soft.hackbase.com/page/2007-07-11/01750187507.Html

posted @ 2007-11-02 17:31 CowNew开源团队 阅读(799) | 评论 (4)编辑 收藏

仅列出标题
共30页: First 上一页 6 7 8 9 10 11 12 13 14 下一页 Last