自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(309)
  • 收藏
  • 关注

原创 【langgraph基础入门】

比如在执行过程中,如果需要检索信息,则可以利用搜索工具来实现,如。

2025-08-17 12:31:15 898

原创 在vscode中使用plantUML

PlantUML是一个开源工具,它允许用户通过简单的文本描述来创建UML图(统一建模语言图)。这种方法的优点在于它能快速绘制出结构图,如序列图、用例图、类图、活动图、组件图、状态图等,非常适合在文档或代码注释中快速表达设计思路。PlantUML主要使用基于文本的描述语言,我们可以在任何文本编辑器中编写你的UML图描述,然后用PlantUML工具将其转换成图形表示。

2025-07-22 07:10:59 821

原创 从0到1搭建一个Rag引擎(ollama+Qwen3)

大型语言模型(LLM)在生成语言时,可能会产生幻觉或不准确的结果。这些问题包括为了解决这些问题,检索增强生成(Retrieval-Augmented Generation, RAG)应运而生。RAG,极大地提升了模型输出的准确性和相关性。RAG 不仅提高了知识更新的效率,还显著增强了生成内容的可追溯性,使其在实际应用中更具实用性和可信度。RAG技术诞生的原因:大模型最大对话上下文限制。

2025-07-19 15:50:40 747

原创 ubuntu安装kafka(无zk版本)

解压安装包。

2025-07-14 17:33:49 578

原创 ubuntu20.04安装mysql

如果你安装的mysql版本没有在安装的时候让你设置初始root密码,此时其实是mysql自己,默认初始化了密码,可以在这里找到。2.设置root密码,如果没有这步说明你的mysql版本会自动初始化密码,后边会后步骤说明如何修改root密码。再次查看,即可看到任意连接都可以使用root账户访问数据库了。查看用户访问权限,可以看到,此时root用户显示仅限本地访问。退出后使用你设置的root密码登录验证即可。4.是否允许root远程连接。5.是否删除test数据库。3. 是否删除匿名用户。

2025-07-12 00:18:26 331

原创 Go语言基础之反射机制

反射是指在程序运行期间对程序本身进行访问和修改的能力。程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分。在运行程序时,程序无法获取自身的信息。支持反射的语言可以在程序编译期间将变量的反射信息,如字段名称、类型信息、结构体信息等整合到可执行文件中,并给程序提供接口访问反射信息,这样就可以在程序运行期间获取类型的反射信息,并且有能力修改它们。Go程序在运行期间使用reflect包访问程序的反射信息。

2025-07-05 22:34:22 681

原创 Go语言基础之接口

接口是一种由程序员来定义的类型,一个接口类型就是一组方法的集合,它规定了需要实现的所有方法erWritercloser举个例子,定义一个包含Write方法的Writer接口。当你看到一个Writer接口类型的值时,你不知道它是什么,唯一知道的就是可以通过调用它的Write方法来做一些事情。

2025-07-05 20:46:06 863

原创 gorm使用mysql快速上手

在本文中,我们将介绍如何在 golang 中使用 gorm 这个流行的 ORM 框架来连接 MySQL 数据库,并进行一些基本的增删改查操作。gorm 是一个提供了简洁和强大的功能的 ORM 库,它支持多种数据库,包括 MySQL,PostgreSQL,SQLite,Oracle 等。使用 gorm,我们可以方便地将数据库中的表映射为 golang 中的结构体,以及使用 gorm 提供的方法来执行 SQL 语句。首先,我们需要定义一个模型来映射数据库表。假设我们的项目有一个Videogorm.Model。

2025-07-01 23:43:43 681

原创 ubuntu20.04配置go环境

解压安装包。

2025-06-29 00:15:10 802

原创 为什么Google的代码规范推荐用unique_ptr,对shared_ptr却很谨慎?

性能更好:没有引用计数开销内存更省:只有一个指针的大小设计更清晰:明确的所有权语义更安全:避免循环引用等陷阱能用unique_ptr就不用shared_ptr,能用引用就不用指针。

2025-06-22 16:06:13 530

原创 cherryStudio连接MCP服务器

cherryStudio的安装可直接去官网进行安装即可安装完成后打开的界面是这样的。

2025-06-22 11:57:03 1439

原创 MCP入门实战(Python版)

MCP开发要求借助uv进行虚拟环境创建和依赖管理。uv 是一个Python 依赖管理工具,类似于 pip 和 conda ,但它更快、更高效,并且可以更好地管理 Python 虚拟环境和依赖项。它的核心目标是 替代 pip 、venv 和 pip-tools ,提供更好的性能和更低的管理开销。1. 速度更快:相比 pip ,uv 采用 Rust 编写,性能更优。2. 支持 PEP 582:无需 virtualenv ,可以直接使用3. 兼容 pip :支持 __pypackages__ 进行管理。

