Teledyne LeCroy:800G高速以太网一站式自动化测试解决方案(网络打流测试+物理层加压干扰+协议分析)

LinkExpert一站式测试解决方案

LinkExpert 是一款软件应用程序,可对Teledyne LeCroy的协议分析仪和训练器进行自动化硬件控制和管理。除了作为合规性、一致性和验证测试的便捷接口外,它还能轻松地将这些测试添加到自动回归测试流程中。

现在,新的 LinkExpert集成可实现800G以太网连接的自动协商和链路训练 (AN/LT)。该集成使工程师能够轻松利用Xena以太网流量发生器的AN/LT测试功能和SierraNet协议分析仪。

该解决方案为800G以太网提供了一站式集成自动化测试,可将端口的物理层性能测试与分析和Layer23层流量压力测试无缝衔接,提供了跨以太网协议层级的Layer123完整验证,提供了端口一致性验证、端口性能压力测试、协议可视化分析一站式测试服务。

端口一致性测试

可作为Golden Sample,对接DUT进行端口一致性测试校验

端口兼容性测试

可调节Pre-Coding,PPM Adjustment将端口进行劣化,以模拟特定DUT的性能

端口性能测试

线速和超线速的极限压力测试,微突发场景等

真实业务压力测试

RDMA,PFC,ECQCN,ECN,QP业务模型仿真

速率支持

OSFP接口和QSFP-DD原生接口

56G PAM4- 50G/100G/200G/400G

112G PAM4 - 100G/200G/400G/800G

功能举例

800G ANLT测试界面

  • 作为端节点,进行以太网协议的握手适配,对接
  • 作为监控节点,串行接入在链路中,进行物理层链路和数据链路层的报文捕获和分析,即Layer1,Layer2,Layer3等全覆盖
  • 负面压力环境仿真,如FEC Error Injection测试验证,Link Flap验证,Packet Loss验证 

硬件构成:Xena Freya Z800+SierraNet M1288

800G以太网测试与分析仪表

Xena Ethernet Tester

  • 10M-800G以太网端口速率支持

  • 支持全线速的以太网流量生成和收发统计

  • Layer1、2、3层测试和自动化支持

  • 固定式1U桌面便携型和模块化4U机架式

  • 多种不同速率测试板卡和报文损伤仿真板卡

  • 高可扩展性、多业务槽位后期扩展支持

  • RFC2544,RFC2889,RFC3918,Y.1564等基准性能测试套件支持

SierraNet Protocol Analyzer/Jammer

  • 10G至800G以太网和FC光纤通道支持
  • 链路可视化分析和干扰注入
  • 高阶多态触发和过滤功能
  • 全栈(Layer1-7)线速捕获分析和错误注入
  • Infusion Jammer干扰注入支持
  • 业内唯一的L1层协议捕获和ANLT分析仪
  • 支持脚本引擎VSE用于自动化后期分析

仪表典型应用场景

XENA以太网测试仪

XENA 800G Freya以太网测试仪

  • 灵活生成以太网数据流量流进行收发包测试,以评估网络设备(交换机、路由器、防火墙)在压力条件下的运行情况
  • 模拟多个用户或设备同时访问网络,了解网络负载均衡性能
  • 测量网络设备或链路可处理的最大数据传输速率,以测试网络吞吐量
  • 利用 Chimera 网络仿真的各种故障(延迟/抖动/丢包)在实验室中模拟真实生产环境
  • 创建具有不同优先级的不同类型流量,以测试 PFC、QoS机制
  • 模拟分布式拒绝服务 (DDoS) 等攻击,或创建模仿恶意行为的流量模式
  • 有助于在受控环境中创建逼真的网络条件,作为网络模拟和建模的一部分

SierraNet 协议分析仪

