Python实现技能记录系统
Python实现技能记录系统
来自网络,有改进。
技能记录系统界面如下:
具有保存图片和显示功能——允许用户选择图片保存,选择历史记录时若有图片可预览图片。
这个程序的数据保存在数据库skills2.db中,此数据库由用Python 自带的sqlite3数据库管理系统(不需要单独安装)管理,由程序自动维护(不需要用户操心),和程序文件在同一文件夹中。
“查看/编辑总结”的窗口上,有一个复选框 “允许编辑”,默认不选中 ,因此打开编辑总结的窗口时“保存”按钮处于不可用(灰色)状态,不能编辑文字,只有选中“允许编辑”复选框,方可编辑文字、保存。
此窗口设置为模态——确保用户完成编辑操作后才能返回主窗口。
本程序涉及如下模块/库
需要安装的库:Pillow (PIL)(通过 pip install pillow 安装)
Pillow (PIL) 是一个图像处理库,是第三方库,需要安装。用于处理图像文件。代码中使用了 Image 和 ImageTk,这些是 Pillow 的功能模块。
以下是 Python 标准库的一部分,通常不需要单独安装:
datetime:用于处理日期和时间。
io:用于处理输入输出流。
tkinter:用于创建图形用户界面。
sqlite3:用于操作 SQLite 数据库。
源码如下(部分代码参考自网络):
import tkinter as tk
from tkinter import ttk, messagebox, filedialog
import sqlite3
from datetime import datetime
from PIL import Image, ImageTk
import ioclass SkillTracker:def __init__(self, root):self.root = rootself.root.title("技能记录系统 v1.2.1")self.root.geometry("1500x760+0+0")self.conn = sqlite3.connect('skills2.db')self.c = self.conn.cursor()self.init_db()self.create_widgets()self.load_data()self.root.protocol("WM_DELETE_WINDOW", self.on_close)def init_db(self):try:self.c.execute('''CREATE TABLE IF NOT EXISTS skills(id INTEGER PRIMARY KEY, name TEXT NOT NULL, parent_id INTEGER,path TEXT UNIQUE)''')self.c.execute('''CREATE TABLE IF NOT EXISTS records(id INTEGER PRIMARY KEY,skill_path TEXT NOT NULL,score INTEGER CHECK(score BETWEEN 1 AND 10),date DATE DEFAULT CURRENT_DATE,summary TEXT,image BLOB)''')self.conn.commit()except sqlite3.Error as e:messagebox.showerror("数据库错误", f"初始化失败: {str(e)}")def add_category(self):"""添加大类"""name = self.get_input("新建大类名称:")if name:try:self.c.execute("INSERT INTO skills (name, path) VALUES (?, ?)",(name, name))skill_id = self.c.lastrowidself.conn.commit()# 更新树形控件self.tree.insert("", "end", iid=skill_id, text=name, open=True)return Trueexcept sqlite3.IntegrityError:messagebox.showerror("错误", "技能名称已存在")except sqlite3.Error as e:messagebox.showerror("数据库错误", f"添加失败: {str(e)}")return False def delete_item(self):"""删除选中的技能项及其子项"""selected = self.tree.selection()if not selected:messagebox.showerror("错误", "请先选择要删除的项")returnitem_id = selected[0]item_name = self.tree.item(item_id)['text']# 确认对话框if not messagebox.askyesno("确认删除", f"确定要删除【{item_name}】及其所有子项吗?"):return# 递归删除数据库记录def delete_from_db(skill_id):self.c.execute("SELECT id FROM skills WHERE parent_id=?", (skill_id,))children = self.c.fetchall()for child in children:delete_from_db(child[0])self.c.execute("DELETE FROM skills WHERE id=?", (skill_id,))delete_from_db(item_id)self.conn.commit()self.tree.delete(item_id)messagebox.showinfo("成功", "删除完成")def delete_history(self):selected = self.history_tree.selection()if not selected:messagebox.showwarning("提示", "请先选择要删除的记录")returnrecord_id = self.history_tree.item(selected[0], "values")[0]if not messagebox.askyesno("确认删除", "确定要删除这条记录吗?"):returntry:self.c.execute("DELETE FROM records WHERE id=?", (record_id,))self.conn.commit()self.history_tree.delete(selected[0])messagebox.showinfo("成功", "记录已删除")# 清除图片预览self.image_preview.config(image="")self.image_preview.image = Noneself.image_data = Noneexcept sqlite3.Error as e:messagebox.showerror("数据库错误", f"删除失败: {str(e)}")def load_data(self):"""加载初始数据"""self.load_skill_tree()self.load_history()def on_close(self):"""统一的关闭处理"""try:self.conn.commit()self.conn.close()except Exception as e:passfinally:self.root.destroy()def create_widgets(self):# 左侧技能树面板left_frame = ttk.Frame(self.root)left_frame.pack(side=tk.LEFT, fill=tk.Y, padx=10, pady=10)self.tree = ttk.Treeview(left_frame, show="tree")self.tree.pack(fill=tk.Y, expand=True)btn_frame = ttk.Frame(left_frame)ttk.Button(btn_frame, text="添加大类", command=self.add_category).pack(side=tk.LEFT, padx=2)ttk.Button(btn_frame, text="添加子项", command=self.add_subskill).pack(side=tk.LEFT, padx=2)ttk.Button(btn_frame, text="删除项", command=self.delete_item).pack(side=tk.LEFT, padx=2)btn_frame.pack(pady=5)# 中间输入面板center_frame = ttk.Frame(self.root)center_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=10, pady=10)input_frame = ttk.LabelFrame(center_frame, text="今日录入")input_frame.pack(fill=tk.X, pady=5)ttk.Label(input_frame, text="当前技能:").grid(row=0, column=0, sticky=tk.W)self.selected_skill = ttk.Label(input_frame, text="未选择", foreground="blue")self.selected_skill.grid(row=0, column=1, sticky=tk.W)ttk.Label(input_frame, text="分数/等级 (1-10):").grid(row=1, column=0, sticky=tk.W)self.score_var = tk.IntVar()ttk.Spinbox(input_frame, from_=1, to=10, textvariable=self.score_var, width=5).grid(row=1, column=1)ttk.Label(input_frame, text="学习总结:").grid(row=2, column=0, sticky=tk.NW)self.summary_text = tk.Text(input_frame, height=8, width=40)self.summary_text.grid(row=2, column=1, pady=5)ttk.Button(input_frame, text="上传图片", command=self.upload_image).grid(row=3, column=0, pady=5)ttk.Button(input_frame, text="保存记录", command=self.save_record).grid(row=3, column=1, pady=5)# 图片预览区域(放在今日录入框下方)self.image_preview = ttk.Label(center_frame)self.image_preview.pack(pady=10)self.image_data = None# 右侧历史记录面板history_frame = ttk.Frame(self.root)history_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True, padx=10, pady=10)btn_frame = ttk.Frame(history_frame)ttk.Button(btn_frame, text="删除记录", command=self.delete_history).pack(side=tk.LEFT, padx=5)ttk.Button(btn_frame, text="查找记录", command=self.search_records).pack(side=tk.LEFT, padx=5)ttk.Button(btn_frame, text="全部记录", command=self.load_history).pack(side=tk.LEFT, padx=5)ttk.Button(btn_frame, text="查看/编辑总结", command=self.edit_record).pack(side=tk.LEFT, padx=5)btn_frame.pack(fill=tk.X, pady=5)columns = ("id", "date", "skill", "score", "summary")self.history_tree = ttk.Treeview(history_frame,columns=columns,show="headings",selectmode="browse")# 配置可见列self.history_tree.heading("date", text="日期")self.history_tree.heading("skill", text="技能路径")self.history_tree.heading("score", text="评分/评级")self.history_tree.heading("summary", text="总结")# 配置列参数self.history_tree.column("date", width=120, anchor="center")self.history_tree.column("skill", width=200)self.history_tree.column("score", width=80, anchor="center")self.history_tree.column("summary", width=300)# 隐藏ID列self.history_tree.column("id", width=0, stretch=tk.NO)# 滚动条scrollbar = ttk.Scrollbar(history_frame, orient="vertical", command=self.history_tree.yview)self.history_tree.configure(yscrollcommand=scrollbar.set)# 布局self.history_tree.pack(side=tk.TOP, fill=tk.BOTH, expand=True)scrollbar.pack(side=tk.RIGHT, fill=tk.Y)# 绑定选择事件self.history_tree.bind("<<TreeviewSelect>>", self.on_history_select)self.tree.bind("<<TreeviewSelect>>", self.on_skill_select)def upload_image(self):file_path = filedialog.askopenfilename(filetypes=[("Image files", "*.png *.jpg *.jpeg *.gif *.bmp")])if file_path:with open(file_path, "rb") as file:self.image_data = file.read()self.display_image(self.image_preview, self.image_data, (400, 400)) # 调整大小以适应您的布局def display_image(self, label, image_data, size):if image_data:image = Image.open(io.BytesIO(image_data))image.thumbnail(size)photo = ImageTk.PhotoImage(image)label.config(image=photo)label.image = photoelse:label.config(image="")label.image = Nonedef add_subskill(self):"""添加子技能(修正后的版本)"""selected = self.tree.selection()if not selected:messagebox.showerror("错误", "请先选择父级技能")returnparent_id = selected[0]name = self.get_input("新建子项名称:")if name:parent_path = self.get_skill_path(parent_id)new_path = f"{parent_path}/{name}"try:# 使用self.c和self.connself.c.execute("INSERT INTO skills (name, parent_id, path) VALUES (?,?,?)",(name, parent_id, new_path))self.conn.commit()skill_id = self.c.lastrowidself.tree.insert(parent_id, "end", iid=skill_id, text=name)except sqlite3.Error as e:messagebox.showerror("数据库错误", f"添加失败: {str(e)}")def load_skill_tree(self):"""技能树加载"""try:self.tree.delete(*self.tree.get_children())# 获取所有技能并按层级排序self.c.execute('''WITH RECURSIVE skill_tree(id, name, parent_id, depth) AS (SELECT id, name, parent_id, 0FROM skills WHERE parent_id IS NULLUNION ALLSELECT s.id, s.name, s.parent_id, st.depth + 1FROM skills sJOIN skill_tree st ON s.parent_id = st.id)SELECT * FROM skill_tree ORDER BY depth, parent_id''')# 创建临时存储父节点的字典nodes = {}for skill_id, name, parent_id, _ in self.c.fetchall():if parent_id is None:node = self.tree.insert("", "end", iid=skill_id, text=name)else:parent = nodes.get(parent_id)if parent:node = self.tree.insert(parent, "end", iid=skill_id, text=name)nodes[skill_id] = skill_id # 保存节点IDexcept sqlite3.Error as e:messagebox.showerror("数据库错误", f"加载技能树失败: {str(e)}")def save_record(self):skill_path = self.selected_skill['text']if skill_path == "未选择":messagebox.showerror("错误", "请先选择一个技能")returntry:score = self.score_var.get()if not 1 <= score <= 10:raise ValueErrorexcept:messagebox.showerror("错误", "请输入1-10之间的整数")returnsummary = self.summary_text.get("1.0", tk.END).strip()date = datetime.now().strftime("%Y-%m-%d")try:self.c.execute("INSERT INTO records (skill_path, score, date, summary, image) VALUES (?,?,?,?,?)",(skill_path, score, date, summary, self.image_data))self.conn.commit()messagebox.showinfo("成功", "记录已保存!")self.summary_text.delete("1.0", tk.END)self.image_data = Noneself.image_preview.config(image="")self.image_preview.image = Noneself.load_history()except sqlite3.Error as e:messagebox.showerror("数据库错误", f"保存失败: {str(e)}")def load_history(self):try:self.history_tree.delete(*self.history_tree.get_children())self.c.execute("SELECT id, date, skill_path, score, summary FROM records ORDER BY date DESC, id DESC")for record in self.c.fetchall():self.history_tree.insert("", "end", values=record)except sqlite3.Error as e:messagebox.showerror("数据库错误", f"加载失败: {str(e)}")def on_history_select(self, event):selected = self.history_tree.selection()if selected:record_id = self.history_tree.item(selected[0], "values")[0]self.c.execute("SELECT image FROM records WHERE id=?", (record_id,))result = self.c.fetchone()if result:image_data = result[0]self.display_image(self.image_preview, image_data, (400, 400))else:self.image_preview.config(image="")self.image_preview.image = Nonedef get_skill_path(self, item_id):"""获取技能完整路径"""path = []while item_id:item = self.tree.item(item_id)path.append(item['text'])item_id = self.tree.parent(item_id)return '/'.join(reversed(path))def on_skill_select(self, event):selected = self.tree.selection()if selected:path = self.get_skill_path(selected[0])self.selected_skill.config(text=path)def get_input(self, prompt):"""获取用户输入"""dialog = tk.Toplevel()dialog.title("输入")ttk.Label(dialog, text=prompt).pack(padx=10, pady=5)entry = ttk.Entry(dialog)entry.pack(padx=10, pady=5)result = []def on_ok():result.append(entry.get())dialog.destroy()ttk.Button(dialog, text="确定", command=on_ok).pack(pady=5)dialog.wait_window()return result[0] if result else Nonedef search_records(self):search_window = tk.Toplevel(self.root)search_window.title("查找记录")ttk.Label(search_window, text="日期 (YYYY-MM-DD):").grid(row=0, column=0, padx=5, pady=5)date_entry = ttk.Entry(search_window)date_entry.grid(row=0, column=1, padx=5, pady=5)ttk.Label(search_window, text="技能路径:").grid(row=1, column=0, padx=5, pady=5)skill_entry = ttk.Entry(search_window)skill_entry.grid(row=1, column=1, padx=5, pady=5)def perform_search():date = date_entry.get()skill = skill_entry.get()query = "SELECT id, date, skill_path, score, summary FROM records WHERE 1=1"params = []if date:query += " AND date = ?"params.append(date)if skill:query += " AND skill_path LIKE ?"params.append(f"%{skill}%")query += " ORDER BY date DESC"try:self.c.execute(query, params)results = self.c.fetchall()self.history_tree.delete(*self.history_tree.get_children())for record in results:self.history_tree.insert("", "end", values=record)search_window.destroy()except sqlite3.Error as e:messagebox.showerror("查询错误", str(e))ttk.Button(search_window, text="查找", command=perform_search).grid(row=2, column=0, columnspan=2, pady=10)def edit_record(self):selected = self.history_tree.selection()if not selected:messagebox.showwarning("提示", "请先选择要 查看/编辑 的记录")returnrecord_id = self.history_tree.item(selected[0], "values")[0]# 获取当前记录信息self.c.execute("SELECT summary FROM records WHERE id=?", (record_id,))current_summary = self.c.fetchone()[0]edit_window = tk.Toplevel(self.root)edit_window.title(" 查看/编辑 记录")edit_window.geometry("400x300+360+280")ttk.Label(edit_window, text=" 查看/编辑 总结:").pack(padx=5, pady=5)summary_text = tk.Text(edit_window, height=8, width=40)summary_text.pack(padx=5, pady=5)summary_text.insert(tk.END, current_summary)summary_text.config(state='disabled') # 初始状态设为禁用save_button = ttk.Button(edit_window, text="保存", state='disabled')save_button.pack(pady=10)def toggle_edit_state():if allow_edit_var.get():summary_text.config(state='normal')save_button.config(state='normal')else:summary_text.config(state='disabled')save_button.config(state='disabled')def save_edit():new_summary = summary_text.get("1.0", tk.END).strip()try:self.c.execute("UPDATE records SET summary=? WHERE id=?", (new_summary, record_id))self.conn.commit()messagebox.showinfo("成功", "记录已更新")edit_window.destroy()self.load_history() # 刷新显示except sqlite3.Error as e:messagebox.showerror("数据库错误", f"更新失败: {str(e)}")# 添加允许编辑的复选框allow_edit_var = tk.BooleanVar()allow_edit_checkbox = ttk.Checkbutton(edit_window, text="允许编辑", variable=allow_edit_var, command=toggle_edit_state)allow_edit_checkbox.pack(pady=5)save_button.config(command=save_edit)# 添加取消按钮ttk.Button(edit_window, text="取消", command=edit_window.destroy).pack(pady=5)# 使窗口成为模态窗口edit_window.transient(self.root)edit_window.grab_set()self.root.wait_window(edit_window)if __name__ == "__main__":root = tk.Tk()app = SkillTracker(root)root.mainloop()
相关文章:
Python实现技能记录系统
Python实现技能记录系统 来自网络,有改进。 技能记录系统界面如下: 具有保存图片和显示功能——允许用户选择图片保存,选择历史记录时若有图片可预览图片。 这个程序的数据保存在数据库skills2.db中,此数据库由用Python 自带的…...
【专题刷题】二分查找(一):深度解刨二分思想和二分模板
📝前言说明: 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,按专题划分每题主要记录:(1)本人解法 本人屎山代码;(2)优质解法 优质代码;ÿ…...
基于Python+Flask的MCP SDK响应式文档展示系统设计与实现
以下是使用Python Flask HTML实现的MCP文档展示系统: # app.py from flask import Flask, render_templateapp Flask(__name__)app.route(/) def index():return render_template(index.html)app.route(/installation) def installation():return render_templa…...
Flask + ajax上传文件(一)
一、概述 本教程将教你如何使用Flask后端和AJAX前端实现文件上传功能,包含完整的代码实现和详细解释。 二、环境准备 1. 所需工具和库 Python 3.xFlask框架jQuery库Bootstrap(可选,用于美化界面)2. 安装Flask pip install flask三、项目结构 upload_project/ ├── a…...
【每天一个知识点】熵(Entropy)
“熵(Entropy)”是信息论、热力学、机器学习等多个领域的核心概念。它可以用一句话概括为: 🔑 熵表示系统的不确定性或信息混乱程度。 📚 一、信息论中的熵(Information Entropy) 在 Claude Sh…...
GIT 使用小记
全局设置 PS C:\workspace> git config --global user.name "FreeMan" PS C:\workspace> git config --global user.email "12323772wawhyuser.noreply.gitee.com" PS C:\workspace> git remote add origin https://gitee.com/wawhy/mountain.git…...
如何保证高防服务器中的系统安全?
对于高防服务器中的系统安全,企业通常会采取一系列的防护措施和策略防止网络攻击、入侵、恶意软件和其他网络安全威胁,下面是几个较为主要的安全防护措施,能够帮助企业提升高防服务器的安全性。 定期更新服务器中操作系统以及所有安装的软件&…...
【go语言】window环境从源码编译go
背景 早就听过go语言已经实现自举, 也就是使用旧版本go,来编译新版源码,得到新版本go。 步骤 1. 下载源码 git clone https://github.com/golang/go.git 2. 开始make cd go\src make.bat 3. 等待编译 卡住就按下回车 验证新版本 ……...
医学图像(DICOM数据)读取及显示(横断面、冠状面、矢状面、3D显示)为什么用ITK+VTK,单独用ITK或者VTK能实一样功能吗?
在医学图像处理中,结合使用 ITK 和 VTK 是常见的做法,因为它们各自专注于不同的核心功能。以下是逐步解释为何代码中同时使用两者,以及单独使用是否可行的分析: 1. 为什么用ITK处理DICOM数据? 1.1 ITK的DICOM处理优势…...
TiDB 深度解析与 K8S 实战指南
一、TiDB 核心特性与架构原理 1. 核心特性 分布式架构: 采用计算(TiDB Server)、存储(TiKV)、调度(PD)分离设计,支持水平扩展至 PB 级数据量。通过 PD 动态调度 Region(…...
WPS右键菜单中“上传到云文档”消失,使用命令行注册解决
关于上传到wps云文档,右键菜单莫名消失的问题 尝试在WPS设置显示上传到wps云文档的右键菜单,以及使用设置和修复工具修复,均无法显示菜单。 最终解决方法: regsvr32 "D:\Program Files (x86)\WPS Office\12.1.0.20784\offic…...
计算机求职面经内容与技巧分享
计算机求职面经内容与技巧分享 一、求职前的充分准备 (一)简历优化 突出技术能力:在简历中,务必清晰呈现自己精通的编程语言,例如熟练掌握 Java、Python 等语言的核心语法、常用库及框架。详细列举熟悉的技术栈&#x…...
java Springboot使用扣子Coze实现实时音频对话智能客服
一、背景 因公司业务需求,需要使用智能客服实时接听顾客电话。 现在已经完成的操作是,智能体已接入系统进行对练,所以本文章不写对联相关的功能。只有coze对接~ 扣子提供了试用Realtime WebSocket,点击右上角setting配…...
焦化烧结行业无功补偿解决方案—精准分组补偿 稳定电能质量沃伦森
在焦化、烧结等冶金行业,负荷运行呈现长时阶梯状变化,功率波动相对平缓,但对无功补偿的分组精度要求较高。传统固定电容器组补偿方式无法动态跟随负荷变化,导致功率因数不稳定,甚至可能因谐波放大影响电网安全。 行业…...
机器人项目管理新风口:如何高效推动智能机器人研发?
在2025年政府工作报告中,“智能机器人”首次被正式纳入国家发展战略关键词。从蛇年春晚的秧歌舞机器人惊艳亮相,到全球首个人形机器人马拉松的热议,智能机器人不仅成为科技前沿的焦点,也为产业升级注入了新动能。而在热潮背后&…...
ZooKeeper配置优化秘籍:核心参数说明与性能优化
#作者:张桐瑞 文章目录 tickTime:Client-Server通信心跳时间initLimit:Leader-Follower初始通信时限syncLimit:Leader-Follower同步通信时限dataDir:数据文件目录clientPort:客户端连接端口服务器名称与地…...
uniapp -- 实现微信小程序、app、H5端视频上传
布局及实现代码: <template><view class"flex flex-column p-4 grid-gap-4"><view class"flex flex-column grid-gap-4 bg-white p-4 rounded-4"><view class"font-weight-600">视频名称</view><i…...
2025年Redis分片存储性能优化指南
一、分片规则与负载均衡 动态哈希分片 采用CRC16算法计算键哈希值,通过hash_slot CRC16(key) % 16384确定槽位分布,结合Redis Cluster自动管理槽位迁移。 总分片数按需动态调整,例如从16节点扩容至32节点时,触发槽位重分配以…...
前端跨端框架的开发以及IOS和安卓的开发流程和打包上架的详细流程
以下是关于 前端跨端框架开发 以及 iOS/Android 原生开发流程与上架 的详细指南,涵盖技术选型、开发工具、打包发布全流程: 一、前端跨端开发框架对比与流程 主流跨端框架 框架技术栈性能接近原生生态成熟度适用场景React NativeJS/React80%⭐⭐⭐⭐⭐…...
项目《基于Linux下的mybash命令解释器》(二)
一、使用系统命令的完整代码 #include<stdio.h> #include<wait.h> #include<stdlib.h> #include<unistd.h> #include<assert.h> #include<string.h> #include<pwd.h>#define ARG_MAX 10//防止参数不够,可以做到一改全改…...
arm64适配系列文章-第十章-arm64环境上jenkins的部署
ARM64适配系列文章 第一章 arm64环境上kubesphere和k8s的部署 第二章 arm64环境上nfs-subdir-external-provisioner的部署 第三章 arm64环境上mariadb的部署 第四章 arm64环境上nacos的部署 第五章 arm64环境上redis的部署 第六章 arm64环境上rabbitmq-management的部署 第七章…...
PyTorch生成式人工智能实战(2)——PyTorch基础
PyTorch生成式人工智能实战(2)——PyTorch基础 0. 前言1. 创建 PyTorch 张量2. PyTorch 张量索引和切片3. PyTorch 张量形状4. 在 PyTorch 张量数学运算小结系列链接 0. 前言 为了训练生成式人工智能模型,我们可以使用多种数据格式ÿ…...
解决高德地图AMapUtilCoreApi、NetProxy类冲突
问题: Duplicate class com.amap.apis.utils.core.api.AMapUtilCoreApi found in modules jetified-3dmap-10.0.600 (com.amap.api:3dmap:10.0.600) and jetified-search-9.7.1 (com.amap.api:search:9.7.1) Duplicate class com.amap.apis.utils.core.api.NetProx…...
java—14 ZooKeeper
一、ZooKeeper简介 ZooKeeper是一种分布式协调服务,用于管理大型主机。在分布式环境中协调和管理服务 是一种复杂的过程,ZooKeeper通过简单的架构和API解决了这个问题。ZooKeeper运行开 发人员专注于核心应用程序逻辑,而不必担心应用程序的分…...
特征存储的好处:特征存储在机器学习开发中的优势
随着企业寻求提升机器学习生产力和运营能力 (MLOps),特征存储 (Feature Store) 的普及度正在迅速提升。随着 MLOps 技术的进步,特征存储正成为机器学习基础设施的重要组成部分,帮助企业提升模型的性能和解释能力,并加速新模型与生产环境的集成。这些存储充当集中式存储库,…...
【Promethus(普罗米修斯)介绍安装及使用】
一、系统介绍 1、什么是Prometheus? Prometheus:不仅是一款时间序列数据库,在整个生态上还是一套完整的监控系统。同时,还涉及许多以“explore”命名的客户端数据采集工具以及pushgateway网关。 官网:https://prometheus.io/ 文献:https://prometheus.io/docs/introdu…...
力扣热题100题解(c++)—矩阵
73.矩阵置零 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 int m matrix.size(); // 行数int n matrix[0].size(); // 列数bool firstRowZero false; // 标记第一行是否包含 0bool f…...
Spring Boot Controller 单元测试撰写
文章目录 引言标准用法必需依赖项核心注解说明代码示例 当涉及静态方法时的测试策略必需依赖项核心注解说明代码示例 引言 之前在编写 Controller 层的单元测试时,我一直使用 SpringBootTest 注解,但它会加载整个 Spring 应用上下文,资源开销…...
MVCC详解
目录 undo日志版本链 read view一致性视图 MVCC过程分析 读事务&写事务 Multi-Version Concurrency Control,多版本并发控制在读已提交和可重复读隔离级别下都实现了MVCC机制 undo日志版本链 一行数据被修改后,MySQL会保留修改前的数据(u…...
【通关函数的递归】--递归思想的形成与应用
目录 一.递归的概念与思想 1.定义 2.递归的思想 3.递归的限制条件 二.递归举例 1.求n的阶乘 2.顺序打印一个整数的每一位 三.递归与迭代 前言:上篇博文分享了扫雷游戏的实现,这篇文章将会继续分享函数的递归相关知识点,让大家了解并掌握递归的思…...
Python爬虫实战:移动端逆向工具Fiddler经典案例
一、引言 在移动互联网迅猛发展的当下,移动端应用产生了海量的数据。对于开发者而言,获取这些数据对于市场调研、竞品分析、数据挖掘等工作具有重要意义。Fiddler 作为一款功能强大的 Web 调试代理工具,能够有效捕获、分析和修改移动端的网络请求,为开发者深入了解移动端网…...
从平台工程视角出发,重塑云原生后端的工程体系
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:从 DevOps 到平台工程,云原生后端的演进逻辑 云原生的广泛应用,使得后端系统的开发、部署与运维逐渐从“编写业务代码”演进为“构建工程平台”。过去,后端开发者通常将注意力集中于 API 编写…...
【Hive入门】Hive分区与分桶深度解析:优化查询性能的关键技术
引言 在大数据领域,Apache Hive作为构建在Hadoop之上的数据仓库工具,因其类SQL的查询语言(HiveQL)和良好的扩展性而广受欢迎。然而,随着数据量的增长,查询性能往往成为瓶颈。本文将深入探讨Hive中两种关键的数据组织技术——分区(…...
Pytorch中的Dataset和DataLoader
1. PyTorch数据处理的核心概念 在PyTorch中,数据处理主要依赖两个核心组件: torch.utils.data.Dataset:定义如何访问数据集(单个样本的数据和标签)。torch.utils.data.DataLoader:负责批量加载数据、打乱数据、并行加载等。1.1 为什么需要Dataset和DataLoader? 问题:深…...
中介者模式:解耦对象间复杂交互的设计模式
中介者模式:解耦对象间复杂交互的设计模式 一、模式核心:用中介者统一管理对象交互,避免两两直接依赖 当系统中多个对象之间存在复杂的网状交互时(如 GUI 界面中按钮、文本框、下拉框的联动),对象间直接调…...
IEEE综述 | 车道拓扑推理20年演进:从程序化建模到车载传感器
导读 车道拓扑推理对于高精建图和自动驾驶应用至关重要,从早期的程序化建模方法发展到基于车载传感器的方法,但是很少有工作对车道拓扑推理技术进行全面概述。为此,本文系统性地调研了车道拓扑推理技术,同时确定了未来研究的挑战和…...
手撕C++STL list:深入理解双向链表的实现
目录 1. 引言 3. list 类的实现 (1) 基本结构 (2) 初始化与清理 (3) 插入与删除 (4) 常用接口 (4) 常用接口 4. 测试代码 5. 总结 1. 引言 在C STL中,list是一个基于双向链表的容器,支持高效的头尾插入/删除操作(O(1)时间复杂度&…...
QMT学习课程Day1
我们先从交易的最基础,如何进行下单,最为简答的下单,帮助大家建立自信心。 首先导入相关函数: #encoding:gbk import pandas as pd import numpy as np import datetime import pandas as pd import numpy as np import talib i…...
【Rust结构体】Rust结构体详解:从基础到高级应用
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
Java面试实战:音视频场景下的微服务架构与缓存技术剖析
面试场景描述 谢飞机,一位自称“全栈工程师”的程序员,来到一家互联网大厂参加Java开发岗位的面试。面试官是一位严肃的技术专家,他希望通过一系列问题考察谢飞机的实际技术水平。 第一轮提问(基础问题) 面试官&…...
Vue 3 的核心组合式 API 函数及其完整示例、使用场景和总结表格
以下是 Vue 3 的核心组合式 API 函数及其完整示例、使用场景和总结表格: 1. ref 作用 创建一个响应式引用值,用于管理基本类型或单个值的响应式状态。 示例 <template><div><p>Count: {{ count }}</p><button click&quo…...
Kotlin学习基础知识大全(上)
文章目录 Kotlin基础知识全面解析第一章:Kotlin语言概述1.1 Kotlin的发展历程1.2 Kotlin的设计目标1.3 Kotlin的应用领域1.4 Kotlin与Java的比较 第二章:Kotlin基础语法2.1 变量与常量2.2 基本数据类型数字类型示例:字符和字符串示例…...
【Java面试笔记:进阶】18.什么情况下Java程序会产生死锁?如何定位、修复?
死锁(Deadlock)是指两个或多个线程因竞争资源而无限期阻塞的现象。 1. 死锁的定义与产生原因 定义:死锁是一种程序状态,多个线程或进程因循环依赖而永久处于等待状态,无法继续执行。 根据 Coffman 条件,死锁产生需同时满足以下四个必要条件: 互斥(Mutual Exclusion)…...
PS Mac Photoshop 2025 for Mac图像处理 PS 2025安装笔记
Mac分享吧 文章目录 效果一、准备工作二、开始安装1、Anticc简化版安装1.1双击运行软件,安装1.2 解决来源身份不明的开发者问题**此代码为打开:系统偏好设置 – 隐私与安全性,中的【任何来源】,如下图:**1.3 再次运行…...
HarmonyOS 框架基础知识
参考文档:HarmonyOS开发者文档 第三方库:OpenHarmony三方库中心仓 基础特性 Entry:关键装饰器 Components:组件 特性EntryComponent作用范围仅用于页面入口可定义任意可复用组件数量限制每个页面有且仅有一个无数量…...
LabVIEW实现Voronoi图绘制功能
该 LabVIEW 虚拟仪器(VI)借助 MathScript 节点,实现基于手机信号塔位置计算 Voronoi 图的功能。通过操作演示,能直观展示 Voronoi 图在空间划分上的应用。 各部分功能详细说明 随机地形创建部分 功能:根据 “Maximum a…...
centos7的环境下ollama 如何卸载
在 CentOS 7 环境下卸载 ollama,可以按照以下步骤操作。假设 ollama 是通过手动安装的,以下是卸载的详细步骤。 1. 停止所有运行中的 ollama 进程 在卸载之前,确保所有与 ollama 相关的进程都已停止。 查找并停止进程 ps aux | grep ollam…...
中心极限定理(CLT)习题集 · 答案与解析篇
中心极限定理(CLT)习题集 答案与解析篇 与题目篇一一对应。若有其他解法欢迎在评论区补充。 1. 概念与判断题 1.1 经典叙述 若 (X_1,X_2,\dots) i.i.d.,满足 (E[X_1]=\mu,;0<\sigma^2:=\operatorname{Var}(X_1)<\infty)。 则 [ Z_n=\frac{\sum_{k=1}^{n}(X_k-\mu)}…...
Spring Cloud Gateway配置双向SSL认证(完整指南)
本文将详细介绍如何为Spring Cloud Gateway配置双向SSL认证,包括证书生成、配置和使用。 目录结构 /my-gateway-project ├── /certs │ ├── ca.crt # 根证书 │ ├── ca.key # 根私钥 │ ├── gateway.crt # 网关证书 │ ├── …...
中间系统-SPF计算
SPF计算 isis如何计算路由:以自己为根构建SPF树,之后填充叶子。 <R1>display isis lsdb 0000.0000.0001.00-00 verbose //查看lsp的详细信息 SOURCE 0000.0000.0001.00 //源节点系统,用于标识产生该LSP的路由器…...