2009年3月20日星期五

Unix常用监控和管理命令

ps:查看系统中的进程,Linux中可以使用ps -aux查看所有进程
参数w表示加宽显示的命令行,参数w可以写多次,通常最多写3次,表示加宽3次,这足以显示很长的命令行了。
例如:ps -auxwww

top:显示系统内存、cpu使用情况,并可自动刷新进程列表

vmstat:显示当前的内存使用情况

netstat:显示网络状况,使用参数p可以查看对应的进程号及程序名,
通常使用参数a(显示所有连接情况)和n(不反查域名和服务名),
例如:netstat -anp

查看服务器侦听情况,使用:
netstat -an | grep LISTEN

查看服务器已建立的连接,使用:
netstat -an | grep ESTABLISHED

ifconfig:查看(或设置)网络设备信息
ifconfig -a:查看所有网络设置信息

last:显示登录到服务器的情况以及服务器重启情况

df:显示硬盘空间及使用情况,Linux下可以带参数h,显示结果更人性化。例如:
df -h 硬盘空间按人性化显示
df -k 硬盘空间按KB显示
df -m 硬盘空间按MB显示

w:显示登录到服务器上的用户列表

以下几个命令仅针对Linux

lsof:显示当前打开的文件列表,包括建立的socket连接等。本命令可以用于程序员检查编写的程序打开的文件数。

sysctl:显示(或设置)系统内核参数
sysctl -a 显示所有内核参数
sysctl -w 参数名=参数值
例如:sysctl -w fs.file-max=10240 设置系统允许同时打开的最大文件数为10240。

内核参数fs.file-nr包括三个参数值,第一个参数表示系统中曾经同时打开过的文件数峰值,
第二个参数表示空闲(分配后已释放)的文件数,
第三个参数表示可以打开的最大文件数,其值等于fs.file-max。

当前打开的文件数 = 第一个参数值 - 第二个参数值

例如:
fs.file-nr = 977 223 10240
当前打开的文件数 = 977 - 233 = 744

设置内核参数时务必小心,如果设置不当会导致系统异常,甚至当机。

ulimit:显示(或设置)用户可以使用的资源限制

ulimit -a 显示用户可以使用的资源限制

ulimit unlimited
不限制用户可以使用的资源,但本设置对可打开的最大文件数(max open files)
和可同时运行的最大进程数(max user processes)无效

ulimit -n <可以同时打开的文件数> 设置用户可以同时打开的最大文件数(max
open files)
例如:ulimit -n 8192
如果本参数设置过小,对于并发访问量大的网站,可能会出现too many open
files的错误

ulimit -u <可以运行的最大并发进程数>
设置用户可以同时运行的最大进程数(max user processes)
例如:ulimit -u 1024

Ubuntu 系统下自启动选项的设置方法

这里说明,Ubuntu 中系统没有了RH系统中的 chkconfig 命令 !

可用一些小工具来管理 Ubuntu 的启动选项:
小工具 rcconf:
#sudo apt-get rcconf
#sudo apt-get install rcconf
root 下运行: #sudo rcconf
功能更全的工具:sysv-rc-conf
#sudo apt-get update
#sudo apt-get install sysv-rc-conf
运行:#sudo sysv-rc-conf
也可以直接加入启动程序,例如把 /etc/init.d/red5 加入到系统自动启动列表中:
#sudo sysv-rc-conf red5 on
其他使用方法见: google::Ubuntu::sysv-rc-conf 命令用法

也可以直接修改
直接改 /etc/rc0.d ~ /etc/rc6.d 和 /etc/rcS.d
下的东西,S开头的表示启动,K开头的表示不启动,
例如:想关闭 Red5 的开机自动启动,只需 #sudo mv /etc/rc2.d/S20red5
/etc/rc2.d/K20red5 就可以了。

Ubuntu自动启动程序

首先,linux随机启动的服务程序都在/etc/init.d这个文件夹里,里面的文件全部都是脚本文件(脚本程序简单的说就是把要运行的程序写
到一个
文件里让系统能够按顺序执行,类似windows下的autorun.dat文件),另外在/etc这个文件夹里还有诸如名为rc1.d,
rc2.d一直到rc6.d的文件夹,这些都是linux不同的runlevel,我们一般进入的X
windows多用户的运行级别是第5级,也就是rc5.d,在这个文件夹下的脚本文件就是运行第5级时要随机启动的服务程序。需要注意的是,在每个rc
(1-6).d文件夹下的文件其实都是/etc/init.d文件夹下的文件的一个软连接(类似windows中的快捷方式),也就是说,在
/etc/init.d文件夹下是全部的服务程序,而每个rc(1-6).d只链接它自己启动需要的相应的服务程序!

