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

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实现技能记录系统 来自网络&#xff0c;有改进。 技能记录系统界面如下&#xff1a; 具有保存图片和显示功能——允许用户选择图片保存&#xff0c;选择历史记录时若有图片可预览图片。 这个程序的数据保存在数据库skills2.db中&#xff0c;此数据库由用Python 自带的…...

【专题刷题】二分查找(一):深度解刨二分思想和二分模板

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录&#xff0c;按专题划分每题主要记录&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代码&#xff1b;&#xff08;2&#xff09;优质解法 优质代码&#xff1b;&#xff…...

基于Python+Flask的MCP SDK响应式文档展示系统设计与实现

以下是使用Python Flask HTML实现的MCP文档展示系统&#xff1a; # 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)

“熵&#xff08;Entropy&#xff09;”是信息论、热力学、机器学习等多个领域的核心概念。它可以用一句话概括为&#xff1a; &#x1f511; 熵表示系统的不确定性或信息混乱程度。 &#x1f4da; 一、信息论中的熵&#xff08;Information Entropy&#xff09; 在 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…...

如何保证高防服务器中的系统安全?

对于高防服务器中的系统安全&#xff0c;企业通常会采取一系列的防护措施和策略防止网络攻击、入侵、恶意软件和其他网络安全威胁&#xff0c;下面是几个较为主要的安全防护措施&#xff0c;能够帮助企业提升高防服务器的安全性。 定期更新服务器中操作系统以及所有安装的软件&…...

【go语言】window环境从源码编译go

背景 早就听过go语言已经实现自举&#xff0c; 也就是使用旧版本go&#xff0c;来编译新版源码&#xff0c;得到新版本go。 步骤 1. 下载源码 git clone https://github.com/golang/go.git 2. 开始make cd go\src make.bat 3. 等待编译 卡住就按下回车 验证新版本 ……...

医学图像(DICOM数据)读取及显示(横断面、冠状面、矢状面、3D显示)为什么用ITK+VTK,单独用ITK或者VTK能实一样功能吗?

在医学图像处理中&#xff0c;结合使用 ITK 和 VTK 是常见的做法&#xff0c;因为它们各自专注于不同的核心功能。以下是逐步解释为何代码中同时使用两者&#xff0c;以及单独使用是否可行的分析&#xff1a; 1. 为什么用ITK处理DICOM数据&#xff1f; 1.1 ITK的DICOM处理优势…...

TiDB 深度解析与 K8S 实战指南

一、TiDB 核心特性与架构原理 1. 核心特性 分布式架构&#xff1a; 采用计算&#xff08;TiDB Server&#xff09;、存储&#xff08;TiKV&#xff09;、调度&#xff08;PD&#xff09;分离设计&#xff0c;支持水平扩展至 PB 级数据量。通过 PD 动态调度 Region&#xff08…...

WPS右键菜单中“上传到云文档”消失,使用命令行注册解决

关于上传到wps云文档&#xff0c;右键菜单莫名消失的问题 尝试在WPS设置显示上传到wps云文档的右键菜单&#xff0c;以及使用设置和修复工具修复&#xff0c;均无法显示菜单。 最终解决方法&#xff1a; regsvr32 "D:\Program Files (x86)\WPS Office\12.1.0.20784\offic…...

计算机求职面经内容与技巧分享

计算机求职面经内容与技巧分享 一、求职前的充分准备 &#xff08;一&#xff09;简历优化 突出技术能力&#xff1a;在简历中&#xff0c;务必清晰呈现自己精通的编程语言&#xff0c;例如熟练掌握 Java、Python 等语言的核心语法、常用库及框架。详细列举熟悉的技术栈&#x…...

java Springboot使用扣子Coze实现实时音频对话智能客服

一、背景 因公司业务需求&#xff0c;需要使用智能客服实时接听顾客电话。 现在已经完成的操作是&#xff0c;智能体已接入系统进行对练&#xff0c;所以本文章不写对联相关的功能。只有coze对接&#xff5e; 扣子提供了试用Realtime WebSocket&#xff0c;点击右上角setting配…...

