2006年12月26日星期二

深圳地震?

2006年12月26日20:35分,随着电脑桌的左右晃动,我开始感到一点点头晕,呃,我手已经离开桌子了啊,呃,身后的衣服也在前后摆动,地震!?看到QQ上的同事也在说有震感,赶紧询问他们所在地点,发现前海至后海至白石洲片区都有震感,看来是地震了,晕,不知道半夜会不会有问题,希望能熬到明天,到公司了肯定就能知道确切消息了,圣诞才过啊,我也只发了一个“生蛋快乐”了啊,不至于吧,晕

后记:看到新闻了,“

新华网最新消息:新华网北京12月26日电 据中国地震台网测定,北京时间12月26日20时26分和34分,在南海海域(北纬21.9度,东经120.6度)发生7.2、6.7级地震。震中距大陆最近海岸线约350公里,距台湾陆地约15公里。

美联社12月26日报道,据日本气象机构称,北京时间2006年12月26日20时34分 在台湾恒春(北纬21.9,东经120.5) 发生7.2级地震。地震产生的3英尺(约1米)高海啸正袭击菲律宾东海岸的巴斯科,据日本气象机构称,海啸可能对该地区产生破坏。

地震震中在距离台北恒春13英里的海中,恒春距离台北260英里。目前尚无人员伤亡报告。

美联社称,在初次地震9分钟之后,台湾发生了第一次余震,震级为6.4级,高雄到屏东的电话线路被切断。”

阿弥陀佛,祝福所有的人,希望不要又来大海啸伤人。

2006年12月19日星期二

GEF中无法获得MouseRelease和MouseDoubleClick事件的原因

调试了一下程序,发现MouseRelease事件还是产生了的,只是到了GEF这一层就开始变了
DomainEventDispatcher的dispatchMousePressed()中设置了editorCaptured标志为true,当执行dispatchMouseReleased时通过判断发现此标志为true,就不会将MouseEvent发送到Figure了,它这样做应该是为了将mouseReleased变为判断Drog落下或者DirectEdit的标志,也就是变成了Request发送到EditPart去了,所以不发送给Figure。

我是这样解决的:
通过在figure的mousePressed事件中将MouseEvent.consume(),这样MouseEvent就不会传递到Editor中,这样下次就会直接传递到Figure了。

2006年12月17日星期日

SWT 全接触[转载]

SWT 全接触

1.SWT简介

SWT-"Standard Widget Toolkit",它是一个Java平台下开放源码的Native GUI组件库,也是Eclipse平台的UI组件之一。从功能上来说,SWT与AWT/SWING是基本等价的。SWT以方便有效的方式提供了便携式的(即Write Once,Run Away)带有本地操作系统观感的UI组件:




由于widget系统的固有复杂性以及平台之间微妙的差异,即使在理想情况下,能够达到工业标准的跨平台的widget类库也是很难编写和维护的。最早的AWT组件现在被认为是样貌丑陋的,而且存在很多问题;SWING组件虽然也是缺点多多,但是随着JDK版本的不断升高,它仍在不断进行着改进。我认为,SWT在功能上与AWT/SWING不相伯仲,但是组件更为丰富,平台表现稳定,BUG也相对较少。如果你的应用程序真的需要在多个平台上运行,需要更为美观的界面,又不那么依赖于其他基于AWT/SWING的图形库,那么SWT或许是一个比AWT/SWING更好的选择。





2. SWT起步

2.1 SWT的HelloWorld

一如介绍其他程序的起始,我们都需要来一个HelloWorld来帮助我们入门,SWT的HelloWorld如下:


import org.eclipse.swt.widgets.*;
public class HelloWorld
{
public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("Hello World");
shell.setSize(200, 100);
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep ();
}
display.dispose ();
}
}



运行这个程序就会得到如下结果:




下面我讲逐一介绍这个程序所包含的内容。

Display
这是一个顶层容器组件,类似于Container或Component的功能,它主要负责与底层的窗口系统之间的连接。在具体含义上,它代表"屏幕"。
一个Display可以包含多个Shell(也是容器组件,下面会介绍到)。
通常情况下,一个应用程序只含一个Display,即Display通常是一个单例组件(Singleton)。
Shell
它表示位于"屏幕"上面的"窗口",是Composite组件和Control组件构成的组件树的根。
在我们的HelloWorld程序中,我们可以设置标题(setText()),设置大小(setSize()),然后通过open()方法来显示这个窗口。怎么样,感觉很像JFrame吧?其实功能上差不多。
Composite
可以包含其它Composite和Control的容器
Control
这是一个重量级(HeavyWeight)系统对象。像按钮(Button),标签(Label),表格,工具栏和树形结构这些组件都是Control的子类,Conposite和Shell也不例外。
2.1.1 消息循环

我们可以看到,上面的代码中有这样的语句:


while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep ();
}



如果你像我一样是由Java语言起步的,那么你会对这个消息循环的代码感到比较陌生,毕竟在SWING中我们主要利用事件驱动模型而不这样利用类似于Windows程序设计中的消息循环的方法来处理事件。但是这段代码意义还算简单明了,就是反复的读取和分派(dispatch)事件,并在没有事件的时候把控制权还给CPU。

2.1.2 资源的释放

最后一条语句是display.dispose ();,这告诉我们操作系统的资源是由程序员显示释放的。资源的释放遵循以下两条规则:

1. 如果你创建了某个资源,那么你就有责任释放它。

2. 释放父组件资源的同时也释放了其子组件的资源。

2.1.3 标准构造函数

窗口组件被创建的时候必须伴随一个他的上层组件,例如,我要建立一个按钮就可以采用如下方法:Button button = new Button(shell, SWT.PUSH);

其中,Button的父组件Shell是必不可少的,这样就限定了我们生成组件的顺序。

第二个参数被称为"Style Bit",表示了这个组件的显示特性,每种特性占一位,如下例所示:


Text test=new Text(group, SWT.SINGLESWT.BORDER);



这条代码生成了一个单一的,有边框的文本框。这显然又与习惯了JavaBeans模型,总是用setXXX()来设置属性的我们不太适应--毕竟是IBM的东西啊,秉承了其产品不易上手的传统。

2.1.4 错误与异常




SWTError指的是不能修复的错误,以及一些操作系统错误。

SWTException指的是一些可恢复的错误以及无效的线程访问之类的错误。

IllegalArgumentException指可修复的错误或参数为null之类的错误。

2.1.5 Item

Item类是一个轻量级的系统对象,总是作为基本的单位元素与其他一些类配合使用。比如Tree中的元素即为TreeItem,Table的单位元素则是TableItem,而MenuItem就是Menu的基本单位元素了。

2.1.6 SWT的类阶层体系结构




最后让我们来整体认识一下整个SWT窗口组件的层次结构,如下所示:以上的部分给我们以整体的认识,即一个SWT引用程序应该怎么创建,其基本的运行规则和相关类的体系结构。我想我就不用再对每一个控件的API或使用方面费唇舌了,熟悉这些东西是体力劳动,而网上有很多例子可供参考。下面一节我将详细介绍有关SWT布局的相关知识。

2.2 SWT的布局管理

相信对于组件的布局(Layout)大家都不会太陌生,它的存在就是提供给我们一种可以在组件位置移动或更改大小时重新绘制组件的机制。设置组件的布局我们可以采用Composite.setLayout()方法来实现。

每种布局都有其相应的数据(Layout Data),可以通过Control.setLayoutData()方法来进行关联。以下是一些布局类及其显示效果:

FillLayout:让所有子组件等大小的"填满"整个面板空间。
FillLayout是最简单的一个布局类,它将所有窗口组件放置到一行或一列中,并强制他们的大小也相等。FillLayout不能外覆(wrap),也不能定制边框和距离。很显然这样的限制让这个布局类最适合作类似于计算器面板的布局,或者为Taskbar和Toolbar上面的按钮作布局使用。

RowLayout:类似于AWT中的FlowLayout,让所有组件按行排列,一行排不下就放到下一行。
RowLayout比FillLayout用得更广泛一些,原因很简单,就是RowLayout支持FillLayout所部支持的功能,例如能够外覆,能够修改边框和间距等等。另外,每一个位于RowLayout中的窗口组件都可以通过设定一个RowData类来指定其在RowLayout中的宽度和高度。

GridLayout: GridLayout是3个标准布局类中最有用的,但同时也是最复杂的--没办法,强大的功能必定伴随着一定程度的复杂性。通过GridLayout,一个Composite的子窗口组件被放置在一个网格(Grid)之中。GridLayout有很多配置字段,并且和RowLayout一样,每一个布局于其中的窗口组件都可以有一个与之相关联的布局数据类,称为GridData。GridLayout的强大功能是通过对于每一个窗口组件的GridData的灵活控制来实现的。
鉴于GridLayout的复杂性(原本我就怀疑它根本就不是为手工书写代码而设计的),我并不建议各位直接手动书写GridData,最好借助可视化的工具(如VI)来帮助我们完成用GridLayout进行的界面设计。这样我们只需要书写少量控制代码,就可以获得复杂的界面布局了。

FormLayout:如图所示

StackLayout:几乎完全等同于CardLayout的功能。

在SWT中,位置和大小的变化并非自动发生的。应用程序既可以在Composite子类的构造函数中指定初始位置和大小,也可以在一个改变窗口大小的监听器中用布局类来定位和改变Composite子类的大小。

下面的一幅图包含了我们将要讨论的有关布局的大部分细节。一个Composite类的可显示区域分为三个部分,分别是Location,clientArea和trim。Composite的大小就是clientArea和trim的区域之和。一个布局类(Layout)的主要功能就是管理Composite子组件的大小和位置。通过布局类,我们可以管理子组件之间的距离-即间距(Spaceing),子组件与布局边缘之间的距离-即边距(margin)。布局的大小同时也是Composite的clientArea的大小。




至此,关于SWT的基础部分就告一段落,希望能够给大家以一个对于SWT的总体认识。下面的部分将主要介绍SWT的弱项-绘图。JGraph的一个作者就表达了对SWT/JFace/Draw2D的不满,认为SWT在执行效率上并没有什么改善,而且缺乏一些有用的API实现。话虽如此,但SWT的基本绘图功能还是不错的,如果有足够的时间和耐心的话还是可以绘出想要的图形的。下面就让我们看看SWT如何绘制2D和3D图形。






回页首




3. 用SWT绘制2D图形

用SWT绘图通常由两种方法,一种是借助Graphics Context,另一种是利用Draw2D。然而Draw2D是一个基于SWT Composite的轻量级组件,于是在效率上,它无法体现出SWT的Native Code的速度优势。故其虽然强大,但仅适用于绘图工作不是系统瓶颈的应用程序。所以我在这里只介绍第一种方法。

3.1 Graphics Context

我们可以在任何实现了org.eclipse.swt.graphics.Drawable接口的类上绘制图形,这包括一个控件,一幅图像,一个显示设备或一个打印设备。类org.eclipse.swt.graphics.GC是一个封装了所有可执行的绘图操作的图形上下文(Graphics Context)。两种使用GC的方式我们已经在本节前言中提过,稍后会作详细说明。

3.2 在一幅图像上绘制图形

下面一段代码创建了一个带有图像的GC并在上面绘制了两条线:


Image image = new Image(display,"C:/music.gif");
GC gc = new GC(image);
Rectangle bounds = image.getBounds();
gc.drawLine(0,0,bounds.width,bounds.height);
gc.drawLine(0,bounds.height,bounds.width,0);
gc.dispose();
image.dispose();





一旦你创建了一个GC,你就有责任通过它的dispose方法释放它的资源。一个由应用程序创建的GC需要立即被绘制,然后尽快释放掉。这是因为每个GC都需要一个底层的系统资源,而在某些操作系统中这些资源是稀缺的,像Win98就只允许同时创建五个GC对象。

3.3 在Control上绘图

类org.eclipse.swt.widgets.Control是可绘制的,所以你可以用像在图像上一样的方式来绘制图形。而和在图像上绘制所不同的是,如果你使用GC在一个Control上绘制图形,你需要知道当操作系统自身要绘制这个control的时候,它将覆盖掉你的改动。所以在一个Control上绘制图形的正确方法是加入其绘制事件的监听器。监听器类为org.eclipse.swt.events.PaintListener,其回调函数的参数是一个org.eclipse.swt.events.PaintEvent类的实例。这个PaintEvent实例中包含一个GC的引用,你可以向这个GC发送消息。下面的代码示例说明了如何建立这种类型的绘图:


Shell shell = new Shell(display);
shell.addPaintListener(new PaintListener(){
public void paintControl(PaintEvent e){
Rectangle clientArea = shell.getClientArea();
e.gc.drawLine(0,0,clientArea.width,clientArea.height);
}
});
shell.setSize(150,150)





3.4 剪切(Clipping)

GC的剪切域是可见绘图发生的部分。在缺省情况下,一个GC是一个被构造的可视部分边界。改变一个GC的剪切域可以让我们构造出各种图形效果。其中的一个例子是如果你想填充一个缺失了边缘的矩形。一种方法是绘制多边形矩形来组成所需要的图形,另一种方法就是剪切GC,然后对其剪切部分进行填充。


shell.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
Rectangle clientArea = shell.getClientArea();
int width = clientArea.width;
int height = clientArea.height;
e.gc.setClipping(20,20,width - 40, height - 40);
e.gc.setBackground(display.getSystemColor(SWT.COLOR_CYAN));
e.gc.fillPolygon(new int[] {0,0,width,0,width/2,height});
}
});



这段代码在Shell上的显示的过程效果如下:




3.5 画板(Canvas)

