监控IP,网站将异常情况通过飞书机器人发至指定群内
界面如下,丑是丑了点,但主打一个实用。
主要就是通过ping,就是一直在ping,当不通的时候,就根据你设置的报警时间,主要是利用飞书机器人来给飞书指定群里发异常信息报警。
直接上代码
import subprocess
import time
import requests
import threading
import logging
import tkinter as tk
from tkinter import messagebox, simpledialog
import json
import os
import sys# 获取程序所在目录
if getattr(sys, 'frozen', False): # 如果程序被打包成exePROGRAM_DIR = os.path.dirname(sys.executable) # 使用exe所在目录
else: # 如果是脚本运行PROGRAM_DIR = os.path.dirname(os.path.abspath(__file__)) # 使用脚本所在目录# 日志文件路径
LOG_FILE = os.path.join(PROGRAM_DIR, "ip_monitor.log")
CONFIG_FILE = os.path.join(PROGRAM_DIR, "config.json")# 配置日志
logging.basicConfig(level=logging.INFO,format="%(asctime)s - %(levelname)s - %(message)s",handlers=[logging.FileHandler(LOG_FILE, encoding="utf-8"), # 日志写入文件logging.StreamHandler() # 日志输出到控制台]
)# 输出日志和配置文件的路径,方便调试
logging.info(f"程序所在目录: {PROGRAM_DIR}")
logging.info(f"日志文件路径: {LOG_FILE}")
logging.info(f"配置文件路径: {CONFIG_FILE}")class IPMonitor:def __init__(self):self.running = Falseself.thread = Noneself.start_time = None # 记录监控启动时间self.last_normal_notify_time = {} # 记录每个目标最后一次正常通知的时间def ping_target(self, target, ping_count, ping_size):"""Ping目标(IP或域名),返回是否连通,并在日志中显示详细过程"""try:# 执行Ping命令,捕获输出result = subprocess.run(['ping', '-n', str(ping_count), '-l', str(ping_size), '-w', '1000', target],stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True,creationflags=subprocess.CREATE_NO_WINDOW # 隐藏窗口(仅Windows有效))# 将Ping命令的完整输出写入日志logging.info(f"Ping {target} 过程:\n{result.stdout}")if result.stderr:logging.error(f"Ping {target} 错误:\n{result.stderr}")# 检查输出中是否包含“回复”或“Reply”if "回复" in result.stdout or "Reply" in result.stdout:return Trueelse:return Falseexcept Exception as e:logging.error(f"Ping命令执行错误 {target}: {e}")return Falsedef send_feishu_message(self, webhook_url, message):"""发送飞书群消息"""try:response = requests.post(webhook_url, json={"msg_type": "text", "content": {"text": message}})if response.status_code == 200:logging.info("消息发送成功")else:logging.error(f"消息发送失败: {response.status_code}, {response.text}")except Exception as e:logging.error(f"发送消息错误: {e}")finally:if 'response' in locals():response.close()def monitor_targets(self, target_info_list, webhook_url, monitor_interval, enable_normal_notify, normal_notify_interval, ping_count, ping_size):"""监控目标列表(IP或域名),根据设置发送通知"""while self.running:for target_info in target_info_list:target, comment = target_infoif not self.ping_target(target, ping_count, ping_size):self.send_feishu_message(webhook_url, f"🛑 检测到目标无法访问:{target} ({comment}),请检查!")else:current_time = time.time()# 检查是否启用了正常通知,并且满足时间间隔if enable_normal_notify and (target not in self.last_normal_notify_time or(current_time - self.last_normal_notify_time.get(target, 0)) >= normal_notify_interval * 60):self.send_feishu_message(webhook_url, f"✅ 目标 {target} ({comment}) 正常")self.last_normal_notify_time[target] = current_timelogging.info(f"✅ 目标 {target} ({comment}) 正常")time.sleep(monitor_interval) # 根据设置的间隔检查def start(self, target_info_list, webhook_url, monitor_interval, enable_normal_notify, normal_notify_interval, ping_count, ping_size):"""启动监控"""if self.running:logging.warning("监控已在运行中")returnself.running = Trueself.start_time = time.time() # 记录启动时间self.thread = threading.Thread(target=self.monitor_targets,args=(target_info_list, webhook_url, monitor_interval, enable_normal_notify, normal_notify_interval, ping_count, ping_size))self.thread.daemon = True # 设置为守护线程,主线程退出时自动结束self.thread.start()logging.info("监控已启动")def stop(self):"""停止监控"""self.running = Falseif self.thread:self.thread.join(timeout=1) # 最多等待1秒让线程退出if self.thread.is_alive():logging.warning("监控线程未能及时退出,强制终止")self.start_time = None # 清空启动时间logging.info("监控已停止")class IPMonitorGUI:def __init__(self, root):self.root = rootself.root.title("IP和域名监控工具")self.root.geometry("500x600")self.monitor = IPMonitor()# 加载配置文件self.config = self.load_config()# 飞书Webhook地址输入self.label_webhook = tk.Label(root, text="飞书Webhook地址:")self.label_webhook.pack(pady=5)self.button_set_webhook = tk.Button(root, text="设置飞书Webhook地址", command=self.set_webhook)self.button_set_webhook.pack(pady=5)# 目标(IP或域名)输入框(带滚动条)self.label_target = tk.Label(root, text="需要监控的目标(每行一个,格式:IP/域名 | 备注):")self.label_target.pack(pady=5)self.frame_target = tk.Frame(root)self.frame_target.pack(pady=5)self.text_target = tk.Text(self.frame_target, height=10, width=50)self.text_target.pack(side=tk.LEFT, fill=tk.BOTH)self.scroll_target = tk.Scrollbar(self.frame_target, command=self.text_target.yview)self.scroll_target.pack(side=tk.RIGHT, fill=tk.Y)self.text_target.config(yscrollcommand=self.scroll_target.set)if "target_info_list" in self.config:self.text_target.insert(tk.END, "\n".join([" | ".join(info) for info in self.config["target_info_list"]]))# Ping包次数设置self.label_ping_count = tk.Label(root, text="Ping包次数:")self.label_ping_count.pack(pady=5)self.entry_ping_count = tk.Entry(root)self.entry_ping_count.pack(pady=5)self.entry_ping_count.insert(0, str(self.config.get("ping_count", 1)))# Ping包大小设置self.label_ping_size = tk.Label(root, text="Ping包大小(字节):")self.label_ping_size.pack(pady=5)self.entry_ping_size = tk.Entry(root)self.entry_ping_size.pack(pady=5)self.entry_ping_size.insert(0, str(self.config.get("ping_size", 32)))# 报警时间间隔设置self.label_monitor_interval = tk.Label(root, text="报警时间间隔(秒):")self.label_monitor_interval.pack(pady=5)self.entry_monitor_interval = tk.Entry(root)self.entry_monitor_interval.pack(pady=5)self.entry_monitor_interval.insert(0, str(self.config.get("monitor_interval", 30)))# 正常通知开关self.enable_normal_notify = tk.BooleanVar(value=self.config.get("enable_normal_notify", False))self.check_normal_notify = tk.Checkbutton(root, text="启用正常通知", variable=self.enable_normal_notify)self.check_normal_notify.pack(pady=5)# 正常通知时间间隔设置self.label_normal_notify_interval = tk.Label(root, text="正常通知时间间隔(分钟):")self.label_normal_notify_interval.pack(pady=5)self.entry_normal_notify_interval = tk.Entry(root)self.entry_normal_notify_interval.pack(pady=5)self.entry_normal_notify_interval.insert(0, str(self.config.get("normal_notify_interval", 5)))# 按钮区域self.button_frame = tk.Frame(root)self.button_frame.pack(pady=10)self.button_start = tk.Button(self.button_frame, text="开始监控", command=self.start_monitor)self.button_start.pack(side=tk.LEFT, padx=10)self.button_stop = tk.Button(self.button_frame, text="停止监控", command=self.stop_monitor)self.button_stop.pack(side=tk.LEFT, padx=10)self.button_stop.config(state=tk.DISABLED) # 初始禁用停止按钮# 日志显示区域self.label_log = tk.Label(root, text="日志:")self.label_log.pack(pady=5)self.text_log = tk.Text(root, height=10, width=60)self.text_log.pack(pady=5)# 绑定窗口关闭事件self.root.protocol("WM_DELETE_WINDOW", self.on_closing)def set_webhook(self):"""设置飞书Webhook地址"""webhook_url = simpledialog.askstring("设置飞书Webhook地址", "请输入飞书Webhook地址:")if webhook_url:self.config["webhook_url"] = webhook_urlself.save_config()def load_config(self):"""加载配置文件"""try:if os.path.exists(CONFIG_FILE):with open(CONFIG_FILE, "r", encoding="utf-8") as f:return json.load(f)except Exception as e:logging.error(f"加载配置文件失败: {e}")return {}def save_config(self):"""保存配置文件"""try:# 获取当前目标列表target_info_list = []for line in self.text_target.get("1.0", tk.END).strip().splitlines():if "|" in line:target, comment = map(str.strip, line.split("|", 1))target_info_list.append((target, comment))else:target_info_list.append((line.strip(), "无备注"))self.config["target_info_list"] = target_info_list# 保存其他设置self.config["ping_count"] = int(self.entry_ping_count.get())self.config["ping_size"] = int(self.entry_ping_size.get())self.config["monitor_interval"] = int(self.entry_monitor_interval.get())self.config["enable_normal_notify"] = self.enable_normal_notify.get()self.config["normal_notify_interval"] = int(self.entry_normal_notify_interval.get())with open(CONFIG_FILE, "w", encoding="utf-8") as f:json.dump(self.config, f, ensure_ascii=False, indent=4)logging.info("配置文件已保存")except Exception as e:logging.error(f"保存配置文件失败: {e}")def start_monitor(self):"""启动监控"""webhook_url = self.config.get("webhook_url", "").strip()target_info_list = []for line in self.text_target.get("1.0", tk.END).strip().splitlines():if "|" in line:target, comment = map(str.strip, line.split("|", 1))target_info_list.append((target, comment))else:target_info_list.append((line.strip(), "无备注"))if not webhook_url or not target_info_list:messagebox.showerror("错误", "请设置飞书Webhook地址和填写需要监控的目标!")returntry:ping_count = int(self.entry_ping_count.get())ping_size = int(self.entry_ping_size.get())monitor_interval = int(self.entry_monitor_interval.get())normal_notify_interval = int(self.entry_normal_notify_interval.get())except ValueError:messagebox.showerror("错误", "Ping包次数、Ping包大小和时间间隔必须为整数!")returnself.monitor.start(target_info_list,webhook_url,monitor_interval,self.enable_normal_notify.get(),normal_notify_interval,ping_count,ping_size)self.button_start.config(state=tk.DISABLED)self.button_stop.config(state=tk.NORMAL)self.log("监控已启动")# 保存配置self.save_config()def stop_monitor(self):"""停止监控"""self.monitor.stop()self.button_start.config(state=tk.NORMAL)self.button_stop.config(state=tk.DISABLED)self.log("监控已停止")def log(self, message):"""在日志区域显示消息"""self.text_log.insert(tk.END, message + "\n")self.text_log.see(tk.END)def on_closing(self):"""窗口关闭时确保监控停止"""if self.monitor.running:self.monitor.stop()self.root.destroy()# 启动GUI
if __name__ == "__main__":root = tk.Tk()app = IPMonitorGUI(root)root.mainloop()
直接打包即可使用。打包命令
pyinstaller --onefile --windowed 12.py
相关文章:
监控IP,网站将异常情况通过飞书机器人发至指定群内
界面如下,丑是丑了点,但主打一个实用。 主要就是通过ping,就是一直在ping,当不通的时候,就根据你设置的报警时间,主要是利用飞书机器人来给飞书指定群里发异常信息报警。 直接上代码 import subprocess i…...
JVM 02
今天是2025/03/23 19:07 day 10 总路线请移步主页Java大纲相关文章 今天进行JVM 3,4 个模块的归纳 首先是JVM的相关内容概括的思维导图 3. 类加载机制 加载过程 加载(Loading) 通过类全限定名获取类的二进制字节流(如从JAR包、网络、动态…...
局域网设备访问虚拟机 挂载NFS
目录 引言:网络IP问题配置虚拟机网络有线网络:无线网络: NFS文件挂载服务端配置客户端连接 引言: 需求:局域网下树莓派设备想要访问电脑主机上的虚拟机。这样可以通过nfs挂载网络设备,有利于交叉编译环境调…...
零、ubuntu20.04 安装 anaconda
1.anaconda下载 地址:Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 选择:Anaconda3-2023.07-2-Linux-x86_64.sh 2.anaconda安装 选择下载目录,选在在终端中打开,然后在终端输入安装命…...
IntelliJ IDEA 将 Spring Boot 项目远程部署到服务器
使用 IntelliJ IDEA 将 Spring Boot 项目远程部署到服务器的详细步骤,涵盖多种常见方法: 方法一:通过 SSH Maven 插件直接部署 1. 服务器环境准备 确保服务器已安装: Java 运行环境(与项目 JDK 版本一致࿰…...
利用dify打造命令行助手
利用dify打造命令行助手 前言 我是mac os 的使用者。 如果说macos哪个工具我使用最频繁,最能提高效率的工作工具非zsh莫属(当然,我安装了iterm)。前不久,我要扩容线上的k8s集群。便想统计一下每个node上运行的pod数量。我不知道合适的命令&…...
前端面试整理
一、csshtml 二、js 三、vue 四、react 1.React 类组件与函数式组件核心区别 定义方式的不同,类组件用ES6的class,继承React.Component,而函数式组件用函数声明。 状态管理方面,类组件用this.state和setState,函…...
Perl语言的计算机网络
Perl语言在计算机网络中的应用 引言 在计算机科学的众多领域中,网络编程是一个极具挑战性和广泛应用的领域。在这其中,Perl语言以其强大的文本处理能力和简洁的语法,成为了网络编程的重要工具之一。自从1987年Larry Wall创造Perl以来&#…...
数据结构初阶-二叉树的应用
1.单值二叉树 题目链接:https://leetcode.cn/problems/univalued-binary-tree/description/ 题目思路:我们把根结点与左孩子和右孩子进行比较,只有左右子树都是单值二叉树的时候才为单值二叉树。但是我们需要先返回的是false,最…...
【赵渝强老师】在Docker中运行达梦数据库
Docker是一个客户端服务器(Client-Server)架构。Docker客户端和Docker守护进程交流,而Docker的守护进程是运作Docker的核心,起着非常重要的作用(如构建、运行和分发Docker容器等)。达梦官方提供了DM 8在Doc…...
掌握C#循环:for、while、break与continue详解及游戏案例
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
备份比赛数据【算法赛】
0备份比赛数据【算法赛】 - 蓝桥云课 问题描述 蓝桥杯大赛的组委会最近遇到了一个棘手的问题。他们有 N 台电脑需要备份比赛数据,每台电脑所需的备份时间分别为 A1,A2,…,AN 分钟。 备份必须按编号顺序依次进行,即先第 1 台,再第 2 …...
【算法笔记】图论基础(二):最短路、判环、二分图
目录 最短路松弛操作Dijkstra朴素Dijkstra时间复杂度算法过程例题 堆优化Dijkstra时间按复杂度算法过程例题 bellman-ford时间复杂度为什么dijkstra不能处理负权边?dijkstra的三个步骤:反例失效的原因 算法过程例题 spfa时间复杂度算法过程例题spfa求最短…...
【性能优化点滴】odygrd/quill 中一个简单的标记位作用--降低 IO 次数
在 StreamSink 类中,成员变量 _write_occurred 的作用是 跟踪自上次刷新(Flush)以来是否有写入操作发生,其核心目的是 优化 I/O 性能。以下是详细解析: _write_occurred 的作用 1. 避免不必要的刷新(Flush…...
Unity2022发布Webgl2微信小游戏部分真机黑屏
复现规律: Unity PlayerSetting中取消勾选ShowSplashScreen 分析: 在Unity中,Splash Screen(启动画面) 不仅是视觉上的加载动画,还承担了关键的引擎初始化、资源预加载和渲染环境准备等底层逻辑。禁用后导…...
TDengine 3.3.2.0 集群报错 Post “http://buildkitsandbox:6041/rest/sql“
原因: 初始化时处于内网环境下,Post “http://buildkitsandbox:6041/rest/sql“ 无法访问 修复: vi /etc/hosts将buildkitsandbox映射为本机节点 外网环境下初始化时没有该问题...
基于yolov11的中空圆柱形缺陷检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面
【背景介绍】 中空圆柱形缺陷检测在多个领域具有深远意义。在石油、天然气及化工行业,缺陷检测可预防泄漏事故,避免火灾、爆炸及环境污染,保障人员与财产安全。建筑、桥梁及航空航天领域则依赖此技术确保中空圆柱形结构的稳定性,…...
Python爬虫-爬取AliExpress商品搜索词排名数据
前言 本文是该专栏的第49篇,后面会持续分享python爬虫干货知识,记得关注。 本文,笔者以AliExpress平台为例。基于Python爬虫,通过某个指定的“搜索关键词”,批量获取该“搜索关键词”的商品排名数据。 具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。废…...
20250321在荣品的PRO-RK3566开发板的buildroot系统下使用ll命令【直接编译进IMG】
./buildroot/system/skeleton/etc/profile # some more ls aliases alias llls -alF alias lals -A alias lls -CF 20250321在荣品的PRO-RK3566开发板的buildroot系统下使用ll命令【直接编译进IMG】 2025/3/21 16:53 cd /etc/ echo "" >> # some more ls ali…...
Flink 自定义数据源:从理论到实践的全方位指南
目录 第一章:自定义数据源的基础概念 数据源是什么?它在 Flink 中扮演什么角色? Flink 的内置数据源:开箱即用的 “标配” 为什么需要自定义数据源?它的杀手锏在哪? 第二章:自定义数据源的实现之道 接口选择:从简单到高级,选对工具事半功倍 SourceFunction:入门…...
如何在 Java 中查找 PDF 页面大小(教程)
PDF 文件并未被 Java 直接支持。本教程将向您展示如何使用 JPedal Java PDF 库 以简单的步骤提取 PDF 文件的页面大小(高度和宽度)。页面大小可以以 厘米、英寸或像素 为单位获取。 为什么要使用第三方库处理 PDF 文件? PDF 文件是一种复杂…...
java版嘎嘎快充玉阳软件互联互通中电联云快充协议充电桩铁塔协议汽车单车一体充电系统源码uniapp
演示: 微信小程序:嘎嘎快充 http://server.s34.cn:1888/ 系统管理员 admin/123456 运营管理员 yyadmin/Yyadmin2024 运营商 operator/operator2024 系统特色: 多商户、汽车单车一体、互联互通、移动管理端(开发中) 另…...
使用Mastra.ai构建AI智能体:一次动手实践
Mastra框架提供了一种简洁高效的AI智能体构建方式。 本文将分享我使用Mastra.ai的实践经历。 我们将逐步完成环境搭建、探索框架核心功能,并构建一个能与工具交互的基础智能体。 过程中我会总结成功经验、遇到的问题以及收获的启示。 如果你对AI开发感兴趣,或正在寻找一个…...
Redis之大key问题
BigKey 常见面试题目 你会么? MoreKey 案例 大批量往redis里面插入2000W测试数据key Linux Bash下面执行,批量插入100W for((i1;i<100*10000;i)); do echo "set k$i v$i" >> /tmp/redisTest.txt ;done;生成100W条redis批量设置kv的…...
Excel第41套全国人口普查
2. 导入网页中的表格:数据-现有链接-考生文件夹:网页-找到表格-点击→变为√-导入删除外部链接关系:数据-点击链接-选中连接-删除-确定(套用表格格式-也会是删除外部链接)数值缩小10000倍(除以10000即可&am…...
深度学习驱动的车牌识别:技术演进与未来挑战
一、引言 1.1 研究背景 在当今社会,智能交通系统的发展日益重要,而车牌识别作为其关键组成部分,发挥着至关重要的作用。车牌识别技术广泛应用于交通管理、停车场管理、安防监控等领域。在交通管理中,它可以用于车辆识别、交通违…...
PageHiOffice网页组件(WebOffice文档控件)开发集成技巧专题一
PageHiOffice网页组件作为最新一代的WebOffice文档控件,这是目前市场上唯一能做到在Chrome等最新版浏览器中实现内嵌网页运行的商用文档控件,是OA及ERP等系统处理各种文档的福音。从发布到完善已经超过3年,不管是功能性还是稳定性都已经有了长…...
A2 最佳学习方法
记录自己想法的最好理由是发现自己的想法,并将其组织成可传播的形式 (The best reason for recording what one thinks is to discover what one thinks and to organize it in transmittable form.) Prof Ackoff 经验之谈: 做培训或者写文章ÿ…...
从JVM底层揭开Java方法重载与重写的面纱:原理、区别与高频面试题突破
🌟引言:一场由方法调用引发的"血案" 2018年,某电商平台在"双十一"大促期间遭遇严重系统故障。 技术团队排查发现,问题根源竟是一个继承体系中的方法重写未被正确处理,导致订单金额计算出现指数级…...
线程控制与线程操作
目录 线程的创建 tid pthread_self() 线程的退出 pthread_join 传参问题和返回值问题 pthread_exit 线程取消 线程分离 我们来学习线程的控制与线程操作 线程的创建 我们之前在线程的概念中就讲过了,我们可以通过pthread_create来创建一个或者多个子线程…...
Spring相关API
1是相对路径 2 是绝对路径 3 在注解时使用...
【GoLang】调用llm时提示词prompt的介绍以及使用方式
介绍 提示词是一种与大模型交互的对话格式,它以 JSON 格式定义了一个消息列表(messages),包含了系统消息和用户消息。 我们向AI提问时,其实发给AI的都是提示词,别看我们只是简单输入了一句话,…...
[杂学笔记]锁为什么影响效率、I/O多路复用、三种I/O多路复用模型的区别、atomic原子操作类、MySQL的持久性是如何实现的
目录 1.锁为什么影响效率 2.I./O多路复用 3.三种I/O多路复用模型的区别 4.atomic原子操作类 介绍 常用函数 内存顺序含义 5.MySQL持久性的实现 1.锁为什么影响效率 线程阻塞与上下文切换:在多线程并发访问的场景下,只有一个线程能够进入临界区…...
AI Agent开发大全第八课-Stable Diffusion 3的本地安装全步骤
前言 就像我们前面几课所述,本系列是一门体系化的教学,它不像网上很多个别存在的单篇博客走“吃快餐”模式,而是从扎实的基础来带领大家一步步迈向AI开发高手。所以我们的AI课程设置是相当全面的,除了有牢固的基础知识外还有外面互联网上也搜不到的生产级实战。 前面讲过…...
Leetcode 刷题笔记 图论part05
卡码网 107 寻找存在的路径 初识并查集 并查集功能: 寻找根节点,函数: find(int u),也就是判断这个节点的祖先节点是哪个将两个节点接入到同一个集合,函数: join(int u, int v),将两个节点连在同一个根节点上判断两…...
NSSRound(持续更新)
了解过PHP特性吗 这个题相当于是php特性大杂烩 先看源代码 <?php error_reporting(0); highlight_file(__FILE__); include("rce.php"); $checker_1 FALSE; $checker_2 FALSE; $checker_3 FALSE; $checker_4 FALSE; $num $_GET[num]; if (preg_match(&qu…...
Python虚拟环境:从入门到实战指南
目录 一、为什么需要Python虚拟环境? 二、如何创建Python虚拟环境? 1. 使用venv(Python 3.3内置) 2. 使用virtualenv(第三方工具) 3. 使用conda(适合数据科学项目) 三、虚拟环…...
Python实现小红书app版爬虫
简介:由于数据需求的日益增大,小红书网页版已经不能满足我们日常工作的需求,为此,小编特地开发了小红书手机版算法,方便大家获取更多的数据,提升工作效率。 手机版接口主要包括:搜素࿰…...
注册中心之Nacos相较Eureka的提升分析
1. 传统拉取模式的缺陷(如Eureka) 在类似Eureka的注册中心中,消费者需要定时(如每30秒)主动拉取服务列表(Pull模式)。如果此时某个服务突然宕机,消费者可能无法立即感知,…...
高数下---8.1平面与直线
目录 平面的确定 直线的确定 若要求某一直线或平面就根据要素来求。 例题 平面中的特殊情况 平面中的解题思路 直线的解题思路 平面的确定 两要素 一 一点 二 倾斜角 即法向量 点法式 可化为一般式 Ax By Cz D 0; (A,B,C) 即法向量; 改变D 即…...
【AI速读】30分钟搭建持续集成:用Jenkins拯救你的项目
每个开发者都踩过的坑 你有没有这样的经历?花了一周时间改代码,自信满满准备提交,结果合并同事的更新后,项目突然编译失败,测试跑不通。你焦头烂额地排查问题,老板还在催进度……但明明不是你的错! 这种“集成地狱”几乎每个团队都遇到过。传统的手动集成方式(比如每周…...
centos 9 编译安装 rtpengine (快方式)-使用 debian12 系统自带
1:更新系统包 dnf update 2:启用EPEL仓库(提供额外软件包) # 安装EPEL仓库 sudo dnf install epel-release -y# 检查EPEL仓库是否启用(输出应包含epel) dnf repolist# 启用CRB仓库 sudo dnf config-manager --set-e…...
Android第六次面试总结(okhttp篇)
OkHttp 是一个高效的 HTTP 客户端,它的工作流程包含多个步骤,从请求的创建、发送,到服务器响应的接收和处理,每个环节都有特定的逻辑和组件参与。以下是对 OkHttp 工作流程的详细说明: 1. 请求构建 在使用 OkHttp 发…...
ngx_http_escape_location_name
定义在 src\http\ngx_http.c static ngx_int_t ngx_http_escape_location_name(ngx_conf_t *cf, ngx_http_core_loc_conf_t *clcf) {u_char *p;size_t len;uintptr_t escape;escape 2 * ngx_escape_uri(NULL, clcf->name.data, clcf->name.len,NGX_ESCAPE_U…...
QT网络通信的接口与使用
文章目录 前言1.服务端实现流程1.1步骤 1:创建 QTcpServer 并监听端口1.2步骤 2:处理新连接请求1.3步骤 3:接收客户端数据1.4步骤 4:处理客户端断开 2.客户端实现流程2.1步骤 1:创建 QTcpSocket 并连接服务器2.2步骤 2…...
基于生成对抗网络(GAN)的图像超分辨率重建:技术与应用
图像超分辨率重建(Super-Resolution, SR)是计算机视觉领域的重要任务,旨在从低分辨率图像中恢复出高分辨率图像。这一技术在医学影像、卫星图像、视频增强等领域具有广泛的应用价值。传统的超分辨率方法依赖于插值或基于模型的重建,效果有限。近年来,生成对抗网络(GAN)通…...
【spring对bean Request和Session的管理流程】
在 Spring 框架中,除了常见的 单例(Singleton) 和 原型(Prototype) 作用域外,还支持 Request 和 Session 作用域。这两种作用域主要用于 Web 应用程序中,分别表示 Bean 的生命周期与 HTTP 请求或…...
FastGPT原理分析-数据集创建第二步:处理任务的执行
概述 文章《FastGPT原理分析-数据集创建第一步》已经分析了数据集创建的第一步:文件上传和预处理的实现逻辑。本文介绍文件上传后,数据处理任务的具体实现逻辑。 数据集创建总体实现步骤 从上文可知数据集创建总体上来说分为两大步骤: &a…...
AI重构SEO关键词优化路径
内容概要 人工智能技术的深度应用正在推动SEO优化进入全新阶段。传统关键词优化依赖人工经验与静态规则,存在效率瓶颈与策略滞后性缺陷。AI技术通过智能语义分析系统,能够穿透表层词汇限制,精准捕捉用户搜索意图的语义关联网络,结…...
VMWare Ubuntu 详细安装教程
VMWare Ubuntu 详细安装教程 一、下载安装VMware二、下载 Ubuntu 镜像文件三、安装 Ubuntu四、开启虚拟机 一、下载安装VMware 官网下载地址https://www.vmware.com/products/desktop-hypervisor/workstation-and-fusion知乎大佬的博客原文,含下载地址https://zhua…...