I am LAZY bones ? all linux

2009年 06月 的归档

环保是保护环境?不,是保护我们自己

这个标题是我在观看家园这电影的时候想到的.推荐大家也看看,480P的ED2K地址(2.1G),此版本的简体中文字幕(GB2312)在这里.其他版本的影片/字幕可以到这里找.

◎译  名 家园/地球很美有赖你(港)/卢贝松之抢救地球(台)
◎片  名 Home
◎年  代 2009
◎国  家 法国
◎类  别 纪录片
◎语  言 英语
◎字  幕 繁体中文/简体中文
◎IMDB评分 8.5/10 (1,821 votes)
◎IMDB链接 http://www.imdb.com/title/tt1014762
◎片  长 93 Min
◎导  演 扬恩·亚瑟 Yann Arthus-Bertrand
◎监  制 吕克·贝松 luc besson
◎主  演 Glenn Close… Narrator (voice)
◎简  介 
导演扬恩·亚瑟花了15年时间筹备,走访50个国家拍摄,由澳洲海底的大堡礁到非洲肯亚高原的乞力马扎罗山;亚玛逊热带雨林到戈壁沙漠;美国德萨斯州连绵不断的棉花田到中国上海的工业城镇。如诗如画的美景唤醒世人,乐观地珍视我们仍然保有的50%雨林,而非只着眼那失去的一半;更重要是地球60亿人类都应该醒觉,我们的责任所在……
卢贝松首度监制,国际名摄影师杨亚祖贝特杭执导的纪录片。以客观的角度阐述地球的诞生,演变以及地球现今所面临的种种问题!以一幕幕自然漂亮的画面带观众认识美丽的地球,并借此宣扬环保的重要以及迫切性。
自人类出现在地球上的二十万年以来,这个星球历经近四十亿年演化所建立起的平衡,不再井然有序。我们为此付出的代价太过高昂,但现在不是悲观的时刻- -人类还有十年能扭转这股趋向,了解过去我们巧取豪夺地球丰饶资源的完整真相,并改变人类的消耗模式。
国际摄影大师杨亚祖贝特为我们带来他走访超过五十个国家,全由空中俯瞰所拍摄的独特画面,分享他的惊奇与忧心,他的作品,立下一个我们必将共同重建的浩大工程基石。

我们每个人都应该更关注环保.

GRUB故障一例

今天一早,MM就打电话来说,她的电脑启动不了了,开机只显示一个GRUB…
当时由于各自在公司,不好处理,于是她先用ubuntu liveCD撑着,下班了,把电脑背了回来~
我打开一看,乖乖,果然只有一个”GRUB “,注意不是”GRUB> “后面跟一个闪动的光标,而是纯粹的GRUB空格后一个不会闪的光标,按任何键都没有用了.
故障肯定是MBR被破坏了,也不知道是不是windows下的病毒干的…
由于这电脑装的是原装的ubuntu+XP,恢复分区也已经在装XP时被我干掉了.之前备份的MBR也不知道去哪了…于是首先尝试用liveCD恢复grub.然而,可能由于之前装的grub2,jaunty liveCD里的grub仍然是老的,所以 grub-install 一直都没能成功.
后来我是在liveCD里这么做才成功的:

sudo mkdir /mnt/sda3
sudo mount /dev/sda3 /mnt/sda3
sudo mount -t proc none /mnt/sda3/proc
sudo mount -o bind /dev /mnt/sda3/dev
sudo chroot /mnt/sda3 /bin/bash
sudo grub-install /dev/sda3
sudo update-grub

这个故事告诉我们,有时候用liveCD修改MBR不成功的话,可以chroot用原来的grub的可执行文件进行修复,成功的概率会高很多~

开始使用wicd管理网络

wicd是一个轻量级的网络管理程序,支持有线连接和无线连接,号称可以代替NetworkManager.
今天对gentoo系统进行常规更新的过程中,发现 net-misc/networkmanager-0.7.1-r6 编译不过去了,一搜bugs.gentoo,果然已经有人报告过bug了.看来事情的起因是 sys-auth/policykit 升级到 0.92 版本之后,api/abi发生了变化,导致configure的时候找不到polkit-dbus导致的.
本来可以先把policykit降级,或者等待更新的.但是联想到最近Networkmanager老有问题,连无线网络经常要半天,反复禁用/启用以后才能连得上,再加上oceanboo又老在那边蛊惑,就决定删了NetworkManager,装上wicd试试.
由于之前全局启动了networkmanager这个use,所以卸掉它还得重新编译不少包.幸好wicd还确实是轻量级的,几秒钟就装上了.后来才发现原来wicd是python写的,界面是PyGTK,难怪编译起来这么快.
到目前为止,发现wicd还是挺不错的,虽然连无线还是很不容易,这个可能时AP的问题了,暂且不管.另外的配置/界面/功能什么的还是蛮舒服的.成熟度也还算是可以了,建议喜欢折腾或者喜欢轻量的朋友试试.

