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

单独测试 pyautogui 的鼠标点击功能,确保它能够在当前环境中正常工作,鼠标自动点击的录制回放功能

感谢您提供的详细日志信息。根据您的反馈,问题可能出在 `pyautogui` 没有正确获取鼠标焦点或无法在预期的位置执行点击操作。我们将采取以下步骤来进一步诊断和解决这个问题:

1. **确保 `pyautogui` 正确执行点击操作**:
   - 我们将添加更多的调试信息来确认 `pyautogui` 是否真的尝试执行点击操作。
   - 使用 `pyautogui.position()` 来验证当前鼠标位置是否符合预期。

2. **检查权限和环境限制**:
   - 确保脚本有足够的权限来控制鼠标。
   - 检查是否有任何安全软件阻止了自动化操作。

3. **使用绝对坐标进行测试**:
   - 直接使用绝对坐标调用 `pyautogui.click()` 来确认是否可以执行点击操作。

4. **简化回放逻辑**:
   - 创建一个简单的回放函数,只包含基本的鼠标点击操作,以排除其他因素的影响。

### 第一步:确保 `pyautogui` 正确执行点击操作

我们将在 `_async_play_actions` 方法中添加更多调试信息,并使用 `pyautogui.position()` 来验证当前鼠标位置。

### 第二步:检查权限和环境限制

确保脚本有足够的权限来控制鼠标。您可以尝试以管理员身份运行脚本,或者检查系统设置中的安全性选项。

### 第三步:使用绝对坐标进行测试

直接使用绝对坐标调用 `pyautogui.click()` 来确认是否可以执行点击操作。

### 第四步:简化回放逻辑

创建一个简单的回放函数,只包含基本的鼠标点击操作,以排除其他因素的影响。

以下是更新后的代码,包含了上述改进措施:

### 主要修改点

1. **增加调试信息**:
   - 在 `_async_play_actions` 方法中,增加了对当前位置的验证,即在每次鼠标点击后打印当前鼠标的实际位置。
   - 例如,`current_position = pyautogui.position()` 和 `self.status_callback(f"当前位置: ({current_position.x}, {current_position.y})")`。

2. **使用绝对坐标进行点击**:
   - 在 `pyautogui.mouseDown` 和 `pyautogui.mouseUp` 中指定了具体的坐标位置,确保点击操作在正确的坐标上执行。

3. **其他改进**:
   - 添加了一些注释以便更好地理解代码逻辑。
   - 确保所有输入字段都有合理的默认值和提示。

### 运行代码

确保您的虚拟环境已经激活,然后运行脚本:

```sh
python 666.py
```

### 调试步骤

1. **录制和回放**:
   - 使用 `AutomaticClickerApp` 进行录制。
   - 查看状态面板中的输出,确认所有动作都被正确记录。
   - 开始回放,并再次查看状态面板中的输出,确认每个动作都被正确执行。
   - 特别注意每次鼠标点击后的“当前位置”信息,确认它与预期的点击位置一致。

2. **手动测试点击**:
   - 手动在终端或命令行中运行以下命令,确保 `pyautogui` 可以正确执行点击操作:
     ```sh
     python -c "import pyautogui; pyautogui.click(x=100, y=100)"
     ```
   - 观察屏幕上的鼠标点击行为,确认点击操作是否在预期的位置发生。

通过这些步骤,我们应该能够确定问题的具体原因。如果仍然存在问题,请提供更多的详细信息,例如录制的动作列表和回放时的状态面板输出,特别是“当前位置”的信息,以便进一步诊断问题。

