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

性能测试学习——项目环境搭建和Jmete学习二

项目环境搭建、Jmeter学习二

  • 环境的部署
    • 虚拟机的安装
    • 虚拟机中添加项目
      • 操作步骤
  • 使用环境的注意事项
  • Jmeter的安装和简单使用
    • Jemter的使用的进阶
      • Jemter元件
    • Jmeter属性
    • 执行顺序和作用域
      • 作用域
        • 以自定义用户变量和用户参数(前置处理器)为例
        • 如何解决用户变量和线程组同级时,参数的重复调用?
        • 配置元件中的用户定义变量和前置处理中的用户参数有什么区别?
      • jemter的执行顺序
    • 配置元件——Jemter信息头管理器
    • 配置元件——jmeter设置cookies
    • 配置元件——设置HTTP请求的默认值
    • Jemte参数化
      • 自定义用户变量
      • 前置处理器——用户参数
      • Jmeter函数
        • 函数中的参数信息的引用
        • 获得属性和设置属性
        • Beanshell函数——功能能用,性能不能用
        • 计数器函数
        • CSV函数
        • 加密算法的函数
        • V函数
        • 其他函数
        • 扩展函数

  • 学习目标:
    • linux服务器搭建项目环境
    • jmeter环境搭建
  • 环境搭建方式:虚拟机+ova文件
    • ova文件:操作系统+项目依赖的环境+项目包
    • 操作系统:centos7
  • 关于环境的问题:为什么环境要搭建在本地,而不是使用云服务器
    • 如果使用云服务器,同一个时间多个人进行性能测试的话,就会出现多个人相互干扰的情况
    • 就像在企业项目中,一般不建议同时多个同事对项目进行性能测试
  • Jmeter的元件,属性,执行顺序,作用域名,函数和参数化的学习

环境的部署

虚拟机的安装

  • 直接在VMware的官网上或者商店的store中下载VMware软件,然后找一个秘钥激活即可

虚拟机中添加项目

  • 项目是已经部署好的ova文件,可以在云盘中找相应的项目文件
  • 实际工作过程中,项目已经部署到相应的服务器,就并不需要再去部署使用

操作步骤

  • 1.打开VMware虚拟机
  • 2.点击左上角文件——打开——在弹框中选择要加入的ova文件,如图
    在这里插入图片描述
    在这里插入图片描述
  • 3.设置虚拟机的名字和存放路径,名字自定义,路径自定义,最好不要存入C盘,点击【导入】即可
    在这里插入图片描述
  • 安装完成之后,虚拟机上会显示项目的基本信息,如下图
    在这里插入图片描述
  • 点击图中的编辑虚拟机的按钮,可编辑虚拟机的信息
  • 启动虚拟机,点击上图中绿色的三角按钮即可,或者如下图示
    在这里插入图片描述
  • 查看网络信息:下图中ens33中,第一行inet后面的就是网络ip地址
    在这里插入图片描述
    • 如果ifconfig查看不到网络ip,需要确认:
    • 1.安装的时候有没有启用虚拟网卡
    • 2.安装完VMware后,有没有重启电脑
  • 可以在项目中查看其apache、启动apache并查看相应日志信息
    在这里插入图片描述
  • 验证项目启动成功的方式:浏览器打开http://ip:8080/app,出现以下界面即可
    在这里插入图片描述