2025-06-21 18:35:56 1254

原创 vLLM调度部署Qwen3

在之前的中,我们介绍了如何使用ollama部署qwen3,一般而言,ollama适合个人部署使用,在面对企业级的模型部署时,一般更建议使用vLLMvLLM(高效大语言模型推理库)是一个专为大语言模型(LLMs)优化推理速度的开源框架,由斯坦福大学系统研究组开发。其核心目标是通过创新的软件和算法设计,大幅提升 LLM 在生成文本时的吞吐量和效率,尤其适用于处理高并发的推理请求。

2025-06-16 22:21:18 1189

原创 零基础本地部署Qwen3模型(ollama+Open-WebUI)

建议使用linux如ubuntu等。

2025-06-15 23:48:05 2196

原创 深入解析 C++17 中的std::variant与std::visit:从原理到实践

当你使用时,一个自然而然的问题是如何处理存储在其中的不同类型的值。手动检查和处理多种可能的类型通常很繁琐,而且容易出错。这就是std::visit发挥作用的地方。std::visit提供了一种机制,让你能够方便、优雅地处理中存储的多种可能的类型。它基于访问者模式(Visitor Pattern),是一种运行时多态的实现。

2025-04-26 17:14:52 1048

原创 Valgrind内存调试工具详解

Valgrind是C++开发者必备的调试神器,尤其擅长解决内存问题。无论是新手还是资深工程师,学会使用Valgrind都能大幅提升代码质量。Valgrind是Linux环境下最强大的动态分析工具之一,主要用于检测等C/C++程序中的常见问题。它通过虚拟执行程序(类似“沙盒”)来监控内存和线程行为,无需修改源码即可发现问题。(默认工具):检测内存错误(泄漏、非法访问等)。:性能分析,生成函数调用图。:检测多线程竞争和死锁。:堆内存分析,可视化内存占用趋势。

2025-04-18 15:02:10 495

原创 protobuf为什么快

Protocol buffer时需要用户自定义自己的结构体,而且结构体中的定义规则要符合。

2025-03-25 22:54:04 1108

原创 clang-format安装配置与vscode支持

