当前位置: 首页 > article >正文

【ProtoBuf 实战训练】网络版通讯录

文章目录1. 通讯录 4.0 实现网络版2. 环境搭建2.1 搭建服务端2.2 搭建客户端2.3 运行结果3. 新增联系人功能3.1 协议约定3.2 协议接口定义 (.proto)3.2.1 AddContactRequest请求消息3.2.2 AddContactResponse响应消息3.3 完成客户端代码3.3.1 菜单函数实现3.3.2 main 函数实现3.3.3 addContact 函数3.3.4 buildAddContactRequest 函数3.4 完成服务端代码3.4.1 main 函数实现3.4.2 生成 uid3.4.3 辅助功能说明4. 功能演示5. 总结1. 通讯录 4.0 实现网络版Protobuf 还常用于通讯协议、服务端数据交换场景。那么在这个示例中我们将实现一个网络版本的通讯录模拟实现客户端与服务端的交互通过 Protobuf 来实现各端之间的协议序列化。需求如下客户端可以选择对通讯录进行以下操作新增一个联系人删除一个联系人查询通讯录列表查询一个联系人的详细信息服务端提供增删查能力并需要持久化通讯录。客户端、服务端间的交互数据使用 Protobuf 来完成。2. 环境搭建Httplib 库cpp-httplib 是个开源的库并且是用 C 封装的 http 库使用这个库可以在 linux、windows 平台下完成 http 客户端、http 服务端的搭建。使用起来非常方便只需要包含头文件httplib.h即可。编译程序时需要带上-lpthread选项。源码库地址cpp-httplib直接把 httplib.h 这个文件复制到服务器上即可。另外如果使用 centOS 环境yum 源带的 g 最新版本是 4.8.5发布于 2015 年年代久远。那么使用最新版本的 cpp-httplib 编译该项目会出现异常。所以必须将 gcc/g 升级为更高版本可解决问题。# 安装gcc 8版本yuminstall-ydevtoolset-8-gcc devtoolset-8-gcc-c# 启用版本source/opt/rh/devtoolset-8/enable# 查看版本已经变成gcc 8.3.1gcc-v下面是一个简单的服务端和客户端 Demo 示例主要是演示一下 cpp-httplib 库是如何使用的。代码结构如下2.1 搭建服务端先编写服务端的主函数代码#includeiostream#includehttplib.husingstd::cout;usingstd::endl;usingstd::cerr;usingnamespacehttplib;intmain(){cout-----------服务启动----------endl;Server server;server.Post(/test-post,[](constRequestreq,Responseres){cout接收到post请求!endl;res.status200;});server.Get(/test-get,[](constRequestreq,Responseres){cout接收到get请求!endl;res.status200;});// 绑定 8123 端口并且将端口号对外开放server.listen(0.0.0.0,8123);return0;}再编写 makefileservice:*.cc g-o$$^-stdc11-lpthread-lprotobuf.PHONY:clean clean:rm-fservice2.2 搭建客户端先编写客户端的主函数代码#includeiostream#includehttplib.husingnamespacestd;usingnamespacehttplib;#defineCONTACTS_HOST172.19.61.204#defineCONTACTS_PORT8123intmain(){Clientcli(CONTACTS_HOST,CONTACTS_PORT);Result res1cli.Post(/test-post);if(res1-status200){cout调用post成功!endl;}Result res2cli.Get(/test-get);if(res2-status200){cout调用get成功!endl;}return0;}再编写 makefileservice:*.cc g-o$$^-stdc11-lpthread-lprotobuf.PHONY:clean clean:rm-fservice2.3 运行结果编译运行的结果如下以上就是 httplib 库的一个基本用法。3. 新增联系人功能在本篇文章中我们只针对【新增一个联系人】这个功能进行实现完整代码可以移步到代码仓库。3.1 协议约定对于新增一个联系人我们在 Client 客户端需要发起 POST 请求调用。格式如下[请求]Post/contacts/add AddContactRequest Content-Type:application/protobuf同时在服务端需要进行响应格式如下[响应]AddContactResponse Content-Type:application/protobuf3.2 协议接口定义 (.proto)接着开始编写 .proto 文件客户端和服务器一样这份.proto文件是定义客户端和服务端通信协议的 “合同”。它规定了数据将以什么样的格式进行打包和传输。3.2.1 AddContactRequest请求消息用于封装新增联系人的完整信息name (string)映射为 C 中的std::string。age (int32)映射为 C 中的int。Phone (嵌套消息)定义了电话详情包含号码number和枚举type。PhoneType (枚举)包含MP(0, 移动电话) 和TEL(1, 固定电话)。repeated Phone表示一个动态数组列表在 C 代码中通过add_phone()动态增加条目通过phone_size()获取数量。代码如下所示syntax proto3; package add_contact; message AddContactRequest { string name 1; // 姓名 int32 age 2; // 年龄 message Phone { string number 1; enum PhoneType { MP 0; // 移动电话 TEL 1; // 固定电话 } PhoneType type 2; } repeated Phone phone 3; // 电话信息 }3.2.2 AddContactResponse响应消息用于服务端向客户端反馈执行结果success (bool)标识服务器业务处理是否成功。error_desc (string)当success为false时存储具体的报错信息如反序列化失败。uid (string)业务成功后返回服务端生成的唯一标识符。代码如下syntax proto3; package add_contact; message AddContactResponse { bool success 1; // 服务调用是否成功 string error_desc 2; // 错误原因 string uid 3; }3.3 完成客户端代码3.3.1 菜单函数实现功能描述该函数是一个纯显示型的辅助函数负责在终端界面输出美化后的操作菜单。实现要点用户引导清晰地列出了当前通讯录系统支持的五大功能选项新增、删除、查看列表、查看详情、退出。交互边界定义了合法输入的范围0-4为 main 函数中的逻辑判断提供视觉依据。代码如下所示voidmenu(){std::cout-----------------------------------------------------std::endl--------------- 请选择对通讯录的操作 ----------------std::endl------------------ 1、新增联系人 --------------------std::endl------------------ 2、删除联系人 --------------------std::endl------------------ 3、查看联系人列表 ----------------std::endl------------------ 4、查看联系人详细信息 ------------std::endl------------------ 0、退出 --------------------------std::endl-----------------------------------------------------std::endl;}3.3.2 main 函数实现功能描述客户端的逻辑控制中心负责驱动主循环、分发用户指令并处理全局异常。核心逻辑语义化选项通过枚举 OPTION 将数字输入0 - 4映射为具体业务如 ADD、QUIT提高代码可读性。交互循环使用 while(true) 配合 menu() 持续显示菜单直到用户输入 0 触发 return 0 退出。缓冲区清理在 cin choose 后立即执行 cin.ignore()防止残留的换行符干扰后续的字符串输入。统一容错通过 try-catch 捕获整个业务流中的 ContactsException。这样即便网络或序列化出错程序也能打印错误并安全返回主菜单不会直接崩溃。代码如下// 自定义异常类classContactsException{private:std::string message;public:ContactsException(std::string strA problem):message(str){}std::stringwhat()const{returnmessage;}};intmain(){enumOPTION{QUIT0,ADD,DEL,FIND_ALL,FIND_ONE};while(true){menu();cout---请选择;intchoose;cinchoose;cin.ignore(256,\n);try{switch(choose){caseOPTION::QUIT:cout---程序退出endl;return0;caseOPTION::ADD:addContact();break;caseOPTION::DEL:caseOPTION::FIND_ALL:caseOPTION::FIND_ONE:break;default:cout选择有误请重新选择!endl;break;}}catch(constContactsExceptione){cout---操作通讯录时发生异常endl---异常信息e.what()endl;}}return0;}3.3.3 addContact 函数功能描述该函数负责执行添加联系人的完整业务流。它是一个上层调用函数串联了本地交互、数据转换、网络通信及错误处理。核心逻辑步骤对象初始化创建 HTTP 客户端实例和空的 AddContactRequest 请求对象。调用构造逻辑调用 buildAddContactRequest 函数填充数据。序列化使用 SerializeToString() 将结构化对象转为二进制字节流以满足 Protobuf 传输要求。同步请求向服务器路径/contacts/add发起 POST 请求。特别指定了application/protobuf的 Content-Type告知服务端数据格式。多层级校验传输层检查 HTTP 请求是否送达if (!res)。协议层检查 HTTP 状态码是否为 200并尝试解析响应体。业务层解析成功后检查resp.success()字段确认服务端业务逻辑是否执行成功。结果反馈业务成功后从响应对象中获取并显示服务端分配的uid。代码如下voidaddContact(){// 定义客户端Clientcli(CONTACTS_HOST,CONTACTS_PORT);// 构造 reqAddContactRequest req;buildAddContactRequest(req);// 序列化 reqstring req_str;if(!req.SerializeToString(req_str)){throwContactsException(AddContactRequest序列化失败!);}// 发起 post 调用autorescli.Post(/contacts/add,req_str,application/protobuf);if(!res){string err_desc;err_desc.append(/contacts/add 链接失败错误信息).append(httplib::to_string(res.error()));throwContactsException(err_desc);}// 反序列化 respAddContactResponse resp;boolparseresp.ParseFromString(res-body);if(res-status!200!parse){string err_desc;err_desc.append(/contacts/add 调用失败).append(std::to_string(res-status)).append(().append(res-reason).append());throwContactsException(err_desc);}elseif(res-status!200){string err_desc;err_desc.append(/contacts/add 调用失败).append(std::to_string(res-status)).append(().append(res-reason).append() 错误原因).append(resp.error_desc());throwContactsException(err_desc);}elseif(!resp.success()){string err_desc;err_desc.append(/contacts/add 结果异常).append(异常原因).append(resp.error_desc());throwContactsException(err_desc);}// 结果打印cout新增联系人成功,联系人ID: resp.uid()endl;}3.3.4 buildAddContactRequest 函数功能描述该函数负责构造请求对象。它通过标准的输入输出流cin/cout与用户进行交互将用户输入的原始数据填充到 Protobuf 协议定义的结构体中。实现细节字段填充逐个提示用户输入 “姓名” 和 “年龄”并调用 Protobuf 自动生成的set_方法完成赋值。流清理在读取整数年龄后使用cin.ignore()清除缓冲区中的换行符确保后续getline能够正常读取字符串。重复字段处理利用for循环支持输入多个电话号码。每增加一个号码通过add_phone()动态创建一个电话子消息对象。输入校验通过if (number.empty())判断用户是否直接按下回车以此作为结束电话输入录入的信号。代码如下voidbuildAddContactRequest(AddContactRequest*req){cout请输入联系人姓名;string name;getline(cin,name);req-set_name(name);cout请输入联系人年龄;intage;cinage;req-set_age(age);cin.ignore(256,\n);for(inti0;;i){cout请输入联系人电话i1(只输入回车完成电话新增);string number;getline(cin,number);if(number.empty()){break;}AddContactRequest_Phone*phonereq-add_phone();phone-set_number(number);cout请输入该电话类型(1、移动电话 2、固定电话);inttype;cintype;cin.ignore(256,\n);switch(type){case1:phone-set_type(AddContactRequest_Phone_PhoneType::AddContactRequest_Phone_PhoneType_MP);break;case2:phone-set_type(AddContactRequest_Phone_PhoneType::AddContactRequest_Phone_PhoneType_TEL);break;default:cout选择有误endl;break;}}}3.4 完成服务端代码服务端采用了 cpp-httplib 作为 HTTP 框架结合 Protocol Buffers 处理数据的接收与响应并实现了简单的模拟持久化控制台打印以及 uuid 生成逻辑。3.4.1 main 函数实现功能描述main 函数是服务端的入口负责初始化 HTTP 服务器、注册路由回调逻辑并启动监听。实现逻辑解析路由注册通过server.Post(/contacts/add, ...)监听特定的 POST 请求路径。数据反序列化从req.body中提取二进制数据并使用 request.ParseFromString() 将其还原为 AddContactRequest 对象。业务处理调用 printContact() 函数将接收到的联系人姓名、年龄及电话列表打印到控制台模拟数据持久化过程。设置响应状态将 success 标记为 true。生成响应调用 generate_hex() 为新联系人生成一个唯一的 uid并将整个 AddContactResponse 对象序列化为二进制流。异常处理使用 try-catch 块捕获自定义异常 ContactsException。若发生错误如解析失败将 HTTP 状态码设为500并在响应体中封装具体的错误描述error_desc返回给客户端。服务启动调用server.listen(0.0.0.0, 8123)使服务在 8123 端口上运行并接受任何 IP 的访问。代码如下intmain(){cout-----------服务启动----------endl;Server server;server.Post(/contacts/add,[](constRequestreq,Responseres){cout接收到post请求!endl;// 反序列化 request: req.bodyadd_contact::AddContactRequest request;add_contact::AddContactResponse response;try{if(!request.ParseFromString(req.body)){throwContactsException(AddContactRequest反序列化失败!);}// 新增联系人持久化存储通讯录----》 打印新增的联系人信息printContact(request);// 构造 responseres.bodyresponse.set_success(true);response.set_uid(generate_hex(10));// res.body (序列化response)string response_str;if(!response.SerializeToString(response_str)){throwContactsException(AddContactResponse序列化失败!);}res.status200;res.bodyresponse_str;res.set_header(Content-Type,application/protobuf);}catch(constContactsExceptione){res.status500;response.set_success(false);response.set_error_desc(e.what());string response_str;if(response.SerializeToString(response_str)){res.bodyresponse_str;res.set_header(Content-Type,application/protobuf);}cout/contacts/add 发生异常异常信息e.what()endl;}});// 绑定 8123 端口并且将端口号对外开放server.listen(0.0.0.0,8123);return0;}3.4.2 生成 uid功能描述由于本示例未接入数据库服务端通过generate_hex函数手动生成一个 10 字节20 个字符的十六进制字符串作为联系人的唯一标识符UID。随机数引擎使用了 C11 标准的random库。std::random_device用于获取硬件随机种子。std::mt19937梅森旋转算法引擎具有随机性好、速度快的特点。std::uniform_int_distribution确保生成的随机整数均匀分布在[0, 255]范围内。十六进制转换利用std::stringstream和std::hex操纵符将随机生成的字节值转换为十六进制字符串。补位处理通过(hex.length() 2 ? 0 hex : hex)确保每个字节都占据两位字符例如将0x5转换为05从而保证生成的 uid 长度固定。代码如下voidprintContact(add_contact::AddContactRequestreq){cout联系人姓名req.name()endl;cout联系人年龄req.age()endl;for(intj0;jreq.phone_size();j){constadd_contact::AddContactRequest_Phonephonereq.phone(j);cout联系人电话j1phone.number();// 联系人电话1:1311111 (MP)cout (phone.PhoneType_Name(phone.type()))endl;}}staticunsignedintrandom_char(){// ⽤于随机数引擎获得随机种⼦std::random_device rd;// mt19937是c11新特性它是⼀种随机数算法⽤法与rand()函数类似但是mt19937具有速度快周期⻓的特点// 作⽤是⽣成伪随机数std::mt19937gen(rd());// 随机⽣成⼀个整数i 范围[0, 255]std::uniform_int_distributiondis(0,255);returndis(gen);}3.4.3 辅助功能说明ContactsException 类自定义异常类专门用于捕获并传递 Protobuf 处理过程中的序列化/反序列化错误。代码如下// 自定义异常类classContactsException{private:std::string message;public:ContactsException(std::string strA problem):message(str){}std::stringwhat()const{returnmessage;}};printContact 函数该函数展示了如何遍历 Protobuf 中的 repeated 字段电话列表并利用 PhoneType_Name() 接口将枚举数值转换为易读的字符串标签。代码如下voidprintContact(add_contact::AddContactRequestreq){cout联系人姓名req.name()endl;cout联系人年龄req.age()endl;for(intj0;jreq.phone_size();j){constadd_contact::AddContactRequest_Phonephonereq.phone(j);cout联系人电话j1phone.number();// 联系人电话1:1311111 (MP)cout (phone.PhoneType_Name(phone.type()))endl;}}4. 功能演示对于客户端和服务器都需要先编译 proto 文件protoc--cpp_out. add_contact.proto接着再进行 make 编译 cpp 代码文件即可。make新增一个联系人的结果如下所示5. 总结下面将展示网络版通讯录的完整功能。新增第一个联系人如下图所示新增第二个联系人如下图所示查看联系人列表如下图所示查看联系人详细信息如下图所示删除联系人 张三如下图所示此时通讯录只剩李四这一个联系人了对于完整的通讯录代码可以移步到我的代码仓库Online-Address-Book

