在 Kubernetes 中使用 Helm 部署 Portainer

善用 K8S 的 Helm 真的很爽,如果没有太多定制化的需求,大多数时候,找到服务的 chart,添加到 helm repo 中,然后 helm install 一安装,服务就上线了,省去了很多配置 DeployMent 啦,配置 ConfigMap 啦,配置 Volume 啦,这些繁琐的步骤。

而且很多时候用这些已经集成好的 Charts 是无伤大雅的,没有人会在意你写了多漂亮的 DeployMent YAML 文件,也没有人会在意你专门为这个服务定制的 Volume 存储有多合乎规定。他们只会在乎你的服务有没有起来,项目上线时间会不会晚。

阅读全文

Golang Map以及if的使用技巧

带类型的 Map

1
2
3
4
5
6
7
type Tea struct{
color string
taste string
}
AAA := make(map[string]*Tea)
// you can also import some other type
BBB := make(map[string]*type.Cat)

make() 可以带参数:类型,长度,容量 type, len, size

二维 Map 的初始化

1
2
3
4
5
6
7
// 我们得先知道我们要多少行
maxRow := 20
twoDimensionalMap := make(map[string]map[string]string)
for i := 1; i <= maxRow; i ++{
rowMap := make(map[string]string)
twoDimensionalMap[i] = rowMap
}

if 的使用技巧

1
2
3
4
5
6
// 我们可以通过接收第二个参数来知道是否存在该值
if value, exist := twoDimensionalMap["233"]["666"]; exist {
// 如果 twoDimensionalMap["233"]["666"]存在的话 exist = true
// 会执行下面的语句
fmt.Println(value)
}

image-20220908120431425

字段书写类型

类型 命名规则 模板
蛇形 (snake case) 使用下划线+小写 下划线命名法 snake_case、user_name
大驼峰 (upper camel case) 单词首字母大写 PythonCat、UserName
小驼峰 (lower camel case) 首单词字母小写,之后的单词首字母大写 userName
匈牙利 (HN case) 属性+类型+描述 nLength、g_cch、hRgn
帕斯卡 (Pascal case) 全部首字母大写 = 大驼峰 UserName
脊柱 (spinal case | kebab case | train case) 使用中划线 python-cat、user-name
自由 (studly caps | sticky caps) 大小写混杂、无简明规则 NeXT、StUdLyCaPs
驼峰蛇形 (snake camel case) 结合驼峰和蛇形命名法 Python_Cat、 user_Name

MySQL 字段到底应该按需分配还是梭哈 varchar(255)

到底应该按需分配还是梭哈 varchar(255) :grey_question:

https://stackoverflow.com/questions/1962310/importance-of-varchar-length-in-mysql-table#answer-1962329

如果我们设计的 varchar 列比实际需求大很多,那么我们在读取数据,对表进行排序的时候,将消耗更多的内存,当数据库引擎觉得内存不够放下我们的列后,它会考虑将部分数据写入磁盘,从而导致性能显著下降

同时更宽的列意味着更宽的索引

所以我们只能在完全不考虑性能的场景下梭哈 varchar(255) -> 为了快速满足需求

尽量搞清楚该字段的限制在哪里,定下一个合理的字段大小

MyISAM 与 InnoDB 的选择

Element el-input 去掉边框

有时候我们得到的需求是不需要这个 的边框的,但是我们又不能直接通过 border: none; or border: 0; 直接把边框干掉

tip:将border属性设成0,虽然边框不见了,但是浏览器依然会对border-width和border-color进行渲染,会占用浏览器的资源。将border设置成none,浏览器就不会做出渲染动作。

然后我就在别人的贴子发现了好东西, >>> , >>> 是vue的深度选择器, vue 引用了第三方组件,需要在组件中局部修改第三方组件的样式,而又不想去除 scoped 属性造成的组件之间的样式污染。此时只能通过 >>> 穿透 scoped

1
2
3
<div class="inputDeep">
<el-input></el-input>
</div>

/* 利用穿透,设置 input 边框隐藏 */
.inputDeep>>>.el-input_inner{
border: 0;
}

