Sunday, November 23, 2008

find使用技巧

find技巧

>>>>>>>>>>下面是一些例子:

#在$HOME 或 当前目录 中查.txt文件并显示
$find ~ -name "*.txt" -print
$find . -name "*.txt" -print
#对匹配的文件使用cpio命令,将他们备份到磁带设备中-prune
$find . -name "[A-Z]*" -prune
#查以大写字母开头的文件
$find . -name "[A-Z]*" -print 
#查以host开头的文件
$find /etc -name "host*" -print
#查以两个小写字母和两个数字开头的txt文件
$find . -name "[a-z][a-z][0--9][0--9].txt"    -print
#属性查找
$find . -perm 755 -print
$find . -perm -007 -exec ls -l {} ;
#查所有用户都可读写执行的文件同-perm 777
打印目录结构
$find . -type d -print 
打印非目录文件
$find .  ! -type d -print 
#因grep无法递归搜索子目录,故可以和find相结合使用。 在/usr/include 所有子目录中的.h文件中找字串AF_INEF6
find /usr/include -name '*.h' -exec   grep AF_INEF6 {} ;
# 查找在系统中最后10分钟访问的文件
find / -amin -10 
# 查找在系统中最后48小时访问的文件
find / -atime -2 
# 查找在系统中为空的文件或者文件夹
find / -empty 
# 查找在系统中属于 groupcat的文件
find / -group cat 
# 查找在系统中最后5分钟里修改过的文件 
find / -mmin -5 
#查找在系统中最后24小时里修改过的文件
find / -mtime -1 
#查找在系统中属于作废用户的文件
find / -nouser 
#查找在系统中属于FRED这个用户的文件
find / -user fred
>>>>>>>>>>>>下面是一些 "概括性" 说明

前言:关于find命令

由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下。即使系统中含有网络文件系统( NFS),find命令在该文件系统中同样有效,只你具有相应的权限。

在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系统可能会花费很长的时间(这里是指30G字节以上的文件系统)。


一、find 命令格式


1、find命令的一般形式为;

find pathname -options [-print -exec -ok ...]


2、find命令的参数;

pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
-print: find命令将匹配的文件输出到标准输出。
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } \;,注意{ }和\;之间的空格。
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。


3、find命令选项

-name

按照文件名查找文件。

-perm
按照文件权限来查找文件。

-prune
使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。

-user
按照文件属主来查找文件。

-group
按照文件所属的组来查找文件。

-mtime -n +n
按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime 选项,但它们都和-m time选项。

-nogroup
查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。

-nouser
查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
-newer file1 ! file2

查找更改时间比文件file1新但比文件file2旧的文件。
-type

查找某一类型的文件,诸如:

b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。

-size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
-depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-fstype:查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。

-mount:在查找文件时不跨越文件系统mount点。
-follow:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。
-cpio:对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。

另外,下面三个的区别:

-amin n
  查找系统中最后N分钟访问的文件

  -atime n
  查找系统中最后n*24小时访问的文件

  -cmin n
  查找系统中最后N分钟被改变文件状态的文件

  -ctime n
  查找系统中最后n*24小时被改变文件状态的文件

 -mmin n
  查找系统中最后N分钟被改变文件数据的文件

  -mtime n
  查找系统中最后n*24小时被改变文件数据的文件


4、使用exec或ok来执行shell命令

使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的

在有些操作系统中只允许-exec选项执行诸如l s或ls -l这样的命令。大多数用户使用这一选项是为了查找旧文件并删除它们。建议在真正执行rm命令删除文件之前,最好先用ls命令看一下,确认它们是所要删除的文件。

exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。为了使用exec选项,必须要同时使用print选项。如果验证一下find命令,会发现该命令只输出从当前路径起的相对路径及文件名。

例如:为了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在find命令的-exec选项中

# find . -type f -exec ls -l { } \;
-rw-r--r-- 1 root root 34928 2003-02-25 ./conf/httpd.conf
-rw-r--r-- 1 root root 12959 2003-02-25 ./conf/magic
-rw-r--r-- 1 root root 180 2003-02-25 ./conf.d/README

上面的例子中,find命令匹配到了当前目录下的所有普通文件,并在-exec选项中使用ls -l命令将它们列出。
在/logs目录中查找更改时间在5日以前的文件并删除它们:

$ find logs -type f -mtime +5 -exec rm { } \;

记住:在shell中用任何方式删除文件之前,应当先查看相应的文件,一定要小心!当使用诸如mv或rm命令时,可以使用-exec选项的安全模式。它将在对每个匹配到的文件进行操作之前提示你。

在下面的例子中, find命令在当前目录中查找所有文件名以.LOG结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示。

$ find . -name "*.conf" -mtime +5 -ok rm { } \;
<> ? n

按y键删除文件,按n键不删除。

任何形式的命令都可以在-exec选项中使用。

在下面的例子中我们使用grep命令。find命令首先匹配所有文件名为“ passwd*”的文件,例如passwd、passwd.old、passwd.bak,然后执行grep命令看看在这些文件中是否存在一个sam用户。

# find /etc -name "passwd*" -exec grep "sam" { } \;
sam:x:501:501::/usr/sam:/bin/bash

二、find命令的例子;


1、查找当前用户主目录下的所有文件:

下面两种方法都可以使用

$ find $HOME -print
$ find ~ -print


2、让当前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件;
$ find . -type f -perm 644 -exec ls -l { } \;


3、为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径;

$ find / -type f -size 0 -exec ls -l { } \;


4、查找/var/logs目录中更改时间在7日以前的普通文件,并在删除之前询问它们;

$ find /var/logs -type f -mtime +7 -ok rm { } \;


5、为了查找系统中所有属于root组的文件;

$find . -group root -exec ls -l { } \;
-rw-r--r-- 1 root root 595 10月 31 01:09 ./fie1


6、find命令将删除当目录中访问时间在7日以来、含有数字后缀的admin.log文件。

该命令只检查三位数字,所以相应文件的后缀不要超过999。先建几个admin.log*的文件 ,才能使用下面这个命令

$ find . -name "admin.log[0-9][0-9][0-9]" -atime -7 -ok
rm { } \;
<> ? n
<> ? n
<> ? n
<> ? n


7、为了查找当前文件系统中的所有目录并排序;

$ find . -type d | sort


8、为了查找系统中所有的rmt磁带设备;

$ find /dev/rmt -print


三、xargs

xargs - build and execute command lines from standard input

在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现 溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。

find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;

而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

来看看xargs命令是如何同find命令一起使用的,并给出一些例子。

下面的例子查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件

#find . -type f -print | xargs file
./.kde/Autostart/Autorun.desktop: UTF-8 Unicode English text
./.kde/Autostart/.directory: ISO-8859 text\
......

