Golang囊地鼠gopher

embedded/2024/12/20 13:06:29/

在这里插入图片描述

开发知识点-golang

  • 介绍
  • 红队专题-Golang工具Fscan
  • 简介
    • 主要功能
  • ubuntu 安装
  • windows 安装
  • 常用命令:
  • 项目框架
    • 源文件
    • common目录
    • Plugins目录
    • Webscan目录
  • 入口点
  • 插件扫描类型
  • 爆破插件
    • common.Scantype
  • Webtitle函数
  • webpoc扫描
    • POC 执行
    • CEL-GO 实践
      • CEL
    • 指纹识别
  • 免杀
    • 源码特征
  • 参考链接
  • 红队专题-Golang工具ChYing
  • 原chying工具代码分析
    • 并发访问控制
      • 并发 原子 写入
      • 读取
    • 通道
    • 嵌套映射结构
    • 初始化
    • 启动代理服务器
    • 重启代理服务器
  • vite 构建前端页面
  • 编译
  • 标准库
    • bytes
    • fmt
    • io
    • ioioutil
    • os
    • osexec
    • path
    • sync
  • 第三方包
  • gui
  • init
  • **Go工作目录及包创建**
  • 初始化
  • **Go环境变量配置**
        • 方法1、
  • 代码混淆
  • 编译混淆
  • honnef.co/go/tools/cmd/staticcheck
  • WailsJS
  • 新建 helloword
  • 类型
    • 基本类型
    • 变量(variable)
      • 命名
        • 空标识符
      • 定义
        • 简短模式(short variable declaration)
      • 多变量赋值
      • 未使用错误
    • 常量
  • 枚举
  • 关键字
    • var
  • 环境搭建
    • win10配置go环境
  • ubuntu20.04安装golang
  • 介绍
  • 下载 Go 压缩包
  • 调整环境变量
  • 验证 Go 安装过程

libp2p/go-libp2p: libp2p implementation in Go (github.com)
go-libp2p,它提供了 DHT(IPFS 使用的 Kademlia DHT)和 QUIC 支持。

介绍

Go,通常被称为 golang
一门由 Google 创建的现代化的开源编程语言,
它允许你构建实时并且高效的应用。

很多流行的应用程序,
例如 Kubernetes,Docker,Prometheus 和 Terraform,
都是使用 Go 来编写的。

下载 Go 压缩包
Go 1.14.2
https://golang.google.cn/doc/install
​ ​https://golang.org/dl/​​

以 root 或者其他 sudo 用户身份运行下面的命令,
下载并且解压 Go 二进制文件到/usr/local目录

调整环境变量
通过将 Go 目录添加到$PATH环境变量,
系统将会知道在哪里可以找到 Go 可执行文件。

这个可以通过添加到/etc/profile文件(系统范围内安装)
或者$HOME/.profile文件(当前用户安装):

登录后复制

export PATH=$PATH:/usr/local/go/bin
1.
保存文件,并且重新加载新的PATH 环境变量到当前的 shell 会话:

登录后复制

source ~/.profile
1.
验证 Go 安装过程
通过打印 Go 版本号,验证安装过程。

登录后复制

go version
1.
复制
输出应该像下面这样:

go version go1.14.2 linux/amd6

go.sum
记录项目依赖的确切版本,以确保在不同环境中能够复现相同的构建结果。

go.mod

go.uber.org/fx