虽然任何Control都可以通过自身的paintEvent来绘制图形,但其子类org.eclipse.swt.widgets.Canvas是专门被设计用来进行图形操作的特殊的绘图类。我们既可以使用一个Canvas,再加入一个绘图监听器来实现绘图,也可以通过继承来建立一个可重用的自定义Control。Canvas有很多style bit,可以在绘图发生时产生作用。

3.6 绘制直线和图形

我们有很多方法可以在一个GC上画线,包括在两点之间,一系列离散的点之间或一个预定义的图形上都可以。直线是以GC的前景色来绘制的,我们可以通过GC绘制拥有不同厚度的各式直线。对于一个Paint事件,GC有着与Control组件一样的属性,即激发事件且缺省的直线样式固定为1个像素宽。

GC.drawLine(int x1, int y1, int x2, int y2);这条语句在可绘制的面板上的两点间花了一条直线,起始点为(x1,y1),终止点为(x2,y2)。终止点包含在画好的直线中。如果起始点等于终止点的话,将会有一个独立的象素点被绘制出来。

GC.drawPolyline(int[] pointArray);这条语句绘制了一系列互相连接的线段,作为参数的数组用于描述点的位置。语句gc.drawPolyline(new int[] { 25,5,45,45,5,45 });绘制了如下的图形:




GC.drawPolygon(int[] pointArray);与drawPolyline(int[])是类似的,唯一区别在于最后一个点和低一个点是连接的。gc.drawPolygon(new int[] { 25,5,45,45,5,45 });将会获得与上图一样的结果。

GC.drawRectangle(int x, int y, int width, int height);这条语句从左上角的(X,Y)点,用参数中的宽和高画出了一个矩形。gc.drawRectangle(5,5,90,45);将会绘制出如下图形:




GC.drawRoundedRectangle(int x,int y,int width,int height,int arcWidth,int arcHeight);一个圆矩形与标准矩形的区别就在于其四个角是圆的。圆矩形的每一个角都可以被想象成为1/4个椭圆,并且arcWidth和arcHeight由完整的椭圆的宽和高决定。gc.drawRoundedRectangle(5,5,90,45,25,15);绘制了一个左上角位置为5.5的圆矩形,右边的图形是放大后的效果:




GC.drawOval(int x, int y, int width, int height);一个椭圆是由其相对应的矩形的左上角的位置(x,y)来确定绘制位置的,其宽和高即为对应矩形的宽和高。对于圆形来说,只需要另宽和高相等即可。




GC.drawArc(int x, int y, int width, int height, int startAngle, int endAngle);曲线的绘制也是与一个相应的矩形有关,即其左上角的位置与宽和高都是相应矩形的属性。StartAntle是从横向的X开始计算的,所以0度指向的是东而不是北。曲线的绘制是从StartAngle到endAngle以逆时针方向执行。gc.drawArc(5,5,90,45,90,200);所绘制的图形如下:




GC.setLineStyle(int style);可以设置所绘制曲线的样式,下面列出了一些曲线样式常量(在org.eclipse.swt.SWT中定义)和与之对应的曲线的图像:




GC.setLineWidth(int width);可以用于指定所要绘制的曲线的宽度。缺省情况下的曲线宽度为1个像素。




由于直线的样式和宽度挥作用到所有的绘图操作上,所以我们可以作出如点矩形或粗线椭圆这样的图形:




3.7 绘制文本

文本可以被绘制在一个GC上, 字形是用GC的前景色和字体来绘制的,并且它所占用的区域是用GC背景色绘制的。要绘制文本,你需要定义要绘制文本的左上角,宽度和高度。有两组方法可以用来绘制文本,第一组方法的名字里都带有一个Text,并将会处理直线定界符和制表符。第二组API方法集的名字里都带有String,它们没有制表符或回车的处理,并主要用于控制像Eclipse的Java编辑器StyledText这样复杂的Control。


GC.drawText(String text, int x, int y);
Font font = new Font(display,"Arial",14,SWT.BOLD SWT.ITALIC);
// ...
gc.drawText("Hello World",5,5);
gc.setForeground(display.getSystemColor(SWT.COLOR_BLUE));
gc.setFont(font);
gc.drawText("Hello\tThere\nWide\tWorld",5,25);
// ...
font.dispose();





drawText API将控制字符\t处理为制表符,将\n处理为回车符。


GC.drawString(String text, int x, int y);
Font font = new Font(display,"Arial",14,SWT.BOLD SWT.ITALIC);
// ...
gc.drawString("Hello World",5,5);
gc.setForeground(display.getSystemColor(SWT.COLOR_BLUE));
gc.setFont(font);
gc.drawString("Hello\tThere\nWide\tWorld",5,25);
// ...
font.dispose()





当使用drawString时,制表符和回车符将不会被处理。

在一个GC上绘制字符的时候,一个字符串所占用的大小取决于它的内容以及GC的字体。想要确定一个字符串在被绘制之后所占用的区域可以使用方法:GC.stringExtent(String text), 或 GC.textExtent(String text)。这两个方法都返回一个Point类,这个Point的X和Y是渲染参数字符串所需要的宽和高。

3.8 图形填充

直线是用GC前景色绘制的,而图形的填充用的是GC的背景色。


GC.fillPolygon(int[]);
gc.setBackground(display.getSystemColor(SWT.COLOR_BLUE));
gc.fillPolygon(new int[] { 25,5,45,45,5,45 })

GC.fillRectangle(int x, int y, int width, int height);
gc.fillRectangle(5,5,90,45);







需要注意的是,当一个矩形被填充的时候,右面和下面的边缘是不被包括在内的。


GC.fillRoundedRectangle(int x, int y, int width, int height, int arcWidth, int arcHeight);
gc.fillRoundRectangle(5,5,90,45,25,15);





像GC.fillRectangle(...)方法一样,右面和下面的边缘不被包含在内,于是右下角的坐标为(94,49)而不是(95,50)。


GC.fillOval(int x, int y, int width, int height);
gc.fillOval(5,5,90,45);





GC.fillArc(int x, int y, int widt4h., int height, int startAngle, int endAngle);
gc.fillArc(5,5,90,45,90,200);





fillArc()的参数和drawArc()的参数是类似的,偏移量是从右面的轴开始填充,然后沿逆时针方向旋转给定的角度(endAngle-startAngle)。

GC.fillGradientRectangle(int x, int y, int width. int height, vertical boolean);

这个方法让我们可以指定图形在填充时所用的颜色可以从GC的前景色按梯度变化(渐变)到背景色。梯度既可以是横向的也可以是纵向的。


gc.setBackgrouind(display,getSystemColor(SWT.COLOR_BLUE));
gc.fillGradientRectangle(5,5,90,45,false);



上面两条语句建立了一个使用黑色背景的从左至右的横向梯度填充。和其他填充方法一样,左面和下面的边缘不被包括在内,所以由下角的位置缩小一个像素。




gc.setBackground(display.getSystemColor(SWT.COLOR_BLUE));
gc.setForeground(display.getSystemColor(SWT.COLOR_CYAN));
gc.fillGradientRectangle(5,5,90,45,true);



上面这3行代码的含义为在纵向自顶向下用前cyan(景色)开始,并以蓝色(背景色)结束的填充。




3.9 异或(XOR)

如果你设置了GC的XOR模式为true的话,将会发生如下情况:对于每一个像素点,原来被显示的红,绿,蓝的值将被已存在的红,绿,蓝色进行异或操作,所得结果既作为新的目标像素。


shell.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
// ...
gc.setBackground(display.getSystemColor(SWT.COLOR_BLUE));
gc.fillRectangle(5,5,90,45);
gc.setXORMode(true);
gc.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
gc.fillRectangle(20,20,50,50);
gc.setBackground(display.getSystemColor(SWT.COLOR_RED));
gc.fillOval(80,20,50,50);





3.10 绘制图像(Draw Image)

类org.eclipse.swt.graphics.Image被用来表示准备要在像打印机,显示器这样的设备上显示的图形。建立一个图像最简单的方法就是从组织好的文件格式中装载它。SWT所支持的图像格式有:GIF,BMP,JGP,PNG和TIFF。


Image image = new Image(display,"C:/eclipse_lg.gif");
GC.drawImage(Image image, int x, int y);



每幅图像都有用其边界决定的尺寸。例如,图象eclipse_lg.gif的大小为115*164,我们可以通过image.getBounds()方法来进行设定。当一幅图像被绘制的时候,它将会以自身定义的边界作为显示之后的宽和高。gc.drawImage(image,5,5);

至此,SWT在2D绘图方面的讲解告一段落,上面所提到的内容涵盖了SWT的大部分绘图功能,并在每个部分都给出了要注意的细节。至于具体实现就要靠各位的聪明才智了。下面让我们进入最后的部分-SWT的3D绘图。






回页首




4 SWT与OpenGL编程

相较于Java3D API来说,SWT以前在3D图形绘制方面一直没有什么好的表现。OpenGL的加入会不会使SWT在3D领域有所作为还尚未可知,不过起码IBM的程序员们给了SWT机会。当大家了解了这个正处于试验阶段的组合之后,我们在SWT上绘制3D图形就不再是噩梦。

OpenGL是一个为创建高性能2D,3D图形而设计的多平台的标准。其硬件和软件的实现存在于多个系统之中,包括Windows,Linux和MacOS。OpenGL可以用于渲染简单的2D图形或复杂的3D游戏图形(OpenGL最主要的应用领域就是游戏)。作为一个正在处于事件阶段的Eclipse插件,我将在下面的小节中介绍如何在SWT窗口组件上用SWT绘制图形。在Eclipse最新的3.2版中,对OpenGL的支持被集成到org.eclipse.swt项目中,所以我们在实现的时候即可以选择以插件方式进行,也可以直接利用已经集成好的组件来进行图形操作。在本节,我们将以插件方式为例对代码进行说明。

4.1 SWT OpenGL插件

SWT实现了OpenGL1.1全部功能。包括三个核心类和一个数据类。核心类为GLContext,GL和GLU。GLContext架起了SWT和OpenGL之间的桥接。一个Context必须用Drawable,通常是用Canvas来创建,OpenGL可以在Drawable上渲染场景。需要注意的是,当context不再被使用的时候就应该将它释放掉。同样,一旦某个context被释放掉之后,就不应该再次试图去渲染它。每次Drawable改变大小的时候,context都需要通过调用其resize方法在通知这一事件。这个方法的调用让context调整自己的view port和视图参数。在下一节中将描述一个处理这一部分任务的类。

当context可用的时候,我们就可以通过定义在GL和GLU的一系列方法调用来绘制场景。一个GL类大概有超过330条命令。在GL和GLU中定义的这些函数和他们的Native实现几乎是一一对应的。下图给出了一个绘制矩形的例子,我们可以看到用C写成的API和SWT OpenGL API是何其相似:




4.2 SWT OpenGL编程基础

在下面的小节中,我将描述一个显示四幅3D图像的应用程序。应用程序采用了GLSense,这是一个用于显示OpenGL场景的工具类。它和SWT的Canvas很像,所区别的是它所展现的内容是用OpenGL命令渲染的,而不是使用GC来绘制。要做到这一点,我们需要将一个GLContext类和一个SWT Canvas相关联,并且无论何时,当前上下文中的内容都应该是由在drawScene中定义的命令来渲染的。




在构造函数中,一个SWT Canvas被创建出来。这就是那个要和一个GLContext相关联的Canvas实例。紧接着,这个Canvas又注册了两个监听器。第一个监听器的作用是确保这个Canvas无论何时被改变大小,其相应的GLContex也会收到通知并适当的改变大小。第二个监听器主要用于确保一旦Canvas被释放之后,其相对应的GLContext的也同时被释放。为了确保渲染区域是一个非零大小的区域,父组件的客户矩形区被取出来用于设置该Canvas的初始大小。这个初始大小可以在稍后用布局管理器或用户Action来修改。




GLScene将Canvas的全部区域用于绘图。无论Canvas何时调整其尺寸,我们都要获取客户区并将新的宽度和高度传递给Contex,而context将根据新的宽度和高度适当的调整视图。


XML error: The image is not displayed because the width is greater than the maximum of 572 pixels. Please decrease the image width.


GLScene被分割为两个部分:初始化Context和初始化OpenGL的状态机。对于Context来说,我们只是简单的建立一个新的GLContext并使它成为当前被使用的Context。OpenGL的渲染总是在当前的context上进行绘制,因此如果你有超过一个活动的GLScene,很重要的一点是要在所有绘制动作发生之前将它的Context设置为当前的Context。initGL方法最开始提供清除颜色缓存颜色,随后建立了一个深度缓存(depth buffer).第47行指出了深度值如何进行比较。这一比较函数主要用于拒绝或接受正在引用的像素。GL.GL_LEQUAL选项指定接受那些在视图上更接近或有相同距离的像素。第48行启动了深度测试(depth test),紧接的一行设定阴影模型为GL.GL_SMOOTH,这一设定的效果是如果表面上的两个顶点颜色不同的话,系统将对颜色进行插值。最后,第50行要求渲染引擎在计算颜色和纹理协调插值运算的时候起到关键的作用。


XML error: The image is not displayed because the width is greater than the maximum of 572 pixels. Please decrease the image width.


GLScene类的最后两个方法用于处理重绘和场景绘制。当场景何时需要重绘的时候,第一个方法为其他类提供重绘操作的接口。第二个方法主要用于让继承GLScene的子类覆写。其缺省实现只是简单的清除了颜色和深度缓存,通过装在鉴别矩阵(identify matrix)重新恢复调整系统。

4.3 3D Chart

利用上一节的准备,我们已经将主应用程序进行了划分。这个图像显示了4组数据。每一组数据都是由相同的固定点所组成,每个点都是从0.0到10.0之间的一个正值。

示例程序运行在一个非常简单的Eclipse view上,唯一值得注意的是Refresher,这个线程将强迫OpenGL场景被周期性的重绘。通过这种方法,当视图被移动或旋转的时候,component总能进行有效的更新渲染效果。run()方法调用的时间间隔为100毫秒,所以理论上的图像速度能达到每秒10帧。




