<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="/xsl/rss.xsl" type="text/xsl" media="screen"?>
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

	<channel>
		<title>瑞雪</title>
		<link>http://panrui2006.blog.sohu.com/</link>
		<description><![CDATA[看书，学习，想办法使我们的生活变是更充实]]></description>
		<pubDate>Sun, 9 Mar 2008 22:18:05 +0800</pubDate>
		<generator>搜狐博客</generator>
		<image>
			<title>http://blog.sohu.com</title>
			<url>http://js.pp.sohu.com/ppp/blog/images/common/logo_150_60.gif</url>
			<link>http://blog.sohu.com/</link>
			<width>100</width>
			<height>43</height>
			<description>搜狐博客</description>
		</image>
		<item>
			<title>python raw_input 用法</title>
			<link>http://panrui2006.blog.sohu.com/80956459.html</link>
			<comments>http://panrui2006.blog.sohu.com/80956459.html#comment</comments>
			<dc:creator>瑞雪</dc:creator>
			<pubDate>Wed, 5 Mar 2008 22:23:20 +0800</pubDate>
			<category>Python</category>
			<guid>http://panrui2006.blog.sohu.com/80956459.html</guid>
			<description><![CDATA[<span style="color: rgb(51, 102, 255);">感受一下PYTHON中的 raw_input函数用法。从标准输入中读取内容。象C中。getc()<br />#!/usr/bin/env python</span><br /><br /><span style="color: rgb(51, 102, 255);">class inputTest:</span><br /><br /><span style="color: rgb(51, 102, 255);">&nbsp;&nbsp;&nbsp; def rawString(self):</span><br /><span style="color: rgb(51, 102, 255);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.input = raw_input('please input :')</span><br /><span style="color: rgb(51, 102, 255);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print self.input</span><br /><span style="color: rgb(51, 102, 255);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;%s&quot; % self.input</span><br /><span style="color: rgb(51, 102, 255);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;%10.3s&quot; % self.input</span><br /><span style="color: rgb(51, 102, 255);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;%.3s&quot; % self.input</span><br /><span style="color: rgb(51, 102, 255);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;%s&quot; % self.input</span><br /><br /><span style="color: rgb(51, 102, 255);">&nbsp;&nbsp;&nbsp; def rawInt(self):</span><br /><span style="color: rgb(51, 102, 255);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.input = int(raw_input('please input int:'))</span><br /><span style="color: rgb(51, 102, 255);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print self.input</span><br /><br /><span style="color: rgb(51, 102, 255);">&nbsp;&nbsp;&nbsp; def rawFloat(self):</span><br /><span style="color: rgb(51, 102, 255);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.input = float(raw_input('please input float:'))</span><br /><span style="color: rgb(51, 102, 255);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print self.input</span><br /><br /><span style="color: rgb(51, 102, 255);">&nbsp;&nbsp;&nbsp; def run(self):</span><br /><span style="color: rgb(51, 102, 255);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.rawString()</span><br /><span style="color: rgb(51, 102, 255);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.rawInt()</span><br /><span style="color: rgb(51, 102, 255);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.rawFloat()</span><br /><br /><br /><span style="color: rgb(51, 102, 255);">input = inputTest()</span><br /><span style="color: rgb(51, 102, 255);">input.run()</span><br /><br />]]></description>
		</item>
		    
		
		<item>
			<title>python SOCKET学习</title>
			<link>http://panrui2006.blog.sohu.com/80930154.html</link>
			<comments>http://panrui2006.blog.sohu.com/80930154.html#comment</comments>
			<dc:creator>瑞雪</dc:creator>
			<pubDate>Wed, 5 Mar 2008 17:47:05 +0800</pubDate>
			<guid>http://panrui2006.blog.sohu.com/80930154.html</guid>
			<description><![CDATA[今天体验了一下PYTHON的SOCKET开发，感觉很方便就几个简单的步骤<br />服务器端<br />1. socket 创建<br />2. bind&nbsp;&nbsp; 绑定<br />3. listen 监听<br />4. accep&nbsp; 接收<br />5. recv&nbsp;&nbsp; 得到数据<br /><br />客户端<br />1. socket <br />2. connect<br />3. send<br />4. recv<br /><br />tcpserve.py <br />#!/usr/bin/evn python<br /># coding: utf-8<br /><br />from socket import *<br /><br />myHost = 'localhost'<br />myPort = 50007<br /><br />sockobj = socket(AF_INET, SOCK_STREAM)<br />sockobj.bind((myHost, myPort))<br />sockobj.listen(5)<br /><br />while 1:<br />&nbsp;&nbsp;&nbsp; connect, address = sockobj.accept()<br />&nbsp;&nbsp;&nbsp; print 'sever connect ' , address<br />&nbsp;&nbsp;&nbsp; while 1:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data = connect.recv(1024)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not data:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connect.send('Echo =&gt;' + data)<br />&nbsp;&nbsp;&nbsp; connect.close()<br /><br /><br /><br /><br />tcpclient.py<br />#!/usr/bin/evn python<br /># coding: utf-8<br /><br />import sys<br />from socket import *<br /><br />host = 'localhost'<br />port = 50007<br /><br />message = ['hello word network from python']<br /><br />sockobj = socket(AF_INET, SOCK_STREAM)<br />sockobj.connect((host, port))<br /><br />for line in message:<br />&nbsp;&nbsp;&nbsp; sockobj.send(line)<br />&nbsp;&nbsp;&nbsp; data = sockobj.recv(1024)<br />&nbsp;&nbsp;&nbsp; print 'client received ' , data<br /><br />sockobj.close()<br /><br />]]></description>
		</item>
		    
		
		<item>
			<title>版本控制 转</title>
			<link>http://panrui2006.blog.sohu.com/78840097.html</link>
			<comments>http://panrui2006.blog.sohu.com/78840097.html#comment</comments>
			<dc:creator>瑞雪</dc:creator>
			<pubDate>Mon, 11 Feb 2008 02:01:28 +0800</pubDate>
			<guid>http://panrui2006.blog.sohu.com/78840097.html</guid>
			<description><![CDATA[<h2><a name="section9">版本控制(http://sf.thecodecentral.com/askeet_1)</a></h2><h2><a name="section9"></a></h2>
<div>

<p>
懶傢伙的一個好原則是不用擔心現存的原始碼被破壞掉。我們想工作快點，如果修改的不恰當，我們想回復到上一個版本，我們要允許一個人以上一同來開發項目，
我們也希望你可以存取所有每日的版本，我們將採行原始碼版本控制。我們用 Subversion 來達到目的。假設你已經裝好一個
subversion 服務器而且有權限來存取它
</p>

<p>
首先，建一個倉庫來放 askeet 項目
</p>
<pre>$ svnadmin create $SVNREP_DIR/askeet<br />$ svn mkdir -m &quot;layout creation&quot; file:///$SVNREP_DIR/askeet/trunk file:///$SVNREP_DIR/askeet/tags<br /></pre>

<p>
 然後，你必須做第一次匯入，cache/和log/這些檔就省略掉不用匯入了。 （只要對&ldquo;原始碼&rdquo;的部分匯入即可）
</p>
<pre>$ cd /home/sfprojects/askeet<br />$ rm -rf cache/*<br />$ rm -rf log/*<br />$ svn import -m &quot;initial import&quot; . file:///$SVNREP_DIR/askeet/trunk<br /></pre>

<p>
 現在離開原來的程式目錄，用 checkout 從倉庫拿原始碼出來。
</p>
<pre>$ cd /home/sfprojects<br />$ mv askeet askeet.origin<br />$ svn co file:///$SVNREP_DIR/askeet/trunk/ askeet/<br />$ ls askeet<br />$ rm -rf askeet.origin<br /></pre>

<p>
還有一件事要做，就是當你提交（commit ，回寫你的程式變更）你的工作目錄回倉庫時。你可能會有一些不用回寫的檔案，如剛剛的 cache 和log目錄下的檔案。所以你必須要指定一個忽略列表（ignore list ） 
</p>
<pre>$ cd /home/sfprojects/askeet<br />$ svn propedit svn:ignore cache<br />*<br /></pre>

<p>
此時會出現 SVN 的預設文字編輯器。输入*号后cache/子目录就会被添加到SVN忽略的名单里了。儲存和離開即可。
</p>

<p>
對log/也是同樣的作法
</p>
<pre>$ svn propedit svn:ignore log<br />*<br /></pre>

<p>
 現在，請確定你的網站伺服器對 cache 和 logs 目錄有寫入的權限，在指令列 
</p>
<pre>$ chmod 777 cache<br />$ chmod 777 log<br /></pre>
<div>
<p>
<strong>注意：</strong> Windows 可以使用超級有名的 TortoiseSVN 來管理他們的subversion源碼倉庫。 
</p>
</div>
<p>
假如你要知道更多原始碼版本控制，請看手冊裏的 project creation 章節。
</p>
<div>
<p>
<strong>注意：</strong>本項目 askeet 的 SVN 源碼倉庫是公開的，你可以通過<a href="http://svn.askeet.com/" title="http://svn.askeet.com/" rel="nofollow">http://svn.askeet.com/</a><a href="http://svn.askeet.com/" title="http://svn.askeet.com/" rel="nofollow">http://svn.askeet.com/</a>存取它 
</p>
</div>
<p>
開始吧，取出它（checkout也是SVN的常用的動作）
</p>

<p>
今天的 code 已經提交了，你可以用 release_day_1 這個標好籤來取出它。
</p>
<pre>  $ svn co http://svn.askeet.com/tags/release_day_1/ askeet/<br /></pre>

</div>

<h2><a name="section10">明天見</a></h2>
<div>

<p>
 <strong>預告</strong> 大約也是一個小時，我們說了一大堆，沒做什麼新的事，但請注意我們明天的課程： 這個項目將做什麼 建一個資料庫模型，產生一個物件相關的映射 架構一個模組
</p>

<p>
假如你要密切注意最近的 askeet 新聞，你可以訂閱askeet郵件群組，或是上論壇。明天一定要回來哦！！ 明天見！！
</p>

</div>

    
<!-- wikipage stop -->
  

  <div>&nbsp;</div>]]></description>
		</item>
		    
		
		<item>
			<title>第一个LEX:和YACC程序</title>
			<link>http://panrui2006.blog.sohu.com/77087322.html</link>
			<comments>http://panrui2006.blog.sohu.com/77087322.html#comment</comments>
			<dc:creator>瑞雪</dc:creator>
			<pubDate>Sun, 20 Jan 2008 17:21:09 +0800</pubDate>
			<guid>http://panrui2006.blog.sohu.com/77087322.html</guid>
			<description><![CDATA[本程序很简单就是从标准输入接收输入并计算他们的结果<br />目前只支持 +　－　＊　／　并支持变量名和函数<br />下面是程序部分（记录一下）<br /><br />头文件 ch3hdr2.h<br />#define NSYMS 20<br /><br />struct symtab {<br />&nbsp;&nbsp;&nbsp; char&nbsp;&nbsp; *name;<br />&nbsp;&nbsp;&nbsp; double (*funcptr)();<br />&nbsp;&nbsp;&nbsp; double value;<br />} symtab[NSYMS];<br /><br />struct symtab *symlook(char *s);<br />&nbsp;<br /><br />LEX　程序　ch3-05.l<br />#include &quot;y.tab.h&quot;<br />#include &quot;ch3hdr2.h&quot;<br />#include &lt;math.h&gt;<br />%}<br /><br />%%<br />([0-9]+|([0-9]+\.[0-9]+)([eE][-+]?[0-9]+)?)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {yylval.dval = atof(yytext); return NUMBER;}<br />[ \t]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;<br />[a-zA-Z][a-zA-Z0-9]*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct symtab *sp = symlook(yytext);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; yylval.symp = sp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return NAME;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br /><br />&quot;$&quot;&nbsp;&nbsp;&nbsp;&nbsp; { return 0; }<br /><br />\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return yytext[0];<br /><br />%%<br /><br /><br />YACC 程序部分 ch3-05.y<br />%{<br />#include &quot;ch3hdr2.h&quot;<br />#include &lt;string.h&gt;<br />#include &lt;math.h&gt;<br />#include &lt;stdio.h&gt;<br />%}<br /><br />%union {<br />&nbsp;&nbsp;&nbsp; double dval;<br />&nbsp;&nbsp;&nbsp; struct symtab *symp;<br />}<br /><br />%token &lt;symp&gt; NAME;<br />%token &lt;dval&gt; NUMBER;<br />%left '-' '+'<br />%left '*' '/'<br />%nonassoc UMINUS<br /><br />%type &lt;dval&gt; expression<br /><br />%%<br /><br />statement_list : statement '\n'<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | statement_list statement '\n'<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;<br /><br />statement&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : NAME '=' expression { $1-&gt;value = $3; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | expression&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { printf(&quot;result is %g\n&quot;, $1); }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;<br /><br />expression&nbsp;&nbsp;&nbsp;&nbsp; : expression '+' expression&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {$$ = $1 + $3; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | expression '-' expression&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {$$ = $1 - $3; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | expression '*' expression&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {$$ = $1 * $3; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | expression '/' expression&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($3 == 0.0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; yyerror(&quot;divide by zero&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $$ = $1 / $3;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NUMBER<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { $$ = $1-&gt;value;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NAME '(' expression ')'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($1-&gt;funcptr)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $$ = $1-&gt;funcptr($3);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;%s not function &quot;, $1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />%%<br /><br />void yyerror(char *s) {fprintf(stderr, &quot;%s \n&quot;, s);}<br />struct symtab *symlook(char *s)<br />{<br />&nbsp;&nbsp;&nbsp; char *p;<br />&nbsp;&nbsp;&nbsp; struct symtab *sp;<br /><br />&nbsp;&nbsp;&nbsp; for (sp = symtab; sp &lt; &amp;symtab[NSYMS]; sp++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (sp-&gt;name &amp;&amp; !strcmp(sp-&gt;name, s))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return sp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!sp-&gt;name) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sp-&gt;name = strdup(s);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return sp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; yyerror(&quot;Too many symbs \n&quot;);<br />}<br /><br />addfunc(char *name, double (*func)())<br />{<br />&nbsp;&nbsp;&nbsp; struct symtab *sp = symlook(name);<br />&nbsp;&nbsp;&nbsp; sp-&gt;funcptr = func;<br />}<br /><br />main()<br />{<br />&nbsp;&nbsp;&nbsp; extern double sqrt(), exp(), log();<br /><br />&nbsp;&nbsp;&nbsp; addfunc(&quot;sqrt&quot;, sqrt);<br />&nbsp;&nbsp;&nbsp; addfunc(&quot;exp&quot;, exp);<br />&nbsp;&nbsp;&nbsp; addfunc(&quot;log&quot;, log);<br />&nbsp;&nbsp;&nbsp; yyparse();<br />}<br /><br />makefile 文件　<br />#LEX = flex -I<br />#YACC = byacc<br /><br />CC = cc -DYYDEBUG=1<br /><br />ch3-05: y.tab.o lex.yy.o<br />&nbsp;&nbsp;&nbsp; $(CC) -o ch3-05 y.tab.o lex.yy.o -ll -ly -lm<br /><br />lex.yy.o : lex.yy.c y.tab.h<br /><br />lex.yy.o y.tab.o : ch3hdr2.h<br /><br />y.tab.c y.tab.h : ch3-05.y<br />&nbsp;&nbsp;&nbsp; $(YACC) -d ch3-05.y<br /><br />lex.yy.c : ch3-05.l<br />&nbsp;&nbsp;&nbsp; $(LEX) ch3-05.l<br />]]></description>
		</item>
		    
		
		<item>
			<title>rsync 的好文章</title>
			<link>http://panrui2006.blog.sohu.com/76444553.html</link>
			<comments>http://panrui2006.blog.sohu.com/76444553.html#comment</comments>
			<dc:creator>瑞雪</dc:creator>
			<pubDate>Sun, 13 Jan 2008 15:17:32 +0800</pubDate>
			<guid>http://panrui2006.blog.sohu.com/76444553.html</guid>
			<description><![CDATA[<h2>rsync 服务器架设方法 v0.1b  （正在修订中）</h2>

<!-- begin content -->

 
<p><b>作者：</b> 北南南北<br />
<b>来自：</b>Linuxsir.Org<br />
<b>摘要：</b> rsync
是一个快速增量文件传输工具，它可以用于在同一主机备份内部的备分，我们还可以把它作为不同主机网络备份工具之用。本文主要讲述的是如何自架rsync服
务器，以实现文件传输、备份和镜像。相对tar和wget来说，rsync 也有其自身的优点，比如速度快、安全、高效；</p><font size="4"><b>1 什么是rsync；<br />
</b></font>
<ul>
rsync is a file transfer program for Unix systems. rsync uses the
&quot;rsync algorithm&quot; which provides a very fast method for bringing remote
files into sync. It does this by sending just the differences in the
files across the link, without requiring that both sets of files are
present at one of the ends of the link beforehand.
<p>rsync 是一个Unix系统下的文件同步和传输工具。rsync是用 &ldquo;rsync 算法&rdquo;提供了一个客户机和远程文件服务器的文件同步的快速方法。</p><p>Some features of rsync include<br />
rsync 包括如下的一些特性：<br />
    * can update whole directory trees and filesystems<br />
    能更新整个目录和树和文件系统；<br />
    * optionally preserves symbolic links, hard links, file ownership, permissions, devices and times<br />
    有选择性的保持符号链链、硬链接、文件属于、权限、设备以及时间等；<br />
    * requires no special privileges to install<br />
    对于安装来说，无任何特殊权限要求；<br />
    * internal pipelining reduces latency for multiple files<br />
   对于多个文件来说，内部流水线减少文件等待的延时；<br />
    * can use rsh, ssh or direct sockets as the transport<br />
   能用rsh、ssh 或直接端口做为传输入端口；<br />
  * supports anonymous rsync which is ideal for mirroring<br />
   支持匿名rsync 同步文件，是理想的镜像工具；
</p></ul>
<p><font size="4"><b><br />
2 rsync 服务器的理由；<br />
</b></font></p>
<ul><p>rsync
服务器架设比较简单，可能我们安装好rsync后，并没有发现配置文件，以及rsync服务器启动程序，因为每个管理员可能对rsync
用途不一样，所以一般的发行版只是安装好软件就完事了，让管理员来根据自己的用途和方向来自己架设rsync服务器；因为这个rsync应用比较广，能在
同一台主机进行备份工作，还能在不同主机之间进行工作。在不同主机之间的进行备份，是必须架设rsync 服务器的。</p><p>以我的观点上看，如果在同一台主机进行文件的备分，用复制工具cp就好了。没必要用rsync 这么相对复杂的工具，cp也简单易用，当然这仅仅是个人观点；</p><p>对于重量级服务器来说，应该有网络备份服务器来说，只有本地备份还是不够的，最好还是有网络备份主机，这样数据的安全才有保证。毕竟数据放在服务器本地上还是不太安全，比如磁盘坏掉、被骇客攻入服务器删除数据。其实服务器本身价值并不大，重要的是数据的价值。</p><p>另外对于大量文件从一台服务器上迁移到另一台服务器上，rsync 的确是一个不可不用传输工具。公司有一台文件服务器，配置是CPU
Intel Celeon 333Mhz，内存128M，硬盘IDE
80Gx3=240G，里面仅是第一个硬盘的12G的分区安装系统，用了256M做为交换分区，其它的空间我都用来存数据，通过LVM卷来管理磁盘空间，
我分了一个
180G的空间给数据存放，当时数据存储容量已经达到了160多G。当时的情况是服务器空间有限，没做本地备份。更不可能新增硬盘上去，因为这台机器没做
RAID，硬盘坏掉一个，数据会全毁掉，安全性没有一点保障。在这种情况下，为了保证数据的安全性，我被迫做了一台带有Raid5支持的文件服务器。在选
择如何把数据文件完整的传输到新服务器上，我想到了很多的工具，最后想到了rsync 。我花了十分钟架设并调试了rsync
，然后就开工文件传输，因为文件服务器上的文件太多，老的文件服务器配置又低，大约花了两三天吧才得以把所有文件传输完毕。</p></ul>
<p><font size="4"><b><br />
3 架设rsync服务器过程；<br />
</b></font></p>
<ul>
架设rsync 服务器比较简单，写一个配置文件rsyncd.conf 。文件的书写也是有规则的，我们可以参照rsync.samba.org 上的文档来做；当然我们首先要安装好rsync 这个软件才行；
</ul>
<p><font size="4"><b><br />
3.1 rsync的安装；<br />
</b></font></p>
<ul>
软件安装过于简单，现在Linux各大发行版都提供这个软件包，当然您也可以自己编译安装，在目前的情况下，我看没太大的必要；
<div><code>[root@linuxsir:beinan]$ sudo apt-get&nbsp; install&nbsp; rsync&nbsp; 注：在debian、ubuntu 等在线安装方法；<br />[root@linuxsir:beinan]# slackpkg&nbsp; install&nbsp; rsync&nbsp;&nbsp; 注：Slackware 软件包在线安装；<br />[root@linuxsir:beinan]# yum install rsync&nbsp;&nbsp;&nbsp; 注：Fedora、Redhat 等系统安装方法；</code></div><p>其它Linux发行版，请用相应的软件包管理方法来安装；如果是源码包，也就是用下面的办法；</p><div><code>[root@linuxsir:/home/beinan]# tar xvf&nbsp; sync-xxxx.tar.gz 或sync-xxx.tar.bz2 <br />[root@linuxsir:/home/beinan]# cd&nbsp; sync-xxx<br />[root@linuxsir:/home/beinan/sync-xxx]# ./configure --prefix=/usr&nbsp; ;make ;make install&nbsp;&nbsp; 注：在用源码包编译安装之前，您得安装gcc等编译开具才行；</code></div></ul>
<p><font size="3"><b><br />
3.2 rsync服务器的配置文件rsyncd.conf ；<br />
</b></font></p>
<ul>
我们可以参照 <a href="http://rsync.samba.org/ftp/rsync/rsyncd.conf.html" target="_blank">rsyncd.conf.html</a>。具体步骤如下；
<div><code>[root@linuxsir:~]#mkdir /etc/rsyncd&nbsp; 注：在/etc目录下创建一个rsyncd的目录，我们用来存放rsyncd.conf 和rsyncd.secrets文件；<br />[root@linuxsir:~]#touch /etc/rsyncd/rsyncd.conf&nbsp; 注：创建rsyncd.conf ，这是rsync服务器的配置文件；<br />[root@linuxsir:~]#touch /etc/rsyncd/rsyncd.secrets&nbsp; 注：创建rsyncd.secrets ，这是用户密码文件；<br />[root@linuxsir:~]#chmod 600 /etc/rsyncd/rsyncd.secrets&nbsp; 注：为了密码的安全性，我们把权限设为600；<br />[root@linuxsir:~]#ls -lh /etc/rsyncd/rsyncd.secrets <br />-rw------- 1 root root 14 2007-07-15 10:21 /etc/rsyncd/rsyncd.secrets<br />[root@linuxsir:~]#touch /etc/rsyncd/rsyncd.motd </code></div><p>下一就是我们修改 rsyncd.conf 和rsyncd.secrets 和rsyncd.motd 文件的时候了；</p><p>rsyncd.conf 是rsync服务器主要配置文件，我们来个简单的示例；比如我们要备份服务器上的  /home 和/opt ，在/home中，我想把beinan和samba目录排除在外；</p><p># Distributed under the terms of the GNU General Public License v2</p><div><code># Minimal configuration file for rsync daemon<br /># See rsync(1) and rsyncd.conf(5) man pages for help<br /><br /># This line is required by the /etc/init.d/rsyncd script<br />pid file = /var/run/rsyncd.pid&nbsp;&nbsp; <br />port = 873<br />address = 192.168.1.171&nbsp; <br />#uid = nobody <br />#gid = nobody&nbsp;&nbsp;&nbsp; <br />uid = root&nbsp;&nbsp; <br />gid = root&nbsp;&nbsp; <br /> <br />use chroot = yes&nbsp; <br />read only = yes&nbsp; <br /><br /><br />#limit access to private LANs<br />hosts allow=192.168.1.0/255.255.255.0 10.0.1.0/255.255.255.0&nbsp; <br />hosts deny=*<br /><br />max connections = 5 <br />motd file = /etc/rsyncd/rsyncd.motd<br /><br />#This will give you a separate log file<br />#log file = /var/log/rsync.log<br /><br />#This will log every file transferred - up to 85,000+ per user, per sync<br />#transfer logging = yes<br /><br />log format = %t %a %m %f %b<br />syslog facility = local3<br />timeout = 300<br /><br />[linuxsirhome]&nbsp;&nbsp; <br />path = /home&nbsp;&nbsp;&nbsp; <br />list=yes <br />ignore errors <br />auth users = linuxsir<br />secrets file = /etc/rsyncd/rsyncd.secrets&nbsp; <br />comment = linuxsir home&nbsp; <br />exclude =&nbsp;&nbsp; beinan/&nbsp; samba/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><br />[beinan]<br />path = /opt <br />list=no<br />ignore errors<br />comment = optdir&nbsp;&nbsp; <br />auth users = beinan<br />secrets file = /etc/rsyncd/rsyncd.secrets</code></div><p><b>注：</b> 关于 auth users 是必须在服务器上存在的真实的系统用户，如果你想用多个用户，那就以,号隔开；比如 auth users = beinan , linuxsir </p><p>密码文件：/etc/rsyncd/rsyncd.secrets的内容格式；</p><div><code>用户名:密码</code></div><p>而我们在例子中rsyncd.secrets的内容如下类似的；在文档中说，有些系统不支持长密码，自己尝试着设置一下吧。另外 rsyncd.secrets文件权限对其它用户组是不可读的。如果你设置错了，可能rsync不工作。</p><div><code>linuxsir:222222<br />beinan:333333</code></div><p><b>注：</b> 这里的密码值得注意，为了安全，你不能把系统用户的密码写在这里。比如你的系统用户 linuxsir 密码是 abcdefg  ，为了安全，你可以让rsync 中的linuxsir 为 222222 。这和samba的用户认证的密码原理是差不多的；</p><p>rsyncd.motd 文件; </p><p>它是定义rysnc 服务器信息的，也就是用户登录信息。比如让用户知道这个服务器是谁提供的等；类似ftp服务器登录时，我们所看到的
linuxsir.org ftp &hellip;&hellip;。 当然这在全局定义变量时，并不是必须的，你可以用#号注掉，或删除；我在这里写了一个
rsyncd.motd的内容为：</p><div><code>+++++++++++++++++++++++++++<br />+ linuxsir.org&nbsp; rsync&nbsp; 2002-2007 +<br />+++++++++++++++++++++++++++</code></div></ul>
<p><font size="4"><b><br />
4 架设rsync服务器的示例说明；<br />
</b></font></p>
<p><font size="3"><b><br />
4.1 全局定义；<br />
</b></font></p>
<ul>
在rsync 服务器中，全局定义有几个比较关健的，根据我们前面所给的配置文件 rsyncd.conf 文件；
<div><code>pid file = /var/run/rsyncd.pid&nbsp;&nbsp; 注：告诉进程写到 /var/run/rsyncd.pid 文件中；<br />port = 873&nbsp; 注：指定运行端口，默认是873，您可以自己指定；<br />address = 192.168.1.171&nbsp; 注：指定服务器IP地址；<br />uid = nobody&nbsp;&nbsp; <br />gid = nobdoy&nbsp;&nbsp; </code></div><p><b>注：</b>服务器端传输文件时，要发哪个用户和用户组来执行，默认是nobody。 如果用nobody
用户和用户组，可能遇到权限问题，有些文件从服务器上拉不下来。所以我就偷懒，为了方便，用了root
。不过您可以在定义要同步的目录时定义的模块中指定用户来解决权限的问题。<br />
</p><div><code>use chroot = yes&nbsp; </code></div><p><b>注：</b>用chroot，在传输文件之前，服务器守护程序在将chroot
到文件系统中的目录中，这样做的好处是可能保护系统被安装漏洞侵袭的可能。缺点是需要超级用户权限。另外对符号链接文件，将会排除在外。也就是说，你在
rsync服务器上，如果有符号链接，你在备份服务器上运行客户端的同步数据时，只会把符号链接名同步下来，并不会同步符号链接的内容；这个需要自己来尝
试；</p><div><code>read only = yes&nbsp; </code></div><p><b>注：</b>read only 是只读选择，也就是说，不让客户端上传文件到服务器上。还有一个 write only选项，自己尝试是做什么用的吧；</p><div><code>#limit access to private LANs<br />hosts allow=192.168.1.0/255.255.255.0 10.0.1.0/255.255.255.0&nbsp; </code></div><p><b>注：</b>在您可以指定单个IP，也可以指定整个网段，能提高安全性。格式是ip 与ip 之间、ip和网段之间、网段和网段之间要用空格隔开；</p><div><code>max connections = 5&nbsp;&nbsp;&nbsp; </code></div><p><b>注：</b>客户端最多连接数；</p><div><code>motd file = /etc/rsyncd/rsyncd.motd</code></div><p><b>注：</b>motd file 是定义服务器信息的，要自己写 rsyncd.motd 文件内容。当用户登录时会看到这个信息。比如我写的是：</p><div><code>+++++++++++++++++++++++++++<br />+ linuxsir.org&nbsp; rsync&nbsp; 2002-2007 +<br />+++++++++++++++++++++++++++</code></div><div><code>log file = /var/log/rsync.log </code></div><p><b>注：</b>rsync 服务器的日志；</p><div><code>transfer logging = yes</code></div><p><b>注：</b>这是传输文件的日志；<br />
</p><div><code>log format = %t %a %m %f %b<br />syslog facility = local3<br />timeout = 300 </code></div></ul>
<p><font size="3"><b><br />
4.2  模块定义；<br />
</b></font></p>
<ul>
模块定义什么呢？主要是定义服务器哪个目录要被同步。每个模块都要以[name]形式。这个名字就是在rsync
客户端看到的名字，其实有点象Samba服务器提供的共享名。而服务器真正同步的数据是通过 path
来指定的。我们可以根据自己的需要，来指定多个模块。每个模块要指定认证用户，密码文件、但排除并不是必须的； <p>下面前面配置文件模块的例子：</p><div><code>[linuxsirhome]&nbsp;&nbsp; <br />注：模块，它为我们提供了一个链接的名字，链接到哪呢，在本模块中，链接到了/home目录；要用[name] 形式；<br />path = /home&nbsp;&nbsp;&nbsp; 注：指定文件目录所在位置，这是必须指定的； <br />auth users = linuxsir&nbsp;&nbsp; 注：认证用户是linuxsir&nbsp; ，是必须在 服务器上存在的用户；<br />list=yes&nbsp;&nbsp; 注：list 意思是把rsync 服务器上提供同步数据的目录在服务器上模块是否显示列出来。默认是yes 。如果你不想列出来，就no ；如果是no是比较安全的，至少别人不知道你的服务器上提供了哪些目录。你自己知道就行了；<br />ignore errors&nbsp; 注：忽略IO错误，详细的请查文档；<br />secrets file = /etc/rsyncd/rsyncd.secrets&nbsp;&nbsp; 注：密码存在哪个文件；<br />comment = linuxsir home&nbsp; data&nbsp; 注：注释可以自己定义，写什么都行，写点相关的内容就行；<br />exclude =&nbsp;&nbsp; beinan/&nbsp;&nbsp; samba/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </code></div><br />
注：exclude 是排除的意思，也就是说，要把/home目录下的beinan和samba 排除在外； beinan/和samba/目录之间有空格分开 ；
<div><code>[beinan]&nbsp; <br />path = /opt&nbsp; 注：指定文件目录所在位置； <br />list=no<br />comment = optdir&nbsp;&nbsp; <br />auth users = beinan&nbsp; 注：是必段在服务器上存在的用户；<br />secrets file = /etc/rsyncd/rsyncd.secrets<br />ignore errors</code></div></ul>
<p><font size="4"><b><br />
5 启动rsync 服务器及防火墙的设置；<br />
</b></font></p>
<p><font size="3"><b><br />
5.1  启动rsync服务器；<br />
</b></font></p>
<ul>
启动rsync 服务器相当简单，--daemon 是让rsync 以服务器模式运行；
<div><code>[root@linuxsir:~]#/usr/bin/rsync --daemon&nbsp; --config=/etc/rsyncd/rsyncd.conf </code></div><p><b>注：</b> 如果你找不到rsync  命令，你应该知道rsync 是安装在哪了。比如rsync 可执行命令可能安装在了 /usr/local/bin目录；也就是如下的命令；</p><div><code>[root@linuxsir:~]#/usr/local/bin/rsync --daemon&nbsp; --config=/etc/rsyncd/rsyncd.conf </code></div><p>当然您也可以写一个脚本来开机自动启动rysnc 服务器，你自己查查文档试试，这个简单。因为我用slackware 也有一个类似的脚本。我感觉不如直接手工运行方面，或者把这个命令写入rc.local文件中，这样也一样能自动运行；
</p></ul>
<p><font size="3"><b><br />
5.2  rsync服务器和防火墙；<br />
</b></font></p>
<ul>
Linux 防火墙是用iptables，所以我们至少在服务器端要让你所定义的rsync 服务器端口通过，客户端上也应该让通过。 
<div><code>[root@linuxsir:~]#iptables -A INPUT -p tcp -m state --state NEW&nbsp; -m tcp --dport 873 -j ACCEPT<br />[root@linuxsir:~]#iptables -L&nbsp; 查看一下防火墙是不是打开了 873端口；</code></div></ul>
<p><font size="4"><b><br />
6  通过rsync客户端来同步数据；<br />
</b></font></p>
<p><font size="3"><b><br />
6.1 列出rsync 服务器上的所提供的同步内容；<br />
</b></font></p>
<ul><b><br />
首先：我们看看rsync服务器上提供了哪些可用的数据源；<br />
</b><div><code>[beinan@beinnaIBM:~]$ rsync&nbsp; --list-only&nbsp; linuxsir@linuxsir.org::<br /><br />+++++++++++++++++++++++++++++++++<br />+++ linuxsir.org rsync&nbsp; server ++<br />+++++++++++++++++++++++++++++++++<br /><br /><br />linuxsirhome&nbsp;&nbsp;&nbsp; linuxsir&nbsp; home data</code></div><p><b>注：</b> 前面是rsync 所提供的数据源，也就是我们在rsyncd.conf
中所写的[linuxsirhome]模块。而&ldquo;linuxsir home data&rdquo;是由[linuxsirhome]模块中的 comment
= linuxsir home data 提供的；为什么没有把beinan
数据源列出来呢？因为我们在[beinan]中已经把list=no了。 </p><div><code>[beinan@beinnaIBM:~]$ rsync&nbsp; --list-only&nbsp; linuxsir@linuxsir.org::linuxsirhome&nbsp; </code></div><p>试试这个？
</p></ul>
<p><font size="3"><b><br />
6.2 rsync 客户端同步数据；<br />
</b></font></p>
<ul><div><code>[beinan@beinnaIBM:~]$ rsync -avzP linuxsir@linuxsir.org::linuxsirhome&nbsp;&nbsp; linuxsirhome <br />Password: 这里要输入linuxsir的密码，是服务器端提供的，在前面的例子中，我们用的是 222222，输入的密码并不显示出来；输好后就回车；</code></div><p><b>注：</b> 这个命令的意思就是说，用linuxsir
用户登录到服务器上，把linuxsirhome数据，同步到本地目录linuxsirhome上。当然本地的目录是可以你自己定义的，比如
linuxsir也是可以的；当你在客户端上，当前操作的目录下没有linuxsirhome这个目录时，系统会自动为你创建一个；当存在
linuxsirhome这个目录中，你要注意它的写权限。</p><p><b>说明：</b></p><p>-a 参数，相当于-rlptgoD，-r  是递归 -l 是链接文件，意思是拷贝链接文件；-p 表示保持文件原有权限；-t 保持文件原有时间；-g 保持文件原有用户组；-o 保持文件原有属主；-D 相当于块设备文件；</p><p>-z  传输时压缩；<br />
-P  传输进度；<br />
-v  传输时的进度等信息，和-P有点关系，自己试试。可以看文档；</p><div><code>[beinan@beinnaIBM:~]$ rsync -avzP&nbsp; --delete linuxsir@linuxsir.org::linuxsirhome&nbsp;&nbsp; linuxsirhome </code></div><p>这回我们引入一个 --delete 选项，表示客户端上的数据要与服务器端完全一致，如果
linuxsirhome目录中有服务器上不存在的文件，则删除。最终目的是让linuxsirhome目录上的数据完全与服务器上保持一致；用的时候要
小心点，最好不要把已经有重要数所据的目录，当做本地更新目录，否则会把你的数据全部删除； </p><div><code>[beinan@beinnaIBM:~]$ rsync -avzP&nbsp; --delete&nbsp; --password-file=rsync.password&nbsp; linuxsir@linuxsir.org::linuxsirhome&nbsp;&nbsp; linuxsirhome </code></div><p>这次我们加了一个选项 --password-file=rsync.password
，这是当我们以linuxsir用户登录rsync服务器同步数据时，密码将读取 rsync.password
这个文件。这个文件内容只是linuxsir用户的密码。我们要如下做；</p><div><code>[beinan@beinnaIBM:~]$ touch rsync.password <br />[beinan@beinnaIBM:~]$ chmod 600 rsync.passwod<br />[beinan@beinnaIBM:~]$ echo &quot;222222&quot;&gt; rsync.password<br /><br />[beinan@beinnaIBM:~]$ rsync -avzP&nbsp; --delete&nbsp; --password-file=rsync.password&nbsp; linuxsir@linuxsir.org::linuxsirhome&nbsp;&nbsp; linuxsirhome </code></div><p><b>注：</b> 这样就不需要密码了；其实这是比较重要的，因为服务器通过crond 计划任务还是有必要的；
</p></ul>
<p><font size="3"><b><br />
6.3 让rsync 客户端自动与服务器同步数据；<br />
</b></font></p>
<ul><p>服务器是重量级应用，所以数据的网络备份还是极为重要的。我们可以在生产型服务器上配置好rsync
服务器。我们可以把一台装有rysnc机器当做是备份服务器。让这台备份服务器，每天在早上4点开始同步服务器上的数据；并且每个备份都是完整备份。有时
硬盘坏掉，或者服务器数据被删除，完整备份还是相当重要的。这种备份相当于每天为服务器的数据做一个镜像，当生产型服务器发生事故时，我们可以轻松恢复数
据，能把数据损失降到最低；是不是这么回事？？</p><p><b>第一步：创建同步脚本和密码文件</b></p><div><code> <br />[beinan@beinnaIBM:~] mkdir&nbsp;&nbsp; /etc/cron.daily.rsync<br />[beinan@beinnaIBM:~] cd&nbsp; /etc/cron.daily.rsync <br />[beinan@beinnaIBM:~] touch linuxsir.sh&nbsp; beinan.sh <br />[beinan@beinnaIBM:~] chmod 755 /etc/cron.daily.rsync/*.sh&nbsp; <br />[beinan@beinnaIBM:~] mkdir /etc/rsyncd/<br />[beinan@beinnaIBM:~] touch&nbsp; /etc/rsyncd/rsynclinuxsir.password<br />[beinan@beinnaIBM:~] touch&nbsp; /etc/rsyncd/rsyncbeinan.password<br />[beinan@beinnaIBM:~] chmod 600&nbsp; /etc/rsyncd/rsyncbeinan.*</code></div><p><b>注：</b> 我们在 /etc/cron.daily/ 中创建了两个文件beinan.sh和linuxsir.sh ，并且是权限是
755的。创建了两个密码文件，linuxsir用户用的是 rsynclinuxsir.password ，而beinan用户用的是
rsyncbeinan.password ，权限是600；</p><p>我们编辑linuxsir.sh，内容是如下的：</p><div><code>#!/bin/sh<br />#linuxsir.org home backup <br />/usr/bin/rsync&nbsp;&nbsp;
-avzP&nbsp; --password-file=/etc/rsyncd/rsynclinuxsir.password&nbsp;&nbsp;
linuxsir@192.168.1.171::linuxsirhome&nbsp;&nbsp; /home/linuxsirhome/$(date
+'%m-%d-%y')</code></div><p>我们编辑 beinan.sh ，内容是：</p><div><code>#!/bin/sh<br />#linuxsir.org beinan home backup <br />/usr/bin/rsync&nbsp;&nbsp;
-avzP&nbsp; --password-file=/etc/rsyncd/rsyncbeinan.password&nbsp;&nbsp;
linuxsir@192.168.1.171::beinan&nbsp;&nbsp; /home/beinanhome/$(date +'%m-%d-%y')</code></div><p><b>注：</b>你可以把linuxsir.sh 和beinan.sh 的内容合并到一个文件中，比如都写到 linuxsir.sh 中；</p><p>接着我们修改 /etc/rsyncd/rsynclinuxsir.password 和 rsyncbeinan.password的内容；</p><div><code>[beinan@beinnaIBM:~] echo &quot;222222&quot; &gt; /etc/rsyncd/rsynclinuxsir.password<br />[beinan@beinnaIBM:~] echo &quot;333333&quot;&gt; /etc/rsyncd/rsyncbeinan.password</code></div><p>然后我们再/home目录下创建linuxsirhome
和beinanhome两个目录，意思是服务器端的linuxsirhome数据同步到备份服务器上的/home/linuxsirhome下，
beinan数据同步到 /home/beinanhome/目录下。并按年月日归档创建目录；每天备份都存档；</p><div><code>[beinan@beinnaIBM:~] mkdir /home/linuxsirhome<br />[beinan@beinnaIBM:~] mkdir /home/beinanhome</code></div><p><b>第二步：修改crond服务器的配置文件</b></p><div><code>[beinan@beinnaIBM:~] crontab&nbsp; -e </code></div><p>加入下面的内容：<br />
</p><div><code># Run daily cron jobs at 4:10 every day&nbsp; backup linuxsir data:&nbsp; <br />10 4 * * * /usr/bin/run-parts&nbsp;&nbsp; /etc/cron.daily.rsync&nbsp;&nbsp;&nbsp; 1&gt; /dev/null</code></div><p><b>注：</b><br />
第一行是注释，是说明内容，这样能自己记住。<br />
第二行表示在每天早上4点10分的时候，运行  /etc/cron.daily.rsync 下的可执行脚本任务；</p><p><b>第三步：重启crond服务器；</b></p><p>配置好后，要重启crond 服务器；</p><div><code>[beinan@beinnaIBM:~]# killall crond&nbsp;&nbsp;&nbsp; 注：杀死crond 服务器的进程；<br />[beinan@beinnaIBM:~]# ps aux |grep crond&nbsp; 注：查看一下是否被杀死；<br />[beinan@beinnaIBM:~]# /usr/sbin/crond&nbsp;&nbsp;&nbsp; 注：启动 crond 服务器；<br />[beinan@beinnaIBM:~]# ps aux&nbsp; |grep crond&nbsp; 注：查看一下是否启动了？<br />root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3815&nbsp; 0.0&nbsp; 0.0&nbsp;&nbsp; 1860&nbsp;&nbsp; 664 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S&nbsp;&nbsp;&nbsp; 14:44&nbsp;&nbsp; 0:00 /usr/sbin/crond<br />root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3819&nbsp; 0.0&nbsp; 0.0&nbsp;&nbsp; 2188&nbsp;&nbsp; 808 pts/1&nbsp;&nbsp;&nbsp; S+&nbsp;&nbsp; 14:45&nbsp;&nbsp; 0:00 grep crond</code></div></ul>
<p><font size="4"><b><br />
7 问题处理；<br />
</b></font></p>
<ul>
当同步出现错误时，可能是你的密码文件权限的问题，或者格式不对，也可能是你复制、粘贴造成的。<br />
另外权限的问题也应该关注一下，这是最容易出问题的地方；如果您对权限不太了解，应该在LinuxSir.Org 上查找用户和用户组，以及权限方面的知识
</ul><p><font size="4"><b><br />
11 参考文档；<br />
</b></font></p>
<ul><a href="http://rsync.samba.org/ftp/rsync/rsyncd.conf.html" target="_blank">rsyncd.conf</a><br /><a href="http://rsync.samba.org/" target="_blank">http://rsync.samba.org </a><br /><a href="http://gentoo-wiki.com/HOWTO_Local_Rsync_Mirror" target="_blank">《HOWTO_Local_Rsync_Mirror》</a><br /><a href="http://www.linuxsir.org/main/node/256?q=node/196" target="_blank">《Linux 文件和目录的属性》</a></ul>]]></description>
		</item>
		    
		
		<item>
			<title>不错的SHELL用法。你一定没用过太爽了</title>
			<link>http://panrui2006.blog.sohu.com/75306821.html</link>
			<comments>http://panrui2006.blog.sohu.com/75306821.html#comment</comments>
			<dc:creator>瑞雪</dc:creator>
			<pubDate>Tue, 1 Jan 2008 17:31:55 +0800</pubDate>
			<guid>http://panrui2006.blog.sohu.com/75306821.html</guid>
			<description><![CDATA[<div>
			<h2><a href="http://bashcurescancer.com/10-steps-to-beautiful-shell-scripts.html" rel="bookmark" title="Permanent Link to 10 Steps to Beautiful Shell Scripts">(转)10 Steps to Beautiful Shell Scripts</a></h2><p>Linux gurus don&rsquo;t use <a href="http://bashcurescancer.com/man/cmd/cut">cut</a>, <a href="http://bashcurescancer.com/man/cmd/awk">awk</a>, and <a href="http://bashcurescancer.com/man/cmd/sed">sed</a>
when they want to replace or strip out a portion if a variable. They
use parameter substitution. You can learn parameter substitution in
less than 2 minutes. Here is the ten things you need to know:</p>
<ol><li>Shell variables can be specified like $var or this ${var}.<br />
<code>$ var='a.ads,fssd2342%asd234#@.,&amp;%,sdfgsdfgas4352'<br />
echo ${var}<br />
a.ads,fssd2342%asd234#@.,&amp;%,sdfgsdfgas4352<br />
</code></li><li>${#var} is the length of the variable.<br />
<code>$ echo ${#var}<br />
42</code></li><li>${var:pos} substrings the variable starting at pos.<br />
<code>$ echo ${var:10}<br />
2342%asd234#@.,&amp;%,sdfgsdfgas4352</code></li><li>${var:pos:len} substrings the variable starting at pos with a max length of len.<br />
<code>$ echo ${var:10:5}<br />
2342%</code></li><li>${var#pattern} strips pattern from the front or left hand side of
the variable. This form is not greedy meaning it stops as soon as the
pattern is matched. ${var##pattern} is the greedy form.<br />
<code>$ echo ${var#*,}<br />
fssd2342%asd234#@.,&amp;%,sdfgsdfgas4352<br />
$ echo ${var##*,}<br />
sdfgsdfgas4352</code></li><li>${var%pattern} strips pattern from the back or right hand side of
the variable. This form is not greedy meaning it stops as soon as the
pattern is matched. ${var%%pattern} is the greedy form.<br />
<code>$ echo ${var%,*}<br />
a.ads,fssd2342%asd234#@.,&amp;%<br />
$ echo ${var%%,*}<br />
a.ads</code></li><li>${var/pattern/replacement} replaces pattern with replacement once.<br />
<code>$ echo ${var/a/A}<br />
A.ads,fssd2342%asd234#@.,&amp;%,sdfgsdfgas4352</code></li><li>${var//pattern/replacement} replaces pattern with replacement globally.<br />
<code>$ echo ${var//a/A}<br />
A.Ads,fssd2342%Asd234#@.,&amp;%,sdfgsdfgAs4352</code></li><li>${var/#pattern/replacement} if variable beginning matches the pattern it is replaced with replacement.<br />
<code>$ echo ${var/#a./llll}<br />
llllads,fssd2342%asd234#@.,&amp;%,sdfgsdfgas4352</code></li><li>${var/%pattern/replacement} if variable end matches the pattern it is replaced with replacement.<br />
<code>$ echo ${var/%352/llll}<br />
a.ads,fssd2342%asd234#@.,&amp;%,sdfgsdfgas4llll</code></li></ol>
		</div>]]></description>
		</item>
		    
		
		<item>
			<title>最近感觉有点累</title>
			<link>http://panrui2006.blog.sohu.com/72602188.html</link>
			<comments>http://panrui2006.blog.sohu.com/72602188.html#comment</comments>
			<dc:creator>瑞雪</dc:creator>
			<pubDate>Wed, 5 Dec 2007 23:11:53 +0800</pubDate>
			<guid>http://panrui2006.blog.sohu.com/72602188.html</guid>
			<description><![CDATA[&nbsp;&nbsp;&nbsp; 头一次感觉有点累,最近感觉事情很多,每天一上班就作不完的事.到家还是在想那块数据对不对.也是第一次把工作当成自己的事情去作, 总想着快点把他作好并作到最好.而且晚上我还想学一些C方面的东西.可是一到家我就不想干什么了感觉头就昏昏沉沉的.而我还快考式了我还什么都没看呢.到家老婆又让我看这个,可我哪有心思看呀.感觉都快成我的负担了.老婆还对我说对我很失望...........<br />&nbsp;&nbsp;&nbsp; 哎....这下自己东西没有学好.学习也没有学好.我想了如果还是这么忙我下学期就不想在学了等忙完这阵子在说吧.<br />]]></description>
		</item>
		    
		
		<item>
			<title>(转)加速Ubuntu</title>
			<link>http://panrui2006.blog.sohu.com/71100270.html</link>
			<comments>http://panrui2006.blog.sohu.com/71100270.html#comment</comments>
			<dc:creator>瑞雪</dc:creator>
			<pubDate>Wed, 21 Nov 2007 10:02:50 +0800</pubDate>
			<category>操作系统</category>
			<guid>http://panrui2006.blog.sohu.com/71100270.html</guid>
			<description><![CDATA[<h2><a target="_blank" href="http://www.fwolf.com/blog/post/370">加速Ubuntu<img src="http://www.google.com/reader/ui/2412528845-go-to.gif" alt="" height="18" width="18" /></a></h2><div><span>from <a href="http://www.google.com/reader/view/feed/http%3A%2F%2Ffeeds.feedburner.com%2Ffwolf?hl=en" target="_blank">Fwolf's Blog</a></span> by <span>Fwolf</span></div><ul><li>
<p>将localhost化名为主机名，编辑hosts文件，把127.0.0.1等于localhost和本机名写到一行中，比如：</p>
<pre><code>127.0.0.1 localhost<br />127.0.1.1 fwolf_pcname<br />==&gt; 变成<br />127.0.0.1 localhost fwolf_pcname<br /></code></pre>
</li><li>
<p>禁用ipv6，编辑<code>/etc/modprobe.d/aliases</code>：</p>
<pre><code>alias net-pf-10 ipv6<br />==&gt;<br />alias net-pf-10 off #ipv6<br /></code></pre>
</li><li>
<p>并行运行开机启动脚本，编辑<code>/etc/init.d/rc</code>：</p>
<pre><code>CONCURRENCY=none<br />==&gt;<br />CONCURRENCY=shell<br /></code></pre>
<p>但据说这种方法可能会造成启动问题，慎用，建议多核cpu才使用。</p>
</li><li>
<p>禁用Pango的输出和文本渲染，主要针对mozilla和firefox，可能会导致cpu占用过高。编辑<code>/etc/environment</code>，添加一行：</p>
<pre><code>MOZ_DISABLE_PANGO=&quot;1&quot;<br /></code></pre>
<p>关闭之后明显感觉到firefox的显示速度变快了，但显示形式也有了一些变化，比如<code>&lt;th&gt;</code>、网页标题的黑体字现在能体现了，但也感觉字体渲染略微&ldquo;模糊&rdquo;了一点点。</p>
</li><li>
<p>安装preload，它可以把一些常用到的库文件预加载到内存，用部分内存空间换取应用程序启动速度的提升。另外注意，prelink从Feisty 7.04起就没用了：</p>
<pre><code>sudo apt-get install preload<br /></code></pre>
</li><li>
<p>禁用多余的虚拟终端，编辑<code>/etc/inittab</code>，把getty部分只留一个就可以了：</p>
<pre><code>1:2345:respawn:/sbin/getty 38400 tty1<br />#2:23:respawn:/sbin/getty 38400 tty2<br />#3:23:respawn:/sbin/getty 38400 tty3<br />#4:23:respawn:/sbin/getty 38400 tty4<br />#5:23:respawn:/sbin/getty 38400 tty5<br />#6:23:respawn:/sbin/getty 38400 tty6<br /></code></pre>
<p>Ctrl+Alt+F2-F6就没东西了，F1是我们保留的终端，用于应急处理，F7就是正常的图形环境啦。<br />
注：有些情况下这样好像不行，还要编辑<code>/etc/event.d/tty2</code>，把start开头的两行都注释掉，3456都如法炮制，依然只保留1，再用热键切换过去就是空空的一个提示符了。</p>
</li><li>
<p>调整hdparm加速硬盘，编辑<code>/etc/hdparm.conf</code>，参考内容如下：</p>
<pre><code>/dev/sda {<br />dma = on<br />io32_support = 1<br />mult_sect_io = 32<br />}<br /></code></pre>
</li><li>
<p>对于内存充足的机器减少对swap的使用，编辑<code>/etc/sysctl.conf</code>，添加：</p>
<pre><code>vm.swappiness=10<br /></code></pre>
<p>这个数值的默认值为60，越小对swap的写入可能就越小，有网友说1G内存调整为5感觉最合适，建议至少512M内存以上再调整这个数值，设为0的话就几乎等于不实用swap了。</p>
</li><li>
<p>使用LVM，但暂时没有进一步的资料。</p>
</li><li>
<p>用bootchart协助，优化系统启动过程，对耗时较多的过程进行优化。</p>
</li><li>
<p>使用bum关闭掉不需要的服务，不推荐用sysv-rc-conf的原因是bum对服务、进程有比较详细的解释说明。</p>
</li><li>
<p>如果fstab中挂有外部磁盘，启动时不需要检测，可以把pass设置为0(fstab中最后一列)。如果在安装系统时就选用更合理的分区方案、分区类型(比如XFS)效果更佳。</p>
</li><li>
<p>现在应该都在用6.10 Edgy之后的发行版了，如果是486机器，请选用386内核；P4以后的机器，包括同期的AMD，请选用generic内核；服务器请选用linux-server内核，会有一点点的性能提升，maybe。参考<a target="_blank" href="http://ubuntuforums.org/showthread.php?t=421406">Difference between linux-generic, linux-386</a>。</p>
</li><li>
<p>用deborphan删除不用的库文件：</p>
<pre><code>sudo deborphan | xargs sudo apt-get -y remove --purge<br /></code></pre>
</li></ul>
<h4>参考</h4>
<ul><li><a target="_blank" href="http://culverzen.blogspot.com/2007/04/blog-post_24.html">加速应用程序的启动</a></li><li><a target="_blank" href="http://www.osxcn.com/ubuntu/feisty-performance-fly-like-a-butterfly.html">加速你的 Ubuntu Feisty Fawn</a></li><li><a target="_blank" href="http://www.5dmail.net/html/2006-10-7/2006107230315.htm">Linux桌面系统提速七大法宝</a></li><li><a target="_blank" href="http://hi.baidu.com/bwchaos/blog/item/954394010de113071c9583a1.html">开始翻译Feisty Performance - &ldquo;Fly Like A Butterfly&rdquo;&mdash;系统优化</a></li><li><a target="_blank" href="http://www.carelezz.com/blog/61.html">加速 ubuntu 的引导进程</a></li><li><a target="_blank" href="http://www.marzocca.net/linux/bumdocs.html">Boot-Up Manager (docs)</a></li><li><a target="_blank" href="http://ubuntuforums.org/showthread.php?t=89491">HowTo: Speed up ubuntu boot process - the way you can feel it. - updated</a></li><li><a target="_blank" href="http://www.linuxmonitor.net/blog/2007/03/ultimate-ubuntu-performance-tweaking.html">Ultimate Ubuntu performance tweaking guide</a></li><li><a target="_blank" href="http://ubuntuforums.org/showthread.php?t=140920">HOWTO: Cleaning up all those unnecessary junk files&hellip;</a></li></ul>]]></description>
		</item>
		    
		
		<item>
			<title>BASH 中的字符串处理 (转)</title>
			<link>http://panrui2006.blog.sohu.com/68441668.html</link>
			<comments>http://panrui2006.blog.sohu.com/68441668.html#comment</comments>
			<dc:creator>瑞雪</dc:creator>
			<pubDate>Fri, 26 Oct 2007 13:09:35 +0800</pubDate>
			<guid>http://panrui2006.blog.sohu.com/68441668.html</guid>
			<description><![CDATA[<h5><span>代码</span>:</h5><code>%x=&quot;abcd&quot;<br />
#方法一<br />
%expr length $x<br />
4<br />
# 方法二<br />
%echo ${#x}<br />
4<br />
# 方法三<br />
%expr &quot;$x&quot; : &quot;.*&quot;<br />
4<br />
# expr 的帮助<br />
# STRING : REGEXP&nbsp; &nbsp;anchored pattern match of REGEXP in STRING</code>查找子串<div><span>复制内容到剪贴板</span><h5>代码:</h5><code>%expr index&nbsp;&nbsp;$x &quot;b&quot;<br />
2<br />
%expr index&nbsp;&nbsp;$x &quot;a&quot;<br />
1<br />
%expr index&nbsp;&nbsp;$x &quot;b&quot;<br />
2<br />
%expr index&nbsp;&nbsp;$x &quot;c&quot;<br />
3<br />
%expr index&nbsp;&nbsp;$x &quot;d&quot;<br />
4</code></div>得到子字符串<div><span>复制内容到剪贴板</span><h5>代码:</h5><code># 方法一<br />
# expr &lt;string&gt; startpos length<br />
%expr substr &quot;$x&quot; 1 3<br />
abc<br />
%expr substr &quot;$x&quot; 1 5<br />
abcd<br />
%expr substr &quot;$x&quot; 2 5<br />
bcd<br />
# 方法二<br />
# ${x:pos:lenght}<br />
%echo ${x:1}<br />
bcd<br />
%echo ${x:2}<br />
cd<br />
%echo ${x:0}<br />
abcd<br />
%echo ${x:0:2}<br />
ab<br />
%pos=1<br />
%len=2<br />
%echo ${x:$pos:$len}<br />
bc</code></div>匹配正则表达式<div><span>复制内容到剪贴板</span><h5>代码:</h5><code># 打印匹配长度<br />
%expr match $x &quot;.&quot;<br />
1<br />
%expr match $x &quot;abc&quot;<br />
3<br />
%expr match $x &quot;bc&quot;<br />
0</code></div>字符串的掐头去尾<div><span>复制内容到剪贴板</span><h5>代码:</h5><code>%x=aabbaarealwwvvww<br />
%echo &quot;${x%w*w}&quot;<br />
aabbaarealwwvv<br />
%echo &quot;${x%%w*w}&quot;<br />
aabbaareal<br />
%echo &quot;${x##a*a}&quot;<br />
lwwvvww<br />
%echo &quot;${x#a*a}&quot;<br />
bbaarealwwvvww</code></div>其中 , # 表示掐头， 因为键盘上 # 在 $ 的左面。<br />
其中 , % 表示%，&nbsp;&nbsp;因为键盘上 % 在 $ 的右面。<br />
单个的表示最小匹配，双个表示最大匹配。<br />
也就是说，当匹配的有多种方案的时候，选择匹配的最大长度还是最小长度。<br />
<br />
字符串的替换<div><span>复制内容到剪贴板</span><h5>代码:</h5><code>%x=abcdabcd<br />
%echo ${x/a/b} # 只替换一个<br />
bbcdabcd<br />
%echo ${x//a/b} # 替换所有<br />
bbcdbbcd</code></div>不可以<span>使用</span> regexp ， 只能用 * ? 的文件扩展方式。]]></description>
		</item>
		    
		
		<item>
			<title>好久没有写过什么.由于最近太忙了.今天在网上找到了一个写的不错主NFS安装的文章</title>
			<link>http://panrui2006.blog.sohu.com/67074878.html</link>
			<comments>http://panrui2006.blog.sohu.com/67074878.html#comment</comments>
			<dc:creator>瑞雪</dc:creator>
			<pubDate>Sat, 13 Oct 2007 18:27:04 +0800</pubDate>
			<guid>http://panrui2006.blog.sohu.com/67074878.html</guid>
			<description><![CDATA[&nbsp;&nbsp;&nbsp;
NFS was developed at a time when we weren&rsquo;t able to share our
drives like we are able to today - in the Windows environment. It
offers the ability to share the hard disk space of a big server with
many smaller clients. Again, this is a client/server environment. While
this seems like a standard service to offer, it was not always like
this. In the past, clients and servers were unable to share their disk
space.
<p>Thin clients have no hard drives and thus need
a &ldquo;virtual&rdquo; hard-disk. The NFS mount their hard disk from the server
and, while the user thinks they are saving their documents to their
local (thin client) disk, they are in fact saving them to the server.
In a thin client environment, the root, usr and home partitions are all
offered to the client from the server via NFS.</p>
<p><strong>NFS Advantages</strong></p>
<p>&bull; Local workstations use less disk space because commonly used data
can be stored on a single machine and still remain accessible to others
over the network.</p>
<p>&bull; There is no need for users to have separate home directories on
every network machine. Home directories could be set up on the NFS
server and made available throughout the network.</p>
<p>&bull; Storage devices such as floppy disks, CDROM drives, and Zip&reg;
drives can be used by other machines on the network. This may reduce
the number of removable media drives throughout the network.</p>
<p><strong>Install NFS Server in Ubuntu</strong></p>
<p>sudo apt-get install nfs-kernel-server nfs-common portmap</p>
<p>When configuring portmap do =not= bind loopback. If you do you can either edit /etc/default/portmap using the following</p>
<p>sudo vi /etc/default/portmap</p>
<p>or use the following command</p>
<p>sudo dpkg-reconfigure portmap</p>
<p>Restart Portmap using the following command</p>
<p>sudo /etc/init.d/portmap restart</p>
<p><strong>NFS Server Configuration </strong></p>
<p>NFS exports from a server are controlled by the file /etc/exports.
Each line begins with the absolute path of a directory to be exported,
followed by a space-seperated list of allowed clients.</p>
<p>You need to edit the exports file using the following command</p>
<p>sudo vi /etc/exports</p>
<p>Here are some quick examples of what you could add to your /etc/exports</p>
<p>For Full Read Write Permissions allowing any computer from 192.168.1.1 through 192.168.1.255</p>
<p>/files 192.168.1.1/24(rw,no_root_squash,async)</p>
<p>Or for Read Only from a single machine</p>
<p>/files 192.168.1.2 (ro,async)</p>
<p>save this file and exit</p>
<p>A client can be specified either by name or IP address. Wildcards
(*) are allowed in names, as are netmasks (e.g. /24) following IP
addresses, but should usually be avoided for security reasons.</p>
<p>A client specification may be followed by a set of options, in
parenthesis. It is important not to leave any space between the last
client specification character and the opening parenthesis, since
spaces are intrepreted as client seperators.</p>
<p>Now you need to restart NFS server using the following command</p>
<p>sudo /etc/init.d/nfs-kernel-server restart</p>
<p>If you make changes to /etc/exports on a running NFS server, you can make these changes effective by issuing the command</p>
<p>sudo exportfs -a</p>
<p><strong>Install NFS client support in Ubuntu</strong></p>
<p>sudo apt-get install portmap nfs-common</p>
<p>This will install all the required packages for nfs client</p>
<p><strong>Mounting manually</strong></p>
<p>Example to mount server.mydomain.com:/files to /files. In this
example server.mydomain.com is the name of the server containing the
nfs share, and files is the name of the share on the nfs server</p>
<p>The mount point /files must first exist on the client machine.</p>
<p>Create files directory using the following command</p>
<p>sudo mkdir files</p>
<p>You need to mount the share using the following command</p>
<p>sudo mount server.mydomain.com:/files /files</p>
<p>Now you may need to restart services using the following command</p>
<p>sudo /etc/init.d/portmap restart</p>
<p>sudo /etc/init.d/nfs-common restart</p>
<p>Mounting at boot using /etc/fstab</p>
<p>If you want to mount using fstab file</p>
<p>sudo vi /etc/fstab</p>
<p>In this example my /etc/fstab was like this</p>
<p>server.mydomain.com:/files /files nfs rsize=8192,wsize=8192,timeo=14,intr</p>
<p>Change &ldquo;servername.mydomain.com:/files&rdquo;, and &ldquo;/files&rdquo; to match your
server name,share name, and the name of the mount point you created.</p>
<p><strong>Testing Your Configuration</strong></p>
<p>Use the following command in terminal to test</p>
<p>mount /files</p>]]></description>
		</item>
		    
		
	</channel>
</rss>