import tkinter as tk
from tkinter import ttk, filedialog
import pyautogui
import time
import threading
from pynput import mouse, keyboardclass ActionManager:def __init__(self):self.actions = []def add_action(self, action):current_time = time.time()if self.actions:action["time"] = current_time - self.actions[-1]["timestamp"]else:action["time"] = 0action["timestamp"] = current_timeself.actions.append(action)def clear_actions(self):self.actions.clear()def get_actions(self):return self.actionsdef save_to_file(self, filepath):with open(filepath, 'w') as file:for action in self.actions:file.write(str(action) + '\n')def load_from_file(self, filepath):self.actions.clear()with open(filepath, 'r') as file:for line in file:action = eval(line.strip())self.actions.append(action)class EventListener:def __init__(self, action_manager, update_callback, f6_callback):self.action_manager = action_managerself.recording = Falseself.mouse_listener = Noneself.keyboard_listener = Noneself.update_callback = update_callbackself.f6_callback = f6_callbackdef start_recording(self):self.recording = Trueself.mouse_listener = mouse.Listener(on_click=self.on_mouse_click,on_scroll=self.on_mouse_scroll)self.keyboard_listener = keyboard.Listener(on_press=self.on_key_press)self.mouse_listener.start()self.keyboard_listener.start()def stop_recording(self):self.recording = Falseif self.mouse_listener:self.mouse_listener.stop()if self.keyboard_listener:self.keyboard_listener.stop()def on_mouse_click(self, x, y, button, pressed):if self.recording:action = self.action_manager.add_action({"type": "mouse_click","position": (x, y),"button": str(button).split('.')[1],"pressed": pressed})self.update_callback(action)def on_mouse_scroll(self, x, y, dx, dy):if self.recording:action = self.action_manager.add_action({"type": "mouse_scroll","position": (x, y),"dx": dx,"dy": dy})self.update_callback(action)def on_key_press(self, key):if self.recording:try:if hasattr(key, 'char'):action = self.action_manager.add_action({"type": "key_press", "key": key.char})else:action = self.action_manager.add_action({"type": "key_press", "key": f"{key}"})self.update_callback(action)except AttributeError:passelif key == keyboard.Key.f6:self.f6_callback()class Controller:def __init__(self, action_manager, event_listener, status_callback):self.action_manager = action_managerself.event_listener = event_listenerself.is_running = Falseself.play_thread = Noneself.status_callback = status_callbackdef start_playing(self, repeat_times, interval, delay):if not self.is_running and self.action_manager.get_actions():self.is_running = Trueself.status_callback("开始回放...")self.play_thread = threading.Thread(target=self._async_play_actions, args=(repeat_times, interval, delay))self.play_thread.start()def stop_playing(self):self.is_running = Falseself.status_callback("停止回放")if self.play_thread and self.play_thread is not threading.current_thread() and self.play_thread.is_alive():self.play_thread.join()def _async_play_actions(self, repeat_times, interval, delay):actions = self.action_manager.get_actions()time.sleep(delay / 1000)  # Convert ms to secondswhile self.is_running:start_time = time.time()for i, action in enumerate(actions):if not self.is_running:breaktime.sleep(max(0, action["time"]))if action["type"] == "key_press":pyautogui.press(action["key"])self.status_callback(f"按键: {action['key']} (索引: {i})")elif action["type"] == "mouse_click":if action["pressed"]:pyautogui.mouseDown(button=action["button"], x=action["position"][0], y=action["position"][1])else:pyautogui.mouseUp(button=action["button"], x=action["position"][0], y=action["position"][1])self.status_callback(f"鼠标点击 ({action['position'][0]}, {action['position'][1]}), 按钮: {action['button']}, 状态: {'按下' if action['pressed'] else '释放'} (索引: {i})")# 验证当前位置current_position = pyautogui.position()self.status_callback(f"当前位置: ({current_position.x}, {current_position.y})")elif action["type"] == "mouse_scroll":pyautogui.scroll(action["dy"], *action["position"])self.status_callback(f"鼠标滚轮 ({action['position'][0]}, {action['position'][1]}), 变量: ({action['dx']}, {action['dy']}) (索引: {i})")if repeat_times != 999:repeat_times -= 1if repeat_times <= 0:self.stop_playing()else:time.sleep(interval)class AutomaticClickerApp(tk.Tk):def __init__(self):super().__init__()self.title("增强版自动点击器")self.geometry("1200x800")self.interval = 1.0  # 默认间隔时间1秒self.repeat_times = 1  # 默认重复次数1次self.delay = 0  # 默认延迟为0msself.action_manager = ActionManager()self.event_listener = EventListener(self.action_manager, self.update_action_listbox, self.cycle_clicks)self.controller = Controller(self.action_manager, self.event_listener, self.update_status_panel)self.create_widgets()def create_widgets(self):# 设置主框架main_frame = ttk.Frame(self)main_frame.pack(fill=tk.BOTH, expand=True)# 录制和回放控制区control_frame = ttk.Frame(main_frame)control_frame.pack(side=tk.LEFT, fill=tk.Y, padx=10, pady=10)# 每次鼠标点击的间隔时间interval_frame = ttk.Frame(control_frame)interval_label = ttk.Label(interval_frame, text="每次操作的间隔时间(秒):")self.interval_entry = ttk.Entry(interval_frame, width=5)self.interval_entry.insert(0, str(self.interval))  # 默认值1秒interval_label.grid(row=0, column=0, padx=(10, 0), pady=(10, 0))self.interval_entry.grid(row=0, column=1, padx=(0, 10), pady=(10, 0))interval_frame.pack(padx=10, fill=tk.X)# 重复次数repeat_times_frame = ttk.Frame(control_frame)repeat_times_label = ttk.Label(repeat_times_frame, text="重复次数:")self.repeat_times_entry = ttk.Entry(repeat_times_frame, width=5)self.repeat_times_entry.insert(0, str(self.repeat_times))  # 默认1次repeat_times_label.grid(row=0, column=0, padx=(10, 0), pady=(10, 0))self.repeat_times_entry.grid(row=0, column=1, padx=(0, 10), pady=(10, 0))repeat_times_frame.pack(padx=10, fill=tk.X)# 延迟delay_frame = ttk.Frame(control_frame)delay_label = ttk.Label(delay_frame, text="延迟(ms):")self.delay_entry = ttk.Entry(delay_frame, width=5)self.delay_entry.insert(0, str(self.delay))  # 默认0msdelay_label.grid(row=0, column=0, padx=(10, 0), pady=(10, 0))self.delay_entry.grid(row=0, column=1, padx=(0, 10), pady=(10, 0))delay_frame.pack(padx=10, fill=tk.X)# 录制按钮record_button = ttk.Button(control_frame, text="开始/停止录制", command=self.toggle_recording)record_button.pack(pady=(10, 0))# 清除录制按钮clear_button = ttk.Button(control_frame, text="清除录制", command=self.clear_recorded_actions)clear_button.pack(pady=(10, 0))# 回放按钮play_button = ttk.Button(control_frame, text="开始回放", command=self.start_playing)play_button.pack(pady=(10, 0))# 保存录制的动作到文件save_button = ttk.Button(control_frame, text="保存录制的动作", command=self.save_recorded_actions)save_button.pack(pady=(10, 0))# 加载录制的动作从文件load_button = ttk.Button(control_frame, text="加载录制的动作", command=self.load_recorded_actions)load_button.pack(pady=(10, 0))# 停止按钮self.stop_button = ttk.Button(control_frame, text="停止", command=self.stop_playing, state=tk.DISABLED)self.stop_button.pack(padx=10, pady=(10, 0))# 状态面板status_frame = ttk.Frame(main_frame)status_frame.pack(side=tk.BOTTOM, fill=tk.X, padx=10, pady=10)self.status_text = tk.Text(status_frame, wrap=tk.WORD, height=10, width=100)self.status_text.pack(expand=True, fill=tk.BOTH, padx=10, pady=10)# 记录的动作列表self.action_listbox = tk.Listbox(main_frame, height=30, width=100)self.action_listbox.pack(pady=(10, 0), fill=tk.BOTH, expand=True)def toggle_recording(self):if self.event_listener.recording:self.event_listener.stop_recording()self.update_action_listbox()self.update_status_panel("录制已停止")else:self.event_listener.start_recording()self.update_status_panel("正在录制... 按 F7 结束录制")def update_action_listbox(self, action=None):self.action_listbox.delete(0, tk.END)for action in self.action_manager.get_actions():formatted_action = self.format_action(action)self.action_listbox.insert(tk.END, formatted_action)def format_action(self, action):if action["type"] == "mouse_click":press_state = "按下" if action["pressed"] else "释放"return f"鼠标点击 ({action['position'][0]}, {action['position'][1]}), 按钮: {action['button']}, 状态: {press_state}"elif action["type"] == "mouse_scroll":return f"鼠标滚轮 ({action['position'][0]}, {action['position'][1]}), 变量: ({action['dx']}, {action['dy']})"elif action["type"] == "key_press":return f"按键: {action['key']}"return ""def start_playing(self):try:interval = float(self.interval_entry.get())repeat_times = int(self.repeat_times_entry.get())delay = int(self.delay_entry.get())except ValueError:self.update_status_panel("请输入有效的数值。")returnself.controller.start_playing(repeat_times, interval, delay)self.stop_button["state"] = tk.NORMALdef stop_playing(self):self.controller.stop_playing()self.stop_button["state"] = tk.DISABLEDdef save_recorded_actions(self):file_path = filedialog.asksaveasfilename(defaultextension=".txt",filetypes=[("文本文件", "*.txt"),("所有文件", "*.*")])if file_path:self.action_manager.save_to_file(file_path)self.update_status_panel(f"动作已保存到 {file_path}")def load_recorded_actions(self):file_path = filedialog.askopenfilename(filetypes=[("文本文件", "*.txt"),("所有文件", "*.*")])if file_path:self.action_manager.load_from_file(file_path)self.update_action_listbox()self.update_status_panel(f"动作已从 {file_path} 加载")def cycle_clicks(self):if self.action_manager.get_actions():self.controller.start_playing(999, 0, 0)  # 循环点击,无间隔,无延迟self.update_status_panel("循环点击启动")def clear_recorded_actions(self):self.action_manager.clear_actions()self.update_action_listbox()self.update_status_panel("录制已清除")def update_status_panel(self, message):current_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())self.status_text.insert(tk.END, f"[{current_time}] {message}\n")self.status_text.see(tk.END)if __name__ == "__main__":app = AutomaticClickerApp()app.mainloop()

