<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>myaniu</title>
    <description>每天进步一点，一年就是一大截。</description>
    <link>http://myaniu.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>ubuntu下终端下更改终端键盘等设置</title>
        <author>myaniu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myaniu.javaeye.com">myaniu</a>&nbsp;
          链接：<a href="http://myaniu.javaeye.com/blog/232063" style="color:red;">http://myaniu.javaeye.com/blog/232063</a>&nbsp;
          发表时间: 2008年08月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          实验环境ubuntu server 8.04<br />终端下输入：<br /><div class="quote_title">引用</div><div class="quote_div">dpkg-reconfigure console-setup</div><br />然后就可以一步一步按照向导来更改了。
          <br/>
          <span style="color:red;">
            <a href="http://myaniu.javaeye.com/blog/232063#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 24 Aug 2008 11:04:34 +0800</pubDate>
        <link>http://myaniu.javaeye.com/blog/232063</link>
        <guid>http://myaniu.javaeye.com/blog/232063</guid>
      </item>
      <item>
        <title>5种原因导致加速衰老</title>
        <author>myaniu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myaniu.javaeye.com">myaniu</a>&nbsp;
          链接：<a href="http://myaniu.javaeye.com/blog/212507" style="color:red;">http://myaniu.javaeye.com/blog/212507</a>&nbsp;
          发表时间: 2008年07月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          转自译言：<br />http://www.yeeyan.com/articles/view/31069/10175<br />内容如下：<br /><br /><div class="quote_title">引用</div><div class="quote_div"><br />5种原因导致加速衰老<br /><br /> <br /><br />许多人意识到不良的生活习惯如吸烟和酗酒能导致加速衰老。但是现代社会高强度生活节奏中不时出现的反复压力和营养不良会带来什么呢？读下去吧，看看在你一生中什么原因能导致你加速衰老。<br /><br /> <br /><br />1、糟糕的饮食<br /><br />你吃什么可能比你做的其它任何事情对你健康的影响都大。当你吃那些糟糕的食品——油腻的、加工的或油炸食品和单糖类食品——的时候，你正用化学添加剂和反式脂肪*及通过剥夺身体必须的营养成分来给身体加压，进而加速你身体的衰老。相反，当你吃那些“生命活力”食品的时候，你可以预防疾病和增强身体器官的功能。<br /><br /> <br /><br />一般来说，你的饮食内容应当包含各种各样颜色（食品）和各种有机精益蛋白质来源的平衡，混合型碳水化合物，全谷类，豆类，水果和蔬菜。许多研究表明水果和蔬菜表皮中各式各样的天然色素是强效抗氧化剂，那是保持健康、防癌和使身体免受环境毒素侵害的重要营养成份。<br /><br /> <br /><br />避免摄入油腻食品，加工和油炸食品。保持最低的牛奶摄入量，因为大部分牛奶都含有大量的饱和脂肪。把糖果、糖、苏大和所有的单糖食品从你的菜单中拿走。过量的糖会转化为你体内的脂肪而使你体重增加——必然导致心血管疾病、高血压和糖尿病。种瓜得瓜种豆得豆，所以吃得科学点吧！<br /><br /> <br /><br />2、忧虑<br /><br />忧虑不仅让你心情沮丧，也损害你的健康。实际上，抑郁和不快的人得心脏病的几率是正常人的两倍。有证据显示C型个性特征的人——那些有忧郁、消沉和过分担心的人——更容易得癌症。千万不要低估你情绪的影响力。你的经历是由你表现出来的能力决定的，但最终，在人生低谷的时候拥有消极看法还是积极态度是你自己的选择。<br /><br /> <br /><br />几年前，我有幸同已故的Norman Cousins一起工作。他的研究表明情绪对许多生理机能有重大的影响，包括免疫系统。他发现，在经历20天每天半小时捧腹大笑后，癌症患者体内攻击癌细胞的免疫K细胞数量有所增长。笑也会释放体内的安多芬，这是一种能给你幸福感的化学物质。毋庸置疑，快乐的人活得更久更健康。<br /><br /> <br /><br />3、缺乏锻炼<br /><br />我从没遇到过一个不积极锻炼的健康人或者百岁老人。锻炼对健康的新陈代谢、恰当的能量循环和体内废物的排除是必不可少的。超重和缺乏运动是加速衰老和满身疾病的必然原因。心肺功能运动是加速新陈代谢、燃烧多余卡路里和减肥的关键。快走、徒步旅行、慢跑、游泳、自行车和爬楼梯—这么多保持健康方法的选择！以最大心率（MHR，可以通过220减去你的年龄得到）的60-80%心率水平锻炼半小时。经常性的锻炼也可以防止“非胰岛素依赖性”糖尿病，这是全球工业化国家增长最快的疾病。<br /><br /> <br /><br />你能通过扩展你的关节活动度锻炼来避免肌肉、关节和肌腱的加速衰老；一些包括太极、气功和瑜伽的选择。利用在我书里可以轻松学会的简单太极拳吧，“和谐太极”点这儿。同样，适当的负重锻炼对骨密度和肌肉力量也是必须的。别忘了锻炼时必须进行合理的热身和冷却以避免受伤。<br /><br /> <br /><br />4、压力<br /><br />压力是我们忙碌生活的巨大副产品而且它导致我们的健康遭受极大损害。这时期（承受压力期间）我们身体的“生存方式”时常变得兴奋。当你遭受压力时，你的身体进入了“战斗或逃跑”模式，这种状态需要大量的能量。肾上腺素被从肾上腺释放出来，它告诉身体把储存的糖通过肝脏转化成葡萄糖，因为在假定的“战斗或逃跑”剧本中身体的能量需求显著增强了。<br /><br /> <br /><br />不幸的是，这样的剧本几乎从来不会演完而且那些永远不会被消耗的血糖最终作为脂肪存储在体内——不可避免地造成体重增加。更为严重的是，所有这些压力会持续消耗你身体的能量资源直到身体由于负荷过重而垮掉，这将导致肾上腺疲劳，神经失常或免疫系统故障。<br /><br /> <br /><br />为了保持轻松，别忘了每天不断深呼吸。给自己一点空闲吧！你是个人，不是机器。试着在你午休期间小睡15分钟。如果你只有5分钟的多余时间，就只好闭上眼睛来缓解压力了。冥想或许是更好的选择，这是个消解压力的好方法。想知道更多如何用冥想来减轻压力，点这儿。<br /><br /> <br /><br />5、缺少睡眠<br /><br />这是个无法回避的事实：成年人平均每个晚上需要7到8个小时的高质量睡眠来保持健康。记住只要3个晚上睡眠不足免疫系统就平均降低60%的功效。没有每晚足够的“恢复时间”，你的身体将每况愈下而精疲力竭，走向身体失衡和患病的道路。<br /><br /> <br /><br />我希望你们找到活得长寿活得康健的方法！我欢迎你们经常光顾（我的空间）并且和我分享你们自己的健康和长寿秘诀。<br /><br /> <br /><br />希望你们活得长寿、康健和快乐！<br /><br /> <br /><br />—毛博士<br /><br /> <br /><br />（*：反式脂肪酸也叫反式脂肪，又称为“逆态脂肪酸”。反式脂肪酸属不饱和脂肪酸，为食品业者以植物油为原料透过部分“氢化”处理所产生的油脂。与一般植物油相比，反式脂肪具有耐高温、不易变质、存放更久等优点，但据有关研究表明，经常食用反式脂肪含量高的食物易患心血管疾病。）<br /></div><br /><br />个人感觉文章不错。各方面注意一些，健康的多活几年吧。
          <br/>
          <span style="color:red;">
            <a href="http://myaniu.javaeye.com/blog/212507#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 07 Jul 2008 22:32:30 +0800</pubDate>
        <link>http://myaniu.javaeye.com/blog/212507</link>
        <guid>http://myaniu.javaeye.com/blog/212507</guid>
      </item>
      <item>
        <title>C语言中返回值问题</title>
        <author>myaniu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myaniu.javaeye.com">myaniu</a>&nbsp;
          链接：<a href="http://myaniu.javaeye.com/blog/212505" style="color:red;">http://myaniu.javaeye.com/blog/212505</a>&nbsp;
          发表时间: 2008年07月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天遇到一个现存程序中的bug，某个函数的返回值不是与预期的值。<br />最后调查找到了原因。<br /><br />原因如下：<br />该函数定义为应该返回一个int型整数，但是函数实现中在某条路径中确实直接return,没有返回任何值。<br /><br />《C陷阱与缺陷》中建议对于main函数要始终有返回值，便于其他程序检查该程序的执行状态。并指出没有返回值时，实际的结果是会返回一个垃圾数据。<br /><br />实验测试如下：<br />测试环境为 Ubuntu 8.04<br />GCC 4.23<br /><br /><strong>代码 A </strong><br />先加上返回值，如下：<br /><pre name="code" class="c">#include&lt;stdio.h>
int test_int_return(){
	return 0;
}

int main(void){
	printf("int return: %d\n", test_int_return());
	return 0;
}</pre><br /><br /><strong>代码 B</strong><br />再去掉返回值， 如下：<br /><pre name="code" class="c">#include&lt;stdio.h>
int test_int_return(){
	return;
}

