<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/commentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" >
<channel>
	<title>网海拾贝 - 星空博客</title>
	<link>http://www.xklog.org/rss.php?cate=4</link>
	<description>源自网络的转载文章</description>
	<language>zh-cn</language>
	<copyright>Powered By XKLog V0.7.244.Copyright 2010 星空博客 All Rights Reserved.</copyright>
	<pubDate>Thu, 09 Sep 2010 10:52:01 +0000</pubDate>
	<generator>XKLog V0.7.244</generator>
	
	<item>
		<title><![CDATA[基于wordpress搭建的创新工厂]]></title>
		<link>http://www.xklog.org/article/internet/wordpress-based-Innovation-Works.html</link>
		<author>星空泪</author>
		<description><![CDATA[<p><a href="http://www.chuangxin.com">创新工厂</a>&nbsp;是李开复博士从 Google 离职后所创办的。我记得原版创新工厂网站是基于 asp 搭建的。今天在 cnBeta 上看到创新工厂启用了新域名，顺便去看看，发现已经改由 wordpress 搭建。</p>]]></description>
		<category>网海拾贝</category>
		<guid>http://www.xklog.org/article/internet/wordpress-based-Innovation-Works.html</guid>
		<pubDate>Wed, 08 Sep 2010 17:14:44 +0000</pubDate>
	</item>

	
	<item>
		<title><![CDATA[高数也可以这么诗意]]></title>
		<link>http://www.xklog.org/article/internet/math-can-be-so-poetic.html</link>
		<author>星空泪</author>
		<description><![CDATA[<p>拉格朗日，<br />
傅立叶旁，<br />
我凝视你凹函数般的脸庞。<br />
微分了忧伤，<br />
积分了希望，<br />
我要和你追逐黎曼最初的梦想。<br />
感情已发散，<br />
收敛难挡，<br />
没有你的极限，<br />
柯西抓狂，<br />
我的心已成自变量，<br />
函数因你波起波荡。<br />
低阶的有限阶的，<br />
一致的不一致的，<br />
是我想你的皮亚诺余项。<br />
<br />
狄利克雷，<br />
勒贝格杨<br />
一同仰望莱布尼茨的肖像，<br />
拉贝、泰勒，无穷小量，<br />
是长廊里麦克劳林的吟唱。<br />
打破了确界，<br />
你来我身旁，<br />
温柔抹去我，<br />
阿贝尔的伤，<br />
我的心已成自变量，<br />
函数因你波起波荡。<br />
低阶的有限阶的，<br />
一致的不一致的，<br />
是我想你的皮亚诺余项。<br />
<br />
<font color="#ff0000"><strong>青花瓷 之 高数版</strong></font><br />
<br />
信笔勾勒出坐标<br />
思路明转暗<br />
空间描绘的曲线<br />
一如你出场<br />
逐项积分求过导<br />
后事我茫然<br />
稿纸上走笔至此搁一半<br />
<br />
函数展成傅立叶<br />
系数被私藏<br />
而你收敛的一笑<br />
如二次曲面<br />
你的美一缕发散<br />
去到我去不了的地方<br />
<br />
右手规则解叉积<br />
而我在解你<br />
泰勒悄悄用起<br />
式子千万里<br />
在课本书积分仿牛顿的飘逸<br />
就当我为读懂你伏笔<br />
<br />
变量代换算周期<br />
而我在算你<br />
高斯被打捞起<br />
明白了结局<br />
如传世的洛必达自顾自美丽<br />
你眼带笑意<br />
<br />
逐渐逼近的级数跃然于眼里<br />
临摹柯西落笔却惦记着你<br />
你隐藏在方程里百年的秘密<br />
极细腻犹如绣花针落地<br />
收敛半径惹连续<br />
区间惹值域<br />
<br />
而我使用那三重积分惹了你<br />
在旋转抛物面里<br />
你从截痕深处被隐去<br />
<br />
<font color="#ff0000"><strong>兰亭序 之 高数版</strong></font><br />
<br />
数分难学 高数如高山流水<br />
函数数列 何时也为我收敛<br />
开和闭 区间易理解 却难求你极限<br />
映射也 映不进心间<br />
<br />
函数连续 却也不一定可导<br />
然而可导 竟又一定会可微<br />
导数高阶 问莱布尼茨 他到底是个谁<br />
有间断点 而我不曾觉<br />
<br />
费马初现 我渐渐入深渊<br />
罗尔浅笑 顿觉头晕目眩<br />
拉格朗日 落井下石最会<br />
而我独缺 对柯西的了解<br />
<br />
费马初现 我渐渐入深渊<br />
罗尔浅笑 顿觉头晕目眩<br />
拉格朗日 落井下石最会<br />
而我独缺 对柯西的了解<br />
<br />
费马初现 我渐渐入深渊<br />
罗尔浅笑 顿觉头晕目眩<br />
拉格朗日 落井下石最会<br />
而我独缺 对柯西的了解<br />
<br />
水笔疾飞 草稿顷刻间湮灭<br />
铃声响却 佩亚诺才刚出现<br />
展开没 泰勒很复杂 麦克劳林简约<br />
求极限 洛必达无愧<br />
<br />
人事纷飞 单调改用求导解<br />
凸还是凹 目测早已不精确<br />
试卷最黑 题设常千山万水 总被蒙骗<br />
驻点拐点 到底谁是谁<br />
<br />
费马初现 我渐渐入深渊<br />
罗尔浅笑 顿觉头晕目眩<br />
拉格朗日 落井下石最会<br />
而我独缺 对柯西的了解<br />
<br />
费马初现 我渐渐入深渊<br />
到底等谁 伯努利傅里叶<br />
几人痴醉 却恨透了数学<br />
我最可悲 只爱上你的美<br />
<font color="#ff0000"><strong><br />
爱在西元前 之 高数版</strong></font><br />
<br />
多元函数突破了横纵坐标的局限<br />
穿过了垂直的Z轴<br />
扩展到三维立体空间里面<br />
你在曲线前<br />
凝视方程的字眼<br />
我却在旁焦头烂额忙着初等函数的换元<br />
<br />
单调 间断 凹凸 拐点<br />
是谁的判断<br />
喜欢在夹逼定理后你只属于我的那极限<br />
经过无穷级数的计算<br />
我以欧拉之名许愿<br />
思念想正余弦函数般蔓延<br />
<br />
当微分方程只剩下未知的概念<br />
通解就成了永恒不变的诗篇<br />
<br />
我给你的爱写在求导前<br />
深埋在极限定义连续里面<br />
洛必达法则后发现<br />
所求的结果依然清晰可见<br />
<br />
我给你的爱写在积分前<br />
深埋在几何区域面积里面<br />
用二次曲面写下了永远<br />
那些极坐标代换的经典<br />
一切又重演<br />
<br />
我感到很疲倦<br />
思路少的好可怜<br />
害怕再也不能无限接近到你身边</p>]]></description>
		<category>网海拾贝</category>
		<guid>http://www.xklog.org/article/internet/math-can-be-so-poetic.html</guid>
		<pubDate>Sat, 24 Jul 2010 07:34:59 +0000</pubDate>
	</item>

	
	<item>
		<title><![CDATA[LINUX下的SYN攻击防御]]></title>
		<link>http://www.xklog.org/article/internet/Linux-SYN-attack.html</link>
		<author>星空泪</author>
		<description><![CDATA[<p>在怀疑有Dos攻击的时候，可以输入<br />
netstat -an | grep -i &ldquo;服务器ip地址:80&Prime; | awk &lsquo;&rsquo;{print }'&rsquo; | sort | uniq -c | sort -n</p>
<p>这个命令会自动统计Tcp连接各个状态的数量，如果SYN_RECV很高的话，就不能排除有基于tcp协议的ddos攻击的可能，这个时候可以打开tcp_syncookies，输入如下命令</p>
<p>echo 1 &gt; /proc/sys/net/ipv4/tcp_syncookies</p>
<p>如果没有 /proc/sys/net/ipv4/tcp_syncookies说明你的内核不支持，需要重新编译内核<br />
同时 降低syn重试次数<br />
echo 1 &gt; /proc/sys/net/ipv4/tcp_syn_retries<br />
echo 1 &gt; /proc/sys/net/ipv4/tcp_synack_retries</p>
<p>加大syn_backlog，以保证用户的访问（消耗内存为代价，设的太高。。）</p>
<p>echo &ldquo;2048&Prime; &gt; /proc/sys/net/ipv4/tcp_max_syn_backlog</p>
<p>如果还是不行，那么只能交给相应的硬件防火墙了。</p>
<p><span class="tpc_content"><font color="indigo">#防止SYN攻击 轻量<br />
/sbin/iptables -N syn-flood<br />
/sbin/iptables -A INPUT -p tcp --syn -j syn-flood<br />
/sbin/iptables -I syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN<br />
/sbin/iptables -A syn-flood -j REJECT<br />
#为了防止DOS太多连接进来,那么可以允许最多15个初始连接,超过的丢弃<br />
<br />
/sbin/iptables -A INPUT -s $INNET -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT<br />
/sbin/iptables -A INPUT -i $EXTIF -p tcp --syn -m connlimit --connlimit-above 15 -j DROP<br />
/sbin/iptables -A INPUT -s $INNET -p tcp --syn -m connlimit --connlimit-above 15 -j DROP<br />
<br />
#设置icmp阔值 ,并对攻击者记录在案<br />
/sbin/iptables -A INPUT -p icmp -m limit --limit 3/s -j LOG --log-level INFO --log-prefix &quot;ICMP packet IN: &quot;<br />
/sbin/iptables -A INPUT -p icmp -m limit --limit 6/m -j ACCEPT<br />
/sbin/iptables -A INPUT -p icmp -j DROP</font></span></p>
<p># 防止端口扫描</p>
<p>iptables -I INPUT -p icmp --icmp-type echo-request -m state --state NEW -j DROP #禁止PING</p>
<p>iptables -A INPUT -i eth0 -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP #标志为FIN，URG，PSH拒绝</p>
<p>iptables -A INPUT -i eth0 -p tcp --tcp-flags SYN,RST SYN,RST -j DROP</p>
<p>iptables -A INPUT -i eth0 -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP</p>
<p>iptables -A INPUT -i eth0 -p tcp --tcp-flags ALL ALL -j DROP</p>
<p>iptables -A INPUT -i eth0 -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP</p>
<p>iptables -A INPUT -i eth0 -p tcp --tcp-flags ALL NONE -j DROP</p>
<p>（附：218。94。6。179/188两台服务器安装的WEBMIN限定*。181网关连接，密码为：fangzhi790529）</p>
<p># 防止SYN FLOOD攻几！</p>
<p>iptables -N synfoold<br />
iptables -A synfoold -p tcp --syn -m limit --limit 1/s -j RETURN<br />
iptables -A synfoold -p tcp -j REJECT --reject-with tcp-reset<br />
iptables -A INPUT -p tcp -m state --state NEW -j synfoold</p>
<p># 禁止PING</p>
<p>iptables -N ping<br />
iptables -A ping -p icmp --icmp-type echo-request -m limit --limit 1/second -j RETURN<br />
iptables -A ping -p icmp -j REJECT<br />
iptables -I INPUT -p icmp --icmp-type echo-request -m state --state NEW -j ping</p>
<p># 端口过滤</p>
<p>#這個 script 內容，很適用只允許外面連結特定的 port 服務，剩下的其餘<br />
&nbsp;&nbsp;port 就拒絕外面主動建立的連線。</p>
<p>&nbsp;&nbsp;iptables -A INPUT -i eth0 -p tcp --dport 21 -j ACCEPT<br />
&nbsp;&nbsp;iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT<br />
&nbsp;&nbsp;iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT<br />
&nbsp;&nbsp;iptables -A INPUT -i eth0 -p tcp --dport 389 -j ACCEPT<br />
&nbsp;&nbsp;iptables -A INPUT -i eth0 -p tcp --dport 1002 -j ACCEPT<br />
&nbsp;&nbsp;iptables -A INPUT -i eth0 -p tcp --dport 1720 -j ACCEPT<br />
&nbsp;&nbsp;iptables -A INPUT -i eth0 -p udp --dport 2121 -j ACCEPT<br />
&nbsp;&nbsp;iptables -A INPUT -i eth0 -p tcp --dport 3306 -j ACCEPT<br />
&nbsp;&nbsp;iptables -A INPUT -i eth0 -p tcp --dport 8009 -j ACCEPT</p>
<p>&nbsp;&nbsp;iptables -A INPUT -i eth0 -p tcp --dport 8080 -j ACCEPT</p>
<p>&nbsp;&nbsp;iptables -A INPUT -i eth0 -p tcp --dport 8081 -j ACCEPT</p>
<p>&nbsp;&nbsp;iptables -A INPUT -i eth0 -p tcp --dport 10000 -j ACCEPT</p>
<p mso-char-indent-count:="" text-indent:=""><br />
&nbsp;&nbsp;iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT<br />
&nbsp;&nbsp;iptables -A INPUT -i eth0 -m state --state NEW,INVALID -j DROP</p>
<p mso-char-indent-count:="" text-indent:="">&nbsp;</p>
<p mso-char-indent-count:="" text-indent:="">ipdrop <br />
如果能创建一个特殊的&quot;ipdrop&quot;脚本，其被设计为能方便地插入一个规则来阻塞指定的IP，那么将上面的工作将非常容易。通过该脚本阻塞某个IP将 是非常容易的工作，只需要几秒钟就可以实现。而且通过该脚本还可以防止手工加入规则时容易出现的错误。因此阻塞黑客的攻击将变为确定其攻击源地址。然后通 过如下命令： <br />
<br />
# ipdrop 129.24.8.1 on <br />
IP 129.24.8.1 drop on. <br />
ipdrop脚本将立即阻塞129.24.8.1。通过使用该脚本能显著地提高你的防卫能力。下面就是ipdrop脚本的实现： <br />
The ipdrop bash script <br />
<br />
#!/bin/bash <br />
source /usr/local/share/dynfw.sh <br />
args 2 $# &quot;${0} IPADDR {on/off}&quot; &quot;Drops packets to/from IPADDR. Good for obnoxious networks/hosts/DoS&quot; <br />
if [ &quot;$2&quot; == &quot;on&quot; ] <br />
then <br />
#rules will be appended or inserted as normal <br />
APPEND=&quot;-A&quot; <br />
INSERT=&quot;-I&quot; <br />
rec_check ipdrop $1 &quot;$1 already blocked&quot; on <br />
record ipdrop $1 <br />
elif [ &quot;$2&quot; == &quot;off&quot; ] <br />
then <br />
#rules will be deleted instead <br />
APPEND=&quot;-D&quot; <br />
INSERT=&quot;-D&quot; <br />
rec_check ipdrop $1 &quot;$1 not currently blocked&quot; off <br />
unrecord ipdrop $1 <br />
else <br />
echo &quot;Error: &quot;off&quot; or &quot;on&quot; expected as second argument&quot; <br />
exit 1 <br />
fi <br />
#block outside IP address thats causing problems <br />
#attackers incoming TCP connections will take a minute or so to time out, <br />
#reducing DoS effectiveness. <br />
iptables $INSERT INPUT -s $1 -j DROP <br />
iptables $INSERT OUTPUT -d $1 -j DROP <br />
iptables $INSERT FORWARD -d $1 -j DROP <br />
iptables $INSERT FORWARD -s $1 -j DROP <br />
echo &quot;IP ${1} drop ${2}.&quot; <br />
<br />
ipdrop:解释 <br />
从上面的脚本源代码中最后四行内容可以看到实际的命令是在防火墙表中插入适当的规则。可以看到$INSERT变量的值取决于在命令行参数中是使用&quot;on&quot;还是&quot;off&quot;模式。当iptables行被执行时特定的规则将被适当的插入或删除。 <br />
现在我们看看这些规则本身的功能，它们能和任何类型的防火墙一起发挥作用，甚至在没有部署防火墙的系统上。需要的条件仅仅是支持iptables的 Linux2.4版本的内核。我们阻塞来自恶意IP的攻击数据报(第一条iptables语句)，阻塞发向恶意攻击IP的数据报(第二条iptables 语句)，并且对该IP关闭任意方向的数据转发(最后两条iptables工具)。一旦这些规则发挥作用系统将丢弃满足这些条件的任何数据报。 <br />
另外一个需要注意的是：脚本中调用了&quot;rec_check&quot;, &quot;unrecord&quot;,  &quot;record&quot;,和&quot;args&quot;。这些都是定义在&quot;dynfw.sh&quot;中的特殊的bash函数。&quot;record&quot;函数实现将被阻塞的IP记录在文件 /root/.dynfw-ipdrop文件中，而&quot;unrecord&quot;则是将其从文件/root/.dynfw-ipdrop中去 除。&quot;rec_check&quot;函数是在发现试图重新阻塞某个已经阻塞的IP地址或取消某个没有被阻塞的IP地址时输出错误信息并停止脚本执行。&quot;args&quot; 函数实现确保命令行参数的正确性，并实现打印脚本帮助命令。文件dynfw-1.0.tar.gz包含所有的这些工具。 <br />
<br />
tcplimit <br />
<br />
如果你需要对某个特殊的基于TCP的网络服务的使用进行限制(例如在端系统上产生严重负载时)，则tcplimit脚本则可以帮助你达到这个目的，该脚本使用TCP端口、一个率值和&quot;on&quot;或&quot;off&quot;作为参数： <br />
<br />
# tcplimit 873 5 minute on <br />
Port 873 new connection limit (5/minute, burst=5) on. <br />
<br />
tcplimit使用iptables的&quot;state&quot;模块(应确保在内核中打开该选项或加载模块)来实现在某段时间内只允许特定数目的连接请求通过。 在本例中防火墙将限制每分钟只允许5个新连接到我的rsync服务器(port 873)。当然你可以根据需要选择时间单位为秒钟/分钟/小时。 <br />
tcplimit提供了一个限制对非关键服务的使用的非常好的方法－这样大量到非关键服务的数据不会破坏服务器。在上面的例子中使用tcplimit来 设置使用rsync的限制，以防止tsync数据占用了Internet连接的所有带宽。其中连接服务限制信息记录在文件/root/.dynfw- tcplimit中。若想关闭该限制只需要键入如下命令： <br />
<br />
# tcplimit 873 5 minute off <br />
Port 873 new connection limit off. <br />
<br />
tcplimit通过在&quot;filter&quot;表中创建一个新的规则链来实现。这个新的规则链将拒绝所有超过指定限制的数据报，同时将一个规则插入到 INPUT规则链中，其将所有的到目标端口(在本例中是873端口)的新连接数据报定向到这个新的规则链。新规则链只会影响新的超过限制的连接而不会影响 已经建立的连接。 <br />
当tcplimit定义的规则被关闭，INPUT规则和新规则链则会被删除。象ipdrop一样其tcplimit可以和任何类型的防火墙一起工作。 <br />
<br />
host-tcplimit <br />
<br />
host-tcplimit和tcplimit非常类似，但是它是限制来自一个特定的IP的到服务器上某个特定端口的TCP连接数量。host- tcplimit在防止某个特定的人滥用你的网络资源时非常有用处。例如你维护有一个CVS服务器，有一天突然发现一个特殊的新开发者出现了，他好像建立 了一个脚本每十分钟更新它的资源。占用了大量的网络资源。 <br />
<br />
对于这种情况，使用host-tcplimit可以非常容易的解决问题： <br />
<br />
# host-tcplimit 1.1.1.1 2401 1 day on <br />
<br />
现在IP地址为1.1.1.1被限制为每天只能进行一次CVS连接从而节省了网络带宽。</p>]]></description>
		<category>网海拾贝</category>
		<guid>http://www.xklog.org/article/internet/Linux-SYN-attack.html</guid>
		<pubDate>Fri, 23 Jul 2010 15:30:24 +0000</pubDate>
	</item>

	
	<item>
		<title><![CDATA[CentOS命令提示符设定]]></title>
		<link>http://www.xklog.org/article/internet/CentOS-bash.html</link>
		<author>星空泪</author>
		<description><![CDATA[<pre>CentOS命令提示符更改设定方法：</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如现在是使用root用户：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;临时性使用直接执 行 <span style="color: rgb(255, 0, 0);"># PS1='[\u@\h \w \t *\#]\$空格' </span>， 执行之后结果为---&gt;&gt; <span style="color: rgb(255, 0, 0);">[root@test2  /var/local 15:59:06 *4]# </span>（这当root用户退出后即将失效）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;若想永久保存 <span style="color: rgb(255, 0, 0);">[root@test2 /var/local 15:59:06 *4]# </span>这 种格式，那么把<span style="color: rgb(255, 0, 0);">PS1=&lsquo;[\u@\h \w \t *\#]\$空格&rsquo; </span>， 加到 vi /root/.bashrc里重启即可。</p>
<p><span style="color: rgb(128, 0, 0);"><span style="font-size: small;"><strong>【所对应参数解析】：&nbsp;</strong></span>&nbsp;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<ul>
    <li>\d ∶代表日期，格式为 Weekday Month Date，例如 &quot;Mon Aug 1&quot;</li>
    <li>\H  ∶完整的主机名称。举例来说，鸟哥的练习机 linux.dmtsai.tw ，那么这个主机名称就是 linux.dmtsai.tw</li>
    <li>\h ∶仅取主机名称的第一个名字。以上述来讲，就是 linux 而已， .dmtsai.tw 被省略。</li>
    <li>\t  ∶显示时间，为 24 小时格式，如∶ HH:MM:SS</li>
    <li>\T ∶显示时间，12 小时的时间格式！</li>
    <li>\A  ∶显示时间，24 小时格式， HH:MM</li>
    <li>\u ∶目前使用者的帐号名称；</li>
    <li>\v ∶BASH  的版本资讯；</li>
    <li>\w ∶完整的工作目录名称。家目录会以 ~ 取代；</li>
    <li>\W ∶利用 basename  取得工作目录名称，所以仅会列出最后一个目录名。</li>
    <li>\# ∶下达的第几个指令。</li>
    <li>\$  ∶提示字元，如果是 root 时，提示字元为 # ，否则就是 $ ～</li>
</ul>]]></description>
		<category>网海拾贝</category>
		<guid>http://www.xklog.org/article/internet/CentOS-bash.html</guid>
		<pubDate>Mon, 19 Jul 2010 19:38:18 +0000</pubDate>
	</item>

	
	<item>
		<title><![CDATA[利用AJAX模拟HTTP长连接(LongPoll)来实现”服务器推”技术]]></title>
		<link>http://www.xklog.org/article/internet/comet-ajax-longpoll-push.html</link>
		<author>星空泪</author>
		<description><![CDATA[<blockquote>
<p>Comet（彗星：某人给服务器推送技术起的名字）</p>
</blockquote>
<p><strong>核心图解：</strong><br />
<img src="/upload/201007/2010071203453956.jpg" alt="" /></p>
<blockquote>
<p>最近在看&ldquo;服务器推送技术&rdquo;，在B/S结构中，通过某种magic使得客户端不需要通过轮询即可以得到服务端的最新信息 （比如股票价格，聊天室，webQQ、开心网、白社会），这样可以节省大量的带宽。</p>
<p>传统的轮询技术对服务器的压力很大，并且造成带宽的极大浪费。如果改用ajax轮询，可以降低带宽的负荷（因为服务器返回的不是完整页面），但是对 服务器的压力并不会有明显的减少。</p>
<p>而推技术（push）可以改善这种情况。但因为HTTP连接的特性（短暂，必须由客户端发起），使得推技术的实现比较困难，常见的做法是通过延长 http连接的寿命，来实现push。</p>
</blockquote>
<p><strong>基本实现原理：</strong></p>
<blockquote>
<p>接下来自然该讨论如何延长http连接的寿命，最简单的自然是死循环法，如果使用观察者模式则可以进一步提高性能。</p>
<p>但是这种做法的缺点在于客户端请求了这个servlet后，web服务器会开启一个线程执行servlet的代码，而servlet由迟迟不肯结 束，造成该线程也无法被释放。于是乎，一个客户端一个线程，当客户端数量增加时，服务器依然会承受很大的负担。</p>
<p>要从根本上改变这个现象比较复杂，目前的趋势是从web服务器内部入手，用nio（JDK  1.4提出的java.nio包）改写request/response的实现，再利用线程池增强服务器的资源利用率，从而解决这个问题，目前支持这一非 J2EE官方技术的服务器有Glassfish和Jetty。目前也有一些框架/工具可以帮助你实现推功能，比如pushlets。不过没有深入研究。还 有就是通过设置超时来解决。</p>
</blockquote>
<p><strong>在客户和服务器之间保持&ldquo;心跳&rdquo;信息 &mdash;&ndash;无事件导致超时处理：</strong></p>
<blockquote>
<p>因为服务器为了保持请求（阻塞请求），必须有一个无限循环，循环的结束条件就是获取到了返回结果，如果客户端关闭了（客户 端浏览器的关闭不会发消息给服务器），服务器无法知道客户端已经关了，这个请求没必要处理下去了，最终会造成资源过度浪费。还有服务器中间可能存在各式各 样配置怪异的网关和代理，它们上面可能有各式各样的超时规则，因此Comet最好设计为定期重连。只要用一个折中的办法，限制超时时间。一般情况下，如果 30秒没有任何事件发生，服务器端就应该通知客户端确实没有事件发生，结束掉本次请求，然后重新开始一次新的请求以便继续等待。这里可以不必设置客户端 ajax的超时时间，但进行请求的时候传递一个超时值给服务器，服务器在处理的时候，如果超时时间到了的话，还没有客户端需要的结果，这时传递一个超时信 息给客户端，客户端接收到了此信息，根据情况重新进行ajax请求，也就是进入下一个轮询&hellip;&hellip;&hellip;.当服务器处理信息出现异常情况，需要发送错误信息通知客 户端，同时释放资源、关闭连接。</p>
</blockquote>
<p><strong>服务器端事件队列管理以及如何保持可靠的消息队列:</strong></p>
<blockquote>
<p>由于ajax的LongPoll是拉的方式(不同的客户端拉取的参数可以根据客户端不同而不同)，服务器端根据客户选择的 方式在读取事件队列（fetchEvents）时进行不同的处理，会把&ldquo;heartbeat&rdquo;与&ldquo;refresh&rdquo;事件一起传给客户端，通知客户端重新发 出请求、建立连接。拉的同时也解决了发送目标的返回值。</p>
<p>在这里我们可以想象一个可能发生的情况，服务器端向你发送一个消息，你没有成功接收，但是服务器端认为发送了就成功了，消息从队列删除了，然后这个 消息就永久丢失掉了。可能有人会强调TCP多么可靠，服务器端发送的消息如果在TCP的层面发生问题了，肯定会引发Socket级别的 Exception，这个Exception冒泡上来，服务器端就能截获，从而得知发送失败，然后先不删除队首消息。可是别忘了，中间是可能存在代理的， 如果代理成功把消息收回去了，可是代理发送到客户端这一步失败了，服务器端就不一定会发生异常了。</p>
<p>因此，我们需要制定一种策略，来确保下行消息总能发送到客户端。在这里，我们选择了引入逐个ACK的机制，来确认消息的接收。也就是说，服务器端发 送给客户端的消息带有一个序号，在客户端收到消息后就将该序号发回给服务器端，已确认它受到了该消息。在下次请求时就将该序号加1的值通过 sequence参数传递回去，让服务器知道我们期望下一条消息的编号是这个。例如我们收到Message，其Sequence属性为836，那么下一次 调用的时候就传给服务器837。服务器端此时应该保留了编号为836的Message在对首，如果客户端继续请求836号消息，证明它上次没收到，这次仍 然发送836号消息给它；如果客户端请求837号消息，证明它成功收到836号消息的，这次就发送837号消息给它。看到这里是不是感觉有点熟悉了，不 错，这有点类似经典的TCP三握手原理。如果都不是，那该怎么办？那意味着，这是一个错误的请求，甚至可能是攻击请求，因为正常情况下不应该出现这样的请 求的，服务器端可以考虑抛个无关紧要的Exception（不要告诉攻击者你知道他在攻击了），甚至直接给个400 （bad  request）的响应代号。</p>
</blockquote>
<p><strong>国外一个简单的聊天室例子：</strong><br />
我们需要4个文件:<br />
A file to exchange data (data.txt)<br />
A PHP script that will handle the persistent http request (backend.php)<br />
A HTML file that will load Javascript code and that will show the data  coming from the server (index.html)<br />
The prototype library that will help us to write simple JS code</p>
<p><strong>服务端backend.php：</strong><br />
做2件事：<br />
Write into &ldquo;data.txt&rdquo; when new messages are sent<br />
Do an infinite loop as long as &ldquo;data.txt&rdquo; file is unchanged</p>
<div class="hl-surround">
<div class="hl-main"><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"><br />
&nbsp;<br />
&nbsp; </span><span style="color: rgb(0, 0, 139);">$filename</span><span style="color: Gray;">&nbsp; = </span><span style="color: Blue;">dirname</span><span style="color: Olive;">(</span><span style="color: Green;">__FILE__</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: rgb(139, 0, 0);">'</span><span style="color: Red;">/data.txt</span><span style="color: rgb(139, 0, 0);">'</span><span style="color: Gray;">;<br />
&nbsp;<br />
&nbsp; </span><span style="color: rgb(255, 165, 0);">// store new message in the file</span><span style="color: Gray;"><br />
&nbsp; </span><span style="color: rgb(0, 0, 139);">$msg</span><span style="color: Gray;"> = </span><span style="color: Green;">isset</span><span style="color: Olive;">(</span><span style="color: rgb(0, 0, 139);">$_GET</span><span style="color: Olive;">[</span><span style="color: rgb(139, 0, 0);">'</span><span style="color: Red;">msg</span><span style="color: rgb(139, 0, 0);">'</span><span style="color: Olive;">])</span><span style="color: Gray;"> ? </span><span style="color: rgb(0, 0, 139);">$_GET</span><span style="color: Olive;">[</span><span style="color: rgb(139, 0, 0);">'</span><span style="color: Red;">msg</span><span style="color: rgb(139, 0, 0);">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> : </span><span style="color: rgb(139, 0, 0);">''</span><span style="color: Gray;">;<br />
&nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: rgb(0, 0, 139);">$msg</span><span style="color: Gray;"> !=  </span><span style="color: rgb(139, 0, 0);">''</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />
&nbsp; </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />
&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">file_put_contents</span><span style="color: Olive;">(</span><span style="color: rgb(0, 0, 139);">$filename</span><span style="color: Gray;">,</span><span style="color: rgb(0, 0, 139);">$msg</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />
&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">die</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />
&nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;"><br />
&nbsp;<br />
&nbsp; </span><span style="color: rgb(255, 165, 0);">// infinite loop until the data file is not modified</span><span style="color: Gray;"><br />
&nbsp; </span><span style="color: rgb(0, 0, 139);">$lastmodif</span><span style="color: Gray;">&nbsp; &nbsp; = </span><span style="color: Green;">isset</span><span style="color: Olive;">(</span><span style="color: rgb(0, 0, 139);">$_GET</span><span style="color: Olive;">[</span><span style="color: rgb(139, 0, 0);">'</span><span style="color: Red;">timestamp</span><span style="color: rgb(139, 0, 0);">'</span><span style="color: Olive;">])</span><span style="color: Gray;"> ? </span><span style="color: rgb(0, 0, 139);">$_GET</span><span style="color: Olive;">[</span><span style="color: rgb(139, 0, 0);">'</span><span style="color: Red;">timestamp</span><span style="color: rgb(139, 0, 0);">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> : </span><span style="color: Maroon;">0</span><span style="color: Gray;">;<br />
&nbsp; </span><span style="color: rgb(0, 0, 139);">$currentmodif</span><span style="color: Gray;"> = </span><span style="color: Blue;">filemtime</span><span style="color: Olive;">(</span><span style="color: rgb(0, 0, 139);">$filename</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />
&nbsp; </span><span style="color: Green;">while</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: rgb(0, 0, 139);">$currentmodif</span><span style="color: Gray;"> &lt;= </span><span style="color: rgb(0, 0, 139);">$lastmodif</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: rgb(255, 165, 0);">// check if the data file has been  modified</span><span style="color: Gray;"><br />
&nbsp; </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />
&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">usleep</span><span style="color: Olive;">(</span><span style="color: Maroon;">10000</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: rgb(255, 165, 0);">//  sleep 10ms to unload the CPU</span><span style="color: Gray;"><br />
&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">clearstatcache</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />
&nbsp;&nbsp; &nbsp;</span><span style="color: rgb(0, 0, 139);">$currentmodif</span><span style="color: Gray;"> = </span><span style="color: Blue;">filemtime</span><span style="color: Olive;">(</span><span style="color: rgb(0, 0, 139);">$filename</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />
&nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;"><br />
&nbsp;<br />
&nbsp; </span><span style="color: rgb(255, 165, 0);">// return a json array</span><span style="color: Gray;"><br />
&nbsp; </span><span style="color: rgb(0, 0, 139);">$response</span><span style="color: Gray;"> = </span><span style="color: Green;">array</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />
&nbsp; </span><span style="color: rgb(0, 0, 139);">$response</span><span style="color: Olive;">[</span><span style="color: rgb(139, 0, 0);">'</span><span style="color: Red;">msg</span><span style="color: rgb(139, 0, 0);">'</span><span style="color: Olive;">]</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp;= </span><span style="color: Blue;">file_get_contents</span><span style="color: Olive;">(</span><span style="color: rgb(0, 0, 139);">$filename</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />
&nbsp; </span><span style="color: rgb(0, 0, 139);">$response</span><span style="color: Olive;">[</span><span style="color: rgb(139, 0, 0);">'</span><span style="color: Red;">timestamp</span><span style="color: rgb(139, 0, 0);">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: rgb(0, 0, 139);">$currentmodif</span><span style="color: Gray;">;<br />
&nbsp; </span><span style="color: Green;">echo</span><span style="color: Gray;"> </span><span style="color: Blue;">json_encode</span><span style="color: Olive;">(</span><span style="color: rgb(0, 0, 139);">$response</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />
&nbsp; </span><span style="color: Blue;">flush</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />
&nbsp;<br />
&nbsp; </span><span style="color: Blue;">?&gt;</span></div>
</div>
<p>客户端index.html：</p>
<div class="hl-surround">
<div class="hl-main"><span style="color: Olive;">&lt;</span><span style="color: Gray;">!</span><span style="color: rgb(0, 0, 139);">DOCTYPE</span><span style="color: Gray;">  </span><span style="color: rgb(0, 0, 139);">html</span><span style="color: Gray;"> </span><span style="color: rgb(0, 0, 139);">PUBLIC</span><span style="color: Gray;"> </span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Red;">-//W3C//DTD XHTML 1.1//EN</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Gray;"> </span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Red;">http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />
&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">html</span><span style="color: Gray;"> </span><span style="color: rgb(0, 0, 139);">xmlns</span><span style="color: Gray;">=</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Red;">http://www.w3.org/1999/xhtml</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />
&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">head</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />
&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">title</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Comet demo</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">title</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />
&nbsp;<br />
&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">meta</span><span style="color: Gray;"> </span><span style="color: rgb(0, 0, 139);">http-equiv</span><span style="color: Gray;">=</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Red;">Content-Type</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Gray;"> </span><span style="color: rgb(0, 0, 139);">content</span><span style="color: Gray;">=</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Red;">text/html;  charset=utf-8</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span><span style="color: Gray;"><br />
&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">script</span><span style="color: Gray;"> </span><span style="color: rgb(0, 0, 139);">type</span><span style="color: Gray;">=</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Red;">text/javascript</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Gray;"> </span><span style="color: rgb(0, 0, 139);">src</span><span style="color: Gray;">=</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Red;">prototype.js</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Olive;">&gt;&lt;/</span><span style="color: Green;">script</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />
&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">head</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />
&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">body</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />
&nbsp;<br />
&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">div</span><span style="color: Gray;"> </span><span style="color: rgb(0, 0, 139);">id</span><span style="color: Gray;">=</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Red;">content</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />
&nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">div</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />
&nbsp;<br />
&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">p</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />
&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">form</span><span style="color: Gray;"> </span><span style="color: rgb(0, 0, 139);">action</span><span style="color: Gray;">=</span><span style="color: rgb(139, 0, 0);">&quot;&quot;</span><span style="color: Gray;"> </span><span style="color: rgb(0, 0, 139);">method</span><span style="color: Gray;">=</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Red;">get</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Gray;"> </span><span style="color: rgb(0, 0, 139);">onsubmit</span><span style="color: Gray;">=</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Red;">comet.doRequest($('word').value);$('word').value='';return  false;</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />
&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">input</span><span style="color: Gray;"> </span><span style="color: rgb(0, 0, 139);">type</span><span style="color: Gray;">=</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Red;">text</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Gray;"> </span><span style="color: rgb(0, 0, 139);">name</span><span style="color: Gray;">=</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Red;">word</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Gray;"> </span><span style="color: rgb(0, 0, 139);">id</span><span style="color: Gray;">=</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Red;">word</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Gray;"> </span><span style="color: rgb(0, 0, 139);">value</span><span style="color: Gray;">=</span><span style="color: rgb(139, 0, 0);">&quot;&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span><span style="color: Gray;"><br />
&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">input</span><span style="color: Gray;"> </span><span style="color: rgb(0, 0, 139);">type</span><span style="color: Gray;">=</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Red;">submit</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Gray;"> </span><span style="color: rgb(0, 0, 139);">name</span><span style="color: Gray;">=</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Red;">submit</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Gray;"> </span><span style="color: rgb(0, 0, 139);">value</span><span style="color: Gray;">=</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Red;">Send</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span><span style="color: Gray;"><br />
&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">form</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />
&nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">p</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />
&nbsp;<br />
&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">script</span><span style="color: Gray;"> </span><span style="color: rgb(0, 0, 139);">type</span><span style="color: Gray;">=</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Red;">text/javascript</span><span style="color: rgb(139, 0, 0);">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />
&nbsp; var Comet = Class.create();<br />
&nbsp;  Comet.prototype = {<br />
&nbsp;<br />
&nbsp;&nbsp; &nbsp;timestamp: 0,<br />
&nbsp;&nbsp; &nbsp;url:  './backend.php',<br />
&nbsp;&nbsp; &nbsp;noerror: true,<br />
&nbsp;<br />
&nbsp;&nbsp; &nbsp;initialize:  function() { },<br />
&nbsp;<br />
&nbsp;&nbsp; &nbsp;connect: function()<br />
&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp;  &nbsp;this.ajax = new Ajax.Request(this.url, {<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;method: 'get',<br />
&nbsp;&nbsp;  &nbsp; &nbsp; &nbsp;parameters: { 'timestamp' : this.timestamp },<br />
&nbsp;&nbsp; &nbsp; &nbsp;  &nbsp;onSuccess: function(transport) {<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// handle the server  response<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;var response = transport.responseText.evalJSON();<br />
&nbsp;&nbsp;  &nbsp; &nbsp; &nbsp; &nbsp;this.comet.timestamp = response['timestamp'];<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;  &nbsp;this.comet.handleResponse(response);<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.comet.noerror =  true;<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;},<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;onComplete: function(transport) {<br />
&nbsp;&nbsp; &nbsp;  &nbsp; &nbsp; &nbsp;// send a new ajax request when this request is finished<br />
&nbsp;&nbsp; &nbsp; &nbsp;  &nbsp; &nbsp;if (!this.comet.noerror)<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// if a connection problem  occurs, try to reconnect each 5 seconds<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  &nbsp;setTimeout(function(){ comet.connect() }, 5000); <br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else<br />
&nbsp;&nbsp;  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.comet.connect();<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.comet.noerror = false;<br />
&nbsp;&nbsp;  &nbsp; &nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp; &nbsp;});<br />
&nbsp;&nbsp; &nbsp; &nbsp;this.ajax.comet = this;<br />
&nbsp;&nbsp; &nbsp;},<br />
&nbsp;<br />
&nbsp;&nbsp;  &nbsp;disconnect: function()<br />
&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp;},<br />
&nbsp;<br />
&nbsp;&nbsp; &nbsp;handleResponse:  function(response)<br />
&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp; &nbsp;$('content').innerHTML += '</span><span style="color: Olive;">&lt;</span><span style="color: Green;">div</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">' +  response['msg'] + '</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">div</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">';<br />
&nbsp;&nbsp; &nbsp;},<br />
&nbsp;<br />
&nbsp;&nbsp; &nbsp;doRequest:  function(request)<br />
&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp; &nbsp;new Ajax.Request(this.url, {<br />
&nbsp;&nbsp; &nbsp;  &nbsp; &nbsp;method: 'get',<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;parameters: { 'msg' : request <br />
&nbsp;&nbsp; &nbsp;  &nbsp;});<br />
&nbsp;&nbsp; &nbsp;}<br />
&nbsp; }<br />
&nbsp; var comet = new Comet();<br />
&nbsp; comet.connect();<br />
&nbsp;  </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">script</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />
&nbsp;<br />
&nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">body</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />
&nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">html</span><span style="color: Olive;">&gt;</span></div>
</div>
<p>例子完整源码下载：<span class="download"><a target="_blank" href="/upload/201007/2010071203500842.gz">点击这里下载(tar.gz)</a></span><a href="http://www.zeitoun.net/_media/articles/comet_and_php/comet-ajax.tar.gz"></a></p>
<p>你可以用浏览器打开多个index.html，你在其中一个页面提交的聊天内容同时也被推到其他的页面。<br />
这只是一个推的简单的例子，关于超时处理的相关功能就不贴了，自己研究。</p>
<blockquote>
<p>总之。ajax模拟http长连接就是在第一次ajax发出请求的时候，服务端一直在等待有更新的数据，当然在等待过程中 你可以加入超时重新开始下一个轮询来降低服务器压力(见上面的核心图)。</p>
</blockquote>
<p><strong>参考文章：</strong><br />
<a href="http://www.ibm.com/developerworks/cn/websphere/techjournal/0711_col_burckart/0711_col_burckart.html">Erik  Burckart：Comet 的诱惑</a><br />
<a href="http://www.ibm.com/developerworks/cn/web/wa-lo-comet/">Comet：基于  HTTP 长连接的&ldquo;服务器推&rdquo;技术</a><br />
<a href="http://www.zeitoun.net/articles/comet_and_php/start">How to  implement COMET with PHP</a></p>]]></description>
		<category>网海拾贝</category>
		<guid>http://www.xklog.org/article/internet/comet-ajax-longpoll-push.html</guid>
		<pubDate>Mon, 12 Jul 2010 03:45:00 +0000</pubDate>
	</item>

	
	<item>
		<title><![CDATA[删除 .SVN 目录]]></title>
		<link>http://www.xklog.org/article/internet/delete-svn-dir.html</link>
		<author>星空泪</author>
		<description><![CDATA[<p>在项目开发和日常文档管理时，用到了SVN，由于要把一些文档发给同事，这时想删除SVN版本信息文件，于是上网在SVN中文论坛找到了一份资料： <br />
<br />
删除&nbsp; .svn 文件 <br />
<br />
一、在linux下  <br />
<br />
删除这些目录是很简单的，命令如下  <br />
find . -type d -name &quot;.svn&quot;|xargs rm -rf  <br />
<br />
或者  <br />
<br />
find . -type d -iname &quot;.svn&quot; -exec rm -rf {} \;&nbsp;&nbsp;  <br />
<br />
<br />
二、在windows下用以下法子：  <br />
<br />
1、在项目平级的目录，执行dos命令：  <br />
xcopy project_dir project_dir_1 /s /i  <br />
<br />
2、或者在项目根目录执行以下dos命令  <br />
for /r . %%a in (.) do @if exist &quot;%%a\.svn&quot; rd /s /q &quot;%%a\.svn&quot;  <br />
<br />
其实第二种方法可以用来干很多事的，比如把代码中的.svn替换为任意其他文件名并在硬盘根目录下执行，就可以从硬盘上删除所有的这个文件啦。  <br />
<br />
3、添加注册表(亲自动手测试过)  <br />
可以将&ldquo;快速删除SVN版本信息&rdquo;命名增加到资源管理器的右键上，这样，鼠标点两下就能把选中目录下的所有.svn目录干掉了。 <br />
<br />
代码为：  <br />
<br />
Windows Registry Editor Version 5.00  <br />
<br />
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN]  <br />
@=&quot;快速删除SVN版本信息&quot;  <br />
<br />
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN\command]   <br />
@=&quot;cmd.exe /c D:\工具\批处理文件删除SVN版本信息.bat&quot;  <br />
将这段代码保存为一个.reg文件，双击确认导入注册表中不完整，后来自己手工添加。注意：文件&ldquo;批处理文件删除SVN版本信息.bat&rdquo;不能放 在有空格的文件夹下，确认删除时请看一下当前目录不要删除不该删的目录下的SVN版本信息。不知道怎么改进&ldquo;cmd.exe /c  D:\工具\批处理文件删除SVN版本信息.bat&rdquo;。 <br />
<br />
<br />
批处理文件删除SVN版本信息.bat文件内容如下： <br />
@echo off <br />
echo *********************************************************** <br />
echo  清除SVN版本信 息&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   <br />
echo *********************************************************** <br />
:start <br />
::启动过程，切换目录 <br />
:set pwd=%cd% <br />
:cd %1 <br />
echo 工作目录是：&amp; chdir <br />
:input <br />
::获取输入，根据输入进行处理 <br />
set source=: <br />
set /p source=确定要清楚当前目录下的.svn信息吗？[Y/N/Q]  <br />
set &quot;source=%source:&quot;=%&quot; <br />
if &quot;%source%&quot;==&quot;y&quot; goto clean  <br />
if &quot;%source%&quot;==&quot;Y&quot; goto clean  <br />
if &quot;%source%&quot;==&quot;n&quot; goto noclean  <br />
if &quot;%source%&quot;==&quot;N&quot; goto noclean  <br />
if &quot;%source%&quot;==&quot;q&quot; goto end <br />
if &quot;%source%&quot;==&quot;Q&quot; goto end <br />
goto input <br />
:clean <br />
::主处理过程，执行清理工作 <br />
@echo on <br />
@for /d /r %%c in (.svn) do @if exist %%c ( rd /s /q %%c &amp;  echo&nbsp;&nbsp;&nbsp; 删除目录%%c) <br />
@echo off <br />
echo &quot;当前目录下的svn信息已清除&quot; <br />
goto end <br />
:noclean <br />
::分支过程，取消清理工作 <br />
echo &quot;svn信息清楚操作已取消&quot; <br />
goto end <br />
:end <br />
::退出程序 <br />
cd &quot;%pwd%&quot; <br />
pause</p>]]></description>
		<category>网海拾贝</category>
		<guid>http://www.xklog.org/article/internet/delete-svn-dir.html</guid>
		<pubDate>Sun, 27 Jun 2010 01:40:51 +0000</pubDate>
	</item>

	
	<item>
		<title><![CDATA[哆啦A梦告诉你目前各家浏览器对 CSS3 的支持状况]]></title>
		<link>http://www.xklog.org/article/internet/doraemon-shows-you-how-well-your-browser-is-doing-css3.html</link>
		<author>星空泪</author>
		<description><![CDATA[<p><img width="500" src="/upload/201005/2010052116053066.png" alt="" /><br />
上面的图是某日本神人用 CSS3 画的。四个浏览里面 Chrome 的支持度最高，不仅圆角、阴影一应俱全，甚至连眼睛都还会动  @@。Firefox 3.6 次之，除了眼睛不会动之外都和 Chrome 相当，Opera 则是少了阴影。<br />
<br />
至于 IE8... 呃... IE9 什么时候出来？<br />
<br />
大家可以到 <a href="http://knb.im/css3/" target="_blank">http://knb.im/css3/</a>， 自已看看你现在用的浏览器画出来的效果喔！</p>]]></description>
		<category>网海拾贝</category>
		<guid>http://www.xklog.org/article/internet/doraemon-shows-you-how-well-your-browser-is-doing-css3.html</guid>
		<pubDate>Fri, 21 May 2010 16:07:03 +0000</pubDate>
	</item>

	
	<item>
		<title><![CDATA[再会，谷歌]]></title>
		<link>http://www.xklog.org/article/internet/google-see-you-later.html</link>
		<author>星空泪</author>
		<description><![CDATA[<p>　　<font face="宋体">谷歌决定离开中国内地，其办事处要搬到香港了，扰攘了数个月的&ldquo;谷歌退出中国 内地事件&rdquo;终于走到了作为一个以网络为获取信息最重要来源的网民最不想看到的结局。从此，可能也就不会再有那个并不被人所喜欢的音译公司&ldquo;谷歌&rdquo;，而是还 原成为那个我们曾经亲切的称呼其为&ldquo;狗狗&rdquo;的外国公司。</font></p>
<p>　　<font face="宋体">这家叫做&ldquo;GOOGLE&rdquo;的公司撤离中国的理由很是古怪，他们认为信息是需要自由流动的，除了某些大家能够认可的、都觉得不能随便传播的信息之外，其他信息最好都能自由的被搜索到，并且被传达到每个希望找到它们的人手里。不能完全做到这点，宁可不要在这里做生意。</font></p>
<p>　　<font face="宋体">这种说法大概是源自一个很有趣的理论。这个理论认为，促使人类进步、追求知识、寻求权利的路，其实就是一条寻求信 息对等传播、广泛传播的道路。该理论的依据是历史的发展。印刷术的发展，使得知识的传播成为可能，西方的文艺复兴时期开始启蒙运动，正是借助这种在当时来 说可以迅速传播思想的手段，冲破了中世纪以来教会所垄断的知识与对于知识的解释，最终结束了黑暗的中世纪。</font></p>
<p>　　<font face="宋体">人类对于信息传播的历史还不止这些。自从有了报纸，信息的传播更加快捷，经过最初的阵痛之后，新闻媒体成为社会的 良心，记者甚至被称为&ldquo;无冕之王&rdquo;，极大的促进了人类社会的公平与进步。当传播更为快捷的广播、电视出现之后，更多的人了解了世界上发生的大事，以及自己 身旁的种种状况，更是使得公众对于社会的发言权有了更大的提高。对比越战与海湾战争来看，后者被称作是在电视镜头下的战争，一切都暴露在光天化日之下。</font></p>
<p>　　<font face="宋体">互联网的出现，再次从根本上改变了信息传播的方式与渠道。原本由精英掌握的信息传播决定权，现在已经部分掌握在了 普罗大众的手中。在报纸、广播、电视的时代里，你想读到或者看到什么，都是要经过编辑们或者是操控编辑的那种力量所准许的，而在网络的时代当中，只要你是 个有心人，必然会在网络上找到任何感兴趣的资讯。</font></p>
<p>　　<font face="宋体">而网络的出现，已经极大的缩短了人类寻找合适信息的时间与成本，搜索引擎就是做这个的。基于搜索引擎开发出的种种 业务，使得信息具有更加多元的面貌。这也正是这家叫做&ldquo;GOOGLE&rdquo;的公司正在做的事情。但很遗憾的是，他们很多具有极高应用性的产品，由于众所周之的 原因而无法在中国内地落地，给网民带来更多的应用与便捷。</font></p>
<p>　　<font face="宋体">至于说&ldquo;GOOGLE&rdquo;所秉持的这种理论，以及由此而产生的某些做法是否合适，相信时间会作出最好的回答。但是我 们要知道一点，自从信息革命以来，我们的知识储备以数年为基准的翻倍增长当中。自外于这个潮流之外，使得这个世界上最先进的搜索引擎提供者离开中国，我们 失去的就不止是一个商业公司，而是再次失去了一次与世界同步的机会。靠山寨版的&ldquo;谷歌&rdquo;是不能催生出一家具有社会责任的&ldquo;GOOGLE&rdquo;的。</font></p>
<p>　　<font face="宋体">我们曾经在最紧要的关头错失过很多次机会，近代以来，这种境况尤其严重。几乎在每个能够改变国运的关头，我们的选择在历史的角度看都是一种不可思议的失误。这次是不是还会重演这种选择？这个还是请历史来回答吧。</font></p>]]></description>
		<category>网海拾贝</category>
		<guid>http://www.xklog.org/article/internet/google-see-you-later.html</guid>
		<pubDate>Tue, 23 Mar 2010 12:50:28 +0000</pubDate>
	</item>

	
	<item>
		<title><![CDATA[60多年过去了，有几个中国人知道]]></title>
		<link>http://www.xklog.org/article/internet/60-years-have-gone-how-many-chinese-know.html</link>
		<author>星空泪</author>
		<description><![CDATA[<p><font color="#000080">无关政治，只是觉得我们应当，铭记所有曾经为中华民族的自由与荣耀而浴血奋战的英雄们。</font></p>
<p>60多年过去了，蒋介石动用70万国军发动了淞沪会战。在会战中，国军空军炸毁日本海军陆战队司令部，炸沉日本海军第3舰队旗舰，国军陆军为补充战损而五次发布动员令，超过半数的团职以上高级将领以身殉国。淞沪会战未能阻止日军占领上海，却改变了日军在中国战场的战略部署，还为上海资本向西转移赢得三个月时间。</p>
<p>60多年过去了，有几个中国人知道：最让外国人刮目相看的不是叶挺的新四军，而是孙立人的新一军。新一军远征缅甸，以伤亡1.7万人的代价击毙击伤日军10.9万人。在新一军攻占缅甸重镇于邦的时候，下属向孙立人询问如何处理日军战俘，孙将军的回答是：你去问问那些狗za种，都谁到过中国，到过中国的就地枪毙，以后都这样办。<br />
<br />
60多年过去了，有几个中国人知道：八路军在平型关大捷中只不过是消灭了一支日军运输队。而且平型关大捷只是平型关战役的一部分，平型关战役又是太原会战的一部分。</p>
<p>60多年过去了，有几个中国人知道：李向阳和他的游击队是虚构的，真正让日军闻风丧胆的军队是国军的委员长卫队。这支军队使用德军的装备，甚至有德军教官亲手指导。在南京雨花台，委员长卫队的两个营独自阻击日军一个甲种师团（在第二次世界大战中，日军一共只有六个甲种师团），平均每个士兵要坚守25米长的阵地，面对50名日军精锐部队的士兵，但胜利者依然是中国人。</p>
<p>60多年过去了，有几个中国人知道：在影视作品中恶贯满盈的张灵甫是抗战英雄。在长沙会战中，他率领敢死队包抄小道，夜夺张古峰，为国军成功阻击日军立下汗马功劳。张灵甫还为抗战丢了一条腿。</p>
<p>60 多年过去了，有几个中国人知道：在常德保卫战中，74军57师的8000名官兵阻击10万日军15天之久，最后只有200人能够战斗。师长发出了74军 57师最后一封电报：弹尽，援绝，人无，城已破。职率副师长、师附、政治部主任、参谋部主任死守中央银行，各团长划分区域，扼守一屋，作最后抵抗，誓死为止，并祝胜利。</p>
<p>60多年过去了，有几个中国人知道在武汉上空爆发过持续时间仅次于不列颠空战的武汉空战。那场空战中，国军空军击落日军飞机78架，炸沉日军舰艇23艘。那个时候，每当防空警报响起，很多武汉市民不是钻进防空洞，而是爬上房顶，为的是能看到日军飞机被击落的场景。</p>
<p>60多年过去了，有几个中国人知道在重庆有17家军工厂在敌机轰炸下坚持24小时不间断生产。以金陵军工厂为例，抗战期间共生产迫击炮7000门、重机枪1.8万挺、步枪28万支、手榴弹30万枚、炸药包20万个。</p>
<p>60多年过去了，有几个中国人知道日军投降书是什么样子。为什么某D只宣传9.18日军侵华而不宣传8.15日军投降，不让国民看看日军投降书？难道仅仅是因为文中多次出现：日本陆海空军及其辅助部队向蒋委员长投降。或者是因为受降落款是：中国战区最高统帅特级上将蒋中正特派代表陆军一级上将何应钦。</p>
<p>要知道，伟大的中国卫国战争是世界四大反法西斯战争之一！战争期间，国军陆军有3211418名官兵壮烈牺牲，其中包括8名上将，41名中将，71名少将。国军空军有6164名飞行员血洒长空，2468架战机被击落。国军海军全军覆没，所有舰艇全部打光。</p>
<p>向所有为中华民族的生存与尊严而战斗过的人致敬!<br />
<br />
历史是真实发生的，不是靠教科书宣传的，了解历史，是反思过去的基础，一个不懂自己国家民族历史的民族是没有希望的民族。</p>]]></description>
		<category>网海拾贝</category>
		<guid>http://www.xklog.org/article/internet/60-years-have-gone-how-many-chinese-know.html</guid>
		<pubDate>Fri, 12 Mar 2010 21:04:21 +0000</pubDate>
	</item>

	
	<item>
		<title><![CDATA[前耶鲁大学校长：中国大学是世界最大的笑话]]></title>
		<link>http://www.xklog.org/article/internet/china-university-the-biggest-joke-in-the-world.html</link>
		<author>星空泪</author>
		<description><![CDATA[<p>　　曾任耶鲁大学校长的小贝诺&bull;施密德特，日前在耶鲁大学学报上公开撰文批判中国大学，引起了美国教育界人士对中国大学的激烈争论。</p>
<p>　　1、针对中国大学近年来久盛不衰的&ldquo;做大做强&rdquo;之风。施密德特说：&ldquo;他们以为对出类拔萃的要求只是多：课程多，老师多，<span onclick="sendmsg('pw_ajax.php','action=relatetag'amp;tagname=学生',this.id)" style="border-bottom: 1px solid rgb(250, 137, 27); cursor: pointer;" id="rlt_2">学生</span>多， 校舍多&rdquo;。&ldquo;他们的学者退休的意义就是告别糊口的讲台，极少数人对自己的专业还有兴趣，除非有利可图。他们没有属于自己真正意义上的事业。&rdquo;&ldquo;而校长的退 休，与官员的退休完全一样，他们必须在退休前利用自己权势为子女谋好出路。&rdquo;&ldquo;新中国没有一个教育家，而民国时期的教育家灿若星海。&rdquo;</p>
<p>　　2、针对于通过中国政府或下属机构&ldquo;排名&rdquo;、让中国知名大学跻身&ldquo;世界百强&rdquo;的做法。施密德特引用基尔克加德的话说，它们在做&ldquo;自己屋子里的君主&rdquo;。&ldquo;他们把经济上的成功当成教育的成功，他们竟然引以为骄傲，这是人类文明史最大的<span onclick="sendmsg('pw_ajax.php','action=relatetag'amp;tagname=笑话',this.id)" style="border-bottom: 1px solid rgb(250, 137, 27); cursor: pointer;" id="rlt_5">笑话</span>。&rdquo;</p>
<p>　　3、针对中国大学近来连续发生师生&ldquo;血拼&rdquo;事件。施密德特认为这是大学教育的失败，因为&ldquo;大学教育解放了人的个性，培养了人的独立精神，它也同时增强了 人的集体主义精神，使人更乐意与他人合作，更易于与他人心息相通&rdquo;，&ldquo;这种精神应该贯穿于学生之间，师生之间&rdquo;。&ldquo;他们计划学术，更是把教研者当鞋匠。难 怪他们喜欢自诩为园丁。我们尊重名副其实的园丁，却鄙视一个没有自由思想独立精神的教师。&rdquo;</p>
<p>　　4、针对中国大学日益严重的&ldquo;官本 位&rdquo;体制。施密德特也深感担忧，他痛心地说：&ldquo;宙斯已被赶出天国，权力主宰一切&rdquo;。&ldquo;文科的计划学术，更是权力对于思考的祸害，这已经将中国学者全部利诱 成犬儒，他们只能内部恶斗。缺乏批评世道的道德勇气。孔孟之乡竟然充斥着一批不敢有理想的学者。令人失望。&rdquo;施密德特为此嘲笑中国大学&ldquo;失去了重点，失去 了方向，失去了一贯保持的传统&rdquo;，&ldquo;课程价值流失，效率低，浪费大&rdquo;。他嘲笑说&ldquo;很多人还以为自己真的在搞教育&hellip;&hellip;。&rdquo;</p>
<p>　　5、针对大学生就业难。施密德特对此说，&ldquo;作为教育要为服务的最早倡议者，<span onclick="sendmsg('pw_ajax.php','action=relatetag'amp;tagname=我要',this.id)" style="border-bottom: 1px solid rgb(250, 137, 27); cursor: pointer;" id="rlt_3">我要</span>说，我们千万不能忘记大学的学院教育不是为了求职，而是为了生活&rdquo;。他说大学应该&ldquo;坚持青年必须用文明人的好奇心去接受知识，根本无需回答它是否对公共事业有用，是否切合实际，是否具备价值等&rdquo;，反之大学教育就会偏离&ldquo;对知识的忠诚&rdquo;。</p>
<p>　　6、针对中国大学的<span onclick="sendmsg('pw_ajax.php','action=relatetag'amp;tagname=考试',this.id)" style="border-bottom: 1px solid rgb(250, 137, 27); cursor: pointer;" id="rlt_4">考试</span>作弊、论文抄袭、科研造假等学术腐败，施密德特提出了另一种观察<span onclick="sendmsg('pw_ajax.php','action=relatetag'amp;tagname=问题',this.id)" style="border-bottom: 1px solid rgb(250, 137, 27); cursor: pointer;" id="rlt_1">问题</span>的眼光，他说&ldquo;经验告诉我们，这是一种骇人听闻的腐败&rdquo;。他还说&ldquo;中国这一代教育者不值得尊重，尤其是一些知名的教授。&rdquo;施密德特认为中国大学不存在真正的学术自由，他说中国大学&ldquo;对的适应，对某些人利益的迎合，损害了大学对智力和真理的追求&rdquo;。</p>
<p>　　他提出大学&ldquo;必须充满历史感&rdquo;，&ldquo;必须尊重进化的思想&rdquo;，&ldquo;同时，它倾向于把智慧，甚至特别的真理当作一种过程及一种倾向，而不当作供奉于密室、与现实正在发生的难题完全隔绝的一种实体&rdquo;。</p>
<p>　　7、最后，他说&ldquo;一些民办教育，基本是靠人头计算利润的企业。&rdquo;</p>]]></description>
		<category>网海拾贝</category>
		<guid>http://www.xklog.org/article/internet/china-university-the-biggest-joke-in-the-world.html</guid>
		<pubDate>Thu, 11 Mar 2010 17:26:15 +0000</pubDate>
	</item>

	</channel>
</rss>