<?xml version="1.0" encoding="GB2312"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:ref="http://purl.org/rss/1.0/modules/reference/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns="http://purl.org/rss/1.0/">
	<channel rdf:about="http://www.open-easycat.org/rss.rdf">
		<title>EaSYcAt的开源世界</title>
		<link>http://www.open-easycat.org/index.php</link>
		<description><![CDATA[欢迎光临EaSYcAt的开源世界  黑ICP备06006452]]></description>
		<items>
			<rdf:Seq>
				<rdf:li resource="http://www.open-easycat.org/index.php?entry=entry080814-094347" />
				<rdf:li resource="http://www.open-easycat.org/index.php?entry=entry080804-222645" />
				<rdf:li resource="http://www.open-easycat.org/index.php?entry=entry080518-214055" />
				<rdf:li resource="http://www.open-easycat.org/index.php?entry=entry080426-101249" />
				<rdf:li resource="http://www.open-easycat.org/index.php?entry=entry080218-235344" />
				<rdf:li resource="http://www.open-easycat.org/index.php?entry=entry080207-215946" />
				<rdf:li resource="http://www.open-easycat.org/index.php?entry=entry080204-191423" />
				<rdf:li resource="http://www.open-easycat.org/index.php?entry=entry080101-112208" />
				<rdf:li resource="http://www.open-easycat.org/index.php?entry=entry071128-094005" />
				<rdf:li resource="http://www.open-easycat.org/index.php?entry=entry071102-080359" />
			</rdf:Seq>
		</items>
	</channel>
	<item rdf:about="http://www.open-easycat.org/index.php?entry=entry080814-094347">
		<title>常用正则表达式</title>
		<link>http://www.open-easycat.org/index.php?entry=entry080814-094347</link>
		<description><![CDATA[常用正则表达式<br />Programming<br /><br />　　正则表达式用于字符串处理、表单验证等场合，实用高效。现将一些常用的表达式收集于此，以备不时之需。<br /><br />匹配中文字符的正则表达式： [\u4e00-\u9fa5]<br />评注：匹配中文还真是个头疼的事，有了这个表达式就好办了<br /><br />匹配双字节字符(包括汉字在内)：[^\x00-\xff]<br />评注：可以用来计算字符串的长度（一个双字节字符长度计2，ASCII字符计1）<br /><br />匹配空白行的正则表达式：\n\s*\r<br />评注：可以用来删除空白行<br /><br />匹配HTML标记的正则表达式：&lt;(\S*?)[^&gt;]*&gt;.*?&lt;/\1&gt;|&lt;.*? /&gt;<br />评注：网上流传的版本太糟糕，上面这个也仅仅能匹配部分，对于复杂的嵌套标记依旧无能为力<br /><br />匹配首尾空白字符的正则表达式：^\s*|\s*$<br />评注：可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等)，非常有用的表达式<br /><br />匹配Email地址的正则表达式：\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*<br />评注：表单验证时很实用<br /><br />匹配网址URL的正则表达式：[a-zA-z]+://[^\s]*<br />评注：网上流传的版本功能很有限，上面这个基本可以满足需求<br /><br />匹配帐号是否合法(字母开头，允许5-16字节，允许字母数字下划线)：^[a-zA-Z][a-zA-Z0-9_]{4,15}$<br />评注：表单验证时很实用<br /><br />匹配国内电话号码：\d{3}-\d{8}|\d{4}-\d{7}<br />评注：匹配形式如 0511-4405222 或 021-87888822<br /><br />匹配腾讯QQ号：[1-9][0-9]{4,}<br />评注：腾讯QQ号从10000开始<br /><br />匹配中国邮政编码：[1-9]\d{5}(?!\d)<br />评注：中国邮政编码为6位数字<br /><br />匹配身份证：\d{15}|\d{18}<br />评注：中国的身份证为15位或18位<br /><br />匹配ip地址：\d+\.\d+\.\d+\.\d+<br />评注：提取ip地址时有用<br /><br />匹配特定数字：<br />^[1-9]\d*$　 　 //匹配正整数<br />^-[1-9]\d*$ 　 //匹配负整数<br />^-?[1-9]\d*$　　 //匹配整数<br />^[1-9]\d*|0$　 //匹配非负整数（正整数 + 0）<br />^-[1-9]\d*|0$　　 //匹配非正整数（负整数 + 0）<br />^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$　　 //匹配正浮点数<br />^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$　 //匹配负浮点数<br />^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$　 //匹配浮点数<br />^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$　　 //匹配非负浮点数（正浮点数 + 0）<br />^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$　　//匹配非正浮点数（负浮点数 + 0）<br />评注：处理大量数据时有用，具体应用时注意修正<br /><br />匹配特定字符串：<br />^[A-Za-z]+$　　//匹配由26个英文字母组成的字符串<br />^[A-Z]+$　　//匹配由26个英文字母的大写组成的字符串<br />^[a-z]+$　　//匹配由26个英文字母的小写组成的字符串<br />^[A-Za-z0-9]+$　　//匹配由数字和26个英文字母组成的字符串<br />^\w+$　　//匹配由数字、26个英文字母或者下划线组成的字符串<br />评注：最基本也是最常用的一些表达式]]></description>
	</item>
	<item rdf:about="http://www.open-easycat.org/index.php?entry=entry080804-222645">
		<title>程序就像诗</title>
		<link>http://www.open-easycat.org/index.php?entry=entry080804-222645</link>
		<description><![CDATA[学了这么久的计算机，当我真正能静下心来写代码的时候。我慢慢的体会到很多曾经未曾感受的感觉。<br />说实话我对文学完全不在行，特别是对诗歌，曾经为从前的女友写过一些，但是她最终离开了。现在想起来那时候写的也不过是一些顺口溜。当我开始写程序的时候，我慢慢的感觉到诗歌的感觉。美丽的程序就好像美丽的诗篇。<br />函数名就好像标题。函数中的断行和空格就好像是不同诗歌的结构。那些流动的代码，也好像乐谱一样在调试器里面滚动。慢慢的，觉得程序能融入人的生活。对于写程序的人来说，我还远远不是很在行。但是每次写程序我都有新的感悟。大道至简，一个好的程序也是这样。多一个语句程序就会变的痈肿，少一个语句就会变得功能不全。就好像诗中的美感。慢慢的，你就会陶醉其中。]]></description>
	</item>
	<item rdf:about="http://www.open-easycat.org/index.php?entry=entry080518-214055">
		<title>使用ekhtml简介</title>
		<link>http://www.open-easycat.org/index.php?entry=entry080518-214055</link>
		<description><![CDATA[ekhtml是一个非常简单的html解析库，不但可以解析html而且对于xml也有一定的解析效果。鉴于没有前国内还没有这个简单的库的教程，所以我把学习体会写在下面，供新人参考。<br /><br />1.安装<br />1.1	下载<br />	安装ekhtml除了在官方网站下载之外，你还可以在cvs上面下载。在你的Unix/Linux主机上面安装cvs之后执行下面的命令：<br />	<code><b><br />	cd ~<br />	cvs -d:pserver:anonymous@ekhtml.cvs.sourceforge.net:/cvsroot/ekhtml login<br />	cvs -z3 -d:pserver:anonymous@ekhtml.cvs.sourceforge.net:/cvsroot/ekhtml co -P ekhtml<br />	</b></code><br />1.2 编译<br />	1.进入ekhtml的目录<br />	2.执行 ./autogen.sh<br />	3.执行 make<br />	4.用root身份执行 make install<br /><br />	这样就完成了安装。<br />2.ekhtml使用<br />	2.1 数据<br />		1.struct ekhtml_string_t<br />		这是ekhtml的字符串，这个字符串没有&#039;\0&#039;字符作为结尾。但是它包含两个成员： *char str ，和一个 int len。 <br />		1.struct ekhtml_attr_t <br />		对象属性，其实可以用对象属性作为一个列表。<br />		对象属性里面有四个字段：name，val 是ekhtml_string_t类型的。isBoolean是个unsigned int类型。最后一个字段指向下一个属性。<br />	<br />	2.2 一些Typedefs<br />	typedef ekhtml_string_t 	ekhtml_string_t; <br />	typedef ekhtml_attr_t 	ekhtml_attr_t;	//这两个类型上面已经说过了<br />	typedef ekhtml_parser_t 	ekhtml_parser_t; <br />	//parser_t的对象保存了一些状态信息，比如读到了一个标签，要调用什么函数来进行处理。多少数据开始处理等等。<br />	<br />	2.3 回调函数<br />	typedef void(* 	ekhtml_data_cb_t )(void *cbdata, ekhtml_string_t *data);<br />	typedef void(* 	ekhtml_starttag_cb_t )(void *cbdata, ekhtml_string_t *tag, ekhtml_attr_t *attrs);<br />	typedef void(* 	ekhtml_endtag_cb_t )(void *cbdata, ekhtml_string_t *tag);<br /><br />	上面这几个函数，我放到一起说明。如果我们要处理一个页面，那么这个页面也许会是这样：<br />	<code><br />	&lt;html&gt;<br />	&lt;head&gt;<br />	&lt;title&gt;测试页面&lt;/title&gt;<br />	&lt;/head&gt;<br />	&lt;body&gt;<br />	页面信息！<br />	&lt;/body&gt;<br />	&lt;/html&gt;<br />	</code><br /><br />	被&quot;&lt;&gt;&quot;包围的内容是 ekhtml_starttag_cb_t 所要处理的内容。我们可以定义一个函数：<br />	<code><br />	static void handle_starttag(void *cbdata, ekhtml_string_t *tag,<br />			    ekhtml_attr_t *attrs);<br />	</code><br />	第一个参数是你处理出来的数据，也就说是个返回结果。<br />	第二个参数是个字符串，也可以是NULL。是字符串说明你要解析的标签名，NULL会处理所有你没有指定标签名的标签。<br />	第三个参数，负责返回标签属性。<br />	<br />	在&lt;/ &gt;中间的内容是标签结束 ekhtml_endtag_cb_t 会处理它们。	参数和第一个比只是少了最后标签属性。<br /><br />	比如“测试页面”，“页面信息!”这样的字是标签数据。你自己定义的ekhtml_data_cb_t会处理这些东西。<br /><br />	我们可以定义一些类似这样的函数来处理我们的页面。那么如何把这些回调函数关联到我们的解析里面呢？<br />	<br />	2.4 如何解析<br />	首先要 ekhtml_parser_new 新建一个parser对象，然后执行下面的代码：<br />	<code><br />	ekhtml_parser_datacb_set();<br />    ekhtml_parser_commentcb_set();<br />    ekhtml_parser_startcb_add();<br />    ekhtml_parser_endcb_add();<br />    ekhtml_parser_cbdata_set();<br />	</code><br />	第一个函数和第二个函数处理数据和注释。这些函数的作用是把你定义的回调函数绑定到你指定的ekhtml_parser_t 类型的对象上面。<br /><br />	当你完成了绑定，你就可以去处理网页了。比较简单的处理方式是：<br />	<code><br />	while()<br />	{<br />		fread(...);  //读你的文件 标准函数没啥说的了。<br />		//在这里运行<br />		ekhtml_parser_feed(); //这里就是解析 这里是解析传进来的部分，和下面一句配合。通过fread可以把数据组合在一起<br />		ekhtml_parser_flush(); //刷新缓冲 第一个参数是 parser 第二个参数如果是true 就强制刷新<br />	}<br />	</code><br /><br />	这最后我们强制刷flush一下后就ekhtml_parser_delete<br /><br />	这就是整个解析过程。<br /><br />3 参考资料<br />	<a href="http://ekhtml.sourceforge.net/docs/index.html" target="_blank" >http://ekhtml.sourceforge.net/docs/index.html</a><br />	<a href="http://ekhtml.cvs.sourceforge.net/ekhtml/ekhtml/testsuite/tester.c?revision=1.7&amp;view=markup" target="_blank" >http://ekhtml.cvs.sourceforge.net/ekhtm ... iew=markup</a><br />]]></description>
	</item>
	<item rdf:about="http://www.open-easycat.org/index.php?entry=entry080426-101249">
		<title>[转帖][整理] 用VC6进行UNICODE编程</title>
		<link>http://www.open-easycat.org/index.php?entry=entry080426-101249</link>
		<description><![CDATA[<br />最近试图将自己的程序编译成Unicode版本，费了不少力气，相关内容整理如下，适用于VC6，但VC7、VC8应该也差不多的（后者新建项目缺省即按Unicode编译）。<br /><br />1. 添加 UNICODE 和 _UNICODE 预处理定义<br /><br />位置：Project Settings -&gt; C/C++ -&gt; Preprocessor definitions<br /><br />添加了这两个定义后，MFC的一些内置类型如 TCHAR、CString 都将转为支持宽字符类型（wchar_t）<br /><br />2. 使用宽字符相关类型，如：<br /><br />char -&gt; TCHAR、char * -&gt; LPTSTR、const char * -&gt; LPCTSTR<br /><br />3. 对字符串常量使用 _T() 宏<br /><br />4. 替换C库中的中字符串操作函数，如 strlen -&gt; _tcslen、strcmp -&gt; _tcscmp 等<br /><br />类似的还有C库中字符串与数字的转换函数，如 atoi -&gt; _ttoi、itoa -&gt; _itot 等<br /><br />5. 将 Project Settings -&gt; Link -&gt; Output -&gt; Entry Point 设为 wWinMainCRTSTartup<br /><br />否则会有如下错误：<br />msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16<br /><br />6. C++标准库中的string，有对应的宽字符版本wstring，两者均为basic_string的特化版本<br /><br />可在StdAfx.h中：<br /><br />#ifdef _UNICODE<br />#define tstring wstring<br />#else<br />#define tstring string<br />#endif<br /><br />然后在代码中使用 tstring 即可，类似的还有 fstream/wfstream、ofstream/wofstream 等<br /><br />7. 宽字符版本的英文字符仍可直接与整型值进行比较，如：<br /><br />CString s = _T(&quot;ABC&quot;);<br />ASSERT(s[0] == &#039;A&#039;);<br /><br />8. 对于仍需使用ANSI字符串的地方，如第三方类库的接口，仍可继续使用；如需进行Unicode字符串和ANSI字符串的互转换，可使用 MultiByteToWideChar 和 WideCharToMultiByte]]></description>
	</item>
	<item rdf:about="http://www.open-easycat.org/index.php?entry=entry080218-235344">
		<title>[LUPA学习向导]如何成为Linux平台C语言程序员</title>
		<link>http://www.open-easycat.org/index.php?entry=entry080218-235344</link>
		<description><![CDATA[[LUPA学习向导]如何成为Linux平台C语言程序员<br /><br />目标：<br />成为合格的Linux平台C语言程序员<br />技能：<br />掌握C语言基本语法，掌握Linux平台系统调用，熟悉Linux平台开发流程，掌握anjuta以及glade使用方法，了解kernel结构编写高质量程序。<br /><br />步骤：<br />1、学习C语言语法<br />预计时间：30天<br />参考书籍 <br /><a href="http://man.lupaworld.com/content/develop/c&amp;c++/c/C_program_lang.zip" target="_blank" >http://man.lupaworld.com/content/develo ... m_lang.zip</a><br /><br />2、学习linux平台系统调用<br />预计时间：30天<br />参考书籍 <br /><a href="http://man.lupaworld.com/content/develop/c&amp;c++/linux_c/default.htm" target="_blank" >http://man.lupaworld.com/content/develo ... efault.htm</a><br /><br />3、提高C编程技能<br />预计时间：30天<br />参考书籍 <br /><a href="http://man.lupaworld.com/content/develop/c&amp;c++/c/C_program_idea.zip" target="_blank" >http://man.lupaworld.com/content/develo ... m_idea.zip</a><br /><a href="http://man.lupaworld.com/content/develop/c&amp;c++/c/C_program_answer.zip" target="_blank" >http://man.lupaworld.com/content/develo ... answer.zip</a><br /><br />4、学习开发流程<br />预计时间：30天<br />参考书籍<br /><a href="http://man.lupaworld.com/content/manage/ringkee/linuxdev.htm" target="_blank" >http://man.lupaworld.com/content/manage ... nuxdev.htm</a><br /><br />5、学习图形界面编程初步<br />预计时间：30天<br />参考书籍<br /><a href="http://www.scivoid.net/doc/gtk/glade/" target="_blank" >http://www.scivoid.net/doc/gtk/glade/</a><br /><br />6、了解linux，了解kernel<br />预计时间：50天<br />参考书籍<br /><a href="http://man.lupaworld.com/content/develop/joyfire/" target="_blank" >http://man.lupaworld.com/content/develop/joyfire/</a><br /><br />更多电子书请查看 <a href="http://man.lupaworld.com/" target="_blank" >http://man.lupaworld.com/</a><br /><br />参与讨论交流请进入 <a href="http://www.lupaworld.com/bbs/forum-242-1.html" target="_blank" >http://www.lupaworld.com/bbs/forum-242-1.html</a>]]></description>
	</item>
	<item rdf:about="http://www.open-easycat.org/index.php?entry=entry080207-215946">
		<title>什么让我爱上Linux？</title>
		<link>http://www.open-easycat.org/index.php?entry=entry080207-215946</link>
		<description><![CDATA[什么让我爱上Linux？<br /><br />前言：谨以此文献给大过年跟家人奋战五十K的我最亲爱的另一半谢谢她对我时间上的支持。<br /><br />接触Linux是个很奇特的情缘，可能因为物以类聚，可能因为缘份。Linux就那样的出现在我的视野中，走进我的生活中，让我疯狂！<br /><br />我喜欢简单，崇尚自然，保持简单低调是我做人的准则。对我来说一杯清茶可能就是我想要的。而Linux正是这一杯清茶，或者如果我喜欢咖啡的话，那就是我的上等咖啡。真正简单的东西，其实不会简简单单。它会蕴含某种不能从直观来感受的东西，需要慢慢去品味这种美好。<br /><br />我只在自己的笔记本上装了一套很简单的ArchLinux。我的笔记本有1GMhz 的CPU，256M内存，8M的集成显示卡。对一些人来说，这种配置可以说是很老的配置了，对我来说，这足够了。我喜欢使用的功能不多，平时边听音乐边学习写程序，看电影，上网，聊天，BT下载等等……网虫的一天，也许就可以这么开始上路了。<br /><br />也许有人会问我这样一个问题，我们有Windows，我们不需要Linux什么事儿都是那么麻烦。我在这里用个不太恰当的比喻吧，有了速溶咖啡，我们还需要喝现煮的咖啡么？我们有很多方便面，我们为什么还要自己煮饭给自己的家人呢？这就是我想说的，因为我知道我最想要什么。一个理智的人到什么时候都会知道自己最想要的是什么不对么？我们不为追求新技术而追求新技术，而是因为这些技术能给我们生活带来好多变化。Linux和开源社区的技术来自于需要，而不是对市场需要的猜测。<br /><br />Linux发行版是个整体<br />我们说Linux总是说起Redhat，Ubuntu，Debian等等……，其实Linux是说的Linux内核部分。如果把Redhat比作一辆汽车，那么Linux就是这辆汽车的发动机。它赋予Redhat以动力。当然一台发动机你是开不走的。好像Redhat，Ubuntu，Debian这样的东西，我们把这称作Linux发行版。他们来自不同的社区（也就是发行机构）。这些社区为Linux装上各种软件，比如：GUI操作界面，版本管理器，软件开发工具，办公软件，浏览器等等……而这些软件大多来自于社区。这样汽车就有了轮子，有了方向盘，仪表盘，座椅，甚至CD播放机。<br /><br />Linux是非常灵活的系统<br />这也是我最喜欢Linux的地方，就是我可以为我的机器的操作系统选择各种与众不同的零配件。我刚才说了，我的本子配置相当于7年前的主流配置，所以我可以选择轻量级的软件来让我计算机更加顺畅的运行我希望它完成的任务。因为发行版的社区，通常为我们提供了数量多达几万种的软件和工具可供选择。我们不需要在互联网上四处寻找这些软件。我们通常有个叫做软件包管理器“小软件”（其实是个系统，我怕说系统大家会觉得很庞大）。这个小精灵一样的东西会让我们告别从上网站下载软件历史。我们只需要知道自己想要什么软件名字，这个小东西就会告诉我们，软件仓库里面有没有我们需要的东西。如果没有，那很不幸，你还是要去网站下载然后安装。但你至少大多数时候可以不用这样做。我们都经历过装系统之后到处找驱动的窘境，而软件包管理器可以帮你免除这些麻烦，简单一个命令，你就可以下载同时安装好你要的软件。<br /><br />强大的文档支持<br />我们很多时候不知道一些软件如何使用，其实学习这些使用的方法有很多种：<br />1）Linux里面自带有一个man 命令，可以通过这个命令来查看软件附带的文档。虽然大多都是英文的，但总比没有的好。<br />2）可以通过论坛提问方式来找到问题解决方法。<br />3）Google是你最好的老师。<br />4）我们还可以在书店找到很多书籍。<br />5）如果你喜欢花钱来学，直接找个学习班吧。<br /><br />自由和社区<br />Linux中的大多数软件，都是自由软件（FreeSoft不是免费软件）。自由软件有自己独特的开发流程，它来自于社区，是一种松散的开发方式。社区由若干小组构成，不同的小组负责软件的不同部分。这些人很多都没有报酬的做这些软件，并且按照自由软件的协议，共享自己的代码，让以后更多人能够阅读理解这些代码。从而对代码做出改进。就这样Linux诞生了，发行版诞生了，世界上有了自由软件。因为自由，所以我对这些软件的生产和加工很放心，我可以自己修改软件的任何部分（如果我能达到那种高度，我会的！）。<br /><br />系统安全<br />Linux中带有很强大的防火墙，当然也有杀毒软件。其实非常的安全，它的用户管理，磁盘分配，包括文件管理，网络传输都更加严密，让我们很少能中一些乱七八糟的东西。所以我暂时没必要安装专门的防火墙和杀毒软件。系统发现漏洞更新也非常迅速。<br /><br />这只是Linux无数特点的一个子集，这些特点满足我再合适不过了。我在Linux上面工作，学习，娱乐。用我自己独一无二的系统。跟我的思想合而为一！<br /><br />谢谢大家对我文章的支持！]]></description>
	</item>
	<item rdf:about="http://www.open-easycat.org/index.php?entry=entry080204-191423">
		<title>xinetd方式vsftpd简单配置</title>
		<link>http://www.open-easycat.org/index.php?entry=entry080204-191423</link>
		<description><![CDATA[vsftp简单配置<br /><br />这篇文章适合时不常用ftp来共享文件的linuxer,本文希望能对使用xinetd方式架设vsftp的朋友给以提示.<br /><br /><b>vsftp简介</b><br />vsftp是一款非常小巧的ftp服务器软件,作为一款ftp软件,它可以提供浏览,上传,下载等基本的服务.同时还可以限制客户端最大线程和最大ftp速度.可以匿名登录.因为他结构和配置都很简单vsftp除了适合专业ftp服务器之外还同样非常适合家庭用户.<br /><br /><b>工作方式</b><br />vsftp有两种工作方式.<br />1.实时在线模式:<br />这种方式适合专门的ftp模式.vsftp实时相应用户连接.<br />2.xinetd方式:<br />这种方式是当客户端请求登录vsftp时才调用vsftp进行服务.这种方式比较灵活也就是我下面所讲的方式.<br /><br /><b>安装配置</b><br />网络上介绍vsftp的安装的文章有很多,你所用的linux发行版本也有相应的编译好的安装包,您可以参考发行版文档来安装vsftp<br />如我使用archlinux作为我的系统:<br /><code><br />pacman -Sy xinetd vsftpd<br /></code><br />这里我首先安装了xinetd这个服务<br /><br />然后我们就可以配置xinetd服务:<br />建立/etc/xinetd.d/vsftpd文件(如果有就直接编辑)<br /><code><br />service ftp<br />{<br />        socket_type             = stream<br />        wait                    = no<br />        user                    = root<br />        server                  = /usr/sbin/vsftpd<br />        log_on_success  += HOST DURATION<br />        log_on_failure  += HOST<br />        disable                 = no<br />}<br /></code><br />最后的disable表示这个端口是否启用.当然如果不知道这些参数的作用可以参考xinetd的man页或者其他相关文章.<br /><br />配置/etc/vsftpd.conf文件.<br />网络上很多中文参考文章,请自己google这里不做详解.<br /><br />最后配置 /etc/hosts.allow 这一步很关键!不然端口打开了也不能连接服务器.<br /><code><br />vsftpd:192.168.1.<br /></code><br />这个意思就是vsftpd 接受192.168.1.xx下面ip地址来的链接<br />当然vsftpd还需要建立一个ftp默认的root路径.并且建立ftp用户.<br />如何配置vsftpd可以参考:<br /><a href="http://www.linuxsir.org/main/?q=node/152" target="_blank" >http://www.linuxsir.org/main/?q=node/152</a>]]></description>
	</item>
	<item rdf:about="http://www.open-easycat.org/index.php?entry=entry080101-112208">
		<title>wxPython 简介</title>
		<link>http://www.open-easycat.org/index.php?entry=entry080101-112208</link>
		<description><![CDATA[wxPython 程序架构<br /><br />              其实这篇文章是一篇入门文章，这里把wxpython的最基本的一些东西介绍给新人。当然也是我一天来学习的成果的一个总结吧。<br /><br />	实际上学习wxpython不是很难，因为python本身就是简单的。所以作为新人，你千万不能对你的学习能力有所怀疑，其次就是要有颗持之以恒的心。<br /><br />	wxPython的程序主要是基于两个类的实例，一个是wx.App应用程序类，另外一个就是wx.Frame框架类（其实框架类还有很多框架可以选择）。也就是说着两个对象缺一不可。<br />	<br />	wx.App处理wxPython系统的启动和初始化在系统上运行的Gui工具，设定和获得应用程序的特性。执行窗口系统主消息或事件循环，调度窗口实例的事件。所以每个wxPython程序都必须有一个wx.App实例。而Frame框架就是可以理解成窗口，我们可以在这个窗口上面创建菜单，工具栏，按钮，文本框等等控件。应用程序类和框架类的主要方法，大家可以自己去查手册。<br /><br />	那么有了上面说到的两个类，又是如何处理这些的呢？实际上每个应用程序都有一个框架，有的是多窗口的也有单窗口的。架构决定了窗口大体上的样子。当然了，一个应用程序也可以有多个架构。我们用wx.App.SetTopWindow()来让wxPython知道那个架构是最主要的。<br /><br />	下面来看看实际代码：<br />	<br /><code><br />#最简单的wxPython程序：<br />import wx #引入wx模块<br />#应用程序实例类<br />class App(wx.App):	<br /><br />....#定义启动时候的方法<br />....#是程序启动时初始化程序的函数，不同于构造函数<br />....def OnInit(self): <br />........#这里建立了wx.Frame的实例定义了标题为&#039;Bare&#039;	<br />........frame = wx.Frame(parent=None, title=&#039;Bare&#039;)<br />........#显示了这个构架<br />........frame.Show()<br />........return True<br /><br />app = App() 		#应用程序实例化<br />app.MainLoop() 	#进入消息循环<br /></code><br /><br />	这样一个最简单的wx程序就可以启动了。祝大家新年愉快！]]></description>
	</item>
	<item rdf:about="http://www.open-easycat.org/index.php?entry=entry071128-094005">
		<title>GNU 较宽松公共许可证 (简体中文翻译版)</title>
		<link>http://www.open-easycat.org/index.php?entry=entry071128-094005</link>
		<description><![CDATA[GNU 较宽松公共许可证 (简体中文翻译版)<br /> <br /><br />声明!<br />这是一份 GNU 较宽松公共许可证非正式的中文翻译。它不是自由软体基金会所发布，并且不能适用于使用 GNU LGPL 的软体 —— 只有 GNU LGPL 英文原文的版本才行。然而，我们希望这份翻译能帮助中文的使用者更了解 GNU LGPL。  <br />This is an unofficial translation of the GNU Lesser General Public License into Chinese. It was not published by the Free Software Foundation, and does not legally state the distribution terms for software that uses the GNU LGPL--only the original English text of the GNU LGPL does that. However, we hope that this translation will help Chinese speakers understand the GNU LGPL better.<br /> <br /><br /> <br /><br />GNU 较宽松公共许可证<br />1999.2, 第 2.1 版<br /><br />版权所有 (C) 1991, 1999 Free Software Foundation, Inc.<br />59 Temple Place, Suite 330, Boston, MA 02111-1307 USA<br /><br />允许每个人复制和发布本授权文件的完整副本，<br />但不允许对它进行任何修改。<br /><br />[这是第一次发表的较宽松公共许可证 (Lesser GPL) 版本。它同时也可视为 GNU 函数库公共许可证 (GNU Library Public License) 第 2 版的后继者，故称为 2.1 版]<br /><br /><br /><br />导言<br /><br />大多数软体许可证决意剥夺您共享和修改软体的自由。相反的，GNU 通用公共许可证力图保证您共享和修改自由软体的自由 —— 保证自由软体对所有使用者都是自由的。<br /><br />这个许可证，较宽松公共许可证，适用于一些由自由软体基金会与其他决定使用此许可证的软体作者，所特殊设计的软体套件 —— 象是函数库。您也可以使用它，但我们建议您事先仔细考虑，基于以下的说明是否此许可证或原来的通用公共许可证在任何特殊情况下均为较好的方案。<br /><br />当我们谈到自由软体时，我们所指的是自由，而不是价格。我们的 GNU 通用公共许可证是设计用以确保使您有发布自由软体备份的自由（如果您愿意，您可以对此项服务收取一定的费用）；确保您能收到程式原始码或者在您需要时能得到它；确保您能修改软体或将它的一部分用于新的自由软体；而且还确保您知道您可以做上述的这些事情。<br /><br />为了保护您的权利，我们需要作出限制：禁止任何人否认您上述的权利，或者要求您放弃这些权利。如果您发布软件的副本，或者对之加以修改，这些规定就转化为您的责任。<br /><br />例如，如果您发布此函数库的副本，不管是免费还是收取费用，您必须将您享有的一切权利给予接受者；您必须确保他们也能收到或得到原始程式码；如果您将此函数库与其他的程式码连结，您必须提供完整的目的对象文件和程序(object file)给接受者，则当他们修改此函数库并重新编译过后，可以重新与目的档连结。您并且要将这些条款给他们看，使他们知道他们有这样的权利。<br /><br />我们采取两项措施来保护您的权利: （1）用版权来保护函数库。并且，（2）我们提供您这份许可证，赋予您复制，发布和（或）修改这些函数库的法律许可。<br />为了保护每个发布者，我们需要非常清楚地让每个人明白，自由函数库是没有担保责任的。如果由于某人修改了函数库，并继续加以传播，我们需要它的接受者明白：他们所得到的并不是原始的版本。故由其他人引入的任何问题，对原作者的声誉将不会有任何的影响。<br /><br />最后，由于软体专利不断地威胁自由软体的存在，我们希望商业公司无法藉由自专利持有者取得一个受限的许可证，而有效地限制自由软体的使用者。因此，我们坚持一个函数库所能取得的任何专利，必须与本许可证所声明的“完全自由使用”一致。<br /><br />大部分的 GNU 软体，包括一些函数库，是受到原来的 GNU 通用公共许可证的保护。本许可证， GNU 较宽松通用公共许可证，适用于特殊设计的函数库，且与原来的通用公共许可证有很大的不同。我们在特定的函数库中使用它，以准许非自由的程式可以与这些函数库连结。当一个程式与一个函数库连结，不论是静态连结或使用共享函数库，二者的结合可以合理地说是结合的作品，一个原来的函数库的衍生品。因此，原来的通用公共许可证只有在整个结合品满足其自由的标准时，才予许连结。较宽松通用公共许可证则以更宽松的标准允许其他程式码与本函数库连结。<br /><br />我们称此许可证 &quot;较宽松&quot; 通用公共许可证，是因为它比起原来的通用公共许可证对使用者的自由做到较少的保护。在与非自由软体竞争时，它也提供其他自由软体的写作者较少的优势。这些不利之处正是我们使用原来的通用公共许可证于许多函数库的理由。然而，较宽松的许可证可在某些特殊场合下带来好处。例如，在少数情况下，可能会有特殊的需要而鼓励大家尽可能广泛地使用特定的函数库，因而使它成为实际上的标准。为了达到此目标，必须允许非自由的程式使用此函数库。一个较常发生的情况是一个自由的函数库与一个被广泛使用的非自由函数库做相同的工作，在此情况下，限制只有自由软体可以使用此自由函数库不会有多少好处，故我们如用了较宽松通用公共许可证。<br /><br />在其他情况下，允许非自由程式使用特定的函数库，可以让更多的人们使用自由软体的大部分。例如，允许非自由程式使用 GNU C 函数库可以让更多的人们使用整个 GNU 作业系统，以及它的变形，GNU/Linux 作业系统。<br /><br />尽管较宽松通用共公许可证对使用者的自由是较少的保护的，它却能确保与此函数库连结的程式的使用者拥有自由，而且具有使用修改过的函数库版本来执行该程式的必要方法。<br /><br />以下是复制、发布、以及修改的精确条款与条件。请注意 &quot;基于函数库的作品&quot; 以及 &quot;使用函数库的作品&quot; 之间的差异：前者包含来自函数库修改过的原始码；而后者则必须与函数库结合才能执行。<br /><br /><br />GNU 较宽松通用公共许可证<br /><br />有关复制，发布和修改的条款和条件<br /><br />0. 本许可证适用于任何软体函数库，或其他包含了由版权所有者加入的注意事项的程式，或其他有公信力的团体宣称其程式可以在较宽松通用公共许可证 (也称之为 &quot;本许可证&quot;) 的条款下发布。每一位许可证接受者以 &quot;您&quot; 来称呼。<br /><br />一个 &quot;函数库&quot; 意指一些软体函数的集合，以及或准备好的资料以方便与应用程式 (其使用了其中某些函数与资料) 连结形成可执行的程式。<br /><br />以下，&quot;函数库&quot; 一词指的是任何在本条款下发布的这一类软体函数库或作品，一个 &quot;基于本函数库的作品&quot; 意指函数库或任何在版权法下的衍生作品：也就是说，一个包含了本函数库或其一部分的作品，可以是原封不动的，或经过修改的，和/或直接翻译成其他语言的。 (在下文中，翻译是不受限地包含在 &quot;修改&quot; 的条款中。)<br /><br />作品的 &quot;原始码&quot; 意指对作品进行修改最优先择取的形式。对函数库而言，完整的原始码意指所有模组的所有原始程式，加上有关的介面的定义，加上控制函数库的安装和编译的 script。<br /><br />本许可证条款不适用于复制，发布和修改以外的活动。这些活动超出这些条款的范围。使用本函数库来执行本程式的动作不受条款的限制，而程式的输出只有在其内容所构成的作品是基于本函数库时 (与在什么样的工具中使用本函数库来输出无关) ，这一条款才适用。以上是否为真则取决于本函数库具体用来做什么。<br /><br />1. 只要您在每一程式副本上明显和恰当地宣告版权声明和不承担担保的声明，并保持此许可证的声明和没有担保的声明完整无损，并和程式一起给其他每位程式接受者一份许可证的副本，您就可以用任何媒体复制和发布您收到的函数库的完整原始码。<br /><br />您可以为转让副本的实际行动收取一定费用。您也可以选择提供担保以换取一定的费用。<br /><br />2. 只要您同时满足下面的所有条件，您就可以按前面第一款的要求修改函数库的一个或几个副本或它的任何部分，以此形成基于此函数库的作品，并且复制和发布这一经过修改的程式或作品:<br /><br /><br />被修改的作品本身必须是一个软体函数库。<br /><br />您必须在修改过的档案中附有明确的说明：您修改了此一档案及任何修改的日期。<br /><br />您必须让整个作品允许第三方在此许可证条款下可以免费使用。<br /><br />如果修改过的函数库其某个设备使用到了「使用本函数库的应用程式」所提供的函数或资料表格，却不是当此设备被呼叫时以参数列传入时，则您必须确实做到，当应用程式不提供这样的函数或表格时，则此设备依旧能工作，且其执行的任何目的仍然有意义。<br />(例如，一个函数库的函数用来计算平方根，其目的是有完整的定义且与应用程式是无关的。因此， 2d 小节要求任何本函数会使用的，由应用程式所提供的函数或表格必须是选择性的：如果应用程式不提供的话，则计算平方根的函数必须依旧能计算平方根)<br /><br />这些要求适用于整个修改过的作品。如果能够确定作品的一部分并非本函数库的衍生产品，且可以合理地单独考虑并将它与原作品分开的话，则当您将它作为独立的作品发布时，它不受此许可证和其条款的约束。但是当您将这部分与基于本函数库的作品一同发布时，则整个套件将受到本许可证条款约束，其对于其他许可证持有人的使用范围扩大到整个产品，也就是套件的每个部分，不管它是谁写的。<br /><br />因此，本条款的意图不在于索取权利，或剥夺完全由您完成的作品的权利，而是履行权利来控制基于本函数库的集体作品或衍生作品的发布。 此外，将与本函数库无关的作品和本函数库 (或基于本函数库的作品) 一起放在贮存媒体或发布媒体的同一卷上，并不导致将其他作品置于此许可证的约束范围之内。<br /><br />3. 对于一个函数库的副本，您可以选择性地使用原来的 GNU 通用公共许可证上的条款来取代本许可证上的条款。如果您要这么做，您必须修改所有的参考到本许可证的注意事项，使它们指向原来的 GNU 通用公共许可证，第二版，以取代本许可证(如果有比第二版的原来的 GNU 通用公共许可证更新的版本出现的话，则如果您愿意的话可以特别指明使用新版)。请不要对这些注意事项做出其他的改变。<br /><br />一旦在一个副本上做了这样的改变，则该副本就无法撤回这样的改变，故原来的 GNU 通用公共许可证将适用于所有后续的副本以及由此副本衍生出来的作品。<br /><br />此一选择性适用于当您想要将一部分的函数库原始码复制到一个非函数库的程式使用时。<br /><br />4. 您可以以目标码或可执行形式复制或发布本函数库 (或符合第 2 款，基于本函数库的作品)，只要您遵守前面的第 1、2 款，并同时提供完整的相关机器可读的原始码，而这些原始码必须在前面的第 1 与第 2 款条件下，在一般习惯上用来做软体交换的媒体上发布。<br /><br />如果所发布的目标码是由指定的地点提供拷贝索取，那么由同一地点所提供等价的原始码拷贝索取可以算作原始码的发布，即使第三方不强求与目标码一起复制原始码。<br /><br />5. 一个程式若包含不经任何部分修改的函数库，但却是设计经由编译或连结的方式与本函数库一同工作者，称之为 &quot;使用函数库的作品&quot;。这样的一个作品，严格地说，并非本函数库的衍生作品，因而不在本许可证的范围之内。<br /><br />然而，将 &quot;使用函数库的作品&quot; 与本函数库连结而产生可执行程式，则是本函数库的衍生品 (因为它包函了本函数库的一部分)，而不是 &quot;使用函数库的作品&quot;，因此其可执行程式包含在本许可证的范围内。第 6 款说明了发布此可执行程式的条款。<br /><br />当 &quot;使用函数库的作品&quot; 使用了函数库部分的标头档内容时，则此作品即使其原始码不属于本函数库的衍生品，但其目标码仍然是。这一点是否为真特别在是否本作品可以在不需要本函数库即可连结，或者是否该作品本身也是一个函数库时特别明显。<br /><br />如果这样的目标档只使用数字参数、资料结构层级与附属品、以及小巨集和小内□式 (小于或等于十行) ，则此目标档的使用是不受限的，不论是否它是合法的衍生作品。 (但可执行程式若包函此目标档以及一部分的函数库，仍然将在第 6 款的规定下)<br /><br />否则的话，如果本作品是本函数库的衍生品，您必须在第 6 款的规定下发布该作品的目标码。任何包含该作品的可执行程式也在第 6 款的范围内，不论它们是否直接与本函数库连结。<br /><br />6. 做为上述条款的例外情况，您也可以将 &quot;使用函数库的作品&quot; 与本函数库结合或连结，以产生包含部分本函数库的作品，并在允许使用者自身使用时可以修改该作品，以及在对修改进行反组译除错的情况下，您可以依照您的选择发布该作品。<br /><br />您必须在每个作品的副本突显出如下的注意事项：本函数库在作品中被使用，以及本函数库以及它的使用是在本许可证的规定下。您必须提供本许可证的副本。如果该作品在执行时显示版权声明，您必须在其中包含本函数库的版权声明，以及指引使用者取得本许可证的副本。同时，您必须做到以下其中一件事：<br /><br /><br />必须将完整的机器可读的函数库原始码包含在该作品中，包括任何该作品使用到的改变 (这些改变必须在前述第 1 与第 2 款的要求下发布)；而且，如果该作品是一个与函数库连结的「完整的、机器可□的 &quot;使用函数库的作品&quot;」，则要有目标码和/或原始码，如此使用者可以修改本函数库且可以重新连结，以产生包函修改过的函数库的修改过的可执行程式。 (理所当然的若使用者修改了函数库的档案定义内容时，则该作品不必然可以重新编译以使用修改过的定义。)<br /><br />在与函数库连结时使用适当的分享函数库连结机制。一个适当的机制是： (1) 在执行时使用已存在于使用者的电脑中的函数库副本，而不是将函数库的函数复制到可执行程式里，以及 (2) 如果使用者安装了一份修改过的函数库，只要修改过的版本在介面上与该作品在编译连结时所用的版本是相容的，则该执行程式可以与修改过的函数库运作良好。<br /><br />在该作品内提供书面报价，有效期不少于三年，以提供同样的使用者上述第 6a 款中的内容，费用不得超过该程式发布的实际成本。 如果所发布的作品是由指定的地点提供拷贝索取，则由同一地点提供上述内容的等价拷贝索取。<br /><br />确定使用者已经收到该作品的一份复制，或是您已经寄给该使用者一份复制品。<br />对于一个可执行程式，其所需的 &quot;使用函数库的作品&quot; 的形式必须包括任何要从中再产生可执行程式时所需的资料与工具程式。然而，有一个特殊例外，其所发布的内容不需要包括任何一般与「可执行本程式的作业系统」的主要部分 (如编译器、核心等) 一起发布的部分 (不论是原始码或可执行码)，除非这些组成部分和可执行作品结合在一起。<br /><br />有一个可能情况是，这些要求与其他通常不与作业系统在一起的私有函数库的版权限制相抵触，这样的抵触表示您不能将它们与本函数库一起用于您发布的可执行程式中。<br /><br />7. 您可以将使用本函数库的函数库设备，以及其他不在本许可证范围内的函数库，对等地放入一个单独的函数库中，并在基于本函数库的作品以及其他函数库在其他状态下同意可以个别发布，以及您做到以下两点的情况下，您可以发布此结合的函数库：<br /><br /><br />将基于本函数库的作品单独不与其他函数库设备结合地，与此结合的函数库一同发布。该作品必须在上述条款的规定下发布。<br /><br />在此结合的函数库中明显地指出其中一部分的作品是基于本函数库，并且说明那里可以找到同样不具结合形式的作品。<br />8. 除非您明确按许可证提出的要求去做，否则您不能复制、修改、转发许可证、与本函数库连结、和发布本函数库。任何试图用其他方式复制、修改、转发许可证、与本函数库连结、和发布本函数库是无效的，而且将自动结束许可证赋予您的权利。然而，对那些从您那里按许可证条款得到副本和权利的人们，只要他们继续全面履行条款，许可证赋予他们的权利仍然有效。<br /><br />9. 您没有在许可证上签字，因而您没有必要一定接受此一许可证。然而，没有任何其他东西赋予您修改和发布本函数库及其衍生作品的权利。如果您不接受许可证，这些行为是法律禁止的。因此，如果您修改或发布函数库 (或任何基于函数库的作品) ，您就表明您接受这一许可证以及它的所有有关复制、发布和修改本函数库或基于它的作品的条款和条件。<br /><br />10. 每当您重新发布函数库 (或任何基于函数库的作品) 时，接受者自动从原始许可证颁发者那里接到受这些条款和条件支配的复制、发布、连结或修改本函数库的许可。您不可以强迫接受者履行除了这里赋予他们的权利之外的其他限制。您也没有强求第三方履行许可证条款的义务。<br /><br />11. 如果由于法院判决或违反专利的指控或任何其他原因 (不限于专利问题) 的结果，使得强加于您的条件 (不管是法院判决，协议书或其他) 和许可证的条件有冲突时，他们也不能令您背离许可证的条款。在您不能同时满足本许可证规定的义务及其他相关的义务来发布函数库时，则结果您只能够根本不发布函数库。例如，如果某一专利许可证不允许所有直接或间接从您那里接受副本的人们，在不付专利费的情况下重新发布函数库，唯一能同时满足两方面要求的办法是停止发布函数库。<br /><br />如果本条款的任何部分在特定的环境下无效或无法实施，就使用条款的其余部分，并将这部分条款作为整体用于其他环境。本条款的目的不在于引诱您侵犯专利或其他财产权的要求，或争论这种要求的有效性。本条款的主要目的在于保护自由软体发布系统的完整性。它是通过公共许可证的应用来实现的。许多人已依赖同是出自此系统的应用程式，经由此系统发布大量自由软体而做出慷慨的供献。作者/捐献者有权决定他/她是否通过任何其他系统发布软体，许可证持有人不能强加这种选择。<br /><br />本节的目的在于明确说明许可证其余部分可能产生的结果。<br /><br />12. 如果由于专利或者由于有版权的介面问题使函数库在某些国家的发布和使用受到限制，则在许可证约束下的原始版权拥有者可以增加发布地区的限制条款，将这些国家明确排除在外，并在这些国家以外的地区发布函数库。在这种情况下，许可证套件含的限制条款和许可证正文一样有效。 13. 自由软体基金会可能随时出版较宽松通用公共许可证的修改版或新版。新版和当前的版本在原则上保持一致，但在提到新问题时或有关事项时，在细节上可能出现差别。<br /><br />每一版本都有不同的版本号。如果函数库指定可适用的许可证版本号以及 &quot;任何更新的版本&quot; ，您有权选择遵循指定的版本或自由软体基金会以后出版的新版本。如果函数库未指定许可证版本，您可选择自由软体基金会已经出版的任何版本。 14. 如果您愿意将函数库的一部分结合到其他自由程式中，而它们的发布条件不同，请写信给作者，要求准予使用。如果是自由软体基金会加以版权保护的软体，写信给自由软体基金会，我们有时会作为例外的情况处理。我们的决定受两个主要目标的指导，这两个主要目标是：我们的自由软体的衍生作品继续保持自由状态，以及从整体上促进软体的共享和重复利用。<br /><br />没有担保<br />15. 由于函数库准予免费使用，在适用法准许的范围内，对函数库没有担保。除非另有书面说明，版权所有者和/或其他提供函数库的人们 &quot;一样&quot; 不提供任何类型的担保，不论是明确的，还是隐含的，包括但不限于可销售和适合特定用途的隐含保证。全部的风险，如函数库的质量和性能问题都由您来承担。如果函数库出现缺陷，您应当承担所有必要的服务、修复和改正的费用。<br /><br />16. 除非适用法或书面协议的要求，在任何情况下，任何版权所有者或任何按许可证条款修改和发布函数库的人们都不对您的损失负有任何责任。包括由于使用或不能使用函数库引起的任何一般的、特殊的、偶然发生的或重大的损失 (包括但不限于数据的损失，或者数据变得不精确，或者您或第三方的持续的损失，或者函数库不能和其他软体协调运行等) 。即使版权所有者和其他人提到这种损失的可能性也不例外。<br /><br /><br />-条文结束-<br /><br /><br /><br />如何将这些条款用到您新的函数库<br /><br />如果您开发了新函数库，而且您需要它得到公众最大限度的利用，要做到这一点的最好办法是将它变为自由软体，使得每个人都能在遵守本条款 (或者是在原来的通用公共许可证的条款) 的基础上对它进行修改和重新发布。<br /><br />为了做到这一点，请将函数库附上下列声明。最安全的方式是将它放在每个原始码档案的开头，以便最有效地传递拒绝担保的信息。每个文件至少应有 &quot;版权所有&quot; 行以及在什么地方能看到声明全文的说明。<br /><br />用一行空间描述函数库的名称和它的用途简单说明<br />版权所有 (C) 19XX 作者姓名<br />这一函数库是自由软体，您可以遵照自由软体基金会出版的 GNU 较宽松通用公共许可证条款来修改和重新发布这一程式，或者用许可证的第二版，或者 (根据您的选择) 用任何更新的版本。<br /><br />发布这一函数库的目的是希望它有用，但没有任何担保。甚至没有适合特定目的而隐含的担保。更详细的情况请参阅 GNU 较宽松通用公共许可证。<br /><br />您应该已经和函数库一起收到一份 GNU 较宽松通用公共许可证的副本。如果还没有，写信给：<br /><br />Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.<br /><br />此外还应加上如何藉由电子邮件或一般信件与您保持联系的信息。<br />如果需要，您应该取得您的上司 (如果您是程式员) 或您的学校签署放弃函数库版权的声明。下面只是一个例子，您应该改变相应的名称：<br /><br />Yoyodyne 公司以此方式放弃 James Random Hacker 所写的 `Frob&#039; 函数库 (用以扭转 knobs 的函数库) 的全部版权利益。<br />Ty coon 签名，1990.4.1<br />Ty coon 副总裁<br />]]></description>
	</item>
	<item rdf:about="http://www.open-easycat.org/index.php?entry=entry071102-080359">
		<title>[转帖]Linux笔记本电源管理指南</title>
		<link>http://www.open-easycat.org/index.php?entry=entry071102-080359</link>
		<description><![CDATA[Linux是一种性能优越的开源操作系统，随着其性能和知名度越来越高，最主要的是在价格上无与伦比的优势，许多厂家开始推出Linux笔记本电脑，并且这种趋势大有愈演愈烈之势。我们知道，笔记本受到电池续航时间的限制，所以特别注重机器的电源管理。因此，本文将讨论如何处理这些事项。<br /><br /><a href="http://forum.ubuntu.org.cn/viewtopic.php?t=74990" target="_blank" >http://forum.ubuntu.org.cn/viewtopic.php?t=74990</a><br /><br />一、概述<br /><br />实际上，除了利用主板上的BIOS来管理电源外，大多数Linux系统本身都自带了管理电源的实用工具软件，来处理各种电源事件，如：<br /><br />1.电池电量不足--这时机器会发出警告，并显示相应图标，或者将硬件挂起。<br /><br />2.闲置--如果在一段时间内机器一直处于非活动状态，那么可以让机器休眠（如关闭硬盘以及停用音频及网络等服务）从而有效延长电池供电时间。<br /><br />通过检测你的笔记本使用的是交流电源还是电池，可以让机器进入相应的电源管理模式。在Fedora中，用于管理和检修电源问题的工具有：<br /><br />1.高级电源管理（APM）--APM软件组成如下：一个pmd守护进程，用来监视电池的使用情况；多个实用工具软件，用来显示和响应电池事件。它们包含于apmd软件包中。<br /><br />2.高级配置和电源接口（ACPI）--acpid事件守护进程一方面监视电源事件，另一方面用来设置响应这些事件的规则，这些规则用来关闭某些硬件或关掉系统电源等。ACPI是一款设计用来替代APM电源管理的更具通用性的工具软件，但是目前它还需进一步完善。<br /><br />3.hdparm命令--hdparm命令可用于打开和关闭电源管理功能。另外，该命令还有许多选项，完成诸如停止硬盘启动器转动或让硬盘进入待机状态等操作。<br /><br />需要说明的是，使用ACPI时，是操作系统在负责电源管理，而不是BIOS。尽管ACPI在管理电源问题方面功能更强也更灵活，但是，普通用户用起来却不是那么方便，如使用ACPI时，你必须亲自告诉它要关注哪些电源事件以及如何响应这些事件。目前，对一般用户而言，APM的功能不但丰富，并且对用户也更加友好。<br />下边我们将针对以上三种常见的电源管理工具分别加以讨论。<br /><br />二、用APM管理电源<br /><br />在Fedora中，可以配置APM，让其检测某些电源事件并做出响应。这时，它运行守护进程/usr/sbin/apmd来侦听事件，然后根据配置文件/etc/sysconfig/apmd 中的有关规定来处理这些事件。要配置运行APM，输入下列命令：<br /><br /># chkconfig apmd on<br /># service apmd restart<br /><br /><br /><br />注意:apmd和acpid不能同时使用，所以，如果此前系统正在使用acpid的话，应该先停用它，具体命令如下：<br /><br /># chkconfig acpid off<br /># service acpid stop<br /><br /><br /><br />APM成功启动后，在文件/var/log/messages中应该看到一则消息，指出该服务已启动，并列出当前电池的电量状况。默认时，pmd 守护进程根据文件/etc/sysconfig/apmd 中的设置运行。我们可以列出当前运行的进程来查看运行中的apmd的使用了哪些选项：<br /><br /># ps ax | grep apmd<br />/usr/sbin/apmd -p 10 -w 5 -W -P /etc/sysconfig/apm-scripts/apmscript<br /><br /><br /><br />根据以上命令中列出的选项，apmd守护进程将会：<br /><br />1.记录电池电量的变化--如果电量变化超过10%或更多，守护进程将向系统日志文件（默认时为/var/log/messages）发出一条消息。这一行为是由选项&quot;-p 10&quot;指定的。<br /><br />2.记录电池电量不足--当电池电量低于5%并且仍未充电时，一条警告消息将发送到系统日志文件中。这一行为是由选项&quot;-w 5&quot;指定的。<br /><br />3.提醒用户--如果电池电量低于&quot;-w&quot;选项所设定的值，将向所有登录系统的用户发送警报。此行为是由选项&quot;-W&quot;指定的。<br /><br />4.利用apmscript响应事件--出现电源事件时，apmd将这些事件转给设定用于响应这些事件的脚本。根据上面的命令，运行的脚本应该是/etc/sysconfig/apm-scripts/apmscript。所用的文件取决于选项&quot;- P&quot;。<br /><br /><br />除了上述的电量不足和电量变化设置外，大多数给与响应的电源事件仅在apmscript文件中有所提及。如果想了解您机器的电源管理情况的话，看看该文件的内容便一目了然了。在FedoraCore中，要想添加你自已的要给与响应的电源事件，你必须建立自己的脚本。默认时的apmscript是文件 /etc/sysconfig/apm-scripts/apmcontinue。该文件处理以下事件：<br /><br />1.挂起--当你的笔记本电脑进入挂起或待机状态后，文件apmscript会停止所有音频处理程序，挂其所有硬盘驱动器操作，关闭任何NFS连接，关闭网络连接以及pcmcia卡。<br /><br />2.恢复--在复原时，apmscript会还原所有在挂起时停止的事件。<br /><br />3.更换电源--当机器电源发生变化时，脚本会做出反应：如果使用交流电源，就让机器运行于高性能状态；如果使用电池，则让机器运行于更加节电的状态。<br /><br />4.更换电池--如果电池缺电，该事件将使apm停止所有服务，并进入极限节电模式。<br /><br />5.开机--启动机器时，apmscript会首先检查apmcontinue文件，除非你在该文件中设置了启动时要做的事，否则该脚本什么也不干。<br /><br />6.停机--与开机时一样，停机时apmscript会首先检查apmcontinue文件，除非你在该文件中设置了启动时要做的事，否则该脚本什么也不干。<br /><br />在apmcontinue文件中还可以有其他事件（默认时并不存在），用来响应其它选定的各种事件。此外，你还可以建立 /etc/sysconfig/apm-scripts/apmcontinue脚本，然后让它来响应存放在像apmscript这样的文件中的各种事件。<br /><br />如果只是随便的查看一下APM服务的话，可以使用不带参数的apm命令，这样能看到电池供电状况或是否使用交流电源之类的报告：<br /><br /># apm<br />AC on-line, battery charging: 100%<br /><br /><br /><br />你还可以让你的笔记本电脑进入挂起模式（apm-s）或待机模式（apm-S）。当接通交流电源后，笔记本电脑会忽略所有由APM（apm-i）产生的挂起和待机事件。(T111)<br /><br />三、使用ACPI管理电源<br /><br /><br />与APM类似，ACPI也运行一个守护进程来侦听电源事件，然后将这些事件传递给某个程序来进行处理。这种情况下，我们可以通过启用acpid服务来运行acpid守护进程：<br /><br /><br /># chkconfig acpid on<br /># service acpid restart<br /><br /><br /><br />再强调一下，一定要先关闭你不想要的电源管理服务。对此而言，就是要关闭apmd，即：<br /><br /># chkconfig apmd off<br /># chkconfig apmd stop<br /><br /><br /><br />ACPI只能运行在内核中已经激活了ACPI的Linux系统上，否则，你必须在启动时通过启动选项ACPI=force来手动激活它。另外，你还需要在 BIOS中激活ACPI。如果在/proc/acpi/event文件中有与ACPI事件相关的内容，则说明ACPI已在工作。<br /><br />Acpid会监视来自于/proc/acpi/events中的每个事件，然后将这些事件跟/etc/acpi/events目录下的各文件中的各项进行匹配。默认的情况下，该目录下只有一个文件，即sample.conf，其中存放着ACPI事件和相应的处理，如：<br /><br /># ACPID 配置举例<br />event=button/power.*<br />action=/sbin/shutdown -h now<br /><br /><br /><br />在该例中，当收到button/power.*事件后，系统立即执行shutdown命令，因为命令后边带有- h now选项。要配置您自己的处理ACPI事件的动作，可以将您的文件（你必须是超级用户）添加到/etc/acpi/events目录中。要注意的是，该文件内容的格式必须与该目录下其他文件一致。要了解这些文件的确切格式，可以通过 &quot;man acpid&quot; 命令来进行进一步学习。当你列出的事件出现时， &quot;action=&quot;行中的命令就会作为超级用户运行。<br /><br />若要寻找事件名称的话，可以使用命令cat/proc/acpi/event。如果要查看acpid的活动，可以查看/var/log/acpid文件的内容。改变几次电源状态，如拔下插头、再插上、按挂起键等等，然后看看哪些事件被记录在日志文件中了。<br /><br />四、用hdparm修改电源设置<br /><br />如果您正在使用笔记本电脑的话，你可以使用hdparm的诸多选项来控制电量的消耗。某些选项会立即生效，如让硬盘驱动器进入睡眠模式；而其他选项会在一段时间后才生效，如在某段时间内硬盘一直处于非活动状态的话，就停转硬盘驱动器。<br /><br /><br />要了解机器的IDE电源模式状态，可以键入下列命令：<br /><br /><br /># hdparm -C /dev/hda<br />/dev/hda:<br />drive state is: active/idle<br /><br /><br /><br />这表示电源模式设为正常运行。如果驱动器不支持该项功能，那么驱动器状态显示为&quot;unknown&quot;。为了节电，最常用的做法是为spindown 模式（- S）设一个比较低的值。甚而有人认为spindown的最低值（五秒钟的空闲时间）既能全面改善电池续航时间，又不至于严重影响性能。我们可以用 hdparm命令加&quot;-S&quot;选项来规定硬盘进入spindown模式的闲置时间，如果&quot;-S&quot;后跟随的数字介于0到240之间，那么该值乘以5就是实际的进入spindown模式的闲置时间（以秒为单位）。因此，下例中的值3的含义是让磁盘驱动器在闲置15秒后入待机模式（硬盘会停转）：<br /><br /># hdparm -S3 /dev/hda<br />/dev/hda:<br />sotting standby to 3 (15 seconds)<br /><br /><br /><br />注意：当-S的取值范围介于241到251之间时，那么该值减去240后乘以30就是实际的进入spindown模式的闲置时间（以分钟为单位）。所以， 241把停转的闲置时间设为30分钟，而251将其设为5.5小时。这一点使用时容易混淆，请读者一定注意。你可以通过-y选项让硬盘自动进入待机模式，如下所示：<br /><br /># hdparm -y /dev/hda<br />/dev/hda:<br />issuing standby command<br /><br /><br /><br />同时，你也能够通过-Y选项进入睡眠模式：<br /><br /># hdparm -Y /dev/hda<br />/dev/hda:<br />issuing sleep command<br /><br /><br /><br />当再次需用硬盘时，Linux将自动启动它。<br /><br />五、小结<br /><br />上面我们对Linux下三种常见的电源管理工具进行了讨论，我想您现在已经清楚如何设置Linux本本的电源管理了，那就赶紧试试吧--什么？你用的是台式机，那等有机会再试也不算迟呀！<br /><br />还有这个，也应该是很多人一直没能区分清楚的<br /><br />很多人问道了什么ACPI，什么是APIC，他们有没有关系？名字这么相近。下面给出我对其的一些理解，具体的解释可以查看内核文档库的内核参数文件：<br />/usr/src/`uname -r`/Documents/kernel-parameters.txt<br /><br />ACPI就是Advanced Configuration and Power Interface的缩写，意思是“高级配置与电源接口”。这是英特尔、微软和东芝共同开发的一种电源管理标准。<br />ACPI可实现以下功能: 　　<br />1、用户可以使外设在指定时间开关； 　　<br />2、使用笔记本电脑的用户可以指定计算机在低电压的情况下进入低功耗状态，以保证重要的应用程序运行； 　　<br />3、操作系统可以在应用程序对时间要求不高的情况下降低时钟频率；<br />4、操作系统可以根据外设和主板的具体需求为它分配能源；<br />5、在无人使用计算机时可以使计算机进入休眠状态，但保证一些通信设备打开；<br />6、即插即用设备在插入时能够由ACPI来控制。<br />不过，ACPI和其他的电源管理方式一样，要想享受到上面这些功能，必须要有软件和硬件的支持。在软件方面，Windows 98及其后续产品和Windows 2000都对ACPI给予了全面的支持；而Linux的内核目前对此支持得并不是太理想。硬件方面比较麻烦，除了要求主板、显卡和网卡等外设要支持 ACPI外，还需要机箱电源的配合。电源在提供5伏电压给主板的同时，还必须使电流稳定在720毫安以上才可以，这样它才能够实现电脑的“睡眠”和“唤醒”。<br />ACPI共有六种状态，分别是S0到S5，它们代表的含义分别是：<br />S0--实际上这就是我们平常的工作状态，所有设备全开，功耗一般会超过80W；<br />S1--也称为POS（Power on Suspend），这时除了通过CPU时钟控制器将CPU关闭之外，其他的部件仍然正常工作，这时的功耗一般在30W以下；（其实有些CPU降温软件就是利用这种工作原理）<br />S2--这时CPU处于停止运作状态，总线时钟也被关闭，但其余的设备仍然运转；<br />S3--这就是我们熟悉的STR（Suspend to RAM），这时的功耗不超过10W；<br />S4--也称为STD（Suspend to Disk），这时系统主电源关闭，但是硬盘仍然带电并可以被唤醒；<br />S5--这种状态是最干脆的，就是连电源在内的所有设备全部关闭，功耗为0。<br />我们最常用到的是S3状态，即Suspend to RAM（挂起到内存）状态，简称STR。顾名思义，STR就是把系统进入STR前的工作状态数据都存放到内存中去。在STR状态下，电源仍然继续为内存等最必要的设备供电，以确保数据不丢失，而其他设备均处于关闭状态，系统的耗电量极低。一旦我们按下Power按钮（主机电源开关），系统就被唤醒，马上从内存中读取数据并恢复到STR之前的工作状态。内存的读写速度极快，因此我们感到进入和离开STR状态所花费的时间不过是几秒钟而已；而S4状态，即 STD（挂起到硬盘）与STR的原理是完全一样的，只不过数据是保存在硬盘中。由于硬盘的读写速度比内存要慢得多，因此用起来也就没有STR那么快了。 STD的优点是只通过软件就能实现，比如Windows 2000就能在不支持STR的硬件上实现STD。<br />之前的电源管理是APM（Advanced Power Management),那么ACPI和APM相比有什么区别呢？<br /><br />2、ACPI与APM比较<br />APM 1.0&amp;1.1：由BIOS执行电源管理；<br />APM 1.2：操作系统定义电源管理时间，由BIOS负责执行；<br />ACPI：BIOS收集硬件信息，定义电源管理方案；由操作系统负责执行。<br />APM是一种软件解决方案，因此是与操作系统有关的， 而ACPI是工业标准，包括了软件和硬件方面的规范。<br /><br />APIC (高级可编程中断控制器)对计算机来讲有两个作用，<br />一是管理IRQ的分配，可以把传统的16个IRQ扩展到24个（传统的管理方式叫PIC），以适应更多的设备。<br />二是管理多CPU。由于Nf2主板并不支持多CPU，所以，APIC关闭直接的影响是减少了可用的IRQ。<br />不过，如果板卡不是非常多的话，关闭 APIC对系统是没有什么影响的。<br />要实现SMP功能，我们使用的CPU必须具备以下要求：<br />CPU 内部必须内置APIC单元。Intel 多处理规范的核心就是高级可编程中断控制器（Advanced Programmable Interrupt Controllers--APICs）的使用。CPU通过彼此发送中断来完成它们之间的通信。通过给中断附加动作（actions），不同的CPU可以在某种程度上彼此进行控制。每个CPU有自己的APIC（成为那个CPU的本地APIC），并且还有一个I/O APIC来处理由I/O设备引起的中断，这个I/O APIC是安装在主板上的，但每个CPU上的APIC则不可或缺，否则将无法处理多CPU之间的中断协调。<br />APIC可能遇到的问题，很多这类问题可以通过BIOS更新来解决。<br />下面的是通过更改HAL类型来解决<br />　　CPU实际运行频率与BIOS设定频率不符<br />　　NF2的用户大约有10%的会出现CPU实际运行频率与BIOS设定频率不符的问题。我们称之为“频率不对”。<br />　　这种现象带来的直接后果就是在测试3dmark或跑3D游戏的时候，会感觉不流畅，也称之为“顿”。<br />　　一般在更改BIOS设置后、更新驱动后重启时，用测试软件如Aida32、MBM5等可以看到CPU的运行频率和你在BIOS里设置得不一样，而且差距很大。这个时候，用super pi测试CPU速度，会比平常花费时间长好几秒，用3dmark跑测试，会比平常低几百分甚至上千分。在3dmark中看到的CPU频率，也与BIOS设定不符合。<br />　　如果出现这种情况，则属于我们所讨论的“频率不对”的问题。<br />　　不过，不是所有的3D游戏“顿”都是这个原因。判断的方法是：如果你只有个别游戏“顿”，或者用上述软件测试频率正确，就不是此问题。<br />　　如果判断确实属此问题，解决的方法也很简单，经过网友讨论，只要关闭APIC功能即可。（注意，是APIC，不是ACPI）。<br /><br />有一些服务器（比如IBM的，HP的），安装LINUX时，会给出内核的错误，导致无法安装，这个时候可以在安装的时候输入<br />linux acpi=off noapic<br />应该是安装上的。]]></description>
	</item>
</rdf:RDF>
