自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

追寻梦想的青春

那些年我们心中都曾怀揣着梦想

  • 博客(131)
  • 资源 (1)
  • 收藏
  • 关注

原创 专栏文章列表

C++和Linux相关内容

2023-10-06 22:17:33 473

原创 【kubernetes】专栏目录

kubernetes系列文章目录

2023-10-02 21:41:55 184

原创 【kubernetes】k8s中的选主机制

如果有人认为,传统应用需要部署多个通常是为了容灾,而在k8s上运行的Pod受控制器管理,如果Pod异常或者Pod所在宿主机宕机,Pod是可以漂移到其他节点的,所以,不需要部署多个Pod,只需要部署一个Pod就行。leader-election的具体工作方式是:各候选者将自身的信息写入某一个资源,如果写成功,某个后选择就称为了主,其他就是备,同时,在之后主会定期更新资源的时间,如果超过一段时间未更新时间,其他候选者发现资源的最后更新时间超过一定值,就会认为主挂掉,然后会向资源写入自身信息,从而成为新的主。

2023-09-25 23:43:19 7961 1

原创 基于Flink的实时告警实现(3):时间窗口

本专题将会从0到1实现告警处理流程,并会讲解实现过程中使用到的Flink中的技术。1 告警需求前面的(1)和(2)简单的介绍了flink、开发环境的搭建以及读取kafka的数据并对数据进行转换以便后续处理,现在就可以开始真正的实现告警了。先简单说下需求:该需求的主要目的是对网络交换机进行监控,快速发现网络的问题。采集器接收到网络交换机的指标数据,例如错包等,将这些指标存入到kafka中,然后再从kafka中读取数据并写入到后端的持久化存储。这里需要添加告警功能,常规的方法可能是另外写一个程序,通过.

2021-05-06 19:53:28 2159

原创 基于prometheus的网络指标监控

1 网络指标监控 网络设备(交换机、路由器、防火墙)本身并没有太多的监控方式,常规的是使用snmp,通过oid去采集网络设备的指标,例如,流量或者错包,不过近年来也出现了新的采集方式,例如,telemetry或者gnmi,不过这种方式通常都需要对接接口,并且较新的设备才支持。 prometheus本身提供snmp的exporter,在项目初期人力不足的情况下,可以直接部署prometheus,只要将要采集的设备列表放到配置文件,然后配置好告警规则就可以完成初步的网络指标监控。2 pr...

2021-03-09 23:16:33 5272

原创 [STL源码剖析] 自增和自减运算符的重载

在运算符重载中,自增和自减运算符的重载因为其操作数的问题而呈现出与其它运算符重载不一样的特性。

2014-01-07 15:16:00 1598

原创 [C++ Primer] 第十五章的句柄类

为什么要使用句柄呢?句柄可以用来管理指针,以句柄代表的语义可以将句柄分为:指针型句柄和值型句柄。

2013-12-09 20:54:38 1123

原创 那些年我们一起追寻过的考研(华科计算机)

——痛并快乐着我的基本情况:    我是武汉市的一名应届本科生,参加了2012年的考研,报考华中科技大学计算机学院。    初试成绩:政治:61分 英语:63分 数学:138分 专业课:124分 总分:386分我的考研经历:    高考失利,让我只能在一所非211的高校就读,很早就下定决心要考研了。我是大三下学期开始准备的,大三寒假一来,早上记记单词,平时有时间的话看看高数的教

2012-04-26 10:22:52 7110 1

原创 【监控】使用process-exporter监控进程

exporter在基于prometheus的监控系统中属于数据采集模块,每个exporter采集某类数据,由prometheus定时调用exporter接口拉取,因此,如果需要通过prometheus监控某个指标,就需要找到实现这个指标的exporter,或者自己实现exporter。exporter能够采集哪些指标(是否能够采集所需的指标数据)exporter的配置exporter提供的指标可能需要经过计算才能得到所需的指标在实际监控进程时,主要使用的指标就是cpu和内存。

2024-04-09 17:24:32 725

原创 IDA查看std::string的各种操作

