11/05/2007

搬家

周末搬家,一个字“累”。
前天下午开始收拾东西,看着堆满客厅的箱子、包,还有卧室里好几个棉被、两衣柜的衣服,还有厨房一大堆。。。头大!经常收拾一会儿就不由自主的停下来发呆,折腾到晚上1点支撑不住了就休息了。第二天早上9点多就起床了,吃了一点面包然后接着干,终于卧室的东西收拾差不多了,看看时间快12点了,于是出去吃午饭,接着马不停蹄地出去找车。
中间的辛苦就不提了。给我搬家的车是一辆小面包车,我觉得这车应该没问题,东西能装下,结果等车厢快塞满时,才意识到错了,房间里面还有一大堆东西咧,只好让司机再跑一趟,当然运费也要加咯。第二趟仍然是满满地一车,可见东西之多啊!最后一趟搬过去的时候已经快8点了,司机的家人打来好几个电话,估计这么晚不放心,我让司机先回去了,看着卸下来的一大堆的东西,再次头大(因为这次只能我一人搬了),没办法,挽起袖子搬呗。。。到后来我干脆把毛衣脱了,穿着一件秋衣,可依旧大汗淋漓。。。
在这里要感谢房东,还有那位司机,耽误司机不少时间,另外他也帮着搬上搬下的。
本来三个房间(厨房、客厅、卧室)的东西挤到了一个房间,可以想象是多么“壮观”,好了,别发愣了,埋头收拾。。。
什么时候才能有自己的家。。。

11/01/2007

AIX 下使用 netstat 命令查进程,同事试出来的

AIX 下 netstat -na 可以看到其他机器和本系统建立的连接情况,但是我想知道和本系统的那个进程建立的连接,如何看?在 linux 下可以用 netstat -nap 能看到,但是 AIX 不支持。
1.netstat -Ana grep 地址,记住第一列的值(例如71daa608)
2.rmsock 71daa608 tcpcb,会显示进程号
3.ps -efgrep 进程号

10/31/2007

视频音频采集传输和播放

采集端
1)媒体服务器:spook<http://www.litech.org/spook/>, 主要工作是编译和安装,并设置spook.conf
2)USB摄像头驱动:spca5xx<http://mxhaard.free.fr/download.html>, 主要是安装驱动
需确认声卡录音和回放功能正常。通过gnomemeeting进行声音的测试,可以矫正音频上面的一些问题。

监控端
1)MPlayer,主要工作是加入 LIVE555 的支持。 VLC,主要工作是编译安装
2)源码下载:
ftp://ccoss:ccoss@192.168.28.1/pub/jiangchanglong/spook-video-audio/ 相关依赖软件包
ftp://ccoss:ccoss@192.168.28.1/pub/jiangchanglong/spook-video-audio/spca5xx-v4l1goodbye.tar.gz
ftp://ccoss:ccoss@192.168.28.1/pub/jiangchanglong/spook-video-audio/spook-20050207.tar.bz2
ftp://ccoss:ccoss@192.168.28.1/pub/jiangchanglong/spook-video-audio/live555-latest.tar.gz
ftp://ccoss:ccoss@192.168.28.1/pub/jiangchanglong/spook-video-audio/vlc-0.8.6c-5.lvn8.src.rpm
ftp://ccoss:ccoss@192.168.28.1/pub/jiangchanglong/spook-video-audio/MPlayer-1.0rc2.tar.bz2
3)最简步骤
在采集端,安装摄像头驱动 spca5xx;tar;make; 复制 spca5xx.ko 到 /lib/modules/2.6.16..../kernel/driver/video/ 执行 depmod -a 连接 USB 摄像头 打开alsamixer,开启MIC的音量控制。 安装spook。tar;configure;make 修改配置文件,可参考 ftp://ccoss:ccoss@192.168.28.1/pub/jiangchanglong/spook-video-audio/spook.conf
启动 ./spook spook.conf 在监控端,安装 MPlayer, ftp://ccoss:ccoss@192.168.28.1/pub/jiangchanglong/spook-video-audio/MPlayer-1.0rc2-1.i386.rpm
播放 rtsp://192.168.28.181:7070/webcam 也可以安装 vlc,编译过程需要很多依赖包。

10/29/2007

_stdcall, _cdecl,_pascal and _fastcall --- calling conventions

1.如果函数func是__cdecl(默认调用方式),调用时情况如下
int main()
{
//参数从右到左压栈
push 4
push 3
push 2
push 1
call func
add esp 0x10 //调用者恢复堆栈指针esp,4个参数的大小是0x10(4x4)
}

2.如果函数func是__stdcall,调用时情况如下
int main()
{
//参数从右到左压栈
push 4
push 3
push 2
push 1
call func
//恢复堆栈指针由被调用者func负责,方法是"ret 0x10"
}

3.如果函数func是__pascal,调用情况如下
int main()
{
//参数从左到右压栈
push 1
push 2
push 3
push 4
call func
//恢复堆栈指针由被调用者func负责,方法是"ret 0x10"
}

3.如果函数func是__fastcall,调用情况如下
int main()
{
//参数先用ecx, edx, eax传递,然后再压栈
//不进栈
//(不知为什么,帮助中写的是从左到右传递的,
//是不是错了,还是BCB6和BCB5的不一样)
push 4
mov ecx 3
mov edx 2
mov eax 1
call func
//恢复堆栈指针由被调用者func负责,方法是"ret 0x04",
//因为只进栈一个参数,其余用寄存器传递,所以用ret 0x04恢复
}

10/27/2007

Linux 中程序运行时存储器映像

每个程序都有一个运行时存储器映像:


一个典型的ELF可执行目标文件信息布局如下:

10/26/2007

在程序内部获得 call back trace

打印出程序运行时的堆栈情况:

#include
#include
#include

