- 博客(68)
- 收藏
- 关注
原创 WSL虚拟机(我的是ubuntu20.04)将系统文件转移到E盘
这时我们就需要恢复默认用户了,这里如果你们的查到的name是带版本的如20.04这样那么第一个字段就是Ubuntu2004最后一个字段是自己的用户名。现在将我们的wsl停掉一定要看到wsl的状态变为stopped,如果第一次停掉状态没有改变,就再停一次。这时启动wsl可以看到可以正常启动但是是root用户,并且我们以前的文件也不在了。备份完成以后去到自己的目录看看,tar有没有存在,存在就可以开始注销wsl了。现在开始备份我们wsl的文件资源,我这里将其命名为Ubuntu.tar。现在将备份文件恢复到。
2025-08-19 19:31:26
339
原创 Docker Container (容器),概念以及指令
通俗来讲,容器是镜像的运行实体。镜像只是静态的只读文件,而容器带有运行时需要的可写文件层,并且容器中的进程属于运行状态。即容器运行着真正的应用程序。容器有初建、运行、停止、暂停和删除五种状态。虽然容器的本质时主机上的一个进程,但是容器有自己独立的命名空间隔离和资源限制。也就是说,在容器内部,无法看到主机上的进程、环境变量、网络等信息,这是容器与直接运行在主机上的进程的本质区别容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器。
2025-08-19 15:26:01
927
原创 Redis类型之Hash
这里还是要强调,redis的类型指的是value的类型。故而这里的hash是把key这一层组织完成以后,到了value这一层,value的其中一种类型还可以是hash。
2025-08-11 21:14:07
818
原创 docker是什么以及镜像命令详解
Docker镜像是一个只读模板文件,包含运行应用所需的文件系统、依赖和工具。它采用分层存储结构(UnionFS),每层都是只读的,通过叠加构建完整镜像。镜像解决了环境一致性问题,将应用与操作系统打包成统一格式,便于部署和共享。常用命令包括:构建镜像(docker build)、拉取推送(docker pull/push)、删除镜像(docker rmi)、导入导出(docker save/load)等。Docker镜像通过分层机制实现了高效存储和快速部署,是容器技术的核心组件。
2025-08-11 20:19:39
1122
原创 Redis类型之String
注意本文以及之后讲的redis的类型但是指的value的类型,所有的key都是stringRedis中的字符串,直接就是按照二进制数据的方式存储的,不会做任何的编码转换,这里相对于mysql就比较好(个人感觉),因为mysql默认的字符集是拉丁文插入中文会失败。string不仅可以存储文本数据还可以存储整数、普通文本字符串、JSON、xml、二进制数据,这里值得一提的是redis对于string的类型限制了大小最大为512M,这是因为redis是单线程其希望进行的操作都比较快速。
2025-08-05 18:57:08
606
原创 Redis过期策略
Redis经常被用于缓存来存储热点数据,这些热点数据很大一部分都存在过期时间,那么redis是怎么知道哪些key(数据)已经过期需要删除,哪些没有过期?对于这个问题最简单的方式就是遍历所有的key,但是这显然是行不通的,效率是一方面,我感觉主要还是因为redis本身是一个单线程,如果通过遍历查询哪些key是过期的会导致现成阻塞。在这里redis采用的过期策略是定期删除和惰性删除结合。在定期删除中需要每次取一部分,进行验证过期时间,并且需要保证这个检查的过程足够快。
2025-08-04 14:45:28
280
原创 redis中的基本全局命令
get和set是redis中最核心的两个命令,其中get可以根据key来去value,set可以将key和value存储进去。值得一提的是redis是按照键值对的方式存储数据的,我们必须进入redis-cli客户端才能输入redis指令这里稍微提一嘴,redis中的数据类型指的是value的类型,key一直是string。并且针对每隔类型的value,有相应的操作指令。value的常见类型有字符串、哈希表、列表、集合、有序集合。
2025-08-01 10:01:23
827
原创 docker技术框架
简介:应用服务与数据库服务共用一台服务器出现原因:互联网早期,访问量比较小,单机足以满足需求架构工作原理:以电子商城为例,可以看到通过应用(划分了多个模块)和数据库在单个服务器上协作完成业务运行技术案例如下:简单来说就是,用户通过浏览器和app访问域名,dns解析域名返回网址,这样用户就找到了服务器的位置,随后请求也就到了服务器的应用层,应用层查询数据库后将结构返回给浏览器呈现给用户单机架构的优点是部署简单成本低,缺点是存在严重的性能瓶颈并且数据库与应用相互竞争资源。
2025-07-29 15:21:48
788
原创 认识Redis
Redis的初心是作为一个“消息中间件”(消息队列)使用的,但是当前很少会直接使用Redis作为消息中间件,因为业内有很多更专业的消息中间件Redis的作用是在内存中存储数据,但是我们平常写的程序不就是在内存中存储数据吗?其实那是因为Redis的应用场景是分布式系统,我们平常写的程序是单机程序,对于单机程序而言其实直接通过变量存储数据的方式是比使用Redis更优的选择。
2025-07-29 10:17:40
465
原创 简易服务器(TCP)
本文介绍了一个基于C++的服务器开发项目,采用epoll处理客户端请求,多线程处理数据并存储到MySQL数据库。项目使用socket网络编程、epoll I/O多路复用、多线程同步等技术,开发环境为Ubuntu 20.04/C++11/MySQL5.7。主要模块包括:1) 封装epoll接口实现事件驱动;2) 封装socket接口处理网络通信;3) 设计epoll服务器核心逻辑;4) 实现线程池处理任务队列;5) 封装MySQL接口进行数据存储。项目通过条件变量实现线程同步,使用智能指针管理资源,最终构建了
2025-06-26 10:59:16
1053
原创 I/O模式之epoll,本文会讲到epoll的相关接口以及底层,还会涉及水平和边缘工作模式,以及通过epoll相关接口实现一个水平工作模式服务端
简单总结就是create用于创建句柄ctl用于添加或者删除关心事件wait用于获取有响应的事件。
2025-06-13 20:19:15
1014
原创 认识CMake并使用CMake构建自己的第一个项目
2.定义项目的名称和使用的编程语言3.指定要生成的可执行文件和其他源文件4.创建一个库(静态库或者动态库)及其源文件5.链接目标文件与其他库6.添加头文件搜索路径简单的CMakeLists.txt文件实例查找库和包 CMake可以通过find_package()指令自动检测和配置外部库和包 常用于查找系统安装的库和第三方库find_package()指令基本用法:指定版本:查找库
2025-06-09 14:21:36
1234
原创 高阶数据结构——并查集
在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集(union-find set)。举个例子:大学社团招新,一共招10人其中科协招4人,艺术团招3人,青协招3人,这10个人刚开始时相互并不认识,每个学生就是一个独立的团体,现在对这些学生编号:{0,1,2,3,4,5,6,7,8,9};
2025-06-02 20:23:06
1064
原创 类的设计模式——单例、工厂以及建造者模式
单例模式:一个类只能创建一个对象,这个设计模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。饿汉模式指在程序初始化时就创建一个唯一的实例对象。适用于多线程环境。他的初始化发生在Singleton Singleton::sig这里。
2025-05-26 18:22:24
856
原创 [linux复习]——多线程
在一个程序里的一个执行路线就叫线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程线程在进程内部执行,本质是在进程地址空间内运行在linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。
2025-04-06 19:11:56
1042
原创 [linux复习]——进程信号
你在网上买了很多件商品,在等待不同商品快递的到来。但即使快递没有到来,你也知道快递来临时,你该怎么处理快递,也就是你能“识别快递”当快递员到你的,你也收到快递到来的通知,但是你正在打游戏,需要五分钟之后才能去拿快递。那么在这五分钟内,你并没有下去拿快递,但是你知道有快递到来了。也就是取快递的行为并不是一定要立即执行,可以理解为“在合适的时候去取”。在收到通知,再到你拿到快递期间,是有一个时间窗口的,在这段时间,你并没有拿到快递,但是你知道有一个快递已经到来。本质上可以理解为“你记住了有一个快递要去取”
2025-04-05 16:10:41
744
原创 Qt常用控件第一部分
Widget 是 Qt 中的核⼼概念. 英⽂原义是 "⼩部件", 我们此处也把它翻译为 "控件" .控件是构成⼀个图形化界⾯的基本要素.像上述⽰例中的, 按钮, 列表视图, 树形视图, 单⾏输⼊框, 多⾏输⼊框, 滚动条, 下拉框等, 都可以称为 "控件".
2025-04-02 20:27:41
971
原创 我为啥从机械专业转到后端
刚开始就是C语言,说实话刚刚开始接触编程语言真的很不舒服,我一度想放弃,但是我发现我如果放弃基本就是打螺丝的了(好笑吧,我还是重一本虽然是双非又尬住了),所以也是属于没有退路的一类人,那再难也要学下去,慢慢的也是将数据结构和算法、C++、linux、数据库、Qt学完了,完成了两个项目开始找实习,这里真的的要吐槽一下C++的菱形继承为啥不删了,还有linux为啥东西这么多,但是回过头来看我真的已经走了很远了。希望我可以找到一个实习,以后能有一个好的工作。
2025-04-01 21:43:32
307
原创 [C++复习——C++11新增语法第二节]——包装器、线程库、锁、原子库
在C++11之前,涉及到多线程问题,都是和平台相关的,比如windows和linux下各有自己的接口,这使得代码的可移植性比较差。C++11中最重要的特性就是对线程进行支持了,使得C++在并行编程时不需要依赖第三方库,而且在原子操作中还引入了原子类的概念。要使用标准库中的线程,必须包含< thread >头文件。注意:1.线程是操作系统中的一个概念,线程对象可以关联一个线程,用来控制线程以及获取线程的状态。2.当创建一个线程对象后,如果没有提供线程函数,该对象实际没有对应任何线程。
2025-03-31 18:48:25
727
原创 【linux复习】——进程间通信
数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变1.2 进程间通信的发展和分类管道->System V进程间通信->POSIX进程间通信管道分为:匿名管道pipe、命名管道。
2025-03-26 19:59:48
1038
原创 [linux复习]——动静态库的概念和生成
动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。我们如果不想再使用动态库的时候不指名路径,那么我们可以修改环境变量或者将.so(动态库文件)拷贝到共享库路径下,一般指/usr/lib。使用外部库:系统中有很多库,如果我们想使用那么就需要在编译时使用 -l选项指明使用的是哪个库比如pthread库。):程序在编译链接的时候把库的代码链接到可执行文件中。
2025-03-26 17:48:37
422
原创 [C++复习]——C++IO流
在C语言中,如果想要将一个整形变量的数据转化为字符串格式,如何去做?1. 使用itoa()函数2. 使用sprintf()函数但是两个函数在转化时,都得需要先给出保存结果的空间,那空间要给多大呢,就不太好界定,而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。在C++中,可以使用类对象来避开此问题。在程序中如果想要使用stringstream,必须要包含头文件。在该头文件下,标准库三个类:istringstream、和。
2025-03-24 15:40:29
747
原创 【C++复习】——类型转换
在C语言中,如果C1. 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败2. 显式类型转化:需要用户自己处理缺陷:转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换。
2025-03-23 14:15:00
764
原创 MySQL事务
CURD(指数据的增删查改)不加控制,会有什么问题?当客户端A检查还有一张票时,将票卖掉,还没有执行更新数据库时,客户端B检查了票数,发现票数大于0,于是又卖了一次票。然后A将票数更新会数据库。这就导致了同一张票被卖了两次。由上面的例子我们就可以知道CURD需要满足的属性有:1.买票的过程是原子的2.买票相互之间不能印象3.买完票应该永久有效4.买前,和买后应该是确定的状态。
2025-03-22 20:28:27
758
原创 背包问题——动态规划的经典问题包括01背包问题和完全背包问题
通过这一过程我们发现其实dp[i][j]是等于max(dp[i-1][j],dp[i][j-v[i]]+w[i])的但是对于dp[i][j-v[i]]这个地方我们需要先判断有没有意义,才能进行后续的填值。我提供的第一个版本里的dp[i][j]选择第i个物品时有两种写法一种是循环一种是我的图片那种方式,但是都不会超时最后用数学的那种是因为美观。我们的第i个物品的体积,然后我们的dp[i][j]其实就和我们在前i-1个物品中选择容积为j-v[i]的最大价值加上我们的第i个物品的价值。初始化这里有视情况而定。
2025-03-21 20:32:42
622
原创 C++复习——实现AVL树,包含单旋转、双旋转,会通过递归来检测我们建的AVL树是否是合格的
这里使用struct是因为它在C++里默认的成员级别是public,_bf就是我们的平衡因子,对于每一个叶子结点他的_bf都是0因为他的左右子树都是空,一定是平衡的。T _data;int _bf;// 平衡因子顺手就把构造函数实现了,因为比较简单。public:AVLTree()// 左旋// 右转//插入//打印函数//求树的高度//判断树是否平衡//析构函数~AVLTree();
2025-03-20 15:32:51
911
原创 Linux复习——基础IO,认识文件描述符、软硬件链接
path:带路径的文件名称(待打开的文件)mode:r:以可读方式打开,不可写,文件不存在,则报错r+:以读写方式打开,文件不存在,则报错w:以可写方式打开,但是不能读。文件不存在,则创建。文件存在,则截断(清空文件内容)文件。w+:以读写方式打开。文件不存在,则创建。文件存在,则截断(清空文件内容)文件a:追加写,不能读。在文件末尾进行追加写,文件不存在则创建文件。文件存在,则在文件末尾开始写。
2025-03-19 20:41:45
812
原创 Qt带参数的信号和槽,以及信号与槽的连接方式
Qt5 在 Qt4 的基础上提⾼了信号与槽的灵活性,允许使⽤任意函数作为槽函数。但如果想⽅便的编写槽函数,⽐如在编写函数时连函数名都不想定义,则可以通过 Lambda表达式 来达到这个⽬的。Lambda表达式 是 C++11 增加的特性。C++11 中的 Lambda表达式 ⽤于定义并创建匿名的函数对象,以简化编程⼯作。说明:•由于使⽤引⽤⽅式捕获对象会有局部变量释放了⽽Lambda函数还没有被调⽤的情况。如果执⾏ Lambda函数,那么引⽤传递⽅式捕获进来的局部变量的值不可预知。
2025-03-19 16:16:34
1430
原创 MySQL索引特性——会涉及索引的底层B+树
索引:提高数据库的性能,索引是物美价廉的东西了。不用加内存,不用改程序,不用调sql,只要执行正确的 create index,查询速度就可能提高成百上千倍。但是天下没有免费的午餐,查询速度的提高是以插入、更新、删除的速度为代价的,这些写操作,增加了大量的IO。所以它的价值,在于提高一个海量数据的检索速度。常见索引分为:主键索引(primary key),唯一索引(unique),普通索引(index),全文索引(fulltext)——解决中子文索引问题。
2025-03-16 16:25:36
1296
原创 Linux复习——进程概念
截止目前。我们所认识的计算机,都是一个个的硬件组件组成*输入单元:包括键盘、鼠标、扫描仪、写板等*中央处理器(CPU):含有运算器和控制器等*输出单元:显示器、打印机等关于冯诺依曼,必须强调几点*这里的存储器指的是内存*不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入输出设备)*外设要输入或者输出数据,也只能写入内存或者从内存中读取*一句话,所有设备都只能直接和内存打交道。
2025-03-15 14:18:36
852
原创 动态路径规划——01背包问题讲解和通过滚动数组优化
我们在填表的时候发现只用到了相邻的两行其实这里可以用滚动数组来优化,只需要一个dp[N]即可当我们填表时只需要在原表操作,但是我们的填表顺序变为了从右往左因为在填dp[i][j]时我们用到了dp[i-1][j]和dp[i-1][j-v[i]]显然dp[i-1][j-v[i]]位置在dp[i-1][j]前面所以如果从左往右填表会导致在填后一个位置的时候前面的位置的值已经被更新。2.1 当我们不拿时那么我们的dp[i][j]显然和dp[i-1][j]是相等的。3.2 当j为0时说明容积为0那么最大价值也是0。
2025-03-14 20:29:48
361
原创 Qt信号与槽
使用“emit”关键字发送信号。“emit”是一个空的宏。“emit”其实是可选的,没有什么含义,只是为了提醒开发人员示例1:1、在widget.h中声明自定义的信号与槽,如图所示;2.在“widget.cpp”中实现槽函数,并且关联信号和槽这里可以通过Alt+Enter快捷键为声明的函数添加定义还可以通过Shift+F2在函数的声明和定义之间快速切换。示例2:当老师说“上课了”,学生就“回到座位,开始学习”1.在源文件中新建两个类,一个是老师类,一个是学生类;
2025-03-13 16:20:01
953
原创 日志系统项目——准备工作了解类的设计模式如单例模式、工厂模式、代理模式
类的职责应该单⼀,⼀个⽅法只做⼀件事。职责划分清晰了,每次改动到最⼩单位的⽅法或 类。使⽤建议:两个完全不⼀样的功能不应该放⼀个类中,⼀个类中应该是⼀组相关性很⾼的函 数、数据的封装⽤例:⽹络聊天:⽹络通信 & 聊天,应该分割成为⽹络通信类 & 聊天类1.2 开闭原则对扩展开放,对修改封闭使⽤建议:对软件实体的改动,最好⽤扩展⽽⾮修改的⽅式。◦⽤例:超时卖货:商品价格---不是修改商品的原来价格,⽽是新增促销价格。1.3 里氏替换原则。
2025-03-12 17:06:03
1146
原创 双指针算法——配合例题讲解
这道题题的意思是遇到0将0后面的数向后移一位让后将0后空出来的位置填为0,这个题一开始我是想暴力的也是两个指针(up和down),但是还开了一个和arr一样大的vector,每次都让up向后走但终止条件时down越界,如果arr[up]是非零直接填到新开的表同时down++,如果arr[up] == 0就让down和down+1处的新开表的值为0然后down向后移两位。*快慢指针的实现方法有很多种,最常用的一种就是:在一次循环中,每次让慢的指针向后移动一位,而快的指针向后移动两位,实现一快一慢。
2025-03-09 21:03:15
373
原创 Qt项目文件解析与注意事项
工程新建之后,在工程目录列表中有一个后缀为".pro"文件,".pro"文件就是工程文件(project),它是qmake自动生成的用于生产makefile的配置文件。
2025-03-09 16:26:01
1622
原创 动态规划之回文字符串,从中等到困难
这个题目让我们找回文子串的个数,这里不要把子串和子序列的概念搞错1.首先我们先确定状态表示(不要问我怎么来的,大多和贪心一样是经验和感觉)如果我们用 一维的状态表示,可以记录以某一位置为结尾的回文串但是并不能确定这一回文串从哪里开始,这并不是我们希望的,所以我们采用二维的状态表示dp[i][j],它表示以i开始以j结尾的回文串。2.推导状态转移方程一. 对于dp[i][j]如果s[i] == s[j]那么在i+1 < j的情况下必然有dp[i][j] = dp[i+1][j-1];
2025-03-08 14:04:27
744
原创 MySQL复合查询——通过案例讲解每个指令
在开始之前可以先准备好相同的数据库方法一:直接在MySQL创建相应的数据库和表第一步:创建数据库并进入数据库第二步:创建部门信息表第三步:创建雇员信息表第四步:创建工资等级表第五步:插入数据方法二:通过数据库的备份完成第一步:在某个目录下创建soctt_data.sql文件并向其中写入以下内容第二步:打开数据库通过一下命令即可如果查到的表内容如下证明表的创建完成。
2025-03-06 16:50:09
1228
原创 STL源码剖析——空间配置器
所有的STL容器其实都有这个缺省模版,他就是我今天的重点空间配置器,但是很抽象的一点是我们一般说空间会想到内存、磁盘或者其他辅助存储介质但是SGI STL提供的配置器,配置的对象是内存,那为什么不叫内存配置器呢。STL中的的容器相信作为一位C++码农在坐的各位都是用的非常熟悉,非常爽了,但是其实我们其实在日常使用时并没有考虑,其最后一位模版参数见下面这段代码。2.空间配置器的标准接口。1.空间配置器的介绍。
2025-03-05 20:46:13
199
原创 【C++复习专题】——内存管理
这段代码涉及了C/C++中程序内存区域划分,如果可以清楚的知道每个变量和只读常量所在C/C++中程序内存区域的位置说明还是可以的。一般在函数内创建的变量都是在栈区的,如果是static变量不论在那创建都是在数据段(静态区),对于ptr1这样的用于指向动态开辟的内存空间的变量,他本身在出栈时会被释放,但是他所指向的空间并不会在出栈时被释放。说明:1.栈又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。
2025-03-04 20:05:42
640
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人