博文

目前显示的是 七月, 2009的博文

2009-07-30

今天把 emacs 从23.0.x升级到了23.1.x,另外把/tmp换成了tmpfs。我在想,除非你的机器上只有 zfs 一种文件系统,否则fstab还是很必要的。tmpfs、proc这些既然早已被linux用户习惯,必然有它们的优势。tmpfs的出现,是否就意味着/etc/rc.d/tmp可以被干掉了呢?我还没有看过tmpfs的实现,不知道它与直接mount_md到/tmp,有什么区别。以下是今天读ffs写下的一些笔记:man fs说:从 BBLOCK 开始,大小为 BBSIZE (单位是字节)的是disklabel以及引导程序。(我找不到BBLOCK这个宏的定义。)按《Freebsd设计与实现》的8.9节中所说,ufs1中,BBSIZE的大小是8K。ufs2中,BBSIZE的大小可能是0,或者8K,或者64K,或者256K。
我只读的懂i386 的实现。它是这么做的:
在boot0的末尾,它调用bios的int 13h中断,使用42h或者20h从主分区的开始读一个扇区到内存,然后跳转到该位置开始执行。但是boot2的大小是7.5K,它是如何做完剩下的事情的呢?按《FreeBSD Architecture Handbook》的1.5所说,boot1是用于从floppy引导。我观察的结果是这样的:boot2是用btxld链接得到的。传递给btxld的-l参数的就是一个512字节的空文件(boot2.ldr),目的是预留512字节的空间用于存放disklabel,所以/boot/boot2的前512个字节是zero。用cat命令把boot1和boot2组合到一起得到/boot/boot,然后用bsdlabel -B 写入该主分区的开始。boot0最后读到的那512字节就是boot1。接着,boot1从这个主分区的开始读16个扇区(也就是8K)到内存中。这8K包含boot1,然后512字节的disklabel,然后是boot2真正的代码。
至于这512字节的disklabel数据如何解析,在/usr/src/sys/geom/geom_bsd_enc.c的bsd_disklabel_le_dec有详解。它的末尾包含一个分区表,指明了每个label对应的文件系统的开始扇区以及大小。
真正的文件系统是从SBLOCK开始。最前面是大小为SBLOCKSIZE的main superb…

终于把oblivion完整版下载下来了

图片
The.Elder.Scrolls.IV.Oblivion-RELOADED.iso,一个4G的iso,用驴子拖了3天终于下载下来了。不是免CD版,运行的时候还需要把这个iso放入到虚拟光驱中。然后去网上下patch,从1.0往1.2升级,但是失败了。尽管我的oblivion.exe是原始的,但是oblivionlancher.exe是被修改过的,所以补丁只打了1/3就终止了。但是进游戏后看,版本后已经是1.2了。意思就是,尽管打补丁的中途失败了,它并未把操作回滚。呃,也不知道这样继续玩下午有什么危害,反正先玩着吧。开始的时候把分辨率调成和桌面一样,1440x900,但是太卡了,于是就1280x1024,把hdr打开关闭掉反锯齿。继续以前的剧情往下做。把那4本书的每个章节的首字母拼起来是一句话:“GREEN EMPEROR WAY WHERE TOWER TOUCHES MIDDAY SUN”.尽管我找到了那个塔,但是第一次去是午夜(我对midday的错误理解)。于是图案是暗下去的回旅馆,睡到中午再来。等啊等,从11点33等到11点50,终于出现了对这它按空格,任务往下继续可惜,查攻略来回切换,然后游戏卡死了,据说这是个无解的问题。可我记得以前那个版本没有这个问题,但是以前那个版本是没有语音的,而且字幕速度超级快,我这种英语小白根本看不完对白,对话框就关闭了。呃……为啥切换老死呢。

又是空指针惹的祸

