CRI Radio

May 31, 2007

为什么母水果比公水果好吃?

      认识植物有性,是人类的一大进步。不仅植物本身有"男女"之分,就连它们的果实也有性别。

      研究人员说,水果不仅有雌雄差异,而且,雌性水果比雄性水果好吃得多。  

  橘子也分雌雄的:有突出圆点的是雌的,吃口好些;没有突出圆点的是雄的,相对吃口差些。  

  砀山梨也分雌雄的:在梨底有花蒂状的是雄的,肉质比较粗;没有得则是雌的,肉质比较细,吃口甜。  

  苹果的雌雄主要表现在果蒂上:果蒂较大者为雌性果,其味甘美爽口,汁多皮薄;果蒂小的是雄性果,既酸又涩,汁少皮厚。  

  桔子与苹果一样,也是看蒂分雌雄:雌者个大皮薄,核小且少;雄者发酸,核多而且皮厚个小。  

  梨的雌雄取决于其项部的深浅,深者为雌性,个大光滑,形美,味佳汁多,口感好;浅者为雄性,有麻点,水少干涩。  

  荔枝壳上之"刺"若为针尖状,即是雌荔枝,汁多且甜,核小壳薄;相反,其刺为圆形者便是雄荔枝,不仅汁水少,且淡而无味,核大壳也厚。  

  有关西瓜分"公母"的说法:在与瓜蒂相对的另一面瓜皮上,都生有一个圆形块状组织,俗称"肚脐","公"西瓜的"肚脐"较小,而"母"西瓜的则较大,有硬币大小,"母"西瓜比"公"西瓜甜。  

  来源:腾讯科技

西藏密底--伊利早餐奶问答

1、 藏民不吃鱼有什么含义呢?

藏民大多有不吃鱼的传统,目前,仍有部分藏民不吃鱼。藏民不吃鱼的原因众说纷纭,主要有几种说法:
1. 高原上的鱼十年才长一斤!一吃生物链全破坏了!
2. 高原上的湖都是圣湖,湖中都有守护神,在湖中洗澡或捕食湖中的鱼,是对圣湖的不尊敬。
3. 部分藏民选择死后水藏,人们认为死者的灵魂也会随之归宿大海。



2、 西藏哪些人死后不施行天葬?

在西藏因麻疯病或其他烈性传染病去世的不能实施天葬,因为担心将病传染给鸟类,有失施舍的原意.
同时,在很多地方还不允许犯法的罪人死后天葬。
此外,得到的高僧一般施行火葬。



3、 西藏唐卡的鲜艳色彩为什么能保持上百年?

唐卡是刺绣或绘画在布、绸或纸上的彩色卷轴画。
绘制唐卡所用的颜料都是不透明的矿物及植物颜料,再按比例加上一些动物胶及牛胆汁。这种原料的配方科学,加之西藏高原气候于燥,所绘就的唐卡既使过上数百年之久,依然色泽鲜艳,犹如新绘制的艺术佳品。


4、 藏民在磕长头朝拜的途中怎么吃饭呢?

藏民磕长头朝拜是及其神圣的旅程,少则持续数月,多则持续数年,藏民在途中的吃饭问题则通过随身携带的肉干及沿途同胞的接济来维持。

5、 藏民手中的转经筒是顺时针转还是逆时针转?

在藏传佛教的领地参观等都要按顺时针走,转经筒要顺时针转,逆时针转的是西藏原始的笨教转法。

6、 西藏的八角街真的有八个角吗?

早期进藏的四川汉族朋友,用四川音把'廓'字音译成了'角',以至其后来西藏的许多人,叫名也罢,写成文字也罢,一直把它称为'八角街'。其实八角街是一条圆形的街道。

7、 西藏纳木错湖里的裸鲤鱼真的没有鱼鳞吗?

裸鲤鱼,裸鲤鱼鳞片很小,几不可见,故名裸鲤鱼,此鱼最大不超过半斤,大概由于此处海拔太高的缘故吧裸鲤鱼,裸鲤鱼鳞片很小,几不可见,故名裸鲤鱼。

8、 西藏神秘的骷髅墙是怎么形成的呢?

骷髅墙是天葬的产物。整个天葬台院子约有4000多平方米,四周有约一人高的土墙,在南墙和西墙上修有木架,约四五格,每格内都整齐地排列着一个个人头骨,形成两面长长的骷髅墙,一个个威严的骷髅头骨,让人感到神圣的威慑和由衷地惊叹。

9、 西藏常见的五色风马旗在风中诉说着什么祝福?

风马旗,藏语称为"隆达"。
五色风马为白、黄、红、绿、蓝五种颜色。均有着不同的象征含义:蓝色表示蓝天,红色表示火焰,白色表示白云,绿色表示江河,黄色表示大地。带人们吉祥祝福和祈祷。

10、 松赞干布破解了唐太宗的哪五道难题才娶回文成公主呢?

第一道题:一根木头,两头一样粗细,哪头为根部,哪一头为尾部?
松赞干布聪明的大臣禄东赞将木头放入水中,因为根部密度大,略重,所以向水里倾斜。
第二道题:一块玉,中间有一曲折眼孔,用细线从孔的这头穿到那头。
禄东赞将孔的那头涂上蜂蜜,然后将柔软的细线拴到蚂蚁的腰上,把蚂蚁放在孔的这头,蚂蚁闻到气味开始向孔里爬,再加上禄东赞不断的吹气,蚂蚁把线带到了孔的那头。
第三道题 一百匹马驹和一百匹母马混在一起,哪匹马驹是哪匹母马生的?
禄东赞将母马和马驹分开关起来,隔了一夜,才把母马一匹匹放出来,马驹一看自己的妈妈出来了,忙去吃奶,不一会儿全分出来了。
第四道题 一百只小鸡,一百只母鸡,哪只小鸡是哪只母鸡孵的?
禄东赞成晓得,小鸡吃食物时,常跟母鸡在一起。于是先把鸡和母鸡分开,到喂鸡食的时候,把母鸡一只只叫到鸡群中,小鸡一见母鸡就跟着啄食去了。然而,还有一些小鸡不肯跟母鸡去,禄东赞就学老鹰和鹞子的叫声,结果,这些不听话的小鸡也吓得跑到自己的母亲跟前去了。
第五道题 这是最后一道题,有五百宫女,面遮盖头,其中有文成公主,让使臣辩认。
使臣们谁也没见过文成公主,这题太难了。聪明的禄东赞通过文成公主的侍女,了解到有关文成公主的一些生活情况。文成公主喜欢用一种香,香味独特,蜜蜂喜欢这种香味。在辩认那天,禄东赞手里抓了一只蜜蜂,手一松开蜜蜂就飞到文成公主头上。



11、 在藏民家中喝酥油茶能一饮而尽吗?

不能。喝酥油茶需要注意的有:
1、起先斟茶时主人并不将茶碗倒满,客人喝过一口后,主人才可斟满,以表示主人大方、不吝啬。
2、客人饮茶后,主人会很快添上,除非客人以手盖碗表示不能再饮为止。
3、客人告辞时,茶碗里的茶不能全喝完,表示对主人的尊敬。

12、 西藏的青海湖传说有哪位神仙守护?

传说中西王母守护着神圣的青海湖。

13、 运动员在西藏会更容易出现高原反应吗?

运动员比普通人更容易产生高原反应。原因如果你平时就一直坚持锻炼,锻炼后的身体,耗氧量增大,这会增加在西藏时心脏的负担,反而容易引起高原反应。


14、 藏民光着右臂的习惯跟释迦摩尼有关吗?

有,藏民喜欢光着右臂,而将右边的袖子系在腰上,传说是模范释迦摩。


15、 西藏的八吉祥是哪八种图案呢?

八吉祥又称吉祥八宝。
包括莲花、无尽结、双鱼、华盖、幢、轮、宝瓶及海螺,它们各自有其佛教表义、吉祥表徵及渊源。



16、西藏的羊卓雍湖传说有哪位神仙守护?

传说西藏的羊卓雍湖是天上的仙女

17、世界屋脊珠穆朗玛峰曾是一片汪洋吗?

是的。据地球物理学家和地质学家研究表明,大约4000万年以前,在珠峰这块古地上还是汪洋一片;之后,由于印度板块向欧亚板块挤压、俯冲,欧亚板块抬升,沧海逐渐消失;尤其是自340万年前以来,抬升加速,平均达到每年升高1毫米左右。近数万年来,抬升速率迅速增加,约达每年2-3毫米。

"阳光爱心"西藏公益行公关活动

1、 西藏纳木错小学的一本课本有几个同学看过?
因为教育配备落后,西藏的小学课本通常要被许多届同学轮流阅读。

2、 西藏羊八井小学共有几台电脑?
因为教育配备落后,西藏的小学大多还没有电脑。

3、 西藏纳木错小学离家最远的孩子每天上学要走多久?
因为校舍少,人群居住分散,西藏纳木错小学离家最远的孩子每天上学要走两三个小时。

4、 西藏羊八井的洛桑三兄弟只有几个书包?
罗桑三兄弟最大的梦想就是拥有一个书包,但是他们现在还是只能把书装在竹娄里去上学。在西藏像洛桑兄弟这样的孩子还有许多。

May 22, 2007

将LINUX的控制台定向到串口终端