lrcdis 20090621 版本放出

最近有空的时候都在整gmbox,都好久没折腾lrcdis了.
现在sogou对bot的判断好像比以前严格了很多,所以之前的程序基本上下不到歌词了,可用性也就大打折扣了.
于是今天又抽了点时间更新了一下,顺便修复了几个小bug.推荐所有用户升级:下载地址|项目主页.
Changlog或者叫Release note:

  1. 到sogou下歌词时带上了cookie,出现验证码的几率小了很多.这代表了下载歌词的能力增强了.
  2. 下载的歌词都无法通过正确性检查时,保留第一个歌词.在这里强烈BS那些把歌词信息里的ti:和ar:改成广告信息的歌词制作者.见到一个把所有信息都改成”LRC之家”的歌词,这样即使内容是对的,程序也会认为非法.歌词制作者也太没道德了.
  3. 对本地已有歌词,即使通不过正确性检查也不重新下载,避免上面那种歌词循环下载
  4. 歌词正确性检查不再区分大小写
  5. 同时支持[nn:nn]和[nn:nn.nn]两种格式的时间戳

另外,老用户最好修改一下 ~/.config/lrcdis.conf 里的 Maxdowntimes 的值,个人感觉4就够用了,之前的10太大了.会影响歌词下载速度,对正确性提高也不大,划不来.新版已经默认成4了.
PS:感谢一下网友ptpt52,提了不少有用的建议.:)

把png转成ico的方法

如果你有个32×32的png图片,想转成ico,那就很简单了,直接:

convert x.png x.ico

convert真的是简单地可怕啊~
当然,如果你是在windows下面,那你也可以用这个命令行工具.用法也有说明了,我就不多说了.
PS:以上方法也可以用于生成 favicon.ico

折腾py2exe

序: 恩,这个确实挺折腾的,几乎一个下午都在搞py2exe,加上晚上又搞了一会儿,总算勉强让gmbox的exe可执行文件运行起来了…

首先,为什么要折腾py2exe呢? 其实就是为了那个gmbox,在设计之初,我就让它打算跨平台支持windows的.为此我也折腾过windows的python运行环境.但是如果那样的话,有windows的朋友要用gmbox,就必须安装python、GTK+库、PyCairo、PyGObject和PyGTK,这可不是一般的烦.所以有市场就会有需求,像我这样的问题我肯定不是第一个遇到的.于是就有了py2exe.
py2exe实际上是python distutils的一个扩展,使用py2exe,你必需有一个windows的环境,安装了python和你程序用到的依赖包(例如gmbox的pygtk等),也就是说,在这个”开发环境”你要能够运行起你的程序,然后下载py2exe,安装到python的lib目录下,就可以用来生成目标exe文件了,以后你只要把生成的东西复制到其他windows的机器,就可以脱离python运行环境和库的依赖了.是不是很爽呢?
虽说网上都说py2exe用起来很简单,但是我还是折腾了不少时间,可能是因为gmbox比较特殊:同时有CLI和GUI,有图标和数据文件,有自己的lib库等,当然更可能是因为我太菜了…嘿嘿..
不管怎么说,在这里记一下折腾的步骤,也许可以让后人少走点弯路:

  1. 打包文件(gmbox的打包文件在这里,建议边参考代码,边看下面的内容)最好要和你的主程序文件放在同一目录下.我曾经试着把打包文件放在上级目录,结果在搜索依赖库的时候遇到了很多麻烦.
  2. 打包文件本身其实也是一个python的程序,虽然一般只有一个setup函数.此函数可以有 name,description,version,console,windows,options,data_files 等参数.
  3. 要生成一个或多个命令行的exe,setup需要一个List型的名为console参数,指名源py文件.
  4. 要生成一个或多个GUI的exe,setup需要一个List型的名为windows参数,指名源py文件.List的每项都可以有图标等选项,就是icon_resources哪里,图标也是个Tuple的List,但是windows一般只会显示出第一个图标,所以一个就够了.
  5. 如果你想用png文件直接当图标,那很可能会在生成exe的时候,引起python崩溃,所以还是赶紧转成ico吧
  6. 如果你和我一样,生成的GUI的exe文件,在执行的时候,报 ImportError: No module named cairo ,那最好在setup函数里加上options,里面有include cairo的选项.
  7. 如果你也有数据文件(比如glade文件,图片文件等),py2exe默认并不会帮你一起打包,你需要在setup函数中加传data_files参数.data_files需要是一个List,每项可以是直接指向数据文件的字符串,也可以是一个Tuple;如果是前者,数据文件会直接在生成的dist目录下面,如果是后者,Tuple的第一个元素是目标目录,第二个元素是是个源文件名的List,效果是把所有的源文件存放在dist下的指定的目标目录下.(呃,好长好拗口…)
  8. 在py2exe生成的环境中,__file__这个应用将失效,这个问题的解决方法可以参看这里.个人觉得Alternate Solution更加靠谱.
  9. 好了,现在如果你已经写好了打包文件(win_packer.py),也对源代码进行了应有的修改,你就可以执行 python win_packer.py py2exe 来生成exe了,执行此命令会在当前目录下多出一个 dist 目录,你只要把dist目录复制出来,运行里面的exe,就可以了
  10. 最后,如果你的GUI程序还是运行不了,你还需要手工将你的GTK+安装安装目录(默认是C:\GTK)下的etc和lib目录复制到dist目录

