存档

文章标签 ‘command’

植化流程图生成脚本

2009年9月9日

RT
做植化的同学写报告的时候常常要画分离的流程图,以往大家都是拖啊拖啊的,看起来就恼火,于是就写了这样一个脚本(以后我也要画这种东西嘛),可以将简单的描述语言直接生成流程图,比如,如下的语言就可以生成如下的图:

a#草药样品
b#粗分浸膏
a#$甲醇提取=>b#
c1#正丁醇相
c2#石油醚相
c3#…
c4#水相
b#^$有机溶剂萃取
b#=>c1#
b#=>c2#
b#=>c3#
b#=>c4#
c2#^$继续柱层析分离
c2#=>d1#成分五
c2#=>d2#成分六

生成的流程图

该描述语言语法非常简单:
#前面是 node 的名字,$后面是描述,=> 将两个 node 连接起来,在其中画箭头,可以连续连接 比如 a# => b# => c# 也是可以的,node 后面 => 前面的 $xxx 是线上的注释,如果某一个点要往下分支的话只需用 node#^ 即可,node#^ 后面可以直接加注释,很简单的,看上面那个例子结合图片就可以搞明白了。

运行该脚本需要 python-yapgvb,此脚本受弯弯同学脚本的启发并参考了部分代码(http://python.ubuntu.org.cn/viewtopic.php?f=162&t=180285&sid=e2ae53902848adb1d59c375bf2325043

使用方法:

python liuchengtu.py -o xxx.png deffile

还有很多个性化选项,请参考源码。

源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
# Author: xioooli<at>yahoo.com.cn,joolix.com
# Licence GPLv2
# Version 2009.09.09
 
import sys
import yapgvb
import optparse
 
FORMATS = {"png" : yapgvb.formats.png,
        "jpg" : yapgvb.formats.jpg,
        "gif" : yapgvb.formats.gif}
ENGINES = {"dot" : yapgvb.engines.dot,
        "neato" : yapgvb.engines.neato,
        "circo" : yapgvb.engines.circo,
        "twopi" : yapgvb.engines.twopi}
 
if __name__ == '__main__':
#    args = sys.argv
#    if len(args) < 2:
#        print "Usage: python state_machine.py <def file>"
#        sys.exit(0)
 
    parser = optparse.OptionParser()
    parser.add_option("-f", "--format", dest="format",
            help="store the flow chart in FORMAT (png, svg, jpg, gif)",
            metavar="FORMAT", default="png")
    parser.add_option("-o", "--output", dest="output",
            help="save the flow chart to FILE",
            metavar="FILE")
    parser.add_option("-e", "--engine", dest="engine",
            help="the layout ENGINE to use for the flow chart (dot, neato, circo, twopi)",
            metavar="ENGINE", default="dot")
    parser.add_option("-c", "--color", dest="fillcolor",
            help="the fillcolor of the node",
            default="white")
    parser.add_option("--fs", "--font-size", dest="fontsize",
            help="the font size of the text",
            default="12")
    parser.add_option("--nfc", "--node-font-color", dest="nodefontcolor",
            help="the fillcolor of the font in node",
            default="black")
    parser.add_option("--nc", "--node-color", dest="nodecolor",
            help="the color of the node frame",
            default="black")
    parser.add_option("--ec", "--edge-color", dest="edgecolor",
            help="the color of the edge",
            default="black")
    parser.add_option("--efc", "--edge-font-color", dest="edgefontcolor",
            help="the font color of the edge text",
            default="black")
    parser.add_option("-s", "--style", dest="style",
            help="the style of the node",
            default="filled")
    parser.add_option("--ah", "--arrowhead", dest="arrowhead",
            help="the style of the arrowhead",
            default="normal")
    parser.add_option("--as", "--arrowsize", dest="arrowsize",
            help="the size of the arrow",
            default=1)
    parser.add_option("--ns", "--nodesep", dest="nodesep",
            help="the sepration between two nodes",
            default=.5)
    parser.add_option("--sp", "--shape", dest="shape",
            help="the shape of the node",
            default="box")
 
    options, args = parser.parse_args()
    if len(args) < 1:
        parser.print_usage()
        sys.exit(0)
 
    graph = yapgvb.Graph("States")
    graph.rankdir="TB"
    graph.nodesep=options.nodesep
    node_dict = {}
 
    with open(args[0]) as def_file:
        lines = [l.strip() for l in def_file.readlines()]
        for line in lines:
            nodes = line.split("=>")
            prev_node = None
            for node in nodes[::-1]:
                label = node.strip().split("#")
                if not node_dict.has_key(label[0]) and label[0] != "":
                    try:
                        lb=label[1].split("$")[0]
                    except:
                        lb=""
                    node_in_graph = graph.add_node(label=lb,
                            shape=options.shape, fillcolor=options.fillcolor,
                            fontcolor=options.nodefontcolor, fontsize=options.fontsize,
                            style=options.style, color=options.nodecolor, width=0.5)
                    node_dict[label[0]] = node_in_graph
                elif label[0] != "":
                    node_in_graph = node_dict[label[0]]
 
                try:
                       blanknode = node.strip().split("#^")
                       if len(blanknode) >= 2:
                           blanknode = blanknode[0]
                       else:
                           blanknode = ""
                except:
                       blanknode = ""
                if node_dict.has_key(blanknode) and blanknode != "":
                    node_dict[blanknode + "_0"] = node_dict[blanknode]
                    node_in_graph = graph.add_node(label="",     
                            shape="circle", fillcolor=options.edgecolor,
                            color=options.edgecolor, style="filled", height=.05, width=.05)
                    node_dict[blanknode] = node_in_graph
                    edge = node_dict[blanknode + "_0"] - node_dict[blanknode]
                    edge.color=options.edgecolor
                    try:
                        edge.label=" "+node.strip().split("$")[1]
                        edge.fontcolor=options.edgefontcolor
                        edge.fontsize=options.fontsize
                    except:
                        pass
 
                if prev_node:
                    edge = node_in_graph - prev_node
                    edge.color=options.edgecolor
                    edge.arrowhead = options.arrowhead
                    edge.arrowsize = options.arrowsize
                    try:
                        edge.label=" "+node.strip().split("$")[1]
                        edge.fontcolor=options.edgefontcolor
                        edge.fontsize=options.fontsize
                    except:
                        pass
 
                prev_node = node_in_graph
 
    graph.layout(ENGINES[options.engine])
    format = FORMATS[options.format]
    if options.output:
        out_file = options.output
    else:
        out_file = args[0] + "." + format
 
    graph.render(out_file, format)

Chemistry, Script , , ,

鼓捣 bash cgi

2009年9月1日
Comments Off

看了骨头的博文:Bash其实也可以做CGI用 也按捺不住,尝试了一把,呵呵,其他语言搞不定,bash 还是玩的转滴。

在自己电脑上面用 lighttpd 搭建了个 webserver,配置了一下,将 /etc/lighttpd.d/lighttpd.conf 里面 mod_cgi 前面的注释去掉,需要注意的是,如果你要使用 .sh 结尾的 cgi 脚本,那么需要将这行改成

static-file.exclude-extensions = ( ".php", ".pl", ".fcgi", ".sh" )

并在 cgi.assign 段添加一个

".sh" => "/bin/bash"

,写一个小脚本测试了一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/bin/bash
 
get_args() {
	local arg_txt arg
	arg_txt="$QUERY_STRING"
	for arg in `echo "$arg_txt"|tr "&" " "`; do
		arg="$(echo $arg|sed "s/%20/ /g"|ascii2uni -a J 2>/dev/null)"
		ARGS="${ARGS} $(echo $arg|sed "s/=.*$//")"
		export "$arg"
	done
}
 
echo "Content-type: text/html"
 
echo
 
echo "<HTML><HEAD>"
echo "<TITLE>Bash CGI writen by Xiooli?</TITLE>"
get_args
echo "</HEAD><BODY>"
 
echo "<B> This is XIOOLI's bash cgi </B>"
echo "<P>"
eval "$cmd"|sed "s/$/<P>/g"
for i in $ARGS; do
	echo "<P> $i=`eval echo \\$$i`"
done
echo "</BODY></HTML>"

来一个测试,url 如下: http://localhost/cgi-bin/tst.sh?hello=xiooli%E5%93%A5%E5%93%A5&kk=yy&bb=pp&cmd=who
得到结果:

This is XIOOLI’s bash cgi

xiooli :0 Aug 31 09:07

xiooli pts/0 Aug 31 09:07 (:0)

hello=xiooli哥哥

kk=yy

bb=pp

cmd=who

呵呵,好玩滴咯,以后写 cgi 就用 bash 鸟 ^^

Script ,

自动为 TEM 照片添加标尺

2009年7月7日
Comments Off

经常要做透射电镜,每次拿回结果的时候都要手工为其添加标尺(就是在图片的某一角落添加一条一定长度的直线,一般是一厘米,然后上面标注上此段长度的线条代表的实际长度,就和地图的比例尺一样),开始我使用gimp标注,一次两次倒还凑活,太多了就受不了了,于是乎决定写一个脚本来自动处理这种事(机械的活就该机器来干嘛,机器的活总是人来干的话,那咱智慧生物岂不白长了个脑袋不是?!)
挽上袖子开工,思路如下:

1) 根据放大倍数算出一定长度(这里是一厘米)代表的实际长度,以此来产生用于标注的文本。算法根据电镜老师的说明:请将图片在PHOTOSHOP中打开,将图片的尺寸改为8.1cmx5.4cm,此时,在10万倍的情况下,1cm代表100nm
2) 将原图缩小到一定尺寸(8.1cmx5.4cm)
3) 在原图上面右下角贴上文字(就是1中算出的实际尺寸)
4) 把一厘米的长度棒贴到文字下面(长度棒是事先画好的一条棒子),完工!