利用串口终端作为Linux控制台,可以免去额外的键盘,显示卡和显示器,同时可将Linux主机作为一个任意用途的嵌入式黑匣。 将串口终端连接到计算机的串口上并不困难,可以参考Linux的HOWTO文档和以及inittab和agetty的帮助信息。这里扼要地说一下。 
  首先,准备好一根null modem 电缆. 
  其次,在文件/etc/inittab 增加下面一行。[注:如果你不采用 agetty程序,采用其他的程序如like getty_ps ,应用正确的命令语法] 
   ID:RUNLEVELS:respawn:/sbin/agetty -L SPEED TTY TERM 
  这里: ID =两字母的标识符,如s1或s2。 
  RUNLEVELS = 终端激活的运行级别 
  SPEED = 串口端口速率 
  TTY = 串口的设备名 
  TERM = TERM环境变量 
  范例如下: 
  s2:12345:respawn:/sbin/agetty -L 9600 ttyS1 vt100 
  表示串口 /dev/ttyS1 (COM2 速率为 9600 bps,终端模式为vt100。 
  最后,重新启动机器。 
  如正确地按照上述三步进行,则就可以在终端屏幕上出现Login: 的提示符。你可以登录进系统,并能象在实际的控制台上或从远程Telnet登录一样进行工作。 
  下面简单介绍一下如何终端设置成控制台,主要涉及内核信息、启动脚本信息和LILO信息。 

一、内核信息 
  系统在启动时显示的信息总是输出到主控制台(tty1)。打开机器后,你只有等待Login: 出现在终端屏幕上,这意味着所有启动信息都无法获悉。你只有登录后用dmesg命令查看,但通常是想在login shell起来前看到这些信息。 
  还有其他信息出现在控制台上:/etc/rc.d目录下脚本命令执行时,启动和终止机器时运行的脚本命令等输出的信息。如果信息没有出现在屏幕上,怎样真正地知道"系统已终止"呢? 
  你必须修改源码/usr/src/linux/drivers/char/console.c[必须已安装了内核源码],这不是一个复杂得内核修改,按照下面三步进行: 
  首先,在程序前定义CONFIG_SERIAL_ECHO 
  #define CONFIG_SERIAL_ECHO 
  其次,修改串口地址 (仅当你使用得端口不同于默认定义的才有必要修改)。 
  #define SERIAL_ECHO_PORT 0x3f8 /* COM1 */ 
  或者: 
  #define SERIAL_ECHO_PORT 0x2f8 /* COM2 */ 
   第三,重新编译内核[请参考相应的手册],启动机器。在系统检测硬件设备时,你应该在终端屏幕上看到信息。 
   请注意 :console.c 补丁除了Alpha平台外,对所有的Linux 端口都是必要的。在Alpha平台上它是在运行make config ,选择下面的选项完成的: 
   Echo console messages on /dev/ttyS1 

二、/etc/rc.d/rc.*启动脚本信息 
  为了将这些信息显示在终端上,可以将这些文件中含有echo命令的行追加" > TTY "。 TTY 是终端的串口(与/etc/inittab 中串口终端行的一样)。 

三、 LILO 配置 
  如果想选择两个内核之一启动,你必须修改LILO 配置文件,/etc/lilo.conf。 配置LILO,使提示信息出现在终端上,可以参考/usr/doc/lilo/README 文件 (查看SERIAL选项)。 这里给出两步正确设置的步骤: 
  首先,编辑/etc/lilo.conf file ,在BOOT选项行后,插入一个SERIAL选项 。 
serial=SERIAL_LINE,SPEED PARITY BITS 
  这里: 
  SERIAL_LINE = 0 (串口1) 
          1 (串口2) 
         2 (串口3) 
         3 (串口4) 
  SPEED = 串口速度 
  PARITY = n (=无) 
       o (= 奇校验) 
       e (= 偶校验) 
  BITS = 数据位(8 or 7) 
  请注意:在SPEED, PARITY 和BITS参数间没有空格。这些参数必须与在terminal 设置时的参数一样。下面是LILO 配置的示例: 
  serial=1,9600n8 
  这一行表示COM2 ,速率9600bps,无校验位,数据位8。 
  第二,运行lilo 命令,刷新系统配置。 
  利用SERIAL 选项, LILO 在启动默认内核前,设置了2秒的延迟 。在这期间,你可以 在终端上按"SHIFT"键发送一个终止信号,终止boot进程,并取得LILO提示信息。 
  完成上述配置后,你的终端就可以作为一个控制台了。有一件事不能做的是用CTRL-ALT-DEL 重启动系统。

uClinux&skyeye Step

How to run uClinux kernel―base 20040408?

-------------------------------------------------------------------------

 

Step 0 : Install GNU Tools chain
1. download http://www.uclinux.org/pub/uClinux/arm-elf-tools/arm-elf-tools-20030314.sh
2. chmod 755 arm-elf-tools-20030314.sh
3. su root ./arm-elf-tools-20030314.sh
4. arm-elf-gcc -v
Step 1 : Compile uClinux Kernel
1. download http://www.uclinux.org/pub/uClinux/dist/uClinux-dist-20040408.tar.gz
2. tar xvzf uClinux-dist-20040408.tar.gz
3. cd uClinux-dist
4. vi linux-2.4.x/arch/armnommu/vmlinux-armv.lds.in

   Line 66

        *(got)  /* Global Offset table */

        #+++++++++++++

        romfs_data = .;

        romfs.o

        romfs_data_end = .;

        #+++++++++++++

5. vi vendors/Samsung/4510B/Makefile

   Line 66

image:

     [ -d $(IMAGEDIR) ] || mkdir -p $(IMAGEDIR)

     genromfs -v -V "ROMdisk" -f $(ROMFSIMG) -d $(ROMFSDIR)

     #+++++++++++++

     arm-elf-ld -r -o $(ROOTDIR)/$(LINUXDIR)/romfs.o -b binary $(ROMFSIMG)

     #+++++++++++++

     $(CROSS_COMPILE)objcopy -O binary --remove-section=.romvec \

     --remove-section=.text --remove-section=.ramvec \

     --remove-section=.init \

     --remove-section=.bss --remove-section=.eram \

     $(ROOTDIR)/$(LINUXDIR)/linux $(IMAGEDIR)/linux.data

 

6. make menuconfig

   Vendor/Product Selection  --->

 --- Select the Vendor you wish to target  

 (Samsung) Vendor

 --- Select the Product you wish to target

 (4510B) Samsung Products

                           

   Kernel/Library/Defaults Selection  --->

 (linux-2.4.x) Kernel Version                               

 (uClibc) Libc Version  

 

7. make dep
8. make lib_only
9. make user_only

vi config/.config

Line 25

     CONFIG_USER_LOGIN_LOGIN=y

     # CONFIG_USER_OLD_PASSWORDS=y <- - CONFIG_USER_OLD_PASSWORDS=y

     # CONFIG_USER_ONLY_ROOT is not set

rm user/boa/src/*.o

make user_only

10. Sh>make romfs
11. Sh>make

vi linux-2.4.x/arch/armnommu/mm/init.c

Line 662

    void free_initmem(void)

    {

    if (!machine_is_integrator() &&

    !machine_is_p52() &&

    !machine_is_cx821xx() &&

    !machine_is_atmel() &&

    !machine_is_netarm() &&

    //          !machine_is_ta7v() && <- - !machine_is_ta7v() &&

    !machine_is_ta7s()) {

    free_area((unsigned long)(&__init_begin),

    (unsigned long)(&__init_end),

    "init");

make

12. Sh>make image

make romfs

make

make image

12. ls images/* -l
13. ls linux-2.4.x/linux -l
14. date

 

Step 2: Add MyApplication
1. cd ../uClinux-dist
2. cd user
3. mkdir myapp
4. cd myapp
5. vi demo.c

 

#include <stdlib.h>

#include <stdio.h>

 

int main(void)

{

        printf("Hello world! \n");

        return 0;

}

 
6. vi Makefile

EXEC = demo

OBJS = demo.o

 

all: $(EXEC)

$(EXEC): $(OBJS)

        $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)

 

romfs:

        $(ROMFSINST) /bin/$(EXEC)

 

clean:

        rm -f  $(EXEC) *.elf *.gdb *.o

 
7. cd ../..

vi user/Makefile

   Line 324

 

#+++++++++++++

dir_$(CONFIG_USER_MYAPP_DEMO)        += myapp

    #+++++++++++++

 
8. Sh>vi config/config.in

 

Append at tail

#+++++++++++++

#############################################################################

 

mainmenu_option next_comment

comment 'My New Application'

 

bool 'demo'   CONFIG_USER_MYAPP_DEMO

comment "My New Application"

 

endmenu

 

#############################################################################

#+++++++++++++

 

 
9. make menuconfig

   make dep

   make clean

   make lib_only

   make user_only

   make romfs

   make image

   make

 
10. download kernel

ls bin/demo

 

Step 3: Install SkyEye on RedHat 9.0
1. download http://gro.clinux.org/frs/download.php/912/skyeye-0.8.6.tar.bz2
2. tar xjvf skyeye-0.8.6.tar.bz2
3. cd skyeye
4. ./configure --target=arm-elf --prefix=/usr/local
5. make
6. make install
Step4: S3C4510B uClinux simulating on SkyEye
1. cp ../uClinux-dist/linux-2.4.x/linux .
2. vi Makefile

image.ram:

arm-elf-objcopy -O binary -R .note -R .comment -S linux image.ram
3. vi skyeye.conf

#skyeye config file sample

cpu: arm7tdmi

 

mach: s3c4510b

 

mem_bank: map=M, type=RW, addr=0x00000000, size=0x00800000

mem_bank: map=I, type=RW, addr=0x03ff0000, size=0x00100000

net: state=on, mac=0:4:3:2:1:f, ethmod=tun, hostip=192.108.10.2
4. ls �Cl
5. skyeye linux

target sim

load

run

Type Ctrl+C to Skyeye

Step5: GDB/Skyeye uClinux run on SkyEye
1. http://www.uclinux.org/pub/uClinux/dist/uClinux-dist-20041215.tar.gz
2. tar -zxvf uClinux-dist-20041215.tar.gz
3. cd uClinux-dist
4. make menuconfig

Vendor/Product Selection―>

      --select the vendor you wish to target

(GDB)vender

--Select the produet you wish to target

(skyeye)GDB produers

kernel/llibrary/defaults selctionà

     (linux-2.4.x)kernel version

     (uClibc)Lib version

Network device supportà

     --IMQneeds CONFIG_NETFILTER enabled

      [*]Universal TUN/TAP device driver support

      Ethernet(10 or 100Mbit)à

           [*]skyeye net2k ethernet support(for ArMulator)

Network Applicationà

[*]ifconfig

[*]ping
5. make process

   make dep

   make clean

   make lib_only

   make user_only

   make romfs

   make image

   make
7. cd ..
8. mkdir skyeye
9. cd skyeye
10. vi skyeye.conf

#skyeye config file sample

cpu: arm7tdmi

mach: at91

mem_bank: map=M, type=RW, addr=0x00000000, size=0x00004000

mem_bank: map=M, type=RW, addr=0x01000000, size=0x00400000

mem_bank: map=M, type=R,  addr=0x01400000, size=0x00400000, file=boot.rom

mem_bank: map=M, type=RW, addr=0x02000000, size=0x00400000

mem_bank: map=M, type=RW, addr=0x02400000, size=0x00008000

mem_bank: map=M, type=RW, addr=0x04000000, size=0x00400000

mem_bank: map=I, type=RW, addr=0xf0000000, size=0x10000000

#set nic info state=on/off  mac=xx:xx:xx:xx:xx:xx  ethmod=tuntap/vnet hostip= dd.dd.dd.dd

net: state=on, mac=0:4:3:2:1:f, ethmod=tuntap, hostip=192.168.10.5
11. cp ../uClinux-dist/linux-2.4.x/linux .
12. ln -s ../uClinux-dist/images/romfs.img boot.rom
13. skyeye linux

target sim

load

run

Type Ctrl+C to Skyeye

 

CVS&Mantis Step

How to run CVS Server?

-------------------------------------------------------------------------

 

Step 0 : Run CVS Server
1. install CVS
2. groupadd cvs
3. useradd -g cvs -G cvs -d /home/cvsroot cvsroot
4. chmod 771 /home/cvsroot
5. passwd cvsroot
6. su cvsroot

cvs -d /home/cvsroot init

exit
7. su root
8. vi /etc/xinetd.d/cvspserver

service cvspserver

{

      flags      = REUSE

      socket_type   = stream

      wait      = no

      user      = root

      protocol    = tcp

      server     = /usr/bin/cvs

      server_args   = -f --allow-root=/home/cvsroot pserver

      disable     = no

     only_from      = 192.168.10.0/24

}
9. chmod 644 /etc/xinetd.d/cvspserver
10. vi /etc/services

cvspserver 2401/tcp #pserver cvs service
11. /etc/rc.d/init.d/xinetd restart
12. netstat -lnp|grep 2401
Step 1 : Add CVS Users
1. su cvsroot
2. vi passwd.pl

#!/usr/bin/perl

srand (time());

my $randletter = "(int (rand (26)) + (int (rand (1) + .5) % 2 ? 65 : 97))";

my $salt = sprintf ("%c%c", eval $randletter, eval $randletter);

my $plaintext = shift;

my $crypttext = crypt ($plaintext, $salt);

print "${crypttext}";

print "\n";
3. chmod a+x passwd.pl
4. ./passwd.pl "password_str"

XL0pOJWay9kO
5. vi /home/cvsroot/CVSROOT/passwd

iyacht:XL0pOJWay9kO:cvsroot

 
6. cvs -d :pserver:iyacht@192.168.10.2:/home/cvsroot login
7. export CVSROOT=:pserver:iyacht@192.168.10.2:/home/cvsroot
8. cvs command
Step 2 : Run CVS Client

TortoiseCVS Introduce See Link ; 0

 
Step 3: mysql Server
1. /etc/rc.d/init.d/mysqld start
2. mysqladmin -u root password zxcvnm,./
3. mysql -u root -pzxcvnm,./
4. mysql> create database bugtracker;
5. mysql> show databases;
6. mysql>GRANT ALL ON bugtracker.* TO admin@localhost IDENTIFIED BY "zxcvnm,./";
Step 4: install mantis
1. Download http://switch.dl.sourceforge.net/sourceforge/mantisbt/mantis-1.0.0rc1.tar.gz
2. tar xvzf mantis-1.0.0rc1.tar.gz
3. mv mantis-1.0.0rc1 mantis

see http://manual.mantisbt.org/manual.installation.php
4. vi /home/iyacht/mantis/config_inc.php

<?php

$g_hostname = 'localhost';

$g_db_type = 'mysql';

$g_database_name = 'bugtracker';

$g_db_username = 'root';

$g_db_password = 'zxcvnm,./';

?>
5. chmod 777 /home/iyacht/mantis/config_inc.php
6. A DEFAULT ADMINISTRATOR level account is created.  The account name
and password are administrator / root.  Use this when you first login to
Mantis.
Step 5: Doxygen

A documentation system for C++, C, Java, Objective-C, IDL (Corba and Microsoft flavors) and to some extent PHP, C# and D.
Step 6: ident

 
Step 7: Bugzilla
1. cd /var/www/html/
2. tar zxvf bugzilla-2.18rc3.tgz
3. mv bugzilla-2.18rc3/ bugzilla/
4. cd bugzilla
5. su root
6. ./checksetup.pl

Installing Perl miss modules is via CPAN on Unix

   /usr/bin/perl -MCPAN -e 'install "AppConfig"'

   /usr/bin/perl -MCPAN -e 'install "Template"'

   /usr/bin/perl -MCPAN -e 'install "Date::Format"'

   /usr/bin/perl -MCPAN -e 'install "CGI"'

   /usr/bin/perl -MCPAN -e 'install "DBI"'
7. vi localconfig.js
8. mysql -u root -pzxcvnm,./

  mysql> GRANT SELECT, INSERT,

         UPDATE, DELETE, INDEX, ALTER, CREATE, DROP,

         REFERENCES ON bugs.* TO bugs@localhost IDENTIFIED BY

         '$db_pass';

  mysql> FLUSH PRIVILEGES;
9. ./checksetup.pl

Next, rerun checksetup.pl. It reconfirms that all the modules are present, and notices the altered localconfig file, which it assumes you have edited to your satisfaction. It compiles the UI templates, connects to the database using the 'bugs' user you created and the password you defined, and creates the 'bugs' database and the tables therein.

After that, it asks for details of an administrator account. Bugzilla can have multiple administrators - you can create more later - but it needs one to start off with. Enter the email address of an administrator, his or her full name, and a suitable Bugzilla password.
10. vi /etc/httpd/conf/httpd.conf

Add

<Directory /var/www/html/bugzilla>

  AddHandler cgi-script .cgi

  Options +Indexes +ExecCGI

  DirectoryIndex index.cgi

  AllowOverride Limit

</Directory>


vidcat and w3cam

Make single shot snapshots from Pusbcam with vidcat on fedora core 4.
To PNG, and other file formats.
ftp://download.intel.com/software/products/opensource/downloads/vidcat.tar.gz

   tar xvfz vidcat.tar.gz
   cd vidcat
   tar xvf w3cam-0.7.2.tar
   cd w3cam-0.7.2
   edit Makefile.in to this:
   CC = @CC@
   prefix=@prefix@
   exec_prefix=@exec_prefix@
   sbindir=@sbindir@
   cgibindir=$(prefix)/cgi-bin
   bindir=@bindir@

   VERSION=0.7.2
   CFLAGS = @CFLAGS@ @DEFS@ -DVIDEO_DEV=\"@ac_device@\" -DVERSION=\"$(VERSION)\"
   LDFLAGS = @LDFLAGS@
   LIBS = @LIBS@

   OBJ = w3cam.o cgi.o v4l.o

   default: vidcat vidcat.1 README

   vidcat: vidcat.o v4l.o
     $(CC) $(LDFLAGS) -o $@ vidcat.o v4l.o $(LIBS)

End Makefile.in--------

Then do :

    ./configure
    make
Beging Makefile--------
# Generated automatically from Makefile.in by configure.
CC = gcc
prefix=/usr/local
exec_prefix=${prefix}
sbindir=${exec_prefix}/sbin
cgibindir=$(prefix)/cgi-bin
bindir=${exec_prefix}/bin

VERSION=0.7.2
CFLAGS = -g -O2 -I/usr/local/include -I/usr/local/X11/include  -DHAVE_LIBM=1 -DHAVE_LIBZ=1 -DHAVE_LIBPNG=1 -DHAVE_LIBJPEG=1
 -DHAVE_LIBTTF=1  -DVIDEO_DEV=\"/dev/video\" -DVERSION=\"$(VERSION)\"
LDFLAGS =  -L/usr/local/lib -L/usr/local/X11/lib
LIBS = -ljpeg -lpng -lz -lm 

OBJ = w3cam.o cgi.o v4l.o

default: vidcat  vidcat.1 README

vidcat: vidcat.o v4l.o
        $(CC) $(LDFLAGS) -o $@ vidcat.o v4l.o $(LIBS)

End Makefile--------
Test:
    ./vidcat -d /dev/video -f png -p y -s 640x480 > test.png

webcam solution base on spacaserv

I. servfox
http://mxhaard.free.fr/spca50x/embedded/Servfox/servfox-R1_1_3.tar.gz
cp Makefile.arm Makefile
make
./servfox -d /dev/video0 -s 320x240 -g -w 192.168.162.1:7070

II. spcaserv and spcacat
http://mxhaard.free.fr/spca50x/Download/spcaview-20051212.tar.gz
replace gcc with arm_v6_vfp_le-gccin Makefile 
./spcaserv -d /dev/video0 -s 320x240 -w 192.168.16.2:7070 -f JPEG
./spcacat -d /dev/video0 -s 320x240
Spcaserv 运行方法如下;

spcaserv [-h -d -g -f -s] [-w Port]参数说明:
-h      查看帮助;
-d      /dev/videoX       指定摄像头设备,比如 /dev/video0
-g      use read method for grab instead mmap
-f    影像格式,默认为YUV420P,fourcc I420
               jpg JPEG                fourcc MJPG
               yuv YUV420P             fourcc I420
               r16 RGB565 16bits       fourcc RGB2
               r24 RGB 24bits          fourcc RGB3
               r32 RGB 32bits          fourcc RGB4
               -v RAW data             fourcc RAWD
-s      设置分辨率,宽x高  ,比如  320x240,或 640x480,或160x120;
-w      指定服务器的网络地址或端口,比如  192.168.1.3:8888
 
./spcaserv -s 320x240 -w 192.168.16.2:8888&./spcaview -s 320x240 -w 192.168.16.2

III. http-java-appleta <====sample webs page

在cygwin下如何以root登录

本来安装之后系统默认的是以你的windows用户名做为cygwin的登录名的。在你的cygwin的etc目录中有一个名为passwd的文件,其中存放着用户名和密码。

1、打开passwd这个文件,把其中的windows用户名换成root(在同一行中应该有两处,都改过来)。

2、在cygwin的home目录下面建立目录root

3、ok,现在启动cygwin进入以后,默认的用户名就应该是root了。

shell 4 usbcam

#
# Load the needed modules for the usbcam driver.
#

# you may need these commented out lines if your insmod is too old.
#IS24=`uname -r | grep -c ^2.2`
#
#if [ $IS24 == "1" ]
#then
#insmod /lib/modules/2.2.14/misc/videodev.o
#else
#insmod /lib/modules/2.4.0-test10/kernel/drivers/media/video/videodev.o
#fi

#
# Load the modules.
#

# Video4Linux Support
/sbin/insmod videodev

# USB Core Module
/sbin/insmod usbcore

# USB UHCI/OHCI Controller Modules (new)
/sbin/insmod usb-uhci
#/sbin/insmod usb-ohci

# USB UHCI Controller Modules (old)
#/sbin/insmod uhci

# that for the sys request key, comment it out if the quickcam works well.
# if you get any erors: use Alt + SysRq + S = Emergency Sync (write everything on HDD)
#                use Alt + SysRq + U = Unmount all HDD's
#            use Alt + SysRq + B = Reboot system immediatly
echo "1" > /proc/sys/kernel/sysrq

# usbcam.o is in current directory, after copying in /lib/modules/.../usb,
# use insmod usbcam chip.
/sbin/insmod ./usbcam.o

/sbin/lsmod

Makefile 4 usbcam driver

# This makefile will build the usbcam driver module
# external to the kernel source tree. It makes it easier
# to swap kernels.

# Location of the header files (most importantly the config files)
# for the kernel you want to build the module against.
# This should be  correct for the currently installed kernel on your machine
KINCLUDE=/usr/src/linux-2.4.20-8/include

all: usbcam.o

clean:
    rm usbcam.o -f

usbcam.o: usbcam.c usbcam.h
    gcc -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -fno-strict-aliasing -pipe -mpreferred-stack-boundary=2 -march=i386 -DMODVERSIONS -include $(KINCLUDE)/linux/modversions.h -I$(KINCLUDE) -c -Idrivers/usb -DCONFIG_PROC_FS=1 -DCONFIG_VIDEO_PROC_FS=1 -DMODULE -D__KERNEL__ -DVID_HARDWARE_TP301B=0xFF usbcam.c
    echo /sbin/insmod usbcam.o to turn it on
    echo /sbin/rmmod usbcam to turn it off
    echo
    echo X and kernel programming do not mix.
    echo Do the insmod and rmmod from outsid X
#    echo must be linked with decode module
#    echo this function not complete
#    echo insmod tpdecode.o to turn it on
#    echo rmmod tpdecode to turn it off



image grabber

/* Simple Video4Linux image grabber.
 *    Video4Linux Driver Test/Example Framegrabbing Program
 *
 *    Compile with:
 *        gcc -s -Wall -Wstrict-prototypes v4lgrab.c -o v4lgrab
 *      Use as:
 *              v4lgrab > image.ppm
 *
 *    Copyright (C) 1998-05-03, Phil Blundell <philb@gnu.org>  
 *      Copied from http://www.tazenda.demon.co.uk/phil/vgrabber.c
 *      with minor modifications (Dave Forrest, drf5n@virginia.edu).
 *
 */

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <stdlib.h>

#include <linux/types.h>
#include <linux/videodev.h>

#define FILE "/dev/video0"

/* Stole this from tvset.c */

#define READ_VIDEO_PIXEL(buf, format, depth, r, g, b)                   \
{                                                                       \
        switch (format)                                                 \
        {                                                               \
                case VIDEO_PALETTE_GREY:                                \
                        switch (depth)                                  \
                        {                                               \
                                case 4:                                 \
                                case 6:                                 \
                                case 8:                                 \
                                        (r) = (g) = (b) = (*buf++ << 8);\
                                        break;                          \
                                                                        \
                                case 16:                                \
                                        (r) = (g) = (b) =               \
                                                *((unsigned short *) buf);      \
                                        buf += 2;                       \
                                        break;                          \
                        }                                               \
                        break;                                          \
                                                                        \
                                                                        \
                case VIDEO_PALETTE_RGB565:                              \
                {                                                       \
                        unsigned short tmp = *(unsigned short *)buf;    \
                        (r) = tmp&0xF800;                               \
                        (g) = (tmp<<5)&0xFC00;                          \
                        (b) = (tmp<<11)&0xF800;                         \
                        buf += 2;                                       \
                }                                                       \
                break;                                                  \
                                                                        \
                case VIDEO_PALETTE_RGB555:                              \
                        (r) = (buf[0]&0xF8)<<8;                         \
                        (g) = ((buf[0] << 5 | buf[1] >> 3)&0xF8)<<8;    \
                        (b) = ((buf[1] << 2 ) & 0xF8)<<8;               \
                        buf += 2;                                       \
                        break;                                          \
                                                                        \
                case VIDEO_PALETTE_RGB24:                               \
                        (r) = buf[0] << 8; (g) = buf[1] << 8;           \
                        (b) = buf[2] << 8;                              \
                        buf += 3;                                       \
                        break;                                          \
                                                                        \
                default:                                                \
                        fprintf(stderr,                                 \
                                "Format %d not yet supported\n",        \
                                format);                                \
        }                                                               \
}                                               

int get_brightness_adj(unsigned char *image, long size, int *brightness) {
  long i, tot = 0;
  for (i=0;i<size*3;i++)
    tot += image[i];
  *brightness = (128 - tot/(size*3))/3;
  return !((tot/(size*3)) >= 126 && (tot/(size*3)) <= 130);
}

int main(int argc, char ** argv)
{
  int fd = open(FILE, O_RDONLY), f;
  struct video_capability cap;
  struct video_window win;
  struct video_picture vpic;

  unsigned char *buffer, *src;
  int bpp = 24, r, g, b;
  unsigned int i, src_depth;

  if (fd < 0) {
    perror(FILE);
    exit(1);
  }

  if (ioctl(fd, VIDIOCGCAP, &cap) < 0) {
    perror("VIDIOGCAP");
    fprintf(stderr, "(" FILE " not a video4linux device?)\n");
    close(fd);
    exit(1);
  }

  if (ioctl(fd, VIDIOCGWIN, &win) < 0) {
    perror("VIDIOCGWIN");
    close(fd);
    exit(1);
  }

  if (ioctl(fd, VIDIOCGPICT, &vpic) < 0) {
    perror("VIDIOCGPICT");
    close(fd);
    exit(1);
  }

  if (cap.type & VID_TYPE_MONOCHROME) {
    vpic.depth=8;
    vpic.palette=VIDEO_PALETTE_GREY;    /* 8bit grey */
    if(ioctl(fd, VIDIOCSPICT, &vpic) < 0) {
      vpic.depth=6;
      if(ioctl(fd, VIDIOCSPICT, &vpic) < 0) {
        vpic.depth=4;
        if(ioctl(fd, VIDIOCSPICT, &vpic) < 0) {
          fprintf(stderr, "Unable to find a supported capture format.\n");
          close(fd);
          exit(1);
        }
      }
    }
  } else {
    vpic.depth=24;
    vpic.palette=VIDEO_PALETTE_RGB24;
    
    if(ioctl(fd, VIDIOCSPICT, &vpic) < 0) {
      vpic.palette=VIDEO_PALETTE_RGB565;
      vpic.depth=16;
      
      if(ioctl(fd, VIDIOCSPICT, &vpic)==-1) {
        vpic.palette=VIDEO_PALETTE_RGB555;
        vpic.depth=15;
        
        if(ioctl(fd, VIDIOCSPICT, &vpic)==-1) {
          fprintf(stderr, "Unable to find a supported capture format.\n");
          return -1;
        }
      }
    }
  }
 
  buffer = malloc(win.width * win.height * bpp);
  if (!buffer) {
    fprintf(stderr, "Out of memory.\n");
    exit(1);
  }
 
  do {
    int newbright;
    read(fd, buffer, win.width * win.height * bpp);
    f = get_brightness_adj(buffer, win.width * win.height, &newbright);
    if (f) {
      vpic.brightness += (newbright << 8);
      if(ioctl(fd, VIDIOCSPICT, &vpic)==-1) {
        perror("VIDIOSPICT");
        break;
      }
    }
  } while (f);

  fprintf(stdout, "P6\n%d %d 255\n", win.width, win.height);

  src = buffer;

  for (i = 0; i < win.width * win.height; i++) {
    READ_VIDEO_PIXEL(src, vpic.palette , src_depth, r, g, b);
    fputc(r>>8, stdout);
    fputc(g>>8, stdout);
    fputc(b>>8, stdout);
  }
    
  close(fd);
  return 0;
}

boa移植及配置

1. download boa-0.94.11.tar.gz from www.boa.org
2 tar xvzf boa-0.94.11.tar.gz
3 cd boa-0.94.11/src
4 ./configure
5 make
6 ./boa
7 replace gcc with arm-linux-gcc
8 modify  boa.conf

Port 8010
User root
Group root
ServerName arm#!!!
DocumentRoot /home/www
MimeTypes /etc/mime.types
###AccessLog ErrorLog 
DirectoryIndex index.html
#DirectoryMaker /usr/lib/boa/boa_indexer
#KeepAliveMax 1000
#KeepAliveTimeout 10

大学十年后记

      2000年7月份,我从浙江大学博士毕业后到上海贝尔有限公司工作。从2000年8月至2001年底,大约一年半时间,我在网络应用事业部从事软件工程与CMM的研究与推广工作。从2002年初至今,我调到公司总部从事企业研发管理的研究。


      我在上海贝尔没有发财,没有当官,那么工作近两年来我都在做些什么呢?


      我在心平气和、踏踏实实地做学问。


      我读本科的专业是半导体物理,硕士专业是集成电路,博士专业是计算机图形学。十年之内我换了三个专业,哪一个专业都没有学精通。我觉得自己在软件工程方面有些悟性,可是没有当成专业来系统地学习。所以博士毕业时,除了有点虚名外,我的确没有什么过人的才能。


      如今大学里的博士、教授中"水货很多",我不幸是其中之一。象我这样的好苗子沦落为"水货",是中国大学学术腐败、堕落的恶果。


       在公司里,很多员工恭谨地叫我"林博士",甚至还有年轻人特意来看看我这个"好榜样"。虽然我也爱慕虚荣,可是良心未泯,彼时我哪有博士的真才实学,多么羞耻啊。


      刚到公司时,我有两类工作可选择:一是开发产品,二是研究并解决企业存在的软件工程问题。


      我在开发产品方面比绝大部分应届毕业生和员工们有经验,当项目经理可谓熟能生巧。软件工程则是我的研究兴趣。前者可能会有更高的经济收入,后者能提高自己的学问。


      当时我的想法很简单:趁着自己还年轻,赶紧好好做学问,弥补读博士期间浪费的三年青春,让自己有真才实学。


      在企业里做学问与高校里很不一样。如今学校里的学者们越来越浮躁,聪明才智大多建立在"纸上谈兵"之上,做学问变成了造文章。


而企业特别讲究"务实",所有的工作围绕一个目标:努力让企业活下去并且活得更好。


我在公司里没有象在学校里那么"兴风作浪",日子过得很简单,不停地调研、写规范和培训。就象少林寺藏经阁里的修练者。上海贝尔提供了一流的软件工程研究与实践环境(不是现成的,是争取来的,这就是我信奉的"创造环境")。在这种环境下,只要人不笨,认真工作,谁都能成为软件工程专家。


在博士毕业前,我写了一本薄薄的书叫《软件工程思想》。这本书与《大学十年》一样在网上流传,我曾经自鸣得意。最近我要出版一些研究成果,便重新阅读了那本《软件工程思想》。发现此书真的是彻底地"纸上谈兵",不仅对企业毫无用处,并且会误导读者。


我真是悲喜交加,悲的是和我同类的一大批"假博士"长期干些"自欺欺人"的研究工作,浪费生命并且浪费国家财产。喜的是我终于跳出了虚假学术的火炕。我不敢说现在自己的水平有多高,但至少能够拿出一些对企业有价值的东西来。


我在公司是一名自由自在的软件工程专家,公司待我不薄。如果不给自己一些事业上的压力,人很容易在安逸中堕落。我的目标是创作出可以与Rational公司RUP相媲美的软件过程规范,并且开发出物美价廉的适合于中国IT企业的项目管理软件。


基于大量实践的基础上,我和合作者研制了一套"软件过程改进解决方案"(Software Process Improvement Solution, SPIS)。SPIS的主要组成部分有:


&sup2;        基于CMMI 3级的软件过程改进方法与规范,称之为精简并行过程(Simplified Parallel Process, SPP)。


&sup2;        一系列培训教材,包括软件工程、项目管理、高质量编程等。


&sup2;     基于Web的项目管理工具,包括项目计划、项目监控、质量管理、配置管理、需求管理等功能,命名为Future。


以我们研究小组的实力本来是可以顺利完成SPIS的。但遗憾的是,SPIS不是公司产品发展战略范畴之内的东西,不能作为正式项目开发,我的组员们都被分配了其它的任务。我只能在公司之外组织一些朋友共同开发SPIS。虽然困难很大,但是工作很有意义,很鼓舞人。


我依然相信"创造性的事业要靠激情来推动"。希望在今后的一年内,我能结识不少志同道合的朋友,共同把事业做好。

林锐:我的大学十年

(本文摘自《高质量C++/C程序设计指南》,将由电子工业出版社于2002年5月底出版。) 作者:林锐

写此文使我很为难,一是担心读者误以为我轻浮得现在就开始写自传,二是担心朋友们误以为我得了绝症而早早留下遗作。
不论是落俗套还是不落俗套地评价,我在大学十年里都是出类拔萃的好学生。并且一直以来我对朋友们和一些低年级的学生们都有很大的正面影响。这十年是一个从幼稚到成熟的过程,交织着聪明与蠢笨、勤奋与懒散、狂热与怯懦、成功与失败。做对了的事可树立为榜样,做错的事可挂作为警钟。我写下经历与感受,期望以此引导和勉励无数比我年轻的学生们。我资历尚浅,既没有哲学家的深遂,也没有诗人的风华,不足以堂皇地育人,只能讲一些故事以表心愿。

我出生在1973年的春节,属牛,是"牛头"。父母为我起了很好听的名字叫"林锐"。这暗示着上天对我别有用心,将降大任于我,可是这时候上帝去了一趟厕所。天堂与人间的时差如此之大,就在上帝大小便的几分钟内,我混混沌沌地度过了童年和少年,天才因此成为凡人。
我小时候生长在浙江黄岩的偏僻山区。父母都是中学教师,由于山区师资缺乏,父母经常要从一个山头调到另一个山头教学。我换读过的小学的数目比我的年龄还大,没有伙伴,也没有家的概念。我就象活在货郎担里的小鸡,缩成一团,在高兴或恐惧时至多"啾""啾"地叫几声。我在读小学与初中的8年里,既不聪明活泼,也不调皮捣蛋,确切地说象块木头,简直是我名字的反义词。在学习上我没有受过一次表扬,也没有任何值得留念的人或事。唉,无论我现在多么努力都已无法追回失去的8年金色年华,好心痛!
我草草地并且稀里糊涂地在13岁时从初中毕业,无处可去。这下我发慌了,开始渴望学习。我灰溜溜地离开山区,可怜巴巴地到一个比较好的乡下中学重读初三。我勤快得早晨4:30就起来读英语,脑袋似乎也被吓开窍了,"数理化"学得很好,并且生平第一次在物理考试中得了满分。当我"再一次"从初中毕业时,我以全校第一的成绩考入了黄岩中学读高中。
黄岩中学分农村班与城市班,我当然是农民阶级。"阶级区别与歧视"对我是相当有促进作用的。我连任了几年的卫生委员,星期六和星期天同学们习惯地把活留给我,我这小官当得有滋有味。《物理》学得极好,有一种直觉帮我快速准确地解题,常常是老师刚把题目写完我就报出答案来。上物理课时我没法讲废话,因为我一开口就是标准答案。
可惜我的文科成绩极差。那时期盛传"学好数理化,走遍天下都不怕",我们年少不懂事,糟踏了学文科的好时光。我写作文的最高目标就是不逃题,考试前我总是反复祈祷:我没干过坏事,保佑我作文不逃题吧!历史考试时填写"任课老师某年某月某日在我家乡英勇就义",比谁的成绩更接近零分。更让我沮丧的是,这些行径都不是我发明的,我顶多是个跟屁虫而已,一点回忆的自豪感都没有。
我现在认为文科教育实质是素质教育,如果素质不高,男孩再聪明也难以成大器,当然也难以吸引好女孩。
高考时我语文得了54分(是班里的中上水平),总分只比重点线高十几分。我不敢报考好地方,只好选择内地。选来选去觉得西安与成都两个城市还不错,我拿把尺子在地图上一量,发现我家乡离西安的直线距离较短,于是就选了西安。老师们只听说过西安交通大学比较有名气,但谁也不了解。我以为在西安交通大学是学习开火车、开轮船的,尽管我也很渴望能开车开船,但考虑到自己的身材单小,就忍痛割爱了。我觉得西安电子科技大学的名字很好听,符合我做科学家的梦想,于是就报考西安电子科技大学(以下简称西电)技术物理系。
上帝精神拌擞地从厕所回来,发现我已经上大学。也许他原先想把我安排在清华或者北大的,但事已至此,干脆也就撒手不管了。他这一偷懒反而是好事,我在读大学的十年中自由发展,成了卓而不群的学生。

刚进西电,首先吸引我的是麻雀和馍。那麻雀滚圆滚圆的,简直是会飞的肉弹。它们不怕人,成堆聚集吵闹,常让我误以为是没有人管教的一群小鸡。那馍又白又大,既不放盐也不放糖,既不象馒头也不象包子。馍凉了后贼硬,据说有同学被楼上扔下的半块馍砸中脑袋,当场长出一个"肉包子"。最好笑的是人们把"馍夹肉"叫成"肉夹馍",那东西实在好吃。
西电原是军校,作风严谨,校园并不华丽,生活有些单调。尽管我来自山清水秀的地方,可我的确喜欢西电的粗犷与憨厚。有一天我看到一个新生写的很肉麻的赞美西电的大字报,有一句是"我踏上了东去的列车",我不禁笑掉牙。这一笑意味着"大个子欺负小个子"历史的结束,"小个子欺负大个子"新纪元的开始。
上大学的第一个学期刚好碰上美国打伊拉克("沙漠风暴"行动)。那时全国都在谈电子战,我们全校都是研究电子的,而且以军事应用为主。在那种气氛里,同学们都有很强的使命感,并且被鼓动得信心十足。
一日,系主任视察早读,偏偏有同学迟到。系主任喝问:"你为什么迟到了?"
"因为我来迟了,"同学毫不含糊地回答,昂然入座。那时候的学生充满了理由。
我在班里年龄小个子也小,上课时就象猩猩堆里的猴子那么显眼。由于我们是物理系学生,第一学期的《普通物理》课程就显得非常重要。系副主任给我们上课,他长得象叶利钦,口若悬河,板书极快。象在高中上物理课那样,我常在"叶利钦"刚写完题目时就报出答案。开头几次,"叶利钦"满脸疑狐地扫视我们,好像是要抓住拔掉他自行车气门芯的那个捣蛋鬼。后来他在第一排发现了我,我俩乐得裂了嘴。课间休息时,"叶利钦"常坐在我旁边,乘他给同学们答疑时,我就用笔拔弄他硕大无比的手指,在他指甲上涂点什么。
在第一学年,我就象乱草丛中的野花那样脱颖而出,倍受老师和同学们的关怀。就在我光荣到感觉屁股都能绽放光彩的时候,发现了令我胆战心惊的学习缺陷――不会做实验。一进实验室,我就束手无策,浑身发抖。我相信大一的学生们都有虚荣心,为了维护"最聪明"这个荣耀,我完全可以掩盖、躲避甚至偷偷地弥补实验能力的不足。
我做了一件了不起的事:为了对抗虚荣的引诱,我夸大其辞地把"缺陷"告诉每一个我认识的人,让我没有机会欺骗自己。
聪明的人并不见得都有智慧,他可能缺乏"真实"这种品质。虽然我是在硕士毕业的时候才立下誓言――"做真实、正直、优秀的科技人员",但我在18岁的时候就已经做到了"真实",我必定一生保持。
第一年暑假回家,得到一个惊喜:家里竟然有了电路实验室!
因为我常在信中鼓吹自己实验能力何等之差,"长此以往,下场将极为悲惨"。父母经不起这种"恐吓",当英语教师的父亲将半年的工资连同"私有财产"全部捐出,每周到很远的商品交易市场购买电子元件以及器材,在家里建立了实验室。父亲很威严,我从小就怕他,但那个暑假我一点也不怕他。我们一起做实验,都从零学起,话不投机就用电烙铁"交流",完全是同事关系。后来,我的兴趣转向了计算机,家里的实验室就由父亲独掌,继续发扬光大。现在父亲修理电器的水平在家乡远近闻名,学生们都忘了他是英语教师。
母亲是数学教师,年轻时略有姿色,智力远胜我父亲。当她与他在山头的学校里相遇时,他一顿热情洋溢的饭菜就把她缴械了。我小时候家里很贫穷,家就象一条飘荡的小船,父亲划桨,母亲掌舵。当我6岁上学时,母亲就说:"儿子啊,你将来只能靠笔吃饭而不能靠锄头吃饭。"小时候,母亲怕我变狡诈而不允许我学下棋。尽管我在大学里已经相当出色,母亲来信总不忘叮嘱"德智体全面发展"。她常用独特的方式检查我:
(1)看我是否变胖。如果我胖了,表明我懒了。因为勤奋的人没有理由变胖。
(2)看我说话是否还快。如果我说话慢条斯理,表明我变笨了。因为脑子灵活的人没有理由说话不快。
我读博士研究生时,母亲的眉头才舒开。她经常在师生中发表自由言论:"儿子的智力与性格完全是我遗传的,他爸毫无半点功劳。" 

本科第三学期的主要课程是电路分析。电路题目常常很滑稽,当你满头大汗地解完方程式时,答案往往是零。我归纳了不少公式用于简化计算,所以照样能在老师画完电路图时报出答案。学习是如此的轻松以致于我有太多的课余时间。
在课余我常做两件有意思的事:
(1)我为学习较差的十几名同学办了补习班,给他们讲课,改作业,出考题。我就象老母鸡那样看护着一群小鸡,使班长、学习委员等班干部形同虚设。我这样做既提高了自己的表达能力,又帮助了同学。这事不是老师叫我干的,是我自己的主意。
(2)我经常在宿舍里焊接电子线路,技艺渐精。我曾花了两天时间,把磁带盒做成能发声、发光的精美礼物,乐颠颠地送给一个女孩子。可惜不久后我迷上了计算机,从此再也没亲手做过好玩的东西。
上大学以前我根本没见过计算机。在第四学期时我遇到了十年来最敬爱的老师周维真,从而对编程产生了强烈的兴趣。他教我们Fortran语言,Fortran语言本身对我没有影响,影响我的是周老师高尚的师德以及他在教学和科研中的敬业精神。我从他那里学到的是怎样做人,怎样做事。
很多计算机系老师改作业时喜欢打"√"或打"×"了事。周老师不仅把作业里的错误都找出来,而且逐一评注"好在哪里"和"差在哪里"。为了不让周老师过于劳累,全系同学有一个约定:上课时不准吵闹,否则别来;作业必须清楚,否则别交;提的问题必须有质量,否则闭嘴。
Fortran语言期末考试,我的卷面成绩是97分,有个女同学考了99分。我当时官为课代表,想不到被一个女生超过,甚为沮丧。可是报到系里的成绩单上,我的成绩是99分,那个女同学是97分。我以为周老师搞错了,跑去问他。周老师笑笑说:"你平时的学习表现,该得满分。不能因为考试中的一个失误而打击你的积极性,所以给你加2分作为鼓励。而她一上机就束手无策,要让她知道考试成绩高并不表示已经学好了,扣她2分以示警告。你本来就是第一名。"这时又跑来一个"查"成绩的同学,他得了59分,哀求周老师让他及格。周老师说:"你的试卷我看了好几遍,的的确确是59分。而你平时的学习表现也不会超过59分。这一分不能加,否则我会害你一生。"
在我这一级(90级),周老师至少为技术物理系教出两名软件高手――我和马佩军。我和马佩军读到硕士时已在软件方面雄霸西电,计算机系学生毫无翻身之望。由于马佩军不好名利,风头让我一人独得。我离开西电数年后,余威尚在。可惜我和周老师相处不到一年,他便调到北京信息工程学院。然而师恩的厚薄不在于时间长短,好的老师会让人想念、感激一辈子。

在上大学的前三个学期,学习如同表演,有趣而且轻松。自从第四学期学习了计算机课程,我就有了新的追求,我多么渴望拥有一台计算机,可以天天编程。如果挨一个巴掌能换取一分钟上机时间的话,我愿意每天挨1440个巴掌。如果非得加上一个期限不可,我希望是一万年。
我本科的专业是半导体物理,一二年级由系里负责教学,三四年级由微电子所负责教学。在第四学期末,我央求系里把我推荐到微电子所参加科研,贾新章教授"收留"了我。我踏进微电子所的那一脚,让我从纯粹学习转向了科研,从"高分低能"转向了"低分高能"。
我终于有了一台286电脑,那个暑假我就睡在实验室里,时时刻刻守着它,深夜里我一个人冲着它发笑,一会儿盖上布,一会儿掀开布,一会儿摸摸它的"脸",一会儿理理它的"辨子"。我很快地完成了任务:设计一个"立方运算"的模拟电路,并且学会了C语言。
西电有个好传统,每年冬季举办一次全校性的"星火杯"学生科技作品竞赛。每届都有六七百件作品展示,低年级的学生看后无不热血沸腾,跃跃欲试。我很希望能独立开发一套软件,参加本届"星火杯"竞赛。贾新章老师是研究集成电路可靠性的,见我如此热切,就让我开发"集成电路可靠性分析软件"。
我开始一边研究数值算法,一边设计软件。从炎热的8月份到发冷的十一月,几乎天天通宵编程,程序很快增长到一万多行。在离竞赛还剩一个月左右的时候,出现了大量的问题。不仅程序老是出错误,而且发现原先的算法并不有效。此时已经没人能够"救"我。贾老师不会编程,不知道问题究竟出在程序上还是出在算法上(实质上两者都有问题)。而那些懂软件开发的年青教师,实在看不明白我的上万行程序是如何组织的。他们只能悲伤地看着我挣扎。由于我经常逃课,好学生变成了坏学生。系里意见极大,贾老师十分为难。不少老师和同学劝我赶紧"改邪归正",放弃项目,不值得因小失大。
当时我有个无法动摇的信念:如果放弃一次,那么碰到下一个挫折时我就会继续放弃;如果坚持而成功,那么碰到下一个挑战时我会激励自己再取成功。
在压力面前,我依然坚挺。每当略有进展时,心里就一阵狂喜,但很快又会碰到新的困难,有时一坐就是20个小时。每天在喜悦的颠峰与苦恼的深渊之间反复折腾。在竞赛前两天,我终于成功地完成了软件研发,结果获得软件与论文两个二等奖。这个荣誉本身不值得一提,并且我付出很重的代价――对物理专业失去兴趣而彻底抛弃了它。但那时我才19岁,在极限状态下,我磨练了意志,使我日后充满激情。
在本科四年级,我认识了微电子所的郝跃老师。他是数学博士,是微电子所最有才华、最潇洒、最有领导风范的青年学者。我常去向他请教数学问题,他讲得意气风发,我听得如痴如醉。我俩一个月的"交流量"很多硕士花一年时间也得不到。有一天,郝老师说:"你做我的学生吧。"我就毫不迟疑地从贾老师门下"跳槽"到郝老师门下。郝老师后来是我的硕士导师,他高兴时喜欢说:"好,很好,非常好!"我看着他升教授,升博导,升副校长,师生两人分别在各自的阶层中名声显赫。
在三四年级,我的专业课程没有一门及格过。但由于微电子所的老师们已经认可了我,就把我的卷面成绩作为及格线,"水涨船高,水落船底",我对同学们的帮助莫大于此!如果要我考研究生,我绝对考不上。系主任安毓英觉得我将来很有前途,于是不顾别人反对,一锤定音让我免试读硕士研究生。

读硕士研究生时,我的科研条件相当好。导师十分开明,任我自由发展。我最喜欢做的事是设计图形用户界面和开发数据可视化软件。图形软件的最大魅力是即便它毫无用处,你也可以自我欣赏。总有人担心"花很多精力、物力让界面那么漂亮,图形那么逼真是否值得?"这种问题不能强求别人与你一致。我当时赞美女孩子的最高境界就是把她和我的图形软件相提并论。
我喜欢设计用户界面是因为自己有相当好的美感。在读本科时我模仿过六七个流行软件的界面。那时期大家编程都用Turbo C 2.0,我伪造了一个"Turbo C 2.6"。有个北大的博士生来实验室参观,看"Turbo C 2.6"后对我导师说:"郝老师,你们的工具比我们的先进多了"。
我常常向同学演示、卖弄自己开发的软件。觉得还不过瘾,就写了一篇名为"用户界面设计美学"的短文。凡是路过我实验室的同学都被我逮住,被迫听完我得意之极的朗读,茫然者与痛苦者居多。不久我的朗读便所向披糜,闻声者逃之夭夭。这篇文章我6年后照搬到博士学位论文中,可见当初写时的确有所"超前"。
我的研究工作基本上以集成电路的数值计算为主,数值计算产生的一堆数据常把我搞得晕头转向。我发现用图形来表征、解释数据可以让自己不再迷糊下去,那感觉就象刚睡醒时冲凉水一样。我硕士学位论文中的软件就是用图形来仿真集成电路生产过程中"缺陷"对成品率的影响。我并不是在看了学术论文后才开始研究可视化技术的,我是在做了工作后才发现那些好玩的技术叫做"可视化"。由于我肚子里头的确有货,在硕士一年级,我没有使用"剪刀"与"浆糊"(这是很多人写书的法宝),只化了三个月时间就写完第一本著作《微机科学可视化系统设计》。
我在读硕士期间的工作强度与本科时的相当,但工作方式有很大不同。我有了明确的目标:(1)开发自主版权的软件产品;(2)培养做领导的才能。这个目标可以通过团队工作,参加全国性大学生科技竞赛而实现。
我在西电成立了"可视创意软件小组",马佩军、戴玉宏、马晓宇是我的主要技术伙伴,帮手很多。有几个漂亮的女生负责宣传(有一个长得像孟庭苇)。办公室里贴满了标语,如"创造性的事业要靠激情来推动","生于忧患,死于安乐","让春天消失"。还有大幅的"作战图",倒计时牌。每个伙伴写了一张"军令状"放在机器上,我迄今还记录着那些纯真、活泼、充满激情的文字。那是多么艰苦而幸福的日子,夜里放震耳欲聋的音乐、咬尖辣椒提神,有伙伴累得蹲在厕所里睡着了。
在1994年和1995年的冬季,我们的软件作品分别获中国大学生应用科技发明大奖赛二等奖和全国大学生"挑战杯"学术科技作品竞赛二等奖。在西北地区,我们是"老大"。我成了西电学生的榜样,仰慕我的学生有一大批,我刚到浙大读博士时,收到一个西电计算机系学生的信,他说:"你走了,我呆在西电没有意思,我准备考浙大的硕士生,你到哪里我就跟到哪里。"
在硕士毕业前,我在鉴定表上这样写道:"我热爱科技事业,如同热爱生命一样。近5年的科研工作带给我最充实的生活,也寄托着我美好的向往。可我同时也感到了痛苦,因为5年来我耳闻目睹科研中太多的弄虚作假。我发誓做一名真实、正直、优秀的科技人员,以正身自勉。"

我在西电度过了幸福的6年半,最让我牵肠挂肚的是"吃"、"友情"和"爱情"。
当我第一次吃红红的和青青的辣椒时,"感动"得满脸是泪,那滋味让我觉得前17年白活了。我在读硕士时已经能自力更生,我开发的软件不仅竞赛获奖争了名气,而且还挣了钱(卖了二十多份软件,平均每份挣500元)。写书得稿费7000元,那时我简直就是富翁。这些钱的小部分用来给女孩子买礼物,大部分用于和与哥儿们吃香的喝辣的。
我相信自己已经尝遍了西安的小吃,并且发现了一个"秘密":最好吃的东西都在地摊上,最香的东西一定是辣的,最辣的东西一定是香的。曾经沧海难为水,我在浙大的三年里很少再吃辣椒,因为怕它玷污我心目中的辣椒。
在我小时候,我爸很讨厌土豆(在困难时期他吃了太多的土豆),他竟然因此不让我吃土豆。我哪敢跟他论理,于是忍啊忍,一直忍到我上大学"远走高飞"。如果说辣椒是我新交的女朋友,那么土豆就是我天生的命。我在西电经常用电炉(从来都没被抓住过)做"以土豆为核心"的菜,天长日久,朋友们干脆叫我"土豆"。
我吃饱土豆和辣椒后不免深思而感叹,人要是认认真真地吃,真的花不了多少钱,那些贪官究竟是怎么吃掉巨款的?我将来怎么吃得掉自己挣来的钱?
我在读中学与本科时,满头白发,脑袋可以当白炽灯泡用。当我硕士毕业再照镜子时,吓了一跳,白头发不见了!我不知道究竟是哪种食物起的作用(估计是辣椒)。那些早生白发的小伙子们,你们就到西安上学吧。

马佩军是我在西电最早的朋友。刚入学时我们分到一个宿舍,他象国民党兵盘问良家妇女那样上下打量我,问:"喜欢干啥?"
我怯生生地回答:"打乒乓球。"
他再问:"什么风格。"
我答:"快球。"
他突然象阎锡山那样怪笑,拍拍我的肩膀说,"好!我喜欢,以后你就是我的朋友。我是陕西人,农民,会开拖拉机和卡车。这里是我的家,以后你有啥事,就对我吱一声。"
马佩军和我打乒乓球时口中念念有词:"哼!你对我狠,我对你更狠;你对我好,我对你更好。"他好几次说要把世上最好吃的板栗送给我一袋,这一袋板栗我到现在都没拿到。马佩军夜里极能侃,吹他家乡的人跑得快,常把野兔追断气。有时他吹得太离谱,常令我们6个舍友群起而攻之。为了把我们一举歼灭,他白天到图书馆查"资料",夜里再挑起事端。双方就象印度与巴基斯坦,常干两个秃子争一把梳子的事。
马佩军上大学前也没见过计算机,但他对计算机技术有极强的领悟力。我们第一次上机时,他把我拉到打印机旁边说:"帮我防着管机房的,我要修理这台打印机"。还没等我反应过来,他就开始"肢解"打印机。我无比深刻地体会到:歹徒在作案时都不害怕,最提心吊胆的就是那个放风的。他在5分钟内修好了打印机,我佩服得五体投地,甘愿下次再跟他干"坏事"。
我们读本科和硕士时主要用DOS操作系统,那时期病毒泛滥。马佩军杀病毒不用软件,用手杀。看他杀病毒简直是一种享受:噼里啪啦地敲一阵子汇编命令,然后机器就好了。求救电话太多,他经常无怨无悔地带着那双铁手游荡于西电各个角落,却不知道编写个杀病毒软件来赚钱。
我一直认为马佩军是西电编程第一高手,他编程的时候根本不是人,是指针。之所以我的名气大,一是因为他不好名利,二是我把他的程序写上了我的名字(并且卖了不少钱)。
马佩军的女朋友是我介绍的,我一眼就看出她将嫁给他。后来俩人果真结婚了,只是他嫁给了她,现在他还有了一只"小马驹"。硕士毕业后,马佩军留在西电读博。前年我再见到他时,他说我害死他了,快乐得要宰了我。马佩军在西电已经呆了十年,禀承了西电所有的优点与缺点――"很土但结实耐用"。我在西电时很土气,离开西电后变得"半土不洋"。马佩军简直就是西电人自己的"兵马俑",每次看到他或者想起他时,我就明白自己的"根"还在西电。我喜欢陕西人源于马佩军。

宋任儒是我们的班长,也是班里最早的党员,满口仁义之道,比唐僧还让人受不了。在二年级时,我迷上一个比我大一岁有了男朋友的女同学,多日沮丧。他看在眼里痛在心里,跑去把那女同学教育了一通。苏联解体的时候他十分沉痛,在思想教育课上,他向我们作了深刻的检讨,好象是他没有管教好戈尔巴乔夫那小子。最后他为我们点燃了希望:在不久的将来,"苏联"将重新成为苏联,共产主义旗帜将继续在全世界飘扬。
在本科三四年级,他对跳舞十分入迷,连上厕所都滑翔而去。我那时常把自己关在实验室里搞科研,极少有空与他玩乐,等到本科毕业时,猛地发现他已经风度翩翩。
宋任儒在读本科时学习既不好也不差,我们从来没有合作研究过什么。我喜欢他是因为他很有情趣,不落俗套,并且刚正不阿。也许,我俩本来就有相似的秉性,只是表现不同而已。
本科毕业时,他分到威海工作,走之前我为他饯行。可在硕士开学时,我的房门被人一脚踢开,他对我喊了一声"林子啊,我又回来了"。我就象祥林嫂见到了被狼叼走的孩子那样惊喜。
宋任儒读硕士时被发配到临憧771所,他在那里过上了乐不思蜀的日子。有一天,他带来两个看上去很文静的女孩子(一个读硕士,一个读本科)来串门。就在我洗水果的几分钟里,三个人已玩得乐翻了天,两个女孩满屋子追他,一会儿把他按到桌子上打,一会按到床上打。我惊诧至极而又羡慕至极,恨不得挨打的人是我。想不到上学竟然会有这等欢乐,看来我读硕士的日子白过了。
后来,那个大一点的女孩子嫁给了他。当他带她去见公婆时,公公长叹一声:"把儿子交给你,我就放心了。"而婆婆已乐得合不拢嘴,竟然无法叹气。
现在,宋任儒已从复旦大学获得博士学位,比我更早地成家立业。他和她既是夫妻,又象兄妹,还象伙伴。他叫她"聪聪",她叫他"笨笨"。
"聪聪"问"笨笨":"老公啊,人活着为了什么?"
"笨笨"答:"就是让咱们每天快快乐乐。"
我亲眼看到的幸福莫过于此。

我在大二时曾为系里学习最差的十几名同学办了补习班,谢伟在这个补习班里名列倒数前茅。在他睡懒觉时,我象催命鬼那样喊他捅他。他无比吃力地抬起沉重的眼皮,就象软弱无力的举重运动员,还没有挺起来就趴下了。
他开始呻吟:"这一次就饶了我吧,下一次我一定,一定会去的,求你了。"
我不肯。
"那么让我再睡5分钟,"他不死心。
我仍不同意。
"那么你就从1数到10,要慢一点,"他讨价还价。
当我数到9时,他就接着数9.1,9.2, 9.3 ……
一开始他觉得我很好玩,后来他就离不开我了。并不是因为我学习好,而是那时侯我天真并且充满活力。在三四年级我忙于科研时,他照顾我的生活,叫我"少爷",既做管家又做兄长。我们不仅共用饭菜票,并且共用仅有的一个碗,总是他买饭菜和洗碗。
我们那一级的学生大多崇拜巨人公司的创始人史玉柱,我问谢伟:"我是不是和史玉柱一样能吃苦?"
他说:"如果考虑年龄因素,你已经比他更能吃苦。你将来一定能做大事业,我就把希望寄托于你了。"
在我们都还不成熟的时候,我成了他心中的灯塔,只要灯不灭,希望就在。现在他为了娶一个日本姑娘,披荆斩棘追到日本,有了新的希望。
二十几年来,我就为一个男人哭过,那时他本科毕业离校。

我读硕士研究生时,由于受我的影响,本系三四年级的学生蜂涌至微电子所参加科研。夜里看十二层高的科技大楼,灯火通明、热闹非凡的那一层就是微电子所。那时,我在微电子所学生中的地位仿佛伊拉克的萨达姆,手下兵将极多。
我写第一本书时,有好几个人帮我输入稿子,使我没时间慢腾腾地打草稿。我就象金庸写小说,有如神来之笔,想到那里就写到那里,写了一段他们马上输入一段,一气呵成。那本科技书写得很滑稽,同学们看得笑出眼泪,编辑看了拍案叫绝,只改了几个字就出版了。
那时侯我的心情是如此之好,为一男同学乱蓬蓬的头发写了一篇散文,并送他一把梳子。又把一女同学的实验报告写成评书。我的文笔大概就是这样练出来的。
这一群学生中,戴玉宏、史江一和马晓华是我最好的伙伴(我们都属于牛)。
戴玉宏其貌甚帅,眉中有一根白毛闪闪发光,因此号称"白眉鹰王"。"白眉鹰王"武功了得,是我软件产品的核心开发人员,我们合作最深最久。后来我开公司,他就从广州辞职到杭州为我助威,令我感动不已,可见读大学时期我们有多铁!戴玉宏有一次打饱嗝,整整打了两天两夜,我差点心疼死。
我尚未发迹之日曾与戴玉宏在校园里卖花,无人问津,就请电子工程系的鲁洁救助。鲁洁温柔貌美,她一言一笑尤如春风吹拂苏堤的杨柳,令人心里一荡再荡。顷刻间就有男生围观,有人看花,有人看"贵妃",鲁洁一走,我和戴玉宏可怜得就象两根蜡烛。鲁洁读大学时调皮捣蛋,到四年级时还不太会编程。她的本科毕业设计是仿真"雷达跟踪飞行物",程序基本上全是我编写的。我已记不起用了什么公式,只知道每次计算后都弹出一个对话框"报告长官,击中目标"。鲁洁毕业后到深圳的一家软件公司工作,几年一过,她成了行家。再与她交谈时,我只有听的份,象鸡啄米一样点头。
史江一和马晓华都是陕西人,和马佩军一样厚道热情。史江一性格稳重,属于"你办事我放心"的那类人。我对微电子专业一窍不通,全靠他帮我混过实验这一关。后来我开公司失败,陷入经济危机,就把希望工程的一个小孩托给了他。
马晓华是我最不放心的人。他常常为别人做事情,但热情过头就忘了自己的事情。有几个不道德的学生就利用他的这个缺点,经常使唤他,并且借他的钱不还。马晓华喜欢为那些人"卖命"并且挨训,他总是在受虐待够了的时候再跟我们嘀咕,我们实在气不过,只好对着他的屁股追加一顿拳脚,并给他一个绰号"受虐狂"。但愿他找个好老婆,我可以早日放心。
我们这一群小伙子同时喜欢上一个女孩子,她叫姜姗,是她班里的四大美人之一。我们不仅没有争风吃醋,而且心甘情愿地让她坐遍每个人的脖子。姜姗小姐5岁时她爸姜晓鸿成了我的同事,我们经常一起去钓鱼,亲得象一家人。姜姗喜欢大喊大叫,声音高过帕瓦罗蒂,我们教唆她喊她爸"姜球球"。
我常带姜姗到小吃摊去吃女孩子不敢吃的东西,并哄她:"世上最好吃的东西是鸡屁股。"
她无师自通地加上一句:"世上最好听的屁是鸡放的屁。"
我常想着将来生个儿子并把他培养成天才,但如果能有姜姗这样的女儿,不要儿子也罢。

在本科三年级我第一次参加"星火杯"竞赛并获得软件二等奖后,马上成为低年级学生眼中的明星。我义务当上了一年级学生的上机辅导员。一天晚上我巡视机房,一女生请求帮助。
我见屏幕上空白一片,根本没有一行程序,十分疑惑地问:"什么问题?"
"没有问题。"她把书往我手上一塞说:"这些作业你帮我做。"然后就自个子跟她的同学玩乐,把我撇在一边,似乎我辛辛苦苦地学习就是为了给她做作业。
我定神对她细看,发觉她简直就是《射雕英雄传》里的黄蓉再世,顿时心就"突突突"直跳。当天晚上我没睡着,接下几天的课不知所云。在选修课《操作系统》考试时,我给家里写了一封超短信:请快寄钱来,我谈恋爱了。我交了白卷直奔她去。
我的初恋只有两个月,却让我思念了8年。她离我而去时没有任何理由,而我却失魂落魄。在我本科毕业前的18个月里,白天我狂热工作强作笑容,夜深人静时心痛如刀割而无法抑制。没有人为我"疗伤",我是硬挺过去的,这一段经历使我日后心理承受能力极强。后来我开公司的失败虽然对信心有所打击,但根本无痛可言。
我们分手后并未成为陌生人,就象两只刺猬,离得远了就有点留恋,离得近了,就刺着对方。认识她时我虽然已略显才气,但并不具备成熟男人的魅力,很多事情我并不知道怎么去把握。有时"喜欢"并不能成为"爱",感情也许是永远研究不透的学问。

我读硕士研究生时有了一群生机勃勃的朋友,感情的伤痛被淹没了。朋友堆里夹着一位女生,她文雅而富有气质。平日里无拘无束,大伙戏称她是我的秘书。我的言行举止和穿着都经过她的调教,俩人出双入对,十分亲近,不知不觉有了感情。别人已经把我们当成恋人,我和她牵着小姜姗散步时,简直就象一家人。
可是我当时着迷于事业,认为自己不久将干一番惊天动地的事。鉴于史玉柱在创业时就离过婚,所以我认为感情是事业的累赘,两者不可得兼。
更糟糕的是,我和第一个朋友藕断丝连,偏偏她俩是同班同学。我知道脚踩两只船没有好下场,可我的的确确同时喜欢着两个人,并梦想她俩能合二为一。我情愿被人指责,也不愿掩饰真实的感觉。有时她俩一同走过,我站在路上丢了魂似的看着俩人的背影,任凭看热闹的人指指点点。
我和第二个朋友已经有了很深的感情,她毕业后我曾坐火车千里送鲜花给她,让她感动过。而我固执的性格和对初恋的思念终于让她心碎。尽管我们已经几年没见,我依然看得见她留在我心里的那颗眼泪。

我在西电六年半的学习和生活也许是一生中最珍贵的,叫我怎能不爱西电。
两年前我回西电,惊奇地发现校园里房前屋后长满了待收割的小麦!这所大学是从事电子科技的,种小麦干啥呀?
朱总理曾讲过:"目前国家粮食充足,再来三年自然灾害也不怕。"现在国泰民安,似乎用不着"深挖洞,广积粮"吧。我素知西电提倡勤俭节约、自力更生,但与其种小麦还不如种蔬菜呢。
老同学告诉我,种小麦是为了应付"211"工程(为21世纪选拔100所重点大学)的检查团,因为"211"工程有较高的绿化指标。偏偏检查赶在冬天,那时的西北极难长草。西电本来就人多地少,地上一长草马上就会被谈恋爱的学生给折磨死。一到冬天,整个校园就光秃秃一片。小麦在年轻的时候还真和青草长得一个模样,用小麦绿化校园可谓千古绝笔,检查团的那些权贵人士早已五谷不分,岂知所见的"草坪"乃是麦田。

浙江大学依山而傍西湖,是个美丽而高贵的大学。1997年春天,我就象干儿子那样挤进她的怀抱,并期望得到关爱。我到了向往已久的计算机辅助设计与图形学(CAD&CG)国家重点实验室读博士学位。导师是石教英教授,石老师虽然年过六旬,但精力充沛,红光满面,施拉普纳不及他半分精神。
我幸福地幻想着大干一番自己喜爱的专业,并计划在35岁左右成为实验室主任。开学的第一天,我兴冲冲地奔向实验室。进门不到5分钟,就因不懂规矩被看门的年青女子训了几次。为了不再冒犯规矩,我就老老实实地抓起一份计算机报纸并且站着阅读,心想这下不得罪谁了吧!
突然一个气得脸色铁青的男人(机房管理员之一)对我断喝:"你在干什么!你怎么可以不经允许就翻看别人的报纸!"似乎我是他一生中见到的最无耻的人。
我就象一个情窦初开的少年飘飘然地去拥抱梦中情人,不料迎来两个耳光,此下场比《猫和老鼠》中的猫还惨。如果这两个年轻人有幸看到我这篇文章,应该好好悔过自新,她与他的工作态度打击过数十个学生的积极性。我本是因为向往CAD&CG实验室而来的,得到的却是极坏的第一印象。(我博士毕业后,这两人也离开了实验室,我替后来的学生们谢天谢地。)
CAD&CG实验室在理论研究方面很有名气,但我的兴趣是开发实用的软件,"嫁错人"了。我颇费周折地考入CAD&CG实验室,却尚未热身就全力而退,决心自立门户。至今我都没有用实验室的计算机编过一行程序。

刚读博士时我穷困潦倒,只有一床,一盆,一壶,一碗。我那些穷朋友们象挤牙膏一样挤一些钱资肋我。我买了一台计算机,在宿舍里开发软件产品"可视化软件开发工具 VA 4.0"。1997年8月,我去北京参加首届中国大学生电脑大赛软件展示,路费也是借的。同学为我壮胆时说:"如果不能获奖,就回到实验室干活吧。"
我说一定会拿第一名,不然去干啥。
在软件展示时,我们发现很多好的作品是国家的科研项目,根本不是学生个人的作品,违背了竞赛的宗旨。如果允许这样做的话,学校可以运几条生产线过来。我写了一份抗议书,找了十几个人签名(很多人敢恨而不敢签)。但抗议能顶屁用,我参加过的科技竞赛、听过见过的科研鉴定多了,哪一次我没看到虚假?我写抗议书是因为眼里容不得沙子。如果我在北大读政治,恐怕早就遭殃了。
这次竞赛选出十个"软件明星",只有我的软件和清华大学博士生的项目值得一看。他的项目水平很高,但那不是他个人的作品(评委甚至认识他的导师,知道项目的来龙去脉)。综合诸多因素,我的作品被评为第一,他的项目被评为第二。组委会来拍电视,可是找不到浙江大学的展板。因为浙江大学没有任何准备,我是一个人来的,我的作品夹在杭电的作品之中,没名没姓。我只好从塑料袋上剪下"浙江大学"四个字,贴在展板上撑撑门面。
自新中国成立以来,清华大学就一直在浙江大学头上"作威作福",我好歹也争了一口气。可是颁奖时,组委会竟按地方顺序从北京念起,我沦落到第七,差点咽气。
我曾在上海的一辆公共汽车上与一位北京来的旅客聊天,此公极健谈。似乎他到上海旅游的目的就是为了发掘北京的优越性。见我挂着浙江大学的红色校徽,且对清华、北大并不神往,不禁十分迷惑,就问:"浙江大学在浦东还是浦西?我要去看看。"
北京已经是极度优越了,就请不要把什么鸡毛蒜皮的好东西都拿走。

1997年11月,在穷得快挨饿的时候,我获得了中国大学生跨世纪发展基金特等奖(全国共20名,奖金1万元),到人民大会堂领奖。给我们出钱的是一个靠资本运作发财的集团,在宴会前,该集团领导人和我们座谈,他什么不好吹偏偏吹自己是个高科技企业:"我们主要从事生物工程,几年前就掌握了克隆技术,英国的'克隆羊'简直是小菜一碟。……我们在东北有个农场,新品种的小麦长得比人还高,麦粒跟葡萄一样大,你们不久都会喝到用这种小麦酿的啤酒。……我如果去美国炒个总统,那就跟玩似得。"
我们几个获奖的博士生吃饱喝足、拿了钱后,关起门来把那个老板臭骂一通,扬长而归。别以为给钱就能让我们说好话!
刚拿了"跨世纪发展基金",又马上获得"浙江省青少年英才奖",浙江大学也给我发奖学金。比起那些一个月只有300元工资的博士生们,我简直是"暴富"。还了朋友们给我的"救济款"后,仍然是个"富翁"。我老是觉得手头的钱是"抢劫"来的,心里不踏实。于是找浙江大学校团委"诉苦",请校团委把我的"不义之财"捐给浙大的贫困学生。校团委的老师热情而坦诚,说愿意等我成为真正的富翁时再接受捐款,现在不能让我"杀鸡取卵"。但为了能让我表达心意,建议我资助"希望工程"的中学生,让我选了5个初一的学生,每个学生500元。我轻浮地以为自己真的帮助了5个中学生,直到1998年暑假我见到了其中的一个中学生,才发现自己做的好事只不过杯水车薪而已。我是到了自己贫困失意时才真正去帮助那些孩子的。

在1997年,我在学生时期的荣誉已登峰造极,觉得自己的翅膀已经硬了,不想再混下去。我总以为自己是第二个史玉柱,应该开个软件公司来振兴民族软件产业。我曾到东软集团(沈阳)参加"民族软件产业青年论坛",大不咧咧地作了一次演讲(现在发现演讲的内容没有一项是可以操作的)。杭州有一个记者来采访我,我谈了一天的理想,记者还是没听明白,干脆自己写新闻报道,并且含蓄地做了一个广告:万事俱备,只待投资。
由于我能说会道,频频上电视,引来近10个投资者。我选择了一位年龄比我大一倍、非常精明的商人作合伙人,成立了"杭州临境软件开发有限公司"。彼时,我可谓光芒四射,名片上印着"以振兴民族软件产业为已任,做真实、正直、优秀的科技人员。"浙江大学有关部门想开除我,被我"晓之以理、动之以情"安抚住。
我当时想开发一套名为Soft3D的图形系统,此系统下至开发工具,上至应用软件,无所不包。公司名字起为"临境"有两个含义:一是表示身临其境,这是我对图形技术的追求;二是表示快到了与SGI公司称兄道弟的境界,这是我对事业的追求。"临境"这个名字我在读本科时就已经想好了,1997年底公司成立的那一天,我有一种"媳妇熬成婆"的悲壮感觉。
我从实验室挖来一位聪明绝顶的硕士生做技术伙伴。他叫周昆,年龄很小(1978年出生),研究能力极强。如果按照浙江大学计算机系博士生毕业的论文要求,他入学读硕士的那一天就可以博士毕业。周昆的头明显比我的大, 估计其脑容量至少是我1.5倍。我曾经以师兄的身份为他洗过一双袜子,他因此觉得我是个好人。我俩一拍即合,常常为Soft3D的设计方案自我倾倒。一想到Microsoft公司的二维Windows系统即将被Soft3D打击得狼狈不堪时,我们就乐不可支,冲劲十足。
我已经把"振兴民族软件产业"列入日程,并且提前担忧将来钱挣得太多用不完该怎么办。1998年5月份,我们做了一套既不是科研又不全象商品的软件。软件产品宣传了几个月,并没有出现订单如潮、接应不暇的局面(事实上压根就没有反应)。我意识到没有找对市场,但仍觉得产品中的一些技术很有价值,将它改装成其它软件也许能开创"东方不亮西方亮"的新局面。
于是我向只有一面之缘尚在北大方正工作的周鸿��求助。他是真正的软件高手,当我小心翼翼地展示约10万行C++代码的软件时,他竟在十几分钟内就指出多处重大的设计错误,使我目瞪口呆地意识到整个软件系统的价值为零。那种心痛啊,就象眼睁睁看着孩子被狼吃掉一样。
到1998年10月,我用光了30万元资金。周鸿��再一次从北京飞到杭州,三下五除二替我把只活了一年的公司关闭掉。他放心不下,觉得我"恶病需用猛药治",于是意犹未尽地把我捉到北大方正插在他管辖的部门,让我学习怎样做事情。
北京寒冷的冬天可以营造一种凄凉的气氛,冲去一切可以自我原谅的借口。我并不是太爱虚荣的人,知道这次失败是我的毛病积累到一定水准忍不住喷发出来的结果。我绝不能以年纪尚轻不太懂市场与管理为理由轻率地敷衍过去。
从北大方正"劳改"了两个月回来,我心服口服地承认失败了。我把察觉到的数十个毛病列出来,日后一个一个克服掉。现在我能比较清醒地分析我和投资方所犯的主要错误,以祭我那幼年夭折的软件公司。
我的主要错误:
(1)年青气盛,在不具备条件的情况下,想一下子做成石破天惊的事。我的设计方案技术难度很大(有一些是热门的研究课题),只有30万元资金的小公司根本没有财力与技术力量去做这种事。
(2)我以技术为中心而没有以市场为中心去做产品,以为自己喜欢的软件别人也一定喜欢。我涉足的是在国内尚不成气候的市场,我无法估计这市场有多大,人们到底要什么。伙伴们跟着我瞎忙乎一整年,结果做出一个洋洋洒洒没人要的软件。
(3)我做到了"真实、正直",但并没有达到优秀的程度。我曾得到很多炫目的荣誉,但学生时代的荣誉只是一种鼓励,并不是对我才能和事业的确认。正因为我不够优秀,学识浅薄,加上没有更高水平的人指点我,才会把事情搞砸了。
投资方的主要错误:
(1)投资方是个精明的商人,他把我的设计方案交给美国的一个软件公司分析,结论是否定的。但他觉得我这个人很有利用价值,希望可以做成功其它事情,即使Soft3D软件做不成功,只要挣到钱就行。这种心态使得正确的可行性分析变得毫无价值。
(2)由于我不懂商业,又象所有单纯的学生那样容易相信别人。他让我写下了不公正的合同,我竟然向他借钱买下本来就属于我的30%技术股份。他名为投资方,实质上双方各出了一半的资金(他出51%,我出49%)。他在明知Soft3D软件不能成功的情况下,却为了占我的便宜而丧失了应有的精明,最终导致双方都损失。
关闭公司时,他搬走了所有东西。我明明投入了技术,又亏了15万元,却一无所得。几个月后当我意识到不公平而找他协商时,他说:"只能怨你自己愚蠢,读到博士,连张合同都看不懂。"此事充分地显示了我的无知与愚蠢。自己的奋斗没有必要后悔太多,学到的远比失去的多,我相信下一次会做得更好。

公司关闭后,我就面壁反省,补习基础,准备为几年之后"东山再起"养精蓄锐。
1999年1月,有一个民营企业家G先生向我请教一个问题:"我给一个年轻人投资了100万元,建立一家从事环保信息应用开发的软件公司。他曾许诺一年内创利润上千万元,可是才过去5个月,他就把100万元用完了,什么也没挣到。我实在不明白是怎么回事,请你帮我分析分析。"
这位G先生年龄有我的2.5倍,曾在西北当过几十年的技术兵,性格豪爽。他投资的那个年轻人叫Y(以下称Y经理),自称有英国的管理学文凭,能对公司的市场、技术、管理一把抓。G先生喜欢说"钱我没问题",于是想也不想就投了100万元,并且给Y经理40%的股份。
G先生请Y经理到家里座谈。我那时突然狡猾起来,自称是G先生的远房亲戚,在浙大读半导体物理,特羡慕那些做软件的同龄人,渴望听听Y经理的高见。Y经理果然信口开河,滔滔不绝,连绵不断,如黄河泛滥,一发而不可收拾。我激动地想去参观他的公司和产品,并表示要抛弃物理专业,立马转向软件专业。
Y经理得意而笑:"对于IT行业你就不懂了,我们经营的是一种理念而不是产品,这是国外最先进的思想。你可以来参观我的公司,但你看不到具体的东西,只能用心去领会。"
这屁话比曹元朗的诗还臭(《围城》)。我搞软件只有8年功夫,说我不懂IT行业并不过分。可我读了10年大学都没听到过如此"先进"的思想。如果这是英国管理学教育的成果,我认为自己已经发现了这个曾经是"日不落帝国"的衰败的真正原因,有必要找英国首相切磋一番。
我对G先生说:"Y经理根本不懂技术,为人极其浮夸。应马上关闭公司,以绝后患。那100万元你也亏得起,就买个教训吧。"
G先生说:"钱我没问题,那100万元就算我在澳门赌博输掉了。"
1999年5月,G先生又来找我请教另一个问题。
他说:"小林啊,你上次说得很有道理,我接受了教训。"
我说:"那是好事,不论年龄大小,知错就改总是好孩子嘛。"
他叹了一口气:"最近几个月,Y经理又花了我100万元。"
我当时差点给噎死,气凶凶地训G先生:"我早跟你讲过,Y经理不是好东西,叫你关闭公司你不听,你老说钱没问题,亏你200万元活该。"
老先生象犯了错误的小孩子:"Y经理每一次向我要钱时,都拍拍胸脯保证下个月就有利润,所以我一而再、再而三地掏钱给他,希望能救活软件公司。现在该怎么办?"
一个有20名职员的软件公司,程序员只有三四个,连"十羊九牧"都不如。200万元的财务报表中,有100多万元用于吃喝玩乐和行贿。这种公司完全无药可救。台湾作家李敖曾说过:"当你没法扶一个人上马时,也许应该拉他下马"。从5月份到8月份,我行侠仗义,替G先生清理软件公司,根除Y经理这些败类。
可是难哪,因为G先生投资的公司根本不把G先生放在眼里,又岂能让我插手。就在我想方设法卡住Y经理的脖子时,Y经理总能从G先生那里挖出钱。G先生就象被吸血鬼附身,却仍存幻想:"如果吸血鬼能治好我的病,就让它再吸些血吧。"
Y经理又和一个来自深圳的骗子H想了注意,教唆G先生再投资100万元新建一个"指纹"公司,说利润将比开发环保信息更加可观(估计要用亿来度量)。就在他们准备签合同之际,我偶尔路过,发现异常,便强行阻止。
G先生是个好人,但太顽固。好几次我气极想撒手不管,但又不忍心好人被坏人欺负。我曾请求G先生:"我求您别再说钱没有问题,您的私人财产会被人骗光。请让我把这漏洞堵住吧,好让我安心地回学校做完博士学位论文。"
到8月份,我和G先生的两个儿子,伙同"黑社会"的朋友,强行把那个软件公司搬回G先生的工厂中,辞退所有员工。现在那个软件公司被别人接管,仍然半死不活,好在每月亏损不过几万元,G先生承受得起,我就不再去碰G先生的伤疤。
我以前从未玩过与人勾心斗角的游戏,此三个月的经历让我疲惫不堪。那个软件公司的员工曾透露,Y经理的英国文凭大约是在上海或杭州某个大专培训班里混来的。方鸿渐买美国克莱顿大学博士文凭尚知羞耻(《围城》),而Y经理却趾高气扬。害得我平白无故为英国教育界担心,回想起英国鬼子曾打劫过中国,倍感耻辱。
G先生是正人君子,不防小人,实在不是现代的商人。我和他成了忘年交。G先生第一次见到我时问我工资几何,我答曰:"300元,够买几本书。"G先生甚为着急:"这样的条件怎么能生活?你就搬到我家来住吧,我家条件好,你可以安心地学习,将来可为国家多作贡献。"后来他几次相邀,我就看在国家的份上住入他家,一直住到博士毕业。自从读中学以来,我第一次享受食来张口,不用洗衣服的奢侈。唯一的麻烦是我得向很多朋友解释:"我不是被别人养起来了,是为了国家的利益,不得已才这么做的。G先生是男的不是女的,并且没有待出嫁的女儿。"

我在读博士学位的三年半里,经历有点奇特。我遗憾的是"真才实学"没有长进多少,并且没有了在西电那样的纯真友情。略为欣慰的是我做了几件有意义的事情。

我很想讲一讲自己参加希望工程的经历与感受。
1998年暑假,浙江省云和县梅源中学的老师们带着希望班几名优秀学生来到浙江大学,其中有受我资助的何晓丽同学。我才知道初中学生一个学期的学杂费就要600元。何晓丽哭诉下学期不能再上学,其它的学生处境相似。我以前资助的2000元是5个人3年平均分派的,根本不起作用。
那时侯,公司倒闭使我债务累累,并且自信心遭受十年来最大的打击。我在入不敷出、心事重重的情况下,没有推卸义务,而是"变本加厉"的去尽这个义务。我在西电的好朋友史江一替我"接管"了一个中学生。有一个小姐追求我,我乘机给她一个活生生的"见面礼"。1999年7月份,我把饭卡送给了一个大学生,自己成了无产阶级。从1997年11月起到我博士毕业期间,我直接或间接地为7个贫困学生捐助了约1万元。我有了几点感受:
(1)对人的帮助莫过于给予希望。
(2)人在任何时候都能够帮助比自己更困难的人,哪怕自己处于困境。
(3)帮助是要负责任的,一定要设法做成有意义的结果。不负责任的帮助就是"施舍"。"施舍"缺乏诚意,不配称为"帮助"。
不少人曾对我说:"你是做大事的人,不要在小事上浪费精力,更不要为了别人而害了自己。"
很多人总以为自己将来是伟大人物而不愿做小事,从而到死也没做成什么有价值的事。也有很多人希望自己成功后再去帮助别人,无论他最终成功还是失败,一辈子也没有帮助过人。还有很多人略有权势或略有名气后,便觉得自己吃喝玩乐、放屁、上厕所都是重要的事,在他们最能够帮助人的时候却以"太忙""没空"为理由不去做好事。
我也在忙碌、在奋斗,也渴望成为伟大人物,但我希望让有意义的小事充实一生。

我还要讲另一件我常干的小事。
很多受过高等教育的人保留了随地扔垃圾的"风俗习惯",这恶习就象脚气那样虽然不致人于死地,但能遗臭万年。即便象浙江大学这等典雅的地方,你都经常可以看见草坪、校门口的废纸、果皮和塑料袋等,垃圾就如同天使脸上的一砣狗屎那样鲜艳,人们竟然无动于衷。我记不请自己多少次当众、当道捡垃圾,可是几年来我都没有在大学里发现第二个做这种事的人。
我很想对所有的教授、博士、硕士、学士们讲句话:"救人并不只是医生干的事,保护环境也不只是清洁工干的事。只要你多花几秒钟,弯几次腰,就能让环境更加清洁,让心灵更加清洁。我们不必个个道貌岸然,但至少应该做到'读书明理'。"
那些正在追我和将要追我的小姐们,你多捡一次垃圾就多一份希望,你丢一次垃圾就不再有希望。
我这样喋喋不休地讲"希望工程"和"捡垃圾",并不是在沽名钓誉,也不是在布道,只是希望我这些"金玉良言"能触动更多的自以为自己是高素质的人们。

在浙大的三年半里,我没有对感情"播种",所以也没有收获,但有一次"艳遇"。
在关闭公司的那天晚上,人去楼空,我象严监生断气前那样盯着尚未熄灭的灯。这时某大学的一位四年级女生来找我。一年前她曾作为实习记者采访过我,谈得很投机。我知道她是聪明好学的学生,曾大言不惭地教导过她几次。我开公司的一年里几乎没与她来往过,想不到当我成了光杆司令时她还能"兔死狐悲"地来看望我,着实让我感动。
我不无自嘲地对她说:"你不用安慰我了,这次失败我还能挺得住。"
她说:"我不是来安慰你的。我一直盼望你的公司倒闭,等了整整一年。在你去北京之前,我有话跟你说。"
我心下一凉,搞不清什么地方得罪她了,让她如此记恨我。大概是我得意之日教导她时言语过重,伤了她的自尊心。好在我是知错就改的人,当下惭愧地向她道歉。
她不理会我,说:"你开公司时光环重重,我根本无法靠近你。即便那时我成了你的好朋友,你也不会把我放在眼里。我暗恋你一年了,一直都没跟你讲。我早知道你会失败的,失败时你就剩下一个人,你才会知道我是真心爱你的,而不是冲着其它来的。你是个优秀的理科学生,我是个优秀的文科学生,门当户对,珠帘壁合。请你不要觉得女的追男的很荒唐,我是认真的,请你给我一次机会。"
我虽然评不上情场高手,好歹也在爱河里游过泳,呛过水。想不到仓促之下,被一女子说得脸红耳赤,无法掩盖窘相。
我一直认为男人应该勤劳一辈子,好让柔弱的女子舒舒服服地在大树下乘凉。而学习、工作出色的女子只能做朋友,不能做夫人。
她从小习诗弄文,读大学时蜚声校园。我见到她第一面时就把她归类为事业上的朋友,所以才会正儿八经地与她交谈并教导她。我在西电的两个女朋友就属于读书不太好但比较有魅力的女生,我从来也没有指导过她们学习。如果我喜欢一个女孩子并希望她成为我的女朋友,我早就去追求她了,岂能轮到她追我。
她见我彷徨不安,便滔滔不绝地例举爱我的"证据"。我开公司一年来发生的事她了如指掌,就象在我的房间里放了窃听器,在我的朋友中安插了间谍。她甚至趁着实习机会跑到团中央去查阅我的老底,有些"光辉记录"我过去的伙伴都未必知道。她思念我时,写了很多诗,留了很多泪……
我早知道有些人不编程序、不做实验就能写出论文,难道男女之间不接触也能滋生感情?
第一回合我就被她挑翻在地,我莫名其妙地成了"负心郎",无地自容地把她送走。我以为这是文科女生的风格,就当作一个趣事不放在心上。
我从北大方正"劳改"回来不久后,她提着一篮鲜花来找我,并对我说了她的梦想:在寒冷的冬天,大地铺满积雪,四野人鸟绝迹。我孤独求败地深居在冷冰冰的小木屋里。在一个狂风呼啸的黄昏,她一手拎着亲手做的饭菜(我想应该有土豆和辣椒),一手拎着一捆木柴,敲开了那扇紧闭的门和心房。终于木屋四壁生辉……
我曾对第一个朋友最好的赞美是:"黄蓉很象你。"
我曾对第二个朋友最深情的话是:"将来咱们老了,我回黄岩当物理老师,你当语文老师。"
相比之下,我的确不及她浪漫。此后她再找过我几次,当我意识到她动真格的时候,她已不能自拔。爱情是很怪的东西,并不是两个好人在一起就能碰出火花。与其让她长痛,还不如让她狠痛一次。
我对她说:"我们真的不能在一起。"
她问为什么?
我说:"不为什么,我没有心跳的感觉。"
她说十年之后再找我。
我知道她会奋发图强,因为她会一直想着"为什么",期望让自己有个满意的答案。 这条路8年前我已经走过了。后来她读硕士时我曾再见过她,她在文学上已经有了长足的进步。
她说将会送给我她的第一本著作,书中开头的几个故事是关于我和她。
我说看了她的书后一定会写一篇读后感给她。
她仍然提醒我不要忘记十年后的相约。

我在浙大有一个值得怀念的人,她是管宿舍楼的大妈。在1999年1月至5月,我在博士生宿舍静心修炼内功,大妈就象我的"护法"。晚上九点钟时,她就会烧些东西给我吃。我和大妈非亲非故,同学们都不明白大妈为什么待我好。我想那是因为我没把自己当成"博士"来看,而是当成"人"来看。
5月份后,我看在国家的份上搬到一个千万富翁家里去住,大妈也调到"熊猫馆"当掌门人。我一般隔几个月去看望大妈一次,中秋节我就和她在一起。朋友们知道我和大妈有这层关系,就纷纷托大妈物色女朋友。
大妈果然称职,她就象特务那样审视大楼里的女生。可大妈毕竟是大妈,她采用的"标准"是几十年前的版本,无法与现今的兼容。她盯住了不该盯的,却漏掉了不该漏的,至今都未"推销"成功一个。
这件事让我又明白了关于软件的一个道理:光有完善的数据库还不够,还应该提供很好的搜索引擎。

我相信生活、科学、艺术中的很多道理是相通的,于是就不嫌人笑,写下了十年来的故事,交最后一次作业。
大学十年给我留下了很多美好的回忆,现在可以打上漂亮的句号了。尽管我即将告别大学,但我会终生学习。也许我成不了天才,但还有机会成为天才的爸爸。
我想大声呼喊出那种可以用双手把握未来的自豪。
我要对年轻的朋友们说两句肺腑之言:
一、主动去创造环境,否则你无法设计人生。
二、生活和工作要充满激情,否则你无法体会到淋漓尽致的欢乐与痛苦。
如果我碰到上帝,只会对他说一句话:"你看厕所去吧。"

保龄球计分规则

保龄球比赛,以6局总分累计决定名次。

  每一局共有十格,前九格里有两球,第十格有三球。共有十支球瓶,如果第一球就把全部的球瓶击倒了,投出"全中",就算完成一格,所得分数为10分再加下一格两球的倒瓶数;如果第一球没有全中,第二球击倒剩下的球瓶,就算"补中",完成一格,所得分数为10分再加下一格第一球的倒瓶数;如果第二球没有把球瓶全部击倒,分数就是第一球加第二球的倒瓶数,再接着打下一格。

  第十格第一次投球如果全中,仍要继续投完最后两个球;如果补中,就要继续投完最后一球;如果两次投球没有将10个瓶全部击倒,那么第三次机会将被取消。

斯洛克规则全攻略

一、基本规则 

1、斯诺克台球球台内沿长350厘米,内沿宽175厘米,高85厘米。22个彩球共分8种颜色,红色球1 5个(1分),黄色球1个(2分),绿色球1个(3分),棕色球1个(4分),蓝色球1个(5分),粉色球1个(6分),黑色球一个(7分),白色球1个(主球)。 

2、开球前主球可在开球区(D型区)内任选一点位置。开球必须首先直接或间接击中红球。按照击落一个红球再击落一个彩球的顺序直至红球全部落袋。其中彩球落袋后放回原置球点。然后按照彩色球的分值从低到高依次为黄、绿、棕、蓝、粉、黑色球击落袋中。 

3、当台面上只剩下黑球时,击球入袋或犯规都会使比赛结束,这时如果双方比分相等则重新放置黑球,进行决胜期比赛,此时无论谁击球入袋或犯规都使比赛结束。 

4、遇有下列犯规行为,应判罚分(分值小于4分按4分罚分,大于4分按自身的分值罚分):球未停稳就击球;击球时杆头触击主球一次以上;击成空杆;主球击目标球后自落;击球时双脚离地,开球时主球未放入开球区(D型区);击成跳球;击球出界;主球首先撞击非活球;击球时,球员的衣服、身体、球杆及佩戴物等触动台面上的球。 

5、下列犯规判罚7分:击红球入袋后,尚未指定球就开始击球;击进红球后,未报彩球又击打红球;不使用白球而使用其他任何一个球作主球。 

二、斯诺克基本玩法和胜负决定 

斯诺克共用球22个,其中15个红球,6个彩球(黑、粉、蓝、棕、绿、黄各1个)和1个白球。红球和彩球用来得分,白球用来击打红球和彩球。每次开始之前,将球摆如图1的形式。开球前,双方可以通过抛硬币来决定谁先开球。在开球时,开球一方,可将白球摆在开球区的任何位置,去打击红球。其后,白球停在什么位置,就必须接着由什么位置打起。每一方必须先打入一个红球,然后任选一个有利的彩球打。打入彩球后,需将彩球取出重新摆回其自己的原位点上(即开球前,其所在的位置上)。接着,再打红球,打彩球,如此反复,直到所有红球入袋。之后,就必须按照一定顺序打彩球。就是说,先打黄球,再打绿球、棕球、蓝球、粉球和黑球。此时,进一个彩球,台面上就少一个彩球(不再需要将入袋彩球取出摆回自己的原位点上),直以所有彩球入袋,台面上中剩下白球,就宣告结束。 

从开始到所有彩球和红球被击打入袋这么一个过程称为一局。在整个进球过程中,一方如果没有能够成功进球,或者打了一个坏球,此时他就得让位于另一方打。连续成功进球的过程叫"一杆"。 

每局的胜负是由双方积分多寡决定,得分多者为胜方。得分有两种途径:一是靠进球得分,二是通过对方失误罚分而得分。打入一个红球得1分(又可称"1度"),打入一次黄球得2分,绿球得3分,棕球得4分,蓝球得5分,粉球得 6分,黑球得7分。因此,双方都会尽最大努力,多将黑球打入袋内。在打红球时,如果白球未能碰到任何红球,则要罚4分;如果误碰了彩球,则按照该彩球的分数罚分,但是最少都要罚4分。就是说,如果碰到了黑球罚7分,碰到了黄球罚4分。同样,在打彩球时,如果未能打到要打的彩球,则按照此彩球的分数罚分;如果误撞了更高分的彩球,按照高分罚分,最少都要罚4分。因此在进了红球后,打彩球前,理论上,打球方都要先声明他将要打哪个彩球。而实践上,如果要打的彩球很明显看得出,则无须声明,但是如果不明显,则一定要声明,否则自动罚7分。如图2,打方一定要先声明,他要打哪个彩球(棕球、蓝球或粉球)。如果误将白球击入袋,最少罚4分,或者按照白球进袋前最先碰到的更高分数球罚分。如果白球入袋,接着打的一方可将白球摆在开球区的任何位置击球。罚分不从受罚方的分中扣减,而是加入对方的得分中。正因为还可以通过双方的失误而得分,所以场上一方如果觉得自己没有进球机会,则会试图制做"斯诺克"。所谓"斯诺克",就是造成这样的一个局面,使接着打的一方无法直接打到要打的球,而不得不采取反弹或弧线等高难度球,因而很容易失误而导致罚分,如图3 。 

一场比赛可约定打一局或三局、五局、七局来决定最后胜负。而世界职业锦标赛的决赛则是打三十五局。如果在结束时,双方平分,传统的决定胜负方法是:将黑球留在黑球位上,白球摆在开球区,双方通过抛币,决定谁先打,先将黑球打入者为胜方。 

2)斯诺克一些常见规则及其应用 