main(void){
	printf("int return: %d\n", test_int_return());
}</pre><br /><br />对于代码A<br />输出<div class="quote_title">引用</div><div class="quote_div">int return: 0</div><br />对于代码B<br />输出<div class="quote_title">引用</div><div class="quote_div">int return: 1</div><br /><br />对于代码A，用gcc生成汇编<br /><div class="quote_title">引用</div><div class="quote_div">$ gcc -S -o function_return.s.return  function_return.c</div><br />汇编代码为：<br /><div class="quote_title">引用</div><div class="quote_div">	.file	"function_return.c"<br />	.text<br />.globl test_int_return<br />	.type	test_int_return, @function<br />test_int_return:<br />	pushl	%ebp<br />	movl	%esp, %ebp<br />	<span style="color: red">movl	$0, %eax</span><br />	popl	%ebp<br />	ret<br />	.size	test_int_return, .-test_int_return<br />	.section	.rodata<br />.LC0:<br />	.string	"int eturn: %d\n"<br />	.text<br />.globl main<br />	.type	main, @function<br />main:<br />	leal	4(%esp), %ecx<br />	andl	$-16, %esp<br />	pushl	-4(%ecx)<br />	pushl	%ebp<br />	movl	%esp, %ebp<br />	pushl	%ecx<br />	subl	$20, %esp<br />	call	test_int_return<br />	movl	%eax, 4(%esp)<br />	movl	$.LC0, (%esp)<br />	call	printf<br />	<span style="color: red">movl	$0, %eax</span><br />	addl	$20, %esp<br />	popl	%ecx<br />	popl	%ebp<br />	leal	-4(%ecx), %esp<br />	ret<br />	.size	main, .-main<br />	.ident	"GCC: (GNU) 4.2.3 (Ubuntu 4.2.3-2ubuntu7)"<br />	.section	.note.GNU-stack,"",@progbits<br /></div><br /><br />对于代码B，用gcc生成汇编<br /><div class="quote_title">引用</div><div class="quote_div">$ gcc -S -o function_return.s.no_return  function_return.c</div><br />汇编代码为：<br /><div class="quote_title">引用</div><div class="quote_div">	.file	"function_return.c"<br />	.text<br />.globl test_int_return<br />	.type	test_int_return, @function<br />test_int_return:<br />	pushl	%ebp<br />	movl	%esp, %ebp<br />	popl	%ebp<br />	ret<br />	.size	test_int_return, .-test_int_return<br />	.section	.rodata<br />.LC0:<br />	.string	"int eturn: %d\n"<br />	.text<br />.globl main<br />	.type	main, @function<br />main:<br />	leal	4(%esp), %ecx<br />	andl	$-16, %esp<br />	pushl	-4(%ecx)<br />	pushl	%ebp<br />	movl	%esp, %ebp<br />	pushl	%ecx<br />	subl	$20, %esp<br />	call	test_int_return<br />	movl	%eax, 4(%esp)<br />	movl	$.LC0, (%esp)<br />	call	printf<br />	addl	$20, %esp<br />	popl	%ecx<br />	popl	%ebp<br />	leal	-4(%ecx), %esp<br />	ret<br />	.size	main, .-main<br />	.ident	"GCC: (GNU) 4.2.3 (Ubuntu 4.2.3-2ubuntu7)"<br />	.section	.note.GNU-stack,"",@progbits<br /></div><br /><br />对两份汇编代码进行diff<br /><div class="quote_title">引用</div><div class="quote_div">$diff function_return.s.return function_return.s.no_return </div><br /><br /><div class="quote_title">引用</div><div class="quote_div">8d7<br />&lt; 	movl	$0, %eax<br />30d28<br />&lt; 	movl	$0, %eax<br /></div><br /><br />也就是说，<br />对于有返回值（以int为例）的函数来说，如果指定返回值，寄存器%eax就会被设定为该返回值。如果不指定，%eax还是上次使用时的值，但是调用该函数的语句仍会从%eax中取值。所以就会出现随机的不可确定的数（%eax上次使用时的值）。<br /><br /><strong>要仔细检查函数的所有出口。</strong>
          <br/>
          <span style="color:red;">
            <a href="http://myaniu.javaeye.com/blog/212505#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 07 Jul 2008 22:17:07 +0800</pubDate>
        <link>http://myaniu.javaeye.com/blog/212505</link>
        <guid>http://myaniu.javaeye.com/blog/212505</guid>
      </item>
      <item>
        <title>读书笔记。</title>
        <author>myaniu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myaniu.javaeye.com">myaniu</a>&nbsp;
          链接：<a href="http://myaniu.javaeye.com/blog/212139" style="color:red;">http://myaniu.javaeye.com/blog/212139</a>&nbsp;
          发表时间: 2008年07月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          工作关系，最近在干C方面的书，<br />最近在看的有<br />《C专家编程》<br />《C陷阱与缺陷》<br />《C指针》<br />目前在外地出差中，正在愁怎么带回去。<br />现在想想最好的办法是，装你脑子，然后书送人。<br />但是记性又不怎么地，想想还是整个读书笔记吧。以备以后查阅。<br />今天先开个头！<br />洗个澡先。
          <br/>
          <span style="color:red;">
            <a href="http://myaniu.javaeye.com/blog/212139#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 06 Jul 2008 22:51:40 +0800</pubDate>
        <link>http://myaniu.javaeye.com/blog/212139</link>
        <guid>http://myaniu.javaeye.com/blog/212139</guid>
      </item>
      <item>
        <title>自制另类不倒翁</title>
        <author>myaniu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myaniu.javaeye.com">myaniu</a>&nbsp;
          链接：<a href="http://myaniu.javaeye.com/blog/157697" style="color:red;">http://myaniu.javaeye.com/blog/157697</a>&nbsp;
          发表时间: 2008年01月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天一时兴起，买了一些材料，自制了一个不倒翁。<br />以前是用麦秆做的。现在采用竹，木，金属构造，比较结实。<br />下一步打算，在不倒翁的两个容器中种上两小盆花，那就好玩了。哈哈。<br />整体照<br /><img src="http://myaniu.javaeye.com/upload/picture/pic/7125/94e06e8d-3114-3b04-b57e-8eb708de2019.jpg" /><br />局部照<br /><img src="http://myaniu.javaeye.com/upload/picture/pic/7127/8cdab5a2-2923-3299-9938-73912d3461b0.jpg" />
          <br/>
          <span style="color:red;">
            <a href="http://myaniu.javaeye.com/blog/157697#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 19 Jan 2008 23:58:35 +0800</pubDate>
        <link>http://myaniu.javaeye.com/blog/157697</link>
        <guid>http://myaniu.javaeye.com/blog/157697</guid>
      </item>
      <item>
        <title>FreeBSD8展望</title>
        <author>myaniu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myaniu.javaeye.com">myaniu</a>&nbsp;
          链接：<a href="http://myaniu.javaeye.com/blog/157687" style="color:red;">http://myaniu.javaeye.com/blog/157687</a>&nbsp;
          发表时间: 2008年01月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          转自<br /><a href="http://wiki.freebsdchina.org/news/2007/freebsd_8_roadahead" target="_blank">http://wiki.freebsdchina.org/news/2007/freebsd_8_roadahead</a><br /><br />FreeBSD的Robert N. M. Watson在回应一封-hackers的邮件时 （Message-ID: 20071125110116.U63238@fledge.watson.org），对 FreeBSD 的 SMP 工作进行了回顾，并对 FreeBSD 8 进行了一些展望：<br /><br />目前的绝大多数操作系统，都是从单 CPU 的硬件开始起家的。因此，内核的同步模型，基本上都是针对中断处理程序、 I/O 导致的阻塞所产生的并发，而非真正的并行处理而设计。一般来说，这种模型包括了“禁止中断”，有时还包括“中断优先级”以便处理不同的优先级和选择性抢占，以及用以处理同步操作，如使内核线程进入休眠状态的 I/O 等的简单的休眠锁。正如你已经猜到的那样，这也是 BSD，包括 FreeBSD 开始这些工作的起点。<br /><br />因此，在操作系统中引入 SMP 支持的第一步，往往就是引入“全局锁（Giant lock）”，使内核在同一时刻事实上只在一颗 CPU 上运行。这样做的目的是在 SMP 硬件上运行时，能够依然使用 UP（单处理器）内核的那些基本假设。这使得用户态程序能够运行在多个 CPU 上，但内核则不能以并行方式运行。在内核中引入这种变动相对而言比较容易，因为它不需要改变整个内核的同步模型，而只需简单地加入全局锁、修改硬件探测和引导代码，处理中断传递、TLB shootdown等等。但是，由于内核无法从并行处理中获益，因此对于高度依赖内核的操作而言，启用 SMP 除了增加开销之外，意义不大。<br /><br />因此，引入 SMP 支持的下一个步骤，便是修改内核的同步模型，使得它的一些部分能够在多个 CPU 上同时运行，并由此带来性能提升。对于 FreeBSD 而言，全局锁是在 FreeBSD 3 引入的，我们在 FreeBSD 5 中开始将其细化。在 FreeBSD 6 中，内核的绝大多数子系统都已经不再使用全局锁，而在 FreeBSD 7 中，锁的细化进行了更进一步的推进。现在还有一些边角的位置上存在全局锁，不太常用的文件系统、一些较旧的设备驱动，等等，但多数情况下，已经不会再看到正在运行由全局锁保护的代码了。需要说明的是，即使只是将内核中 1/2 的部分中的全局锁细化，也会显著地改善全局锁保护的代码性能，因为锁的冲撞机会减少了。<br /><br />目前，全局锁已经逐渐被弱化成了保护 tty、 newbus、 usb 和 msdosfs 代码的锁，并且，消除全局锁的工作，已经带来了显著的性能提升。在 FreeBSD 7 中，我们的工作重点，已经从消除全局锁，转移到了优化上锁原语、调度器以及锁粒度上。例如，在 FreeBSD 7 上 MySQL 的性能改进，多数都归功于下面几个有限的变动：<br /><br />    *<br />      由 M:N 线程转为 1:1 线程模型。<br />    *<br />      对于 sx(9) 休眠锁原语的大幅改进。<br />    *<br />      引入了高效的非休眠 rw(9) 上锁原语。<br />    *<br />      将内核中文件描述符表的上锁方式改为使用低开销的 sx(9) 原语，以及通过将上锁操作细分为读写两种所带来的改善。<br />    *<br />      将 UNIX domain socket 改为细粒度上锁模型。<br />    *<br />      由于引入 ule(4) 调度器带来的大幅可伸缩性改善。<br /><br />在 FreeBSD 8 中，我们将继续对上锁粒度和内核并行性方面进行改进，以更好地在更多 CPU 池中分摊负载。多核、多处理器芯片正在迅速普及，因此多处理器系统的性能非常值得深入挖掘。也就是说，尽管目前我们所做的工作已经取得了相当大的成效，我们仍然需要继续挖掘多处理器硬件，特别是在网络协议栈方面的潜能。 <br /><br />转自<br /><a href="http://wiki.freebsdchina.org/news/2007/freebsd_8_roadahead" target="_blank">http://wiki.freebsdchina.org/news/2007/freebsd_8_roadahead</a><br />----------------------------------------------------------------------------<br />很是喜欢FreeBSD，目前FreeBSD7.0RC1已经发布，FreeBSD7.0即将发布，FreeBSD7在多核系统上的性能较之以前版本有很大的提高，而且已经位于主流操作系统前列。<br /><br />通过PostgreSQL和MySQL的性能测试。<br /><a href="http://people.freebsd.org/~kris/scaling/7.0%20Preview.pdf " target="_blank">http://people.freebsd.org/~kris/scaling/7.0%20Preview.pdf </a><br />Linux 2.6.22 比 FreeBSD 7.0 慢了15%。<br />同时，PostgreSQL 比MySQL快了 35% - 45%。估计PostgreSQL8.3出来后，会把MySQL毙得满地找牙。哈哈。<br /><br />相信也期待FreeBSD8会有更大的改进。
          <br/>
          <span style="color:red;">
            <a href="http://myaniu.javaeye.com/blog/157687#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 19 Jan 2008 22:42:42 +0800</pubDate>
        <link>http://myaniu.javaeye.com/blog/157687</link>
        <guid>http://myaniu.javaeye.com/blog/157687</guid>
      </item>
      <item>
        <title>关于db4o中在C/S模式下如何保证对全局共享数据的可靠并发访问 。</title>
        <author>myaniu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myaniu.javaeye.com">myaniu</a>&nbsp;
          链接：<a href="http://myaniu.javaeye.com/blog/135975" style="color:red;">http://myaniu.javaeye.com/blog/135975</a>&nbsp;
          发表时间: 2007年10月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>db4o简介：</p>
