Search This Blog

Friday, December 08, 2006

a lot of strcmps...

A lot of strcmps,like:

if (!strcmp (cs,ct)){
...

}

else if (!strcmp (cs,ct)){
...
}
...

else{
...
}



it's too expensive,I think hash will performance better.

Let me try it out...





powered by performancing firefox

Friday, December 01, 2006

a sawfish extension:care-eyes

May be there are many people working just like me,staring at the monitor for a long time.However you are busy,must you take a rest every one or two hours,otherwise,your body will be wore out.
Until now,I have several problems which make me not so good.I can't see clearly those far from me.And after sitting for a while,my neck aches.But often I forgot my discomfort when I am coding or seeing a film or playing a game.So I write this extension to remind me to take a rest.
You can download it here.
Put it to your sawfish's extension directory,and add the following lisp expressions to your sawfish configure file:
(require 'care-eyes)
(eye-care-init 7200 300 nil nil)
here,7200 is the seconds you may work for a longgest time without a rest,i.e. 2 hours,and then you will rest for 5 minutes.
Generally you can ignore the last two arguments,the extension will call xscreensaver to activate the screensaver.Before that,it display a message like this by default:
have a rest,care your eyes:)
You will be able to customize it by set the "resting-message" variable.
That's all,any suggestion or problem,mail to fvwmer[AT]gmail[DOT]com.

Wednesday, November 29, 2006

a problem of CLRS

Water jugs
Suppose that you are given n red and n blue water jugs,all of different shapes and sizes.All red jugs hold different amounts of water,as do the blue ones.Moreover,for every red jug,there is a blue jug that holds the same amount of water,and vice versa.
It is your task to find a grouping of the jugs into pairs of red and blue jugs that hold the same amount of water.To do so,you may perform the following operation:pick a pair of jugs in which one is red and one is blue,fill the red jug with water,and then pour the water int to the blue jug.This operation will tell you whether the red or the blue jug can hold more water,or if they are of the same volume.Assume that such a comparison takes one time unit.Your goal is to find an algorithm that makes a minimum number of comparisons do determine the grouping.Remember that you may not directly compare two red jugs or two blue jugs.

my solution(Ω (nlgn)):for a particular first red jug,each of n blue jugs may has the same amount ,compare this red one with each blue one,and put all the blue ones those hold less amount of water to a set,say,S1,all the blue ones those hold more amount of water to another set,say S2,and make the blue one holds the same amount of water grouped with the red one,then choose a second red jug,compare it with the blue one which holds the same amount of water with the first red jug,if it holds more,then do the same thing with on the first red jug int S2,otherwise in S1,and so on...until all the jugs are grouped

Sunday, November 26, 2006

slime's cool feature

in REPL,when I input "(" and a function name,and then,a space,something happens!slime will prompt the expected arguments in emacs's minibuffer,it's cool!and of course very useful.but,I found that when editing a common lisp source code file,slime does nothing when I do exactly as in REPL,it's strange.so I compared the two modes,at last it turned out that the slime function "slime-indent-and-complete-symbol" does the work I want.so I redefined the "TAB" key-binding like this:
(define-key slime-mode-map (kbd "TAB") 'slime-indent-and-complete-symbol)
everything is perfect now,oh,maybe.

Wednesday, November 22, 2006

Practical Common Lisp

有书不看那是罪恶,不过对着显示器看书确实挺累的,所以把这本书打印出来了,继续好好学习

Wednesday, November 15, 2006

apache2

信息系统的课设打算做成c/s的,于是先在自己机器上配了一下apache2,以前没配过,没经验,遇到以下问题:
mod_perl起不来,报错如下:
* Apache2 has detected a syntax error in your configuration files:
Syntax error on line 3 of /etc/apache2/modules.d/75_mod_perl.conf:
Cannot load /usr/lib64/apache2/modules/mod_perl.so into server: /usr/lib64/apache2/modules/mod_perl.so: undefined symbol: Perl_Ipatchlevel_ptr
google出来有三种说法,第一种说httpd.conf里有mod_perl的相关语句,应该去掉
第二种说系统里有不止一个版本的perl,并且/usr/lib下有libperl.so
前两种是扯淡,而且占据了90%的搜索结果,可见大家抄来抄去的风气达到了什么程度
我的httpd.conf里没有跟mod_perl有关的任何东西,我的系统也只装了一个版本的perl,5.8.8的
第三种说法是libperl需要加上ithreads的支持,这是正解
事实上我的libperl应该是有ithreads的,但是由于一开始我猜测可能就是ithreads的问题,所以把它去掉后重新emerge了
后来把ithreads加上,并且把perl和libperl都重新emerge了,apache终于顺利启动了。
然后试了两个默认的cgi脚本,都执行失败了,其实应该把/cgi-bin目录的权限设置好,默认是644,没有可执行的权限,755就好了,再低的还没试。
还有一个很恐怖的问题:nm说libc.so.6和libperl.so.1都是no symbols,太恐怖了!
但是readelf -sd是可以显示的,什么问题?who knows?tell me please.

Monday, November 13, 2006

latex with graphics

据说latex对eps格式的图片支持最好,又据说pdflatex不支持eps,嗯,我就说eps的,因为今天就用了这个。
先准备eps的图片,我今天是截了一些终端的窗口,试了一下,发现import可以直接输出eps,先运行import,比如import test.eps,然后鼠标会变成一个十字,点击一下需要截的窗口,当前目录下就会出现一个test.eps,可以用gs看,把它用在latex里的方法如下:
在导言区加上\usepackage{graphicx}
在需要插入图片的地方写上\includegraphics{test.eps},编译就可以看到效果。
特殊处理:
如果需要对图片进行缩放,可以这样写:
\scalebox{.5}{\includegraphics{test.eps}},可以按比例缩到原来的0.5
如果有多幅图片,可能会出现图片出现在同一行上导致后面的无法显示的问题,可以在刚才这一句前后一行都加上$
如果图片插入后出现大块的空白,可以这样写:
\begin{figure}
\scalebox{.5}{\includegraphics{test.eps}}
\caption{test}
\end{figure}
这是告诉tex把图片放在最合适的地方,使得页面上不要出现大块的空白,\caption{test}可以用来在其他地方引用这幅图片。
就这些了。

test

test

Sunday, November 12, 2006

tetex in utf8搞定

大部分内容都是参照这里
app-text/tetex-3.0_p1-r3
dev-tex/cjk-latex-4.5.2
media-libs/freetype-1.3.1-r5
然后保存以下内容成为一个脚本mktfm.sh,或者从这里下载:


#!/bin/sh
#
# Edward G.J. Lee <edt1023@info.sayya.org> 2005.01.13
# You need freetype1/contrib current version.
# This script is Public Domain
# $Id: mktfm.sh,v 1.4 2005/03/19 06:01:51 edt1023 Exp $
#

if [ $# -ne 3 ]
then
echo
echo "Usage: `basename $0` your.ttf cjk_name font_encoding"
echo "For example:"
echo "`basename $0` cwming.ttf cwming Big5"
echo "`basename $0` cwming.ttf cwmu Unicode"
echo
exit
fi

DATE=`date`
TTFONT=$1
BTTFONT=`basename $1`
eval `echo $TTFONT | awk -F. '{printf "FHEAD=%s;FTAIL=%s",\$1,\$2}'`
CJKNAME=$2
TTMAP=$3
#TOTFM=/usr/local/FT1/bin/ttf2tfm
`which ttf2tfm > /dev/null 2>&1`;ISTFM=$?
if [ $ISTFM -eq 0 ]
then
if [ `ttf2tfm --version|awk '/version/ {print $3*10}'` -lt 15 ]
then
echo
echo "This script need ttf2tfm version 1.5 or later."
echo "Please install FreeType1/contrib current version."
echo
exit
else
TOTFM=ttf2tfm
fi
else
echo
echo "This script need ttf2tfm!"
echo
exit
fi

case $TTMAP in
Big5)
PSENC=ETen-B5
CJKENC=00
NUMLIST=`awk 'BEGIN{n=1; while(n<56){printf "%02d\n",n; n++}}'`
;;
Unicode)
PSENC=Identity
CJKENC=70
NUMLIST=`awk 'BEGIN{n=0; while(n<256){printf "%02x\n",n; n++}}'`
;;
UGB)
PSENC=UniGB-UCS2
CJKENC=10
NUMLIST=`awk 'BEGIN{n=1; while(n<36){printf "%02d\n",n; n++}}'`
;;
UJIS)
PSENC=UniJIS-UCS2
CJKENC=40
NUMLIST=`awk 'BEGIN{n=1; while(n<36){printf "%02d\n",n; n++}}'`
;;
UKS)
PSENC=UniKS-UCS2
CJKENC=60
NUMLIST=`awk 'BEGIN{n=1; while(n<36){printf "%02d\n",n; n++}}'`
;;
*)
echo
echo "Not support yet!"
echo
;;
esac

