2010/02/03

Jetty WebSocket Server

Jetty WebSocket Server


http://blogs.webtide.com/gregw/entry/jetty_websocket_server


-------


this is very interesting, like comet.



2010/01/19

The Google Collections Library, version 1.0-final, was released on December 30, 2009

今天看到InfoQ上的一个“旧闻”,是关于google collections的,又再仔细看了一下,看来项目里面应该引入这个包。

- 主要亮点在于:

  • Immutable Collections,适用于各种并发处理场景
  • New collections types: Multiset, Multimap, BiMap
  • Ordering,太方便了,而且代码可读性好多了
  • Iterables and Iterators,性能应该有改进不少

- 结论(摘自Sune Simonsen)

In my opinion Google Collection will definitely improve your code, making it more readable and save you from creating your own error-prone implementation of the functionality already provided and tested by Google. I think that it is especially good that the library extends the standard library in a non intrusive way, instead of creating a parallel collection library. This also means that you can choose to use only the convenience classes and not spreading Google specific types all over your system if that worries you.

- references:

http://bwinterberg.blogspot.com/2009/09/introduction-to-google-collections.html

http://blog.jayway.com/2009/10/22/google-collections/

2010/01/15

NoSQL探索2:Amazon's Dynamo

最近看了一下Dynamo的一份演讲和一份论文,初略的了解了一下Dynamo的内涵。


Dynamo Key Focus


- opaque data persistent, accompanying keys which identify them


-




2010/01/07

NoSQL探索1:认识MongoDB

- 基本特性,直接引用官网描述


Combining the best features of document databases, key-value stores, and RDBMSes.


MongoDB (from "humongous") is a scalable, high-performance, open source, schema-free, document-oriented database. Written in C++, MongoDB features:



  • Document-oriented storage (the simplicity and power of JSON-like data schemas)


  • Dynamic queries


  • Full index support, extending to inner-objects and embedded arrays


  • Query profiling


  • Fast, in-place updates


  • Efficient storage of binary data large objects (e.g. photos and videos)


  • Replication and fail-over support


  • Auto-sharding for cloud-level scalability


  • MapReduce for complex aggregation


  • Commercial Support, Hosting, and Consulting


MongoDB bridges the gap between key-value stores (which are fast and highly scalable) and traditional RDBMS systems (which provide structured schemas and powerful queries).


- 索引方面


“Formally speaking, these indexes are implemented as "B-Tree" indexes.”


在索引方面,采用的还是B-Tree索引的,无法多索引做交集运算(intersect),无法满足我的多字段组合查询的需求。


只能说符合了Schemaless, Key-Value store两个特点,加上基于索引的查询接口。


- 分布式架构


分布式特性、Replication、Fail-over、MapReduce这几个还是比较有价值的。



单元测试代码覆盖-Atlassian Clover试用小记

今天试用了一下Atlassian Clover代码覆盖工具,感觉很不错。


如果准备实践TDD,推荐试用一下这个工具。


Clover使用方式有三种:


- IDE集成,可支持IDEA, Eclipse


- 项目管理工具集成,可支持Ant,Maven, Command Line Tool


- CI服务器集成


支持如下功能:


- Class Coverage Distribution


- Class Complexity


- Coverage Tree Map


小巧,方便,如果搭配Atlassian的JIRA, BAMBOO等产品一起使用,应该对开发效率提高不少吧,而且有利于提高代码质量。



2010/01/05

Wedding@Pujiang

补记,前几天没法上网而且太忙。


2010.01.03:Wedding@Pujiang


这是2010年的第一件大事,也是我人生中的一件大事。


谢谢岳父、岳母、妈妈、弟弟,最感谢的是老婆这么多年的不离不弃!



2010新年计划

2010已经来到了。还是需要拟定一下计划:


- 工作方面


1. 把自己负责的产品开发好,起码要做到自己满意、客户不抱怨。


2. 注意团队建设,增加团队沟通。


- 技术方面


1. 进行一些技术探索,主要是NOSQL方面的。


2. 坚持把这个博客写下去,不要半途而废。


3. Cocoa/Cocoa touch方面,真正完成两个iPhone应用,不要浪费了$99申请的ADP(2010.10到期)。


4. 力争看几篇海量数据处理方面的论文,跟入一两个开源项目(比如FastBit)。


- 个人方面


1. 在合适的时间点和情况下,希望能够买房,这是提高生活质量的前提,也是为了最亲爱的人。


2. 能够扩大生活接触面,现在状态太宅了。



2009/12/29

Grails 1.2初体验

根据Grails 1.2的README:


