2008年 11月 的归档
更新了e-file
之前发布的e-file,看起来好像还是挺受欢迎的,没多久,就有人给写了ebuild文件,进了gentoo-china overlay.于是打算再稍微完善一下.
周末去了趟上海,也没空更新这个脚本,拖到今天,终于弄好了,呵呵.
ChangeLog:
20081125:
优化代码结构
增加本地已安装版本的显示
增加Homepage和Description的显示
老套路,贴代码和截图:
|
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 |
#!/bin/sh #AUTHOR: bones7456 (bones7456<at>gmail<dot>com) ##License: GPL #e-file is like apt-file for gentoo, but data is online VERSION=20081125 function printhelp(){ cat <<EOF This is e-file ($VERSION) Usage: `basename $0` filename EOF } if [[ $# -ne 1 ]];then printhelp exit 1 fi URL="http://www.portagefilelist.de/index.php/Special:PFLQuery2?file=$1&searchfile=lookup&lookup=file#result" w3m -dump -cols 3000 $URL | awk ' BEGIN{ FLAG=0 FOUND=0 "emerge --info | grep PORTDIR" | getline split($0,PORTDIR,/\"/) } { if($1=="dir" && $2=="package"){ FLAG=1 next } if($1=="Retrieved" && $2=="from"){ if(FOUND){ for(pkg in vers){ split(pkg,ii,/\//) NF=0 cmd="ls -tgGd --time-style=+%c /var/db/pkg/" pkg "* 2>/dev/null" cmd | getline if(NF==0){ installed=0 }else{ installed=1 install_time="" for(i=4;i<NF;i++)install_time=install_time " " $i install_time=substr(install_time,2) split($NF,install_arr,pkg "-") } NF=0 cmd="(grep -h HOMEPAGE " PORTDIR[2] "/" pkg "/*.ebuild | tail -n 1)2>/dev/null" cmd | getline if(NF==0){ HOMEPAGE="" }else{ split($0,tempArr,/\"/) HOMEPAGE=tempArr[2] } NF=0 cmd="(grep -h DESCRIPTION " PORTDIR[2] "/" pkg "/*.ebuild | tail -n 1)2>/dev/null" cmd | getline if(NF==0){ DESCRIPTION="" }else{ split($0,tempArr,/\"/) DESCRIPTION=tempArr[2] } setcolor(1,32) if(installed){ printf("[I] ") }else{ printf(" * ") } clearcolor() printf("%s/",ii[1]) setcolor(1,29) printf("%s\n",ii[2]) setcolor(0,32) printf("\tAvailable Versions:\t%s\n",vers[pkg]) if(installed){ printf("\tLast Installed Ver:\t") setcolor(7,34) printf("%s",install_arr[2]) setcolor(0,35) printf("(%s)\n",install_time) setcolor(0,32) } if(HOMEPAGE){ printf("\tHomepage:\t\t") clearcolor() printf("%s\n",HOMEPAGE) setcolor(0,32) } if(DESCRIPTION){ printf("\tDescription:\t\t") clearcolor() printf("%s\n",DESCRIPTION) setcolor(0,32) } printf("\tMatched Files:\t\t") clearcolor() printf("%s\n\n",files[pkg]) } }else{ print "No matches found." } exit } if(FLAG==1 && NF!=0){ T=1 split(vers[$1 "/" $2],vers_arr,/ /) for(i in vers_arr){ if(vers_arr[i]==$NF){ T=0 break } } if(T)vers[$1 "/" $2]=$NF " " vers[$1 "/" $2] T=1 split(files[$1 "/" $2],files_arr,/; /) for(i in files_arr){ if(files_arr[i]==($3 "/" $4)){ T=0 break } } if(T)files[$1 "/" $2]=$3 "/" $4 "; " files[$1 "/" $2] FOUND=1 } } function setcolor(a,b){ printf("%c[%d;%d;%dm",27,2,a,b) } function clearcolor(){ printf("%c[0m",27) } ' |

