折腾

折腾了几天,搞了各种事情
* 升级Avant Window Navigator到trunk(0.3.9)
有一大堆的事情,比如说:
# bzr up之后,有冲突,干脆全部干掉重来。发现configure有问题,引用了莫名其妙的ac_python_version变量,这个东西哪里都没有。只好手动改成2.6。
# 引用了libdesktop-agnostic,ports里没有,上网去发现貌似也在launchpad上边,可能也是awn这群人搞的,遂bzr co下来
# 结果编译的时候有诸多问题,上网去,发现有bug-report,说是vala版本太新,而且他还branch了一个various-fixes分支出来
# 第一次听说vala,貌似是利用gobject这套系统,配合一个类似于C#的语言,给C以面向对象能力。编译的时候先弄成C再编译
# 再bzr co了那个fixes branch,终于好了。回头对付awn,还算比较容易
# 新版多了个curve模式,貌似速度也好不少,稳定性也是,看来这个rewrite还不错
* 升级awn-extras
也有不少事情:
# 发现里面的各个菜单组件都或者崩溃或者没有程序菜单,追溯到python-gmenu,最后看调试信息,发现没有applications.menu文件
# 本来想生成一个完了,但是下了个菜单编辑工具alacarte,发现这个里面已经有程序菜单了…… 而且gnome-panel也有…… 标准不统一啊……
# 之后再查资料,发现说XDG这套标准允许有前缀,并且通过locate得知有一个gnome-applications.menu在恰当的地方
# 最后通过把XDG_MENU_PREFIX设为gnome-解决
# 之后又是发现那个Media Player Applet不能放大的(不是文件大小)视频。怀疑和之前totem的问题一样
# 看代码发现用的playbin这个gstreamer组件,直接gst-launch,果然出错,而且信息和totem的一样
# 上网搜了一下,有人说totem的pkg-message里说了这个问题,果然有…… 用了就好了
# 说明这个问题不只totem有,用gstreamer的都有…… 为啥默认的那些shm的参数那么小……
* xps文件查看
上两天有人发来xps文件,不能看…… 去网上下了XPS Essentials装,结果wine运行说有gdiplus的函数没实现…… 搜了之后,发现新版wine实现了,遂下载新版,结果换了一个函数…… 只好拷了一个gdiplus.dll过来,运行倒是可以,就是换页要好几秒……
于是去网上找开源解决方案,找到ghostxps,后来发现就是ghostscript那个公司做的。直接转pdf,10M的xps变成了5xxK,但是里面图片质量很差。
去网上看了一下,对latex转pdf有人说应该先转ps再ps2pdf,应该是同理。但是直接转出来的ps竟然有4xxM…… 再转pdf,有17M,还能忍受,质量很好
* skype
bsd ports里面那个skype是static的2.0.0.72-oss版,我输入不了中文,遂尝试新版。
结果新版2.1.0.xx的dynamic版都会卡死在futex系统调用上,而static版不但不能输入中文,还没有声音……
搜索得知,新版用了pulse,遂用rpm安装alsa的pulse插件,linux的pulse库等,结果运行时说shm_open没有实现…… 还是不行
又尝试装了alsa的oss插件,并且设为默认,这次终于有声音了,但是…… 不能录音……
最后还是回归老的了……
* 自动挂载
本来我山寨了一个自动挂载脚本,利用devd的CDEV建立事件,在ntfs/*和msdosfs/*出现的时候,自动挂载到/mnt/*
结果现在有了iPod,就有问题了:我一般只是想充电而已
于是要挂载自动camcontrol eject,问题是CDEV事件不包括设备名,只有label。在找不到反查工具的情况下,只好自己从label查设备
大致上就是一个枚举,利用gpart结果得到所有设备,然后用glabel得到上面的label,并且进行匹配,符合的就是对应设备。
搞的时候发现,glabel status的第一行输出一直是Name Status Components,而Name下面显示的就是label,而且Name的最后一个字母严格和label最后一个字母对齐,通过这个,可以保证从输出结果得到的label是完整的label,不多不少。
现在碰见iPod就会自动卸载了,真不错……
* easytag的崩溃问题
本来easytag给某些歌写tag的时候,总是崩溃。
这两天研究一下,发现都是不正常的ape tag引起的。虽然easytag本身只写id3 tag,但是他写的时候,会先清除ape tag,而要清除就要先解释,于是就挂了…… 我搞了py-apetag下来,结果删tag的时候也说不能解释……
你们删除tag就不会简单地先删掉再建一个空的么…… 非要解释……
最后手动把文件结尾APETAGEX开始的东西全干掉,世界清静了……

感想:
# gstreamer好强大,我视频库里那些视频都可以放…… 虽然对字幕的支持还是令人怀疑
# 发现一个好东西,gst-editor,类似于windows里directx开发包里那个编辑directshow filter图的那个东西,这里是编辑gstreamer 组件图,还能直接调试,虽然偶尔会崩溃……(这个东西现在其实在google code上,不在gstreamer官网上)
# 下东西发现freebsd默认perl版本改成5.10了,择日升级吧…… 好多包……
# 发现labyrinth这个mind map工具不错,操作简单,功能基本上够用,速度快

Hacking FreeBSD to change manual page width

I don’t like the fixed width of manual pages, since I have such a wide terminal, but the man pages only occupied the left part.
By inspecting the process launched, it seems like that there are several processes related:
sh -c (cd /usr/share/man/en.UTF-8 ; /usr/bin/zcat /usr/share/man/en.UTF-8/man1/ls.1.gz | /usr/bin/tbl | /usr/bin/groff -S -Wall -mtty-char -man -Tutf8 | /usr/bin/col | less)
I tried to skip the most processes, and simplify the calling sequence, and finally I found that the most important process is groff.
After unzipped the ls.1.gz, I found that there’s no clear marks of line ending. This encouraged me, since this makes possible to adjust the output width in later steps.
I did some experiments, and I found that the -man and -Tutf8 arguments are critical to the page width. I read the man page of groff, and found that if -Tutf8 is specified, then groff use grotty as postprocessor. I turned to the man page of grotty, but found nothing useful. However, the man page of groff_man supplied useful information: -rIN seems hopeful.
However, when I tried -rIN=130, the output is nothing different from the original. Finally, I turned to Google, and found this post: http://www.cygwin.com/ml/cygwin/2004-11/msg01003.html
So I know that first I should use -rLL and -rLT, and secondly I should use 130n instead of 130.
After adding these to the command line, the output looked like what I wanted. I want to automate the process, so I tried a method similar to the one in the post: changing the source of man by hand.
I greped and found /usr/src/gnu/usr.bin/man/Makefile.inc is the source of the command arguments. However, changing this is not so easy, since it would be interpreted by sed, and then by sh. So I changed /usr/src/gnu/usr.bin/man/lib/config.h instead. With some experiments, finally it worked. I added  -rLL=`echo $MANWIDTH`n -rLT=`echo $MANWIDTH`n into #define NROFF.
The last thing to do is to set MANWIDTH. I Googled about finding terminal width, and found this:
http://markmail.org/message/3gui7ymobsj65mje#query:get%20terminal%20width+page:1+mid:t6hhk3dmnfjyg52b+state:results
It is said that `tput cols` would do the work, and really it worked.
So I added setenv MANWIDTH `tput cols` into ~/.cshrc, and everything worked like a charm~
Now I can fully utilize my screen width!~

关于func_get_args()的小错

今天帮同学部署一个小网站,用了php,还有ajax。结果在他们本机调试很好,我弄到服务器上面,就出了问题:
Fatal error: func_get_args(): Can’t be used as a function parameter in
这个很奇怪,搜了一下,貌似其实是php的一个限制(bug?),可以参见http://bugs.php.net/bug.php?id=34120
貌似是实现的问题,func_get_args()这个东西不能直接用在函数的参数里面(其实文档这么说,用作第一个参数还是可以的…… 第二个就不行了)。必须要先把它赋给一个变量,然后再作为函数参数。
For example,根据文档,这两个都不行:
a(func_get_args(0));
b(1, func_get_args(0));

但其实,第一个是可以的,第二个会出上面那个错。
改成
$x=func_get_args(0);
a($x);
b(1,$x);
就可以了。
同学说他们的php是5.3.1,服务器上是5.2.12,大概5.3搞定了这个事情吧……

终于有图标了

如果你用的是Unix类系统,并且还是非标准桌面(例如LXDE一类……)
并且发现,你启动file-roller,pcmanx,nautilus等的图标都很奇怪或者没有
那么可能是这个问题:系统不知道用啥图标,或者找不到图标
去/usr/local/share/icons(Linux同学们可能没有local)
看看有哪几个是有不少图片的,并且有index.theme的,可能就可以作为图标主题
然后在~/.gtkrc-2.0里面加上:
gtk-icon-theme-name=”<目录名>”
就会有图标了……
如果试了都不成,就去装gnome-icons-这个样子的软件包再看看吧……
之前我发现是gnome-settings-daemon运行之后就会有图标
但是我又不喜欢一切都由gnome控制面板一类的设置,gtk-chtheme多好
终于pcmanfm启动的时候,给了个提示,解决了问题……
PS. PCManFM作者还写了PCManX,貌似和LXDE还有关系,真nb……

一些见闻

世博会快开了,电视里天天播新闻前,都要说还有多少天开世博会。
有些事情不一样。一天我早上乘地铁出去,晚上坐地铁回来,一路上碰见四个乞丐…… 这是从前从来没有过的,以前一次地铁能碰见一次已经不太容易了,这次竟然每次两个…… 难道是为了开世博会,把地面上的乞丐都赶到地下了么……
说起地铁,据说世博会的时候会有一亿人流。现在在一天的高峰的时候,各条地铁都已经很拥挤了,到世博会的时候,估计要给大多数人放假了吧……
我附近不少北京人对于奥运会是负面情绪更多,不知道世博会之后,上海人会是什么想法…… 估计也没什么希望……