使用环境的注意事项

  • 首先自己的电脑需要安装VMware或者virtualbox
  • 安装虚拟机的原因,不实用云服务器?
    • 给云服务的话,多个人同时进行性能测试(都用多个并发用户数请求),就会存在相互干扰的情况
    • 相应的,在企业项目中,一般不建议同时有多个同事进行同一个服务器的性能测试
    • 在自己的电脑上,可以使用虚拟机+ova,随时随地的进行联系,没有时常限制
  • 安装VMware之后,一定要进行重启
  • 需要检查本机电脑上的“查看网络连接”中,是否存在VMent1和VMent8这两个,且是启动状态,如果没有就无法联网,如下图
    在这里插入图片描述
  • 然后打开虚拟机,打开ova的文件,导入文件时名字可以随便起,新虚拟机的默认路径不要放置在C盘(只有一个硬盘除外),
  • 导入点击确定后,可能会出现导入失败的提示,不用管,直接点击【重试】即可
    • 出现这个情况的原因,是VMware默认支持ovf的文件
  • 用VMware导入虚拟机成功之后,虚拟机的网络适配器必须用NAT,其他的任何都不行
    • NAT设置之后,虚拟机的网络和本机在一个小的局域网中
  • 打开此虚拟机,使用账号和密码登录,执行ifconfig命令就可以查看虚拟机的地址
    • 如果ip无值,就需要检查网络是否是NAT,然后检查网络信息是否可以使用
    • 如果是Vment1/Vment8 不能用,就需要重新安装虚拟机,直到网络可用为止
  • 使用终端工具连接linux服务器,为什么要使用终端工具?
    • 实际工作过程中,要用到多个窗口操作linux系统,直接在虚拟机中工作,是不可以打开多个窗口的
  • 启动项目,命令:cd /opt/apache……/bin,然后执行 sh startup.sh
  • 项目数据库是使用docker部署的,是开机自启动,可使用docker ps查看
    • 注意mysql的端口是3337,数据库的账号和密码也是
    • 数据库的账号密码:root。123456
  • 然后就可以按照接口文档来写脚本即可

Jmeter的安装和简单使用

  • 参考文章
  • Jmeter的开发,测试都是在jdk1.8上进行的,因此,做性能测试的jmeter还是要使用jdk1.8
  • jmeter的版本建议使用5.1.1版本,最新的版本可能没有部分检测工具,没那么好用
  • 在企业或者自己联系的过程中,jmeter绝对不允许被测项目的机器上的/自己用的话,就是虚拟机
  • jmeter建议不要设置环境变量,直接将bin洗面的jmeter.bat设置快捷方式放在桌面上即可
  • Jmeter中,线程组和线程的区别:线程组是Jmeter中用于性能场景设计的;线程是Jmeter中模拟多个人并发请求的,并不是同一个性质的定义
  • Jmeter中可以直接运行的语言有:java、beanshell、is、grovvy、jython(java+python的结合体,其用的python2)

Jemter的使用的进阶

  • jmeter本身对并发用户数没有限制,理论上可以无限量的并发用户数
    • 如果并发用户数比较多的时候,可以考虑分布式请求
  • http协议性能测试时,一个jmeter可能产生2000以内的并发用户数

Jemter元件

  • Jemter的组件特别多,有自行的运行规则,当前我们来学习Jemter的八大元件和八大元件的规则
  • jemter的八大元件有:
    • 取样器:jemter接口测试的核心,我们发送接口请求的配置都必须在取样器中完成;根据不同的协议来选择不同的取样器
    • 逻辑控制器:可以控制jemter其他元件的运行方式,主要有循环和if判断等
    • 监听器:用来采集取样器运行完成之后的运行结果,者说从不同的维度来展示测试结果
    • 配置元件:可以配置全局变量,即整个脚本的公共信息,CSV文件,数据库配置等,其优先级是最高的,运行脚本的时候最先被执行
    • 断言:断言运行的结果
    • 定时器:主要对各个接口请求,用来控制运行节奏的
    • 前置处理:取样器运行之前(例如发送HTTP请求之前),先运行前置处的代码(要执行的元件)
    • 后置处理:取样器运行之后(例如发送HTTP请求,并接受响应结果之后),要执行好的元件

Jmeter属性

  • jmeter属性分为系统属性和jmster属性两种
  • jmeter的系统属性,基本不变,也不需要去修改
  • jmeter的属性,又分为静态属性和动态属性
    • 静态属性,写在properties文件中的属性
    • 动态属性:运行过程中,动态设置的属性,关闭Jmeter工具的时候,会自动消失
  • 可以通过函数设置和获取,详见常见函数

执行顺序和作用域

  • 元件处理顺序:jemter的八大元件,都有自己的影响范围和执行顺序
    • Jemter时典型的树形结果,也就是父子关系
    • Jemter的作用域主要对取样器生效

