Read Sean

Read me, read Sean.
posts - 508, comments - 655, trackbacks - 9, articles - 4


一段时间以来大家的MSN都多少出现了无法登陆的情况,这对于依赖MSN作为团队内部沟通的主要工具的我们来说实在是一件很恼火的事情。再加上我们经常有异地开发的情况,出现MSN的问题那就更糟了。

在这个时候我的目光投向了腾讯的TM,没错,就是做QQ的那一家腾讯。其实我们在安装QQ的时候就自动装上了TM,这个东东看上去真的就是MSN+QQ的混血儿,个人觉得更加贴近中国人的需求,只不过由于MSN的历史背景和由捆绑带来的庞大的用户群,使用者甚少:虽然QQ很多人都在用,但是用TM界面的真有点凤毛麟角的味道,至少在我周围很少见到。TM可以选择和MSN一样使用邮件地址作为帐号(其实是把邮箱绑定到一个新的QQ号码上),并且可以和QQ服务器来回切换。

很多功能都还来不及尝试,因为需要有人跟我一起beta一下才知道是不是真的好用。好的话可以考虑在公司内部使用。目前尝试过的两个比较好玩的功能是在线金山词霸和小I机器人。在线词霸你可以输入要查询的单词,然后就好像有人回复你解释一样;小I机器人是一个具备一定AI的自动聊天"机器人",当作消遣还是不错的。看看它都说了些什么:

某某某 12:18:42
hi
小I机器人 12:18:44
hi,我是来自2029年的最新t700型终结者,我现在的任务不是保护约翰-康纳,而是和你聊天! 
某某某 12:18:58
really?
小I机器人 12:19:00
yes
某某某 12:19:07
what can you do?
小I机器人 12:19:08
what is your job?
某某某 12:19:29
are you a cop?
小I机器人 12:19:31
i’m fine and u?
某某某 12:20:10
你在说什么哦?我问你做什么的,你回答说我很好?
小I机器人 12:20:11
你说我说什么,就说什么
某某某 12:20:29
。。。
小I机器人 12:20:32
淹到了?我说的吧,不会游泳就不要下水。这水可是要交费的
某某某 12:21:08
算了,跟你说不明白。走了,拜拜
小I机器人 12:21:09
那就别说了

呵呵,接下来找些感兴趣的朋友测试一下。:)

posted @ 2005-06-20 14:39 laogao 阅读(466) | 评论 (0)编辑 收藏


经常看见网上许多人对SWT的认识无非就是说它运行速度快,其实这是个误区。在SWT诞生之初,也许运行速度是它的一项主要目标,但是它真正的优势其实并非这么简单,让它真正发光的是它对宿主操作系统的忠诚度,一方面,对用户来说,他们操作的界面表现形式,包括外观、快捷键等等可以和他们常用的软件高度一致;另一方面,由于它直接封装操作系统API的这个特性,任何你发现的界面上的问题或者说某个控件特殊的处理方式,你都可以在操作系统这一层的文档中找答案,而不是在SWT中间找。这跟Swing很不一样,Swing追求界面在所有平台的一致性,而不是对当前平台的其他本地应用的一致性。给我的感觉,Swing这样的做法实际上是瞄着一个移动的靶子,永远在赶路,因为它总是需要不停的跟着操作系统的变化和创新而变化与模仿。在这一点上,SWT的做法的确要高明得多。

顺便来看一个WOW魔兽世界的XP界面风格下的Eclipse的截屏:
WOW_Style_Eclipse_Snapshot.jpg

这个界面风格可以随时跟你自己默认的XP风格对换,这样的效果和方便的更替如果要Swing来实现岂不是有点勉为其难?我不是说SWT是万能的,只是想让大家知道,Swing有它好的地方,SWT同样也有。

posted @ 2005-06-20 13:55 laogao 阅读(4554) | 评论 (9)编辑 收藏


空姐也RAP

沪语其实还是蛮好听的叻

posted @ 2005-06-16 12:36 laogao 阅读(1533) | 评论 (6)编辑 收藏


依稀记得多年以前,刚接触编程的时候,就看见老爸成天都在用一种工具,主体是一堆16进制的数据,右边是解析出来的ASCII字符。后来知道这个是一种Hex Editor,用来看二进制文件的。其实它什么文件都可以看,只是你可以很方便的看到文件的内部结构和数据,一个字节不差。

后来进入Windows时代,很多东西都可以用工具方便的完成,而不必关心内部细节,这样的二进制阅读工具也就渐渐远离了我的视线,直到最近,发觉在有些时候,你真的需要看看一个文件里面到底是放了些什么东西,怎么放的。然而网上一搜,10个有9个不是功能太庞杂就是license不友好[1]。拜托,我只想看看一个文件的Hex,难道要我自己用VC或者Java写?这个时候我想到了Eclipse,不论是开源的插件,还是自己写,都是很好的选择。果然,一搜即得,EHEP - Eclipse Hex Editor Plugin。试用一下,完全满足我的需求。看看截图:

EHEP_snapshot_s.jpg

插件主页:http://ehep.sourceforge.net/
Update Site: http://ehep.sourceforge.net/update

注:
[1] 了解我的人可能都知道,我最讨厌那些license来license去的小工具/应用软件。UltraEdit、EditPlus这些东东(我想它们一定都支持HEX吧)不是不好,只是我不喜欢用而已。

posted @ 2005-06-08 11:13 laogao 阅读(2310) | 评论 (2)编辑 收藏


最近被同事问起一道SCJP的题目,是跟继承和多态有关的。具体的题目我就不重复了,来看一段我自己敲的代码:

 1package sean.work.test;
 2
 3public class DoYouReallyUnderstandPolymorphism {
 4    
 5    public static void main(String[] args) {
 6        A a = new A();
 7        B b = new B();
 8        a.s = "[AA]";
 9        b.s = "[BB]";
10        System.out.println(a.s);      // prints "[AA]"
11        System.out.println(b.s);      // prints "[BB]"
12        System.out.println(a.getS()); // prints "[AA]"
13        System.out.println(b.getS()); // prints "[BB]"
14        System.out.println("====================");
15        a = b; // a now refers to object b
16        System.out.println(a.s);      // prints "[A]"  <<--1-- the class A copy
17        System.out.println(b.s);      // prints "[BB]"
18        System.out.println(a.getS()); // prints "[BB]"
19        System.out.println(b.getS()); // prints "[BB]"
20        System.out.println("====================");
21        ((A)b).s = "[AA]"// <<--2-- changes the class A copy in object b 
22        System.out.println(a.s);      // prints "[AA]" <<--3-- class A copy changed
23        System.out.println(b.s);      // prints "[BB]"
24        System.out.println(a.getS()); // prints "[BB]"
25        System.out.println(b.getS()); // prints "[BB]"
26    }

27
28}

29
30class A {
31    String s = "[A]";
32    String getS() {
33        return s;
34    }

35}

36
37class B extends A{
38    String s = "[B]";
39    String getS() {
40        return s;
41    }

42}

43

这里我们的B类继承自A类,重写了getS()方法,于是我们可以利用到多态。如果你留意15、16、21、22这几行的话,你也许就会知道我在说什么了。假如你觉得这样的打印结果是理所当然,那么我想你可以完全忽略这篇随笔,因为我要讲的就集中在这几行,而你已经很清楚的理解背后的含义。

下面跟感兴趣的朋友们说说我的理解:

直观的讲,我们很容易轻信当"a = b;"以后,变量a指向的对象是B类的b那个对象,自然a.s就应该等同于b.s,然而事实并非如此。当B继承A时,父类A的字段s并没有被B的字段s取代,而是保留了一份拷贝,所谓重写(Override),那是对方法而言的。于是,当我们new B()时,在实际创建的对象中,包含了两个版本的字段s,一个"[A]"(属于A类)一个"[B]"(属于B类)。而方法getS()只有一个版本。这就是在继承过程中字段和方法的区别。也就是说,重写的概念和字段无关。在第16行,我们通过a.s访问的是b这个对象中保留的A类的字段s;而在21行,我们改变的正是这个A类版本的s字段。

