thegraph部署子图到私有节点macos
因为要搞的链是thegraph托管服务不支持的链(托管服务不支持的链或私有链),所以需要部署一个thegraph私有节点去同步链的信息,给subgraph查询提供服务。
必要信息:
- 你的链的rpc节点
一、部署thegraph私有节点
首先参考了剖析DeFi借贷产品之Compound:Subgraph篇
若要自己搭建私有节点,可按照 Github 上的 graph-node 项目的说明进行部署。其 Github 地址为:
https://github.com/graphprotocol/graph-node
部署 graph-node 也有两种方式,一是 README 上所描述的步骤,二是用 Docker 进行部署。两种方式我都尝试过,但第一种方式以失败告终,多次尝试解决问题依然无果,第二种方式很快就成功了,所以我强烈推荐用 Docker 方式进行部署。
首先,在需要部署的服务器安装好 docker 和 docker-compose。
其次,打开 graph-node/docker/docker-compose.yml 文件,修改其中一行:
ethereum: ‘mainnet:http://host.docker.internal:8545’
该行指定了使用的网络和节点,比如,我部署接入 kovan 网络,节点使用 infura 的,那设置的值为:
ethereum: ‘kovan:https://kovan.infura.io/v3/<PROJECT_ID>’
其中,<PROJECT_ID> 是在 infura 注册项目时所分配的项目ID。
果断决定使用docker-compose 的方法进行部署。
然后找到thegraph Github 地址,按着说明进行部署,因为我是mac所以决定先用mac的方式进行部署
新建一个文件夹,
git clone https://github.com/graphprotocol/graph-node
然后进入到docker 目录,按一下步骤进行。
# Remove the original image
docker rmi graphprotocol/graph-node:latest# Build the image
./docker/build.sh# Tag the newly created image
docker tag graph-node graphprotocol/graph-node:latest
在进行./docker/build.sh 可能会出现错误,这个时候我是编译出来了两个镜像:没有graph-node
hanpeng@hanpeng docker % docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
graph-node-debug latest 21cbe2b289ad 30 minutes ago 3.06GB
graph-node-build latest c90de47737e2 32 minutes ago 3.02GB
但是多试几次,没有报错的时候是三个
然后将graph-node tag一下(与docker-compose 文件中的services:
graph-node:
image: graphprotocol/graph-node
对应)
hanpeng@hanpeng docker % docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
graph-node-debug latest 02367ba98882 2 days ago 3.06GB
graph-node latest fcb4f4e89bf1 2 days ago 204MB
graphprotocol/graph-node latest fcb4f4e89bf1 2 days ago 204MB
graph-node-build latest bb5c56a1ae88 2 days ago 3.02GB
再然后修改docker-compose文件中
ethereum: 'mainnet:http://host.docker.internal:8545'
改为你要监控的链的rpc节点信息:
ethereum: 'rangersprotocl:https://robin.rangersprotocol.com/api/jsonrpc'
在这里是有疑惑的,因为这个配置开头是ethereum,虽然这里说可以任意repalce但是具体怎么replace,哪些是关键字,有没有校验,并没有说明。
而且后边还有一个rpc节点的名称,不知道怎么填。
索性就还按ethereum这样填了,然后后边的rpc节点名称就用我使用的公链名填,还填错了,(我们用的是rangersprotocol,我填的是rangersprotocl,少了一个o,由此可见,这些并没有规定和校验,只是一个用作标识符的名字)
但是你这里怎么填,后边子图的subgraph.yaml要对应上,不然subgraph会找不到thegraph节点。
修改结束后,就可以docker-compose up -d 启动了。
docker-compose ps 看一下:
hanpeng@hanpeng docker % docker-compose psName Command State Ports
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
docker_graph-node_1 /bin/sh -c start Up 0.0.0.0:8000->8000/tcp, 0.0.0.0:8001->8001/tcp, 0.0.0.0:8020->8020/tcp, 0.0.0.0:8030->8030/tcp, 0.0.0.0:8040->8040/tcp
docker_ipfs_1 /sbin/tini -- /usr/local/b ... Up 4001/tcp, 4001/udp, 0.0.0.0:5001->5001/tcp, 8080/tcp, 8081/tcp
docker_postgres_1 docker-entrypoint.sh postg ... Up 0.0.0.0:5432->5432/tcp
服务都起来了。
接下来就是将子图部署到graph私有节点了。
二、准备合约
- 准备一个合约,将合约编译获得ABI
- 部署合约,获得合约地址
我这里还是用的之前写的game那个合约,参考:thegraph subgraph 踩坑之入门青铜
将合约部署到你的rpc节点对应的的链上,不要粗心搞错了。
三、部署子图到私有节点
1:准备子图
这里要参考一篇官方文章:https://thegraph.academy/developers/local-development/
我们参考文章里的3和5
graph-cli我已经安装过了,我从3.B开始。
graph init --from-example MetaverseMan/gameonrangers
然后修改subgraph.yaml,schema.graphql,package.json这三个文件。(还需要将ABI文件和Game.ts文件复制粘贴到对应目录)
我这里是用之前已经修改好的文件直接替换了subgraph.yaml和schema.graphql(将原来的重命名为别的),其中subgraph.yaml这里要注意:
network要和你启动thegraph私有节点的docker-compose文件里网络分类一致,我这里就将错就错,填rangersprotocl。
一定记得修改package.json
我把这种
--ipfs https://api.thegraph.com/ipfs/ --node https://api.thegraph.com/deploy/
都替换成了对应的
--ipfs http://127.0.0.1:5001 --node http://127.0.0.1:8020
但其实你只要修改create-local和deploy-local就行了。
我的:
{"name": "gameonrangers","version": "0.1.0","scripts": {"build-contract": "solc contracts/Gravity.sol --abi -o abis --overwrite && solc contracts/Gravity.sol --bin -o bin --overwrite","create": "graph create MetaverseMan/gameonrangers --node http://127.0.0.1:8020","create-local": "graph create MetaverseMan/gameonrangers --node http://127.0.0.1:8020","codegen": "graph codegen","build": "graph build","deploy": "graph deploy MetaverseMan/gameonrangers --ipfs http://127.0.0.1:5001 --node http://127.0.0.1:8020","deploy-local": "graph deploy MetaverseMan/gameonrangers --node http://127.0.0.1:8020 --ipfs http://127.0.0.1:5001"},"devDependencies": {"@graphprotocol/graph-cli": "^0.30.2","@graphprotocol/graph-ts": "^0.27.0"},"dependencies": {"babel-polyfill": "^6.26.0","babel-register": "^6.26.0","truffle": "^5.0.4","truffle-contract": "^4.0.5","truffle-hdwallet-provider": "^1.0.4"}
}
修改完成后,就可以部署子图了。
2:部署子图
在你的子图项目的根目录参考https://thegraph.academy/developers/local-development/的5,运行命令行。主要有以下命令
1:sed -i -e 's/0x2E645469f354BB4F5c8a05B3b30A929361cf77eC/0xb6cB9fed7d82Aa788ffE6c2173798433D0f28b20/g' subgraph.yaml
2: yarn codegen
3: yarn create-local
4: yarn deploy-local
也可以在codegen之后加上yarn build
hanpeng@hanpeng gameonrangers % sed -i -e 's/0x2E645469f354BB4F5c8a05B3b30A929361cf77eC/0xb6cB9fed7d82Aa788ffE6c2173798433D0f28b20/g' subgraph.yaml
hanpeng@hanpeng gameonrangers % yarn codegen
yarn run v1.22.18
warning ../../../../package.json: No license field
$ graph codegenSkip migration: Bump mapping apiVersion from 0.0.1 to 0.0.2Skip migration: Bump mapping apiVersion from 0.0.2 to 0.0.3Skip migration: Bump mapping apiVersion from 0.0.3 to 0.0.4Skip migration: Bump mapping apiVersion from 0.0.4 to 0.0.5Skip migration: Bump mapping apiVersion from 0.0.5 to 0.0.6Skip migration: Bump manifest specVersion from 0.0.1 to 0.0.2Skip migration: Bump manifest specVersion from 0.0.2 to 0.0.4
✔ Apply migrations
✔ Load subgraph from subgraph.yamlLoad contract ABI from abis/Game.json
✔ Load contract ABIsGenerate types for contract ABI: Game (abis/Game.json)Write types to generated/Game/Game.ts
✔ Generate types for contract ABIs
✔ Generate types for data source templates
✔ Load data source template ABIs
✔ Generate types for data source template ABIs
✔ Load GraphQL schema from schema.graphqlWrite types to generated/schema.ts
✔ Generate types for GraphQL schemaTypes generated successfully✨ Done in 3.01s.
hanpeng@hanpeng gameonrangers % yarn create-local
yarn run v1.22.18
warning ../../../../package.json: No license field
$ graph create MetaverseMan/gameonrangers --node http://127.0.0.1:8020
Created subgraph: MetaverseMan/gameonrangers
✨ Done in 1.68s.
hanpeng@hanpeng gameonrangers % yarn deploy-local
yarn run v1.22.18
warning ../../../../package.json: No license field
$ graph deploy MetaverseMan/gameonrangers --node http://127.0.0.1:8020 --ipfs http://127.0.0.1:5001
? Version Label (e.g. v0.0.1) › (node:98385) ExperimentalWarning: The Fetch API is an experimental feature. This feature could change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
✔ Version Label (e.g. v0.0.1) · Skip migration: Bump mapping apiVersion from 0.0.1 to 0.0.2Skip migration: Bump mapping apiVersion from 0.0.2 to 0.0.3Skip migration: Bump mapping apiVersion from 0.0.3 to 0.0.4Skip migration: Bump mapping apiVersion from 0.0.4 to 0.0.5Skip migration: Bump mapping apiVersion from 0.0.5 to 0.0.6Skip migration: Bump manifest specVersion from 0.0.1 to 0.0.2Skip migration: Bump manifest specVersion from 0.0.2 to 0.0.4
✔ Apply migrations
✔ Load subgraph from subgraph.yamlCompile data source: Game => build/Game/Game.wasm
✔ Compile subgraphCopy schema file build/schema.graphqlWrite subgraph file build/Game/abis/Game.jsonWrite subgraph manifest build/subgraph.yaml
✔ Write compiled subgraph to build/Add file to IPFS build/schema.graphql.. Qmc8mBqzRArjzreqnyBF4PEargATRKuaLesmGm7vbXALQ8Add file to IPFS build/Game/abis/Game.json.. QmapPy7RyHEGVX7Fpp8ZgjdeeDXGN3JA2xnvJzbV78R2rPAdd file to IPFS build/Game/Game.wasm.. QmdW8vg7vvPJBXnPxx3dQURBdi3Peq3yiKCJSdbYsjdddG
✔ Upload subgraph to IPFSBuild completed: QmQpLfGm4PB1UUDS4f5YB5R8RqCJszR9oiSLBJGgMN2263Deployed to http://127.0.0.1:8000/subgraphs/name/MetaverseMan/gameonrangers/graphqlSubgraph endpoints:
Queries (HTTP): http://127.0.0.1:8000/subgraphs/name/MetaverseMan/gameonrangers✨ Done in 121.49s.
这里有一个小坑:
在执行yarn deploy-local后,是一个问号开头的log这里需要按一下enter键!!!
丫的,我以为跟上边一样呢,直接打印执行结果,或者就进入了一个进程,占用了一个窗口。但其实是需要按enter键确认,我每次都是等结果,没反应,然后就ctrl+c结束掉了。
另外 两个网络的名字一定要一致不然是会有以下错误:
最后终于成功!
hanpeng@hanpeng gameonrangers % yarn deploy-local
yarn run v1.22.18
warning ../../../../package.json: No license field
$ graph deploy MetaverseMan/gameonrangers --node http://127.0.0.1:8020 --ipfs http://127.0.0.1:5001
? Version Label (e.g. v0.0.1) › (node:98385) ExperimentalWarning: The Fetch API is an experimental feature. This feature could change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
✔ Version Label (e.g. v0.0.1) · Skip migration: Bump mapping apiVersion from 0.0.1 to 0.0.2Skip migration: Bump mapping apiVersion from 0.0.2 to 0.0.3Skip migration: Bump mapping apiVersion from 0.0.3 to 0.0.4Skip migration: Bump mapping apiVersion from 0.0.4 to 0.0.5Skip migration: Bump mapping apiVersion from 0.0.5 to 0.0.6Skip migration: Bump manifest specVersion from 0.0.1 to 0.0.2Skip migration: Bump manifest specVersion from 0.0.2 to 0.0.4
✔ Apply migrations
✔ Load subgraph from subgraph.yamlCompile data source: Game => build/Game/Game.wasm
✔ Compile subgraphCopy schema file build/schema.graphqlWrite subgraph file build/Game/abis/Game.jsonWrite subgraph manifest build/subgraph.yaml
✔ Write compiled subgraph to build/Add file to IPFS build/schema.graphql.. Qmc8mBqzRArjzreqnyBF4PEargATRKuaLesmGm7vbXALQ8Add file to IPFS build/Game/abis/Game.json.. QmapPy7RyHEGVX7Fpp8ZgjdeeDXGN3JA2xnvJzbV78R2rPAdd file to IPFS build/Game/Game.wasm.. QmdW8vg7vvPJBXnPxx3dQURBdi3Peq3yiKCJSdbYsjdddG
✔ Upload subgraph to IPFSBuild completed: QmQpLfGm4PB1UUDS4f5YB5R8RqCJszR9oiSLBJGgMN2263Deployed to http://127.0.0.1:8000/subgraphs/name/MetaverseMan/gameonrangers/graphqlSubgraph endpoints:
Queries (HTTP): http://127.0.0.1:8000/subgraphs/name/MetaverseMan/gameonrangers✨ Done in 121.49s.
docker-compose logs -f 日志如下:
graph-node_1 | Sep 21 08:13:10.888 INFO Syncing 2 blocks from Ethereum, code: BlockIngestionStatus, blocks_needed: 2, blocks_behind: 2, latest_block_head: 23801503, current_block_head: 23801501, provider: rangersprotocl-rpc-0, component: BlockIngestor
graph-node_1 | Sep 21 08:13:12.879 INFO Syncing 2 blocks from Ethereum, code: BlockIngestionStatus, blocks_needed: 2, blocks_behind: 2, latest_block_head: 23801505, current_block_head: 23801503, provider: rangersprotocl-rpc-0, component: BlockIngestor
graph-node_1 | Sep 21 08:13:14.007 INFO Resolve schema, link: /ipfs/Qmc8mBqzRArjzreqnyBF4PEargATRKuaLesmGm7vbXALQ8, sgd: 0, subgraph_id: QmQpLfGm4PB1UUDS4f5YB5R8RqCJszR9oiSLBJGgMN2263, component: SubgraphRegistrar
graph-node_1 | Sep 21 08:13:14.008 INFO Resolve data source, source_start_block: 0, source_address: Some(0xb6cb9fed7d82aa788ffe6c2173798433d0f28b20), name: Game, sgd: 0, subgraph_id: QmQpLfGm4PB1UUDS4f5YB5R8RqCJszR9oiSLBJGgMN2263, component: SubgraphRegistrar
graph-node_1 | Sep 21 08:13:14.008 INFO Resolve mapping, link: /ipfs/QmdW8vg7vvPJBXnPxx3dQURBdi3Peq3yiKCJSdbYsjdddG, sgd: 0, subgraph_id: QmQpLfGm4PB1UUDS4f5YB5R8RqCJszR9oiSLBJGgMN2263, component: SubgraphRegistrar
graph-node_1 | Sep 21 08:13:14.008 INFO Resolve ABI, link: /ipfs/QmapPy7RyHEGVX7Fpp8ZgjdeeDXGN3JA2xnvJzbV78R2rP, name: Game, sgd: 0, subgraph_id: QmQpLfGm4PB1UUDS4f5YB5R8RqCJszR9oiSLBJGgMN2263, component: SubgraphRegistrar
graph-node_1 | Sep 21 08:13:14.013 INFO Set subgraph start block, block: None, sgd: 0, subgraph_id: QmQpLfGm4PB1UUDS4f5YB5R8RqCJszR9oiSLBJGgMN2263, component: SubgraphRegistrar
graph-node_1 | Sep 21 08:13:14.013 INFO Graft base, block: None, base: None, sgd: 0, subgraph_id: QmQpLfGm4PB1UUDS4f5YB5R8RqCJszR9oiSLBJGgMN2263, component: SubgraphRegistrar
graph-node_1 | Sep 21 08:13:14.714 INFO Starting subgraph writer, queue_size: 5, sgd: 1, subgraph_id: QmQpLfGm4PB1UUDS4f5YB5R8RqCJszR9oiSLBJGgMN2263, component: SubgraphInstanceManager
graph-node_1 | Sep 21 08:13:14.732 INFO Resolve subgraph files using IPFS, sgd: 1, subgraph_id: QmQpLfGm4PB1UUDS4f5YB5R8RqCJszR9oiSLBJGgMN2263, component: SubgraphInstanceManager
graph-node_1 | Sep 21 08:13:14.732 INFO Resolve schema, link: /ipfs/Qmc8mBqzRArjzreqnyBF4PEargATRKuaLesmGm7vbXALQ8, sgd: 1, subgraph_id: QmQpLfGm4PB1UUDS4f5YB5R8RqCJszR9oiSLBJGgMN2263, component: SubgraphInstanceManager
graph-node_1 | Sep 21 08:13:14.733 INFO Resolve data source, source_start_block: 0, source_address: Some(0xb6cb9fed7d82aa788ffe6c2173798433d0f28b20), name: Game, sgd: 1, subgraph_id: QmQpLfGm4PB1UUDS4f5YB5R8RqCJszR9oiSLBJGgMN2263, component: SubgraphInstanceManager
graph-node_1 | Sep 21 08:13:14.733 INFO Resolve mapping, link: /ipfs/QmdW8vg7vvPJBXnPxx3dQURBdi3Peq3yiKCJSdbYsjdddG, sgd: 1, subgraph_id: QmQpLfGm4PB1UUDS4f5YB5R8RqCJszR9oiSLBJGgMN2263, component: SubgraphInstanceManager
graph-node_1 | Sep 21 08:13:14.733 INFO Resolve ABI, link: /ipfs/QmapPy7RyHEGVX7Fpp8ZgjdeeDXGN3JA2xnvJzbV78R2rP, name: Game, sgd: 1, subgraph_id: QmQpLfGm4PB1UUDS4f5YB5R8RqCJszR9oiSLBJGgMN2263, component: SubgraphInstanceManager
graph-node_1 | Sep 21 08:13:14.734 INFO Successfully resolved subgraph files using IPFS, sgd: 1, subgraph_id: QmQpLfGm4PB1UUDS4f5YB5R8RqCJszR9oiSLBJGgMN2263, component: SubgraphInstanceManager
graph-node_1 | Sep 21 08:13:14.734 INFO Data source count at start: 1, sgd: 1, subgraph_id: QmQpLfGm4PB1UUDS4f5YB5R8RqCJszR9oiSLBJGgMN2263, component: SubgraphInstanceManager
graph-node_1 | Sep 21 08:13:14.870 INFO Syncing 2 blocks from Ethereum, code: BlockIngestionStatus, blocks_needed: 2, blocks_behind: 2, latest_block_head: 23801507, current_block_head: 23801505, provider: rangersprotocl-rpc-0, component: BlockIngestor
graph-node_1 | Sep 21 08:13:15.857 INFO Scanning blocks [0, 0], range_size: 1, sgd: 1, subgraph_id: QmQpLfGm4PB1UUDS4f5YB5R8RqCJszR9oiSLBJGgMN2263, component: BlockStream
graph-node_1 | Sep 21 08:13:17.478 INFO Syncing 2 blocks from Ethereum, code: BlockIngestionStatus, blocks_needed: 2, blocks_behind: 2, latest_block_head: 23801509, current_block_head: 23801507, provider: rangersprotocl-rpc-0, component: BlockIngestor
在这Queries (HTTP): http://127.0.0.1:8000/subgraphs/name/MetaverseMan/gameonrangers
去查显示还未同步
等了两个小时还是未同步,看来还是有毛病。。。解决这个问题的在这篇文章可以找到query execution failed: Subgraph has not started syncing yet. Wait for it to ingest a few blocks before querying it
另外:你的合约部署的块的高度一定要大于你私有节点同步的起始高度。也就是必须要先部署私有节点然后再部署合约,因为私有节点不会同步你部署之前的区块,可以看这个github issue:subgraph can’t fetch history block #3793
其实可以通过docker-compose logs 很容易看到私有节点同步的起始节点和正在同步的进度。
先写到这 后续补充!
(有用就给我点个赞,email
thegraph部署子图到私有节点macos相关推荐
- 使用Helm在k8s集群上部署以太坊私有链
一.概述 二.部署流程 三.问题记录 四.部署检查 五.参考 一.概述 使用k8s官方的包管理工具helm部署以太坊私有链并启动三类节点和一个前端服务: bootnode: used for Geth ...
- 【Openstack】实录手动部署Openstack Rocky 双节点(6)- Horizon
第一篇:手动部署Openstack Rocky 双节点(1)- 基础服务 上一篇:手动部署Openstack Rocky 双节点(5)- Neutron 下一篇:无 文章目录 参考文档 关于机器名变更 ...
- 【Openstack】实录手动部署Openstack Rocky 双节点(5)- Neutron
第一篇:手动部署Openstack Rocky 双节点(1)- 基础服务 上一篇:手动部署Openstack Rocky 双节点(4)- Nova 下一篇:手动部署Openstack Rocky 双节 ...
- 【Openstack】实录手动部署Openstack Rocky 双节点(4)- Nova
第一篇:实录手动部署Openstack Rocky 双节点(1)- 基础服务 上一篇:实录手动部署Openstack Rocky 双节点(3)- Glance 下一篇:实录手动部署Openstack ...
- 【Openstack】实录手动部署Openstack Rocky 双节点(3)- Glance
第一篇:实录手动部署Openstack Rocky 双节点(1)- 基础服务 上一篇:实录手动部署Openstack Rocky 双节点(2)- Keystone 下一篇:手动部署Openstack ...
- 【Openstack】实录手动部署Openstack Rocky 双节点(2)- Keystone
第一篇:实录手动部署Openstack Rocky 双节点(1)- 基础服务 上一篇:实录手动部署Openstack Rocky 双节点(1)- 基础服务 下一篇:手动部署Openstack Rock ...
- 【Openstack】实录手动部署Openstack Rocky 双节点(1)- 基础服务
第一篇:本文 上一篇:无 下一篇:实录手动部署Openstack Rocky 双节点(2)- Keystone 文章目录 参考文档 虚拟机准备 OS准备 controller虚拟机 compute虚拟 ...
- CEPH概述及实验(CEPH部署及群集搭建+节点扩容+数据恢复)
前言:CEPH是一个开源的项目,它是软件定义的.同一的存储解决方案.CEPH是一个可大规模扩展.高性能并且无单点故障的分布式存储系统.从一开始它就运行在通用的商用的硬件上,具有高度的可伸缩性,容量可扩 ...
- 本地搭建以太坊私有节点网络
背景介绍 以太坊开发必须需要节点,虽然已经拥有了测试网的节点,但是我们还是最好搭建一个我们自己的本地节点,对于底层开发就更需要节点了,所以我们最好还是搭建本地节点. 环境需求 VMWare软件 ubu ...
最新文章
- 从上云到云管,只差一名青云“最佳小助手”
- vue 修改模板{{}}标签_详解Vue 动态添加模板的几种方法
- java知识点8——垃圾回收原理和算法、通用的分代垃圾回收机制、 JVM调优和Full GC、开发中容易造成内存泄露的操作
- go html vue,用Go+Vue.js快速搭建一个Web应用(初级demo)
- 2014\Province_C_C++_A\2 切面条
- 高新计算机office2010考试题库,注意!注意!计算机等级考试题库来啦:一级MS Office第三章“Word2010基础”...
- mysqll索引实验
- 数据挖掘概念与技术第三版第一章答案
- DBSCAN聚类算法原理总结
- openlayers学习——13、openlayers比例尺
- 【JZOJ B组】【NOI2002】贪吃的九头龙
- 人社部通知!2020年社保基数大调整、公积金必须同时缴纳、医保账户取消…
- Efficient Dense Frontier Detection for 2D Graph SLAM Based on Occupancy Grid Submaps
- 第十三章 相关方管理 权利利益方格 凸显模式 相关方立方体 相关方登记册 相关方参与评估矩阵
- msapro-note
- 架构师小跟班:推荐一款Java在线诊断工具,arthas入门及使用教程
- DDD系列第五讲:聊聊如何避免写流水账代码
- keep T 不是 KG等级_宅家锻炼堪比健身房,一对一“私教”,Keep 智能动感单车体验...
- java获取内容为空_Java使用POI读取Word文档时如果文档内容为空时出现异常
- ZMQ 第四章 可靠的请求-应答模式
热门文章
- dnsmasq( DNS和DHCP)服务
- Gdal库计算形心方法。
- Born-Again Neural Networks论文初读
- 都不知道是不是resnet原始结构,keras实现....
- 赵小楼《天道》深度解析(69)不要执著于豆豆和书,或寻找高人。更多的是要在意内容、内容、内容。你掌握之后,你也是高人
- 新手选车系列之(八): 选车购车谨慎采取“一票否决制”
- 关于程序员这个职业缺点总结
- 中央民族大学计算机房,中央民族大学第九届大学生人文知识竞赛 暨北京市第九届大学生人文知识竞赛选拔赛通知...
- 转移到ios下载安卓_转移到ios下载-转移到IOS 安卓版v2.10.0-PC6安卓网
- clio7.0测试软件如何安装,clio珂莱欧气垫怎么换替换装?4个步骤轻松安装