- 博客(608)
- 资源 (24)
- 收藏
- 关注
原创 什么是ETCD
raft算法是在收到客户端日志之后就立即落盘日志到wal文件中保存的,如果后面发现出错,就走正常的同步正确日志的流程,将正确的日志添加到后面,这样恢复时重放整个日志,最终节点达成一致的正确状态。数据索引:通知到应用层最大的日志索引,当前已经提交的日志的最大索引,快照索引,日志索引用来日志记录和提交,快照索引用来每次生成新快照,将老的索引的快照进行删除。当网络恢复之后,旧的Leader发现集群中的新Leader的Term比自己大,则自动降级为Follower,并从新Leader处同步数据达成集群数据一致。
2022-05-13 14:06:21 1022
原创 linux系列文章
linux文章汇总VIMbashMakefileubootu-boot编译过程分析linuxLinux系统编程Linux/UNIX网络编程
2019-11-09 22:07:43 612
原创 linux上常用工具集
工具集 – linuxMarkdown 编辑器 – TyporaGit版本管理软件 – SmartGitDiff 比较软件 – Meld Diff 差异查看器代码编辑器 – Source Insight代码查看 – Visual Studio Code抓包 – WireShark截图软件-- Shutter串口软件 – PUTTY桌面壁纸软件 – Wallch浏览器 – ...
2019-03-05 22:51:24 640
原创 C++相等和等价的区别?哪些类型的容器使用相等或等价?
很多人在std::set中使用自定义对象时,总是疑惑为啥不实现operator==而是实现operator
2024-09-15 22:41:03 239
原创 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 401
原创 使用共用体union来管理内存空闲链表将内存压榨到极致
在看STL内存管理时看到一个很不起眼的数据结构,因为以前没有见到过类似的用法,本着STL中没有废物的原则,因此很好奇,结果一查不得了,原来这个使用方法那么精妙。图中的free-list使用的结构体就是 _Obj,白色的条为已经分配给客户端,那么这些已经分配的使用。经常写C/C++也肯定知道,也相当于一个指针,用来引用数据,那么为什么放两个指针在一个公用体里面?字段,因此客户端能够直接使用到首个字节。当这些内存空闲时使用。这样使用之后能将内存压榨到极致。代码中是一个公用体,首个是指向自己本身类型。
2024-05-17 23:24:24 309
原创 leveldb中到处可见的std::aligned_storage是怎样使用的
是 C++11 引入的另一个内置运算符,用于获取给定类型的对齐要求。数据类型在内存中的存储位置通常需要满足特定的对齐条件,以确保访问效率和硬件兼容性。对象且满足其对齐要求的存储区域类型。这种类型常用于实现基于placement new的手动内存管理、类型擦除、对象池等技术,允许在需要时动态创建或销毁。是 C++ 内置运算符,用于获取给定类型的大小(以字节为单位)。类型对象且满足其对齐要求的未初始化的存储区域。头文件中定义的一个模板类,它接受两个模板参数:所需存储空间的大小(由。类型对象所需的内存空间大小。
2024-04-25 09:56:03 285
原创 leveldb中THREAD_ANNOTATION_ATTRIBUTE__宏的作用
宏在 LevelDB 或类似的 C++ 项目中用于指定线程安全相关的源码注解(Source Code Annotation),这些注解有助于清晰地表达程序中函数、变量、类型等元素在多线程环境中的行为特征和并发保证。这样的注解不仅有助于人类阅读者理解代码的线程安全意图,更重要的是它们可以被编译器的静态分析工具识别和利用,以进行潜在的线程安全问题检测。宏及其展开的注解,开发者可以增强 LevelDB 源码的线程安全性,同时借助支持的编译器工具进行静态分析,提前发现潜在的并发问题,提高软件质量。
2024-04-25 09:10:27 505
原创 使用C++实现尾插式循环链表结构
总结起来,这段代码提供了一个简洁而实用的尾插式循环链表的实现,适用于需要高效进行顺序添加和按最近添加顺序删除元素的场景。用于创建新节点并将新节点插入到链表的尾部,即每次新增节点都会成为新的末尾节点。因此有必要实现一款属于自己的双向链表,这样在有需要的时候就能随时增加自己的特性,让链表更好的服务于其他模块。在使用C++实现链表时,我们需要实现两个主要的类:1. node节点类 ,2. 链接node节点的类。,该节点的前驱和后继均指向自身,形成一个空链表的“闭环”。,它作为链表中的实际节点实现。
2024-04-24 22:26:12 543
原创 nohup的作用
命令在Linux环境中为用户提供了一种便捷的方式来启动能在用户退出终端后继续在后台运行的命令或脚本,确保这些任务不会因用户的临时离线而中断,并通过重定向输出方便用户事后检查进程运行情况。其主要作用是允许用户在一个终端会话中启动一个命令或程序,使得该命令或程序能够忽略挂断(SIGHUP)信号,并在用户退出终端(如关闭窗口、断开SSH连接)或注销账户后继续在后台运行。这样,命令的执行不会阻塞用户的终端,用户可以继续在同一个终端中执行其他命令或关闭终端而不影响已启动的后台进程。的脚本,并将输出重定向到默认的。
2024-04-23 10:11:02 264
原创 什么是RabbitMQ
在 RabbitMQ 中,Exchange 是一个特殊类型的队列,它负责接收生产者的消息并将其路由到一个或多个队列。总之,Topic Exchange在RabbitMQ中提供了一种灵活的消息路由机制,允许将消息路由到不同的队列,以满足不同的业务需求。通过Exchange:topics特性,每个Queue都有属于自己的分类,通配符类型的路由。负责将信息丢到Queue中,若有定义Exchange,则丢给Exchange决定要给谁。负责存放消息,具有FIFO先进先出的特性,每个Queue都会有独立的ID编号。
2024-01-22 16:55:17 1184 1
原创 LevelDB之WriteBatch-事务分离的事务处理器
public:public:// 支持copy构造函数// 支持赋值操作// Put 将Key-value形式的值存储在数据库中// 当某个值不想要时,按照key值将对应的键值对删除// 将 batch中所有的缓存清理,并预留出长度和序列号字段足够的长度// 获取batch内部指标数据长度,也就是获取rep_的大小// 当有多个batch想合并时,可以使用append将batch添加到另外衣蛾batch后面。
2024-01-17 15:56:53 249
原创 彻底搞懂C++中string::npos
C++手册里面给出的定义是这样的,string::npos就是一个公有的静态的常量类型的成员变量。使用前需要包含头文件。(-1);这里的size_type就是类型size_t,size_t是一个无符号整形,那么-1也就是其最大值。
2024-01-03 11:23:32 2815
原创 Markdown的表格还能这样玩?
写代码相关的文档,避免不了使用markdown,由于其简单的语法,轻便的格式,让办公效率倍增。但是使用markdown有个致命的问题,那就是当需要绘制表格时,markdown只能支持简单的m*n类型的表格,如下是个3*4的表格。当然这种表格应付日常所见的功能足够了,但是很多表格并不是这样简单的表格能表达的,只是使用markdown语法并不能创建出我们想要的表格。但是我们可以采用曲线救国的方法,markdown不是支持html吗,那我们就来用html来绘制个性化的表格吧。这里同样创建了3 * 4。
2023-12-28 17:15:38 493
原创 linux内存寻址原来那么简单
以上就是计算机进行内存寻址的全过程,当然分页单元的过程主要是软件实现的,这里没有对linux的实现接口进行说明,如果感兴趣的可以下载linux 2.6版本查看,虽然新版本的linux分页单元有改动,但是还是推荐你看下2.6版本的,这个版本的功能实现更加的纯粹,也更容易理解。段是代码段、数据段、栈段,按照是否是内核态,又可以分为内核代码段、内核数据段、内核栈段,用户代码段、用户数据段、用户栈段,图中给出的Selector就是用来确定使用哪个段的。因为分段主要靠硬件,而分页主要靠软件。
2023-12-24 16:37:33 962
原创 使用Qt Installer Framework将自己的程序打包成安装包程序
制作安装包程序就是将自己的程序打包成一个可执行的exe,双击之后进行安装。
2023-11-02 17:22:54 1951 2
原创 QT的ui设计中改变样式表的用法
首先我们说一下这个功能具体是干嘛的, 我们在设置很多控件在界面上之后,常常都是使用系统默认的样式,但是当有些时候为了美化界面我们需要对一些控件进行美化这个时候就要用到样式表了,通过修改样式表可以实现对控件样式的任意改变。,用来设置对应类的样式,然后点击Apply就可以看到QPushButton的颜色已经发生了改变。在QT的ui设计中,我们右键会弹出一个改变样式表的选项,很多人不知道这个是干什么的。将光标停留在大括号中,选择添加颜色的小箭头,然后选择背景颜色。首先我们来看下具体的界面。
2023-09-27 23:54:15 838
原创 Qt中事件的处理
我们可以通过setCursor来改变光标的形状,每个继承Widget类的子类都有这个函数,这个函数一旦设置,鼠标的形状就会一直改变。如果在处理事件时,我们只是想,在事件触发时改变鼠标形状,当事件结束时鼠标形状自动修改回来,可以通过临时改变形状的接口进行设置。相对于鼠标事件按键事件反而简单一点,因为按键比较多,所以只需要监测按键的按下和释放即可。当一些时间到来时, 我们可能不想交给对应的组件,这个时候我们就需要用到事件过滤功能了。当然同样的效果也能使用QTimer实现。鼠标事件常用以下几个接口来处理。
2023-09-26 22:09:17 385
原创 自定义拖拽操作
完整源码: https://github.com/zzu-andrew/QT_examples/tree/main/qt_imagedragdrop。我们接下来会实现一个在窗口中拖拽图片的例子,具体功能就是窗口中有一个图片可以任意的拖拽移动这张图片。
2023-09-18 22:47:26 141
原创 拖放操作-拖动文件直接在窗口中显示文件内容
我们通过ui设计的时候,实际上是在和两个控件打交道,一个是主窗口一个是textEdit窗口,因此除了上述接口的实现我们还需要限制一下主窗口和textEdit窗口的行为。这里我们可以通过勾选ui界面的参数选项或者直接在代码中声明,因为我们这里重载的是主窗口的拖拽接口,因此在这里需要将主窗口设置为true,textEdit窗口的拖拽行为设置为false,为什么这样设置才可以,因为这个示例中我们重载的接口是主窗口的拖拽功能而不是textEdit接口的拖拽功能,因此需要将textEdit默认拖拽功能进行限制。
2023-09-17 11:28:06 543
原创 设置伙伴(buddy)-给窗口控件增加快捷键
在官方教程或者很多qt程序中经常看到能使用全键盘操作软件,那么QT creator也支持了这一特性,就是使用设置伙伴来实现的。最终进行预览,只需要按住Alt+对应的字母即可实现将输入光标跳转到对应的输入框中。
2023-09-14 22:42:35 228
原创 Qt消息机制和事件
事件是由Qt或者系统在不同时刻发出的,当敲下鼠标,或者按下键盘,或者当窗口需要重新绘制的时候,就会发出一个相应的事件,一些操作由用户的操作发出,一些则由系统自动发出,如系统定时器事件等。事件对象创建完成之后,Qt将会把事件传递给这个事件的event()函数,event函数并不是直接处理事件而是将事件按照不同类型分发给不同的事件处理器。Qt事件是整个Qt框架的核心,也比较复杂,因为里面牵涉到的函数众多,处理方法也有很多,但是只要耐心的整理一下,实际项目中真正用到的也就那几个经典的。
2023-09-14 00:00:36 376
原创 Qt的窗口系统
Qt 支持模态对话框和非模态对话框。使用 QDialog::exec()实现应用程序级别的模态对话框使用 QDialog::open()实现窗口级别的模态对话框使用 QDialog::show()实现非模态对话框。Qt有两种级别的模态对话框应用程序级别的模态当这种对话框出现时,用户必须首先对对话框进行交互,直到对话框关闭,才能访问程序的其他窗口窗口级别的模态该模态仅仅阻塞与对话框关联的窗口,但是依然允许用户与程序中其他窗口交互一般情况下,默认都是应用程序级级别的模态。
2023-09-10 22:38:14 749
原创 信号和槽机制
使用connect接口不但能使用官方提供的接口也能使用自定义的信号槽,下面我们来实现一个自定义的信号和槽的使用。Q_OBJECTpublic:// 通过emit调用信号接口发出信号signals:// 用来发送信号的接口private:定义的类需要继承QObject类,只有继承了这个类才具有信号槽的能力。
2023-09-08 23:30:24 172
原创 QT 5.13保姆级安装教程
凡是软件,选新不选旧,一般没有什么问题,但是在QT这里如果你是个初学者,建议还是从5.x开始,毕竟6.x刚出来,初学者想要找6.0的学习资料比较困难。一旦确定好版本之后,安装就比较简单了,直接按照提示点击下一步就行了,不过现在新版本的QT需要注册个QT账号并填上验证之后才能使用,不能跳过了。选好安装目录之后,就需要选择需要安装的组件了,我这里使用的MinGW 64位。这里是选择安装目录,因为QT有很多组件,最好选C盘以外的其他盘,会占用大量的空间。经过以上步骤之后,剩下的就等安装完成即可。
2023-09-07 13:23:20 1043
原创 如何优雅创建一个实例 - levelDB
该对象在构造的时候需要传入一个对比工具,levelDB中数据库不支持并发,因此在进行创建数据库时每个数据库句柄都是创建之后一直到停止使用结束的,那么这个对比工具也是要保证数据库有效的时间内都能正常使用。返回的结果就是8,也就是这个结构体需要按照8字节对其,当我们去除uint64_t的时候,再求对齐长度就会变成4,也就是一个结构体中按照最长位的那个类型进行对齐。来保证已有对象内存绝对大于等于需要申请对象的内存,然后经过饿汉式单例模式封装,经过以上几个步骤之后,一个能长久陪伴数据库句柄的对比工具便诞生了。
2023-08-29 11:31:47 154
原创 什么是多播
我就问了几下chatGPT他就给我生成了一篇文章,看着还有理有据多播(Multicast)是一种网络通信方式,可以将数据传输到一组特定的接收者。与单播(Unicast)和广播(Broadcast)不同,多播只向特定的一组接收者发送数据,而不是向所有的接收者发送数据。多播通常用于视频会议、在线直播、游戏等实时应用场景中,可以提高网络带宽利用率,减少网络负担。在多播中,发送端向一个特定的多播组地址发送数据,多播组地址是一个特殊的 IP 地址,可以识别一组接收者。
2023-07-06 20:49:32 1436
原创 如何做一个有质量的技术分享
分享信息并不难,大多数人都能做到,就算是不善言谈性格内向的技术人员,通过博客或社交媒体,或是不正式的交流,他们都能或多或少的做到。但是如果你想要做一个有质量有高度的分享,这个就难了。下面是陈皓的公司内Knowledge Sharing中的Best Practice,供参考。原文链接:https://coolshell.cn/articles/21589.html。
2023-06-02 16:55:52 716
原创 安利安利-向大家推荐一个超级牛的etcd管理工具-EtcdKeeperFyne
etcd 跨平台管理工具,用于连接etcd,对etcd进行增删改查等…目前常见的Etcd管理工具都是基于web的,使用时通常还需要自己搭建一个web服务器,而且操作起来很不方便,基于此诞生了这款使用方便,操作简单的Etcd管理工具。特点:安装简单,使用方便如果感觉该软件对你有用可以请开发人员喝杯咖啡!!!后续有什么软件开发建议欢迎提交Issu或者关注公众号:码上有话!后台留言。
2023-03-31 10:36:23 2535 1
原创 etcd的使用
在 分布式系统中,最适用的一种组件间通信方式就是消息发布与订阅,即构建一个配置共享中心,数据提供者在这个配置中心发布消息,而消息使用者则订阅他们关心的主题,一旦主题有消息发布,就会实时通知订阅者,通过这种方式可以做到分布式系统配置的集中管理与动态更新。其中listen-client-urls的端口是客户端连接的端口,listen-peer-urls指定的端口是etcd之间同步数据使用的,并且在注册集群的时候,集群指定的端口也是etcd之间同步数据使用的端口。强一致性、高可用的服务存储目录。
2023-03-20 15:19:22 962
原创 string_view
或者std::string转换为string_view,准确的来说,从const std::string -> std::string_view是std::string的basic_string实现的,因为生成string_view的时候并没有进行深拷贝,所以这些隐式转换并没有消耗O(n)个内存。在算法复杂度上当传入const std::string时,转换成string_view只耗时了O(1),因为string里面直接可以去除指针的地址和长度,但是const char。
2023-03-16 20:44:47 457
原创 C++11线程间共享数据
需要注意的是,std::lock_guard并不负责mutex锁对象的生命周期,只是简化了mutex对象加锁和解锁的步骤。但是有些情况下我们必须在获取一个锁的同时获取另外一个锁,这个时候就可以借用std::lock来管理互斥锁防止出现死锁的情况,常用方式见std::lock小节。和lock_guard不同的是,std::unique_lock允许锁之间的传递,比如在两个函数中都需要一把锁中间不间断的一直保护到两个函数结束,那这个时候就可以借用std::unique_lock支持复制传递的特性来实现。
2023-01-31 16:10:20 668
原创 经典bloom算法(**布隆过滤器**)-levelDB拆分
通常判断一个元素是否在一个集合中,一般是将元素和所有集合中的元素进行对比,当前元素和集合中元素某个元素完全一致的时候,就认为当前元素在该集合中,这时常借助树、散列表、链表以及数组等先存储对应的元素,然后在进行对比。当hash函数生成的散列值发生碰撞时,就有可能发生两个不同的值生成的散列值缺失相同的,还有就是经过多个元素映射的布隆过滤器,某个值的散列值经过k的映射刚好全部为1,但是这些1是多个元素一起映射的结果,而不是由单个元素映射在布隆过滤器上的。不能在布隆过滤器中删除元素。
2022-12-02 11:41:28 692
原创 C++经典的arena内存池实现-levelDB的内存池实现
是的你可以相信malloc的实现,但是你不能对你自己有过分的自信,在功能比较复杂,特别是工作量比较大的时候,你不能保证你申请的每块内存都得到有效的释放,这个时候就不可避免的出现内存泄露。Arena在事件处理、流水线处理、请求类型处理中有具有无可无可比拟的优势,事件开始,创建arena,中间过程无论那需要内存,只管申请,申请之后不用担心释放的事情,等到事件结束之后,只需要释放arena句柄就行了,即避免了内存碎片,又避免了内存泄露,同时也减轻了程序员的负担。申请之后忘记释放,造成内存泄露。
2022-11-29 10:53:15 820
原创 C++11并发编程-线程的启用与销毁
通常情况下我们都会在主线程中通过join()函数来等待线程的结束并回收资源,但是有时没有回收的线程时,需要及时将线程分离出去,注意分离出去的线程中能够使用的变量都要保证是非局部的,否则线程会一直在后台运行,如果引用的变量生命周期到了会导致oops。该算法首先根据当前系统中核心个数,以及数据的个数来确定启动线程的个数,确定线程个数之后将数据平均分配给每个线程之后将各个线程计算的结果进行汇总。当你启用一个线程之后,原先线程可能因为抛出异常而退出,这时你可以通过在catch异常时将线程退出来保证程序的正常执行。
2022-11-17 11:44:37 3854
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关注的人