Java MCP SDK 开发笔记(一)
MCP 简介
AI 大模型诞生之初,其高度模拟人的对话之能力惊为天人。但我们肯定不希望止步于此—— 工具化就是我们希望 AI 能够完成的目标,由此可以从单纯的对话发展为代替繁复人力的“干活”。这条道路上毋庸置疑 AI 大模型任重道远。而 MCP(Model Control Protocol) 的应运而生正好为大模型工具化铺平了道路。
了解 MCP
MCP 是一个协议,怎么理解的 MCP 呢?首先概念上讲,Host 是宿主的概念,它一般伴随 Client 客户端一起出现。在终端用户上讲,Client 往往看不见——因为它被 Host 整合到其中里面去了。而 Host 则是指我们“看得见摸得着”的软件,比如代码编辑器 Cursor 就是一个典型的 Host,——你甚至不需要知道 MCP Client 而直接使用 Host Cursor,在 Cursor 中配置一下连接 MCP Server 即可。Server 肯定是重要的概念,但我们先按下不表,——先说说 Client。Client 虽然被 Host 暂时“遮蔽”了,但不意味它并不重要。相反 Client 在 MCP 里面跟 Server 同等重要——反倒 Host 是在前面忽悠人的东东,甚至有朋友在 Host 与 Client 之间的概念纠结了很久……
如果你能 LLM 那样嚼蜡般死磕文档,那也未尝不可,这里有份中文文档读起来更容易……
如果不是,那么笔者推荐你去开源中国 gitee 搞个他们的 gitee-mcp 是个可执行 exe,他就是个 MCP Server,你用 MCP Client 跟它交互,这样通过例子学习 MCP 或许更友好。
接着你还要搞个 MCP Inspector,可视化的,学习更方便!
MCP Inspector
这是官方出品的调试 MCP Server 的可视化工具,也可以作为了解 MCP 原理的工具(它本身是一个 MCP Client)。其实无非就是跟 Server 如何通讯,JSON-RPC 报文如何定义的等问题,对于了解 MCP 机制很有帮助,——好过去看一堆忽悠的文章。
该 app 由 next.js 写成,系 nodejs 工程,如果是前端那么比较熟悉安装了。
注意,如果出现Cannot find module @rollup/rollup-win32-x64-msvc
报错,可以尝试先安装npm install rollup
。
通过源码学习 MCP
MCP 不少乃是 Python 或 TypeScript 的实现,Java 岂能缺席?搜索了一下发现 Java MCP 的不多,比较有代表性如下两个:
- 官方 SDK(源码),系基于 Reactor 的实现。官方默认的就是绑定 Spring 框架。响应式虽然应用合理且强大,但不免又要学习一番,简单的通讯不可以?Java 自带的
CompleteFuture
或许刚好够用。不过后来看,不用 WebFlux 那套也行,官方提供了mcp-spring-webmvc
也可以为传统的 SpringMVC 程序所服务。然后,最主要的问题是,这 SDK 要求 Java 17,太高大上了……
教程、例子。 - Quarkus MCP servers,一个更陌生的框架,好像在 K8S 上用的。
- langchain4j-mcp。谈到 AI 工具不能不提 langchain——而这个 Java 移植版本提供了 MCP Client 的实现,但 Server 好像未看到。这个可比 Spring 的下里巴人多了,免其他框架依赖,简单朴实,唯一美中不足就是要求 Java11,而且依赖 langchain-core 模块(其实就几个 POJO 类)
协议规范一览
MCP 协议概览的几个点:
- Client/Host/Server 架构,比传统 C/S 多个 Host,但这个 Host 不那么重要。——为什么不只做一个 MCP 组件就好?因为安全问题和关注点不同,分多一层自然能够应付复杂的问题
- 基于 JSON-RPC 协议。这是一个轻量级、简单的协议。说白了就是 JSON 规范一下内容你再去调。这个有状态的、可以双工的(例如 Sampling)
组件简单说说:
- Host 发起连接的 LLM 应用程序,例如 Desktop App 或 IDE,负责管理 MCP Client,整合 AI/LLM 的
- Client,在 Host 与 Server 之间的连接器,作为 SDK 整合到 Host 中
- Server,暴露工具 Tool、资源等给 Host/Client 用的,有 API 和本地通讯两种方式
简单的架构图如下:
既然是 C/S 架构自然有个请求与响应,用 JSON-RPC 定义(其实是 TypeScript 定义,这事情 ts 擅长)
请求
双向的请求都有,就是说客户端请求服务端之外还有服务端请求客户端的。每次请求都有 id 字段且不能为null
。
{"jsonrpc": "2.0","id": "string | number","method": "string","param?": {"key": "value"}
}
响应
响应通过 id 与请求关联。result 或 error 选其一出现。也可以没有响应的(result
为空)
{"jsonrpc": "2.0","id": "string | number","result?": {"[key: string]": "unknown"},"error?": {"code": "number","message": "string","data?": "unknown"}
}
通知
通知没有响应,没有 id 字段,用于事件通知或者更新状态,异步的,这样可以减少通信开销。
{"jsonrpc": "2.0","method": "string","params?": {"[key: string]": "unknown"}
}
MCP 生存周期
初始化阶段
初始化阶段必须是客户端和服务器之间的第一次交互。在此阶段,双方需要完成以下任务:
- 建立协议版本兼容性:确认客户端和服务器都支持的协议版本,以确保双方能够理解彼此的消息格式和通信规则。
- 交换并协商能力(capabilities) :双方互相通报各自支持的功能和服务,并就将要使用的能力达成一致。这可能包括但不限于支持的数据格式、认证方法、加密算法等。
- 共享实现细节:提供必要的实现细节以便于优化通信或处理特定的情况。这些细节可以包含特殊的行为、限制条件或者是对标准的扩展。
具体流程如下
- 客户端发送初始化请求:客户端首先发送一个包含协议版本和功能的初始化请求。
- 服务器响应:服务器接收到请求后,会返回自己的协议版本和功能。
- 客户端确认:客户端接收到服务器的响应后,发送一个初始化完成的通知,表示双方已经准备好开始正常的消息交换。
- 正常消息交换开始:初始化完成后,双方开始进行正常的消息交换。
请求例子:
{"jsonrpc": "2.0","id": 1,"method": "initialize","params": {"protocolVersion": "2024-11-05","capabilities": {"roots": {"listChanged": true},"sampling": {}},"clientInfo": {"name": "ExampleClient","version": "1.0.0"}}
}
响应例子
{"jsonrpc": "2.0","id": 1,"result": {"protocolVersion": "2024-11-05","capabilities": {"logging": {},"prompts": {"listChanged": true},"resources": {"subscribe": true,"listChanged": true},"tools": {"listChanged": true}},"serverInfo": {"name": "ExampleServer","version": "1.0.0"}}
}
通知例子
{"jsonrpc": "2.0","method": "initialized"
}
版本协商
在初始化请求中,客户端必须发送它所支持的协议版本。
- 客户端应当发送其支持的最新版本:这样可以确保尽可能使用最新的功能和改进。
- 服务器必须响应相同的版本或另一个它支持的版本:这表示服务器同意使用某个双方都支持的版本进行通信。
- 如果客户端不支持服务器的版本,它应该断开连接:这意味着没有找到兼容的协议版本,继续通信可能会导致不一致或错误。
能力协商
客户端和服务器的能力决定了会话期间哪些可选的协议特性是可用的。
客户端能力(Client Capabilities)
客户端能力描述了客户端在会话中支持的可选功能或特性。以下是一些常见的能力及其含义:
能力名称 | 描述 | 示例用途 |
---|---|---|
roots | 提供文件系统根目录的能力 | 文件操作、项目管理 |
sampling | 支持 LLM 采样请求的能力 | 文本生成、自然语言处理 |
experimental | 支持非标准实验性功能的能力 | 测试新特性、探索未来功能 |
服务器能力(Server Capabilities)
服务器能力(Server Capabilities)定义了服务器在会话期间能够提供的功能和服务。这些能力帮助客户端了解服务器支持哪些特性,从而可以更有效地利用服务器的功能。
能力名称 | 描述 | 示例用途 |
---|---|---|
prompts | 提供提示模板 | 文本生成、任务指令 |
resources | 提供可读资源 | 获取文档、配置文件等 |
tools | 提供可调用工具 | 编译代码、分析数据等 |
logging | 发出结构化日志消息 | 监控、调试、审计 |
experimental | 支持非标准实验性功能 | 测试新特性、探索未来功能 |
操作阶段(Operation)
在操作阶段,客户端和服务器依据已协商的能力进行消息交换。
- 遵循已协商的协议版本。
- 仅使用成功协商后的功能(capabilities)。
这意味着在操作阶段,所有通信都应严格基于之前协商确定的规则和功能集。例如,如果在初始连接建立时双方协商确定了特定的协议版本和一组支持的功能,则在后续的操作过程中,双方应当遵守这些约定,确保使用正确的协议版本以及仅启用那些已经确认双方都支持的功能。这样可以保证通信的兼容性和稳定性。
错误处理
MCP 定义了以下标准错误代码
enum ErrorCode {// 标准 JSON-RPC 错误代码ParseError = -32700, // 解析错误InvalidRequest = -32600, // 无效请求MethodNotFound = -32601, // 方法未找到InvalidParams = -32602, // 无效参数InternalError = -32603 // 内部错误
}
SDK 和应用程序可以定义自己的错误代码,范围在 -32000 以上。
关闭连接
正常关闭:任何一方都可以通过调用 close() 方法来正常关闭连接,需要做:1、客户端发送断开连接的通知。2、服务器关闭连接。3、清理相关资源。
连接可能会因为传输层的问题(如网络中断)而意外断开。在某些错误情况下,连接也可能被终止。
服务端功能
服务器通过 MCP(Model Context Protocol,模型上下文协议)提供了为语言模型添加上下文的基本构建块,并提供了三种基本组件来管理上下文:工具(tools)、提示(prompts)和资源(resources)。
工具(Tools)
工具是 MCP 中的强大组件,是模型上下文协议(MCP)中的一个基本元素,它允许服务器向客户端暴露可执行功能,使 LLM 能够与外部系统交互、执行计算或采取现实世界的行动。工具设计为模型控制(model-controlled),即服务器将工具暴露给客户端,AI 模型可以自动调用这些工具。
工具的核心功能
- 发现(Discovery):客户端可以通过tools/list端点列出可用的工具。
- 调用(Invocation):工具通过tools/call端点被调用,服务器执行请求的操作并返回结果。
- 灵活性(Flexibility):工具的范围从简单的计算到复杂的API交互,具有高度的灵活性。
工具与资源(Resources)不同,资源通常是静态的,而工具代表动态操作,可以修改状态或与外部系统交互。
工具的定义结构
每个工具的定义结构如下:
{"name": "string", // 工具的唯一标识符"description": "string", // 工具的人类可读描述"inputSchema": { // 工具参数的JSON Schema"type": "object","properties": { ... } // 工具特定的参数}
}
工具的实现示例
以下是一个在 MCP 服务器中实现基本工具的示例:
const server = new Server({name: "example-server",version: "1.0.0"
}, {capabilities: {tools: {}}
});// 定义可用的工具
server.setRequestHandler(ListToolsRequestSchema, async () => {return {tools: [{name: "calculate_sum",description: "Add two numbers together",inputSchema: {type: "object",properties: {a: { type: "number" },b: { type: "number" }},required: ["a", "b"]}}]};
});// 处理工具执行
server.setRequestHandler(CallToolRequestSchema, async (request) => {if (request.params.name === "calculate_sum") {const { a, b } = request.params.arguments;return {toolResult: a + b};}throw new Error("Tool not found");
});
工具的模式示例
系统操作:与本地系统交互的工具。
{"name": "execute_command","description": "Run a shell command","inputSchema": {"type": "object","properties": {"command": { "type": "string" },"args": { "type": "array", "items": { "type": "string" } }}}
}
API 集成:封装外部 API 的工具。
{"name": "github_create_issue","description": "Create a GitHub issue","inputSchema": {"type": "object","properties": {"title": { "type": "string" },"body": { "type": "string" },"labels": { "type": "array", "items": { "type": "string" } }}}
}
数据处理:用于数据转换或分析的工具。
{"name": "analyze_csv","description": "Analyze a CSV file","inputSchema": {"type": "object","properties": {"filepath": { "type": "string" },"operations": {"type": "array","items": {"enum": ["sum", "average", "count"]}}}}
}
总结
工具(Tools)在 MCP 中是一个核心概念,它通过服务器暴露可执行功能,使 LLMs 能够与外部系统交互并执行复杂的操作。工具的设计具有高度的灵活性和可扩展性,能够支持从简单的计算到复杂的 API 集成。通过定义工具的结构和实现方式,开发者可以轻松地将各种功能集成到 LLMs 中,从而增强模型的能力。
工具的模型控制特性确保了工具的调用是可控的,可以额外加入人工批准作为限制,这为安全性和可控性提供了保障。工具的发现和调用机制使得 LLMs 能够动态地与服务器交互,执行各种任务,极大地扩展了模型的应用场景。
资源(Resources)
资源是模型上下文协议(MCP)中的核心组件,允许服务器向客户端暴露数据和内容,供大语言模型(LLM)交互时使用。资源设计为应用控制(application-controlled),即客户端应用决定何时以及如何使用这些资源。不同客户端对资源的使用方式可能不同,例如,Claude Desktop 要求用户明确选择资源,而其他客户端可能基于启发式自动选择资源,甚至允许 AI 模型自行决定使用哪些资源。服务器开发者应准备好处理这些不同的交互模式。
服务器作者在实现资源支持时应准备好处理这些交互模式。为了自动向模型暴露数据,服务器作者应使用模型控制的工具(如 Tools)。
概述
资源代表 MCP 服务器希望向客户端提供的任何类型的数据。这可以包括:
- 文件内容
- 数据库记录
- API 响应
- 实时系统数据
- 截图和图像
- 日志文件
- 以及其他类型的数据
每个资源由一个唯一的 URI 标识,并且可以包含文本或二进制数据。
资源URI
资源使用以下格式的 URI 进行标识:
[协议]://[主机]/[路径]
例如:
file:///home/user/documents/report.pdf
postgres://database/customers/schema
screen://localhost/display1
协议和路径结构由 MCP 服务器实现定义。服务器可以定义自己的自定义 URI 方案。
资源类型
资源可以包含两种类型的内容:、
文本资源
文本资源包含 UTF-8 编码的文本数据,适用于:
- 源代码
- 配置文件
- 日志文件
- JSON/XML 数据
- 纯文本
二进制资源
二进制资源包含以 base64 编码的原始二进制数据,适用于:
- 图像
- PDF 文件
- 音频文件
- 视频文件
- 其他非文本格式
资源发现
客户端可以通过两种主要方法发现可用资源:
直接资源
服务器通过 resources/list
端点暴露具体的资源列表。每个资源包括:
{"uri": "string", // 资源的唯一标识符"name": "string", // 人类可读的名称"description": "string", // 可选的描述"mimeType": "string" // 可选的MIME类型
}
资源模板
对于动态资源,服务器可以暴露 URI 模板,客户端可以使用这些模板构建有效的资源 URI:
{"uriTemplate": "string", // 遵循RFC 6570的URI模板"name": "string", // 此类型的名称"description": "string", // 可选的描述"mimeType": "string" // 所有匹配资源的可选MIME类型
}
读取资源
客户端通过发送resources/read
请求并附带资源URI来读取资源。服务器响应包含资源内容列表:
{"contents": [{"uri": "string", // 资源的URI"mimeType": "string", // 可选的MIME类型"text": "string", // 文本资源的内容"blob": "string" // 二进制资源的内容(base64编码)}]
}
服务器可能会在一次resources/read
请求中返回多个资源,例如读取目录时返回目录中的所有文件。
资源更新
MCP支持通过两种机制进行资源的实时更新:
列表变化
服务器可以通过notifications/resources/list_changed
通知客户端可用资源列表的变化。
内容变化
客户端可以订阅特定资源的更新:
- 客户端发送
resources/subscribe
请求并附带资源URI。 - 服务器在资源更新时发送notifications/resources/updated通知。
- 客户端可以通过resources/read获取最新内容。
- 客户端可以通过resources/unsubscribe取消订阅。
示例实现
以下是一个简单的 MCP 服务器资源支持实现示例:
const server = new Server({name: "example-server",version: "1.0.0"
}, {capabilities: {resources: {}}
});// 列出可用资源
server.setRequestHandler(ListResourcesRequestSchema, async () => {return {resources: [{uri: "file:///logs/app.log",name: "Application Logs",mimeType: "text/plain"}]};
});// 读取资源内容
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {const uri = request.params.uri;if (uri === "file:///logs/app.log") {const logContents = await readLogFile();return {contents: [{uri,mimeType: "text/plain",text: logContents}]};}throw new Error("Resource not found");
});
总结
资源是 MCP 中的核心概念,允许服务器将数据和内容暴露给客户端,并作为 LLM 交互的上下文。资源的设计灵活,支持多种数据类型和交互模式。通过 URI 标识资源,客户端可以发现、读取和订阅资源的变化。服务器作者应根据不同的客户端需求实现资源支持,并考虑使用模型控制的工具来自动暴露数据。
相关文章:
Java MCP SDK 开发笔记(一)
MCP 简介 AI 大模型诞生之初,其高度模拟人的对话之能力惊为天人。但我们肯定不希望止步于此—— 工具化就是我们希望 AI 能够完成的目标,由此可以从单纯的对话发展为代替繁复人力的“干活”。这条道路上毋庸置疑 AI 大模型任重道远。而 MCP(Model Contr…...
AF3 OpenFoldDataLoader类_prep_batch_properties_probs方法解读
AlphaFold3 data_modules 模块的 OpenFoldDataLoader 类的 _prep_batch_properties_probs 方法是为每个批次数据准备 recycling 维度 的概率分布。它将根据配置文件中的设定为每个批次数据生成 recycling 轮次的概率分布,并存储到 prop_probs_tensor 中,用于后续抽样选择特定…...
寻找字符串数组中的最长共同前缀字符串
问题描述:给定一个字符串数组 strs,编写一个函数来找到这些字符串的最长公共前缀字符串,如果没有则返回空字符串"" 算法思路 横向扫描法: 从数组的第一个字符串开始,逐个和后面的字符串比较,逐…...
leetcode_数组 56. 合并区间
56. 合并区间 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: 输入:int…...
Jenkins学习(B站教程)
文章目录 1.持续集成CI2.持续交付CD3.持续部署4.持续集成的操作流程5.jenkins简介6.后续安装部署,见视频 bilibili视频 Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用…...
学习笔记—C++—类和对象(一)
目录 类和对象 类的定义 类定义格式 访问限定符 类域 实例化 实例化概念 对象的大小 this指针 C和C语言实现Stack对比 类和对象 类的定义 类定义格式 ● class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后…...
PyTorch 深度学习 || 6. Transformer | Ch6.3 Transformer 简单案例
1. 简单案例 这个代码是一个简单的 Transformer 模型的实现,这个例子展示了一个基本的序列到序列(seq2seq)任务,比如将一个数字序列转换为另一个数字序列。可以用于学习和理解 Transformer 的基本结构和工作原理。 import torch import torch.nn as nn import math# 位置…...
体育风暴篮球足球体育球员综合资讯网站模板
源码名称:篮球足球体育球员综合资讯网站模板 开发环境:帝国cms7.5 空间支持:phpmysql 带软件采集,可以挂着自动采集发布,无需人工操作! 演示地址:https://www.52muban.com/shop/184016.html …...
Visual Studio Code SSH 连接超时对策( keep SSH alive)
文章目录 问题解决方法一:配置服务端关于ClientAliveInterval和ClientAliveCountMax1、打开终端,打开SSH配置文件:输入以下命令:2、打开配置文件后,添加以下内容:3、添加后,Esc按 <Enter>…...
Docker容器中的ubuntu apt update报错 解决办法
问题现象 # apt update Get:1 http://archive.ubuntu.com/ubuntu noble InRelease [256 kB] Get:2 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB] Err:2 http://security.ubuntu.com/ubuntu noble-security InRelease At least one invalid signa…...
CV - 目标检测
物体检测 目标检测和图片分类的区别: 图像分类(Image Classification) 目的:图像分类的目的是识别出图像中主要物体的类别。它试图回答“图像是什么?”的问题。 输出:通常输出是一个标签或一组概率值&am…...
linux提权 corn 提权
corn提权 corn的基本使用方法 corn的作用就是可以定时的完成一下任务(如备份一下log 或者清除一下日志文件 这些就是运维人员用的) 先找一下定时任务的工作表 cat /bin/corntab 这个是普通用户 我们直接看都看不了 说明什么说明这个 是root高权限执…...
1Panel安装失败 国内docker安装失败
本文仅针对学习交流,只为了帮助计算机相关专业大学生个人技能实操而记录 非学习目的严禁学习!!!否则后果自负 1、离线安装1Panel(不需要手动安装docker,离线安装包里包括了docker) 离线包下载地…...
Excel + VBA 实现“准实时“数据的方法
Excel 本身是静态数据处理工具,但结合 VBA(Visual Basic for Applications) 可以实现 准实时数据更新,不过严格意义上的 实时数据(如毫秒级刷新)仍然受限。以下是详细分析: 1. Excel + VBA 实现“准实时”数据的方法 (1) 定时刷新(Timer 或 Application.OnTime) Appl…...
请问你怎么看待测试,指导哪些测试的类型,有用过哪些测试方法?
作为深耕测试领域多年的博主,我始终认为测试是软件质量的守护者,更是推动研发流程优化的催化剂。以下从测试认知、分类体系到实战方法论,结合具体案例为你系统拆解: 一、测试的本质认知 测试≠找 Bug,而是通过系统性验证回答三个核心问题: 软件是否符合用户需求?系统在…...
详解 Redis repl_backlog_buffer(如何判断增量同步)
一、repl_backlog_buffer 复制积压缓冲区(Replication Backlog Buffer) 是一个环形内存区域(Ring Buffer),用于临时保存主节点最近写入的写命令,以支持从节点断线重连后的增量同步。 1.1 三个复制偏移量 …...
工业操作系统国产化替代的战略路径与挑战分析
一、政策背景与战略意义 工信部提出的 2027 年替换 80 万套工业操作系统计划,是中国制造业向智能化转型的核心举措。该政策旨在通过国产化替代,解决工业领域 “缺芯少魂” 的问题,构建自主可控的工业软件生态体系。当前,中国工业操…...
JMeter接口性能测试从入门到精通
前言: 本文主要介绍了如何利用jmter进行接口的性能测试 1.在测试计划中添加线程组 1.1.线程组界面中元素含义 如果点击循环次数为永远: 2.添加HTTP取样器 2.1.填写登录接口的各个参数 2.2.在线程组下面增加查看结果树 请求成功的情况: 请求…...
WinForm真入门(9)——RichTextBox控件详解
WinForm中RichTextBox控件详解:从基础到高级应用 上一文中笔者重点介绍了TextBox控件的详细用法,忘记的 请点击WinForm真入门(8)——TextBox控件详解,那么本文中的RichTextBox与TextBox有什么区别吗,光看名字的话,多了…...
Linux : 内核中的信号捕捉
目录 一 前言 二 信号捕捉的方法 1.sigaction()编辑 2. sigaction() 使用 三 可重入函数 四 volatile 关键字 一 前言 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号。在Linux: 进程信号初识-CSDN博客 这一篇中已经学习到了一种信号…...
Linux 字符串截取#与%
在Linux的Shell脚本中,#和%用于字符串截取,通过通配符模式匹配删除部分内容 批量修改文件名技巧:Linux下#、##、%、%%符号操作详解-CSDN博客 从左截取(# 和 ##) #:删除最短匹配左侧内容。 ##:…...
Android学习总结之自定义View实战篇
场景一:自定义进度条 在很多应用中,我们会看到一些独特样式的进度条,接下来就实现一个简单的圆形进度条。 实现思路 继承 View 类。重写 onDraw 方法,在该方法里使用 Canvas 和 Paint 来绘制圆形进度条。提供更新进度的方法。 …...
C++ STL 详解 ——list 的深度解析与实践指南
在 C 的标准模板库(STL)中,list作为一种重要的序列式容器,以其独特的双向链表结构和丰富的操作功能,在许多编程场景下发挥着关键作用。深入理解list的特性与使用方法,能帮助开发者编写出更高效、灵活的代码…...
open函数的概念和使用案例
open 是 Linux/Unix 系统中用于打开或创建文件的系统调用,返回一个文件描述符(File Descriptor),后续可通过该描述符进行文件读写等操作。以下是其核心概念和使用案例的详细说明: 1. 核心概念 作用:打开或…...
整理一些大模型部署相关的知识
不一定有什么用, 不经常用还会忘掉. 之前被人问到一次,脑子卡壳回答不出要点, 非常尴尬! 在此记录一下使用心得, 偶尔回来翻看! 一 并行方式 1.1 数据并行 (Data Parallelism) 主要用于模型训练阶段, 即将多个完整的模型副本分布到多个gpu上, 每个gpu运行一部分数据数据, 每个…...
算法刷题记录——LeetCode篇(2.10) [第191~200题](持续更新)
更新时间:2025-04-04 算法题解目录汇总:算法刷题记录——题解目录汇总技术博客总目录:计算机技术系列博客——目录页 优先整理热门100及面试150,不定期持续更新,欢迎关注! 198. 打家劫舍 你是一个专业的…...
蓝桥杯备赛 Day 19 加练dfs
是否需要回溯? 输入参数有哪几个(当前dfs和下一个dfs什么会变?)? 是否需要返回值? 一.1158: 八皇后 P1158 - 八皇后 - New Online Judge (ecustacm.cn) 学习: 1.dfs输入为层数,即行号i,因为是每行只放一个,下一个dfs就是i1 2…...
蓝桥杯-卡java排序
问题描述 本题是一道针对 Java 中 Arrays.sort 的题目,因此只有一个数据,该数据可以把 int 类型的数组在使用 Arrays.sort 后卡成 O(n2)O(n2)。 给定一个有 nn 个正整数的序列 aa,你需要将其升序排序后输出。 输入格式 第一行输入一个正整…...
内存管理模块
在 Linux 内核中,内存管理是一个复杂而关键的组成部分。内核空间的虚拟地址被划分为多个区域,每个区域有其特定的用途和映射机制。本文将详细介绍 直接映射区(Direct Mapping Area)、vmalloc 区、永久内核映射区(Perma…...
Spring RestTemplate修仙指南:从HTTP萌新到请求大能的终极奥义
各位在Spring生态摸爬滚打的道友们!今天要解锁的是Spring官方御用HTTP法宝——RestTemplate!这货堪称Java界的"御剑飞行术",虽然官方已推荐WebClient接棒,但江湖上仍有80%项目在用这员老将!准备好一键起飞了…...
cpp经典数论问题
题目如下 思路 代码如下...
Redis 线程模型:单线程也能快如闪电?
目录 一、核心思想:快刀斩乱麻的“单线程”高手 🦸♂️二、为什么是“单线程”?🤔三、单线程如何做到高性能?✨ “I/O 多路复用”是关键!四、真的一直都只有“一个线程”吗?并不完全是&#x…...
游戏引擎学习第208天
运行游戏并回顾我们的情况 今天,我们将继续完成之前中断的调试输出工作。最近的工作偏离了一些,展示了如何进行元编程的实践,主要涉及了一个小的解析器。尽管这个解析器本身是一个玩具,但它展示了如何完成一个完整的循环…...
JavaScript箭头函数介绍(=>)(箭头函数不绑定自己的this,而是继承上下文的this;不能用于造函数)JavaScript =>
文章目录 JavaScript箭头函数全解析箭头函数的基本语法简洁语法特性隐式返回值对象字面量返回 词法绑定的this不适用箭头函数的场景对象方法构造函数DOM事件处理 高级用法在数组方法中的应用链式调用柯里化函数 性能考量1. 作为回调函数时减少创建闭包的开销2. 简化代码结构&am…...
数据对象:DTO、DO、PO和 BO的区别和关系
在Java开发中,DTO(Data Transfer Object)、DO(Domain Object)、PO(Persistent Object)和BO(Business Object)是常用的数据对象概念,下面为你详细介绍并给出简…...
Java内存模型详解:堆、栈、方法区
1. 堆(Heap) 作用:存放所有对象实例及数组,是垃圾回收的主要区域。 结构: 新生代(Young Generation): Eden区:新创建的对象首先分配在此。 Survivor区(From…...
ubuntu 20.04 编译运行LeGo_LOAM 跑数据集 并且保存pcl文件
1.搭建文件目录,clone代码,编译 mkdir -p Lego_LOAM/src cd Lego_LOAM/src git clone https://github.com/RobustFieldAutonomyLab/LeGO-LOAM.git cd .. catkin_make -j1 错误1:: fatal error: opencv/cv.h: 没有那个文件或目录 13 | #include <opencv/cv.h…...
CMake使用教程
CMake是开源、跨平台的构建工具,可以让我们通过编写简单的配置文件去生成本地的Makefile,这个配置文件是独立于运行平台和编译器的,这样就不用亲自去编写Makefile了,而且配置文件可以直接拿到其它平台上使用,无需修改,非常方便。 使用命令行执行CMakeLists.txt,对文件进…...
快速上手Linux进程管理
一.理解进程和线程 1.1 什么是进程 它表示一个正在执行的程序实例。在操作系统中,进程是系统进行资源分配和调度的基本单位。每个进程都有自己独立的内存空间、代码、数据和系统资源,如打开的文件、使用的硬件设备等。 进程的主要特点包括:…...
pytorch框架实现cnn四种天气图片多分类问题-添加dropout和bn层
目录 1.导包 2.加载数据、拼接训练、测试文件夹 3. 查看当前目录下的所有文件名,以列表的形式输出 4.原数据集dataset中存在的数据的目标类别 5.创建train和test目录 及其需要分类的子文件夹 6.使用torchvision 的transforms进行数据预处理 6.1数据统一缩放resize、To…...
swift-11-init、deinit、可选链、协议、元类型
一、required 二、属性观察器 三、可失败初始化器 可以用init!定义隐式解包的可失败初始化器 可失败初始化器可以调用非可失败初始化器,非可失败初始化器调用可失败初始化器需要进行解包 如果初始化器调用一个可失败初始化器导致初始化失败 ,那么整个初…...
【力扣hot100题】(062)搜索插入位置
感觉自己对二分法还是没有很好掌握,主要在于边界问题,只会基本的搜索,如果要搜索比目标值大的第一个索引或者比目标值小的最后一个索引(或者换一些花里胡哨的题目)就完全不会了。 class Solution { public:int search…...
TCPIP详解 卷1协议 三 链路层
3.1——以太网和IEEE802局域网/城域网标准 以太网这个术语通常指一套标准,由DEC,Intel公司和Xerox公司在1980年首次发布,并在1982年加以修订。第一个常见格式的以太网,目前被称为10Mb/s以太网或共享以太网。它被IEEE采纳为802.3标…...
以太网安全
前言: 端口隔离可实现同一VLAN内端口之间的隔离。用户只需要将端口加入到隔离组中,就可以实现隔离组内端口之间的二层数据的隔离端口安全是一种在交换机接入层实施的安全机制,旨在通过控制端口的MAC地址学习行为,确保仅授权设备能…...
linux如何查看当前系统的资源占用情况
在 Linux 系统中,有多个命令可以查看当前系统的资源占用情况。以下是一些常用的命令及其说明: 1. 查看内存使用情况:free free -h-h 参数表示以人类可读的格式显示(如 MB, GB)。输出示例: to…...
人脸识别系统(人脸识别、前后端交互、Python项目)
基于Flask、Face_Recognition的人脸识别系统 项目介绍 基于flask、face_recognition的人脸识别系统。 本项目采用Face_Recognition库内置的ResNet-34预训练模型,其已对LFW公开数据集进行预训练而得到的模型。利用ResNet-34预训练模型,可使用少量已知人…...
2025 ArkTS语言开发入门之前言(二)
2025 ArkTS语言开发入门之前言(二) 前言 在上一节,咱们学习了如何下载并安装ArkTS的集成开发环境,这时候有的臭宝会发现,左边的这些叽里咕噜的是什么?下面,我来带着臭宝们来学习一下这些是什么…...
VLAN(虚拟局域网)
一、vlan概述 VLAN(virtual local area network)是一种通过逻辑方式划分网络的技术,允许将一个物理网络划分为多个独立的虚拟网络。每一个vlan是一个广播域,不同vlan之间的通信需要通过路由器或三层交换机 [!注意] vlan是交换机独有的技术,P…...
2025.4.6总结
今日记录:今天玩的有些累,先是去护肤店护理了脸部,然后去汉口江滩那看了看美景,吹吹江风。节假日去玩,光是挤一个半小时地铁都感觉累。还好上下班期间不用挤地铁,不然还真受不了。 假期小结 1.消费&#…...
【清明折柳】写在扬马三周目后
黄绿之间,方寸之外。 文章目录 楔子解耦到离散螃蟹与毒药文本的力量朝花夕拾后记 楔子 “——就像物理学家通过演绎与归纳将宏微世界的运转规律浓缩到数学公式中时,如今的人工智能也在试图量化整个人类文明。” “——只是,使用的是昂贵、笨…...