焦化烧结行业无功补偿解决方案—精准分组补偿 稳定电能质量沃伦森

在焦化、烧结等冶金行业&#xff0c;负荷运行呈现长时阶梯状变化&#xff0c;功率波动相对平缓&#xff0c;但对无功补偿的分组精度要求较高。传统固定电容器组补偿方式无法动态跟随负荷变化&#xff0c;导致功率因数不稳定&#xff0c;甚至可能因谐波放大影响电网安全。 行业…...

机器人项目管理新风口:如何高效推动智能机器人研发?

在2025年政府工作报告中&#xff0c;“智能机器人”首次被正式纳入国家发展战略关键词。从蛇年春晚的秧歌舞机器人惊艳亮相&#xff0c;到全球首个人形机器人马拉松的热议&#xff0c;智能机器人不仅成为科技前沿的焦点&#xff0c;也为产业升级注入了新动能。而在热潮背后&…...

ZooKeeper配置优化秘籍:核心参数说明与性能优化

#作者&#xff1a;张桐瑞 文章目录 tickTime&#xff1a;Client-Server通信心跳时间initLimit&#xff1a;Leader-Follower初始通信时限syncLimit&#xff1a;Leader-Follower同步通信时限dataDir&#xff1a;数据文件目录clientPort&#xff1a;客户端连接端口服务器名称与地…...

uniapp -- 实现微信小程序、app、H5端视频上传

布局及实现代码&#xff1a; <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算法计算键哈希值&#xff0c;通过hash_slot CRC16(key) % 16384确定槽位分布&#xff0c;结合Redis Cluster自动管理槽位迁移。 总分片数按需动态调整&#xff0c;例如从16节点扩容至32节点时&#xff0c;触发槽位重分配以…...

前端跨端框架的开发以及IOS和安卓的开发流程和打包上架的详细流程

以下是关于 前端跨端框架开发 以及 iOS/Android 原生开发流程与上架 的详细指南&#xff0c;涵盖技术选型、开发工具、打包发布全流程&#xff1a; 一、前端跨端开发框架对比与流程 主流跨端框架 框架技术栈性能接近原生生态成熟度适用场景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//防止参数不够&#xff0c;可以做到一改全改…...

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生成式人工智能实战&#xff08;2&#xff09;——PyTorch基础 0. 前言1. 创建 PyTorch 张量2. PyTorch 张量索引和切片3. PyTorch 张量形状4. 在 PyTorch 张量数学运算小结系列链接 0. 前言 为了训练生成式人工智能模型&#xff0c;我们可以使用多种数据格式&#xff…...

解决高德地图AMapUtilCoreApi、NetProxy类冲突

问题&#xff1a; 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是一种分布式协调服务&#xff0c;用于管理大型主机。在分布式环境中协调和管理服务 是一种复杂的过程&#xff0c;ZooKeeper通过简单的架构和API解决了这个问题。ZooKeeper运行开 发人员专注于核心应用程序逻辑&#xff0c;而不必担心应用程序的分…...

特征存储的好处:特征存储在机器学习开发中的优势

随着企业寻求提升机器学习生产力和运营能力 (MLOps),特征存储 (Feature Store) 的普及度正在迅速提升。随着 MLOps 技术的进步,特征存储正成为机器学习基础设施的重要组成部分,帮助企业提升模型的性能和解释能力,并加速新模型与生产环境的集成。这些存储充当集中式存储库,…...

【Promethus(普罗米修斯)介绍安装及使用】

一、系统介绍 1、什么是Prometheus? Prometheus:不仅是一款时间序列数据库,在整个生态上还是一套完整的监控系统。同时,还涉及许多以“explore”命名的客户端数据采集工具以及pushgateway网关。 官网:https://prometheus.io/ 文献:https://prometheus.io/docs/introdu…...

力扣热题100题解(c++)—矩阵

73.矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 int m matrix.size(); // 行数int n matrix[0].size(); // 列数bool firstRowZero false; // 标记第一行是否包含 0bool f…...