每个数据集合的点的值是用圆柱体来表示的。通过执行3个GLU调用,我们就能够绘制圆柱体:其中的两个用于渲染圆柱体两头的圆盘部分,另外一个用于渲染圆柱体的四周。例如,要渲染两个单元高的圆柱体,你可以用下面的代码来实现:




第一行申请了绘制圆盘和圆柱所需的二次曲面。然后整个场景被逆时针旋转了90度,以便圆柱体可以被垂直绘制。下一步,底部的圆盘被渲染,然后是圆柱体的四周。在我们能够绘制顶部圆盘的时候,通过场景转换(scene translation),我们可以在Z轴移动两个单元。最后一个圆盘随后被绘制出来,调整系统通过向回移动两个单元来进行恢复。最后,由第一行申请的二次曲面被释放掉。

按照上述方法运行程序是很费时间的。当仅绘制一个圆柱体的时候,效率低下不是一个很严重的问题,但如果要绘制成百个对象的话就会严重影响程序的执行性能。对于这种情况,OpenGL给出了一个解决这个问题的技巧,就是使用显示列表(display list)。

一个显示列表是一组已编译的OpenGL命令。定义命令集合的列表被放在glNewList(int list, int mode) 和 glEndList()方法调用之间。第一个参数必须是一个正整数,可以用来唯一的表示一个被创建的显示列表。你可以让GL用glGenLists(int n)方法为你生成多个列表标识符。第二个参数用于指定列表是否被编译或编译之后立即被执行。大多数情况下你都需要编译这个列表。然后,你可以使用glCallList(int list)方法来显示整个列表。

2006年12月15日星期五

生命的真谛

麦兜说,生命的真谛就是吃火锅。是啊,可以把所有的美味在一次的沸腾中慢慢享受,那真的是人生中最幸福的一瞬间了。

遥想鹅毛飘舞的冬夜,一座小屋,一豆灯火,一案,两椅,一土炉,一锅,那个滋味足够微微的生物电流缓缓淌过身体了……

“没菜,搞屁啊”,她在视频中说。一脸的苦笑之后,又回到了现实,嗯,幻想中的火锅离我很遥远,而她来我身边的日子已经很近很近了。电流开始缓缓的淌过……

2006年12月13日星期三

在Figure中作画

郁闷!一个下午就耗在这个弱智问题上了,拖出去喂鸟!

Figure中画基本几何图形,如线、折线、曲线、椭圆(包括圆了)等的时候,不能直接通过固定坐标来设置几何图形中的点坐标,而应该根据Figure的bounds来计算:
public void paint(Graphics graphics) {
Rectangle r = bounds;
PointList pl = new PointList(4);
pl.addPoint(r.x + r.width / 2, r.y);
pl.addPoint(r.x, r.y + r.height / 2);
pl.addPoint(r.x + r.width / 2, r.y + r.height - 1);
pl.addPoint(r.x + r.width, r.y + r.height / 2);
graphics.drawPolygon(pl);
}
上例中画了一个菱形,这里需要注意的是菱形的坐标,可以看出并不是简单的假设graphics开始画的区域的原点就是(0,0),而是从父Figure的原点开始画的。

另外Figure中众多的paintXXX系列方法也各有专用,不要乱覆盖:
  • paint() - 绘制Figure的全部内容
  • paintFigure() - 一般用于绘制Figure的背景或者Figure中的几何图形
  • paintBorder() - 绘制Figure的边框
  • paintChildren() - 调用子Figure的paint()
  • paintClientArea() - 绘制在Border和Insets之内的区域,这个区域一般放置的是子Figure,所以会调用paintChildren()

2006年12月6日星期三

白天纽约,夜晚巴黎[转载]

【王文华/文】 【 2005/12/28 联合报】

我在赶些什么?我耗尽青春用尽全力,拼命追求身外之物,结果我真的比别人有钱、有名吗?更重要的,我真的因此而快乐吗?远方有广阔的地平线,为何我还在原地摇过时的呼拉圈?

纽约和巴黎,代表了我人生的两个面向。纽约是白天,巴黎是黑夜。纽约是前半生,巴黎是下半场。

三十五岁之前,我认定纽约是世上最棒的城市。我在加州念研究所,毕业后迫不及待地去纽约工作。一做五年,快乐似神仙。我爱纽约的原因跟很多人一样: 她是二十世纪以来世界文化的中心。丰富、方便。靠着地铁和出租车,你可以穿越时间,前后各跑数百年。人类最新和最旧、最好和最坏的东西,纽约都看得见。

所以在纽约时,我把握每分每秒去体会。白天,我在金融机构做事,一天十小时。晚上下了班,去NYU学电影,一坐四小时。在那二十多岁的年纪,忙碌是唯一有意义的生活方式。活着,就是要把自己榨干,把自己居住的城市,内外翻转过来。

这种想法并不是到纽约才有的。其实从小开始,台湾人就过着纽约生活。纽约生活,充满新教徒的打拚精神和资本主义的求胜意志。相信人要借着不断努力, 克服万难、打败竞争。活着的目的,是更大、更多、更富裕、更有名。权力与财富,是纽约人的两个上帝。而能帮你走进天堂的鞋,就是事业、事业、事业。

在这种弱肉强食的生活方式,为了保持领先,每个人都在赶时间、抢资源。进了电梯,明明已经按了楼层的钮,那灯也亮了,偏偏还要再按几下,彷佛这样就 可以快一点。出了公司,明明已经下班了,却还要不停讲手机,摇控每一个环节。在纽约,为达目的,可以不择手段,甚至赶尽杀绝。在纽约,没有坏人,只有失败 者。

台湾,是不是也变成这样?

每一件事,都变成工作。上班当然是工作,下班后的应酬也是工作。有人谈恋爱是在工作,甚至到酒店喝酒、KTV狂欢,脸上都杀气腾腾,准备拚个你死我活。

我曾热烈拥抱这种生活,并着迷于这种因为烧烤成功而冒出的焦虑。这种焦虑让我坐在椅子边缘,以便迅速地跳起来闪躲明枪暗箭。这种警觉性让我练就了酒 量和胆量、抗压性和厚脸皮。但也养成了偏执和倔强、优越感和势利眼。在纽约时我深信:能在这里活下来的,都是可敬的对手。黯然离开的,统统是输家。人生任 何事,绝对要坚持到底。半途而废的,必定有隐疾。在这不睡的城市,每天我醒来,带着人定胜天的活力,跟着法兰克辛纳屈唱〈纽约 ?纽约〉:「如果你能在纽约成功,你可以在任何地方
成功!」是的,在纽约,现代的罗马竞技场,我要和别人,以及自己,比出高低。

这套想法,在我三十五岁以后,慢慢改变。

第一件动摇我想法的,是父亲的过世。我父亲一生奉公守法、与人为善。毫无不良嗜好,身体健康地像城堡。七十二岁时,他得了癌症、引发中风,经历了所 有的痛苦和羞辱。他一生辛勤工作、努力存钱、坚信现在的苦可以换得更好的明天。我们也相信一分耕耘、一分收获,用在纽约拚事业的精神照顾他。但两年的治疗 兵败如山倒,最后他还是走了。父亲逝世的那天,我的价值系统崩溃了。我一路走来引以为傲的「纽约精神」,没想到这么脆弱。

不止在病床,也在职场。当我在企业越爬越高,才发现「资本主义」在职场中也未必灵验。上过班的都知道,很少公司真的是「开放市场」、「公平竞争」。 大部分的同事都觉得你不是朋友、就是敌人。职场上伟大的,未必会成功。成功的,有时很渺小。很多人一辈子为公司鞠躬尽瘁,最后得到一支纪念笔。那些卷款潜 逃的,反而变成传奇。

慢慢的,我体会到:世上有一种比「善有善报、恶有恶报」更高、更复杂的公平。人生有另一种比「功成名就」更幽微、更持久的乐趣。那是冲冲冲的美式资本主义,所无法解释的。

我能在哪里找到那种公平和乐趣呢?我想过西藏、不丹、非洲、纽西兰。然后,我注意到法国。

住纽约时,法国是嘲讽的对象。身为经济、科技、和军事强权的美国,谈起法国总是忍不住调侃一番。法国是没落的贵族,值得崇拜的人都已作古。法国人傲慢,高税率让每个人都很慵懒 。动不动就罢工,连酒庄主人都要走上街头。

搬回台湾后,普罗旺斯、托斯卡尼突然流行。我看了法兰西斯?梅思的《美丽的托斯卡尼》,其中一句话打动了我:「在加州,时间像呼拉圈。我扭个不停,却停在原地。在托斯卡尼,我可以在地中海的阳光下,提着一篮李子,逍遥地走一整天。」

是啊!我在赶些什么?我耗尽青春用尽全力,拚命追求身外之物,结果我真的比别人有钱、有名吗?更重要的,我真的因此而快乐吗?远方有广阔的地平线,为何我还在原地摇过时的呼拉圈?

当我重新学习法国,我发现法国和美国代表两种截然不同的生活方式。美国人追求人定胜天,凡事要逆流而上。法国人讲究和平共存,凡事顺势而为。纽约有 很多一百层的摩天大楼,巴黎的房子都是三百年的古迹。纽约不断创新,巴黎永远有怀旧的气息。巴黎人在咖啡厅聊天,纽约人在咖啡厅用计算机。纽约有人潮,巴 黎有味道。纽约有钞票,巴黎有蛋糕。

不论是政府或个人,法国人都把精神投注在食、衣、住、行等「身内之物」。就让美国去做老大哥吧。要征服太空、要打伊拉克、要调高利率、要发明新科技,都随他去。法国人甘愿偏安大西洋,抽烟、喝酒、看足球、搞时尚。当美国人忙出了胃溃疡,法国人又吃了一罐鹅肝酱。

讲到吃,法国有三百种起司、光是波尔多就有五十七个酒的产区。晚上六点朝咖啡厅门口一坐,一杯红酒就可以聊三个小时。九点再去吃晚餐,一直吃到隔天凌晨。他们在吃上所花的时间,跟我们上班时数一样。但讽刺的是:他们没有「All You Can Eat」。

吃很重要,但也要会挑时间,朋友介绍我去试一家法国餐厅,提醒我他们礼拜二、四晚上休息。「为什么?」我问。他说:「因为主厨要回家看足球。」

聪明的主厨懂法律。法国法律规定一周工作最多三十五小时,大部分的人一年有五周的假期。而美国人把加班当作自己有价值的表示,度假时还拿着手机回E -mail。法国人比美国人会玩。每年六月的巴黎音乐节,从午后到深夜,几百场露天音乐会在各处同时举行,人多到地铁都暂停收费。每年十月的「白夜」,平 日入夜就打烊的店面,彻夜营业到清晨七点。每年夏天,巴黎市政府在塞纳河右岸布置了三段、总长一.八公里的人工海滩。细砂、吊床、躺椅、棕榈树,自然海滩 有的景致这里都有,让没有钱去海边度假的民众,也可以享受到海滩风光。

当然,法国这么深厚的文化,不可能只从吃喝玩乐而来。美国人读书,为了考证照。法国人读书,为了搞情调。每年十月的读书节,大城市的火车站内,民众 轮流上台朗诵诗句。书店营业到天明,整晚有现场演奏的乐曲。「美食书展」选在铜臭味最重的证券交易所举办。小镇书展的书直接「长」在树上,读者必须爬到树 上,把书摘下来品尝。

一直跟着美国走的台湾人,会心动吗?

我心动了。十一月我到巴黎,一位法国朋友来接待我。临走前我问他:「明天你要干嘛?」

「我要去银行。」

「然后呢?」我问。

「我不懂你的意思……」

对我来说,「去银行」是吃完午饭后跑去办的小事。对法国人来说,这是他一天全部的行程。法国人总是专心而缓慢的,每天把一件小事做好。

这样的生活,对美国或台湾人来说,实在是太颓废了。的确也是。法国失业率接近10% ,高税率让雇主宁愿打烊休息,免得帮员工缴税。巴黎闹区纸醉金迷,但郊区的少数民族却没有工作机会。这些都是黑暗面,但对于每日被强光烤焦的台湾人,阴暗 也许提供了喘息空间。生命的终点都一样,有钱人的丧礼只是比较多人上香。不断的追赶只是提前冲向谢幕,为什么不把时间花在慢慢为生命暖场?你不需要一辈子 鞠躬尽瘁、死而后已。你可以偶尔伸伸懒腰、安步当车。

我从巴黎回来,台北并没有改变。关了两周的手机再度响起,一通电话找不到我的人会连续狂call十通。和朋友见面,他很关心地问我:「好了,你现在工作也辞了、欧洲也去了,接下来有什么projects ?」

「Projects」?多么纽约的字眼。

我真想说:「好好生活,不就是人生最大的project?」但我知道在熙来攘往的台北街头,在不到四十岁的年纪,这样说太矫情了。况且,我今天之所 以有钱有闲享受法式生活,不也正因为我曾在美式生活中得到很多利益?我仍热爱工作 、热爱纽约,但已不用像二十岁时一样亦步亦趋、寸步不离。

所以我说:「我还是会早起,白天努力写作。但到了晚上,我想关掉手机。」

世界少了我,其实无所谓。但我少了我,还剩什么?

2006年11月25日星期六

eclipse插件网站[]

插件列表网站

  • http://www.eclipse-plugins.info/eclipse/index.jsp
Eclipse 正牌插件专门网站,有插件分类,top rated统计,以及用户反馈信息。 这些足够你少走弯路,最快地找到最好胜的插件了。

推荐插件

