存档

文章标签 ‘essay’

铁木真论汲福威 [ bones7456 所遭宫文文译 ]

2010年7月22日

bones7456 童鞋的一篇被宫文字,我将其翻译成文言了,希望 spy 们看不懂。大家随意转载

今幸能得见铁氏,与面谈,且洽且欢。当是时,吾就一朝庭G点所涉问题征之,铁氏不讳,与吾相谈甚详。事过少久,未曾详录,今但略述其意:
予问曰:君为淘宝首脑,所司皆关万维网,吾朝G点屡触者可料也,关乎此,君有何见?
铁氏略思,而白予言:尔所言者,无乃汲福威乎?
吾然之。
铁氏白言:夫人相沟通,理当自由,此无疑也。是故,朝廷之所行周厉事,非惟下劣,抑亦差强。思吾国屁民皆具小强之资,行区区张生之事可有难乎?然则,亦当思朝廷之不易也,内舆煽风者常有之,庙堂不思引导愚民,反相强制,犯言坑焚,斯非智也。近多闻民曝贪腐,下马者众,可见上恤草民,境况益良。故而不可但见其暗。世益明矣,吾预汲福威将日羸且亡。
吾又问曰:君将供役者暴汲氏械乎?(吾闻深圳某公司私供其役者VPN,甚羡之)
铁氏言:否也,须与朝廷相协处众,不可轻逆之,惧损根本也。
予思铁氏言,知其对汲福威事感同役者,期汲亡心亦同吾曹。惟然,朝廷所为予甚鄙之,然则对困境时亦当隐忍也。

注:
铁木真,即“陆兆禧”是也,前支付宝首脑,2008年3月始统领淘宝网
予,bones7456,花名“刘顺”。

Other ,

[幽默]夏季驱蚊脚本

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 ,

MCSE问道于傅师(Master Foo)文译

2010年6月17日

RT
这里看到一篇译文,感觉文章很有意思,于是自不量力参考该译文又重新翻译了一下。望大家砖头轻扔^^

一时,有擅瘟到死管理者诣傅师所,问道于师言:“闻师深精油里刻石(UNIX)之道,今以珍密相通,互受法益,师以可乎?”
师答曰:“善哉,尔今能作此觅智之举,然则实无珍密存乎油里刻石之道也。”
问道者大惑,而白师言:“然人皆曰师乃大贤于油里刻石之道者,能知过去现在一切最深奥密。师之于油里刻石,尤吾之于瘟到死(Windows)也。吾乃MCSE,且乎学贯世所鲜知之秘术,善能记忆诡秘之注册表项,更能详知任意之瘟到死API,乃至微软几忘者亦如是。是何密径吾师得缘以证如斯境界,弟子深欲知之!”
师答曰:“吾实无法可得。无一法可得者即是吾法,吾于大道实无所得!”
问者意甚嗔,谓师曰:“师自珍耳,若无秘法,何径师由而至此乎?”
师谓之曰:“人之误珍秘法,尤希光明者,珍其烛火,以手笼之,终被所灼。以是知之,无一秘法而吾自珍也。
问者闻之,豁然有悟。

ps:红色的是我自己的理解,不知道对不对,大家给点意见,呵呵

原文:

Master Foo and the MCSE
Once, a famous Windows system administrator came to Master Foo and asked him for instruction: “I have heard that you are a powerful Unix wizard. Let us trade secrets, that we may both gain thereby.”
Master Foo said: “It is good that you seek wisdom. But in the Way of Unix, there are no secrets.”
The administrator looked puzzled at this. “But it is said that you are a great Unix guru who knows all the innermost mysteries. As do I in Windows; I am an MCSE, and I have many other certifications of knowledge not common in the world. I know even the most obscure registry entries by heart. I can tell you everything about the Windows API, yes, even secrets those of Redmond have half-forgotten. What is the arcane lore that gives you your power?”
Master Foo said: “I have none. Nothing is hidden, nothing is revealed.”
Growing angry, the administrator said “Very well, if you hold no secrets, then tell me: what do I have to know to become as powerful in the Unix way as you?”
Master Foo said: “A man who mistakes secrets for knowledge is like a man who, seeking light, hugs a candle so closely that he smothers it and burns his hand.”
Upon hearing this, the administrator was enlightened.

Other ,

Boot logo for samsung spica i5700

2010年6月1日

RT
最近买了个三星的安卓手机,这几天都在折腾,呵呵。
鉴于折腾主义初级阶段的必经步骤,更换开机画面,这个是可以有滴,趁着 inkscape 还未生疏之际,鼓捣出了一个 boot logo,如下,板砖请省着点用,呵呵:

mylogo

怎么刷到机器里面去(samsung spica i5700 适用):
必要条件,有 root 权限,且有 /xbin/bml_flash(刷了 LK2-02-1_update.zip 这个的就有了)。

1
2
adb push ./mylogo.png logo.png
adb shell

然后在 adb 的 shell 里面执行

1
2
3
/xbin/bml_flash boot3 logo.png
# 重启看效果
reboot

搞定,启动画面是不是变了呢?

赫赫,折腾万岁!

Other ,

施氏暴汲福威记

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 ,

okular 阅读中文 pdf 无法显示汉字的解决

2010年4月6日

okular 是 kde 下的一个极好用的 pdf 阅读器,不过在读有些中文 pdf 的时候会出现不能显示汉字的情况(大概是没有嵌入字体的缘故),一直以来都不大看中文的文献/章,偶尔看看都用 acroread 解决,直到今天,实在无法忍受鸟,google 一下发现自己居然 out 了,okular 是用 poppler 做后端的,只需要安装一个 poppler-data 包就解决问题。按此解决,居然真的就搞定鸟,哈哈,腥粪,抄录在此以做备忘。

Other

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 ,