斯诺克的规则非常繁琐复杂,甚至连世界冠军级的大师们也经常不能悉数掌握。不过,这些规则通常可以在实践中不断获得。下面是一些经常令新手混淆不清的常见规则。 

失误球: 

失误球最少罚分4分,如果失误的球是4分以上的彩球,则按此彩球的实际分数罚分。 

(1)将球打离台桌面。 

(2)双脚同时离地击球。 

(3)白球跳过中间球击打目标球。 

(4)台面上的球被球杆击球端以外任何物品或身体任何部位所碰到。 

(5)在出杆时,球杆连续击白球两次以上。 

(6)球杆、白球和目标球同时接触。当白球和目标球靠得太近时,这种情况就时常发生。例如, 当两球的距离少于2.5厘米时,想不犯规出杆就非常困难,除非轻碰目标球,如图4。所以当白球紧贴目标球时,击球方就只准将白球击开,而不得带动目标球。这种特殊情况下,只要将白球打开目标球,就当作击中目标球。一个好的球手,经常会利用这种机会制做安全球,或者做斯诺克。因为,这时可以只打白球而无须白球撞到任何其他球,做安全球和斯诺克就变得很容易,如图5 。 

自由球: 

在一方打了失误球后,台面出现了斯诺克,令接着打的一方无法直接打到红球时,接着打的一方可以任选一彩球当红球打,此彩球便称作自由球。如果这个彩球入袋,就当做红球入袋得1分,接着照常规打彩球。如果台面红球已被打完,出现的情况是令接着打的一方无法直接打到要打的彩球,接着打的一方可以任选一彩球打,此球即为自由球,自由球入袋得分则按台面上所剩的最低分球计算,然后按常规则顺序打彩球。 