create_cidmap()
{
cat >> cid-x.map.append << EoF
% created by Edward G.J. Lee <edt1023@info.sayya.org>
% $DATE
% Please append to cid-x.map.
%
$CJKNAME@$TTMAP@ ${PSENC}-H :0:$BTTFONT
${CJKNAME}s@$TTMAP@ ${PSENC}-H :0:$BTTFONT -s .167
$CJKNAME@$TTMAP@ ${PSENC}-H :0:$BTTFONT,Bold
${CJKNAME}s@$TTMAP@ ${PSENC}-H :0:$BTTFONT,Bold -s .167
EoF
}

create_newmap()
{
cat >> cid-x.map.append << EoF
% created by Edward G.J. Lee <edt1023@info.sayya.org>
% $DATE
% Please append to cid-x.map.
%
$CJKNAME@$TTMAP@ ${PSENC}-H $BTTFONT
${CJKNAME}s@$TTMAP@ ${PSENC}-H $BTTFONT -s .167
EoF
}

create_cjkfd()
{
cat > c${CJKENC}${CJKNAME}.fd << EoF
% This is c${CJKENC}${CJKNAME}.fd for CJK package.
% created by Edward G.J. Lee <edt1023@info.sayya.org>
% $DATE
%
\ProvidesFile{c${CJKENC}${CJKNAME}.fd}[\filedate\space\fileversion]
\DeclareFontFamily{C${CJKENC}}{$CJKNAME}{\hyphenchar \font\m@ne}
\DeclareFontShape{C${CJKENC}}{$CJKNAME}{m}{n}{<-> CJK * $CJKNAME}{}
\DeclareFontShape{C${CJKENC}}{$CJKNAME}{m}{sl}{<-> CJK * ${CJKNAME}s}{}
\DeclareFontShape{C${CJKENC}}{$CJKNAME}{m}{it}{<-> CJKssub * $CJKNAME/m/sl}{}
\DeclareFontShape{C${CJKENC}}{$CJKNAME}{bx}{n}{<-> CJKb * $CJKNAME}{\CJKbold}
\DeclareFontShape{C${CJKENC}}{$CJKNAME}{bx}{sl}{<-> CJKb * ${CJKNAME}s}{\CJKbold}
\DeclareFontShape{C${CJKENC}}{$CJKNAME}{bx}{it}{<-> CJKssub * $CJKNAME/bx/sl}{\CJKbold}
\endinput
EoF
}

create_pdftexmap()
{
# determinate NUMLIST here.
ENCMAP=${CJKNAME}-enc.map
cat > $ENCMAP << EoF
% This is map file for PDFLaTeX and LaTeX CJK package to embed TTF.
% Created by Edward G.J. Lee <edt1023@info.sayya.org>
% $DATE
EoF
for i in $NUMLIST
do
cat >> $ENCMAP << EoF
${FHEAD}$i <${FHEAD}$i.enc <${BTTFONT}
EoF
done
}

# for normal font
echo
echo "Please wait..."
echo "Create tfm/fd files for LaTeX-CJK."
echo "And cid-x.map for dvipdfmx."
echo
$TOTFM $TTFONT -q -w ${CJKNAME}@${TTMAP}@ >> ttfonts.map #/dev/null 2>&1
# for other TTF to fit cwttf.
#$TOTFM $TTFONT -e 0.92 -w ${CJKNAME}@${TTMAP}@ > /dev/null 2>&1
# for slant font
$TOTFM $TTFONT -q -s 0.167 -w ${CJKNAME}s@${TTMAP}@ >>ttfonts.map # /dev/null 2>&1
#$TOTFM $TTFONT -e 0.92 -s 0.167 -w ${CJKNAME}s@${TTMAP}@ > /dev/null 2>&1

create_cjkfd

`which dvipdfmx > /dev/null 2>&1`;ISPDFMX=$?
if [ $ISPDFMX -eq 0 ]
then
DVERSION=`dvipdfmx --version 2>&1 |awk '/dvipdfmx-/ {print substr($3,10)}'`
if [ $DVERSION -le 20031116 ]
then
create_cidmap
else
create_newmap
fi
else
echo
echo "You didn't install dvipdfmx, script abort!"
echo
exit
fi




脚本不是我写的,我只是修改一下让它能生成ttfonts.map文件,如此,准备工作完成
如果脚本抱怨ttf2tfm版本太低的话就下载这个ttf2tfm放到/usr/bin下
先在$TEXMFLOCAL/fonts下建立truetype目录,把需要用到的字体复制过来或者符号链接过来,并且把mktfm.sh也放在这个目录下面,再下载Unicode.sfd,同样放在这个目录,然后用脚本生成一大堆文件,比如我在用uming和ukai,我就执行./mktfm.sh ukai.ttf ukai Unicode和./mktfm.sh uming.ttf uming Unicode,然后建立放tfm文件的目录:
mkdir -p $TEXMFLOCAL/fonts/tfm/CJK/ukai
mkdir $TEXMFLOCAL/fonts/tfm/CJK/uming
然后把当前目录下所有ukai的tfm文件移到对应的目录下,uming也一样:
mv ukai*.tfm $TEXMFLOCAL/fonts/tfm/CJK/ukai/
mv uming*.tfm $TEXMFLOCAL/fonts/tfm/CJK/uming/
再建立放enc文件的目录:
mkdir -p $TEXMFLOCAL/fonts/enc/CJK/ukai
mkdir $TEXMFLOCAL/fonts/enc/CJK/uming
把当前目录下所有ukai的enc文件移动对应目录下,uming也一样:
mv ukai*.enc $TEXMFLOCAL/fonts/enc/CJK/ukai/
mv uming*.enc $TEXMFLOCAL/fonts/enc/CJK/uming/
把*.fd文件放到它们应该在的地方:
mkdir -p $TEXMFLOCAL/tex/latex/cjk-latex/UTF8
mv *.fd $TEXMFLOCAL/tex/latex/cjk-latex/UTF8/
让生成的cid-x.map.append也完成它的使命:
mkdir -p $TEXMFLOCAL/fonts/map/dvipdfm
cat cid-x.map.append >> $TEXMFLOCAL/fonts/map/dvipdfm/cid-x.map
把Unicode.sfd放到$TEXMFLOCAL/fonts/sfd下
把生成的ttfonts.map放到/usr/local/share/texmf/ttf2pk/
最后执行texhash,
以及updmap --enable Map ttfonts.map

这样utf8的latex就建立好了,随便建一个中文的tex文件试试就知道了
我刚开始没有emerge freetype,中文的tex文件可以编译,但是生成的dvi文件无法预览,要是用dvipdfmx生成pdf的话是正常的,问题是出现在mktexpk无法从ttf生成pk字体,而原因是我的ttf2pk是直接下载的二进制文件,它竟然无法找到ttf2pk.cfg或者ttfonts.map,我试图下载ttf2pk的源代码修改之,却发现原来ttf2pk是包含在freetype里的,然后emerge之,再用xdvi看dvi文件,一切正常,大功告成!

第一次完全搞定中文latex,顺便庆祝我的第一篇用latex完成的论文。

Tuesday, November 07, 2006

vmplayer安装vmware tools

我的情况:
hostos:Linux 2.6.18-gentoo smp x86_64
guestos:Window$ XP
先找个qemu来,用qemu-img create -f vmdk filename.vmdk [size]建立一个给vmplayer用的硬盘,size可以用M为单位,也可以用G为单位,然后去这个地方生成一个.vmx文件,好了以后用vmplayer打开它,开机后进入bios设置为从光驱启动,记得抬头看看CD-ROM是不是红叉,是的话把光驱启用了先,然后跟平常一样装xp。就绪后下载一个for linux的vmware-workstation来,把里面的vmware-distrib/lib/isoimages/的windows.iso解出来,再把windows.iso解压,运行里面的setup就可以安装vmware tools了,重启后guestos就能正常识别显卡。
关于vmware shared folders,网上有人说支持也有人说不支持,我反正还没发现怎么让vmplayer可以支持,不过我倾向于vmplayer可以支持,可能需要一些特殊处理。

vmplayer的bug?

需要一个window$,于是用vmplayer,但是跟上次一样的问题又来了,上次在vmplayer上装gentoo的时候也是无论怎么弄都没办法从iso启动,.vmx改了无数遍还是一样,一启动就dhcp了。突然注意到vmplayer打开以后上面的CD-ROM按钮是一个红叉,点一下以后就突然可以了,而且这是在.vmx里的ide1:0.startConnected = "TRUE"的情况下。不知道这算不算一个bug。还发现了一个sawfish的问题,vmplayer grab当前的输入期间新启动的程序sawfish似乎不能很好地处理,比如我先用win-o启动一个ooo,然后马上在vmplayer里操作,因为ooo启动比较慢,所以等ooo窗口出现的时候vmplayer已经grab输入了,这个时候如果再把ooo聚焦,sawfish的一切快捷键都会失效。

Sunday, November 05, 2006

An Introduction To Functional Programming Through Lambda Calculus

