信雅纳网络测试的二次开发集成:XOA(Xena Open-Source Automation)开源自动化测试

news2025/1/11 16:57:37

目录

XOA是什么

XOA CLI

XOA Python API

​XOA Python Test Suite/测试套件

XOA Converter

Source Code


XOA是什么

XOA(Xena Open-Source Automation)是一个开源的测试自动化框架,追求“高效、易用、灵活”的跨操作系统的开发框架。能与Xena现有解决方案无缝配合,借助XOA可调用Xena(Z系列打流仪、E系列损伤仪)完成自动化测试任务。同时它提供了操作接口可将其他仪表/设备做并栈集成测试验证,统一整理输出测试报告。

XOA包含:
XOA CLI、XOA Python API、XOA Python TestSuite、XOA Converter

信雅纳:网络测试自动化

XOA CLI

XOA CLI 提供了一套简洁直观的基于文本语言的独立命令,用以控制和集成 Xena测试仪硬件,实现各种测试任务的自动化。
任何客户端平台/编程语言(如 Python、Tcl、Bash)都可与 XOA CLI 配合使用。
CLI 可在远程登录终端上使用,直接向 Xena 测试仪发送命令。
ValkyrieManager通过测试端口配置文件(.xpc ),可在 XOA CLI 环境之间无缝转换。

XOA Python API