相对C语言来说,C++中增加了很多特性,例如,构造函数、析构函数、异常处理等,因此,从汇编级别的语言看,C++就复杂很多。下面使用IDA工具查看std::string的一些操作背后的实现。以下程序在编译,g++版本为。std::string提供了更高层次的字符串操作,并且提供了很多的方法,与C风格字符串相比,使用起来更加方便,但是,在这些方法的底层,编译器默默做了很多事情。

2024-03-29 11:19:21 1042

原创 使用IDA查看二进制

IDA是一款可以查看二进制的汇编级别代码的工具,并且提供了图形的方式展示程序的执行流程,有时候可以用来定位汇编级别的代码崩溃问题。

2024-03-25 18:05:05 853

原创 stm32之GPIO寄存器

外部引脚以16位为一组,内部的数据寄存器都是32位,为了对端口进行配置并方便的进行数据的输入输出,在提供基本的输入输出寄存器的同时,还提供了端口配置寄存器和设置/清除寄存器,能够配置寄存器的模式,并且能够方便的操作单个位。从开发编程的角度上看,数据寄存器都是只能整体操作,而不能单个位操作,因此,如果是直接操作数据寄存器的话,就需要先读取再设置,操作起来比较麻烦,有了设置/清除寄存器,可以方便的操作单个位,而不影响其他位。而在C51单片机中,数据寄存器是可以位寻址的,可以直接对某一位进行与或的操作。

2024-03-24 23:34:53 1049

原创 stm32之使用串口下载程序

当从网上购买stm32开发板基础套件时,可能只有USB TO TTL,因此只能使用串口下载方式。使用串口下载方式需要了解stm32的启动配置,也就是BOOT0和BOOT1对应的含义。下载程序之前需要先将CH340的引脚接好,然后在点击复位时,将程序下载到stm32中。

2024-03-21 23:14:25 1018

原创 stm32之GPIO电路介绍

保护二极管:保护引脚,让引脚的电压位于正常的范围施密特触发器:将外部的模拟信号转换为数字信号上/下拉电阻:通过控制开关,可以设置输入引脚的默认电平状态输入数据寄存器:外部引脚电平转换为数字信号后保存到输入数据寄存器,然后由内部处理器读取输出数据寄存器:内部处理器将数据写入输出数据寄存器,然后通过输出控制电路输出到外部引脚位设置/清除寄存器:该寄存器用于修改输出数据寄存器中的某一位的值。

2024-03-19 23:47:02 1208

原创 ANTLR4规则解析生成器(五):错误处理

antlr4在进行语法分析时,如果发现有不符合语法规则的语句时,默认情况下是会打印一行错误信息,通过创建基于的类,可以对错误信息自定义,使得错误信息的可读性更好。

2024-03-11 15:18:04 1048

原创 ANTLR4规则解析生成器(四):优化计算器程序

antlr4默认只会为一条规则生成一个节点处理函数,如果规则的备选分支比较多,在处理该节点时就需要在里面写很多的分支语句,通过为每个备选分支设置标签,可以为每个备选分支生成一个处理函数,在单个处理函数中就可以直接处理Listener适合只需要遍历语法分析树,不需要进行数据交互的场景,例如,语法检查,但是也可以通过创建一个全局的数据结构保存中间结果;Visitor适合可以自定义节点访问的场景,在访问节点时可以返回数据,例如,计算器程序。

2024-03-06 15:49:58 326

原创 python环境搭建(Python 3.11.8)

当开发完成后,需要将我们的程序分发,一种方式是直接给python脚本,这种方式其他人就可以看到你的逻辑,但是对于不想知道你的逻辑,只是想调用的话,就需要安装python的环境,但是大家知道,python的环境跟python的版本和包的版本相关,有时候还比较麻烦,另一种方式是将程序编译为二进制,其他人不关心你的实现逻辑,只想调用的话,这种方式是比较好的。会发现只有默认的pip和setuptools,然后我们就可以自由的在里面进行开发了,也可以使用。的包,在比较新的版本中是可以直接使用内部的模块安装的。

2024-03-01 11:48:31 819

原创 ANTLR4规则解析生成器(三):遍历语法分析树

定义好词法和语法规则,就可以对提供的输入串进行词法分析和语法分析,得到语法分析树,antlr4提供了Listener和Visitor两种机制遍历语法分析树

