页面

2009/12/10

翻译:Xen体系结构

翻译说明

在研究和学习虚拟化技术的过程中看了很多文档,很多是翻译成中文的,对那些无私的为大家服务的贡献者很是敬佩,同时也触发了我为大家做些贡献的愿望。事实上翻译和整理的过程也是自己进一步学习的过程。由于自己的水平有限,翻译过程中的错误欢迎大家批评指正。
开源,很好!

概要

本文档描述的是Xen hypervisor的宏观体系结构、辅助工具以及构建一个完整虚拟化环境所需的应用程序。本文的综合介绍了基于Xen3.2(2008年1月)的Xen体系结构,更详尽的描述请参考Xen books。

Xen组成要素

一个Xen虚拟化环境由以下相互配合的元素构成:
  • Xen Hypervisor
  • Domain 0
  • Domain管理和控制工具
  • Domain U PV客户系统
  • Domain U HVM客户系统
下面的图形是对这些要素基本组织的描述




Xen Hypervisor
Xen Hypervisor是一个介于硬件和操作系统之间的软件层,它负责在各虚拟机之间进行CPU调度和内存分配(partitioning)。Xen Hypervisor不仅抽象出硬件层,同时控制虚拟机的执行,因为这些虚拟机共享同一个处理环境。Xen Hypervisor不会处理网络、存储设备、视频以及其他I/O。

Domain 0
Domain 0是一个修改过的Linux kernel,是唯一运行在Xen Hypervisor之上的虚拟机,它拥有访问物理I/O资源的权限,同时和系统上运行的其他虚拟机进行交互。Domain 0需要在其它Domain启动之前启动。
Domain 0中包含两个驱动:Network Backend Driver和Block Backend Driver,分别负责处理来自Domain U的网络和本地磁盘请求。Network Backend Driver直接和本地网络硬件进行通信以处理所有来自Domain U上客户操作系统的网络请求。Block Backend Driver和本地存储设备进行通信以处理来自Domain U的读写请求。


Domain U
运行在Xen Hypervisor上的所有半虚拟化(paravirtualized)虚拟机被称为“Domain U PV Guests”,其上运行着被修改过内核的操作系统,如Linux、Solaris、FreeBSD等其它UNIX操作系统。所有的全虚拟化虚拟机被称为 “Domain U HVM Guests”,其上运行着不用修改内核的操作系统,如Windows等。
Domain U PV Guests的内核知道它自己不能直接访问物理硬件,因为他知道有其他的虚拟机也运行在同一个环境中。而Domain U HVM Guests的内核不知道他正在和其他虚拟机共享一个处理环境,它认为它运转在物理硬件上。
Domain U PV Guests包含两个驱动:“PV Network Driver”和“PV Block Driver”。


Domain U HVM Guests虚拟机内没有PV Driver,而是在Domain 0里为每一个HVM Guest启动一个特殊守护进程:Qemu-dm,由Qemu-dm负责客户操作系统的网络和磁盘请求。
Domain U HVM Guests必须进行初始化为某类机器,所以要在Domain U上附加一个软件:Xen虚拟固件,来模拟BIOS。关于Xen虚拟化固件的更多信息请参考后面的内容。





域(Domain)管理和控制
开源社区提供了一系列的域管理和控制工具(Linux守护程序)。这些服务运行在Domain 0,他们支持所有对虚拟化环境的管理和控制,下面的几个图中为了更清楚的说明将这些守护进程画在了Domain 0的外部。
Xend
Xend是一个python应用程序,它是Xen虚拟化环境的系统管理工具。它通过对libxenctrl库的调用实现对Xen Hypervisor的请求。Xend处理的所有请求都是通过Xm工具提供的XML RPC接口提交的,见下图。



Xm
Xm是一个命令行工具,它接受用户的输入并把指令通过XML RPC传输给Xend。
Xenstored
Xenstored维护一个信息档案,包括内存和建立在Domain 0与Domain U之间的事件通道。Domain 0通过改变这个档案来设置和其他虚拟机的设备通道。(具体信息请参考Domain 0和Domain U的通信)
Libxenctrl
Libxenctrl是一个C语言的库,它为Xend提供与Xen Hypervisor通信的能力。privcmd是Domain 0中的一个特殊驱动,它负责提交请求到hypervisor。



Qemu-dm
每一个运行在Xen虚拟化环境下的HVM客户系统都有他自己的Qemu守护进程。该进程处理来自HVM客户系统的所有网络和磁盘请求,以支持Xen虚拟化 环境下的全虚拟化。Qemu必须存在于Xen hypervisor之外,因为它需要访问网络和I/O设备,所以他运行在Domain 0 。
现在已经有一个新的工具来代替Qemu对HVM客户系统的支持,这就是Stub-dm。它是为Xen的将来版本开发的,Xen3.2还不具备该特性,可能发布在Xen3.3中。
Xen虚拟化固件
Xen虚拟化固件是一个虚拟的BIOS,它被加载到每一个Domain U HVM Guest以提供标准的启动指令,保证客户操作系统在正常启动过程中能得到标准的PC兼容的软件环境。

Xen操作

这部分描述一个半虚拟化的Domain U如何通过Xen hypervisor、Domain 0 与外部的网络以及存储进行通信的。
Domain 0与Domain U的通信
前面讲到过,Xen Hypervisor不会支持网络和磁盘请求的,因此一个PV客户系统必须通过和Xen Hypervisor、Domain 0通信,来实现网络和磁盘请求。下面这个例子描述了PV客户系统如何将一个数据写到本地硬盘。
PV客户系统的开设备驱动程序接收到一个写请求,并且通过Xen Hypervisor写数据到适当的本地内存中,该内存是和Domain 0共享的。在Domain 0 和Domain U之间存在一个事件通道(event channel),通过该通道二者进行异步的域间中断通信。Domain 0会接收到一个来自Xen Hypervisor的中断,触发PV Block Backend Driver访问上述的内存,读取来自PV客户系统的数据,然后将这些数据写入硬件磁盘。
下图中事件通道表示为连接Domain 0与Domain U的一个区域,这是系统工作流的一个简化。事实上事件通道运行在Xen Hypervisor,通过Xenstored中的特定中断实现,提供Domain 0与Domain U之间的快速共享内存。
见下图。



术语表
C: http://www.cprogramming.com/; a computer programming language
Daemons: http://en.wikipedia.org/wiki/Daemon_(computer_software); a program running in the background rather than under direct control of a user
Driver: http://en.wikipedia.org/wiki/Device_driver; program allowing software to interact with hardware
Full Virtualization: http://en.wikipedia.org/wiki/Full_virtualization; a virtual machine not aware of its virtualization
Interrupt:  http://en.wikipedia.org/wiki/Interrupt; signal from hardware to software requesting a specific action in software
Kernel: http://en.wikipedia.org/wiki/Linux_kernel; the central component of a computer operating system
Paravirtualized: http://en.wikipedia.org/wiki/Paravirtualization; virtual machine running on a hypervisor that is aware of it being virtualized]
Python: http://www.python.org/; a dynamic object oriented programming language
ROM BIOS: http://en.wikipedia.org/wiki/BIOS; software instructions run on a machine when turned on
XML PRC: http://www.xmlrpc.com/; method for an application to leverage another application using HTTP for the remote procedure call and XML as the encoding




