May
12

通用排序服务daemon
2008-05-12 1:22 pm 作者:tangfl.openid.35.com

通用排序服务daemon,模型示例。

情景描述:

1. 需要排序的数据以 key=>value 的形式组织
2. 数据随时到达,尽可能的做到实时排序
3. 只需保留 Top n 的数据

典型应用:各种排行榜,搜索排行,点击排行等等

算法细节:

1. 数据使用 udp 包传送 (示例中还没有加上网络操作部分)
2. mmap 内存到文件。daemon 只负责排序部分的工作,输出排序结果由其他程序读取文件完成
3. 使用结构体数组存储 Top n 的已排序部分
4. 新数据到达时,使用插入排序

Todo list:
1. 增加网络接收部分
2. 增加网络输出 daemon
3. 使用链表存储 Top n ,方便插入排序。当需要输出时使用另外一个线程或子进程将链表拷贝到 mmap 内存区
4. 多 domain 测试
5. 支持 name 为字符串的情况,key 为 name 的 hash
6. 增量 value ,需要保存所有的数据,而不是 Top n
7. 配置文件支持


/**
 *  SinaSorter
 *
 *  by tangfulin#126.com
 *
 */

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include 

#define MAXNAMELEN 31
#define MAXDOMAIN  31
#define DEBUG 1

typedef struct {
    unsigned long key;
    unsigned long value;
    //char name[MAXNAMELEN];
} RECORD;

int  sizer = sizeof(RECORD);
int  domainTotal=1;

char domainName[MAXDOMAIN][MAXNAMELEN]={};
int  totalRecord[MAXDOMAIN]={0};

RECORD *head[MAXDOMAIN]={NULL};
RECORD *tail[MAXDOMAIN]={NULL};
int file[MAXDOMAIN]={0};