Spring Boot Controller 单元测试撰写

文章目录 引言标准用法必需依赖项核心注解说明代码示例 当涉及静态方法时的测试策略必需依赖项核心注解说明代码示例 引言 之前在编写 Controller 层的单元测试时&#xff0c;我一直使用 SpringBootTest 注解&#xff0c;但它会加载整个 Spring 应用上下文&#xff0c;资源开销…...

MVCC详解

目录 undo日志版本链 read view一致性视图 MVCC过程分析 读事务&写事务 Multi-Version Concurrency Control&#xff0c;多版本并发控制在读已提交和可重复读隔离级别下都实现了MVCC机制 undo日志版本链 一行数据被修改后&#xff0c;MySQL会保留修改前的数据&#xff08;u…...

【通关函数的递归】--递归思想的形成与应用

目录 一.递归的概念与思想 1.定义 2.递归的思想 3.递归的限制条件 二.递归举例 1.求n的阶乘 2.顺序打印一个整数的每一位 三.递归与迭代 前言:上篇博文分享了扫雷游戏的实现&#xff0c;这篇文章将会继续分享函数的递归相关知识点&#xff0c;让大家了解并掌握递归的思…...

Python爬虫实战:移动端逆向工具Fiddler经典案例

一、引言 在移动互联网迅猛发展的当下,移动端应用产生了海量的数据。对于开发者而言,获取这些数据对于市场调研、竞品分析、数据挖掘等工作具有重要意义。Fiddler 作为一款功能强大的 Web 调试代理工具,能够有效捕获、分析和修改移动端的网络请求,为开发者深入了解移动端网…...

从平台工程视角出发,重塑云原生后端的工程体系

📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:从 DevOps 到平台工程,云原生后端的演进逻辑 云原生的广泛应用,使得后端系统的开发、部署与运维逐渐从“编写业务代码”演进为“构建工程平台”。过去,后端开发者通常将注意力集中于 API 编写…...

【Hive入门】Hive分区与分桶深度解析:优化查询性能的关键技术

引言 在大数据领域&#xff0c;Apache Hive作为构建在Hadoop之上的数据仓库工具&#xff0c;因其类SQL的查询语言(HiveQL)和良好的扩展性而广受欢迎。然而&#xff0c;随着数据量的增长&#xff0c;查询性能往往成为瓶颈。本文将深入探讨Hive中两种关键的数据组织技术——分区(…...

Pytorch中的Dataset和DataLoader

1. PyTorch数据处理的核心概念 在PyTorch中,数据处理主要依赖两个核心组件: torch.utils.data.Dataset:定义如何访问数据集(单个样本的数据和标签)。torch.utils.data.DataLoader:负责批量加载数据、打乱数据、并行加载等。1.1 为什么需要Dataset和DataLoader? 问题:深…...

中介者模式:解耦对象间复杂交互的设计模式

中介者模式&#xff1a;解耦对象间复杂交互的设计模式 一、模式核心&#xff1a;用中介者统一管理对象交互&#xff0c;避免两两直接依赖 当系统中多个对象之间存在复杂的网状交互时&#xff08;如 GUI 界面中按钮、文本框、下拉框的联动&#xff09;&#xff0c;对象间直接调…...

IEEE综述 | 车道拓扑推理20年演进:从程序化建模到车载传感器

导读 车道拓扑推理对于高精建图和自动驾驶应用至关重要&#xff0c;从早期的程序化建模方法发展到基于车载传感器的方法&#xff0c;但是很少有工作对车道拓扑推理技术进行全面概述。为此&#xff0c;本文系统性地调研了车道拓扑推理技术&#xff0c;同时确定了未来研究的挑战和…...

手撕C++STL list:深入理解双向链表的实现

目录 1. 引言 3. list 类的实现 (1) 基本结构 (2) 初始化与清理 (3) 插入与删除 (4) 常用接口 (4) 常用接口 4. 测试代码 5. 总结 1. 引言 在C STL中&#xff0c;list是一个基于双向链表的容器&#xff0c;支持高效的头尾插入/删除操作&#xff08;O(1)时间复杂度&…...