力科800G M1288协议分析仪

  • 监控和捕获所有网络流量,以便进行详细分析
  • 加快故障排除速度并识别故障的链接
  • 验证数据包是否符合所需的协议标准和规范
  • 检测和分析互操作性问题,确保不同的网络设备和系统正常工作
  • 以太网和光纤通道的质量保证和验证
  • 产品基准和竞争分析
  • 可全面查看整个网络的所有通信情况
  • 检测和分析安全威胁,如未经授权的访问和可疑的流量模式
  • 监控带宽使用情况,识别大流量用户和应用程序
  • 故障排除和现场支持,以诊断故障链路、互操作性问题或网络性能问题

典型待测物

网卡,线材类

AI HPC高速网卡,SmartNIC,DPU等,用以服务器之间的连接或服务器与交换机的连接

AEC,ACC 线材,验证其ANLT的生效情况

交换机类

端口性能验证

业务模型搭建测试极限并发性能

负面压力模拟,将真实的用户场景搬进实验室进行测试验证,并可定量精准,可重复的测试

规模组网验证

RDMA ,QP业务模型搭建

友好的API二次开发接口

signal_integrity_hist_plot.py

################################################################
#
#              SIGNAL INTEGRITY HISTOGRAM PLOTTING
#
# What this script example does:
# 1. Connect to a tester
# 2. Reserve a port. 
# 3. Collecting SIV data from all 8 lanes
# 4. Plot the live histogram 
#
################################################################

import asyncio

from xoa_driver import testers
from xoa_driver import modules
from xoa_driver import ports
from xoa_driver import enums
from xoa_driver import utils
from xoa_driver.hlfuncs import mgmt
from xoa_driver.misc import Hex
import logging
import math
from typing import List

import matplotlib.pyplot as plt
from collections import deque

#---------------------------
# GLOBAL PARAMS
#---------------------------
CHASSIS_IP = "10.165.136.60"
USERNAME = "xoa"
PORT = "6/0"
FIGURE_TITLE = "Z800 Freya Signal Integrity Histogram Plot"
DENSITY = 1 # how many batches of siv data to show on the plot. A higher density means more data and slower plotting.
LANES = [0,1,2,3,4,5,6,7] # select lanes to display, ranging from 0 to 7
PLOTTING_INTERVAL = 1 # plots refreshed every n second
PLOTTING_DURATION = 120 # number of seconds for plotting

