存档

文章标签 ‘essay’

Archlinux 下 ICC+MKL 方案编译 GAMESS

2010年1月16日
Comments Off

点此下载效果更好的 pdf 版本

                    Archlinux 下 ICC+MKL 方案编译安装 GAMESS
                                作者: xiooli
                                邮箱: <xioooli[at]yahoo.com.cn>
                                网站: http://joolix.com

    此文系根据自己实际操作写就,其中查考了 Sobereva 和王涛的文章 (见参考文献)
    在此表示感谢。
    本文依据 CC 协议发布,在保留原作品的署名的情况下你可以自由转载或修改再发布
    (仅限非商业用途)

—————————————正文—————————————
一,机器配置
    型号: lenove ThinkCenter M8000t
    主板: Intel Q45
    CPU:    Intel(R) Core(TM)2 Quad CPU Q9550 @ 2.83GHz (四核)
    内存: DDR3 1066MHz 2G X 2
    硬盘:   SATA 500G 7200RPM

二,系统及编译环境
    系统: Archlinux x86_64
    内核: 2.6.32-ARCH
    SHELL:
        bash:   version 4.0.35(2)-release
            这是用户的默认登录 shell,编译操作基本上都是在 bash 里面完成的
        csh:    tcsh 6.17.00 (Astron) 2009-07-10
            因 gamess 的很多脚本是用 csh 写成,故而需要安装 csh (包名是 tcsh)
    C 编译器:
        GCC:    4.4.2 20091208 (prerelease)
            GCC 是默认的编译器,可以从你发行版的软件源里面安装
        ICC:    Version 11.1
            intel 的 CPU 用 ICC 可以优化执行性能,其他 CPU 的同学可以不必使用 ICC
            需要去 intel 的官网下载安装,个人和非商业使用只需注册一下,免费使用
            ——————————-设置开始——————————–

            ICC 一般是安装到 /opt 里面去的,系统并不能直接找到其可执行文件
            所以需要将其 bin 目录加到 PATH 环境变量里面去
            以我为例:
            在 /opt/intel/Compiler/11.1/056/bin/ 下面有两个文件一个目录(依系统位数
            的不同,目录的名字可能不一样): intel64/, iccvars.csh 和 iccvars.sh,你
            需要在 /etc/profile.d/ 下面建立一个脚本,比如 iccvars.sh 其内容如下:

            ——————————-不含此线——————————–
            #!/bin/bash
            source /opt/intel/Compiler/11.1/056/bin/iccvars.sh intel64
            ——————————-不含此线——————————–

            最后的那个参数 intel64 依你的系统不同而不同,应该和你在
            /opt/intel/Compiler/11.1/056/bin/ 中看的的目录名字相同,然后赋可执行权限:

            sudo chmod a+x /etc/profile.d/iccvars.sh

            注意,这样只会在重启后生效,若要当时生效,须执行一下:

          . /etc/profile.d/iccvars.sh 或 source /etc/profile.d/iccvars.sh

            此外,为了让程序(这里是 icc 等)找到它们所依赖的库,须得将 icc 的 lib
            路径加入到 /etc/ld.so.conf 里面
            以我为例:
            在 /etc/ld.so.conf 里面加上一行:

            ——————————-不含此线——————————–
            /opt/intel/Compiler/11.1/056/lib/
            ——————————-不含此线——————————–

            然后以 root 权限运行 ldconfig
            ICC 的设置到此结束
            ——————————-设置结束——————————–
    FORTRAN 编译器:
        IFORT:  Version 11.0
            这个也是 intel 的编译器,同样需要去其官方注册下载,个人版也是免费的
            当然你也可以使用 g95 等开源的 FORTRAN 编译器
            ——————————-设置开始——————————–

            IFORT 同样也是安装到 /opt 里面去的,所以也需要将其 bin 目录加到 PATH
            环境变量里面去
            以我为例:
            在 /opt/intel/Compiler/11.0/074/bin/ 下面有两个文件一个目录(依系统位数
            的不同,目录的名字可能不一样): intel64/, ifortvars.csh 和 ifortvars.sh
            你亦需要在 /etc/profile.d/ 下面建立一个脚本,比如 ifortvars.sh 其内容如下:

            ——————————-不含此线——————————–
            #!/bin/bash
            source /opt/intel/Compiler/11.0/074/bin/ifortvars.sh intel64
            ——————————-不含此线——————————–

            最后的那个参数 intel64 依你的系统不同而不同,应该和你在
            /opt/intel/Compiler/11.0/074/bin/ 中看的的目录名字相同,然后赋可执行权限:

            sudo chmod a+x /etc/profile.d/ifortvars.sh

            注意,这样只会在重启后生效,若要当时生效,须执行一下:

          . /etc/profile.d/ifortvars.sh 或 source /etc/profile.d/ifortvars.sh

            此外,为了让程序(这里是 icc 等)找到它们所依赖的库,须得将 ifort 的 lib
            路径加入到 /etc/ld.so.conf 里面
            以我为例:
            在 /etc/ld.so.conf 里面加上一行:

            ——————————-不含此线——————————–
            /opt/intel/Compiler/11.0/074/lib/
            ——————————-不含此线——————————–

            然后以 root 权限运行 ldconfig
            IFORT 的设置到此结束
            ——————————-设置结束——————————–
    数学库:
        MKL: Version 10.2.3.029
            这个是 intel 的数学核心函数库,据说使用ifort编译器结合MKL数学库可以使
            代码执行速度大大提升。当然你如果不使用 MKL 的话会默认使用 BLAS 这个库
            AMD CPU 的同学可以考虑使用 ACML 这个数学库。同样,MKL 也可以到 intel 的
            官网上面申请免费版本
            ——————————-设置开始——————————–

            MKL 的设置相对简单,因为其只是一些库,没有可执行文件,所以只需要将 MKL
            库的位置加到 ld.so.conf 里面即可
            在 /etc/ld.so.conf 里面加上一行:

            ——————————-不含此线——————————–
            /opt/intel/mkl/10.2.3.029/lib/em64t/
            ——————————-不含此线——————————–

            然后以 root 权限运行 ldconfig
            IFORT 的设置到此结束
            ——————————-设置结束——————————–