重打球: 

如果一方打了一个失误球,而使对方处于不利的处境,对方有权要求失误方接着打。这条规则同自由球规则一样,是防止任何一方有意打失误球从中获利。不过,在决定让失误方打之前,一定要确信台面上每个球都不存在机会,而且要把失误方打球的水平因素考虑在内。 

无意识救球: 

在一方打了失误球以后,如果裁判认为这个球应该可以打到,则可以判罚无意识救球。在这种情况下,得益方可以有以下几个选择权:(1)将球恢复失误球前的原状,要求失误方重新打;(2)要求失误方在现在的位置上接着打;(3 )在现在的位置上自己打;(4)如果台面上出现斯诺克,自己打自由球。 

彩球摆位: 

当彩球落袋重新摆回台面时,如果这个彩球的原位点被其它球占了,则将这个彩球摆到当时最高分的彩球空位点上。如图6,当绿球进袋后,它自己的原位点被其它球所占,台面上空出的彩球点有棕球点、黄球点和粉球点,这时绿球就应该摆在粉球点上。假如所有彩球点都被点,这时就应该将此彩球摆在自己原位点垂直于底边的直线上,最靠近自己原位点,并且不能够碰到其它球。 

僵局: 

当裁判认为台面已形成僵局,裁判便会向双方声明,如果几个回合之内,局面再无明显变化,此局便成为无效,得重新开始。 
24、斯诺克4人双打:
(1) 在4人双打比赛中,每方轮流开盘。击球顺序就应在赛前定好并保持不变。
(2) 每盘比赛结束后,出场顺序可以改变。
(3) 如犯规并被要求继续击球,则应由犯规方的犯规者继续击球。即使该次犯规在轮次以外发生,原比赛次序仍保持不变,这样使犯规者的同伴失去了一个轮次。
(4) 在一盘比赛中,同伴间可以互相商量,但在下列情况下为犯规行为:
a) 选手正在击球或已经在球台旁准备击球。
b) 从第一击球直到一杆球结束的时间内进行商议。