async def siv_plot(
        chassis: str, 
        username: str, 
        port_str: str,
        figure_title: str,
        density: int,
        plotting_interval: int,
        plotting_duration: int,
        lanes: List[int],
        ):
    
    # configure basic logger
    logging.basicConfig(
        format="%(asctime)s  %(message)s",
        level=logging.DEBUG,
        handlers=[
            logging.FileHandler(filename="siv_plot.log", mode="a"),
            logging.StreamHandler()]
        )
    
    # disable matplotlib.font_manager logging
    logging.getLogger('matplotlib.font_manager').disabled = True

    # remove duplicates and sort list
    lanes = list(set(lanes))
    lanes.sort()
    
    async with testers.L23Tester(host=chassis, username=username, password="xena", port=22606, enable_logging=False) as tester:
        logging.info(f"#####################################################################")
        logging.info(f"Chassis:                 {chassis}")
        logging.info(f"Username:                {username}")
        logging.info(f"Port:                    {port_str}")
        logging.info(f"Lanes:                   {lanes}")
        logging.info(f"Figure Title:            {figure_title}")
        logging.info(f" Data Density:            {density}")
        logging.info(f" Plot Refresh Interval:   {plotting_interval} s")
        logging.info(f" Plot Duration:           {plotting_duration} s")
        logging.info(f"#####################################################################")

        # Access module on the tester
        _mid = int(port_str.split("/")[0])
        _pid = int(port_str.split("/")[1])
        module_obj = tester.modules.obtain(_mid)

        if not isinstance(module_obj, modules.Z800FreyaModule):
            logging.info(f"Module {_mid} is not Z800 Freya module. Abort.")
            return None
        
        port_obj = module_obj.ports.obtain(_pid)
        await mgmt.free_module(module=module_obj, should_free_ports=False)
        await mgmt.reserve_port(port_obj)

        resp = await port_obj.capabilities.get()
        max_serdes = resp.serdes_count
        serdes_cnt_to_show = len(lanes)
        if max(lanes) > 7:
            logging.warning(f"Exceed max serdes index. Abort.")
            return None
        if serdes_cnt_to_show > max_serdes:
            logging.warning(f"Exceed max serdes count. Abort.")
            return None
        if serdes_cnt_to_show == 0:
            logging.warning(f"Nothing to show Abort.")
            return None

        # figure config
        plt.ion()
        fig = plt.figure(constrained_layout=True)
        fig.suptitle(f"{figure_title}\nChassis {chassis}, Port {port_str}, L={lanes}, D={density}")

        # grid spec
        if serdes_cnt_to_show == 1:
            gs = fig.add_gridspec(nrows=1, ncols=1)
        if serdes_cnt_to_show > 1:
            gs = fig.add_gridspec(nrows=math.ceil(serdes_cnt_to_show/2), ncols=2)

        # add subplots
        siv_subplots = []
        for i in range(serdes_cnt_to_show):
            siv_subplots.append(fig.add_subplot(gs[i%gs.nrows, int(i/gs.nrows)]))
        
        # data dequeue for each serdes lane. queue depth = density*2000
        INT_CNT_PER_DATA = 2000
        data_queue = []
        for _ in range(serdes_cnt_to_show):
            data_queue.append(deque((), maxlen=density*INT_CNT_PER_DATA))

        # set x and y label for each subplot
        for i in range(serdes_cnt_to_show):
            siv_subplots[i].set(xlabel=f"Value", ylabel=f"Lane {lanes[i]}")
        
        # group control commands for each serdes lane together to later send it as a command group.
        control_cmd_group = []
        for i in range(serdes_cnt_to_show):
            control_cmd_group.append(port_obj.l1.serdes[lanes[i]].medium.siv.control.set(opcode=enums.Layer1Opcode.START_SCAN))
        
        # get commands for each serdes lane together to later send it as a command group.
        get_cmd_group = []
        for i in range(serdes_cnt_to_show):
            get_cmd_group.append(port_obj.l1.serdes[lanes[i]].medium.siv.data.get())

        resp_group = ()
        plot_count = math.ceil(plotting_duration/plotting_interval)
        for _ in range(plot_count):
            await utils.apply(*control_cmd_group)
            while True:
                # get responses from all lanes
                resp_group = await utils.apply(*get_cmd_group)
                result_flags = [x.result for x in resp_group]
                if 0 in result_flags:
                    # if not all lanes are ready in data, query again.
                    continue
                else:
                    for i in range(serdes_cnt_to_show):
                        siv_raw_levels = resp_group[i].value[0:12]
                        siv_raw_values = resp_group[i].value[12:]

                        # convert from 12 raw bytes into 6 signed int
                        siv_int_levels = []
                        for x in zip(siv_raw_levels[0::2], siv_raw_levels[1::2]):
                            siv_int_levels.append(int.from_bytes(bytes(x), byteorder='big', signed=True))
                        # Please note: only the first slicer data is used here.

                        # convert from 4000 bytes into 2000 signed int
                        siv_int_values = []
                        for x in zip(siv_raw_values[0::2], siv_raw_values[1::2]):
                            siv_int_values.append(int.from_bytes(bytes(x), byteorder='big', signed=True))
                        # put value data in queue
                        data_queue[i].extend(tuple(siv_int_values))

                        # siv data ranges from -64 to 63, thus 128 bins in total.
                        siv_subplots[i].cla()
                        siv_subplots[i].relim()
                        siv_subplots[i].autoscale_view()
                        siv_subplots[i].set(xlabel=f"Value", ylabel=f"Lane {lanes[i]}")
                        siv_subplots[i].hist(x=[*data_queue[i]], bins=128, range=(-64, 63), density=False, color="blue", orientation="horizontal")

                        # levels contains 6 values, 4 average pam4 levels and 2 slicers, (<p1> <p2> <p3> <m1> <m2> <m3>)
                        # add base slicer (this is always at 0)
                        y = 0
                        siv_subplots[i].axhline(y, color='black', linestyle='-', linewidth=0.5)
                        siv_subplots[i].text(siv_subplots[i].get_xlim()[1] + 0.1, y, f'base={y}', fontsize="small")
                        # add upper slicer <p2>
                        y = siv_int_levels[1]
                        siv_subplots[i].axhline(y, color='green', linestyle='dashed', linewidth=0.5)
                        siv_subplots[i].text(siv_subplots[i].get_xlim()[1] + 0.1, y, f'slicer={y}', fontsize="small")
                        # add lower slicer <m2>
                        y = siv_int_levels[4]
                        siv_subplots[i].axhline(y, color='green', linestyle='dashed', linewidth=0.5)
                        siv_subplots[i].text(siv_subplots[i].get_xlim()[1] + 0.1, y, f'slicer={y}', fontsize="small")
                        # add average level 3 <p3>
                        y = siv_int_levels[2]
                        siv_subplots[i].axhline(y, color='black', linestyle='dashed', linewidth=0.1)
                        siv_subplots[i].text(siv_subplots[i].get_xlim()[1] + 0.1, y, f'level3={y}', fontsize="small")
                        # add average level 2 <p1>
                        y = siv_int_levels[0]
                        siv_subplots[i].axhline(y, color='black', linestyle='dashed', linewidth=0.1)
                        siv_subplots[i].text(siv_subplots[i].get_xlim()[1] + 0.1, y, f'level2={y}', fontsize="small")
                        # add average level 1 <m3>
                        y = siv_int_levels[5]
                        siv_subplots[i].axhline(y, color='black', linestyle='dashed', linewidth=0.1)
                        siv_subplots[i].text(siv_subplots[i].get_xlim()[1] + 0.1, y, f'level1={y}', fontsize="small")
                        # add average level 0 <m1>
                        y = siv_int_levels[3]
                        siv_subplots[i].axhline(y, color='black', linestyle='dashed', linewidth=0.1)
                        siv_subplots[i].text(siv_subplots[i].get_xlim()[1] + 0.1, y, f'level0={y}', fontsize="small")
                        

                    plt.show()
                    plt.pause(plotting_interval)
                    break
        
        await mgmt.free_port(port_obj)
        logging.info(f"Bye!")