在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中:

$ find / -name "core" -print | xargs echo "" >/tmp/core.log

上面这个执行太慢,我改成在当前目录下查找

#find . -name "file*" -print | xargs echo "" > /temp/core.log
# cat /temp/core.log
./file6

在当前目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限:

# ls -l
drwxrwxrwx 2 sam adm 4096 10月 30 20:14 file6
-rwxrwxrwx 2 sam adm 0 10月 31 01:01 http3.conf
-rwxrwxrwx 2 sam adm 0 10月 31 01:01 httpd.conf

# find . -perm -7 -print | xargs chmod o-w
# ls -l
drwxrwxr-x 2 sam adm 4096 10月 30 20:14 file6
-rwxrwxr-x 2 sam adm 0 10月 31 01:01 http3.conf
-rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf

用grep命令在所有的普通文件中搜索hostname这个词:

# find . -type f -print | xargs grep "hostname"
./httpd1.conf:# different IP addresses or hostnames and have them handled by the
./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames
on your

用grep命令在当前目录下的所有普通文件中搜索hostnames这个词:

# find . -name \* -type f -print | xargs grep "hostnames"
./httpd1.conf:# different IP addresses or hostnames and have them handled by the
./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames
on your

注意,在上面的例子中, \用来取消find命令中的*在shell中的特殊含义。

find命令配合使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。


四、find 命令的参数

下面是find一些常用参数的例子,有用到的时候查查就行了,像上面前几个贴子,都用到了其中的的一些参数,也可以用man或查看论坛里其它贴子有find的命令手册


1、使用name选项

文件名选项是find命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用。

可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来。

不管当前路径是什么,如果想要在自己的根目录$HOME中查找文件名符合*.txt的文件,使用~作为 'pathname'参数,波浪号~代表了你的$HOME目录。

$ find ~ -name "*.txt" -print

想要在当前目录及子目录中查找所有的‘ *.txt’文件,可以用:

$ find . -name "*.txt" -print

想要的当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用:

$ find . -name "[A-Z]*" -print

想要在/etc目录中查找文件名以host开头的文件,可以用:

$ find /etc -name "host*" -print

想要查找$HOME目录中的文件,可以用:

$ find ~ -name "*" -print 或find . -print

要想让系统高负荷运行,就从根目录开始查找所有的文件。

$ find / -name "*" -print

如果想在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是.txt的文件,下面的命令就能够返回名为ax37.txt的文件:

$find . -name "[a-z][a-z][0--9][0--9].txt" -print


2、用perm选项

按照文件权限模式用-perm选项,按文件权限模式来查找文件的话。最好使用八进制的权限表示法。

如在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件,可以用:

$ find . -perm 755 -print

还有一种表达方法:在八进制数字前面要加一个横杠-,表示都匹配,如-007就相当于777,-006相当于666

# ls -l
-rwxrwxr-x 2 sam adm 0 10月 31 01:01 http3.conf
-rw-rw-rw- 1 sam adm 34890 10月 31 00:57 httpd1.conf
-rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf
drw-rw-rw- 2 gem group 4096 10月 26 19:48 sam
-rw-rw-rw- 1 root root 2792 10月 31 20:19 temp

# find . -perm 006
# find . -perm -006
./sam
./httpd1.conf
./temp

-perm mode:文件许可正好符合mode

-perm +mode:文件许可部分符合mode

-perm -mode: 文件许可完全符合mode


3、忽略某个目录

如果在查找文件时希望忽略某个目录,因为你知道那个目录中没有你所要查找的文件,那么可以使用-prune选项来指出需要忽略的目录。在使用-prune选项时要当心,因为如果你同时使用了-depth选项,那么-prune选项就会被find命令忽略。

如果希望在/apps目录下查找文件,但不希望在/apps/bin目录下查找,可以用:

$ find /apps -path "/apps/bin" -prune -o -print


4、使用find查找文件的时候怎么避开某个文件目录

比如要在/usr/sam目录下查找不在dir1子目录之内的所有文件

find /usr/sam -path "/usr/sam/dir1" -prune -o -print
find [-path ..] [expression] 在路径列表的后面的是表达式

-path "/usr/sam" -prune -o -print 是 -path "/usr/sam" -a -prune -o
-print 的简写表达式按顺序求值, -a 和 -o 都是短路求值,与 shell 的 && 和 || 类似如果 -path "/usr/sam" 为真,则求值 -prune , -prune 返回真,与逻辑表达式为真;否则不求值 -prune,与逻辑表达式为假。如果 -path "/usr/sam" -a -prune 为假,则求值 -print ,-print返回真,或逻辑表达式为真;否则不求值 -print,或逻辑表达式为真。

这个表达式组合特例可以用伪码写为

if -path "/usr/sam" then
-prune
else
-print

避开多个文件夹

