技术:jdk1.8 + maven3.0.5

 http://qklbishe.com/

概述

区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

详细

本demo旨在帮助你了解如何开发区块链技术。

  • 创建一个简单的钱包。

  • 使用我们的区块链发送带签名的交易。

 

一、运行效果

image.png

二、实现过程

 

①、准备一个钱包

https://raw.githubusercontent.com/longfeizheng/longfeizheng.github.io/master/images/qukuai/qukuai02.png

 

 

让我们创建一个钱包类来保存公钥和私钥:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

package com.zxh;

 

import java.security.*;

import java.security.spec.ECGenParameterSpec;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Map;

 

public class Wallet {

 

    public PrivateKey privateKey;

    public PublicKey publicKey;

 

    public HashMap<String,TransactionOutput> UTXOs = new HashMap<String,TransactionOutput>();

 

    public Wallet() {

        generateKeyPair();

    }

 

    public void generateKeyPair() {

        try {

            KeyPairGenerator keyGen = KeyPairGenerator.getInstance("ECDSA","BC");

            SecureRandom random = SecureRandom.getInstance("SHA1PRNG");

            ECGenParameterSpec ecSpec = new ECGenParameterSpec("prime192v1");

            // Initialize the key generator and generate a KeyPair

            keyGen.initialize(ecSpec, random); //256

            KeyPair keyPair = keyGen.generateKeyPair();

            // Set the public and private keys from the keyPair

            privateKey = keyPair.getPrivate();

            publicKey = keyPair.getPublic();

 

        }catch(Exception e) {

            throw new RuntimeException(e);

        }

    }

 

公钥和私钥究竟是起到什么作用呢,其实公钥的作用就是地址,你可以分享你的公钥给别人以此来获取付款,而你的私钥的作用是为了对交易进行签名,这样其他人就不可以花费你的金额除非它拥有你的私钥,所以对于每个人而言我们必须保护好我们的私钥,不能透露我们的私钥信息给其他人。同时在我们进行交易的时候我们也会同时发送我们的公钥由此来验证我们的签名是有效的而且没有数据被篡改。

我们在密钥对KeyPair生成私有和公钥。我们将使用椭圆曲线加密来生成我们的密钥对KeyPair。让我们将generateKeyPair()方法添加到我们的钱包类中,并在构造函数中调用它:

私钥用于签署我们不想被篡改的数据。公钥用于验证签名。

 

②、交易和数字签名

每笔交易将携带一定以下信息:

  1. 资金付款人的公匙信息。

  2. 资金收款人的公匙信息。

  3. 被转移资金的金额。

  4. 输入,它是对以前的交易的引用,证明发送者有资金发送。

  5. 输出,显示交易中收款方相关地址数量。(这些输出被引用为新交易的输入)