/* Obtain a backtrace and print it to stdout.
*/void print_trace(void)
{
void *array[10];
size_t size;
char **strings;
size_t i;
size = backtrace(array, 10);
strings = backtrace_symbols(array, size);
printf("Obtained %zd
stack frames.\n", size);
for (i = 0; i < size; i++)
printf("%s\n", strings[i]);
free(strings);
}

/* A dummy function to make the backtrace more interesting. */
void dummy_function(void)
{
print_trace();
}

int main(void)
{
dummy_function();
return 0;
}

gcc -rdynamic -o t t.c

注:-rdynamic (其实时传给ld的参数),否则可能不会打印出函数名称,而代之以偏移量。

参考:http://www.delorie.com/gnu/docs/glibc/libc_665.html

10/25/2007

调用函数时,寄存器到底发生了那些变化?

linux x86 gcc3.2.3 AT&T格式的汇编

代码如下:


void
fun()
{
int a = 'A';
}

void main()
{
int b;
fun();

return;
}


编译
gcc -g -o t t.c

开始调试
[sanool@sanool ex2]$ gdb t
GNU gdb Red Hat Linux (6.0post-0.20031117.6rh)
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...(no debugging symbols found)...Using host libthread_db library "/lib/tls/libthread_db.so.1".

(gdb) disas main
Dump of assembler code for function main:
0x08048323 : push %ebp
0x08048324 : mov %esp,%ebp
0x08048326 : sub $0x8,%esp
0x08048329 : and $0xfffffff0,%esp
0x0804832c : mov $0x0,%eax
0x08048331 : sub %eax,%esp
0x08048333 : call 0x8048314
0x08048338 : leave
0x08048339 : ret
0x0804833a : nop
0x0804833b : nop
End of assembler dump.
(gdb) disas fun
Dump of assembler code for function fun:
0x08048314 : push %ebp
0x08048315 : mov %esp,%ebp
0x08048317 : sub $0x4,%esp
0x0804831a : movl $0x41,0xfffffffc(%ebp)
0x08048321 : leave
0x08048322 : ret
End of assembler dump.

解释如下:
**当程序下一步执行 0x08048333 : call 0x8048314
esp = 0xbfffe660 (运行时)
ebp = 0xbfffe668 (运行时)
eip = 0x08048333

**然后执行 call 0x8048314 也就是
push %eip ( 相当于 sub $4 %esp 再 mov %eip %esp )
movl $0x8048314, %eip

则0xbfffe65c 处为 eip = 0x08048338
且esp = 0xbfffe65c
eip = 0x8048314
ebp = 0xbfffe668

**执行0x08048314 : push %ebp后
esp = 0xbfffe658
ebp = 0xbfffe668
0xbfffe658处的值为 ebp = 0xbfffe668

**继续0x08048315 : mov %esp,%ebp
将esp的值赋值给ebp
即 ebp = esp = 0xbfffe658

**开始执行 0x08048321 : leave 前
eip = 0x08048321
ebp = 0xbfffe658
esp = 0xbfffe654

**开始执行 0x08048321 : leave 时
即进行
movl %ebp, %esp ( 即 esp = ebp = 0xbfffe658)
pop %ebp ( 也就是 mov %esp,%ebp 再 add $4,%esp )

此时 ebp = 0xbfffe668 回到了原函数的ebp值,

**再执行 0x08048322 : ret
即 pop %eip
( 也就是 mov %esp,%eip 再 add $4,%esp )
此时 eip = 0x08048338
程序继续执行 main 中的 leave

调用fun函数结束

补充:
i reg //观察寄存器的值 (注意ebp esp eip)

x/20x $esp //查看内存中$esp(如0xbfffef50)后面的数据内容

10/15/2007

大规模并行计算

http://code.google.com/edu 可获得华盛顿大学编写的所有课程资料,以及其他用于帮助学习这一前沿技术的工具和资源。
如果想了解此类项目的意义,请观看系列讲座视频(共五部分,原是谷歌工程部实习生的学习资料),其中介绍了大规模集群计算的一些基本概念。

10/09/2007

cut、tr 等命令格式化字符串

CurreIP=$(wget http://freedns.afraid.org/dynamic/check.php -o /dev/null -O /dev/stdout | grep Detected | cut -d : -f 2 | cut -d '<' -f 1 | tr -d " ")

cat check.php :

Detected IP : 210.73.65.34, 210.73.65.77
HTTP_CLIENT_IP :
HTTP_X_FORWARDED_FOR : 210.73.65.34, 210.73.65.77
REMOTE_ADDR : 72.20.25.132

9/18/2007

vim + cscope/ctags

生成符号索引文件: cscope -Rbkq
这个命令会生成三个文件:cscope.out, cscope.in.out, cscope.po.out。
上面所用到的命令参数,含义如下:

-R: 在生成索引文件时,搜索子目录树中的代码
-b: 只生成索引文件,不进入cscope的界面
-k: 在生成索引文件时,不搜索/usr/include目录
-q: 生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度

按照cscope手册上提供的方法,先产生一个文件列表,然后让cscope为这个列表中的每个文件都生成索引。
为了方便使用,编写了下面的脚本来更新cscope和ctags的索引文件:


#!/bin/sh

find . -name "*.h" -o -name "*.c" -o -name "*.cc" > cscope.files
cscope -bkq -i cscope.files
ctags -R


这个脚本,首先使用find命令,查找当前目录及子目录中所有后缀名为".h", ".c"和".cc"的文件,并把查找结果重定向到文件cscope.files中,然后cscope根据cscope.files中的所有文件,生成符号索引文件。最后一条命令使用ctags命令,生成一个tags文件。

cscope的主页在:http://cscope.sourceforge.net
vim的主页:http://www.vim.org

9/12/2007

malloc(0) 的问题


char *p;
p = (char *)malloc(0);


以上代码没有错误,但 p 的分配的空间大小是多少呢,不确定?
至于为什么可以分配成功,看看 malloc 的说明就明白了:

malloc returns a void pointer to the allocated space,or null if there is insufficient memory available.

9/07/2007

领带的几种打法



呵呵,还不会呢,以后应该用的着。

9/06/2007

查看pci设备的方法?!

大家都知道可以使用 lspci 查看pci设备信息。PCI设备是其特定的ID号来标示的,包含vendor id, device id, subsystem等,这个ID是由一个组织统管并给各大硬件厂商分配。一般来说,一个精确的ID就唯一得确定了一种PCI设置,因此通过读取此ID就可以得知此设备究竟是什么东西。Linux发行版中的lspci工具就是做这个的。但由于发行版发行时间问题,系统自带的ID-设备对硬数据库可能比较陈旧,导致识别不出新的设备来,这是就会出现unknown device,如同上面我们看到的结果。遇到此类情况,解决方法是使用新的IDs数据库。对于Linux,有一个项目是构建公开的ID数据库,在这里:http://pciids.sourceforge.net/,可以在此网站直接下载其数据库http://pciids.sourceforge.net/pci.ids到本地,然后使用命令lspci -i path-to-pci.ids 来指定使用下载到的ID数据库来鉴别设备。

8/27/2007

汇总统计

1.汇总
样本文件,这里暂时称为 file1,内容如下:
a
a
b
b
a
b
c
a
d
b
b
b
d
a
c
--------------------
执行以下命令:
cat file1 | sort // 按照字母顺序排序
cat file1 | sort | uniq // 按照字母顺序排序且去除重复项
cat file1 | sort | uniq -c // 按照字母顺序排序且去除重复项,在每行前列出重复项的个数
cat file1 | sort | uniq -c | sort -rn // 在每行前列出重复项的个数,按个数排序且去除重复项

2.单词统计
cat file3
cat file3 | sed -e "s/ /\n/g"
cat file3 | sed -e "s/ /\n/g" | sort
cat file3 | sed -e "s/ /\n/g" | sort | uniq -c
cat file3 | sed -e "s/ /\n/g" | sort | uniq -c | sort -rn

取头尾

cat file3 | sed -e "s/ /\n/g" | sort | uniq -c | sort -rn | head
cat file3 | sed -e "s/ /\n/g" | sort | uniq -c | sort -rn | head -n5
cat file3 | sed -e "s/ /\n/g" | sort | uniq -c | sort -rn | tail
cat file3 | sed -e "s/ /\n/g" | sort | uniq -c | sort -rn | tail -n5

统计词(总数,不重复的个数)有好几种办法

cat file3 | sed -e "s/ /\n/g" | sort | uniq | wc -l
cat file3 | sed -e "s/ /\n/g" | wc -l

cat file3 | wc
cat file3 | wc | cut -d" " -f2
cat file3 | wc -w
cat file3 | sed -e "s/ /\n/g" | wc -l

7/16/2007

在 Debian 下安装 VMware Workstation

前段时间在自己的本本上安装 VMware 时遇到了两个问题,找了不少资料好歹解决了,现在记录下来了。
我本本的环境如下:
dev@debian:~$ cat /etc/debian_version
lenny/sid
dev@debian:~$ uname -a
Linux debian 2.6.18.4hzy #1 Sat Jun 30 21:28:21 CST 2007 i686 GNU/Linux

VMware 安装文件:VMware-workstation-5.5.1-19175.tar.gz

由于我自己编译的内核,在安装的时候总是提示内核版本不一致,无奈我只好在 /usr/src/linux/include/linux/version.h 中增加 #define UTS_RELEASE "2.6.18.4hzy"
继续安装又提示 “error: conflicting types for 'poll_initwait'”
到 http://ftp.cvut.cz/vmware/ 下载最新的 patch 并安装就 Ok 了。

7/14/2007

Tapioca - Gtalk for Linux

New release of Tapioca, VoIP Linux client, fully supports GTalk voice features, thanks to libjingle library released by Google. One can wonder what this will bring in the future, together with Skype almost abandoning the Linux client and that in many parts of the world people accustomed to Linux are the ones who recommend software...
这是 tapioca 的 Architecture Overview,其中 Gtalk 的语音支持主要靠 libjingle

7/11/2007

在RedHat8.0上安装Oracle9i数据库

1.安装好RedHat8.0操作系统,确保安装了以下的RPM开发包
gcc
cpp
glibc-devel
compat-libstdc++
glibc-kernheaders
binutils
可以使用命令来查看是否已安装了这些包
rpm –q gcc cpp compat-libstdc++ glibc-devel glibc-kernheaders binutils

2.从Oracle官方网站下载Oracle9i安装文件并使用如下命令解包
(ftp://ftp.lib.tsinghua.edu.cn/)
zcat lnx_920_disk1.cpio.gz | cpio –idmv
zcat lnx_920_disk2.cpio.gz | cpio –idmv
zcat lnx_920_disk3.cpio.gz | cpio –idmv
然后会有Disk1 Disk2 Disk3三个子目录。

3.设置内核参数
echo `expr 1024 \* 1024 \* 512` > /proc/sys/kernel/shmmax,对于shmmax文件的修改,系统重新启动后会复位。可以通过修改 /etc/sysctl.conf 使更改永久化
编辑/etc/sysctl.conf
kernel.shmmax=536870912
kernel.shmmax的计算方法为:kernel.shmmax = 1024*1024*RAM(M)/2 (至少)

接下来,打开/etc/security/limits.conf文件,将下列数据添加到 limits.conf的末尾并保存:
oracle soft nofile 65536
oracle hard nofile 65536
oracle soft nproc 16384
oracle hard nproc 16384

这是设置Oracle对文件的要求。

4.创建Oracle用户帐号和安装目录
在shell下,作为root

groupadd dba
groupadd oinstall
useradd –g oinstall –G dba oracle
passwd oracle

mkdir /opt/oracle
mkdir /opt/oracle/product
mkdir /opt/oracle/product/9.2.0
chown –R oracle.oinstall /opt/oracle
mkdir /var/oracle
chown oracle.dba /var/opt/oracle
chmod 755 /var/opt/oracle

5.设置环境变量
编辑/home/oracle/.bash_profile文件,添加下列行

export ORACLE_BASE=/opt/oracle
export ORACLE_HOME=$ORACLE_BASE/product/9.2.0
export LD_ASSUME_KERNEL=2.4.2
export ORACLE_SID=ora9i
export ORACLE_TERM=xterm
$ORACLE_HOME/network/admin
export NLS_LANG=AMERICAN_AMERICAN.ZHS16GBK
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/asmin/data
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
export LD_LIBRARY_PATH

export PATH=$PATH:$ORACLE_HOME/bin

CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
CLASSPATH=$CLASSPATH:$ORACLE_HOME/network/jlib
export CLASSPATH

6.安装
进入Disk1目录
./runInstaller
当link进行到61%时出现一个关于ins_oemagent错误,选择ignore,安装完后修复
当link进行到84%时出现一个关于ins_ctx错误,编辑$ORACLE_HOME/ctx/lib/env_ctx.mk文件,把$(LDLIBFLAG)dl加到以下位置
INSO_LINK=-L$(CTXLIB)$ (LDLIBFLAG)m $(LDLIBFLAG)dl处。
安装完成

修复第一个错误
在shell下,oracle用户
cd $ORACLE_HOME/network/lib
make –f ins_client.mk install
编辑$ORACLE_HOME/ctx/lib/ins_ctx文件
13—14行处
$(LINK) $(CTXHXOBJ) $(INSO_LINK)

$(LINK) –ldl $(CTXHXOBJ) $(INSO_LINK)
make -f ins_client.mk install

7.启动数据库、监听程序、web server
启动数据库
Sqlplus “ / as sysdba”
SQL>startup

启动监听程序
lsnrctl

启动web server
cd $ORACLE_HOME/Apache/Apache/bin
./startJServ.sh

8.手工建库
先写个initcihz.ora ,放到dbs,如果你的sid是cihz的话
启动instance:
SQL> startup nomount
ORACLE instance started.

Total System Global Area 70062220 bytes
Fixed Size 450700 bytes
Variable Size 62914560 bytes
Database Buffers 6553600 bytes
Redo Buffers 143360 bytes
SQL>

SQL> CREATE DATABASE cihz
USER SYS IDENTIFIED BY cihz
USER SYSTEM IDENTIFIED BY cihz
LOGFILE GROUP 1 ('/opt/oracle/oradata/cihz/redo01a.log','/opt/oracle/oradata/cihz/redo01b.log') SIZE 5M,
GROUP 2 ('/opt/oracle/oradata/cihz/redo02a.log','/opt/oracle/oradata/cihz/redo02b.log') SIZE 5M,
GROUP 3 ('/opt/oracle/oradata/cihz/redo03a.log','/opt/oracle/oradata/cihz/redo03b.log') SIZE 5M
MAXLOGFILES 15
MAXLOGHISTORY 10
MAXDATAFILES 1024
MAXINSTANCES 255
CHARACTER SET ZHS16GBK
DATAFILE '/opt/oracle/oradata/cihz/system01.dbf' SIZE 500M
EXTENT MANAGEMENT LOCAL
DEFAULT TEMPORARY TABLESPACE temp
TEMPFILE '/opt/oracle/oradata/cihz/temp01.dbf'
SIZE 500M REUSE
UNDO TABLESPACE undotbs
DATAFILE '/opt/oracle/oradata/cihz/undo01.dbf'
SIZE 500M REUSE AUTOEXTEND ON NEXT 5120K MAXSIZE UNLIMITED;
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 CREATE DATABASE cihz
*
ERROR at line 1:
ORA-30014: operation only supported in Automatic Undo Management mode


出错了,在init里增加如下:

UNDO_MANAGEMENT=AUTO
UNDO_TABLESPACE=undotbs


SQL> shutdown
ORA-01507: database not mounted


ORACLE instance shut down.
SQL> startup nomount
ORACLE instance started.

Total System Global Area 70062220 bytes
Fixed Size 450700 bytes
Variable Size 62914560 bytes
Database Buffers 6553600 bytes
Redo Buffers 143360 bytes
SQL> CREATE DATABASE cihz
USER SYS IDENTIFIED BY cihz
USER SYSTEM IDENTIFIED BY cihz
LOGFILE GROUP 1 ('/opt/oracle/oradata/cihz/redo01a.log','/opt/oracle/oradata/cihz/redo01b.log') SIZE 5M,
GROUP 2 ('/opt/oracle/oradata/cihz/redo02a.log','/opt/oracle/oradata/cihz/redo02b.log') SIZE 5M,
GROUP 3 ('/opt/oracle/oradata/cihz/redo03a.log','/opt/oracle/oradata/cihz/redo03b.log') SIZE 5M
MAXLOGFILES 15
MAXLOGHISTORY 10
MAXDATAFILES 1024
MAXINSTANCES 255
CHARACTER SET ZHS16GBK
DATAFILE '/opt/oracle/oradata/cihz/system01.dbf' SIZE 500M
EXTENT MANAGEMENT LOCAL
DEFAULT TEMPORARY TABLESPACE temp
TEMPFILE '/opt/oracle/oradata/cihz/temp01.dbf'
SIZE 500M REUSE
UNDO TABLESPACE undotbs
DATAFILE '/opt/oracle/oradata/cihz/undo01.dbf'
SIZE 500M REUSE AUTOEXTEND ON NEXT 5120K MAXSIZE UNLIMITED;
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 CREATE DATABASE cihz
*
ERROR at line 1:
ORA-01213: MAXINSTANCES may not exceed 63


SQL>
*
ERROR at line 1:
ORA-01501: CREATE DATABASE failed
ORA-01222: MAXINSTANCES of 63 requires MAXLOGFILES be at least 126, not 15

按照错误提示修改过来就行了。

建立其他表空间:


CREATE TABLESPACE users LOGGING
DATAFILE '/opt/oracle/oradata/cihz/users01.dbf'
SIZE 100M
EXTENT MANAGEMENT LOCAL;

CREATE TABLESPACE tools LOGGING
DATAFILE '/opt/oracle/oradata/cihz/tools01.dbf'
SIZE 100M
EXTENT MANAGEMENT LOCAL;

接下来的数据字典:
@/opt/oracle/product/9.2.0.1/rdbms/admin/catalog.sql
@/opt/oracle/product/9.2.0.1/rdbms/admin/catproc.sql

9.测试

CREATE TABLESPACE cihz
DATAFILE '/opt/oracle/oradata/cihz/cihz01.dbf'
SIZE 500M ;


create user cihz identified by cihz
default tablespace cihz
TEMPORARY TABLESPACE temp


SQL> conn cihz/cihz
ERROR:
ORA-01045: user CIHZ lacks CREATE SESSION privilege; logon denied


Warning: You are no longer connected to ORACLE.
SQL> conn system/cihz
Connected.
SQL> grant connect ,resource to cihz;

Grant succeeded.

SQL> conn cihz/cihz
Error accessing PRODUCT_USER_PROFILE
Warning: Product user profile information not loaded!
You may need to run PUPBLD.SQL as SYSTEM
Connected.
SQL>

SQL> conn system/cihz
Connected.
SQL> @/opt/oracle/product/9.2.0.1/sqlplus/admin/pupbld.sql
DROP SYNONYM PRODUCT_USER_PROFILE


Synonym created.

SQL> conn cihz/cihz
Connected.
SQL> create table test(
2 a number,
3 b varchar2(20),
4 c blob
5 );

Table created.

SQL> insert into test (a,b)values (2,'asf');

1 row created.

SQL>


注:
1)如果是用光盘安装,不要进入Disk1目录再执行installer,最好是用/Disk1/installer &,否则当提示要换盘的时候会因为你有个终端窗口处于此目录下而不能umount光驱。
2)swap分区要尽量大点,以免到了创建数据库阶段的时候,出现“out of momery”的错误。

参考文档:
http://www.puschitz.com/
http://www.eygle.com

7/09/2007

我在水木上看到“SUN 公司 GNOME 技术讲座”的帖子,于是发信给公司的一位同事,又约好另一位同事,然后决定一同前往。于6.27号下午三人风雨兼程地赶到了清华的 FIT 楼,由于开始找错了路,在大雨中走了3分钟才到达目的地,同事戏称为 FIT 楼为 Faint 楼 :)