一共十章内容,第9章没看,因为第9章是ML,而第10章才是我感兴趣的common lisp。
这是我第一次接触λ calculus,我只能说,这本书写得非常好。作者展示了怎么样利用一个λ白手起家,先建立逻辑模型,再建立自然数模型,再利用这些东西,建立起其他的作为一门语言所需要的东西,类型,表,字符,字符串,复杂的数据结构等等,让我大开眼界。最精彩的我觉得是自然数的建立,因为之前几乎是空白,只有几个很基本的函数,identity,self_apply,select_first,select_second,由此构造出的and,or,not,true,false,然后,奇迹般地,就突然有了自然数,而且,每个自然数还竟然是一个函数。这是一个函数的世界,后来定义的加减乘除只是作用在函数上的函数,而乘方等运算又可以通过包装这些函数得到。这听起来很疯狂,但是仔细想想看,有什么不可以的呢?如果给我一个金属盒子,告诉我,插上电源,它可以运行一个叫linux的系统,那难道它不就是一台电脑吗?即使事实是盒子里躲了一只黑猩猩在狂按0和1以输出我所需要的东西,那又有什么重要的呢?只要对我来说它完成的是电脑的功能就可以了。再回到自然数,也一样,我何必在乎它是一个数字还是一个函数呢?只要我把1和2相加得到的是3,那就能满足我的需要了。
然后是lazy evaluation,这是我很早就听说过lisp采用的一种技术,书里讲得不多,只有一节,举了几个例子,所以理解并不是很深刻,我猜想,只有有了lazy evaluation,lisp才能成为可能,因为无论是normal order evaluation还是applicative order evaluation,都有其致命弱点,前者的重复计算太多,如果直接应用,估计速度会比蜗牛还慢,后者则很有可能导致计算无法终止,那对于实际应用来说会更致命,但是lazy evaluation很好的结合了两者的长处,只在需要时才计算一个λ expression,并且计算以后会代换每一个该表达式的occurence,所以也被称为call by need。
我只能用神奇来形容λ calculus。

Saturday, November 04, 2006

加了块硬盘

st 7200.7 sata 120G
插上,重新编译内核,加上sata支持,重启,开始一切正常,但是系统服务启动完了以后就kernel panic,怀疑是硬件问题,然后把硬盘拔了,还是一样,再用旧内核启动,还是一样!这下崩溃了,以为是硬件出问题了,然后在启动服务的时候按I,跳过服 务的启动,直接开一个shell,发现是没有任何问题的,所以就怀疑是某个服务出了问题,然后又重启,只加载几个自己认为必要的服务,也没有问题,后来把 vmware一开,又是死机,就最终锁定目标了,把vmware去掉,再正常启动,就没有kernel panic了,但是关机或者重启的时候只说:INIT:no more processes left in this runlevel,然后就没反应了,只能手动关掉电源,最后是reemerge了sys-apps/sysvinit以后才解决的。
哪儿来的问题?似乎都是跟硬盘没关系的,却偏偏在我插上硬盘后一起冒出来。vmware到现在还没搞定,还是一开就死,只能暂时不用了。

Wednesday, October 25, 2006

程序员里的jedi

may the force be with you!
这是jedi之间相互祝福的话,其实程序员里也有jedi,下面是slime启动后的截图:

Sunday, October 22, 2006

一本书:An Introduction To Functional Programming Through Lambda Calculus

终于找到一本讲lambda演算的书了,作者是Greg Michaelson,我把它打印了出来,然后装订了一下,一下子就很像本书了:)看来学校里那些打印店的人手艺还不错的,以后有书买不到就可以打了。
这本书ms写于1988年,好老啊,不过lisp也很老了么,这才说明价值,这下可以好好学习lambda演算了,然后是common lisp,加油。

Friday, October 20, 2006

nvidia驱动的一个“诡异”问题

最近很忙,没空玩无冬,没空玩暗黑,今天周末,想着,玩一会儿吧,却发现cedega找不到显卡的信息,nwn也启动不了了,从终端启动,发现是找不到libGL.so.1,locate了一下,发现好端端地在/usr/lib64/opengl/nvidia/lib下躺着呢,而且glxgears glxinfo都是正常的,尝试revdep-rebuild,故障依旧,回想了一下,最近几天好像没做什么破坏性的举动啊,再google,才知道是multilib的问题!一直以来,玩游戏了,就从菜单启动一下,却没有想过我装的游戏是32bit的!这下问题明朗了,再locate libGL.so.1,发现/usr/lib32下果然是没有这个文件的。但是是什么原因导致共享库丢失的呢?然后想起来前两天切换到2.6.18的内核了,隐约记得当时重新emerge nvidia-drivers的时候是有个警告的,于是再次emerge了一下nvidia-drivers,问题消失了。

Thursday, October 19, 2006

插入排序&折半查找

插入排序的时间复杂度不必多说,O(n^2),但是如果把寻找插入位置的操作用折半查找来代替,那会不会优化到O(nlgn)?
不会,因为寻找到插入位置后还是要做插入操作,而元素的移动总数还是一样的,所以在理论上性能虽然会有所改进,但是改变不了插入排序的先天不足。
但是归并排序在把序列划分到足够小之后用插入排序来完成底层的排序工作还是挺有吸引力的,O(nlg(n/k)),如果是对k个元素的子序列插入排序的话。

Friday, October 13, 2006

emacs占用cpu的问题终于解决了

这次的系统的make.conf被我改了一下,编译出来的emacs特别怪,scroll bar特别宽,开始以为是color-theme的原因,后来看configure的结果,发现是toolkit-scroll-bar没有enable,再用新学到的一招:equery u emacs-cvs,发现就是这个参数没有加上,改了一下make.conf再重新emerge就正常了,然后是大问题:只要cedet和ecb加载了,打开一个文件后idle几秒钟emacs就会占100%的CPU,虽然是双核,也不能这么折腾呀。google中文结果找不到,后来试着搜了一下emacs cpu load,还真找到一个邮件组,里面有个达人声称是cedet的问题,并且在cvs版本中已经解决,于是从cedet的cvs仓库中下载了semantic-idle.el文件,替换掉原来的,再byte-compidle-file semantic-idle.el,restart emacs,症状消失!

Thursday, September 28, 2006

vmplayer的小问题

vmplayer是免费的,当然就不需要去做那些找序列号之类的猥琐事了,不过在gentoo里emerge了vmplayer以后普通用户无法正常执行:
VMware Player Error:
VMware Player must be set-UID root, "/opt/vmware/player/lib/bin/vmware-vmx" is not. Are you running /opt/vmware/player/lib/bin/vmware-vmx from its distribution directory? That copy of the program is not set-UID root.
又google,找到答案:
#chmod 4755 /opt/vmware/player/lib/bin/vmware-vmx
再运行,没有报错了
这个4表示可以set-uid root

Wednesday, September 27, 2006

64-bit环境下C语言的变量类型长度

受了16bit和32bit环境的影响,以为在我的gentoo 2006.1 amd64上int肯定是64bit的,结果发现是32bit,很是奇怪,难道是“伪64bit”,于是google之,找到资料,原文在这里
原来还有个model的问题,有三个model可选择,ILP64 LP64 LLP64
在ILP64下,int long pointer都是64bit,而LP64下int是32bit,long和pointer是64bit,LLP64的int和long都是32bit,pointer是64bit,要表达64bit的数据,要用long long来表示(非标准)
又说三个model里LP64的过渡最平滑,在64bit环境里写的代码不需要经过多大修改就能运行在32bit环境中,而其他两个model不是需要借助非标准的类型就是太依赖于环境,使得移植困难。

Tuesday, September 26, 2006

避免全局变量

全局变量是方便,但是在多线程/进程环境下是不安全的,所以在有潜在多线程/进程应用的情况下应该尽量避免全局变量。事实上,全局变量也不利于程序的模块化。
举个例子,一个自己遇到的小问题。
我有一个结构体:
typedef struct _gtalk_user{
gtalk_user_data_ptr gudp;
gtalk_buddy_ptr gbp;
gtalk_connection_ptr gcp;
gtalk_handlers_ptr ghp;
XML_Parser parser;
int errorno;

}gtalk_user;

结构体的成员包括了四个结构体指针,一个expat的解析器,还有一个错误号变量,这个程序可以让用户选择是否进行tls连接,所以gudp->use_tls是根据用户的输入赋值的,这相当于一个用户的偏好,而事实上真正要用到这个值的是在连接的时候。由于某种原因,我不想让网络连接的模块知道gtalk_user里除gcp以外的信息,又不想让调用网络连接模块里的函数的用户知道gtalk_user里的信息,难道只能把use_tls声明为全局变量吗?
我是这么做的:
void gtalk_connection_init (gtak_user_ptr)是连接初始化函数,这是对外的接口,而事实上我把它定义成了
#define gtalk_connection_init(gup) _connection_init(gup->gcp,gup->gudp->use_tls)
真正办实事的函数_connection_init的原型为
void _connection_init (gtalk_connection_ptr gcp,int use_tls);
这样,对于用户来说,只管对gup所代表的gtalk_user这个抽象的对象调用gtalk_connection_init函数,它不需要了解gtalk_user内部的细节
对于_connection_init函数来说,它也不需要了解gcp以外的信息。
其实质是我用宏定义把给_connection_init函数传递use_tls参数的过程对用户屏蔽了,于是达到了我的目的。

