<?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"
	>

<channel>
	<title>互联网，请记住我</title>
	<atom:link href="http://www.162cm.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.162cm.com</link>
	<description>一米六二的北漂生活</description>
	<pubDate>Tue, 08 Jul 2008 10:17:34 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>Linux 声卡设置(喇叭和耳机同时出声的解决)</title>
		<link>http://www.162cm.com/archives/661.html</link>
		<comments>http://www.162cm.com/archives/661.html#comments</comments>
		<pubDate>Tue, 08 Jul 2008 10:17:34 +0000</pubDate>
		<dc:creator>xurenlu</dc:creator>
		
		<guid isPermaLink="false">http://www.162cm.com/?p=661</guid>
		<description><![CDATA[本本声卡比较新，windows下装上官方驱动才能使，在linux倒是有声，就是音箱和耳机一起响，上班时没法听音乐。后来终于解决了这个问题，记录一下过程:
1:
运行lsmod&#124;grep snd,结果是:
snd_hda_intel         457780  4
snd_usb_audio         100608  0
snd_usb_lib            24960  1 snd_usb_audio
snd_rawmidi            30336  1 snd_usb_lib
&#8230;
事先知道声卡就是intel了，那就只记下第一行的snd_hda_intel这个名称。
2.
然后再查看:
 cat [...]]]></description>
			<content:encoded><![CDATA[<p>本本声卡比较新，windows下装上官方驱动才能使，在linux倒是有声，就是音箱和耳机一起响，上班时没法听音乐。后来终于解决了这个问题，记录一下过程:</p>
<p>1:<br />
运行lsmod|grep snd,结果是:<br />
snd_hda_intel         457780  4<br />
snd_usb_audio         100608  0<br />
snd_usb_lib            24960  1 snd_usb_audio<br />
snd_rawmidi            30336  1 snd_usb_lib<br />
&#8230;<br />
事先知道声卡就是intel了，那就只记下第一行的snd_hda_intel这个名称。</p>
<p>2.<br />
然后再查看:<br />
 cat /proc/asound/card0/codec#1|head<br />
结果是:<br />
Codec: Realtek ALC883<br />
Address: 1<br />
Vendor Id: 0&#215;10ec0883<br />
Subsystem Id: 0&#215;10190000<br />
&#8230;<br />
。<br />
接着下载alsa源代码中的一个文档，我是下载了alsa-driver的源码代码，然后在<br />
alsa-driver-1.0.16/alsa-kernel/Documentation/中找到了ALSA-Configuration.txt<br />
文件。<br />
然后:<br />
vim ALSA-Configuration.txt ,<br />
搜索alc833，找到:<br />
  ALC883/888<br />
      3stack-dig    3-jack with SPDIF I/O<br />
      6stack-dig    6-jack digital with SPDIF I/O<br />
      3stack-6ch    3-jack 6-channel<br />
      3stack-6ch-dig 3-jack 6-channel with SPDIF I/O<br />
      6stack-dig-demo  6-jack digital for Intel demo board<br />
      acer      Acer laptops (Travelmate 3012WTMi, Aspire 5600, etc)<br />
      acer-aspire   Acer Aspire 9810<br />
      medion    Medion Laptops<br />
      medion-md2    Medion MD2<br />
      targa-dig Targa/MSI<br />
      targa-2ch-dig Targs/MSI with 2-channel<br />
      laptop-eapd   3-jack with SPDIF I/O and EAPD (Clevo M540JE, M550JE)<br />
      lenovo-101e   Lenovo 101E<br />
      lenovo-nb0763 Lenovo NB0763<br />
      lenovo-ms7195-dig Lenovo MS7195<br />
      haier-w66 Haier W66<br />
&#8230;<br />
好了，我的本本就是haier的，估计haier的就都是用的同一种芯片。于是我记下,haier-w66。<br />
3:<br />
再打开:vim /etc/modprobe.conf<br />
加入一行:<br />
options snd-hda-intel model=haier-w66<br />
再重启，音箱和耳机可以单独控制音量了。</p>
<p>由于系统的不同，上面的各文件的路径可能略有不同。</p>
<br/>Tag:<span style='font-weight:bold;'>lenovo</span>&nbsp;<span style='font-weight:bold;'>然后</span>&nbsp;<span style='font-weight:bold;'>就是</span>&nbsp;<span style='font-weight:bold;'>找到</span>&nbsp;<span style='font-weight:bold;'>不同</span>&nbsp;<span style='font-weight:bold;'>stack-</span>&nbsp;<span style='font-weight:bold;'>ch-dig</span>&nbsp;<span style='font-weight:bold;'>aspire</span>&nbsp;<span style='font-weight:bold;'>记下</span>&nbsp;<span style='font-weight:bold;'>medion</span>&nbsp;<div>相关文章</div><ul><li><a href=http://www.162cm.com/archives/410.html>lighttpd上搞定wordpress,给出详细步聚.</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.162cm.com/archives/661.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Spread学习系列[1]-SP_receive函数说明</title>
		<link>http://www.162cm.com/archives/660.html</link>
		<comments>http://www.162cm.com/archives/660.html#comments</comments>
		<pubDate>Sat, 05 Jul 2008 14:17:15 +0000</pubDate>
		<dc:creator>xurenlu</dc:creator>
		
		<guid isPermaLink="false">http://www.162cm.com/?p=660</guid>
		<description><![CDATA[接在Spread 简介(试译)之后，我跟啃骨头一样一点点儿地把SP_receive的man文档看完了。
这是我做的笔记，基本就是原文翻译，但是我英文太差，翻得太烂了点:(
SP_receive
NAME
       SP_receive, SP_scat_receive - Receive message from Spread
SYNOPSIS
       #include 
       int     SP_receive(     mailbox     mbox,     service    *service_type,  [...]]]></description>
			<content:encoded><![CDATA[<p>接在<a href="http://www.162cm.com/archives/656.html">Spread 简介(试译)</a>之后，我跟啃骨头一样一点点儿地把SP_receive的man文档看完了。<br />
这是我做的笔记，基本就是原文翻译，但是我英文太差，翻得太烂了点:(<br />
SP_receive<br />
NAME<br />
       SP_receive, SP_scat_receive - Receive message from Spread</p>
<p>SYNOPSIS<br />
       #include <sp.h></p>
<p>       int     SP_receive(     mailbox     mbox,     service    *service_type,    char sender[MAX_GROUP_NAME],    int    max_groups,     int     *num_groups,     char groups[][MAX_GROUP_NAME],   int16   *mess_type,   int   *endian_mismatch,   int max_mess_len, char *mess);</p>
<p>       int   SP_scat_receive(    mailbox    mbox,    service    *service_type,    char sender[MAX_GROUP_NAME],     int     max_groups,     int    *num_groups,    char groups[][MAX_GROUP_NAME],  int16  *mess_type,  int  *endian_mismatch,   scatter *scat_mess);</p>
<p>DESCRIPTION<br />
	SP_receive 函数主要实现接收消息的功能。这个函数不仅接收数据消息，也接收成员关系数据。当前连接所在的所有组的消息都会到达同一个<br />
&#8220;收件箱&#8221;,因此SP_receive函数一次会从任意一个组中间取回一条消息。当接收完成后，一些成员变量会被设置值，以标记这条消息的各种属性。<br />
	因为这个函数是程序从spread 系统中取回消息的唯一渠道，因此在Spread中的应用也是最复杂的。基于这条消息是数据消息，还是成员关系消息，许多<br />
参数的含义都会改变。<br />
	没有消息到达的时候，SP_receive函数会阻塞。<br />
	mbox参数指定了要在哪个(spread)连接上获取消息。Service_type是指向一个变量的指针，这个变量会<br />
	指出当前接收到的消息是&#8221;数据消息“，还是成员关系消息。这个变量要么是REG_MESSAGE，要么是<br />
	MEMBER_SHIP_MESS，当然会是特定的类型.这个变量也是一个输入参数，在一般的情况下应该被置为0。如果您置为&#8221;DROP_RECV&#8221;,则表示您愿意接收“不可信消息&#8221;,这可能导般如果为消息或组列表分配的缓冲不够的话，消息会被清空。更多关于DROP_RECV的介绍会在后面提到。<br />
	后面的参数的含义是依赖于service_type这个变量的取值的.如果service_type的取值是REG_MESSAGE(比如数据消息),那么:<br />
	sender参数是一个指向字符的指针，至少需要能容纳MAX_GROUP_NAME个字符。（很拗口吧?其实就是一个长度至为MAX_GROUP_NAME的字符串&#8230;)<br />
	这个参数将会被设置成为消息发送方的名称(它的组内名称)<br />
	max_groups参数是你为groups参数分配的地址所能容纳的最大的组的个数。<br />
	Num_groups是一个整型指针,指向在groups参数中返回的组的个数。<br />
	groups 参数可以容纳max_groups个组名,每个组名是一个最多有MAX_GROUP_NAME个字符的字符串。所有接收这个消息的组都会被更在这儿，除非数组太小（此时groups尽可能多地接纳至到它满了为止，并且<br />
num_groups会设为负的值).比如，如果你的groups数组能接收5个数组名，而这个消息被7个组接收，前5个组的名字会存在groups这个数组中，num_groups会被设为-7.</p>
<p>   真正的消息内容存在命名为mess的缓冲区中，这个缓冲区最少要有max_mess个字节。如果接收的消息的长度要比这个缓冲区大，默认将会返回BUFFER_TOO_SHOFT错误，并在endian_mismatch字域中提供需要的长度。如果DROP_RECV标记被在service_type中传进来，那么mess会尽量多地存储消息内容，多余的内容会被丢弃掉，同时，SP_receive的返回值会指示一个错误。如果使用SP_scat_receive,那么mess和length参数会被一个scat_mess scatter结构体所取代，这个结构会存储它收到的消息和消息的长度。它们会被以接收的次序存储。<br />
	如果是MEMB_MESSAGE(比如,成员关系消息),并且特别指出是TRANS_MESS,那么:<br />
		sender这个字符数据（字符串）就会设置为成员关系发生变化的组的名字。<br />
		max_groups和max_mess_len参数没有用，num_groups会是0，而groups参数因为当前正处于变动之中，暂时没有<br />
	了正常的组，由sender参数取代。mess_type参数设为-1,endian_mismatch参数为0（也因为组关系处于变动之中).mess参数只包含<br />
	关系变化作用的group的group_id。因此消息体就是:<br />
		group_id;</p>
<p>		因此本质上你所得到的信息就是通过sender参数和group_id值反映的哪个组产生了变动。</p>
<p>		TRANS_MEMB_MESS 的重要性在于，它告诉应用程序，在它之后，在来自同一组的REG_MEMB_MESS之前,接收到的消息都是&#8217;clean up&#8217;消息，这些消息在真正改变成员关系之前需要保持常态。请阅读其他文档或研究文献以得到更多相关资料。</p>
<p>	如果这是一条MEMB_MESSAGE(比如成员关系消息)并且指定了是REG_MEMB_MESS,那么:<br />
	sender 字符数组指定了成员关系发生改变的组的名称。<br />
	max_groups和max_mess_len参数的含义跟前面一样，mess_type参数设定为当前进程在组成员数组中的索引。endian_mismatch会再次设为0.<br />
	groups参数和mess内容用来提供当前组内发生的变化的两种信息。num_groups参数设置为新成员关系中的当前组的成员数（指变动发生后）。相对地，groups 这个数组会被设置为新成员关系中当前组的所有成员的组内名称。这个名称的顺序常常是按接收方的顺序排序的，这样当程序需要一个做代表时就能取一个出来。不同的Spread版本的顺序不同，当前版本的首先按连接到守护进程的顺序，其次是它的私有名称。守护进程的顺序是按照它们在spread.conf文件中列出来的顺序排列的。<br />
	第二类信息存储在消息体中，提供了当前进程中所有私有组名称，这些名称从原来的成员关系迁到了新的成员关系中。<br />
	所有的内容都一个挨一个地放在message缓冲中。因为这个结构在各个版本中经常变，最好的处理办法就是使用<br />
	我们提供的解析函数来将消息体翻译成定义好的描述成员关系的结构体。解析函数有两个变量，一个用来处理字<br />
	节流，一个用来处理scatters格式的消息体。<br />
			SP_get_memb_info<br />
			SP_get_vs_sets_info<br />
			SP_get_vs_set_members<br />
			SP_scat_get_memb_info<br />
	这四个函数填入标准的应用程序用来设置以成员关系的gid和vs信息的结构体。<br />
              SP_scat_get_vs_sets_info<br />
              SP_scat_get_vs_set_members</p>
<p>	这样，如果一个程序需要得到它自己的vs_set(Spread版本4之前提供的信息)，他们可以被两个函数调用来文档化。先用SP_get_memb_info然后用SP_get_vs_set_members;</p>
<p>	每个vs_set定义成若干成员和一个成员关系字符数组(字符串)。这个数组的类型是char members[][MAX_GROUP_NAME];<br />
	每个成员关系型的消息都可能含有一系列的vs_sets,当一个网络合并动作发生时,几个不同的部分可能同时发生合并，每个区块都有它自己的成员集合，这些既有旧成员关系的又有新成员关系的。<br />
	如果你想自行解析这个成员关系消息内容，下面的段落指出了当前的数据格式。这个格式肯定会改变(过去已经改变过好几次了），我们不对未来的改变做保证。如果您想自行解析数据，在更新Spread的版本时您需要更新您的代码。<br />
	成员关系消息体包含以下几段（它们是有顺序的）。每一段数据都是一个结构体，或者是一个整数（是整数时,一定是一个32位无符号的整数）。vs sets是这样定义的:<br />
		group_id gid;<br />
		unsigned int num_vs_sets;<br />
		unsigned int local_vs_set_offset;<br />
		以及一系列vs_sets;<br />
	所有的vs_sets都序列地存在成员关系消息体中，读完了一个vs_set,另一个vs_set就在下一个字节开始了。<br />
	每一个vs_set都以一下整数num_vs_members开始，因而程序能够得到members数组的长度来进行读取。<br />
		unsigned int num_vs_members;<br />
		char members[][MAX_GROUP_NAME]</p>
<p>		vs_set members数组有num_vs_members个组名，每一个都是一个固定长度的字符串。vs_set members<br />
	数组的内容取决于成员关系变更的类型：<br />
	    CAUSED_BY_JOIN:<br />
			vs_set包含有加入进来的进程的私有组名。<br />
        CAUSED_BY_LEAVE:<br />
			vs_set包含有退出的进程的私有组名。<br />
        CAUSED_BY_DISCONNECT:<br />
			vs_set 包含有关闭连接的进程的私有组名。<br />
        CAUSED_BY_NETWORK:<br />
			vs_set包含有形成新成员关系的各个成员组的组名称。每个加入的成员集合都有一个vs_set对应。包含有本地应用程序的私有组名的vs_set会有后来加入的成员。<br />
		如果这是一条MEMB_MESSAGE但是既不是REG_MEMB_MESS也不是TRANS_MEMB_MESS,那这就表明这种情形是接收消息的成员离开了组，这是一条通知消息。这种有时被称作”闪人通知”。<br />
		这个成员刚刚离开的组的成员们会收到一个正常的TRANS_MEMB_MESS,REG_MEMB_MESS消息对，就跟前面描述的一样。<br />
	SP_receive的参数如下:<br />
		sender参数就是成员关系发生改变的组的名字。<br />
		mess_type and endian_mismatch fields will again be set to 0.<br />
		max_groups和max_mess_len参数的含义与原来一样，mess_type和endian_dismatch参数再次置为0.<br />
		groups数组和消息体提供发生变动的组的两种信息。num_groups会置为0,groups数组会置为0（既然这个成员不再是组的一个成员了。mess的消息体内容也是空。</p>
<p>	返回值:返回返回消息的长度（当成功时）或在失败时返回以下任何一个：<br />
    ILLEGAL_SESSION<br />
		指定的mbox不正确。<br />
	ILLEGAL_MESSAGE<br />
		消息包含一个正常的结构，比如一个scatter结构没有正确填充。<br />
    CONNECTION_CLOSED<br />
		在通信时发生了连接错误，接收无法完成。<br />
    GROUPS_TOO_SHORT<br />
		如果你的groups数组设定的太小了无法存下返回的数组，会返回一个GROUPS_TOO_SHORT的错误。<br />
		这时num_groups会返回负数。<br />
	BUFFER_TOO_SHORT<br />
		如果消息体缓冲(mess)设置的太短,存不下返回的消息时，会返回这个错误，就会返回这个错误，同时endian_mismatch参数会设置为需要的缓冲的长度。</p>
<br/>Tag:<span style='font-weight:bold;'>消息</span>&nbsp;<span style='font-weight:bold;'>成员</span>&nbsp;<span style='font-weight:bold;'>一个</span>&nbsp;<span style='font-weight:bold;'>参数</span>&nbsp;<span style='font-weight:bold;'>关系</span>&nbsp;<span style='font-weight:bold;'>这个</span>&nbsp;<span style='font-weight:bold;'>如果</span>&nbsp;<span style='font-weight:bold;'>groups</span>&nbsp;<span style='font-weight:bold;'>接收</span>&nbsp;<span style='font-weight:bold;'>返回</span>&nbsp;<div>相关文章</div><ul><li><a href=http://www.162cm.com/archives/411.html>150行代码,搞定中文分词</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.162cm.com/archives/660.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>团购蜂蜜</title>
		<link>http://www.162cm.com/archives/659.html</link>
		<comments>http://www.162cm.com/archives/659.html#comments</comments>
		<pubDate>Mon, 23 Jun 2008 12:28:12 +0000</pubDate>
		<dc:creator>xurenlu</dc:creator>
		
		<guid isPermaLink="false">http://www.162cm.com/?p=659</guid>
		<description><![CDATA[提起大熊猫的故乡，很多人首先想到的是卧龙，那里是人工养殖大熊猫的基地。可是你们知道吗？在四川省西北部岷山深处，有一块四万公顷的原始森林，其间坐落着唐家河大熊猫自然保护区，那里生活着60多只野生的大熊猫和众多的国家一级、二级保护动物。阿里巴巴赈灾重建小组考察发现，由于5.12地震, 唐家河道路损毁、山体严重坍塌、众多珍贵野生动植物遭到毁灭性破坏.这对当地民众的生产生活造成了严重的影响.其中,原本不愁销路的天然蜂蜜积压了4吨无法销售出去,这些可都是养蜂人辛苦劳作的结晶啊! 为帮助唐家河大熊猫自然保护区解决这一问题.我们决定团购这4吨的蜂蜜.我们团购蜂蜜的价格也很优惠哦，单价是15元/斤，和超市的蜂蜜比起来，便宜很多呢，而且是纯天然的没有经过掺杂的蜂蜜哦！


ID

    规格
                单价
       运费
 总价（元）


1
6斤桶装蜂蜜
 90
5
95


2
4斤桶装蜂蜜
     60
        5
            [...]]]></description>
			<content:encoded><![CDATA[<p>提起大熊猫的故乡，很多人首先想到的是卧龙，那里是人工养殖大熊猫的基地。可是你们知道吗？在四川省西北部岷山深处，有一块四万公顷的原始森林，其间坐落着唐家河大熊猫自然保护区，那里生活着60多只野生的大熊猫和众多的国家一级、二级保护动物。阿里巴巴赈灾重建小组考察发现，由于5.12地震, 唐家河道路损毁、山体严重坍塌、众多珍贵野生动植物遭到毁灭性破坏.这对当地民众的生产生活造成了严重的影响.其中,原本不愁销路的天然蜂蜜积压了4吨无法销售出去,这些可都是养蜂人辛苦劳作的结晶啊! 为帮助唐家河大熊猫自然保护区解决这一问题.我们决定团购这4吨的蜂蜜.我们团购蜂蜜的价格也很优惠哦，单价是15元/斤，和超市的蜂蜜比起来，便宜很多呢，而且是纯天然的没有经过掺杂的蜂蜜哦！</p>
<table>
<tr>
<th>ID</th>
<th>
<th>    规格</th>
<th>                单价</th>
<th>       运费</th>
<th> 总价（元）</th>
</tr>
<tr>
<th>1</th>
<th>6斤桶装蜂蜜</th>
<th> 90</th>
<th>5</th>
<th>95</th>
</tr>
<tr>
<th>2</th>
<th>4斤桶装蜂蜜</th>
<th>     60</th>
<th>        5</th>
<th>             65</th>
</tr>
<tr>
<th>3</th>
<th>     大礼盒装（2000g）</th>
<th> 78 </th>
<th>  5</th>
<th>            83 </th>
</tr>
<tr>
<th>4 </th>
<th>    中礼盒装（1000g）</th>
<th>45</th>
<th>   5 </th>
<th>            50</th>
</tr>
<tr>
<th>5</th>
<th>     小礼盒装（800g）</th>
<th>40 </th>
<th>   5  </th>
<th>          45</th>
</tr>
<tr>
<th>6 </th>
<th>    迷你礼盒装（600g）</th>
<th>    36</th>
<th>   5  </th>
<th>     41</th>
</tr>
</table>
<p>这是我们集团打算做的一点小事，有需要的可以联系我一起买!到货后我再转发给大家<br />
顺便提示一下大家，大家在超市里看到的蜂蜜，大多像水一样，而有些天然的蜂蜜，浓得呈固体状态，我还不知道这次团购的蜂蜜会是什么样的，但是既然是纯天然的，应该不会差。<br />
我的联系方式:msn:helloasp@hotmail.com<br />
我的邮箱:xurenlu@126.com</p>
<br/>Tag:<span style='font-weight:bold;'>熊猫</span>&nbsp;<span style='font-weight:bold;'>严重</span>&nbsp;<span style='font-weight:bold;'>生活</span>&nbsp;<span style='font-weight:bold;'>那里</span>&nbsp;<span style='font-weight:bold;'>野生</span>&nbsp;<span style='font-weight:bold;'>众多</span>&nbsp;<span style='font-weight:bold;'>当地</span>&nbsp;<span style='font-weight:bold;'>毁灭性</span>&nbsp;<span style='font-weight:bold;'>破坏</span>&nbsp;<span style='font-weight:bold;'>这对</span>&nbsp;<div>相关文章</div><ul></ul>]]></content:encoded>
			<wfw:commentRss>http://www.162cm.com/archives/659.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>社区全文检索引擎Hyper Estraier 学习笔记[3]</title>
		<link>http://www.162cm.com/archives/658.html</link>
		<comments>http://www.162cm.com/archives/658.html#comments</comments>
		<pubDate>Sun, 22 Jun 2008 04:26:13 +0000</pubDate>
		<dc:creator>xurenlu</dc:creator>
		
		<category><![CDATA[中文分词]]></category>

		<category><![CDATA[HyperEstraier]]></category>

		<category><![CDATA[搜索引擎]]></category>

		<category><![CDATA[检索]]></category>

		<guid isPermaLink="false">http://www.162cm.com/?p=658</guid>
		<description><![CDATA[经过摸索，我决定给HyperEstraier加上由Hightman写的scws支持，使之支持中文分词。
实地看了代码之后，发现Hyperestraier的结构划分并不好，这可能决定了他只能是某些Hacker的心血之作，而不适用多人协作开发，大规模推广应用。这是旁话。
既然找到分词默认是使用的estraier.c的est_break_text函数，那我的目标就是改造这个函数,现在这个函数被我改成了:
scws_t seg;
/* Break a sentence of text and extract words. */
void est_break_text(const char *text, CBLIST *list, int norm, int tail){
// hack by renlu.xu
&#160; CBLIST *words;
&#160; const unsigned char *word, *next;
&#160; unsigned char *utext;
&#160; char *tmp;
&#160; int i, j, k, size, cc, wsiz, nsiz, tsiz;
&#160; assert(text &#38;&#38; list);
	if(seg==NULL)
	{
		seg=scws_new();
		scws_set_charset(seg,&#34;UTF-8&#34;);
		scws_set_rule(seg,&#34;/home/y/etc/rules.utf8.ini&#34;);
		int xmode=0;
		scws_set_dict(seg,&#34;/home/y/etc/dict.xdb&#34;,(xmode &#38; XMODE_DICT_MEM) ? SCWS_XDICT_MEM : SCWS_XDICT_XDB);
		if(seg-&#62;d == [...]]]></description>
			<content:encoded><![CDATA[<p>经过摸索，我决定给HyperEstraier加上由Hightman写的scws支持，使之支持中文分词。<br />
实地看了代码之后，发现Hyperestraier的结构划分并不好，这可能决定了他只能是某些Hacker的心血之作，而不适用多人协作开发，大规模推广应用。这是旁话。<br />
既然找到分词默认是使用的estraier.c的est_break_text函数，那我的目标就是改造这个函数,现在这个函数被我改成了:</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">scws_t seg;</li>
<li>/* Break a sentence of text and extract words. */</li>
<li>void est_break_text(const char *text, CBLIST *list, int norm, int tail){</li>
<li>// hack by renlu.xu</li>
<li>&nbsp; CBLIST *words;</li>
<li>&nbsp; const unsigned char *word, *next;</li>
<li>&nbsp; unsigned char *utext;</li>
<li>&nbsp; char *tmp;</li>
<li>&nbsp; int i, j, k, size, cc, wsiz, nsiz, tsiz;</li>
<li>&nbsp; assert(text &amp;&amp; list);</li>
<li>	if(seg==NULL)</li>
<li>	{</li>
<li>		seg=scws_new();</li>
<li>		scws_set_charset(seg,&quot;UTF-8&quot;);</li>
<li>		scws_set_rule(seg,&quot;/home/y/etc/rules.utf8.ini&quot;);</li>
<li>		int xmode=0;</li>
<li>		scws_set_dict(seg,&quot;/home/y/etc/dict.xdb&quot;,(xmode &amp; XMODE_DICT_MEM) ? SCWS_XDICT_MEM : SCWS_XDICT_XDB);</li>
<li>		if(seg-&gt;d == NULL &amp;&amp; !(xmode &amp; XMODE_NO_TIME))</li>
<li>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fprintf(stderr, &quot;WARNING: input dict file load failed. /home/y/etc/dict.xdb\n&quot;); </li>
<li>		</li>
<li>	}</li>
<li>	int fsize;</li>
<li>&nbsp;&nbsp; &nbsp;fsize=strlen(text);</li>
<li>&nbsp;&nbsp; &nbsp;scws_send_text(seg,text,fsize);</li>
<li>	scws_res_t res,cur;</li>
<li>	while ((cur = res = scws_get_result(seg))!= NULL)</li>
<li>	{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</li>
<li>		while (cur != NULL)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</li>
<li>		{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </li>
<li>			cblistpush(list,text+cur-&gt;off,cur-&gt;len);</li>
<li>			cur = cur-&gt;next;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </li>
<li>		}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</li>
<li>		scws_free_result(res);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </li>
<li>	}</li>
<li>	int iter_i;</li>
<li>	int wsize=0;</li>
<li>	fprintf(stderr,&quot;\nsegmented words:\n&quot;);</li>
<li>	for(iter_i=0;iter_i&lt;cblistnum(list);iter_i++){</li>
<li>		word=CB_LISTVAL2(list,iter_i,wsize);</li>
<li>		fprintf(stderr,&quot;%s\t&quot;,word);</li>
<li>	}</li>
<li>	return ;</li>
<li>&nbsp;}</li></ol></div>
<p>Ok,其中函数中最后一个for语句是为了调试，看看分词结果如何。<br />
这里用到的scws_send_text等函数是hightman的scws中定义的，因此需要在estraier.c的文件头加上:</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">#include &quot;scws.h&quot;</li></ol></div>
<p>并修改Hyperestraier的Makefile:</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">LIBS = -lqdbm -lz -lm -lc&nbsp; -lscws</li></ol></div>
<p>然后make &#038;&#038; make install<br />
下面作个测试:</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">#!/bin/sh</li>
<li>#file:test.sh</li>
<li>rm -rf test_db</li>
<li>estcmd create test_db</li>
<li>find ./ -name &quot;1.txt&quot; -type f |estcmd gather -cl -fm -cm test_db -</li>
<li>estcmd search -vx -max 10 test_db '索引'</li></ol></div>
<p>根据打印的结果，中文分词已经加入到索引过程中去了!</p>
<p><a href="http://www.162cm.com/archives/426.html">社区全文检索引擎Hyper Estraier 学习笔记[1]</a><br/><br />
<a href="http://www.162cm.com/archives/657.html">社区全文检索引擎Hyper Estraier 学习笔记[2]</a><Br/><br />
<a href="http://www.162cm.com/archives/658.html">社区全文检索引擎Hyper Estraier 学习笔记[3]</a><br/></p>
<br/>Tag:<div>相关文章</div><ul></ul>]]></content:encoded>
			<wfw:commentRss>http://www.162cm.com/archives/658.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>社区全文检索引擎Hyper Estraier 学习笔记[2]</title>
		<link>http://www.162cm.com/archives/657.html</link>
		<comments>http://www.162cm.com/archives/657.html#comments</comments>
		<pubDate>Sun, 22 Jun 2008 02:35:41 +0000</pubDate>
		<dc:creator>xurenlu</dc:creator>
		
		<category><![CDATA[全文检索]]></category>

		<category><![CDATA[蜘蛛]]></category>

		<category><![CDATA[HyperEstraier]]></category>

		<category><![CDATA[搜索引擎]]></category>

		<guid isPermaLink="false">http://www.162cm.com/?p=657</guid>
		<description><![CDATA[hyperestraier是在前文已经介绍过一的一个开源搜索引擎程序。
	分词:采用N-gram,char_category等来分词，良好地支持中文等东亚文字。
	分词程序在:estraier.c中
		est_break_text
		est_break_text_perfng
		est_break_text_chrcat
	等分法。
	相关的函数有
  276 static int est_char_category(int c);
  277 static int est_char_category_perfng(int c);
  278 static int est_char_category_chrcat(int c);
等
分词默认采用est_break_text
	当创建数据库时采用 estcmd create dbname -apn 时，采用est_break_text_perfng来分词
	当创建数据库时是用 estcmd create dbname -acc 时，用est_break_text_chrcat来分词
	采用est_break_text来分词时，结果这样样的:
今天	天突	突然	然想	想起	起霍	霍炬	炬曾	曾告	告诉	诉过	过我	我的	的一	一个	个日	日本	本人	人开	开发	发的	的全	全文	文检	检索	索引	引擎	擎,	,	于是	是找	找他	他问	问了	了,
	是双字连着的分词法，这样会占用多至少一倍的检索空间，同时精确度差一点（但是精确度比按字分词好一点)。

系列文章:
社区全文检索引擎Hyper Estraier 学习笔记[1]
社区全文检索引擎Hyper Estraier 学习笔记[2]
社区全文检索引擎Hyper Estraier 学习笔记[3]
Tag:相关文章]]></description>
			<content:encoded><![CDATA[<p>hyperestraier是在前文已经介绍过一的一个<a href="http://www.162cm.com/archives/426.html">开源搜索引擎程</a>序。<br />
	分词:采用N-gram,char_category等来分词，良好地支持中文等东亚文字。<br />
	分词程序在:estraier.c中<br />
		est_break_text<br />
		est_break_text_perfng<br />
		est_break_text_chrcat<br />
	等分法。<br />
	相关的函数有<br />
  276 static int est_char_category(int c);<br />
  277 static int est_char_category_perfng(int c);<br />
  278 static int est_char_category_chrcat(int c);<br />
等</p>
<p>分词默认采用est_break_text<br />
	当创建数据库时采用 estcmd create dbname -apn 时，采用est_break_text_perfng来分词<br />
	当创建数据库时是用 estcmd create dbname -acc 时，用est_break_text_chrcat来分词<br />
	采用est_break_text来分词时，结果这样样的:<br />
今天	天突	突然	然想	想起	起霍	霍炬	炬曾	曾告	告诉	诉过	过我	我的	的一	一个	个日	日本	本人	人开	开发	发的	的全	全文	文检	检索	索引	引擎	擎,	,	于是	是找	找他	他问	问了	了,<br />
	是双字连着的分词法，这样会占用多至少一倍的检索空间，同时精确度差一点（但是精确度比按字分词好一点)。<br />
<br/><br />
系列文章:<br />
<a href="http://www.162cm.com/archives/426.html">社区全文检索引擎Hyper Estraier 学习笔记[1]</a><br/><br />
<a href="http://www.162cm.com/archives/657.html">社区全文检索引擎Hyper Estraier 学习笔记[2]</a><Br/><br />
<a href="http://www.162cm.com/archives/658.html">社区全文检索引擎Hyper Estraier 学习笔记[3]</a><br/></p>
<br/>Tag:<div>相关文章</div><ul></ul>]]></content:encoded>
			<wfw:commentRss>http://www.162cm.com/archives/657.html/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
