plantuml 类图

声明元素

1
2
3
4
5
6
7
8
9
10
11
12
13
@startuml
abstract abstract
abstract class "abstract class"
annotation annotation
circle circle
() circle_short_form
class class
diamond diamond
<> diamond_short_form
entity entity
enum enum
interface interface
@enduml

定义关系

关系 符号
扩展(Extension) <|–
组合(Conposition) *–
聚合(Aggregation) o–

示例

1
2
3
4
5
6
7
8
9
10
11
@startuml
class Dummy {
String data
void methods()
}

class Flight {
flightNumber : Integer
departureTime : Date
}
@enduml

SQL

创建表

语法

1
2
3
4
5
6
CREATE TABLE 表名称 (
列名称1 数据类型,
列名称2 数据类型,
列名称3 数据类型,
....
)

示例

1
2
3
4
5
6
7
8
9
CREATE TABLE `syscontroldb`.`sys_user` (
`id` INT(11) NOT NULL COMMENT '用户DI,系统唯一标识',
`userName` VARCHAR(45) NOT NULL COMMENT '用户名,系统唯一',
`password` VARCHAR(45) NOT NULL COMMENT '用户密码,加密',
`customerID` INT(11) NOT NULL COMMENT '所属用户代码',
`tel` VARCHAR(20) NULL COMMENT '电话号码',
`status` INT(3) NOT NULL COMMENT '用户状态,0正常,1注销,2暂停' DEFAULT 1,
PRIMARY KEY (`id`))
COMMENT = '系统用户表';

Select

1
SELECT * from <table> WHERE <field>=<value>

Add

1
INSERT INTO <table> (<field>, <field>, ...) VALUES (<value>, <value>, ...)

Updata

1
UPDATE <table> SET <field>=<value>,<field>=<value> WHERE <field>=<value>

Join

left

1
2
# 别名
SELECT a.id, b.id FROM zj_classify a left join zj_classify b on b.parent = a.id ;

自驾游 - 乌兰察布

物品

证件

  • [ ] 身份证
  • [ ] 驾驶证

衣物

  • [ ] 5摄氏度外套
  • [ ] 帽子

洗护

  • [ ] 洗面奶
  • [ ] 牙刷、牙刷、毛巾
  • [ ] 防晒、护肤
  • [ ] 驱虫、风油精

娱乐

  • [ ] 桌游
  • [ ] 自拍杆
  • [ ] 手机、电脑、平板、充电线、充电宝

饮食

  • [ ] 矿泉水
  • [ ] 自嗨锅
  • [ ] 零食

药品

  • [ ] 腹泻
  • [ ] 感冒
  • [ ] 发烧
  • [ ] 止痛片
  • [ ] 跌打损伤
  • [ ] 创伤贴、纱布

其他

  • [ ] 抽纸、湿巾
  • [ ] 雨伞、一次性雨衣

prometheus 查询语句

分组求和

1
2
3
4
5
# 语法
sum by(cluster)(rate(...))

# 对应用 <app> 最进一分钟的counter标签值为 <search> 的数据,以 cluster 为分组进行求和
sum by(cluster)(rate(<app>_timer_count{counter="search"}[1m]))

一段时间内总量

1
2
3
4
5
 # 3天内请求总量
sum(increase(requst_count{counter="...",...}[3d]))

# sum_over_time
sum(sum_over_time(request_count{...}[1d]))

QPS

1
2
3
4
5
6
7
# 单机
rate(request_count{label='value',...}[1m])
irate(request_count{label='value',...}[1m])
# irate 比 rate 更能凸显瞬时值, 或者说 rate 比 irate 更平滑

# 所有机器
sum(rate(request_count{label='value',...}[1m]))

Label Replace

语法

1
2
3
4
5
6
7
8
label_replace(query, "dest_label", "replacement", "src_label", "regex")

# 说明
query: 查询语句
dest_label: 替换后的 label 名称
replacement: 替换后的 label value 表达式, 支持正则查询后的分组
src_label: 需要替换的 label
regex: 需要替换的 label value 正则表达式

示例

1
2
3
4
5
6
7
8
label_replace(up{job="node-exporter"}, "foo", "bar-$1", "job", "node-(.+)")
# 效果
up{foo="bar-exporter"}
# 说明
$1 = exporter

# 使用 time range
rate(label_replace(up{job="node-exporter"}, "foo", "bar-$1", "job", "node-(.+)")[1m:])

ON…GROUP_LEFT

示例

统计分可用区的服务可用性。

1
2
sum(rate(label_replace(no_fail_request{job=~"${cluster}"}, "private_ip_address", "$1", "instance", "(.*):8000$")[1m:]) * on (private_ip_address) group_left(zone) agent_status{instance_state="running",region="${cluster}"}) by (zone) / 
sum(rate(label_replace(total_request{job=~"${cluster}"}, "private_ip_address", "$1", "instance", "(.*):8000$")[1m:]) * on (private_ip_address) group_left(zone) agent_status{instance_state="running",region="${cluster}"}) by (zone)

过滤不为 0

1
2
avg(metric_name{] != 0) by (region)  # 对值为 0 的指标不进行 avg 计算
avg(metric_name{]) by (region) != 0 # 对值为 0 的结果不进行展示

英语常识

地址

格式