XOA Python API与XOA CLI和XenaManager无缝集成

  • 面向对象的高级抽象: XOA Python API采用面向对象的方法,提供了更高层次的抽象,加快了自动化脚本的开发。
  • 集成开发环境自动完成,内置手册: XOA Python API 包含 IDE 自动完成以及类、函数和 API 内置手册等功能,可显著提高开发效率。
  • 命令分组和响应自动匹配:该功能允许命令分组和响应自动匹配,从而优化了测试执行效率。
  • 服务器到客户端推送通知订阅: XOA Python API 支持服务器到客户端的推送通知订阅,降低了用户代码的复杂性。
  • 支持 Python 3.8 及更高版本: XOA Python API 兼容 Python 3.8 及更高版本,确保与现代 Python 环境兼容。
    import asyncio
    from contextlib import suppress
    from xoa_driver import testers
    from xoa_driver import modules
    from xoa_driver import ports
    from xoa_driver import utils
    from xoa_driver import enums
    from xoa_driver import exceptions
    from ipaddress import IPv4Address, IPv6Address
    from binascii import hexlify
    from xoa_driver.misc import Hex
    
    #---------------------------
    # Global parameters
    #---------------------------
    
    CHASSIS_IP = "10.165.16.70"      # Chassis IP address or hostname
    USERNAME = "XOA"                # Username
    MODULE_INDEX = 4                # Module index
    TX_PORT_INDEX = 0               # TX Port index
    
    FRAME_SIZE_BYTES = 4178         # Frame size on wire including the FCS.
    FRAME_COUNT = 20              # The number of frames including the first, the middle, and the last.
    REPETITION = 1                  # The number of repetitions of the frame sequence, set to 0 if you want the port to repeat over and over
    TRAFFIC_RATE_FPS = 100          # Traffic rate in frames per second
    TRAFFIC_RATE_PERCENT = int(4/10 * 1000000)
    
    SHOULD_BURST = False            # Whether the middle frames should be bursty
    BURST_SIZE_FRAMES = 9           # Burst size in frames for the middle frames
    INTER_BURST_GAP_BYTES = 3000    # The inter-burst gap in bytes
    INTRA_BURST_GAP_BYTES = 1000    # The inter-frame gap within a burst, aka. intra-burst gap, in bytes
    
    
    
    #---------------------------
    # Header content for streams
    #---------------------------
    class Ethernet:
        def __init__(self):
            self.dst_mac = "0000.0000.0000"
            self.src_mac = "0000.0000.0000"
            self.ethertype = "86DD"
        
        def __str__(self):
            _dst_mac = self.dst_mac.replace(".", "")
            _src_mac = self.src_mac.replace(".", "")
            _ethertype = self.ethertype
            return f"{_dst_mac}{_src_mac}{_ethertype}".upper()
        
    class IPV4:
        def __init__(self):
            self.version = 4
            self.header_length = 5
            self.dscp = 0
            self.ecn = 0
            self.total_length = 42
            self.identification = "0000"
            self.flags = 0
            self.offset = 0
            self.ttl = 255
            self.proto = 255
            self.checksum = "0000"
            self.src = "0.0.0.0"
            self.dst = "0.0.0.0"
    
        def __str__(self):
            _ver = '{:01X}'.format(self.version)
            _header_length = '{:01X}'.format(self.header_length)
            _dscp_ecn = '{:02X}'.format((self.dscp<<2)+self.ecn)
            _total_len = '{:04X}'.format(self.total_length)
            _ident = self.identification
            _flag_offset = '{:04X}'.format((self.flags<<13)+self.offset)
            _ttl = '{:02X}'.format(self.ttl)
            _proto = '{:02X}'.format(self.proto)
            _check = self.checksum
            _src = hexlify(IPv4Address(self.src).packed).decode()
            _dst = hexlify(IPv4Address(self.dst).packed).decode()
            return f"{_ver}{_header_length}{_dscp_ecn}{_total_len}{_ident}{_flag_offset}{_ttl}{_proto}{_check}{_src}{_dst}".upper()
    
    class IPV6:
        def __init__(self):
            self.version = 6
            self.traff_class = 8
            self.flow_label = 0
            self.payload_length = 0
            self.next_header = "11"
            self.hop_limit = 1
            self.src = "2000::2"
            self.dst = "2000::100"
    
        def __str__(self):
            _ver = '{:01X}'.format(self.version)
            _traff_class = '{:01X}'.format(self.traff_class)
            _flow_label = '{:06X}'.format(self.flow_label)
            _payload_len = '{:04X}'.format(self.payload_length)
            _next_header = self.next_header
            _hop_limit = '{:02X}'.format(self.hop_limit)
            _src = hexlify(IPv6Address(self.src).packed).decode()
            _dst = hexlify(IPv6Address(self.dst).packed).decode()
            return f"{_ver}{_traff_class}{_flow_label}{_payload_len}{_next_header}{_hop_limit}{_src}{_dst}".upper()
    
    class UDP:
        def __init__(self):
            self.src_port = 0
            self.dst_port = 0
            self.length = 0
            self.checksum = 0
    
        def __str__(self):
            _src_port = '{:04X}'.format(self.src_port)
            _dst_port = '{:04X}'.format(self.dst_port)
            _length = '{:04X}'.format(self.length)
            _checksum = '{:04X}'.format(self.checksum)
            return f"{_src_port}{_dst_port}{_length}{_checksum}".upper()
    
    class ROCEV2:
        def __init__(self):
            self.opcode = 0
            self.solicited_event = 0
            self.mig_req = 0
            self.pad_count = 1
            self.header_version = 0
            self.partition_key = 65535
            self.reserved = 7
            self.dest_queue_pair = 2
            self.ack_request = 0
            self.reserved_7bits = 0
            self.packet_seq_number =0
    
        def __str__(self):
            _opcode = '{:02X}'.format(self.opcode)
            _combo_1 = '{:02X}'.format((self.solicited_event<<7)+(self.mig_req<<6)+(self.pad_count<<4)+self.header_version)
            _pk = '{:04X}'.format(self.partition_key)
            _reserved = '{:02X}'.format(self.reserved)
            _qp = '{:06X}'.format(self.dest_queue_pair)
            _combo_2 = '{:02X}'.format((self.ack_request<<7)+self.reserved_7bits)
            _ps = '{:06X}'.format(self.packet_seq_number)
            return f"{_opcode}{_combo_1}{_pk}{_reserved}{_qp}{_combo_2}{_ps}".upper()
        
    
    #------------------------------
    # def my_awesome_func()
    #------------------------------
    async def my_awesome_func(stop_event: asyncio.Event, should_burst: bool) -> None:
        """This Python function uses XOA Python API to configure the TX port
    
        :param stop_event:
        :type stop_event: asyncio.Event
        :param should_burst: Whether the middle frames should be bursty.
        :type should_burst: bool
        """
        # create tester instance and establish connection
        tester = await testers.L23Tester(CHASSIS_IP, USERNAME, enable_logging=False) 
    
        # access the module on the tester
        module = tester.modules.obtain(MODULE_INDEX)
    
        # check if the module is of type Loki-100G-5S-2P
        if not isinstance(module, modules.ModuleChimera):
            
            # access the txport on the module
            txport = module.ports.obtain(TX_PORT_INDEX)
    
            #---------------------------
            # Port reservation
            #---------------------------
            print(f"#---------------------------")
            print(f"# Port reservation")
            print(f"#---------------------------")
            if txport.is_released():
                print(f"The txport is released (not owned by anyone). Will reserve the txport to continue txport configuration.")
                await txport.reservation.set_reserve() # set reservation , means txport will be controlled by our session
            elif not txport.is_reserved_by_me():
                print(f"The txport is reserved by others. Will relinquish and reserve the txport to continue txport configuration.")
                await txport.reservation.set_relinquish() # send relinquish the txport
                await txport.reservation.set_reserve() # set reservation , means txport will be controlled by our session
    
            #---------------------------
            # Start port configuration
            #---------------------------
            print(f"#---------------------------")
            print(f"# Start port configuration")
            print(f"#---------------------------")
    
            print(f"Reset the txport")
            await txport.reset.set()
    
            print(f"Configure the txport")
            await utils.apply(
                # txport.speed.mode.selection.set(mode=enums.PortSpeedMode.F100G),
                txport.comment.set(comment="RoCE2 on Loki"),
                txport.tx_config.enable.set_on(),
                txport.latency_config.offset.set(offset=0),
                txport.latency_config.mode.set(mode=enums.LatencyMode.LAST2LAST),
                txport.tx_config.burst_period.set(burst_period=0),
                txport.tx_config.packet_limit.set(packet_count_limit=FRAME_COUNT*REPETITION),
                txport.max_header_length.set(max_header_length=128),
                txport.autotrain.set(interval=0),
                txport.loop_back.set_none(),                                # If you want loopback the port TX to its own RX, change it to set_txoff2rx()
                txport.checksum.set(offset=0),
                txport.tx_config.delay.set(delay_val=0),
                txport.tpld_mode.set_normal(),
                txport.payload_mode.set_normal(),
                #txport.rate.pps.set(port_rate_pps=TRAFFIC_RATE_FPS),       # If you want to control traffic rate with FPS, uncomment this.
                txport.rate.fraction.set(TRAFFIC_RATE_PERCENT),                          # If you want to control traffic rate with fraction, uncomment this. 1,000,000 = 100%
            )
            if should_burst:
                await txport.tx_config.mode.set_burst()
            else:
                await txport.tx_config.mode.set_sequential()
            
            #--------------------------------------
            # Configure stream_0 on the txport
            #--------------------------------------
            print(f"   Configure first-packet stream on the txport")
    
            stream_0 = await txport.streams.create()
            eth = Ethernet()
            eth.src_mac = "aaaa.aaaa.0005"
            eth.dst_mac = "bbbb.bbbb.0005"
    
            ipv4 = IPV4()
            ipv4.src = "1.1.1.5"
            ipv4.dst = "2.2.2.5"
    
            ipv6 = IPV6()
            ipv6.src = "2001::5"
            ipv6.dst = "2002::5"
    
            udp = UDP()
            udp.src_port = 4791
            udp.dst_port = 4791
    
            rocev2 = ROCEV2()
            rocev2.opcode = 0
            rocev2.dest_queue_pair = 2
            rocev2.packet_seq_number = 0
    
            await utils.apply(
                stream_0.enable.set_on(),
                stream_0.packet.limit.set(packet_count=1),
                stream_0.comment.set(f"First packet"),
                stream_0.rate.fraction.set(stream_rate_ppm=10000),
                stream_0.packet.header.protocol.set(segments=[
                    enums.ProtocolOption.ETHERNET,
                    enums.ProtocolOption.IPV6,
                    enums.ProtocolOption.UDP,
                    enums.ProtocolOption.RAW_12,
                    ]),
                stream_0.packet.header.data.set(hex_data=Hex(str(eth)+str(ipv6)+str(udp)+str(rocev2))),
                stream_0.packet.length.set(length_type=enums.LengthType.FIXED, min_val=FRAME_SIZE_BYTES, max_val=FRAME_SIZE_BYTES),
                stream_0.payload.content.set(
                    payload_type=enums.PayloadType.PATTERN, 
                    hex_data=Hex("AABBCCDD")
                    ),
                stream_0.tpld_id.set(test_payload_identifier = 0),
                stream_0.insert_packets_checksum.set_on()
            )
            if should_burst:
                await stream_0.burst.burstiness.set(size=1, density=100)
                await stream_0.burst.gap.set(inter_packet_gap=0, inter_burst_gap=0)
    
            #--------------------------------------
            # Configure stream_1 on the txport
            #--------------------------------------
            print(f"   Configure middle-packets stream on the txport")
    
            stream_1 = await txport.streams.create()
    
            rocev2.opcode = 1
            rocev2.dest_queue_pair = 2
            rocev2.packet_seq_number = 1
    
            await utils.apply(
                stream_1.enable.set_on(),
                stream_1.packet.limit.set(packet_count=FRAME_COUNT-2),
                stream_1.comment.set(f"Middle packets"),
                stream_1.rate.fraction.set(stream_rate_ppm=10000),
                stream_1.packet.header.protocol.set(segments=[
                    enums.ProtocolOption.ETHERNET,
                    enums.ProtocolOption.IPV6,
                    enums.ProtocolOption.UDP,
                    enums.ProtocolOption.RAW_12,
                    ]),
                stream_1.packet.header.data.set(hex_data=Hex(str(eth)+str(ipv6)+str(udp)+str(rocev2))),
                stream_1.packet.length.set(length_type=enums.LengthType.FIXED, min_val=FRAME_SIZE_BYTES, max_val=FRAME_SIZE_BYTES),
                stream_1.payload.content.set(
                    payload_type=enums.PayloadType.PATTERN, 
                    hex_data=Hex("AABBCCDD")
                    ),
                stream_1.tpld_id.set(test_payload_identifier = 1),
                stream_1.insert_packets_checksum.set_on()
            )
            if should_burst:
                await stream_1.burst.burstiness.set(size=BURST_SIZE_FRAMES, density=100)
                await stream_1.burst.gap.set(inter_packet_gap=INTRA_BURST_GAP_BYTES, inter_burst_gap=INTER_BURST_GAP_BYTES)
    
            # Configure a modifier on the stream_1
            await stream_1.packet.header.modifiers.configure(1)
    
            # Modifier on the SQN
            modifier = stream_1.packet.header.modifiers.obtain(0)
            await modifier.specification.set(position=72, mask="FFFF0000", action=enums.ModifierAction.INC, repetition=1)
            await modifier.range.set(min_val=1, step=1, max_val=FRAME_COUNT-2)
    
    
            #--------------------------------------
            # Configure stream_2 on the txport
            #--------------------------------------
            print(f"   Configure last-packet stream on the txport")
    
            stream_2 = await txport.streams.create()
    
            rocev2.opcode = 2
            rocev2.dest_queue_pair = 2
            rocev2.packet_seq_number = FRAME_COUNT-1
    
            await utils.apply(
                stream_2.enable.set_on(),
                stream_2.packet.limit.set(packet_count=1),
                stream_2.comment.set(f"Last packet"),
                stream_2.rate.fraction.set(stream_rate_ppm=10000),
                stream_2.packet.header.protocol.set(segments=[
                    enums.ProtocolOption.ETHERNET,
                    enums.ProtocolOption.IPV6,
                    enums.ProtocolOption.UDP,
                    enums.ProtocolOption.RAW_12,
                    ]),
                stream_2.packet.header.data.set(hex_data=Hex(str(eth)+str(ipv6)+str(udp)+str(rocev2))),
                stream_2.packet.length.set(length_type=enums.LengthType.FIXED, min_val=FRAME_SIZE_BYTES, max_val=FRAME_SIZE_BYTES),
                stream_2.payload.content.set(
                    payload_type=enums.PayloadType.PATTERN, 
                    hex_data=Hex("AABBCCDD")
                    ),
                stream_2.tpld_id.set(test_payload_identifier = 2),
                stream_2.insert_packets_checksum.set_on()
            )
            if should_burst:
                await stream_2.burst.burstiness.set(size=1, density=100)
                await stream_2.burst.gap.set(inter_packet_gap=0, inter_burst_gap=0)
    
    
    
    async def main():
        stop_event =asyncio.Event()
        try:
            await my_awesome_func(stop_event, should_burst=SHOULD_BURST)
        except KeyboardInterrupt:
            stop_event.set()
    
    
    if __name__=="__main__":
        asyncio.run(main())