要启动scim
(某一程序),我们首先要知道scim程序在哪里,用locate命令可以找到,scim在/usr/bin/scim这里,其中usr表
示是
属于用户的,bin在linux里表示可以执行的程序。这样,我就可以编写一个脚本程序,把它放到/etc/init.d里,然后在rc5.d里做一个相
应的软链接就可以了。

这个脚本其实很简单,就两行:

#!/bin/bash

/usr/bin/scim

第一行是声明用什么终端运行这个脚本,第二行就是要运行的命令。

还
需要注意的一点是,在rc5.d里,每个链接的名字都是以S或者K开头的,S开头的表示是系统启动是要随机启动的,K开头的是不随机启动的。这
样,你就可以知道,如果我要哪个服务随机启动,就把它名字第一个字母K改成S就可以了,当然,把S改成K后,这个服务就不能随机启动了。因此,我这个链接
还要起名为SXXX,这样系统才能让它随机启动。
在RH下,rc.local是默认启动的最后一个脚本文件,所以,
如果你想要随机启动,还有一种方法就是在rc.local的尾部加入/usr/bin/scim,这样就可以了。

Linux 自动启动程序

1.开机启动时自动运行程序

Linux加载后, 它将初始化硬件和设备驱动,
然后运行第一个进程init。init根据配置文件继续引导过程,启动其它进程。通常情况下,修改放置在
/etc/rc或 /etc/rc.d 或 /etc/rc?.d
目录下的脚本文件,可以使init自动启动其它程序。例如:编辑
/etc/rc.d/rc.local
文件(该文件通常是系统最后启动的脚本),在文件最末加上一行"xinit"或"startx",可以在开机启动后直接进入X-Window。

2.登录时自动运行程序

用户登录时,bash首先自动执行系统管理员建立的全局登录script
:/ect/profile。然后bash在用户起始目录下按顺序查找三个特殊文件中的一个:/.bash_profile、/.bash_login、
/.profile,但只执行最先找到的一个。
因此,只需根据实际需要在上述文件中加入命令就可以实现用户登录时自动运行某些程序(类似于DOS下的Autoexec.bat)。

3.退出登录时自动运行程序

退出登录时,bash自动执行个人的退出登录脚本/.bash_logout。例如,在/.bash_logout中加入命令"tar
-cvzf c.source.tgz *.c",则在每次退出登录时自动执行 "tar" 命令备份 *.c
文件。

4.定期自动运行程序

Linux有一个称为crond的守护程序,主要功能是周期性地检查
/var/spool/cron目录下的一组命令文件的内容,并在设定的时间执行这些文件中的命令。用户可以通过crontab
命令来建立、修改、删除这些命令文件。

例如,建立文件crondFile,内容为"00 9 23 Jan *
HappyBirthday",运行"crontab
cronFile"命令后,每当元月23日上午9:00系统自动执行"HappyBirthday"的程序("*"表示不管当天是星期几)。

5.定时自动运行程序一次

定时执行命令at 与crond
类似(但它只执行一次):命令在给定的时间执行,但不自动重复。at命令的一般格式为:at
[ -f file ] time
,在指定的时间执行file文件中所给出的所有命令。也可直接从键盘输入命令:

$ at 12:00
at>mailto Roger -s ″Have a lunch″ < plan.txt
at>Ctr-D
Job 1 at 2000-11-09 12:00
2000-11-09 12:00时候自动发一标题为"Have a
lunch",内容为plan.txt文件内容的邮件给Roger。?9 12:00
2000-11-09 12:00时候自动发一标题为"Have a
lunch",内容为plan.txt文件内容的邮件给Roger。er。ger。er。

Ubuntu 开机自动挂载windows分区

要挂载NTFS格式分区,需要NTFS-3g这个软件。它短小精悍,而且功能强大。
NTFS-3g是一个开源软件,它支持在Windows下面读写NTFS格式的分区。它非常的快速,同时也很安全。它支持Windows
2000、XP和2003,并且支持所有的符合POSIX标准的磁盘操作。

首先要编辑sources.list
#sudo gedit /etc/apt/sources.list

