nginx可以根据客户端IP进行负载均衡,在upstream里设置ip_hash,就可以针对同一个C类地址段中的客户端选择同一个后端服务器,除非那个后端服务器宕了才会换一个。

nginx的upstream目前支持的5种方式的分配
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
upstream backserver {
server 192.168.0.14;
server 192.168.0.15;
}

2、指定权重
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream backserver {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}

3、IP绑定 ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream backserver {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}

4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backserver {
server server1;
server server2;
fair;
}

5、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}

在需要使用负载均衡的server中增加

proxy_pass http://backserver/;
upstream backserver{
ip_hash;
server 127.0.0.1:9090 down; (down 表示单前的server暂时不参与负载)
server 127.0.0.1:8080 weight=2; (weight 默认为1.weight越大,负载的权重就越大)
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup; (其它所有的非backup机器down或者忙的时候,请求backup机器)
}

max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误

fail_timeout:max_fails次失败后,暂停的时间

 

Hbase hbck

[plain] view plain copy

在CODE上查看代码片派生到我的代码片

  1. 新版本的 hbck 可以修复各种错误,修复选项是:
  2. (1)-fix,向下兼容用,被-fixAssignments替代
  3. (2)-fixAssignments,用于修复region assignments错误
  4. (3)-fixMeta,用于修复meta表的问题,前提是HDFS上面的region info信息有并且正确。
  5. (4)-fixHdfsHoles,修复region holes(空洞,某个区间没有region)问题
  6. (5)-fixHdfsOrphans,修复Orphan region(hdfs上面没有.regioninfo的region)
  7. (6)-fixHdfsOverlaps,修复region overlaps(区间重叠)问题
  8. (7)-fixVersionFile,修复缺失hbase.version文件的问题
  9. (8)-maxMerge <n> (n默认是5),当region有重叠是,需要合并region,一次合并的region数最大不超过这个值。
  10. (9)-sidelineBigOverlaps ,当修复region overlaps问题时,允许跟其他region重叠次数最多的一些region不参与(修复后,可以把没有参与的数据通过bulk load加载到相应的region)
  11. (10)-maxOverlapsToSideline <n> (n默认是2),当修复region overlaps问题时,一组里最多允许多少个region不参与
  12. 由于选项较多,所以有两个简写的选项
  13. (11) -repair,相当于-fixAssignments -fixMeta -fixHdfsHoles -fixHdfsOrphans -fixHdfsOverlaps -fixVersionFile -sidelineBigOverlaps
  14. (12)-repairHoles,相当于-fixAssignments -fixMeta -fixHdfsHoles -fixHdfsOrphans
  15. 新版本的 hbck
  16. (1)缺失hbase.version文件
  17.  加上选项 -fixVersionFile 解决
  18. (2)如果一个region即不在META表中,又不在hdfs上面,但是在regionserver的online region集合中
  19.  加上选项 -fixAssignments 解决
  20. (3)如果一个region在META表中,并且在regionserver的online region集合中,但是在hdfs上面没有
  21.  加上选项 -fixAssignments -fixMeta 解决,( -fixAssignments告诉regionserver close region),( -fixMeta删除META表中region的记录)
  22. (4)如果一个region在META表中没有记录,没有被regionserver服务,但是在hdfs上面有
  23. 加上选项 -fixMeta -fixAssignments 解决,( -fixAssignments 用于assign region),( -fixMeta用于在META表中添加region的记录)
  24. (5)如果一个region在META表中没有记录,在hdfs上面有,被regionserver服务了
  25. 加上选项 -fixMeta 解决,在META表中添加这个region的记录,先undeploy region,后assign
  26. (6)如果一个region在META表中有记录,但是在hdfs上面没有,并且没有被regionserver服务
  27. 加上选项 -fixMeta 解决,删除META表中的记录
  28. (7)如果一个region在META表中有记录,在hdfs上面也有,table不是disabled的,但是这个region没有被服务
  29. 加上选项 -fixAssignments 解决,assign这个region
  30. (8)如果一个region在META表中有记录,在hdfs上面也有,table是disabled的,但是这个region被某个regionserver服务了
  31. 加上选项 -fixAssignments 解决,undeploy这个region
  32. (9)如果一个region在META表中有记录,在hdfs上面也有,table不是disabled的,但是这个region被多个regionserver服务了
  33. 加上选项 -fixAssignments 解决,通知所有regionserver close region,然后assign region
  34. (10)如果一个region在META表中,在hdfs上面也有,也应该被服务,但是META表中记录的regionserver和实际所在的regionserver不相符
  35. 加上选项 -fixAssignments 解决
  36. (11)region holes
  37. 需要加上 -fixHdfsHoles ,创建一个新的空region,填补空洞,但是不assign 这个 region,也不在META表中添加这个region的相关信息
  38. (12)region在hdfs上面没有.regioninfo文件
  39. -fixHdfsOrphans 解决
  40. (13)region overlaps
  41. 需要加上 -fixHdfsOverlaps
  42. 说明:
  43. (1)修复region holes时,-fixHdfsHoles 选项只是创建了一个新的空region,填补上了这个区间,还需要加上-fixAssignments -fixMeta 来解决问题,( -fixAssignments 用于assign region),( -fixMeta用于在META表中添加region的记录),所以有了组合拳 -repairHoles 修复region holes,相当于-fixAssignments -fixMeta -fixHdfsHoles -fixHdfsOrphans
  44. (2) -fixAssignments,用于修复region没有assign、不应该assign、assign了多次的问题
  45. (3)-fixMeta,如果hdfs上面没有,那么从META表中删除相应的记录,如果hdfs上面有,在META表中添加上相应的记录信息
  46. (4)-repair 打开所有的修复选项,相当于-fixAssignments -fixMeta -fixHdfsHoles -fixHdfsOrphans -fixHdfsOverlaps -fixVersionFile -sidelineBigOverlaps
  47. 新版本的hbck从(1)hdfs目录(2)META(3)RegionServer这三处获得region的Table和Region的相关信息,根据这些信息判断并repair

