窗口管理器emerald的安装和使用
1。关闭metacity混合特性:
gconf-editor
找到apps--metacity--general--compositing_manager键,取消该选择。
2。开启compiz
compiz --replace;
3.启动emerald窗口管理器:
emerald --replace;
4。运行 系统-首选项-emerald theme manager 即可管理和使用已经下载的emerald主题。
5。让emerald成为默认窗口装饰器:
在CompizConfig设置管理器中将Window decorations中的Command改为emerald --replace。
emerge、eix、equery的基本用法
1. 安装软件:
# emerge package_name
2. 更新软件并更新它直接依赖的其它软件包:
# emerge -u package_name
3. 更新一个软件并更新它依赖的软件包以及它们依赖的所有软件包, 这里大写的D相当于--deep。
# emerge -uD package_name
4. 软件包卸载:
# emerge -C package_name
5. 软件包搜索(只搜索名字):
# emerge -s key_word
6. 软件包查找(搜索内容):
# emerge -S key_word
7. 将本地软件列表与最新的portage树同步:
# emerge --sync && emerge portage
8. 只下载源码:
# emerge -f package_name
9. 更新系统中的所有软件:
# emerge -uD world
10. 查看一个预装包欲装的包:
# emerge -p package_name
11. 查看预装包总共有哪些 USE :
# emerge -pv package_name
二、eix
安装eix: emerge eix
1. 软件包搜索:
# eix key_word
2. 将本地软件列表与最新的portage树同步:
# eix-sync
三、equery
equery可查看已安装包的信息,安装此工具: emerge gentoolkit
1. 列出所有已安装包:
# equery list 或简写:
# equery l
2. 查看已安装包装了哪些内容:
# equery files package_name 或简写:
# equery f package_name
3. 查看一个程序foo隶属于哪个包:
# equery belongs foo 或简写:
# equery b foo
4. 查看哪些包依赖于package_name:
# equery depends package_name 或简写:
# equery d package_name
5. 查看已安装包abc用了哪些USE:
# equery uses package_name 或简写:
# equery u package_name
使用dispatch-conf更新config文件
>>> No outdated packages were found on your system.
* GNU info directory index is up-to-date.
* IMPORTANT: 37 config files in /etc need updating.
* IMPORTANT: 5 config files in /usr/kde/3.2/share/config need updating.
* Type emerge --help config to learn how to update config files.
象这样的信息相信大家都见过了吧。要update这些config文件,可以用etc-update,不过我这儿想介绍一个类似的工具,dispatch-conf。这是我的配置档/etc/dispatch-conf.conf:
#
# dispatch-conf.conf
#
# Directory to archive replaced configs
archive-dir=/etc/config-archive
# Use rcs for storing files in the archive directory?
# (yes or no)
use-rcs=yes
# Diff for display
diff="diff -Nau %s %s"
# Pager for diff display
pager="less --no-init --QUIT-AT-EOF"
# Automerge files comprising only CVS interpolations (e.g. Header or Id)
# (yes or no)
replace-cvs=yes
# Automerge files comprising only whitespace and/or comments
# (yes or no)
replace-wscomments=yes
# Automerge files that the user hasn't modified
# (yes or no)
replace-unmodified=yes
如果要使用rcs,首先要:
# emerge rcs
当然还要:
# mkdir /etc/config-archive
用dispatch-conf来更新config文件很简单,运行:
# dispatch-conf
首先dispatch-conf会将要update的config文件在/etc/config-archive里做个备份,然后会一个个显示需要处理 的 文件。你会看到文件里(look-merge)有些行前面有+或-的符号(diff的显示),这代表automerge会将这些行加入或删减 (按空 格键翻页,如果文件太长,按‘q’退出),你会看到类似这样的信息:
>> (1 of 33) -- /etc/DIR_COLORS
>> q quit, h help, n next, e edit-new, z zap-new, u use-new
m merge, t toggle-merge, l look-merge:
如果按m进行merge,你会看到/etc/DIR_COLORS和/etc/._cfg0000_DIR_COLORS并列出现,旧的在左边,新的在右边。
然后可以按以下的命令进行merge:
ed: Edit then use both versions, each decorated with a header.
eb: Edit then use both versions.
el: Edit then use the left version.
er: Edit then use the right version.
e: Edit a new version.
l: Use the left version.
r: Use the right version.
s: Silently include common lines.
v: Verbosely include common lines.
q: Quit.
完成后,会显示新的将会变更的内容;按’q‘退出,然后按e(edit-new)做最后的编辑。接着就可以按’u‘启用新的文件了(/etc/._cfg0000_DIR_COLORS当然会给删掉了)。
以上是人手作merge的一个例子,实际上很多文件都可以直接按’u‘采用新版,尤其是/etc/init.d/里的那些脚本及一些你从不会去改的文件(以上的/etc/DIR_COLORS便是一例

)。Gentoo特有的东西,象make.conf这样的,最好是人手merge一下;象fstab这样的标准linux配置文件则可以直接zap-new,即删了._cfg0000_fstab然后继续。
PS 以上有些步骤与etc-update雷同,至于用哪个工具,使用者自己决定吧。
在Linux中创建静态库和动态库
我们通常把一些公用函数制作成函数库,供其它程序使用。函数库分为静态库和动态库两种。静 态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在 程序运行时还需要动态库存在。本文主要通过举例来说明在Linux中如何创建静态库和动态库,以及使用它们。
在创建函数库前,我们先来准备举例用的源程序,并将函数库的源程序编译成.o文件。
第1步:编辑得到举例的程序--hello.h、hello.c和main.c;
hello.c(见程序2)是函数库的源程序,其中包含公用函数hello,该函数将在屏幕上输出"Hello XXX!"。hello.h(见程序1)为该函数库的头文件。main.c(见程序3)为测试库文件的主程序,在主程序中调用了公用函数hello。
#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif //HELLO_H
程序1: hello.h
#include <stdio.h>
void hello(const char *name)
{
printf("Hello %s!\n", name);
}
程序2: hello.c
#include "hello.h"
int main()
{
hello("everyone");
return 0;
}
程序3: main.c
第2步:将hello.c编译成.o文件;
无论静态库,还是动态库,都是由.o文件创建的。因此,我们必须将源程序hello.c通过gcc先编译成.o文件。
在系统提示符下键入以下命令得到hello.o文件。
# gcc -c hello.c
#
(注1:本文不介绍各命令使用和其参数功能,若希望详细了解它们,请参考其他文档。)
(注2:首字符"#"是系统提示符,不需要键入,下文相同。)
我们运行ls命令看看是否生存了hello.o文件。
# ls
hello.c hello.h hello.o main.c
#
(注3:首字符不是"#"为系统运行结果,下文相同。)
在ls命令结果中,我们看到了hello.o文件,本步操作完成。
下面我们先来看看如何创建静态库,以及使用它。
第3步:由.o文件创建静态库;
静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。例如:我们将创建的静态库名为myhello,则静态库文件名就是libmyhello.a。在创建和使用静态库时,需要注意这点。创建静态库用ar命令。
在系统提示符下键入以下命令将创建静态库文件libmyhello.a。
# ar cr libmyhello.a hello.o
#
我们同样运行ls命令查看结果:
# ls
hello.c hello.h hello.o libmyhello.a main.c
#
ls命令结果中有libmyhello.a。
第4步:在程序中使用静态库;
静态库制作完了,如何使用它内部的函数呢?只需要在使用到这些公用函数的源程序中包含这些 公用函数的原型声明,然后在用gcc命令生成目标文件时指明静态库名,gcc将会从静态库中将公用函数连接到目标文件中。注意,gcc会在静态库名前加上 前缀lib,然后追加扩展名.a得到的静态库文件名来查找静态库文件。
在程序3:main.c中,我们包含了静态库的头文件hello.h,然后在主程序main中直接调用公用函数hello。下面先生成目标程序hello,然后运行hello程序看看结果如何。
# gcc -o hello main.c -L. -lmyhello
# ./hello
Hello everyone!
#
我们删除静态库文件试试公用函数hello是否真的连接到目标文件 hello中了。
# rm libmyhello.a
rm: remove regular file `libmyhello.a'? y
# ./hello
Hello everyone!
#
程序照常运行,静态库中的公用函数已经连接到目标文件中了。
我们继续看看如何在Linux中创建动态库。我们还是从.o文件开始。
第5步:由.o文件创建动态库文件;
动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀lib,但其文件扩展名为.so。例如:我们将创建的动态库名为myhello,则动态库文件名就是libmyhello.so。用gcc来创建动态库。
在系统提示符下键入以下命令得到动态库文件libmyhello.so。
# gcc -shared -fPCI -o libmyhello.so hello.o
#
我们照样使用ls命令看看动态库文件是否生成。
# ls
hello.c hello.h hello.o libmyhello.so main.c
#
第6步:在程序中使用动态库;
在程序中使用动态库和使用静态库完全一样,也是在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令生成目标文件时指明动态库名进行编译。我们先运行gcc命令生成目标文件,再运行它看看结果。
# gcc -o hello main.c -L. -lmyhello
# ./hello
./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory
#
哦!出错了。快看看错误提示,原来是找不到动态库文件libmyhello.so。程序在 运行时,会在/usr/lib和/lib等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。我们将文件 libmyhello.so复制到目录/usr/lib中,再试试。
# mv libmyhello.so /usr/lib
# ./hello
Hello everyone!
#
成功了。这也进一步说明了动态库在程序运行时是需要的。
我们回过头看看,发现使用静态库和使用动态库编译成目标程序使用的gcc命令完全一样,那当静态库和动态库同名时,gcc命令会使用哪个库文件呢?抱着对问题必究到底的心情,来试试看。
先删除除.c和.h外的所有文件,恢复成我们刚刚编辑完举例程序状态。
# rm -f hello hello.o /usr/lib/libmyhello.so
# ls
hello.c hello.h main.c
#
在来创建静态库文件libmyhello.a和动态库文件libmyhello.so。
# gcc -c hello.c
# ar cr libmyhello.a hello.o
# gcc -shared -fPCI -o libmyhello.so hello.o
# ls
hello.c hello.h hello.o libmyhello.a libmyhello.so main.c
#
通过上述最后一条ls命令,可以发现静态库文件libmyhello.a和动态库文件libmyhello.so都已经生成,并都在当前目录中。然后,我们运行gcc命令来使用函数库myhello生成目标文件hello,并运行程序 hello。
# gcc -o hello main.c -L. -lmyhello
# ./hello
./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory
#
从程序hello运行的结果中很容易知道,当静态库和动态库同名时, gcc命令将优先使用动态库。
B、B-、B+、B*-Tree
B树
HTTP Referer
关于HTTP Referer使用非常简单,使用场合比较多的是用于页面统计、图片防盗链(可以在apache 中进行设置,从非自己domain或空Referer过来的请求一律拒绝)等;但还是有一点值得注意:Referer是不安全的,客户端可以通过设置改变 Request中的值,尽量不要用来进行安全验证等方面;下面介绍下默认情况下Referer可能出现为空的场景:
1、页面从Https跳转到Http;应该是处于安全考虑,该点在RFC-2616中有说明;主流浏览器均遵守这个规则,比如IE、FF;但默认情况下Https到Https是会发送Referer的;
2、直接在浏览器中输入目标URL;
3、由于FF提供了很强大的自定义参数设置功能,所以我们可以通过about:config页面修改以下两个选项的默认设置:
network.http.sendRefererHeader (default=2)
设置Referer的发送方式,0为完全不发送,1为只在点击链接时发送,在访问页面中的图像什么的时候不发送,2为始终发送。
network.http.sendSecureXSiteReferrer (default=true)
设置从一个Https访问到另外Https页面的时候是否发送Referer,true为发送,false为不发送。
find
Find命令是一个非常有效的工具,它可以遍历当前目录甚至于整个文件系统来查找某些文件或目录。
Find命令的一般形式为:
find pathname -options [-print -exec -ok]
让我们来看看该命令的参数:
参数 | 描述 |
pathname | find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。 |
find命令将匹配的文件输出到标准输出。 | |
-exec | find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为command {} \;,注意{ }和\;之间的空格。 |
-ok | 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。 |
options最常见选项:
option | 描述 |
-name | 按照文件名查找文件 |
-perm | 按照文件权限来查找文件 |
-user | 按照文件属主来查找文件 |
-group | 按照文件所属的组来查找文件 |
-mtime -n +n | 按照文件的更改时间来查找文件,-n表示文件更改时间距现在n天以内,+n 表示文件更改时间距现在n天以前。Find命令还有-atime和-ctime选项,但它们都和-mtime选项相似,所以我们在这里只介绍-mtime选项 |
-type | 查找某一类型的文件,比如:b - 块设备文件;d - 目录;c - 字符设备文件;p - 管道文件;l - 符号链接文件;f - 普通文件 |
-size n[c] | 查找文件长度为n块的文件,带有c时表示文件长度以字节计 |
以下是一些常见实例:
命令 | 描述 |
find . -name "*.txt" -print | 在当前目录及子目录中查找所有的'*.txt'文件 |
find . -name "[A-Z]*" -print | 当前目录及子目录中查找文件名以一个大写字母开头的文件 |
find /etc -name "host*" -print | 在/etc目录中查找文件名以host开头的文件 |
find . -name "[a-z][a-z][0--9][0--9].txt" -print | 在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是*.txt的文件 |
find . -size +1000000c -print | 在当前目录下查找文件长度大于1 M字节的文件 |
使用exec或ok来执行shell命令
当匹配到一些文件以后,可能希望对其进行某些操作,这时就可以使用-exec选项。一旦find命令匹配到了相应的文件,就可以用-exec选项中的命令对其进行操作(在有些操作系统中只允许-exec选项执行诸如ls或ls -l这样的命令)。大多数用户使用这一选项是为了查找旧文件并删除它们。这里我强烈地建议你在真正执行rm命令删除文件之前,最好先用ls命令看一下,确认它们是所要删除的文件。
exec选项后面跟随着所要执行的命令,然后是一对儿{ },一个空格和一个\,最后是一个分号。
用xargs代替exec/ok
在使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec执行。不幸的是,有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是"参数列太长"或"参数列溢出"。这就是xargs命令的用处所在,特别是与find命令一起使用。find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。
以下是一些exec/ok/xargs使用的常见实例:
命令 | 描述 |
find logs -type f -mtime +5 -exec rm {} \; | 在/logs目录中查找更改时间在5日以前的文件并删除它们 |
find / -type f -size 0 -exec ls -l {} \; | 系统中所有文件长度为0的普通文件,并列出它们的完整路径 |
find /var/logs -type f -mtime +7 -exec rm {} \; | 查找/var/logs目录中更改时间在7日以前的普通文件,并删除它们 |
find . -name "core" -print | xargs echo "" >/tmp/core.log | 在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中 |
find / -type f -print | xargs grep "device" | 用grep命令在所有的普通文件中搜索device这个词 |
记住,在shell中用任何方式删除文件之前,应当先查看相应的文件,一定要小心!
重定向操作符
经常看到这样的语句:mysh > mylog.txt 2>&1是什么意思?
重定向操作符可以用来将命令输入和输出数据流从默认位置重定向到其他位置,其输入或输出数据流的位置称为句柄;常见的句柄有三种,当然句柄可以自行扩展,一般的OS都提供类似的功能:
句柄 | 句柄代号 | 句柄描述 |
STDIN | 0 | 键盘输入 |
STDOUT | 1 | 输出信息到提示符窗口 |
STDERR | 2 | 输出错误信息到提示符窗口 |
默认的 < 重定向输入操作符是 0,而默认的 > 重定向输出操作符是 1。键入 < 或 > 操作符之后,必须指定数据的读写位置,可以是文件名或其他现有的句柄。
要指定重定向到现有句柄,请使用与 & 字符,后面接要重定向的句柄号(即 &句柄号)。
例如,下面的命令可以将句柄 2(即 STDERR)重定向到句柄 1(即 STDOUT):2>&1
下表列出了可用于重定向输入和输出数据流的操作符:
重定向操作符 | 功能描述 |
> | 将命令输出写入文件或设备,而不是命令提示符或句柄 |
< | 从文件而不是从键盘或句柄读入命令输入 |
>> | 将命令输出添加到文件末尾而不删除文件中已有的信息 |
>& | 将一个句柄的输出写入到另一个句柄的输入中 |
<& | 从一个句柄读取输入并将其写入到另一个句柄输出中 |
| | 从一个命令中读取输出并将其写入另一个命令的输入中;也称为管道操作符 |
现在我们回过头来看看上面的那条语句mysh > mylog.txt 2>&1就可明白:
> mylog.txt意思是将标准输出重定向到mylog.txt,等价于mysh 1> mylog.txt;
2 >& 1 意思是将错误输出重定向到句柄1标准输出;综合起来就是mysh命令执行过程中产生的标准输出和错误输出都会被重定向到mylog.txt中;
重定向的功能十分强大,有兴趣的可以去尝试各种不同的组合,看看前后位置变下会有什么结果?
某些时候我们可能并不希望记录什么标准输出或者是错误输出,那可以用mysh >null 2>null或者mysh >/dev/null 2>/dev/null;
crontab
crontab 指定在固定时间或固定间隔执行特定的脚本;crontab的常用参数有如下3个:
-e :执行文字编辑器来设定日程表,一般默认的编辑器是VI;
-r :删除目前所有的日程表;
-l :列出目前所有的日程表;
设置日程表时,需要有固定的格式,共6部分,各部分间用空格间隔;其中第6个部分是要执行的命令,前5个部分是设置执行时间或者时间间隔的,具体取值范围和意义如下:
分钟【0-59】 小时【0-23】 日【1-31】 月份【1-12】 星期【0-6】
在设置的时候可以每项有4种指定方式,如下:
* :表示每 分钟/.../星期 都需要执行;
a-b :表示从第 a 分钟/.../星期 到第 b 分钟/.../星期 这段期间都需要执行;
*/n :表示每 n个 分钟/.../星期 时间间隔执行一次;
a,b,c :表示第 a,b,c 分钟/.../星期 时需要执行,也即指定多个具体时间点;
举个例子来说,比如要指定每日早上7点执行脚本mysh的crontab设置如下:
0 7 * * * /home/admin/mysh >/home/admin/mylog.txt 2>&1
冯诺依曼结构和哈佛结构
哈佛结构
数字信号处理一般需要较大的运算量和较高的运算速度,为了提高数据吞吐量,在数字信号处理器中大多采用哈佛结构,如下图所示
图 哈佛结构
与冯.诺曼结构处理器比较,哈佛结构处理器有两个明显的特点:
-
使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存;
-
使用独立的两条总线,分别作为CPU与每个存储器之间的专用通信路径,而这两条总线之间毫无关联。
后来,又提出了改进的哈佛结构,如下图所示
图 改进型哈佛结构
其结构特点为:
-
使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存,以便实现并行处理;
-
具有一条独立的地址总线和一条独立的数据总线,利用公用地址总线访问两个存储模块(程序存储模块和数据存储模块),公用数据总线则被用来完成程序存储模块或数据存储模块与CPU之间的数据传输;
-
两条总线由程序存储器和数据存储器分时共用。
在典型情况下,完成一条指令需要3个步骤,即:取指令、指令译码和执行指令。从指令流的定时关系也可看出冯.诺曼结构与哈佛结构处理方式的差别。举一个最简单的对存储器进行读写操作的指令,如下图所示,指令1至指令3均为存、取数指令,对冯.诺曼结构处理器,由于取指令和存取数据要从同一个存储空间存取,经由同一总线传输,因而它们无法重叠执行,只有一个完成后再进行下一个。
图 冯.诺曼结构处理器指令流的定时关系示意图
如果采用哈佛结构处理以上同样的3条存取数指令,如下图所示,由于取指令和存取数据分别经由不同的存储空间和不同的总线,使得各条指令可以重叠执行,这样,也就克服了数据流传输的瓶颈,提高了运算速度。
哈佛结构强调了总的系统速度以及通讯和处理器配置方面的灵活性。
图 哈佛结构处理器指令流的定时关系示意图
========================================================================
冯.诺曼结构
1945年,冯.诺曼首先提出了“存储程序”的概念和二进制原理,后来,人们把利用这种概念和原理设计的电子计算机系统统称为“冯.诺曼型结构”计算机。冯.诺曼结构的处理器使用同一个存储器,经由同一个总线传输,如下图所示:
图 冯.诺曼结构
冯.诺曼结构处理器具有以下几个特点:
-
必须有一个存储器;
-
必须有一个控制器;
-
必须有一个运算器,用于完成算术运算和逻辑运算;
-
必须有输入和输出设备,用于进行人机通信。
冯.诺曼的主要贡献就是提出并实现了“存储程序”的概念。由于指令和数据都是二进制码,指令和操作数的地址又密切相关,因此,当初选择这种结构是自然的。但是,这种指令和数据共享同一总线的结构,使得信息流的传输成为限制计算机性能的瓶颈,影响了数据处理速度的提高。
在典型情况下,完成一条指令需要3个步骤,即:取指令、指令译码和执行指令。从指令流的定时关系也可看出冯.诺曼结构与哈佛结构处理方式的差别。举一个最简单的对存储器进行读写操作的指令,如下图所示,指令1至指令3均为存、取数指令,对冯.诺曼结构处理器,由于取指令和存取数据要从同一个存储空间存取,经由同一总线传输,因而它们无法重叠执行,只有一个完成后再进行下一个。
图 冯.诺曼结构处理器指令流的定时关系示意图