记录还不太熟练的效率工具和快捷键
📅 2019-06-01
1.shell #
ctl + u
- 快速清楚当前行已经录入的所有内容
ctl + u
- 快速清楚当前行已经录入的所有内容Miniflux是一个开源的RSS阅读器,可以使用Miniflux部署我们自己的RSS服务。 作为曾经的Google Reader重度用户,在Google Reader之后使用过Feedly、Inoreader,通过自建Miniflux可替代Feedly和Inoreader。
...kubectl插件机制在Kubernetes 1.14宣布稳定,进入GA状态。kubectl的插件机制就是希望允许开发者以独立的二进制形式发布自定义的kubectl子命令。
kubectl插件可以使用任意语言开发,如可以是一个bash、python的脚本,也可以是其他语言开发编译的二进制可执行文件,只要最终将脚本或二进制可执行文件以kubectl-
的前缀放到PATH
中即可。使用kubectl plugin list
可以在PATH
中查看有哪些插件。
kubeadm是Kubernetes官方提供的用于快速安装Kubernetes集群的工具,伴随Kubernetes每个版本的发布都会同步更新,kubeadm会对集群配置方面的一些实践做调整,通过实验kubeadm可以学习到Kubernetes官方在集群配置上一些新的最佳实践。
...前面我们使用gradle初始化了Jenkins Shared Libraries的开发框架,本篇将介绍在src目录下使用第三方库开发我们自己的库。 在src目录下开发自己的库的需求是肯定存在的,我们在var目录中编写自定义Step时会用到Jenkins及其众多插件目前提供的各式各样的Pipeline Step,但有些需求是这些Step无法提供的。例如,在进行构建容器镜像之前我们可能需要访问Harbor(一个Docker镜像仓库)的API获取一些额外的信息,或者访问其他配置纹理系统的Restful API获取信息,这就需要我们的Shared Libraries中提供HTTP Client的功能,显然这个功能可以放到src目录下,而我们不会白手起家,在src目录下编写这个HTTP Client功能的时候,就会用到第三方库了。
...Jenkins Shared Libraries是一种扩展Jenkins Pipeline的技术,通过编写Shared Libraries可以实现自定义的Steps,将流水线逻辑中重复或共通的部分进行抽象和封装。 实践中每个DevOps团队都应该通过维护一个或多个Shared Libraries项目再结合第三方的Jenkins插件定制团队自己的Jenkins流水线。
...Go Modules是Go 1.11引入的,为了解决Go项目的依赖问题。从go 1.16开始,go modules开始成为Go默认的包依赖管理工具。
一个Go Module实际上是由一组Go的Package的集合。 构建Go Module的过程需要先确定依赖的其他Go Module的版本、编译包、将编译的目标文件链接到一起。
...Kubernetes集群内部是一套单独的网络,与外部网络相隔离,Kubernetes提供了NodePort、LoadBalancer、Ingress等方式用于将集群内部的Service暴露到集群外部, 但这些方式都更适用于将边缘服务暴露出去。例如,一个产品由很多微服务组成,这些微服务大多数都是内部服务,只有少数作为边缘服务需要暴露到集群外部供用户使用。 而开发人员是存在从Kubernetes外部访问和调试这些内部服务的需求的,尤其是针对测试环境的Kubernetes集群,这个需求更加必要。针对这个需求,有以下两种实现方式:
...操作系统的线程由内核的线程调度器负责调度,不同的编程语言对内核线程的封装不同,有以下三个模型:
N:1
模型: N个用户空间线程运行在1个内核空间线程上。优点是上下文切换快,缺点是无法有效利用多核特性。
在该模型下,线程管理由用户空间的线程库进行,因此上下文切换效率高,但如果某个用户线程执行阻塞系统调用(syscall),其他用户线程也将会阻塞。因为任一时间只能有一个内核空间线程访问内核,所以多个用户线程也就无法并行运行在多核系统上。
由于无法有效利用系统多核特性,所以现在几乎没有编程语言使用这个模型。1:1
模型: 1个用户空间线程运行在1个内核空间线程上。每次调度都要在用户态和内核态之间切换,因此该模型的缺点是上下文切换很慢,而且每创建一个用户线程就需要创建一个内核线程,因此可以创建的用户线程数量也会受限制。
在该模型下,一个用户线程执行阻塞系统调用时,能够允许其他用户线程继续执行,多个用户线程也可以并行的运行在多核系统上。使用此模型的编程语言有Java。M:N
模型: 多个用户空间线程运行在多个内核空间线程上。M:N
模型综合了N:1
和1:1
模型的优点,多路复用多个用户空间线程到一定数量的内核空间线程。这种模型的缺点是调度实现起来十分复杂。Go采用的这种模型,用户空间线程在Go中对应的是Goroutine。G-M-P
模型
#在Go中用户线程的调度和生命周期管理都是用户层面的,由Go语言自己实现,不依赖OS系统调用,减少系统资源消耗。 Go实现了一个自己的运行时调度器用于调度Goroutine(轻量级的用户空间线程)。
...go语言中虽然没有Java, C++等一些高级语言提供的枚举类型特性,但可以使用常量和iota来模拟。 例如:
1// BuildResult 构建结果
2type BuildResult int
3
4const (
5 // Success 成功
6 Success BuildResult = iota
7 // Fail 失败
8 Fail
9 // Abort 中断
10 Abort
11)
1var buildResult = Success
2println(buildResult) // 0
为了打印枚举类型值具体的字符串标识,可以使用https://godoc.org/golang.org/x/tools/cmd/stringer
工具并结合go generate
为枚举类型生成func (t T) String() string
函数。这样枚举类型就实现了fmt.Stringer
接口。具体的实现方式是在枚举类型BuildResult的定义上加上注释//go:generate stringer -type=BuildResult
: