- 博客(60)
- 资源 (2)
- 收藏
- 关注
原创 Jumpserver Client 探索小记:一个“调起本地工具“的中间适配器
Jumpserver Client并非直接连接工具,而是本地工具的调起适配器。其核心作用是:在浏览器中选择“本地连接”后,通过自定义协议唤醒客户端,再由它调用本机已安装的SSH终端等工具完成真实连接。整个链路依赖运维开启目标机器的SSH服务,否则会因connection refused失败。该设计巧妙解决了Web端无法直接调用本地程序的难题,实现了统一管控与本地操作体验的融合,体现了中间层调度的实用价值。
2026-11-12 16:17:40
123
原创 调试mysql延迟与libevent回调实际发送回复时机问题
某历史项目因HTTP请求超时,经排查发现服务日志显示处理完成仅需1ms,但实际响应延迟达30秒。通过tcpdump抓包确认,响应在30秒后才发出。深入分析源码及数据库操作日志,定位根因为libevent回调中每次请求均重新建立MySQL连接(单次耗时约10秒),三次操作叠加导致超时。修复方案为引入连接池,避免频繁建连。总结:应用日志不可靠,必须结合网络层抓包验证真实行为,方能精准定位延迟问题。
2026-09-29 10:59:28
197
原创 编译期断言技巧
muduo 源码中通过 char require_32_bit_integer_at_least[sizeof(int) >= sizeof(int32_t) ? 1 : -1]; 实现编译期断言:若 int 不足 32 位,数组长度为负,编译失败;否则合法。后续 (void)require_... 消除未使用变量警告。二者独立,前者验证类型大小,后者清理警告,体现 C++ 语言特性的巧妙运用。
2026-09-24 17:18:03
176
原创 关于gcc编译指定: -Wl,-rpath 的设置的一个要注意的点
<think>我们根据内容生成摘要。要求≤150字。核心问题:使用相对rpath导致从不同目录启动失败;解决方案:用$ORIGIN替代相对路径;解释$ORIGIN机制及转义。摘要需简洁。</think>摘要:程序通过相对rpath指定自带libstdc++库,但仅能从bin目录启动。从其他目录启动时,动态链接器按当前工作目录解析相对路径,导致找不到正确库。解决方法是用$ORIGIN(动态链接器内置变量,表示可执行文件所在目录)替换相对路径,如-Wl,-rpath,'$$ORIGIN/../libc++',其
2026-09-07 16:49:47
201
原创 顶层 const 和 底层 const
本文探讨了C++中顶层const与底层const的区别及其应用场景: 定义区分:顶层const修饰对象本身(如const int),底层const修饰指针/引用指向的对象(如const int*); 值传递问题:函数模板值传递会丢失顶层const和引用属性(如const int退化为int); 引用特性:引用本身隐含不可变性,其const只能是底层const(修饰被引对象),类似int& const的写法非法。通过代码示例直观展示了类型推导中的const丢失现象及引用const的底层本质。
2026-06-02 13:41:20
198
原创 转发引用(Forwarding Reference)
转发引用(Universal Reference)是C++11引入的特性,语法形式为T&&,能动态绑定左值或右值引用。其核心用途是实现完美转发,保持参数的原始类型和值类别。转发引用的特性依赖于类型推导和引用折叠规则:传入左值时推导为左值引用,传入右值时推导为右值引用。与右值引用的区别在于是否需要类型推导。结合std::forward可实现完美转发,避免不必要的拷贝或移动。引用折叠规则确保正确处理引用叠加的情况。注意:转发引用仅在模板类型推导时生效,const T&&不属于转发引用。该特性对C++泛型编程至关
2026-06-02 13:40:57
192
原创 cpp: std::back_inserter
std::back_inserter是C++标准库中的迭代器适配器,用于将输出操作转换为容器的push_back()调用,实现自动扩容。它解决了STL算法需要预先分配空间的问题,允许直接向空容器写入数据而无需手动resize。与普通迭代器不同,back_inserter会在每次赋值时自动扩展容器,使代码更简洁安全。类似功能的还有front_inserter和inserter,分别对应push_front()和指定位置插入。典型使用场景包括std::copy等需要输出迭代器的算法,特别适合不确定输出数据量的情
2026-04-21 15:45:06
237
原创 redis++使用: hmset 与 hmget
Redis C++客户端库redis-plus-plus提供了hmget和hmset接口用于批量操作Hash数据。hmget通过迭代器范围获取多个字段值,返回OptionalString类型结果,需检查空值。hmset支持多种输入方式,包括initializer_list、vector of pairs和unordered_map,可高效设置多个字段。两个接口配合使用可完成Hash数据的批量读写操作,结果顺序与请求顺序一致,适用于用户信息等结构化数据的存储场景。
2026-04-21 14:02:26
225
原创 glog单行 30000 字节限制问题
glog日志库默认限制单条日志长度为30000字节,超过部分会被截断。可通过两种方式解决:1)修改源码中的kMaxLogMessageLen常量并重新编译;2)编写分段输出函数,将长日志拆分为多段输出(推荐)。第二种方法无需修改库代码,通过循环分块输出,同时保持正确的日志位置信息。关键点在于控制每段长度不超过kMaxLogMessageLen限制,并添加分段标记方便阅读。
2026-04-17 17:48:51
63
原创 win11新机器设置杂七杂八
摘要:本文介绍了Windows系统的三个实用技巧:1)通过命令行绕过联网注册,使用本地账户登录;2)通过注册表修改恢复经典右键菜单;3)在时间设置中开启秒数显示。这些方法分别涉及系统登录、界面优化和个性化设置,操作简单且无需第三方工具,适合希望快速优化Windows使用体验的用户。
2026-03-31 10:56:59
52
原创 gcc 的 include 搜索顺序学习与验证
本文总结了GCC编译器头文件搜索顺序规则及相关选项。主要内容包括: 头文件搜索顺序规则: 双引号形式"...":当前目录→-iquote→-I→系统路径 尖括号形式<...>:-I→系统路径 常用搜索路径选项: -iquote:仅影响双引号形式 -I:影响所有包含形式 -isystem:系统头文件路径,抑制警告 -idirafter:后备搜索路径 环境变量影响: CPATH/C_INCLUDE_PATH/CPLUS_INCLUDE_PATH会在-isystem之后、系统路径之
2026-02-06 16:51:12
969
原创 零长度数组(Zero-Length Array)
零长度数组是C/C++中用于处理可变长度数据结构的特殊数组形式,常见语法为type name[0]或C99的type name[]。其核心特点包括不占用结构体空间、作为访问后续数据的符号标记、内存连续性和类型安全访问。主要应用于网络协议、文件格式等需要动态数据处理的场景。使用时需注意内存分配和释放需整体处理,且不同编译器支持程度可能不同。该技术通过结构体头部与数据的连续存储,实现了高效、类型安全的内存访问,特别适合协议封装和数据序列化需求。
2025-12-24 19:12:15
266
原创 opencv 学习: 12 使用策略模式进行实现算法切换-以颜色搜索为例
摘要: 本文介绍了策略设计模式在图像处理中的应用。策略模式通过将算法封装到独立类中,实现运行时灵活切换不同算法。文章详细阐述了策略模式的适用场景(算法变体切换、行为差异分离、算法与业务解耦)和实现方法(抽象策略接口+具体算法类)。通过一个颜色检测算法的具体案例,展示了如何将图像处理算法封装为策略类,包括核心的process()方法和参数设置接口。代码示例演示了使用策略模式处理彩色图像,通过欧几里德距离计算颜色匹配度,并输出二值化结果。该模式使算法更易于测试、维护和重用。
2025-12-17 20:13:40
812
原创 opencv 学习: 11 图片像素位置变换,以图片加水波纹特效为例
摘要 本文介绍了通过像素重映射实现图像特效的方法。该方法保持像素值不变,仅改变像素位置,适用于创建哈哈镜等简单特效或图像畸变矫正。实现过程包括:1)定义重映射矩阵存储新坐标;2)通过双重循环计算每个像素的位移位置;3)使用OpenCV的remap函数应用映射。示例代码展示了波浪效果实现,其中Y坐标按正弦函数周期性偏移。该方法采用向后映射技术,通过x和y两个浮点型映射矩阵完成图像变换。执行结果显示,原始图像成功转换为具有波浪形变的效果图。
2025-12-01 20:09:56
309
原创 centos-6.9 下编译安装 gcc-4.8.5
本文记录了在Linux系统上编译安装gcc-4.8.5的过程。主要内容包括:1) 从官方源下载gcc-4.8.5源码并解压;2) 安装必要的数学库依赖(GMP、MPFR和MPC);3) 配置编译选项,指定自定义安装路径;4) 使用make进行编译安装;5) 通过update-alternatives工具实现多版本gcc管理;6) 使用readelf查看程序编译时使用的gcc版本信息。文中还提供了详细的命令行操作步骤和注意事项,适合需要维护历史项目的开发人员参考。
2025-11-28 15:10:45
333
原创 win11 微软拼音,关闭烦人的 Tab 快捷键候选提示
微软拼音输入法在Linux命令补全时误触发搜索功能的问题及解决方案。问题表现为拼音输入状态下按Tab键会弹出建议词列表而非命令补全,若误按回车则会跳转浏览器搜索,严重影响操作流畅性。解决方法:1)通过输入法设置开启兼容模式,可改善界面风格;2)在高级设置中关闭"新词热词"和"候选"功能,但Tab快捷键仍可能触发询问弹窗。微软输入法的这一设计存在明显缺陷,用户即使关闭功能仍会被反复询问启用,严重影响使用体验。
2025-11-28 13:42:59
1017
原创 opencv 学习: 10 图像的简单运算(2)
本文介绍了OpenCV中的图像操作符重载和通道处理技术。操作符重载部分包括比特位运算、比较操作符和矩阵计算,如矩阵相乘、转置、叉乘等,可简化图像处理代码实现。通道分离与合并部分详细讲解了cv::split和cv::merge方法的使用,通过分离图像通道单独处理后再合并,实现高效的通道级操作。示例代码展示了如何通过调整蓝色通道值来改变图像色调,并解释了防蓝光效果的实现原理。这些技术为图像处理提供了灵活高效的操作方式。
2025-11-27 15:39:26
426
原创 CPP 同名结构体的同名方法调用问题,违反单一定义规则(ODR)
摘要:在Ubuntu 20.04环境下使用g++ 9.4.0时,发现违反C++的One Definition Rule(ODR)导致未定义行为。通过最小示例复现问题:两个头文件(a.h和b.h)定义了同名结构体A但内容不同,当在不同编译单元中使用时,编译器会根据编译顺序选择其中一个定义,导致运行时行为不可预测(如数据成员访问错误)。解决方法包括:1)确保类型名称唯一;2)使用命名空间隔离同名类型。该问题凸显了ODR违规在编译时难以检测但会导致严重运行时问题的特性。
2025-11-27 13:57:58
442
原创 opencv 学习: 10 图像的简单运算
摘要:本文介绍了如何将图片视为矩阵进行四则运算,重点演示了OpenCV中的加法运算。通过cv::add和cv::addWeighted方法可实现图片叠加,后者支持权重参数调节。文章还展示了使用掩码(mask)进行局部区域运算的技巧,以及不同运算方式的视觉效果对比。此外,简要提及了OpenCV提供的其他运算方法,如subtract、absdiff、multiply等矩阵运算函数。所有运算都默认使用cv::saturate_cast确保像素值合法,并支持直接将输入图片作为输出参数以优化内存使用。
2025-11-25 20:13:46
711
原创 知识碎片:UTF-8的编码浅识
UTF-8是一种变长编码格式,使用1-4个字节表示字符。本文介绍了UTF-8的三种主要表示方式:十六进制编码(如0xE50x9B0xA2表示"团"字)、Unicode转义序列(\u56e2)和Unicode码点(U+56E2)。这些格式分别用于数据存储、编程语言和标准文档中。文章还提供了C++测试代码,能够将输入的UTF-8字符串转换为十六进制编码输出,帮助理解编码转换过程。不同表示方式本质上指代相同字符,只是应用场景不同。
2025-11-19 20:01:47
1137
原创 知识碎片:WSL2 安装 centos6.9
在WSL2上安装CentOS 6.9遇到挂载失败问题,通过修改.wslconfig配置文件解决。具体方法是在用户目录下创建".wslconfig"文件,加入[wsl2] kernelCommandLine = vsyscall=emulate配置项,无需重启服务即可生效。该方案参考了CentOS 6.10在WSL2的安装经验。
2025-11-17 19:13:48
254
原创 opencv 学习: QA_02 什么是图像中的高频成分和低频成分
本文介绍了数字图像处理中的频率成分概念。高频成分指像素值急剧变化的部分,包含边缘、细节和噪声;低频成分则是变化缓慢的区域,对应平滑背景和大色块。通过傅里叶变换可将图像转换到频域,低频集中在频谱中心,高频分布在外围。文章还列举了实际应用,如锐化处理(减去低频)、边缘检测(高通滤波)等。理解频率成分有助于图像增强、去噪等处理,是图像分析的重要基础。
2025-11-14 14:52:45
912
原创 opencv 学习: QA_01 什么是图像锐化
图像锐化技术通过增强边缘和细节提升图像清晰度,主要使用特定的卷积核(如3×3矩阵)强调像素差异。OpenCV中可通过filter2D函数或手动遍历像素实现。锐化能改善边缘对比度,突出细节,但过度使用会增加噪声。该技术广泛应用于照片处理、医学影像、工业检测等领域,需根据具体需求调整参数以获得最佳效果。
2025-11-14 14:49:42
459
原创 opencv 学习: 09 邻近像素处理,以高通滤波图片锐化为例
本文介绍了图像锐化处理的基本原理和实现方法。图像锐化通过增加边缘对比度使图像更清晰,使用拉普拉斯算子(5倍中心像素减去四邻域像素)计算新像素值。文中提供了两种C++实现:v1版本使用直观但效率较低的at方法,v2版本采用指针操作提高效率,并处理了数据溢出问题。代码演示了如何跳过边缘像素并进行锐化计算,最终输出视觉上更清晰的图像。执行效果显示锐化后图像细节更突出,纹理更明显。
2025-11-14 14:24:19
277
原创 opencv 学习: 08 计算代码执行耗时
本文介绍了在图像处理中比较不同遍历方式效率的方法。可以通过OpenCV的cv::getTickCount()和cv::getTickFrequency()函数来测量代码执行时间,或者使用C++11的chrono库进行更精确的计时。文中提供了多种遍历图像像素的实现方式,包括指针遍历、at方法、迭代器和reshape方法,并比较了它们的性能差异。其中指针遍历通常效率最高,而at方法由于随机访问特性较慢。最后给出了一个保持原图不变的优化实现,演示了如何在处理图像时避免不必要的内存分配。这些方法可以帮助开发者找到性
2025-11-13 15:46:25
224
原创 opencv 学习: 07 使用迭代器 (iterator) 遍历像素
本文介绍了使用迭代器遍历OpenCV图像像素的方法。首先解释了迭代器在面向对象编程中的概念和作用,然后详细说明了OpenCV提供的cv::MatIterator_模板类的使用方法。文章给出了两种迭代器声明方式,并展示了一个完整的颜色量化处理示例代码。该代码通过迭代器遍历图像所有像素,对每个颜色通道进行均匀量化处理,最后保存输出图像。实现的关键点包括迭代器的声明、开始/结束位置的获取以及像素访问语法。示例程序可以通过命令行参数指定输入图像、量化级别和输出路径,并显示处理前后的图像对比。
2025-11-11 17:20:28
465
原创 opencv 学习: 06 使用指针遍历像素,以均匀颜色量化为例
本文介绍了图像处理中的均匀颜色量化方法,通过划分RGB空间为大小相等的立方体来减少颜色数量。主要实现方式包括:1)将像素通道值除以缩小倍数后取商并调整;2)使用取模运算;3)利用位运算(限制缩小倍数为2的n次幂时)。文章提供了OpenCV的C++实现代码,并比较了不同缩小倍数下的效果。均匀颜色量化虽实现简单、效率高,但可能导致重要颜色丢失和色带现象。该方法适用于降低图像处理复杂度,文中还涉及了图像存储格式、有效宽度等扩展知识。
2025-11-10 19:49:41
528
原创 opencv 学习: 05 像素操作
本文介绍了图像处理中基本的像素操作技术。首先解释了灰度图和彩色图的像素表示方法:灰度图每个像素是0-255的数值,彩色图则包含RGB三个通道。文章重点讲解了如何使用OpenCV的cv::Mat类高效访问和修改像素值,包括使用at()方法和cv::Mat_模板类的简化操作。通过实现椒盐噪声的示例代码,展示了如何随机选择像素并修改其值为纯白或纯黑。还讨论了图像参数传递的注意事项,即使用引用计数机制实现高效传递。最后给出了完整的C++代码实现,展示了如何为图像添加指定密度的椒盐噪声。
2025-11-07 18:01:45
991
原创 opencv 学习: 04 通过ROI处理图片局部数据,以添加水印为例
本文介绍了如何在OpenCV中定义和操作图像的感兴趣区域(ROI)。主要演示了两种定义ROI的方法:1)使用cv::Rect指定矩形区域的位置和大小;2)使用cv::Range选择行和列范围。通过在目标图像上创建ROI映射(cv::Mat对象),可以对指定区域进行修改而不影响其他部分。文中提供了完整代码示例,展示了如何将logo图像复制到目标图像的右下角ROI区域,并保存结果。该方法适用于图像处理中需要局部操作的应用场景。
2025-10-31 20:38:26
316
原创 opencv 学习: 03 初识 cv:Mat
OpenCV中的cv::Mat数据结构是图像处理的核心,它表示一个像素矩阵,包含了图像的所有信息。Mat对象分为属性部分(如尺寸、通道数)和数据块(像素数据本身)。该数据结构采用引用计数机制管理内存,通过显式调用copyTo()或clone()实现深拷贝,而默认赋值操作仅进行浅拷贝。本文通过代码示例展示了Mat的基本操作:读取图像、灰度转换、数据类型转换、图像创建和拷贝等,重点阐述了Mat的内存管理机制及其对图像处理效率的影响。掌握Mat数据结构特性是进行高效图像处理编程的关键。
2025-10-31 18:04:40
615
原创 opencv 学习: 02 初识图片处理
本文介绍了OpenCV图像处理的基本流程和简单操作。主要内容包括: 图片处理三步骤:读取图片(imread)、处理图片(flip等操作)、输出图片(imwrite) 图片显示与窗口事件处理:使用imshow显示图片,并通过setMouseCallback设置鼠标事件回调函数 简单图形绘制:演示了putText、circle、rectangle、line等基本绘图函数的使用 示例代码展示了完整的图片处理流程,包括读取图片、显示窗口、添加鼠标交互、图像翻转处理、结果显示和保存等功能,为OpenCV初学者提供了一
2025-10-30 18:50:13
177
原创 opencv 学习: 01 ubuntu20.04 下 opencv 4.12.0 源码编译
本文介绍了在Ubuntu 20.04系统下搭建OpenCV 4.12.0开发环境的过程。首先安装必要的编译工具(cmake、g++、unzip)和依赖库(libgtk2.0-dev),解决cv::imshow显示图片时的窗口支持问题。然后下载OpenCV源码并通过CMake配置编译环境,采用默认的Release构建类型,无需额外配置其他图片依赖库。编译过程详细记录了各种编译器测试结果,包括C/C++编译器特性检测和使用不同警告选项的测试情况。该环境可用于后续图像处理程序的开发工作。
2025-10-30 18:01:23
678
原创 C++ ABI:编译报错之:gcc 4.8.1 切 gcc 6.1.0
摘要:项目从gcc 4.8.1迁移到6.1.0环境后,出现链接错误,报"undefined reference"涉及RdKafka和std::__cxx11::basic_string。经排查发现是C++ ABI兼容性问题,通过添加编译宏解决。问题与新旧编译器对std::string的实现差异有关,需进一步学习C++ ABI机制。参考知乎相关技术文章辅助定位。(123字)
2025-10-21 20:14:35
418
1
原创 sqlite 使用: 03-问题记录:在使用 sqlite3_bind_text 中设置 SQLITE_STATIC 参数时,处理不当造成的字符乱码
摘要:该代码存在临时变量使用问题,timer.getName()等方法返回的临时变量在sqlite3_bind_text绑定后立即销毁,导致数据库存储乱码。解决方法是将SQLITE_STATIC改为SQLITE_TRANSIENT,让SQLite复制数据而非直接引用指针。SQLITE_TRANSIENT能确保数据在SQLite使用期间保持有效,避免野指针问题。修改后代码正确处理了临时变量生命周期问题,保证了数据存储的可靠性。
2025-10-11 15:02:34
426
翻译 sqlite 使用: 02-核心对象与接口概念
SQLite核心API摘要:SQLite的核心操作围绕两个对象展开:数据库连接对象(sqlite3)和预处理语句对象(sqlite3_stmt)。主要操作流程包括:1)使用sqlite3_open()创建连接;2)通过sqlite3_prepare()将SQL文本转为预处理语句;3)用sqlite3_step()执行语句;4)查询时使用sqlite3_column()获取结果;5)最后用sqlite3_finalize()和sqlite3_close()释放资源。为提高效率,可通过sqlite3_reset
2025-10-11 10:27:41
58
原创 sqlite 使用: 01-源码编译与使用
本文介绍了SQLite C/C++接口的安装与使用。首先详细说明了在Ubuntu 20.04环境下下载、编译和安装SQLite的步骤,通过源码包安装并验证成功。随后提供了一个完整的C++示例程序,展示了如何通过SQLite API进行数据库连接、表的创建、数据的增删改查等基本操作。示例包含回调函数处理查询结果,并配套提供了Makefile编译脚本。该教程适合初学者快速上手SQLite的C/C++接口开发,为进一步学习SQLite编程打下基础。
2025-10-10 18:54:54
366
原创 glog使用: 07-错误信号处理(Failure Signal Handler)
摘要:本文介绍了如何使用glog库的InstallFailureSignalHandler()函数安装信号处理程序,在程序崩溃时输出调试信息。通过示例代码演示了默认情况下将错误信息输出到标准错误,以及通过InstallFailureWriter()自定义错误输出方式。当程序发生段错误(SIGSEGV)时,会输出时间戳、调用栈等调试信息,帮助定位问题。自定义输出方式可将错误信息写入日志文件,但会改变原有错误信息的格式。
2025-09-23 19:49:43
361
2
原创 glog 使用: 06-自定义日志前缀格式(Custom Log Prefix Format)
文章摘要:介绍了如何在glog日志库中使用自定义回调函数格式化日志前缀。需要在编译时启用WITH_CUSTOM_PREFIX标志(默认已开启),包含GLOG_CUSTOM_PREFIX_SUPPORT宏后,实现CustomPrefix函数处理输出格式。示例展示了如何输出包含时间、线程ID、文件名等信息的标准格式前缀,并演示了初始化及使用LOG(INFO)输出日志的过程。最终日志格式与glog默认格式一致,包含详细的时间戳和代码位置信息。
2025-09-22 15:56:48
278
原创 glog 使用: 05-详细日志控制(Verbose Logging)
本文介绍了使用VLOG宏实现精细化控制日志输出层级的方法。VLOG支持设置详细级别,通过--v参数控制输出范围,值越大日志越详细。与严重级别相反,VLOG的级别数值越小越容易输出。文章还说明了如何通过命令行参数和环境变量按模块控制日志输出,包括使用--vmodule和GLOG_vmodule指定不同文件的输出级别。此外,介绍了VLOG_IS_ON条件宏和VLOG_IF等变体宏的使用方法,它们可以根据条件或频率输出详细日志。这些功能可帮助开发者在调试时获取详细日志,而在日常运行时减少不必要的信息输出。
2025-09-17 13:53:00
619
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