/* 如果使用 type 为 textarea 的 input 框的话,就要用下面这个了 /
.inputDeep>>>.el-textarea_inner {
border: 0;
resize: none;/
去掉文本框右下角拉伸的标识*/

}

上面的 >>> 方法已经在 Vue 3 中废除了
网上的方法浪费时间害人不浅,玩 CSS 真还得自己去看文档摸索,去用开发者工具去看样式到底是怎样渲染的,计算样式是什么情况

在用 div 把我们想要修改的目标组件包起来之后

我们写一个样式,这样就搞定了

1
2
3
4
.inputDeep :deep(.el-input__wrapper) {
background-color: #FFFFFF;
box-shadow: 0 0 0 0;
}

其中 :deep 是 Vue 3 中的深度选择器,一个伪类

1
2
3
4
5
<style scoped>
.a :deep(.b) {
/* ... */
}
</style>

上面的代码会被编译成:

1
2
3
.a[data-v-f3f3eg9] .b {
/* ... */
}

前端黑魔法

前端黑魔法

介绍一下我学到的前端的一些奇奇怪怪的知识

  1. == vs ===

在 js 中比较两个变量时,== 比较两个变量的值是否相等

=== 不仅比较值是否相等,还+-30-1——————————————–比较两个变量的类型是否一直

a = 0, b = 0, c = ‘0’

​ a == b => true, a == c => true, b === c => false

  1. !. 非空类型断言符 这个符号表示对象后面的属性一定不是 null 或者 undefined
https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#non-null-assertion-operator-postfix-
  1. ?.

    a?.b

    if a is not null, return a.b

    else return a (null or undefine)

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining

  2. ??

    a ?? b

    if a is nullish return b

    But if a is not null , then return a,

    if a is null, return b

    b is likely a default value.

    Only effective when a is null/undefined

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator

  3. !!

    a !! b = a!(!b)

网络运维日记-7/7凌晨停电

未知原因停电跳闸,未及时断开机柜电源

送电之后电涌冲烂了 NAS 的电源,其他设备电源完好

RouterOS v6.47.4 在开启 Bridge and VLAN tag 之后,其他 Ethernet 上的 VLAN tag 会失效

即 最好不要在当作 Router 使用的 ROS 上开启 Bridge 的功能

我的 XDR-5480 之前在 RouterOS 后接一个非网管交换机可以直接 AP 有线中继,在使用交换机 access 口后,在 RouterOS DHCP Leases 中可以看到该 AP 拿了一个 100.88.88.6 的地址,但紧跟着还有一条 status 为 offered 的100.88.88.7 的地址给该 AP 的 MAC 地址+1的地址,expired time 为 30s

在 AP 的管理页面可以看到只中继成功了 2-3 s,就又中继失败了,不断循环往复,暂未找到具体原因

相信大家一看完上面这两条就知道我干了神魔,我 bridge 了接入网的 vlan 和 RouterOS 的一个网口,然后 AP 直插 RouterOS

网络中心排班系统开发日志-Golang

2022年

5.08 开始学习 Gin 框架

5.11 打开项目,开始用 Golang 重构项目,思考如何从xls课表中提取出想要的信息

5.12 下午五点 xls 分析功能实现完毕,实现 OT(Occupation Table) 提取功能

​ 晚上十一点 数据库结构设计完毕 SQL语句初步书写完毕

5.13 晚上九点半 完成使用 Gorm 框架 实现 OT 表导入数据库

5.14 下午五点半 实现使用Gin框架 从前端POST表单到后台,收集需要排的班次信息,可以开始写排班功能

5.16 上午九点半 完成输入日期,生成排班表功能

​ 下午六点半 完成输入日期,查询指定日期排班表功能

5.18 晚上十点半 完成 OT 表正确初始化并根据课表更新、根据 shift 表 生成 值班时长 duty 表

​ 实现根据当前有空的网管,左连接值班时长表,take 值班时长最少的人排上去

5.19 凌晨三点 完成简单排班功能,班次排得平均得雅痞
6.1 凌晨一点,前端注册表单验证基本实现完毕,使用全局数据库连接

6.8 中午十二点,注册和登录功能实现完毕

6.14 凌晨2点40,现在我们用 cookie 保存用户登录状态 并从后端获取用户信息,在前端显示