作用域

  • 取样器:取样器元件不和其他元件相互作用,因此不存在作用域的问题
    • 常见的取样器:HTTP请求
  • 逻辑控制器:对逻辑控制器下的所有子元件和取样器生效
    • 常见的逻辑取样器:事务,for循环,while循环,if判断等
  • 其他六大元件:
  • 如果是取样器(接口)A的子节点,则该元件只有A取样器(接口)才能调用,A取样器(接口)后面的B接口可以引用元件执行后得到的结果变量;A取样器(接口)之前的接口不能使用
    • 例如元件在HTTP请求下方,那么元件只对HTTP请求生效
  • 如果该节点的父节点不是取样器,则对父节点以下的所有字节点生效,包括子节点的子节点,不能跨线程组
    • 例如元件的父节点是线程组,那么其作用域就是整个线程组,包括线程组中的所有取样器请求节点及其子节点
以自定义用户变量和用户参数(前置处理器)为例
  • 只有一个接口的情况下,将参数的值,用随机函数来生成,放在用户自定义变量和用户参数中
    • 在功能测试的时候,使用用户定义变量,用户参数,每运行调用1次,参数中变量的值都会变一次
    • 但是在做性能测试的时候,多并发用户数运行,用户自定义变量中,参数中变量的值不会变化,但是用户参数多线程会发生变化
  • 一个线程组下有登录+注册两个接口,对两个接口中的用户名(手机号)进行参数化,用户自定义的变量的请求情况如下:
    • 功能测试时,自定义用户变量多次请求两个接口都可以注册+登录成功(登录和注册用的一个账号,再次发起请求用户名会变化);
    • 性能测试时,自定义用户变量多次请求两个接口中,登录可成功,首次注册成功,其他注册失败(提示账号已存在)
  • 1.用户参数为注册接口的子节点时
    • 即注册和登录实时使用到的手机号码是一个,放置在用户参数中不论功能就还是性能都可以成功
    • 因为注册的时候只需要调用用户参数一次,登录的时候可以直接使用,不需要重新生成
  • 2.当用户参数的位置是线程组的子节点时(用户参数和注册接口同一级)
    • 登录和注册的时候,接口获取到的手机号码是不一样的;每次(不论功能还是性能)注册会成功,登录会提示手机号码不存在
    • 因为注册的时候,调用用户参数生成了手机号,登录的时候又调用了用户参数生成了新的手机号,因此两个手机号码会不相同
  • 3.如果将用户参数放置在登录接口的子节点
    • 注册,拿不到用户参数中的值,登录可以获取到相应的值,但是手机号码可能没有注册;性能测试和功能测试都可能不成功
    • 注册的时候,没有调用用户参数,无手机号码生成;登录的时候调用了用户参数生成手机号码,但是手机号码没有注册,因此失败
  • 用户参数(前置处理)定义的变量,不能直接跨线程组引用,但是用户定义的变量(配置元件)可以跨线程组引用
如何解决用户变量和线程组同级时,参数的重复调用?
  • 勾选用户参数详情中的“每次迭代更新”的复选框
  • 迭代:线程组下面的所有接口执行完一遍,才算一次迭代
  • 循环:某个接口重复调用n次,就是一个循环n遍
    在这里插入图片描述
配置元件中的用户定义变量和前置处理中的用户参数有什么区别?
  • 用户参数不能跨线程组被引用;用户定义变量可以
  • 用户定义的变量每次启动运行之前(接口请求之前),会调用获取一次数值,在运行过程中,不会再次调用,也就是说值永远不会变
  • 用户参数的在每次运行的时候都会动态获取值(根据其放置的位置不同,其作用域也不相同)
  • 用户定义的变量的执行顺序在用户参数之前

jemter的执行顺序

  • 按照深度便利的原则,现将每个节点下的所有元件都执行完毕,才会执行下一个
  • 统计节点的顺序,以下图为例:
  • 配置元件(用户定义的变量)、前置处理器(用户参数)、定时器、取样器(HTTP请求)、后置处理器、断言、监听器(查看结果树)
  • 同一类元件,有多个的时候,优先级是从上往下执行
  • 监听器中的查看结果树的显示顺序,根据响应的顺序来显示的,先收到先显示,和取样器的执行顺序是不一样的
  • 取样器的执行顺序:前面发起的请求收到响应之后才会发起下一个请求,这和HTTP时同步协议决定的
    • 执行顺序还有特殊规则:
      • 用户定义的变量及配置元件,会始终优先执行
      • 数据库配置元件也会始终优先执行
      • CSV配置元件
        在这里插入图片描述

