2009年5月22日星期五

亲爱的,你听我说

亲爱的,
我在写这些东西的时候, 你就坐在不远的地方背对着我,
你知道吗, 我此刻有多么的难受和伤心, 看着你刚刚的表现, 我对我们的未来生活不禁担心起来.

在一起这么久, 我总想着我们可以跨越一切困难, 一起走下去, 我总认为作为男人, 我可以承担起组建家庭的一切. 交往快两年了, 中间吵吵闹闹, 甚至一度分手, 可每当想起你的好, 想起你写在我日记本上的那些傻傻的文字, 想起被你收拾的干干净净的家里, 我就舍不得, 我想, 我努力一点, 我容忍一点, 我们在一起就会好的.

宝贝, 我从来不理会别人的评价, 也从来不想去想我们之间学历的差距, 我也没有认为我正规大学毕业和你一个旅游职业学校的中专生相比会有什么优越感, 我相信自己的感觉, 我觉得你会成为一个好妻子, 可是, 我有时候真的发现我们不能互相理解.

今年, 旅游业不景气, 一直在张家界没有赚到什么钱的你, 准备到长沙来发展, 也为将来结婚在长沙立足打个基础. 而你似乎也对旅游业厌烦了, 不想再在旅游业内工作. 我托熟人在机票代理行业给你找个位子, 可是回复是今年经济情况不好, 大家都要熟手. 我们也一起分析过你的优势和劣势, 学历低, 没有什么特长, 再加上想转行无疑是艰难的, 在各大招聘网站搜索的结果, 适合你工作的没有几个, 而你却还是迷茫的, 你在想着期望中的导游高薪水, 而实际上又是饥一顿饱一顿的日子, 我想你先安定下来, 然后我辅导你学习专业技术, 提升学历, 然后再一步一步发展, 可以似乎看不到, 在你的眼中, 那些职业都是看不上的, 可自己实际上又是高不成低不就的, 你的眼中我看到的斗志越来越少.

刚给你在网上参考的职业, 帮你发邮件去应聘咨询, 你却担心会马上聘上不能下周回去跟你见父母, 这让我很难受和失望, 还记得去年我推荐你来我们公司应聘呼叫中心人员, 你却连简历表都填不好, 也许你没有经历过这些, 可是我心中的你, 冰雪聪明啊, 人只要有信心就可以提升啊, 你为什么就不能坚持, 为什么就不能理解呢?

去见你的父母, 有时间都可以去, 我的父母你见过了, 大家都喜欢你, 房子也准备买了, 只查你能在长沙立足下来, 可我看到现在的你真是好无助, 我不知道你心里到底在想什么, 我跟你说, 你听不进去, 还理直气壮的跟我吵, 可我是为了我们的将来啊.

我是一直好好奋斗的, 也会为了你的幸福一直奋斗下去, 可是作为一个刚刚毕业三年的人, 我现在拿什么来养活你呢, 你说你不想当家庭主妇, 可是你要有自己的能力能立足啊, 我需要你和我一起奋斗啊, 我甚至在心里设想, 将来我们要一起创办一个小公司, 我利用业余时间负责技术层面的东西, 你来做日常管理的工作, 我想我们会比那些对我们评价的人过得好的, 可你的斗志呢, 你跟我说过的斗志和信心呢? 你的智慧和理解呢?

宝贝, 对不起, 我决定了, 我要等你把工作确定了, 不管是在张家界还是在长沙, 我才会跟你回去看你的父母, 否则我不知道去你的老家对于我们还有什么样的意义. 对不起, 我要给你压力的, 我不要看到你嘴上说着要努力, 实际上工作找不到工作, 学习又学习不好这样的生活.

这些我如果跟你谈, 你会不跟我吵吗? 我写给你, 你能看进去吗? 亲爱的, 我觉得我们之间到了一个坎上了, 要是迈不过, 我们就没有未来了. 你能否和我携手走下去?

使用pure-ftpd取代vsftpd

自从使用ftp服务端软件以来就是使用的vsftpd,因为最初它是内置在redhat安装光盘里面的,并且它的表现一直不错.

 

使用pure-ftpd的理由, 支持定义ClientCharset, 所以ftpsamba共享目录时不会出现乱码

Pure-ftpd功能很多, 如果要自定义和配置用户登陆账户还有配额等设置, 要非用pure-ftpd不可了.

 

但是在Centos, pure-ftpd默认的使用PAMAuthentication是不工作的, 要改到UnixAuthentication才可以, 我为了这个功能试验了一个下午, 最终从网上搜到有其他人也有如此的问题.

 

而使用Virtual-User的功能, 最初也犯了个大错误, 最终仔细看文档才知道最终配置在配置文件中的不是pureftpd.passwd,而是增加完用户之后, 必须使用pure-pw mkdb生成pureftpd.pdb索引. 认真阅读README.Virtual-User的说明文件!

当blogger被封还有MS Live Space没有广告的时候

blogger从5月多被封以来, 我是郁闷得不行~
突然上我的live space居然发现没有广告了~ 说实话, Live Space上的广告并不讨厌, 挺漂亮的
但是以前有blogger, Live Space只是做一个备份而已. 看来我现在要重新启用了, 并且要改变习惯
使用gmail来发布blog,就能同时保证两个博客的更新了, 并且还能备份到gmail党中, gmail总没有理由被封吧~

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不认这个注释.