6.23 可以选择登录方式

6.28 开始写后台页面,可以查看用户列表

7.3 实现前端组件复用,完善路由传参

TODO:

  • 编写测试用例
  • 前端判断选择的两个排班日期大小,结束日期晚于起始日期
  • 前端输入需要排班日期的时候,输入开始和结束日期之后,要更新下方单选列表,选择每一天的值班类型 单纯用js实现比较麻烦,不如用 Vue
  • 思考到底在哪里连接数据库好
  • 数据库默认值可以用 default 赋
  • 根据课表更新 OT 表 这一步可以使用携程,快速操作,但考虑一学期更新不到几次,这个可以考虑延缓改进
  • initOccupation 可以一次Save 一个网管的
  • 前端开始排班之前,应该还要选择排哪些网管的班次
  • 连续登录五次失败之后需要输入验证码
  • 在 localStorage 中存储用户的选择配置
  • 数据库多一个表,存储学期开始日期,对应周数

需要外置的环境变量参数

钉钉 Appkey

钉钉 AppSecret

/model/database.go dsn

MySQL 数据库地址 用户名 密码

/jwt/generateToken secret Token过期事件

需要用到的网站:

笔记:

​ 前端渲染周日程表的时候,应该的按行渲染的,即一周,一个时间段一个时间段一行过去渲染

​ 获取当前周 -> 获取当前周排班表 ->(option) 选择某一周或者+-周

每个学期要分库分表吗?没必要,一学期的OT表也不超过2MiB,20个人的规模

在给ref对象赋值的时候,要用.value,才能更新到值

毕业设计的题目为《基于Gin、Gorm、Vue的排班OA系统的设计与实现》,提供多人在线实时挑选班次、个人空闲时间管理、调休假、自动排班、考勤统计等功能。

系统后端使用 Golang 语言编写,使用 Gin 作为 http框架、 Gorm 作为对象关系映射框架,系统前端使用 Vue 和 Element UI 组件库,使用 WebSocket 来实现多端实时通讯。

本项目的主要功能之一自动排班已经实现完毕,前端用户 JWT token 路由鉴权也已经测试完毕,在完善前端用户体验的同时,继续学习后端开发技巧,同时该项目借鉴大公司开发中的微服务思想,该项目落地部署以及升级都十分便利。

该需求来自学校网络中心,需要给值班的网管干事排班,以往都是人力去先根据课表知道大家的空闲时间来排班,每周都需要花几个小时排班,费时费力还经常出错,调休也需要人工干预,有了这个系统之后,办公自动化带来的效率是可观的持久的。

系统使用流程:

配置好数据库,创建好表

在每个学期开始时手动初始化该学期的 shift configuration 表,同时更新所有用户的 occupation_init_status 为 0

在要排班之前根据 shift configuration 生成班次,选择开启自由选班几小时或者自动排班

2023/2/13

重新思考项目主要功能框架

  • 解析课程表可以把每一个 cell 解析为事件 类型 起始时间段 结束时间段

2023/2/16

https://github.com/swaggo/gin-swagger

之后swagger 可以用 oAuth,超帅和安全

https://goswagger.io/

TODO:

  • 自由实时在线挑选班次功能 By webSocket

  • Swagger 接口 API 文档

    https://zhuanlan.zhihu.com/p/549252410?utm_id=0

    放弃使用 swagger 来生成 API 文档,因为接口数量少,接口数量简单

  • 后台可配置每周生成排班时间,排班生成规则

    用配置好的参数调用生成排班方法,发布选班通知,过时间自动补齐空闲班次,补齐后通知未能排上班的班次

    如果有特殊排班需求可配置 维护一个数据库表来管理每天的排班,每个时段排不排班,排几个人

    shift_configuration

2023/2/21

https://zhuanlan.zhihu.com/p/383848749

https://github.com/rs/zerolog

2023/3/2

Golang func() init

2023/3/7

需要确认 个人的当前学期的空闲表是否有被创建

Current_OccupationTable_Status 0->未创建 1->已创建

在旧学期过去两周后(手动),重置所有的user.Current_OccupationTable_Status = 0

管理员功能:

班次管理

生成班次

开启班次自选功能 指定日期的班次 + 截止选班次时间

