当前位置: 首页 > news >正文

基于 Debain11 构建 asp.net core 6.x 的基础运行时镜像

基于 Debain11 构建 asp.net core 6.x 的基础运行时镜像

  • Linux 环境说明
    • Debian 简介
    • Debian 发行版本
    • 关于 Debian 11
  • Linux 常用基础工具
  • Dockerfile 中 RUN 指令
    • RUN 语法格式
    • RUN 语义说明
  • 编写 Dockerfile 构建 Runtime 基础镜像
    • ASP.NET Core Runtime 基础镜像
    • Dockerfile 编写
    • Windows 环境使用 WSL2 安装 Docker Desktop 工具
    • docker build 构建 image 镜像
    • 查看 docker 镜像信息
  • 总结

dotnet 跨平台

Linux 环境说明

此处我们基于 Debian11Linux 发行版,实现目标是编写 Dockerfile 构建 asp.net core 6.x 框架的 runtime 基础镜像。

在 Docker 容器化运行环境中,应用程序运行中存在异常情况,此时可以借助一些常用的基础工具方便排查,因此我们需要在 asp.net core 6.x runtime 基础镜像添加 linux 环境常用的基础工具。

注意:基础镜像的构建需要考虑镜像的体积和打包工具的安全隐患,此处不做过多讨论。

Debian 简介

1、Debian 是一个社区

来自世界各地的数以千计的志愿者共同为 Debian 操作系统工作,注重自由和开源软件。认识 Debian 计划。

2、Debian 是一个操作系统

Debian 是一个自由的操作系统,由 Debian 计划开发和维护。Debian 是一个自由的 Linux 发行版,添加了数以千计的应用程序以满足用户的需要。

关于 Debian 更多信息,请查看 => https://www.debian.org/intro/index.zh-cn.html

Debian 发行版本

Debian 一直维护着至少三个发行版本:稳定版(stable),测试版(testing)和不稳定版(unstable)