多态的精髓在于动态确定对象的行为,而对象的行为体现在方法而非字段,字段代表的更多的是对象的状态。于是只有方法的多态而没有字段的多态。从上面的代码可以看出,不管你用什么类型的变量存放对象b的引用,最终调用的方法版本都是b的真实类型那个版本,这就是多态的威力。

从编译的角度来看,上面代码中的s字段和getS()方法的不同在于:s字段是在编译期静态链接(你可以改变它的值,但是它在对象中的相对地址已经确定好),而getS()方法是在运行期动态链接的。

说了这么多,真的不知道我表达清楚没有,毕竟没有系统研究过OO和编译原理,说得不当的地方还请多多包涵。最后,请不要学我这里的编码风格,因为很显然应该对main方法中的代码段执行Extract Method重构了,我这里只是为了注释方便。

// BTW,时不时抽空想想这样的问题感觉真不错。

posted @ 2005-06-07 15:18 laogao 阅读(7663) | 评论 (14)编辑 收藏

前不久重装机器,偶然间发现一款挺方便的Eclipse插件。我们工作中用的是Oracle,于是经常会用到SQLPlus/Worksheet这样的东西,TOAD当然也有,但是SQLPlus用上去确实不方便,TOAD的安装也很麻烦并且我没有license。算了吧,既然一直在用Eclipse,就看看Eclipse上有没有好一点的替代工具吧。于是我发现了SQLExplorer。

这个插件理论上支持所有提供了JDBC的数据库,其实就是把Java代码调用JDBC的操作进行了图形界面的封装。用上去的感觉就是比使用命令行操作数据库确实方便和直观了许多,甚至比某些专门的GUI管理工具要好用不少。

下面是一幅截图,供参考:Eclipse SDK 3.0.2 + SQLExplorer 2.2.3

SQLExlporer_snapshot_s.jpg

当然,这个插件也有不少缺陷,比如不能兼容Eclipse3.1版本(至少M7上跑起来有问题),SQL编辑器的关键字颜色转换,对类似Oracle的RAW格式支持不好,等等,还有一些使用便捷性上的缺陷。并且因为是通过SQL/JDBC的方式操作,有很多数据库专有的特性无法体现。不过总的来说,它是一款不错的SQL浏览器,当你需要在同一个环境操作多个数据库,或者你觉得数据库提供的管理界面不方便,甚至仅仅因为你是Eclipse的狂热爱好者,这个插件都值得一试。

可以在这里找到下载链接:http://sourceforge.net/projects/eclipsesql/

posted @ 2005-06-06 16:15 laogao 阅读(2513) | 评论 (3)编辑 收藏

不知不觉间,Struts已经五岁了,这是一个相当成熟的Web框架,事实上的标准,至今还有很广泛的应用。

我忍不住想,其实像Struts、Spring、TestNG这样的东西背后的核心思想很简单、清晰、直截了当,(当然也有不少创新和大胆的设计)而且多数是业余时间完成的第一个版本,为什么我们中国的程序员就不能做到呢?思维方式?体制?环境?不管是什么,这都是中国软件行业的悲哀。

期待中国原创的开源框架/工具。

posted @ 2005-06-01 09:36 laogao 阅读(691) | 评论 (3)编辑 收藏

目前我们每个人的页面标题前,都有BlogJava字样,这个我没意见,但是我觉得格式并不好。就拿我自己的blog来说,现在的格式是"BlogJava-Sean's stack trace",我觉得从美观和习惯上讲最好能加两个空格:"BlogJava - Sean's stack trace"。

大家的意见呢?

