Pytorch | 利用PI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
Pytorch | 利用PI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
- CIFAR数据集
- PI-FGSM介绍
- 背景和动机
- 算法原理
- 算法流程
- PI-FGSM代码实现
- PI-FGSM算法实现
- 攻击效果
- 代码汇总
- pifgsm.py
- train.py
- advtest.py
之前已经针对CIFAR10训练了多种分类器:
Pytorch | 从零构建AlexNet对CIFAR10进行分类
Pytorch | 从零构建Vgg对CIFAR10进行分类
Pytorch | 从零构建GoogleNet对CIFAR10进行分类
Pytorch | 从零构建ResNet对CIFAR10进行分类
Pytorch | 从零构建MobileNet对CIFAR10进行分类
Pytorch | 从零构建EfficientNet对CIFAR10进行分类
Pytorch | 从零构建ParNet对CIFAR10进行分类
本篇文章我们使用Pytorch实现PI-FGSM对CIFAR10上的ResNet分类器进行攻击.
CIFAR数据集
CIFAR-10数据集是由加拿大高级研究所(CIFAR)收集整理的用于图像识别研究的常用数据集,基本信息如下:
- 数据规模:该数据集包含60,000张彩色图像,分为10个不同的类别,每个类别有6,000张图像。通常将其中50,000张作为训练集,用于模型的训练;10,000张作为测试集,用于评估模型的性能。
- 图像尺寸:所有图像的尺寸均为32×32像素,这相对较小的尺寸使得模型在处理该数据集时能够相对快速地进行训练和推理,但也增加了图像分类的难度。
- 类别内容:涵盖了飞机(plane)、汽车(car)、鸟(bird)、猫(cat)、鹿(deer)、狗(dog)、青蛙(frog)、马(horse)、船(ship)、卡车(truck)这10个不同的类别,这些类别都是现实世界中常见的物体,具有一定的代表性。
下面是一些示例样本:
PI-FGSM介绍
PI-FGSM(Patch-wise Iterative Fast Gradient Sign Method)是一种针对主流正常训练和防御模型的黑盒攻击算法,旨在生成具有强转移性的对抗样本。该算法通过引入放大因子和投影核,以块(patch)为单位生成对抗噪声,从而提高对抗样本在不同模型间的转移性。
背景和动机
- DNN的对抗样本问题:深度神经网络(DNN)在取得巨大成就的同时,面临着对抗样本的威胁。这些添加了人类难以察觉噪声的对抗样本,能够轻易愚弄先进的DNN,使其做出不合理的预测,引发了对机器学习算法安全性的担忧。
- 现有攻击方法的局限性:基于梯度的攻击方法是常见的攻击手段,其中迭代攻击在白盒设置下性能较好,但在黑盒设置中,由于攻击者无法获取目标模型信息,通常使用替代模型生成对抗样本,此时迭代攻击容易陷入局部最优,转移性较差;单步攻击虽转移性较高,但性能欠佳。
- 研究动机:基于DNN的特性,不同模型在识别时关注的判别区域不同,且判别区域通常具有聚集性。仅添加像素级噪声可能影响对抗样本的转移性,因此研究具有聚集性的扰动生成方法具有重要意义。PI-FGSM旨在结合单步和迭代攻击的优点,在不牺牲替代模型性能的前提下提高转移性。
算法原理
- 目标函数:PI-FGSM的目标是在满足 L ∞ L_{\infty} L∞ 范数约束(即对抗扰动的最大幅度不超过 ϵ \epsilon ϵ)的条件下,最大化替代模型的交叉熵损失,以生成能够成功欺骗目标模型的对抗样本。
- 梯度计算与放大:在每次迭代中,计算当前对抗样本 x t a d v x_t^{adv} xtadv 关于损失函数 J J J 的梯度 ∇ x J ( x t a d v , y ) \nabla_x J(x_t^{adv}, y) ∇xJ(xtadv,y),并将步长设置为 ϵ T × β \frac{\epsilon}{T} \times \beta Tϵ×β(其中 T T T 为总迭代次数, β \beta β 为放大因子),对梯度进行放大,以增加扰动的幅度,提高攻击的有效性。
- 投影核与噪声重用:引入特殊的均匀投影核 W p W_p Wp,当累积放大噪声 a t a_t at 的 L ∞ L_{\infty} L∞ 范数超过阈值 ϵ \epsilon ϵ 时,通过投影核将超出部分的噪声投影到周围区域,生成“可行方向”的噪声,同时重用这部分噪声,增加噪声斑块的聚集程度,以更好地匹配图像中判别区域的聚集特性,提高对抗样本的转移性。
算法流程
- 初始化累积放大噪声 a 0 a_0 a0 和裁剪噪声 C C C 为0,设置初始对抗样本 x 0 a d v = x c l e a n x_0^{adv}=x^{clean} x0adv=xclean。
- 对于 t = 0 t = 0 t=0 到 T − 1 T - 1 T−1:
- 计算梯度 ∇ x J ( x t a d v , y ) \nabla_x J(x_t^{adv}, y) ∇xJ(xtadv,y)。
- 更新累积放大噪声 a t + 1 = a t + β ⋅ ϵ T ⋅ s i g n ( ∇ x J ( x t a d v , y ) ) a_{t + 1}=a_t+\beta \cdot \frac{\epsilon}{T} \cdot sign(\nabla_x J(x_t^{adv}, y)) at+1=at+β⋅Tϵ⋅sign(∇xJ(xtadv,y))。
- 如果 ∥ a t + 1 ∥ ∞ ≥ ϵ \|a_{t + 1}\|_{\infty} \geq \epsilon ∥at+1∥∞≥ϵ,则计算裁剪噪声 C = c l i p ( ∣ a t + 1 ∣ − ϵ , 0 , ∞ ) ⋅ s i g n ( a t + 1 ) C = clip(|a_{t + 1}|-\epsilon, 0, \infty) \cdot sign(a_{t + 1}) C=clip(∣at+1∣−ϵ,0,∞)⋅sign(at+1),并更新 a t + 1 = a t + 1 + γ ⋅ s i g n ( W p ∗ C ) a_{t + 1}=a_{t + 1}+\gamma \cdot sign(W_p * C) at+1=at+1+γ⋅sign(Wp∗C)(其中 γ \gamma γ 为投影因子);否则 C = 0 C = 0 C=0。
- 更新对抗样本 x t + 1 a d v = C l i p x c l e a n , ϵ { x t a d v + β ⋅ ϵ T ⋅ s i g n ( ∇ x J ( x t a d v , y ) ) + γ ⋅ s i g n ( W p ∗ C ) } x_{t + 1}^{adv}=Clip_{x^{clean}, \epsilon}\{x_t^{adv}+\beta \cdot \frac{\epsilon}{T} \cdot sign(\nabla_x J(x_t^{adv}, y))+\gamma \cdot sign(W_p * C)\} xt+1adv=Clipxclean,ϵ{xtadv+β⋅Tϵ⋅sign(∇xJ(xtadv,y))+γ⋅sign(Wp∗C)},并将其裁剪到 [ − 1 , 1 ] [-1, 1] [−1,1] 范围内。
- 返回最终的对抗样本 x a d v = x T a d v x^{adv}=x_T^{adv} xadv=xTadv。
PI-FGSM代码实现
PI-FGSM算法实现
import torch
import torch.nn as nndef PI_FGSM(model, criterion, original_images, labels, epsilon, beta=5, kernel_size=3, num_iterations=10):"""PI-FGSM (Patch-wise Iterative Fast Gradient Sign Method)参数:- model: 要攻击的模型- criterion: 损失函数- original_images: 原始图像- labels: 原始图像的标签- epsilon: 扰动幅度- beta: 放大因子- kernel_size: 投影核大小- num_iterations: 迭代次数返回:- perturbed_image: 生成的对抗样本"""# gamma: 投影因子gamma = epsilon / num_iterations * beta# 初始化累积放大噪声和裁剪噪声a = torch.zeros_like(original_images)C = torch.zeros_like(original_images)perturbed_images = original_images.clone().detach().requires_grad_(True)# 定义投影核Wp = torch.ones((kernel_size, kernel_size), dtype=torch.float32) / (kernel_size ** 2 - 1)Wp[kernel_size // 2, kernel_size // 2] = 0Wp = Wp.expand(original_images.size(1), -1, -1).to(original_images.device)Wp = Wp.unsqueeze(0)for _ in range(num_iterations):# 计算梯度outputs = model(perturbed_images)loss = criterion(outputs, labels)model.zero_grad()loss.backward()data_grad = perturbed_images.grad.data# 更新累积放大噪声a = a + beta * (epsilon / num_iterations) * data_grad.sign()# 裁剪噪声if a.abs().max() >= epsilon:C = (a.abs() - epsilon).clamp(0, float('inf')) * a.sign()a = a + gamma * torch.nn.functional.conv2d(input=C, weight=Wp, stride=1, padding=kernel_size // 2)# 更新对抗样本perturbed_images = perturbed_images + beta * (epsilon / num_iterations) * data_grad.sign() + gamma * torch.nn.functional.conv2d(C, Wp, stride=1, padding=kernel_size // 2)perturbed_images = torch.clamp(perturbed_images, original_images - epsilon, original_images + epsilon)perturbed_images = perturbed_images.detach().requires_grad_(True)return perturbed_images
攻击效果
代码汇总
pifgsm.py
import torch
import torch.nn as nndef PI_FGSM(model, criterion, original_images, labels, epsilon, beta=5, kernel_size=3, num_iterations=10):"""PI-FGSM (Patch-wise Iterative Fast Gradient Sign Method)参数:- model: 要攻击的模型- criterion: 损失函数- original_images: 原始图像- labels: 原始图像的标签- epsilon: 扰动幅度- beta: 放大因子- kernel_size: 投影核大小- num_iterations: 迭代次数返回:- perturbed_image: 生成的对抗样本"""# gamma: 投影因子gamma = epsilon / num_iterations * beta# 初始化累积放大噪声和裁剪噪声a = torch.zeros_like(original_images)C = torch.zeros_like(original_images)perturbed_images = original_images.clone().detach().requires_grad_(True)# 定义投影核Wp = torch.ones((kernel_size, kernel_size), dtype=torch.float32) / (kernel_size ** 2 - 1)Wp[kernel_size // 2, kernel_size // 2] = 0Wp = Wp.expand(original_images.size(1), -1, -1).to(original_images.device)Wp = Wp.unsqueeze(0)for _ in range(num_iterations):# 计算梯度outputs = model(perturbed_images)loss = criterion(outputs, labels)model.zero_grad()loss.backward()data_grad = perturbed_images.grad.data# 更新累积放大噪声a = a + beta * (epsilon / num_iterations) * data_grad.sign()# 裁剪噪声if a.abs().max() >= epsilon:C = (a.abs() - epsilon).clamp(0, float('inf')) * a.sign()a = a + gamma * torch.nn.functional.conv2d(input=C, weight=Wp, stride=1, padding=kernel_size // 2)# 更新对抗样本perturbed_images = perturbed_images + beta * (epsilon / num_iterations) * data_grad.sign() + gamma * torch.nn.functional.conv2d(C, Wp, stride=1, padding=kernel_size // 2)perturbed_images = torch.clamp(perturbed_images, original_images - epsilon, original_images + epsilon)perturbed_images = perturbed_images.detach().requires_grad_(True)return perturbed_images
train.py
import torch
import torch.nn as nn
import torchvision
import torchvision.transforms as transforms
from models import ResNet18# 数据预处理
transform_train = transforms.Compose([transforms.RandomCrop(32, padding=4),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])transform_test = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])# 加载Cifar10训练集和测试集
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=False, transform=transform_train)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=128, shuffle=True, num_workers=2)testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=False, transform=transform_test)
testloader = torch.utils.data.DataLoader(testset, batch_size=100, shuffle=False, num_workers=2)# 定义设备(GPU或CPU)
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")# 初始化模型
model = ResNet18(num_classes=10)
model.to(device)# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)if __name__ == "__main__":# 训练模型for epoch in range(10): # 可以根据实际情况调整训练轮数running_loss = 0.0for i, data in enumerate(trainloader, 0):inputs, labels = data[0].to(device), data[1].to(device)optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()if i % 100 == 99:print(f'Epoch {epoch + 1}, Batch {i + 1}: Loss = {running_loss / 100}')running_loss = 0.0torch.save(model.state_dict(), f'weights/epoch_{epoch + 1}.pth')print('Finished Training')
advtest.py
import torch
import torch.nn as nn
import torchvision
import torchvision.transforms as transforms
from models import *
from attacks import *
import ssl
import os
from PIL import Image
import matplotlib.pyplot as pltssl._create_default_https_context = ssl._create_unverified_context# 定义数据预处理操作
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.491, 0.482, 0.446), (0.247, 0.243, 0.261))])# 加载CIFAR10测试集
testset = torchvision.datasets.CIFAR10(root='./data', train=False,download=False, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=128,shuffle=False, num_workers=2)# 定义设备(GPU优先,若可用)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")model = ResNet18(num_classes=10).to(device)criterion = nn.CrossEntropyLoss()# 加载模型权重
weights_path = "weights/epoch_10.pth"
model.load_state_dict(torch.load(weights_path, map_location=device))if __name__ == "__main__":# 在测试集上进行FGSM攻击并评估准确率model.eval() # 设置为评估模式correct = 0total = 0epsilon = 16 / 255 # 可以调整扰动强度for data in testloader:original_images, labels = data[0].to(device), data[1].to(device)original_images.requires_grad = Trueattack_name = 'PI-FGSM'if attack_name == 'FGSM':perturbed_images = FGSM(model, criterion, original_images, labels, epsilon)elif attack_name == 'BIM':perturbed_images = BIM(model, criterion, original_images, labels, epsilon)elif attack_name == 'MI-FGSM':perturbed_images = MI_FGSM(model, criterion, original_images, labels, epsilon)elif attack_name == 'NI-FGSM':perturbed_images = NI_FGSM(model, criterion, original_images, labels, epsilon)elif attack_name == 'PI-FGSM':perturbed_images = PI_FGSM(model, criterion, original_images, labels, epsilon)perturbed_outputs = model(perturbed_images)_, predicted = torch.max(perturbed_outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()accuracy = 100 * correct / total# Attack Success RateASR = 100 - accuracyprint(f'Load ResNet Model Weight from {weights_path}')print(f'epsilon: {epsilon:.4f}')print(f'ASR of {attack_name} : {ASR :.2f}%')
相关文章:
Pytorch | 利用PI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
Pytorch | 利用PI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集PI-FGSM介绍背景和动机算法原理算法流程 PI-FGSM代码实现PI-FGSM算法实现攻击效果 代码汇总pifgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器: Pytorch | 从零构建AlexN…...
Casino Royale靶场wp
0x00 下载安装 https://download.vulnhub.com/casinoroyale/CasinoRoyale.ova 导入vmware启动 0x01 主机信息收集 0x02目录扫描 index.php 获取到一个域名 修改本地hosts 添加一行 路径:C:\Windows\System32\drivers\etc 192.168.2.20 casino-royale.local 点击…...
c/c++ 无法跳转定义
背景 对于嵌入式开发离不开交叉编译工作,采用vccode远程到虚拟机开发来说,总会遇到一个函数跳转问题。下面针对运用开发如何设置vscode保证函数能正确跳转大函数定义。 一、安装c/c插件 安装C/C Extension Pack插件,这插件包含有几个插件。…...
4.5 数据表的外连接
本次课程我们将继续的学习数据表的连接。因为数据表的连接是分为内连接和外连接的。内连接的语法,还有一些练习,我们都是学习到了。那么本次课程咱们就开始学习数据表的外连接语法。首先我来解释一下为什么要使用外连接这种语法。咱们首先看一条记录&…...
请购单一直提示需求部门不能为空无法提交
终于发现了它的逻辑。用户很多次反馈,提交请购单时,提示需求部门不能为空,既使选择了需求部门,保存时,神奇的是会清空掉部门的信息,提交时就会有错误提示出来。 原因:光选择单头上的需求部门是…...
Jenkins基础教程
Jenkins介绍 Jenkins 是一款开源的持续集成(CI)和持续交付(CD)工具,在软件开发和自动化部署流程中发挥着关键作用。 1.背景和起源 它最初是由 Sun Microsystems 公司的一名工程师开发的 Hudson 项目,后来…...
如何配置 Java 环境变量:设置 JAVA_HOME 和 PATH
目录 一、什么是 Java 环境变量? 二、配置 Java 环境变量 1. 下载并安装 JDK 2. 配置 JAVA_HOME Windows 系统 Linux / macOS 系统 3. 配置 PATH Windows 系统 Linux / macOS 系统 4. 验证配置 三、常见问题与解决方案 1. 无法识别 java 或 javac 命令 …...
深入解析 Pytest 钩子函数及二次开发过程
关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理,构建成功的基石 在自动化测试工作之前,你应该知道的10条建议 在自动化测试中,重要的不是工具 在 Pytest 测试框架中,钩子函数(Hooks)是一种强…...
http 请求总结get
关于get请求传递body的问题 错误代码 有400 , 415 等情况 <!doctype html><html lang"zh"><head><title>HTTP Status 400 – 错误的请求</title><style type"text/css">body {font-family:Tahoma,Arial,sans-seri…...
漏洞扫描:网络安全的 “体检” 与 “防护指南”
在当今数字化时代,网络安全如同守护城堡的坚固城墙,而漏洞扫描则是检查城墙是否存在缝隙与薄弱环节的重要手段。那么,究竟什么是漏洞扫描?又该如何进行呢? 什么是漏洞扫描? 漏洞扫描是一种安全检测过程&a…...
《Vue进阶教程》第二十七课:实现侦听对象
往期内容: 《Vue进阶教程》第十六课:深入完善响应式系统之单例模式 《Vue进阶教程》第十七课:支持分支切换 《Vue进阶教程》第十八课:避免死循环 《Vue进阶教程》第十九课:computed初步实现 《Vue进阶教程》第二十…...
【Linux 网络 (五)】Tcp/Udp协议
Linux 网络 一前言二、Udp协议1)、Udp协议特点2)、Udp协议格式3)、Udp报文封装和解包过程4)、UDP的缓冲区 三、TCP协议1)、TCP协议特点2)、TCP协议格式1、4位首部长度、源端口、目的端口2、16位窗口大小3、…...
算法工程化工程师
算法工程化工程师是一种结合算法研究与工程开发能力的技术职位,主要职责是将算法从理论研究到实际落地,应用到各种工业或商业场景中。以下是关于这个职位的一些核心内容: 核心职责: 算法实现与优化: 将数学模型或算法…...
信息系统管理师试题-转型升级
1.3.转型升级 战略转型升级是对组织的长期发展方向、运行模式、组织战略、组织方式、资源配置方式、祖师文化等进行全方位升级变革。下列对战略转型升级的描述错误的是() A大多数组织的转型主要是战略转型 B组织转型升级首先要解决的是战略选择问题 C组织…...
mysql三种读取模式(普通、流式、游标)
在与MySQL数据库交互时,数据的读取方式有多种选择,包括流式读取、游标读取和普通读取。每种方式都有其独特的原理、优势和劣势。本文将对这三种读取方式进行详细介绍, 1. 普通读取 介绍 普通读取是指通过JDBC的Statement或PreparedStateme…...
月子会所ERP管理云平台 GetData.ashx SQL注入致RCE漏洞复现
0x01 产品简介 月子会所ERP管理云平台是武汉金同方科技有限公司专为为母婴服务行业提供信息化解决方案,是结合行业顶级月子中心相关企业需求开发的一套综合性管理软件。该系统全面管控月子中心经营过程中的各个环节,提高总店及分店月子中心管理水平,规范月子中心从业人员操作…...
Ubuntu22.10/22.04 autoinstall--OK
第一步:建立ubuntu22.04 jammy apt本地源(见本博主对应栏) --------------------------------------------------------------------------------------- ubuntu22.04 grub配置: menuentry Ubuntu22.04-autoinstall(UEFI) --id UBUNTU22.04-autoinstall { echo "…...
操作系统之同步与互斥的基本概念
1. 同步的基本概念 定义:同步是指在多个并发执行的进程或线程之间协调其行为,以使它们能够正确地相互合作。在计算机科学中,同步通常指对共享资源进行访问控制,以避免竞争条件和死锁等问题。 实现方式:为了实现同步&a…...
【ANGULAR网站开发】初始环境搭建
1. 初始化angular项目 1.1 创建angular项目 需要安装npm和nodejs,这边不在重新安装 直接安装最新版本的angular npm install -g angular/cli安装指定大版本的angular npm install -g angular/cli181.2 启动angular 使用idea启动 控制台启动 ng serve启动成功…...
[青少年CTF练习平台]Lihua‘s for
下载附件之后直接IDA启动 查看dword_403040指向的内容,全是数据,提取出来 分析完成写脚本 flag "" temdata [0x00000066, 0x0000006D, 0x00000063, 0x00000064, 0x0000007F, 0x00000064, 0x00000032, 0x00000036, 0x0000006A, 0x000000…...
WebRTC服务质量(12)- Pacer机制(04) 向Pacer中插入数据
WebRTC服务质量(01)- Qos概述 WebRTC服务质量(02)- RTP协议 WebRTC服务质量(03)- RTCP协议 WebRTC服务质量(04)- 重传机制(01) RTX NACK概述 WebRTC服务质量(…...
css文字折行以及双端对齐实现方式
使用flex布局后,文字超出容器部分不会自动折行了。实现代码如下: <el-row><el-col :span"24"><span class"label">姓名</span><span class"content">{{name}}</span></el-col>…...
AI智能养站神器-SEO助理原创文章批量生成发布工具
很多站长最头疼的就是网站每天的内容更新,因为不知道写什么,采集被人的文章又会被定义为抄袭,而且现在伪原创已经没有多大的效果了,所以今天给大家分享的就是一款AI智能养战神器-SEO助理原创文章批量生成发布工具。 这款工具支持…...
python数据分析之爬虫基础:selenium详细讲解
目录 1、selenium介绍 2、selenium的作用: 3、配置浏览器驱动环境及selenium安装 4、selenium基本语法 4.1、selenium元素的定位 4.2、selenium元素的信息 4.3、selenium元素的交互 5、Phantomjs介绍 6、chrome handless模式 1、selenium介绍 (1…...
使用 ECharts 与 Vue 构建数据可视化组件
在前端开发中,数据可视化是非常重要的一部分。ECharts 作为一个功能强大且易于使用的开源数据可视化库,被广泛应用于各种图表展示需求中。而 Vue.js 是当下流行的前端框架之一,它的数据驱动和组件化开发模式让我们能轻松地将 ECharts 集成到 …...
KAFKA 权威指南笔记(一)究竟应该配置多少个BROKER?
一个KAFKA集群需要多少个BROKER? 一个单独的Kafka服务器被叫做BROKER,BROKER可以处理数千个分区以及每秒百万级别的消息量。由BROKER组成了“集群”(其中由集群控制器角色的BROKER是从成员中选举出来的,负责控制管理工作…...
练习题:20
目录 Python题目 题目 题目分析 1. 类与变量、属性设计分析 2. Value 属性的实现分析 3. 转换函数分析 4. 整体代码结构与编程规范考虑 代码实现 代码解释 1. 类定义部分 2. 对象创建与功能测试部分 运行思路 1. 类定义阶段 2. 对象创建阶段 3. 获取 Value 属性…...
【时时三省】(C语言基础)动态内存函数malloc
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 malloc 开辟内存块 使用格式 void *malloc(size_t sie); 示例 10*sizeof(int)就是开辟空间的大小 如果p是void指针的话 p不能解引用 m…...
大数据学习之Redis 缓存数据库二,Scala分布式语言一
一.Redis 缓存数据库二 26.Redis数据安全_AOF持久化机制 27.Redis数据安全_企业中该如何选择持久化机制 28.Redis集群_主从复制概念 29.Redis集群_主从复制搭建 30.Redis集群_主从复制原理剖析 31.Redis集群_哨兵监控概述 32.Redis集群_配置哨兵监控 33.Redis集群_哨兵监控原理…...
第23天:信息收集-APP应用产权渠道服务资产通讯抓包静态提取动态调试测试范围
#知识点 1、信息收集-APP应用-公开信息-知识产权&开发者定位 2、信息收集-APP应用-资产信息-抓包&静态提取&动态调试 一、APP渗透测试的范围->应涵盖APP所有功能和组件,包括但不限于以下几个方面: 1、前端安全:包括界面交互、…...
每日一练 | DHCP 客户端续约过程
01 真题题目 在 DHCP 运行过程中,如果客户端 IP 地址在租约过去 87.5%还没有完成续约的话,客户端将发送什么报文进行再次续约? A. DHCPdiscover 广播报文 B. DHCP release 单播报文 C. DHCPrequest 广播报文 D. DHCPrequest 单播报文 02 真题…...
存储块的获取与释放
目录 获取存储块 释放存储块 设计实现 获取存储块 有空闲存储块,直接取出空闲块; 无空闲存储块,任务进入等待队列。 释放存储块 无任务等待,插入到空闲链表; 有任务等待,释放等待队列头部的任务。 设计实现…...
定位方式:css
使用相对路径 div ul #div下的所有ul,空格表示相对路径(这个实际中用的多一些) 绝对路径-一般不用绝对路径 html>head>div,“>”表示根路径 使用class名称定位 使用.表示 使用id定位 使用#表示 使用属性定位 [属性名…...
主从复制架构介绍和主从复制配置案例
每一个数据库的业务都对应着一个前端的业务, 主从复制架构的必要性? 第一点是两个服务器如果有一台服务器出现故障,那么另一台服务器可以正常工作,以保障前端业务可以被正常访问,第二点是两个服务器可以共同去处理数据ÿ…...
零跑汽车一路狂飙
新能源汽车市场潮起潮落,只有潮水退去,才能看清谁在裸泳。十年前,一批新能源汽车新势力带着创新的理念和先进的技术,如雨后春笋般涌入中国汽车市场,掀起一场新旧势力的角逐。 经历市场的激烈洗礼与投资泡沫的挤压&…...
固态硬盘SSD
目录 1、固态硬盘结构 2、访问和读取策略 3、固态硬盘 VS SSD固态硬盘 (1)速度 (2)性能 (3)使用寿命 4、磨损均衡技术 (1)动态磨损均衡 (2)静态磨损…...
MTEB文本向量化评估基准:Massive Text Embedding Benchmark
Massive Text Embedding Benchmark 文本向量化评估基准 Bitext mining is the task of finding parallel sentences in two languages. 双语文本挖掘是识别两种语言中语义等价句子对的任务。 Classification is the task of assigning a label to a text. 文本分类是为文本分配…...
【Compose multiplatform教程09】【组件】Image组件
查看全部组件 Image 功能说明:能够加载并显示图片,支持本地资源和网络资源,可对图片的大小、缩放方式、裁剪等属性进行设置,使图片以合适的方式展示在界面中,增强界面的视觉效果。示例场景:在应用的启动页…...
android jetpack compose Model对象更新变量 UI不更新、不刷新问题
以前是搞老本行Android原生开发的,因为工作原因,一直在用vue小程序;因为一些工作需要,又需要用到Android原生开发,建了个项目,打开源码一看,天塌了!!!我以前的…...
Java抽象工厂+单例模式
在前端时间开发过程中,有这样一个业务场景:A;B两家厂商设备进行设备信息的同步功能。 根据实际场景,做了抽象工厂+单例模式实现调用工厂时,生成不同的具体业务引用对象,实现方法的调用。 概念: 抽象工厂模式通过接口或抽象类来创建一系列相关或依赖对象。它定义了一组工…...
React 第十九节 useLayoutEffect 用途使用技巧注意事项详解
1、概述 useLayoutEffect 是useEffect 的一个衍生版本,只是他们的执行时机不同 useLayoutEffect 用于在DOM更新执行完成之后,浏览器渲染绘制之前执行,这会阻塞浏览器的渲染; useEffect 的执行时机是在组件首次渲染和更新渲染之后…...
以太网协议实现——FPGA学习笔记23
一、简介 FPGA千兆网口数据传输MDIO接口——FPGA学习笔记3_yt8531sh原理图-CSDN博客 1、以太网帧类型 2、以太网帧格式 3、以太网MAC帧格式 二、以太网报文 目的IP :ff ff ff ff ff ff(广播IP地址) 类型:ARP (0806) 源MAC地址:74 7d 24 92 fb df 单播 …...
docker 实践与应用举例
docker 实践与应用举例 Docker是一个开源的容器化平台,它允许开发人员将应用程序及其依赖项打包为一个轻量级、可移植的容器,并在不同的环境中运行。Docker的基本概念包括以下几点: 1. 容器:Docker通过使用Linux容器技术&#x…...
双指针——有效三角形的个数
一.题目描述 611. 有效三角形的个数 - 力扣(LeetCode) 二.题目解析 题目其实很简单就是让我们在数组中找到可能构成三角形的所有可能。构成三角形的前提是:任意两边之和大于第三边。所以我们要满足让下面三条同时成立才可以构成三角形&am…...
【ES6复习笔记】函数参数的默认值(6)
在ES6中,函数参数默认值是一个非常有用的特性,它允许你在定义函数时为参数指定一个默认值。如果在调用函数时没有提供相应的参数值,那么函数将使用默认值。 1. 形参初始值 具有默认值的参数,一般位置要靠后。这是一个潜规则&…...
tryhackme-Cyber Security 101-Linux Shells(linux命令框)
目的:了解脚本和不同类型的 Linux shell。 任务1:Introduction to Linux Shells(Linux Shell 简介) 作为操作系统的常规用户,我们都广泛使用图形用户界面 (GUI) 来执行大多数操作。只需点击几…...
【Go】-限流器的四种实现方法
目录 关于限流和限流器 固定窗口限流器 滑动窗口限流器 漏桶限流器 令牌桶限流器 总结 关于限流和限流器 限流(Rate Limiting)是一种控制资源使用率的机制,通常用于防止系统过载和滥用。 限流器(Rate Limiter)是…...
精准识别花生豆:基于EfficientNetB0的深度学习检测与分类项目
精准检测花生豆:基于EfficientNet的深度学习分类项目 在现代农业生产中,作物的质量检测和分类是确保产品质量的重要环节。针对花生豆的检测与分类需求,我们开发了一套基于深度学习的解决方案,利用EfficientNetB0模型实现高效、准…...
【信息系统项目管理师】第11章:项目成本管理过程详解
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 一、规划成本管理1、输入2、工具与技术3、输出二、估算成本1、输入2、工具与技术3、输出三、制定预算1、输入2、工具与技术3、输出四、控制成本1、输入2、工具与技术3、输出一、规划成本管理 定义:规划成本管…...
微信流量主挑战:用户破16!新增文档转换(新纪元3)
朋友们,报告好消息!我的小程序用户数量已经涨到16个了!没错,真没拉朋友圈亲戚好友来撑场子,全靠实力(和一点点运气)吸引了16位陌生小伙伴光临!这波进步,连我自己都感动了…...