先是尝试了将图片缩小到8.1cmx5.4cm,结果发现图片很小,很奇怪,不过不论gimp/ps做出来的都是这个德性, 因此将图片缩小为8.1*3cmx5.4*3cm的大小,相应的长度棒也增大三倍,这下产生出来的图片就大而清晰了,呵呵 从此就不必再干这种体力活咯,来个图代表一下先:

发件人 xiooli

下面是代码(bar.tiff要自己画,长度是三厘米,这个是gimp上设的三厘米,切忌用尺子在屏幕上量出三厘米哦):

 1  #!/bin/bash
 2  #Author: xiooli <xioooli[at]yahoo.com.cn, http://joolix.com>

 3  #Licence: GPLv3
 4  #Version: 20090707
 5  #注:三个参数(第三个可选),分别是放大倍数(单位是万倍)、原文件和输出文件
 6
 7  Mag="$1"
 8  [ "$1" = "-h" ] && echo "$0 放大倍数(万倍) 原文件 输出文件(可选)" && exit

 9  Infile="$2"
10  Outfile="${3:-"fixed-`basename $2`"}"

11  #标尺图像文件的路径
12  Barpic=$HOME/.Share/bar.tiff
13  Text="`bc -l<<<"10/$Mag*100"`"

14  Text="${Text%.*} nm"
15  #文字位置
16  TextX=560

