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

【AI插件开发】Notepad++ AI插件开发实践:实现对话窗口功能

引言

之前的文章已经介绍实现了AI对话窗口,但只有个空壳,没有实现功能。本次将集中完成对话窗口的功能,主要内容为:

  • 模型动态切换:支持运行时加载配置的AI模型列表
  • 交互式输入处理:实现多行文本输入与Ctrl+Enter提交逻辑
  • 异步模型调用:通过回调机制实现流式输出与界面实时更新
  • 状态控制:提供发送/停止双模式按钮,支持任务中断
用户 输入框 主窗口 模型 界面 按钮 输入内容(Ctrl+Enter) 触发OnInputFinished 调用DirectRequest 流式返回数据 实时追加输出 点击停止 设置g_bRun=false 任务终止通知 恢复初始状态 用户 输入框 主窗口 模型 界面 按钮

模型下拉支持

启动时读取插件配置,包括当前模型名称和平台所支持的模型列表,然后启动AI对话窗口时加载该模型列表,并选中当前模型名称

// 打开AI助手停靠窗口的主入口函数
void OpenAiAssistWnd()
{// 检查窗口实例、模块句柄和Notepad++主窗口的有效性if (g_pAiWnd == nullptr && g_hModule != nullptr && g_nppData._nppHandle != nullptr){// 创建AI助手窗口实例// 参数1: 插件模块实例句柄,用于加载资源// 参数2: Notepad++核心数据接口,用于窗口绑定g_pAiWnd = new AiAssistWnd((HINSTANCE)g_hModule, g_nppData);// 执行窗口初始化操作// 包含创建子控件、设置布局、注册消息处理器等g_pAiWnd->init();// 获取当前配置的平台信息auto& platform = g_pluginConf.Platform();// 在模型列表中查找当前选定的模型// 用于初始化界面中的模型选择控件auto it = std::find(platform.models.begin(), platform.models.end(), platform.model_name);// 更新界面模型列表并设置默认选中项// 当未找到配置的模型时默认选择第一个条目(索引0)g_pAiWnd->updateModelList(platform.models, (it == platform.models.end()) ? 0 : static_cast<int>(std::distance(platform.models.begin(), it)));}// 注1: 此处假设g_pluginConf.Platform().models至少包含一个元素// 注2: 窗口关闭时应调用delete g_pAiWnd释放资源// 注3: 实际部署需添加异常处理机制
}

提交用户输入

用户输入是一个文本输入框EDIT,一开始我计划通过响应窗口事件函数获取输入的,但是发现文本框的输入根本不触发窗口事件函数,怀疑是被窗口拦截了。因此,我在创建该文本输入框的时候,为该控件创建单独的事件处理过程。

为了支持输入时支持换行,因此采用Ctrl+Enter作为快捷键提交用户输入,且用户输入也会提交到输出窗口。

  • 控件子类化:通过InputEditSubclassProc拦截编辑框消息,实现:
    • Ctrl+Enter提交与普通回车换行分离
    • 输入内容过滤(空值/纯空白字符校验)
  • 输入输出分离:用户提问内容自动添加【问】标记并清空输入区

代码实现如下:

// 输入框子类化处理函数,用于自定义编辑控件行为
LRESULT CALLBACK InputEditSubclassProc(HWND hWnd,          // 控件窗口句柄UINT uMsg,          // 消息类型WPARAM wParam,      // 消息参数LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData  // 存储关联的类实例指针
)
{// 将保存的指针转换为窗口类实例auto pThis = (AiAssistWnd*)dwRefData;// 处理键盘按下消息if (uMsg == WM_KEYDOWN && wParam == VK_RETURN) {// 检测Ctrl键是否被按住if (GetKeyState(VK_CONTROL) & 0x8000) {// 调用输入完成处理函数,成功则阻止默认回车行为if (pThis->OnInputFinished()){return 0;  // 中断消息传递}}}// 处理字符输入消息else if (uMsg == WM_CHAR){// 当Ctrl键按下时处理特殊字符if (GetKeyState(VK_CONTROL) & 0x8000){// 屏蔽回车和换行符的输入if (wParam == VK_RETURN || wParam == 0x0A){return 0;}}// 处理普通回车输入if (wParam == VK_RETURN){// 若Ctrl按下则忽略if (GetKeyState(VK_CONTROL) & 0x8000){return 0;}// 插入Windows风格换行符const wchar_t* pLR = L"\r\n";SendMessageW(hWnd, EM_REPLACESEL, FALSE, (LPARAM)pLR); }}// 执行默认消息处理return DefSubclassProc(hWnd, uMsg, wParam, lParam);
}// 输入完成处理函数
bool AiAssistWnd::OnInputFinished()
{// 获取输入框文本长度int len = GetWindowTextLengthW(_hInputEdit);if (len <= 0){return false;  // 空输入不处理}// 分配缓冲区并获取文本内容std::wstring buf((size_t)len + 1, L'\0');GetWindowTextW(_hInputEdit, &buf[0], (int)buf.size());// 转换并清理字符串auto text = Scintilla::String::TrimAll(Scintilla::String::wstring2s(&buf[0], false));if (text.empty()){return false;  // 无效内容过滤}// 清空输入区域SetWindowTextW(_hInputEdit, L"");          // 重置文本内容SendMessageW(_hInputEdit, EM_SETSEL, 0, 0); // 重置选择区域SendMessageW(_hInputEdit, EM_SCROLLCARET, 0, 0); // 滚动到起始位置// 更新界面状态appendAnswer("【问】\r\n" + text);  // 在回答区域添加问题标记SendMessageW(_hActionBtn, BM_SETIMAGE, IMAGE_ICON, (LPARAM)_hStopIcon); // 切换按钮图标::EnableWindow(_hAnswerView, FALSE);  // 禁用回答区域编辑// 触发外部回调if (fnOnInputFinished != nullptr) fnOnInputFinished(text);return true;
}// 控件初始化函数
void AiAssistWnd::initControls()
{// 创建多行编辑控件_hInputEdit = ::CreateWindowExW(WS_EX_CLIENTEDGE,   // 带边框样式L"EDIT",            // 控件类名L"",                // 初始文本WS_CHILD | WS_VISIBLE | ES_MULTILINE | // 多行模式ES_AUTOVSCROLL | WS_VSCROLL,          // 滚动条支持0, 0, 0, 0,        // 初始位置尺寸(由布局管理)_hSelf,             // 父窗口句柄(HMENU)IDC_INPUT_EDIT, // 控件ID_hInst,             // 实例句柄nullptr);// 设置子类化处理SetWindowSubclass(_hInputEdit,        // 目标控件InputEditSubclassProc, // 处理函数0,                  // 子类ID(DWORD_PTR)this     // 传递类实例指针);// ... 其他控件初始化代码
}

模型调用和输出

上述处理用户输入完成后,会触发外部回调,该回调即模型调用及输出,初始化代码如下:

// 配置模型选择变更回调
g_pAiWnd->fnOnModelSelChange = [](const std::string& model) {// 更新当前平台的默认模型配置// 操作路径:全局配置对象 -> 当前平台 -> 模型名称g_pluginConf.platforms[g_pluginConf.platform].model_name = model;
};// 配置输入完成回调
g_pAiWnd->fnOnInputFinished = [](const std::string& text) {// 设置实时输出回调:将模型返回数据流式显示到界面g_pAiModel->fnAppentOutput = [](const std::string& ans) {// 转换编码格式:UTF8 -> GBK(适配本地字符集)// 参数false表示新建行,即时追加,有打字机效果g_pAiWnd->appendAnswer(Scintilla::String::UTF8ToGBK(ans.c_str(), ans.size()), false); };// 设置输出完成回调:绑定窗口类的完成处理方法// 使用bind保留窗口实例指针和参数传递能力g_pAiModel->fnOutputFinished = std::bind(&AiAssistWnd::OnOutputFinished, g_pAiWnd, std::placeholders::_1);// 在回答区域添加应答标记g_pAiWnd->appendAnswer("【答】");// 提交异步AI处理任务// 通过UI任务队列保证线程安全g_pNppImp->RunUiTask(// 绑定模型请求方法与参数std::bind(&AiModel::DirectRequest, g_pAiModel, std::placeholders::_1), text  // 用户输入文本作为请求参数);
};
用户提交输入
设置流式输出回调
触发异步AI任务
实时追加模型输出
任务完成恢复界面状态
  • 线程安全:通过g_pNppImp->RunUiTask确保UI操作在主线程执行
  • 编码转换:模型返回的UTF-8数据经UTF8ToGBK转换适配本地环境