获取某一周的shiftConfig

发给前端的时间统一用 Unix

前端也要有一套时间转换的工具

ENV 配置项该用起来了

2023/3/9

在管理员审批通过注册的账号的时候,给该账号生成空闲表

2023/3/16

数据库user表 id 要从 1开始,id = 0 会被go视为零值

注册页添加步骤条 注册-》审核》登陆

可以设置不显示页尾 -> 只有首页显示页尾 Footer

https://code-farmer-i.github.io/vue-markdown-editor/zh/

优化需求:通用用户查询接口

  • 将 getUserList controller 内的数据库逻辑抽象成服务

  • 密码输错五次添加验证码模块

  • 事务开始之后,只有成功或者回滚后才能return

  • 设计 should bind query 的请求,number不能从0开始,不然会绑定失败

  • 在每天值班的四个值班时间结束时间点更新数据库 shift.status -> 2

  • 只有自己的班次可以申请换给别人

  • 认领没有人值班的班次接口

  • 实时挑选班次的系统

    还是用数据库做持久化存储

    在进入排班表页面的时候,建立 websocket 连接

    可选:用一个结构体存下当前用户鼠标最后操作的班次,断开 websocket 连接时删除

    实时传输选班次和放弃班次的结果

  • 更新空闲表的接口

  • 获取个人空闲表的接口 按周

  • 管理员可获取所有人的班次表

  • 新增换班表的接口

  • 新增获取换班表详情的接口

  • 新增获取换班表列表的接口

  • 换班表列表的接口添加页数和页码

  • 新增同意或拒绝换班申请的接口 同意后更新班次表

  • 新增请假表接口 同意后修改班次表的状态为已请假

  • 已请假状态别人可以再认领班次

  • 新增干事排班

  • 新增干事的班次类型

  • 班次状态总览: -2 干事未排班; -1 未排班; 1 已排班; 2 干事已排班 3已请假; 4干事已请假; 5旷班; 6干事旷班; 7 已值班; 8干事已值班; 9 任选阶段 10 干事任选阶段

  • 给周班次上锁解锁接口

  • 生成班次的时候,只有两个选项,直接排班 or 任选 x 小时,x小时后自动锁定班次

  • 锁定班次接口

  • 修改密码的接口

  • 防止密码爆破操作

  • 输出日志

  • 值班时长统计

  • 前端用户信息修改点击取消要重新触发表单验证

  • 日志输出格式,信息全写在message中,使用 sprintf

  • 请假

  • 换班

  • 班次调动

  • Notfound 3s 返回

  • 重置 User_item 的接口

https://docs.gitlab.com/runner/configuration/advanced-configuration.html

https://blog.csdn.net/geekqian/article/details/125942407

https://www.jb51.net/article/264471.htm

gin框架参数零值json绑定的问题 https://blog.csdn.net/weixin_42279809/article/details/107800081

https://blog.csdn.net/qq_39618369/article/details/125991257

https://devpress.csdn.net/vue/62f8fd487e6682346618b3e8.html

FTP 的日常使用操作

FTP 的使用

连接至 FTP 服务器

1
ftp <ftp-host>

输入用户名密码登录

目录操作和 linux 一样

从远端 FTP 主机中下载文件

1
get [remote-file] [local-file]

从远端接收一批文件

#此时每下载一个文件都会有提示,如果不要提示,可以在执行下面命令前执行 prompt off

1
mget [remote-files]

上传文件到远程 FTP 服务器

1
ftp <localfile> [remote-file]

上传当前目录下中一批文件到远端主机

1
mput <local-files>

断开连接

1
Bye

linux 查看当前硬盘使用情况

1
df -lh

笔试面试问题总结

2022年找实习-运维DevOps