17  TextY=410
18  #文字与标尺的间距
19  Interval=9
20  Font=Times-New-Roman-Normal

21  FontSize=24
22  
23  [ ! "${#@}" -ge 2 ] && echo "参数个数不对。" && exit

24  
25  [ -f "$Infile" ] && \
26  convert -resize 689×460 "$Infile" "/dev/shm/resize-tmp.tiff"

27  
28  [ -f "/dev/shm/resize-tmp.tiff" ] && \
29  drawtext="convert -font \"$Font\" -fill black -pointsize $FontSize  -draw ‘text  ${TextX},${TextY} \"$Text\"\"/dev/shm/resize-tmp.tiff\"  \"/dev/shm/addtext-tmp.tiff\"" && eval $drawtext

30
31  [ -f "/dev/shm/addtext-tmp.tiff" -a -f "$Barpic" ] && \
32  composite -geometry "+${TextX}+$(($TextY+$Interval))" "$Barpic" \

33  "/dev/shm/addtext-tmp.tiff" "$Outfile"

Script , ,

Archlinux 下提示未安装命令

2009年7月7日

用ubuntu的时候,如果你在命令行里输入一个未安装的命令,bash会给出很人性化的提示,让你先安装xxx软件包,比如:

程序 ‘xxx’ 尚未安装。 您可以通过输入以下命令安装:
sudo apt-get install xxx

