<?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>Navins&#039; NoteBook</title>
	<atom:link href="http://www.32133.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.32133.com</link>
	<description>Information, Share, Coding, Java/Python/PHP/C ...</description>
	<lastBuildDate>Tue, 15 May 2012 14:25:04 +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>Berkeley DB Access Method: Hash、Btree、Queue、Recno</title>
		<link>http://www.32133.com/share/519.html</link>
		<comments>http://www.32133.com/share/519.html#comments</comments>
		<pubDate>Tue, 15 May 2012 14:23:06 +0000</pubDate>
		<dc:creator>navins</dc:creator>
				<category><![CDATA[Share]]></category>

		<guid isPermaLink="false">http://www.32133.com/?p=519</guid>
		<description><![CDATA[在数据库应用中,数据访问方式对应数据在硬盘上的存储格式和操作方法。在编写应用时，选择合适的算法可以极大的提高运算速度。大多数数据库都选用Btree算法，DB也不例外，同时还提供Hash算法、Recno算法和Queue算法。Berkeley DB的强大之一是它为这几种算法提供了差不多相同的接口，这表明当你要使用另一种算法时修改程序是简单的。程序在需要对特殊数据结构和存取模式操作时，通过不同的算法可以轻易的解决。 大多数应用要么在Btree和Hash算法之间，要么在Queue和Recno算法之间选择。 Hash 还是 Btree？ 当记录号不是用于数据存取的主键时，应该使用 Hash和Btree算法。 (如果记录号是用于数据存取的一个二级关键字，那么还是可以选择Btree算法，因为它支持一个主键和一个记录号同时存取。) Btree中的主键是有序存储，记录间的关联是依靠次序。并且其结构能随数据的插入和删除进行动态调整。为了代码的简单，DB没有实现对关键字的前缀码压缩。Btree支持对数据查询、插入、删除的常数级速度。关键字可以为任意的数据结构。 因此，当在主键有序时，Btree算法应该被使用。例如，如果主键是时间戳， 那么8点时间戳后面跟随的就是9点时间戳， 这种情况下，Btree算法一般是正确的选择。再来个例子：如果主键是名字，应用需要取出所有同姓的记录，那么Btree 存取方法同样是个好选择。 Hash 和 Btree 两种方式在小的数据集合上几乎没有性能的差别。不过，由于Hash使用的是扩展线性HASH算法（extended linear hashing），可以根据HASH表的增长进行适当的调整。所以当一个数据集合足够大且关键字为随机分布时，采用Hash算法比较好。 Queue 还是 Recno？ 当用记录号作为数据存取的主键时，应该使用 Queue和Recno存取方法。记录号由算法本身生成。实际上，这和关系型数据库中逻辑主键通常定义为int AUTO型是同一个概念。两者基本上都是建立在Btree算法之上，提供存储有序数据的接口。Queue的优势在于：由于其记录为定长，在插入操作时把记录插入到队列的尾部，所以速度最快，而且它执行上锁和并发处理的水平也相当高。 Recno 的长处在于它支持一些Queue不能实现的特征，比如可变长记录和支持flat-text文件。 记录号可以是可变的或者不变的： 可变指的是当记录被删除或者插入记录号发生变化；不变指的是记录号无论数据库如何操作，记录号都不会发生改变。 基于记录号存取在Btree方式下也是可行的。但是，记录号是可变，当记录删除或插入时，数据库内的其他记录的记录号都将发生改变。 Queue存取方法总是用固定的方式运行，不管数据库如何操作，记录号始终改变。 Recno 可以被设置为不变和可变两种形式。 另外，Recno为数据库提供支持flat-text文件的永久存储和数据在读或修改时提供一个快速的临时存储空间。 Choose Database Access Method Access Method Description Choosing Occasion B+树 关键字有序存储，并且其结构能随数据的插入和删除进行动态调整。为了代码的简单，Berkeley DB没有实现对关键字的前缀码压缩。B+树支持对数据查询、插入、删除的常数级速度。关键字可以为任意的数据结构。 1、 当Key为复杂类型时。 2、 当Key有序时。 Hash DB中实际使用的是扩展线性HASH算法（extended linear hashing），可以根据HASH表的增长进行适当的调整。关键字可以为任意的数据结构。 1、 当Key为复杂类型。 2、 当数据较大且key随机分布时。 &#160; Recno [...]]]></description>
			<content:encoded><![CDATA[<p>在数据库应用中,数据访问方式对应数据在硬盘上的存储格式和操作方法。在编写应用时，选择合适的算法可以极大的提高运算速度。大多数数据库都选用Btree算法，DB也不例外，同时还提供Hash算法、Recno算法和Queue算法。Berkeley DB的强大之一是它为这几种算法提供了差不多相同的接口，这表明当你要使用另一种算法时修改程序是简单的。程序在需要对特殊数据结构和存取模式操作时，通过不同的算法可以轻易的解决。</p>
<p>大多数应用要么在Btree和Hash算法之间，要么在Queue和Recno算法之间选择。</p>
<p>Hash 还是 Btree？<br />
<span style="color: #ff0000;">当记录号不是用于数据存取的主键时，应该使用 Hash和Btree算法。</span> (如果记录号是用于数据存取的一个二级关键字，那么还是可以选择Btree算法，因为它支持一个主键和一个记录号同时存取。)<span id="more-519"></span></p>
<p>Btree中的主键是<span style="color: #ff0000;">有序</span>存储，记录间的关联是依靠次序。并且其结构能随数据的插入和删除进行动态调整。为了代码的简单，DB没有实现对关键字的前缀码压缩。Btree支持对数据查询、插入、删除的常数级速度。关键字可以为任意的数据结构。 因此，<span style="color: #ff0000;">当在主键有序时，Btree算法应该被使用</span>。例如，如果主键是时间戳， 那么8点时间戳后面跟随的就是9点时间戳， 这种情况下，Btree算法一般是正确的选择。再来个例子：如果主键是名字，应用需要取出所有同姓的记录，那么Btree 存取方法同样是个好选择。</p>
<p><span style="color: #ff0000;">Hash 和 Btree 两种方式在小的数据集合上几乎没有性能的差别。</span>不过，由于Hash使用的是扩展线性HASH算法（extended linear hashing），可以根据HASH表的增长进行适当的调整。所以<span style="color: #ff0000;">当一个数据集合足够大且关键字为随机分布时，采用Hash算法比较好。</span></p>
<p>Queue 还是 Recno？<br />
<span style="color: #ff0000;">当用记录号作为数据存取的主键时，应该使用 Queue和Recno存取方法。</span>记录号由算法本身生成。实际上，这和关系型数据库中逻辑主键通常定义为int AUTO型是同一个概念。两者基本上都是建立在Btree算法之上，提供存储有序数据的接口。<span style="color: #ff0000;">Queue的优势在于：由于其记录为定长，在插入操作时把记录插入到队列的尾部，所以速度最快，而且它执行上锁和并发处理的水平也相当高。 Recno 的长处在于它支持一些Queue不能实现的特征，比如可变长记录和支持flat-text文件。</span></p>
<p><span style="color: #ff0000;">记录号可以是可变的或者不变的： 可变指的是当记录被删除或者插入记录号发生变化；不变指的是记录号无论数据库如何操作，记录号都不会发生改变。</span> 基于记录号存取在Btree方式下也是可行的。但是，记录号是可变，当记录删除或插入时，数据库内的其他记录的记录号都将发生改变。 Queue存取方法总是用固定的方式运行，不管数据库如何操作，记录号始终改变。 Recno 可以被设置为不变和可变两种形式。</p>
<p>另外，Recno为数据库提供支持flat-text文件的永久存储和数据在读或修改时提供一个快速的临时存储空间。</p>
<h2>Choose Database Access Method</h2>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="115"><strong>Access Method</strong></td>
<td valign="top" width="264"><strong>Description</strong></td>
<td valign="top" width="189"><strong>Choosing Occasion</strong></td>
</tr>
<tr>
<td valign="top" width="115">B+树</td>
<td valign="top" width="264">关键字有序存储，并且其结构能随数据的插入和删除进行动态调整。为了代码的简单，Berkeley DB没有实现对关键字的前缀码压缩。B+树支持对数据查询、插入、删除的常数级速度。关键字可以为任意的数据结构。</td>
<td valign="top" width="189">1、<span style="font-family: 'Times New Roman';"> </span>当Key为复杂类型时。</p>
<p>2、<span style="font-family: 'Times New Roman';"> </span>当Key有序时。</td>
</tr>
<tr>
<td valign="top" width="115">Hash</td>
<td valign="top" width="264">DB中实际使用的是扩展线性HASH算法（extended linear hashing），可以根据HASH表的增长进行适当的调整。关键字可以为任意的数据结构。</td>
<td valign="top" width="189">1、<span style="font-family: 'Times New Roman';"> </span>当Key为复杂类型。</p>
<p>2、<span style="font-family: 'Times New Roman';"> </span>当数据较大且key随机分布时。</p>
<p>&nbsp;</td>
</tr>
<tr>
<td valign="top" width="115">Recno</td>
<td valign="top" width="264">要求每一个记录都有一个逻辑纪录号，逻辑纪录号由算法本身生成。相当于关系数据库中的自动增长字段。Recho建立在B+树算法之上，提供了一个存储有序数据的接口。记录的长度可以为定长或不定长。</td>
<td valign="top" width="189">1、<span style="font-family: 'Times New Roman';"> </span>当key为逻辑记录号时。</p>
<p>2、<span style="font-family: 'Times New Roman';"> </span>当非高并发的情况下。</td>
</tr>
<tr>
<td valign="top" width="115">Queue</td>
<td valign="top" width="264">和Recno方式接近, 只不过记录的长度为定长。数据以定长记录方式存储在队列中，插入操作把记录插入到队列的尾部，相比之下插入速度是最快的。</td>
<td valign="top" width="189">1、当key为逻辑记录号时。</p>
<p>2、<span style="font-family: 'Times New Roman';"> </span>定长记录。</p>
<p>3、<span style="font-family: 'Times New Roman';"> </span>高并发的情况下。</p>
<p>&nbsp;</td>
</tr>
</tbody>
</table>
<p>来源：http://hi.baidu.com/xinzsky/blog/item/0652048176a794ddbd3e1ec5.html</p>
]]></content:encoded>
			<wfw:commentRss>http://www.32133.com/share/519.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Berkeley DB（BDB）系统结构介绍</title>
		<link>http://www.32133.com/skills/512.html</link>
		<comments>http://www.32133.com/skills/512.html#comments</comments>
		<pubDate>Fri, 04 May 2012 09:44:54 +0000</pubDate>
		<dc:creator>navins</dc:creator>
				<category><![CDATA[Skills]]></category>

		<guid isPermaLink="false">http://www.32133.com/?p=512</guid>
		<description><![CDATA[Berkeley DB是一个开放源代码的内嵌式数据库管理系统，能够为应用程序提供高性能的数据管理服务。应用它程序员只需要调用一些简单的API就可以完成对数据的访问和管理。与常用的数据库管理系统（如MySQL和Oracle等）有所不同，在Berkeley DB中并没有数据库服务器的概念。应用程序不需要事先同数据库服务建立起网络连接，而是通过内嵌在程序中的Berkeley DB函数库来完成对数据的保存、查询、修改和删除等操作。 Berkeley DB（BDB）是一个高性能的，嵌入数据库编程库，和C语言, C++, Java, Perl, Python, Tcl以及其他很多语言都有绑定。Berkeley DB可以保存任意类型的键/值对，而且可以为一个键保存多个数据。Berkeley DB可以支持数千的并发线程同时操作数据库。 Berkeley DB是由美国Sleepycat Software公司开发的一套开放源码的嵌入式数据库的程序库（database library），它为应用程序提供可伸缩的、高性能的、有事务保护功能的数据管理服务。Berkeley DB为数据的存取和管理提供了一组简洁的函数调用API接口。 它是一个经典的C-library模式的toolkit，为程序员提供广泛丰富的函数集，是为应用程序开发者提供工业级强度的数据库服务而设计的。Berkeley DB API接口其主要特点如下： 嵌入式（Embedded）：它直接链接到应用程序中，与应用程序运行于同样的地址空间中，因此，无论是在网络上不同计算机之间还是在同一台计算机的不同进程之间，数据库操作并不要求进程间通讯。 Berkeley DB为多种编程语言提供了API接口，其中包括C、C++、Java、Perl、Tcl、Python和PHP，所有的数据库操作都在程序库内部发生。多个进程，或者同一进程的多个线程可同时使用数据库，有如各自单独使用，底层的服务如加锁、事务日志、共享缓冲区管理、内存管理等等都由程序库透明地执行。 轻便灵活（Portable）：它可以运行于几乎所有的UNIX和Linux系统及其变种系统、Windows操作系统以及多种嵌入式实时操作系统之下。它在32位和64位系统上均可运行，已经被好多高端的因特网服务器、台式机、掌上电脑、机顶盒、网络交换机以及其他一些应用领域所采用。一旦Berkeley DB被链接到应用程序中，终端用户一般根本感觉不到有一个数据库系统存在。 可伸缩（Scalable）：这一点表现在很多方面。Database library本身是很精简的（少于300KB的文本空间），但它能够管理规模高达256TB的数据库。它支持高并发度，成千上万个用户可同时操纵同一个数据库。Berkeley DB能以足够小的空间占用量运行于有严格约束的嵌入式系统，也可以在高端服务器上耗用若干GB的内存和若干TB的磁盘空间。 Berkeley DB在嵌入式应用中比关系数据库和面向对象数据库要好，有以下两点原因： （1）因为数据库程序库同应用程序在相同的地址空间中运行，所以数据库操作不需要进程间的通讯。在一台机器的不同进程间或在网络中不同机器间进行进程通讯所花费的开销，要远远大于函数调用的开销； （2）因为Berkeley DB对所有操作都使用一组API接口，因此不需要对某种查询语言进行解析，也不用生成执行计划，大大提高了运行效. BerkeleyDB系统结构 Berkeley DB由五个主要的子系统构成.包括: 存取管理子系统、内存池管理子系统、事务子系统、锁子系统以及日志子系统。其中存取管理子系统作为Berkeley DB数据库进程包内部核心组件，而其他子系统都存在于Berkeley DB数据库进程包的外部。 每个子系统支持不同的应用级别。 1.数据存取子系统 数据存取（Access Methods）子系统为创建和访问数据库文件提供了多种支持。 Berkeley DB提供了以下四种文件存储方法：哈希文件、B树、定长记录（队列）和变长记录（基于记录号的简单存储方式），应用程序可以从中选择最适合的文件组织结构。程序员创建表时可以使用任意一种结构，并且可以在同一个应用程序中对不同存储类型的文件进行混合操作。 在没有事务管理的情况下，该子系统中的模块可单独使用，为应用程序提供快速高效的数据存取服务。 数据存取子系统适用于不需事务只需快速格式文件访问的应用。 2.内存池管理子系统 内存池（Memory pool）子系统对Berkeley DB所使用的共享缓冲区进行有效的管理。它允许同时访问数据库的多个进程或者进程的多个线程共享一个高速缓存，负责将修改后的页写回文件和为新调入的页分配内存空间。 它也可以独立于Berkeley DB系统之外，单独被应用程序使用，为其自己的文件和页分配内存空间。 内存池管理子系统适用于需要灵活的、面向页的、缓冲的共享文件访问的应用。 [...]]]></description>
			<content:encoded><![CDATA[<p>Berkeley DB是一个开放源代码的内嵌式数据库管理系统，能够为应用程序提供高性能的数据管理服务。应用它程序员只需要调用一些简单的API就可以完成对数据的访问和管理。与常用的数据库管理系统（如MySQL和Oracle等）有所不同，在Berkeley DB中并没有数据库服务器的概念。应用程序不需要事先同数据库服务建立起网络连接，而是通过内嵌在程序中的Berkeley DB函数库来完成对数据的保存、查询、修改和删除等操作。</p>
<p>Berkeley DB（BDB）是一个高性能的，嵌入数据库编程库，和C语言, C++, Java, Perl, Python, Tcl以及其他很多语言都有绑定。Berkeley DB可以保存任意类型的键/值对，而且可以为一个键保存多个数据。Berkeley DB可以支持数千的并发线程同时操作数据库。<br />
Berkeley DB是由美国Sleepycat Software公司开发的一套开放源码的嵌入式数据库的程序库（database library），它为应用程序提供可伸缩的、高性能的、有事务保护功能的数据管理服务。Berkeley DB为数据的存取和管理提供了一组简洁的函数调用API接口。<span id="more-512"></span></p>
<p>它是一个经典的C-library模式的toolkit，为程序员提供广泛丰富的函数集，是为应用程序开发者提供工业级强度的数据库服务而设计的。Berkeley DB API接口其主要特点如下：</p>
<p>嵌入式（Embedded）：它直接链接到应用程序中，与应用程序运行于同样的地址空间中，因此，无论是在网络上不同计算机之间还是在同一台计算机的不同进程之间，数据库操作并不要求进程间通讯。</p>
<p>Berkeley DB为多种编程语言提供了API接口，其中包括C、C++、Java、Perl、Tcl、Python和PHP，所有的数据库操作都在程序库内部发生。多个进程，或者同一进程的多个线程可同时使用数据库，有如各自单独使用，底层的服务如加锁、事务日志、共享缓冲区管理、内存管理等等都由程序库透明地执行。</p>
<p>轻便灵活（Portable）：它可以运行于几乎所有的UNIX和Linux系统及其变种系统、Windows操作系统以及多种嵌入式实时操作系统之下。它在32位和64位系统上均可运行，已经被好多高端的因特网服务器、台式机、掌上电脑、机顶盒、网络交换机以及其他一些应用领域所采用。一旦Berkeley DB被链接到应用程序中，终端用户一般根本感觉不到有一个数据库系统存在。</p>
<p>可伸缩（Scalable）：这一点表现在很多方面。Database library本身是很精简的（少于300KB的文本空间），但它能够管理规模高达256TB的数据库。它支持高并发度，成千上万个用户可同时操纵同一个数据库。Berkeley DB能以足够小的空间占用量运行于有严格约束的嵌入式系统，也可以在高端服务器上耗用若干GB的内存和若干TB的磁盘空间。</p>
<p>Berkeley DB在嵌入式应用中比关系数据库和面向对象数据库要好，有以下两点原因：</p>
<p>（1）因为数据库程序库同应用程序在相同的地址空间中运行，所以数据库操作不需要进程间的通讯。在一台机器的不同进程间或在网络中不同机器间进行进程通讯所花费的开销，要远远大于函数调用的开销；</p>
<p>（2）因为Berkeley DB对所有操作都使用一组API接口，因此不需要对某种查询语言进行解析，也不用生成执行计划，大大提高了运行效.</p>
<p>BerkeleyDB系统结构<br />
Berkeley DB由五个主要的子系统构成.包括: 存取管理子系统、内存池管理子系统、事务子系统、锁子系统以及日志子系统。其中存取管理子系统作为Berkeley DB数据库进程包内部核心组件，而其他子系统都存在于Berkeley DB数据库进程包的外部。</p>
<p>每个子系统支持不同的应用级别。</p>
<p>1.数据存取子系统<br />
数据存取（Access Methods）子系统为创建和访问数据库文件提供了多种支持。<br />
Berkeley DB提供了以下四种文件存储方法：哈希文件、B树、定长记录（队列）和变长记录（基于记录号的简单存储方式），应用程序可以从中选择最适合的文件组织结构。程序员创建表时可以使用任意一种结构，并且可以在同一个应用程序中对不同存储类型的文件进行混合操作。</p>
<p>在没有事务管理的情况下，该子系统中的模块可单独使用，为应用程序提供快速高效的数据存取服务。<br />
数据存取子系统适用于不需事务只需快速格式文件访问的应用。</p>
<p>2.内存池管理子系统<br />
内存池（Memory pool）子系统对Berkeley DB所使用的共享缓冲区进行有效的管理。它允许同时访问数据库的多个进程或者进程的多个线程共享一个高速缓存，负责将修改后的页写回文件和为新调入的页分配内存空间。</p>
<p>它也可以独立于Berkeley DB系统之外，单独被应用程序使用，为其自己的文件和页分配内存空间。<br />
内存池管理子系统适用于需要灵活的、面向页的、缓冲的共享文件访问的应用。</p>
<p>3.事务子系统<br />
事务（Transaction）子系统为Berkeley DB提供事务管理功能。它允许把一组对数据库的修改看作一个原子单位，这组操作要么全做，要么全不做。在默认的情况下，系统将提供严格的ACID事务属性，但是应用程序可以选择不使用系统所作的隔离保证。该子系统使用两段锁技术和先写日志策略来保证数据库数据的正确性和一致性。</p>
<p>它也可以被应用程序单独使用来对其自身的数据更新进行事务保护。事务子系统适用于需要事务保证数据的修改的应用。</p>
<p>4.锁子系统<br />
锁（Locking）子系统为Berkeley DB提供锁机制，为系统提供多用户读取和单用户修改同一对象的共享控制。<br />
数据存取子系统可利用该子系统获得对页或记录的读写权限；事务子系统利用锁机制来实现多个事务的并发控制。<br />
该子系统也可被应用程序单独采用。锁子系统适用于一个灵活的、快速的、可设置的锁管理器。</p>
<p>5.日志子系统<br />
日志（Logging）子系统采用的是先写日志的策略，用于支持事务子系统进行数据恢复，保证数据一致性。它不大可能被应用程序单独使用，只能作为事务子系统的调用模块。</p>
<p>以上几部分构成了整个Berkeley DB数据库系统。各部分的关系如下图所示：</p>
<p>在这个模型中，应用程序直接调用的是数据存取子系统和事务管理子系统，这两个系统进而调用更下层的内存管理子系统、锁子系统和日志子系统。</p>
<p>由于几个子系统相对比较独立，所以应用程序在开始的时候可以指定哪些数据管理服务将被使用。可以全部使用，也可以只用其中的一部分。例如，如果一个应用程序需要支持多用户并发操作，但不需要进行事务管理，那它就可以只用锁子系统而不用事务。有些应用程序可能需要快速的、单用户、没有事务管理功能的B树存储结构，那么应用程序可以使锁子系统和事务子系统失效，这样就会减少开销。</p>
<p>BerkeleyDB存储功能概述</p>
<p>Berkeley DB所管理数据的逻辑组织单位是若干个独立或有一定关系的数据库(database)，<br />
每个数据库由若干记录组成，这些记录全都被表示成(key，value)的形式.</p>
<p>如果把一组相关的(key，value)对也看作一个表的话，那么每一个数据库只允许存放一个table，<br />
这一点不同于一般的关系数据库。实际上，在Berkeley DB中所提到的“数据库”，相当于一般关系数据库系统中的表；而“key/data”对相当于关系数据库系统中的行(rows)；Berkeley DB不提供关系数据库中列直接访问的功能，<br />
而是在“key/data”对中的data项中通过实际应用来封装字段(列)。</p>
<p>在物理组织上，每一个数据库在创建的时候可以由应用程序根据其数据特点来选择一种合适的存储结构。Berkeley DB 可供选择的四种文件存储结构分别是：哈希文件、B树、定长记录(队列)和变长记录(基于记录号的简单存储方式)。</p>
<p>一个物理的文件中可以只存放一个单独的数据库，也可以存放若干相关或不相关的数据库，而且这些数据库可以分别采用除队列之外任意不同的组织方式，以队列组织的数据库只能单独存放于一个文件，不能同其他存储类型混合存放。</p>
<p>一个文件除了受最大文件长度和存储空间的约束之外，理论上可以存储任意多个数据库。<br />
因此系统定位一个数据库通常需要两个参数——“文件名”和“数据库名”，这也是Berkeley DB不同于一般关系数据库的地方。</p>
<p>Berkeley DB存储系统为应用程序提供了一系列的接口函数，用于对数据库的管理和操作。其中包括：<br />
(1)数据库的创建、打开、关闭、删除、重命名等，以及对数据的检索和增删改操作；<br />
(2)提供一些附加的功能，例如读取数据库状态信息、读取所在文件的信息、读取所在数据库环境的信息、清空数据库的内容、数据库的同步备份、版本升级、提示出错信息等等；<br />
(3)系统还提供了游标机制，用于存取和访问成组的数据，以及对两个或多个相关数据库进行关联和等值连接操作；<br />
(4)系统还给出了一些接口函数用于对存取策略进行优化配置，比如应用程序可以自己设置B树的排序比较函数、每页中存放key的最少数目，哈希桶的填充因子、哈希函数、哈希表最大长度，队列的最大长度，数据库存放的字节顺序，底层存储页的大小，内存分配函数，高速缓存的大小，定长记录的大小和填充位，变长记录所用的分隔符等等。<br />
Berkeley DB所在公司Sleepycat已经被Oracle收购了，用来对付MySQL，进一步丰富了Oralce的产品线。</p>
<p>Berkeley DB 特点/特性</p>
<p>简单、小巧、可靠、高性能，小而精。将Berkeley DB和我们的程序共同编译为一个程序（嵌入），和我们的程序运行在相同的地址空间，既没有网络通信的开销也没有进程通信的资源耗费，而且没有复杂的SQL分析解释，使用API进行直接了当的访问，当真是来的直接和快捷。Berkeley DB本身只有几百K，但却能支持256TB的数据，还支持上千用户的并发访问。<br />
真正的事务支持——可说是其最强大的特性。<br />
多线程/进程处理支持。<br />
支持热备份。</p>
<p>缺点</p>
<p>任何事务都有其缺点，Berkeley DB也是如此：<br />
Berkeley DB环境不是跨平台的；而且不支持Windows98/95这样的老系统。<br />
不可进行网络共享。<br />
对中断比较敏感。<br />
数据结构</p>
<p>Berkeley DB和关系数据库不同，它没有和关系数据库中完全对等的表的概念，而只有DBT这样的东西——就是一个Key/Data对，我们可以把key看作表的主键，而Data就是余下的n-1列。我们可以定义一个结构体，存入Data中，这样结构体的每个Field就相当于一个字段。Berkeley DB还有游标（Cursor），有了它，能够遍历多条记录，还能遍历Key相同的多记录。而Berkeley DB中最核心的数据结构就是DB了，它代表数据库，物理上就是.DB文件，我们可以设置其页面大小，存储数据的基础数据结构（平衡二叉树、哈希表、队列和记录）。另外，还有比较复杂的数据库环境DB_ENV，提供比较高级的功能：事务、多线程、日志、备份和恢复等。</p>
<p>应用场景</p>
<p>Berkeley DB是专注于某些应用场景的专注型产品，它适合于使用在嵌入式系统或者某些在某些消费类软件中存储简单的数据。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.32133.com/skills/512.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TF-IDF和中文分词开源项目</title>
		<link>http://www.32133.com/labrary/501.html</link>
		<comments>http://www.32133.com/labrary/501.html#comments</comments>
		<pubDate>Sat, 28 Apr 2012 09:18:21 +0000</pubDate>
		<dc:creator>navins</dc:creator>
				<category><![CDATA[Labrary]]></category>

		<guid isPermaLink="false">http://www.32133.com/?p=501</guid>
		<description><![CDATA[中文分词(Chinese Word Segmentation)指的是将一个汉字序列切分成一个一个单独的词。中文分词是文本挖掘的基础，对于输入的一段中文，成功的进行中文分词，可以达到电脑自动识别语句含义的效果。 TF-IDF（term frequency–inverse document frequency）是一种用于信息搜索和信息挖掘的常用加权技术。在搜索、文献分类和其他相关领域有广泛的应用。 TF-IDF的主要思想是，如果某个词或短语在一篇文章中出现的频率TF高，并且在其他文章中很少出现，则认为此词或者短语具有很好的类别区分能力，适合用来分类。TF词频(Term Frequency)指的是某一个给定的词语在该文件中出现的次数。IDF反文档频率(Inverse Document Frequency)的主要思想是：如果包含词条的文档越少，IDF越大，则说明词条具有很好的类别区分能力。 使用TF*IDF可以计算某个关键字在某篇文章里面的重要性，因而识别这篇文章的主要含义，实现计算机读懂文章的功能。 常见中文分词开源项目： SCWS： Hightman开发的一套基于词频词典的机械中文分词引擎，它能将一整段的汉字基本正确的切分成词。采用的是采集的词频词典，并辅以一定的专有名称，人名，地名，数字年代等规则识别来达到基本分词，经小范围测试大概准确率在 90% ~ 95% 之间，已能基本满足一些小型搜索引擎、关键字提取等场合运用。45Kb左右的文本切词时间是0.026秒，大概是1.5MB文本/秒，支持PHP4和PHP 5。 ICTCLAS： 这可是最早的中文开源分词项目之一，ICTCLAS在国内973专家组组织的评测中活动获得了第一名，在第一届国际中文处理研究机构SigHan组织的评测中都获得了多项第一名。ICTCLAS3.0分词速度单机996KB/s，分词精度98.45%，API不超过200KB，各种词典数据压缩后不到3M.ICTCLAS全部采用C/C++编写，支持Linux、FreeBSD及Windows系列操作系统，支持C/C++、C#、Delphi、Java等主流的开发语言。 HTTPCWS： HTTPCWS 是一款基于HTTP协议的开源中文分词系统，目前仅支持Linux系统。HTTPCWS 使用“ICTCLAS 3.0 2009共享版中文分词算法”的API进行分词处理，得出分词结果。HTTPCWS 将取代之前的 PHPCWS 中文分词扩展。 庖丁解牛分词： Java 提供lucence 接口，仅支持Java语言。 CC-CEDICT： 一个中文词典开源项目，提供一份以汉语拼音为中文辅助的汉英辞典，截至2009年2月8日，已收录82712个单词。其词典可以用于中文分词使用，而且不存在版权问题。Chrome中文版就是使用的这个词典进行中文分词的。 基于VB/ASP的中文分词 上面的开源项目没有给予VB和ASP的，这里提供一个简单的VB/ASP类，加上词典之后就可以进行分词了，注意这个类只供演示，其分词速度极慢不适合实际应用。 类名为：WordSplit Private rootTable As String Private Function GetCount(ByVal s As String) As Long GetCount = InStr(1, rootTable, [...]]]></description>
			<content:encoded><![CDATA[<p>中文分词(Chinese Word Segmentation)指的是将一个汉字序列切分成一个一个单独的词。中文分词是文本挖掘的基础，对于输入的一段中文，成功的进行中文分词，可以达到电脑自动识别语句含义的效果。</p>
<p>TF-IDF（term frequency–inverse document frequency）是一种用于信息搜索和信息挖掘的常用加权技术。在搜索、文献分类和其他相关领域有广泛的应用。</p>
<p>TF-IDF的主要思想是，如果某个词或短语在一篇文章中出现的频率TF高，并且在其他文章中很少出现，则认为此词或者短语具有很好的类别区分能力，适合用来分类。TF词频(Term Frequency)指的是某一个给定的词语在该文件中出现的次数。IDF反文档频率(Inverse Document Frequency)的主要思想是：如果包含词条的文档越少，IDF越大，则说明词条具有很好的类别区分能力。</p>
<p>使用TF*IDF可以计算某个关键字在某篇文章里面的重要性，因而识别这篇文章的主要含义，实现计算机读懂文章的功能。</p>
<p><strong>常见中文分词开源项目：</strong></p>
<p><a href="http://www.ftphp.com/scws/" target="_blank">SCWS</a>：</p>
<p><a href="http://www.hightman.cn/" target="_blank">Hightman</a>开发的一套基于词频词典的机械中文分词引擎，它能将一整段的汉字基本正确的切分成词。采用的是采集的词频词典，并辅以一定的专有名称，人名，地名，数字年代等规则识别来达到基本分词，经小范围测试大概准确率在 90% ~ 95% 之间，已能基本满足一些小型搜索引擎、关键字提取等场合运用。45Kb左右的文本切词时间是0.026秒，大概是1.5MB文本/秒，支持PHP4和PHP 5。</p>
<p><a href="http://ictclas.org/" target="_blank">ICTCLAS</a>：</p>
<p>这可是最早的中文开源分词项目之一，ICTCLAS在国内973专家组组织的评测中活动获得了第一名，在第一届国际中文处理研究机构SigHan组织的评测中都获得了多项第一名。ICTCLAS3.0分词速度单机996KB/s，分词精度98.45%，API不超过200KB，各种词典数据压缩后不到3M.ICTCLAS全部采用C/C++编写，支持Linux、FreeBSD及Windows系列操作系统，支持C/C++、C#、Delphi、Java等主流的开发语言。</p>
<p><a href="http://code.google.com/p/httpcws" target="_blank">HTTPCWS</a>：</p>
<p>HTTPCWS 是一款基于HTTP协议的开源中文分词系统，目前仅支持Linux系统。HTTPCWS 使用“ICTCLAS 3.0 2009共享版中文分词算法”的API进行分词处理，得出分词结果。HTTPCWS 将取代之前的 <a href="http://code.google.com/p/phpcws/" target="_blank">PHPCWS 中文分词扩展</a>。</p>
<p><a href="http://code.google.com/p/paoding/" target="_blank">庖丁解牛分词</a>：</p>
<p>Java 提供lucence 接口，仅支持Java语言。</p>
<p><a href="http://us.mdbg.net/chindict/chindict.php?page=cedict" target="_blank">CC-CEDICT</a>：</p>
<p>一个中文词典开源项目，提供一份以汉语拼音为中文辅助的汉英辞典，截至2009年2月8日，已收录82712个单词。其词典可以用于中文分词使用，而且不存在版权问题。Chrome中文版就是使用的这个词典进行中文分词的。<span id="more-501"></span></p>
<p><strong>基于VB/ASP的中文分词</strong></p>
<p>上面的开源项目没有给予VB和ASP的，这里提供一个简单的VB/ASP类，加上词典之后就可以进行分词了，注意这个类只供演示，其分词速度极慢不适合实际应用。</p>
<p>类名为：WordSplit</p>
<div lang="asp">
<pre class="brush: vbnet; gutter: true">Private rootTable As String

Private Function GetCount(ByVal s As String) As Long
    GetCount = InStr(1, rootTable, s)
End Function

Public Function WordCount(ByVal strString As String, ByVal strGetWord As String) As Long
    Dim k
    k = Split(strString, strGetWord)
    WordCount = UBound(k)
End Function

&#039; 分析输入的字符串，将其切割成一个个的词语。
&#039; &lt;param name=&quot;s&quot;&gt;待切割的字符串&lt;/param&gt;
&#039; &lt;returns&gt;所切割得到的中文词语数组&lt;/returns&gt;

Public Function ParseChinese(ByVal s As String, ByVal separator As String) As String
    Dim lngLength As Long
    Dim strTemp As String
    Dim ArrayList As String
    Dim i, j

    ArrayList = &quot;&quot;
    lngLength = Len(s)
    i = 1
    While i &lt; lngLength
        strTemp = Mid(s, i, 1)
        If GetCount(strTemp) &gt; 1 Then
            j = 2
            While i + j &lt; lngLength + 1 And GetCount(Mid(s, i, j)) &gt; 0
                j = j + 1
            Wend
            strTemp = Mid(s, i, j - 1)
            i = i + j - 2
        End If
        i = i + 1
        &#039;WordAdd (temp)
        ArrayList = ArrayList + strTemp + separator
    Wend
    ParseChinese = ArrayList

End Function

Private Sub Class_Initialize()
    Dim fso, templetfile, txtfile
    templetfile = App.Path + &quot;\ChineseDictionary.txt&quot;
    Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
    Set txtfile = fso.OpenTextFile(templetfile, 1)
    rootTable = txtfile.ReadAll
    txtfile.Close
End Sub</pre>
</div>
<p>调用示例：</p>
<p>strInput = "中文分词指的是将一个汉字序列切分成一个一个单独的词。中文分词是文本挖掘的基础，对于输入的一段中文，成功的进行中文分词，可以达到电脑自动识别语句含义的效果。"<br />
Dim strWordSplit As New WordSplit<br />
strSubject = strWordSplit.ParseChinese(strInput, "|")<br />
arrSubject = Split(strSubject, "|")</p>
]]></content:encoded>
			<wfw:commentRss>http://www.32133.com/labrary/501.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php中类的反射机制</title>
		<link>http://www.32133.com/share/493.html</link>
		<comments>http://www.32133.com/share/493.html#comments</comments>
		<pubDate>Mon, 16 Apr 2012 08:27:20 +0000</pubDate>
		<dc:creator>navins</dc:creator>
				<category><![CDATA[Share]]></category>

		<guid isPermaLink="false">http://www.32133.com/?p=493</guid>
		<description><![CDATA[类反射机制可能是PHP语言中最强大，同时也是最被忽视的一个语言特性。如果你正计划实现一个特别复杂但拥有良好可扩展性的系统，那么你有必要深入了解一下PHP的类反射(Reflection)机制。 反射机制可以让你摆脱那些枯燥乏味却又极度复杂的工作，例如：自动载入插件，自动化文档生成，甚至可以扩展PHP语言本身。 一个简单的语言特性是怎么样支持这么广泛的能力的？PHP的类反射API是由一组能够让你访问程序”元数据“和关联注释的类组成。这就使得你能在程序运行时动态决定一些事情，例如，某一个类的方法么样实现。这一能力帮助你创建一个拥有良好插件体系的程序，你可以那些呆板的插件接口告别了，这意味着你能终于能尽可能少的实现那些繁琐的支持接口了。 反射不仅能让你能够访问程序的”元数据“（metadata），他还能用来实例化类，调用方法，传递参数等。反射API甚至能够让你动态的调用类的静态方法，此外自动化文档生成也是由反射实现的。 反射API 反射API是PHP内建的OOP扩展，他由一组类，异常和接口组合而成。它赋予了你分析其他类，方法，接口，参数及扩展的能力。这一扩展被形象的命名为“反射”(Reflection)。 首先让我们跳过乏味如教科书般的陈词滥调，试着使用以下反射机制，亲生感受一下他强大的威力。 &#60;?php Reflection::export(new ReflectionExtension(&#039;reflection&#039;)); ?&#62; 以上的代码会显示很长的列表，内容是反射api实例的每一个类，方法和参数细节。我们通过Reflection的export方法实现这种输出。 几乎反射API的每一部分都实现了reflector接口，ReflectionExtension也不列外。Export方法递归的显示传递进来的reflector,因此作为接口的一部分，每一个reflector都必须要实现自己的export方法。 在这个例子里，我们从ReflectionExtension类开始，它按次序输出他所有的类和接口，截至是所有的参数和方法。 使用反射，你甚至能为每一个内建的PHP类建立类似输出。要做到这一步，首先要做的就是知道载入了那些类。幸运的是这里有一个现成的方法，get_declared_classes()来实现这一步。 &#60;?php foreach(get_declared_classes() as $class){ Reflection::export(new ReflectionClass($class)); } ?&#62; get_declared_classes()返回了所有载入的类，包括内建的php类。但是如果我们只想输出用户自定义的类又该怎么办？你要做的只是在输出前做一个判断。代码如下： &#60;?php foreach(get_declared_classes() as $class){ $reflectionClass=new ReflectionClass($class); if($reflectionClass-&#62;isUserDefined()){ Reflection::export($reflectionClass); } } ?&#62;]]></description>
			<content:encoded><![CDATA[<p>类反射机制可能是PHP语言中最强大，同时也是最被忽视的一个语言特性。如果你正计划实现一个特别复杂但拥有良好可扩展性的系统，那么你有必要深入了解一下PHP的类反射(Reflection)机制。</p>
<div>反射机制可以让你摆脱那些枯燥乏味却又极度复杂的工作，例如：自动载入插件，自动化文档生成，甚至可以扩展PHP语言本身。</div>
<div>一个简单的语言特性是怎么样支持这么广泛的能力的？PHP的类反射API是由一组能够让你访问程序”元数据“和关联注释的类组成。这就使得你能在程序运行时动态决定一些事情，例如，某一个类的方法么样实现。这一能力帮助你创建一个拥有良好插件体系的程序，你可以那些呆板的插件接口告别了，这意味着你能终于能尽可能少的实现那些繁琐的支持接口了。</div>
<div>反射不仅能让你能够访问程序的”元数据“（metadata），他还能用来实例化类，调用方法，传递参数等。反射API甚至能够让你动态的调用类的静态方法，此外自动化文档生成也是由反射实现的。</div>
<div></div>
<div></div>
<div><strong>反射API</strong></div>
<div>反射API是PHP内建的OOP扩展，他由一组类，异常和接口组合而成。它赋予了你分析其他类，方法，接口，参数及扩展的能力。这一扩展被形象的命名为“反射”(Reflection)。</div>
<div>首先让我们跳过乏味如教科书般的陈词滥调，试着使用以下反射机制，亲生感受一下他强大的威力。</div>
<div>
<pre class="brush: php; gutter: true">&lt;?php
	Reflection::export(new ReflectionExtension(&#039;reflection&#039;));
?&gt;</pre>
</div>
<div><span style="font-family: Consolas, Monaco, monospace;"><span style="font-size: 12px; line-height: 18px; white-space: pre;"><span id="more-493"></span></span></span></div>
<div></div>
<div>以上的代码会显示很长的列表，内容是反射api实例的每一个类，方法和参数细节。我们通过Reflection的export方法实现这种输出。</div>
<div>
<div>几乎反射API的每一部分都实现了reflector接口，ReflectionExtension也不列外。Export方法递归的显示传递进来的reflector,因此作为接口的一部分，每一个reflector都必须要实现自己的export方法。</div>
<div></div>
<div>在这个例子里，我们从ReflectionExtension类开始，它按次序输出他所有的类和接口，截至是所有的参数和方法。</div>
<div>使用反射，你甚至能为每一个内建的PHP类建立类似输出。要做到这一步，首先要做的就是知道载入了那些类。幸运的是这里有一个现成的方法，get_declared_classes()来实现这一步。</div>
</div>
<div>
<pre class="brush: php; gutter: true">&lt;?php
	foreach(get_declared_classes() as $class){
		Reflection::export(new ReflectionClass($class));
	}
?&gt;</pre>
</div>
<div></div>
<div></div>
<div>get_declared_classes()返回了所有载入的类，包括内建的php类。但是如果我们只想输出用户自定义的类又该怎么办？你要做的只是在输出前做一个判断。代码如下：</div>
<div>
<pre class="brush: php; gutter: true">&lt;?php
foreach(get_declared_classes() as $class){
	$reflectionClass=new ReflectionClass($class);
	if($reflectionClass-&gt;isUserDefined()){
	  Reflection::export($reflectionClass);
	}
}
?&gt;</pre>
</div>
<div></div>
]]></content:encoded>
			<wfw:commentRss>http://www.32133.com/share/493.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>xhprof安装、使用说明</title>
		<link>http://www.32133.com/share/479.html</link>
		<comments>http://www.32133.com/share/479.html#comments</comments>
		<pubDate>Sun, 08 Apr 2012 10:40:31 +0000</pubDate>
		<dc:creator>navins</dc:creator>
				<category><![CDATA[Share]]></category>

		<guid isPermaLink="false">http://www.32133.com/?p=479</guid>
		<description><![CDATA[xhprof是facebook做的一个开源检测PHP执行性能的程序，帮你分析程序中到底是哪里耗时，个人觉得挺有用的。]]></description>
			<content:encoded><![CDATA[<p>xhprof是facebook做的一个开源检测PHP执行性能的程序，帮你分析程序中到底是哪里耗时，个人觉得挺有用的。</p>
<p><strong>编译安装</strong></p>
<p>依次执行如下指令：</p>
<div>
<div id="highlighter_123302">
<pre class="brush: shell; gutter: true">wget http://pecl.php.net/get/xhprof-0.9.2.tgz

tar zxf xhprof-0.9.2.tgz

cd xhprof-0.9.2/extension/

/usr/local/webserver/php/bin/phpize

./configure --with-php-config=/usr/local/webserver/php/bin/php-config

make&amp;&amp;make install</pre>
</div>
</div>
<p><strong>配置 php.ini</strong></p>
<p>在php.ini里加入</p>
<div>
<pre class="brush: php; gutter: true">[xhprof]
extension=xhprof.so;
; directory used by default implementation of the iXHProfRuns
; interface (namely, the XHProfRuns_Default class) for storing
; XHProf runs.
;
;xhprof.output_dir=&lt;directory_for_storing_xhprof_runs&gt;
xhprof.output_dir=/tmp/xhprof</pre>
</div>
<p>注:如果是64位系统需要将xhprof.so文件拷贝到相关的lib64的目录下</p>
<p><span id="more-479"></span></p>
<p><strong>将代码加入到要测试的php当中</strong></p>
<div>
<div id="highlighter_676003">
<pre class="brush: php; gutter: true">&lt;?php
// cpu:XHPROF_FLAGS_CPU 内存:XHPROF_FLAGS_MEMORY
// 如果两个一起：XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

// 要测试的php代码

$data = xhprof_disable();   //返回运行数据

// xhprof_lib在下载的包里存在这个目录,记得将目录包含到运行的php代码中
include_once &quot;xhprof_lib/utils/xhprof_lib.php&quot;;
include_once &quot;xhprof_lib/utils/xhprof_runs.php&quot;; 

$objXhprofRun = new XHProfRuns_Default();

// 第一个参数j是xhprof_disable()函数返回的运行信息
// 第二个参数是自定义的命名空间字符串(任意字符串),
// 返回运行ID,用这个ID查看相关的运行结果
$run_id = $objXhprofRun-&gt;save_run($data, &quot;xhprof&quot;);
var_dump($run_id);</pre>
</div>
<div><span style="font-family: monospace;"><span style="font-size: 12px; line-height: normal;"><br />
</span></span></div>
</div>
<p><strong>查看运行结果</strong></p>
<pre>将xhprof_lib&amp;&amp;xhprof_html相关目录copy到可以访问到的地址
访问 http://hostname/xhprof_html/index.php?run=$run_id&amp;source=xhprof 就可经看到你的php代码运行的相关情况

下面是一些参数说明
Inclusive Time                 包括子函数所有执行时间。
Exclusive Time/Self Time  函数执行本身花费的时间，不包括子树执行时间。
Wall Time                        花去了的时间或挂钟时间。
CPU Time                        用户耗的时间+内核耗的时间
Inclusive CPU                  包括子函数一起所占用的CPU
Exclusive CPU                  函数自身所占用的CPU
注: 需要使用ctype这个扩展</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.32133.com/share/479.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>python的__name__ 和self代表意义</title>
		<link>http://www.32133.com/skills/472.html</link>
		<comments>http://www.32133.com/skills/472.html#comments</comments>
		<pubDate>Sun, 08 Apr 2012 06:29:44 +0000</pubDate>
		<dc:creator>navins</dc:creator>
				<category><![CDATA[Skills]]></category>

		<guid isPermaLink="false">http://www.32133.com/?p=472</guid>
		<description><![CDATA[__name__是用来识别一个模块是直接运行还是作为一般的模块被导入的状态。 当一个模块是直接运行时，__name__就等于__main__，如果它是作为一般模块被导入时，__name__就是模块本身的名字。 示例: if __name__ == &#34;__main__&#34;: run() self是一种约定。在Python中，类方法的第一个参数表示对象本身，在Python中一般使用self。你也可以使用this. 示例: a是你想用的对象，但self是一种约定。在调用一个对象的方法时，对象本身被作为self参数传入。如： class A: def p(self, name): print name a=A() a.p(&#039;aa&#039;) 这时，相当于A.p(a, 'aa')]]></description>
			<content:encoded><![CDATA[<p>__name__是用来识别一个模块是直接运行还是作为一般的模块被导入的状态。</p>
<p>当一个模块是直接运行时，__name__就等于__main__，如果它是作为一般模块被导入时，__name__就是模块本身的名字。</p>
<p>示例:</p>
<pre class="brush: python; gutter: true">if __name__ == &quot;__main__&quot;:
    run()</pre>
<p>self是一种约定。在Python中，类方法的第一个参数表示对象本身，在Python中一般使用self。你也可以使用this.</p>
<p>示例:<br />
a是你想用的对象，但self是一种约定。在调用一个对象的方法时，对象本身被作为self参数传入。如：</p>
<pre class="brush: python; gutter: true">class A:
    def p(self, name):
        print name
a=A()
a.p(&#039;aa&#039;)</pre>
<p>这时，相当于A.p(a, 'aa')</p>
]]></content:encoded>
			<wfw:commentRss>http://www.32133.com/skills/472.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>国外苹果MacBook Pro最新传闻综合</title>
		<link>http://www.32133.com/news/467.html</link>
		<comments>http://www.32133.com/news/467.html#comments</comments>
		<pubDate>Thu, 05 Apr 2012 14:36:29 +0000</pubDate>
		<dc:creator>navins</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://www.32133.com/?p=467</guid>
		<description><![CDATA[根据国外媒体的报道，苹果将于4月发布15英寸新款MacBook Pro笔记本，机身比现有版本要薄，但要比MacBook Air厚一些，搭载的是英特尔Ivy Bridge平台酷睿i5或酷睿i7处理器。由于Intel的Ivy Bridge再三推迟发布，影响了MacBook Pro的发布日期；最近据国外多家网络媒体证实，最终Intel的Ivy Bridge于4月29日（也有台湾媒体称可能提前到23日）发布第一批， i7系列包括 i7-3770, i7-3770K, i7-3770S , i7-3770T。i5系列包括i5-3570K, i5-3550, i5-3550S, i5-3570T, i5-3450 和i5-3450S。随后6月3日将发布第二批。。 据悉新款MacBook pro 15寸笔记本将于4月底发布，肯定会晚于Intel发布日期，因此很可能搭载的是英特尔Ivy Bridge平台酷睿i5或酷睿i7处理器。而13寸MacBook Pro高配很有可能采用第二批发布的Core i7-3520M，所以将于6月份发布。并晚于Intel的第二批发布日期6月3日。期待MacBook Pro的朋友们只能hold了。 第一批发布列表： Model Cores Market Threads Frequency Turbo Frequency L3 cache Graphics TDP Price Core i5-3450 Desktop 4 4 3.1 GHz 3.5 GHz 6 MB HD 2500 77 Watt $184 Core i5-3550 [...]]]></description>
			<content:encoded><![CDATA[<p>根据国外媒体的报道，苹果将于4月发布15英寸新款MacBook Pro笔记本，机身比现有版本要薄，但要比MacBook Air厚一些，搭载的是英特尔Ivy Bridge平台酷睿i5或酷睿i7处理器。由于Intel的Ivy Bridge再三推迟发布，影响了MacBook Pro的发布日期；最近据国外多家网络媒体证实，最终Intel的Ivy Bridge于4月29日（也有台湾媒体称可能提前到23日）发布第一批， i7系列包括 i7-3770, i7-3770K, i7-3770S , i7-3770T。i5系列包括i5-3570K, i5-3550, i5-3550S, i5-3570T, i5-3450 和i5-3450S。随后6月3日将发布第二批。。</p>
<p>据悉新款MacBook pro 15寸笔记本将于4月底发布，肯定会晚于Intel发布日期，因此很可能搭载的是英特尔Ivy Bridge平台酷睿i5或酷睿i7处理器。而13寸MacBook Pro高配很有可能采用第二批发布的Core i7-3520M，所以将于6月份发布。并晚于Intel的第二批发布日期6月3日。期待MacBook Pro的朋友们只能hold了。</p>
<p><span id="more-467"></span></p>
<p>第一批发布列表：</p>
<table width="94%">
<tbody>
<tr>
<th>Model</th>
<th>Cores</th>
<th>Market</th>
<th>Threads</th>
<th>Frequency</th>
<th>Turbo<br />
Frequency</th>
<th>L3 cache</th>
<th>Graphics</th>
<th>TDP</th>
<th>Price</th>
</tr>
<tr>
<td>Core i5-3450</td>
<td>Desktop</td>
<td>4</td>
<td>4</td>
<td>3.1 GHz</td>
<td>3.5 GHz</td>
<td>6 MB</td>
<td>HD 2500</td>
<td>77 Watt</td>
<td>$184</td>
</tr>
<tr>
<td>Core i5-3550</td>
<td>Desktop</td>
<td>4</td>
<td>4</td>
<td>3.3 GHz</td>
<td>3.7 GHz</td>
<td>6 MB</td>
<td>HD 2500</td>
<td>77 Watt</td>
<td>$205</td>
</tr>
<tr>
<td>Core i5-3550S</td>
<td>Desktop</td>
<td>4</td>
<td>4</td>
<td>3 GHz</td>
<td>3.7 GHz</td>
<td>6 MB</td>
<td>HD 2500</td>
<td>65 Watt</td>
<td>$205</td>
</tr>
<tr>
<td>Core i5-3570K</td>
<td>Desktop</td>
<td>4</td>
<td>4</td>
<td>3.4 GHz</td>
<td>3.8 GHz</td>
<td>6 MB</td>
<td>HD 4000</td>
<td>77 Watt</td>
<td>$225</td>
</tr>
<tr>
<td>Core i5-3570T</td>
<td>Desktop</td>
<td>4</td>
<td>4</td>
<td>2.3 GHz</td>
<td>3.3 GHz</td>
<td>6 MB</td>
<td>HD 2500</td>
<td>45 Watt</td>
<td>$205</td>
</tr>
<tr>
<td>Core i7-3770</td>
<td>Desktop</td>
<td>4</td>
<td>8</td>
<td>3.4 GHz</td>
<td>3.9 GHz</td>
<td>8 MB</td>
<td>HD 4000</td>
<td>77 Watt</td>
<td>$294</td>
</tr>
<tr>
<td>Core i7-3770K</td>
<td>Desktop</td>
<td>4</td>
<td>8</td>
<td>3.5 GHz</td>
<td>3.9 GHz</td>
<td>8 MB</td>
<td>HD 4000</td>
<td>77 Watt</td>
<td>$332</td>
</tr>
<tr>
<td>Core i7-3770S</td>
<td>Desktop</td>
<td>4</td>
<td>8</td>
<td>3.1 GHz</td>
<td>3.9 GHz</td>
<td>8 MB</td>
<td>HD 4000</td>
<td>65 Watt</td>
<td>$294</td>
</tr>
<tr>
<td>Core i7-3770T</td>
<td>Desktop</td>
<td>4</td>
<td>8</td>
<td>2.5 GHz</td>
<td>3.7 GHz</td>
<td>8 MB</td>
<td>HD 4000</td>
<td>45 Watt</td>
<td>$294</td>
</tr>
<tr>
<td>Core i7-3720QM</td>
<td>Mobile</td>
<td>4</td>
<td>8</td>
<td>2.6 GHz</td>
<td>3.6 GHz</td>
<td>6 MB</td>
<td>HD 4000</td>
<td>45 Watt</td>
<td>$378</td>
</tr>
<tr>
<td>Core i7-3820QM</td>
<td>Mobile</td>
<td>4</td>
<td>8</td>
<td>2.7 GHz</td>
<td>3.7 GHz</td>
<td>8 MB</td>
<td>HD 4000</td>
<td>45 Watt</td>
<td>$568</td>
</tr>
<tr>
<td>Core i7-3920XM</td>
<td>Mobile</td>
<td>4</td>
<td>8</td>
<td>2.9 GHz</td>
<td>3.8 GHz</td>
<td>8 MB</td>
<td>HD 4000</td>
<td>55 Watt</td>
<td>$1096</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>第二批发布列表：</p>
<table width="94%">
<tbody>
<tr>
<th>Model</th>
<th>Market</th>
<th>Cores</th>
<th>Threads</th>
<th>Frequency</th>
<th>Turbo<br />
Frequency</th>
<th>L3 cache</th>
<th>Graphics</th>
<th>TDP</th>
<th>Price</th>
</tr>
<tr>
<td>Core i5-3470</td>
<td>Desktop</td>
<td>4</td>
<td>4</td>
<td>3.2 GHz</td>
<td>3.6 GHz</td>
<td>6 MB</td>
<td>HD 2500</td>
<td>77 Watt</td>
</tr>
<tr>
<td>Core i5-3470S</td>
<td>Desktop</td>
<td>4</td>
<td>4</td>
<td>2.9 GHz</td>
<td>3.6 GHz</td>
<td>6 MB</td>
<td>HD 2500</td>
<td>65 Watt</td>
</tr>
<tr>
<td>Core i5-3470T</td>
<td>Desktop</td>
<td>2</td>
<td>4</td>
<td>2.8 GHz</td>
<td>3.5 GHz</td>
<td>6 MB</td>
<td>HD 2500</td>
<td>35 Watt</td>
<td>$184</td>
</tr>
<tr>
<td>Core i5-3475S</td>
<td>Desktop</td>
<td>4</td>
<td>4</td>
<td>2.9 GHz</td>
<td>3.6 GHz</td>
<td>6 MB</td>
<td>HD 4000</td>
<td>65 Watt</td>
</tr>
<tr>
<td>Core i5-3570</td>
<td>Desktop</td>
<td>4</td>
<td>4</td>
<td>3.4 GHz</td>
<td>3.8 GHz</td>
<td>6 MB</td>
<td>HD 2500</td>
<td>77 Watt</td>
</tr>
<tr>
<td>Core i5-3570S</td>
<td>Desktop</td>
<td>4</td>
<td>4</td>
<td>3.1 GHz</td>
<td>3.8 GHz</td>
<td>6 MB</td>
<td>HD 2500</td>
<td>65 Watt</td>
</tr>
<tr>
<td>Core i5-3320M</td>
<td>Mobile</td>
<td>2</td>
<td>4</td>
<td>2.6 GHz</td>
<td>3.3 GHz</td>
<td>3 MB</td>
<td>HD 4000</td>
<td>35 Watt</td>
</tr>
<tr>
<td>Core i5-3320M</td>
<td>Mobile</td>
<td>2</td>
<td>4</td>
<td>2.6 GHz</td>
<td>3.3 GHz</td>
<td>3 MB</td>
<td>HD 4000</td>
<td>35 Watt</td>
</tr>
<tr>
<td>Core i5-3360M</td>
<td>Mobile</td>
<td>2</td>
<td>4</td>
<td>2.8 GHz</td>
<td>3.5 GHz</td>
<td>3 MB</td>
<td>HD 4000</td>
<td>35 Watt</td>
</tr>
<tr>
<td>Core i5-3360M</td>
<td>Mobile</td>
<td>2</td>
<td>4</td>
<td>2.8 GHz</td>
<td>3.5 GHz</td>
<td>3 MB</td>
<td>HD 4000</td>
<td>35 Watt</td>
</tr>
<tr>
<td>Core i5-3427U</td>
<td>Mobile</td>
<td>2</td>
<td>4</td>
<td>1.8 GHz</td>
<td>2.8 GHz</td>
<td>3 MB</td>
<td>HD 4000</td>
<td>17 Watt</td>
</tr>
<tr>
<td>Core i7-3520M</td>
<td>Mobile</td>
<td>2</td>
<td>4</td>
<td>2.9 GHz</td>
<td>3.6 GHz</td>
<td>4 MB</td>
<td>HD 4000</td>
<td>35 Watt</td>
</tr>
<tr>
<td>Core i7-3520M</td>
<td>Mobile</td>
<td>2</td>
<td>4</td>
<td>2.9 GHz</td>
<td>3.6 GHz</td>
<td>4 MB</td>
<td>HD 4000</td>
<td>35 Watt</td>
</tr>
<tr>
<td>Core i7-3667U</td>
<td>Mobile</td>
<td>2</td>
<td>4</td>
<td>2 GHz</td>
<td>3.2 GHz</td>
<td>4 MB</td>
<td>HD 4000</td>
<td>17 Watt</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>第三批发布（预计2012年第三季度）：</p>
<table width="94%">
<tbody>
<tr>
<th>Model</th>
<th>Market</th>
<th>Cores</th>
<th>Threads</th>
<th>Frequency</th>
<th>Turbo<br />
Frequency</th>
<th>L3 cache</th>
<th>Graphics</th>
<th>TDP</th>
</tr>
<tr>
<td>Core i3-3220</td>
<td>Desktop</td>
<td>2</td>
<td>4</td>
<td>3.3 GHz</td>
<td>N/A</td>
<td>3 MB</td>
<td>HD 2500</td>
<td>55 Watt</td>
</tr>
<tr>
<td>Core i3-3220T</td>
<td>Desktop</td>
<td>2</td>
<td>4</td>
<td>2.8 GHz</td>
<td>N/A</td>
<td>3 MB</td>
<td>HD 2500</td>
<td>35 Watt</td>
</tr>
<tr>
<td>Core i3-3225</td>
<td>Desktop</td>
<td>2</td>
<td>4</td>
<td>3.3 GHz</td>
<td>N/A</td>
<td>3 MB</td>
<td>HD 4000</td>
<td>55 Watt</td>
</tr>
<tr>
<td>Core i3-3240</td>
<td>Desktop</td>
<td>2</td>
<td>4</td>
<td>3.4 GHz</td>
<td>N/A</td>
<td>3 MB</td>
<td>HD 2500</td>
<td>55 Watt</td>
</tr>
<tr>
<td>Core i3-3240T</td>
<td>Desktop</td>
<td>2</td>
<td>4</td>
<td>3 GHz</td>
<td>N/A</td>
<td>3 MB</td>
<td>HD 2500</td>
<td>35 Watt</td>
</tr>
<tr>
<td>Core i3-3217U</td>
<td>Mobile</td>
<td>2</td>
<td>4</td>
<td>1.8 GHz</td>
<td>N/A</td>
<td>3 MB</td>
<td>HD 4000</td>
<td>17 Watt</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.32133.com/news/467.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>grep文件报错 “Binary file &#8230; matches” ，附参数说明</title>
		<link>http://www.32133.com/share/462.html</link>
		<comments>http://www.32133.com/share/462.html#comments</comments>
		<pubDate>Wed, 28 Mar 2012 14:31:55 +0000</pubDate>
		<dc:creator>navins</dc:creator>
				<category><![CDATA[Share]]></category>

		<guid isPermaLink="false">http://www.32133.com/?p=462</guid>
		<description><![CDATA[来自：http://shanchao7932297.blog.163.com/blog/static/136362420113634354832/ 问题：grep一个文件时，报错“Binary file ... matches” 使用命令 more时，内容可以正常看到 原因：文件为binary文件 解决：strings vers.log.2010-03-09 &#124; grep -i ‘mezimedia’ 或者 grep -a -i ‘mezimedia’ vers.log.2010-03-09 grep命令是linux下的行过滤工具，其参数繁多，下面就一一介绍个个参数的作用，希望对大家有所帮助。 grep -- print lines matching a pattern (将符合样式的该行列出) ◎语法: grep [options] PATTERN [FILE...] grep用以在file内文中比对相对应的部分，或是当没有指定档案时， 由标准输入中去比对。 在预设的情况下，grep会将符合样式的那一行列出。 此外，还有两个程序是grep的变化型，egrep及fgrep。 其中egrep就等同于grep -E ，fgrep等同于grep -F 。 ◎参数 1. -A NUM，--after-context=NUM 除了列出符合行之外，并且列出后NUM行。 ex:   $ grep -A 1 panda file (从file中搜寻有panda样式的行，并显示该行的后1行) 2. -a或--text grep原本是搜寻文字文件，若拿二进制的档案作为搜寻的目标， 则会显示如下的讯息: Binary file 二进制文件名 matches 然后结束。 [...]]]></description>
			<content:encoded><![CDATA[<p>来自：<a href="http://shanchao7932297.blog.163.com/blog/static/136362420113634354832/">http://shanchao7932297.blog.163.com/blog/static/136362420113634354832/</a></p>
<p>问题：grep一个文件时，报错“Binary file ... matches”<br />
使用命令 more时，内容可以正常看到</p>
<p>原因：文件为binary文件<br />
解决：strings vers.log.2010-03-09 | grep -i ‘mezimedia’<br />
或者 grep <span style="color: #0000ff;">-a </span>-i ‘mezimedia’ vers.log.2010-03-09</p>
<div>
<p>grep命令是linux下的行过滤工具，其参数繁多，下面就一一介绍个个参数的作用，希望对大家有所帮助。</p>
<p>grep -- print lines matching a pattern (将符合样式的该行列出)</p>
<p>◎语法: grep [options]<br />
PATTERN [FILE...]<br />
grep用以在file内文中比对相对应的部分，或是当没有指定档案时，<br />
由标准输入中去比对。 在预设的情况下，grep会将符合样式的那一行列出。</p>
<p>此外，还有两个程序是grep的变化型，egrep及fgrep。<br />
其中egrep就等同于grep -E ，fgrep等同于grep -F 。</p>
<p><span id="more-462"></span></p>
<p>◎参数</p>
<p>1. <span style="color: #0000ff;">-A NUM，--after-context=NUM</span><br />
除了列出符合行之外，并且列出后NUM行。</p>
<p>ex:   <span style="color: #008000;">$</span> <strong><span style="color: #ff0000;">grep</span> <span style="color: #0000ff;">-A 1</span> panda file</strong><br />
(从file中搜寻有panda样式的行，并显示该行的后1行)</p>
<p>2. <span style="color: #0000ff;">-a</span>或<span style="color: #0000ff;">--text</span><br />
grep原本是搜寻文字文件，若拿二进制的档案作为搜寻的目标，<br />
则会显示如下的讯息: <span style="color: #008000;">Binary file 二进制文件名 matches</span> 然后结束。</p>
<p>若加上<span style="color: #0000ff;">-a</span>参数则可将二进制档案视为文本文件搜寻，<br />
相当于<span style="color: #0000ff;">--binary-files=text</span>这个参数。</p>
<p>ex:    (从二进制档案mv中去搜寻panda样式)<br />
(错误!!!)<br />
<span style="color: #008000;">$</span> <strong><span style="color: #ff0000;">grep</span> panda <span style="color: #ff0000;">mv</span></strong><br />
<span style="color: #008000;">Binary file mv matches</span><br />
(这表示此档案有match之处，详见--binary-files=TYPE )<br />
<span style="color: #008000;">$</span><br />
(正确!!!)<br />
<span style="color: #008000;">$</span> <strong><span style="color: #ff0000;">grep</span> <span style="color: #0000ff;">-a</span> panda <span style="color: #ff0000;">mv</span></strong></p>
<p>3. <span style="color: #0000ff;">-B NUM，--before-context=NUM</span><br />
与 -A NUM 相对，但这此参数是显示除符合行之外<br />
并显示在它之前的NUM行。</p>
<p>ex:    (从file中搜寻有panda样式的行，并显示该行的前1行)<br />
<span style="color: #008000;">$</span> <strong><span style="color: #ff0000;">grep</span> <span style="color: #0000ff;">-B 1</span> panda file</strong></p>
<p>4. <span style="color: #0000ff;">-C [NUM], -NUM, --context[=NUM]</span><br />
列出符合行之外并列出上下各NUM行，默认值是2。</p>
<p>ex:    (列出file中除包含panda样式的行外并列出其上下2行)<br />
(若要改变默认值，直接改变NUM即可)<br />
<span style="color: #008000;">$</span> <strong><span style="color: #ff0000;">grep</span> <span style="color: #0000ff;">-C[NUM] </span>panda file</strong></p>
<p>5. <span style="color: #0000ff;">-b, --byte-offset</span><br />
列出样式之前的内文总共有多少byte ..</p>
<p>ex:  <span style="color: #008000;">$</span> <strong><span style="color: #ff0000;">grep</span> <span style="color: #0000ff;">-b </span>panda file</strong><br />
显示结果类似于:<br />
<span style="color: #008000;">   0:panda<br />
66:pandahuang<br />
123:panda03</span></p>
<p>6. <span style="color: #0000ff;">--binary-files=TYPE</span><br />
此参数TYPE预设为binary(二进制)，若以普通方式搜寻，只有2种结果:<br />
1.若有符合的地方：显示Binary file 二进制文件名 matches<br />
2.若没有符合的地方：什么都没有显示。</p>
<p>若TYPE为without-match，遇到此参数，<br />
grep会认为此二进制档案没有包含任何搜寻样式，与<span style="color: #0000ff;">-I </span>参数相同。</p>
<p>若TPYE为text, grep会将此二进制文件视为text档案，与<span style="color: #0000ff;">-a </span>参数相同。</p>
<p><strong>Warning</strong>: --binary-files=text 若输出为终端机，可能会产生一些不必要的输出。</p>
<p>7. <span style="color: #0000ff;">-c, --count</span><br />
不显示符合样式行，只显示符合的总行数。<br />
若再加上<span style="color: #0000ff;">-v,--invert-match</span>，参数显示不符合的总行数。</p>
<p>8. <span style="color: #0000ff;">-d ACTION, --directories=ACTION</span><br />
若输入的档案是一个资料夹，使用ACTION去处理这个资料夹。<br />
预设ACTION是read(读取)，也就是说此资料夹会被视为一般的档案；<br />
若ACTION是skip(略过)，资料夹会被grep略过：<br />
若ACTION是recurse(递归)，grep会去读取资料夹下所有的档案，<br />
此相当于-r 参数。</p>
<p>9.  <span style="color: #0000ff;">-E, --extended-regexp</span><br />
采用规则表示式去解释样式。</p>
<p>10.  <span style="color: #0000ff;">-e PATTERN, --regexp=PATTERN</span><br />
把样式做为一个partern，通常用在避免partern用-开始。</p>
<p>11.  <span style="color: #0000ff;">-f FILE, --file=FILE</span><br />
事先将要搜寻的样式写入到一个档案，一行一个样式。<br />
然后采用档案搜寻。<br />
空的档案表示没有要搜寻的样式，因此也就不会有任何符合。</p>
<p>ex: (newfile为搜寻样式文件)<br />
<span style="color: #008000;">$</span><strong><span style="color: #ff0000;">grep</span> <span style="color: #0000ff;">-f</span> newfile file</strong></p>
<p>12.  <span style="color: #0000ff;">-G, --basic-regexp</span><br />
将样式视为基本的规则表示式解释。(此为预设)</p>
<p>13.  <span style="color: #0000ff;">-H, --with-filename</span><br />
在每个符合样式行前加上符合的文件名称，若有路径会显示路径。</p>
<p>ex: (在file与testfile中搜寻panda样式)<br />
<span style="color: #008000;">$</span><strong><span style="color: #ff0000;">grep</span> <span style="color: #0000ff;">-H</span> panda file ./testfile</strong><br />
<span style="color: #008000;">file:panda<br />
./testfile:panda<br />
$</span></p>
<p>14.  <span style="color: #0000ff;">-h, --no-filename</span><br />
与-H参数相类似，但在输出时不显示路径。</p>
<p>15.  <span style="color: #0000ff;">--help</span><br />
产生简短的help讯息。</p>
<p>16.  <span style="color: #0000ff;">-I</span><br />
grep会强制认为此二进制档案没有包含任何搜寻样式，<br />
与<span style="color: #0000ff;">--binary-files=without-match</span>参数相同。</p>
<p>ex:  <span style="color: #008000;">$</span> <strong><span style="color: #ff0000;">grep</span> <span style="color: #0000ff;">-I </span>panda mv</strong></p>
<p>17.  <span style="color: #0000ff;">-i, --ignore-case</span><br />
忽略大小写，包含要搜寻的样式及被搜寻的档案。</p>
<p>ex:  <span style="color: #008000;">$</span> <strong><span style="color: #ff0000;">grep</span> <span style="color: #0000ff;">-i</span> panda mv</strong></p>
<p>18.  <span style="color: #0000ff;">-L, --files-without-match</span><br />
不显示平常一般的输出结果，反而显示出没有符合的文件名称。</p>
<p>19.  <span style="color: #0000ff;">-l, --files-with-matches</span><br />
不显示平常一般的输出结果，只显示符合的文件名称。</p>
<p>20.  <span style="color: #0000ff;">--mmap</span><br />
如果可能，使用mmap系统呼叫去读取输入，而不是预设的read系统呼叫。<br />
在某些状况，--mmap 能产生较好的效能。 然而，--mmap<br />
如果运作中档案缩短，或I/O 错误发生时，<br />
可能造成未定义的行为(包含core dump)，。</p>
<p>21.  <span style="color: #0000ff;">-n, --line-number</span><br />
在显示行前，标上行号。</p>
<p>ex:  <span style="color: #008000;">$</span> <strong><span style="color: #ff0000;">grep</span> <span style="color: #0000ff;">-n </span>panda file</strong><br />
显示结果相似于下:<br />
行号:符合行的内容</p>
<p>22.  <span style="color: #0000ff;">-q, --quiet, --silent</span><br />
不显示任何的一般输出。请参阅-s或--no-messages</p>
<p>23.  <span style="color: #0000ff;">-r, --recursive</span><br />
递归地，读取每个资料夹下的所有档案，此相当于 -d recsuse 参数。</p>
<p>24.  <span style="color: #0000ff;">-s, --no-messages</span><br />
不显示关于不存在或无法读取的错误讯息。</p>
<p>小注: 不像GNU grep，传统的grep不符合POSIX.2协议，<br />
因为缺乏-q参数，且他的-s 参数表现像GNU grep的 -q 参数。<br />
Shell Script倾向将传统的grep移植，避开-q及-s参数，<br />
且将输出限制到/dev/null。</p>
<p>POSIX: 定义UNIX及UNIX-like系统需要提供的功能。</p>
<p>25.  <span style="color: #0000ff;">-V, --version</span><br />
显示出grep的版本号到标准错误。<br />
当您在回报有关grep的bugs时，grep版本号是必须要包含在内的。</p>
<p>26.  <span style="color: #0000ff;">-v, --invert-match</span><br />
显示除搜寻样式行之外的全部。</p>
<p>27.  <span style="color: #0000ff;">-w, --word-regexp</span><br />
将搜寻样式视为一个字去搜寻，完全符合该"字"的行才会被列出。</p>
<p>28.  <span style="color: #0000ff;">-x, --line-regexp</span><br />
将搜寻样式视为一行去搜寻，完全符合该"行"的行才会被列出。</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.32133.com/share/462.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>wordpress显示文章浏览次数和热门文章排行</title>
		<link>http://www.32133.com/labrary/450.html</link>
		<comments>http://www.32133.com/labrary/450.html#comments</comments>
		<pubDate>Sat, 24 Mar 2012 12:57:15 +0000</pubDate>
		<dc:creator>navins</dc:creator>
				<category><![CDATA[Labrary]]></category>

		<guid isPermaLink="false">http://www.32133.com/?p=450</guid>
		<description><![CDATA[因为wordpress没有内置的显示浏览次数的小工具，那么我们只有自己加一个功能或者下载一个插件，常见的显示浏览次数的插件有WP-PostViews等几种插件，很多人应该用过这块插件，我现在这款主题也用的这个，感觉还行吧。看个人喜欢，如果不喜欢用插件也可以使用加入代码的方法。 可以将下面代码加入到functiuons.php中去。 function getPostViews($postID) { $count_key = &#039;post_views_count&#039;; $count = get_post_meta ( $postID, $count_key, true ); if ($count == &#039;&#039;) { delete_post_meta ( $postID, $count_key ); add_post_meta ( $postID, $count_key, &#039;0&#039; ); return &#34;0 View&#34;; } return $count . &#039; Views&#039;; } function setPostViews($postID) { $count_key = &#039;post_views_count&#039;; $count = get_post_meta ( $postID, $count_key, true [...]]]></description>
			<content:encoded><![CDATA[<p>因为wordpress没有内置的显示浏览次数的小工具，那么我们只有自己加一个功能或者下载一个插件，常见的显示浏览次数的插件有WP-PostViews等几种插件，很多人应该用过这块插件，我现在这款主题也用的这个，感觉还行吧。看个人喜欢，如果不喜欢用插件也可以使用加入代码的方法。</p>
<p>可以将下面代码加入到functiuons.php中去。</p>
<pre class="brush: php; gutter: true">function getPostViews($postID) {
	$count_key = &#039;post_views_count&#039;;
	$count = get_post_meta ( $postID, $count_key, true );
	if ($count == &#039;&#039;) {
		delete_post_meta ( $postID, $count_key );
		add_post_meta ( $postID, $count_key, &#039;0&#039; );
		return &quot;0 View&quot;;
	}
	return $count . &#039; Views&#039;;
}

function setPostViews($postID) {
	$count_key = &#039;post_views_count&#039;;
	$count = get_post_meta ( $postID, $count_key, true );
	if ($count == &#039;&#039;) {
		$count = 0;
		delete_post_meta ( $postID, $count_key );
		add_post_meta ( $postID, $count_key, &#039;0&#039; );
	} else {
		$count ++;
		update_post_meta ( $postID, $count_key, $count );
	}
}</pre>
<p><span id="more-450"></span></p>
<p>第二步，将如下代码插入single.php文件的主循环内</p>
<div id="highlighter_864254">
<div>
<div>
<table>
<tbody>
<tr>
<td><code>&lt;?php setPostViews(get_the_ID()); ?&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td><code>&lt;?php </code><code>echo</code> <code>getPostViews(get_the_ID()); ?&gt;</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>第三步，需要在哪个页面或者栏目显示文章的浏览次数，就在相应的模板文件（比如首页：index.php，分类目录页：archive.php，侧边栏：sidebar.php）里面添加上面第二行的代码即可。<br />
2、WP-PostViews Plus有自带的小工具功能可以使用，挺方便的，不过一些代码控就喜欢精简就自己把代码嵌入到sidebar.php中就可以了。<br />
在主题文件sidebar.php文件中的相应位位置添加代码<br />
显示阅读次数最多的文章或页面：</p>
<div id="highlighter_473438">
<div>
<div>
<table>
<tbody>
<tr>
<td><code>&lt;?php </code><code>if</code> <code>(function_exists(‘get_most_viewed’)): ?&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td><code>&lt;?php get_most_viewed(); ?&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td><code>&lt;?php </code><code>endif</code><code>; ?&gt;</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>只显示阅读次数最多的文章：</p>
<div id="highlighter_82787">
<div>
<div>
<table>
<tbody>
<tr>
<td><code>&lt;?php </code><code>if</code> <code>(function_exists(‘get_most_viewed’)): ?&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td><code>&lt;?php get_most_viewed(‘post’); ?&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td><code>&lt;?php </code><code>endif</code><code>; ?&gt;</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>只想显示10篇阅读次数最多的文章：</p>
<div id="highlighter_263511">
<div>
<div>
<table>
<tbody>
<tr>
<td><code>&lt;?php </code><code>if</code> <code>(function_exists(‘get_most_viewed’)): ?&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td><code>&lt;?php get_most_viewed(‘post’,10); ?&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td><code>&lt;?php </code><code>endif</code><code>; ?&gt;</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>在get_most_viewed 函数中的参数10决定要显示的篇数<br />
显示显示某类别下的阅读次数最多的文章：</p>
<div id="highlighter_806353">
<div>
<div>
<table>
<tbody>
<tr>
<td><code>&lt;?php </code><code>if</code> <code>(function_exists(‘get_most_viewed_category’)): ?&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td><code>&lt;?php get_most_viewed_category(the_catagory_ID(false)); ?&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td><code>&lt;?php </code><code>endif</code><code>; ?&gt;</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>在get_most_viewed_category函数类别ID决定显示的分类</p>
<p>&nbsp;</p>
<p>附&lt;?php get_most_viewed(‘post’,8,0,true,true);?&gt;函数详解：</p>
<p>主题中有这么一句函数，是用来引用“最受欢迎文章”的，后面一共有5个参数可供设置，说明如下：<br />
post：可选post，page，both；<br />
8：控制应用文章的数量；<br />
0：截取文章标题长度，0表示不设置，不设置的话长标题就会自动换行，很难看；<br />
true：显示文章，若改为 false 则不显示文章；<br />
true：不显示搜索引擎机器人的查询次数，若改为 true 则全部显示</p>
<p>&nbsp;</p>
<p>==============================================</p>
<p>推荐装插件：WP-PostViews：下载地址：<a href="http://wordpress.org/extend/plugins/wp-postviews/">http://wordpress.org/extend/plugins/wp-postviews/</a></p>
<p>则通过调用the_views()函数：</p>
<pre class="brush: php; gutter: true">### Function: Display The Post Views
function the_views($display = true, $prefix = &#039;&#039;, $postfix = &#039;&#039;, $always = false) {
    $post_views = intval(post_custom(&#039;views&#039;));
    $views_options = get_option(&#039;views_options&#039;);
    if ($always || should_views_be_displayed($views_options)) {
        $output = $prefix.str_replace(&#039;%VIEW_COUNT%&#039;, number_format_i18n($post_views), $views_options[&#039;template&#039;]).$postfix;
        if($display) {
            echo apply_filters(&#039;the_views&#039;, $output);
        } else {
            return apply_filters(&#039;the_views&#039;, $output);
        }
    }
    elseif (!$display) {
        return &#039;&#039;;
    }
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.32133.com/labrary/450.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>再加InnoDB和MyISAM区别总结</title>
		<link>http://www.32133.com/share/441.html</link>
		<comments>http://www.32133.com/share/441.html#comments</comments>
		<pubDate>Sat, 24 Mar 2012 02:24:30 +0000</pubDate>
		<dc:creator>navins</dc:creator>
				<category><![CDATA[Share]]></category>

		<guid isPermaLink="false">http://www.32133.com/?p=441</guid>
		<description><![CDATA[InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型，这两个表类型各有优劣，视具体应用而定。基本的差别为：MyISAM类型不支持事务处理等高级处理，而InnoDB类型支持。MyISAM类型的表强调的是性能，其执行速度比InnoDB类型更快，但是不提供事务支持，而InnoDB提供事务支持已经外部键等高级数据库功能。]]></description>
			<content:encoded><![CDATA[<p>InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型，这两个表类型各有优劣，视具体应用而定。基本的差别为：MyISAM类型不支持事务处理等高级处理，而InnoDB类型支持。MyISAM类型的表强调的是性能，其执行速度比InnoDB类型更快，但是不提供事务支持，而InnoDB提供事务支持已经外部键等高级数据库功能。<br />
MyIASM是IASM表的新版本，有如下扩展：</p>
<p>·二进制层次的可移植性。<br />
·NULL列索引。<br />
·对变长行比ISAM表有更少的碎片。<br />
·支持大文件。<br />
·更好的索引压缩。<br />
·更好的键吗统计分布。<br />
·更好和更快的auto_increment处理。<br />
以下是一些细节和具体实现的差别：<br />
◆1.InnoDB不支持FULLTEXT类型的索引。<br />
◆2.InnoDB 中不保存表的具体行数，也就是说，执行select count(*) from table时，InnoDB要扫描一遍整个表来计算有多少行，但是MyISAM只要简单的读出保存好的行数即可。注意的是，当count(*)语句包含 where条件时，两种表的操作是一样的。<br />
◆3.对于AUTO_INCREMENT类型的字段，InnoDB中必须包含只有该字段的索引，但是在MyISAM表中，可以和其他字段一起建立联合索引。<br />
◆4.DELETE FROM table时，InnoDB不会重新建立表，而是一行一行的删除。<br />
◆5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的，解决方法是首先把InnoDB表改成MyISAM表，导入数据后再改成InnoDB表，但是对于使用的额外的InnoDB特性（例如外键）的表不适用。</p>
<p>另外，InnoDB表的行锁也不是绝对的，假如在执行一个SQL语句时MySQL不能确定要扫描的范围，InnoDB表同样会锁全表，例如update table set num=1 where name like “%aaa%”</p>
<p>综上所述，任何一种表都不是万能的，只有恰当的针对业务类型来选择合适的表类型，才能最大的发挥MySQL的性能优势。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.32133.com/share/441.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