用于Go语言的依赖注入(Dependency Injection)库。
帮助开发者从应用程序中删除全局状态,不再使用init()函数或全局变量,而是使用fx管理的单例。此外,fx允许组织内的团队构建松散耦合且良好集成的可共享组件,是Uber公司几乎所有Go服务的支柱。
goimports
go get github.com/spf13/cobra用于创建命令行工具的库(框架),可以创建出类似git或者go一样的工具,进行我们平时熟悉的git clone/pull、go get/install等操作。kubernetes工具中就使用了cobra。上述这些命令行工具的--help/-h既好看又好理解,开始时我也会好奇这些工具是如何实现多级子命令支持的?cobra的目标即是提供快速构建出此类工具的能力(cobra是框架,具体的业务逻辑当然还是要自己写)。例如可以为我们app或系统工具的bin文件添加--config来启动服务、添加--version来查看版本号等等。相比起标准库里的flag包,cobra强大了很多。官网列出了cobra的一大堆优点:1. 易用的subcommand模式(即嵌套命令或子命令)2. 强大的flags支持(参考标准库flagSet)3. 支持global、local、cascading级别的flag设置4. 错误时的智能提示5. 自动生成的、美观的help信息,并默认支持--help和-h打印help信息6. 提供命令自动补全功能(bash, zsh, fish, powershell环境)7. 提供命令man page自动生成功能

golang.org/x/crypto/openpgp/armor

 Go 语言的一个扩展库,属于 `golang.org/x/crypto` 项目,专门用于处理 OpenPGP 消息的 ASCII 装甲(Armor)编码和解码。OpenPGP 是一种基于 PGP(Pretty Good Privacy)的加密和签名数据的标准,它广泛应用于电子邮件和文件的加密传输中。ASCII 装甲是一种文本编码方式,它可以将二进制数据编码为只包含 ASCII 字符的文本,这样数据就可以通过电子邮件、文本文件等方式安全地传输,而不会被邮件系统或文件存储系统错误地处理或损坏。

golang.org/x/crypto/openpgp/packet

专门用于处理 OpenPGP 消息中的各个包(packet)的解析和构造。OpenPGP 是一种基于 PGP(Pretty Good Privacy)的加密和签名数据的标准,它定义了如何在电子邮件和其他通信中安全地传输加密、签名和密钥交换数据。在 OpenPGP 消息中,数据被组织成一系列的包(packet),每个包都包含了一定类型的信息,如公钥、私钥、加密数据、签名等。`packet` 包提供了对这些包进行解析和构造的功能。

github.com/sirupsen/logrus


Go 语言的日志库它提供了丰富的日志输出和格式化功能,被广泛应用于 Go 语言项目中,用于记录程序的运行状态、错误信息和调试信息等

github.com/ulikunitz/xz

Go 语言的库,它提供了对 XZ 压缩格式的支持。XZ 是一种高效的压缩格式,它基于 LZMA2 压缩算法,通常比传统的 gzip 或 zip 格式提供更好的压缩率。这个库允许 Go 开发者在他们的项目中读取和写入 XZ 压缩的文件。

golang.zx2c4.com/wireguard/wgctrl/wgtypes


Go 语言中用于处理 WireGuard 配置和状态信息的包的一部分,它位于 WireGuard 的 Go 控制接口(wgctrl)库中。WireGuard 是一种新型的网络协议和工具,旨在提供一种快速、简单、安全的方式来加密网络流量。`wgtypes` 包主要定义了一系列与 WireGuard 配置相关的数据类型和常量,如网络接口配置(如 IP 地址、密钥等)、设备状态等。这些类型通常用于在应用程序和 WireGuard 控制接口之间进行数据交换。

golang.org/x/crypto/acme/autocert

Go 语言的一个库,它实现了自动证书管理环境(ACME)协议的客户端,用于自动获取和管理 Let's Encrypt 或其他支持 ACME 协议的证书颁发机构(CA)的 TLS 证书。这个库特别适用于需要自动续期证书并希望简化证书管理过程的 web 服务器和应用程序。
go mod init hello-worldpackage mainimport "fmt"func main() {fmt.Println("Hello, World!")
}
go复制代码package main import (	"crypto/aes"	"crypto/cipher"	"crypto/rand"	"encoding/base64"	"encoding/json"	"fmt"	"io") // 定义指令结构type Instruction struct {	Type    string `json:"type"`	Action  string `json:"action"`	Params  map[string]interface{} `json:"params"`	Signature string `json:"signature"` // 用于身份验证的签名} // 加密函数func encrypt(plaintext, key []byte) (string, error) {	block, err := aes.NewCipher(key)	if err != nil {		return "", err	} 	ciphertext := make([]byte, aes.BlockSize+len(plaintext)-aes.BlockSize%len(plaintext))	iv := ciphertext[:aes.BlockSize]	if _, err := io.ReadFull(rand.Reader, iv); err != nil {		return "", err	} 	stream := cipher.NewCFBEncrypter(block, iv)	stream.XORKeyStream(ciphertext[aes.BlockSize:], plaintext) 	return base64.StdEncoding.EncodeToString(ciphertext), nil} // 解密函数func decrypt(ciphertext string, key []byte) (string, error) {	encodedText, err := base64.StdEncoding.DecodeString(ciphertext)	if err != nil {		return "", err	} 	block, err := aes.NewCipher(key)	if err != nil {		return "", err	} 	iv := encodedText[:aes.BlockSize]	encodedText = encodedText[aes.BlockSize:] 	stream := cipher.NewCFBDecrypter(block, iv)	stream.XORKeyStream(encodedText, encodedText) 	return string(encodedText), nil}
  1. 节点激活机制

