我有一个习惯,就是不断的记录在工作中反复用到的知识点,原本我很喜欢使用印象笔记和有道云笔记,其一是云笔记的同步功能,其二是云笔记的搜索功能,当你输入的笔记多了之后,你才会发现搜索功能是多么的重要。
鉴于公司内部对信息安全管理比较严格,这种云笔记在内部禁止了。很遗憾。大凡优秀的企业都不应该在限制这些条条框框。
没办法。在本地使用Atom 加上 Markdown 插件编写笔记。
初期我是这么做:
- 每天一个页面
这个页面包含当天的待办事项、遇到的问题收集、以及解决办法的思路。
后期,我不这么做了,是因为Atom + Markdown 不支持搜索功能。我需要一个一个翻才能找到我需要的知识。
- 更改为每月一个页面
同样包含本月的代办事项、遇到的问题、以及解决问题的思路。文本内支持搜索。这样就把几百个文件的搜索量压缩在12个文件内,文件内搜索可以轻易达到。
这篇文章就是我遇到问题的知识点的合集。希望对你有启发。
既然是合集,你可能看到知识点不成体系。相互之间没有太多联系,相互独立。
Git
如何将一个分支的修改移植到另一个分支?
背景:
远端维护着好几个分支,每个分支对应的不同的发布版本,但是有些修改却是一样的。为了快速实现修改,可以使用 cherry-pick 功能
具体做法:
- 在分支上进行正常提交(add、commit、push)
- git log 查看最新提交的log id
- 切换到远程分支并拉取远程分支的最新版本 git checkout -b bugfix -t remotes/origin/bugfix
- 同步修改:git cherry-pick log-id
- git push bugfix
Go 项目工程组织
- 设置GOPATH: bin、pkg、src
- 设置GOROOT
- src 即是我们项目和第三方库的目录
- go get 下载的库在src 下
- 创建工程也在src 目录下
库和工程在同一级目录下,怕影响库文件的使用,这个时候结合govender 能很好的管理自己创建的工程里使用到的第三方库。
json 检查工具
json 是一种比较常见的数据交互格式,但是在linux 手动配置经常可能受限于格式导致配错。这个时候格式检查工具就能有很好的用途。还可以进行内容的提取。
- jq
下载:
$ wget http://stedolan.github.io/jq/download/linux32/jq (32-bit system)
$ wget http://stedolan.github.io/jq/download/linux64/jq (64-bit system)
$ chmod +x ./jq
$ sudo cp jq /usr/bin
使用示例:
{
"name": "Google",
"location":
{
"street": "1600 Amphitheatre Parkway",
"city": "Mountain View",
"state": "California",
"country": "US"
},
"employees":
[
{
"name": "Michael",
"division": "Engineering"
},
{
"name": "Laura",
"division": "HR"
},
{
"name": "Elise",
"division": "Marketing"
}
]
}
# 使用
cat json.txt | jq '.name' == > “Google”
cat json.txt | jq '.location.city' == > "Mountain View"
cat json.txt | jq '.employees[0].name' == >
{
"city": "Mountain View",
"street": "1600 Amphitheatre Parkway"
}
cat json.txt | jq . ## 检查格式
- json.tool
使用:格式化输出并检查格式
cat json.txt | python -m json.tool
GoStub, GoMock, GoConvey
这几个库都是和Go 编写测试用例相关的库,用来打桩或者替代原生测试框架。
- GoConvey
- 文件名:xxx_test.go
- 函数名: TestXxxxx(t *testing.T)
- Convey(message, t, func(){核心处理程序 So(断言处理)})
- Convey 嵌套:最外层和内层:最外层带 t 参数,内层不带 t 参数
- GoStub
- 全局变量打桩:stubs := Stub(&num, 150)
- 函数打桩: stubs := StubFunc(&Exec,"xxx-vethName100-yyy", nil)
- 内置函数打桩:定义库函数变量
- 为过程打桩:stubs := StubFunc(&DestroyResource)
- Monkey
- Patch(): 第一个参数是目标函数名,第二个参数是桩函数的函数名,习惯用法是匿名函数或闭包,返回值是一个PatchGuard对象指针,主要用于在测试结束时删除当前的补丁
示例:打桩 ioutil.ReadFile 函数
guard := Patch(ioutil.ReadFile, func (filename string) ([]byte, error) {
return fileBytes, nil
})
defer guard.Unpatch()
- PatchInstanceMethod()
var e *Etcd
guard := PatchInstanceMethod(reflect.TypeOf(e), "Get", func(_ string) []string {
return []string{"task1", "task5", "task8"}
})
defer guard.Unpatch()
Govendor
前提:安装 git
- go get
- govendor init
- govendor add +external
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
在工程目录下执行 govendor init 即会在工程下生成一个vendor 目录,用来存放项目中用到的第三方库。
govendor add +external 即将src 下的工程用到的库拷贝至vendor 目录下。
是个很好的管理第三方库的工具。和python 中的virtualenv 很像。
Go import
-
.
省略前缀 - 起别名
- 完整的名称
- 绝对路径
- 相对路径
-
_
导入包:只是完成初始化操作 init 函数
syc
func (o *Once) Do(f func()) # 多次调用,只取一次
var once sync.Once
func GetPsmCfgInstance() *PsmCfg {
once.Do(func() {
inst = &PsmCfg{}
})
return inst
}
yaml 格式检查工具
sudo apt-get install yamllint
pip install yamllint
用法:yamllint 文件名.yml
yaml 文件读取工具
pip install shyaml
get-type:获取相应的类型
get-value:获取值
get-values{,-0}:对序列类型来说,获取值列表
keys{,-0}:返回键列表
values{,-0}:返回值列表
key-values,{,-0}:返回键值对
cat struct.yaml | shyaml get-value parameters.iaas