Ubuntu Drapper添加:
deb http://givre.cabspace.com/ubuntu/ dapper main main-all
deb http://ntfs-3g.sitesweetsite.info/ubuntu/ dapper main main-all
deb http://flomertens.keo.in/ubuntu/ dapper main main-all

Ubuntu Edgy添加:
deb http://givre.cabspace.com/ubuntu/ edgy main
deb http://ntfs-3g.sitesweetsite.info/ubuntu/ edgy main
deb http://flomertens.keo.in/ubuntu/ edgy main

同时必须导入GPG-Key,可以这样:
#wget http://flomertens.keo.in/ubuntu/givre_key.asc -O- | sudo apt-key add
-
#wget http://givre.cabspace.com/ubuntu/givre_key.asc -O- | sudo apt-key
add -

现在更新一下源:
#sudo aptitude update

正式安装

在"终端"下面运行:
#sudo apt-get install ntfs-3g

配置NTFS-3g

首先看一些硬盘分区的分区类型
#sudo fdisk -l

现在就可以修改
/etc/fstab,来让Ubuntu启动的时候自动挂载NTFS分区了。但是首先请备份一下这个文件:
#sudo cp /etc/fstab /etc/fstab.bak

建立挂载点,譬如挂载在 /media/windows 下面
#sudo mkdir /media/windows

现在可以在 /etc/fstab 的后面添加
/dev/hda1 /media/ ntfs-3g defaults,locale=zh_CN.utf8 0 0
根据自己的情况进行修改。

一些示例

挂载 /dev/hda3
添加 /dev/hda3 /media/windows ntfs-3g ro,locale=zh_CN.utf8,uid=1000 0 0

关于自己的locale

可以用下面的命令查看所有的locale
#locale -a

如果不想重新启动,就可以
#sudo umount -a
#sudo mount -a

最后一个挂载FAT分区的命令
#sudo mount /dev/hda3 /media/windows/ -t vfat -o iocharset=utf8,umask=000

当然可以在/etc/fstab里面添加
/dev/hda3 /media/windows vfat iocharset=utf8,umask=000 0 0

Openfire随着Ubuntu自动启动

openfire缺省情况下,是不随机启动的。为了解决每次都要手工启动的麻烦,我编写了一个脚本,放在/etc/init.d目录里面
#sudo vim /etc/init.d/openfire
内容如下:

#!/bin/sh

openfire_start(){
/etc/openfire/bin/openfire start
}

openfire_stop(){
/etc/openfire/bin/openfire stop
}

case $1 in
start)
openfire_start
;;
stop)
openfrie_stop
;;
*)
echo 'Usage:openfire start|stop'
;;
esac

晶振及其负载电容

什么是负载电容,它对电路上的晶振电容取值有什么影响吗?晶振上接个电阻有什么用?

晶振的负载电容是分别接在晶振的两个脚上和对地的电容,一般在几十皮发。它会影响到晶振的谐振频率和输出幅度,一般订购晶振时候供货方会问你负载电容是多少。晶振上接的一个电阻是反馈作用,使振荡器容易起振。

晶振负载电容取值直接关系到调频的准确度。如果负载电容不够准确,那么买来的晶体准确度就会差,关于负载电容的计算方法即从晶体两端看进去电容的总和。计算公式:
晶振的负载电容=[(Cd*Cg)/(Cd+Cg)]+Cic+△C式中Cd,Cg为分别接在晶振的两个脚上和对地的电容,Cic(集成电路内部电容)+△C(PCB上电容)经验值为3至5pf.

你也许不知道的#define用法: 通过#define连接字符串

最近看com相关的资料,看到CCmdTarget实现com接口的时候,去读了一些宏的定义,在afxdisp.h头文件中

#define BEGIN_INTERFACE_PART(localClass, baseClass) \
class X##localClass : public baseClass \

本来这个宏定义很容易理解的,但是这里多出个X##,我真没见过这种用法,不晓得它是什么用意。
后来问了几个朋友也都不知道。

你知道么?

也许你也不知道~呵呵,最后我还是找到了相关的资料,解读了这个define,还顺便认识了另外两个不常用的define

#define Conn(x,y) x##y
#define ToChar(x) #@x
#define ToString(x) #x

x##y表示什么?表示x连接y,举例说:
int n = Conn(123,456); 结果就是n=123456;
char* str = Conn("asdf", "adf")结果就是 str = "asdfadf";
怎么样,很神奇吧