使用辅助器械:


击球运动员应对在球台上放置的移动他所使用的任何辅助器械负责:
(1) 击球运动员对所有物品负责,包括但不限于自他拿到球台上的架杆与延伸器材。无论它们是属于击球运动员自己的,或是借来的,他均应对之负责(来自裁判员的除外),而且当他使用这些设备造成任何犯规将受到处罚。
(2) 因使用裁判员提供的辅助器械而造成的非人为犯规,击球运动员对之不负责任。如这些设备证明有毛病,且由此造成击球运动员触碰一个或一些球时,不算犯规。如有必要,裁判员应将球放回原位,并且当击球运动员正在击打一杆球之中,则应准予继续进行下去而不受处罚。

诠释:


(1) 本规则所有条例与术语对女性同样有效。
(2) 由于具体情况不同,有必要作适当调整,以便使规则应用于一些有实际困难的人,特别是如:
a)"双脚不能离地"的处罚不能用于在轮椅中的运动员。
b)若运动员不能区别颜色之间的差异,例如红与绿,在向裁判员提出要求后,他应被告知球的颜色。
c) 在没有裁判员的情况下,对立之间的球员或双方之间,应被当作按本条规则所叙述那样进行比赛。

General Rules and Regulations 1933

General Rules and Regulations
promulgated
under the
Securities Act of 1933