1、稳定版(stable

  • 稳定版包含了 Debian 官方最近一次发行的软件包。
  • 作为 Debian 的正式发行版本,它是我们优先推荐给用户您选用的版本。
  • 当前 Debian 的稳定版版本号是 11,开发代号为 bullseye。最初版本为 11.0,于 2021 年 08 月 14 日发布,其更新 11.6 已于 2022 年 12 月 17 日发布。

2、测试版(testing)

  • 测试版包含了那些暂时未被收录进入稳定版的软件包,但它们已经进入了候选队列。使用这个版本的最大益处在于它拥有更多版本较新的软件。
  • 想要了解 什么是测试版以及 如何成为稳定版的更多信息,请看 Debian FAQ
  • 当前的测试版版本代号是 bookworm

3、不稳定版(unstable)

  • 不稳定版存放了 Debian 现行的开发工作。通常,只有开发者和那些喜欢过惊险刺激生活的人选用该版本。推荐使用不稳定版的用户订阅 debian-devel-announce 邮件列表,以接收关于重大变更的通知,比如有可能导致问题的升级。
  • 不稳定版的版本代号永远都被称为 sid。

4、发行生命周期

Debian 通常会按照一定的规律每隔一段时间发布一个新稳定版。 对每个稳定发行版本,用户可以得到三年的完整支持以及额外两年的长期支持。

请查看 Debian Releases 维基页面和 Debian LTS 维基页面以了解详细信息。

更多详细信息,请查看 => https://www.debian.org/releases/

关于 Debian 11

Debian 11 带有 Linux 5.10 内核,这是一个长期支持(LTS)版本。一个新的内核显然意味着对硬件有更好的支持,特别是较新的硬件以及性能的改进。

在这里插入图片描述

这里我们使用 Debian 11,代号为 bullseye,网络安装,用于 64 位 PC(amd64) debian-11.6.0-amd64-netinst.iso

关于 Debian 11 更多信息:

  • 【debian-11.6.0-amd64-netinst.iso】下载地址 => https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-11.6.0-amd64-netinst.iso
  • 新发布的 Debian 11 “Bullseye” Linux 发行版的 7 大亮点 => https://linux.cn/article-13695-1.html

Linux 常用基础工具

当在 Linux 服务器执行 telnet 命令时,如果提示 command not found: telnet,说明服务器上并未安装 telnet 命令,需要安装此命令。

下面介绍在 linux 服务器如何安装 telnet、curl、ifconfig、vim、ping 等工具。

首先,介绍一个安装工具时必须的命令 apt installapt install 是应用程序管理器,用于一键安装软件包,与源码安装不同的是,该指令会自动检测并安装依赖,而且用 apt 安装的包都是成熟的软件包,基本不存在安装包有严重 bug 或者文件缺失的情况。

# 1、首先执行如下命令,更新相关资源。将所有包的来源更新,也就是提取最新的包信息,这一命令使用率非常高。
apt update# 2、安装 telnet
apt install telnet# 3、安装 curl
apt install curl# 4、安装 ifconfig
apt install net-tools# 5、安装 vim
apt install vim# 6、安装ping
apt install inetutils-ping# 7、安装 ipaddr
apt install iproute2

上面这些基础工具的安装,可以整合一条命令,执行操作如下:

apt update && apt install -y net-tools iproute2 iputils-ping telnet curl vim

执行上面命令,如果不是 root 用户,需在前面添加 sudo 提权,继续执行操作。

Dockerfile 中 RUN 指令

上面我们介绍了 linux 环境中常用的基础工具,此处我们 app 应用程序是容器化运行环境,为了方便排查异常信息,通常会在 runtime 基础镜像中添加一些常用工具。

在编写 Dickerfile 构建 asp.net core runtime 镜像环境时,我们先来了解下 Dockerfile 中的 RUN 指令。

RUN 语法格式

DockerfileRUN 指令的编写格式有两种:

  • shell 形式】,命令在 shell 中运行,默认情况下,Linux/bin/sh -cWindowscmd /S /C

  • exec 形式】,按照 JSON Array 格式解析,意味着必须使用双引号【"】包含参数,而不能使用单引号【’】;

RUN 语义说明

RUN 指令在当前镜像的顶层上新建层执行命令,同时提交执行结果。提交的结果会在接下来的 Dockerfile 处理。

分层 RUN 指令和生成提交符合 Docker 的核心理念,即:提交便利,容器可以依据任意历史镜像构建,像源代码管理一样。

  • exec 形式能够避免 shell 形式表达含义模糊的问题,同时能够在一个不包含 shell 命令的基础镜像上执行 RUN 指令。
  • shell 形式的默认 shell 可以通过 SHELL 修改。
  • shell 形式中,若是指令参数过长,可以使用符号【\】换行显示。
# RUN 参数不换行.
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'
# RUN 参数换行.
RUN /bin/bash -c 'source $HOME/.bashrc; \
echo $HOME'
  • exec 形式是按照 JSON Array 格式解析,必须使用双引号【"】包含参数。

与 shell 形式不同,exec 形式不会调用 shell 命令行,意味着不会进行 shell 处理。

=> 例如:运行 `RUN ["echo", "$HOME"]` 不会对 `$HOME` 进行变量替换。
如果需要 shell 处理,那么可以使用 shell 形式或直接执行 shell;
=> 例如:`RUN["sh""-c""echo $HOME"]`。
当使用 exec 形式直接执行 shell 时,与 shell 形式类似,应用的 shell 是宿主机而非 Docker。
  • exec 形式中的 JSON,必须转译反斜杠【\】。Windows 系统中,反斜杠【\】是路径分隔符,是需要特别关注的。否则,由于不是有效的 JSON,执行时会出现异常从而失败。
# 错误写法
RUN ["c:\windows\system32\tasklist.exe"]# 正确写法
RUN ["c:\\windows\\system32\\tasklist.exe"]
  • RUN 指令的缓存不会在下次构建时自动失效。
RUN apt dist-upgrade -y 指令的缓存将在下次构建时重用。
RUN 指令的缓存可以通过使用 `--no-cache` 标志置为无效,例如:docker build --no-cache
  • RUN 指令的缓存可由 ADDCOPY 指令置为无效。

编写 Dockerfile 构建 Runtime 基础镜像

Docker 中,编写 Dockerfile 是有个细节需要注意,RUN 指令执行多个命令时,可以合并写成一个,在 Dockerfile 中每执行一个指令都会对应的生成一个层,相应的构建镜像的体积也会随之增加。

ASP.NET Core Runtime 基础镜像

  • 微软 MCR 容器镜像仓库,ASP.NET Core Runtime

aspnet

访问地址:https://mcr.microsoft.com/en-us/product/dotnet/aspnet/about

Dockerfile 编写

上面我们介绍了 RUN 指令的语法格式,同样的这里我们为了尽量建设镜像构建的层,通常情况我们会把多个命令整合为一个 RUN 指令执行,完整 Dockerfile 编写如下:

FROM mcr.microsoft.com/dotnet/aspnet:6.0
# Debian 源添加参考
# https://developer.aliyun.com/mirror/debian?spm=a2c6h.13651102.0.0.3e221b1137LtM1
# https://mirrors.ustc.edu.cn/help/debian.html
# https://mirrors.tuna.tsinghua.edu.cn/help/debian/# RUN 使用 shell 语法
RUN sed -i -E 's/(deb|security).debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list
RUN sed -i 's/snapshot.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN apt update && apt install -y net-tools iproute2 iputils-ping telnet curl vim# RUN 使用 exec 语法
#RUN ["apt", "update"]
#RUN ["apt","install","-y","vim","curl","telnet","iputils-ping","iproute2","net-tools"]

Windows 环境使用 WSL2 安装 Docker Desktop 工具

注意:在 windows 环境使用 Dockerfile 构建镜像,需要安装 Docker Desktop 工具并启动运行。

Windows 环境安装 Docker Desktop 工具,推荐使用 WSL2 模式运行。此处不过多讲解安装细节,请自行查看资料镜像安装。

docker desktop

Docker Engine 添加如下信息:

{"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"dns": ["8.8.8.8","8.8.4.4"],"experimental": false,"features": {"buildkit": true},"insecure-registries": ["https://hub.atguigu.com"],"registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com","https://mirror.ccs.tencentyun.com","https://docker.mirrors.ustc.edu.cn","https://cr.console.aliyun.com/"]
}

docker build 构建 image 镜像

  • 执行 docker build 构建命令:
docker build -t aspnet:6.0-debian11-amd64 ./
  • 输出如下 image 镜像构建步骤信息:
[+] Building 0.6s (9/9) FINISHED=> [internal] load build definition from Dockerfile                                                               0.0s=> => transferring dockerfile: 32B                                                                                0.0s=> [internal] load .dockerignore                                                                                  0.0s=> => transferring context: 2B                                                                                    0.0s=> [internal] load metadata for mcr.microsoft.com/dotnet/aspnet:6.0                                               0.4s=> [1/5] FROM mcr.microsoft.com/dotnet/aspnet:6.0@sha256:a4ac0ac8b96842c3d4161339e641d335e44f52647bdeb4ed619ac83  0.0s=> CACHED [2/5] RUN sed -i -E 's/(deb|security).debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list            0.0s=> CACHED [3/5] RUN sed -i 's/snapshot.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list                    0.0s=> CACHED [4/5] RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list                         0.0s=> CACHED [5/5] RUN apt update && apt install -y net-tools iproute2 iputils-ping telnet curl vim                  0.0s=> exporting to image                                                                                             0.0s=> => exporting layers                                                                                            0.0s=> => writing image sha256:8e4e01b9340eef513279899468870ff57826a1e4f3a6f0b3689212d88f3119eb                       0.0s=> => naming to docker.io/library/aspnet:6.0-debian11-amd64                                                       0.0sUse 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them

从上面输出的信息可以看出,Dockerfile 文件中每一行单独编写的命令,都会当做一个步骤执行,一共执行 [5/5] 个步骤。

查看 docker 镜像信息

此时我打开 Docker Desktop 桌面端工具,选择 Images ,搜索框输入 tag 名称【aspnet-debian11-amd64:6.0】就可以看到刚才构建的镜像,体积 270.54 MB

docker images

和原生【mcr.microsoft.com/dotnet/aspnet:6.0】镜像相比,体积增加 170.51 MB,新增的这部分体积,主要是我们在这个镜像的基础上,添加了一些 linux 环境的常用小工具(net-tools、iproute2、iputils-ping、telnet、curl、vim)。

我们可以点击【aspnet-debian11-amd64:6.0】镜像,即可进入镜像查看构建的层信息,如下所示:

image详细信息

查看上面的镜像层信息,同样的我们也可以使用命令操作查看,操作如下:

docker inspect : 获取容器/镜像的元数据。

docker inspect [OPTIONS] NAME|ID [NAME|ID...]

OPTIONS 说明:

  • -f :指定返回值的模板文件。
  • -s :显示总的文件大小。
  • –type :为指定类型返回JSON。

具体命令如下:

 docker inspect aspnet:6.0-debian11-amd64

输出如下信息:

[{"Id": "sha256:8e4e01b9340eef513279899468870ff57826a1e4f3a6f0b3689212d88f3119eb","RepoTags": ["aspnet:6.0-debian11-amd64"],"RepoDigests": [],"Parent": "","Comment": "buildkit.dockerfile.v0","Created": "2023-02-19T07:44:04.106566658Z","Container": "","ContainerConfig": {"Hostname": "","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": null,"Cmd": null,"Image": "","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": null},"DockerVersion": "","Author": "","Config": {"Hostname": "","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","ASPNETCORE_URLS=http://+:80","DOTNET_RUNNING_IN_CONTAINER=true","DOTNET_VERSION=6.0.14","ASPNET_VERSION=6.0.14"],"Cmd": ["bash"],"Image": "","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": null},"Architecture": "amd64","Os": "linux","Size": 270542384,"VirtualSize": 270542384,"GraphDriver": {"Data": {"LowerDir": "/var/lib/docker/overlay2/z1zc2q5ucw0srd1q6fz9dv5zs/diff:/var/lib/docker/overlay2/4vf1uowirpwps4nw4guvfr610/diff:/var/lib/docker/overlay2/xzob6lo9w8ita21r9o6qdowh3/diff:/var/lib/docker/overlay2/1a04b4cea9f8ea832c5f91a20d4ddd4f29f6ec5acb8ebbda6848282ec8159590/diff:/var/lib/docker/overlay2/5036b7ee8c50e873affdb40f9d1fd0e37573631587ed6b1f45347a10995ad935/diff:/var/lib/docker/overlay2/f7d1f588113cb3de37d0cd574614db511a098ba64e18f02ade45cb4b1d431fb6/diff:/var/lib/docker/overlay2/f0c4b961c76c425d8383575ca78c176a890d78d871a5cf60daab2ddc96ffee8d/diff:/var/lib/docker/overlay2/f7c839b494ad006d157084d919c15e812e10e57a8ac1c5cdda4d0150bf494f21/diff","MergedDir": "/var/lib/docker/overlay2/9zxjyc54rcaf107f6cj6fhiax/merged","UpperDir": "/var/lib/docker/overlay2/9zxjyc54rcaf107f6cj6fhiax/diff","WorkDir": "/var/lib/docker/overlay2/9zxjyc54rcaf107f6cj6fhiax/work"},"Name": "overlay2"},"RootFS": {"Type": "layers","Layers": ["sha256:4695cdfb426a05673a100e69d2fe9810d9ab2b3dd88ead97c6a3627246d83815","sha256:f30d150c01520fbbbdd1bedcef3f940d809c82a46e08301dcc713903d7272ba3","sha256:fe674e2b138caf1ef6a67419d5fb0a9081ca0759d97ce711be80d5d4d67145e1","sha256:ff13768cb51ea8fe1831d93c2d18690c3fdca8cfee40b75a738f62b133413573","sha256:355b7bb8c23e0d867141b0af69ecb6df39730bcd1b6c754cfae9ad36ca3f5572","sha256:8d56eaae8bfea0a5eac4caf4350fa1987c162cd7dba828aa292cc15c3e90d91b","sha256:b7d0c701d1f04294b2b98d3103c3856c9cbabc592cde48d3e07eb03bff7cb18a","sha256:46ef367d7575beda39ffd3774b4d47b29c2fe0b628f1269b4626053ca44169d5","sha256:6809bcac556f83ca4489ba09980a5bef05c9bc7463a45e4dac7fb600beec1c4e"]},"Metadata": {"LastTagTime": "2023-02-19T08:46:50.196739744Z"}}
]

