Fedora安装Expect

费了很大力气才下到Expect的源代码,然后参考了Expect的INSTALL说明文件,还需要Tcl/Tk的源代码支持,于是又下载了Tcl/Tk的源代码,把它们都给放到/usr/local/src下面。先编译安装tcl和tk,完了之后进入expect的文件夹下面,./configure,结果报错,说找不到tclInt.h。于是在tcl的源文件的文件夹下面搜索tclInt.h,发现该文件确实存在,在generic下面。又参考了一下Expect的INSTALL说明文件,才知道可以加--withtclincluse=选项,于是重新configure:

 

./configure --withtclinclude=/usr/local/src/tcl8.6b1/generic

 

configure成功。于是输入make,正式编译,结果又发现了如下错误:

 

exp_main_exp.c:32: error: ‘Tcl_Interp’ has no member named ‘result’
exp_main_exp.c:33: warning: incompatible implicit declaration of built-in function ‘exit’
make: *** [exp_main_exp.o] Error 1

 

网上一搜,在http://groups.google.com/group/comp.lang.tcl/browse_thread/thread/e63b1bd2d350d024/8bbd5758f6193120?show_docid=8bbd5758f6193120&pli=1
发现有人遇到过同样的问题。在http://www.tcl.tk/cgi-bin/tct/tip/330.html
给出了原因,说是因为在新版(8.6)的tcl的tcl.h中Tcl_Interp被重命名为unused1了,而expect的源代码并没有做相应修改。并且给出了解决方案,就是添加预定义USE_INTERP_RESULT,或者用8.5以下的tcl源代码。

 

我没有再继续尝试编译安装expect。我想起来可以尝试通过yum安装,于是输入yum install expect,竟然成功了!不过在安装expect的同时,还自动安装了tcl8.5.3,估计这是因为安装的expect是基于tcl8.5的源代码变异的。

 

看来Expect开发者乏人啊,这么长时间这个bug竟然没有人修复,唉……

solaris下查看进程的cpu占用率

 

solaris下查看某进程的资源占用率及其它


1.     # ps -eo pid,pcpu,args | sort +1n 

该命令输出当前系统进程的pid, cpu占用率及命令描述,并以pcpu来排序(尝试过,没有成功,据说在RedHat上可行的。)

2. top -p <pid>


不同的系统top的设置不尽相同,因此使用时需要注意。

3. prstat -p <pid>


prstat 检查系统中进程占用CPU,内存等情况。可以代替top,不过好像solaris5.8之后才有,5.7上就没有。

4. 查看IO情况 iostat


iostat -x -I 1 若系统明显变慢,也可用此命令检查磁盘I/O情况


5. 查看CPU 可以用 psrinfo -v

查看详细信息

/usr/platform/sun4u/sbin/prtdiag -v

 6. sar

sar -u 3 20 若系统明显变慢,用此命令检查cpu占用率
sar –r 3 20 用此命令检查内存使用情况

Fedora11声卡不能外放

这些天一直苦恼于在Thinkpad R61上新装的Fedora声音无法外放,上网搜索了各种各样的方法,结果全都未果。

 

昨晚怀疑是Linux Kernel的问题,因为Kernel不是最新的,于是下载了最新的Kernel,编译了一晚上才装上。

 

今晚上再次对下载的ALSA源代码编译,由于是最新的Kernel,编译过程中遇到了一些问题,好在或者是缺少一些头文件(version.h,autoconf.h)或者是某个文件不存在。解决方法就是通过locate -e <source_file>找到系统中已经有的源文件,通过which找到可执行文件,然后在目标目录创建符号链接,编译通过。

 

装完ALSA重启之后,再次通过alsamixer -c 0对alsa驱动进行设置。结果这时发现一直按向右的方向键会一直有新的item出现,最后一个是speaker,这些是我之前使用alsamixer时所没有发现的,而这个speaker恰恰就是我一直苦恼的!那个speaker项默认是MM,mute也即静音的,必须按M键将其unmute.设好之后,声卡终于可以外放了!

 

尽管在网上找到的很多资料没有真正起作用,但还是将其中一些至今仍然有效的摘抄如下,以飨读者。

 

**********************************************************************************

