当前位置: 首页 > news >正文

python三方库_ciscoconfparse学习笔记

文章目录

    • 介绍
    • 使用
    • 基本原理
      • 父子关系
    • 属性
      • ioscfg 获取配置信息,返回列表
      • is_config_line 判断是否是配置行
      • is_intf 判断IOSCfgLine是不是interface
      • is_subintf 判断IOSCfgLine是不是子接口
      • lineage 不知道用法
      • is_ethernet_intf 判断IOSCfgLine是否是以太网接口
      • is_loopback_intf 判断IOSCfgLine是不是loopback接口
      • intf_in_portchannel 判断接口是否在port-channel中
      • portchannel_number 返回port-channel的序号
    • 方法
      • find_objects() 检索文本
      • find_objects_w_child在父对象中检索特定文本
      • re_match 使用regex搜索IOSCfgLine文本并返回整数索引处的正则表达式组
      • re_match_iter_typed()获取配置的值
      • re_match_typed
      • re_search 使用regex搜索此IOSCfgLine的文本
      • re_search_children 使用regex搜索此子级中包含的文本
    • 实例
      • 获取所有接口(interface)
      • 获取包含特定配置的父配置
      • 将接口名称和槽位建立关联
      • 获取接口名称和接口描述
      • 获取接口名称和IPv4地址

介绍

  1. 文档
  2. github
  3. 虽然项目名称为ciscoconfparse,但可以分析华为等格式类似的设备
  4. 安装
    1. 全新安装
      pip3 install ciscoconfparse
      
    2. 升级安装
      pip3 install --upgrade ciscoconfparse
      
    3. 安装指定版本
      pip install ciscoconfparse==1.5.6
      

使用

  1. 导入库
  2. 创建对象
  3. 代码
    from ciscoconfparse import CiscoConfParse
    file1 = "/mnt/share/bak/pc1/share/IDC网络运维表格/备份文件/20210506/SW03.txt"
    cisco_cfg = CiscoConfParse(file1)
    

基本原理

父子关系

  1. 以缩进定义父子关系,
  2. 示例
    policy-map QOS_1class GOLDpriority percent 10class SILVERbandwidth 30random-detectclass default
    !
    
  3. 示例说明
    1. 第1行为父级
    2. 第2 4 7 行为第1行的子级
    3. 第3行是第2行的子级

属性

ioscfg 获取配置信息,返回列表

  1. 返回的是list类型
  2. 示例
    from ciscoconfparse import CiscoConfParse
    config = ['!','interface port-channel1',' ip address 112.54.105.38/30','!','interface Ethernet1/1',' channel-group 1 mode active',' no shutdown','interface Ethernet1/2',' no shutdown','!',]
    parse = CiscoConfParse(config)   
    cfg = parse.ioscfg
    print(type(cfg))
    print(cfg)
    
  3. 示例输出
    <class 'list'>
    ['!', 'interface port-channel1', ' ip address 112.54.105.38/30', '!', 'interface Ethernet1/1', ' channel-   group 1 mode active', ' no shutdown', 'interface Ethernet1/2', ' no shutdown', '!']
    

is_config_line 判断是否是配置行

  1. 如果是配置行返回True
  2. 如果是空行、注释行么返回False
  3. 示例
    from ciscoconfparse import CiscoConfParse
    config = ['interface Ethernet1/2',' no shutdown','!',]
    parse = CiscoConfParse(config)
    obj1 = parse.find_objects('^!')[0]
    obj2 = parse.find_objects('no shutdown')[0]
    print(obj1.is_config_line)
    print(obj2.is_config_line)
    

is_intf 判断IOSCfgLine是不是interface

  1. 返回的是布尔值
  2. 子接口也是接口
  3. 示例
    from ciscoconfparse import CiscoConfParse
    config = ['!','interface Serial1/0',' ip address 1.1.1.1 255.255.255.252','!','interface ATM2/0',' no ip address','!','interface ATM2/0.100 point-to-point',' ip address 1.1.1.5 255.255.255.252',' pvc 0/100','  vbr-nrt 704 704','!',]
    parse = CiscoConfParse(config)
    obj = parse.find_objects('^interface\sSerial')[0]
    print(obj.is_intf)
    obj = parse.find_objects('^interface\sATM')[0]
    print(obj.is_intf)
    

is_subintf 判断IOSCfgLine是不是子接口

  1. 用法同上

lineage 不知道用法