QMT学习课程Day1

我们先从交易的最基础&#xff0c;如何进行下单&#xff0c;最为简答的下单&#xff0c;帮助大家建立自信心。 首先导入相关函数&#xff1a; #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结构体详解:从基础到高级应用

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

Java面试实战:音视频场景下的微服务架构与缓存技术剖析

面试场景描述 谢飞机&#xff0c;一位自称“全栈工程师”的程序员&#xff0c;来到一家互联网大厂参加Java开发岗位的面试。面试官是一位严肃的技术专家&#xff0c;他希望通过一系列问题考察谢飞机的实际技术水平。 第一轮提问&#xff08;基础问题&#xff09; 面试官&…...

Vue 3 的核心组合式 API 函数及其完整示例、使用场景和总结表格

以下是 Vue 3 的核心组合式 API 函数及其完整示例、使用场景和总结表格&#xff1a; 1. ref 作用 创建一个响应式引用值&#xff0c;用于管理基本类型或单个值的响应式状态。 示例 <template><div><p>Count: {{ count }}</p><button click&quo…...

Kotlin学习基础知识大全(上)

文章目录 Kotlin基础知识全面解析第一章&#xff1a;Kotlin语言概述1.1 Kotlin的发展历程1.2 Kotlin的设计目标1.3 Kotlin的应用领域1.4 Kotlin与Java的比较 第二章&#xff1a;Kotlin基础语法2.1 变量与常量2.2 基本数据类型数字类型示例&#xff1a;字符和字符串示例&#xf…...

【Java面试笔记:进阶】18.什么情况下Java程序会产生死锁?如何定位、修复?

死锁(Deadlock)是指两个或多个线程因竞争资源而无限期阻塞的现象。 1. 死锁的定义与产生原因 定义:死锁是一种程序状态,多个线程或进程因循环依赖而永久处于等待状态,无法继续执行。 根据 Coffman 条件,死锁产生需同时满足以下四个必要条件: 互斥(Mutual Exclusion)…...

PS Mac Photoshop 2025 for Mac图像处理 PS 2025安装笔记

Mac分享吧 文章目录 效果一、准备工作二、开始安装1、Anticc简化版安装1.1双击运行软件&#xff0c;安装1.2 解决来源身份不明的开发者问题**此代码为打开&#xff1a;系统偏好设置 – 隐私与安全性&#xff0c;中的【任何来源】&#xff0c;如下图&#xff1a;**1.3 再次运行…...

HarmonyOS 框架基础知识

参考文档&#xff1a;HarmonyOS开发者文档 第三方库&#xff1a;OpenHarmony三方库中心仓 基础特性 Entry&#xff1a;关键装饰器 Components&#xff1a;组件 特性EntryComponent​​作用范围仅用于页面入口可定义任意可复用组件​​数量限制​​每个页面有且仅有一个无数量…...

LabVIEW实现Voronoi图绘制功能

该 LabVIEW 虚拟仪器&#xff08;VI&#xff09;借助 MathScript 节点&#xff0c;实现基于手机信号塔位置计算 Voronoi 图的功能。通过操作演示&#xff0c;能直观展示 Voronoi 图在空间划分上的应用。 各部分功能详细说明 随机地形创建部分 功能&#xff1a;根据 “Maximum a…...

centos7的环境下ollama 如何卸载

在 CentOS 7 环境下卸载 ollama&#xff0c;可以按照以下步骤操作。假设 ollama 是通过手动安装的&#xff0c;以下是卸载的详细步骤。 1. 停止所有运行中的 ollama 进程 在卸载之前&#xff0c;确保所有与 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如何计算路由&#xff1a;以自己为根构建SPF树&#xff0c;之后填充叶子。 <R1>display isis lsdb 0000.0000.0001.00-00 verbose //查看lsp的详细信息 SOURCE 0000.0000.0001.00 //源节点系统&#xff0c;用于标识产生该LSP的路由器…...