译者:BiaBear
博客:http://www.lupaworld.com/386879

Nessus 4.2开源漏洞扫描工具发布


NessusLogo-9e60aec32eb934b1Nessus是一款非常优秀的开源漏洞扫描工具,被认为是目前全世界最多人使用的系统漏洞扫描与分析软件。该软件的4.2版本发布,这个新版本是有史以来发动最大的一次,首先就是增加了一个基于Web的用户界面,界面的美工做到极致,让人赞叹,可以见系统截屏。这个Web界面的推出,意味着是一个新的客户端,用户可以通过浏览器来管理设置系统。
详细功能请查看官方功能描述下载文档插件

转载自Osss.cn 开源社区

Musca + Xfce4-panel:接近完美

{ 撰文/吴吉庆 }
我上篇讲 Musca 配置的文章中所说的用 Conky 显示窗口列表,效果并不是很好,文本经常显示不全。而且也不能像真的任务栏那样操作。
PyPanel 也不行,根本不能显示窗口列表。
我一开始还以为是 Musca 不符合 MWM 规范呢,但看到一个网友用 Tint2 可以显示窗口列表。 他告诉我说,就 PyPanel 不行,别的 panel 都可以。 原来这样,看来 Musca 都可以嵌入到 GNOME 中用了,真的很不错啊。
我试用了 Tint2,基本满意,但是有两个问题:
  1. 它对系统托盘程序的支持并不好。它对方形的托盘图标显示没问题,但是对于 Workrave 这样的长矩形托盘也只能显示个方形,显示不全。
  2. 用鼠标激活窗口时,任务栏上的窗口才显示被激活的状态,用快捷键激活窗口时,任务栏上所有的窗口都没有被激活的状态。
我于是试了下 Xfce4-panel,效果几乎完美。Tint2 的那两个问题都解决了。 而且对工作区的显示非常棒,你看截图右下角的工作区显示。 可能美中不足的就是它是 Xfce4 的组件,不能独立安装,也不能独立调节它的显示外观。希望朋友们提出更好的方案。

《SED 单行脚本快速参考》的 awk 实现

