Ajax getjson 跨域通信 php+jquery
网站A的表单提交部分:
网站B的输出json部分:
$_GET[‘jsoncallback’] . ‘(‘ . json_encode($return) . ‘)‘);
?>
By admin
read more网站A的表单提交部分:
网站B的输出json部分:
$_GET[‘jsoncallback’] . ‘(‘ . json_encode($return) . ‘)‘);
?>
By admin
read more随着 web 发展,前端应用变得越来越复杂,基于后端的 javascript(Node.js) 也开始崭露头角,此时 javascript 被寄予了更大的期望,与此同时 javascript MVC 思想也开始流行起来。javascript 模板引擎作为数据与界面分离工作中最重要一环,越来越受开发者关注,近一年来在开源社区中更是百花齐放,在 Twitter、淘宝网、新浪微博、腾讯QQ空间、腾讯微博等大型网站中均能看到它们的身影。
本文将用最简单的示例代码描述现有的 javascript 模板引擎的原理,包括新一代 javascript 模板引擎 artTemplate 的特性实现原理,欢迎共同探讨。
artTemplate 是新一代 javascript 模板引擎,它采用预编译方式让性能有了质的飞跃,并且充分利用 javascript 引擎特性,使得其性能无论在前端还是后端都有极其出色的表现。在 chrome 下渲染效率测试中分别是知名引擎 Mustache 与 micro tmpl 的 25 、 32 倍。
除了性能优势外,调试功能也值得一提。模板调试器可以精确定位到引发渲染错误的模板语句,解决了编写模板过程中无法调试的痛苦,让开发变得高效,也避免了因为单个模板出错导致整个应用崩溃的情况发生。
artTemplate 这一切都在 1.7kb(gzip) 中实现!
虽然每个引擎从模板语法、语法解析、变量赋值、字符串拼接的实现方式各有所不同,但关键的渲染原理仍然是动态执行 javascript 字符串。
关于动态执行 javascript 字符串,本文以一段模板代码举例:
这是一段非常朴素的模板写法,其中,”” 为 closeTag (逻辑语句闭合标签),若 openTag 后面紧跟 “=” 则会输出变量的内容。
HTML语句与变量输出语句被直接输出,解析后的字符串类似:
语法分析完毕一般还会返回渲染方法:
渲染测试:
在上面 render 方法中,模板变量赋值采用了 with 语句,字符串拼接采用数组的 push 方法以提升在 IE6、7 下的性能,jQuery 作者 john 开发的微型模板引擎 tmpl 是这种方式的典型代表,参见: http://ejohn.org/blog/javascript-micro-templating/
By admin
read more现在大型的网站实现的lbs服务基本上是用mongodb的实现定位的(gps不太清楚)。对于小的应用来说,有些大材小用了,而且还大大增加了维护成本。这里用mysql来实现lbs的功能。
以下是从“知乎”网上的一篇文章()。
数据库设计层面,有两个方案
(1)字段主要包括 userId,lat,lng。分别代表用户ID、最近一次 Checkin 的经度、纬度。 lat/lng 建立复合索引。
然后通过手机的定位,得到自己的位置,比如记为 myLat,myLng。 代码如下,先做一个计算,算出 1km 所对应的经纬度范围: **double range = 180 / Math.PI * 1 / 6372.797; **//里面的 1 就代表搜索 1km 之内,单位km double lngR = range / Math.cos(myLat * Math.PI / 180.0); double maxLat = myLat + range; double minLat = myLat – range; double maxLng = myLng + lngR; double minLng = myLng – lngR;
然后执行 SQL : SELECT * FROM checkinTable WHERE ((lat BETWEEN ? AND ?) AND (lng BETWEEN ? AND ?)) 这四个问号,分别代入变量 minLat、maxLat、minLng、maxLng
By admin
read more如题:用jquery form提交表单,用jquery validate做数据验证 ,现在的问题是分别使用validate有作用,一起使用,则validate不起作用,谁遇到过帮忙解决下。
$(document).ready(function() {
$(“#inputForm”).validate({
…
});
});
function onsubmit(){
var options ={
…
};
$(‘#inputForm’).ajaxSubmit(options); //options
return false;
}
==================
补充一下,这个submitHandler:function(){}方法内可以写任何方法。但最后要有一个form.submit或form.ajaxSubmit 比如我这个
$(document).ready(function(){
$(“#loginForm”).validate({
rules: {
shouJiHaoMa: {
required: true,
digits: true
},
pwd: {
required: true
}
},
messages: {
shouJiHaoMa: {
required: ‘请输入手机号码’,
digits: ‘请输入正确的手机号码’
},
pwd: {
required: ‘请输入密码’
}
},
// specifying a submitHandler prevents the default submit, good for the demo
submitHandler: function() {
login();
return false;
},
errorElement: “em”,
success: function(label) {
label.text(” “) //清空错误提示消息
By admin
read more1、node.js安装
在Windows平台部署Node.js比较容易,从0.6.1开始,Node.js在Windows平台上可直接通过.mis文件安装。
下载地址 http://nodejs.org/#download 目前最新版本是 node-v0.8.3-x86.msi
文件在安装过程中已经指定了默认安装路径。
验证node.js 安装是否成功
打开cmd,直接输入node -v
2.npm安装
node安装成功后npm已经默认安装,npm可以直接安装相关扩展
验证npm是否安装成功
打开cmd,直接输入npm**** -v
3.express安装
打开cmd,直接输入npm install -g express
-g:在当前目录下安装express框架
验证express是否安装成功
安装完成后,关闭cmd,在重新打开
进入cmd,直接输入express -V
注意我这里用的大写V
4.用express创建项目
1).cmd进入要创建项目的目录,直接输入 express testapp(项目名称)
2)cd testapp //进入刚新建的站点目录
3)cmd app //再次进入刚创建的项目 输入npm install
完后你会发现你站点目录(这里为c:\documetns and settings\Administrator)下多了 node_modules,这个目录就是扩展库文件
express本来默认提供的引擎是jade模板引擎,它颠覆了传统的模板引擎,制定了一套完整的语法用来生产HTML的每个标签,功能强大但是不易学习,所以使用ejs模板,语法与asp、jsp和php一样,易于学习。如果要换模板引擎的话,可以通过编辑 package.json 来实现
现在cmd到项目目录下运行node app.js****
打开浏览器 http://127.0.0.1:3000/就可以访问了,到此环境搭建完成,开始新的旅程吧。
下一步我们选择开发IDE工具,这里选用webstorm.教程见:
======================================================
想看文档教程神马的,请到官网:
Express的源码托管在这里:
https://github.com/visionmedia/express
Express使用了Connect中间件,Connect的文档在这里:
http://senchalabs.github.com/connect/
如果你想做单元测试,可以看看TDD框架Expresso:
http://visionmedia.github.com/expresso/
Express可选的Jade模板引擎也挺有趣的,它和haml是亲戚,像是个HTML预编译器:
说到haml,你也可以了解下sass,它像一个CSS预编译器:
https://github.com/visionmedia/sass.js
不过同类产品中,我更喜欢不那么激进的less:
https://github.com/cloudhead/less.js
汗~我严重跑题了,本来只想简单介绍下Express的。
最后,node.js是以上各种玩意儿跑起来的前提:
By admin
read moreinode 是一个重要概念,是理解Unix/Linux文件系统和硬盘储存的基础。
我觉得,理解inode,不仅有助于提高系统操作水平,还有助于体会Unix设计哲学,即如何把底层的复杂性抽象成一个简单概念,从而大大简化用户接口。
下面就是我的inode学习笔记,尽量保持简单。
===================================
理解inode
作者:阮一峰
一、inode是什么?
理解inode,要从文件储存说起。
文件储存在硬盘上,硬盘的最小存储单位叫做”扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)。
操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个”块”(block)。这种由多个扇区组成的”块”,是文件存取的最小单位。”块”的大小,最常见的是4KB,即连续八个 sector组成一个 block。
文件数据都储存在”块”中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为”索引节点”。
每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。
二、inode的内容
inode包含文件的元信息,具体来说有以下内容:
* 文件的字节数
文件拥有者的User ID
文件的Group ID
文件的读、写、执行权限
文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
链接数,即有多少文件名指向这个inode
文件数据block的位置
可以用stat命令,查看某个文件的inode信息:
stat example.txt
总之,除了文件名以外的所有文件信息,都存在inode之中。至于为什么没有文件名,下文会有详细解释。
三、inode的大小
inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。
每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。
查看每个硬盘分区的inode总数和已经使用的数量,可以使用df命令。
df -i
查看每个inode节点的大小,可以用如下命令:
sudo dumpe2fs -h /dev/hda | grep “Inode size”
由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。
四、inode号码
每个inode都有一个号码,操作系统用inode号码来识别不同的文件。
这里值得重复一遍,Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。
表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。
使用ls -i命令,可以看到文件名对应的inode号码:
ls -i example.txt
五、目录文件
Unix/Linux系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件。
By admin
read more【TechTarget中国原创】如果您接手了一个 MySQL 生产系统,但不确定它是否运行了MySQL备份策略,这时需要做哪些保障措施呢?在实施备份策略之前,一定要明确数据规模和存储引擎使用等先决条件。这会对系统在备份过程中的可用性产生直接影响。
在本文中,我们将介绍用于确定最小备份功能所需要的方法,其中包括:
MySQL备份方法
备份MySQL环境的策略有很多,这些策略与MySQL拓扑的服务器数量相关,有许多开源和商业工具可以执行备份操作。
假设目前您有一个单服务器环境,希望创建一个统一备份,那么您现在可以在所有MySQL环境中采用两种备份方法。第一种方法是停止MySQL实例,然后对整个文件系统执行冷备份。这样会让系统在特定时间段变成不可用状态,而且您必须确保复制了所有信息,其中包括MySQL数据、事务与二进制日志文件(如果有的话)和MySQL的当前配置。
第二种方法是使用MySQL标准安装所包含的客户端工具。使用mysqldump命令,可以在不停止MySQL实例的前提下创建一个统一的MySQL备份。然而,在运行mysqldump之前,必须考虑几个重要问题,才能够选择最佳的备份方法。
确定数据库大小
执行MySQL备份需要考虑的一个重要问题是备份到本地磁盘的备份文件大小。这要求您准备足够存储备份文件的磁盘空间。
运行下面的 SQL语句,可以获得当前数据与索引的总大小(单位为MB):
SELECT round(sum(data_length+index_length)/1024/1024) AS total_mb, round(sum(data_length)/1024/1024) AS data_mb, round(sum(index_length)/1024/1024) AS index_mb FROM INFORMATION_SCHEMA.tables;
mysqldump备份大小大约为总数量加上10%~15%的预留量。这里并不存在精确计算大小的方法;然而,备份会生成以文本方式保存的数据。例如,数据库中4字节的整数可能会在mysqldump备份文件中占10个字符大小。在备份过程中,也可以同时压缩备份文件,或者将它传输到其他网络设备上。
运行这个SQL语句,得到的数据库数据大小为847MB。作为将来的参考,这里使用常用默认设置运行mysqldump,得到的备份文件大小为818MB。
选择锁策略
所选择的锁策略将确定应用程序是否可以在备份过程中执行数据库写操作。默认情况下,mysqldump会使用LOCK TABLES命令执行表一级的锁,以保证所有数据的统一性。这个命令由命令行选项–lock-tables指定,但是它默认是未启用的。这个选项属于默认启用的选项–opt。您可以选择不锁定表;然而,它还不足以保证实现统一的备份。在使用MyISAM存储引擎时,必须使用–lock-tables,才能保证实现统一的备份。
此外,mysqldump还提供了–single-transaction选项,它可以在一个事务中创建所有表的统一快照。这个选项只适用于支持多版本存储的存储引擎。InnoDB是唯一默认包含的存储引擎。
SELECT table_schema, engine, COUNT(*) AS tables FROM information_schema.tables WHERE table_schema NOT IN (‘INFORMATION_SCHEMA’, ‘PERFORMANGE_SCHEMA’) GROUP BY table_schema, engine ORDER BY 3 DESC;
MySQL安装环境也同样适用,指定这个选项会自动关闭–lock-tables。
执行面的SQL语句,可以确定MySQL实例所使用的存储引擎:
在这个例子中,MySQL实例拥有多个不同的模式,它们支持各种不同的功能,其中包括购物车、新闻邮件和管理工具。一个全InnoDB应用程序的模式可能像下面这样:
从上面可以看出,mysql元模式使用MyISAM。这个实例的存储引擎不能修改。如果数据库采用全InnoDB引擎,那么您有两个与备份MyISAM mysql表相关的方法。
执行时间
最重要的一点是确定备份所需要的时间。没有任何方法可以精确计算出备份时间。数据库大小、系统RAM数量、所使用的存储引擎、MySQL配置、硬盘速度和当前负载都会影响计算结果。在执行备份时,一定要收集这些信息,以备将来使用。执行时间很重要,因为这是数据库的有效维护时间窗口。在数据库备份过程中,应用程序的功能可能会受到影响,备份过程可能会产生性能过载,而且备份可能会影响其他的操作,其中包括批处理或软件维护。
汇总信息
SELECT table_schema, engine, ROUND(SUM(data_length)/1024/1024) AS total_mb, ROUND(SUM(data_length)/1024/1024) AS index_mb, COUNT(*) AS tables FROM information_schema.tables GROUP BY table_schema,engine ORDER BY 3 DESC;
By admin
read more今天丁原问我mysql执行计划中的key_len是怎么计算得到的,当时还没有注意,在高性能的那本书讲到过这个值的计算,但是自己看执行计划的时候一直都没有太在意这个值,更不用说深讨这个值的计算了:
ken_len表示索引使用的字节数,根据这个值,就可以判断索引使用情况,特别是在组合索引的时候,判断所有的索引字段都被查询用到。
在查看官方文档的时候,也没有发现详细的key_len的计算介绍,后来做了一些测试,在咨询了丁奇关于变长数据类型的值计算的时候,突然想到innodb 行的格式,在这里的计算中有点类似,总结一下需要考虑到以下一些情况:(1).索引字段的附加信息:可以分为变长和定长数据类型讨论 当索引字段为定长数据类型,比如char,int,datetime,需要有是否为空的标记,这个标记需要占用1个字节; 对于变长数据类型,比如:varchar,除了是否为空的标记外,还需要有长度信息,需要占用2个字节;
(备注:当字段定义为非空的时候,是否为空的标记将不占用字节)
(2).同时还需要考虑表所使用的字符集,不同的字符集,gbk编码的为一个字符2个字节,utf8编码的一个字符3个字节;
先看定长数据类型的一个例子(编码为gbk):
root@test 07:32:39>create table test_char(id int not null ,name_1 char(20),name_2 char(20),
-> primary key(id),key ind_name(name_1,name_2))engine=innodb charset=gbk;
root@test 07:33:55>insert into test_char values(1,’xuancan’,’taobaodba’);
root@test 07:34:55>explain select * from test_char where name_1=’xuancan’\G;
*********\* 1. row **********
id: 1
select_type: SIMPLE
table: test_char
type: ref
possible_keys: ind_name
key: ind_name
key_len: 41
ref: const
rows: 1
Extra: Using where; Using index
key_len=41=20*2+1(备注:由于name_1为空,isnull的标记被打上,需要计算1个字节)
root@test 07:35:31>explain select * from test_char where name_1=’xuancan’ and name_2=’taobaodba’\G;
By admin
read more由于MySQL数据库是基于行(Row)存储的数据库,而数据库操作 IO 的时候是以 page(block)的方式,也就是说,如果我们每条记录所占用的空间量减小,就会使每个page中可存放的数据行数增大,那么每次 IO 可访问的行数也就增多了。反过来说,处理相同行数的数据,需要访问的 page 就会减少,也就是 IO 操作次数降低,直接提升性能。此外,由于我们的内存是有限的,增加每个page中存放的数据行数,就等于增加每个内存块的缓存数据量,同时还会提升内存换中数据命中的几率,也就是缓存命中率。
** 数据类型选择**
数据库操作中最为耗时的操作就是 IO 处理,大部分数据库操作 90% 以上的时间都花在了 IO 读写上面。所以尽可能减少 IO 读写量,可以在很大程度上提高数据库操作的性能。
我们无法改变数据库中需要存储的数据,但是我们可以在这些数据的存储方式方面花一些心思。下面的这些关于字段类型的优化建议主要适用于记录条数较多,数据量较大的场景,因为精细化的数据类型设置可能带来维护成本的提高,过度优化也可能会带来其他的问题:
1、数字类型:非万不得已不要使用DOUBLE,不仅仅只是存储长度的问题,同时还会存在精确性的问题。同样,固定精度的小数,也不建议使用DECIMAL,建议乘以固定倍数转换成整数存储,可以大大节省存储空间,且不会带来任何附加维护成本。对于整数的存储,在数据量较大的情况下,建议区分开 TINYINT / INT / BIGINT 的选择,因为三者所占用的存储空间也有很大的差别,能确定不会使用负数的字段,建议添加unsigned定义。当然,如果数据量较小的数据库,也可以不用严格区分三个整数类型。
2、字符类型:非万不得已不要使用 TEXT 数据类型,其处理方式决定了他的性能要低于char或者是varchar类型的处理。定长字段,建议使用 CHAR 类型,不定长字段尽量使用 VARCHAR,且仅仅设定适当的最大长度,而不是非常随意的给一个很大的最大长度限定,因为不同的长度范围,MySQL也会有不一样的存储处理。
3、时间类型:尽量使用TIMESTAMP类型,因为其存储空间只需要 DATETIME 类型的一半。对于只需要精确到某一天的数据类型,建议使用DATE类型,因为他的存储空间只需要3个字节,比TIMESTAMP还少。不建议通过INT类型类存储一个unix timestamp 的值,因为这太不直观,会给维护带来不必要的麻烦,同时还不会带来任何好处。
4、ENUM & SET:对于状态字段,可以尝试使用 ENUM 来存放,因为可以极大的降低存储空间,而且即使需要增加新的类型,只要增加于末尾,修改结构也不需要重建表数据。如果是存放可预先定义的属性数据呢?可以尝试使用SET类型,即使存在多种属性,同样可以游刃有余,同时还可以节省不小的存储空间。
5、LOB类型:强烈反对在数据库中存放 LOB 类型数据,虽然数据库提供了这样的功能,但这不是他所擅长的,我们更应该让合适的工具做他擅长的事情,才能将其发挥到极致。在数据库中存储 LOB 数据就像让一个多年前在学校学过一点Java的营销专业人员来写 Java 代码一样。
** 字符编码**
字符集直接决定了数据在MySQL中的存储编码方式,由于同样的内容使用不同字符集表示所占用的空间大小会有较大的差异,所以通过使用合适的字符集,可以帮助我们尽可能减少数据量,进而减少IO操作次数。
1、纯拉丁字符能表示的内容,没必要选择 latin1 之外的其他字符编码,因为这会节省大量的存储空间。
2、如果我们可以确定不需要存放多种语言,就没必要非得使用UTF8或者其他UNICODE字符类型,这回造成大量的存储空间浪费。
3、MySQL的数据类型可以精确到字段,所以当我们需要大型数据库中存放多字节数据的时候,可以通过对不同表不同字段使用不同的数据类型来较大程度减小数据存储量,进而降低 IO 操作次数并提高缓存命中率。
** 适当拆分**
有些时候,我们可能会希望将一个完整的对象对应于一张数据库表,这对于应用程序开发来说是很有好的,但是有些时候可能会在性能上带来较大的问题。
当我们的表中存在类似于 TEXT 或者是很大的 VARCHAR类型的大字段的时候,如果我们大部分访问这张表的时候都不需要这个字段,我们就该义无反顾的将其拆分到另外的独立表中,以减少常用数据所占用的存储空间。这样做的一个明显好处就是每个数据块中可以存储的数据条数可以大大增加,既减少物理 IO 次数,也能大大提高内存中的缓存命中率。
By admin
read more摘要
本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论。
文章主要内容分为三个部分。
第一部分主要从数据结构及算法理论层面讨论MySQL数据库索引的数理基础。
第二部分结合MySQL数据库中MyISAM和InnoDB数据存储引擎中索引的架构实现讨论聚集索引、非聚集索引及覆盖索引等话题。
第三部分根据上面的理论基础,讨论MySQL中高性能使用索引的策略。
数据结构及算法基础
索引的本质
MySQL官方对索引的定义为:**索引(Index)是帮助MySQL高效获取数据的数据结构。**提取句子主干,就可以得到索引的本质:索引是数据结构。
我们知道,数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法当然是 顺序查找(linear search),这种复杂度为 O(n) 的算法在数据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优秀的查找算法,例如 二分查找(binary search)、 二叉树查找(binary tree search)等。如果稍微分析一下会发现,每种查找算法都只能应用于特定的数据结构之上,例如二分查找要求被检索数据有序,而二叉树查找只能应用于二叉查找树上,但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不可能同时将两列都按顺序进行组织),所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。
看一个例子:
图1
图1展示了一种可能的索引方式。左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址(注意逻辑上相邻的记录在磁盘上也并不是一定物理相邻的)。为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找在O(log2n)的复杂度内获取到相应数据。
虽然这是一个货真价实的索引,但是实际的数据库系统几乎没有使用二叉查找树或其进化品种 红黑树(red-black tree)实现的,原因会在下文介绍。
B-Tree和B+Tree
目前大部分数据库系统及文件系统都采用B-Tree或其变种B+Tree作为索引结构,在本文的下一节会结合存储器原理及计算机存取原理讨论为什么B-Tree和B+Tree在被如此广泛用于索引,这一节先单纯从数据结构角度描述它们。
B-Tree
为了描述B-Tree,首先定义一条数据记录为一个二元组[key, data],key为记录的键值,对于不同数据记录,key是互不相同的;data为数据记录除key外的数据。那么B-Tree是满足下列条件的数据结构:
d为大于1的一个正整数,称为B-Tree的度。
h为一个正整数,称为B-Tree的高度。
每个非叶子节点由n-1个key和n个指针组成,其中d<=n<=2d。
每个叶子节点最少包含一个key和两个指针,最多包含2d-1个key和2d个指针,叶节点的指针均为null 。
所有叶节点具有相同的深度,等于树高h。
key和指针互相间隔,节点两端是指针。
一个节点中的key从左到右非递减排列。
所有节点组成树结构。
每个指针要么为null,要么指向另外一个节点。
如果某个指针在节点node最左边且不为null,则其指向节点的所有key小于v(key1),其中v(key1)为node的第一个key的值。
如果某个指针在节点node最右边且不为null,则其指向节点的所有key大于v(keym),其中v(keym)为node的最后一个key的值。
如果某个指针在节点node的左右相邻key分别是keyi和keyi+1且不为null,则其指向节点的所有key小于v(keyi+1)且大于v(keyi)。
图2是一个d=2的B-Tree示意图。
图2
由于B-Tree的特性,在B-Tree中按key检索数据的算法非常直观:首先从根节点进行二分查找,如果找到则返回对应节点的data,否则对相应区间的指针指向的节点递归进行查找,直到找到节点或找到null指针,前者查找成功,后者查找失败。B-Tree上查找算法的伪代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
BTree_Search(node, key)
{
``if
(node == null)
return
null;
``foreach(node.key)
``{
``if
(node.key[i] == key)
return
node.data[i];
``if
(node.key[i] > key)
return
BTree_Search(point[i]->node);
By admin
read more下面是自己解决的方法
tzselect
根据提示选择
5 –> 9–>1–>1–>ok rm /etc/localtime ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
这时就可以看到时间已经修改成为国内的时间了。时间也对的。时间为24小时制。
By admin
read more摘要:
给marker、lable、circle等Overlay添加事件很简单,直接addEventListener即可。那么,自定义覆盖物的事件应该如何添加呢?我们一起来看一看~
一、定义构造函数并继承Overlay
二、初始化自定义覆盖物
三、绘制覆盖物
四、添加覆盖物
By admin
read more用记事本编辑“C:\Windows\System32\Drivers\etc\”目录下的 hosts 文件
127.0.0.1 activate.adobe.com 127.0.0.1 practivate.adobe.com 127.0.0.1 ereg.adobe.com 127.0.0.1 activate.wip3.adobe.com 127.0.0.1 wip3.adobe.com 127.0.0.1 3dns-3.adobe.com 127.0.0.1 3dns-2.adobe.com 127.0.0.1 adobe-dns.adobe.com 127.0.0.1 adobe-dns-2.adobe.com 127.0.0.1 adobe-dns-3.adobe.com 127.0.0.1 ereg.wip3.adobe.com 127.0.0.1 activate-sea.adobe.com 127.0.0.1 wwis-dubc1-vip60.adobe.com 127.0.0.1 activate-sjc0.adobe.com
以防止其连接 Adobe 的激活验证服务器。
Adobe Photoshop CS5的序列号、注册码,永久激活,Adobe Photoshop CS5的序列号可以在安装软件时使用,软件安装好以后,使用Photoshop CS5序列号文件激活,软件就可以长期使用了。
1330-1359-9214-6960-6105-3005
1330-1166-7128-9017-6713-0682
1330-1822-4364-2774-7756-9908
1330-1218-5682-8007-1601-0801
1330-1048-9541-7428-9078-8528
1330-1617-1629-8083-2573-9190
可以让Adobe Photoshop CS5长期使用,没有任何功能限制,还可以在线升级更新软件的Photoshop CS5序列
By admin
read more前几天,我才知道有一种简化的数据交换格式,叫做 yaml。
我翻了一遍它的 文档,看懂的地方不多,但是有一句话令我茅塞顿开。
它说, 从结构上看,所有的数据(data)最终都可以分解成三种类型:
第一种类型是 标量(scalar),也就是一个单独的字符串(string)或数字(numbers),比如”北京”这个单独的词。
第二种类型是 序列(sequence),也就是若干个相关的数据按照一定顺序并列在一起,又叫做数组(array)或列表(List),比如”北京,上海”。
第三种类型是 映射(mapping),也就是一个名/值对(Name/value),即数据有一个名称,还有一个与之相对应的值,这又称作散列(hash)或字典(dictionary),比如”首都:北京”。
我恍然大悟,数据构成的最小单位原来如此简单!难怪在编程语言中,只要有了数组(array)和对象(object)就能够储存一切数据了。
我马上想到了 json。
21世纪初,Douglas Crockford寻找一种简便的数据交换格式,能够在服务器之间交换数据。当时通用的数据交换语言是XML,但是Douglas Crockford觉得XML的生成和解析都太麻烦,所以他提出了一种简化格式,也就是Json。
Json的规格非常简单,只用一个页面几百个字就能说清楚,而且Douglas Crockford声称这个规格永远不必升级,因为该规定的都规定了。
1) 并列的数据之间用逗号(”,”)分隔。
2) 映射用冒号(”:”)表示。
3) 并列数据的集合(数组)用方括号(“[]”)表示。
4) 映射的集合(对象)用大括号(”{}”)表示。
上面四条规则,就是Json格式的所有内容。
比如,下面这句话:
“北京市的面积为16800平方公里,常住人口1600万人。上海市的面积为6400平方公里,常住人口1800万。”
写成json格式就是这样:
[
{“城市”:”北京”,”面积”:16800,”人口”:1600},
{“城市”:”上海”,”面积”:6400,”人口”:1800}
]
如果事先知道数据的结构,上面的写法还可以进一步简化:
[
[“北京”,16800,1600],
[“上海”,6400,1800]
]
由此可以看到,json非常易学易用。所以,在短短几年中,它就取代xml,成为了互联网上最受欢迎的数据交换格式。
我猜想,Douglas Crockford一定事先就知道,数据结构可以简化成三种形式,否则怎么可能将json定义得如此精炼呢!
学习javascript的时候,我曾经一度搞不清楚”数组”(array)和”对象”(object)的根本区别在哪里,两者都可以用来表示数据的集合。
比如有一个数组a=[1,2,3,4],还有一个对象a={0:1,1:2,2:3,3:4},然后你运行alert(a[1]),两种情况下的运行结果是相同的!这就是说,数据集合既可以用数组表示,也可以用对象表示,那么我到底该用哪一种呢?
我后来才知道,数组表示有序数据的集合,而对象表示无序数据的集合。如果数据的顺序很重要,就用数组,否则就用对象。
当然,数组和对象的另一个区别是,数组的数据没有”名称”(name),对象的数据有”名称”(name)。
但是问题是,很多编程语言中,都有一种叫做”关联数组”(associative array)的东西。这种数组中的数据是有名称的。
比如在javascript中,可以这样定义一个对象:
var a={“城市”:”北京”,”面积”:16800,”人口”:1600};
但是,也可以定义成一个关联数组:
a[“城市”]=”北京”;
a[“面积”]=16800;
a[“人口”]=1600;
这起初也加剧了我对数组和对象的混淆,后来才明白,在Javascript语言中,关联数组就是对象,对象就是关联数组。这一点与php语言完全不同,在php中,关联数组也是数组。
比如运行下面这段javascript:
var a=[1,2,3,4];
a[‘foo’]=’Hello World’;
alert(a.length);
最后的结果是4,也就是说,数组a的元素个数是4个。
By admin
read morenginx默认的header长度上限是4k,如果超过了这个值 nginx会直接返回400错误
[error] 16613#0: *105 upstream sent too big header while reading response header from upstream
可以通过以下2个参数来调整header上限
client_header_buffer_size 16k; large_client_header_buffers 4 16k;
看起来是,nginx默认会用client_header_buffer_size这个buffer来读取header值,如果header过大,它会使用large_client_header_buffers来读取
client_header_buffer_size
syntax: client_header_buffer_size size
default: 1k
context: http, server
Directive sets the headerbuffer size for the request header from client.
For the overwhelming majority of requests it is completely sufficient a buffer size of 1K.
However if a big cookie is in the request-header or the request has come from a wap-client the header can not be placed in 1K, therefore, the request-header or a line of request-header is not located completely in this buffer nginx allocate a bigger buffer, the size of the bigger buffer can be set with the instruction large_client_header_buffers.
By admin
read more