Cosmos 基础教程(二)-- Run a Node, API, and CLI

news/2024/4/24 17:49:07/文章来源:https://blog.csdn.net/chinusyan/article/details/129120915

有很多不同的方法来运行Cosmos区块链的节点。您将探索如何使用simapp 进行此操作。

1、编译simapp

Cosmos SDK存储库包含一个名为 simapp 的文件夹。在这个文件夹中,您可以找到运行Cosmos SDK模拟版本的代码,这样您就可以在不实际与链交互的情况下测试命令。二进制文件称为simd,您将使用它与节点交互。

首先,创建目录并将其更改为cosmos文件夹,然后将cosmos-sdk repo复制到该文件夹中:

$ mkdir cosmos
$ cd cosmos
$ git clone https://github.com/cosmos/cosmos-sdk
$ cd cosmos-sdk

请确保您使用的是相同版本:

$ git checkout v0.42.6

然后构建cosmos-sdk:

$ make build

构建需要几分钟,并创建一个build 文件夹和一个名为simdsimapp二进制文件:

$ ls build

2、初始化 simapp

现在重置数据库。不仅在数据库已经初始化时运行此步骤,而且即使这是您第一次测试simapp:

$ cd build
$ ./simd unsafe-reset-all

命令输出列出了设置为初始状态的所有文件及其位置。
在这里插入图片描述
是时候初始化应用程序了。初始化创建了创世块和初始链状态:

$ ./simd init demo

在这里插入图片描述

一个更易读的版本:

{"app_message": {"auth": {"accounts": [ ], "params": {"max_memo_characters": "256", "sig_verify_cost_ed25519": "590", "sig_verify_cost_secp256k1": "1000", "tx_sig_limit": "7", "tx_size_cost_per_byte": "10"}}, "bank": {"balances": [ ], "denom_metadata": [ ], "params": {"default_send_enabled": true, "send_enabled": [ ]}, "supply": [ ]}, "capability": {"index": "1", "owners": [ ]}, "crisis": {"constant_fee": {"amount": "1000", "denom": "stake"}}, "distribution": {"delegator_starting_infos": [ ], "delegator_withdraw_infos": [ ], "fee_pool": {"community_pool": [ ]}, "outstanding_rewards": [ ], "params": {"base_proposer_reward": "0.010000000000000000", "bonus_proposer_reward": "0.040000000000000000", "community_tax": "0.020000000000000000", "withdraw_addr_enabled": true}, "previous_proposer": "", "validator_accumulated_commissions": [ ], "validator_current_rewards": [ ], "validator_historical_rewards": [ ], "validator_slash_events": [ ]}, "evidence": {"evidence": [ ]}, "genutil": {"gen_txs": [ ]}, "gov": {"deposit_params": {"max_deposit_period": "172800s", "min_deposit": [{"amount": "10000000", "denom": "stake"}]}, "deposits": [ ], "proposals": [ ], "starting_proposal_id": "1", "tally_params": {"quorum": "0.334000000000000000", "threshold": "0.500000000000000000", "veto_threshold": "0.334000000000000000"}, "votes": [ ], "voting_params": {"voting_period": "172800s"}}, "ibc": {"channel_genesis": {"ack_sequences": [ ], "acknowledgements": [ ], "channels": [ ], "commitments": [ ], "next_channel_sequence": "0", "receipts": [ ], "recv_sequences": [ ], "send_sequences": [ ]}, "client_genesis": {"clients": [ ], "clients_consensus": [ ], "clients_metadata": [ ], "create_localhost": false, "next_client_sequence": "0", "params": {"allowed_clients": ["06-solomachine", "07-tendermint"]}}, "connection_genesis": {"client_connection_paths": [ ], "connections": [ ], "next_connection_sequence": "0"}}, "mint": {"minter": {"annual_provisions": "0.000000000000000000", "inflation": "0.130000000000000000"}, "params": {"blocks_per_year": "6311520", "goal_bonded": "0.670000000000000000", "inflation_max": "0.200000000000000000", "inflation_min": "0.070000000000000000", "inflation_rate_change": "0.130000000000000000", "mint_denom": "stake"}}, "params": null, "slashing": {"missed_blocks": [ ], "params": {"downtime_jail_duration": "600s", "min_signed_per_window": "0.500000000000000000", "signed_blocks_window": "100", "slash_fraction_double_sign": "0.050000000000000000", "slash_fraction_downtime": "0.010000000000000000"}, "signing_infos": [ ]}, "staking": {"delegations": [ ], "exported": false, "last_total_power": "0", "last_validator_powers": [ ], "params": {"bond_denom": "stake", "historical_entries": 10000, "max_entries": 7, "max_validators": 100, "unbonding_time": "1814400s"}, "redelegations": [ ], "unbonding_delegations": [ ], "validators": [ ]}, "transfer": {"denom_traces": [ ], "params": {"receive_enabled": true, "send_enabled": true}, "port_id": "transfer"}, "upgrade": { }, "vesting": { }}, "chain_id": "test-chain-Hrbd7m", "gentxs_dir": "", "moniker": "demo", "node_id": "93d73b7f8fc1b74612146ba2342e54293c018b9a"
}