sed 和 awk 都是 Linux 下常用的流编辑器,他们各有各的特色,本文并不是要做什么对比,而是权当好玩,把《SED 单行脚本快速参考》这文章,用 awk 做了一遍~ 至于孰好孰坏,那真是很难评论了。一般来说,sed 的命令会更短小一些,同时也更难读懂;而 awk 稍微长点,但是 if、while 这样的,逻辑性比较强,更加像“程序”。到底喜欢用哪个,就让各位看官自己决定吧!
文本间隔:
# 在每一行后面增加一空行
sed G
awk '{printf("%s\n\n",$0)}'
# 将原来的所有空行删除并在每一行后面增加一空行。
# 这样在输出的文本中每一行后面将有且只有一空行。
sed '/^$/d;G'
awk '!/^$/{printf("%s\n\n",$0)}'
# 在每一行后面增加两行空行
sed 'G;G'
awk '{printf("%s\n\n\n",$0)}'
# 将第一个脚本所产生的所有空行删除(即删除所有偶数行)
sed 'n;d'
awk '{f=!f;if(f)print $0}'
# 在匹配式样“regex”的行之前插入一空行
sed '/regex/{x;p;x;}'
awk '{if(/regex/)printf("\n%s\n",$0);else print $0}'
# 在匹配式样“regex”的行之后插入一空行
sed '/regex/G'
awk '{if(/regex/)printf("%s\n\n",$0);else print $0}'
# 在匹配式样“regex”的行之前和之后各插入一空行
sed '/regex/{x;p;x;G;}'
awk '{if(/regex/)printf("\n%s\n\n",$0);else print $0}'
编号:
# 为文件中的每一行进行编号(简单的左对齐方式)。这里使用了“制表符”
# (tab,见本文末尾关于’\t’的用法的描述)而不是空格来对齐边缘。
sed = filename | sed 'N;s/\n/\t/'
awk '{i++;printf("%d\t%s\n",i,$0)}'
# 对文件中的所有行编号(行号在左,文字右端对齐)。
sed = filename | sed 'N; s/^/     /; s/ *\(.\{6,\}\)\n/\1  /'
awk '{i++;printf("%6d  %s\n",i,$0)}'
# 对文件中的所有行编号,但只显示非空白行的行号。
sed '/./=' filename | sed '/./N; s/\n/ /'
awk '{i++;if(!/^$/)printf("%d %s\n",i,$0);else print}'
# 计算行数 (模拟 “wc -l”)
sed -n '$='
awk '{i++}END{print i}'
文本转换和替代:
# Unix环境:转换DOS的新行符(CR/LF)为Unix格式。
sed 's/.$//'                     # 假设所有行以CR/LF结束
sed 's/^M$//'                    # 在bash/tcsh中,将按Ctrl-M改为按Ctrl-V
sed 's/\x0D$//'                  # ssed、gsed 3.02.80,及更高版本
awk '{sub(/\x0D$/,"");print $0}'
# Unix环境:转换Unix的新行符(LF)为DOS格式。
sed "s/$/`echo -e \\\r`/"        # 在ksh下所使用的命令
sed 's/$'"/`echo \\\r`/"         # 在bash下所使用的命令
sed "s/$/`echo \\\r`/"           # 在zsh下所使用的命令
sed 's/$/\r/'                    # gsed 3.02.80 及更高版本
awk '{printf("%s\r\n",$0)}'
# DOS环境:转换Unix新行符(LF)为DOS格式。
sed "s/$//"                      # 方法 1
sed -n p                         # 方法 2
DOS环境的略过
# DOS环境:转换DOS新行符(CR/LF)为Unix格式。
# 下面的脚本只对UnxUtils sed 4.0.7 及更高版本有效。要识别UnxUtils版本的
# sed可以通过其特有的“–text”选项。你可以使用帮助选项(“–help”)看
# 其中有无一个“–text”项以此来判断所使用的是否是UnxUtils版本。其它DOS
# 版本的的sed则无法进行这一转换。但可以用“tr”来实现这一转换。
sed "s/\r//" infile >outfile     # UnxUtils sed v4.0.7 或更高版本
tr -d \r outfile        # GNU tr 1.22 或更高版本
DOS环境的略过
# 将每一行前导的“空白字符”(空格,制表符)删除
# 使之左对齐
sed 's/^[ \t]*//'                # 见本文末尾关于'\t'用法的描述
awk '{sub(/^[ \t]+/,"");print $0}'
# 将每一行拖尾的“空白字符”(空格,制表符)删除
sed 's/[ \t]*$//'                # 见本文末尾关于'\t'用法的描述
awk '{sub(/[ \t]+$/,"");print $0}'
# 将每一行中的前导和拖尾的空白字符删除
sed 's/^[ \t]*//;s/[ \t]*$//'
awk '{sub(/^[ \t]+/,"");sub(/[ \t]+$/,"");print $0}'
# 在每一行开头处插入5个空格(使全文向右移动5个字符的位置)
sed 's/^/     /'
awk '{printf("     %s\n",$0)}'
# 以79个字符为宽度,将所有文本右对齐
# 78个字符外加最后的一个空格
sed -e :a -e 's/^.\{1,78\}$/ &/;ta'
awk '{printf("%79s\n",$0)}'
# 以79个字符为宽度,使所有文本居中。在方法1中,为了让文本居中每一行的前
# 头和后头都填充了空格。 在方法2中,在居中文本的过程中只在文本的前面填充
# 空格,并且最终这些空格将有一半会被删除。此外每一行的后头并未填充空格。
sed  -e :a -e 's/^.\{1,77\}$/ & /;ta'                     # 方法1
sed  -e :a -e 's/^.\{1,77\}$/ &/;ta' -e 's/\( *\)\1/\1/'  # 方法2
awk '{for(i=0;i<39-length($0)/2;i++)printf(" ");printf("%s\n",$0)}'  #相当于上面的方法二
# 在每一行中查找字串“foo”,并将找到的“foo”替换为“bar”
sed 's/foo/bar/'                 # 只替换每一行中的第一个“foo”字串
sed 's/foo/bar/4'                # 只替换每一行中的第四个“foo”字串
sed 's/foo/bar/g'                # 将每一行中的所有“foo”都换成“bar”
sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # 替换倒数第二个“foo”
sed 's/\(.*\)foo/\1bar/'            # 替换最后一个“foo”
awk '{gsub(/foo/,"bar");print $0}'   # 将每一行中的所有“foo”都换成“bar”
# 只在行中出现字串“baz”的情况下将“foo”替换成“bar”
sed '/baz/s/foo/bar/g'
awk '{if(/baz/)gsub(/foo/,"bar");print $0}'
# 将“foo”替换成“bar”,并且只在行中未出现字串“baz”的情况下替换
sed '/baz/!s/foo/bar/g'
awk '{if(/baz$/)gsub(/foo/,"bar");print $0}'
# 不管是“scarlet”“ruby”还是“puce”,一律换成“red”
sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g'  #对多数的sed都有效
gsed 's/scarlet\|ruby\|puce/red/g'               # 只对GNU sed有效
awk '{gsub(/scarlet|ruby|puce/,"red");print $0}'
# 倒置所有行,第一行成为最后一行,依次类推(模拟“tac”)。
# 由于某些原因,使用下面命令时HHsed v1.5会将文件中的空行删除
sed '1!G;h;$!d'               # 方法1
sed -n '1!G;h;$p'             # 方法2
awk '{A[i++]=$0}END{for(j=i-1;j>=0;j--)print A[j]}'
# 将行中的字符逆序排列,第一个字成为最后一字,……(模拟“rev”)
sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'
awk '{for(i=length($0);i>0;i--)printf("%s",substr($0,i,1));printf("\n")}'
# 将每两行连接成一行(类似“paste”)
sed '$!N;s/\n/ /'
awk '{f=!f;if(f)printf("%s",$0);else printf(" %s\n",$0)}'
# 如果当前行以反斜杠“\”结束,则将下一行并到当前行末尾
# 并去掉原来行尾的反斜杠
sed -e :a -e '/\\$/N; s/\\\n//; ta'
awk '{if(/\\$/)printf("%s",substr($0,0,length($0)-1));else printf("%s\n",$0)}'
# 如果当前行以等号开头,将当前行并到上一行末尾
# 并以单个空格代替原来行头的“=”
sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D'
awk '{if(/^=/)printf(" %s",substr($0,2));else printf("%s%s",a,$0);a="\n"}END{printf("\n")}'
# 为数字字串增加逗号分隔符号,将“1234567”改为“1,234,567”
gsed ':a;s/\B[0-9]\{3\}\>/,&/;ta'                     # GNU sed
sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta'  # 其他sed
#awk的正则没有后向匹配和引用,搞的比较狼狈,呵呵。
awk '{while(match($0,/[0-9][0-9][0-9][0-9]+/)){$0=sprintf("%s,%s",substr($0,0,RSTART+RLENGTH-4),substr($0,RSTART+RLENGTH-3))}print $0}'
# 为带有小数点和负号的数值增加逗号分隔符(GNU sed)
gsed -r ':a;s/(^|[^0-9.])([0-9]+)([0-9]{3})/\1\2,\3/g;ta'
#和上例差不多
awk '{while(match($0,/[^\.0-9][0-9][0-9][0-9][0-9]+/)){$0=sprintf("%s,%s",substr($0,0,RSTART+RLENGTH-4),substr($0,RSTART+RLENGTH-3))}print $0}'
# 在每5行后增加一空白行 (在第5,10,15,20,等行后增加一空白行)
gsed '0~5G'                      # 只对GNU sed有效
sed 'n;n;n;n;G;'                 # 其他sed
awk '{print $0;i++;if(i==5){printf("\n");i=0}}'
选择性地显示特定行:
# 显示文件中的前10行 (模拟“head”的行为)
sed 10q
awk '{print;if(NR==10)exit}'
# 显示文件中的第一行 (模拟“head -1”命令)
sed q
awk '{print;exit}'
# 显示文件中的最后10行 (模拟“tail”)
sed -e :a -e '$q;N;11,$D;ba'
#用awk干这个有点亏,得全文缓存,对于大文件肯定很慢
awk '{A[NR]=$0}END{for(i=NR-9;i<=NR;i++)print A[i]}'
# 显示文件中的最后2行(模拟“tail -2”命令)
sed '$!N;$!D'
awk '{A[NR]=$0}END{for(i=NR-1;i<=NR;i++)print A[i]}'
# 显示文件中的最后一行(模拟“tail -1”)
sed '$!d'                        # 方法1
sed -n '$p'                      # 方法2
#这个比较好办,只存最后一行了。
awk '{A=$0}END{print A}'
# 显示文件中的倒数第二行
sed -e '$!{h;d;}' -e x              # 当文件中只有一行时,输出空行
sed -e '1{$q;}' -e '$!{h;d;}' -e x  # 当文件中只有一行时,显示该行
sed -e '1{$d;}' -e '$!{h;d;}' -e x  # 当文件中只有一行时,不输出
#存两行呗(当文件中只有一行时,输出空行)
awk '{B=A;A=$0}END{print B}'
# 只显示匹配正则表达式的行(模拟“grep”)
sed -n '/regexp/p'               # 方法1
sed '/regexp/!d'                 # 方法2
awk '/regexp/{print}'
# 只显示“不”匹配正则表达式的行(模拟“grep -v”)
sed -n '/regexp/!p'              # 方法1,与前面的命令相对应
sed '/regexp/d'                  # 方法2,类似的语法
awk '!/regexp/{print}'
# 查找“regexp”并将匹配行的上一行显示出来,但并不显示匹配行
sed -n '/regexp/{g;1!p;};h'
awk '/regexp/{print A}{A=$0}'
# 查找“regexp”并将匹配行的下一行显示出来,但并不显示匹配行
sed -n '/regexp/{n;p;}'
awk '{if(A)print;A=0}/regexp/{A=1}'
# 显示包含“regexp”的行及其前后行,并在第一行之前加上“regexp”所在行的行号 (类似“grep -A1 -B1”)
sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}' -e h
awk '{if(F)print;F=0}/regexp/{print NR;print b;print;F=1}{b=$0}'
# 显示包含“AAA”、“BBB”和“CCC”的行(任意次序)
sed '/AAA/!d; /BBB/!d; /CCC/!d'   # 字串的次序不影响结果
awk '{if(match($0,/AAA/) && match($0,/BBB/) && match($0,/CCC/))print}'
# 显示包含“AAA”、“BBB”和“CCC”的行(固定次序)
sed '/AAA.*BBB.*CCC/!d'
awk '{if(match($0,/AAA.*BBB.*CCC/))print}'
# 显示包含“AAA”“BBB”或“CCC”的行 (模拟“egrep”)
sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d    # 多数sed
gsed '/AAA\|BBB\|CCC/!d'                        # 对GNU sed有效
awk '/AAA/{print;next}/BBB/{print;next}/CCC/{print}'
awk '/AAA|BBB|CCC/{print}'
# 显示包含“AAA”的段落 (段落间以空行分隔)
# HHsed v1.5 必须在“x;”后加入“G;”,接下来的3个脚本都是这样
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;'
awk 'BEGIN{RS=""}/AAA/{print}'
awk -vRS= '/AAA/{print}'
# 显示包含“AAA”“BBB”和“CCC”三个字串的段落 (任意次序)
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d'
awk -vRS= '{if(match($0,/AAA/) && match($0,/BBB/) && match($0,/CCC/))print}'
# 显示包含“AAA”、“BBB”、“CCC”三者中任一字串的段落 (任意次序)
sed -e '/./{H;$!d;}' -e 'x;/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d
gsed '/./{H;$!d;};x;/AAA\|BBB\|CCC/b;d'         # 只对GNU sed有效
awk -vRS= '/AAA|BBB|CCC/{print "";print}'
# 显示包含65个或以上字符的行
sed -n '/^.\{65\}/p'
cat ll.txt | awk '{if(length($0)>=65)print}'
# 显示包含65个以下字符的行
sed -n '/^.\{65\}/!p'            # 方法1,与上面的脚本相对应
sed '/^.\{65\}/d'                # 方法2,更简便一点的方法
awk '{if(length($0)<=65)print}'
# 显示部分文本——从包含正则表达式的行开始到最后一行结束
sed -n '/regexp/,$p'
awk '/regexp/{F=1}{if(F)print}'
# 显示部分文本——指定行号范围(从第8至第12行,含8和12行)
sed -n '8,12p'                   # 方法1
sed '8,12!d'                     # 方法2
awk '{if(NR>=8 && NR<12)print}'
# 显示第52行
sed -n '52p'                     # 方法1
sed '52!d'                       # 方法2
sed '52q;d'                      # 方法3, 处理大文件时更有效率
awk '{if(NR==52){print;exit}}'
# 从第3行开始,每7行显示一次
gsed -n '3~7p'                   # 只对GNU sed有效
sed -n '3,${p;n;n;n;n;n;n;}'     # 其他sed
awk '{if(NR==3)F=1}{if(F){i++;if(i%7==1)print}}'
# 显示两个正则表达式之间的文本(包含)
sed -n '/Iowa/,/Montana/p'       # 区分大小写方式
awk '/Iowa/{F=1}{if(F)print}/Montana/{F=0}'
选择性地删除特定行:
# 显示通篇文档,除了两个正则表达式之间的内容
sed '/Iowa/,/Montana/d'
awk '/Iowa/{F=1}{if(!F)print}/Montana/{F=0}'
# 删除文件中相邻的重复行(模拟“uniq”)
# 只保留重复行中的第一行,其他行删除
sed '$!N; /^\(.*\)\n\1$/!P; D'
awk '{if($0!=B)print;B=$0}'
# 删除文件中的重复行,不管有无相邻。注意hold space所能支持的缓存大小,或者使用GNU sed。
sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P'  #bones7456注:我这里此命令并不能正常工作
awk '{if(!($0 in B))print;B[$0]=1}'
# 删除除重复行外的所有行(模拟“uniq -d”)
sed '$!N; s/^\(.*\)\n\1$/\1/; t; D'
awk '{if($0==B && $0!=l){print;l=$0}B=$0}'
# 删除文件中开头的10行
sed '1,10d'
awk '{if(NR>10)print}'
# 删除文件中的最后一行
sed '$d'
#awk在过程中并不知道文件一共有几行,所以只能通篇缓存,大文件可能不适合,下面两个也一样
awk '{B[NR]=$0}END{for(i=0;i<=NR-1;i++)print B[i]}'
# 删除文件中的最后两行
sed 'N;$!P;$!D;$d'
awk '{B[NR]=$0}END{for(i=0;i<=NR-2;i++)print B[i]}'
# 删除文件中的最后10行
sed -e :a -e '$d;N;2,10ba' -e 'P;D'   # 方法1
sed -n -e :a -e '1,10!{P;N;D;};N;ba'  # 方法2
awk '{B[NR]=$0}END{for(i=0;i<=NR-10;i++)print B[i]}'
# 删除8的倍数行
gsed '0~8d'                           # 只对GNU sed有效
sed 'n;n;n;n;n;n;n;d;'                # 其他sed
awk '{if(NR%8!=0)print}' |head
# 删除匹配式样的行
sed '/pattern/d'                      # 删除含pattern的行。当然pattern可以换成任何有效的正则表达式
awk '{if(!match($0,/pattern/))print}'
# 删除文件中的所有空行(与“grep ‘.’ ”效果相同)
sed '/^$/d'                           # 方法1
sed '/./!d'                           # 方法2
awk '{if(!match($0,/^$/))print}'
# 只保留多个相邻空行的第一行。并且删除文件顶部和尾部的空行。
# (模拟“cat -s”)
sed '/./,/^$/!d'        #方法1,删除文件顶部的空行,允许尾部保留一空行
sed '/^$/N;/\n$/D'      #方法2,允许顶部保留一空行,尾部不留空行
awk '{if(!match($0,/^$/)){print;F=1}else{if(F)print;F=0}}'  #同上面的方法2
# 只保留多个相邻空行的前两行。
sed '/^$/N;/\n$/N;//D'
awk '{if(!match($0,/^$/)){print;F=0}else{if(F<2)print;F++}}'
# 删除文件顶部的所有空行
sed '/./,$!d'
awk '{if(F || !match($0,/^$/)){print;F=1}}'
# 删除文件尾部的所有空行
sed -e :a -e '/^\n*$/{$d;N;ba' -e '}'  # 对所有sed有效
sed -e :a -e '/^\n*$/N;/\n$/ba'        # 同上,但只对 gsed 3.02.*有效
awk '/^.+$/{for(i=l;i
# 删除每个段落的最后一行
sed -n '/^$/{p;h;};/./{x;/./p;}'
#很长,很ugly,应该有更好的办法
awk -vRS= '{B=$0;l=0;f=1;while(match(B,/\n/)>0){print substr(B,l,RSTART-l-f);l=RSTART;sub(/\n/,"",B);f=0};print ""}'
特殊应用:
# 移除手册页(man page)中的nroff标记。在Unix System V或bash shell下使
# 用’echo’命令时可能需要加上 -e 选项。
sed "s/.`echo \\\b`//g"    # 外层的双括号是必须的(Unix环境)
sed 's/.^H//g'             # 在bash或tcsh中, 按 Ctrl-V 再按 Ctrl-H
sed 's/.\x08//g'           # sed 1.5,GNU sed,ssed所使用的十六进制的表示方法
awk '{gsub(/.\x08/,"",$0);print}'
# 提取新闻组或 e-mail 的邮件头
sed '/^$/q'                # 删除第一行空行后的所有内容
awk '{print}/^$/{exit}'
# 提取新闻组或 e-mail 的正文部分
sed '1,/^$/d'              # 删除第一行空行之前的所有内容
awk '{if(F)print}/^$/{F=1}'
# 从邮件头提取“Subject”(标题栏字段),并移除开头的“Subject:”字样
sed '/^Subject: */!d; s///;q'
awk '/^Subject:.*/{print substr($0,10)}/^$/{exit}'
# 从邮件头获得回复地址
sed '/^Reply-To:/q; /^From:/h; /./d;g;q'
#好像是输出第一个Reply-To:开头的行?From是干啥用的?不清楚规则。。
awk '/^Reply-To:.*/{print;exit}/^$/{exit}'
# 获取邮件地址。在上一个脚本所产生的那一行邮件头的基础上进一步的将非电邮地址的部分剃除。(见上一脚本)
sed 's/ *(.*)//; s/>.*//; s/.*[:<] *//'
#取尖括号里的东西吧?
awk -F'[<>]+' '{print $2}'
# 在每一行开头加上一个尖括号和空格(引用信息)
sed 's/^/> /'
awk '{print "> " $0}'
# 将每一行开头处的尖括号和空格删除(解除引用)
sed 's/^> //'
awk '/^> /{print substr($0,3)}'
# 移除大部分的HTML标签(包括跨行标签)
sed -e :a -e 's/<[^>]*>//g;/<[^>]*>/,"",$0);print}'
# 将分成多卷的uuencode文件解码。移除文件头信息,只保留uuencode编码部分。
# 文件必须以特定顺序传给sed。下面第一种版本的脚本可以直接在命令行下输入;
# 第二种版本则可以放入一个带执行权限的shell脚本中。(由Rahul Dhesi的一
# 个脚本修改而来。)
sed '/^end/,/^begin/d' file1 file2 ... fileX | uudecode   # vers. 1
sed '/^end/,/^begin/d' "$@" | uudecode                    # vers. 2
#我不想装个uudecode验证,大致写个吧
awk '/^end/{F=0}{if(F)print}/^begin/{F=1}' file1 file2 ... fileX
# 将文件中的段落以字母顺序排序。段落间以(一行或多行)空行分隔。GNU sed使用
# 字元“\v”来表示垂直制表符,这里用它来作为换行符的占位符——当然你也可以
# 用其他未在文件中使用的字符来代替它。
sed '/./{H;d;};x;s/\n/={NL}=/g' file | sort | sed '1s/={NL}=//;s/={NL}=/\n/g'
gsed '/./{H;d};x;y/\n/\v/' file | sort | sed '1s/\v//;y/\v/\n/'
awk -vRS= '{gsub(/\n/,"\v",$0);print}' ll.txt | sort | awk '{gsub(/\v/,"\n",$0);print;print ""}'
# 分别压缩每个.TXT文件,压缩后删除原来的文件并将压缩后的.ZIP文件
# 命名为与原来相同的名字(只是扩展名不同)。(DOS环境:“dir /b”
# 显示不带路径的文件名)。
echo @echo off >zipup.bat
dir /b *.txt | sed "s/^\(.*\)\.TXT/pkzip -mo \1 \1.TXT/" >>zipup.bat
DOS 环境再次略过,而且我觉得这里用 bash 的参数 ${i%.TXT}.zip 替换更帅。
下面的一些 SED 说明略过,需要的朋友自行查看原文。
{ Source. Thanks bones7456. }