原文链接:http://www.thinkwiki.org/wiki/Installing_Ubuntu_7.04_(Feisty_Fawn)_on_a_ThinkPad_T61#ALSA_driver_update_.28hard_fix.2C_recommended_for_advanced_users.29

 

ALSA driver update (hard fix, recommended for advanced users)

 

Note: This section assumes a high level of technical proficiency. Please fix it.

At www.asla-project.org, did you download only alsa-driver-1.0.14? That and alsa-lib-1.0.14a?

Download alsa-driver, alsa-kernel, alsa-lib, and alsa-utils, according to http://alsa.opensrc.org/index.php/AlsaCVS. Other sources, however, say only the driver is necessary. Perhaps alsa-project.org simply recommends the other two?

 

How did you compile it from source? How did you add the patch?

 

In short, please explain how you did these things in addition to just telling us what you did. I´m not trying to be rude but seriously, not all Linux users are programmers ;). Thanks. SteveSims 22:19, 11 August 2007 (UTC)

After upgrading to 1.0.14 I still had no sound, and this took about a week to solved (though it was so sadly obvious though). Just upgrading to alsa 1.0.14 will not be enough, there were a few patches released right after the release that fix the Thinkpad's. The reason I missed this was because it was the same day so the release of 1.0.14!

VERY SIMPLE METHOD OF MAKING SOUND WORK [http://forums.fedoraforum.org/showthread.php?t=159516&page=1&pp=15] Just follow the instructions step by step, except for two small things: When doing "cp ../patch_analog.c alsa-driver-1.0.14/alsa-kernel/pci/hda/" use "cp ../patch_analog.c alsa-kernel/pci/hda/" instead. Also, when you get to the part about modifying the /etc/modprobe.conf file, it doesn't exist in ubuntu. Adding "options snd-hda-intel index=0 model=thinkpad" to any file (even one you make yourself) inside /etc/modprobe.d should work. I personally added it to the options file, and it works fine.(这种情况在Fedora 11中也是如此,解决方法也应是在/etc/modprobe.d/下自己创建一个*.conf文件,或者添加到dist.conf中去。)

 

-credit for the guide goes to ciphermonk, and credit to the small changes needed to make this work on ubuntu go to my friend John.

-hotkeys control mic volume, not speaker volume for some reason. I do not know how to fix this -- If you're using Gnome, from the System menu, click Preferences -> Sound, and in the Default Mixer Tracks field, choose PCM.(在Fedora 11的Sound中没有这个选项。)

 

-this fix should provide sound for both headphones and speakers.

-this edit by fatalchaos

 

First make sure these packages are installed (System -> Administration -> Synaptic Package Manager) : automake, autoconfig, cvs, libtool, python-dev, build-essential

 

Then download the source code to the alsa-driver and apply these patches: (links to the revisions)

 

Fix Oops with AD1984 thinkpad model (http://hg.alsa-project.org/alsa-kernel/rev/958b39f3e8dd)

Fix AD1984 basic model (http://hg.alsa-project.org/alsa-kernel/rev/47ca87407c84)

Fix Thinkpad X61/T61 outputs (http://hg.alsa-project.org/alsa-kernel/rev/ca37aeeeb0ea)

**********************************************************************************************

查看安装了哪些alsa的模块: rpm -qa|grep alsa

查看声卡信息: lspci|grep Audio

另外就是常用的alsamixer和amixer。

***********************************************************************************************

还有就是其他的针对Fedora 10之前的版本的资料基本上都已经过时了,大多从fedora中移除了(比如alsaconf就已经不支持了)。貌似Fedora 11中只能用alsamixer来设置声卡,Preferences -> Sound的功能非常弱。

Linux内核编译


如何编译Linux内核? 相信你会得到很多种不同的答案,而我在写此文章之前,总是获得一些编译错误的结果。
如何你总是遇到编译错误或者失败,其实很多情况下是你下载的内核版本的问题,就是在高版本GCC中编译低版本的内核,造成编译失败。如果你对编译内核一悉莫展,在网上Google到很多种编译方法,但都失败的情话。倒不如看看内核的README文档,或者在内核目录下运行make help。它将会告诉许多你所不知的秘密。
1. Linux系统编译内核的通用方法
内核代码中的README文件对编译过程有非常 详细介绍,下而介绍的方法是Linux内核通用的编译方法,它是Makefile文件已定义好的编译过程。
  1) 下载源代码(以2.6.28为例)
  2) 解压,并把它放到/usr/src/目录下
   gzip -d linux-2.6.28.1.tar.gz
   tar -xvf linux-2.6.28.1.tar
  mv -rf linux-2.6.28.1 /usr/src
  3) 在/usr/src/建立一个软链接到linux-2.6.28.1目录 
  cd /usr/src
  ln -s linux-2.6.28.1 linux
 4) 清理源代码(如果是之前已生成一些中间文件可运行此命令,否则不必了)
   make mrproper
 5) 生成config文件
  cp /boot/config-`uname -r` ./.config
  make menuconfig
  在make menuconfig的配置界面中,先选择Load config file, 把该才拷贝的文件加载进来再进行修改,修改完成后,直接选Exit,然后在提示中选择保当前配置文件。
 6) 编译
 make
 7)  安装模块
  make modules_install
 该命令会把模块及相关文件放到目录/lib/modules/2.6.18.1/下,并不会与当前内核产生冲突,除非内核版本是一样的。
  8)安装内核
  make install
 该命令会把内核相关文件(bzImage, initrd.img,System.map .config)放到/boot/目录下,文件名均带有内核版本名,与其它版本相关区别。
 如果系统安装了LILO,它会自己把该内核的启动加进来。如果是grub程序,那要看情况而定。我在Fodera系统中,它会自动添加该启动项到/boot/grup/menu.lst文件中,而在Ubuntu中则不会,需要手动添加。添加完也,即可重启进行新内核。
