<?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>waimv.com &#187; Linux</title>
	<atom:link href="http://www.waimv.com/category/linux/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.waimv.com</link>
	<description></description>
	<lastBuildDate>Fri, 09 Nov 2018 10:41:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>ohana &#8211; 一个返回模拟 json 数据的 node http server</title>
		<link>http://www.waimv.com/linux/290/</link>
		<comments>http://www.waimv.com/linux/290/#comments</comments>
		<pubDate>Tue, 05 Apr 2016 09:21:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.szpian.com/?p=290</guid>
		<description><![CDATA[ohana &#8211; 一个返回模拟 json 数据的 node http server ohana 是一个返回模拟 json 数据的 node http 服务器，默认集成了 mockjs 生成动态的 json 数据，支持 POST, GET, PUT, DELETE 四种请求。 github: https://github.com/Allenice/ohana 特点： 使用 mockjs 生成 json 数据 支持路由规则 可跨域访问 安装 npm config set registry http://registry.cnpmjs.org npm install ohana 使用 var Server = require(&#8220;ohana&#8221;); var server = new Server(); server.get(&#8216;/article/&#8217;, { [...]]]></description>
			<content:encoded><![CDATA[<div id="_mcePaste">ohana &#8211; 一个返回模拟 json 数据的 node http server</div>
<div id="_mcePaste">ohana 是一个返回模拟 json 数据的 node http 服务器，默认集成了 mockjs 生成动态的 json 数据，支持 POST, GET, PUT, DELETE 四种请求。</div>
<div id="_mcePaste">github: https://github.com/Allenice/ohana</div>
<div id="_mcePaste">特点：</div>
<div id="_mcePaste">使用 mockjs 生成 json 数据</div>
<div id="_mcePaste">支持路由规则</div>
<div id="_mcePaste">可跨域访问</div>
<div id="_mcePaste">安装</div>
<div id="_mcePaste">npm config set registry http://registry.cnpmjs.org</div>
<div id="_mcePaste">npm install ohana</div>
<div id="_mcePaste">使用</div>
<div id="_mcePaste">var Server = require(&#8220;ohana&#8221;);</div>
<div id="_mcePaste">var server = new Server();</div>
<div id="_mcePaste">server.get(&#8216;/article/&#8217;, {</div>
<div id="_mcePaste">delay: 200,</div>
<div id="_mcePaste">data: function(params, query) {</div>
<div id="_mcePaste">console.log(params);</div>
<div id="_mcePaste">console.log(query);</div>
<div id="_mcePaste">return {</div>
<div id="_mcePaste">&#8220;status&#8221;: &#8220;ok&#8221;,</div>
<div id="_mcePaste">&#8220;total_count&#8221;: 100,</div>
<div id="_mcePaste">&#8220;data|10&#8243;: [</div>
<div id="_mcePaste">{</div>
<div id="_mcePaste">"id|1-10000": 1,</div>
<div id="_mcePaste">"title": "@TITLE(5, 7)",</div>
<div id="_mcePaste">"author": "@NAME",</div>
<div id="_mcePaste">"post_time": "@DATETIME('yyyy-MM-dd HH:mm:ss')",</div>
<div id="_mcePaste">"read_count|0-1000": 100</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">]</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">});</div>
<div id="_mcePaste">server.listen(3000);</div>
<div id="_mcePaste">API</div>
<div id="_mcePaste">server.get(path, options)</div>
<div id="_mcePaste">匹配 GET 方式的请求。</div>
<div id="_mcePaste">path: 路由匹配地址</div>
<div id="_mcePaste">options:</div>
<div id="_mcePaste">delay: 延迟多少毫秒后返回，</div>
<div id="_mcePaste">data: 返回的数据，可以接受对象和方法, 方法中的参数 params 是路由匹配的参数，query 是提交或查询的参数。</div>
<div id="_mcePaste">server.post(path, options）</div>
<div id="_mcePaste">与 get 同理</div>
<div id="_mcePaste">server.delete(path, options)</div>
<div id="_mcePaste">与 get 同理</div>
<div id="_mcePaste">server.put(path, options)</div>
<div id="_mcePaste">与 get 同理</div>
<div id="_mcePaste">server.listen(port, host)</div>
<div id="_mcePaste">port: 服务器监听的网络端口</div>
<div id="_mcePaste">host： 主机</div>
<div id="_mcePaste">路由匹配规则：</div>
<div id="_mcePaste">Basic string:</div>
<div id="_mcePaste">&#8220;/articles&#8221; will only match routes that == &#8220;/articles&#8221;.</div>
<div id="_mcePaste">Named parameters:</div>
<div id="_mcePaste">&#8220;/articles/:title&#8221; will only match routes like &#8220;/articles/hello&#8221;, but *not* &#8220;/articles/&#8221;.</div>
<div id="_mcePaste">Optional named parameters:</div>
<div id="_mcePaste">&#8220;/articles/:title?&#8221; will match &#8220;/articles/hello&#8221; AND &#8220;/articles/&#8221;</div>
<div id="_mcePaste">Periods before optional parameters are also optional:</div>
<div id="_mcePaste">&#8220;/:n.:f?&#8221; will match &#8220;/1&#8243; and &#8220;/1.json&#8221;</div>
<div id="_mcePaste">Splaaaat! :</div>
<div id="_mcePaste">&#8220;/assets/*&#8221; will match &#8220;/assets/blah/blah/blah.png&#8221; and &#8220;/assets/&#8221;.</div>
<div id="_mcePaste">&#8220;/assets/*.*&#8221; will match &#8220;/assets/1/2/3.js&#8221; as splats: ["1/2/3", "js"]</div>
<div id="_mcePaste">Mix splat with named parameters:</div>
<div id="_mcePaste">&#8220;/account/:id/assets/*&#8221; will match &#8220;/account/2/assets/folder.png&#8221; as params: {id: 2}, splats:["folder.png"]</div>
<div id="_mcePaste">Named RegExp:</div>
<div id="_mcePaste">&#8220;/lang/:lang([a-z]{2})&#8221; will match &#8220;/lang/en&#8221; but not &#8220;/lang/12&#8243; or &#8220;/lang/eng&#8221;</div>
<div id="_mcePaste">Raw RegExp:</div>
<div id="_mcePaste">/^\/(\d{2,3}-\d{2,3}-\d{4})\.(\w*)$/ (note no quotes, this is a RegExp, not a string.) will match &#8220;/123-22-1234.json&#8221;. Each match group will be an entry in splats: ["123-22-1234", "json"]</div>
<div id="_mcePaste">参考： https://github.com/aaronblohowiak/routes.js</div>
<div id="_mcePaste">数据生成</div>
<div id="_mcePaste">ohana 默认集成了 mockjs，你可以使用 mockjs 生成 json 数据。当然你也可以使用其他的生成工具。</div>
<div id="_mcePaste">参考文档： http://mockjs.com/editor.html#help</div>
<p>ohana &#8211; 一个返回模拟 json 数据的 node http server<br />
ohana 是一个返回模拟 json 数据的 node http 服务器，默认集成了 mockjs 生成动态的 json 数据，支持 POST, GET, PUT, DELETE 四种请求。<br />
github: https://github.com/Allenice/ohana<br />
特点：<br />
使用 mockjs 生成 json 数据支持路由规则可跨域访问安装<br />
npm config set registry http://registry.cnpmjs.orgnpm install ohana使用<br />
var Server = require(&#8220;ohana&#8221;);var server = new Server();server.get(&#8216;/article/&#8217;, {  delay: 200,  data: function(params, query) {    console.log(params);    console.log(query);    return {      &#8220;status&#8221;: &#8220;ok&#8221;,      &#8220;total_count&#8221;: 100,      &#8220;data|10&#8243;: [        {          "id|1-10000": 1,          "title": "@TITLE(5, 7)",          "author": "@NAME",          "post_time": "@DATETIME('yyyy-MM-dd HH:mm:ss')",          "read_count|0-1000": 100        }      ]    }  }});server.listen(3000);API<br />
server.get(path, options)<br />
匹配 GET 方式的请求。<br />
path: 路由匹配地址options:delay: 延迟多少毫秒后返回，data: 返回的数据，可以接受对象和方法, 方法中的参数 params 是路由匹配的参数，query 是提交或查询的参数。server.post(path, options）<br />
与 get 同理<br />
server.delete(path, options)<br />
与 get 同理<br />
server.put(path, options)<br />
与 get 同理<br />
server.listen(port, host)<br />
port: 服务器监听的网络端口host： 主机路由匹配规则：<br />
Basic string:<br />
&#8220;/articles&#8221; will only match routes that == &#8220;/articles&#8221;.Named parameters:<br />
&#8220;/articles/:title&#8221; will only match routes like &#8220;/articles/hello&#8221;, but *not* &#8220;/articles/&#8221;.Optional named parameters:<br />
&#8220;/articles/:title?&#8221; will match &#8220;/articles/hello&#8221; AND &#8220;/articles/&#8221;Periods before optional parameters are also optional:<br />
&#8220;/:n.:f?&#8221; will match &#8220;/1&#8243; and &#8220;/1.json&#8221;Splaaaat! :<br />
&#8220;/assets/*&#8221; will match &#8220;/assets/blah/blah/blah.png&#8221; and &#8220;/assets/&#8221;.<br />
&#8220;/assets/*.*&#8221; will match &#8220;/assets/1/2/3.js&#8221; as splats: ["1/2/3", "js"]Mix splat with named parameters:<br />
&#8220;/account/:id/assets/*&#8221; will match &#8220;/account/2/assets/folder.png&#8221; as params: {id: 2}, splats:["folder.png"]Named RegExp:<br />
&#8220;/lang/:lang([a-z]{2})&#8221; will match &#8220;/lang/en&#8221; but not &#8220;/lang/12&#8243; or &#8220;/lang/eng&#8221;Raw RegExp:<br />
/^\/(\d{2,3}-\d{2,3}-\d{4})\.(\w*)$/ (note no quotes, this is a RegExp, not a string.) will match &#8220;/123-22-1234.json&#8221;. Each match group will be an entry in splats: ["123-22-1234", "json"]参考： https://github.com/aaronblohowiak/routes.js<br />
数据生成<br />
ohana 默认集成了 mockjs，你可以使用 mockjs 生成 json 数据。当然你也可以使用其他的生成工具。参考文档： http://mockjs.com/editor.html#help</p>
]]></content:encoded>
			<wfw:commentRss>http://www.waimv.com/linux/290/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>nginx php mysql 需要安装的扩展包</title>
		<link>http://www.waimv.com/linux/267/</link>
		<comments>http://www.waimv.com/linux/267/#comments</comments>
		<pubDate>Mon, 25 Mar 2013 06:42:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mysql]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.szpian.com/?p=267</guid>
		<description><![CDATA[129  yum install gcc 134  yum install ncurses 135  yum install glibc-headers 136  yum install gcc-c++ 142  yum -y install libxml2 libxml2-devel 143  yum install curl curl-devel 144  yum install openssl openssl-devel 145  yum install bzip2 bzip2-devel 146  yum install libjpeg libjpeg-devel 147  yum install libpng libpng-devel 148  yum install freetype-devel 149  yum install gmp-devel [...]]]></description>
			<content:encoded><![CDATA[<div id="_mcePaste">129  yum install gcc</div>
<div id="_mcePaste">134  yum install ncurses</div>
<div id="_mcePaste">135  yum install glibc-headers</div>
<div id="_mcePaste">136  yum install gcc-c++</div>
<div id="_mcePaste">142  yum -y install libxml2 libxml2-devel</div>
<div id="_mcePaste">143  yum install curl curl-devel</div>
<div id="_mcePaste">144  yum install openssl openssl-devel</div>
<div id="_mcePaste">145  yum install bzip2 bzip2-devel</div>
<div id="_mcePaste">146  yum install libjpeg libjpeg-devel</div>
<div id="_mcePaste">147  yum install libpng libpng-devel</div>
<div id="_mcePaste">148  yum install freetype-devel</div>
<div id="_mcePaste">149  yum install gmp-devel</div>
<div id="_mcePaste">150  yum install libmcrypt libmcrypt-devel</div>
<div id="_mcePaste">163  yum -y install pcre pcre-devel</div>
]]></content:encoded>
			<wfw:commentRss>http://www.waimv.com/linux/267/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php-fpm configure</title>
		<link>http://www.waimv.com/linux/263/</link>
		<comments>http://www.waimv.com/linux/263/#comments</comments>
		<pubDate>Fri, 01 Feb 2013 04:08:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[php-fpm]]></category>

		<guid isPermaLink="false">http://www.szpian.com/?p=263</guid>
		<description><![CDATA[./configure &#8211;prefix=/usr/local/php &#8211;with-config-file-path=/usr/local/php/etc &#8211;enable-fpm &#8211;with-fpm-user=administrator &#8211;with-fpm-group=administrator &#8211;enable-safe-mode]]></description>
			<content:encoded><![CDATA[<p>./configure &#8211;prefix=/usr/local/php &#8211;with-config-file-path=/usr/local/php/etc &#8211;enable-fpm &#8211;with-fpm-user=administrator &#8211;with-fpm-group=administrator &#8211;enable-safe-mode</p>
]]></content:encoded>
			<wfw:commentRss>http://www.waimv.com/linux/263/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>url提取url</title>
		<link>http://www.waimv.com/linux/260/</link>
		<comments>http://www.waimv.com/linux/260/#comments</comments>
		<pubDate>Thu, 24 Jan 2013 08:01:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.szpian.com/?p=260</guid>
		<description><![CDATA[$reg = &#8220;&#8216;&#60;\s*a\s.*?href\s*=\s*([\"\'])?(?(1)(.*?)\\1&#124;([^\s\&#62;]+))[^&#62;]*&#62;?(.*?)&#8217;isx&#8221;;]]></description>
			<content:encoded><![CDATA[<p>$reg = &#8220;&#8216;&lt;\s*a\s.*?href\s*=\s*([\"\'])?(?(1)(.*?)\\1|([^\s\&gt;]+))[^&gt;]*&gt;?(.*?)&#8217;isx&#8221;;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.waimv.com/linux/260/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C语言实现的简单 Web 服务器</title>
		<link>http://www.waimv.com/linux/252/</link>
		<comments>http://www.waimv.com/linux/252/#comments</comments>
		<pubDate>Tue, 08 Jan 2013 06:45:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[webservice]]></category>

		<guid isPermaLink="false">http://www.szpian.com/?p=252</guid>
		<description><![CDATA[/* * WebServer.c * *  Created on: Nov 3, 2012 *      Author: pavithra * * A web server in C language using only the standard libraries. * The port number is passed as an argument. * */ #include &#60;stdio.h&#62; #include &#60;unistd.h&#62; #include &#60;stdlib.h&#62; #include &#60;string.h&#62; #include &#60;sys/types.h&#62; #include &#60;sys/socket.h&#62; #include &#60;netinet/in.h&#62; #include &#60;fcntl.h&#62; [...]]]></description>
			<content:encoded><![CDATA[<div id="_mcePaste">/*</div>
<div id="_mcePaste">* WebServer.c</div>
<div id="_mcePaste">*</div>
<div id="_mcePaste">*  Created on: Nov 3, 2012</div>
<div id="_mcePaste">*      Author: pavithra</div>
<div id="_mcePaste">*</div>
<div id="_mcePaste">* A web server in C language using only the standard libraries.</div>
<div id="_mcePaste">* The port number is passed as an argument.</div>
<div id="_mcePaste">*</div>
<div id="_mcePaste">*/</div>
<div id="_mcePaste">#include &lt;stdio.h&gt;</div>
<div id="_mcePaste">#include &lt;unistd.h&gt;</div>
<div id="_mcePaste">#include &lt;stdlib.h&gt;</div>
<div id="_mcePaste">#include &lt;string.h&gt;</div>
<div id="_mcePaste">#include &lt;sys/types.h&gt;</div>
<div id="_mcePaste">#include &lt;sys/socket.h&gt;</div>
<div id="_mcePaste">#include &lt;netinet/in.h&gt;</div>
<div id="_mcePaste">#include &lt;fcntl.h&gt;</div>
<div id="_mcePaste">#include &lt;errno.h&gt;</div>
<div id="_mcePaste">#define EOL &#8220;\r\n&#8221;</div>
<div id="_mcePaste">#define EOL_SIZE 2</div>
<div id="_mcePaste">typedef struct {</div>
<div id="_mcePaste">char *ext;</div>
<div id="_mcePaste">char *mediatype;</div>
<div id="_mcePaste">} extn;</div>
<div id="_mcePaste">//Possible media types</div>
<div id="_mcePaste">extn extensions[] ={</div>
<div id="_mcePaste">{&#8220;gif&#8221;, &#8220;image/gif&#8221; },</div>
<div id="_mcePaste">{&#8220;txt&#8221;, &#8220;text/plain&#8221; },</div>
<div id="_mcePaste">{&#8220;jpg&#8221;, &#8220;image/jpg&#8221; },</div>
<div id="_mcePaste">{&#8220;jpeg&#8221;,&#8221;image/jpeg&#8221;},</div>
<div id="_mcePaste">{&#8220;png&#8221;, &#8220;image/png&#8221; },</div>
<div id="_mcePaste">{&#8220;ico&#8221;, &#8220;image/ico&#8221; },</div>
<div id="_mcePaste">{&#8220;zip&#8221;, &#8220;image/zip&#8221; },</div>
<div id="_mcePaste">{&#8220;gz&#8221;,  &#8221;image/gz&#8221;  },</div>
<div id="_mcePaste">{&#8220;tar&#8221;, &#8220;image/tar&#8221; },</div>
<div id="_mcePaste">{&#8220;htm&#8221;, &#8220;text/html&#8221; },</div>
<div id="_mcePaste">{&#8220;html&#8221;,&#8221;text/html&#8221; },</div>
<div id="_mcePaste">{&#8220;php&#8221;, &#8220;text/html&#8221; },</div>
<div id="_mcePaste">{&#8220;pdf&#8221;,&#8221;application/pdf&#8221;},</div>
<div id="_mcePaste">{&#8220;zip&#8221;,&#8221;application/octet-stream&#8221;},</div>
<div id="_mcePaste">{&#8220;rar&#8221;,&#8221;application/octet-stream&#8221;},</div>
<div id="_mcePaste">{0,0} };</div>
<div id="_mcePaste">/*</div>
<div id="_mcePaste">A helper function</div>
<div id="_mcePaste">*/</div>
<div id="_mcePaste">void error(const char *msg) {</div>
<div id="_mcePaste">perror(msg);</div>
<div id="_mcePaste">exit(1);</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">/*</div>
<div id="_mcePaste">A helper function</div>
<div id="_mcePaste">*/</div>
<div id="_mcePaste">int get_file_size(int fd) {</div>
<div id="_mcePaste">struct stat stat_struct;</div>
<div id="_mcePaste">if (fstat(fd, &amp;stat_struct) == -1)</div>
<div id="_mcePaste">return (1);</div>
<div id="_mcePaste">return (int) stat_struct.st_size;</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">/*</div>
<div id="_mcePaste">A helper function</div>
<div id="_mcePaste">*/</div>
<div id="_mcePaste">void send_new(int fd, char *msg) {</div>
<div id="_mcePaste">int len = strlen(msg);</div>
<div id="_mcePaste">if (send(fd, msg, len, 0) == -1) {</div>
<div id="_mcePaste">printf(&#8220;Error in send\n&#8221;);</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">/*</div>
<div id="_mcePaste">This function recieves the buffer</div>
<div id="_mcePaste">until an &#8220;End of line(EOL)&#8221; byte is recieved</div>
<div id="_mcePaste">*/</div>
<div id="_mcePaste">int recv_new(int fd, char *buffer) {</div>
<div id="_mcePaste">char *p = buffer; // Use of a pointer to the buffer rather than dealing with the buffer directly</div>
<div id="_mcePaste">int eol_matched = 0; // Use to check whether the recieved byte is matched with the buffer byte or not</div>
<div id="_mcePaste">while (recv(fd, p, 1, 0) != 0) // Start receiving 1 byte at a time</div>
<div id="_mcePaste">{</div>
<div id="_mcePaste">if (*p == EOL[eol_matched]) // if the byte matches with the first eol byte that is &#8216;\r&#8217;</div>
<div id="_mcePaste">{</div>
<div id="_mcePaste">++eol_matched;</div>
<div id="_mcePaste">if (eol_matched == EOL_SIZE) // if both the bytes matches with the EOL</div>
<div id="_mcePaste">{</div>
<div id="_mcePaste">*(p + 1 &#8211; EOL_SIZE) = &#8216;\0&#8242;; // End the string</div>
<div id="_mcePaste">return (strlen(buffer)); // Return the bytes recieved</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">} else {</div>
<div id="_mcePaste">eol_matched = 0;</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">p++; // Increment the pointer to receive next byte</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">return (0);</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">/*</div>
<div id="_mcePaste">A helper function: Returns the</div>
<div id="_mcePaste">web root location.</div>
<div id="_mcePaste">*/</div>
<div id="_mcePaste">char* webroot() {</div>
<div id="_mcePaste">// open the file &#8220;conf&#8221; for reading</div>
<div id="_mcePaste">FILE *in = fopen(&#8220;conf&#8221;, &#8220;rt&#8221;);</div>
<div id="_mcePaste">// read the first line from the file</div>
<div id="_mcePaste">char buff[1000];</div>
<div id="_mcePaste">fgets(buff, 1000, in);</div>
<div id="_mcePaste">// close the stream</div>
<div id="_mcePaste">fclose(in);</div>
<div id="_mcePaste">char* nl_ptr = strrchr(buff, &#8216;\n&#8217;);</div>
<div id="_mcePaste">if (nl_ptr != NULL)</div>
<div id="_mcePaste">*nl_ptr = &#8216;\0&#8242;;</div>
<div id="_mcePaste">return strdup(buff);</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">/*</div>
<div id="_mcePaste">Handles php requests</div>
<div id="_mcePaste">*/</div>
<div id="_mcePaste">void php_cgi(char* script_path, int fd) {</div>
<div id="_mcePaste">send_new(fd, &#8220;HTTP/1.1 200 OK\n Server: Web Server in C\n Connection: close\n&#8221;);</div>
<div id="_mcePaste">dup2(fd, STDOUT_FILENO);</div>
<div id="_mcePaste">char script[500];</div>
<div id="_mcePaste">strcpy(script, &#8220;SCRIPT_FILENAME=&#8221;);</div>
<div id="_mcePaste">strcat(script, script_path);</div>
<div id="_mcePaste">putenv(&#8220;GATEWAY_INTERFACE=CGI/1.1&#8243;);</div>
<div id="_mcePaste">putenv(script);</div>
<div id="_mcePaste">putenv(&#8220;QUERY_STRING=&#8221;);</div>
<div id="_mcePaste">putenv(&#8220;REQUEST_METHOD=GET&#8221;);</div>
<div id="_mcePaste">putenv(&#8220;REDIRECT_STATUS=true&#8221;);</div>
<div id="_mcePaste">putenv(&#8220;SERVER_PROTOCOL=HTTP/1.1&#8243;);</div>
<div id="_mcePaste">putenv(&#8220;REMOTE_HOST=127.0.0.1&#8243;);</div>
<div id="_mcePaste">execl(&#8220;/usr/bin/php-cgi&#8221;, &#8220;php-cgi&#8221;, NULL);</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">/*</div>
<div id="_mcePaste">This function parses the HTTP requests,</div>
<div id="_mcePaste">arrange resource locations,</div>
<div id="_mcePaste">check for supported media types,</div>
<div id="_mcePaste">serves files in a web root,</div>
<div id="_mcePaste">sends the HTTP error codes.</div>
<div id="_mcePaste">*/</div>
<div id="_mcePaste">int connection(int fd) {</div>
<div id="_mcePaste">char request[500], resource[500], *ptr;</div>
<div id="_mcePaste">int fd1, length;</div>
<div id="_mcePaste">if (recv_new(fd, request) == 0) {</div>
<div id="_mcePaste">printf(&#8220;Recieve Failed\n&#8221;);</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">printf(&#8220;%s\n&#8221;, request);</div>
<div id="_mcePaste">// Check for a valid browser request</div>
<div id="_mcePaste">ptr = strstr(request, &#8221; HTTP/&#8221;);</div>
<div id="_mcePaste">if (ptr == NULL) {</div>
<div id="_mcePaste">printf(&#8220;NOT HTTP !\n&#8221;);</div>
<div id="_mcePaste">} else {</div>
<div id="_mcePaste">*ptr = 0;</div>
<div id="_mcePaste">ptr = NULL;</div>
<div id="_mcePaste">if (strncmp(request, &#8220;GET &#8220;, 4) == 0) {</div>
<div id="_mcePaste">ptr = request + 4;</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">if (ptr == NULL) {</div>
<div id="_mcePaste">printf(&#8220;Unknown Request ! \n&#8221;);</div>
<div id="_mcePaste">} else {</div>
<div id="_mcePaste">if (ptr[strlen(ptr) - 1] == &#8216;/&#8217;) {</div>
<div id="_mcePaste">strcat(ptr, &#8220;index.html&#8221;);</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">strcpy(resource, webroot());</div>
<div id="_mcePaste">strcat(resource, ptr);</div>
<div id="_mcePaste">char* s = strchr(ptr, &#8216;.&#8217;);</div>
<div id="_mcePaste">int i;</div>
<div id="_mcePaste">for (i = 0; extensions[i].ext != NULL; i++) {</div>
<div id="_mcePaste">if (strcmp(s + 1, extensions[i].ext) == 0) {</div>
<div id="_mcePaste">fd1 = open(resource, O_RDONLY, 0);</div>
<div id="_mcePaste">printf(&#8220;Opening \&#8221;%s\&#8221;\n&#8221;, resource);</div>
<div id="_mcePaste">if (fd1 == -1) {</div>
<div id="_mcePaste">printf(&#8220;404 File not found Error\n&#8221;);</div>
<div id="_mcePaste">send_new(fd, &#8220;HTTP/1.1 404 Not Found\r\n&#8221;);</div>
<div id="_mcePaste">send_new(fd, &#8220;Server : Web Server in C\r\n\r\n&#8221;);</div>
<div id="_mcePaste">send_new(fd, &#8220;&lt;html&gt;&lt;head&gt;&lt;title&gt;404 Not Found&lt;/head&gt;&lt;/title&gt;&#8221;);</div>
<div id="_mcePaste">send_new(fd, &#8220;&lt;body&gt;&lt;p&gt;404 Not Found: The requested resource could not be found!&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;&#8221;);</div>
<div id="_mcePaste">//Handling php requests</div>
<div id="_mcePaste">} else if (strcmp(extensions[i].ext, &#8220;php&#8221;) == 0) {</div>
<div id="_mcePaste">php_cgi(resource, fd);</div>
<div id="_mcePaste">sleep(1);</div>
<div id="_mcePaste">close(fd);</div>
<div id="_mcePaste">exit(1);</div>
<div id="_mcePaste">} else {</div>
<div id="_mcePaste">printf(&#8220;200 OK, Content-Type: %s\n\n&#8221;,</div>
<div id="_mcePaste">extensions[i].mediatype);</div>
<div id="_mcePaste">send_new(fd, &#8220;HTTP/1.1 200 OK\r\n&#8221;);</div>
<div id="_mcePaste">send_new(fd, &#8220;Server : Web Server in C\r\n\r\n&#8221;);</div>
<div id="_mcePaste">if (ptr == request + 4) // if it is a GET request</div>
<div id="_mcePaste">{</div>
<div id="_mcePaste">if ((length = get_file_size(fd1)) == -1)</div>
<div id="_mcePaste">printf(&#8220;Error in getting size !\n&#8221;);</div>
<div id="_mcePaste">size_t total_bytes_sent = 0;</div>
<div id="_mcePaste">ssize_t bytes_sent;</div>
<div id="_mcePaste">while (total_bytes_sent &lt; length) {</div>
<div id="_mcePaste">//Zero copy optimization</div>
<div id="_mcePaste">if ((bytes_sent = sendfile(fd, fd1, 0,</div>
<div id="_mcePaste">length &#8211; total_bytes_sent)) &lt;= 0) {</div>
<div id="_mcePaste">if (errno == EINTR || errno == EAGAIN) {</div>
<div id="_mcePaste">continue;</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">perror(&#8220;sendfile&#8221;);</div>
<div id="_mcePaste">return -1;</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">total_bytes_sent += bytes_sent;</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">break;</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">int size = sizeof(extensions) / sizeof(extensions[0]);</div>
<div id="_mcePaste">if (i == size &#8211; 2) {</div>
<div id="_mcePaste">printf(&#8220;415 Unsupported Media Type\n&#8221;);</div>
<div id="_mcePaste">send_new(fd, &#8220;HTTP/1.1 415 Unsupported Media Type\r\n&#8221;);</div>
<div id="_mcePaste">send_new(fd, &#8220;Server : Web Server in C\r\n\r\n&#8221;);</div>
<div id="_mcePaste">send_new(fd, &#8220;&lt;html&gt;&lt;head&gt;&lt;title&gt;415 Unsupported Media Type&lt;/head&gt;&lt;/title&gt;&#8221;);</div>
<div id="_mcePaste">send_new(fd, &#8220;&lt;body&gt;&lt;p&gt;415 Unsupported Media Type!&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;&#8221;);</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">close(fd);</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">shutdown(fd, SHUT_RDWR);</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">int main(int argc, char *argv[]) {</div>
<div id="_mcePaste">int sockfd, newsockfd, portno, pid;</div>
<div id="_mcePaste">socklen_t clilen;</div>
<div id="_mcePaste">struct sockaddr_in serv_addr, cli_addr;</div>
<div id="_mcePaste">if (argc &lt; 2) {</div>
<div id="_mcePaste">fprintf(stderr, &#8220;ERROR, no port provided\n&#8221;);</div>
<div id="_mcePaste">exit(1);</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">sockfd = socket(AF_INET, SOCK_STREAM, 0);</div>
<div id="_mcePaste">if (sockfd &lt; 0)</div>
<div id="_mcePaste">error(&#8220;ERROR opening socket&#8221;);</div>
<div id="_mcePaste">bzero((char *) &amp;serv_addr, sizeof(serv_addr));</div>
<div id="_mcePaste">portno = atoi(argv[1]);</div>
<div id="_mcePaste">serv_addr.sin_family = AF_INET;</div>
<div id="_mcePaste">serv_addr.sin_addr.s_addr = INADDR_ANY;</div>
<div id="_mcePaste">serv_addr.sin_port = htons(portno);</div>
<div id="_mcePaste">if (bind(sockfd, (struct sockaddr *) &amp;serv_addr, sizeof(serv_addr)) &lt; 0)</div>
<div id="_mcePaste">error(&#8220;ERROR on binding&#8221;);</div>
<div id="_mcePaste">listen(sockfd, 5);</div>
<div id="_mcePaste">clilen = sizeof(cli_addr);</div>
<div id="_mcePaste">/*</div>
<div id="_mcePaste">Server runs forever, forking off a separate</div>
<div id="_mcePaste">process for each connection.</div>
<div id="_mcePaste">*/</div>
<div id="_mcePaste">while (1) {</div>
<div id="_mcePaste">newsockfd = accept(sockfd, (struct sockaddr *) &amp;cli_addr, &amp;clilen);</div>
<div id="_mcePaste">if (newsockfd &lt; 0)</div>
<div id="_mcePaste">error(&#8220;ERROR on accept&#8221;);</div>
<div id="_mcePaste">pid = fork();</div>
<div id="_mcePaste">if (pid &lt; 0)</div>
<div id="_mcePaste">error(&#8220;ERROR on fork&#8221;);</div>
<div id="_mcePaste">if (pid == 0) {</div>
<div id="_mcePaste">close(sockfd);</div>
<div id="_mcePaste">connection(newsockfd);</div>
<div id="_mcePaste">exit(0);</div>
<div id="_mcePaste">} else</div>
<div id="_mcePaste">close(newsockfd);</div>
<div id="_mcePaste">} /* end of while */</div>
<div id="_mcePaste">close(sockfd);</div>
<div id="_mcePaste">return 0; /* we never get here */</div>
<div id="_mcePaste">}</div>
]]></content:encoded>
			<wfw:commentRss>http://www.waimv.com/linux/252/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>vim多窗口操作</title>
		<link>http://www.waimv.com/linux/250/</link>
		<comments>http://www.waimv.com/linux/250/#comments</comments>
		<pubDate>Wed, 12 Dec 2012 08:19:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[vi]]></category>

		<guid isPermaLink="false">http://www.szpian.com/?p=250</guid>
		<description><![CDATA[vim 从 vim7 开始加入了多标签切换的功能， 相当于多窗口. 之前的版本虽然也有多文件编辑功能， 但是总之不如这个方便啦。 用法 :tabnew [++opt选项] ［＋cmd］ 文件 建立对指定文件新的tab :tabc 关闭当前的tab :tabo 关闭所有其他的tab :tabs 查看所有打开的tab :tabp 前一个 :tabn 后一个 标准模式下： gt , gT 可以直接在tab之间切换。]]></description>
			<content:encoded><![CDATA[<p>vim 从 vim7 开始加入了多标签切换的功能， 相当于多窗口. 之前的版本虽然也有多文件编辑功能， 但是总之不如这个方便啦。</p>
<p>用法</p>
<p>:tabnew [++opt选项] ［＋cmd］ 文件            建立对指定文件新的tab</p>
<p>:tabc       关闭当前的tab</p>
<p>:tabo       关闭所有其他的tab</p>
<p>:tabs       查看所有打开的tab</p>
<p>:tabp      前一个</p>
<p>:tabn      后一个</p>
<p>标准模式下： gt , gT 可以直接在tab之间切换。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.waimv.com/linux/250/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>linux下的抓包工具tcpdump</title>
		<link>http://www.waimv.com/linux/248/</link>
		<comments>http://www.waimv.com/linux/248/#comments</comments>
		<pubDate>Fri, 16 Nov 2012 06:28:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[tcpdump]]></category>

		<guid isPermaLink="false">http://www.szpian.com/?p=248</guid>
		<description><![CDATA[1. tcpdump -D 获取网络适配器列表，以下是在windows上获取到的结果： 1.\Device\PssdkLoopback (PSSDK Loopback Ethernet Emulation Adapter) 2.\Device\{CF587901-C85F-4FD6-896F-D977DEFE76EC} (Intel(R) PRO/100 VE Network Co nnection) 2. tcpdump -i &#60;需要监控的网络适配器编号&#62;，例如我想监控lo(127.0.0.1)，即上面列表中的1.\Device\PssdkLoopback: （windows上特有的，linux不适用） tcpdump -i 1 如果不使用-i来定义监控适配器的话，默认使用列表中的第一个； 3. 监控主机为192.9.200.59上8000端口的tcp协议： tcpdump host 192.9.200.59 and tcp port 8000 4. 如果想要显示数据包的内容，需要使用-X参数，如，我想要显示捕获的http数据包http header的内容： tcpdump -X host 192.9.200.59 and tcp port 8000 显示结果如下： 22:13:19.717472 IP testhost59.12535 &#62; liujuan59.8000: . 1:330(329) ack [...]]]></description>
			<content:encoded><![CDATA[<div id="_mcePaste">
<div id="_mcePaste">1. tcpdump -D 获取网络适配器列表，以下是在windows上获取到的结果：</div>
<div id="_mcePaste"></div>
<div id="_mcePaste">1.\Device\PssdkLoopback (PSSDK Loopback Ethernet Emulation Adapter)</div>
<div id="_mcePaste">2.\Device\{CF587901-C85F-4FD6-896F-D977DEFE76EC} (Intel(R) PRO/100 VE Network Co</div>
<div id="_mcePaste">nnection)</div>
<div id="_mcePaste"></div>
<div id="_mcePaste"></div>
<div id="_mcePaste"></div>
<div id="_mcePaste"></div>
<div id="_mcePaste">2. tcpdump -i &lt;需要监控的网络适配器编号&gt;，例如我想监控lo(127.0.0.1)，即上面列表中的1.\Device\PssdkLoopback: （windows上特有的，linux不适用）</div>
<div id="_mcePaste"></div>
<div id="_mcePaste">tcpdump -i 1</div>
<div id="_mcePaste"></div>
<div id="_mcePaste"></div>
<div id="_mcePaste"></div>
<div id="_mcePaste"></div>
<div id="_mcePaste">如果不使用-i来定义监控适配器的话，默认使用列表中的第一个；</div>
<div id="_mcePaste"></div>
<div id="_mcePaste">3. 监控主机为192.9.200.59上8000端口的tcp协议：</div>
<div id="_mcePaste"></div>
<div id="_mcePaste">tcpdump host 192.9.200.59 and tcp port 8000</div>
<div id="_mcePaste"></div>
<div id="_mcePaste"></div>
<div id="_mcePaste"></div>
<div id="_mcePaste"></div>
<div id="_mcePaste">4. 如果想要显示数据包的内容，需要使用-X参数，如，我想要显示捕获的http数据包http header的内容：</div>
<div id="_mcePaste"></div>
<div id="_mcePaste">tcpdump -X host 192.9.200.59 and tcp port 8000</div>
<div id="_mcePaste"></div>
<div id="_mcePaste"></div>
<div id="_mcePaste"></div>
<div id="_mcePaste"></div>
<div id="_mcePaste">显示结果如下：</div>
<div id="_mcePaste"></div>
<div id="_mcePaste">22:13:19.717472 IP testhost59.12535 &gt; liujuan59.8000: . 1:330(329) ack 1 win 327</div>
<div id="_mcePaste">8</div>
<div id="_mcePaste">0&#215;0000: 4500 0171 e616 0000 8006 cb2b 0000 0000 E..q&#8230;&#8230;.+&#8230;.</div>
<div id="_mcePaste">0&#215;0010: c009 c83b 30f7 1f40 0000 0002 0000 0002 &#8230;;0..@&#8230;&#8230;..</div>
<div id="_mcePaste">0&#215;0020: 5010 8000 b066 0000 504f 5354 202f 2048 P&#8230;.f..POST./.H</div>
<div id="_mcePaste">0&#215;0030: 5454 502f 312e 310d 0a43 6f6e 7465 6e74 TTP/1.1..Content</div>
<div id="_mcePaste">0&#215;0040: 2d54 7970 653a 2074 6578 742f 786d 6c3b -Type:.text/xml;</div>
<div id="_mcePaste">0&#215;0050: 2063 .c</div>
<div id="_mcePaste"></div>
<div id="_mcePaste"></div>
<div id="_mcePaste"></div>
<div id="_mcePaste"></div>
<div id="_mcePaste">可以看到该结果只显示了http头的一部分，没有显示全，是因为tcpdump默认将显示的数据长度截断了，可以使用-s后面加数据长度，来设置数据显示长度：</div>
<div id="_mcePaste"></div>
<div id="_mcePaste">tcpdump -X -s 0 host 192.9.200.59 and tcp port 8000</div>
<div id="_mcePaste"></div>
<div id="_mcePaste"></div>
<div id="_mcePaste"></div>
<div id="_mcePaste"></div>
<div id="_mcePaste">以上的例子中，-s 0 表示自动设置长度使其能够显示所有数据。</div>
<div id="_mcePaste"></div>
<div id="_mcePaste">5. 捕获的数据太多，不断刷屏，可能需要将数据内容记录到文件里，需要使用-w参数：</div>
<div id="_mcePaste"></div>
<div id="_mcePaste">tcpdump -X -s 0 -w aaa host 192.9.200.59 and tcp port 8000</div>
<div id="_mcePaste"></div>
<div id="_mcePaste"></div>
<div id="_mcePaste"></div>
<div id="_mcePaste"></div>
<div id="_mcePaste">则将之前显示在屏幕中的内容，写入tcpdump可执行文件同级目录下的aaa文件中。</div>
<div id="_mcePaste"></div>
<div id="_mcePaste">文件查看方式如下，需要使用-r参数：</div>
<div id="_mcePaste"></div>
<div id="_mcePaste">tcpdump -X -s 0 -r aaa host 192.9.200.59 and tcp port 8000</div>
<div id="_mcePaste"></div>
<div id="_mcePaste"></div>
<div id="_mcePaste"></div>
<div id="_mcePaste"></div>
<div id="_mcePaste">如果这样写：</div>
<div id="_mcePaste"></div>
<div id="_mcePaste">tcpdump -r aaa</div>
<div id="_mcePaste"></div>
<div id="_mcePaste"></div>
<div id="_mcePaste"></div>
<div id="_mcePaste"></div>
<div id="_mcePaste">则只能看到最简单的数据传输交互过程，看不到数据包内容，查看时也需要使用相应的参数。</div>
<div id="_mcePaste"></div>
<div id="_mcePaste">6.总结</div>
<div id="_mcePaste"></div>
<div id="_mcePaste">总结一下，tcpdump的参数分两个部分，选项（Options）和表达式（expression）：</div>
<div id="_mcePaste"></div>
<div id="_mcePaste">tcpdump[-adeflnNOpqRStuvxX] [-ccount]</div>
<div id="_mcePaste">[-Cfile_size] [-Ffile]</div>
<div id="_mcePaste">[-iinterface] [-mmodule] [-rfile]</div>
<div id="_mcePaste">[-ssnaplen] [-Ttype] [-wfile]</div>
<div id="_mcePaste">[-Ealgo:secret] [expression]</div>
<div id="_mcePaste"></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.waimv.com/linux/248/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php服务器监控</title>
		<link>http://www.waimv.com/other/240/</link>
		<comments>http://www.waimv.com/other/240/#comments</comments>
		<pubDate>Thu, 15 Nov 2012 10:12:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[other]]></category>
		<category><![CDATA[服务器监控]]></category>

		<guid isPermaLink="false">http://www.szpian.com/?p=240</guid>
		<description><![CDATA[1. 取出系统Kernel版本： $sys_host_name = file(&#8220;/proc/sys/kernel/hostname&#8221;); $sys_ostype = file(&#8220;/proc/sys/kernel/ostype&#8221;); $sys_osrelease = file(&#8220;/proc/sys/kernel/osrelease&#8221;); $sys_version_time = file(&#8220;/proc/sys/kernel/version&#8221;); 2. 取出CPU信息 $cpu_info = file(&#8220;/proc/cpuinfo&#8221;); 3. 取出系统内存和交换分区的信息 $memory_info = file(&#8220;/proc/meminfo&#8221;); $meminfo = explode(&#8221; &#8220;, $memory_info[1]); 4. 取出PS进程信息，以推算出CPU和MEM的使用率 exec(&#8220;ps -aux&#8221;, $ps_info_result); for ($i = 0; $i &#60; count($ps_info_result); $i++) { list($user[$i], $pid[$i], $cpu[$i], $mem[$i], $vsz[$i], $rss[$i], $tty[$i], $stat[$i], $start[$i], $time[$i], $command[$i]) = [...]]]></description>
			<content:encoded><![CDATA[<p>1. 取出系统Kernel版本：<br />
$sys_host_name = file(&#8220;/proc/sys/kernel/hostname&#8221;);<br />
$sys_ostype = file(&#8220;/proc/sys/kernel/ostype&#8221;);<br />
$sys_osrelease = file(&#8220;/proc/sys/kernel/osrelease&#8221;);<br />
$sys_version_time = file(&#8220;/proc/sys/kernel/version&#8221;);</p>
<p>2. 取出CPU信息<br />
$cpu_info = file(&#8220;/proc/cpuinfo&#8221;);</p>
<p>3. 取出系统内存和交换分区的信息<br />
$memory_info = file(&#8220;/proc/meminfo&#8221;);<br />
$meminfo = explode(&#8221; &#8220;, $memory_info[1]);</p>
<p>4. 取出PS进程信息，以推算出CPU和MEM的使用率<br />
exec(&#8220;ps -aux&#8221;, $ps_info_result);<br />
for ($i = 0; $i &lt; count($ps_info_result); $i++) {<br />
list($user[$i], $pid[$i], $cpu[$i], $mem[$i], $vsz[$i], $rss[$i], $tty[$i], $stat[$i], $start[$i], $time[$i], $command[$i]) = split(&#8221; +&#8221;, $ps_info_result[$i]);<br />
//取出CPU用的总数(百分比)<br />
$cpu_use_total = $cpu_use_total + $cpu[$i];<br />
//取出MEM用的总数(百分比)<br />
$mem_use_total = $mem_use_total + $mem[$i];<br />
//取出MEM用的总数(KB)<br />
$rss_use_total = $rss_use_total + $rss[$i];<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.waimv.com/other/240/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>vi快捷键</title>
		<link>http://www.waimv.com/linux/241/</link>
		<comments>http://www.waimv.com/linux/241/#comments</comments>
		<pubDate>Thu, 15 Nov 2012 03:06:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[vi]]></category>

		<guid isPermaLink="false">http://www.szpian.com/?p=241</guid>
		<description><![CDATA[%s/vivian/sky/g（等同于 ：g/vivian/s//sky/g） 替换每一行中所有 vivian 为 sky 如果替换的范围较大时，在所有的命令尾加一个c命令，强制每个替换需要用户进行确认，例如:s/old/new/c 或s/old/new/gc Ctrl+R可以恢复对使用u命令的操作 dw删除当前字符到单词尾包括空格的所有字符 yw复制当前光标所在位置到单词尾字符的内容到vi缓存区，相当于复制一个单词 #yy例如：5yy就是复制5行 也可以写成 y5 以后继续补充。]]></description>
			<content:encoded><![CDATA[<p>%s/vivian/sky/g（等同于 ：g/vivian/s//sky/g） 替换每一行中所有 vivian 为 sky</p>
<p>如果替换的范围较大时，在所有的命令尾加一个c命令，强制每个替换需要用户进行确认，例如:s/old/new/c 或s/old/new/gc</p>
<p>Ctrl+R可以恢复对使用u命令的操作</p>
<p>dw删除当前字符到单词尾包括空格的所有字符</p>
<p>yw复制当前光标所在位置到单词尾字符的内容到vi缓存区，相当于复制一个单词</p>
<p>#yy例如：5yy就是复制5行 也可以写成 y5</p>
<p>以后继续补充。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.waimv.com/linux/241/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LevelDB文章介绍</title>
		<link>http://www.waimv.com/linux/236/</link>
		<comments>http://www.waimv.com/linux/236/#comments</comments>
		<pubDate>Fri, 02 Nov 2012 02:26:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[DB]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.szpian.com/?p=236</guid>
		<description><![CDATA[http://www.cnblogs.com/haippy/archive/2011/12/04/2276064.html]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.cnblogs.com/haippy/archive/2011/12/04/2276064.html">http://www.cnblogs.com/haippy/archive/2011/12/04/2276064.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.waimv.com/linux/236/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
