66.链表
为什么会有链表Array 这个数据结构可以定义为是程序在内存中申请的一段连续的内存用于存储特指的数据类型。那么这个时候问题就来了,如果我们希望往表中动态的添加值或删除值该怎么办呢?
以char *s[] 来举例,当我们定义一个s 的字符串,实际上是做了两个动作:
创建了一个*s 的指针
并将内存中一个地址赋值给*s
这时我们初始化s 给他一个值hi!,实际上会从s 这个指针指向的地址开始往后写4个char 类型,即4 字节。h i ! 和 \0,我们会注意到s 中的数据只有字符串在内存中的起始地址,没有结尾地址,字符串的结尾是依靠程序读取到\0 来判断的。
这个时候如果我们希望往字符串中再写入,例如ray ,我们就需要先向操作系统申请一块内存空间为7个字节的内存块,然后将原始字符串*s 到\0 之间的所有值(排除\0)依次拷贝给新的字符串,再添加ray\0 ,释放掉原来的*s 来达成目的。这样的拷贝在大段的字符串操作中是inefficient 的,所以如果我们能够通过为每个字符申请更多的空间例如每个字符2 字节,这时既保存字符的值,又保存下一个字符的地址,是不是就能解决动态增加和删 ...
65.actix_web: Handling Requests
Request Handler - 请求处理程序请求处理程序是一个异步函数能够从客户端请求中提取参数(impl FromRequest),并且能返回可以被转换成HttpResponse 的数据类型(impl Responder)。
请求处理会发生在两个阶段:
Handler 函数(对象)被调用,返回实现了Responder 特征的任意对象。
respond_to() 函数被上一步返回的对象调用,该函数将该对象转换为HttpResponse 或Error。
Type-safe Information ExtractionExtractor 是actix-web 中一个功能强大的工具,能够帮助你轻易地处理和提取从客户端发来的请求中的数据,让程序员专注在逻辑处理上而不是如何提取数据上。另一个值得一提的点是,Extractor 是一个类型安全的信息提取器,提取的任何数据都需要提前设置好它的类型。
actix-web 提供了多种类型的extractors 来适用于不同场景。
PathPath 是用来从请求路径(URL) 中提取数据的提取器。路径(URL) 中可以被提取的部分被称为”动态片段 ...
64.actix_web: Routing and Request Handling
什么是路由 - Routing在actix-web 中,路由定义了程序执行哪一段代码来回应不同URL 的请求。
在actix-web 中,定义路由也就定义了哪个函数来处理哪一个URL。
定义路由在HttpServer 实例中定义路由#[actix_web::main]async fn main() -> std::io::Result<()> { HttpServer::new(|| { App::new() .service(hello) .route("/hey", web::get().to(manual_hello)) }) .bind(("127.0.0.1", 8080))? .run() .await}
在上面的代码中,可以看到main 函数中,定义的App 实例,可以通过route 函数来注册路由。上面的代码定义一个路由/hey,当客户端使用get 请求访问这个URL 时,调用manual_hello 这个函数来回应。
使用marco 宏定义路由#[get(&qu ...
63.Ansible Facts
Ansible FactsAnsible Facts用来采集被控端的信息:IP、主机名、CPU 等等
Fact 采集失败请确保必要的 package 在被控端已安装。
Linux Network fact gathering - Depends on the ip binary, commonly included in the iproute2 package.
测试ansible 192.168.3.161 -m setup -a "filter=ansible_memtotal_mb"# ansible host -m model -a attr# setup 模块# ansible_memtotal_mb 是fact 中预定义的变量,若使用filter 参数,则返回全部预定义变量。
案例 1: 通过 Facts 配置不同的 Zabbix 客户机- hosts: all tasks: - name: install zabbix agent yum: name: zabbix-agent status: pr ...
62.Ansible Variable
Ansible Variable变量简介
变量不能是python keywords 或 playbook keywords。
变量由字母,数字和下划线组成,数字不能开头
以下划线开头的变量并不是私有变量(ansible 中没有区分私有公有变量)
简单变量即变量名 + 值
定义变量使用标准 YAML 语法来定义:
- hosts: app_servers vars: remote_install_path: /opt/my_app_config
使用变量在 playbook 中,使用 jinja2 语法来引用变量。
template: src=foo.cfg.j2 dest={{ remote_install_path }}/foo.cfg
列表变量即变量名 + 多个值,值是有顺序(序列化的)存储在计算机中。
定义变量region: - northeast - southeast - midwest
使用变量region: '{{ region[0] }}'## ou ...
61.Ansible 基础
Ansible 基础Ansible 执行过程
加载配置文件/etc/ansible/ansible.cfg
加载对应的模块文件(commands)
通过 ansible 将模块或命令生成对应的临时 py 文件,并将文件传输至被控端的服务器的执行用户的 $HOME/.ansible/tmp/ansible-tmp-num/xxx.py
给执行文件 +x
执行并返回结果
删除临时 py 文件,sleep 0 退出
Ansible 执行状态
绿色,成功且未进行改动
黄色,成功对被控端进行修改
红色,未成功
Ansible PlaybookPlaybook 由 play 和 task 组成.
Play 定义了谁(要对谁/主机做操作),一个 playbook 中可以有一个或多个 play。
Task 定义了动作(怎么做/做什么操作)
Ansible Playbook 使用了 yaml 语言,yaml 语言的使用特点:
除了以 “:” 冒号结尾的行,所有冒号 “:” 后都要跟一个/多个空格。注意yaml 中一定不能出现 tab (制表符)。
所有 YAML 文件 ...
60.Linux 技巧:让进程在后台可靠运行的几种方法
Linux 技巧:让进程在后台可靠运行的几种方法我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败。如何让命令提交后不受本地关闭终端窗口/网络断开连接的干扰呢?下面举了一些例子, 您可以针对不同的场景选择不同的方式来处理这个问题。
nohup/setsid/&场景:如果只是临时有一个命令需要长时间运行,什么方法能最简便的保证它在后台稳定运行呢?
Hangup 名称的来由在 Unix 的早期版本中,每个终端都会通过 modem 和系统通讯。当用户 logout 时,modem 就会挂断(hang up)电话。 同理,当 modem 断开连接时,就会给终端发送 hangup 信号来通知其关闭所有子进程。
解决方法:我们知道,当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。因此,我们的解决办法就有两种途径:要么让进程忽略 HUP 信号,要么让进程运行在新的会话里从而成为不属于此终端的子进程。 ...
59.Bash - Read 交互
Shell 交互Read 命令默认接收键盘输入,回车符代表输入结束
-p: 提示消息
-t : timeout
-s: slent mode, 不回显(适用于密码输入)
-n: 输入字符个数 (超过限定字符或遇到分隔符就自动执行完而不用等待换行符)
Exampleecho -n "输入 10 个字符"read -n10 t1echoecho $t1---kdhfbenth8kdhfbenth8
58.Bash if 条件判断语句
If 条件判断语句使用 man test 查看条件判断文档。
单 if 语句if [ condition ] then commandfi
example:
#!/usr/bin/bash###############################Author: Ray Ding#Created Time: 2020-10-07_21:12:19#Version: 1.0#Description:# if current_user is not root, print error message##############################if [ $USER != "root" ] then echo "ERROR: need root to exec" exit 1fi
[ray@ray ~]$ bash 06.root_con.shERROR: need root to exec
If-then-else 语句两步判断,条件为真执行 A,条件为假 ...
57.Bash 数组
数组基本数组# 定义数组数组名称=(元素1 元素2 元素3 ...)# 读取数组${数组名称[索引]}# 数组赋值(单个)数组名称[索引]=值# 数组赋值(多个)数组名称=(元素1 元素2 元素3 ...)Array1=(`cat /etc/passwd`) # 将文件中每一行作为一个元素赋值给数组Array2=(`ls /var/ftp/shell/for`)# 删除数组元素unset Array_name[index]# 删除数组unset Array_name
查看数组# 查看系统声明数组declare -a# 访问数组${数组名[索引]}# 访问数组的所有元素 == echo ${Array1[*]}echo ${Array1[@]}# 统计数组元素个数echo ${#Array1[@]}# 统计数组索引echo ${!Array1[@]}# 从索引n 开始echo ${Array1[@]:n}# 从索引n 开始取出m 个元素echo $ ...