wordpress建站前端/百度用户客服电话
文章目录
- 第一部分:libp2p 快速入门
- 一、什么是libp2p
- libp2p 发展历程
- libp2p的特性
- p2p 网络和我们熟悉的 client/server 网络的区别:
- 二、Libp2p的实现目标
- 三、Libp2p的用途
- 四、运行 Libp2p 协议流程
- libp2p 分为三层
- libp2p 还有一个局域网节点发现协议 mDNS
- 第二部分:使用实战
- 一、基本接口
- multiaddr
- Host
- protocol.ID
- 如何封装 libp2p?
- 二、基本使用
- 参考
第一部分:libp2p 快速入门
一、什么是libp2p
libp2p 官网:非常重要,会解释非常多的新概念,是学习 libp2p 的第一课。
libp2p spec:这个是比官网更详细的开发指导手册,所有语言的实现都基于这个 specs。
rust-libp2p: libp2p 的 Rust 实现。
Libp2p是一个模块化的网络栈,通过将各种传输和P2P协议结合在一起,使得开发人员很容易构建大型、健壮的P2P网络。
libp2p 的产生是一个漫长的过程。 它是对网络协议栈的深层次的挖掘, 丰富了过去点对点的协议。在过去的15年里面, 构建大规模的点对点分布式应用及其复杂, libp2p的目标就是希望让事情变得简单。 Libp2p 设计的初衷就是为了支持未来的去中心化网络协议,它的宗旨是让开发者进行应用程序开发时,能确保他们的服务是可达且可用的。
如果说TCP/IP协议是互联网时代网络层的标准,那么libp2p的愿景是希望成为区块链时代,网络层的标准。 虽然离这个目标还想去甚远, 但随着ipv4地址的耗尽,以及区块链浪潮的到来,这苗星星之火仿佛已经燃起。
bp2p 包含一系列协议的实现,这些协议共同作用,完成了:
p2p 网络的传输层(下图绿色):支持几乎所有的主流传输协议,甚至允许不同节点间使用不同的传输层,比如 native 节点间优先使用 QUIC,而 native 和 web 节点间使用 websocket。
节点发现(黄色,注意这里 PKI 是指基于 PKI 的节点身份):一般本地网络可以使用 mDNS,大规模 p2p 网络一般使用 bootstrap 来连接初始节点,然后通过 gossip 获取更多节点信息,并通过 Kad DHT 来查找节点。
节点路由(蓝色):主要使用 Kad DHT 通过多跳来路由到网络中任意一个节点
内容路由(紫色):如果点对点发送消息,可以通过 Kad DHT,如果在网络中 flood,可以通过 floodsub 和 gossipsub 来对某个 topic 的内容进行广播。
NAT traversal(红色):包括主流的 hole punching 解决方案
(图片来源:A network framework for decentralized P2P application development [2])
libp2p 发展历程
libp2p孵化于ipfs项目, 最初libp2p是ipfs的网络层实现。 在过去的数十年间, 构建分布式p2p项目,一直是困扰大家的难题。 为简化这种操作,libp2p项目应运而生,libp2p是一组网络协议套件,任何人,任何应用都可以使用libp2p进行构建分布式应用。可以说libp2p项目极大简化了底层技术的开发难度,我们可以基于libp2p构建自己的分布式系统。
libp2p is used by IPFS as its networking library.
libp2p被用作IPFS的网络层。
libp2p 处于ipfs项目的最底层。最开始,libp2p是在ipfs项目里面的,只是ipfs项目中的一个网络层模块,大概在2017年左右, protocol lab对整个产品序列与技术栈进行了重新规划,ipfs项目被拆分成了很多个子项目,而这每一个子项目相互独立,又各有关联。 在整个项目发展过程中,尤其是在18年,整个项目模块化重构,被拆的很细。而以大的产品类别进行划分,可以划分为以下产品栈:
- ipfs
- libp2p
- filecoin
- ipld
ibp2p 模块在 IPFS 中主要负责数据的传递功能,即路由、网络、交换等。
libp2p是一套点对点的协议来发现节点,并连接他们,发现内容,并转移它们。
libp2p的主要功能是:
- 发现节点
- 连接节点
- 发现数据
- 传输数据
libp2p的特性
- Transport传输:
传输层是libp2p的基础,它负责数据从一个节点到另一个节点的可靠发送和接收。libp2p提供了一个可用于适配支持现有或未来传输协议的简单的接口,从而允许libp2p应用可以运行在不同的运行时和网络环境中。最新版本的go-libp2p已支持TCP/TLS、WebSocket、QUIC传输层实现。
- Identity身份验证:
libp2p使用公钥作为节点身份的基础,这么做有两个互补的用途,一是根据公钥可以为节点提供一个全局唯一的身份ID(PeerId),二是所有节点可以用PeerId恢复出被认证过的节点的公钥,用于它们之间建立安全通讯。
- Security安全性:
libp2p支持将传输层提供的一个连接“upgrading”到一个安全加密通道中。这种方式很灵活,可以支持多种通讯加密方式。当前libp2p支持TLS1.3和Noise两种(老版本支持已弃用的Secio)。
- PeerRouting节点路由:
当你想要向另一个节点发送一个消息时,你需要知道两个信息:它的PeerId和它的网络地址。在很多情况下我们只有对方的PeerId,我们需要一种可以找到它们的网络地址的方法。节点路由是通过利用其他节点的信息发现目标节点的网络地址的过程。
在一个节点路由系统中,若我们想知道节点A的信息,我们可以向节点B请求查询,如果节点B有节点A的信息,则我们可以获得节点A的信息;如果节点B没有节点A的信息,则节点B会返回给我们一个它认为可能知道节点A的信息的节点C的信息,我们可以再向节点C请求查询。随着我们查询越来越多的节点,我们不仅增加了找到节点A信息的概率,同时我们还在自己的路由表中建立了一个更完整的网络视图,这样我们也可以为别的节点提供路由查询服务。
当前,libp2p的节点路由的稳定实现是使用分布式哈希表(distributed hash table)基于Kademlia路由算法迭代查询实现的。
- Content Discovery 内容发现服务:
在一些系统中,我们更关心的是它能为我们提供什么,而不是我们在和谁通讯。比如,我们想要一个文件,我们可以验证这个文件的完整性,所以我们不关心从谁那拿到这个文件。
libp2p为这个场景提供了一个内容路由接口(content routing interface),它的稳定实现也是基于与节点路由中相同的KadDHT实现的。
- Messaging / PubSub 消息传输及发布订阅:
向其他节点发送消息是大多数P2P系统的核心功能,而PubSub是一种非常有用的模式用于给一组订阅者发送消息。
libp2p定义了一个可以向已订阅指定Topic的所有节点发送消息的PubSub接口,该接口有两种实现:floodsub和gossipsub。默认使用gossipsub。
p2p 网络和我们熟悉的 client/server 网络的区别:
p2p 网络的每一个节点既是客户端,又是服务器
p2p 网络的每个节点,都(潜在)是数据的发起者和存储者(对比:c/s 网络中,server 拥有数据)
p2p 网络很不稳定,节点可能进进出出(对比:c/s 网络,服务器非常稳定,一般 SLA 都有几个9)
p2p 网络需要某种机制来实现节点的发现和查找(对比:c/s 网络,客户端知道服务器在哪,如何访问)
p2p 网络(往往)需要 NAT traversal / Hole punching 等技术来允许两个节点之间通讯。这是因为很多节点(比如说家庭网络)往往藏在运营商的 NAT 服务器之后。
二、Libp2p的实现目标
- 支持各种各样的传输方式:
- 传输:TCP,UDP,SCTP,UDP,uTP,QUIC,SSH,etc.
- 安全传输:TLS,DTLS,CurveCP,SSH
- 有效使用sockets(连接重用)
- 允许端点之间的交流可以在一个socket上复用(避免过多的握手)
- 允许端点之间通过一个协商过程使用多协议以及各自的版本
- 向后兼容
- 在现在的系统中可以运行
- 充分使用当前网络技术的能力
- 实现NAT转换
- 实现连接中继
- 实现加密通道
- 充分使用基础传输(例如原生的流复用等)
三、Libp2p的用途
认识Libp2p的用途
参考URL: https://baijiahao.baidu.com/s?id=1654695941739663075&wfr=spider&for=pc
-
物联网
对于物联网场景来说,P2P连接是很重要的一环。比如,在安防场景,安防摄像头与手机之间最好建立直连连接。如此可以大幅度减轻中央服务器的带宽压力。libp2p可以帮助其完成链路上的连接工作,同时可以完成诸如NAT打洞(目前尚未实现,但正在完善中)、流量及RTT统计、长链接、流式加密传输、服务端主动和终端通信等工作。此外,libp2p在车联网领域也有适合的应用场景。由于该场景中终端设备会不断在各种网络之间进行切换,导致其IP地址信息不断发生变化。**libp2p基于节点ID的链接方式及DHT路由发现机制,可以解除底层物理链接与上层逻辑的耦合。随着互联网的发展,应用规模越来越大,如何有效且快速地分发信息,同时降低中心化服务器的压力,是未来网络技术发展的一个重要方向。
-
区块链
在区块链领域里面已经有项目利用libp2p作为自己的底层服务,比如之前多次提到的 Filecoin。在“区块数据同步”“文件传输”节点查找”等核心环节都使用了libp2p。还有 Polkadot(波卡链)项目,作为可能成为区块链3.0的开辟者,为了兼容现有的诸如以太坊等主链而采用异构多链架构,更要考虑终端设备的复杂场景,因此选择使用libp2p作为其底层传输层,利用libp2p在各个模块中的高度抽象带来的灵活性及可扩展性,来避免因区块链技术发展而导致的不兼容问题。 -
分布式消息
分布式消息系统,可以不通过中心服务器的中转功能,直接在节点之间建立连接,用于消息的发送和接收。去除了中心化服务器,可以有效防止单点失效、网络攻击。 -
传输文件
Filecoin和IPFS是基于libp2p来进行数据传输的。对于点对点文件传输,libp2p将有非常广泛的应用场景。
四、运行 Libp2p 协议流程
-
运行 Libp2p 协议的节点在初始化之后需要通过各种方式发现更多的节点,比如 Bootstrap list、mDNS、DHT 等,这主要由发现模块负责与实现。
-
当发现更多接点后,Libp2p 会把这些获取到的节点信息存储在分布式记录存储模块中,供以后方便使用。
-
当上层应用需要连接某个节点时,节点路由模块会找到多条不同的路径,连接管理模块会对这些路径进行尝试连接。
-
连接成功之后,上层应用将通过内容路由模块与连接节点进行内容交互,在底层通过传输模块互相传递数据。
下面我们具体分析一下连接的建立过程,主要包括3个步骤,包括地址解析、传输协议适配、双方协商。
- 地址解析
- 传输协议适配
- 双方协商
连接建立之后,libp2p 会首先进行双方协商,确定对方支持哪些功能。负责协商功能的是 identify 协议,它是内置在 libp2p 的基础协议,能够交换节点的公钥、本地监听地址等。
协商完成后,连接两端的节点会找到共同支持的协议,并且初始化它们。初始化时会注册每种协议的 handler(回调函数),当有协议数据到达时,相应的 handler 就会被调用。 由于多种传输协议会复用同一个底层连接,所以连接会被拆分成多个“流(Stream)”。
libp2p 分为三层
-
Transport 传输层:负责数据的传输。
底层网络协议:支持 TCP / UDP / QUIC 等;
安全协议:支持 TLS 1.3 / Noise;
多路复用(Stream Multiplexing):支持 Yamux,mplex 从 libp2p-0.52.0 开始不再支持。 -
Protocols 协议层:负责数据的处理。
一个 P2P 节点要使用很多 Protocols,包括节点发现(Kademlia、Identify、Ping)、内容发现(Gossipsub)、和请求响应(Request-Response)
libp2p 定义了很多官方协议 spec,我们也可以实现自己的协议,这是封装 libp2p 的方式之一。
一个 Protocol 包含两个核心部分:Behaviour 和 BehaviourEvent。在构造 Swarm 时需要 Behaviour;在处理 SwarmEvent 时需要处理 BehaviourEvent。 -
Swarm 控制层:负责将 Transport 和 Protocols 结合起来,相当于 HTTP Server 中的 Controller。
libp2p 还有一个局域网节点发现协议 mDNS
第二部分:使用实战
官方demo程序:https://github.com/libp2p/go-libp2p/tree/master/examples
libp2p 分为三层:transport, swarm, protocol
运行一个 P2P 节点的步骤:构造 transport -> 构造 protocol -> 构造 swarm -> 运行 swarm -> 处理 swarm events
- Transport 传输层:负责数据的传输。// 相当于 tinychain 的网络层
- Protocols 协议层:负责数据的处理。// 相当于 tinychain 的业务层,libp2p 没有状态,所以不需要数据层
- Swarm 控制层:负责将 Transport 和 Protocols 结合起来,相当于 HTTP Server 中的 Controller。 /
一、基本接口
multiaddr
libp2p使用了multiaddr,一个自描述的地址形式,可以理解为不同协议不同地址类型的一个封装。这使得libp2p可以不透明的处理系统中的所有地址,支持网络层中的各种传输协议。
Host
// Host is an object participating in a p2p network, which
// implements protocols or provides services. It handles
// requests like a Server, and issues requests like a Client.
// It is called Host because it is both Server and Client (and Peer
// may be confusing).
type Host interface {// ID returns the (local) peer.ID associated with this HostID() peer.ID// Peerstore returns the Host's repository of Peer Addresses and Keys.Peerstore() peerstore.Peerstore// Returns the listen addresses of the HostAddrs() []ma.Multiaddr// Networks returns the Network interface of the HostNetwork() network.Network// Mux returns the Mux multiplexing incoming streams to protocol handlersMux() protocol.Switch// Connect ensures there is a connection between this host and the peer with// given peer.ID. Connect will absorb the addresses in pi into its internal// peerstore. If there is not an active connection, Connect will issue a// h.Network.Dial, and block until a connection is open, or an error is// returned. // TODO: Relay + NAT.Connect(ctx context.Context, pi peer.AddrInfo) error// SetStreamHandler sets the protocol handler on the Host's Mux.// This is equivalent to:// host.Mux().SetHandler(proto, handler)// (Threadsafe)SetStreamHandler(pid protocol.ID, handler network.StreamHandler)// SetStreamHandlerMatch sets the protocol handler on the Host's Mux// using a matching function for protocol selection.SetStreamHandlerMatch(protocol.ID, func(string) bool, network.StreamHandler)// RemoveStreamHandler removes a handler on the mux that was set by// SetStreamHandlerRemoveStreamHandler(pid protocol.ID)// NewStream opens a new stream to given peer p, and writes a p2p/protocol// header with given ProtocolID. If there is no connection to p, attempts// to create one. If ProtocolID is "", writes no header.// (Threadsafe)NewStream(ctx context.Context, p peer.ID, pids ...protocol.ID) (network.Stream, error)// Close shuts down the host, its Network, and services.Close() error// ConnManager returns this hosts connection managerConnManager() connmgr.ConnManager// EventBus returns the hosts eventbusEventBus() event.Bus
}
protocol.ID
func DhtProtocolName(netName dtypes.NetworkName) protocol.ID {return protocol.ID("/fil/kad/" + string(netName))
}
...dht.ProtocolPrefix(build.DhtProtocolName(nn)),
//ProtocolPrefix设置附加到所有DHT协议的特定于应用程序的前缀。例如,
///myapp/kad/1.0.0而不是/ipfs/kad/1.0.0。前缀的格式应为/myapp。
//
//默认为默认dht.DefaultPrefix (dht包下 const DefaultPrefix protocol.ID = “/ipfs”)
如何封装 libp2p?
自定义 protocol:工作量很大,可能要重新实现官方已提供的 protocols
自定义 swarm event handlers:较简单,找到要处理哪些 evnets,问题就解决了一半
二、基本使用
官方demo:https://github.com/libp2p/go-libp2p/tree/master/examples/libp2p-host
创建 libp2p 主机
// To construct a simple host with all the default settings, just use `New`
h, err := libp2p.New()
if err != nil {panic(err)
}
defer h.Close()fmt.Printf("Hello World, my p2p hosts ID is %s\n", h.ID())
如果您想对配置进行更多控制,则可以为构造函数指定一些选项。有关构造函数支持的所有配置的完整列表,请参阅文档中的不同选项 。
在此片段中,我们设置了许多有用的选项,例如自定义ID并启用路由。这将提高同伴在NAT’ED环境上的可发现性和可达到性:
// Set your own keypair
priv, _, err := crypto.GenerateKeyPair(crypto.Ed25519, // Select your key type. Ed25519 are nice short-1, // Select key length when possible (i.e. RSA).
)
if err != nil {panic(err)
}var idht *dht.IpfsDHTh2, err := libp2p.New(// Use the keypair we generatedlibp2p.Identity(priv),// Multiple listen addresseslibp2p.ListenAddrStrings("/ip4/0.0.0.0/tcp/9000", // regular tcp connections"/ip4/0.0.0.0/udp/9000/quic", // a UDP endpoint for the QUIC transport),// support TLS connectionslibp2p.Security(libp2ptls.ID, libp2ptls.New),// support Noise connectionslibp2p.Security(noise.ID, noise.New),// support QUIClibp2p.Transport(libp2pquic.NewTransport),// support any other default transports (TCP)libp2p.DefaultTransports,// Let's prevent our peer from having too many// connections by attaching a connection manager.libp2p.ConnectionManager(connmgr.NewConnManager(100, // Lowwater400, // HighWater,time.Minute, // GracePeriod)),// Attempt to open ports using uPNP for NATed hosts.libp2p.NATPortMap(),// Let this host use the DHT to find other hostslibp2p.Routing(func(h host.Host) (routing.PeerRouting, error) {idht, err = dht.New(ctx, h)return idht, err}),// Let this host use relays and advertise itself on relays if// it finds it is behind NAT. Use libp2p.Relay(options...) to// enable active relays and more.libp2p.EnableAutoRelay(),
)
if err != nil {panic(err)
}
defer h2.Close()fmt.Printf("Hello World, my second hosts ID is %s\n", h2.ID())
参考
参考资料:libp2p-specifications : https://github.com/libp2p/specs
为什么 ETH2.0 要选择 libp2p ?
参考URL: https://blog.csdn.net/shangsongwww/article/details/89428696
libp2p 替代方案调研
参考URL: https://www.jianshu.com/p/214ec5f54bbd
参考资料:libp2p-specifications : https://github.com/libp2p/specs
Libp2p学习(一)
参考URL: https://www.cnblogs.com/YuzhouQiang/p/10593160.html
IPFS世界的物流系统:libp2p
参考URL: https://blog.csdn.net/IPFS_Newb/article/details/83186581
长安链P2P网络技术介绍(2):初识LibP2P
参考URL: https://cloud.tencent.com/developer/article/1988253
网络协议十二之P2P协议
参考URL: https://www.cnblogs.com/SuoLiweng/articles/16574502.html
[推荐]06 | libp2p: 需求分析与封装思路
参考URL: https://zhuanlan.zhihu.com/p/643357754
【go-libp2p学习笔记】使用go-libp2p搭建中转服务器(circuit relay server)
参考URL: https://blog.csdn.net/Cake_C/article/details/127630718
[推荐]探索 libp2p:基本知识
参考URL: https://cloud.tencent.com/developer/article/1836307
相关文章:

libp2p 快速开始
文章目录 第一部分:libp2p 快速入门一、什么是libp2plibp2p 发展历程libp2p的特性p2p 网络和我们熟悉的 client/server 网络的区别: 二、Libp2p的实现目标三、Libp2p的用途四、运行 Libp2p 协议流程libp2p 分为三层libp2p 还有一个局域网节点发现协议 mD…...

【数据结构】——排序算法简答题模板
目录 一、内排序和外排序二、排序算法的稳定性三、插入排序(一)直接插入排序的步骤(二)直接插入排序的稳定性(三)折半插入排序的步骤(四)希尔排序的步骤 四、交换排序(一…...

vue3.0基础
1. setup函数 vue单页面使用到的变量和方法都定义在setup函数中,return后才能被页面引用 export default {setup(){const name 张三const person {name,age:30}function goWork(){consle.log(工作)}return {name,person,goWork}} } 注意:直接定义的变量修改不会…...

Kafka本地安装⭐️(Windows)并测试生产消息以及消费消息的可用性
2023.12.17 天气晴 温度较低 十点半,不是不想起实在是阳光浴太nice了日常三连,喂,刷,肝刷会儿博客,看会儿设计模式冷冷冷 进被窝 刷视频 睡觉看看kafka的本地部署 》》实践》》成功写会儿博客,…...

生产环境_Spark解析JSON字符串并插入到MySQL数据库
业务背景: 最近开发有一个需求,是这样的 我需要将一段从前端传过来的JSON字符串进行解析,并从中提取出所需的数据,然后将这些数据插入到MySQL数据库中。 json格式样例如下 { \"区域编号\": \"001\", …...

WEB渗透—PHP反序列化(四)
Web渗透—PHP反序列化 课程学习分享(课程非本人制作,仅提供学习分享) 靶场下载地址:GitHub - mcc0624/php_ser_Class: php反序列化靶场课程,基于课程制作的靶场 课程地址:PHP反序列化漏洞学习_哔哩…...

LVS-DR模式部署
实验准备: 节点服务器 192.168.116.20 #web1 192.168.116.30 #web2 1.部署NFS共享存储 2.部署Web节点服务器 将两台服务器的网关注释掉 #重启网卡 systemctl restart network 修改节点服务器的内核参数|vim /etc/sysctl.conf net.ipv4.conf.lo.arp_ign…...

Oracle的学习心得和知识总结(三十)| OLTP 应用程序的合成工作负载生成器Lauca论文翻译及学习
目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《Oracle Database SQL Language Reference》 2、参考书籍:《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…...

HarmonyOS4.0从零开始的开发教程18后台代理提醒
HarmonyOS(十六)后台代理提醒 简介 随着生活节奏的加快,我们有时会忘记一些重要的事情或日子,所以提醒功能必不可少。应用可能需要在指定的时刻,向用户发送一些业务提醒通知。例如购物类应用,希望在指定时…...

智能优化算法应用:基于算术优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于算术优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于算术优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.算术优化算法4.实验参数设定5.算法结果6.…...

在vue中通过js动态绘制table,并且合并连续相同内容的行,支持点击编辑单元格内容
首先是vue代码 <template><div id"body-container"style"position: absolute"><div class"box-container"><div class"lsb-table-box" ><div class"table-container" id"lsb-table"&…...

输电线路定位:精确导航,确保电力传输安全
在现代社会中,电力作为生活的基石,其安全稳定运行至关重要。而输电线路作为电力传输的重要通道,其故障定位和修复显得尤为重要。恒峰智慧科技将为您介绍一种采用分布式行波测量技术的输电线路定位方法,以提高故障定位精度…...

ZKP Commitment (1)
MIT IAP 2023 Modern Zero Knowledge Cryptography课程笔记 Lecture 5: Commitment 1 (Ying Tong Lai) Overview: Modern SNARK IOP: Interactive Oracle ProofCommitment SchemeIOP “compiled by” the commitment scheme to get a non-interactive proofAn IOP is “inform…...

【难点】【LRU】146.LRU缓存
题目 法1:基于Java的LinkedHashMap 必须掌握法1。参考链接 关于LinkedHashMap的介绍 class LRUCache {int cap;LinkedHashMap<Integer, Integer> cache new LinkedHashMap<>();public LRUCache(int capacity) { this.cap capacity;}public int get…...

基于YOLOv8深度学习的吸烟/抽烟行为检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战
《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…...

菜鸟学习日记(python)——匿名函数
Python 使用 lambda 来创建匿名函数。 lambda 函数是一种小型、匿名的内联函数,它可以具有任意数量的参数,但只能有一个表达式。 匿名函数的一般格式如下: lambda 参数列表:表达式 表达式用于计算并返回函数结果 lambda 函数通常用于编写…...

CompleteFuture与Future的比较
CompleteFuture的介绍CompleteFuture的特点CompleteFuture的应用场景CompletableFuture的优缺点Future的介绍Future的特点Future的应用场景Future的优缺点CompletableFuture和Future的区别CompletableFuture和Future的关联关系CompletableFuture和Future的使用示例CompletableF…...

数据分享 I 全国市级商品房屋销售数据,shp/excel格式,2005-2020年数据
基本信息. 数据名称: 全国市级商品房屋销售数据 数据格式: Shp、excel 数据时间: 2005-2020年 数据几何类型: 面 数据坐标系: WGS84坐标系 数据来源:网络公开数据 数据字段: 序号字段名称字段说明1spxse商品房销售额(亿元…...

面试题总结(十一)【C++】【华清远见西安中心】
C和C的区别有哪些? C 和 C 是两种不同的编程语言,它们有以下一些区别: 1. 语言起源和发展:C 语言是由贝尔实验室的 Dennis Ritchie 在 1972 年开发的,主要用于系统编程和底层开发;而 C 语言是在 C 语言的基…...

c++_01_名字空间_复合类型_缺省参数_哑元函数
0 前言 C和C一样,都属于编译型语言 C和C一样,都属于强类型语言 C对C完全兼容,并提供更多面向对象的特性:语言风格更加简洁,类型检查更加严格 1 名字空间 namespace WHY?划分更精细的逻辑单元(逻辑空间)&…...

前端常见面试题之html和css篇
文章目录 一、html1. 如何理解html语义化2. 说说块级元素和内联元素的区别 二、css1. 盒模型的宽度offsetWidth如何计算2. box-sizing:border-box有什么用3. margin的纵向重叠问题4. 谈谈你对BFC的理解和应用5. 清除浮动有哪些方式6. 使用flex布局实现骰子37.position的absolut…...

使用libaom处理av1编码教程
使用libaom处理av1编码教程 文章目录 使用libaom处理av1编码教程一. av1 是什么二. av1 用处三. libaom 是什么四. libaom 安装五. libaom 安装完成六. 解码av1 一. av1 是什么 AV1(AOMedia Video 1)是一种 开源视频编码格式 。它由开放媒体联盟 (AOM) …...

面试题总结(十)【数据库】【华清远见西安中心】
数据库的分类有哪些? 数据库可以按照不同的标准进行分类,以下是一些常见的数据库分类方式: 1. 关系型数据库(Relational Database):关系型数据库采用表格的形式来组织数据,数据之间通过键值关联…...

计算机网络:物理层(三种数据交换方式)
今天又学到一个知识,加油! 目录 前言 一、电路交换 二、报文交换 三、分组交换 1、数据报方式 2、虚电路方式 3、比较 总结 前言 为什么要进行数据交换? 一、电路交换 电路交换原理:在数据传输期间,源结点与…...

ubuntu18.04 64 位安装笔记——备赛笔记——2024全国职业院校技能大赛“大数据应用开发”赛项——任务2:离线数据处理
进入VirtuakBox官网,网址链接:Oracle VM VirtualBoxhttps://www.virtualbox.org/ 网页连接:Ubuntu Virtual Machine Images for VirtualBox and VMwarehttps://www.osboxes.org/ubuntu/ 将下发的ds_db01.sql数据库文件放置mysql中 12、编写S…...

Nvidia 驱动安装不完整记录
Nvidia 驱动安装不完整记录 安装 epel, sudo dnf install -y https://dl.fedoraproject.org/pub/epel/epel-releaselatest-8.noarch.rpm安装 gcc-toolset-11-gcc, dnf install gcc-toolset-11-gcc修改 gcc,make,as 为 gcc-tools…...

龙芯loongarch64服务器编译安装gcc-8.3.0
前言 当前电脑的gcc版本为8.3.0,但是在编译其他依赖包的时候,出现各种奇怪的问题,会莫名其妙的中断编译。本地文章讲解如何自编译安装gcc,替换系统自带的gcc。 环境准备 下载页面:龙芯开源社区网站 - LoongArch GCC 8.3 交叉工具链 - 源码下载源码包名称如:loongson-gnu…...

宏基因组学Metagenome-磷循环Pcycle功能基因分析-从分析过程到代码及结果演示-超详细保姆级流程
大背景介绍 生信分析,凡事先看论文,有了论文就有了参考,后续分析就有底了,直接上硬菜开干: PCycDB: a comprehensive and accurate database for fast analysis of phosphorus cycling genes - PubMed 数据库及部分分析代码github库: GitHub - ZengJiaxiong/Phospho…...

element plus 日期范围 自定义内容
问题: 按照官网上的自定义内容示例,修改日期选择器没有问题,如果修改日期范围选择器,修改后会丢失日期范围选择时的样式。 解决: 从F12中不难看出日期范围的选择样式来自于.el-date-table-cell 而示例中写的是.cell&…...

[23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
[paper | proj] 给定FLAME,基于每个三角面片中心初始化一个3D Gaussian(3DGS);当FLAME mesh被驱动时,3DGS根据它的父亲三角面片,做平移、旋转和缩放变化;3DGS可以视作mesh上的辐射场࿱…...