自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(106)
  • 收藏
  • 关注

原创 学习C++这一篇就够了(进阶篇)(上)

​。

2024-07-16 16:51:08 175

原创 静态链接——编译和链接

对于C语言的代码来说,这个预编译和编译的程序是ccI,对于C++来说,有对应的程序叫做cclplus:Objective-C是cclobj::fortran是f77l;处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置。添加行号和文件名标识,比如#2“hello.c”2,以便于编译时编译器产生调试用的行号信息及用于编译时产生编译错误或警告时能够显示行号。处理所有条件预编译指令,比如“#if”、“#ifdef'”、“#elif”、“#else”、“#endif'”。

2024-07-16 16:43:41 405

原创 为何要学Linux?

铁子们可能都有感觉,当你的数据量一大起来,用 For 循环去跑,这速度简直能让人急死。所以,老铁们,别看 For 循环简单易用,有时候在处理复杂或者大规模数据时,还是要斟酌一下,看看有没有更合适的工具。接下来,我们将介绍一些这样的替代工具,让你的代码不仅跑得快,而且更加清晰易懂。虽然看起来挺直白,一用就上手,但是,有时候用多了,问题也跟着来了。下面,我们来看看更高级一点的工具,也就是生成器表达式,这也是处理数据时的一把利器。尤其是对于一些初学者或者维护别人代码的铁子们,一大堆的循环层层叠叠,看着就头大。

2024-07-08 08:41:38 308

原创 实时光线追踪(3)Ray Casting

实时光追(Real-time Ray Tracing)往往是综合了 sampling、ray casting、denoising 等各方面的方案,本文主要记录的是 ray casting 这部分,但是术语可能更多仍然称为 ray tracing。

2024-07-05 11:44:23 975

原创 浅谈OpenCV的多对象匹配透明图像的实现,以及如何匹配半透明控件

通过templateMatch算法,可以得到目标与原图像中等大子图像对应归一化的相关系数,这个归一化的相关系数可以看作是对于的概率(其实不是这样),可以设定一个阈值,把大于这个阈值的坐标都筛选出来。OpenCV的templateMatch中提供了一个可选的参数mask,这个mask是和目标等大的一张图,可以是U8C1也可以是FP32,其中U8C1对于每个点的含义是为0则放弃匹配该点,非0就会匹配,FP32是会将这个点像素在计算相关性时赋予对于的权重。可以用特征匹配的方法,利用这个特性对透明控件进行匹配。

2024-07-05 11:37:35 899

原创 Vue3从入门到精通(三)

在 Vue3 中,可以使用异步组件来延迟加载组件的代码,从而提高应用的性能和加载速度。组件来保持组件的存活状态,即使组件在组件树中被切换或销毁,它的状态仍然会被保留。在 Vue3 中,可以使用动态组件来根据不同的条件或状态动态地渲染不同的组件。使用异步组件可以提高应用的性能和加载速度,特别是在应用中有大量组件时。在 Vue3 中,插槽(Slots)的使用方式与 Vue2 中基本相同,但有一些细微的差异。Vue3 的生命周期钩子函数可以用于在组件的不同生命周期阶段执行相应的操作。: 在挂载完成之后被调用。

2024-07-05 11:23:12 788

原创 深入剖析C++多态的实现与原理-详解 (辛苦三万字,且看且珍惜!)

在虚函数后面写上=0,这个函数就为纯虚函数.纯虚函数只能写声明,不能写函数体.

2024-06-30 08:52:30 834

原创 驱动开发:配置Visual Studio驱动开发环境

在正式开始驱动开发之前,需要自行搭建驱动开发的必要环境,首先我们需要安装这款功能强大的程序开发工具,在课件内请双击ISO文件并运行内部的安装包,的安装非常的简单,您只需要按照提示全部选择默认参数即可,根据机器配置不同可能需要等待一段时间;

2024-06-30 08:44:32 687

原创 std::future 如何保存多个对象进行同步等待

如果需要等待多个异步操作完成并获取它们各自的结果,可以使用 std::future 的姊妹类 std::shared_future 来实现。因此,可以将多个 std::shared_future 对象保存到一个容器中,然后使用 std::shared_future 的成员函数 wait() 或 get() 等待这些异步操作完成,并获取它们的结果。接下来,可以使用 std::shared_future 的成员函数 wait() 或 get() 等待这些异步操作完成,并获取它们的结果。

2024-06-24 11:27:57 320

原创 C++面试八股文:std::deque用过吗?