某 bank-笔试

  1. 小根堆是什么?堆是什么?

    堆是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于(或不小于)其左子节点和右子节点的值。
    最大堆和最小堆是二叉堆的两种形式。
    最大堆:根结点的键值是所有堆结点键值中最大者。
    最小堆:根结点的键值是所有堆结点键值中最小者。
    而最大-最小堆集结了最大堆和最小堆的优点,这也是其名字的由来。
    最大-最小堆是最大层和最小层交替出现的二叉树,即最大层结点的儿子属于最小层,最小层结点的儿子属于最大层。
    以最大(小)层结点为根结点的子树保有最大(小)堆性质:根结点的键值为该子树结点键值中最大(小)项。

  2. 在一个进程使用完它的时间片后,会进入什么状态?

    进程的三种状态

  3. ArrayList 的底层原理是什么?

    数组

  4. public class A implements A,B?

    接口可以继承接口,不能实现接口 单继承多实现

  5. 使用 DP 应该满足什么性质?

    DP动态规划

  6. TDD 模式是什么?

    TDD:测试驱动开发(Test-Driven Development)

    测试驱动开发是敏捷开发中的一项核心实践和技术,也是一种设计方法论。TDD的原理是在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码。TDD的基本思路就是通过测试来推动整个开发的进行,但测试驱动开发并不只是单纯的测试工作,而是把需求分析,设计,质量控制量化的过程。TDD首先考虑使用需求(对象、功能、过程、接口等),主要是编写测试用例框架对功能的过程和接口进行设计,而测试框架可以持续进行验证。

  7. 使用线程 synchronized 有什么用?多选

    java synchronized

  8. 泛型

  9. 客户端发送 SYN = 1 之后进入什么状态?

    TCP的状态

  10. 图的遍历过程

  11. 创建新目录用什么类?File

  12. 下推自动机读几型文法?

    • 0 型文法

      G = ( VT, VN,P, S ),每一个产生式:α \alphaα ——> β \betaβ ,α \alphaα ∈ \in∈ (VN ∪ \cup∪ VT)* 至少含有一个非终结符,而β \betaβ ∈ \in∈ (VN ∪ \cup∪ VT)*, 则G是一个0型文法,功能相当于图灵机,也称短语文法

    • 1 型文法

      1型文法也叫上下文有关文法,此文法对应于线性有限自动机。它是在0型文法的基础上每一个α \alphaα ——> β \betaβ ,都有 | β \betaβ | >= | α \alphaα |,这里的 | β \betaβ | 指的是 β \betaβ 的长度,特例:α \alphaα ——> ϵ \epsilonϵ 也是1型文法

    • 2 型文法

      2型文法也叫上下文无关文法,通过下推自动机(PDA)识别,2型文法是在1型文法的基础上满足,每一个 α \alphaα ——> β \betaβ 都有 α \alphaα 是非终结符

    • 3 型文法

      3型文法叫做正则文法,他对应有限状态自动机。在2型文法的基础上满足,A ——> a | aB(右线性) 或 A—> a|B(左线性) 例子:A ——> ϵ \epsilonϵ | aB , B —> Ab | a,0型文法、1型文法、2型文法,不是3型文法

算法题

  1. 十进制转 16 进制 有多少位是字母?

  2. n x y

    10 7 8 4 5 1

    n 个人 如果某个人前 x 个人的精神值和后 y 个人的精神值都大于他,那么他开始卷

    求第一个开始卷的人

    可以使用线性前缀和

  3. 动态规划题

    n k

    230848942398

    n 个数,求数字串 n 的子串中,能被k整除的个数

    解题思路:如果一个数 abc, c可以被 k 整除,b*10可以被k整除,那么 bc 也可以被k整除; 质数筛

搜索过程中,建立指向其父节点的指针有什么用?

  1. 建立了路径,可以知道某个子节点是从哪个父节点搜索过来的,便于表示路径
  2. 方便回溯,深搜时可以回到父节点,再去搜索其他节点

***9-笔试

选择题:

  • awk 的用法 这个还得是多用才会

  • MySQL grant 一个用户查询权限:

  • ssh 允许 root 用户登录的设定 PermitRootLogin Yes

  • ssh 允许某个用户登录的设定: PermitUser? AllowUsers?

    AllowUsers Sunnyrian

技术问答题:

  • 请写出 Openstack 的四种基础组件,并描述他们的功能用途

https://www.redhat.com/zh/topics/openstack

Nova 是一种用于完整管理和访问 OpenStack 计算资源的工具,能够处理资源的调度、创建和删除。

Neutron 在连接 OpenStack 服务之间的网络。