在 Struts Applications 子项目下,有人整理了这个东东。即它把 eclipse 常用的开源工具打包了,不需要自己再麻烦去安装整理了。真棒的工作。 sf.net 的一个旨在开发 eclipse 插件的项目。 有几个小巧实用的工具了。 虽小,但看起来的确实用。比如,你想看看某个类或者方法的实现,一般是 ctrl + 左键 ,点击即打开这个类或者方法。 但如果是接口时,只是到达接口而已,不能解决问题。我实际应用过程中就遇到这个问题。 没有想到就有真的做了这个插件。

J2EE

J2EE 开发中用得最火的插件,关键是更新速度很快,基本上 eclipse IDE 有新版本,几天之内他就可以 release 版本。新版本功能也改进不少,现在也可以直接在 JSP 中显示标签的提示了,甚至语法错误提示。(我一直用这个)
随 着eclipse的发展,现在的LOMBOZ插件越来越大了。但是速度成了主要的问题。和Myeclipse、IBM的Eclipse Web Tools Platform相比,LOMBOZ的技术有点落后了。Myeclipse是把整个项目的JSP先编译了,而IBM也是第一次把所有的JSP加入索引。虽 然每次打开的时候,也慢一些,但是并不随着工程的变大,而出现速度成反比的现象。现在用lomboz 打开一个大的项目中的JSP文件的话,一般人已经受不了它的速度了。

这 个绝对是一个重量级的J2EE的插件,很多论坛上都有它的介绍,在此也不多说了。只说几个与众不同的地方,它是一个唯一打开JSP,能解释里面的 JAVA,HTML,CSS,JS,TLD的编辑器,也是唯一能支持JAVA里的CTRL+鼠标单击打开相应类,鼠标停住显示JAVADOC的编辑器。 IBM的东西确实不同凡响,就是体积大了些,不但用到EMF,而且还用GEF,XSD等项目,至于里面的XML可视化编辑,WEB SERVICE.....偶也用不着,幸好也有这样一位大侠Lonsen(在此表示感谢)爱好和偶一样,把这个插件减肥了。Eclipse Web Tools Platform减肥记 这样改过之后,这个插件又FREE!又强大,速度比LOMBOZ快,首先推荐!绝绝对对的5星级!!!快快DOWN下来,加入自己的eclipse插件宝库吧!

虽然 MyEclipse 是个死要钱的东东,不过功能确实是不赖啊,尤其让我无法放手的就是那个自动发布功能,随手保存,随时发布。这个发布可不是 ant 的那种整站发布,而是针对某些类或是 jsp 进行发布,虽说只是一个简单的 copy,可确实方便了很多。
里 面使用的XML编辑器,XML MEN也可以说是一个精品的插件,但是在当前的XML插件满天飞的情况而言,优点也不多了。不过,那个 struts 支持倒是使用了这个功能,它不但把 easyStruts 集成进来,而且还加入了图形(流程)化struts-config.xml的功能,还支持除错的功能,这个功能虽然不稳定,但是必竟支持这个功能的插件也 仅此一位呀。

如果除其不稳定因素外,这个STRUTS插件已经是最好用的插件之一了,不但保持了,xslt这个目录的模版文件的支持,preferences.ini这个配置文件可以修改生成文件的目录,这些easySTRUTS原有的优点以外,而且在稳定性上也有了明显的改善!只是这个插件唯一让你受不了的就是,它必须使用它自身带的GEF插件包,而且你还不能安装比它新的GEF的插件!!!这意味着如果你的其它插件,想使用GEF的话,能利用它的版本的,就用它的版本,不然,就意味着你永远不能使用其它使用GEF的插件!!!

2004年10月现在的事情变化太快了昨天刚刚不能用的功能可能今天就实现了,现在的Myeclipse里面的STRUTS的功能也真的是太强大了,我所知道的STRUTS类的插件应该具有的功能,它几乎都有了!
现 在Myeclipse3.8.2全面集IBM的J2EE插件所以主要的自己的产品就那个STRUTS的图形化功能了,这回经过细致的加工后无论在界面上还 是在功能上都可以说是第一棒的了只是其附带的JSP的预览的功能好象还是好些问题和WSAD相比好象是有点水土不服比竟IBM的这套工具强大而又不易于操 作。下面就是这个插件的美美样子 PL的一塌糊涂

http

Struts

最 老牌的 Struts 插件了,支持的平台很多。同时支持eclipse2.1和3.0!!!而且一直在维护更新。我还是认为它是最好用的 Struts 插件。新版本也支持 Eclipse IDE 的最新版本。其实对于 Struts 关键是完善地支持配置文件地图形化就够了,其他关系不大。这个东东对Struts配置文件支持得很完善。另外他也可以相对独立地作为一个程序运行,我现在 是这种方式在用它。
  • 不得不提的easy STRUTS
几乎所有的网站说到STRUTS插件的时候都会提到 它,它的功能也的确不赖呀。FORM的模板的支持,生成目录..等配置文件的支持。真的可以说是STRUTS的一个非常成功的插件。只是网友在使用中,发 现竟然有把Struts-config.xml文件信息丢失的现象,这个插件可以说一下子从天堂走向了...但是,好在myeclipse把它集成了,修 正了一些BUG。但与此也带来一些新的BUG!:( 软件是不是总是这样??不过,随着FILE Model插件的强大,easy struts吸引人的地方越来越少了,甚至于它的模板不是基于velocity的,也成为它必须要重构的一个因素了。 这 个东东可能用的人并不多一眼看上去好象也没有什么强大的功能.但实际上,它的的确确是唯一全支持STRUTS的插件.它的支持不仅仅在于struts- config文件的支持,它还可以支持JSP中Formbean里面的属性!!!!这回当Formbean里面属性一大堆的时候不怕写错了,嘿嘿但目前好 象没有出现破解版本.

代码辅助

有几篇综合介绍文章,请参考:Eclipse介绍文章页

Jalopy功能确实不错,也是我在使用eclipse2系列时必备之一,不过在eclipse3里面,格式化有了长足的进步,个人认为功能已经不弱于Jalopy了 ——郁也风
Doclipse is an Eclipse plug-in to help you write Java source files with Javadoc tags, either for documentation purposes or to be processed by a tool such as EJBGen or XDoclet. New tags can be added to the plug-in by writing XML files defining the new tags and their attributes.

XML

排名最高的 XML 插件,比较好用。标准版免费开放,专业版需要付费。

Hibernate

国人开发的一个 Hibernte 辅助开发工具。很好用。主要功能是从数据库表中自动建立 hbm 文件。也可以从POJO创建hbm文件,但是默认ID的类型是hilo.long, 从这个hbm 产生数据库schema的时候会出错。 Hibernate Synchronizer可以保证hbm和java文件的同步。 http

GUI 相关

其它 Util 插件

帮助你在代码里使用 log4j 写 log 对 eclipse edit 做些功能补充

meven 免费,另一个极好的maven环境!

2006年11月24日星期五

祝福

我对佛说:让我的小宝贝儿永远健康快乐!
佛说:只能四天!
我说:好,春天、夏天、秋天、冬天。
佛说:三天。
我说:好,昨天、今天、明天。
佛说:不行,两天。
我说:好,白天、黑天。
佛说:不行,就一天!
我说:好!
佛茫然问到:哪一天?
我说:我的小宝贝儿的每一天!!佛哭了……说:以后你的小宝贝儿将天天健康快乐!!!

2006年11月23日星期四

感恩节

11月的第四个星期四是感恩节。感恩节是美国人民独创的一个古老节日,也是美国人合家欢聚的节日,因此美国人提起感恩节总是倍感亲切。

感恩节的由来要一直追溯到美国历史的发端。1620年,著名的“五月花”号船满载不堪忍受英国国内宗教迫害的清教徒102人到达美洲。1620年和1621年之交的冬天,他们遇到了难以想象的困难,处在饥寒交迫之中,冬天过去时,活下来的移民只有50来人。这时,心地善良的印第安人给移民送来了生活必需品,还特地派人教他们怎样狩猎、捕鱼和种植玉米、南瓜。在印第安人的帮助下,移民们终于获得了丰收,在欢庆丰收的日子,按照宗教传统习俗,移民规定了感谢上帝的日子,并决定为感谢印第安人的真诚帮助,邀请他们一同庆祝节日。

美国人有了感恩节,印第安人却失去了一切……

2006年11月18日星期六

搬博工

是我没找到blog迁移工具还是本来就只是个传说?为了合并多个blog,我贡献了一个美好的周五 ,呼——,总算都迁到blogger了,以后这里就是我永远的家了,除非Google哪天不再是神话:P

old version blogger的迁移就等到blogger提供自动迁移功能的时候再做吧,实在搬不动了...

凌晨3:47,香甜甜的梦儿正在向我招手,晚安,我的宝贝...

修改blogger post的发布日期

没想到改这个东东也可以总结些经验,呵呵:)

日期格式“[年(2位)]-[月(1-2位)]-[日(1-2位)]”
时间格式“[上|下午][小时(1-2位)]:[分钟(2位)]”

其中“小时”需要特别注意,比如半夜12点过2分必须写成“下午12:02”而不是“上午0:02”,不然blogger不认,呵呵,似乎不符合常理啊:P

另外刚才凌晨2点钟的时候访问blogspot的时候blogger beta server居然出错了,结果看到了Google“可爱”的502错误页面,截了一张下来,来看看:Google错误页面

我的 Flash Component ?!

     看了自己的一篇old blog,感叹着自己的Flash
Component开发计划似乎遥遥无期。想做这样一套东西无非就是想让自己能简单开发一些Application而不要在UI上耗费太多的时间。

   但是看过AJAX的实现之后反而觉得应用之道在于灵活变通,而不是报死理硬是要一种东西通杀,否则反而走入误区,等到深入到开发这一步再想退回来可真的就难了。

   自己做前端开发也有比较长的时间了,各种Web前端技术或尝试过,或做过实级应用,个人觉得轻量级的可以用AJAX,中间级别的可以用Flash,再重一点儿还是老老实实用JSP标签之类的前端框架来实现吧。

2006年11月16日星期四

通过洋葱头写blogger

装好了之后赶紧试试看,希望能发上去。如果成功我再写心得吧!

看来是成功了,嚯嚯!

配合3个东东,写Blogger超级方便
1、Performanging
2、FoxyProxy
3、Tor

Performanging是firefox插件形式的blog客户端,可以在firefox中方便的调出,不过因为众所周知的原因,用它无法直接访问blogspot,唯一的办法就是通过代理。Tor代理机制不错(相关机制解释可以去google搜索),代理就用它了。但Tor如何跟firefox结合呢?FoxyProxy就恰到好处的起到了粘合剂的作用,通过FoxyProxy可以直接Tor,并且还可以设定使用Proxy的网址规则,这样需要Tor的网站才会通过Tor连接,不需要的还是通过直接连接,功能速度两不误。

具体操作步骤我就不罗唆了,网上找找大把大把的,无非就是:
1、安装Performanging插件
2、下载FoxyProxy
3、下载Tor集成安装包
4、启动Tor
5、设置FoxyProxy
6、设置Performanging
7、开工,呵呵

希望能为朋友们帮上一点点忙,我也就心满意足了:P

2006年11月8日星期三

常见Bug管理系统

BugFree确实太简单了,实在太简单了,号称对比微软内部使用的Bug管理软件来写的,但是1.0出来以后,基本上没有什么功能,就是个简单的记事本而已,写一个Bug,然后修改它的状态。谈不上什么项目管理,也谈不上什么用户管理。界面上东西很多,但是有用的不多,显得很复杂,其实功能不多。这样说也许会得罪人,上次看到别的Blog上就被作者回应的很厉害。当然,这样一个工具开源使用的确是很好的,而且,搜索Bug管理,出来的国产软件就这一个。但是,我还是要说一声,打着微软旗号来宣传过分了一点,恐怕得到5.0左右才可以。

Bugzilla安装太麻烦了,我没有本事装起来。在Redhat上和Debian上都装不起来。更新Perl组件的时候,mysql模块总是有问题,后来手动下载编译了这个模块,perl提示该模块已经安装完成了,但是使用checksetup的时候还是说没有这个模块。搞死了。而且我觉得它的界面也太朴素了,Linux编程的也不能搞成这样吧?

Mantis也用过一段时间,被人称为PHP下最强大的Bug管理系统,但是它的版本号很奇怪,可能是作者太谦虚了,一直用0.1x的方式来标注,用起来感觉怕怕的。最近出来了1.0rc版,下载来看了一下,没觉得跟0.18有什么区别。安装和使用都很方便,界面也是非常的朴素,可能是因为作者一个人单干,来不及做界面或者没功夫做漂亮的界面吧?功能单一,而且多项目操作的时候挺麻烦的。而且PHP项目最大的弱点在于,全文检索。

XPWeb的界面很漂亮,页面脚本做的也很帅,不知道会不会引进什么浏览器的兼容性问题,我没有在别的浏览器上用过。但是因为做的太漂亮,就有点太占地方了,很长很长的一页,显示不了多少东西。而且,作为一个敏捷编程的项目管理工具,它的使用还是比较繁琐的,建立项目,项目里面建立素材,为素材建立任务。如果你想到一个任务可能要跨两个素材(不知道是不是我学的不到家,是不是不应该出现这种问题),那就有点麻烦了,我不知道怎么解决。而且我对它的任务开始和运行状态还没有搞的很清楚,好像是自动计算的。

