Linux下设置服务器之间的时间同步

项目开发和测试中用到的服务器之间,包括Linux和Windows服务器,需要配置时间同步。在网上找到一个使用Linux NTPD服务的方法。

首先配置一台服务器作为基准时间。

  1. 编辑/etc/ntpd.conf文件如下,这里假设服务器打IP是192.168.1.12
server 127.127.1.0 minpoll 4
fudge 127.127.1.0 stratum 1
restrict 127.0.0.1
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap
driftfile /var/lib/ntp/drift

2: /etc/ntp/ntpservers应置空
3: /etc/ntp/step-tickers应配置为 127.127.1.0

运行service ntpd restart后即可启动服务。运行ntpq -p或者nptstat可查询服务器状态。

配置Linux客户端来接收基准时间

  1. 编辑/etc/ntpd.conf文件
server 192.168.1.12 minpoll 4
fudge 127.127.1.0 stratum 2
restrict 127.0.0.1
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap
driftfile /var/lib/ntp/drift

2: /etc/ntp/ntpservers应置空
3: /etc/ntp/step-tickers应配置为 192.168.1.12

运行service ntpd restart后即可启动服务。运行ntpq -p或者nptstat可查询服务器状态。

Windows客户端

使用时间设置里的Internet时间,将服务器地址填写为192.168.1.12即可

使用node-webkit创建跨平台桌面程序

最近需要帮朋友快速写一个简单的桌面应用,类似于心理测评的那种,一开始选择使用的技术:QT——C++很久没用,Java Swing——需要温习下才能上手,HTML+JS——实现起来最快,但是怎么才能打包成桌面程序。

在网上搜到TideSDK的软件,可以把HTML程序打包成跨平台应用,但是试用了下发现在Windows下用起来很麻烦;然后就看到了node-webkit,发现在Mac和Windows平台都非常容易使用。

Node-Webkit整合了Chrome浏览器核心和Node.js运行环境,开发人员可以编写既访问浏览器DOM又使用Node.js包的JavaScript程序,前端和后端的界限就此模糊。。。

Node-Webkit其实是一个可执行文件nw.exe和一系列dll依赖,它可以执行任意打包好的.nw文件(就是一个压缩成zip后的html+js文件夹),但最终用户来可能希望拿到一个单一的可执行文件,这就需要进行应用程序打包。

Mac平台

Mac平台可以使用Nuwk!来创建打包程序,非常简单。

Windows平台

Windows平台相对比较复杂:

  1. https://github.com/rogerwang/node-webkit下载windows开发SDK
  2. 创建并使用web和nodejs创建应用程序
  3. 把应用程序打包成zip文件,并将后缀名改成.nw,这样该.nw文件就可以被node-webkit直接打开了
  4. 把app.nw(前面打包的文件)复制到node-webkit文件夹下,并运行命令copy /b nw.exe+app.nw app.exe 来合并两个文件
  5. 使用Enigma Virtual Box软件来打包node-webkit依赖和app.nw到一个可执行文件

详细信息请参考:https://github.com/rogerwang/node-webkit/wiki/How-to-package-and-distribute-your-apps

Akka学习资料

Akka 使用模式(Patterns)

消息控制 Throttling Messages in Akka

缓存控制 Case Study: An Auto-Updating Cache Using Actors

负载均衡 Balancing Workload Across Nodes with Akka 2

Push模式 Akka Work Pulling Pattern to prevent mailbox overflow

终止模式 An Akka 2 Terminator

Spider模式 Discovering message flows in actor systems with the Spider Pattern

分布式协议

Gossip protocal http://en.wikipedia.org/wiki/Gossip_protocol

CRDT http://hal.upmc.fr/docs/00/55/55/88/PDF/techreport.pdf

The ϕ Accrual Failure Detector http://ddg.jaist.ac.jp/pub/HDY+04.pdf

Paxos

2PC

应用

Distributed (in-memory) graph processing with Akka http://letitcrash.com/post/30257014291/distributed-in-memory-graph-processing-with-akka

参考文献

http://www.ics.uci.edu/~cs223/papers/cidr07p15.pdf
Mesos paper http://mesos.berkeley.edu/mesos_tech_report.pdf
A Note on Distributed Computing http://doc.akka.io/docs/misc/smli_tr-94-29.pdf

DataScience课程:机器学习算法