的底层容器,让我们比较一下三个容器的差异:(只考虑头插和尾插,因为stack不需要随机插入)二师兄:因为使用它的场景很少,大部分需要性能、且需要自动扩容的时候使用。中还有未被元素填充的位置,则将元素填充到数组中,如果此指针指向的。今天的面试分享到这里就结束了,让我们继续期待二师兄的表现吧。从上表中看到,三种容器的插入和是删除的时间复杂度相同。,插入要分情况,如果是头插和尾插,时间复杂度为。会找到头部或尾部的指针,并通过指针找到对应的。二师兄:说实话,很少用,基本没用过。,需要随机插入和删除的时候可以使用。

2024-06-24 11:11:55 300

原创 安全测试前置实践1-白盒&黑盒扫描

本文我们讲述了体验保障的安全质量提升过程。重点讲述黑盒、白盒的扫描过程。首先对漏洞工单进行了分析,确定了漏洞的来源、种类、分布,摸清了漏洞的现阶段情况。然后通过进行安全前置扫描,对工单中的白盒、黑盒问题前置识别。过程中通过开发工具来提升效率,最终形成一套可行的前置开展方案。但需注意:除了解决存量漏洞问题,还需要新增类问题,需要持续不断地建设,需要实现安全测试的常态化运行。并且要利用更多自动化工具,去进行提效。

2024-06-21 09:29:13 976

原创 团队领导(leader)怎样带领好团队

一个优秀的,应该遵循什么样的准则,才能够带领好团队,感召下属,激发他们成长和努力工作?

2024-06-21 09:20:55 958

原创 零信任介绍

传统的安全方法是在网络边界范围内的环境中开发的,假设对组织网络内的任何人都绝对信任。我们需要一种全新的安全方法,这种方法依赖于对合规性的持续验证,并且无论人们从任何位置以及任何设备访问应用和数据,这种方法都能保护相关应用和数据。零信任背后的策略可以归结为抛弃传统的安全方法(即认为网络边界范围内的所有资源都是值得信任的),改为采用“永不信任,始终验证” 的方法。与传统的安全方法相比,零信任存在动态决策点,用于验证信任并影响对企业应用和数据的访问级别。修复和编排 - 通过自动修复和编排提升安全性和体验。

2024-06-21 09:08:27 300

原创 UE/C++简单功能实现笔记

本篇笔记主要用于记录如何利用C++在虚幻引擎5中实现一些基本的功能需求。目录。

2024-06-20 08:21:22 288

原创 CMake个人理解和使用

100编程书屋_孔夫子旧书网前言CMake是一个构建工具,通过它可以很容易创建跨平台的项目。通常使用它构建项目要分两步,通过源代码生成工程文件,通过工程文件构建目标产物(可能是动态库,静态库,也可能是可执行程序)。使用CMake的一个主要优势是在多平台或者多人协作的项目中,开发人员可以根据自己的喜好来使选择IDE,不用受其他人工程配置的影响,它有点像跨平台的IDE,通过它配置好相关设置之后,可以在多个平台无缝衔接,提高开发效率。最简单的CMake工程项目搭建一个用CMake来管理的项目,其项目根目录通常

2024-06-20 08:14:29 594

原创 C++面试八股文:什么是左值,什么是右值?

一次移动(当元素特别多时,移动的成本相对于拷贝基本可以忽略不记),一次析构。二师兄:移动构造是通过移动构造函数实现的,当类有资源需要管理时,拷贝构造会把资源复制一份,而移动构造偷走了原对象的资源。这里的确是通过static_cast实现的,讲左值强行转换成右值,用来匹配移动语义而非拷贝。时,为了保证程序的正确性,编译器可能会采用拷贝构造的方式实现移动构造,从而导致效率降低。是左值是和右值是匹配不同的实现,完成返回不同类型引用的目的。当传入的参数t的类型时右值时,由于引用折叠还是右值,此时的。

2024-06-20 07:54:11 580

原创 用Rust手把手编写一个Proxy(代理), 开始动工

注意:客户端和服务端之前可能会存在大数据上传下载的情况,超过百兆数据的上传下载,所以我们为了减少序列化带来的性能损失和保证在低内存能正确运行,不做http的完整解析,仅仅只处理http头信息。这表示该请求为普通的http代理,我们解析完HTTP的头文件信息,得出包含的头信息,如果无法解析完整的地址(域名加端口或者ip加端口),则返回错误,无法处理该http信息。http.rs http及https代理的实现,如果解析失败则返回ProxyError::Continue,并把已经读取的数据带回,以便后续解析。