讲座是 SUN 工程研究院的组织的,主讲人: Harry 和 Tim,议题1: GNOME Destkop Development Platform Overview,介绍了 GNOME 整个构架中的各个部分。议题2: HAL & D-BUS 介绍了 HAL 和 D-BUS 及其在桌面系统中的应用。 Open solaris 系统中,HAL 的下一层叫 DevFsAdm,不像 Linux 中是 udev/hotplug 等,因为他们各自的内核不同。

整个讲座只是一个概要性的介绍,并无深入到具体的细节。

了解到 SUN 在 GNOME community 中是做了并正在做很多贡献的,比如 Accessibility 技术( ATK/Gail/Orca),GDM 都是 SUN 的工程师在开发和维护的,当然,在其它很多 GNOME 的组件中他们也贡献了很多 patch 等,至少我在 Eovlution 的某些版本中就看到了来自 SUN 的 patch 记录。

6/29/2007

内部讲座

今天下午听了两位同事的讲座,两个主题:一、SELinux,工作原理;二、内核相关知识(主要包括进程调度,内存管理,网卡工作原理等),收获挺多的,以后再看相关的文档时,会比较清楚了。

PowerTop

PowerTop可以测出是哪些程序常常把 CPU 从睡眠中唤醒,只要有办法去掉这些 timer,搭配 linux 2.6.21 中的新特性 dynamic tick,可以让电脑在不工作的时候可以好好休息,延长工作时间。
在 debian/sid 中只需要
apt-get install powertop
就可以安装最新版的 PowerTop,但是要真正实用的分析功能,还需要把 kernel 中的 debug 功能打开