  6. 一个加密签名,证明该交易是由地址的发送者是发送的,并且数据没有被更改。(阻止第三方机构更改发送的数量)

让我们创建这个新的交易类:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

import java.security.*;import java.util.ArrayList;public class Transaction {

     

    public String transactionId; // this is also the hash of the transaction.

    public PublicKey sender; // senders address/public key.

    public PublicKey reciepient; // Recipients address/public key.

    public float value;

    public byte[] signature; // this is to prevent anybody else from spending funds in our wallet.

     

    public ArrayList<TransactionInput> inputs = new ArrayList<TransactionInput>();

    public ArrayList<TransactionOutput> outputs = new ArrayList<TransactionOutput>();

     

    private static int sequence = 0// a rough count of how many transactions have been generated. 

     

    // Constructor: 

    public Transaction(PublicKey from, PublicKey to, float value,  ArrayList<TransactionInput> inputs) {

        this.sender = from;

        this.reciepient = to;

        this.value = value;

        this.inputs = inputs;

    }

     

    // This Calculates the transaction hash (which will be used as its Id)

    private String calulateHash() {

        sequence++; //increase the sequence to avoid 2 identical transactions having the same hash

        return StringUtil.applySha256(

                StringUtil.getStringFromKey(sender) +

                StringUtil.getStringFromKey(reciepient) +

                Float.toString(value) + sequence

                );

    }}

我们还应该创建空的transactioninput和transactionoutput类,不要担心我们可以在后面填写它们。  我们的交易类还将包含生成/验证签名和验证交易的相关方法,那么签名的意图是什么?签名在我们的区块链中执行了两个非常重要的任务:第一,签名用来保证只有货币的拥有者才可以用来发送自己的货币,第二,签名用来阻止其他人试图篡改提交的交易。

即私钥被用来签名数据,而公钥用来验证其完整性。

举个例子:张三想要发送2个加密货币给李四,他们用各自的钱包创建了交易,并提交到全网的区块链中作为一个新的区块,一个挖矿者试图篡改接受者把2个加密货币给小明,但是幸运的事,张三在交易数据中已经用私钥进行了签名,这就允许了全网中的任何节点使用张三的公匙进行验证数据是否已经被篡改(因为没有其他人的公钥可以用来验证小明发出的这笔交易)。

从前面的代码中我们可以看到我们的签名将是一堆字符串,所以让我们创建一个方法来生成它们。首先我们在StringUtil类中创建产生签名的方法。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

public static byte[] applyECDSASig(PrivateKey privateKey, String input) {

        Signature dsa;

        byte[] output = new byte[0];

        try {

            dsa = Signature.getInstance("ECDSA""BC");

            dsa.initSign(privateKey);

            byte[] strByte = input.getBytes();

            dsa.update(strByte);

            byte[] realSig = dsa.sign();

            output = realSig;

        catch (Exception e) {

            throw new RuntimeException(e);

        }

        return output;

    }

     

    //Verifies a String signature 

    public static boolean verifyECDSASig(PublicKey publicKey, String data, byte[] signature) {

        try {

            Signature ecdsaVerify = Signature.getInstance("ECDSA""BC");

            ecdsaVerify.initVerify(publicKey);

            ecdsaVerify.update(data.getBytes());

            return ecdsaVerify.verify(signature);

        }catch(Exception e) {

            throw new RuntimeException(e);

        }

    }

 

    public static String getStringFromKey(Key key) {

        return Base64.getEncoder().encodeToString(key.getEncoded());

    }

不用担心你不能理解这些方法的内容,你所需要知道的就是applyECDSASig方法的输入参数为付款人的私钥和需要加密的数据信息,签名后返回字节数组。而verifyECDSASig方法的输入参数为公钥、加密的数据和签名,调用该方法后返回true或false来说明签名是否是有效的。getStringFromKey返回任何key的编码字符串

让我们使用签名的方法在交易类中,增加generatesiganature() 和 varifiysignature()方法

1

2

3

4

5

6

7

//Signs all the data we dont wish to be tampered with.public void generateSignature(PrivateKey privateKey) {

    String data = StringUtil.getStringFromKey(sender) + StringUtil.getStringFromKey(reciepient) + Float.toString(value)  ;

    signature = StringUtil.applyECDSASig(privateKey,data);        }

     

    //Verifies the data we signed hasnt been tampered withpublic boolean verifiySignature() {

    String data = StringUtil.getStringFromKey(sender) + StringUtil.getStringFromKey(reciepient) + Float.toString(value)  ;

    return StringUtil.verifyECDSASig(sender, data, signature);}

在现实中,您可能希望签名更多信息,例如使用的输出/输入和/或时间戳(现在我们只是签名最低限度的信息)签名将由矿工验证,只有签名验证成功后交易才能被添加到区块中去。

当我们检查区块链的有效性时,我们也可以检查签名

 

③、测试钱包和签名

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