2024-06-15 08:29:15 828

原创 tonic-Rust grpc初体验

gRPC 是开发中常用的开源高性能远程过程调用(RPC)框架,tonic 是基于 HTTP/2 的 gRPC 实现,专注于高性能、互操作性和灵活性。该库的创建是为了对 async/await 提供一流的支持,并充当用 Rust 编写的生产系统的核心构建块。今天我们聊聊通过使用tonic 调用grpc的的具体过程。

2024-06-15 08:02:21 876

原创 CSS3 clip-path:打造独特创意设计效果的秘密武器

一部由CSS技术实现的作品。它将再一次证明CSS的强大力量。

2024-06-07 07:33:35 663

原创 C++面试八股文:static和const的关键字有哪些用法?

关键字主要用在以下三个方面:1.用在全局作用域,修饰的变量或者函数为静态的,限制在本文件内使用。3.内类修饰成员函数和成员变量,此函数或变量由类持有,而非类的对象持有。修饰的函数是否在编译器求值要取决于传入的参数是不是编译器确定的,这属于元编程的范畴。常量指针的指针部分可变,指针指向的内容不可变。指针常量则相反,指针指向的内容可变,指针不可变。当使用consteval修饰函数和变量时,如果不能在编译时求值,则编译错误。如果传入的参数是编译时确定的,关键字只能用于静态变量的初始化,不能用于动态变量的初始化。

2024-06-07 07:24:33 571

原创 驱动开发:内核扫描SSDT挂钩状态

其次我们还需要实现另一个功能,此时想像一下当我告诉你一个内存地址,我想要查该内存地址属于哪个模块该如何实现,其实很简单只需要拿到这个地址依次去判断其是否大于等于该模块的基地址,并小于等于该模块的结束地址,那么我们就认为该地址落在了此模块上,在这个思路下。则是读取磁盘文件并将其完整拷贝一份,这是两者的本质区别,如下代码则是实现完整拷贝的实现;开头的系列函数,然后依次对比起源地址与原地址是否一致,得出是否被挂钩,完整代码如下所示;函数,该函数的作用是读入一个内核文件到内存空间中,此处如果您使用前一篇。

2024-06-03 10:59:24 676

原创 驱动开发:内核实现SSDT挂钩与摘钩

函数指针在调用结束后即可很容易的跳转回原函数上,保证流程被正确执行,如果需要Hook其他函数其编写模板也是如下所示;接着就是如何挂钩并让其中转到我们自己的代码流程中的问题,由于挂钩与恢复代码是一样的此处就以挂钩为例,首先调用。Hook核心代码如下所示,为了节约篇幅,如果您找不到程序中的核心功能,请看前面的几篇文章,这里就不在赘述了。挂钩的目的就是要为特定函数增加功能,挂钩的实现方式无非就是替换原函数地址,我们以内核函数。将新函数地址写出到内存中实现替换,最后释放MDL句柄即可,这段代码如下所示,看过。

2024-06-03 10:45:07 306

原创 驱动开发:内核解析PE结构导出表

参数,本章将继续延申这个话题,实现对PE文件导出表的解析任务,导出表无法动态获取,解析导出表则必须读入内核模块到内存才可继续解析,所以我们需要分两步走,首先读入内核磁盘文件到内存,然后再通过。取出函数的入口RVA,然后通过RVA加上模块基址便是第一个导出函数的地址,向后每次相加导出函数偏移即可依次遍历出所有的导出函数地址。导出函数存储在PE文件的导出表里,导出表的位置存放在PE文件头中的数据目录表中,与导出表对应的项目是数据目录中的首个。得到导出表的地址,依次循环读取即可得到完整的导出表。

2024-06-03 10:36:56 638

原创 驱动开发:内核特征码扫描PE代码段

如上述所示定位函数我们已经封装好了,相信你也能感受到这种方式要比使用数组更方便,为了能定位到内核PE结构我们需要使用。既然能够得到PE头部数据了,那么我们只需要扫描这段空间并得到匹配到的数据即可,其实很容易实现,如下代码所示。头文件,该头文件中包含了我们本篇文章所必须要使用到的结构体定义,这些定义的函数如果不懂请去看。来解析,这个内核函数专门用来得到内核程序的PE头部结构的,在下方案例中首先我们使用封装过的。将对特征码定位进行简化,让定位变得更简单,并运用定位代码实现扫描内核PE的。

2024-06-03 10:25:44 242

原创 驱动开发:内核特征码搜索函数封装

