SecretFlow之SCQL部署(P2P方案)避雷纯享版

目录

  • 前言
  • 一、搭建alice节点
    • 1.1、创建工作区
    • 1.2、准备状态数据、源数据
    • 1.3、配置 SCQLBroker
    • 1.4、配置 SCQLEngine
    • 1.5、创建 docker-compose 文件
    • 1.6、准备身份验证文件
    • 1.7、启动服务
  • 二、搭建bob节点
    • 2.1、创建工作区
    • 2.2、准备状态数据、源数据
    • 2.3、配置 SCQLBroker
    • 2.4、配置 SCQLEngine
    • 2.5、创建 docker-compose 文件
    • 2.6、准备身份验证文件
    • 2.7、启动服务
  • 三、测试SCQL
    • 3.1、构建 brokerctl
    • 3.2、创建项目并邀请参与方加入
    • 3.3、创建数据表
    • 3.4、授权CCL
    • 3.5、执行查询
  • 四、Q&A
    • 4.1、docker-compose版本
    • 4.2、SCQLBroker连不上数据库
    • 4.3、找不到私钥
    • 4.4、执行查询建立会话失败

前言

本文将针对蚂蚁的开源隐私计算平台隐语secretflow,实战部署SCQL系统(基于0.6.0b1版本的P2P非中心化方案),达到两个参与方联合数据分析的目标。

参考文档:

  • https://www.secretflow.org.cn/zh-CN/docs/scql/0.6.0b1/topics/deployment/how-to-deploy-p2p-cluster
  • https://www.secretflow.org.cn/zh-CN/docs/scql/0.6.0b1/intro/p2p-tutorial

名词解释:

  • SCQL :安全协作查询语言(Secure Collaborative Query Language)是一个允许多个互不信任参与方在不泄露各自隐私数据的条件下进行联合数据分析的系统。

部署环境:

  • 参与方alice:192.168.3.20
  • 参与方bob:192.168.3.58

一、搭建alice节点

1.1、创建工作区

mkdir scql-p2p
cd scql-p2p

1.2、准备状态数据、源数据

# For Bob, please use command: wget raw.githubusercontent.com/secretflow/scql/main/examples/p2p-tutorial/mysql/initdb/bob_init.sql
wget raw.githubusercontent.com/secretflow/scql/main/examples/p2p-tutorial/mysql/initdb/alice_init.sql
# For Bob, please use command: wget raw.githubusercontent.com/secretflow/scql/main/examples/p2p-tutorial/mysql/initdb/broker_init_bob.sql
wget raw.githubusercontent.com/secretflow/scql/main/examples/p2p-tutorial/mysql/initdb/broker_init_alice.sql

1.3、配置 SCQLBroker

在工作区中创建一个名为 config.yml 的文件,并粘贴如下代码:

intra_server:host: 0.0.0.0port: 8080
inter_server:port: 8081
log_level: debug
party_code: alice
session_expire_time: 24h
session_expire_check_time: 1m
party_info_file: "/home/admin/configs/party_info.json"
private_key_path: "/home/admin/configs/ed25519key.pem"
intra_host: broker:8080
engine:timeout: 120sprotocol: httpcontent_type: application/jsonuris:- for_peer: http://192.168.3.20:8003for_self: 192.168.3.20:8003
storage:type: mysqlconn_str: "root:password123@tcp(mysql:3306)/brokeralice?charset=utf8mb4&parseTime=True&loc=Local&interpolateParams=true"max_idle_conns: 10max_open_conns: 100conn_max_idle_time: 2mconn_max_lifetime: 5m

mysql数据库连接为broker元数据的db配置(这里和业务源数据库alice连接同一个mysql,只是库有所区分)。

1.4、配置 SCQLEngine

在工作区中创建一个名为 gflags.conf 的文件,并粘贴如下代码:

--listen_port=8003
--datasource_router=embed
--enable_driver_authorization=false
--server_enable_ssl=false
--driver_enable_ssl_as_client=false
--peer_engine_enable_ssl_as_client=false
--embed_router_conf={"datasources":[{"id":"ds001","name":"mysql db","kind":"MYSQL","connection_str":"db=alice;user=root;password=password123;host=mysql;auto-reconnect=true"}],"rules":[{"db":"*","table":"*","datasource_id":"ds001"}]}
# party authentication flags
--enable_self_auth=false
--enable_peer_auth=false

mysql数据库连接为业务源数据库alice的db配置(这里和broker连接同一个mysql,只是库有所区分)。

1.5、创建 docker-compose 文件

在您的工作区中创建一个名为 docker-compose.yaml 的文件,并粘贴以下代码:

version: '3.8'
services:broker:image: secretflow/scql:latestcommand:- /home/admin/bin/broker- -config=/home/admin/configs/config.ymlrestart: alwaysports:- 8080:8080- 8081:8081volumes:- ./config.yml:/home/admin/configs/config.yml- ./party_info.json:/home/admin/configs/party_info.json- ./ed25519key.pem:/home/admin/configs/ed25519key.pemengine:cap_add:- NET_ADMINcommand:- /home/admin/bin/scqlengine- --flagfile=/home/admin/engine/conf/gflags.confimage: secretflow/scql:latestports:- 8003:8003volumes:- ./gflags.conf:/home/admin/engine/conf/gflags.confmysql:image: mysql:latestenvironment:- MYSQL_ROOT_PASSWORD=password123- TZ=Asia/Shanghaihealthcheck:retries: 10test:- CMD- mysqladmin- ping- -h- mysqltimeout: 20sexpose:- "3306"restart: alwaysvolumes:- ./alice_init.sql:/docker-entrypoint-initdb.d/alice_init.sql- ./broker_init_alice.sql:/docker-entrypoint-initdb.d/broker_init_alice.sql

1.6、准备身份验证文件

参与方身份通过私钥-公钥对进行识别,因此我们需要生成这些文件。

创建192.168.3.20的参与方alice的密钥:

# generate private key
openssl genpkey -algorithm ed25519 -out ed25519key.pem

并获取自己的公钥,以便给party_info.json中使用:

# get public key corresponding to the private key, the output can be used to replace the __ALICE_PUBLIC_KEY__ in party_info.json
# for engine Bob,  the output can be used to replace the __BOB_PUBLIC_KEY__ in party_info.json
openssl pkey -in ed25519key.pem  -pubout -outform DER | base64

在您的工作区中创建一个名为 party_info.json 的文件,并粘贴以下代码:

{"participants": [{"party_code": "alice","endpoint": "http://192.168.3.20:8081","pubkey": "MCowBQYDK2VwAyEA3Ijkj1iaGBtpTukw78vBr8j+IuuW3dohTMm9rO3wLOg="},{"party_code": "bob","endpoint": "http://192.168.3.58:8081","pubkey": "MCowBQYDK2VwAyEAnRDPlvULRuuC9oIcQjBs6uHuonkdp1e+kP29cElocdo="}]
}

1.7、启动服务

您的工作区文件应如下所示:

└── scql-p2p├── alice_init.sql├── broker_init_alice.sql├── config.yml├── docker-compose.yaml├── ed25519key.pem├── gflags.conf└── party_info.json

然后您可以运行docker-compose up来启动引擎服务:

# If you install docker with Compose V1, please use `docker-compose` instead of `docker compose`
docker-compose -f docker-compose.yaml up -dCreating network "scql-p2p_default" with the default driver
Creating scql-p2p_broker_1 ... done
Creating scql-p2p_engine_1 ... done
Creating scql-p2p_mysql_1  ... done

查看进程:

docker-compose ps               Name                     Command                  State                                             Ports                                       
------------------------------------------------------------------------------------------------------------------------------------------------------
scql-p2p_broker_1   /home/admin/bin/broker -co ...   Up             0.0.0.0:8080->8080/tcp,:::8080->8080/tcp, 0.0.0.0:8081->8081/tcp,:::8081->8081/tcp
scql-p2p_engine_1   /home/admin/bin/scqlengine ...   Up             0.0.0.0:8003->8003/tcp,:::8003->8003/tcp                                          
scql-p2p_mysql_1    docker-entrypoint.sh mysqld      Up (healthy)   3306/tcp, 33060/tcp

您可以使用docker logs检查engine和broker是否正常工作:

docker logs -f scql-p2p_engine_1[info] [main.cc:main:453] [sciengine] Started engine rpc server success, listen on: 0.0.0.0:8003docker logs -f scql-p2p_broker_1INFO main.go:190 Starting to serve request on :8081 with http...
INFO main.go:190 Starting to serve request on 0.0.0.0:8080 with http...

二、搭建bob节点

2.1、创建工作区

mkdir scql-p2p
cd scql-p2p

2.2、准备状态数据、源数据

# For Bob, please use command: wget raw.githubusercontent.com/secretflow/scql/main/examples/p2p-tutorial/mysql/initdb/bob_init.sql
wget raw.githubusercontent.com/secretflow/scql/main/examples/p2p-tutorial/mysql/initdb/bob_init.sql
# For Bob, please use command: wget raw.githubusercontent.com/secretflow/scql/main/examples/p2p-tutorial/mysql/initdb/broker_init_bob.sql
wget raw.githubusercontent.com/secretflow/scql/main/examples/p2p-tutorial/mysql/initdb/broker_init_bob.sql

2.3、配置 SCQLBroker

在工作区中创建一个名为 config.yml 的文件,并粘贴如下代码:

intra_server:host: 0.0.0.0port: 8080
inter_server:port: 8081
log_level: debug
party_code: bob
session_expire_time: 24h
session_expire_check_time: 1m
party_info_file: "/home/admin/configs/party_info.json"
private_key_path: "/home/admin/configs/ed25519key.pem"
intra_host: broker:8080
engine:timeout: 120sprotocol: httpcontent_type: application/jsonuris:- for_peer: http://192.168.3.58:8003for_self: 192.168.3.58:8003
storage:type: mysqlconn_str: "root:password123@tcp(mysql:3306)/brokerbob?charset=utf8mb4&parseTime=True&loc=Local&interpolateParams=true"max_idle_conns: 10max_open_conns: 100conn_max_idle_time: 2mconn_max_lifetime: 5m

mysql数据库连接为broker元数据的db配置(这里和业务源数据库bob连接同一个mysql,只是库有所区分)。

2.4、配置 SCQLEngine

在工作区中创建一个名为 gflags.conf 的文件,并粘贴如下代码:

--listen_port=8003
--datasource_router=embed
--enable_driver_authorization=false
--server_enable_ssl=false
--driver_enable_ssl_as_client=false
--peer_engine_enable_ssl_as_client=false
--embed_router_conf={"datasources":[{"id":"ds001","name":"mysql db","kind":"MYSQL","connection_str":"db=bob;user=root;password=password123;host=mysql;auto-reconnect=true"}],"rules":[{"db":"*","table":"*","datasource_id":"ds001"}]}
# party authentication flags
--enable_self_auth=false
--enable_peer_auth=false

mysql数据库连接为业务源数据库bob的db配置(这里和broker连接同一个mysql,只是库有所区分)。

2.5、创建 docker-compose 文件

在您的工作区中创建一个名为 docker-compose.yaml 的文件,并粘贴以下代码:

version: '3.8'
services:broker:image: secretflow/scql:latestcommand:- /home/admin/bin/broker- -config=/home/admin/configs/config.ymlrestart: alwaysports:- 8080:8080- 8081:8081volumes:- ./config.yml:/home/admin/configs/config.yml- ./party_info.json:/home/admin/configs/party_info.json- ./ed25519key.pem:/home/admin/configs/ed25519key.pemengine:cap_add:- NET_ADMINcommand:- /home/admin/bin/scqlengine- --flagfile=/home/admin/engine/conf/gflags.confimage: secretflow/scql:latestports:- 8003:8003volumes:- ./gflags.conf:/home/admin/engine/conf/gflags.confmysql:image: mysql:latestenvironment:- MYSQL_ROOT_PASSWORD=password123- TZ=Asia/Shanghaihealthcheck:retries: 10test:- CMD- mysqladmin- ping- -h- mysqltimeout: 20sexpose:- "3306"restart: alwaysvolumes:- ./bob_init.sql:/docker-entrypoint-initdb.d/bob_init.sql- ./broker_init_bob.sql:/docker-entrypoint-initdb.d/broker_init_bob.sql

2.6、准备身份验证文件

参与方身份通过私钥-公钥对进行识别,因此我们需要生成这些文件。

创建192.168.3.58的参与方bob的密钥(已在1.6中生成):

# generate private key
openssl genpkey -algorithm ed25519 -out ed25519key.pem

并获取自己的公钥,以便给party_info.json中使用:

# get public key corresponding to the private key, the output can be used to replace the __ALICE_PUBLIC_KEY__ in party_info.json
# for engine Bob,  the output can be used to replace the __BOB_PUBLIC_KEY__ in party_info.json
openssl pkey -in ed25519key.pem  -pubout -outform DER | base64

在您的工作区中创建一个名为 party_info.json 的文件,并粘贴以下代码:

{"participants": [{"party_code": "alice","endpoint": "http://192.168.3.20:8081","pubkey": "MCowBQYDK2VwAyEA3Ijkj1iaGBtpTukw78vBr8j+IuuW3dohTMm9rO3wLOg="},{"party_code": "bob","endpoint": "http://192.168.3.58:8081","pubkey": "MCowBQYDK2VwAyEAnRDPlvULRuuC9oIcQjBs6uHuonkdp1e+kP29cElocdo="}]
}

2.7、启动服务

您的工作区文件应如下所示:

└── scql-p2p├── bob_init.sql├── broker_init_bob.sql├── config.yml├── docker-compose.yaml├── ed25519key.pem├── gflags.conf└── party_info.json

然后您可以运行docker-compose up来启动引擎服务:

# If you install docker with Compose V1, please use `docker-compose` instead of `docker compose`
docker-compose -f docker-compose.yaml up -dCreating network "scql-p2p_default" with the default driver
Creating scql-p2p_mysql_1  ... done
Creating scql-p2p_engine_1 ... done
Creating scql-p2p_broker_1 ... done

查看进程:

docker-compose ps               Name                     Command                       State                                                 Ports                                       
---------------------------------------------------------------------------------------------------------------------------------------------------------------
scql-p2p_broker_1   /home/admin/bin/broker -co ...   Up                      0.0.0.0:8080->8080/tcp,:::8080->8080/tcp, 0.0.0.0:8081->8081/tcp,:::8081->8081/tcp
scql-p2p_engine_1   /home/admin/bin/scqlengine ...   Up                      0.0.0.0:8003->8003/tcp,:::8003->8003/tcp                                          
scql-p2p_mysql_1    docker-entrypoint.sh mysqld      Up (healthy)            3306/tcp, 33060/tcp

您可以使用docker logs检查engine和broker是否正常工作:

docker logs -f scql-p2p_engine_1[info] [main.cc:main:453] [sciengine] Started engine rpc server success, listen on: 0.0.0.0:8003docker logs -f scql-p2p_broker_1INFO main.go:190 Starting to serve request on :8081 with http...
INFO main.go:190 Starting to serve request on 0.0.0.0:8080 with http...

三、测试SCQL

3.1、构建 brokerctl

注意拉取对应版本0.6.0b1的源码,同时注意golang版本需要大于等于1.19。

# Grab a copy of scql:
git clone -b 0.6.0b1 https://github.com/secretflow/scql.git
cd scql# build scdbclient from source
# requirements:
#   go version >= 1.19
go build -o brokerctl cmd/brokerctl/main.go# try brokerctl
./brokerctl --help

3.2、创建项目并邀请参与方加入

./brokerctl create project --project-id "demo" --host http://192.168.3.20:8080
./brokerctl get project --host http://192.168.3.20:8080
./brokerctl invite bob --project-id "demo" --host http://192.168.3.20:8080
./brokerctl get invitation --host http://192.168.3.58:8080
./brokerctl process invitation 1 --response "accept" --project-id "demo" --host http://192.168.3.58:8080
./brokerctl get project --host http://192.168.3.20:8080

3.3、创建数据表

./brokerctl create table ta --project-id "demo" --columns "ID string, credit_rank int, income int, age int" --ref-table alice.user_credit --db-type mysql --host http://192.168.3.20:8080
./brokerctl get table ta --host http://192.168.3.20:8080 --project-id "demo"
./brokerctl create table tb --project-id "demo" --columns "ID string, order_amount double, is_active int" --ref-table bob.user_stats --db-type mysql --host http://192.168.3.58:8080
./brokerctl get table tb --host http://192.168.3.58:8080 --project-id "demo"

3.4、授权CCL

./brokerctl grant alice PLAINTEXT --project-id "demo" --table-name ta --column-name ID --host http://192.168.3.20:8080
./brokerctl grant alice PLAINTEXT --project-id "demo" --table-name ta --column-name credit_rank --host http://192.168.3.20:8080
./brokerctl grant alice PLAINTEXT --project-id "demo" --table-name ta --column-name income --host http://192.168.3.20:8080
./brokerctl grant alice PLAINTEXT --project-id "demo" --table-name ta --column-name age --host http://192.168.3.20:8080./brokerctl grant bob PLAINTEXT_AFTER_JOIN --project-id "demo" --table-name ta --column-name ID --host http://192.168.3.20:8080
./brokerctl grant bob PLAINTEXT_AFTER_GROUP_BY --project-id "demo" --table-name ta --column-name credit_rank --host http://192.168.3.20:8080
./brokerctl grant bob PLAINTEXT_AFTER_AGGREGATE --project-id "demo" --table-name ta --column-name income --host http://192.168.3.20:8080
./brokerctl grant bob PLAINTEXT_AFTER_COMPARE --project-id "demo" --table-name ta --column-name age --host http://192.168.3.20:8080./brokerctl grant bob PLAINTEXT --project-id "demo" --table-name tb --column-name ID --host http://192.168.3.58:8080
./brokerctl grant bob PLAINTEXT --project-id "demo" --table-name tb --column-name order_amount --host http://192.168.3.58:8080
./brokerctl grant bob PLAINTEXT --project-id "demo" --table-name tb --column-name is_active --host http://192.168.3.58:8080./brokerctl grant alice PLAINTEXT_AFTER_JOIN --project-id "demo" --table-name tb --column-name ID --host http://192.168.3.58:8080
./brokerctl grant alice PLAINTEXT_AFTER_COMPARE --project-id "demo" --table-name tb --column-name is_active --host http://192.168.3.58:8080
./brokerctl grant alice PLAINTEXT_AFTER_AGGREGATE --project-id "demo" --table-name tb --column-name order_amount --host http://192.168.3.58:8080./brokerctl get ccl  --project-id "demo" --parties alice --host http://192.168.3.20:8080
./brokerctl get ccl  --project-id "demo" --parties bob --host http://192.168.3.20:8080

3.5、执行查询

./brokerctl run "SELECT ta.credit_rank, COUNT(*) as cnt, AVG(ta.income) as avg_income, AVG(tb.order_amount) as avg_amount FROM ta INNER JOIN tb ON ta.ID = tb.ID WHERE ta.age >= 20 AND ta.age <= 30 AND tb.is_active=1 GROUP BY ta.credit_rank;"  --project-id "demo" --host http://192.168.3.20:8080 --timeout 3

结果:

run query succeeded
Warning : for safety, we filter the results for groups which contain less than 4 items.
[fetch]
2 rows in set: (1.168158633s)
+-------------+-----+--------------------+--------------------+
| credit_rank | cnt |     avg_income     |     avg_amount     |
+-------------+-----+--------------------+--------------------+
|           5 |   6 | 18069.775970458984 | 7743.3486404418945 |
|           6 |   4 |  336016.8591003418 |  5499.404067993164 |
+-------------+-----+--------------------+--------------------+

四、Q&A

4.1、docker-compose版本

  • docker compose up -d 是 Docker Compose 2.x 版本及以上的写法,它会根据当前目录下的 docker-compose.yml 文件来启动容器。
  • docker-compose up -d 是 Docker Compose 1.x 版本的写法,同样也是根据当前目录下的 docker-compose.yml 文件来启动容器。

两者的作用完全相同,只是写法不同,取决于使用的 Docker Compose 版本。

4.2、SCQLBroker连不上数据库

$ docker logs -f scql-p2p_broker_1
Failed to create broker db: dial tcp 172.32.137.4:3306: connect: connection refused

等待自动重启即可。

4.3、找不到私钥

$ docker logs -f scql-p2p_broker_1
Failed to create app: private key path and content are both empty, provide at least one

需要检查文档版本是否一致。比如官方文档参考的版本是0.5.0b2,与当前最新0.6.0b1在配置上的区别是,config.yml中关于私钥文件路径的配置项名称:

  • 0.5.0b2 版本中是private_pem_path
  • 0.6.0b1 版本中是private_key_path

所以可能会出现找不到私钥的问题。也可以根据报错日志和源码定位到。

4.4、执行查询建立会话失败

./brokerctl run "SELECT ta.credit_rank, COUNT(*) as cnt, AVG(ta.income) as avg_income, AVG(tb.order_amount) as avg_amount FROM ta INNER JOIN tb ON ta.ID = tb.ID WHERE ta.age >= 20 AND ta.age <= 30 AND tb.is_active=1 GROUP BY ta.credit_rank;"  --project-id "demo" --host http://192.168.3.20:8080 --timeout 3
Error: run query: DoQuery response: {"status": {"code": 320,"message": "RunExecutionPlan create session(bd2ac9f7-0139-11ef-b669-0242ac208902) failed, catch std::exception=[engine/link/mux_link_factory.cc:192] send failed: link_id=bd2ac9f7-0139-11ef-b669-0242ac208902 sender_rank=0 send key=connect_0\u0001\u00020, peer failed code=1, message=dispatch error, link_id=bd2ac9f7-0139-11ef-b669-0242ac208902, error=[Enforce fail at engine/link/listener.cc:34] iter != channels_.end(). channel for rank:0 not exist\nStacktrace:\n#0 scql::engine::MuxReceiverServiceImpl::Push()+0x55850066ac88\n#1 brpc::policy::ProcessRpcRequest()+0x558503497d56\n#2 brpc::ProcessInputMessage()+0x55850348e06b\n#3 brpc::InputMessenger::OnNewMessages()+0x55850348f6fc\n#4 brpc::Socket::ProcessEvent()+0x558503591fd2\n#5 bthread::TaskGroup::task_runner()+0x5585035f17cf\n#6 bthread_make_fcontext+0x5585035db781\n. "}
}

注意将config.yml里的engine.uris.for_self中的engine改为实际ip。且注意不要在ip之前再加http://,否则最后执行查询会报错提示无效的字符%2F

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

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

相关文章

python实现钉钉通讯录导出Excel表

Python工具开源专栏 Py0004 python实现钉钉通讯录导出Excel表 Python工具开源专栏前言目录结构部分演示完整代码已在GitHub上开源前言 需求来源于公司,需要将钉钉通讯录以Excel表的形式导出到本地,方便定期备份。导出的Excel需要处理钉钉用户兼任多部门的数据问题。功能大致如…

【C语言】手撕二叉树

标题&#xff1a;【C语言】手撕二叉树 水墨不写bug 正文开始&#xff1a; 二叉树是一种基本的树形数据结构&#xff0c;对于初学者学习树形结构而言较容易接受。二叉树作为一种数据结构&#xff0c;在单纯存储数据方面没有 顺序表&#xff0c;链表&#xff0c;队列等线性结构…

Pointnet++改进卷积系列:全网首发DynamicConv |即插即用,提升特征提取模块性能

简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入DynamicConv,提升性能。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一 2.2 步骤二

菜鸟Java面向对象 2. Java 重写(Override)与重载(Overload)

Java 重写(Override)与重载(Overload) Java 重写与重载 Java 重写(Override)与重载(Overload)1. 重写(Override)1. 概念解释&#xff1a;2. 好处说明3. 异常规则处理 2. 方法的重写规则3. Super 关键字的使用4. 重载(Overload)**重载规则:**实例 5. 重写与重载之间的区别总结 1…

ReclaiMe Pro:丢失分区的恢复方法

天津鸿萌科贸发展有限公司是 ReclaiMe Pro 数据恢复软件的授权代理商。 ReclaiMe Pro 的分区恢复功能 ReclaiMe Pro 提供专业的分区恢复功能&#xff0c;支持从各种文件系统中搜索丢失和损坏的分区&#xff0c;例如 FAT、exFAT、NTFS、EXT、XFS 和 VMFS。 ReclaiMe Pro 启动…

Windows系统 清除本地maven仓库无用的 _remote.repositories、sha1、lastUpdated相关的文件

Windows系统 清除本地maven仓库无用的 _remote.repositories、sha1、lastUpdated相关的文件 脚本命令&#xff1a; set REPOSITORY_PATH 你自己本地maven仓库地址 rem starting... for /f "delims" %%i in (dir /b /s "%REPOSITORY_PATH%\*_remote.repositori…

什么是手机运营商三要素验证API接口

手机运营商三要素验证API接口又叫手机运营商三要素核验API接口&#xff0c;指的是输入姓名、身份证号码及手机号&#xff0c;通过运营商数据库实时校验此三项是否匹配。手机运营商三要素核验API接口广泛用于实名注册、风控审核等场景&#xff0c;如电商、直播、游戏、金融等。接…

复杂算子onnx导出(4):执行图的构建

文章目录 1. 执行图构建1.1 执行图构建1.2 执行图推理1.3 推理案例1.3.1 节点和engine的构建1.3.2 利用engine推理2. onnx解析并创建执行图2.1 onnx 转执行图并推理2.2 完整的代码前面几节已经介绍如何将带有复杂算子如 spconv导出 onnx,接下来如何对导出的onnx进行推理。带…

hashlib模块

【一】什么是摘要算法 Python的hashlib提供了常见的摘要算法 如MD5 SHA1等等。 摘要算法又称哈希算法、散列算法。 它通过一个函数&#xff0c;把任意长度的数据转换为一个长度固定的数据串&#xff08;通常用16进制的字符串表示&#xff09;。 摘要算法就是通过摘要函数f()对…

Leetcode刷题之链表小结(1)|92反转链表|206反转链表

TOC 小结 1. 如何反转某一个节点的指向? 206反转链表(简单)的递归解法——该方法的理念是: 若节点k1到节点m已经被反转&#xff0c;而我们当前处于k位置&#xff0c;那么我们希望k1指向k, 体现在以下代码的head->next->next head;这一句,可以记做一种常用的反转单个…

AI+招聘,激活企业的「新质生产力」

两会以来&#xff0c;「新质生产力」成为热词。而所谓的新质生产力&#xff0c;是创新起主导作用&#xff0c;摆脱传统经济增长方式、生产力发展路径&#xff0c;具有高科技、高效能、高质量特征&#xff0c;符合新发展理念的先进生产力质态。新质之「新」&#xff0c;很重要的…

4-19 算法思路总结

leetcode 98 验证二叉搜索树 利用递归算法&#xff0c;从上而下递归&#xff0c;遇到false直接返回无需递归到叶子节点&#xff0c;从上往下递归时&#xff0c;传递并改变两个参数&#xff0c;对于当前节点的最大值以及最小值&#xff0c;对于根节点来说&#xff0c;初始化的最…

wandb注册 wandb: ERROR api_key

wandb: ERROR api_key not configured (no-tty). call wandb.login(key[your_api_key]) Traceback (most recent call last): 背景 使用yolov8训练时 在pycharm中出现wandb账号未注册错误 Transferred 355/355 items from pretrained weights TensorBoard: Start with tensor…

平衡二叉树(AVLTree)

AVLTree 1、树的分类2、平衡二叉树2.1、构建一个平衡二叉树2.2、删除节点2.3、搜索方式2.3.1、广度优先搜索&#xff08;BFS&#xff09;2.3.2、深度优先搜索&#xff08;DFS&#xff09; 1、树的分类 树形结构是编程当中特别常见的一种数据结构。比如电脑中的文件管理系统就大…

(超级详细)JAVA之Stream流分析-------持续更新喔!!!

学习目标&#xff1a; 掌握 Java Stream流的相关api 掌握 Java Stream流的基本实现 掌握 java Stream流的使用场景 代码已经整理上传到了gitee中&#xff0c;有需要的小伙伴可以取查看一下源码点个小心心喔 大家也可以帮我提交一点案例喔&#xff01;&#xff01;&#xff01;&…

Springboot+vue的高校毕业与学位资格审核系统。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的高校毕业与学位资格审核系统。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#x…

SpringMVC interceptor有时候配置的时候path=“/**“ 两个星号什么意思,与path=“/“以及path=“/*“什么区别

直接上案例&#xff1a; <mvc:interceptor> <mvc:mapping path"/**"/> <bean class"com.xuyang.interceptor.user.UserAuthInterceptor" /> </mvc:interceptor>/**的意思是所有文件夹及里面的子文件夹 /*是所有文件夹&#xff0c…

【QT进阶】Qt Web混合编程之使用ECharts显示各类折线图等

往期回顾 【QT进阶】Qt Web混合编程之QWebEngineView基本用法-CSDN博客 【QT进阶】Qt Web混合编程之CMake VS2019编译并使用QCefView&#xff08;图文并茂超详细版本&#xff09;-CSDN博客【QT进阶】Qt Web混合编程之html、 js的简单交互-CSDN博客 【QT进阶】Qt Web混合编程之使…

统一SQL 支持Oracle number/decimal/dec/numeric转换

统一SQL介绍 https://www.light-pg.com/docs/LTSQL/current/index.html 源和目标 源数据库&#xff1a;Oracle 目标数据库&#xff1a;Postgresql&#xff0c;TDSQL-MySQL&#xff0c;达梦8&#xff0c;LightDB-Oracle 操作目标 通过统一SQL&#xff0c;将Oracle中的numb…

【MATLAB源码-第196期】基于matlab的A*融合DWA算法栅格路径规划仿真,画出路径图、姿态角度以及线角速度。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 A算法与DWA算法的融合是一个高效的路径规划策略&#xff0c;这种策略将A算法的全局路径规划能力与DWA算法的局部避障能力结合起来&#xff0c;以期达到更快、更安全的导航效果。以下是对这种融合策略的详细描述。 一、基本概…