您可以在输出中找到chain_id,在我们的构建中,它恰好被称为test-chain-Hrbd7m。记下输出的名称,因为稍后将需要它来确定链 ID,通过标记--chain-id将其传递给simapp

您可以通过以下命令检查初始配置:

$ cat ~/.simapp/config/genesis.json

3、准备你的帐户(account)

It helps to understand the concepts clearly when working hands-on with the Cosmos SDK. Need a refresher? See the section on Accounts in the Main Concepts chapter.

在实际使用Cosmos SDK时,它有助于清楚地理解这些概念。需要复习吗?请参阅“主要概念”一章中的“帐户”部分。

你也可以检查你的keys。它们保存在后端密匙环中,默认情况下是操作系统的密匙环:

$ ./simd keys list

正如你所预料的,你还没有任何keys:

[]

在这里插入图片描述

现在你可以添加一个新key:

$ ./simd keys add d9lab

它输出类似于:

[root@localhost build]# ./simd keys add d9lab
Enter keyring passphrase:
password must be at least 8 characters
Enter keyring passphrase:
Re-enter keyring passphrase:- name: d9labtype: localaddress: cosmos12uj7a02737k7j0d53lhf2eectfktf78vl69de8pubkey: cosmospub1addwnpepq0z9q7hy5t050r85r6u9cqgr82uhadg4dx7my7ktgfx6ue4htlfwzg767zhmnemonic: ""threshold: 0pubkeys: []**Important** write this mnemonic phrase in a safe place.
It is the only way to recover your account if you ever forget your password.surface mom fiction tuna chase blanket work useful lucky confirm snap crystal peanut enrich sadness heavy voyage bachelor night crazy bargain original prefer else

您可以在上面输出的末尾看到助记符。这个单词序列是一个助记符,您可以使用它来恢复您的公钥和私钥。在生产环境中,助记符必须以可靠和保密的方式存储,作为密钥管理基础设施的一部分。

确认密钥已添加:

$ ./simd keys list
# 或
$ ./simd keys show d9lab

在这里插入图片描述

4、让自己成为一个合适的验证者

如前所述,Cosmos SDK区块链依赖于已识别的验证器来生成块。最初没有用于生成块的验证器。您处于进退两难的境地:初始化和未启动的链需要一个genesis帐户和验证器来进行引导。

让你的key,也就是账户,在创世文件中有一个初始余额:

$ ./simd add-genesis-account d9lab 100000000stake

这里附加在金额后面的是stake 后缀。根据创世文件,这个stake 代表这个链中tokens 的单位。因此,该命令将向您的帐户添加100000000 stake 。如果有疑问,你可以确认genesis.json文件中的正确后缀。

grep -A 2 -B 2 denom ~/.simapp/config/genesis.json

你也可以在创世纪文件中确认你有一个初始余额:

$ grep -A 10 balances ~/.simapp/config/genesis.json

尽管有这个初始余额,在你运行你的区块链之前,你仍然需要逃脱第22条军规,并将你的引导交易包含在genesis文件中。

在这种情况下,为了使网络能够运行,您必须满足加权验证器的2/3阈值。
然而,你将是一个人在网络上,所以你可以下注任何数字或高于最低强制,即1000000stake。但是,为了提醒自己诚实的节点投入大量资金是很重要的,您将100000000股份中的70000000股份投入到您刚刚创建的b9lab帐户中。确保不要用完你所有的代币,这样你仍然可以支付gas ,这样你以后就不会用完代币。
别忘了用你自己的--chain-id