async def main():
    stop_event = asyncio.Event()
    try:
        await siv_plot(
            chassis=CHASSIS_IP,
            username=USERNAME,
            port_str=PORT,
            figure_title=FIGURE_TITLE,
            density=DENSITY,
            plotting_interval=PLOTTING_INTERVAL,
            plotting_duration = PLOTTING_DURATION,
            lanes=LANES
            )
    except KeyboardInterrupt:
        stop_event.set()

if __name__ == "__main__":
    asyncio.run(main())

fec_error_dist_plot.py 

################################################################
#
#                   PRE-FEC ERROR DIST PLOT
#
# What this script example does:
# 1. Connect to a tester
# 2. Reserve a all ports on a module
# 3. Set the port FEC mode on
# 4. Clear FEC stats
# 5. Query FEC Blocks (symbol error) and FEC stats
# 6. Plot the Pre-FEC error distribution for all ports
#
################################################################

import asyncio

from xoa_driver import testers
from xoa_driver import modules
from xoa_driver import ports
from xoa_driver import enums
from xoa_driver import utils
from xoa_driver.hlfuncs import mgmt
from xoa_driver.misc import Hex
import logging
import math

import matplotlib.pyplot as plt
import numpy as np
from collections import deque

#---------------------------
# GLOBAL PARAMS
#---------------------------
CHASSIS_IP = "10.165.136.66"
USERNAME = "xoa"
MODULE = "4"
FIGURE_TITLE = "Pre-FEC Error Distribution Plot (log10)"
PLOTTING_INTERVAL = 1 # plots refreshed every n second
PLOTTING_DURATION = 120 # number of seconds for plotting