http://www.law.uc.edu/CCL/33ActRls/general.html

linux进程Prelink

1. 简介


什么是 Prelink ? 它能为我做什么 ? 

       许多的应用程式使用共用函式库. 在这些程式被执行的时候, 共用函式库会被读进记忆体中, 并且跟程式中所参用到的符号(symbol)连结起来. 对大多的小程式而言, 通常这样的动态连结非常快. 但是对一些依存於大量函式库的 C++ 程式而言, 动态连结却可能花上不少的时间.

       在大多数的系统上, 函式库并不会常常被更动, 每次程式被执行时所进行的连结动作都是完全相同的,Prelink 利用这点, 将程式与函式库连结的方式弄出来记录在执行档中, 达成"预先连结"的效果. 你需要 glibc 中的  ld-linux.so 来进行连结, 要能够认出"预先连结"的纪录则需要 >=glibc-2.3.1-r2.

       "预先连结"能够节省应用程式的启动时间. 以典型的 KDE 程式为例, 程式的读取时间能够减少 50% 那么多. 唯一必要的维护只有每当被"预先连结"过的执行档所连结到的函式库有所更新时, 需要再次执行 prelink.

摘要 

    * 我们可以用一个就叫做 prelink 的程式来进行"预先连结". 它能够修改执行档的内容, 使启动的时间变短.
    * 如果某个"预先连结"过的应用程式所依存的函式库有所变动, 你必须重新"预先连结"这个应用程式, 不然速度上的增快将继续无法作用. 也就是说, 每次你用 portage 更新一些套件而更新了一些函式库, 这些函式库必须重新被"预先连结"起来.
    * 对执行档的更动是完全可逆的. prelink 拥有复原的功能.
    * 新版的 Portage 能够应付 prelink 对执行档的 MD5sum 与 mtime 造成的改变.
    * 你需要 glibc-2.3.1-r2 或更新版本, 以及 binutils-2.13.90.0.xx 或更新版本所编 译出的执行档.