<p>db4o 是一个开源的纯面向对象数据库引擎，对于 Java 与 .NET 开发者来说都是一个简单易用的对象持久化工具，使用简单。</p>
<li><strong>100% 的原生</strong> 查询语言应能用实现语言（ Java 或 C# ）完全表达，并完全遵循实现语言的语义。 </li>
<li><strong>100% 的面向对象</strong> 查询语言应可运行在自己的实现语言中，允许未经优化执行普通集合而不用自定义预处理。 </li>
<li><strong>100% 的类型安全</strong> 查询语言应能完全获取现代 IDE 的特性，比如语法检测、类型检测、重构，等等。 </li>
<li><strong>开源模式。</strong>与其他 ODBMS 不同，db4o 为开源软件，通过开源社区的力量驱动开发 db4o 产品。</li>
<li><strong>高性能。</strong> <a href="http://www.ibm.com/developerworks/cn/java/j-lo-db4o1/#fig2">图2</a>为 db4o 官方公布的基准测试数据，db4o 比采用 Hibernate/MySQL 方案在某些测试线路上速度高出 44 倍之多！并且安装简单，仅仅需要 400Kb 左右的 .jar 或 .dll 库文件。在接下来的系列文章中，我们将只关注在 Java 平台的应用，但是实际上 db4o 毫无疑问会很好地在 .NET 平台工作。 <br />
</li>
<li><strong>易嵌入。</strong>使用 db4o 仅需引入 400 多 k 的 jar 文件或是 dll 文件，内存消耗极小。 </li>
<li><strong>零管理。</strong>使用 db4o 无需 DBA，实现零管理。 </li>
<li><strong>支持多种平台。</strong>db4o 支持从 Java 1.1 到 Java 5.0，此外还支持 .NET 、 CompactFramework 、 Mono 等 .NET 平台，也可以运行在 CDC 、 PersonalProfile 、 Symbian 、 Savaje 以及 Zaurus 这种支持反射的 J2ME 方言环境中，还可以运行在 CLDC 、 MIDP 、 RIM/Blackberry 、 Palm OS 这种不支持反射的 J2ME 环境中。
<p>-----------------------------------------------------------------------------------------------------</p>
<p>对db4o很是感兴趣，最近在学习db4o，学习的过程中，想到一个问题：就是在C/S模式下，多个客户端同时访问数据库，如何保证对全局共享数据的可靠并发访问。例如，在db4o中C/S模式下如何实现并发地安全可靠地生成唯一有序序号。--类似关系数据库中的sequence。</p>
<p>看了db4o API 和相关资料，发现了一下两种方法，</p>
<p>1.信号量方式&nbsp;</p>
<pre>ExtObjectContainer类中定义了信号量相关函数。 SetSemaphore，和ReleaseSemaphore。</pre>
<p>从帮助文档（SetSemaphore）来看，</p>
<p><strong>Possible usecases for semaphores:<br />
</strong>- prevent other clients from inserting a singleton at the same time. A suggested name for the semaphore: &quot;SINGLETON_&quot; + Object#getClass().getName().<br />
- lock objects. A suggested name: &quot;LOCK_&quot; + <a>getID(Object)</a><br />
- generate a unique client ID. A suggested name: &quot;CLIENT_&quot; + currentTime.</p>
<p>可以实现对共享数据的可靠访问。<br />
</p>
<p>2.使用Message方式（Db4objects.Db4o.Messaging 命名空间中定义），使用服务器端单例运行一段代码，所有共享相关的处理，交给这段代码来执行。</p>
<p><a href="http://developer.db4o.com/Resources/view.aspx/Reference/Client-Server/Messaging">http://developer.db4o.com/Resources/view.aspx/Reference/Client-Server/Messaging</a></p>
<p><a href="http://developer.db4o.com/Resources/view.aspx/Reference/Client-Server/Remote_Code_Execution/Remote_Execution_Through_Evaluation_API">http://developer.db4o.com/Resources/view.aspx/Reference/Client-Server/Remote_Code_Execution/Remote_Execution_Through_Evaluation_API</a></p>
<p><a href="http://developer.db4o.com/Resources/view.aspx/Reference/Client-Server/Remote_Code_Execution/Using_Messaging_API_For_Remote_Code_Execution">http://developer.db4o.com/Resources/view.aspx/Reference/Client-Server/Remote_Code_Execution/Using_Messaging_API_For_Remote_Code_Execution</a></p>
<p>从实现角度来说，使用信号量加锁方式可能更符合我们以往的编程习惯（多线程并发编程）。而基于消息的方式个人直观感觉，系统整体并发性能会更好一些。关于Message方式，从资料得倒以下启示： 1，任意代码可以被在服务器端执行。2，代码将被序列化并通过网络发送，3，更改代码后，应该更新所有客户端。4，MessageSender 对象可以被复用来发送多个Message。5，可以控制服务器做某些事情，比如关闭，重启，备份，限制客户端等。</p>
<p>引用资料。</p>
<p><font face="Arial"><a href="http://www.ibm.com/developerworks/cn/java/j-lo-db4o1/">http://www.ibm.com/developerworks/cn/java/j-lo-db4o1/</a></font></p>
<p><font face="Arial"><a href="http://www.open-open.com/open16610.htm">http://www.open-open.com/open16610.htm</a></font></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
</li>
          <br/>
          <span style="color:red;">
            <a href="http://myaniu.javaeye.com/blog/135975#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 28 Oct 2007 01:13:46 +0800</pubDate>
        <link>http://myaniu.javaeye.com/blog/135975</link>
        <guid>http://myaniu.javaeye.com/blog/135975</guid>
      </item>
      <item>
        <title>postgresql-8.3-beta1 版释出，感兴趣的都来测试啊。</title>
        <author>myaniu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myaniu.javaeye.com">myaniu</a>&nbsp;
          链接：<a href="http://myaniu.javaeye.com/blog/130340" style="color:red;">http://myaniu.javaeye.com/blog/130340</a>&nbsp;
          发表时间: 2007年10月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font class="MsgBodyText">说明<br />
<a href="http://www.postgresql.org/about/news.872" target="_blank">http://www.postgresql.org/about/news.872</a><br />
<br />
该版本增加了很多客户要求的改进，包括：<br />
<br />
Full text search is now a built-in feature <br />
全文检索成为内建特性。<br />
<br />
Support for the SQL/XML standard, including a new xml builtin data type <br />
支持SQL/XML标准，包括新的xml内建数据类型<br />
<br />
enum data types <br />
枚举数据类型<br />
<br />
UUID data type, similar to that defined by RFC 4122 <br />
UUID数据类型，与RFC4122中定义的相同<br />
<br />
Arrays of composite types <br />
组合类型数组<br />
<br />
ORDER BY ... NULLS FIRST/LAST <br />
<br />
<br />
Updatable cursors (UPDATE/DELETE WHERE CURRENT OF cursor_name) <br />
可更新游标(UPDATE/DELETE WHERE CURRENT OF cursor_name)<br />
<br />
Per-function parameter settings <br />
每函数参数设定<br />
<br />
User-defined types can now have type modifiers (parameters) <br />
用户定义类型现在可以变更类型（参数）。<br />
<br />
Declarations such as varchar(42) are no longer restricted to use by built-in data types. <br />
类似varchar(42)的声明不再被内建数据类型限制使用。 （这句不是很明白）<br />
<br />
Automatic plan invalidation when table definitions change <br />
当表定义改变时，自动规划失效<br />
<br />
This will particularly ease usage of temporary tables in PL/PgSQL functions. <br />
在PL/PgSQL函数中临时表更加易用。<br />
<br />
Numerous improvements in logging and statistics collection capabilities, including the ability to emit postmaster log messages in CSV format that can be directly loaded into a database table for analysis <br />
诸多日志和数据统计收集能力方面的改进。包括以CSV格式输出postmaster日志消息的能力。该CSV文件可以之间导入到一个数据表中来进行分析。<br />
<br />
SSPI/GSSAPI authentication support <br />
支持SSPI/GSSAPI 认证。<br />
<br />
Multiple autovacuum worker processes, and other autovacuum improvements <br />
支持多自动清理（Autovacuum ）工作进程，其他的自动清理（Autovacuum ）相关改进<br />
<br />
Autovacuum is now considered mature enough to be enabled by default.<br />
自动清理（Autovacuum ）现在已经足够成熟，默认启用。<br />
<br />
The entire PostgreSQL system can now be compiled with Microsoft Visual C++ <br />
整个PostgreSQL 系统现在可以使用Microsoft Visual C++ 来编译。<br />
<br />
Major performance improvements in this release include: <br />
这个版本包括的主要性能改进：<br />
<br />
Asynchronous commit option to allow transactions to be reported committed before they have actually been flushed to disk <br />
异步提交选项 允许事务在实际写入到磁盘之前报告 已提交。（这将提高系统的并行性能，但是最坏的情况下，系统崩溃之后，最近的一些已报告提交的事务将没有产生实际的影响）<br />
<br />
&quot;Distributed&quot; checkpoints to spread out the I/O load of a checkpoint <br />
&quot;分布&quot; 检查点将分散一个检查点的I/O负荷。<br />
<br />
Heap-Only Tuples (HOT) to reduce overhead of updates <br />
Heap-Only Tuples(HOT)将降低更新的代价。（这个从早先的一些说明来看，性能提升不少）<br />
<br />
Just-in-time background writer strategy to improve disk write efficiency <br />
即时后端写策略将改善磁盘写效率。<br />
<br />
<br />
Reduction of on-disk data size through reducing both per-tuple and per-field overheads <br />
通过降低每个元组和每隔字段的代价（大小）来降低磁盘数据大小。<br />
<br />
Efficiency improvements for large sequential scans, including prevention of cache flushing and &quot;piggybacking&quot; to let concurrent scans read the table only once <br />
有效的改善了大的线性扫描，改进包括防止缓存刷新 和 &quot;捎带技术&quot;-让并发的扫描只读取数据表一次。<br />
<br />
Top-N sorting <br />
Top-N 排序<br />
<br />
<br />
Lazy XID assignment to reduce the cost of read-only transactions <br />
延迟 XID赋值将降低只读事务的代价。<br />
<br />
<br />
下载地址<br />
<a href="http://www.postgresql.org/ftp/binary/v8.3beta1/win32/" target="_blank">http://www.postgresql.org/ftp/binary/v8.3beta1/win32/</a><br />
</font><font class="MsgBodyText"></font></p>
<p><font class="MsgBodyText">其他可用资源：</font></p>
<p><font class="MsgBodyText">postgresql 中文站 <a href="http://www.pgsqldb.org">http://www.pgsqldb.org</a></font></p>
<p>postgresql正体中文站 <font face="Arial"><a href="http://postgresql-chinese.blogspot.com/">http://postgresql-chinese.blogspot.com/</a></font></p>
<p><font class="MsgBodyText"></font></p>
          <br/>
          <span style="color:red;">
            <a href="http://myaniu.javaeye.com/blog/130340#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 09 Oct 2007 23:47:37 +0800</pubDate>
        <link>http://myaniu.javaeye.com/blog/130340</link>
        <guid>http://myaniu.javaeye.com/blog/130340</guid>
      </item>
      <item>
        <title>将rails程序打包成一个exe程序。</title>
        <author>myaniu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myaniu.javaeye.com">myaniu</a>&nbsp;
          链接：<a href="http://myaniu.javaeye.com/blog/95224" style="color:red;">http://myaniu.javaeye.com/blog/95224</a>&nbsp;
          发表时间: 2007年06月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">详见这里</font></p>
<p><font face="Arial"><a href="http://www.erikveen.dds.nl/distributingrubyapplications/rails.html">http://www.erikveen.dds.nl/distributingrubyapplications/rails.html</a></font></p>
<p>采用了Tar2RubyScript，RubyScript2Exe来实现打包，当然你不能使用mysql了，得用sqlite，不过这个数据库也不错了。哈哈。</p>
<p><br />
</p>
          <br/>
          <span style="color:red;">
            <a href="http://myaniu.javaeye.com/blog/95224#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 28 Jun 2007 23:26:46 +0800</pubDate>
        <link>http://myaniu.javaeye.com/blog/95224</link>
        <guid>http://myaniu.javaeye.com/blog/95224</guid>
      </item>
      <item>
        <title>AP4R-为rails应用增加异步处理。</title>
        <author>myaniu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myaniu.javaeye.com">myaniu</a>&nbsp;
          链接：<a href="http://myaniu.javaeye.com/blog/95223" style="color:red;">http://myaniu.javaeye.com/blog/95223</a>&nbsp;
          发表时间: 2007年06月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>AP4R是Asynchronous Processing for Ruby的缩写，意即&ldquo;Ruby的异步处理&rdquo;。该项目是一个异步可靠消息处理的实现，提供消息队列和消息分派的功能。</p>
<p>目前已经能支持： </p>
<blockquote>
<ol>
    <li>不管业务逻辑是非同步调用还是同步调用的，都可以以简单的Web应用或者Ruby代码的形式实现； </li>
    <li>RBMS（MySQL）或者基于文件的消息持久化能力； </li>
    <li>支持在单个或者多个服务器上跨多个AP4R进程的负载平衡； </li>
    <li>对以下多个协议的支持：XML-RPC、SOAP和HTTP POST等等。 </li>