再来看#@x,其实就是给x加上单引号,结果返回是一个const char。举例说:
char a = ToChar(1);结果就是a='1';
做个越界试验char a = ToChar(123);结果是a='3';
但是如果你的参数超过四个字符,编译器就给给你报错了!error C2015: too many
characters in constant :P

最后看看#x,估计你也明白了,他是给x加双引号
char* str = ToString(123132);就成了str="123132";

最后留几个小试验给大家去测测:
#define Dec(x,y) (x-y)
int n = Dec( A(123,1), 1230);
n = Conn(123, Conn(123,332) );
char* str = A("12", ToString( Dec(3,1));
结果会如何呢? 嘿嘿嘿嘿~


其他一些杂七杂八的东西:
我先定义了一个宏
#define TE text
我想再定义一个宏,能将TE变为字符串("text").
即定义:
#define STR(str) ??? //使用STR(TE)时能替换为"text"。
请问???部分怎么实现呢?用#str是达不到目的的了,用'"'##str##'"'也不对。

#不能做二次替换,可以再定义一个中间宏
#define TE text
#define AD TE
#define STR(AD) #AD
试试

直接定义两个宏得了!
#define TE text
#define TE_S "text"


#define STR abc
char arr[10] = "STR";
为什么arr数组中是STR而不是abc,define不是简单的字符替换吗?

#define A "aaa"
#define B "bbb"A
我对macro这个东西不大熟悉……不过这样可以成功printf("%s\n",B);


在#define中,标准只定义了#和##两种操作。#用来把参数转换成字符串,##则用来连接两个前后两个参数,把它们变成一个字符串。
#include <stdio.h>
#define paster( n ) printf( "token " #n" = %d\n ", token##n )
int main()
{
int token9=10;
paster(9);
return 0;
}
输出为
[leshy@leshy src]$ ./a.out
token 9 = 10

补充一点: 在用#define 定义时 ,可以用斜杠("\") 续行.与vb中的下划线("
_")作用同.
比如:
#define add1( x, y ) ( x + y)
也可以表示成 :
#define add1(x,y) \
(x + y )

3个普通用法
1.
C: #define X 100 ----> C++: const int x=100;

2.
C: #define MAX(a,b) ((a)>(b)?(a):(b))
C++: inline int max(int a,int b){ return a>b?a:b;}

3.
#ifndef NULL
#define NULL ((void*)0)

2009年3月19日星期四

IJG JPEG 函数库:文件列表说明

IJG JPEG 函数库:代码规则

版权 (C) 1991-1996, Thomas G. Lane.
本文是Independent JPEG Group软件中的一部分。
针对于如何分发与使用,请参照随本库一起发放的README 文件。


由于很多程序员将会为完善代码与bug修复中而共同努力,因此,统一编码风格将是很重要的一件事。使用相似的编码风格的目的不在于风格的细枝末节,而在统一的重要性。

一般,我们遵从推荐标准"Recommended C Style and Coding
Standards"(C代码标准和编码风格推荐标准)的6.1版(Cannon等人。由Spencer,
Keppel和Brader修订)。该文档可在IJG
FTP目录中找到(参见jpeg/doc/cstyle.ms.tbl.Z,或者专为没有nroff/tbl
r的使用者提供的cstyle.txt.Z)。

注释块应以下列方式布局:
/*
* Block comments in this style.
*/

我们使用K&R风格来对语句进行缩排,例如,
if (test) {
then-part;
} else {
else-part;
}
每一级缩排使用两个空格。(这种缩排习俗由GNU
Emacs或其他文本编辑器自动完成。)

多个单词组成的名称应该以小写加下划线方式,例如,multi_word_name
(不是multiWordName)。预处理器符号和枚举常量相似,但应使用大写形式(MULTI_WORD_NAME)。在前15个字符之内,名称应该保持唯一。(对一些老系统而言,全局变量名应在6位以内保持唯一。我们在不引起混乱的情况下,通过使用宏来代替较短的名称的方法来解决这个问题。)

我们可在任何地方使用函数原形;我们依赖于自动代码转换来弥补缺少原型的C编译器。转换是通过简单轻便的工具'ansi2knr.c'(蒙Ghostscript的好意)来完成的。ansi2knr并不是很智能化,因此要求在函数声明时要注意格式问题:函数名MUST
BEGIN IN COLUMN 1。因此所有的函数都应该这样写:

LOCAL(int *)
function_name (int a, char *b)
{
code...
}
注:每个函数定义必须以GLOBAL(type), LOCAL(type),或
METHODDEF(type)开头。这些宏适当地扩充了"static type"
或仅仅是"type"。它们为函数的用法提供了一种可读性较好的标识且可为特殊的需求备用。(例如,特殊的链接词可被插入以便Windows
DLLs使用。)

