2009年5月22日星期五

manage apache2 modules, the debian way

use a2enmod to enable modules
use a2dismod to disable modules

2009年5月15日星期五

sphinx的一点使用心得

为什么要用到sphinx呢?全文搜索,在此方面sphinx非常优秀。
为什么不考虑Lucene? 避免引入过多的复杂性,Lucene是基于Java的程序,我现在是对一个光盘镜像数据库进行索引,光盘的描述信息都存储在了和光盘镜像同名的的xml文件中,搜索界面直接用php和python即可,很简单,不想引入Java,在服务器上也不用过多配置了,另外,考虑到sphinx有一个xmlpipe驱动,我以为我只要写一个程序读取所有的xml文档,然后按照要求输出即可。xml文件信息中没有数据库中id的概念,而是根据上传时间生成了一个时间字符串,精确到秒,比如20090514101210. 我按照我的想法做了,发现一个问题
(1)Sphinx作为文档id的话,必须要求int值,在这里我是想直接使用时间字符串来做,可以经过实验发现sphinx最多支持id的长度为10位,也就是100亿,而时间字符串超长了。
(2)Sphinx在索引时并没有存储原始信息内容,所以搜索结果除了文档ID,什么也得不到,需要根据ID重新获取记录的原文,这样在没有数据库的条件下,从XML中检索效率太低,本来考虑在建立索引的时候,生成一个文档id到记录原文的索引,然后从此索引中拿数据,但是这样觉得多此一举,sphinx对于mysql是原生支持的,所以还是转换一次,从xml数据到mysql数据库,再用sphinx检索才可以。

从这两方面来讲,sphinx还是不能和Lucene比的,Lucene索引的数据中就可以直接获取摘要不用再从纪录集中取了,对于任何性质的文档都可以进行索引了。Sphinx的优点就是简单快速,所以要根据需要灵活选取了,为了不引入Java,我在此项目中还是使用sphinx好了。

2009年5月14日星期四

等待中的catalyst 9.5

由于ubuntu 9.04 ATI显卡的问题,使用catalyst 9.4驱动会出现窗口最大化跨越两屏的情况,这在使用双屏的时候是不可接受的,所以一直使用开源的radeon驱动,使用radeon驱动一切正常,但是就是速度不怎么样,而且不支持3D,想偶尔游戏下不行,所以一直等待这catalyst 9.5, 前一段时间一直有谣言说catalyst 9.5将在5月13日放出,我从昨天开始就在网上找,今天也没有找到,所以应该是谣言吧。

目前使用开源ATI驱动的问题是有的时候鼠标所在的位置会花一小块,虽然也不是什么big deal,但是还是感觉不爽,今天网上偶尔看到有关于性能调整的文章,照做了,果然产生了效果。

#section device
Option "AccelMethod" "EXA" #default is XAA, EXA is faster
Section "DRI“
Mode 0666
EndSection
Section "Extensions"
Option "Composite" "Enable"
EndSection

早先是知道这些调整选项的,但是ubuntu自动配置之后运行起来没有什么问题,就没有去管它了。现在调整一下效果更好了,不错,呵呵。

另外,找到了一个在gnome dual monitors下控制窗口的脚本,原来是想自己开发使得metacity具有转换monitor, workspace的功能,其实借用wmctrl程序,结合一些其他的小工具,这个功能就可以实现了,然后绑定到一个快捷键,即可达到一键移动窗口的功能了,在这个小脚本里面wmctrl指令的使用并没有什么特殊性的,值得关注的作者使用一些小工具做到了找到当前活动窗口的功能,这里贴一下, 根据这个脚本还可以调整wmctrl指令参数,达到把窗口在workspace中间传送的功能哦。

#!/bin/bash
# swap_monitor.sh
# Moves the active window to the other screen of a dual-screen Xinerama setup.
#
# Requires: wmctrl, xprop, xwininfo
#
# Author: Raphael Wimmer
# raphman@gmx.de

# get monitorWidth
monitorLine=$(xwininfo -root | grep "Width")
monitorWidth=$((${monitorLine:8}/2 ))
echo $monitorWidth

# get active window id
activeWinLine=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)")
activeWinId="${activeWinLine:40}"

# get window position
xPosLine=$(xwininfo -id $activeWinId | grep "Absolute upper-left X")
xPos=${xPosLine:25}

# get window width
xWidthLine=$(xwininfo -id $activeWinId | grep "Width")
xWidth=${xWidthLine:8}

# calculate new window position
if (( ${xPos} + ${xWidth}/2 > ${monitorWidth} ))
then xPos=$(( ${xPos} - ${monitorWidth}))
else xPos=$(( ${xPos} + ${monitorWidth}))
fi

# make sure window stays on screen completely
(( ${xPos} < 0 )) && xPos=0
(( ${xPos} + ${xWidth} > 2 * ${monitorWidth} )) &&
xPos=$((2*${monitorWidth} - ${xWidth}))

echo ${xPos}

# if maximized store info and de-maximize
winState=$(xprop -id ${activeWinId} | grep "_NET_WM_STATE(ATOM)" )

if [[ `echo ${winState} | grep "_NET_WM_STATE_MAXIMIZED_HORZ"` != "" ]]
then
maxH=1
wmctrl -i -r ${activeWinId} -b remove,maximized_horz
fi

