Eclipse插件开发六:使用Web前端技术开发AI助手页面
之前的过程中,我们都不怎么熟悉Eclipse的哪些API,样式也没发怎么去修改,现在我们要修改为用html的方式来编写.
准备一个AI助手聊天页面的html.css,js代码
效果如下所示。
1.快速demo
1.1.准备前端代码
确保准备的前端代码可以在浏览器正常运行,这里我们直接浏览器访问html的绝对路径
代码目录如下所示
1.1.1.chat.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AI助手</title>
<link rel="stylesheet" type="text/css" href="F:\work\com.hutao.search\src\resources\chat.css">
</head>
<body>
<div class="chat-container"><div class="messages" id="message-container"></div><div class="input-container"><input type="text" class="user-input" id="user-input" placeholder="输入消息..."><button class="send-button" onclick="handleUserInput()">发送</button></div>
</div><script src="F:\work\com.hutao.search\src\resources\chat.js"></script>
</body>
</html>
1.1.2.chat.js
const messageContainer = document.getElementById('message-container');const userInput = document.getElementById('user-input');function handleUserInput() {const userMessage = userInput.value.trim();if (userMessage === '') {return;}appendMessage(userMessage, 'user-message');// Simulate AI Assistant replyconst systemReply = 'AI助手: 你好呀,勇士!';appendMessage(systemReply, 'assistant-message');userInput.value = '';messageContainer.scrollTop = messageContainer.scrollHeight;}function appendMessage(message, messageType) {const messageElement = document.createElement('div');messageElement.classList.add('message', messageType);messageElement.textContent = message;messageContainer.appendChild(messageElement);}
1.1.3.chat.css
body {font-family: Arial, sans-serif;margin: 0;padding: 0;background-color: #f2f2f2;}.chat-container {max-width: 600px;margin: 20px auto;background-color: #fff;border-radius: 5px;box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);}.messages {min-height: 300px;max-height: 400px;overflow-y: scroll;padding: 10px;}.message {margin-bottom: 10px;padding: 10px;border-radius: 5px;}.user-message {background-color: #DCF8C6;align-self: flex-end;}.assistant-message {background-color: #E4E4E4;}.input-container {display: flex;align-items: center;padding: 10px;background-color: #f9f9f9;}.user-input {flex: 1;height: 40px;margin-right: 10px;padding: 5px;border: 1px solid #ccc;border-radius: 5px;}.send-button {padding: 5px 10px;background-color: #4CAF50;color: white;border: none;border-radius: 5px;cursor: pointer;}
2.改造后端代码ViewPart
将之前的ViewPart 进行改造,这里不在使用java来开发界面。我们用前端的html,css,js.
实现思路,就是将在嵌入浏览器组件 (Browser) 来加载 HTML 和 JavaScript 页面,从而实现你的需求。这种方式可以让你使用熟悉的前端 技术来构建界面。
package com.hutao.search.view;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;public class AiView extends ViewPart {public static final String ID = "com.hutao.search.ai.plugin.aiview";@Overridepublic void createPartControl(Composite parent) {parent.setLayout(new GridLayout(1, false));// 创建 Browser 控件Browser browser = new Browser(parent, SWT.NONE);browser.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));// 加载 HTML 文件内容String htmlContent = loadHtmlFile("resources/chat.html");System.out.println(htmlContent);// 在 Browser 控件中显示 HTML 内容browser.setText(htmlContent);}/*** @description:加载html页面* @author:hutao* @mail:hutao1@epri.sgcc.com.cn* @date:2025年2月18日16:01:01*/private String loadHtmlFile(String resourcePath) {InputStream inputStream = getClass().getClassLoader().getResourceAsStream(resourcePath);if (inputStream == null) {return "<html><body><h1>无法加载资源</h1></body></html>";}StringBuilder content = new StringBuilder();try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"))) {String line;while ((line = reader.readLine()) != null) {content.append(line).append("\n");}} catch (IOException e) {e.printStackTrace();return "<html><body><h1>无法加载资源</h1></body></html>";}return content.toString();}@Overridepublic void setFocus() {}
}
3.Demo效果展示
左边为我们在正常浏览器里面运行的效果,而右边实在eclipse中运行的效果。不然看出,样式好像丢了一些。也就是将前端的代码,迁移到html中的时候,好像不是完全兼容的。
4.CSS样式丢失的问题
根据上图的对比,不难发现,背景色都丢了,我们通过浏览器查看到这个元素,复制一下这些样式
我们把这部分代码复制出来看看,然后放到我们的html代码中,
<div class="chat-container"><div class="messages" id="message-container"><div class="message user-message">xxx</div><div class="message assistant-message">AI助手: 你好呀,勇士!</div><div class="message user-message">xxx</div><div class="message assistant-message">AI助手: 你好呀,勇士!</div><div class="message user-message">xxx</div><div class="message assistant-message">AI助手: 你好呀,勇士!</div><div class="message user-message">xxx</div><div class="message assistant-message">AI助手: 你好呀,勇士!</div></div><div class="input-container"><input type="text" class="user-input" id="user-input" placeholder="输入消息..."><button class="send-button" onclick="handleUserInput()">发送</button></div></div>
如下图所示,通过代码直接写的,样式没问题,通过handleUserInput-》appendMessage-》追加的消息,丢失了背景色样式,
而在浏览器中,我们可以看到,写死的,和通过handleUserInput-》appendMessage-》都是正常的,观察代码,也发先,代码都是一致的,目前我们则怀疑,可能在eclipse的Browser通过我们的handleUserInput-》appendMessage-》追加的消息,可能不能是我们正常显示时候的代码了。
于是我尝试这样解决问题,那我直接用style,不用css来渲染,看看如何?结果样式正常了。
function appendMessage(message, messageType) {const messageElement = document.createElement('div');const messageElement = document.createElement('div');// 设置背景色和字体颜色,直接通过 style 属性应用if (messageType === 'user-message') {messageElement.style.backgroundColor = '#DCF8C6'; // 用户消息背景色messageElement.style.alignSelf = 'flex-end'; // 用户消息右对齐} else if (messageType === 'assistant-message') {messageElement.style.backgroundColor = '#E4E4E4'; // AI 助手背景色}// 直接应用原本的 CSS 样式messageElement.style.padding = '10px'; // 设置内边距messageElement.style.marginBottom = '10px'; // 设置下边距messageElement.style.borderRadius = '5px'; // 设置圆角messageElement.style.fontFamily = 'Arial, sans-serif'; // 设置字体messageElement.style.fontSize = '14px'; // 设置字体大小messageElement.style.lineHeight = '1.5'; // 设置行高messageElement.style.maxWidth = '100%'; // 限制宽度(可选)messageElement.style.display = 'block'; // 确保它是块级元素messageElement.textContent = message;messageContainer.appendChild(messageElement);
}
现在基本可以确定,问题出在handleUserInput-》appendMessage-》css渲染出现问题了,我尝试将下面的classList.add(‘message’, messageType)拆成两行,classList.add(‘message’),classList.add(messageType),结果样式可以正常了。
function appendMessage(message, messageType) {const messageElement = document.createElement('div');//messageElement.classList.add('message', messageType);messageElement.classList.add('message');messageElement.classList.add(messageType);messageElement.textContent = message;messageContainer.appendChild(messageElement);
}
现在就有一个问题,怎么去看生成的这些元素样式,毕竟不是在浏览器里面,浏览器我们可以F12查看。
这里这特了一早上,我最后研究了下日志打印来看看为啥上面CSS样式失效。
5.日志打印问题
接着上面的问题,以后出现这样的问题该怎么定位处理?毕竟这个不想浏览器一样,我们可以按F12,可以debug
通过上面我们一系列测试,我们最终锁定:通过handleUserInput-》appendMessage-》追加的消息,丢失了背景色样式,那么如果我们能通过一些有效的方法来看看,我们最终的页面html元素是否为下面这样。
<div class="messages" id="message-container"><div class="message user-message">aa</div><div class="message assistant-message">AI助手: 你好呀,勇士!</div>
</div>
5.1.alert弹框打印信息
alert是原始的js弹框,不用引入任何框架插件即可使用,后面为啥会说,为啥用原始js打印(还有插件引入的问题还没说,这里我引入css,js是使用绝对路径地址)
在合适的位置,使用alert,例如,这里我在调用appendMessage之后,去获取message-container元素,然后弹框
const messageContainer = document.getElementById('message-container');
alert(messageContainer.innerHTML);
此时我们就能发现问题了,我们通过appendMessage生成的最后html和我们预期的不一样,
实际生成的没样式
<div class="message">abc</div>
<div class="message">AI助手: 你好呀,勇士!</div>预期的生成的有样式
<div class="message user-message">aa</div>
<div class="message assistant-message">AI助手: 你好呀,勇士!</div>
然而,当我们把appendMessage中的classList.add(),拆成两次添加以后,就正常了。
//messageElement.classList.add('message', messageType);
messageElement.classList.add('message');
messageElement.classList.add(messageType);
楼主查阅了很多资料,觉得下面这个理由比较靠谱。
浏览器对标准的 JavaScript API 支持较好,classList.add 方法在现代浏览器中已经是一个标准且稳定的 API。然而,Eclipse 插件的运行环境可能和浏览器有所不同,可能存在对某些 JavaScript 特性支持不完全或者存在兼容性问题。
所以在调用一些前端的API,如果达不到我们的期望的时候,不妨用打印的办法看看。
5.2.使用console.log进行日志输出
如下图所示,只是使用console.log就没那么简单了,你会发现无论怎么打印都不会输出到控制台,毕竟以前我们打印输出,是输出到F12,但是这里不好意思,这里是IDE,不是浏览器,没有F12
下面来说,怎么让console.log进行日志输出
BrowserFunction 是 Eclipse SWT(Standard Widget Toolkit)库中的一个类,用于在 Java 代码和嵌入在 SWT Browser 组件中的 JavaScript 代码之间建立桥梁,允许 JavaScript 代码调用 Java 方法。
public class CustomFunction extends BrowserFunction {public CustomFunction(Browser browser, String name) {super(browser, name);}@Overridepublic Object function(Object[] arguments) {for (Object arg : arguments) {if (arg != null) {// 打印到Java控制台System.out.println(arg.toString()); }}return null;}
}
接着在我们的ViewPart中中的创建part的方法中,创建CustomFunction。
public class AiView extends ViewPart {public static final String ID = "com.hutao.search.ai.plugin.aiview";@Overridepublic void createPartControl(Composite parent) {parent.setLayout(new GridLayout(1, false));// 创建 Browser 控件Browser browser = new Browser(parent, SWT.NONE);browser.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));// 加载 HTML 文件内容String htmlContent = loadHtmlFile("resources/chat.html");System.out.println(htmlContent);// 在 Browser 控件中显示 HTML 内容//browser.setText(htmlContent);browser.setUrl("F:\\work\\com.hutao.search\\src\\resources\\chat.html");new CustomFunction(browser, "logToJava");}}
然后在我们的js文件(需要调用console.log 之前,重写console.log),最好js的第一行代码
console.log = function() {const messages = Array.prototype.slice.call(arguments);// 将所有参数连接成一个字符串并调用Java方法logToJava(messages.join(' '));
};
6.CSS,JS资源引用问题
上面的代码,我用的是绝对路径地址,但是这样明显不对的,这样就没办法迁移了,因此要换成相对地址
<script src="F:\work\com.hutao.search\src\resources\chat.js"></script>
<link rel="stylesheet" type="text/css" href="F:\work\com.hutao.search\src\resources\chat.css">
chat.html和chat.css等都在一个文件夹,因此我们用相对路径
<script src="chat.js"></script>
<link rel="stylesheet" type="text/css" href="chat.css">
修改完以后再看我们的浏览器的,没有受到影响。
但是在看我们的eclipse里面的。样式不仅丢了,点击发送也没任何反应。之前是CSS部分丢了,现在来看是CSS和JS,都全丢了
6.1.问题分析
在 Eclipse SWT 中的 Browser 控件加载 HTML 文件时,相对路径的资源(如 CSS 文件和 JS 文件)通常会出现问题。这是因为 Browser 控件使用的本地 Web 渲染引擎和我们普通的浏览器渲染不是一样的。因此,不能用浏览器去引用CSS,JS的思路去。
我们先不防获取一下这里的CSS,JS,HTML的路径看一下
URL jspath = getClass().getClassLoader().getResource("resources/chat.js");
URL csspath = getClass().getClassLoader().getResource("resources/chat.css");
URL htmlpath = getClass().getClassLoader().getResource("resources/chat.html");System.out.println(jspath.toString());
System.out.println(csspath.toString());
System.out.println(htmlpath.toString());
如下图所示,如果你没接触到OSGI这类插件式开发的框架,对于下面这个bundleresource的地址,一定是很蒙蔽的。
格式特点:以 bundleresource:// 开头,后面紧跟一串数字(如 729.fwk1177963719),这串数字是 OSGi 框架为每个 Bundle(可理解为一个插件)分配的唯一标识符,用于区分不同的插件。再后面就是资源在 Bundle 内的相对路径,如 resources/chat.js。
用途:这种地址主要用于在 OSGi 环境中定位 Bundle 内部的资源。在 Eclipse 插件开发中,每个插件都是一个 Bundle,插件内的资源(如 HTML、CSS、JavaScript 文件等)可以通过这种地址来引用,确保资源的独立性和隔离性。
6.2.引用方案
6.2.1.1html,css,js物理不分离
即将所有的html,css,js等资源,都写到同一个html文件中,这样就不存在引用问题,代价就是会导致最后html变得很大,如果你开发的插件足够代码多,引用的资源足够多,后期维护变成几百上千行代码的时候,很难维护。这个我就不举例写了。有兴趣自己尝试。
6.2.1.1html,css,jss逻辑不分离
相比于上面的方案,物理不分离,我们在物理上将这些资源文件分离。但是在逻辑上不分离,具体措施就是,开发写代码的时候,html,css,各写个的,但是最后代码执行的时候,将css,js,等注入到html,最后,和上面物理不分离的效果是一样的,区别是,上面的代码在开发的时候就已经是同一个文件了,而这个方法,是开发完毕以后,在代码运行的时候,将代码打包合并到一个html文件中。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;public class AiView extends ViewPart {public static final String ID = "com.hutao.search.ai.plugin.aiview";@Overridepublic void createPartControl(Composite parent) {parent.setLayout(new GridLayout(1, false));// 创建 Browser 控件Browser browser = new Browser(parent, SWT.NONE);browser.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));// 加载 HTML 文件内容String htmlContent = loadHtmlFile("resources/chat.html");// 在 Browser 控件中显示 HTML 内容browser.setText(htmlContent);new CustomFunction(browser, "logToJava");}/*** @description:加载html页面* @author:hutao* @mail:hutao1@epri.sgcc.com.cn* @date:2025年2月18日16:01:01*/private String loadHtmlFile(String resourcePath) {InputStream inputStream = getClass().getClassLoader().getResourceAsStream(resourcePath);if (inputStream == null) {return "<html><body><h1>无法加载资源</h1></body></html>";}StringBuilder content = new StringBuilder();try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) {String line;while ((line = reader.readLine()) != null) {content.append(line).append("\n");}} catch (IOException e) {e.printStackTrace();return "<html><body><h1>无法加载资源</h1></body></html>";}// 加载 CSS 文件并内联String cssContent = loadResourceAsString("resources/chat.css");String jsContent = loadResourceAsString("resources/chat.js");// 将 CSS 和 JS 插入到 HTML 内容中return content.toString().replace("<link rel=\"stylesheet\" type=\"text/css\" href=\"chat.css\">","<style>" + cssContent + "</style>").replace("<script src=\"chat.js\"></script>","<script>" + jsContent + "</script>");}/*** @description:加载资源文件,转成字符串* @author:hutao* @mail:hutao1@epri.sgcc.com.cn* @date:2025年2月19日11:01:01*/private String loadResourceAsString(String resourcePath) {InputStream inputStream = getClass().getClassLoader().getResourceAsStream(resourcePath);if (inputStream == null) {return ""; // 返回空字符串以避免 null}StringBuilder content = new StringBuilder();try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) {String line;while ((line = reader.readLine()) != null) {content.append(line).append("\n");}} catch (IOException e) {e.printStackTrace();}return content.toString();}@Overridepublic void setFocus() {}
}
至此结束,相信到了这里,你就已经能用前端的开发来开发eclipse的插件了。如果你用的是VUE,也别怕,因为VUE打包最后也是生成HTML,CSS,JS这些代码,只是引用的方式,可能需要做转换
相关文章:
Eclipse插件开发六:使用Web前端技术开发AI助手页面
之前的过程中,我们都不怎么熟悉Eclipse的哪些API,样式也没发怎么去修改,现在我们要修改为用html的方式来编写. 准备一个AI助手聊天页面的html.css,js代码 效果如下所示。 1.快速demo 1.1.准备前端代码 确保准备的前端代码可以在浏览器正常…...
Jackson使用
Jackson 是一个功能强大的 JSON 处理库,除了基本的序列化和反序列化功能外,它还提供了许多其他功能,以满足不同的需求。以下是一些常用的高级功能: 0.普通序列化反序列化 序列化 import com.fasterxml.jackson.databind.ObjectM…...
Maven——Maven开发经验总结(1)
摘要 本文总结了 Maven 开发中的多个关键经验,包括如何根据版本号决定推送到 releases 或 snapshots 仓库,如何在构建过程中跳过测试,父项目如何控制子项目依赖版本,父项目依赖是否能传递到子项目,如何跳过 Maven dep…...
MyBatis-Plus之通用枚举
MyBatis-Plus之通用枚举 前言 MyBatis-Plus中提供了通用枚举,简单来说就是将数据库中的某一字段的代替的含义转换成真实的含义将数据展示给用户,用户在存储时也会将真实值转换成代替的数字存入到数据库中。举个例子:用户性别在数据库中存储…...
React通用登录/注销功能实现方案(基于shadcn/ui)
React通用登录/注销功能实现方案(基于shadcn/ui) 一、功能需求分析二、通用功能封装1. 通用登录表单组件2. 认证Hook封装 三、功能使用示例1. 登录页面实现2. 用户菜单实现 四、路由保护实现五、方案优势 一、功能需求分析 需要实现以下核心功能&#x…...
AI工具篇:利用DeepSeek+Kimi 辅助生成综述汇报PPT
随着科研和学术报告需求的增加,如何高效地准备一份结构清晰、内容充实的PPT已成为许多研究者的挑战。 传统的PPT制作过程繁琐,需要大量文献收集、数据分析和设计工作,而AI工具能够帮助提升效率,减少重复劳动。 本文将介绍如何使用…...
审计级别未启用扩展模式导致查询 DBA_AUDIT_TRAIL 时 SQL_TEXT 列为空
如果查询 DBA_AUDIT_TRAIL 时发现 SQL_TEXT 列为空,但其他字段(如 OS_USERNAME、USERNAME、TIMESTAMP 等)有数据,可能是由于以下原因之一。以下是可能的原因及解决方法: 1. 审计级别未启用扩展模式 默认情况下&#x…...
HTTP 和RESTful API 基础,答疑
一文搞懂RESTful API - bigsai - 博客园 1. API 路径 开头必须 /,表示绝对路径,不支持 . 或 ..(相对路径)。API 结尾 / 通常不需要,但部分框架会自动处理 / → 无 /。 ✅ 推荐 GET /api/v1/products # 资源集合…...
手写简易RPC(实践版)
首先了解rpc rpc-远程过程调用,openFeign,Dubbo都可以算作rpc,以微服务来具体说明,就是在本地不需要去发送请求,通过rpc框架,像调用本地方法一样调用其他服务的方法,本质上还是要经过网络&…...
Day6 25/2/19 WED
【一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解(马士兵)】https://www.bilibili.com/video/BV13g41157hK?p4&v…...
【DL】浅谈深度学习中的知识蒸馏 | 输出层知识蒸馏
目录 一 核心概念与背景 二 输出层知识蒸馏 1 教师模型训练 2 软标签生成(Soft Targets) 3 学生模型训练 三 扩展 1 有效性分析 2 关键影响因素 3 变体 一 核心概念与背景 知识蒸馏(Knowledge Distillation, KD)是一种模…...
机器学习PCA和LDA
主成分分析(PCA, Principal Component Analysis)和线性判别分析(LDA, Linear Discriminant Analysis)是两种常用的降维方法,它们虽然都用于数据降维,但核心思想和应用场景不同。 PCA(主成分分析…...
tcp协议连接,和传输数据
1、连接 这个是通用的 2、传送数据 当连接建立后,客户端和服务器都可以主动发送数据,分别如下 1》客户端先发送数据 这里是单向的,服务器没有对客户端的数据内容进行应答,只是单纯的对报文应答ack 2》服务器先发送数据...
【异常错误】pycharm debug view变量的时候显示不全,中间会以...显示
异常问题: 这个是在新版的pycharm中出现的,出现的问题,点击view后不全部显示,而是以...折叠显示 在setting中这么设置一下就好了: 解决办法: https://youtrack.jetbrains.com/issue/PY-75568/Large-stri…...
Java基础——代理模式
代理模式是一种比较好理解的设计模式。简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。 一、代理模式的主要作用 控制访问:通…...
解锁机器学习核心算法|主成分分析(PCA):降维的魔法棒
一、引言 在机器学习的庞大算法体系中,有十种算法被广泛认为是最具代表性和实用性的,它们犹如机器学习领域的 “十大神器”,各自发挥着独特的作用。这十大算法包括线性回归、逻辑回归、决策树、随机森林、K - 近邻算法、K - 平均算法、支持向…...
sql注入漏洞
目录 一、SQL注入概述 例子背景 正常情况下的查询 SQL注入攻击 利用优先级进行攻击 二、解决SQL注入 使用PreparedStatement接口 步骤和方法 1. 创建PreparedStatement对象 2. 向占位符传入值 3. 执行SQL语句 示例 总结 SQL 注入是一种常见的网络攻击手段。通俗来…...
spring微服务+dubbo框架,某一服务启动时提示多个bean存在
在java的springboot项目中使用DubboService的注解的实现类中,在引用本模块的类时,使用的DubboRefrence注解,在启动项目时报错,提示该类需要以一个bean对象,但是存在了两个,把DubboRefrence的注解改成Autowi…...
React useState 和 useEffect 使用坑点注意总结
React Hooks 使用注意事项 Area: Hooks Date: February 10, 2025 Important: 🌟🌟🌟 React Hooks 注意事项 要点: useState 的初始化值 只在第一次渲染时计算,并且这个值不会随着组件重新渲染而更新。useEffect 可…...
使用rknn进行yolo11-pose部署
文章目录 概要生成ONNX生成RKNN实测效果概要 使用 RKNN 进行 YOLOv11 Pose 部署的必要性在于,RKNN 能将 YOLOv11 Pose 模型转化为适合 Rockchip 硬件平台(如 RV1109、RV1126)执行的格式,充分利用其 AI 加速功能,显著提高推理速度和效率。此外,RKNN 提供模型优化(如量化…...
开源语音克隆项目 OpenVoice V2 本地部署
#本机环境 WIN11 I5 GPU 4060ti 16G 内存 32G #开始 git clone https://github.com/myshell-ai/OpenVoice.git conda create -n opvenv python3.9 -y conda activate opvenv pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/…...
YOLOv12从入门到入土(含结构图)
论文链接:https://arxiv.org/abs/2502.12524 代码链接:https://github.com/sunsmarterjie/yolov12 文章摘要: 长期以来,增强YOLO框架的网络架构一直至关重要,但一直专注于基于cnn的改进,尽管注意力机制在建…...
8.【线性代数】——求解Ax=b
八 求解Axb 1. 解Axb求特解 x p x_p xp求特解 x n x_n xn所有解 2. Axb什么时候有解3. A m ∗ n A_{m * n} Am∗n不同秩的Axb解分析3.1 列满秩 rn<m3.2 行满秩 rm<n3.3 rmn3.4 r<m 且 r < n3.5 综述 1. 解Axb 求解 { x 1 2 x 2 2 x 3 2 x 4 b 1 2 x 1…...
【Quest开发】全身跟踪
软件:Unity 2022.3.51f1c1、vscode、Meta XR All in One SDK V72 硬件:Meta Quest3 最终效果:能像meta的操作室沉浸场景一样根据头盔移动来推断用户姿势,实现走路、蹲下、手势匹配等功能 需要借助UnityMovement这个包 GitHub …...
Spring Boot 示例项目:从零开始构建 Web 应用
一、项目概述 本文档将指导您通过一个示例项目,了解如何使用 Spring Boot 框架构建一个简单的 Web 应用程序。该项目涵盖了从数据模型定义到控制器、服务层以及数据访问层的完整开发流程,帮助您快速掌握 Spring Boot 的基本使用方法。 二、项目结构 1. 项目模块 本示例项…...
Windows 启动 SSH 服务报错 1067
Windows 启动 SSH 服务报错 1067 一、原本安装的 Windows 自带的 SSH 服务 按 Windows 键 -> 设置 -> 系统 -> 可选功能 在 添加的功能 查看是否安装了 OpenSSH 服务 一开始 执行 net start sshd 是可以正常启动的 并且其他机器也可以通过 ssh 访问 这个电脑 但是有…...
【AI战略思考15】我对做自媒体视频博主的初步探索和一些思考
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】【AI应用】 导言 因为自己找工作可能没那么快和顺利,事实是比我之前想象的要难很多,所以这几天探索了下自己能否尝试做自媒体或者视频博主来尝试赚点钱,如果做…...
零基础学QT、C++(一)安装QT
目录 如何快速学习QT、C呢? 一、编译器、项目构建工具 1、编译器(介绍2款) 2、项目构建工具 二、安装QT 1、下载QT安装包 2、运行安装包 3、运行QT creator 4、导入开源项目 总结 闲谈 如何快速学习QT、C呢? 那就是项目驱动法&…...
Word接入DeepSeek(API的作用)
1.打开”Word”,点击“文件”。 2.点击“选项”。 3.点击“信任中心”——“信任中心设置”。 4. 勾选”启用所有宏“,点击”确定“。 5.点击“自定义功能区”,勾选上“开发工具”,点击“确定”。 6.返回“文件——开发工具“下的…...
ok113i——交叉编译音视频动态库
提示:buildroot支持ffmpeg和SDL,但博主的ffmpeg是按下面方法编译通过,SDL使用buildroot直接编译也通过; 1. 下载ffmpeg源码 下载链接:https://github.com/FFmpeg/FFmpeg/tags 根据版本需要自行下载压缩包,…...
CSS中五种定位方式(position)对比分析
在 CSS 中,定位方式(position)决定了元素如何相对于其参照物进行定位,同时影响文档流的布局。以下是五种定位方式的对比、参照物说明及代码示例: 1. position: static(默认定位) 参照物&#x…...
Jest单元测试
由于格式和图片解析问题,可前往 阅读原文 前端自动化测试在提高代码质量、减少错误、提高团队协作和加速交付流程方面发挥着重要作用。它是现代软件开发中不可或缺的一部分,可以帮助开发团队构建可靠、高质量的应用程序 单元测试(Unit Testi…...
Lineageos 22.1(Android 15) 开机向导制作
一、前言 开机向导原理其实就是将特定的category的Activity加入ComponentResolver,如下 <category android:name"android.intent.category.SETUP_WIZARD"/>然后我们开机启动的时候,FallbackHome结束,然后启动Launcher的时候…...
前沿计组知识入门
这份PDF文件是一份关于计算机体系结构的讲义,涵盖了从基础概念到高级主题的多个方面。以下是详细的总结和分析: 计算机体系结构概述 定义:计算机体系结构是计算机系统的理论组成部分,根据其属性和功能进行划分,包括计…...
力扣 最长递增子序列
动态规划,二分查找。 题目 由题,从数组中找一个最长子序列,不难想到,当这个子序列递增子序列的数越接近时是越容易拉长的。从dp上看,当遍历到这个数,会从前面的dp选一个最大的数加上当前数,注意…...
在项目中调用本地Deepseek(接入本地Deepseek)
前言 之前发表的文章已经讲了如何本地部署Deepseek模型,并且如何给Deepseek模型投喂数据、搭建本地知识库,但大部分人不知道怎么应用,让自己的项目接入AI模型。 文末有彩蛋哦!!! 要接入本地部署的deepsee…...
已解决IDEA无法输入中文问题(亲测有效)
前言 在使用IDEA的时候,比如我们想写个注释,可能不经意间,输入法就无法输入中文了,但是在其他地方打字,输入法仍然能够正常工作。这是什么原因呢,这篇文章带你解决这个问题! 快捷键 如果你的I…...
Java 语法新特性(Records、Pattern Matching、Sealed Classes)深度解析(11/17/21)✨
一、Records(Java 16) 📝 核心价值:简化不可变数据载体的定义 // 传统POJO vs Record public record User(String name, int age) {} // 自动生成:构造方法/equals()/hashCode()/toString() User user new User(&qu…...
书评与笔记:《如何有效报告Bug》
文章目录 书评笔记核心原则1. 首要目标:让程序员亲眼看到问题2. 次要目标:详细描述问题3. 保持冷静,避免误操作4. 提供额外信息5. 清晰、准确地表达 实用建议不要自作聪明地诊断问题类比:看医生时的症状描述程序员的心理 总结 原文…...
Node.js 中的 fs 模块详解
fs(File System)模块是 Node.js 的核心模块之一,用于处理文件系统的操作,包括文件的读取、写入、删除、重命名等。它提供了同步和异步两种操作方式,适用于不同的场景。 1. 前置知识 1.1 文件系统 文件系统是操作系统…...
【深度学习】如何一步步实现SGD随机梯度下降算法
如何一步步实现SGD随机梯度下降算法 文章目录 如何一步步实现SGD随机梯度下降算法SGD随机梯度下降算法的作用MNIST_SAMPLE数据集SGD算法的七大步骤Step1. 初始化模型参数Step2. 计算预测值predictionsStep3. 计算损失lossStep4. 计算梯度gradientsStep5. 更新模型参数Step6. 重…...
Android Hal AIDL 简介 (一)
Android 接口定义语言 (AIDL) 是一款可供用户用来抽象化 IPC 的工具。 以在 .aidl 文件中指定的接口为例,各种构建系统都会使用 aidl 二进制文件构造 C++ 或 Java 绑定,以便跨进程使用该接口(无论其运行时环境或位数如何)。 AIDL 可以在 Android 中的任何进程之间使用:在…...
【数据分析】2.数据分析业务全流程
业务流程方法论:3阶段6步骤 一、课程核心内容结构 1. 方法论概述 目标:系统性地解决商业中的关键问题框架:分为三个阶段,每个阶段包含两个步骤适用场景:适用于数据分析师、业务经理等需要通过数据分析支持决策的从业…...
如何使用Spark SQL进行复杂的数据查询和分析
使用Spark SQL进行复杂的数据查询和分析是一个涉及多个步骤和技术的过程。以下是如何使用Spark SQL进行复杂数据查询和分析的详细指南: 一、准备阶段 环境搭建: 确保已经安装并配置好了Apache Spark环境。准备好数据源,可以是CSV文件、JSON…...
【Spring+MyBatis】_图书管理系统(下篇)
图书管理系统上篇、中篇如下: 【SpringMyBatis】_图书管理系统(上篇)-CSDN博客 【SpringMyBatis】_图书管理系统(中篇)-CSDN博客 目录 功能5:删除图书 6.1 约定前后端交互接口 6.2 后端接口 6.3 前端…...
goland无法debug项目
1、其实个原因是因为正在使用的Delve调试器版本太旧,无法兼容当前的Go语言版本1.2。Delve是Go语言的一个调试工具,用于提供源码级别的调试功能。Go语言每隔一段时间会发布新版本,而相应的调试器Delve也可能会更新以提供新的特性或修复已知问题…...
001-监控你的文件-FSWatch-C++开源库108杰
fswatch 原理与应用简介fswatch 安装fswatch 实践应用具体应用场景与细节补充 1. 简介 有些知识,你知道了不算厉害,但你要是不知道,就容易出乱。 很多时候,程序需要及时获取磁盘上某个文件对象(文件夹、文件࿰…...
leetcode203.移除链表元素
目录 问题描述示例提示 具体思路思路一思路二 代码实现 问题描述 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 题目链接:移除链表元素 示例 提示 列表中的节点数目在范围…...
代码随想录算法训练营第六天| 242.有效的字母异位词 、349. 两个数组的交集、202. 快乐数 、1. 两数之和
242.有效的字母异位词 题目链接:242.有效的字母异位词 文档讲解:代码随想录有效的字母异位词 视频讲解:LeetCode:有效的字母异位词 状态:学会了 思路: 数组其实是简单哈希表。 哈希表用来快速判断元素是否在…...
DL/CV领域常见指标术语(FLOPS/mIoU/混淆矩阵/F1-measure)------一篇入门
1. FLOPS、FLOPs和GFLOPs FLOPS: floating-point operations per second,每秒浮点运算次数,用来衡量硬件性能。 FLOPs:floating point of operations,是浮点运算次数,用来衡量算法、模型的复杂度。 GFLOPSÿ…...