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

Fabric初体验(踩坑笔记)

搭建fabric部署合约学习笔记

  • 环境准备
    • CURl
    • 安装docker
  • 参照官网文档实现(2025.05.19)
  • 根据前言交代的文章去尝试(失败版)
    • 安装fabric-samples
      • 安装指定2.2.0版本Fabric二进制文件和配置文件
        • 直接手动下载(不建议)
        • 重新拉取fabric二进制文件并安装docker镜像
    • 使用官方文档搭建
      • 安装fabric镜像失败443错
        • 尝试解决办法
    • 理论知识补充
      • channel

写在前面,本文很多一部分是参照这个教程去实现的(原作者文章如截图),同时结合fabric官方文档去实践。
在这里插入图片描述

环境准备

使用的centos7.9系统,选择该系统是因为听说生产环境多是这个环境,当然开发环境好像更多的用Ubuntu,无所谓啦最主要的是我的centos装了不少的环境了,不想重复了。。。已有的环境安装部署我就省略了。

CURl

安装curl

sudo yum install curl

安装docker

安装 Docker 所需的依赖包:

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

添加 Docker 仓库
将 Docker 官方仓库添加到系统中:

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

安装docker-ce即docker社区版
安装 Docker Engine
安装 Docker Engine、CLI 和相关组件:

sudo yum install -y docker-ce docker-ce-cli containerd.io

启动 Docker 服务
启动 Docker 服务并设置开机自启:

sudo systemctl start docker
sudo systemctl enable docker

不是说现在新版的docker集成了docker-compose的吗,现在查询版本又有问题?
因为新版的docker集成docker-compose到docker-cli后,命令变成docker version,docker compose version了。不加-了

[root@localhost test-network]# docker-compose --version
bash: docker-compose: 未找到命令...
[root@localhost test-network]# 
[root@localhost test-network]# mkdir -p ~/.docker/cli-plugins
[root@localhost test-network]# curl -SL https://github.com/docker/compose/releases/download/v2.36.0/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose% Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
100 70.3M  100 70.3M    0     0  8712k      0  0:00:08  0:00:08 --:--:-- 10.8M
[root@localhost test-network]# chmod +x ~/.docker/cli-plugins/docker-compose
[root@localhost test-network]# docker compose version
Docker Compose version v2.36.0
[root@localhost test-network]# sudo systemctl start docker  #重启docker
[root@localhost test-network]# sudo systemctl enable docker   #设置系统开机docker自启动
[root@localhost test-network]# sudo gpasswd -a $USER docker   #将当前用户加入docker组,确保当前用户命令下可执行
正在将用户“root”加入到“docker”组中
[root@localhost test-network]# newgrp docker   #更新用户组
[root@localhost test-network]# docker info     #查看docker配置信息

验证安装
运行以下命令,确认 Docker 是否安装成功:

sudo docker run hello-world