基于 GTK+ 和 Curl 的下载软件 -- Uget

依赖很少,功能完整。这就是我对 Uget 的感受。
希望在 Linux 下使用像 FlashGet 一样的下载程序,怎奈 wxDownloadFast 和 D4x 许久不更新(还记得开发奔流的作者开发过一款下载软件?名字忘了),Gwget 需要一些 GNOME 库,kget需要一些 QT 库。而 Uget 进入了我的视野。



Uget 过去曾命名为 urlgfe,更名的同时增强了很多,个人喜欢的特点:像 FlashGet 一样的基于通配符的批量下载;每个下载分类都可有自定义的配置;下载后的内容通过右键可以方便的打开,删除(记录或连带删除数据);有回收站管 理;Firefox 的 Flashgot 内置支持。
今天看 Gentoo 的更新,发现 Uget 1.5 已经进入了 Portage,就在此推荐一下,若正在使用 Gentoo 又恰好已经有了 GTK+, Uget 是个不错的下载管理器。
{ Thanks guest. }

2009/12/03

X 系统的相关命令


X 系统提供了一些丰富的命令,利用这些命令可以方便的完成某些有用的工作。 xset 设置 X 系统的方方面面, 比如设置 bell 响玲的声音大小,设置键盘的重复率,绿色能源控制,字体路径,键盘 led 灯的状态, 鼠标的左右手习惯,设置屏幕保护参数等。
例如我在开机的时候执行下面命令来设置鼠标的灵敏度:
xset m 4/2 4
用下面的命令来让屏幕关闭:
xset dpms force off
再配合 slock 命令,这样就完全黑屏锁住了屏幕,而且消耗资源最少。
另外还有一个 xmodmap 命令,可以对键盘映射进行重新布局。比如用下面的命令把 Windows 键转换成 Ctrl 键来用。