当然,由于包含了一堆的运行环境,生成的dist目录将会是比较巨大的,现在的gmbox的exe居然有18M多,嘿嘿,应该还有优化和压缩的空间,改天再研究了~

终于在开源驱动下开起了compiz

写之前那篇blog的时候,我还是刚用上开源驱动.但是怎么试性能都上不去:
xorg.conf 也改了很多次,把 /etc/make.conf 里的 VIDEO_CARDS 改成 radeon 和 radeonhd 都试过,mesa xorg-server也来回编译过好几次,包括1.6的xorg-server,但是 glxgears 始终只有100FPS左右(fglrx的时候可以到2500+).而且,更可恶的是开compiz不是没边框就是直接白屏…
后来,查看 Xorg.0.log ,发现里面有这么几行:

drmOpenDevice: node name is /dev/dri/card0
drmOpenDevice: open result is -1, (No such device or address)
drmOpenDevice: open result is -1, (No such device or address)
drmOpenDevice: Open failed
[drm] failed to load kernel module "radeon"
(EE) RADEON(0): [dri] RADEONDRIGetVersion failed to open the DRM
[dri] Disabling DRI.

这种/dev/xxx的东西,马上就想到了是内核的原因,后面wd告诉我说要打开这个内核选项: Device Drivers -> Graphics support -> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) 并选中下面的A卡模块.
马上重新编译了内核,再启动,果然那几行错误没有了, glxgears 已经到 1100FPS 以上了.开compiz也正常了,整体感觉还是比较流畅的.
先就这样用着吧,不折腾了~目前我的情况是:

Mobility Radeon X1700 (RV535)
VIDEO_CARDS="radeonhd"
sys-kernel/gentoo-sources-2.6.30-r1
media-libs/mesa-7.4.2
x11-base/xorg-server-1.6.1.901-r3
x11-drivers/xf86-video-radeonhd-1.2.5
x11-wm/compiz-0.8.2-r2

开源?闭源?

之前我的A卡(Mobility Radeon X1700)一直都用得是闭源驱动,3D性能也还可以,glxgears可以跑到2500左右.
但是自从换上2.6.30的内核,fglrx就再也加载不成功了,不管是fglrx9.3还是9.5,都有问题,试了很多方法都没有成功,而且官方也已经把我的r535芯片归于”不支持”的行列了,ATI这么无情地把06年上市的卡给抛弃了,实在是让人气氛又无奈.
好在A卡还可以选择开源驱动,于是emerge了一个 xf86-video-ati ,倒是可以用了,但是glxgears只有100了…而且开compiz还是个白屏.可能是我的xorg.conf没有配置好吧,先睡觉了,明天再来配置…

给python增加IPC模块