dotProject也不错,自带的第三个模板很漂亮,也是多国语言的(前面这三个都支持中文界面),但是问题多多。第一次安装完成以后找不着在哪里添加任务,以为添加了事件就等于任务了,结果日历那边能看到事件,但是Todo里面死活找不着任务。结果搞了半天才发现要到项目里面才能添加任务。而且添加任务的对话框有问题,修改了源代码解决了。后来又在项目列表里面加上了一个添加任务的按钮。甘特图打不开,又是修改源代码解决的。最后,使用中文界面的时候,所有的日历上面的日期都是乱码,没有搜索到解决方案,自己也没有找到可以在哪里修改代码,去掉了一个UTF8转换函数以后显示中文了,但是只有一个“星”字,没有后面的“期一”。再后来找到了台湾Markwu大哥做的UTF8中文优化版,下载下来以后,中文界面里面的日历问题没有了,而且据说在甘特图里也可以显示中文字了。但是我用的时候添加任务的时候所有的按钮失灵,script error。晕死,放弃了。

XPlanner也试过了,业界也是一片叫好声,被人称为免费界里最强大的项目管理工具,不知道是怎么回事。下载也是分两个版本,standalone和WAR版。先装WAR版,费了不少劲编译成功了,登录界面也出来了,结果登录进去就是异常。于是下载了standalone版,本来以为这个应该没有问题,没想到N多个页面都报异常,根本没法正常使用。难道是人品问题,在jkd1.4和jkd1.5正面都试过了。网上也有人说过这个问题了,恐怕并不是偶然现象。

还有OnTime 2006,这个软件还是不错的。从2004版的时候就用过了,当时对中文支持不好,输入中文再显示出来的时候就变成乱码,后来2005的时候解决了问题。这个系统看上去挺庞大的,但是更新速度很快,好像半年就更新一个版本。整个系统分成几个版本,Web版、Windows版、VS.net版,其实也就是不同的客户端了。所有版本使用相同的数据库,可以共享数据。Web版可以远程使用,还可以装一个Customer版,供你的客户来登录BUG。整个系统即可以作为BUG管理,也可以作为项目管理工具,反应速度还可以,界面也很漂亮,报表功能强大,可以生成各种各样的报表,并直接转换成PDF文件。可惜的是,系统是.Net平台的,只能安装在windows系统上。我的机器有点撑不住。

现在终于有了Jira了,其实早在两年前就耳闻它的大名,但是一直没有服务器来装,而且一直没有对java的东西下过功夫。现在来看,Jira还是比PHP的程序运行起来要吃力的多,做Server的机器CPU只有733M,PIII的,明显感觉到慢,那肯定不是网速问题了,因为在局域网内做测试。

2006年11月7日星期二

blogger(beta) go on!!

前一段时间开始,blogger beta登陆页面及blogspot都被封掉了,恼火的很。还好在网上查到了解决办法:
  1. 打开 C:/WINDOWS/system32/drivers/etc/hosts 添加 72.14.219.190 beta.blogger.com 就可以访问了blogger beta的登陆页面和写作页面了。
  2. 通过"http://www.pkblogs.com/二级域名"访问自己的blog。

2006年10月20日星期五

莫名的感觉

几日以来,生活似乎一下子进入到闷闷不乐的状态中,工作似乎提不起兴趣,然而又没有任何不开心的事儿发生,究竟怎么啦?

2006年10月16日星期一

好久没更新了

懒散的十一,和apple of my eyes亲密无间,blog也早就搁置九霄云外了,呵呵:P 工作暂时进入了一个较为轻松的时期,前一段时间欠下的功课得早早补起来,不然忘了损失就大了。特别写这么一点儿备注,抵制懒懒细胞的进攻……

2006年9月24日星期日

Java中解析XML的相对路径DTD所遇到的问题及Eclipse RCP中的相关问题

使用DOM还是SAX解析XML,都可能存在要解析xml中的相对路径的DTD文件的问题,前一段时间一直搞不定,今天总算弄懂了,其关键就在于org.xml.sax.InputSource!

任何方式解析xml,都可以以InputSource对象传入到解析器中,以前一直觉得InputSource是不是太累赘了,不要也罢,但如果碰到上述问题,则必须通过InpuSource来解决,方法如下:

比如XML文件test.xml在c:/testxml目录中,其中定义了,说明spring-beans.dtd与XML文件在同一目录中

首先,我们获取c:/testxml目录的URL,然后将其字符形式传递给InputSource作为SystemID,用于定位要解析的XML中的相对路径的父目录,最后解析器解析XML时就不会报错了。

URL url= new File("c:/testxml").toURL();
inputSource.setSystemId(url.toExternalForm());
saxParser.parse(inputSource,sax);

我所遇到的情况更为复杂些,是通过Eclipse Bundle来寻找dtd的。在程序中我通过如下函数找到Bundle中的文件:

public static URL getPluginFileURL(String relativePath) {
Bundle bundle = BizeditorPlugin.getDefault().getBundle();
Path path = new Path(relativePath);
return FileLocator.find(bundle, path, null);
}

但如果要寻找目录的URL,参数的最后必须是File.separator结尾,否则就会被认为是文件了,也就是使用 getPluginFileURL("testxml" + File.separator) 来获得要传入inputSource的SystemID,这样解析的时候Eclipse内部的URLHandler才会正确识别bundle资源的相对路径。

2006年9月18日星期一

纪念9.18国耻日

万里长城十亿兵,
血仇岂待儿孙平?
愿提十万虎狼师,
金戈铁马踏东京。

2006年9月13日星期三

Java正则表达式中group()、group(i)、groupCount的含义

花了两个小时才搞明白,有点儿笨:P

首先弄明白Java的正则表达式中捕获组的概念,也就是以括号对“()”分割出的子Pattern,为什么要用到子模式呢?这是为了能在一次匹配中找出关心部分,例如:
input: abbc
pattern:a(b*)c
group0: a(b*)c
group1:(b*)

整个pattern是可以匹配abbc的,group()方法就是获得当前查找里面整个pattern所匹配的子序列,所以你可以通过group()找到“abbc”;

与此同时,我还对其中的b的个数感兴趣,就可以通过group1来得到关于(b*)的匹配情况,group(i)就是获得当前查找里面指定的捕获组所匹配的子序列,所以你可以通过group(0)来找到“bb”;

上面说清楚了,groupCount()的含义就很容易明白了,它并不是指在输入序列中Pattern总共匹配了多少次,而是指的捕获组的个数,当然它不对“整个pattern”计数,而只对“子Pattern”计数,如上例中groupCount()返回1,而如果我们将input改为“abbc abbc abbc”,——有三次匹配——groupCount()还是返回1

好了,我想废了半天话,概念应该讲清楚了,希望日后能记在脑袋里,不要天天来烦blogger.com:P



* 文中所谓的:
1、“序列”是指字符序列,也就是CharSequence的意思
2、当前查找是指一次find()或matches()的过程中

2006年9月10日星期日

又测Blogger beta

为何又说个“又”字?前几天试验了一下的,也不知是怪我粗心还是这几天改进不少,反正发现多多啊,从此Blogger Live多了不少乐趣,Bingo!
要不都搬过来?呃……这个……及其浩大的说,放十一再整整吧:P

2006年6月10日星期六

plugin打包输出出错

feature打包plugin时出错。查看报错信息,然后去相应的目录等待临时文件的产生,一旦看到立刻拷贝到其他地方,然后查看相应行数,发现是 jarsign操作失败。plugin因为需要使用UTF-8打包,所以需要从plugin.xml通过PDE导出为build.xml用以定制构建过 程,记得plugin.xml编辑器中的构建页中需要勾选“定制”。但是,如果plugin的version发生了变化,就需要去掉勾选,然后删除 build.xml之后再次生成build.xml再勾选“定制”,这样才能保证版本一致性,feature导出时才不会出错(jarsign错误,是因 为plugin打包的时候继续按照老build.xml中指定的xxx_0.1.1.jar打包,而feature则直接读取版本号,按照 xxx_0.1.2.jar来找需要签名的jar,当然找不到了)。

2006年6月8日星期四

Figure的画法

一般而言,
Figure f = new Figure();
之后,除了
f.setBounds();
之外,还需要
f.setPreferredSize();
来确定初始大小
f.getParent().getLayoutManager()会根据PreferredSize来确定child figure的初始大小的,否则figure出来时就可以看不到.

2006年5月27日星期六

XDoclet的output file是乱码?

源代码是UTF-8,里面有自定义的标签,需要按规则导出为xml文件,不过导出时xml文件却是乱码,查看文档http://xdoclet.sourceforge.net/xdoclet/ant/xdoclet/DocletTask.html 知道,只需要添加encoding参数就可以了,即.encoding参数指定了source file的encoding;docencoding指定模板引擎和目标文件的encoding

RCP Application中引用第三方包

看到有的帖子说这个问题比较困难,刚好遇到了这个问题,自己试验了一下,找到了可行的办法:

需求:
在RCP中引用commons-net-1.4.1.jar包

实做:
1.在project目录下建lib目录(或者其他名称都可以,这里是为了说明方便),将commons-net-1.4.1.jar放到lib目录中

2.在plugin.xml编辑器->"运行时"->"类路径"(右下方)中添加"lib/commons-net-1.4.1.jar",这里的设置是管MANIFEST.MF,用于运行时路径

3. 在plugin.xml编辑器->"构建"->"额外的类路径条目"(最下方)中添加"lib/commons-net- 1.4.1.jar",这里设置是影响build.properties中的jars.extra.classpath属性,用于编译时路径

4.上述步骤设置好了编译及运行时包的路径,最后我们只要将commons-net-1.4.1.jar实际打包到最后的RCP部署包里面就OK了,在plugin.xml编辑器->"构建"->"二进制构建"中勾选lib目录即可

这样,第三方包就可以在RCP Application中正常使用了

2006年5月26日星期五

JWS 发布 RCP 的更新问题

最初RCP project的编码是GBK,改为UTF-8后通过.produce打包似乎无法使java使用-encoding UTF-8,奇怪的很,难道没有地方设置吗?难道eclipse不能自动发现project的编码吗?只好通过plugin.xml产生 build.xml来定制构建,在build.xml中中加入 encoding="UTF-8",plugin.xml"构建"选择"定制构建".再通过feather打包为jnlp发布.

接着奇怪 的事儿又发生了,浏览器下载运行后还是乱码,百思不得其解,搁置了几天,今天重新发布了一下,还是乱码,但新增加的一个功能没看到,很是奇怪,于是先在 JWS中删除了MyAppName,清除了缓存,然后删除了"C:\Documents and Settings\Administrator\Application Data\MyAppName"目录,再重新下载发现OK了,乱码问题也解决了,看来是本地缓存导致了乱码问题没有被更新,但是这也提出了一个问题, jnlp不是就是根据jar包日期来决定是否下载更新的吗?为啥更新之后运行时没有立即反应最新版本呢?奇怪奇怪了

2006年3月29日星期三

新东方雅思班回忆录(转载)

作者:天蓝色

清理完从北京带回的行李,桌上多了不少的英语辅导书,还有少不了的新东方雅思教材和磁带。但从新东方回来后,我的变化决不仅仅只在表面的这些。

昨天在珞珈山水BBS(武汉大学的BBS)上遇到一个MM,问我关于新东方和出国的问题,结果我们从凌晨谈到两三点钟,她熬不住了才打住。这时我才发现自 己很多思想和经历都在新东方的两个星期内已经改变了。加上零星收到的一些新朋友的短信,我觉得应该在开学前的一点点空余时间里把我所经历的故事写下来,也 为那些很想了解新东方的朋友提供一个窗口。

我把这些经历分成一个个单独的小篇章,并把一些特别的资料附在一边,以便于大家转载和分享。我本人对于商业或者政治上的媚俗向来深恶痛绝,因此力求文中能 客观公正的写下我所感受和经历的一切。文中所有的评论仅能代表个人的看法,并无他意。希望能使更多的人真正认识被出国的狂热和财富的欲望掩盖下的一个真实 的新东方生活。

校舍和环境

我所在的雅思暑期住宿班YZA10A班,在四环边亚运村旁边。其实校舍离亚运村还远很多。刚来的时候,热心开车送我的朋友,拿着地图和新东方的地址指南, 在校舍外面转了半个多小时,最后竟然跟着一辆印着“新东方”的麻木的士(武汉的说法,就是三轮摩托)才找到了门口。

校舍的环境很让人满意。三个人一间,教室都有空调,和食堂一起紧挨着宿舍楼。其它的设施应有尽有,包括小卖部,浴室,开水房,公共201电话和洗衣房。报 到的时候就换了一张饭卡,无论买什么都可以用卡结帐。校舍一点都不大,除了宿舍楼和教学楼,中间几个篮球场,可以借到球类的体育器材稍稍放松一下。比起那 些狗不拉屎鸟不生蛋的gre校舍,我感觉像是天堂。来之前我听到关于新东方的艰苦故事太多,差点把《生存手册》都给带来。我随身的行李什么都有,感觉不是 来学习而更像是野营的。

不过周边环境就很糟糕。实际上周围都是垃圾收购场,到处都是垃圾,包括那些运垃圾的没有锁和车窗的旧车都是。刚来到的时候,在楼上望着围墙外一堆堆的垃 圾,感觉自己也像是被收购来的,或是等着被美国和英联邦大学收购的垃圾。附近都是北方的外地人,也没有好一点的餐馆和商店。但是最近的快餐店和超市走个一 刻钟就能到了。

校舍的规定很严格,进出大门都需要听课证,晚上回来晚了必须登记,而且不能进入异性的宿舍。对于学习的一面倒很宽松,可以在教室里从7点一直自习到24点。

新东方的上课是按听课证的编号来座的,因此不用占位子,如果编号太靠后就只能看电视屏幕了。想有好的效果,一定要早报名。因为提前了半年报名,我就坐在3号位置,第一排。

对于12天的半封闭式学习,这些设施基本齐全。何况新东方的校训就是“从绝望中寻找希望”,一向以艰苦的环境来激发人的学习动力。毕竟革命不是请客吃饭, 来新东方不是来旅游和度假的。这里的校工也都很敬业,公共设施都保养的很好,工作起来从不怠慢。毕竟是民办大学,拿薪水吃饭的,干不好就会下岗。