这是我学习DataScience课程的第三篇博客,通过这段时间的学习又有一些心得和体会。我理解了数据科学(Data Science)这个看起来很抽象的概念的内涵,我觉得包括几个层次:

  • 数据层:对大容量数据的保存和查询,包括数据库(传统和非传统),分布式文件系统
  • 计算层:对分布式计算资源(CPU和内容)的调度和抽象,包括计算框架MapReduce,Spark以及像Mesos之类的资源管理框架
  • 算法层:基于数据和计算资源实现数据分析和机器学习算法,包括Hive,Shark之类的SQL实现,MLib之类的机器学习实现,以及各种用户自定义的算法实现
  • 分析展示层:基于算法运行结果来展示数据,像Tableau等商业智能工具

然后,我越来越觉得数据科学或者说大数据不是一项技术,而是多个技术的混合。简单来说,前述层次中数据层和计算层的基础是分布式系统,其需要解决的主要问题是数据的可靠性和一致性,分布式资源的调度和网络通信;算法层和展示层的技术则是统计学,机器学习,数据挖掘和可视化等技术。

对于有志在数据科学这个方向长期发展的开发者来说,首先是必须对各个层次的技术和工具都所有理解,至少做到能够使用现有的工具和算法;其次是专注于某个方向(例如算法)的研究和实现。不管哪个方向,坚持第一。

好了,闲话少说,接下来就几个常见的机器学习算法记录下我个人的理解。

基础算法:K近邻

K近邻算法是直接使用原始数据集来进行分类的算法,所以不需要有模型训练过程。简单来说,对于任意一个带分类点x,我们从数据集中找到K个与x距离最近的点,然后在这K个点中找到最常出现的类别C,则x的分类为C。

优点:实现简单,无需进行训练
缺点:计算复杂度高,保存原始数据集需要很大的存储空间

请输入图片描述

概率算法:朴素贝叶斯

朴素贝叶斯方法的思想是:1)某件事发生的先验概率是已知的;2)影响事物发生的因素之间是相互独立的。

使用朴素贝叶斯算法的流程是:

  • 从原始数据集中计算各种可能分类结果的先验概率:

    p(Ci)

  • 提前计算好结果对各个数据维度的条件概率:

p(x1 | Ci), p(x2 | Ci), ..., p(xN | Ci)

  • 其中, p( xj | Ci ) 为在结果Ci发生的情况下,因素xj(相对于所有其他因素)的出现频率,即因素对结果的贡献程度

  • 则最终分类某个输入条件Y只需要参考:

p( Ci | Y ) = p( Y | Ci ) * p(Ci) = p(y1 | Ci) * p(y2 | Ci) * ... * p(yN | Ci) * p(Ci)

  • 以上算式所有项都是已经提前计算好了
  • 计算完所有的 p(C1 | Y),... 后,只需要比较各个分类出现的可能性大小即可决定最终分类

在具体是实现算法时,建议使用对数概率:

log(p( Y | Ci ) * p(Ci))
= log(p( Y | Ci )) + log(P(Ci))
= log(p(y1 | Ci)) + log(p(y2 | Ci)) + ... + log(p(yN | Ci)) + log(p(Ci))

优化算法:logistic回归,SVM

logistic回归

Logistic回归的核心思想是使用一个阶跃函数来把某个线性空间映射到非线性空间,这样在非线性空间中可以方便的进行分类。所以该算法需要确定的参数包括:

线性空间的参数,z = w0x0 + w1x1 + ... + wn*xn

w0,...,wn即线性空间的参数。

阶跃函数的选择,一般选用Sigmoid函数:

1/(1+exp(-z))

请输入图片描述

一般可以使用梯度下降算法来求得。本质上Logistic回归还是一种线性模型,即决策边界是线性的。

SVM

SVM的基本原理是计算一个超平面来分割数据,使得不同类别数据在被最优分割的前提下,使得超平面尽量原理数据。这就涉及到一个复杂的多目标优化问题,通过引入拉格朗日乘子法可以稍微简化,但具体实现时还是需要用到特殊的算法,例如SMO。

使用超平面分割数据的前提是数据线性可分,对于不可线性可分的数据可以引入核函数来映射原始数据到高维空间。

想要深刻理解其中的思想建议阅读更多资料,例如http://blog.csdn.net/v_july_v/article/details/7624837

树算法:决策树,CART算法

决策树

考虑一个有N个属性的数据集,通过组合一个或者若干个属性的取值(或者取值范围)可以产生一条规则,每条规则都可以把数据划分成一个子集,然后在子集内使用其他规则来进一步划分数据集。这些规则的组合就是决策树,即一系列互相嵌套的规则。

