Hardhat环境搭建(六)---无需翻墙

Hardhat环境搭建

官方地址

node环境

npm环境

git环境

在这里插入图片描述

安装hardhat

npm init

npminit是什么

在node开发中使用npm init会生成一个pakeage.json文件,这个文件主要是用来记录这个项目的详细信息的,它会将我们在项目开发中所要用到的包,以及项目的详细信息等记录在这个项目中。方便在以后的版本迭代和项目移植的时候会更加的方便。也是防止在后期的项目维护中误删除了一个包导致的项目不能够正常运行。使用npm init初始化项目还有一个好处就是在进行项目传递的时候不需要将项目依赖包一起发送给对方,对方在接受到你的项目之后再执行npm install就可以将项目依赖全部下载到项目里。

在这里插入图片描述

package name:                      你的项目名字叫啥
version:                          版本号
description:                       对项目的描述
entry point:                      项目的入口文件(一般你要用那个js文件作为node服务,就填写那个文件)
test command:                     项目启动的时候要用什么命令来执行脚本文件(默认为node app.js)
git repository:                    如果你要将项目上传到git中的话,那么就需要填写git的仓库地址(这里就不写地址了)
keywirds:                       项目关键字(我也不知道有啥用,所以我就不写了)
author:                         作者的名字(也就是你叫啥名字)
license:                        发行项目需要的证书(这里也就自己玩玩,就不写了)

npm install --save-dev hardhat

npm install --save-dev是怎么回事

npm install 和 npm i 是一样的,都是安装package.json文件中的依赖包。
安装单独的依赖包时,npm install

  • –save 等同于 -S (常用,可保存在package.json文件中),
    -S, --save 安装包信息将加入到dependencies(生产阶段的依赖,也就是项目运行时的依赖,就是程序上线后仍然需要依赖)
    –save-dev 等同于 -D
  • -D, --save-dev 安装包信息将加入到devDependencies(开发阶段的依赖,就是我们在开发过程中需要的依赖,只在开发阶段起作用。)

区别:
在用npm install 单独安装 npm 包时,有两种命令参数可以把它们的信息写入 package.json 文件,一个是npm install–save,另一个是 npm install –save-dev,他们表面上的区别是:
–save 会把依赖包名称添加到 package.json 文件 dependencies 下,
–save-dev 则添加到 package.json 文件 devDependencies下 ,譬如:

{"dependencies": {"@ant-design/pro-layout": "^4.5.0","@antv/data-set": "^0.10.2","antd": "^3.19.1",},"devDependencies": {"babel-core": "^6.0.0","babel-loader": "^6.0.0","babel-preset-latest": "^6.0.0","cross-env": "^3.0.0","css-loader": "^0.25.0","file-loader": "^0.9.0","vue-loader": "^11.1.4","vue-template-compiler": "^2.2.1","webpack": "^2.2.0","webpack-dev-server": "^2.2.0"}
}

不过这只是它们的表面区别。它们真正的区别是:
dependencies是运行时的依赖,
devDependencies是开发时的依赖。
即devDependencies 下列出的模块,是我们开发时用的,比如 我们安装 js的压缩包gulp-uglify 时,我们采用的是 “npm install –save-dev gulp-uglify ”命令安装, 因为我们在发布后用不到它,而只是在我们开发才用到它。

举例:
像jQuery库或者Angular框架类似的,我们在开发完后后肯定还要依赖它们,否则就运行不了,这是dependencies;
而写 ES6 代码,需要babel转换成es5,转换完成后,我们只需要转换后的代码,上线的时候,直接把转换后的代码部署上线,不需要babel了,上线了不需要,这就是devDependencies。
而如果用了 jQuery,由于发布之后还是依赖jQuery,所以是dependencies。

补充:
正常使用 npm install 时,会下载dependencies和devDependencies中的模块,当使用npm install –production或者注明NODE_ENV变量值为production时,只会下载dependencies中的模块。

npm install --save-dev hardhat

安装

在这里插入图片描述
在这里插入图片描述

package-lock.json和package.json的区别
  • package.json

生成方式:执行 npm init 命令。