但是唯一受不了的就是这里的食堂和小卖部,所见之黑连新东方的老师都深有同感

食堂虽然服务时间很长,但是和三个班的学生比,过于狭小,每次打饭都要排很长的队。再就是供应饭菜的价格奇高,种类巨少。一份茶碟般大小的鸡丁就要5块, 而且其中大部分是辣椒和骨头,加上味道就不用提了,吃到肚子里就没多少,也没感觉。最便宜的番茄鸡蛋也要3块5,最贵的菜是6块5,小炒就更贵了。所有的 菜不加上面食不超过20种。

这里我唯一可以接受的是面食。一大碗牛肉面或杂酱面只要4块钱,而且不用等长队。不过我从来就没吃饱过,经常11点吃午饭,下午三点就饿了。有一次晚上11点背单词,饿得两手发抖,幸亏还存有两块巧克力饼干,否则就会抢室友的点心了。

我把以前对武大食堂所有的厌恶在新东方都变为了思念,就像老鼠想念大米。

由此我们经常出去打牙祭,女生一次买点心买个100多块也很正常。对于以后准备想去新东方的同学,希望一定要有所准备,包括心理和物质两方面的。

同学和室友

说来很可惜,雅思班的时间实在是太短,没有太多的机会去结交和认识朋友。大家平时都忙着自己的学习,临到快走了才有心情去和天天一起上课的陌生同学相识。其实大家都很想多认识些朋友,特别是在寂寞紧张的异乡。

事实上新东方是一个很容易也很值得交朋友的地方。一是同学都来自全国各地,各自的环境都不同,相互多交流很容易了解不同的文化和知识。二是同学大多都是为 了出国的目的而来,都有共同目标。以后可以相互分享出国的经验和考试的感受,很有可能到了国外还是同学。三是来到新东方的学生素质基本上都不会差,没有一 点学习基础和经济实力是不会贸然来报名。多认识一些优秀的同学对于以后的人生发展只有更多的好处。

这一期雅思班共有三个班,两个学术类,一个移民类。学术类的都是准备去英联邦国家留学,以大三的学生为主。移民类就有不少阿姨大妈级的人物了。

我认识的大多为大三学生,北方的居多,其它各地的都有。旁边座的就是青岛大学的小伙子,很容易相处。右边是一个湖南师范99新闻的女生,我们竟然还认识同一个武大的同学,世界真的很小。

我后面居然是一个高一的小MM,有天我自习时她还要我帮她做暑假物理作业。她说她的同学很多都去了澳大利亚,自己也很想去。她好像以为澳大利亚满地是可爱的考拉熊和跳来跳去的袋鼠,从来没想过出国后的艰辛,寂寞和紧张,当然还有自费需要的巨款。

好几个朋友都是在最后一天才认识的。实际上大家早就看得眼熟了,终于有机会知道了对方到底是谁。

在这里还遇见了很多有趣的人。比如两个在英国读了一年书,用回国来学雅思并准备考试的高中生。还有一个山东大学的大一MM,有一天我们成为唯一自习到 23:20的两个人。脸有些黑,不过轮廓很端庄,满可爱的。特别是一个大连的高个MM,比站在讲台上的张皓还高,头发很长,眼睛也很大,非常文静。直到快 走了也没敢问她的名字和地址,因为对自己的身高没信心。

最高兴的是遇见一个武大的PPMM,99法学的,而且也是武汉人。还没几天,周围就已经围着几个高个男生了。室友们也开始不由自主地谈论她和她那双很有气 质的眼睛,看来武汉大学女生的水平还是很高的。不过这个丫头很爱玩,有一天晚上自习时想找她练口语,打她手机时居然还在迪厅里听音乐。

至于我的两个室友,全是江苏人,都是活宝。

男生和女生

很出乎我的意料,这里的女生尤其得多,而且不少很会打扮,相信这和雅思考试的类型有关。雅思主要针对英联邦国家,留学以自费为主,不像GT班那么紧张,时间也短很多,所以这里有很多富家子弟(当然不包括我这样饭都打不起的穷人家的孩子)。

因此我感觉这里的学习风气不如在gre和tofel班听说的那么好,不过仍然不乏刻苦的学生。每天我无论我多么早的起床或多快地解决晚饭去自习,都会有人比我更早地开始学习。这种现象让我对自己很难满意,毕竟我是来自武汉大学的学生,不希望输给任何一所大学。

此外对于这里很多急于在出国道路上寻找伴侣的寂寞少男少女,新东方提供了一个很好的机会。到了我离开的晚上,在操场上增加了很多成对的身影。

有朋友把这种行为称为“速配”,并且嗤之以鼻。不过我觉得在这样的一个年龄阶段,因为寂寞而相互吸引是很正常的。毕竟每人对于出国和感情的看法是不一样的,应该尊重每个人的选择。

但我认为12天足够爱上一个人,却不足以了解一个人。

如同我在座位上贴的:

Offer or love?

That’s question.

室友

我的两个江苏室友都是大三的。小艺在南京理工大学,瞒清秀的小伙子,但是总像个小孩子。上火车之前买一个大头狗娃娃,比枕头都大,老爱和另一江苏MM打打闹闹。小凯在深圳上学,是个电脑DIYER狂人,三句不离电脑以及相关配件。

首先深圳是全国电脑配件价格最低的地区,走私货特别多。他带来一块专业二手显卡,平时卖1万多的,他300多就买到了。他还带了一台数码照相机,为此和几个朋友谈了一晚上的红外数码相机的话题,感觉像是透窥狂的沙龙。

他可以就一种配件谈上几个小时,而且他说的价格会让人吐血。我们后来都不敢听他的深圳报价,似乎那里配件便宜得可以买两斤白菜就送一根内存。要是他谈起自 己的配件,更是龙飞色舞,而且经常把实物拿给我们看。当他拿出的实物原来越多时,我们开始有些莫名其妙,最后我们把他的柜子清理了一下,差点没昏过去。

他带来一块专业显卡,一根128M内存条,两块40G硬盘,一个联想上网USB鼠标,一个游戏摇杆,一根硬盘线还有若干DVD光盘。

我们实在是想不通他带这些东西来新东方来干什么。



来新东方几天后,小艺介绍一个隔壁的江苏老乡来玩,后来那个老乡寝室的两个室友,一个潍坊,一个辽宁的也常来聊天。

那个潍坊的男孩特别喜欢汽车和军事,为此我头一次大发谈瘾,连着一个星期,每天从23:00谈到01:30,直到其它人抗议了才走。

我先从林彪谈到毛泽东,从周恩来谈到李鹏。接着就是人人爱听的最新中国兵器情报。

海军部分,我从新驱谈到航母,从基诺谈到039,从现代谈到瓦良格,从091谈到095,从出C803谈到红鸟三,从飞豹谈到JH8。

空军部分,我从J10谈到J11,从红旗九谈到S400,从反击一号谈到激光武器。

陆军部分,我从98式谈到63A,从红箭9谈到WZ10,从95式谈到PF89。

二炮部分,我从东风31谈到41,从M9谈到M11。

谈得最深入的建国后的局部战争,因为他的父亲当过兵,得到很多鲜为人知的内幕,非常高兴。

当然我免不了对中国20年的军事思想体系和军事体系的演变进行了系统的总结。看着他们眼睛一眨不眨地听我一个人说,俨然自己就是国防部的发言人。

等到所有人都对军事话题有些厌烦的时候,我又讲了一些关于武大美女的故事,说得他们直流口水。

幸好他们对西方历史和哲学,中国传统文化,当代世界政治经济局势的发展等等话题都不敢兴趣,否则我可以开一个星期的个人演讲了。

新东方老师

相信这是一个永远让人谈不完的话题,也是每个学生对于新东方最直接和感性的认识来源。我认为新东方最吸引人,最成功的的要素有两点:

一是鼓励奋斗和成功的新东方精神,二是充满个性和才华的新东方老师。

但对于现在一般的学员,想直接接触那些新东方的激情派元老们,比如俞敏洪,王强,徐小平等,都已经比较困难。特别在胡敏担当新东方第二任校长后,那种革命 式的激情和口号的已经不再是新东方的主要风格。随着现在新东方风格的转变和教学的多元化,再去谈论新东方精神已经有些老套。而且现在的大学生对于出国和新 东方的认识更加理性化,当初那种看见红宝书就要鞠躬的传闻和红卫兵显得过于相似,宗教式的崇拜和狂热反而容易使人反感。因此,虽然我在新东方的短短12天 内,很深刻地体会和理解那种不同于中国传统文化的新东方精神——它鼓励竞争和个人奋斗,相信自身的潜力和最终的成功,并且带有极为张扬的个性和激情,但我 仍然不把它作为一个主题来讨论。

我更希望通过我所认识的新东方老师来了解和看待曾经被神化的新东方。我相信每个人都有足够的视野和理性来对事物进行判断,而不是居于媒体的渲染或嫉妒的攻 击。至少这些老师不同于我以前在课堂和其它补习班里所认识的老师,他们不仅仅给予我不负于巨额报名费的回报,更用他们在短短的授课时间里所体现的个性把他 们的成功精神深深引入我的灵魂。

在这些老师的授课中,我也注意到了新东方严格的教学制度,这才是新东方不败的基础。因此我按照新东方的管理方式在最后对老师都进行了打分和评价,但是很可惜,虽然这些老师无论任何一个在别的学校都肯定会视为珍宝,但是都很难得到高分。因为他们工作的学校是新东方。

听力:张皓 一位可爱的耗子

听力课是第一节课。开始前一个瘦瘦的男人上台来,介绍自己是班主任,然后让大家试无线耳机。接着耳机里就传来一阵音乐声,每次听力课之前都会如此,有时是梁咏琪或陈慧贤,有一次居然是赵传。

很快一个很不起眼的男人拿着包快速进门走进讲台,这是新东方老师的特点,很少迟到和拖堂。他穿着一件不到10元的廉价T恤,一条暗灰的西装长裤,脚上一双 现在没多少人爱穿的白色旅游鞋(这年头,要么是休闲鞋,篮球鞋,运动鞋,就是旅游鞋也至少是黑色的)。后来我注意到他很多时候是不穿袜子的,有时还脱下一 只鞋单立着写字。

他个头不高,瘦瘦的身材,黑黑的面庞,有一双不大但很明亮的眼睛(我不是在描写一只老鼠,是在描写一位老师),后面居然还留着长发,没过了脖子。

如果我在讲台以外的任何地方看到他,肯定把他归为北方外来民工一类,他自己后来也承认了这一点。

很快他开始用沙哑的嗓音开始说话。先讲了他金嗓不倒生锈的一次意外事故,然后以极快的饱含着热情的速度开始讲课。

那节课下,有一个大连的MM向他问问题,结果她比站在讲台上的他还高出一点点。

他就是张皓,一个在评分表上我评为最可爱的老师,同时也是最受人欢迎,让人一听到名字就想笑的老师。最后一节课下,我抢着让他签了一个名,因为后面有一队女生拿着笔记本正向他涌过来。这也是我在新东方唯一想要的签名。

张皓的讲课风格非常快,而笔记和作业是最多的。总共5次课把雅思的每一种题型都详细讲解了一遍,当然还有大量的练习。

张皓非常注重单词的记忆和归纳,毕竟生词在听力中是最要命的。他除了详细讲解听力材料中出现的生词和习惯短语,还经常归纳同类的单词让我们记下来,要求当天就背会。

张皓的语言极富个人风格,经常拿自己的缺点开玩笑,或者讲些关于自己的搞笑故事让人放松一下。他用得最多的词就是郁闷,而且乐于在讲台上制造喜剧效果。他和其它的新东方老师关系私下都不错,因此也爱开他们的玩笑。

但是从他谈论过的翻译生涯,感觉他属于天资聪慧,却克服了很多自身不利条件,走了很长的道路才成功的人。因此他的话语中也不乏一些充满智慧闪光的语句,严肃得完全不像那个可爱搞笑的形象。

以下就是他的语录和故事集(特此声明,本文中的所有话语都是本人在当堂记下,或当天回忆的,为说话人原话的大意,而不少内容不是原文原句。很多的话语在个别子句上有出入,但不影响大意和大家的理解)。

正式类:

每一道题都和未来相关。

因为粗心丢分是最可惜的。

对自己的人生负责,对自己的分数负责。

我是15岁上大学的。

一个男人如果把命运交给一个女人,这是不可饶恕的错误。(他对出国一带一现象的看法,深刻!寄托男必看之)

非正式类:

她问我一个很深刻的问题:“What’s your name?”我沉思了一下,然后更深刻地回答:“Yes”。(他上大一时一生的痛)

新东方分为两类人。一类是海外归来的海归派,我们土生土长的是土鳖派。


关于他头发的故事:

有同学课下递条子,问我的发型是不是学F4的。有女生说我的发型不错,但最好用发夹夹起来。还有一个人说我的头发是“五好”:“好没新鲜感,好没个性,好土,好俗……。”我很冷静地对她说:“你的条子递错了,你应该递给何钢老师。”

曾经有个同学议论我,说:“那个老师的声音这么粗,怎么像个男老师?”

在新东方总部的时候,有个大娘面对我走过来,对我说:“大妹子,你教我怎么美容呀?”

有一次我去美发店(其实他最应该去美容店,一脸的民工相),看到上面写着“洗剪20元”,觉得很便宜,就进去了。剪完以后,他居然找我要40元,我觉得他 完全不可理喻(换成了美女,估计立马掏出一张50大钞,然后说:“不用找了。我是新东方的老师,这是我的名片,请问你什么时候可以下班?”)他说了一个很 专业的名词:“短穗”。后来我到处找人打听,才知道是给女孩子做的(那个美发师把他当作了女孩子?)。如果大家想知道“短穗”是什么,可以看看我后面。