find /usr/sam \( -path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -print

圆括号表示表达式的结合。

\ 表示引用,即指示 shell 不对后面的字符作特殊解释,而留给 find 命令去解释其意义。

查找某一确定文件,-name等选项加在-o 之后

#find /usr/sam \(-path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -name "temp" -print


5、使用user和nouser选项

按文件属主查找文件,如在$HOME目录中查找文件属主为sam的文件,可以用:

$ find ~ -user sam -print

在/etc目录下查找文件属主为uucp的文件:

$ find /etc -user uucp -print

为了查找属主帐户已经被删除的文件,可以使用-nouser选项。这样就能够找到那些属主在/etc/passwd文件中没有有效帐户的文件。在使用-nouser选项时,不必给出用户名; find命令能够为你完成相应的工作。

例如,希望在/home目录下查找所有的这类文件,可以用:

$ find /home -nouser -print


6、使用group和nogroup选项

就像user和nouser选项一样,针对文件所属于的用户组, find命令也具有同样的选项,为了在/apps目录下查找属于gem用户组的文件,可以用:

$ find /apps -group gem -print

要查找没有有效所属用户组的所有文件,可以使用nogroup选项。下面的find命令从文件系统的根目录处查找这样的文件

$ find / -nogroup-print


7、按照更改时间或访问时间等查找文件

如果希望按照更改时间来查找文件,可以使用mtime,atime或ctime选项。如果系统突然没有可用空间了,很有可能某一个文件的长度在此期间增长迅速,这时就可以用mtime选项来查找这样的文件。

用减号-来限定更改时间在距今n日以内的文件,而用加号+来限定更改时间在距今n日以前的文件。

希望在系统根目录下查找更改时间在5日以内的文件,可以用:

$ find / -mtime -5 -print

为了在/var/adm目录下查找更改时间在3日以前的文件,可以用:

$ find /var/adm -mtime +3 -print


8、查找比某个文件新或旧的文件

如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件,可以使用-newer选项。它的一般形式为:

newest_file_name ! oldest_file_name

其中,!是逻辑非符号。

查找更改时间比文件sam新但比文件temp旧的文件:

例:有两个文件

-rw-r--r-- 1 sam adm 0 10月 31 01:07 fiel
-rw-rw-rw- 1 sam adm 34890 10月 31 00:57 httpd1.conf
-rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf
drw-rw-rw- 2 gem group 4096 10月 26 19:48 sam
-rw-rw-rw- 1 root root 2792 10月 31 20:19 temp

# find -newer httpd1.conf ! -newer temp -ls
1077669 0 -rwxrwxr-x 2 sam adm 0 10月 31 01:01 ./httpd.conf
1077671 4 -rw-rw-rw- 1 root root 2792 10月 31 20:19 ./temp
1077673 0 -rw-r--r-- 1 sam adm 0 10月 31 01:07 ./fiel

查找更改时间在比temp文件新的文件:

$ find . -newer temp -print


9、使用type选项

在/etc目录下查找所有的目录,可以用:

$ find /etc -type d -print

在当前目录下查找除目录以外的所有类型的文件,可以用:

$ find . ! -type d -print

在/etc目录下查找所有的符号链接文件,可以用

$ find /etc -type l -print


10、使用size选项

可以按照文件长度来查找文件,这里所指的文件长度既可以用块(block)来计量,也可以用字节来计量。以字节计量文件长度的表达形式为N c;以块计量文件长度只用数字表示即可。

在按照文件长度查找文件时,一般使用这种以字节表示的文件长度,在查看文件系统的大小,因为这时使用块来计量更容易转换。
在当前目录下查找文件长度大于1 M字节的文件:

$ find . -size +1000000c -print

在/home/apache目录下查找文件长度恰好为100字节的文件:

$ find /home/apache -size 100c -print

在当前目录下查找长度超过10块的文件(一块等于512字节):

$ find . -size +10 -print


11、使用depth选项

在使用find命令时,可能希望先匹配所有的文件,再在子目录中查找。使用depth选项就可以使find命令这样做。这样做的一个原因就是,当在使用find命令向磁带上备份文件系统时,希望首先备份所有的文件,其次再备份子目录中的文件。

在下面的例子中, find命令从文件系统的根目录开始,查找一个名为CON.FILE的文件。

它将首先匹配所有的文件然后再进入子目录中查找。

$ find / -name "CON.FILE" -depth -print


12、使用mount选项

在当前的文件系统中查找文件(不进入其他文件系统),可以使用find命令的mount选项。

从当前目录开始查找位于本文件系统中文件名以XC结尾的文件:

$ find . -name "*.XC" -mount -print


>>>>>>>>>>>>>>>>>

find 命令在linux中是很常用到的一个查找命令,它的功能非常地强大。可以结合正则匹配来搜索系统中的指定的内容,以下我就记录一下这个find常用到的一些用法
  
  首先我们来看看find的总体用法
  find path option [-print -exec -ok]
  其中path是指定在哪个路径中查找内容。如/var下查找内容,option是find中的一些属性值,常用的有-name,-type,-mtime,-ctime,-atime,-user,-group,-nouser,-nogroup,-perm 等,[-print -exec -ok]是可选属性值,-print是指把查找到的内容输出到指定的地方,-exec与-ok都是执行另处的command命令,但两都也有一点不 同,-exec在执行指定的command时不会给用户显示提示或操作信息,但是-ok就会在有提示询问操作时给用户显示信息,直到用户做了选择时才继续 执行。
  
  常用的option值说明
  -name 指定查找的内容是文件。
  -type 指定查找的文件的类型,它有d,l,b,p,f,c等文件类型,d是查找目录,l是查找链接档,b是查找块文件,p是查找管道文件,f是普通文件,c是字符设备文件
  -mtime,-ctime,atime都是指按时间查找,-mtime是文件的修改时间,-ctime是文件的创建时间,atime是后找开文件时间
  -user是查找指定用户帐号的文件
  -group是查找指定组帐号的文件
  -nouser查找无用户帐号文件
  -nogroup是查找无组帐号文件
  
  下面举几个例子说明一下find的用法
  (1)我想找出/etc目录下是passw开头的所有文件
   find /etc -name "passw*"
  这个例子中"*"号是正则匹配中的“所有”的意思
  (2)我想找出/var/log目录下所有的前5天的.log文件
   find /var/log -name "*.log" -mtime +5
  这个例子中"+5"是指5天以前的文件,如是查"-5"则是5天以内的文件
  (3)我想找出/home目录下是"ygl"这个用户的文件
   find /home -user "ygl"
  (4)我想找出/home目录下是"ygl"这个用户的所有的普通档的文件
   find /home -user "ygl" -type f
  (5)我想找出/var/log目录下的所有的.log文件并查看它的详细信息
   find /var/log -name "*.log" -type f -exec ls -l {} \;
  这个例子中用到了可选属性-exec用来执行ls命令,其中的-exec或者-ok的用法都要在它所执行的command后面接" {} \;"
  (6)我想查找出在/etc中以passw开头的所有文件中有没有ygl这些内容的
   find /etc -name "passw*" -exec grep -in "ygl" {} \;  

查找名字为conf的目录

  #find /目录 -type d -name conf

  注意type可能为b,c,d,l等……

  查找文件权限为755的文件

  #find /目录 -perm 755 -print

  如果用八进制,则可以用

  #find /目录 -perm -007 -print (跟chmod里的表示方法相同)

  查找文件属主为kt的文件

  #find /目录 -user kt -print

  查找group为kt的文件

  #find /目录 -group kt -print

  查找名字为file的文件

  #find /目录 -name file

  查找大小为0的文件

  #find /目录 -size 0

  忽略某个目录:

  #find /目录 -name "/目录名" -prune -o -print

  查找属主帐户已经被删除的文件:

  #find /目录 -nouser -print

  按更改时间查找文件

  #find /目录 -mtime -5 -print 单位是5,查找更改时间在5日以内的文件

  查找更改时间在3日以内的文件

  #find /目录 -mtime +3 -print

  查找更改时间比file1新但比file2旧的文件

  #find /目录 file1 ! -newer file2 -exec ls -l {} \;

  不仅查询根目录,而且查询子目录

  #find /目录 -name file -depth -print

  只在当前文件系统内部查询,而不进入其他文件系统

  #find /目录 -name file -mount -print

  用exec对查找出的文件进行操作

  #find /目录 -type f -exec ls -l {} \; //-exec ls -l {} \;则表示执行“ls -l”的操作。

  用exec安全模式,在删除前有提示

  #find /目录 -name "*.log" -mtime +5 -ok rm {} \; //这样在删除文件前会先提示

  根据inode号来取得硬链接

  #find /目录 -inum inode号

  对find找出的文件执行操作可以使用-exec 执行指令 {} \;也可以使用 | xargs 指令。


  由上面几个例子中可以看出find命令的强大。在实际的使用过程中,你将会发现find将会给你带来太多的方便

看一位华裔美国大兵的血腥日记

看一位华裔美国大兵的血腥日记
新浪博客 2008-11-23 00:31:13

这些武装分子可能不知道,在这些CNN战地记者都心惊肉跳的地区,上级授权给我们的开枪权限是:如果你认为应该开火,就开火如果你有一丁点儿怀疑,开火 如果有人一边打手机一边用手指着你,开火如果有人在放鸽子,开火如果有人在挖坑,开火按照我的理解就是:如果你觉得不爽,你就可以开火!

为了学费,我加入了美军

到纽约一个月了,一切都好——除了没有挣钱。天天在家做饭看书也还是有点令人沮丧,尤其在这个物欲横流的都市,似乎随时都在刷卡,随处都是消费,对于一个没有工作的人来说,就像没有胸部一样无法挺好地做人。于是,我仔细端详了一下天天都可以看到的地铁里的广告,那两幅征兵的尤其醒目——“Wedon’t accept applications,only commitments.USMarine我们需要你舍身报国 。”两个酷酷的士兵用坚毅而挑逗的眼光看着你——跟电影里的一样,充满阳刚的诱惑。

早就听说美军的待遇不错,工资不低还有很多津贴,还可以帮你付学费。想想自己MBA三四万的学费还没着落,干脆去当兵看看让美国政府帮忙付学费如何﹖于是,登录到millitary.com去看,不管三七二十一一顿填表,申请了海军陆战队marine 、陆军Army 和陆军预备役ArmyReserve ,很快收到了一堆介绍参军手续和好处的资料。

走进美军的征兵办,一屋子的军官全拿我当亲人,小心伺候着,生怕我反悔,还送我好多陆军小礼物,一个美女军官,每天车接车送的。真有点受宠若惊的感觉。一不留神,我加入了敌军。

如果你觉得不爽,你就可以开火

来到这个巴格达的美军基地,我们就4人一组地睡在由旧集装箱改装的铁盒子里,四周是一望无际的大沙漠,除了黄沙,还是黄沙。没有建筑、没有树木、没有道路、没有水、没有人家,像是到了月球表面,连个地名都没有。

今天我们被分配到一个新区域执行任务,听说那里是武装分子盘踞点,几乎每一条路上都埋有炸弹,狙击手们躲藏在各种废弃的房子里,火箭筒不时从某个角落里飞出来……我的任务是开斯特瑞克装甲车,以及等战友们下车去清剿后,坚守装甲车。但这几天,由于一位士兵休假,我被分到了步兵战斗组。我们要巡逻在主干道上,准备射击任何我们认为应该射击的目标。走不远,我们发现了一幢房子,等爆破专家仔细检查了整个建筑,确保里面没有炸弹以后。我们正式地占据了建筑,设置了临时警戒。

下午4点左右,突然枪声大响,我三两步直冲楼顶,楼顶上已经开始交火了,“肉棒”作者一位战友的绰号,编者注 也紧接着冲了上来。在街对面的斜对角的一幢建筑里,时不时可以看见闪光,那是武装分子在向我们开火,还有零星的狙击手在我们正前方的建筑群里开枪。我很小心地尽量不把头暴露出来,一阵连续的刺耳的响声,原来是在我正上方,美军的两架“阿帕奇”武装直升机在进行对地压制,一阵机炮声之后,正前方的敌方狙击手立马哑巴了。

可惜敌人都在建筑的里面,并没有被直接打击,过了没多久他们又开始还击,领队的少尉突然叫大家低头,斯特瑞克装甲车已经就位,准备送武装分子一枚大爆竹。只听两声巨响后,武装分子再也没有了气息。这些武装分子可能不知道,在这些CNN战地记者都心惊肉跳的地区,上级授权给我们的开枪权限是:如果你认为应该开火,就开火如果你有一丁点儿怀疑,开火如果有人一边打手机一边用手指着你,开火如果有人在放鸽子,开火如果有人在挖坑,开火按照我的理解就是:如果你觉得不爽,你就可以开火。

收拾完这帮人之后,我们把爆破专家和战地摄像人员送回他们的基地,我们也就回基地休息了。第二天,我们收到消息说,昨天在被我们轰击的建筑里找到可辨认尸体10多具,另有一些尸体已成蜂窝。这可算是排级的集体功了,估计过一段时间会有勋章颁发下来。

那个叫“好运”的战友

进入冬季了,沙漠的气候变得更加干燥,装甲车也停开冷气转为开暖气了。在巡逻的时候,我通常一连八九个小时猫在车内,开始流鼻血了。今天是我在这个曾经治安很差的地区最后一次巡逻了,我和往常一样还是在装甲车里打瞌睡,等着步兵队回来,我听见车顶上的“好运”一直在和机枪手谈论关于结婚、孩子、额外津贴的事情。

“好运”在德国驻军期间,约会过几次一位17岁的菲律宾裔女孩,他打算在休假期间与她结婚。但那个女孩却抢在结婚前怀了孕,而播种者却是另一个从得克萨斯来的家伙。“好运”不在乎,他只想跟这个女孩结婚,而后可以尽快拿到美军额外的家庭津贴。另外,还顺便拯救一个来自第三世界的少女,外加一个不劳而获的胖儿子,一举三得。

“好运”在这方面可能比较看得开,或者说是不在乎。他父亲结过三次婚,他同父异母的兄弟姐妹十多个。连他都分不清谁是哪房的。他父亲在他参军前的两个月在一场车祸中去世了,年仅38岁,听着有些头晕,才38岁就有十多个孩子。

在华盛顿我刚认识他的时候,他总是闷闷不乐的。直到后来玩上网络游戏后,心情才好转了很多。类似“好运”的家庭的士兵,我们连里有好几个。有的从来没见过自己的父亲,有的父母离异,孩子判给父亲,父亲再婚,有了继母,后来父亲去世,就跟着继母过,继母又跟人结了婚,有了孩子,他就跟着一帮毫无血缘关系的人生活。当营里批准我们可以使用手机后,他们都没有买手机。因为没人关心,也无人可打。

第100个自杀的兄弟

伊拉克开战4年来,美军死的死,伤的伤,疯的疯,逃的逃,自杀的自杀,每一天都在各个基地发生。有谁兴高采烈,意气风发,斗志昂扬的那才叫一个怪在战场上火拼的时候大家都是龙,回到帐篷里都是死蟹一只,士气低迷,唉声叹气,怨声载道,焦虑不安,每天掰着脚趾数着回美国的倒计时。

有的小青年十七八岁高中刚毕业就当兵,训练了4个月就来伊拉克,每天还在帐篷里不停地哭泣。这些情景与我小时候看到的美国好莱坞战争片中的美国大兵,真是天壤之别啊前两天,我们基地一个士兵自杀后,上级立刻关闭了基地网吧和电话亭,还规定一律不许往外打手机,否则没收。真没想到,美军也搞这一套,与山西小煤窑真有一拼。其他的士兵死,在基地里并没有引起太大的震动,大家早就司空见惯,见怪不怪了。这次却有点不寻常,或许是因为他挤进陆军自杀排行榜第100位吧。

这位快要退役的兄弟,大哥我得批评你两句。像在伊拉克这样的鬼门关,前脚出了帐篷,就不知道后脚还能不能再回来,你在15个月中有10万个死亡的机会,选择自杀简直是脱裤子放屁。你只要耐心等到下一个火拼的时候,身体略微抬高个一寸半寸的,对方的狙击手就能准确无误地命中你头盔与风镜之间的间隙……

那就全齐活了要名誉有名誉,要紫星勋章有紫星勋章,哥们都能参加你的追悼会,大伙儿体体面面地送你一程。陆军还能给你家里捎个50万美元的阵亡抚恤金。一念之差,人财两空,全都完了你怎么就这么傻呢﹖﹖这么一会儿你都挺不住﹖哥们不都在暗无天日、度日如年地挺着吗﹖﹖自杀的消息有时比在战场上挂掉的消息更加可怕,一个活生生的人倒下,他就是睡在上下铺的兄弟,那种感觉,正如你黑夜行走时,突然面临着一个深渊,而深渊里正传来死神的呼唤。

2008年8月,是我退役的日子,满以为还可以赶上到北京看奥运。但是现在兵源奇缺,陆军愣不让按期退役,每个士兵都必须在战区驻满15个月,除非重伤或挂掉。我现在的退役期推迟到了2008年的11月15日,还剩多少天,我也学会了掰脚指头。

夜深了,睡在中东沙漠中,望着浩瀚的星空,吹着从地狱刮来的风,全身的皮肤都在溃烂,我回想在中国的很多同班同学都找不着工作,当宅男,玩动漫,吃肯德基,跟父母较劲儿抗衡。我为什么会孤身来到这里﹖我到底为谁而战﹖

Saturday, November 22, 2008

java-entrance

>>>>>>>install jre & jdk in unbuntu

There are two method to install jdk in ubuntu:

To setup the jdk env, you must read this through firstly.


1. manual installation

go to http://java.sun.com/ to download jdk. There is a detail to be pointed out, that is you should download the .bin, NOT the .rpm.bin version.
(The rpm.bin version work in redhat relative version.)

Then, you can move it to /opt with the sudo and unpack it there.

cd ~/Desktop
sudo mv java_filename.bin /opt
cd /opt
sudo chmod 755 java_filename.bin
sudo ./java_filename.bin

That would unpack it in /opt. Now, you just have to configure it so your system would use the new version.
----------------the above steps are working...

Code:
sudo update-alternatives --config java
And make sure you pick the new version from the list. Now, you can check to see if your system is using the new version with

Code:
java -version


2. using apt-get to install it

Installing Java Runtime and JDK has been made easy since Ubuntu Feisty Fawn since multiverse and universe package has been made available by default. This short how to, covers an easy way to install Sun Java environment in your Ubuntu operating system.

Installing Java Runtime

$ sudo apt-get install sun-java6-jre

Installing Java Software Development Kit (JDK)

$ sudo apt-get install sun-java6-jdk

Alternatively you can choose to install previous Sun Java version on your machine by replacing 'sun-java6' with 'sun-java5' for Java 1.5, or by installing 'j2sdk1.4' package for Java 1.4.

That's all, you should be able to run Java applets using your favorite browser or run Java application by now.

However, if you install the jdk by this way, maybe some packages such as src of jdk lib will not be install or the install directory hardly to found.

To install all the things, you can use:
$ sudo apt-get install sun-java6-bin sun-java6-jre sun-java6-jdk


Setup the default Java version

Ubuntu Linux comes with update-java-alternatives utility to updates all alternatives belonging to one runtime or development kit for the Java language. To select, Sun's JVM as provided in Ubuntu 7.10, enter:
$ sudo update-java-alternatives -s java-6-sun

>>>>>>>>
You also need to edit a file called /etc/jvm. This file defines the default system JVM search order. Each JVM should list their JAVA_HOME compatible directory in this file. The default system JVM is the first one available from top to bottom. Open /etc/jvm
$ sudo vi /etc/jvm
Make sure /usr/lib/jvm/java-6-sun is added to the top of JVM list
/usr/lib/jvm/java-6-sun
At the end your file should read as follows:
/usr/lib/jvm/java-6-sun
/usr/lib/jvm/java-gcj
/usr/lib/jvm/ia32-java-1.5.0-sun
/usr/lib/jvm/java-1.5.0-sun
/usr

Save and close the file.
-------set jvm path here.

Setup the environment variable

You also need to setup JAVA_HOME and PATH variable. Open your $HOME/.bash_profile or /etc/profile (system wide) configuration. Open your .bash_profile file:
$ vi $HOME/.bash_profile
Append following line:
export JAVA_HOME=/usr/lib/jvm/java-6-sun
export PATH=$PATH:$JAVA_HOME/bin

Save and close the file.

-----set JAVA_HOME and PATH
but it seems it do not work after set the profile. or set it wrong.
and i can not find $HOME/.bash_profile. why ??

If you can not find the .bash_profile, you can and these things to $HOME/.bashrc .

Or, you can create a new .bash_profile file in the $HOME directory!!!


Test your new JDK

Type the following command to display version:
$ java -version
Output:

java version "1.6.0_03"
Java(TM) SE Runtime Environment (build 1.6.0_03-b05)
Java HotSpot(TM) Server VM (build 1.6.0_03-b05, mixed mode)

Try HelloWorld.java - first java program

$ vi HelloWorld.java
Append code:

public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}

