I am LAZY bones ? all linux

2008年 11月 的归档

更新了e-file

之前发布的e-file,看起来好像还是挺受欢迎的,没多久,就有人给写了ebuild文件,进了gentoo-china overlay.于是打算再稍微完善一下.
周末去了趟上海,也没空更新这个脚本,拖到今天,终于弄好了,呵呵.
ChangeLog:

20081125:
优化代码结构
增加本地已安装版本的显示
增加Homepage和Description的显示

老套路,贴代码和截图:

#!/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 ,代码如下:

#!/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
	}
}'

截个图:

e-file截图

e-file截图


脚本下载地址

修改了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 那行,多加一个参数,如下:

job_server = pp.Server(ppservers=ppservers,secret="")

由于这个库,包装得不错,所以用起来也比较简单,基本上看了示例代码,就会了,使用方面也就不多介绍了,如果有可能的话,我倒是想写个gentoo的ebuild文件,嘿嘿.

模拟一唯随机游动

今天,无意中看到了这个blog里面的一篇有意思的文章.对里面的那个随机游动问题产生了一点兴趣:
原文中说: 1维和2维的随机游动是常返的,也就是说会无穷多次回到起点(但回来的平均时间期望是无穷的),而3维以上的随机游动是非常返的。因此对于2维的某个坐标,此物体会无穷多次经过,但是不会无穷多次经过原点。对一个完全没有方向感的人,在平面上不会迷路,但在宇宙中是会迷路的。
而且,还有个题目,说 一个物体从原点出发,每一秒以概率1/2向左走,1/2向右走,第一次回到原点的期望时间 比 一只猴子,每秒种随便按键盘上的一个键,第一次打出”Beijing Welcomes You”的期望时间 还要久,因为前者的期望是无穷大.
就有点奇怪了,顺手写了个程序验证一下,图方便,用了python,代码如下:

#!/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()&lt;0.5:
			r=r-1
		else:
			r=r+1
		if random.random()&lt;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了一个,就又正常了~
所以遇到问题,多看看日志输出,还是很有好处的…