他和女生的故事:

有一次我进门的时候,有一女生向我冲来,我以为会发生什么,结果什么也没发生。她直接冲出门了。(Faint!)

有一次我去买菜,遇到一个女学生和她丈夫一起买菜。当时我想有她丈夫在,所以不好跟她打招呼,所以看了一下就走开了(他当时的眼光一定很依依不舍)。后来 她也看到了我,估计丈夫在旁边,也不好打招呼,所以看了我一下也走开了。这时我听见她说了一句话,让我郁闷了一年多,“刚才那个民工长得好像我在新东方的 老师”。

他的信件故事:

每天我都要受到50多封信,什么内容都有(引起下面的一阵笑声,不知道有没有女生的求爱信),封封都回。(后面我会附上他的特搞笑的地址,大家一定多写信给他)

曾经有一个人给我写信,信上说:“亲爱的耗子我爱你,就像老鼠爱大米。如果你还没结婚,我就一定来追你……”我看了很高兴,最后一看落款:“爱你的约翰。”我只是头发长了一点,还没有这种倾向呀。

还有一个女生发了一个flash给我,说是一个女生的秘密。当时我很有兴趣(他属于有贼心没贼胆的一类),那是一个女生的秘密呀。那个flash上有一排水桶,我一个一个点完以后,上面打出一行字:“我在每个水桶里都放了耗子药。”

另有一个女生也发了一个flash给我,上面问:“如果全世界的猪都死光了会有什么结果?”我很奇怪,我和猪有什么关系?点击后一看:“至少还有你。”(下面开始鼓掌)

他和何钢的故事:

她很温柔地扬起了手指对我说:“我的孩子已经三岁了。”(何钢介绍了一位新东方新来的女老师让他追)

有同学问我,说新东方的老师有的喜欢在课上讲一些yellow story,为什么我不讲。我说我觉得自己属于中国古典类型的男人,所以我是不会讲的,但何钢老师肯定会讲。

他的事迹和风格:

911事件后,有个同学知道我是一个民族主义者,就问我关于此事的看法。我说:“第一,这事不是我干的。第二,本拉登干了一件我很想干的事。”(唯恐天下不乱,爱搞恶作剧的典型)

你们看到电视上,美国大使馆墙上黑的红的绿的蓝的,什么颜色都有——那都是我干的!(他最自豪的事情,99年)

有同学问我为什么从上课以来没见我换过衣服,我记得……我好像换了(还是一件差不多的廉价T恤),不过我夏天有两套衣服就够了(包括身上这一套),冬天一套就行了(让我想起了孔乙己,他以后千万不能娶一位有洁癖的老婆)。

我最崇拜的是李白同学(李白什么时候成了他的同学?),因为他写过……的诗句(他很骄傲地把一首没多少人听过的唐诗很流利地背诵一遍),还有我们敬爱的周 总理(还好没有成为他的同学),再就是孙悟空同学(当初大闹天宫肯定让他打前锋),当然还有乔峰同学(他的同学可真多,但跟他都不是一个档次的)——情深 似海,义薄云天(原来他的Email名字“丐帮帮主”是这么来的,当年逼走乔峰想篡夺帮位的内奸就是他)。我最佩服的是小新同学(两眼开始放光,比被美女 大夸一通还兴奋)——他那种人,啥也不是,谁都敢玩!(他俩肯定是同学!)

邮箱地址:gaibangbangzhu99@163.net 和 haozi_250@sohu.com

作文:何钢 其貌不扬,恃才放旷

刚见到何钢的时候简直不敢相信这样的人会是老师。等到我看到他的时候,他已经在台上了。

他的年龄很难让人猜测,从外表看一般为30至50之间。因为他体态及其富态,又圆又大的脑袋上露出一颗光亮的头顶,没有完全荒漠的后脑勺竟然留了及肩的长 发。在丰满的脸上总是眯着两颗小眼睛,在整个讲课的时间里,似乎很少见他们睁大过。这样的奇人奇相若穿上道袍或法衣,一定可以吸引很多围观者和善男信女; 但若穿上便装,只怕三岁以下的小孩不小心撞见了都会吓哭(三岁以上的都会吓得跑开)。

在现在反常的北京酷暑季节,他的身材显然非常不适应。他经常坐在讲台后,拿着一个扇子,边扇边讲,而且不停地喝水。结果后排的同学在电视上只能看到一个鸡 蛋一样的脑袋在黑板前。他上课很爱喝水,每次班主任至少会放三瓶矿泉水在讲台上。中间一下课,就直奔门外,估计是完成“进出水”的后面一项过程。

但是当他开口讲课时,听声音好像应该不到30。因为新东方的老师平时工作量极大,一般同时上好几个班,从早到晚,不是年轻人扛不下来。即使这样,上完以 后,也必须组织老师去旅游放松,因此一线老师的年龄都在30左右。当年的元老除了钱学强,现在都向40接近。但是对于这位老师,年龄的变化不会使他变得更 帅。

新东方的老师总是让人不敢以貌取人,也正是在这个不被传统观念束缚的学校,这些被世俗压抑的年轻老师,才可以一展风采,酣畅淋漓地挥洒自己的个性和价值。

何钢是我见过表里反差最大的,也是最有才华的老师,由此也可以看出新东方宽容的择才标准。

作为一个作文老师,他对于英语语言的把握和深入是非常惊人的。也许说他对于英语文学的掌握很深更为合适。他随便聊起过他在北大图书馆借过一本英国诗人的原 版诗集,书价要2000多,英镑。有一次很随意把他在美国大学里看到的文学教程轮个批判了一通,让人大开眼界。比如为了避免种族歧视,美国政府在文学教科 书中,除了所谓的“白种死男人”的作品,添加了一篇古希腊时代女同性恋的诗(只有两行),一16世纪某女黑人写的求爱信诸如此类的作品。

他还提及他参加雅思考试中,一次及其严重的失误。严重到几乎让人认为考官能给他个分数都已经是奇迹。结果他后来用很不经意地说那次只得了8分。

在新东方的作文教材中,他把其中一篇范文讲解了一下,“很凑巧”是他的作文。课后,我把这篇8分的作文逐字逐句研究学习,结果发现其中的很多单词已经大大 超出了雅思单词的范围。其中所应用的典故远远不是一个英语老师可以掌握的。即使对于一般的单词,他也尽量用一些生僻但很华丽的词来代替。用这样的手法来写 一个关于大学新生入学问题的作文,简直就是故意考验考官。

他把英语作文和其中的逻辑规则讲得极为透彻,偶尔看到他闭着眼睛讲了一段又突然惊醒转到另一个话题。按照胡敏的解释,新东方老师对于每节课的内容至少都讲 过上百遍,等到第50遍之后,他再讲同样的内容,自己就会有一种想吐的感觉。有时对于讲课的内容太熟悉了,讲到下课才发现自己是在讲课。不过意识是走神 了,但是口里的内容却一点不差。

如果把新东方老师讲课的风格来分类,那么基本上可以分为激情派,表扬派和学院派三类。激情派就是老俞那种,上课不提一点关于英语的内容,但说得人热血澎 湃,下课后狂背单词。表扬派就是一江博为代表的,把课堂当作自己舞台,尽情表扬和展示自己的才华和对英语的热爱。学院派就比较传统了,以严密的逻辑和深厚 的学术功底严谨地授课,胡敏就是典型。(三个代表?)

张皓自称为激情派,而我可以把何钢归于表演派。何钢的表演特点不像江博那样用肢体语言,蹦来蹦去,一堂课下来浑身大汗淋漓才过瘾。何钢喜欢用一种带有喜剧和挑逗的语言来制造一种轻松但很吸引人的课堂效果。

作为一个演员,他并不喜欢表扬结束以后仍然和观众多交流,似乎他更喜欢台上的自己。所以他很少课下回答同学的问题,最后一节课也没有留下私人的邮箱。

他对于课堂的内容,常常用一种被逼无奈的语调来结束一句话,常常引人发笑。他还特别爱谈一些很有刺激性的话语,当然不忘把有关的单词让大家记下了。

事实上,从他那些显得很另类的单词中,可以感受到他丰富的知识领域和在语言写作方面华丽而炫耀的风格。另一方面,即使在用汉语调侃中,他也习惯性地使用很多带有文学性的词汇和典故。因此他的话语中有很多很经典的用词手法。

关于他爱谈些有刺激性的话题,让某些女生觉得他有些油腔滑调,但是听他的课确实很过瘾,几天不听就很想念他。比如关于他会说些yellow story的传说,我倒是没听到,但是对于这方面的擦边话题他一开讲,就如同滔滔江水连绵不绝。

比如一次提到关于电视的副作用,色情和暴力方面的问题,他让我第一次知道了这两个单词的地道写法。谈到violence方面,他大谈中国古代对于暴力美学 的推崇。从三国谈到水浒,某一回哪些人杀了什么人,原文又是如何描写,如何有诗为证,翻译成现代文怎么理解等等。说到了sexually appealing scenes的例子,他又挨个把四大名著加《金瓶梅》涮一遍。特别对于《红楼梦》,似乎贾府内外的男男女女都脱不开干系。一通兴奋之后,我的笔记本上记下 了几十个罕见的单词,比如SM的原型列在后面供人分享。

何钢语录:

正式类:

好的作文是把恰当的词用在恰当的地方。

科学注重创造,文化强调继承。

非正式:

考试中间休息5-10分钟,你可以尽情进出水。(雅思考试规定)

还有几个变态带着睡袋。(北京地区雅思报名处凌晨4:00的排队情景)

拿7分还是较比困难的。(这是哪个朝代的用词?)

如果你还在奋笔疾书,你就会上了英国情报五处的黑名单,列入不欢迎人员,享受和本拉登同等的待遇。(雅思考试结束时)

照片上的那个人的头发极其茂盛,显然不是本人。(雅思报名用拼音,他与另一人弄错考场)

那次考试的失误严重影响了我的成绩,那时前车之鉴,……最后我得了8分。(他把作文1从第一页写到第四页,才发现中间还有两张纸)

幸福真的很难得到。如果现代科技发明一个键,按一下,粉笔灰自己往下掉,那有多好。(他正汗流浃背地擦黑板)

排队上WTO的时候再背一次。(最经典的一句,关于如何背单词)

它为什么只有2分钟,这是资本主义追求剩余价值的结果。(雅思作文的批改)

所谓及其负责任的考官,就是看完第二段第一句之后,看第二句。(雅思作文的套路)

这等于你让他不爽,那么他会让你不爽。(如果你把每段中心句写在末尾)

……,妇女解放的道路依然漫长。(一提到女性与社会的作文,免不了这句话。他好像很怜香惜玉)

美国有些快餐店,使用两个月的速养鸡,所以都称为junk food。老外都不愿意去那里吃,宁愿在家做。我是会去的,不是因为想吃junk food,而是因为在中餐馆里的鸡,你不知道是被车轧死的,是别的鸡踩死的,是得鸡瘟死的,还是在鸡粪中淹死的。(当时我有一种强烈的反胃冲动,幸亏他停 住话题,否则我肯定会冲出教室。)

何钢提到的部分单词:

violence 暴力 pornography 色情 sexually appealing scenes 带有性倾向画面

sadistic impulse 肆虐冲动 masochistic 受虐狂 (合称SM)

censorship 节目审查 mahjong 麻将 eco-friendly 环保的 ecology 环保学

recyclable 可循环的 biodegradable 可降解的 lunch box 午餐盒

disposable 一次性的 lesbian 女同性恋 gay 男同性恋

sexual orientation 性倾向 heterosexual 异性恋 homosexual 同性恋

bisexual 双性恋 kick 回扣 liberal arts 文科 trans genetic food 转基因食品

kinship 亲情 commitment 敬业精神 migrant 民工

阅读:马针峰 最令人尊敬的老师

马老师是典型的学院派的老师。他也有一颗很大的脑袋,不过头发比何钢还正常多了。平时和蔼而严肃的眼神还有整齐的打扮使人肃然起敬。

因为他属于比较传统的老师,因此很多学生对他的印象不如前两位有个性老师那么吸引人了。但事实上,在学术方面的造诣他是最深厚。他总是带着我们把雅思的每 一种阅读题型和其中的小题一题一题地做完,并且及时总结和分析。此外,他对于出国留学的了解远远多于这期雅思班的老师。每次课下,都有很多的同学围在他周 围询问有关的问题。而他总是会花很长时间,很耐心地一一回答,直到太晚了才离开。

因此他的教学风格并不非常有个性,插话和玩笑几乎没有,有些学生很容易在150分钟的课上睡着。在最后对老师的评分中,有的学生只给他1、2分的评价(5分制)。事实上这是很不公平的。

他所讲授的阅读和其它技能都有所不同。在英语的运用方面,只要有很好的英语环境,口语和听力都可以在几个月以内提高,但是阅读能力却很难增加。当然最难的 是作文,不过对于日常的生活学习,阅读依然是头号难题。马老师从很多的方面分析了英文的成文规则和英语的思维方式,并且亲自对阅读的技巧一一讲解。认真听 下来,即使对于一篇几千字带有大量学术生词的文章,短时间内看下来也不是难事。雅思毕竟是最注重英语实际运用能力的英语考试。

特别对于雅思一种判断文章内容类型的题目,尤其能体现东西方文化和思维差别。而他讲解地很透彻,从做题中我体会到了西方理性客观思维的特点,在两个极端中存在大量的中间状态,不同于东方非对即错,黑白分明的世界观。