Grails is a web application framework based on the Groovy language that endorses the DRY (don't repeat yourself) and coding-by-convention philosophies. Grails runs on the Java Virtual Machine and thus has access to the entire Java Platform.


With Grails you can easily create web applications thanks to:


- a complete development and deployment environment. All dependencies and configuration that is required to the run Grails applications in a web server are provided by Grails. The only thing you have to worry about is your application code.


- inclusion of an embedded web server


- development mode that automatically reloads changes made to application code, without having to restart the web server.


- automatic persistence mapping of domain classes with automatic relationship management.


- scaffolding on data access classes for rapid development of CRUD (Create, Read, Update, Delete) operations.


- powerful view technology with dynamic tag libraries and support for Groovy Server Pages (GSP)


初步试用了Grails,随记如下:


1. 安装比较简单方便,(当然比rails稍稍复杂,这个主要归功于gem的包管理),上手也算比较快。


2. generator等命令的使用上没有rails的自然,需要一些时间适应,另外一个就是感觉每个命令执行都有点慢,可能要研究一下Grails是怎么运作的。


3. domain-class完全是无侵入的POJO,这个是非常的不错。


4. 默认已经包含了59个依赖库(Grails 1.2已经全面采用Spring 3.0了),配置方面还是稍嫌复杂,不过和一般的Java WEB项目比起来,还是简洁不少。


5. groovy语言语法不太习惯,相反ruby倒是比较容易适应。


6. 数据的持久化方面,新手可能会有些疑惑,还没搞明白怎么重启应用而保留数据。


7. 目录结构方面似乎不够Rails的清爽。


管中窥豹,这些就是Grails的初体验,之后再找时间更深入的了解一下Grails,毕竟是SpringSource在大力推动的,而且现在JVM上的脚本语言应该还是比较有意思的。



2008/05/06

Hibernate的延迟加载的解决

最近项目里面的Hibernate采用了延迟加载的方式,但是老是出现Session已经关闭的问题。通过google发现可以采用OpenSessionInViewFilter方式解决。但是加入了osiv过滤器后,问题依旧存在,经过几天的测试,配置了各种hibernate.transaction_class和hibernate.current_session_context_class方式后,问题依旧。

通过分析OpenSessionInViewFilter的源码,发现问题的真实所在:osiv中使用的session是通过SessionFactoryUtils.getSession(sessionFactory, true)获取的,并且在请求开始的时候设置FlushMode为never,在请求结束时进行flush处理;而我在DAO中是采用sessionFactory.getCurrentSession()方式获取的。初步判断问题是这两种方式获取的session是不通的,导致dao获取的PO对象,在延迟加载的时候,session由于transaction的commit而关闭了。

解决方案:在DAO中与osiv方式相同的采用SessionFactoryUtils.getSession(sessionFactory, true)获取session,结果延迟加载问题解决。

2008/04/27

Firefox 3.0b5 on Mac 10.5.2

从昨天试用Firefox 3.0b5到现在,感觉很满意,初步决定用Firefox3作为默认浏览器了。

P.S. 请问谁知道Safari中,怎么样让网页强制采用设置的字体作显示?现在Safari下的字体太丑了,烦。

2006/08/31

[转]Ioc模式(又称DI:Dependency Injection)

Ioc模式(又称DI:Dependency Injection)

板桥里人 http://www.jdon.com 2004/01/31

  分离关注( Separation of Concerns : SOC)是Ioc模式和AOP产生最原始动力,通过功能分解可得到关注点,这些关注可以是 组件Components, 方面Aspects或服务Services。

  从GoF设计模式中,我们已经习惯一种思维编程方式:Interface Driven Design 接口驱动,接口驱动有很多好处,可以提供不同灵活的子类实现,增加代码稳定和健壮性等等,但是接口一定是需要实现的,也就是如下语句迟早要执行:

  AInterface a = new AInterfaceImp();

  AInterfaceImp是接口AInterface的一个子类,Ioc模式可以延缓接口的实现,根据需要实现,有个比喻:接口如同空的模型套,在必要时,需要向模型套注射石膏,这样才能成为一个模型实体,因此,我们将人为控制接口的实现成为“注射”。

  Ioc英文为 Inversion of Control,即反转模式,这里有著名的好莱坞理论:你呆着别动,到时我会找你。

  其实Ioc模式也是解决调用者和被调用者之间的一种关系,上述AInterface实现语句表明当前是在调用被调用者AInterfaceImp,由于被调用者名称写入了调用者的代码中,这产生了一个接口实现的原罪:彼此联系,调用者和被调用者有紧密联系,在UML中是用依赖 Dependency 表示。

  但是这种依赖在分离关注的思维下是不可忍耐的,必须切割,实现调用者和被调用者解耦,新的Ioc模式 Dependency Injection 模式由此产生了, Dependency Injection模式是依赖注射的意思,也就是将依赖先剥离,然后在适当时候再注射进入。

Ioc模式(Dependency Injection模式)有三种:
第一种类型 从JNDI或ServiceManager等获得被调用者,这里类似ServiceLocator模式。 1. EJB/J2EE
2. Avalon(Apache的一个复杂使用不多的项目)
第二种类型 使用JavaBeans的setter方法 1. Spring Framework,
2. WebWork/XWork
第三种类型 在构造方法中实现依赖 1. PicoContainer,
2. HiveMind

  有过EJB开发经验的人都知道,每个EJB的调用都需要通过JNDI寻找到工厂性质的Home接口,在我的教程EJB是什么章节中,我也是从依赖和工厂模式角度来阐述EJB的使用。

  在通常传统情况下,为了实现调用者和被调用者解耦,分离,一般是通过工厂模式实现的,下面将通过比较工厂模式和Ioc模式不同,加深理解Ioc模式。
工厂模式和Ioc

  假设有两个类B 和 C:B作为调用者,C是被调用者,在B代码中存在对C的调用:

public class B{
   private C comp;
  ......
}

  实现comp实例有两种途径:单态工厂模式和Ioc。

工厂模式实现如下:

public class B{
   private C comp;
  private final static MyFactory myFactory = MyFactory.getInstance();

  public B(){
    this.comp = myFactory.createInstanceOfC();

  }
   public void someMethod(){
    this.comp.sayHello();
  }
  ......
}

特点:

* 每次运行时,MyFactory可根据配置文件XML中定义的C子类实现,通过createInstanceOfC()生成C的具体实例。

使用Ioc依赖性注射( Dependency Injection )实现Picocontainer如下,B类如同通常POJO类,如下:

public class B{
   private C comp;
  public B(C comp){
    this.comp = comp;
   }
   public void someMethod(){
    this.comp.sayHello();
   }
  ......
}

假设C接口/类有有一个具体实现CImp类。当客户端调用B时,使用下列代码:

public class client{
   public static void main( String[] args ) {
    DefaultPicoContainer container = new DefaultPicoContainer();
    container.registerComponentImplementation(CImp.class);
    container.registerComponentImplementation(B.class);
    B b = (B) container.getComponentInstance(B.class);
    b.someMethod();
   }
}

  因此,当客户端调用B时,分别使用工厂模式和Ioc有不同的特点和区别:

  主要区别体现在B类的代码,如果使用Ioc,在B类代码中将不需要嵌入任何工厂模式等的代码,因为这些工厂模式其实还是与C有些间接的联系,这样,使用Ioc彻底解耦了B和C之间的联系。

  使用Ioc带来的代价是:需要在客户端或其它某处进行B和C之间联系的组装。

  所以,Ioc并没有消除B和C之间这样的联系,只是转移了这种联系。
  这种联系转移实际也是一种分离关注,它的影响巨大,它提供了AOP实现的可能。
Ioc和AOP

  AOP我们已经知道是一种面向切面的编程方式,由于Ioc解放自由了B类,而且可以向B类实现注射C类具体实现,如果把B类想像成运行时的横向动作,无疑注入C类子类就是AOP中的一种Advice,如下图:

  通过下列代码说明如何使用Picocontainer实现AOP,该例程主要实现是记录logger功能,通过Picocontainer可以使用简单一行,使所有的应用类的记录功能激活。

首先编制一个记录接口:

public interface Logging {

  public void enableLogging(Log log);

}

有一个LogSwitcher类,主要用来激活具体应用中的记录功能:
import org.apache.commons.logging.Log;
public class LogSwitcher
{
  protected Log m_log;
  public void enableLogging(Log log) {
    m_log = log;
    m_log.info("Logging Enabled");
  }
}

一般的普通应用JavaBeans都可以继承这个类,假设PicoUserManager是一个用户管理类,代码如下:
public class PicoUserManager extends LogSwitcher
{

  ..... //用户管理功能
}
public class PicoXXXX1Manager extends LogSwitcher
{

  ..... //业务功能
}
public class PicoXXXX2Manager extends LogSwitcher
{

  ..... //业务功能
}

注意LogSwitcher中Log实例是由外界赋予的,也就是说即将被外界注射进入,下面看看使用Picocontainer是如何注射Log的具体实例的。


DefaultPicoContainer container = new DefaultPicoContainer();
container.registerComponentImplementation(PicoUserManager.class);
container.registerComponentImplementation(PicoXXXX1Manager.class);
container.registerComponentImplementation(PicoXXXX2Manager.class);
.....

Logging logging = (Logging) container.getComponentMulticaster();

logging.enableLogging(new SimpleLog("pico"));//激活log

  由上代码可见,通过使用简单一行logging.enableLogging()方法使所有的应用类的记录功能激活。这是不是类似AOP的advice实现?

  总之,使用Ioc模式,可以不管将来具体实现,完全在一个抽象层次进行描述和技术架构,因此,Ioc模式可以为容器、框架之类的软件实现提供了具体的实现手段,属于架构技术中一种重要的模式应用。J道的JdonSD框架也使用了Ioc模式。

参考资料:

Inversion of Control Containers and the Dependency Injection pattern

A Brief Introduction to IoC

Ioc容器的革命性优点

Java企业系统架构选择考量

IOC模式的思考和疑问
发表相关讨论...