posted @ 2005-05-27 11:05 laogao 阅读(932) | 评论 (6)编辑 收藏

http://www-128.ibm.com/developerworks/opensource/library/os-jface1/

这里有一篇很好的SWT入门文章。

posted @ 2005-05-25 16:35 laogao 阅读(2519) | 评论 (1)编辑 收藏

谢谢kukoo提供的链接,在这篇eWeek的报道中,Eclipse Foundation的executive director,Mike Milinkovich这样形容Eclipse阵营对Sun的心态:“We're not focused on hurting them; we're focused on helping us.” - 我们的注意力并非在如何伤害他们,而是如何帮助自己。我想这很好的诠释了Eclipse对Sun的心态。

最近看到太多的关于NetBeans和Eclipse的争吵,其中很多都是NetBeans的支持者出于对NetBeans项目组的辛勤劳动的肯定和也许是某种意义上的同情,或者真的喜欢使用NetBeans,指出Eclipse有什么什么地方不好,而NetBeans又有多好多好。但是醒醒吧,我觉得整件事是NetBeans阵营太过将Eclipse作为对手和参照物,而Eclipse似乎没有太理会,它有更大的目标。两相比较,两个平台也好IDE也好的竞争是什么结论也就不言而喻了。

对于Sun的开源策略,有行家分析说Sun只是想从开源得到社区支持等好处而并不愿意做出太多贡献和牺牲。这些从近年Sun对JDK/JRE采取的相对严格的发行机制、Solaris的开放源代码、对JCP的控制、同微软的合作、以及最近有关Harmony的争执中都能找到很好的佐证。Sun到底在想什么呢?也许从Sun的角度,他们有足够的理由这样做,我们还是不要过多地妄加猜测了吧。

时间会证明一切。

posted @ 2005-05-25 15:38 laogao 阅读(3963) | 评论 (19)编辑 收藏

刚才忘了说,在3.1M7这个版本中,已经自动支持类似KeepResident插件的功能,当我们在Windows环境最小化Eclipse窗口的时候,Eclipse使用的这一块内存不会再被Windows无聊的回收了。好处是显而易见的,我们不再会碰到离开Eclipse再回来的时候那烦人的等待了。

posted @ 2005-05-25 15:09 laogao 阅读(1490) | 评论 (6)编辑 收藏

下到Eclipse3.1M7后的第一件事当然是看看那个Ctrl-Z回滚的小bug,以前的stable或release版本都存在这样的问题:当你对文件修改但未保存,按下Ctrl-Z可以回到上次保存的状态但Eclipse仍然认为该文件是改动过的。经过测试这个bug确实fix掉了。

另外我还无意中发现一个有趣的新功能。我们知道通常一个包含CVS信息的连接字符串是类似如下的样子:

:pserver:anonymous@cvs.sourceforge.net:/cvsroot/azureus

当我们在Eclipse的CVS Repository视图下面添加Repository Location的时候,我们必须分别手动的填写上面的字符串中包含的信息。在3.1M7中,只需要Ctrl-V粘贴这个字符串到新建Repository Location的对话框,所有信息都会被自动分解和填充,这样对我来说真的方便多了。

Good job, Eclipse!

posted @ 2005-05-25 15:08 laogao 阅读(707) | 评论 (0)编辑 收藏


经常使用Eclipse的朋友大约都知道,Eclipse的文本编辑器一直有一个小小的bug:当你做了修改,但是没保存的话,就算你使用Ctrl+Z回退到改动前的版本,该文件仍然是标记为"*",除非你再次Ctrl+S保存,或者选择关闭然后选择不保存。

这个Bug虽然小,但是当你的项目是多方开发并使用CVS等版本控制的时候就变得很麻烦:你想看别人的代码,但是写的很糟糕,于是你为了自己看得方便就重新排版或者做一些格式修改,或者你不小心做了什么修改,如果你回退回去,编辑器还是认为你修改了,于是你很容易一不小心按了保存,这样CVS便当作改动将本地版本号增长了一次,当你接下来同步的时候就会出现出局更改,当然,如果你只看入局更改,问题倒不大,但是等下次别人再次修改那个文件并上传以后,这个文件同步的时候就会被处理成冲突,而且很可能你就忘记了你改过什么,这就带来了不必要的麻烦,你可能面临做一次文本比较。