</ol>
<p>详细介绍 见这里 <font face="Arial"><a href="http://www.infoq.com/cn/news/2007/06/messaging-with-ap4r">http://www.infoq.com/cn/news/2007/06/messaging-with-ap4r</a></font></p>
<p>项目主页<font face="Arial"><a href="http://rubyforge.org/projects/ap4r/">http://rubyforge.org/projects/ap4r/</a></font></p>
<p>在某些领域这种特性应该是很有市场的。<font face="Arial"><a href="http://www.workingwithrails.com/">http://www.workingwithrails.com/</a>&nbsp; 这个网站就采用了这种技术</font></p>
<p><font face="Arial"><a href="http://www.slideshare.net/martinbtt/getting-distributed-with-ruby-on-rails/">http://www.slideshare.net/martinbtt/getting-distributed-with-ruby-on-rails/</a></font>&nbsp; 这个是一个实现异步处理的说明。</p>
</blockquote>
          <br/>
          <span style="color:red;">
            <a href="http://myaniu.javaeye.com/blog/95223#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 28 Jun 2007 23:21:43 +0800</pubDate>
        <link>http://myaniu.javaeye.com/blog/95223</link>
        <guid>http://myaniu.javaeye.com/blog/95223</guid>
      </item>
      <item>
        <title>Jester: JavaScriptian REST</title>
        <author>myaniu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myaniu.javaeye.com">myaniu</a>&nbsp;
          链接：<a href="http://myaniu.javaeye.com/blog/79920" style="color:red;">http://myaniu.javaeye.com/blog/79920</a>&nbsp;
          发表时间: 2007年05月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>Jester</strong>. It provides (nearly) identical syntax to ActiveResource for using <span class="caps">REST</span> to find, update, and create data, but from the client side.</p>
<p>看起来很不错。</p>
<p>相关的链接。</p>
<p><a href="http://giantrobots.thoughtbot.com/2007/4/2/jester-javascriptian-rest">2007/04/02 Jester: JavaScriptian REST</a></p>
<p><font face="Arial"><a href="http://giantrobots.thoughtbot.com/2007/4/16/jester-1-1-asynchronous-and-more">2007/04/16 Jester 1.1: Asynchronous REST</a></font></p>
<p><a href="http://giantrobots.thoughtbot.com/2007/4/30/jester-1-2-flexible-rest">2007/04/30 Jester 1.2: Flexible REST</a></p>
<p>&nbsp;</p>
<p>顺便问一下，哪位知道哪里有REST的.net下的客户端库，谢谢了。</p>
          <br/>
          <span style="color:red;">
            <a href="http://myaniu.javaeye.com/blog/79920#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 15 May 2007 00:10:08 +0800</pubDate>
        <link>http://myaniu.javaeye.com/blog/79920</link>
        <guid>http://myaniu.javaeye.com/blog/79920</guid>
      </item>
      <item>
        <title>使用Ruby生成图文并茂的Excel</title>
        <author>myaniu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myaniu.javaeye.com">myaniu</a>&nbsp;
          链接：<a href="http://myaniu.javaeye.com/blog/46768" style="color:red;">http://myaniu.javaeye.com/blog/46768</a>&nbsp;
          发表时间: 2007年01月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这是以前用ruby写的生成Excel的程序。<br />
可以实现插入文字，图像。<br />
excel.rb代码如下<br />
<div class="code_title">
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-rb">
    <li class="alt"><span><span>require&nbsp;'win32ole'&nbsp;&nbsp;</span></span> </li>
    <li class=""><span><span class="keyword">module</span><span>&nbsp;Excel&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">class</span><span>&nbsp;WorkBook&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlEdge</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlEdgeBottom&nbsp;=9&nbsp;</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlEdgeLeft&nbsp;&nbsp;=&nbsp;7&nbsp;</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlEdgeRight&nbsp;=&nbsp;10&nbsp;</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlEdgeTop&nbsp;&nbsp;=&nbsp;8&nbsp;</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlColor</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlColorBlank&nbsp;=&nbsp;1</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlColorWhite&nbsp;=2</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlColorRed&nbsp;=&nbsp;3</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlColorGreen&nbsp;=10</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlColorBlue&nbsp;=5</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlColorYellow&nbsp;=6</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlColorPurple&nbsp;=&nbsp;7&nbsp;#&nbsp;zi&nbsp;se</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlColorCyan&nbsp;=8&nbsp;#qing&nbsp;se</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlBgColorYellow&nbsp;=19</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlBgColorCyan&nbsp;=20</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlBgColorPurple&nbsp;=24</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlDefaultLineStyle&nbsp;=&nbsp;1&nbsp;</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@<span class="variable">@worksheets_name</span><span>&nbsp;=[]&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;initialize(encoding=</span><span class="string">&quot;GB2312&quot;</span><span>)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@excel</span><span>&nbsp;=&nbsp;WIN32OLE.</span><span class="keyword">new</span><span>(</span><span class="string">&quot;excel.application&quot;</span><span>)&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@excel</span><span>.visible&nbsp;=&nbsp;FALSE&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@workbook</span><span>&nbsp;=&nbsp;</span><span class="variable">@excel</span><span>.Workbooks.Add()&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#@style_id&nbsp;&nbsp;&nbsp;=&nbsp;0</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@encoding</span><span>&nbsp;=&nbsp;encoding&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;create_style&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;add_worksheet(name)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">while</span><span>&nbsp;@</span><span class="variable">@worksheets_name</span><span>.include?(name)&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;+=<span class="string">&quot;1&quot;</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@<span class="variable">@worksheets_name</span><span>&nbsp;&lt;&lt;&nbsp;name&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;worksheet&nbsp;=&nbsp;<span class="variable">@workbook</span><span>.Worksheets.Add()&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;worksheet.Activate&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;worksheet.name&nbsp;=&nbsp;name&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;WorkSheet.</span><span class="keyword">new</span><span>(worksheet)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;show&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@excel</span><span>.visible&nbsp;=&nbsp;TRUE&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;close&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@workbook</span><span>.Close(0)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@excel</span><span>.Quit()&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;create_style&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sty=<span class="variable">@workbook</span><span>.Styles.Add('NormalStyle')&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sty.Font.Size&nbsp;=&nbsp;12&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sty.Borders(7).LineStyle=1&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sty.Borders(8).LineStyle=1&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sty.Borders(9).LineStyle=1&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sty.Borders(10).LineStyle=1&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sty=<span class="variable">@workbook</span><span>.Styles.Add('TitleStyle')&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sty.Font.Size&nbsp;=&nbsp;16&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sty.Font.Bold&nbsp;=<span class="keyword">true</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sty.Font.ColorIndex&nbsp;=3&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#sty.Interior.ColorIndex&nbsp;=&nbsp;20</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#worksheet</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">class</span><span>&nbsp;WorkSheet&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IMAGE_ROW_NUM&nbsp;=&nbsp;56&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@<span class="variable">@worksheets_name</span><span>&nbsp;=[]&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;initialize(worksheet)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@row_count</span><span>&nbsp;=&nbsp;1&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@worksheet</span><span>&nbsp;=&nbsp;worksheet&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;add_space_line(n=1)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;n&lt;1&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@row_count</span><span>&nbsp;+=n&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;add_title(name)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_space_line&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_row.add_cell(name,<span class="keyword">false</span><span>,</span><span class="string">&quot;TitleStyle&quot;</span><span>)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;add_row()&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@current_row</span><span>&nbsp;=&nbsp;Row.</span><span class="keyword">new</span><span>(</span><span class="variable">@worksheet</span><span>,</span><span class="variable">@row_count</span><span>)&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@row_count</span><span>&nbsp;+=1&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;&nbsp;</span><span class="variable">@current_row</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;current_row&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;&nbsp;</span><span class="variable">@current_row</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;add_image(image_path)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;</span><span class="keyword">not</span><span>&nbsp;</span><span class="builtin">File</span><span>.exist?(image_path)&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_space_line&nbsp;1&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_row&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cell_name=current_row.first_cell&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@worksheet</span><span>.</span><span class="builtin">Range</span><span>(cell_name).Select&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@worksheet</span><span>.Pictures.Insert(image_path)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_space_line&nbsp;&nbsp;IMAGE_ROW_NUM&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#row</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">class</span><span>&nbsp;Row&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FILL_TYPE&nbsp;=&nbsp;4&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@<span class="variable">@cell_map</span><span>&nbsp;=[</span><span class="string">&quot;A&quot;</span><span>,</span><span class="string">&quot;B&quot;</span><span>,</span><span class="string">&quot;C&quot;</span><span>,</span><span class="string">&quot;D&quot;</span><span>,</span><span class="string">&quot;E&quot;</span><span>,</span><span class="string">&quot;F&quot;</span><span>,</span><span class="string">&quot;G&quot;</span><span>,</span><span class="string">&quot;H&quot;</span><span>,</span><span class="string">&quot;I&quot;</span><span>,</span><span class="string">&quot;J&quot;</span><span>,</span><span class="string">&quot;K&quot;</span><span>,</span><span class="string">&quot;L&quot;</span><span>,</span><span class="string">&quot;M&quot;</span><span>,</span><span class="string">&quot;N&quot;</span><span>,</span><span class="string">&quot;O&quot;</span><span>,</span><span class="string">&quot;P&quot;</span><span>,</span><span class="string">&quot;Q&quot;</span><span>,</span><span class="string">&quot;R&quot;</span><span>,</span><span class="string">&quot;S&quot;</span><span>,</span><span class="string">&quot;T&quot;</span><span>,</span><span class="string">&quot;U&quot;</span><span>,</span><span class="string">&quot;V&quot;</span><span>,</span><span class="string">&quot;W&quot;</span><span>,</span><span class="string">&quot;X&quot;</span><span>,</span><span class="string">&quot;Y&quot;</span><span>,</span><span class="string">&quot;Z&quot;</span><span>]&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;initialize(worksheet,row_id)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@row_id</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=row_id&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@cell_count</span><span>=0&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@worksheet</span><span>&nbsp;=&nbsp;worksheet&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;curent_cell&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;&nbsp;cell_name(</span><span class="variable">@cell_count</span><span>)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;first_cell&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;cell_name(0)&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;add_cell(value,auto_fit&nbsp;=&nbsp;</span><span class="keyword">false</span><span>,style&nbsp;=&nbsp;</span><span class="string">&quot;NormalStyle&quot;</span><span>)&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;range&nbsp;=&nbsp;<span class="variable">@worksheet</span><span>.</span><span class="builtin">Range</span><span>(cell_name(</span><span class="variable">@cell_count</span><span>))&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;range['Value']&nbsp;=&nbsp;value.to_s;&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;range['Style']=style&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;range.Columns.AutoFit&nbsp;<span class="keyword">if</span><span>&nbsp;auto_fit&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@cell_count</span><span>&nbsp;+=1&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;cell_name(index)&nbsp; <br />
    </span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;second&nbsp;=&nbsp;index&nbsp;%&nbsp;26&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;first&nbsp;=&nbsp;(index&nbsp;-&nbsp;second)&nbsp;/&nbsp;26&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;first&nbsp;==&nbsp;0&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;@</span><span class="variable">@cell_map</span><span>[second]+</span><span class="variable">@row_id</span><span>.to_s&nbsp;&nbsp;&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;first&nbsp;-=1&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;@</span><span class="variable">@cell_map</span><span>[first]+@</span><span class="variable">@cell_map</span><span>[second]+</span><span class="variable">@row_id</span><span>.to_s&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;set_cell(index,value,auto_fit&nbsp;=&nbsp;</span><span class="keyword">false</span><span>,style&nbsp;=&nbsp;</span><span class="string">&quot;NormalStyle&quot;</span><span>)&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;range=<span class="variable">@worksheet</span><span>.</span><span class="builtin">Range</span><span>(cell_name(index))&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;range['Value']&nbsp;=&nbsp;value;&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;range['Style']=style&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;range.Columns.AutoFit&nbsp;<span class="keyword">if</span><span>&nbsp;auto_fit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