主要作用:描述项目及项目所依赖的模块信息。

  • package-lock.json
    生成方式:从 npm 5 版本之后只要使用 npm install 命令下载,就会自动生成 package-lock.json 文件。

主要作用:

1)描述 node_modules 文件中所有模块的版本信息,模块来源及依赖的小版本信息。

2)当版本升级,使用 npm install 命令时,会安装 package.json 中指定的大版本的最新版本。如 package.json 中指定版本"dependencies": { “webpack”: “^2.0.0” },则 package-lock.json 会按照 {“webpack”: “2.7.0”} 版本升级。在保证大版本号前提下的最新版本。webpack “2.7.0” 是 “2.x.x” 的最高版本。

初始化hardhat项目

在安装Hardhat的目录下运行:

npx hardhat

在这里插入图片描述
在运行Hardhat时,它将从当前工作目录开始搜索最接近的hardhat.config.js文件。 这个文件通常位于项目的根目录下,一个空的hardhat.config.js足以使Hardhat正常工作。
在这里插入图片描述

Hardhat 架构

Hardhat是围绕task(任务)和plugins(插件)的概念设计的。 Hardhat 的大部分功能来自插件,作为开发人员,你可以自由选择 你要使用的插件。

Tasks(任务)

每次在命令行运行Hardhat时,都是在运行任务。 例如

npx hardhat compile

正在运行compile任务。 要查看项目中当前可用的任务,运行

npx hardhat

在这里插入图片描述

通过运行

npx hardhat help [task]

可以探索任何任务。

Plugins(插件)

Hardhat 不限制选择哪种工具,但是它确实内置了一些插件,所有这些也都可以覆盖。 大多数时候,使用给定工具的方法是将其集成到Hardhat中作为插件。

在本教程中,我们将使用插件@nomicfoundation/hardhat-toolbox。 通过他们与以太坊进行交互并测试合约。 稍后将解释它们的用法。 要安装它们,请在项目目录中运行:

npm install --save-dev @nomicfoundation/hardhat-toolbox

在这里插入图片描述

require("@nomicfoundation/hardhat-toolbox");

添加到你的hardhat.config.js中,如下所示:
在这里插入图片描述

写一个合约并编译它

我们创建一个简单的智能合约,合约实现代币转让。 代币合约最常用于兑换或价值存储。 这里,我们不深入讨论合约的Solidity代码,但是一些实现逻辑你需要知道:

代币有固定发行总量。
所有发行总量都分配给了部署合约的地址。
任何人都可以接收代币。
任何人拥有代币的人都可以转让代币。
代币不可分割。 你可以转让1、2、3或37个代币,但不能转让2.5个代币。

你可能听说过ERC20,它是以太坊中的代币标准。 DAI,USDC,MKR和ZRX之类的代币都遵循ERC20标准,使这些代币都可以与任何能处理ERC20代币的软件兼容。 为了简单起见,我们要构建的代币不是ERC20。

首先创建一个名为 contracts 的新目录,然后在目录内创建一个名为Token.sol的文件。

在这里插入图片描述

将下面的代码粘贴到文件中,花一点时间阅读代码。 它很简单,并且有很多解释Solidity基础语法的注释。

要编译合约,请在终端中运行

npx hardhat compile

compile任务是内置任务之一。

在这里插入图片描述
这是多出来的东西
在这里插入图片描述

测试合约

为智能合约编写自动化测试至关重要,因为事关用户资金。 为此,我们将使用Hardhat Network,这是一个内置的以太坊网络,专门为开发设计,并且是Hardhat中的默认网络。 无需进行任何设置即可使用它。 在我们的测试中,我们将使用ethers.js与前面构建的合约进行交互,并使用 Mocha 作为测试运行器。
在项目根目录中创建一个名为test的新目录,并创建一个名为Token.js的新文件。

在这里插入图片描述
让我们从下面的代码开始。 在后面我们将对其进行解释,但现在将其粘贴到Token.js中:

const { expect } = require("chai");describe("Token contract", function() {it("Deployment should assign the total supply of tokens to the owner", async function() {const [owner] = await ethers.getSigners();const Token = await ethers.getContractFactory("Token");const hardhatToken = await Token.deploy();const ownerBalance = await hardhatToken.balanceOf(owner.address);expect(await hardhatToken.totalSupply()).to.equal(ownerBalance);});
});

在终端上运行

npx hardhat test

你应该看到以下输出:

在这里插入图片描述
这意味着测试通过了。 现在我们逐行解释一下:

const [owner] = await ethers.getSigners();

ethers.js中的Signer 代表以太坊账户对象。 它用于将交易发送到合约和其他帐户。 在这里,我们获得了所连接节点中的帐户列表,在本例中节点为Hardhat Network,并且仅保留第一个帐户。

ethers变量在全局作用域下都可用。 如果你希望代码更明确,则可以在顶部添加以下这一行:

const { ethers } = require("hardhat");

继续

const Token = await ethers.getContractFactory("Token");

ethers.js中的ContractFactory是用于部署新智能合约的抽象,因此此处的Token是用来实例代币合约的工厂。

const hardhatToken = await Token.deploy();

在ContractFactory上调用deploy()将启动部署,并返回解析为Contract的Promise。 该对象包含了智能合约所有函数的方法。

const ownerBalance = await hardhatToken.balanceOf(owner.address);

部署合约后,我们可以在hardhatToken 上调用合约方法,通过调用balanceOf()来获取所有者帐户的余额。

请记住,部署合约的帐户获得了全部代币,在使用 hardhat-ethers 插件时,默认情况下, ContractFactory和Contract实例连接到第一个签名者。 这意味着owner变量中的帐户执行了部署,而balanceOf()应该返回全部发行量。

expect(await hardhatToken.totalSupply()).to.equal(ownerBalance);

在这里,再次使用 Contract 实例调用Solidity代码中合约函数。 totalSupply() 返回代币的发行量,我们检查它是否等于ownerBalance。
判断相等,我们使用Chai,这是一个断言库。 这些断言函数称为“匹配器”,在此实际上使用的“匹配器”来自Hardhat Chai Matchers。 它扩展了Chai,为测试智能合约提供了许多有用的匹配器。

使用不同的账号测试

如果你需要从默认帐户以外的其他帐户(或ethers.js 中的 Signer)发送交易来测试代码,则可以在ethers.js的Contract中使用connect()方法来将其连接到其他帐户,像这样:

const { expect } = require("chai");describe("Transactions", function () {it("Should transfer tokens between accounts", async function() {const [owner, addr1, addr2] = await ethers.getSigners();const Token = await ethers.getContractFactory("Token");const hardhatToken = await Token.deploy();// Transfer 50 tokens from owner to addr1await hardhatToken.transfer(addr1.address, 50);expect(await hardhatToken.balanceOf(addr1.address)).to.equal(50);// Transfer 50 tokens from addr1 to addr2await hardhatToken.connect(addr1).transfer(addr2.address, 50);expect(await hardhatToken.balanceOf(addr2.address)).to.equal(50);});
});

使用fixture重用公共测试设置

在更复杂的项目中,这种设置可能涉及多个部署和其他事务。在每个测试中这样做意味着大量的代码重复。此外,在每个测试开始时执行许多事务会使测试套件变得更慢。

你可以通过使用固定程序(fixtures)来避免代码重复并提高测试套件的性能。fixture是一个设置函数,只在第一次调用时运行。在随后的调用中,Hardhat将把网络的状态重置为fixture最初执行后的状态,而不是重新运行它。

const { loadFixture } = require("@nomicfoundation/hardhat-network-helpers");
const { expect } = require("chai");describe("Token contract", function () {async function deployTokenFixture() {const Token = await ethers.getContractFactory("Token");const [owner, addr1, addr2] = await ethers.getSigners();const hardhatToken = await Token.deploy();await hardhatToken.deployed();// Fixtures can return anything you consider useful for your testsreturn { Token, hardhatToken, owner, addr1, addr2 };}it("Should assign the total supply of tokens to the owner", async function () {const { hardhatToken, owner } = await loadFixture(deployTokenFixture);const ownerBalance = await hardhatToken.balanceOf(owner.address);expect(await hardhatToken.totalSupply()).to.equal(ownerBalance);});it("Should transfer tokens between accounts", async function () {const { hardhatToken, owner, addr1, addr2 } = await loadFixture(deployTokenFixture);// Transfer 50 tokens from owner to addr1await expect(hardhatToken.transfer(addr1.address, 50)).to.changeTokenBalances(hardhatToken, [owner, addr1], [-50, 50]);// Transfer 50 tokens from addr1 to addr2// We use .connect(signer) to send a transaction from another accountawait expect(hardhatToken.connect(addr1).transfer(addr2.address, 50)).to.changeTokenBalances(hardhatToken, [addr1, addr2], [-50, 50]);});
});

在这里,我们写了一个deployTokenFixture函数,它做了必要的设置,并返回我们以后在测试中使用的每个值。然后在每个测试中,我们使用loadFixture来运行fixture并获得这些值。loadFixture将在第一次运行设置,并在其他测试中快速返回到该状态。
在这里插入图片描述
这是chatgpt的回答

在你提供的代码中,你使用了Hardhat测试框架来编写智能合约的测试用例。
从报错信息来看,问题出在调用 hardhatToken.deployed 方法时。
根据错误信息 "TypeError: hardhatToken.deployed is not a function",
这意味着 deployed 不是一个方法或者函数。在最新版本的Hardhat中,当你调用 Token.deploy() 方法后,返回的实例已经被认为是部署完成的。
这就意味着不需要再调用 .deployed() 方法去等待部署完成。
.deployed() 是一个早期版本中存在于 Truffle 框架里面的方法,并不适用于 Hardhat。因此,在下面这段代码中:const hardhatToken = await Token.deploy();
await hardhatToken.deployed();第二行是多余且会导致错误发生的。正确做法应该是移除那一行:const hardhatToken = await Token.deploy();
// 这一行应该被删除:await hardhatToken.deployed();

在这里插入图片描述

完整覆盖测试

我们已经介绍了测试合约所需的基础知识,以下是代币的完整测试用例,其中包含有关Mocha以及如何构组织测试的许多信息。 我们建议你通读。

// This is an example test file. Hardhat will run every *.js file in `test/`,
// so feel free to add new ones.// Hardhat tests are normally written with Mocha and Chai.// We import Chai to use its asserting functions here.
const { expect } = require("chai");// We use `loadFixture` to share common setups (or fixtures) between tests.
// Using this simplifies your tests and makes them run faster, by taking
// advantage of Hardhat Network's snapshot functionality.
const { loadFixture } = require("@nomicfoundation/hardhat-network-helpers");// `describe` is a Mocha function that allows you to organize your tests.
// Having your tests organized makes debugging them easier. All Mocha
// functions are available in the global scope.
//
// `describe` receives the name of a section of your test suite, and a
// callback. The callback must define the tests of that section. This callback
// can't be an async function.
describe("Token contract", function () {// We define a fixture to reuse the same setup in every test. We use// loadFixture to run this setup once, snapshot that state, and reset Hardhat// Network to that snapshot in every test.async function deployTokenFixture() {// Get the ContractFactory and Signers here.const Token = await ethers.getContractFactory("Token");const [owner, addr1, addr2] = await ethers.getSigners();// To deploy our contract, we just have to call Token.deploy() and await// its deployed() method, which happens once its transaction has been// mined.const hardhatToken = await Token.deploy();// await hardhatToken.deployed();// Fixtures can return anything you consider useful for your testsreturn { Token, hardhatToken, owner, addr1, addr2 };}// You can nest describe calls to create subsections.describe("Deployment", function () {// `it` is another Mocha function. This is the one you use to define each// of your tests. It receives the test name, and a callback function.//// If the callback function is async, Mocha will `await` it.it("Should set the right owner", async function () {// We use loadFixture to setup our environment, and then assert that// things went wellconst { hardhatToken, owner } = await loadFixture(deployTokenFixture);// `expect` receives a value and wraps it in an assertion object. These// objects have a lot of utility methods to assert values.// This test expects the owner variable stored in the contract to be// equal to our Signer's owner.expect(await hardhatToken.owner()).to.equal(owner.address);});it("Should assign the total supply of tokens to the owner", async function () {const { hardhatToken, owner } = await loadFixture(deployTokenFixture);const ownerBalance = await hardhatToken.balanceOf(owner.address);expect(await hardhatToken.totalSupply()).to.equal(ownerBalance);});});describe("Transactions", function () {it("Should transfer tokens between accounts", async function () {const { hardhatToken, owner, addr1, addr2 } = await loadFixture(deployTokenFixture);// Transfer 50 tokens from owner to addr1await expect(hardhatToken.transfer(addr1.address, 50)).to.changeTokenBalances(hardhatToken, [owner, addr1], [-50, 50]);// Transfer 50 tokens from addr1 to addr2// We use .connect(signer) to send a transaction from another accountawait expect(hardhatToken.connect(addr1).transfer(addr2.address, 50)).to.changeTokenBalances(hardhatToken, [addr1, addr2], [-50, 50]);});it("Should emit Transfer events", async function () {const { hardhatToken, owner, addr1, addr2 } = await loadFixture(deployTokenFixture);// Transfer 50 tokens from owner to addr1await expect(hardhatToken.transfer(addr1.address, 50)).to.emit(hardhatToken, "Transfer").withArgs(owner.address, addr1.address, 50);// Transfer 50 tokens from addr1 to addr2// We use .connect(signer) to send a transaction from another accountawait expect(hardhatToken.connect(addr1).transfer(addr2.address, 50)).to.emit(hardhatToken, "Transfer").withArgs(addr1.address, addr2.address, 50);});it("Should fail if sender doesn't have enough tokens", async function () {const { hardhatToken, owner, addr1 } = await loadFixture(deployTokenFixture);const initialOwnerBalance = await hardhatToken.balanceOf(owner.address);// Try to send 1 token from addr1 (0 tokens) to owner.// `require` will evaluate false and revert the transaction.await expect(hardhatToken.connect(addr1).transfer(owner.address, 1)).to.be.revertedWith("Not enough tokens");// Owner balance shouldn't have changed.expect(await hardhatToken.balanceOf(owner.address)).to.equal(initialOwnerBalance);});});
});

这是

npx hardhat test 

的输出, 结果类似这样:
在这里插入图片描述

正常应该是这样的

$ npx hardhat testToken contractDeployment✓ Should set the right owner✓ Should assign the total supply of tokens to the ownerTransactions✓ Should transfer tokens between accounts (199ms)✓ Should fail if sender doesn’t have enough tokens✓ Should update balances after transfers (111ms)5 passing (1s)

请记住,当你运行npx hardhat test时,如果合约在上次运行测试后发生了修改,则会对其进行重新编译。

用 Hardhat Network 调试

Hardhat 内置了 Hardhat Network,这是一个专为开发而设计的以太坊网络。 它允许你部署合约,运行测试和调试代码。 这是Hardhat所连接的默认网络,因此你无需进行任何设置即可工作。 你只需运行测试就好。

在Hardhat Network上运行合约和测试时,你可以在Solidity代码中调用console.log()打印日志信息和合约变量。 你必须先从合约代码中导入**Hardhat **的console.log再使用它。

像这样:

pragma solidity ^0.8.9;import "hardhat/console.sol";contract Token {//...
}

就像在JavaScript中使用一样,将一些console.log添加到transfer()函数中:

function transfer(address to, uint256 amount) external {require(balances[msg.sender] >= amount, "Not enough tokens");console.log("Transferring from %s to %s %s tokens",msg.sender,to,amount);balances[msg.sender] -= amount;balances[to] += amount;emit Transfer(msg.sender, to, amount);
}

运行测试时,将输出日志记录:
由于Should emit Transfer events报错,我就把它注释掉了
在这里插入图片描述

部署到真实网络

准备好与其他人分享dApp后,你可能要做的就是将其部署到真实的以太坊网络中。 这样,其他人可以访问不在本地系统上运行的实例。

具有真实价值的以太坊网络被称为“主网”,然后还有一些不具有真实价值但能够很好地模拟主网的网络,它可以被其他人共享阶段的环境。 这些被称为“测试网”,以太坊有多个测试网, 例如_Goerli_ 和 Sepolia。 我们建议你将合约部署到 Goerli 测试网。

在应用软件层,部署到测试网与部署到主网相同。 唯一的区别是你连接到哪个网络。 让我们研究一下使用ethers.js部署合约的代码是什么样的。

主要概念是Signer,ContractFactory和Contract,我们在[测试]testing 部分中对此进行了解释。与测试相比,并没有什么新的内容,因为当在测试合约时,实际上是在向开发网络进行部署。 因此代码非常相似或相同。

让我们在项目根目录的目录下创建一个新的目录scripts,并将以下内容粘贴到 deploy.js文件中:

async function main() {const [deployer] = await ethers.getSigners();console.log("Deploying contracts with the account:",deployer.address);console.log("Account balance:", (await deployer.getBalance()).toString());const Token = await ethers.getContractFactory("Token");const token = await Token.deploy();console.log("Token address:", token.address);
}main().then(() => process.exit(0)).catch(error => {console.error(error);process.exit(1);});

在这里插入图片描述
为了在运行任何任务时指示Hardhat连接到特定的以太坊网络,可以使用–network参数。 像这样:

npx hardhat run scripts/deploy.js --network <network-name>

在这种情况下,如果不使用–network 参数来运行它,则代码将再次部署在Hardhat network 上,因此,当Hardhat network 关闭后,部署实际上会丢失,但是它用来测试我们的部署代码时仍然有用:

$ npx hardhat run scripts/deploy.js
Deploying contracts with the account: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
Account balance: 10000000000000000000000
Token address: 0x5FbDB2315678afecb367f032d93F642f64180aa3

在这里插入图片描述
在这里插入图片描述
要部署到诸如主网或任何测试网之类的线上网络,你需要在hardhat.config.js 文件中添加一个network条目。 在此示例中,我们将使用Goerli,但你可以类似地添加其他网络:

require("@nomicfoundation/hardhat-toolbox");// Go to https://www.alchemyapi.io, sign up, create
// a new App in its dashboard, and replace "KEY" with its key
const ALCHEMY_API_KEY = "KEY";// Replace this private key with your Goerli account private key
// To export your private key from Metamask, open Metamask and
// go to Account Details > Export Private Key
// Beware: NEVER put real Ether into testing accounts
const GOERLI_PRIVATE_KEY = "YOUR GOERLI PRIVATE KEY";module.exports = {solidity: "0.8.9",networks: {goerli: {url: `https://eth-goerli.alchemyapi.io/v2/${ALCHEMY_API_KEY}`,accounts: [GOERLI_PRIVATE_KEY]}}
};

我们使用了 alchemy. , 但是你将url指向其他任何以太坊节点或网关都是可以。请填入你自己的 ALCHEMY_API_KEY 。

要在 Goerli 上进行部署,你需要将Goerli-ETH发送到将要进行部署的地址中。 你可以从水龙头(免费分发测试使用的ETH服务)获得一些用于测试网的ETH。 这是Goerli的一个水龙头:

Alchemy Goerli Faucet
你必须在进行交易之前将Metamask的网络更改为Goerli。
你可以通过以下链接为其他测试网获取一些ETH.

ethereum.org 测试网
最后运行:

npx hardhat run scripts/deploy.js --network goerli

如果一切顺利,你应该看到已部署的合约地址。

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

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

相关文章

Mac查询本机ip地址

Mac系统版本和网络配置不同&#xff0c;可能会有一些细微差别。 一、 使用系统偏好设置 1、点击屏幕左上角的Apple图标&#xff0c;选择“系统偏好设置”。 2、点击“网络”。 3、 在左侧选择当前连接的网络&#xff08;如Wi-Fi或以太网&#xff09;&#xff0c;在右侧界面&a…

达梦到达梦的外部链接dblink(DM-DM DBLINK)

一. 使用场景&#xff1a; 部链接对象&#xff08;LINK&#xff09;是 DM 中的一种特殊的数据库实体对象&#xff0c;它记录了远程数据库的连接和路径信息&#xff0c;用于建立与远程数据的联系。通过多台数据库主库间的相互通讯&#xff0c;用户可以透明地操作远程数据库的数…

前端开发新趋势:Web3 与虚拟现实的技术融合

在当今互联网技术日新月异的时代&#xff0c;Web技术也在不断地发展和变革。从前端开发的角度来看&#xff0c;新技术的涌现和旧技术的迭代让前端开发者们面临着前所未有的挑战和机遇。Web3 与虚拟现实&#xff08;VR&#xff09;的技术融合&#xff0c;正是当前前端开发领域的…

​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化

2022年亚马逊云科技re:Invent盛会于近日在拉斯维加斯成功召开&#xff0c;吸引了众多业界精英和创新者。亚马逊云科技边缘服务副总裁Jan Hofmeyr在演讲中分享了关于亚马逊云科技海外服务器边缘计算的最新发展和创新成果&#xff0c;引发与会者热烈关注。 re:Invent的核心主题是…

九、W5100S/W5500+RP2040之MicroPython开发<HTTPOneNET示例>

文章目录 1. 前言2. 平台操作流程2.1 创建设备2.2 创建数据流模板 3. WIZnet以太网芯片4. 示例讲解以及使用4.1 程序流程图4.2 测试准备4.3 连接方式4.4 相关代码4.5 烧录验证 5. 注意事项6. 相关链接 1. 前言 在这个智能硬件和物联网时代&#xff0c;MicroPython和树莓派PICO正…

Kubernetes 的用法和解析 -- 7

k8s之共享存储pv&pvc 1 存储资源管理 在基于k8s容器云平台上&#xff0c;对存储资源的使用需求通常包括以下几方面&#xff1a; 1.应用配置文件、密钥的管理&#xff1b; 2.应用的数据持久化存储&#xff1b; 3.在不同的应用间共享数据存储&#xff1b; k8s的Volume抽象概…

【昆明*线上同步】最新ChatGPT/GPT4科研实践应用与AI绘图技术及论文高效写作

详情点击查看福利&#xff1a;【昆明*线上同步】最新ChatGPT/GPT4科研实践应用与AI绘图技术及论文高效写作 目标&#xff1a; 1、熟练掌握ChatGPT提示词技巧及各种应用方法&#xff0c;并成为工作中的助手。 2、通过案例掌握ChatGPT撰写、修改论文及工作报告&#xff0c;提供…

AI Native工程化:百度App AI互动技术实践

作者 | GodStart 导读 随着AI浪潮的兴起&#xff0c;越来越多的应用都在利用大模型重构业务形态&#xff0c;在设计和优化Prompt的过程中&#xff0c;我们发现整个Prompt测评和优化周期非常长&#xff0c;因此&#xff0c;我们提出了一种Prompt生成、评估与迭代的一体化解决方案…

NB-IOT、4G-LTE信号优劣判定参考指标

名词释意 &#xff08;1&#xff09;RSRP&#xff1a;信号接收功率&#xff0c;反映当前路径信道损耗程度&#xff0c;主要作为小区覆盖的测量和小区重选重要依据. &#xff08;2&#xff09;RSRQ&#xff1a;信号接收质量&#xff0c;反映当前路径网络负荷及干扰变化点&#x…

【XML】TinyXML 详解

1、简介 优点&#xff1a; TinyXML 是一个简单、小型的 C XML 解析器&#xff0c;可以轻松集成到项目中。 TinyXML 解析 XML 文档&#xff0c;并根据该文档构建可读取、修改和保存的文档对象模型 (DOM) TinyXML 是在 ZLib 许可下发布的&#xff0c;因此可以在开源或商业代码中…

zynqmp Linux + 裸机 (A53-0 Linux,A53-1 2 3 裸机大数据量实时处理,R5-0 协议处理,R5-1 屏幕显示逻辑等)填坑笔记

fpga 和arm 采用预留内存的方式&#xff0c;采用neon 协处理器只能做到 250M/S 的速度&#xff0c;预留内存采用mmap的方式&#xff0c;当读取内存页的时候采用缺页中断的方式&#xff0c;导致速度拖沓而且预留内存没有进行Linux系统的内存管理&#xff08;在系统内 memcpy的速…

使用代理服务器和Beautiful Soup爬取亚马逊

概述 Beautiful Soup 是一个用于解析 HTML 和 XML 文档的 Python 库&#xff0c;它能够从网页中提取数据&#xff0c;并提供了一些简单的方法来浏览文档树、搜索特定元素以及修改文档的内容。在本文中&#xff0c;我们将介绍如何使用代理服务器和Beautiful Soup库来爬取亚马逊…

融资项目——vue之双向数据绑定

上一篇文章中使用的v-bind是单向绑定方法&#xff0c;即数据改变&#xff0c;网页相应的视图发生改变&#xff0c;但是网页视图发生改变其相关联的数据不会发生改变。但是双向数据绑定不同之处在于网页视图发生改变其相关联的数据也会发生改变。Vue可以使用v-model进行双向数据…

【SpringBoot快速入门】(1)SpringBoot的开发步骤、工程构建方法以及工程的快速启动详细讲解

目录 SpringBoot简介1 SpringBoot快速入门1.1 开发步骤1.1.1 创建新模块1.1.2 创建 Controller1.1.3 启动服务器1.1.4 进行测试 2 对比3 官网构建工程3.1 进入SpringBoot官网3.2 选择依赖3.3 生成工程 4 SpringBoot工程快速启动4.1 问题导入4.2 打包4.3 启动 之前我们已经学习的…

C++20形式的utf-8字符串转宽字符串,不依赖编译器编码形式

默认的char[]编码都是要看编译器编译选项的&#xff0c;你选了ANSI那它就是ANSI&#xff0c;你选了UTF8那它就是UTF8. 【注意&#xff1a;经典DevC只支持ANSI编码&#xff08;痛苦&#xff09;&#xff1b;上图是小熊猫DevC&#xff0c;则有这个选项】 这一点对我的代码造成了…

DevOps系列文章 : 使用dpkg命令打deb包

创建一个打包的目录&#xff0c;类似rpmbuild&#xff0c;这里创建了目录deb_build mkdir deb_build目标 我有一个hello的二进制文件hello和源码hello.c, 准备安装到/opt/helloworld目录中 步骤 在deb_build目录创建一个文件夹用于存放我的安装文件 mkdir helloworld在he…

ADS学习笔记(二)——更新中

八、中途容性负载的时延累加 1.原理简述 中途容性负载产生的第一位影响就是下冲噪声&#xff0c;第二位影响是远端信号的接收时间被延迟。电容器与传输线的组合就像一个RC滤波器&#xff0c;所以传输信号10&#xff05;&#xff5e;90&#xff05;上升边将增加&#xff0c;信…

Java-Secruity-2

可以先看这篇文章 Secruity-1&#x1f448; 1、授权 1.1 权限管理 在日常使用的系统中都会涉及到权限相关的操作&#xff0c;管理员有管理员的操作&#xff0c;用户有用户的操作&#xff0c;不同的用户可以使用不同的功能&#xff0c;这需要使用到权限管理。 所以在写接口…

μC/OS-III 里面的环形表

文章目录 1、时钟节拍任务2、定时器列表 μC/OS-III 里面两个地方用到了环形表&#xff0c;时钟节拍任务&#xff0c;定时器列表&#xff0c;通过排序后&#xff0c;效率是非常高的。 以下内容整理自 嵌入式实时操作系统uC/OS-Ⅲ 1、时钟节拍任务 2023/12/21 18:04:16 (1) 该…

【数论】约数

试除法求约数 时间复杂度 O(sqrt(n))。 核心思路是求到较小的约数时&#xff0c;将其对应的较大约数也可以直接求出来&#xff0c; 例如&#xff1a;a/bc&#xff0c;b是a的余数&#xff0c;c也是a的余数 ps&#xff1a;注意bc的情况&#xff0c;要注意去重 void solve() …