2024-02-29 21:06:59 1113

原创 ANTLR4规则解析生成器(二):编写规则文件

本文简单回顾了编译原理中的一些名词解释,然后对sqlite中的sql的g4文件的部分内容进行了解析,大概可以了解到g4文件的编写方式,其实就是用正则表达式描述所有支持的文本结构。

2024-02-20 18:44:37 784

原创 ANTLR4规则解析生成器(一):入门

ANTLR是ANother Tool for Language Recognition的缩写,它是一个强大的用于读取、处理、执行和翻译结构化文本或二进制文件的语法分析器生成器,广泛用于构建语言、工具和框架,通过语法描述规则,它能够生成一个可以遍历解析树的解析器。ANTLR4是ANTLR的第4个版本。

2024-02-05 19:04:00 1549

原创 【kubernetes】集群网络(二):Flannel的VxLan、Host-GW模式

Flannel作为k8s中广泛使用的网络插件,它的实现相对容易理解,它还提供了不同的模式,常用的是VxLan和Host-GW,由于Host-GW要求宿主机在同一个网段,使用受限,因此,最常用的还是VxLan。

2024-02-01 21:40:40 838

原创 C++多线程编程(四): atomic原子操作

原子操作的意思是该操作执行过程中不能被中断,该操作要么不执行,要么全部执行,不存在执行一部分的情况。在编程语言中,有些操作虽然看起来只有一行,但是变成机器语言后就是多个操作步骤,其中的每个操作步骤都是一个原子操作,但是这些操作合起来却不是原子操作,这样的代码在并发执行时可能会调度到其他线程,从而出现中断的情况,造成数据不一致。原子操作是不能被分割和中断的操作,在多线程并发环境中修改共享数据时,由于数据更新操作不是原子的,会造成数据不一致。

2024-01-21 20:28:05 1059

原创 C++多线程编程(三): std::thread线程类

在C++11以前,如果要使用多线程,就需要使用各平台的多线程库,例如,Linux上可以使用pthread,windows上可以使用win32或者MFC提供的多线程API,也就是说,如果要使用多线程,就必须与平台绑定,那么程序就不具备跨平台的能力,为了让程序更好的运行在各平台而不需要用大量的宏来控制编译选项,C++11提供了对多线程的支持,提供了std::thread类。

2024-01-19 18:46:55 386

原创 C++多线程编程(二):条件变量

互斥锁是为了保证多个线程在访问共享资源时不会出现不可预期的结果,能够让多个线程不会同时执行lock和unlock之间的代码,也就是说,互斥锁只是保证在访问共享资源时不会出现问题,但是,有一种场景是需要线程之间进行协作,典型的是生产者-消费者模型:生成者生成数据,放到队列后,通知消费者,消费者接收到信号后,从队列中取出数据进行处理。互斥量是用于解决多个线程同时访问某个资源的并发问题,条件变量是解决多个线程之间进行同步的问题。

2024-01-17 18:58:12 910

原创 C++多线程编程(一):互斥锁

在现代程序开发中,会大量使用多线程机制,很多语言都内置了对多线程的支持,而C++直到C++11才提供了对多线程的支持,既然支持多线程,那么一定也提供了锁的支持。为什么多线程就一定用锁呢?因为当程序以多线程运行时,如果有对共享资源的使用,例如,两个线程同时对共享变量进行修改,由于这些操作不是原子操作,就会导致出现异常情况,修改的两个线程都认为操作成功了,但是实际上只有一个成功了。这时就需要锁去保证两个操作都分别执行完成。因此,使用锁就需要搞清楚要保护的共享资源。

2024-01-15 18:56:14 1185

原创 【kubernetes】集群网络(一):基础篇

在容器的场景下,一台物理机上面会运行多个容器,于是,就可以结合VxLAN和Bridge,将容器的网络命名空间接入Bridge,同时,将VxLAN接口也绑定到Bridge,容器之间就可以通过VxLAN网络进行通信。Bridge的中文含义是网桥,提到网桥就不得不提到类似的另外3种设备:集线器、交换机、路由器,它们的主要区别是对应的网络层次不一样,能够理解的信息不一样,从而导致转发行为有所不同。前面的路由表是三层的转发信息,当需要跨网络转发时就需要查找路由表,然后将包转发给下一跳。