Save and close the file. Compile HelloWorld.java and execute program by typing following two instructions:
$ javac HelloWorld.java
$ java HelloWorld

Output:

Hello, World!

---------------------more info

Currently Ubuntu has the following Java packages

sun-java6-bin - Contains the binaries

sun-java6-demo - Contains demos and examples

sun-java6-doc - Contains the documentation

sun-java6-fonts - Contains the Lucida TrueType fonts from the JRE

sun-java6-jdk - Contains the metapackage for the JDK

sun-java6-jre - Contains the metapackage for the JRE

sun-java6-plugin - Contains the plug-in for Mozilla-based browsers

sun-java6-source - Contains source files for the JDK

Installing the Java Runtime Environment

First you need to check multiverse repository enabled or not after that open a terminal window. Since you are going to be installing the JRE and the web browser plug-in, you’ll be using the following command from a terminal

sudo apt-get install sun-java6-jre sun-java6-plugin sun-java6-fonts

Once it downloads the packages and begins the installation, you’ll get a screen that contains the Sun Operating System Distributor License for Java and hit Enter to continue. You’ll see a dialog that asks you if you agree with the DLJ license terms. Select Yes, and hit Enter; the JRE will finish installing.

Testing Java Runtime Environment

You’ll want to confirm that your system is configured properly for Sun’s JRE. This is a two-step process.