三,具体操作过程
    在配置好了上面的编译环境以后便可以进行后续的编译过程了。
    首先,当然是准备 gamess 的源码咯,去 gamess 的网站上面填写申请,一般一到两天后会
    批下来,然后会邮件通知你下载地址,用户名和密码,然后就去拖下来咯,压缩包的大小约
    10M 左右,我下载的版本是: GAMESS version January 12, 2009 R3 for 64 bit
    (x86_64 compatible) under Linux with gnu compilers
    然后准备一个安装目录(我将其安放在 /home/gamess 里面),将压缩包解压到安装目录下面
    好了,可以看到几个可执行文件:
    compall, comp, lked, runall 和 rungms

    ———————————–修改脚本—————————————–
    我们接下来将编辑这几个文件以使其符合我们自己的实际情况
    以我为例:
    compall:
        line 16:  set TARGET=linux-ia64
        line 17:  set /home/gamess
        line 70:  if  ($TARGET == linux-ia64) set CCOMP=‘icc’ # 没有 icc 的可以继续 gcc
    comp:
        line 15:  set TARGET=linux-ia64
        line 16:  set /home/gamess
        line 109: if  ($TARGET == linux-ia64)   set BLAS3=/opt/intel/mkl/10.2.3.029/lib/em64t/
        # 如果你没有安装 MKL 的话就不要动上面这行
        # 由于我选择的 TARGET=linux-ia64,在 line 1507 可以看到已经是默认用了 ifort 作为 FORTRAN
        # 的编译器,如果你的 TARGET 是其他的而又想用 ifort 的话,可以去对应的地方 (即
        # if ($TARGET == xxx) then 下面将 FORTRAN 编译器改成 ifort)
    lked:
        line 18:  set TARGET=linux-ia64
        line 19: chdir /home/gamess
        line 498: if ($TARGET == linux-ia64) then # 若使用 MKL 则在下面添加一行
        line 499:     setenv MKLPATH /opt/intel/mkl/10.2.3.029/lib/em64t
        # 看它的脚本理论上来说不添加这行也是可以找到 MKL 的,不过在我这里报错说
        # 找不到 MKL 里面的某个 so,所以还是加上比较保险
    rungms:
        line 60:  set SCR=/home/gamess/scr/$USER
        # 存放运算临时文件的地方,自己喜欢放哪里放哪里,如果你内存够大的话也可以放在
        # /dev/shm (实际是个在内存里面的目录)
        将所有的 ~mike/gamess 换成你的 gamess 安装目录(我的是 /home/gamess)
        $USER/scr 替换成 $SCR
        你可以通过运行下面命令来一次性完成此工作:

        sed -i s|~mike/gamess|/home/gamess|g;s|~$USER/scr|$SCR|g ./rungms

        如果你想使用 SMP 方式并行多核运算的话如果是双核机器则修改这里:

        line 497: case br.msg.chem.iastate.edu: # 下面添加一行
        line 498: case YOUR-SERVER-NAME: # YOUR-SERVER-NAME 是运行 hostname 出来的结果
        line 499:   if ($NCPUS > 2) set NCPUS=2

        如果是四核机器则修改这里:

        line 490: case sc.msg.chem.iastate.edu: # 下面添加一行
        line 491:   case YOUR-SERVER-NAME: # YOUR-SERVER-NAME 是运行 hostname 出来的结果
        line 492:       if ($NCPUS > 4) set NCPUS=4
    runall:
        line 13:  chdir /home/gamess

    ———————————–编译 actvte—————————————
    下面我们要编译链接激活 gamess 代码的程序 actvte (下面命令均在终端下输入):

    cd /home/gamess/tools/
    # 视你 gamess 源文件存放地点的不同而 cd 到不同的目录
    cp actvte.code actvte.f
    sed -i s|^\*UNX|    |g actvte.f
    # 把以 *UNX 的开头用四个空格替换掉,即取消注释,亮出 UNIX-LIKE 系统的激活代码
    ifort -o actvte.x -Vaxlib actvte.f
    # 或 g95 -o actvte.x actvte.f 如果你没有 ifort 的话
    # 成功生成了 actvte.x 以后可以将 actvte.f 删除

    ———————————–开始编译—————————————–
    然后便可以开始编译了,在终端运行:

    cd /home/gamess
    ./compall
    # 如果你想看着它编译的话,或者让其在后台运行
    ./compall &> compall.log &
    # 上面两条命令选一即可,无须都执行
    # 经过一段取决于你机器性能的时间后(我这里大约用了 20 分钟)主要编译便完成了

    其后编译 gamess 的分布式数据接口 (DDI) 消息传递库,无论是否打算并行计算都必须
    编译,否则下面 lked 步骤通不过。假设现在主机名是 YOUR-SERVER-NAME(用 hostname
    命令可以看到当前主机名),就在 /etc/hosts 里面填上一行当前主机的IP地址和主机名
    例如: 192.168.153.3 YOUR-SERVER-NAME # [参考文献 1]
    命令:

    sudo su
    echo "192.168.153.3 YOUR-SERVER-NAME" >> /etc/hosts

    进入 /home/gamess/ddi 目录,修改 compddi
    
    compddi:
        line 18:  set TARGET = linux-ia64
        line 62:  set MAXCPUS  = 4
        line 63:  set MAXNODES = 2
        # set MAXCPUS 和 set MAXNODES 后面设成你的实际情况,前者代表每个节点中最多
        # 包含几个核心(每个节点内可以以SMP方式并行的核心数目),后者代表最多有几个
        # 节点,它们设的都可以比实际情况多 [参考文献 1]

    修改 /home/gamess/ddi/src/std_system.c

    std_system.c
        line 26:      struct hostent *hp; # 在其后插入一行
        line 27:      name = "YOUR-SERVER-NAME";
        # 之所以要加入这么一行是因为GAMESS的bug,会将主机名强行认作为localhost而不是
        # 实际主机名,导致运行时提示TCP error之类错误 [参考文献 1]

    最后运行命令:

    ./compddi
    mv ddikick.x ..

    最后编译图形应用程序

    cd /home/gamess/graphics
    编辑 complink 文件
    complink:
        line 15:  chdir /home/gamess/graphics
        line 18:  set TARGET=linux-pc
        line 31:  if ($TARGET == linux-pc)   set FORT=‘ifort -O2′

    之后运行./complink来编译

    ———————————–链接程序—————————————–
    链接可执行文件
    命令:

    cd /home/gamess
    ./lked gamess &> lked.log

    如果不出问题的话最终会在当前目录下生成一个 gamess.00.x 这样的可执行文件,至此我们的
    编辑工作就全部完成了,下面就是测试环节,在 /home/gamess 目录下运行 ./runall 将会对
    编译好的GAMESS程序进行测试,自动运行44个测试文件,将在当前目录下得到一批 exam??.log
    文件。修改 /home/gamess/tools/checktst 目录下的 checktst 文件:

    checktst:
        line 9:       set GMSPATH=/home/gamess
    
    然后运行此文件,出现提示时输入 /home/gamess,会将所得log文件的结果与标准结果相对比
    检查任务是否已正常结束,以及计算误差是否超过阈值。对于failed的任务,检查相应的log文件
    除掉毛病后,把 scr 目录下对应文件删掉,若要单独运行一个测试比如 exam42 可以使用命令:

    cd /home/gamess
    ./rungms exam42 00 4 &>exam42.log
    # rungms 的参数意义为: JOB=$1 (输入文件 xxx.inp,可以不输入扩展名); VERNO=$2 (lked
    # 一步的 revision 数字,默认 00); NCPUS=$3 (运行时调用的 CPU 核心数)

    待完成后再 checktst 看是否都已通过。

    一般情况下 exam42 和 exam43 会由于 linux 默认的单个共享内存段的最大值太小而不能通过
    使用 /sbin/sysctl -a | grep shmmax 命令察看默认值,这两个任务需要约 48MB,修改
    /etc/sysctl.conf,在里面加入一行 kernel.shmmax = 5000000000 将其增加到约 500MB
    可以使用命令 /sbin/sysctl -w kernel.shmmax=5000000000 来使其立即生效

