2006年10月18日星期三

恢复dpkg包管理系统

今天把Ubuntu下/var/lib/dpkg/和/var/cache/apt/里面的东西都删了,然后包管理系统就坏了,折腾了两个钟头才恢复。其实只要新建与删掉的目录和文件同名的目录和文件,基本就能弄好了。

事情的经过是这样的。我把源列表里面的breezy改成dapper,update之后又想改回breezy了。我不想用dapper,因为里面的tetex是3.0,breezy里面是2.0,升级到3.0后配置好的cjk就不能用了。但是debian并不提供系统的降级,在aptitude里面仍然显示所有要升级的软件包。于是我在/var/lib/dpkg/和/var/cache/apt/里面都执行了rm -rf *,清空前一个目录时本想备份一下,但觉得不会出什么大问题就直接删除了,这样dpkg包管理系统的信息就都没有了。

之后我在aptitude里面安装新软件时出错:
debconf: apt-extracttemplates failed: Bad file descriptor
E: Cannot get debconf version. Is debconf installed?
debconf是安装了的,只是包管理系统里面没有关于debconf的信息。于是我新建了/var/lib/dpkg/status这个文件,在里面添加了debconf的信息。这个错误没有了,但是还有下面的错误:
unable to create updated files list file for package ....
不知道怎么解决,后来找到了一个恢复包管理系统的脚本,运行了一下有错,出错的地方正好是建目录的一段,那里正是新建我删掉的目录的地方。于是我手动创建了删掉的目录:
/var/cache/apt/archives
/var/cache/apt/archives/partial
/var/lib/dpkg/info
/var/lib/dpkg/parts
/var/lib/dpkg/alternatives
/var/lib/dpkg/methods
/var/lib/dpkg/updates
另外/var/lib/dpkg/status和available这两个文件我之前已经创建了。之后在aptitude里面就可以安装包了。不过aptitude里面显示所有包都是未安装的,包括之前已经安装的,不过这并不影响这些程序的使用。

今天是心情比较急,删了明明知道不能删除的东西,但愿这样的蠢事以后不会发生了。

2006年10月10日星期二

用Google地图看老家


今天无意中用Google地图找我家,发现非常好玩。以前用Google找过我家,但当时的放大倍数很低,只能看清地形,再不能放大了,后来一直没有看过。今天发现我的老家已经可以放大到19倍了,和北京的放大倍数一样。我好好玩了一番,真的很有意思。

首先找我的家。敲入武威回车后,绿色的小箭头指在一片山区,周围都是白云,并不在市区。我看这个箭头离青海湖不远,所以武威市区应该在箭头的北面。我移动到北面,放大后发现了铁路,然后沿着铁道找到了武南火车站,再往西走,就到武威市区了。我给影子找我的家,很快找到了我的中学,就给影子讲我的中学。我家就在学校南边的家属院里面,但是家属院正巧被一片云挡着,看不到我家了。

一想到大家在忙忙碌碌过日子时候,卫星在天空悄悄地拍摄,就觉得很奇妙。前阵子看到有位哥们在自家房顶日光浴,在Google地图上被大家看到了,真是好玩。以后做事情可要多加提防,老天有眼啊。

我沿着一级公路向东,找到了我在郊区的老家。我们村有很多温室,在地图看是很多蓝色的长长的东西。我找到了我们的旧院子,甚至可以看到南墙的那棵白杨树!真是神奇啊。

我沿着一级公路继续向东,没有费多大劲就找到了我舅舅家,而且还能分清楚各家的院子呢。他们那边的房子上面都是黄色的,是秋天收来的苞谷棒子晒在房顶。地图上有的农田是绿色,有的就是褐色。绿色是夏秋天照的照片,而褐色是冬春照的。

我又找到了别的一些亲戚在武威的家,从我们家沿公路找到他们家后,我知道了我们以前走的那些公路并不是我想象中的方向,有的偏离正东/南/西/北还不少呢。

我又回到老家那边,找到了我们村的各个生产队,甚至找到了小时候往里面拉过便便的水井。那时候我和我堂弟还上小学,我们都很喜欢去河滩玩。河滩就是以前发洪水时候冲出来的几十米宽的河道。那时候那里常倒垃圾,今天我在地图上看到的已经是一个很大的垃圾回收场。

我和堂弟喜欢拣河滩的马赛克。一次从河滩回家时,河滩边有一口六队的机井正在抽水,我和他正好要拉便便,我就拉在了井水抽出来后进去的井坑里,当然便便就被冲走了。结果他竟然告诉旁边一个在地里干活的人,那人知道我是谁家的孩子。后来这事情六队的人都知道了,知道我爸的儿子在六队的机井里面便便。这件事情似乎很丢人,可当我发现也没有什么后果时候,感觉还挺自豪的。哈哈!听说六队的人打那起就不从那口井打吃的水了,不过我觉得这传言不是真的,我那么一下还不至于影响那么大吧。点击这里可以看那口井的位置。地图中间黑色的圆圈是很深的机井,水从里面抽出来,抽到前面那个浅色的圆圈里面再流出去。我是在井坑里便便的,所以影响不是很大。:P

