C#学写了一个程序记录日志的方法(Log类)
1.错误和警告信息单独生产文本进行记录;
2.日志到一定内存阈值可以打包压缩,单独存储起来,修改字段MaxLogFileSizeForCompress的值即可;
3.Log类调用举例:Log.Txt(JB.信息,“日志记录内容”,"通道1");
using System;
using System.IO;
using System.Windows.Forms;
using ICSharpCode.SharpZipLib.Zip;namespace _程序日志
{// 定义日志级别枚举,虽然取消了日志级别过滤功能,但保留该枚举方便后续可能的扩展public enum JB{错误, //ERROR,代表程序运行过程中出现的错误情况,通常是需要重点关注和排查问题的日志级别警告, //WARN,用于表示程序运行时出现的一些可能会引发问题的异常情况,但不像错误那样严重,起到提醒作用信息, //INFO,一般记录程序正常运行过程中的一些常规信息,用于记录流程、状态等内容调试 //DEBUG,主要用于开发阶段,帮助开发者调试程序,输出更详细的程序执行过程信息}public class Log{// 日志文件基础路径,可通过配置等方式修改,这里指定了默认的基础路径,后续所有日志文件都会基于此路径进一步构建具体的文件路径private static string _logFilePath = "D:\\Logs\\程序日志";// 日志文件大小阈值,这里可按需调整,单位为字节,当日志文件达到这个大小后,会触发相应的文件压缩等处理逻辑private static long MaxLogFileSizeForCompress = 100 * 1024 * 1024;// 存放压缩日志文件的文件夹路径,可按需配置,用于存放经过压缩处理后的日志文件,便于节省磁盘空间以及对历史日志进行归档管理private static string CompressFolderPath = "D:\\Logs\\压缩日志";// 用于标记当前正在写入的日志文件是文本A还是文本B,初始化为文本A,通过这个标记来实现类似双缓冲的机制,方便在文件切换、压缩等操作时保证日志记录的连续性private static bool isUsingTextA = true;// 记录当前正在使用的日志文件路径(文本A或文本B),会根据程序运行过程中的实际情况动态更新,指向当前真正进行日志写入操作的文件路径private static string currentLogFilePath;// 记录文本A的文件路径,专门用于记录文本A对应的文件完整路径,方便后续针对文本A进行一些特定操作,比如检查文件大小等private static string textAFilePath;// 新增用于记录错误日志的文件路径(文本A和文本B),在发现有“错误”级别日志时,对应文本A的错误日志文件路径会存储在这里,方便后续操作private static string errorTextAFilePath;// 对应文本B的错误日志文件路径,与isUsingTextA标记配合,当切换到文本B进行日志记录时,错误日志也会相应切换写入到这个文件路径对应的文件中(如果需要的话)private static string errorTextBFilePath;// 新增用于记录警告日志的文件路径(文本A和文本B),功能类似上述错误日志文件路径,用于存放“警告”级别日志对应的文件路径private static string warnTextAFilePath;// 文本B的警告日志文件路径,用于在相应阶段存储“警告”级别日志信息private static string warnTextBFilePath;// 辅助方法:确保文件夹存在private static void EnsureFolderExists(string folderPath){// 检查指定的文件夹路径对应的文件夹是否已经存在if (!Directory.Exists(folderPath)){try{// 如果文件夹不存在,则尝试创建该文件夹Directory.CreateDirectory(folderPath);}catch (IOException ex){// 如果在创建文件夹过程中出现IOException异常(比如权限不足、磁盘已满等原因导致无法创建文件夹)// 这里通过消息框向用户展示创建文件夹失败的异常信息,方便用户知晓问题所在MessageBox.Show($"创建文件夹 {folderPath} 失败,异常信息: {ex.Message}");// 重新抛出异常,让调用这个方法的上层代码知道创建文件夹出现了问题,以便进行进一步的处理,比如终止程序或者尝试其他恢复操作throw;}}}/// <summary>/// 保存txt文档,即实现日志记录功能,是整个日志记录模块的核心方法,接收日志级别、要保存的内容以及通道等参数来决定如何将日志信息保存到对应的文件中/// </summary>/// <param name="jb">日志级别(目前未使用级别过滤功能),通过传入不同的日志级别来区分不同重要程度的日志信息,方便后续查看和分析日志时筛选不同级别的内容</param>/// <param name="zhi">保存内容,即具体要记录到日志文件中的文本信息,描述了程序运行过程中发生的相关事件、状态等内容</param>/// <param name="tongdao">通道,可用于对日志进行分类,比如按照不同的功能模块、业务流程等划分不同的通道,便于对日志进行归类查看和管理</param>public static void Txt(Enum jb, string zhi, string tongdao){string basePath = _logFilePath;string year = DateTime.Now.ToString("yyyy-MM");//年月日文件夹,根据当前时间获取年份和月份信息,用于构建日志文件所在的年月文件夹路径,便于按时间对日志进行分类存储string passageway = tongdao;//通道文件夹,使用传入的通道参数作为文件夹名称,用于进一步细分日志文件的存储位置// 构建日志文件所在文件夹路径,将基础路径、通道文件夹和年月文件夹路径组合起来,形成完整的日志文件所在文件夹的路径string logFolderPath = Path.Combine(basePath, passageway, year);EnsureFolderExists(logFolderPath);// 拼接完整日志文件路径,文件名格式保持不变(这里以简单的日期格式为例,你可按需调整),以当前日期作为文件名(格式为yyyy-MM-dd.txt),方便按天查看和管理日志文件string filename = DateTime.Now.ToString("yyyy-MM-dd") + ".txt";if (isUsingTextA){textAFilePath = Path.Combine(logFolderPath, filename);currentLogFilePath = textAFilePath;// 同时确定错误和警告日志对应的文本A文件路径,在原文件名基础上添加相应前缀(Error_和WARN_),用于区分不同级别的专用日志文件errorTextAFilePath = Path.Combine(logFolderPath, "Error_" + filename);warnTextAFilePath = Path.Combine(logFolderPath, "WARN_" + filename);}else{currentLogFilePath = Path.Combine(logFolderPath, filename);// 同时确定错误和警告日志对应的文本B文件路径,同样添加相应前缀,以对应文本B的情况errorTextBFilePath = Path.Combine(logFolderPath, "Error_" + filename);warnTextBFilePath = Path.Combine(logFolderPath, "WARN_" + filename);}bool fileExists = File.Exists(currentLogFilePath);// 先处理文件已存在且未超过阈值的情况,直接打开并追加内容,这种情况下无需进行复杂的文件切换或压缩等操作,直接在现有文件末尾追加新的日志信息即可if (fileExists){long fileSize = new FileInfo(currentLogFilePath).Length;if (fileSize < MaxLogFileSizeForCompress){WriteToExistingFile(jb, zhi, currentLogFilePath);// 根据日志级别额外处理错误和警告日志写入对应的专用文件,调用该方法来处理将“错误”和“警告”级别日志分别写入对应的专用文件的操作HandleSpecialLogLevel(jb, zhi);return;}}// 如果文件不存在或者已超过阈值,执行创建文件或切换文件等逻辑,比如首次创建日志文件或者当前文件已满需要切换到新文件进行日志记录等情况FileStream fs = null;try{fs = fileExists ? File.Open(currentLogFilePath, FileMode.Append) : File.Create(currentLogFilePath);WriteToFileAndHandleSize(jb, zhi, fs, currentLogFilePath);}catch (IOException ex){MessageBox.Show($"打开或创建日志文件 {currentLogFilePath} 失败,异常信息: {ex.Message}");throw; // 重新抛出异常,避免程序继续执行可能导致的数据不一致等问题,确保上层代码知道日志文件操作出现了异常}finally{if (fs != null){fs.Close();}}}/// <summary>/// 根据日志级别处理错误和警告日志写入对应的专用文件,该方法根据传入的日志级别判断是“错误”还是“警告”级别,然后分别进行对应的文件写入操作/// </summary>private static void HandleSpecialLogLevel(Enum jb, string zhi){if (jb.ToString() == "错误"){string currentErrorFilePath = isUsingTextA ? errorTextAFilePath : errorTextBFilePath;EnsureErrorFileExists(currentErrorFilePath);WriteToSpecialFile(currentErrorFilePath, zhi);}else if (jb.ToString() == "警告"){string currentWarnFilePath = isUsingTextA ? warnTextAFilePath : warnTextBFilePath;EnsureWarnFileExists(currentWarnFilePath);WriteToSpecialFile(currentWarnFilePath, zhi);}}/// <summary>/// 确保错误日志文件存在,如果不存在则创建,该方法用于保证在写入“错误”级别日志到对应的专用文件时,文件是存在的,避免出现写入失败的情况/// </summary>private static void EnsureErrorFileExists(string errorFilePath){if (!File.Exists(errorFilePath)){try{// 使用File.Create创建文件,创建后需要手动关闭文件流,这里直接调用Close方法关闭File.Create(errorFilePath).Close();}catch (IOException ex){MessageBox.Show($"创建错误日志文件 {errorFilePath} 失败,异常信息: {ex.Message}");throw;}}}/// <summary>/// 确保警告日志文件存在,如果不存在则创建,与EnsureErrorFileExists类似,只是针对“警告”级别日志对应的专用文件进行存在性检查和创建操作/// </summary>private static void EnsureWarnFileExists(string warnFilePath){if (!File.Exists(warnFilePath)){try{File.Create(warnFilePath).Close();}catch (IOException ex){MessageBox.Show($"创建警告日志文件 {warnFilePath} 失败,异常信息: {ex.Message}");throw;}}}/// <summary>/// 向专用文件写入日志内容,负责将具体的日志内容按照一定格式写入到指定的专用文件(错误或警告日志文件)中/// </summary>private static void WriteToSpecialFile(string specialFilePath, string zhi){FileStream fs = null;try{// 以追加模式打开指定的专用文件,以便在文件末尾添加新的日志内容fs = File.Open(specialFilePath, FileMode.Append);using (StreamWriter sw = new StreamWriter(fs)){// 将写入位置定位到文件末尾,确保新的日志内容追加在已有内容之后sw.BaseStream.Seek(0, SeekOrigin.End);sw.Write($"操作时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 内容:{zhi}\n");sw.Flush();}}catch (IOException ex){MessageBox.Show($"打开或创建特殊日志文件 {specialFilePath} 失败,异常信息: {ex.Message}");throw;}finally{if (fs != null){fs.Close();}}}/// <summary>/// 向已存在且未超过阈值的文件中写入内容,用于向已经存在且文件大小未超过设定阈值的普通日志文件中追加新的日志信息,按照一定格式写入日志内容并进行必要的异常处理/// </summary>private static void WriteToExistingFile(Enum jb, string zhi, string currentLogFilePath){FileStream fs = null;try{// 以追加模式打开当前的普通日志文件,准备写入新的日志内容fs = File.Open(currentLogFilePath, FileMode.Append);using (StreamWriter sw = new StreamWriter(fs)){// 将写入位置定位到文件末尾,使得新日志信息添加在文件已有内容的后面sw.BaseStream.Seek(0, SeekOrigin.End);// 获取当前日志级别字符串表示(虽然取消了日志级别过滤功能,但这里保留获取级别字符串表示的代码),用于在日志内容中记录当前日志的级别信息string zt = jb.ToString();sw.Write("[{0}] 操作时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 内容:{1}\n", zt, zhi);sw.Flush();}}catch (IOException ex){MessageBox.Show($"写入日志到文件 {currentLogFilePath} 失败,异常信息: {ex.Message}");throw; // 重新抛出异常,保证数据完整性,不丢失此次写入数据的异常情况,确保日志记录的可靠性}finally{if (fs != null){fs.Close();}}}/// <summary>/// 向文件写入内容,并处理文件大小超过阈值的情况,在向普通日志文件写入内容后,检查文件大小是否超过阈值,如果超过则触发文件压缩、切换等相关处理逻辑/// </summary>private static void WriteToFileAndHandleSize(Enum jb, string zhi, FileStream fs, string currentLogFilePath){using (StreamWriter sw = new StreamWriter(fs)){// 将写入位置定位到文件末尾,确保日志内容按顺序追加到文件末尾sw.BaseStream.Seek(0, SeekOrigin.End);// 获取当前日志级别字符串表示(虽然取消了日志级别过滤功能,但这里保留获取级别字符串表示的代码),用于在日志记录中体现日志级别信息string zt = jb.ToString();sw.Write("[{0}] 操作时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 内容:{1}\n", zt, zhi);sw.Flush();}// 获取文件大小(如果文件存在的话),只针对文本A进行大小检查,根据当前是否正在使用文本A以及文件是否存在来决定是否检查文件大小并进行后续处理if (isUsingTextA && File.Exists(currentLogFilePath)){long fileSize = new FileInfo(currentLogFilePath).Length;if (fileSize >= MaxLogFileSizeForCompress){HandleFileCompressionAndSwitch(currentLogFilePath);}}}/// <summary>/// 处理文件压缩以及切换使用的文件(从文本A切换到文本B),当文本A对应的日志文件大小达到阈值后,执行文件压缩操作,将文本A文件压缩保存到指定的压缩文件夹中,然后删除原文本A文件,并切换到使用文本B进行后续日志记录/// </summary>private static void HandleFileCompressionAndSwitch(string currentLogFilePath){// 确保压缩文件夹存在,如果不存在则创建,为即将进行的文件压缩操作准备好存放压缩文件的目标文件夹EnsureFolderExists(CompressFolderPath);// 生成压缩文件的文件名(文本A的压缩文件名,带上时分秒信息),在原日志文件名基础上添加当前时分秒信息,使得压缩文件名具有唯一性,便于区分不同时间压缩的文件string zipFileName = Path.GetFileNameWithoutExtension(currentLogFilePath) + "_" + DateTime.Now.ToString("HH-mm-ss") + ".zip";string zipFilePath = Path.Combine(CompressFolderPath, zipFileName);try{// 使用SharpZipLib进行文件压缩(文本A),创建输出的压缩文件流,然后基于此流创建ZipOutputStream对象用于实际的压缩操作,并设置较高的压缩级别(0 - 9,9为最高压缩比,可按需调整)以获得较好的压缩效果using (FileStream fsOut = File.Create(zipFilePath)){using (ZipOutputStream zipStream = new ZipOutputStream(fsOut)){zipStream.SetLevel(9);ZipEntry entry = new ZipEntry(Path.GetFileName(currentLogFilePath));zipStream.PutNextEntry(entry);using (FileStream fsIn = File.OpenRead(currentLogFilePath)){byte[] buffer = new byte[4096];int sourceBytes;do{sourceBytes = fsIn.Read(buffer, 0, buffer.Length);zipStream.Write(buffer, 0, sourceBytes);} while (sourceBytes > 0);}zipStream.CloseEntry();}}}catch (IOException ex){MessageBox.Show($"压缩日志文件 {currentLogFilePath} 失败,异常信息: {ex.Message}");throw; // 重新抛出异常,避免掩盖压缩失败问题,确保上层代码知道压缩操作出现了异常情况}try{// 删除原日志文件(文本A)(可根据实际需求考虑是否备份等其他操作)File.Delete(currentLogFilePath);}catch (IOException ex){MessageBox.Show($"删除原日志文件 {currentLogFilePath} 失败,异常信息: {ex.Message}");throw; // 重新抛出异常,防止后续出现文件冲突等问题}// 切换到使用文本B进行后续写入isUsingTextA = false;}}
}
相关文章:
C#学写了一个程序记录日志的方法(Log类)
1.错误和警告信息单独生产文本进行记录; 2.日志到一定内存阈值可以打包压缩,单独存储起来,修改字段MaxLogFileSizeForCompress的值即可; 3.Log类调用举例:Log.Txt(JB.信息,“日志记录内容”,"通道1"); usi…...
Android Framework禁止弹出当前VOLTE不可用的提示窗口
文章目录 VoLTE简介VoLTE 的优势 当前VOLTE不可用的弹窗弹窗代码定位屏蔽弹出窗口 VoLTE简介 VoLTE(Voice over LTE)是一种基于4G LTE网络的语音通话技术。它允许用户在4G网络上进行高质量的语音通话和视频通话,而不需要回落到2G或3G网络。V…...
Maven Surefire 插件简介
Maven Surefire 插件是 Maven 构建系统中的一个关键组件,专门用于在构建生命周期中执行单元测试。 它通常与 Maven 构建生命周期的测试阶段绑定,确保所有单元测试在项目编译后和打包前被执行。 最新版本 Maven Surefire 插件的最新版本为 3.5.2。 使…...
vue3-新增API组件
shallowRef 创建一个响应式数据,但只对顶层属性进行响应式处理,只跟踪引用值的变化,不关心值内部的属性变化 import {shallowRef} from "vue" import UserInfo from "/components/UserInfo.vue";let name shallowRef("vue&quo…...
Linux随记(十三)
一、jstack随记 运行cmd cd C:\icp-agent\jdk_min\bin 执行 jstack PID > thread_dump.txt (查看PID:tasklist |findstr javaw 查看第二列) thread_dump.txt 取给研发二、让普通用户test,有权限使用docker指令 1、 查看当前用…...
AI数据分析工具(一)
Looker Studio(谷歌)-免费 优点 免费使用:对于中小型企业和个人用户来说,没有任何费用压力,可以免费享受到数据可视化和报表创建的功能。与Google服务集成:特别适合使用Google产品生态的企业,…...
dhcp服务
安装dhcp-libs和dhcp-common软件包是配置DHCP服务器的前提,但仅仅安装这两个软件包并不能直接开启DHCP服务器。您还需要进行以下步骤来完整配置和启动DHCP服务器: 安装DHCP服务器软件包: 除了dhcp-libs和dhcp-common,您还需要安装…...
RSA算法和AES算法,哪种更安全
目录 一、RSA (非对称加密算法) 二、AES (对称加密算法) 三、对比总结 四、更安全的选择 五、结合使用:RSA AES RSA 和 AES 是两种不同类型的加密算法,适用于不同的场景,因此它们的安全性不能直接比较,而是取决于具体的应用…...
反向代理模块开发
1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说,反向代理就相当于…...
(微信小程序)基于Spring Boot的校园失物招领平台的设计与实现(vue3+uniapp+mysql)
💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…...
1-7 GD32函数指针应用
前言: 本博客仅在应用函数指针与回调函数相关的知识,通过实践巩固所学知识,也是对相关知识点的回顾。 函数指针与回调函数:1-6 GD32函数指针与回调函数-CSDN博客 目录 前言: 1.0 程序架构思想 2.0 构建串口结构体 …...
前端js面试知识点思维导图(脑图)
如果看着不清晰可以去https://download.csdn.net/download/m0_73761441/90058523访问下载,无需积分 使用百度脑图制作,可以一键导入下面的文本生成自己的脑图 js相关面试题、知识点 数据类型 1. 数据类型分类?分别包含ÿ…...
使用 F5 TTS 文字转音频
F5 TTS 支持 ZeroShot 音频克隆,只有将需要音频传给模型,模型既可以生成以对应声音生成的音频,F5 最强大的地方就是可以使用定制的人声。F5 使用了 DIT 架构进行训练,结构如下: 本地使用 F5 TTS F5 使用很简单&#x…...
【笔记】自动驾驶预测与决策规划_Part8_数据驱动的规划方法
文章目录 0. 前言1.生成模型1.1 Diffusion-ES1. Diffusion-ES算法介绍2. Diffusion-ES算法具体流程Diffusion Model 是什么?Diffusion-ES: Evolutionary StrategiesDiffusion-ES MethodDiffusion-ES Mapping Language instructions to reward functions with LLM pr…...
多视图几何中向量叉乘的矩阵转换 Matrix Transformation for Cross Product in MVG
Title: 多视图几何中向量叉乘的矩阵转换 Matrix Transformation for Cross Product in MVG 文章目录 I. 向量叉乘的矩阵转换恒等式II. 符号计算 Maxima 程序推导III. 推论和关联公式的说明1. 推论2. 应用于对极几何中基本矩阵推导3. 应用于基本矩阵与单应矩阵关系4. 与刚体运动…...
面向多用户场景的恢复机制驱动的无线组密钥生成协议
中文标题:面向多用户场景的恢复机制驱动的无线组密钥生成协议 英文标题:A Recovery Mechanism-driven Wireless Group Key Generation Protocol for Multi-User Scenarios 作者信息: Huaicong Zhang, Yawen Huang, Jiabao Yu, Boqian Liu, …...
ROS2教程 - 2 环境安装
更好的阅读体验:https://www.foooor.com 2 环境安装 下面以 ROS2 的 humble 版本为例,介绍 ROS2 的安装。 ROS1 只能在 ubuntu 系统上安装,ROS2全面支持三种平台:Ubuntu、MAC OS X、Windows10,下面在 Ubuntu22.04 …...
力扣200 岛屿数量 Java版本
文章目录 题目描述代码 题目描述 给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 …...
每日速记10道java面试题03
其他资料 每日速记10道java面试题01-CSDN博客 每日速记10道java面试题02-CSDN博客 目录 一、你使用过java的反射机制吗?如何应用反射? 二、什么是泛型?泛型的作用是什么? 三、java的泛型擦除是什么? 四、Java 中…...
力扣刷题TOP101:6.BM7 链表中环的入口结点
目录: 目的 思路 复杂度 记忆秘诀 python代码 目的 {1,2},{3,4,5}, 3 是环入口。 思路 这个任务是找到带环链表的环入口。可以看作是上一题龟兔赛跑(Floyd 判圈算法)的延续版:乌龟愤愤不平地举报兔子跑得太快,偷偷…...
智慧防汛平台在城市生命线安全建设中的应用
随着城市化进程的加快,城市基础设施的复杂性和互联性不断增强,城市生命线的安全管理面临前所未有的挑战。智慧防汛平台作为城市生命线安全建设的重要组成部分,通过现代信息技术提升城市防汛应急管理的智能化水平,保障城市安全。 …...
高德应用OceanBase云数据库的升级选型与迁移干货
业务背景 高德,DAU已在亿级,时时刻刻都持续不断地产生着庞大的数据。随着数据量的迅猛增长,对现有的业务数据存储能力构成日益严峻的挑战。 以我所在部门中的某一大型服务为例,其存储在XDB中的数据量往往达到数百TB之巨…...
Flink cdc同步增量数据timestamp字段相差八小时(分析|解决)不是粘贴复制的!
问题 我使用flink cdc同步mysql到mysql遇到了timestamp字段缺少八小时的问题。很少无语,flink ,cdc,debezium时区都设置了,没有任何效果! 分析 问题出现在mysql binlog身上!!! 因为默认mysql会使用UTC来…...
用shell脚本写一个通用的监听程序异常并重启脚本
进来服务器的程序php-fpm时常在并发下时常挂掉,而且时常在凌晨2点以后,通过排查是因为php配置需要调整并发,同时,为了不影响我休息(以前老师说:能用机器和程序解决问题的坚决不用人去操作,这样才…...
使用 Go 语言中的 Context 取消协程执行
使用 Go 语言中的 Context 取消协程执行 在 Go 语言中,协程(goroutine)是一种轻量级的线程,非常适合处理并发任务。然而,如何优雅地取消正在运行的协程是一个常见的问题。本文将通过一个具体的例子来展示如何使用 con…...
使用经典的Java,还是拥抱新兴的Rust?
在当代互联网时代的企业级开发中,技术栈的选择往往牵动着每个团队的神经。随着Rust语言的崛起,许多开发团队开始重新思考:是继续坚持使用经典的Java,还是拥抱新兴的Rust?这个问题背后,折射出的是对技术演进…...
《算法导论》英文版前言To the teacher第3段研习录:题海战术有没有?
【英文版】 We have included 957 exercises and 158 problems. Each section ends with exercises, and each chapter ends with problems. The exercises are generally short questions that test basic mastery of the material. Some are simple self-check thought exer…...
XELA - uSkin 三轴触觉传感器:为机器人赋予敏锐触感
XELA Robotics 的 uSkin 触觉传感器以其创新性在机器人技术中备受关注。它凭借高密度设计和三轴力测量能力,大幅提升了机器人的触觉感知能力,这种技术不但增强了机器人的智能化和柔性,还为不同行业的应用创造了广泛的可能性。其中在机器人灵巧…...
k8s常用命令总结
以下是 Kubernetes 所有常用命令的详细总结,涵盖了 kubectl 的各个方面,包括基本操作、资源管理、调试、监控等。每个命令都附有简要说明和示例。 1. 基本命令 查看 Kubernetes 版本 kubectl version 查看集群信息 kubectl cluster-info 查看当前上…...
即时通讯| IM+RTC在AI技术加持下的社交体验
即时通讯作为互联网的重要应用之一,见证了中国互联网30年发展的辉煌历程。 它从最初的文字交流,发展到如今的语音、视频通话,甚至是虚拟现实社交,已经渗透到生活的社交、娱乐、商务等方方面面,成为现代社会不可或缺的一…...
评估人工智能生成答案准确性
目录 评估人工智能生成答案准确性 评估人工智能生成答案准确性 在评估人工智能(AI)系统生成的答案准确性时,我们主要关注两个方面:事实相似性和语义相似性。这两个方面的加权平均分数被用来衡量系统回答的准确性。 事实相似性: 事实相似性通过F1分数来计算。F1分数是精确…...
scala的守卫语句格式
import scala.io.StdIn object test49{//从控制台读入一个数字a,使用(StdIn.readInt)//如果a>0并且a<3,打印[0-3]//如果a>4并且a<8,打印[4-8]//否则:打印未匹配 // def main(args: Array[String]): Unit { // val aStdIn.readInt()//等…...
结构型模式-组合模式
组合模式(Composite Pattern)是一种结构型设计模式,它通过将对象组合成树形结构来表示“部分-整体”的层次结构,从而使客户端对单个对象和组合对象的使用具有一致性。 适用场景 需要表示对象的层次结构:如文件系统、组…...
(超详细图文)PLSQL Developer 配置连接远程 Oracle 服务
1、下载配置文件 (超详细图文详情)Navicat 配置连接 Oracle-CSDN博客 将下载的文件解压到单独文件夹,如:D:\App\App_Java\Oracle\instantclient-basic-windows.x64-19.25.0.0.0dbru 2、配置 打开 PLSQL Developer,登…...
【AI系统】昇腾 AI 架构介绍
昇腾 AI 架构介绍 昇腾计算的基础软硬件是产业的核⼼,也是 AI 计算能⼒的来源。华为,作为昇腾计算产业⽣态的⼀员,是基础软硬件系统的核⼼贡献者。昇腾计算软硬件包括硬件系统、基础软件和应⽤使能等。 而本书介绍的 AI 系统整体架构&#…...
D83【python 接口自动化学习】- pytest基础用法
day83 pytest测试用例执行顺序 学习日期:20241129 学习目标:http定义及实战 -- pytest测试用例执行顺序 学习笔记: 测试用例执行顺序 默认执行顺序使用pytest-ordering自定义顺序 pytestrequests练习 import requestsdef test_mobile()…...
浅谈C#库之Memcached
一、Memcached库介绍 Memcached是一个开源的高性能分布式内存缓存系统,它通过将数据存储在内存中来加速动态Web应用。以下是Memcached的一些关键特点: 1、高性能:Memcached使用内存进行数据存储,访问速度极快。 2、分布式&…...
基于Matlab的图像去噪算法仿真
中值滤波的仿真 本节选用中值滤波法对含有高斯噪声和椒盐噪声的图像进行去噪,并用Matlab软件仿真。 (1)给图像加入均值为0,方差为0.02的高斯噪声,分别选择33模板、55模板和77模板进行去噪 Matlab部分代码࿱…...
YOLOv9改进,YOLOv9引入CAS-ViT(卷积加自注意力视觉变压器)中AdditiveBlock模块,二次创新RepNCSPELAN4结构
摘要 CAS-ViT 是一种为高效移动应用设计的视觉Transformer。模型通过结合卷积操作与加性自注意机制,在保持高性能的同时显著减少计算开销,适合资源受限的设备如手机。其核心组件 AdditiveBlock 通过多维度信息交互和简化的加性相似函数,实现了高效的上下文信息整合,避免了…...
Ubuntu 关机命令
在 Ubuntu 系统中,有几种方法可以关机。以下是常用的关机命令及其说明: 1. 使用 shutdown 命令 shutdown 命令是最常用和最灵活的关机方式。它可以设置定时关机,并且可以发送警告消息给所有登录用户。 立即关机 sudo shutdown now定时关机…...
使用Gradle编译前端的项目
使用Gradle编译前端的项目 前言项目结构根项目(parent-project)的 settings.gradle.kts后端项目(backend)的 build.gradle.kts前端项目(frontend)的 build.gradle.kts打包bootJar 前言 最近的项目都是使用…...
React进阶面试题目(三)
如何在 React 中实现滚动动画? 在 React 中实现滚动动画可以通过多种方式实现,以下是一个基本的实现步骤: 构建组件:首先构建需要展示滚动动画的组件,例如一个 About 组件,它包含一些文本或元素。监听滚动…...
每日计划-1129
1. 完成 200. 岛屿数量 class Solution { private:void dfs(vector<vector<char>>& grid,int r,int c){int nrgrid.size();int ncgrid[0].size();grid[r][c]0;if (r - 1 > 0 && grid[r-1][c] 1) dfs(grid, r - 1, c);if (r 1 < nr && …...
杭州网世一站式网络解决方案,助力安邦护卫网络升级改造
随着信息技术的不断进步,浙江台州安邦护卫有限公司现有的网络设备已无法满足其日益增长的业务需求。网络性能瓶颈、安全隐患和管理复杂性等问题逐渐凸显,严重影响了企业的运营效率和服务质量。为了解决这些问题,浙江台州安邦护卫有限公司决定…...
vue3.0 根据富文本html页面生成压缩包(含视频在线地址、图片在线地址、前端截图、前端文档)
vue3.0生成压缩包(含在线地址、前端截图、前端文档) 需求描述效果开始下载插件包基本代码构造 点击下载按钮1.截图content元素,并转化为pdfcanvas putImageData、getImageDatagetImageData 获取指定矩形区域的像素信息putImageData 将这些数据…...
从0开始学PHP面向对象内容之常用设计模式(享元)
二、结构型设计模式 7、享元模式(Flyweight Pattern) 这里是引用享元模式(Flyweight Pattern) 是一种结构型设计模式,旨在通过共享对象来减少内存使用,尤其适用于大量相似对象的场景。通过共享和重用对象的…...
Idea 2024.3 突然出现点击run 运行没有反应,且没有任何提示。
写这篇文章的目的是为了提供一个新的解决思路,因为存在同病不同原因。 如果你进行了1. 检查运行配置 (Run Configuration) 2. 清理和重建项目 3. 清除缓存并重启 IDEA 4.排除kotlin 5.重装idea等等操作之后仍然没有解决,可以试着按一下步骤进行解决。 检…...
拥抱 OpenTelemetry:阿里云 Java Agent 演进实践
作者:陈承 背景 在 2018 年的 2 月,ARMS Java Agent 的第一个版本正式发布,为用户提供无侵入的的可观测数据采集服务。6 年后的今天,随着软件技术的迅猛发展、业务场景的逐渐丰富、用户规模的快速增长,我们逐渐发现过…...
【Linux】开发工具
这篇文章主要涉及sudo指令进行提权的方法,gcc/g的使用并且提及了一些make、makefile sudo指令 在前几篇文章中,我们先后了解了对于不同的角色来说,可以进行不同的操作,而对于新建的普通用户是不能进行权限提升的,这是…...
网络通信基础:TCP/IP、UDP、三次握手、Socket与HTTP协议详解
在网络通信的世界中,TCP/IP、UDP、三次握手、Socket和HTTP协议是不可或缺的基本概念。它们构成了网络通信的基石,对于理解网络编程和设计网络应用程序至关重要。本文将详细介绍这些概念,帮助读者更好地理解网络通信的原理。 首先,…...