ansi2knr不能转换方法声明(结构体的中的函数声明)。我们用JMETHOD来解决,JMETHOD的定义如下:
#ifdef HAVE_PROTOTYPES
#define JMETHOD(type,methodname,arglist) type (*methodname) arglist
#else
#define JMETHOD(type,methodname,arglist) type (*methodname) ()

JPEG软编解码器介绍

首先介绍几个名词:
IJG:Independent JPEG Group
IJL: Intel JPEG Library
IPP: Intel Integrated Performance Primitives

IJG提供的JPEG软编解码器是使用最广泛的,可以从官方网站www.ijg.org下载最新版本6b。
优点:免费、开源;纯C编写,支持众多硬件平台和操作系统;
缺点:速度一般

IJL是Intel提供的JPEG软编解码器,2001以前IJL是免费的。
你可以编程实现从buffer读取jpeg图像数据然后解码到输出buffer,实现如下:

//read JPEG image from buffer and decompress it and write to output buffer.

JPEG_CORE_PROPERTIES jcprops;

// Initialize the IntelR JPEG Library.
IJLERR jerr = ijlInit(&jcprops);
..
..
// Use the IJL to read data from a buffer or a file.
jerr = ijlRead(&jcprops, iotype);
..
..
// Now get the actual JPEG image data into the pixel buffer.
jerr = ijlRead(&jcprops, IJL_JBUFF_READWHOLEIMAGE);

// Use the IJL to write data into a buffer or a file.
IJLERR ijlWrite (JPEG_CORE_PROPERTIES *jcprops, IJLIOTYPE iotype);

// Clean up the IJL.

但是,2001年以后,IJL就被集成到IPP里面了。注意:IPP是收费的,不提供源码。现在,你要使用IPP来进行JPEG编解码。
首先,你需要安装IPP,然后下载IPP
Sample解压,里面的image-codecs提供了jpeg的编解码例程,其中提供ijp、jpeg-ijl,此处的ijp源码文件中,intel已经加入了IPP的函数,你可以通过修改头文件jconfig.h来决定是否使用调用IPP库进行编译,据intel称:使用IPP后,ijg的性能提高了1.5~2倍。
优点:针对intel CPU优化过,速度很快;
缺点:收费,只针对Intel CPU

AMD开源了它的处理库FrameWave,也有jpeg实现,有空儿也可以研究研究。

漂亮的桌面日历 Rainlendar

linux下面的"事务计划""日记""提醒"三个功能一直没有什么好的软件能给通通实现了,可能有,但我不知道or没找到,我喜欢小巧、简洁、功能强大的如软件。目前的临时之法是:
事务计划:shell脚本实现一个todo功能;
日记:vim写日记;
就是"提醒"功能还差个好点儿趁手的工具。
今天偶尔发现,Rainlendar也有linux版本,太好了,这东东我以前在windows下就百里挑一选中了它,小巧强大绿色免费,用了好几年了,太符合我的要求了。只是不知道它还是跨平台的,也有linux的版本,推荐使用。查看了它的实现,使用lua实现的。

Rainlendar 是一个比较漂亮的桌面日历工具,带事件提醒功能
下载地址http://www.rainlendar.net/

下载解压之后
$tar jxvf Rainlendar-Lite.tar.bz2
就可以运行
$./rainlendar2

默认英文界面,支持中文,如果想用,下载简体中文包Simplified_Chinese.r2lang:
方法:在终端中运行
$./rainlendar2 -i /你下载语言包的路径/Simplified_Chinese.r2lang

最后,重新运行rainlendar2,在界面上右键,Options...
/Language中选择Chinese(Simplified)/OK,
中文界面出现了。


现在,感觉window到linux的转换越来越小了。因为我以前windows下用的东西,linux下照样儿用。比如:
浏览器:opera,连我的配置profile都一样,自定义的快捷键等等,无差异,而且opera
linux更新频率一点儿不慢;
编辑工具:vim,配置也平台通吃;
计划提醒:rainlendar
影音播放:mplayer

换平台,不一致的地方:
邮件:windows下我用becky,小巧强大;可惜无linux版本,试了好几个,都不中意,现在用opera
mail,还行;
文件管理器:windows下用totalcmd,linux下无匹敌工具
下载工具:迅雷无人可比;