2006年10月9日星期一

去温泉记

今天我去温泉的胸科医院检查。

去挂号时候大夫问我来过吗,我说几年前来过。说完后大夫就逗了,说你这不白说吗。我背个书包,一副学生装束,她又问怎么还没有毕业啊?我说明年毕业。哈哈,刚问完她就笑着说我不应该这么问你。这里的大夫说起话来都比较和气,不像有的医院的大夫,经常板着脸。

温泉远离市区,我觉得这里的人比城市里的大夫相对和气,给人轻松的感觉。我猜我要去城市里的医院,才没人和我说闲话呢。

看完大夫,我划价后问挂号处刚才那个大夫去哪里检查,她看了一眼我的单子后说70啊,看她的表情是觉得挺贵的。

检查完后我又去医院的小山上玩。医院南边有个小山,上面有辛亥革命滦州起义纪念碑,有冯玉祥写的碑文。今天多云,空气比较潮湿,小山上没人,感觉很好。在山上我还清晰得记得四年前来这个小山上,到山顶的大石头下面时候,几个男的看我是陌生人,跟我说了什么。在这里,回想2002年来这里的情景,又触动了我怀旧的感情。

下山的时候我从北边的小路下去,结果竟然越走越不像路,到山脚时旁边都是医院的栏杆,我就翻出去了。翻的时候好紧张,翻墙揭瓦的事情我很久没有干了,而且那栏杆的钢筋在顶上朝外面弯着,要一不小心轻则衣服划破,重则身子被钢筋戳进去。还好安全出去了。所以温泉医院的门,我进了两次,出了一次。哈哈。

出去后想吃饭,问一个小学生哪里吃饭,他指给我后我又不想去了,在330的站牌下等车,他在公路中间还指着对面的市场对我喊。真是天真纯朴的孩子啊。

我在颐和园下车,想去颐和园逛一圈,在车站边问了公交车司机才找到一个小饭馆,里面饭还挺贵。要了碗凉面六块钱,我靠,看着跟吐出的似的,吃了两截面条后就走了,太难吃了。这会学校了,也没有心情游园了。

给Gnome Robots制作新图片(二):强大的Imagemagick

今天用Imagemagick的montage实现了命令行的图片组合,上图就是得到的图片。我再次体会到了Imagemagick的强大,上次是用Imagemagick来缩小JPEG图片的。

昨天得到的图片只是第一个版本,每个小图片还需要改进,如果用GIMP 一个一个挪动的方法就会很麻烦,所以我研究了一下montage的命令行参数,得到了生成Gnome Robots图像的方法,就是一行montage命令:
montage -geometry 16x16 tux1.png tux2.png tux3.png tux4.png tux5.png gates1.png gates2.png gates3.png gates4.png gates-v1.png gates-v2.png gates-v3.png gates-v4.png dead.png -tile 14x1 -background transparent bill.png
tux1.png到tux5.png是从左到右的五张小企鹅图片,其它也是按从左到右的顺序命名的。

这种方法比用GIMP容易多了,而且可以很容易地重复操作。我把用montage得到的图片和用GIMP得到的对比了一下,发现用montage得到的图片比用GIMP得到的更精确,因为用GIMP的方法要挪动14张图片,容易出错,而montage的tile参数已经指定了按14行1列的布局排列图片,不用指定每个图片的偏移了。

2006年10月8日星期日

给Gnome Robots制作新图片(一):用GIMP的实现

今晚要弄个Gnome Robots的新图片,用GIMP不知道如何精确排列图片,就用Inkscape,但是Inkscape(0.44版)的Object -> Grid Arrange根本不能用,行和列自动变为1,而且按了Apply后没反应。然后想用Scribus,但是Scribus(1.2.5)的File -> Import -> Get Text/Picture是灰色的,也不能用。我又用Imagemagick的montage命令,但是不带参数地执行后得到的图片不是由输入图片紧挨着从左到右排列生成的,而那些选项我也看不出眉目来。最后用GIMP比较麻烦地完成了,怕下次忘了,就简单记下来。

首先准备tux.png,gates.png,gates-v.png,dead.png,每张图片都是16x16的背景透明png图片。然后新建224x16的背景透明图片bill.png。把tux.png复制后粘贴进bill.png,然后菜单Layer -> Layer to Image Size,然后Layer -> Transform -> Offset,在X偏移值里面填入-114,确认,这样把第一个小企鹅左移114像素,正好在bill.png最左边。然后Layer -> Duplicate Layer,对新复制的层进行X方向16的偏移。然后再复制刚刚移动过的层,再偏移16,直到得到5个企鹅。用类似的方法再从左向右依次加入4个gates.png,4个gates-v.png,1个dead.png,即可得到最终的bill.png。将其复制到/usr/share/pixmaps/gnobots2里面,打开Gnome Robots即可选择新的图像bill了。

2006年9月28日星期四

在Linux下用Windows下的共享打印机

终于可以在我的Ubuntu下面用实验室Windows下的共享打印机了。下面总结一下,供我以后查阅。

