Skip to content

{ Monthly Archives } 十月 2006

部门变动

      不久前才从视频搜索换到网页大搜索,这相当于换了一下小部门,直接主管也变了。幸运的是,还是可以跟以前那一帮人一起吃饭。所以,每天的午餐时间,成了联系大家的纽带。       但今天,部门主管过来告诉我说,另一个部门需要从我们部门调一个过去帮忙,时间为一个月。而我们部门内部商量的结果是派我过去!但是,新部门在18层,那我以后还能继续跟大家一起吃饭么?       有一个疑问:我的邮件签名需要把“研发-搜索”换成“互动社区”之类的么?       PS.一个大好消息是:因为我被借到另外一个部门,我在搜索项目的所有服务器上的权限被取消,所以,后台系统我没有做完的统计不能继续做了,直接转手给下一个“Lucky guy”

正则表达式之二

[原创文章,转载请保留或注明出处:http://www.regexlab.com/zh/regtopic.htm] 引言 本文将逐步讨论一些正则表达式的使用话题。本文为本站基础篇之后的扩展,在阅读本文之前,建议先阅读正则表达式参考文档一文。 ———————————————————————- 1. 表达式的递归匹配 有时候,我们需要用正则表达式来分析一个计算式中的括号配对情况。比如,使用表达式 “\( [^)]* \)” 或者 “\( .*? \)” 可以匹配一对小括号。但是如果括号 内还嵌有一层括号的话 ,如 “( ( ) )”,则这种写法将不能够匹配正确,得到的结果是 “( ( )” 。类似情况的还有 HTML 中支持嵌套的标签如 “ ” 等。本节将要讨论的是,想办法把有嵌套的的成对括号或者成对标签匹配出来。 匹配未知层次的嵌套: 有的正则表达式引擎,专门针对这种嵌套提供了支持。并且在栈空间允许的情况下,能够支持任意未知层次的嵌套:比如 Perl,PHP,GRETA 等。在 PHP 和 GRETA 中,表达式中使用 “(?R)” 来表示嵌套部分。 匹配嵌套了未知层次的 “小括号对” 的表达式写法如下:”\( ([^()] | (?R))* \)”。 [Perl 和 PHP 的示例代码] 匹配有限层次的嵌套: 对于不支持嵌套的正则表达式引擎,只能通过一定的办法来匹配有限层次的嵌套。思路如下: 第一步,写一个不能支持嵌套的表达式:”\( [^()]* [...]

关于正则表达式(Zz)

[原创文章,转载请保留或注明出处:http://www.regexlab.com/zh/regref.htm] 引言 正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来:(1)检查一个串中是否含有符合某个规则的子串,并且可以得到这个子串;(2)根据匹配规则对字符串进行灵活的替换操作。 正则表达式学习起来其实是很简单的,不多的几个较为抽象的概念也很容易理解。之所以很多人感觉正则表达式比较复杂,一方面是因为大多数的文档没有做到由浅入深地讲解,概念上没有注意先后顺序,给读者的理解带来困难;另一方面,各种引擎自带的文档一般都要介绍它特有的功能,然而这部分特有的功能并不是我们首先要理解的。 文章中的每一个举例,都可以点击进入到测试页面进行测试。闲话少说,开始。 ——————————————————————————– 1. 正则表达式规则 1.1 普通字符 字母、数字、汉字、下划线、以及后边章节中没有特殊定义的标点符号,都是”普通字符”。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。 举例1:表达式 “c”,在匹配字符串 “abcde” 时,匹配结果是:成功;匹配到的内容是:”c”;匹配到的位置是:开始于2,结束于3。(注:下标从0开始还是从1开始,因当前编程语言的不同而可能不同) 举例2:表达式 “bcd”,在匹配字符串 “abcde” 时,匹配结果是:成功;匹配到的内容是:”bcd”;匹配到的位置是:开始于1,结束于4。 ——————————————————————————– 1.2 简单的转义字符 一些不便书写的字符,采用在前面加 “\” 的方法。这些字符其实我们都已经熟知了。 表达式 可匹配 \r, \n 代表回车和换行符 \t 制表符 \\ 代表 “\” 本身 还有其他一些在后边章节中有特殊用处的标点符号,在前面加 “\” 后,就代表该符号本身。比如:^, $ 都有特殊意义,如果要想匹配字符串中 “^” 和 “$” 字符,则表达式就需要写成 “\^” 和 “\$”。 表达式 可匹配 \^ 匹配 ^ 符号本身 [...]

琐碎的日记

      拿着一个可以运行的程序,放数据的硬盘却坏了。程序还有段错误问题,也没有办法调试了——因为没有数据。       临时又恶补了一下GDB和VIM,需要学的东西实在太多了,这才后悔当初没有扎实的学。C语言的基础的东西也有很多不熟练的,类似于fread,fseek等文件操作,如果熟练一点的话,也不至于落到今天这样的尴尬局面呢。指针,结构体,唉,就更不用说了。惭愧。       继续努力。

GDB调试精粹及使用实例(收藏)

                                    一:列文件清单 1. List (gdb) list line1,line2 二:执行程序 要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符()和外壳通配符(*、?、[、])在内。 如果你使用不带参数的run命令,gdb就再次使用你给予前一条run命令的参数,这是很有用的。 利用set args 命令就可以修改发送给程序的参数,而使用show args 命令就可以查看其缺省参数的列表。 (gdb)set args –b –x (gdb) show args backtrace命令为堆栈提供向后跟踪功能。 Backtrace 命令产生一张列表,包含着从最近的过程开始的所以有效过程和调用这些过程的参数。 三:显示数据 利用print 命令可以检查各个变量的值。 (gdb) print p (p为变量名) whatis 命令可以显示某个变量的类型 (gdb) whatis p type = int * print 是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。表达式除了包含你程序中的变量外,还可以包含以下内容: l 对程序中函数的调用 (gdb) print find_entry(1,0) l 数据结构和其他复杂对象 (gdb) print *table_start $8={e=reference=’00’,location=0×0,next=0×0} l [...]

GDB轻松调试 (Zz)

一、引言 在了解GDB可以做什么,怎么做之前,让我们先来看看为什么要用GDB,或者说对调试工具有什么期望。 一般我们使用GDB(或其他调试工具)是为了发现程序bug,更经常地是在已知程序有错的情况下定位bug。既然这样,我们就需要跟踪程序的执行情况,查看程序执行是否正常,当然这就需要有个让我们与执行程序交互的环境,调试工具提供一个能让程序在你的掌控下执行,并让你能够查看一些执行过程中的“内幕信息”的环境。 为了查看程序运行过程中的状态,我们就希望程序能在适当的位置或者在一定的条件下能够暂停运行;为此,调试工具提供了断点、查看变量/表达式、显示程序栈等功能。看了某个点的“内幕”后,我们还期望更多,所以要能控制程序运行才行,这就要求断点、继续运行、单步(多步)运行、进入函数运行等功能,在某些情况下,还需要通过修改当前的执行环境(变量等)来达到期望的执行顺序。也就是说,光看着是不够的,还需要能改才行。 理解了这些问题后,我们就明白GDB的各个功能的用意了,自然也就明白该如何使用调试工具了。当然,要让GDB有效的发挥作用,还是需要一定的经验与技巧,而这主要靠实践,学习资料(包括本文)充其量只能帮你一把(小心别让它帮倒忙)。 总而言之,我们首先要明白使用调试工具的目的和用意,才能理解它的各项功能,才能借助它快速有效的发现问题;否则,即使工具再强大,你也不知道该如何使用才好。 另外要多结合使用代码检视、运行日志、测试工具等方法来发现潜在的问题,提供程序的质量。这些问题将在另文探讨,先做个广告。     二、GDB能做什么 GDB可以用来调试C、C++、Modula-2的程序。一般来说,GDB能做的事大致可以分为四类: 1、启动程序,按指定的方式执行程序。 2、在指定条件下使程序暂停. 3、当程序被停住时,可以检查此时你的程序中的变化。 4、改变程序中的变量或执行顺序来试验。     三、GDB使用概述 首先要了解的是gdb的help命令,因为你可能记不住各个命令的语法和用途,但只要能正确使用help命令,你就不需要任何其它的gdb资料。 启动gdb后,输入help [eric@linux eric]$ gdb GNU gdb Red Hat Linux (5.3.90-0.20030710.40rh) Copyright 2003 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute [...]

大型超文本网络搜索引擎的剖析

Sergey Brin和Lawrence Page Computer Science Department Stanford Unversity, Stanford, CA 94305, USA sergey@cs.stanford.edu和page@cs.stanford.edu 摘要: 本文介绍了一个在超文本中广泛应用的大型搜索引擎Google的原型。Google的设计使之能够高效地抓取网络信息并为之建立索引,它的查询结果比现存的其它系统都要更令人满意。这个原型的全文和至少含有2千4百万个页面的超链接数据库可以从http://google.stanford.edu/下载。设计一个搜索引擎是一项富有挑战性的工作。搜索引擎要为上百亿包含等量的不同词汇的网页建立索引。它们每天要接受上亿次的查询。尽管大型的搜索引擎在网络上是非常重要的,但是在学术上却没有多少对它的研究。另外,由于技术的突飞猛进和网页量的剧增,在今天要搭建一个网络搜索引擎比起三年前是大有不同的。本文对我们的大型网络搜索引擎提供了一份深层次的介绍──据我们所知,这是公开发表的论文中第一篇描述得如此详尽的。除了在把传统搜索技术应用到如此数量级的数据中遇到的问题以外,还有一些新的技术上的挑战,比如利用超文本中的附加信息来改善搜索结果。本文将着手解决这个问题,如何搭建一个实用的大型系统来发掘超文本中的附加信息。我们还将要关注如何有效地处理无组织的任何人都能随意发布任何信息的超文本数据集。 关键词 万维网,搜索引擎,信息检索,PageRank算法,Google 1 绪论 (注意:这篇论文有两个版本──一个长一些的全文版本,一个精简一些的打印版本。全文版本可以在网上下载,也可以在研讨会的CD-ROM上找到。) 万维网给信息检索带来了新的挑战。万维网上的信息量在飞速增长,同时网络研究艺术中一些缺乏经验的新用户的数量也在激增。人们一般利用网络上的超链接来网上冲浪,一般都是从高质量人工维护的索引开始,比如Yahoo!或者搜索引擎。人工维护的目录虽然有效地包含了流行的话题,但是它具有主观性、搭建和维护的代价高、升级缓慢,并且无法涵盖所有严肃深奥的主题。基于关键词匹配的自动搜索引擎有经常返回一些低质量结果。更糟的是,有些广告商专门设法误导自动搜索引擎来吸引人们的注意。我们已经建立了一个大型搜索引擎能解决现存系统中的很多问题。它专门利用了超文本中的附加信息来提高搜索结果的质量。我们选择Google作为我们系统的名字,取自一个俗语googol的谐音,意思是10的100次方,这和我们建立一个大型搜索引擎的目标是相当吻合的。   1.1 网络搜索引擎——升级:1994—2000 搜索引擎技术不得不经常调整以跟上网络的增长。1994年,第一批网络搜索引擎中的World Wide Web Worm(WWWW)索引了110’000篇网页和有效的网络文件。到了1997年11月,顶级搜索引擎声称索引了两百万(WebCrawler)至十亿篇网络文件(来自Search Engine Watch)。可以预见到2000年,一个全面的网络索引将会包含一百亿个文件。与此同时,搜索引擎处理的查询量也在爆增。1994年3月和4月,World Wide Web Worm平均每天要接受1500次查询。1997年11月,Altavista声称它每天要处理大约两亿次查询。随着网络用户和查询搜索引擎的自动系统数量的增长,估计到2000年顶级的搜索引擎每天要处理上十亿次的查询。我们的系统的目标就是要着手解决这些问题,无论是质量还是在将搜索引擎技术扩展到如此程度中引入的可扩展性的概念。   1.2 Google:与网络同步 要搭建一个哪怕是能和现今网络规模相适应的搜索引擎都会遇到很多挑战。要想搜集网络文件并保持更新就需要快速的抓取技术。还要有效地利用磁盘空间索引和部分文件本身。索引系统必须能高效地处理上百G的数据。还要迅速地处理每秒钟成百上千次的查询。 随着网络的不断增长,这项工作变得越来越困难了。但是,硬件性能和费用问题的改善也部分地削减了困难度。然而在这个进度中还有几个明显的例外,比如磁盘的寻道时间和操作系统的健壮性。在Google的设计中,我们同时考虑到了网络的增长速度和技术的变更。Google的设计使之能够很好地扩展到能处理极大量的数据。它有效地利用了存储空间来储存索引文件。优化的数据结构使之能够支持快速高效的数据访问(见4.2节)。进一步地,我们希望建立索引和存储文本文件或HTML文档的代价会相对于它们实际的大小而不断减小。对于象Google这样的集中式系统来说,这些措施换来的是可观的可扩展性。   1.3 设计目标 1.3.1 提高搜索质量   我们的首要目标是提高网络搜索引擎的质量。在1994年,有些人认为通过全搜索索引是有可能很容易找到任何东西的。根据Best of The Web 1994–Navigators, “最好的导航服务可以在网络中找到几乎任何东西(只要输入所有的数据)。”然而,1997的网络就大不一样了。任何最近使用过搜索引擎的人都能轻易地证实索引地完整性并不是影响搜索结果质量的唯一因子。用户们真正感兴趣的搜索结果经常被“垃圾结果”所湮没。事实上,到1997年11月为止,在四个顶级的商业搜索引擎中只有一个能搜到自己(在搜索自己名字时前十位结果中返回自己的搜索页面)。引发这个问题的一个主要原因就是索引中文件的数量已经增长了好几个数量级,相应地,用户能查阅的文档数却没有增加。人们仍然只愿意看看前几十个结果。因此,当集合的大小增加时,我们需要具有高精度(比如前几十个结果中的相关文档的数量)的工具。当然,我们希望我们所说的“相关”只是指恰恰最好的文档,因为很可能还有几万个稍有点相关的文档。即使与招回率(系统能够返回的相关文档的总数)的代价相比,高精度仍然是很重要的。近来对利用更多的超文本信息来改进搜索和其它应用软件的方法还是相当乐观的[Marchiori 97][Spertus 97][Weiss 96][Kleinberg 98]。特别是链接结构[Page 98]和链接文本能够为相关性判断和质量过滤提供大量的信息。Google同时利用了链接结构和链接文本(见2.1节和2.2节)。 [...]

从H.261到H.264- -视频编码标准的发展

      数字视频技术广泛应用于通信、计算机、广播电视等领域,带来了会议电视、可视电话及数字电视、媒体存储等一系列应用,促使了许多视频编码标准的产生。ITU-T与ISO/IEC是制定视频编码标准的两大组织,ITU-T的标准包括H.261、H.263、H.264,主要应用于实时视频通信领域,如会议电视;MPEG系列标准是由ISO/IEC制定的,主要应用于视频存储(DVD)、广播电视、因特网或无线网上的流媒体等。两个组织也共同制定了一些标准,H.262标准等同于MPEG-2的视频编码标准,而最新的H.264标准则被纳入MPEG-4的第10部分。   本文按照ITU-T视频编码标准的发展过程,介绍H.261、H.263及H.264。 H.261视频编码标准   H.261是ITU-T为在综合业务数字网(ISDN)上开展双向声像业务(可视电话、视频会议)而制定的,速率为64kb/s的整数倍。H.261只对CIF和QCIF两种图像格式进行处理,每帧图像分成图像层、宏块组(GOB)层、宏块(MB)层、块(Block)层来处理。   H.261是最早的运动图像压缩标准,它详细制定了视频编码的各个部分,包括运动补偿的帧间预测、DCT变换、量化、熵编码,以及与固定速率的信道相适配的速率控制等部分。 H.263视频编码标准   H.263是最早用于低码率视频编码的ITU-T标准,随后出现的第二版(H.263+)及H.263++增加了许多选项,使其具有更广泛的适用性。 H.263视频压缩标准   H.263是ITU-T为低于64kb/s的窄带通信信道制定的视频编码标准。它是在H.261基础上发展起来的,其标准输入图像格式可以是S-QCIF、QCIF、CIF、4CIF或者16CIF的彩色4∶2∶0亚取样图像。H.263与H.261相比采用了半象素的运动补偿,并增加了4种有效的压缩编码模式。   无限制的运动矢量模式允许运动矢量指向图像以外的区域。当某一运动矢量所指的参考宏块位于编码图像之外时,就用其边缘的图像象素值来代替。当存在跨边界的运动时,这种模式能取得很大的编码增益,特别是对小图像而言。另外,这种模式包括了运动矢量范围的扩展,允许使用更大的运动矢量,这对摄像机运动特别有利。   基于句法的算术编码模式使用算术编码代替霍夫曼编码,可在信噪比和重建图像质量相同的情况下降低码率。   先进的预测模式允许一个宏块中4个8×8亮度块各对应一个运动矢量,从而提高了预测精度;两个色度块的运动矢量则取这4个亮度块运动矢量的平均值。补偿时,使用重叠的块运动补偿,8×8亮度块的每个象素的补偿值由3个预测值加权平均得到。使用该模式可以产生显著的编码增益,特别是采用重叠的块运动补偿,会减少块效应,提高主观质量。   PB-帧模式规定一个PB-帧包含作为一个单元进行编码的两帧图像。PB-帧模式可在码率增加不多的情况下,使帧率加倍。 H.263视频压缩标准版本2   ITU-T在H.263发布后又修订发布了H.263标准的版本2,非正式地命名为H.263+标准。它在保证原H.263标准核心句法和语义不变的基础上,增加了若干选项以提高压缩效率或改善某方面的功能。原H.263标准限制了其应用的图像输入格式,仅允许5种视频源格式。H.263+标准允许更大范围的图像输入格式,自定义图像的尺寸,从而拓宽了标准使用的范围,使之可以处理基于视窗的计算机图像、更高帧频的图像序列及宽屏图像。   为提高压缩效率,H.263+采用先进的帧内编码模式;增强的PB-帧模式改进了H.263的不足,增强了帧间预测的效果;去块效应滤波器不仅提高了压缩效率,而且提供重建图像的主观质量。   为适应网络传输,H.263+增加了时间分级、信噪比和空间分级,对在噪声信道和存在大量包丢失的网络中传送视频信号很有意义;另外,片结构模式、参考帧选择模式增强了视频传输的抗误码能力。 H.263++视频压缩标准   H263++在H263+基础上增加了3个选项,主要是为了增强码流在恶劣信道上的抗误码性能,同时为了提高增强编码效率。这3个选项为:   选项U——称为增强型参考帧选择,它能够提供增强的编码效率和信道错误再生能力(特别是在包丢失的情形下),需要设计多缓冲区用于存贮多参考帧图像。   选项V——称为数据分片,它能够提供增强型的抗误码能力(特别是在传输过程中本地数据被破坏的情况下),通过分离视频码流中DCT的系数头和运动矢量数据,采用可逆编码方式保护运动矢量。   选项W——在H263+的码流中增加补充信息,保证增强型的反向兼容性,附加信息包括:指示采用的定点IDCT、图像信息和信息类型、任意的二进制数据、文本、重复的图像头、交替的场指示、稀疏的参考帧识别。 H.264视频编码标准   H.264是由ISO/IEC与ITU-T组成的联合视频组(JVT)制定的新一代视频压缩编码标准。事实上,H.264标准的开展可以追溯到8年前。1996年制定H.263标准后,ITU-T的视频编码专家组(VCEG)开始了两个方面的研究:一个是短期研究计划,在H.263基础上增加选项(之后产生了H.263+与H.263++);另一个是长期研究计划,制定一种新标准以支持低码率的视频通信。长期研究计划产生了H.26L标准草案,在压缩效率方面与先期的ITU-T视频压缩标准相比,具有明显的优越性。2001年,ISO的MPEG组织认识到H.26L潜在的优势,随后ISO与ITU开始组建包括来自ISO/IEC MPEG与ITU-T VCEG的联合视频组(JVT),JVT的主要任务就是将H.26L草案发展为一个国际性标准。于是,在ISO/IEC中该标准命名为AVC(Advanced Video Coding),作为MPEG-4标准的第10个选项;在ITU-T中正式命名为H.264标准。H.264的主要优点如下:   在相同的重建图像质量下,H.264比H.263+和MPEG-4(SP)减小50%码率。   对信道时延的适应性较强,既可工作于低时延模式以满足实时业务,如会议电视等;又可工作于无时延限制的场合,如视频存储等。   提高网络适应性,采用”网络友好”的结构和语法,加强对误码和丢包的处理,提高解码器的差错恢复能力。   在编/解码器中采用复杂度可分级设计,在图像质量和编码处理之间可分级,以适应不同复杂度的应用。   相对于先期的视频压缩标准,H.264引入了很多先进的技术,包括4×4整数变换、空域内的帧内预测、1/4象素精度的运动估计、多参考帧与多种大小块的帧间预测技术等。新技术带来了较高的压缩比,同时大大提高了算法的复杂度。 4×4整数变换   以前的标准,如H.263或MPEG-4,都是采用8×8的DCT变换。H.26L中建议的整数变换实际上接近于4×4的DCT变换,整数的引入降低了算法的复杂度,也避免了反变换的失配问题,4×4的块可以减小块效应。而H.264的4×4整数变换进一步降低了算法的复杂度,相比H.26L中建议的整数变换,对于9b输入残差数据,由以前的32b降为现在的16b运算,而且整个变换无乘法,只需加法和一些移位运算。新的变换对编码的性能几乎没有影响,而且实际编码略好一些。 基于空域的帧内预测技术   视频编码是通过去除图像的空间与时间相关性来达到压缩的目的。空间相关性通过有效的变换来去除,如DCT变换、H.264的整数变换;时间相关性则通过帧间预测来去除。这里所说的变换去除空间相关性,仅仅局限在所变换的块内,如8×8或者4×4,并没有块与块之间的处理。H.263+与MPEG-4引入了帧内预测技术,在变换域中根据相临块对当前块的某些系数做预测。H.264则是在空域中,利用当前块的相临象素直接对每个系数做预测,更有效地去除相临块之间的相关性,极大地提高了帧内编码的效率。   H.264基本部分的帧内预测包括9种4×4亮度块的预测、4种16×16亮度块的预测和4种色度块的预测。 运动估计   H.264的运动估计具有3个新的特点:1/4象素精度的运动估计;7种大小不同的块进行匹配;前向与后向多参考帧。   H.264在帧间编码中,一个宏块(16×16)可以被分为16×8、8×16、8×8的块,而8×8的块被称为子宏块,又可以分为8×4、4×8、4×4的块。总体而言,共有7种大小不同的块做运动估计,以找出最匹配的类型。与以往标准的P帧、B帧不同,H.264采用了前向与后向多个参考帧的预测。半象素精度的运动估计比整象素运动估计有效地提高了压缩比,而1/4象素精度的运动估计可带来更好的压缩效果。   编码器中运用多种大小不同的块进行运动估计,可节省15%以上的比特率(相对于16×16的块)。运用1/4象素精度的运动估计,可以节省20%的码率(相对于整象素预测)。多参考帧预测方面,假设为5个参考帧预测,相对于一个参考帧,可降低5%~10%的码率。以上百分比都是统计数据,不同视频因其细节特征与运动情况而有所差异。 熵编码   H.264标准采用的熵编码有两种:一种是基于内容的自适应变长编码(CAVLC)与统一的变长编码(UVLC)结合;另一种是基于内容的自适应二进制算术编码(CABAC)。CAVLC与CABAC根据相临块的情况进行当前块的编码,以达到更好的编码效率。CABAC比CAVLC压缩效率高,但要复杂一些。 去块效应滤波器   H.264标准引入了去块效应滤波器,对块的边界进行滤波,滤波强度与块的编码模式、运动矢量及块的系数有关。去块效应滤波器在提高压缩效率的同时,改善了图像的主观效果。 其他视频编码标准   除上述ITU-T的视频压缩标准外,还有一些标准也比较流行,如MPEG-4、AVS、WM9。 H.264也称为MPEG-4 AVC,而目前业内所说的MPEG-4一般是指SP(简级)或ASP(先进的简级),主要针对低码率应用,如因特网上的流媒体、无线网的视频传输及视频存储等,其核心类似于H.263。 M  PEG-4 SP和H.263有很多相似的地方,如附表所示。然而,这两个标准之间也有显著的不同,主要表现在:码流结构和头信息、熵编码的部分码表、编码技术的一些细节。MPEG-4 ASP较SP增加了一些技术,主要有:1/4象素精度的运动估计、B帧、全局运动矢量(GMV),因而压缩效率得以提高。   AVS是由我国自主制定的音/视频编码技术标准,主要面向高清晰度电视、高密度光存储媒体等应用。AVS标准以当前国际上最先进的MPEG-4 [...]

BitTorrent 协议规范(翻译)

   BitTorrent 是一种分发文件的协议。它通过URL来识别内容,并且可以无缝的和web进行交互。它基于HTTP协议,它的优势是:如果有多个下载者并发的下载同一个文件,那么,每个下载者也同时为其它下载者上传文件,这样,文件源可以支持大量的用户进行下载,而只带来适当的负载的增长。(译注:因为大量的负载被均衡到整个系统中,所以提供源文件的机器的负载只有少量增长) 一个BT文件分布系统由下列实体组成: 一个普通的web服务器 一个静态的“元信息”文件 一个跟踪(tracker)服务器 终端用户的web浏览器 终端下载者 理想的情况是多个终端用户在下载同一个文件。 要提供文件共享,那么一台主机需要执行以下步骤: ?运行一个 tracker服务器(或者,已经有一个tracker服务器在运行了也可以) ?运行一个web服务器,例如apache,或者已经有一个web服务器在运行了。 ?在web服务器上,将文件扩展名.torrent 和MIME类型 application/x-bittorrent关联起来(或者已经关联了) ?根据 tracker服务器的 URL 和要共享的文件来创建一个“元信息”文件(.torrent)。 ?将“元信息”文件发布到web服务器上 ?在某个web页面上,添加一个到“元信息”文件的链接。 ?运行一个已经拥有完整文件的下载者(被成为’origin’,或者’seed’,种子) 要开始下载文件,那么终端用户执行以下步骤: ?安装 BT(或者已经安装) ?访问提供 .torrent 文件的web服务器 ?点击到 .torrent 文件的链接(译注:这时候,bt会弹出一个对话框) ?选择要把下载的文件保存到哪里?或者是一次断点续传 ?等待下载的完成。 ?结束bt程序的运行(如果不主动结束,那么bt会一直为其它人提供文件上传) 各个部分之间的连通性如下: 网站负责提供一个静态的文件,而把BT辅助程序(客户端)放在客户端机器上。 Trackers从所有下载者处接收信息,并返回给它们一个随机的peers的列表。这种交互是通过HTTP或HTTPS协议来完成的。 下载者周期性的向tracker登记,使得tracker能了解它们的进度;下载者之间通过直接连接进行数据的上传和下载。这种连接使用的是 BitTorrent 对等协议,它基于TCP。 Origin只负责上传,从不下载,因为它已经拥有了完整的文件。Origin是必须的。 元文件和tracker的响应都采用的是一种简单、有效、可扩展的格式,被称为bencoding,它可以包含字符串和整数。由于对不需要的字典关键字可以忽略,所以这种格式具有可扩展性,其它选项以后可以方便的加进来。 Bencoding格式如下: 对于字符串,首先是一个字符串的长度,然后是冒号,后面跟着实际的字符串,例如:4:spam,就是“ spam” 整数编码如下,以 ‘i’ 开始,然后10进制的整数值,最后以’e’结尾。例如,i3e表示3,I-3e表示-3。整数没有大小限制。I-0e是无效的。除了 i0e外,所以以0起始的整数都无效。I0e当然表示0。 列表编码如下,以’l’开始,接下来是列表值的编码(也采用bencoded编码),最后以’e’结束。例如:l4:spam4:eggse 表示 [‘spam’, ‘eggs’]。 字典编码如下,以’d’开始,接下来是可选的keys和它对应的值,最户以’e’结束。例如:d3:cow3:moo4:spam4:eggse,表示{‘cow’:’moo’,’spam’:’eggs’},而d4:spaml1:al:bee [...]

久违的C

很久没有写C程序了。 刚刚换到大搜索,还是有一些不习惯。但,终究,是要习惯的。 昨天因为班会,提前请假回学校了,所以,仔细算起来,我在新部门的工作,是从今天才正式开始做的。上午刚刚看了一点原先的日志统计程序,发现VIM很不熟悉,于是又看了一会VIM的用户手册。因为程序很多,用了Makefile,结果又转到Makefile的文档看了半天。 URL聚类还没有开始做,anchor_text 分析插了进来。刚想了个主意,就被主管否定了,而且还狠狠的批了我一通:现在写程序,处理的数据动辄几十G,再也不能像以前那样想当然的做了。