输入以下命令就会按照llvm的格式在在当前路径下生成.clang-format文件。我们可以在vscode中输入快捷点ctrl+shift+p。件,以下是笔者找到了几篇关于google的编码风格,可参考。),之后在输入框输入clang-format,之后在想要格式化的文件中使用快捷键。文件格式来,接下来我们修改生产的。,其表示按照我们自己定义的。可以看到这里的文件格式是。打开设置面板(或者按下。就可以了格式化文档了。

2025-03-07 11:51:08 1730

原创 《操作系统真象还原》第十三章——磁盘驱动程序

另外,来自8259A从片的中断是由8259A主片帮忙向处理器传达的,8259A从片是级联在8259A主片的IRO2接口的,因此为了让处理器也响应来自8259A从片的中断,屏蔽中断寄存器必须也把IRO2打开。如图所示,也就是打开引脚IRQ14和IRQ15(第2个 ata 通道接在 8259A从片的IRQ15 上,该 ata 通道上可支持两个硬盘)它是硬盘寻址的早期方式,用于标识硬盘上的数据存储位置。确认写入创建的分区,注意只有写入之后创建的分区才会创建成功。修改逻辑分区的id号,以区别主分区。

2025-01-11 20:11:09 1090

原创 《操作系统真象还原》第十二章(二) —— 完善堆内存管理

上一节,我们完成了用户程序和操作系统之间的接口——系统调用,本节我们在此基础上完善堆内存管理——实现malloc和free之前我们虽然已经实现了内存管理,但之前实现分配的内存都是以 4KB 大小的页框为单位的,当我们仅需要几十字节、几百字节这样的小内存块时,显然无法满足这样的需求了,为此必须实现一种小内存块的管理,可以满足任意内存大小的分配,这就是我们为实现malloc要做的基础工作。本节的主要任务有:实现sys_malloc实现sys_free实现malloc实现free。

2025-01-09 09:15:27 1276

原创 《操作系统真象还原》第十二章(一) —— 系统调用

上一节,我们实现了用户进程的创建,至此,我们成功将操作系统的使用权给用户进行了开放,用户至此可以创建进程然后实现自己的功能,但用户实现的功能最终还是要在操作系统上运行,因此还需要借助操作系统提供的接口服务,这就是本节我们将要实现的——系统调用系统调用(System Call)是操作系统提供给应用程序访问硬件资源和操作系统服务的接口。通过系统调用,程序可以向操作系统请求服务,如文件操作、内存管理、进程控制等。系统调用位于用户态和内核态之间,通常被用来执行用户程序无法直接完成的任务。

2025-01-08 17:50:57 1382

原创 《操作系统真象还原》第十一章 —— 创建用户进程

在上一节中,我们实现了操作系统的“输入”功能,通过编写键盘驱动程序,成功让操作系统接受键盘输入并在屏幕进行打印但是到目前为止,我们所有的程序都是在最高特权级0级下工作,而本节,我们将实现用户使用的用户程序,其特权级为3进程与内核线程最大的区别是进程有单独的4GB空间,当然这指的是虚拟地址。因此,我们需要单独为每个进程维护一个虚拟地址池此外,为了维护每个进程的虚拟内存池与用户物理内存池的映射关系,我们还需要为每个进程创建页目录表最后,每个进程的特权级是3,而此前我们一直在0特权级下工作,因此我们还需要。

2025-01-05 20:09:27 914

原创 《操作系统真象还原》第十章(二)—— 键盘驱动程序的编写与输入系统

在上一节中,我们介绍了操作系统的同步机制互斥锁的内容,并手动实现了互斥锁,同时实现了线程安全的屏幕打印。至此,我们算是基本完成了操作系统的“输出”功能,但目前为止我们的输入仍旧依赖于程序,而不是用户操控的键盘 本节我们将正式完成操作系统的“输入”本节的主要任务有:键盘驱动测试编写键盘驱动程序基于环形缓冲区的键盘驱动程序一个键的状态要么是按下,要么是弹起,因此一个键有两个编码,这两个编码统称扫描码,一个键的扫描码由通码和断码组成。按键被按下时的编码叫通码。

2024-12-27 19:19:43 1617

原创 《操作系统真象还原》第十章(一) —— 同步机制之互斥锁实现与输出系统

在上一节中,我们实现了线程轮转调度,并分别实现了三个线程并发的在终端进行输出打印主线程init_all();/*打开中断,主要是打开时钟中断,以让时间片轮转调度生效*/while (1)return 0;/* 线程执行函数 */while (1)/* 线程执行函数 */while (1)但如果持续输出会发现终端会爆出一个GP异常。

2024-12-23 23:33:07 1379

原创 《操作系统真象还原》第九章(二) —— 多线程轮转调度

上一节,我们成功模拟pthread_create创建了新的线程并成功执行本节我们将介绍如何进行多线程轮转调度本节的主要任务有:创建多线程轮转调度的数据结构——双向链表借时钟中断完成多线程的时间片轮转调度。

2024-12-23 00:33:39 974

原创 《操作系统真象还原》第九章(一) —— 在内核空间中实现线程

上一节,我们初步完成了内核的内存管理部分的内容本节我们将正式开始操作系统进程管理的相关内容本节的主要任务有:创建并初始化PCB模拟pthread_create函数创建线程并执行线程函数如同上一节中的位图,位图是管理内存的数据结构,对于线程或者进程,也需要有一个数据结构对其进行管理,这个数据结构就是PCB。PCB(Process Control Block,进程控制块)是操作系统内部用于存储进程信息的数据结构。操作系统通过PCB来管理和调度进程。PCB 的生命周期进程创建时。

2024-12-21 23:08:52 1339

原创 《操作系统真象还原》第八章(二) —— 内存管理系统

上一节,我们初步构建了管理内存需要的数据结构及其相关操作——位图本节我们将在上一节的基础上正式实现操作系统的内存管理系统,直到malloc函数与free函数的完成本章的主要任务有:内存池的初始化内存分配实现最终实现的效果是内核程序向虚拟内存申请page个虚拟内存页面操作系统在内核虚拟内存中寻找到空闲的连续page个虚拟页面操作系统在内核物理内存池中找到page个物理页面(可能不连续)

2024-12-21 00:09:51 1315

原创 《操作系统真象还原》第八章(一) —— 位图及其实现

上一节,我们成功为我们的内核开启了中断机制,并使用时钟中断进行了测试本节我们将开启操作系统内存管理的相关内容本章的主要任务有:实现ASSERT断言实现字符串处理函数实现管理物理内存的数据结构位图断言(Assertion)可视为一种调试工具,主要用于检测程序在运行时是否满足某个条件。如果断言条件为真,程序继续执行;如果为假,程序通常会停止执行并抛出错误信息,帮助开发者发现潜在的问题。断言语句通常具有以下结构:condition是你期望为真的条件。如果condition为True。

2024-12-20 21:43:23 1471

原创 8086处理器的寻址方式

当处理器执行这条指令时,把数据段寄存器DS的内容左移4位,加上基址寄存器BX的内容,再加上变址寄存器SI的内容,共同形成20位的物理地址。第一条指令中,源操作数使用的是直接寻址方式,当这条指令执行时,处理器将数据段寄存器DS的内容左移4位,加上这里的0x5c0f,形成20位物理地址。这条指令执行时,处理器将栈段寄存器SS的内容左移4位,加上寄存器BP的内容,形成20位的物理地址,并将该地址处的一个字传送到寄存器AX中。寄存器寻址的操作数位于寄存器中,立即寻址的操作数位于指令中,是指令的一部分。

2024-12-11 21:30:11 878

原创 linux命令尾部&、&&、&>、 2>&1 的用法和区别

将正常的信息,重定向到某个文件/设备中(会覆盖文件原有信息>>将正常的信息,重定向到某个文件/设备中(不会覆盖文件原有信息,只会追加&>将正常+异常信息,一并重定向到某个文件/设备中(会覆盖文件原有信息&>>将正常+异常信息,一并重定向到某个文件/设备中(不会覆盖文件原有信息,只会追加2>只输出错误信息到某个文件/设备中。

2024-12-11 15:44:10 2235

原创 linux快捷命令收集

适用于在两个不同的目录之间频繁切换的场景,比如上一次在 /a/work 目录,当前在 /b/work 目录,执行该命令后会跳转到 /a/work,再执行一次会跳转到 /b/work。常见的既保存记录又同步在终端输出的操作办法是先执行 python test.py > a.log,然后在另外一个终端窗口执行 tail -f a.log。,可以使用 top 命令中的 pid 替换上述命令中的 pid,快速定位出 test.py 文件所在目录。:需要把命令中的 pid 替换成你需要查询的 pid,常用于。

2024-12-11 15:15:58 495

原创 文本三剑客——sed命令

sed,即stream editor,是一种流编辑器。

2024-12-09 00:31:45 775

原创 文本三剑客——grep命令

Linux grep (global regular expression) 命令用于查找文件里符合条件的字符串或正则表达式。

2024-12-08 21:50:03 456

原创 和为k的子数组(前缀和)

这可以在遍历 s[j] 的同时,用一个哈希表 pre_sum统计 s[j] 的个数。那么枚举到 s[j] 时,从哈希表中就可以找到有 pre_sum[s[j]−k] 个 s[i],即为元素和等于 k 的子数组个数,加入答案。观察上述代码,我们初始化了pre_sum[0]=1,这主要是因为,当pre_sum[j]等于k时,pre_sum[j]-k等于0,如果不进行该初始化操作,我们就没有办法计算出这个符合要求的子数组。下标从 i 到 j−1 的非空连续子数组的元素和等于 k,即。把上式调整一下就变成了。

2024-12-02 09:58:36 457

原创 二叉树的直径

然后我们遍历每个节点,计算其左子树的最大深度和右子树的最大深度,相加就得到了当前节点的最长路径,依次遍历更新整棵树的最长路径即可。因为后序遍历的过程中,更新整棵树的最大路径长度与计算当前节点的最大深度是不冲突的,即。3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。可以看到,我们完全可以将这两段代码结合起来。是指树中任意两个节点之间最长路径的。给你一棵二叉树的根节点,返回该树的。解法二是在解法一的基础上改进得到的。首先写出计算一棵树的最大深度代码。由它们之间边数表示。

2024-12-01 10:56:26 422

原创 linux基本命令——sort详解

因此,正确的命令应该如下,这条命令是说,

2024-11-29 11:55:18 2599

原创 合并 K 个升序链表(归并)

请你将所有链表合并到一个升序链表中,返回合并后的链表。给你一个链表数组,每个链表都已经按升序排列。将它们合并到一个有序链表中得到。本题是归并排序的思想是一致的。

2024-11-24 16:42:55 366

原创 随机链表的复制

这个 random 指针意味着在复制过程中,除了构建前驱节点和当前节点的引用指向 pre->next ,还要构建前驱节点和其随机节点的引用指向 pre->random。以下是这段代码之间关系的图解,可以看到,由于我们保存了新旧节点直接的映射关系,因此我们可以很方便的构建新节点之间的next指针和ranhdom指针的关系。给定链表的头节点 head ,复制普通链表很简单,只需遍历链表,每轮建立新节点 + 构建前驱节点 pre 和当前节点 node 的引用指向即可。,该指针可以指向链表中的任何节点或空节点。

2024-11-24 11:35:58 757

原创 回文链表(双指针、快慢指针)

请你判断该链表是否为回文链表。给你一个单链表的头节点。

2024-11-24 10:00:51 395

原创 linux安装cyberRT6.0

由于笔者只对cyberRT感兴趣,之前安装的是apollo 9.0,里边包含了所有的代码,包括仿真和pnc等,占据空间较大,因此尝试改用apollo6.0,只安装cyberRT部分有关apollo 9.0部分的安装见官网,没有遇到什么bug但apollo 6.0的安装遇到了一些问题,故而在此记录。

2024-11-23 11:53:00 1048

空空如也

空空如也

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

TA关注的人

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