通过e-file,再经过一点设置,在gentoo里面也可以达到类似的效果(参考骨头的文章:gentoo也可以提示未安装的命令

这些都是通过重定义bash的command_not_found_handle函数来实现的,archlinux上也有一些方案,比如通过pacman -Si/pacman -Ss 来搜索的,前者只能找软件包而不能提示具体的命令,后者要通过网络实时查找。还有通过一个叫做pac-file(类似gentoo中的e-file)来找,这个命令可以从效果上完美实现这个功能,但是如果程序列表比较大或者机器慢的话,那么查找起来可能就是硬盘飞奔,CPU狂飙,而且过了一段时间后还得自己手动更新软件列表。这几种方案均不是很完美,于是俺只好自己动手,丰衣足食了,思路如下:

1) 在用pacman -Sy的时候自动更新pac-file的软件列表
2) 将所有的可执行命令项放到另一个文件里面,到时候去这里查找(因为pac-file的列表包含了软件包的所有文件项,故查找起来很慢,而我们要提示的是命令,也就是可执行文件,所以可以缩小搜索范围)

好,开工,代码如下,只需将其写到~/.bashrc里面再运行一下 . ~/.bashrc 就可以了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#pacman 简写,pacman更新同时更新pac-file并产生只含有可执行文件项的软件包列表。
pm () {
 
	if [ "`which powerpill 2>/dev/null`" ]; then
		sudo powerpill $@
	else
		sudo pacman $@
	fi
 
	arg="`sed 's/ //g;s/-//g' <<< $@`"
	[ "$arg" -a "$arg" != "${arg//Sy}" ] && {
	sudo pac-file -S
	[ -d $HOME/.Share/ ] || mkdir -p $HOME/.Share/
	pac-file bin/[^\/]+$ > $HOME/.Share/cmd.list && echo "cmd.list 已更新!"
	}
}
 
#命令未找到时的处理,从cmd.list里面去查找软件包
command_not_found_handle() {
	echo "-bash: $1: 命令未找到"
	if [ "`grep bin/$1$ $HOME/.Share/cmd.list`" ]; then
		echo "下列软件包含有命令 $1 :"
		grep bin/$1$ $HOME/.Share/cmd.list
	else
		echo "未搜索到含有命令 $1 的软件包 :("
	fi
}

现在查找速度终于快了哈,而且pacman更新同时就更新了pac-file的列表,再不用担心软件包的版本过期了^^
看看效果吧:

发件人 xiooli

Script ,

天气墙纸脚本:wallther

2009年5月11日

RT
点击下载 wallther 脚本及 icon 素材
看LinuxToy时发现了一个天气墙纸的程序,貌似依赖不少的Gnome组件,很不方便,于是就萌生了用bash脚本写一个相同功能的脚本的想法,经过几个小时的奋战终于搞定了,呵呵,主要是convert等处理图片的软件用得不熟。
这个东东可以自动去获取天气信息(你甚至都不用管城市代码,当然可能有些地方会不准),然后根据获得的天气找到对应的图标,然后将图标和天气情况的文字(是否绘制文字信息可选)合成到背景图片中去,然后将这个合成的图片设置为壁纸。
初次使用需要配置一些东西,主要就是字体,因为我用的雅黑你可能没有。
这里有一张生成的图片大家可以感受一下:

发件人 xiooli