</div>
测试程序<br />
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-rb">
    <li class="alt"><span><span>require&nbsp;'excel'&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>excel&nbsp;=&nbsp;Excel::WorkBook.<span class="keyword">new</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>worksheet&nbsp;=&nbsp;excel.add_worksheet(<span class="string">&quot;玛雅牛&quot;</span><span>)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>worksheet.add_title('标题')&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>row&nbsp;=&nbsp;worksheet.add_row&nbsp;&nbsp;</span> </li>
    <li class=""><span>row.add_cell(<span class="string">&quot;myaniu&quot;</span><span>)&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>row.add_cell(0)&nbsp;&nbsp;</span> </li>
    <li class=""><span>row.add_cell(<span class="string">&quot;2006-01-01&nbsp;01:01:01&quot;</span><span>)&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>worksheet.add_image(<span class="string">&quot;C:\\AutoTest\\out.bmp&quot;</span><span>)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>row&nbsp;=&nbsp;worksheet.add_row&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>row.add_cell(<span class="string">&quot;玛雅牛&quot;</span><span>)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>row.add_cell(0)&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>row.add_cell(<span class="string">&quot;2006-01-01&nbsp;01:01:01&quot;</span><span>)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>worksheet.add_image(<span class="string">&quot;C:\\AutoTest\\out.bmp&quot;</span><span>)&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>excel.show&nbsp;&nbsp;</span> </li>
</ol>
</div>
<br />
由于当时该程序是具有针对性，没有太考虑通用性，有些地方还是要修改。
          <br/>
          <span style="color:red;">
            <a href="http://myaniu.javaeye.com/blog/46768#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 12 Jan 2007 21:09:05 +0800</pubDate>
        <link>http://myaniu.javaeye.com/blog/46768</link>
        <guid>http://myaniu.javaeye.com/blog/46768</guid>
      </item>
      <item>
        <title>下雪了</title>
        <author>myaniu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myaniu.javaeye.com">myaniu</a>&nbsp;
          链接：<a href="http://myaniu.javaeye.com/blog/42921" style="color:red;">http://myaniu.javaeye.com/blog/42921</a>&nbsp;
          发表时间: 2007年01月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p align="left">&nbsp;&nbsp;&nbsp;&nbsp; 大概从昨天傍晚开始 西安开始下雪了，早上出去吃饭，看见路上湿的，却不见雪的踪迹，有些失望，忽然发现路边冬青从上一片白，仔细一看，的确是雪，这是今冬的第一次见到实实在在的雪，多少有些欣慰。雪今天又断断续续的下着，下午的时候雪停了一会儿，天看起来很亮，比起前几天没有下雪的时候亮多了，大概是下雪了，天空也洗了把脸，哈哈。晚上去吃饭，发现又开始下雪&hellip;&hellip; 期待明天早上起来会有惊喜。下雪真好！</p>
          <br/>
          <span style="color:red;">
            <a href="http://myaniu.javaeye.com/blog/42921#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 03 Jan 2007 22:27:31 +0800</pubDate>
        <link>http://myaniu.javaeye.com/blog/42921</link>
        <guid>http://myaniu.javaeye.com/blog/42921</guid>
      </item>
      <item>
        <title>PostgreSQL的数据备份和恢复</title>
        <author>myaniu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myaniu.javaeye.com">myaniu</a>&nbsp;
          链接：<a href="http://myaniu.javaeye.com/blog/39378" style="color:red;">http://myaniu.javaeye.com/blog/39378</a>&nbsp;
          发表时间: 2006年12月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">pg_dump.exe,pg_resore.exe 位于 %POSTGRESQL INSATALL%bin\目录下</font></p>
<p><font face="Arial"><font face="Arial">备份指令:</font></font></p>
<p><font face="Arial">pg_dump -Fc -i -E<font color="#0000ff">UTF8</font> -O -x -h<font color="#0000ff">locahost</font> -U<font color="#0000ff">postgres</font> -W -f<font color="#0000ff">c:</font><font color="#0000ff">\test_<font color="#0000ff">databse</font>.backup</font> <font color="#0000ff">test_databse</font></font></p>
<p><font face="Arial">恢复指令：</font></p>
<p><font face="Arial">pg_restore -d<font color="#0000ff">test_databse</font><font color="#0000ff"> </font>-Fc -i -l -O -x -h<font color="#0000ff">locahost</font> -U<font color="#0000ff">postgres</font> -W -f <font color="#0000ff">c:\test_<font color="#0000ff">databse</font>.backup</font></font></p>
<p>在这个例子中，编码为UTF8,主机为localhost,用户名为postgres,数据库为<font color="#000000"> test_databae,备份恢复文件为test_databse.backup</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://myaniu.javaeye.com/blog/39378#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 16 Dec 2006 23:52:26 +0800</pubDate>
        <link>http://myaniu.javaeye.com/blog/39378</link>
        <guid>http://myaniu.javaeye.com/blog/39378</guid>
      </item>
      <item>
        <title>一个学习RoR中REST的好范例beast</title>
        <author>myaniu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myaniu.javaeye.com">myaniu</a>&nbsp;
          链接：<a href="http://myaniu.javaeye.com/blog/39355" style="color:red;">http://myaniu.javaeye.com/blog/39355</a>&nbsp;
          发表时间: 2006年12月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">今天发现这个forum的实现基本上使用了RESTful风格。</font>粗看了一下代码，感觉对学习REST有一些帮助，</p>
<p>网址：</p>
<p><font face="Arial"><a href="http://beast.caboo.se/">http://beast.caboo.se/</a></font></p>
<p><font face="Arial">源码：</font></p>
<p><font face="Arial"><a href="http://svn.techno-weenie.net/projects/beast/trunk/">http://svn.techno-weenie.net/projects/beast/trunk/</a></font></p>
<br />
<br />
安装说明：<br />
<a href="http://beast.caboo.se/forums/1/topics/381" target="_blank">http://beast.caboo.se/forums/1/topics/381</a>
<p><font face="Arial"><a href="http://svn.techno-weenie.net/projects/beast/trunk/"><br />
</a></font></p>
<p>调用beast.caboo.se 的REST服务的说明：</p>
<p><font face="Arial"><a href="http://weblog.techno-weenie.net/2006/12/13/taking-ares-out-for-a-test-drive">http://weblog.techno-weenie.net/2006/12/13/taking-ares-out-for-a-test-drive</a></font></p>
<p>可以使用<a href="http://curl.haxx.se" target="_blank">curl</a>工具来测试。（一个测试的说明文档）</p>
<p><font face="Arial"><a href="http://blog.inquirylabs.com/2006/08/04/how-to-use-curl-to-test-restful-rails/">http://blog.inquirylabs.com/2006/08/04/how-to-use-curl-to-test-restful-rails/</a></font></p>
<p>我对REST的理解：REST简化了不同应用（系统）之间的互操作性。而RoR的REST实现则更加简练，更简单，如果几个系统都采用RoR开发（最新的1.2版），系统之间要实现互操作是很简单的。</p>
<p>杂谈：我一直以来个人认为互联网上的url广义的看就相当于一般的C,C++,.JAVA中的函数，而传递给url的参数(?pramA=a&amp;pramB=b)，就相当于函数的参数，如果要实现回调，则把一个url当作参数传递过去就好了，当然url上&ldquo;函数签名（或者叫约定）&rdquo;远没有本地函数调用那么&ldquo;安全&rdquo;，回调方必须了解回调url的约定。rails以前的版本在url中隐含了一些参数信息(/controller/show/1)，并且rails内定了不少函数签名规则。而Rails1.2的REST则在HTTP协议的Header中隐含了一些参数或者说语义（POST,GET,PUT,DELETE）。Rails1.2的REST实现 替程序员作了很多工作，使得调用url&quot;函数&quot; 就像调用本地函数一样方便。</p>
          <br/>
          <span style="color:red;">
            <a href="http://myaniu.javaeye.com/blog/39355#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 16 Dec 2006 21:37:02 +0800</pubDate>
        <link>http://myaniu.javaeye.com/blog/39355</link>
        <guid>http://myaniu.javaeye.com/blog/39355</guid>
      </item>
      <item>
        <title>PostgreSQL 8.2 的新特性Advisory Locks</title>
        <author>myaniu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myaniu.javaeye.com">myaniu</a>&nbsp;
          链接：<a href="http://myaniu.javaeye.com/blog/38493" style="color:red;">http://myaniu.javaeye.com/blog/38493</a>&nbsp;
          发表时间: 2006年12月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          新加入的Advisory Locks似乎是个不错的特性 <br />