前天介绍了linux进程间通信──消息队列,由于消息队列是linux内核提供的功能,所以理所当然地,C语言用起来最为方便:直接include一个sys/msg.h就可以了,所以之前的文章,我也是用C语言来做演示的.
那么我喜欢的Python能不能用IPC呢?能不能像C一样用消息队列呢?
其实,Python的内置模块里,并没有对IPC的支持,但是好在python的可扩展性超强,我们可以用swig来为python增加一个IPC模块.方法如下:
下载这个tar包(修改自这里),解压到任意目录,得到 ipc.h ipc.i Makefile 3个文件,如果你不是用的python2.6,需要修改一下 Makefile 里的路径(python3系列未测试).然后

make && make install

这样,你就可以在python里 import ipc模块了.
还是贴示例代码,保存为ipc_msg.py,并加可执行权限:

#!/usr/bin/env python
import sys,ipc
 
if len(sys.argv)==5 and sys.argv[3][0]=='s':
    ipc_key=int(sys.argv[1])
    msg_id = ipc.msgget(ipc_key,0666|ipc.IPC_CREAT)
    if 0 > msg_id:
        sys.exit(1)
    mbuf = ipc.msgbuf()
    mbuf.mtype = int(sys.argv[2])
    mbuf.mtext = sys.argv[4]
    if 0 > ipc.msgsnd(msg_id,mbuf,len(mbuf.mtext),0):
        sys.exit(3)
    print 'Send Success.'
elif len(sys.argv)==4 and sys.argv[3][0]=='r':
    ipc_key=int(sys.argv[1])
    mbuf = ipc.msgbuf()
    msg_id = ipc.msgget(ipc_key,0666)
    if 0 > msg_id:
        sys.exit(1)
    msg_len=ipc.msgrcv(msg_id,mbuf,2048,int(sys.argv[2]),ipc.IPC_NOWAIT)
    if 0 > msg_len:
        print 'No message received.'
        sys.exit(3)
    else:
        print 'Recv Success.(%d bytes):'% msg_len
        print mbuf.mtext
elif len(sys.argv)==3 and sys.argv[2][0]=='c':
    ipc_key=int(sys.argv[1])
    id_dsp = ipc.msqid_ds()
    msg_id = ipc.msgget(ipc_key,0666)
    if 0 > msg_id:
        sys.exit(1)
    if 0 > ipc.msgctl(msg_id,ipc.IPC_RMID,id_dsp):
        sys.exit(2)
else:
    print "usage: \n%s key type s message --to send message\n\
%s key type r --to receive\n\
%s key c --to clear queue"\
        %(sys.argv[0],sys.argv[0],sys.argv[0])

运行结果:

lily@LLY:~/test/ipc$ ipcs -q
 
------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    
 
lily@LLY:~/test/ipc$ ./ipc_msg.py 1 2 s abc
Send Success.
lily@LLY:~/test/ipc$ ipcs -q
 
------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    
0x00000001 65536      lily       666        3            1           
 
lily@LLY:~/test/ipc$ ./ipc_msg.py 1 2 r
Recv Success.(3 bytes):
abc
lily@LLY:~/test/ipc$ ipcs -q
 
------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    
0x00000001 65536      lily       666        0            0           
 
lily@LLY:~/test/ipc$ ./ipc_msg.py 1 c
lily@LLY:~/test/ipc$ ipcs -q
 
------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    
 
lily@LLY:~/test/ipc$

怎么样?和之前的C语言版本一模一样吧?

gentoo的内核升级到2.6.30 fglrx加载失败

昨天sync,发现有 sys-kernel/gentoo-sources-2.6.30 可用了,我没忍住,就升级上去了,其他的倒是没啥感觉,就是加载不了fglrx了…
虽然ati-drivers在我修改了一下ebuild以后,已经成功安装上去了,fglrx.ko也生成了,但是却加载不了,导致compiz不能用了.
modprobe fglrx的时候,提示:
FATAL: Error inserting fglrx (/lib/modules/2.6.30-gentoo-lly/video/fglrx.ko): Unknown symbol in module, or unknown parameter (see dmesg)
然后,dmesg里有这样两行:
fglrx: Unknown symbol flush_tlb_page
fglrx: Unknown symbol pci_enable_msi
应该是内核做了该动了.不知道有没有针对2.6.30的patch…不然,难道我要去用开源驱动了?

PS: 今天又发现了 sys-kernel/gentoo-sources-2.6.30-r1 orz…