2. Ubuntu内核编译方法。
      上面介如的通常方法适合于所有的Linux系统,Ubuntu也不例外。Ubuntu同样提供了编译内核的方法。而且方法非常简单,把上述第6)和7)步换成下面这一命令即可。
  make-kpkg --initrd --append-to-version <your_tag> kernel_image kernel_headers
  其中<your_tag>是你给内核名字在版本号的基础上加上你指定的字符串,如果你打算直接使用内核版本号作为内核名字,则把--append-to-version和它的参数从命令行中去掉。个人建议你不要使用该选项,因为内核名字就是uname -r的运行结果,使得有时编译新的模块程序时,uname -r 和 make kernelrelease结果不一致。
该命运行完毕后,生成两个deb包,其它一个是内核和模块的包;另一个是头文件的deb包。如果不需要,可在命令行上把kernel_header去掉。
安装内核变异常简单,只需安装一个生成的内核映象的deb包。使用如下命令:
dpkg - i  linux-image-2.6.28.1_2.6.28.1-10.00.Custom_i386.deb
安装完后,所有的事情也就完成了,连/boot/grub/menu.lst的启动菜单项都修改好了,你所要做的事情就是重启系统而已。
  使用这种方法的好处是不言而喻的:你只需要在一台Ubuntu上编译好一个较新的内核,就可以在整个实验室中升级,何乐而不为呢?
3. Fodera 内核编译方法
   很抱歉,目前还未有找到很准确的Fodera内核编译方法,后面会补上。但这里介绍的方法仍然适后Fodera系统,那就是象Ubuntu一样,把内核编译成为一个rpm包。而且非常简单,只需把上面的第6)和7)步换成下面的命令:
  make rpm-pkg
 运行完后,内核rpm包位于目录/usr/src/rpm/RPMS/i386/kernel-2.6.28.1.i386.rpm下,使用rpm -i kernel-2.6.28.1.i386.rpm命令即可安装。
 安装rpm完成后,请检查/boot/grup/menu.lst文件是否有新内核的启动,若否请手工添加。
内核删除:
有时我们基于各种原因可能删除一些老的内核,基本步骤如下:
1. 查看当前系统的内核版本,千万不要删除错了
      #uname -r  或者  uname -a
2. 对于通过rpm方式安装的内核,删除就很简单了。直接用rpm -e 相应的内核版本就能删除掉了。
   对于手工编译安装的内核,删除起来稍微就要麻烦些了。
    (1)、修改 /etc/grub/grub.conf 或 /etc/grub/menu.lst ,删除那些不想要的内核选项。
    (2)、删除 /lib/modules/相对应的内核版本的目录
    (3)、删除 /boot/相对应的内核版本的文件
