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

Ubuntu22.04搭建fabric开发环境、开发环境下运行链码

在智能合约开发过程中,开发人员需要一种快速、迭代地测试链码包的方法,而无需为每次修改运行链码生命周期命令。

使用 Fabric 二进制文件并启动peer处于开发模式(“DevMode”),然后将链码连接到peer。它允许您启动链代码,而无需在peer在链码最初提交到通道后,您可以绕过peer生命周期链码命令。这允许快速部署、调试和更新,而无需重新发布peer每次进行更新时生命周期链码命令。

注意:为了在peer,必须在网络中的所有节点上禁用 TLS 通信。由于强烈建议在生产网络中使用 TLS 通信,因此您永远不应该运行生产网络peer在开发模式中。

所有命令都是从fabric/文件夹中执行的。它使用所有默认设置peer和orderer并根据需要使用命令行中的环境变量覆盖配置。默认情况下不需要修改peercore.yaml或ordererorderer.yaml文件。

准备环境

1.克隆fabric代码

从GitHub克隆 Fabric 存储库。根据需要选择发布分支。

$ git clone https://github.com/hyperledger/fabric
$ cd fabric

2.构建order、peer和configtxgen

运行以下命令来构建二进制文件orderer,peer和 configtxgen:

$ make orderer peer configtxgen
Building build/bin/orderer
GOBIN=/home/along/go/src/github.com/Hyperledger/fabric/build/bin go install -tags "" -ldflags "-X github.com/hyperledger/fabric/common/metadata.Version=2.5.9 -X github.com/hyperledger/fabric/common/metadata.CommitSHA=2e4078eb7 -X github.com/hyperledger/fabric/common/metadata.BaseDockerLabel=org.hyperledger.fabric -X github.com/hyperledger/fabric/common/metadata.DockerNamespace=hyperledger" -buildvcs=false github.com/hyperledger/fabric/cmd/orderer
Building build/bin/peer
GOBIN=/home/along/go/src/github.com/Hyperledger/fabric/build/bin go install -tags "" -ldflags "-X github.com/hyperledger/fabric/common/metadata.Version=2.5.9 -X github.com/hyperledger/fabric/common/metadata.CommitSHA=2e4078eb7 -X github.com/hyperledger/fabric/common/metadata.BaseDockerLabel=org.hyperledger.fabric -X github.com/hyperledger/fabric/common/metadata.DockerNamespace=hyperledger" -buildvcs=false github.com/hyperledger/fabric/cmd/peer
make: Nothing to be done for 'configtxgen'.

成功后,您应该看到类似以下内容的结果:

$ ls build/bin/
configtxgen  configtxlator  cryptogen  orderer  peer

3.设置环境变量

设置PATH环境变量以包含orderer和peer二进制文件:

export PATH=$(pwd)/build/bin:$PATH

将FABRIC_CFG_PATH环境变量设置为指向sampleconfig文件夹:

export FABRIC_CFG_PATH=$(pwd)/sampleconfig

4.创建数据目录

在/var目录中创建hyperledger子目录。
这是 Fabric 用于存储块的默认位置,如order的orderer.yaml和peer 的core.yaml文件。要创建hyperledger子目录,请执行以下命令,并将问号替换为您的用户名:

sudo mkdir /var/hyperledger
sudo chown ????? /var/hyperledger

5.configtxgen生成创世块

生成创世块ordering服务。
运行以下命令生成创世块并将其存储在$(pwd)/sampleconfig/genesisblock中,以便可供使用orderer在下一步中,当orderer已开始。

$ configtxgen -profile SampleDevModeSolo -channelID syschannel -outputBlock genesisblock -configPath $FABRIC_CFG_PATH -outputBlock "$(pwd)/sampleconfig/genesisblock"
2024-08-09 14:50:07.619 CST 0001 INFO [common.tools.configtxgen] main -> Loading configuration
2024-08-09 14:50:07.653 CST 0002 INFO [common.tools.configtxgen.localconfig] completeInitialization -> orderer type: solo
2024-08-09 14:50:07.653 CST 0003 INFO [common.tools.configtxgen.localconfig] Load -> Loaded configuration: /home/along/go/src/github.com/Hyperledger/fabric/sampleconfig/configtx.yaml
2024-08-09 14:50:07.658 CST 0004 INFO [common.tools.configtxgen] doOutputBlock -> Generating genesis block
2024-08-09 14:50:07.658 CST 0005 INFO [common.tools.configtxgen] doOutputBlock -> Creating system channel genesis block
2024-08-09 14:50:07.659 CST 0006 INFO [common.tools.configtxgen] doOutputBlock -> Writing genesis block

成功后,您应该看`到类似以下内容的结果:

$ ls sampleconfig/
configtx.yaml  core.yaml  core.yaml.bak  genesisblock  msp  orderer.yaml

sampleconfig目录新增了genesisblock文件。

启动orderer节点

运行以下命令来启动orderer使用SampleDevModeSolo配置文件并启动ordering服务:

ORDERER_GENERAL_GENESISPROFILE=SampleDevModeSolo orderer

在这条命令中,我们看到了几个关键部分,它们是Hyperledger Fabric中与配置和操作相关的:

  1. ORDERER_GENERAL_GENESISPROFILE:

    • 这是一个环境变量,用于设置Hyperledger Fabric中的创世区块配置文件(Genesis profile)。在Fabric网络中,创世区块是链的第一个区块,它定义了链的初始状态和配置。
  2. SampleDevModeSolo:

    • 这是创世区块配置文件的名称。在Fabric中,可以通过不同的配置文件来定义不同数量和类型的节点,以及它们如何相互通信。SampleDevModeSolo通常是一个单节点的配置文件,用于开发模式,它配置了一个单一的排序服务节点(orderer)。
  3. orderer:

    • 这是执行命令的主体,即Fabric中的排序服务节点。排序服务节点负责接收来自应用的交易请求,并将它们排序形成区块,然后发送给网络中的其他节点。
  4. 命令结构:

    • 命令的结构表明它可能是在shell环境中设置环境变量,然后启动或配置排序服务节点。这种命令通常在启动Fabric网络或排序服务节点的脚本中看到。
  5. 命令的目的:

    • 这条命令的目的是指定排序服务节点在启动时使用SampleDevModeSolo配置文件。这通常用于开发或测试环境,因为它简化了网络的配置,只使用一个排序服务节点。

判断启动是否成功

启动成功能看到下面的信息:

2024-08-09 14:53:39.515 CST 000d INFO [orderer.common.server] Main -> Starting orderer:Version: 2.5.9Commit SHA: 2e4078eb7Go version: go1.22.5OS/Arch: linux/amd64
2024-08-09 14:53:39.516 CST 000e INFO [orderer.common.server] Main -> Beginning to serve requests

启动peer节点

打开另一个终端窗口并设置所需的环境变量以覆盖peer配置并启动peer节点。

注意:如果您打算保留orderer和peer在同一环境中(不在单独的容器中),然后才设置CORE_OPERATIONS_LISTENADDRESS环境变量(端口可以是除 9443 之外的任何端口)。

export CORE_OPERATIONS_LISTENADDRESS=127.0.0.1:9444

带着--peer-chaincodedev=true参数启动peer,peer将进入开发模式。

export PATH=$(pwd)/build/bin:$PATH
export FABRIC_CFG_PATH=$(pwd)/sampleconfig
FABRIC_LOGGING_SPEC=chaincode=debug CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052 peer node start --peer-chaincodedev=true

提醒:在DevMode下运行时,无法启用 TLS。

判断启动是否成功

成功后,您应该看到类似以下内容的结果:

2024-08-09 16:56:05.391 CST 003c INFO [nodeCmd] serve -> Discovery service activated
2024-08-09 16:56:05.391 CST 003d INFO [nodeCmd] serve -> Starting peer with Gateway enabled
2024-08-09 16:56:05.391 CST 003e INFO [nodeCmd] serve -> Starting peer with ID=[jdoe], network ID=[dev], address=[192.168.0.2:7051]
2024-08-09 16:56:05.391 CST 003f INFO [nodeCmd] serve -> Started peer with ID=[jdoe], network ID=[dev], address=[192.168.0.2:7051]

创建channel并加入peer

创建channel

打开另一个终端窗口并运行以下命令以使用configtxgen工具生成通道创建交易。此命令使用SampleSingleMSPChannel配置文件创建通道ch1 :

export PATH=$(pwd)/build/bin:$PATH
export FABRIC_CFG_PATH=$(pwd)/sampleconfig
configtxgen -channelID ch1 -outputCreateChannelTx ch1.tx -profile SampleSingleMSPChannel -configPath $FABRIC_CFG_PATH
peer channel create -o 127.0.0.1:7050 -c ch1 -f ch1.tx2024-08-09 15:22:39.209 CST 0001 INFO [common.tools.configtxgen] main -> Loading configuration
2024-08-09 15:22:39.242 CST 0002 INFO [common.tools.configtxgen.localconfig] Load -> Loaded configuration: /home/along/go/src/github.com/Hyperledger/fabric/sampleconfig/configtx.yaml
2024-08-09 15:22:39.243 CST 0003 INFO [common.tools.configtxgen] doOutputChannelCreateTx -> Generating new channel configtx
2024-08-09 15:22:39.244 CST 0004 INFO [common.tools.configtxgen] doOutputChannelCreateTx -> Writing new channel tx
2024-08-09 15:22:39.324 CST 0001 INFO [channelCmd] InitCmdFactory -> Endorser and orderer connections initialized
2024-08-09 15:22:39.344 CST 0002 INFO [cli.common] readBlock -> Received block: 0

peer加入channel

现在加入peer通过运行以下命令进入频道:

$ peer channel join -b ch1.block
2024-08-09 15:23:06.505 CST 0001 INFO [channelCmd] InitCmdFactory -> Endorser and orderer connections initialized
2024-08-09 15:23:06.529 CST 0002 INFO [channelCmd] executeJoin -> Successfully submitted proposal to join channel

这peer现已加入channel ch1。

链码

1.构建链码

我们使用fabric/integration/chaincode目录中的简单链代码来演示如何在 DevMode 中运行链代码包。在与上一步相同的终端窗口中,运行以下命令来构建链代码:

$ go build -o simpleChaincode ./integration/chaincode/simple/cmd

2.启动链码

当DevMode启用时peer, CORE_CHAINCODE_ID_NAME环境变量必须设置为<CHAINCODE_NAME> : <CHAINCODE_VERSION>否则,peer无法找到链码。对于本示例,我们将其设置为mycc:1.0 。运行以下命令启动链代码并将其连接到peer:

$ CORE_CHAINCODE_LOGLEVEL=debug CORE_PEER_TLS_ENABLED=false CORE_CHAINCODE_ID_NAME=mycc:1.0 ./simpleChaincode -peer.address 127.0.0.1:7052

因为我们设置了调试日志记录peer当我们启动它时,可以确认链码注册成功。在你的peer日志,您应该看到类似以下内容的结果:

2024-08-09 16:12:18.458 CST 0046 DEBU [chaincode] Register -> registered handler complete for chaincode mycc:1.0
2024-08-09 16:12:18.458 CST 0047 DEBU [chaincode] HandleRegister -> Got REGISTER for chaincodeID = mycc:1.0, sending back REGISTERED
2024-08-09 16:12:18.458 CST 0048 DEBU [chaincode] HandleRegister -> Changed state to established for mycc:1.0
2024-08-09 16:12:18.458 CST 0049 DEBU [chaincode] sendReady -> sending READY for chaincode mycc:1.0
2024-08-09 16:12:18.458 CST 004a DEBU [chaincode] sendReady -> Changed to state ready for chaincode mycc:1.0

3.批准并提交链码

现在,您需要运行以下 Fabric 链码生命周期命令来批准链码定义并将其提交到通道:

# 批准链码
$ peer lifecycle chaincode approveformyorg  -o 127.0.0.1:7050 --channelID ch1 --name mycc --version 1.0 --sequence 1 --init-required --signature-policy "OR ('SampleOrg.member')" --package-id mycc:1.0
2024-08-09 16:14:40.884 CST 0001 INFO [chaincodeCmd] ClientWait -> txid [3903a7765184f2b5de054898e0435fd2e52a06dafce2a3d56ddf92ea52d469c3] committed with status (VALID) at 0.0.0.0:7051#检查链码批准状态
$ peer lifecycle chaincode checkcommitreadiness -o 127.0.0.1:7050 --channelID ch1 --name mycc --version 1.0 --sequence 1 --init-required --signature-policy "OR ('SampleOrg.member')"
Chaincode definition for chaincode 'mycc', version '1.0', sequence '1' on channel 'ch1' approval status by org:
SampleOrg: true# 提交链码
$ peer lifecycle chaincode commit -o 127.0.0.1:7050 --channelID ch1 --name mycc --version 1.0 --sequence 1 --init-required --signature-policy "OR ('SampleOrg.member')" --peerAddresses 127.0.0.1:7051
2024-08-09 16:15:01.363 CST 0001 INFO [chaincodeCmd] ClientWait -> txid [91d4e807d0294a006554fce4e4f94e6aede47a4ae26be25a4d0658daeaf52970] committed with status (VALID) at 127.0.0.1:7051

4.调用链码

4.1初始化链码
$ CORE_PEER_ADDRESS=127.0.0.1:7051 peer chaincode invoke -o 127.0.0.1:7050 -C ch1 -n mycc -c '{"Args":["init","a","100","b","200"]}' --isInit
2024-08-09 16:15:10.146 CST 0001 INFO [chaincodeCmd] chaincodeInvokeOrQuery -> Chaincode invoke successful. result: status:200 
along@iv-ydasjmjawwwh2yowmoe5:~/go/src/github.com/Hyperledger/fabric$ CORE_PEER_ADDRESS=127.0.0.1:7051 peer chaincode invoke -o 127.0.0.1:7050 -C ch1 -n mycc -c '{"Args":["invoke","a","b","10"]}'
2024-08-09 16:15:18.767 CST 0001 INFO [chaincodeCmd] chaincodeInvokeOrQuery -> Chaincode invoke successful. result: status:200 
along@iv-ydasjmjawwwh2yowmoe5:~/go/src/github.com/Hyperledger/fabric$ CORE_PEER_ADDRESS=127.0.0.1:7051 peer chaincode invoke -o 127.0.0.1:7050 -C ch1 -n mycc -c '{"Args":["query","a"]}'
2024-08-09 16:15:25.775 CST 0001 INFO [chaincodeCmd] chaincodeInvokeOrQuery -> Chaincode invoke successful. result: status:200 payload:"90"
4.2调用
$ CORE_PEER_ADDRESS=127.0.0.1:7051 peer chaincode invoke -o 127.0.0.1:7050 -C ch1 -n mycc -c '{"Args":["query","a"]}'
2024-08-09 16:19:32.293 CST 0001 INFO [chaincodeCmd] chaincodeInvokeOrQuery -> Chaincode invoke successful. result: status:200 payload:"90"$ CORE_PEER_ADDRESS=127.0.0.1:7051 peer chaincode invoke -o 127.0.0.1:7050 -C ch1 -n mycc -c '{"Args":["invoke","a","b","10"]}'
2024-08-09 17:11:09.597 CST 0001 INFO [chaincodeCmd] chaincodeInvokeOrQuery -> Chaincode invoke successful. result: status:200 
along@iv-ydasjmjawwwh2yowmoe5:~/go/src/github.com/Hyperledger/fabric$ CORE_PEER_ADDRESS=127.0.0.1:7051 peer chaincode invoke -o 127.0.0.1:7050 -C ch1 -n mycc -c '{"Args":["query","a"]}'
2024-08-09 17:16:42.540 CST 0001 INFO [chaincodeCmd] chaincodeInvokeOrQuery -> Chaincode invoke successful. result: status:200 payload:"80"

总结

现在可以迭代地更新智能合约、保存更改、构建链代码,然后使用上述步骤再次启动链码。您不需要运行peer每次进行更改时都会更新链代码的生命周期命令(批准、提交)。

相关文章:

Ubuntu22.04搭建fabric开发环境、开发环境下运行链码

在智能合约开发过程中&#xff0c;开发人员需要一种快速、迭代地测试链码包的方法&#xff0c;而无需为每次修改运行链码生命周期命令。 使用 Fabric 二进制文件并启动peer处于开发模式&#xff08;“DevMode”&#xff09;&#xff0c;然后将链码连接到peer。它允许您启动链代…...

[BSidesCF 2019]Kookie1

打开题目&#xff0c;看到 根据提示&#xff0c;账号&#xff1a;cookie。密码&#xff1a;monster。试一下登录&#xff0c;登陆成功 抓包看看信息 根据提示&#xff0c; 看一下返回包 账号要加username要改成admin&#xff0c;改一下试试 构造cookie 直接得到flag flag{c…...

LCM红外小目标检测

根据站内的matlab代码修改成python版本。 import numpy as np import matplotlib.pyplot as plt import cv2 from pylab import mpl# 设置中文显示字体 mpl.rcParams["font.sans-serif"] ["SimHei"]def LCM_computation(patch_LCM_in):row, col patch_L…...

振德医疗选择泛微千里聆RPA,助力电商、人事业务流程自动化

振德医疗用品股份有限公司成立于1994年&#xff0c;中国A股上市公司&#xff0c;是医用敷料和感控防护产品主要的供应商之一。 &#xff08;图片素材来自振德医疗官网&#xff09; 振德医疗的业务在线上线下齐发力。目前拥有5个国内生产基地&#xff0c;3个海外工厂&#xff0…...

VBA高级应用30例应用3在Excel中的ListObject对象:创建表

《VBA高级应用30例》&#xff08;版权10178985&#xff09;&#xff0c;是我推出的第十套教程&#xff0c;教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开&#xff0c;这套教程案例与理论结合&#xff0c;紧贴“实战”&#xff0c;并做“战术总结”&#xff0c;以…...

IP 地址在 SQL 注入攻击中的作用及防范策略

数据库在各个领域的逐步应用&#xff0c;其安全性也备受关注。SQL 注入攻击作为一种常见的数据库攻击手段&#xff0c;给网络安全带来了巨大威胁。今天我们来聊一聊SQL 注入攻击的基本知识。 SQL 注入攻击的基本原理 SQL 注入是通过将恶意的 SQL 代码插入到输入参数中&#xf…...

Unity VR黑屏

picosdk里面的&#xff0c;有修改 using System.Collections; using System.Collections.Generic; using UnityEngine;public class ScreenFade : MonoBehaviour {[Tooltip("颜色")]public Color fadeColor new Color(0.0f, 0.0f, 0.0f, 1.0f);private int renderQ…...

Vue.js 中使用 Watcher 的强大场景和案例

目录 表单验证 示例代码: HTML: 获取 API 数据 示例代码: HTML: 深度监听对象变化 示例代码: HTML: 观察多个数据源 示例代码: HTML: Vue.js 是一个流行的前端框架,以其直观的数据绑定和组件驱动的开发模式而闻名。其中,watch 功能是其响应式编程模型…...

《实现 DevOps 平台(2) · GitLab CI/CD 交互》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…...

【机器学习sklearn实战】岭回归、Lasso回归和弹性网络

一 sklean中模型详解 1.1 Ride regression 1.2 Lasso regression 1.3 ElasticNet 二 算法实战 2.1 导入包 import numpy as np import pandas as pd from sklearn import datasets from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.linear…...

Python 爬虫项目实战六:抓取猫眼电影排行榜的数据

在这篇博客中&#xff0c;我们将通过一个实际的Python爬虫项目&#xff0c;详细讲解如何抓取网页数据。本次选择的实战项目是抓取猫眼电影排行榜的数据&#xff0c;通过这个项目&#xff0c;你将学会如何使用Python编写爬虫&#xff0c;从网页中提取有用的电影信息。 一、项目…...

YOLO系列:从yolov1至yolov8的进阶之路 持续更新中

一、基本概念 1.YOLO简介 YOLO&#xff08;You Only Look Once&#xff09;&#xff1a;是一种基于深度神经网络的对象识别和定位算法&#xff0c;其最大的特点是运行速度很快&#xff0c;可以用于实时系统。 2.目标检测算法 RCNN&#xff1a;该系列算法实现主要为两个步骤&…...

欧拉系统离线安装界面ukui

1、官网下载安装镜像iso后&#xff0c;默认没有gui openEuler | 开源社区 | openEuler社区官网openEuler是一个开源、免费的 Linux 发行版平台&#xff0c;将通过开放的社区形式与全球的开发者共同构建一个开放、多元和架构包容的软件生态体系。同时&#xff0c;openEuler 也是…...

Milvus向量数据库的简介以及用途

Milvus 是一个开源的向量数据库,专门用于处理和存储高维向量数据。它可以高效地支持各种数据科学和机器学习应用,特别是在涉及到大规模相似度搜索和推荐系统等领域。 以下是 Milvus 的简介以及它的主要用途。 1. Milvus 简介 Milvus 是由 Zilliz 开发的开源分布式向量数据库…...

恒创科技:IPv4 和 IPv6 之间的主要区别

IPv4 和 IPv6 是互联网协议 (IP) 系统中使用的两种版本的 IP 地址格式。虽然它们的主要目的是准确识别、发送和接收互联网上的数据&#xff0c;但 IPv4 和 IPv6 之间存在许多关键差异。 地址格式 IPv4 采用 32 位格式&#xff0c;由 4 个数值(称为八位字节)表示&#xff0c;以点…...

TinyWebserver的复现与改进(1):服务器环境的搭建与测试

计划开一个新坑, 主要是复现qinguoyi/TinyWebServer项目&#xff0c;并且使用其它模块提升性能。 本文开发服务器配置&#xff1a;腾讯云轻量级服务器&#xff0c;CPU - 2核 内存 - 2GB&#xff0c;操作系统 Ubuntu Server 18.04.1 LTS 64bit 打开端口 需要打开服务器3306、80…...

【Python】练习题附带答案

1、使用for循环实现输出9*9乘法表 代码&#xff1a; 2、写代码实现累乘计算器。 示例&#xff1a;用户输入&#xff1a;5*9*87输出答案&#xff1a;3915 代码&#xff1a; 3、写代码实现&#xff0c;循环提示用户输入的内容&#xff08;Q/q终止循环&#xff09;&#xff0c;…...

Springboot集成Proguard生成混淆jar包

背景 当我们需要将 JAR 包交付给第三方时&#xff0c;常常担心代码可能会被反编译。因此&#xff0c;对 JAR 包进行混淆处理显得尤为重要。 市面上有许多 JAR 包源码混淆工具&#xff0c;但真正能稳定投入使用的并不多。例如&#xff0c;ClassFinal (ClassFinal: Java字节码加…...

什么是NLP分词(Tokenization)

在自然语言处理和机器学习的领域里&#xff0c;咱们得聊聊一个超基础的技巧——就是“分词”啦。这个技巧啊&#xff0c;就是把一长串的文字切分成小块&#xff0c;让机器能更容易地“消化”。这些小块&#xff0c;不管大小&#xff0c;单个的字符也好&#xff0c;整个的单词也…...

基于深度学习的图像伪造检测

基于深度学习的图像伪造检测主要利用深度学习技术来识别和检测伪造的图像内容&#xff0c;尤其是在生成对抗网络&#xff08;GAN&#xff09;等技术发展的背景下&#xff0c;伪造图像的逼真程度大大提升。图像伪造检测在信息安全、隐私保护、司法鉴定等领域具有重要意义。以下是…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上&#xff0c;对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...