秦悦明的运维笔记

c++ 标准库string和vector (c++ primer4th 读书笔记)

1. string

字符串。相比c语言里面的char[]可是好用多了。

2. string的4种初始化

  1. string s1;
  2. string s2(s1);
  3. string s3(“value”);
  4. string s4(n, ‘c’);

3. string的操作

操作 解释
s.empty() 是否为空串,返回true或者false if (st.emtyp()) ..
s.size() 字符串长度,相当于java里面的length()
s[n] 数组一样的用法
s1 + s2 连成一个新的字符串,返回
s1 = s2 s1的内容替换成s2的副本
v1 == v2 比较内容是否相等
> < != 比较每个字符,比较字符串会像c语言里面的调用strcmp?不存在的。

4. string::size_type类型

size()返回的是一个string::size_type类型的值,也就是说本质是用for(int i=0; i< s.size();i++)是不精确的,因为size_type是一个unsigned型的值,int会丢失精度。

5. 遍历string

正确的姿势应该是

1
2
for(string::size_type ix = 0; ix != str.size() ;++ix)
str[ix] = '*';

6. vector类型

可变数组,大小可以动态变化,用起来非常方便,个人感觉跟java里面的arraylist类似,而且还是一个模版,还是一个容器,可以包含其他对象。
使用之前先:

1
2
#include <vector>
using std::vector;

7 vector的4种初始化

类型 说明
vector v1; 保存类型为T对象
vector v2(v1); v2是v1的一个副本
vector v3(n, i); v3包含n个i
vector v4(n) 初始化n个副本的T
1
vector<int> fvec(10);

创建了10个int的vector,每个是0,

1
vector<string> svec(10);

创建了10个string,同时调用默认的构造函数进行初始化,string默认的构造函数是空串。

8. vector对象的操作

操作 说明
v.empty()
v.size()
v.push_back(t) 末尾增加一个t的元素
v[n] 下标操作
v1 = v2 赋值,替换为v2的副本
v1 == v2
!= ,<, <= ,>=, >

9. vector的size

同样返回的是size_type类型: vector::size_type。不过说实话我是经常写成int。。这个习惯要改。

10.添加元素

要用push_back(),千万不能用下标操作:

1
2
3
vector<int> v;
for(vector<int>::size_type ix=0;ix != 10; ++ix)
v[ix] = ix;

这是错误的,下标操作只能获取已存在的元素,正确应该写成:

1
2
for(vector<int>::size_type ix = 0; ix != 10; ++ix)
v.push_back(ix);

11.迭代器

除了用下标以外,标准库还提供了另一种访问元素的方法:使用迭代器 iterator

12.iterator类型

每种容器都有iterator类型

1
vector<int>::iterator iter;

13. begin和end操作

分别指向第一个元素和末端元素的下一个,end()不指向任何元素,只是起到了哨兵的作用。

14.自增,解引用

1
++iter ;

向前移动一个位置,

*iter 用迭代器访问当前指向的元素.

连起来,遍历vector就可以这样写

1
2
for(vector<int>::iterator iter = ivec.begin(); iter!= ivec.end();++iter)
*iter = 0;

c++11里面有个auto类型可以简化iter的定义工作:

1
2
for(auto iter = ivec.begin();iter!= ivec.end(); ++iter)
*iter = 0;

c++也发展迅猛,都发展到c++14了,17正在发展中。
以上就是string和vector的总结,内容跟c++ primer里面的相似度很高,哈哈,相信lippman是不会怪我的~

algs4源码使用

1. 资源

  1. 除了书以外,还有一个专门支持的网站
    http://algs4.cs.princeton.edu/home/

  2. 另一个是soursera上面的
    https://www.coursera.org/learn/algorithms-part1/home/week/1

2. 源码编译

源码在github上面有一份,https://github.com/kevin-wayne/algs4

第四版是用java描述的,编译的话要用到mvn或者gradle ,可以比较熟悉mvn。

mvn的一个注意点是需要设置JAVA_HOME环境变量。
mvn install就妥了。

3. class使用

编译完了以后是一个jar包,class无法直接使用。得这样引用:

1
java -cp algs4-1.0.0.0.jar edu/princeton/cs/algs4/UF < tinyUF.txt

tcp连接建立和断开

1. 建立连接

又叫三次握手,老外叫three way handshake,很好记,分别发三个包,syn,syn+ack,ack
用tcpdump出来就是如下的形式:

1
2
3
4
5
6
7
8
10:24:00.265744 IP (tos 0x10, ttl 64, id 21567, offset 0, flags [DF], proto TCP (6), length 64)
192.168.3.10.58544 > 114.215.206.177.5555: Flags [S], cksum 0xf35a (correct), seq 1754109131, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 811537995 ecr 0,sackOK,eol], length 0
10:24:00.286693 IP (tos 0x0, ttl 52, id 0, offset 0, flags [DF], proto TCP (6), length 60)
114.215.206.177.5555 > 192.168.3.10.58544: Flags [S.], cksum 0xafc3 (correct), seq 2349913793, ack 1754109132, win 28960, options [mss 1312,sackOK,TS val 2088043701 ecr 811537995,nop,wscale 7], length 0
10:24:00.286749 IP (tos 0x10, ttl 64, id 762, offset 0, flags [DF], proto TCP (6), length 52)
192.168.3.10.58544 > 114.215.206.177.5555: Flags [.], cksum 0x3f00 (correct), seq 1, ack 1, win 4103, options [nop,nop,TS val 811538016 ecr 2088043701], length 0