对于Ubuntu系统:
$dpkg –get-selections|grep linux-image  //查看内核版本名称
$sudo apt-get remove 内核版本(如:linux-image-2.6.15-23-386)

 

 原文地址

 http://blog.csdn.net/linyt/archive/2009/03/16/3995435.aspx

http://www.loosky.net/?p=309

TCL判断条件

编写TCL代码时遇要写一个if判断条件,很简单的一个语句,结果却费了很大力气才搞定。要判断的是,如果执行info exists成功而且某全局数组C的某个成员大于0,正确的语句为:

 

if { [info exists C(AP${AP}cdnnoperap)] && $C(AP${AP}cdnnoperap > 0 } { }

 

我为了逻辑上的清晰,特地将语句写为:

 

if { [info exists C(AP${AP}cdnnoperap)] && {$C(AP${AP}cdnnoperap} > 0 } { }

 

结果报错。又改成

if { [info exists C(AP${AP}cdnnoperap)] && [$C(AP${AP}cdnnoperap] > 0 } { }

还是报错。又改为

if { [info exists C(AP${AP}cdnnoperap)] && {"$C(AP${AP}cdnnoperap" != "0"} } { }

仍然报错。

 

看来TCL的语法确实还是很有自己的特点的。往后要多加注意。

 

UNIX下大小为1byte的文件——都是换行符(EOL)惹得祸

某同事用tcl和ksh写了一个程序,利用进行某项操作,如有错误就将错误信息写入某个文件中,写入方法是 2>$stderr,然后判断该文件的大小,如果大于0,则认为有错误发生,报错。

 

奇怪的是该程序一直不能成功执行,一直报错。同事逐行追踪他的代码,结果发现文件$stderr刚创建时大小为0,可过一会之后自己就会变成1byte. 然而打开查看时,该文件内容却是空的。后来用vi按照16进制打开(:%!xxd),发现了0a。

 

0x0a是UNIX下默认的行结束符(EOL),每行都会有的。我们试验了一下,凡是用print在UNIX下创建一个文件:

print $test > test

 

其中$test为未定义的变量,则会生成一个大小为1byte的文件。打开文件,也能发现0a的存在。

 

可是如果是用C语言编写一个文件操作的函数,却能得到一个大小为0而打开后也有0a的文件。很是奇怪……

 

大数运算

下面这段程序包含了大数的加、减、乘运算的代码,除法运算尚在研究中。

 

/*
 * =====================================================================================
 *
 *       Filename:  LargeNumOp.c
 *
 *    Description:  The regular version of Large Number Multiplication.
 *
 *        Version:  1.0
 *        Created:  08/23/2009 07:02:48 PM
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  Bonn Yang 
 *        Company:  
 *
 * =====================================================================================
 */
#include <stdio.h>
#include <string.h>
/* 
 * Large number multiplication. 
 *	a*b=c
 * The product stores in c.
 */ 
void multiply(char* a,char* b,char* c)
{
    int i,j,ca,cb,* s;
    ca=strlen(a);
    cb=strlen(b);
    s=(int*)malloc(sizeof(int)*(ca+cb));
    for (i=0;i<ca+cb;i++)
        s[i]=0;
    for (i=0;i<ca;i++)
        for (j=0;j<cb;j++)
            s[i+j+1]+=(a[i]-'0')*(b[j]-'0');
    for (i=ca+cb-1;i>=0;i--)
        if (s[i]>=10)
        {
            s[i-1]+=s[i]/10;
            s[i]%=10;
        }
    i=0;
    while (s[i]==0)
        i++;
    for (j=0;i<ca+cb;i++,j++)
        c[j]=s[i]+'0';
    c[j]='/0';
    free(s);
}
/* Large number addition 
 * 		a+b=c
 */
void add(char* a, char* b, char* c)
{
	int i,j,ca,cb,rlen,* s;
    ca=strlen(a);
    cb=strlen(b);
	rlen=((ca>cb)?ca:cb)+1;		/* len of result */
    s=(int*)malloc(sizeof(int)*rlen);
    for (i=0;i<rlen;i++)
        s[i]=0;
	if(ca>cb)
	{
    	for(i=0;i<ca-cb;i++)
			s[i+1]=a[i]-'0';
		for(i=ca-cb;i<ca;i++)
			s[i+1]=(a[i]-'0')+(b[i-ca+cb]-'0');
	} 
	else 
	{
		for(i=0;i<cb-ca;i++)
			s[i+1]=b[i]-'0';
		for(i=cb-ca;i<cb;i++)
			s[i+1]=(a[i-cb+ca]-'0')+(b[i]-'0');
	} 
	
    for (i=rlen-1;i>=0;i--)
        if (s[i]>=10)
        {
            s[i-1]+=s[i]/10;
            s[i]%=10;
        }
    i=0;
    while (s[i]==0)
        i++;
	for (j=0;i<rlen;i++,j++)
        c[j]=s[i]+'0';
    c[j]='/0';
    free(s);
}
/* Large number substraction 
 * 		a-b=c
 */
void sub(char* a,char* b,char* c)
{
	int i,j,ca,cb,rlen,* s;
    ca=strlen(a);
    cb=strlen(b);
	rlen=((ca>cb)?ca:cb)+1;		/* len of result, the first byte is negative or positive sign */
    s=(int*)malloc(sizeof(int)*rlen);
    for (i=0;i<rlen;i++)
        s[i]=0;
	if(ca>cb)
	{
		s[0]='+';
    	for(i=ca-1;i>=ca-cb;i--)
		{
			if(a[i]>b[i-ca+cb])
			{
				s[i+1]=(a[i]-'0')-(b[i-ca+cb]-'0');
			}
			else if(a[i]<b[i-ca+cb])
			{
				s[i+1]=(a[i]-'0'+10)-(b[i-ca+cb]-'0');
				a[i-1]-=1;
			}
			else
				s[i+1]=0;
		}
		for(i=ca-cb-1;i>=1;i--)
		{
			if(a[i]>0)
			{
				s[i+1]=(a[i]-'0');
			}
			else if(a[i]<0)
			{
				s[i+1]=a[i]-'0'+10;
				a[i-1]-=1;
			}
			else
				s[i+1]=0;
		}
		s[1]=a[i]-'0';
	} 
	else if(ca<cb)
	{
		s[0]='-';
		for(i=cb-1;i>cb-ca-1;i--)
		{
			if(b[i]>a[i-cb+ca])
			{
				s[i+1]=(b[i]-'0')-(a[i-cb+ca]-'0');
			}
			else if(b[i]<a[i-ca+cb])
			{
				s[i+1]=(b[i]-'0'+10)-(a[i-cb+ca]-'0');
				b[i-1]-=1;
			}
			else
				s[i+1]=0;
		}
		for(i=cb-ca-1;i>=1;i--)
		{
			if(b[i]>0)
			{
				s[i+1]=(b[i]-'0');
			}
			else if(b[i]<0)
			{
				s[i+1]=b[i]-'0'+10;
				b[i-1]-=1;
			}
			else
				s[i+1]=0;
		}
		s[1]=b[i]-'0';
	} 
	else	/* ca==cb */
	{
		if(strcmp(a,b)>0)		/* a>b */
		{
			s[0]='+';
			for(i=ca-1;i>=1;i--)
			{
				if(a[i]>b[i])
				{
					s[i+1]=(a[i]-'0')-(b[i]-'0');
				}
				else if(a[i]<b[i])
				{
					s[i+1]=(a[i]-'0'+10)-(b[i]-'0');
					a[i-1]-=1;
				}
				else
					s[i+1]=0;
			}
			s[1]=(a[i]-'0')-(b[i]-'0');
		}
		else if(strcmp(a,b)<0)	/* a<b */
		{
			s[0]='-';
			for(i=ca-1;i>=1;--i)
			{
				if(b[i]>a[i])
				{
					s[i+1]=(b[i]-'0')-(a[i]-'0');
				}
				else if(b[i]<a[i])
				{
					s[i+1]=(b[i]-'0'+10)-(a[i]-'0');
					b[i-1]-=1;
				}
				else
					s[i+1]=0;
			}
			s[1]=(b[i]-'0')-(a[i]-'0');
		}
		else					/* a==b */
		{
			c[0]='+';
			c[1]='0';
			c[2]='/0';
			free(s);
		}
	}
	c[0]=s[0];
    i=1;j=1;
    while ((s[i]==0) && (i<rlen))
        i++;
	if(i!=rlen)	/* result is not zero */
	{
		for (j=1;i<rlen;i++,j++)
		{
			if(s[i]<0)
				c[j]='0'-s[i];
			else
        		c[j]=s[i]+'0';
		}
	} else {	/* result is zero */
		c[j++]='0';
	}
    c[j]='/0';
    free(s);
}
int main()
{
	char a[1024]={'/0'};
	char b[1024]={'/0'};
	char c[1024]={'/0'};
	printf("Enter two numbers:/n");
	gets(a);
	gets(b);
	multiply(a,b,c);
	printf("%s * %s = %s/n",a,b,c);
	add(a,b,c);
	printf("%s + %s = %s/n",a,b,c);
	sub(a,b,c);
	printf("%s - %s = %s/n",a,b,c);
	
	return 0;
}

 

Linux下安装aMule

今晚打算在Fedora 10下安装aMule,以便电驴下载。本打算yum安装,结果发现无法yum安装,于是只好下载了aMule的源代码(无Linux下的二进制安装文件)。解压之后,./configure,却出现了"wxWindows"的错误。

 

在网上搜了半天之后,发现除了系统已经装好的wxGTK之外,还要安装wxGTK-devel,于是我便yum install wxGTK-devel,成功。

 

重新在aMule的目录下./configure,这次却又报了更奇怪的错误:

 

"checking for crypto++ version >= 5.1... configure: error:
Could not find cryptopp header file "cryptlib.h".
Please check if the path "/usr" is valid."

 

在网上找到一个解决办法:

 

Download the latest crypto package from "http://www.cryptopp.com/#download
"
in this case package "Crypto++ 5.5.2". Now open your console terminal
and do the following commands to install the crypto package.

A) mkdir crypto
B) mv cryptopp552.zip ./crypto
C) cd crypto
D) unzip cryptopp552.zip
E) make
F) cp libcryptopp.a /usr/lib/
G) mkdir /usr/include/cryptopp
H) cp *.h /usr/include/cryptopp/
I) ldconfig

 

