月度归档:2011年08月

分析解决元素的子元素的Mouse事件干扰

 话说有一个DIV元素,其内部有一个IMG元素和SPAN元素,不用理会这两个内部元素怎么布局,这不是我要讨论的重点。

为了实现一些特殊的效果,我需要利用TD的onmouseover和onmouseout事件,测试时就会发现如下的状况:

当鼠标移入DIV内部时,onmouseover事件被触发;接着再鼠标移动到DIV内部的IMG或者SPAN元素之上,我们肯定不会认为这时鼠标已经移到了DIV的外边,但奇怪的是onmouseout事件触发了,而且紧接着onmouseover事件也马上被触发了。

这可不是我想要的,那么怎么来“屏蔽”内部元素给外层元素带来的Javascript事件干扰呢?

这里列举两种方法:

一. setTimeout

因为在鼠标移动到内部元素之上而触发了外层元素的onmouseout事件后,外层元素的onmouseover也会马上触发,所以我们只需要把外层元素 的onmouseout事件需要执行的动作延迟很短的一段时间来运行,然后在onmouseover事件中再执行clearTimeout方法,这样就可 以避免内部元素引起的事件干扰。

具体的执行过程请看下图(纵向的虚线表示时间):



这是个很巧妙的的方法,因为当onmouseout触发后,实质性的方法并没有马上执行,而是要等待一小段时间。如果在这段时间里马上又触发了 onmouseover事件,那么基本上就可以肯定onmouseout事件的触发是因为内部元素的干扰了,所以在onmouseover事件中使用 clearTimeout来阻止延时的方法执行。


二.contains

在onmouseover时先进行如下判断,结果为true时再执行方法体:

if(!this.contains(event.fromElement)){MouseOverFunc()}

在onmouseout时先进行如下判断,结果为true时再执行方法体:

if(!this.contains(event.toElement)){MouseOutFunc()}

下面来解释一下上面两行代码的含义:

在IE中,所有的HTML元素都有一个contains方法,它的作用是判断当前元素内部是否包含指定的元素。我们利用这个方法来判断外层元素的事件是不是因为内部元素而被触发,如果内部元素导致了不需要的事件被触发,那我们就忽略这个事件。

event.fromElement指向触发onmouseover和onmouseout事件时鼠标离开的元素;event.toElement指向触发onmouseover和onmouseout事件时鼠标进入的元素。

那么上面两行代码的含义就分别是:

○ 当触发onmouseover事件时,判断鼠标离开的元素是否是当前元素的内部元素,如果是,忽略此事件;

○ 当触发onmouseout事件时,判断鼠标进入的元素是否是当前元素的内部元素,如果是,忽略此事件;

这样,内部元素就不会干扰外层元素的onmouseover和onmouseout事件了。

但问题又来了,非IE的浏览器并不支持contains函数,不过既然我们已经知道了contains函数的作用,就可以自行添加如下的代码来为非IE浏览器增加contains支持:

if(typeof(HTMLElement) != "undefined")

{

HTMLElement.prototype.contains 
= function(obj) 

{   

          
while(obj != null &&  typeof(obj.tagName) != "undefind")   

          {

if(obj == this)

Return 
true;

Obj 
= obj.parentNode;

}    

return false;   

};   

}

 

实例代码:可以兼容ff

 

 1function out(id, event)

 2{

 3    var parent = document.getElementById(id)

 4    if(typeof(HTMLElement)!="undefined")    //给firefox定义contains()方法,ie下不起作用

 5    {

 6          HTMLElement.prototype.contains=function(obj)

 7          

 8              while(obj!=null&&typeof(obj.tagName)!="undefind")//通过循环对比来判断是不是obj的父元素

 9                 if(obj==thisreturn true;

10               obj=obj.parentNode;

11               }
 

12              return false;

13          }
;  

14    }
  

15    if ($.browser.mozilla) 

16    {

17            if (!parent.contains(event.relatedTarget)) //如果是子元素

18                      $("#"+id).fadeOut(3000function(){

19                            $("#"+id+" .todaydiary_list").hide();

20                        }
);

21            }


