effective go 中的部分笔记,这是第一部分

部分笔记摘要,参考: https://go-zh.org/doc/effective_go.html

函数

Go的函数有一个很特别的性质那就是多值返回,这样做有一个很方便的地方是可以把错误值返回,这样做和后面会讲到的取消异常也是有关的。

一个Go函数的签名可能是:

func (file *File) Write(b []byte) (n int, err error)

这是一个典型的Go函数签名,初看起来比较复杂,一点点分析:

  1. func关键字,类似php中的function
  2. (file File) 表示这是一个添加到File接口上的方法。这也是Go比较有意思的地方,通过附着接口方法的方式实现接口
  3. Write 很简单就是方法名了,大写开头的方法表示共有的导出方法,如果是小写的方法名是不能导出的
  4. (b []byte)方法的参数,形参名为b,类型为[]byte
  5. (n int, err error) 返回类型,如果是多指返回则使用小括号括起来,如果是一个返回值就不需要了。比较有意思的是返回值也可以作为有命名返回值,比如这里的n和err,这样表示把函数作用域内的n和err变量返回,这样返回语句只需要写return,而不需要显式说明具体变量

Defer

Defer 是Go的关键字,用于预设一个函数调用,一个使用Defer调用的函数会在执行defer的函数返回之前立即执行,常用来释放资源,比如解锁互斥和关闭文件
使用defer推迟的函数会按照后进先出的顺序执行。

阅读全文 »

vim中常用的命令,日常更新

!ls  使用感叹号开头调用系统命令
~ 切换当前光标所在字符的大小写

buffer相关

:ls
:bn :bnext
:bp :bprev
:bd :bdelete
:b1 :buffer1
:bufdo cmd 在所有缓冲区执行命令

参数列表

:args 列出参数列表或者设置参数列表
:args **/*.postfix
:write :w
:edit! :e!放弃修改重新载入文件
:qall :qa
:wall :wa

多窗口

:sp [file] 水平分割
:vsp [filw] 垂直分割
:clo <C-w>c 关闭当前窗口
:no[ly] <C-v>o 关闭当前之外的所有窗口

切换窗口

<C-w><C-w> 在串口中切换,连续按两次Ctrl+w
<C-w>h|j|k|l 切换到左/下/上/右的窗口

改变窗口大小

<C-w>=
<C-w>_ 最大化当前窗口的高度
<C-w>| 最大化当前窗口的宽度
[n]<C-w>_ 设置
[n]<C-w>|

标签

:tabedit :tabe {filename} 如果filename为空则打开一个新的标签页
:tabclose :tabc
:tabonly :tabo 关闭当前标签之外的所有标签

标签切换

:tabnext  :tabn {N}  Ngt
:tabn gt
:tabp gT
:tabmove [N] 移动标签页

打开及保存文件

:edit full/path/name
:edit %:h<tab>filename 使用缓冲区文件的完整路径打开文件, :h去掉当前文件名,tab键补全
:edit path 打开文件管理窗口
:find filename 在path下查找文件
: set path+=/path/to/workspace 将工作区添加到vim的path中用于寻找
:e 是 :edit的缩写
:Explore :E 打开当前的目录管理器
:Sexplore explore的切分
:Vexplore

文件操作

:!mkdir -p %:h    前缓冲区创建目录,然后在:w,解决某些不能保存的问题
:w !sudo tee % > /dev/null 由于保存用非sudo打开的无权限文件的保存

Golang中可以使用iota方便的定义复杂的常量结构,下面是golang spec中的说明

Within a constant declaration, the predeclared identifier iota represents successive untyped integer constants. It is reset to 0 whenever the reserved word const appears in the source and increments after each ConstSpec. It can be used to construct a set of related constants:

示例1

const (  // iota is reset to 0
c0 = iota // c0 == 0
c1 = iota // c1 == 1
c2 = iota // c2 == 2
)

const (
a = 1 << iota // a == 1 (iota has been reset)
b = 1 << iota // b == 2
c = 1 << iota // c == 4
)

const (
u = iota * 42 // u == 0 (untyped integer constant)
v float64 = iota * 42 // v == 42.0 (float64 constant)
w = iota * 42 // w == 84 (untyped integer constant)
)
``
const x = iota // x == 0 (iota has been reset)
const y = iota // y == 0 (iota has been reset)

Within an ExpressionList, the value of each iota is the same because it is only incremented after each ConstSpec:

示例2

const (
bit0, mask0 = 1 << iota, 1<<iota - 1 // bit0 == 1, mask0 == 0
bit1, mask1 // bit1 == 2, mask1 == 1
_, _ // skips iota == 2
bit3, mask3 // bit3 == 8, mask3 == 7
)

This last example exploits the implicit repetition of the last non-empty expression list.

iota是一个比较有特色的东西,看完这两个例子基本就知道怎么用了,相当于它是一个从0开始自动增加的变量,可以重复使用,可以用来定义单位的大小,比如KB,MB,GB等

这部分包含的内容:

  1. 什么是ambari
  2. 如何安装Ambari
  3. 安装hadoop集群的准备工作
  4. 如何使用Ambari搭建一个集群
  5. 其他

什么是Ambari

Ambari是的apache基金会下的一个开源项目。其目标是简化Hadoop集群的管理。通过Ambari提供工具可以方便的配置、管理、监控Hadoop集群。Ambari提供了一个直观的,易用的Hadoop管理web界面。Ambari现在最新的版本为2.0.0,但是网上比较多的资料都是1.2-1.7的。

作为一个开源项目,Hadoop在的配置与管理一直非常的不友好,要配置一个Hadoop集群经常会出现各种问题,并且对于集群的监控也比较麻烦,这也是像cloudera、hortonworks这类的提供Hadoop服务的公司可以存在的理由。

Ambari架构采用的是Server/Client的模式,主要组件:ambari-agent、ambari-server和ambari-web。ambari-agent是一个无状态的, 采集所在节点的信息并且汇总发心跳汇报给ambari-server, 处理ambari-server的执行请求。

阅读全文 »