2023-12-27 00:07:09 239

原创 【安全】audit的一些问题以及需要注意的地方

当内核在执行audit_set_pid时,内核会占用audit_cmd_mutex,然后判断是否已经有其他进程占用audit,如果有就会尝试发送消息,从而判断用户态进程在正常接收审计日志,那么该调用就会返回File exists的报错。因此,在存在该问题的系统上,不能先执行audit_set_pid,然后通过结果判断,而是应该先干掉占用的进程,只在audit_pid为0时才调用audit_set_pid。当用户态程序消费审计日志过慢,造成缓存队列满时,会触发内核的睡眠机制,造成系统卡顿。

2023-12-22 18:45:18 606

原创 【安全】使用auparse解析auditd审计日志

通过auparse就可以快速方便的实现字段的解析和提取,但是需要注意的是,一旦调用auparse_feed将数据给到auparse,auparse会先放到队列,然后进行解析,因此,如果审计日志量级比较大,有可能放到队列的操作会失败,也就是调用auparse_feed失败,如果想增大日志处理的吞吐量,可以创建一个比较大缓存队列,收到日志后,先放到队列,然后再从队列中取出后调用auparse_feed。在序列号后面就是若干字段。

2023-12-21 18:05:05 606

原创 【安全】audispd调研

从代码中只看到audispd中队列的处理,先将事件放到队列中,然后再从队列中读,对于auditd和audispd之间的缓冲应该是依赖socketpair创建的socket的缓冲区,但是,socket的缓冲区大小是由系统配置决定的,而且auditd的代码中也没看到调用setsockopt设置缓冲区大小的代码。从上面对几个配置文件进行分析可以发现,auditd和audispd只是作为审计日志转发的中间组件,并且使用队列作为中间缓冲,而对于内核的日志发送者来说,日志的接收者只有auditd。

2023-12-19 18:08:28 440

原创 【安全】【Linux】通过/proc/pid/获取进程信息

proc/pid中包含了进程的许多信息,这些信息可以供用户查看,也可以供程序读取,程序可以从这里获取到进程的文件、网络等信息并进行分析,但是,频繁读取也可能影响业务性能。

2023-11-30 17:47:03 1135

原创 【安全】2.6.6版本的audit审计机制分析

用户态程序和内核态程序通过netlink机制进行交互,且接口与网络套接字的一致,都是采用类似sendto/recvfrom的系统调用,只是里面的family字段不同2.6.6版本的audit只支持系统调用的审计,不支持文件和目录的监控2.6.6版本的audit中没有内核态的kaudit线程,审计日志的发送在系统调用退出阶段,相当于是个同步的发送过程,可以想象,当审计日志数量比较大时,可能会影响系统调用。

2023-11-24 17:31:35 796

原创 【Kubernetes】Operator开发之kubebuilder实战(二)

Webhook是一种可以在请求过程中将请求发送给另一个web服务进行处理的机制,例如,GitLab中的Webhook,当向GitLabe仓库提交代码时,GitLab会产生一些事件,可以让GitLab将这些事件发送给我们的Web程序处理,从而可以实现流程的自动化。与GitLabe中的Webhook类似,k8s中的Webhook也是可以在apiserver处理请求时,将请求发送给其他的web服务处理,区别是,k8s中的Webhook不仅可以收到请求,还能够拦截和拒绝请求。

2023-10-29 17:28:09 356

原创 Operator开发之operator-sdk入门

与kubebuilder生成的文件的唯一的区别就是控制器所在的路径,kubebuilder是在internal/controller,而operator-sdk则将控制器代码放在controllers目录,代码是一样的,而且demo_types.go也是一样的,因此,完全可以直接将kubebuilder中的代码直接拷贝到operator-sdk中。这里采用跟kubebuilder一样的例子讲解operator-sdk的开发流程:开发的是一个类似ReplicaSet的资源,它会负责创建一定数量的Pod。

2023-10-28 23:05:14 1221

原创 Linux中常用的性能分析工具