Kernel hacking --->
[*] Kernel debugging
[*] Collect kernel timers statistics

根据日志上的记录,如 firefox, liferea 等可以在 powertop 网站上的 Tips and Tricks 找到记录,也有记录一些解決的方法或是 patch...

小于1.44MB的linux发行版 - DetaolB

DetaolB aimed to be a "much-less-than-a-floppy" x86 linux live distro.
居然能这么小,还有编译环境,有空要试试。

6/28/2007

插件开发

1)GStreamer插件开发
2)gaim插件开发

6/22/2007

获得内核例程的地址

在注册过程中,您还需要指定插入探测器的内核例程的地址。使用这些方法中的任意一个来获得内核例程的地址:
1)从 System.map 文件直接得到地址。
例如,要得到 do_fork 的地址,可以在命令行执行 $grep do_fork /usr/src/linux/System.map 。
2)使用 nm 命令。
$nm vmlinuz |grep do_fork
3)从 /proc/kallsyms 文件获得地址。
$cat /proc/kallsyms |grep do_fork

汇报近况 呵呵

最近忙于项目,另外blogspot.com也上不了,就一只没更新了。
今天活干的差不多了,从网上看到这个访问的方法:Pkblogs.com/用户名或Inblogs.net/用户名访问
试了试,还行,终于又上来了 :)
我现在开始炒股了,但上班炒股不太方便,有小一点的炒股软件就好了
另外,婚后的生活挺幸福的

3/12/2007

From stage1 install,that's that.

使用 live cd 2006.1 启动机器,输入 gentoo nox 进入系统

hdparm -d 1 -A 1 -m 16 -u 1 -a 64 /dev/hdb (启动DMA)

/dev/hda1 /boot +32M
/dev/hda2 swap +512M
/dev/hda3 / +15360M
/dev/hda4 /home xxxM

mke2fs /dev/hda1
mke2fs -j /dev/hda3
mke2fs -j /dev/hda4

mkswap /dev/hda2
swapon /dev/hda2

mount /dev/hda3 /mnt/gentoo
mkdir /mnt/gentoo/boot
mount /dev/hda1 /mnt/gentoo/boot
cd /mnt/gentoo
tar -xvjpf stage?-*.tar.bz2 (从U盘copy?)

tar -xvjf /mnt/cdrom/gentoo/snapshot/portage-xxx.tar.bz2 -C /mnt/gentoo/usr

mount /dev/hda4 /mnt/gentoo/home
mount -t proc none /mnt/gentoo/proc

配置 make.conf
CFLAGS="-march=pentium-m -O2 -pipe -fomit-frame-pointer"
CXXFLAGS="$ -fvisibility-inlines-hidden"
LDFLAGS="-Wl,-O1"
USE="nptl nptlonly -qt -kde -doc nls cjk" (nptl是一个LinuxThreads的替代品,使您机器的性能上一个台阶,在编译glibc时将用到。相关测试结果和讨论可以去BIM的developer论坛看看。“nptlonly”是最合适的,可以处理掉glibc多余的编译,缩短编译时间)
GENTOO_MIRRORS="ftp://linux.ntcu.net/dists/gentoo/ http://www.zentek-international.com/mirrors/gentoo/ http://gentoo.ccccom.com http://mirror.tucdemonic.org/gentoo/ http://gentoo.gg3.net http://gentoo.math.bme.hu "
SYNC="rsync://rsync.asia.gentoo.org/gentoo-portage"
MAKEOPTS="-j2"
FEATURES="sandbox ccache distlocks"
CCACHE_SIZE="512M"

cp -L /etc/resolv.conf /mnt/gentoo/etc/resolv.conf
chroot /mnt/gentoo /bin/bash
env-update && source /etc/profile

注: 安装过程中随时可以在一些步骤中中断, 任何时候需要重新继续之前的步骤, 只需重复如下动作:
挂载各个分区 (如第一部份准备工作中的挂载分区步骤)
重新执行如上的 chroot 命令与 env-update 命令
继续你之前中断的步骤

emerge sync

echo "sys-libs/glibc userlocales" >> /etc/portage/package.use

nano -w /etc/locales.build ::
en_US.UTF-8/UTF-8
en_US/ISO-8859-1
zh_CN.GB18030/GB18030
zh_CN.GBK/GBK
zh_CN.UTF-8/UTF-8
zh_CN/GB2312

cd /usr/portage
scripts/bootstrap.sh

emerge --nodeps gdbm libperl perl

emerge -e system

ln -sf /usr/share/zoneinfo/Asia/Beijing /etc/localtime
date
hwclock --show
hwclock --hctosys
nano -w /etc/conf.d/clock
(将 CLOCK="UTC" 改成 CLOCK="local")

(
我们应该在装完内核配置完用户等步骤完成之后, 系统重启了, 才执行下面两个命令来更改系统时间
# date 120610092004
# hwclock --systohc
)

emerge gentoo-sources
cd /usr/src/linux
make menuconfig
make && make modules_install
cp -i arch/i386/boot/bzImage /boot/kernel-2.6.10 (你喜欢叫它啥名字都可以, 到时在 grub.conf 中配置好就行)
cp -i System.map /boot/System.map-2.6.10

emerge udev
emerge hotplug && rc-update add hotplug default
emerge coldplug && rc-update add coldplug default
emerge alsa-utils
nano -w /etc/modules.d/alsa (编辑 alsa 配置以让内核加载针对你的网卡的驱动)
modules-update
rc-update add alsasound boot
emerge nvidia-kernel (装显卡驱动,ati ???)

/etc/fstab :
/dev/hda1 /boot ext2 noauto,noatime 1 1
/dev/hda3 / ext3 noatime 0 1
/dev/hda2 none swap sw 0 0
/dev/hda4 /home ext3 noatime 0 2
proc /proc proc defaults 0 0
shm /dev/shm tmpfs defaults 0 0

nano -w /etc/conf.d/hostname (设置 HOSTNAME 变量, 例如我的 hzy)
nano -w /etc/conf.d/domainname (设置 DNSDOMAIN 变量, 例如我的 gentoo.com - 瞎叫的, 这域名不存在哦)

nano -w /etc/hosts :
127.0.0.1 hzy.gentoo.com hzy localhost

emerge grub
grub
nano -w /boot/grub/grub.conf :
default 0
timeout 10

