函数式编程之闭包
维基百科中是这样定义闭包的:在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。
这里有两点需要把握,自由变量和函数。则判断是不是闭包首先判断是不是函数,如果都不是函数那么肯定不是闭包,是函数再继续判断是否有自由变量。自由变量就是这里的重点了。。。
个人简单粗暴的将自由变量理解为当前函数引用的外部变量。
这里先举个例子简单感受下,看个golang代码:
123456func f(i int) func() int { return func() int { i++ return i }}
f是个function,此方法是返回一个function(由于f返回的function无法在外部访问,没有必要给他起名字,所以就直接返回一个匿名函数)。其中变量i是f的参数,是f的局部变量,匿名函数在f的命名空间内,可以引用变量i ...
全栈Voting Dapp Demo
本篇其实算是一篇译文,但不是直译,而是神译。(意会一下就ok了。。)原文地址
上一篇详细介绍了官方Voting例子,本篇趁热打铁,介绍下这样的一个Voting在实际中怎么使用。
本篇所要介绍的是一个简单的web应用,首先初始化一批候选人,然后所有登录页面的人都可以为这些候选人投票,并展示每个候选人的得票数。
先来看下整个Application的架构图:
部署开发环境开发都离不开测试,更离不开测试环境,尤其是区块链相关的开发,如果直接在公网上测试,那损失的可真的是真金白银。所以我们先搞个开发环境,这个测试环境比较简单,也容易安装。它就是ganache,是一个基于内存的区块链测试工具。
ganache是nodejs的一个模块,安装命令为cnpm install ganache-cli web3@0.20.2
这里使用cnpm,是安装了淘宝的nodejs源,访问国外的太慢
执行node_modules/.bin/ganache-cli开启测试区块链,此命令为默认生成10测试账号,每个账号有100ETH,如下:
Voting合约代码此代码与上一篇中的代码不一样,没有那个复杂,本篇重 ...
Application运行失败导致RM主备切换
先说故障现象:某天收到RM主备切换报警,正常切换并不会有什么影响,但我当时还是出于警觉想去服务器上check下为什么切,check的时候发现集群无法提交任务,所以的任务都被挂起了。第一反应是原standby节点有问题,于是手动又触发了一次切换,但任务依然无法运行。主备RM都重启过了但问题依然无法解决,那只能使用终极杀手锏了,重启了整个yarn集群。集群重启之后任务恢复了,心里舒了一口气,去查RM的log吧,看下是什么原因导致了这次故障,log还没有细看,只看到一些KeeperErrorCode = ConnectionLoss,此时悲剧发生了,又收到了RM切换的报警,任务又被挂起了。。。
毫无头绪,只能再次重启集群,这次重点关注了下集群上运行任务,估计是哪个任务把集群给干瘫了,观察到有个任务运行失败的时候集群就会被瘫,看了下该任务的报错信息特别特别的长,于是告诉任务的负责人暂时把任务停掉,观察下集群是不是因为这个任务导致的。
该任务停掉之后集群正常运行了一段时间,在这段时间内在查RM的log并没有发现太多有价值的东西,全是与zk的连接丢失,连接丢失确实是会触发主备切换,但关键是为什么连 ...
Solidity Voting解析
最近一直在学习BlockChain相关的知识,Ethereum网上也没有太好的资料,就先拿官网的一些example学习下吧。
本篇解析下使用智能合约编写的投票合约。
先看下代码,注释给的也比较清楚,虽然是一门新的语言,但读懂应该没有什么难度
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133pragma solidity ^0.4.22;/// @title 委托投票contract Ballot { // 这里声明了一个新的复合类型用于稍后的 ...
HDFS中atime与mtime解析
先来了解下Linux中atime和mtime区别:atime:access time即访问时间mtime:modify time即修改时间,这里指文件内容的修改。(经常和atime与mtime一起谈到的还有ctime,这里不展开,有兴趣的可以goolge)
这里需要注意的是有的系统可能为了性能上的优化,atime并不是实时更新,此时查看atime并没有得到想要的效果。
Linux atime修改策略与mount有关,可选的值有noatime、relatime和strictatime。
noatimeatime不会被更新,即使修改了文件内容
relatime
如果一个文件的atime比ctime或mtime更早,此时你去读取了该文件,atime才会被更新为当前时间。
atime比现在早一天,那么atime在文件读取时会被更新
strictatimeatime在文件每次被读取时,都能够被更新
HDFS中atime和mtime了解了Linux中的atime与mtime,我们来了解下HDFS中的这两个值的变化规则。
在看代码之前,先想下atime和mtime有可能在哪些地方 ...
YARN Lost Node显示异常
先说现象,在yarn的web页面,Lost Nodes指标显示的数据异常,如下:我的集群一共有5台节点,这里显示有一台节点为Lost Nodes,但依然有5台Active Nodes,细心观察发现或有某个节点即存在Active Nodes中也存在Lost Nodes中,只是端口不一样。
这种情况如何解决呢?在yarn-site.xml中添加yarn.nodemanager.address配置项,如下:
1234<property> <name>yarn.nodemanager.address</name> <value>${yarn.nodemanager.hostname}:65033</value></property>
需要重启集群,让参数生效。
现在你可以去修改你集群的配置,是不是瞬间心情愉快了很多,那是不是可以继续读下去,看下我们如何解决这种问题。
搜索首先利用搜索引擎,看下是否有没有前人帮你埋坑。(当你搜到这篇blog,说明你已经具有了这种能力)
镇定没有前人埋坑,怎么 ...
以太坊测试环境部署
上篇介绍了以太坊开发环境,本篇介绍下如何使用私有链。
使用私有链之前,先要创建创世块genesis。
初始化私有链12345678910111213141516{ "nonce": "0x0000000000000042", "timestamp": "0x0", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x", "gasLimit": "0x80000000", "difficulty": " ...
以太坊环境部署
以太坊的环境容易部署,执行一些命令就OK了。那就开始搞吧。。。
以太坊环境部署在安装以太坊之前要先安装下go,go的安装类似jdk,下载tar包,解压然后配置下环境变量。
安装以太坊:
123456789sudo add-apt-repository -y ppa:ethereum/ethereumsudo add-apt-repository -y ppa:ethereum/ethereum-devsudo add-apt-repository ppa:ethereum/ethereum-qtsudo apt-get update# 安装以太坊sudo apt-get install ethereum# 安装solc编译器sudo apt-get install cpp-ethereum # 并没有solc命令sudo apt-get install solc # 安装solc,进行本地编译合约
安装结束之后的版本是Geth/v1.8.13-stable-225171a4/linux-amd64/go1.10
认识以太坊完成以上操作之后,就可以操作以太坊了,可以进行挖矿了。这 ...
Hadoop get命令返回NullPointerException
昨天Hadoop的get命令突然无法使用,返回NullPointerException异常,无法从hdfs pull数据,其它命令正常,并且最近也无任务修改配置的操作。这下捉急了,捉急也没用,还是滚回去看日志吧,在日志中也没发现什么具体的报错信息,只发现NN的状态发生了变化,变成了standby。但按照以往的经验NN切换并不会导致Hadoop相关命令返回空指针异常,难道是当初配置有什么问题?先把NN切回来吧,先保证线上任务正常运行吧。切回回来之后一切正常,剩下一脸懵逼的我。。。。
先贴下异常现象:
12345$ hadoop dfs -get /test/test_1527672887521.sh .DEPRECATED: Use of this script to execute hdfs command is deprecated.Instead use the hdfs command for it.get: java.lang.NullPointerException
问题恢复了,那就是找到问题的原因,而彻底解决到问题。那就开始搞吧。
首先在测试环境测试下NN切换, ...
Docker进程log和应用log采集调研
Docker容器化已是一个相对成熟的理念,但是在实际使用中还是有很多挑战,目前我们遇到的一个问题是Docker中的log如何采集。这些log包括Docker容器进程本身的log和容器内运行应用的业务log,两份log都比较重要,尤其业务log,因为一些埋点数据和统计指标都在业务log中也包括一些程序异常log。
针对这些log采集,我们面对的一些问题有:
容器标准输出日志采集
容器内业务log采集 (是否要支持同时采集多个文件或多个业务log)
断点续传
异常日志合并与拼接 (要想合并异常日志,则日志必须标准化)
日志采集的完整性
日志乱序
从日志中区分来源
支持热插拔
对业务的侵入性
故障重传
目前主流两种方案,一种是log在容器内通过采集工具直接传输给log聚合服务,另一种是将容器内的log传输到宿主机,然后再通过日志采集工具进行采集。
方案1在容器内直接将log传输给log聚合服务,可以通过业务方调整业务逻辑将日志直接打入kafka或者redis等缓存组件中,这种方式对业务侵入性较大,无法做到对业务无感知,也无法解决docker容器本身的log传输。在容器内直接将lo ...