import java.security.Security;import java.util.ArrayList;import java.util.Base64;import com.google.gson.GsonBuilder;public class NoobChain {

     

    public static ArrayList<Block> blockchain = new ArrayList<Block>();

    public static int difficulty = 5;

    public static Wallet walletA;

    public static Wallet walletB;

 

    public static void main(String[] args) {  

        //Setup Bouncey castle as a Security Provider

        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 

        //Create the new wallets

        walletA = new Wallet();

        walletB = new Wallet();

        //Test public and private keys

        System.out.println("Private and public keys:");

        System.out.println(StringUtil.getStringFromKey(walletA.privateKey));

        System.out.println(StringUtil.getStringFromKey(walletA.publicKey));

        //Create a test transaction from WalletA to walletB 

        Transaction transaction = new Transaction(walletA.publicKey, walletB.publicKey, 5null);

        transaction.generateSignature(walletA.privateKey);

        //Verify the signature works and verify it from the public key

        System.out.println("Is signature verified");

        System.out.println(transaction.verifiySignature());

         

    }

 

确定要添加bounceycastle依赖

我们创建了两个钱包walleta和walletb,然后打印了walleta的私钥和公钥。生成一个交易并使用walleta的私钥对其进行签名。

打印

1

Connected to the target VM, address: '127.0.0.1:55757', transport: 'socket'Private and public keys:MHsCAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQEEYTBfAgEBBBiJzZiesBnBWwwB+uog+fJX84mx4lPUTUagCgYIKoZIzj0DAQGhNAMyAAQfPzad0zqBUGQAany2rRZE1+2ml5IOCZST8LywjBQT8ux+3UPVbr2u0+LaExxz1WI=MEkwEwYHKoZIzj0CAQYIKoZIzj0DAQEDMgAEHz82ndM6gVBkAGp8tq0WRNftppeSDgmUk/C8sIwUE/Lsft1D1W69rtPi2hMcc9ViIs signature verifiedtrue

接下来我们将创建并验证输入和输出,并把交易保存到区块链中去。

 

输入和输出 1:如何验证货币是你的

如果你拥有1比特币,你必须前面就得接收1比特币。比特币的账本不会在你的账户中增加一个比特币也不会从发送者那里减去一个比特币,发送者只能指向他/她之前收到过一个比特币,所以一个交易输出被创建用来显示一个比特币发送给你的地址(交易的输入指向前一个交易的输出)。

你的钱包余额是所有未使用的交易输出的总和

从这一个点出发,我们会依照比特币中的说明,把所有未使用的交易输出称为UTXO.

创建TransactionInput 类:

1

2

3

4

5

6

7

public class TransactionInput {

    public String transactionOutputId; //Reference to TransactionOutputs -> transactionId

    public TransactionOutput UTXO; //Contains the Unspent transaction output

     

    public TransactionInput(String transactionOutputId) {

        this.transactionOutputId = transactionOutputId;

    }}

这个类将用于引用尚未使用的transactionoutputtransactionOutputId将用于查找相关的TransactionOutput,允许矿工检查您的所有权。

创建TransactionOutputs 类:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

import java.security.PublicKey;public class TransactionOutput {

    public String id;

    public PublicKey reciepient; //also known as the new owner of these coins.

    public float value; //the amount of coins they own

    public String parentTransactionId; //the id of the transaction this output was created in

     

    //Constructor

    public TransactionOutput(PublicKey reciepient, float value, String parentTransactionId) {

        this.reciepient = reciepient;

        this.value = value;

        this.parentTransactionId = parentTransactionId;

        this.id = StringUtil.applySha256(StringUtil.getStringFromKey(reciepient)+Float.toString(value)+parentTransactionId);

    }

     

    //Check if coin belongs to you

    public boolean isMine(PublicKey publicKey) {

        return (publicKey == reciepient);

    }

    }

交易输出类将显示从交易中发送给每一方的最终金额。这些作为新交易中的输入参考,作为证明你可以发送的金额数量。

 

输入和输出 2:处理交易

区块链可能会收到很多交易,而区块链可能会非常长,因为我们必须查找并检查其输入,所以可能需要非常长的时间来处理新的交易。为了解决这个问题,我们保存了一个额外的集合称之为为使用的交易作为可用的输入,所以在主函数中增加一个集合称为UTXO。

1

2

3

4

5

6

7

8

9

public class NoobChain {

     

    public static ArrayList<Block> blockchain = new ArrayList<Block>();

    public static HashMap<String,TransactionOutputs> UTXOs = new HashMap<String,TransactionOutputs>(); //list of all unspent transactions. 

    public static int difficulty = 5;

    public static Wallet walletA;

    public static Wallet walletB;

 

    public static void main(String[] args) {  

 

hashmap允许我们使用键来查找值,但是您需要导入java.util.hashmap

重点来了,我们在交易类中增加一个processTransaction方法,这个方法是把一切放在一起用来处理交易。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

//Returns true if new transaction could be created.  public boolean processTransaction() {

         

        if(verifiySignature() == false) {

            System.out.println("#Transaction Signature failed to verify");

            return false;

        }

                 

        //gather transaction inputs (Make sure they are unspent):

        for(TransactionInput i : inputs) {

            i.UTXO = NoobChain.UTXOs.get(i.transactionOutputId);

        }

 

        //check if transaction is valid:

        if(getInputsValue() < NoobChain.minimumTransaction) {

            System.out.println("#Transaction Inputs to small: " + getInputsValue());

            return false;

        }

         

        //generate transaction outputs:

        float leftOver = getInputsValue() - value; //get value of inputs then the left over change:

        transactionId = calulateHash();

        outputs.add(new TransactionOutput( this.reciepient, value,transactionId)); //send value to recipient

        outputs.add(new TransactionOutput( this.sender, leftOver,transactionId)); //send the left over 'change' back to sender      

                 

        //add outputs to Unspent list

        for(TransactionOutput o : outputs) {

            NoobChain.UTXOs.put(o.id , o);

        }

         

        //remove transaction inputs from UTXO lists as spent:

        for(TransactionInput i : inputs) {

            if(i.UTXO == nullcontinue//if Transaction can't be found skip it 

            NoobChain.UTXOs.remove(i.UTXO.id);

        }

         

        return true;

    }

    //returns sum of inputs(UTXOs) values

    public float getInputsValue() {

        float total = 0;

        for(TransactionInput i : inputs) {

            if(i.UTXO == nullcontinue//if Transaction can't be found skip it 

            total += i.UTXO.value;

        }

        return total;

    }//returns sum of outputs:

    public float getOutputsValue() {

        float total = 0;

        for(TransactionOutput o : outputs) {

            total += o.value;

        }

        return total;

    }

我们还添加了getinputsvalue方法

通过这种方法,我们执行一些检查以确保交易有效,然后收集输入并生成输出。最重要的是,最后,我们抛弃了输入在我们的UTXO列表,这就意味着一个可以使用的交易输出必须之前一定是输入,所以输入的值必须被完全使用,所以付款人必须改变它们自身的金额状态。

https://raw.githubusercontent.com/longfeizheng/longfeizheng.github.io/master/images/qukuai/qukuai04.png

红色箭头是输出。请注意,绿色输入是对之前输出的参考

最后让我们修改我们的wallet类

  • 搜集余额(通过循环遍历UTXO列表来检查交易的输出是否是我的)并

  • 创建交易

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

import java.security.*;import java.security.spec.ECGenParameterSpec;import java.util.ArrayList;import java.util.HashMap;import java.util.Map;public class Wallet {

     

    public PrivateKey privateKey;

    public PublicKey publicKey;

     

    public HashMap<String,TransactionOutput> UTXOs = new HashMap<String,TransactionOutput>(); //only UTXOs owned by this wallet.

     

    public Wallet() {...

         

    public void generateKeyPair() {...

     

  //returns balance and stores the UTXO's owned by this wallet in this.UTXOs

    public float getBalance() {

        float total = 0;

        for (Map.Entry<String, TransactionOutput> item: NoobChain.UTXOs.entrySet()){

            TransactionOutput UTXO = item.getValue();

            if(UTXO.isMine(publicKey)) { //if output belongs to me ( if coins belong to me )

                UTXOs.put(UTXO.id,UTXO); //add it to our list of unspent transactions.

                total += UTXO.value ; 

            }

        }  

        return total;

    }

    //Generates and returns a new transaction from this wallet.

    public Transaction sendFunds(PublicKey _recipient,float value ) {

        if(getBalance() < value) { //gather balance and check funds.

            System.out.println("#Not Enough funds to send transaction. Transaction Discarded.");

            return null;

        }

    //create array list of inputs

        ArrayList<TransactionInput> inputs = new ArrayList<TransactionInput>();

     

        float total = 0;

        for (Map.Entry<String, TransactionOutput> item: UTXOs.entrySet()){

            TransactionOutput UTXO = item.getValue();

            total += UTXO.value;

            inputs.add(new TransactionInput(UTXO.id));

            if(total > value) break;

        }

         

        Transaction newTransaction = new Transaction(publicKey, _recipient , value, inputs);

        newTransaction.generateSignature(privateKey);

         

        for(TransactionInput input: inputs){

            UTXOs.remove(input.transactionOutputId);

        }

        return newTransaction;

    }

    }

你可以随时为钱包添加一些其他功能,例如记录您的交易历史记录。

④、添加交易到区块中

现在我们已经有了一个有效的交易系统,我们需要把交易加入到我们的区块链中。我们把交易列表替换我们块中无用的数据,但是在一个单一的区块中可能存放了1000个交易,这就会导致大量的hash计算,不用担心在这里我们使用了交易的merkle root,稍后你会看到。让我们增加一个帮助方法来创建merkle rootStringUtils类中。

StringUtils类中创建getMerkleRoot方法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

//Tacks in array of transactions and returns a merkle root.public static String getMerkleRoot(ArrayList<Transaction> transactions) {

        int count = transactions.size();

        ArrayList<String> previousTreeLayer = new ArrayList<String>();

        for(Transaction transaction : transactions) {

            previousTreeLayer.add(transaction.transactionId);

        }

        ArrayList<String> treeLayer = previousTreeLayer;

        while(count > 1) {

            treeLayer = new ArrayList<String>();

            for(int i=1; i < previousTreeLayer.size(); i++) {

                treeLayer.add(applySha256(previousTreeLayer.get(i-1) + previousTreeLayer.get(i)));

            }

            count = treeLayer.size();

            previousTreeLayer = treeLayer;

        }

        String merkleRoot = (treeLayer.size() == 1) ? treeLayer.get(0) : "";

        return merkleRoot;

    }

修来Block 类

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

import java.util.ArrayList;import java.util.Date;public class Block {

     

    public String hash;

    public String previousHash; 

    public String merkleRoot;

    public ArrayList<Transaction> transactions = new ArrayList<Transaction>(); //our data will be a simple message.

    public long timeStamp; //as number of milliseconds since 1/1/1970.

    public int nonce;

     

    //Block Constructor.  

    public Block(String previousHash ) {

        this.previousHash = previousHash;

        this.timeStamp = new Date().getTime();

         

        this.hash = calculateHash(); //Making sure we do this after we set the other values.

    }

     

    //Calculate new hash based on blocks contents

    public String calculateHash() {

        String calculatedhash = StringUtil.applySha256( 

                previousHash +

                Long.toString(timeStamp) +

                Integer.toString(nonce) + 

                merkleRoot

                );

        return calculatedhash;

    }

     

    //Increases nonce value until hash target is reached.

    public void mineBlock(int difficulty) {

        merkleRoot = StringUtil.getMerkleRoot(transactions);

        String target = StringUtil.getDificultyString(difficulty); //Create a string with difficulty * "0" 

        while(!hash.substring( 0, difficulty).equals(target)) {

            nonce ++;

            hash = calculateHash();

        }

        System.out.println("Block Mined!!! : " + hash);

    }

     

    //Add transactions to this block

    public boolean addTransaction(Transaction transaction) {

        //process transaction and check if valid, unless block is genesis block then ignore.

        if(transaction == nullreturn false;      

        if((previousHash != "0")) {

            if((transaction.processTransaction() != true)) {

                System.out.println("Transaction failed to process. Discarded.");

                return false;

            }

        }

        transactions.add(transaction);

        System.out.println("Transaction Successfully added to Block");

        return true;

    }

    }

需要注意的是我们还更新了Block构造函数,因为我们不再需要传递字符串数据,并将merkle root包含在计算哈希方法中。addTransaction方法用来增加交易,只有满足条件下才可以成功的在区块中增加交易。

我们已经实现了一个可交易的区块链。

三、项目结构图

image.png

四、补充

本demo实现了可交易的区块链

  • 允许用户创建钱包

  • 使用椭圆曲线加密方式为钱包提供公钥和私钥

  • 通过使用数字签名算法证明所有权,确保资金转移

  • 允许用户在区块链上进行交易

 

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

相关文章

  1. 第一次学习总结

    **关键字:**被java语言特定含义的单词,组成关键字的单词全部都要小写。 ​ class,public,static,void,interface,extends,abstract等基本数据类型。 **标识符:**给接口(类)变量(方法)起名字的字符序列 ​ 类和接口 命名:大驼峰命名法 ​ …...

    2024/4/20 9:14:55
  2. 02_分文件实现酒店房费计算

    把函数原型和已定义的字符常量放在头文件中是一个良好的编程习惯。 我们考虑一个例子: 假设要管理4家酒店的客房服务,每家酒店的房价不同,但是每家酒店所有房间的房价相同。对于预订住宿多天的客户,第2天的房费是第1天的95%,第3天的房费是第2天的95%,以此类推。暂不考虑积…...

    2024/4/27 21:27:40
  3. 海外/全球动态HTTP代理IP池测评(HTTP/HTTPS/S5)

    作为一名资深的程序员,经常会因为公司的业务类型,做一些爬虫相关的脚本,尤其是需要采集海外网站数据的时候,国内的IP往往都是无法使用的,长期使用了一些海外IP,正好今天休息,简单的写写,分享给大家。一、Ipidea 网址:www.ipidea.net 介绍:Ipidea是一家国内的住宅IP服…...

    2024/4/16 17:17:39
  4. 基于JavaWeb的团员管理系统(源码+数据库+论文)

    随着科学技术的发展,计算机应用于各个领域,高校作为培养人才的阵地计算机的运用更为普遍。然而传统的团务管理采用手工管理模式,工作量大,效率低、保密性差,团员信息动态变化快、管理人员少、从而更增大管理难度。根据这一背景,为提高团员管理的工作效率和工作质量,经过…...

    2024/4/27 17:29:48
  5. 苹果即将推出的共享表情图案,将被添加到iPhone、ipad

    7月17日是世界表情包日(World Emoji Day),苹果为庆祝这一节日,将推出的共享表情图案2020添加到iPhone手机,ipad的预览当中。2020年发布的表情符号是表情符号13更新的一部分,其中包括以下表情符号选项: 面孔:含泪,变相面孔的笑脸 人:忍者,燕尾服的人,燕尾服的女人,有…...

    2024/4/8 23:43:44
  6. spring boot 启动

    使用debug模式去运行程序,阅读源码初始化流程spring 容器的初始化创建了SpringApplication对象实例,实例中通过path去判段使用的web容器的类型,并且调用了对象实例的run方法run方法中启动了计时器,创建并启动所有监听器,初始化运行环境(加载配置),判断应该创建哪一种Ap…...

    2024/4/20 20:44:24
  7. 键盘录入月份的值,输出对应的季节

    键盘录入月份的值,输出对应的季节(if、switch) 实现:3,4,5 春季;6,7,8 夏季;9,10,11 秋季;12,1,2 冬季使用if选择结构语句import java.util.Scanner ; class TestDemo2{public static void main(String[] args){//创建键盘录入对象Scanner sc = new Scanner(System.in…...

    2024/4/25 10:52:35
  8. 微信会员卡如何为不同用户设置不同有效期?

    前言老板要求自家会员体系与微信卡包会员卡打通,挺高用户的体验以及开拓更大的微信流量入口。在打通自家会员卡与微信卡包会员过程中,遇到为不同会员设置不同的微信会员卡有效期的问题,以下分享我实现微信会员卡不同有效期的经验。正文微信公众号平台创建的卡包,时间有效期…...

    2024/4/14 18:14:29
  9. Java基础知识一周学习总结

    Java基础知识一周总结 认识Java Java语言是一种强类型语言,在Java语言中英文字母的大小写等这些都有规定,知道Java是一种强类型语言之后,我们再来了解与Java语言息息相关的JDK,jdk是Java语言的开发工具,jdk中又包含jre 和jvm,jre是Java语言的运行环境,jvm是虚拟计算机,…...

    2024/4/8 23:43:40
  10. 树莓派4B安装系统,pytorch,opencv搭建深度学习目标检测模型

    树莓派4B跑深度学习模型 树莓派目标检测树莓派4B跑深度学习模型树莓派4B简介树莓派系统烧录烧录步骤配置树莓派开机wifi连接远程连接前的配置远程连接获取树莓派的IP地址进入到树莓派系统的简单操作第一,更换显示中文界面第二安装pytorch,opencv测试安装是否成功 树莓派4B简介…...

    2024/4/14 6:09:34
  11. python用于机器学习和数据分析的用途

    最近学校数学建模大赛正在培训python。这让我又突然对python感兴趣了,在考虑未来python可以为我做什么,通过搜集资料,主要对以下两个方向感兴趣,机器学习和数据分析。 一、机器学习 数据科学 —— 包括机器学习、数据分析和数据可视化 首先,我们来回顾一下什么是机器学习。…...

    2024/4/8 23:43:38
  12. HTTP状态码详解

    HTTP状态码详解状态码含义100客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。服务器必须在请求完成后向客户端发送一个最终响应。101服务器已经理…...

    2024/4/8 23:43:37
  13. 2020流动式起重机司机证考试及流动式起重机司机考试试题

    题库来源:安全生产模拟考试一点通公众号小程序2020流动式起重机司机证考试及流动式起重机司机考试试题,包含流动式起重机司机证考试答案解析及流动式起重机司机考试试题练习。由安全生产模拟考试一点通公众号结合国家流动式起重机司机考试最新大纲及流动式起重机司机考试真题…...

    2024/4/8 23:43:36
  14. 程序员高薪盛宴背后:程序员正在消失?

    最近几个月裁员潮/失业潮一直是人们热议的话题。不少企业倒闭,甚至有不少巨头和独角兽公司,都在做组织架构的优化。尤其是,互联网行业更新换代快,这几年甚至流行“互联网公司的中年危机”的说法。很多互联网人到了35岁边缘就不自觉地产生焦虑,担心被优化,担心再也找不到好…...

    2024/4/20 3:29:22
  15. 网络安全第三篇【批处理和用户组管理】

    一、批处理1.1 批处理的作用至上而下的成批处理每一条命令,直到最后一条(遇到错误命令,跳过执行后面的)1.2 如何创建批处理扩展名: .bat创建方式: 创建记事本,将txt改成bat注意:1. 批处理格式开头需要使用@echo off ,关闭执行过程,只展示执行结果2. 结尾可以使用pause命…...

    2024/4/22 12:36:14
  16. 北京公布基于区块链的政府计划

    北京地方政府周四发布了其实施基于区块链的可编程政府的计划蓝图。这是中国首都首次提出如何在运营中实施区块链的细节。政府在计划中的主要目标是建立基于区块链的数字治理统一框架,促进机构与企业之间的数据共享,并实现跨部门和跨区域的协作。这份长达145页的蓝图仅列出了在…...

    2024/4/16 12:12:45
  17. 面试必备-面试技巧

    猴哥,今天和朋友们来聊聊关于面试中的一些技巧,希望能够对正在找工作的朋友们起到一丝作用,同时也会接受朋友们的提出的宝贵意见进行改进。同学们在找工作投简历的时候,会看见公司要求的技能,此时一定及时告知hr,要求的技能,你会哪些,哪些没有用到过。从而防止,你去面…...

    2024/4/12 12:40:19
  18. 一条淡水鱼的一些话

    先说说为什么想要开始写一些东西出来吧,当然我现在还不认为我能写出什么能够帮助到别人的技术类博客,不过这是我接下来努力的方向,努力学习,然后分享出我认为有用且能够帮助到大家的博客.其实目前我想写的东西都是为了记录自己的轨迹,作为一名大三(因为疫情其实算准大四了)的准…...

    2024/4/20 14:53:13
  19. [转]react suspense的认识和了解(转载请删除括号里的内容)

    react suspense的认识和了解react suspense见名知意后续版本相关技术背景解决的问题或者说一些使用场景当然凡事都有两面性code splittingasync data fetching(还在生产中)make app more "performant with a better user experience(使用一种用户友好的方式使你的app性能更…...

    2024/4/8 22:46:11
  20. LLC工作模态详解

    本文首发于公众号「 iFTrue 未来已来 」在公众号后台回复“LLC资料”获取更多资源在公众号后台回复“译文”获取经典著作的翻译「 iFTrue 未来已来 」「拓扑特点」以半桥LLC谐振变换器为例,主开关Q1、Q2构成半桥结构,其驱动信号为固定占空比50%的互补信号,并且在上下桥臂之间…...

    2024/4/8 22:46:09

最新文章

  1. C# Solidworks二次开发:枚举应用实战(第二讲)

    大家好&#xff0c;今天要介绍的还是关于枚举的使用&#xff0c;大家没看过上一篇的额可以去看一下&#xff0c;这是地址&#xff1a; C# Solidworks二次开发&#xff1a;枚举在solidworks中的使用详解-CSDN博客 下面开始介绍今天的枚举&#xff1a; &#xff08;1&#xff…...

    2024/4/27 22:20:00
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 【Linux实验室】NFS、DHCP的搭建

    NFS、DHCP的搭建 1、nfs服务搭建及测试什么是NFS&#xff1f;环境准备服务端机器安装nfs-utils和rpcbind包启动NFS服务创建/data/NFSdata目录&#xff0c;配置nfs文件启动服务挂载测试在服务端在共享目录下创建文件测试在客户端在共享目录下创建文件 2、dhcp服务搭建及测试什么…...

    2024/4/23 12:03:02
  4. 【单调队列】滑动窗口与子矩阵

    一、滑动窗口 给定一个大小为 n≤1e6 的数组。 有一个大小为 k 的滑动窗口&#xff0c;它从数组的最左边移动到最右边。 你只能在窗口中看到 k 个数字。 每次滑动窗口向右移动一个位置。 以下是一个例子&#xff1a; 该数组为 [1 3 -1 -3 5 3 6 7]&#xff0c;k 为 3。 …...

    2024/4/25 0:42:32
  5. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/4/27 1:53:53
  6. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/4/27 3:39:11
  7. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/4/27 12:24:35
  8. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/4/27 12:24:46
  9. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/4/27 3:39:08
  10. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/4/27 3:39:07
  11. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/4/27 3:39:07
  12. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/4/27 12:44:49
  13. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/4/27 21:08:20
  14. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/4/26 22:35:59
  15. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/4/27 18:40:35
  16. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/4/27 3:39:03
  17. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/4/27 13:52:15
  18. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/4/27 13:38:13
  19. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/4/27 1:03:20
  20. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/4/27 3:22:12
  21. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/4/26 21:29:56
  22. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/4/27 3:39:00
  23. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/4/26 23:53:24
  24. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/4/27 20:28:35
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57