通常我的习惯是如果看了某个文件又不小心自己保存了的话,我会立即从CVS拿最新的覆盖,但是毕竟这应该是IDE可以在一定程度上帮我避免的。

现在好了,这个bug已经被fix掉,在所有版本号大于20050420的build中间,我们可以不必再理会它了。

https://bugs.eclipse.org/bugs/show_bug.cgi?id=21493

posted @ 2005-04-22 09:03 laogao 阅读(1032) | 评论 (4)编辑 收藏


Not likely, but the prospect may NOT look as good for JBuilder. Here's an interview transcript with Borland's Raaj Shinde:

http://www.itwriting.com/jbuilderfutures.php

posted @ 2005-04-13 23:18 laogao 阅读(829) | 评论 (2)编辑 收藏


自从接触J2SE 5.0以来,似乎Cedric Beust这个名字就在脑海中挥之不去,大约是跟他在java.sun.com的一篇对J2SE 5.0新特性的介绍文章有关吧,其实这个法国人给人留下印象最深的是他基于JUnit和J2SE 5.0的注解(Annotation)的思想创作的测试工具:TestNG。

用过JUnit的朋友,尤其是经常使用的朋友大概会跟他有同感,那就是JUnit有些时候功能显得太单调,不够灵活,但是很少有人像他那样自己另起炉灶去写一个自己的测试框架。也许这就是我们跟发达国家在技术创新上的差距吧,我想这至少是意识上的差距。

国外各大网站已经前前后后做了不少介绍,国内网站则似乎还没有十分重视这个看上去不起眼的家伙。这究竟是个什么样的工具呢?有些什么特色?大致总结一下就是:

对Java注解的支持
利用XML配置测试过程
不需要实现接口或继承类(如JUnit的TestCase/TestSuite)
支持独立的方法和分组
支持并行测试
测试方法支持传入参数
任意制定的调用次数和成功率统计

现在,我们有机会在Eclipse环境尝试这个测试框架了,还要多多感谢TestNG插件的作者Alexandru Popescu牺牲掉那么多自己的时间。怎么样?跃跃欲试?该插件的update site是:http://beust.com/eclipse/,需要注意的是它目前只支持Eclipse 3.1版本,因为Java注解的原因。

为了简单做一个演示,我随便写了一些代码:

[FooCalculator.java]

package sean.home.test;

public class FooCalculator {
    
    
public static int increaseByOne(int origVal) {
        
return ++origVal;
    }


}


[FooCalculatorTest.java]

package sean.home.test;

import com.beust.testng.annotations.
*;

public class FooCalculatorTest {
    
    
private int origVal;
    
    @Configuration (beforeTestClass 
= true)
    
public void setUp() {
        origVal 
= Integer.MAX_VALUE;
    }

    
    @Test
    
public void testIncreasByOne() {
        
int result = FooCalculator.increaseByOne(origVal);
        assert result 
> 0;
    }

    
}


[TestFooCalculator.xml]

<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >

<suite name="Custom Suite" >
    
<test name="To Test FooCalculator" >
        
<classes>
            
<class name="sean.home.test.FooCalculatorTest" />
        
</classes>
    
</test>
</suite>


完成以后,我们可以在Eclipse中右键选中我们的测试类或者配置文件,选运行TestNG,这样我们就能看到Console视图和TestNG视图中显示的结果了。

更多信息,参考:http://beust.com/testng/

posted @ 2005-04-13 22:10 laogao 阅读(1193) | 评论 (3)编辑 收藏

仅列出标题
共34页: First 上一页 26 27 28 29 30 31 32 33 34 下一页