22    }
 

23    else

24    {

25         if (!parent.contains(event.toElement)) {

26                 $("#"+id).fadeOut(3000function(){

27                    $("#"+id+" .todaydiary_list").hide();

28                }
);

29        }


30    }


31}

认识HTML5的WebSocket,客户端(浏览器)、服务器端双向通信

 在HTML5规范中,我最喜欢的Web技术就是正迅速变得流行的WebSocket API。WebSocket提供了一个受欢迎的技术,以替代我们过去几年一直在用的Ajax技术。这个新的API提供了一个方法,从客户端使用简单的语法有效地推动消息到服务器。让我们看一看HTML5的WebSocket API:它可用于客户端、服务器端。而且有一个优秀的第三方API,名为Socket.IO。

一、什么是WebSocket API?

WebSocket API是下一代客户端-服务器的异步通信方法。该通信取代了单个的TCP套接字,使用ws或wss协议,可用于任意的客户端和服务器程序。WebSocket目前由W3C进行标准化。WebSocket已经受到Firefox 4、Chrome 4、Opera 10.70以及Safari 5等浏览器的支持。

WebSocket API最伟大之处在于服务器和客户端可以在给定的时间范围内的任意时刻,相互推送信息。WebSocket并不限于以Ajax(或XHR)方式通信,因为Ajax技术需要客户端发起请求,而WebSocket服务器和客户端可以彼此相互推送信息;XHR受到域的限制,而WebSocket允许跨域通信。

Ajax技术很聪明的一点是没有设计要使用的方式。WebSocket为指定目标创建,用于双向推送消息。

二、WebSocket API的用法

只专注于客户端的API,因为每个服务器端语言有自己的API。下面的代码片段是打开一个连接,为连接创建事件监听器,断开连接,消息时间,发送消息返回到服务器,关闭连接。