# Enable the FEC mode you want
FEC_MODE = enums.FECMode.ON # either RS FEC KR or KP. Determined by the port automatically
# FEC_MODE = enums.FECMode.FC_FEC
# FEC_MODE = enums.FECMode.RS_FEC_INT
        
#---------------------------
# pre_fec_error_dist_plot
#---------------------------
async def pre_fec_error_dist_plot(
        chassis: str,
        username: str,
        module_str: str,
        figure_title: str,
        plotting_interval: int,
        plotting_duration: int,
        fec_mode: enums.FECMode
        ):
    # configure basic logger
    logging.basicConfig(
        format="%(asctime)s  %(message)s",
        level=logging.DEBUG,
        handlers=[
            logging.FileHandler(filename="fec_plot.log", mode="a"),
            logging.StreamHandler()]
        )
    
    # disable matplotlib.font_manager logging
    logging.getLogger('matplotlib.font_manager').disabled = True

    # Establish connection to a Valkyrie tester using Python context manager
    # The connection will be automatically terminated when it is out of the block
    async with testers.L23Tester(host=chassis, username=username, password="xena", port=22606, enable_logging=False) as tester:
        logging.info(f"#####################################################################")
        logging.info(f"Chassis:                 {chassis}")
        logging.info(f"Username:                {username}")
        logging.info(f"Port:                    {module_str}")
        logging.info(f"Figure Title:            {figure_title}")
        logging.info(f" Plot Refresh Interval:   {plotting_interval} s")
        logging.info(f" Plot Duration:           {plotting_duration} s")
        logging.info(f"#####################################################################")

        # Access module on the tester
        _mid = int(module_str)
        module_obj = tester.modules.obtain(_mid)

        if isinstance(module_obj, modules.E100ChimeraModule):
            logging.info(f"FEC not supported on E100 Chimera modules")
            return None
        
        if isinstance(module_obj, modules.Z10OdinModule):
            logging.info(f"FEC not supported on Z10 Odin modules")
            return None 
        
        # reserve all ports on a module
        port_objs = [x for x in module_obj.ports]
        port_cnt = len(port_objs)

        # Forcibly reserve the port
        await mgmt.free_module(module=module_obj, should_free_ports=False)
        resp = await module_obj.revision.get()
        module_module_name = resp.revision
        for p in port_objs:
            await mgmt.reserve_port(p)

        await asyncio.sleep(1)
        
        # figure config
        plt.ion()
        fig = plt.figure(constrained_layout=True)
        fig.suptitle(f"{figure_title}\nChassis {chassis}, Module {module_str}, {module_module_name}")
        
        # grid spec
        if port_cnt == 1:
            gs = fig.add_gridspec(nrows=1, ncols=1)
        if port_cnt > 1:
            gs = fig.add_gridspec(nrows=math.ceil(port_cnt/2), ncols=2)

        # add subplots
        pre_fec_subplots = []
        for i in range(port_cnt):
            pre_fec_subplots.append(fig.add_subplot(gs[i%gs.nrows, int(i/gs.nrows)]))

        # set x and y label for each subplot
        for i in range(port_cnt):
            pre_fec_subplots[i].set(xlabel=f"Symbol Errors", ylabel=f"FEC Codewords ({module_str}/{i}) (log10)")

        # set FEC mode on
        logging.info(f"Set FEC Mode = {fec_mode.name}")
        for p in port_objs:
            await p.fec_mode.set(mode=fec_mode)

        # clear FEC counter
        logging.info(f"Clear FEC counter")
        for p in port_objs:
            await p.pcs_pma.rx.clear.set()

        # query FEC Totals and Pre-FEC Error Distribution
        plot_count = math.ceil(plotting_duration/plotting_interval)
        pre_fec_error_dist_data = [[0]*17]*port_cnt
        print(len(pre_fec_subplots))
        for _ in range(plot_count):
            logging.info(f"PRE-FEC ERROR DISTRIBUTION")
            for i in range(port_cnt):
                port_obj = port_objs[i]
                logging.info(f"Port {port_obj.kind.module_id}/{port_obj.kind.port_id}")
                # await port_obj.pcs_pma.rx.clear.set()
                _total_status, _fec_status = await utils.apply(
                    port_obj.pcs_pma.rx.total_status.get(),
                    port_obj.pcs_pma.rx.fec_status.get()
                )
                n = _fec_status.data_count - 2
                for j in range(n):
                    logging.info(f"  FEC Blocks (Symbol Errors = {j}): {_fec_status.stats[j]}")
                logging.info(f"  FEC Blocks (Symbol Errors > {n-1}): {_fec_status.stats[n]}")
                
                x_axis = [str(x) for x in range(n)]
                x_axis.append(f"> {n-1}")
                color_array = ['y']*(n-1)
                color_array.insert(0, 'g')
                color_array.append('r')

                pre_fec_error_dist_data[i] = [x + y for x, y in zip(pre_fec_error_dist_data[i], _fec_status.stats[0:n+1])]
                pre_fec_ber_str = ""
                if _total_status.total_pre_fec_ber == 0:
                    pre_fec_ber_str = f"Pre-FEC BER = 0"
                else:
                    pre_fec_ber_str = f"Pre-FEC BER = {abs(1/_total_status.total_pre_fec_ber)}"

                pre_fec_subplots[i].cla()
                pre_fec_subplots[i].relim()
                pre_fec_subplots[i].autoscale_view()
                pre_fec_subplots[i].set(xlabel=f"Symbol Errors", ylabel=f"FEC Codewords ({module_str}/{i})")
                pre_fec_error_dist_data_log10 = []
                for x in pre_fec_error_dist_data[i]:
                    if x > 0:
                        pre_fec_error_dist_data_log10.append(np.log10(x))
                    else:
                        pre_fec_error_dist_data_log10.append(0)
                # print(pre_fec_error_dist_data_log10)
                tmp = pre_fec_subplots[i].bar(x=x_axis, height=pre_fec_error_dist_data_log10, color=color_array,)
                pre_fec_subplots[i].bar_label(container=tmp, fmt='%.1f')
                x0, xmax = pre_fec_subplots[i].get_xbound()
                y0, ymax = pre_fec_subplots[i].get_ybound()

                pre_fec_subplots[i].text((x0+xmax)*0.7, (y0+ymax)*0.9, pre_fec_ber_str, fontsize="small")

            plt.show()
            logging.info(f"Clear FEC counter")
            for p in port_objs:
                await p.pcs_pma.rx.clear.set()
            plt.pause(plotting_interval)
            