参考文献:
    参考文献 1: http://hi.baidu.com/sobereva/blog/item/fff7b5fd1e8dd04fd6887db6.html
    参考文献 2: 王涛, 量子化学计算程序包GAMESS, 科学计算应用软件系列介绍

Chemistry ,

看来得给主机商加钱了

2010年1月13日
Comments Off

RT

google 撤出中国大概是确定了。幸而我博客主机在美国,而开通 ssh 只需加 70 ¥,是时候了。

Other

用 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 , ,

用 shedskin 将你的 python 程序转成 C++ 代码

2009年12月30日
Comments Off

最近在用 python 写一些东西(puzzleup.com上的题啥的),python 写起来很快也很方便,但是当遇到大量数学运算的时候可能就会很慢,于是我就 google 了一下 python 加速的方法,常用的 pysco 就不用说了,这是最简单的方法,但是效果可能不是最好的,传说 pypy 能够将 python 翻译成 c/java 能代码,但是使用的过程中老是遇到错误(什么:[translation:ERROR] KeyError: ‘target’ bulabula),而且编译这个东西耗费了我 >24 h,喜特!猛回头,瞅见了 shedskin,传说这个东东能将 python 翻译成C++,抱着试试看的心情,我就安装上了,结果一试,还真的有快感诶,赫赫!

