存档

文章标签 ‘Script’

[幽默]夏季驱蚊脚本

2010年6月23日

RT
夏天来了,蚊虫出没,甚是烦扰,为避免被咬得满身是包,xiooli 决定写一个驱蚊脚本,呃呃。

本脚本采用蚊虫的天敌产生的声音驱赶蚊虫,非电磁波,对人畜无不良影响,请放心使用。

ps:建议推荐世界杯赛场采用。

放出源代码:

1
2
3
4
5
6
7
8
#!/bin/bash
myspace=*
while :; do
    if [ "`find $myspace -type insects -name mosquito`" ]; then
        batman --voice "呔,孽畜哪里走!"
    fi
    sleep 1
done

Other, Script ,

Linux 下转换 Thermo 质谱 RAW 文件到 MZXML 格式的脚本

2010年5月6日

如题
由于最近开始做质谱方面的工作,实验室使用的液质联用仪是 Thermo 的. Thermo 使用了自己的封闭格式 (raw) 保存实验数据,其软件 Xcaliber 只有 windows 平台的,而我平时的工作平台是纯 linux(即使它有 linux 平台的软件,我也不喜欢封闭的格式,因为要 hack 起来不容易的缘故),所以我就想将 raw 文件转换成开放的格式(比如 mzxml)。google了一下,发现有一个 window 命令行程序 ReAdW.exe 可以将其转换成 mzxml,赫赫,这不就是我需要的么,而且是命令行的容易批量化,虽然是 windows 下的,不过程序很简单应该可以用 wine 运行。参考了它的说明,说是要求 Xcaliber 的一个 dll (XRawfile2.dll), 考虑到这些 dll 一个依赖一个的,干脆连 Xcaliber 也wine 了。wine 安装 Xcaliber,成功(运行出错,不管,反正只要它的 dll),然后测试 wine 运行了一下 ReAdW.exe,可以转换成功,哈哈,摆脱封闭的 raw 格式胜利在望,鉴于 dos 命令行参数输入方式的奇怪与路径样子的恶心,我决定将其封装成一个 bash 脚本,用 linux 命令行的方式来使用它,花了2-30分钟写好了这个脚本(额,好久没写 bash 脚本,这速度是有点丢人,其中还得到 骨哥 (bones7456)童鞋的帮助,在此表示谢意). 脚本见下:

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
#!/bin/bash
 
# Name:     rawconv.sh
# Author:   xiooli <xioooli[at]yahoo.com.cn>
# Site:     http://joolix.com
# Licence:  GPLv3
# Version:  100506
# convert the Thermo mass raw file to mzXML file
 
export WINEPREFIX=$HOME/.wine
 
if [ ! "`which wine 2>/dev/null`" ];then
    echo 'ERR: This scripe need wine installed!'
    exit
fi
 
if [ -f "`dirname $0`"/ReAdW.exe ]; then
    ReAdW="`dirname $0`"/ReAdW.exe
elif [ -f "`dirname $0`"/rawconv/ReAdW.exe ];then
    ReAdW="`dirname $0`"/rawconv/ReAdW.exe
else
    echo 'ERR: No ReAdW.exe found!'
    exit
fi
 