相关文章:

单独测试 pyautogui 的鼠标点击功能,确保它能够在当前环境中正常工作,鼠标自动点击的录制回放功能

感谢您提供的详细日志信息。根据您的反馈&#xff0c;问题可能出在 pyautogui 没有正确获取鼠标焦点或无法在预期的位置执行点击操作。我们将采取以下步骤来进一步诊断和解决这个问题&#xff1a; 1. **确保 pyautogui 正确执行点击操作**&#xff1a; - 我们将添加更多的调…...

图片底部空白缝隙解决法方案(CSS)

当我想实现一个垂直轮播图时&#xff0c;图片底部会出现一个空白缝隙导致切换轮播图片显示不完整。 这里可以用两个方法解决 一、给图片添加(垂直对齐)vertical-align:baseline|middle|top; vertical-align属性的值可以是 &#xff08;1&#xff09;关键字值:baseline|midd…...

URI 未注册(设置 语言和框架 架构和 DTD)

一、问题描述&#xff1a;在springboot项目中的resources中新建mybatis-config.xml文件时&#xff0c;从mybatis文档中复制的代码报错&#xff1a;URI 未注册(设置 | 语言和框架 | 架构和 DTD) 二、解决&#xff1a;在Springboot项目的设置->架构和DTD中添加 红色的网址&…...