<br />
<a href="http://www.postgresql.org/docs/8.2/interactive/explicit-locking.html#ADVISORY-LOCKS" target="_blank">http://www.postgresql.org/docs/8.2/interactive/explicit-locking.html#ADVISORY-LOCKS</a><br />
<a href="http://www.postgresql.org/docs/8.2/interactive/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS" target="_blank">http://www.postgresql.org/docs/8.2/interactive/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS</a><br />
<br />
这里有一篇介绍的blog<br />
<a href="http://merlinmoncure.blogspot.com/" target="_blank">http://merlinmoncure.blogspot.com/</a><br />
<br />
个人的一些实验：<br />
pgamdin III 1.6.1<br />
Postgresql 8.2<br />
windows XP<br />
建立一个测试表<br />
CREATE TABLE tests<br />
(<br />
&nbsp; id serial NOT NULL,<br />
&nbsp; name character varying(32),<br />
&nbsp; CONSTRAINT tests_pkey PRIMARY KEY(id)<br />
)<br />
WITHOUT OIDS;<br />
<br />
测试数据<br />
insert into tests(name) values ('dafei'),('feifei'),('afei');<br />
<br />
[B]实验一：[/B]<br />
分别打开两个SQL查询窗口A，B<br />
在A中输入<br />
select pg_advisory_lock(id),* from tests where id = 1;<br />
执行<br />
执行成功。<br />
<br />
<br />
然后在B中输入<br />
select pg_advisory_lock(id),* from tests where id = 1;<br />
执行<br />
阻塞中。。。<br />
<br />
然后在A中，输入<br />
select pg_advisory_unlock(id),from tests where id = 1;<br />
执行成功，返回 t<br />
这个时候 ，B中语句执行成功，解除了阻塞。<br />
<br />
[B]<strong>实验二:</strong>[/B]<br />
在A中输入<br />
select pg_advisory_lock(id),* from tests where id = 1;<br />
执行两次，<br />
均执行成功。<br />
<br />
然后在B中输入<br />
select pg_advisory_lock(id),* from tests where id = 1;<br />
执行<br />
阻塞中。。。<br />
然后在A中，输入<br />
select pg_advisory_unlock(id),from tests where id = 1;<br />
执行成功，返回 t<br />
但是B仍阻塞，<br />
再次执行<br />
select pg_advisory_unlock(id),from tests where id = 1;<br />
执行成功，返回 t<br />
这个时候 ，B中语句执行成功，解除了阻塞。<br />
<br />
[B]实验三:[/B]<br />
<br />
在A中输入<br />
select pg_advisory_lock(id),* from tests where id = 1;<br />
执行<br />
执行成功。<br />
<br />
<br />
然后在B中输入<br />
select pg_advisory_unlock(id),from tests where id = 1;<br />
执行成功，返回 f<br />
然后执行<br />
select pg_advisory_lock(id),* from tests where id = 1;<br />
执行 阻塞中。。。<br />
<br />
然后在A中，输入<br />
select pg_advisory_unlock(id),from tests where id = 1;<br />
执行成功，返回 t<br />
这个时候 ，B中语句执行成功，解除了阻塞。<br />
<br />
[B]实验四:[/B]<br />
<br />
在A中输入<br />
select pg_advisory_lock(id),* from tests where id = 1;<br />
执行<br />
执行成功。<br />
<br />
<br />
然后在B中输入<br />
select pg_advisory_lock(id),from tests where id = 2;<br />
执行<br />
执行成功。<br />
<br />
[B]实验五:[/B]<br />
<br />
在A中输入<br />
select pg_advisory_lock(id),* from tests where id = 1;<br />
执行<br />
执行成功。<br />
然后再输入<br />
select * from tests where id = 1;<br />
执行成功<br />
<br />
<br />
然后在B中输入<br />
select * from tests where id = 1;<br />
执行成功<br />
<br />
[B]实验六：[/B]<br />
在A中输入<br />
begin;<br />
select pg_advisory_lock(id),* from tests where id = 1;<br />
commit;<br />
执行<br />
执行成功。<br />
<br />
<br />
然后在B中输入<br />
select pg_advisory_lock(id),* from tests where id = 1;<br />
执行<br />
阻塞中。。。<br />
<br />
然后在A中，输入<br />
select pg_advisory_unlock(id),from tests where id = 1;<br />
执行成功，返回 t<br />
这个时候 ，B中语句执行成功，解除了阻塞。<br />
<br />
[B]实验七：[/B]<br />
在A中输入<br />
select pg_advisory_lock(id),* from tests where id = 1;<br />
执行<br />
执行成功。<br />
<br />
然后在B中输入<br />
select pg_advisory_lock(id),* from tests where id = 1;<br />
执行<br />
阻塞中。。。<br />
<br />
关闭A，这时B仍在阻塞中。<br />
<br />
停止运行B，重新执行<br />
select pg_advisory_lock(id),* from tests where id = 1;<br />
执行成功。<br />
<br />
[B]实验八：[/B]<br />
在A中输入<br />
select pg_advisory_lock(id),* from tests where id = 1;<br />
执行<br />
执行成功。<br />
<br />
然后关闭A<br />
<br />
然后在B中输入<br />
select pg_advisory_lock(id),* from tests where id = 1;<br />
执行<br />
执行成功。<br />
<br />
[B]对比实验一[/B]<br />
使用相近的for update语句<br />
在A中输入<br />
select * from tests where id = 1 for update;<br />
执行<br />
执行成功。<br />
<br />
在B中输入<br />
select * from tests where id = 1 for update;<br />
执行<br />
执行成功。<br />
<br />
[B]对比实验二[/B]<br />
<br />
在A中输入<br />
begin;<br />
select * from tests where id = 1 for update;<br />
执行<br />
执行成功。<br />
<br />
在B中输入<br />
select * from tests where id = 1 for update;<br />
执行<br />
阻塞中。。。<br />
然后在A中执行&nbsp; commit;<br />
执行成功 ， 这个时候 ，B中语句执行成功，解除了阻塞。<br />
<br />
<br />
[B]实验结果分析[/B]<br />
从对比实验来看<br />
for update所使用的锁 Row Share，会在事务结束时释放。<br />
从实验六来看 advisory lock 不会在事务结束时释放（实验6）。<br />
从实验来看，advisory lock 会在用户当前Session中有效，当会话结束时，会释放所有的advisory lock（实验七,实验八）<br />
不过，从实验七来看，似乎如果其他会话仍在请求同一资源的话，并不回感应到锁定该资源的会话退出导致的advisory lock 释放，<br />
必须下次请求时，才会感应到，不知道这个是不是 一个bug<br />
<br />
从实验来看advisory lock 不受事务的影响，在同意个会话中 advisory lock&nbsp; 可以多次lock，但是必须与unlock成对使用（实验二）。<br />
advisory lock 不会造成同一个表被锁定（实验四）<br />
advisory lock 不会阻塞一般的查询，包括for update语句。（实验五）<br />
<br />
<br />
个人感觉advisory lock 最大的优势在于与事务无关，或者 跨事务锁定。<br />
对于 pg_advisory_lock_shared 没有进行详尽实验，<br />
在两个会话中可以同时执行<br />
select pg_advisory_lock_shared(id),* from tests;<br />
但是某个会话中 执行 pg_advisory_lock_shared后，其他会话中执行pg_advisory_lock 会阻塞。<br />
<br />
本人对postgresql的锁机制了解不是很熟，如有偏差，还请指出，不胜感激。<br />
          <br/>
          <span style="color:red;">
            <a href="http://myaniu.javaeye.com/blog/38493#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 11 Dec 2006 12:53:28 +0800</pubDate>
        <link>http://myaniu.javaeye.com/blog/38493</link>
        <guid>http://myaniu.javaeye.com/blog/38493</guid>
      </item>
      <item>
        <title>解决客户端登陆vsftpd服务器显示时间与服务器系统时间不一致问题</title>
        <author>myaniu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myaniu.javaeye.com">myaniu</a>&nbsp;
          链接：<a href="http://myaniu.javaeye.com/blog/32631" style="color:red;">http://myaniu.javaeye.com/blog/32631</a>&nbsp;
          发表时间: 2006年11月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          原因：<br />vsftpd默认使用GMT作为其时间，<br />所以可能会导致与系统时间不一致（系统时间不是GMT）<br />解决方案：<br />编辑：vsftpd.conf文件<br />以freebsd 为例：<br />root#vi /usr/local/etc/vsftpd.conf<br /><br />加入一行<br />use_localtime=YES<br /><br />保存，<br />重起vsftpd<br />一切都ok了。
          <br/>
          <span style="color:red;">
            <a href="http://myaniu.javaeye.com/blog/32631#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 06 Nov 2006 15:37:54 +0800</pubDate>
        <link>http://myaniu.javaeye.com/blog/32631</link>
        <guid>http://myaniu.javaeye.com/blog/32631</guid>
      </item>
      <item>
        <title>为vsftpd加上ssl支持。</title>
        <author>myaniu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myaniu.javaeye.com">myaniu</a>&nbsp;
          链接：<a href="http://myaniu.javaeye.com/blog/32629" style="color:red;">http://myaniu.javaeye.com/blog/32629</a>&nbsp;
          发表时间: 2006年11月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          对于一些重要的/机密的文件的传输，<br />采用普通的ftp明文传输，有可能造成信息<br />泄漏，所以采用ssl加密传输不失是一种较好的<br />解决方案.<br />案例：<br />freebsd+vsftpd 2.03+ssl<br />先前已经安装了vsftpd2.03,现在要加入ssl支持。<br />切换到root权限下：<br />1 安装openssl,<br /><br />root#cd /usr/ports/security/openssl<br />root#make install clean<br /><br />2 重新安装vsftpd2.03,加入ssl支持。<br /><br />root#/cd /usr/ports/ftp/vsftpd/<br />root#make deinstall<br />不知道 ssl的编译参数是多少？<br />查看Makefile文件。<br />root#more Makefile<br />看到有一行<br />.if !defined(WITHOUT_SSL) && defined(WITH_VSFTPD_SSL)<br /><br />现在知道了<br />root#make WITH_VSFTPD_SSL=yes install clean<br /><br />3 完成之后，创建证书：<br />openssl req -new -x509 -nodes -out vsftpd.pem -keyout vsftpd.pem<br />填写相关内容后，生成vsftpd.pem证书<br />将次证书放在。/usr/share/ssl/目录下<br /><br />4 修改vsftpd.conf文件<br />root#ee /usr/local/etc/vsftpd.conf<br />加入一些内容：<br />ssl_enable=YES<br />ssl_sslv2=YES<br />force_local_data_ssl=YES<br />force_local_logins_ssl=YES<br />rsa_cert_file=/usr/share/ssl/vsftpd.pem<br /><br />ssl_enable=YES 支持加密协议。<br />ssl_sslv2=YES 支持安全套接字层 v2<br />force_local_data_ssl=YES<br />force_local_logins_ssl=YES<br />这两行强制非匿名用户使用加密登陆和数据传输,如果设定为NO,则用户可以选择加密，也可以不加密。<br />rsa_cert_file=/usr/share/ssl/vsftpd.pem<br />指明证书的路径<br />默认为：=/usr/share/ssl/certs/vsftpd.pem<br />5 重起vsftpd,<br />使用客户端测试。<br />以FileZilla为例 Servertype 由ftp修改为FTP over SSL(explicit encryption),<br />同时修改传输模式 Edit->Settings->Firewall settings,选中Passive Mode（如果ftp在防火墙内部)<br />FileZilla是一个开源的ftp client，很好用的。哈哈。
          <br/>
          <span style="color:red;">
            <a href="http://myaniu.javaeye.com/blog/32629#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 06 Nov 2006 15:34:54 +0800</pubDate>
        <link>http://myaniu.javaeye.com/blog/32629</link>
        <guid>http://myaniu.javaeye.com/blog/32629</guid>
      </item>
      <item>
        <title>绝世经典短信笑话</title>
        <author>myaniu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myaniu.javaeye.com">myaniu</a>&nbsp;
          链接：<a href="http://myaniu.javaeye.com/blog/39368" style="color:red;">http://myaniu.javaeye.com/blog/39368</a>&nbsp;
          发表时间: 2005年06月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <!--StartFragment -->&nbsp;<span id="_ctl2_lblPermalink">1：有一丑女始终嫁不出去，希望被拐卖，一天终于梦想成真被人绑架，绑匪嫌她丑，将其送回原处，此女坚决不下车，绑匪咬牙跺脚的说：走。。车不要了！！！ <br />
<br />
2蜘蛛深爱着蚂蚁，表达爱意时却遭到拒绝，蜘蛛大吼：为什么？这一切是为什么？蚂蚁胆怯的说：俺妈说了，成天在网上呆着的都不是好人！ <br />
<br />
3你的幸福，我来建筑；你的糊涂，我来弥补；你的贪图，我来满足；你的任性，我来让步；爱护你，非我莫属，谁让我是养猪专业户. <br />
<br />
4这人呀，一上年纪就爱放屁，过去一天三遍的放，麻烦。现在好了，有了新盖中盖高压屁，一个顶过去五个，高压屁，水果味。真的。一个屁蹦五楼，不费劲！ <br />
<br />
5你要请我吃饭，如果不满足我的要求，我要把你的手机号码写在墙上，前面加两个字：办证 <br />
<br />
6有一天，有人说你是猪。为此。我和他大打出手。它妈的，不因为人家长的象什么，你就说人家是什么吧！ <br />
<br />
7昨天一梦，主说可以实现我一个愿望，我拿出地球仪说，要世界和平！主说太难了！我拿出你的照片说把这个人变漂亮吧！主满头大汗说：把地球仪拿来我再看看！ <br />
<br />
8你想发财吗？你想交桃花运吗？你想当官吗？你想一夜成名吗？你想永保青春吗？你想让全世界的人都为你疯狂吗？&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;不要瞎想了，洗洗脚睡吧！ <br />
<br />
9森林里有三只小动物聊天，小猪：现在流行用昵称，以后你们叫我小猪猪吧！小兔：那我就叫小兔兔吧！小鸡满脸不高兴：我还有事，我先走了！ <br />
<br />
10 我谨代表中共中央，国务院，全国人大，中央军委，国务院港澳台办公室向你提出最强烈的抗议：你昨天晚上尿床后留下的中国地图，为什么没有台湾！ <br />
<br />
11 雨天,湿湿的,心情也如此潮湿....每晚,你就这样呆呆的望着阴冷的窗外,痴痴地守望着.我走过来轻轻地对你说:\&quot;旺才,进去吧,送骨头的今天不会来了\&quot;. <br />
<br />
12某非婚男女同床共枕，女划线为界，曰越线者乃禽兽，一夜无话，清晨女怒，骂男乃禽兽不如。 <br />
<br />
13这可能是我最后一次给你发短信了，我在犹豫要不要告诉你，我近期要去美国了，手续都办好了，我也没办法，真的！布什说没有我他对付不了萨达姆。 <br />
<br />
14 你站在荷花上，翩翩起舞，在路人晕倒前都大喊一声：天啊！猪立叶！！ <br />
<br />
15 允许你喝醉，允许你勾妹，但你晚上必须给老娘归队，如果你敢伤老娘的心，伤老娘的肺，老娘一定把你的第三条腿打成残废，让你的鸟鸟永远打瞌睡&hellip;&hellip; <br />
<br />
16 一个四岁的小男孩抱着三岁的女孩亲了一下，小女孩羞涩的说：你可要对我负责哦，小男孩豪爽的说：放心吧，我们都不是一两岁的小孩子啦。 <br />
<br />
17 一天，我去动物园看猩猩，我吐了；又一天，你去动物园看猩猩，猩猩吐了！同样是人，差距咋就这么大呢？ <br />
<br />
18 报告淫长&ldquo;有一群女兵上来了，我们出***，战斗结束，大部分被奸，小部分受精而逃，其余被抚乳！我军一人受伤，名叫阳痿！正坐在电脑前看短信！&rdquo; <br />
<br />
19 寻猴启示:本人丢失杂毛小猴一只,特征:脏了吧唧,满脸鼻涕,身上带有一部手机,并会翻看短消息,爱猴看过短信,速给主人回信!主人好想你! <br />
<br />
20 听说你被拐卖，真的把我吓坏，你虽从小痴呆，却对社会无害，谁人如此大胆，竟敢拿你去卖，我真替他担心，卖得掉才怪! <br />
<br />
21 我和我妈说了：我喜欢你！经过和你这么长时间的相处，我感觉已经离不开你了，我想让你上我家来，能天天陪伴我！可我妈不同意，她说：家里不准养小狗！ <br />
<br />
22 我换工作了现在在银行上班，就是离你们不远的那个， 有空来找我把，到银行大喊我的名字，我就知道了 对了！我把名字改了，那个太俗 我先在叫强杰。 <br />
<br />
23 昨天我在网上看到你用的那个型号手机辐射特别大.下了我一跳.刚要通知你,又看到说对智商小于50的人不起作用.这我才放心.你也别担心了,继续用吧 <br />
<br />
24 十六大绝密文件：为提高我国人口素质国家决定清除一批有孙国貌的弱智丑陋儿童，你赶快收拾东西悄悄的走吧！别谢我！注意安全！</span> <br />
<br />
<p id="TBPingURL">&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://myaniu.javaeye.com/blog/39368#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 01 Jun 2005 21:34:00 +0800</pubDate>
        <link>http://myaniu.javaeye.com/blog/39368</link>
        <guid>http://myaniu.javaeye.com/blog/39368</guid>
      </item>
      <item>
        <title>[转载]童眼看世界</title>
        <author>myaniu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myaniu.javaeye.com">myaniu</a>&nbsp;
          链接：<a href="http://myaniu.javaeye.com/blog/39369" style="color:red;">http://myaniu.javaeye.com/blog/39369</a>&nbsp;
          发表时间: 2005年04月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>转自 <a href="http://www.pgsqldb.org">http://www.pgsqldb.org</a></p>