if [[ `echo ${winState} | grep "_NET_WM_STATE_MAXIMIZED_VERT"` != "" ]]
then
maxV=1
wmctrl -i -r ${activeWinId} -b remove,maximized_vert
fi

# move window (finally)
wmctrl -i -r ${activeWinId} -e 0,${xPos},-1,-1,-1

# restore maximization
((${maxV})) && wmctrl -i -r ${activeWinId} -b add,maximized_vert
((${maxH})) && wmctrl -i -r ${activeWinId} -b add,maximized_horz

# raise window (seems to be necessary sometimes)
wmctrl -i -a ${activeWinId}

# and bye
exit 0

2009年5月12日星期二

使用gcc 4.3编译某些程序的出错问题解决

今天在ubuntu 9.04上编译sphinx的中文支持版本csft, 发现编译出错, mmseg出错, 提示找不到strncmp函数没有定义, google了一下才知道是gcc 4.3的问题, 为了加快编译速度, 那些常用的函数都必须显示包含了, 修改出错的文件加上对cstring的引用问题解决, 另外编译csft的时候, 会提示mmseg的一个头文件出错, 也必须在头文件中做类似修改, 下面是一个移植指引.
如果你编译的程序没有遵从这样的移植指引, 那么你就不得不自己去修改一下程序了.

2009年5月6日星期三

编写没有dos窗口的windows应用程序

近日需要开发一个通过网页可以启动daemon-tools挂载iso镜像的程序, 由于daemon-tools有命令行接口, 实际上只要使用一个c程序调用daemon.exe即可了. 做完之后效果不理想, 当运行时会出现一个黑的dos窗口, 严重影响用户体验, 经过google之后, 得到下面两个经验:
(1) 如果启动其他的应用程序, 使用system函数是会产生dos窗口的, 要改用WinExec程序, 在地二哥参数中传入SW_HIDE常量才可以. 另外, 应WinExec有额外的好处, 那就是它默认从它launcher程序被loader的地方寻找要启动的程序, 所以你被启动的程序可以不在系统环境路径中
(2) 如果要使得launcher程序本身没有dos窗口, 也需要一些额外的设置, 需要在程序中写下如下的编译器注释:

#pragma comment(linker,"/subsystem:\"Windows\" /entry:\"mainCRTStartup\"")

当然你用了这个之后就必须使用VC的编译器了, mingw/gcc不认这个注释.

2009年4月28日星期二

继续等待ubuntu 9.04成熟

前两天说想用9.04正式作为工作桌面了, 但是使用了两天的表现来看还是想呆在8.10下面, 使用9.04目前确实带来了启动速度的提高, 我机器上的测试是从27秒,减少到了18秒,提速30%.

但是也还是存在一些问题, 首先是双显示器的问题
(1) 使用ATI官方驱动,窗口最大化时会把两个屏幕认成一个屏幕, 所以会跨越两个屏幕, 这点非常不爽
(2) 使用开源驱动不玩游戏, 不开compiz也可以接受, 但是不知道怎么回事, 使用fvwm会搞反双屏, 或者干脆有一个屏幕起不来, 真是奇怪.

由于metacity不支持配置快捷键切换窗口屏幕, 所以平常用fvwm居多, 而上面两条问题, 会让我感觉工作巨不爽, 甚至还没有windows下双屏感觉好, 在windows下顶多只是切换屏幕低效一点, 偶尔hydravision控制软件不响应一下, 其他的感觉都还不错.

其实9.04虽然没有宣称有什么巨大的改变什么的, 但是实际上是跨越很大的一个版本, 内核升级, xorg升级, 这些"大头"的升级在各个版本上甚至都造成了问题, 我也是从Arch上遇到问题改回到ubuntu, 现在这些我以前遇到的问题在9.04上虽然有所改善, 但是还不够, 所以继续我的8.10吧!

另外, 最近的很多业余时间都花在配置系统上了, 这样是不对的, 使用好的操作系统的目的是为了加速工作, 提醒下自己不能本末倒置了!

2009年4月26日星期日

使用metacity内置的符合特性

说道窗口特效, 都会想当然的是compiz, 在ubuntu, 说道要开窗口特效,那么在桌面效果中开放, 可是日常工作中,并没有对特效有那么高的要求,而只想有个窗体阴影和透明, 有时候是显卡或者驱动不支持,比如我现在使用ubuntu 9.04就无法在双屏下开窗口特效, 这样本来也没有什么, 不过看着那个使用频率最高的gnome-do, 默认的那个很丑的界面, 心里总不是个滋味, 而皮肤选择要在符合窗口管理器打开的前提下才能使用,我原来也想当然的认为要开compiz, 心想这个没有戏了,必须承受这样的状况了。今天突然想到,以前看过一条文章,metacity在早几个版本就支持复合特性了,那么这个复合特性是不是gnome-do要求的符合特性呢?
使用配置编辑期把metacity的符合特性打开了, 嘿, 居然可以了, 很漂亮, 而且tilda也可以透明了!原来我总以为要开xcompmgr才可以开tilda透明, 原来是要用metacity的复合特性!以前在8.10中试过metacity的这个功能, 但是觉得比较卡,不好用,有时候有花屏的情况,但是在9.04中,使用开源ati驱动, 完全没有问题!^_^