性能测试:流量回放工具-GoReplay!结合一款无需CA证书即可抓取HTTPS明文的工具,简直无敌

news2024/10/18 16:35:47

性能测试:流量回放工具-GoReplay!结合一款无需CA证书即可抓取HTTPS明文的工具,简直无敌。

在这里插入图片描述

GoReplay 是一个开源网络监控工具,可以将实时 HTTP 流量捕获并重放到测试环境。

应用成熟的过程中,测试所需的工作量往往会成倍增长。针对这个问题,GoReplay 为使用者提供了重用现有通信量进行测试的简单方法。它可以在不改动产品基础结构、且不影响现有流量的情况下,对这些流量进行分析和记录,从而增强使用者对代码部署、配置和基础结构进行更改的信心。

下载及安装
下载地址:https://github.com/buger/goreplay/releases

下载后将包放到需要录制的服务,同服务器下,并解压

参数介绍

–input-raw#用来捕捉http流量,需要指定ip地址和端口
–input-file#接收流量
–output-file#保存流量的文件
–input-tcp#将多个Goreplay实例获取的流量聚集到一个Goreplay实例
–output-stdout#终端输出
–output-tcp#将获取的流量转移至另外的Goreplay实例
–output-http#流量释放的对象server,需要指定IP地址和端口
–output-file#录制流量时指定的存储文件
–http-disallow-url#不允许正则匹配的URL
–http-allow-header#允许的Header头
–http-disallow-header#不允许的Header头
–http-allow-method#允许的请求方法,传入值为GET,POST,OPTIONS等
–input-file-loop#无限循环,而不是读完这个文件就停止了
–output-http-workers#并发请求数
–stats --out-http-stats#每5秒输出一次TPS数据(查看统计信息)
–split-outputtrue#按照轮训方式分割流量
–output-http-timeout30s  #http超时30秒时间设置,默认是5秒

命令行使用

#捕捉流量,并通过终端输出,将监控8000端口上所有的流量,并通过终端stdout输出
sudo ./gor --input-raw:8000--output-stdout

#捕捉流量,并实时回放到另一台服务器的相同服务上,将8000端口的流量实时同步访问http://example:8001服务器,你在访问第一台服务器时,将看到流量以相同的顺序请求到第二台。
sudo ./gor --input-raw:8000--output-http="http://localhost:8001"

#将捕捉的流量存到文件中,并回放到其它服务器
#首先保存流量,将8000端口的流量,保存到requests.gor文件中(必须是.gor后缀,其它后缀回放时有问题)。
sudo ./gor --input-raw:8000--output-file= requests.gor
#然后回放保存的流量 将保存在request.gor中的请求,通过相同的时间顺序回放到服务器http://localhost:8001
sudo ./gor --input-file requests.gor --output-http= "http://localhost:8001"

GoReplay的限速和请求过滤
限速机制

#限制每秒的请求数
sudo ./gor --input-tcp :28020 --output-http "http://localhost:8001|10"# (每秒请求数限制10个以内)
sudo ./gor --input-raw :80 --output-tcp "http://localhost:8001|10%" # (每秒请求数限制10%以内)

#基于Header或URL的参数限制一些请求,为指定的Header或者URL的请求设定限制的百分比
sudo ./gor --input-raw :80 --output-tcp "http://localhost:8001|10%" --http-header-limiter "X-API-KEY: 10%"
sudo ./gor --input-raw :80 --output-tcp "http://localhost:8001|10%" --http-param-limiter "api_key: 10%"

请求过滤

#当需要捕捉指定路径的请求流量时,可以使用该机制,如只同步/api路径下的请求
sudo ./gor --input-raw :8080 --output-http staging.com --http-allow-url /api

Demo