示例:

[plain] view plain copy

在CODE上查看代码片派生到我的代码片

  1. 查看hbasemeta情况
  2. hbase hbck
  3. 1.重新修复hbase meta表(根据hdfs上的regioninfo文件,生成meta表)
  4. hbase hbck -fixMeta
  5. 2.重新将hbase meta表分给regionserver(根据meta表,将meta表上的region分给regionservere)
  6. hbase hbck -fixAssignments

无线路由知识误区!解读天线数量与信号强弱的关系

天线越多路由就越好?

“天线越多覆盖越广,天线越多信号越强,总之天线越多路由就越好”——觉得很“常识”的朋友可以继续往下看正文了。为你解读天线数量与信号强弱的关系

首先,大家也应该注意到了,老一代无线路由器的天线肯定不会超过一根,这里的“老一代”指的是802.11n协议以前的802.11a/b/g路由,老的54M产品就只有一根天线。这样的话,802.11n显然成了一条分水岭,也是从那时开始天线不再只有孤零零的一根(1t1r的150M是个例外),那到底是怎么一回事?这里我们就要提到一项11n协议之后才得到具体应用的多天线技术,也是无线通信领域一项非常重要的技术——MIMO(Multiple-Input Multiple-Output,多入多出)

无线路由器天线多就信号好?

先来看个例子,有人说,为什么我买了一个最新款的3天线支持802.11ac协议的无线路由器,结果信号强度、覆盖范围甚至连速度都没上去呢?天线不够?告诉你,300根也没用,检查一下你用的接受终端支不支持AC协议吧。比如你用的iPhone 3,这手机可只支持11a/b/g连11n都谈不上,那么即便是你给这它拆了加几根天线也没用。怎么解决?加装AC网卡或者换终端,总之加天线是没有用的。

为什么这样说?首先,Wi-Fi应用的环境是室内,我们常用的802.11系列协议也是针对这种条件来建立的。由于发射端到接收端之间存在各种各样的障碍物,收发时几乎不存在直射信号的可能。那怎么办?这个办法叫做多径传输,也叫多径效应。多径,从字面上也很好理解,就是把增加传输途径。

无线路由器天线多就信号好?

那么问题来了,既然是多径,传输的路程就有长有短,有的可能是从桌子反射过来的,有的可能是穿墙的,这些携带相同信息但是拥有不同相位的信号辗转最终一起汇集到接收端上。现代通信用的是存储转发的分组交换,也叫包交换,传输的是码(Symbol)。由于障碍产生不同的传输时延,就造成了码间干扰ISI(InterSymbolInterference)。为了避免ISI,通信的带宽就必须小于可容忍时延的倒数。

无线路由器天线多就信号好?

对于802.11a/b/g 20MHz的带宽,最大时延为50ns,多径条件下无ISI的传输半径为15m。在IEEE802.11协议中我们可以看到,这个值最大范围是35m,这是协议中还有误码重传等各种手段保证通信,并不是说有一点ISI就完全不能工作。这样的话你会发现,对于802.11a/b/g协议,即使加装再多的天线也没有任何意义。假设这些天线可以同时工作,反而会使多径效应更加恶劣。

总之,无线路由器的发射范围是这个IEEE802.11协议决定的,而非单纯的看天线。

小结

说了这么多,单天线路由、双天线路由、三线四线甚至更多究竟有没有区别?有,但对于实际使用过程中的影响并不大,这包括信号覆盖、信号强度,天线多速度快就更是无稽之谈了。抛开已经很少见的单天线,剩下的“多天线”都只是实现MIMO技术的“介质”或者说是“工具”,区别在于使用的架构不同而已:常见的双天线产品主要用1T2R或2T2R,三天线产品则用到的是2T3R或3T3R。

无线路由器天线多就信号好?