事后才发觉马老师讲解的方法和内容是最实际的。其它的听力口语虽然容易掌握,但是没有语言环境,运用的机会很少,作文就不用说了。学习结束后不久,我去新 东方查资料,因路途遥远,事务繁多,我只有很少的时间去查询和浏览。当拿到一本砖头般后的英文资料后,想不到只有马老师教授的阅读方法才管用,否则连目录 都看不完。几本书翻下来,紧张得一身汗。事实上现实中的阅读要求比雅思考试的更高,难怪国外的留学生都怕做论文。因为每次他们都必须在短期内看完一堆资 料,然后才能写出论文。加上英文的书籍特别厚,字体又小,又是字母文字,不如象形文字好查找,没有在国内练好扎实的基本功,国外只会活受罪。

信箱:zhengfengma@sina.com

推荐的网站:

www.scientifiamerican.com

www.ielts.org

www.britishcouncil.org.cn

www.businessweek.com.uk

以下附上他对于留学申请中的个人简历的讲解:

内容:为什么选这个学校?

如果转学,为什么转学?

如果被录取,你会如何利用学习时间?

你的学习计划是什么?(目的要说清楚)

你打算毕业后做什么?

把在校的学习和今后的目的联系起来,突出自己的特质(creative, term-up)

对知识的好奇,独立的人格,独立的钻研能力


口语:Nevin Blumer 最希望在国外见到的老师。

Mr.Blumer是一位很典型的英联邦国家的绅士,总是认真的穿着大号的衬衫掩着大肚子,提着公文包赶路。即使因为吃到而满头大汗也不会解开第二个钮 扣。他的头发介于金色和褐色之间,浓浓的眉毛和深深的眼窝在敦实的下巴映衬下很精神。他的口音很纯正,不像美语那么拗口,又不同于语调变化过多的英式英 语。

第一节课他自我介绍他是加拿大人,在日本教了10年书,后有去新加坡任教。想必新东方把他挖来一定用了不少时间和银子。他上课总是用幻灯片放笔记,介绍他的家庭时还放了他两个可爱baby的照片。

Blumer讲课风格主要是用简单但幽默的话语加上夸张的表情和动作。也许长期在亚洲教授英语的经验使他知道只有用简单的语言才能让大部分学生听懂,再加上生动的表演能够激发学生的兴趣和增加对不熟悉内容的理解。

他很喜欢让学生参与他的讲课,结果前三排的人都被他点过一遍。由于雅思的口语实践性很强,他还布置了大量的课堂练习。

他教授的特点是那种很典型的西方方式,鼓励多参与,不怕失败,每人都可以做的很好。这种轻松环境对于学习雅思口语是极有帮助的,因为雅思的考官都是老外。

可惜我的口语测试练习还是太紧张。那位考官和我谈了几分钟之后,问我为什么这么nervous?I said :“It’s my first time to talk with a foreign young lady.”这位可爱迷人的金发女子扬起了长长的睫毛,睁大了琥珀色的大眼睛,看着我“哦”了一声,最后手下留情给我5分。

平心而论,Blumer的课堂内容和其它老师显得有些简单。但是毕竟他是用外语教课,而且口语考试也不需要用复杂的语法和词汇。让学生用简单的语句自如流利地交谈就是最好的结果。

Blumer的笑话和故事我就没有记什么,毕竟每个人的风格都不同,不是每个老师都有大把的笑话或者yellow story放在口袋里准备着。

最后他很依依不舍地留下他的邮箱,说他和很多学生都经常联系,即使是只听过一节课的学生。他送给我们一句居里夫人的名言:

Nothing in life is to be feared. Only understood.

——Mme Curie

最后希望他能在加拿大有机会和我们再次相见,真令人感动。

邮箱:nblumer@95777.com


综合评价:

很可惜,本来这四位老师都可以得到4.5左右的高分,但是在我听完胡敏的讲座之后,我全部给了他们4.0。因为我认为不论他们如何优秀,但是他们和胡敏之 间的差距是客观存在的。我给胡敏的打分是5.0,因此,他们和胡敏之间的差别使我最后只能给了4.0分。不是他们不优秀,只是新东方还有更为优秀的老师。


2006年3月15日星期三

出租司机给我上的MBA课(转载)

原出处:刘润博客


我要从徐家汇赶去机场,于是匆匆结束了一个会议,在美罗大厦前搜索出租车。一辆大众发现了我,非常专业的、径直的停在我的面前。这一停,于是有了后面的这个让我深感震撼的故事,象上了一堂生动的MBA案例课。为了忠实于这名出租车司机的原意,我凭记忆尽量重复他原来的话。

“去哪里……好的,机场。我在徐家汇就喜欢做美罗大厦的生意。这里我只做两个地方。美罗大厦,均瑶大厦。你知道吗?接到你之前,我在美罗大厦门口兜了两圈,终于被我看到你了!从写字楼里出来的,肯定去的不近~~~”

“哦?你很有方法嘛!”我附和了一下。

“做出租车司机,也要用科学的方法。”他说。我一愣,顿时很有些兴趣“什么科学的方法?”

“要懂得统计。我做过精确的计算。我说给你听啊。我每天开17个小时的车,每小时成本34.5元……”

“怎么算出来的?”我追问。

“你 算啊,我每天要交380元,油费大概210元左右。一天17小时,平均每小时固定成本22元,交给公司,平均每小时12.5元油费。这是不是就是34.5 元?”,我有些惊讶。我打了10年的车,第一次听到有出租车司机这么计算成本。以前的司机都和我说,每公里成本0.3元,另外每天交多少钱之类的。

“成 本是不能按公里算的,只能按时间算。你看,计价器有一个“检查”功能。你可以看到一天的详细记录。我做过数据分析,每次载客之间的空驶时间平均为7分钟。 如果上来一个起步价,10元,大概要开10分钟。也就是每一个10元的客人要花17分钟的成本,就是9.8元。不赚钱啊!如果说做浦东、杭州、青浦的客人 是吃饭,做10元的客人连吃菜都算不上,只能算是撒了些味精。”

强!这位师傅听上去真不象出租车司机,到象是一位成本核算师。“那你怎么办呢?”我更感兴趣了,继续问。看来去机场的路上还能学到新东西。

“千 万不能被客户拉了满街跑。而是通过选择停车的地点,时间,和客户,主动地决定你要去的地方。”我非常惊讶,这听上去很有意思。“有人说做出租车司机是靠运 气吃饭的职业。我以为不是。你要站在客户的位置上,从客户的角度去思考。”这句话听上去很专业,有点象很多商业管理培训老师说的“put yourself into others' shoes.”

“给你举个例子,医院门口,一个拿着药的,一个拿着脸盆的,你带哪一个。”我想了想,说不知道。

“你 要带那个拿脸盆的。一般人病小痛的到医院看一看,拿点药,不一定会去很远的医院。拿着脸盆打车的,那是出院的。住院哪有不死人的?今天二楼的谁死了,明天 三楼又死了一个。从医院出来的人通常会有一种重获新生的感觉,重新认识生命的意义,健康才最重要。那天这个说:走,去青浦。眼睛都不眨一下。你说他会打车 到人民广场,再去做青浦线吗?绝对不会!”

我不由得开始佩服。

“再给你举个例子。那天人民广场,三个人在前面招手。一个 年轻女子,拿着小包,刚买完东西。还有一对青年男女,一看就是逛街的。第三个是个里面穿绒衬衫的,外面羽绒服的男子,拿着笔记本包。我看一个人只要3秒 钟。我毫不犹豫地停在这个男子面前。这个男的上车后说:延安高架、南北高架~~~还没说后面就忍不住问,为什么你毫不犹豫地开到我面前?前面还有两个人, 他们要是想上车,我也不好意思和他们抢。我回答说,中午的时候,还有十几分钟就1点了。那个女孩子是中午溜出来买东西的,估计公司很近;那对男女是游客, 没拿什么东西,不会去很远;你是出去办事的,拿着笔记本包,一看就是公务。而且这个时候出去,估计应该不会近。那个男的就说,你说对了,去宝山。”

“那些在超市门口,地铁口打车,穿着睡衣的人可能去很远吗?可能去机场吗?机场也不会让她进啊。”

有道理!我越听越有意思。

“很 多司机都抱怨,生意不好做啊,油价又涨了啊,都从别人身上找原因。我说,你永远从别人身上找原因,你永远不能提高。从自己身上找找看,问题出在哪里。”这 话听起来好熟,好像是“如果你不能改变世界,就改变你自己”,或者Steven Corvey的“影响圈和关注圈”的翻版。“有一次,在南丹路一个人拦车,去田林。后来又有一次,一个人在南丹路拦车,还是去田林。我就问了,怎么你们从 南丹路出来的人,很多都是去田林呢?人家说,在南丹路有一个公共汽车总站,我们都是坐公共汽车从浦东到这里,然后搭车去田林的。我恍然大悟。比如你看我们 开过的这条路,没有写字楼,没有酒店,什么都没有,只有公共汽车站,站在这里拦车的多半都是刚下公共汽车的,再选择一条最短路经打车。在这里拦车的客户通 常不会高于15元。”

“所以我说,态度决定一切!”我听十几个总裁讲过这句话,第一次听出租车司机这么说。

“要用科学的 方法,统计学来做生意。天天等在地铁站口排队,怎么能赚到钱?每个月就赚500块钱怎么养活老婆孩子?这就是在谋杀啊!慢性谋杀你的全家。要用知识武装自 己。学习知识可以把一个人变成聪明的人,一个聪明的人学习知识可以变成很聪明的人。一个很聪明的人学习知识,可以变成天才。”

“有一次一 个人打车去火车站,问怎么走。他说这么这么走。我说慢,上高架,再这么这么走。他说,这就绕远了。我说,没关系,你经常走你有经验,你那么走50块,你按 我的走法,等里程表50块了,我就翻表。你只给50快就好了,多的算我的。按你说的那么走要50分钟,我带你这么走只要25分钟。最后,按我的路走,多走 了4公里,快了25分钟,我只收了50块。乘客很高兴,省了10元钱左右。这4公里对我来说就是1块多钱的油钱。我相当于用1元多钱买了25分钟。我刚才 说了,我一小时的成本34.5块,我多合算啊!”

“在大众公司,一般一个司机3、4千,拿回家。做的好的大概5千左右。顶级的司机大概每月能有7000。全大众2万个司机,大概只有2-3个司机,万里挑一,每月能拿到8000以上。我就是这2-3个人中间的一个。而且很稳定,基本不会大的波动。”

太强了!到此为止,我越来越佩服这个出租车司机。

“我常常说我是一个快乐的车夫。有人说,你是因为赚的钱多,所以当然快乐。我对他们说,你们正好错了。是因为我有快乐、积极的心态,所以赚的钱多。”

说的多好啊!

“要 懂得体味工作带给你的美。堵在人民广场的时候,很多司机抱怨,又堵车了!真是倒霉。千万不要这样,用心体会一下这个城市的美,外面有很多漂亮的女孩子经 过,非常现代的高楼大厦,虽然买不起,但是却可以用欣赏的眼光去享受。开车去机场,看着两边的绿色,冬天是白色的,多美啊。再看看里程表,100多了,就 更美了!每一样工作都有她美丽的地方,我们要懂得从工作中体会这种美丽。”

“我10年前是强生公司的总教练。8年前在公司作过三个不同部门的部门经理。后来我不干了,一个月就3、5千块,没意思。就主动来做司机。我愿意做一个快乐的车夫。哈哈哈哈。”

到了机场,我给他留了一张名片,说:“你有没有兴趣这个星期五,到我办公室,给微软的员工讲一讲你怎么开出租车的?你就当打着表,60公里一小时,你讲多久,我就付你多少钱。给我电话。”

我迫不及待的在飞机上记录下他这堂生动的MBA课。

============================

[注一] 关于真实性。事情绝对是真实的,并且我尽最大努力忠实于这名司机的原意,包括数字、选词、语气、构句等。除了我记忆力所限不能100%精确外,基本重现了当时的场景。我没有“润色”,因为我以为他的感染力比我要大。

[注二] 关于星期五。我发出了诚挚的私人邀请,希望他能来给我们做一场演讲。但这要尊重司机本人的意愿,如果他并不愿意、或者不感觉合适而未能成行,只能表示遗憾了。希望文章能够弥补希望参加的人的一些遗憾,也不枉我写了这么长。

============================

摘抄后记:

这篇文章摘后不久,满世界都开始转载了。南方周末还发过一篇相关的随笔文章,重点是讨论这个故事的潜意——员工要创造性地工作并享受工作,竭力榨干自己来为老板带来最大的价值。这当然是仁者见仁了,呵呵:)

2006年3月1日星期三

绿色减肥

刚看了央视十台的绿色空间-“我为肥狂”,赶紧记录,望如法炮制望能得其果

绿色减肥:
即坚持健康有氧运动。有氧运动的重要标准是心率维持在如下范围之内:
不低于(220 - 年龄)X 65%
不高于(220 - 年龄)X 80%

另外运动时间维持在30-60分钟之间,时间若过短,运动时消耗的是糖分;运动时间过长会因脑部缺乏血液供应导致缺氧,造成运动伤害甚至猝si。

主人公小老弟自创“原地跑步健康减肥法”,场地就在家里,一则有利于消除害羞情绪,二则不受天气季节影响,三则花费极少,甚合我辈胖哥一族之意

方法:
原地跑步
抬起双臂与肩平,两手掌叠搭,可锻炼胸部肥肉;
仰头90度,可锻炼脸部和脖子肥肉;
胸、腹部绑束身带,可增强锻炼效果;

器材:
很简单,两个家用脚垫,中间夹一层旧沙发座垫的海绵,用布条捆扎起来,作成跑步垫,一来可以防止打扰邻居休息,二来减少脚踏地面带来的冲击,另外再准备束身带两根

效果:
实在明显,那位小老弟三个月减了30斤,八个月坚持下来,从230斤变成了140斤,简直叹为观止啊!