First, check that the JRE is properly installed by running the following command from a terminal.

java -version

You should get similar output

java version “1.6.0″
Java(TM) SE Runtime Environment (build 1.6.0-b105)

Java HotSpot(TM) Client VM (build 1.6.0-b105, mixed mode, sharing)

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Testing Java Plugin for Firefox

open Firefox and typing about:plugins in the address bar and check for java plugin

>>>>>>>>>>>>>
1.......

2.设置环境变量。
#vi /etc/profile
在最后面加入
#set java environment
JAVA_HOME=/usr/java/jdk-1_5_0_02
CLASSPATH=.:$JAVA_HOME/lib.tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
保存退出。

要使JDK在所有的用户中使用,可以这样:
vi /etc/profile.d/java.sh
在新的java.sh中输入以下内容:
#set java environment
JAVA_HOME=/usr/java/jdk-1_5_0_02
CLASSPATH=.:$JAVA_HOME/lib.tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
保存退出,然后给java.sh分配权限:chmod 755 /etc/profile.d/java.sh

3.在终端使用echo命令检查环境变量设置情况。
#echo $JAVA_HOME
#echo $CLASSPATH
#echo $PATH

4.检查JDK是否安装成功。
#java -version
如果看到JVM版本及相关信息,即安装成功!

>>>>>>>>>>>>sample(in ubuntu)