最简单的一种决策树是,每个规则只会使用一个数据属性和取值,例如如下规则集:

请输入图片描述

决策树的构造也很简单的,基本流程(Branch)是:

  • 对于当前数据集,得到所有属性和属性的所有取值
  • 如果数据都属于一个类,则不需要继续操作,直接返回类标签
  • 否则,找到一个可以最优划分数据集的属性和取值 (这个稍后介绍)
  • 创建一条规则(按照上面找到的属性和取值)作为节点(parent node)
  • 划分数据集,在新得到的数据集上,分别执行这个Branch流程构造子节点(child node)

对于如何找到最优划分属性和取值这个问题,基本思路是使得划分后的子集的信息熵之和尽量小(即系统变得有序),具体实现时需要遍历每种可能构造的规则(属性和取值组合)来计算划分后数据集的信息熵。

上述算法构造的决策树只适合离散型的数据,并且只用于分类。

CART算法

分类回归树算法:CART(Classification And Regression Tree)算法采用一种二分递归分割的技术,将当前的样本集分为两个子样本集,使得生成的的每个非叶子节点都有两个分支。因此,CART算法生成的决策树是结构简洁的二叉树。

具体可以参考文章:http://blog.csdn.net/hewei0241/article/details/8280490

聚类:K均值

K均值聚类算法是最容易理解的聚类算法,首先对于待分组的数据,确定分组的数目G,然后随机确定G个聚类中心,然后开始不断的迭代。对于每次迭代,根据当前的聚类中心,我们根据距离远近把每个数据点都分配到一个中心(可以理解为把牌发到若干个人手里),分配完成后,我们按照质心算法重新计算聚类中心(重新洗牌),然后开始下一个迭代(重新发牌)。

频繁项挖掘:Apriori,FP-Growth

Apriori

TODO

FP-Growth

TODO

前端开发技术(2):测试与编译

在AngularJS项目开发过程中,当完成一个相对独立的模块实现后,我经常会回过头来修改和优化代码,而涉及到代码改动的部分经常需要进行重新测试。在这种情况下,如果前期定义好了一个较好的测试框架,并经常性地编写测试代码,则后期的开发工作会比较省力。

一般来说前端的测试可以分为单元测试,端对端(End-to-End)测试和集成测试。个人理解如下:

  • 单元测试可以用来测试小部分独立代码,例如AngularJS中的Controller,Service等。单元测试不需要连接到后台服务,一般也不需要运行完整的前端应用。
  • E2E测试可以测试一小段界面的交互操作的正确性,例如表单验证,页面跳转等。E2E测试一般需要在浏览器中打开整个(或者部分)前端应用,但在涉及后台服务的部分,可以通过mock技术或者本地服务器来模拟。
  • 集成测试,指的是前后台都使用的程序,而且一般是根据业务需求来测试程序,属于黑盒测试。

作为开发人员的我们更多地会使用单元测试和E2E测试,并且希望尽可能的自动化这一过程。

继续阅读→

2014-08技术学习

couchdb.png

CouchDB

CouchDB的几个突出特点是:

  • 基于乐观锁实现的并发控制
  • 单个文本的持久化
  • 支持视图
  • 次级索引
  • 不支持分片,数据在多个服务器上要么全备份,要么没有备份
  • 完全基于RESTFUL的API
#安装
brew install couchdb

#启动
couchdb

#打开web界面
http://localhost:5984/_utils/

#建立数据库
#创建文档

继续阅读→

DataScience课程:使用Spark交互分析数据

最近在Course上学习数据科学导论这个课程,其中有一个课程作业是让学生在kaggle上参与一个数据分析或者机器学习竞赛,这边记录下在完成这个作业过程中学习的一些东西。
请输入图片描述

在本地运行Spark

http://spark.apache.org/下载Spark官方发行包并解压到目录。在开发阶段在本地可以有两种模式来使用spark。

第一种是在本地启动一个spark实例,只需要运行sbin/start-all.sh默认会启动一个master和worker即可。这会在背后为你运行一个spark服务端,默认端口7077,这样开发者可以用scala,python等语言编写连接到服务端的数据处理脚本。通过sbin/stop-all.sh可以关闭服务端。

另一种是通过运行sbin/spark-shell启动一个REPL,它其实是一个scala的REPL,但已经预加载好sparkContext供开发者来进行即时查询。

继续阅读→