<p><font size="3">儿童经常会语出惊人，下面是6则这样的小故事：<br />
一<br />
一个4岁的孩子看到邻居爷爷因为老伴去世而哭泣，便跑过去坐在他身边。后来妈妈问孩子对爷爷说了些什么，孩子回答：&ldquo;我什么也没说，只是帮他一起哭&rdquo;<br />
二<br />
一次下班回家的路上，我停车观看一场儿童棒球比赛。我在场边坐下，并问一个孩子比分是多少。那孩子回答说：&ldquo;我们正以0比14落后。&rdquo;&ldquo;真的吗？&rdquo;我说，&ldquo;可你看上去并不沮丧啊？&rdquo;&ldquo;沮丧？&rdquo;孩子不解地说，&ldquo;为什么要沮丧？还没轮到我们进攻呢。&rdquo;<br />
三<br />
一个4岁的小女孩去医院做检查。医生检查她嗓子时开玩笑地问她：&ldquo;你相信我会在里面听到巴比兔（卡通形象）的声音吗？&rdquo;&ldquo;哦，不会吧&rdquo;小女孩回答说，&ldquo;天哪！巴比兔本是画在我短裤上的，难道它也在我心里吗？&rdquo;<br />
四<br />
一年级老师正在和学生们讨论一副画着一家人的画。画中一个小男孩儿头发的颜色与其它家庭成员的不同。一名男生说画中的那个孩子是被这家人收养的。一名女生说：&ldquo;我知道关于收养的所有事情，因为我就是被人收养的&rdquo;&ldquo; 被人收养意味着什么？&rdquo;另一个孩子问。小女孩回答道：&ldquo;被人收养意味着你曾在妈妈心里长大，而不是在她肚子里长大。&rdquo;<br />
五<br />
学校排演戏剧，小海梅想要得到剧的一个角色。海梅的母亲知道孩子一心想参加这次演出，但她担心海梅会落选。分配角色的那一天，小海梅激动的跑出来，眼中闪烁着骄傲的光芒。她大声说：&ldquo;妈妈，你果然猜对了，我被选中为演员们鼓掌喝彩。&rdquo;</font><br />
</p>
<br />
<br />
<p id="TBPingURL">&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://myaniu.javaeye.com/blog/39369#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Apr 2005 16:33:00 +0800</pubDate>
        <link>http://myaniu.javaeye.com/blog/39369</link>
        <guid>http://myaniu.javaeye.com/blog/39369</guid>
      </item>
      <item>
        <title>25岁前应该在意的事情（男人版）-转载</title>
        <author>myaniu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myaniu.javaeye.com">myaniu</a>&nbsp;
          链接：<a href="http://myaniu.javaeye.com/blog/39370" style="color:red;">http://myaniu.javaeye.com/blog/39370</a>&nbsp;
          发表时间: 2004年12月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span class="javascript" id="text6129">25岁前应该在意的事情（男人版） <br />
<br />
-------------------------------------------------------------------------------- <br />
<br />
　　1.男人是社会的主体，不管你信或不信，所以男人应该有种责任感。 <br />
　　 <br />
　　2.25岁之前，请记得，爱情通常是假的，或者不是你所想象的那样纯洁和永远。如果你过了25岁，那么你应该懂得这个道理。 <br />
　　 <br />
　　3.吃饭7成饱最舒服，对待女友最多也请你保持在7成。 <br />
　　 <br />
　　4.30岁之前请爱惜自己的身体，前30年你找病，后30年病找你。如果你过了30岁，你自然也会懂得这个道理。 <br />
　　 <br />
　　5.事业远比爱情重要。如果说事业都不能永恒，那么爱情只能算是昙花一现。 <br />
　　 <br />
　　6.不要轻易接受追求你的女孩。女追男隔层纱，如果你很容易就陷进去，你会发现你会错过很多东西，失去很多东西。 <br />
　　 <br />
　　7.请你相信，能用钱解决的问题，都不是问题。如果你认为钱索王道，有钱有女人，没钱没女人，那么，女人不是问题。 <br />
　　 <br />
　　8.请永远积极向上。每个男人都有他可爱的地方，但是不可爱的地方只有不积极面对生活。 <br />
　　 <br />
　　9.不要连续2次让同一个女人伤害，好马不吃回头草，是有他道理的。如果认真考虑过该分手，那么请不要做任何舍不得的行动。 <br />
　　 <br />
　　10.如果你和你前女友能做朋友，那么你要问自己：为什么？如果分手后还是朋友，那么只有2个可能：你们当初都只是玩玩而已，没付出彼此最真的感情；或者，必定有个人是在默默的付出无怨无悔！ <br />
　　 <br />
　　11.永远不要太相信女人在恋爱时的甜言蜜语。都说女人爱听甜言蜜语，其实，男人更喜欢。 <br />
　　 <br />
　　12.请不要为自己的相貌或者身高过分担心和自卑。人是动物，但是区别于动物。先天条件并不是阻挡你好好生活的借口。人的心灵远胜于相貌，请相信这点。如果有人以相貌取人，那么你也没必要太在意。因为他从某种意义来讲，只是只动物。你会跟动物怄气吗？ <br />
　　 <br />
　　13.失恋时，只有2种可能，要么你爱她她不爱你，或者相反。那么，当你爱的人不再爱你，或者从来没爱过你时。你没有遗憾，因为你失去的只是一个不爱你的人。 <br />
　　 <br />
　　14.请不要欺骗善良的女孩。这个世界上，善良的女孩太少。 <br />
　　 <br />
　　15.不能偏激的认为金钱万能，至少，金钱治不好艾滋病。 <br />
　　 <br />
　　16.请一定要有自信。你就是一道风景，没必要在别人风景里面仰视。 <br />
　　 <br />
　　17.受到再大的打击，只要生命还在，请相信每天的太阳都是新的。 <br />
　　 <br />
　　18.爱情永远不可能是天平，你想在爱情里幸福就要舍得伤心。 <br />
　　 <br />
　　19.如果你喜欢一个认为别人应该对她好的mm，请尽早放弃。没有人是应该对一个人好的。如果她不明白这个道理，也就是她根本不懂得珍惜。 <br />
　　 <br />
　　20.不要因为寂寞而找gf，寂寞男人请要学会品味寂寞。请记住：即使寂寞，远方黑暗的夜空下，一定有人和你一样，寂寞的人不同，仰望的星空却是唯一。 <br />
　　 <br />
　　21.任何事没有永远，也别问怎样才能永远。生活有很多无奈，请尽量充实自己，充实生活，请善待生活。 <br />
　　 <br />
　　End.男人有很多无奈，生活很累但是因为生活才有意义。当你以为你一无所有时，你至少还有时间，时间能抚平一切创伤，所以请不要流泪。 </span><br />
<br />
<br />
<p id="TBPingURL">&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://myaniu.javaeye.com/blog/39370#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 16 Dec 2004 23:30:00 +0800</pubDate>
        <link>http://myaniu.javaeye.com/blog/39370</link>
        <guid>http://myaniu.javaeye.com/blog/39370</guid>
      </item>
      <item>
        <title>关于计算机体系结构的一点思考。</title>
        <author>myaniu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myaniu.javaeye.com">myaniu</a>&nbsp;
          链接：<a href="http://myaniu.javaeye.com/blog/39371" style="color:red;">http://myaniu.javaeye.com/blog/39371</a>&nbsp;
          发表时间: 2004年12月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近一位朋友提到了在一个项目中的设计思想：<br />
&nbsp;&nbsp;&nbsp;&nbsp;要实现一个类似电信增值服务的软件（就像我们经常接触的系统:&ldquo;话费查询请按1，缴费请按2...&rdquo;）<br />
他的设计思想是将拨号、话音操作等基础操作做成一个个原子操作。这些原子操作功能很单一，因而<br />
他的实现很可靠。然后他又自己实现了一个业务规则层，相当于一个特殊的语言，然后还有一个解释<br />
器将规则转化成 原子操作序列，这样在保证可靠性的同时，系统的灵活性也很高。如果要添加一个<br />
新的业务，如果没有加入新的原子操作，只需几分钟编写一个新的业务规则即可。<br />
&nbsp;&nbsp;&nbsp;&nbsp;听完他的叙述，我第一个反映便是 cpu指令集，编译器，程序代码，是不是很像。<br />
&nbsp;&nbsp;&nbsp;&nbsp;计算机体系中很多地方硬件和软件都有相同的设计思想，硬件体系中有cache，软件中很多服务器为了<br />
提高性能也用cache。硬件体系中有分层思想，软件中也有。cpu技术中有流水线结构，软件中有并行处理。<br />
&nbsp;等等。。。<br />
&nbsp;&nbsp;&nbsp;&nbsp;所以，我觉得做软件的如果对硬件也了解一些，那会提高他的软件设计能力。因为硬件，软件很多地方是<br />
相通的，很多思想可以借鉴。如果某人对硬件很精通，同时又对软件很精通，那么他在开发软件时，我想他<br />
设计的系统，写出的代码可能远强于一般人。每个人的精力都有限，也许这是幻想。<br />
&nbsp;&nbsp;&nbsp;&nbsp;本人水平有限，很多理解或者认识还不到位。误导之处，还请见谅。<br />
<br />
<br />
<p id="TBPingURL">&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://myaniu.javaeye.com/blog/39371#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 16 Dec 2004 22:50:00 +0800</pubDate>
        <link>http://myaniu.javaeye.com/blog/39371</link>
        <guid>http://myaniu.javaeye.com/blog/39371</guid>
      </item>
      <item>
        <title>编译原理－现在才感受到他的重要性。</title>
        <author>myaniu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myaniu.javaeye.com">myaniu</a>&nbsp;
          链接：<a href="http://myaniu.javaeye.com/blog/39372" style="color:red;">http://myaniu.javaeye.com/blog/39372</a>&nbsp;
          发表时间: 2004年12月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp;&nbsp;&nbsp;上大学的时候，我们的编译原理老师有很重的口音，所以上课的时候老师走神儿。<br />
