- 博客(622)
- 资源 (24)
- 收藏
- 关注
原创 linux系列文章
linux文章汇总VIMbashMakefileubootu-boot编译过程分析linuxLinux系统编程Linux/UNIX网络编程
2019-11-09 22:07:43 738
原创 linux开发常用工具集
工具集 – linuxMarkdown 编辑器 – TyporaGit版本管理软件 – SmartGitDiff 比较软件 – Meld Diff 差异查看器代码编辑器 – Source Insight代码查看 – Visual Studio Code抓包 – WireShark截图软件-- Shutter串口软件 – PUTTY桌面壁纸软件 – Wallch浏览器 – ...
2019-03-05 22:51:24 659
原创 [go-redis]客户端的创建与配置说明
经过上述过程,一个完整的Client算是创建完成了,后面你就可以使用Client对redis进行操作了。
2024-12-04 21:48:45 891
原创 剖析go协程池实现原理
协程本身也是一种资源,但是协程池有自己的特殊性,那是由协程池执行任务的特殊性决定的,协程作为资源使用时其实是在消费其他资源,也就是说必须向协程池提供一个统一的接口,所有需要协程池执行的任务都需要实现该接口,然后被协程池统一调用。触发协程池工作很简单,只需要向协程池等待的通道中放入一个任务即可,当协程池关闭时,所有任务都会被立即执行,当所有任务执行完毕,协程池中的所有协程都会退出。创建协程池需要指定最大并发数,当有新的任务加入时,会立即被执行,而当没有任务时,所有协程池中的协程阻塞竞争等待通道中的"任务"。
2024-12-02 15:58:40 700
原创 go语言 Pool实现资源池管理数据库连接资源或其他常用需要共享的资源
Pool用于展示如何使用有缓冲的通道实现资源池,来管理可以在任意数量的goroutine之间共享及独立使用的资源。这种模式在需要共享一组静态资源的情况(如共享数据库连接或者内存缓冲区)下非 常有用。如果goroutine需要从池里得到这些资源中的一个,它可以从池里申请,使用完后归还到资源池里。提到池子,channel天然就是一个池子,而且channel是多线程安全的,所以可以直接使用管道来安全的共享资源。文章按照如下四个方面对Pool资源池的设计过程以及使用进行剖析。
2024-12-02 13:52:17 590
原创 go并发设计模式runner模式
真正运行的程序不可能是单线程运行的,go语言中最值得骄傲的就是CSP模型了,可以说go语言是CSP模型的实现。
2024-12-01 13:28:12 1378
原创 go语言切片
还可以通过对切片再次切片来缩小一个切片的大小。空切片和nil切片并不等价,空切片和nil切片是不同的。空切片是一个长度为0,容量为0的切片,而nil切片是一个未初始化的切片,它指向一个不存在的内存区域。操作超过当前切片的容量时,Go 会分配一个新的更大的底层数组,并将原有数据复制到新的数组中。当使用make指定的切片长度为0时,那么底层其实会创建一个指针指向zerobase的切片,这时的Data指向。和C++的vector一样,在进行扩容时,一般会大于实际需要的长度,在实际使用中能有效的减少扩容的次数。
2024-11-29 17:41:49 1131
原创 go结构体匿名“继承“方法冲突时继承优先顺序
在 Go 语言中,当一个结构体匿名嵌入了多个实现相同接口的结构体时,调用该接口方法时会优先选择自己实现的方法,如果自己没有实现该方法,就按照顺序从上到下找到第一个定义的方法。方法的定义顺序决定了调用哪个方法。但是为了避免歧义和提高代码的可读性,建议在设计时尽量避免这种情况,或者在外部结构体中显式地实现接口方法。
2024-11-28 10:22:52 448
原创 Redis持久化即AOF与RDB
虽然每次执行更改数据库内容的操作时,AOF都会将命令记录在AOF文件中,但是事实上,由于操作系统的缓存机制,数据并没有真正地写入硬盘,而是进入了系统的硬盘缓存。当使用Redis存储非临时文件时,一般需要打开AOF持久化来降低因进程终止导致的数据丢失,AOF可以将Redis执行的每一条写命令追加到硬盘文件中,这一过程显然会降低Redis性能,但是大部分情况下这个影响是可以接受的。这时我们希望Redis将数据从内存中以某种形式同步到硬盘中,使得重启之后数据能从硬盘中的记录中恢复数据,这以过程就是持久化的过程。
2024-11-27 15:42:24 592
原创 Redis中如何使用lua脚本-即redis与lua的相互调用
- 定义一个函数-- 函数体end-- 将函数赋值给变量end-- 函数可以借助lua提供的语法糖简写为local funcend。
2024-11-27 13:33:15 1349
原创 Redis中的消息订阅与发布
假设你的博客网站,每次有新文章时需要发送邮件通知,但是邮件发送需要一定的时间,如果采用 FIFO 的方式,可能会导致用户发送邮件的请求时间过长。所以,我们可以使用优先级队列,在队列中存储用户发送邮件的请求,并根据请求的优先级进行排序,优先级高的先发送。订阅者可以订阅一个或若干个频道(channel),而发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都会收到此消息。的键优先级越高,借此特性可以实现区分优先级的任务队列。命令,当链表中没有数据时,客户端会阻塞等待。命令订阅指定名称的频道外,还可以使用。
2024-11-26 16:30:50 893
原创 Redis过期时间和SORT命令的高级用法
在实际的开发中经常会遇到一些有时效的数据,比如限时优惠活动、缓存或验证码等,过了一定的时间就需要删除这些数据。是 Redis 中一个强大的命令,用于对列表、集合或有序集合中的元素进行排序。选项配合,就可以在不排序的情况下,获取多个外部键,相当于执行一个整合的获取操作(类似于 SQL 数据库的。因为直接使用有序集合不如集合操作强大,当排序不经常使用的时候,可以使用集合存储数据,然后使用。命令只能设置精确的秒数,不能设置到毫秒级别,如果需要精确到毫秒级别的控制,可以使用。中的值,然后再用这个值来查找相应的键。
2024-11-25 21:23:28 1274
原创 Redis事务
Redis 事务允许你一次执行多个命令,并且这些命令会按照顺序被执行,中间不会被其他客户端的请求打断。我们可以使用 Redis 事务来确保这些操作作为一个整体执行,不会被其他客户端的请求打断。之间,其他客户端修改了。
2024-11-25 17:32:10 265
原创 redis常用命令整理
如果你的博客想每页显示5篇文章,但是在实际中文章的ID可能因为人为操作而变得不连续,比如从1到100,但是第50个被删除了,那么你再翻页就找不到了。集合类型内部是使用哈希表实现的,所以可以非常快速地添加和删除元素,向两端添加元素和删除元素的复杂度都是O(1)。因此使用集合命令可以非常快速地判断一个元素是否在集合中,在网站中常使用集合来存储标签。列表类型内部是使用双向链表实现的,所以可以非常快速地插入和删除元素,向两端添加元素和删除元素的复杂度都是O(1)。
2024-11-25 16:16:17 997
原创 go语言range的高级用法-使用range来接收通道里面的数据
在 Go 语言中,可以使用循环来遍历通道(channel)。循环会一直从通道中接收值,直到通道关闭并且所有值都被接收完毕。
2024-11-22 10:06:35 1048
原创 go语言闭包捕获的是变量的引用而不是变量的值
在 Go 语言中,闭包捕获的是变量的引用,而不是变量的值。这意味着闭包会引用变量的实际内存位置,而不是在闭包创建时复制变量的值。为了避免在循环中创建多个闭包时出现意外的结果,可以使用匿名函数参数或将循环变量赋值给一个新的局部变量,确保每个 goroutine 捕获的是不同的变量。这两种方法都可以有效解决这个问题,确保每个 goroutine 打印出预期的值。
2024-11-21 15:08:36 561
原创 C++相等和等价的区别?哪些类型的容器使用相等或等价?
很多人在std::set中使用自定义对象时,总是疑惑为啥不实现operator==而是实现operator
2024-09-15 22:41:03 317
原创 std::ios::in与std::ios::out为什么in是读取数据而out是向文件写入数据,以及打开文件时用std::ios::binary | std::ios::in中的in是否多余?
seein注释的事 Open for input,很多同学读到这里就怀疑自己学的英语是不是写错了,这里命名写的是input为啥是读取文件???如果你也有这个疑惑,那说明你把作用对象搞混了,这里的input相对于ifstream 或者fstream来说的,向ifstream input数据,可不就是从文件中读取数据吗。
2024-09-13 16:32:07 536
原创 使用共用体union来管理内存空闲链表将内存压榨到极致
在看STL内存管理时看到一个很不起眼的数据结构,因为以前没有见到过类似的用法,本着STL中没有废物的原则,因此很好奇,结果一查不得了,原来这个使用方法那么精妙。图中的free-list使用的结构体就是 _Obj,白色的条为已经分配给客户端,那么这些已经分配的使用。经常写C/C++也肯定知道,也相当于一个指针,用来引用数据,那么为什么放两个指针在一个公用体里面?字段,因此客户端能够直接使用到首个字节。当这些内存空闲时使用。这样使用之后能将内存压榨到极致。代码中是一个公用体,首个是指向自己本身类型。
2024-05-17 23:24:24 350
原创 leveldb中到处可见的std::aligned_storage是怎样使用的
是 C++11 引入的另一个内置运算符,用于获取给定类型的对齐要求。数据类型在内存中的存储位置通常需要满足特定的对齐条件,以确保访问效率和硬件兼容性。对象且满足其对齐要求的存储区域类型。这种类型常用于实现基于placement new的手动内存管理、类型擦除、对象池等技术,允许在需要时动态创建或销毁。是 C++ 内置运算符,用于获取给定类型的大小(以字节为单位)。类型对象且满足其对齐要求的未初始化的存储区域。头文件中定义的一个模板类,它接受两个模板参数:所需存储空间的大小(由。类型对象所需的内存空间大小。
2024-04-25 09:56:03 328
原创 leveldb中THREAD_ANNOTATION_ATTRIBUTE__宏的作用
宏在 LevelDB 或类似的 C++ 项目中用于指定线程安全相关的源码注解(Source Code Annotation),这些注解有助于清晰地表达程序中函数、变量、类型等元素在多线程环境中的行为特征和并发保证。这样的注解不仅有助于人类阅读者理解代码的线程安全意图,更重要的是它们可以被编译器的静态分析工具识别和利用,以进行潜在的线程安全问题检测。宏及其展开的注解,开发者可以增强 LevelDB 源码的线程安全性,同时借助支持的编译器工具进行静态分析,提前发现潜在的并发问题,提高软件质量。
2024-04-25 09:10:27 547
原创 使用C++实现尾插式循环链表结构
总结起来,这段代码提供了一个简洁而实用的尾插式循环链表的实现,适用于需要高效进行顺序添加和按最近添加顺序删除元素的场景。用于创建新节点并将新节点插入到链表的尾部,即每次新增节点都会成为新的末尾节点。因此有必要实现一款属于自己的双向链表,这样在有需要的时候就能随时增加自己的特性,让链表更好的服务于其他模块。在使用C++实现链表时,我们需要实现两个主要的类:1. node节点类 ,2. 链接node节点的类。,该节点的前驱和后继均指向自身,形成一个空链表的“闭环”。,它作为链表中的实际节点实现。
2024-04-24 22:26:12 616
原创 nohup的作用
命令在Linux环境中为用户提供了一种便捷的方式来启动能在用户退出终端后继续在后台运行的命令或脚本,确保这些任务不会因用户的临时离线而中断,并通过重定向输出方便用户事后检查进程运行情况。其主要作用是允许用户在一个终端会话中启动一个命令或程序,使得该命令或程序能够忽略挂断(SIGHUP)信号,并在用户退出终端(如关闭窗口、断开SSH连接)或注销账户后继续在后台运行。这样,命令的执行不会阻塞用户的终端,用户可以继续在同一个终端中执行其他命令或关闭终端而不影响已启动的后台进程。的脚本,并将输出重定向到默认的。
2024-04-23 10:11:02 299
原创 什么是RabbitMQ
在 RabbitMQ 中,Exchange 是一个特殊类型的队列,它负责接收生产者的消息并将其路由到一个或多个队列。总之,Topic Exchange在RabbitMQ中提供了一种灵活的消息路由机制,允许将消息路由到不同的队列,以满足不同的业务需求。通过Exchange:topics特性,每个Queue都有属于自己的分类,通配符类型的路由。负责将信息丢到Queue中,若有定义Exchange,则丢给Exchange决定要给谁。负责存放消息,具有FIFO先进先出的特性,每个Queue都会有独立的ID编号。
2024-01-22 16:55:17 1214 1
原创 LevelDB之WriteBatch-事务分离的事务处理器
public:public:// 支持copy构造函数// 支持赋值操作// Put 将Key-value形式的值存储在数据库中// 当某个值不想要时,按照key值将对应的键值对删除// 将 batch中所有的缓存清理,并预留出长度和序列号字段足够的长度// 获取batch内部指标数据长度,也就是获取rep_的大小// 当有多个batch想合并时,可以使用append将batch添加到另外衣蛾batch后面。
2024-01-17 15:56:53 299
原创 彻底搞懂C++中string::npos
C++手册里面给出的定义是这样的,string::npos就是一个公有的静态的常量类型的成员变量。使用前需要包含头文件。(-1);这里的size_type就是类型size_t,size_t是一个无符号整形,那么-1也就是其最大值。
2024-01-03 11:23:32 3741 1
原创 Markdown的表格还能这样玩?
写代码相关的文档,避免不了使用markdown,由于其简单的语法,轻便的格式,让办公效率倍增。但是使用markdown有个致命的问题,那就是当需要绘制表格时,markdown只能支持简单的m*n类型的表格,如下是个3*4的表格。当然这种表格应付日常所见的功能足够了,但是很多表格并不是这样简单的表格能表达的,只是使用markdown语法并不能创建出我们想要的表格。但是我们可以采用曲线救国的方法,markdown不是支持html吗,那我们就来用html来绘制个性化的表格吧。这里同样创建了3 * 4。
2023-12-28 17:15:38 541
原创 linux内存寻址原来那么简单
以上就是计算机进行内存寻址的全过程,当然分页单元的过程主要是软件实现的,这里没有对linux的实现接口进行说明,如果感兴趣的可以下载linux 2.6版本查看,虽然新版本的linux分页单元有改动,但是还是推荐你看下2.6版本的,这个版本的功能实现更加的纯粹,也更容易理解。段是代码段、数据段、栈段,按照是否是内核态,又可以分为内核代码段、内核数据段、内核栈段,用户代码段、用户数据段、用户栈段,图中给出的Selector就是用来确定使用哪个段的。因为分段主要靠硬件,而分页主要靠软件。
2023-12-24 16:37:33 999
原创 使用Qt Installer Framework将自己的程序打包成安装包程序
制作安装包程序就是将自己的程序打包成一个可执行的exe,双击之后进行安装。
2023-11-02 17:22:54 2098 2
原创 QT的ui设计中改变样式表的用法
首先我们说一下这个功能具体是干嘛的, 我们在设置很多控件在界面上之后,常常都是使用系统默认的样式,但是当有些时候为了美化界面我们需要对一些控件进行美化这个时候就要用到样式表了,通过修改样式表可以实现对控件样式的任意改变。,用来设置对应类的样式,然后点击Apply就可以看到QPushButton的颜色已经发生了改变。在QT的ui设计中,我们右键会弹出一个改变样式表的选项,很多人不知道这个是干什么的。将光标停留在大括号中,选择添加颜色的小箭头,然后选择背景颜色。首先我们来看下具体的界面。
2023-09-27 23:54:15 979
原创 Qt中事件的处理
我们可以通过setCursor来改变光标的形状,每个继承Widget类的子类都有这个函数,这个函数一旦设置,鼠标的形状就会一直改变。如果在处理事件时,我们只是想,在事件触发时改变鼠标形状,当事件结束时鼠标形状自动修改回来,可以通过临时改变形状的接口进行设置。相对于鼠标事件按键事件反而简单一点,因为按键比较多,所以只需要监测按键的按下和释放即可。当一些时间到来时, 我们可能不想交给对应的组件,这个时候我们就需要用到事件过滤功能了。当然同样的效果也能使用QTimer实现。鼠标事件常用以下几个接口来处理。
2023-09-26 22:09:17 412
原创 自定义拖拽操作
完整源码: https://github.com/zzu-andrew/QT_examples/tree/main/qt_imagedragdrop。我们接下来会实现一个在窗口中拖拽图片的例子,具体功能就是窗口中有一个图片可以任意的拖拽移动这张图片。
2023-09-18 22:47:26 161
原创 拖放操作-拖动文件直接在窗口中显示文件内容
我们通过ui设计的时候,实际上是在和两个控件打交道,一个是主窗口一个是textEdit窗口,因此除了上述接口的实现我们还需要限制一下主窗口和textEdit窗口的行为。这里我们可以通过勾选ui界面的参数选项或者直接在代码中声明,因为我们这里重载的是主窗口的拖拽接口,因此在这里需要将主窗口设置为true,textEdit窗口的拖拽行为设置为false,为什么这样设置才可以,因为这个示例中我们重载的接口是主窗口的拖拽功能而不是textEdit接口的拖拽功能,因此需要将textEdit默认拖拽功能进行限制。
2023-09-17 11:28:06 578
原创 设置伙伴(buddy)-给窗口控件增加快捷键
在官方教程或者很多qt程序中经常看到能使用全键盘操作软件,那么QT creator也支持了这一特性,就是使用设置伙伴来实现的。最终进行预览,只需要按住Alt+对应的字母即可实现将输入光标跳转到对应的输入框中。
2023-09-14 22:42:35 272
原创 Qt消息机制和事件
事件是由Qt或者系统在不同时刻发出的,当敲下鼠标,或者按下键盘,或者当窗口需要重新绘制的时候,就会发出一个相应的事件,一些操作由用户的操作发出,一些则由系统自动发出,如系统定时器事件等。事件对象创建完成之后,Qt将会把事件传递给这个事件的event()函数,event函数并不是直接处理事件而是将事件按照不同类型分发给不同的事件处理器。Qt事件是整个Qt框架的核心,也比较复杂,因为里面牵涉到的函数众多,处理方法也有很多,但是只要耐心的整理一下,实际项目中真正用到的也就那几个经典的。
2023-09-14 00:00:36 399
原创 Qt的窗口系统
Qt 支持模态对话框和非模态对话框。使用 QDialog::exec()实现应用程序级别的模态对话框使用 QDialog::open()实现窗口级别的模态对话框使用 QDialog::show()实现非模态对话框。Qt有两种级别的模态对话框应用程序级别的模态当这种对话框出现时,用户必须首先对对话框进行交互,直到对话框关闭,才能访问程序的其他窗口窗口级别的模态该模态仅仅阻塞与对话框关联的窗口,但是依然允许用户与程序中其他窗口交互一般情况下,默认都是应用程序级级别的模态。
2023-09-10 22:38:14 774
原创 信号和槽机制
使用connect接口不但能使用官方提供的接口也能使用自定义的信号槽,下面我们来实现一个自定义的信号和槽的使用。Q_OBJECTpublic:// 通过emit调用信号接口发出信号signals:// 用来发送信号的接口private:定义的类需要继承QObject类,只有继承了这个类才具有信号槽的能力。
2023-09-08 23:30:24 185
The Robert C. Martin Clean Code Collection - Martin, Robert C-.m
2023-08-15
Technical Overview of LoRa and LoRaWAN-TÜV Rheinland
2023-08-15
Getting Started with LevelDB-Andy Dent
2023-08-15
Alice and Bob: A History Of The World’s Most Famous Couple
2023-08-07
福昕阅读器--linux最新版
2020-11-14
dbeaver-ce_7.2.4_amd64最新版本|dbeaver-ce_7.2.4_amd64.deb
2020-11-14
最新GeoLite2资源整合.zip
2020-10-03
C++基础课程讲义.pdf
2020-09-26
strtok的赞歌.pdf
2020-04-19
bsearch.zip
2020-04-18
RFC2616中文翻译-有待改进.odg
2020-01-15
Sqlite3.pdf
2019-06-30
GDB就该这样用
2019-05-04
IPC进程间通信
2019-05-03
在ubuntu上配置ftp服务器的说明文档,亲测可用(图片)
2018-08-26
自己参考网上的资源配置的vim编译器配置文件
2018-08-25
配置samba服务器的配置文件备份
2018-08-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人