每个节点需要监听网络上的指令,验证指令格式和密钥,并在验证通过后激活为master节点。

go复制代码// 示例:节点监听和处理指令func listenForInstructions(listener net.Listener, secretKey []byte) {	for {		conn, err := listener.Accept()		if err != nil {			log.Println("Error accepting connection:", err)			continue		} 		go handleConnection(conn, secretKey)	}} func handleConnection(conn net.Conn, secretKey []byte) {	defer conn.Close()	buf := make([]byte, 1024)	n, err := conn.Read(buf)	if err != nil {		log.Println("Error reading from connection:", err)		return	} 	encryptedInstruction := string(buf[:n])	plaintextInstruction, err := decrypt(encryptedInstruction, secretKey)	if err != nil {		log.Println("Error decrypting instruction:", err)		return	} 	var instruction Instruction	err = json.Unmarshal([]byte(plaintextInstruction), &instruction)	if err != nil {		log.Println("Error parsing instruction:", err)		return	} 	// 验证签名(这里省略了具体实现)	if !verifySignature(instruction.Signature, instruction) {		log.Println("Invalid signature")		return	} 	// 激活为master节点(这里可以添加更多的逻辑)	activateAsMaster(instruction)} func activateAsMaster(instruction Instruction) {	fmt.Println("Activated as master with instruction:", instruction)	// 在这里实现master节点的逻辑} // 示例签名验证函数(需要具体实现)func verifySignature(signature string, instruction Instruction) bool {	// 实现签名验证逻辑	return true}
  1. Master节点权限

Master节点应该有一个时间限制,并且在权限过期后自动撤销。可以使用一个goroutine来监控master节点的状态。

