机器学习(Machine Learning)的安全问题
最近看论文,看到了”对抗样本“的一些内容,然后又研究了一下其背后的东西,发现还有”机器学习的安全“这一问题,然后找了几篇博客看了一下,发现了篇2019年的比较有意思的文章,这里整理一下,方编译后查阅。
机器学习(Machine Learning)的安全问题
- 关于机器学习,每个人都忘记了什么
- 病毒软件的发展
- 安全业务的发展
- ML 是否需要安全?
- ML 安全的发展
- 我的机器学习系统会受到攻击吗?
- 威胁模型饼图
- 谁+为什么(WHO+WHY)
- 如何(HOW)
- 将威胁模型融为一体
- 参考文献
关于机器学习,每个人都忘记了什么
人工智能,更具体地说是机器学习,确实正在将科幻小说变为现实。看穿墙壁?通过视频猜测材料的物理特性?通过键盘声音估算击键次数?那么生成逼真的面孔、身体或诗歌呢?或者教机器画画?
现在,如果你真的去和人工智能/ML 领域的从业人员交谈,你可能会得到两种回答中的一种:
- 他们对人工智能/ML 所能做的事情感到无比兴奋,并正在研究下一个大的视觉/NLP/强化学习问题;
- 他们对我们这些愚蠢的人类正在建造的东西感到无比恐惧,并认为人工通用智能很快就会把人类变成一堆没用的回形针。
病毒软件的发展
让我们回顾历史,重温 PC 市场。第一台个人电脑(Altair 8800)发布于 1975 年,随后的 10 年里,个人电脑不断推陈出新,最终于 1984 年推出了我们现在看起来再熟悉不过的 “苹果 Macintosh”。随之而来的是一股爆炸性的应用浪潮,这股浪潮一直持续到整个 20 世纪 90 年代,直至 2000 年:
然而,大多数用户并不知道,恶意软件或 “恶意软件”市场正在发生类似的爆炸。
1989 年,罗伯特-莫里斯(Robert Morris)利用 Unix sendmail 进行实验,制作了一个可自我复制的蠕虫病毒,并将其发送到互联网上。最初只是一次实验,最后却成为了第一次 DoS 攻击,造成的损失估计在 10 万到 1 万美元之间,整个互联网的运行速度慢了好几天(当然,这在现在是不可想象的)。
随后,1989 年出现了第一次勒索软件攻击,1996 年出现了第一个 Linux 病毒(“Staog”),1998 年出现了第一个 AOL 木马。
后来,同样的情况也发生在移动领域:2007 年 iPhone 诞生之后,智能手机的应用出现了爆炸式增长:
…随后是移动恶意软件的爆炸式增长:
现在–机器学习怎么样?
尽管热闹非凡,但机器学习的产品化仍处于起步阶段。许多真正前沿的工作仍局限于研究实验室和大学,但即使从研究的角度来看,我们也可以开始看到一些相同的趋势。
按年份和领域分列的机器学习研究论文数量:
…VS “对抗式机器学习(adversarial machine learning)”(ML 版恶意软件)研究论文数量:
安全业务的发展
没那么快 好消息是,随着个人电脑占据我们的日常生活,黑客们开始入侵,另一个市场也同时发展起来,那就是安全解决方案市场。
第一款反病毒产品由 Andreas Lüning 和 Kai Figge 于 1987 年为 Atari ST 平台开发。同年,McAffee、NOD、Flu Shot 和 Anti4us 相继问世,并在随后的二十年中推出了更多产品:
随着移动恶意软件的快速增长,移动领域的安全厂商也出现了类似的爆炸式增长:
那么机器学习呢?
ML 是否需要安全?
下面是原文作者的原话:
过去,我曾在英国最大的金融科技公司之一 GoCardless 负责反欺诈和反洗钱工作。我的团队每年监管的交易额超过 100亿美元,我们一直在努力将骗子挡在 GC 的循环系统之外。很自然地,我们在某一时刻屈服于炒作,决定尝试机器学习。
让我当时感到惊讶的是,它竟然奏效了。事实上,效果非常好。摒弃传统的启发式方法,我们成功地将欺诈造成的资金损失减少了80%,并将涉嫌洗钱账户的检测率提高了 20 倍之多。 问题只有一个。
我们在我认为是 “关键”的地方部署了机器学习。我们交给算法的任务是不允许失败的,因为一旦失败,我们要么会损失一大笔钱,要么会被吊销金融执照。对于直接负责 GC安全的产品经理我来说,这两件事听起来都不太令人兴奋。
因此,我需要知道 ML 如何以及何时会失败。我们的模型如何被利用?它的内在漏洞在哪里?我如何知道 GoCardless 是否受到攻击?
对ML存在中毒攻击,即攻击者通过在训练过程中注入损坏的数据来影响模型的思维。ML存在对抗性的样本,以及ML模型是可以被精心设计的扰动的输入数据轻易误导的。
到 2019 年底,1/3 的企业将部署机器学习。这相当于你、我、我们的朋友和亲人每天使用的所有产品的1/3–在任何对机器学习工作原理一知半解的攻击者面前都是赤裸裸的。
是的,机器学习需要安全。
ML 安全的发展
ML 安全是一个非常新兴的领域,到目前为止基本上还不存在。如果说从上述研究中学到了什么,那就是任何没有数学博士学位的人都很难弄明白如何确保他们的 ML 安全(如今几乎没有任何解决方案,只有大量数学研究论文)。
考虑到我们即将把生命中的大部分时间托付给算法,作者认为“我们有责任确保安全,这是你的责任、我的责任,也是整个 ML 社区的责任”。
今天,我们可以做很多事情来构建更强大的 ML 模型。但更重要的是,我们需要转变观念–从 “不惜一切代价保证准确性 ”转变为更加平衡准确性与鲁棒性的方法“
我的机器学习系统会受到攻击吗?
威胁模型饼图
在 Calypso,当我们考虑威胁模型时,我们喜欢考虑三个独立的部分:
谁会攻击你?(WHO will attack you?) 一切从 “谁 ”开始。攻击者,对手,对方。定义 “谁 ”的工作可以变得超级简单,也可以变得超级困难。
一方面,你可以直接说 “黑客”。另一方面,这又能为你提供什么信息呢?“了解机器学习如何工作的黑客 "可能更好。“了解机器学习工作原理并有数学背景的黑客 "可能更好。围绕WHO的细节越多越好。
他们为什么要攻击你?(WHY will they attack you?) 为什么 “与 ”谁 "关系密切(下文将一并讨论)。
WHY 背后的想法很简单–他们可以黑你,但为什么要黑?这里面一定有他们想要的东西。赏金,奖励。同样,定义 “为什么 ”可以简单到说 “为什么不”(不建议),也可以难到说 “违反保密性,然后将从我的 ML 系统中提取的数据卖给 X 实体”(更好!)。
他们会如何攻击你?(HOW will they attack you?) 这是技术部分。既然知道了 “谁 ”和 “为什么 ”会攻击你,下一个问题就是 “如何 ”攻击你?
如果我们谈论的是机器学习,他们会在训练或推理过程中攻击你的 ML 吗?他们会掌握多少关于你的系统的信息?他们也许能黑进你的机器学习,但如果黑进你的数据管道更容易,他们会这么做吗?
让我们来详细了解一下。
谁+为什么(WHO+WHY)
WHO。从广义上讲,作者喜欢将对手视为“严肃”的级别。作者认为它是这样的:
- 聪明的研究人员/工程师在商业机器学习系统上闲逛
- 白帽参与赏金计划
- 彭斯特/红队队员进行测试
- 黑客活动家攻击商业机器学习系统以证明这一点
- 黑帽攻击商业机器学习系统以获得经济奖励(无论是通过实际部署漏洞还是在暗网市场上出售)
- 有组织的黑帽团体攻击商业机器学习系统(例如 Anonymous、The Shadow Brokers 和 Legion of Doom)
- 国家资助的组织(此时基本上是网络战)
重要的是要考虑你的对手有多严重,因为这决定了他们可能获得的知识和工具的种类,从而决定了你的防御水平。
现在是 “为什么”。作者任务“为什么 ”可以分为两个问题:
他们的目标是什么?
他们的动机是什么?
在回答目标问题时,我喜欢使用 CIA 三段论:
三要素–保密性(confidentiality)、完整性(integrity)和可用性(availability )–是指安全的三大支柱。如果你能保护所有这三个要素,你就拥有了安全保障。
保密(或隐私)攻击(Confidentiality (or privacy) attacks ) 旨在从您的 ML 系统中提取敏感信息。例如,攻击者可能想推断特定数据点(如您)是否属于特定训练数据集(如医院出院)的一部分。
完整性攻击(Integrity attacks) 会让您的 ML 模型出错,但重要的是,这种攻击不会声张。例如,攻击者可能想让你的分类器将恶意文件当作良性文件,而不影响其整体性能,这样你就永远不会注意到。在完整性攻击中,攻击者可以有多个子目标(从难到易):
- 源/目标错误分类(Source/target misclassification)–攻击者希望将一个特定类别(“恶意”)分类为另一个特定类别(“良性”)。
- 目标分类错误(Targeted misclassification)–攻击者希望将特定类别(“停止 ”标志)分类为任何其他类别(例如 “限速 60 ”或 “限速 45 ”或 “狗 ”或 “人 ”或其他。只要不停车就行)。
- 错误分类(Misclassification)–任何类别变成任何其他类别。这属于可用性攻击的范畴(如下)。
- 降低信任度(Confidence reduction)–攻击者希望你的模型失去信任度(当模型工作在阈值范围内时很有用,例如在欺诈评分的情况下)。
可用性攻击(Availability attacks) 的目的是让你的 ML 系统完全瘫痪。例如,如果在训练池中插入足够多的坏数据,那么模型学习的边界基本上就是垃圾,模型就会变得毫无用处。这是机器学习领域的 DOS 攻击。
除了攻击者的目标,还有攻击者的动机。这一点要主观得多,而且与WHO交织在一起。如果你是一个黑客组织,顾名思义,你想发表某种声明;如果你是一个黑帽子组织,你可能想获得经济利益。
如何(HOW)
技术部分。别人如何才能真正破解你的模型?(在此,将重点讨论 ML 特有的漏洞,而不包括传统的网络安全问题,如 ML 服务器上的 DDOS)。
我们可以从以下四个方面对 ML 攻击进行分类:
- 时机(训练/推理)
- 能力(白盒/黑盒/灰盒)
- 局限性(扰动距离/功能/领域/再训练频率)
- 替代方法
时机(Timing ) --这是指攻击发生在 ML 部署管道的哪个位置。这里有两大选择–训练时间和推理时间。
- 训练时的攻击意味着攻击者能够影响训练数据集(威力无限,但很难做到,而且有额外限制)。
- 推理时的攻击意味着攻击者只能扰乱直接输入(可能强大,也可能不强大,这取决于模型,但由于只需要一种注入修改输入的方法,因此更容易实施)。
能力(Capability )–指攻击者对 ML 系统内部的了解。具体来说
- 白盒(WhiteBox )攻击假定攻击者知道底层数据的分布(有可能获取部分数据)、模型的架构、使用的优化算法以及权重和偏差。
- 黑盒(BlackBox )攻击假定攻击者对 ML 系统一无所知(因此不知道上述任何内容)。它们可以分为两种类型:硬标签(攻击者只从分类器中获得预测标签)和置信度(攻击者从分类器中获得预测标签和置信度分数)。
- 灰盒(GreyBox )攻击介于两者之间。例如,攻击者可能知道模型是什么样的,但不知道底层数据是什么样的,反之亦然。
限制(Limitations ) 是指限制攻击者可以执行的操作的某些规则。这些确实是 ML 系统特定的。例如:
- 在图像中,将扰动空间限制为 “距离 ”度量是很常见的,通常是从 Li、L1 或 L2 规范中挑选出来的。关于这种方法是否合理,这里有一个有趣的争论(阅读这份长达 33 页的白皮书,了解更多信息)。
- 在恶意软件中,攻击者只能在特定位置以特定方式扰乱文件,否则文件将失去其恶意功能或完全崩溃。
- 在物理设备(卫星、汽车、无人机、监控摄像头)上部署的系统中,攻击者可能只能修改物理域中的输入。
- 在训练时的攻击中,攻击者需要做到两点:a) 系统根据新数据不断进行再训练(否则他们就无法注入不良数据);b) 系统从外部来源获取数据,最好不需要人工批准。
- 在隐私攻击中,攻击者一般需要一个没有查询限制并能输出置信度分数的公共端点。置信度分数的限制性特别强–例如,大多数反病毒产品只会告诉你它们认为该文件是 “恶意 ”还是 “良性”,而不会提供更多细节。
替代方案(Alternatives )–一个在安全领域工作了 25 年的人把攻击者形容为 “电”。他们总是选择阻力最小的路径。
这是一个重要的标准,很容易决定一个威胁模型的成败。攻击 ML 组件是否是攻击者达到目的的最简单方法?例如,如果目标是侵犯隐私,他们是否会费尽周折在你的分类器上建立影子模型来获取数据,或者是否有更容易利用的漏洞?
将威胁模型融为一体
让我们把它们汇集在一起:
现在,让我们来介绍一些术语。
在对抗式 ML(Adversarial ML )(ML 安全的学术层面)中,通常从 “WHY ”维度中提取 “Goal”(目标),从 “HOW”(如何)维度中提取 “Timing”(时机)来命名攻击。输出结果如下
- 规避攻击(Evasion attacks)(也称为 “对抗样本(adversarial examples)”) 无疑是最常见的攻击类型。它们发生在推理时,利用的是 ML 固有的漏洞(或者说是 “特征”?)
- 病毒攻击(Poisoning attacks) 发生在训练时间,目标有两个–完整性或可用性。攻击者可以在训练池中插入一些精心挑选的示例,从而在训练池中建立一个 “后门”(完整性),也可以插入大量的坏数据,使模型的边界基本上变得毫无用处(可用性)。在此了解有关机器学习中毒的所有信息。
- 隐私攻击(rivacy attacks) 可能是研究得最少的一种攻击,但尤其在今天,它是一种极其重要的威胁。在这种情况下,攻击者并不想干扰你的机器学习模型的工作,而是想从中提取可能是敏感的私人信息。有关隐私漏洞和修复方法,请阅读我的完整文章。
参考文献
What everyone forgets about Machine Learning
Will my Machine Learning System be attacked?
Poisoning attacks on Machine Learning
Privacy attacks on Machine Learning
相关文章:
机器学习(Machine Learning)的安全问题
最近看论文,看到了”对抗样本“的一些内容,然后又研究了一下其背后的东西,发现还有”机器学习的安全“这一问题,然后找了几篇博客看了一下,发现了篇2019年的比较有意思的文章,这里整理一下,方编…...
ROS1安装教程
一、环境准备 操作系统:Ubuntu 20.04 LTS 注:为保证系统干净,本文使用Docker进行 演示,如已安装相应的Ubuntu系统请忽略。 Docker安装Ubuntu系统步骤如下: # 拉取镜像 docker pull ubuntu:20.04# 创建容器 docker ru…...
大腾智能CAD:国产云原生三维设计新选择
在快速发展的工业设计领域,CAD软件已成为不可或缺的核心工具。它通过强大的建模、分析、优化等功能,不仅显著提升了设计效率与精度,还促进了设计思维的创新与拓展,为产品从概念构想到实体制造的全过程提供了强有力的技术支持。然而…...
Docker 入门:如何使用 Docker 容器化 AI 项目(一)
引言 在人工智能(AI)项目的开发和部署过程中,环境配置和依赖管理往往是开发者遇到的挑战之一。开发者通常需要在不同的机器上运行同样的代码,确保每个人使用的环境一致,才能避免 “在我的机器上可以运行”的尴尬问题。…...
【04-数据库面试】
如何创建一个新的数据库 数据库是现代信息技术中不可或缺的一部分,它为存储、检索和管理数据提供了强大的工具。无论是企业还是个人,都可能需要创建自己的数据库以满足特定的需求。本文将详细介绍创建一个新数据库的步骤,包括规划、选择数据…...
单元测试使用记录
什么是单元测试 简单来说就是对一个类中的方法进行测试,对输出的结果检查判断是否符合预期结果 但是在多年的工作中,从来没有哪个项目中真正系统的用到了单元测试,因此对它还是很陌生的,也就造成更加不会在项目中区使用它。 如何…...
《深入浅出 Servlet:Java Web 开发的基石》(二)
ServletConfig(熟练) ServletConfig对象对应web.xml文件中的<servlet>元素。例如你想获取当前Servlet在web.xml文件中的配置名,那么可以使用servletConfig.getServletName()方法获取! 你不能自己去创建ServletConfig对象,Servlet的in…...
Pytorch | 从零构建MobileNet对CIFAR10进行分类
Pytorch | 从零构建MobileNet对CIFAR10进行分类 CIFAR10数据集MobileNet设计理念网络结构技术优势应用领域 MobileNet结构代码详解结构代码代码详解DepthwiseSeparableConv 类初始化方法前向传播 forward 方法 MobileNet 类初始化方法前向传播 forward 方法 训练过程和测试结果…...
冯诺依曼架构与哈佛架构的对比与应用
冯诺依曼架构(Von Neumann Architecture),也称为 冯诺依曼模型,是由著名数学家和计算机科学家约翰冯诺依曼(John von Neumann)在1945年提出的。冯诺依曼架构为现代计算机奠定了基础,几乎所有现代…...
【Java基础面试题032】Java中的字节码是什么?
回答重点 Java字节码是Java编译器将Java源代码编译后生成的 位于Java源代码与JVM执行的执行的机器码之间。 Java字节码由JVM解释或即时编译(JIT)为机器码执行 扩展知识 Java字节码的关键点 1)字节码结构: Java字节码是与平…...
K8s ConfigMap的基础功能介绍
在 Kubernetes 中,ConfigMap 是一种用于管理配置信息的资源对象,它允许你将 配置信息与代码解耦,方便管理和更新应用配置,而无需重新构建镜像或重启服务。 ConfigMap 的功能 存储配置信息: 可以以 键值对 的形式存储配…...
stm32制作CAN适配器4--WinUsb的使用
前面使用STM32G474芯片的USB模块做了一个CANFD程序,当时用的是HID模式,在实际使用时发现HID模块的通讯速率太慢了,只能1ms传输一帧,就会造成有些掉帧现象。 现在就把HID模块改为在Window下同样免驱的WinUsb来实现CANFD数据的传输。…...
深入理解 Java 中的 ArrayList 和 List:泛型与动态数组
深入理解 Java 中的 ArrayList 和 List:泛型与动态数组 在 Java 编程中,ArrayList 和 List 是最常用的集合类之一。它们帮助我们管理动态数据,支持按索引访问、增加、删除元素等操作。尤其在使用泛型时,理解它们之间的关系及应用…...
[react 3种方法] 获取ant组件ref用ts如何定义?
获取ant的轮播图组件, 我用ts如何定义? Strongly Type useRef with ElementRef | Total TypeScript import React, { ElementRef } from react; const lunboRef useRef<ElementRef<typeof Carousel>>(null); <Carousel autoplay ref{lunboRef}> 这样就…...
VS Code Copilot 与 Cursor 对比
选手简介 VS Code Copilot:算是“老牌”编程助手了,虽然Copilot在别的编辑器上也有扩展,不过体验最好的还是VS Code,毕竟都是微软家的所以功能集成更好一些;主要提供的是Complete和Chat能力,也就是代码补全…...
华为IPD流程6大阶段370个流程活动详解_第一阶段:概念阶段 — 81个活动
华为IPD流程涵盖了产品从概念到上市的完整过程,各阶段活动明确且相互衔接。在概念启动阶段,产品经理和项目经理分析可行性,PAC评审后成立PDT。概念阶段则包括产品描述、市场定位、投资期望等内容的确定,同时组建PDT核心组并准备项目环境。团队培训涵盖团队建设、流程、业务…...
Vue3组件封装技巧与心得
摘要: 日常开发中,用Vue组件进行业务拆分,代码解耦是一个很好的选择; 今天就来分享一下我在使用Vue3进行组件封装的一些技巧和心得,希望能够帮助到大家; 1. 组件特性: 在Vue中组件是一个独立的…...
15.初识接口1 C#
这是一个用于实验接口的代码 适合初认识接口的人 【CSDN开头介绍】(文心一言AI生成) 在C#编程世界中,接口(Interface)扮演着至关重要的角色,它定义了一组方法,但不提供这些方法的实现。它要求所…...
渗透测试-前端加密分析之RSA加密登录(密钥来源本地)
本文是高级前端加解密与验签实战的第5篇文章,本系列文章实验靶场为Yakit里自带的Vulinbox靶场,本文讲述的是绕过前端RSA加密来爆破登录。 分析 generateKey函数用来生成随机的RSA公私钥 加密的格式如下: {"username":"admin…...
题海拾贝:力扣 86.分隔链表
Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路! 我的博客:<但凡. 我的专栏:《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞,关注! 1、题…...
《Mycat核心技术》第06章:Mycat问题处理总结
作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe.gitcode.host 文章汇总:https://binghe.gitcode.host/md/all/all.html 星球项目地址:https://binghe.gitcode.host/md/zsxq/introduce.html 沉淀,…...
前端实现图片压缩
前端实现图片压缩的主要方法有: 使用 HTML5 的 API 利用 canvas 将图片绘制到画布上,然后通过 toDataURL 方法获取压缩后的图片数据。 使用第三方库 借助 compressorjs、browser-image-compression 等开源库,快速实现高质量的图片压缩功能。…...
Python OCR 文字识别
一.引言 文字识别,也称为光学字符识别(Optical Character Recognition, OCR),是一种将不同形式的文档(如扫描的纸质文档、PDF文件或数字相机拍摄的图片)中的文字转换成可编辑和可搜索的数据的技术。随着技…...
怿星科技联合赛力斯举办workshop活动,进一步推动双方合作
12月18日,由怿星科技与赛力斯汽车联合举办的workshop活动在赛力斯五云湖总部展开,双方嘉宾围绕智能汽车发展趋势、行业前沿技术、汽车电子网络与功能测试等核心议题展开了深度对话与交流,并现场参观演示了多套前沿产品。怿星科技CEO潘凯、汽车…...
Vue.js前端框架教程1:Vue应用启动和Vue组件
文章目录 Vue 应用Vue 应用的主要组成部分:启动 Vue 应用:Vue组件基础组件组件注册父子组件组件插槽(Slots)动态组件和 `keep-alive`Vue 应用 Vue 应用由几个主要部分组成,每个部分都有其特定的角色和职责。以下是 Vue 应用的主要组成部分以及如何启动一个 Vue 应用的介绍…...
LabVIEW深海气密采水器测控系统
LabVIEW的深海气密采水器测控系统通过高性价比的硬件选择与自主开发的软件,实现了高精度的温度、盐度和深度测量,并在实际海上试验中得到了有效验证。 项目背景 深海气密采水器是进行海底科学研究的关键工具,用LabVIEW开发了一套测控系统&am…...
SpringBoot 启动类 SpringApplication 二 run方法
配置 在Program arguments配置2个参数:--server.port8081 --spring.profiles.activedev。 run方法 run方法执行结束代表SpringBoot启动完成,即完成加载bean。 // ConfigurableApplicationContext 是IOC容器 public ConfigurableApplicationContext ru…...
【java基础系列】实现一个简单的猜数字小游戏
主要是用的java中的键盘录入和随机数两个api,实现这种人机交互的小游戏,可以用来锻炼基础算法思维 实现效果 实现代码 package com.gaofeng.day10;import java.util.Random; import java.util.Scanner;/*** author gaofeng* date 2024-12-22 - 9:21*/ …...
Liveweb视频融合共享平台在果园农场等项目中的视频监控系统搭建方案
一、背景介绍 在我国的大江南北遍布着各种各样的果园,针对这些地处偏僻的果园及农场等环境,较为传统的安全防范方式是建立围墙,但是仅靠围墙仍然无法阻挡不法分子的有意入侵和破坏,因此为了及时发现和处理一些难以察觉的问题&…...
clickhouse-题库
1、clickhouse介绍以及架构 clickhouse一个分布式列式存储数据库,主要用于在线分析查询 2、列式存储和行式存储有什么区别? 行式存储: 1)、数据是按行存储的 2)、没有建立索引的查询消耗很大的IO 3)、建…...
kafka常用命令
安装kafka注意事项 修改 、vim kafka/config/server.properties 三个地方①brokerId ②logs地址③指定节点 一、创建主题 (必须指定分区,指定副本) #在kafka bin目录下执行以下命令 #①连接hadoop01 创建主题为TEST 分区1 副本3个 bin/ka…...
在 Django 中使用 SMTP 发送邮件是一个常见的需求
在 Django 中使用 SMTP 发送邮件是一个常见的需求,通常用于发送用户注册确认邮件、密码重置邮件等。下面是一个简单的示例,展示了如何在 Django 中配置 SMTP 发送邮件,并创建一个包含表单、路由和视图的界面来发送邮件。 1. 配置 Django 项目…...
JS中的原型与原型链
1. 基本概念 原型(Prototype):每个对象都有一个内部属性 [[Prototype]],通常通过 __proto__ 访问(非标准,但广泛支持)。 原型链(Prototype Chain):对象通过原…...
STM32F407 | Embedded IDE01 - vscode搭建Embedded IDE开发环境(支持JLINK、STLINK、DAPLINK)
导言 Embedded IDE官网:https://em-ide.com/docs/intro 我猜肯定有部分人使用SI Keil开发STM32项目,也有vscode Keil开发STM32程序。SI或vscode编写代码,然后切换Keil编译、下载、调试程序。有一段时间,我也是这么干的。但是,程…...
放弃机器学习框架,如何用Python做物体检测?
每当我们听说“物体检测”时,就会想到机器学习和各种不同的框架。但实际上,我们可以在不使用机器学习或任何其他框架的情况下进行物体检测。在本文中,我将向你展示如何仅使用Python进行操作。 首先,我们定义一个模板图像…...
基于langchain的Agent(实现实时查询天气)
心血来潮,玩一下Agent,实现了多轮对话功能 import requests, jsonfrom langchain.agents import load_tools from langchain.agents import initialize_agent from langchain_community.llms.tongyi import Tongyi from langchain.memory import Conver…...
OB删除1.5亿数据耗费2小时
目录 回顾:mysql是怎么删除数据的? 删除方案 代码实现 执行结果 结论 本篇是实际操作 批量处理数据以及线程池线程数设置 记录学习 背景:有一张用户标签表,存储数据量达4个亿,使用OceanBase存储,由于…...
深度学习之目标检测——RCNN
Selective Search 背景:事先不知道需要检测哪个类别,且候选目标存在层级关系与尺度关系 常规解决方法:穷举法,在原始图片上进行不同尺度不同大小的滑窗,获取每个可能的位置 弊端:计算量大,且尺度不能兼顾 Selective …...
Vue.js前端框架教程7:Vue计算属性和moment.js
文章目录 计算属性(Computed Properties)基本用法缓存机制计算属性 vs 方法使用场景计算属性的 setter 和 getter结论Moment.js 进行时间处理1. 安装 Moment.js2. 在 Vue 组件中引入 Moment.js3. 在全局使用 Moment.js4. 使用 Vue 插件的方式引入 Moment.js5. 常用日期格式化…...
了解RPC
本文来自智谱清言 --------- RPC(Remote Procedure Call,远程过程调用)是一种允许程序调用位于远程计算机上的子程序或服务的技术。这种技术使得构建分布式计算变得更加容易,因为它提供了强大的远程调用能力,同时保持…...
【Go】Go数据类型详解—指针
1. 前言 在我看来,一门编程语言语法的核心就在于数据类型。而各类编程语言的基本数据类型大致相同:int整型、float浮点型、string字符串类型、bool布尔类型,但是在一些进阶数据类型上就有所不同了。本文将会介绍Go语言当中核心的数据类型——…...
C++ 中的智能指针与内存管理:从基础到进阶
在 C 中,内存管理是一个至关重要的课题,尤其是当程序复杂度逐渐增加时。传统的手动内存管理方式(使用 new 和 delete)容易引发内存泄漏、悬挂指针等问题。为了简化内存管理,C11 引入了智能指针(std::unique…...
二、使用langchain搭建RAG:金融问答机器人--数据清洗和切片
选择金融领域的专业文档作为源文件 这里选择 《博金大模型挑战赛-金融千问14b数据集》,这个数据集包含若干公司的年报,我们将利用这个年报搭建金融问答机器人。 具体下载地址 这里 git clone https://www.modelscope.cn/datasets/BJQW14B/bs_challenge_…...
R 语言 | 绘图的文字格式(绘制上标、下标、斜体、文字标注等)
1. 上下标 # 注意y轴标签文字 library(ggplot2) ggplot(mtcars, aes(mpg, cyl))geom_point()ylab(label bquote(O[3]~(ug / m^3)))2. 希腊字母,如alpha ggplot(mtcars, aes(mpg, cyl))geom_point()ylab(label bquote(O[3]~(ug / m^3)))ggtitle(expression(alpha))…...
版本更新导致前端网站资源加载失败:Failed to fetch dynamically imported module
前端网站在维护过程中经常有版本更新和重新部署,而这会导致一些问题,其中某些问题会导致更新时,正在网站中的用户无法正常使用。 异常 Failed to fetch dynamically imported module 的诱发原因之一就是版本更新:在用户访问网站的…...
CentOS 7 安装、测试和部署FastDFS
目录 FastDFS环境搭建 安装 libfastcommon 库 安装FastDFS 查看编译后的文件 FastDFS配置 FastDFS启动 启动tracker服务 启动storage服务 查看storage是否已经注册到了tracker下 查看存储文件的目录 FastDFS重启 FastDFS关闭 使用fdfs_test进行测试 修改client.co…...
elasticache备份
Elasticsearch 本地快照操作流程 配置快照存储路径 在 elasticsearch.yml 文件中配置以下字段以指定数据、日志和快照存储路径:path:data: /data/data # 数据存储路径logs: /data/log # 日志存储路径repo: /data/snapshot # 快照存储路径确保路径 /dat…...
wordpress调用指定分类ID下 相同标签的内容
要在WordPress中调用分类ID为1、3、7的分类下,具有相同标签的前10个内容,可以使用自定义的WordPress查询(WP_Query)。以下是实现此功能的步骤和示例代码: 步骤: 确定共同标签: 首先,你需要确定分类1、3、…...
Spring Security 6 系列之五 - 授权管理
之所以想写这一系列,是因为之前工作过程中使用Spring Security,但当时基于spring-boot 2.3.x,其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0,结果一看Spring Security也升级为6.3.0,关键是其风…...
贪心算法求解跳跃游戏
跳跃游戏1: 代码随想录链接:代码随想录 思路: 求解是否能够跳到数组的最后一个位置,关键在于跳跃的覆盖范围 因此设置一个变量表示每次移动时能够覆盖的范围,该变量的初始值为0 因为坐标的位置受到覆盖范围的限制,因此只能遍历覆盖范围内…...