<?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>中文Flex例子 &#187; 搜索引擎</title>
	<atom:link href="http://blog.minidx.com/category/searchengine/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.minidx.com</link>
	<description>中文Adobe Flex例子,Flex实例教程,RIA资源,全文检索技术,算法和数据结构</description>
	<lastBuildDate>Thu, 31 Mar 2011 03:22:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>关于开源的网络爬虫/网络蜘蛛larbin结构分析的一篇非常不错的文章</title>
		<link>http://blog.minidx.com/2009/01/01/1862.html</link>
		<comments>http://blog.minidx.com/2009/01/01/1862.html#comments</comments>
		<pubDate>Thu, 01 Jan 2009 14:31:28 +0000</pubDate>
		<dc:creator>Minidxer</dc:creator>
				<category><![CDATA[搜索引擎]]></category>
		<category><![CDATA[labin]]></category>
		<category><![CDATA[网络爬虫]]></category>
		<category><![CDATA[网络蜘蛛]]></category>

		<guid isPermaLink="false">http://blog.minidx.com/?p=1862</guid>
		<description><![CDATA[larbin是一种开源的网络爬虫/网络蜘蛛，由法国的年轻人 Sébastien Ailleret独立开发。larbin目的是能够跟踪页面的url进行扩展的抓取，最后为搜索引擎提供广泛的数据来源。Larbin只是一个爬虫，也就是说larbin只抓取网页，至于如何parse的事情则由用户自己完成。另外，如何存储到数据库以及建立索引的事情 larbin也不提供。一个简单的larbin的爬虫可以每天获取５００万的网页。
利用larbin，我们可以轻易的获取/确定单个网站的所有联结，甚至可以镜像一个网站；也可以用它建立url 列表群，例如针对所有的网页进行 url retrive后，进行xml的联结的获取。或者是 mp3，或者定制larbin，可以作为搜索引擎的信息的来源。








不过它的最大的亮点还是开源，相信很多人拿到larbin源代码的时候会感觉无从入手，下面是一篇非常不错的开源的网络爬虫/网络蜘蛛larbin结构分析的文章,有兴趣的最好仔细阅读尝试一下。
互联网是一个庞大的非结构化的数据库，将数据有效的检索并组织呈现出来有着巨大的应用前景，尤其是类似RSS的以XML为基础的结构化的数据越来越多，内容的组织方式越来越灵活，检索组织并呈现会有着越来越广泛的应用范围，同时在时效性和可读性上也会有越来越高的要求。这一切的基础是爬虫，信息的来源入口。一个高效，灵活可扩展的爬虫对以上应用都有着无可替代的重要意义。
要设计一个爬虫，首先需要考虑的效率。对于网络而言，基于TCP/IP的通信编程有几种方法。
第一种是单线程阻塞，这是最简单也最容易实现的一种，一个例子：在Shell中通过curl，pcregrep等一系统命令可以直接实现一个简单的爬虫，但同时它的效率问题也显而易见：由于是阻塞方式读取，dns解析，建立连接，写入请求，读取结果这些步骤上都会产生时间的延迟，从而无法有效的利用服务器的全部资源。
第二种是多线程阻塞。建立多个阻塞的线程，分别请求不同的url。相对于第一种方法，它可以更有效的利用机器的资源，特别是网络资源，因为无数线程在同时工作，所以网络会比较充分的利用，但同时对机器CPU资源的消耗也是比较大，在用户级多线程间的频繁切换对于性能的影响已经值得我们考虑。
第三种是单线程非阻塞。这是目前使用的比较多的一种做法，无论在client还是server都有着广泛的应用。在一个线程内打开多个非阻塞的连接，通过poll/epoll /select对连接状态进行判断，在第一时间响应请求，不但充分利用了网络资源，同时也将本机CPU资源的消耗降至最低。这种方法需要对dns请求，连接，读写操作都采用异步非阻塞操作，其中第一种比较复杂，可以采用adns作为解决方案，后面三个操作相对简单可以直接在程序内实现。
效率问题解决后就需要考虑具体的设计问题了。
url肯定需要一个单独的类进行处理，包括显示，分析url，得到主机，端口，文件数据。
然后需要对url进行排重，需要一个比较大的url Hash表。
如果还要对网页内容进行排重，则还需要一个Document Hash表。
爬过的url需要记录下来，由于量比较大，我们将它写到磁盘上，所以还需要一个FIFO的类(记作urlsDisk)。
现在需要爬的url同样需要一个FIFO类来处理，重新开始时，url会从定时从爬过的url FIFO里取出来，写到这个FIFO里。正在运行的爬虫需要从这个FIFO里读数据出来，加入到主机类的url列表里。当然，也会从前一个FIFO里直接读url出来，不过优先级应该比这个里面出来的url低，毕竟是已经爬过的。
爬虫一般是对多个网站进行爬取，但在同时站点内dns的请求可以只做一次，这就需要将主机名独立于url，单独有一个类进行处理。
主机名解析完成后需要有一个解析完成的IP类与之应用，用于connect的时候使用。
HTML文档的解析类也要有一个，用来分析网页，取出里面的url，加入到urlsDisk。
再加上一些字符串，调度类，一个简单的爬虫基本上就完成了。
以上基本上是Larbin的设计思路，Larbin在具体实现上还有一些特殊的处理，例如带了一个webserver，以及对特殊文件的处理。 Larbin有一点设计不不太好，就是慢的访问会越来越多，占用大量的连接，需要改进，另外如果对于大规模的爬虫，这仅仅实现了抓取的部分，要分布式的扩展还需要增加url的集中管理与调度以及前台spider的分布式算法。
Larbin网站爬虫简明使用说明
larbin是一种爬虫工具，我也是前段时间网上看到 Larbin 一种高效的搜索引擎爬虫工具 一文时才知道有这么个东西，初步认定，我比较喜欢这个工具(比起nutch的crawl来说),因为它是C++写的，类似C嘛，我熟，可以自己改改，顺便学习一下C++(几年来的经验告诉我说：改别人的东西来学一种技术比从头写helloworld快很多)。于是开始了我艰辛的larbin试用之旅。 
　　回头看看自己遇到的问题都是由于没认真看文档引起的，唉，老毛病了。下次即使是E文的也得好好看，不能盲目的试，浪费时间。 
　　larbin官方地址：http://larbin.sourceforge.net/index-eng.html
一，编译 
　　这也好说，whahahaha，那是！因为从官方网站下下来的代码不能编译通过(linux gcc下)
　　./configure 
　　make
　　gcc -O3 -Wall -D_REENTRANT -c -o parse.o parse.c 
　　parse.c:115: error: conflicting types for ’adns__parse_domain’ 
　　internal.h:571: error: previous declaration of ’adns__parse_domain’ was here
　　parse.c:115: error: conflicting types for ’adns__parse_domain’
　　internal.h:571: error: previous declaration of ’adns__parse_domain’ was here 
　　gmake[1]: [...]]]></description>
		<wfw:commentRss>http://blog.minidx.com/2009/01/01/1862.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>GBK和BIG5中汉字编码的第一位和第二位的范围</title>
		<link>http://blog.minidx.com/2008/12/09/1700.html</link>
		<comments>http://blog.minidx.com/2008/12/09/1700.html#comments</comments>
		<pubDate>Tue, 09 Dec 2008 06:51:42 +0000</pubDate>
		<dc:creator>Minidxer</dc:creator>
				<category><![CDATA[搜索引擎]]></category>
		<category><![CDATA[BIG5]]></category>
		<category><![CDATA[GBK]]></category>
		<category><![CDATA[汉字编码]]></category>

		<guid isPermaLink="false">http://blog.minidx.com/?p=1700</guid>
		<description><![CDATA[GBK和BIG5都是双字节字符，也就是用两个位符来表示一个汉字。要判断是否汉字，就必须知道它的有效范围，下面是第一个位和第二个位的有效范围：








GBK范围：
1st   byte       &#124;     2nd   byte
0&#215;81~0xfe     &#124;     0&#215;40~0&#215;7e   and   0&#215;80~0xfe
BIG5范围：
1st   byte       &#124;     2nd   byte
0&#215;81~0xfe   [...]]]></description>
		<wfw:commentRss>http://blog.minidx.com/2008/12/09/1700.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GBK,BIG5等字符集编码范围的具体说明</title>
		<link>http://blog.minidx.com/2008/12/06/1689.html</link>
		<comments>http://blog.minidx.com/2008/12/06/1689.html#comments</comments>
		<pubDate>Sat, 06 Dec 2008 10:00:33 +0000</pubDate>
		<dc:creator>Minidxer</dc:creator>
				<category><![CDATA[搜索引擎]]></category>
		<category><![CDATA[程序开发相关]]></category>
		<category><![CDATA[BIG5]]></category>
		<category><![CDATA[GBK]]></category>
		<category><![CDATA[字符集]]></category>
		<category><![CDATA[编码]]></category>

		<guid isPermaLink="false">http://blog.minidx.com/?p=1689</guid>
		<description><![CDATA[通过前面的 关于计算机中Endian（big-edian和little-endian）存储机制的由来、特点和区别和一篇关于Unicode编码的UCS、UTF、BMP、BOM等概念的不错的文章 这两篇文章，读过之后应该对字符编码有一个比较深刻地了解，不过这个世界是有很多个说着不同语言的国家组成的，在追求国际化的同时，更多的是要求本土化，所以很多计算机软件系统应用的是本土的语言编码，而不是通用的UTF8等。各自的编码都有一定的范围，下面的文章对字符集和编码的概念，以及一些常用编码的范围进行了非常详细地说明，做相关方面工作的可要收藏了。








一 预备知识
1，字符：字符是抽象的最小文本单位。它没有固定的形状（可能是一个字形），而且没有值。“A”是一个字符，“€”（德国、法国和许多其他欧洲国家通用货币的标志）也是一个字符。“中”“国”这是两个汉字字符。字符仅仅代表一个符号，没有任何实际值的意义。
2，字符集：字符集是字符的集合。例如，汉字字符是中国人最先发明的字符，在中文、日文、韩文和越南文的书写中使用。这也说明了字符和字符集之间的关系，字符组成字符集（iso8859-1，GB2312/GBK，unicode）。
3，代码点：字符集中的每个字符都被分配到一个“代码点”。每个代码点都有一个特定的唯一数值，称为标值。该标量值通常用十六进制表示。
4，代码单元： 在每种编码形式中，代码点被映射到一个或多个代码单元。“代码单元”是各个编码方式中的单个单元。代码单元的大小等效于特定编码方式的位数：
UTF-8 ：UTF-8 中的代码单元由 8 位组成；在 UTF-8 中，因为代码单元较小的缘故，每个代码点常常被映射到多个代码单元。代码点将被映射到一个、两个、三个或四个代码单元；
UTF-16 ：UTF-16 中的代码单元由 16 位组成；UTF-16 的代码单元大小是 8 位代码单元的两倍。所以，标量值小于 U+10000 的代码点被编码到单个代码单元中；
UTF-32：UTF-32  中的代码单元由 32 位组成； UTF-32 中使用的 32 位代码单元足够大，每个代码点都可编码为单个代码单元；
GB18030：GB18030  中的代码单元由 8 位组成；在 GB18030 中，因为代码单元较小的缘故，每个代码点常常被映射到多个代码单元。代码点将被映射到一个、两个或四个代码单元。
5，举例：
“中国北京香蕉是个大笨蛋”这是我定义的aka字符集；各字符对应代码点为：
北 00000001
京 00000010
香 10000001
蕉 10000010
是 10000100
个 10001000
大 10010000
笨 10100000
蛋 11000000
中 00000100
国 00001000
下面是我定义的 zixia 编码方案（8位），可以看到它的编码中表示了aka字符集的所有字符对应的 代码单元；
北 10000001
京 10000010
香 00000001
蕉 00000010
是 00000100
个 00001000
大 00010000
笨 00100000
蛋 01000000
中 10000100
国 10001000
所谓文本文件 [...]]]></description>
		<wfw:commentRss>http://blog.minidx.com/2008/12/06/1689.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一篇关于Unicode编码的UCS、UTF、BMP、BOM等概念的不错的文章</title>
		<link>http://blog.minidx.com/2008/11/06/1607.html</link>
		<comments>http://blog.minidx.com/2008/11/06/1607.html#comments</comments>
		<pubDate>Thu, 06 Nov 2008 07:43:38 +0000</pubDate>
		<dc:creator>Minidxer</dc:creator>
				<category><![CDATA[搜索引擎]]></category>
		<category><![CDATA[BMP]]></category>
		<category><![CDATA[BOM]]></category>
		<category><![CDATA[UCS]]></category>
		<category><![CDATA[UNICODE]]></category>
		<category><![CDATA[UTF]]></category>

		<guid isPermaLink="false">http://blog.minidx.com/?p=1607</guid>
		<description><![CDATA[由于要做一些中文话的工作，牵涉到中文的GB2312,GBK,Big5以及Unicode之类的编码，找了一些资料发现下面这篇写的还是相当不错的。很可惜好文章总是很有“中文特色”，一搜一大把同样的文章，转来转去已经找不到原始出处了。作者看到的话（或者哪位知道的话），还请好心告知。下面是文章内容：








这是一篇程序员写给程序员的趣味读物。所谓趣味是指可以比较轻松地了解一些原来不清楚的概念，增进知识，类似于打RPG游戏的升级。整理这篇文章的动机是两个问题：

问题一：
使用Windows记事本的“另存为”，可以在GBK、Unicode、Unicode big endian和UTF-8这几种编码方式间相互转换。同样是txt文件，Windows是怎样识别编码方式的呢？
我很早前就发现Unicode、Unicode big endian和UTF-8编码的txt文件的开头会多出几个字节，分别是FF、FE（Unicode）,FE、FF（Unicode        big endian）,EF、BB、BF（UTF-8）。但这些标记是基于什么标准呢？

问题二：
最 近在网上看到一个ConvertUTF.c，实现了UTF-32、UTF-16和UTF-8这三种编码方式的相互转换。对于Unicode(UCS2)、 GBK、UTF-8这些编码方式，我原来就了解。但这个程序让我有些糊涂，想不起来UTF-16和UCS2有什么关系。

查了查相关资料，总算将这些问题弄清楚了，顺带也了解了一些Unicode的细节。写成一篇文章，送给有过类似疑问的朋友。本文在写作时尽量做到通俗易懂，但要求读者知道什么是字节，什么是十六进制。
0、big endian和little endian
big endian和little endian是CPU处理多字节数的不同方式。例如“汉”字的Unicode编码是6C49。那么写到文件里时，究竟是将6C写在前面，还是将49写在前面？如果将6C写在前面，就是big    endian。如果将49写在前面，就是little endian。
“endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开，由此曾发生过六次叛乱，一个皇帝送了命，另一个丢了王位。
我们一般将endian翻译成“字节序”，将big endian和little endian称作“大尾”和“小尾”。
1、字符编码、内码，顺带介绍汉字编码
字符必须编码后才能被计算机处理。计算机使用的缺省编码方式就是计算机的内码。早期的计算机使用7位的ASCII编码，为了处理汉字，程序员设计了用于简体中文的GB2312和用于繁体中文的big5。
GB2312(1980年)一共收录了7445个字符，包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7，低字节从A1-FE，占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。
GB2312支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号，它分为汉字区和图形符号区。汉字区包括21003个字符。
从ASCII、GB2312到GBK，这些编码方法是向下兼容的，即同一个字符在这些方案中总是有相同的编码，后面的标准支持更多的字符。在这些编 码中，英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为0。按照程序员的称呼，GB2312、GBK都属于双字节字符集 (DBCS)。
2000年的GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字，同时还收录了藏文、蒙文、维吾尔文等主要的少数民族 文字。从汉字字汇上说，GB18030在GB13000.1的20902个汉字的基础上增加了CJK扩展A的6582个汉字（Unicode码 0&#215;3400-0&#215;4db5），一共收录了27484个汉字。
CJK就是中日韩的意思。Unicode为了节省码位，将中日韩三国语言中的文字统一编码。GB13000.1就是ISO/IEC 10646-1的中文版，相当于Unicode    1.1。
GB18030的编码采用单字节、双字节和4字节方案。其中单字节、双字节和GBK是完全兼容的。4字节编码的码位就是收录了CJK扩展A的6582个汉字。    例如：UCS的0&#215;3400在GB18030中的编码应该是8139EF30，UCS的0&#215;3401在GB18030中的编码应该是8139EF31。
微软提供了GB18030的升级包，但这个升级包只是提供了一套支持CJK扩展A的6582个汉字的新字体：新宋体-18030，并不改变内码。Windows    的内码仍然是GBK。
这里还有一些细节：

GB2312的原文还是区位码，从区位码到内码，需要在高字节和低字节上分别加上A0。
对于任何字符编码，编码单元的顺序是由编码方案指定的，与endian无关。例如GBK的编码单元是字节，用两个字节表示一个汉字。   这两个字节的顺序是固定的，不受CPU字节序的影响。UTF-16的编码单元是word（双字节），word之间的顺序是编码方案指定的，word内部的字节排列才会受到endian的影响。后面还会介绍UTF-16。
GB2312 的两个字节的最高位都是1。但符合这个条件的码位只有128*128=16384个。所以GBK和GB18030的低字节最高位都可能不是1。不过这不影 响DBCS字符流的解析：在读取DBCS字符流时，只要遇到高位为1的字节，就可以将下两个字节作为一个双字节编码，而不用管低字节的高位是什么。

2、Unicode、UCS和UTF
前面提到从ASCII、GB2312、GBK到GB18030的编码方法是向下兼容的。而Unicode只与ASCII兼容（更准确地说，是与ISO-8859-1兼容），与GB码不兼容。例如“汉”字的Unicode编码是6C49，而GB码是BABA。
Unicode也是一种字符编码方法，不过它是由国际组织设计，可以容纳全世界所有语言文字的编码方案。Unicode的学名是&#8221;Universal    Multiple-Octet Coded Character [...]]]></description>
		<wfw:commentRss>http://blog.minidx.com/2008/11/06/1607.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于计算机中Endian（big-edian和little-endian）存储机制的由来、特点和区别</title>
		<link>http://blog.minidx.com/2008/10/22/1570.html</link>
		<comments>http://blog.minidx.com/2008/10/22/1570.html#comments</comments>
		<pubDate>Wed, 22 Oct 2008 00:48:58 +0000</pubDate>
		<dc:creator>Minidxer</dc:creator>
				<category><![CDATA[搜索引擎]]></category>

		<guid isPermaLink="false">http://blog.minidx.com/?p=1570</guid>
		<description><![CDATA[有人问起Endian是什么，告诉他就是计算机中是“大尾”还是“小尾”， Little-Endian,就是我们在学习汇编时候的高高低低原则,而Bit-Endian就是刚刚相反，Little-Endian主要用在我们现在的PC的CPU中,Big-Endian则应用在目前的Mac机器中(注意:是指Power系列 处理器)……费了一些口舌，依旧一幅茫然的样子……于是放弃，Google了一下，找到下面这篇论文，原先作者已经无从考究了，那位知道的话还请麻烦告知。说起来Endian除了在一些底层内核模块中，一般开发中倒也用不到（当然，对于搜索引擎核心模块，这是不得不考虑的）。
先看下面这段小故事，可以帮助我们理解Endian：
“endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开，由此曾发生过六次叛乱，其中一个皇帝送了命，另一个丢了王位。
我们一般将endian翻译成“字节序”，将big endian和little endian称作“大尾”和“小尾”。








下面是关于Endian文章的引用：
一、引子
　　在各种计算机体系结构中，对于字节、字等的存储机制有所不同，因而引发了
计算机通信领域中一个很重要的问题，即通信双方交流的信息单元（比特、字节、
字、双字等等）应该以什么样的顺序进行传送。如果不达成一致的规则，通信双方
将无法进行正确的编/译码从而导致通信失败。目前在各种体系的计算机中通常采
用的字节存储机制主要有两种：
big-edian和little-endian。本文简要描述这两种存储机制的来历、特点和区别。
　　
　　为了叙述方便，下面先对本文中将要用到的两个术语做简单的定义。
　　1、MSB
　　MSB是Most Significant Bit/Byte的首字母缩写，通常译为最重要的位或者最
重要的字节。它通常用来表明在一个bit序列（如一个byte是8个bit组成的一个序
列）或者一个byte序列（如word是两个byte组成的一个序列）中对整个序列取值影
响最大的那个bit/byte。
　　2、LSB
　　LSB是Least Significant Bit/Byte的首字母缩写，通常译为最不重要的位或
者最不重要的字节。它通常用来表明在一个bit序列（如一个byte是8个bit组成的
一个序列）或者一个byte序列（如word是两个byte组成的一个序列）中对整个序
列取值影响最小的那个bit/byte。
二、endian的由来
　　1、Definition
　　endian: The ordering of bytes in a multi-byte number.
定义：在计算机系统体系结构中用来描述在多字节数中各个字节的存储顺序。
　　2、Etymology
　　The term comes from Swift&#8217;s &#8220;Gulliver&#8217;s Travels&#8221; via the famous paper
&#8220;On Holy Wars and a Plea for Peace&#8221; by Danny Cohen, USC/ISI IEN 137,
1980-04-01.
　　The Lilliputians, being very small, had correspondingly small political
problems. The Big-Endian and Little-Endian parties debated over [...]]]></description>
		<wfw:commentRss>http://blog.minidx.com/2008/10/22/1570.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk
Page Caching using disk (enhanced)
Database Caching 2/33 queries in 0.457 seconds using disk
Object Caching 368/736 objects using disk

Served from: blog.minidx.com @ 2012-02-10 00:49:09 -->