配置元件——Jemter信息头管理器

  • 在互联网中,接口测试都是采用HTTP协议进行测试
  • 我们可以通过HTTP请求来设置请求方法、URL、请求体,而请求头和Cookies处理在jmeter中由单独的元件来进行处理
  • jmeter设置请求头
    • jmeter通过配置元件中的HTTP信息头管理器来添加请求头
    • 添加方法:取样器——配置元件——HTTP信息头管理器
      在这里插入图片描述
  • 这个HTTP请求头信息只放在当前的HTTP下(HTTP的子节点),只会对这一个HTTP生效;如果和HTTP请求同一个级别(线程组的子节点),就会对线程组下的所有HTTP请求生效

配置元件——jmeter设置cookies

    • jmeter有一个专门用来管理Cookies的组件,添加之后,可以实现自动保存Cookies的功能
    • 添加方法:线程组——添加——配置元件——HTTP Cookies管理器
    • 添加之后,Cookie管理器会自动变管理服务器返回的Cookies
      在这里插入图片描述
  • 设置好cookies管理器之后,如果接口返回了cookies,cookies管理器会自动引用,不需要再请求头中添加了
  • 绝大多数情况下,直接添加cookies管理器即可,不需要对这个元件做任何的改动

配置元件——设置HTTP请求的默认值

  • HTTP请求默认值
    • 作用:设置HTTP请求默认值;当HTTP取样器中没有设置某些参数的时候,就会从默认值中查找相应的信息补充
  • 优点:在进行接口测试中,大部分接口、协议、域名、端口都是一样的,因此可以将这些一样的数据设置为默认值,就不需要对每个请求设置重复的内容了
  • 添加方式:线程组——添加——配置元件——HTTP请求默认值
    在这里插入图片描述
  • 在HTTP请求默认值中设置完协议、路径和端口号等公用信息后,和HTTP默认值同等级的HTTP请求,都不需要再设置这些信息,只要关注路径、方法和参数信息即可
  • 常用于环境切换等场景

Jemte参数化

  • 参数化:用变量代替数据的过程,就是参数化,这样值就可以动态的发生变化
  • 参数化的变量名,可以包含字母、数字、下划线和大小写敏感
  • jmeter提供了很多方式来设置变量,从而替换数据实现参数话
  • 主要设置方法有:
    • 用户自定义的变量
    • 用户参数
    • CSV数据文件设置
    • Jmeter函数
  • 所有动态参数在使用的时候,引用变量的方式是:${变量名}

自定义用户变量

    • 用户自定义变量有两种方法:
      • 一种是通过测试计划面板中的用户定义的变量设置,此种方式对所有的测试计划都会生效
  • 名称遵循变量名的设置规则,不建议用中文
  • 在这里添加的用户变量是没有类型的,因此在引用的时候,json参数的值就必须加双引号,否则类型就会发生变化
    • 引用样式示例:{"mobile":"${puser}"}
      在这里插入图片描述
      • 另外一种是:线程组——添加——配置元件——用户定义变量
        在这里插入图片描述
    • 使用方式:在这里插入图片描述
    • 用户自定义参数中,不仅仅可设置变量,也可以设置请求头中的信息

前置处理器——用户参数

    • jmeter的线程就是用户,用户参数就是传递给线程的数量
    • 用户参数的作用:在变量名的情况下,可以对每个线程设置不同的变量值
    • 应用:例如需要3个不同的手机号码登录,就可以设置一个手机号码phone,然后分别设置phone不同的属性值,实现方式如下:
      • 添加用户参数:线程组——添加——前置处理器——用户参数
      • 然后在界面中设置不同的属性值
        在这里插入图片描述