Swift 是一种高度容错的对象存储服务,使用 RESTful API 来存储和检索非结构数据对象。

Cinder 提供可通过自助服务 API 访问的持久块存储。

Keystone 负责所有 OpenStack 服务的身份验证和授权。它也是所有服务的端点目录。

​ Glance 可存储和检索多个位置的虚拟机磁盘镜像。

程序题:

写一个脚本,每 30 s ping 一次 1.1.1.1 和 2.2.2.2,如果他们挂了,那么执行一条告警命令 alert xxxxxx;告警规则有收敛,每1h告警一次

问答题:

  • 大学期间你做过的最有成就感的事情是什么?为什么?
  • 你觉得你是一个什么样性格的人?你的什么特质会影响你的发展?
  • 如果你的一个方案被上级领导通过了,但在小组执行过程中受阻无法推进,那么你要怎么样做?

某易-笔试

4 道算法题 1 道问答题

小红拿到了一个 n 个节点、m 条边的无向

小红拿到一个数组 a,她定义一个区间的权值为区间内所有数的乘积末尾 0 的数量,求所有区间的权值之和

称区间 [i, j] 的权值 f[i, j] 为区间内所有数乘积末尾0的数目

例如:一条边连接的两个点的权值是50和60,那么小红删掉这条边获得的价值为3

小红想知道,在保证这张图连通的情况下,最多可以通过删边获得多少价值

输入:第一行: 正整数 1 <= n <= 1e5

第二行: n 个正整数 1 <= ai <= 1e9

样例:input: 3

10 2 5

output: 5

[1, 1] 乘积 10 权值 1

[1, 2] 乘积 20 权值 1

[1, 3] 乘积 100 权值 2

[2, 2] 乘积 2 权值 0

[2, 3] 乘积 10 权值 1

[3, 3] 乘积 5 权值 0

总权值为5

某鹅-笔试

36 道单选题,16 道多选题

  • 网卡 bond 一共有多少种模式链路聚合是模式几?7 6

  • Linux signal 系统是什么?

  • n 道逻辑题

  • 爬 11 个台阶楼梯,每一次爬可以选择爬一个台阶或者两个台阶,有多少种可能?

    https://zhidao.baidu.com/question/55948878.html

  • C++ 知识 k = f( a++) a 等于 3 的话 k 等于几? 3

  • Docker 使用了 Linux 内核的什么特性? Capabilities? Secure Computing mode(Seccomp)?

    docker 依赖于Linux的二个特性:命名空间(namespace)和控制组(cgroups)

  • 进程fork 输出几个p? 14

    for(int i = 0; i < 3; i++)

    {

    ​ print(“p”);

    ​ fork();

    }

  • 37 转 3 进制是什么? 1101

  • NIC Network Interface Controller 网卡 Processer 处理器 Memory 内存 Hard disk 硬盘

  • 会话 1 对一个表上了一个共享锁,那么会话 2 还可以对这个表干嘛? 对某一行上排他锁互斥锁?对整个表又能上什么锁?

  • 用什么指令在 A 服务器检测 B 服务器 HTTP 服务是否工作正常? telnet? ping? nmap?

    curl (但是选项中没有) 我选了 telnet 可以 telnet 服务器 80 端口判断

  • shell 知识: $x= 3 + “15%” + “$25”;

    ​ var_dump($x);

    ​ var_dump(0123==123);

    ​ var_dump(‘0123’==123); 问输出什么?

  • 数据库事务的隔离级别? 哪种不会脏读?

    1)Read Uncommitted(读未提交)

    一个事务在执行过程中,既可以访问其他事务未提交的新插入的数据,又可以访问未提交的修改数据。如果一个事务已经开始写数据,则另外一个事务不允许同时进行写操作,但允许其他事务读此行数据。此隔离级别可防止丢失更新。

    2)Read Committed(读已提交)

    一个事务在执行过程中,既可以访问其他事务成功提交的新插入的数据,又可以访问成功修改的数据。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。此隔离级别可有效防止脏读。

    3)Repeatable Read(可重复读取)

    一个事务在执行过程中,可以访问其他事务成功提交的新插入的数据,但不可以访问成功修改的数据。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。此隔离级别可有效防止不可重复读和脏读。

    4)Serializable(可串行化)

    提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行。此隔离级别可有效防止脏读、不可重复读和幻读。但这个级别可能导致大量的超时现象和锁竞争,在实际应用中很少使用。

    一般来说,事务的隔离级别越高,越能保证数据库的完整性和一致性,但相对来说,隔离级别越高,对并发性能的影响也越大。因此,通常将数据库的隔离级别设置为 Read Committed,即读已提交数据,它既能防止脏读,又能有较好的并发性能。虽然这种隔离级别会导致不可重复读、幻读和第二类丢失更新这些并发问题,但可通过在应用程序中采用悲观锁和乐观锁加以控制。

  • ACID 是什么?

    • Atomicity(原子性):一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
    • Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
    • Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
    • Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
  • Redis 是非关系型数据库吗? 是的

  • B+ 树相比 B 树的优点?

  • 数据库分库分表

  • GPU DNN 深度学习神经算法

  • 数据库 grant 操作 quesr@localhost 只能在localhost登录?错 localhost是指本地这台机

    同时给的权限怎么定义?什么时候该用户可以把他的权限又 grant 给别人?

  • 在 OS 内下,ipmitool 命令可以干哪些事情?

  • 传统 BIOS 相比 UEFI BIOS 的不足有什么?

    UEFI BIOS和传统BIOS的一个显著区别就是UEFI是用模块化、C语言风格的参数堆栈传递方式、动态链接的形式构建的系统,比传统BIOS而言更容易于实现,容错和纠错特性更强,缩短了系统研发的时间。它运行于32位或64位模式,乃至未来增强的处理器模式下,突破传统16位代码的寻址能力,达到处理器的最大寻址。它利用加载UEFI驱动的形式,识别及操作硬件,不同于BIOS利用挂载模式中断的方式增加硬件功能。

  • MySQL 联合索引怎么做?

  • OSI 网卡工作在那几层? 物理层 数据链路层 网络层

  • 以下哪些硬件可以热拔插? 内存 CPU 硬盘 电源

