<?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>陈志伟博客 &#187; 编程相关</title>
	<atom:link href="http://chenzhiwei.net/category/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://chenzhiwei.net</link>
	<description>善始者实繁，克终者盖寡。</description>
	<lastBuildDate>Sat, 17 Mar 2012 04:16:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>不打算学python和perl</title>
		<link>http://chenzhiwei.net/2011/11/do-not-want-learn-python-and-perl/</link>
		<comments>http://chenzhiwei.net/2011/11/do-not-want-learn-python-and-perl/#comments</comments>
		<pubDate>Mon, 28 Nov 2011 13:51:33 +0000</pubDate>
		<dc:creator>zhiwei</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://chenzhiwei.net/?p=30444</guid>
		<description><![CDATA[好吧，哥承认python和perl是很强大的脚本语言，并且不仅仅是脚本语言。但他们的语法神马的太自由、太灵活了，哥实在受不了这种脚本的书写格式。所以哥决定目前不学这两门语言。 &#169; 2011, chenzhiwei.net. 版权所有. 本文永久链接：http://chenzhiwei.net/2011/11/do-not-want-learn-python-and-perl/随机日志博客更名-陈志伟ubuntu11.04下使用pptp vpnC/C++中assert的用法中国国内域名到期查询、国际域名到期查询再次汇总国内外支持域名绑定的博客]]></description>
			<content:encoded><![CDATA[<p>好吧，哥承认python和perl是很强大的脚本语言，并且不仅仅是脚本语言。但他们的语法神马的太自由、太灵活了，哥实在受不了这种脚本的书写格式。所以哥决定目前不学这两门语言。</p>
<p style="font-weight: bold;">&copy; 2011, <a href="http://chenzhiwei.net">chenzhiwei.net</a>. 版权所有.  <br />本文永久链接：<a title="不打算学python和perl" href="http://chenzhiwei.net/2011/11/do-not-want-learn-python-and-perl/">http://chenzhiwei.net/2011/11/do-not-want-learn-python-and-perl/</a></p><hr /><div  class="related_post_title">随机日志</div><ul class="related_post"><li><a href="http://chenzhiwei.net/2010/04/recommend-to-use-firefox-web-browser/" title="推荐使用火狐浏览器">推荐使用火狐浏览器</a></li><li><a href="http://chenzhiwei.net/2009/07/an-explanation/" title="说明">说明</a></li><li><a href="http://chenzhiwei.net/2009/02/yuming-daoqi-chaxun/" title="中国国内域名到期查询、国际域名到期查询">中国国内域名到期查询、国际域名到期查询</a></li><li><a href="http://chenzhiwei.net/2010/03/android-hellogallery-app/" title="android初体验-HelloGallery实例详解">android初体验-HelloGallery实例详解</a></li><li><a href="http://chenzhiwei.net/2010/11/shell-script-study-notes-shell/" title="几个简单的shell脚本">几个简单的shell脚本</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://chenzhiwei.net/2011/11/do-not-want-learn-python-and-perl/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>让旧版本的PHP支持json</title>
		<link>http://chenzhiwei.net/2011/11/old-version-php-support-json/</link>
		<comments>http://chenzhiwei.net/2011/11/old-version-php-support-json/#comments</comments>
		<pubDate>Fri, 18 Nov 2011 15:17:31 +0000</pubDate>
		<dc:creator>zhiwei</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://chenzhiwei.net/?p=30441</guid>
		<description><![CDATA[JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式，它可以将 JavaScript 对象中表示的一组数据转换为字符串，然后就可以在函数之间轻松地传递这个字符串，或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。这个字符串看起来有点儿古怪，但是 JavaScript 很容易解释它，而且 JSON 可以表示比名称 / 值对更复杂的结构。例如，可以表示数组和复杂的对象，而不仅仅是键和值的简单列表。 在旧版本的php中是默认不支持json的，这就需要我们编译一个json的php扩展，方法如下： 1. 下载源码： http://pecl.php.net/package/json 2. 解压 3. 依次运行 phpize ; ./configure; make; make install 4. 在php配置文件php.ini上加上extension=”json.so” 5. 如果是跑的网页代码中用到了json，那么还需要重启apache &#169; 2011, chenzhiwei.net. 版权所有. 本文永久链接：http://chenzhiwei.net/2011/11/old-version-php-support-json/相关日志wordpress主题常用的代码Cannot modify header information的问题]]></description>
			<content:encoded><![CDATA[<p>JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式，它可以将 JavaScript 对象中表示的一组数据转换为字符串，然后就可以在函数之间轻松地传递这个字符串，或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。这个字符串看起来有点儿古怪，但是 JavaScript 很容易解释它，而且 JSON 可以表示比名称 / 值对更复杂的结构。例如，可以表示数组和复杂的对象，而不仅仅是键和值的简单列表。<span id="more-30441"></span></p>
<p>在旧版本的php中是默认不支持json的，这就需要我们编译一个json的php扩展，方法如下：</p>
<p>1. 下载源码： http://pecl.php.net/package/json</p>
<p>2. 解压</p>
<p>3. 依次运行 phpize ; ./configure; make; make install</p>
<p>4. 在php配置文件php.ini上加上extension=”json.so”</p>
<p>5. 如果是跑的网页代码中用到了json，那么还需要重启apache</p>
<p style="font-weight: bold;">&copy; 2011, <a href="http://chenzhiwei.net">chenzhiwei.net</a>. 版权所有.  <br />本文永久链接：<a title="让旧版本的PHP支持json" href="http://chenzhiwei.net/2011/11/old-version-php-support-json/">http://chenzhiwei.net/2011/11/old-version-php-support-json/</a></p><hr /><div  class="related_post_title">相关日志</div><ul class="related_post"><li><a href="http://chenzhiwei.net/2010/07/wordpress-useful-code/" title="wordpress主题常用的代码">wordpress主题常用的代码</a></li><li><a href="http://chenzhiwei.net/2009/04/cannot-modify-header-information/" title="Cannot modify header information的问题">Cannot modify header information的问题</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://chenzhiwei.net/2011/11/old-version-php-support-json/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Shell I/O重定向</title>
		<link>http://chenzhiwei.net/2011/08/shell-io-redirection/</link>
		<comments>http://chenzhiwei.net/2011/08/shell-io-redirection/#comments</comments>
		<pubDate>Mon, 29 Aug 2011 11:23:39 +0000</pubDate>
		<dc:creator>zhiwei</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[IO]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://chenzhiwei.net/?p=30432</guid>
		<description><![CDATA[Unuix/Linux系统有三个文件是默认被打开着的，它们的分别是stdin(标准输入文件，键盘)，stdout（标准输出文件，屏幕）和stderr（标准错误文件，屏幕）。这些文件和其他打开的文件都可以被重定向。I/O重定向简单的说就是用一个脚本来捕获一个文件、命令、程序、脚本甚至是代码块的输出，然后将该输出写入到另一个文件、命令、程序或脚本。 每个打开的文件都被赋予一个文件描述符。0,1,2分别是标准输入、标准输出、标准错误的文件描述符。 1. 标准输出 &#62; (COMMAND_OUTPUT &#62;) 重定向标准输出到一个文件，如果这个文件不存在则创建，存在则覆盖。 ls -lR &#62; dir-tree.list # 将当前目录的目录树写入文件dir-tree.list : &#62; filename # 删除filename里的所有内容（即将filename置空）。如果文件不存在则创建一个空文件（与touch filename命令效果相同）。 &#62; filename # 与上条命令意思相同，但是该命令在某些shell中不可用。 2. 标准输出 &#62;&#62; (COMMAND_OUTPUT &#62;&#62;) 重定标准输出到一个文件，如果该文件不存在则创建，存在则追加到该文件末尾。 只对单行重定向命令起作用（即只对命令所在的行起作用） 1 &#62;&#62; filename # 重定向并追加标准输出到filename 2 &#62;&#62; filename # 重定向前追加标准错误输出到filename &#38; &#62; filename # 重定向标准输出和标准错误输出到filename，该命令可在Bash 4下使用。 M &#62; N # “M” 是一个文件描述符，默认为1；”N”是一个文件名。意思是将M的内容重定向到N M&#62;&#38;N # [...]]]></description>
			<content:encoded><![CDATA[<p>Unuix/Linux系统有三个文件是默认被打开着的，它们的分别是stdin(标准输入文件，键盘)，stdout（标准输出文件，屏幕）和stderr（标准错误文件，屏幕）。这些文件和其他打开的文件都可以被重定向。I/O重定向简单的说就是用一个脚本来捕获一个文件、命令、程序、脚本甚至是代码块的输出，然后将该输出写入到另一个文件、命令、程序或脚本。<span id="more-30432"></span></p>
<p>每个打开的文件都被赋予一个文件描述符。0,1,2分别是标准输入、标准输出、标准错误的文件描述符。</p>
<p><strong>1. 标准输出 &gt; </strong>(COMMAND_OUTPUT &gt;)<br />
重定向标准输出到一个文件，如果这个文件不存在则创建，存在则覆盖。</p>
<p>ls -lR &gt; dir-tree.list<br />
# 将当前目录的目录树写入文件dir-tree.list</p>
<p>: &gt; filename<br />
# 删除filename里的所有内容（即将filename置空）。如果文件不存在则创建一个空文件（与touch filename命令效果相同）。</p>
<p>&gt; filename<br />
# 与上条命令意思相同，但是该命令在某些shell中不可用。</p>
<p><strong>2. 标准输出 &gt;&gt; (COMMAND_OUTPUT &gt;&gt;)</strong><br />
重定标准输出到一个文件，如果该文件不存在则创建，存在则追加到该文件末尾。</p>
<p>只对单行重定向命令起作用（即只对命令所在的行起作用）<br />
1 &gt;&gt; filename<br />
# 重定向并追加标准输出到filename</p>
<p>2 &gt;&gt; filename<br />
# 重定向前追加标准错误输出到filename</p>
<p>&amp; &gt; filename<br />
# 重定向标准输出和标准错误输出到filename，该命令可在Bash 4下使用。</p>
<p>M &gt; N<br />
# “M” 是一个文件描述符，默认为1；”N”是一个文件名。意思是将M的内容重定向到N</p>
<p>M&gt;&amp;N<br />
# “M”是一个文件描述符，默认为1；”N”是另一个文件描述符。意思是将文件描述符M重定向到N，即所有M指向的文件输出都会发给N所指向的文件。</p>
<p>2&gt;&amp;1<br />
# 将标准错误输出重定向到标准输出，一般用法如下：<br />
&gt;&gt; filename 2&gt;&amp;1<br />
# 意思是将标准错误输出重定向到标准输出，再将标准输出重定向到文件filename</p>
<p>&gt;&amp;j<br />
# 等价于 1&gt;&amp;j ，即将标准输出定向到j所指向的文件</p>
<p>0&lt;filename 或 &lt;filename<br />
# 以文件filename内容为标准输入。<br />
# grep search-word &lt; filename</p>
<p>[j]&lt;&gt;filename<br />
# 以读写方式打开filename，并且将j作为文件描述符赋值给filename，如果j没有被指定，默认为0，即标准输入。</p>
<p>下面的例子会让你更清楚理解其含义<br />
echo “1234567890&#8243; &gt; file	# 将字符串写入file<br />
exec 3&lt;&gt;file				# 打开file并且将其文件描述符设置成3<br />
read -n 4 &lt;&amp;3				# 仅读取4个字符<br />
echo -n . &gt;&amp;3				# 写入一个英文句号<br />
exec 3&gt;&amp;-				# 关于文件描述符3<br />
cat file					# 结果会是：1234.567890</p>
<p>|<br />
# 管道，用来定向命令的，与”&gt;”相似，但是更实用。不细说了。</p>
<p>ls -yz &gt;&gt; command.log 2&gt;&amp;1<br />
# 捕获非法选项yz的标准错误输出及标准输出，并写入command.log文件。</p>
<p>ls -yz 2&gt;&amp;1 &gt;&gt; command.log<br />
# 输出错误信息，但是不写入文件command.log。这一行命令的意思是将标准输出写入command.log，而标准错误输出则定向到标准输出。虽然这条命令和并一条命令一样，都是将标准错误输出定向到标准输出，但是顺序不一样，所以意义也不一样。</p>
<p><strong>3. 关闭文件描述符</strong><br />
n&lt;&amp;-<br />
# 关闭输入文件描述符n</p>
<p>0&lt;&amp;-,&lt;&amp;-<br />
# 关闭标准输入。</p>
<p>n&gt;&amp;-<br />
# 关闭标准输出文件描述符n.</p>
<p>1&gt;&amp;-,&gt;&amp;-<br />
# 关闭标准标准输出</p>
<p>子进程继承打开的文件描述符，这就是pipe工作的原理，要阻止一个文件描述符被继承，那么请关闭它。</p>
<p># 仅重定向标准错误输出到管道</p>
<p>exec 3&gt;&amp;1 						# 保存当前标准输出的值<br />
ls -l 2&gt;&amp;1 &gt;&amp;3 3&gt;&amp;- | grep bad 3&gt;&amp;-	# 为grep关闭文件描述符3（但并不是&#8217;ls&#8217;命令）<br />
exec 3&gt;&amp;- 						# 关闭文件描述符3</p>
<p>注：这是ABS Guide第20章的内容，我在上周六翻译出来的。<br />
英文原文地址：<a href="http://tldp.org/LDP/abs/html/io-redirection.html">http://tldp.org/LDP/abs/html/io-redirection.html</a></p>
<p style="font-weight: bold;">&copy; 2011, <a href="http://chenzhiwei.net">chenzhiwei.net</a>. 版权所有.  <br />本文永久链接：<a title="Shell I/O重定向" href="http://chenzhiwei.net/2011/08/shell-io-redirection/">http://chenzhiwei.net/2011/08/shell-io-redirection/</a></p><hr /><div  class="related_post_title">相关日志</div><ul class="related_post"><li><a href="http://chenzhiwei.net/2010/11/shell-script-study-notes-shell/" title="几个简单的shell脚本">几个简单的shell脚本</a></li><li><a href="http://chenzhiwei.net/2010/11/shell-script-study-notes-2/" title="shell 脚本学习之判断条件">shell 脚本学习之判断条件</a></li><li><a href="http://chenzhiwei.net/2010/11/shell-script-study-notes/" title="shell脚本学习">shell脚本学习</a></li><li><a href="http://chenzhiwei.net/2010/10/linux-shell-study-notes-part-5/" title="Linux Shell学习笔记（五）">Linux Shell学习笔记（五）</a></li><li><a href="http://chenzhiwei.net/2010/07/linux-shell-study-notes-part-4/" title="linux shell 学习笔记(四)">linux shell 学习笔记(四)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://chenzhiwei.net/2011/08/shell-io-redirection/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>haproxy是个什么东西</title>
		<link>http://chenzhiwei.net/2011/05/what-is-haproxy/</link>
		<comments>http://chenzhiwei.net/2011/05/what-is-haproxy/#comments</comments>
		<pubDate>Wed, 25 May 2011 09:59:52 +0000</pubDate>
		<dc:creator>zhiwei</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[haproxy]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[集群]]></category>

		<guid isPermaLink="false">http://chenzhiwei.net/?p=30427</guid>
		<description><![CDATA[haproxy中的ha意思是高可用性（High Availability），而proxy是代理的意思，合并在一起就是高可用的代理。haproxy在服务器集群中经常会被用到。 Haproxy可以对特定请求进行转发，如：将请求转发到不同机器、将不同的请求转发到不同的机器（图片请求、文本请求、FTP、HTTP请求）、将对特定端口的请求转发到不同机器或另一端口等。 举个例子，一个网站的代码在服务器A上，附件在服务器B上，数据库在服务器C上。我们可以将该网站的所有请求都指向haproxy，haproxy会对请求加以判断，然后将不同的请求转发给不同的服务器。如，将对网页的访问请求转发到服务器A上；对网站附件的请求转发到服务器B上；对网站数据库的请求转发到服务器C上。一般这些服务器都有两组，主（master）服务器和从（slave）服务器。 Haproxy可以与stunnel一起使用来进行443端口的监听，即接收https请求。具体配置方法haproxy的文档上写的很清楚。 &#169; 2011, chenzhiwei.net. 版权所有. 本文永久链接：http://chenzhiwei.net/2011/05/what-is-haproxy/相关日志Shell I/O重定向一个apache为两个不同端口的网站提供服务Linux下的NFS,VSFTP,Samba的简单配置海明码详解Linux内核基本结构]]></description>
			<content:encoded><![CDATA[<p>haproxy中的ha意思是高可用性（High Availability），而proxy是代理的意思，合并在一起就是高可用的代理。haproxy在服务器集群中经常会被用到。<span id="more-30427"></span></p>
<div>Haproxy可以对特定请求进行转发，如：将请求转发到不同机器、将不同的请求转发到不同的机器（图片请求、文本请求、FTP、HTTP请求）、将对特定端口的请求转发到不同机器或另一端口等。</div>
<div></div>
<div>举个例子，一个网站的代码在服务器A上，附件在服务器B上，数据库在服务器C上。我们可以将该网站的所有请求都指向haproxy，haproxy会对请求加以判断，然后将不同的请求转发给不同的服务器。如，将对网页的访问请求转发到服务器A上；对网站附件的请求转发到服务器B上；对网站数据库的请求转发到服务器C上。一般这些服务器都有两组，主（master）服务器和从（slave）服务器。</div>
<div></div>
<div>Haproxy可以与stunnel一起使用来进行443端口的监听，即接收https请求。具体配置方法haproxy的文档上写的很清楚。</div>
<p style="font-weight: bold;">&copy; 2011, <a href="http://chenzhiwei.net">chenzhiwei.net</a>. 版权所有.  <br />本文永久链接：<a title="haproxy是个什么东西" href="http://chenzhiwei.net/2011/05/what-is-haproxy/">http://chenzhiwei.net/2011/05/what-is-haproxy/</a></p><hr /><div  class="related_post_title">相关日志</div><ul class="related_post"><li><a href="http://chenzhiwei.net/2011/08/shell-io-redirection/" title="Shell I/O重定向">Shell I/O重定向</a></li><li><a href="http://chenzhiwei.net/2011/07/one-apache-hosts-two-site-with-different-port/" title="一个apache为两个不同端口的网站提供服务">一个apache为两个不同端口的网站提供服务</a></li><li><a href="http://chenzhiwei.net/2011/03/linux-nfs-vsftp-samba/" title="Linux下的NFS,VSFTP,Samba的简单配置">Linux下的NFS,VSFTP,Samba的简单配置</a></li><li><a href="http://chenzhiwei.net/2010/12/detailed-explanation-of-hamming-code/" title="海明码详解">海明码详解</a></li><li><a href="http://chenzhiwei.net/2010/12/the-basic-structure-of-linux-kernel/" title="Linux内核基本结构">Linux内核基本结构</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://chenzhiwei.net/2011/05/what-is-haproxy/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Linux下的NFS,VSFTP,Samba的简单配置</title>
		<link>http://chenzhiwei.net/2011/03/linux-nfs-vsftp-samba/</link>
		<comments>http://chenzhiwei.net/2011/03/linux-nfs-vsftp-samba/#comments</comments>
		<pubDate>Tue, 29 Mar 2011 05:22:45 +0000</pubDate>
		<dc:creator>zhiwei</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[nfs]]></category>
		<category><![CDATA[samba]]></category>
		<category><![CDATA[vsftp]]></category>

		<guid isPermaLink="false">http://chenzhiwei.net/?p=30424</guid>
		<description><![CDATA[从网上搜集的，自己整理了一下，又亲自测试验证了正确性。 地址是：http://goo.gl/tXyOc &#169; 2011, chenzhiwei.net. 版权所有. 本文永久链接：http://chenzhiwei.net/2011/03/linux-nfs-vsftp-samba/相关日志Shell I/O重定向一个apache为两个不同端口的网站提供服务haproxy是个什么东西海明码详解Linux内核基本结构]]></description>
			<content:encoded><![CDATA[<p>从网上搜集的，自己整理了一下，又亲自测试验证了正确性。</p>
<p>地址是：<a href="http://goo.gl/tXyOc" target="_blank">http://goo.gl/tXyOc</a></p>
<p style="font-weight: bold;">&copy; 2011, <a href="http://chenzhiwei.net">chenzhiwei.net</a>. 版权所有.  <br />本文永久链接：<a title="Linux下的NFS,VSFTP,Samba的简单配置" href="http://chenzhiwei.net/2011/03/linux-nfs-vsftp-samba/">http://chenzhiwei.net/2011/03/linux-nfs-vsftp-samba/</a></p><hr /><div  class="related_post_title">相关日志</div><ul class="related_post"><li><a href="http://chenzhiwei.net/2011/08/shell-io-redirection/" title="Shell I/O重定向">Shell I/O重定向</a></li><li><a href="http://chenzhiwei.net/2011/07/one-apache-hosts-two-site-with-different-port/" title="一个apache为两个不同端口的网站提供服务">一个apache为两个不同端口的网站提供服务</a></li><li><a href="http://chenzhiwei.net/2011/05/what-is-haproxy/" title="haproxy是个什么东西">haproxy是个什么东西</a></li><li><a href="http://chenzhiwei.net/2010/12/detailed-explanation-of-hamming-code/" title="海明码详解">海明码详解</a></li><li><a href="http://chenzhiwei.net/2010/12/the-basic-structure-of-linux-kernel/" title="Linux内核基本结构">Linux内核基本结构</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://chenzhiwei.net/2011/03/linux-nfs-vsftp-samba/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>这个周接触的几个词语</title>
		<link>http://chenzhiwei.net/2011/03/some-words-related-to-compute-science/</link>
		<comments>http://chenzhiwei.net/2011/03/some-words-related-to-compute-science/#comments</comments>
		<pubDate>Fri, 18 Mar 2011 06:23:50 +0000</pubDate>
		<dc:creator>zhiwei</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[innodb]]></category>
		<category><![CDATA[myisam]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[rpc]]></category>
		<category><![CDATA[同步]]></category>
		<category><![CDATA[异步]]></category>
		<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://chenzhiwei.net/?p=30423</guid>
		<description><![CDATA[博客里没什么内容可写，就记录一下自己最近接触的词语吧。最近了解了很多词语，有些是自己以前就知道了，就不记了。有些自己知道但有时会迷糊的和自己之前不知道的，都记录了下来。有些是我遇到的，有些是延伸出来的。也不知道这些词语能否称为计算机术语，这些是我从百科词条上摘录下来的，改动的地方很少。 异步： 异步（asynchronous）是一种通讯方式，即通讯双方不需要有共同的时钟，也就是说接收方不知道发送方何时发送，因此发送方在发送的数据中需要含有提示接收方开始接收的信息，如开始接收时有“开始位”，停止接收时有“停止位”。 异步通信在发送字符时，所发送的字符之间的时间间隔可以是任意的。当然，接收端必须时刻做好接收的准备（如果接收端主机的电源都没有加上，那么发送端发送字符就没有意义，因为接收端根本无法接收）。发送端可以在任意时刻开始发送字符，因此必须在每一个字符的开始和结束的地方加上标志，即加上开始位和停止位，以便使接收端能够正确地将每一个字符接收下来。异步通信的好处是通信设备简单、便宜，但传输效率较低（因为开始位和停止位的开销所占比例较大）。 在编程中，异步的概念和同步相对，当一个异步过程调用发出后，调用者不能够立刻得到结果。实际处理这个调用的部件在完成后，通过状态、通知和回调来通知调用者。 同步： 同步（synchronous,sync,synchronism,synchronization）就是协同步调，按预定的先后次序进行运行。指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系。 在编程中，同步就是在发出一个功能调用时，在没有得到结果之前，该调用就不返回，同时其他线程也不能调用这个方法。一般而言，我们所说的同步特指那些需要其他部件协作或者需要一定时间完成的任务。 在通信中领域，同步通信的通信双方必须先建立同步，即双方的时钟要调整到同一个频率。收发双方不停地发送和接收连续的同步比特流。但这分为两种不同情况的同步方式。一种是全网同步，即用一个非常精确的主时钟对全网所有结点上的时钟进行同步。另一种是准同步，即各结点的时钟之间允许有微小的误差，然后采用其他实现同步传输。 进程同步： 进程同步是指一组相互协调的进程，在完成同一任务，对某些共享资源进行操作时，为协调资源占用而相互等待、相互交换信息所产生的制约关系。（互斥是指并发进程间因相互竞争使用独占资源所生产的制约关系。） REST： REST(Representation State Transfer,表述性状态转移)是一种针对网络应用的设计和开发方式，可以降低开发的复杂性，提高系统的可伸缩性。 REST的设计理念和准则如下： 1.网络上的所有事物都被抽象为资源（resource）； 2.每个资源对应一个唯一的资源标识（resource identifier）； 3.通过通用的连接器接口（generic connector interface）对资源进行操作； 4.对资源的各种操作不会改变资源标识； 5.所有的操作都是无状态的（stateless）。 对于当今最常见的网络应用来说，resource identifier是URL，generic connector interface是HTTP，第4条准则就是我们常说的URL不变性。这些概念中的resource最容易使人产生误解。resource所指的并不是数据，而是数据+特点的表现形式（representation），这也是为什么REST的全名是Representation State Transfer的原因。举个例子来说，“中国最大的10家网络公司”和“你最喜欢的10家网络公司”在数据上可能有重叠（即有一家网络公司是中国前十大，并且你又喜欢），甚至完全相同（中国最大的前10家网络公司也是你最喜欢的10家网络公司）。但是他们 的representation不同，因此是不同的resource。 REST之所以能够简化开发，是因为引入的架构约束，比如Rails1.2（Rails是一个更符合实际需要而且更高效的Web开发框架，其结合了PHP体系的优点&#60;快速开发&#62;和Java体系的优点&#60;程序规整&#62;。）中对REST的实现默认把controller中的方法限制在7个（index,show,new,edit,create,update,destory），其实就是对CRUD的实现。更进一步讲，Rails使用HTTP作为generic connector interface，HTTP规则把对一个URL的操作限制在了4个之内（GET,POST,PUT,DELETE）。 REST之所以能够提高系统的可伸缩性，是因为它强制所有操作都是stateless的，这样就没有context的约束，如果要做分布式、做集群，就不需要考虑context的问题了。同时，它令系统可以有效地使用pool。REST对性能的另一个提升来自其对client和server任务的分配：server只负责提供resource以及操作resource的服务，而client要根据resource中的data和representation自己做render，这就减少了服务器的开销。 SLA（服务等级协议）： SAL，Service-Level Agreement的缩写，意思是服务等级协议。 服务等级协议是关于网络服务提供商和客户间的一份合同，其中定义了服务类型、服务质量和客户付款等术语。 典型的SLA包括以下几条： 1.分配给客户的最小带宽 2.客户带宽极限 3.有同时服务的客户数目 4. 在可能影响用户行为的网络变化之前的通知安排 5.拨入访问可用性 6.运用统计学 7.服务提供商支持的最小网络利用性能（如99.99%有效工作时间或每天最多1分钟的停机时间） 8.各类客户的流量优先权 9.客户技术支持和服务 10.惩罚规定，为服务提供商不能满足SLA需求所指定 按照SLA要求，服务提供商采用多种技术和解决方案去监控和管理网络性能及流量，以满足SLP中相关需求，并产生对应的客户结果报告。 另一方面，客户本身也提出了自己的技术及解决方案去监控邻居的流量和服务，以确保提供他们答应的传送服务项目。 SLP（服务定位协议）： SLP，Service [...]]]></description>
			<content:encoded><![CDATA[<p>博客里没什么内容可写，就记录一下自己最近接触的词语吧。最近了解了很多词语，有些是自己以前就知道了，就不记了。有些自己知道但有时会迷糊的和自己之前不知道的，都记录了下来。有些是我遇到的，有些是延伸出来的。也不知道这些词语能否称为计算机术语，这些是我从<a href="http://baike.baidu.com" target="_blank">百科</a>词条上摘录下来的，改动的地方很少。<span id="more-30423"></span></p>
<p><strong>异步：</strong></p>
<p><a href="http://baike.baidu.com/view/190230.htm" target="_blank">异步</a>（asynchronous）是一种通讯方式，即通讯双方不需要有共同的时钟，也就是说接收方不知道发送方何时发送，因此发送方在发送的数据中需要含有提示接收方开始接收的信息，如开始接收时有“开始位”，停止接收时有“停止位”。</p>
<p>异步通信在发送字符时，所发送的字符之间的时间间隔可以是任意的。当然，接收端必须时刻做好接收的准备（如果接收端主机的电源都没有加上，那么发送端发送字符就没有意义，因为接收端根本无法接收）。发送端可以在任意时刻开始发送字符，因此必须在每一个字符的开始和结束的地方加上标志，即加上开始位和停止位，以便使接收端能够正确地将每一个字符接收下来。异步通信的好处是通信设备简单、便宜，但传输效率较低（因为开始位和停止位的开销所占比例较大）。</p>
<p>在编程中，异步的概念和同步相对，当一个异步过程调用发出后，调用者不能够立刻得到结果。实际处理这个调用的部件在完成后，通过状态、通知和回调来通知调用者。</p>
<p><strong>同步：</strong></p>
<p><a href="http://baike.baidu.com/view/54180.htm" target="_blank">同步</a>（synchronous,sync,synchronism,synchronization）就是协同步调，按预定的先后次序进行运行。指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系。</p>
<p>在编程中，同步就是在发出一个功能调用时，在没有得到结果之前，该调用就不返回，同时其他线程也不能调用这个方法。一般而言，我们所说的同步特指那些需要其他部件协作或者需要一定时间完成的任务。</p>
<p>在通信中领域，同步通信的通信双方必须先建立同步，即双方的时钟要调整到同一个频率。收发双方不停地发送和接收连续的同步比特流。但这分为两种不同情况的同步方式。一种是全网同步，即用一个非常精确的主时钟对全网所有结点上的时钟进行同步。另一种是准同步，即各结点的时钟之间允许有微小的误差，然后采用其他实现同步传输。</p>
<p><strong>进程同步：</strong></p>
<p>进程同步是指一组相互协调的进程，在完成同一任务，对某些共享资源进行操作时，为协调资源占用而相互等待、相互交换信息所产生的制约关系。（互斥是指并发进程间因相互竞争使用独占资源所生产的制约关系。）</p>
<p><strong>REST：</strong></p>
<p><a href="http://baike.baidu.com/view/1077487.htm" target="_blank">REST</a>(Representation State Transfer,表述性状态转移)是一种针对网络应用的设计和开发方式，可以降低开发的复杂性，提高系统的可伸缩性。</p>
<p>REST的设计理念和准则如下：</p>
<p>1.网络上的所有事物都被抽象为资源（resource）；<br />
2.每个资源对应一个唯一的资源标识（resource identifier）；<br />
3.通过通用的连接器接口（generic connector interface）对资源进行操作；<br />
4.对资源的各种操作不会改变资源标识；<br />
5.所有的操作都是无状态的（stateless）。</p>
<p>对于当今最常见的网络应用来说，resource identifier是URL，generic connector interface是HTTP，第4条准则就是我们常说的URL不变性。这些概念中的resource最容易使人产生误解。resource所指的并不是数据，而是数据+特点的表现形式（representation），这也是为什么REST的全名是Representation State Transfer的原因。举个例子来说，“中国最大的10家网络公司”和“你最喜欢的10家网络公司”在数据上可能有重叠（即有一家网络公司是中国前十大，并且你又喜欢），甚至完全相同（中国最大的前10家网络公司也是你最喜欢的10家网络公司）。但是他们 的representation不同，因此是不同的resource。</p>
<p><strong>REST之所以能够简化开发</strong>，是因为引入的架构约束，比如Rails1.2（Rails是一个更符合实际需要而且更高效的Web开发框架，其结合了PHP体系的优点&lt;快速开发&gt;和Java体系的优点&lt;程序规整&gt;。）中对REST的实现默认把controller中的方法限制在7个（index,show,new,edit,create,update,destory），其实就是对CRUD的实现。更进一步讲，Rails使用HTTP作为generic connector interface，HTTP规则把对一个URL的操作限制在了4个之内（GET,POST,PUT,DELETE）。</p>
<p><strong>REST之所以能够提高系统的可伸缩性</strong>，是因为它强制所有操作都是stateless的，这样就没有context的约束，如果要做分布式、做集群，就不需要考虑context的问题了。同时，它令系统可以有效地使用pool。REST对性能的另一个提升来自其对client和server任务的分配：server只负责提供resource以及操作resource的服务，而client要根据resource中的data和representation自己做render，这就减少了服务器的开销。</p>
<p><strong>SLA（服务等级协议）：</strong></p>
<p><a href="http://baike.baidu.com/view/163802.htm" target="_blank">SAL</a>，Service-Level Agreement的缩写，意思是服务等级协议。</p>
<p>服务等级协议是关于网络服务提供商和客户间的一份合同，其中定义了服务类型、服务质量和客户付款等术语。</p>
<p>典型的SLA包括以下几条：</p>
<p>1.分配给客户的最小带宽<br />
2.客户带宽极限<br />
3.有同时服务的客户数目<br />
4. 在可能影响用户行为的网络变化之前的通知安排<br />
5.拨入访问可用性<br />
6.运用统计学<br />
7.服务提供商支持的最小网络利用性能（如99.99%有效工作时间或每天最多1分钟的停机时间）<br />
8.各类客户的流量优先权<br />
9.客户技术支持和服务<br />
10.惩罚规定，为服务提供商不能满足SLA需求所指定</p>
<p>按照SLA要求，服务提供商采用多种技术和解决方案去监控和管理网络性能及流量，以满足<a href="http://baike.baidu.com/view/875780.htm" target="_blank">SLP</a>中相关需求，并产生对应的客户结果报告。</p>
<p>另一方面，客户本身也提出了自己的技术及解决方案去监控邻居的流量和服务，以确保提供他们答应的传送服务项目。</p>
<p><strong>SLP（服务定位协议）：</strong></p>
<p><a href="http://baike.baidu.com/view/875780.htm" target="_blank">SLP</a>，Service Location Protocol，服务定位协议。SLP为网络服务的发现和选择提供一种可扩展构架。通过SLP协议，使用Internet服务的计算机不再需要那么多为网络应用程序服务的静态配置。这对便携式电脑或性急的或无法满足网络系统管理需求的用户来说尤其重要。</p>
<p>习惯上，用户使用网络主机名（可读的文本字符串），也称为网络地址的别名找到服务。SLP使得用户不再需要通过获取网络主机名得到支持服务，用户为服务命名并提供属性集。SLP允许用户将这些描述捆绑到服务的网络地址上。</p>
<p>SLP为局域网的应用程序提供了一种动态配置机制，但它不是整个互联网的全球网络方案系统，而只是服务于提供共享服务的企业网络。作为客户机模型的应用程序需要发现企业网络中远端的服务器，而对于拥有很多不同可用服务、客户机的系统，采纳此协议可以充分利用邻近目录代理为发布的服务提供集中存储点。</p>
<p><strong>RPC（行程过程调用协议）：</strong></p>
<p>RPC，Remote Procedure Call Protocol，远程过程调用协议。RPC是一种通过网络从远程计算机程序上请求服务，而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在，如TCP和UDP，为通信程序之间携带信息数据。在OSI网络通信模型中，RPC跨跃了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。</p>
<p><a href="http://baike.baidu.com/view/32726.htm" target="_blank">RPC</a>采用客户机/服务器模式。请求程序就是一个客户机，而服务提供程序就是一个服务器。首先，调用进程发送一个有进程参数的调用信息到服务进程，然后等待应答信息。在服务器端，进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达，服务器获得进程参数，计算结果，发送答复信息，然后等待下一个调用信息，最后，客户端调用过程接收答复信息，获得进程结果，然后调用执行继续进行。</p>
<p><strong>InnoDB：</strong></p>
<p><a href="http://baike.baidu.com/view/1238935.htm" target="_blank">InnoDB</a>是事务型数据库的首选引擎，支持ACID（ACID指数据库事务正确执行的四个基本要素的缩写，原子性，一致性，隔离性、持久性）事务，支持等级锁定。InnoDB是为处理巨大数据量时做的最大性能设计。InnoDB存储引擎完全与MySQL服务器整合，InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB存储它的表和索引在一个表空间中，表空间可以包含数个文件（或原始磁盘分区）。这与MyISAM表不同，比如在MyISAM表中每个表被存在分享的文件中。InnoDB表可以是任何尺寸，即使在文件尺寸被限制为2GB的操作系统上。InnoDB默认被包含在MySQL二进制分发中。</p>
<p>InnoDB为MySQL提供了具有事务（transaction）、回滚（rollback）和崩溃修复能力（crash recovery capabilitis）、多版本控制（multi-versioned concurrency control）的事务安全（transaction-safe(ACID compliant)）型表。InnoDB提供了行级锁（locking on row level），提供与Oracle类似的不加锁读取（non-locking read in SELECTs）。InnoDB锁定在行级并且也为SELECT语句提供一个Oracle风格一致的非锁定读。这些特色增加了多用户部署和性能。没有在InnoDB中扩大锁定的需要，因为在InnoDB中行级锁定适合非常小的空间。InnoDB也支持FOREIGN KEY强制。在SQL查询中，你可以自由地将InnoDB类型的表与其他MySQL类型混合起来，甚至在同一个查询中也可以混合。这些特性均提高了多用户并发操作的性能表现。在InnoDB表中不需要扩大锁定（lock escalation），因为InnoDB的行级锁定（row level locks）适宜非常小的空间。InnoDB是MySQL上第一个提供外键约束（FOREIGN KEY constraints）的表引擎。</p>
<p><strong>MyISAM：</strong></p>
<p><a href="http://baike.baidu.com/view/1238940.htm" target="_blank">MyISAM</a>是默认存储引擎。它基于更老的ISAM代码，但有很多有用的扩展。（另，MySQL5.1不支持ISAM）。每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始，扩展名指出文件类型。文件存储表的扩展名是.frm；数据文件的扩展名为.MYD（MYDATA）；索引文件的扩展名是.MYI（MyIndex）。MyISAMchk工具可以检查和修复MyISAM表。</p>
<p><strong>InnoDB与MyISAM的基本差别：</strong></p>
<p>MyISAM类型不支持事务处理等高级处理，而InnoDB类型支持。MyISAM类型的表强调的是性能，其执行速度比InnoDB类型更快，但是不提供事务支持，而InnoDB提供事务支持以及外部键等高级数据库功能。</p>
<p style="font-weight: bold;">&copy; 2011, <a href="http://chenzhiwei.net">chenzhiwei.net</a>. 版权所有.  <br />本文永久链接：<a title="这个周接触的几个词语" href="http://chenzhiwei.net/2011/03/some-words-related-to-compute-science/">http://chenzhiwei.net/2011/03/some-words-related-to-compute-science/</a></p><hr /><div  class="related_post_title">随机日志</div><ul class="related_post"><li><a href="http://chenzhiwei.net/2010/10/enterprise-mail-and-domain-mail/" title="汇总一下免费企业邮箱和域名邮箱">汇总一下免费企业邮箱和域名邮箱</a></li><li><a href="http://chenzhiwei.net/2010/06/recommend-to-use-7-zip-to-extract-and-compress/" title="推荐使用7-Zip软件进行解压缩">推荐使用7-Zip软件进行解压缩</a></li><li><a href="http://chenzhiwei.net/2010/12/usage-of-assert-lib/" title="C/C++中assert的用法">C/C++中assert的用法</a></li><li><a href="http://chenzhiwei.net/2009/02/yuming-daoqi-chaxun/" title="中国国内域名到期查询、国际域名到期查询">中国国内域名到期查询、国际域名到期查询</a></li><li><a href="http://chenzhiwei.net/2011/03/linux-nfs-vsftp-samba/" title="Linux下的NFS,VSFTP,Samba的简单配置">Linux下的NFS,VSFTP,Samba的简单配置</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://chenzhiwei.net/2011/03/some-words-related-to-compute-science/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>TCP/IP协议简介</title>
		<link>http://chenzhiwei.net/2011/01/tcp-and-ip-protocol/</link>
		<comments>http://chenzhiwei.net/2011/01/tcp-and-ip-protocol/#comments</comments>
		<pubDate>Wed, 05 Jan 2011 03:10:51 +0000</pubDate>
		<dc:creator>zhiwei</dc:creator>
				<category><![CDATA[互联网络]]></category>
		<category><![CDATA[编程相关]]></category>
		<category><![CDATA[IP]]></category>
		<category><![CDATA[tcp]]></category>
		<category><![CDATA[协议]]></category>

		<guid isPermaLink="false">http://chenzhiwei.net/?p=30416</guid>
		<description><![CDATA[TCP/IP（Transmission Control Protocol/Internet Protocol）协议Internet最基本的协议，是互联网络的基础。TCP/IP协议像其他网络协议一样，也是按层次划分的，第一层都有各自功能。TCP/IP协议共分为四层，包括应用层（FTP/Email）、传输层（TCP/UDP）、网络层（IP/ICMP/IGMP）和链路层（设备驱动程序与接口卡）。 链路层 链路层有时也被称为数据链路层，通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。他们一起处理与电缆（或其他任何传输媒介）的物理接口细节。 网络层 网络层处理分组在网络中的活动，例如分组的选路。在TCP/IP协议族中，网络层协议包括IP协议（网际协议），ICMP协议（Internet互联网控制报文协议），以及IGMP协议（Internet组管理协议）。 传输层 传输层主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议族中，有两个互不相同的传输协议：TCP（传输控制协议）和UDP（用户数据报协议）。TCP为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层，确认接收到的分组，设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信，因此应用层可以忽略所有这些细节。而另一方面，UDP则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机，但并不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供。 应用层 应用层负责处理特定应用程序的细节。 PS:以后再写关于TCP/IP协议的更多内容。 &#169; 2011, chenzhiwei.net. 版权所有. 本文永久链接：http://chenzhiwei.net/2011/01/tcp-and-ip-protocol/相关日志内网IP和公网IP的区别]]></description>
			<content:encoded><![CDATA[<p>TCP/IP（Transmission Control Protocol/Internet Protocol）协议Internet最基本的协议，是互联网络的基础。TCP/IP协议像其他网络协议一样，也是按层次划分的，第一层都有各自功能。TCP/IP协议共分为四层，包括应用层（FTP/Email）、传输层（TCP/UDP）、网络层（IP/ICMP/IGMP）和链路层（设备驱动程序与接口卡）。<span id="more-30416"></span></p>
<p><strong>链路层</strong></p>
<p>链路层有时也被称为数据链路层，通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。他们一起处理与电缆（或其他任何传输媒介）的物理接口细节。</p>
<p><strong>网络层</strong></p>
<p>网络层处理分组在网络中的活动，例如分组的选路。在TCP/IP协议族中，网络层协议包括IP协议（网际协议），ICMP协议（Internet互联网控制报文协议），以及IGMP协议（Internet组管理协议）。</p>
<p><strong>传输层</strong></p>
<p>传输层主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议族中，有两个互不相同的传输协议：TCP（传输控制协议）和UDP（用户数据报协议）。TCP为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层，确认接收到的分组，设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信，因此应用层可以忽略所有这些细节。而另一方面，UDP则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机，但并不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供。</p>
<p><strong>应用层</strong></p>
<p>应用层负责处理特定应用程序的细节。</p>
<p>PS:以后再写关于TCP/IP协议的更多内容。</p>
<p style="font-weight: bold;">&copy; 2011, <a href="http://chenzhiwei.net">chenzhiwei.net</a>. 版权所有.  <br />本文永久链接：<a title="TCP/IP协议简介" href="http://chenzhiwei.net/2011/01/tcp-and-ip-protocol/">http://chenzhiwei.net/2011/01/tcp-and-ip-protocol/</a></p><hr /><div  class="related_post_title">相关日志</div><ul class="related_post"><li><a href="http://chenzhiwei.net/2010/09/intranet-ip-and-public-ip-networks/" title="内网IP和公网IP的区别">内网IP和公网IP的区别</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://chenzhiwei.net/2011/01/tcp-and-ip-protocol/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>C++中const与define的区别</title>
		<link>http://chenzhiwei.net/2010/12/the-difference-between-const-and-define/</link>
		<comments>http://chenzhiwei.net/2010/12/the-difference-between-const-and-define/#comments</comments>
		<pubDate>Thu, 30 Dec 2010 07:34:39 +0000</pubDate>
		<dc:creator>zhiwei</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[const]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[define]]></category>

		<guid isPermaLink="false">http://chenzhiwei.net/?p=30413</guid>
		<description><![CDATA[const常量有数据类型，而宏（#define定义的）没有数据类型。编译器可以对const常量进行类型检查，而对宏只进行字符替换没有类型检查；const 可以用来修饰函数参数、函数返回值，在C++里还可以用来修饰函数，定义类中某个成员函数为常量函数；有些编译器还可以对const常量进行调试，但不能对宏常量进行调试。 什么是宏（macro） 在编程语言中，宏是一种抽象，它根据一系列预定义的规则替换一定的文本模式。C语言和C++语言中用#define来进行宏定义的。关于宏（macro），首先必须是合法的标识符，其次是宏中括号内的元素为宏参数（和函数的参数差不多），另外宏名的括号中的内容只能出现标识符和逗号，并且必须要标识符开头和结尾，逗号不能连续。 如下例子可以帮助你正确的认识宏： 以下宏定义是正确的： 1 2 3 4 #define FUN(a) 10        //正确，但似乎没有任何意义，如果a是表达的话，那么它不会被执行 #define FUN(a) (10) #define FUN (10) #define FUN(a,b) 10 以下宏定义是错误的： 1 2 3 4 5 #define (a) 10                    //宏名必须为标识符 #define FUN(5) (10)            //宏参数必须为标识符 #define FUN(a*b) (a*b)       //宏参数列表中不能有特殊符号 #define FUN(a,,b) (a+b)       //宏参数列表中不能有连续的逗号 #define FUN(a,10) (a*10)     //宏参数列表中不能有常量 举例：写一个含有两个参数的标准宏MAX，求二者中最大的那个数 1 #define MAX(a,b) ((a)&#62;(b)?(a):(b)) 宏能做什么 [...]]]></description>
			<content:encoded><![CDATA[<p>const常量有数据类型，而宏（#define定义的）没有数据类型。编译器可以对const常量进行类型检查，而对宏只进行字符替换没有类型检查；const 可以用来修饰函数参数、函数返回值，在C++里还可以用来修饰函数，定义类中某个成员函数为常量函数；有些编译器还可以对const常量进行调试，但不能对宏常量进行调试。<span id="more-30413"></span></p>
<p><strong>什么是宏（macro）</strong></p>
<p>在编程语言中，宏是一种抽象，它根据一系列预定义的规则替换一定的文本模式。C语言和C++语言中用#define来进行宏定义的。关于宏（macro），首先必须是合法的标识符，其次是宏中括号内的元素为宏参数（和函数的参数差不多），另外宏名的括号中的内容只能出现标识符和逗号，并且必须要标识符开头和结尾，逗号不能连续。</p>
<p><strong>如下例子可以帮助你正确的认识宏：</strong></p>
<p>以下宏定义是正确的：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define FUN(a) 10        //正确，但似乎没有任何意义，如果a是表达的话，那么它不会被执行</span>
<span style="color: #339933;">#define FUN(a) (10)</span>
<span style="color: #339933;">#define FUN (10)</span>
<span style="color: #339933;">#define FUN(a,b) 10</span></pre></td></tr></table></div>

<p>以下宏定义是错误的：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define (a) 10                    //宏名必须为标识符</span>
<span style="color: #339933;">#define FUN(5) (10)            //宏参数必须为标识符</span>
<span style="color: #339933;">#define FUN(a*b) (a*b)       //宏参数列表中不能有特殊符号</span>
<span style="color: #339933;">#define FUN(a,,b) (a+b)       //宏参数列表中不能有连续的逗号</span>
<span style="color: #339933;">#define FUN(a,10) (a*10)     //宏参数列表中不能有常量</span></pre></td></tr></table></div>

<p>举例：写一个含有两个参数的标准宏MAX，求二者中最大的那个数</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define MAX(a,b) ((a)&gt;(b)?(a):(b))</span></pre></td></tr></table></div>

<p><strong>宏能做什么</strong></p>
<p>使用宏可以减少编程错误。<br />
宏可以方便的产生嵌入代码。<br />
在某些情况下使用宏定义可以提高程序效率。</p>
<p><strong>宏与内联函数的区别</strong></p>
<p>内联函数和普通函数相比可以加快程序运行的速度，因为不需要中断调用。编译时内联函数代码直接嵌入到目标代码中，而宏只是简单的字符替换。内联函数要做类型检查，相对于宏来说更安全可靠。内联函数用于以下情况更为方便：一个函数被不断调用，函数只有简单的几行代码，且函数内不包含for、while、switch等语句。</p>
<p><strong>什么是const</strong></p>
<p>const是contant（常量）的缩写，是一个C语言（C++及其他编程语言）的关键字，它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性，另外，在观看别人代码的时候，清晰理解const所起的作用，对理解对方的程序也有一些帮助。</p>
<p><strong>下面两个例子可以帮助你掌握const用法</strong></p>
<p>（1）、</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>p
<span style="color: #993333;">char</span> <span style="color: #993333;">const</span> <span style="color: #339933;">*</span>p
<span style="color: #993333;">char</span> <span style="color: #339933;">*</span> <span style="color: #993333;">const</span> p</pre></td></tr></table></div>

<p>第1个和第2个相同，如果const位于星号的左侧，则const就是用来修饰指针所指向的变量，即指针指向为常量，不能修改指针指向对象的内容；如果const位于星号的右侧，const就是修饰指针本身，即指针本身是常量，不能修改指针的指向。</p>
<p>（2）、</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">char</span> str1<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span>       <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;abc&quot;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">char</span> str2<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span>       <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;abc&quot;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">const</span> <span style="color: #993333;">char</span> str3<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;abc&quot;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">const</span> <span style="color: #993333;">char</span> str4<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;abc&quot;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">const</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> str5  <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;abc&quot;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">const</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> str6  <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;abc&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">cout</span> <span style="color: #339933;">&lt;&lt;</span> boolalpha <span style="color: #339933;">&lt;&lt;</span> <span style="color: #009900;">&#40;</span> str1<span style="color: #339933;">==</span>str2 <span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;&lt;</span> endl<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 输出什么？</span>
<span style="color: #000066;">cout</span> <span style="color: #339933;">&lt;&lt;</span> boolalpha <span style="color: #339933;">&lt;&lt;</span> <span style="color: #009900;">&#40;</span> str3<span style="color: #339933;">==</span>str4 <span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;&lt;</span> endl<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 输出什么？</span>
<span style="color: #000066;">cout</span> <span style="color: #339933;">&lt;&lt;</span> boolalpha <span style="color: #339933;">&lt;&lt;</span> <span style="color: #009900;">&#40;</span> str5<span style="color: #339933;">==</span>str6 <span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;&lt;</span> endl<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 输出什么？</span></pre></td></tr></table></div>

<p>这个你自己去找结果吧。</p>
<p style="font-weight: bold;">&copy; 2010, <a href="http://chenzhiwei.net">chenzhiwei.net</a>. 版权所有.  <br />本文永久链接：<a title="C++中const与define的区别" href="http://chenzhiwei.net/2010/12/the-difference-between-const-and-define/">http://chenzhiwei.net/2010/12/the-difference-between-const-and-define/</a></p><hr /><div  class="related_post_title">相关日志</div><ul class="related_post"><li><a href="http://chenzhiwei.net/2010/12/usage-of-assert-lib/" title="C/C++中assert的用法">C/C++中assert的用法</a></li><li><a href="http://chenzhiwei.net/2010/06/the-keyword-static-in-c-language/" title="C语言中的static关键字">C语言中的static关键字</a></li><li><a href="http://chenzhiwei.net/2008/12/evaluate-expression/" title="数据结构：利用栈的操作实现表达式求值">数据结构：利用栈的操作实现表达式求值</a></li><li><a href="http://chenzhiwei.net/2008/12/program-jixianyouhua/" title="极限优化的编程题目">极限优化的编程题目</a></li><li><a href="http://chenzhiwei.net/2008/10/cc-programming-challenge-try-this/" title="C/C++ Programming Challenge &#8211; try this!">C/C++ Programming Challenge &#8211; try this!</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://chenzhiwei.net/2010/12/the-difference-between-const-and-define/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>海明码详解</title>
		<link>http://chenzhiwei.net/2010/12/detailed-explanation-of-hamming-code/</link>
		<comments>http://chenzhiwei.net/2010/12/detailed-explanation-of-hamming-code/#comments</comments>
		<pubDate>Sat, 18 Dec 2010 05:42:44 +0000</pubDate>
		<dc:creator>zhiwei</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[海明码]]></category>

		<guid isPermaLink="false">http://chenzhiwei.net/?p=30409</guid>
		<description><![CDATA[海明码是奇偶校验的一种扩充。它采用多位校验码的方式，在这些校验位中的每一位都对不同的信息数据位进行奇偶校验，通过合理地安排每个校验位对原始数据进行校验位组合，可以达到发现错误，纠正错误的目的。 奇偶校验是一种校验代码传输正确性的方法。根据被传输的一组二进制代码的数位中“1”的个数是奇数或偶数来进行校验。采用奇数的称为奇校验，反之，称为偶校验。采用何种校验是事先规定好的。通常专门设置一个奇偶校验位，用它使这组代码中“1”的个数为奇数或偶数。若用奇校验，则当接收端收到这组代码时，校验“1”的个数是否为奇数，从而确定传输代码的正确性。 注：奇偶较验只能知道数据在传输过程中有没有出错，而不能发现具体是哪位出错。海明码可以发现出数据在传输过程中哪一位出错。但有一点必须明白，奇偶较验和海明码较验都是只能较验一位出错的情况。 假设数据位有m位，如何设定校验位k的长度才能满足纠正一位错误的要求呢?我们这里做一个简单的推导。k位的校验码可以有2^k个值。显然，其中一个值表示数据是正确的，而剩下的2^k –1个值意味着数据中存在错误，如果能够满足： 2^k–1&#62;=m + k (m + k为编码后的总长度)，在理论上k个校验码就可以判断是哪一位(包括信息码和校验码)出现问题。 需要注意的是：数据有m位，较验码有k位，合起来也是就信息码，共有m+k位，并且只能有1位在传输中出错，那么这个m+k位的信息码出错的可能性就有m+k种（第1位出错，第2位出错，第3位出错，&#8230;第m位出错&#8230;第m+k位出错）。较验码有k位，那么这k位较验码有2^k个组合（0000&#8230;-1111&#8230;），这2^k个组合对应着m+k种出错和1种不出错，所以k应该满足2^k-1&#62;m+k，只有这样才能让k位较验码来校验这m+k位数据是否会出错。 更详细的介绍来看这里：https://docs.google.com/View?id=dhjhtxtq_1f8nkhbdh &#169; 2010, chenzhiwei.net. 版权所有. 本文永久链接：http://chenzhiwei.net/2010/12/detailed-explanation-of-hamming-code/相关日志Shell I/O重定向一个apache为两个不同端口的网站提供服务haproxy是个什么东西Linux下的NFS,VSFTP,Samba的简单配置Linux内核基本结构]]></description>
			<content:encoded><![CDATA[<p>海明码是奇偶校验的一种扩充。它采用多位校验码的方式，在这些校验位中的每一位都对不同的信息数据位进行奇偶校验，通过合理地安排每个校验位对原始数据进行校验位组合，可以达到发现错误，纠正错误的目的。<span id="more-30409"></span></p>
<p>奇偶校验是一种校验代码传输正确性的方法。根据被传输的一组二进制代码的数位中“1”的个数是奇数或偶数来进行校验。采用奇数的称为奇校验，反之，称为偶校验。采用何种校验是事先规定好的。通常专门设置一个奇偶校验位，用它使这组代码中“1”的个数为奇数或偶数。若用奇校验，则当接收端收到这组代码时，校验“1”的个数是否为奇数，从而确定传输代码的正确性。</p>
<p>注：奇偶较验只能知道数据在传输过程中有没有出错，而不能发现具体是哪位出错。海明码可以发现出数据在传输过程中哪一位出错。但有一点必须明白，奇偶较验和海明码较验都是只能较验一位出错的情况。</p>
<p>假设数据位有m位，如何设定校验位k的长度才能满足纠正一位错误的要求呢?我们这里做一个简单的推导。k位的校验码可以有2^k个值。显然，其中一个值表示数据是正确的，而剩下的2^k –1个值意味着数据中存在错误，如果能够满足： 2^k–1&gt;=m + k (m + k为编码后的总长度)，在理论上k个校验码就可以判断是哪一位(包括信息码和校验码)出现问题。</p>
<p><strong>需要注意的是：</strong>数据有m位，较验码有k位，合起来也是就信息码，共有m+k位，并且只能有1位在传输中出错，那么这个m+k位的信息码出错的可能性就有m+k种（第1位出错，第2位出错，第3位出错，&#8230;第m位出错&#8230;第m+k位出错）。较验码有k位，那么这k位较验码有2^k个组合（0000&#8230;-1111&#8230;），这2^k个组合对应着m+k种出错和1种不出错，所以k应该满足2^k-1&gt;m+k，只有这样才能让k位较验码来校验这m+k位数据是否会出错。</p>
<p>更详细的介绍来看这里：<a href="https://docs.google.com/View?id=dhjhtxtq_1f8nkhbdh" target="_blank">https://docs.google.com/View?id=dhjhtxtq_1f8nkhbdh</a></p>
<p style="font-weight: bold;">&copy; 2010, <a href="http://chenzhiwei.net">chenzhiwei.net</a>. 版权所有.  <br />本文永久链接：<a title="海明码详解" href="http://chenzhiwei.net/2010/12/detailed-explanation-of-hamming-code/">http://chenzhiwei.net/2010/12/detailed-explanation-of-hamming-code/</a></p><hr /><div  class="related_post_title">相关日志</div><ul class="related_post"><li><a href="http://chenzhiwei.net/2011/08/shell-io-redirection/" title="Shell I/O重定向">Shell I/O重定向</a></li><li><a href="http://chenzhiwei.net/2011/07/one-apache-hosts-two-site-with-different-port/" title="一个apache为两个不同端口的网站提供服务">一个apache为两个不同端口的网站提供服务</a></li><li><a href="http://chenzhiwei.net/2011/05/what-is-haproxy/" title="haproxy是个什么东西">haproxy是个什么东西</a></li><li><a href="http://chenzhiwei.net/2011/03/linux-nfs-vsftp-samba/" title="Linux下的NFS,VSFTP,Samba的简单配置">Linux下的NFS,VSFTP,Samba的简单配置</a></li><li><a href="http://chenzhiwei.net/2010/12/the-basic-structure-of-linux-kernel/" title="Linux内核基本结构">Linux内核基本结构</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://chenzhiwei.net/2010/12/detailed-explanation-of-hamming-code/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>C/C++中assert的用法</title>
		<link>http://chenzhiwei.net/2010/12/usage-of-assert-lib/</link>
		<comments>http://chenzhiwei.net/2010/12/usage-of-assert-lib/#comments</comments>
		<pubDate>Fri, 17 Dec 2010 04:59:56 +0000</pubDate>
		<dc:creator>zhiwei</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[assert]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[STL]]></category>
		<category><![CDATA[类库]]></category>

		<guid isPermaLink="false">http://chenzhiwei.net/?p=30407</guid>
		<description><![CDATA[assert宏能测试传入表达式的真假值，当表达式为真(true)，则不会有任何反应；当表达式为假(false)，则函数将输出错误信息，并中断程序的执行。 assert宏可以用来判断某表达式的真假值，并在程序执行的过程中实时响应错误信息，因此在程序开发的过程中，常常被用来作程序纠错的工具，当程序开发完成，只需要在加载头文件前面，利用#define指令定义NDEBUG这个关键字，则所有assert都会失效，源程序不需做任何修改。 当传入的表达式为真，则assert不会有任何响应；当表达式为假时，assert函数会显示出发生错误的表达式、源代码文件名以及发生错误的程序代码行数，并调用abort函数，结束程序执行。 今天在群里讨论了一下关于assert用法的问题，自己现在算是明白了。 代码如下： 1 2 3 4 5 6 7 8 9 10 int main&#40;&#41; &#123; int i=0; while&#40;i!=9&#41; &#123; i+=2; assert&#40;i++&#41;; &#125; return 0; &#125; 问，这个循环了多少次？ 注意：assert is designed to capture programming errors, not user or running errors。所以不要滥用assert。诸如assert(i++)之类的用法毫无意义。 关于assert的说明在这里：http://www.cplusplus.com/reference/clibrary/cassert/assert/ &#169; 2010, chenzhiwei.net. 版权所有. 本文永久链接：http://chenzhiwei.net/2010/12/usage-of-assert-lib/相关日志C++中const与define的区别C语言中的static关键字数据结构：利用栈的操作实现表达式求值极限优化的编程题目C/C++ Programming Challenge &#8211; try this!]]></description>
			<content:encoded><![CDATA[<p>assert宏能测试传入表达式的真假值，当表达式为真(true)，则不会有任何反应；当表达式为假(false)，则函数将输出错误信息，并中断程序的执行。</p>
<p>assert宏可以用来判断某表达式的真假值，并在程序执行的过程中实时响应错误信息，因此在程序开发的过程中，常常被用来作程序纠错的工具，当程序开发完成，只需要在加载头文件前面，利用#define指令定义NDEBUG这个关键字，则所有assert都会失效，源程序不需做任何修改。<span id="more-30407"></span></p>
<p>当传入的表达式为真，则assert不会有任何响应；当表达式为假时，assert函数会显示出发生错误的表达式、源代码文件名以及发生错误的程序代码行数，并调用abort函数，结束程序执行。</p>
<p>今天在群里讨论了一下关于assert用法的问题，自己现在算是明白了。</p>
<p>代码如下：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">!=</span><span style="color: #0000dd;">9</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		i<span style="color: #339933;">+=</span><span style="color: #0000dd;">2</span><span style="color: #339933;">;</span> 
		assert<span style="color: #009900;">&#40;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>问，这个循环了多少次？</p>
<p>注意：assert is designed to capture programming errors, not user or running errors。所以不要滥用assert。诸如assert(i++)之类的用法毫无意义。</p>
<p>关于assert的说明在这里：<a href="http://www.cplusplus.com/reference/clibrary/cassert/assert/">http://www.cplusplus.com/reference/clibrary/cassert/assert/</a></p>
<p style="font-weight: bold;">&copy; 2010, <a href="http://chenzhiwei.net">chenzhiwei.net</a>. 版权所有.  <br />本文永久链接：<a title="C/C++中assert的用法" href="http://chenzhiwei.net/2010/12/usage-of-assert-lib/">http://chenzhiwei.net/2010/12/usage-of-assert-lib/</a></p><hr /><div  class="related_post_title">相关日志</div><ul class="related_post"><li><a href="http://chenzhiwei.net/2010/12/the-difference-between-const-and-define/" title="C++中const与define的区别">C++中const与define的区别</a></li><li><a href="http://chenzhiwei.net/2010/06/the-keyword-static-in-c-language/" title="C语言中的static关键字">C语言中的static关键字</a></li><li><a href="http://chenzhiwei.net/2008/12/evaluate-expression/" title="数据结构：利用栈的操作实现表达式求值">数据结构：利用栈的操作实现表达式求值</a></li><li><a href="http://chenzhiwei.net/2008/12/program-jixianyouhua/" title="极限优化的编程题目">极限优化的编程题目</a></li><li><a href="http://chenzhiwei.net/2008/10/cc-programming-challenge-try-this/" title="C/C++ Programming Challenge &#8211; try this!">C/C++ Programming Challenge &#8211; try this!</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://chenzhiwei.net/2010/12/usage-of-assert-lib/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