remove mod4 = Super_L
add Control = Super_L

另外还有 xsetroot,xhost 等很多命令,希望能抛砖引玉,番茄鸡蛋也可。

2009/11/12

GiftWrap: 轻松创建 .deb 包

GiftWrap 通过图形化的向导界面一步步的引导你创建供 Ubuntu 使用的 .deb 二进制包,在填入 Debian 包的相关信息后,该程序将为你自动构建包,最终你将获得 .deb 及 .orig.tar.gz 等相关文件。



GiftWrap 提供有源码包和 deb 包,可从其官方网站的下载页面获取。
原文链接:http://linuxtoy.org/archives/giftwrap.html


Uzbl: 极度简约的网络浏览器


Uzbl 是一个很新的网络浏览器,目前正在活跃开发中,虽然眼下它连 Alpha 阶段都没达到,但通过笔者这些天的试用来看,它已经具有一定的可用性,且也足够稳定,感兴趣的同学大可一试。我推荐 Uzbl,主要因为以下几个方面令我产生兴趣:
  • 遵循 Unix 哲学开发而成,Uzbl 专注于浏览本身,包括书签、历史、下载等在内的功能通过外部脚本来完成。
  • 从 Vi/Vim/Vimperator 身上借鉴了许多,比如:命令/插入模式、Vi/Emacs 风格的键盘绑定、访问链接的 hints 模式等。
  • 界面极度简约,没有菜单栏/工具栏/地址栏这些元素,除了内容渲染区外,仅包含状态行(也可隐藏)。
  • 完全可配置,配置文件及数据文件基于 plaintext。
  • 渲染核心为 WebKit,速度相当快。
  • 获取并安装 Uzbl 可参考其官网的 Get 页面。