集,总体来说这种方式只能定位特征较小的指令如果特征值扩展到5位以上那么就需要写很多无用的代码,本章内容中将重点分析,并实现一个。链表头部地址为案例进行讲解,如果你忘记了如何寻找链表头部可以去前面的文章中学习,这里只给出实现流程。如上图可以看到,这个特征码定位函数返回的是内存地址,而我们需要得到地址内的数据,此时就需要提取以下。如下是一段特征码搜索片段,可以看到其实仅仅只是将上章中的搜索方式变成了一个。以及搜索特征码的字节数组,即可完成搜索工作,具体的参数定义如下。函数,如下函数,用户传入一个。

2024-06-03 09:23:28 247

原创 驱动开发:内核枚举IoTimer定时器

枚举IO定时器的案例并不多见,即便有也是无法使用过时的,此教程学到肯定就是赚到了。至此IO定时器的枚举就介绍完了,在教程中你已经学会了使用特征码定位这门技术,相信你完全可以输出内核中想要得到的任何结构体。这个函数他是一个初始化函数,既然是初始化里面一定会涉及到链表的存储问题,找到他就能找到定时器链表基址,该函数的定义如下。接着就是通过代码实现对此处的定位,定位我们就采用特征码搜索的方式,如下代码是特征搜索部分。定时器,内核定时器其实就是在内核中实现的时钟,该定时器的枚举非常简单,因为在。

2024-06-03 08:35:20 670

原创 vs中.\ 与 ..\ 区别

需要注意的是,在跨平台开发中,应该避免硬编码路径分隔符和使用特定的路径表示方式。应该使用跨平台的路径处理函数来确保代码可以在不同操作系统上正确运行。则代表上一级目录,通常用于访问父目录中的文件或目录。因此,它们在路径表示中的含义和使用场景也是不同的。表示上一级目录(即父目录)下的文件 "file.txt"。代表当前目录,通常用于在当前目录下查找文件或目录,而。表示当前目录下的文件 "file.txt"。在 Visual Studio 中,在路径表示中的作用是不同的。是表示相对路径的两个特殊符号。

2024-06-03 08:06:15 663

原创 C++面试八股文:如何在堆上和栈上分配一块内存?

而new一般伴随三个动作,向操作系统申请一块内存,并执行类型的默认构造函数,然后返回类的指针。我们都知道new和delete成对出现,new[]和delete[]也是成对出现,那么我想问,如果使用new[]创建的对象用delete释放了会发生什么?我们都知道C++中的内存管理是一个比较麻烦的事情,现在有个需求,需要在程序中记录主动申请的内存和主动释放的内存,以确保没有发生内存泄漏。面试官:(笑)好吧,最后一个问题,咱们上面一直在讨论堆中的内存的分配和释放,请问一下,如果在栈上分配一块固定的内存?

2024-06-02 08:49:35 410

原创 C++面试八股文:struct、class和union有哪些区别?

当我们给us赋值1时,如果是大端,内存中的数据应该是这样的:0x00,0x01,这时候如果取uc的值,只能取到0x00。如果是小端,内存中的数据应该是0x01,0x00,此时取到的uc的值是0x01,返回1(true)。struct默认的成员是public的,而class的默认成员是private的。union实例的所有成员共享一块内存,这块内存的大小等同于union中成员尺寸最大的一个。对于一个IP地址,要么是IPV4要么是IPV6,IPV4和IPV6是互斥的,那么肯定有一块空间是被浪费了。

2024-06-02 08:40:39 247

原创 前端开发(2)--HTML常用的标签

西红柿红、酸黄瓜绿、涩

2024-05-31 08:57:56 1070

原创 前端3剑客(第1篇)-初识HTML

当今主流的技术中,可以分为前端和后端两个门类。前端:简单的理解就是和用户打交道后端:主要用于组织数据而前端就Web开发方向来说, 分为三门语言, HTML、CSS、JavaScript。

2024-05-31 08:42:52 719

原创 给Rust程序加个日志

日志是应用程序的重要组成部分。无论是服务端程序还是客户端程序都需要日志做为错误输出或者业务记录。在这篇文章中,我们结合聊聊rust 程序中如何使用日志。类似java生态中的log4j,使用方式也很相似。

2024-05-30 14:02:34 569

原创 Rust子命令提示,提高用户体验