代码见下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#!/bin/bash
#Copyright (c) 2009 xiooli (xioooli[at]yahoo.com.cn, http://joolix.com)
#Name wallther
#License: GPLv3
#Version 20090511
 
#此脚本需要安装 w3m 和 imagemagick
#城市代码,留空可自动检测(自动检测不一定精确)
#城市代码可在 http://weather.265.com 上查询,是个5位的数字
#受bones7456和wenbob的天气脚本启发。
 
#这儿是城市代码,须自己改,未赋值会自动查询。
Wid=56294
#天气图标的位置
Icondir="`dirname $0`/icons"
#欲用作背景的图片
BackPic="$Icondir/background.jpg"
#最终输出的图片位置
OutPic="/dev/shm/wallpapertmp.png"
#壁纸路径(此为 OutPic 的副本)
Wallpaper="/dev/shm/wallpaper.png"
#是否在图片上绘制文字天气信息,yes/no
DrawText="yes"
#文字的字体,若不是中文字体则中文可能无法正常显示
Font="/usr/share/fonts/winfonts/msyh.ttf"
#文字的大小
FontSize=24
#文字的颜色
TxtColor="white"
#文字信息绘制的位置
TxtPosX=700
TxtPosY=350
#隔多大距离绘制下一行(此距离包括本行的宽度)
TxtYIncr=35
#天气图标绘制的位置
PicGeometry="+650+80"
#壁纸更换的时间间隔(默认 30 分钟)
ChangeTime="30m"
 
WeatherCN=("晴" "多云" "阴" "雨" "雷阵雨" "雾" "雪" "雨夹雪")
WeatherEN=("sun" "suncloud" "cloud" "rain" "storm" "fog" "snow" "snowrain")
 
GET_WEATHER() {
	[ -z "${Wid}" ] && \
	if [ -f "/dev/shm/city" ] ;then
		Wid="$(cat /dev/shm/city)"
	else
		Wid="`wget -q -O - 'http://www.265.com/lookupcity'|awk -F "'" '{print $2}'`"
		echo ${Wid}>/dev/shm/city
	fi
	[ ! -z "${Wid}" ] && WeatherTxt="`w3m -dump "http://wap.weather.com.cn/wap/${Wid}/h24/"`"
}
 
GEN_DRAW_TEXT() {
	[ -z "${WeatherTxt}" ] && GET_WEATHER
	if [ -z "${WeatherTxt}" ]; then
		echo "未能获取天气 :("
	else
		echo "${WeatherTxt}"|sed -n "4p"|sed 's/\ .*$//'
		echo "${WeatherTxt}"|sed -n "5,9p"
	fi \
	|sed "s/^.*$/-draw \\\'text POSITION \\\"&\\\"\\\'/" \
	|while read line; do 
		echo "$line"|sed "s/POSITION/$TxtPosX,$TxtPosY/"
		((TxtPosY+=$TxtYIncr))
	done|tr "\n" " "
}
 
GEN_WEATHER_ICON() {
	local tmp weathercn index 
	[ -z "${WeatherTxt}" ] && GET_WEATHER
	[ -z "${WeatherTxt}" ] || tmp="`echo "${WeatherTxt}"|sed -n "5p"`"
	j=0; k=0
	for i in ${WeatherCN[@]}; do
		[ "${tmp//$i}" != "$tmp" ] && weathercn[$j]="$i" && index[$j]="$k" && ((j++))
		((k++))
	done
	[ "${#weathercn[@]}" -eq 0 ] && Weather[0]="unknown"
	[ "${#weathercn[@]}" -eq 1 ] && Weather[0]="${WeatherEN[${index[0]}]}"
	[ "${#weathercn[@]}" -eq 2 ] && \
	if [ "`echo $tmp|grep "${weathercn[0]}转"`" ];then
		Weather[0]="${WeatherEN[${index[0]}]}"
		Weather[1]="${WeatherEN[${index[1]}]}"
	else
		Weather[0]="${WeatherEN[${index[1]}]}"
		Weather[1]="${WeatherEN[${index[0]}]}"
	fi
	[ "${#weathercn[@]}" -eq 3 ] && \
	{
		Weather[0]="${WeatherEN[${index[0]}]}"
		Weather[1]="${WeatherEN[${index[2]}]}"
	}
	if [ "${#Weather[@]}" -ge 2 ]; then
	   convert +append "$Icondir/${Weather[0]}.png" "$Icondir/${Weather[1]}.png" /dev/shm/weathericon.png
	else
	   ln -sf "$Icondir/${Weather[0]}.png" /dev/shm/weathericon.png
	fi
}
 
