JSON-RPC-CXX深度解析:C++中的远程调用利器
一、引言
1. JSON-RPC 简介及其在 C++ 开发中的重要性
JSON-RPC(JavaScript Object Notation - Remote Procedure Call)是一种基于 JSON 格式的远程过程调用协议。在 C++ 开发中,它扮演着至关重要的角色。随着软件系统的日益复杂和分布式架构的广泛应用,高效的远程过程调用成为构建强大应用程序的关键。JSON-RPC 以其简洁的 JSON 数据格式,使得不同的系统之间可以轻松地进行通信,而无需关心底层的网络细节和数据传输方式。
在 C++ 开发中,JSON-RPC 为开发者提供了一种跨平台、高效且灵活的远程调用解决方案。它允许 C++ 程序与其他语言编写的程序进行无缝交互,促进了多语言环境下的软件开发。同时,JSON-RPC 的轻量级特性使其在资源受限的环境中也能表现出色,适用于各种类型的 C++ 项目,从嵌入式系统到高性能服务器应用。
2. 引入 json-rpc-cxx 库的独特价值
json-rpc-cxx 库作为一个开源的 C++ 实现,为 C++ 开发者带来了诸多独特价值。首先,它严格遵循 JSON-RPC 协议,确保了与其他符合该协议的系统的兼容性。该库提供了丰富的功能,方便地定义可远程调用的函数,处理客户端和服务器之间的 JSON 数据序列化和反序列化,以及支持多种网络传输方式或可与其他网络库集成。
json-rpc-cxx 库的跨平台兼容性也是其一大优势。无论是在 Windows、Linux 还是 OSX 上,都能无缝运行,为开发者提供了极大的便利。此外,它利用了流行的 nlohmann::json 库,确保了数据处理的高效性和便捷性。同时,该库的设计充分考虑了类型安全和编译时错误检查,减少了运行时问题,提升了开发效率。
- json-rpc-cxx 开源库链接
二、JSON-RPC-CXX 库概述
1. 严格遵循 JSON-RPC 协议,实现跨网络通信
json-rpc-cxx 库严格遵循 JSON-RPC 2.0 规范,确保了在不同的网络环境下,客户端和服务器能够进行稳定且高效的通信。通过使用 JSON 格式作为数据交换格式,它克服了不同编程语言和系统之间的差异,使得跨网络通信变得轻而易举。
JSON-RPC 协议定义了一种简洁而有效的方式来进行远程过程调用。在 json-rpc-cxx 库的实现中,客户端可以通过发送包含方法名和参数的 JSON 请求,向服务器发起远程调用。服务器接收到请求后,解析 JSON 数据,执行相应的方法,并将结果以 JSON 格式返回给客户端。这种方式不仅使得通信过程清晰明了,而且易于理解和调试。
2. 丰富功能列举
- 方便定义远程调用函数:json-rpc-cxx 库提供了简洁的接口,使得开发者可以轻松地定义可远程调用的函数。通过继承 jsonrpccxx::JsonRpcServer 类,并使用 BindMethod 函数,开发者可以将 C++ 的函数绑定为远程可调用的方法。例如,可以像这样定义一个加法函数:
BindMethod("add", [](int num1, int num2) { return num1 + num2; });
。这种方式使得 C++ 程序中的函数可以被其他系统通过网络远程调用,极大地提高了程序的可扩展性和灵活性。 - 处理 JSON 数据序列化反序列化:该库利用流行的 nlohmann::json 库,高效地处理 JSON 数据的序列化和反序列化。在客户端和服务器之间进行通信时,需要将数据转换为 JSON 格式进行传输。json-rpc-cxx 库能够自动地将 C++ 的数据类型转换为 JSON 格式,并在接收到 JSON 数据时,将其反序列化为 C++ 的数据类型。这样,开发者无需手动处理数据的转换过程,大大提高了开发效率。
- 支持多种网络传输方式:json-rpc-cxx 库具有很强的灵活性,支持多种网络传输方式。它可以与不同的网络库集成,如 HTTP、WebSocket 等。这使得开发者可以根据具体的应用场景选择最适合的网络传输方式。例如,在需要实时通信的场景下,可以选择 WebSocket 传输方式;而在传统的基于请求 - 响应的场景下,HTTP 可能是更好的选择。这种灵活性使得 json-rpc-cxx 库能够适应各种不同的网络环境和应用需求。
三、服务器端应用
在构建基于json-rpc-cxx
库的服务器端应用时,我们需要关注几个关键步骤:创建服务器、定义服务方法以及启动服务器。下面将详细介绍这些步骤。
(一)创建服务器
包含必要头文件及作用介绍
在服务器端代码中,包含的头文件如jsonrpccxx/server.h
和jsonrpccxx/server_connector.h
起着至关重要的作用。
jsonrpccxx/server.h
:提供了创建服务器的类和相关函数,使我们能够构建一个JSON-RPC服务器实例,以监听客户端的请求并进行相应的处理。jsonrpccxx/server_connector.h
:提供了服务器连接相关的类和函数,用于实现服务器与客户端之间的连接管理。
以HttpServer为例创建服务器实例,监听指定端口
json-rpc-cxx
库提供了不同类型的服务器类,以HttpServer
为例,我们可以在特定端口创建服务器实例。假设我们要在端口8080创建服务器,可以使用以下代码:
jsonrpccxx::HttpServer httpServer(8080);
这样就创建了一个基于HTTP协议监听在8080端口的服务器对象,等待客户端的连接和请求。
(二)定义服务方法
创建继承JsonRpcServer的类,用于定义可被客户端调用的方法
为了定义可被客户端调用的方法,我们可以创建一个继承自jsonrpccxx::JsonRpcServer
的类。这个类可以封装特定的业务逻辑,并将其暴露为远程可调用的方法。
通过BindMethod函数绑定具体方法,如加法函数示例
在继承自jsonrpccxx::JsonRpcServer
的类中,我们可以使用BindMethod
函数将C++的函数绑定到特定的方法名上。例如,定义一个加法函数并绑定到名为add
的方法上,可以这样实现:
BindMethod("add", [](int num1, int num2) { return num1 + num2; });
这样,当客户端通过JSON-RPC请求调用add
方法时,服务器将执行这个加法函数并返回结果。
(三)启动服务器
在main函数中启动服务器并保持运行的逻辑
在main
函数中,我们可以启动服务器并使其保持运行,以持续监听客户端的请求。
- 创建服务器实例和服务类实例
jsonrpccxx::HttpServerConnector serverConnector(8080);
MyService service(serverConnector);
- 调用StartListening启动服务器监听
service.StartListening();
std::cout << "Server started on port 8080." << std::endl;
当调用StartListening
函数后,服务器会进入监听状态,等待客户端的连接和请求。一旦有请求到达,服务器会根据请求的方法名和参数执行相应的方法,并将结果返回给客户端。
- 保持服务器运行
为了保持服务器运行,可以使用一个循环,例如while (true) {}
。这个循环只是一个简单的示例,在实际应用中,可能需要更好的服务器运行管理逻辑,比如使用信号处理来优雅地停止服务器。
- StartListening和StopListening函数的作用
StartListening
:启动服务器的监听,使服务器开始接收客户端的请求。StopListening
:停止服务器的监听。在服务器运行过程中,如果需要停止服务器,可以调用这个函数来释放资源并结束服务器进程。
服务端示例
以下是使用json-rpc-cxx
库创建服务器的详细代码示例:
#include <iostream>
#include "jsonrpccxx/server.h"
#include "jsonrpccxx/server_connector.h"
#include "jsonrpccxx/http_server_connector.h"class MyService : public jsonrpccxx::JsonRpcServer
{
public:MyService(jsonrpccxx::ServerConnector& serverConnector): jsonrpccxx::JsonRpcServer(serverConnector){BindMethod("add", [](int num1, int num2) {return num1 + num2;});}
};int main()
{jsonrpccxx::HttpServerConnector serverConnector(8080);MyService service(serverConnector);service.StartListening();std::cout << "Server started on port 8080." << std::endl;while (true) {}service.StopListening();return 0;
}
在这个示例中,我们创建了一个基于HTTP的服务器,定义了一个名为add
的远程方法,该方法接受两个整数参数并返回它们的和。服务器启动后会一直运行,直到程序被手动终止。
四、客户端应用
在 JSON-RPC 通信中,客户端应用负责发起请求并处理服务器的响应。以下是如何使用 json-rpc-cxx
库来创建客户端应用并调用服务器上的远程方法的详细步骤。
(一)创建客户端连接
包含客户端所需头文件
在客户端代码中,首先需要包含必要的头文件。这些头文件提供了创建客户端和处理客户端连接相关功能的类和函数。
#include "jsonrpccxx/client.h"
#include "jsonrpccxx/client_connector.h"
#include "jsonrpccxx/http_client_connector.h"
jsonrpccxx/client.h
包含了客户端的主要实现类,如jsonrpccxx::JsonRpcClient
,用于发起远程过程调用。jsonrpccxx/client_connector.h
提供了客户端连接的相关类,用于建立与服务器的连接。jsonrpccxx/http_client_connector.h
是具体的 HTTP 客户端连接器实现。
以 HttpClient 创建连接对象,指向服务器地址
接下来,使用 HttpClient
创建客户端连接对象。假设服务器在本地运行且监听在端口 8080,可以使用以下代码创建连接对象:
jsonrpccxx::HttpClientConnector client("http://127.0.0.1:8080");
这里创建了一个指向本地 8080 端口的 HTTP 客户端连接对象,为后续创建 JSON-RPC 客户端实例和调用远程方法提供了基础。
(二)创建 JSON-RPC 客户端实例
使用创建好的客户端连接对象,可以创建 jsonrpccxx::JsonRpcClient
实例:
jsonrpccxx::JsonRpcClient rpcClient(client);
这个实例将用于调用服务器上的远程方法。通过这个实例,客户端可以发起 JSON-RPC 请求,将方法名和参数发送给服务器,并接收服务器返回的结果。
(三)调用远程方法
通过 CallMethod 函数调用服务器方法,处理可能的异常
通过 rpcClient
可以调用服务器上的方法。例如,调用 add
方法:
try
{int result = rpcClient.CallMethod<int>("add", 3, 4);std::cout << "Result of add: " << result << std::endl;
}
catch (const jsonrpccxx::JsonRpcException& e)
{std::cerr << "JSON-RPC Exception: " << e.what() << std::endl;
}
在上述代码中,CallMethod
函数用于调用服务器上的方法。它的模板参数指定了返回值类型,第一个参数是要调用的方法名称,后面的参数是传递给方法的参数。这里调用 add
方法并传递 3
和 4
作为参数。如果调用过程中出现 JSON-RPC 相关的异常,会被 catch
块捕获并输出错误信息。
客户端示例
以下是使用 json-rpc-cxx
库创建 HTTP 客户端的详细代码示例:
#include <iostream>
#include "jsonrpccxx/client.h"
#include "jsonrpccxx/client_connector.h"
#include "jsonrpccxx/http_client_connector.h"int main()
{// 创建 HTTP 客户端连接对象,连接到服务器(假设服务器在本地,端口为 8080)jsonrpccxx::HttpClientConnector client("http://127.0.0.1:8080");// 创建 JSON-RPC 客户端实例jsonrpccxx::JsonRpcClient rpcClient(client);try{// 调用服务器上的某个方法,这里假设服务器有一个名为 'add' 的方法,接受两个整数参数int result = rpcClient.CallMethod<int>("add", 3, 4);std::cout << "Result of add: " << result << std::endl;}catch (const jsonrpccxx::JsonRpcException& e){std::cerr << "JSON-RPC Exception: " << e.what() << std::endl;}return 0;
}
在这个示例中,客户端连接到本地运行在 8080 端口的 HTTP 服务器,并调用服务器上定义的 add
方法,传入两个参数 3
和 4
,然后输出结果。如果调用过程中出现 JSON-RPC 相关的异常,会被捕获并输出错误信息。
五、错误处理
在分布式应用程序中,错误处理是确保系统稳定和可靠性的关键。无论是服务器端还是客户端,都需要对可能出现的错误进行细致处理。以下是如何在 JSON-RPC 应用程序中进行错误处理的详细指南。
(一)服务器端错误处理
方法内部对可能错误的处理
在服务器端方法内部,对可能出现的错误进行细致处理是确保系统稳定的关键。以除法运算为例,当方法涉及到可能出现除数为 0 的情况时,需要进行特别处理。
class MyService : public jsonrpccxx::JsonRpcServer
{
public:MyService(jsonrpccxx::ServerConnector& serverConnector): jsonrpccxx::JsonRpcServer(serverConnector){BindMethod("divide", [](int num1, int num2) {try {if (num2 == 0) {throw std::runtime_error("Division by zero");}return num1 / num2;} catch (const std::exception& e) {// 将异常信息作为错误消息返回给客户端return std::string("Error: ") + e.what();}});}
};
在上述代码中,divide
方法通过 try-catch
块进行异常处理。如果除数为 0,会抛出 std::runtime_error
异常,并在 catch
块中将错误信息以字符串形式返回给客户端。
设置全局异常处理函数
除了在方法内部处理错误,设置全局异常处理函数可以进一步增强服务器的稳定性。
class MyService : public jsonrpccxx::JsonRpcServer
{
public:MyService(jsonrpccxx::ServerConnector& serverConnector): jsonrpccxx::JsonRpcServer(serverConnector){// 设置全局异常处理函数SetExceptionHandler([](const std::exception& e) {return std::string("Internal server error: ") + e.what();});BindMethod("divide", [](int num1, int num2) {if (num2 == 0) {throw std::runtime_error("Division by zero");}return num1 / num2;});}
};
这里设置的全局异常处理函数,在捕获到未在方法内部处理的异常时,会将错误信息以特定格式返回给客户端。这样,即使某个方法没有正确处理异常,也能通过全局异常处理函数向客户端返回有意义的错误信息。
(二)客户端错误处理
使用 try-catch 块捕获 JsonRpcException 异常
在客户端调用远程方法时,使用 try-catch
块捕获 jsonrpccxx::JsonRpcException
异常是一种良好的编程习惯。
try {// 调用远程方法的代码
} catch (const jsonrpccxx::JsonRpcException& e) {std::cerr << "JSON-RPC Exception: " << e.what() << std::endl;// 可以根据错误码进行更详细的处理if (e.Code() == -32602) {std::cerr << "Invalid parameters." << std::endl;} else if (e.Code() == -32603) {std::cerr << "Internal error." << std::endl;}
} catch (const std::exception& e) {std::cerr << "Standard Exception: " << e.what() << std::endl;
}
在上述代码中,当捕获到 JsonRpcException
异常时,首先输出异常信息。然后,根据异常中的错误码进行更详细的错误处理。通过这种方式,可以更准确地定位和处理客户端在调用远程方法时出现的问题。
同时捕获标准异常处理其他问题
除了捕获 JsonRpcException
异常,还需要捕获其他可能的标准异常,以处理网络连接等其他问题。例如,在上述代码中,同时捕获了 std::exception
异常。这样,当出现其他未知的异常情况时,也能进行适当的处理。
六、总结
JSON-RPC 库,尤其是 json-rpc-cxx
,在构建分布式应用程序中展现出诸多优势。以下是对 JSON-RPC 库优势的总结以及实际应用中的扩展方向。
1. JSON-RPC 库的优势
- 高效便捷的远程过程调用:JSON-RPC 库提供了高效且便捷的远程过程调用方式,使得不同节点之间的通信变得简单而直接。
- 跨平台兼容性:
json-rpc-cxx
在 Windows、Linux 和 OSX 上都能无缝运行,提高了开发效率和应用的可移植性。 - 出色的数据处理能力:利用流行的
nlohmann::json
库,高效地处理 JSON 数据的序列化和反序列化,确保了数据在网络传输中的准确性和高效性。 - 丰富的功能和灵活的选择:支持多种网络传输方式,为不同的应用场景提供了灵活的选择。
- 全面的错误处理机制:服务器端和客户端都可以进行详细的错误处理,提高了系统的稳定性和可维护性。
2. 实际应用中的扩展方向
- 添加更多复杂的远程方法:根据项目需求,添加更多复杂的远程方法以满足不同的业务需求。
- 优化性能:通过调整网络传输参数、优化数据处理算法等方式,提高系统的响应速度和吞吐量。
- 实现安全机制:添加身份验证和授权机制,确保只有合法的用户才能访问特定的远程方法。加密通信也是提高系统安全性的重要手段。
3. 利用文档和示例代码的重要性
- 文档的重要性:文档提供了详细的使用说明和功能介绍,帮助开发者快速上手并深入理解库的功能特点。
- 示例代码的重要性:示例代码展示了具体的应用场景和使用方法,为开发者提供了实际的参考。通过深入研究文档和示例代码,开发者可以更好地掌握库的使用技巧,避免常见的错误,提高开发效率。
相关文章:

JSON-RPC-CXX深度解析:C++中的远程调用利器
一、引言 1. JSON-RPC 简介及其在 C 开发中的重要性 JSON-RPC(JavaScript Object Notation - Remote Procedure Call)是一种基于 JSON 格式的远程过程调用协议。在 C 开发中,它扮演着至关重要的角色。随着软件系统的日益复杂和分布式架构的…...

【后端速成Vue】模拟实现翻译功能
前言: 本期将会介绍 Vue 中的 watch 侦听器,它语法是怎么样的呢?具有怎样的功能呢?最后用模拟实现百度翻译来更进一步练习 watch 侦听器 篮球哥找工作专属IT岗位内部推荐: 专属内推链接:内推通道 1、认识翻…...

人脸识别技术:从算法到深度学习的全面解析
一、人脸识别技术综述 人脸识别技术作为一种重要的生物识别技术,在当今社会中具有举足轻重的地位。它广泛应用于各个领域,如金融领域的实名认证、安保领域的门禁系统、通行领域的火车站和地铁站检票、泛娱乐领域的美颜相机和短视频特效处理、公安和司法…...

WPF学习之路,控件的只读、是否可以、是否可见属性控制
C#的控件学习之控件属性操作 控件的只读、是否可以、是否可见,是三个重要的参数,在很多表单、列表中都有用到,正常表单控制可以在父层主键控制参数是否可以编辑和可见,但是遇到个别字段需要单独控制时,可以在初始化wi…...

植物神经紊乱不用怕,科学锻炼助你找回平衡✨
在这个快节奏、高压力的时代,你是否经常感到身心疲惫,情绪波动大,甚至偶尔还会出现心慌、失眠、消化不良等症状?这些可能都是植物神经功能紊乱在作祟!😱别担心,今天就来聊聊如何通过科学锻炼&am…...

shell 100例
1、每天写一个文件 (题目要求) 请按照这样的日期格式(xxxx-xx-xx每日生成一个文件 例如生成的文件为2017-12-20.log,并且把磁盘的使用情况写到到这个文件中不用考虑cron,仅仅写脚本即可 [核心要点] date命令用法 df命令 知识补充࿱…...

CSS教程(二)- CSS选择器
1. 作用 匹配文档中的某些元素为其应用样式。根据不同需求把不同的标签选出来。 2. 分类 分类 基础选择器 包含 标签选择器、ID选择器、类选择器、通用选择器等 复合选择器 包含 后代选择器、子代选择器、伪类选择器等 1 标签选择器 介绍 又称为元素选择器,根…...

Ubuntu20.04 解决一段时间后键盘卡死 输入延迟很大的问题 ubuntu
Ubuntu20.04 解决一段时间后键盘卡死 输入延迟很大的问题 为了确保您能顺利通过双击快捷方式来重启 IBus,下面详细描述了从脚本创建到快捷方式设置的每一步,包括具体的命令行操作和必要的说明,以确保您能够按步骤成功执行。 步骤 1: 创建并…...

http(s)接口设计注意事项
http(s)在设计时应考虑: 一、签名认证 鉴权,如jwt方式等。 二、重要参数加密 如:用户的登录密码、银行卡号、转账金额、用户身份证等。 三、IP白名单 为了进一步加强API接口的安全性,防止接口的签名或者加密被破解了&#x…...

Font Awesome Web 应用图标
Font Awesome Web 应用图标 引言 在当今的数字时代,图标在Web应用中扮演着至关重要的角色。它们不仅增强了用户界面的视觉吸引力,而且还提高了用户体验和互动性。Font Awesome是一个广受欢迎的图标库,它为开发人员提供了一系列高质量的图标,可以轻松地集成到Web应用中。本…...

bridge-vlan
# 1.topo # 2.创建命名空间 ip netns add ns0 ip netns add ns1 ip netns add ns2 ip netns add ns3 # 3.创建veth设备 ip link add ns0-veth0 type veth peer name hn0-veth0 ip link add ns1-veth0 type veth peer name hn1-veth0 ip link add ns2-veth0 type veth pe…...

【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
MySQL与Oracle一样都是通过逻辑存储结构来管理物理存储结构,即管理硬盘上存储的各种文件。下面将详细介绍InnoDB存储引擎中的数据文件和重做日志文件。 一、数据文件 “.ibd”文件和ibdata文件 这两种文件都是存放Innodb数据的文件,之所以有两种文件来…...

华为云前台展示公网访问需要购买EIP,EIP流量走向
华为云前台网络(VPC,安全组,EIP) 1.EIP网段是从哪里划分的? 管理员在后台Service_OM已设置 Service_OM-网络资源-外部网络-创建外部网络基本信息:配置参数:*名称 public*网络类型 LOCAL 不带标签 类似开…...

排序算法 -插入排序
文章目录 1.插入排序(Insertion Sort)1.1 简介1.2 插入排序的步骤1.3 插入排序的C实现1.4 插入排序的时间复杂度1.5 插入排序的空间复杂度1.6 插入排序的动画 2. 二分插入排序(Binary Insertion Sort)2.1 简介2.2 二分插入排序步骤…...

如何使用.bat实现电脑自动重启?
1、在电脑桌面新建一个记事本文档,将如下内容写进去: echo off shutdown /r /t 02、然后,保存一下,再把桌面此文件重命名为电脑重启.bat 3、双击此程序,可以立刻重启电脑。 PS:① 此程序会不保存任何当前…...

使用VSCode远程连接服务器并解决Neo4j无法登陆问题
摘要:本文介绍了如何通过VSCode连接内网部署的Neo4j服务器,并启动服务。在访问Neo4j登录界面时,遇到了端口映射问题导致无法登录。通过手动添加7687端口的映射后,成功登录Neo4j。 我在内网部署了一台服务器,并在其上运…...

使用React和Vite构建一个AirBnb Experiences克隆网站
这一篇文章中,我会教你如何做一个AirBnb Experiences的克隆网站。主要涵盖React中Props的使用。 克隆网站最终呈现的效果: 1. 使用vite构建基础框架 npm create vitelatestcd airbnb-project npm install npm run dev2. 构建网站的3个部分 网站从上…...

HBase压测 ycsb
## ycsb 导入数据 rootXX.14.40.1971、对portrait压测 ansible hadoop -i hosts_hbase_portrait_20230730.txt -m shell -a "hostname && chdir/data/workspace/ycsb-0.17.0 nohup bin/ycsb load hbase20 -P workloads/workload_insert -cp /usr/local/fqlhadoop/…...

基于Python+Django+Vue3+MySQL实现的前后端分类的商场车辆管理系统
项目名称:基于PythonDjangoVue3MySQL实现的前后端分离商场车辆管理系统 技术栈 开发工具:PyCharm、Visual Studio Code (VSCode)运行环境:Python 3.10、MySQL 8.0、Node.js 18技术框架:Django 5、Vue 3.4、Ant-Design-Vue 4.12 …...

网络安全web基础_HTML基础(扫盲篇)
web基础_HTML扫盲篇 一、什么是 HTML? 二、HTML 的基本特点 三、HTML 基本结构概述 1.文档声明(!DOCTYPE html) 2. html元素 3. head元素 4. body 元素 四、HTML5的主要标签清单 文档结构标签 文本内容标签 链接和锚点标签 表格标…...

(附项目源码)Java开发语言,监督管家APP的设计与实现 58,计算机毕设程序开发+文案(LW+PPT)
摘要 随着互联网的快速发展和智能手机的普及,越来越多的用户选择通过移动应用程序进行事项设定、提醒通知和事项打卡。监督管家APP作为一个专注于事项设定、提醒通知、事项打卡的监督管理平台,具有广泛的应用前景和商业价值。本研究旨在构建一个功能丰富…...

前端基础的讲解-JS(11)
对象 对象是什么? 在 JavaScript 中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,所有的数据类型都可以存放在内。 属性:即事物的特征,在对象中用属性来表示(常用名词…...

Python魔法方法深度解析:解密__call__、__new__和__del__的核心奥义
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! Python中的魔法方法(Magic Methods)是构建Python高级功能的基础,它们使得对象可以…...

当微软windows的记事本被AI加持
1985年,微软发布了Windows 1.0,推出了一款革命性的产品:记事本(Notepad)。这款软件旨在鼓励使用一种未来主义的新设备——鼠标,并让人们可以不依赖VI等键盘工具就能书写文本和编写代码。记事本因其简洁和高…...

Python酷库之旅-第三方库Pandas(213)
目录 一、用法精讲 996、pandas.DatetimeIndex.day属性 996-1、语法 996-2、参数 996-3、功能 996-4、返回值 996-5、说明 996-6、用法 996-6-1、数据准备 996-6-2、代码示例 996-6-3、结果输出 997、pandas.DatetimeIndex.hour属性 997-1、语法 997-2、参数 99…...

普林斯顿:LLM基于边际优化的梯度纠缠
📖标题:A Common Pitfall of Margin-based Language Model Alignment: Gradient Entanglement 🌐来源:arXiv, 2410.13828 🌟摘要 🔸从人类反馈中强化学习(RLHF)已成为对齐语言模型…...

通俗易懂:什么是 Java 类加载?
文章目录 类加载过程的三个阶段一个简单的案例:类加载的工作原理使用这个类类加载的顺序类加载的特点类加载的好处总结推荐阅读文章 在 Java 中, 类加载是一种将我们写的 Java 类文件加载到内存中的过程,让 JVM(Java 虚拟机&…...

Dijkstra 算法的实现方案
下面是一个基于 Dijkstra 算法的实现方案,能够在 DEM(数字高程模型)数据上进行寻路,并满足以下需求: 使用 Qt C++ 编写; 规避 DEM 中的障碍物; 支持指定起点和终点; 使用 GDAL 库读取 DEM 文件; 输出路径到 TXT 文件; 输出的坐标为地理坐标(例如经纬度),而不是像…...

OpenGL 进阶系列07 - 阴影贴图(shadowmap )
一:概述: 在 OpenGL 中,Shadow Mapping(阴影贴图)是一种常用的实时阴影技术,用于渲染物体的阴影效果。这种方法通过生成光源视角下的深度贴图,再在场景渲染时使用它来判断物体是否被遮挡,从而实现阴影效果。下面是实现 Shadow Mapping 的基本步骤和相关知识。 二:绘制…...

【CAN介绍】【第一篇章】
1. CAN简介 • CAN 总线( Controller Area Network Bus )控制器局域网总线 • CAN 总线是由 BOSCH 公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线,广泛应用于汽车、嵌入式、工业控制等领域 • CAN 总线特征࿱…...