级别 英文 示例
Room Room 602
Vallage Huaxi Vallage
No.* No.12
1
2
3
4
5
6
7
8
9
10
11
12
X室 Room X
X 村 *** Vallage,如华西村 Huaxi Vallage.
X号 No. X
X单元 Unit X
X号楼 Building No. X
X街 X Street
X路 X Road
X区 X District
X县 X County
X镇 X Town
X市 X City
X省 X Province

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
宝山区良港村37号403室
Room 403, No. 37, Lianggang Residential Quarter, BaoShan District

虹口区西康南路125弄34号201室
Room 201, No. 34, Lane 125, XiKang Road(South), HongKou District

四川省成都市花都大道100号世纪光花小区3023号
No.3023,Shijiguanghua Residential Quater,Huadu Avenue,Chengdu City, Sichuan Province

河南省南阳市中州路42号 李有财 473004
Li Youcai
Room 42
Zhongzhou Road, Nanyang City
Henan Prov. China 473004

473000河南南阳市八一路272号特钢公司 李有财
Li Youcai
Special Steel Corp.
No. 272, Bayi Road, Nanyang City
Henan Prov. China 473000

nc

传送文件

1
2
3
4
5
6
7
8
# receiver
$ nc -l -p {port} > something.tar.gz < /dev/null
# sender
$ cat something.tar.gz | nc {server-ip} {port}

# example
nc -l -p 12345 > something.tar.gz < /dev/null
cat something.zip | nc 127.0.0.1 12345

sed

参数

-E

  • 使用扩展语法
  • 扩展语法和基础语法区别主要在于少量字符的差异,?+(){},在基础语法中需要转义来作为特殊字符;相反,在扩展语法中,需要转义以匹配无特殊含义的文本字符

示例

替换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
$ cat msg
{
'localhost' => ['domain_name' => 'default', 'domain_type' => 'mobile'],
}

# 替换文件内容并打印
$ sed '/localhost/p; s/localhost/dev.ops/' msg
{
'localhost' => ['domain_name' => 'default', 'domain_type' => 'mobile'],
'dev.ops' => ['domain_name' => 'default', 'domain_type' => 'mobile'],
}

# 替换文件内容并将输出重定向到新文件
$ sed '/localhost/p; s/localhost/dev.ops/' msg > new_msg
$ cat new_msg
{
'localhost' => ['domain_name' => 'default', 'domain_type' => 'mobile'],
'dev.ops' => ['domain_name' => 'default', 'domain_type' => 'mobile'],
}
# 源文件并未更改
$ cat msg
{
'localhost' => ['domain_name' => 'default', 'domain_type' => 'mobile'],
}

# 在源文件修改并保存源文件至备份文件
$ sed -i 'msg_backup' '/localhost/p; s/localhost/dev.ops/' msg
$ ls
msg msgmsg_backup new_msg
# 打印源文件备份
$ cat msgmsg_backup
{
'localhost' => ['domain_name' => 'default', 'domain_type' => 'mobile'],
}
# 打印源文件
$ cat msg
{
'localhost' => ['domain_name' => 'default', 'domain_type' => 'mobile'],
'dev.ops' => ['domain_name' => 'default', 'domain_type' => 'mobile'],
}

# 直接修改源文件并且不保存备份
$ sed -i '/localhost/p; s/localhost/dev.worker/' msgmsg_backup
# $ sed -i '' '/localhost/p; s/localhost/dev.worker/' msgmsg_backup # os x
$ cat msgmsg_backup
{
'localhost' => ['domain_name' => 'default', 'domain_type' => 'mobile'],
'dev.worker' => ['domain_name' => 'default', 'domain_type' => 'mobile'],
}

$ ls
msg msgmsg_backup new_msg

#### Other Examples
## 正则替换
$ cat script/config.sh
workers=6666
threads_compute=10
threads=101
$ sed -i "s/workers=[0-9]*/workers=9/" ./script/config.sh
$ cat script/config.sh
workers=9
threads_compute=10
threads=101

# group
sed -i "s/workers=([0-9]+)/\1/" /path/to/file

替换子串

1
2
sed -i 's/head/heap/g' Heap.cpp
# sed -i '' 's/head/heap/g' Heap.cpp # 不保留文件备份

替换前复制行

1
sed '/localhost/p; s/localhost/dev.ops/' FILENAME

group 替换

1
2
3
4
5
$ echo "hello wii." | sed -E 's/hello ([a-z]+).*/\1/'
wii
# OR
$ echo "hello wii." | sed 's/hello \([a-z]\+\).*/\1/' # 注: 不同系统,+ 号的行为可能不一致,这条命令在 big sur (mac os) 中无法输出预想结果
wii

以上有个问题,如果为匹配到数据,最终打印原始数据,比如。

1
2
$ echo "hello wii." | sed -E 's/hi ([a-z]+).*/\1/'
hello wii.

/patt/!d;s//repl/可实现匹配不到打印空,如下。

1
2
$ echo "hello wii." | sed -E '/hi ([a-z]+).*/!d;s//\1/' 
# empty

问题

sed: 1: ... : extra characters at the end of H command

  • edit in place on OSX without keeping a backup, use -i '':

    1
    sed -i '' -e '/localhost/p; s/localhost/dev.ops/' FILENAME

参考