./simd gentx d9lab 70000000stake --chain-id test-chain-Hrbd7m

这证实了这一行动:
在这里插入图片描述

当你在自己的文件中创建了这个genesis交易后,用collect-gentxs收集所有的genesis交易,将其包含在你的genesis文件中:

$ ./simd collect-gentxs

打印生成的genesis文件:

{"app_message": {"auth": {"accounts": [{"@type": "/cosmos.auth.v1beta1.BaseAccount", "account_number": "0", "address": "cosmos12uj7a02737k7j0d53lhf2eectfktf78vl69de8", "pub_key": null, "sequence": "0"}], "params": {"max_memo_characters": "256", "sig_verify_cost_ed25519": "590", "sig_verify_cost_secp256k1": "1000", "tx_sig_limit": "7", "tx_size_cost_per_byte": "10"}}, "bank": {"balances": [{"address": "cosmos12uj7a02737k7j0d53lhf2eectfktf78vl69de8", "coins": [{"amount": "100000000", "denom": "stake"}]}], "denom_metadata": [ ], "params": {"default_send_enabled": true, "send_enabled": [ ]}, "supply": [{"amount": "100000000", "denom": "stake"}]}, "capability": {"index": "1", "owners": [ ]}, "crisis": {"constant_fee": {"amount": "1000", "denom": "stake"}}, "distribution": {"delegator_starting_infos": [ ], "delegator_withdraw_infos": [ ], "fee_pool": {"community_pool": [ ]}, "outstanding_rewards": [ ], "params": {"base_proposer_reward": "0.010000000000000000", "bonus_proposer_reward": "0.040000000000000000", "community_tax": "0.020000000000000000", "withdraw_addr_enabled": true}, "previous_proposer": "", "validator_accumulated_commissions": [ ], "validator_current_rewards": [ ], "validator_historical_rewards": [ ], "validator_slash_events": [ ]}, "evidence": {"evidence": [ ]}, "genutil": {"gen_txs": [{"auth_info": {"fee": {"amount": [ ], "gas_limit": "200000", "granter": "", "payer": ""}, "signer_infos": [{"mode_info": {"single": {"mode": "SIGN_MODE_DIRECT"}}, "public_key": {"@type": "/cosmos.crypto.secp256k1.PubKey", "key": "A8RQeuSi30eM9B64XAEDOrl+tRVpvbJ6y0JNrma3X9Lh"}, "sequence": "0"}]}, "body": {"extension_options": [ ], "memo": "93d73b7f8fc1b74612146ba2342e54293c018b9a@192.168.159.128:26656", "messages": [{"@type": "/cosmos.staking.v1beta1.MsgCreateValidator", "commission": {"max_change_rate": "0.010000000000000000", "max_rate": "0.200000000000000000", "rate": "0.100000000000000000"}, "delegator_address": "cosmos12uj7a02737k7j0d53lhf2eectfktf78vl69de8", "description": {"details": "", "identity": "", "moniker": "demo", "security_contact": "", "website": ""}, "min_self_delegation": "1", "pubkey": {"@type": "/cosmos.crypto.ed25519.PubKey", "key": "DWOymvjGcTdP+emo7k1kdqsWzxgwimMOXpqh7Lw2pe0="}, "validator_address": "cosmosvaloper12uj7a02737k7j0d53lhf2eectfktf78v6w3c45", "value": {"amount": "70000000", "denom": "stake"}}], "non_critical_extension_options": [ ], "timeout_height": "0"}, "signatures": ["s5x2n/lLuGAOUq0YdJRkxVY5WtcbVt5wZJ4uRUuQ02ULje9czOPikEWFFOm9Bb69GHZBpw0VP9AwbuSzzIGxhA=="]}]}, "gov": {"deposit_params": {"max_deposit_period": "172800s", "min_deposit": [{"amount": "10000000", "denom": "stake"}]}, "deposits": [ ], "proposals": [ ], "starting_proposal_id": "1", "tally_params": {"quorum": "0.334000000000000000", "threshold": "0.500000000000000000", "veto_threshold": "0.334000000000000000"}, "votes": [ ], "voting_params": {"voting_period": "172800s"}}, "ibc": {"channel_genesis": {"ack_sequences": [ ], "acknowledgements": [ ], "channels": [ ], "commitments": [ ], "next_channel_sequence": "0", "receipts": [ ], "recv_sequences": [ ], "send_sequences": [ ]}, "client_genesis": {"clients": [ ], "clients_consensus": [ ], "clients_metadata": [ ], "create_localhost": false, "next_client_sequence": "0", "params": {"allowed_clients": ["06-solomachine", "07-tendermint"]}}, "connection_genesis": {"client_connection_paths": [ ], "connections": [ ], "next_connection_sequence": "0"}}, "mint": {"minter": {"annual_provisions": "0.000000000000000000", "inflation": "0.130000000000000000"}, "params": {"blocks_per_year": "6311520", "goal_bonded": "0.670000000000000000", "inflation_max": "0.200000000000000000", "inflation_min": "0.070000000000000000", "inflation_rate_change": "0.130000000000000000", "mint_denom": "stake"}}, "params": null, "slashing": {"missed_blocks": [ ], "params": {"downtime_jail_duration": "600s", "min_signed_per_window": "0.500000000000000000", "signed_blocks_window": "100", "slash_fraction_double_sign": "0.050000000000000000", "slash_fraction_downtime": "0.010000000000000000"}, "signing_infos": [ ]}, "staking": {"delegations": [ ], "exported": false, "last_total_power": "0", "last_validator_powers": [ ], "params": {"bond_denom": "stake", "historical_entries": 10000, "max_entries": 7, "max_validators": 100, "unbonding_time": "1814400s"}, "redelegations": [ ], "unbonding_delegations": [ ], "validators": [ ]}, "transfer": {"denom_traces": [ ], "params": {"receive_enabled": true, "send_enabled": true}, "port_id": "transfer"}, "upgrade": { }, "vesting": { }}, "chain_id": "test-chain-Hrbd7m", "gentxs_dir": "/root/.simapp/config/gentx", "moniker": "demo", "node_id": "93d73b7f8fc1b74612146ba2342e54293c018b9a"
}