ftrace提供tracefs的接口供用户使用,4.1内核以前的版本,tracing所有的控制文件都在debugfs中,tracefs通常会挂载到/sys/kernel/debug/tracing,为了向后兼容,新的内核在挂载debugfs时,会同时将tracefs挂载到/sys/kernel/debug/tracing和/sys/kernel/tracing。但是,有时候我们除了想知道事件发生了多少次,还需要对事件的某个属性进行分类的统计,或者分析函数的调用栈,总之,希望可以得到更多详细的数据。

2023-10-23 18:06:50 396

原创 【Kubernetes】Operator开发之kubebuilder实战(一)

k8s原生提供了很多资源类型,像用于无状态应用的Deployment、ReplicaSet和有状态应用的StatefulSet,用户可以通过向k8s提交yaml文件的方式进行资源的管理,但是,有时候,原生的这些资源无法满足我们的需求,例如,当用户希望在k8s中部署prometheus进行业务监控。在prometheus的监控体系中,除了二进制程序,重要的就是几个配置文件:prometheus自身要抓取数据的目标、获取到数据后的检测规则等。

2023-10-21 00:24:39 948

原创 一文理解登录鉴权(Cookie、Session、Jwt、CAS、SSO)

登录鉴权是任何一个网站都无法绕开的部分,当系统要正式上线前都会要求接入统一登陆系统,一方面能够让网站只允许合法的用户访问,另一方面,当用户在网站上进行操作时也需要识别操作的用户,用作后期的操作审计。

2023-10-16 18:19:07 904

原创 【kubernetes】带你入门k8s中的HPA

本文讲解了k8s中的HPA水平Pod伸缩机制,分析了扩缩容的整体流程,简单说明了扩缩容的计算方式,并对扩容和缩容中的工程实践中的一些机制进行了分析。

2023-10-14 22:31:58 638

原创 使用gdb调试core文件和breakpad的简单使用

将容器中对应路径的so拷贝到/root/gdb_root中,例如,当缺少/usr/lib/libgcc_s.so.1时,就将容器中的/usr/lib/libgcc_s.so.1放到宿主机的/root/gdb_root/usr/lib/libgcc_s.so.1,然后用gdb开启调试,此时就可以读取到对应的so,但是这种方式就需要将依赖的so都下载放到这里。当程序使用release模式进行编译后,还需要对二进制进行strip去掉里面的符号,一方面可以减小二进制的大小,另一方面当然也是防止程序被逆向。

2023-10-13 18:33:21 590

原创 ss(socket statistics)和netstat获取网络连接的实现

发送数据时,将整个msghdr发送给内核,内核收到数据后,进行解包然后执行对应的逻辑,然后返回数据,此时,用户态程序就需要以类似的逻辑来解析收到的数据:使用recvmsg接收数据,将接收到的数据转换成nlmsghdr,再通过NLMSG_开头的一些宏(NLMSG_OK:正常收到数据;parse_diag_msg:将收到的数据转成inet_diag_msg后,就可以通过其中的inet_diag_sockid获取连接的信息。程序开始时,会通过解析选项,将选项变成下面的struct filter和一些变量的值。

2023-10-12 18:17:25 804

原创 【安全】linux audit审计使用入门

rules:审计规则,其中配置了审计系统需要审计的操作auditctl:用户态程序,用于审计规则配置和配置变更kaudit:内核空间程序,根据配置好的审计规则记录发生的事件auditd:用户态程序,通过netlink获取审计日志用户通过auditctl配置审计规则内核的kauditd程序获取到审计规则后,记录对应的审计日志用户态的auditd获取审计日志并写入日志文件。audit的主要应用场景是安全审计,通过对日志进行分析发现异常行为。

2023-10-11 19:08:48 3522 1

Elastic FileBeat 8.0.0支持http output

官方的FileBeat不支持将数据推送到http output,针对这种场景,对FileBeat进行重新编译,也可以参考https://blog.csdn.net/luofengmacheng/article/details/133622566自己进行编译。

2023-10-13

数据结构考研试题1800题集锦(含答案).CHM

对于要考研的同学,考研下载看看,对数据结构的学习有很大的帮助

2012-10-18

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除