2. 设定 Prelink

 

安装所需程式 

注释: 我们假设你的系统是 Gentoo-1.4, 并且是使用 gcc-3.2 与 binutils-2.13.90.0.xx 以后版本编出来的. 这样编出来的执行档才能够进行"预先连结".

警告: 你必须已经安装了 glibc-2.3.1-r2 或更新的版本, 不然 prelink 会搞烂你的执行档!

       先更新你的 portage tree, 因为大多数需要用到的程式都还新, 而常常加入新的错误修正.

代码 2.1: 更新你的 portage tree

# emerge sync

       接下来确定你已经安装了 portage-2.0.46 或更新版本. 这样 portage 才能够认出"预先连结"过的执行档, 在使用者要反安装时才能正确移除. 需要这样做是因为"预先连结"会造成执行档的 MD5sum 值改变.

代码 2.2: 确保 Portage 的版本

# emerge ">=portage-2.0.46"

       现在你可以开始安装"预先连结"工具了. emerge 程式能够自动测试你的系统是否能够安全正常地进行"预先连结".

代码 2.3: 安装 Prelink

# emerge prelink

       有不少人在安装 prelink 的时候遭遇到测试失败的错误讯息. 这些测试是为了安全理由才被放上的, 如果你关闭这些测试, prelink 的行为将无法保证. 这些错误大多是由这些核心套件造成: binutils, gcc, 及 glibc. 试试看照以上顺序重新安装这些套件.