GEN_WALLPAPWE() {
	GEN_WEATHER_ICON
	[ -f $BackPic ] || BackPic="$Icondir/background.jpg"
	if [ "$DrawText" = "yes" ]; then
		draw="convert -font \"$Font\" -fill $TxtColor -pointsize $FontSize `GEN_DRAW_TEXT` \"$BackPic\" \"/dev/shm/backpictmp.png\""
		eval "$draw"
		composite -geometry "$PicGeometry" /dev/shm/weathericon.png /dev/shm/backpictmp.png "$OutPic"
	else
		composite -geometry "$PicGeometry" /dev/shm/weathericon.png "$BackPic" "$OutPic"	
	fi
}
 
while :; do
	GET_WEATHER
	[ "${WeatherTxt}" != "$tmp" ] && GEN_WALLPAPWE && tmp="${WeatherTxt}"
	if [ -f "$OutPic" ];then
		mv "$OutPic" "$Wallpaper"
		gconftool-2 -s /desktop/gnome/background/picture_filename --type=string "$Wallpaper"
	fi
	sleep "$ChangeTime"
done

Script , ,

真正可以利用迅雷资源的下载脚本!

2009年4月14日

RT
首先感谢krash同学的furl,其实这个程序才是主角,furl可以从迅雷的服务器上找资源,我只是将其返回的资源交给aria2c分段从不同服务器上下载而已,脚本源码见下面:
需要furl和aria2c
其中furl可以去http://forum.ubuntu.org.cn/viewtopic.php?f=73&t=195557下载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash
#version 20090414
#Auther xiooli <xioooli@yahoo.com.cn>
#Have fun :)
 
