<?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>伫立于架构，探究于细节</title>
	<atom:link href="http://blog.hiwgy.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.hiwgy.com</link>
	<description>算法、程序设计、分布式、存储</description>
	<lastBuildDate>Sat, 19 May 2012 09:19:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>几张照片一段人生</title>
		<link>http://blog.hiwgy.com/2012/05/19/one_life_some_photos/</link>
		<comments>http://blog.hiwgy.com/2012/05/19/one_life_some_photos/#comments</comments>
		<pubDate>Sat, 19 May 2012 09:03:28 +0000</pubDate>
		<dc:creator>dllgwgy</dc:creator>
				<category><![CDATA[摄影]]></category>
		<category><![CDATA[随笔]]></category>

		<guid isPermaLink="false">http://blog.hiwgy.com/?p=364</guid>
		<description><![CDATA[

]]></description>
			<content:encoded><![CDATA[
<a href='http://blog.hiwgy.com/2012/05/19/one_life_some_photos/dscn0444/' title='DSCN0444'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/05/DSCN0444-150x150.jpg" class="attachment-thumbnail" alt="DSCN0444" title="DSCN0444" /></a>
<a href='http://blog.hiwgy.com/2012/05/19/one_life_some_photos/img_6381/' title='IMG_6381'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/05/IMG_6381-150x150.jpg" class="attachment-thumbnail" alt="IMG_6381" title="IMG_6381" /></a>
<a href='http://blog.hiwgy.com/2012/05/19/one_life_some_photos/img_6394/' title='IMG_6394'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/05/IMG_6394-150x150.jpg" class="attachment-thumbnail" alt="IMG_6394" title="IMG_6394" /></a>
<a href='http://blog.hiwgy.com/2012/05/19/one_life_some_photos/img_6410/' title='IMG_6410'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/05/IMG_6410-150x150.jpg" class="attachment-thumbnail" alt="IMG_6410" title="IMG_6410" /></a>
<a href='http://blog.hiwgy.com/2012/05/19/one_life_some_photos/img_6417/' title='IMG_6417'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/05/IMG_6417-150x150.jpg" class="attachment-thumbnail" alt="IMG_6417" title="IMG_6417" /></a>
<a href='http://blog.hiwgy.com/2012/05/19/one_life_some_photos/img_6429/' title='IMG_6429'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/05/IMG_6429-150x150.jpg" class="attachment-thumbnail" alt="IMG_6429" title="IMG_6429" /></a>
<a href='http://blog.hiwgy.com/2012/05/19/one_life_some_photos/img_6470/' title='IMG_6470'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/05/IMG_6470-150x150.jpg" class="attachment-thumbnail" alt="IMG_6470" title="IMG_6470" /></a>
<a href='http://blog.hiwgy.com/2012/05/19/one_life_some_photos/img_6446/' title='IMG_6446'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/05/IMG_6446-150x150.jpg" class="attachment-thumbnail" alt="IMG_6446" title="IMG_6446" /></a>
<a href='http://blog.hiwgy.com/2012/05/19/one_life_some_photos/111218a10724-014/' title='111218a10724-014'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/05/111218a10724-014-150x150.jpg" class="attachment-thumbnail" alt="111218a10724-014" title="111218a10724-014" /></a>

]]></content:encoded>
			<wfw:commentRss>http://blog.hiwgy.com/2012/05/19/one_life_some_photos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>splunk学习</title>
		<link>http://blog.hiwgy.com/2012/05/12/splunk/</link>
		<comments>http://blog.hiwgy.com/2012/05/12/splunk/#comments</comments>
		<pubDate>Sat, 12 May 2012 12:09:37 +0000</pubDate>
		<dc:creator>dllgwgy</dc:creator>
				<category><![CDATA[分布式系统]]></category>
		<category><![CDATA[splunk]]></category>

		<guid isPermaLink="false">http://blog.hiwgy.com/?p=359</guid>
		<description><![CDATA[
摘要：如果管理着几百台机器，一天老板问：今天哪台机器宕机了？影响了多少个用户订单请求？是谁的代码？可能你需要使用splunk了。【未完，待续】 1 SPLUNK简介 1.1      什么是splunk Splunk is software that indexes IT data from any application, server or network device that makes up your IT infrastructure. It&#8217;s a powerful and versatile search and analysis engine that lets you investigate, troubleshoot, monitor, &#8230; <a href="http://blog.hiwgy.com/2012/05/12/splunk/">继续阅读 <span class="meta-nav">&#8594;</span></a>
]]></description>
			<content:encoded><![CDATA[<p>摘要：如果管理着几百台机器，一天老板问：今天哪台机器宕机了？影响了多少个用户订单请求？是谁的代码？可能你需要使用splunk了。【未完，待续】</p>
<h1>1 SPLUNK简介</h1>
<h2>1.1      什么是splunk</h2>
<p>Splunk is software that indexes IT data from any application, server or network device that makes up your IT infrastructure. It&#8217;s a powerful and versatile search and analysis engine that lets you investigate, troubleshoot, monitor, alert, and report on everything that&#8217;s happening in your entire IT infrastructure from one location in real time.</p>
<p>简言之，Splunk索引log，根据log，检索查询某段时间内的系统状态。</p>
<p><span id="more-359"></span></p>
<h2>1.2      谁需要使用Splunk</h2>
<p>Splunk is versatile and thus has many uses and many different types of users. System administrators, network engineers, security analysts, developers, service desk, and support staff &#8212; even Managers, VPs, and CIOs &#8212; use Splunk to do their jobs better and faster.</p>
<ul>
<li>管理者用splunk生成报表或dashboard监控和总结系统的健康程度、性能、行为、容量。</li>
<li>系统管理员用splunk监控严重的系统错误，系统负载，性能指标。</li>
<li>网络工程师用splunk分析网络问题。</li>
<li><strong>应用工程师用splunk</strong><strong>分析业务数据</strong>：Splunk官网的tutorial就是利用apache log进行商店的业务统计的例子。分析哪些商品被浏览的最多，哪些商品被下订单最多，哪天服务器挂了并影响了多少次浏览或订单，昨日的TOP N最受欢迎的商品，昨日的订单总量和销售额。根据APACHE的log，不需要开发另外一个系统，就可以使用splunk基于log来对海量的数据进行统计，分析出业务数据（当然，splunk不会对数据进行合并，比如365天的数据合并为1年，因此如果要做一个在线的报表系统如：百度统计，splunk并不是一个好选择，除非用户愿意获取一个汇总的数值时等待1分钟甚至更长的时间）。</li>
</ul>
<h2>1.3 Splunk的功能</h2>
<p>生成报表：a) 日志具有时间的特点，splunk会对时间维度建索引。因此猜想：splunk的扩容方案很可能是通过时间维度来划分的。历史数据也不需要重新再索引；只需要把这段时间新增的数据追加到老数据的倒排链尾端即可，倒排链的基本顺序不用调整。B) 支持用户自定义数据的扩展SCHEMA，用户可以提供ID映射到name的文件，在统计时生成的报表就把ID转换为name，这样生成的报表比较适合你的老板看。</p>
<p>记录（行）为检索和报表统计单位：Splunk是全文索引，对于apache、system等常见服务的log进行了模式定制，能够根据日志的格式，提取出一些字段，这些字段可用于条件查询。Splunk用于展现和报表统计的基本单位是：一条记录（行）。（比如统计今日apache服务器收到多少POST请求）。</p>
<p>索引和检索都具有流式特点： a) Splunk的索引具有流式的特点：不停的索引，经索引的内容，立刻就能检索出来。 b) Splunk的检索具有流式的特点：不停加载检索结果，直至全部检索完毕，可以控制是否停止检索，按照时间维度逆时检索。因此猜想：其倒排结构仅仅根据时间有关。</p>
<p>丰富的查询表达式：a) 搜索引擎常见的高级查询：AND/OR/NOT的各种组合。b) 类似于SQL的select in：SUB-SEARCH。C) 支持pipe与内建统计命令(chart, timechart, stat, eval, count)，pipe把查询结果输出给统计命令，统计命令输出的结果为一个报表，报表的字段、x/y轴的名字自定义。</p>
<p>查询结果或报表的管理：可以存储查询结果或报表；可以定制一个dashboard，上面有很多个panel，每个panel是一个报表；多用户间设置报表的ACCESS。</p>
<p>丰富的索引数据源：支持本地、异地的数据。异地数据需要在异地的机器上安装splunk的客户端。可以配置的数据源为多个host上的数据。</p>
<p>Splunk的索引字段主要有5个：</p>
<ul>
<li>Host：日志来自那台主机</li>
<li>Source type: 日志的类别</li>
<li>Source: 日志的文件名</li>
<li>Time: 日志的日期</li>
<li>Content: log的每一行</li>
</ul>
<p>Splunk对以上5个字段建索引，但是却可以根据日志的格式，提取出一些字段用于查询时的条件过滤。比如，对于apache服务器的log，有GET/POST，那么可以查询GET的记录有多少个。</p>
<h1>2 SPLUNK功能介绍与实现分析</h1>
<h2>2.1 索引</h2>
<h2>2.2 检索</h2>
<h1>3 SPLUNK系统架构</h1>
<p>参考文献：</p>
<p><a href="http://docs.splunk.com/Documentation/Splunk/latest/User/WelcometotheSplunktutorial">http://docs.splunk.com/Documentation/Splunk/latest/User/WelcometotheSplunktutorial</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hiwgy.com/2012/05/12/splunk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>雨游星星竹海</title>
		<link>http://blog.hiwgy.com/2012/05/02/%e9%9b%a8%e6%b8%b8%e6%98%9f%e6%98%9f%e7%ab%b9%e6%b5%b7/</link>
		<comments>http://blog.hiwgy.com/2012/05/02/%e9%9b%a8%e6%b8%b8%e6%98%9f%e6%98%9f%e7%ab%b9%e6%b5%b7/#comments</comments>
		<pubDate>Wed, 02 May 2012 01:31:51 +0000</pubDate>
		<dc:creator>dllgwgy</dc:creator>
				<category><![CDATA[摄影]]></category>

		<guid isPermaLink="false">http://blog.hiwgy.com/?p=352</guid>
		<description><![CDATA[
2012年4月30日，雨中开车，一行人到湖北咸宁的山区景点“星星竹海”。 标题党了，由于雨大，就没有下车细拍竹林。
]]></description>
			<content:encoded><![CDATA[<p>2012年4月30日，雨中开车，一行人到湖北咸宁的山区景点“星星竹海”。<br />
<span id="more-352"></span><br />

<a href='http://blog.hiwgy.com/2012/05/02/%e9%9b%a8%e6%b8%b8%e6%98%9f%e6%98%9f%e7%ab%b9%e6%b5%b7/img_7300/' title='IMG_7300'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/05/IMG_7300-150x150.jpg" class="attachment-thumbnail" alt="IMG_7300" title="IMG_7300" /></a>
<a href='http://blog.hiwgy.com/2012/05/02/%e9%9b%a8%e6%b8%b8%e6%98%9f%e6%98%9f%e7%ab%b9%e6%b5%b7/img_7336/' title='IMG_7336'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/05/IMG_7336-150x150.jpg" class="attachment-thumbnail" alt="IMG_7336" title="IMG_7336" /></a>
<a href='http://blog.hiwgy.com/2012/05/02/%e9%9b%a8%e6%b8%b8%e6%98%9f%e6%98%9f%e7%ab%b9%e6%b5%b7/img_7453/' title='IMG_7453'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/05/IMG_7453-150x150.jpg" class="attachment-thumbnail" alt="IMG_7453" title="IMG_7453" /></a>
<br />
标题党了，由于雨大，就没有下车细拍竹林。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hiwgy.com/2012/05/02/%e9%9b%a8%e6%b8%b8%e6%98%9f%e6%98%9f%e7%ab%b9%e6%b5%b7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>水库钓鱼一日游</title>
		<link>http://blog.hiwgy.com/2012/04/11/%e6%b0%b4%e5%ba%93%e9%92%93%e9%b1%bc%e4%b8%80%e6%97%a5%e6%b8%b8/</link>
		<comments>http://blog.hiwgy.com/2012/04/11/%e6%b0%b4%e5%ba%93%e9%92%93%e9%b1%bc%e4%b8%80%e6%97%a5%e6%b8%b8/#comments</comments>
		<pubDate>Wed, 11 Apr 2012 06:34:12 +0000</pubDate>
		<dc:creator>dllgwgy</dc:creator>
				<category><![CDATA[摄影]]></category>

		<guid isPermaLink="false">http://blog.hiwgy.com/?p=332</guid>
		<description><![CDATA[
湖北黄石的一处水库，早上5点从咸宁出发，7点前到目的地，借小船划到一个小岛上，开钓。一天，钓到1只1斤多的武昌鱼，平生钓到的最大的鱼了。。。 上图
]]></description>
			<content:encoded><![CDATA[<p>湖北黄石的一处水库，早上5点从咸宁出发，7点前到目的地，借小船划到一个小岛上，开钓。一天，钓到1只1斤多的武昌鱼，平生钓到的最大的鱼了。。。<br />
<span id="more-332"></span><br />
上图</p>

<a href='http://blog.hiwgy.com/2012/04/11/%e6%b0%b4%e5%ba%93%e9%92%93%e9%b1%bc%e4%b8%80%e6%97%a5%e6%b8%b8/img_6953/' title='IMG_6953'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/04/IMG_6953-150x150.jpg" class="attachment-thumbnail" alt="IMG_6953" title="IMG_6953" /></a>
<a href='http://blog.hiwgy.com/2012/04/11/%e6%b0%b4%e5%ba%93%e9%92%93%e9%b1%bc%e4%b8%80%e6%97%a5%e6%b8%b8/img_6977/' title='IMG_6977'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/04/IMG_6977-150x150.jpg" class="attachment-thumbnail" alt="IMG_6977" title="IMG_6977" /></a>
<a href='http://blog.hiwgy.com/2012/04/11/%e6%b0%b4%e5%ba%93%e9%92%93%e9%b1%bc%e4%b8%80%e6%97%a5%e6%b8%b8/img_6981/' title='IMG_6981'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/04/IMG_6981-150x150.jpg" class="attachment-thumbnail" alt="IMG_6981" title="IMG_6981" /></a>
<a href='http://blog.hiwgy.com/2012/04/11/%e6%b0%b4%e5%ba%93%e9%92%93%e9%b1%bc%e4%b8%80%e6%97%a5%e6%b8%b8/img_6983/' title='IMG_6983'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/04/IMG_6983-150x150.jpg" class="attachment-thumbnail" alt="IMG_6983" title="IMG_6983" /></a>
<a href='http://blog.hiwgy.com/2012/04/11/%e6%b0%b4%e5%ba%93%e9%92%93%e9%b1%bc%e4%b8%80%e6%97%a5%e6%b8%b8/img_6985/' title='IMG_6985'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/04/IMG_6985-150x150.jpg" class="attachment-thumbnail" alt="IMG_6985" title="IMG_6985" /></a>
<a href='http://blog.hiwgy.com/2012/04/11/%e6%b0%b4%e5%ba%93%e9%92%93%e9%b1%bc%e4%b8%80%e6%97%a5%e6%b8%b8/img_7003/' title='IMG_7003'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/04/IMG_7003-150x150.jpg" class="attachment-thumbnail" alt="IMG_7003" title="IMG_7003" /></a>
<a href='http://blog.hiwgy.com/2012/04/11/%e6%b0%b4%e5%ba%93%e9%92%93%e9%b1%bc%e4%b8%80%e6%97%a5%e6%b8%b8/img_7023/' title='IMG_7023'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/04/IMG_7023-150x150.jpg" class="attachment-thumbnail" alt="IMG_7023" title="IMG_7023" /></a>
<a href='http://blog.hiwgy.com/2012/04/11/%e6%b0%b4%e5%ba%93%e9%92%93%e9%b1%bc%e4%b8%80%e6%97%a5%e6%b8%b8/img_7029/' title='IMG_7029'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/04/IMG_7029-150x150.jpg" class="attachment-thumbnail" alt="IMG_7029" title="IMG_7029" /></a>
<a href='http://blog.hiwgy.com/2012/04/11/%e6%b0%b4%e5%ba%93%e9%92%93%e9%b1%bc%e4%b8%80%e6%97%a5%e6%b8%b8/img_7031/' title='IMG_7031'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/04/IMG_7031-150x150.jpg" class="attachment-thumbnail" alt="IMG_7031" title="IMG_7031" /></a>
<a href='http://blog.hiwgy.com/2012/04/11/%e6%b0%b4%e5%ba%93%e9%92%93%e9%b1%bc%e4%b8%80%e6%97%a5%e6%b8%b8/img_7058/' title='IMG_7058'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/04/IMG_7058-150x150.jpg" class="attachment-thumbnail" alt="IMG_7058" title="IMG_7058" /></a>
<a href='http://blog.hiwgy.com/2012/04/11/%e6%b0%b4%e5%ba%93%e9%92%93%e9%b1%bc%e4%b8%80%e6%97%a5%e6%b8%b8/img_7061/' title='IMG_7061'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/04/IMG_7061-150x150.jpg" class="attachment-thumbnail" alt="IMG_7061" title="IMG_7061" /></a>
<a href='http://blog.hiwgy.com/2012/04/11/%e6%b0%b4%e5%ba%93%e9%92%93%e9%b1%bc%e4%b8%80%e6%97%a5%e6%b8%b8/img_7063/' title='IMG_7063'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/04/IMG_7063-150x150.jpg" class="attachment-thumbnail" alt="IMG_7063" title="IMG_7063" /></a>
<a href='http://blog.hiwgy.com/2012/04/11/%e6%b0%b4%e5%ba%93%e9%92%93%e9%b1%bc%e4%b8%80%e6%97%a5%e6%b8%b8/img_7066/' title='IMG_7066'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/04/IMG_7066-150x150.jpg" class="attachment-thumbnail" alt="IMG_7066" title="IMG_7066" /></a>
<a href='http://blog.hiwgy.com/2012/04/11/%e6%b0%b4%e5%ba%93%e9%92%93%e9%b1%bc%e4%b8%80%e6%97%a5%e6%b8%b8/img_7072/' title='IMG_7072'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/04/IMG_7072-150x150.jpg" class="attachment-thumbnail" alt="IMG_7072" title="IMG_7072" /></a>
<a href='http://blog.hiwgy.com/2012/04/11/%e6%b0%b4%e5%ba%93%e9%92%93%e9%b1%bc%e4%b8%80%e6%97%a5%e6%b8%b8/img_7081/' title='IMG_7081'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/04/IMG_7081-150x150.jpg" class="attachment-thumbnail" alt="IMG_7081" title="IMG_7081" /></a>

]]></content:encoded>
			<wfw:commentRss>http://blog.hiwgy.com/2012/04/11/%e6%b0%b4%e5%ba%93%e9%92%93%e9%b1%bc%e4%b8%80%e6%97%a5%e6%b8%b8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[zz]windows宿主机，ubuntu虚拟机下的上网设置（有线网络和无线网络）</title>
		<link>http://blog.hiwgy.com/2012/03/18/zzwindows%e5%ae%bf%e4%b8%bb%e6%9c%ba%ef%bc%8cubuntu%e8%99%9a%e6%8b%9f%e6%9c%ba%e4%b8%8b%e7%9a%84%e4%b8%8a%e7%bd%91%e8%ae%be%e7%bd%ae%ef%bc%88%e6%9c%89%e7%ba%bf%e7%bd%91%e7%bb%9c%e5%92%8c%e6%97%a0/</link>
		<comments>http://blog.hiwgy.com/2012/03/18/zzwindows%e5%ae%bf%e4%b8%bb%e6%9c%ba%ef%bc%8cubuntu%e8%99%9a%e6%8b%9f%e6%9c%ba%e4%b8%8b%e7%9a%84%e4%b8%8a%e7%bd%91%e8%ae%be%e7%bd%ae%ef%bc%88%e6%9c%89%e7%ba%bf%e7%bd%91%e7%bb%9c%e5%92%8c%e6%97%a0/#comments</comments>
		<pubDate>Sun, 18 Mar 2012 12:51:41 +0000</pubDate>
		<dc:creator>dllgwgy</dc:creator>
				<category><![CDATA[Help me]]></category>
		<category><![CDATA[转载]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[vmware]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://blog.hiwgy.com/?p=328</guid>
		<description><![CDATA[
windows宿主机，ubuntu虚拟机下的上网设置（有线网络和无线网络） <a href="http://hi.baidu.com/puppywst/blog/item/e5a99af6645c112bbd310951.html">http://hi.baidu.com/puppywst/blog/item/e5a99af6645c112bbd310951.html</a> 虚拟机下ubuntu共享方式上网： 1. 有线网络 在有线网络的条件下，vmware的安装非常简单，上网方式几乎不用怎么设置(默认NAT模式) 如果默认情况下不能上网，则按以下步骤尝试： NAT的DHCP配置： 1 将虚拟机的上网方式选为NAT。 2 把你的虚拟网卡VMnet8设置为自动获得IP、自动获得DNS服务器，启用。具体方法是：网络连接-本地连接（VMnet8）-属性-ipv4协议-属性-选择“自动获得IP、自动获得DNS服务器”。 3 把你虚拟机中操作系统(REDHAT9.0)的“本地连接”也设置为自动获得IP、自动获得DNS服务器；若虚拟机中操作系统是ubuntu，则可查看虚拟网络设置中“DHCP”，“NAT”选项卡中所示的IP，网关地址，子关掩码等，若均存在则无需改动。 4 最重要的是你的两个服务必须开启：VMware DHCP Service 和VMware NAT Service。点菜单栏里的“编辑”－选“虚拟网络设置”，先将“自动桥接”给去掉（去掉钩钩），再选“DHCP”开启DHCP服务，点“开始”－应用，再按同样的方法开启“NAT ”的功能。 核查方法具体操作如下: 开始&#8212;设置&#8211;控制面板&#8212;管理工具&#8212;服务(在运行里输入services.msc回车即可),确保 VMware DHCP Service 和VMware NAT Service 服务已经启动. NAT的固定IP配置：（考虑到没有固定IP,主机和虚拟机间的通信叫麻烦，有时DHCP很耗时间） 1 开启两个服务：VMware NAT Service，VMware DHCP Service（后者可不开） 2 将虚拟机的上网方式选为NAT。 &#8230; <a href="http://blog.hiwgy.com/2012/03/18/zzwindows%e5%ae%bf%e4%b8%bb%e6%9c%ba%ef%bc%8cubuntu%e8%99%9a%e6%8b%9f%e6%9c%ba%e4%b8%8b%e7%9a%84%e4%b8%8a%e7%bd%91%e8%ae%be%e7%bd%ae%ef%bc%88%e6%9c%89%e7%ba%bf%e7%bd%91%e7%bb%9c%e5%92%8c%e6%97%a0/">继续阅读 <span class="meta-nav">&#8594;</span></a>
]]></description>
			<content:encoded><![CDATA[<p>windows宿主机，ubuntu虚拟机下的上网设置（有线网络和无线网络）<br />
<a href="http://hi.baidu.com/puppywst/blog/item/e5a99af6645c112bbd310951.html">http://hi.baidu.com/puppywst/blog/item/e5a99af6645c112bbd310951.html</a><br />
<span id="more-328"></span><br />
虚拟机下ubuntu共享方式上网：<br />
1. 有线网络<br />
在有线网络的条件下，vmware的安装非常简单，上网方式几乎不用怎么设置(默认NAT模式)<br />
如果默认情况下不能上网，则按以下步骤尝试：<br />
NAT的DHCP配置：<br />
1 将虚拟机的上网方式选为NAT。<br />
2 把你的虚拟网卡VMnet8设置为自动获得IP、自动获得DNS服务器，启用。具体方法是：网络连接-本地连接（VMnet8）-属性-ipv4协议-属性-选择“自动获得IP、自动获得DNS服务器”。<br />
3 把你虚拟机中操作系统(REDHAT9.0)的“本地连接”也设置为自动获得IP、自动获得DNS服务器；若虚拟机中操作系统是ubuntu，则可查看虚拟网络设置中“DHCP”，“NAT”选项卡中所示的IP，网关地址，子关掩码等，若均存在则无需改动。<br />
4 最重要的是你的两个服务必须开启：VMware DHCP Service 和VMware NAT Service。点菜单栏里的“编辑”－选“虚拟网络设置”，先将“自动桥接”给去掉（去掉钩钩），再选“DHCP”开启DHCP服务，点“开始”－应用，再按同样的方法开启“NAT<br />
”的功能。</p>
<p>核查方法具体操作如下: 开始&#8212;设置&#8211;控制面板&#8212;管理工具&#8212;服务(在运行里输入services.msc回车即可),确保 VMware DHCP Service 和VMware NAT Service 服务已经启动.</p>
<p>NAT的固定IP配置：（考虑到没有固定IP,主机和虚拟机间的通信叫麻烦，有时DHCP很耗时间）<br />
1 开启两个服务：VMware NAT Service，VMware DHCP Service（后者可不开）<br />
2 将虚拟机的上网方式选为NAT。<br />
3 点菜单栏里的“编辑”－选“虚拟网络设置”，先将“自动桥接”给去掉（去掉钩钩），在“DHCP”关闭DHCP服务，在“Host virtual network mapping”下的VMnet8的右边选择subnet修改子网。</p>
<p>手动设置方法：<br />
1.windows中CTRL+R,输入cmd,然后在dos下输入ipconfig，得到VMnet8网卡的IP为192.168.93.1（不同机器不一样）<br />
2.Ubuntu中设置网络IP为192.168.93.X(128-254），自动分配时一般也是128，DNS设置为192.168.93.2。</p>
<p>2. 无线网络</p>
<p>不同于有线网络，用笔记本无线上网，问题出来了，主机为无线上网，虚拟机该怎么设定呢？<br />
在主机为无线上网，虚拟机设定的时候最好用“桥接模式”（有些资料说用NAT模式，我试了很久，都没有成功），方法如下：<br />
1. 关闭正在运行的虚拟机ubuntu，将其联网方式设定为“桥接模式”。<br />
2. 在vmare菜单edit中找到VMware的虚拟网络编辑器，如果是绿色版，直接找到vmnetcfg.exe，双击就可以了。<br />
3. 找到“主机虚拟网络映射”选项（host virtual network mapping），在vmnet0 上的下拉列表中，找到自己本本的无线网卡。<br />
4. 启动ubuntu虚拟机即可。<br />
注：此情况下DHCP和NAT服务状态无论是开启还是关闭都没有影响。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hiwgy.com/2012/03/18/zzwindows%e5%ae%bf%e4%b8%bb%e6%9c%ba%ef%bc%8cubuntu%e8%99%9a%e6%8b%9f%e6%9c%ba%e4%b8%8b%e7%9a%84%e4%b8%8a%e7%bd%91%e8%ae%be%e7%bd%ae%ef%bc%88%e6%9c%89%e7%ba%bf%e7%bd%91%e7%bb%9c%e5%92%8c%e6%97%a0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>sstable入门阶段——HFile(version1)结构解析与c++读实现</title>
		<link>http://blog.hiwgy.com/2012/03/11/hfile_format_and_c_implement/</link>
		<comments>http://blog.hiwgy.com/2012/03/11/hfile_format_and_c_implement/#comments</comments>
		<pubDate>Sun, 11 Mar 2012 12:08:36 +0000</pubDate>
		<dc:creator>dllgwgy</dc:creator>
				<category><![CDATA[C/Cplusplus]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[分布式系统]]></category>
		<category><![CDATA[HFile]]></category>
		<category><![CDATA[SStable]]></category>

		<guid isPermaLink="false">http://blog.hiwgy.com/?p=316</guid>
		<description><![CDATA[
【摘要】最近学习了索引底层实现，多数系统如cassandra、HBase、BigTable以及其他分布式存储、查询系统的底层存储都采用SStable的思想。网上不少有用的资料（HFile: A Block-Indexed File Format to Store Sorted Key-Value Pairs），有开源的代码，比如HBase采用的HFile。我没有直接看源码，在阅读HFile文件组织图了解大概后，就草率的开始编码，事倍功半啊。改天再看开源的源码是怎么实现的吧。 引言 注：一些英文简称跟下文结构图对应。 sstable就是sorted string table，存储的基本数据是key-value对，string意为着key和value都是以string/bytes的形式组织的，当然也可以是其他数据结构经序列化后的二进制流形式；sorted意为数据的存储顺序是按照key的字符串的字典排列顺序升序组织的，并且对key构建了索引。检索时，把data index加载到内存中，通过二分查找，在data index中查找当前查询的key可能在哪个data block中，接着顺序遍历这个data block，找到key及value。 sstable有以下几个特点： 1，顺序存储。key和value对，是按照key有序的方式组织的。在加载所有的index of data blocks后，通过内存中的二分查找，找到key对应的index of data block，然后定位到data block，进行磁盘的顺序读查找key；同时，写sstable的时候，也是顺序写。除了search key的阶段，读写磁盘都是顺序的。 2，索引和数据的压缩。每个index of data block中存储了相应data block的第一个key，以及该key的长度和内容，其中对key的长度采用了vint的压缩，减少data index的大小；对每一个data block采用了压缩（当然也可以不压缩），由于每个data block大小会被控制在64K（default value）左右（data block太小了会导致index的膨胀，太大了会导致检索效率下降），可以一次读取这个data block，然后在内存中解压，可以利用cpu的局部cache特性，读取、解压data &#8230; <a href="http://blog.hiwgy.com/2012/03/11/hfile_format_and_c_implement/">继续阅读 <span class="meta-nav">&#8594;</span></a>
]]></description>
			<content:encoded><![CDATA[<p>【摘要】最近学习了索引底层实现，多数系统如cassandra、HBase、BigTable以及其他分布式存储、查询系统的底层存储都采用SStable的思想。网上不少有用的资料（<a href="http://www.slideshare.net/schubertzhang/hfile-a-blockindexed-file-format-to-store-sorted-keyvalue-pairs">HFile: A Block-Indexed File Format to Store Sorted Key-Value Pairs</a>），有<a href="http://svn.apache.org/repos/asf/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/io/hfile/HFile.java">开源的代码</a>，比如HBase采用的HFile。我没有直接看源码，在阅读HFile文件组织图了解大概后，就草率的开始编码，事倍功半啊。改天再看开源的源码是怎么实现的吧。<br />
<span id="more-316"></span></p>
<ul>
<li>引言
</li>
</ul>
<p>注：一些英文简称跟下文结构图对应。</p>
<p>sstable就是sorted string table，存储的基本数据是key-value对，string意为着key和value都是以string/bytes的形式组织的，当然也可以是其他数据结构经序列化后的二进制流形式；sorted意为数据的存储顺序是按照key的字符串的字典排列顺序升序组织的，并且对key构建了索引。检索时，把data index加载到内存中，通过二分查找，在data index中查找当前查询的key可能在哪个data block中，接着顺序遍历这个data block，找到key及value。</p>
<p>sstable有以下几个特点：<br />
1，顺序存储。key和value对，是按照key有序的方式组织的。在加载所有的index of data blocks后，通过内存中的二分查找，找到key对应的index of data block，然后定位到data block，进行磁盘的顺序读查找key；同时，写sstable的时候，也是顺序写。除了search key的阶段，读写磁盘都是顺序的。<br />
2，索引和数据的压缩。每个index of data block中存储了相应data block的第一个key，以及该key的长度和内容，其中对key的长度采用了vint的压缩，减少data index的大小；对每一个data block采用了压缩（当然也可以不压缩），由于每个data block大小会被控制在64K（default value）左右（data block太小了会导致index的膨胀，太大了会导致检索效率下降），可以一次读取这个data block，然后在内存中解压，可以利用cpu的局部cache特性，读取、解压data block的速度快，如果采用的是lzo压缩算法，能获得更好的解压速度。<br />
3，bloom filter的应用，HFile的第二个版本中添加了bloom filter。TBD：目前我没有弄明白，是针对整个文件的data构造的bloom filter，还是对每一个data block构建的bloom filter（我猜是这个）。</p>
<p>影响sstable读取效率的几点：<br />
1，data block的大小。首先假设key-value的大小是固定的。data block越小，data block的个数就越多，index会对每一个data block建一个index of data block（索引项），因此index的大小就越大，对index的检索采用的是二分，因此不会较大影响index的检索速度，并且可以减少遍历一个data block的时间。但是data block过小，导致的index膨胀，整个文件占用更多的磁盘，同时也没有更好的利用cpu局部cache；data block的大小目前google的sstable采用的default value为64KB。<br />
2，对数据的序列化、反序列化速度。由于sstable中的value都是以二进制的形式存在的，因此，数据的序列化和反序列化的速度也是一个底层实现的关键。<br />
3，压缩算法。压缩算法速度和压缩后的大小。目前标配是3个方案：0：lzo，1：gzip，2：无压缩。较为典型的是采用lzo算法，特点是牺牲压缩空间，但是压缩、解压速度快。</p>
<p>手头有几个HFile，因此，我拿几个HFile文件，以自己实现c++读HFile的功能，来了解sstable。下面就具体介绍下我的实现过程。</p>
<ul>
<li>HFile结构图
</li>
</ul>
<p>下图为HFile的结构图：</p>
<div id="attachment_319" class="wp-caption aligncenter" style="width: 160px"><a href="http://blog.hiwgy.com/wp-content/uploads/2012/03/HFile-format.png"><img src="http://blog.hiwgy.com/wp-content/uploads/2012/03/HFile-format-150x150.png" alt="HFile文件存储格式" title="HFile format" width="150" height="150" class="size-thumbnail wp-image-319" /></a><p class="wp-caption-text">HFile文件存储格式</p></div>
<p>1，data block<br />
文件的开始是由一些data block构成。如果HFile有压缩，就是对每个data block整体进行压缩，index中存储的是压缩后的offset。<br />
每个data block的结构包含了DATA BLOCK MAGIC（8bytes，校验文件是否有损坏）、key-value数据。<br />
key-value数据的结构图中已标出。这里的key和value的长度没有再采用vint，毕竟整个DATA BLOCK都压缩过了，对其中的元素再压缩就画蛇添足了。<br />
2，meta block<br />
可选块，用户自定义信息。每一个block的头部是META BLOCK MAGIC（8bytes），接着是这个meta定义的content。对这部分我没有实现，不能给出正确的描述：我认为应该是每个meta block只对应一个key，其content就是value。<br />
3，file info<br />
存储了整个文件中的记录的一些统计信息。<br />
4，data index<br />
数据的索引部分，开头是INDEX BLOCK MAGIC，接着是每一个data block的索引项。<br />
每个索引项包含的内容为：data block相对文件头的offset，data block压缩后（如果压缩了）的大小，key的长度（采用了vint表示），key的值（没有压缩）。</p>
<p>这里的key是索引项指向的data block的第一个key（该block最小的key，可以利用这个特性，二分查找一个key应该落在哪个data block中）。</p>
<p>其中vint是可变整数编码的一种，整数压缩编码有很多种，请参考<a href="http://vpri.org/fonc_wiki/index.php/Variable_Length_Integer">Variable Length Integer</a>，vint的编码方式请参考<a href="http://code.google.com/apis/protocolbuffers/docs/encoding.html">Encoding &#8211; Protocol Buffers</a>。<br />
简言之这里的vint的编码方式：以字节为单位，如果当前byte的第一个bit是1，代表该字节后面还有数据；否则，代表这个最后一个字节。然后，由于是以网络字节序存储的，还要转换为本地存储格式，即逆序排列所有的bytes，然后去掉每个byte的首个bit，就是压缩前的值。</p>
<p>5，meta index<br />
meta信息的索引。首先是INDEX BLOCK MAGIC（8bytes），然后是索引项。索引格式同index of data block相同。<br />
6，trailer<br />
跟踪器？！这是最重要的部分了，没有trailer，就找不到data index、meta index以及file info的位置，并且不知道压缩方式。下图详细描述了其结构：<br />
<div id="attachment_320" class="wp-caption aligncenter" style="width: 160px"><a href="http://blog.hiwgy.com/wp-content/uploads/2012/03/trailer.png"><img src="http://blog.hiwgy.com/wp-content/uploads/2012/03/trailer-150x150.png" alt="HFile trailer format" title="trailer" width="150" height="150" class="size-thumbnail wp-image-320" /></a><p class="wp-caption-text">HFile trailer结构</p></div></p>
<p>应该不需要详细解释了。<br />
HFile的version1和version2的trailer的结构区别见下图，引用自<a href="http://hbase.apache.org/book/apds03.html">HBase file format with inline blocks (version 2) </a><br />
<a href="http://blog.hiwgy.com/wp-content/uploads/2012/03/trailer_detail.png"><img src="http://blog.hiwgy.com/wp-content/uploads/2012/03/trailer_detail-150x150.png" alt="" title="trailer_detail" width="150" height="150" class="aligncenter size-thumbnail wp-image-321" /></a></p>
<ul>
<li>编程实现读HFile
</li>
</ul>
<p>首先，按照实现过程，说一下值得注意和我被绊倒的地方：<br />
1，根据机型不同，在我的ubuntu64位中，int是32字节，long是64字节。<br />
2，int和long的存储，是按照网络字节序（Big endian），而我的机器的内存字节序为Little endian<br />
例如“汉”字的Unicode编码是6C49。如果将6C写在前面，就是big endian。还是将49写在前面，就是little endian<br />
3，index of data block中的KeyLen采用的是vint，不是其他可变整数编码，一开始我没有查，直接用错了。<br />
4，压缩是对整个data block进行的，不是其中的单独key或者value，一开始，我糊涂了。。。<br />
5，二分查找key的时候，对临界值要判断好。<br />
6，动态申请内存的时候，我觉得用大于hint值的2的指数比较好，由于每个block大小差不多，因此申请一个就够了。<br />
7，设计了2个反序列化类：一个继承了fstream，从文件中读；一个适配了string，解压后的内容在这里，提供函数反序列化。改天再看看标程实怎么写的吧。</p>
<p>最后，附上一份贼齪的测试代码，采用边界值测试通过了。不过读者一定无法通过编译，需要去掉文中的一些log、check宏，替换一个你能获取到的lzo解压算法。</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;string&gt;</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;fstream&gt;</span>
<span style="color: #339900;">#include &lt;vector&gt;</span>
<span style="color: #339900;">#include &lt;algorithm&gt;</span>
<span style="color: #339900;">#include &lt;stdlib.h&gt;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int32_t</span> JKF_TRAILER_SIZE <span style="color: #000080;">=</span> <span style="color: #0000dd;">60</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int32_t</span> JKF_PAGE_SIZE <span style="color: #000080;">=</span> <span style="color: #0000dd;">4096</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int32_t</span> JKF_CODEC_NONE <span style="color: #000080;">=</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int32_t</span> JKF_CODEC_LZO <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">namespace</span> jk_base <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">char</span> DATABLOCKMAGIC<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">8</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #FF0000;">'D'</span>, <span style="color: #FF0000;">'A'</span>, <span style="color: #FF0000;">'T'</span>, <span style="color: #FF0000;">'A'</span>, <span style="color: #FF0000;">'B'</span>, <span style="color: #FF0000;">'L'</span>, <span style="color: #FF0000;">'K'</span>, <span style="color: #0000dd;">42</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">char</span> INDEXBLOCKMAGIC<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">8</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #FF0000;">'I'</span>, <span style="color: #FF0000;">'D'</span>, <span style="color: #FF0000;">'X'</span>, <span style="color: #FF0000;">'B'</span>, <span style="color: #FF0000;">'L'</span>, <span style="color: #FF0000;">'K'</span>, <span style="color: #0000dd;">41</span>, <span style="color: #0000dd;">43</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">char</span> METABLOCKMAGIC<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">8</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #FF0000;">'M'</span>, <span style="color: #FF0000;">'E'</span>, <span style="color: #FF0000;">'T'</span>, <span style="color: #FF0000;">'A'</span>, <span style="color: #FF0000;">'B'</span>, <span style="color: #FF0000;">'L'</span>, <span style="color: #FF0000;">'K'</span>, <span style="color: #0000dd;">99</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">char</span> TRAILERBLOCKMAGIC<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">8</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #FF0000;">'T'</span>, <span style="color: #FF0000;">'R'</span>, <span style="color: #FF0000;">'A'</span>, <span style="color: #FF0000;">'B'</span>, <span style="color: #FF0000;">'L'</span>, <span style="color: #FF0000;">'K'</span>, <span style="color: #0000dd;">34</span>, <span style="color: #0000dd;">36</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">enum</span> Mode <span style="color: #008000;">&#123;</span>
        JKF_READ <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span>,
        JKF_WRITE <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span>,
    <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #666666;">// for debug</span>
    <span style="color: #0000ff;">void</span> pgc<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> c<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">char</span> a <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>c<span style="color: #000080;">&gt;&gt;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">&amp;</span><span style="color: #208080;">0x0f</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">char</span> b <span style="color: #000080;">=</span> c<span style="color: #000040;">&amp;</span><span style="color: #208080;">0x0f</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>a <span style="color: #000080;">&gt;=</span> <span style="color: #0000dd;">10</span><span style="color: #008000;">&#41;</span> a <span style="color: #000080;">=</span> <span style="color: #FF0000;">'a'</span> <span style="color: #000040;">+</span> a <span style="color: #000040;">-</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">else</span> a <span style="color: #000080;">=</span> <span style="color: #FF0000;">'0'</span> <span style="color: #000040;">+</span> a<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>b <span style="color: #000080;">&gt;=</span> <span style="color: #0000dd;">10</span><span style="color: #008000;">&#41;</span> b <span style="color: #000080;">=</span> <span style="color: #FF0000;">'a'</span> <span style="color: #000040;">+</span> b <span style="color: #000040;">-</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">else</span> b <span style="color: #000080;">=</span> <span style="color: #FF0000;">'0'</span> <span style="color: #000040;">+</span> b<span style="color: #008080;">;</span>
        <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> a <span style="color: #000080;">&lt;&lt;</span> b <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; &quot;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #666666;">// end of debug</span>
&nbsp;
    <span style="color: #0000ff;">class</span> JKF_string <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
            <span style="color: #0000ff;">explicit</span> JKF_string<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span> buf, <span style="color: #0000ff;">int32_t</span> length<span style="color: #008000;">&#41;</span><span style="color: #008080;">:</span>str_<span style="color: #008000;">&#40;</span>buf, length<span style="color: #008000;">&#41;</span>, poz_<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>, length_<span style="color: #008000;">&#40;</span>length<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">explicit</span> JKF_string<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> string <span style="color: #000040;">&amp;</span> str<span style="color: #008000;">&#41;</span> <span style="color: #008080;">:</span> str_<span style="color: #008000;">&#40;</span>str<span style="color: #008000;">&#41;</span>, poz_<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>, length_<span style="color: #008000;">&#40;</span>str.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
            ~JKF_string<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">void</span> read_int <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int32_t</span> <span style="color: #000040;">*</span> v<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span> pv <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>v<span style="color: #008080;">;</span>
                <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span> buf <span style="color: #000080;">=</span> str_.<span style="color: #007788;">c_str</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> poz_<span style="color: #008080;">;</span> 
                poz_ <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">sizeof</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int32_t</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                CHECK_LE <span style="color: #008000;">&#40;</span>poz_, length_<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                pv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> buf<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                pv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> buf<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                pv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> buf<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                pv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> buf<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
            <span style="color: #0000ff;">void</span> read_int <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int64_t</span> <span style="color: #000040;">*</span> v<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span> pv <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>v<span style="color: #008080;">;</span>
                <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span> buf <span style="color: #000080;">=</span> str_.<span style="color: #007788;">c_str</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> poz_<span style="color: #008080;">;</span> 
                poz_ <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">sizeof</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int64_t</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                CHECK_LE <span style="color: #008000;">&#40;</span>poz_, length_<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                pv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> buf<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">7</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                pv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> buf<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                pv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> buf<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                pv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> buf<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                pv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> buf<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                pv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> buf<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                pv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> buf<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                pv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">7</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> buf<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
            <span style="color: #0000ff;">void</span> read<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span> buf, <span style="color: #0000ff;">int32_t</span> length<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span> src <span style="color: #000080;">=</span> str_.<span style="color: #007788;">c_str</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> poz_<span style="color: #008080;">;</span>
                CHECK_LE <span style="color: #008000;">&#40;</span>poz_ <span style="color: #000040;">+</span> length, length_<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                <span style="color: #0000dd;">memcpy</span><span style="color: #008000;">&#40;</span>buf, src, length<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                poz_ <span style="color: #000040;">+</span><span style="color: #000080;">=</span> length<span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
            <span style="color: #0000ff;">void</span> read<span style="color: #008000;">&#40;</span>string <span style="color: #000040;">*</span> value, <span style="color: #0000ff;">int32_t</span> length<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                CHECK_LE <span style="color: #008000;">&#40;</span>poz_ <span style="color: #000040;">+</span> length, length_<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                <span style="color: #000040;">*</span>value <span style="color: #000080;">=</span> string<span style="color: #008000;">&#40;</span>str_, poz_, length<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                poz_ <span style="color: #000040;">+</span><span style="color: #000080;">=</span> length<span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
            <span style="color: #0000ff;">void</span> seekg<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int32_t</span> length<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                CHECK_LE <span style="color: #008000;">&#40;</span>poz_ <span style="color: #000040;">+</span> length, length_<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                poz_ <span style="color: #000040;">+</span><span style="color: #000080;">=</span> length<span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
            <span style="color: #0000ff;">bool</span> eof<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000ff;">return</span> poz_ <span style="color: #000080;">&gt;=</span> length_<span style="color: #008080;">;</span><span style="color: #008000;">&#125;</span>
        <span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
            string str_<span style="color: #008080;">;</span>
            <span style="color: #0000ff;">int32_t</span> poz_<span style="color: #008080;">;</span>
            <span style="color: #0000ff;">int32_t</span> length_<span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">class</span> JKF_stream <span style="color: #008080;">:</span> <span style="color: #0000ff;">public</span> fstream <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
            JKF_stream<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">:</span>fstream<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">explicit</span> JKF_stream<span style="color: #008000;">&#40;</span> <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span> filename, ios_base<span style="color: #008080;">::</span><span style="color: #007788;">openmode</span> mode <span style="color: #000080;">=</span> ios_base<span style="color: #008080;">::</span><span style="color: #007788;">in</span> <span style="color: #000040;">|</span> ios_base<span style="color: #008080;">::</span><span style="color: #007788;">out</span> <span style="color: #008000;">&#41;</span> <span style="color: #008080;">:</span> 
                fstream<span style="color: #008000;">&#40;</span>filename, mode<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                <span style="color: #008000;">&#125;</span>
&nbsp;
            ~JKF_stream<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
            istream<span style="color: #000040;">&amp;</span> read_int <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int32_t</span> <span style="color: #000040;">*</span> v<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                fstream<span style="color: #008080;">::</span><span style="color: #007788;">read</span><span style="color: #008000;">&#40;</span>buf_, <span style="color: #0000dd;">sizeof</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int32_t</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span> pv <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>v<span style="color: #008080;">;</span>
                pv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> buf_<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                pv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> buf_<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                pv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> buf_<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                pv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> buf_<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                <span style="color: #0000ff;">return</span> <span style="color: #000040;">*</span><span style="color: #0000dd;">this</span><span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
            istream<span style="color: #000040;">&amp;</span> read_int <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int64_t</span> <span style="color: #000040;">*</span> v<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                fstream<span style="color: #008080;">::</span><span style="color: #007788;">read</span><span style="color: #008000;">&#40;</span>buf_, <span style="color: #0000dd;">sizeof</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int64_t</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span> pv <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>v<span style="color: #008080;">;</span>
                pv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> buf_<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">7</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                pv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> buf_<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                pv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> buf_<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                pv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> buf_<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                pv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> buf_<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                pv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> buf_<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                pv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> buf_<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                pv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">7</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> buf_<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                <span style="color: #0000ff;">return</span> <span style="color: #000040;">*</span><span style="color: #0000dd;">this</span><span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
            istream<span style="color: #000040;">&amp;</span> read_vint <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int32_t</span> <span style="color: #000040;">*</span> v<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                <span style="color: #0000ff;">int32_t</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
                <span style="color: #0000ff;">int64_t</span> sum <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
                <span style="color: #0000ff;">do</span> <span style="color: #008000;">&#123;</span>
                    fstream<span style="color: #008080;">::</span><span style="color: #007788;">read</span><span style="color: #008000;">&#40;</span>buf_ <span style="color: #000040;">+</span> i, <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                <span style="color: #008000;">&#125;</span> <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>buf_<span style="color: #008000;">&#91;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">&amp;</span> <span style="color: #208080;">0x80</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
                <span style="color: #666666;">// TODO: (wangguangyuan) check the max size</span>
                CHECK_LE<span style="color: #008000;">&#40;</span>i, <span style="color: #0000dd;">5</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;vint exceed 5 bytes&quot;</span><span style="color: #008080;">;</span>
&nbsp;
                <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000040;">--</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                    <span style="color: #0000ff;">char</span> t <span style="color: #000080;">=</span> buf_<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                    sum <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>sum <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">7</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int64_t</span><span style="color: #008000;">&#41;</span>t<span style="color: #008080;">;</span>
                <span style="color: #008000;">&#125;</span>
                <span style="color: #000040;">*</span>v <span style="color: #000080;">=</span> sum<span style="color: #008080;">;</span>
                <span style="color: #0000ff;">return</span> <span style="color: #000040;">*</span><span style="color: #0000dd;">this</span><span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span>
        <span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
            <span style="color: #0000ff;">char</span> buf_<span style="color: #008000;">&#91;</span>JKF_PAGE_SIZE<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #339900;">#pragma pack(1)</span>
    <span style="color: #0000ff;">struct</span> JKF_trailer <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">char</span> trailer_block_magic<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">8</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">int64_t</span> file_info_offset<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">int64_t</span> data_index_offset<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">int32_t</span> data_index_count<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">int64_t</span> meta_index_offset<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">int32_t</span> meta_index_count<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">int64_t</span> total_bytes<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">int32_t</span> entry_count<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">int32_t</span> compression_codec<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">int32_t</span> version<span style="color: #008080;">;</span>
        <span style="color: #666666;">// for debug</span>
        <span style="color: #0000ff;">void</span> Print<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
            std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;TrailerBlockMagic:&quot;</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int32_t</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">8</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%c&quot;</span>, trailer_block_magic<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span>
            std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
            std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;FileInfoOffset:&quot;</span> <span style="color: #000080;">&lt;&lt;</span> file_info_offset <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
            std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;DataIndexOffset:&quot;</span> <span style="color: #000080;">&lt;&lt;</span> data_index_offset <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
            std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;DataIndexCount:&quot;</span> <span style="color: #000080;">&lt;&lt;</span> data_index_count <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
            std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;MetaIndexOffset:&quot;</span> <span style="color: #000080;">&lt;&lt;</span> meta_index_offset <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
            std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;MetaIndexCount:&quot;</span> <span style="color: #000080;">&lt;&lt;</span> meta_index_count <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
            std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;TotalBytes:&quot;</span> <span style="color: #000080;">&lt;&lt;</span> total_bytes <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
            std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;EntryCount:&quot;</span> <span style="color: #000080;">&lt;&lt;</span> entry_count <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
            std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;CompressionCodec:&quot;</span> <span style="color: #000080;">&lt;&lt;</span> compression_codec <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
            std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Version:&quot;</span> <span style="color: #000080;">&lt;&lt;</span> version <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0000ff;">bool</span> Deserialize<span style="color: #008000;">&#40;</span>JKF_stream <span style="color: #000040;">&amp;</span> is<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
            is.<span style="color: #007788;">read</span><span style="color: #008000;">&#40;</span>trailer_block_magic, <span style="color: #0000dd;">sizeof</span> <span style="color: #008000;">&#40;</span>trailer_block_magic<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #0000dd;">strncmp</span><span style="color: #008000;">&#40;</span>trailer_block_magic, TRAILERBLOCKMAGIC, <span style="color: #0000dd;">sizeof</span> <span style="color: #008000;">&#40;</span>trailer_block_magic<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span>
            is.<span style="color: #007788;">read_int</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>file_info_offset<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            is.<span style="color: #007788;">read_int</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>data_index_offset<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            is.<span style="color: #007788;">read_int</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>data_index_count<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            is.<span style="color: #007788;">read_int</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>meta_index_offset<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            is.<span style="color: #007788;">read_int</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>meta_index_count<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            is.<span style="color: #007788;">read_int</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>total_bytes<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            is.<span style="color: #007788;">read_int</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>entry_count<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            is.<span style="color: #007788;">read_int</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>compression_codec<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            is.<span style="color: #007788;">read_int</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>version<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
            Print<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">struct</span> JKF_data_index_block <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">int64_t</span> block_begin<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">int32_t</span> block_size<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">int32_t</span> key_size<span style="color: #008080;">;</span> <span style="color: #666666;">// note: vint</span>
        std<span style="color: #008080;">::</span><span style="color: #007788;">string</span> block_first_key<span style="color: #008080;">;</span> <span style="color: #666666;">// the first key of the block</span>
    <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #339900;">#pragma pack()</span>
&nbsp;
    <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">bool</span> DataIndexBlockCompare<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> JKF_data_index_block <span style="color: #000040;">&amp;</span> l, <span style="color: #0000ff;">const</span> JKF_data_index_block <span style="color: #000040;">&amp;</span> r<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #008000;">&#40;</span>l.<span style="color: #007788;">block_first_key</span> <span style="color: #000080;">&lt;</span> r.<span style="color: #007788;">block_first_key</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">class</span> JKFile <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
            JKFile<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            JKFile<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> std<span style="color: #008080;">::</span><span style="color: #007788;">string</span> <span style="color: #000040;">&amp;</span> file_path, Mode mode<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            ~JKFile<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">bool</span> Open<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> std<span style="color: #008080;">::</span><span style="color: #007788;">string</span> <span style="color: #000040;">&amp;</span> file_path, Mode mode<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">bool</span> Seek<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> std<span style="color: #008080;">::</span><span style="color: #007788;">string</span> <span style="color: #000040;">&amp;</span> key, std<span style="color: #008080;">::</span><span style="color: #007788;">string</span> <span style="color: #000040;">*</span> value<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">void</span> Close<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">bool</span> IsOpen<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000ff;">return</span> is_open_<span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
        <span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
            <span style="color: #0000ff;">bool</span> ReadTrailer<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">bool</span> LoadDataIndex<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">bool</span> SeekDataRecord<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> JKF_data_index_block <span style="color: #000040;">&amp;</span> block, <span style="color: #0000ff;">const</span> string <span style="color: #000040;">&amp;</span> key, string <span style="color: #000040;">*</span> value<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">bool</span> Decode<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span> buf, <span style="color: #0000ff;">int32_t</span> length, string <span style="color: #000040;">*</span> value<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">void</span> ResizeBufferIfNeed<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">uint32_t</span> hint<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>hint <span style="color: #000080;">&gt;</span> cur_buf_size_<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                    VLOG<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;hint block size:&quot;</span> <span style="color: #000080;">&lt;&lt;</span> hint<span style="color: #008080;">;</span>
                    <span style="color: #0000dd;">delete</span><span style="color: #008000;">&#40;</span>buf_<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                    cur_buf_size_ <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
                    <span style="color: #0000ff;">int32_t</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">32</span><span style="color: #008080;">;</span>
                    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> <span style="color: #000040;">--</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>hint <span style="color: #000040;">&amp;</span> <span style="color: #208080;">0x80000000</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                            <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
                        <span style="color: #008000;">&#125;</span>
                        hint <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>hint<span style="color: #000080;">&lt;&lt;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                    <span style="color: #008000;">&#125;</span>
                    cur_buf_size_ <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>cur_buf_size_<span style="color: #000080;">&lt;&lt;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                    buf_ <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span> <span style="color: #0000dd;">malloc</span><span style="color: #008000;">&#40;</span>cur_buf_size_<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                    VLOG<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;resize buffer:&quot;</span> <span style="color: #000080;">&lt;&lt;</span> cur_buf_size_<span style="color: #008080;">;</span>
                <span style="color: #008000;">&#125;</span>
            <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
            JKF_stream ifs_<span style="color: #008080;">;</span>
            JKF_trailer trailer_<span style="color: #008080;">;</span>
            <span style="color: #0000ff;">bool</span> is_open_<span style="color: #008080;">;</span>
            vector<span style="color: #000080;">&lt;</span>JKF_data_index_block<span style="color: #000080;">&gt;</span> data_index_blocks_<span style="color: #008080;">;</span>
            <span style="color: #0000ff;">int32_t</span> header_offset_<span style="color: #008080;">;</span>
            util<span style="color: #008080;">::</span><span style="color: #007788;">Compression</span> <span style="color: #000040;">*</span> compression_<span style="color: #008080;">;</span>  <span style="color: #666666;">// 压缩解压工具</span>
            <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span> buf_<span style="color: #008080;">;</span>
            <span style="color: #0000ff;">uint32_t</span> cur_buf_size_<span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">void</span> JKFile<span style="color: #008080;">::</span><span style="color: #007788;">Close</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        is_open_ <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
        data_index_blocks_.<span style="color: #007788;">clear</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #0000dd;">delete</span> compression_<span style="color: #008080;">;</span>
        compression_ <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
        <span style="color: #0000dd;">free</span><span style="color: #008000;">&#40;</span>buf_<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        buf_ <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
        cur_buf_size_ <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    JKFile<span style="color: #008080;">::</span><span style="color: #007788;">JKFile</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008080;">:</span> is_open_<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">false</span><span style="color: #008000;">&#41;</span>, compression_<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span>, buf_<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span>, cur_buf_size_<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
&nbsp;
    JKFile<span style="color: #008080;">::</span><span style="color: #007788;">JKFile</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> std<span style="color: #008080;">::</span><span style="color: #007788;">string</span> <span style="color: #000040;">&amp;</span> file_path, Mode mode<span style="color: #008000;">&#41;</span> <span style="color: #008080;">:</span> is_open_<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">false</span><span style="color: #008000;">&#41;</span>,
                    compression_<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span>, buf_<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span>, cur_buf_size_<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        Open<span style="color: #008000;">&#40;</span>file_path, mode<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">bool</span> JKFile<span style="color: #008080;">::</span><span style="color: #007788;">LoadDataIndex</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #666666;">// check index block magic</span>
        <span style="color: #0000ff;">char</span> index_block_magic<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">8</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
        ifs_.<span style="color: #007788;">seekg</span><span style="color: #008000;">&#40;</span>trailer_.<span style="color: #007788;">data_index_offset</span>, ios_base<span style="color: #008080;">::</span><span style="color: #007788;">beg</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        ifs_.<span style="color: #007788;">read</span><span style="color: #008000;">&#40;</span>index_block_magic, <span style="color: #0000dd;">sizeof</span> <span style="color: #008000;">&#40;</span>index_block_magic<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #0000dd;">strncmp</span><span style="color: #008000;">&#40;</span>index_block_magic, INDEXBLOCKMAGIC, <span style="color: #0000dd;">sizeof</span> <span style="color: #008000;">&#40;</span>index_block_magic<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
            VLOG<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;FATAL: data index block crash&quot;</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #666666;">// load data index blocks</span>
        <span style="color: #0000ff;">int32_t</span> cur_buf_size <span style="color: #000080;">=</span> <span style="color: #0000dd;">32</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span> buf <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span><span style="color: #0000dd;">malloc</span><span style="color: #008000;">&#40;</span>cur_buf_size <span style="color: #000040;">*</span> <span style="color: #0000dd;">sizeof</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        CHECK<span style="color: #008000;">&#40;</span>buf<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int32_t</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> trailer_.<span style="color: #007788;">data_index_count</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
            JKF_data_index_block block<span style="color: #008080;">;</span>
            ifs_.<span style="color: #007788;">read_int</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>block.<span style="color: #007788;">block_begin</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            ifs_.<span style="color: #007788;">read_int</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>block.<span style="color: #007788;">block_size</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            ifs_.<span style="color: #007788;">read_vint</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>block.<span style="color: #007788;">key_size</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            <span style="color: #666666;">// enlarge the buffer</span>
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>cur_buf_size <span style="color: #000080;">&lt;=</span> block.<span style="color: #007788;">key_size</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                cur_buf_size <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>cur_buf_size<span style="color: #000080;">&lt;&lt;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&gt;</span> block.<span style="color: #007788;">key_size</span> <span style="color: #008080;">?</span> <span style="color: #008000;">&#40;</span>cur_buf_size<span style="color: #000080;">&lt;&lt;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #008080;">:</span> <span style="color: #008000;">&#40;</span>block.<span style="color: #007788;">key_size</span> <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                <span style="color: #0000dd;">free</span><span style="color: #008000;">&#40;</span>buf<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                buf <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
                buf <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span><span style="color: #0000dd;">malloc</span><span style="color: #008000;">&#40;</span>cur_buf_size <span style="color: #000040;">*</span> <span style="color: #0000dd;">sizeof</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                CHECK<span style="color: #008000;">&#40;</span>buf<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span>
            ifs_.<span style="color: #007788;">read</span><span style="color: #008000;">&#40;</span>buf, block.<span style="color: #007788;">key_size</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            buf<span style="color: #008000;">&#91;</span>block.<span style="color: #007788;">key_size</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #FF0000;">'<span style="color: #006699; font-weight: bold;">\0</span>'</span><span style="color: #008080;">;</span>
            block.<span style="color: #007788;">block_first_key</span> <span style="color: #000080;">=</span> string<span style="color: #008000;">&#40;</span>buf<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            data_index_blocks_.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>block<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
            VLOG<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">6</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> i <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; block_info: begin[&quot;</span> <span style="color: #000080;">&lt;&lt;</span> block.<span style="color: #007788;">block_begin</span> <span style="color: #000080;">&lt;&lt;</span>
                <span style="color: #FF0000;">&quot;] size[&quot;</span> <span style="color: #000080;">&lt;&lt;</span> block.<span style="color: #007788;">block_size</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;] key_size[&quot;</span> <span style="color: #000080;">&lt;&lt;</span> block.<span style="color: #007788;">key_size</span> <span style="color: #000080;">&lt;&lt;</span> 
                <span style="color: #FF0000;">&quot;] block_first_key[&quot;</span> <span style="color: #000080;">&lt;&lt;</span> block.<span style="color: #007788;">block_first_key</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;]&quot;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
        <span style="color: #0000dd;">free</span><span style="color: #008000;">&#40;</span>buf<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        buf <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">bool</span> JKFile<span style="color: #008080;">::</span><span style="color: #007788;">ReadTrailer</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        ifs_.<span style="color: #007788;">seekg</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span>JKF_TRAILER_SIZE, ios_base<span style="color: #008080;">::</span><span style="color: #007788;">end</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">return</span> trailer_.<span style="color: #007788;">Deserialize</span><span style="color: #008000;">&#40;</span>ifs_<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">bool</span> JKFile<span style="color: #008080;">::</span><span style="color: #007788;">Open</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> std<span style="color: #008080;">::</span><span style="color: #007788;">string</span> <span style="color: #000040;">&amp;</span> file_path, Mode mode<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>mode <span style="color: #000080;">==</span> JKF_READ<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
            CHECK<span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>is_open_<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;JKFile already open, can't be re-opend&quot;</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">do</span> <span style="color: #008000;">&#123;</span>
                ifs_.<span style="color: #007788;">open</span><span style="color: #008000;">&#40;</span>file_path.<span style="color: #007788;">c_str</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, ios_base<span style="color: #008080;">::</span><span style="color: #007788;">in</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>ifs_.<span style="color: #007788;">is_open</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                    VLOG<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;FATAL: file not exist&quot;</span><span style="color: #008080;">;</span>
                    <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
                <span style="color: #008000;">&#125;</span>
                <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>ReadTrailer<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                    VLOG<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;FATAL: read trailer fail&quot;</span><span style="color: #008080;">;</span>
                    <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
                <span style="color: #008000;">&#125;</span>
                <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>trailer_.<span style="color: #007788;">compression_codec</span> <span style="color: #000080;">==</span> JKF_CODEC_LZO<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                    <span style="color: #666666;">// 这里引用了成型的算法包</span>
                    compression_ <span style="color: #000080;">=</span> util<span style="color: #008080;">::</span><span style="color: #007788;">Compression</span><span style="color: #008080;">::</span><span style="color: #007788;">GetCompressionAlgorithm</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;lzo&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span> <span style="color: #000080;">==</span> compression_<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                        VLOG<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;FATAL: get compr lzo fail&quot;</span><span style="color: #008080;">;</span>
                        <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
                    <span style="color: #008000;">&#125;</span>
                <span style="color: #008000;">&#125;</span>
                <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>LoadDataIndex<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                    VLOG<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;FATAL: load data index fail&quot;</span><span style="color: #008080;">;</span>
                    <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
                <span style="color: #008000;">&#125;</span>
                is_open_ <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span> <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span> <span style="color: #0000ff;">else</span> <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">bool</span> JKFile<span style="color: #008080;">::</span><span style="color: #007788;">SeekDataRecord</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> JKF_data_index_block <span style="color: #000040;">&amp;</span> block, <span style="color: #0000ff;">const</span> string <span style="color: #000040;">&amp;</span> key, string <span style="color: #000040;">*</span> value<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #666666;">// prepare memory</span>
        ResizeBufferIfNeed<span style="color: #008000;">&#40;</span>block.<span style="color: #007788;">block_size</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
        <span style="color: #666666;">// read the data block</span>
        ifs_.<span style="color: #007788;">seekg</span><span style="color: #008000;">&#40;</span>block.<span style="color: #007788;">block_begin</span>, ios_base<span style="color: #008080;">::</span><span style="color: #007788;">beg</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        ifs_.<span style="color: #007788;">read</span><span style="color: #008000;">&#40;</span>buf_, block.<span style="color: #007788;">block_size</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
        <span style="color: #666666;">// decode the data block</span>
        string content<span style="color: #008080;">;</span>
        Decode<span style="color: #008000;">&#40;</span>buf_, block.<span style="color: #007788;">block_size</span>, <span style="color: #000040;">&amp;</span>content<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        JKF_string jkfs<span style="color: #008000;">&#40;</span>content<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
        <span style="color: #666666;">// first compare the magic</span>
        string magic<span style="color: #008080;">;</span>
        jkfs.<span style="color: #007788;">read</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>magic, <span style="color: #0000dd;">8</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>magic <span style="color: #000040;">!</span><span style="color: #000080;">=</span> string<span style="color: #008000;">&#40;</span>DATABLOCKMAGIC, <span style="color: #0000dd;">8</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>    
            VLOG<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;WARNING: data block crash&quot;</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>jkfs.<span style="color: #007788;">eof</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">int32_t</span> key_length<span style="color: #008080;">;</span>
            <span style="color: #0000ff;">int32_t</span> value_length<span style="color: #008080;">;</span>
            string cur_key<span style="color: #008080;">;</span>
&nbsp;
            jkfs.<span style="color: #007788;">read_int</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>key_length<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            jkfs.<span style="color: #007788;">read_int</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>value_length<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            jkfs.<span style="color: #007788;">read</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>cur_key, key_length<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            VLOG<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">6</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;key:&quot;</span> <span style="color: #000080;">&lt;&lt;</span> cur_key<span style="color: #008080;">;</span>
&nbsp;
            <span style="color: #666666;">// find the key</span>
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>key <span style="color: #000080;">==</span> cur_key<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
                jkfs.<span style="color: #007788;">read</span><span style="color: #008000;">&#40;</span>value, value_length<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span> <span style="color: #0000ff;">else</span> <span style="color: #008000;">&#123;</span>
                <span style="color: #666666;">// move the file pointer</span>
                jkfs.<span style="color: #007788;">seekg</span><span style="color: #008000;">&#40;</span>value_length<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
                <span style="color: #666666;">// jkfs.read(value, value_length);</span>
                <span style="color: #666666;">// VLOG(6) &lt;&lt; &quot;value:&quot; &lt;&lt; *value &lt;&lt; endl;</span>
            <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">bool</span> JKFile<span style="color: #008080;">::</span><span style="color: #007788;">Decode</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span> buf, <span style="color: #0000ff;">int32_t</span> length, string <span style="color: #000040;">*</span> value<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>trailer_.<span style="color: #007788;">compression_codec</span> <span style="color: #000080;">==</span> JKF_CODEC_NONE<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
            <span style="color: #000040;">*</span>value <span style="color: #000080;">=</span> string<span style="color: #008000;">&#40;</span>buf, length<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span> <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>trailer_.<span style="color: #007788;">compression_codec</span> <span style="color: #000080;">==</span> JKF_CODEC_LZO<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">return</span> compression_<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>Uncompress<span style="color: #008000;">&#40;</span>buf, length, value<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span> <span style="color: #0000ff;">else</span> <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
&nbsp;
    <span style="color: #0000ff;">bool</span> JKFile<span style="color: #008080;">::</span><span style="color: #007788;">Seek</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> std<span style="color: #008080;">::</span><span style="color: #007788;">string</span> <span style="color: #000040;">&amp;</span> key, std<span style="color: #008080;">::</span><span style="color: #007788;">string</span> <span style="color: #000040;">*</span> value<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #666666;">// the JKFile must be opened</span>
        CHECK<span style="color: #008000;">&#40;</span>IsOpen<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
        <span style="color: #666666;">// binary search the lower bound of the key</span>
        JKF_data_index_block catch_me<span style="color: #008080;">;</span>
        catch_me.<span style="color: #007788;">block_first_key</span> <span style="color: #000080;">=</span> key<span style="color: #008080;">;</span>
        vector<span style="color: #000080;">&lt;</span>JKF_data_index_block<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">iterator</span> it<span style="color: #008080;">;</span>
        it <span style="color: #000080;">=</span> lower_bound<span style="color: #008000;">&#40;</span>data_index_blocks_.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, data_index_blocks_.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>,
                   catch_me , DataIndexBlockCompare<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
        <span style="color: #666666;">// the check order must be right</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>it <span style="color: #000040;">!</span><span style="color: #000080;">=</span> data_index_blocks_.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">&amp;&amp;</span> it<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>block_first_key <span style="color: #000080;">==</span> key<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
            VLOG<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;luckly hit the block's first key&quot;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span> <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>it <span style="color: #000080;">==</span> data_index_blocks_.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
            VLOG<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;the key is the smallest, no proper block&quot;</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span> <span style="color: #0000ff;">else</span> <span style="color: #008000;">&#123;</span>
            VLOG<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;just try the pre block&quot;</span><span style="color: #008080;">;</span>
            <span style="color: #000040;">--</span>it<span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #666666;">// search in the maybe block</span>
        <span style="color: #0000ff;">return</span> SeekDataRecord<span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>it, key, value<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span> <span style="color: #000040;">**</span> argv<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    string file_name<span style="color: #008000;">&#40;</span>argv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    jk_base<span style="color: #008080;">::</span><span style="color: #007788;">JKFile</span> jkf<span style="color: #008000;">&#40;</span>file_name, jk_base<span style="color: #008080;">::</span><span style="color: #007788;">JKF_READ</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    CHECK<span style="color: #008000;">&#40;</span>jkf.<span style="color: #007788;">IsOpen</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    string value, key<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>jkf.<span style="color: #007788;">Seek</span><span style="color: #008000;">&#40;</span>key, <span style="color: #000040;">&amp;</span>value<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;value is:&quot;</span> <span style="color: #000080;">&lt;&lt;</span> value <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span> <span style="color: #0000ff;">else</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;bad luck!&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #ff0000; font-style: italic;">/* vim: set expandtab ts=4 sw=4 sts=4 tw=100: */</span></pre></div></div>

<p>水文到此结束。<br />
之前对bloom filter的应用描述有错，HFile version2的format跟version1的变化还是蛮大的，请参考 <a href="http://hbase.apache.org/book/apds03.html">HBase file format with inline blocks</a>。以后再学习下。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hiwgy.com/2012/03/11/hfile_format_and_c_implement/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>儿童摄影</title>
		<link>http://blog.hiwgy.com/2012/02/28/child_photo/</link>
		<comments>http://blog.hiwgy.com/2012/02/28/child_photo/#comments</comments>
		<pubDate>Tue, 28 Feb 2012 03:26:22 +0000</pubDate>
		<dc:creator>dllgwgy</dc:creator>
				<category><![CDATA[摄影]]></category>
		<category><![CDATA[child]]></category>
		<category><![CDATA[photo]]></category>

		<guid isPermaLink="false">http://blog.hiwgy.com/?p=311</guid>
		<description><![CDATA[
儿童摄影，抓住那一瞬间，就能出一张好照片。
]]></description>
			<content:encoded><![CDATA[<p>儿童摄影，抓住那一瞬间，就能出一张好照片。</p>

<a href='http://blog.hiwgy.com/2012/02/28/child_photo/img_6403/' title='IMG_6403'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/02/IMG_6403-150x150.jpg" class="attachment-thumbnail" alt="IMG_6403" title="IMG_6403" /></a>
<a href='http://blog.hiwgy.com/2012/02/28/child_photo/img_6443/' title='IMG_6443'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/02/IMG_6443-150x150.jpg" class="attachment-thumbnail" alt="IMG_6443" title="IMG_6443" /></a>
<a href='http://blog.hiwgy.com/2012/02/28/child_photo/img_6608/' title='IMG_6608'><img width="150" height="150" src="http://blog.hiwgy.com/wp-content/uploads/2012/02/IMG_6608-150x150.jpg" class="attachment-thumbnail" alt="IMG_6608" title="IMG_6608" /></a>

]]></content:encoded>
			<wfw:commentRss>http://blog.hiwgy.com/2012/02/28/child_photo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