async def main():
    stop_event = asyncio.Event()
    try:
        await pre_fec_error_dist_plot(
            chassis=CHASSIS_IP,
            username=USERNAME,
            module_str=MODULE,
            figure_title=FIGURE_TITLE,
            plotting_interval=PLOTTING_INTERVAL,
            plotting_duration=PLOTTING_DURATION,
            fec_mode=FEC_MODE
            )
    except KeyboardInterrupt:
        stop_event.set()


if __name__ == "__main__":
    asyncio.run(main())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/895185.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp 获取签名证书 SHA1 自有证书签名打包

1.登录你的Dcloud 账户 2.找到我的应用菜单 3.点开某个应用 4.查看证书详情&#xff0c;里面有SHA1 和别名&#xff0c;密码&#xff0c;下载证书用于云打包&#xff0c;可以选择自有证书&#xff0c;输入别名&#xff0c;密码打包

读数据工程之道:设计和构建健壮的数据系统14源系统

1. 源系统中的数据生成 1.1. 数据工程师的工作是从源系统获取数据&#xff0c;对其进行处理&#xff0c;使其有助于为下游用例提供服务 1.2. 数据工程师的角色将在很大程度上转向理解数据源和目的地之间的相互作用 1.3. 数据工程的最基本的数据管道任务——将数据从A移动到B…