理论上,增加天线数量会减少信号覆盖盲点,但我们通过大量的评测证实,这种差异在普通家庭环境中完全可以忽略不计。而且,就像内置天线不输外置一样,三天线覆盖不如双天线的情况也绝非个例,说到底产品质量也是一个重要因素。至于信号强度和“穿墙”则取决于发射功率,这个东西工信部作过规定,不得高于20dBm(即100mW),“天线越多信号越强”也就不攻自破了。最后的结论就是,只要路由采用了有效的MIMO技术,无须在意天线数量。

接下来一页我们会进一步深入了解MIMO技术的神奇。

MIMO技术

搜各种百科资料IEEE802.11词条,我们可以读到,从802.11n开始,数据传输速率或者说承载的数据量有了很大的提升。首先,802.11n有了40MHz模式,然而按照之前的理论,它的发射范围应该因此降低一半才对,但事实上数据反而提升了一倍(70m),这又是怎么一回事?

无线路由器天线多就信号好?

这就要得益于MIMO技术了,刚才我们讨论的种种手段都是为了对抗恶劣的多径环境,但是多径有没有好的一面呢?事实上,MIMO也是基于多径的,我们称之为空间多样性。多天线的应用有很多种技术手段,这里简单介绍两种:波束成型(Beamforming)和时空分组码(主要介绍Alamouti'scode)。这两种技术的优点是不需要多个接收天线。尤其是Alamouti码,连信道信息都不用,只用数学运算就可以利用两根天线实现3dB的增益,很赞对吧。

而不需要多个接收天线的优点在于并不是所有设备都能装上多天线。为了避免旁瓣辐射(天线方向图上,最大辐射波束叫做主瓣,主瓣旁边的小波束叫做旁瓣),满足空间上的采样定理,一般以发送信号之一半波长作为实体的天线间距。无论是GSM信号1.8GHz,1.9GHz还是Wi-Fi信号的2.4GHz,我们暂取2GHz便于计算,半波长为7.5cm。所以,我们看到的路由器上天线的距离大多如此,也正是因此,我们很难在手机上安装多个天线。

 波束成型(Beamforming):借由多根天线产生一个具有指向性的波束,将能量集中在想要传输的方向,增加信号传输品质,并减少与其他用户间的干扰。我们可以简单笼统地这样理解天线的指向性:假设全指向性天线功率为1,范围只有180度的指向性天线功率可以达到2。于是我们可以用4根90度的天线在理论上提高4倍的功率。波束成型的另外一种模式是通过信道估算接收端的方位,然后有指向性的针对该点发射,提高发射功率(类似于聚光的手电筒,范围越小,光越亮)。智能天线技术的前身就是波束成型。

无线路由器天线多就信号好?

空时分组码(Space-Time Block Code,即STBC):在多天线上的不同时刻发送不同信息来提高数据可靠性。Alamouti码是空时分组码里最简单的一种。为了传输d1d2两个码,在两根天线1,2上分别发送d1,-d2*和d2,d1*。由于多径,我们假设两根天线的信道分别为h1h2,于是第一时刻接收端收到的信息r1=d1h1+d2h2,之后接收的信息r2=-d2*h1+d1*h2。接收到的这个2维方阵只要乘以信道,就可得到d1d2的信息了。看不懂没关系,总之呢就是Alamouti找到一组正交的码率为2×2矩阵,用这种方式在两根天线上发射可以互不影响;可以用一根天线接收,经过数学运算以后得到发射信息的方法。

无线路由器天线多就信号好?

其他的MIMO呢,在概念上可能比较好理解,比如2个发射天线t1t2分别对两个接收天线r1r2发射,那么相当于两拨人同时干活,速度提升2倍等等。但是实际实现起来一方面在硬件上需要多个接收天线,另一方面需要信道估计等通信算法,那都是非常复杂,并且耗时耗硬件的计算了。

讲上面两种技术实际上是MISO(Multiple-Input Single-Output)的方法,也是想从另外一个方面证明,天线多了不代表他们能一起干活。100年前人们就知道天线越多越好越大越好了,但是天才的Alamouti码1998年才被提出来多天线技术的802.11n协议2009年才开始应用。

无线路由器天线多就信号好?

20年前,人们用OFDM(Orthogonal Frequency Division Multiplexing,即正交频分复用,多载波调制的一种技术)对抗由于城市间或室内障碍太多造成的多径衰落,而如今我们已经开始利用多径来提高通信质量。这是技术上突飞猛进的发展,而不是简单的“想当然”就可以实现的。

写在最后

MIMO本身就是一个时变的、不平稳的多入多出系统。关于MIMO的研究,是一个世界性课题,留下的疑问还有很多,同样的问题学术上甚至也会出现不同的说法。不过,对于一般消费者大可不必深究,认清了开头我们讲的“误区”,知道路由天线是个“工具”,普通家庭双天线足以,选购时看清产品规格,不要被商家误导。

Node.js是一个面向服务器的框架,立足于Chrome强大的V8 JS引擎。尽管它由C++编写而成,但是它及其应用是运行在JS上的。本文为开发者总结了4个Node.js要点。

1. 非阻塞(Non-blocking)或异步I/O

由于Node.js一个服务器端框架,所以它主要工作之一是处理浏览器请求。在传统的I/O系统中,每个请求的发出都是在上一请求到达之后才发出的。所以这被称为阻塞(blocking)I/O。服务器会阻挡其它的请求以处理当前请求,从而导致浏览器等待。

Node.js不以这种方式来进行I/O处理。如果一个请求需要长时间处理,Node.js会把该请求发送给一个事件循环(event loop),然后继续处理在调用堆栈(call stack)中的下一请求。当延后请求处理完毕时,它会告知Node.js同时浏览器会做出响应反馈。

以下使用一个事例来说明。

Blocking I/O

// take order for table 1 and wait...
var order1 = orderBlocking(['Coke', 'Iced Tea']);
// once order is ready, take order back to table.
serveOrder(order1);
// once order is delivered, move on to another table.
// take order for table 2 and wait...
var order2 = orderBlocking(['Coke', 'Water']);
// once order is ready, take order back to table.
serveOrder(order2);
// once order is delivered, move on to another table.
// take order for table 3 and wait...
var order3 = orderBlocking(['Iced Tea', 'Water']);
// once order is ready, take order back to table.
serveOrder(order3);
// once order is delivered, move on to another table.

在这个餐馆例子中,服务员接收了菜单指令,等待饭菜处理,然后在饭菜处理完成后把饭菜端到桌子上。在服务员等候饭菜处理期间,他会拒绝其它客人的菜单指令。

Non-blocking I/O

// take order for table 1 and move on...
orderNonBlocking(['Coke', 'Iced Tea'], function(drinks){
  return serveOrder(drinks);
});
// take order for table 2 and move on...
orderNonBlocking(['Beer', 'Whiskey'], function(drinks){
  return serveOrder(drinks);
});
// take order for table 3 and move on...
orderNonBlocking(['Hamburger', 'Pizza'], function(food){
  return serveOrder(food);
});

而在非阻塞模式下,服务员会告知厨师他接受到的菜单指令,然后去接收下一桌的指令。当第一桌饭菜处理完毕时,他会为那桌客人上菜,然后继续接收其它客人的指令。这样一来服务员不会由于阻塞指令而造成时间浪费。

2. 原型(Prototype)

原型在JS中是一个复杂的概念。在典型继承机制语言如Java或C++中,为了实现代码复用,你必须先创建一个类然后透过它来生成对象或透过类扩展来生成对象。但是在JS中没有类似的类概念。在JS中创建一个对象后,你需要透过它来扩展对象或创建新对象。这就叫做原型继承(prototypal inheritence)。

每个JS对象都连接着一个原型对象并对并继承该对象的属性。每个对象与预定义JS的Object.prototype相联系。如果你透过obj.propName或obj['propName'>方式来查找对象属性但查找失败时,这时可尝试通过obj.hasOwnProperty('propName')的方式进行查找,JS运行时会在在原型对象中查找属性。如果属性不存在于原型链中,那么将返回undefined值。

让我们用以下例子来进行说明:

if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        var F = function  {};
        F.prototype = o;
        return new F;
    };
var otherPerson = Object.create(person);

当你创建了一个新对象,你必须选定一个以原型为基础的对象。在这里,我们为对象函数添加了一个create方法。create方法创建了一个以其它对象为原型的对象,并作为参数传入。

当我们变更新的对象时,它的原型是保持不变的。但是,当我们改动了原型对象,该变更会影响所有基于该原型的对象。

3. 模块(Modules)

如果你曾在Java中使用过包,那么Node.js的组件与之类似。如果没有,也不用担心;组件其实是简单的JS文件,用于实现特定的功能。组件模式的意义是让你工作得更加轻松。要使用组件,你必须像在JAVA中导入包一样进行JS文件导入。Node.js中有两种组件

核心组件(Core Modules)- 核心组件是结合Node.js库被预编译的。其目的是把程序员经常使用的功能开放出来,避免重复劳动。常见的核心组件有HTTP, URL, EVENTS, FILE SYSTEM等等。

用户自定义组件(UserDefined Modules)- 用户自定义组件是提供给用户使用以实现具体功能的组件。当核心组件不足以满足程序员需要的时候,自定义组件就可派上用场了。

组件是通过require函数被抽取的。如果这是一个核心组件,那么参数就是组件名。如果这是一个用户自定义组件,那么参数就是其在文件系统中的组件路径。例如:

// extract a core module like this
var http = require('http);
// extract a user defined module like this
var something = require('./folder1/folder2/folder3/something.js');

4. 回调(Callbacks)

在JS中,函数是第一类对象。也就是说你可以像对常规对象那样对函数进行所有操作。例如指派函数到一个变量,把这些作为参数传给方法,把它们声明为对象的属性,甚至是把它们从函数里返回。

回调在JS中是异步函数,可以作为参数传递给其它函数或从其它函数里执行或返回而后再执行。这是回调的基本概念。

当我们把一个回调函数作为参数传递给另外的函数时,我们传递的仅仅是函数的定义;换言之,我们不会知道回调函数的执行时间。这完全依赖于回调函数机制。它会在稍后某个时间点进行回调调用。这是Node.js的非阻塞或异步行为的基本概念,可用下例进行说明:

setTimeout(function {
    console.log("world");
}, 2000)
console.log("hello");

这是一个最简单的调用。我们把一个匿名函数作为参数进行传递,作用是为setTimeout函数进行控制台的输出记录登记。因为这仅仅是个函数定义,我们不知道函数何时会被执行。这取决于setTimeout函数的second参数,即2S后。

首先,second记录语句记录了对控制台的输出,2S后,在回调函数中的记录语句记录了输出的内容。

// output
hello
world

写在最后

以上4点对Node.js开发者来说是要彻底理解和掌握的,建议多动手来好好体会这4个要点的含义。

原文出自: Dzone

(责编/夏梦竹)

 

转:http://toutiao.com/news/6228307537867833858/

服务器虚拟化技术的发展历程已超过十年,带来的优势价值也十分突出,而国内的企事业单位近几年才开始在小范围内尝试采用服务器虚拟化方案,其推广普及慢的原因是什么呢?

对此,深信服君曾针对国内IT人士展开大范围的线上调研。从调研的结果来看,阻碍服务器虚拟化普及的主要原因,除了担心虚拟化系统的可靠性外,虚拟化架构的复杂程度也是广大IT人士对虚拟化望而止步的重要因素。

传统虚拟化方案

组件多,部署复杂

国外传统的服务器虚拟化方案的架构确实比较复杂。它们的底层需要虚拟化平台系统,管理需要客户端组件,控制需要管理中心组件,还需要独立的备份软件,甚至还需要套件来协同各组件间的工作。最基础的架构至少也要部署管理8个组件。

若选择采用以上复杂的服务器虚拟化方案,需要考虑虚拟化平台的搭建、众多组件的合理搭配、系统的平滑迁移、平台的管理及运维等问题,不少IT管理者为了避免风险而选择暂时观望。

免费服务器虚拟化

迎合大众需求

综合多年虚拟化技术积累,继应用虚拟化及桌面虚拟化,深信服再度推出aSV服务器虚拟化方案,为IT管理者带来简化服务器运维工作、节省硬件投入成本、保障系统安全、保证业务稳定运行等好处。当然,精简的虚拟化架构也是aSV服务器虚拟化一大亮点。

time.com/upLoadFile/2015/5/6/201556175439734.jpg" alt="5分钟,轻松玩转深信服服务器虚拟化 " border="1" />

为简化复杂繁琐的服务器虚拟化部署过程,深信服aSV服务器虚拟化实现最精简的架构。IT管理者只需花费5分钟,在服务器中安装aSV虚拟化软件包,无需再安装其他组件,即可搭建功能齐全的虚拟化平台。架构即使进行了精简,但虚拟化平台的功能却很完整,如物理主机集群的管理、虚拟机的迁移、系统数据的备份恢复、虚拟机故障告警等功能都可实现。

不仅如此,深信服aSV服务器虚拟化还提供了快速虚拟化工具,帮助IT管理者快速完成物理服务器向虚拟化服务器的迁移。快速虚拟化工具相当于在原本的操作系统和硬件之间加了一个虚拟化层,可让Windows平台以最快的速度进行数据传输,只需要5-10分钟即可完成平台迁移。当然,Linux平台也可通过P2V工具,直接生成一个镜像文件并迁移到虚拟化平台。

如今,IT管理者无需再因担心复杂的虚拟化架构和部署过程而对虚拟化技术望而止步。深信服aSV服务器虚拟化通过对平台构架的精简以及系统迁移的优化,帮助IT管理者轻松部署虚拟化平台,体验更新潮的信息化建设。

这样精简好用的服务器虚拟化产品,标准版免费!点击以下链接,赶快注册体验吧!http://www.sangfor.com.cn/asv/media.html

转:http://lusongsong.com/reed/398.html

我觉得HTML5的兴起完全是因为iPhone和iPad,自从Adobe停止开发flash、Android4.0不支持flash后,我觉得在不久的将来HTML5会广泛应用,而且HTML4已经10年没更新了。

HTML5与搜索引擎优化

HTML5与HTML4代码结构对比

HTML5很多功能已经被介绍过了,比如在图片中可以直接写标题(不是alt哦),更精简的代码,直接用HTML5播放音频、视频,HTML5新增了不少内联元素,这为黑帽SEO节约了一笔不菲的时间。不过主流浏览器支持的比较少,卢松松在这里就不介绍了。

随着HTML5的到来传统的<div id="header">和<div id="footer">无处不在的代码方法现在即将变成自己的标签如<Header>和<footer>,下面以一张图来表达更为清楚:

HTML4的div+css写法

(传统的div+css写法)

HTML4的写法

(HTML5的写法)

可以看看出HTML5的代码可读性更高了,也更简洁了,内容的组织相同,但每个元素有一个明确的清晰的定义,不再被迫去猜测之间不同命名的<div>标记,搜索引擎可以更容易地衡量你网页上的内容和相关内容。

值得介绍的一些标签

虽然我们看到了HTML5的简洁和强大之处,但据我所知,很多人制作html页面的时候不会按照语义来书写代码。边栏(aside)会写成sidebar,如果是这样的话,会使网页更加混乱,最终导致搜索引擎不好理解。

noscript标签将会被大量使用,因为HTML5时代将会是一个富媒体时代。传统的文字、图片、链接、视频、音频可能已经满足不了用户的需求,大量的脚本能够编辑出丰富的信息,包括游戏、个性化设计等等。

time标签可能会作为一个来判断网页文字源,也就是能够通过time标签来识别哪篇文章是原创的。而time标签可能将是成为HTML5时代SEO们争论不休的一个标签。

video标签中间区域的文字信息将会让搜索引擎读懂视频,这是一次飞跃。

那么搜索引擎会抓取HTML5吗?

这是一篇来自Google站长论坛John Mu的文章,我觉得比较中肯,拿来给大家分享下:

一般来说,我们(Google)的搜索引擎爬虫是不能够百分百地从语法层面去精确地描述或者分析HTML中的标签的,新兴的HTML5也不例外。如果HTML5组织的网站越来越多,并且在实际当中给我们的爬虫抓取信息带来方便与效益的话,我们会尽力将完善我们的算法去迎合HTML5的标签特性。要记住的是,我没有明确地支持你们大家都用HTML5来构建网站,并且我没有明确提出希望大家的网站由于用HTML5来构建而在搜索当中获得很好的对待。HTML5仍然有许多地方需要不断完善,而如果大网站致力于运用HTML5的话将是令人振奋的事。

对于HTML5,我觉得它仍没有得到广泛的推广与应用,因此我们暂时不会将焦点放到它上面,我们不肯定使用HTML5构建的网站比用旧版本的HTML构建的网站在搜索中是否表现出优势。

Google尚未准备好,百度更不用说了。

最终用户优先(Priority of Constituencies)

“In case of conflict, consider users over authors over implementors over specifiers over theoretical purity.”

一旦遇到冲突,最终用户优先,其次是作者,其次是实现者,其次标准制定者,最后才是理论上的完满。

当HTML5提供了一些令用户兴奋的东西,其次产品得到更好的展现,其次我们可以放心地使用它们,其次元素被更谨慎的方式定义,最后搜索引擎也不再淡定了。

写在最后:

我觉得,因为HTML5现在并没有广泛地运用,而且搜索引擎支持效果也不佳,现在用HTML5来写网站并不会给你的网站带来什么好处,但我不否认将尝试用HTML5来编写卢松松博客模板。而HTML5会让搜索引擎读懂图片、视频、富媒体,一个新的时代即将到来,SEOer将会有大量的工作要去处理。

来源:卢松松博客(微信/QQ:13340454),欢迎分享本文,转载请保留出处!

在KVM中安装CentOS,ppp拨号时报错,根据错误日志查看,发现pptp没有穿透,所以按照如下方法配置防火墙后,拨号成功。

---
Starting negotiation on /dev/pts/1
sent [LCP ConfReq id=0x1 <asyncmap 0x0> <auth chap MS-v2> <magic 0xc93c30c6> <pcomp> <accomp> <mrru 1500> <endpoint [MAC:00:16:3e:d8:d7:39]>]
sent [LCP ConfReq id=0x1 <asyncmap 0x0> <auth chap MS-v2> <magic 0xc93c30c6> <pcomp> <accomp> <mrru 1500>
...
LCP: timeout sending Config-Requests
Connection terminated.
---
经搜索,发现有人提到PPTP穿透需要在iptables中配置,就像一般的路由器一样。通过lsmod查询,发现确实没有pptp模块,于是就通过以下命令加载了一下该模块:
# modprobe ip_nat_pptp
加载之后,果然能够正常拨上VPN了。

为了能够让iptables在每次启动的时候都自动加载该模块,最好在/etc/sysconfig/iptables-config中加入该模块:
IPTABLES_MODULES="ip_conntrack_netbios_ns ip_conntrack_ftp ip_nat_pptp"

----------------

pptpsetup --create pptp_hk --server xxx.xxx.xxx.xxx --username xxxxxxx --password xxxxxxx --encrypt

pppd call pptp_hk

工具:add_swap.sh
所有执行的脚本都需要root身份来执行,执行方法:以root身执行命令:bash xxx.sh

功能:自动检测系统swap分区大小,交换分区大小不合理则自动新增并挂载上
适用系统版本:兼容线上所有linux版本
执行方法:以root身执行命令:bash add_swap.sh
解决了什么问题:一键式检测系统swap分区大小,如果低于物理内存的2倍则自动创建一个物理内存2倍大小的swap分区
备注:swap不是越大越好,由于磁盘速度相对于内存较为低下,所以大swap反而会造成业务响应更慢,通常为2至2.5倍就好,如果有特殊需求可以更大。
内存为32G以上则不考虑
内存在16G至32G之间,交换分区配置为8G
内存在4G至16G之间,交换分区配置为4G
内存小于4G的则配置交换分区为2G

 

#!/bin/bash
#########################################
#Function:    add a new swap partition
#Usage:       bash add_swap.sh
#Author:      Customer service department
#Company:     Alibaba Cloud Computing
#Version:     2.1
#########################################

check_os_release()
{
  while true
  do
    if cat /proc/version | grep redhat >/dev/null 2>&1
    then
      os_release=redhat
      echo "$os_release"
      break
    fi
    if cat /proc/version | grep centos >/dev/null 2>&1
    then
      os_release=centos
      echo "$os_release"
      break
    fi
    if cat /proc/version | grep ubuntu >/dev/null 2>&1
    then
      os_release=ubuntu
      echo "$os_release"
      break
    fi
    if cat /proc/version | grep -i debian >/dev/null 2>&1
    then
      os_release=debian
      echo "$os_release"
      break
    fi
    break
    done
}

check_memory_and_swap()
{
  mem_count=$(free -m|grep Mem|awk '{print $2}')
  swap_count=$(free -m|grep Swap|awk '{print $2}')
  if [ "$mem_count" -ge 15000 ]  && [ "$mem_count" -le 32768 ]
  then
    if [ "$swap_count" -ge 8000 ]
    then
      echo -e "\033[1;40;31mYour swap is already enough.Do not need to add swap.Script will exit.\n\033[0m"
      rm -rf $LOCKfile
      exit 1
    elif [ "$swap_count" -ne 0 ]
    then
      echo -e "\033[40;32mYour swap is not enough,need to add swap.\n\033[40;37m"
      remove_old_swap
      create_swap 8192
    else
      echo -e "\033[40;32mYour swap is not enough,need to add swap.\n\033[40;37m"
      create_swap 8192
    fi
  elif [ "$mem_count" -ge 3900 ] && [ "$mem_count" -lt 15000 ]
  then
    if [ "$swap_count" -ge 3900 ]
    then
      echo -e "\033[1;40;31mYour swap is already enough.Do not need to add swap.Script will exit.\n\033[0m"
      rm -rf $LOCKfile
      exit 1
    elif [ "$swap_count" -ne 0 ]
    then
      echo -e "\033[40;32mYour swap is not enough,need to add swap.\n\033[40;37m"
      remove_old_swap
      create_swap 4096
    else
      echo -e "\033[40;32mYour swap is not enough,need to add swap.\n\033[40;37m"
      create_swap 4096
    fi
  else
    if [ "$swap_count" -ge 2000 ]
    then
      echo -e "\033[1;40;31mYour swap is already enough.Do not need to add swap.Script will exit.\n\033[0m"
      rm -rf $LOCKfile
      exit 1
    elif [ "$swap_count" -ne 0 ]
    then
      echo -e "\033[40;32mYour swap is not enough,need to add swap.\n\033[40;37m"
      remove_old_swap
      create_swap 2048
    else
      echo -e "\033[40;32mYour swap is not enough,need to add swap.\n\033[40;37m"
      create_swap 2048
    fi
  fi
}

create_swap()
{
  root_disk_size=$(df -m|grep -w "/"|awk '{print $4}')
  if [ "$1" -gt "$((root_disk_size-1024))" ]
  then
    echo -e "\033[1;40;31mThe root disk partition has no space for $1M swap file.Script will exit.\n\033[0m"
    rm -rf $LOCKfile
    exit 1
  fi
  if [ ! -e $swapfile ]
  then
    dd if=/dev/zero of=$swapfile bs=1M count=$1
    /sbin/mkswap $swapfile
    /sbin/swapon $swapfile
    /sbin/swapon -s
    echo -e "\033[40;32mStep 3.Add swap partition successful.\n\033[40;37m"
  else
    echo -e "\033[1;40;31mThe /var/swap_file already exists.Will exit.\n\033[0m"
    rm -rf $LOCKfile
    exit 1
  fi
}

remove_old_swap()
{
  old_swap_file=$(grep swap $fstab|grep -v "#"|awk '{print $1}')
  swapoff $old_swap_file
  cp -f $fstab ${fstab}_bak
  sed -i '/swap/d' $fstab
}

config_rhel_fstab()
{
  if ! grep $swapfile $fstab >/dev/null 2>&1
  then
    echo -e "\033[40;32mBegin to modify $fstab.\n\033[40;37m"
    echo "$swapfile	 swap	 swap defaults 0 0" >>$fstab
  else
    echo -e "\033[1;40;31m/etc/fstab is already configured.\n\033[0m"
    rm -rf $LOCKfile
    exit 1
  fi
}

config_debian_fstab()
{
  if ! grep $swapfile $fstab >/dev/null 2>&1
  then
    echo -e "\033[40;32mBegin to modify $fstab.\n\033[40;37m"
    echo "$swapfile	 none	 swap sw 0 0" >>$fstab
  else
    echo -e "\033[1;40;31m/etc/fstab is already configured.\n\033[0m"
    rm -rf $LOCKfile
    exit 1
  fi
}

##########start######################
#check lock file ,one time only let the script run one time 
LOCKfile=/tmp/.$(basename $0)
if [ -f "$LOCKfile" ]
then
  echo -e "\033[1;40;31mThe script is already exist,please next time to run this script.\n\033[0m"
  exit
else
  echo -e "\033[40;32mStep 1.No lock file,begin to create lock file and continue.\n\033[40;37m"
  touch $LOCKfile
fi

#check user
if [ $(id -u) != "0" ]
then
  echo -e "\033[1;40;31mError: You must be root to run this script, please use root to install this script.\n\033[0m"
  rm -rf $LOCKfile
  exit 1
fi

os_release=$(check_os_release)
if [ "X$os_release" == "X" ]
then
  echo -e "\033[1;40;31mThe OS does not identify,So this script is not executede.\n\033[0m"
  rm -rf $LOCKfile
  exit 0
else
  echo -e "\033[40;32mStep 2.Check this OS type.\n\033[40;37m"
  echo -e "\033[40;32mThis OS is $os_release.\n\033[40;37m"
fi

swapfile=/var/swap_file
fstab=/etc/fstab

echo -e "\033[40;32mStep 3.Check the memory and swap.\n\033[40;37m"
check_memory_and_swap

echo -e "\033[40;32mStep 4.Begin to modify $fstab.\n\033[40;37m"
case "$os_release" in
redhat|centos)
  config_rhel_fstab
  ;;
ubuntu|debian)
  config_debian_fstab
  ;;
esac

free -m
echo -e "\033[40;32mAll the operations were completed.\n\033[40;37m"
rm -rf $LOCKfile

下载建立SWAP分区脚本

转:http://blog.jobbole.com/48769/

一些我更愿意在开始就知道东西

利用 Node.js 开发是一个非常有趣,和令人满足的过程, 它有3万多个模块可以选择使用,并且所有的模块可以非常容易的集成入现有的应用之中。

无论如何,对于一些刚开始使用Node.js 开发的的人来说, 很容易碰壁,在这个文章中,我会提到在你学习过程中遇到的问题。

贴士 1: 在开发环境使用 nodemon, 在生产环境使用pm2

当你第一次开发Node.js应用的时候, 其中一件事情就是一次又一次的运行[file].js 就和揭伤疤一样。 当我第一次开发的node app时候,这个让我感到异常挫败和痛苦, 尤其是每当我修改很小东西的时候需要control+c

幸运的是我发现了一个非常棒的工具Nodemon。 你可以利用以下的命令来安装

1
npm install -g nodemon

Nodemon 是一个令人惊叹的工具, 当你全局安装它以后, 可以通过 nodemon [file].js 来启动你的node.js scripts,它会告诉nodemon来监视你的script和scripts的所有变化, 这样的Node.js开发方式非常震撼以及让大大提高开发速度。

那么,生产环境又如何, 除非你用了herokuNodejitsu或者其它一些好的 Node.js 平台(也许它们有类似的功能), 但是碰巧你用了EC2 或者一些其它的云平台来运行你的Node.js app, 你如何能然保证这是一个始终运行的Node.js app

案就是PM2, PM2 是一个类似于Nodemon的工具,不同之处在于它用于生产环境, 和Nodemon相似的地方在于它会监控你的app的任何修改或者重新部署,但是有更好的一面, PM2 在遭遇到崩溃的时候,它会正确重启你的app。

PM2的优胜之处在于当你要将app需要多核处理的时候,PM2内部集成的负载均衡可以让你很容易的去指定运行多少个实例。

1
pm2 start app.js -i max

-i参数目的是指定运行多少个实例,在这个例子中 PM2 使用了一个常量max来扩展你的app运转到你最大的核数,不要忘记Node 平时只会运行在单核!

http://www.nodebeginner.org/index-zh-cn.html

Node入门

作者: Manuel Kiessling
翻译: goddyzhao & GrayZhang & MondayChen

关于

本书致力于教会你如何用Node.js来开发应用,过程中会传授你所有所需的“高级”JavaScript知识。本书绝不是一本“Hello World”的教程。

状态

你正在阅读的已经是本书的最终版。因此,只有当进行错误更正以及针对新版本Node.js的改动进行对应的修正时,才会进行更新。

本书中的代码案例都在Node.js 0.6.11版本中测试过,可以正确工作。