在MyHelper 结构体中,需要我们自己来实现completer的逻辑。CommandCompleter 的实现部分比较多,大致包括两个部分,前一部分包括:获取某一级别下所有可能的子命令、获取某级别下某字符串开头的子命令、获取某级别下某个命令的所有子命令,等基本功能。SubCmd 结构体包含:命令级别,命令名称,以及该命令包含的子命令信息,以便在实现实现 autocomplete 时定位命令和子命令的范围。函数complete_cmd用来计算行中的位置以及在该位置的替换内容。

2024-05-30 13:32:43 324

原创 使用QtCreator C++编写串口调试助手

(界面设计的过程中,每一个控件的名称最好进行修改,便于后续控件太多不好区分,给控件命名的时候一定要就针对性,一下明白这个控件是干什么的。QMessageBox::information(this ,"提示","串口打开成功");QMessageBox::information(this ,"提示","串口关闭成功");if(serialport->isOpen())//如果串口已经打开了 先给他关闭了。//这样我们就获取到 可用的串口名字了。//添加串口到conbox控件中。//自定义的槽函数的声明。

2024-05-29 08:13:07 1041

原创 看到自己的书为大学生就业提供了帮助,真是开心!

2024-05-29 07:52:16 172

原创 Rocksdb原理简介

MANIFEST包含了两个文件,一个log文件一个包含最新MANIFEST文件名的文件,Manifest的log文件名是这样 MANIFEST-(seq number),这个seq会一直增长.只有当 超过了指定的大小之后,MANIFEST会刷新一个新的文件,当新的文件刷新到磁盘(并且文件名更新)之后,老的文件会被删除掉。所有的WAL文件都是保存在WAL目录(options.wal_dir),为了保证数据的状态,所有的WAL文件的名字都是按照顺序的(log_number)。

2024-05-29 07:08:03 877

原创 驱动开发:内核实现进程汇编与反汇编

简单介绍了如何通过MDL映射的方式实现进程读写操作,本章将通过如上案例实现远程进程反汇编功能,此类功能也是ARK工具中最常见的功能之一,通常此类功能的实现分为两部分,内核部分只负责读写字节集,应用层部分则配合反汇编引擎对字节集进行解码,此处我们将运用。Capstone旨在成为安全社区中二进制分析和反汇编的终极反汇编引擎,该引擎支持多种平台的反汇编,非常推荐使用。首先是实现驱动部分,驱动程序的实现是一成不变的,仅仅只是做一个读写功能即可,完整的代码如下所示;反汇编函数,该函数的解释如下所示;

2024-05-28 08:09:17 478

原创 驱动开发:内核MDL读写进程内存

MDL内存读写是最常用的一种读写模式,通常需要附加到指定进程空间内然后调用内存拷贝得到对端内存中的数据,在调用结束后再将其空间释放掉,通过这种方式实现内存读写操作,此种模式的读写操作也是最推荐使用的相比于CR3切换来说,此方式更稳定并不会受寄存器的影响。写入时与读取类似,只是多了锁定页面和解锁操作。

2024-05-28 07:50:42 410

原创 Rust中的CLI程序

技术的学习从不会到会的过程是最有意思的,也是体会最多的。一旦熟练了,知识变成了常识,可能就失去了记录学习过程的最佳时机。在我看来学习一门计算机语言和学习人类语言有很多共通之处。我们学习人类语言是从单个的词开始,然后是简单句子,通过不断的与他人交互练习掌握语法和语言习惯。当熟练到一定程度就可以表达思想。计算的语言也差不多,熟悉关键词,基本逻辑,标准库,写应用。只是沟通的对象是机器而已。既然是学就不能在开始搞的太难。学习本来就是个艰苦的差事。上来就干特别复杂的事情往往会坚持不下去。

2024-05-27 08:06:52 803

原创 文盘Rust -- 生命周期问题引发的 static hashmap 锁

在这里我觉得所谓桩有两层含义,一个是木人桩,就是练习的工具,一个是”站桩“,传统武术训练基本功的方法。后面如果在Rust的开发过程中有其他问题,我本人会把问题结合实际也写到这个系列里,也希望社区里对Rust感兴趣的小伙伴一起来”盘Rust“。问题找到了就可以着手解决办法了,既然是与rust的生命周期有关,那是不是可以把读和写分别放在两个不同的生命周期里呢,于是对代码进行改写。2021年上半年,撸了个rust cli开发的框架,基本上把交互模式,子命令提示这些cli该有的常用功能做进去了。

2024-05-27 07:19:02 904

《轻松学PHP》源代码

《轻松学PHP》源代码

2024-05-27

《PHP+MySQL网络开发从入门到精通》源代码资源

《PHP+MySQL网络开发从入门到精通》源代码资源

2024-05-27

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除