is_ethernet_intf 判断IOSCfgLine是否是以太网接口

  1. 返回布尔值
  2. 任何以太网接口(10M到10G)都被视为以太网接口
  3. 示例
    from ciscoconfparse import CiscoConfParse
    config = ['interface port-channel1',' no shutdown','!','interface Ethernet1/2',' no shutdown','!',]
    parse = CiscoConfParse(config)   
    obj1 = parse.find_objects('interface port-channel1')[0]
    obj2 = parse.find_objects('interface Ethernet1/2')[0]
    print(obj1.is_ethernet_intf  )
    print(obj2.is_ethernet_intf )
    
  4. 示例输出
    False
    True
    

is_loopback_intf 判断IOSCfgLine是不是loopback接口

  1. 判断是不是loopback接口
  2. 返回的是布尔值
  3. 示例
    from ciscoconfparse import CiscoConfParse
    config = ['!','interface FastEthernet1/0',' ip address 1.1.1.1 255.255.255.252','!','interface Loopback0',' ip address 1.1.1.5 255.255.255.255','!',]
    parse = CiscoConfParse(config)
    obj = parse.find_objects(r'^interface\sFast')[0]
    print(obj.is_loopback_intf)
    obj = parse.find_objects(r'^interface\sLoop')[0]
    print(obj.is_loopback_intf)
    

intf_in_portchannel 判断接口是否在port-channel中

  1. 返回的是布尔值,表示接口是否在port-channel中
  2. 示例
    from ciscoconfparse import CiscoConfParse
    config = ['!','interface port-channel1',' ip address 112.54.105.38/30','!','interface Ethernet1/1',' channel-group 1 mode active',' no shutdown','interface Ethernet1/2',' no shutdown','!',]
    parse = CiscoConfParse(config)   
    interface1 = parse.find_objects('^interface Ethernet1/1')
    interface2 = parse.find_objects('^interface Ethernet1/2')
    print ("interface1:",interface1[0].intf_in_portchannel)
    print ("interface2:",interface2[0].intf_in_portchannel)
    
  3. 示例输出
    interface1: True
    interface2: False
    

portchannel_number 返回port-channel的序号

  1. 返回的是int类型
  2. 如果不属于任何port-channel,则返回-1
  3. 示例
    from ciscoconfparse import CiscoConfParse
    config = ['interface port-channel1',' no shutdown','!','interface Ethernet1/1',' channel-group 2 mode active',' no shutdown','interface Ethernet1/2',' no shutdown','!',]
    parse = CiscoConfParse(config)
    obj1 = parse.find_objects('^interface Ethernet1/1')[0]
    obj2 = parse.find_objects('^interface Ethernet1/2')[0]
    print(obj1.portchannel_number)
    print(obj2.portchannel_number)
    
  4. 示例输出
    2
    -1
    

方法

find_objects() 检索文本

  1. 在对象中查找特定文本
  2. 语法
    配置对象.find_objects("文本内容(可用正则)")
    
  3. 示例
    1. 查找cisco-nxos中所有trunk组
      # 获取所有接口
      interfaces = cisco_cfg.find_objects("^interface port-channel")
      # 打印索引值为3的接口
      print(interfaces[3])
      # 打印所有接口名称
      for obj in interfaces:print(obj.text)
      

find_objects_w_child在父对象中检索特定文本

  1. 在父对象中检索特定文本
  2. 语法
    配置对象.find_objects_w_child(parentspec=r"父对象包含的文本", childspec=r"子对象中包含的文本")
    
  3. 示例,获取所有二层接口(N7K为例)
    # 获取所有二层接口
    interfaces = cisco_cfg.find_objects_w_child(parentspec=r"^interface", childspec=r"switchport")
    # 打印所有接口名称
    for obj in interfaces:print(obj.text)
    

re_match 使用regex搜索IOSCfgLine文本并返回整数索引处的正则表达式组

  1. 介绍
    1. 使用regex搜索IOSCfgLine文本并返回整数索引处的正则表达式组
  2. 语法
    re_match(regex, group=1, default='')
    
  3. 选项
    选项类型说明
    regexstr字符串或python正则表达式,应该匹配。此正则表达式应包含括号,括号用于绑定匹配组
    groupint一个整数,指定要返回的所需正则表达式组。组默认为1
    defaultstr如果不匹配,则返回默认值。默认情况下,如果不匹配,则返回空字符串。
    返回结果str正则表达式组匹配的文本;如果不匹配,则返回默认值。
  4. 示例,打印接口下的子网掩码
    from ciscoconfparse import CiscoConfParse
    config = ['!','interface Serial1/0',' ip address 1.1.1.1 255.255.255.248','!','interface Serial1/1',' ip address 1.1.1.5 255.255.255.252','!',]
    parse = CiscoConfParse(config)
    for obj in parse.find_objects(r'ip\saddress'):netmask = obj.re_match(r'1\.1\.1\.5\s(\S+)')
    print("The netmask is", netmask)
    
  5. 示例输出
    The netmask is 255.255.255.252
    