Tilda —— 嵌入桌面的透明终端


Tilda ,是一个第三方的 系统终端工具,相比ubuntu自带的终端,最大的特点就是:它能够完全嵌入桌面,嘿嘿,这点,对于一个系统美化疯子,比如我这样的,非常具有诱惑力喔~除此之外,它还具有如下一些功能:

* 可以自定义呼出热键。这能够让你若用即显,不用则隐,非常方便。
* 能够嵌入桌面。我曾让其他的终端程序达到同样的目的,但往往无法直接实现,需要借助于第三方的工具。
* 背景透明。这个特性连同上一个特性,能够使你的终端与整个桌面融为一体。
* 动画效果。在显示或隐藏终端窗口时有个过渡的动画效果,不会突然弹出来把人吓一跳。
* 具有标签功能。这可以让你不必同时启动多个终端实例程序,一个不够,再开标签即可。
* 窗口大小可定制。对于窗口的大小、位置都可以定制
如果你也想体验下这个嵌入桌面的终端,就跟我一起来吧。配置,就分2部分:安装,设置
一. 软件安装
简单到姥姥家了,源里面就有,直接: sudo apt-get install tilda,安装完了就退出好了。
如果万一你终端提示找不到包,那就去“新立德软件包管理器”里面搜索,也能找到的。
二. 简单设置
从“应用程序”—“附件”,来运行 Tilda 吧。这里不用截图吧
首次运行,就会直接弹出软件设置对话框,如图:
2009年6月9日 - East - eastnux

这里,我们需要根据自己的情况,进行写简单的设置。我以自己的配置为例,来简单讲解下。
1. 常规
(1) 让这个终端,在所有的桌面上显示,选中:“在所有工作空间上显示
(2) 为了编辑使用方便,我选中了“置顶”,这样每次调出终端后,它就位于其他窗口的上面,直接可以输入东西了。
(3) 因为我后面,要把 Tilda 加为系统启动,所以,如果它每次开机启动,都显示透明的背景,就比较麻烦了,因此,我选中了:“Tilda启动后隐藏”。
其实我觉得大家都应该选中这个,因为我建议大家把Tilda设置为开机启动启动,这样开机后,tilda就在后台运行着呢,每次想用,可以用快捷键自动调用(快捷键的设置后面会说到)
(4) 字体。毕竟是要嵌入到桌面的,有可能因为你的壁纸太花哨,终端里面的字就看不清了,因此,如果你看不清字,就自己设置个字体吧,我设置了一个粗体,看着比较舒服了,字大小设置成了12。
2。外观
这里是设置Tilda终端窗口,在桌面上的具体位置的。大家可以直接按照我的图,进行设置,我的图设置好,是处于桌面“中央”的。
(1)高度  宽度,是设置终端窗口的“大小”;位置,是设置终端窗口在桌面的具体位置。
(2)启用透明,嘿嘿,我是美化狂人,当然要“启用透明”了,透明度,自己选择吧,数值越大,越透明,最大值是 90。(但还不是完全彻底透明,这个有点郁闷。。。。。)
(3) 动画方向。刚才说了你按快捷键弹出终端窗口的时候,是有个小小的动画过渡效果的,从“上下左右”,4个方向弹出,我喜欢从“左边”弹出。自己都试试看效果吧~
2009年6月9日 - East - eastnux

3. 颜色
这里没什么特别的,可以自己设置下“终端文字的颜色”和“终端背景颜色”(如果你透明了,这个背景颜色就没用了,不需要管它)。
4. 键绑定。这个就是快捷键设置拉。按下“捕捉键绑定”后,自己按个组合键位吧,用来呼出Tilda。我设置的是alt-Q
行了,基本的设置就这些了,已经可以用了,透明的嵌入桌面的,随叫随到的终端,嘿嘿~看看图吧~
2009年6月9日 - East - eastnux

三. 设置成开机启动启动
方法:打开“系统”-“首选项”-“启动程序”,点击:“添加”,名称随便输入,命令,就输入:tilda,就行了,描述写不写随便。看图吧~,很简单的。
2009年6月9日 - East - eastnux

2009/11/08

家庭数字助手Amahi4.2发布[图]


转载自Osss.cn 开源社区

Amahi,一款处理一系列家庭用应用软件的开源系统,叫“家庭数字助手”(HDS)可以让一些使用在家庭和家庭网络工作可以像使用PDA一样简单。最近发布了Amahi 4.2。
HDA可以管理诸如下面的任务:
  • 网络工作备份
  • 共享网络存储
  • 牢固的VPN连接
  • 分享应用软件
  • 日历
  • Wiki
  • 打印服务器
Amahi 4.2 这里下载

音频数据流




非常棒的日历




文件共享



动态DNS




优质网络




监视磁盘



搜索你的资料




集成OutLook




插件应用程序




iCal集成




开源,基于Fedora




Vista日历集成




私人WIKI




VPN




简单备份



dhcp的高级配置应用