发送和停止按钮

考虑用户发起提问后,模型就一直嗒嗒嗒地输出,或者不动了也不知道是停止了还是卡顿了,所以做了一个按钮。该按钮可以:

  • 提交用户输入
  • 停止模型调用
  • 显示当前模型后台任务状态

通过全局变量std::atomic<bool> g_bRun控制后台任务状态。

// 对话框消息处理主函数
INT_PTR AiAssistWnd::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam)
{switch (message) {case WM_COMMAND:  // 处理控件通知消息{int wmId = LOWORD(wParam);     // 获取控件IDint wmEvent = HIWORD(wParam);  // 获取通知代码// 处理模型选择下拉框变化事件if (wmId == IDC_MODEL_COMBO && wmEvent == CBN_SELCHANGE){OnModelComboSelChange();  // 更新选中的模型配置return TRUE;              // 已处理该消息}// 处理操作按钮点击事件if (wmId == IDC_ACTION_BUTTON && wmEvent == BN_CLICKED){// 根据运行状态切换按钮功能if (g_bRun.load())  // 检查原子变量状态{g_bRun.store(false);  // 设置停止标志}else {OnInputFinished();    // 触发输入处理流程}return TRUE;}}break;}// 未处理的消息传递给基类处理return DockingDlgInterface::run_dlgProc(message, wParam, lParam);
}// 初始化控件布局和属性
void AiAssistWnd::initControls()
{// 创建操作按钮控件_hActionBtn = ::CreateWindowExW(WS_EX_CLIENTEDGE,       // 带3D边框样式L"BUTTON",              // 按钮控件类L"",                    // 初始文本为空(使用图标)WS_CHILD | WS_VISIBLE | // 必须的窗口样式BS_ICON | BS_PUSHBUTTON,// 显示图标的按钮类型0, 0, 28, 28,           // 初始位置和尺寸(后续布局调整)_hSelf,                 // 父窗口句柄(HMENU)IDC_ACTION_BUTTON, // 控件ID_hInst,                 // 模块实例句柄nullptr);// 设置辅助功能文本(供屏幕阅读器识别)SetWindowText(_hActionBtn, _T("发送"));// 加载发送状态图标资源_hSendIcon = (HICON)LoadImageW(_hInst,                      // 资源所在模块MAKEINTRESOURCEW(IDI_ICON_SEND), // 资源IDIMAGE_ICON,                  // 资源类型为图标24, 24,                     // 请求的图标尺寸LR_DEFAULTCOLOR             // 保留原始颜色);// 加载停止状态图标资源_hStopIcon = (HICON)LoadImageW(_hInst,MAKEINTRESOURCEW(IDI_ICON_STOP),IMAGE_ICON,24, 24,LR_DEFAULTCOLOR);// 设置按钮初始图标为发送状态SendMessageW(_hActionBtn, BM_SETIMAGE,        // 设置按钮图像消息IMAGE_ICON,         // 指定图像类型为图标(LPARAM)_hSendIcon  // 传递图标句柄);
}// 处理用户输入完成事件
bool AiAssistWnd::OnInputFinished()
{// 在回答区域添加问题标识appendAnswer("【问】\r\n" + text);// 切换按钮图标为停止状态SendMessageW(_hActionBtn, BM_SETIMAGE, IMAGE_ICON, (LPARAM)_hStopIcon);// 禁用回答区域编辑功能::EnableWindow(_hAnswerView, FALSE);// 触发外部输入完成回调if (fnOnInputFinished != nullptr) fnOnInputFinished(text);return true;  // 事件已处理
}// 处理模型输出完成事件
void AiAssistWnd::OnOutputFinished(const std::string& end)
{// 追加最终输出内容appendAnswer(end, false);// 重新启用回答区域编辑::EnableWindow(_hAnswerView, TRUE);// 恢复按钮图标为发送状态SendMessageW(_hActionBtn, BM_SETIMAGE, IMAGE_ICON, (LPARAM)_hSendIcon);
}
  • 原子变量std::atomic<bool> g_bRun控制后台任务中断
  • 按钮多态
    • 发送状态:显示纸飞机图标,绑定输入提交逻辑
    • 停止状态:显示方块图标,触发g_bRun.store(false)
  • 界面联动:输出时禁用编辑区域,任务结束后自动恢复

效果图

在这里插入图片描述

相关文章:

【AI插件开发】Notepad++ AI插件开发实践:实现对话窗口功能

引言 之前的文章已经介绍实现了AI对话窗口&#xff0c;但只有个空壳&#xff0c;没有实现功能。本次将集中完成对话窗口的功能&#xff0c;主要内容为&#xff1a; 模型动态切换&#xff1a;支持运行时加载配置的AI模型列表交互式输入处理&#xff1a;实现多行文本输入与Ctrl…...

[GESP202409 二级] 小杨的 N 字矩阵 题解

#include<bits/stdc.h> #define int long long using namespace std; int m, a[55][55], sum; signed main(){cin >> m;for(int i 1; i < m; i ){a[i][1] 1;//第一列a[i][m] 1;//第m列sum ;a[i][sum] 1;//斜着的}for(int i 1; i < m; i ){for(int j 1;…...

第八章:探索新兴趋势:Agent 框架、产品与开源力量

引言 在前两章的实战中&#xff0c;我们已经掌握了如何使用 LangChain、LlamaIndex、AutoGen 和 CrewAI 这些主流框架来构建 AI Agent&#xff0c;无论是单个智能体还是协作的多 Agent 系统。然而&#xff0c;AI Agent 领域的发展日新月异&#xff0c;如同奔腾的河流&#xff…...

条款05:了解C++默默编写并调用哪些函数

目录 1.默认生成的函数 2.无法生成的情况 2.1当成员函数有引用 或者 被const修饰 2.2.operator在基类被私有 1.默认生成的函数 class empty {};//相当于class empty { public:empty(){ ... } // 构造函数empty(const empty& rhs) { ... }// 拷贝构造~empty(){ ... } //…...

Vue3 中封装函数实现加载图片加载失败兜底方案。

文章目录 Vue3 中使用动态加载图片并处理加载失败的情况实现思路代码实现代码解析注意事项扩展功能总结 Vue3 中使用动态加载图片并处理加载失败的情况 在开发 Vue3 应用时&#xff0c;我们经常会遇到需要动态加载图片的场景。例如&#xff0c;图片资源可能从后端获取&#xf…...

微机控制电液伺服汽车减震器动态试验系统

微机控制电液伺服汽车减震器动态试验系统&#xff0c;用于对汽车筒式减震器、减震器台架、驾驶室减震装置、发动机悬置软垫总成、发动机前置楔形支撑总成等的示功图试验、速度特性试验。 主要的技术参数&#xff1a; 1、最大试验力&#xff1a;5kN&#xff1b; 2、试验力测量精…...

如何简单几步使用 FFmpeg 将任何音频转为 MP3?

在多媒体处理领域&#xff0c;FFmpeg 以其强大的功能和灵活性而闻名。无论是视频编辑、音频转换还是流媒体处理&#xff0c;它都是专业人士和技术爱好者的首选工具之一。在这篇文章中简鹿办公将重点介绍如何使用 FFmpeg 进行音频格式转换&#xff0c;提供一些常用的转换方式&am…...

【软考-系统架构设计师】ATAM方法及效用树

软件架构设计中ATAM方法及效用树深度解析 一、ATAM方法核心框架与流程 ATAM&#xff08;架构权衡分析方法&#xff09;是由卡耐基梅隆大学提出的系统性架构评估方法&#xff0c;旨在通过多维度质量属性分析识别架构风险、敏感点与权衡点。其实施流程分为四阶段九步骤&#xf…...

2025第十七届“华中杯”大学生数学建模挑战赛题目B 题 校园共享单车的调度与维护问题完整成品正文33页(不含附录)文章思路 模型 代码 结果分享

校园共享单车运营优化与调度模型研究 摘 要 本研究聚焦校园共享单车点位布局、供需平衡、运营效率及故障车辆回收四大核心问题&#xff0c;通过构建一系列数学模型&#xff0c;系统分析与优化共享单车的运维体系。 针对问题一&#xff0c;我们建立了基于多时段观测的库存估算…...

React Native 0.79 稳定版发布,更快的工具、更多改进

React Native 0.79 已发布。此版本在多个方面进行了性能改进&#xff0c;并修复了一些漏洞。首先&#xff0c;得益于延迟哈希技术&#xff0c;Metro 的启动速度变快了&#xff0c;并且对包导出提供了稳定支持。由于 JS 包压缩方式的改变等原因&#xff0c;Android 的启动时间也…...

中国AI应用革命开启新纪元:从DeepSeek燎原到全栈生态崛起

当生成式AI的星火点燃华夏大地&#xff0c;一场由DeepSeek引发的智能革命正在重构中国产业版图。在这场算力与智慧的角逐中&#xff0c;全产业链的协同创新正在书写中国式AI进化的新范式。 一、全栈突围&#xff1a;AI基础设施生态全面升维 云端启航&#xff1a;头部云服务商…...

生物系统中的随机性及AI拓展

生物系统远非确定性的机器&#xff0c;而是本质上充满噪声的。这种随机性&#xff0c;或称偶然性&#xff0c;在塑造细胞行为和结果方面起着至关重要的作用。从基因表达到细胞命运决定&#xff0c;波动和不可预测的事件可以显著影响生物过程。理解和建模这种固有的变异性对于全…...

智能交响:EtherCAT转Profinet网关开启汽车自动化通信新纪元

在汽车制造行业&#xff0c;随着自动化程度的不断提升&#xff0c;设备之间的高效通信显得尤为重要。以吉利汽车西安制造基地为例&#xff0c;生产线中广泛应用了西门子PLC与机器人手臂等设备&#xff0c;这些设备分别采用了Profinet和EtherCAT通信协议。为实现不同协议设备之间…...

【2025“华中杯”大学生数学建模挑战赛】选题分析 A题 详细解题思路

目录 2025“华中杯”大学生数学建模挑战赛选题分析A题&#xff1a;晶硅片产销策略优化B题&#xff1a;校园共享单车的调度与维护问题C题&#xff1a;就业状态分析与预测D题&#xff1a;患者院内转运不良事件的分析与预测 A 题 晶硅片产销策略优化问题 1&#xff1a;月利润计算模…...

springboot整合阿里云百炼DeepSeek,实现sse流式打印

1.开通阿里云百炼,获取到key 官方文档地址 https://bailian.console.aliyun.com/?tabapi#/api/?typemodel&urlhttps%3A%2F%2Fhelp.aliyun.com%2Fdocument_detail%2F2868565.html 2.新建SpringBoot项目 <?xml version"1.0" encoding"UTF-8"?&g…...

JMeter中设置HTTPS请求

在JMeter中设置HTTPS请求&#xff0c;你可以按照以下步骤进行操作&#xff1a; 步骤一&#xff1a;添加线程组 打开JMeter后&#xff0c;右键点击“测试计划”&#xff0c;选择“添加” -> “线程&#xff08;用户&#xff09;” -> “线程组”。线程组用于定义虚拟用户…...

oracle数据库中,merge into 语句的功能与使用场景

oracle数据库中&#xff0c;merge into 语句的功能与使用场景 一、MERGE INTO 语句的作用 MERGE INTO 是ORACLE数据库 SQL 中的一种数据操作语句&#xff0c;它结合了 INSERT、UPDATE 和 DELETE 操作的功能&#xff0c;通常被称为"upsert"操作&#xff08;update …...

极狐GitLab 安全文件管理功能介绍

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 安全文件管理 (BASIC SELF) 在极狐GitLab 15.6 中 GA&#xff0c;功能标志 ci_secure_files 被移除。 您可以将最多 100 个…...

极狐GitLab CI/CD 流水线计算分钟数如何管理?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 计算分钟管理 (PREMIUM SELF) 在极狐GitLab 16.1 中&#xff0c;从 CI/CD 分钟数重命名为计算配额或计算分钟数。 管理员可…...

XCZU4CG‑2SFVC784I 赛灵思 FPGA XilinxZynq UltraScale+ MPSoC

XCZU4CG‑2SFVC784I 是 AMD Xilinx Zynq UltraScale MPSoC CG 系列中的入门级高性能 SoC FPGA&#xff0c;集成了双核 Arm Cortex‑A53 通用处理器与双核 Arm Cortex‑R5F 实时处理器&#xff0c;以及可编程逻辑&#xff08;PL&#xff09;资源。 异构处理系统 (PS) 应用处理…...

软考 中级软件设计师 考点知识点笔记总结 day13 数据库系统基础知识 数据库模式映像 数据模型

文章目录 数据库系统基础知识6.1 基本概念6.1.1 DBMS的特征与分类 6.2 数据库三级模式两级映像6.3 数据库的分析与设计过程6.4 数据模型6.4.1 ER模型6.4.2 关系模型 数据库系统基础知识 基本概念 数据库三级模式两级映像 数据库的分析与设计过程 数据模型 关系代数 数据库完整…...

视频监控EasyCVR视频汇聚平台接入海康监控摄像头如何配置http监听功能?

一、方案概述 本方案主要通过EasyCVR视频管理平台&#xff0c;实现报警信息的高效传输与实时监控。海康监控设备能通过HTTP协议将报警信息发送至指定的目的IP或域名&#xff0c;而EasyCVR平台则可以接收并处理这些报警信息&#xff0c;同时提供丰富的监控与管理功能&#xff0…...

【八大排序】冒泡、直接选择、直接插入、希尔、堆、归并、快速、计数排序

目录 一、排序的介绍二、排序算法的实现2.1 直接插入排序2.2 希尔排序2.3 直接选择排序2.4 堆排序2.5 冒泡排序2.6 快速排序2.7 归并排序2.8 比较排序算法的性能展示2.9 计数排序 个人主页<— 数据结构专栏<— 一、排序的介绍 我们的生活中有很多排序&#xff0c;比如像…...

AI在市场营销分析中的核心应用及价值,分场景详细说明

以下是 AI在市场营销分析中的核心应用及价值&#xff0c;分场景详细说明&#xff1a; 1. 客户行为分析与细分 AI技术应用&#xff1a; 机器学习&#xff1a;分析用户点击、购买、浏览等行为数据&#xff0c;识别消费模式&#xff08;如高频购买时段、偏好品类&#xff09;。聚…...

本地Ubuntu轻松部署高效性能监控平台SigNoz与远程使用教程

目录 ⛳️推荐 前言 1.关于SigNoz 2.本地部署SigNoz 3.SigNoz简单使用 4. 安装内网穿透 5.配置SigNoz公网地址 6. 配置固定公网地址 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击…...

解析检验平板:设备还是非设备?深入了解其功能与应用(北重铸铁平台厂家)

检验平板通常被归类为设备&#xff0c;因为它们具有特定的功能&#xff0c;并且被用于测试和评估其他设备或产品的性能和质量。检验平板通常具有平坦的表面&#xff0c;用于放置要进行测试或检验的物品。它们可以用于测量尺寸、形状、平整度、表面光洁度等参数。 检验平板的应…...

【创新实训个人博客】前端实现

一、 目标设定与初步改造 核心目标: 对 visualizer 的前端界面 (index.html, style.css) 进行现代化改造。 基础样式&#xff1a; 初始化页面整体风格&#xff0c;为 body 添加了动态渐变背景&#xff1b;初步调整了页面顶部导航按钮、信息提示块 (Log Visualizer) 及底部任务…...

vue3、原生html交互传值

1、引入原生html 将该文件放到public目录下&#xff0c;在vue项目里面使用iframe 引入该文件&#xff0c;监听load事件(load事件在<iframe>的内容完全加载完成之后触发) <iframeload"onIframeLoad"style"width: 454px; height: 480px"src".…...

于 Jupyter 天地,借 NumPy 之手编织数据锦缎

引言 NumPy是Python科学计算的核心库之一&#xff0c;提供了强大的多维数组对象和丰富的数学函数&#xff0c;是数据科学、机器学习等领域不可或缺的工具。结合Jupyter Notebook的交互式环境&#xff0c;NumPy的使用变得更加直观和高效。本文将介绍如何在Jupyter中充分利用NumP…...

Mac idea WordExcel等文件git modify 一直提示修改状态

CRLF LF CR 换行符自动转换问题 查看状态&#xff1a;git config --global --list Mac需要开启&#xff0c;window下需要关闭 关闭命令&#xff1a;git config --global core.autocrlf false 命令解释&#xff1a; autocrlf true 表示要求git在提交时将crlf转换为lf&a…...

代码学习总结(三)

代码学习总结(三) 这个系列的博客是记录下自己学习代码的历程,有来自平台上的,有来自笔试题回忆的,主要基于 C++ 语言,包括题目内容,代码实现,思路,并会注明题目难度,保证代码运行结果 1 判断并构造 eleme 型字符串 简单 eleme 型字符串 判断与构造 小红有一个长…...

Vue的Diff算法原理

Vue中的Diff算法&#xff08;差异算法&#xff09;是虚拟DOM的核心优化手段&#xff0c;用于对比新旧虚拟DOM树&#xff0c;找出最小变更&#xff0c;高效更新真实DOM&#xff0c;其设计目标是减少DOM操作次数&#xff0c;提升渲染性能 diff算法&#xff1a; 特点&#xff1a…...

CentOS系统-超详细的Kubernetes集群搭建教程(kubernetes:1.28.2)

小伙伴们&#xff0c;今天给大家带来一份超详细的Kubernetes集群搭建教程&#xff0c;保证让你从环境准备到安装验证&#xff0c;一路畅通无阻&#xff01;&#x1f680; &#x1f308; ‌一、环境准备‌ 首先&#xff0c;咱们得确保硬件和软件环境都达标哦&#xff01; &am…...

自动驾驶系列—GLane3D: Detecting Lanes with Graph of 3D Keypoints

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…...

【Amazon 工具】在MacOS本地安装 AWS CLI、kubectl、eksctl工具

文章目录 安装 AWS CLI安装 kubectl安装 eksctl参考链接 安装 AWS CLI 创建访问密钥安装或更新 AWS CLI curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg" sudo installer -pkg AWSCLIV2.pkg -target /要验证 Shell 是否可以在 $PAT…...

基于GTID的主从复制

MySQL主从复制实战指南&#xff08;基于二进制日志&#xff09;-CSDN博客 二、基于GTID的主从复制 基于 GTID 方式&#xff1a;全局事务标示符&#xff0c;自mysql5.6版本开启的新型复制方式。 GTID的组成&#xff1a;server_uuid&#xff1a;序列号 UUID&#xff1a;每个m…...

linux多线(进)程编程——(8)多进程的冲突问题

前言 随着时间的推移&#xff0c;共享内存已经在修真界已经沦为禁术。因为使用这种方式沟通的两人往往会陷入到走火入魔的状态&#xff0c;思维扭曲。进程君父子见到这种情况&#xff0c;连忙开始专研起来&#xff0c;终于它们发现了共享内存存在的问题&#xff1a; 进程间冲…...

数据结构——八大排序算法

排序在生活中应用很多&#xff0c;对数据排序有按成绩&#xff0c;商品价格&#xff0c;评论数量等标准来排序。 数据结构中有八大排序&#xff0c;插入、选择、快速、归并四类排序。 目录 插入排序 直接插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序 hoare…...

线性代数 | 知识点整理 Ref 1

注&#xff1a;本文为 “线性代数 | 知识点整理” 相关文章合辑。 因 csdn 篇幅合并超限分篇连载&#xff0c;本篇为 Ref 1。 略作重排&#xff0c;未整理去重。 图片清晰度限于引文原状。 如有内容异常&#xff0c;请看原文。 线性代数知识汇总 Arrow 于 2016-11-27 16:27:5…...

Docker 设置镜像源后仍无法拉取镜像问题排查

#记录工作 Windows系统 在使用 Docker 的过程中&#xff0c;许多用户会碰到设置了国内镜像源后&#xff0c;依旧无法拉取镜像的情况。接下来&#xff0c;记录了操作要点以及问题排查方法&#xff0c;帮助我们顺利解决这类问题。 Microsoft Windows [Version 10.0.27823.1000…...

线性回归 (Linear Regression) 多项式回归 (Polynomial Regression)

目录 线性回归 (Linear Regression)单变量线性回归 (Univariate linear regression)代价函数 (Cost function)梯度下降 (gradient descent) 及公式由来梯度下降的变体Quiz多类特征 (Multiple features)多元线性回归 (Multiple linear regression)向量化 (Vectorization)正规方程…...

AI在能源消耗管理及能源效率提升中的核心应用场景及技术实现

以下是 AI在能源消耗管理及能源效率提升中的核心应用场景及技术实现&#xff0c;分领域详细说明&#xff1a; 1. 实时能源监测与异常检测 AI技术应用&#xff1a; 物联网&#xff08;IoT&#xff09; 传感器数据采集&#xff1a;实时收集设备、建筑或工厂的能耗数据&#xff…...

dumpsys--音频服务状态信息

Audio相关的信息获取指令&#xff1a; dumpsys media.audio_flinger dumpsys media.audio_policy dumpsys audio media.audio_flinger dumpsys media.audio_flinger 用于获取 AudioFlinger 服务的详细状态信息。 1. 命令作用 该命令输出当前系统的 音频设备状态、活跃音频流…...

JavaScript模块化开发:CommonJS、AMD到ES模块

引言 在Web开发的早期阶段&#xff0c;JavaScript代码通常被编写在一个庞大的文件中或分散在多个脚本标签里&#xff0c;这种方式导致了全局变量污染、依赖关系难以管理、代码复用困难等问题。随着Web应用日益复杂&#xff0c;模块化编程成为了解决这些问题的关键。本文将带您…...

面试情景题:企业内部系统如何做微前端拆分,如何通信?

在前端开发领域&#xff0c;技术的演进总是伴随着业务需求的复杂化与规模化而不断向前推进。近年来&#xff0c;微前端&#xff08;Micro Frontends&#xff09;作为一种全新的架构理念&#xff0c;逐渐成为解决大型前端应用复杂性的重要手段。与传统的单体前端应用不同&#x…...

OpenHarmony Camera开发指导(五):相机预览功能(ArkTS)

预览是在相机启动后实时显示场景画面&#xff0c;通常在拍照和录像前执行。 开发步骤 创建预览Surface 如果想在屏幕上显示预览画面&#xff0c;一般由XComponent组件为预览流提供Surface&#xff08;通过XComponent的getXcomponentSurfaceId方法获取surfaceid&#xff09;&…...

鸿蒙API15 “一多开发”适配:解锁黄金三角法则,开启高效开发新旅程

一、引言 在万物互联的时代浪潮中&#xff0c;鸿蒙操作系统以其独特的 “一多开发” 理念&#xff0c;为开发者打开了一扇通往全场景应用开发的新大门。“一多开发”&#xff0c;即一次开发&#xff0c;多端部署 &#xff0c;旨在让开发者通过一套代码工程&#xff0c;就能高效…...

RAG(检索增强生成)、ReAct(推理与行动) 和 多模态AI 的详细解析,包括三者的定义、工作原理、应用场景及协同关系

以下是 RAG&#xff08;检索增强生成&#xff09;、ReAct&#xff08;推理与行动&#xff09; 和 多模态AI 的详细解析&#xff0c;包括三者的定义、工作原理、应用场景及协同关系&#xff1a; 一、RAG&#xff08;Retrieval-Augmented Generation&#xff09; 1. 核心原理 …...

网络安全知识点2

1.虚拟专用网VPN&#xff1a;VPN用户在此虚拟网络中传输私网流量&#xff0c;在不改变网络现状的情况下实现安全&#xff0c;可靠的连接 2.VPN技术的基本原理是利用隧道技术&#xff0c;对传输报文进行封装&#xff0c;利用VPN骨干网建立专用数据传输通道&#xff0c;实现报文…...

DS-SLAM 运动一致性检测的源码解读

运动一致性检测是Frame.cc的Frame::ProcessMovingObject(const cv::Mat &imgray)函数。 对应DS-SLAM流程图Moving consistency check的部分 把这个函数单独摘出来&#xff0c;写了一下对两帧检测&#xff0c;查看效果的程序&#xff1a; #include <opencv2/opencv.hpp…...