镜像构建后,此时如果有镜像仓库(腾讯云平台准备 Docker 私有镜像仓库或者 IDC 机房搭建),确保 vm 和宿主机之间通信可以正常登录访问,此处以腾讯云 Docker 私有镜像仓库为例:

# 登录腾讯云docker registry
sudo docker login --username=[user] ccr.ccs.tencentyun.com
# 提示输入对应的密码即可# 从 registry 拉取镜像
sudo docker pull ccr.ccs.tencentyun.com/dotnet/image-name:[tag]# 将镜像推送到 registry
sudo docker login --username=[user] ccr.ccs.tencentyun.com
sudo docker tag [ImageId|image-name:tag] ccr.ccs.tencentyun.com/dotnet/aspnet:6.0-debian11-amd64
sudo docker push ccr.ccs.tencentyun.com/dotnet/aspnet:6.0-debian11-amd64

到这里我们就演示完 Dockerfile 的编写,以及 image 镜像构建的全过程。

总结

掌握 Dockerfile 文件语法格式的编写,熟悉 RUN 指令中多个命令的编写方式(减少 image 镜像构建层,相应的减少镜像体积大小),顺便熟悉下 Docker 镜像的构建 docker build 和 镜像的 push(推送)和 pull(拉取) 基本操作,感兴趣的小伙伴可以跟随上面描述动手实践起来,可以加深对 Docker 镜像构建的理解。