使用方法:
普通的话就直接:shedskin xxx.py 就可以了,注意 xxx.py 里面只能有数字,字母和下划线,其他滴不要(路径都不能有,刚刚没太注意,结果老是出警告:*ERROR*:./xxx.py: module names should consist of letters, digits and underscores),会在当前目录下生成一个 xxx.cpp, xxx.hpp 和一个 Makefile,完事以后直接 make 就会编译出一个可执行程序来的。为了验证这个玩意是否好使,我找了一个以前和骨头,lerosua 等童鞋一起做欧拉工程的一道运算量较大的题来做实验。
题目是:

http://projecteuler.net/index.php?section=problems&id=10

小于10的所有质数的和是 2 + 3 + 5 + 7 = 17。求小于2000000的所有质数的和。

我写了一个 python 版本(鉴于本人的 python 极菜加之有数学恐惧症,大家对该程序的运行效率不要抱太大希望,只限于能够算出答案而已):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Name:     007-xiooli.py
# Author:   xiooli
#           Email:  <xioooli[at]yahoo.com.cn>
#           Site:   http://joolix.com
# Licence:  GPLv3
# Version:  091024
 
def is_prime(prm,i):
    j=0
    while prm[j]*prm[j] <= i:
        if i%prime[j] == 0:
            return False
        j+=1
    return True
 
prime=[2]
for k in xrange(3,2000000,2):
    if is_prime(prime,k):
        prime.append(k)
print sum(prime)

然后是 lerosua 童鞋的 C 版本:

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
/*
 * =====================================================================================
 *
 *       Filename:  003-lerosua.c
 *
 *    Description:  
 *
 *        Version:  1.0
 *        Created:  2009年10月21日 11时37分49秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  lerosua (), lerosua@gmail.com
 *        Company:  cyclone
 *
 * =====================================================================================
 */
 
 
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
#define MAX 1024000
/** 简单的素数集合*/
static long long primum[MAX] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 };
 
static long int count = 10;
 
 
/** 填加10001个素数进素数数组*/
void fill_prime(long long num)
{
 
	long long i = 31;
	long int j = 0;
	for (; i < num; i = i + 2) {
		int flag = 1;
		long long m=(long long)sqrt(i)+1;
		for (j = 0; primum[j] < m; j++) {
			if (i % primum[j] == 0) {
				flag = 0;
				break;
			}
		}
		if (flag)
		{
			primum[count++] = i;
			if(i>num)
				return;
		}
		if(count>MAX){
			printf("error%d\n",count);
			exit(1);
		}
	}
 
 
}
 
