zz Dojo Javascript 编程规范
前言
相当不错的 Javascript 编程风格规范,建议大家采用此规范编写 Javascript。原文链接: http://dojotoolkit.org/developer/StyleGuide 。
翻译(Translated by):i.feelinglucky{at}gmail.com from http://www.gracecode.com ,转载请注明出处、作者和翻译者,谢谢配合。
本文地址: http://code.google.com/p/grace/wiki/DojoStyle 。
序
Any violation to this guide is allowed if it enhances readability.
所有的代码都要变成可供他人容易阅读的。
快读参考
核心 API 请使用下面的风格:
| 结构 | 规则 | 注释 |
| 模块 | 小写 | 不要使用多重语义(Never multiple words) |
| 类 | 骆驼 | |
| 公有方法 | 混合 | 其他的外部调用也可以使用 lower_case(),这样的风格 |
| 公有变量 | 混合 | |
| 常量 | 骆驼 或 大写 |
下面的虽然不是必要的,但建议使用:
| 结构 | 规则 |
| 私有方法 | 混合,例子:_mixedCase |
| 私有变量 | 混合,例子:_mixedCase |
| 方法(method)参数 | 混合,例子:_mixedCase, mixedCase |
| 本地(local)变量 | 混合,例子:_mixedCase, mixedCase |
zz HTML代码编写规范和建议
使用HTML5的DOCTYPE声明
<!DOCTYPE html> ,目前IE6,IE7还不认识,所以会以标准模式渲染页面。但是在其他浏览器下,在图文混排时图片下方会出现间隔空隙。 解决办法:
img {
vertical-align: bottom;
}
页面显示字符集
使用HTML5的简写方式: <meta charset="utf-8" />
遵循xhtml 1.0规则
这里只是为了编写HTML代码时,统一规范而已,在HTML5中已经不需要这样严格了,但是我们还是要规范下比较好。
- 所有标签必须结束;
- 所有标签必须小写;
- 标签属性都必须用引号引起来(单引号或双引号);
- 标签属性必须有值:
<select> <option selected="selected"></option> </select> <input type="checkbox" checked="checked" /> - 所有特殊符号必须转义。
How MapReduce Works
一、从Map到Reduce
MapReduce其实是分治算法的一种实现,其处理过程亦和用管道命令来处理十分相似,一些简单的文本字符的处理甚至也可以使用Unix的管道命令来替代,从处理流程的角度来看大概如下:
cat input | grep | sort | uniq -c | cat > output # Input -> Map -> Shuffle & Sort -> Reduce -> Output
简单的流程图如下:
对于Shuffle,简单地说就是将Map的输出通过一定的算法划分到合适的Reducer中进行处理。Sort当然就是对中间的结果进行按key排序,因为Reducer的输入是严格要求按key排序的。
HDFS简介
一、HDFS
HDFS全称是Hadoop Distributed System。HDFS是为以流的方式存取大文件而设计的。适用于几百MB,GB以及TB,并写一次读多次的场合。而对于低延时数据访问、大量小文件、同时写和任意的文件修改,则并不是十分适合。
目前HDFS支持的使用接口除了Java的还有,Thrift、C、FUSE、WebDAV、HTTP等。HDFS是以block-sized chunk组织其文件内容的,默认的block大小为64MB,对于不足64MB的文件,其会占用一个block,但实际上不用占用实际硬盘上的64MB,这可以说是HDFS是在文件系统之上架设的一个中间层。之所以将默认的block大小设置为64MB这么大,是因为block-sized对于文件定位很有帮助,同时大文件更使传输的时间远大于文件寻找的时间,这样可以最大化地减少文件定位的时间在整个文件获取总时间中的比例 。
构成HDFS主要是Namenode(master)和一系列的Datanode(workers)。Namenode是管理HDFS的目录树和相关的文件元数据,这些信息是以"namespace image"和"edit log"两个文件形式存放在本地磁盘,但是这些文件是在HDFS每次重启的时候重新构造出来的。Datanode则是存取文件实际内容的节点,Datanodes会定时地将block的列表汇报给Namenode。
由于Namenode是元数据存放的节点,如果Namenode挂了那么HDFS就没法正常运行,因此一般使用将元数据持久存储在本地或远程的机器上,或者使用secondary namenode来定期同步Namenode的元数据信息,secondary namenode有点类似于MySQL的Master/Salves中的Slave,"edit log"就类似"bin log"。如果Namenode出现了故障,一般会将原Namenode中持久化的元数据拷贝到secondary namenode中,使secondary namenode作为新的Namenode运行起来。
简单的Streaming和Pipes示例
一、Hadoop Streaming
Streaming是Hadoop提供的一个可以使用其他编程语言来进行MapReduce来的API,因为Hadoop是基于Java(由于作者比较擅长Java,Lucene和Nutch都是出于Hadoop的作者)。Hadoop Streaming并不复杂,其只是使用了Unix的标准输入输出作为Hadoop和其他编程语言的开发接口,因此在其他的编程语言所写的程序中,只需要将标准输入作为程序的输入,将标准输出作为程序的输出就可以了。
在标准的输入输出中,key和value是以tab作为分隔符,并且在reduce的标准输入中,hadoop框架保证了输入的数据是经过了按key排序的。
下面的示例是用Python重写了上一个示例:
# max_temperature_map.py
#!/usr/bin/env python
import sys
for line in sys.stdin:
val = line.strip().split()
# 分隔年份和温度值,输出到标准输出
print "%s\t%s"%(val[0], val[1])
# max_temperature_reduce.py
#!/usr/bin/env python
import sys
(last_key, max_val) = (None, 0)
for line in sys.stdin:
(key, temp) = line.strip().split('\t')
if last_key and last_key != key:
print "%s\t%s" % (last_key, max_val)
(last_key, max_val) = (key, int(temp))
else:
(last_key, max_val) = (key, max(max_val, int(temp)))
if last_key:
print "%s\t%s" % (last_key, max_val)