一点体会,有错误欢迎指正。

Saturday, September 16, 2006

gentoo 2006.1 amd64

第三次装gentoo了,只用了一天时间就把基本系统装好了,算是相当顺利了。
这次弄明白了一些问题:
lcd的刷新率太高,用gtf生成的modeline根本就不起作用,后来知道nvidia的驱动提供了刷新率的设置,如下:
Section "Device"
Identifier "Nvidia Geforce 7600GS"
Driver "nvidia"
Option "VertRefresh" "60" #####这一行设置刷新率
Option "NvAGP" "1"
Option "RenderAccel" "true"
Option "CursorShadow" "true"
Option "AllowGLXWithComposite" "true"
Option "Coolbits" "1"
VideoRam 262144
EndSection

另外是搞定了gensplash,非常pp,原来是要在编译内核的时候加上FB_VESA的支持,内核加上参数vga=795是让控制台的分辨率为1280x1024,791是1024x768,以下是截图


说说2006.1的livecd
已经可以直接显示中文,查资料的时候方便了很多,而且中文显示效果很不错
软件包的版本倒是没什么好惊奇的
不过那个图形化的系统安装工具我还是不敢试,自从第一次它带的分区工具把我整块硬盘都格式化之后我就打算老老实实手动安装,也没什么不好的

Thursday, August 31, 2006

双核的威力

athlon64x2 3800+ dfi nf4-d geil 512M*2
看看编译速度的对比
# genlop -t xorg-server
* x11-base/xorg-server

Sun Jul 23 18:48:30 2006 >>> x11-base/xorg-server-1.1.1
merge time: 21 minutes and 35 seconds.

Tue Jul 25 00:57:54 2006 >>> x11-base/xorg-server-1.0.2-r7
merge time: 28 minutes and 31 seconds.

Wed Aug 30 15:10:47 2006 >>> x11-base/xorg-server-1.1.1
merge time: 9 minutes and 28 seconds.

前两次是athlon64 3000+ kst512M的时间,最后一次是现在的时间
排除掉内存双通道和超频的因素,速度的增长依然十分可观

整个系统发热也不算很高,开了cool'n'quiet后cpu空载时只有30度,满载45度,散热器是tt金星9,当然现在气温低,夏天的时候肯定还要高

之前在cool'n'quiet开启的情况下超频不稳定,一编译就死机,后来发现是因为跑的是270*9,而默认倍频是10,在空载的时候自动降频,倍频 变成5,负载一高就自动变成10了,270*10就挂了,其实bios里有个选项是什么什么max fid,默认就是10,设置成9就不会出现这个情况了

新的blogger,玩一下,觉得不错

Saturday, August 12, 2006

到目前为止的进展

在写一个google talk的客户端,目前为止核心还没有完成,打算先实现xmpp规定的功能特性的一个基本子集
我发现google的talk服务器也并不是严格地实现了所有xmpp的服务器端功能特性,比如说客户端发送的流里存在某些错误的时候 talk.google.com并不会返回错误的类型,而是直接发送</stream>然后关闭所有已建立的连接,比较暴 力,呵呵
现在存在的问题的:因为xml解析器用的是expat,基于回调函数,限制非常大,因为我不可能把什么东西都通过expat传递给回调函数,那样就破坏了 各个模块的独立性。所以打算第一个版本就expat了,但是完成之后第一件事就是自己实现一个针对xmpp的解析器,不会很复杂,差不多应该相当于一个词 法分析器的复杂度?
这两天停下来了,因为要实习,累得开不了工,还有一个原因是我还没想好要怎么处理<message></message>,因为这里会涉及到后面的gui和cli要用到的接口,不考虑全面一点以后免不了要重写
收获还是很大的

Monday, August 07, 2006

atoi?itoa?

atoi ()是库函数,用于把字符串转换成整数,实现起来相当容易,于是我傻乎乎地开始去找itoa,找了一圈,终于发现了,没有itoa啊
然后转念一想,要itoa做什么!真要的话自己写一个,几分钟的事情,但是现成的sprintf放这儿不用就真的傻了
而且sprintf显然更方便,因为它有转义字符可以控制输出的格式,于是结论:C语言哪里需要什么itoa嘛!

Friday, July 28, 2006

解压一大堆文件的脚本

#!/bin/bash
do_dir ()
{
cd $1
for i in *
do
if [[ -f $i ]]
then
decompress $i
elif [[ $i == "." ]] || [[ $i == ".." ]]
then
continue
elif [[ -d $i ]]
then
[[ $recue == 1 ]] && do_dir $i
fi
done
}


decompress ()
{
case $1 in

*.tar.bz2)
tar jxvf $1
;;
*.tar.gz)
tar zxvf $1
;;
*.rar)
rar x $1
;;
*.gz)
gzip -d $1
;;
*.bz2)
bzip2 -d $1
;;
*)
echo "$1:not a compressed file,do nothing"
return
;;
esac
[[ $del == 1 ]] && rm $1
}


get_help ()
{
echo "this bash script is written to get all the compressed files under a directory to be uncompressed."
echo "Usage:tarball.sh [OPTION] [DIR]"
echo "OPTION:"
echo -e "\t-r\trecursively"
echo -e "\t-d\tremove the file after decompress it"
}



if [[ $# == 0 ]]
then
echo "no arguments detected,do you want to continue or just get help?[c/H]:"
read help
fi


[[ $help != "c" ]] && get_help && exit 0

for arg in $@
do
case $arg in
-r)
recue=1
;;
-d)
del=1
;;
-h)
get_help
exit 0
;;
-*)
echo "unknown arg:$arg"
echo "type tarball.sh -h to get help"
get_help
exit 1
;;
*)
[[ $arg != $0 ]] && [ -d $arg ] && name=$arg
;;
esac
done



if [[ -n $name ]]
then
do_dir $name
else
do_dir "."
fi

Thursday, July 27, 2006

sawfish-ui

sawfish-ui我一直没怎么重视,今天才发现简直太有用了
直到今天之前我一直在纳闷,fvwm能够指定特定的程序map到特定的桌面,也能在聚焦的同时提升窗口,为什么sawfish都不行呢?
原来都可以在sawfish-ui里设置的
在Focus标签下有三个子标签:Focus,Window Cycling和Auto-Raise
第一个设置聚焦方式,第二个没兴趣,第三个设置聚焦的时候要不要自动提升
还有一个叫Matched Windows的标签,可以根据名字等匹配窗口,然后对窗口做特殊的设定,这样就可以让fvwm一样了,hoho

rxvt-unicode的问题

之前用得好好的,不知道怎么回事突然出问题了,具体表现为在有中文时CPU会占到100%好一会儿,然后才能把中文显示出来,而且中文变得奇丑无比。刚开 始判断可能是字体没找到,于是调整了.Xdefaults,字体是找到了,但是CPU100%的问题依旧。改了无数次,还是没用,google也没结果, 很是郁闷。
后来才知道原来是urxvtd的原因。要把urxvtd重启才能应用新设置。
顺便强烈推荐一下urxvtd和urxvtc的组合,开新term的速度那叫一个快呀
再顺便贴一下.Xdefaults
Xft.dpi:96
URxvt.background:black
URxvt.foreground:white
URxvt.scrollBar:False
URxvt.saveLines:3000
URxvt.color12:DodgerBlue
URxvt.font:7x14,xft:AR PL New Sung:antialias=false
URxvt.mfont:7x14,xft:AR PL New Sung:antialias=false
URxvt.boldFont:7x14,xft:AR PL New Sung:antialias=false
URxvt.italicFont:7x14,xft:Bitstream Vera Sans:antialias=true
URxvt.boldItalicFont:7x14,xft:Bitstream Vera Sans:sytle=Bold:antialias=true
URxvt.preeditType:Root

Wednesday, July 26, 2006

sawfish第一篇

换到sawfish以来第一次写关于它的东东,主要是sawfish的资料比起fvwm来少得多,而且它的那个文档也不怎么样,所以玩起来比较吃力啊,不过那个sawfish wiki还是不错的,扩展很多!
第一个,一个小函数:
(defun one-instance-exec (prog)
(interactive)
(if (= (ash (system (concat "ps -C" prog)) -8) 0)
()
(system (concat prog " &"))
))

这个函数先检查是不是有进程和要运行的程序同名,如果是就什么都不干,如果不是就运行这个程序,也就是说,它只运行某个程序的一个实例,这在某些场合是很有用的,尤其是程序自身并不检查是不是有自己在运行的时候
比如说,urxvtd,我让它在sawfish启动的时候运行,要是我重启一下sawfish,就会有两个urxvtd,虽然没什么危害,不过浪费总是不好的