2.断开连接

又叫4次挥手,多了一次是因为tcp是双向全双工的协议,要两边都关一下,然后确认。
但我用telnet测试的时候抓到的都是3个报文,并没有第二个的ack包。

1
2
3
4
5
6
7
8
10:24:13.326683 IP (tos 0x10, ttl 64, id 41433, offset 0, flags [DF], proto TCP (6), length 52)
192.168.3.10.58544 > 114.215.206.177.5555: Flags [F.], cksum 0x0c2b (correct), seq 1, ack 1, win 4103, options [nop,nop,TS val 811551028 ecr 2088043701], length 0
10:24:13.347347 IP (tos 0x0, ttl 52, id 53768, offset 0, flags [DF], proto TCP (6), length 52)
114.215.206.177.5555 > 192.168.3.10.58544: Flags [F.], cksum 0xe848 (correct), seq 1, ack 2, win 227, options [nop,nop,TS val 2088056762 ecr 811551028], length 0
10:24:13.347436 IP (tos 0x10, ttl 64, id 47236, offset 0, flags [DF], proto TCP (6), length 52)
192.168.3.10.58544 > 114.215.206.177.5555: Flags [.], cksum 0xd910 (correct), seq 2, ack 2, win 4103, options [nop,nop,TS val 811551048 ecr 2088056762], length 0

3. tcp头部信息图

1
2
3
4
5
6
7
8
9
10
11
12
0 15 31
-----------------------------------------------------------------
| source port | destination port |
-----------------------------------------------------------------
| sequence number |
-----------------------------------------------------------------
| acknowledgment number |
-----------------------------------------------------------------
| HL | rsvd |C|E|U|A|P|R|S|F| window size |
-----------------------------------------------------------------
| TCP checksum | urgent pointer |
-----------------------------------------------------------------

source port : 源端口, 1024~65535.
destination port : 目的端口,比如常见的80,22等。
sequence number: 序列号,用来将数据正确的顺序重新排序。
acknowledgment number: 确认号,tcp期望接下来收到的数据段。
rsvd: 用于建立和终止会话的控制功能。
window size: 窗口大小,发送方愿意接受窗口的大小。
tcp头部一共20个字节,相对udp还是复杂很多的,每次传数据之前要简历虚电路,就是上面的三次握手。

zabbix监控windows网络流量的坑点

1.zabbix监控windows网络流量的坑点

坑点就是会自动发现一堆网络接口出来,大部分是无用的,不想linux那样干净,就eth0,eth1。

2.究竟该看哪个?

首先排除一堆无用的接口信息,比如说microsoft开头的,redhat开头的,但这个不绝对,跟底层虚拟化做法有关系。阿里云上面定位的是2个相对正常的图

  1. Network traffic on Net Device PV Driver
  2. Network traffic on Net Device PV Driver #2

PV Driver的图:
PV Driver

PV Driver #2的图:
PV Driver #2

看上去都挺像回事的,但是应该看哪个呢?

这个不能靠猜,找阿里云的图做对比:

阿里云监控图

可以看出流量应该看 Network traffic on Net Device PV Driver #2

3.hexo引用图

文档:
https://hexo.io/zh-cn/docs/asset-folders.html

_config.yml配置:

1
post_asset_folder: true

正确的引用图片方式是使用下列的标签插件而不是 markdown :

1
{% asset_img example.jpg This is an example image %}

通过这种方式,图片将会同时出现在文章和主页以及归档页中。

自动化工具saltstack初探

1. 最早接触

最早接触是在2012年左右,当时我记得是在epel包里,安装起来也很方便,当时就会一些简单的cmd.run,这很easy,相当于pssh那种批量执行命令的用法,如果是那样,就会发挥不出他的优势。

2. salt的优劣势

2.1agent need.

主要是和另一个优秀的自动化工具ansible相比的,salt最大的劣势是需要安装client,也就是salt minion,这会让他看起来比较重,当然现在salt里面有salt-ssh, 也有agentless 的应用。但是一般还是会安装他的客户端。

2.2 support windows.

还一个好处是对windows的支持较好。要让ansible支持windows需要安装powershell3.0 一般win2008都没有安装的,而且生产服务器不让重启,windows上面安装powershell是重启生效的。
salt在windows下面安装就比较easy,直接运行exe下一步下一步设置master地址,minion id然后启动服务就妥了,而且不需要重启服务器,服务起来以后会主动连master,salt-key accept即可,非常方便。

2.3 速度快

因为他安装minion以后就会保持一个长连接,master下发命令到zeromq,然后minion会受到这个订阅信息,之后执行操作,并非处理很快,在大并发下多了明显感觉比ansbile快很多。

3.配置文件

之前就比较头痛他的配置文件sls,但是写贯了ansible的yml,发现他两真差不多。unless比when好用!

4.一些注意点

4.1 防火墙配置

只需要在master端开放4505,4506两个端口,minion的不需要做特别的限制,但是出口OUTPUT链别做限制,我以前在shopex,机器的OUTPUT都会做规则的。

4.2 文件位置

比较强势,必须在/srv下面存放,并不会搜索当前目录下的sls。用惯ansible的要稍微注意一下。