1. you can use eclipse to edit/compile/run the java. if you can run the eclipse( once you setting the jdk in the right way, you can run eclipse), then you can run the java sample easily.

2.using javac to compile the java source code and java to run the exe.

-------------the env running the sample

simon@simon-laptop:~/workspace$
simon@simon-laptop:~/workspace$ ls
firstJavaSample helloworld log testjava1
simon@simon-laptop:~/workspace$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/java/jdk1.6.0_10/bin
simon@simon-laptop:~/workspace$ echo $JAVA_HOME
/usr/java/jdk1.6.0_10
simon@simon-laptop:~/workspace$ echo $CLASSPATH

simon@simon-laptop:~/workspace$

---------the java source file name and directory

simon@simon-laptop:~/workspace/firstJavaSample$ ls
FirstJavaSample.class FirstJavaSample.java

----------the code of the source file
package firstJavaSample;


public class FirstJavaSample {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("hello world");

}
}
-----------compile and run the java exe
simon@simon-laptop:~/workspace/firstJavaSample$ javac FirstJavaSample.java
simon@simon-laptop:~/workspace/firstJavaSample$ cd ..
simon@simon-laptop:~/workspace$ java firstJavaSample.FirstJavaSample
hello world
simon@simon-laptop:~/workspace$

-------------some things you should care about

1. the name of the folder that contains the java source code should be the name of package of the the java soure code (firstJavaSample)

2.the name of the public class should be the name of the soure file (FirstJavaClass)

3. case senstive (firstJavaSample ! = FirstJavaSample)

4. you should go back to the folder that contains the package folder to run the java exe.

simon@simon-laptop:~/workspace$ java firstJavaSample.FirstJavaSample

workspace contains the firstJavaSample folder


Sunday, November 16, 2008

谷歌李开复:若碰到裁员 员工应当成一种动力

李开复建议,在选择职业时,应尽量选择现金流充足、历史记录良好、财务报表良好,并且经过考验的公司

金融风暴引燃职场危机(三)———

次贷危机就像多米诺骨牌一样,让全球金融机构逐一陷入泥潭。而相关行业也受到牵连,史无前例的大裁员正在波及各个行业。

遇到裁员怎么办?该如何看待裁员?裁员之后该如何寻找新的工作?昨天,记者采访了谷歌全球副总裁、大中华区总裁李开复。他表示,虽然谷歌在中国绝无裁员的可能,但是他过去在苹果、SGI、微软的职业生涯中经历多次裁员风暴。他告诉记者,被裁确实是一种挫折,但是员工不能把这种挫折当作惩罚,要当成继续前进的动力。而为了防止被裁员,员工在平时工作中不仅仅要关注自己的工作安排,也应该主动推销自己,多学习新技术,拓展自己的视野。

裁员风波来临时,往往是又急又快,让人措手不及。但是如果有防患于未然的心态,平时有一系列的准备,那么当裁员风波来临时,可以为自己争取一些主动。

如何进行预防性的“自救”呢?李开复告诉记者,第一,在选择自己的职业时,尽量选择现金流充足、历史记录良好、财务报表良好,并且经过考验的公司。在危机发生时,这样的公司往往具有一定的抗风险能力。第二,尽量选择公司里最核心的部门工作。比如在高盛工作就做投资银行业务,比如在苹果公司产品部门工作,比如在报社工作就从事采编业务。

核心部门是最容易受到保护的部门,而一般行政、人事或者非核心的部门容易在危机中首先遭遇裁员。第三,尽量增加适应性。比如做市场的员工可以接受换岗,在销售部门做几年,做研发的员工可以尝试在市场部门工作。

在一个公司做过的岗位越多,适应性越强,而公司在裁员时,会倾向于将熟悉业务层面较多的员工留下。第四,在工作的同时,要与时俱进地学习,延续自己的竞争 力。当你掌握了最新的技术和业务,就会永远处在业务线的前沿。这样,无论是否遭遇裁员,都会把主动权掌握在自己的手中。第五,做一个有自觉心的人。

所谓自觉心,就是要清楚自己的业绩处在公司的大致水平,而不是被通知要裁掉的时候,才知道自己落后于一般水平。第六,在公司注意沟通,提高情商,确定自己的工作成绩被别人知道,学会适度推销自己。在不过分邀功的情况下,让人知道自己的贡献。

