今天早上一大早,打开QQ,发现自己QQ上面已经是一个太阳和一个月亮了!终于20级了,一个字–爽啊!
作为比较早的一批网虫,其实现在才20级真不算什么,但是怎么说呢都要庆贺一下!
那就来听一支歌吧!~我很喜欢的哦!
《Kiss The Rain》
http://aic.com.ru/blog/up/1116351072.mp3
[razz]
QQ等级20了!高兴!!!!!!!
2005/05/23一个非常好的公益广告–常回家看看!
2005/05/20好久都没有和家里面联系了,想想出来都这么几年了,还是有点想家!
昨天在网上,遇到我堂哥,他说他昨天遇上我父母亲了,我父母说我好久都没有打电话回家了.
其实我也真的很久没有给家里面打电话了!晚上回去一定先给家里面打个电话!
刚好在网上也找了个公益广告,看了更加的感触极深了!
wp-content/uploads/2005/05/81500gohome.rm
一个免费的GMail邀请站点!
2005/05/20非常详细的IFRAME的属性参考手册
2005/05/20创建内嵌浮动框架。
成员表
下面的表格列出了 iframe 对象引出的成员。请单击左侧的标签来选择你想要查看的成员类型。
标签属性/属性
显示:
标签属性/属性
行为
集合
事件
滤镜
方法
对象
样式
标签属性 属性 描述
ALIGN align 设置或获取表格排列。
ALLOWTRANSPARENCY allowTransparency 设置或获取对象是否可为透明。
APPLICATION APPLICATION 表明对象的内容是否为 HTML 应用程序(HTA),以便免除浏览器安全模式。
ATOMICSELECTION 指定元素及其内容是否可以一不可见单位统一选择。
BEGIN begin 设置或获取时间线在该元素上播放前的延迟时间。
BORDER border 设置或获取框架间的空间,包括 3D 边框。
canHaveChildren 获取表明对象是否可以包含子对象的值。
canHaveHTML 获取表明对象是否可以包含丰富的 HTML 标签的值。
CLASS className 设置或获取对象的类。
contentWindow 获取指定的 frame 或 iframe 的 window 对象。
DATAFLD dataFld 设置或获取由 dataSrc 属性指定的绑定到指定对象的给定数据源的字段。
DATASRC dataSrc 设置或获取用于数据绑定的数据源。
disabled 获取表明用户是否可与该对象交互的值。
END end 设置或获取表明元素结束时间的值,或者元素设置为重复的简单持续终止时间。
firstChild 获取对象的 childNodes 集合的第一个子对象的引用。
FRAMEBORDER frameBorder 设置或获取是否显示框架的边框。
hasMedia 获取一个表明元素是否为 HTML+TIME 媒体元素的 Boolean 值。
HEIGHT height 设置或获取对象的高度。
HIDEFOCUS hideFocus 设置或获取表明对象是否显式标明焦点的值。
HSPACE hspace 设置或获取对象的水平边距。
ID id 获取标识对象的字符串。
innerText 设置或获取位于对象起始和结束标签内的文本。
isContentEditable 获取表明用户是否可编辑对象内容的值。
isDisabled 获取表明用户是否可与该对象交互的值。
isMultiLine 获取表明对象的内容是包含一行还是多行的值。
isTextEdit 获取是否可使用该对象创建一个 TextRange 对象。
LANG lang 设置或获取要使用的语言。
LANGUAGE language 设置或获取当前脚本编写用的语言。
lastChild 获取该对象 childNodes 集合中最后一个子对象的引用。
longDesc 设置或获取对象长描述的统一资源标识符(URI)。
MARGINHEIGHT marginHeight 设置或获取显示框架中文本之前的上下边距高度。
MARGINWIDTH marginWidth 设置或获取显示框架中文本之前的左右边距宽度。
NAME name 设置或获取框架的名称。
nextSibling 获取对此对象的下一个兄弟对象的引用。
nodeName 获取特定结点类型的名称。
nodeType 获取所需结点的类型。
nodeValue 设置或获取结点的值。
offsetHeight 获取对象相对于版面或由父坐标 offsetParent 属性指定的父坐标的高度。
offsetLeft 获取对象相对于版面或由 offsetParent 属性指定的父坐标的计算左侧位置。
offsetParent 获取定义对象 offsetTop 和 offsetLeft 属性的容器对象的引用。
offsetTop 获取对象相对于版面或由 offsetTop 属性指定的父坐标的计算顶端位置。
offsetWidth 获取对象相对于版面或由父坐标 offsetParent 属性指定的父坐标的宽度。
onOffBehavior 获取表明指定的 Microsoft® DirectAnimation® 行为是否正在运行的对象。
outerHTML 设置或获取对象及其内容的 HTML 形式。
outerText 设置或获取对象的文本。
ownerDocument 设置或获取结点关联的 document 对象。
parentElement 获取对象层次中的父对象。
parentNode 获取文档层次中的父对象。
parentTextEdit 获取文档层次中可用于创建包含原始对象的 TextRange 的容器对象。
previousSibling 获取对此对象的上一个兄弟对象的引用。
readyState 获取对象的当前状态。
readyState 获取表明对象当前状态的值。
recordNumber 获取数据集中生成对象的原始记录。
scopeName 获取为该元素定义的命名空间。
SCROLLING scrolling 设置或获取框架是否可被滚动。
SECURITY SECURITY 获取表明 frame 或 iframe 的源文件是否应用了特定的安全限制的值。
sourceIndex 获取对象在源序中的依次位置,即对象出现在 document 的 all 集合中的顺序。
SRC src 设置或获取要由对象装入的 URL。
STYLE 为该设置元素设置内嵌样式。
SYNCMASTER syncMaster 设置或获取时间容器是否必须在此元素上同步回放。
SYSTEMBITRATE 获取系统中大约可用带宽的 bps。
SYSTEMCAPTION 表明是否要显示文本来代替演示的的音频部分。
SYSTEMLANGUAGE 表明是否在用户计算机上的选项设置中选中了给定语言。
SYSTEMOVERDUBORSUBTITLE 指定针对那些正在观看演示但对被播放的音频所使用的语言并不熟悉的用户来说是否要渲染配音或字幕。
TABINDEX tabIndex 设置或获取定义对象的 Tab 顺序的索引。
tagName 获取对象的标签名称。
tagUrn 设置或获取在命名空间声明中指定的统一资源名称(URN)。
TIMECONTAINER timeContainer 设置或获取与元素关联的时间线类型。
TITLE title 设置或获取对象的咨询信息(工具提示)。
uniqueID 获取为对象自动生成的唯一标识符。
UNSELECTABLE 指定该元素不可被选中。
VSPACE vspace 设置或获取对象的垂直边距。
WIDTH width 设置或获取对象的宽度。
标签属性/属性
行为
行为 描述
clientCaps 提供关于 Internet Explorer 支持的特性的信息,以及提供即用即装的方法。
download 下载文件并在下载完成后通知一个指定的回调函数。
homePage 包含关于用户主页的信息。
time 为 HTML 元素提供一个活动的时间线。
time2 为 HTML 元素或一组元素提供一个活动的时间线。
集合
集合 描述
all 返回对象所包含的元素集合的引用。
attributes 获取对象标签属性的集合。
behaviorUrns 返回标识附加到该元素行为的统一资源名称(URN)字符串的集合。
childNodes 获取作为指定对象直接后代的 HTML 元素和 TextNode 对象的集合。
children 获取作为对象直接后代的 DHTML 对象的集合。
事件
事件 描述
onactivate 当对象设置为活动元素时触发。
onafterupdate 当成功更新数据源对象中的关联对象后在数据绑定对象上触发。
onbeforedeactivate 在 activeElement 从当前对象变为父文档其它对象之前立即触发。
onbeforeupdate 当成功更新数据源对象中的关联对象前在数据绑定对象上触发。
onblur 在对象失去输入焦点时触发。
oncontrolselect 当用户将要对该对象制作一个控件选中区时触发。
ondeactivate 当 activeElement 从当前对象变为父文档其它对象时触发。
onerrorupdate 更新数据源对象中的关联数据出错时在数据绑定对象上触发。
onfocus 当对象获得焦点时触发。
onload 在浏览器完成对象的装载后立即触发。
onmove 当对象移动时触发。
onmoveend 当对象停止移动时触发。
onmovestart 当对象开始移动时触发。
onreadystatechange 当对象状态变更时触发。
onresizeend 当用户更改完控件选中区中对象的尺寸时触发。
onresizestart 当用户开始更改控件选中区中对象的尺寸时触发。
ontimeerror 当特定时间错误发生时无条件触发,通常由将属性设置为无效值导致。
滤镜
滤镜属性 描述
Alpha 调整对象内容的不透明度。
AlphaImageLoader 在对象的边界和对象背景到内容之间显示图像,可选剪裁或缩放图像大小。当装入便携网络图像(PNG)时,从 0 到 100% 的 透明度都是支持的。
Barn 以开门或关门的运动方式显示对象的新内容。
BasicImage 调整对象内容的颜色处理、图像旋转或不透明度。
BlendTrans 以渐隐原始内容的形式显示对象的新内容。
Blinds 以打开或关闭盲点的运动方式显示对象的新内容。
Blur 模糊对象的内容以便使其看起来失去焦点。
CheckerBoard 以揭开覆盖在原始内容上的棋盘的形式显示对象的新内容。
Chroma 将对象内容的指定颜色显示为透明。
Compositor 以新旧内容逻辑颜色组合的形式显示对象的新内容。每个版本的颜色和 alpha 值都会被计算用来决定输出图像的最终颜色。
DropShadow 创建对象内容的实体阴影,偏移量位于指定方向。这将使得内容看起来是浮动的因此会产生阴影。
Emboss 使用灰度值对对象以浮雕纹理显示。
Engrave 使用灰度值对对象以雕刻纹理显示。
Fade 以渐隐原始内容的形式显示对象的新内容。
FlipH 以沿水平方向翻转的形式显示对象内容。
FlipV 以沿垂直方向翻转的形式显示对象内容。
Glow 在对象边缘外侧添加光晕以便使其看起来像发光的样子。
Gradient 在对象的背景和内容之间显示一个渐变色彩的表面。
GradientWipe 以在原有内容上覆盖渐变带的形式显示对象的新内容。
Gray 以灰度显示对象内容。
ICMFilter 根据图像颜色管理(ICM)配置文件转换对象的彩色内容。这将允许指定内容的显示效果得以改善,或者在打印机或监视器等硬件设备上模拟显示。
Inset 以对角线方向显示对象的新内容。
Invert 反转对象内容的色调、饱和度和亮度。
Iris 以彩虹效果显示对象的新内容,这与照相机光圈打开相似。
Light 在对象的内容上创建灯光效果。
MaskFilter 将对象内容的透明像素显示为彩色遮罩,将非透明像素显示为透明。
Matrix 使用矩阵变换缩放、旋转或显现对象的内容。
MotionBlur 以运动模糊的效果显示对象内容。
Pixelate 将对象的内容显示为彩色方块,其颜色取决于该方块所替代区域的平均颜色值。此滤镜显示可用于切换。
RadialWipe 以辐射状擦除的形式显现对象的新内容。
RandomBars 以随机像素线爆炸的形式显现对象的新内容。
RandomDissolve 以随机像素爆炸的形式显现对象的新内容。
Redirect 目前还不支持。
RevealTrans 使用 24 种预先定义的切换效果显现对象的新内容。
Shadow 创建对象内容的实体阴影,偏移量位于指定方向。这将创建阴影效果。
Slide 以图像滑行的形式显现对象的新内容。
Spiral 以螺旋运动的形式显现对象的新内容。
Stretch 以拉伸覆盖原始内容的形式显现对象的新内容。有一个选项类似立方体从一个表面转到另外一个表面。
Strips 以条形覆盖的形式显现对象的原始内容,好像有一把锯将原始内容锯开。
Wave 在对象的内容上执行垂直方向的正弦波扭曲。
Wheel 以旋转运动的形式显现对象的新内容,好像轮子滚过原始内容。
Xray 更改对象内容的颜色深度将其以黑白显示。
Zigzag 在对象上将对象的新内容进行来回移动以便覆盖原始内容。
方法
方法 描述
addBehavior 给元素附加一个行为。
appendChild 给对象追加一个子元素。
applyElement 使得元素成为其它元素的子元素或父元素。
attachEvent 将指定函数绑定到事件,以便每当该事件在对象上触发时都调用该函数。
blur 使元素失去焦点并触发 onblur 事件。
clearAttributes 从对象中删除全部标签属性和值。
cloneNode 从文档层次中复制对对象的引用。
componentFromPoint 通过特定事件返回对象在指定坐标下的位置。
contains 检查对象中是否包含给定元素。
detachEvent 从事件中取消指定函数的绑定,这样当事件触发时函数就不会收到通知了。
dragDrop 初始化拖曳事件。
fireEvent 触发对象的指定事件。
focus 使得元素得到焦点并执行由 onfocus 事件指定的代码。
getAdjacentText 返回邻接文本字符串。
getAttribute 获取指定标签属性的值。
getAttributeNode 获取由 attribute.name 属性引用的 attribute 对象。
getElementsByTagName 获取基于指定元素名称的对象集合。
getExpression 获取给定属性的表达式。
hasChildNodes 返回表明对象是否有子对象的值。
insertAdjacentElement 在指定位置插入元素。
insertAdjacentHTML 在指定位置的元素中插入给定的 HTML 文本。
insertAdjacentText 在指定位置插入给定的文本。
insertBefore 在文档层次中插入元素作为父对象的子结点。
mergeAttributes 复制所有读/写标签属性到指定元素。
normalize 合并邻接 TextNode 对象以便生成一个常规的文档对象模型。
removeAttribute 删除对象的给定标签属性。
removeAttributeNode 从对象中删除删除 attribute 对象。
removeBehavior 分离元素的行为。
removeChild 从元素上删除子结点。
removeExpression 从指定属性中删除表达式。
removeNode 从文档层次中删除对象。
replaceAdjacentText 替换元素的邻接文本。
replaceChild 用新的子元素替换已有的子元素。
replaceNode 用其它元素替换对象。
scrollIntoView 将对象滚动到可见范围内,将其排列到窗口顶部或底部。
setActive 设置对象为当前对象而不将对象置为焦点。
setAttribute 设置指定标签属性的值。
setAttributeNode 设置 attribute 对象为对象的一部分。
setExpression 设置指定对象的表达式。
swapNode 交换文档层次中两个对象的位置。
对象
对象 描述
runtimeStyle 代表了居于全局样式表、内嵌样式和 HTML 标签属性指定的格式和样式之上的对象的格式和样式。
style 代表了给定元素所有可能的内嵌样式的当前设置。
样式
样式标签属性 样式属性 描述
ACCELERATOR accelerator 设置或获取表明对象是否包含快捷键的字符串。
background-attachment backgroundAttachment 设置或获取背景图像如何附加到文档内的对象中。
background-color backgroundColor 设置或获取对象内容后的颜色。
background-position-x backgroundPositionX 设置或获取 backgroundPosition 属性的 x 坐标。
background-position-y backgroundPositionY 设置或获取 backgroundPosition 属性的 y 坐标。
behavior behavior 设置或获取 DHTML 行为的位置。
border-bottom borderBottom 设置或获取对象下边框的属性。
border-bottom-color borderBottomColor 设置或获取对象下边框的颜色。
border-bottom-style borderBottomStyle 设置或获取对象下边框的样式。
border-bottom-width borderBottomWidth 设置或获取对象下边框的宽度。
border-color borderColor 设置或获取对象的边框颜色。
border-left borderLeft 设置或获取对象左边框的属性。
border-left-color borderLeftColor 设置或获取对象左边框的颜色。
border-left-style borderLeftStyle 设置或获取对象左边框的样式。
border-left-width borderLeftWidth 设置或获取对象左边框的宽度。
border-right borderRight 设置或获取对象右边框的属性。
border-right-color borderRightColor 设置或获取对象右边框的颜色。
border-right-style borderRightStyle 设置或获取对象右边框的样式。
border-right-width borderRightWidth 设置或获取对象右边框的宽度。
border-style borderStyle 设置或获取对象上下左右边框的样式。
border-top borderTop 设置或获取对象上边框的属性。
border-top-color borderTopColor 设置或获取对象上边框的颜色。
border-top-style borderTopStyle 设置或获取对象上边框的样式。
border-top-width borderTopWidth 设置或获取对象上边框的宽度。
border-width borderWidth 设置或获取对象上下左右边框的宽度。
bottom bottom 设置或获取对象相对于文档层次中下个定位对象的底部的位置。
clear clear 设置或获取对象是否允许在其左侧、右侧或两边放置浮动对象,以防下段文本显示在浮动对象上。
clip clip 设置或获取定位对象的哪个部分可见。
cursor cursor 设置或获取当鼠标指针指向对象时所使用的鼠标指针。
display display 设置或获取对象是否要渲染。
filter filter 设置或获取应用于对象的滤镜或滤镜集合。
height height 设置或获取对象的高度。
layout-grid layoutGrid 设置或获取指定文本字符版面的组合文档格线属性。
layout-grid-mode layoutGridMode 设置或获取文本布局网格是否使用二维。
left left 设置或获取对象相对于文档层次中下个定位对象的左边界的位置。
margin margin 设置或获取对象的上下左右边距。
margin-bottom marginBottom 设置或获取对象的下边距宽度。
margin-left marginLeft 设置或获取对象的左边距宽度。
margin-right marginRight 设置或获取对象的右边距宽度。
margin-top marginTop 设置或获取对象的上边距宽度。
overflow-x overflowX 设置或获取当内容超出对象宽度时如何管理对象内容。
overflow-y overflowY 设置或获取当内容超出对象高度时如何管理对象内容。
pixelBottom 设置或获取对象的下方位置。
pixelHeight 设置或获取对象的高度。
pixelLeft 设置或获取对象的左侧位置。
pixelRight 设置或获取对象的右侧位置。
pixelTop 设置或获取对象的上方位置。
pixelWidth 设置或获取对象的宽度。
posBottom 设置或获取以 bottom 标签属性指定的单位的对象下方位置。
posHeight 设置或获取以 height 标签属性指定的单位的对象高度。
position position 设置或获取对象所使用的定位方式。
posLeft 设置或获取以 left 标签属性指定的单位的对象左侧位置。
posRight 设置或获取以 right 标签属性指定的单位的对象右侧位置。
posTop 设置或获取以 top 标签属性指定的单位的对象上方位置。
posWidth 设置或获取以 width 标签属性指定的单位的对象宽度。
right right 设置或获取对象相对于文档层次中下个已定位的对象的右边界的位置。
float styleFloat 设置或获取文本要绕排到对象的哪一侧。
text-autospace textAutospace 设置或获取自动留空和文本的窄空间宽度调整。
top top 设置或获取对象相对于文档层次中下个定位对象的上边界的位置。
visibility visibility 设置或获取对象的内容是否显示。
z-index zIndex 设置或获取定位对象的堆叠次序。
zoom zoom 设置或获取对象的放大比例。
注释
IFRAME 元素也就是文档中的文档,或者好像浮动的框架(FRAME)。frames 集合提供了对 IFRAME 内容的访问。请使用 frames 集合读写 IFRAME 内包含的元素。例如,如果要访问 iframe 内 body 对象的 backgroundColor 样式,语法应为:
sColor = document.frames("sFrameName").document.body.style.backgroundColor;
通过 iframe 对象所在页面的对象模型,你可以访问 iframe 对象的属性,但不能访问其内容。例如,访问 iframe 对象的 border 样式的语法应为:
sBorderValue = document.all.oFrame.style.border;
注意 iframe 的属性必须使用前缀 document.all 访问,例如 document.all.iframeId.marginWidth。
Internet Explorer 5.5 支持浮动框架的内容透明。如果想要为浮动框架定义透明内容,则必须满足下列条件。
与 IFRAME 元素一起使用的 ALLOWTRANSPARENCY 标签属性必须设置为 true。
在 IFRAME 内容源文档,background-color 或 BODY 元素的 BGCOLOR 标签属性必须设置为 transparent。
参看使用透明的浮动框架可以获得关于透明浮动框架更多的信息。
此元素在 Microsoft® Internet Explorer 4.0 的 HTML 和脚本中可用。
此元素是一个块元素。
此元素需要关闭标签。
示例
下面的例子使用了 IFRAME 元素创建了包含页面 sample.htm 的框架。
<IFRAME ID=IFrame1 FRAMEBORDER=0 SCROLLING=NO SRC="sample.htm"></IFRAME>
纯真IP数据库格式详解
2005/05/19编者语:
前几天看了Luma大哥写的一些关于LumaQQ的一些心得体会,现在自己也干起了写代码这一行当,也能够体会其中的各种滋味!
为什么要摘这一篇文章呢,主要是因为现在很多人都用有显IP功能的QQ版本,但又有多少人知道这显IP的功能从何而来呢!所以就为大家来说明一下吧!
———————————————————————————————————————————————–
摘要
网络上的IP数据库以纯真版的最为流行,LumaQQ也采用了纯真版IP数据库做为IP查询功能的基础。不过关于其格式的文档却非常之少,后来终于在网上找到了一份文档,得以了解其内幕,不过那份文档寥寥数语,也是颇为耐心才读明白。在这里我重写一份,以此做为LumaQQ开发者文档的一部分,我想还是必要的。本文详细介绍了纯真IP数据库的格式,并且给出了一些Demo以供参考。
Luma, 清华大学
修改日期: 2005/01/14
Note: 在此感谢纯真IP数据库作者金狐和那唯一一份文档的作者。
修改历史:
2005-01-14 修改了原来一些表达不清和错误的地方
———————————————————————————————————————————————–
自从有了IP数据库这种东西,QQ外挂的显示IP功能也随之而生,本人见识颇窄,是否还有其他应用不得而知,不过,IP数据库确实是个不错的东西。如今网络上最流行的IP数据库我想应该是纯真版的(说错了也不要扁我),迄今为止其IP记录条数已经接近30000,对于有些IP甚至能精确到楼层,不亦快哉。2004年4、5月间,正逢LumaQQ破土动工,为了加上这个人人都喜欢,但是好像人人都不知道为什么喜欢的显IP功能,我也采用了纯真版IP数据库,它的优点是记录多,查询速度快,它只用一个文件QQWry.dat就包含了所有记录,方便嵌入到其他程序中,也方便升级。
基本结构
QQWry.dat文件在结构上分为3块:文件头,记录区,索引区。一般我们要查找IP时,先在索引区查找记录偏移,然后再到记录区读出信息。由于记录区的记录是不定长的,所以直接在记录区中搜索是不可能的。由于记录数比较多,如果我们遍历索引区也会是有点慢的,一般来说,我们可以用二分查找法搜索索引区,其速度比遍历索引区快若干数量级。图1是QQWry.dat的文件结构图。
图1. QQWry.dat文件结构
要注意的是,QQWry.dat里面全部采用了little-endian字节序
一. 了解文件头
QQWry.dat的文件头只有8个字节,其结构非常简单,首四个字节是第一条索引的绝对偏移,后四个字节是最后一条索引的绝对偏移。
二. 了解记录区
每条IP记录都由国家和地区名组成,国家地区在这里并不是太确切,因为可能会查出来“清华大学计算机系”之类的,这里清华大学就成了国家名了,所以这个国家地区名和IP数据库制作的时候有关系。所以记录的格式有点像QName,有一个全局部分和局部部分组成,我们这里还是沿用国家名和地区名的说法。
于是我们想象着一条记录的格式应该是: [IP地址][国家名][地区名],当然,这个没有什么问题,但是这只是最简单的情况。很显然,国家名和地区名可能会有很多的重复,如果每条记录都保存一个完整的名称拷贝是非常不理想的,所以我们就需要重定向以节省空间。所以为了得到一个国家名或者地区名,我们就有了两个可能:第一就是直接的字符串表示的国家名,第二就是一个4字节的结构,第一个字节表明了重定向的模式,后面3个字节是国家名或者地区名的实际偏移位置。对于国家名来说,情况还可能更复杂些,因为这样的重定向最多可能有两次。
那么什么是重定向模式?根据上面所说,一条记录的格式是[IP地址][国家记录][地区记录],如果国家记录是重定向的话,那么地区记录是有可能没有的,于是就有了两种情况,我管他叫做模式1和模式2。我们对这些格式的情况举图说明:
图2. IP记录的最简单形式
图2表示了最简单的IP记录格式,我想没有什么可以解释的
图3. 重定向模式1
图3演示了重定向模式1的情况。我们看到在模式1的情况下,地区记录也跟着国家记录走了,在IP地址之后只剩下了国家记录的4字节,后面3个字节构成了一个指针,指向了实际的国家名,然后又跟着地址名。模式1的标识字节是0×01。
图4. 重定向模式2
图4演示了重定向模式2的情况。我们看到了在模式2的情况下(其标识字节是0×02),地区记录没有跟着国家记录走,因此在国家记录之后4个字节之后还是有地区记录。我想你已经明白了模式1和模式2的区别,即:模式1的国家记录后面不会再有地区记录,模式2的国家记录后会有地区记录。下面我们来看一下更复杂的情况。
图5. 混和情况1
图5演示了当国家记录为模式1的时候可能出现的更复杂情况,在这种情况下,重定向指向的位置仍然是个重定向,不过第二次重定向为模式2。大家不用担心,没有模式3了,这个重定向也最多只有两次,并且如果发生了第二次重定向,则其一定为模式2,而且这种情况只会发生在国家记录上,对于地区记录,模式1和模式2是一样的,地区记录也不会发生2次重定向。不过,这个图还可以更复杂,如图7:
图6. 混和情况2
图6是模式1下最复杂的混和情况,不过我想应该也很好理解,只不过地区记录也来重定向而已,有一点我要提醒你,如果重定向的地址是0,则表示未知的地区名。
所以我们总结如下:一条IP记录由[IP地址][国家记录][地区记录]组成,对于国家记录,可以有三种表示方式:字符串形式,重定向模式1和重定向模式2。对于地区记录,可以有两种表示方式:字符串形式和重定向,另外有一条规则:重定向模式1的国家记录后不能跟地区记录。按照这个总结,在这些方式中合理组合,就构成了IP记录的所有可能情况。
设计的理由
在我们继续去了解索引区的结构之前,我们先来了解一下为何记录区的结构要如此设计。我想你可能想到了答案:字符串重用。没错,在这种结构下,对于一个国家名和地区名,我只需要保存其一次就可以了。我们举例说明,为了表示方便,我们用小写字母代表IP记录,C表示国家名,A表示地区名:
有两条记录a(C1, A1), b(C2, A2),如果C1 = C2, A1 = A2,那么我们就可以使用图3显示的结构来实现重用
有三条记录a(C1, A1), b(C2, A2), c(C3, A3),如果C1 = C2, A2 = A3,现在我们想存储记录b,那么我们可以用图6的结构来实现重用
有两条记录a(C1, A1), b(C2, A2),如果C1 = C2,现在我们想存储记录b,那么我们可以采用模式2表示C2,用字符串表示A2
你可以举出更多的情况,你也会发现在这种结构下,不同的字符串只需要存储一次。
了解索引区
在"了解文件头"部分,我们说明了文件头实际上是两个指针,分别指向了第一条索引和最后一条索引的绝对偏移。如图8所示:
图8. 文件头指向索引区图示
实在是很简单,不是吗?从文件头你就可以定位到索引区,然后你就可以开始搜索IP了!每条索引长度为7个字节,前4个字节是起始IP地址,后三个字节就指向了IP记录。这里有些概念需要说明一下,什么是起始IP,那么有没有结束IP? 假设有这么一条记录:166.111.0.0 – 166.111.255.255,那么166.111.0.0就是起始IP,166.111.255.255就是结束IP,结束IP就是IP记录中的那头4个字节,这下你应该就清楚了吧。于是乎,每条索引配合一条记录,构成了一个IP范围,如果你要查找166.111.138.138所在的位置,你就会发现166.111.138.138落在了166.111.0.0 – 166.111.255.255 这个范围内,那么你就可以顺着这条索引去读取国家和地区名了。那么我们给出一个最详细的图解吧:
图9. 文件详细结构
现在一切都清楚了是不是?也许还有一点你不清楚,QQWry.dat的版本信息存在哪里呢? 答案是:最后一条IP记录实际上就是版本信息,最后一条记录显示出来就是这样:255.255.255.0 255.255.255.255 纯真网络 2004年6月25日IP数据。OK,到现在你应该全部清楚了。
Demo
下一步:我给出一个读取IP记录的程序片断,此片断摘录自LumaQQ源文件edu.tsinghua.lumaqq.IPSeeker.java,如果你有兴趣,可以下载源代码详细看看。
/**
* 给定一个ip国家地区记录的偏移,返回一个IPLocation结构
* @param offset 国家记录的起始偏移
* @return IPLocation对象
*/
private IPLocation getIPLocation(long offset) {
try {
// 跳过4字节ip
ipFile.seek(offset + 4);
// 读取第一个字节判断是否标志字节
byte b = ipFile.readByte();
if(b == REDIRECT_MODE_1) {
// 读取国家偏移
long countryOffset = readLong3();
// 跳转至偏移处
ipFile.seek(countryOffset);
// 再检查一次标志字节,因为这个时候这个地方仍然可能是个重定向
b = ipFile.readByte();
if(b == REDIRECT_MODE_2) {
loc.country = readString(readLong3());
ipFile.seek(countryOffset + 4);
} else
loc.country = readString(countryOffset);
// 读取地区标志
loc.area = readArea(ipFile.getFilePointer());
} else if(b == REDIRECT_MODE_2) {
loc.country = readString(readLong3());
loc.area = readArea(offset + 8);
} else {
loc.country = readString(ipFile.getFilePointer() – 1);
loc.area = readArea(ipFile.getFilePointer());
}
return loc;
} catch (IOException e) {
return null;
}
}
/**
* 从offset偏移开始解析后面的字节,读出一个地区名
* @param offset 地区记录的起始偏移
* @return 地区名字符串
* @throws IOException 地区名字符串
*/
private String readArea(long offset) throws IOException {
ipFile.seek(offset);
byte b = ipFile.readByte();
if(b == REDIRECT_MODE_1 || b == REDIRECT_MODE_2) {
long areaOffset = readLong3(offset + 1);
if(areaOffset == 0)
return LumaQQ.getString("unknown.area");
else
return readString(areaOffset);
} else
return readString(offset);
}
/**
* 从offset位置读取3个字节为一个long,因为java为big-endian格式,所以没办法
* 用了这么一个函数来做转换
* @param offset 整数的起始偏移
* @return 读取的long值,返回-1表示读取文件失败
*/
private long readLong3(long offset) {
long ret = 0;
try {
ipFile.seek(offset);
ipFile.readFully(b3);
ret |= (b3[0] & 0xFF);
ret |= ((b3[1] <<
& 0xFF00);
ret |= ((b3[2] << 16) & 0xFF0000);
return ret;
} catch (IOException e) {
return -1;
}
}
/**
* 从当前位置读取3个字节转换成long
* @return 读取的long值,返回-1表示读取文件失败
*/
private long readLong3() {
long ret = 0;
try {
ipFile.readFully(b3);
ret |= (b3[0] & 0xFF);
ret |= ((b3[1] <<
& 0xFF00);
ret |= ((b3[2] << 16) & 0xFF0000);
return ret;
} catch (IOException e) {
return -1;
}
}
/**
* 从offset偏移处读取一个以0结束的字符串
* @param offset 字符串起始偏移
* @return 读取的字符串,出错返回空字符串
*/
private String readString(long offset) {
try {
ipFile.seek(offset);
int i;
for(i = 0, buf[i] = ipFile.readByte(); buf[i] != 0; buf[++i] = ipFile.readByte());
if(i != 0)
return Utils.getString(buf, 0, i, "GBK");
} catch (IOException e) {
log.error(e.getMessage());
}
return "";
}
代码并不复杂,getIPLocation是主要方法,它检查国家记录格式,并针对字符串形式,模式1,模式2采用不同的代码,readArea则相对简单,因为只有字符串和重定向两种情况需要处理。
总结
纯真IP数据库的结构使得查找IP简单迅速,不过你想要编辑它却是比较麻烦的,我想应该需要专门的工具来生成QQWry.dat文件,由于其文件格式的限制,你要直接添加IP记录就不容易了。不过,能查到IP已经很开心了,希望纯真记录越来越多~。
[转贴]关于珊瑚虫4.0,LUMAQQ作者如是说,[15时最新]
2005/05/19[转贴]关于珊瑚虫4.0,LUMAQQ作者如是说,[15时最新]
以下内容转自LUMAQQ作者blog,是LUMAQQ作者15号中午所写。借此纠正一个错误,来自LUMAQQ blog的并不都是LUMAQQ作者所写,在日志下面会有By luma
的字样才是,如果是
By henryheyi
那就是本人了,呵呵
QUOTE:
呃~,我这人就爱搬弄是非,自从如来神掌被我搬弄出来,大家就跟着我搬弄是非了,珊瑚虫4.0的广告出炉后,是非更至极峰。
soff也有感无知的人太多,授权我透露点内幕,把这群民之口,填个严实,免得整天意淫,浪费了青春。
回顾历史方能展望未来,先来纠正一个荒唐的事情吧: 很多人都用珊瑚虫,可是很多人居然不知道作者是谁,以至于Quaful发布那个充满激情的广告的时候,还被很多人怀疑其身份。记住了,珊瑚虫4.0之前的作者有三个:cygwin, soff, Quaful。至于更细节的情况,我就不罗嗦了,你就把他们看成是圣父圣子圣灵三位一体吧。4.0之后呢?你要加上我也行,但是实际情况比这要复杂一点,等会再说。
在4.0之前,coral是没有涉及到QQ协议层的,这就是4.0强的地方。为什么现在有时候显示不了ip,但是却说4.0可以解决有时候无法显示ip的问题? 显然,如果不深入到协议层,那么服务器不给你IP,你是没办法得到的,深入到协议层那就不一样了,服务器不给我,我可以主动去请求。如来神掌,虽然现在显隐身对高版本无效了,但是显示IP还是不错的。好,记住第二个事实,4.0深入到了协议层,玩票就要玩大的~
soff他们是不太研究QQ协议的,那我这里有现成的,自然就是合作的基础了。但是LumaQQ是Java写的,珊瑚虫是用不了的,他们需要移植到C++,当然不是移植全部,移植的是LumaQQ核心层,这个艰苦的工作是勤劳的Quaful用吐血完成的。那么我说一点技术上的事:为什么Quaful要吐血才能完成。Oops,因为LumaQQ的核心层使用了NIO框架,这个在C++标准库里面是没有对应的东西的,所以,Quaful要自己写这部分,难以不吐血哈。不过,是否有第三方的库,我就不知道了,Quaful对于C++肯定比我熟,他既然都自己写了,估计是没有吧。
那我干什么呢,我倒是没干什么具体的事情,主要就是帮助Quaful理解LumaQQ的核心层架构,也许可以加个顾问的头衔。但是Quaful把我当作共同开发的人,因为4.0里面有一个LumaQQ的C++版本核心,怀着感恩的心情,我接受了Quaful给我的荣耀。不过,核心层不是我一个人完成的,notXX也曾经为核心层提供过原始的代码,所以4.0发布的时候,作者可能会写成5个人:cygwin, soff, Quaful, luma, notXX。
那么,我画个简单的流程,说明一下珊瑚虫的工作方式有了如何的革命性改变:
1. 4.0之前
外挂 腾讯QQ 网络
2. 4.0
腾讯QQ和其他插件 外挂 网络
啊哈,区别很明显,效果很不同!4.0之前,外挂是一个腾讯的附属品,腾讯从网络得到什么,外挂就只能用什么。4.0开始,外挂要主宰世界,外挂从网络得到什么,腾讯就用什么~。同时呢,外挂还能把得到的东西传给插件,这不就支持无限创意了嘛。
那么,我曾经说过的,LumaQQ的如来神掌不能探测2005了,但是4.0可以,why?嗯,这个我还是不详细解释了,有头脑的人自己去理解吧。
基于以上共识,我来纠正一下第二个荒唐的说法:如来神掌被soff否定成观音神掌了,Quaful的努力白费了。这简直就是欠扁,不仅是小看了Quaful,也是小看了我啊。如来神掌只不过是QQ协议的一个具体应用,相对于Quaful的努力来说,只是九牛之一毛,你们这帮人啊,以为LumaQQ的核心层只能处理如来神掌啊?
观音神掌,是挺难听的,真的挺难听,我这里也建议soff能换个名字,从技术的角度上说,观音神掌和如来神掌没有区别,干脆叫如来神掌第二式算了。soff怕反隐身惹来麻烦,嗯,既然这样,那是否把4.0搞成插件式的恐怕也得考虑一下,不然这样的插件肯定有人很快写出来。
内幕够多了的吧,你看我又做开发又做狗仔队,辛苦哈…
天网防火墙最新版(龙族天山童老退出前的最后一个作品)
2005/05/16公司的一个数据库被人清空了!
2005/05/16今天早上上班,打开电脑的第一件事情就是看公司的主页,因为这是我们几个人的心血啊!
但是突然同事就说了一句,首页下面的数据没有了!
我们一齐看了一下,果然是都没有了!我们感觉事情不妙,然后就登录了FTP上去把数据库下载回来看了,数据库里面的数据果然是被清空了,简直晕死了,好几周的心血啊!
后来据我们猜测,应该是我们公司上一周辞退的那几个人中的一个干的!
吸取教训,每天都一定要备份一次数据![evil]
在做Web项目的时候,可能有大部分时间都花在对数据库的添加、修改、删除上。做过ASP.net人都知道DataGrid控件,只需要少量代码就可以对一个数据表进行显示、修改、删除操作。
基本模仿了DataGrid的功能,只需新建一个页面,再引用DataGrid控件,再设置几行代码,就可对任意一个数据库表进行显示、分页显示、添加、修改、删除。并且支持在对多个表联合查询的时候,修改主表中的数据。整个过程只需要几分钟。
控件主要功能:
1.快速显示数据:只需设置几个参数,就可以在新的页面中显示一个数据库表,并且有多种样式可以选择。
2.分页功能:可选功能。
3.添加、修改、删除数据:可选功能。能自动实现这三种方法。
4.多种样式可选:提供多种DataGrid样式。
控件主要功能:
1.快速显示数据:只需设置几个参数,就可以在新的页面中显示一个数据库表,并且有多种样式可以选择。
2.分页功能:可选功能。
3.添加、修改、删除数据:可选功能。能自动实现这三种方法。
4.多种样式可选:提供多种DataGrid样式。
演示:
1.将DataGrid.asp以及数据库连接conn.asp放到Web工程的目录下
2.新建一个computer.asp页面,新建一个数据库test.mdb,添加一个computer表
3.编辑Computer.asp
4.这时DataGrid就设置好了,下面运行computer.asp
4.1初始界面
4.2添加数据
4.3编辑数据
4.4更改样式 (strStyleType=2)
4.5分页(IsPagination=1 ; PageSize=2)
4.6关掉数据编辑功能(IsEdit=0)
5.以上是对单表操作的例子,DataGrid.asp还支持主从表的显示,及对主表数据进行修改.下图是一个主从查询的例子,其中类别为从表,可以用combox显示数据,并选择.
点击下载此文件