STL-string类

目录 string类的意义 C语言原始的字符串 字符串类题目 string类 string类文档 auto和范围for auto是个关键字 范围for string类的接口 string的模拟实现 浅拷贝 深拷贝 写时拷贝 string类的意义 C语言原始的字符串 字符串是以\0结尾的字符的合集,为了方便操作,C标准库提…...

HTML前端开发-- Iconfont 矢量图库使用简介

一、SVG 简介及基础语法 1. SVG 简介 SVG&#xff08;Scalable Vector Graphics&#xff09;是一种基于 XML 的矢量图形格式&#xff0c;用于在网页上显示二维图形。SVG 图形可以无限缩放而不会失真&#xff0c;非常适合用于图标、图表和复杂图形。SVG 文件是文本文件&#x…...

C++的一些经典算法

以下是C的一些经典算法&#xff1a; 一、排序算法 冒泡排序&#xff08;Bubble Sort&#xff09; 原理&#xff1a; 它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换…...

LNMP和Discuz论坛

文章目录 LNMP和Discuz论坛1 LNMP搭建1.1 编译安装nginx服务1.1.1 编译安装1.1.2 添加到系统服务 1.2 编译安装MySQL服务1.2.1 准备工作1.2.2 编辑配置文件1.2.3 设置路径环境变量1.2.4 数据库初始化1.2.5 添加mysqld系统服务1.2.6 修改mysql的登录密码 1.3 编译安装PHP服务1.3…...