最近在搞dhcp服务器,多网段,还有option的几个选项,成功后贴出我的配置,和大家分享,不足之处还请大家多多指点。
红帽系(包括fedora)的dhcpd配置文件一般都是/etc/dhcpd.conf ,其租约文件一般是/var/lib/dhcpd/dhcpd.leases
启动命令/etc/init.d/dhcpd restart 或 service dhcpd restart,再基础点的东西我就不说了,大家可以自己看书或上网搜资料。以下是我的/etc/dhcpd.conf 配置:
[root@ zeyark]# more /etc/dhcpd.conf
# DHCP Server Configuration file.
# see /usr/share/doc/dhcp*/dhcpd.conf.sample
ddns-update-style interim; # ddns-update-style (none|interim|ad-hoc):定义所支持的DNS动态更新类型,该参数 #必选且必须放在第一行且只能在全局配置中使用。
allow client-updates; #允许/忽略客户机更新DNS记录
option classless-static-routes code 121 = array of unsigned integer 8; #定义能根据option 121 (RFC 3442)下发路由
set vendor-string = option vendor-class-identifier; #使能在租约文件下看到设备标识(option 60)
shared-network DHCPnet { #定义广域共享的DHCP网络
subnet 192.168.1.0 netmask 255.255.255.0 {} #这个子网是你启用dhcpd服务网卡的IP地址所在的子网 例如,你服务器 上网 #卡配的IP地址为192.168.1.121 掩码24,192.168.1.0为这个子网的网络地址 #不配这个启动DHCP服务会有问题,会提示错误,不知 subnet 192.168.1.0 #netmask 255.255.255.0 {}这个网段,这个其实是你服务器网卡地址的网段 #划分子网(变长子网)请自行学习,这里不多讲。
option domain-name “zeyark.net”; #定义一个域名
option domain-name-servers 192.168.1.65 ; # 域名服务器的地址
default-lease-time 86400; #默认租约时间
max-lease-time 172800; #最大租约时间
subnet 172.20.0.0 netmask 255.255.255.0 { #定义多子网地址池这是其中的一个
option routers 172.20.0.1; #下发IP地址的时候的子网地址池网关
option subnet-mask 255.255.255.0; #地址池的子网掩码
option broadcast-address 172.20.0.255; #地址池的广播地址
option classless-static-routes 24,192,168,0, 172,20,0,1, #静态路由中的一种,option121,表示方法比较变态 28,59,52,114,96, 172,20,0,1, 29,59,52,114,120, 172,20,0,1; #其中24,192,168,0, 24是掩码,192,168,0,是网段
} #注意,这里都是逗号,不是点号。我说的变态就是说这个
subnet 172.11.0.0 netmask 255.255.255.0 { #定义另一个地址池
range 172.11.0.2 172.11.0.127;
option routers 172.11.0.1;
option subnet-mask 255.255.255.0;
option broadcast-address 172.11.0.255;
option classless-static-routes 24,192,168,0, 172,11,0,1,
28,59,52,114,96, 172,11,0,1, 29,59,52,114,120, 172,11,0,1;
}
subnet 172.21.0.0 netmask 255.255.255.0 { #定义另一个地址池
range 172.21.0.2 172.21.0.127;
option routers 172.21.0.1;
option subnet-mask 255.255.255.0;
option broadcast-address 172.21.0.255;
option classless-static-routes 24,192,168,0, 172,21,0,1,
28,59,52,114,96, 172,21,0,1, 29,59,52,114,120, 172,21,0,1;
}
subnet 172.16.11.0 netmask 255.255.255.0 { #定义另一个地址池
class “foo” {
match if substring (option vendor-class-identifier, 0, 31) = “H3C. H3C ICG2000,\”dslforum.org\”";
} #定义一个类,按设备标识下发IP地址,即传说中的option 60
pool { #定义一个池,允许设备属于class “foo”这个类的设备获取range #172.16.11.2 172.16.11.127;的地址
allow members of “foo”;
range 172.16.11.2 172.16.11.127;
}
pool { #定义一个池,禁止设备属于class “foo”这个类的设备获取range #172.16.11.128 172.16.11.254里的地址
deny members of “foo”;
range 172.16.11.128 172.16.11.254;
}
option routers 172.16.11.1;
option subnet-mask 255.255.255.0;
option broadcast-address 172.16.11.255;
option classless-static-routes 24,192,168,0, 172,16,11,1,
28,59,52,114,96, 172,16,11,1, 29,59,52,114,120, 172,16,11,1;
}
}

作者:猪8戒 下凡  来自:http://www.ownlinux.cn/

2009/10/31

Ucloner 3.5.0 发布


专门针对 Ubuntu Linux 而编写的系统备份、恢复、克隆及批量部署工具 Ucloner(原名 Ubuntu-cloner)于昨日发布了新的 3.5.0 版本。Ucloner 3.5.0 添加了 Ubuntu 9.10 支持。
Ucloner
关于 Ucloner 的使用注意事项、已知问题及下载地址,可在 Ubuntu 中文论坛找到。
{ Thanks pt. }

学会使用文献管理工具


为了学习如何搜集与整理文献,我在网上查了许多资料,它们大多是经验之谈,其中不乏真知灼见,但是鲜有涉及文献管理软件的选择与使用的。我也看过一些博士写的科研心得,谈及有关文献管理方面的内容时,给出了一些较为低效的方式,譬如:
  • 下载电子版文献时(caj,pdf,html),把文章题目粘贴为文件名。
  • 不同主题存入不同文件夹。文件夹的题目要简短。
  • 看过的文献归入子文件夹,最起码要把有用的和没用的分开。
  • 重要文献根据重要程度在文件名前加001, 002, 003 之类的编号,然后按名称排列图标,最重要的文献就排在最前了。
  • ... ...
其实,有许多种文献管理软件,譬如 EndNote、NoteExpress、Biblioscape 等,可以让它们成为我们搜集与整理参考文献的好帮手。选择一款称手的文献管理软件,并积极地在文献管理中使用它,这是研究人员必做的一项功课,它们可以让你深刻感知文献的搜集与整理是一件严肃的事情。
具体有哪些文献管理软件可供你选择,由于我大部分时间是在 Linux 平台上工作,下面只介绍几款 Linux 下可供选择的文献管理软件(在 Windows 平台也可运行)。
  • JabRef: 这是一款使用 JAVA 开发的文献管理软件,可以输出BibTeX格式的文献信息。BibTeX 格式的参考文献信息文档可以由 TeX 文档中进行引用并处理生成可阅读的 PDF 文档。即使你不使用 TeX 来写论文,仅仅使用 JabRef 来管理文献也是可以的,另外借助一些工具可以将 BibTeX 格式文件转化为 MS Word 文献管理格式。
  • Bibus: 用Python写的,使用MySQL或SQLite(任选其一)数据库储存参考文献数据。它能在 OpenOffice及MS Word中直接插入引文,而无需安装宏或插件,并自动生成参考文献目录。其功能目前已与商业软件Endnote,RM接近,支持 Unicode,支持中文。
  • Zotero:这是 Firefox 的一个扩展,可以帮助你收集、管理和引用文献资料。它的主要特色就是与网页浏览器高度集成,可以很方便地保存、管理你所浏览的网页,也很容易添加阅读笔记。当然,Zotero 也可胜任一般性的文献管理,可以导出各类文献数据,并且目前已支持文献数据网络共享。