信雅纳:Python XOA测试自动化
 

XOA Python Test Suite/测试套件

XOA Python 测试套件是一个测试框架,为开发人员和测试专家执行和集成 Xena 测试套件提供了定义明确的 API。
该框架以自动化方式处理各种任务,如测试资源管理、测试执行和发布测试结果。
每个 RFC 测试套件都被设计成独立的 "插件",可根据需要有选择性地集成到项目中。
目前,XOA Python 测试套件包括
- RFC2544
- RFC2889
- RFC3918

XOA Converter

如果您希望将当前的 Xena 测试套件配置快速迁移到 XOA,现在使用 XOA 转换器工具比以往任何时候都更容易。

以前,Xena的测试套件应用程序仅与Windows兼容。但今后,所有现有和未来的测试套件都将并入 XOA Python 测试套件,从而消除 Windows 限制。

为了简化过渡,我们推出了 XOA 转换器。该工具允许用户将现有的Xena测试套件配置(Xena2544、Xena2889和Xena3918)从Xena窗口桌面应用程序无缝迁移到XOA Python测试套件中。有了 XOA 转换器,迁移过程变得轻松简单。

信雅纳:网络测试仪自动化测试

Source Code

GitHub 是我们托管 XOA 源代码的首选平台,因为它具有出色的版本控制和协作能力。它为管理代码变更提供了一个极佳的环境,确保项目的历史记录完备且易于访问。我们崇尚开放,鼓励每个人使用、分享、贡献和反馈我们的源代码。GitHub 允许进行无缝协作,并促进以社区为导向的方法,让每个人都能积极参与 XOA 的开发和改进。我们重视来自社区的意见和贡献,因为这能提高源代码的整体质量和创新性。

  • XOA Python API Source Code
  • XOA Python Test Suite – Core Source Code
  • XOA Python Test Suite – Plugin Source Code
  • XOA ANLT Utility Source Code
  • XOA Converter Source Code

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