华为开源自研AI框架昇思MindSpore应用案例:基于MindSpore框架的SGD优化器案例实现

SGD优化器基本原理讲解 随机梯度下降&#xff08;SGD&#xff09;是一种迭代方法&#xff0c;其背后基本思想最早可以追溯到1950年代的Robbins-Monro算法&#xff0c;用于优化可微分目标函数。 它可以被视为梯度下降优化的随机近似&#xff0c;因为它用实际梯度&#xff08;从…...

μC/OS-Ⅱ源码学习(3)---事件模型

快速回顾 μC/OS-Ⅱ中的多任务 μC/OS-Ⅱ源码学习(1)---多任务系统的实现 μC/OS-Ⅱ源码学习(2)---多任务系统的实现(下) 本文开始&#xff0c;进入事件源码的学习。 事件模型 在一个多任务系统里&#xff0c;各个任务在系统的统筹下相继执行&#xff0c;由于执行速度极快&a…...

UnityShaderLab 实现黑白着色器效果

实现思路&#xff1a;取屏幕像素的RGB值&#xff0c;将三个通道的值相加&#xff0c;除以一个大于值使颜色值在0-1内&#xff0c;再乘上一个强度值调节黑白强度。 在URP中实现需要开启Opaque Texture ShaderGraph实现&#xff1a; ShaderLab实现&#xff1a; Shader "Bl…...

【Linux】文件管理必备知识和基本指令

【Linux】文件管理必备知识和基本指令 什么是操作系统什么是文件什么是路径01. ls 指令02. pwd命令03. cd 指令04. touch指令05.mkdir指令&#xff08;重要&#xff09;&#xff1a;06.rmdir指令 && rm 指令&#xff08;重要&#xff09;&#xff1a;rmdir指令rm指令 0…...

移远EC200A-CN的OPENCPU使用GO开发嵌入式程序TBOX

演示地址&#xff1a; http://134.175.123.194:8811 admin admin 演示视频&#xff1a; https://www.bilibili.com/video/BV196q2YQEDP 主要功能 WatchDog 1. 守护进程 2. OTA远程升级 TBOX 1. 数据采集、数据可视化、数据上报&#xff08;内置Modbus TCP/RTU/ASCII,GPS协…...

CSS 浮动定位

浮动定位 float : 浮动定位 left 左浮动right 右浮动 clear : 清除浮动 leftrightboth 浮动定位会导致 元素脱离正常文档流 、 对应的 父 元素 也可能会产生 高度坍塌 。 解决 父元素 高度坍塌的方案有&#xff1a; 1&#xff09; 父元素 添加 overflow , 值 为 除 visible 之…...

vmware vsphere5---部署vCSA(VMware vCenter Server)附带第二阶段安装报错解决方案

声明 因为这份文档我是边做边写的&#xff0c;遇到问题重新装了好几次所以IP会很乱 ESXI主机为192.168.20.10 VCSA为192.168.20.7&#xff0c;后台为192.168.20.7:5480 后期请自行对应&#xff0c;后面的192.168.20.57请对应192.168.20.7&#xff0c;或根据自己的来 第一阶段…...

Android Webview 详解

一 简介 一个基于webkit引擎、展现web页面的控件 Android 4.4前&#xff1a;Android Webview在低版本 & 高版本采用了不同的webkit版本的内核Android 4.4后&#xff1a;直接使用了Chrome内核 1.1 作用 在 Android 客户端上加载h5页面在本地 与 h5页面实现交互 & 调用…...

如何使用程序查询域名whois信息?

直接使用TCP协议向WHOIS服务器的43端口发送查询请求即可返回WHOIS信息。 一些国际域名(.COM/.NET/.CC等)需要继续向各注册商的WHOIS服务服务发送查询请求来获取详细信息。 大部分New gTLD来说&#xff0c;服务器是“whois.nic.[后缀]”&#xff0c;例如.red的WHOIS服务器为whoi…...

解决view-ui-plus 中表单验证不通过问题,select 组件开启multiple模式 总是提示错误,即使不验证也提示,有值也验证失败