Furl=./furl
Savedir=$HOME/Download;[ -d "$Savedir" ] || mkdir -p "$Savedir"
Initurl="$1"
if [ "$Initurl" ]; then
	>/dev/shm/urllist
	eval "$Furl \"$Initurl\" 2>/dev/null" >/dev/shm/urllist
	Count="`cat /dev/shm/urllist|wc -l`"
	Urls="`cat /dev/shm/urllist|while read url; do
		echo -n $tmp" "\\\"$url\\\"
	done`"
else
	echo "请输入一个下载链接!"
	exit
fi
echo "总共找到 $Count 个资源,开始下载..."
[ "$Urls" -a "`which aria2c 2>/dev/null`" ] && \
eval "aria2c -c -s "$Count" -d \"$Savedir\" $Urls"

速度很不错哦,我下一个东西能上700多k呢,嘿嘿

发件人 xiooli

ps:开托儿来更新自己的blog真不爽。。。

Script , ,

lrcdis的标题模式真的很棒哦

2009年3月15日

RT
可以边干活边看歌词,不用怕被挡住!

发件人 xiooli

Lrcdis ,

xsel妙用一则

2009年3月15日

最近写论文,老板只要word格式的文档,无奈之下用crossover安装了一个m$office,好倒是好,但是stardict查词就不方便了,stardict好像是通过访问鼠标选中复制的那个玩意(PRIMARY)里面来取词的,而不是通过剪贴板(CLIPBOARD),这招在wine的程序中就不管用了,因为在wine的程序中选中单词并不会将其寄存起来,所以在word里面就只好先ctrl+c将单词复制到剪贴板,然后再粘贴到stardict中去查询了,非常麻烦。
想到有一个小程序叫xsel的可以访问和修改剪贴板:

XSEL(1x) XSEL(1x)

NAME
xsel – manipulate the X selection.

SYNOPSIS
xsel [OPTION]…

DESCRIPTION
Retrieve and set the X selection.

The X server maintains three selections, called PRIMARY, SECONDARY and CLIPBOARD. The
PRIMARY selection is conventionally used to implement copying and pasting via the mid‐
dle mouse button. The SECONDARY and CLIPBOARD selections are less frequently used by application programs. This program operates on the PRIMARY selection unless otherwise
specified.
….

哈哈,那就简单了,只要将CLIPBOARD里面的内容写到PRIMARY里面就OK了,很简单,只要一句话:

while :;do [ "`xsel -b`" != "`xsel`" ] && xsel -b|xsel;sleep 1;done

测试之下果然是可以的:

发件人 xiooli

Script ,

google项目lrcdis

2009年3月12日

RT
骨头兄将我以前写的一个下载/显示歌词的脚本整到google code上去了,现在已经有4个成员了呢,嘿嘿。现在明显感觉更新快了,刷刷的就到30几个更新了。。。
项目主页在http://code.google.com/p/lrcdis/
你可以到此处去下载稳定版本:http://code.google.com/p/lrcdis/downloads/list

lrcdis is a bash script for auto download lyrics and display it.

Now compatable with mpd, mocp, audacious, amarok, exaile, quodlibet, rhythmbox, mplayer.

Now supply these display mode:

* CLI: colorful command line method.
* OSD: using gnome-osd-client, give a on-screen-display.
* notify: using notify-send, give a series of message boxs.
* fifo: output a fifo file /dev/shm/lrcfifo, which can be used by other program.

Lrcdis ,

EXT4惊魂记:)

2009年3月8日

    传说ext4文件系统比ext3有了很大的提高,吹得那个神哦,整得我心痒痒的,终于今天按捺不住内心的躁动,于是俺决定——升了!
    从ext3无痛升级到ext4很简单,参考了这个网页:http://www.cyberciti.biz/tips/linux-convert-ext3-to-ext4-file-system.html只要几个命令即可,不过得在分区卸载的情况下才可以(正在使用的系统分区是卸载不掉的),那只好用livecd咯(这个livecd上的系统内核一定要支持ext4的,简而言之用2.6.28以后的内核就没错啦)。
    好,livecd成功进入,umount掉所有分区,为减小可能出现的意外,我找了一个阑尾来开刀(说来惭愧,我home分区没啥东西,就把它当作阑尾了:),home在/dev/sda6)

1
2
tune2fs -O extents,uninit_bg,dir_index /dev/sda6
fsck -pf /dev/sda6

搞定了,挂上来看看数据有没有挂:

1
2
3
mkdir tmp
mount -t ext4 /dev/sda6 tmp
ls tmp

呵呵,人品太好了,数据都还在呢。其他分区也如此这般,然后改/etc/fstab,将ext3改为ext4,uuid不用动,一般不会变的。
    我/boot是单独分区的,从ext4 boot的话需要在/boot/grub/menu.lst上做些手脚,添加一条rootfstype=ext4,像这样:

title Arch Linux
root (hd0,0)
kernel /vmlinuz26 root=/dev/disk/by-uuid/766a3d20-a5d6-44b6-9c31-6c41d61ce48d ro quiet splash rootfstype=ext4
initrd /kernel26.img

    好嘞,重启。。。。。。。。。。kernel panic,说什么can not open device…, 谢特!
    开始以为是grub不支持ext4,然后用livecd进去用chroot装了grub2,还是不行(惭愧,当时忘了重新grub-install /dev/sda结果启动的还是grub1),误打误撞用了fallback内核终于进去了,才知道是内核的问题,重新mkinitcpio -p kernel-26才好,总算搞定了,嘿嘿,现在想来真是不甚唏嘘阿,多亏我沉着冷静。
    收获也不少,首先成功转到ext4(虽然可能想转回去也不可能了),启动时间大大减少(20几秒到15秒左右,从grub到进kdm),其次,用上了grub2(也没有感觉到什么不同阿),最后,熟悉了一把grub命令和用法,:)

Other ,