其实无论采取哪一款文献管理软件,它们通常都具备将文献信息存导出为 BibTeX 数据文件的功能,利用 BibTeX 数据文件并结合你所使用的排版软件,即可实现在文档中引用文献。这一流程如下图所示:



最后再推荐一个在线文献管理网站——新科学(http://www.xinkexue.com/) 可以进行在线文献管理,还可以撰写读书笔记,并且支持在线评论等功能。

禁用/开启 GNOME “最近的文档”功能


用的是 GNOME 桌面,如果不希望他人看到你最近都看了哪些“机密”文档,也许你会想方设法地关闭 GNOME 好意为用户默认开启的“最近的文档 (Recent Document)”功能,本文会告诉你几个常用的小伎俩。

要禁用 GNOME 菜单中的“最近的文档”功能,可以这样做:
echo "" > $HOME/.recently-used.xbel
$ chmod 400 $HOME/.recently-used.xbel
要是将来反悔,想再开启这一功能,可:
$ chmod 600 $HOME/.recently-used.xbel
利用 Linux 文件系统的小缺陷也可以实现关闭“最近的文档”功能,譬如:
$ rm $HOME/.recently-used.xbel
$ mkdir $HOME/.recently-used.xbel
还可以利用 Nautilus 的脚本 (Script) 功能让上述关闭和启用“最近的文档”更“易用”一些,只需将下述 Bash 脚本:
#!/bin/sh

# Enable/Disable Recent Documents Menu in Gnome

if [ ! -f "$HOME/.recently-used" ]then
        echo "" > "$HOME/.recently-used.xbel"
        chmod 600 "$HOME/.recently-used.xbel"
fi

if [ -w "$HOME/.recently-used.xbel" ]then
        echo "" > "$HOME/.recently-used.xbel"
        chmod 400 "$HOME/.recently-used.xbel"
        if [ "$?" = "0" ]then
                zenity --title="Disabled" --info --text="The 'Recent Documents' menu item has been disabled."
        else
                zenity --title="Error" --error --text="There was an error disabling the 'Recent Documents' menu."
        fi
elif [ -f "$HOME/.recently-used.xbel" ]then
        chmod 600 "$HOME/.recently-used.xbel"
        if [ "$?" = "0" ]then
                zenity --title="Enabled" --info --text="The 'Recent Documents' menu item has been enabled."
        else
                zenity --title="Error" --error --text="There was an error enabling the 'Recent Documents' menu."
        fi
else
        zenity --title="Error" --error --text="It appears the file '$HOME/.recently-used.xbel' does not exist and could not be created."
fi
保存到 $HOME/.gnome2/nautilus-scripts 目录,假设保存为 recent-doc 文件,并将其属性设置为:
$ chmod 755 recent-doc
 这样就可以在 Nautilus 中用鼠标右键菜单,在脚本菜单项中打开上述脚本,进行“最近的文档”功能的开启与关闭的设定。

2009/10/30

使用 totem-pps 在 Ubuntu 下完美地观看 PPS 电影


在 Ubuntu 下运行 PPS
我之前在 Ubuntu 的中文论坛里看到过不少有关使用一个 Totem 插件来观看 PPS 在线视频的帖子,而且我最近还注意到了 PPS 的官方下载页面上竟然多出了一个 Linux 版本的链接与相关安装说明。
pps-linux.png
本人作为一个热爱看中国电影的老外,只要闲着都会跑一趟图书馆去借一些中国片子。我得知有如此有用的 Totem 插件之后,就根据帖子里面的说明安装到我电脑上了。然而,我很快就发现安装上述插件的过程并非简单,需要我自己下载源代码,将其编译好。虽然我最终还是安装成功了,但是后来发现这个插件有不少缺陷,其中最主要的是你只能在 Totem 里用这个插件来浏览 PPS 所提供的在线视频而不能用浏览器直接上官方网站去找。插件的浏览界面很简单又超级慢,其电影的分类杂乱无章,也没有搜索电影功能。因此,我怎么都找不到我想看的片子,实在是太不好用了,还是算了吧!
既然在 Ubuntu 下收看在线视频如此的麻烦,所以我暂且在 Virtualbox 的虚拟机里安装了 XP 和 PPS,每次想看电影时我就会启动虚拟机,打开 PPS 后就能开始收看电影了。不过,由于我这用的是笔记本,所以每当我同时开着 Ubuntu 和 Windows,电脑就会变得非常热,内存占满,处理器忙不过来,以至于电影的画面质量大大降低,收看的体验大打折扣,我实在是看不下去了。
面临着如此大的困难,我今天又在谷歌上搜了一下,想知道有没有别的办法让我能够顺顺利利地看一些在线电影。令我吃惊的是,在一两个月的时间内,上述插件的开发者都已经发布了一个新的版本,名叫 totem-pps。这次开发者还提供了一个 DEB 的软件包,让用户能摆脱十分复杂的手动安装过程。不仅如此,开发者还编了一个非常棒的 Greasemonkey 脚本。使用 Firefox 的用户安装这个脚本后便能直接到 PPS 的官方网站上去找电影看,只要点击电影的缩略图即可,视频将在 Firefox 的窗口里自动开始播放。
总之,totem-pps 这个插件使 Ubuntu 用户能享受到一个完美的,非常便捷的收看在线视频的体验。它的功能非常丰富,性能也很强,而且如果你将它与 Greasemonkey 并用的话,搜索到你最想看的电影已经不成一个问题了。有人感兴趣的话,可以按照下面的安装步骤,自己试一下这个非常棒的 Totem 插件。
如何安装:
先把 Mingming 的 Launchpad PPA 添加到你的软件源:
将下面两行添加到 /etc/apt/sources.list/totem-pps.list
deb http://ppa.launchpad.net/portis25/ppa/ubuntu karmic main
deb-src http://ppa.launchpad.net/portis25/ppa/ubuntu karmic main
在终端中执行下面的命令来获取上述 PPA 源的密钥。
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EF666E7B1E758171B82B7C5327F5B2C1B3EAC8D9
更新软件包列表:
sudo apt-get update
安装 totem-pps 和 totem-mozilla (Totem 的 Firefox 插件):
sudo apt-get install totem-pps totem-mozilla
在 Totem 里启用 totem-pps 插件:
配置插件.png
打开 Totem(电影播放器),然后在菜单里面选:
编辑 –> 插件
在所打开的窗口里勾上 “PPS 浏览器” 此插件就可以了
在 Firefox 里安装 Greasemonkey 脚本:
你如果没有安装过 Greasemonkey,要先到此网页,安装后要重启 Firefox。
脚本的配置如下:
管理用户脚本.png
测试一下:
到 http://kan.pps.tv/ 找自己想看的电影并点开,等视频在 Firefox 的窗口中开始播放就行了。 (要等待视频缓冲完了才能开始看,等候时间根据自己的网速而定)
要想知道更多关于这个插件的开发,可以到它的Google Code页面去看看。