(以下纯属一派胡言)虽然在C99的文档中写,”The macros are NULL which expands to an implementation-defined null pointer constant; and…”.文档中说,实现者只要保证任何一个有效的对象的指针、函数指针都不等于NULL,至于它实际等于哪个整数,那是由实现者来决定的。可是如果NULL不等于0,if(fp) fread(buf,1,nbytes,fp) 将是一段看起来很奇怪的代码。它会正确吗?几乎所有人都默认,如果p==NULL,那么*p一定会导致程序崩溃,后面的代码不会被执行。可这依赖于OS和CPU将地址空间最底端的那个页设置成不可读。下面这样的代码有效吗?struct dirent p=NULL; char* name=p->d_name; 如果你认为它无效,那么freebsd下offsetof的实现将是极度令你吃惊的:#define __offsetof(type, field) ((size_t)(&((type *)0)->field))我把C99的文档仔细的翻阅了一遍,它没有说这样不可以。然后我再查了下vc9的stddef.h,它也是用同样的方式实现的。可我们过度聪明的gcc 犯糊涂了:
http://patchwork.kernel.org/patch/34190/struct tun_file *tfile = file->private_data; struct tun_struct *tun = __tun_get(tfile); struct sock *sk = tun->sk; unsignedint mask = 0; if (!tun) return POLLERR; linux的某个版本的gcc在优化的时候,把if那句给优化掉了!理由是tun这个指针在前面已经被用过。我写了段测试代码:#include <locale.h>#if defined(FreeBSD)#include <sys/dirent.h>#else#include <dirent.h>#endif#include <stdio.h>#include <st…

奥运带来的转变

7.13。某人的生日,以及北京申奥成功纪念日。
眼看一年过去了,且不论鸟巢四周是否已长遍荒草,奥运给北京带来改变有:
1、一进地铁,就有人对你喊大包小包一律安检。那X光机多久清洗一次?
2、邮局依然不能寄电脑
3、07年,清华、北京先后打开校门,欢迎个人以及旅行团自由进出参观(重要建筑除外)。到了08年,为了迎接奥运,纷纷封校,挨个查证件。至今,北大依旧如此

单向街要搬走了

图片
06年,从武大一位同学(FanTing)那里得知单向街,那时,在我的想象中它该是一条斜斜的小巷子,距巷口三分之一处,有个老房子,里面卖书,还住着一个活着的作家,叫许知远。那时我并不知道许知远是谁,微软输入法不包含这个词,所以你不可嘲笑我的无知。啊,如果你去过那儿,那你刚才一定笑了。后来我背着大包小包,来到皇城,在圆明园墙外扎根住下。单向街圆明园店,自然成了我最常去的地方之一。在那我听过春树,格非的访谈,听过数次严峻的现场演奏,许多许多诗人的朗诵。我喜欢那里的石子路,翠绿的庭院,镜面小桌,关键是,那椅子坐起来非常非常的舒服。后来才得知,那店里的几个老板,和我是同行,同时,我们两家公司,也是业界里出了名的死敌。那里书不值得一买,但是我在那里看了两部音乐剧,是我看过的最美的两部:法国版的《罗密欧和朱丽叶》,以及《小王子》。目前我书架上只有2本是在那买的,一本是《偏见:CBS知情人揭露媒体如何歪曲新闻》,还有一本亨利米勒的小说。可在我心中,北京没有什么书店,可与万圣相比。p.s.今天忘了网址,去google求解,可,险些不敢进来

手动安装freebsd