如果您感到好奇,您可以在您的genesis中找到更新的gen_txs字段。

"genutil": {"gen_txs": [{"auth_info": {"fee": {"amount": [ ], "gas_limit": "200000", "granter": "", "payer": ""}, "signer_infos": [{"mode_info": {"single": {"mode": "SIGN_MODE_DIRECT"}}, "public_key": {"@type": "/cosmos.crypto.secp256k1.PubKey", "key": "A8RQeuSi30eM9B64XAEDOrl+tRVpvbJ6y0JNrma3X9Lh"}, "sequence": "0"}]}, "body": {"extension_options": [ ], "memo": "93d73b7f8fc1b74612146ba2342e54293c018b9a@192.168.159.128:26656", "messages": [{"@type": "/cosmos.staking.v1beta1.MsgCreateValidator", "commission": {"max_change_rate": "0.010000000000000000", "max_rate": "0.200000000000000000", "rate": "0.100000000000000000"}, "delegator_address": "cosmos12uj7a02737k7j0d53lhf2eectfktf78vl69de8", "description": {"details": "", "identity": "", "moniker": "demo", "security_contact": "", "website": ""}, "min_self_delegation": "1", "pubkey": {"@type": "/cosmos.crypto.ed25519.PubKey", "key": "DWOymvjGcTdP+emo7k1kdqsWzxgwimMOXpqh7Lw2pe0="}, "validator_address": "cosmosvaloper12uj7a02737k7j0d53lhf2eectfktf78v6w3c45", "value": {"amount": "70000000", "denom": "stake"}}], "non_critical_extension_options": [ ], "timeout_height": "0"}, "signatures": ["s5x2n/lLuGAOUq0YdJRkxVY5WtcbVt5wZJ4uRUuQ02ULje9czOPikEWFFOm9Bb69GHZBpw0VP9AwbuSzzIGxhA=="]}]}, 

5、Create blocks

现在你可以启动你的单节点区块链:

$ ./simd start

在你运行命令的终端窗口中,你可以看到块正在生成和验证:

[root@localhost build]# ./simd start
2:30PM INF starting ABCI with Tendermint
2:30PM INF Starting multiAppConn service impl=multiAppConn module=proxy
2:30PM INF Starting localClient service connection=query impl=localClient module=abci-client
2:30PM INF Starting localClient service connection=snapshot impl=localClient module=abci-client
2:30PM INF Starting localClient service connection=mempool impl=localClient module=abci-client
2:30PM INF Starting localClient service connection=consensus impl=localClient module=abci-client
2:30PM INF Starting EventBus service impl=EventBus module=events
2:30PM INF Starting PubSub service impl=PubSub module=pubsub
2:30PM INF Starting IndexerService service impl=IndexerService module=txindex
2:30PM INF ABCI Handshake App Info hash= height=0 module=consensus protocol-version=0 software-version=
2:30PM INF ABCI Replay Blocks appHeight=0 module=consensus stateHeight=0 storeHeight=0
2:30PM INF asserting crisis invariants inv=0/11 module=x/crisis name=staking/module-accounts

在同一文件夹中打开一个新终端,并检查余额:

$ ./simd query bank balances $(./simd keys show d9lab -a)

打印:
在这里插入图片描述

6、发送交易

练习发送交易。要做到这一点,你将创建另一个名为student的帐户,并将一些tokens 转移到该帐户:

$ ./simd keys add student

打印如下:

[root@localhost build]# ./simd keys add student
Enter keyring passphrase:- name: studenttype: localaddress: cosmos1h43mcjku2a008jq9pqqzcd75gry7tsuutcn374pubkey: cosmospub1addwnpepqd7vfdq7tcyzqlg9vwwg8c2ef0pzwqajpktekgwrdxgxlhz4s6jfqmek9j0mnemonic: ""threshold: 0pubkeys: []**Important** write this mnemonic phrase in a safe place.
It is the only way to recover your account if you ever forget your password.vague tuition armor crane picture business organ balance strike town plate target rain provide depend weapon indoor logic uncover track puppy coral effort donate

在发送任何代币之前,请确认新账户的余额是否存在:

$ ./simd query bank balances $(./simd keys show student -a)

这个账户没有余额。您的区块链中还不存在新帐户。只有密钥对已生成并存储在您的密匙环中:

balances: []
pagination:next_key: nulltotal: "0"

你需要发送一个交易来改变这个新账户的余额:

$ ./simd tx bank send $(./simd keys show d9lab -a) $(./simd keys show student -a) 10stake --chain-id test-chain-Hrbd7m

在签署和广播之前,您将被提示确认交易:
在这里插入图片描述

命令回显信息包括gas_used等有用信息。

先检查一下student账户的余额:

./simd query bank balances $(./simd keys show student -a)

在这里插入图片描述

现在再检查一下student账户的余额:

balances:
- amount: "10"denom: stake
pagination:next_key: nulltotal: "0"

7、CLI路由

现在是时候编写一些Go代码了。simd如何通过命令行界面进行交互?检查cosmos-sdk/simapp/simd/main.go文件:

package mainimport ("os""github.com/cosmos/cosmos-sdk/server"svrcmd "github.com/cosmos/cosmos-sdk/server/cmd""github.com/cosmos/cosmos-sdk/simapp""github.com/cosmos/cosmos-sdk/simapp/simd/cmd"
)func main() {rootCmd, _ := cmd.NewRootCmd()if err := svrcmd.Execute(rootCmd, simapp.DefaultNodeHome); err != nil {switch e := err.(type) {case server.ErrorCode:os.Exit(e.Code)default:os.Exit(1)}}
}

cmd.NewRootCmd()函数是CLI处理程序。它通过“github.com/cosmos/cosmos-sdk/simapp/simd/cmd”行导入。它可以在cosmos-sdk/simapp/simd/cmd/root.go)文件下找到。

func NewRootCmd() (*cobra.Command, params.EncodingConfig)

其中,定义了基本属性,如应用程序名称:

rootCmd := &cobra.Command{Use:   "simd",Short: "simulation app",

此外,观察Cobra被导入并用于CLI重定向:

rootCmd.AddCommand(genutilcli.InitCmd(simapp.ModuleBasics, simapp.DefaultNodeHome),genutilcli.CollectGenTxsCmd(banktypes.GenesisBalancesIterator{}, simapp.DefaultNodeHome),genutilcli.MigrateGenesisCmd(),genutilcli.GenTxCmd(simapp.ModuleBasics, encodingConfig.TxConfig, banktypes.GenesisBalancesIterator{}, simapp.DefaultNodeHome),genutilcli.ValidateGenesisCmd(simapp.ModuleBasics),AddGenesisAccountCmd(simapp.DefaultNodeHome),tmcli.NewCompletionCmd(rootCmd, true),NewTestnetCmd(simapp.ModuleBasics, banktypes.GenesisBalancesIterator{}),debug.Cmd(),config.Cmd(),
)

另外,查看simapp/app.go,将导入每个模块和密钥管理员。首先你会看到一个相当大的模块列表(打开新窗口),大多数Cosmos-sdk应用程序都使用这些模块:

..."github.com/cosmos/cosmos-sdk/x/auth""github.com/cosmos/cosmos-sdk/x/auth/ante"authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper"authsims "github.com/cosmos/cosmos-sdk/x/auth/simulation"authtx "github.com/cosmos/cosmos-sdk/x/auth/tx"authtypes "github.com/cosmos/cosmos-sdk/x/auth/types""github.com/cosmos/cosmos-sdk/x/auth/vesting""github.com/cosmos/cosmos-sdk/x/bank"bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper"banktypes "github.com/cosmos/cosmos-sdk/x/bank/types""github.com/cosmos/cosmos-sdk/x/capability"capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper"capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types"
...

/cosmos-sdk/x/文件夹中的模块是由在Cosmos栈上工作的几个组织维护的。要理解一个模块,最好的方法是查看相应的spec文件夹。例如,查看cosmos-sdk/x/bank/spec/01_state.md以了解本节中使用的bank模块的状态。

您是否需要对模块及其在Cosmos SDK中的作用进行概念复习?参见前一章的模块部分。

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

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

相关文章

化解射频和微波设计挑战的六个技巧

即使是最自信的设计人员,对于射频电路也往往望而却步,因为它会带来巨大的设计挑战,并且需要专业的设计和分析工具。这里将为您介绍六条技巧,来帮助您简化任何射频PCB 设计任务和减轻工作压力! 1、保持完好、精确的射频…

由浅入深,一起来刷Java高级开发岗面试指南,面试必定无忧!

前言 我只想面个CV工程师,面试官偏偏让我挑战造火箭工程师,加上今年这个情况更是前后两男,但再难苟且的生活还要继续,饭碗还是要继续找的。在最近的面试中我一直在总结,每次面试回来也都会复盘,下面是我根…

【2022.12.9】Lammps+Python 在计算g6(r)时遇到的问题

目录写在前面绘制g6( r )执行步骤【updated】如何检查图像的正确性:不是编程问题,而是数学问题的一个小bug废稿2则:写在前面 全部log: 【2022.11.16】LammpsPythonMATLAB在绘制维诺图时遇到的问题 绘制g6( r )执行步骤【updated…

面试中经常被问到的【宏定义】,改变你对【C\C++】中宏定义的认识。

最近遇到挺多宏定义的代码,其实挺烦的,每次看复杂的宏定义看到一半就懵了,今天盘一盘它。本篇设计宏定义的原理、使用方法、使用技巧。 目录 一、宏定义原理 二、宏定义定义复杂功能函数 2.1 定义注册函数 三、宏定义实现条件编译 四、宏…

扬帆优配|五千亿巨头一度涨停! 4天3倍,港股又现“狂飙”股!

周一,A股三大指数走势分化。到午间收盘,沪指震荡走高涨近1%,深证成指涨0.75%,创业板指继续弱势调整。 盘面上,钢铁、煤炭、大金融等权重板块团体走强,三大通讯运营商一同拉升,其间我国电信盘中一…

超25亿全球月活,字节依然没有流量

(图片来源于网络,侵删) 文|螳螂观察 作者| 搁浅虎鲸 注意看,这个男人叫梁汝波,是字节跳动的联合创始人,也是接棒张一鸣的新任CEO。 在字节跳动十周年之际,他发表了激情昂扬的演讲。“激发创…

linux高级命令之互斥锁

互斥锁学习目标能够知道互斥锁的作用1.互斥锁的概念互斥锁: 对共享数据进行锁定,保证同一时刻只能有一个线程去操作。注意:互斥锁是多个线程一起去抢,抢到锁的线程先执行,没有抢到锁的线程需要等待,等互斥锁使用完释放后&#xff…

02- OpenCV绘制图形及图像算术变换 (OpenCV基础) (机器视觉)

知识重点 OpenCV用的最多的色彩空间是HSV. 方便OpenCV做图像处理img2 img.view() # 浅拷贝img3 img.copy() # 深拷贝split(mat) 分割图像的通道: b, g, r cv2.split(img) # b, g, r 都是数组merge((ch1, ch2, ch3)) 融合多个通道cvtColor(img, colorspace): 颜…

Learning C++ No.11【string类实现】

引言: 北京时间:2023/2/19/8:48,昨天更新了有关进程状态的博客,然后在休息的时候,打开了腾讯视屏,然后看到了了一个电视剧,导致上头,从晚上6点看到了10点,把我宝贵的博客…

【NestJS】中间件

中间件是在路由处理程序之前调用的函数,所以在中间件函数中可以访问请求和响应。 中间件函数需要执行 next() 将控制传递给下一个中间件函数,否则请求会被挂起。 可以使用 nest g mi XXX 创建中间件。 局部中间件 nest g res usernest g mi ajax、编写…

klog bug:仅输出到日志文件,不打印到命令行/stderr

一、 问题描述 开发k8s插件,使用klog作为日志工具,开发完成发现在设置将日志打印到文件后,Error级别的日志信息仍然会输出到命令行,过多日志打印会使后期将服务部署于docker有卡死的风险(docker的bug,日志…

kubectl常用的命令

目录 安装 kubectl 一、命令自动补全 二、常用命令 1、查看所有pod列表 2、查看RC和service列表 3、显示Node的详细信息 4、显示Pod的详细信息, 特别是查看Pod无法创建的时候的日志 5、 根据yaml创建资源, apply可以重复执行,create不行 6、基于nginx.yaml…

优思学院:六西格玛中的水平对比方法是什么?

水平对比,就是比较不同事物之间的差异。 这个概念在六西格玛管理中也很重要,也就是我们经常说的标杆管理,经常被用来寻找行业中最好的做法,以帮助组织改进自身的绩效。 在六西格玛管理中,水平对比有三种常见的应用方式…

记一次IDE的Docker插件实战(Dockfile篇)

IDEA下使用Docker插件制作镜像、推送及运行 前言 本部分主要根据IDEA的Docker插件实战(Dockerfile篇)_程序员欣宸的博客-CSDN博客_idea编写dockerfile一文所述内容进行实践,并对其中遇到的问题进行解答,从而串接多个知识点。 如何编写Dockfile 在Int…

【YOLOv5】 3060显卡 GPU版本环境搭建与运行

YOLOv5环境搭建步骤创建虚拟环境使用anaconda新建一个python版本为3.7的虚拟环境查看电脑支持的cuda版本由于30系列的的显卡暂时不支持CUDA11以下版本。因此,这里得安装超过CUDA11.0的版本。通过如下命令来查看可以安装的cuda的版本:conda search cuda安…

JVM类加载子系统

1、类加载子系统在内存结构中所处的位置通过内存结构图,我们先知道类加载子系统所处的位置,做到心中有图。2、类加载器作用类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。ClassLoader只负责cla…

火花幻境加深与亚马逊云科技的合作,为玩家创造更加美好的游戏体验

元宇宙可谓是2022年科技界的“当红炸子鸡”,该概念的兴起为游戏产业带来了更多的发展机遇,游戏与元宇宙的结合,为玩家带来了更好的全息感官体验与游戏乐趣。元宇宙游戏市场前景广阔,企业能否快速抢滩市场,不断缩短游戏…

如何配置git,使其支持多用户

如何配置git,使其支持多用户? 在多数时候, 我们使用git进行操作时,只需要在本地配置一个用户的ssh key,就可以完成基本的pull/push操作。如果现在我有两个github的账号,并需要在一台电脑中操作其中的repo&…

java网络编程-nio学习:阻塞和非阻塞

一、阻塞 阻塞模式下,相关方法都会导致线程暂停 ServerSocketChannel.accept 会在没有连接建立时让线程暂停 SocketChannel.read 会在没有数据可读时让线程暂停 阻塞的表现其实就是线程暂停了,暂停期间不会占用 cpu,但线程相当于闲置 单线…