int init()
{
	FILE *fp;
	RECORD *r;
	int i;

	if(DEBUG) printf("(init)RECORD size:%d\n", sizeof(RECORD));

	domainTotal = 1;

	for (i=0; i
	{
		if(DEBUG) printf("(init)domain:%d\n", i);

		sprintf(domainName[i], "domain_%d.dat", i);
		totalRecord[i] = 200;
		head[i] = NULL;

		if(DEBUG) printf("(init)file:%s\n", domainName[i]);
		if(DEBUG) printf("(init)totalRecord:%d\n", totalRecord[i]);

		//file init
		fp = fopen(domainName[i], "r");

		if (fp == NULL)
		{// file not exist
			if(DEBUG) printf("(init)file dose not exist, creat ... \n");

			r = (RECORD *) calloc(totalRecord[i], sizeof(RECORD));

			fp = fopen(domainName[i], "w+");
			fwrite(r, sizeof(RECORD), totalRecord[i], fp);
			fclose(fp);
			free(r);

		}
		else
		{
			fclose(fp);
		}

		file[i] = open(domainName[i], O_RDWR);
		head[i] = (RECORD *)mmap(0, totalRecord[i] * sizeof(RECORD),
             PROT_READ | PROT_WRITE, MAP_SHARED, file[i], 0);
        close(file[i]);

        tail[i] =  head[i] + totalRecord[i] - 1;

        if(DEBUG) printf("(init)mmap at addr: %x end at: %x\n", (int)head[i], (int)tail[i]);

	}

	return 0;
}

int clear()
{
	int i;
	for (i=0; i
	{
		if (-1 == msync((void *)head[i],  totalRecord[i] * sizeof(RECORD), MS_SYNC))
		{
			fprintf(stderr, "(clear)msync return error with errorno: %d (%s)\n", errno, strerror(errno));
		}
    	if (-1 == munmap((void *)head[i], totalRecord[i] * sizeof(RECORD)))
    	{
    		fprintf(stderr, "(clear)munmap return error with errorno: %d (%s)\n", errno, strerror(errno));
    	}
    	//close(file[i]);
	}
	if(DEBUG) printf("(clear) done ... \n");
	return 0;
}

int getRecord(RECORD* rp)
{
	srand((int) time(NULL));
	rp->key   = random()%1000;
	rp->value = random()%1000;
	return 0;
}

RECORD* findPosition(const int domain, const int value)
{
	RECORD *rp;

	rp = head[domain];

	while(rp->value > value)
	{
		rp += 1;
	}

	return rp;

}

RECORD* findRecord(const int domain, RECORD* const tpos, const int key)
{
	RECORD *rp;

	rp = tpos;
	while (rp < tail[domain])
	{
		if (rp->key == key)
		{
			return rp;
		}
		else
		{
			rp += 1;
		}
	}
	return rp;
}

int insertRecord(int domain, RECORD* rp)
{
	RECORD *fpos, *tpos;
	RECORD *endpos;
	void *to, *from;
	int size;

	endpos = tail[domain];

	if (rp->value < endpos->value)
	{
		if(DEBUG) printf("(insertRecord)value too small: %ld < %ld \n", rp->value, endpos->value);
		return 0;
	}

	// target position for this RECORD
	tpos = findPosition(domain, rp->value);
	// origin position of this key, be totalRecord[i]-1 if not exist
	// search from tpos
	fpos = findRecord(domain, tpos, rp->key);

	if (fpos == tpos)
	{
		if(DEBUG) printf("(insertRecord)fpos equal to tpos: %x \n", (int)fpos);
		tpos->key   = rp->key;
		tpos->value = rp->value;
		return 0;
	}

	if(DEBUG) printf("(insertRecord)target tpos: %x origin fpos: %x (endpos:%x)\n", (int)tpos, (int)fpos, (int)endpos );

	to   = (void *)(tpos+1);
	from = (void *)tpos;
	size = (int)((fpos - tpos)*sizeof(RECORD));

	memmove(to, from, size);

	if(DEBUG) printf("(insertRecord)memmove: from %x to: %x bytes:%d\n", (int)from, (int)to, size);

	tpos->key = rp->key;
	tpos->value = rp->value;

	return 0;

}

int showdomain(int domain)
{
	int j, ret;
	RECORD *rp;

	ret = msync((void *)head[domain], totalRecord[domain] * sizeof(RECORD), MS_SYNC);

	printf("(showdomain)domain:%d\n", domain);
	printf("(showdomain)msync return:%d\n", ret);

	rp = head[domain];

	for(j=0; j
	{
		printf("(showdomain)pos:%d %x key:%ld value:%ld\n", j, (int)rp, rp->key, rp->value);
		rp += 1;
	}

	return 0;

}

int main()
{
	RECORD rec;

	init();
	showdomain(0);

	while(getchar() != EOF )
	{
		getRecord(&rec);

		if(DEBUG) printf("\n(main)get RECORD: %ld %ld\n", rec.key, rec.value);

		insertRecord(0, &rec);
		showdomain(0);

	}

	clear();

    return 0;
}

推荐(0)
收藏
May
07

TCP 相关参数解释
2008-05-07 11:13 am 作者:tangfl.openid.35.com

For Linux 2.6

原文:http://www.cnblogs.com/OnlyXP/archive/2007/09/29/911269.html

tcp_syn_retries :INTEGER
默认值是5
对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是5,对应于180秒左右时间。(对于大负载而物理通信良好的网络而言,这个值偏高,可修改为2.这个值仅仅是针对对外的连接,对进来的连接,是由tcp_retries1 决定的)

tcp_synack_retries :INTEGER
默认值是5
对于远端的连接请求SYN,内核会发送SYN + ACK数据报,以确认收到上一个 SYN连接请求包。这是所谓的三次握手( threeway handshake)机制的第二个步骤。这里决定内核在放弃连接之前所送出的 SYN+ACK 数目。不应该大于255,默认值是5,对应于180秒左右时间。(可以根据上面的tcp_syn_retries来决定这个值)

tcp_keepalive_time :INTEGER
默认值是7200(2小时)
当keepalive打开的情况下,TCP发送keepalive消息的频率。(由于目前网络攻击等因素,造成了利用这个进行的攻击很频繁,曾经也有cu的朋友提到过,说如果2边建立了连接,然后不发送任何数据或者rst/fin消息,那么持续的时间是不是就是2小时,空连接攻击?tcp_keepalive_time就是预防此情形的.我个人在做nat服务的时候的修改值为1800秒)

tcp_keepalive_probes:INTEGER
默认值是9
TCP发送keepalive探测以确定该连接已经断开的次数。(注意:保持连接仅在SO_KEEPALIVE套接字选项被打开是才发送.次数默认不需要修改,当然根据情形也可以适当地缩短此值.设置为5比较合适)

tcp_keepalive_intvl:INTEGER
默认值为75
探测消息发送的频率,乘以tcp_keepalive_probes就得到对于从开始探测以来没有响应的连接杀除的时间。默认值为75秒,也就是没有活动的连接将在大约11分钟以后将被丢弃。(对于普通应用来说,这个值有一些偏大,可以根据需要改小.特别是web类服务器需要改小该值,15是个比较合适的值)

tcp_retries1 :INTEGER
默认值是3
放弃回应一个TCP连接请求前﹐需要进行多少次重试。RFC 规定最低的数值是3﹐这也是默认值﹐根据RTO的值大约在3秒 - 8分钟之间。(注意:这个值同时还决定进入的syn连接)

tcp_retries2 :INTEGER
默认值为15
在丢弃激活(已建立通讯状况)的TCP连接之前﹐需要进行多少次重试。默认值为15,根据RTO的值来决定,相当于13-30分钟(RFC1122规定,必须大于100秒).(这个值根据目前的网络设置,可以适当地改小,我的网络内修改为了5)

tcp_orphan_retries :INTEGER
默认值是7
在近端丢弃TCP连接之前﹐要进行多少次重试。默认值是7个﹐相当于 50秒 - 16分钟﹐视 RTO 而定。如果您的系统是负载很大的web服务器﹐那么也许需要降低该值﹐这类 sockets 可能会耗费大量的资源。另外参的考 tcp_max_orphans 。(事实上做NAT的时候,降低该值也是好处显著的,我本人的网络环境中降低该值为3)

tcp_fin_timeout :INTEGER
默认值是 60
对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间。对方可能会断开连接或一直不结束连接或不可预料的进程死亡。默认值为 60 秒。过去在2.2版本的内核中是 180 秒。您可以设置该值﹐但需要注意﹐如果您的机器为负载很重的web服务器﹐您可能要冒内存被大量无效数据报填满的风险﹐FIN-WAIT-2 sockets 的危险性低于 FIN-WAIT-1 ﹐因为它们最多只吃 1.5K 的内存﹐但是它们存在时间更长。另外参考 tcp_max_orphans。(事实上做NAT的时候,降低该值也是好处显著的,我本人的网络环境中降低该值为30)

tcp_max_tw_buckets :INTEGER
默认值是180000
系统在同时所处理的最大 timewait sockets 数目。如果超过此数的话﹐time-wait socket 会被立即砍除并且显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐千万不要人为的降低这个限制﹐不过﹐如果网络条件需要比默认值更多﹐则可以提高它(或许还要增加内存)。(事实上做NAT的时候最好可以适当地增加该值)

tcp_tw_recycle :BOOLEAN
默认值是0
打开快速 TIME-WAIT sockets 回收。除非得到技术专家的建议或要求﹐请不要随意修改这个值。(做NAT的时候,建议打开它)

tcp_tw_reuse:BOOLEAN
默认值是0
该文件表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接(这个对快速重启动某些服务,而启动后提示端口已经被使用的情形非常有帮助)

tcp_max_orphans :INTEGER
缺省值是8192
系统所能处理不属于任何进程的TCP sockets最大数量。假如超过这个数量﹐那么不属于任何进程的连接会被立即reset,并同时显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐千万不要依赖这个或是人为的降低这个限制(这个值Redhat AS版本中设置为32768,但是很多防火墙修改的时候,建议该值修改为2000)

tcp_abort_on_overflow :BOOLEAN
缺省值是0
当守护进程太忙而不能接受新的连接,就象对方发送reset消息,默认值是false。这意味着当溢出的原因是因为一个偶然的猝发,那么连接将恢复状态。只有在你确信守护进程真的不能完成连接请求时才打开该选项,该选项会影响客户的使用。(对待已经满载的sendmail,apache这类服务的时候,这个可以很快让客户端终止连接,可以给予服务程序处理已有连接的缓冲机会,所以很多防火墙上推荐打开它)

tcp_syncookies :BOOLEAN
默认值是0
只有在内核编译时选择了CONFIG_SYNCOOKIES时才会发生作用。当出现syn等候队列出现溢出时象对方发送syncookies。目的是为了防止syn flood攻击。
注意:该选项千万不能用于那些没有收到攻击的高负载服务器,如果在日志中出现synflood消息,但是调查发现没有收到synflood攻击,而是合法用户的连接负载过高的原因,你应该调整其它参数来提高服务器性能。参考:
tcp_max_syn_backlog
tcp_synack_retries
tcp_abort_on_overflow
syncookie严重的违背TCP协议,不允许使用TCP扩展,可能对某些服务导致严重的性能影响(如SMTP转发)。(注意,该实现与BSD上面使用的tcp proxy一样,是违反了RFC中关于tcp连接的三次握手实现的,但是对于防御syn-flood的确很有用.)

tcp_stdurg :BOOLEAN
默认值为0
使用 TCP urg pointer 字段中的主机请求解释功能。大部份的主机都使用老旧的 BSD解释,因此如果您在 Linux 打开它﹐或会导致不能和它们正确沟通。

tcp_max_syn_backlog :INTEGER
对于那些依然还未获得客户端确认的连接请求﹐需要保存在队列中最大数目。对于超过 128Mb 内存的系统﹐默认值是 1024 ﹐低于 128Mb 的则为 128。如果服务器经常出现过载﹐可以尝试增加这个数字。警告﹗假如您将此值设为大于 1024﹐最好修改 include/net/tcp.h 里面的 TCP_SYNQ_HSIZE ﹐以保持 TCP_SYNQ_HSIZE*16<=tcp_max_syn_backlog ﹐并且编进核心之内。(SYN Flood攻击利用TCP协议散布握手的缺陷,伪造虚假源IP地址发送大量TCP-SYN半打开连接到目标系统,最终导致目标系统Socket队列资源耗尽而无法接受新的连接。为了应付这种攻击,现代Unix系统中普遍采用多连接队列处理的方式来缓冲(而不是解决)这种攻击,是用一个基本队列处理正常的完全连接应用(Connect()和Accept() ),是用另一个队列单独存放半打开连接。这种双队列处理方式和其他一些系统内核措施(例如Syn-Cookies/Caches)联合应用时,能够比较有效的缓解小规模的SYN Flood攻击(事实证明<1000p/s)加大SYN队列长度可以容纳更多等待连接的网络连接数,所以对Server来说可以考虑增大该值.)

tcp_window_scaling :INTEGER
缺省值为1
该文件表示设置tcp/ip会话的滑动窗口大小是否可变。参数值为布尔值,为1时表示可变,为0时表示不可变。tcp/ip通常使用的窗口最大可达到 65535 字节,对于高速网络,该值可能太小,这时候如果启用了该功能,可以使tcp/ip滑动窗口大小增大数个数量级,从而提高数据传输的能力(RFC 1323)。(对普通地百M网络而言,关闭会降低开销,所以如果不是高速网络,可以考虑设置为0)

tcp_timestamps :BOOLEAN
缺省值为1
Timestamps 用在其它一些东西中﹐可以防范那些伪造的 sequence 号码。一条1G的宽带线路或许会重遇到带 out-of-line数值的旧sequence 号码(假如它是由于上次产生的)。Timestamp 会让它知道这是个 '旧封包'。(该文件表示是否启用以一种比超时重发更精确的方法(RFC 1323)来启用对 RTT 的计算;为了实现更好的性能应该启用这个选项。)

tcp_sack :BOOLEAN
缺省值为1
使用 Selective ACK﹐它可以用来查找特定的遗失的数据报--- 因此有助于快速恢复状态。该文件表示是否启用有选择的应答(Selective Acknowledgment),这可以通过有选择地应答乱序接收到的报文来提高性能(这样可以让发送者只发送丢失的报文段)。(对于广域网通信来说这个选项应该启用,但是这会增加对 CPU 的占用。)

tcp_fack :BOOLEAN
缺省值为1
打开FACK拥塞避免和快速重传功能。(注意,当tcp_sack设置为0的时候,这个值即使设置为1也无效)

tcp_dsack :BOOLEAN
缺省值为1
允许TCP发送"两个完全相同"的SACK。

tcp_ecn :BOOLEAN
缺省值为0
打开TCP的直接拥塞通告功能。

tcp_reordering :INTEGER
默认值是3
TCP流中重排序的数据报最大数量 。 (一般有看到推荐把这个数值略微调整大一些,比如5)

tcp_retrans_collapse :BOOLEAN
缺省值为1
对于某些有bug的打印机提供针对其bug的兼容性。(一般不需要这个支持,可以关闭它)

tcp_wmem(3个INTEGER变量): min, default, max
min:为TCP socket预留用于发送缓冲的内存最小值。每个tcp socket都可以在建议以后都可以使用它。默认值为4096(4K)。

default:为TCP socket预留用于发送缓冲的内存数量,默认情况下该值会影响其它协议使用的net.core.wmem_default 值,一般要低于net.core.wmem_default的值。默认值为16384(16K)。

max: 用于TCP socket发送缓冲的内存最大值。该值不会影响net.core.wmem_max,"静态"选择参数SO_SNDBUF则不受该值影响。默认值为131072(128K)。(对于服务器而言,增加这个参数的值对于发送数据很有帮助,在我的网络环境中,修改为了51200 131072 204800)

tcp_rmem (3个INTEGER变量): min, default, max
min:为TCP socket预留用于接收缓冲的内存数量,即使在内存出现紧张情况下tcp socket都至少会有这么多数量的内存用于接收缓冲,默认值为8K。

default:为TCP socket预留用于接收缓冲的内存数量,默认情况下该值影响其它协议使用的 net.core.wmem_default 值。该值决定了在tcp_adv_win_scale、tcp_app_win和tcp_app_win=0默认值情况下,TCP窗口大小为65535。默认值为87380

max:用于TCP socket接收缓冲的内存最大值。该值不会影响 net.core.wmem_max,"静态"选择参数 SO_SNDBUF则不受该值影响。默认值为 128K。默认值为87380*2 bytes。(可以看出,.max的设置最好是default的两倍,对于NAT来说主要该增加它,我的网络里为 51200 131072 204800)

tcp_mem(3个INTEGER变量):low, pressure, high
low:当TCP使用了低于该值的内存页面数时,TCP不会考虑释放内存。(理想情况下,这个值应与指定给 tcp_wmem 的第 2 个值相匹配 - 这第 2 个值表明,最大页面大小乘以最大并发请求数除以页大小 (131072 * 300 / 4096)。 )

pressure:当TCP使用了超过该值的内存页面数量时,TCP试图稳定其内存使用,进入pressure模式,当内存消耗低于low值时则退出pressure状态。(理想情况下这个值应该是 TCP 可以使用的总缓冲区大小的最大值 (204800 * 300 / 4096)。 )

high:允许所有tcp sockets用于排队缓冲数据报的页面量。(如果超过这个值,TCP 连接将被拒绝,这就是为什么不要令其过于保守 (512000 * 300 / 4096) 的原因了。在这种情况下,提供的价值很大,它能处理很多连接,是所预期的 2.5 倍;或者使现有连接能够传输 2.5 倍的数据。 我的网络里为192000 300000 732000)

一般情况下这些值是在系统启动时根据系统内存数量计算得到的。

tcp_app_win : INTEGER
默认值是31
保留max(window/2^tcp_app_win, mss)数量的窗口由于应用缓冲。当为0时表示不需要缓冲。

tcp_adv_win_scale : INTEGER
默认值为2
计算缓冲开销bytes/2^tcp_adv_win_scale(如果tcp_adv_win_scale > 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如果tcp_adv_win_scale <= 0)。

tcp_rfc1337 :BOOLEAN
缺省值为0
这个开关可以启动对于在RFC1337中描述的"tcp 的time-wait暗杀危机"问题的修复。启用后,内核将丢弃那些发往time-wait状态TCP套接字的RST 包.

tcp_low_latency : BOOLEAN
缺省值为0
允许 TCP/IP 栈适应在高吞吐量情况下低延时的情况;这个选项一般情形是的禁用。(但在构建Beowulf 集群的时候,打开它很有帮助)

tcp_westwood :BOOLEAN
缺省值为0
启用发送者端的拥塞控制算法,它可以维护对吞吐量的评估,并试图对带宽的整体利用情况进行优化;对于 WAN 通信来说应该启用这个选项。

tcp_bic :BOOLEAN
缺省值为0
为快速长距离网络启用 Binary Increase Congestion;这样可以更好地利用以 GB 速度进行操作的链接;对于 WAN 通信应该启用这个选项。

推荐(0)
收藏
May
06

Linux iptables Man 翻译
2008-05-06 2:08 pm 作者:tangfl.openid.35.com

转自:tpxcer的空间 http://hi.baidu.com/tpxc

ps. 顺便做抓虾验证: {ZHUAXIA3c51521f96f54f3fcb53c6a7b30f7947Union}

用iptables -ADC 来指定链的规则,-A添加 -D删除 -C 修改

iptables - [RI] chain rule num rule-specification[option]

用iptables - RI 通过规则的顺序指定

iptables -D chain rule num[option]

删除指定规则

iptables -[LFZ] [chain][option]

用iptables -LFZ 链名 [选项]

iptables -[NX] chain

用 -NX 指定链

iptables -P chain target[options]

指定链的默认目标

iptables -E old-chain-name new-chain-name

-E 旧的链名 新的链名

用新的链名取代旧的链名

说明

Iptalbes 是用来设置、维护和检查Linux内核的IP包过滤规则的。

可以定义不同的表,每个表都包含几个内部的链,也能包含用户定义的链。每个链都是一个规则列表,对对应的包进行匹配:每条规则指定应当如何处理与之相匹配的包。这被称作'target'(目标),也可以跳向同一个表内的用户定义的链。

TARGETS

防火墙的规则指定所检查包的特征,和目标。如果包不匹配,将送往该链中下一条规则检查;如果匹配,那么下一条规则由目标值确定.该目标值可以是用户定义的 链名,或是某个专用值,如ACCEPT[通过], DROP[删除], QUEUE[排队], 或者 RETURN[返回]。

ACCEPT 表示让这个包通过。DROP表示将这个包丢弃。QUEUE表示把这个包传递到用户空间。RETURN表示停止这条链的匹配,到前一个链的规则重新开始。如 果到达了一个内建的链(的末端),或者遇到内建链的规则是RETURN,包的命运将由链准则指定的目标决定。

TABLES

当前有三个表(哪个表是当前表取决于内核配置选项和当前模块)。

-t table

这个选项指定命令要操作的匹配包的表。如果内核被配置为自动加载模块,这时若模块没有加载,(系统)将尝试(为该表)加载适合的模块。这些表如下: filter,这是默认的表,包含了内建的链INPUT(处理进入的包)、FORWORD(处理通过的包)和OUTPUT(处理本地生成的包)。nat, 这个表被查询时表示遇到了产生新的连接的包,由三个内建的链构成:PREROUTING (修改到来的包)、OUTPUT(修改路由之前本地的包)、POSTROUTING(修改准备出去的包)。mangle 这个表用来对指定的包进行修改。它有两个内建规则:PREROUTING(修改路由之前进入的包)和OUTPUT(修改路由之前本地的包)。

OPTIONS

这些可被iptables识别的选项可以区分不同的种类。

COMMANDS

这些选项指定执行明确的动作:若指令行下没有其他规定,该行只能指定一个选项.对于长格式的命令和选项名,所用字母长度只要保证iptables能从其他选项中区分出该指令就行了。

-A -append

在所选择的链末添加一条或更多规则。当源(地址)或者/与 目的(地址)转换为多个地址时,这条规则会加到所有可能的地址(组合)后面。

-D -delete

从所选链中删除一条或更多规则。这条命令可以有两种方法:可以把被删除规则指定为链中的序号(第一条序号为1),或者指定为要匹配的规则。

-R -replace

从选中的链中取代一条规则。如果源(地址)或者/与 目的(地址)被转换为多地址,该命令会失败。规则序号从1开始。

-I -insert

根据给出的规则序号向所选链中插入一条或更多规则。所以,如果规则序号为1,规则会被插入链的头部。这也是不指定规则序号时的默认方式。

-L -list

显示所选链的所有规则。如果没有选择链,所有链将被显示。也可以和z选项一起使用,这时链会被自动列出和归零。精确输出受其它所给参数影响。

-F -flush

清空所选链。这等于把所有规则一个个的删除。

--Z -zero

把所有链的包及字节的计数器清空。它可以和 -L配合使用,在清空前察看计数器,请参见前文。

-N -new-chain

根据给出的名称建立一个新的用户定义链。这必须保证没有同名的链存在。

-X -delete-chain

删除指定的用户自定义链。这个链必须没有被引用,如果被引用,在删除之前你必须删除或者替换与之有关的规则。如果没有给出参数,这条命令将试着删除每个非内建的链。

-P -policy

设置链的目标规则。

-E -rename-chain

根据用户给出的名字对指定链进行重命名,这仅仅是修饰,对整个表的结构没有影响。TARGETS参数给出一个合法的目标。只有非用户自定义链可以使用规则,而且内建链和用户自定义链都不能是规则的目标。

-h Help.

帮助。给出当前命令语法非常简短的说明。

PARAMETERS

参数

以下参数构成规则详述,如用于add、delete、replace、append 和 check命令。

-p -protocal [!]protocol

规则或者包检查(待检查包)的协议。指定协议可以是tcp、udp、icmp中的一个或者全部,也可以是数值,代表这些协议中的某一个。当然也可以使用在 /etc/protocols中定义的协议名。在协议名前加上"!"表示相反的规则。数字0相当于所有all。Protocol all会匹配所有协议,而且这是缺省时的选项。在和check命令结合时,all可以不被使用。

-s -source [!] address[/mask]

指定源地址,可以是主机名、网络名和清楚的IP地址。mask说明可以是网络掩码或清楚的数字,在网络掩码的左边指定网络掩码左边"1"的个数,因此, mask值为24等于255.255.255.0。在指定地址前加上"!"说明指定了相反的地址段。标志 --src 是这个选项的简写。

-d --destination [!] address[/mask]

指定目标地址,要获取详细说明请参见 -s标志的说明。标志 --dst 是这个选项的简写。

-j --jump target

-j 目标跳转

指定规则的目标;也就是说,如果包匹配应当做什么。目标可以是用户自定义链(不是这条规则所在的),某个会立即决定包的命运的专用内建目标,或者一个扩展 (参见下面的EXTENSIONS)。如果规则的这个选项被忽略,那么匹配的过程不会对包产生影响,不过规则的计数器会增加。

-i -in-interface [!] [name]

i -进入的(网络)接口 [!][名称]

这是包经由该接口接收的可选的入口名称,包通过该接口接收(在链INPUT、 FORWORD和PREROUTING中进入的包)。当在接口名前使用"!" 说明后,指的是相反的名称。如果接口名后面加上"+",则所有以此接口名开头的接口都会被匹配。如果这个选项被忽略,会假设为"+",那么将匹配任意接 口。

-o --out-interface [!][name]

-o --输出接口[名称]

这是包经由该接口送出的可选的出口名称,包通过该口输出(在链FORWARD、 OUTPUT和POSTROUTING中送出的包)。当在接口名前使用"! "说明后,指的是相反的名称。如果接口名后面加上"+",则所有以此接口名开头的接口都会被匹配。如果这个选项被忽略,会假设为"+",那么将匹配所有任 意接口。

[!] -f, --fragment

[!] -f --分片

这意味着在分片的包中,规则只询问第二及以后的片。自那以后由于无法判断这种把包的源端口或目标端口(或者是ICMP类型的),这类包将不能匹配任何指定对他们进行匹配的规则。如果"!"说明用在了"-f"标志之前,表示相反的意思。

OTHER OPTIONS

其他选项

还可以指定下列附加选项:

-v --verbose

-v --详细

详细输出。这个选项让list命令显示接口地址、规则选项(如果有)和TOS (Type of Service)掩码。包和字节计数器也将被显示,分别用K、M、G(前缀)表示1000、1,000,000和1,000,000,000倍(不过请参 看-x标志改变它),对于添加,插入,删除和替换命令,这会使一个或多个规则的相关详细信息被打印。

-n --numeric

-n --数字

数字输出。IP地址和端口会以数字的形式打印。默认情况下,程序试显示主机名、网络名或者服务(只要可用)。

-x -exact

-x -精确

扩展数字。显示包和字节计数器的精确值,代替用K,M,G表示的约数。这个选项仅能用于 -L 命令。

--line-numbers

当列表显示规则时,在每个规则的前面加上行号,与该规则在链中的位置相对应。

MATCH EXTENSIONS

对应的扩展

iptables能够使用一些与模块匹配的扩展包。以下就是含于基本包内的扩展包,而且他们大多数都可以通过在前面加上!来表示相反的意思。

tcp

当 --protocol tcp 被指定,且其他匹配的扩展未被指定时,这些扩展被装载。它提供以下选项:

--source-port [!] [port[]]

源端口或端口范围指定。这可以是服务名或端口号。使用格式端口:端口也可以指定包含的(端口)范围。如果首端口号被忽略,默认是"0",如果末端口号被忽略,默认是"65535",如果第二个端口号大于第一个,那么它们会被交换。这个选项可以使用 --sport的别名。

--destionation-port [!] [port:[port]]

目标端口或端口范围指定。这个选项可以使用 --dport别名来代替。

--tcp-flags [!] mask comp

匹配指定的TCP标记。第一个参数是我们要检查的标记,一个用逗号分开的列表,第二个参数是用逗号分开的标记表,是必须被设置的。标记如下:SYN ACK FIN RST URG PSH ALL NONE。因此这条命令:iptables -A FORWARD -p tcp --tcp-flags SYN, ACK, FIN, RST SYN只匹配那些SYN标记被设置而ACK、FIN和RST标记没有设置的包。

[!] --syn

只匹配那些设置了SYN位而清除了ACK和FIN位的TCP包。这些包用于TCP连接初始化时发出请求;例如,大量的这种包进入一个接口发生堵塞时会阻止 进入的TCP连接,而出去的TCP连接不会受到影响。这等于 --tcp-flags SYN, RST, ACK SYN。如果"--syn"前面有"!"标记,表示相反的意思。

--tcp-option [!] number

匹配设置了TCP选项的。

udp

当protocol udp 被指定,且其他匹配的扩展未被指定时,这些扩展被装载,它提供以下选项:

--source-port [!] [port:[port]]

源端口或端口范围指定。详见 TCP扩展的--source-port选项说明。

--destination-port [!] [port:[port]]

目标端口或端口范围指定。详见 TCP扩展的--destination-port选项说明。

icmp

当protocol icmp被指定,且其他匹配的扩展未被指定时,该扩展被装载。它提供以下选项:

--icmp-type [!] typename

这个选项允许指定ICMP类型,可以是一个数值型的ICMP类型,或者是某个由命令iptables -p icmp -h所显示的ICMP类型名。

mac

--mac-source [!] address

匹配物理地址。必须是XX:XX:XX:XX:XX这样的格式。注意它只对来自以太设备并进入PREROUTING、FORWORD和INPUT链的包有效。

limit

这个模块匹配标志用一个标记桶过滤器一一定速度进行匹配,它和LOG目标结合使用来给出有限的登陆数.当达到这个极限值时,使用这个扩展包的规则将进行匹配.(除非使用了"!"标记)

--limit rate

最大平均匹配速率:可赋的值有'/second', '/minute', '/hour', or '/day'这样的单位,默认是3/hour。

--limit-burst number

待匹配包初始个数的最大值:若前面指定的极限还没达到这个数值,则概数字加1.默认值为5

multiport

这个模块匹配一组源端口或目标端口,最多可以指定15个端口。只能和-p tcp 或者 -p udp 连着使用。

--source-port [port[, port]]

如果源端口是其中一个给定端口则匹配

--destination-port [port[, port]]

如果目标端口是其中一个给定端口则匹配

--port [port[, port]]

若源端口和目的端口相等并与某个给定端口相等,则匹配。

mark

这个模块和与netfilter过滤器标记字段匹配(就可以在下面设置为使用MARK标记)。

--mark value [/mask]

匹配那些无符号标记值的包(如果指定mask,在比较之前会给掩码加上逻辑的标记)。

owner

此模块试为本地生成包匹配包创建者的不同特征。只能用于OUTPUT链,而且即使这样一些包(如ICMP ping应答)还可能没有所有者,因此永远不会匹配。

--uid-owner userid

如果给出有效的user id,那么匹配它的进程产生的包。

--gid-owner groupid

如果给出有效的group id,那么匹配它的进程产生的包。

--sid-owner seessionid

根据给出的会话组匹配该进程产生的包。

state

此模块,当与连接跟踪结合使用时,允许访问包的连接跟踪状态。

--state state

这里state是一个逗号分割的匹配连接状态列表。可能的状态是:INVALID表示包是未知连接,ESTABLISHED表示是双向传送的连接,NEW 表示包为新的连接,否则是非双向传送的,而RELATED表示包由新连接开始,但是和一个已存在的连接在一起,如FTP数据传送,或者一个ICMP错误。

unclean

此模块没有可选项,不过它试着匹配那些奇怪的、不常见的包。处在实验中。

tos

此模块匹配IP包首部的8位tos(服务类型)字段(也就是说,包含在优先位中)。

--tos tos

这个参数可以是一个标准名称,(用iptables -m tos -h 察看该列表),或者数值。

TARGET EXTENSIONS

iptables可以使用扩展目标模块:以下都包含在标准版中。

LOG

为匹配的包开启内核记录。当在规则中设置了这一选项后,linux内核会通过printk()打印一些关于全部匹配包的信息(诸如IP包头字段等)。

--log-level level

记录级别(数字或参看 syslog.conf(5))。

--log-prefix prefix

在纪录信息前加上特定的前缀:最多14个字母长,用来和记录中其他信息区别。

--log-tcp-sequence

记录TCP序列号。如果记录能被用户读取那么这将存在安全隐患。

--log-tcp-options

记录来自TCP包头部的选项。

--log-ip-options

记录来自IP包头部的选项。

MARK

用来设置包的netfilter标记值。只适用于mangle表。

--set-mark mark

REJECT

作为对匹配的包的响应,返回一个错误的包:其他情况下和DROP相同。

此目标只适用于INPUT、FORWARD和OUTPUT链,和调用这些链的用户自定义链。这几个选项控制返回的错误包的特性:

--reject-with type

Type可以是icmp-net-unreachable、icmp-host- unreachable、icmp-port-nreachable、 icmp-proto-unreachable、 icmp-net-prohibited 或者 icmp-host-prohibited,该类型会返回相应的ICMP错误信息(默认是port-unreachable)。选项 echo-reply也是允许的;它只能用于指定ICMP ping包的规则中,生成ping的回应。最后,选项tcp-reset可以用于在INPUT链中,或自INPUT链调用的规则,只匹配TCP协议:将回 应一个TCP RST包。

TOS

用来设置IP包的首部八位tos。只能用于mangle表。

--set-tos tos

你可以使用一个数值型的TOS 值,或者用iptables -j TOS -h 来查看有效TOS名列表。

MIRROR

这是一个试验示范目标,可用于转换IP首部字段中的源地址和目标地址,再传送该包,并只适用于INPUT、FORWARD和OUTPUT链,以及只调用它们的用户自定义链。

SNAT

这个目标只适用于nat表的POSTROUTING链。它规定修改包的源地址(此连接以后所有的包都会被影响),停止对规则的检查,它包含选项:

--to-source ;[-;][:port-port]

可以指定一个单一的新的IP地址,一个IP地址范围,也可以附加一个端口范围(只能在指定-p tcp 或者-p udp的规则里)。如果未指定端口范围,源端口中512以下的(端口)会被安置为其他的512以下的端口;512到1024之间的端口会被安置为1024 以下的,其他端口会被安置为1024或以上。如果可能,端口不会被修改。

--to-destiontion ;[-;][:port-port]

可以指定一个单一的新的IP地址,一个IP地址范围,也可以附加一个端口范围(只能在指定-p tcp 或者-p udp的规则里)。如果未指定端口范围,目标端口不会被修改。

MASQUERADE

只用于nat表的POSTROUTING链。只能用于动态获取IP(拨号)连接:如果你拥有静态IP地址,你要用SNAT。伪装相当于给包发出时所经过接 口的IP地址设置一个映像,当接口关闭连接会终止。这是因为当下一次拨号时未必是相同的接口地址(以后所有建立的连接都将关闭)。它有一个选项:

--to-ports ;[-port>;]

指定使用的源端口范围,覆盖默认的SNAT源地址选择(见上面)。这个选项只适用于指定了-p tcp或者-p udp的规则。

REDIRECT

只适用于nat表的PREROUTING和OUTPUT链,和只调用它们的用户自定义链。它修改包的目标IP地址来发送包到机器自身(本地生成的包被安置为地址127.0.0.1)。它包含一个选项:

--to-ports ;[;]

指定使用的目的端口或端口范围:不指定的话,目标端口不会被修改。只能用于指定了-p tcp 或 -p udp的规则。

DIAGNOSTICS

诊断

不同的错误信息会打印成标准错误:退出代码0表示正确。类似于不对的或者滥用的命令行参数错误会返回错误代码2,其他错误返回代码为1。

BUGS

臭虫

Check is not implemented (yet).

检查还未完成。

COMPATIBILITY WITH IPCHAINS

与ipchains的兼容性

iptables和Rusty Russell的ipchains非常相似。主要区别是INPUT 链只用于进入本地主机的包,而OUTPUT只用于自本地主机生成的包。因此每个包只经过三个链的一个;以前转发的包会经过所有三个链。其他主要区别是 -i 引用进入接口;-o引用输出接口,两者都适用于进入FORWARD链的包。当和可选扩展模块一起使用默认过滤器表时,iptables是一个纯粹的包过滤 器。这能大大减少以前对IP伪装和包过滤结合使用的混淆,所以以下选项作了不同的处理:

-j MASQ

-M -S

-M -L

在iptables中有几个不同的链。

SEE ALSO

参见

iptables-HOWTO有详细的iptables用法,对netfilter-hacking-HOWTO也有详细的本质说明。

推荐(0)
收藏
Apr
30

系统性能分析和优化

前言

很高兴能有这样的机会,把我自己多年工作中对服务器硬件、软件方面的性能分析的经验和体会,以及性能优化的经验和各位朋友做一次分享。

这份ppt的内容组织大致是这样的,通过对系统中和性能相关的各个环节的介绍,使大家知道出现性能问题时可以从那些方面入手去查,而分析典型应用对系统资源使用的特点,让大家对应用和系统资源的依赖有了更直观的认识,然后我会介绍常见的分析及监控系统资源时使用的工具,这个环节应该是最主要的,最后我会举一个实际发生过的系统性能瓶颈分析和优化的案例,作为一个实践和总结。

阅读全文... 

推荐(0)
收藏
Apr
30

转:网络监视工具NTOP
2008-04-30 11:34 am 作者:tangfl.openid.35.com

 转自 姜源

网络流量的监测是服务器和网络设备使用中常见的需求,在多服务器的环境下大多使用MRTG或者CACTI. 类似这样的软件还有很多,如:Nagioszenoss, hyperic hq, jffnms等。

这些工具大多通过snmp取得服务器或网络设备的信息,不仅有网络流量,同时也可以监控服务器负载,应用服务健康状况,通过自写脚本实现多种监控。并通过类似RRDtool的绘图工具绘制图表以web界面展示给使用者。大多需要在被监控服务器上配置snmp,然后再在一台服务器(LAMP)上采集信息绘制图表。

而本文要简单介绍的NTOP是一款专门监控网络流量的软件,同样使用RRDtool绘 制图表,但它本身不需要配置snmp和web服务器。在本机安装起动后直接可以用浏览器访问3000端口访问查询和管理界面,支持用户权限管理和插件。并 且有着详细的网络状态信息。它也支持把一些统计数据输出为php,python,perl等语言的数组,这样可以很方便的在自己的程序里取到数据。如果你 想对单台的服务器的网络状态进行监控,比如在压力测试时。并且你对tcpdump这样的工具不太感冒。可以尝试一下这个方便的工具。

推荐(0)
收藏
Apr
29

Linux 网址s
2008-04-29 7:35 pm 作者:tangfl.openid.35.com

  • 国外

http://lwn.net/

http://www.tldp.org/

https://rhn.redhat.com/

http://www.justlinux.com/

http://www.linuxtoday.com/

http://www.linuxquestions.org/

http://www.fokus.gmd.de/linux/

http://www.linux-tutorial.info/

http://public.www.planetmirror.com/

http://www.freebsdforums.org/forums/

http://www.netfilter.org/documentation/

http://www-106.ibm.com/developerworks/linux/

http://www.redhat.com/docs/

redhat官方文档

http://www.redhat.com/apps/support/errata/

redhat安全性警告、软件更新和增强,建议每周至少查阅一次

  • 国内

http://www.fanqiang.com/

http://www.linuxsir.com/

http://www.chinaunix.net/

http://www.linuxfans.org/

http://www.linuxeden.com/

http://www.linuxforum.net/

http://www.linuxaid.com.cn/

http://freesoft.online.sh.cn/

http://www-900.ibm.com/developerWorks/cn/linux/index.shtml

  • linux 常用软件搜索

http://kde-redhat.sourceforge.net/ - KDE for Red Hat project
http://bingle.pku.edu.cn 北大天网ftp搜索,教育网和国内用户查找软件应首先访问,软件特别丰富
http://www.linuxforum.net/ 有很多国外软件的官方镜像,应首先访问
http://rpmfind.net
http://freshmeat.net
http://sourceforge.net
注:很多软件主站是在sourceforge上的,形如http://phpmyadmin.sourceforge.net的地址,可以通过 http://sourceforge.net/projects/phpmyadmin这样的地址访问,如不能上也可用http镜象直接下载软件如 http://telia.dl.sourceforge.net/phpmyadmin/
http://www.gnu.org GNU的大本营,gcc,bash之类的软件源码可以到这里得到 linux 文档和FAQs
http://www.tldp.org 强烈推荐! The linux document project: linux HOWTO and guides
http://www.linux.org.tw/CLDP/ 强烈推荐! TLDP中文版,繁体
http://www.linuxgazette.com/ linux在线杂志
http://linux.tcpip.com.cn/download/ linux中文版文档和软件下载
http://cosoft.org.cn/html/documents/ 很多中文版手册

  • linux 桌面主站一览表

GNOME: http://www.gnome.org
KDE: http://www.kde.org
XFce: http://www.xfce.org/
Window Maker: http://www.windowmaker.org/
BlackBox: http://sourceforge.net/projects/blackboxwm
XPde: http://www.xpde.com
ROX: http://sourceforge.net/projects/rox
5dwm: http://5dwm.org/
foXdesktop: http://sourceforge.net/projects/foxdesktop
EDE: http://sourceforge.net/projects/ede
UDE: http://sourceforge.net/projects/udeproject

  • 其它OS

Mandrake linux http://www.mandrakelinux.com
debian linux http://www.debian.org
slackware linux http://www.slackware.com
suse linux http://www.suse.com
FreeBSD http://www.freebsd.org
netbsd http://www.netbsd.org
openbsd http://www.openbsd.org
Solaris http://www.sun.com/solaris 硬件和安装专业站点
linux Kernel内核: http://www.kernel.org
USB安装问题: http://www.linux-usb.org
笔记本计算机安装: http://www.linux-laptop.net
打印机驱动 http://www.linuxprinting.org

  • 主要服务器软件主站

1. WWW server:
Apache http://www.apache.org Apache
SSL模块Mod_ssl http://www.modssl.org
aol server http://www.aolserver.com

2. Servlets/JSP引擎:
Tomcat: http://jakarta.apache.org
Resin: http://www.caucho.com
开源应用服务器AS--Jboss: http://www.jboss.org

3. 服务器语言:
PHP http://www.php.net
Zend http://www.zend.com
Java http://www.javasoft.com
Python http://www.python.org
Zope http://www.zope.org
Perl http://www.perl.org
Ruby http://www.ruby-lang.org/en

4. 数据库:
MySQL http://www.mysql.com
PostgreSQL http://www.postgresql.org
Oracle http://www.oracle.com
sap db http://www.sapdb.org
PHPMyAdmin -- http://www.phpmyadmin.org
PHPPgAdmin: http://sourceforge.net/projects/phppgadmin

5. FTP服务器
wu-ftpd http://www.wu-ftpd.org
Proftpd http://www.proftpd.org
Pure-ftpd http://www.pureftpd.org
ncftpd http://www.ncftpd.com
vsftpd http://vsftpd.beasts.org

6. SMTP服务器
Sendmail http://www.sendmail.org
qmail http://www.qmail.org
Postfix http://www.postfix.org
Exim http://www.exim.org
POP3--qpopper http://www.qpopper.org

7. IMAP服务器
Cyrus-IMAPD http://asg.web.cmu.edu/cyrus/imapd
UW IMAP http://www.washington.edu/imap
courierimap http://www.inter7.com/courierimap

8. 基本安全工具
firewall Iptables: http://www.iptables.org
shorewall: http://www.shorewall.net
inetd Xinetd: http://www.xinetd.org
Openssl: http://www.openssl.org
OpenSSH: http://www.openssh.org
nmap: http://http://www.insecure.org/nmap
Tripwire: http://www.tripwire.org
snort: http://www.snort.org
nessus: http://www.nessus.org
GnuPG: http://www.gnupg.org
chkrootkit: http://www.chkrootkit.org
安全顾问: http://www.cert.org

9. 其它服务器软件
CVS--CVS http://www.cvshome.org
DNS域名解析BIND http://www.isc.org/products/BIND/
DHCP--DHCP http://www.isc.org/products/DHCP/
INN新闻组INN: http://www.isc.org/products/INN/
Proxy代理缓存: Squid http://www.squid-cache.org
Socks代理:http://www.socks.nec.com/
Samba Server: http://www.samba.org
Print CUPS: http://www.cups.org
LDAP OpenLDAP: http://www.openldap.org
流量分析 MRTG http://www.mrtg.org
日志分析 webalizer http://www.mrunix.net/webalizer/
Ipsec/VPN http://www.freeswan.org
路由 Zebra http://www.zebra.org
集群 LVS http://www.linuxvirtualserver.org
MPICH http://www-unix.mcs.anl.gov/mpi/mpich/
PVM:http://www.netlib.org/pvm3/
Rsync: http://rsync.samba.org
linuxconf: http://www.solucorp.qc.ca/linuxconf/
Webmin: http://www.webmin.com

10. 其他

推荐(0)
收藏
Apr
29

varnish 架构(翻译)
2008-04-29 4:49 pm 作者:tangfl.openid.35.com

原文链接:http://varnish.projects.linpro.no/wiki/ArchitectNotes

译者序:工作中用到了 varnish ,网上却鲜有中文资料。前任一篇《使用Varnish代替Squid做网站缓存加速器的详细解决方案[原创]》,侧重于应用,而原理甚少。故试译此文,存投石引玉之念。

(未完成)

阅读全文... 

推荐(0)
收藏
Apr
28

nginx
2008-04-28 11:09 pm 作者:tangfl.openid.35.com

Nginx 概述

HTTP基础功能:

  • 处理静态文件,索引文件以及自动索引;
  • 反向代理加速(无缓存),简单的负载均衡和容错;
  • FastCGI,简单的负载均衡和容错;
  • 模块化的结构。过滤器包括gzipping, byte ranges, chunked responses, 以及 SSI-filter 。在SSI过滤器中,到同一个 proxy 或者 FastCGI 的多个子请求并发处理;
  • SSL 和 TLS SNI 支持;

阅读全文... 

推荐(0)
收藏
Apr
11

《于瑜与余欲渔遇雨》

于瑜欲渔,遇余于寓。语余:“余欲渔于渝淤,与余渔渝欤?”
余语于瑜:“余欲鬻玉,俞禹欲玉,余欲遇俞于俞寓。”
余与于瑜遇俞禹于俞寓,逾俞隅,欲鬻玉于俞,遇雨,雨逾俞宇。余语于瑜:“余欲渔于渝淤,遇雨俞寓,雨逾俞宇,欲渔欤?鬻玉欤?”
于瑜与余御雨于俞寓,俞禹鬻玉于余,雨愈,余与于瑜踽踽逾俞宇,渔于渝淤。
《饥鸡集矶记》

唧唧鸡,鸡唧唧。几鸡挤挤集矶脊。机极疾,鸡饥极,鸡冀己技击及鲫。机既济蓟畿,鸡计疾机激几鲫。机疾极,鲫极悸,急急挤集矶级际。继即鲫迹极寂寂,继即几鸡既饥,即唧唧。

《侄治痔》

芝之稚侄郅,至智,知制纸,知织帜,芝痔炙痔,侄至芝址,知之知芷汁治痔,至芷址,执芷枝,蜘至,踯侄,执直枝掷之,蜘止,侄执芷枝至芝,芝执芷治痔,痔止。

《施氏食狮史》
文/赵元任

石室诗士施氏,嗜狮,誓食十狮。氏时时适市视狮。十时,适十狮适市。是时,适施氏适市。氏视是十狮,恃矢势,使是十狮逝世。氏拾是十狮尸,适石室。石室湿,氏使侍拭石室。石室拭,氏始试食是十狮。食时,始识是十狮,实十石狮尸。试释是事。
《易姨医胰》

文/赵元任

易姨倚椅,悒悒,疑异疫,宜诣医。医议宜以蚁胰医姨。医以亿弋弋亿蚁。亿蚁缢,蚁胰溢。医以亿蚁溢胰医姨,姨疫以医。姨怡怡,以夷衣贻医。医衣夷衣,亦怡怡。噫,医以蚁胰医姨疫,亦异矣;姨以夷衣贻医,亦益异已矣!

来源:青年文摘·彩版

推荐(0)
收藏
Apr
07

生活还在继续
2008-04-07 5:23 pm 作者:tangfl.openid.35.com

从上个月的最后一天,也就是上周一开始,转部门的事情从意愿变成了行动。
新浪支付(http://sinapay.sina.com.cn)上线完成,但离步入正轨还差十万八千里——掉单还需要人工干预,对账还需要人工统计,给客服用的系统,给财务用的系统,等等等等,都还在 ToDoList 上,更不用说二期的给其他部门提供付费接口,二期在电信部署一套机器,二期换用更稳定的数据库集群,二期,更遥远的目标。

推荐(0)
收藏
得到OpenID
使用OpenID提供商
35OpenID 35OpenID MyOpenID MyOpenID Flickr Flickr
Google Google Yahoo Yahoo! AOL AOL
Blogger Blogger LiveJournal LiveJournal Verisign Verisign
ClaimID ClaimID Technorati Technorati Vidoop Vidoop
OpenID OpenID 帮助
您还没有登录,请登录后继续操作。
提示:您必需打开Cookie才能使用本系统
请输入您的 OpenID OpenID 登录:
例如:http://yourname.openid.35.com
close