Jmeter函数

  • 工作过程中,使用Jmeter函数时,尽可能的使用函数助手来生成,不要手写,因为很容易出错
  • jmeter提供了内部函数的功能,可以生成特殊的测试数据,例如时间戳、随机数等等
    • 可以理解为jmeter中已经封装好的方法,使用的时候直接使用某种方式调用即可
    • 函数就是方法,因为Jmeter是基于Java开发的,因此Jmeter就是Java方法
    • Jmeter函数,是以双下划线开头,后面跟函数名称
      • 函数名称严格来说区分大小写如果函数有参数,就需要带小括号,没有参数,就可以不要小括号
      • 多个参数之间,要使用英文的都好来隔开
  • 函数和变量引用是不同的
    • 变量引用是没有双下划线的,格式是:${变量引用名称}
  • jmeter函数用法参考【函数助手对话框】,然后利用函数助手对话框,生成函数,将数据填写到接口的请求数据中
  • 函数助手对话框的打开方法:工具——函数助手对话框
    在这里插入图片描述
    在这里插入图片描述
  • 举个例子,将生成随机数的函数,作为参数的值放在body中,就会随机生成value,可以测试随机手机号码等场景
      • 在参数中的使用方式:{"mobile":"${__property(language,,)}}"
函数中的参数信息的引用
  • 函数中传递的参数信息,可以直接从用户定义的变量中引用
  • 例如,在用户定义变量中,设置两个参数信息
  • 然后在函数助手中,使用${变量名}引用,即使生成的时候会报错,但是实际运行的时候是不会报错的
  • Jmeter工具中,变量是不能引用函数的,即${b${__Random(,)}}不会生效
  • 函数中,可以引用函数(即函数中可以调用另外一个函数,或者函数中的某个参数是一个函数)
    在这里插入图片描述
  • 变量中也不能引用变量,这个原因是:变量是内存中某个数据的存放位置,不会进行变量名内的计算,而引用变量或者引用函数,就会发生计算
获得属性和设置属性
  • ${__property(属性名称,,)}:获取Jmeter的属性
  • ${__P(属性名称,)}:获得Jmeter的属性
  • ${__setProperty(属性名称,属性值,)}:设置jmeter中的动态属性
    • 动态属性一旦设置了,只有在Jmeter工具关闭之后,属性才会消失
    • 设置属性和获取属性两个参数结合起来,可以解决jmeter用户参数不能跨线程组的问题
    • 原理:讲用户参数通过设置属性,将其设置为Jmeter的动态属性,存储在内存中, 然后在另外一个线程组中获取属性来使用
    • 跨线程使用用户参数,主要用户接口混合使用的场景
  • Jmeter中,多个线程组之间时并行执行的
    • 因此可能出现首次获取属性值的时候获取不到,因为设置属性值的线程组可能还没有设置上
    • 如果一定要首次获取到属性值,就需要在获取属性值的那个线程组中加一个延迟启动时间,等设置属性值的线程组设置完成之后再去获取
    • 如果设置属性值中的参数来自于用户自定义变量,那么后续获取到的属性值都不会的发生改变;如果来自于用户参数,这个值每次都会发生改变,除非勾选了每次迭代时调用
Beanshell函数——功能能用,性能不能用
  • Beanshell函数和Bealshell元件的区别
    • 功能测试的时候,用Jmeter写脚本可以用Beanshell的元件或者函数
      • 定时器、监听器、前置、后置、断言等都有Beanshell相关的元件
    • 但是性能测试脚本中不要使用任何Beanshell相关的元件或者函数,写脚本的话,有且仅使用jexl3或者groovy函数或者JSR223元件
      • 因为Jmeter会关注脚本本身的性能,但是Beanshell的函数或者元件,其自身的性能不是很优秀
计数器函数
  • ${__counter(,)},只能做简单的累加1的算法,可以传True或者False的参数
    • 如果传参为True,那么多线程中每个线程都有一个计数器,船False,则多线程使用同一个计数器
  • 计数器元件:路径——>添加——>配置元件——>计数器
    • 这个计数器可以灵活设置起始值、最大值、步长值等信息
    • 这个计数器元件,使用的时候是从起始值开始,依次递增步长值,添加到最大值的时候,会再次循环从起始值开始递增
CSV函数
  • ${__CSVRead(,)},用于读取CSV文件的函数
    • 尽可能不要去使用,因为比较鸡肋
  • 如果要使用,请使用CSV数据文件设置(后面有介绍)
加密算法的函数
  • ${__digest(MD5,123456,,,)}:加密算法函数
    • 只能做最简单的加密,点击函数后面的帮助,可在页面上查看支持的加密算法信息
V函数
  • 在进行函数引用的时候,可能需要将多个变量都存放在用户定义的变量或者用户参数中,但是需要在多线程的情况下,在一个接口中调用
  • 因为变量中不能引用函数(如下图),所以需要使用其他方式来进行解决
    在这里插入图片描述
  • 如果要解决这个问题,就需要使用V函数
  • V函数中有两个参数,第一个参数可以是函数,也可以是变量,还可以是元件,例如计数器,设置如下图
    在这里插入图片描述
  • 请求体中的V函数的意思是,a拼接计数1,也就是a_1
  • a_1又是用户定义变量中的变量,那就根据变量的key,获取变量的值进行替换
其他函数
  • ${__Random(0,100,)}:生成1-100之间的随机数
  • ${__dateTimeConvert(,,,)}:时间的格式转换
  • ${__machineIP()}:获取机器的IP
  • ${__machineName()}:获取机器的名称
  • ${__char(1)}:转换字符,将参数中的unicode或10进制的信息转换为字符串
  • ${__groovy(,)}${__jexl3(,)}都可以用运行自己写的代码,代码可以是java、js、grovvy、beanshell语言编写的
  • ${__RandomString(10,stringdict,)}:随机字符串
  • ${__threadNum}:获取线程号,这个函数不需要传参
  • ${__time(yyymmmddd‘,)}:获取当前时间戳,参数是格式化传参
  • ${__split(qbc\,bad,,\,)}:分隔字符串
  • ${__timeShift(,,,,)}:获取时间,可进行时间的加减
  • ${__urldecode()}:进行end解码
  • ${__urlencode()}:进行end编码
扩展函数
  • 别人写的扩展函数包;或者自己二开写的函数,集成到Jmeter中作为扩展函数

相关文章:

性能测试学习——项目环境搭建和Jmete学习二

项目环境搭建、Jmeter学习二 环境的部署虚拟机的安装虚拟机中添加项目操作步骤 使用环境的注意事项Jmeter的安装和简单使用Jemter的使用的进阶Jemter元件 Jmeter属性执行顺序和作用域作用域以自定义用户变量和用户参数(前置处理器)为例如何解决用户变量和线程组同级时&#xff…...

C++标准模板库(STL)-map介绍

C标准库中的map是一种关联容器&#xff0c;它提供了键值对的映射关系。每个键值对中的键都是唯一的&#xff0c;通过键可以访问对应的值。 map基本操作 插入元素&#xff1a; 使用insert函数插入元素&#xff0c;该函数有两种形式&#xff1a; // 插入一个pair<const Ke…...

使用docker部署ELK日志框架-Elasticsearch

一、ELK知识了解 1-ELK组件 工作原理&#xff1a; &#xff08;1&#xff09;在所有需要收集日志的服务器上部署Logstash&#xff1b;或者先将日志进行集中化管理在日志服务器上&#xff0c;在日志服务器上部署 Logstash。 &#xff08;2&#xff09;Logstash 收集日志&#…...

第7章 模式匹配与正则表达式

目录 1. 不用正则表达式来查找文本模式2. 用正则表达式来查找文本模式2.1 创建正则表达式&#xff08;Regex&#xff09;对象2.2 匹配Regex对象 3. 用正则表达式匹配更多模式3.1 利用括号分组3.2 用管道匹配多个分组3.3 用问号实现可选匹配3.4 用星号匹配零次或多次3.5 用加号匹…...

单元测试实战(三)JPA 的测试

为鼓励单元测试&#xff0c;特分门别类示例各种组件的测试代码并进行解说&#xff0c;供开发人员参考。 本文中的测试均基于JUnit5。 单元测试实战&#xff08;一&#xff09;Controller 的测试 单元测试实战&#xff08;二&#xff09;Service 的测试 单元测试实战&am…...

初刷leetcode题目(3)——数据结构与算法

&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️…...

76基于matlab的免疫算法求解配送中心选址问题,根据配送地址确定最佳配送中心地址位置。

基于matlab的免疫算法求解配送中心选址问题&#xff0c;根据配送地址确定最佳配送中心地址位置。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 76matlab免疫算法配送中心选址 (xiaohongshu.com)...

C++二分查找算法:找到 Alice 和 Bob 可以相遇的建筑

本文涉及的基础知识点 二分查找算法合集 离线查询 题目 给你一个下标从 0 开始的正整数数组 heights &#xff0c;其中 heights[i] 表示第 i 栋建筑的高度。 如果一个人在建筑 i &#xff0c;且存在 i < j 的建筑 j 满足 heights[i] < heights[j] &#xff0c;那么这个…...

建立跨层全栈的区块链安全保障系统-应用层,系统层,设施层

目录 建立跨层全栈的区块链安全保障系统 应用层 系统层 设施层...

程序员告诉你:人工智能是什么?

随着科技的快速发展&#xff0c;人工智能这个词汇已经逐渐融入了我们的日常生活。然而&#xff0c;对于大多数人来说&#xff0c;人工智能仍然是一个相对模糊的概念。 首先&#xff0c;让我们从人工智能的定义开始。人工智能是一种模拟人类智能的技术&#xff0c;它涵盖了多个领…...

飞书开发学习笔记(七)-添加机器人及发送webhook消息

飞书开发学习笔记(七)-添加机器人及发送webhook消息 一.添加飞书机器人 1.1 添加飞书机器人过程 在群的右上角点击折叠按键…选择 设置 群机器人中选择 添加机器人 选择自定义机器人&#xff0c;通过webhook发送消息 弹出的信息中有webhook地址&#xff0c;选择复制。 安…...

C/C++统计数 2021年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C统计数 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C统计数 2021年12月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 给定一个数的序列S&#xff0c;以及一个区间[L, R], 求序列…...

从一到无穷大 #19 TagTree,倒排索引入手是否是优化时序数据库查询的通用方案?

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 文章目录 文章主旨时序数据库查询的一般流程扫描维度聚合时间聚合管控语句 TagTree整体结构索引…...

程序员带你入门人工智能

随着人工智能技术的飞速发展&#xff0c;越来越多的程序员开始关注并学习人工智能。作为程序员&#xff0c;我们可能会对如何开始了解人工智能感到困惑。今天&#xff0c;我将向大家介绍一些如何通过自学了解人工智能的经验和方法&#xff0c;帮助大家更好地入门这个充满挑战和…...

机器学习笔记 - 了解常见开源文本识别数据集以及了解如何创建用于文本识别的合成数据

一、部分开源数据集 以下是一些英文可用的开源文本识别数据集。 ICDAR 数据集:ICDAR 代表国际文档分析和识别会议。该活动每两年举行一次。他们带来了一系列塑造了研究社区的场景文本数据集。例如, ICDAR-2013和ICDAR-2015数据集。 MJSynth 数据集:该合成词数据集由牛津大…...

openssl开发详解

文章目录 一、openssl 开发环境二、openssl随机数生成三、openssl对称加密3.1 SM43.2 AES3.3 DES3.4 3DES 四、openssl非对称加密4.1 SM24.2 RSA4.3 ECC 五、openssl的hash5.1 SM35.2 md55.3 sha256 五、证书5.1 证书格式 六、openssl网络编程七、openssl调试FIDO流程 一、open…...

conda虚拟环境中安装的cuda和服务器上安装的cuda的异同

服务器上已安装Nvidia提供的cuda&#xff0c;nvcc -V时会出现已安装的CUDA版本。如下图所示&#xff0c;服务器上已安装好的cuda版本为10.1。 但是当我们在Anaconda虚拟环境下安装pytorch或者paddlepaddle等深度学习框架的GPU版本时&#xff0c;通常会选择较高版本的cuda&…...

股东入股可用的出资形式主要有哪些

股东入股&#xff0c;可用的出资形式主要包括货币以及实物、知识产权、土地使用权等可以用货币估价并可以依法转让的非货币财产。 第一&#xff0c;货币。设立公司必然需要一定数量的流动资金。以支付创建公司时的开支和启动公司运营。因此&#xff0c;股东可以用货币出资。 第…...

react中设置activeClassName的笔记

React是一种流行的JavaScript库&#xff0c;用于构建动态用户界面。它具有许多有用的组件&#xff0c;其中之一是NavLink组件。NavLink组件用于在React应用程序中创建链接&#xff0c;并且它具有许多有用的属性&#xff0c;例如选中的样式设置。 react-router-dom": “^6…...

JS原型对象prototype

让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

flow_controllers

关键点&#xff1a; 流控制器类型&#xff1a; 同步&#xff08;Sync&#xff09;&#xff1a;发布操作会阻塞&#xff0c;直到数据被确认发送。异步&#xff08;Async&#xff09;&#xff1a;发布操作非阻塞&#xff0c;数据发送由后台线程处理。纯同步&#xff08;PureSync…...