// 创建一个Socket实例
var socket = new WebSocket(‘ws://localhost:8080′); 

// 打开Socket 
socket.onopen = function(event) { 

  // 发送一个初始化消息
  socket.send(‘I am the client and I\’m listening!’); 

  // 监听消息
  socket.onmessage = function(event) { 
    console.log(‘Client received a message’,event); 
  }; 

  // 监听Socket的关闭
  socket.onclose = function(event) { 
    console.log(‘Client notified socket has closed’,event); 
  }; 

  // 关闭Socket…. 
  //socket.close() 
};

让我们来看看上面的初始化片段。参数为URL,ws表示WebSocket协议。onopen、onclose和onmessage方法把事件连接到Socket实例上。每个方法都提供了一个事件,以表示Socket的状态。

onmessage事件提供了一个data属性,它可以包含消息的Body部分。消息的Body部分必须是一个字符串,可以进行序列化/反序列化操作,以便传递更多的数据。

WebSocket的语法非常简单,使用WebSockets是难以置信的容易……除非客户端不支持WebSocket。IE浏览器目前不支持WebSocket通信。如果你的客户端不支持WebSocket通信,下面有几个后备方案供你使用:

Flash技术 —— Flash可以提供一个简单的替换。 使用Flash最明显的缺点是并非所有客户端都安装了Flash,而且某些客户端,如iPhone/iPad,不支持Flash。

AJAX Long-Polling技术 —— 用AJAX的long-polling来模拟WebSocket在业界已经有一段时间了。它是一个可行的技术,但它不能优化发送的信息。也就是说,它是一个解决方案,但不是最佳的技术方案。

由于目前的IE等浏览器不支持WebSocket,要提供WebSocket的事件处理、返回传输、在服务器端使用一个统一的API,那么该怎么办呢?幸运的是,Guillermo Rauch创建了一个Socket.IO技术。

三、带Socket.IO的WebSocket

Socket.IO是Guillermo Rauch创建的WebSocket API,Guillermo Rauch是LearnBoost公司的首席技术官以及LearnBoost实验室的首席科学家。Socket.IO使用检测功能来判断是否建立WebSocket连接,或者是AJAX long-polling连接,或Flash等。可快速创建实时的应用程序。Socket.IO还提供了一个NodeJS API,它看起来非常像客户端API。
建立客户端Socket.IO

Socket.IO可以从GitHub下载,可以把socket.io.js文件包含到页面中:

<script src="http://cdn.socket.io/stable/socket.io.js"></script>
[/code

此时,Socket.IO在此页面上是有效的,是时候创建Socket了:

[code]
// 创建Socket.IO实例,建立连接
var socket= new io.Socket(‘localhost’,{ 
  port: 8080 
}); 
socket.connect(); 

// 添加一个连接监听器
socket.on(‘connect’,function() { 
  console.log(‘Client has connected to the server!’); 
});

// 添加一个连接监听器
socket.on(‘message’,function(data) { 
  console.log(‘Received a message from the server!’,data); 
});

// 添加一个关闭连接的监听器
socket.on(‘disconnect’,function() { 
  console.log(‘The client has disconnected!’); 
}); 

// 通过Socket发送一条消息到服务器
function sendMessageToServer(message) { 
  socket.send(message); 
}

Socket.IO简化了WebSocket API,统一了返回运输的API。传输包括:
WebSocket
Flash Socket
AJAX long-polling
AJAX multipart streaming
IFrame
JSONP polling

你还可以设置任意的Socket.IO构造器的第二个选项,选项包括:

port – 待连接的端口
transports – 一个数组,包含不同的传输类型
transportOptions – 传输的参数使用的对象,带附加属性

Socket.IO还提供了由本地WebSocket API提供的普通连接、断开连接、消息事件。Socket还提供了封装每个事件类型的方法。

四、NodeJS和Socket.IO联合开发

Socket.IO提供的服务器端解决方案,允许统一的客户端和服务器端的API。使用Node,你可以创建一个典型的HTTP服务器,然后把服务器的实例传递到Socket.IO。从这里,你创建连接、断开连接、建立消息监听器,跟在客户端一样。

一个简单的服务器端脚本看起来如下:

// 需要HTTP 模块来启动服务器和Socket.IO
var http= require(‘http’), io= require(‘socket.io’); 

// 在8080端口启动服务器
var server= http.createServer(function(req, res){ 
  // 发送HTML的headers和message
  res.writeHead(200,{ ‘Content-Type': ‘text/html’ }); 
  res.end(‘<h1>Hello Socket Lover!</h1>’); 
}); 
server.listen(8080); 

// 创建一个Socket.IO实例,把它传递给服务器
var socket= io.listen(server); 

// 添加一个连接监听器
socket.on(‘connection’, function(client){ 

  // 成功!现在开始监听接收到的消息
  client.on(‘message’,function(event){ 
    console.log(‘Received message from client!’,event); 
  }); 
  client.on(‘disconnect’,function(){ 
    clearInterval(interval); 
    console.log(‘Server has disconnected’); 
  }); 
});

你可以运行服务器部分,假定已安装了NodeJS,从命令行执行:

node socket-server.js

现在客户端和服务器都能来回推送消息了!在NodeJS脚本内,可以使用简单的JavaScript创建一个定期消息发送器:

// 创建一个定期(每5秒)发送消息到客户端的发送器
var interval= setInterval(function() { 
  client.send(‘This is a message from the server! ‘ + new Date().getTime()); 
},5000);

服务器端将会每5秒推送消息到客户端!

五、dojox.Socket和Socket.IO

Persevere的创建者Kris Zyp创建了dojox.Socket。dojox.Socket以Dojo库一致的方式封装了WebSocket API,用于在客户端不支持WebSocket时,使用long-polling替代。

下面是怎样在客户端使用dojox.Socket和在服务器端使用Socket.IO的例子:

var args, ws= typeof WebSocket!= ‘undefined'; 
var socket= dojox.socket(args= { 
  url: ws? ‘/socket.io/websocket’ : ‘/socket.io/xhr-polling’, 
  headers:{ 
    ‘Content-Type':’application/x-www-urlencoded’ 
  }, 
  transport: function(args, message){ 
    args.content = message; // use URL-encoding to send the message instead of a raw body 
    dojo.xhrPost(args); 
  }; 
}); 
var sessionId; 
socket.on(‘message’, function(){ 
  if (!sessionId){ 
    sessionId= message; 
    args.url += ‘/’ + sessionId; 
  }else if(message.substr(0, 3) == ‘~h~’){ 
   // a heartbeat 
  } 
});

dojox.socket.Reconnect还创建了在套接字失去连接时自动重连。期待包含dojox.Socket的Dojo 1.6版本早日发布。

六、实际应用和WebSocket资源

有很多WebSocke的实际应用。WebSocket对于大多数客户机-服务器的异步通信是理想的,在浏览器内聊天是最突出的应用。WebSocket由于其高效率,被大多数公司所使用。

sql 语句查换行隐形字符

 – 制表符 CHAR(9)

– 换行符 CHAR(10)

– 回车 CHAR(13)

 

–在表aaa中过滤包含回车换行符的字段b的记录

select * from aaa where charindex(char(10)+char(13),b)>0

 

–在表aaa中把包含回车换行符的字段b的记录的回车换行符去掉

update aaa set b=replace(b,char(10)+char(13),”)

linux下硬盘测速

 hdparm -tT /dev/sda7

 
/dev/sda7:
 Timing cached reads:     2 MB in  9.74 seconds = 210.36 kB/sec
 Timing buffered disk reads:    2 MB in  5.14 seconds = 398.29 kB/sec
 
这么慢的速度,肯定有问题…
换要硬盘数据线试试吧!

grub rescue模式下启动修复

 grub rescue模式下修复

由于在rescue模式下,只有少量的基本命令可用,必须通过一定的操作才能加载正常模块,然后进入正常模式。  rescue模式下可使用的命令有:set,ls,insmod,root,prefix(设置启动路径)  先假设grub2的核心文件在(hd0,8)分区,再来看看怎样从 rescue模式进入从(hd0,8)启动的正常模式(normal)。  在 rescue模式下search命令不能用,对不清楚grub2文件处于哪个分区的,可以用ls命令查看,比如  ls (hd0,8)/ 查看(hd0,8)分区根目录,看看有没有boot文件夹  ls (hd0,8)/boot/ 查看(hd0,8)分区的/boot目录下文件  ls (hd0,8)/boot/grub/ 查看(hd0,8)分区/boot/grub目录下文件  通过文件查看,可以确定 grub2核心文件处于哪个分区,接下来就可以进行从rescue到normal的转变动作:  先 ls 看看分区,根据分区列表,猜下 / 分区的编号再 ls (hd0,x)/ 看分区目录下文件确定找到 / 分区,不对的话继续找。找到 / 分区的 (hd0,x) 继续  grub rescue>root=(hd0,x)  grub rescue>prefix=/boot/grub  grub rescue>set root=(hd0,x)  grub rescue>set prefix=(hd0,x)/boot/grub  grub rescue>insmod normal  rescue>normal -------->若出现启动菜单,按c进入命令行模式  rescue>linux /boot/vmlinuz-xxx-xxx root=/dev/sdax  rescue>initrd /boot/initrd.img-xxx-xxx  rescue>boot  内核版本号 -xxx-xxx可以按Tab键查看后再手动补全。

VPS技术之VM,VZ,Hyper-v介绍

 目前虚拟化之风越刮越大,VPS孕育而生。几乎所有的IDC都开始展开VPS主机的产品投入和竞争。
但是市场上常见的VPS技术却有三种之多。具体是哪三种呢?我们来一一解说。

一、VZ虚拟化技术VPS。
Virtuozzo简介
Virtuozzo是SWsoft公司(目前SWsoft已经改名为parallels)的操作系统虚拟化软件的命名,该操作系统虚拟化软件是一项服务器虚拟化和自动化技术,它采用的是操作系统虚拟化技术。操作系统虚拟化的概念是基于共用操作系统内核,这样虚拟服务器就无需额外的虚拟化内核的过程,因而虚拟过程资源损耗就更低,从而可以在一台物理服务器上可以实现更多的虚拟化服务器。这些VPS以最大化的效率共享硬件、软件许可证以及管理资源。每一个VPS均可独立进行重启,并拥有自己的root访问权限、用户、IP地址、内存、过程、文件、应用程序、系统函数库以及配置文件。Virtuozzo技术同时支持Linux和Windows平台。Linux版Virtuozzo服务器还支持在虚拟服务器上实现同版本内核的不同Linux发行版。

Virtuozzo 技术优点
密度 与其他的虚拟化技术相比,Parallels Virtuozzo在单台物理服务器(硬件节点)上可获得超过3倍的虚拟服务器数量。
与其说这个是优势,不如说是缺点。VZ的虚拟机性能差应该和他所谓的密度有关系。

最佳的易管理特性 全球唯一的在增加虚拟服务器数量同时降低操作系统复杂增长(OS sprawl)的虚拟化解决方案。
这个因为基于操作系统的虚拟,节省了软件授权的成本,还有他的易管理,确实是一个特点。
原始服务器性能 虚拟服务器接近原始物理服务器性能,整合性能敏感负载后不会有性能损失困扰。
关于这个原始服务器性能,我觉得是严重的吹嘘。据我的使用发现,VZ的最大缺点就是,如果某一个虚拟机的资源占用过高,会影响到其他的虚拟机。毕竟不是底层的虚拟化,就和一个软件一样。当操作系统中的一个软件占用资源过高,其他的软件速度也会影响。
高可靠性 优化整体虚拟IT基础架构的在线时间以确保业务连续性。
一般来说,服务器上的技术都有这个特点。VMware也有,Hyper-V也有。
成熟的技术 Parallels Virtuozzo已经成功部署在超过10,000台物理服务器上,始终如一地为客户提供超水平的隔离、安全和稳定性等性能。
不知道是否真的不熟在这么多服务器上。但是我知道VMware和Hyper-V部署的数字肯定要远远超过这个。

我们针对技术领先度,软件价格,性能,性价比四项进行评估。满分为10颗星。星星越多越好。
性价比的得分为前三项的平均值。

Virtuozzo的技术领先度 ★★★★★★☆ (6.5分,操作系统虚拟化还是有点弱)
Virtuozzo的软件成本 ★★★★★★★☆ (7.5分,软件价格还算可以,但是要Parallels的产品授权模式导致他的成本并不低)
Virtuozzo的性能 ★★★★★★ (6分,虽然从操作系统中看是原始CPU的信息,但是实际用起来速度不是很好)
Virtuozzo的性价比 ★★★★★★☆ (6.67分,性价比只是一个数字,对比才出来结果)

二、VM虚拟化技术VPS。
VMware相信很多人都用过。而VMware整个家族也都在同样的事:虚拟化。对于虚拟化的理解再也没有比VMware更深刻了。
我们在这里介绍的VMware VPS主要是基于VMware ESX搭建的VPS进行介绍。有个别服务商采用VMware PC版家用机的产品做VPS。你敢用吗?
VMware ESX 服务器是在通用环境下分区和整合系统的虚拟主机软件。它是具有高级资源管理功能高效,灵活的虚拟主机平台。
VMware ESX Server 为适用于任何系统环境的企业级的虚拟计算机软件。大型机级别的架构提供了空前的性能和操作控制。它能提供完全动态的资源可测量控制,适合各种要求严格的应用程序的需要,同时可以实现服务器部署整合,为企业未来成长所需扩展空间。ESX Server
亦提供储存虚拟化的能力。除可因兼并服务器减少设备购买及维护成本外,亦可因效能的尖峰离峰需求,以VMotion技术在各服务器或刀片服务器之刀板间弹性动态迁移系统平台,让IT人员做更有效的资源调度,并获得更好且安全周密的防护,当系统发生灾难时,可以在最短的间( 毋需重新安装 操作系统 ) ,迅速复原系统的运作 。

完美匹配企业数据中心,通过提高资源使用率,扩展计算机性能和优化服务器, VMware ESX 服务器帮助企业降低计算机基础构架的成本。VMware ESX 服务器能实现:
•服务器整合
VMware ESX 服务器能在更少的高伸缩和高可靠企业级服务器上,包括刀片式服务器,整合运行在不同操作系统上的应用程序和基本服务
•提供高性能并担保服务品质
ESX 服务器支持出于开发和测试为目的,在同一系统内的虚拟主机集群;同样也高性能的支持系统间的虚拟主机集群。VMware ESX 服务器担保服务器的CPU,内存,网络带宽和磁盘 I/O 处于最优化的状态,改进对内和对外的服务
•流水式测试和部署
VMware ESX 服务器压缩虚拟主机镜像以便它们在环境间能被非常容易的迁移,确保软件测试者和质量检验工程师在相对少的时间和硬件状态下做更多有效的测试
•可伸缩的软硬件构架
VMware ESX 服务器包含支持 VMware Virtual SMP,确保企业在灵活,安全和轻便的虚拟主机上运行所有重要的应用程序。

VMware ESX服务器传输物理系统到逻辑资源池,系统和应用程序被分离在包含多虚拟机的单一硬件片上。系统资源按需动态分配到任何操作系统上,提供大型机的性能和服务器资源控制。VMware ESX 服务器通过在安全便捷的虚拟机上执行分区和分割服务器资源来简化服务器的基础构架。VMware ESX 服务器确保服务器资源能被远程管理,自动预制和标准化。高级资源管理控制通过企业担保服务质量。
直接运行在系统硬件上的 VMware ESX 服务器为部署,管理和远程控制多虚拟机提供了一个安全,唯一的平台。有了VMware ESX服务器:
•特定系统的应用程序能被迁移到在更可靠和可伸缩的不同虚拟机上去。
•服务器能从任何地方被远程管理,简化服务器维护。
•通过高级资源管理控制,服务质量能得到保证。
•普通的监控和管理任务是自动脚本式的。
•无须添加新的物理系统,性能得到明显提升。

关于VMware的资料互联网上太多太多,一段时间里,VMware就是虚拟机,就是虚拟化的代名词。

我们针对同样技术领先度,软件价格,性能,性价比四项进行评估。满分为10颗星。星星越多越好。
性价比的得分为前三项的平均值。

VMware的技术领先度 ★★★★★★★★★☆ (9.5分,技术的领先是觉得没有问题的,VMware引领者虚拟化的行业)
VMware的软件成本 ★★★★★★★★☆ (8.5分,软件价格相对比较贵。虽然有破解版,但是如果是正规公司运作起来,VMware的应用成本稍高。机器性能越好,虚拟的设备越多,响应的也会降低他的成本。)
VMware的性能 ★★★★★★★ (7分,磁盘读写比较慢,无论采用物理硬盘,还是采用NAS做存储,WMware ESX虚拟下的VPS可能唯一的瓶颈就是这里。)
VMware的性价比 ★★★★★★★★☆ (8.3分,性价比只是一个数字,对比才出来结果)

三、微软Microsoft Hyper-V虚拟化技术VPS。
微软进入虚拟化也有一段时间了。旗下的Virtual Server也算是小有名气,也有一定的客户群。
Hyper-v主机是基于Windows2008x64的Hyper-V实现的Hyper-v主机技术,又称Hyper-v主机由于“微软公司的Hyper-V技术”是全球领先的真正的“硬虚拟化”技术,在性能及稳定上有无可比拟的优势,每个Hyer-v主机都可分配独立公网IP地址、独立操作系统、独立超大空间、独立内存、独立CPU资源具有独立服务器功能,可自行安装程序,单独重启服务器。Hyer-v主机是高端虚拟主机用户的最佳选择。您不再受其他用户程序对您造成的影响,您将得到的是更加公平的资源分配,远远低于虚拟主机的故障率。