我是忘了把学校的配置文件拷过来了,所以现在的配置文件都是重新写的,函数就写了这么一个,下面是一个变量
(setq viewport-dimensions '(2 . 2))
这个viewport-dimensions找了我好久,viewport是显示器上能显示的那一块,还有一个workspace其实就是桌面,如果 view-port-dimensions是1x1的话,viewport和workspace就是一样大的,如果是这里的2x2的话,那一个 viewport就是一个workspace的1/4

现在的bmpx搞个什么dbus,我不知道那是什么玩意儿,我只想听歌,但是没有dbus的话bmpx就罢工:(
bmpx官方网站上说要这样:
在.xinitrc里,把原本运行窗口管理器的那一行前面加上dbus-launch --auto-syntax --exit-with-session
这个暂时不关我的事,等我想知道了再去看它是怎么回事

Monday, July 24, 2006

拨号又有新玩法!

其实rp-pppoe挺好用的,不过我就是这么喜欢折腾
pppd说它把rp-pppoe变成它的一个module了,好呀,于是我决定不要rp-pppoe了
关键在于/etc/conf.d/net文件,更关键的在于/etc/conf.d/net.example,因为后者把前者的配置方法讲得特别特别详细
不过鉴于一些同胞不屑于看英文,我就啰索一下吧
先假设涉及到的设备名是eth0和ppp0

config_eth0=("null") #先把eth0弄成null,不要问我为什么,那个net.example教我的!

config_ppp0=("ppp")
link_ppp0="eth0" #这个表示其实我们还是要靠eth0来办事的,所以总得给它点面子
plugins_ppp0=("pppoe") #传说中的pppd的module啊,果然是百闻不如一见啊
username_ppp0='your_adsl_username' # 不要照搬啊,那就太傻了
password_ppp0='your_adsl_password' # 这个也是
pppd_ppp0=("debug" "defaultroute" "usepeerdns") #debug表示往系统日志里多写点东西,defaulteroute和usepeerdns都表示默认啊默认,把ppp设备做为默认route,dns 连接上了就有了,不用自己指定


好,这个关键性文件好了,然后ln -s /etc/init.d/net.lo /etc/init.d/net.ppp0
如果想开机就连接上的话:rc-update add net.ppp0 default
另外,如果原来runlevel里有net.eth0的话,就不要了:rc-update del net.eth0

另外我还折腾了一下动态域名
先去www.3322.org注册一个帐号,建一个域名,信息自己记住啊,我不负责的
emerge ez-ipupdate
然后在/etc/ez-ipupdate/下建立一个.conf文件,名字你自己随便起,假设是qdns.conf
内容如下

user=username:password #这是你在3322.org的帐号和密码
host=yourhost.3322.org #这是你申请的二级域名,当然,你要有钱,非要自己买顶级域名,那我只能膜拜了:)
interface=ppp0 #ppp设备名


运行一下ez-ipupdate -S qdns -c /etc/ez-ipupdate/qdns.conf
再ping一下那个域名,看看能不能解析出来

现在开机能自动拨号了,但是域名的指向还要手动,那就不理想了,于是:
把/etc/ppp/ip-up给翻出来
这个文件由三个if...fi组成,可以发现第一个if...fi是关于usepeerdns的,显然跟我们没关系,而第二个if...fi里有这么一句:/etc/init.d/net.$1 --quiet start
可以看到ppp0就是从这里启动的,那么如果它起动成功的话就可以跟3322.org建立连接了,所以在后面加上:&& ez-ipupdate -c /etc/ez-ipupdate/qdns.conf -S qdns
OK了

第二次装gentoo

这次比上次熟练了,不过也花了三天时间,总结一下:
先是gcc-config无法升级了,确切的症状是编译正常,但是旧版本无法删除,而且从这里开始以后不管装什么软件都出错,具体信息忘记了,好像说是什 么call back还是fall back之类的,反正不管装什么东西都是出来这么一屏,google了一晚上,无果,后来怀疑是portage的问题,于是把当前版本mask掉,退回去 后发现一切正常了
接着第二个问题是gmp,fortran依赖它,但是编译这个东西需要c++,而当时在stage1的情况下没有c++编译器,这个鸡啊蛋啊的问题真是麻 烦得很,具体解决办法:先把gcc的USE flag里的fortran关掉,编译,得到一个stage2的gcc,因为它现在已经有c++支持了,然后用gcc-config或者eselect compiler set xxx启用新的gcc,(gentoo说gcc-config马上要被抛弃了,所以还是eselect compiler吧),再用新的gcc可以编译gmp,有了gmp就可以进一步得到fortran enabled的gcc,造物的快感啊!我当时是这么想的,不过过程并没有这么顺利,事实上一旦我用了gcc-4.1.1,emerge的时候就会出现 crash,CPU100%,除非我把进程kill掉,否则它就一直卡在那里,但是退回3xx版本就没有问题,百思不得其解,后来无奈之下重新 emerge了一遍gcc-config,问题自己消失了,奇怪
之后我有了完整的编译器,剩下的问题就都是些散兵游勇了,不足为惧,主要都是一些包的依赖,出错的时候自己稍微看看就都能解决
不过grub的问题倒真是诡异了,不管我怎么弄,它始终是error15,而我手动启动的时候,命令都是跟grub.conf里写得一样的,却能顺利启 动,也换了版本,而且/boot是ext3的,而且配置文件就是以前debian的时候用的,就是改了一下title和kernel,它就是不肯启动,我 服了

Monday, June 26, 2006

grub啊

问题是解决了,不过总归是莫名其妙的,把kernel后面的那个root=/dev/xxx参数去掉竟然就可以了,什么概念?嗯?

Thursday, June 22, 2006

openoffice的中文

装了一直没怎么用,其实我自己根本就不会想到要用office之类的庞然大物来写什么文档,emacs一个纯文本足矣,毕业论文之前我肯定会把tex搞定嘛,所以……openoffice也只是在考前突击时看看那些垃圾课件了
言归正传,打开老杜同志的课件的时候发现大部分中文都无法显示,而我已经设置了simsun都字体的替换规则,没辙了,把文件传给mm,让她帮我看老杜用的到底是什么变态字体
华文琥珀?华文中宋倒是听说过- -可见老杜的趣味确实不是一般人的水准
然后试着把sthupo和stzhongsong都替换成AR PL New Sung,结果不行
又试着直接写中文,华──文──琥──珀,竟然可以了,这事情真是奇妙了
还有一个,打开文件的时候目录名文件名都显示不了中文,google一番,把Andale Sans UI这个字体替换成系统中已有的中文字体就可以了
ps一下:utf8下的cjk-latex真是罪恶啊- -

Wednesday, June 21, 2006

最新版本smart-operator

(defun smart-insert-operator (op &optional only-back)
"Automatically insert whitespaces before and after '=', '>=', etc.
Make it look nicer: ' = ', ' >= '.


OP is the operator. If optional ONLY-BACK is t, only insert one
whitespace at back. When confused, try C-q."
(interactive "s")
(delete-horizontal-space)
(let ((op-p nil) ; another op at front?
(one-char-back nil) ; have we stepped back one char?
(fir-sp t) ;space before op by default
(sec-sp t)) ;space after op by default
(unless (bolp) ;if the point not at the beginning of a line
(backward-char)
(setq one-char-back t))
(setq op-p
(catch 'return
(dolist (front smart-operator-alist)
(when (looking-at front)
(throw 'return t)))))
(when (and (or op-p (not (and (bolp) (eolp))))
one-char-back)
(forward-char))
(if (or (comint-within-quotes 0 (point)) (and (or (equal op "/") (equal op ">")) (looking-back "^\\#include.*")))
((lambda ()
(setq fir-sp nil)
(setq sec-sp nil)
()))
(if (or (and (equal op "< ") (looking-back "^\\#include.*")) (and (equal op "*") (looking-back "int\\|char\\|float\\|double\\|short\\|long\\|signed\\|unsigned\\|void")))
(setq sec-sp nil)
(if (or (and (equal op "=") op-p) (and (or (equal op "<") (equal op ">") (equal op "+") (equal op "-") (equal op "|") (equal op "&")) (looking-back op)))
(setq fir-sp nil)
())))
(if (or only-back (not fir-sp) (bolp))
(insert op)
(insert (concat " " op)))
(delete-horizontal-space)
(if sec-sp
(insert " "))))


这个版本针对C语言“优化”过了,比如#include之后尖括号老是加空格就比较烦了,还有以前如果先有=再有-就会当成一个运算符,实际上C里没有这么一个运算符,等等
应该还有什么没想到的,到时候再添加

6月22日:我就知道有什么东西忘记了,娃哈哈,这次这个版本对"->"特殊处理,两边都没空格
不过代码是真的越写越丑了:(
(defun smart-insert-operator (op &optional only-back)
"Automatically insert whitespaces before and after '=', '>=', etc.
Make it look nicer: ' = ', ' >= '.


OP is the operator. If optional ONLY-BACK is t, only insert one
whitespace at back. When confused, try C-q."
(interactive "s")
(delete-horizontal-space)
(let ((op-p nil) ; another op at front?
(one-char-back nil) ; have we stepped back one char?
(fir-sp t) ;space before op by default
(sec-sp t)) ;space after op by default
(unless (bolp) ;if the point not at the beginning of a line
(backward-char)
(setq one-char-back t))
(setq op-p
(catch 'return
(dolist (front smart-operator-alist)
(when (looking-at front)
(throw 'return t)))))
(when (and (or op-p (not (and (bolp) (eolp))))
one-char-back)
(forward-char))
(if (or (comint-within-quotes 0 (point)) (and (or (equal op "/") (equal op ">")) (looking-back "^\\#include.*")))
((lambda ()
(setq fir-sp nil)
(setq sec-sp nil)
()))
(if (or (and (equal op "< ") (looking-back "^\\#include.*")) (and (equal op "*") (looking-back "int\\|char\\|float\\|double\\|short\\|long\\|signed\\|unsigned\\|void")))
(setq sec-sp nil)
(if (or (and (equal op "=") op-p) (and (or (equal op "<") (equal op ">") (equal op "+") (equal op "-") (equal op "|") (equal op "&")) (looking-back op)))
(setq fir-sp nil)
(if (and (equal op ">") (looking-back "-"))
((lambda ()
(setq fir-sp nil)
(setq sec-sp nil)
(backward-char)
(delete-horizontal-space)
(forward-char)
()))))))
(if (or only-back (not fir-sp) (bolp))
(insert op)
(insert (concat " " op)))
(delete-horizontal-space)
(if sec-sp
(insert " "))))

被拒了

据说是因为我成绩不好
我的成绩确实是倒数的,那又怎么样?
不说也罢,诅咒这个教育制度
等着吧,我还会回来的

Tuesday, June 06, 2006

xcompmgr&mplayer

最近几天没看电影,昨天突然发现mplayer在全屏的时候会有一块黑色快速闪动(xcompmgr启动的情况下),可以用以下选项来解决
mplayer -vo x11 --zoom video_file
或者在.mplayer/config里加上
vo=x11
zoom=y
也是一样的效果

Friday, June 02, 2006

面试结束

有保密协议,我什么都不能说
对自己的发挥还算满意,就是太粗心了- -
下来就等结果吧

Wednesday, May 31, 2006

笔试通过了

题就不泄露了,不过难度并没有我想象那么大
明天早上要面试,心情这个激动啊

X Composite Extension

心血来潮,又想玩一下composite了,然后发现一运行xcompmgr就报错。google了几分钟,发现原来是xloadimage搞的鬼,不过 这个倒不是google到的,是我自己发现的,反正我没搜到什么有用的信息。sawfish好像没有自带设置背景图片的工具,就随便找了个,叫 hsetroot,挺好用的,用它代替xloadimage以后,gkrellm和xchat的透明都可以用了,xcompmgr也正常了。
另外,还有个非常非常好的消息,好像那个n卡开了硬件加速后aa字体显示会出问题的bug已经彻底修正了!这下是真他妈爽了。
这里的空间并不大,我就不截图了,有空去哪里找个图片册再贴

又换了...

主板换了dfi nf4x,显卡装了coolviva,确实是挺酷的,U换了2500+,体质还可以,默认极限应该是370不到吧,现在是360*7,内存运行在DDR560,比6100+2800+还猛
这块主板有两个缺点,一是没有smart fan的支持,而是CPU温度的传感器有问题
不过网卡倒是没有问题了,再也不用忍受6100那种变态毛病了。
现在super pi 1M位在36s左右,内存潜伏差不多41,读写是4xxx
原来的6100和2800+给mm用了,比她的p4+845强很多了

google的实习招聘

今天,应该是昨天了,google来招聘实习生。去笔试了一下,挺简单的,但是有个题不会,真郁闷啊。
希望能过笔试

Monday, April 24, 2006

一个小脚本

现在换成utf-8环境了,gbk环境下的代码里的汉字全是乱码,30M的代码手动转换肯定要死人的,所以写了个小脚本,可以批量转换编码的

#!/bin/bash
recur ()
{
cd $1
for i in *
do
if [ -d $i ]
then
recur $i
cd ..
else
if [[ $i == *.c ]]
then
iconv -f gbk -t utf8 $i>tmp
mv tmp $i
else
continue
fi
fi
done
}
recur $1

Thursday, April 20, 2006

新平台和新系统

又是大半个月没写了,太堕落了
先说说新平台的表现
sp2800+ 和tf6100,uccc512M,oc到了300异步166,效果相当明显啊,比p4和sis651强不知道多少了
然后是gentoo2006 amd64的安装,这个过程真是异常痛苦啊
因为是第一次安装,没有经验,而我对于gentoo的安装也没有充分的心理准备,当时在选make.conf的参数时(第一次用图形界面安装的),加上了 object C的支持,结果系统自举的时候gcc编译怎么也通不过,机器是快,不过编译gcc还是要大概40分钟的样子,而且总是到最后快结束时出错,我就这样试了 7、8次,都快疯了。然后开始google,最后终于在一个不起眼的角落找到了答案,原来是依赖性没做好,漏了一个叫boehm-gc的包。只要先手动把 这个包emerge了继续就可以了。
系统基本装好,内核编译完毕,重启,我的系统启动了!但是到udev的时候又出错了,不过好歹表明基本系统除内核完应该是没问题的,这次google不到 了,于是上freenode的#gentoo问,经过外国友人的提醒,发现内核没有tmpfs支持,再重新编译,重启,终于成功!
回头想想,就两个问题,但是我花了差不多1个星期才把机器用起来。
gentoo还是很合我的胃口的,比debian的定制性还要强,完毕。
ps:转到sawfish了,这个单独写

Thursday, March 23, 2006

6100和sp2800+入手!

6100是小板子,不过做工还是相当好的,也很漂亮
这个sp体质一般,310的外频,凑合了,hoho
正在下gentoo的installCD,体验一下,因为根据我之前的经验,似乎现在gentoo对64bit的支持最好
先记录一下,欲知后事如何,请听下回分解

Tuesday, March 21, 2006

我的生日啊啊啊啊啊

一不小心发现过12点了,我的生日就这么到了,哈哈
不过,生日么,都过了这么多了,没必要写那么多废话的,纪念一下,仅此而已
刚才去某人的blog上晃悠了一下,顺便嘲笑之,感觉不错

Monday, March 20, 2006

盘算着升级

现在的板子已经严重地制约了整个系统性能的提高了,不过即使是2.4b+865pe也就不过那么回事了吧,于是觉得还是投向k8的怀抱比较划算。
最近的6100势头很猛,据说oc性能跟dfi nf4x不相上下,本来钱又不多,这个应该还是比较合适的,还能暂时省下显卡的钱。本来是想收gz的一套的,6100和sp2500+,那个sp2500 +据说能上380*7,口水……不过我终究还是决定买新的拼人品了,但愿上天能赐我一块极品2500+,嘿嘿
上周学校的d2 bn重新开荒了,终于没有抵制住诱惑,堕落了一把,呵呵。

Saturday, March 04, 2006

考研

昨天mm的考研分数出来 了,没想到这个臭丫头能考这么好,看来我的指导还是有用的啊,嗯~

Wednesday, February 22, 2006

提供机制,而不是策略

据说unix的设计哲学是:提供机制,而不是策略
第一次看到这句话确实是不明白,因为我并不理解“机制”和“策略”的区别
这两天看ldd,里面倒是很详细地解释了
简单点说,机制就是“能干什么”,而策略是“怎么干”
所以可以这样理解:unix给你提供你需要以之来解决问题的各种功能,但不会告诉你怎么做,那是你的事情
于是,针对一些现象,我又开始忍不住要大放一番“厥词”了,虽然我知道说了也是白说
linux和unix初学者们:
我跟你们一样,也是什么都不懂,并且我越学习就越是发现这一事实是有多么明显,但是有一点我明白了的,那就是,linux/unix提供了机制,但是不会是策略。所以:
在你们遇到问题的时候,先想想unix的设计哲学。
然后想想你手头所有的资源,manual,google,bbs,其中manual是系统提供给你的,如果你想“学会”怎么用linux/unix,那就 先好好利用你所拥有的,而不是一味地“请教”别人,别人没有义务去回答那些已经重复了无数次的问题的。接下去,怎么利用这些资源去解决你所遇到的问题,就 是属于“策略”的范畴了,参照我的理解,那是你的事情。
其实中心思想是:发文前请看置底!!

用emacs上bbs

我一直想着要是在bbs上发文时能像emacs一样编辑,那可太爽了,不过既然bbs不支持emacs的编辑功能,那就用emacs上bbs么
其实很简单,M-x ansi-term,运行后emacs会让你选择程序,默认是bash,然后就会出来一个term,其他的就跟在终端下上bbs一样了
不过发呆时间一长就会掉线,所以可以写个函数防止发呆:
(defvar antiidle)
(defun enable-anti-idle ()
(interactive)
(setq antiidle (run-with-timer 0 180 '(lambda ()
(term-send-up)
(term-send-down)))))

这个函数让emacs每三分钟向term发送一个“上”和一个“下”,然后把run-with-timer返回的值赋给antiidle
(defun disable-anti-idle ()
(interactive)
(cancel-timer antiidle))

这个函数把刚才用run-with-timer“注册”的行为注销掉
这样就可以在需要的时候开启或关闭防止发呆功能,当然,设个快捷键会更方便
另外,在连接主机之前在终端下先运行stty rows 24 cols 80效果会更好
连接上主机以后,默认的是term-char-mode,在这个mode下每按一个键就会向终端发送,所以适合于浏览,如果要发文,那么就会出问题,可以 切换到term-line-mode,然后像平时一样编辑,要发送之前再切换回term-char-mode就可以按C-w发文了
term-char-mode绑定到了C-c C-k
term-line-mode绑定到了C-c C-j

Saturday, February 18, 2006

P4也可以cpufreq!

在家试了一下powernow的威力,非常适合我这种24小时不关机的人,能省不少电呢,当然,不开机更省,呵呵
回学校来又开始折腾(我总是倾向于让我的电脑都有同一个环境,这样至少当我分别在家和在学校时,不需要改变我的习惯),于是看到文档里说cpufreq也能用在P4上,那当然要用。
编译内核基本上和athlon64的时候一样,只是cpu换成了P4,对应的cpufreq的模块换成了,具体如下:
[*] CPU Frequency scaling
│ │ [ ] Enable CPUfreq debugging
│ │ < *> CPU frequency translation statistics
│ │ [*] CPU frequency translation statistics details
│ │ Default CPUFreq governor (performance) --->
│ │ --- 'performance' governor
│ │ 'powersave' governor
│ │ 'userspace' governor for userspace frequency scaling
│ │ 'ondemand' cpufreq policy governor
│ │ <> 'conservative' cpufreq governor
│ │ --- CPUFreq processor drivers
│ │ < *> ACPI Processor P-States driver
│ │ <> AMD Mobile K6-2/K6-3 PowerNow!
│ │ <> AMD Mobile Athlon/Duron PowerNow!
│ │ <> AMD Opteron/Athlon64 PowerNow!
│ │ <> Cyrix MediaGX/NatSemi Geode Suspend Modulation
│ │ <> Intel Enhanced SpeedStep
│ │ <> Intel Speedstep on ICH-M chipsets (ioport interface)
│ │ <> Intel SpeedStep on 440BX/ZX/MX chipsets (SMI interface)
│ │ Intel Pentium 4 clock modulation
│ │ <> nVidia nForce2 FSB changing
│ │ <> Transmeta LongRun
│ │ <> VIA Cyrix III Longhaul
│ │ --- shared options
│ │ [ ] /proc/acpi/processor/../performance interface (deprecated)


有了支持cpufreq的内核以后基本上就成功一半了
然后安装三个额外的包:
#apt-get install acpid cpufreqd cpufrequtils
这里插一句,据说powernowd也是支持P4的,不过我没试过,谁有兴趣可以试一下
这三个包装好后就有一个完整的环境了,如果图方便的话,重启一下,不过,重启是window$的德性,还是手动吧
其实本来不用手动启动的,因为包的安装脚本会帮我们启动,不过acpid不能在X环境下启动,会提示资源或设备忙,所以可以先退出X,启动acpid以后再进X,当然,如果不用X的话就不用这么麻烦了
接下去就只剩最后一步了,配置一下/etc/cpufreqd.conf
默认的配置似乎是针对笔记本的,什么ac=on,ac=off的
先简单介绍一下cpufreqd.conf
这个文件由一系列的section组成,分别是gerneral,profile和rule
gerneral部份是总的设置,需要改的是把以下两行的注释去掉
# enable_remote=1
# remote_group=root

不然的话cpufreqd-get和cpufreqd-set就无法工作
然后是profile,这个部份为rule提供一些模板
name是profile的名字,随便你喜欢,可以有空格,不能重复
minfreq是本profile下CPU的最低工作频率,百分数表示
maxfreq以此类推
policy 这个能使用的选项取决于 /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors,cat一下就有 了,而它又取决于刚才编译内核时的几个选项,分别是userspace,ondemand,performance和powersave
other plugin entries放到下面一起说
最后是rule,rule比较复杂一点
name是rule的名字,和profile的name差不多
profile是符合该rule时所使用的profile的name
other plugin entries提供匹配一个rule的机制,我只说几个比较有用的,详细的可以man cpufreqd.conf,acpi_temperature plugin用来匹配CPU的温度,当然这也需要内核的支持,可以参考我前面powernow的文章,比如说当CPU温度高于50度时让CPU稍微休息一 下,就这样匹配:acpi_temperature=50-100,cpu plugin用来匹配CPU的使用率,比如可以用cpu_interval=50-100和刚才的acpi_temperature=50-100一起来 匹配CPU过热,programs plugin可以匹配一个程序,这样就可以在看电影或者编译软件时让CPU以最高频率跑起来,这样写:programs=xxx,有不止一个程序的话用逗 号间隔,基本上这些就够用了,如果还是不明白就对照着默认的配置文件,再看看manual,应该很容易就搞定了

这些都完成以后,让cpufreqd重启一下:
#/etc/init.d/cpufreqd restart
可以运行一下cpufreqd-get查看当前的状态,下面是我的结果:
root@huzhou:/home/cxl# cpufreqd-get
socket I'll try to connect: /tmp/cpufreqd-zRGa6x/cpufreqd


Name (#1): On Demand High *
Governor: ondemand
Min freq: 1499962
Max freq: 2399940


Name (#2): On Demand Low
Governor: ondemand
Min freq: 899977
Max freq: 1799955


Name (#3): Performance High
Governor: performance
Min freq: 2399940
Max freq: 2399940


Name (#4): Performance Low
Governor: performance
Min freq: 1799955
Max freq: 1799955


Name (#5): Powersave High
Governor: powersave
Min freq: 1799955
Max freq: 1799955


Name (#6): Powersave Low
Governor: powersave
Min freq: 599985
Max freq: 599985


可以再看一下/etc/proc/cpuinfo
root@huzhou:/home/cxl# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 15
model : 2
model name : Intel(R) Pentium(R) 4 CPU 2.40GHz
stepping : 7
cpu MHz : 1493.971
cache size : 512 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 2
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe cid xtpr
bogomips : 4784.88


可以看到频率已经降下来了
不过我的sensors显示核心电压并没有下降,目前为止我还不知道是怎么回事:)

Thursday, February 09, 2006

温度、风扇、电压和cool'n'quiet(athlon64)

要在系统中得到主板上各处的温度,风扇转速和电压,必须在内核中有相应的支持,还要有lm-sensors,下面简单介绍一下步骤:
编译内核,在device drivers->i2c中选上对应的选项
< *> I2C support
I2C device interface
I2C Algorithms ---> //这里面的全选上
I2C Hardware Bus support ---> //这里面的选上对应硬件的模块
Miscellaneous I2C Chip support --->
[ ] I2C Core debugging messages
[ ] I2C Algorithm debugging messages
[ ] I2C Bus debugging messages
[ ] I2C Chip debugging messages


然后是device drivers->Hardware Monitoring support
这里要先弄清楚自己主板的sensor的芯片,然后选上对应的模块
然后安装lm-sensors,root运行sensors-detect,按照提示一步一步来,如果成功探测到芯片的话,最后按照提示把结果写入 /etc/modules就可以了,然后/etc/init.d/lm-sensors start,重新启动一下gkrellm,就会发现风扇,温度和电压已经可选了,随时监控:)

接着再说说AMD的cool'n'quiet
cool'n'quiet技术可以根据当前CPU的负载来自动调节CPU的频率,电压以及风扇的转速,电费吃人啊,能省则省啦
当然,这个功能也是需要内核的支持的,在Power management options->ACPI (Advanced Configuration and Power Interface) Support里选上Processor
CPU Frequency scaling里
[*] CPU Frequency scaling
[ ] Enable CPUfreq debugging
< *> CPU frequency translation statistics
[ ] CPU frequency translation statistics details
Default CPUFreq governor (performance) --->
--- 'performance' governor
'powersave' governor
'userspace' governor for userspace frequency scaling
'ondemand' cpufreq policy governor
<> Intel Enhanced SpeedStep
<> ACPI Processor P-States driver
--- shared options
[ ] /proc/acpi/processor/../performance interface (deprecated)


还要在bios里把pownow功能打开
完成后加载上必要的模块,先看一下/proc/cpuinfo
root@huzhou:/home/cxl# cat /proc/cpuinfo
processor : 0
vendor_id : AuthenticAMD
cpu family : 15
model : 47
model name : AMD Athlon(tm) 64 Processor 3000+
stepping : 0
cpu MHz : 2025.046
cache size : 512 KB
fpu : yes
fpu_exception : yes
cpuid level : 1
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt lm 3dnowext 3dnow pni lahf_lm
bogomips : 4054.34
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management: ts fid vid ttp tm stc


然后root@huzhou:/home/cxl# echo ondemand>/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
再看看
root@huzhou:/home/cxl# cat /proc/cpuinfo
processor : 0
vendor_id : AuthenticAMD
cpu family : 15
model : 47
model name : AMD Athlon(tm) 64 Processor 3000+
stepping : 0
cpu MHz : 1125.025
cache size : 512 KB
fpu : yes
fpu_exception : yes
cpuid level : 1
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt lm 3dnowext 3dnow pni lahf_lm
bogomips : 2252.41
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management: ts fid vid ttp tm stc


可以看到频率已经从2025降到1125了(我超过频,如果没超频的话,是从1800到1000)
如果这时候有CPU密集型的进程运行,再看频率,会发现又是2025了

另外,如果发现加载powernow-k8模块时有如下错误的话
powernow-k8: BIOS error - no PSB or ACPI _PSS objects
可以尝试一下升级bios
enjoy it!

Friday, February 03, 2006

gdb

其实我不会用gdb,一直都不会,但是直到上学期做汇编课程设计的时候,实在是没办法了,不用gdb根本就不可能发现问题了,才硬着头皮开始学着用。然后就发现它真的是一个很优秀的调试器。
当然我是在emacs里用的,不过跟shell下用是没什么区别的,如果不去管emacs提供的那些快捷键的话。
如果启动gdb的时候没有指定要调试的程序,那么在启动后可以用file filename来完成这个工作。
然后呢,run就可以运行要调试的程序。哦,还有,如果是用gcc编译的话,加个-g的选择,可以给gdb提供足够的调试信息。
break可以设置断点,我喜欢break 1这样让程序一启动就暂停
until linenum可以让程序运行一直到指定的行号(或指定的行号以后)
list可以显示出源程序以及行号
p,就是print,可以打印出程序中的变量值,这个比较重要,p后可跟一个/F,其中F是输出的格式,比如x是十六进制,d是十进制,o是八进制等等, 还可以打印整个数组,如果有array[3] 这样的声明,那么可以用p *array@3把array的3个元素打印出来
next可以让程序运行一条指令(调试汇编时是机器指令,高级语言时我想应该是一条语句,而在c语言里声明变量之类的语句是不会被next单独执行一次的)
这些是最基本的命令,用法相当复杂,具体可以查看info gdb
调试器在你对于你的程序运行错误没有头绪的时候是很有用处的

Wednesday, January 25, 2006

继续debian-amd64

mplayer也没问题了,编译错误的原因是win32lib无法用于64-bit的机器,而且目前没有64-bit的版本,所以configure的时 候只能去掉win32lib的选项,事实上我并不知道这个lib确切地对应哪些格式的文件,但是没了它至少avi还是能放的,所以,等着吧
另外,我还发现我用的源里没有cmucl,暂时先不管,需要的时候再说

Sunday, January 22, 2006

amd64,debian

在学校的时候刻了一张 debian-31r0-amd64-binary-1.iso,拿回来开始装。
安装过程非常顺利,就是64-bit的zhcon好像有问题,启动不了,说是kernel没有fb吧好像是,不过zhcon不是关键,没有也可以将就。要 提一下的是nf4的芯片组的话,网卡会认不出来,那么有两个选择,一是事先从nvidia官方网站下载nf4的驱动,装完基本系统和开发包后直接装驱动, 应该是可以把网卡驱动上的,不过这个方法我没试,事后总结的,我用的是第二个方法,安装过程先不配置网卡,apt也不管,跳过,基本系统好了以后把apt 源设置成光盘,装上编译内核需要的包,直接编译内核,选nforce芯片组的网卡驱动,叫forcedeath,它是nf3的,不过没关系,nf4的网卡 也认,至少在我机器上是这样,当然事先要下载好内核源码。
有了网卡之后就好办了,找个合适的源,继续安装就是了。
不过在家是公网,找这个源着实是费了不少功夫,每次都是先在windows下查半天,然后重启回debian试,ustc的pure64试过,应该是有问题,最后终于找到一个国内的速度相当快的源,sources.list:
deb http://mirror.vmmatrix.net/debian-amd64/debian-pure64/ sid main contrib non-free
deb-src http://mirror.vmmatrix.net/debian-amd64/debian-pure64/ sid main contrib non-free
deb http://debian.okey.net/debian-uo/ sid ustc #marillat rareware
deb-src http://debian.okey.net/debian-uo/ sid ustc #marillat rareware

上面那个是pure64的,debian.okey.net是ustc的公网镜像,这个源的uo里的ustc有amd64的分支,里面有stardict等好东西:)
其他基本上就没什么好说的了,包肯定不是很全的,如果实在需要的话就只能自己编译了,和32-bit的系统一样。
比如说emacs23就是,我不想装mule,只好下emacs-unicode-2的分支:
cvs -z3 -d:pserver:anonymous@cvs.savannah.gnu.org:/sources/emacs co -r emacs-unicode-2 emacs
编译的过程也是非常顺利:
mkdir emacsbuild
cd emacsbuild
../emacs/configure --with-x-toolkit=gtk --with-x

其他选项可以configure --help看,一般装好相应的库后configure自己会找到
make bootstrap
make install


编译fvwm倒是有错误,而且编译出来还是没有菜单的透明,不编译也罢,反正是有现成的包的,mplayer一直没通过,不过这个是娱乐工具,暂时没打算马上搞定它,放放再说吧
先到这儿吧,后面还有的

Sunday, January 15, 2006

又是nvidia

前天忘了说了,nvidia的驱动,每次重启都要重装一次才能进X,到目前为止的总结:
(我说的是debian下的,其实发行版没试过 )
1.apt-cache show nvidia-glx
看版本号和当前所装的nvidia的驱动版本号是否一致,如果不一致的话很可能就是它搞的鬼
2.再启动过程中是不是有NVIDIA-TLS之类的信息
如果有的话,应该就是问题所在了,这是一个启动过程中自动运行的脚本,它检查有没有nvidia-glx,有的话就会把对应的文件删除,我也不知道它为什么这么干,不过可以暂时把它的权限设成不可执行,就可以就将了,hoho

这次是texlive了

debian的tetex包,真是能让人郁闷致死,而在经历了又一次dist-upgrade无法安装之后,我决定投向texlive的怀抱。于是,我又发现其实它们都是一个德行:)(本来就应该都是一个德行么,texlive也是基于tetex的吧)
安装过程没什么好说的,下个iso,mount -o loop texlive2005-inst-20051102.iso,不会有装deb包时的依赖等关系,只管照着提示做就可以了,可以说相当简单。值得提醒的一 点是文档就装英文的就可以了,大部份人不会认识法语德语甚至是越南语吧?这样可以节省硬盘空间。cjk的包也要选上。
然后是配置中文环境。下一个gbkfonts,写个脚本:
#!/bin/bash
gbkfonts path/to/*.ttf(c) whatever_fontname_you_like
...
因为字体一般不只一个,用gbkfonts生成可以让tex认识的字体信息时还比较慢,所以用脚本更好一点。
建一个目录,比如~/gbkfonts,然后在这个目录下执行刚才的脚本,然后你会在当前目录下得到一大堆东西,把这些东西复制到/usr/local/texlive/texmf-local下,基本上就算是完成了。
关键的是,在auctex下,先生成.dvi文件后无法用xdvi来预览,这还真是只让人所想即所得了。于是应该想办法解决它。
网上索了很多资料,包括王垠的方法,一个一个试,无非就是在config.ps里加上p +cjk.map,再不行就是加上绝对路径,或者就是updmap.cfg里也加上Map cjk.map,再不行还是加上绝对路径,然后再运行updmap,texhash等等等等,方法是很多,对我来说却没有一个是有用的,我运行xdvi *.dvi的时候永远是一样的提示,mktexpk: don't know how to create bitmap font for ***,于是我把mktexpk翻出来看(它只是一个脚本),发现系统对于type1字体用的是gsftopk来生成pk字体的,但是似乎gsftopk 并没有找到关于我生成的字体的信息,最终,我cat cjk.map>>psfonts.map后,它终于顺利地找到了字体信息,弄了一天,终于有结果了!

Friday, January 13, 2006

关于nvidia

考完试,终于又可以折腾系统了。
今天折腾xorg的composite。前段时间弄了块做工不错的ti4600来玩,顺便就试了下xorg的威力
Section "Device"
Identifier "nVidia Corporation NV25 [GeForce4 Ti 4600]"
Driver "nvidia"
Option "AllowGLXWithComposite" "true" #这行要加,不然glx就用不了了
Option "RenderAccel" "true" #这行打开硬件加速(应该是这个作用吧我猜,因为不打开这项的情况下开了composite会占用较多的cpu资源,打开以后cpu不受任何影响)
Option "AGPFastWrite" "1"
Option "EnablePageFlip" "1"
Option "NvAGP" "1"
Option "CursorShadow" "true" #这几项可有可无
EndSection

再加上这个setion
Section "Extensions"
Option "Composite" "Enable"
Option "RENDER" "Enable"
EndSection


startx后在终端运行xcompmgr -cfF看看效果,炫!再transset num(0-1之间)然后选定一个窗口点击看看效果,酷!

有两个小小的遗憾
1 composite会和fvwmbuttons收起放出另一个fvwm模块的行为冲突,这个问题比较严重,会导致键盘鼠标失去响应
2 nvidia的驱动和非aa字体冲突,会导致中文显示不出来(simsun),开了aa后正常,但是中文字体又太难看,后来我把中文的小字体关掉aa,然 后用AR PL ShanHeiSun Uni字体就可以正常显示,不过这个bug很可能不是普遍性的,所以解决办法也不一定在任何情况下都有效