Ansible概要
Ansible是什么?Ansible是一个自动化管理远程系统的工具,它主要有两个功能:
自动化管理远程节点
控制远程节点,让它们满足预期的状态
主要由3个组件构成:
控制节点: 用于安装和运行ansible。
被控制节点: ansible管理的节点。
清单(Inventory):按逻辑组织的被控制节点列表,它描述了ansible管理的对象。
Ansible的安装配置步骤:
使用Homebrew安装: brew install ansible
创建被管理节点的清单hosts.yaml
123456789101112all: children: master: hosts: master-node: ansible_host: 52.118.108.104 ansible_user: root nodes: hosts: node-1: ansible_host: 150.238.65.205 ansible_user: root
检验清单是 ...
OpenAPI 概要
OpenAPI是什么?OpenAPI被用来描述基于HTTP的API,是目前被广泛接受和使用的API工业标准。
使用OpenAPI规范的优势
可以使用工具检查用户定义的API是否满足OpenAPI特定版本的规范,语法是否正确等。
可以检查请求和响应中的数据是否正确。
可以自动生成API文档。
自动生成客户端和服务端的代码。
可以用图形化工具快速、方便地创建API描述文件。
可以在写代码之前创建提供示例响应的伪HTTP服务器。
在API定义阶段就可以发现一些可能出现的安全漏洞。
API描述文件 API描述文件是一个机器可读的API定义文件。它应该是尽量完整的、细致的、明确的。开发者可以使用API描述文件来自动生成API文档以及代码。
格式: JSON 或者 YAML
最小化结构:12345openapi: 3.1.0 # OpenAPI版本info: title: A minimal OpenAPI document version: 0.0.1 # API版本paths: {} # No endpoints defined
Servers对象12345678 ...
函数式编程概要
函数式编程是什么?函数式编程是一种通过组合纯函数来编写软件的编程范式,它是声明式而非命令式的,其原则是避免共享状态, 改变数据,以及副作用。
函数式编程推荐:
使用纯函数
使用函数组合
使用声明式代码而非命令式代码
函数式编程应当避免:
副作用
改变数据
共享状态
术语解释副作用(side effect)函数副作用是指函数在执行过程中改变了函数之外的环境。具体地说,函数副作用是指函数被调用,完成了函数既定的计算任务,但同时因为访问了外部数据,尤其是因为对外部数据进行了写操作,从而一定程度地改变了系统环境。 例如下面的函数就有副作用,它改变了外部变量count。
12345let count = 0;function add1() { count += 1;}
下面的情形都是有副作用的:
函数在执行过程中改变了外部变量
改变了函数的参数
抛出了异常
打印字符串到标准输出或者记录了日志
启动了一个子进程
调用了有副作用的函数
纯函数如果一个函数满足下列条件则它就是一个纯函数:
有输入(参数)
没有状态 (如全局变量)
相同的输入,总是会的到相同的输出
...
Go语言中的正则表达式
正则表达式在字符串的处理中占有重要的地位,Go语言中的regexp包提供了对正则表达式的支持。
正则表达式基础正则表达式(Regular Expression)是一个特殊的字符串,它定义了一种文本模式。通过正则表达式,你可以从所有文本中匹配到满足特定模式的文本(字符串),然后可以:
测试字符串是否满足这种特定模式,例如:是不是IP地址、电话号码,银行卡号等
替换文本,将文本中部分或者所有满足这种特定模式的字符串替换、删除掉
提取满足这种特定模式的子字符串
元字符元字符在正则表达式中有特殊的意义,要匹配这些元字符本身的话,需要用反斜杆转义。元字符有12个,如下所示:
1$()*+.?[\^{|
]和}不属于元字符是因为它们是否需要被转义依赖于前面是否有[和{
量词以下几个字符我们称之为量词,它们表示匹配字符重复的次数。
量词
含义
?
重复0次或者1次
*
重复0次或者多次
+
重复1次或者多次
{m, n}
m,n为数字,至少重复m次,最多重复n次, m和n中的一个可以不指定
惰性匹配和贪婪匹配在量词后面加?表示惰性匹配, ...
Go语言中的字符串
字符串语法基础
Go语言中的字符串采用UTF-8编码格式
字符串字面量使用双引号"以及反引号 ` 来创建,区别在于双引号解析转义字符而反引号不解析
字符串操作符Go语言中的字符串支持如下操作:
语法
描述
s + t
将字符串s和字符串t连接起来
s += t
s = s + t
s[n]
字符串s中索引为n的字节 uint8类型
s[n:m]
从索引n到m-1取得的子字符串 (按字节)
s[n:]
从索引n到字符串结尾取得的子字符串 (按字节)
s[:m]
从字符串开头到索引位置m-1取得的子字符串 (按字节)
len(s)
计算字符串的字节数
[]rune(s)
将字符串转化为码点(int32)数组
len([]rune(s))
计算字符串的码点数, 即字符数
string(chars)
将一个码点数组转化为字符串
[]byte(s)
将字符串转化为字节(uint8)数组
string(bytes)
将字节数组转化为字符串
string(i)
将任意类型数字转化为字符串
strconv.Itoa(i)
将i ...
Go语言中的数值类型
与其它语言一样,Go语言支持整型和浮点型数值。不同的是,Go语言是强类型语言,数值运算需要在同一种类型的数值之间进行。
Go语言内置的数值类型都支持下面所列的运算:
语法
描述
+x
x
-x
x的负值
x++
x加上常量1
x–
x减去常量1
x + y
x加上y
x - y
x减去y
x * y
x乘以y
x / y
x除以y
x += y
x = x + y
x -= y
x = x - y
x *=y
x = x * y
x /=y
x = x / y
类型转换数值类型的变量在定义时就需要指定其类型,如果没有指定,Go会进行类型推断。常量可以与其它类型兼容,不用转换也可以进行运算。不同类型的数值运算需要先使用下面的方法进行类型转换。注意:类型转换可能会导致精度丢失。
1type(value)
例如:
123456789101112package mainimport "fmt"func main() { const times = 3 // 定义常量 i := 20 // ...
Go基本数据类型
Go支持如下内置基本类型:
一种内置布尔类型:bool
11种内置整数类型:int8、uint8、int16、uint16、int32、uint32、int64、uint64、int、uint和uintptr
两种内置浮点数类型:float32和float64
两种内置复数类型:complex64和complex128
一种内置字符串类型:string
Go中有两种内置类型别名(type alias):
byte是uint8的内置别名。 我们可以将byte和uint8看作是同一个类型。
rune是int32的内置别名。 我们可以将rune和int32看作是同一个类型。
uintptr、int以及uint类型的值的尺寸依赖于具体编译器实现。 通常地,在64位的架构上,int和uint类型的值是64位的;在32位的架构上,它们是32位的。 编译器必须保证uintptr类型的值的尺寸能够存下任意一个内存地址。
一个complex64复数值的实部和虚部都是float32类型的值。 一个complex128复数值的实部和虚部都是float64类型的值。
1234567891011// ...
Feature flags 概要
Feature flags可以让软件开发更加的安全、迭代更加迅速,而且可以更加灵活的控制软件产品。Feature flags将功能迭代从代码部署中分离出来,从而可以使产品团队(开发团队、管理团队、SRE等)在版本控制之外更加精细地控制谁、什么时候可以使用什么功能。
什么是Feature flags?Feature flags是一种软件开发方法,开发者将新的功能封装在带有标志位的if/else语句中,从而使得产品团队可以在版本之外通过设置标志位来控制哪些功能可以被用户使用。标志位的开关独立于软件部署,所以即使产品环境部署同样一份代码,也可以通过设置标志位来打开/关闭某种功能。因此,支持Feature flags也是持续交付(Continous delivery)的重要一环,它可以让版本发布更加迅速、更加可靠。
12345if (flags.kms) { /* with KMS feature */} else { /* without KMS feature */}
Feature flags最佳实践
选择正确的级别。根据自身 ...
Go环境变量及常用命令
环境变量
GOROOT: Go语言的安装路径
GOPATH: Go语言工作区路径,默认为~/go。项目中执行go install命令后,项目构建后生成的可执行程序、静态库文件以及源码文件会被安装到GOPATH相应的目录中去
GOBIN: 存放Go可执行文件,一般是GOPATH/bin会被默认设置到操作系统的PATH环境变量中
1234567891011$ tree -L 1 ~/go/Users/wangsen/go├── bin├── pkg└── src$ go env | grep GOPATHGOPATH="/Users/wangsen/go"$ go env | grep GOBINGOBIN="/Users/wangsen/go/bin"
常用命令
go build: 构建go程序
go test: 运行测试代码
go install: 构建并安装go程序
go fmt: 格式化go代码
go vet: 用来检查编译器发现不了的逻辑错误
go run: 运行go代码
go mod init: 创建一个新的模块并初始化go.mod文 ...
SQL学习笔记 - SQL概要
SQL 是为数不多的声明性语言之一,用来和数据库管理系统进行对话。SQL语句分为四种类型:
DDL(Data Definition Language),也就是数据定义语言,它用来定义我们的数据库对象,包括数据库、数据表和列。通过使用DDL,我们可以创建,删除和修改数据库和表结构。
DML(Data Manipulation Language),数据操作语言,我们用它操作和数据库相关的记录,比如增加、删除、修改数据表中的记录。
DCL(Data Control Language),数据控制语言,我们用它来定义访问权限和安全级别。
DQL(Data Query Language),数据查询语言,我们用它查询想要的记录
SQL执行流程Oracle数据库中的执行流程:
语法检查:检查SQL拼写是否正确,如果不正确,Oracle会报语法错误。
语义检查:检查SQL中的访问对象是否存在。比如我们在写SELECT语句的时候,列名写错了,系统就会提示错误。语法检查和语义检查的作用是保证SQL语句没有错误。
权限检查:看用户是否具备访问该数据的权限。
共享池检查:共享池(Shared Pool)是 ...