相关文章:

基于 Debain11 构建 asp.net core 6.x 的基础运行时镜像

基于 Debain11 构建 asp.net core 6.x 的基础运行时镜像Linux 环境说明Debian 简介Debian 发行版本关于 Debian 11Linux 常用基础工具Dockerfile 中 RUN 指令RUN 语法格式RUN 语义说明编写 Dockerfile 构建 Runtime 基础镜像ASP.NET Core Runtime 基础镜像Dockerfile 编写Windo…...

【无人机路径规划】基于IRM和RRTstar进行无人机路径规划(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

Spring Boot中使用@Autowire装配接口是怎么回事?

在学习使用Spring Boot框架时候,发现了一个特别的现象UserMapper是一个接口,在另一个类中好像直接使用Autowired装配了一个UserMapper对象???我纳闷了一会儿,接口居然可以直接实例对象吗?根据我…...

23种设计模式介绍(Python示例讲解)

文章目录一、概述二、设计模式七种原则三、设计模式示例讲解1)创建型模式1、工厂模式(Factory Method)【1】简单工厂模式(不属于GOF设计模式之一)【2】工厂方法模式2、抽象工厂模式(AbstractFactory&#x…...

初识Hadoop,走进大数据世界

文章目录数据!数据!遇到的问题Hadoop的出现相较于其他系统的优势关系型数据库网格计算本文章属于Hadoop系列文章,分享Hadoop相关知识。后续文章中会继续分享Hadoop的组件、MapReduce、HDFS、Hbase、Flume、Pig、Spark、Hadoop集群管理系统以及…...

加油站会员管理小程序实战开发教程14 会员充值

我们上篇介绍了会员开卡的业务,开卡是为了创建会员卡的信息。有了会员卡信息后我们就可以给会员进行充值。当然了充值这个业务是由会员自主发起的。 按照我们的产品原型,我们在我的页面以轮播图的形式循环展示当前会员的所有卡信息。这个会员卡信息需要先用变量从数据源读取…...

leetcode 1792. 最大平均通过率

一所学校里有一些班级,每个班级里有一些学生,现在每个班都会进行一场期末考试。给你一个二维数组 classes ,其中 classes[i] [passi, totali] ,表示你提前知道了第 i 个班级总共有 totali 个学生,其中只有 passi 个学…...

15-基础加强-2-xml(约束)枚举注解

文章目录1.xml1.1概述【理解】(不用看)1.2标签的规则【应用】1.3语法规则【应用】1.4xml解析【应用】1.5DTD约束【理解】1.5.1 引入DTD约束的三种方法1.5.2 DTD语法(会阅读,然后根据约束来写)1.6 schema约束【理解】1.6.1 编写schema约束1.6.…...

13:高级篇 - CTK 事件管理机制(signal/slot)

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 在《12:高级篇 - CTK 事件管理机制(sendEvent/postEvent)》一文中,我们介绍了如何进行插件间通信 - sendEvent()/postEvent() + ctkEventHandler。然而,除了这种方式之外,EventAdmin 还提供了另一种方…...

群晖-第1章-IPV6的DDNS

群晖-第1章-IPV6的DDNS 方案:腾讯云群晖DS920 本文参考群晖ipv6 DDNS-go教程-牧野狂歌,感谢原作者的分享。 这篇文章只记录了我需要的部分,其他的可以查看原文,原文还记录了更多的内容,可能帮到你。 一、购买域名 …...

centos7系统-kubeadm安装k8s集群(v1.26版本)亲测有效,解决各种坑可供参考

文章目录硬件要求可省略的步骤配置虚拟机ip设置阿里镜像源各服务器初始化配置配置主节点的主机名称配置从节点的主机名称配置各节点的Host文件关闭各节点的防火墙关闭selinux永久禁用各节点的交换分区同步各节点的时间将桥接的IPv4流量传递到iptables的链(三台都执行…...

帮助指令 man ,help及文档常用管理指令

帮助指令 man,help 1. man 当我们想要了解某个命令如何使用,及选项的含义是什么以及配置文件的帮助信息时,可以使用 man [命令或配置文件],这样便可以获得到帮助提示信息了。 语法格式:man [命令或者配置文件] 比如…...

电子科技大学操作系统期末复习笔记(五):文件管理

目录 前言 文件管理:基础 基本概念 文件 文件系统 文件系统的实现模型 文件的组成 文件名 文件分类 文件结构 逻辑结构 物理结构 练习题 文件管理:目录 文件控制块FCB FCB:File Control Block FCB信息 目录 基本概念 目…...

SpringBoot+ActiveMQ-发布订阅模式(生产端)

SpringBootActiveMQ-发布订阅模式(生产端)Topic 主题* 消息消费者(订阅方式)消费该消息* 消费生产者将发布到topic中,同时有多个消息消费者(订阅)消费该消息* 这种方式和点对点方式不同&#xf…...

Android实例仿真之三

目录 四 Android架构探究 五 大骨架仿真 六 Android实例分析思路拓展 四 Android架构探究 首先,Android系统所带来的好处,就在于它本身代码的开放性,这提供了一个学习、借鉴的平台。这对分析仿真而言,本身就是一大利好&#xf…...

关于MySQL的limit优化

1、前提 提示:只适用于InnoDB引擎 2、InnoDB存储特点 它把索引和数据放在了一个文件中,就是聚集索引。这与MyISAM引擎是不一样的。 3、SQL示例 -- 给cve字段建立索引 select * from cnnvd where cveCVE-2022-24808 limit 300000,10;由于M…...

Java-Stream流基本使用

collection.stream将会破坏原有的数据结构&#xff0c;可以通过collect方法收集&#xff0c;可以用Collectors提供的构造器&#xff0c;add等方法构造形成新的数据结构。 HashSet<List<Integer>> rs new HashSet<>(); rs.stream().toList();Collection集合转…...

Liunx(狂神课堂笔记)

一.常用命令 1. cd 切换目录 cd ./* 当前目录cd /* 绝对路径cd .. 返回上一级目录cd ~ 回到当前目录pwd …...

【史上最全面esp32教程】点灯大师篇

文章目录前言ESP32简介认识arduino的两个函数点灯步骤函数介绍LED灯闪烁流水灯总结前言 esp32有很多的功能&#xff0c;例如wifi&#xff0c;蓝牙等&#xff0c;这节我们学习最简单的点灯。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 ESP32简介 …...

【Java 面试合集】内存中为什么要区分栈和堆

内存中为什么要区分栈和堆 1. 概述 嗨&#xff0c;大家好Java 面试合集又来了&#xff0c;今天我们分享的主题很大众化以及普通。无论是Java 语言本身还是别的语言都会有所涉及&#xff0c;但是今天我们从Java角度来讲下 2. 分析 今天我们会从多个方向来分享这个话题 2.1 栈是…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...