某 bank-一面

  1. 自我介绍:

  2. 为什么会选择做运维?

  3. 描述一下网络4层架构和OSI七层协议我更偏向于去描述一个访问qq.com的过程

    能把自己很熟悉的东西,简洁有力地说出来,也是一种能力

  4. TCP 和 UDP 的区别

    TCP(Transport Control Protocol) 是面向连接的协议,就是说在传输数据之前一定要先建立连接,TCP 是通过三次握手完成连接的建立的,断开连接时采用四次挥手

    1466805-20191021113037722-1150740308.png

    UDP(User Data Protocol) 用户数据报协议

    • UDP使用尽最大努力交付,即不保证可靠交付, 因此主机不需要维持复杂的链接状态表
    • UDP是面向报文的。发送方的UDP对应用程序交下来的报文, 在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界, 因此,应用程序需要选择合适的报文大小。
    • 也不算完全没有连接,WireGuard 隧道会在建立隧道时确定双方的握手间隔,以保持连接活跃,确定隧道连通
  5. HTTP 和 HTTPS

    易于理解版本

    简述一下 HTTPS 的加密过程?

    • 客户端想要访问服务端的页面
    • 服务端向客户端发送证书
    • 客户端校验证书,检验收到的证书是否过期,是否可信任,提取出公钥
    • 客户端生成一个随机码,用公钥加密,然后发送给服务端
    • 服务端拿到加密后的随机码,用自己的私钥解密它,得到客户端生成的随机码
    • 服务端用该随机码加密要传输的页面,传输给客户端

    那么客户端是怎么验证这个证书的可信性呢?

    微信截图_20220428163404.png

    CA 颁发证书的过程

    • 首先 CA 把证书持有者的公钥、用途、颁发者、有效时间等信息打包,然后对这个包进行 Hash 计算,得到一个 Hash 值
    • 然后 CA 会使用自己的私钥将该 Hash 值加密,生成数字签名 Certificates Signature
    • 然后把数字签名和上面的信息,合成数字证书,就有了一张证书

    客户端校验服务端的数字证书的过程

    • 首先客户端会使用同样的 Hash 算法 获取该证书的 Hash 值 H1
    • 然后通过操作系统或者浏览器有的 CA 的公钥信息,解密证书的数字签名,得到一个 Hash 值 H2
    • 最后比较 H1 和 H2,如果它们完全相同,那么这个证书是可信任的,否则为不可信

    一般来说,服务端的数字证书的签发者都不会是根证书,那么无法直接通过本地内置的 CA 公钥去直接校验证书,会有这么一个过程

    • 先通过根证书校验中间证书是否可信任
    • 如果中间证书可信任,再用中间证书的公钥去解析网站证书
  6. Nginx 配置,对 ip 限流的配置?

  7. SFTP FTP

    • SFTP 是在 22 端口建立的 SSH 连接的基础上去进行文件传输的,因此它是安全的传输,但因为要加密,会基于加密算法的类型,有性能损耗,传输效率低
    • FTP 的 21 端口用于传输控制信息,是否使用 20 端口作为传输数据的端口与 FTP 使用的传输模式有关,如果采用主动模式,那么使用20端口,被动模式的话使用随机端口传输数据
    • FTP 是用明文传输数据的,不对数据进行加密
  8. 平常用什么去 genkey?ssh-keygen

  9. 对数据库这方面了解怎么样?