&#x1f609; 你好呀&#xff0c;我是爱编程的Sherry&#xff0c;很高兴在这里遇见你&#xff01;我是一名拥有十多年开发经验的前端工程师。这一路走来&#xff0c;面对困难时也曾感到迷茫&#xff0c;凭借不懈的努力和坚持&#xff0c;重新找到了前进的方向。我的人生格言是…...

复杂系统如何架构?

一张图看懂整个后端系统架构 下图展示了整个后端系统架构&#xff0c;包括数据库、应用服务器、API网关等&#xff0c;展示了它们是如何协同工作的。 一些小贴士 CDN是现代互联网架构中不可或缺的一部分&#xff0c;特别是对于那些需要向全球用户提供高性能和高可用性服务的网站…...

leetcode 3224. 使差值相等的最少数组改动次数

题目链接&#xff1a;3224. 使差值相等的最少数组改动次数 题目&#xff1a; 给你一个长度为 n 的整数数组 nums &#xff0c;n 是偶数 &#xff0c;同时给你一个整数 k 。 你可以对数组进行一些操作。每次操作中&#xff0c;你可以将数组中任一元素替换为 0 到 k 之间的任一…...

C# 小案例(IT资产管理系统)

开发工具&#xff1a;visual studio 2022 语言&#xff1a;C# 数据库&#xff1a;Sql Server 2008 页面展示 一、登录 二、主窗体 三、用户管理 四、资产管理 五、关于 Java版地址&#xff1a;基于若依开发物品管理系统(springbootvue)_若依物品管理系统-CSDN博客 Python版…...

React第十四节useState使用详解差异

一、useState() Hook 使用 useState视图更新用法 1、写法&#xff1a; import { useState } from react const [name, setName] useState(Andy)利用数组解构写法&#xff0c; 第一个参数是自定义的属性&#xff0c;用于初始化时候渲染&#xff0c;如上面代码&#xff0c;初…...

ubuntu 安装 docker详细教程

1. 准备工作 1.1系统更新 sudo apt update sudo apt upgrade -y 1.2 检查系统版本 lsb_release -a 2.安装docker 2.1. 安装依赖 sudo apt install apt-transport-https ca-certificates curl software-properties-common 2.2 添加docker 官方GPG密钥 curl -fsSL https…...

图书管理系统|Java|SSM|JSP| 前后端分离

【一】可以提供远程部署安装&#xff0c;包扩环境 【二】提供软件相关的安装包 【三】如果需要提供java入门资料可咨询 【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、M…...

Apache Echarts和POI

目录 Apache ECharts 介绍 入门 绘制一个简单的图表 Apache POI 介绍 通过POI创建Excel文件并且写入文件内容 通过POI读取Excel文件中的内容 导出Excel表格 Apache ECharts 介绍 Apache ECharts 是一款基于 Javascript 的数据可视化图表库&#xff0c;提供直观&#xf…...

ubuntu下的chattts 学习8(结束):长文本的语音转换优化及总结

代码 import ChatTTS import torch import numpy as np import torchaudio import re# 设置环境变量以避免内存碎片化 import os os.environ[PYTORCH_CUDA_ALLOC_CONF] expandable_segments:True# 使用 CPU 进行计算 device torch.device(cpu)chat ChatTTS.Chat() chat.loa…...

Luckysheet 实现 excel 多人在线协同编辑(全功能实现增强版)

前言 感谢大家对 Multi person online edit(多人在线编辑器) 项目的支持&#xff0c;mpoe 项目使用 quill、luckysheet、canvas-editor 实现的 md、excel、word 在线协同编辑&#xff0c;欢迎大家Fork 代码&#xff0c;多多 Start哦~ Multi person online edit 多人协同编辑器…...

最新VMware Workstation Pro领先的免费桌面虚拟化软件基于 x86 的 Windows 桌面虚拟化软件下载安装保姆级教程,直接下载,持续更新

目录 说明 安装程序下载 方法一&#xff1a;直接下载 方法二&#xff1a;官网下载 安装教程 说明 这几天重装电脑&#xff0c;想装VMware Workstation&#xff0c;搜了之后才发现它竟然对个人用户免费了&#xff0c;一个字&#xff1a;爽&#xff01;终于可以结束百度序列号…...

GitHub使用