相关文章:

【ProtoBuf 实战训练】网络版通讯录

文章目录1. 通讯录 4.0 实现(网络版)2. 环境搭建2.1 搭建服务端2.2 搭建客户端2.3 运行结果3. 新增联系人功能3.1 协议约定3.2 协议接口定义 (.proto)3.2.1 AddContactRequest(请求消息)3.2.2 AddContactResponse(响应…...

写字楼外卖管理新工具:爽提智能外卖柜

午间十二点,往往是城市写字楼最喧嚣的时刻。外卖骑手拎着餐盒涌入大堂,电梯口排起长队。前台桌面上堆满了五颜六色的外卖袋,餐盒越堆越高,错拿、丢失、凉透——几乎成为每天必上演的曲目。这不是某个写字楼的个别现象,…...

OpenClaw学术助手:千问3.5-27B自动校对论文格式与参考文献

OpenClaw学术助手:千问3.5-27B自动校对论文格式与参考文献 1. 为什么需要自动化论文校对工具 作为科研工作者,我经历过无数次论文投稿前的格式调整噩梦。记得去年投稿某核心期刊时,光是调整参考文献格式就花了整整两天——期刊要求APA第六版…...

OpenClaw安全配置指南:Qwen3-4B模型权限与操作边界管理

OpenClaw安全配置指南:Qwen3-4B模型权限与操作边界管理 1. 为什么需要特别关注OpenClaw的安全配置 上周我在调试一个自动整理文档的OpenClaw任务时,差点酿成大祸。当时我让AI助手帮我整理桌面上的项目资料,结果它"聪明"地把所有文…...

国风美学生成模型v1.0创意延展:将生成结果导入Visio进行二次设计与标注

国风美学生成模型v1.0创意延展:将生成结果导入Visio进行二次设计与标注 最近在玩一个挺有意思的国风美学生成模型,用它捣鼓出了不少有韵味的画作。但光生成出来看看,总觉得有点可惜。这些充满东方美感的底图,如果能和专业的设计工…...

Qwen3-Reranker-0.6B实战案例:跨语言技术文档智能筛选系统

Qwen3-Reranker-0.6B实战案例:跨语言技术文档智能筛选系统 1. 引言:技术文档管理的痛点与解决方案 在全球化技术团队协作中,工程师们经常面临这样的困境:当需要查找某个技术问题的解决方案时,面对的是分散在Confluen…...

基于RexUniNLU的Matlab科研助手开发全攻略

基于RexUniNLU的Matlab科研助手开发全攻略 科研工作繁琐耗时?让AI帮你自动解析论文、理解公式、生成报告! 1. 引言:科研工作的智能革命 作为一名科研工作者,你是否经常被这些场景困扰:面对堆积如山的论文不知从何读起…...

Alibaba DASD-4B Thinking 对话工具入门:Anaconda虚拟环境配置与模型调用

Alibaba DASD-4B Thinking 对话工具入门:Anaconda虚拟环境配置与模型调用 想试试最新的对话模型,但被复杂的依赖和版本冲突搞得头大?这感觉我太懂了。很多朋友在接触像Alibaba DASD-4B这类大模型时,第一步就卡在了环境配置上&…...

Phi-4-mini-reasoning惊艳效果:对存在矛盾前提的题目主动识别并预警

Phi-4-mini-reasoning惊艳效果:对存在矛盾前提的题目主动识别并预警 1. 模型核心能力展示 Phi-4-mini-reasoning作为一款专注于推理任务的文本生成模型,在处理数学题、逻辑题等需要多步分析的场景时展现出独特优势。最令人惊艳的是,它能够主…...

SE110 0608830109伺服控制器

SE110 0608830109 伺服控制器简介SE110 0608830109 是工业自动化系统中的伺服控制器模块主要用于驱动和控制伺服电机,实现精确运动控制支持闭环控制,确保位置、速度和加速度精度内置高速处理器,可快速响应控制指令提供多种控制模式&#xff0…...

在github上部署个人的vitepress文档网站

我开发的BMapViewer组件正式上线了,文档使用了vitepress搭建编写,使用github Pages进行部署,现在可以正常访问了,接下来我会完整的写一遍网站部署过程。 我的文档网站:https://banyan666.github.io/BMapViewer-docs/ …...

IBM与Arm达成战略合作,携手开发“双架构硬件”

IBM正式宣布与Arm达成合作。双方将携手共同开发新型“双架构硬件”,旨在助力企业以更高的灵活性、可靠性与安全性,运行未来的人工智能(AI)及数据密集型工作负载。这一计算平台充分融合了IBM在系统可靠性、安全性和可扩展性方面的显…...

关于visio导出png jpg等格式图片边缘出现黄线的暂时解决方案

起因是更新windows后,visio导出图片边缘将会出现黄线,对于强迫症患者来说实在难以忍受。首先23H2是没有这个问题的,好像25H2才有的。随着我一直更新系统好像目前的黄线没有以前那么多了,但仍然有。删除更新感觉并不是一个很好的办…...

NanoHttpd POST 请求中文乱码问题解决方案

解决方案 推荐做法&#xff1a;服务器端修正 在请求处理的 serve() 方法中&#xff0c;在调用 parseBody() 之前&#xff0c;显式确保 Content-Type 包含 charsetUTF-8&#xff1a; Override public Response serve(IHTTPSession session) {Map<String, String> files n…...

Intv_ai_mk11集成Node.js环境配置:快速构建实时聊天应用

Intv_ai_mk11集成Node.js环境配置&#xff1a;快速构建实时聊天应用 1. 环境准备与快速部署 在开始构建实时聊天应用之前&#xff0c;我们需要确保开发环境已经准备就绪。这里假设你已经具备基本的JavaScript和Node.js知识。 首先&#xff0c;确保你的系统已经安装了Node.js…...

OpenClaw-Observability:基于 DuckDB 构建 OpenClaw 的全链路可观测体系

如果你也曾盯着 OpenClaw 回复的一句"Done"&#xff0c;不知道它到底做了什么——你并不孤单&#xff0c;我们也曾经历过。于是我们基于DuckDB为 OpenClaw 构建了一套可观测插件&#xff0c;把原本不可见的 Agent 执行过程结构化记录下来&#xff0c;让每一次对话从黑…...

Wan2.2-I2V-A14B Anaconda虚拟环境管理:隔离依赖与复现实验

Wan2.2-I2V-A14B Anaconda虚拟环境管理&#xff1a;隔离依赖与复现实验 1. 为什么需要虚拟环境 在AI项目开发中&#xff0c;依赖管理是个让人头疼的问题。想象一下这样的场景&#xff1a;你花了两周时间调试好的模型&#xff0c;换台机器就跑不起来了&#xff1b;或者更新了某…...

OpenClaw多模型切换:SecGPT-14B与Qwen在安全场景的对比调用

OpenClaw多模型切换&#xff1a;SecGPT-14B与Qwen在安全场景的对比调用 1. 为什么需要多模型切换&#xff1f; 去年我在搭建个人安全分析工作流时&#xff0c;发现单一模型很难满足所有需求。SecGPT-14B在漏洞深度分析时表现出色&#xff0c;但简单的日志筛查任务用Qwen就能快…...

广州创科助力南水水电站安全监测自动化升级

南水水电站位于广东韶关乳源&#xff0c;其大坝建于1958年&#xff0c;是目前世界上唯一仍在运行的定向爆破粘土斜墙堆石坝&#xff0c;曾获1978年全国科学大会科技成果奖&#xff0c;在我国水利建设史上具有里程碑意义。电站总库容12.84亿立方米&#xff0c;为韶关约130万人口…...

Qwen3-ASR性能优化:基于CNN的语音特征提取技术

Qwen3-ASR性能优化&#xff1a;基于CNN的语音特征提取技术 语音识别技术发展到今天&#xff0c;已经不再是实验室里的新奇玩具&#xff0c;而是我们日常生活中随处可见的实用工具。从手机语音助手到会议记录软件&#xff0c;从智能家居控制到车载语音交互&#xff0c;语音识别…...

MTools详细步骤:MTools与RAG系统结合——先摘要再检索再生成

MTools详细步骤&#xff1a;MTools与RAG系统结合——先摘要再检索再生成 1. 引言&#xff1a;当“瑞士军刀”遇上“智能图书馆” 想象一下&#xff0c;你面前有一份长达50页的行业报告&#xff0c;你需要快速理解它的核心观点&#xff0c;然后基于这些观点去查找相关的市场数…...

Qwen3-ForcedAligner-0.6B完整指南:音频格式支持/实时录音/时间戳导出全解析

Qwen3-ForcedAligner-0.6B完整指南&#xff1a;音频格式支持/实时录音/时间戳导出全解析 你是不是也遇到过这样的烦恼&#xff1f;开会录音想整理成文字&#xff0c;手动打字累到怀疑人生&#xff1b;做视频需要加字幕&#xff0c;一句一句对时间轴对到眼花。今天要介绍的这个…...

开箱即用:基于Qwen3-Embedding-4B的智能文档检索系统搭建实录

开箱即用&#xff1a;基于Qwen3-Embedding-4B的智能文档检索系统搭建实录 1. 引言&#xff1a;为什么选择Qwen3-Embedding-4B 想象一下&#xff0c;你手头有成千上万份技术文档、合同或学术论文&#xff0c;每次查找相关内容都要靠关键词匹配&#xff0c;结果要么漏掉重要信息…...

HY-Motion-1.0本地部署全流程:Docker镜像快速启动教程

HY-Motion-1.0本地部署全流程&#xff1a;Docker镜像快速启动教程 1. 引言 想用简单的文字描述就能生成专业的3D角色动画吗&#xff1f;HY-Motion 1.0让这个想法变成了现实。这是一个基于先进AI技术的文本生成3D动作模型&#xff0c;只需要输入英文描述&#xff0c;就能自动生…...

SecGPT-14B惊艳效果:对混淆JavaScript恶意样本的命令解析与行为还原

SecGPT-14B惊艳效果&#xff1a;对混淆JavaScript恶意样本的命令解析与行为还原 1. 网络安全智能化的新标杆 在网络安全领域&#xff0c;恶意脚本分析一直是让安全工程师头疼的难题。传统方法需要人工逐行分析经过多重混淆的JavaScript代码&#xff0c;既耗时又容易遗漏关键细…...

AI编程赋能研发效率:核心能力与实践经验总结

作为常年泡在代码里的开发者&#xff0c;想必大家都有过这样的体验&#xff1a;用AI插件补几行代码很快&#xff0c;但一到实际项目&#xff0c;环境配置、多任务并行、代码审查这些环节还是得靠人工一点点磨&#xff1b;不同的AI编程能力各有优势&#xff0c;切换适配却十分繁…...

Pixel Script Temple应用场景:有声书脚本生成、儿童动画分集大纲、播客故事线设计

Pixel Script Temple应用场景&#xff1a;有声书脚本生成、儿童动画分集大纲、播客故事线设计 1. 产品概述 Pixel Script Temple是一款基于Qwen2.5-14B-Instruct深度微调的专业剧本创作工具&#xff0c;将AI推理能力与8-Bit复古美学相结合&#xff0c;为创作者提供沉浸式的剧…...

2026 电商开源系统选型指南:4 套主流方案对比 + 避坑技巧

随着电商业务场景的多元化发展&#xff0c;开源商城系统的选型直接决定项目的稳定性、迭代效率与长期扩展性。2026 年市面上活跃的电商系统在技术架构、功能覆盖、开源程度上差异显著&#xff0c;盲目选择易导致后期架构重构、功能受限等问题。本文从 技术栈适配、并发支撑、多…...

ERTEC 系列 PROFINET 芯片级硬件过滤器分析

起因是我想在搞一些操作windows进程的事情时&#xff0c;老是需要右键以管理员身份运行&#xff0c;感觉很麻烦。就研究了一下怎么提权&#xff0c;顺手瞄了一眼Windows下用户态权限分配&#xff0c;然后也是感谢《深入解析Windows操作系统》这本书给我偷令牌的灵感吧&#xff…...

PyTorch 2.8镜像创意实践:AI音乐生成+歌词视频同步+多模态情感渲染

PyTorch 2.8镜像创意实践&#xff1a;AI音乐生成歌词视频同步多模态情感渲染 1. 项目背景与镜像优势 在数字内容创作领域&#xff0c;音乐视频制作一直是个耗时费力的过程。传统流程需要音乐制作、歌词设计、视频剪辑等多个专业环节配合&#xff0c;成本高且周期长。PyTorch …...