李开复告诉记者,裁员固然是一种挫折,但是每一个挫折也是学习的机会。如果遭遇裁员,不要把它当作生活的惩罚,而要当成一个新的起点。员工可以寻找更喜欢 的工作,考虑是否继续读新的学位,积极努力地寻找更适合自己的职业。关键是不但要找到一个热门的职业,更要找到一个自己热爱的工作。因为只有真正热爱的工 作,才能激发起内心的斗志。

李开复经历过三种模式的裁员


李开复告诉记者,自己在从业生涯中多次遇到需要裁掉员工的情况。第一次是上世纪90年代初在苹果公司,那个时候他担任苹果公司的语音语言小组经理。当时苹 果公司采取了降价措施,但是依然销售不佳,一个季度的亏损达到4亿美元。因此,苹果公司来不及设计裁掉哪些部门,就由CEO召集部门经理,让部门经理将每 个部门裁员10%。

当时裁员的标准是:第一,看员工的业绩是否令人满意。第二,看员工是否熟悉其他的业务。第三,看员工未来的潜力。第四,团队精神。而这四个部分将由部门经理进行打分,最终由每个副总裁决定裁员名单。

李开复说,当今的金融危机中的裁员,一般是属于这种裁员。而这种裁员一般是员工被约谈后,当天就要求员工收拾好办公室里的物品离开。那个时候,公司会雇佣人数相当的警卫,以防止员工做出情绪激烈的出格举动。

另外一种裁员是公司由于项目失败或方向错误,而将整个部门砍掉。而这种裁员,一般会给予员工一定补偿。李开复告诉记者,他在微软担任自然互动部门副总裁 时,决定将一个小组全体裁掉。因为那个小组里全部是语言学家,当时被雇佣来做语法修正软件,但是并不成功。当公司财务吃紧时,这种业绩不佳的部门就可能被 取消。其模式是提前告知员工公司的决定,然后让员工提前去别的部门寻找岗位。如果在限期3个月内找不到岗位,就只能“走路”了。


李开复经历的第三次裁员风波是在微软。当时他担任微软全球副总裁。有一天,微软CEO鲍尔默召集全球100个副总裁开会,并宣布微软将实行末位淘汰制。他命令每个副总裁在所负责领域挑出5%的业绩落后的员工,并为他们做出明确的工作计划。如果他们依然完不成指标,将被告知被裁员。这也是裁员的第三种模式——末位淘汰制引发的裁员。

Saturday, November 15, 2008

complier supporting c99 complex

Recently, I have been surveying the operations of complex. From the c99 and C++0x standard draft, I get the information about the operations for a complex library. Besides, I also refer to boost math library for how to implement the complex.

BTW, the boost 1.3.6 seems does not implement all the operations supported by the c++0x draft.

And, I try to use vc2005, icc10.1, gcc4.2, dmc8.5 to experience the complex operations.
But vc2005 and gcc4.3 do not support the c99 complex.
And some operations in icc&win32 will be broken( throw a access violation when using cacos).
It seems that the dmc can do more work to complex operation. At least it will work normally for cacos operation.

The following is the sample testing in the dmc:

#include "stdio.h"
#include "math.h"
#include "complex.h"

void outputComplex(_Complex double rst )
{
printf("rst=%g+%gi\n", rst);
}


int main()
{


//_Complex double a_ = 1.0+ 5.0i;//error

_Complex double a__ = 1.0+ 5.0 * _Complex_I;

_Complex double a = 1.0+ 5.0 * I;

outputComplex(a);

complex double b = cacos(a);

double complex b_ = cacos(a);

outputComplex(b);

return 0;

}

////////
The following is the sample for icc10.1&win32

#include "stdio.h"
#include "math.h"
#include "complex.h"

void outputComplex(_Complex double rst )
{
printf("rst=%g+%gi\n", rst);//print in the readable format
}

int main()
{
float f__=1.0f;
isnan(f__);

_Complex double a;
_Complex double b;

a=1.0+5.0i;
a+=2.0+2.0i;//a=3+7i

_Complex double a_ = 1.0+ 5.0 * _Complex_I;

_Complex double a__ = 1.0+ 5.0 * I;

printf("a=%g+%gi\n",a);//print in the readable format
//a = cproj(a);

a = 1.0 + 2.0i;
b = cacos(a);//--
outputComplex(b);

return 0;
}

Tuesday, November 4, 2008

icc, vc2005, gcc4.2的参数入栈顺序和强制类型转化的一个case






icc, vc2005, gcc4.2的参数入栈顺序和强制类型转化的一个case

为方便描述, 想想如下的情况

有4个类型TA, TB,
              TA_meta, TB_meta,

存在如下的关系, 从TA可以转化成TA_meta, 
                       从TB可以转化成TB_meta,
                       从TA_meta<-->TB_meta,

...
TA:: operator TA_meta (const TA& );//从TA转化成TA_meta的函数
TA:: operator TA_meta (const TB& );//从TB转化成TA_meta的函数, 这里先把TB-->TB_meta, 然后吧TB_meta-->TA_meta

为方便我们需要引入另外一个类型 CC.
有一个函数如下:
foo(CC,  TA_meta);

调用者如下:
CC obj1;
TA ta;

foo(obj1, ta); //这里需要把ta--->ta对应的TA_meta

下面给出信息:
             |     编译器                   参数入栈顺序                            调用的转化函数  
------------------------------------------------------------------------------------
windows|     vc                         自右向左                             TA:: operator TA_meta (const TA& )    
             |     icc                         自左向右                             TA:: operator TA_meta (const TB& )---icc 疯了
-------------------------------------------------------------------------------------
linux      |     gcc                        自右向左                            TA:: operator TA_meta (const TA& )
            |      icc                         自左向右                            TA:: operator TA_meta (const TA& )






Monday, November 3, 2008

关于犯错误

我犯过很多错误。 有些错误的首次发生几乎不可避免, 有些错误的首次发生是由于我自己引起的。

不管 怎么样, 我应该 停止犯同样的错误。

我不想争论 什么是错误。 我只能说 我感觉到 不对的 就应该是错误吧。。

我发觉 我偏离方向。。

我试图 通过给错误下一个定义, 然后告诉我 我做的事情不是错误, 所以我没有犯错误。。
一种很好的自我安慰的方法。。。 无语。。。

最后, 要劝诫、勉励一下自己 停止犯 犯过的错误。。 努力去做到这一点, 也许你会觉得痛苦, 但是 迟早这些错误会让你付出代价的。。

听起来 我对 犯某些错误会上瘾 不错就是这样, 当然不一定是上瘾, 只是有一种需求。 因为 错误对不同的人的其定义是不一样的。。