太久不用GitHub发现自己又有些不会了&#xff0c;突发奇想为何不把每次看到的有指导意义的博客收录一下以便下次查阅呢 如何上传文件夹到GitHub上&#xff08;配图详解&#xff09;&#xff1f;_github上傳資料夾-CSDN博客 github上如何删除自己的仓库_github删除仓库-CSDN博…...

阿里云服务器Linux(centos)系统安装nginx1.20.2

阿里云服务器Linux(centos)系统安装nginx1.20.2 1.安装依赖包 一共要安装4种依赖&#xff08;基于c语言&#xff09; yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel2.下载nginx安装包并解压安装包 nginx官网下载&#xff1a;http://nginx.org/en/do…...

linux 用户名密码设置

安装linux时默认的密码最小长度是5个字节&#xff0c;但这并不够&#xff0c;要把它设为8个字节。修改最短密码长度需要编辑login.defs文件#vi /etc/login.defs PASS_MAX_DAYS 99999 #&#xff03;密码设置最长有效期&#xff08;默认值) PASS_MIN_DAYS 0 ##密…...

MySQL是否可以配合Keepalived实现高可用

MySQL是否可以配合Keepalived实现高可用 是的&#xff0c;MySQL 可以配合 Keepalived 实现高可用性。通常&#xff0c;使用 Keepalived 与 MySQL 配合的方式主要是通过配置 虚拟IP&#xff08;VIP&#xff09; 来实现主从数据库的自动切换&#xff0c;从而保证在主数据库宕机时…...

windows下 mysql开启 binlog日志

一、查看是否开启 binlog -- 方式一 show binary logs;-- 方式二 show VARIABLES like log_bin 说明没有开启 方式一 &#xff1a;you are not using binary logging 方式二&#xff1a;log_bin off 二、编辑 my.ini 配置文件 默认安装地点位于&#xff1a;C:\ProgramDat…...

59. 螺旋矩阵 II