go复制代码var masterActive boolvar masterExpireTime time.Timevar masterMutex sync.Mutex func activateAsMasterWithExpiry(instruction Instruction, duration time.Duration) {	masterMutex.Lock()	defer masterMutex.Unlock() 	masterActive = true	masterExpireTime = time.Now().Add(duration)	go monitorMasterStatus() 	// 在这里实现master节点的逻辑} func monitorMasterStatus() {	for {		masterMutex.Lock()		if !masterActive || time.Now().After(masterExpireTime) {			masterActive = false			fmt.Println("Master status expired or revoked")			masterMutex.Unlock()			break		}		masterMutex.Unlock()		time.Sleep(1 * time.Second)	}}
go复制代码package main import (	"crypto/hmac"	"crypto/sha256"	"encoding/hex"	"encoding/json"	"fmt"	"io/ioutil"	"log"	"net"	"net/http"	"sync"	"time") const (	secretKey = "your-secret-key" // 用于HMAC的秘密密钥	listenAddr = ":8080"          // 节点监听的地址) type DHT struct {	store  map[string]string	mu     sync.Mutex	master bool	timer  *time.Timer} type Command struct {	Type    string      `json:"type"`	Action  string      `json:"action"`	Key     string      `json:"key"`	Value   string      `json:"value,omitempty"`	Signature string    `json:"signature"`} func NewDHT() *DHT {	return &DHT{		store: make(map[string]string),	}} func (dht *DHT) Start() {	http.HandleFunc("/command", dht.handleCommand)	log.Println("DHT node is listening on", listenAddr)	log.Fatal(http.ListenAndServe(listenAddr, nil))} func (dht *DHT) handleCommand(w http.ResponseWriter, r *http.Request) {	body, err := ioutil.ReadAll(r.Body)	if err != nil {		http.Error(w, "Failed to read request body", http.StatusBadRequest)		return	}	defer r.Body.Close() 	var cmd Command	if err := json.Unmarshal(body, &cmd); err != nil {		http.Error(w, "Invalid JSON format", http.StatusBadRequest)		return	} 	if !dht.verifySignature(cmd) {		http.Error(w, "Invalid signature", http.StatusForbidden)		return	} 	if cmd.Type == "activate" && cmd.Action == "master" {		dht.activateAsMaster()		fmt.Fprintln(w, "Activated as master")		return	} 	if !dht.master {		http.Error(w, "Only master can execute commands", http.StatusForbidden)		return	} 	switch cmd.Action {	case "put":		dht.put(cmd.Key, cmd.Value)	case "get":		dht.get(w, cmd.Key)	case "delete":		dht.delete(cmd.Key)	default:		http.Error(w, "Unknown action", http.StatusBadRequest)	}} func (dht *DHT) verifySignature(cmd Command) bool {	message := fmt.Sprintf("%s:%s:%s", cmd.Type, cmd.Action, cmd.Key)	if cmd.Value != "" {		message += ":" + cmd.Value	}	h := hmac.New(sha256.New, []byte(secretKey))	h.Write([]byte(message))	expectedSignature := hex.EncodeToString(h.Sum(nil))	return hmac.Equal([]byte(expectedSignature), []byte(cmd.Signature))} func (dht *DHT) activateAsMaster() {	dht.mu.Lock()	defer dht.mu.Unlock()	dht.master = true	dht.timer = time.AfterFunc(10*time.Second, func() {		dht.mu.Lock()		defer dht.mu.Unlock()		dht.master = false		log.Println("Master privileges revoked")	})	log.Println("Activated as master for 10 seconds")} func (dht *DHT) put(key, value string) {	dht.mu.Lock()	defer dht.mu.Unlock()	dht.store[key] = value	log.Printf("Put key %s with value %s\n", key, value)} func (dht *DHT) get(w http.ResponseWriter, key string) {	dht.mu.Lock()	defer dht.mu.Unlock()	value, exists := dht.store[key]	if !exists {		http.Error(w, "Key not found", http.StatusNotFound)		return	}	fmt.Fprintln(w, value)} func (dht *DHT) delete(key string) {	dht.mu.Lock()	defer dht.mu.Unlock()	delete(dht.store, key)	log.Printf("Deleted key %s\n", key)} func main() {	dht := NewDHT()	dht.Start()}
go复制代码package main import (	"crypto/hmac"	"crypto/sha256"	"encoding/hex"	"encoding/json"	"fmt"	"io/ioutil"	"log"	"net"	"net/http"	"os"	"strconv"	"sync"	"time" 	"crypto/tls"	"crypto/x509") const (	networkPort       = "8080"	masterActivationKey = "supersecretkey" // Replace with a real secret key	masterDuration    = 10 * time.Second    // Master node duration) type Instruction struct {	Type    string      `json:"type"`	Params  interface{} `json:"params,omitempty"`	Timestamp int64     `json:"timestamp"`	HMAC      string    `json:"hmac"`} type Node struct {	id          string	isMaster    bool	masterTimer *time.Timer	mu          sync.Mutex} func (n *Node) ListenAndServe() {	http.HandleFunc("/receive", n.handleReceive)	server := &http.Server{		Addr: ":" + networkPort,		TLSConfig: &tls.Config{			MinVersion: tls.VersionTLS12,			ClientCAs:  x509.NewCertPool(), // Load client certificates here			ClientAuth: tls.RequireAndVerifyClientCert,		},	} 	// Load server certificates	cert, err := tls.LoadX509KeyPair("server.crt", "server.key")	if err != nil {		log.Fatalf("failed to load server certificates: %v", err)	}	server.TLSConfig.Certificates = []tls.Certificate{cert} 	log.Printf("Node %s listening on port %s...", n.id, networkPort)	err = server.ListenAndServeTLS("", "") // "" means use the TLSConfig to set certificates	if err != nil {		log.Fatalf("failed to start server: %v", err)	}} func (n *Node) handleReceive(w http.ResponseWriter, r *http.Request) {	if r.Method != http.MethodPost {		http.Error(w, "Invalid request method", http.StatusMethodNotAllowed)		return	} 	body, err := ioutil.ReadAll(r.Body)	if err != nil {		http.Error(w, "Failed to read request body", http.StatusBadRequest)		return	}	defer r.Body.Close() 	var instr Instruction	err = json.Unmarshal(body, &instr)	if err != nil {		http.Error(w, "Failed to unmarshal instruction", http.StatusBadRequest)		return	} 	if !n.verifyInstruction(instr) {		http.Error(w, "Invalid instruction signature", http.StatusForbidden)		return	} 	if instr.Type == "activate_master" {		n.activateAsMaster()		w.WriteHeader(http.StatusOK)		w.Write([]byte("Node activated as master"))		return	} 	if n.isMaster {		// Handle master-only operations here		n.logOperation(instr)		w.WriteHeader(http.StatusOK)		w.Write([]byte("Operation performed by master"))		return	} 	w.WriteHeader(http.StatusOK)	w.Write([]byte("Operation performed by regular node"))} func (n *Node) verifyInstruction(instr Instruction) bool {	timestampStr := strconv.FormatInt(instr.Timestamp, 10)	data := []byte(fmt.Sprintf("%s%s%s", instr.Type, timestampStr, fmt.Sprintf("%v", instr.Params)))	mac := hmac.New(sha256.New, []byte(masterActivationKey))	mac.Write(data)	expectedMAC := mac.Sum(nil) 	return hex.EncodeToString(expectedMAC) == instr.HMAC} func (n *Node) activateAsMaster() {	n.mu.Lock()	defer n.mu.Unlock() 	if n.isMaster {		return	} 	n.isMaster = true	n.masterTimer = time.AfterFunc(masterDuration, n.deactivateAsMaster)	log.Printf("Node %s activated as master for %v", n.id, masterDuration)} func (n *Node) deactivateAsMaster() {	n.mu.Lock()	defer n.mu.Unlock() 	if !n.isMaster {		return	} 	n.isMaster = false	log.Printf("Node %s deactivated as master", n.id)} func (n *Node) logOperation(instr Instruction) {	// Simple logging to stdout for demonstration	log.Printf("Master node %s performed operation: %v", n.id, instr)	// In a real-world application, log to a file or centralized logging service} func main() {	nodeID := "node1" // For demonstration, use a static ID	node := &Node{id: nodeID} 	// Ensure server certificates and keys are generated and available	if _, err := os.Stat("server.crt"); os.IsNotExist(err) {		log.Fatalf("server certificate not found: %v", err)	}	if _, err := os.Stat("server.key"); os.IsNotExist(err) {		log.Fatalf("server key not found: %v", err)	} 	node.ListenAndServe()}

“github.com/multiformats/go-multiaddr”
实现了多地址(Multiaddr)的编码、解码和解析功能。多地址是一种网络地址格式,旨在以一种统一和可扩展的方式表示各种网络协议和地址信息。这种格式被广泛应用于点对点(P2P)网络、区块链和其他分布式系统中。

#1. 设置DHT网络

使用现有的DHT库(如go-libp2p-dht)来设置DHT网络。

go复制代码import (    "github.com/libp2p/go-libp2p-dht"    // 其他必要的库) func setupDHT() (*dht.Dht, error) {    // 初始化DHT网络    // ...    return dhtInstance, nil}

TokTok/go-toxcore
为用户提供易于获取的安全和隐私保护的点对点(无服务器)即时通讯工具。它使用 libsodium(基于 NaCl)进行加密和身份验证。

go get github.com/quic-go/quic-go

Go语言编写的开源库,它实现了QUIC(Quick UDP Internet Connections)协议。
QUIC是一种在UDP(用户数据报协议)上运行的传输层网络协议,旨在提供低延迟、多路复用和加密的数据传输。这个库使得开发者能够轻松地在自己的Go项目中集成QUIC协议,从而利用该协议的优势来提升应用的性能和安全性。

Golang使用Quic-Go开源库实现Quic客户端和服务端_golang quic-CSDN博客

func setupQUICServer(listener net.PacketConn, dht *dht.Dht) {    config := &quic.Config{        // 配置QUIC参数    }    listener.SetReadDeadline(time.Now().Add(10 * time.Second))    for {        sess, err := quic.Accept(listener, config, nil)        if err != nil {            // 处理错误            continue        }        go handleSession(sess, dht)    }}

#3. 处理QUIC会话

在QUIC会话中处理客户端指令。

go复制代码func handleSession(sess quic.Session, dht *dht.Dht) {    stream, err := sess.AcceptStream()    if err != nil {        // 处理错误        return    }    defer stream.Close()     buf := make([]byte, 1024)    n, err := stream.Read(buf)    if err != nil {        // 处理错误        return    }     // 解析指令    var instruction Instruction    err = json.Unmarshal(buf[:n], &instruction)    if err != nil {        // 处理错误        return    }     // 验证HMAC签名和TLS证书    if !verifyHMAC(instruction, secretKey) || !verifyTLSCertificate(sess) {        // 发送错误响应        return    }     // 激活为master节点(如果需要)    if instruction.Type == "ACTIVATE_MASTER" {        activateAsMaster(dht, sessionID)    }     // 处理其他指令    // ...}

#4. 激活为Master节点

设置定时器以限制master权限的持续时间。

go复制代码var masterTimer *time.Timer func activateAsMaster(dht *dht.Dht, sessionID string) {    if masterTimer != nil {        return // 已经有一个master节点在运行    }    masterTimer = time.NewTimer(masterDuration)    go func() {        <-masterTimer.C        deactivateMaster(sessionID)    }()    // 执行master节点的操作    // ...} func deactivateMaster(sessionID string) {    // 撤销master权限    // ...}

#5. 安全措施和日志记录

确保所有通信都经过加密,并记录所有操作。

go复制代码func verifyHMAC(instruction Instruction, secretKey []byte) bool {    // 计算并验证HMAC签名    // ...    return true // 或 false} func verifyTLSCertificate(sess quic.Session) bool {    // 验证TLS证书    // ...    return true // 或 false} func logOperation(operation string, params map[string]interface{}) {    // 记录操作日志    // ...}
package main import (    "crypto/hmac"    "crypto/sha256"    "crypto/tls"    "crypto/x509"    "encoding/hex"    "fmt"    "io/ioutil"    "log"    "net"    "net/http"    "strings"    "time") // LoadTLSConfig loads TLS configuration from certificate and key filesfunc LoadTLSConfig(certFile, keyFile string) (*tls.Config, error) {    cert, err := tls.LoadX509KeyPair(certFile, keyFile)    if err != nil {        return nil, err    }     caCert, err := ioutil.ReadFile("ca.crt")    if err != nil {        return nil, err    }     caCertPool := x509.NewCertPool()    caCertPool.AppendCertsFromPEM(caCert)     tlsConfig := &tls.Config{        Certificates: []tls.Certificate{cert},        RootCAs:      caCertPool,        ClientCAs:    caCertPool,        ClientAuth:   tls.RequireAndVerifyClientCert,        MinVersion:   tls.VersionTLS12,        CipherSuites: []uint16{tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384},    }     return tlsConfig, nil} // GenerateHMAC generates HMAC using a secret key and a messagefunc GenerateHMAC(secret, message string) string {    h := hmac.New(sha256.New, []byte(secret))    h.Write([]byte(message))    return hex.EncodeToString(h.Sum(nil))} // VerifyHMAC verifies HMAC using a secret key, a message, and an HMAC valuefunc VerifyHMAC(secret, message, hmacValue string) bool {    expectedHMAC := GenerateHMAC(secret, message)    return hmacValue == expectedHMAC}

#2. DHT节点实现

这里我们简单实现一个DHT节点,使用内存存储哈希表。

type DHTNode struct {    ID          string    Store       map[string]string    Neighbors   []string    MasterKey   string    IsMaster    bool    Server      *http.Server    TLSConfig   *tls.Config} func NewDHTNode(id, certFile, keyFile, masterKey string) (*DHTNode, error) {    tlsConfig, err := LoadTLSConfig(certFile, keyFile)    if err != nil {        return nil, err    }     node := &DHTNode{        ID:          id,        Store:       make(map[string]string),        Neighbors:   []string{},        MasterKey:   masterKey,        IsMaster:    false,        TLSConfig:   tlsConfig,    }     mux := http.NewServeMux()    mux.HandleFunc("/put", node.handlePut)    mux.HandleFunc("/get", node.handleGet)    mux.HandleFunc("/activateMaster", node.handleActivateMaster)     server := &http.Server{        Addr:      ":8080",        Handler

http://www.ppmy.cn/embedded/147278.html

相关文章

【图像分类实用脚本】数据可视化以及高数量类别截断

图像分类时&#xff0c;如果某个类别或者某些类别的数量远大于其他类别的话&#xff0c;模型在计算的时候&#xff0c;更倾向于拟合数量更多的类别&#xff1b;因此&#xff0c;观察类别数量以及对数据量多的类别进行截断是很有必要的。 1.准备数据 数据的格式为图像分类数据集…

进程管理的关键:Linux进程状态与常用命令解析

个人主页&#xff1a;chian-ocean 文章专栏&#xff1a;Linux 前言&#xff1a; 在现代操作系统中&#xff0c;进程是资源分配和任务调度的基本单位。作为一个多任务操作系统&#xff0c;Linux 必须在多个进程之间进行有效的调度和管理&#xff0c;这就需要对每个进程进行状态…

前端打印(html)

目录 1.window.print() 2.使用插件print.js 1.window.print() <template> <div id"contenteBox">内容</div> <button click"printContent">打印</button> </template> <script> export default{ data(){ retu…

部署 Apache Samza 和 Apache Kafka

部署 Apache Samza 和 Apache Kafka 的流处理系统可以分为以下几个步骤,涵盖环境准备、部署细节和生产环境的优化。 1. 环境准备 硬件要求 Kafka Broker:至少 3 台服务器,建议每台服务器配备 4 核 CPU、16GB 内存和高速磁盘。Samza 部署节点:根据任务规模,至少准备 2 台…

车辆 CSMS 网络安全解析

车辆 CSMS 网络安全解析 摘要: 随着汽车智能化与网联化进程的加速,车辆网络安全面临着前所未有的挑战。车辆网络安全管理系统(CSMS)作为保障车辆网络安全的关键架构,涵盖了从车辆设计、开发、生产到运营、维护以及报废的全生命周期。本文深入解析车辆 CSMS 的网络安全,包…

使用TinyML方法的智能家居嵌入式智能关键词识别

论文标题&#xff1a;Embedded Intelligence for Smart Home Using TinyML Approaches to Keyword Spotting 中文标题&#xff1a;使用TinyML方法的智能家居嵌入式智能关键词识别 作者信息&#xff1a; Jyoti Mishra&#xff0c;Manipal University Jaipur, Jaipur 303007, …

【Linux】信号

【C语言】信号 信号1. 信号状态2. 信号处理方式3. 信号注册相关函数4. 信号集相关函数 信号 1. 信号状态 信号有三种状态&#xff1a;产生、未决和递达 信号产生方式&#xff1a; 按键产生&#xff0c;ctrlc 产生 中断信号SIGINT&#xff0c;ctrl \ 产生退出信号 SIGQUIT并…

JS使用random随机数实现简单的四则算数验证

1.效果图 2.代码实现 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</ti…