哎, 最后 我还是试图 为错误下一个定义, 从而可以为我的某些行为辩护, 或者说可以让我明确地知道哪些该做哪些不该做。。

这几乎是做不到的。。。

所以, 我只能说 告诉自己 停止犯错误, 并记住这个原则, 你不要管 什么是错误。 你只要记住,并且践行:
停止犯错误。

最后我无法对错误下定义。

到了最后, 我只能说 当你意识到你做的是一个错误的, 那么就停止吧!!!

好了。 结束吧。

Sunday, November 2, 2008

how to compile gcc4.3.2

-----------编译-gcc 4.3.2----------
a.下载源代码

b.解压

c.查看里面的INSTALL文件夹, 里面有一些关于安装的帮助信息

--下面描述两个必要的组件GMP, GPFR
Installing GMP method1:
sudo apt-get install m4

method2:------recommended
download the src.
unzip.
--to the following steps, please look into the INSTALL file in the source.
./configure
make
make check
make install: the default target path is /usr/local


Installing GPFR
download the src.
unzip.
--to the following steps, please look into the INSTALL file in the source.
./configure
make
make check
make install: the default target path is /usr/local

------
from the prerequisities of gcc. you may be need to install gawk (sudp apt-get install gawk )too.



d.configure进行注册

假设加压后的源代码目录是 gcc-4.3.2
这个目录下还有不少别的目录 比如INSTALL, gcc, ...
进入这个目录,执行如下操作(可能需要管理员权限,即加sudo )

% mkdir objdir
% cd objdir
sudo ./../configure --enable-languages=c,c++
--prefix=/usr/local/gcc-4.3.2 --enable-shared --with-system-zlib
--without-included-gettext --enable-threads=posix --enable-nls
--enable-libstdcxx-debug --enable-mpfr --enable-targets=all
--enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu
--target=i486-linux-gnu --disable-multilib

注意
1. 这里是在objdir目录下,所以使用的是gcc-4.3.2目录下的configure
2. 关于configure的选项我 试了很多个, 也用了好长时间,才发现这个可用。这里给出一些如何发现这个选项的信息。
一开始我的电脑上转的是 gcc4.2.3. 后来我又更新到了gcc.4.3.2. 以下是我看到的已经安装(通过apt-get)的gcc的选项
//--------------gcc 4.3.2 -v 查看选项------------------
Using built-in specs.
Target: i486-linux-gnu
Configured
with: ../src/configure -v --with-pkgversion='Ubuntu 4.3.2-1ubuntu8'
--with-bugurl=file:///usr/share/doc/gcc-4.3/README.Bugs
--enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr
--enable-shared --with-system-zlib --libexecdir=/usr/lib
--without-included-gettext --enable-threads=posix --enable-nls
--with-gxx-include-dir=/usr/include/c++/4.3 --program-suffix=-4.3
--enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc
--enable-mpfr --enable-targets=all --enable-checking=release
--build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
Thread model: posix
gcc version 4.3.2 (Ubuntu 4.3.2-1ubuntu8)
//----------------

//----------gcc4.2.2 -v 查看选项----------------------
Using built-in specs.
Target: i486-linux-gnu
Configured
with: ../src/configure -v
--enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr
--enable-shared --with-system-zlib --libexecdir=/usr/lib
--without-included-gettext --enable-threads=posix --enable-nls
--with-gxx-include-dir=/usr/include/c++/4.2 --program-suffix=-4.2
--enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc
--enable-mpfr --enable-targets=all --enable-checking=release
--build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
Thread model: posix
gcc version 4.2.3 (Ubuntu 4.2.3-2ubuntu7)

你可以把上面的一些选项直接拿过来用比如
--enable-languages=c,c++,fortran,objc,obj-c++
--enable-shared --with-system-zlib --libexecdir=/usr/lib
--without-included-gettext --enable-threads=posix --enable-nls
--enable-libstdcxx-debug
--enable-mpfr --enable-targets=all --enable-checking=release
--build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu

3. 必须加上--disable-multilib否则会发生编译错误

4. 这里你必须指定
--build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
否则会错误,在我的机器上他自己探测为i686-linux-gnu. 这会导致错误。

5. prefix 选项你指定了你想把gcc4.3.2安装到哪一个目录下, 你必须/最好指定

e. test. 参考INSTALL文件夹下面的信息

f. sudo make install
to install gcc4.3.2 to the prefix directory which is specified when configure.

-------------------------
以上是 在我的机器上安装的 过程。。

我想不同的机器 肯定会不同。。

王杰的歌

今天偶然又听到了, 心里酸酸的..

上网去 找了一下。。。


回家
英雄泪
家太远了
......

好遥远啊...

Friday, September 19, 2008

How to Run both Firefox 2 and Firefox 3 Together


  1. Download Firefox3 beta 2 at http://www.mozilla.com/en-US/firefox/all-beta.html
  2. Now enter firefox -profilemanager -no-remote in the run command box to open the firefox profile mnanager. The –no-remote allows profile manager to open while browser is running.profilem.JPG
  3. Create a new profile and name it firefox3 or any other name. Unchek the “Don’t ask at startup”and close the profile manager. This step has created the new profile that you will use to run Firefox3.

profilem2.JPG

这里建议 分别为firefox2, 3创建对应的profile.分别命名为firefox2, firefox3

跑到C:Documents and Settingsyye5xApplication DataMozillaFirefoxProfiles去看看,发现新创建了两文件夹。而且里面有一些文件。可以可以把山他们删掉。

把原来的default文件夹的内容拷贝到这两个新文件夹中。然后把default文件夹重新命名成任意的文件夹名。 我们这么做是为了让 firefox2, firefox3使用不同的插件。。

4. Now go to the desktop shortcut of Firefox 2 and right click and choose properties. In the target box add a space after .exe then add –p default(根据上面的建议这里应该改成-p firefox2).

This step tells that shortcut to launch firefox 2 in the default profile.         ff2.JPG

5. Install Firefox3 beta 2 and at the choose custom. This allows you to select the place you want to install. Select a new directory with a name like Firfox 3. (It gives default as Mozilla Firefox 3 beta 2 but better to use name that can be genericaly used because we need to upgrade to higher versions.

6. At the end uncheck the launch now option, if it launches now it may use our default profile and we don’t need that.

7. Now go to the new Firefox 3 icon in your desktop and right click, select properties and add “–no-remote-p firefox3” (这里应该改成-p firefox3) in the target box. This tells this short cut to launch using new profile firefox3.

 ff3.JPG

That’s it now you can launch both Firefox 2 and Firefox 3 using therer respective shortcuts and both will co-exist peacefully. So what are you waiting for try this out and let me know of what you think of Firefox 3