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

参考

编程语言学习指南

编程语言学习指南

组织

文件

数据类型

类型

数字

字符串

布尔

限定

常量

变量

数据结构

数组

列表

集合

映射

语法

程序结构

注释

运算符

条件控制

循环

判断

函数

特性

语法糖

空指针处理

函数式编程

泛型编程

kotlin 基础

安装

homebrew

1
$ brew install kotlin

下载

这里找最新的Release,贴一个v1.4.21链接

交互式终端

1
$ kotlinc-jvm

HELLO WORLD

code

1
2
3
4
// file: hello.kt
fun main() {
println("Hello Wrold!")
}

compile

1
$ kotlinc hello.kt -include-runtime -d hello.jar

run

1
$ java -jar hello.jar

组织

文件

kotlin 源文件通常以.kt 作为扩展名。

1
2
3
package base

import kotlin.text.*

数据类型

类型

数字

类型 长度
Double 64
Float 32
Long 64
Int 32
Short 16
Byte 8

字符

类型 长度
Char 字符
String -

布尔

类型 长度
Boolean -

限定

修饰符 意图 目标 注意
var 变量 属性
val 不可变量 属性
companion object 静态 -
final 不可继承,默认值 类、属性、方法 不可修饰局部变量
open 开放继承权限 类、属性、方法 不可修饰局部变量
const 修饰可执行 宏替换 的常量 属性 只能修饰不可变量(val定义)

注:

  • 宏替换
    • 宏变量 指编译时常量,宏替换指在编译阶段就会被替换掉
    • 宏替换条件
      • 使用 const 和 val 修饰的属性,如果进行拼接或者运算,被拼接的其他变量也要是宏变量
      • 位于顶层或者是对象表达式的成员
      • 初始值是基本数据类型
      • 没有自定义的getter方法

常量

1
2
3
4
5
6
7
8
9
10
11
// 10 进制 
1234567890
1234567890L
1_234_567_890

// 16 进制
0x0f
0xFF_EC_DE_5E

// 2 进制
0b00001011

定义

1
2
3
4
5
6
7
8
9
10
11
[final/open] [var/val] name : [Type] = ...
[final/open] [var/val] name : [Type]? = null
const val name : [Type][?] = ...

// example
var it : Int = 100
var ns : String? = null

object TestVars {
const val name : String = ""
}

数据结构

数组

列表

集合

映射

语法

程序结构

注释

1
2
3
4
5
6
// 这是单行注释

/*
这是
多行注释
*/

条件控制

运算符

循环

判断

函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
fun [funName](arga: [Type], argb: [Type], ...) : [Type] {
return ...
}

// example
fun sum(a: Int, b: Int): Int {
return a + b
}

// no body
fun sum(a: Int, b: Int) = a + b

// return no meaning value
fun printSum(a: Int, b: Int): Unit { // Unit 可省略
println("sum of $a and $b is ${a + b}")
}

特性

语法糖

空指针处理

函数式编程

泛型编程

参考

安卓基础

生命周期

状态

  • INITIALIZED
  • CREATED
  • STARTED
  • RESUMED
  • DESTROYED

HOOK

  • onCreate()
  • onStart()
  • onResume()
  • onPause()
  • onStop()
  • onDestroy()
  • onRestart()

启动模式

  • standard
  • singleTop
    • 阻止创建栈顶Activity
  • singleTask
    • 阻止常见重复Activity
  • singleInstance
    • 使用独立栈