int main(int argc, char *argv[])
{
 
	int i;
	long long sum=0L;
	fill_prime(2000000);
 
	for(i=0;i<count;i++)
		if(primum[i]<2000000)
			sum+=primum[i];
 
	printf("count %d \n",count);
	printf("%lld\n",sum);
	//printf("%ld\n",primum[5]);
	return 0;
}

下面正面 PK :

1
2
3
4
5
6
7
xiooli@XIOOLI> time ./010-lerosua 
count 148933                                                                                    
142913828922                                                                                    
./010-lerosua  0.83s user 0.00s system 95% cpu 0.875 total
xiooli@XIOOLI> time python 010-xiooli.py
142913828922                                                                                     
python 010_xiooli.py  19.91s user 0.01s system 93% cpu 21.191 total

咳咳,差距呀~~~(厚颜无耻的说一句,比代码行数的话,我可不差哦。。)

好了,闲话少说,今天咱是有备而来,xiooli 要祭出杀手锏了:

1
2
3
4
5
6
7
8
9
10
11
12
13
xiooli@XIOOLI> shedskin 010_xiooli.py 
*** SHED SKIN Python-to-C++ Compiler 0.2 ***                                                    
Copyright 2005-2009 Mark Dufour; License GNU GPL version 3 (See LICENSE)                        
 
[iterative type analysis..]
**                         
iterations: 2 templates: 78
[generating c++ code..]    
xiooli@XIOOLI> make 
g++  -O2 -pipe -Wno-deprecated  -I. -I/usr/lib/shedskin-0.2/lib /usr/lib/shedskin-0.2/lib/builtin.cpp 010_xiooli.cpp /usr/lib/shedskin-0.2/lib/re.cpp -lgc -lpcre  -o 010_xiooli                  
xiooli@XIOOLI> time ./010_xiooli
142913828922                                                                                     
./010_xiooli  0.53s user 0.00s system 94% cpu 0.561 total

呵呵,生成的那个 cpp 和 hpp 乱七八糟的,加之我又不懂 C++,就不列出来了。
居然比 lerosua 童鞋辛辛苦苦写的那一大堆 C 的还要快 0.2 s 多呢,呵呵,shedskin 真是做题作弊之良器也阿。

ps:相信大点的程序要用 shedskin 转 C++ 的话挺够呛的,不过,可以把 python 程序里面的运行瓶颈部分拿出来转成 C++, 于整个程序的运行效率提高应该有很大的帮助呢。另外 shedskin 不是很灵光,python 里面一些很灵活的东西要写得比较死它才容易认,反正有提示的,遇到出错再改 py 文件。

窃笑中:估计 lerosua 童鞋要郁闷了。

Other ,

翻箱淘到的在线翻译脚本

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 , ,

Firefox下直接观看PPS看看

2009年10月16日
Comments Off

ubuntu论坛牛人写了pps的totem插件,可以用于观看pps的节目,具体安装方法debian系的参考http://forum.ubuntu.org.cn/viewtopic.php?f=74&t=223582
archlinux用以下命令即可安装:

yaourt -S libppswrapper-git gst-plugins-pps-git totem-pps-git libpps gst-plugins-sopcast-git totem-sopcast-git

但是这样只可以在totem的窗口里面看,当然也可以点击pps看看节目右边的客户端播放,然后将其关联到totem,但是总离不了一个独立的totem窗口,于是我们的 Hello World 童鞋在自我需求的推动下写了一个greasemonkey脚本,让其可直接在frefox的窗口下播放pps看看(当然是调用totem-pps的)。

要正常使用这个油猴脚本,你需要满足几个基本条件:
1) 能正常使用的totem-pps
2) totem-plugin(arch下的包名字,其他distro.里面自己找找吧)
3) firefox 安装并启用 greasemonkey

一切就绪以后你就可以去pps上面踢馆咯,哈哈!

greasemonkey 脚本从这里下载:http://forum.ubuntu.org.cn/download/file.php?id=80735,解压后拖到firefox的窗口里面进行安装。

秀图一张:
pps-in-ff

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 ,

关于版本号

2009年8月7日
Comments Off

设想系统的主版本号用年数表示,软件包(app模块)的版本号就用其中最主要程序的版本号,命名规则是前面加上表示优先级的数字(3位)-接模块名_接版本号.app。

例如:

将发布的 joolix 版本就定为: joolix 2009
今天压制的软件包比如 kdemod-kdemultimedia-juk 就是 00x-kdemod-kdemultimedia-juk_4.3.0-3.app, 或者觉得长的话就省掉中间的,成为 00x-kdemod-juk_4.3.0-3.app

还有关于版本昵称,采用同 ubuntu 相同的命名策略,joolix 2009 就叫 Crazy Crab

大家觉得怎么样阿?

Joolix ,