因为要搞的链是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相关推荐

  1. 使用Helm在k8s集群上部署以太坊私有链

    一.概述 二.部署流程 三.问题记录 四.部署检查 五.参考 一.概述 使用k8s官方的包管理工具helm部署以太坊私有链并启动三类节点和一个前端服务: bootnode: used for Geth ...

  2. 【Openstack】实录手动部署Openstack Rocky 双节点(6)- Horizon

    第一篇:手动部署Openstack Rocky 双节点(1)- 基础服务 上一篇:手动部署Openstack Rocky 双节点(5)- Neutron 下一篇:无 文章目录 参考文档 关于机器名变更 ...

  3. 【Openstack】实录手动部署Openstack Rocky 双节点(5)- Neutron

    第一篇:手动部署Openstack Rocky 双节点(1)- 基础服务 上一篇:手动部署Openstack Rocky 双节点(4)- Nova 下一篇:手动部署Openstack Rocky 双节 ...

  4. 【Openstack】实录手动部署Openstack Rocky 双节点(4)- Nova

    第一篇:实录手动部署Openstack Rocky 双节点(1)- 基础服务 上一篇:实录手动部署Openstack Rocky 双节点(3)- Glance 下一篇:实录手动部署Openstack ...

  5. 【Openstack】实录手动部署Openstack Rocky 双节点(3)- Glance

    第一篇:实录手动部署Openstack Rocky 双节点(1)- 基础服务 上一篇:实录手动部署Openstack Rocky 双节点(2)- Keystone 下一篇:手动部署Openstack ...

  6. 【Openstack】实录手动部署Openstack Rocky 双节点(2)- Keystone

    第一篇:实录手动部署Openstack Rocky 双节点(1)- 基础服务 上一篇:实录手动部署Openstack Rocky 双节点(1)- 基础服务 下一篇:手动部署Openstack Rock ...

  7. 【Openstack】实录手动部署Openstack Rocky 双节点(1)- 基础服务

    第一篇:本文 上一篇:无 下一篇:实录手动部署Openstack Rocky 双节点(2)- Keystone 文章目录 参考文档 虚拟机准备 OS准备 controller虚拟机 compute虚拟 ...

  8. CEPH概述及实验(CEPH部署及群集搭建+节点扩容+数据恢复)

    前言:CEPH是一个开源的项目,它是软件定义的.同一的存储解决方案.CEPH是一个可大规模扩展.高性能并且无单点故障的分布式存储系统.从一开始它就运行在通用的商用的硬件上,具有高度的可伸缩性,容量可扩 ...

  9. 本地搭建以太坊私有节点网络

    背景介绍 以太坊开发必须需要节点,虽然已经拥有了测试网的节点,但是我们还是最好搭建一个我们自己的本地节点,对于底层开发就更需要节点了,所以我们最好还是搭建本地节点. 环境需求 VMWare软件 ubu ...

最新文章

  1. 从上云到云管,只差一名青云“最佳小助手”
  2. vue 修改模板{{}}标签_详解Vue 动态添加模板的几种方法
  3. java知识点8——垃圾回收原理和算法、通用的分代垃圾回收机制、 JVM调优和Full GC、开发中容易造成内存泄露的操作
  4. go html vue,用Go+Vue.js快速搭建一个Web应用(初级demo)
  5. 2014\Province_C_C++_A\2 切面条
  6. 高新计算机office2010考试题库,注意!注意!计算机等级考试题库来啦:一级MS Office第三章“Word2010基础”...
  7. mysqll索引实验
  8. 数据挖掘概念与技术第三版第一章答案
  9. DBSCAN聚类算法原理总结
  10. openlayers学习——13、openlayers比例尺
  11. 【JZOJ B组】【NOI2002】贪吃的九头龙
  12. 人社部通知!2020年社保基数大调整、公积金必须同时缴纳、医保账户取消…
  13. Efficient Dense Frontier Detection for 2D Graph SLAM Based on Occupancy Grid Submaps
  14. 第十三章 相关方管理 权利利益方格 凸显模式 相关方立方体 相关方登记册 相关方参与评估矩阵
  15. msapro-note
  16. 架构师小跟班:推荐一款Java在线诊断工具,arthas入门及使用教程
  17. DDD系列第五讲:聊聊如何避免写流水账代码
  18. keep T 不是 KG等级_宅家锻炼堪比健身房,一对一“私教”,Keep 智能动感单车体验...
  19. java获取内容为空_Java使用POI读取Word文档时如果文档内容为空时出现异常
  20. ZMQ 第四章 可靠的请求-应答模式

热门文章

  1. dnsmasq( DNS和DHCP)服务
  2. Gdal库计算形心方法。
  3. Born-Again Neural Networks论文初读
  4. 都不知道是不是resnet原始结构,keras实现....
  5. 赵小楼《天道》深度解析(69)不要执著于豆豆和书,或寻找高人。更多的是要在意内容、内容、内容。你掌握之后,你也是高人
  6. 新手选车系列之(八): 选车购车谨慎采取“一票否决制”
  7. 关于程序员这个职业缺点总结
  8. 中央民族大学计算机房,中央民族大学第九届大学生人文知识竞赛 暨北京市第九届大学生人文知识竞赛选拔赛通知...
  9. 转移到ios下载安卓_转移到ios下载-转移到IOS 安卓版v2.10.0-PC6安卓网
  10. clio7.0测试软件如何安装,clio珂莱欧气垫怎么换替换装?4个步骤轻松安装