09/12
30
转自: http://www.chinaaet.com/article/index.aspx?id=19110
Pachube
英国一家初创公司。Pachube允许你标记并分享即时传感器数据(来自物体、设备、建筑物,以及虚拟和实体环境)。公司创始人Usman Haque称,与其说Pachube和传感器有关,倒不如说其和环境有关。Pachube致力于快速识别并影响你的环境。
IBM的传感器解决方案
IBM 在物联网领域领先的大公司,提供RFID(无线射频识别技术)和传感器技术解决方案。IBM今年和不同的制造商和商品供应商合作,一起把这些解决方案推向全球。
Arduino
Arduino是一个开源电子设备原型设计平台,由开源硬件和软件组成,专门为那些艺术家、设计者,以及对创建互动物体和环境感兴趣的人们而打造。
联邦快递SenseAware
国际快递巨人联邦快递在12月份为包裹推出了一种新型跟踪装置和网络服务,名字叫做SenseAware,它可以显示包裹的温度、地点和其它重要信息,比如是否被打开过或被玩耍过。目前联邦快递已经和50家保健公司和生命科学公司展开了试点合作,用于跟踪手术工具包,医疗设备和器官等。
惠普CeNSE
惠普最近宣布了一个叫做CeNSE(地球中枢神经系统)的科研项目,旨在通过十亿个微型、廉价、结实、敏感的探测器建立一个全球传感网络,该项目的技术来自惠普实验室的纳米传感技术。
日本的西瓜卡(Suica Card)和香港的章鱼卡
今年年初我们曾介绍了三种全球领先的RFID智能卡:日本的西瓜卡,伦敦的牡蛎卡,和香港的章鱼卡。在日本和香港,这些智能卡可以用来从某些商店里购物,或者进入学校和公寓的凭证装置。
Mir:ror
Mir:ror是法国Violet公司生产的一种装置,它可以发现你给它看的物体,然后做出回应。这种魔镜并非自身感应物体,而是通过读取物体上的RFID标签来告诉电脑做什么。
WideNoise
WideNoise是一个iPhone软件,可以对周围环境的噪音级别进行取样,然后显示在一张互动地图上。 如果你在做房地产生意,或者想找一个安静的场所,不妨试试。
ioBridge
ioBridge是一个用于远程控制和监测的网络平台,并自称向“天网(Skynet)”迈进了一步。
德州仪器公司的工程师Morey在业余时间通过Twitter和ioBridge开发了一个双向家用自动化软件。
Citysense
Sense Networks是一家致力于通过即时性和历史性位置数据为现实世界建立目录的公司。公司有一个叫做Macrosense的平台,可以接收即时位置信息,并对其进行分析和处理,然后进行保存供人们查询。
他们已经利用这个平台开发了一款叫做Citysense的软件(适用于iPhone和黑莓手机),允许旧金山的人们即时查看最新的夜生活。
Pachube
英国一家初创公司。Pachube允许你标记并分享即时传感器数据(来自物体、设备、建筑物,以及虚拟和实体环境)。公司创始人Usman Haque称,与其说Pachube和传感器有关,倒不如说其和环境有关。Pachube致力于快速识别并影响你的环境。
IBM的传感器解决方案
IBM 在物联网领域领先的大公司,提供RFID(无线射频识别技术)和传感器技术解决方案。IBM今年和不同的制造商和商品供应商合作,一起把这些解决方案推向全球。
Arduino
Arduino是一个开源电子设备原型设计平台,由开源硬件和软件组成,专门为那些艺术家、设计者,以及对创建互动物体和环境感兴趣的人们而打造。
联邦快递SenseAware
国际快递巨人联邦快递在12月份为包裹推出了一种新型跟踪装置和网络服务,名字叫做SenseAware,它可以显示包裹的温度、地点和其它重要信息,比如是否被打开过或被玩耍过。目前联邦快递已经和50家保健公司和生命科学公司展开了试点合作,用于跟踪手术工具包,医疗设备和器官等。
惠普CeNSE
惠普最近宣布了一个叫做CeNSE(地球中枢神经系统)的科研项目,旨在通过十亿个微型、廉价、结实、敏感的探测器建立一个全球传感网络,该项目的技术来自惠普实验室的纳米传感技术。
日本的西瓜卡(Suica Card)和香港的章鱼卡
今年年初我们曾介绍了三种全球领先的RFID智能卡:日本的西瓜卡,伦敦的牡蛎卡,和香港的章鱼卡。在日本和香港,这些智能卡可以用来从某些商店里购物,或者进入学校和公寓的凭证装置。
Mir:ror
Mir:ror是法国Violet公司生产的一种装置,它可以发现你给它看的物体,然后做出回应。这种魔镜并非自身感应物体,而是通过读取物体上的RFID标签来告诉电脑做什么。
WideNoise
WideNoise是一个iPhone软件,可以对周围环境的噪音级别进行取样,然后显示在一张互动地图上。 如果你在做房地产生意,或者想找一个安静的场所,不妨试试。
ioBridge
ioBridge是一个用于远程控制和监测的网络平台,并自称向“天网(Skynet)”迈进了一步。
德州仪器公司的工程师Morey在业余时间通过Twitter和ioBridge开发了一个双向家用自动化软件。
Citysense
Sense Networks是一家致力于通过即时性和历史性位置数据为现实世界建立目录的公司。公司有一个叫做Macrosense的平台,可以接收即时位置信息,并对其进行分析和处理,然后进行保存供人们查询。
他们已经利用这个平台开发了一款叫做Citysense的软件(适用于iPhone和黑莓手机),允许旧金山的人们即时查看最新的夜生活。
09/12
28
随着Windows 7 发布的日子就要来临,在CB上不断的更新着各种版本的Win 7 的消息,这不,Win 7 的RC版本马上就出来了。在这里给大家充个电,其实一个正统的软件从雏形到上架,每次更新都是有自己的“代号”的,比如Alpha, Beta, RC, Release这些,都是软件版本的命名规则。那么这些代表什么意思呢?还请往下看:
Alpha版: 也写作α版(阿尔法,希腊字母的第一位,代表最初的版本),Alpha是内部测试版,此版本表示该软件在此阶段主要是以实现软件功能为主,通常只在软件开发者内部交流,一般而言,该版本软件的Bug较多,需要继续修改,除非你也是测试人员,否则不建议使用。
Beta版: β, 中文称作贝塔版,可以理解成为公测版,该版本相对于α版已有了很大的改进,消除了严重的错误,但还是存在着一些缺陷,需要经过多次测试来进一步消除,此版本主要的修改对像是软件的UI。
RC版: (Release Candidate),软件发行的最终候选版本。该版本已经相当成熟了,基本上不存在导致错误的BUG,与即将发行的正式版相差无几。与Beta版相比,此时不会加入太多的新功能,而主要着重于排错。
RTM(Release to Manufacture) ,也称作Release版, 该版本意味“最终版本”,在前面版本的一系列测试版之后,终归会有一个正式版本,是最终交付用户使用的一个版本。我们在商店买的正版软件都是RTM(Release)版的,该版本有时也称为标准版。一般情况下,Release不会以单词形式出现在软件封面上,取而代之的是符号(R)。
而Windows中,发行版本里还有更多的名称,稍微讲解一些吧
OEM版:是给计算机厂商随着计算机贩卖的,也就是随机版。只能随机器出货,不能零售。只能全新安装,不能从旧有操作系统升级。如果买笔记型计算机或品牌计算机就会有随机版软件。包装不像零售版精美,通常只有一面CD和说明书(授权书)。
RTL版:是真正的正式版,正式上架零售版。在安装盘的i386文件夹里有一个eula.txt,最后有一行EULAID,就是你的版本。比如简体中文正式版是EULAID:WX.4_PRO_RTL_CN,繁体中文正式版是WX.4_PRO_RTL_TW。其中:如果是WX.开头是正式版,WB.开头是测试版。_PRE,代表家庭版;_PRO,代表专业版。
VOL版:(Volume Licensing for Organizations):团体批量许可证(大量采购授权合约)。可能有人会认为这个不是vlo么?其实vol是取了volume的前3个字母而已,不是3个词的字母缩写。比如英文wxp pro的vol版本的光盘卷标就是wxpvol_en,其中wx表示是windows xp,p是professional(vol没有home版本),vol表明是团体批量许可证版本,en是表明是英语。获得途径主要是集团购买,某些msdn用户也可以得到。这种版本根据购买数量等又细分为“开放式许可证(open license)”、“选择式许可证(select license)”、“企业协议(enterprise agreement)”、“学术教育许可证(academic volume licensing)”等5种版本
VLK:VLK不是一个版本!,因为经常看到不懂的人在大喊VLK版什么的,有必要声明一下!VLK,英文全称:Volume Licensing (Product) Keys,它所指的只是一个KEY(密匙),仅仅是一个为证明产品合法化、以及安装所使用的KEY,因为根据VOL计划规定,VOL产品是不需要激活的!或者说,VLK不是指一种版本,而是指这种版本在部署(deploy)过程中所需要的KEY,而需要VLK这种KEY的版本应该叫做VOL!只不过在实际中,没有必要强调这种叫法、称呼的准确性,加之很多人的VOL版本光盘是通过企业的选择式许可证、企业协议等方式得到的等等原因,所以才会有很多人叫他为“选择版”等等。
官方网站有一个表格,上面有一句话:“different products require different volume licensing keys (vlks). refer to the table below to make sure you have the correct vlk for your microsoft product.”,我想这就很好的说明了vlk指的是key而不是产品了。
像经典的DG8FV就是VLK
EVAL版:而流通在网络上的EVAL版,是微软帮媒体记者编辑上课给的,是所谓的「评估版」没错,你输入的金钥是30天的,就可用30天,输入的是180天的,就可用180天。功能上和零售版无乎没有区别。
RVL版:号称是正式版,其实RVL根本不是版本的名称。RVL.是一个Warez.Team,台湾分部叫RVL@TW.,它之间又释出一个.WinXP.RVL@TW.版本。它是某中文版+英文Corpfiles当破解的。
FPP版(Full Packaged Product)零售版,就是在各大软件店看到有漂亮包装的那种。可以升级安装,也可以全新安装。 但是需要激活,机器配置更换了还要通知微软,是比较痛苦的东西。
看了这么多,都晕了吧,不多废话了。至于HOME, PRO, ENTERPRISE, ULTIMATE这几个版本就不用多说了吧
最后一句,品牌机安OEM,攒机安装VOL,烧钱热血兼支持正版的安装RTL,FPP,玩笑话,不要当真。
Alpha版: 也写作α版(阿尔法,希腊字母的第一位,代表最初的版本),Alpha是内部测试版,此版本表示该软件在此阶段主要是以实现软件功能为主,通常只在软件开发者内部交流,一般而言,该版本软件的Bug较多,需要继续修改,除非你也是测试人员,否则不建议使用。
Beta版: β, 中文称作贝塔版,可以理解成为公测版,该版本相对于α版已有了很大的改进,消除了严重的错误,但还是存在着一些缺陷,需要经过多次测试来进一步消除,此版本主要的修改对像是软件的UI。
RC版: (Release Candidate),软件发行的最终候选版本。该版本已经相当成熟了,基本上不存在导致错误的BUG,与即将发行的正式版相差无几。与Beta版相比,此时不会加入太多的新功能,而主要着重于排错。
RTM(Release to Manufacture) ,也称作Release版, 该版本意味“最终版本”,在前面版本的一系列测试版之后,终归会有一个正式版本,是最终交付用户使用的一个版本。我们在商店买的正版软件都是RTM(Release)版的,该版本有时也称为标准版。一般情况下,Release不会以单词形式出现在软件封面上,取而代之的是符号(R)。
而Windows中,发行版本里还有更多的名称,稍微讲解一些吧
OEM版:是给计算机厂商随着计算机贩卖的,也就是随机版。只能随机器出货,不能零售。只能全新安装,不能从旧有操作系统升级。如果买笔记型计算机或品牌计算机就会有随机版软件。包装不像零售版精美,通常只有一面CD和说明书(授权书)。
RTL版:是真正的正式版,正式上架零售版。在安装盘的i386文件夹里有一个eula.txt,最后有一行EULAID,就是你的版本。比如简体中文正式版是EULAID:WX.4_PRO_RTL_CN,繁体中文正式版是WX.4_PRO_RTL_TW。其中:如果是WX.开头是正式版,WB.开头是测试版。_PRE,代表家庭版;_PRO,代表专业版。
VOL版:(Volume Licensing for Organizations):团体批量许可证(大量采购授权合约)。可能有人会认为这个不是vlo么?其实vol是取了volume的前3个字母而已,不是3个词的字母缩写。比如英文wxp pro的vol版本的光盘卷标就是wxpvol_en,其中wx表示是windows xp,p是professional(vol没有home版本),vol表明是团体批量许可证版本,en是表明是英语。获得途径主要是集团购买,某些msdn用户也可以得到。这种版本根据购买数量等又细分为“开放式许可证(open license)”、“选择式许可证(select license)”、“企业协议(enterprise agreement)”、“学术教育许可证(academic volume licensing)”等5种版本
VLK:VLK不是一个版本!,因为经常看到不懂的人在大喊VLK版什么的,有必要声明一下!VLK,英文全称:Volume Licensing (Product) Keys,它所指的只是一个KEY(密匙),仅仅是一个为证明产品合法化、以及安装所使用的KEY,因为根据VOL计划规定,VOL产品是不需要激活的!或者说,VLK不是指一种版本,而是指这种版本在部署(deploy)过程中所需要的KEY,而需要VLK这种KEY的版本应该叫做VOL!只不过在实际中,没有必要强调这种叫法、称呼的准确性,加之很多人的VOL版本光盘是通过企业的选择式许可证、企业协议等方式得到的等等原因,所以才会有很多人叫他为“选择版”等等。
官方网站有一个表格,上面有一句话:“different products require different volume licensing keys (vlks). refer to the table below to make sure you have the correct vlk for your microsoft product.”,我想这就很好的说明了vlk指的是key而不是产品了。
像经典的DG8FV就是VLK
EVAL版:而流通在网络上的EVAL版,是微软帮媒体记者编辑上课给的,是所谓的「评估版」没错,你输入的金钥是30天的,就可用30天,输入的是180天的,就可用180天。功能上和零售版无乎没有区别。
RVL版:号称是正式版,其实RVL根本不是版本的名称。RVL.是一个Warez.Team,台湾分部叫RVL@TW.,它之间又释出一个.WinXP.RVL@TW.版本。它是某中文版+英文Corpfiles当破解的。
FPP版(Full Packaged Product)零售版,就是在各大软件店看到有漂亮包装的那种。可以升级安装,也可以全新安装。 但是需要激活,机器配置更换了还要通知微软,是比较痛苦的东西。
看了这么多,都晕了吧,不多废话了。至于HOME, PRO, ENTERPRISE, ULTIMATE这几个版本就不用多说了吧
最后一句,品牌机安OEM,攒机安装VOL,烧钱热血兼支持正版的安装RTL,FPP,玩笑话,不要当真。
09/12
28
CSphSource 数据源
CSphSource_XMLPipe2-XML文件获取数据
CSphSource_SQL-SQL(MySQL)获取数据
CSphIndex 索引器
派生类CSphIndex_VLN
// 索引过程
virtual int Build ( CSphDict * pDict,
const CSphVector & dSources, // 所有数据源
int iMemoryLimit, // 内存设置
ESphDocinfo eDocinfo );
/// available docinfo storage strategies
enum ESphDocinfo
{
SPH_DOCINFO_NONE = 0, ///< no docinfo available
SPH_DOCINFO_INLINE = 1, ///< inline docinfo into index (specifically, into doclists)
SPH_DOCINFO_EXTERN = 2 ///< store docinfo separately
};
BYTE ** CSphSource_SQL::NextDocument ( CSphString & sError )
{
m_tDocInfo.m_iDocID = sphToDocid ( SqlColumn(0) ); // 取得文档ID值
}
bool CSphSource_Document::IterateHitsNext ( CSphString & sError )
{
while ( ( sWord = m_pTokenizer->GetToken() )!=NULL ) //分词
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CSphAutofile fdTmpDocinfos ("tmp2") // 存储文档信息
DOCINFO2ID(pDocinfo) = pSource->m_tDocInfo.m_iDocID; // 自定义ID
memcpy ( DOCINFO2ATTRS(pDocinfo), pSource->m_tDocInfo.m_pRowitems, sizeof(CSphRowitem)*m_tSchema.GetRowSize() );
pDocinfo += iDocinfoStride;
Sphinx使用的文件包括 "sph", "spa", "spi", "spd", "spp", "spm" ,还有锁文件。其中sph是系统的配置文件。其它则为索引文件。
.Spi 文件:保存WordId及指向此WordId对应的文档信息在spd文件的指针。Spi文件在检索程序启动时完全加载入内存。Spi文件是分块的,块内排序,块之间也排序。分块的目的应该是为了快速检索到WordId,因为Spi中的WordId是变长压缩的,索引需要先在块级别做二分定位,再在快内解压缩查找。
文件结构,每块中结构,wordId实际存储的是差值
.Spd文件:文件结构
.Spp文件: 文件结构
.Spa文件:存储DocInfo的文件,检索程序启动时会把此文件加载如内存,sphinx可以指定DocInfo的存储方式,
① 存储到spd文件中(InLine)
②. 另外单独存储。指定此,就会生成spa文件
文件结构:
.Spm文件:在DocInfo中,有一种特殊的属性,叫MVA,多值属性。Sphinx对此属性特殊处理,需要存储在spm文件中。检索程序启动时会把此文件加载如内存。此(MVA)属性在DocInfo对应位置存储其在此文件中的字节偏移量。
文件结构:
由于在第一趟扫描过程中会出现WordID相同的不同Hits(不同文档或者不同位置不同字段),二趟前会根据WordID排序,WordID相同的Hits会连续出现并合并(合并到第一次出现的相同WordID中)
/////////////////////////////////////////////
Spi文件
// 遍历所有的数据源
// 遍历所有的文档
struct CSphWordHit
{
SphDocID_t m_iDocID; ///< document ID
SphWordID_t m_iWordID; ///< word ID in current dictionary
DWORD m_iWordPos; ///< word position in current document
};
CSphWordHit.. CSphWordHit…CSphWordHit…CSphWordHit串接
dHitBlocks.Add( cidxWriteRawVLB ( fdTmpHits.GetFD(), dHits, iHits, NULL, 0, 0 ) );//
GetIndexFileName("tmp1") 将Hits流写入tmp1文件。临时文件
不论重复,不论字段
dBins[i]->ReadHit(&tHit,iRowitems,dInlineAttrs+i*iRowitems )// 重新读入内存
cidxHit(tQueue.m_pData,iRowitems?dInlineAttrs+iBin*iRowitems : NULL );
// 统计后刷入m_wrWordlist,形如以下字节流(有缓冲,缓冲满则写入磁盘)
此时写入的是最终的索引文件,格式如上
Spd文件
文件结构
//tQuery.m_eMode = SPH_MATCH_ANY;
tQuery.m_eMode = SPH_MATCH_BOOLEAN;
//tQuery.m_eMode = SPH_MATCH_PHRASE;
//tQuery.m_eMode = SPH_MATCH_EXTENDED;
//tQuery.m_eMode = SPH_MATCH_EXTENDED2;
//SPH_SORT_RELEVANCE 模式, 按相关度降序排列(最好的匹配排在最前面)
//SPH_SORT_ATTR_DESC 模式, 按属性降序排列(属性值越大的越是排在前面)
//SPH_SORT_ATTR_ASC模式, 按属性升序排列(属性值越小的越是排在前面)
//SPH_SORT_TIME_SEGMENTS 模式, 先按时间段(最近一小时/天/周/月)降序,再按
// 相关度降序
//SPH_SORT_EXTENDED 模式, 按一种类似SQL的方式将列组合起来,升序或降序排
// 列。
//SPH_SORT_EXPR 模式,按某个算术表达式排序。
switch ( pQuery->m_eMode )
{
case SPH_MATCH_ALL: bMatch = MatchAll ( pQuery, pResult, iSorters, ppSorters ); break;// 与查询
case SPH_MATCH_PHRASE: bMatch = MatchAll ( pQuery, pResult, iSorters, ppSorters ); break;//短语查询
case SPH_MATCH_ANY: bMatch = MatchAny ( pQuery, pResult, iSorters, ppSorters ); break; //或查询
case SPH_MATCH_BOOLEAN: bMatch = MatchBoolean ( pQuery, pResult, iSorters, ppSorters, tTermSetup ); break;//布尔查询
case SPH_MATCH_EXTENDED: bMatch = MatchExtendedV1 ( pQuery, pResult, iSorters, ppSorters, tTermSetup ); break;//扩展查询
case SPH_MATCH_EXTENDED2: bMatch = MatchExtended ( pQuery, pResult, iSorters, ppSorters, tTermSetup ); break;
case SPH_MATCH_FULLSCAN: bMatch = MatchFullScan ( pQuery, iSorters, ppSorters, tTermSetup ); break;
default: sphDie ( "INTERNAL ERROR: unknown matching mode (mode=%d)", pQuery->m_eMode );
}
ISphTokenizer * pTokenizer
// 用作解析的配置信息,例如字符集,切词规则(n-gram)
// 包括同义词,过滤词
1. pResult = pIndex->Query ( pTokenizer, pDict, &tQuery );
{
ISphMatchSorter * pTop = sphCreateQueue ( pQuery, m_tSchema, sError );(
pTop=newCSphMatchQueue> ( pQuery->m_iMaxMatches, bUsesAttrs ); //选择排序规则
)
2. if ( QueryEx ( pTokenizer, pDict, pQuery, pResult, pTop ) )
3. bool bRes = MultiQuery ( pTokenizer, pDict, pQuery, pResult, 1, &pTop );
4. case SPH_MATCH_BOOLEAN: bMatch = MatchBoolean ( pQuery, pResult, iSorters, ppSorters, tTermSetup );
CSphSource_XMLPipe2-XML文件获取数据
CSphSource_SQL-SQL(MySQL)获取数据
CSphIndex 索引器
派生类CSphIndex_VLN
// 索引过程
virtual int Build ( CSphDict * pDict,
const CSphVector
int iMemoryLimit, // 内存设置
ESphDocinfo eDocinfo );
/// available docinfo storage strategies
enum ESphDocinfo
{
SPH_DOCINFO_NONE = 0, ///< no docinfo available
SPH_DOCINFO_INLINE = 1, ///< inline docinfo into index (specifically, into doclists)
SPH_DOCINFO_EXTERN = 2 ///< store docinfo separately
};
BYTE ** CSphSource_SQL::NextDocument ( CSphString & sError )
{
m_tDocInfo.m_iDocID = sphToDocid ( SqlColumn(0) ); // 取得文档ID值
}
bool CSphSource_Document::IterateHitsNext ( CSphString & sError )
{
while ( ( sWord = m_pTokenizer->GetToken() )!=NULL ) //分词
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CSphAutofile fdTmpDocinfos ("tmp2") // 存储文档信息
DOCINFO2ID(pDocinfo) = pSource->m_tDocInfo.m_iDocID; // 自定义ID
memcpy ( DOCINFO2ATTRS(pDocinfo), pSource->m_tDocInfo.m_pRowitems, sizeof(CSphRowitem)*m_tSchema.GetRowSize() );
pDocinfo += iDocinfoStride;
Sphinx使用的文件包括 "sph", "spa", "spi", "spd", "spp", "spm" ,还有锁文件。其中sph是系统的配置文件。其它则为索引文件。
.Spi 文件:保存WordId及指向此WordId对应的文档信息在spd文件的指针。Spi文件在检索程序启动时完全加载入内存。Spi文件是分块的,块内排序,块之间也排序。分块的目的应该是为了快速检索到WordId,因为Spi中的WordId是变长压缩的,索引需要先在块级别做二分定位,再在快内解压缩查找。
文件结构,每块中结构,wordId实际存储的是差值
WordId | SpdFilePointer | DocNum | HitNum
.Spd文件:文件结构
DocID | [DocInfo] | HitFilePointer | FieldNum | HitNum
.Spp文件: 文件结构
HitPos
.Spa文件:存储DocInfo的文件,检索程序启动时会把此文件加载如内存,sphinx可以指定DocInfo的存储方式,
① 存储到spd文件中(InLine)
②. 另外单独存储。指定此,就会生成spa文件
文件结构:
DocId | DocInfo
.Spm文件:在DocInfo中,有一种特殊的属性,叫MVA,多值属性。Sphinx对此属性特殊处理,需要存储在spm文件中。检索程序启动时会把此文件加载如内存。此(MVA)属性在DocInfo对应位置存储其在此文件中的字节偏移量。
文件结构:
DocId | Anum,A1,A2,…,An | Bnum,B1,B2,…,Bn | …
由于在第一趟扫描过程中会出现WordID相同的不同Hits(不同文档或者不同位置不同字段),二趟前会根据WordID排序,WordID相同的Hits会连续出现并合并(合并到第一次出现的相同WordID中)
/////////////////////////////////////////////
Spi文件
// 遍历所有的数据源
// 遍历所有的文档
struct CSphWordHit
{
SphDocID_t m_iDocID; ///< document ID
SphWordID_t m_iWordID; ///< word ID in current dictionary
DWORD m_iWordPos; ///< word position in current document
};
CSphWordHit.. CSphWordHit…CSphWordHit…CSphWordHit串接
dHitBlocks.Add( cidxWriteRawVLB ( fdTmpHits.GetFD(), dHits, iHits, NULL, 0, 0 ) );//
GetIndexFileName("tmp1") 将Hits流写入tmp1文件。临时文件
不论重复,不论字段
dBins[i]->ReadHit(&tHit,iRowitems,dInlineAttrs+i*iRowitems )// 重新读入内存
cidxHit(tQueue.m_pData,iRowitems?dInlineAttrs+iBin*iRowitems : NULL );
// 统计后刷入m_wrWordlist,形如以下字节流(有缓冲,缓冲满则写入磁盘)
WordId | SpdFilePointer | DocNum | HitNum
此时写入的是最终的索引文件,格式如上
Spd文件
文件结构
DocID | [DocInfo] | HitFilePointer | FieldNum | HitNum
//tQuery.m_eMode = SPH_MATCH_ANY;
tQuery.m_eMode = SPH_MATCH_BOOLEAN;
//tQuery.m_eMode = SPH_MATCH_PHRASE;
//tQuery.m_eMode = SPH_MATCH_EXTENDED;
//tQuery.m_eMode = SPH_MATCH_EXTENDED2;
//SPH_SORT_RELEVANCE 模式, 按相关度降序排列(最好的匹配排在最前面)
//SPH_SORT_ATTR_DESC 模式, 按属性降序排列(属性值越大的越是排在前面)
//SPH_SORT_ATTR_ASC模式, 按属性升序排列(属性值越小的越是排在前面)
//SPH_SORT_TIME_SEGMENTS 模式, 先按时间段(最近一小时/天/周/月)降序,再按
// 相关度降序
//SPH_SORT_EXTENDED 模式, 按一种类似SQL的方式将列组合起来,升序或降序排
// 列。
//SPH_SORT_EXPR 模式,按某个算术表达式排序。
switch ( pQuery->m_eMode )
{
case SPH_MATCH_ALL: bMatch = MatchAll ( pQuery, pResult, iSorters, ppSorters ); break;// 与查询
case SPH_MATCH_PHRASE: bMatch = MatchAll ( pQuery, pResult, iSorters, ppSorters ); break;//短语查询
case SPH_MATCH_ANY: bMatch = MatchAny ( pQuery, pResult, iSorters, ppSorters ); break; //或查询
case SPH_MATCH_BOOLEAN: bMatch = MatchBoolean ( pQuery, pResult, iSorters, ppSorters, tTermSetup ); break;//布尔查询
case SPH_MATCH_EXTENDED: bMatch = MatchExtendedV1 ( pQuery, pResult, iSorters, ppSorters, tTermSetup ); break;//扩展查询
case SPH_MATCH_EXTENDED2: bMatch = MatchExtended ( pQuery, pResult, iSorters, ppSorters, tTermSetup ); break;
case SPH_MATCH_FULLSCAN: bMatch = MatchFullScan ( pQuery, iSorters, ppSorters, tTermSetup ); break;
default: sphDie ( "INTERNAL ERROR: unknown matching mode (mode=%d)", pQuery->m_eMode );
}
ISphTokenizer * pTokenizer
// 用作解析的配置信息,例如字符集,切词规则(n-gram)
// 包括同义词,过滤词
1. pResult = pIndex->Query ( pTokenizer, pDict, &tQuery );
{
ISphMatchSorter * pTop = sphCreateQueue ( pQuery, m_tSchema, sError );(
pTop=newCSphMatchQueue
)
2. if ( QueryEx ( pTokenizer, pDict, pQuery, pResult, pTop ) )
3. bool bRes = MultiQuery ( pTokenizer, pDict, pQuery, pResult, 1, &pTop );
4. case SPH_MATCH_BOOLEAN: bMatch = MatchBoolean ( pQuery, pResult, iSorters, ppSorters, tTermSetup );
09/12
28
<?php
//循环删除目录和文件函数
function delDirAndFile( $dirName )
{
if ( $handle = opendir( "$dirName" ) ) {
while ( false !== ( $item = readdir( $handle ) ) ) {
if ( $item != "." && $item != ".." ) {
if ( is_dir( "$dirName/$item" ) ) {
delDirAndFile( "$dirName/$item" );
} else {
if( unlink( "$dirName/$item" ) )echo "成功删除文件: $dirName/$item<br />\n";
}
}
}
closedir( $handle );
if( rmdir( $dirName ) )echo "成功删除目录: $dirName<br />\n";
}
}
?>
//循环删除目录和文件函数
function delDirAndFile( $dirName )
{
if ( $handle = opendir( "$dirName" ) ) {
while ( false !== ( $item = readdir( $handle ) ) ) {
if ( $item != "." && $item != ".." ) {
if ( is_dir( "$dirName/$item" ) ) {
delDirAndFile( "$dirName/$item" );
} else {
if( unlink( "$dirName/$item" ) )echo "成功删除文件: $dirName/$item<br />\n";
}
}
}
closedir( $handle );
if( rmdir( $dirName ) )echo "成功删除目录: $dirName<br />\n";
}
}
?>
<?php
//循环目录下的所有文件
function delFileUnderDir( $dirName="../Smarty/templates/templates_c" )
{
if ( $handle = opendir( "$dirName" ) ) {
while ( false !== ( $item = readdir( $handle ) ) ) {
if ( $item != "." && $item != ".." ) {
if ( is_dir( "$dirName/$item" ) ) {
delFileUnderDir( "$dirName/$item" );
} else {
if( unlink( "$dirName/$item" ) )echo "成功删除文件: $dirName/$item<br />\n";
}
}
}
closedir( $handle );
}
}
?>
//循环目录下的所有文件
function delFileUnderDir( $dirName="../Smarty/templates/templates_c" )
{
if ( $handle = opendir( "$dirName" ) ) {
while ( false !== ( $item = readdir( $handle ) ) ) {
if ( $item != "." && $item != ".." ) {
if ( is_dir( "$dirName/$item" ) ) {
delFileUnderDir( "$dirName/$item" );
} else {
if( unlink( "$dirName/$item" ) )echo "成功删除文件: $dirName/$item<br />\n";
}
}
}
closedir( $handle );
}
}
?>
09/12
22
作者:老王
前提条件是你的系统已经安装好了apache和php,并且要有一份对应的php源代码,这些都不是难事。
-----------------------------------------------------------------------------------------------
进入php源代码目录,然后看看操作过程(这里假设我们要做一个名为test的扩展):
cd ./ext
./ext_skel --extname=test
cd ./test
vi config.m4
这里要对config.m4文件做一些修改:
dnl PHP_ARG_ENABLE(test, whether to enable test support,
dnl Make sure that the comment is aligned:
dnl [ --enable-test Enable test support])
去掉上面三行的dnl,使之变为
PHP_ARG_ENABLE(test, whether to enable test support,
Make sure that the comment is aligned:
[ --enable-test Enable test support])
dnl在这里是起到注释的作用,当然你也可以去掉下面三句前面的dnl
dnl PHP_ARG_WITH(test, for test support,
dnl Make sure that the comment is aligned:
dnl [ --with-test Include test support])
这中间的区别就在于编译时是使用enable-test还是with-test,前者意味着不需要第三方库,后者正好相反,这里我们选择enable-test方式。
vi test.c
我们还可以通过修改test.c文件来增加或者的功能,这里我们是演示目的,就不修改这个文件了。
/usr/local/bin/phpize
执行这一步的目的是根据config.m4文件的内容生成configure文件
./configure --enable-test
make
这时,在./ext/test/modules目录就应该已经生成了test.so扩展模块了,怎么样,很简单吧。
make install
会自动把生成的test.so模块拷贝到php认为正确的扩展目录,我测试的时候此目录为
/usr/local/lib/php/extensions/no-debug-non-zts-20060613/
no-debug-non-zts-20060613部分可能有差异,具体依赖与php的版本和编译选项。
如果你不详把扩展放在上面所示的目录中,可以
vi /usr/local/lib/php.ini
修改extension_dir选项为你的扩展目录名,并把test.so复制到此目录中
然后执行扩展目录中的test.php文件(此文件是自动生成的)
/usr/local/bin/php -f test.php
会发现如下字样:
Functions available in the test extension:
confirm_test_compiled
Congratulations! You have successfully modified ext/test/config.m4. Module test is now compiled into PHP.
----------------------------------------------------------------------------------------------
test.php文件中使用dl函数来动态加载test.so扩展,如果你想让php自动加载此扩展,只要进行如下操作即可:
vi /usr/local/lib/php.ini 加入extension=test.so
/usr/local/apache2/bin/apachectl restart
此时,如果你浏览phpinfo(),会发现test相应的扩展信息。
如果你使用命令行,那么通过下面命令也能看到:/usr/local/bin/php -m
----------------------------------------------------------------------------------------------
我们编写的test扩展成功了,当然,目前它还没有任何有用的功能,呵呵。
前提条件是你的系统已经安装好了apache和php,并且要有一份对应的php源代码,这些都不是难事。
-----------------------------------------------------------------------------------------------
进入php源代码目录,然后看看操作过程(这里假设我们要做一个名为test的扩展):
cd ./ext
./ext_skel --extname=test
cd ./test
vi config.m4
这里要对config.m4文件做一些修改:
dnl PHP_ARG_ENABLE(test, whether to enable test support,
dnl Make sure that the comment is aligned:
dnl [ --enable-test Enable test support])
去掉上面三行的dnl,使之变为
PHP_ARG_ENABLE(test, whether to enable test support,
Make sure that the comment is aligned:
[ --enable-test Enable test support])
dnl在这里是起到注释的作用,当然你也可以去掉下面三句前面的dnl
dnl PHP_ARG_WITH(test, for test support,
dnl Make sure that the comment is aligned:
dnl [ --with-test Include test support])
这中间的区别就在于编译时是使用enable-test还是with-test,前者意味着不需要第三方库,后者正好相反,这里我们选择enable-test方式。
vi test.c
我们还可以通过修改test.c文件来增加或者的功能,这里我们是演示目的,就不修改这个文件了。
/usr/local/bin/phpize
执行这一步的目的是根据config.m4文件的内容生成configure文件
./configure --enable-test
make
这时,在./ext/test/modules目录就应该已经生成了test.so扩展模块了,怎么样,很简单吧。
make install
会自动把生成的test.so模块拷贝到php认为正确的扩展目录,我测试的时候此目录为
/usr/local/lib/php/extensions/no-debug-non-zts-20060613/
no-debug-non-zts-20060613部分可能有差异,具体依赖与php的版本和编译选项。
如果你不详把扩展放在上面所示的目录中,可以
vi /usr/local/lib/php.ini
修改extension_dir选项为你的扩展目录名,并把test.so复制到此目录中
然后执行扩展目录中的test.php文件(此文件是自动生成的)
/usr/local/bin/php -f test.php
会发现如下字样:
Functions available in the test extension:
confirm_test_compiled
Congratulations! You have successfully modified ext/test/config.m4. Module test is now compiled into PHP.
----------------------------------------------------------------------------------------------
test.php文件中使用dl函数来动态加载test.so扩展,如果你想让php自动加载此扩展,只要进行如下操作即可:
vi /usr/local/lib/php.ini 加入extension=test.so
/usr/local/apache2/bin/apachectl restart
此时,如果你浏览phpinfo(),会发现test相应的扩展信息。
如果你使用命令行,那么通过下面命令也能看到:/usr/local/bin/php -m
----------------------------------------------------------------------------------------------
我们编写的test扩展成功了,当然,目前它还没有任何有用的功能,呵呵。
09/12
22
sudo gedit sudo gedit ~/.vimrc
" 使用 torte 的配色方案,如果你不喜欢这个方案
" 请依次点开VIM工具栏:编辑-配色方案-
" 选择你喜欢的方案然后把方案名写在下面
color torte
" 设置用于GUI图形用户界面的字体列表。
" 最后的选项是字体大小,如果你的字体的名字是由多个单词组成的请依次用"\"隔开
set guifont=Bitstream\Vera\Sans\Mono\ 11
''
set nocompatible
" 设定文件浏览器目录为当前目录
set bsdir=buffer
set autochdir
" 设置编码
set enc=utf-8
" 设置文件编码
set fenc=utf-8
" 设置文件编码检测类型及支持格式
set fencs=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
" 指定菜单语言
set langmenu=zh_CN.UTF-8
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
" 设置php语法高亮度
syntax enable
source $VIMRUNTIME/syntax/php.vim
"显示行号
set nu!
" 查找结果高亮度显示
set hlsearch
" tab宽度
set tabstop=4
set cindent shiftwidth=4
set autoindent shiftwidth=4
" 单行注释
set comments=://
" 段落注释
set comments=s1:/*,mb:*,ex0:/
" 增强检索功能
set tags=./tags,./../tags,./**/tags
" 键盘操作
map gk
map gj
" 命令行高度
set cmdheight=1
" 中文帮助
if version > 603
set helplang=cn
endi
" 配置文件结束
" 使用 torte 的配色方案,如果你不喜欢这个方案
" 请依次点开VIM工具栏:编辑-配色方案-
" 选择你喜欢的方案然后把方案名写在下面
color torte
" 设置用于GUI图形用户界面的字体列表。
" 最后的选项是字体大小,如果你的字体的名字是由多个单词组成的请依次用"\"隔开
set guifont=Bitstream\Vera\Sans\Mono\ 11
''
set nocompatible
" 设定文件浏览器目录为当前目录
set bsdir=buffer
set autochdir
" 设置编码
set enc=utf-8
" 设置文件编码
set fenc=utf-8
" 设置文件编码检测类型及支持格式
set fencs=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
" 指定菜单语言
set langmenu=zh_CN.UTF-8
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
" 设置php语法高亮度
syntax enable
source $VIMRUNTIME/syntax/php.vim
"显示行号
set nu!
" 查找结果高亮度显示
set hlsearch
" tab宽度
set tabstop=4
set cindent shiftwidth=4
set autoindent shiftwidth=4
" 单行注释
set comments=://
" 段落注释
set comments=s1:/*,mb:*,ex0:/
" 增强检索功能
set tags=./tags,./../tags,./**/tags
" 键盘操作
map
map
" 命令行高度
set cmdheight=1
" 中文帮助
if version > 603
set helplang=cn
endi
" 配置文件结束
09/12
22
vim 配置说明,,中文 的
09/12
19
腾讯QQ在线客服代码的生成
访问:
http://imis.qq.com/webpresence/code.shtml
选择在线状态图片风格、填写QQ号码、在线状态的使用范围(域名)、图片旁的留言、会话权限(一般选择沟通时可使用图片、可发送文件),然后点击“生成网页代码”,根据提示输入QQ的密码和验证码,然后就会生成代码。
淘宝旺旺在线客服代码的生成
访问:
http://www.taobao.com/help/wangwang/wangwang_0628_04.php
选择在线状态图片风格、填写淘宝旺旺号码、图片提示,然后点击“生成网页代码”,然后就会生成代码。
微软MSN在线客服代码的生成
访问:
http://settings.messenger.live.com/Applications/WebSettings.aspx
登录以后,选择“允许网络上的人查看您是否联机并发给您发送消息”,然后选择“创建HTML”,在这个页面选择“状态图标”,然后就会生成代码。
谷歌Gtalk在线客服代码的生成
访问:
http://www.google.com/talk/service/badge/New
选择“Edit”,填写标题、nickname,选择Style,建议选择“Hyperlink and status icon (no frame)”,点击“Update badge”可以看到即时效果,确认无误即可复制代码。
注:标题会覆盖昵称(nickname)。
提示:上述操作过程在Windows 7 + 搜狗浏览器下测试通过。测试发现腾讯QQ的网站在Ubuntu 9.04 + Firefox 3.5下工作不正常,淘宝旺旺和谷歌Gtalk的相关网站在Ubuntu 9.04 + Firefox 3.5下工作正常,微软MSN的相关网站未做这项测试。
访问:
http://imis.qq.com/webpresence/code.shtml
选择在线状态图片风格、填写QQ号码、在线状态的使用范围(域名)、图片旁的留言、会话权限(一般选择沟通时可使用图片、可发送文件),然后点击“生成网页代码”,根据提示输入QQ的密码和验证码,然后就会生成代码。
淘宝旺旺在线客服代码的生成
访问:
http://www.taobao.com/help/wangwang/wangwang_0628_04.php
选择在线状态图片风格、填写淘宝旺旺号码、图片提示,然后点击“生成网页代码”,然后就会生成代码。
微软MSN在线客服代码的生成
访问:
http://settings.messenger.live.com/Applications/WebSettings.aspx
登录以后,选择“允许网络上的人查看您是否联机并发给您发送消息”,然后选择“创建HTML”,在这个页面选择“状态图标”,然后就会生成代码。
谷歌Gtalk在线客服代码的生成
访问:
http://www.google.com/talk/service/badge/New
选择“Edit”,填写标题、nickname,选择Style,建议选择“Hyperlink and status icon (no frame)”,点击“Update badge”可以看到即时效果,确认无误即可复制代码。
注:标题会覆盖昵称(nickname)。
提示:上述操作过程在Windows 7 + 搜狗浏览器下测试通过。测试发现腾讯QQ的网站在Ubuntu 9.04 + Firefox 3.5下工作不正常,淘宝旺旺和谷歌Gtalk的相关网站在Ubuntu 9.04 + Firefox 3.5下工作正常,微软MSN的相关网站未做这项测试。






