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

有哪些网站可以接单做效果图/seo营销优化软件

有哪些网站可以接单做效果图,seo营销优化软件,临海门户网站住房和城乡建设规划局,推荐一些b2b网站文章目录 概要elctron 生命周期及窗口应用主进程与渲染进程交互技术细节electron 中需要注意的安全问题 概要 一、Electron简介 Electron是一个开源框架,它允许开发者使用JavaScript、HTML和CSS构建跨平台的桌面应用程序。它基于Chromium(谷歌浏览器的…

文章目录

    • 概要
    • elctron 生命周期及窗口应用
    • 主进程与渲染进程交互
    • 技术细节
    • electron 中需要注意的安全问题

概要

一、Electron简介

Electron是一个开源框架,它允许开发者使用JavaScript、HTML和CSS构建跨平台的桌面应用程序。它基于Chromium(谷歌浏览器的开源核心)和Node.js,这意味着开发者可以利用前端和后端的技术来创建功能丰富的桌面软件,像著名的Visual Studio Code就是用Electron构建的。

二、应用安装

  1. 开发环境搭建
    • 首先,需要安装Node.js,因为Electron依赖于Node.js的模块管理和脚本运行环境。可以从Node.js官方网站(https://nodejs.org/)下载适合操作系统的安装包进行安装。安装完成后,通过命令行工具(如Windows的命令提示符或PowerShell,Mac和Linux的终端)输入node -vnpm -v来验证是否安装成功,这两个命令分别会显示Node.js和npm(Node.js的包管理器)的版本号。
    • 然后,通过npm来安装Electron。可以在项目目录下运行npm install electron命令来安装Electron。也可以使用yarn(另一种流行的包管理器),通过yarn add electron进行安装。
  2. 创建和运行基本应用
    • 安装好Electron后,可以创建一个简单的Electron应用。首先创建一个项目目录,在目录下创建main.js(主进程文件)、index.html(渲染进程文件)和package.json(项目配置文件)。
    • main.js中,代码示例如下:
const { app, BrowserWindow } = require('electron');
function createWindow() {const win = new BrowserWindow({width: 800,height: 600});win.loadFile('index.html');
}
app.whenReady().then(() => {createWindow();app.on('activate', () => {if (BrowserWindow.getAllWindows().length === 0) {createWindow();}});
});
app.on('window - all - closed', () => {if (process.platform!== 'darwin') {app.quit();}
});
  • index.html中,可以编写简单的HTML代码,如:
<!DOCTYPE html>
<html>
<head><meta charset="UTF - 8"><title>My Electron App</title>
</head>
<body><h1>Hello, Electron!</h1>
</body>
</html>
  • package.json中,添加启动脚本,例如:
{"name": "my - electron - app","version": "1.0.0","main": "main.js","scripts": {"start": "electron."},"devDependencies": {"electron": "^27.0.0"}
}
  • 然后在项目目录下通过命令行运行npm start或者yarn start,就可以启动应用程序,看到一个简单的窗口显示“Hello, Electron!”。

三、页面交互

  1. 主进程和渲染进程通信
    • Electron应用有主进程和渲染进程之分。主进程负责管理应用的生命周期、创建和管理窗口等,渲染进程负责展示页面内容。它们之间需要通信来实现功能。
    • 例如,从渲染进程向主进程发送消息。在渲染进程的index.html中添加一个按钮:
<button id="myButton">Send Message to Main</button>
  • 在对应的JavaScript代码(可以在index.html中通过<script>标签引入,或者作为一个单独的.js文件引入)中:
const { ipcRenderer } = require('electron');
const myButton = document.getElementById('myButton');
myButton.addEventListener('click', () => {ipcRenderer.send('message - from - renderer', 'This is a message from the renderer process');
});
  • 在主进程main.js中接收消息:
const { ipcMain } = require('electron');
ipcMain.on('message - from - renderer', (event, arg) => {console.log(arg); // 可以在这里根据接收到的消息进行其他操作,比如更新窗口标题等const currentWindow = BrowserWindow.getFocusedWindow();if (currentWindow) {currentWindow.setTitle(arg);}
});
  1. 渲染进程内交互
    • 在渲染进程内部,就像普通的网页开发一样,可以使用JavaScript来处理各种交互。例如,实现一个简单的表单提交功能。在index.html中添加一个表单:
<form id="myForm"><input type="text" id="inputField" /><button type="submit">Submit</button>
</form>
  • 对应的JavaScript代码:
const myForm = document.getElementById('myForm');
myForm.addEventListener('submit', (e) => {e.preventDefault();const inputValue = document.getElementById('inputField').value;console.log('Input value:', inputValue);// 可以在这里进行更多关于输入值的处理,比如显示在页面其他地方等
});

四、打包部署安装

  1. 打包工具选择
    • 常用的Electron打包工具是Electron - Packager和Electron - Builder。Electron - Packager可以将应用程序打包成特定平台的可执行文件格式。Electron - Builder功能更强大,它支持多种平台,并且可以生成安装包、自动更新等功能。
    • 以Electron - Builder为例,首先需要安装它。在项目目录下运行npm install electron - builder - - save - dev或者yarn add electron - builder - - dev
  2. 配置打包脚本
    • package.json中配置打包脚本。例如:
{"name": "my - electron - app","version": "1.0.0","main": "main.js","scripts": {"start": "electron.","package": "electron - builder"},"build": {"appId": "com.example.my - electron - app","productName": "My Electron App","mac": {"category": "public.app - category.utilities"},"win": {"target": ["nsis"]}},"devDependencies": {"electron": "^27.0.0","electron - builder": "^23.6.0"}
}
  • 这里配置了应用的标识(appId)、产品名称(productName),以及针对Mac和Windows的一些打包选项,如在Windows下使用NSIS(Nullsoft Scriptable Install System)来创建安装程序。
  1. 打包操作
    • 配置好后,在项目目录下通过命令行运行npm run package或者yarn package就可以开始打包。打包完成后,在项目的dist目录(具体位置可能根据配置有所不同)下会生成可执行文件或安装包。对于Windows,会得到一个.exe安装程序或者解压后可直接运行的文件;对于Mac,会得到一个.app文件。
  2. 部署和安装
    • 对于打包好的应用,可以通过各种方式进行部署。可以将安装包发布到官方网站、软件下载平台等。用户下载安装包后,像安装普通软件一样进行安装。在Windows上双击.exe安装程序,按照安装向导的步骤进行安装;在Mac上,将.app文件拖移到“Applications”文件夹或者直接双击运行来安装。

elctron 生命周期及窗口应用

  1. 管理生命周期
    • app模块的使用:在Electron中,app模块是控制应用程序生命周期的核心。例如,app.whenReady()方法用于在Electron初始化完成后执行一些操作。
    • 以下是一个典型的main.js文件中对应用生命周期管理的示例:
const { app } = require('electron');
function createWindow() {// 创建窗口的代码将在后面介绍
}
// 当Electron初始化完成后,创建窗口
app.whenReady().then(() => {createWindow();// 当应用被激活时(例如从Dock或任务栏重新打开),如果没有窗口则创建一个app.on('activate', () => {if (BrowserWindow.getAllWindows().length === 0) {createWindow();}});
});
// 当所有窗口都关闭时,在非macOS平台上退出应用
app.on('window - all - closed', () => {if (process.platform!== 'darwin') {app.quit();}
});
  • 在这个例子中,app.whenReady()确保在Electron准备好后才创建窗口。app.on('activate')监听应用激活事件,app.on('window - all - closed')监听所有窗口关闭的事件,根据平台决定是否退出应用。在macOS上,即使所有窗口关闭,应用通常也会保留在Dock中,直到用户明确退出。
  1. 创建窗口
    • BrowserWindow类的应用:使用BrowserWindow类来创建窗口。可以设置窗口的各种属性,如大小、标题、是否可调整大小等。
    • 示例代码:
const { app, BrowserWindow } = require('electron');
function createWindow() {const win = new BrowserWindow({width: 800,height: 600,title: 'My Electron App',webPreferences: {nodeIntegration: true}});win.loadFile('index.html');return win;
}
  • 在这里,创建了一个BrowserWindow实例,设置了窗口的宽度为800像素、高度为600像素,标题为My Electron AppwebPreferences中的nodeIntegration: true允许在渲染进程中使用Node.js的功能。然后通过win.loadFile('index.html')加载了一个HTML文件作为窗口的内容。这个createWindow函数可以返回创建的窗口实例,方便后续对窗口进行管理。
  1. 管理窗口
    • 获取和操作窗口实例:可以使用BrowserWindow.getAllWindows()获取所有打开的窗口实例列表,BrowserWindow.getFocusedWindow()获取当前获得焦点的窗口。
    • 例如,在主进程中修改窗口标题:
const { ipcMain, BrowserWindow } = require('electron');
ipcMain.on('change - window - title', (event, newTitle) => {const currentWindow = BrowserWindow.getFocusedWindow();if (currentWindow) {currentWindow.setTitle(newTitle);}
});
  • 这个例子中,通过ipcMain接收一个名为change - window - title的消息,当接收到消息后,获取当前获得焦点的窗口(如果有),并将其标题修改为消息中传递的新标题。还可以对窗口进行其他操作,如最小化、最大化、关闭等。例如:
const { BrowserWindow } = require('electron');
const win = BrowserWindow.getFocusedWindow();
if (win) {win.minimize(); // 最小化窗口win.maximize(); // 最大化窗口win.close(); // 关闭窗口
}

主进程与渲染进程交互

  1. Electron创建窗口

    • 基础窗口创建
      • 在Electron的主进程(通常是main.js文件)中,使用BrowserWindow类来创建窗口。首先需要引入BrowserWindowapp模块,如下所示:
const { app, BrowserWindow } = require('electron');
  • 然后,定义一个函数来创建窗口。在这个函数中,通过new BrowserWindow()来实例化一个窗口对象,并传入一个配置对象来设置窗口的属性。例如:
function createWindow() {const win = new BrowserWindow({width: 800,height: 600,webPreferences: {nodeIntegration: true}});win.loadFile('index.html');return win;
}
  • 在上述代码中,创建的窗口宽度为800像素,高度为600像素。webPreferences中的nodeIntegration: true是一个重要的设置,它允许在渲染进程(加载的HTML页面)中使用Node.js的功能。win.loadFile('index.html')这一行是将一个本地的HTML文件加载到窗口中作为显示内容。这个index.html文件就是渲染进程的入口文件。

    • 多窗口创建
      • 如果需要创建多个窗口,可以在适当的事件触发时调用createWindow函数。例如,当用户点击一个按钮或者满足某个条件时创建新窗口。假设在主进程中有一个事件监听器,当接收到一个特定的IPC(进程间通信)消息时创建新窗口:
const { ipcMain } = require('electron');
ipcMain.on('open - new - window', (event, arg) => {const newWin = createWindow();// 可以在这里对新窗口进行进一步的操作,如设置位置等newWin.setPosition(100, 100);
});
  • 这里,当主进程接收到名为open - new - windowIPC消息时,就会调用createWindow函数创建一个新的窗口,并将其位置设置为横坐标100像素、纵坐标100像素的位置。
  1. 主进程与渲染进程交互实例

    • 从渲染进程发送消息到主进程
      • 在渲染进程(index.html及其关联的JavaScript文件)中,首先需要引入ipcRenderer模块。假设index.html中有一个按钮,点击这个按钮就向主进程发送消息:
<!DOCTYPE html>
<html>
<head><meta charset="UTF - 8">
</head>
<body><button id="sendMessageButton">Send Message to Main</button><script>const { ipcRenderer } = require('electron');const sendMessageButton = document.getElementById('sendMessageButton');sendMessageButton.addEventListener('click', () => {ipcRenderer.send('message - from - renderer', 'This is a test message');});</script>
</body>
</html>
  • 在上述代码中,ipcRenderer.send()方法用于发送消息。第一个参数message - from - renderer是一个自定义的通道名称,用于在主进程中识别消息来源;第二个参数This is a test message是要发送的实际消息内容。

    • 在主进程中接收并处理消息
      • 在主进程(main.js)中,需要使用ipcMain模块来接收消息。代码如下:
const { ipcMain } = require('electron');
ipcMain.on('message - from - renderer', (event, arg) => {console.log('Received message from renderer:', arg);// 可以根据接收到的消息进行各种操作,如修改窗口属性等const currentWindow = BrowserWindow.getFocusedWindow();if (currentWindow) {currentWindow.setTitle(arg);}
});
  • 这里,ipcMain.on()方法监听名为message - from - renderer的通道消息。当接收到消息时,会在控制台打印消息内容,并获取当前获得焦点的窗口(如果有),将其标题设置为接收到的消息内容。

    • 从主进程发送消息到渲染进程
      • 在主进程中发送消息到渲染进程,首先要获取窗口对应的WebContents对象。例如,在主进程中有一个定时器,每隔一段时间就向渲染进程发送消息:
const { app, BrowserWindow } = require('electron');
function createWindow() {const win = new BrowserWindow({width: 800,height: 600,webPreferences: {nodeIntegration: true}});win.loadFile('index.html');// 定时器,每隔5秒发送一次消息setInterval(() => {const webContents = win.webContents;webContents.send('message - from - main', 'This is a message from the main process');}, 5000);return win;
}
  • 这里,通过win.webContents.send()方法发送消息。message - from - main是通道名称,This is a message from the main process是消息内容。

    • 在渲染进程中接收并处理消息
      • 在渲染进程中,需要使用ipcRenderer来接收主进程发送的消息。代码如下:
const { ipcRenderer } = require('electron');
ipcRenderer.on('message - from - main', (event, arg) => {console.log('Received message from main:', arg);// 可以根据消息进行更新页面内容等操作const messageElement = document.createElement('p');messageElement.textContent = arg;document.body.appendChild(messageElement);
});
  • 当渲染进程接收到名为message - from - main的消息时,会在控制台打印消息内容,并在页面中创建一个新的<p>标签,将消息内容添加到标签中,然后将标签添加到页面的body元素中,从而在页面上显示主进程发送的消息。

技术细节

  1. 在HTML中直接引用Electron(不推荐用于正式开发)
    • 在开发初期的快速原型阶段或者非常小型的应用场景下,可能会直接在HTML文件(渲染进程)中引用Electron相关模块来进行简单的功能测试。例如,在index.html文件中通过<script>标签直接引入Electron的ipcRenderer模块来实现主进程和渲染进程之间的简单通信。
    • 示例代码如下:
<!DOCTYPE html>
<html>
<head><meta charset="UTF - 8">
</head>
<body><button id="sendMessageButton">Send Message to Main</button><script>// 直接引入Electron的ipcRenderer模块const { ipcRenderer } = require('electron');const sendMessageButton = document.getElementById('sendMessageButton');sendMessageButton.addEventListener('click', () => {ipcRenderer.send('message - from - renderer', 'This is a test message');});</script>
</body>
</html>
  • 这种方式虽然简单直接,但存在一些问题。比如,它没有很好地遵循模块加载的最佳实践,并且如果在复杂的项目中,可能会导致代码难以维护和管理。另外,在一些严格的安全策略下,这种直接引用可能会受到限制。
  1. 在正式开发中的更好实践
    • 预加载脚本(Preload Scripts)
      • 在正式开发中,通常会使用预加载脚本。预加载脚本是一个在渲染进程加载之前运行的脚本,它运行在一个特殊的环境中,可以访问Electron的主进程和渲染进程的一些功能。
      • 首先,创建一个预加载脚本文件(例如preload.js),在这个文件中可以进行一些初始化操作,比如将主进程的功能封装并暴露给渲染进程。示例代码如下:
const { contextBridge, ipcRenderer } = require('electron');
// 暴露一个名为sendMessageToMain的函数给渲染进程
contextBridge.exposeInheritedObject('electronAPI', {sendMessageToMain: (message) => {ipcRenderer.send('message - from - renderer', message);}
});
  • 然后,在创建BrowserWindow时,指定预加载脚本。在main.js文件中:
const { app, BrowserWindow } = require('electron');
function createWindow() {const win = new BrowserWindow({width: 800,height: 600,webPreferences: {preload: path.join(__dirname, 'preload.js')}});win.loadFile('index.html');return win;
}
  • index.html文件中,就可以通过window.electronAPI.sendMessageToMain来调用这个函数发送消息到主进程,这样的方式更加安全和易于维护。
  • 模块打包和构建工具
    • 在正式开发中,还会使用模块打包和构建工具,如Webpack或Rollup。这些工具可以帮助管理和打包JavaScript代码,包括Electron相关的代码。
    • 例如,使用Webpack时,可以将Electron相关的代码作为一个模块进行管理,通过配置webpack.config.js文件来处理不同的入口文件(包括主进程的main.js和渲染进程的index.html相关的JavaScript文件)。可以将Electron模块的引用和其他依赖一起打包,并且可以进行代码优化、压缩等操作,提高应用的性能和可维护性。
  • 代码分离和分层架构
    • 正式开发通常会采用代码分离和分层架构。将Electron相关的功能代码(如主进程的生命周期管理、窗口创建和进程间通信等)与具体的业务逻辑和页面展示代码(在渲染进程中)分开。
    • 例如,在一个大型的Electron应用中,可能会有一个专门的electron-services文件夹,里面存放主进程相关的服务代码,如窗口管理服务、文件系统服务(利用Electron的fs模块)等。在渲染进程中,通过前面提到的预加载脚本或者其他通信机制来调用这些服务,从而实现清晰的架构和更好的代码复用。

electron 中需要注意的安全问题

  1. Electron安全性概述

    • Electron应用的安全性是一个重要的考虑因素,因为它结合了Web技术(HTML、CSS、JavaScript)和本地系统访问权限(通过Node.js)。与传统的纯Web应用相比,Electron应用有更多潜在的安全风险,因为它们可以访问本地文件系统、操作系统功能等。不过,Electron本身也提供了一些机制来帮助开发者构建安全的应用。
  2. 正式开发中需要注意的安全问题及应对措施

    • 进程间通信(IPC)安全
      • 问题:主进程和渲染进程之间的通信通道如果没有正确保护,可能会被恶意利用。例如,攻击者可能会尝试在渲染进程中发送恶意指令到主进程,从而获取敏感信息或者执行有害操作。
      • 应对措施
        • 对IPC消息进行验证和过滤。在主进程接收渲染进程消息时,检查消息的来源和内容是否合法。例如,只接受来自已知渲染进程且符合预定义格式的消息。
        • 使用contextBridge来安全地暴露主进程的API给渲染进程。通过contextBridge.exposeInheritedObject,可以精确控制暴露给渲染进程的功能,避免过度暴露可能导致安全风险的主进程功能。以下是一个示例:
// 在预加载脚本(preload.js)中
const { contextBridge, ipcRenderer } = require('electron');
contextBridge.exposeInheritedObject('electronAPI', {// 只暴露一个安全的函数用于发送消息到主进程sendMessageToMain: (message) => {ipcRenderer.send('message - from - renderer', message);}
});
  • 渲染进程中的脚本安全
    • 问题:渲染进程中的JavaScript代码可能会受到跨站脚本攻击(XSS)。如果应用加载了不可信的外部内容或者用户输入没有得到正确处理,就可能导致恶意脚本在渲染进程中执行。
    • 应对措施
      • 对用户输入进行严格的过滤和转义。在将用户输入插入到HTML页面(如用于显示用户评论、表单提交内容等场景)之前,使用合适的函数进行转义,防止恶意脚本注入。例如,在JavaScript中使用DOMParser来安全地解析和处理HTML内容。
      • 避免使用eval()函数和Function()构造函数,因为它们可以执行任意字符串作为JavaScript代码,这是XSS攻击的一个常见入口点。如果必须使用,要确保输入内容是完全可信的。
      • 限制对外部资源的加载。如果应用不需要加载外部脚本或者样式表,应该避免加载。如果需要加载,要确保来源是可信的,并使用内容安全策略(CSP)来限制脚本的执行范围。例如,可以在HTML页面的<meta>标签中设置CSP,如下:
<meta http-equiv="Content-Security-Policy" content="default-src'self'; script
-src'self'">
  • 本地文件系统访问安全
    • 问题:由于Electron应用可以通过Node.js访问本地文件系统,这可能会导致用户文件的泄露或者被恶意篡改。如果应用没有正确地限制文件访问权限,攻击者可能会利用这个漏洞获取敏感文件(如用户的文档、配置文件等)。
    • 应对措施
      • 最小化文件访问权限。只在必要时才使用Node.js的fs模块访问本地文件系统,并且只访问应用需要的特定文件和目录。例如,如果应用只需要读取一个特定的配置文件,可以明确指定该文件的路径,而不是允许访问整个文件系统。
      • 对用户操作进行权限验证。当用户尝试通过应用执行文件操作(如保存、删除文件等)时,要验证用户是否有相应的权限。这可以通过操作系统提供的用户认证机制或者应用内部的权限管理系统来实现。
      • 加密敏感文件。如果应用存储了敏感的用户数据(如密码、密钥等),在存储到本地文件系统之前,应该使用适当的加密算法进行加密。当需要访问这些文件时,再进行解密。例如,可以使用crypto模块(Node.js内置模块)来进行文件加密和解密操作。
  • 网络访问安全
    • 问题:Electron应用在进行网络访问时,可能会受到中间人攻击、恶意网络请求等安全威胁。例如,应用可能会发送用户的敏感信息(如登录凭证)没有经过加密的网络请求。
    • 应对措施
      • 使用安全的网络协议。对于涉及用户敏感信息的网络通信,如登录、支付等操作,应该使用HTTPS协议而不是HTTP。可以通过检查服务器证书的有效性来确保通信的安全性。
      • 对网络请求进行限制。只允许应用向已知的、可信的服务器发送请求。可以通过配置网络请求的白名单或者使用代理服务器来限制请求的目标。
      • 防止跨域攻击。如果应用与多个不同域的服务器进行交互,要注意防范跨域攻击。可以通过设置合适的跨域策略(如服务器端设置Access-Control-Allow-Origin头)和在客户端正确处理跨域请求来避免安全问题。

相关文章:

Electron 基础+传值+引用+安全

文章目录 概要elctron 生命周期及窗口应用主进程与渲染进程交互技术细节electron 中需要注意的安全问题 概要 一、Electron简介 Electron是一个开源框架&#xff0c;它允许开发者使用JavaScript、HTML和CSS构建跨平台的桌面应用程序。它基于Chromium&#xff08;谷歌浏览器的…...

手机租赁系统全面解析与开发指南

内容概要 手机租赁系统已经成为现代商业中不可或缺的一部分&#xff0c;尤其是在智能手机普及的时代。随着消费者对新机型兴趣的不断增加&#xff0c;大家纷纷走上了“试一试再买”的道路&#xff0c;手机租赁这条路因此越走越宽。这部分的市场需求让创业者们看到了机会。不仅…...

mongoDb的读session和写session权限报错问题

go在使用mongoDb时用到了全局会话&#xff0c;发现在创建的session的逻辑相同&#xff0c;首先会进行数据的查询&#xff0c;此时获取了全局session执行读操作&#xff0c;查询所有文档&#xff0c;则当前会话为读会话&#xff0c;当再去插入时发现会报错&#xff0c;此时sessi…...

Centos在2024年6月30日停止维护后如何换yum源安装组件

现象&#xff1a; 在centos7里使用yum安装报错&#xff1a; Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7&archx86_64&repoos&infrastock error was 14: curl#6 - “Could not resolve…...

阿里云ACP云计算模拟试题(附答案解析)

1、将基础设施作为服务的云计算服务类型是_____服务。 A.laas B.Paas C.SaaS D.Daas 答案&#xff1a;A 解析&#xff1a;基础设施即服务有时缩写为 IaaS&#xff0c;包含云 IT 的基本构建块&#xff0c;通常提供对联网功能、计算机&#xff08;虚拟或专用硬件&#x…...

简单的爬虫脚本编写

一、数据来源分析 想爬取一个网站的数据&#xff0c;我们首先要进行数据分析。通过浏览器F12开发者工具栏进行抓包&#xff0c;可以分析我们想要的数据来源。 通过关键字搜索&#xff0c;可以找到相对应的数据包 二、爬虫实现 需要用到的模块为&#xff1a;request&#xf…...

[MySQL基础](三)SQL--图形化界面+DML

本专栏内容为&#xff1a;MySQL学习专栏 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;MySql &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &#x1f339;&#x1f339;&#x1f339;关注我带你学习编程知识 目录 图…...

11.23[大数据]

PRO1:LSTM模型预测输出都是同一个值&#xff1f; 画出来的图像就是一条横线 这个搜了搜&#xff0c;原因可能有很多&#xff0c;但感觉最主要的原因极可能是激活函数选择不当&#xff0c;以及层的搭建不合适 原模型是 REF https://zhuanlan.zhihu.com/p/654325094 https:/…...

C++ 游戏开发进阶:打造更精彩的游戏世界

在之前的 C 游戏开发入门教程中&#xff0c;我们已经了解了游戏开发的基本概念和一些简单的实现方法。现在&#xff0c;让我们进一步深入探讨 C 游戏开发中的进阶技术&#xff0c;为玩家打造更精彩、更具沉浸感的游戏体验。 一、游戏物理引擎的集成 物理引擎是现代游戏开发中…...

想在iPad上远程操作安卓手机的APP,怎样实现iPad远程控制安卓?

学生党或互联网行业的打工人&#xff0c;人手连三台电子设备也很常见&#xff0c;手机、平板还有笔记本电脑一大堆&#xff0c;如果出门要全带上&#xff0c;背包压力也变大。 有没有想过用远程控制功能&#xff0c;让iPad远程控制安卓手机&#xff1f;这样做&#xff0c;出门就…...

GPS北斗卫星授时服务器功能是什么?应用是什么?

GPS北斗卫星授时服务器功能是什么&#xff1f;应用是什么&#xff1f; GPS北斗卫星授时服务器功能是什么&#xff1f;应用是什么&#xff1f; 摘 要:首先对计算机网络时间同步相关技术进行了介绍,然后阐述了时间同步技术在现代计算机网络中的应用与发展,最后指出时间同步网络…...

利用Java爬虫获取商品数据的完整指南

在当今数字化时代&#xff0c;数据已成为企业和个人决策的关键资源。特别是在电商领域&#xff0c;获取商品数据对于市场分析、价格监控和竞争对手分析至关重要。Java作为一种强大且广泛使用的编程语言&#xff0c;非常适合开发复杂的爬虫系统。本文将详细介绍如何利用Java编写…...

mysql 迁移达梦数据库出现的 sql 语法问题 以及迁移方案

迁移方案&#xff1a; 1.下载官方DM8开发版 产品下载-达梦数据 2.会下载到win系统下的左下角的开始 1.1.2 创建工程 右击空白处&#xff0c;新建 1.1.3 新建迁移 1.1.3.1 选择迁移方式 MySql迁移DM 1.1.3.2 配置数据源 输入你的mysql配置后&#xff0c;刷新&#xff0c;选择…...

深入解析css-浮动-学习小结

浮动设计初衷 类似报纸的布局栏&#xff0c;浮动是为了让图片嵌在文本流中&#xff0c;文本不会覆盖图片&#xff0c;但早期布局只有浮动&#xff0c;因此将浮动用于布局&#xff0c;后来才有了display:inline-block display: table flexbox和网格布局等 基本代码 <html&…...

【机器学习】机器学习的基本分类-无监督学习-K-Means聚类

K-Means 是一种基于划分的无监督学习算法&#xff0c;用于数据聚类任务&#xff0c;它通过迭代优化将数据分组为 k 个互斥的簇&#xff0c;使得每个簇内数据点的相似性最大化&#xff0c;而簇间的相似性最小化。它通过最小化簇内样本点到簇中心的距离平方和&#xff08;即误差平…...

.NET for Android/iOS应用的如何在各自的系统运行

1. .NET for Android 上的运行机制 Android 应用使用 Mono 运行时 或 .NET 运行时 在 Android 设备上执行。具体过程如下&#xff1a; 编译过程&#xff1a; C# 代码编写&#xff1a;开发者使用 C# 编写业务逻辑代码。编译为 IL&#xff1a;C# 代码通过 Roslyn 编译器 转换为…...

访问django后台,提示CSRF验证失败. 请求被中断403

我的项目是在服务器部署添加ip后报错的这个错误是因为 Django 的 CSRF 验证机制检测到请求的 Origin 或 Referer 头部与受信任的域名不匹配。要解决此问题&#xff0c;可以将新域名添加到 Django 的 settings.py 中的 CSRF_TRUSTED_ORIGINS 设置里. 1.非debug模式看到的报错信…...

Scala的隐式转换(1)

package hfd //需求&#xff1a; //完成一个功能&#xff0c;让所有的字符串都能调用isPhone方法&#xff0c;来校验自己是不是一个手机号 object Test37_1 {class StrongString(val str: String) {//开始你的代码def isPhone(): Boolean {val reg "1[3-9]\\d{9}".…...

华为TaurusDB与GaussDB:信创改造的“降本提效”之路

近年来&#xff0c;信创&#xff08;信息技术应用创新&#xff09;已成为中国国央企数字化转型的关键词。伴随这一浪潮&#xff0c;众多企业面临一个迫切问题&#xff1a;如何在兼顾性能与成本的前提下&#xff0c;完成核心系统的迁移改造&#xff1f;华为TaurusDB和GaussDB的加…...

Linux网络编程---本地套接字

1.概述 本地套接字 1&#xff1a;作用:本地的进程间通信 2.有关系的进程间通信 3.没有关系的进程间的通信 本地套结字实现流程和网络套结字实现相似&#xff0c;一般采用tcp 二.通信流程 本地套结字通信的流程:1.服务器端:1.1 int fd socket(AF_UNIX/AF_LOCAL,…...

数据结构之四:堆和二叉树

堆的实现:SData/Heap/heap.c Hera_Yc/bit_C_学习 - 码云 - 开源中国 树 树的概念 树&#xff1a;是一个非线性数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。 把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就…...

【论文阅读】国际开源发展经验及其对我国开源创新体系建设的启示

作者&#xff1a;包云岗老师 包云岗老师是计算机体系结构方向的大牛&#xff0c;推动了体系结构方面的开源事业! 欢迎对本栏目感兴趣的人学习"一生一芯"~ 学习体会&#xff1a; 承接前文&#xff0c;唐志敏老师讲到已有的软硬件生态系统和开发成本制约了对新结构的探…...

redis击穿,穿透,雪崩以及解决方案

目录 击穿 解决方案一 解决方案二 穿透 解决方案 雪崩 解决方案 击穿 指的是单个key在缓存中查不到&#xff0c;去数据库查询&#xff0c;这样如果并发不大或者数据库数据量不大的话是没有什么问题的。 如果数据库数据量大并且是高并发的情况下那么就可能会造成数据库压…...

时频转换 | Matlab格拉姆角和场Gramian angular summation field一维数据转二维图像方法

目录 基本介绍程序设计参考资料获取方式 基本介绍 时频转换 | Matlab格拉姆角和场Gramian angular summation field一维数据转二维图像方法 程序设计 clear clc % close all load x.mat % 导入数据 x x(1:5120); % 本数据只选择5120个点进行分析 fs 6400 ; % 数据采样频…...

qt QCryptographicHash详解

1、概述 QCryptographicHash是Qt框架中提供的一个类&#xff0c;用于实现加密散列函数&#xff0c;即哈希函数。哈希函数能够将任意长度的数据转换为固定长度的哈希值&#xff0c;也称为散列值或数据指纹。这个哈希值通常用于数据的完整性校验、密码存储等场景。QCryptographi…...

亚马逊云科技大语言模型加速OCR应用场景发展

目录 前言Amazon Bedrock关于OCR解决方案Amazon Bedrock进行OCR关键信息提取方案注册亚马逊账号API调用环境搭建 总结 前言 大语言模型是一种基于神经网络的自然语言处理技术&#xff0c;它能够学习和预测自然语言文本中的规律和模式&#xff0c;可以理解和生成自然语言的人工…...

什么是分库?分表?分库分表?

分库分表&#xff0c;是企业里面比较常见的针对高并发、数据量大的场景下的一种技术优化方案&#xff0c;所谓“分库分表”&#xff0c;根本不是一回事&#xff0c;而是三件事&#xff0c;他们要解决的问题也都不一样。 这三个事分别是“只分库不分表”、“只分表不分库”、以…...

QT 中 sqlite 数据库使用

一、前提 --pro文件添加sql模块QT core gui sql二、使用 说明 --用于与数据库建立连接QSqlDatabase--执行各种sql语句QSqlQuery--提供数据库特定的错误信息QSqlError查看qt支持的驱动 QStringList list QSqlDatabase::drivers();qDebug()<<list;连接 sqlite3 数据库 …...

不一样的CSS(4)--icon图标系列之svg

序言 上一节内容我们讲解了如何利用css去画一个五角星&#xff0c;其中包括了使用svg的方法&#xff0c;有些小伙伴们对svg的使用不是很了解&#xff0c;那么本节内容我们主要来讲一下&#xff0c;关于svg标签的的使用。 目录 序言一、svg的介绍二、安装SVG扩展插件三、SVG基…...

Level DB --- Cache

class Cache是Level DB中的重要的数据结构&#xff0c;它是一个LRU&#xff08;Least Recently Used&#xff09; Cache的实现。这里面的判断条件主要是内存大小&#xff08;而不是存储entry的个数&#xff09;。当内存达到上界&#xff0c;会释放不被使用的entry&#xff08;存…...