从图中看到的,其实 portagefilelist.de 的数据也是比较旧的,sys-process/dcron的版本还停留在 2.9 的年代,而本地安装的,早已经是 3.2 了.
脚本下载地址
重新用回官方A卡驱动
我的x1700卡,之前一直因为ati-drivers暂时不支持xorg-server,所以用的是开源驱动,但是开源驱动对我这个卡的支持真的是比较烂,没有3D加速,开不了compiz,glxgears也只有100FPS左右…所以之前一段时间,我还是经常回ubuntu下去,不知道ubuntu从哪里来的驱动,8.10的xorg-server也是1.5.2的,但是驱动却可以用…呵呵.
前几天,AMD官方终于更新了驱动的版本,而这个版本的一大重要特性就是开始支持xorg-server的新版本了,现在gentoo的portage里面也有了,所以我就理所当然得用回官方驱动了.
用回ati-drivers以后,一开始也有点问题,但是参考wiki,基本上就搞定了,哈哈,gentoo终于又可以compiz喽.
$ glxgears
12412 frames in 5.0 seconds = 2482.345 FPS
12551 frames in 5.0 seconds = 2509.578 FPS
这个也正常了.
e-file 根据文件名查询gentoo包的脚本
一直想在gentoo下实现一个类似ubuntu的apt-file的功能,幸好已经有 http://www.portagefilelist.de 这个网站了,就花了2小时写了个小脚本直接到这个站取数据了,感觉效果还可以,先发出来,算是预览版吧,以后会再完善的.
输出格式参考了 eix ,代码如下:
|
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 |
#!/bin/sh #AUTHOR: bones7456 (bones7456<at>gmail<dot>com) #VERSION: 20081120 ##License: GPL #e-file is like apt-file for gentoo, but data is online if [[ $# -ne 1 ]];then echo "Usage: `basename $0` filename" exit 1 fi URL="http://www.portagefilelist.de/index.php/Special:PFLQuery2?file=$1&searchfile=lookup&lookup=file#result" w3m -dump -cols 3000 $URL | awk ' BEGIN{ FLAG=0 FOUND=0 } { if($1=="dir" && $2=="package"){ FLAG=1 next } if($1=="Retrieved" && $2=="from"){ if(FOUND){ for(i in ver){ split(i,ii,/\//) printf("%c[%d;%d;%dm* ",27,2,0,32) printf("%c[0m%s/",27,ii[1]) printf("%c[%d;%d;%dm%s\n",27,2,1,29,ii[2]) printf("%c[%d;%d;%dm\t",27,2,0,32) printf("Available versions:\t%s\n",ver[i]) printf("\tMatched File:\t\t") printf("%c[0m",27) printf("%s\n\n",file[i]) } }else{ print "No matches found." } exit } if(FLAG==1 && NF!=0){ ver[$1 "/" $2]=$NF " " ver[$1 "/" $2] file[$1 "/" $2]=$3 "/" $4 FOUND=1 } }' |
截个图:

脚本下载地址
修改了gentoo的组ID
由于我的/home分区是ubuntu和gentoo公用的,这样不管在哪个系统,都能很方便地公用程序的配置.但却又引发了一个小问题:
ubuntu下 我的用户是 uid=1000,gid=1000的,gentoo下,1000这个gid却被dhcp组占用了,生成的用户组id是1004.
这样就出现了一个怪现象,原来在ubuntu下,用户创建的文件,到了gentoo下,就被当初了dhcp组;gentoo下创建的文件在ubuntu下又是无法识别的组了.由于机器上只有一个用户,所以虽然此问题并没有给我带来什么麻烦,但总归是个隐患.于是想修正它,其实方法也很简单:
就是在ubuntu下,把gentoo根分区挂到 /mnt/gentoo ,然后
sudo vim /mnt/gentoo/etc/group
把里面的1004改成1000,1000改成1004,保存退出.
sudo vim /mnt/gentoo/etc/passwd
把里面的 lily:x:1000:1004::/home/lily:/bin/bash 改成 lily:x:1000:1000::/home/lily:/bin/bash
再执行:
sudo find /home/ -gid 1004 -exec chgrp -h 1000 {} \;
sudo find /mnt/gentoo -gid 1000 -exec chgrp -h 1004 {} \;
好了~万事大吉~~嘿嘿.
linux QQ 1.0 preview3
QQ for Linux 1.0 Preview3 发布了,下载地址: http://im.qq.com/qq/linux/download.shtml
这个版本最大的改进肯定是文件传送了~哈哈~
看来QQ还是一步一步在改进的哦,加油.
另外,我们还看到windows版的QQ也在悄然发生着变化:
QQ2008II Beta1安装文件大小25.2M ,但是 QQ2009 preview3 的安装文件却只有 13.8M .
而且2009版本里面的所有广告都消失了,包括聊天窗口的上下广告和弹出的mini首页等,而且风格和linux版本的也越来越像了.这些特性是不是会在正式版里面得以保留呢?是不是腾讯正在经历一个重要的转型呢?我们希望是,我们拭目以待…
PS: 刚参加了腾讯的10周年活动,就是登录 10.qq.com ,会告诉你你的QQ是什么时候注册的,发现自己的QQ注册于 2000年09月17日 QQ年龄: 8.1年 ….
搬家喽~
现在,本blog终于有顶级域名了,哈哈~~庆祝一下!!
之前的blog是在ubuntu-cn的服务器上的,得益于WP的强大,数据迁移比较顺利,而且oneleaf老大还热心得把我以前上传的附件打包了,就更方便了.
整了一天,主题和插件基本都是一样的,和老的站点,除了url不一样,应该感觉不出区别吧~而且lupa的空间,速度貌似不错哦~
建站之初,很多东西还要慢慢完善,大伙如果有什么建议,可千万别保留哦~谢谢大家!
python多处理器编程
由于上次做的那个一维随机游走程序,虽然简单,但是大数据的时候很费CPU,而且我注意到我的双核处理器始终只有一核是处于满负荷工作,另一个核的性能没有得到发挥.而且我也试过把同样的程序放到一个8核的服务器上运行,结果解题的速度也只是比我本本快那么一点点,估计也只是那服务器的CPU主频(2GHz)比我的1.86GHz略高而已,完全没有发挥出他8核的优势.
所以马上想到了python有没有多处理机的机制,上网google一下,发现由于python是解释型的语言,而Python解释器使用GIL(全局解释器锁)来在内部禁止并行执行,正是这个GIL限制你在多核处理器上同一时间也只能执行一条字节码指令.猜想这个GIL也是当初为了设计解释器方便而搞的吧.而且据说python 3.0 里面已经改进了,默认有了多处理器编程的库了.但是毕竟现在python3.0还没有流行起来,那么现在有没有变通的方法呢?
当然有~不然我就不会写这文章了嘛~
Parallel Python 这个库,正是为了解决我们的问题而设计的,而且它不仅可以多核处理器协同工作,还可以通过网络集群运行呢,嘿嘿.
下面的中文介绍来自这里:
1 简介
PP 是一个Python模块,提供了在SMP(多CPU或多核)和集群(通过网络连接的多台计算机)上并行执行Python代码的机制。轻量级,易于安装,并集成了其他软件。PP也是一个用纯Python代码实现的跨平台,开放源码模块。
2 功能
* 在SMP和集群上并行执行Python代码
* 易于理解和实现的基于工作的并行机制,便于把穿行应用转换成并行的
* 自动构造最佳配置(默认时工作进程数量等同于系统处理器数量)
* 动态处理器分配(允许运行时改变工作处理器数量)
* 函数的工作缓存(透明的缓存机制确保后续调用降低负载)
* 动态负载均衡(任务被动态的分配到各个处理器上)
* 基于SHA的连接加密认证
* 跨平台移植(Windows/Linux/Unix)
* 开放源代码3 开发动机
现代Python程序已经广泛的应用在商业逻辑,数据分析和科学计算等方面。其中广泛应用着SMP(多处理器或多核)和集群(通过网络连接的多台计算机),市场需要并行的执行的Python代码。
在SMP计算机上编写并行程序最简单的方法是使用多线程。尽管如此,使用 ‘thread’ 和 ‘threading’ 模块仍然无法在字节码一级实现并行。因为Python解释器使用GIL(全局解释器锁)来在内部禁止并行执行。这个GIL限制你在SMP机器上同一时间也只能执行一条字节码指令。
PP 模块正是为了解决这个问题而来,提供简单的方式实现并行Python应用。 ppsmp 在内部使用 进程 和 IPC (进程间通信)来组织并行计算。并处理了所有内部的细节和复杂性,你的应用程序只需要提交工作任务并取回结果就可以了。这也是编写并行程序的最简单的方法。
为了更好的实现,所有使用 PP 的软件通过网络来连接和协作。跨平台和动态负载均衡使得 PP 可以轻松组织多平台、异构的集群计算环境。4 安装
任何平台:下载模块压缩包,解压,运行setup脚本:
python setup.py install
Windows:下载和执行安装包。
另外,debian和ubuntu用户,也可以通过apt直接下载安装,包名是 python-pp ,但是由于版本比较老,是 1.5.4 版本的,而最新的是 1.5.6 ,所以官方页面上的示例代码可能运行不了,会出现以下错误提示:
Traceback (most recent call last):
File “testpp.py”, line 46, in
job_server = pp.Server(ppservers=ppservers)
File “/var/lib/python-support/python2.5/pp.py”, line 312, in __init__
raise ValueError(“secret must be set using command-line option or configuration file”)
ValueError: secret must be set using command-line option or configuration file
原因是代码的不兼容性,解决办法就是找到 pp.Server 那行,多加一个参数,如下:
|
1 |
job_server = pp.Server(ppservers=ppservers,secret="") |
由于这个库,包装得不错,所以用起来也比较简单,基本上看了示例代码,就会了,使用方面也就不多介绍了,如果有可能的话,我倒是想写个gentoo的ebuild文件,嘿嘿.
模拟一唯随机游动
今天,无意中看到了这个blog里面的一篇有意思的文章.对里面的那个随机游动问题产生了一点兴趣:
原文中说: 1维和2维的随机游动是常返的,也就是说会无穷多次回到起点(但回来的平均时间期望是无穷的),而3维以上的随机游动是非常返的。因此对于2维的某个坐标,此物体会无穷多次经过,但是不会无穷多次经过原点。对一个完全没有方向感的人,在平面上不会迷路,但在宇宙中是会迷路的。
而且,还有个题目,说 一个物体从原点出发,每一秒以概率1/2向左走,1/2向右走,第一次回到原点的期望时间 比 一只猴子,每秒种随便按键盘上的一个键,第一次打出”Beijing Welcomes You”的期望时间 还要久,因为前者的期望是无穷大.
就有点奇怪了,顺手写了个程序验证一下,图方便,用了python,代码如下:
|
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 |
#!/usr/bin/env python # -*- encoding: utf-8 -*- import random # Nmax 是样本数 Nmax=10000 # A这个字典用于存放每个结果的次数 A={} for N in range(0,Nmax): r=0 i=0 while True: #为了使结果不都是偶数,也为了少一半循环,每次循环都random两遍. if random.random()<0.5: r=r-1 else: r=r+1 if random.random()<0.5: r=r-1 else: r=r+1 i=i+1 if r==0: #如果r==0,就说明回到原点了,记下结果,结束这个样本 if i in A: A[i]=A[i]+1 else: A[i]=1 break #所有样本都算完以后,对结果进行排序输出,并计算平均值 k=A.keys() k.sort() T=0 for i in range(0,len(k)): print "%d\t = %d"%(k[i],A[k[i]]) T=T+k[i]*A[k[i]] print "avg=",T/Nmax |
这个代码会输出Nmax个样本里面,一维随机游走问题的各个秒数次数.
在Nmax样本数为10000的时候,如果运气好的话,可以在3秒内跑完,但是如果运气不好的话,就难说了,我最多的一次跑了45分钟,最大的一个样本,用了1679075437个循环,才跳回来…嘿嘿.看来那个无穷的期望是真的…
这个试验也告诉我们,即使在没有作弊的情况下,赌博输掉的人想要回本,也许要等到下辈子的下辈子的下辈子…..
键盘快捷键问题
gentoo和ubuntu共用/home,又发现新问题了:在ubuntu下设置了音量大小和静音的快捷键以后,到了gentoo下就不能用了,同样,gentoo下设置好以后,ubuntu下也不能用.
仔细看了键盘快捷键的设置界面,发现ubuntu下设置的是类似 XF86AudioMute/XF86AudioRaiseVolume/XF86AudioLowerVolume 之类的字符串,而gentoo下则是 0x**的键值,很明显是gentoo没有给键值定义名称,于是用 xev把几个键的键值都记下以后,写了一个 /etc/X11/Xmodmap 文件,我的内容如下(不同型号的硬解应该不一样):
keycode 160 = XF86AudioMute
keycode 176 = XF86AudioRaiseVolume
keycode 174 = XF86AudioLowerVolume
然后重启X,就两边都正常了,娃哈哈…
升级了ubuntu后,gentoo的gnome启动不了问题
昨天,刚把ubuntu升级成了8.10,就一整天用的都是ubuntu,也觉得挺好的.
今天又想用gentoo了,把menu.lst恢复(一早就知道ubuntu会覆盖这文件的,所以早有准备)以后,启动到也正常.到了gdm,输完用户名和密码以后,傻住了,splash都没出来…
到tty1下面看了一下 .xsession-errors 文件,发现在启动什么seahorse组件的时候,报没有 libgail-gnome ,可能是ubuntu下的gnome更新以后,多启动的东西吧,但是这东西gentoo下还没安装,于是马上eix了一下,gentoo下也有现成的包,emerge了一个,就又正常了~
所以遇到问题,多看看日志输出,还是很有好处的…