量子遗传算法优化VMD参数,五种适应度函数任意切换,最小包络熵、样本熵、信息熵、排列熵、排列熵/互信息熵...

关于量子遗传算法&#xff0c;在众多文献均有应用。下面简述一下原理。 &#xff08;1&#xff09;量子比特编码 子遗传算法通过引入量子比特来完成基因的存储和表达。量子比特是量子信息中的概念&#xff0c;它与经典比特不同&#xff0c;是因为它可以在同一时刻处于两个状态的…

Docker安装蜜罐Hfish

前言 无意中发现公司的一台服务器被爆破&#xff0c;修改了密码&#xff0c;为了确定内网是否安装需要搭建一个蜜罐来看一下是否存在隐患。 如何安装Docker&#xff0c;请查看我另一篇文章 https://blog.csdn.net/l1677516854/article/details/136751211 一、拉取镜像 dock…

SwiftUI组件 - AsyncImage

SwiftUI组件-AsyncImage import SwiftUIstruct AsyncImageBootcamp: View {let url URL(string: "https://picsum.photos/200")var body: some View {/// Mark - iOS15 以后才有的方法ScrollView {AsyncImage(url: url, content: { returnImage inreturnImage.resiz…

鸿蒙开发实战:【音频组件】

简介 音频组件用于实现音频相关的功能&#xff0c;包括音频播放&#xff0c;录制&#xff0c;音量管理和设备管理。 图 1 音频组件架构图 基本概念 采样 采样是指将连续时域上的模拟信号按照一定的时间间隔采样&#xff0c;获取到离散时域上离散信号的过程。 采样率 采样…

【AI】创建自己的基于会话的自定义模型的ChatGPT

【AI】创建自己的基于会话的自定义模型的ChatGPT 目录 【AI】创建自己的基于会话的自定义模型的ChatGPT开篇功能设计步骤详解1. 爬取Web数据2. 拆分文档3. 创建向量嵌入4. 将向量嵌入存储在Chroma中5. 用户提出问题6. 创建提问的向量嵌入7. 语义搜索向量数据库8. 生成提示9. 提…

【AAAI 2024】解锁深度表格学习(Deep Tabular Learning)的关键:算术特征交互

近日&#xff0c;阿里云人工智能平台PAI与浙江大学吴健、应豪超老师团队合作论文《Arithmetic Feature Interaction is Necessary for Deep Tabular Learning》正式在国际人工智能顶会AAAI-2024上发表。本项工作聚焦于深度表格学习中的一个核心问题&#xff1a;在处理结构化表格…

【网络安全】 MSF提权

本文章仅用于信息安全学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若读者因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与作者无关。 环境准备&#xff1a; 名称系统位数IP攻击机Kali Linux6410.3.0.231客户端Windows 76410.3.0.234…

基于GA优化的CNN-GRU-Attention的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1卷积神经网络&#xff08;CNN&#xff09;在时间序列中的应用 4.2 长短时记忆网络&#xff08;LSTM&#xff09;处理序列依赖关系 4.3 注意力机制&#xff08;Attention&#xff09; 4…

CSS之字体镂空

方法一(有缺陷)&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>Examples</title> <style> .num1{-webkit-text-stroke: 0.4px red; }</style> </head> <body><div clas…

神策分析 Copilot 成功通过网信办算法备案,数据分析 AI 化全面落地

近日&#xff0c;神策数据严格遵循《互联网信息服务深度合成管理规定》&#xff0c;已完成智能数据问答算法备案。该算法基于大模型技术&#xff0c;专注于为客户提供数据指标查询和数据洞察方面的专业回答。 神策分析 Copilot 运用神策数据智能数据问答算法&#xff0c;聚焦分…

Spring Web MVC 入门使用

1. 什么是Spring Web MVC Spring Web MVC是基于Servlet API 构建的原始Web框架&#xff0c;从一开始就包含在Spring框架中。 Servlet 是一套Java Web 开发的规范&#xff0c;或者说是一套Java Web 开发的技术标准。只有规范并不能做任何事情&#xff0c;必须要有人去实现它&a…

ZooKeeper命令和监控详解

ZooKeeper监控命令详解 在分布式系统中&#xff0c;ZooKeeper作为一个非常重要的协调服务&#xff0c;它的健康状态直接影响到整个系统的可靠性和稳定性。因此&#xff0c;对ZooKeeper进行有效监控是非常必要的。本文将详细介绍ZooKeeper提供的命令行工具zkCli.sh&#xff0c;…

Prometheus 轻量化部署和使用

文章目录 说明Prometheus简介Grafana简介prometheus和Grafana的关系环境准备&#xff08;docker&#xff09;docker安装时间时区问题&#xff08;我的代码中&#xff09;dockers镜像加速和服务器时区设置 数据库准备(mysql、redis)mysql配置redis配置 Prometheus、grafana下载和…

Linux远程连接本地数据库(docker)

1. 安装docker 参考上一篇文章 CentOS安装Docker 2. Linux中安装Mysql 2.1 docker拉取mysql镜像 拉取镜像 docker pull mysql查看镜像列表 docker images2.2 运行mysql容器 运行一个名字为mysql的mysql容器&#xff0c;其连接端口号为3306&#xff0c;密码为123456 docker r…

H266开源视频编码器VVENC现状

VVenC 是由 Fraunhofer HHI 研究团队开发的&#xff0c;主要是视频编码系统组。HHI 是欧洲最大的研究组织 Fraunhofer 协会的成员&#xff0c;该协会是德国的一个大型非营利性组织。源代码在&#xff1a; https://github.com/fraunhoferhhi/vvenc VVenC几乎与H.266视频标准同时…

React18 后台管理模板项目:现代、高效与灵活

&#x1f389; 给大家推荐一款React18TypescriptVitezustandAntdunocss且超级好用的中后台管理框架 项目地址 码云&#xff1a;https://gitee.com/nideweixiaonuannuande/xt-admin-react18github&#xff1a;https://github.com/1245488569/xt-admin-react18 演示地址 http…

AI人工智能培训讲师ChatGPT讲师叶梓培训简历及提纲ChatGPT等AI技术在医疗领域的应用

叶梓&#xff0c;上海交通大学计算机专业博士毕业&#xff0c;高级工程师。主研方向&#xff1a;数据挖掘、机器学习、人工智能。历任国内知名上市IT企业的AI技术总监、资深技术专家&#xff0c;市级行业大数据平台技术负责人。 长期负责城市信息化智能平台的建设工作&#xff…

在react中使用tailwindcss

安装tailwind css npm i -D tailwindcssnpm:tailwindcss/postcss7-compat postcss^7 autoprefixer^9安装 CRACO 由于 Create React App 不能让您覆盖原生的 PostCSS 配置&#xff0c;所以我们还需要安装 CRACO 才能配置 Tailwind。 npm install craco/craco配置CRACO 在项目根…

uni app 打肉肉(打飞机)小游戏

都给老婆和孩子写了 合十 钓鱼了&#xff0c;给自己写个打飞机吧。没找飞机怪兽的图片。就用馒头和肉肉代替了。有问题不要私信我。自己改哈 <template><view class"page_main"><view class"contentone"><canvas class"canvas…

吴恩达机器学习笔记 二十一 迁移学习 预训练

迁移学习&#xff08;transfer learning&#xff09;&#xff1a;直接把神经网络拿来&#xff0c;前面的参数可以直接用&#xff0c;把最后一层改了。 两种训练参数的方式&#xff1a; 1.只训练输出层的参数 2.训练所有参数 当只有一个小数据集的时候&#xff0c;第一种方法…