title=Gentoo Linux 2004.3 (2.6.10-morph15-r1)
root (hd0,0)
kernel /boot/kernel-2.6.10 ro root=/dev/hda3

emerge syslog-ng && rc-update add syslog-ng default
emerge vixie-cron && rc-update add vixie-cron default

passwd
useradd zy -m -G users,wheel,portage,audio,games -s /bin/bash
passwd zy

emerge splashutils
splash_geninitramfs -v -g /boot/fbsplash-emergence-1024x768 -r 1024x768 emergence
nano -w /boot/grub/grub.conf :
default 0
timeout 30
splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz

title=Gentoo Linux 2004.3 (2.6.10-morph15-r1)
root (hd0,0)
kernel /2.6.10-morph15-r1 root=/dev/hda3 video=vesafb:ywrap,mtrr,1024x768-32@85 splash=silent,theme:emergence
initrd (hd0,0)/fbsplash-emergence-1024x768

exit (退回 LiveCD 提供的环境)
cd /
umount /mnt/gentoo/proc /mnt/gentoo/boot /mnt/gentoo/home /mnt/gentoo
reboot

emerge -pv xorg-x11

emerge xorg-x11

装显卡的 glx 支持 (以 nvidia 为例):
emerge nvidia-glx

配置 X:
xorgcfg

startx

3/07/2007

内核开发