#如果是性能测试,可以不考虑请求的顺序和速率,并且要求无限循环
# --input-file 从文件中获取请求数据,重放的时候 100x 倍速
# --input-file-loop 无限循环,而不是读完这个文件就停止
# --output-http 发送请求到 http://host2.com
# --output-http-workers 并发 100 发请求
# --stats --output-http-stats 每 5 秒输出一次 TPS 数据
./gor--input-file'request.gor|10000%'--input-file-loop--output-http'http://localhost:8001'--output-http-workers100--stats--output-http-stats

#抓取80端口的HTTP请求,只抓取URL是/api/v1的,并输出到终端
./gor --input-raw:80--http-allow-url'/api/v1'--output-stdout

#抓取80端口的所有请求,并保存到文件,实际会分批保存为request_0.gor,request_1.gor这种文件名
./gor --input-raw:80--output-file'request.gor'

#流量回放到多个站点(复制引流)
./gor --input-tcp:28020--output-http"http://localhost:8001"--output-http"http://localhost:8002"

#按照轮询方式分割流量(平分流量)

./gor --input-raw:80--output-http"http://localhost:8001"--output-http"http://localhost:8002"--split-outputtrue

#HTTP超时设置
./gor --input-tcp replay.local:80--output-http http://staging.com --output-http-timeout30s

#性能测试(表示放大2倍速度来回放)
./gor --input-file"requests.gor|200%"--output-http"http://localhost:8001"

#回放速率不超过10QPS(绝对值)
./gor --input-tcp:80--output-http"http://localhost:8001|10"

#回放不超过原流量的10%(百分比,这里是总流量的占比)
./gor --input-raw:80--output-tcp"http://localhost:8001|10%"

#禁止的URL正则(除/api之外的请求)
./gor --input-raw:8080--output-http"http://localhost:8001"--http-disallow-url/api

#基于方法(表示只允许GET,OPTIONS的请求)
./gor --input-raw:80--output-http"http://localhost:8001"--http-allow-method GET --http-allow-method OPTIONS

#基于请求头
./gor --input-raw:8080--output-http"http://localhost:8001"--http-allow-header api-version:^1\.0\d
./gor --input-raw:8080--output-http"http://localhost:8001"--http-disallow-header"User-Agent: Replayed by Gor"

#重写请求
./gor --input-raw:8080--output-http"http://localhost:8001"--http-rewrite-url/v1/user/([^\\/]+)/ping:/v2/user/$1/ping

#设置URL参数
./gor --input-raw:8080--output-http"http://localhost:8001"--http-set-param api_key=1

#设置HEADER
./gor --input-raw:80--output-http"http://localhost:8001"--http-header"User-Agent: Replayed by Gor"--http-header"Enable-Feature-X: true"

#导出到ES
./gor --input-raw:8000--output-http"http://localhost:8001"--output-http-elasticsearch localhost:9200/gor

#基于Header或URL参数值的一致限制
# Limit based on header value
./gor --input-raw:80--output-tcp"http://localhost:8001|10%"--http-header-limiter"X-API-KEY: 10%"
# Limit based on header value
./gor --input-raw:80--output-tcp"http://localhost:8001|10%"--http-param-limiter "api_key: 10%"

一款无需CA证书即可抓取HTTPS明文的工具,基于eBPF技术实现。

  1. eCapture的特点
    它是一款基于eBPF技术的HTTPS明文抓取工具,可用于MySQL数据库查询审计和bash命令捕获等场景,仅支持Linux和Android系统。

  2. 其他优秀的开源项目
    如Reactive-Resume,这是一款简历生成器,支持多种配置和语言,可快速生成和分享简历;还有documenso,这是一个社区驱动的文档签署工具,旨在提供透明、高效的文档签署流程;以及Flowise,这是一个可视化UI定制LLM的工具,允许用户通过拖放操作设计机器学习工作流程。

eCapture(旁观者): 基于eBPF技术实现SSL/TLS加密的明文捕获,无需CA证书。

提醒:

支持Linux系统内核x86_64 4.18及以上版本,aarch64 5.5及以上版本;
需要ROOT权限;
不支持Windows、macOS系统;


  • 介绍
  • 快速上手
    • 下载
      • ELF可执行文件
      • Docker容器镜像
    • 小试身手
    • 模块介绍
      • openssl 模块
      • gotls 模块
      • 其他模块
    • 使用演示
  • 星标成长曲线
  • 贡献
  • 编译
  • 微信公众号

介绍

eCapture的中文名字为旁观者,即「当局者迷,旁观者清」,与其本身功能旁路、观察
契合,且发音与英文有相似之处。eCapture使用eBPF Uprobe/Traffic Control技术,实现各种用户空间/内核空间的数据捕获,无需改动原程序。

快速上手

下载

ELF可执行文件

提醒

支持 Linux/Android的x86_64/aarch64 CPU架构。

下载 release 的二进制包,可直接使用。

Docker容器镜像

提醒

仅支持Linux x86_64/aarch64。

# 拉取镜像
docker pull gojue/ecapture:latest
# 运行
docker run --rm --privileged=true --net=host -v ${宿主机文件路径}:${容器内路径} gojue/ecapture ARGS

小试身手

捕获基于Openssl动态链接库加密的网络通讯。

sudo ecapture tls
2024-09-15T11:50:28Z INF AppName="eCapture(旁观者)"
2024-09-15T11:50:28Z INF HomePage=https://ecapture.cc
2024-09-15T11:50:28Z INF Repository=https://github.com/gojue/ecapture
2024-09-15T11:50:28Z INF Author="CFC4N <cfc4ncs@gmail.com>"
2024-09-15T11:50:28Z INF Description="Capturing SSL/TLS plaintext without a CA certificate using eBPF. Supported on Linux/Android kernels for amd64/arm64."
2024-09-15T11:50:28Z INF Version=linux_arm64:0.8.6-20240915-d87ae48:5.15.0-113-generic
2024-09-15T11:50:28Z INF Listen=localhost:28256
2024-09-15T11:50:28Z INF eCapture running logs logger=
2024-09-15T11:50:28Z INF the file handler that receives the captured event eventCollector=
2024-09-15T11:50:28Z WRN ========== module starting. ==========
2024-09-15T11:50:28Z INF listen=localhost:28256
2024-09-15T11:50:28Z INF https server starting...You can update the configuration file via the HTTP interface.
2024-09-15T11:50:28Z INF Kernel Info=5.15.152 Pid=233458
2024-09-15T11:50:28Z INF BTF bytecode mode: CORE. btfMode=0
2024-09-15T11:50:28Z INF master key keylogger has been set. eBPFProgramType=Text keylogger=
2024-09-15T11:50:28Z INF module initialization. isReload=false moduleName=EBPFProbeOPENSSL
2024-09-15T11:50:28Z INF Module.Run()
2024-09-15T11:50:28Z WRN OpenSSL/BoringSSL version not found from shared library file, used default version OpenSSL Version=linux_default_3_0
2024-09-15T11:50:28Z INF Hook masterKey function ElfType=2 Functions=["SSL_get_wbio","SSL_in_before","SSL_do_handshake"] binrayPath=/usr/lib/aarch64-linux-gnu/libssl.so.3
2024-09-15T11:50:28Z INF target all process.
2024-09-15T11:50:28Z INF target all users.
2024-09-15T11:50:28Z INF setupManagers eBPFProgramType=Text
2024-09-15T11:50:28Z INF BPF bytecode file is matched. bpfFileName=user/bytecode/openssl_3_0_0_kern_core.o
2024-09-15T11:50:28Z INF perfEventReader created mapSize(MB)=4
2024-09-15T11:50:28Z INF perfEventReader created mapSize(MB)=4
2024-09-15T11:50:28Z INF module started successfully. isReload=false moduleName=EBPFProbeOPENSSL
2024-09-15T11:50:31Z ??? UUID:233479_233479_curl_5_1_39.156.66.10:443, Name:HTTPRequest, Type:1, Length:73
GET / HTTP/1.1
Host: baidu.com
Accept: */*
User-Agent: curl/7.81.0


2024-09-15T11:50:32Z ??? UUID:233479_233479_curl_5_0_39.156.66.10:443, Name:HTTPResponse, Type:3, Length:357
HTTP/1.1 302 Moved Temporarily
Content-Length: 161
Connection: keep-alive
Content-Type: text/html
Date: Sun, 15 Sep 2024 11:50:30 GMT
Location: http://www.baidu.com/
Server: bfe/1.0.8.18

<html>
<head><title>302 Found</title></head>
<body bgcolor="white">
<center><h1>302 Found</h1></center>
<hr><center>bfe/1.0.8.18</center>
</body>
</html>

模块介绍

eCapture 有8个模块,分别支持openssl/gnutls/nspr/boringssl/gotls等类库的TLS/SSL加密类库的明文捕获、Bash、Mysql、PostGres软件审计。

  • bash 捕获bash命令行的输入输出
  • gnutls 捕获基于gnutls类库加密通讯的明文内容
  • gotls 捕获使用Golang语言编写的,基于内置crypt类库实现TLS/HTTPS加密通讯的明文内容
  • mysqld 捕获Mysqld的SQL查询,适用于数据库审计场景,支持Mysqld 5.6/5.7/8.0等
  • nss 捕获基于nss类库加密通讯的明文内容
  • postgres 支持postgres 10+的数据库审计,捕获查询语句
  • tls 捕获基于Openssl/Boringssl的加密通讯的明文内容,支持Openssl 1.0.x/1.1.x/3.x以及更新版本,支持BoringSSL所有发行版本

你可以通过ecapture -h来查看这些自命令列表。

openssl 模块

执行sudo ecapture -h查看详细帮助文档。

eCapture默认查找/etc/ld.so.conf文件,查找SO文件的加载目录,并查找openssl等动态链接路位置。你也可以通过--libssl
参数指定动态链接库路径。

如果目标程序使用静态编译方式,则可以直接将--libssl参数设定为该程序的路径。

openssl模块支持3种捕获模式

  • pcap/pcapng模式,将捕获的明文数据以pcap-NG格式存储。
  • keylog/key模式,保存TLS的握手密钥到文件中。
  • text模式,直接捕获明文数据,输出到指定文件中,或者打印到命令行。
Pcap 模式

支持了TLS加密的基于TCP的http 1.0/1.1/2.0应用层协议, 以及基于UDP的 http3 QUIC应用层协议。
你可以通过-m pcap-m pcapng参数来指定,需要配合--pcapfile-i参数使用。其中--pcapfile参数的默认值为ecapture_openssl.pcapng

sudo ecapture tls -m pcap -i eth0 --pcapfile=ecapture.pcapng tcp port 443
2024-09-15T06:54:12Z INF AppName="eCapture(旁观者)"
2024-09-15T06:54:12Z INF HomePage=https://ecapture.cc
2024-09-15T06:54:12Z INF Repository=https://github.com/gojue/ecapture
2024-09-15T06:54:12Z INF Author="CFC4N <cfc4ncs@gmail.com>"
2024-09-15T06:54:12Z INF Description="Capturing SSL/TLS plaintext without a CA certificate using eBPF. Supported on Linux/Android kernels for amd64/arm64."
2024-09-15T06:54:12Z INF Version=linux_arm64:0.8.6-20240915-d87ae48:5.15.0-113-generic
2024-09-15T06:54:12Z INF Listen=localhost:28256
2024-09-15T06:54:12Z INF eCapture running logs logger=
2024-09-15T06:54:12Z INF the file handler that receives the captured event eventCollector=
2024-09-15T06:54:12Z WRN ========== module starting. ==========
2024-09-15T06:54:12Z INF Kernel Info=5.15.152 Pid=230440
2024-09-15T06:54:12Z INF BTF bytecode mode: CORE. btfMode=0
2024-09-15T06:54:12Z INF listen=localhost:28256
2024-09-15T06:54:12Z INF module initialization. isReload=false moduleName=EBPFProbeOPENSSL
2024-09-15T06:54:12Z INF Module.Run()
2024-09-15T06:54:12Z INF https server starting...You can update the configuration file via the HTTP interface.
2024-09-15T06:54:12Z WRN OpenSSL/BoringSSL version not found from shared library file, used default version OpenSSL Version=linux_default_3_0
2024-09-15T06:54:12Z INF HOOK type:Openssl elf ElfType=2 IFindex=2 IFname=ens160 PcapFilter= binrayPath=/usr/lib/aarch64-linux-gnu/libssl.so.3
2024-09-15T06:54:12Z INF Hook masterKey function Functions=["SSL_get_wbio","SSL_in_before","SSL_do_handshake"]
2024-09-15T06:54:12Z INF target all process.
2024-09-15T06:54:12Z INF target all users.
2024-09-15T06:54:12Z INF setupManagers eBPFProgramType=PcapNG
2024-09-15T06:54:12Z INF BPF bytecode file is matched. bpfFileName=user/bytecode/openssl_3_0_0_kern_core.o
2024-09-15T06:54:12Z INF packets saved into pcapng file. pcapng path=/home/ecapture/ecapture.pcapng
2024-09-15T06:54:12Z INF perfEventReader created mapSize(MB)=4
2024-09-15T06:54:12Z INF perfEventReader created mapSize(MB)=4
2024-09-15T06:54:12Z INF module started successfully. isReload=false moduleName=EBPFProbeOPENSSL
2024-09-15T06:54:14Z INF packets saved into pcapng file. count=4
2024-09-15T06:54:16Z INF non-TLSv1.3 cipher suite found CLientRandom=f08e8d784962d1693c042f9fe266345507ccfaba58b823904a357f30dbfa1e71 CipherId=0
2024-09-15T06:54:16Z INF non-TLSv1.3 cipher suite found CLientRandom=f08e8d784962d1693c042f9fe266345507ccfaba58b823904a357f30dbfa1e71 CipherId=0
2024-09-15T06:54:16Z INF packets saved into pcapng file. count=183
2024-09-15T06:54:16Z INF CLIENT_RANDOM save success CLientRandom=f08e8d784962d1693c042f9fe266345507ccfaba58b823904a357f30dbfa1e71 TlsVersion=TLS1_2_VERSION bytes=176
2024-09-15T06:54:18Z INF packets saved into pcapng file. count=65
^C2024-09-15T06:54:18Z INF module close.
2024-09-15T06:54:18Z INF packets saved into pcapng file. count=3
2024-09-15T06:54:18Z INF packets saved into pcapng file. count=255
2024-09-15T06:54:18Z INF Module closed,message recived from Context
2024-09-15T06:54:18Z INF iModule module close
2024-09-15T06:54:18Z INF bye bye.

将捕获的明文数据包保存为pcapng文件,再使用Wireshark打开查看,之后就可以看到明文的网络包了。

keylog 模式

你可以通过-m keylog-m key参数来指定,需要配合--keylogfile参数使用,默认为ecapture_masterkey.log
捕获的openssl TLS的密钥Master Secret信息,将保存到--keylogfile中。你也可以同时开启tcpdump抓包,再使用Wireshark打开,设置Master Secret路径,查看明文数据包。

sudo ecapture tls -m keylog -keylogfile=openssl_keylog.log

也可以直接使用tshark软件实时解密展示。

tshark -o tls.keylog_file:ecapture_masterkey.log -Y http -T fields -e http.file_data -f "port 443" -i eth0
text 模式

sudo ecapture tls -m text 将会输出所有的明文数据包。(v0.7.0起,不再捕获SSLKEYLOG信息。)

gotls 模块

与openssl模块类似。

验证方法:
cfc4n@vm-server:~$# uname -r
4.18.0-305.3.1.el8.x86_64
cfc4n@vm-server:~$# cat /boot/config-`uname -r` | grep CONFIG_DEBUG_INFO_BTF
CONFIG_DEBUG_INFO_BTF=y
启动eCapture
sudo ecapture gotls --elfpath=/home/cfc4n/go_https_client --hex
启动该程序:

确保该程序会触发https请求。

/home/cfc4n/go_https_client
更多帮助
sudo ecapture gotls -h

其他模块

eCapture 还支持其他模块,如bashmysqlnsspostgres等,你可以通过ecapture -h查看详细帮助文档。

使用演示

介绍文章

eCapture:无需CA证书抓https明文通讯

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

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

相关文章

学习干货小白女友看完这篇文章后,面试工作和护网蓝队初级竟然秒通过!

小白女友看完这篇文章后&#xff0c;面试工作和护网蓝队初级竟然秒通过&#xff01; 前言&#xff1a;本文中涉及到的相关技术或工具仅限技术研究与讨论&#xff0c;严禁用于非法用途&#xff0c;否则产生的一切后果自行承担&#xff0c;如有侵权请联系。 还在学怎么挖通用漏…

【Linux】<互斥量>解决<抢票问题>——【多线程竞争问题】

前言 大家好吖&#xff0c;欢迎来到 YY 滴Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Lin…

Axure树形菜单展开与折叠

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;Axure树形菜单展开与折叠 主要内容&#xff1a;树形菜单制作——层级关系——隐藏与显示——值的变化——多层交互 应用场景&#xff1a;关系树、菜…

老机MicroServer Gen8再玩 OCP万兆光口+IT直通

手上有一台放了很久的GEN8微型服务器&#xff0c;放了很多年&#xff0c;具体什么时候买的我居然已经记不清了 只记得开始装修的时候搬家出去就没用了&#xff0c;结果搬出去有了第1个孩子&#xff0c;孩子小的时候也没时间折腾&#xff0c;等孩子大一点的时候&#xff0c;又有…

MongoDB查询操作

&#x1f337;启动mongo &#x1f388;启动mongo shell &#xff08;1&#xff09;在指定目录下创建mongodb文件夹、其子文件夹data、log以及文件mongodb.log cd /home/ubuntu mkdir -p mongodb/data mkdir -p mongodb/log touch mongodb/log/mongodb.log(2)先执行mongodb命…

《计算机视觉》—— 疲劳检测

文章目录 一、疲劳检测实现的思想二、代码实现 一、疲劳检测实现的思想 了解以下几篇文章有助于了解疲劳检测的方法 基于dlib库的人脸检测 https://blog.csdn.net/weixin_73504499/article/details/142977202?spm1001.2014.3001.5501 基于dlib库的人脸关键点定位 https://blo…

基于开源Jetlinks物联网平台协议包-MQTT自定义主题数据的自动回复

目录 1.根据需要自动回复某些主题 2.调用doReply方法进行自动回复 1.根据需要自动回复某些主题 根据主题判断&#xff0c;哪些主题是需要自动回复的&#xff0c;比如设备登录&#xff0c;需要自动回复。 2.调用doReply方法进行自动回复&#xff08;代码不一定全部正确&#xf…

第 5 章:vuex

1. 理解 vuex vuex 是什么&#xff1a; 概念&#xff1a;专门在 Vue 中实现集中式状态&#xff08;数据&#xff09;管理的一个 Vue 插件&#xff0c;对 vue 应用中多个组件的共享状态进行集中式的管理&#xff08;读/写&#xff09;&#xff0c;也是一种组件间通信的方式&am…

安乃达:用CRM构建从销售到管理到售后的全链路数字化运营平台

安乃达驱动技术(上海)股份有限公司((简称&#xff1a;“安乃达”,股票代码为&#xff1a;“603350”))自2011年以来&#xff0c;公司通过多年的研发与积累现有直驱轮毂电机、减速轮毂电机和中置电机三大系列产品&#xff0c;并具备与电机相匹配的控制器、传感器、仪表等电驱动成…

springboot旧物置换网站

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 系统展示 【2024最新】基于JavaSpringBootVueMySQL的&#xff0c;前后端分离。 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;…

ThinkPHP 3.2 + Nginx 页面404问题

学习公司Callout项目时&#xff0c;发现公司项目所使用的TP版本是3.2&#xff0c;所以才可以使用例如&#xff0c;C,M,A等方法 因此我用phpEnv搭建了一个项目&#xff0c;域名为thinkphp&#xff0c;所选根目录如下 我打开网页&#xff0c;访问 thinkphp/ 和 thinkphp/index.p…

ROS 的 urdf 中 link 和 joint 的子标签中 origin 的含义

主要参考文章——主要文章&#xff0c;官方关于urdf的介绍和官方文档的翻译解析 link标签里面的origin含义 link标签里面有三个主要的子标签&#xff0c;分别是visual——连杆的外观和坐标系&#xff0c;collisoin——连杆的碰撞属性和inertial——连杆的惯性设置 首先&…

C++ | AVL树

前言 本篇博客讲解c中数据结构AVL树&#xff0c;看这篇博客之前请先去看&#xff1a;C | 二叉搜索树-CSDN博客 &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-m…

2024最新:零基础到精通的大模型AI产品经理全学习路线

随着人工智能技术的发展&#xff0c;尤其是大模型&#xff08;Large Model&#xff09;的兴起&#xff0c;越来越多的企业开始重视这一领域的投入。作为大模型产品经理&#xff0c;你需要具备一系列跨学科的知识和技能&#xff0c;以便有效地推动产品的开发、优化和市场化。以下…

第51期 C语言实现中断<一>

Q&#xff1a;怎样理解用C语言实现中断的过程呢&#xff1f; A&#xff1a;以下是一段使用C语言实现中断的主程序&#xff0c;和汇编语言实现中断一样也使用了定时器中断和按键中断。执行该主程序会在DE2-115的红色LED上显示流水灯&#xff0c;按下KEY1可以改变流水灯移动的…

FreeRTOS - 任务通知

1. 任务通知 所谓"任务通知"&#xff0c;你可以反过来读"通知任务"。 我们使用队列、信号量、事件组等等方法时&#xff0c;并不知道对方是谁。使用任务通知时&#xff0c;可以明确指定&#xff1a;通知哪个任务。 使用队列、信号量、事件组时&#xff…

【DBA Part01】国产Linux上安装Oracle进行数据迁移

内容如下&#xff1a; 1.1.生产环境RHEL/OEL Linux8Oracle11gR2安装配置 1.2.国产麒麟操作系统Oracle11gR2安装配置 1.3.国产麒麟操作系统Oracle11gR2 RAC集群安装配置 1.4.Oracle11gR2迁移到国产麒麟操作系统&#xff08;单机/RAC&#xff09; 本阶段课程项目需求说明&am…

[C++刷题] 基础小知识点(1) 乘方函数pow()

乘方 pow() 该函数在math.h头文件中 例如: 求圆的面积公式 s3.14*pow(r,2); 也可用于开方 pow(4,1.0/3) 注意这里要写1.0, 不然1/30,该函数会失效 例题: #include<iostream> using namespace std; #include<math.h>) int main() {int h;int r;cin >> h &g…

c++算法第3天

本篇文章包含三道算法题&#xff0c;难度由浅入深&#xff0c;适合新手练习哟 目录 第一题 题目链接 题目解析 代码原理 代码编写 本题总结 第二题 题目链接 题目解析 代码原理 代码编写 第三题 题目链接 题目解析 代码原理 代码编写 第一题 题目链接 [NOIP2…

ai抠图软件哪个好?一些快速掌握的基本抠图技巧,学习

有谁和小编一样&#xff0c;不修图还好&#xff0c;一要修图&#xff0c;100%会踩坑&#xff01; 没错&#xff0c;就是踩了网页上各种ai抠图软件免费版广告的坑&#xff0c;抠图不干净就算了&#xff0c;还会损坏原来的图片文件就很过分&#xff01; 伤心事不再多说&#xff0…