类型转换 与 explicit 关键字作用

例子1&#xff1a; 有时候&#xff0c;如果你不希望编译器帮你自动转换类型&#xff0c;就用关键字 explicit 。 class SampleClass1{ public:operator string() { return string();} };class SampleClass2{ public:explicit operator string() {return string();} };void …

Chrome谷歌浏览器加载ActiveX控件之JT2Go控件

背景 JT2Go是一款西门子公司出品的三维图形轻量化预览解决工具&#xff0c;包含精确3D测量、基本3D剖面、PMI显示和改进的选项过滤器等强大的功能。JT2Go控件是一个标准的ActiveX控件&#xff0c;曾经主要在IE浏览器使用&#xff0c;由于微软禁用IE浏览器&#xff0c;导致JT2Go…

操作系统:进程通信实践-同步又有互斥的信号量机制(详解)

目录 请设计进程既有同步又有互斥的应用场景&#xff0c;并尝试用信号量机制实现。可尝试用有名或无名信号量代码实现上述过程&#xff0c;并给出代码截图、调试过程和运行结果截图。当交换互斥和同步的P&#xff0c;V操作顺序时&#xff0c;程序运行结果是什么&#xff1f; …

【CTF-SHOW】Web入门 Web14 【editor泄露-详】【var/www/html目录-详】

editor泄露问题通常出现在涉及文件编辑器或脚本编辑器的题目中&#xff0c;尤其是在Web安全或Pwn&#xff08;系统漏洞挖掘&#xff09;类别中。editor泄露的本质是由于系统未能妥善处理临时文件、编辑历史或进程信息&#xff0c;导致攻击者可以通过某种途径获取正在编辑的敏感…

CABiNet:用于低延迟语义分割的高效上下文聚合网络

摘要 随着自主机器需求的不断增加&#xff0c;视觉场景理解的像素级语义分割不仅需要准确&#xff0c;而且需要高效&#xff0c;以满足任何潜在的实时应用需求。在本文中&#xff0c;我们提出了CABiNet&#xff08;Context Aggregated Bi-lateral Network&#xff0c;上下文聚…

力扣3191.使二进制数全变成1

给你一个二进制数组 nums 。 你可以对数组执行以下操作 任意 次&#xff08;也可以 0 次&#xff09;&#xff1a; 选择数组中 任意连续 3 个元素&#xff0c;并将它们 全部反转 。 反转 一个元素指的是将它的值从 0 变 1 &#xff0c;或者从 1 变 0 。 请你返回将 nums 中…

Unity Spine优化思路

最近终于闲下来了&#xff0c;于是开始把近期探索到的unity相关优化整理起来。 我们的项目采用的人物表现方式是spine动画&#xff0c;这在2D游戏里算比较常见的解决方案了&#xff0c;但是里面有一些设置需要提前注意一下&#xff0c;否则会造成不必要的性能浪费。 养成读官…

SQL Injection | SQL 注入概述

关注这个漏洞的其他相关笔记&#xff1a;SQL 注入漏洞 - 学习手册-CSDN博客 0x01&#xff1a;SQL 注入漏洞介绍 SQL 注入就是指 Web 应用程序对用户输入数据的合法性没有判断&#xff0c;前端传入后端的参数是可控的&#xff0c;并且参数会带入到数据库中执行&#xff0c;导致…

LabVIEW自动化流动返混实验系统

随着工业自动化的不断发展&#xff0c;连续流动反应器在化工、医药等领域中的应用日益广泛。传统的流动返混实验操作复杂&#xff0c;数据记录和处理不便&#xff0c;基于LabVIEW的全自动流动返混实验系统能自动测定多釜反应器、单釜反应器和管式反应器的停留时间分布&#xff…

