Search This Blog

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到现在还没搞定,还是一开就死,只能暂时不用了。