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

Singularity(八)| conda实战

Singularity(八)| conda实战

8.1 conda 和容器的区别

Conda和容器技术(如Docker)都是现代软件开发和数据科学中常用的工具,用于解决环境依赖和应用部署的问题。尽管它们有着相似的目标,即确保应用可以在不同的环境中以一致的方式运行,但它们在设计和工作方式上有着根本的不同。

  • Conda 的主要目的是管理不同版本的软件包和创建虚拟环境,以便在同一计算机上安装和运行不同的软件包和库。它主要用于 Python 环境。
  • 容器的主要目的是将整个应用程序及其依赖项打包成容器,以确保应用程序在不同环境中的一致性和 可移植性

隔离级别:

  • Conda:Conda 提供虚拟环境,通过创建独立的环境来隔离不同软件包的依赖关系,但它仍运行于操作系统之上,依赖于宿主机的操作系统和库(尽管通过环境可以实现一定程度的隔离)。
  • 容器:与宿主机共享内核,在操作系统级别提供隔离,每个容器都有自己的文件系统、网络配置和隔离的进程空间。

8.2 在 Singularity 容器中配置 conda

实例1:构建 qiime1 容器

首先在容器中安装 miniconda

wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh
chmod u+x Miniconda3-latest-Linux-x86_64.sh
./Miniconda3-latest-Linux-x86_64.sh -b -p /opt/miniconda3
chmod --recursive a+rw /opt/miniconda3

必须注意的是,Singularity 容器内的进程默认以用户 root 的身份运行。这意味着 $HOME 被设置为 /root,此时,Miniconda 在默认情况下会被安装到 /root/miniconda3。

然而,root 目录只有 root 账号才能访问,即使里面的文件有 a+rx 权限。即如果我们将 conda 默认装到了容器内 root 目录下,我们将无法以非 root 账户使用容器内的 conda,因此,conda 一定不能被安装在 /root 目录下

针对这一问题,我们在使用 shell 修改容器时,最好添加 --no-home 参数。

安装 qiime1 及其依赖:

# source .bashrc
. ~/.bashrc

# 1 创建新的 conda 环境 qiime1
conda create -n qiime1 python=2.7
conda activate qiime1

# 2 安装matplotlib==1.4.3的时候,出现错误 "The following required packages can
# not be built: * freetype", pip 不能安装系统依赖,手动安装系统依赖后然后安装
apt-get install libfreetype6-dev libxft-dev
pip install matplotlib==1.4.3

# 3 qiime中要求biom-format>=2.1.4,<2.2.0,但是目前版本不支持python 2.7
# 手动安装2.1.4版本
pip install biom-format==2.1.4

# 4 最后安装qiime
pip install qiime

# 5 检测安装是否成功
print_qiime_config.py -t

实例2:构建 qiime2 容器

下面还展示了一种直接利用 dockerfile 构建 qiime2 容器的方式:

FROM ubuntu:20.04

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && \
    apt-get install -y \
    apt-utils \
    wget=1.20.3-1ubuntu1 \
    git=1:2.25.1-1ubuntu3 && \
    apt-get clean && \
    rm -rf rm -rf /var/lib/apt/lists/* && \
    wget https://repo.anaconda.com/miniconda/Miniconda3-py38_4.8.3-Linux-x86_64.sh && \
    chmod +x Miniconda3-py38_4.8.3-Linux-x86_64.sh && \
    ./Miniconda3-py38_4.8.3-Linux-x86_64.sh -b -p /opt/miniconda3 && \
    ln -s /opt/miniconda3/bin/conda /usr/bin/conda && \
    wget https://data.qiime2.org/distro/core/qiime2-2020.8-py36-linux-conda.yml && \
    conda env create -n qiime2-2020.8 --file qiime2-2020.8-py36-linux-conda.yml && \
    conda install -y -n qiime2-2020.8 -c conda-forge -c bioconda -c qiime2 -c defaults q2cli q2templates q2-types q2-feature-table q2-metadata vsearch snakemake && \
    chmod --recursive a+rw /opt/miniconda3 && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* && \
    rm /qiime2-2020.8-py36-linux-conda.yml && \
    rm /Miniconda3-py38_4.8.3-Linux-x86_64.sh


CMD ["/bin/bash"]

参考前面的方法,创建 docker 容器后转为 singularity。或是按上文中的方法直接从 dockerfile 到 singularity。

这样,singularity exec ~/dockerimage.sif conda 就能正常运行,并显示 conda 的使用情况。然而,如果尝试执行其他一些命令,例如 singularity exec ~/dockerimage.sif conda run python -v,我们会得到类似以下的错误信息:

OSError: [Errno 30] Read-only file system: '/opt/miniconda3/.tmp58csqy_a'

这是因为除了挂载的目录外,容器是不可变的。此外,运行 singularity exec ~/dockerimage.sif conda activate qiime2-2020.8 也会失败:

CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'. To initialize your shell, run

$ conda init <SHELL_NAME>

Currently supported shells are:

  • bash
  • fish
  • tcsh
  • xonsh
  • zsh
  • powershell

See 'conda init --help' for more information and options.

IMPORTANT: You may need to close and restart your shell after running 'conda init'.

即使我们已经正确修改设置了 shell,我们仍然会得到以上结果。

8.3 使用 Singularity 容器中的 conda

针对以上问题,我们可以提供两种可能的解决方案,然而,这两个都存在很强的限制,目前来看,我们还无法完美的解决这一问题:

方式1:在容器内部运行

首先进入容器:

singularity shell ~/dockerimage.sif

然后在容器内部运行:

conda init # Modifies .bashrc on your host machine
source .bashrc # Loads modified .bashrc
export LC_ALL=C.UTF-8 # Sets locale to UTF-8
export LANG=C.UTF-8 # Sets locale to UTF-8
conda activate qiime2-2020.8 # Activates the environment

这一方法在我们具有 root 权限且只需要在本地运行程序时的体验很好。然而,在我们需要搭配 HPC 使用时非常困难。

方式 2:直接调用特定 conda 环境中的程序执行

例如,我们可以使用 def 文件创建一个包含 conda 的容器后,将参数直接传递给 conda 环境中的程序:

First, you'll want to

# get the environment YML
conda activate your_env
conda env export > environment.yml
Bootstrap: docker

From: continuumio/miniconda3

%
files
    environment.yml

%
post
    /opt/conda/bin/conda env create -f environment.yml

%
runscript
    exec /opt/conda/envs/$(head -n 1 environment.yml | cut -f 2 -d ' ')/bin/"$@"

构建容器:

singularity build conda.sif

此时,我们可以直接调用容器内 conda 环境中的 ipython 解释器:

singularity run conda.sif ipython
# 或者使用conda环境中的绝对路径
singularity exec conda.sif /opt/conda/envs/.../bin/app

然而,这种方法无法激活 conda 环境,在某些情况下会遇到环境变量问题。

方式3:手动处理 conda 环境变量

较多情况下,激活 conda 环境的作用在于重新配置环境变量。

例如我们在 base conda 环境下安装某个应用,其软件依赖的可执行程序一般会被放置在 /opt/conda/bin 目录下,在 activate conda 环境后,/opt/conda/bin 目录就会被添加到环境变量中。

因此,在不激活 conda 环境的条件下,我们可以使用三种方式实现环境变量的配置:

  1. (推荐)在调用容器前,添加需要的环境变量:

    export PATH="/opt/conda/bin:$PATH"
  2. 在现存环境变量的路径下(例如:/usr/local/bin)为调用的软件依赖创建软链接:

    ln -s /opt/conda/bin/curl /usr/local/bin/curl
  3. 直接修改源代码中的依赖路径为绝对路径。

8.1 conda 和容器的区别

Conda和容器技术(如Docker)都是现代软件开发和数据科学中常用的工具,用于解决环境依赖和应用部署的问题。尽管它们有着相似的目标,即确保应用可以在不同的环境中以一致的方式运行,但它们在设计和工作方式上有着根本的不同。

  • Conda 的主要目的是管理不同版本的软件包和创建虚拟环境,以便在同一计算机上安装和运行不同的软件包和库。它主要用于 Python 环境。
  • 容器的主要目的是将整个应用程序及其依赖项打包成容器,以确保应用程序在不同环境中的一致性和 可移植性

隔离级别:

  • Conda:Conda 提供虚拟环境,通过创建独立的环境来隔离不同软件包的依赖关系,但它仍运行于操作系统之上,依赖于宿主机的操作系统和库(尽管通过环境可以实现一定程度的隔离)。
  • 容器:与宿主机共享内核,在操作系统级别提供隔离,每个容器都有自己的文件系统、网络配置和隔离的进程空间。

8.2 在 Singularity 容器中配置 conda

实例1:构建 qiime1 容器

首先在容器中安装 miniconda

wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh
chmod u+x Miniconda3-latest-Linux-x86_64.sh
./Miniconda3-latest-Linux-x86_64.sh -b -p /opt/miniconda3
chmod --recursive a+rw /opt/miniconda3

必须注意的是,Singularity 容器内的进程默认以用户 root 的身份运行。这意味着 $HOME 被设置为 /root,此时,Miniconda 在默认情况下会被安装到 /root/miniconda3。

然而,root 目录只有 root 账号才能访问,即使里面的文件有 a+rx 权限。即如果我们将 conda 默认装到了容器内 root 目录下,我们将无法以非 root 账户使用容器内的 conda,因此,conda 一定不能被安装在 /root 目录下

针对这一问题,我们在使用 shell 修改容器时,最好添加 --no-home 参数。

安装 qiime1 及其依赖:

# source .bashrc
. ~/.bashrc

# 1 创建新的 conda 环境 qiime1
conda create -n qiime1 python=2.7
conda activate qiime1

# 2 安装matplotlib==1.4.3的时候,出现错误 "The following required packages can
# not be built: * freetype", pip 不能安装系统依赖,手动安装系统依赖后然后安装
apt-get install libfreetype6-dev libxft-dev
pip install matplotlib==1.4.3

# 3 qiime中要求biom-format>=2.1.4,<2.2.0,但是目前版本不支持python 2.7
# 手动安装2.1.4版本
pip install biom-format==2.1.4

# 4 最后安装qiime
pip install qiime

# 5 检测安装是否成功
print_qiime_config.py -t

实例2:构建 qiime2 容器

下面还展示了一种直接利用 dockerfile 构建 qiime2 容器的方式:

FROM ubuntu:20.04

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && \
    apt-get install -y \
    apt-utils \
    wget=1.20.3-1ubuntu1 \
    git=1:2.25.1-1ubuntu3 && \
    apt-get clean && \
    rm -rf rm -rf /var/lib/apt/lists/* && \
    wget https://repo.anaconda.com/miniconda/Miniconda3-py38_4.8.3-Linux-x86_64.sh && \
    chmod +x Miniconda3-py38_4.8.3-Linux-x86_64.sh && \
    ./Miniconda3-py38_4.8.3-Linux-x86_64.sh -b -p /opt/miniconda3 && \
    ln -s /opt/miniconda3/bin/conda /usr/bin/conda && \
    wget https://data.qiime2.org/distro/core/qiime2-2020.8-py36-linux-conda.yml && \
    conda env create -n qiime2-2020.8 --file qiime2-2020.8-py36-linux-conda.yml && \
    conda install -y -n qiime2-2020.8 -c conda-forge -c bioconda -c qiime2 -c defaults q2cli q2templates q2-types q2-feature-table q2-metadata vsearch snakemake && \
    chmod --recursive a+rw /opt/miniconda3 && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* && \
    rm /qiime2-2020.8-py36-linux-conda.yml && \
    rm /Miniconda3-py38_4.8.3-Linux-x86_64.sh


CMD ["/bin/bash"]

参考前面的方法,创建 docker 容器后转为 singularity。或是按上文中的方法直接从 dockerfile 到 singularity。

这样,singularity exec ~/dockerimage.sif conda 就能正常运行,并显示 conda 的使用情况。然而,如果尝试执行其他一些命令,例如 singularity exec ~/dockerimage.sif conda run python -v,我们会得到类似以下的错误信息:

OSError: [Errno 30] Read-only file system: '/opt/miniconda3/.tmp58csqy_a'

这是因为除了挂载的目录外,容器是不可变的。此外,运行 singularity exec ~/dockerimage.sif conda activate qiime2-2020.8 也会失败:

CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'. To initialize your shell, run

$ conda init <SHELL_NAME>

Currently supported shells are:

  • bash
  • fish
  • tcsh
  • xonsh
  • zsh
  • powershell

See 'conda init --help' for more information and options.

IMPORTANT: You may need to close and restart your shell after running 'conda init'.

即使我们已经正确修改设置了 shell,我们仍然会得到以上结果。

8.3 使用 Singularity 容器中的 conda

针对以上问题,我们可以提供两种可能的解决方案,然而,这两个都存在很强的限制,目前来看,我们还无法完美的解决这一问题:

方式1:在容器内部运行

首先进入容器:

singularity shell ~/dockerimage.sif

然后在容器内部运行:

conda init # Modifies .bashrc on your host machine
source .bashrc # Loads modified .bashrc
export LC_ALL=C.UTF-8 # Sets locale to UTF-8
export LANG=C.UTF-8 # Sets locale to UTF-8
conda activate qiime2-2020.8 # Activates the environment

这一方法在我们具有 root 权限且只需要在本地运行程序时的体验很好。然而,在我们需要搭配 HPC 使用时非常困难。

方式 2:直接调用特定 conda 环境中的程序执行

例如,我们可以使用 def 文件创建一个包含 conda 的容器后,将参数直接传递给 conda 环境中的程序:

First, you'll want to

# get the environment YML
conda activate your_env
conda env export > environment.yml
Bootstrap: docker

From: continuumio/miniconda3

%
files
    environment.yml

%
post
    /opt/conda/bin/conda env create -f environment.yml

%
runscript
    exec /opt/conda/envs/$(head -n 1 environment.yml | cut -f 2 -d ' ')/bin/"$@"

构建容器:

singularity build conda.sif

此时,我们可以直接调用容器内 conda 环境中的 ipython 解释器:

singularity run conda.sif ipython
# 或者使用conda环境中的绝对路径
singularity exec conda.sif /opt/conda/envs/.../bin/app

然而,这种方法无法激活 conda 环境,在某些情况下会遇到环境变量问题。

方式3:手动处理 conda 环境变量

较多情况下,激活 conda 环境的作用在于重新配置环境变量。

例如我们在 base conda 环境下安装某个应用,其软件依赖的可执行程序一般会被放置在 /opt/conda/bin 目录下,在 activate conda 环境后,/opt/conda/bin 目录就会被添加到环境变量中。

因此,在不激活 conda 环境的条件下,我们可以使用三种方式实现环境变量的配置:

  1. (推荐)在调用容器前,添加需要的环境变量:

    export PATH="/opt/conda/bin:$PATH"
  2. 在现存环境变量的路径下(例如:/usr/local/bin)为调用的软件依赖创建软链接:

    ln -s /opt/conda/bin/curl /usr/local/bin/curl
  3. 直接修改源代码中的依赖路径为绝对路径。

本文由 mdnice 多平台发布

相关文章:

Singularity(八)| conda实战

Singularity&#xff08;八&#xff09;| conda实战 8.1 conda 和容器的区别 Conda和容器技术&#xff08;如Docker&#xff09;都是现代软件开发和数据科学中常用的工具&#xff0c;用于解决环境依赖和应用部署的问题。尽管它们有着相似的目标&#xff0c;即确保应用可以在不…...

elementui el-select组件多选设置初始值无法修改问题

elementui el-select组件多选设置初始值无法修改问题 对list直接赋值后点击修改select框&#xff0c;此时数据已改变但显示无变化。 <el-select v-model"form.optrList" multiple placeholder"请选择"><el-optionv-for"item in list":k…...

电脑自动关机后文件夹不见了怎么办?别急,找回方法在这里

在使用电脑的过程中&#xff0c;我们都可能会遇到一些令人头疼的问题&#xff0c;其中之一就是电脑突然自动关机后&#xff0c;发现重要的文件夹不见了。这种情况可能会让你感到焦虑和困惑&#xff0c;因为失去的数据可能涉及到工作、学习或生活中的各个方面。不过&#xff0c;…...

tcp/ip协议2实现的插图,数据结构8 (30 - 32章)

(201) 201 三十0 中断优先级补充 (202) 202 三十1 TCP的用户需求 函tcp_usrreq一 (203) 203 三十2 TCP的用户需求 函tcp_usrreq二 (204) 204 三十3 TCP的用户需求 函tcp_usrreq三 (205) 205 三十4 TCP的用户需求 函tcp_usrreq四 (206) 206 三十5 TCP的用户需求 函tcp_usrreq五 …...

挑战杯 多目标跟踪算法 实时检测 - opencv 深度学习 机器视觉

文章目录 0 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习多目标跟踪 …...

【数据结构】顺序表的定义及实现方式

文章目录 顺序表的定义顺序表的实现静态分配动态分配动态申请内存空间&#xff0c;动态释放内存空间&#xff08;malloc&#xff0c;free&#xff09; 顺序表的特点总结 顺序表的定义 顺序表也就是用顺序存储的方式实现线性表。 顺序存储。把逻辑上相邻的元素存储在物理位置上…...

R语言数据挖掘-关联规则挖掘(1)

一、分析目的和数据集描述 要分析的数据是美国一区域的保险费支出的历史数据。保险费用数据表的每列分别为年龄、性别、体重指数、孩子数量、是否吸烟、所在区域、保险收费。 本文的主要目的是分析在年龄、性别、体重指数、孩子数量、是否吸烟、所在区域中这些因素中&#xf…...

【ansible】ansible的介绍和安装

前言运维自动化 云计算核心职能 搭建平台架构 日常运营保障 性能效率优化 相关工具 代码管理&#xff08;SCM&#xff09;&#xff1a;GitHub、GitLab、BitBucket、SubVersion 构建工具&#xff1a;maven、Ant、Gradle 自动部署&#xff1a;Capistrano、CodeDeploy 持续…...

二维数组_矩阵交换行

任务描述 给定一个5*5的矩阵&#xff08;数学上&#xff0c;一个rc的矩阵是一个由r行c列元素排列成的矩形阵列&#xff09;&#xff0c;将第n行和第m行交换&#xff0c;输出交换后的结果。 输入格式: 输入共6行&#xff0c;前5行为矩阵的每一行元素,元素与元素之间以一个空格…...

mysql笔记:14. 权限管理

文章目录 MySQL权限授予权限查看权限撤销权限权限生效机制访问控制的实现 在实际生产中&#xff0c;为了保证数据的安全&#xff0c;数据库管理人员需要为不同的操作人员分配不同的权限&#xff0c;限制登录MySQL服务器的用户只能在其权限范围内操作。同时管理员还可以根据不同…...

无硫防静电手指套:高科技产业的纯净与安全新选择

随着科技的飞速发展&#xff0c;高科技产业对于生产环境的纯净度和产品的防静电要求日益严格。为了满足这一高标准的需求&#xff0c;无硫防静电手指套应运而生&#xff0c;以其独特的无硫特性和出色的防静电功能&#xff0c;迅速成为了高科技产业中的纯净与安全新选择。 无硫手…...

由浅到深认识C语言(10):字符串处理函数

该文章Github地址&#xff1a;https://github.com/AntonyCheng/c-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.csdn…...

防范服务器被攻击:查询IP地址的重要性与方法

在当今数字化时代&#xff0c;服务器扮演着重要的角色&#xff0c;为企业、组织和个人提供各种网络服务。然而&#xff0c;服务器也成为了网络攻击者的目标之一&#xff0c;可能面临各种安全威胁&#xff0c;例如DDoS攻击、恶意软件攻击、数据泄露等。为了有效地防范服务器被攻…...

3. ElasticSearch搜索技术深入与聚合查询实战

1. ES分词器详解 1.1 基本概念 分词器官方称之为文本分析器&#xff0c;顾名思义&#xff0c;是对文本进行分析处理的一种手段&#xff0c;基本处理逻辑为按照预先制定的分词规则&#xff0c;把原始文档分割成若干更小粒度的词项&#xff0c;粒度大小取决于分词器规则。 1.2 …...

【Linux】Shell编程【一】

shell是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。 Shell 是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面访问操作系统内核的服务。 Shell属于内置的…...

Windows10+tensorrt+python部署yolov5

一、安装cuda 打开NVIDIA控制面板 —>帮助—>系统信息—>组件&#xff0c;找到驱动版本新&#xff0c;我这边是11.2&#xff0c; 然后去CUDA Toolkit Archive | NVIDIA Developer下载对应版本的CUDA&#xff0c;根据查看的CUDA型号确定对应的cuda Toolhit版本&#…...

【前端框架的发展史详细介绍】

前端框架的发展史 前端框架的发展史可以追溯到1995年&#xff0c;当时微软推出了IE浏览器并开始支持CSS&#xff0c;随后&#xff0c;在1997年&#xff0c;W3C&#xff08;万维网联盟&#xff09;发布了CSS的第一个正式标准。 在2003年&#xff0c;苹果推出了Safari浏览器&am…...

[JAVAEE]—进程和多线程的认识

文章目录 什么是线程什么是进程进程的组成什么是pcb 进程概括线程线程与进程的关系线程的特点 创建线程创建线程方法创建线程的第二种方法对比 其他的方式匿名内部类创建线程匿名内部类创建Runable的子类lambda表达式创建一个线程 多线程的优势 什么是线程 什么是进程 首先想…...

sqllab第十九关通关笔记

知识点&#xff1a; 错误注入 最大长度为32位&#xff1b;如果目标长度>32时&#xff0c;需要利用截取函数进行分段读取referer注入 insert语句update语句 通过admin admin进行登录发现页面打印除了referer字段的信息 这应该是一个referer注入 首先进行测试一下 构造payl…...

张量维度改变总结

文章目录 一、view() 或 reshape()二、unsqueeze()三、squeeze()四、transpose()五、torch.expand_dims 一、view() 或 reshape() view() 或 reshape(): 这两个函数可以用于改变张量的形状&#xff0c;但保持元素总数不变。它们可以接受一个新的形状作为参数&#xff0c;并返回…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...