有数据库表

客户表:cust(cust_id,cust_name)

理财产品表:prod(prod_id,prod_name)

客户购买理财产品表:cust_prod(cust_id,prod_id)

  • 查询所有 A 客户购买了,而 B 客户没有购买的产品名

    select prod_name from cust, prod, cust_prod

    where cust.cust_id = cust_prod.cust_id and

    ​ prod.prod_id = cust_prod.prod_id and

    ​ cust_name = “A” and

    ​ not in ( select prod_name from cust, prod, cust_prod

    ​ where cust.cust_id = cust_prod.cust_id and

    ​ prod.prod_id = cust_prod.prod_id and

    ​ )

  • 查询所有 A 客户购买了,而 B 客户也购买了的产品名

  • 查询购买了客户 A 所有产品的客户名

  1. 什么是自动化运维?和传统运维有什么区别?

    例如 PaaS ,开发人员需要什么,我们直接提供什么,运用 openstack、k8s、vSphere 等平台,直接提供需要的服务给开发人员,使软件部署到生产环境这一过程得到简化,实现更高效的开发和生产

    传统运维:告诉我你的需求,需要装什么 Linux 系统? 需要多大的内存硬盘要多少CPU核心?网络需求是什么?

    自动化运维:告诉我你需要部署什么服务,我来写 Jenkins,配置好了之后,开发人员一键即部署服务到生产环境,无需管理各种生产以及开发环境的变化

  2. 未来三年的规划,职业生涯的规划?

东方**-笔试

40 道 选择题 1 道 编程题

  1. w3c 制定的规范 js 处理的顺序是怎样的? 事件捕获 事件处理 事件冒泡

  2. java final 变量 父类实例化被拿去赋值给另外一个实例化,能修改吗?

  3. char a = ‘8’ switch(a + 1)

  4. JS 跨域请求数据使用什么? window.name❌

  5. DevOps 关键组件 持续集成 持续交付 持续测试 快速交付

  6. 使用 trustkit 校验 SSL 证书?

  7. 哪个 HTTP method 用于资源更新? update?

  8. char [][3] 有 10 个元素,第一维度最少是? 4?

  9. SQL injection (SQL注入)是针对客户端的吗? nope

  10. 数组相对链表的优点?存储空间小

  11. 哪种 SQL 语句不需要 COMMIT? CREATE 和 ALTER

  12. git pull 合并吗? 可以选择 merge 或者 rebase

  13. Promise 添加回调函数用什么? .then

  14. StringBuffer 和 StringBuilder

  15. XMLHttpRequest sent() 前使用什么方法? init?

  16. Vue 组件参数传递 parameter

  17. DDoS 破坏了 _ _ 性? 可用性

  18. Vue V-if V-show

  19. ARP 属于 WEB 攻击吗?

  20. 编程题 给一个文件 access.log

    读取文件,提取每一行的浏览器访问记录 URL https://baidu.com/*&^*&(&)^(&*^)

    输出 该域名访问次数 域名 order by 次数