<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>文竹</title>
	<atom:link href="http://www.libaqiang.com/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.libaqiang.com/blog</link>
	<description>文竹，常青，智慧与高雅的化身</description>
	<lastBuildDate>Mon, 14 May 2012 08:28:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>javascript获取querystring的方法</title>
		<link>http://www.libaqiang.com/blog/?p=78211</link>
		<comments>http://www.libaqiang.com/blog/?p=78211#comments</comments>
		<pubDate>Mon, 14 May 2012 04:37:05 +0000</pubDate>
		<dc:creator>cgha1984</dc:creator>
				<category><![CDATA[JS]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.libaqiang.com/blog/?p=78211</guid>
		<description><![CDATA[<script type="text/javascript">

//获取QueryString的数组
function getQueryString(){
	var result = location.search.match(new RegExp("[\?\&#038;][^\?\&#038;]+=[^\?\&#038;]+","g"));
	for(var i = 0; i < result.length; i++){
	     result[i] = result[i].substring(1);
	}
	return result;
}

//根据QueryString参数名称获取值
function getQueryStringByName(name){
	var result = location.search.match(new RegExp("[\?\&#038;]" + name+ "=([^\&#038;]+)","i"));
	if(result == null &#124;&#124; result.length < 1){
	     return "";
	}
	return result[1];
}

//根据QueryString参数索引获取值
function getQueryStringByIndex(index){
	if(index == null){
	      return "";
	}
	var queryStringList = getQueryString();
	if (index >= queryStringList.length){
	      return "";
	}
	var result = queryStringList[index];
	var startIndex = result.indexOf("=") + 1;
	result = result.substring(startIndex);
	return result;
}
</script><p class="read-more"><a href="http://www.libaqiang.com/blog/?p=78211">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p><script type="text/javascript"></p>
<p>//获取QueryString的数组
function getQueryString(){
	var result = location.search.match(new RegExp("[\?\&#038;][^\?\&#038;]+=[^\?\&#038;]+","g"));
	for(var i = 0; i < result.length; i++){
	     result[i] = result[i].substring(1);
	}
	return result;
}</p>
<p>//根据QueryString参数名称获取值
function getQueryStringByName(name){
	var result = location.search.match(new RegExp("[\?\&#038;]" + name+ "=([^\&#038;]+)","i"));
	if(result == null || result.length < 1){
	     return "";
	}
	return result[1];
}</p>
<p>//根据QueryString参数索引获取值
function getQueryStringByIndex(index){
	if(index == null){
	      return "";
	}
	var queryStringList = getQueryString();
	if (index >= queryStringList.length){
	      return "";
	}
	var result = queryStringList[index];
	var startIndex = result.indexOf("=") + 1;
	result = result.substring(startIndex);
	return result;
}
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://www.libaqiang.com/blog/?feed=rss2&#038;p=78211</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>debian下安装svn的服务端和客户端</title>
		<link>http://www.libaqiang.com/blog/?p=78208</link>
		<comments>http://www.libaqiang.com/blog/?p=78208#comments</comments>
		<pubDate>Fri, 11 May 2012 02:26:57 +0000</pubDate>
		<dc:creator>cgha1984</dc:creator>
				<category><![CDATA[debian]]></category>
		<category><![CDATA[工具]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://www.libaqiang.com/blog/?p=78208</guid>
		<description><![CDATA[版本信息：
Debain: 5.0
Kernel: 2.6.26-1-686
Subversion: 1.5.6
Apache: 2.2.11
服务端：
1、安装
apt-get install subversion subversion-tools
apt-get install apache2 libapache2-svn
2、项目
mkdir /opt/linuxany -p
svnadmin create /opt/linuxany/test1
svnadmin create /opt/linuxany/test2
3、配置
1)vi /etc/apache2/httpd.conf
#注意以下2行可能已在apache2中有配置了，如果restart时候发现错误，则注释掉即可
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so

#svn连接到服务器后的根目录，即/等同于/opt/linuxany(例如：svn list http://IP/test1)；若此处为/svn，则/svn等同于/opt/linuxany(例如：svn list http://IP/svn/test1)

[Location /] 
DAV svn
SVNParentPath /opt/linuxany #[项目根目录]
AuthzSVNAccessFile /opt/linuxany/authz.conf #[用户权限配置文件]
AuthType Basic
AuthName "Subversion.zoneyump"
AuthUserFile /opt/linuxany/authfile #[用户密码配置文件]
Require valid-user
[/Location]
2)vi /opt/linuxany/authz.conf
[test1:/]    #[/opt/linuxany/test1下所有文件及目录]
* = [所有用户都没有权限]
lb = rw [lb用户用读写权限]

[test2:/]
* = r       #[所有用户都只有读权限]
lb = rw
3)生成authfile文件及添加用户
htpasswd -c /opt/linuxany/authfile lb         #[-c: 生成authfile文件]
htpasswd /opt/linuxany/authfile 用户名     #[添加用户]
4)添加权限
chmod 777 /opt/linuxany -R
4、启动服务
/etc/init.d/apache2 start
svnserve -d
5、导入数据
svn import sourceDir file:///opt/linuxany/test1/targetDir -m "import info"
6、连接
在浏览器中输入”http://IP/test1″就能看到targetDir目录
[或者]
在终端输入”svn list http://IP/test1″
客户端：
对svn服务器数据的操作有两种方法：本地和远程
1、本地
1)把文件拷贝到本地
cd /root/svnDir
svn checkout http://IP/test1
2)添加新的文件
cp -a /root/dataDir /root/svnDir/test1
cd /root/svnDir/test1
svn add dataDir
svn commit -m "add info"   #[将改动的文件提交到版本库]
3)显示
svn list dataDir
4)还原
svn update -r 200 dataDir #[把dataDir目录还原到版本200]
5)删除
svn delete dataDir -m "del info"
6)查看变理记录
svn log dataDir
7)查看文件详细信息
svn info dataDir
2、远程
1)显示
svn list http://IP/test1
2)导入数据
svn import /root/dataDir http://IP/test1/dataDIr -m "import info"
3)删除
svn del http://IP/test1/dataDir -m "del info"
4)查看日志
svn log http://IP/test1<p class="read-more"><a href="http://www.libaqiang.com/blog/?p=78208">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>版本信息：<br />
Debain: 5.0<br />
Kernel: 2.6.26-1-686<br />
Subversion: 1.5.6<br />
Apache: 2.2.11<br />
服务端：<br />
1、安装<br />
apt-get install subversion subversion-tools<br />
apt-get install apache2 libapache2-svn<br />
2、项目<br />
mkdir /opt/linuxany -p<br />
svnadmin create /opt/linuxany/test1<br />
svnadmin create /opt/linuxany/test2<br />
3、配置<br />
1)vi /etc/apache2/httpd.conf<br />
#注意以下2行可能已在apache2中有配置了，如果restart时候发现错误，则注释掉即可<br />
LoadModule dav_svn_module modules/mod_dav_svn.so<br />
LoadModule authz_svn_module modules/mod_authz_svn.so</p>
<p>#svn连接到服务器后的根目录，即/等同于/opt/linuxany(例如：svn list http://IP/test1)；若此处为/svn，则/svn等同于/opt/linuxany(例如：svn list http://IP/svn/test1)</p>
<p>[Location /]<br />
DAV svn<br />
SVNParentPath /opt/linuxany #[项目根目录]<br />
AuthzSVNAccessFile /opt/linuxany/authz.conf #[用户权限配置文件]<br />
AuthType Basic<br />
AuthName “Subversion.zoneyump”<br />
AuthUserFile /opt/linuxany/authfile #[用户密码配置文件]<br />
Require valid-user<br />
[/Location]<br />
2)vi /opt/linuxany/authz.conf<br />
[test1:/]    #[/opt/linuxany/test1下所有文件及目录]<br />
* = [所有用户都没有权限]<br />
lb = rw [lb用户用读写权限]</p>
<p>[test2:/]<br />
* = r       #[所有用户都只有读权限]<br />
lb = rw<br />
3)生成authfile文件及添加用户<br />
htpasswd -c /opt/linuxany/authfile lb         #[-c: 生成authfile文件]<br />
htpasswd /opt/linuxany/authfile 用户名     #[添加用户]<br />
4)添加权限<br />
chmod 777 /opt/linuxany -R<br />
4、启动服务<br />
/etc/init.d/apache2 start<br />
svnserve -d<br />
5、导入数据<br />
svn import sourceDir file:///opt/linuxany/test1/targetDir -m “import info”<br />
6、连接<br />
在浏览器中输入”http://IP/test1″就能看到targetDir目录<br />
[或者]<br />
在终端输入”svn list http://IP/test1″<br />
客户端：<br />
对svn服务器数据的操作有两种方法：本地和远程<br />
1、本地<br />
1)把文件拷贝到本地<br />
cd /root/svnDir<br />
svn checkout http://IP/test1<br />
2)添加新的文件<br />
cp -a /root/dataDir /root/svnDir/test1<br />
cd /root/svnDir/test1<br />
svn add dataDir<br />
svn commit -m “add info”   #[将改动的文件提交到版本库]<br />
3)显示<br />
svn list dataDir<br />
4)还原<br />
svn update -r 200 dataDir #[把dataDir目录还原到版本200]<br />
5)删除<br />
svn delete dataDir -m “del info”<br />
6)查看变理记录<br />
svn log dataDir<br />
7)查看文件详细信息<br />
svn info dataDir<br />
2、远程<br />
1)显示<br />
svn list http://IP/test1<br />
2)导入数据<br />
svn import /root/dataDir http://IP/test1/dataDIr -m “import info”<br />
3)删除<br />
svn del http://IP/test1/dataDir -m “del info”<br />
4)查看日志<br />
svn log http://IP/test1</p>
]]></content:encoded>
			<wfw:commentRss>http://www.libaqiang.com/blog/?feed=rss2&#038;p=78208</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php类的魔术方法也就是带下划线的类方法介绍</title>
		<link>http://www.libaqiang.com/blog/?p=78206</link>
		<comments>http://www.libaqiang.com/blog/?p=78206#comments</comments>
		<pubDate>Wed, 09 May 2012 05:54:41 +0000</pubDate>
		<dc:creator>cgha1984</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[魔术方法]]></category>

		<guid isPermaLink="false">http://www.libaqiang.com/blog/?p=78206</guid>
		<description><![CDATA[PHP把所有以__（两个下划线）开头的类方法当成魔术方法，并且这些魔术方法的参数都不能 通过引用传递。php的魔术方法有：
__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state() 和 __clone()等。
下面简单说一下对应的功能：
Class MyClass {
 __construct($var1,$var2) {
 //构造器
 }
__destruct() {
 //析构方法
 }
__clone() {
 //克隆方法  $obj2 = clone $obj1; 时执行
 }
__call($fun,$args) {
 //魔术调用  方法名和参数
 }
 __callStatic($fun,$args) {
 //魔术调用  静态方法名和参数
 //可见性未设置为public或未声明为static的时候会产生一个警告 。
 //本特性只在PHP 5.3.0 及以上版本有效。
 }
__invoke($args) {
 //把类作为函数使用 参数
 //当尝试以调用函数的方式调用一个对象时，__invoke() 方法会被自动调用
 //本特性只在PHP 5.3.0 及以上版本有效。
 }
__toSring() {
 //对象输出  $echo $obj = new Class(); 时输出
 }

 __set($var,$value) {
 //设置对象属性  $obj->var = value 赋值
 //在给未定义的变量赋值时，__set() 会被调用。
 }
__get($var) {
 //读取对象属性  $obj->var  获取
 //读取未定义的变量的值时，__get() 会被调用。
 }
__isset($var) {
 //判断对象内部属性是否存在  isset($obj->var )。
 //当对未定义的变量调用isset() 或 empty()时，__isset() 会被调用。 
 //自PHP 5.1.0起有效
 }
__unset($var) {
 //释放内部对象属性  unset($obj->var)。
 //当对未定义的变量调用unset()时，__unset() 会被调用。
 //自PHP 5.1.0起有效
  }

__set_state(array $args) {
 //当调用var_export()时，这个静态 方法会被调用。
//本方法的唯一参数是一个数组，其中包含按array('property' => value, ...)格式排列的类属性。 
//自PHP 5.1.0起有效
 }
__sleep() {
 //序列化前奏方法 return array($var1,$var2);
 }
__wakeup() {
 //反序列化前奏方法  $this->var = 'other_value'
 }
}

补充：一个类外面使用的自动加载方法： 

__autoload($classname) {
    require(PATH.$classname.'_class.php');
}<p class="read-more"><a href="http://www.libaqiang.com/blog/?p=78206">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>PHP把所有以__（两个下划线）开头的类方法当成魔术方法，并且这些魔术方法的参数都不能 通过引用传递。php的魔术方法有：<br />
__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state() 和 __clone()等。<br />
下面简单说一下对应的功能：<br />
Class MyClass {<br />
 __construct($var1,$var2) {<br />
 //构造器<br />
 }<br />
__destruct() {<br />
 //析构方法<br />
 }<br />
__clone() {<br />
 //克隆方法  $obj2 = clone $obj1; 时执行<br />
 }<br />
__call($fun,$args) {<br />
 //魔术调用  方法名和参数<br />
 }<br />
 __callStatic($fun,$args) {<br />
 //魔术调用  静态方法名和参数<br />
 //可见性未设置为public或未声明为static的时候会产生一个警告 。<br />
 //本特性只在PHP 5.3.0 及以上版本有效。<br />
 }<br />
__invoke($args) {<br />
 //把类作为函数使用 参数<br />
 //当尝试以调用函数的方式调用一个对象时，__invoke() 方法会被自动调用<br />
 //本特性只在PHP 5.3.0 及以上版本有效。<br />
 }<br />
__toSring() {<br />
 //对象输出  $echo $obj = new Class(); 时输出<br />
 }</p>
<p> __set($var,$value) {<br />
 //设置对象属性  $obj->var = value 赋值<br />
 //在给未定义的变量赋值时，__set() 会被调用。<br />
 }<br />
__get($var) {<br />
 //读取对象属性  $obj->var  获取<br />
 //读取未定义的变量的值时，__get() 会被调用。<br />
 }<br />
__isset($var) {<br />
 //判断对象内部属性是否存在  isset($obj->var )。<br />
 //当对未定义的变量调用isset() 或 empty()时，__isset() 会被调用。<br />
 //自PHP 5.1.0起有效<br />
 }<br />
__unset($var) {<br />
 //释放内部对象属性  unset($obj->var)。<br />
 //当对未定义的变量调用unset()时，__unset() 会被调用。<br />
 //自PHP 5.1.0起有效<br />
  }</p>
<p>__set_state(array $args) {<br />
 //当调用var_export()时，这个静态 方法会被调用。<br />
//本方法的唯一参数是一个数组，其中包含按array(&#8216;property&#8217; => value, &#8230;)格式排列的类属性。<br />
//自PHP 5.1.0起有效<br />
 }<br />
__sleep() {<br />
 //序列化前奏方法 return array($var1,$var2);<br />
 }<br />
__wakeup() {<br />
 //反序列化前奏方法  $this->var = &#8216;other_value&#8217;<br />
 }<br />
}</p>
<p>补充：一个类外面使用的自动加载方法： </p>
<p>__autoload($classname) {<br />
    require(PATH.$classname.&#8217;_class.php&#8217;);<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.libaqiang.com/blog/?feed=rss2&#038;p=78206</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>debian下查看软件套件的安装完整度</title>
		<link>http://www.libaqiang.com/blog/?p=78199</link>
		<comments>http://www.libaqiang.com/blog/?p=78199#comments</comments>
		<pubDate>Fri, 27 Apr 2012 02:09:36 +0000</pubDate>
		<dc:creator>cgha1984</dc:creator>
				<category><![CDATA[debian]]></category>
		<category><![CDATA[工具]]></category>
		<category><![CDATA[dpkg]]></category>

		<guid isPermaLink="false">http://www.libaqiang.com/blog/?p=78199</guid>
		<description><![CDATA[很多人常会发生把某个套件搞烂了，或者设定档之类不小心删掉了，弥补的办法收拾移除再重新安装或直接（apt-get install --reinstall package），但是不管你怎么装，设定档就是回不来，搞烂的资料也还是留着. 
其实，这并不是 Debian 的错，主要是怕你在移除时，不小心就将重要资料跟着就砍掉了（ex: MySQL 不小心移除就把 DB 砍掉，这就很尴尬了.） 

此篇文章我们来说明一下：如何在 Debian 系统下完全移除套件与实体目录？ 

1、套件重新安装 
案例背景：不小心将Apache的设定档盖掉/砍掉，所以打算重新安装Apache. 

套件移除重新安装，和apt-get install --reinstall apache2并没有错，只不过问题是， apache2的package里面并没有设定档. Orz. 

查看Package套件内容: 
dpkg -L apache2 &#124; grep conf 
dpkg -L apache2.2-common &#124; grep conf # Debian设定档都放在package_name-common中 

或者通过：
less /var/lib/dpkg/info/apache2.list

所以要重新取得设定档，应该直接 
apt-get install --reinstall apache2.2-common #（请修改成自己系统的apache2版本） 

2、套件完整移除 
案例背景：MySQL被搞烂了，所以要将全部移除（含资料都要移除），再重新安装. 

完整移除的步骤: 

apt-get remove --purge mysql-server mysql-server-5.0 mysql-common mysql-client mysql-client-5.0 
这一行就会将DB/设定档都完整移除（--purge会将所有移除），不过大多人的问题是， --purge后面那一串是从哪来的? 

可用下述查法查找相关的package: 
dpkg -l &#124; grep mysql # dpkg -l会列出此系统安装的所有package 
ls /var/lib/dpkg/info/*mysql* 

移除之后，重新安装直接apt-get install就可以啰~ :） 

注:若只是Database file烂了，只要apt-get remove --purge mysql-server-5.0，再重新安装mysql-server-5.0即可. 

3、套件锁定版本
案例背景：假设现在要锁定gaim版本，不想要gaim被升级或降级，这个情况下该怎么办？

有下述两种做法: 
echo "gaim hold" &#124; dpkg --set-selections #将gaim锁定版本 
dpkg --get-selections "gaim" #检查出现gaim hold #状态是hold，就不能被升级了. 

vim /etc/apt/preferences #内容如下，把版本编号写死. 
Package: gaim 
Pin: version 0.58* 

4、套件解除锁定 
echo "gaim install" &#124; dpkg --set-selections 
dpkg --get-selections "gaim" #检查出现 gaim install #状态被重置为 install，就可以继续升级了

补充：状态档案位置 
hold/install 这些状态标志都写在 /var/lib/dpkg/status 里，也可以手动去修改变 hold/install 等状态.<p class="read-more"><a href="http://www.libaqiang.com/blog/?p=78199">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>很多人常会发生把某个套件搞烂了，或者设定档之类不小心删掉了，弥补的办法收拾移除再重新安装或直接（apt-get install &#8211;reinstall package），但是不管你怎么装，设定档就是回不来，搞烂的资料也还是留着.<br />
其实，这并不是 Debian 的错，主要是怕你在移除时，不小心就将重要资料跟着就砍掉了（ex: MySQL 不小心移除就把 DB 砍掉，这就很尴尬了.） </p>
<p>此篇文章我们来说明一下：如何在 Debian 系统下完全移除套件与实体目录？ </p>
<p>1、套件重新安装<br />
案例背景：不小心将Apache的设定档盖掉/砍掉，所以打算重新安装Apache. </p>
<p>套件移除重新安装，和apt-get install &#8211;reinstall apache2并没有错，只不过问题是， apache2的package里面并没有设定档. Orz. </p>
<p>查看Package套件内容:<br />
dpkg -L apache2 | grep conf<br />
dpkg -L apache2.2-common | grep conf # Debian设定档都放在package_name-common中 </p>
<p>或者通过：<br />
less /var/lib/dpkg/info/apache2.list</p>
<p>所以要重新取得设定档，应该直接<br />
apt-get install &#8211;reinstall apache2.2-common #（请修改成自己系统的apache2版本） </p>
<p>2、套件完整移除<br />
案例背景：MySQL被搞烂了，所以要将全部移除（含资料都要移除），再重新安装. </p>
<p>完整移除的步骤: </p>
<p>apt-get remove &#8211;purge mysql-server mysql-server-5.0 mysql-common mysql-client mysql-client-5.0<br />
这一行就会将DB/设定档都完整移除（&#8211;purge会将所有移除），不过大多人的问题是， &#8211;purge后面那一串是从哪来的? </p>
<p>可用下述查法查找相关的package:<br />
dpkg -l | grep mysql # dpkg -l会列出此系统安装的所有package<br />
ls /var/lib/dpkg/info/*mysql* </p>
<p>移除之后，重新安装直接apt-get install就可以啰~ :） </p>
<p>注:若只是Database file烂了，只要apt-get remove &#8211;purge mysql-server-5.0，再重新安装mysql-server-5.0即可. </p>
<p>3、套件锁定版本<br />
案例背景：假设现在要锁定gaim版本，不想要gaim被升级或降级，这个情况下该怎么办？</p>
<p>有下述两种做法:<br />
echo “gaim hold” | dpkg &#8211;set-selections #将gaim锁定版本<br />
dpkg &#8211;get-selections “gaim” #检查出现gaim hold #状态是hold，就不能被升级了. </p>
<p>vim /etc/apt/preferences #内容如下，把版本编号写死.<br />
Package: gaim<br />
Pin: version 0.58* </p>
<p>4、套件解除锁定<br />
echo “gaim install” | dpkg &#8211;set-selections<br />
dpkg &#8211;get-selections “gaim” #检查出现 gaim install #状态被重置为 install，就可以继续升级了</p>
<p>补充：状态档案位置<br />
hold/install 这些状态标志都写在 /var/lib/dpkg/status 里，也可以手动去修改变 hold/install 等状态.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.libaqiang.com/blog/?feed=rss2&#038;p=78199</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>diff命令检查文件不同的详细方法</title>
		<link>http://www.libaqiang.com/blog/?p=78197</link>
		<comments>http://www.libaqiang.com/blog/?p=78197#comments</comments>
		<pubDate>Thu, 26 Apr 2012 10:36:12 +0000</pubDate>
		<dc:creator>cgha1984</dc:creator>
				<category><![CDATA[debian]]></category>
		<category><![CDATA[工具]]></category>
		<category><![CDATA[diff]]></category>

		<guid isPermaLink="false">http://www.libaqiang.com/blog/?p=78197</guid>
		<description><![CDATA[功能说明：比较文件的差异。

语　　法：diff [-abBcdefHilnNpPqrstTuvwy][-<行数>][-C <行数>][-D <巨集名称>][-I <字符或字符串>][-S <文件>][-W <宽度>][-x <文件或目录>][-X <文件>][--help][--left-column][--suppress-common-line][文件或目录1][文件或目录2]

补充说明：diff以逐行的方式，比较文本文件的异同处。所以指定要比较目录，则diff默认会比较目录中相同文件名的文件，但不会比较其中子目录。

参　　数：
　-<行数> 　指定要显示多少行的文本。此参数必须与-c或-u参数一并使用。
　-a或--text 　diff预设只会逐行比较文本文件。
　-b或--ignore-space-change 　不检查空格字符的不同。
　-B或--ignore-blank-lines 　不检查空白行。
　-c 　显示全部内文，并标出不同之处。
　-C<行数>或--context<行数> 　与执行"-c-<行数>"指令相同。
　-d或--minimal 　使用不同的演算法，以较小的单位来做比较。
　-D<巨集名称>或ifdef<巨集名称> 　此参数的输出格式可用于前置处理器巨集。
　-e或--ed 　此参数的输出格式可用于ed的script文件。
　-f或-forward-ed 　输出的格式类似ed的script文件，但按照原来文件的顺序来显示不同处。
　-H或--speed-large-files 　比较大文件时，可加快速度。
　-l<字符或字符串>或--ignore-matching-lines<字符或字符串> 　若两个文件在某几行有所不同，而这几行同时都包含了选项中指定的字符或字符串，则不显示这两个文件的差异。
　-i或--ignore-case 　不检查大小写的不同。
　-l或--paginate 　将结果交由pr程序来分页。
　-n或--rcs 　将比较结果以RCS的格式来显示。
　-N或--new-file 　在比较目录时，若文件A仅出现在某个目录中，预设会显示：
Only in目录：文件A若使用-N参数，则diff会将文件A与一个空白的文件比较。
　-p 　若比较的文件为C语言的程序码文件时，显示差异所在的函数名称。
　-P或--unidirectional-new-file 　与-N类似，但只有当第二个目录包含了一个第一个目录所没有的文件时，才会将这个文件与空白的文件做比较。
　-q或--brief 　仅显示有无差异，不显示详细的信息。
　-r或--recursive 　比较子目录中的文件。
　-s或--report-identical-files 　若没有发现任何差异，仍然显示信息。
　-S<文件>或--starting-file<文件> 　在比较目录时，从指定的文件开始比较。
　-t或--expand-tabs 　在输出时，将tab字符展开。
　-T或--initial-tab 　在每行前面加上tab字符以便对齐。
　-u,-U<列数>或--unified=<列数> 　以合并的方式来显示文件内容的不同。
　-v或--version 　显示版本信息。
　-w或--ignore-all-space 　忽略全部的空格字符。
　-W<宽度>或--width<宽度> 　在使用-y参数时，指定栏宽。
　-x<文件名或目录>或--exclude<文件名或目录> 　不比较选项中所指定的文件或目录。
　-X<文件>或--exclude-from<文件> 　您可以将文件或目录类型存成文本文件，然后在=<文件>中指定此文本文件。
　-y或--side-by-side 　以并列的方式显示文件的异同之处。
　--help 　显示帮助。
　--left-column 　在使用-y参数时，若两个文件某一行内容相同，则仅在左侧的栏位显示该行内容。
　--suppress-common-lines 　在使用-y参数时，仅显示不同之处。

===========================================================================
摘要：本文详细介绍了diff命令的基本用法

作者：zieckey （zieckey＠yahoo.com.cn）
   All Rights Reserved！

有这样两个文件：

程序清单1 ：hello.c

#include <stdio.h>

int main(void)
{
   char msg[] = "Hello world!";
  
    puts(msg);
    printf("Welcome to use diff commond.\n");
   
    return 0;   
}


程序清单2：hello_diff.c

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char msg[] = "Hello world,fome hello_diff.c";
   
    puts(msg);
    printf("hello_diff.c says,'Here you are,using diff.'\n");
   
    return 0;   
}

我们使用diff命令来查看这两个文件的不同之处，有一下几种方便的方法：
1、普通格式输出：
[root@localhost diff]# diff hello.c hello_diff.c
1a2
> #include <stdlib.h>
5c6
<       char msg[] = "Hello world!";
---
>       char msg[] = "Hello world,fome hello_diff.c";
8c9
<       printf("Welcome to use diff commond.\n");
---
>       printf("hello_diff.c says,'Here you are,using diff.'\n");
[root@localhost diff]#

上面的“1a2”表示后面的一个文件"hello_diff.c"比前面的一个文件"hello.c"多了一行
"5c6"表示第一个文件的第5行与第二个文件的第6行有区别

2、并排格式输出
[root@localhost diff]# diff hello.c hello_diff.c -y -W 130
#include <stdio.h>                                              #include <stdio.h>
                                                              > #include <stdlib.h>

int main(void)                                                  int main(void)
{                                                               {
        char msg[] = "Hello world!";                          &#124;         char msg[] = "Hello world,fome hello_diff.c";

        puts(msg);                                                      puts(msg);
        printf("Welcome to use diff commond.\n");             &#124;         printf("hello_diff.c says,'Here you are,using diff.'\

        return 0;                                                       return 0;
}                                                               }
[root@localhost diff]#
这种并排格式的对比一目了然，可以快速找到不同的地方。
-W选择可以指定输出列的宽度，这里指定输出列宽为130

3、上下文输出格式
[root@localhost diff]# diff hello.c hello_diff.c -c
*** hello.c     2007-09-25 17:54:51.000000000 +0800
--- hello_diff.c        2007-09-25 17:56:00.000000000 +0800
***************
*** 1,11 ****
#include <stdio.h>

int main(void)
{
!       char msg[] = "Hello world!";

        puts(msg);
!       printf("Welcome to use diff commond.\n");

        return 0;
}
--- 1,12 ----
#include <stdio.h>
+ #include <stdlib.h>

int main(void)
{
!       char msg[] = "Hello world,fome hello_diff.c";

        puts(msg);
!       printf("hello_diff.c says,'Here you are,using diff.'\n");

        return 0;
}
[root@localhost diff]#
这种方式在开头两行作了比较文件的说明，这里有三中特殊字符：
＋        比较的文件的后者比前着多一行
－        比较的文件的后者比前着少一行       
！        比较的文件两者有差别的行

4、统一输出格式
[root@localhost diff]# diff hello.c hello_diff.c -u
--- hello.c     2007-09-25 17:54:51.000000000 +0800
+++ hello_diff.c        2007-09-25 17:56:00.000000000 +0800
@@ -1,11 +1,12 @@
#include <stdio.h>
+#include <stdlib.h>

int main(void)
{
-       char msg[] = "Hello world!";
+       char msg[] = "Hello world,fome hello_diff.c";

        puts(msg);
-       printf("Welcome to use diff commond.\n");
+       printf("hello_diff.c says,'Here you are,using diff.'\n");

        return 0;
}
[root@localhost diff]#
正如看到的那样，统一格式的输出更加紧凑，所以更易于理解，更易于修改。

5、其他
假如你想查看两个文件是否不同又不想显示差异之处的话，可以加上－q选项：
[root@localhost diff]# diff hello.c hello_diff.c -q
Files hello.c and hello_diff.c differ
[root@localhost diff]# 另外你还可以提供一些匹配规则来忽略某中差别，可以用 -I regexp

[root@localhost diff]# diff hello.c hello_diff.c -c -I include
*** hello.c     2007-09-25 17:54:51.000000000 +0800
--- hello_diff.c        2007-09-25 17:56:00.000000000 +0800
***************
*** 2,11 ****

int main(void)
{
!       char msg[] = "Hello world!";

        puts(msg);
!       printf("Welcome to use diff commond.\n");

        return 0;
}
--- 3,12 ----

int main(void)
{
!       char msg[] = "Hello world,fome hello_diff.c";

        puts(msg);
!       printf("hello_diff.c says,'Here you are,using diff.'\n");

        return 0;
}
[root@localhost diff]#

这里通过“ -I include”选项来忽略带有“ include”字样的行<p class="read-more"><a href="http://www.libaqiang.com/blog/?p=78197">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>功能说明：比较文件的差异。</p>
<p>语　　法：diff [-abBcdefHilnNpPqrstTuvwy][-<行数>][-C <行数>][-D <巨集名称>][-I <字符或字符串>][-S <文件>][-W <宽度>][-x <文件或目录>][-X <文件>][--help][--left-column][--suppress-common-line][文件或目录1][文件或目录2]</p>
<p>补充说明：diff以逐行的方式，比较文本文件的异同处。所以指定要比较目录，则diff默认会比较目录中相同文件名的文件，但不会比较其中子目录。</p>
<p>参　　数：<br />
　-<行数> 　指定要显示多少行的文本。此参数必须与-c或-u参数一并使用。<br />
　-a或&#8211;text 　diff预设只会逐行比较文本文件。<br />
　-b或&#8211;ignore-space-change 　不检查空格字符的不同。<br />
　-B或&#8211;ignore-blank-lines 　不检查空白行。<br />
　-c 　显示全部内文，并标出不同之处。<br />
　-C<行数>或&#8211;context<行数> 　与执行”-c-<行数>“指令相同。<br />
　-d或&#8211;minimal 　使用不同的演算法，以较小的单位来做比较。<br />
　-D<巨集名称>或ifdef<巨集名称> 　此参数的输出格式可用于前置处理器巨集。<br />
　-e或&#8211;ed 　此参数的输出格式可用于ed的script文件。<br />
　-f或-forward-ed 　输出的格式类似ed的script文件，但按照原来文件的顺序来显示不同处。<br />
　-H或&#8211;speed-large-files 　比较大文件时，可加快速度。<br />
　-l<字符或字符串>或&#8211;ignore-matching-lines<字符或字符串> 　若两个文件在某几行有所不同，而这几行同时都包含了选项中指定的字符或字符串，则不显示这两个文件的差异。<br />
　-i或&#8211;ignore-case 　不检查大小写的不同。<br />
　-l或&#8211;paginate 　将结果交由pr程序来分页。<br />
　-n或&#8211;rcs 　将比较结果以RCS的格式来显示。<br />
　-N或&#8211;new-file 　在比较目录时，若文件A仅出现在某个目录中，预设会显示：<br />
Only in目录：文件A若使用-N参数，则diff会将文件A与一个空白的文件比较。<br />
　-p 　若比较的文件为C语言的程序码文件时，显示差异所在的函数名称。<br />
　-P或&#8211;unidirectional-new-file 　与-N类似，但只有当第二个目录包含了一个第一个目录所没有的文件时，才会将这个文件与空白的文件做比较。<br />
　-q或&#8211;brief 　仅显示有无差异，不显示详细的信息。<br />
　-r或&#8211;recursive 　比较子目录中的文件。<br />
　-s或&#8211;report-identical-files 　若没有发现任何差异，仍然显示信息。<br />
　-S<文件>或&#8211;starting-file<文件> 　在比较目录时，从指定的文件开始比较。<br />
　-t或&#8211;expand-tabs 　在输出时，将tab字符展开。<br />
　-T或&#8211;initial-tab 　在每行前面加上tab字符以便对齐。<br />
　-u,-U<列数>或&#8211;unified=<列数> 　以合并的方式来显示文件内容的不同。<br />
　-v或&#8211;version 　显示版本信息。<br />
　-w或&#8211;ignore-all-space 　忽略全部的空格字符。<br />
　-W<宽度>或&#8211;width<宽度> 　在使用-y参数时，指定栏宽。<br />
　-x<文件名或目录>或&#8211;exclude<文件名或目录> 　不比较选项中所指定的文件或目录。<br />
　-X<文件>或&#8211;exclude-from<文件> 　您可以将文件或目录类型存成文本文件，然后在=<文件>中指定此文本文件。<br />
　-y或&#8211;side-by-side 　以并列的方式显示文件的异同之处。<br />
　&#8211;help 　显示帮助。<br />
　&#8211;left-column 　在使用-y参数时，若两个文件某一行内容相同，则仅在左侧的栏位显示该行内容。<br />
　&#8211;suppress-common-lines 　在使用-y参数时，仅显示不同之处。</p>
<p>===========================================================================<br />
摘要：本文详细介绍了diff命令的基本用法</p>
<p>作者：zieckey （zieckey＠yahoo.com.cn）<br />
   All Rights Reserved！</p>
<p>有这样两个文件：</p>
<p>程序清单1 ：hello.c</p>
<p>#include <stdio.h></p>
<p>int main(void)<br />
{<br />
   char msg[] = “Hello world!”;</p>
<p>    puts(msg);<br />
    printf(“Welcome to use diff commond.\n”);</p>
<p>    return 0;<br />
}</p>
<p>程序清单2：hello_diff.c</p>
<p>#include <stdio.h><br />
#include <stdlib.h></p>
<p>int main(void)<br />
{<br />
    char msg[] = “Hello world,fome hello_diff.c”;</p>
<p>    puts(msg);<br />
    printf(“hello_diff.c says,&#8217;Here you are,using diff.&#8217;\n”);</p>
<p>    return 0;<br />
}</p>
<p>我们使用diff命令来查看这两个文件的不同之处，有一下几种方便的方法：<br />
1、普通格式输出：<br />
[root@localhost diff]# diff hello.c hello_diff.c<br />
1a2<br />
> #include <stdlib.h><br />
5c6<br />
<       char msg[] = "Hello world!";<br />
---<br />
>       char msg[] = “Hello world,fome hello_diff.c”;<br />
8c9<br />
<       printf("Welcome to use diff commond.\n");<br />
---<br />
>       printf(“hello_diff.c says,&#8217;Here you are,using diff.&#8217;\n”);<br />
[root@localhost diff]#</p>
<p>上面的“1a2”表示后面的一个文件”hello_diff.c”比前面的一个文件”hello.c”多了一行<br />
“5c6&#8243;表示第一个文件的第5行与第二个文件的第6行有区别</p>
<p>2、并排格式输出<br />
[root@localhost diff]# diff hello.c hello_diff.c -y -W 130<br />
#include <stdio.h>                                              #include <stdio.h><br />
                                                              > #include <stdlib.h></p>
<p>int main(void)                                                  int main(void)<br />
{                                                               {<br />
        char msg[] = “Hello world!”;                          |         char msg[] = “Hello world,fome hello_diff.c”;</p>
<p>        puts(msg);                                                      puts(msg);<br />
        printf(“Welcome to use diff commond.\n”);             |         printf(“hello_diff.c says,&#8217;Here you are,using diff.&#8217;\</p>
<p>        return 0;                                                       return 0;<br />
}                                                               }<br />
[root@localhost diff]#<br />
这种并排格式的对比一目了然，可以快速找到不同的地方。<br />
-W选择可以指定输出列的宽度，这里指定输出列宽为130</p>
<p>3、上下文输出格式<br />
[root@localhost diff]# diff hello.c hello_diff.c -c<br />
*** hello.c     2007-09-25 17:54:51.000000000 +0800<br />
&#8212; hello_diff.c        2007-09-25 17:56:00.000000000 +0800<br />
***************<br />
*** 1,11 ****<br />
#include <stdio.h></p>
<p>int main(void)<br />
{<br />
!       char msg[] = “Hello world!”;</p>
<p>        puts(msg);<br />
!       printf(“Welcome to use diff commond.\n”);</p>
<p>        return 0;<br />
}<br />
&#8212; 1,12 &#8212;-<br />
#include <stdio.h><br />
+ #include <stdlib.h></p>
<p>int main(void)<br />
{<br />
!       char msg[] = “Hello world,fome hello_diff.c”;</p>
<p>        puts(msg);<br />
!       printf(“hello_diff.c says,&#8217;Here you are,using diff.&#8217;\n”);</p>
<p>        return 0;<br />
}<br />
[root@localhost diff]#<br />
这种方式在开头两行作了比较文件的说明，这里有三中特殊字符：<br />
＋        比较的文件的后者比前着多一行<br />
－        比较的文件的后者比前着少一行<br />
！        比较的文件两者有差别的行</p>
<p>4、统一输出格式<br />
[root@localhost diff]# diff hello.c hello_diff.c -u<br />
&#8212; hello.c     2007-09-25 17:54:51.000000000 +0800<br />
+++ hello_diff.c        2007-09-25 17:56:00.000000000 +0800<br />
@@ -1,11 +1,12 @@<br />
#include <stdio.h><br />
+#include <stdlib.h></p>
<p>int main(void)<br />
{<br />
-       char msg[] = “Hello world!”;<br />
+       char msg[] = “Hello world,fome hello_diff.c”;</p>
<p>        puts(msg);<br />
-       printf(“Welcome to use diff commond.\n”);<br />
+       printf(“hello_diff.c says,&#8217;Here you are,using diff.&#8217;\n”);</p>
<p>        return 0;<br />
}<br />
[root@localhost diff]#<br />
正如看到的那样，统一格式的输出更加紧凑，所以更易于理解，更易于修改。</p>
<p>5、其他<br />
假如你想查看两个文件是否不同又不想显示差异之处的话，可以加上－q选项：<br />
[root@localhost diff]# diff hello.c hello_diff.c -q<br />
Files hello.c and hello_diff.c differ<br />
[root@localhost diff]# 另外你还可以提供一些匹配规则来忽略某中差别，可以用 -I regexp</p>
<p>[root@localhost diff]# diff hello.c hello_diff.c -c -I include<br />
*** hello.c     2007-09-25 17:54:51.000000000 +0800<br />
&#8212; hello_diff.c        2007-09-25 17:56:00.000000000 +0800<br />
***************<br />
*** 2,11 ****</p>
<p>int main(void)<br />
{<br />
!       char msg[] = “Hello world!”;</p>
<p>        puts(msg);<br />
!       printf(“Welcome to use diff commond.\n”);</p>
<p>        return 0;<br />
}<br />
&#8212; 3,12 &#8212;-</p>
<p>int main(void)<br />
{<br />
!       char msg[] = “Hello world,fome hello_diff.c”;</p>
<p>        puts(msg);<br />
!       printf(“hello_diff.c says,&#8217;Here you are,using diff.&#8217;\n”);</p>
<p>        return 0;<br />
}<br />
[root@localhost diff]#</p>
<p>这里通过“ -I include”选项来忽略带有“ include”字样的行</p>
]]></content:encoded>
			<wfw:commentRss>http://www.libaqiang.com/blog/?feed=rss2&#038;p=78197</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysql添加用户的两种方法</title>
		<link>http://www.libaqiang.com/blog/?p=78195</link>
		<comments>http://www.libaqiang.com/blog/?p=78195#comments</comments>
		<pubDate>Wed, 25 Apr 2012 04:30:30 +0000</pubDate>
		<dc:creator>cgha1984</dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.libaqiang.com/blog/?p=78195</guid>
		<description><![CDATA[1、grant语句
mysql>GRANT ALL PRIVILEGES ON *.* TO monty@localhost IDENTIFIED BY 'password' WITH GRANT OPTION;
mysql>GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON *.* TO custom@192.168.206.% IDENTIFIED BY 'password';
2、sql语句
mysql>INSERT INTO user (host,user,password) VALUES('192.168.206.%','high_vod',PASSWORD('high_vod'));
mysql>INSERT INTO db VALUES('192.168.206.%','high_vod','high_vod','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql>FLUSH PRIVILEGES;<p class="read-more"><a href="http://www.libaqiang.com/blog/?p=78195">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>1、grant语句<br />
mysql>GRANT ALL PRIVILEGES ON *.* TO monty@localhost IDENTIFIED BY &#8216;password&#8217; WITH GRANT OPTION;<br />
mysql>GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON *.* TO custom@192.168.206.% IDENTIFIED BY &#8216;password&#8217;;<br />
2、sql语句<br />
mysql>INSERT INTO user (host,user,password) VALUES(&#8217;192.168.206.%&#8217;,'high_vod&#8217;,PASSWORD(&#8216;high_vod&#8217;));<br />
mysql>INSERT INTO db VALUES(&#8217;192.168.206.%&#8217;,'high_vod&#8217;,'high_vod&#8217;,'Y&#8217;,'Y&#8217;,'Y&#8217;,'Y&#8217;,'Y&#8217;,'Y&#8217;,'N&#8217;,'Y&#8217;,'Y&#8217;,'Y&#8217;,'Y&#8217;,'Y&#8217;,'Y&#8217;,'Y&#8217;,'Y&#8217;,'Y&#8217;,'Y&#8217;,'Y&#8217;,'Y&#8217;);<br />
mysql>FLUSH PRIVILEGES;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.libaqiang.com/blog/?feed=rss2&#038;p=78195</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用spawn-fcgi管理运行php-cgi</title>
		<link>http://www.libaqiang.com/blog/?p=78193</link>
		<comments>http://www.libaqiang.com/blog/?p=78193#comments</comments>
		<pubDate>Tue, 24 Apr 2012 06:24:08 +0000</pubDate>
		<dc:creator>cgha1984</dc:creator>
				<category><![CDATA[debian]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[spawn]]></category>

		<guid isPermaLink="false">http://www.libaqiang.com/blog/?p=78193</guid>
		<description><![CDATA[1. 下载spawn-fcgi 二进制可执行程序，可以单独下载包（网上找）
    ubuntu下直接用sudo apt-get install spawn-fcgi

2. 安装php
    apt-get install php5-cgi php5-mysql php5-common php5-gd php5-curl php5-xcache php5-memcached php5-mcrypt php5-cli
    也可以单独下载安装，注意包依赖

3. 安装nginx
apt-get install nginx

4. php启动脚本， man spawn-fcgi 查看参数意思
   有两种：
   1） /usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 2222 -u ${user} -g ${group} -f /usr/bin/php5-cgi -C 128

        指定ip地域、端口号
        而对应nginx 运行php配置为：
        fastcgi_pass   127.0.0.1:2222;

    2） /usr/local/bin/spawn-fcgi -u ${user} -g ${group} -s /tmp/php.sock -f /usr/bin/php5-cgi -P ${pidpath} 1>/dev/null
        指定sock文件、进程号。这个会很好地利于编写重启脚本。
        而对应nginx 运行php配置为：
        fastcgi_pass    unix:/tmp/php.sock;
    3）当spawn-fcgi开启两个端口，利用nginx的upstream负载均衡php程序到不同的fcgi端口上面时，则这样设置：
         nginx 负载均衡配置

     upstream   spawn {
       # ip_hash;
         server 127.0.0.1:9000 max_fails=0 fail_timeout=30s;
         server 127.0.0.1:9001 max_fails=0 fail_timeout=30s;
       }

       而对应nginx 运行php配置为：
       fastcgi_pass spaw;

附带运行php脚本：

1.
#!/bin/bash
PHP_SCRIPT="/usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 2222 -u www-data -g www-data -f /usr/bin/php5-cgi -C 128"
FASTCGI_USER=www-data
RETVAL=0
case "$1" in
    start)
      su - $FASTCGI_USER -c "$PHP_SCRIPT"
      RETVAL=$?
  ;;
    stop)
      killall -9 php5-cgi
      RETVAL=$?
  ;;
    restart)
      killall -9 php5-cgi
      su - $FASTCGI_USER -c "$PHP_SCRIPT"
      RETVAL=$?
  ;;
    *)
      echo "Usage: php {start&#124;stop&#124;restart}"
      exit 1
  ;;
esac
exit $RETVAL

 

2.

#! /bin/bash
pidpath="/tmp/spawn_php.pid"
user="daemon"
group="daemon"
phpcgi="/usr/local/php/bin/php-cgi"
PHP_FCGI_CHILDREN=50
PHP_FCGI_MAX_REQUESTS=50000

echo_ok ()
{
        echo -ne "/033[33C ["
        echo -ne "/033[32m"
        echo -ne "/033[1C OK"
        echo -ne "/033[39m"
        echo -ne "/033[1C ]/n"
}

start_spawn()
{
        env - PHP_FCGI_CHILDREN=${PHP_FCGI_CHILDREN} PHP_FCGI_MAX_REQUESTS=${PHP_FCGI_MAX_REQUESTS} /usr/local/bin/spawn-fcgi -u ${user} -g ${group} -s /tmp/php.sock -f ${phpcgi} -P ${pidpath} 1>/dev/null
        echo -ne "php-cgi start successfull"
        echo_ok
}


case "$1" in
start)
        if [ ! -f $pidpath ]
        then
                start_spawn
        else
                pidcount=`ps -ef &#124;grep ${phpcgi}&#124;wc -l`
                if [ "$pidcount" -gt "1" ]
                then
                        echo -ne "php  already  running  "
                        echo_ok
                else
                        rm -f $pidpath
                        rm -f /tmp/php.sock
                        start_spawn
                fi
        fi
        ;;
stop)
        pid=`cat ${pidpath} 2>/dev/null`
        kill ${pid} 2>/dev/null
        rm -f ${pidpath} 2>/dev/null
        rm -f /tmp/php.sock 2>/dev/null
        echo -ne "php-cgi  stop successfull"
        echo_ok
        ;;
restart)
        pid=`cat ${pidpath} 2>/dev/null`
        kill ${pid} 2>/dev/null
        rm -f ${pidpath} 2>/dev/null
        rm -f /tmp/php.sock 2>/dev/null
        echo -ne "php-cgi  stop successfull"
        echo_ok

        if [ ! -f $pidpath ]
        then
                start_spawn
        else
                pidcount=`ps -ef &#124;grep ${phpcgi}&#124;wc -l`
                if [ "$pidcount" -gt "1" ]
                then
                        echo -ne "php  already  running  "
                        echo_ok
                else
                        rm -f $pidpath
                        rm -f /tmp/php.sock
                        start_spawn
                fi
        fi
        ;;
*)
echo "Usage: $0 {start&#124;stop&#124;restart}"
        exit 1
esac
exit<p class="read-more"><a href="http://www.libaqiang.com/blog/?p=78193">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>1. 下载spawn-fcgi 二进制可执行程序，可以单独下载包（网上找）<br />
    ubuntu下直接用sudo apt-get install spawn-fcgi</p>
<p>2. 安装php<br />
    apt-get install php5-cgi php5-mysql php5-common php5-gd php5-curl php5-xcache php5-memcached php5-mcrypt php5-cli<br />
    也可以单独下载安装，注意包依赖</p>
<p>3. 安装nginx<br />
apt-get install nginx</p>
<p>4. php启动脚本， man spawn-fcgi 查看参数意思<br />
   有两种：<br />
   1） /usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 2222 -u ${user} -g ${group} -f /usr/bin/php5-cgi -C 128</p>
<p>        指定ip地域、端口号<br />
        而对应nginx 运行php配置为：<br />
        fastcgi_pass   127.0.0.1:2222;</p>
<p>    2） /usr/local/bin/spawn-fcgi -u ${user} -g ${group} -s /tmp/php.sock -f /usr/bin/php5-cgi -P ${pidpath} 1>/dev/null<br />
        指定sock文件、进程号。这个会很好地利于编写重启脚本。<br />
        而对应nginx 运行php配置为：<br />
        fastcgi_pass    unix:/tmp/php.sock;<br />
    3）当spawn-fcgi开启两个端口，利用nginx的upstream负载均衡php程序到不同的fcgi端口上面时，则这样设置：<br />
         nginx 负载均衡配置</p>
<p>     upstream   spawn {<br />
       # ip_hash;<br />
         server 127.0.0.1:9000 max_fails=0 fail_timeout=30s;<br />
         server 127.0.0.1:9001 max_fails=0 fail_timeout=30s;<br />
       }</p>
<p>       而对应nginx 运行php配置为：<br />
       fastcgi_pass spaw;</p>
<p>附带运行php脚本：</p>
<p>1.<br />
#!/bin/bash<br />
PHP_SCRIPT=”/usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 2222 -u www-data -g www-data -f /usr/bin/php5-cgi -C 128&#8243;<br />
FASTCGI_USER=www-data<br />
RETVAL=0<br />
case “$1&#8243; in<br />
    start)<br />
      su &#8211; $FASTCGI_USER -c “$PHP_SCRIPT”<br />
      RETVAL=$?<br />
  ;;<br />
    stop)<br />
      killall -9 php5-cgi<br />
      RETVAL=$?<br />
  ;;<br />
    restart)<br />
      killall -9 php5-cgi<br />
      su &#8211; $FASTCGI_USER -c “$PHP_SCRIPT”<br />
      RETVAL=$?<br />
  ;;<br />
    *)<br />
      echo “Usage: php {start|stop|restart}”<br />
      exit 1<br />
  ;;<br />
esac<br />
exit $RETVAL</p>
<p>2.</p>
<p>#! /bin/bash<br />
pidpath=”/tmp/spawn_php.pid”<br />
user=”daemon”<br />
group=”daemon”<br />
phpcgi=”/usr/local/php/bin/php-cgi”<br />
PHP_FCGI_CHILDREN=50<br />
PHP_FCGI_MAX_REQUESTS=50000</p>
<p>echo_ok ()<br />
{<br />
        echo -ne “/033[33C ["<br />
        echo -ne "/033[32m"<br />
        echo -ne "/033[1C OK"<br />
        echo -ne "/033[39m"<br />
        echo -ne "/033[1C ]/n”<br />
}</p>
<p>start_spawn()<br />
{<br />
        env &#8211; PHP_FCGI_CHILDREN=${PHP_FCGI_CHILDREN} PHP_FCGI_MAX_REQUESTS=${PHP_FCGI_MAX_REQUESTS} /usr/local/bin/spawn-fcgi -u ${user} -g ${group} -s /tmp/php.sock -f ${phpcgi} -P ${pidpath} 1>/dev/null<br />
        echo -ne “php-cgi start successfull”<br />
        echo_ok<br />
}</p>
<p>case “$1&#8243; in<br />
start)<br />
        if [ ! -f $pidpath ]<br />
        then<br />
                start_spawn<br />
        else<br />
                pidcount=`ps -ef |grep ${phpcgi}|wc -l`<br />
                if [ "$pidcount" -gt "1" ]<br />
                then<br />
                        echo -ne “php  already  running  ”<br />
                        echo_ok<br />
                else<br />
                        rm -f $pidpath<br />
                        rm -f /tmp/php.sock<br />
                        start_spawn<br />
                fi<br />
        fi<br />
        ;;<br />
stop)<br />
        pid=`cat ${pidpath} 2>/dev/null`<br />
        kill ${pid} 2>/dev/null<br />
        rm -f ${pidpath} 2>/dev/null<br />
        rm -f /tmp/php.sock 2>/dev/null<br />
        echo -ne “php-cgi  stop successfull”<br />
        echo_ok<br />
        ;;<br />
restart)<br />
        pid=`cat ${pidpath} 2>/dev/null`<br />
        kill ${pid} 2>/dev/null<br />
        rm -f ${pidpath} 2>/dev/null<br />
        rm -f /tmp/php.sock 2>/dev/null<br />
        echo -ne “php-cgi  stop successfull”<br />
        echo_ok</p>
<p>        if [ ! -f $pidpath ]<br />
        then<br />
                start_spawn<br />
        else<br />
                pidcount=`ps -ef |grep ${phpcgi}|wc -l`<br />
                if [ "$pidcount" -gt "1" ]<br />
                then<br />
                        echo -ne “php  already  running  ”<br />
                        echo_ok<br />
                else<br />
                        rm -f $pidpath<br />
                        rm -f /tmp/php.sock<br />
                        start_spawn<br />
                fi<br />
        fi<br />
        ;;<br />
*)<br />
echo “Usage: $0 {start|stop|restart}”<br />
        exit 1<br />
esac<br />
exit</p>
]]></content:encoded>
			<wfw:commentRss>http://www.libaqiang.com/blog/?feed=rss2&#038;p=78193</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>debian中文支持的配置</title>
		<link>http://www.libaqiang.com/blog/?p=78191</link>
		<comments>http://www.libaqiang.com/blog/?p=78191#comments</comments>
		<pubDate>Mon, 23 Apr 2012 08:13:46 +0000</pubDate>
		<dc:creator>cgha1984</dc:creator>
				<category><![CDATA[debian]]></category>
		<category><![CDATA[中文]]></category>

		<guid isPermaLink="false">http://www.libaqiang.com/blog/?p=78191</guid>
		<description><![CDATA[debian的安装分为英文或者中文等，建议安装英文版，然后安装语系（locale），然后安装中文字体。
1.第一步，产生语系（locale）
如果没有安装locales的请安装locales：
代码:
#apt-get install locales若已经安装了locales，就重新设定语系：
代码:
#dpkg-reconfigure locales选择生成下列语系的数据：
代码:
en_US.ISO-8859-1
en_US.UTF-8
zh_CN.GB2312
zh_CN.UTF-8
zh_CN.GBK
zh_TW.BIG5
zh_TW.UTF-8
再将默认locale选择为“C”。然后用“locale -a”来查看现在系统中所有支持的语系，
代码:
#locale -a
C
POSIX
en_US.ISO-8859-1
en_US.UTF-8
zh_CN.GB2312
zh_CN.UTF-8
zh_CN.GBK
zh_TW.BIG5
zh_TW.UTF-8
用“locale”查看当前所使用的语系。
代码:
#locale
LANG=C
LC_ALL=POSIX
LC_CTYPE=POSIX
...在产生了语系后，最好是重新启动系统。或者也可以重新登陆一次。
2.安装字体
linux中最常用的中文字体是文鼎的四套中文字体：
ttf-arphic-bkai00mp（文鼎PL中楷AR PL KaitiMBig5,包含BIG5中13000个繁体字）,
ttf-arphic-gbsn00lp（文鼎PL简报宋AR PL SungtiLGB，包含GB2312中7000多个简体），
ttf-arphic-bsmi00lp（文鼎PL细上海宋AR PL Mingti2L Big5）
以及ttf-arphic-gkai00mp（文鼎PL KaitiMGB，包含GB2312中7000多个简体字）。
这些字体可以直接通过apt来安装。
代码:
#apt-get install ttf-arphic-bkai00mp tf-arphic-gbsn00lp ttf-arphic-bsmi00lp
ttf-arphic-gkai00mp

但是由于中文字体笔画繁多，矢量字体加上Anti-Alias在细尺寸时反而显得模糊不清。这里我推荐使用台湾萤火虫（firefly）合并衬线后的新字体——文鼎PL新宋。
在/etc/apt/sources.list中加上新宋字体的apt仓库源：
代码:
deb ftp://debian.linux.org.tw/pub/apt unstable main
或者 deb ftp://ftp.hk.debian.org/unoffical/dlot-apt unstable main
然后更新apt repositories数据，就可以安装firefly的字体了。
代码:
#apt-get update
#apt-get install ttf-fireflysung为了避免造成不必要的麻烦，强烈建议首先安装fireflysung这个字体！！
接着就是安装文鼎的四个字体。

自由字体中英文字体效果比较好的有Bitstream Vera Sans字体和DejaVu字体。特别是这个DejaVu字体是fundawang提及的将在Mandrake中采用的英文字体，我在gentoo和debian中测试效果都好于Bitstream Vera字体，故推荐使用。
代码:
#apt-get install ttf-bitstream-vera ttf-dejavu

为了提高对微软平台的兼容程度,我也建议安装msttcorefonts这一套微软的英文字体。这套字体包含了AndalMono、ArialBlack、Arial、ComicSansMS、Georgia、Impact、TimesNew Roman、Times、Trebuchet、Verdana和Webdings等11种字体。
代码:
#apt-get install msttcorefonts<p class="read-more"><a href="http://www.libaqiang.com/blog/?p=78191">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>debian的安装分为英文或者中文等，建议安装英文版，然后安装语系（locale），然后安装中文字体。<br />
1.第一步，产生语系（locale）<br />
如果没有安装locales的请安装locales：<br />
代码:<br />
#apt-get install locales若已经安装了locales，就重新设定语系：<br />
代码:<br />
#dpkg-reconfigure locales选择生成下列语系的数据：<br />
代码:<br />
en_US.ISO-8859-1<br />
en_US.UTF-8<br />
zh_CN.GB2312<br />
zh_CN.UTF-8<br />
zh_CN.GBK<br />
zh_TW.BIG5<br />
zh_TW.UTF-8<br />
再将默认locale选择为“C”。然后用“locale -a”来查看现在系统中所有支持的语系，<br />
代码:<br />
#locale -a<br />
C<br />
POSIX<br />
en_US.ISO-8859-1<br />
en_US.UTF-8<br />
zh_CN.GB2312<br />
zh_CN.UTF-8<br />
zh_CN.GBK<br />
zh_TW.BIG5<br />
zh_TW.UTF-8<br />
用“locale”查看当前所使用的语系。<br />
代码:<br />
#locale<br />
LANG=C<br />
LC_ALL=POSIX<br />
LC_CTYPE=POSIX<br />
&#8230;在产生了语系后，最好是重新启动系统。或者也可以重新登陆一次。<br />
2.安装字体<br />
linux中最常用的中文字体是文鼎的四套中文字体：<br />
ttf-arphic-bkai00mp（文鼎PL中楷AR PL KaitiMBig5,包含BIG5中13000个繁体字）,<br />
ttf-arphic-gbsn00lp（文鼎PL简报宋AR PL SungtiLGB，包含GB2312中7000多个简体），<br />
ttf-arphic-bsmi00lp（文鼎PL细上海宋AR PL Mingti2L Big5）<br />
以及ttf-arphic-gkai00mp（文鼎PL KaitiMGB，包含GB2312中7000多个简体字）。<br />
这些字体可以直接通过apt来安装。<br />
代码:<br />
#apt-get install ttf-arphic-bkai00mp tf-arphic-gbsn00lp ttf-arphic-bsmi00lp<br />
ttf-arphic-gkai00mp</p>
<p>但是由于中文字体笔画繁多，矢量字体加上Anti-Alias在细尺寸时反而显得模糊不清。这里我推荐使用台湾萤火虫（firefly）合并衬线后的新字体——文鼎PL新宋。<br />
在/etc/apt/sources.list中加上新宋字体的apt仓库源：<br />
代码:<br />
deb ftp://debian.linux.org.tw/pub/apt unstable main<br />
或者 deb ftp://ftp.hk.debian.org/unoffical/dlot-apt unstable main<br />
然后更新apt repositories数据，就可以安装firefly的字体了。<br />
代码:<br />
#apt-get update<br />
#apt-get install ttf-fireflysung为了避免造成不必要的麻烦，强烈建议首先安装fireflysung这个字体！！<br />
接着就是安装文鼎的四个字体。</p>
<p>自由字体中英文字体效果比较好的有Bitstream Vera Sans字体和DejaVu字体。特别是这个DejaVu字体是fundawang提及的将在Mandrake中采用的英文字体，我在gentoo和debian中测试效果都好于Bitstream Vera字体，故推荐使用。<br />
代码:<br />
#apt-get install ttf-bitstream-vera ttf-dejavu</p>
<p>为了提高对微软平台的兼容程度,我也建议安装msttcorefonts这一套微软的英文字体。这套字体包含了AndalMono、ArialBlack、Arial、ComicSansMS、Georgia、Impact、TimesNew Roman、Times、Trebuchet、Verdana和Webdings等11种字体。<br />
代码:<br />
#apt-get install msttcorefonts</p>
]]></content:encoded>
			<wfw:commentRss>http://www.libaqiang.com/blog/?feed=rss2&#038;p=78191</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>debian安装中文字体verdana和tahoma</title>
		<link>http://www.libaqiang.com/blog/?p=78189</link>
		<comments>http://www.libaqiang.com/blog/?p=78189#comments</comments>
		<pubDate>Mon, 23 Apr 2012 03:38:32 +0000</pubDate>
		<dc:creator>cgha1984</dc:creator>
				<category><![CDATA[debian]]></category>
		<category><![CDATA[字体]]></category>

		<guid isPermaLink="false">http://www.libaqiang.com/blog/?p=78189</guid>
		<description><![CDATA[拷贝Windows下的字体:
simfang.ttf 仿宋体
simhei.ttf 黑体
simkai.ttf 楷体
simsun.ttf 宋体和新宋体，原文件名simsun.ttc
tahoma.ttf tahoma字体
tahomabd.ttf tahoma字体的粗体形式
verdana.ttf verdana字体
verdanab.ttf verdana字体的粗体形式
verdanai.ttf verdana字体的斜体形式
verdanaz.ttf verdana字体的粗体＋斜体形式

譬如到/home/rob/tools/fonts

cd /usr/share/fonts
ln -s /home/rob/tools/fonts xpfonts
cd xpfonts
mkfontscale
mkfontdir

这样作和把字体拷贝到/usr/share/fonts的一个目录下的效果是一样的。后面的两个mkfont命令是生成xpfonts目录下所包含的字体的索引信息。然后运行fc-cache命令更新字体缓存：

fc-cache

DONE。<p class="read-more"><a href="http://www.libaqiang.com/blog/?p=78189">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>拷贝Windows下的字体:<br />
simfang.ttf 仿宋体<br />
simhei.ttf 黑体<br />
simkai.ttf 楷体<br />
simsun.ttf 宋体和新宋体，原文件名simsun.ttc<br />
tahoma.ttf tahoma字体<br />
tahomabd.ttf tahoma字体的粗体形式<br />
verdana.ttf verdana字体<br />
verdanab.ttf verdana字体的粗体形式<br />
verdanai.ttf verdana字体的斜体形式<br />
verdanaz.ttf verdana字体的粗体＋斜体形式</p>
<p>譬如到/home/rob/tools/fonts</p>
<p>cd /usr/share/fonts<br />
ln -s /home/rob/tools/fonts xpfonts<br />
cd xpfonts<br />
mkfontscale<br />
mkfontdir</p>
<p>这样作和把字体拷贝到/usr/share/fonts的一个目录下的效果是一样的。后面的两个mkfont命令是生成xpfonts目录下所包含的字体的索引信息。然后运行fc-cache命令更新字体缓存：</p>
<p>fc-cache</p>
<p>DONE。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.libaqiang.com/blog/?feed=rss2&#038;p=78189</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>为nginx添加防盗链模块支持secure_download</title>
		<link>http://www.libaqiang.com/blog/?p=78186</link>
		<comments>http://www.libaqiang.com/blog/?p=78186#comments</comments>
		<pubDate>Fri, 20 Apr 2012 02:56:06 +0000</pubDate>
		<dc:creator>cgha1984</dc:creator>
				<category><![CDATA[debian]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[防盗链]]></category>

		<guid isPermaLink="false">http://www.libaqiang.com/blog/?p=78186</guid>
		<description><![CDATA[下面我们来进行安装防盗链模块
首先下载模块
你可以在官方网站上找到下载链接，官方网站地址http://wiki.nginx.org/3rdPartyModules
或者
wget https://github.com/replay/ngx_http_secure_download/zipball/master
tar -zxvf PATH

编译时要先拿到上次nginx编译的配置参数，以防止过多的改动。
nginx -v #查看nginx版本
nginx -V #查看编译配置参数

然后添加配置
--add-module=../replay-ngx_http_secure_download-8ddc19d
重新编译安装：
sudo make &#038;& sudo make install

secure_download的编译需要mhash模块
apt-get install libmhash-dev

服务器配置实例：
location ~ .*\.mp4${
mp4;
secure_download on;
secure_download_secret kinsv$remote_addr;
secure_download_path_mode file;
}

详细使用方法，请仔细阅读官方说明<p class="read-more"><a href="http://www.libaqiang.com/blog/?p=78186">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>下面我们来进行安装防盗链模块<br />
首先下载模块<br />
你可以在官方网站上找到下载链接，官方网站地址http://wiki.nginx.org/3rdPartyModules<br />
或者<br />
wget https://github.com/replay/ngx_http_secure_download/zipball/master<br />
tar -zxvf PATH</p>
<p>编译时要先拿到上次nginx编译的配置参数，以防止过多的改动。<br />
nginx -v #查看nginx版本<br />
nginx -V #查看编译配置参数</p>
<p>然后添加配置<br />
&#8211;add-module=../replay-ngx_http_secure_download-8ddc19d<br />
重新编译安装：<br />
sudo make &#038;&#038; sudo make install</p>
<p>secure_download的编译需要mhash模块<br />
apt-get install libmhash-dev</p>
<p>服务器配置实例：<br />
location ~ .*\.mp4${<br />
mp4;<br />
secure_download on;<br />
secure_download_secret kinsv$remote_addr;<br />
secure_download_path_mode file;<br />
}</p>
<p>详细使用方法，请仔细阅读官方说明</p>
]]></content:encoded>
			<wfw:commentRss>http://www.libaqiang.com/blog/?feed=rss2&#038;p=78186</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