完成之后继续./configure,成功。(有一个关于uPnP的warning可以忽略。)然后make,成功,只是时间比较长。然后make install,成功!

 

aMule终于可以用了!

Fedora 10 MP3 Support


Fedora 10 MP3 Support

Fedora 10 does not come with built-in MP3 support. To get MP3 support with Fedora, you can use RPM Fusion's YUM repositories to download MP3 enabled RPMs.

 

Enable RPM Fusion

First, install RPM Fusion's free and nonfree YUM repositories. For detailed information about installing RPM Fusion, see: http://rpmfusion.org/Configuration

su -c "rpm -Uvh http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpm"

su -c "rpm -Uvh http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-stable.noarch.rpm"

 

Install GStreamer

Next, run this command to get the gstreamer plugins.

su -c "yum install gstreamer gstreamer-plugins-bad gstreamer-plugins-ugly"

 

Install Applications and Libraries

For Amarok with MP3 support, install these packages:

su -c "yum install amarok phonon-backend-gstreamer"

For MPlayer with MP3 support, install these RPMs:

su -c "yum install mplayer gnome-mplayer gnome-mplayer-common mencoder"

For XMMS with MP3 support, install the following:

su -c "yum install xmms xmms-mp3"

For xine with MP3 support, install these RPMs:

su -c "yum install xine xine-lib-extras-nonfree"

To create MP3s with LAME, install lame and lame-mp3x.

su -c "yum install lame lame-mp3x"

 

Alternatively, run this command to install everything:

su -c "yum install xmms xine mplayer amarok xmms-mp3 gstreamer phonon-backend-gstreamer gstreamer-plugins-bad gstreamer-plugins-ugly xine-lib-extras-nonfree mplayer gnome-mplayer-common mencoder gnome-mplayer lame lame-mp3x"

 

[http://hacktux.com/fedora/mp3]

 

PS: To install VLC media player:

su -c "yum install vlc"

 

车·行·记

 

车·行·记

 

傍晚时分,深感闷在酒店一个白天实在没有前途,终于无法按奈心中那股出去兜风的冲动。打电话叫同事,他说他在洗澡,我说我可以等你洗完澡,他说你不用等我洗完澡,因为我没兴趣出去。崇拜,五体投地的崇拜那哥们,多少次我们拉他出去逛一圈,人家都是拒绝,人家宁愿选择天天蜗居在20平米的酒店一隅,也不愿出门半步,而且还是坐车出行……
想起最近网上流行的那句“执子之手……”,此时此刻我义无反顾的选择了“子不走我走”。
太阳已经落下,但天光还算明亮。沿着前往Chicago Premium Outlets的路信马由缰——这条路非常顺,一路不用拐弯,直着开30分钟左右就到了。
道路两旁要么是荒郊野地,要么是灌木丛林,相当的原生态。路很宽,而且没车,我一个多月前此一次上路就是跑的这条路。从那以后到现在已经来来回回跑了不下10趟。盛夏时节的Naperville每天云卷云舒,傍晚时分更是争奇斗艳之时。车行至半路,天已经慢慢黑下来了。前方是一个高坡,由于光线黯淡,远远望去,此路直达云天。
日落后的云,峥嵘如巨石,嶙峋如山峦,狰狞如怪兽,凶险如深渊。黑夜正在向大地无情的压过来。现在的我竟然还和小时候一样,身临此境时,心底里总会有些恐惧。——人是群体动物,人多时觉得咱们工人有力量,当然天不怕地不怕,所以在北京不会有这种感觉;但是在人烟稀少的美国,孤身一人置身荒野,对于自然,不得不心生敬畏之情。人其实是很渺小的。渺沧海之一粟,羡长江之无穷啊。
平日里走这条路都是白天,阳光灿烂;现在是晚上,别有一番滋味。一时想到也许这是我最后一次在这条路开车,经由一些伤感。于是打定主意,要好好的总结一下在美国开车出行的经历。
刚到美国的第一个周末就和两个同事去了UIUC(University of Illinois @ Urbana-Champaign)。从Naperville到Champaign只有100多个mile,而且那次出行的主要目的是练车,熟悉美国高速路况,为下个周末的纽约之行做准备。当时我还不会开车,也不能开车,自己坐在后排可以尽情的拍一些照片(也是因为当时新鲜劲还没过)。那次对于美国高速最大的感觉就是“热闹”——车多、人多。各种各样叫出名字叫不出名字的车,拖着各种各样的装备,包括房车、游艇、自行车等等。我们都在感叹,美国人太会享受生活了。
第二个周末是美国的memorial day,放一天假,加上周末总共3天。还是和那两个同事,他(她)们开车,我副驾,去了纽约。尽管路程长达850多mile,再加上中途吃饭、加油的距离得近900个mile,但是路其实很顺,大多路段很好走。就是同一条高速路,一直开到纽约,只是在不同的州叫不同的名字而已。沿途经过了好几个州,从Illinois出发,首先进入Indiana,然后横穿Ohio,然后进入Pennsylvania, 最后穿越一小段New Jersey之后就到了纽约。我们总结了一些有意思的发现:(1) Pennsylvania的环境最好(高速路两边全是国家森林公园),而且高速基本不收费;Indiana的路况最好,车速最高,收费也比较高;Ohio路况最不好,收费也不便宜。(2) 在Illinois,高速两边的休息区域叫Oasis,其他几个州叫Service Plaza或者Service Area;后来又发现Illinois的高速两边的Oasis是联通的,一条全封闭的天桥横跨高速,而其他经过的几个州没有这种情况。(3) Ohio的Service Area里面的食物最贵,而且最难吃,就连麦当劳的店员的衣服都脏兮兮的,而且目光呆滞;Pennsylvania的设施最好,因为这个州很有钱。(4) 高速两边经常见到被撞死的鹿或其他小动物(粗略算一下来回路上见到的死鹿不下100头)。去得路上大姐(十几年工作经验,近十年开车经验的同事)开车的时候,轧死了一只小兔子,她愧疚了一路。被撞死的鹿很肥,很嫩,可惜没法扛回来。据说在美国法律规定,在路上见了野生动物尽量避让,否则是犯罪;但如果实在让不开把它撞死了,你可以把撞死的动物带回家(宰了吃)。
去纽约还有一件不得不提的事情就是警察。一路上看见了太多的警察。很多地方高速两个方向之间是一片灌木丛,灌木丛中间经常会有空地或者小路,警察们就藏在那里面。去得路上一开始司机们开车很Happy,车少路宽,一直超速行驶,后来我发现了一次警察,大家就小心一点了。后来发现所有的车都在超速,而且一般超10~20 mile,警察并不管,我们也就放心大胆的超了。但是发现警察之后还是会减减速的,不能不给人家面子。回来的路上,刚进Pennsylvania,大姐开车,限速65mile/h,她平均开到了85以上,偶尔高达95——一辆现代sonata,开到95mile也就是152.88768公里每小时!很疯狂啊~ 后来换了另外一哥们开车,快出Pennsylvania了,他也开的很快,平均80以上。突然我们发现隔离带里面一辆警车,可是再刹车已经来不及了。不出所料,那辆警车立刻打开警灯在我们后面跟了上来。那哥们知道自己麻烦来了,慢慢地把车停到路边,拿出驾照,双手放到方向盘上。我也摇下车窗,把双手放在警察能看见的位置。过了很久,警车门开了,下来一位女警察,走到我的车窗边,问谁开的车,知不知道刚才已经开到83mile/h了,把驾照拿出来。那哥们乖乖把驾照给了女警察,警察一看,看不懂。那哥们解释,他只有中国驾照,美国出差一段时间,现在是纽约回Chicago。女警察一听就笑了,问我们是住在北京吗。我们说是,她说去年北京的奥运会很好,我也赶紧吹嘘奥运会。女警察话锋一转,说technically讲,没有美国驾照是不能开车的,对于你们这种情况还是小心为妙。我们连说yes, thank you. 很幸运,我们没有被开ticket;如果开了的话,一个罚单就得几百刀,一个月的补助就没了一半。从这以后,那哥们在高速上就不敢很嚣张了。而我从那时起就养成一个习惯,时刻寻找警车,一旦发现警察的存在,立马规规矩矩的开车。其实美国人也是这么做的。

后来那两位同事还去了拉斯维加斯,坐飞机过去的,我没有去,没钱。听说他(她)们在拉斯维加斯租了一辆车,当天开车去科罗拉多大峡谷(几百个mile),晚上之前回拉斯维加斯;第二天又是如此。我不得不佩服他(她)们的疯狂。他们从拉斯维加斯回来的时候,在机场租了一辆车,就是我现在开的雪佛莱IMPALA。机场租车非常贵,因为机场的租车行是要叫保护费的,官方称呼叫特许经营费(Chartered Fee)。我们开了一周,然后在local给还了,然后续租这辆车,便宜了100多$。后来听很多中国同事说,其实在机场租了第二天就可以在local还,而不必真的租一周,能省更多钱。不得不佩服中国人的小聪明。
6月11号我考过了笔试,拿到了permit,然后就开始学车。那两位有驾照的同事教,幸亏同一个team的同事有两位资深司机。我考了三次才终于在6月31号把驾照拿到。
从6月下旬开始,因为那两个同事7月6号要走了,所以她们就开始了疯狂采购。我们也跟着一起采购。开车去Wisconsin的outlets,去Michigan的outlets。到那之后才知道为什么这两个地方东西会比较便宜,穷!这两个地方很穷,消费水平不高,而且税比较低,所以大多中国同事都建议我们去那里买东西。对于一些化妆品,只能去Oak Brook Shopping Mall去买。中产阶层很少去Outlets购物,那是穷人去的地方。而我们这些人,连人家的穷人都比不上……
这周末就打道回府了。还能再开5天车,还打算去一趟Oak Brook,同事要买东西。还打算去一趟费米实验室,今晚上才听说大名鼎鼎的Fermilab就在附近,查了一下地图竟然就在去Chicago Premium Outlets的那条路的旁边。不一定能进的去,在外边拍几张照片也行啊。