首先要安装以下的包:
sudo aptitude update
sudo aptitude-get install cupsys cupsys-bsd cupsys-client samba smbclient
如果共享打印机HPLaserJ位于mea工作组的zheng电脑下,型号是HP LaserJet 1200系列,那么执行如下命令来添加该打印机[1]
lpadmin -p zhengprinter -v smb://mea/guest@zheng/HPLaserJ -P /usr/share/cups/model/hplip/HP_LaserJet_1200.ppd
enable zhengprinter
accept zhengprinter
lpadmin -d zhengprinter
上面的命令首先增加打印机zhengprinter,然后让其可用并可以接收打印任务,最后把它设置为默认打印机。上面的命令在/etc/cups/printers.conf中增加相关内容。

然后要打开cupsys和samba服务:
sudo /etc/init.d/cupsys restart
sudo /etc/init.d/samba restart
这两个服务都是必需的,缺一不可。上面的步骤如果都没有错误,那么就应该可以在Linux下使用Windows下的共享打印机了,可以用
lp testfile
来测试是否成功,用相应的文件替换testfile。

以前曾经试着用gnome-cups-manager配置过这台打印机,但是没成功。下面总结一些问题以及解决方法。

1. 用lpadmin增加打印机时,如果出现lpadmin: add-printer (set model) failed: client-error-not-found这样的错误,看看ppd文件是否存在。如果没有需要的ppd文件,就需要安装相应的包。

2. 开始lpadmin添加打印机时,我用smb://zheng/HPLaserJ指定打印机地址,在打印时总是出现下面的错误:
Unable to connect to SAMBA host, will retry in 60 seconds...ERROR: Connection failed with error NT_STATUS_ACCESS_DENIED
错误消息可以用tail /var/log/cups/error_log查看。在搜索了一些网页后,还是不知道怎么解决,不经意中看到这么一个类似问题的回复[2]
Change the URI format to DeviceURI smb://WKGRP/guest@server/printer
due to a recent security update to CUPS.
我于是把打印机地址改为smb://mea/guest@zheng/HPLaserJ,重新运行了lpadmin,然后打印机马上吱吱响了起来,打出了队列中的测试页。要不是偶然看到这个,我真不知道什么时候才会弄好。

3. 如果仅仅是使用Windows下的打印机,不需要对samba进行任何配置,即不需要改动/etc/samba/smb.conf。

4. Ubuntu里面我的用户在lpadmin这个组里面,所以上面添加打印机的操作无需root权限。

5. 在这里命令行比图像界面好。虽然gnome-cups-manager也可以设置打印机,但是添加打印机时选择Windows打印机后,不停弹出局域网电 脑的认证对话框,而且总是跳 到最前面,很烦人。不同发行版的图形界面配置程序往往有差异,甚至同一发行版不同版本程序的界面都不同,而命令行方法在Linux下都是通用的。用命令 行知道每一步在做什么,而且失败了有更多的出错信息。

6. 如果要多次测试打印机,可执行不带任何参数的lp,lp将从标准输入(stdin)读取内容,输入一个空行后按Ctrl-D,就可以让打印机走一张白纸了。这样可节约纸张。

2006年8月21日星期一

如何创建一个C语言库

今天终于学会了如何创建一个C语言的库,就是把自己写的函数不放在主程序里面,而是放在独立的头文件和其他C文件中。这样可使主程序清晰,而且代码维护起来更容易。

比如写了个求中位数的函数median(),希望在主程序中调用median()但不出现它的代码,可以在主程序头部写上#include "median.h",median.h要和主程序放在一个目录下。median.h中的内容就只一行,是median()这个函数的原型声明,例如 extern int median(int [], int);,而median()函数的代码写在另一个文件median.c中。

编译和连接主程序时,需要多加一个文件median.c,即要用gcc -o main main.c median.c 。用上面说的方法,就可把自己写的函数作成C语言的库了。

另 一种方法是把所有东西都写到一个头文件median.h中,前面是函数原型声明int median(int[], int);,接着是函数的代码。这样编译和连接时,就无须增加median.c,只需 gcc -o main main.c。这样虽然只有一个文件,但是如果代码较多就会让头文件比较乱,所以把头文件和真正的代码分开是创建库的更合理的方法。

上面的总结主要参考了How C Programming WorksEasyBMP的源代码。记下此笔记,供以后查询。

2006年8月17日星期四

买车记

几经周折,今天终于买了辆自行车 。

上学期在南门丢了车,虽然自己还有一辆,但太旧了,最严重是没有车闸了,而且不能带人,所以还得买。先买了一辆挺新的,但是骑着不舒服就又原价卖了。暑假回来后继续买。二手版上买车的多,卖车的少,一有卖车的帖子要不抢在前面,一会儿就被人先要了。曾经看过一辆车,但是太新了,怕丢就没有买。

今天中午一个人卖永久26自行车,老式的吧,我赶紧联系。我觉得那种车子挺结实,不大容易散。可是已经有人在先了,最后还是被那人买了,自己没拿到,遗憾了半天。

后来在北大东门买了一辆女式的车子,聊胜于无吧,总算可以带人了。恨死偷车贼了!让人都不敢买新车,旧车这么难找,麻烦死了!