2009年4月27日星期一

谷歌搜索的bug展示

这个bug我只重现过三次,比较难重现啊。

2009年4月12日星期日

世上最毒的毒药

故事发生在一个遥远的神秘世界。在那里,人们可以制造出不同等级的毒药。这种毒药是致命的,唯一的解药则是更强的毒药。若不幸中毒后,只要及时喝下更强的毒药就没事了,否则不管是谁都会在10分钟之内死亡。
一天,恶魔向国王发起挑战,看谁拥有最毒的毒药。这是一场死亡竞赛,比赛规则很简单:双方各带一瓶毒药,先把对方瓶中的毒药喝掉一半,然后再把毒药换回来,把自己的毒药喝完。10分钟后,活下来的人便赢得这次比赛。恶魔藏有世上已知的最毒的毒药。国王知道,他无论如何也造不出比那更强的毒药来,并且也知道比赛时恶魔用的就是他那瓶绝无仅有的毒药。国王有办法赢得比赛吗?

2009年3月19日星期四

Prototype Pattern

   这是个非常有趣的模式,为什么呢?因为有些Programming Language在语言机制上就给予了支持,有些语言则没有。更有趣的是,有些语言可以简单的利用某些机制来实现强大的原型模式。


   首先我们先来了解一下什么是原型模式,它首先是一个Creational Pattern,所以该模式的目的就是为了创建对象,我们通常都是new一个对象,而这个模式则是通过Clone一个已有的对象从而产生新的可供使用的对象。那到底new一个对象和clone一个对象的区别在哪里呢?下面举个简单的例子(为了简单,以java为例),前提-ClassA是ClassB和ClassC的父类。


ClassB obj = new ClassB();

// we assume po is prototype obj of ClassB.
ClassB obj = po.clone();

我们不难发现一个问题,通过new的方式我们生成一个对象时ClassB是不能被参数化的,除非采用模板机制;而通过clone则完全不同,因为po是可以参数化的。下面给出一段客户端代码:

// Here, po can be ClassA or ClassB or ClassC.
void operation(ClassA po) {
ClassA obj = po.clone;
}

void operation(String type){
ClassA obj = null;
if(type.equals("ClassB")) {
obj = new ClassB();
} else if(type.equals("ClassC")) {
obj = new ClassC();
}
}

很明显第二种客户端几乎是紧耦合的代表性人物。通过以上阐述可能我们现在已经发现问题的本质了,也就是怎样通过类的类型信息来生成类的实例


   我们主要从三种语言的角度进行相关的分析(C++, Java, Javascript):


   首先我们来看C++,C++这种语言在语言机制上没有相应的机制来根据类的类型信息来生成类的实例,所以在C++中只能通过类的实例来识别类型,并调用当前实例的clone方法来生成新的类。


   下面我们来看看Java,对于像C++那种原型模式,Java是Native Support。为什么说Java有趣的,是因为Java有两个非常有趣的机制:Class类型和Reflection。首先Class类型具备了持有类的类型的能力,这样就能够把类型参数化了,然后呢,反射机制又能够通过Class类生成新的对象。通过这样的机制,我们的客户端代码变的挺有趣的:


void operation(Class prototype){
ClassA obj = prototype.newInstance();
}

这样一来,我们的原型就成了Class了。Prototype Manager就变成了虚拟机的ClassLoader了。


   下面我们再来看看Javascript,由于Javascript强大的反射机制使的在js中使用模板简直就像在玩儿,我们来看个例子:


void operation(/* String */ prototype){
var obj = eval(prototype);
}
// call code
operation("new MyObj(\"Hello\")");

这样一来,我们的原型成了String类型的实例了,而且由于是String,我们的还可以传参数呢。



   综上所述,原型模式其实就是要想办法把类的类型具象化成一种可以携带类型的装置,然后利用语言的特性根据该装置生成新的类的实例。

2009年3月17日星期二

重新阅读 Design Pattern

  第一个接触的设计模式应该是单例吧,然后就觉得挺神奇。兴趣是第一老师嘛,来了兴趣于是就赶紧满足一把,在一位老师的推荐下买了一本1000多页的阎宏的《Java与模式》,以100页/天的速度搞定。

   看完之后就在自己的代码中不断的学以至用,这一晃好几年都过去了。去年过年的时候在china pub的二手书里看到了那本传说中的四人帮的经典巨作,一看到这种书手就痒痒,于是订了一本,毕竟是心血来潮,买了之后就躺在寝室当摆设了。今天刚好有事出去,就把它揣在书包里了,路上闲来无事翻翻,这一翻不打紧啊,差点把自己吓死,对比自己的理解跟作者的理解还差“一大大大大截”。希望再两年之后能缩短成“一大大截”吧,呵呵,勉励自己吧。

   Design Patter, 你太牛A了!

2008年12月14日星期日

要开始看书了,激励一下自己

   随着金融危机的降临,现在工作这么难找,不多读点书看来挺难找到工作了。列出了自己下周要读的书单,激励一下自己。
  1. Continuous Integration
  2. Test Driven Development
  3. A First Step Towards the Semantic Web
  4. Algorithms in C++
  5. College Writing Skills With Reading
希望自己能在下周之前完成前3项。

2008年7月9日星期三

The folder of eclipse small icons

It is always boring to find pretty icon on the web. Recently I found it's really good way to get some useful icon from eclipse. The below is the path of eclipse:

org.eclipse.debug.ui/icons
org.eclipse.pde.ui/icons
org.eclipse.jdt.ui/icons
org.eclipse.vcm.ui/icons
org.eclipse.team.ui/icons
org.eclipse.ant.ui/icons
org.eclipse.help.ui/icons
org.eclipse.ui/icons
org.eclipse.ui.views/icons
org.eclipse.ui.console/icons

Good Luck!

2008年7月2日星期三

Tired life

Work hard is really a tired life style. But how to change this? Work smart?
Today i'll do this step by step.
1. have a plan for today.
2. have a aim for today.
3. have a rest for today.
4. have a happy mood for today.