安装 Go


Mac OS X 安装 go:

  • 下载 go 安装包并执行
  • 配置环境变量
  • 执行编译测试
export GOROOT=/usr/local/go
export GOPATH=$HOME/.gopath
export PATH=$PATH:$GOROOT/bin

GOROOT:
其中 GOROOT 是 go 的安装目录,也是 go 二进制执行文件的路径。

GOPATH:
go install/go get 和 go 的工具等会用到 GOPATH 环境变量。
GOPATH 是作为编译后二进制的存放目的地和 import 包时的搜索路径。其实也是你的工作目录, 你可以在 src 下创建你自己的 go 源文件, 然后开始工作。GOPATH 之下主要包含三个目录: bin、pkg、src。
bin 目录主要存放可执行文件; pkg 目录存放编译好的库文件; src 目录下主要存放 go 的源文件。不要把 GOPATH 设置成 go 的安装路径。





阅读全文

开源分布式计算系统框架比较


分布式计算在许多领域都有广泛需求,目前流行的分布式计算框架主要有 Hadoop MapReduce, Spark Streaming, Storm。 这三个框架各有优势,现在都属于 Apache 基金会下的项目。
Hadoop MapReduce 是三者中出现最早,知名度最大的分布式计算框架,最早由 Google Lab 开发,使用者遍布全球,主要适用于大批量的集群任务,由于是批量执行,故时效性偏低,原生支持 Java 语言开发 MapReduce ,其它语言需要使用到 Hadoop Streaming 来开发。Spark Streaming 保留了 Hadoop MapReduce 的优点,而且在时效性上有了很大提高,中间结果可以保存在内存中,从而对需要迭代计算和有较高时效性要求的系统提供了很好的支持,多用于能容忍小延时的推荐与计算系统。Storm 一开始就是为实时处理设计,因此在实时分析/性能监测等需要高时效性的领域广泛采用,而且它理论上支持所有语言,只需要少量代码即可完成适配器。


阅读全文

Error: Can't set headers after they are sent


NodeJS 启动,出现如下报错。

Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:335:11)
at ServerResponse.header (/server/node/opstools/node_modules/express/lib/response.js:700:10)
at ServerResponse.send (/server/node/opstools/node_modules/express/lib/response.js:154:12)
at fn (/server/node/opstools/node_modules/express/lib/response.js:934:10)
at View.exports.renderFile [as engine] (/server/node/opstools/node_modules/ejs/lib/ejs.js:353:10)
at View.render (/server/node/opstools/node_modules/express/lib/view.js:93:8)
at EventEmitter.app.render (/server/node/opstools/node_modules/express/lib/application.js:566:10)
at ServerResponse.res.render (/server/node/opstools/node_modules/express/lib/response.js:938:7)
at /server/node/opstools/app.js:43:9
at Layer.handle_error (/server/node/opstools/node_modules/express/lib/router/layer.js:58:5)

阅读全文

NodeJS 我只需要一个店小二


美丽的七侠镇上有一条美食街,很多著名的饭店都开在这里,有老字号的 Apache、PHP, 最近几年火热的 Ruby on Rail,还有那些重量级的餐饮集团 Websphere、Weblogic 等。
这些饭店老板根据自己的实力,或多或少的雇佣了一些店小二来招待来客,这些小二干活都非常殷勤,没有一个偷懒耍滑,把顾客招待的舒舒服服,所以平日里饭馆运转的还不错,相安无事。
但是随着《武林外传》的拍摄和播放,七侠镇旅游业大爆发,游客像潮水一样蜂拥而至,现有的店小二招待不过来了,到了饭点,每家的门前都排起了长队,游客们吃不上饭,个个怨声载道。
看到这种情况,有些老板咬了咬牙,在人工费不断上涨的情况下,多雇了一些小二来帮忙,无奈总是赶不上顾客增长的速度。
某一天有个美国老外来到七侠镇上旅游,也看到了吃不上饭的问题,他仔细分析了一番后发现了一个秘密:原来这些店都采用了同一套叫做“全程贴心服务”的模式,这个模式很有意思:客人来了以后,马上有个店小二殷勤迎上去,带着找座位,点菜,给后厨下单。由于后厨做菜需要很长时间,店小二就在客人的旁边等着。后厨一摇铃铛,大喊一声:上菜,店小二马上端到客人面前,然后站在一边等着客人吃完。客人说:结账,小二收钱,找钱,送客,迎接下一位。通常这个时候门口都排成了好几百人了!
这个 VIP 服务实在是太贴心了!导致的结果很明显,饭店有几个店小二,就只能同时接待几个顾客。
老外一声不吭的回去了。
过了几个月,美食一条街上出现了一个巨火无比的饭馆:NodeJS
虽然这个饭店中人满为患,可门口竟然没有排队的!
更让人吃惊的是,这个店里声称:我只需要一个店小二。










阅读全文

Python 实现经典排序算法


插入排序:
插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。

def insert_sort(lists):
    count = len(lists)
    for i in range(1, count):
        key = lists[i]
        j = i - 1
        while j >= 0:
            if lists[j] > key:
                lists[j + 1] = lists[j]
                lists[j] = key
            j -= 1
    return lists

阅读全文

Python dict 排序


对 dict 排序的方法,主要是把 dict 中的元素分离出来放到一个 list 中,对 list 排序,从而间接实现对 dict 的排序。
这个"元素"可以是 key、value 或者 item。

# -*- coding: utf-8 -*-

adict = {
    "a" : 2,
    "c" : 1,
    "b" : 3
}

def sortedDictValues1(self):
    items = self.items()
    items.sort()
    return [value for key, value in items]

newAdict1 = sortedDictValues1(adict)
print newAdict1

def sortedDictValues2(self):
    keys = self.keys()
    keys.sort()
    return [self[key] for key in keys]

newAdict2 = sortedDictValues2(adict)
print newAdict2

newAdict3 = [(k,adict[k]) for k in sorted(adict.keys())] 
print newAdict3

def sort_by_value(self):
    items = self.items()
    backitems = [[v[1],v[0]] for v in items]
    backitems.sort()
    return [backitems[i][1] for i in range(0,len(backitems))]

newAdict4 = sort_by_value(adict)
print newAdict4

newAdict5 = [ v for v in sorted(adict.values())] 
print newAdict5

newAdict6 = sorted(adict.items(), lambda x, y: cmp(x[1], y[1]))
print newAdict6

newAdict7 = sorted(adict.items(), lambda x, y: cmp(x[1], y[1]), reverse=True)
print newAdict7

newAdict8 = sorted(adict.items(), key=lambda d: d[0])
print newAdict8

newAdict9 = sorted(adict.items(), key=lambda d: d[1])
print newAdict9
阅读全文

Python 获取昨天、今天、明天


# -*- coding: utf-8 -*-

import datetime
import time

# get date
today = datetime.date.today()
print today

oneday = datetime.timedelta(days=1)
yesterday = today - oneday
print yesterday

tomorrow = today + oneday
print tomorrow
阅读全文