QT聊天项目开发DAY02
1.添加输入密码的保密性
LoginWidget::LoginWidget(QDialog*parent): QDialog(parent)
{ui.setupUi(this);ui.PassWord_Edit->setEchoMode(QLineEdit::Password);BindSlots();
}
2.添加密码的验证提示
3.修复内存泄漏,并嵌套UI子窗口到主窗口里面
之前并没有设置窗口的父类对象,而选择在mainWindow的析构函数释放函数导致的一系列问题
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);_LoginWidget = new LoginWidget(this);_RegisterWidget = new RegisterWidget(this);setCentralWidget(_LoginWidget);_LoginWidget->setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint);_RegisterWidget->setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint);_RegisterWidget->hide();// 绑定槽函数BindSlots();
}
4.设置错误提示的文本颜色
修改.qss文件
#Tip_Label[state='normal']
{color: green;
}#Tip_Label[state='err']
{color: red;
}
5.创建全局头文件,来管理状态
刷新当前UI窗口的状态,去qss文件中查询当前的窗口的样式
#ifndef GLOBAL_H
#define GLOBAL_H
#include <QWidget>
#include <functional>
#include "QStyle"// extern 声明此变量是在其他文件中定义的全局变量
extern std::function<void(QWidget*)> repolish;#endif // GLOBAL_H
#include "Global.h"// 初始化声明的全局变量
std::function<void(QWidget*)> repolish = [](QWidget* Widget)
{Widget->style()->unpolish(Widget);Widget->style()->polish(Widget);
};
6.刷新窗口的样式
#include "Global.h"RegisterWidget::RegisterWidget(QWidget *parent): QDialog(parent)
{ui.setupUi(this);ui.Tip_Label->setProperty("state", "normal");repolish(ui.Tip_Label);
}
7.正则表达式解析验证码
void RegisterWidget::ShowTipLabel(const QString& tip, QString State)
{ui.Tip_Label->setText(tip);ui.Tip_Label->setProperty("state", State);repolish(ui.Tip_Label);
}void RegisterWidget::OnGetCodeButtonClicked()
{QString Email = ui.Email_Edit->text();// 设置正则表达式QRegularExpression Regex(R"(^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$)");bool Match = Regex.match(Email).hasMatch();if (Match){// 发送验证码}else{ShowTipLabel(QString::fromLocal8Bit("邮箱格式不正确"), "error");}
}
8.创建模板单例类
#ifndef SINGLETON_H
#define SINGLETON_H
#include "Global.h"template<typename T>
class Singleton
{
protected:Singleton<T>() = default;Singleton(const Singleton<T>& ) = delete;Singleton<T>& operator=(const Singleton<T>& ) = delete;static std::shared_ptr<T> m_pInstance;public:static std::shared_ptr<T> Instance(){static std::once_flag flag;std::call_once(flag, []() {try {m_pInstance = std::shared_ptr<T>(new T());}catch (...) {// 处理异常,这里可以记录日志等std::cerr << "Failed to create singleton instance." << std::endl;}});return m_pInstance;}void PrintAddress(){cout << "Singleton<T> address: " << m_pInstance.get() << endl;}~Singleton<T>(){std::cout << "Singleton<T> is destroyed" << std::endl;}
};template<typename T>
std::shared_ptr<T> Singleton<T>::m_pInstance = nullptr;#endif // SINGLETON_H
9.创建全局唯一的模板网络管理类
头文件报错,模块没有添加,添加模块
#ifndef HTTPMANAGER_H
#define HTTPMANAGER_H#include "singletion.h"
#include <QString>
#include <QUrl>
#include <QObject>
#include <QNetworkAccessManager>
#include <QJsonObject>
#include <QJsonDocument>class HttpManager : public QObject, public Singleton<HttpManager>
{Q_OBJECT//public:
// ~HttpManager();
//
private:HttpManager();
};
#endif // HTTPMANAGER_H
在别的地方获取该模板类的指针编译,报错误
报错是编辑器还没有反应过来,已经没有问题了,然而在模板类中会析构自己创建的智能指针,而这个智能指针又会去调用HttpManager的析构函数,所以必须要将析构函数的权限设置为公有
如果设置为私有智能指针就找不到这个析构函数就会编译报错
设置成公有就没有任何问题
10.封装发送HTTP请求的接口
/* 发送Http请求 */
void PostHttpReq(QUrl url, QJsonObject jsonObj, ReqId reqId, Modules module);
创建全局的枚举
signals:void sig_http_finished(ReqID reqId, QString res, ErrorCodes errCode, Modules module);
11.Shared_Ptr的特点
每一个Shared_ptr 维护一个控制块,记录当前指向资源的引用计数(即有多少个shared_ptr 共享该资源)
行为:
构造/拷贝: 引用计数++
析构/重置(reset()) : 引用计数--
计数归零时自动释放该资源
#include <iostream>
#include <memory>class Widget {
public:Widget() {std::cout << "Widget constructor run" << std::endl;}~Widget() {std::cout << "Widget destructor run" << std::endl;}std::shared_ptr<Widget> GetSharedObject() {return std::shared_ptr<Widget>(this);}
};int main()
{std::shared_ptr<Widget> p(new Widget());std::shared_ptr<Widget> q = p;std::cout << p.use_count() << std::endl;std::cout << q.use_count() << std::endl;return 0;
}
智能指针拷贝或者赋值时,引用计数会++;
std::shared_ptr<Widget> p(new Widget());
std::shared_ptr<Widget> q = p->GetSharedObject();
int main()
{Widget* w = new Widget();std::shared_ptr<Widget> p(w);std::shared_ptr<Widget> p2(w);//std::shared_ptr<Widget> q = p->GetSharedObject();std::cout << p.use_count() << std::endl;std::cout << p2.use_count() << std::endl;return 0;
}
这两段代码其实是等价的,这就为同一个对象创建了第二个控制块,导致他们的引用计数都为1,造成了二次析构
std::enable_shared_from_this正是为了解决这个问题而存在
12.std::enable_shared_from_this
使用条件极为苛刻,只有当该对象被Shared_Ptr管理时,才能够正常的使用,否则会报错
#include <iostream>
#include <memory>class Widget : public std::enable_shared_from_this<Widget> {
public:Widget() {std::cout << "Widget constructor run" << std::endl;}~Widget() {std::cout << "Widget destructor run" << std::endl;}std::shared_ptr<Widget> GetSharedObject() {return shared_from_this();}
};int main()
{Widget* w = new Widget();//std::shared_ptr<Widget> p(w);std::shared_ptr<Widget> q = w->GetSharedObject();//std::cout << p.use_count() << std::endl;std::cout << q.use_count() << std::endl;return 0;
}
-
shared_from_this()
:- 返回与已有
shared_ptr
共享控制块 的新shared_ptr
。 - 若对象未被
shared_ptr
管理,调用它会抛出std::bad_weak_ptr
异常。
- 返回与已有
总结
- 永远不要直接通过
this
构造shared_ptr
,这会导致多个独立的控制块。 - 需要对象内部返回
shared_ptr
时,必须使用std::enable_shared_from_this
和shared_from_this()
。 - 创建对象时,优先使用
std::make_shared
或确保对象始终由shared_ptr
管理。
13.继续完善发送HTTP请求的接口
/* 发送HTTP请求 */
void HttpManager::PostHttpReq(QUrl url, QJsonObject jsonObj, ReqID reqId, Modules module)
{QByteArray data = QJsonDocument(jsonObj).toJson();QNetworkRequest request(url);request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");request.setHeader(QNetworkRequest::ContentLengthHeader, data.length());std::shared_ptr<HttpManager> self = shared_from_this();QNetworkReply* reply = m_pNetworkAccessManager->post(request, data);connect(reply, &QNetworkReply::finished, [self, reply, reqId, module](){if (reply->error() == QNetworkReply::NoError){QString strReply = QString(reply->readAll());emit self->sig_http_finished(reqId, strReply, ErrorCodes::SUCCESS, module);reply->deleteLater();return;}else{qDebug() << "HttpManager::PostHttpReq error: " << reply->error();emit self->sig_http_finished(reqId, "", ErrorCodes::ERROR_NETWORK, module);reply->deleteLater();return;}});
}
14.创建http请求完成的槽函数
public slots:void slot_http_finished(ReqID reqId, QString res, ErrorCodes errCode, Modules module);
/* 处理http请求发送成功的槽函数 */
void HttpManager::slot_http_finished(ReqID reqId, QString res, ErrorCodes errCode, Modules module)
{/* 转发给注册模块 */if (module == Modules::REGISTERMOD){emit sig_reg_mod_finished(reqId, res, errCode);}
}
15.实现注册模块的槽函数
/* 当注册成功时 */
void slot_reg_mod_finish(ReqID reqId, QString res, ErrorCodes errCode);
void RegisterWidget::BindSlots()
{connect(ui.Get_Code_Btn, &QPushButton::clicked, this, &RegisterWidget::OnGetCodeButtonClicked);/* 当注册请求完成时 */connect(HttpManager::Instance().get(), &HttpManager::sig_reg_mod_finished, this, &RegisterWidget::slot_reg_mod_finish);
}
/* 注册模块回调 */
void RegisterWidget::slot_reg_mod_finish(ReqID reqId, QString res, ErrorCodes errCode)
{if (errCode != ErrorCodes::SUCCESS){ShowTipLabel(QString::fromLocal8Bit("注册失败"), "error");return;}
}
16.解析Json字符串(反序列化)
// 解析Json
void AnalyzingJsonData(ReqID reqId, QByteArray data);/* 解析Json数据 */
void RegisterWidget::AnalyzingJsonData(ReqID reqId, QByteArray data)
{QJsonDocument jsonDoc = QJsonDocument::fromJson(data); // .json文件if (jsonDoc.isNull()){ShowTipLabel(QString::fromLocal8Bit("json 解析失败"), "error");return;}// 解析json数据if (!jsonDoc.isObject()){ShowTipLabel(QString::fromLocal8Bit("json 格式不正确"), "error");return;}// 回调函数_handlers[reqId](jsonDoc.object());
}
void RegisterWidget::InitHttpHandlers()
{// 注册获取验证码回包的逻辑_handlers.insert(ReqID::ID_GET_VARIFY_CODE, [this](const QJsonObject& jsonObj){int error = jsonObj["error"].toInt();if (error != ErrorCodes::SUCCESS){ShowTipLabel(QString::fromLocal8Bit("参数错误"), "error");return;}auto email = jsonObj["email"].toString();ShowTipLabel(QString::fromLocal8Bit("验证码已发送至邮箱,请注意查找"), "normal");qDebug() << QString::fromLocal8Bit("验证码已发送至邮箱") << email;});
}
注册函数对象,来动态绑定回调
相关文章:
QT聊天项目开发DAY02
1.添加输入密码的保密性 LoginWidget::LoginWidget(QDialog*parent): QDialog(parent) {ui.setupUi(this);ui.PassWord_Edit->setEchoMode(QLineEdit::Password);BindSlots(); }2.添加密码的验证提示 3.修复内存泄漏,并嵌套UI子窗口到主窗口里面 之前并没有设置…...
Spring AI高级RAG功能查询重写和查询翻译
1、创建查询重写转换器 // 创建查询重写转换器queryTransformer RewriteQueryTransformer.builder().chatClientBuilder(openAiChatClient.mutate()).build(); 查询重写是RAG系统中的一个重要优化技术,它能够将用户的原始查询转换成更加结构化和明确的形式。这种转…...
速盾:高防CDN的原理和高防IP一样吗?
随着互联网的发展,网络安全威胁日益严重,尤其是DDoS攻击、CC攻击等恶意行为,给企业带来了巨大的风险。为了应对这些挑战,许多企业开始采用高防CDN(内容分发网络)和高防IP作为防御措施。尽管两者都能提供一定…...
SQLite-Web:一个轻量级的SQLite数据库管理工具
SQLite-Web 是一个基于 Web 浏览器的轻量级 SQLite 数据库管理工具。它基于 Python 开发,免费开源,无需复杂的安装或配置,适合快速搭建本地或内网的 SQLite 管理和开发环境。 SQLite-Web 支持常见的 SQLite 数据库管理和开发任务,…...
数智读书笔记系列028 《奇点更近》
一、引言 在科技飞速发展的今天,我们对未来的好奇与日俱增。科技将如何改变我们的生活、社会乃至人类本身?雷・库兹韦尔的《奇点更近》为我们提供了深刻的见解和大胆的预测,让我们得以一窥未来几十年的科技蓝图。这本书不仅是对未来科技趋势…...
深入理解linux操作系统---第4讲 用户、组和密码管理
4.1 UNIX系统的用户和组 4.1.1 用户与UID UID定义:用户身份唯一标识符,16位或32位整数,范围0-65535。系统用户UID为0(root)、1-999(系统服务),普通用户从1000开始分配特殊UID&…...
系统设计模块之安全架构设计(常见攻击防御(SQL注入、XSS、CSRF、DDoS))
一、SQL注入攻击防御 SQL注入是通过恶意输入篡改数据库查询逻辑的攻击方式,可能导致数据泄露或数据库破坏。防御核心在于隔离用户输入与SQL代码,具体措施包括: 参数化查询(预编译语句) 原理:将SQL语句与用…...
redission锁释放失败处理
redission锁释放失败处理 https://www.jianshu.com/p/055ae798547a 就是可以删除 锁的key 这样锁就释放了,但是 还是要结合业务,这种是 非正规的处理方式,还是要在代码层面进行处理。...
Visual Studio Code 在.S汇编文件中添加调试断点及功能简介
目录 一、VS Code汇编文件添加断点二、VS Code断点调试功能简介1. 设置断点(1) 单行断点(2) 条件断点(3) 日志断点 2. 查看断点列表3. 调试时的断点控制4. 禁用/启用断点5. 删除断点6. 条件断点的使用7. 多线程调试8. 远程调试9. 调试配置文件 一、VS Code汇编文件添加断点 最…...
计算视觉与数学结构及AI拓展
在快速发展的计算视觉领域,算法、图像处理、神经网络和数学结构的交叉融合,在提升我们对视觉感知和分析的理解与能力方面发挥着关键作用。本文探讨了支撑计算视觉的基本概念和框架,强调了数学结构在开发鲁棒的算法和模型中的重要性。 AI拓展…...
Vue2 老项目升级 Vue3 深度解析教程
Vue2 老项目升级 Vue3 深度解析教程 摘要 Vue3 带来了诸多改进和新特性,如性能提升、组合式 API、更好的 TypeScript 支持等,将 Vue2 老项目升级到 Vue3 可以让项目获得这些优势。本文将深入解析升级过程,涵盖升级前的准备工作、具体升级步骤…...
器件封装-2025.4.13
1.器件网格设置要与原理图一致,同时器件符号要与数据手册一致 2.或者通过向导进行编辑,同时电机高级符号向导进行修改符号名称 2.封装一般尺寸大小要比数据手册大2倍到1.5倍 焊盘是在顶层绘制,每个焊盘距离要用智能尺子测量是否跟数据手册一…...
Python 基础语法汇总
Python 语法 │ ├── 基本结构 │ ├── 语句(Statements) │ │ ├── 表达式语句(如赋值、算术运算) │ │ ├── 控制流语句(if, for, while) │ │ ├── 定义语句(def…...
Java函数式编程魔法:Stream API的10种妙用
在Java 8中引入的Stream API为函数式编程提供了一种全新的方式。它允许我们以声明式的方式处理数据集合,使代码更加简洁、易读且易于维护。本文将介绍Stream API的10种妙用,帮助你更好地理解和应用这一强大的工具。 1. 过滤操作:筛选符合条件…...
【力扣hot100题】(094)编辑距离
记得最初做这题完全没思路,这次凭印象随便写了一版居然对了。 感觉这题真的有点为出题而出题的意思,谁拿到这题会往动态规划方向想啊jpg 也算是总结出规律了,凡是遇到这种比较俩字符串的十有八九是动态规划,而且是二维动态规划&…...
穿透三层内网VPC2
网络拓扑 目标出网web地址:192.168.139.4 信息收集端口扫描: 打开8080端口是一个tomcat的服务 版本是Apache Tomcat/7.0.92 很熟悉了,可能存在弱口令 tomcat/tomcat 成功登录 用哥斯拉生成马子,上传war包,进入后台 C…...
AI数字消费第一股,重构商业版图的新物种
伍易德带领团队发布“天天送AI数字商业引擎”,重新定义流量与消费的关系 【2025年4月,深圳】在人工智能浪潮席卷全球之际,深圳天天送网络科技有限公司于深圳大中华喜来登酒店重磅召开“AI数字消费第一股”发布盛典。公司创始人伍易德首次系统…...
Unity 基于navMesh的怪物追踪惯性系统
今天做项目适合 策划想要实现一个在现有的怪物追踪系统上实现怪物拥有惯性功能 以下是解决方案分享: 怪物基类代码: using UnityEngine; using UnityEngine.AI;[RequireComponent(typeof(NavMeshAgent))] [RequireComponent(typeof(AudioSource))] …...
【OpenCV】【XTerminal】talk程序运用和linux进程之间通信程序编写,opencv图像库编程联系
目录 一、talk程序的运用&Linux进程间通信程序的编写 1.1使用talk程序和其他用户交流 1.2用c语言写一个linux进程之间通信(聊天)的简单程序 1.服务器端程序socket_server.c编写 2.客户端程序socket_client.c编写 3.程序编译与使用 二、编写一个…...
中断的硬件框架
今天呢,我们来讲讲中断的硬件框架,这里会去举3个开发板,去了解中断的硬件框架: 中断路径上的3个部件: 中断源 中断源多种多样,比如GPIO、定时器、UART、DMA等等。 它们都有自己的寄存器,可以…...
大数据面试问答-Hadoop/Hive/HDFS/Yarn
1. Hadoop 1.1 MapReduce 1.1.1 Hive语句转MapReduce过程 可分为 SQL解析阶段、语义分析阶段、逻辑计划生成阶段、逻辑优化阶段、物理计划生成阶段。 SQL解析阶段 词法分析(Lexical Analysis):使用Antlr3将SQL字符串拆分为有意义的token序列 语法分析(Syntax An…...
【小沐学GIS】基于C++绘制三维数字地球Earth(QT5、OpenGL、GIS、卫星)第五期
🍺三维数字地球系列相关文章如下🍺:1【小沐学GIS】基于C绘制三维数字地球Earth(OpenGL、glfw、glut)第一期2【小沐学GIS】基于C绘制三维数字地球Earth(OpenGL、glfw、glut)第二期3【小沐学GIS】…...
初始图形学(3)
昨天休息了一天,今天继续图形学的学习 向场景发射光线 现在我们我们准备做一个光线追踪器。其核心在于,光线追踪程序通过每个像素发送光线。这意味着对于图像中的每个像素点,程序都会计算一天从观察者出发,穿过该像素的光线。并…...
如果想在 bean 创建出来之前和销毁之前做一些自定义操作可以怎么来实现呢?
使用生命周期扩展接口(最灵活) 创建前拦截可以通过实现 InstantiationAwareBeanPostProcessor 接口的 postProcessBeforeInstantiation 方法,在Bean实例化前执行逻辑 在销毁前拦截可以通过实现 DestructionAwareBean 接口的 postProcessBe…...
【甲子光年】DeepSeek开启AI算法变革元年
目录 引言人工智能的发展拐点算力拐点:DeepSeek的突破数据拐点:低参数量模型的兴起算法创新循环算法变革推动AI普惠应用全球AI科技竞争进入G2时代结论 引言 2025年,人工智能的发展已经走到了一个战略拐点。随着技术能力的不断提升࿰…...
Go语言--语法基础4--基本数据类型--整数类型
整型是所有编程语言里最基础的数据类型。 Go 语言支持如下所示的这些整型类型。 需要注意的是, int 和 int32 在 Go 语言里被认为是两种不同的类型,编译器也不会帮你自动做类型转换, 比如以下的例子会有编译错误: var value2 in…...
MCP基础学习计划详细总结
MCP基础学习计划详细总结 1.MCP概述与基础 • MCP(Model Context Protocol):由Anthropic公司于2024年11月推出,旨在实现大型语言模型(LLM)与外部数据源和工具的无缝集成。 • 核心功能: • 资…...
大模型到底是怎么产生的?一文揭秘大模型诞生全过程
前言 大模型到底是怎么产生的呢? 本文将从最基础的概念开始,逐步深入,用通俗易懂的语言为大家揭开大模型的神秘面纱。 大家好,我是大 F,深耕AI算法十余年,互联网大厂核心技术岗。 知行合一,不写水文,喜欢可关注,分享AI算法干货、技术心得。 【专栏介绍】: 欢迎关注《…...
Node.js介绍
一、Node.js 核心定义 本质:基于 Chrome V8 引擎构建的 JavaScript 运行时环境,用于在服务器端执行 JavaScript 代码。 定位:非阻塞、事件驱动的 I/O 模型,专为高并发、实时应用设计。 诞生:2009 年由 Ryan Dahl 发布…...
DRABP_NSGA2最新算法神圣宗教算法优化BP做代理模型,NSGA2反求最优因变量和对应的最佳自变量组合,Matlab代码
一、神圣宗教算法(DRA)优化BP代理模型 1. DRA的核心原理 DRA是一种模拟宗教社会层级互动的元启发式算法,通过“追随者学习”、“传教士传播”和“领导者引导”三种行为模式优化搜索过程。在BP神经网络优化中,DRA通过以下步骤调整…...
Android Studio 在 Windows 上的完整安装与使用指南
Android Studio 在 Windows 上的完整安装与使用指南—目录 一、Android Studio 简介二、下载与安装1. 下载 Android Studio2. 安装前的依赖准备3. 安装步骤 三、基础使用指南1. 首次启动配置2. 创建第一个项目3. 运行应用4. 核心功能 四、进阶功能配置1. 配置 SDK 和工具2. 自定…...
Matlab学习笔记五十:循环语句和条件语句的用法
1.说明 循环语句:for…end,while…end 条件语句:if…end,switch…case…end 其中if语句语法还可以是:for…else…end,for…elseif…else…end 2.简单for程序实例 for x1:5 %循环遍历1~5 yx5 end [1…...
大漠流光:科技牧歌的未来-内蒙古鄂尔多斯
故事背景 故事发生在中国内蒙古鄂尔多斯,这里是蒙古族文化的摇篮,也是科技与自然交织的未来舞台。在这片广袤的土地上,蒙古族少女、老牧人和工程师们共同谱写着一曲科技与传统共生的赞歌。未来的鄂尔多斯,不再是单一的沙漠或草原…...
MySQL与Oracle深度对比
MySQL与Oracle深度对比:数据类型与SQL差异 一、数据类型差异 1. 数值类型对比 数据类型MySQLOracle整数TINYINT, SMALLINT, MEDIUMINT, INT, BIGINTNUMBER(精度) 或直接INT(内部仍为NUMBER)小数DECIMAL(p,s), FLOAT, DOUBLENUMBER(p,s), FLOAT, BINARY_FLOAT, BI…...
GESP2023年12月认证C++七级( 第一部分选择题(6-10))
选择题第八题: #include <iostream> #include <cstring> #include <algorithm> using namespace std;const int MAXN 1005; // 假设字符串长度不超过1000 char s1[MAXN], s2[MAXN]; int dp[MAXN]; // 一维DP数组int main() {while (cin >>…...
腾势品牌欧洲市场冲锋,科技豪华席卷米兰
在时尚与艺术的交汇点,米兰设计周的舞台上,一场汽车界的超级风暴正在酝酿,腾势品牌如一头勇猛无畏的雄狮,以雷霆万钧之势正式向欧洲市场发起了冲锋。其最新力作——腾势Z9GT的登场,仿佛是一道闪电划破夜空,…...
双指针、滑动窗口
一、双指针 双指针是指在算法中使用两个指针(通常是索引或迭代器)来解决问题,通过移动这两个指针来扫描数据结构(如数组或链表),从而达到高效的目的。双指针的核心思想是利用两个指针的相对位置或移动方式…...
《数据密集型应用系统设计》读书笔记:第二章
我们继续拆解 第2章:数据模型与查询语言。这章讲的是如何组织数据、如何访问数据,也是你选择数据库种类的根本依据。 第2章:数据模型与查询语言 一、为何数据模型重要? Martin 开篇就强调,数据模型影响: …...
ubuntu24.04LTS安装向日葵解决方案
去向日葵官方下载ubuntu使用的deb包 向日葵 输入如下命令安装,将具体版本修改成自己下载的版本 andrew in ~/下载 λ sudo dpkg -i SunloginClient_15.2.0.63064_amd64.deb 正在选中未选择的软件包 sunloginclient。 (正在读取数据库 ... 系统当前共安装有 290947…...
Python基础语法1
目录 1、认识Python 1.1、计算机 1.2、编程 1.3、编程语言的类别 1.4、Python背景 1.5、Python的应用场景 1.6、Python的优缺点 1.7、Python前景 1.8、Python 环境 2、常量和表达式 3、变量和类型 3.1、定义变量 3.2、使用变量 3.3、变量的类型 3.3.1、整形 3.3…...
深度学习中多机训练概念下的DP与DDP
在进行单机多卡/多机多卡训练时,通常会遇到DP与DDP的概念,为此基于kimi大模型对二者的差异进行梳理。使用DP/DPP的核心是数据并行,也就是根据显卡数量对数据集进行分治,每一个显卡都有一个独立完整的模型和一个局部数据。在多个显…...
设计模式(结构型)-桥接模式
目录 摘要 定义 类图 角色 具体实现 优缺点 优点 缺点 使用场景 使用案例 JDBC 和桥接模式 总结 摘要 在软件开发领域,随着系统规模和复杂性的不断攀升,如何设计出具有良好扩展性、灵活性以及可维护性的软件架构成为关键挑战。桥接模式作为一…...
精品推荐 | 湖仓一体电商数据分析平台实践教程合集(视频教程+设计文档+完整项目代码)
精品推荐,湖仓一体电商数据分析平台实践教程合集,包含视频教程、设计文档及完整项目代码等资料,供大家学习。 1、项目背景介绍及项目架构 2、项目使用技术版本及组件搭建 3、项目数据种类与采集 4、实时业务统计指标分析一——ODS分层设计与数…...
【LangChain少样本提示工程实战】FewShotPromptTemplate原理与应用解析——附运行代码
目录 引言 重点提炼 一、FewShotPromptTemplate作用 1. 整合示例与模板,构建结构化提示 2. 引导模型理解任务逻辑 3. 提升少样本场景下的模型性能 4. 支持动态示例选择(扩展功能) 5. 与其他模块…...
基于LSTM的文本分类3——模型训练
前言 之前已经完成了模型搭建和文本数据处理,现在做一下模型训练。 源码 # -*- coding: UTF-8 -*- import numpy as np import torch import torch.nn as nn import torch.nn.functional as F from sklearn import metrics # 导入评估指标 import time from uti…...
【JS】关于原型/原型链
本文会讲解什么是原型,什么是原型链,以及查找原型的方法,最后会实现一个函数:判断某对象是否有某属性。 定义 原型:函数都有prototype属性,称作原型/原型对象 原型可以放一些方法和属性,共享…...
猫咪如厕检测与分类识别系统系列【五】信息存储数据库改进+添加猫咪页面制作+猫咪躯体匹配算法架构更新
前情提要 家里养了三只猫咪,其中一只布偶猫经常出入厕所。但因为平时忙于学业,没法时刻关注牠的行为。我知道猫咪的如厕频率和时长与健康状况密切相关,频繁如厕可能是泌尿问题,停留过久也可能是便秘或不适。为了更科学地了解牠的如…...
k8s的配置文件总结
在 Kubernetes 中,配置文件 是定义集群资源的核心,通常以 YAML 或 JSON 格式编写。以下是 Kubernetes 中关键的配置文件类型及其作用: 1. 核心工作负载配置 (1) Deployment • 用途:定义无状态应用的 Pod 副本管理策略ÿ…...
插值算法 - 最近邻插值实现
目录 1. 导入必要的库 2. nearest_neighbor_interpolation 3. 测试代码 数学原理 完整代码 本文实现了基于最近邻插值算法的图像缩放功能。 它使用 Python 编写,主要依赖于NumPy和PIL(Python Imaging Library)库。 NumPy用于高效的数值计算,而PIL仅用于图像的加载和…...
QEMU源码全解析 —— 块设备虚拟化(19)
接前一篇文章:QEMU源码全解析 —— 块设备虚拟化(18) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 《KVM实战 —— 原理、进阶与性能调优》—— 任永杰 程舟,机械工业出版社 特此致谢! QEMU启动…...