re_match_iter_typed()获取配置的值

  1. 语法
    re_match_iter_typed(regex, group=1, result_type=<class 'str'>, default='', untyped_default=False, recurse=False)
    
  2. 选项
    选项说明
    regex字符串,字符串或python正则表达式,应该匹配。此正则表达式应包含括号,括号用于绑定匹配组
    group整数,一个整数,指定要返回的所需正则表达式组。组默认为1。
    result_type类型,一种类型(通常是str、int、float或IPv4Obj中的一种)。所有返回值都转换为结果类型,默认为str
    default任意,如果不匹配,则返回默认值
    untyped_default布尔值,如果不希望键入默认值,请设置True
  3. 示例
    import re
    from ciscoconfparse import CiscoConfParse
    from ciscoconfparse.ccp_util import IPv4Obj
    config = ['!','interface Serial1/0',' ip address 1.1.1.1 255.255.255.252','!','interface Serial2/0',' ip address 1.1.1.5 255.255.255.252','!',]
    parse = CiscoConfParse(config)
    INTF_RE = re.compile(r'interface\s\S+')
    ADDR_RE = re.compile(r'ip\saddress\s(\S+\s+\S+)')
    for obj in parse.find_objects(INTF_RE):print("{} {}".format(obj.text, obj.re_match_iter_typed(ADDR_RE, result_type=IPv4Obj)))
    
  4. 示例输出
    interface Serial1/0 <IPv4Obj 1.1.1.1/30>
    interface Serial2/0 <IPv4Obj 1.1.1.5/30>
    

re_match_typed

  1. 语法
    re_match_typed(regex, group=1, untyped_default=False, result_type=<class 'str'>, default='')
    
  2. 选项
    选项类型说明
    regexstr字符串或python正则表达式,应该匹配。此正则表达式应包含括号,括号用于绑定匹配组
    groupint一个整数,指定要返回的所需正则表达式组。组默认为1。
    result_typetype一种类型(通常是str、int、float或IPv4Obj中的一种)。所有返回值都转换为结果类型,默认为str.
    defaultany如果不匹配,则返回默认值
    untyped_defaultbool如果不希望键入默认值,请设置True
    返回结果result_type正则表达式组匹配的文本;如果不匹配,则返回默认值。除非untyped\u default为True,否则所有值都转换为结果类型
  3. 示例
    1. 见实例"将接口名称和槽位建立关联"

re_search 使用regex搜索此IOSCfgLine的文本

  1. 语法
    re_search(regex, default='')
    
  2. 选项
    选项类型说明
    regexstr字符串或python正则表达式,应该匹配。
    defaultstr如果在查找regex时re\u search()未找到匹配项,则返回的值
    返回结果str匹配的IOSCfgLine文本。如果不匹配,则返回默认值
  3. 示例

