写在毕业一年后
不经不觉毕业也一年了,走得太匆忙,并没有和大家留下什么伤感的回忆。
从入职到现在,除了觉得时间过得很快之外,就是觉得自己没有把握好时间,或者毕业后各方面的原因学习动力和激情也比不上在学校的时候。
回头看看这一年……
09年的下半年,大部分时间是投入在研究fopen这个Facebook开源SNS,由于这是搭建在Linux平台并用php和c++写的,Linux和php这两方面对我来说都不太熟悉,折腾了好长的一段时间。fopen并没有原本所期待那样能够真正地投入到正式的产品使用,更多的,它只是Facebook的一个超级简化版,而且文档也相当地不完整,整个fopen依赖的库文件也很多,我当时也没能弄明白这些库文件是做什么的。在改写JavaScript的部分,虽然代码逻辑是比较清晰,但是像它那样的逻辑重写1000的JavaScript代码都要10多秒,不知道它在正式投入使用的时候是怎么提升解析速度的,又或者是正式产品中是使用了C++重写或者利用其他的一些缓存技术。在OpenAPI部分,那时候还弄不明白那个timestamp和callback的参数作用,后来才明白timestamp是用于防止replay attack,而callback是为了使用jsonp的,只怪当时知识面太窄了。虽然最后也用python实现了类似的JavaScript Parser和OpenAPI以及JavaScript client lib,但实际上需要完善的空间实在太多,只是时间无法安排过来。、
09年11月份开始的时候封闭开发了好长一段时间,封闭开发最大的体会就是环境很安静,但人能够很集中精神地开发,效率的确高很多。其实这段时间最大的收获是在美林的时候认识了老邓,他是云风带领的那个工作室的成员,他把我带进了函数式编程的世界,跟我讲了很多除了c++、java、.net之外的其他语言情况,比如lisp、squeak、haskell、erlang等等,还跟我讲了计算机世界里面一些有意思的事情和人物,并介绍了好几本书给我。作为刚毕业的新人,老员工知识和经验的分享正是新人所需要的。
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运行起来。