最近的工作要涉足内核开发了,主要是关于 HID Simple interface,设计实现一个 HID 逻辑总线,其下可以支持 USB 和蓝牙的 HID 设备。需要看的文档好多啊!感冒还没好呢:( 头一直晕晕的,上来写写 blog,希望感冒快点好起来~

补充资料:
emerge dev-util/git
(之前安装 python 时需要使用 export USE="tk")

获得最新的内核源代码树
git-clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git linux-2.6

更新本地 Git 仓库
$ cd linux-2.6
$ git-pull git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

从仓库中导出文件
$ git-checkout
如果您希望覆盖本地修改,可以使用 -f 选项导出文件,这样就可以将您带回到一个干净的状态:
$ git-checkout -f

编辑文件然后提交
vi Documentation/ManagementStyle
git-commit Documentation/ManagementStyle

添加或删除文件
$ git-add Documentation/Sandwiches
$ git-commit Documentation/Sandwiches

Git 来管理本地仓库
$ tar -zxvf release.tar.gz
$ cd release
$ git init-db

$ git add .

$ git commit -a

使用 po 文件翻译 GuideXML[转载]

Date: 2007-01-28
Version: 1.0
Authors: 张乐
Licence: 知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆 License

内容

* 背景知识
。po文件简介
。po文件格式解析
。po文件翻译的好处
* 准备工作
。po4a
。文本编辑器
* 推荐翻译模式
。翻译全新的文件
。利用旧版的已翻译文件翻译新文件

背景知识
po文件简介

po文件本来是用来翻译程序源代码里的字符串的。先来稍微解释一下它本来的用途,需要一点点C语言的基础才能完全理解。如果理解有困难 ,可以忽略这段内容,不会对我们使用po来翻译造成任何影响。

目前大部分自由软件实现国际化使用的是gettext。国际化就是让程序可以使用多国语言来显示程序里的字符串。程序里一般都有很多字符串,菜单名也好,错误信息也好,都是字符串。假设字符串为string,非国际化的程序里都是直接写"string"。如果用了gettext来实现国际化的话,就要写成gettext("string")。有时也会看到_("string"),那实际上也是gettext,只不过通过宏的定义把 gettext改头换面了。这个string就是msgid。然后使用xgettext来从程序源代码文件产生po文件。然后交给专门的翻译人员来翻译 po。翻译人员根本不需要懂编程。翻译完毕后,使用msgfmt来把po转化成mo文件,并安装到系统里合适的位置。程序运行时,到底显示什么字符串就是由gettext 函数来决定的了。主要有两个决定因素,一个是系统的locale及相关环境变量(LANGUAGE,LC_ALL,LC_MESSAGES和LANG),一个是相关的mo文件。具体可以看我的这篇 文章 。

随着程序版本的升级,程序里的字符串的数量和内容都会发生变化,但变化不会很大,以前翻译过的po里大部分msgid都能被重复利用。所以维护po的翻译人员在每次得到从新的程序源代码产生的po时,都用msgmerge来根据旧的已翻译过的po来先处理一下新的未翻译的po。处理过后,大部分情况下新po就翻译的差不多了。翻译人员的工作量被大幅度减轻了。
po文件格式解析

po文件都是由一对对的msgid和msgstr组成的。msgid就是原文。msgstr就是译文。原文译文相互对照,所以非常适于翻译。


msgid "Flash Player 9 released"
msgstr ""

有的msgid前面一行有fuzzy的字样。这说明,第一这个po是被msgmerge处理过的;第二,已翻译的po里没有和这个msgid完全等同的 msgid,只有非常相似的。这种情况下,msgmerge仍然会用那个相似的msgid来翻译此msgid。不过会给这个msgid标记为fuzzy,表示翻译人员仍然要翻译这 个msgid,并在翻译后去掉上面带fuzzy的这一行。


#, fuzzy
msgid "Gentoo Linux PPC Handbook"
msgstr "Gentoo Linux Alpha手册"

po文件翻译的好处

1. 原文译文相互对照,适于翻译
2. 一篇文章里同一个msgid不管出现多少次,都只需要翻译一次
3. 旧有的已翻译过的po,可以重复利用,不必再次翻译,且利于统一风格
4. 有非常好的翻译工具,熟练使用后可大幅度提高工作效率

准备工作
po4a

为了使用po来翻译,显然我们需要能够把xml转成po的工具。这里我们选用po4a。有两个原因:

* po4a可支持GuideXML,也就是gentoo文档专有格式
* po4a可以根据原来的xml文档和与之对应的已经翻译过的xml文档生成po。这个功能非常有用,随后即可看到。

安装po4a


emerge po4a

掌握po4a的三个命令

1. 从xml产生未翻译po


po4a-gettextize -f guide -m orig.xml > untrans.po

2. 从旧的xml原文和译文产生已经翻译过的po


po4a-gettextize -f guide -m orig.xml -l trans.xml > trans.po

3. 用已经翻译过的po和xml原文来产生xml译文


po4a-translate -f guide -m orig.xml -p trans.po -k 1 > trans.xml

文本编辑器

最好的翻译po的工具,无疑是po模式的emacs。当然任何其他的文本编辑器都行,但是效率上绝对比不过po模式的emacs。这里我推荐使用emacs 23。这个版本支持xft。它所需要的keyword是~x86或~amd64。

1. 安装emacs-cvs和gettext

echo app-editors/emacs-cvs >> /etc/portage/package.unmask
echo "app-editors/emacs-cvs gtk xft toolkit-scroll-bars" >> /etc/portage/package.use
echo "sys-devel/gettext emacs" >> /etc/portage/package.use
emerge =emacs-cvs-23.0.0-r1 gettext dejavu

1. 配置字体

* 指定xft为FontBackend,在~/.Xdefaults中加入


Emacs.FontBackend: xft

* 用下列命令启动


emacs --enable-font-backend -fn "Dejavu Sans Mono-12"

1. 基本使用

* 用emacs 打开po文件,即自动进入po模式。菜单栏里有一个名叫PO的菜单,里面有当前模式下可以使用的所有快捷键。po模式下不可直接编辑文件内容。可先把光标移到要编辑的msgid上。使用po的快捷键(比如f或u)来移动,移动的单位就是msgid,速度很快。移动到目的地,然后按回车,即可翻译该msgid。这时整个窗口一分为二。上面可显示msgid,下面翻译。在翻译区域进行翻译时,操作方式就和普通模式下的emacs一样。也就是说你可以把它当作Windows记事本来用。唯一不同的是,在结束翻译后,要按住Ctrl,然后按两次c,以保存这一条翻译结果。然后再按f或u来处理fuzzy的和未翻译的msgid。注意在翻译完fuzzy的msgid后要按tab,来删除fuzzy标记。当不管按f还是u,光标都不再移动的时候,就表示整个po翻译完了。
* 常用快捷键:
。n 移动到下一个msgid
。p 移动到上一个msgid
。f 移动到下一个fuzzy msgid
。F 移动到上一个fuzzy msgid
。u 移动到下一个未翻译msgid
。U 移动到上一个未翻译msgid
。tab 删除本msgid的fuzzy标记

推荐翻译模式
翻译全新的文件

假设这个文件叫orig.xml,下同

* po4a-gettextize -f guide -m orig.xml > output.po
* 用文本编辑器翻译output.po
* po4a-translate -f guide -m orig.xml -p output.po -k 1 > trans.xml

利用旧版的已翻译文件翻译新文件

假设旧版文件叫old.xml,旧版已翻译文件叫old-trans.xml,新文件叫new.xml

* po4a-gettextize -f guide -m old.xml -l old-trans.xml > old-trans.po
* po4a-gettextize -f guide -m new.xml > new.po
* msgmerge old-trans.po new.po > new-trans.po
* 用文本编辑器翻译news-trans.po
* po4a-translate -f guide -m new.xml -p new-trans.po -k 1 > new-trans.xml

3/06/2007

天气恶劣,这个月注定痛苦,好好照顾自己啦

接连几天刮风,气温骤降,何时才能彻底摆脱病魔?
3.3 上周六早上出去下着小雨,气温也比较低了,但心里挺高兴的,北京终于又下雨了啊!丝毫没有意识到病魔已经向我靠近。晚上回去时,天气更糟糕,刮大风,雨也下的急,好不容易到宿舍了,但身体也终于顶不住了 --- 感冒了! 感冒?这算得了什么?我也这么想得。明天还有事情,要过去帮忙,于是早些睡觉吧(也是11点多了)。虽然之前看了天气预报,说晚上会下雪呢,但早上起来看到窗外的积雪,天空中飘着雪花,很是兴奋,对还在睡觉的哥哥大声说:“下雪了,白茫茫一片......” 意识到自己的感冒不仅没好,反而喉咙开始不舒服了,洗漱完毕后吃了点消炎药,拿着咽喉含片,打着雨伞就出门了,外面好冷啊!风似乎刮得比昨晚更加猛烈了,看到路上有的指示牌被吹倒在地上,而我手里打着的伞已经不是为了遮雪而是纯粹为了挡风了......等我到了她那边以后,已经被冻的鼻涕直流,而这时的我并没有太在意。看她已经忙起来了,于是我尽量找一些小活干,比如削土豆之类的。她的同事路路续续来了,于是开始吃吃喝喝聊聊......
吃完饭商定去麦乐迪K歌,于是乘车1个小时赶往魏公村。事后我想如果我不去的话就没现在这么难受了。K歌完后一起聚餐,然后各自回家。到家后我就快崩溃了,吃了退烧药就躺在床上。一晚上没睡好,出了好多汗。好在第二天醒来感觉好多了,头不烫了,但是喉咙疼痛却更加严重了,声音也变了,于是又吃了消炎药,并带上一盒急急忙忙就出门上班去了。怎么还是这么大的风啊!本来我感觉好点了,但还是比较虚弱,经这大风再一刮,唉,到公司的时候又开始难受了。中午一点胃口都没有,但想想身体这么弱还是吃点东西为好,于是到超市买了点面包和一杯酸奶,午饭算是打发掉了。下班了,好难受,肚子感觉空空的,但就是没胃口,另外脑袋也有点痛,喉咙依旧,还流鼻涕(幸亏随着带着纸巾),公交车上人挤人,当时真想躺在前面那人的后背上,或者靠在后面人的身上......
下车后先去附近的药店买了盒感冒药(宿舍已经没有合适的药了),到宿舍后,哥没在,于是我把那盒在火车上没吃的方便面煮煮吃了。那感冒药效果还不错,睡了一觉,今天起床感觉喉咙好多了。出门才知道可外面的风丝毫没有减弱 :(
在公交车上面头晕乎乎的,想吐......再一次感受到自己身体的虚弱!
到中午了,觉得眼睛非常难受,很奇怪,于是到卫生间的镜子前一看,乖乖,双眼布满了血丝!感冒才稍微好点呢,怎么又.......我无语了。


从百度知道查的:
眼睛过度疲劳或感染,血管还会破裂,造成出血。

.睡眠充足有助于滋润眼睛,减少眼睛的血丝
.以冷毛巾敷眼部,可收缩血管,滋润眼睛

3/05/2007

gentoo on ibm T42<参考>

/etc/make.conf :
CFLAGS="-O2 -march=i686 -pipe"
CHOST="i686-pc-linux-gnu"
CXXFLAGS="${CFLAGS}"
DISTCC_HOSTS="localhost "
FEATURES="distcc"
LDFLAGS="-Wl,-O2"
MAKEOPTS="-j2"
SYNC="rsync://rsync.asia.gentoo.org/gentoo-portage"
GENTOO_MIRRORS="ftp://ftp.kaist.ac.kr/gentoo/ http://gentoo.mirrors.easynews.com/linux/gentoo/ http://ftp.kaist.ac.kr/pub/gentoo/"

===============================
配置 hdparm 可以让你安装快 1.5 倍
/etc/conf.d/hdparm :
disc0_args="-d1 -X66"
cdrom0_args="-d1"

加入服务 :
rc-update add hdparm default
使得开机后自动启动 :
/etc/init.d/hdparm start

===============================
Kernel config:
比较特別的设定
Code maturity level options :
[*] Prompt for development and/or incomplete code/drivers

(Pentium-4) Processor family
<*> /dev/cpu/microcode - Intel IA32 CPU microcode support
[ ] Math emulation // 去掉
[*] MTRR (Memory Type Range Register) support
[ ] Symmetric multi-processing support // 这个一定要去掉
[*] Local APIC support on uniprocessors
[*] IO-APIC support on uniprocessors

[*] Power Management support
<*> Advanced Power Management BIOS support
[*] Allow interrupts during APM BIOS calls // IBM thinkpad 要用
[*] ACPI Support
<*> AC Adapter
<*> Battery

<*> IEEE 1394 (FireWire) support (EXPERIMENTAL)
<*> Texas Instruments PCILynx support
<*> OHCI-1394 support

Network device support --->
<*> EtherExpressPro/100 support (eepro100, original Becker driver
Input core support ---> 全选

Character devices ---> I2C 要选,不然 IEEE 1394 不能 work
<*> I2C support
<*> I2C bit-banging interfaces
<*> I2C device interface
<*> I2C /proc interface (required for hardware sensors)

[ ] Unix98 PTY support // 去掉

<*> Mouse Support (not serial and bus mice)
[*] PS/2 mouse (aka "auxiliary device") support

File systems ---> // 看你用了那个
<*> Ext3 journalling file system support
< > NTFS file system support (read only)
[*] /proc file system support
[*] /dev file system support (EXPERIMENTAL)
[*] Automatically mount at boot
<*> Second extended fs support
/pty98 不可以選

Sound card support // sound 我只选这个,其他的我用 alsa

USB support --->
<*> Support for USB
[*] Preliminary USB device filesystem
<*> EHCI HCD (USB 2.0) support (EXPERIMENTAL)
<*> UHCI Alternate Driver (JE) support
<*> OHCI (Compaq, iMacs, OPTi, SiS, ALi, ...) support
<*> USB Human Interface Device (full HID) support
[*] HID input layer support

bluetooth // up to you

save config 之後
make dep bzImage modules modules_install

===============================
env ALSA_CARD="intel8x0" emerge alsa-driver

在 make alsa_driver 的同時,你可以把 boot loader 裝好
cd /usr/src/linux
cp System.map /boot
cp arch/i386/boot/bzImage /boot

===============================
http://www.gentoo.org/
http://www.linux-laptop.net/
http://furius.ca/techdoc/misc/thinkpad.html (T42)
http://www.y3m.net/docs/gentoo-on-t42/

转载自bashcurescancer.com: 10 Linux commands you've never used

http://bashcurescancer.com/10-linux-commands-youve-never-used.html

1. pgrep:比如,你可以使用 pgrep -u root 来代替 ps -ef | egrep '^root ' | awk '{print $2}',以便抓取属于 root 的 PID。
2. pstree:我觉得这个命令很酷,它可以直接列出进程树,或者换句话说是按照树状结构来列出进程。
3. bc:这个命令在我的系统中没有找到,可能需要安装。这是用来执行计算的一个命令,如使用它来开平方根。
4. split:这是一个很有用的命令,它可以将一个大文件分割成几个小的部分。比如:split -b 2m largefile LF_ 会将 largefile 分割成带有 LF 文件名前缀且大小为 2 MB 的小文件。
5. nl:能够显示行号的命令。在阅读脚本或代码时,这个命令应该非常有用。如:nl wireless.h | head。
6. mkfifo:作者说这是他最喜欢的命令。该命令使得其他命令能够通过一个命名的管道进行通信。嗯,听起来有点空洞。举例说明,先创建一个管道并写入内容:

mkfifo ive-been-piped
ls -al split/* | head > ive-been-piped

然后就可以读取了:head ive-been-piped。
7. ldd:其作用是输出指定文件依赖的动态链接库。比如,通过 ldd /usr/java/jre1.5.0_11/bin/java 可以了解哪些线程库链接到了 java 依赖(动态链接)了哪些库。(感谢 NetSnail 的指正。)
8. col:可以将 man 手册页保存为无格式的文本文件。如:

PAGER=cat
man less | col -b > less.txt
9. xmlwf:能够检测 XML 文档是否良好。比如:

curl -s 'http://bashcurescancer.com' > bcc.html
xmlwf bcc.html
perl -i -pe 's@
@
@g' bcc.html
xmlwf bcc.html
bcc.html:104:2: mismatched tag
10. lsof:列出打开的文件。如:通过 lsof | grep TCP 可以找到打开的端口。

3/02/2007

在 panoramio 分享照片

我的照片地址

panoramio 界面简单,使用方便,速度也不错,另外与 Google Earth 结合......

3/01/2007

MoinMoin 升级

MoinMoin 新版本 1.5.7 发布有段时间了,现在考虑对公司原系统升级

以下供参考,等成功升级后再来补充
首先备份好/usr/lib/python2.3/site- packages/MoinMoin目录和/usr/share/moin目录。接着删除这两个目录和实例目录下的underlay目录,安装新版本的 moinmoin系统。最后把/usr/share/moin/underlay目录拷贝到实例目录,修改该目录的访问权限。升级完成要重启服务器。注意,如果你修改了/usr/lib/python2.3/site-packages/MoinMoin目录和/usr/share/moin目录下文件的内容,升级完成后要重新修改或用旧文件覆盖。

MoinMoin里叫Plugin,有Macro(宏)、Parser(解析器)、Action(操作)、Formatter(格式化工具)、Theme(主题)等,系统级的插件存放在/usr/lib/python2.3/site-packages/MoinMoin/目录下,用户级的插件存放在实例的data/plugin目录下。
http://moinmoin.wikiwikiweb.de/ParserMarket
http://moinmoin.wikiwikiweb.de/ActionMarket#head-f6975b5db3bf67065adf993a440bbaaac3768d04
http://moinmoin.wikiwikiweb.de/MacroMarket

2/08/2007

mutt + fetchmail + msmtp + procmail

1)下载安装 msmtp,fetchmail,mutt
http://www.mutt.org/download.html
http://fetchmail.berlios.de/
http://msmtp.sourceforge.net/

2)配置
搞了大半天,终于收发信正常了。参考以下操作:
mkdir ~/Mail
mkdir -p ~/Mail/inbox

touch .msmtprc
chmod 600 .msmtprc

touch .fetchmailrc
chmod 600 .fetchmailrc

另外还需要 .muttrc、.procmailrc、.signature,我已打包 :P

2/07/2007

Laugh along with GNU

http://www.gnu.org/fun/

This is a web page designed to provide some laughs to the working hackers.
It contains software, documentation, music, poems, etc. submitted by GNU users and collected by GNU contributers over the years.

2/05/2007

整合 GtkFB + xfce4 desktop + scim IME

这是最近的工作任务,需要在 GTKFB 下运行 xfce4 桌面系统,最好想办法让 scim 中文输入法也能使用。
主要参考
http://www.directfb.org/wiki/index.php/Projects:GTK_on_DirectFB
http://www.directfb.org/wiki/index.php/Xfce4_panel_on_DFB

现在还没开始编译,国外网站下载速度太慢了 :(
GtkFB
自从 Qt 推出了 Embedded 版本之后,虽然 GTK+ 并非商业公司所发展,但也加紧脚步推出了 GtkFB 项目,这个项目的宗旨当然也是要替 Embedded 系統提出一套基于 GTK+ 的 GUI 解决方案。

与 Qt / Embedded 类似的作法,GtkFB 也跳过 X 层直接与 FrameBuffer 沟通,因此也具有 Qt / Embedded 的一些优点,不过毕竟不是商业软件,发展的速度上较为缓慢。
特色
o 不需 X Server 直接与 FrameBuffer 交互
o API 与 Desktop 版相容。
o 采用 LGPL 授权方式
o 体积小

2007-1-30 下午4:19 <以后慢慢补充>

==================
有一定进展了!

在我们的系统上面编译最终都通过了,但比较麻烦,可以在终端下面运行 vte 等。现在决定在 debian 下面重新编译 GTK-DFB。

今天编译 2.6.19 的内核,为了以后编译 GTK-DFB,切记需要打开 framebuffer(选择 Y 即 built in)。我开始选择了 M,启动参数加 vga=788,console 打不开。

2/01/2007

从硬盘ISO安装linux

1.mount -t iso9660 -o loop BabyRC3-i386-disc.iso /misc/

cp /misc/isolinux/initrd.img /boot/
cp /misc/isolinux/vmlinuz /boot/

2.修改/etc/grub.conf
title Co_Create RC3 9-22
root (hd0,5)
kernel /boot/vmlinuz-2.6.15-23-386 root=/dev/hda6 ro quiet splash
initrd /boot/initrd.img-2.6.15-23-386
savedefault
boot

修改为:
title Co_Create RC3 9-22
root (hd0,5)
kernel /boot/vmlinuz
initrd /boot/initrd.img
3.reboot,选择iso所在的位置,安装前确认不安装引导信息到mbr

1/29/2007

网页中添加三层菜单

gf 的项目中需要用到三层菜单,总结如下:

Renders a Javascript Menu based on the excellent JSCookMenu by Heng Yuan(http://www.cs.ucla.edu/~heng/JSCookMenu), the nested NavigationMenuItem(s) are rendered as Javascript Menu.

If you want to use jscookMenu in your application, you will have to:
* Add jscookmenu directory containing css and scripting code to your web directory (you can find it in the examples application).
* Add scripts and stylesheets for the theme you would like to use to html-header (see also inc/header.inc in the examples application)
* Put the tomahawk.jar in your WEB-INF/lib directory (or in the classpath of your application server.)
* Add the following to your JSP page in order to use one of the MyFaces custom components:
<%@ taglib uri="http://myfaces.apache.org/tomahawk" prefix="t" %>

Well,the syntax of jscookMenu is as follows:

<t:jscookMenu [ user-role-support-attributes ]
[layout="values {hbr, hbl, hur, hul, vbr, vbl, vur, vul}"]
[theme="values {ThemeIE, ThemeMiniBlack, ThemeOffice, ThemePanel}"]
Nested <t:navigationMenuItem> or <t:navigationMenuItems> tags (menu items)
</t:jscookMenu>



不同的 theme (效果)可以到这里查看 http://jscook.yuanheng.org/JSCookMenu/ThemeMiniBlack.html

例子:
The code in my menu.jsp is as follows:

<%@ taglib uri="http://myfaces.apache.org/extensions" prefix="x"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>

<x:jscookMenu layout="vbr" theme="ThemeECCGroup" rendered="#{MenuBean.hasMenu}">
<x:navigationMenuItems value="#{MenuBean.menu}" />
</x:jscookMenu>


The code in my backing bean is as follows: (this will eventually be generated from the database)

/**
* Package that this class belongs to.
*/
package uk.co.eccgroup.controller.action;

import java.util.ArrayList;
import java.util.List;

import javax.faces.context.FacesContext;

import org.apache.myfaces.custom.navmenu.NavigationMenuItem;
import org.apache.log4j.Logger;

/**
* MenuBean backing bean for application menus
*/
public class MenuBean
{
private static final Logger logger = Logger.getLogger(MenuBean.class);

public List<NavigationMenuItem> getContextMenu()
{
//Get view id
String viewId = FacesContext.getCurrentInstance().getViewRoot().getViewId();
logger.debug("view id: " + viewId);

//Menu
List<NavigationMenuItem> contextMenu = null;

if(viewId.equals("/home.jsp"))
{
//Context Menu
contextMenu = new ArrayList<NavigationMenuItem>();
contextMenu.add(new NavigationMenuItem("Application Development", "nav_services_applicationdevelopment", null, false));
contextMenu.add(new NavigationMenuItem("Consultancy Services", "nav_services_consultancy", null, false));
contextMenu.add(new NavigationMenuItem("Recruitment Services", "nav_services_recruitment", null, false));
contextMenu.add(new NavigationMenuItem("Contact Us", "nav_contact", null, false));
}

if(
viewId.equals("/applicationdevelopment.jsp")
|| viewId.equals("/recruitment.jsp")
)
{
contextMenu = new ArrayList<NavigationMenuItem>();
contextMenu.add(new NavigationMenuItem("Price Guide", "nav_price", null, false));
contextMenu.add(new NavigationMenuItem("Contact Us", "nav_contact", null, false));
}

if(viewId.equals("/consultancy.jsp"))
{
contextMenu = new ArrayList<NavigationMenuItem>();
contextMenu.add(new NavigationMenuItem("Our Consultants", "nav_consultants", null, false));
contextMenu.add(new NavigationMenuItem("Price Guide", "nav_price", null, false));
contextMenu.add(new NavigationMenuItem("Contact Us", "nav_contact", null, false));
}

//Return menu
return contextMenu;
}

public boolean getHasContextMenu()
{
boolean hasMenu = false;

List<NavigationMenuItem> contextMenu = getContextMenu();

if(contextMenu != null)
hasMenu = true;

return hasMenu;
}

public boolean getHasMenu()
{
return true;
}

public List<NavigationMenuItem> getMenu()
{
//Main Menu
List<NavigationMenuItem> menu = new ArrayList<NavigationMenuItem>();
menu.add(new NavigationMenuItem("Home", "nav_home", null, false));
menu.add(new NavigationMenuItem("Our Consultants", "nav_consultants", null, false));
menu.add(new NavigationMenuItem("Services", "nav_services", null, false));
//menu.add(new NavigationMenuItem("Documents", "nav_documents", null, false));
menu.add(new NavigationMenuItem("Price Guide", "nav_price", null, false));
//menu.add(new NavigationMenuItem("Web Log", "nav_weblog", null, false));
menu.add(new NavigationMenuItem("Contact Us", "nav_contact", null, false));

//Services Sub Menu
List<NavigationMenuItem> services = new ArrayList<NavigationMenuItem>();
services.add(new NavigationMenuItem("Application Development", "nav_services_applicationdevelopment", null, false));
services.add(new NavigationMenuItem("Consultancy", "nav_services_consultancy", null, false));
services.add(new NavigationMenuItem("Recruitment Services", "nav_services_recruitment", null, false));

//Documents Sub Menu
List<NavigationMenuItem> documents = new ArrayList<NavigationMenuItem>();
documents.add(new NavigationMenuItem("AJAX", "nav_documents_ajax", null, false));
documents.add(new NavigationMenuItem("EJB", "nav_documents_ejb", null, false));
documents.add(new NavigationMenuItem("Hibernate", "nav_documents_hibernate", null, false));
documents.add(new NavigationMenuItem("JBoss", "nav_documents_jboss", null, false));
documents.add(new NavigationMenuItem("JSF", "nav_documents_jsf", null, false));

//Add services to main menu
NavigationMenuItem[] servicesArray = services.toArray(new NavigationMenuItem[0]);
menu.get(2).setNavigationMenuItems(servicesArray);

//Add documents to main menu
NavigationMenuItem[] documentsArray = documents.toArray(new NavigationMenuItem[0]);
//menu.get(3).setNavigationMenuItems(documentsArray);

//Return menu
return menu;
}

public void setContextMenu(List<NavigationMenuItem> contextMenu)
{
//Do nothing
}

public void setHasContextMenu(boolean hasContextMenu)
{
//Do nothing
}

public void setHasMenu(boolean hasMenu)
{
//Do nothing
}

public void setMenu(List<NavigationMenuItem> menu)
{
//Do nothing
}
}

1/24/2007

debian 下安装中文字体及 startx 问题

1) debian 下安装中文字体
apt-get install ttf-arphic-bkai00mp ttf-arphic-bsmi00lp ttf-arphic-gbsn00lp ttf-arphic-gbsn00lp
在/etc/apt/sources.list中加上:
deb ftp://debian.linux.org.tw/pub/apt unstable main
deb http://apt.debian.org.tw/ unstable main
然后运行apt-get updateapt-get install ttf-arphic-newsung xfonts-wqy
这样就安装好了Firefly和文泉驿字体了
dpkg-reconfigure fontconfig 进行配置

2) startx 启动报错
我執行dpkg-reconfigure xserver-xfree86 (或dpkg-reconfigure xserver-xorg,根据你安装的xserver)后驱动, 再把Bus ID改成PCI:0:12:0後, 就可以了。 (dpkp-reconfigure xserver-xfree86BUSID输入PCI:01:0:00)

唐僧的家书(转载)

唐僧的家书
亲爱的悟空,我这封信写的很慢,因为知道你看字不快。我们已经搬家了,不过地址没改,因为搬家的时候把门牌带来了。这礼拜下两次雨,第一次下3天,第二次下4天。昨天我们去买比撒,店员问我要切成8片还是12片,我说8片就成了,12片吃不完。我给你寄去件外套,怕邮寄时超重,把扣子剪下来放口袋里了。嫦娥生了,因为不知道是男是女,所以不知道你是该当舅舅还是阿姨。最后告诉你本来想给你寄钱。可是信封已经封上了…… 元旦快到了,别忘了给孩子们讲讲很久很久很久以前的事:那时候天还是蓝的,水也是绿的,庄稼是长在地里的,猪肉是可以放心吃的,耗子还是怕猫的,法庭是讲理的,结婚是先谈恋爱的,理发店是只管理发的,药是可以治病的,医生是救死扶伤的,拍电影是不需要陪导演睡觉的,照相是要穿衣服的,欠钱是要还的,孩子的爸爸是明确的,学校是不图挣钱的,白痴是不能当教授的,卖狗肉是不能挂羊头的,结婚了是不能泡MM的,买东西是要付钱的

1/19/2007

今天晚上要看的

java help
http://www.ibm.com/developerworks/cn/java/j-javahelp2/

1/11/2007

以后要多做算法题

http://acm.zju.edu.cn/

加油~

电脑族的健康菜单

电脑族的健康菜单

  每天至少8小时与电脑为伍吗?你经常熬夜,并用“垃圾食物”果腹吗?你有眼睛疲劳、腰酸背痛等等症状吗?如果答案肯定,那么你就应该特别关注了。及时补充营养,调整饮食菜单。其中健脑、护眼、补钙这三大方面是最关键的。

  健脑元素
 
  脂肪类:代表性食物有坚果、芝麻、自然状态下饲养的动物等。
  蛋白质:代表性食物有瘦肉、鸡蛋、鱼类等。
  碳水化合物:代表性食物有杂粮、糙米、红糖、糕点等。
  维生素C:代表性食物有鲜果类、黄绿色蔬菜等。

  B族维生素
包括维生素B1、维生素B2、叶酸等,代表性食物有香菇、野菜等。坚果含有大量的蛋白质、不饱和脂肪酸、卵磷脂、无机盐和维生素,经常食用,对改善脑营养供给很有益处。

  香菇、鸡蛋、鱼类、黄花菜、洋葱、小米、龙眼、柚子

  护眼元素

  维生素A和β-胡萝卜素有助于补肝明目,缓解眼睛疲劳。维生素A主要存在于各种动物的肝脏、鱼肝油、蛋黄中。植物性食物只能提供维生素A原。β-胡萝卜素主要存在于胡萝卜、西红柿、波菜、韭菜、杏、红薯等绿黄色蔬果中。

  维生素C、胡萝卜、菠菜、西红柿、韭菜、枸杞子、青椒、杏、枣

  钙的重要性

  钙是人体生命活动的调节剂,是人体生命之源。在维持人体循环、呼吸、神经、内分泌、消化、血液、肌肉、骨骼、泌尿、免疫等各系统正常生理功能中起重要调节作用。人体没有任何系统的功能于钙无关,钙代谢平衡对于维持生命和健康起到至关重要的作用。

  牛奶、海米、油菜、黑芝麻、黄豆、西兰花、芹菜、紫菜。

1/08/2007

自己的服务器

最近想把闲置的机器利用起来,做成 ftp、web 等功能的服务器,首先需要解决不少问题呢,先记下来:
1. 分区
2. ssh,ftp 权限控制
3. ADSL
4. 防火墙
...


解决方案:

1. 分区
硬盘80G,内存512M
/boot 128M
/var 50G 尽量分配大一
/ 20G
swap 1G 内存的两倍

2. ssh,ftp 权限控制


3. ADSL 拨号

4. 防火墙

5. 代理 Squid

6. 网络结构