注释: 小提示: 如果你在尝试自行手动编译测试 prelink (./configure ; make ; make check  时遭遇到错误, 你可以察看 testsuite 目录中的 *.log 档案, 它们可能能给你一些有用的线索.

       如果你能提出一套能在多个系统上复现产生 emerge 错误的步骤, 请 e-mail 给 Stefan Jones.

组态设定 

       Portage 会自动产生 /etc/prelink.conf 档告诉 prelink 哪些档案需要"预先连结".

       可惜的是你没办法"预先连结"旧版 binutils 编出来的程式. 大多这些来自预先编好, 执行档发布的套件都被安装在 /opt. 编写以下档案能告知 prelink 不要尝试去"预先连结"它们.

代码 2.4: /etc/env.d/99prelink

PRELINK_PATH_MASK="/opt"

注释: 你可以用冒号分隔加入更多的目录在这个清单中.

3. 进行"预先连结"

 

Prelink 使用方式 

       我们可以用下列指令来"预先连结"所有列在 /etc/prelink.conf 中的目录里的执行档.

代码 3.1: 预先连结清单中的档案

# prelink -afmR

警告: 有人发现如果你在磁碟空间吃紧的时候"预先连结"系统上所有执行档, 你的执行档有可能会被截断, 这样会弄爆你的系统. 你可以用 file 或 readelf 来检查执行档的状态. 或者每次在进行"预先连结"前先用 df -h 检查硬碟的剩余空间.
每个选项的解说:
-a  "All": 对所有执行档进行"预先连结".
-f  强制 prelink 重新"预先连结"已经做过"预先连结"的执行档. 加上这个选项是因为 prelink 在看见做过"预先连结"的执行档的时候会 中止执行, 即使相依的函式库有更动过.
-m  节省虚拟定址分配. 如果你有一卡车的函式库要"预先连结"就会需要这个选项. (译注: 这里的原文 virtual memory space 是有问题的, 应该是 virtual address space 比较正确.)
-R  Random -- 用乱数进行定址分配, 这样可以增进安全性对缓冲区溢出(buffer overflow) 攻击的抵抗能力.

注释: 如想知道更多的选项细节, 请见 man prelink.

4. 已知问题与处理

 

"Cannot prelink against non-PIC shared library" 

       这个问题是由那些没有使用 -fPIC gcc 选项编译全部目的档(object file)的问题函式库所造成.

       以下是一份问题函式库, 以及当你遇到上述问题时需要重新安装的对应套件.

代码 4.1: 修正

// 对 ORBit 函式库, /usr/lib/libIIOP.so.0.5.17
# emerge ">=sys-apps/tcp-wrappers-7.6-r4" ORBit// 对 zlib 函式库, /usr/lib/libz.so.1.1.4
# emerge ">=sys-libs/zlib-1.1.4"// 对 svgalib, /usr/lib/libsvga.so.xx
# emerge ">=media-libs/svgalib-1.9.16"// 对 XFree openGL 函式库, libGLU.so.1
# emerge ">=x11-base/xfree-4.2.1-r2"// 对  libpcap.so.0.6
# emerge ">=net-libs/libpcap-0.7.1-r2"// 对 lcms 函式库, /usr/lib/liblcms.so.1
# emerge ">=media-libs/lcms-1.09"

注释: 许多函式库有静态连结到 zlib 与/或 tcp-wrappers, 所以先试著安装它们, 并重新安装问题函式库.

       如果你在"预先连结" QT/KDE 时遇到问题, 先试著更新到 >=x11-base/xfree-4.2.1-r2 与 >=x11-libs/qt-3.1.0-r1 套件. 如果 QT 还是不过的话, 则可以试著在 qt 的 ebuild 档中加上 myconf="-no-xinerama ${myconf}" 来编译不包含 xinerama 支援的 QT .

       这里有一些函式库是还没修正或是无法修正的:

    * wine 套件中的函式库, winex 也不例外. 但是"预先连结"本来就无法对 MS Windows 执行档进行加速.
    * media-video/mjpegtools 中的函式库 /usr/lib/liblavfile-1.6.so.0.

       如果你的问题函式库没有在列表中, 请回报, 最好能够附上一份为相映的 CFLAGS 加上 -fPIC 选项的修补档.

当对档案进行"预先连结"的时候发生中止, 像是 "1631 Aborted ...." 

       你需要为 prelink 加上 -f 参数. 也就是说, 如果你要对整个系统重新进行"预先连结"的话, 用 prelink -af.

"<档名>: error while loading shared libraries: unexpected reloc type..." 

       这个错误在 2002/11/18 时, 在 sys-libs/glibc-2.3.1-r2 中已修正了, 如果你还在用旧版本的话, 请重新安装 glibc.

       已知 prelink -u -a -m ; prelink -a -m 可能也有用. 如果这些方法都失败的话就 prelink -u <file> 吧.

我的 nVIDIA openGL 函式库发生问题 

       nvidia-glx 套件中具有加速功能的 openGL 函式库是用非标准的方式编译出来的, 所以 prelink 会发出警告. 这没什么好担心的, 而且除了 nVIDIA 以外没有人能够进行修正. 如果你不需要 3D 加速的话, 你也可以随时换回 XFree 内建的 libGL.so. XFree 的 nvidia 驱动程式足以正常运作了.

当我对整个系统进行"预先连结"之后, 一些静态连结的执行档不会动了 

       就 glibc 而言是没有 100% 的静态连结执行档这回事的. 如果你是用 glibc 静态编译了一个执行档, 则这个执行档还是有可能会依存其它系统档案. 以下是 Dick Howell 的解释.

       "我想你的想法是认为所有相依函式库都会在下载下来的档案之中(译注: 下载下来的静态连结执行档), 所以它不用依赖任何本地端的函式库. 但是很可惜的, 对於 Linux, 甚至我想对於任何使用 glibc 的系统, 这样的想法并不正确. 有个叫做 "libnss" 的东西 (名称服务选择 name service switch, 也有人管它叫网路安全系统, network security system), 它提供了一些处理认证资料库, 网路资讯, 以及一些其它东西的函式. 它被设计来使应用程式可以直接适应於不同的网路环境. 这是个聪明的设计, 但是使用不同系统的 glibc 却可能对它的载入造成问题. 但它又根据不同的系统设定而有所不同, 所以你没办法对它作静态连结. 我想问题就是这样发生的, 程式静态连结了不同系统的 glibc 函式库, 主要是 "libpthread", "libm", "libc", 这些函式库对 "libnss" 呼叫了不相容的函式."

Prelink 发出 "prelink: dso.c:306: fdopen_dso: Assertion `j == k' failed." 并中止了 

       这是个已知的问题, 这里 有亲切的解说. Prelink 没办法处理用 UPX 压缩过的执行档. 直到了 prelink-20021213 都还没有修正, 你只能在进行"预先连结"时把这些压缩过的执行档藏起来. 你可以参考上方的 组态设定 章节 来简单地完成这件事.

我使用 grsecurity 而"预先连结"似乎无法运作 

       如果你要在一个使用 grsecurity 使 mmap() 基底位址乱数化(randomized mmap() base)的系统上使用"预先连结", 你必须把 /lib/ld-2.3.*.so 的 "randomized mmap() base" 设定关闭. 你可以用 chpax 公用程式来完成这个动作,但是这必须在该档没有在使用时才能进行. (比方说用救援光碟开机)

how to set and use vncserver

We may use vncserver through web browser.
 
only need step 1-2 at first startup
1. set password
vncpasswd
2. edit vnc  xstartup allows you to change the applications run at startup
vi  $HOME/.vnc/xstartup
#!/bin/sh
 
# Uncomment the following two lines for normal desktop:
# unset SESSION_MANAGER
# exec /etc/X11/xinit/xinitrc
 
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
#xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#twm &
#exex startkde
gnome-session &
3.start vnc server
vncserver
New redhat-linux:2 (iyacht)' desktop is redhat-linux: 2
 
Starting applications specified in /home/e12616/.vnc/xstartup
Log file is /home/e12616/.vnc/e2488c-lnx:2.log
 
port is 5800+2  used in IE. 

5. other use VNC view port is 5900+2.