if [ $# -ge 2 ]; then
    rawfile="$1"
    mzxmlfile="$2"
else
    echo 'ERR: Two auguments at least is needed!'
    exit
fi
 
fullpath_rawfile="Z:$(cd "`dirname $rawfile`"; echo "`pwd`"/"`basename $rawfile`"|sed 's|/|\\|g')"
fullpath_mzxmlfile="Z:$(cd "`dirname $mzxmlfile`"; echo "`pwd`"/"`basename $mzxmlfile`"|sed 's|/|\\|g')"
 
wine "$ReAdW"  --mzXML -c "$fullpath_rawfile" "$fullpath_mzxmlfile" &>/dev/null

Chemistry, Script , ,

施氏暴汲福威记

2010年4月7日

或曰我朝网络,实属开放,然为童稚计,上诏不河蟹者悉当屏蔽,言斯事体大,关乎江山社稷,不可不察也。宰曰,逮今千古未见之奇变,行不可泥古,而法可效周厉也,上然之,征才于宰,宰曰:有汲福威(G.F.W)者,其先祖汲黯,有宠于汉武,福威行事苛辣,颇有其先祖遗风,当堪此任。上即招福威入见,视之,其人肤黝如漆,面圆耳大,腮布貉须,目若牛铃,口似血盆,身长八尺,腰阔十围,穷凶极恶,上喜之,即擢为河蟹中郎将,着即处理海内一干有碍河蟹之事。
及退朝,福威密征于宰,询以不河蟹之准绳,曰:无他,但唯上意也。福威诺诺而退。及二日,忽闻数数网站 loli 被一一推倒,梯子、板凳哗啦啦掀翻。宅人乍逢其变,隳突呼号,如失耳目,久乃得定,聚而议曰:今上逆民而行,任用恶吏,推我 loli,掀我梯子,欲使我曹蔽目塞兑,驯如羊豕,餍于井天,溯古而视,唯周厉可堪,周天之下,宁有甚于此者乎?! 柿可忍黍不可忍,但有愤而暴之菊是为唯一出路。或曰:怎奈我等之力仅可掀 loli,欲胜汲竖则妄矣。且为之奈何?众皆蹙目,忽有信某哥者语于众曰:公等无忧也,吾尝识一人,武艺精深,穿墙百面如入无人之境,其好不多,尤喜菊花,公等可延是人,谓有菊花待之,料当欣来,立暴汲竖无疑也!予乃再拜,问其名姓,曰:此人名唤施氏(即 ssh 也),有通天彻底之能,擅能凿洞,当胜此任,然其人作此事时须有外应之所,以做上下挪移之用,可去此处购置,其价颇公
http://sshchina.com/ 此我账户: xioolieissh,若你买的话将我做推荐人,我将不胜感激^^ )
予乃辞谢信某哥者,延施氏归
(arch 下 sudo pacman -S openssh)
又至 sshchina.com 所,购外应一,即付施氏
( ssh -D 6666 -l xioolieissh soft.sshchina.com 挖一个隧道,从 sshchina.com 连到你的 6666 端口,登录后就可以用 localhost:6666 做代理鸟)
施氏视之良久,曰:甚善,君其远遁,吾将掘矣,今夜必暴之,待吾成也,君便可幽会佳人于墙外,若 loli,若御姐,悉随尊意。予久未睹佳人玉面,思之垂涎,乃搓手以待施氏,俄而,有声如豕自施氏身下出,断而且续,予大惊,以为怪,询之,良久,喘然曰,无惊,此汲氏之声也,因遭吾暴故出此音,君今会佳人可也
(设 localhost:6666 做代理,firefox 建议使用 autoproxy 插件,该插件会自动获取被墙网站列表,在访问被墙网站时才使用代理)。
予且喜且惊,施氏真强将也,当旦暮招之,以利吾张生之美也,遂做神符两张,以备随时招施氏也
(使用时可以直接运行 ssh.sh/ssh.exp, 也可以加入到 gnome/kde 的启动项里面,登录桌面即可使用,无须手动开启,需将 ssh.exp 里面的账户和密码改成你自己的)

ssh.sh:

#!/bin/bash
path/to/ssh.exp

ssh.exp:

#!/usr/bin/expect -f
# ssh连接的expect脚本
 
spawn ssh -D 6666 -l your_account ssh_host_addr
expect {
    "*(yes/no)*" { send "yes\r" }
    "*password*" { send "your_password\r" }
}
expect "*Last login*" { interact }

至施氏来后,予常享与众佳人相戏之乐,而施氏亦乐与汲氏大叔做龙阳之会。吾思先人尝曰独乐乐与众乐之理,信然,乃做此文,愿与众共乐也。

Other, Script ,

短信通知服务器运行状态

2010年1月14日
Comments Off

最近组上买了一台联想的 thinkcenter M8000t 做服务器,俺只好义不容辞的做管理员了(其实是我怂恿老板掏钱买滴,嘿嘿), 随时了解机器的运行状态是很重要的,当在有联网电脑的地方时还好说,但是如果你在外面而又想了解其运行状态的话就不好办咯。当然如果你的手机也能 ssh 的话就当俺没说(我可没那么高级的手机),手机虽然是次点,不过好歹能收短信吧,主意来了: 用短信收取服务器的运行状态。

说到用短信收机器信息,可能很多童鞋会想到用飞信,但是由于我前些时候写了个短信控制电脑的半成品,就不再用飞信了,我可不想做重复的工作。我就查有没有能短信通知的邮箱呢?还真有,这不,移动居然可以把手机号当成其139邮箱的用户名,而且支持邮件到达短信通知,赶紧给开通了。万事具备,开工。

我想知道的服务器信息包括 cpu 温度, 硬盘温度, 网络速度, 负载等, 其中 cpu 温度可以用 lm_sensors 来监控, 硬盘温度用 hddtemp 来监控,网络总流量可以用 cat /proc/net/dev 获取,除以时间间隔就可以得到速度,而负载就简单的一个 uptime 命令即可。

操作:

首先装上 lm_sensors 和 hddtemp, 然后启动两个服务 (arch下在这里: /etc/rc.d/sensors 和 /etc/rc.d/hddtemp) 只有启动了这两个服务才可以随时获取其提供的信息。hddtemp 提供了网络接口,可以用 netcat 查询 7634 端口获得硬盘信息,下面我写了个小 bash 脚本来集中获取所需信息,代码如下:

server_stat.sh

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
#!/bin/bash
 
# Name:     server_stat.sh
# Author:   xiooli <xioooli[at]yahoo.com.cn>
# Site:     http://joolix.com
# Licence:  GPLv3
# Version:  100113
 
 
stat() {
	sensors | grep Core | awk '{print $1, $2, $3}' | tr -d '+'
	netcat localhost 7634 | awk -F'|' '{print $2":"$4" 度"}'
	[ -f /tmp/net-stat ] || :> /tmp/net-stat
	net_last="$(cat /tmp/net-stat)"
	net_crt="$(cat /proc/net/dev | grep eth0 | awk -F"[: ]" '{print $4,$6}')"
	crt_time="$(date +%s)"
	echo "$net_crt $crt_time" > /tmp/net-stat
	[ "$net_last" ] && {
		last_in="$(awk '{print $1}' <<< "$net_last")"
		last_out="$(awk '{print $2}' <<< "$net_last")"
		last_time="$(awk '{print $3}' <<< "$net_last")"
		crt_in="$(awk '{print $1}' <<< "$net_crt")"
		crt_out="$(awk '{print $2}' <<< "$net_crt")"
		gap="$(($crt_time-$last_time))"
		speed_in="$(bc -l <<< "scale=4;($crt_in-$last_in)/($gap*1024)")"
		speed_out="$(bc -l <<< "scale=4;($crt_out-$last_out)/($gap*1024)")"
		echo -e "speed out:$speed_out k/s\nspeed in:$speed_in k/s"
	}
	uptime
}
 
send_ok=0
s="`stat | tr '\n' '|' | sed 's|°C| 度|g' | iconv -f utf-8 -t gbk -c`"
while [ "$send_ok" = "0" -a "$s" ]; do
	python "`dirname $0`/mailnotify.py" "$s"
	[ "$?" = "0" ] && send_ok=1
	sleep 10
done

这个脚本调用了一个叫 mailnotify.py 的 python 脚本来发送邮件(当然你也可以用其他的命令行的邮件客户端)

mailnotify.py (ps: 此脚本极不规范,凑合能用而已)

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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Name:     mailnotify.py
# Author:   xiooli <xioooli[at]yahoo.com.cn>
# Site:     http://joolix.com
# Licence:  GPLv3
# Version:  100113
 
'''发送信息到某邮箱,可以用着定时获取服务器的状态(139 邮箱支持邮件短信提醒)'''
 
import smtplib, os, time, sys
 
def send():
    smtp = 'smtp.139.com' # 可以到信短信提醒的邮件服务器 smtp 地址, 这里用 139 的
    from_ = 'status <status@xx-server>' #这样写收到的短信第一行才不会只是个[]
    to = 'xxx@139.com' # 你想发送到的账户(邮件到此账户即发送短信提醒,所以用你手机号绑定的那个账户)
    user = 'xxx' # 用户名
    password = 'yyy' # 密码
    subject = 'status of np-server ' + time.strftime('%Y-%m-%d %H:%M', time.localtime()) # 这里可以定义邮件的标题
    text = sys.argv[1].replace("|", "\r\n") #从命令行收到的信件文本,换行替换成 |, 在此地复原
 
    msg='To: ' + to + '\r\nFrom: ' + from_ + '\r\nSubject: ' + subject + '\r\n\r\n' + text
 
    s = smtplib.SMTP(smtp)
    login_stat = s.login(user, password)
    if login_stat[0] == 235:
        send_stat = s.sendmail(to, to, msg) # 之所以发件账户和收件账户一致是为了不用两个不同的邮箱,这里相当于是自己给自己发邮件,而收到自己发的邮件以后又会短信到你的手机,目的达到
        if not send_stat:
            return 0
    else:
        return 1
 
send()

然后编辑 cron 任务将命令指向 server_stat.sh 按时发送运行状态。

ps:其实你也可以将获取的新闻之类的东西按时短信给你,这在外地(比如山区)等不能上网的地方是个不错的获取实时信息的好方法诶,呵呵。

Script ,

用 python 生成和解码二维码图片

2010年1月4日

了解了一下二维码的一些知识,感到很神奇哈,指甲盖那么大一块的二维码居然可以存放 500 多个汉字,呵呵如果书籍这样印刷的话是不是要少用些纸张呢? 这个东西据说在现实中用处还挺大的,很多手机都支持拍摄和解读二维码,并且很多人把自己的个人信息也放在里面,印一张包含自己各种信息的二维码图片的名片是不是很酷呢?呵呵,鉴于可能有此需要,我就试着找了一下看看有没有什么 python 的二维码 lib,嘿嘿,还真有,pyqrcodec 就是这样一个 python lib,archlinux 下用 yaourt -S pyqrcodec 就可以安装,其他发行版的可能类似,就不详述了。

看了一下 pyqrcodec 的文档,用法其实很简单,xiooli 顺手写了一个小脚本,实现了 QR 二维码图片的生成和解码,下面是一张例图:
a
生成这张例图的命令和解码的命令如下:

xiooli@XIOOLI> python qrcode.py -e "hello,大家好,我是 xiooli!" ./a.png 
generated file: ./a.png
xiooli@XIOOLI> python qrcode.py -d ./a.png
QR_IMAGEREADER_DECODED, QR_FORMATINFO_UNRECOVERABLE,
get text: hello,大家好,我是 xiooli!

qrcode.py 的源码:

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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Name:     qrcode.py
# Author:   xiooli <xioooli[at]yahoo.com.cn>
# Site:     http://joolix.com
# Licence:  GPLv3
# Version:  100104
 
'''generate and decode qrcode pictures'''
 
import PyQrcodec as pqr
import sys
 
def gen_qrpic(text, file):
    '''generate a qrcode file contains the given text'''
    stat, img = pqr.encode(text)
    if stat:
        img.save(file)
        return file
    else:
        print "failed to generate qrcode picture."
def qrdecode(file):
    '''decode the qrcode picture'''
    stat, text = pqr.decode(file)
    if stat:
        return text
    else:
        print "failed to decode the qrcode picture."
 
if __name__ == "__main__":
    args = sys.argv
    if len(args) == 1 or args[1] == '-h' or args[1] == '--help':
        print "encode: " + args[0] + " -e [text] [image file]"
        print "decode: " + args[0] + " -d [imgae file]"
    elif args[1] == '-e':
        try:
            print "generated file: " + gen_qrpic(args[2],args[3])
        except:
            pass
    elif args[1] == '-d':
        try:
            print "get text: " + qrdecode(args[2])
        except:
            pass
    else:
        print 'unrecoded arguments'

想为自己名片加上二维码信息的童鞋们不用愁咯,^^

Script , ,

翻箱淘到的在线翻译脚本

2009年12月28日
Comments Off

偶尔清理我的个人可执行目录($HOME/.bin)发现了远古时代写的一个翻译脚本,牵出来遛了一遛,还可以用哈,嘿嘿,顺手给改了几下,添加了以下一些特性:

1) deamon 化(直接进后台了,不必老开着一个终端跑)
2) 三种显示方式:kdialog,notify-send 和 gnome-osd
3) 脚本名加 -k 参数剋掉后台进程

露脸一下:
dic_sh

代码:

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
#!/bin/bash
 
# Name:     dic.sh
# Author:   xiooli <xioooli[at]yahoo.com.cn>
# Site:     http://joolix.com
# Licence:  GPLv3
# Version:  091228
 
timeout=10
 
trans() {
	str="`xsel`"
	while true ; do
	  a="`xsel`"
	  if [ "$a" != "$str" ] ; then
		str="$a"
		[ ${#a} -lt 15 ] && word="`w3m -dump -no-cookie http://dict.cn/mini.php?q="$a" \
		| sed -e '$d' -e 's/</ /g' -e 's/>/ /g'`"
		if [ "`which gnome-osd-client 2>/dev/null`" ]; then
			gnome-osd-client -f "<message id='word' osd_fake_translucent_bg='off' \
			osd_vposition='top' osd_halignment='right' animations='on' hide_timeout='10000'>\
			<span size='15000' foreground='pink'>`echo "$word"`</span></message>"
		elif [ "`which kdialog 2>/dev/null`" ]; then
			kdialog --passivepopup "$word" "${timeout:-5}" &>/dev/null
		elif [ "`which notify-send 2>/dev/null`" ]; then
			timeout=${timeout:-5}
			timeout=$((timeout*1000))
			notify-send -t "$timeout" "$word"
		fi
	  fi
	  sleep 1
	done
}
 
# daemonize
if [ "x$1" != "x--" -a "x$1" != "x-k"  -a "x$1" != "x-h" ]; then
	if [ ! "`cat /tmp/dic.pid 2>/dev/null`" ]; then
		"$0" -- 1> /dev/null 2> /dev/null &
		exit 0
	else
		echo "dic is running."
		exit 0
	fi
elif [ "x$1" = "x-k" ]; then
	pic_pid="`cat /tmp/dic.pid 2>/dev/null`"
	if [ "$pic_pid" ]; then
		kill -9 "$pic_pid" 2>/dev/null
		rm /tmp/dic.pid 2>/dev/null
		echo "dic process is terminated."
	else
		echo "no dic process is running."
	fi
	exit 0
elif [ "x$1" = "x-h" ]; then
	nm="`basename $0`"
	echo -e "$nm: run\n$nm -k: kill daemon\n$nm -h: show help"
	exit 0
fi
 
echo $$ > /tmp/dic.pid
trans

Script , , ,

shc “编译” bash 脚本的漏洞?

2009年12月28日

简介
shc 是一个能够将 bash 脚本“编译”成可执行程序的程序。
安装:
arch 下 yaourt -S shc 即可
用法:
shc -f your_script.sh

更详细的用法可以man之。运行之后会在当前目录下生成一个 your_cript.sh.c 的 c 源文件和一个 your_cript.sh.x 的可执行文件。

在 google 了 shc 之后发现很多童鞋用这个来加密自己的 bash 脚本,到底这个东东能不能加密你的脚本呢? 乍一看似乎是可以滴,但是经过 xiooli 童鞋摸啊捏阿的偶然发现这个东东的一个破绽,那就是,从 ps 的输出上是可以看到你脚本的源代码滴(连注释都不放过哦),下面来做个实验:
编写一个脚本:

1
2
3
4
5
cat test.sh
#!/bin/bash
# this is a test bash script
echo 'You can not see me.'
read anything

然后用 shc 将其编译成二进制程序:

shc -r -f test.sh

运行之:

./test.sh.x

另一个终端运行 ps:

1
2
3
4
ps -ef|grep test.sh.x
xiooli   24822 20812  0 00:46 pts/2    00:00:00 ./test.sh.x -c
#!/bin/bash?# this is a test bash script?echo 'You can not see me.'?read a
xiooli   24779 20416  0 00:35 pts/4    00:00:00 grep test.sh.x

哈哈,现原型了哦,试过了一个很复杂的 bash 脚本,仍然是能够看到那一大堆源码滴,虽然看起来有点乱,不过仔细瞧还是能瞧明白的,所以如果你要想用 shc 来加密你的 bash 脚本的话,还是早点打消这个念头吧。

Script , ,

pyinstaller 将 python 脚本打包成可执行程序

2009年12月27日

有些时候在需要将 python 写的程序部署到没有 python 运行环境的机器上的时候很麻烦,尤其是对方又不想安装 python 的时候更是如此,这时候将 python 脚本包装成可执行文件就是一个很好的解决方案。事实上有很多东西能做这个工作,常见的有 py2exe,freeze.py,pyinstaller 等,py2exe 貌似只支持 win,freeze.py 传说是将python 程序的字节码转换成 c 再编译的,这个我试了一下,转换命令行脚本时没啥问题,但是在转换一个简单的 pyqt 程序的时候,转换出来的程序不能正常运行。转向 pyinstaller, 这个就没问题了,在 linux 下和 win 下均能正确转换 pyqt 的程序。你可以在 http://www.pyinstaller.org/ 下载得到,按照 REDADME.txt 操作即可。

常用的参数(– 是两个 -):

–onefile 打包成单一文件

–onedir 制作出的文件放在同一个目录下(默认值)

–tk 包含TCL/TK的相关文件。

–windowed 制作窗口程序。(程序执行时不会有文字窗口出现,仅限 windows)

–console 制作一般的console程序。

–upx 使用UPX压缩程序。

–icon= 指定程序的图标(貌似我没有弄成功)。

–version= 指定程序的版本信息(信息写在 FILE 里面)。

–name= 指定程序的名称。若无此选项,则使用主脚本的名称。

为方便使用,我写了一个小 bash 脚本(pyinstaller.sh),用法:
pyinstaller.sh /path/to/your_script.py
代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash
 
# Name:     pyinstaller.sh
# Author:   xiooli <xioooli[at]yahoo.com.cn>
# Site:     http://joolix.com
# Licence:  GPLv3
# Version:  091227
 
pyinstaller_path="/home/xiooli/Projects/pinstaller/trunk"
makespec="$pyinstaller_path/Makespec.py"
build="$pyinstaller_path/Build.py"
 
if [ "$1" ]; then
	app="`basename $1`"
	spec_dir=${app/.*}
	[ -d "$spec_dir" ] || mkdir -p "$spec_dir"
	read -p "输入额外参数:" arg
	python "$makespec" -c -o "$spec_dir" $arg $1
	python "$build" "$spec_dir/$spec_dir.spec"
fi

ps: 在 win 下弄出的程序咋要比 linux 下的小呢,囧。

Script , ,

获取所有符合条件分子式的脚本

2009年12月24日
Comments Off

在某些时候我们只知道某一个分子的分子量和大概的碳氢氧的个数范围,在这种情况下要算出符合这些条件的分子式,用手工的方法算是很麻烦的,于是就有了下面的这个脚本,其特点是:
1) 全面,无漏网之鱼
2) 用了不饱和度检测,不饱和度不正常的(如为小数)分子式均被排除
3) python 写的,可跨平台使用。

例子:

xiooli@XIOOLI> python  .bin/fmcom.py
Please input: 173 c,8,18 h,0,20 o,0,10 n,0,6
The results are as follows:
MF: C8H3O2N3   Ω: 9
MF: C8H7N5     Ω: 8
MF: C8H15O3N   Ω: 2
MF: C8H19ON3   Ω: 1
MF: C9H3O3N    Ω: 9
MF: C9H7ON3    Ω: 8
MF: C9H19O2N   Ω: 1
MF: C10H7O2N   Ω: 8
MF: C10H11N3   Ω: 7
MF: C11H11ON   Ω: 7
MF: C12H15N    Ω: 6
MF: C13H3N     Ω: 13

说明一下: 173 c,8,18 h,0,20 o,0,10
这里 173 是分子量, 后边的表达式都是一样的如:c,8,18 表示 碳原子 个数范围为 8 到 18。
注意分隔符是英文逗号。

源码:

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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Name:     fmcom.py
# Author:   xiooli <xioooli[at]yahoo.com.cn>
# Site:     http://joolix.com
# Licence:  GPLv3
# Version:  091224
 
'''compute out the formula of a given molecular weight'''
 
import sys
 
# dictionary for the elements: { 'element': (atomic weight, omiga factor)
edic = { 'C': (12, 1),
        'H': (1, -0.5),
        'O': (16, 0),
        'N': (14, 0.5)
        }
 
args = sys.argv
 
def gen_formula(args):
    '''Main function for generating the formula'''
 
    mw = args[0]
    e_info = []
    formula = ''
    omiga = ''
    fors = ''
    ifs =''
 
    E = lambda x, y: (y==0 and ' ') or (y==1 and x.upper()) or x.upper() + str(y)
    L = lambda x, y: (x, len(x), y)
 
    for tmp in args[1:]:
        e_info.append(tmp.split(','))
        element, num1, num2 = tmp.split(',')
        element = element.upper()
        formula += 'E("' + str(element) + '",' + element + ') + '
        fors += ' for ' + element + ' in range(' + num1 + ',' + num2 + ') '
        ifs += str(edic[element][0]) + '*' + element + ' + '
        omiga += str(edic[element][1]) + '*' + element + ' + '
 
    formula = formula.strip('+ ')
    omiga += '1'
    ifs = ifs.strip('+ ')
 
    cmd = '[ L((' + formula + ').replace(\' \',\'\'), ' + omiga + ')' + fors + \
            'if ' + ifs + ' == ' + mw + ' and int(' + omiga + ') == ' + omiga + ']'
    l = eval(cmd)
 
    if l:
        print 'The results are as follows:'
        for f in l:
            str_omiga = str(int(f[2]))
            print 'MF: ' + f[0] + ('Ω: ' + str_omiga).rjust(15 - f[1] + len(str_omiga))
    else:
        print 'No suitable molecular formula found.'
 
if __name__ == '__main__':
    if len(args) <= 1:
        input = raw_input('Please input: ')
        args = input.split(' ')
        gen_formula(args)
    elif args[1] == '-h' or args[1] == '--help':
        print args[0] + ' [molecular weight] [element1, least, most] [element2, least, most] ...'
    else:
        gen_formula(args[1:])

Chemistry, Script , ,

Bash matrix 脚本

2009年12月18日

RT
根据骨头兄滴大作改编。
matrix

代码(单行):

p(){printf "\033[%d;%dH\033[32m%c\033[m" $1 $2 "$3"};clear;N=20;for i in `seq 1 $N 2`; do x[$i]=$((RANDOM%LINES+1));y[$i]=$((RANDOM%COLUMNS+1));done;chars=({0..9} {a..z} {A..Z} '*' '&' '^' '%' '$' '#' '@' '~' '<' '>' '?' '+');while :; do for i in `seq $N`;do ran_char=${chars[$RANDOM % ${#chars[@]}]};p ${x[$i]} ${y[$i]} $ran_char;((x[$i]++));if [ ${x[$i]} -ge $LINES ]; then for j in `seq $LINES`;do p $j ${y[$i]} " ";done;x[$i]=$((RANDOM%LINES+1));y[$i]=$((RANDOM%COLUMNS+1));fi;done;sleep .02;done

代码(多行, 多行代码须用 . script.sh 的方式运行,不然会出错)

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
p(){
	printf "\033[%d;%dH\033[32m%c\033[m" $1 $2 "$3"
}
clear
N=20
for i in `seq 1 $N 2`; do
	x[$i]=$((RANDOM%LINES+1))
	y[$i]=$((RANDOM%COLUMNS+1))
done
 
chars=({0..9} {a..z} {A..Z} '*' '&' '^' '%' '$' '#' '@' '~' '<' '>' '?' '+')
while :; do
	for i in `seq $N`; do
		ran_char=${chars[$RANDOM % ${#chars[@]}]}
		p ${x[$i]} ${y[$i]} $ran_char
		((x[$i]++))
		if [ ${x[$i]} -ge $LINES ]; then
			for j in `seq $LINES`; do
				p $j ${y[$i]} " "
			done
			x[$i]=$((RANDOM%LINES+1))
			y[$i]=$((RANDOM%COLUMNS+1))
		fi
	done
	sleep .02
done

Script , ,