pytest框架的allure报告怎么去看

pytest框架的allure报告怎么去看 一、安装jdk和allure1.1安装jdk&#xff08;自行找资料&#xff09;1.2安装Allure 二、编写pytest代码三、执行脚本3.1 运行测试并生成 Allure 结果3.2 你可以使用以下命令来查看生成的报告3.3生成的视图 一、安装jdk和allure 1.1安装jdk&…

LabVIEW提高开发效率技巧----VI继承与重载

在LabVIEW开发中&#xff0c;继承和重载是面向对象编程&#xff08;OOP&#xff09;中的重要概念。通过合理运用继承与重载&#xff0c;不仅能提高代码的复用性和灵活性&#xff0c;还能减少开发时间和维护成本。下面从多个角度介绍如何在LabVIEW中使用继承和重载&#xff0c;并…

机器学习建模分析

机器学习 5.1 机器学习概述5.1.1 机器学习与人工智能5.1.2 python机器学习方法库 5.2 回归分析5.2.1 回归分析原理5.2.2 回归分析实现 5.3 分类分析5.3.1 分类学习原理5.3.2 决策树5.5.3 支持向量机 5.4 聚类分析5.4.1 聚类任务5.4.2 K-means算法 5.5 神经网络和深度学习5.5.1神…

YOLO11来啦 | 详细解读YOLOv8的改进模块!

简介 2024年可谓是YOLO历史性的一年&#xff0c;9月份的最后一天迎来了YOLO2024年的第三部巨作。2024年2月21日&#xff0c;继 2023 年 1 月 YOLOv8 正式发布一年多以后&#xff0c;YOLOv9 才终于到来了&#xff01;YOLOv9提出了可编程梯度信息&#xff08;Programmable Gradi…

msql事务隔离级别 线上问题

1. 对应代码 解决方式&#xff1a; 在事务隔离级别为可重复读&#xff08;RR&#xff09;时&#xff0c;数据库确实通常会记录当前数据的快照。 在可重复读隔离级别下&#xff0c;事务在执行期间看到的数据是事务开始时的数据快照&#xff0c;即使其他事务对数据进行了修改&am…

Artistic Oil Paint 艺术油画着色器插件

只需轻轻一点&#xff0c;即可将您的视频游戏转化为艺术品&#xff01;&#xff08;也许更多…&#xff09;。 ✓ 整个商店中最可配置的选项。 ✓ 六种先进算法。 ✓ 细节增强算法。 ✓ 完整的源代码&#xff08;脚本和着色器&#xff09;。 ✓ 包含在“艺术包”中。 &#x1f…

读人工智能全传16读后总结与感想兼导读

读人工智能全传16读后总结与感想兼导读.png 1. 基本信息 人工智能全传 [英]迈克尔伍尔德里奇 著 浙江科学技术出版社,2021年3月出版 1.1. 读薄率 书籍总字数234千字&#xff0c;笔记总字数46186字。 读薄率46186234000≈19.7% 1.2. 读厚方向 千脑智能脑机穿越未来呼啸而来虚拟人…

Redis知识应用索引指南

Redis&#xff0c;全称为Remote Dictionary Server&#xff0c;是一个开源的高性能键值对数据库。它以其卓越的性能、丰富的数据结构和灵活的持久化机制&#xff0c;在现代应用中扮演着至关重要的角色 1 什么是redis Redis是一个使用ANSI C语言编写的开源、跨平台的键值存储系…

ubuntu18开启ssh服务

本部分主要是记述下如何打开ubuntu的ssh功能&#xff0c;从而可以以ssh的方式远程连接ubuntu&#xff0c;而不需要每次都在现场工作。 1. 更新源 $ apt update [sudo apt update] 2. 下载openssh-server # sudo apt install openssh-server 3. 看下服务状态 # service s…