59. 螺旋矩阵 II class Solution { public:vector<vector<int>> generateMatrix(int n) {// for(int i0;i<n;i){ 这样的遍历方式不对// for(int j 0;j<n;j){// generateMatrix[i][j] // }// } //初始化矩阵vector<vector<int&…...

XML 查看器:深入理解与高效使用

XML 查看器&#xff1a;深入理解与高效使用 XML&#xff08;可扩展标记语言&#xff09;是一种用于存储和传输数据的标记语言。它通过使用标签来定义数据结构&#xff0c;使得数据既易于人类阅读&#xff0c;也易于机器解析。在本文中&#xff0c;我们将探讨 XML 查看器的功能…...

JDBC学习

配置文件 application.yml spring: datasource: username: root password: 123456 url: jdbc:mysql://localhost:3306/rbac?useUnicodetrue&characterEncodingutf-8&serverTimezoneUTC driver-class-name: com.mysql.jdbc.Driverrbac为我自己本地的数据库&…...

单元测试

junit5中五个方法为&#xff1a;Test、BeforeEach&#xff08;修饰实例方法&#xff0c;在测试方法开始之前执行&#xff09;、AfterEach&#xff08;修饰实例方法&#xff0c;在测试方法完成之后开始执行&#xff09;、BeforeAll&#xff08;修饰静态static方法&#xff0c;在…...

24/12/9 算法笔记<强化学习> PPO,DPPO

PPO是目前非常流行的增强学习算法&#xff0c;OpenAI把PPO作为目前baseline算法&#xff0c;首选PPO&#xff0c;可想而知&#xff0c;PPO可能不是最强的&#xff0c;但是是最广泛的。 PPO是基于AC架构&#xff0c;因为AC架构有一个好处&#xff0c;就是解决了连续动作空间的问…...

spring boot通过连接池的方式连接时序库IotDB

1、maven依赖 <dependency><groupId>org.apache.iotdb</groupId><artifactId>iotdb-session</artifactId><version>1.3.2</version></dependency>2、配置文件 iotdb:server:url: localhostport: 6667name: rootpwd: rootmax…...

maven多模块开发

目录 聚合 可选依赖 排除依赖 属性 打包 聚合 聚合就是将多个模块组成一个整体&#xff0c;进行项目构建。聚合工程&#xff08;也称为多模块项目&#xff09;是 Maven 的一种项目结构&#xff0c;它允许将一个大型项目拆分为多个较小的、更易于管理的子模块。每个子模块…...

Kubernetes Nginx-Ingress | 禁用HSTS/禁止重定向到https

目录 前言禁用HSTS禁止重定向到https关闭 HSTS 和设置 ssl-redirect 为 false 的区别 前言 客户请求经过ingress到服务后&#xff0c;默认加上了strict-transport-security&#xff0c;导致客户服务跨域请求失败&#xff0c;具体Response Headers信息如下&#xff1b; 分析 n…...

华为eNSP:VRRP

一、VRRP背景概述 在现代网络环境中&#xff0c;主机通常通过默认网关进行网络通信。当默认网关出现故障时&#xff0c;网络通信会中断&#xff0c;影响业务连续性和稳定性。为了提高网络的可靠性和冗余性&#xff0c;采用虚拟路由冗余协议&#xff08;VRRP&#xff09;是一种…...

linux 安装composer

下载composer curl -sS https://getcomposer.org/installer | php下载后设置环境变量&#xff0c;直接通过命令composer -v mv composer.phar /usr/local/bin/composer查看版本看是否安装成功 composer -v...

ESP32-S3模组上跑通ES8388(24)

接前一篇文章:ESP32-S3模组上跑通ES8388(23) 二、利用ESP-ADF操作ES8388 2. 详细解析 上一回解析完了es8388_init函数中的第8段代码,本回继续往下解析。为了便于理解和回顾,再次贴出es8388_init函数源码,在components\audio_hal\driver\es8388\es8388.c中,如下: ​ …...

类文件具有错误的版本 61.0, 应为 55.0 请删除该文件或确保该文件位于正确的类路径子目录中。

类文件具有错误的版本 61.0, 应为 55.0 请删除该文件或确保该文件位于正确的类路径子目录中。 这个错误表明你的项目尝试加载的 .class 文件&#xff08;编译好的 Java 类&#xff09;是用比你的运行环境支持更高版本的 Java 编译的。具体来说&#xff1a; 版本 61.0 对应 Ja…...

AI 的时代,新科技和新技术如何推动跨学科的整合?

在当前AI的发展中&#xff0c;我们面临的一个主要挑战就是融合的问题&#xff0c;这实际上不仅是技术上的融合&#xff0c;还有更深层次的哲学层面的思考。 或许在中国这方面的讨论较少&#xff0c;但在西方哲学和神学的语境中&#xff0c;探讨万物的根本和不同学科之间的联系…...

12.9-12.16学习周报

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 摘要Abstract一、SNN与传统ANN的比较1.SNN概述2.SNN神经元和ANN的比较结构3.spikingjelly1.数据格式2.状态的保存和重置3.传播模式4.神经元 二、图数据库1.图数据库…...

CanFestival移植到STM32 F4芯片(基于HAL库)

本文讲述如何通过简单操作就可以把CanFestival库移植到STM32 F4芯片上&#xff0c;作为Slave设备。使用启明欣欣的工控板来做实验。 一 硬件连接 观察CAN报文需要专门的设备&#xff0c;本人从某宝上买了一个兼容PCAN的开源小板子&#xff0c;二十几块钱&#xff0c;通过USB接…...

构建安全的数据库环境:群晖NAS安装MySQL和phpMyAdmin详细步骤

文章目录 前言1. 安装MySQL2. 安装phpMyAdmin3. 修改User表4. 本地测试连接MySQL5. 安装cpolar内网穿透6. 配置MySQL公网访问地址7. 配置MySQL固定公网地址8. 配置phpMyAdmin公网地址9. 配置phpmyadmin固定公网地址 前言 本文将详细讲解如何在群晖NAS上安装MySQL及其数据库管理…...

相机(Camera)硬件组成详解

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 写在前面&#xff1a;可以去B站观看一些相机原理的视频来配合学习&#xff0c;这里推荐&#xff1a;推荐1&#xff0c;推荐2&#xff0c;推荐3 相机&#xff08;Camera&#xff09;是一种复杂的光…...

【Linux———基础IO】

每一滴眼泪&#xff0c;每一次心碎&#xff0c;什么爱能无疚无悔.......................................................................... 文章目录 前言 一、【认识文件I/O】 1.1、【回顾C语言文件I/O】 1.2、【操作系统文件I/O】 1.2.1、【open函数】 1、【open函数的三…...