上周在newsmth上和intron商量说准备做一个freebsd安装程序,既然打算着手做这个,那么弄明白freebsd的安装流程,是必要的。今天是拿了一个空闲的U盘做实验1、初始化硬盘分区表
fdisk –BI da3或者 gpart create -s MBR da3 ,然后gpart add –b xxx –s xxx –t frebsd-ufs da3
需要做两件事情,初始化硬盘分区表,把boot0填进去,把freebsd所在的主分区设置为bootable2、初始化disklabel
bsdlabel -B -w da3s1 auto
写一个标准的label到da1s1,并且把boot2放进去3、初始化ufs2文件系统
newfs /dev/da3s1a4、挂载,放置引导程序和kernelmkdir –p /mnt/usb mount /dev/da3s1a /mnt/usb mkdir /mnt/usb/boot 因为boot2之后是loader,所以需要把loader、loader.4th、support.4h、loader.rc、defaults/loader.conf 复制过来。
重启了一遍,发现成功了,继续放kernel
建一个kernel文件夹,把/boot/kernel/kernel复制过来,其它的暂且不要
再次重启,发现走到挂root fs的时候停了。需要手动输入ufs:/dev/da0s1a继续。呃……难道是因为没有/etc/fstab ? 不管。往下继续走,开始到用户态了,找不到init5、放用户态程序
经我试验,实际只需要2个。/sbin/init和/bin/sh. 因为/bin/sh是动态链接的,所以我从/rescue复制了一个过来。但是/dev目录必须得有,不然没有devfs,走不到sh这一步。大功告成!实际上,loader不是必须的。真想砍掉它,forth那套东西真是烦人。如果是试图从win下最小安装一个freebsd,那么只需要boot2、kernel、init、sh一共4个东西就够了。我的想法是,在winxp下做个小工具完成一个最小化安装。然后用户切换到freebsd下,用pkg_add和sysinstall完成其它事情。最小化安装freebsd需要多久呢?我以前的纪录是大约50秒(包括重启),我想再突破。

2009-07-05

加班到没有末班地铁实在是一件很痛苦的事情,没有报销打车费这一说。这年景,能有份工作,不错了。
今天看到log4j支持jms,就好奇的下了apache的ActiveMQ来用。其实本来SUN的J2EE本身就带一个MQ server,但是下载太慢了,我放弃了。然后,被ActiveMQ虐了一下午。
首先是datasource的问题,我配置它执向mysql,但是我的mysql的innodb存储过程的隔离级别是read-uncommited,最低的那个,被ActiveMQ鄙视了,好吧,改。之后又因为binlog的格式是statment,又被鄙视,改成row.终于启动成功。然后在另外一台机器上用log4j去连,可是…… 总也不成功。先是缺jar包,因为我的程序是j2se的应用,所以我就去下jms.jar,然后又报缺这缺那,log4j的jms的文档更是简略的让人抓狂。
在网上找了这样一段配置贴进去
log4j.appender.jms=org.apache.log4j.net.JMSAppender
log4j.appender.jms.InitialContextFactoryName=org.apache.activemq.jndi.ActiveMQInitialContextFactory log4j.appender.jms.ProviderURL=tcp://jmsserver:61616
log4j.appender.jms.TopicBindingName=dynamicTopics/locallogging
log4j.appender.jms.TopicConnectionFactoryBindingName=ConnectionFactory
不说缺jar包了,但是结果和楼主一样,遇到这样的异常:
java.io.IOException: Wire format negotiation timeout: peer did not send his wire format
鉴于ActiveMQ的默认格式是openwire,并且我在server的配置文件中确实也是这么配的,于是我就在ProviderURL中强行加上wireFormat=openwire,但是client又继续报告说找不到xxxx class的错。啊!!!!
我在想我毕业后的第一个项目,在我看来,它的核心就是一个MQ。只…

libxcb-xlib.la not found

我机器上现在安装的版本是xcb-1.3。libxcb-xlib.la是xcb 1.1里带的一个东西,后来被删除掉了。但是/usr/local/lib下很多.la里面还写有这个文件,于是我在编译gtk的时候链接不过。我去/usr/local/lib下手动把这些删掉了,然后用ldd看了下刚改过的这几个la的对应的so,没见谁缺东西。先这样吧总之,ports系统有时候很不好用!如果它强迫我重新编译、安装那些库,问题就没了