添加阿里云镜像加速
​1.登录阿里云控制台​​
访问阿里云容器镜像服务控制台,使用账号密码或扫码登录
2导航至镜像加速器页面​​
在控制台左侧菜单栏选择「镜像工具」→「镜像加速器」,进入加速器配置界面https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
3复制加速器地址​​
找到CentOS系统对应的加速器地址(格式如https://xxxxxx.mirror.aliyuncs.com),注意该地址是账号专属的
进入阿里云镜像加速如图。网上那些教程乱七八糟的说不明白,直接看官网的教程执行就可以了。
在这里插入图片描述

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://自己的地址码.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

收集的一些镜像源地址

{"registry-mirrors": ["https://自己的阿里云加速地址.mirror.aliyuncs.com","https://registry.docker-cn.com","https://alzgoonw.mirror.aliyuncs.com","https://docker.m.daocloud.io","https://dockerhub.icu","https://docker.anyhub.us.kg","https://docker.1panel.live"]
}~         

最新版docker无需安装docker-compose
现在的docker直接集成了docker-compose的功能,不需要再额外安装docker-compose
但是旧版的fabric写的搭建测试网络的脚本里面,命令用的是docker-compose,你需要去配置docker的命令和更改脚本源码。

[root@localhost ~]# docker --version
Docker version 26.1.4, build 5650f9b
[root@localhost ~]# docker compose version
Docker Compose version v2.27.1

参照官网文档实现(2025.05.19)

fabric官方文档地址:https://hyperledger-fabric.readthedocs.io/zh-cn/latest/getting_started.html
当然出问题比较多的就是2和3啦
在这里插入图片描述
前言
煮波的环境是26.1版docker,用的centos7.9,1.22.2版的go,装的是2.4版的fabric(官网现在默认是2.5.12)
建议:如果想自己安装需要的版本的话,最好还是去查一下,或者AI问一下适配哪个版本的fabric,不然很难受的。2.5以上的fabric是用docker compose,2.4及其以下的使用的docker-compose,新版的fabric会造成无法发现老板docker命令docker-compose的现象。
进入 no title
去下载fabric的安装脚本,这个脚本比较省事,拉下来直接执行就会自动给你装什么二进制文件、docker镜像环境什么的了
1.如官网所说,先建一个目录去搭建你的fabric项目
前面说的一堆都没用,都是告诉你要装什么二进制、镜像啥的,实际上都写进安装脚本了,不用管
例如煮波的目录是这样的:/opt/go/src/github.com/hyperledger/
2.拉安装脚本
cd到hyperledger目录下执行安装脚本拉取命令

curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/release-2.4/scripts/bootstrap.sh -o bootstrap.sh

3.执行安装脚本
这个命令表示安装2.4.4版本的fabric,二进制文件。binary镜像、samples都默认他给你一起装好

./bootstrap.sh 2.4.4

如果想自己装,就做减法
如:./bootstrap.sh 2.4.4 -d。不用docker镜像自己去找过来(新手不建议)
安装完以后,这个时候其实就可以直接执行脚本了,就在执行脚本fabric-samples>test-network>下面的network.sh脚本。./network.sh up,同理down命令就是停止。

4.修改执行脚本
如前面所说,我的版本是2.4版本的fabric,无法找到docker-compose命令。
于是需要修改一下执行脚本fabric-samples>test-network>下面的network.sh脚本
不懂的话,建议把脚本用编译器打开复制一下丢给AI,告诉AI什么问题让他改。
先改一下docker

  1. ​​创建全局符号链接​​(推荐方案)
 # 将docker compose映射为docker-compose命令
sudo ln -s /usr/bin/docker /usr/local/bin/docker-compose
# 验证映射关系
ls -l /usr/local/bin/docker-compose | grep '-> /usr/bin/docker'
  1. 环境变量别名配置
# 在用户环境配置文件(.bashrc/.zshrc)中添加
echo 'alias docker-compose="docker compose"' >> ~/.bashrc
source ~/.bashrc

验证:执行alias docker-compose应显示alias docker-compose=‘docker compose’

  1. network.sh脚本修改docker-compsoe相关
# 修改变量定义  主要是这个!!!
- : ${CONTAINER_CLI_COMPOSE:="${CONTAINER_CLI}-compose"}  修改前
+ : ${CONTAINER_CLI_COMPOSE:="${CONTAINER_CLI} compose"} 修改后# 添加项目名变量(可选)
+ : ${COMPOSE_PROJECT_NAME:="fabric-test-net"}# 清理容器逻辑调整
- ${CONTAINER_CLI} rm -f $(${CONTAINER_CLI} ps -aq --filter label=service=hyperledger-fabric) 2>/dev/null || true
+ ${CONTAINER_CLI} rm -f $(${CONTAINER_CLI} ps -aq --filter label=com.docker.compose.project=${COMPOSE_PROJECT_NAME}) 2>/dev/null || true

最终执行./network.sh up就会成功啦
在这里插入图片描述

根据前言交代的文章去尝试(失败版)

安装fabric-samples

测试fabric网络环境(参照官网的步骤https://hyperledger-fabric.readthedocs.io/zh-cn/latest/install.html)
找一下go的项目路径

echo $GOPATH  #看go的项目默认路径env | grep -i go #查看go的全部环境变量

克隆 hyperledger/fabric-samples 仓库

mkdir -p $GOPATH/src/github.com/hyperledger  #创建hyperledger文件夹(-p意为父目录不存在则自动创建)
#$GOPATH/src/github.com/  这个目录是go开发的项目惯用路径
[root@localhost ~]# cd $GOPATH/src/github.com/hyperledger
[root@localhost hyperledger]# git clone https://github.com/hyperledger/fabric-samples.git
正克隆到 'fabric-samples'...
remote: Enumerating objects: 14783, done.
remote: Counting objects: 100% (259/259), done.
remote: Compressing objects: 100% (172/172), done.
remote: Total 14783 (delta 142), reused 87 (delta 87), pack-reused 14524 (from 3)
接收对象中: 100% (14783/14783), 23.74 MiB | 1.96 MiB/s, done.
处理 delta 中: 100% (8097/8097), done.
[root@localhost hyperledger]# cd fabric-samples  
[root@localhost fabric-samples]# git checkout release-2.2  
分支 release-2.2 设置为跟踪来自 origin 的远程分支 release-2.2。根据版本选择
切换到一个新分支 'release-2.2'
[root@localhost fabric-samples]# git branch  #查看当前版本main
* release-2.2

安装指定2.2.0版本Fabric二进制文件和配置文件

根据官网要求是要安装到fabric-samples 下的 /bin和 /config 目录中,并下载指定版本的 Hyperledger Fabric docker 镜像。安装这个版本的话443是很常见,甚至我一直都没弄好,最后放弃了这个版本。

#如果你想要最新的生产发布版本,忽略所有的版本标识符。
# curl -sSL https://bit.ly/2ysbOFE | bash -s
# curl -sSL https://bit.ly/2ysbOFE | bash -s -- <fabric_version> <fabric-ca_version> <thirdparty_version>
# 若报错详见文末附加问题2
curl -sSL https://bit.ly/2ysbOFE | bash -s -- 2.2.0 1.4.7 0.4.18
# 若不行试试下面这个
curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh | bash -s  2.2.0 1.4.7 0.4.18

在这里插入图片描述

直接手动下载(不建议)

不建议这么做,反正我是失败了。可参考的文章也不多,而且你不知道他这个脚本会给你配置些什么东西,很容易整错。反复多下载几次,但是对于2.2.0这些个旧版的,确实不好下载,我是没有下载好过。
我未能如教程所示去下载安装相关的配置。于是直接去GitHub下载对应的fabric二进制文件传到了centos当中。GitHub地址如下:https://github.com/hyperledger/fabric/releases/tag/v2.2.0
下载这个:

hyperledger-fabric-linux-amd64-2.2.0.tar.gz

在Windows解压后用远程工具拖进了这个目录中:/opt/go/src/github.com/hyperledger/fabric-samples/
在这里插入图片描述

拖进去以后验证一下

peer version
orderer version
cd chaincode-go
sudo vi go.mod
# 进入文件发现是1.14 自己把改成1.13 ,要与你下载的go版本匹配

环境变量设置
环境变量的设置哪个版本什么的都一样,重要的是找到你的bin文件所在,添加保存进去就好了

vi ~/.bashrc
# 添加下面的变量
export PATH=$PATH:$GOPATH/src/github.com/hyperledger/fabric-samples/bin
# 使之生效
source ~/.bashrc
# 检验成功否
fabric-ca-client version

示例:

[root@localhost asset-transfer-basic]# vi ~/.bashrc
[root@localhost asset-transfer-basic]# source ~/.bashrc
[root@localhost asset-transfer-basic]# fabric-ca-client version
fabric-ca-client:Version: 1.4.7Go version: go1.13.9OS/Arch: linux/amd64
重新拉取fabric二进制文件并安装docker镜像

(莫名其妙,白天一直下不来,大半夜一次就下好了,纯运气)
记录一下下载的过程。


[root@localhost bin]# cd ..
[root@localhost fabric-samples]# curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/main/scripts/install-fabric.sh -o install-fabric.sh
[root@localhost fabric-samples]# chmod +x install-fabric.sh
[root@localhost fabric-samples]# ./install-fabric.sh dockerPull Hyperledger Fabric docker imagesFABRIC_IMAGES: peer orderer ccenv baseos
===> Pulling fabric Images
====>  ghcr.io/hyperledger/fabric-peer:2.5.12
2.5.12: Pulling from hyperledger/fabric-peer
9cb31e2e37ea: Pull complete 
db23127575f9: Pull complete 
ab49923c0970: Pull complete 
8b1c4d4ea1b4: Pull complete 
d8dbf9e3c4ef: Pull complete 
ee3e31e4b37b: Pull complete 
Digest: sha256:f5f3fb3b061a067df0d13ed109fe1109cc9cbf02207936438435fcf431a11440
Status: Downloaded newer image for ghcr.io/hyperledger/fabric-peer:2.5.12
ghcr.io/hyperledger/fabric-peer:2.5.12
====>  ghcr.io/hyperledger/fabric-orderer:2.5.12
2.5.12: Pulling from hyperledger/fabric-orderer
9cb31e2e37ea: Already exists 
904f7cf7cc46: Pull complete 
5a2ed0dfe063: Pull complete 
eeedc9027925: Pull complete 
92d83fce7ae2: Pull complete 
ea198b0fa631: Pull complete 
Digest: sha256:5a91a378ed13de92d1566781dede60baaca42265076f96b5921ad03b25184c6a
Status: Downloaded newer image for ghcr.io/hyperledger/fabric-orderer:2.5.12
ghcr.io/hyperledger/fabric-orderer:2.5.12
====>  ghcr.io/hyperledger/fabric-ccenv:2.5.12
2.5.12: Pulling from hyperledger/fabric-ccenv
9cb31e2e37ea: Already exists 
402cfb9ba580: Pull complete 
6b3d92f86452: Pull complete 
a650c2728f06: Pull complete 
1f31c61b2127: Pull complete 
fc2f70f80fa1: Pull complete 
6f72b6cc2521: Pull complete 
Digest: sha256:72bda013702ad5a4103c00e6b58617110da69c496b60993e35c9d9e09c1a338e
Status: Downloaded newer image for ghcr.io/hyperledger/fabric-ccenv:2.5.12
ghcr.io/hyperledger/fabric-ccenv:2.5.12
====>  ghcr.io/hyperledger/fabric-baseos:2.5.12
2.5.12: Pulling from hyperledger/fabric-baseos
9cb31e2e37ea: Already exists 
ed2e4dedd96b: Pull complete 
dadd0deeae37: Pull complete 
9e9ec9334ad1: Pull complete 
Digest: sha256:f0dab8b4acd484e35c2303593c6ce850e3d000b77d86b25d2116cbcb67f8b6ff
Status: Downloaded newer image for ghcr.io/hyperledger/fabric-baseos:2.5.12
ghcr.io/hyperledger/fabric-baseos:2.5.12
===> Pulling fabric ca Image
====>  ghcr.io/hyperledger/fabric-ca:1.5.15
1.5.15: Pulling from hyperledger/fabric-ca
9cb31e2e37ea: Already exists 
4c80c17dd71c: Pull complete 
dbbb11f20e2d: Pull complete 
943126a1b0fb: Pull complete 
Digest: sha256:4704861f82be659372510b72c1e8b141563743e1f5840d8c094ded1df9253c68
Status: Downloaded newer image for ghcr.io/hyperledger/fabric-ca:1.5.15
ghcr.io/hyperledger/fabric-ca:1.5.15
===> List out hyperledger images
ghcr.io/hyperledger/fabric-peer      2.5.12    63a9820373a4   2 months ago   151MB
hyperledger/fabric-peer              2.5       63a9820373a4   2 months ago   151MB
hyperledger/fabric-peer              2.5.12    63a9820373a4   2 months ago   151MB
hyperledger/fabric-peer              latest    63a9820373a4   2 months ago   151MB
hyperledger/fabric-orderer           2.5       d69cac8bbe84   2 months ago   118MB
hyperledger/fabric-orderer           2.5.12    d69cac8bbe84   2 months ago   118MB
hyperledger/fabric-orderer           latest    d69cac8bbe84   2 months ago   118MB
ghcr.io/hyperledger/fabric-orderer   2.5.12    d69cac8bbe84   2 months ago   118MB
hyperledger/fabric-ccenv             2.5       a39804456867   2 months ago   676MB
hyperledger/fabric-ccenv             2.5.12    a39804456867   2 months ago   676MB
hyperledger/fabric-ccenv             latest    a39804456867   2 months ago   676MB
ghcr.io/hyperledger/fabric-ccenv     2.5.12    a39804456867   2 months ago   676MB
hyperledger/fabric-baseos            2.5       32d16a66e457   2 months ago   142MB
hyperledger/fabric-baseos            2.5.12    32d16a66e457   2 months ago   142MB
hyperledger/fabric-baseos            latest    32d16a66e457   2 months ago   142MB
ghcr.io/hyperledger/fabric-baseos    2.5.12    32d16a66e457   2 months ago   142MB
hyperledger/fabric-ca                1.5       03492c5437b1   3 months ago   225MB
hyperledger/fabric-ca                1.5.15    03492c5437b1   3 months ago   225MB
hyperledger/fabric-ca                latest    03492c5437b1   3 months ago   225MB
ghcr.io/hyperledger/fabric-ca        1.5.15    03492c5437b1   3 months ago   225MB
[root@localhost fabric-samples]# 

配置docker镜像源

sudo vi /etc/docker/daemon.json
#把以下代码加进去
{
"registry-mirrors":["https://registry.docker-cn.com"]
}

查看运行的docker镜像有哪些

docker images | grep hyperledger

使用官方文档搭建

如果你不指定任何组件和版本,脚本将使用默认版本安装所有组件:./install-fabric.sh

安装fabric镜像失败443错

默认安装官方二进制文件和镜像

显然又报错下不下来:1.5.15 fabric-ca-client binary is not available to download

curl: (35) TCP connection reset by peergzip: stdin: unexpected end of file
tar: Child returned status 1
tar: Error is not recoverable: exiting now
==> There was an error downloading the binary file.------> 1.5.15 fabric-ca-client binary is not available to download  (Available from 1.1.0-rc1) <----
Downloading version 2.5.12 platform specific fabric binaries
Failed connect to github.com:443; 拒绝连接
[root@localhost hyperledger]# ./install-fabric.sh docker samples binaryClone hyperledger/fabric-samples repo===> Changing directory to fabric-samples
fabric-samples v2.5.12 does not exist, defaulting to main. fabric-samples main branch is intended to work with recent versions of fabric.Pull Hyperledger Fabric binaries===> Downloading version 2.5.12 platform specific fabric binaries
===> Downloading:  https://github.com/hyperledger/fabric/releases/download/v2.5.12/hyperledger-fabric-linux-amd64-2.5.12.tar.gz
===> Will unpack to: /opt/go/src/github.com/hyperledger/fabric-samples% Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed0     0    0     0    0     0      0      0 --:--:--  0:00:21 --:--:--     0curl: (7) Failed connect to github.com:443; 拒绝连接gzip: stdin: unexpected end of file
tar: Child returned status 1
tar: Error is not recoverable: exiting now
==> There was an error downloading the binary file.------> 2.5.12 platform specific fabric binary is not available to download <----
尝试解决办法

加DNS路径
有时 DNS 解析失败也会导致类似错误。尝试直接使用 GitHub 的 IP 地址进行访问,或者更换 DNS 服务器(比如 Google 的公共 DNS:8.8.8.8 和 8.8.4.4):
sudo vi /etc/resolv.conf

# 添加如下行:nameserver 8.8.8.8nameserver 8.8.4.4
sudo systemctl restart network

重新再试了一遍,woc这是成了吗
@root hyperledger>./install-fabric.sh
在这里插入图片描述
还是老毛病啊
这里跑不通并不是真的没有下载安装二进制的文件和镜像。实际上都装好了,你也可以自己看一下自己的fabric目录。比如我的是/opt/go/src/github.com/hyperledger/fabric-samples/这个路径下有bin(存放peer oderer等文件)和config文件夹。此外这里这两份文件,也会在全局备一份比如我的在/usr/local/bin (其实似乎删了也没啥影响,至少我是这样的)。应该是最新版的有点问题不稳定吧,我也不懂,反正一直是这个问题,配置环境变量换DNS路径等等都做不好。

[root@localhost test-network]# ls
addOrg3  bft-config  CHAINCODE_AS_A_SERVICE_TUTORIAL.md  compose  configtx  monitordocker.sh  network.config  network.sh  organizations  prometheus-grafana  README.md  scripts  setOrgEnv.sh  system-genesis-block
[root@localhost test-network]# ./network.sh up
Using docker and docker compose
Starting nodes with CLI timeout of '5' tries and CLI delay of '3' seconds and using database 'leveldb' with crypto from 'cryptogen'
`·Peer binary and configuration files not found..`Follow the instructions in the Fabric docs to install the Fabric Binaries:
https://hyperledger-fabric.readthedocs.io/en/latest/install.html

理论知识补充

channel

在如fabric这般的联盟链当中,账本的组织方式和数据隔离机制是通过“通道”(Channel)来实现的。也就是说不存在“整个区块链系统的账本”,因为账本是按照通道来划分的。整个区块链系统更像是一个容器,包含了多个通道及其对应的账本。
在联盟链当中,区块链系统可以看成一个底层的容器,提供基础的设施和服务,比如共识机制等。
具体的账本和数据则是在channel当中实现
而一个联盟链当中存在着多个channel,他们之间互不干扰、互相隔离。比如A、B、C三个企业组成的联盟链当中,A、B之间的channelA和B、C之间的channelB是并存且互相隔离的。保证了组织之间的灵活的记账方式。

相关文章:

Fabric初体验(踩坑笔记)

搭建fabric部署合约学习笔记 环境准备CURl安装docker 参照官网文档实现&#xff08;2025.05.19&#xff09;根据前言交代的文章去尝试&#xff08;失败版&#xff09;安装fabric-samples安装指定2.2.0版本Fabric二进制文件和配置文件直接手动下载&#xff08;不建议&#xff09…...

区块链blog2_中心化与效率

&#x1f33f;中心化出现原因 信息/服务分散在各处会浪费时间且不方便使用&#xff0c;由此&#xff0c;把信息/服务集中在一起&#xff0c;便于管理&#xff0c;避免了不必要的效率损失。 即集中资源&#xff0c;使得对信息处理的全过程效率升高。中心化不是网络中产生的&…...

2024年ASOC SCI2区TOP,多机制群优化算法+多风场输电线路巡检中多无人机任务分配与路径规划,深度解析+性能实测

目录 1.摘要2.考虑风场影响的多无人机任务分配3.基于双向蚁群和离散蜜獾算法求解多无人机任务分配问题(BACOHBA)4.考虑风场的多无人机路径规划5.结果展示6.参考文献7.代码获取8.读者交流 1.摘要 随着电力系统规模的不断扩大&#xff0c;复杂环境下的电力线路及设施的巡检与维护…...

智慧赋能光伏运维——无人机巡检+地面监控双链路覆盖,打造光伏电站管理新标杆

一、引言&#xff1a;光伏电站运维的挑战与机遇 在全球能源转型浪潮下&#xff0c;光伏电站作为清洁能源的重要载体&#xff0c;其高效运维管理成为行业核心命题。然而&#xff0c;传统光伏电站运维存在覆盖范围广、设备分散、人工巡检效率低、故障响应慢等痛点。为破解这一难…...

c/c++的opencv开闭操作

OpenCV 中的形态学开运算与闭运算 (C) 在计算机视觉和图像处理领域&#xff0c;形态学操作是用于分析和处理图像形状的一系列非线性操作。OpenCV 作为一个强大的开源计算机视觉库&#xff0c;提供了丰富的形态学转换函数。其中&#xff0c;“开运算”&#xff08;Opening&…...

Linux利用多线程和线程同步实现一个简单的聊天服务器

1. 概述 本文实现一个基于TCP/IP的简单多人聊天室程序。它包含一个服务器端和一个客户端&#xff1a;服务器能够接收多个客户端的连接&#xff0c;并将任何一个客户端发来的消息广播给所有其他连接的客户端&#xff1b;客户端则可以连接到服务器&#xff0c;发送消息并接收来自…...

无人机遥控器光纤通信模块技术要点!

一、技术要点 1. 长距离低损耗传输 采用单模光纤&#xff08;如G.654.E光纤&#xff09;&#xff0c;利用光纤的低衰减特性&#xff08;0.17 dB/km以下&#xff09;&#xff0c;支持10公里以上的远距离通信&#xff0c;突破了传统无线信号因衰减导致的覆盖限制。例如&…...

深入解析OkHttp与Retrofit:Android网络请求的黄金组合

前言 在移动应用开发中&#xff0c;网络请求是连接客户端与服务器的关键桥梁。对于Android开发者而言&#xff0c;OkHttp和Retrofit这对组合已经成为处理网络请求的事实标准。本文将全面剖析这两个框架的设计理念、核心功能、协同关系以及最佳实践&#xff0c;帮助开发者构建高…...

Python操作PDF书签详解 - 添加、修改、提取和删除

目录 简介 使用工具 Python 向 PDF 添加书签 添加书签 添加嵌套书签 Python 修改 PDF 书签 Python 展开或折叠 PDF 书签 Python 提取 PDF 书签 Python 删除 PDF 书签 简介 PDF 书签是 PDF 文件中的导航工具&#xff0c;通常包含一个标题和一个跳转位置&#xff08;如…...

Spring Boot与Kafka集成实践:从入门到实战

Spring Boot与Kafka集成实践 引言 在现代分布式系统中&#xff0c;消息队列是不可或缺的组件之一。Apache Kafka作为一种高吞吐量的分布式消息系统&#xff0c;广泛应用于日志收集、流处理、事件驱动架构等场景。Spring Boot作为Java生态中最流行的微服务框架&#xff0c;提供…...

luckysheet的使用——17.将表格作为pdf下载到本地

luckysheet源码里面自带有打印按钮&#xff0c;但是功能是无法使用的&#xff0c;所以我把该功能重写了一遍 1.在menuButton.js文件中找到源码打印按钮的触发事件&#xff1a; $("#luckysheet-icon-print").click(function () {}2.使用自己写的挂载方法 window.pr…...

矿井支架LCYVB-6钢丝编织护套连接器介绍

LCYVB-6钢丝编织护套连接器是一种专为矿井支架设计的连接装置&#xff0c;主要用于增强支架的稳定性和安全性。该连接器采用高强度钢丝编织护套&#xff0c;具有优异的抗拉强度和耐磨性&#xff0c;适用于恶劣的矿井环境。 主要特点 高强度钢丝编织护套&#xff1a;采用优质钢…...

git仓库中.git 文件很大,怎么清理掉一部分

查询 .git 文件大小&#xff0c;在 git-bash 里执行&#xff08;后面有些命令不能执行&#xff0c;也请在 git-bash 里执行&#xff09; windows11 安装好后右键没有 git bash 命令-CSDN博客 du -sh .git // 592m .git 操作前最好先备份一份&#xff0c;避免推送到远程时出错…...

Qt框架核心组件完全指南:从按钮交互到定时器实现

文章目录 前言一、QAbstractButton 按钮类概述1.1 常用属性1.2 常用信号1.3QButtonGroup 按钮组 二、QComboBox 组合框三、若干与数字相关的组件四、QString 字符串类五、Qt容器类5.1 顺序容器 QList5.2 关联容器 QMap 六、QVariant七、跨平台数据类型7.1 基础数据类型7.2 特殊…...

Axure设计数字乡村可视化大屏:从布局到交互的实战经验分享

乡村治理正从传统模式向“数据驱动”转型。数字乡村可视化大屏作为数据展示的核心载体&#xff0c;不仅能直观呈现乡村发展全貌&#xff0c;还能为决策提供科学依据。本文以Axure为工具&#xff0c;结合实际案例&#xff0c;分享如何从零设计一个功能完备、交互流畅的数字乡村大…...

60天python训练计划----day30

DAY 30 模块和库的导入 知识点回顾&#xff1a; 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑&#xff1a;找到根目录&#xff08;python解释器的目录和终端的目录不一致&#xff09; 一.导入官方库 我们复盘下学习python的逻辑&#xff0c;所谓学习pyth…...

HJ3 明明的随机数【牛客网】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路3.1 快排去重3.2 散列 四、参考代码4.1 快排去重4.2 散列 零、原题链接 HJ3 明明的随机数 一、题目描述 二、测试用例 三、解题思路 3.1 快排去重 基本思路&#xff1a;   先将序列进行快速排序&#xff0c;然后…...

BGP选路

一、拓扑图 二、要求及分析 1.要求 1.使用Preva1策略&#xff0c;确保R4通过R2到达192.168.10.0/24 2、用As Path策略&#xff0c;确保R4通过R3到达192.168.11.0/24 3.配置MED策略&#xff0c;确保R4通过R3到达192.168.12.0/24 4.使用Local Preference策略&#xff0c;确保…...

践行“科学智能”!和鲸打造 AI for Science 专属应用

AI for good, AI for Science. 在传统科研领域&#xff0c;人力与经验的局限始终如影随形。而“AI for Science”正逐渐改变科学研究的模式&#xff0c;以科学数据为基石、以强大算力为支撑&#xff0c;借助人工智能技术&#xff0c;开展计算密集度高且能够实现高效迭代的科学…...

【vs2022的C#窗体项目】打开运行+sql Server改为mysql数据库+发布

1. vs2022打开运行原sql Server的C#窗体项目更改为mysql数据库 1.1. vs2022安装基础模块即可 安装1️⃣vs核心编辑器2️⃣.net桌面开发必选&#xff0c;可选均不安装&#xff01;&#xff01;&#xff01; 为了成功连接mysql数据库&#xff0c;需要安装组件NuGet包管理器 安…...

wpf DataGrid 行选择事件

在WPF中处理DataGrid行选择事件主要有以下几种实现方式: 1.SelectionChanged事件处理 ‌ 通过直接订阅DataGrid的SelectionChanged事件实现行选择响应: <DataGrid SelectionChanged="DataGridAccurateLocationList_SelectionChanged" .../>后台代码中处理…...

Spring Cloud Seata 深度解析:原理与架构设计

文章目录 前言&#xff1a;为什么我们需要理解分布式事务&#xff1f;一、Seata 核心架构深度拆解1.1 分布式事务核心模型1.2 Seata undo_log 存储结构与版本控制存储结构版本控制核心算法 1.3 Seata 事务模型深度对比与实现原理AT 模式&#xff08;Auto Transaction&#xff0…...

从产品展示到工程设计:3DXML 转 STP 的跨流程数据转换技术解析

在数字化设计与制造领域&#xff0c;不同格式的三维模型文件常常需要进行转换&#xff0c;以满足不同软件和工作流程的需求。3DXML 和 STP&#xff08;STEP AP214/AP242&#xff09;是工业领域常用的两种三维模型文件格式&#xff0c;3DXML 格式以其轻量化和便于网络传输、可视…...

基于RT-Thread的STM32F4开发第五讲——软件模拟I2C

文章目录 前言一、RT-Thread工程创建二、AT24C02三、函数编写1.I2C_soft.c2.I2C_soft.h3.main.h 四、效果展示五、资源分享总结 前言 本章是基于RT-Thread studio实现软件模拟I2C&#xff0c;开发板是正点原子的STM32F4探索者&#xff0c;使用的RT-Thread驱动是5.1.0&#xff0…...

pkucpc2025 L:Game on Tree

题意 两个人在一棵无根树上玩游戏&#xff0c;每次可以删掉若干个叶子节点&#xff0c;不能操作的人输。 思路 比赛的时候我去写H Quintuple了&#xff0c;队友貌似在我写的时候把这道题讨论出来了。 后来补题的时候花了大概花了70分钟左右ac这道题。 首先考虑一条链的情况…...

大数据实时分析:ClickHouse、Doris、TiDB 对比分析

随着企业对数据分析实时性、复杂性和多样性的要求越来越高,传统的批处理数仓已经无法满足实时指标看板、流量监控、用户行为分析等场景需求。因此,越来越多的公司开始引入实时分析型数据库系统。 目前,国内外常见的实时分析数据库有: ClickHouse:列式数据库,极致的分析性…...

网络流量分析系统的十大应用场景

在现代企业和组织的IT运维体系中&#xff0c;网络流量分析系统&#xff08;Network Traffic Analysis, NTA&#xff09;早已不仅仅是用来查看带宽使用率的“流量计数器”。随着网络环境的复杂化、攻击技术的不断演进&#xff0c;以及对业务连续性要求的提升&#xff0c;网络流量…...

问题 | 代码审查:函数是否包含返回语句

“函数是否包含返回语句”这一问题的核心是&#xff1a;在编程中&#xff0c;函数是否按照设计要求正确使用了 返回语句&#xff08;如 return、return value&#xff09;&#xff0c;以便向调用者传递结果或控制权。以下是详细解释&#xff1a; 1. 什么是函数的返回语句&#…...

Spring Bean 生命周期中设计模式的应用与解析

Spring Bean 生命周期中使用的设计模式 Spring Bean 的生命周期涉及多个阶段和扩展点&#xff0c;Spring 框架在这一过程中巧妙运用了多种设计模式&#xff0c;以实现强大的功能和灵活性。以下是主要设计模式及其应用场景&#xff1a; 1. 工厂模式&#xff08;Factory Patter…...

设计模式的原理及深入解析

创建型模式 创建型模式主要关注对象的创建过程&#xff0c;旨在通过不同的方式创建对象&#xff0c;以满足不同的需求。 工厂方法模式 定义&#xff1a;定义一个创建对象的接口&#xff0c;让子类决定实例化哪一个类。 解释&#xff1a;工厂方法模式通过定义一个创建对象的…...

kotlin flow的两种SharingStarted策略的区别

一 两种 SharingStarted 策略的区别&#xff1a; SharingStarted.Eagerly: 立即开始收集上游流&#xff0c;即使没有下游订阅者持续保持活跃状态&#xff0c;直到 ViewModel 被清除优点&#xff1a;响应更快&#xff0c;数据始终保持最新缺点&#xff1a;消耗更多资源&#x…...

BGP综合实验(2)

一、实验需求 1、实验拓扑图 2、实验需求 使用 PreVal 策略&#xff0c;让 R4 经 R2 到达 192.168.10.0/24 。 使用 AS_Path 策略&#xff0c;让 R4 经 R3 到达 192.168.11.0/24 。 配置 MED 策略&#xff0c;让 R4 经 R3 到达 192.168.12.0/24 。 使用 Local Preference 策…...

python使用jsonpath-ng库操作json数据

jsonpath-ng 库的详细使用如下&#xff1a; 一、安装与导入 安装 通过 pip 安装库&#xff1a; pip install jsonpath-ng支持 Python 3.6 及以上版本。 导入核心模块 主要使用 parse 函数和 JSONPath 对象&#xff1a; from jsonpath_ng import parse二、基础查询操作 1. 简单…...

通用简洁工作汇报项目评估营销策划工作总结年终汇报PPT模版8套一组分享

工作总结汇报PPT模版8套一组分享&#xff1a;工作总结汇报PPT模版分享https://pan.quark.cn/s/04b7ab7a47c4 第一套PPT模版&#xff0c;主要是黄色和灰色调&#xff0c;上方有大面积黄色不规则形状背景&#xff0c;有“POWERPOINT”和“XXXXPPT模版”字样&#xff0c;左侧是黑…...

掌握Git:版本控制与高效协作指南

一、初始Git 提出问题&#xff1a;无论是在工作还是学习&#xff0c;我们在编写各种文档的时候&#xff0c;更改失误&#xff0c;失误后恢复到原来版本&#xff0c;不得不复制出一个副本。 每个版本由各自的内容&#xff0c;但最终只有一个报告需要被我们使用。 但在此之前的…...

ubuntu下配置vscode生成c_cpp_properties.json

-------------学习记录--------------- 在ubuntu下使用vscode时发现cpp文件无法读到头文件&#xff0c;明明头文件在合适的路径下&#xff0c;由于没有制定头文件的路径造成的这个问题。用这篇文章进行简单记录解决方法 ctrlshiftp打开命令面板&#xff0c;也可以点击左上角, …...

Qt读取Excel文件的技术实现与最佳实践

目录 一、成果展示二、核心方法及原理1. QAxObject&#xff08;基于COM接口&#xff09;2. 第三方库QXlsx3. ODBC数据库驱动 三、实现步骤详解1. QAxObject读取Excel&#xff08;需安装Excel/WPS&#xff09;2. QXlsx读取Excel&#xff08;跨平台方案&#xff09; 四、技术选型…...

双条件拆分工作表,一键生成独立工作簿-Excel易用宝

你是否遇到过这样的崩溃瞬间&#xff1f;面对一张密密麻麻的销售数据表&#xff0c;需要按指定维度拆分成工作簿和工作表&#xff0c;而你却只能手动复制粘贴到不同工作簿、工作表&#xff0c;改一个字段就花半小时&#xff0c;数据量大时甚至要熬夜加班&#xff1f; 别担心&a…...

iOS 蓝牙开发中的 BT 与 BLE

在 iOS 开发者的语境里,大家把 BT 和 BLE 当成两种不同的蓝牙技术在谈——它们来自同一个 Bluetooth 规范,但面向的场景、协议栈乃至 Apple 提供的 API 都截然不同。 缩写全称 / 技术名称规范层叫法iOS 支持现状典型用途BTBluetooth Classic(经典蓝牙)又叫 BR/EDR(Basic R…...

TCP和套接字SSL加密连接行为分析

目录 一、前言 二、背景 三、参数介绍 3.1、 have_openssl 3.2、have_ssl 3.3、require_secure_transport 四、--ssl-modemode 五、CREATE USER SSL/TLS选项 六、问题验证 6.1、使用套接字连接 6.2、使用TCP连接 七、分析与总结 一、前言 SSL&#xff08;Secure S…...

kafka 问与答

kafka Q&A How does the client connect to kafka and discovery the brokers. client 只需要知道一部分nodes(brokers)的地址既可以&#xff0c;client 会自动发现剩下的所有topic partition leader nodes, 然后连接上。 When a client connects:It uses the bootstrap…...

docker默认存储迁移

在容器化场景下默认存储路径为&#xff08;/var/lib/docker&#xff09;大多数平台根目录不支持系统盘扩容&#xff0c;会有空间不足风险隐患&#xff0c;因未配置持久化存储导致容器数据丢失。以迁移Docker存储路径至大容量/data目录说明 一、停止容器 systemctl stop docke…...

Ubuntu20.04系统下使用交叉编译工具链(aarch、x86)交叉编译opencv4.5.0

文章目录 0. 引言1. 准备交叉编译工具链2. 安装依赖工具3. 下载 OpenCV 源码4. 创建交叉编译工具链文件5. 配置 CMake 构建6. 构建 OpenCV7. 安装 OpenCV8. 验证9. 问题及解决办法 0. 引言 Ubuntu20.04系统下使用交叉编译工具链&#xff08;aarch、x86&#xff09;交叉编译ope…...

R语言数据可视化

R note book 文档–输出html格式文档&#xff0c;plotly不能生成PDF文件 --- title: "R语言数据可视化" output: html_notebook ---在R语言中进行数据可视化是数据分析和呈现的重要环节&#xff0c;R提供了多种强大的绘图系统和工具。以下是常见的数据可视化方法和示…...

NLP学习路线图(一): 线性代数(矩阵运算、特征值分解等)

引言&#xff1a;语言与矩阵的奇妙邂逅 在自然语言处理&#xff08;NLP&#xff09;的魔法世界里&#xff0c;每个词语都像被施了变形术的精灵&#xff0c;在数学的殿堂中翩翩起舞。当我们用"king - man woman queen"这样的向量魔法破解语义密码时&#xff0c;线性…...

【滑动窗口】LeetCode 1004题解 | 最大连续1的个数 Ⅲ

最大连续1的个数 Ⅲ 一、题目链接二、题目三、题目解析四、算法原理解法一&#xff1a;暴力枚举 zero计数器解法二&#xff1a;滑动窗口 五、编写代码六、时空复杂度 一、题目链接 最大连续1的个数 Ⅲ 二、题目 三、题目解析 注意题目中说的是最多k次&#xff0c;在一个数组…...

Linux 内核等待机制详解:prepare_to_wait_exclusive 与 TASK_INTERRUPTIBLE

1. prepare_to_wait_exclusive 函数解析 1.1 核心作用 prepare_to_wait_exclusive 是 Linux 内核中用于将进程以独占方式加入等待队列的关键函数,其主要功能包括: 标记独占等待:通过设置 WQ_FLAG_EXCLUSIVE 标志,表明此等待条目是独占的。 安全入队:在自旋锁保护下,将条…...

分布式数据库TiDB:深度解析原理、优化与架构设计

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【星海网址导航】 一、TiDB架构设计与核心原理 1.1 分布式架构演进 传统分库分表 vs TiDB架构 #mermaid-svg-8I88Hg2AVkzYTb3O {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fi…...

【深度学习基础】损失函数与优化算法详解:从理论到实践

【深度学习基础】损失函数与优化算法详解&#xff1a;从理论到实践 一、引言 1. 损失函数与优化算法在深度学习中的核心作用 在深度学习中&#xff0c;模型训练的本质是通过不断调整参数&#xff0c;使模型输出尽可能接近真实值。这一过程的核心驱动力是损失函数&#xff08;…...

睿抗足球机器人

目录 大框架 战术 Lua脚本语言编辑环境 大框架 策略脚本&#xff08;LUA-官方脚本&#xff09;、决策算法&#xff08;C-自定义&#xff09;、ROS系统 战术 我们研究了场地的长度、宽度、禁区范围、机器人运动速度等等&#xff0c;发现即使 Kicker 点球往极端角度踢&#xf…...