re_search_children 使用regex搜索此子级中包含的文本

  1. 介绍
    1. 使用regex搜索此子级中包含的文本
  2. 语法
    re_search_children(regex, recurse=False)
    
  3. 选项
    选项类型说明
    regexstr字符串或python正则表达式
    recursebool如果要搜索所有子级(子级、孙子级、曾孙级等),请设置为True
    返回结果list匹配的IOSCfgLine对象的列表。如果没有匹配项,则返回空list()
  4. 示例
    from ciscoconfparse import CiscoConfParse
    config = ['!','interface Serial1/0',' ip address 1.1.1.1 255.255.255.252','!','interface Serial2/0',' ip address 1.1.1.5 255.255.255.252','!',]
    parse = CiscoConfParse(config)   
    interfaces = parse.re_search_children(regex=r'^interface\s(\S+)', recurse=False)
    print(interfaces)
    
  5. 示例输出
    [<IOSCfgLine # 1 'interface Serial1/0'>, <IOSCfgLine # 4 'interface Serial2/0'>]
    

实例

获取所有接口(interface)

  1. 获取的是对象
  2. 每个接口名称使用.text属性
  3. 可基于interfaces的索引获取指定接口,获取的也是对象,接口名称是"对象.text"
  4. 代码
    # 获取所有接口
    interfaces = cisco_cfg.find_objects("^interface")
    # 打印索引值为3的接口(对象),接口名使用"对象.text"
    print(interfaces[3])
    # 打印所有接口名称
    for obj in interfaces:print(obj.text)
    

获取包含特定配置的父配置

  1. 获取no shutdown的接口
  2. 方法一效率更高
    1. 方法一
      interfaces_All = cisco_cfg.find_objects(r"^interf")
      interfaces_AdminUp = list()
      for obj in interfaces_All:if obj.re_search_children(r"no shutdown"):interfaces_AdminUp.append(obj)
      print(interfaces_AdminUp)
      
    2. 方法二
      interface_NoShutdown = cisco_cfg.find_parents_w_child("^interface", "no shutdown")
      for i in interface_NoShutdown:print (i)
      

将接口名称和槽位建立关联

  1. 名称将转换为str(),槽将转换为int()
  2. 代码
    from ciscoconfparse import CiscoConfParse
    config = ['!','interface Serial1/0',' ip address 1.1.1.1 255.255.255.252','!','interface Serial2/0',' ip address 1.1.1.5 255.255.255.252','!',]
    parse = CiscoConfParse(config)   
    slots = dict()
    for obj in parse.find_objects(r'^interface'):name = obj.re_match_typed(regex=r'^interface\s(\S+)',default='UNKNOWN')slot = obj.re_match_typed(regex=r'Serial(\d+)',result_type=int,default=-1)print("Interface {0} is in slot {1}".format(name, slot))
    

获取接口名称和接口描述

  1. 代码
    parse = CiscoConfParse(file1)
    for obj in parse.find_objects_w_child(parentspec=r"^interface", childspec=r"descript"):name = obj.textdesc = obj.re_match_iter_typed(r'description\s(.*)', result_type=str)print(name,desc)
    

获取接口名称和IPv4地址

  1. 支持同一接口下有多个IPv4地址
  2. 代码
    from pathlib import Path
    from netaddr import IPNetwork
    from ciscoconfparse import CiscoConfParsefile = Path('/mnt/share/00temp/01_DongHuan/config/核心交换机.txt')
    #file = Path('/mnt/share/00temp/01_DongHuan/config/A508-xi-2.log')
    parse = CiscoConfParse(file)
    # 使用ip address 192.168.1.1/24格式的正则
    REGEX_ip1 = r'ip\s+address\s+(\S+/\d{1,2})'
    # 使用ip address 192.168.1.1 255.255.255.0格式的正则
    REGEX_ip2 = r'ip\s+address\s+(\S+[\s]\d+\S+)'
    # interface的正则
    REGEX_interface = r'^interface\s+(\S+)'
    for intf_obj in parse.find_objects(REGEX_interface):interface_name = intf_obj.text.replace('interface ','')# 每个元素为一个IP地址IPv4s = list()for child_obj in intf_obj.children:  # Iterate over intf children#print(child_obj.text)if '/' in child_obj.text:REGEX_ip = REGEX_ip1else:REGEX_ip = REGEX_ip2ipv4 = child_obj.re_match_typed(REGEX_ip)if ipv4:if " " in ipv4:ipv4 = ipv4.split()ipv4 = IPNetwork(f'{ipv4[0]}/{ipv4[1]}')IPv4s.append(str(ipv4))if IPv4s:# 显示接口有IPv4地址的接口名称,和IPv4(逗号分隔的ipv4地址)print(interface_name,','.join(IPv4s))
    

相关文章:

python三方库_ciscoconfparse学习笔记

文章目录 介绍使用基本原理父子关系 属性ioscfg 获取配置信息,返回列表is_config_line 判断是否是配置行is_intf 判断IOSCfgLine是不是interfaceis_subintf 判断IOSCfgLine是不是子接口lineage 不知道用法is_ethernet_intf 判断IOSCfgLine是否是以太网接口is_loopback_intf 判断…...

HDFS详解(Hadoop)

Hadoop 分布式文件系统&#xff08;Hadoop Distributed File System&#xff0c;HDFS&#xff09;是 Apache Hadoop 生态系统的核心组件之一&#xff0c;它是设计用于存储大规模数据集并运行在廉价硬件上的分布式文件系统。 1. 分布式存储&#xff1a; HDFS 将文件分割成若干块…...

python创建word文档并向word中写数据

一、docx库的安装方法 python创建word文档需要用到docx库&#xff0c;安装命令如下&#xff1a; pip install python-docx 注意&#xff0c;安装的是python-docx。 二、使用方法 使用方法有很多&#xff0c;这里只介绍创建文档并向文档中写入数据。 import docxmydocdocx.Do…...

MongoDB的安装配置及使用

文章目录 前言一、MongoDB的下载、安装、配置二、检验MongoDB是否安装成功三、Navicat 操作MongoDB四、创建一个集合&#xff0c;存放三个文档总结 前言 本文内容&#xff1a; &#x1f4ab; MongoDB的下载、安装、配置 &#x1f4ab; 检验MongoDB是否安装成功 ❤️ Navicat 操…...

Go学习路线

Go学习路线 文章目录 Go学习路线入门阶段一、Go基础和Goland的安装二、学习日志文件及配置文件三、学习mysql四、html&#xff0c;css&#xff0c;js快速入门五、写一个简单的前后端分离的记事本项目六、Linux快速入门七、Docker快速入门八、Git命令快速入门九、使用Docker打包…...

安全大脑与盲人摸象

21世纪是数字科技和数字经济爆发的时代&#xff0c;互联网正从网状结构向类脑模型进行进化&#xff0c;出现了结构和覆盖范围庞大&#xff0c;能够适应不同技术环境、经济场景&#xff0c;跨地域、跨行业的类脑复杂巨型系统。如腾讯、Facebook等社交网络具备的神经网络特征&…...

如何使用Git-Secrets防止将敏感信息意外上传至Git库

关于Git-Secrets Git-secrets是一款功能强大的开发安全工具&#xff0c;该工具可以防止开发人员意外将密码和其他敏感信息上传到Git库中。 Git-secrets首先会扫描提交的代码和说明&#xff0c;当与用户预先配置的正则表达式模式匹配时&#xff0c;便会阻止此次提交。该工具的优…...

Day 14 网络协议

常见网络设备&#xff1a;交换机 路由器 中继器 多协议网关&#xff08;路由器的前身&#xff09; 交换机&#xff1a;用于连接统一网络的设备&#xff0c;实现内网设备通信。 从广义上分为&#xff1a;局域网交换机&#xff0c;广域网交换机 从网络构成分为&#xff1a;接…...

msyql中SQL 错误 [1118] [42000]: Row size too large (> 8126)

场景&#xff1a; CREATE TABLE test-qd.eqtree (INSERT INTO test.eqtree (idocid VARCHAR(50) NULL,sfcode VARCHAR(50) NULL,sfname VARCHAR(50) NULL,sfengname VARCHAR(50) NULL,…… ) ENGINEInnoDB DEFAULT CHARSETutf8 COLLATEutf8_general_ci;或 alter table eqtre…...

实验六 智能手机互联网程序设计(微信程序方向)实验报告

实验目的和要求 请完成创建图片库应用&#xff0c;显示一系列预设的图片。 提供按钮来切换显示不同类别的图片。 二、实验步骤与结果&#xff08;给出对应的代码或运行结果截图&#xff09; 1.WXML <view> <button bindtap"showAll">所有图片</but…...

Linux环境下,让Jar项目多线程部署成为可能

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Linux环境下&#xff0c;让Jar项目多线程部署成为可能 前言背景介绍使用sh脚本实现使用systemd来实现使用docker-compose实现 前言 在当今互联网时代&#xff0c;应用程序的高可用性和性能是至关重要…...

k8s调度场景

15个KUBERNETES调度情景实用指南 Kubernetes调度是确保集群中的Pod在适当节点上运行的关键组件。通过灵活配置调度策略&#xff0c;可以提高资源利用率、负载平衡和高可用性。 在本文中&#xff0c;我们将深入探讨一些实际的Kubernetes调度场景&#xff0c;并提供相应的配置示…...

基于小程序实现的餐饮外卖系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…...

家居网购项目(手写分页)

文章目录 1.后台管理—分页显示1.程序框架图2.编写数据模型Page.java 3.编写dao层1.修改FurnDao增加方法 2.修改FurnDaoImpl增加方法 3.单元测试FurnDaoTest 4.编写service层1.修改FurnService增加方法 2.修改FurnServiceImpl增加方法3.单元测试FurnServiceTest 5.编写DataUtil…...

goland2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 Goland 是一款由 JetBrains 公司开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门用于 Go 语言的开发。它提供了丰富的功能和工具&#xff0c;帮助开发者更高效地编写、调试和管理 Go 语言项目。 功能特点&#x…...

35、链表-LRU缓存

思路&#xff1a; 首先要了解LRU缓存的原理&#xff0c;首先定下容量&#xff0c;每次get请求和put请求都会把当前元素放最前/后面&#xff0c;如果超过容量那么头部/尾部元素就被移除&#xff0c;所以最近最少使用的元素会被优先移除&#xff0c;保证热点数据持续存在。 不管放…...

数据结构速成--栈

由于是速成专题&#xff0c;因此内容不会十分全面&#xff0c;只会涵盖考试重点&#xff0c;各学校课程要求不同 &#xff0c;大家可以按照考纲复习&#xff0c;不全面的内容&#xff0c;可以看一下小编主页数据结构初阶的内容&#xff0c;找到对应专题详细学习一下。 目录 一…...

算法练习第15天|226.翻转二叉树

226.翻转二叉树 力扣链接https://leetcode.cn/problems/invert-binary-tree/description/ 题目描述&#xff1a; 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&am…...

C#面向对象——封装、封装案例示例

C#面向对象——封装 什么是封装? &#xff08;1&#xff09;封装是将数据和操作数据的方法&#xff08;行为&#xff09;封装在一起。 &#xff08;2&#xff09;程序中封装的体现&#xff1a;属性&#xff0c;方法&#xff0c;类&#xff0c;接口&#xff0c;命名空间&#…...

【InternLM 实战营第二期-笔记3】茴香豆:搭建你的 RAG 智能助理

书生浦语是上海人工智能实验室和商汤科技联合研发的一款大模型,很高兴能参与本次第二期训练营&#xff0c;我也将会通过笔记博客的方式记录学习的过程与遇到的问题&#xff0c;并为代码添加注释&#xff0c;希望可以帮助到你们。 记得点赞哟(๑ゝω╹๑) 茴香豆&#xff1a;搭建…...

Advanced RAG 03:运用 RAGAs 与 LlamaIndex 评估 RAG 应用

编者按&#xff1a;目前&#xff0c;检索增强生成&#xff08;Retrieval Augmented Generation&#xff0c;RAG&#xff09;技术已经广泛使用于各种大模型应用场景。然而&#xff0c;如何准确评估 RAG 系统的性能和效果&#xff0c;一直是业界和学界共同关注的重点问题。若无法…...

leetcode

找到字符串中所有字母异位词 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串&#xff08;包括相同的字符串&#xff09; 示例 1: 输入: s "…...

Unity DOTS《群体战斗弹幕游戏》核心技术分析之3D角色动画

最近DOTS发布了正式的版本, 我们来分享现在流行基于群体战斗的弹幕类游戏&#xff0c;实现的核心原理。今天给大家介绍大规模战斗群体3D角色的动画如何来实现。 DOTS 对角色动画支持的局限性 截止到Unity DOTS发布的版本1.0.16,目前还是无法很好的支持3D角色动画。在DOTS 的ba…...

react异步组件如何定义使用 标准使用方法

目录 默认导出和命名导出的格式 默认导出的组件 使用方式 命名导出的组件 使用方式 默认导出和命名导出的格式 默认导出: // person.js const person {name: Alice,age: 30 };export default person;命名导出&#xff1a; // math.js export const add (a, b) > a b; exp…...

React + Ts + Vite + Antd 项目搭建

1、创建项目 npm create vite 项目名称 选择 react 选择 typescript 关闭严格模式 建议关闭严格模式&#xff0c;因为不能自动检测副作用&#xff0c;有意双重调用。将严格模式注释即可。 2、配置sass npm install sass 更换所有后缀css为sass vite.config.ts中注册全局样式 /…...

js爬虫puppeteer库 解决网页动态渲染无法爬取

我们爬取这个网址上面的股票实时部分宇通客车(600066)_股票价格_行情_走势图—东方财富网 我们用正常的方法爬取会发现爬取不下来&#xff0c;是因为这个网页这里是实时渲染的&#xff0c;我们直接通过网址接口访问这里还没有渲染出来 于是我们可以通过下面的代码来进行爬取: …...

代码随想录:二叉树5

目录 102.二叉树的层序遍历 题目 代码&#xff08;队列实现&#xff09; 107.二叉树的层序遍历II 题目 代码 199.二叉树的右视图 题目 代码 637.二叉树的层平均值 题目 代码 102.二叉树的层序遍历 题目 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍…...

Tomcat 获取客户端真实IP X-Forwarded-For

Tomcat 获取客户端真实IP X-Forwarded-For 代码实现&#xff1a; 在Host标签下面添加代码&#xff1a; <Valve className"org.apache.catalina.valves.RemoteIpValve" remoteIpHeader"x-forwarded-for" remoteIpProxiesHeader"x-forwarded-by&q…...

记录PS学习查漏补缺

PS学习 PS学习理论快捷键抠图PS专属多软件通用快捷键 PS学习 理论 JPEG &#xff08;不带透明通道&#xff09; PNG (带透明通道) 快捷键 抠图 抠图方式 魔棒工具 反选选中区域 CtrlShiftI&#xff08;反选&#xff09; 钢笔抠图注意事项 按着Ctrl单击节点 会出现当前节…...

Kafka 架构深入探索

目录 一、Kafka 工作流程及文件存储机制 二、数据可靠性保证 三 、数据一致性问题 3.1follower 故障 3.2leader 故障 四、ack 应答机制 五、部署FilebeatKafkaELK 5.1环境准备 5.2部署ELK 5.2.1部署 Elasticsearch 软件 5.2.1.1修改elasticsearch主配置文件 5.2…...

k-means聚类算法的MATLAB实现及可视化

K-means算法是一种无监督学习算法&#xff0c;主要用于数据聚类。其工作原理基于迭代优化&#xff0c;将数据点划分为K个集群&#xff0c;使得每个数据点都属于最近的集群&#xff0c;并且每个集群的中心&#xff08;质心&#xff09;是所有属于该集群的数据点的平均值。以下是…...

Excel文件转Asc文件

单个转换 import os import pandas as pdfilename (10)result01-1.xlsx df pd.read_excel(filename) # 读取Excel文件# 将数据保存为ASC格式 asc_filename os.path.splitext(filename)[0] .asc # 获取文件名并替换扩展名 with open(asc_filename, w) as file:# 写入文件…...

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题7

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题7 信息安全管理与评估 网络系统管理 网络搭建与应用 云计算 软件测试 移动应用开发 任务书&#xff0c;赛题&#xff0c;解析等资料&#xff0c;知识点培训服务 添加博主wx&#xff1a;liuliu548…...

Webrtc 信令服务器实现

webrtc建联流程图 由上图可知&#xff0c;所谓的信令服务器其实就是将peer的offer/candidate/answer传给对端而已。这样的话实现方式就有很多种了&#xff0c;目前普遍的方式HTTP/HTTPS&#xff0c;WS/WSS。像webrtc-demo-peerconnection就是实现HTTP这种方式。本文使用WS&…...

【Blockchain】连接智能合约与现实世界的桥梁Chainlink

去中心化预言机试图实现依赖因果关系而不是个人关系的去信任和确定性结果。它以与区块链网络相同的方式实现这些结果&#xff0c;即在许多网络参与者之间分配信任。通过利用许多不同的数据源并实施不受单个实体控制的预言机系统&#xff0c;去中心化的预言机网络有可能为智能合…...

解决EasyPoi导入Excel获取不到第一列的问题

文章目录 1. 复现错误2. 分析错误2.1 导入的代码2.2 DictExcel实体类2.2 表头和标题3. 解决问题1. 复现错误 使用EasyPoi导入数据时,Excel表格如下图: 但在导入时,出现如下错误: name为英文名称,在第一列,Excel表格有值,但导入的代码中为null,就很奇怪? 2. 分析错误 …...

Vue 阶段练习:记事本

将 Vue快速入门 和 Vue 指令的学习成果应用到实际场景中&#xff08;如该练习 记事本&#xff09;&#xff0c;我们能够解决实际问题并提升对 Vue 的技能掌握。 目录 功能展示 需求分析 我的代码 案例代码 知识点总结 功能展示 需求分析 列表渲染删除功能添加功能底部统计…...

JavaScript判断受访域名,调用不同的js文件

比如&#xff1a;我有三个域名&#xff1a; ① dengoo.net ② jfzm.cc ③ ceeha.com 如果当前访问的是 dengoo.net 域名及域名下页面&#xff0c;则调用 a.js 如果当前访问的是 jfzm.cc 域名及域名下页面&#xff0c;则调用 b.js 如果当前访问的是 ceeha.com 域名及域名下…...

下载软件时的Ubuntu x86_64-v2、skylake、aarch64版本分别代表什么?

Ubuntu-x86_64-v2、Ubuntu-x86_64-skylake和Ubuntu-aarch64都是Ubuntu的不同版本或变种&#xff0c;它们之间的主要区别在于所支持的硬件架构和针对特定硬件的优化。 Ubuntu-x86_64-v2&#xff1a; 这是基于x86_64&#xff08;也称为AMD64或Intel 64&#xff09;架构的Ubuntu版…...

数字化社交的引擎:解析Facebook的影响力

Facebook&#xff0c;作为全球最大的社交媒体平台&#xff0c;已经深深地融入了我们的日常生活和文化中。它不仅仅是一个简单的社交工具&#xff0c;更是一个复杂的数字生态系统&#xff0c;影响着我们的社交模式、文化认同以及信息获取方式。在这篇文章中&#xff0c;我们将深…...

淘宝API商品详情数据在数据分析行业中具有不可忽视的重要性

淘宝商品详情数据在数据分析行业中具有不可忽视的重要性。这些数据为商家、市场分析师以及数据科学家提供了丰富的信息&#xff0c;有助于他们更深入地理解市场动态、消费者行为以及商品竞争态势。以下是淘宝商品详情数据在数据分析行业中的重要性体现&#xff1a; 请求示例&a…...

【产品】ANET智能通信管理机 物联网网关 电力监控/能耗监测/能源管理系统

产品概述 本系列智能通信管理机是一款采用嵌入式硬件计算机平台&#xff0c;具有多个下行通信接口及一个或者多个上行网络接口&#xff0c;用于将一个目标区域内所有的智能监控/保护装置的通信数据整理汇总后&#xff0c;实时上传主站系统&#xff0c;完成遥信、遥测等能源数据…...

R语言数据分析案例

在R语言中进行数据分析通常涉及数据的导入、清洗、探索、建模和可视化等步骤。以下是一个简化的案例&#xff0c;展示了如何使用R语言进行数据分析&#xff1a; 1. 数据导入 首先&#xff0c;你需要将数据导入R环境中。这可以通过多种方式完成&#xff0c;例如使用read.csv()…...

vscode debug 配置:launch.json

打开新项目左边的“运行和调试” 点击蓝色字体“创建 launch.json 文件” 选择上方“python” 选择“Python 文件 调试当前正在运行的Python文件” 配置launch.json文件内容&#xff1a; {// 使用 IntelliSense 了解相关属性// 悬停以查看现有属性的描述。// 欲了解更多信息&a…...

idea工具使用Tomcat创建jsp 部署servlet到服务器

使用tomcat创建jsp 在tomcat官网中下载对应windows版本的tomcat文件 Apache Tomcat - Welcome! 解压到系统目录中&#xff0c;记得不要有中文路径 新建一个java项目 点击右上角 点击加号 找到Tomcat Service的 Local 点击右下角的Fix一下&#xff0c;然后ok关闭 再重新打开一…...

MyBatisPlus自定义SQL

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉🍎个人主页:Leo的博客💞当前专栏: 循序渐进学SpringBoot ✨特色专栏: MySQL学习 🥭本文内容:MyBatisPlus自定义SQL 📚个人知识库: Leo知识库,欢迎大家访问 目录 1.前言☕…...

使用formio和react实现在线表单设计

formiojs 是一个开源的在线表单设计工具&#xff0c;今天看看怎样在 react js 中使用 formiojs。 首先创建一个react工程 npx create-react-app my-react-formio-app安装依赖 cd my-react-formio-app npm install formio/react npm install formio/js另外&#xff0c;考虑样…...

MySQL 基础使用

文章目录 一、Navicat 工具链接 Mysql二、数据库的使用1.常用数据类型2. 建表 create3. 删表 drop4. insert 插入数据5. select 查询数据6. update 修改数据7. delete 删除记录truncate table 删除数据 三、字段约束字段1. 主键 自增delete和truncate自增长字段的影响 2. 非空…...

✌粤嵌—2024/4/3—合并K个升序链表✌

代码实现&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* merge(struct ListNode *l1, struct ListNode *l2) {if (l1 NULL) {return l2;}if (l2 NULL) {return l1;}struct Lis…...

企业微信主体的修改方法

企业微信变更主体有什么作用&#xff1f;当我们的企业因为各种原因需要注销或已经注销&#xff0c;或者运营变更等情况&#xff0c;企业微信无法继续使用原主体继续使用时&#xff0c;可以申请企业主体变更&#xff0c;变更为新的主体。企业微信变更主体的条件有哪些&#xff1…...