后来大作业时，老师让实现一个词法分析器，当时我把c语言给分析了，^_^，<br />
bug不少，而且我也知道那块有bug，不过比较懒，没处理。<br />
&nbsp;&nbsp;&nbsp;&nbsp;后来，听不少高人说编译原理很重要，如果弄得好，你可以做一个你自己的语言。<br />
于是我就买了一本编译原理的恐龙书:<font color="#000066" face="Verdana">Compilers:Principles,Techniques,and Tools&nbsp;<br />
<font color="#000000">买来之后，看了一点，就束之高阁了<br />
&nbsp;&nbsp;&nbsp;&nbsp;最近我重新把这本恐龙书拿出来啃，硬着头皮看，看了一些后，感觉还可以，英文不是<br />
很难，意思也很容易理解，还有很多例题可以加深理解，由于做了一些项目，现在重看<br />
这本书的感觉和原来大不一样，有很多地方能引起我的共鸣。<br />
&nbsp;&nbsp;&nbsp;&nbsp;最近我感觉在处理字符串的时候很得心应手。在做项目的过程中，这本书的很多思想<br />
可以借鉴，受益匪浅。</font></font><br />
<br />
<p id="TBPingURL">&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://myaniu.javaeye.com/blog/39372#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 16 Dec 2004 22:22:00 +0800</pubDate>
        <link>http://myaniu.javaeye.com/blog/39372</link>
        <guid>http://myaniu.javaeye.com/blog/39372</guid>
      </item>
      <item>
        <title>FreeBSD的安全问题－转自http://xfocus.org/</title>
        <author>myaniu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myaniu.javaeye.com">myaniu</a>&nbsp;
          链接：<a href="http://myaniu.javaeye.com/blog/39374" style="color:red;">http://myaniu.javaeye.com/blog/39374</a>&nbsp;
          发表时间: 2004年12月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          文章原出处：<br />
<a href="http://www.xfocus.net/articles/200108/248.html">http://www.xfocus.net/articles/200108/248.html</a><br />
创建时间：2001-08-07<br />
文章属性：原创<br />
文章来源：<a href="http://xfocus.org/" target="_blank">http://xfocus.org/</a><br />
文章提交：<a href="https://www.xfocus.net/bbs/index.php?lang=cn&amp;act=Profile&amp;do=03&amp;MID=3">xundi</a> (xundi_at_xfocus.org)<br />
<br />
一些FreeBSD相关的安全问题<br />
<br />
by xundi@xfocus.org <br />
<a href="http://xfocus.org/" target="_blank">http://xfocus.org/</a><br />
2001/08/07<br />
<br />
==========================================================================<br />
<br />
<br />
FreeBSD的日志安全<br />
--------------------<br />
I)如果你安装了sshd(也强烈建议安装sshd，因为默认的telnetd程序存在严重<br />
的安全问题)。请编辑你的/etc/syslog.conf文件，一般修改<br />
security.* /var/log/security条目内容如下：<br />
<br />
security.*;auth.info&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/var/log/security<br />
<br />
原因很简单，这样syslogd就把连接到sshd的日志信息记录下来。<br />
<br />
当然如果你愿意，也可以建立其他的日志文件，不过如果你建立新的日志文件，<br />
你必须检查更新/etc/newsyslog.conf是否建立相关条目，如：<br />
<br />
/var/log/auth&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;600&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;&nbsp;100&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp; Z<br />
<br />
其中/var/log/auth表示日志文件名，600是日志文件指定的属性，10表示包括<br />
要归档的文件数，100表示文件字节大小，以K为单位，*表示间隔时间或者指定<br />
时间，其中*表示日志归档是以字节(size)来判断的。最后一个Z表示指定归档<br />
要处理的格式，Z表示使用gzip(1)来压缩归档日志来节约空间，具体更多信息<br />
你可以使用man newsyslog来获得。<br />
<br />
这里建立你修改newsyslog.conf中的一些全局可读属性，如maillog和messages<br />
log，一般把它们的属性设置为600。如下所示：<br />
<br />
/var/log/messages&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;600&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp; Z<br />
/var/log/maillog&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;600&nbsp;&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;@T00&nbsp;&nbsp;Z<br />
<br />
当然如果你要把信息记录到其他主机上更好，你可以修改/etc/syslog.conf中的<br />
如下条目，把其中的注释去掉，并修改loghost为要记录的机器名字：<br />
<br />
#*.*&nbsp;&nbsp;&nbsp;&nbsp;@loghost<br />
<br />
最后你防止任意用户读取这些文件，你使用下面命令修改文件属性：<br />
<br />
# chmod 600 /etc/syslog.conf<br />
# chmod 600 /etc/newsyslog.conf<br />
<br />
=========================================================================<br />
<br />
关于SSH配置<br />
-------------<br />
<br />
就象上面所说的，telnetd守护程序存在严重的缓冲溢出可以导致远程ROOT SHELL<br />
的获得，这里强烈建议你如果需要远程控制的话，就使用SSH工具，并且保证是最<br />
新的版本，至少目前为止还没有很严重的漏洞出现(当然也有几个漏洞大家可以参考<br />
一些安全资料)。<br />
<br />
sshd控制文件是/etc/ssh/sshd_config,如果你没有使用SSH protocol 1的机会，<br />
这里建议你关闭protocol 1的使用，因为ssh protocol 1不如protocol 2安全，<br />
还可以有效的阻止攻击者通过修改包携带的版本banner来劫持(hijacking)启动<br />
会话进程并降级你到protocol 1，理论上可以迫使使用ssh 1 协议来通信。你<br />
必须注释掉Protocol 2,1而使用下面的一行来代替：<br />
<br />
Protocol 2<br />
<br />
第二，SSH在运行的时候消耗比较多的内存，是个&quot;耗粮&quot;大户，这也是cisco产品<br />
近来发现有关SSH存在拒绝服务攻击的原因。每一个连接使用一大块可观的内存，<br />
FreeBSD默认使用&quot;MaxStartups&quot;来管理，默认的值是一个比较健康的值，如：<br />
<br />
MaxStartups 5:50:10<br />
<br />
因为一个系统你除非有很多人管理系统或者提供SHELL服务，一般情况下这个值<br />
是足够了，MaxStartups不是意味着总的连接数，只是指还没有认证的连接数，<br />
这意味着，在任一(意)时刻， 多达5人可以(能)同时唤起登陆进程。<br />
<br />
默认情况下,FreeBSD的OpenSSH配置关闭了远程ROOT登陆和空密码登陆，这里还<br />
建议里关闭X11Forwarding，你可以把X11Forwarding 这行改为：<br />
<br />
X11Forwarding no <br />
<br />
如果你的机器作为服务器在运行，就不需要安装X服务程序，因为使用了<br />
X11Forwarding on，就可能被受控制了的远程主机发送进程把自己attach你的<br />
X11会话进程，从而可以记录击键记录，显示一些杂乱信息和捕获你的显示内容。<br />
<br />
强烈建议不使用静态密码，而使用DSA或者RSA KEY，你修改如下内容就可以关闭<br />
使用密码认证：<br />
<br />
PasswordAuthentication no<br />
<br />
因为使用密码验证毕竟不是一种安全的方法，存在着社会工程，猜测，窃取<br />
的可能性。<br />
<br />
对于sshd，你可以通过下面的方法来限制组用户或者光是单独用户来访问SHELL：<br />
<br />
AllowGroups shellusers<br />
或者<br />
AllowGroups wheel<br />
或者<br />
AllowUsers xundi<br />
<br />
当然你如果要改变原来的用户访问SHELL属性，如要把用户改变成/sbin/nologin<br />
而不让它访问shell，你可以使用下面的命令直接改变:<br />
<br />
chsh -s /sbin/nologin user<br />
<br />
最后你最好使用tcpwrappers来限制一些访问，你修改/etc/hosts.allow文件，注释<br />
掉&quot;ALL : ALL : allow&quot;, 去掉其他无关控制访问，增加如下内容：<br />
<br />
sshd : localhost : allow<br />
sshd : friendlycomputer : allow<br />
sshd : all : deny<br />
<br />
FreeBSD默认情况下不把ssh登陆失败的内容记录下来，你需要对/etc/security<br />
进行修改，下面的补丁只检测密码无效的登陆并记录下来，你可以增加对dsa/rsa<br />
key登陆失败或者不合法用户登陆的检测：<br />
<br />
--- /etc/security&nbsp;&nbsp;&nbsp;&nbsp;Mon Jun 11 15:45:02 2001<br />
+++ /etc/security&nbsp;&nbsp;&nbsp;&nbsp;Mon Jun 11 15:48:29 2001<br />
@@ -44,6 +44,7 @@<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sort -t. -r -n +1 -2 |<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xargs zcat -f<br />
&nbsp;&nbsp;&nbsp;&nbsp;[ -f $LOG/messages ] &amp;&amp; cat $LOG/messages<br />
+&nbsp;&nbsp;&nbsp;&nbsp;[ -f $LOG/security ] &amp;&amp; cat $LOG/security<br />
}<br />
<br />
sflag=FALSE ignore=<br />
@@ -188,6 +189,12 @@<br />
separator<br />
echo &quot;${host} login failures:&quot;<br />
n=$(catmsgs | grep -i &quot;^$yesterday.*login failure&quot; | tee /dev/stderr | wc -l)<br />
+[ $n -gt 0 -a $rc -lt 1 ] &amp;&amp; rc=1<br />
+<br />
+# Show &quot;${host} SSH login failures:&quot;<br />
+separator<br />
+echo &quot;${host} login failures:&quot;<br />
+n=$(catmsgs | grep -i &quot;^$yesterday.*failed password&quot; | tee /dev/stderr | wc -l)<br />
[ $n -gt 0 -a $rc -lt 1 ] &amp;&amp; rc=1<br />
<br />
# Show tcp_wrapper warning messages<br />
<br />
====================================================================<br />
<br />
网络部分<br />
<br />
---------<br />
<br />
默认情况下FreeBSD和许多操作系统在关闭的端口上接受到TCP SYN段的时候，会<br />
发送RST信息包，也就是告诉攻击者这个端口关闭了，导致攻击者继续扫描下一个<br />
端口，一般情况下我们都不愿意使端口扫描简单化，和不想浪费过多的CPU时间<br />
在DoS攻击上。因此我们可以使用FreeBSD系统中叫blackhole的特征，blackhole<br />
sysctl(8) MIB用来控制当对一些没有socket监听的TCP或者UDP端口接收到连接<br />
请求时所操作的行为，你可以使用man blackhole获得详细的信息，当设置这个<br />
选项后，对那些连接没有socket监听的TCP或者UDP端口的连接，系统将马上丢弃<br />
这个包而不发RST包。连接端将看到&quot;Connection reset by peer&quot;.下面的操作<br />
将激活这个特征：<br />
<br />
sysctl -w net.inet.tcp.blackhole=2<br />
sysctl -w net.inet.udp.blackhole=1<br />
<br />
你可以通过下面的操作马上启动实现这个特征：<br />
<br />
# /bin/sh /etc/rc.sysctl<br />
<br />
当然这个特征不能作为ipfw(8)工具的替代品来防卫系统，要建立更高安全的<br />
系统，你当然需要使用Ipfw(8)或者Ipfilter工具实现。<br />
<br />
修改/etc/rc.conf，把不需要的服务关闭，i)portmap服务，如果你没有NFS, NIS <br />
等需要。再/etc/rc.conf中加入：<br />
<br />
portmap_enable=&quot;NO&qu