Google_test
Zoran:请按照使用场景, 设计思路, 注意事项的方式向我介绍一下如何使用google test来做C++单元测试
chatgpt:Google Test 是一个流行的 C++ 单元测试框架,提供了丰富的断言和测试功能,使您可以轻松地编写和执行单元测试。以下是如何使用 Google Test 进行单元测试的简要概述:
使用场景
测试 C++ 类和函数的正确性
确保代码的修改不会引入新的错误
有助于提高代码质量和维护性
支持测试驱动开发 (TDD) 和行为驱动开发 (BDD)
设计思路
使用宏定义测试用例和测试函数
通过断言检查预期和实际结果是否匹配
提供命令行选项和运行时配置来选择和执行特定测试
自动生成测试报告,包括失败的测试和错误信息
注意事项
确保每个测试独立,不会相互干扰
使用有意义的测试名来表明测试的目的
保持测试代码简洁,避免复杂的逻辑
在可能的情况下,使用参数化测试避免代码重复
以下是如何使用 Google Test 编写和运行单元测试的步骤:
首先,安装 Google Test。您可以从 GitHub 下载源代码并按照说明进行编译,或使用包管理 ...
zsh的基本使用
TLDR我的 github 地址: JuanZoran我的配置地址: dotfiles
Termux对应的dotfiles在termux分支
本文要点
Zsh的插件管理
Zsh的插件介绍
Zsh的一些使用技巧
Zsh 的插件管理上一篇文章介绍了Zsh的安装和背景同时简单介绍了一下Zsh的插件管理–Zinit,这里详细介绍一下Zinit的使用。
项目地址:zdharma/zinit
官方文档:zdharma/zinit
安装插件类似于vim/neovim的插件管理, zinit 的插件安装也是只需要 github 的username/reponame即可安装
zi 是zinit的别名, 作用完全一样
使用 Termux 的时候, 由于安卓的特殊性, 可能优先使用使用官方打包好的文件更好
安装: pkg install {{package}}
查找: pkg search {{package}}
安装一个最简单的插件:zinit light zsh-users/zsh-au ...
web项目--并发之[半同步半分应堆]
web 项目–并发之[半同步/半分应堆]并发编程模式并发编程方法的实现有多线程和多进程两种,但这里涉及的并发模式指 I/O 处理单元与逻辑单元的协同完成任务的方法。
半同步/半异步模式
领导者/追随者模式
半同步/半反应堆半同步/半反应堆并发模式是半同步/半异步的变体,将半异步具体化为某种事件处理模式.
并发模式中的同步和异步
同步
程序完全按照代码序列的顺序执行
异步
程序的执行需要由系统事件驱动
半同步/半异步模式工作流程
同步线程用于处理客户逻辑
异步线程用于处理 I/O 事件
异步线程监听到客户请求后,就将其封装成请求对象并插入请求队列中
请求队列将通知某个工作在同步模式的工作线程来读取并处理该请求对象
半同步/半反应堆工作流程(以 Proactor 模式为例)
主线程充当异步线程,负责监听所有 socket 上的事件
若有新请求到来,主线程接收以得到新的连接 socket,然后往 epoll 内核事件表中注册该 socket 上的读写事件
如果连接 ...
web项目--服务器框架
web 项目–服务器框架服务器编程基本框架
主要由 I/O 单元,逻辑单元和网络存储单元组成,其中每个单元之间通过请求队列进行通信,从而协同完成任务。
其中
I/O 单元 处理客户端连接,读写网络数据;
逻辑单元 处理业务逻辑的线程;
网络存储单元 指本地数据库和文件等。
五种 I/O 模型
阻塞 IO
调用者调用了某个函数,等待这个函数返回,期间什么也不做,==不停的去检查这个函数有没有返回==,必须等这个函数返回才能进行下一步动作
非阻塞 IO
非阻塞等待,==每隔一段时间就去检测 IO 事件==是否就绪。
没有就绪就可以做其他事。非阻塞 I/O 执行系统调用总是立即返回,不管时间是否已经发生,若时间没有发生,则返回-1,此时可以根据 errno 区分这两种情况,对于 accept,recv 和 send,事件未发生时,errno 通常被设置成 eagain
信号驱动 IO
linux 用套接口进行信号驱动 IO,安装一个信号处理函数,进程继续运 ...
web项目--线程池的设计和实现
web 项目–线程池的设计和实现线程池原理
空间换时间,浪费服务器的硬件资源,换取运行效率.
池是一组资源的集合,这组资源在服务器启动之初就被完全创建好并初始化,这称为静态资源.
当服务器进入正式运行阶段,开始处理客户请求的时候,如果它需要相关的资源,可以直接从池中获取,无需动态分配.
当服务器处理完一个客户连接后,可以把相关的资源放回池中,无需执行系统调用释放资源.
线程池分析线程池的设计模式为半同步/半反应堆,其中反应堆具体为 Proactor 事件处理模式。
主线程为异步线程,==负责监听文件描述符,接收 socket 新连接==,若当前监听的 socket 发生了读写事件,然后将任务插入到请求队列。
工作线程==从请求队列中取出任务,完成读写数据的处理==。
线程池类定义具体定义可以看代码。需要注意,线程处理函数和运行函数设置为私有属性。
123456789101112131415161718192021222324252627282930313233343536373839404 ...
web项目--锁机制
web 项目–锁机制基础知识RAII
RAII 全称是“Resource Acquisition is Initialization”,直译过来是“资源获取即初始化”.
在构造函数中申请分配资源,在析构函数中释放资源。因为 C++的语言机制保证了,当一个对象创建的时候,自动调用构造函数,当对象超出作用域的时候会自动调用析构函数。所以,在 RAII 的指导下,我们应该使用类来管理资源,将资源和对象的生命周期绑定
RAII 的核心思想是将资源或者状态与对象的生命周期绑定,通过 C++的语言机制,实现资源和状态的安全管理,智能指针是 RAII 最好的例子
信号量
用于多线程同步
只支持两种操作 :
P(申请信号量操作)
申请时如果信号量 的值大于 1, 则 - 1
如果信号量的值为 0, 则挂起
V(返还信号量操作)
返还时如果有等待信号量的线程, 则唤醒
如果没有则信号量 +1
信号量的取值可以是任何自然数,最常用的,最简单的信号量是二进制信号量,只有 0 和 1 两个值.
sem_init 函数用于初始化一个未命名的信号量
sem_destory 函数用于销毁信号量
s ...
autohotkey
autoHotKey 的基本语法热键基本语法
原键::替换后的键
基本热键映射
# -> win 键
! -> alt 键
+ -> shift 键
~ ->不屏蔽热键本身的功能
[L-R]Button ->鼠标左右键
Wheel[Up-Down] ->鼠标滚轮上下滑动
热键替换基本语法
::原字符::替换后的字符
较长时可以用 return 终止当前语句
默认需要使用终止符号来替换
终止符号默认有:**-()[]{}’:;”/,.?!`n `t**(注意 `n 是回车,`t 是 Tab,且在它们之间还有一个原义的空格)
**如果不需要终止符号,需要加上*号 **
例如::c*:j@::john@somedomain.com ; 区分大小写且“不需要终止符”。
如果需要替换完之后在末尾加上空格或者 tab,需要在末尾加上反引 ...
gcc
gcc 的使用编译
-E 进行预处理
-S 生成对应的汇编文件
-c 生成对应的二进制可执行文件
ld 对所需要的库和头文件进行链接
-lstdc++ 对 c++文件进行编译操作
-o 直接生成对应可执行文件
-L 包含的库路径
-l(小写 L) 指定库名
-I(大写 I) 指定头文件路径
通常库名为 libxxx.so(动态库)或者 libxxx.a(静态库),指定时只需要输入 xxx 的部分
例如:gcc test.c -o test -L /lib -lxxx
-D 指定宏编译
-g gdb 调试,不加该选项不能使用 gdb 调试
g++
编译 c++的文件,用法和 gcc 类似
可以使用类似-std=c++2a,指定所使用的 c++标准
制作库文件
静态库
编译为.o 文件(二进制可执行文件)
将.o 文件进行打包
使用’’ar rsc +发布的库名+需要打包的文件名’’ 命令进行打包
例如:ar rsc libxxx.a *.o
将头文件和库文件一起发布
动态库
编译与位置无关的代码,生成.o 文件
使用参 ...
gdb
gdb 调试的使用
编译时需要加入-g 选项使用 gdb
r(un) 启动程序不调试(也可以指定参数)
start 启动程序停留在 main 函数
n(ext)执行下一条语句
s(tep)下一条指令,可跳转到函数内部
q(uit)退出 gdb
set args 参数 1.。。 可以设置函数的参数(运行时也可以设置)
l(ist) 显示 10 行代码,默认为主函数文件(指定其他文件需要加行号)
b(reak) 行数 可以设置断点
可以指定函数
可以指定文件+行号
d(el) +断点编号
**可以加上 if ** 设置条件断点
p(rint) + 变量名 可以查看变量值
ptype + 变量名 可以查看变量类型
c(ontinue)** 跳转到下一个断点
display + 变量名 可以跟踪一个变量
undisplay 可以取消跟踪
i(nfo) b 查看断点编号
display 可以查看跟踪编号
git
git 学习和使用
git 学习和使用
git 工作原理
git 命令
git 工作原理
pull
从云端拉取内容到工作区
push
从本地更新内容到云端
add
修改内容到暂存区
commit
将内容上传到本地仓库
fetch
从云端仓库拉取到本地仓库
diff
对比本地仓库和工作区的区别
git 命令
git config
配置用户信息邮箱等
git init
在当前目录初始化 git
git status
查看 git 的状态信息
git add
将内容添加到暂存区
git commit
提交内容到本地仓库
-m “提交内容”
可以省略打开 vim 编辑提交内容
-a
表示 add,可以跳过 git add 的命令
git log
查看之前提交版本
创建.gitignore 文件
在文件中添加需要忽略的文件名
**git branch **
不加分支名表示查看所有分支信息
加分支名表示创建新分支,
创建分支后不会立马跳转到新分支
-d + 分支名
删除对应的分支
-D + 分支名
强制删除对应的分支
git checkou ...