- 博客(602)
- 资源 (24)
- 收藏
- 关注
原创 什么是ETCD
raft算法是在收到客户端日志之后就立即落盘日志到wal文件中保存的,如果后面发现出错,就走正常的同步正确日志的流程,将正确的日志添加到后面,这样恢复时重放整个日志,最终节点达成一致的正确状态。数据索引:通知到应用层最大的日志索引,当前已经提交的日志的最大索引,快照索引,日志索引用来日志记录和提交,快照索引用来每次生成新快照,将老的索引的快照进行删除。当网络恢复之后,旧的Leader发现集群中的新Leader的Term比自己大,则自动降级为Follower,并从新Leader处同步数据达成集群数据一致。
2022-05-13 14:06:21 910
原创 linux系列文章
linux文章汇总VIMbashMakefileubootu-boot编译过程分析linuxLinux系统编程Linux/UNIX网络编程
2019-11-09 22:07:43 597
原创 linux上常用工具集
工具集 – linuxMarkdown 编辑器 – TyporaGit版本管理软件 – SmartGitDiff 比较软件 – Meld Diff 差异查看器代码编辑器 – Source Insight代码查看 – Visual Studio Code抓包 – WireShark截图软件-- Shutter串口软件 – PUTTY桌面壁纸软件 – Wallch浏览器 – ...
2019-03-05 22:51:24 607
原创 nohup的作用
命令在Linux环境中为用户提供了一种便捷的方式来启动能在用户退出终端后继续在后台运行的命令或脚本,确保这些任务不会因用户的临时离线而中断,并通过重定向输出方便用户事后检查进程运行情况。其主要作用是允许用户在一个终端会话中启动一个命令或程序,使得该命令或程序能够忽略挂断(SIGHUP)信号,并在用户退出终端(如关闭窗口、断开SSH连接)或注销账户后继续在后台运行。这样,命令的执行不会阻塞用户的终端,用户可以继续在同一个终端中执行其他命令或关闭终端而不影响已启动的后台进程。的脚本,并将输出重定向到默认的。
2024-04-23 10:11:02 103
原创 什么是RabbitMQ
在 RabbitMQ 中,Exchange 是一个特殊类型的队列,它负责接收生产者的消息并将其路由到一个或多个队列。总之,Topic Exchange在RabbitMQ中提供了一种灵活的消息路由机制,允许将消息路由到不同的队列,以满足不同的业务需求。通过Exchange:topics特性,每个Queue都有属于自己的分类,通配符类型的路由。负责将信息丢到Queue中,若有定义Exchange,则丢给Exchange决定要给谁。负责存放消息,具有FIFO先进先出的特性,每个Queue都会有独立的ID编号。
2024-01-22 16:55:17 1116 1
原创 LevelDB之WriteBatch-事务分离的事务处理器
public:public:// 支持copy构造函数// 支持赋值操作// Put 将Key-value形式的值存储在数据库中// 当某个值不想要时,按照key值将对应的键值对删除// 将 batch中所有的缓存清理,并预留出长度和序列号字段足够的长度// 获取batch内部指标数据长度,也就是获取rep_的大小// 当有多个batch想合并时,可以使用append将batch添加到另外衣蛾batch后面。
2024-01-17 15:56:53 156
原创 彻底搞懂C++中string::npos
C++手册里面给出的定义是这样的,string::npos就是一个公有的静态的常量类型的成员变量。使用前需要包含头文件。(-1);这里的size_type就是类型size_t,size_t是一个无符号整形,那么-1也就是其最大值。
2024-01-03 11:23:32 996
原创 Markdown的表格还能这样玩?
写代码相关的文档,避免不了使用markdown,由于其简单的语法,轻便的格式,让办公效率倍增。但是使用markdown有个致命的问题,那就是当需要绘制表格时,markdown只能支持简单的m*n类型的表格,如下是个3*4的表格。当然这种表格应付日常所见的功能足够了,但是很多表格并不是这样简单的表格能表达的,只是使用markdown语法并不能创建出我们想要的表格。但是我们可以采用曲线救国的方法,markdown不是支持html吗,那我们就来用html来绘制个性化的表格吧。这里同样创建了3 * 4。
2023-12-28 17:15:38 433
原创 linux内存寻址原来那么简单
以上就是计算机进行内存寻址的全过程,当然分页单元的过程主要是软件实现的,这里没有对linux的实现接口进行说明,如果感兴趣的可以下载linux 2.6版本查看,虽然新版本的linux分页单元有改动,但是还是推荐你看下2.6版本的,这个版本的功能实现更加的纯粹,也更容易理解。段是代码段、数据段、栈段,按照是否是内核态,又可以分为内核代码段、内核数据段、内核栈段,用户代码段、用户数据段、用户栈段,图中给出的Selector就是用来确定使用哪个段的。因为分段主要靠硬件,而分页主要靠软件。
2023-12-24 16:37:33 875
原创 使用Qt Installer Framework将自己的程序打包成安装包程序
制作安装包程序就是将自己的程序打包成一个可执行的exe,双击之后进行安装。
2023-11-02 17:22:54 1285 2
原创 QT的ui设计中改变样式表的用法
首先我们说一下这个功能具体是干嘛的, 我们在设置很多控件在界面上之后,常常都是使用系统默认的样式,但是当有些时候为了美化界面我们需要对一些控件进行美化这个时候就要用到样式表了,通过修改样式表可以实现对控件样式的任意改变。,用来设置对应类的样式,然后点击Apply就可以看到QPushButton的颜色已经发生了改变。在QT的ui设计中,我们右键会弹出一个改变样式表的选项,很多人不知道这个是干什么的。将光标停留在大括号中,选择添加颜色的小箭头,然后选择背景颜色。首先我们来看下具体的界面。
2023-09-27 23:54:15 593
原创 Qt中事件的处理
我们可以通过setCursor来改变光标的形状,每个继承Widget类的子类都有这个函数,这个函数一旦设置,鼠标的形状就会一直改变。如果在处理事件时,我们只是想,在事件触发时改变鼠标形状,当事件结束时鼠标形状自动修改回来,可以通过临时改变形状的接口进行设置。相对于鼠标事件按键事件反而简单一点,因为按键比较多,所以只需要监测按键的按下和释放即可。当一些时间到来时, 我们可能不想交给对应的组件,这个时候我们就需要用到事件过滤功能了。当然同样的效果也能使用QTimer实现。鼠标事件常用以下几个接口来处理。
2023-09-26 22:09:17 332
原创 自定义拖拽操作
完整源码: https://github.com/zzu-andrew/QT_examples/tree/main/qt_imagedragdrop。我们接下来会实现一个在窗口中拖拽图片的例子,具体功能就是窗口中有一个图片可以任意的拖拽移动这张图片。
2023-09-18 22:47:26 89
原创 拖放操作-拖动文件直接在窗口中显示文件内容
我们通过ui设计的时候,实际上是在和两个控件打交道,一个是主窗口一个是textEdit窗口,因此除了上述接口的实现我们还需要限制一下主窗口和textEdit窗口的行为。这里我们可以通过勾选ui界面的参数选项或者直接在代码中声明,因为我们这里重载的是主窗口的拖拽接口,因此在这里需要将主窗口设置为true,textEdit窗口的拖拽行为设置为false,为什么这样设置才可以,因为这个示例中我们重载的接口是主窗口的拖拽功能而不是textEdit接口的拖拽功能,因此需要将textEdit默认拖拽功能进行限制。
2023-09-17 11:28:06 486
原创 设置伙伴(buddy)-给窗口控件增加快捷键
在官方教程或者很多qt程序中经常看到能使用全键盘操作软件,那么QT creator也支持了这一特性,就是使用设置伙伴来实现的。最终进行预览,只需要按住Alt+对应的字母即可实现将输入光标跳转到对应的输入框中。
2023-09-14 22:42:35 160
原创 Qt消息机制和事件
事件是由Qt或者系统在不同时刻发出的,当敲下鼠标,或者按下键盘,或者当窗口需要重新绘制的时候,就会发出一个相应的事件,一些操作由用户的操作发出,一些则由系统自动发出,如系统定时器事件等。事件对象创建完成之后,Qt将会把事件传递给这个事件的event()函数,event函数并不是直接处理事件而是将事件按照不同类型分发给不同的事件处理器。Qt事件是整个Qt框架的核心,也比较复杂,因为里面牵涉到的函数众多,处理方法也有很多,但是只要耐心的整理一下,实际项目中真正用到的也就那几个经典的。
2023-09-14 00:00:36 326
原创 Qt的窗口系统
Qt 支持模态对话框和非模态对话框。使用 QDialog::exec()实现应用程序级别的模态对话框使用 QDialog::open()实现窗口级别的模态对话框使用 QDialog::show()实现非模态对话框。Qt有两种级别的模态对话框应用程序级别的模态当这种对话框出现时,用户必须首先对对话框进行交互,直到对话框关闭,才能访问程序的其他窗口窗口级别的模态该模态仅仅阻塞与对话框关联的窗口,但是依然允许用户与程序中其他窗口交互一般情况下,默认都是应用程序级级别的模态。
2023-09-10 22:38:14 707
原创 信号和槽机制
使用connect接口不但能使用官方提供的接口也能使用自定义的信号槽,下面我们来实现一个自定义的信号和槽的使用。Q_OBJECTpublic:// 通过emit调用信号接口发出信号signals:// 用来发送信号的接口private:定义的类需要继承QObject类,只有继承了这个类才具有信号槽的能力。
2023-09-08 23:30:24 128
原创 QT 5.13保姆级安装教程
凡是软件,选新不选旧,一般没有什么问题,但是在QT这里如果你是个初学者,建议还是从5.x开始,毕竟6.x刚出来,初学者想要找6.0的学习资料比较困难。一旦确定好版本之后,安装就比较简单了,直接按照提示点击下一步就行了,不过现在新版本的QT需要注册个QT账号并填上验证之后才能使用,不能跳过了。选好安装目录之后,就需要选择需要安装的组件了,我这里使用的MinGW 64位。这里是选择安装目录,因为QT有很多组件,最好选C盘以外的其他盘,会占用大量的空间。经过以上步骤之后,剩下的就等安装完成即可。
2023-09-07 13:23:20 751
原创 如何优雅创建一个实例 - levelDB
该对象在构造的时候需要传入一个对比工具,levelDB中数据库不支持并发,因此在进行创建数据库时每个数据库句柄都是创建之后一直到停止使用结束的,那么这个对比工具也是要保证数据库有效的时间内都能正常使用。返回的结果就是8,也就是这个结构体需要按照8字节对其,当我们去除uint64_t的时候,再求对齐长度就会变成4,也就是一个结构体中按照最长位的那个类型进行对齐。来保证已有对象内存绝对大于等于需要申请对象的内存,然后经过饿汉式单例模式封装,经过以上几个步骤之后,一个能长久陪伴数据库句柄的对比工具便诞生了。
2023-08-29 11:31:47 129
原创 什么是多播
我就问了几下chatGPT他就给我生成了一篇文章,看着还有理有据多播(Multicast)是一种网络通信方式,可以将数据传输到一组特定的接收者。与单播(Unicast)和广播(Broadcast)不同,多播只向特定的一组接收者发送数据,而不是向所有的接收者发送数据。多播通常用于视频会议、在线直播、游戏等实时应用场景中,可以提高网络带宽利用率,减少网络负担。在多播中,发送端向一个特定的多播组地址发送数据,多播组地址是一个特殊的 IP 地址,可以识别一组接收者。
2023-07-06 20:49:32 900
原创 如何做一个有质量的技术分享
分享信息并不难,大多数人都能做到,就算是不善言谈性格内向的技术人员,通过博客或社交媒体,或是不正式的交流,他们都能或多或少的做到。但是如果你想要做一个有质量有高度的分享,这个就难了。下面是陈皓的公司内Knowledge Sharing中的Best Practice,供参考。原文链接:https://coolshell.cn/articles/21589.html。
2023-06-02 16:55:52 683
原创 安利安利-向大家推荐一个超级牛的etcd管理工具-EtcdKeeperFyne
etcd 跨平台管理工具,用于连接etcd,对etcd进行增删改查等…目前常见的Etcd管理工具都是基于web的,使用时通常还需要自己搭建一个web服务器,而且操作起来很不方便,基于此诞生了这款使用方便,操作简单的Etcd管理工具。特点:安装简单,使用方便如果感觉该软件对你有用可以请开发人员喝杯咖啡!!!后续有什么软件开发建议欢迎提交Issu或者关注公众号:码上有话!后台留言。
2023-03-31 10:36:23 2264 1
原创 etcd的使用
在 分布式系统中,最适用的一种组件间通信方式就是消息发布与订阅,即构建一个配置共享中心,数据提供者在这个配置中心发布消息,而消息使用者则订阅他们关心的主题,一旦主题有消息发布,就会实时通知订阅者,通过这种方式可以做到分布式系统配置的集中管理与动态更新。其中listen-client-urls的端口是客户端连接的端口,listen-peer-urls指定的端口是etcd之间同步数据使用的,并且在注册集群的时候,集群指定的端口也是etcd之间同步数据使用的端口。强一致性、高可用的服务存储目录。
2023-03-20 15:19:22 757
原创 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 417
原创 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 628
原创 经典bloom算法(**布隆过滤器**)-levelDB拆分
通常判断一个元素是否在一个集合中,一般是将元素和所有集合中的元素进行对比,当前元素和集合中元素某个元素完全一致的时候,就认为当前元素在该集合中,这时常借助树、散列表、链表以及数组等先存储对应的元素,然后在进行对比。当hash函数生成的散列值发生碰撞时,就有可能发生两个不同的值生成的散列值缺失相同的,还有就是经过多个元素映射的布隆过滤器,某个值的散列值经过k的映射刚好全部为1,但是这些1是多个元素一起映射的结果,而不是由单个元素映射在布隆过滤器上的。不能在布隆过滤器中删除元素。
2022-12-02 11:41:28 647
原创 C++经典的arena内存池实现-levelDB的内存池实现
是的你可以相信malloc的实现,但是你不能对你自己有过分的自信,在功能比较复杂,特别是工作量比较大的时候,你不能保证你申请的每块内存都得到有效的释放,这个时候就不可避免的出现内存泄露。Arena在事件处理、流水线处理、请求类型处理中有具有无可无可比拟的优势,事件开始,创建arena,中间过程无论那需要内存,只管申请,申请之后不用担心释放的事情,等到事件结束之后,只需要释放arena句柄就行了,即避免了内存碎片,又避免了内存泄露,同时也减轻了程序员的负担。申请之后忘记释放,造成内存泄露。
2022-11-29 10:53:15 659
原创 C++11并发编程-线程的启用与销毁
通常情况下我们都会在主线程中通过join()函数来等待线程的结束并回收资源,但是有时没有回收的线程时,需要及时将线程分离出去,注意分离出去的线程中能够使用的变量都要保证是非局部的,否则线程会一直在后台运行,如果引用的变量生命周期到了会导致oops。该算法首先根据当前系统中核心个数,以及数据的个数来确定启动线程的个数,确定线程个数之后将数据平均分配给每个线程之后将各个线程计算的结果进行汇总。当你启用一个线程之后,原先线程可能因为抛出异常而退出,这时你可以通过在catch异常时将线程退出来保证程序的正常执行。
2022-11-17 11:44:37 3423
原创 两张图看懂UMA与NUMA
NUMA系统中因为内存可以连接到不同的内存上,因此具有更好的内存扩展性。因为在NUMA系统中想要存取不同内存上的数据时,需要核心直接交互才能实现,跨NUMA会导致几纳秒的时间浪费,因此如果程序对性能比较敏感需要将程序绑定到指定的NUMA上,以此来避免不同NUMA之间核的交互。在拥有多个多核处理器的共享内存系统中,互联网络可以将所有的处理器直接连接到主存上,或者将每个处理器直接连接到一块内存,通过处理器内置的特殊的硬件使得各个处理器可以访问内存中的其他块。
2022-10-17 09:48:07 1088
原创 swig封装C/C++实战-实现go调用C++然后C++在调用go
代码组织结构[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AS1ZsCqX-1660366325978)(image/-16603662235741.png)]以下所有文件生成指令都是:Goinexample.i 文件mian.go测试文件Exampleexample.iexample.hexample.cppmain.goVariablesmain.goexample.iexample.hexample.c枚举型变量封装example.iex
2022-08-13 12:56:18 781
原创 SWIG教程-对C/C++语言的封装《三》
命名空间作为C++的一项基础功能,在swig支持的很好,但是如果不使用指令控制swig遇到一些比较棘手的问题还是会直接报错,比如默认情况下两个命名空间中有相同的类时,swig将无法区分两个类,因为swig的默认处理是将所有的命名空间的种类型都完全暴露出来,因为目标语言中可能没有明明空间这个概念(go语言也是后期才添加上的)通过设置directors可以让swig实现对回调函数的封装,设置之后swig会在对应的目标语言中生成目标语言的回调函数封装。当函数是类的成员函数时,这时需要在类内进行模板封装。.....
2022-08-10 11:19:10 939
原创 SWG教程《四》- go语言封装
go语言不支持直接调用C或者C++语言,虽然通过cgo转接go可以实现对c的调用,但是调用过程各种数据类型之间无法还是无法直接转换,使用起来也不是很方便,而swig刚好能够填补这个空白而且只要是go 1.2之后的版本,可以通过go build直接使用swig生成的源码虽然swig会尽量将C、C++封装成go代码,但是由于两种语言之间的不同,还是会有部分改动在里面,比如const类型通过只对外提供Get接口来实现,通过defer来实现对对象内存的管理等。......
2022-08-10 10:35:45 379
原创 SWIG教程-封装指令的使用《二》
但是需要注意的是,inline只是对函数和变量有效,对于头文件的引用是否封装,还是需要原有的方式,在代码块中使用#include 引入头文件,而需要封装成目标代码的头文件需要在代码块外使用%include指令来告知swig需要对该头文件进行封装。很多C类型的结构体是不能绑定成员函数的,但是其他函数中都能,为了提供便利swig支持为C类型的结构体绑定额外的成员函数用来辅助结构体的创建和使用,这时就要用到%extend指令了。一些需要传入回调的函数,需要提前声明,不能将目标函数实现的函数直接传入。......
2022-08-10 10:24:49 582
原创 swig教程-指令文件《一》
为了区分不同语言以及在部分指导文件中能够区别进行,siwg中提前预定义了一些变量为了更好的实现对源码的封装,swig提供了一种增强型的宏定义指令, %define 和 %enddeffree(t);
2022-08-10 10:01:22 1059
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关注的人