基于Docker搭建属于你的CC++集成编译环境

news2024/11/24 22:34:29

常常,我会幻想着拥有一个随时可以携带、随时可以使用的开发环境,那该是多么美好的事情。

在工作中,编译环境的复杂性常常让我头疼不已。稍有不慎,删除了一些关键文件,整个编译链就会瞬间崩溃。更糟糕的是,当我花费大量时间和精力搭建好的环境,不得不在不同的机器上重复这份工作时,心中的焦虑更是无以言表。尤其是当代码需要交给同事处理,如果能将整个环境如同复制粘贴一般简单传递,那将是多么美妙的事。

当然,虚拟机的确可以实现这种“复制粘贴”的效果,但从版本管理、镜像托管和维护的角度来看,其成本却颇高。这样的方案,并不是我心目中理想的选择。于是,我将目光转向了Docker。

一、需求整理

我理想的C/C++编译环境,至少需要具备以下环境或工具:

  1. Conan​: 一个我常用且比较流行的的C/C++包管理工具
  2. CMake​: 最流行的C/C++构建系统
  3. 基础编译环境:gcc​,make​,gdb​等
  4. ARM编译工具链:gcc-arm-none-eabi​, gcc-arm-linux-gnueabihf​, gcc-aarch64-linux-gnu​等
  5. 基础开发库:比如libssl-dev​, libgl-dev​等,这些主要是方便其他上层库的编译

二、Docker简介

image

Docker 是一个容器引擎。对于没有接触过 Docker 的开发者来说可能比较陌生。可以将 Docker 大致理解为一个轻量级虚拟机框架,但实际上它比虚拟机更高效。Docker 具备以下几点特性:

  1. 足够快:Docker 容器启动速度非常快,通常只需要几秒钟。这是因为容器共享主机操作系统的内核,而不像虚拟机需要启动一个完整的操作系统。这种高效性使得开发和测试过程更加顺畅。
  2. 管理方便:Docker 提供了丰富的命令行工具和 API,使得容器的创建、启动、停止和销毁变得非常简单。同时,Docker Compose 允许开发者使用一个简单的 YAML 文件来定义和管理多容器应用,使得部署和管理复杂应用变得更加方便。
  3. 生态好:Docker 拥有庞大且活跃的社区,提供了丰富的镜像资源。通过 Docker Hub,开发者可以方便地下载和分享容器镜像。Docker 还支持与各种 CI/CD 工具、云平台和编排工具(如 Kubernetes)的集成,形成了一个完善的生态系统。
  4. 一致性:Docker 确保应用程序在开发、测试和生产环境中运行的一致性。这意味着开发者可以在本地开发和测试应用程序,然后将相同的容器部署到生产环境中,而不必担心环境差异带来的问题。
  5. 资源高效:与传统的虚拟机相比,Docker 容器更加轻量级,消耗的资源更少。容器共享主机操作系统的内核,避免了虚拟机需要为每个实例分配完整操作系统资源的情况。
  6. 安全隔离:Docker 使用内核命名空间(namespace)和控制组(cgroup)技术提供进程和资源的隔离。这种隔离确保了每个容器之间的安全性,避免了相互干扰。
  7. 可移植性:Docker 容器可以在任何支持 Docker 的系统上运行,无论是本地开发环境、云服务还是数据中心。这种可移植性使得应用程序能够在不同环境之间轻松迁移。

这些特性使得 Docker 成为现代软件开发和部署过程中不可或缺的工具,极大地提高了应用的可移植性和开发效率。在Docker中包含三个基本概念,分别是:

  • 镜像(Image) :Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container) :镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository) :仓库可看成一个代码控制中心,用来保存镜像。

Docker 的安装方法不在这里赘述。目前 Docker 发布了 Docker Desktop 软件,这款桌面软件允许用户通过 GUI 来管理 Docker 镜像和容器。对新手来说会比较友好,至于是使用命令行还是 GUI 方式,可根据个人喜好进行选择。

三、DockerFile

FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
COPY ./sources.list /etc/apt/sources.list

# Install packages
RUN set -eux \
    && apt-get update \
    && apt-get -yq upgrade \
    && apt-get -yq install \
        aptitude apt-rdepends bash build-essential ccache clang clang-tidy cppcheck curl doxygen diffstat gawk gdb git gnupg gperf iputils-ping \
        linux-tools-generic nano nasm ninja-build openssh-server openssl pkg-config python3 python-is-python3 spawn-fcgi net-tools iproute2 \
        sudo tini unzip valgrind wget zip texinfo gcc-multilib chrpath socat cpio xz-utils debianutils \
        patch perl tar rsync bc xterm whois software-properties-common apt-transport-https ca-certificates\
        dh-autoreconf apt-transport-https g++ graphviz xdot mesa-utils \
    && exit 0

# Install cmake
RUN set -eux \
    && wget https://github.com/Kitware/CMake/releases/download/v3.28.5/cmake-3.28.5-linux-x86_64.sh -q -O /tmp/cmake-install.sh \
    && chmod u+x /tmp/cmake-install.sh \
    && mkdir /opt/cmake-3.28.5 \
    && /tmp/cmake-install.sh --skip-license --prefix=/opt/cmake-3.28.5 \
    && rm /tmp/cmake-install.sh \
    && ln -s /opt/cmake-3.28.5/bin/* /usr/local/bin \
    && cmake --version \
    && exit 0

# Install arm compiler
RUN set -eux \
    && apt-get update \
    && apt-get -yq install \
        gcc-arm-none-eabi \
        g++-arm-linux-gnueabi gcc-arm-linux-gnueabi \
        g++-arm-linux-gnueabihf gcc-arm-linux-gnueabihf \
        g++-aarch64-linux-gnu gcc-aarch64-linux-gnu \
    && exit 0

# Install python pip
RUN set -eux \
    && python3 --version \
    && curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py \
    && python3 get-pip.py \
    && rm get-pip.py \
    && python3 -m pip install -U pip \
    && pip3 --version \
    && pip3 install --upgrade pip setuptools wheel \
    && pip3 --version \
    && exit 0

# Install python packages
RUN set -eux \
    && pip3 --version \
    && pip3 install --upgrade pip setuptools wheel \
    && pip3 --version \
    && pip3 install --upgrade autoenv autopep8 cmake-format clang-format conan meson \
    && pip3 install --upgrade cppclean flawfinder lizard pygments pybind11 GitPython pexpect subunit Jinja2 pylint CLinters \
    && exit 0

# Install libraries
RUN set -eux \
    && apt-get install -yq \
        libgl-dev libgl1-mesa-dev \
        libx11-xcb-dev libfontenc-dev libice-dev libsm-dev libxaw7-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxext-dev \
        libxfixes-dev libxi-dev libxinerama-dev libxkbfile-dev libxmu-dev libxmuu-dev libxpm-dev libxrandr-dev libxrender-dev libxres-dev \
        libxss-dev libxt-dev libxtst-dev libxv-dev libxxf86vm-dev libxcb-glx0-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-xkb-dev \
        libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev \
        libxcb-xinerama0-dev libxcb-dri3-dev uuid-dev libxcb-cursor-dev libxcb-dri2-0-dev libxcb-dri3-dev libxcb-present-dev \
        libxcb-composite0-dev libxcb-ewmh-dev libxcb-res0-dev libxcb-util-dev libxcb-util0-dev\
    && apt-get -yq autoremove \
    && apt-get -yq autoclean  \
    && apt-get -yq clean  \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
    && exit 0

# Setup ssh
RUN set -eux \
    && mkdir -p /var/run/sshd \
    && mkdir -p /root/.ssh \
    && sed -ri 's/^#?PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config \
    && sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config \
    && echo 'root:root' | chpasswd \
    && exit 0

ENTRYPOINT ["/usr/bin/tini","--"]
CMD ["/usr/sbin/sshd","-D","-e"]

如您所见,我已经写完了一份DockerFile。其中包含了一些基础工具,如网络工具、CMake、Python、ARM交叉编译工具链等。甚至还有一些开发用的基础库,同时也配置好了SSH。点击下方图片查看最新完整代码👇👇👇(欢迎START!!!🤩)

3.1 基础镜像和环境变量设置

FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
COPY ./sources.list /etc/apt/sources.list
  • FROM ubuntu:22.04:指定基础镜像为Ubuntu 22.04。
  • ENV DEBIAN_FRONTEND=noninteractive:设置环境变量,使apt-get在非交互模式下运行,避免提示用户输入。
  • COPY ./sources.list /etc/apt/sources.list:将本地的sources.list文件复制到容器中的/etc/apt/sources.list,这里使用了清华源,如果不要请将此条代码注释掉。

3.2 安装基础软件包

RUN set -eux \
    && apt-get update \
    && apt-get -yq upgrade \
    && apt-get -yq install \
        aptitude apt-rdepends bash build-essential ccache clang clang-tidy cppcheck curl doxygen diffstat gawk gdb git gnupg gperf iputils-ping \
        linux-tools-generic nano nasm ninja-build openssh-server openssl pkg-config python3 python-is-python3 spawn-fcgi net-tools iproute2 \
        sudo tini unzip valgrind wget zip texinfo gcc-multilib chrpath socat cpio xz-utils debianutils \
        patch perl tar rsync bc xterm whois software-properties-common apt-transport-https ca-certificates\
        dh-autoreconf apt-transport-https g++ graphviz xdot mesa-utils \
    && exit 0
  • set -eux:启用严格模式,打印所有命令,并在出现错误时停止脚本执行。
  • apt-get update:更新包列表。
  • apt-get -yq upgrade:升级所有已安装的包。
  • apt-get -yq install … :安装列出的各种软件包,涵盖编译工具、开发工具、网络工具等。

3.3 安装CMake

RUN set -eux \
    && wget https://github.com/Kitware/CMake/releases/download/v3.28.5/cmake-3.28.5-linux-x86_64.sh -q -O /tmp/cmake-install.sh \
    && chmod u+x /tmp/cmake-install.sh \
    && mkdir /opt/cmake-3.28.5 \
    && /tmp/cmake-install.sh --skip-license --prefix=/opt/cmake-3.28.5 \
    && rm /tmp/cmake-install.sh \
    && ln -s /opt/cmake-3.28.5/bin/* /usr/local/bin \
    && cmake --version \
    && exit 0
  • wget … -O /tmp/cmake-install.sh:下载CMake安装脚本到/tmp目录。
  • chmod u+x /tmp/cmake-install.sh:给予安装脚本执行权限。
  • mkdir /opt/cmake-3.28.5:创建安装目录。
  • /tmp/cmake-install.sh --skip-license --prefix=/opt/cmake-3.28.5:执行安装脚本,跳过许可证,并安装到指定目录。
  • rm /tmp/cmake-install.sh:删除安装脚本。
  • ln -s /opt/cmake-3.28.5/bin/ /usr/local/bin*:创建符号链接,使CMake命令可用。
  • cmake --version:验证CMake安装。

3.4 安装ARM编译器

RUN set -eux \
    && apt-get update \
    && apt-get -yq install \
        gcc-arm-none-eabi \
        g++-arm-linux-gnueabi gcc-arm-linux-gnueabi \
        g++-arm-linux-gnueabihf gcc-arm-linux-gnueabihf \
        g++-aarch64-linux-gnu gcc-aarch64-linux-gnu \
    && exit 0
  • apt-get update:更新包列表。
  • apt-get -yq install … :安装ARM编译器,包括不同架构的编译器,如ARM none-eabi​、ARM Linux-gnueabi​、ARM Linux-gnueabihf​、AArch64 Linux-gnu​。

3.5 安装Python的pip工具

RUN set -eux \
    && python3 --version \
    && curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py \
    && python3 get-pip.py \
    && rm get-pip.py \
    && python3 -m pip install -U pip \
    && pip3 --version \
    && pip3 install --upgrade pip setuptools wheel \
    && pip3 --version \
    && exit 0
  • python3 --version:检查Python3版本。
  • curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py:下载pip安装脚本。
  • python3 get-pip.py:安装pip。
  • rm get-pip.py:删除安装脚本。
  • python3 -m pip install -U pip:升级pip。
  • pip3 --version:检查pip版本。
  • pip3 install --upgrade pip setuptools wheel:安装和升级常用的Python包。

3.6 安装Python包

RUN set -eux \
    && pip3 --version \
    && pip3 install --upgrade pip setuptools wheel \
    && pip3 --version \
    && pip3 install --upgrade autoenv autopep8 cmake-format clang-format conan meson \
    && pip3 install --upgrade cppclean flawfinder lizard pygments pybind11 GitPython pexpect subunit Jinja2 pylint CLinters \
    && exit 0
  • pip3 --version:检查pip版本。
  • pip3 install --upgrade pip setuptools wheel:确保pip及其依赖包是最新的。
  • pip3 install --upgrade autoenv autopep8 cmake-format clang-format conan meson:安装开发工具包。
  • pip3 install --upgrade cppclean flawfinder lizard pygments pybind11 GitPython pexpect subunit Jinja2 pylint CLinters:安装其他开发工具包。

3.7 安装其他开发库文件

RUN set -eux \
    && apt-get install -yq \
        libgl-dev libgl1-mesa-dev \
        libx11-xcb-dev libfontenc-dev libice-dev libsm-dev libxaw7-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxext-dev \
        libxfixes-dev libxi-dev libxinerama-dev libxkbfile-dev libxmu-dev libxmuu-dev libxpm-dev libxrandr-dev libxrender-dev libxres-dev \
        libxss-dev libxt-dev libxtst-dev libxv-dev libxxf86vm-dev libxcb-glx0-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-xkb-dev \
        libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev \
        libxcb-xinerama0-dev libxcb-dri3-dev uuid-dev libxcb-cursor-dev libxcb-dri2-0-dev libxcb-dri3-dev libxcb-present-dev \
        libxcb-composite0-dev libxcb-ewmh-dev libxcb-res0-dev libxcb-util-dev libxcb-util0-dev\
    && apt-get -yq autoremove \
    && apt-get -yq autoclean  \
    && apt-get -yq clean  \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
    && exit 0
  • 这些主要是QT的依赖库,后续也可以自行增加。

3.8 设置SSH

RUN \
    set -eux && \
    mkdir -p /var/run/sshd && \
    mkdir -p /root/.ssh && \
    sed -ri 's/^#?PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config && \
    sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config && \
    echo 'root:root' | chpasswd && \
    exit 0
  • mkdir -p /var/run/sshd:创建sshd运行目录。
  • mkdir -p /root/.ssh:创建root用户的SSH目录。
  • sed -ri ‘s/^#?PermitRootLogin\s+.*/PermitRootLogin yes/’ /etc/ssh/sshd_config:允许root用户通过SSH登录。
  • sed -ri ‘s/UsePAM yes/#UsePAM yes/g’ /etc/ssh/sshd_config:禁用PAM。
  • echo ‘root’ | chpasswd:设置root用户密码为’root’。

3.9 入口点和默认命令

ENTRYPOINT ["/usr/bin/tini" "--"]
CMD ["/usr/sbin/sshd" "-D" "-e"]
  • ENTRYPOINT ["/usr/bin/tini" "–"] :使用tini作为init进程,处理信号和子进程。
  • CMD ["/usr/sbin/sshd" "-D" "-e"] :启动sshd服务并保持前台运行。

四、构建镜像

首先,请将第三部分的代码复制将其保存为Dockerfile​文件。如果您需要切换其他APT源(如阿里源、清华源等),请手动到官方镜像站获取相关源地址,并将其保存为sources.list​。这里附上Ubuntu22.04清华镜像源:

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse

# 以下安全更新软件源包含了官方源与镜像站配置,如有需要可自行修改注释切换
deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
# # deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse

注意:请使用http而不要用https.

完成后您的文件夹应该为如下布局:

image
接下来请打开您的命令行程序并进入该文件夹,如果您使用的是Windows操作系统,推荐使用Powershell. 键入以下命令,开始构建:

docker buildx build . -t jelin-dev/ubuntu22.04

您可以在控制台中看到构建过程:

[+] Building 218.2s (14/14) FINISHED                                                                     docker:default
 => [internal] load build definition from Dockerfile                                                               0.0s
 => => transferring dockerfile: 3.77kB                                                                             0.0s
 => [internal] load metadata for docker.io/library/ubuntu:22.04                                                    3.5s
 => [internal] load .dockerignore                                                                                  0.0s
 => => transferring context: 2B                                                                                    0.0s
 => [internal] load build context                                                                                  0.0s
 => => transferring context: 1.28kB                                                                                0.0s
 => [1/9] FROM docker.io/library/ubuntu:22.04@sha256:a6d2b38300ce017add71440577d5b0a90460d0e57fd7aec21dd0d1b0761b  6.9s
 => => resolve docker.io/library/ubuntu:22.04@sha256:a6d2b38300ce017add71440577d5b0a90460d0e57fd7aec21dd0d1b0761b  0.0s
 => => sha256:2af372c1e2645779643284c7dc38775e3dbbc417b2d784a27c5a9eb784014fb8 424B / 424B                         0.0s
 => => sha256:52882761a72a60649edff9a2478835325d084fb640ea32a975e29e12a012025f 2.30kB / 2.30kB                     0.0s
 => => sha256:a8b1c5f80c2d2a757adc963e3fe2dad0b4d229f83df3349fbb70e4d12dd48822 29.53MB / 29.53MB                   5.7s
 => => sha256:a6d2b38300ce017add71440577d5b0a90460d0e57fd7aec21dd0d1b0761bbfb2 1.13kB / 1.13kB                     0.0s
 => => extracting sha256:a8b1c5f80c2d2a757adc963e3fe2dad0b4d229f83df3349fbb70e4d12dd48822                          1.0s
 => [2/9] COPY ./sources.list /etc/apt/sources.list                                                                0.1s
 => [3/9] RUN     set -eux &&     apt-get update &&     apt-get -yq upgrade &&     apt-get -yq install     aptit  81.2s
 => [4/9] RUN set -eux     && wget https://github.com/Kitware/CMake/releases/download/v3.28.5/cmake-3.28.5-linux  13.4s
 => [5/9] RUN     set -eux &&     apt-get update &&     apt-get -yq install         gcc-arm-none-eabi         g+  61.0s
 => [6/9] RUN     set -eux &&     python3 --version &&     curl https://bootstrap.pypa.io/get-pip.py -o get-pip.p  9.8s
 => [7/9] RUN     set -eux &&     pip3 --version &&     pip3 install --upgrade pip setuptools wheel &&     pip3   29.4s
 => [8/9] RUN set -eux     && apt-get install -yq         libgl-dev libgl1-mesa-dev         libx11-xcb-dev libfon  5.8s
 => [9/9] RUN     set -eux &&     mkdir -p /var/run/sshd &&     mkdir -p /root/.ssh &&     sed -ri 's/^#?PermitRo  0.4s
 => exporting to image                                                                                             6.7s
 => => exporting layers                                                                                            6.7s
 => => writing image sha256:27e12e5d293fc972028bba5e9e488d4ed655ae5d479bd92b4fe1cb0295e6311d                       0.0s
 => => naming to docker.io/jelin-dev/ubuntu22.04

构建完成后,您可以通过docker images​查看已有镜像:

REPOSITORY              TAG       IMAGE ID       CREATED              SIZE
jelin-dev/ubuntu22.04   latest    27e12e5d293f   About a minute ago   5.25GB

您可以通过以下命令创建并启动容器:

docker run -itd -p 2201:22 --name test jelin-dev/ubuntu22.04:latest

这样容器就在后台运行了,您可以通过SSH连接到容器,账号密码均为root

五、使用建议

众所周知,C/C++足够底层,以至于其跨平台特性也仅限于代码层面,只能通过使用不同的编译器编译才能实现多平台运行。所以它不像C#、Java、Python等编程语言有官方指定的包管理器,甚至连构建系统也五花八门。jelin-dev​这个镜像挑选了业界主流的C/C++包管理器和构建系统,以及配备了我所涉及到需要交叉编译的工具链,如果您有特殊的需要,您可以自行添加相关环境,再进行构建和使用。

Tap1. Conan包管理数据持久化

jelin-dev​ 镜像中,我使用了 Conan 作为包管理器。建议您在创建容器时将 /root/.conan2​ 文件夹挂载到本地目录中。这些数据很重要,因为 Conan 会将已经下载和编译的库存放在这个文件夹内。如果没有做持久化,那么每次使用都将需要重新构建这些库。

Tap2. 使用CLion

CLion 是一个非常好用的 IDE,功能多样且灵活。它默认使用 CMake 进行构建,并且对 CMake 的支持比其他 IDE 都要强大,配置项目和管理变得非常轻松。除此之外,CLion 还提供了 Conan 插件,可以通过 GUI 方式配置依赖,使用体验非常棒。另外,CLion 对 Docker 的支持也是一大亮点。启动速度极快,几乎感觉不到延迟,使用起来非常顺畅。这些特性让 CLion 成为开发 C++ 项目的理想选择。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1718246.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GUI 01:GUI 编程概述,AWT 相关知识,Frame 窗口,Panel 面板,及监听事件的应用

一、前言 记录时间 [2024-05-30] 疑问导航 GUI 是什么?GUI 如何使用?GUI 有哪些应用? 学习目的 写一些自己心中的小工具;Swing 界面的维护;了解 MVC 架构,以及监听事件。 本文对图形用户界面&#xff08…

禁用USB端口的办法,哪一种禁用USB端口的方法好

禁用USB端口的办法,哪一种禁用USB端口的方法好 禁用USB端口是保护公司数据安全的一种常见做法,旨在防止未经授权的数据传输和潜在的恶意软件传播。以下是几种常见的禁用USB端口方法及其效果评价。 1、硬件方法: BIOS设置:通过BIO…

ICH指导原则数据库

ICH人用药品技术要求国际协调理事会,英文全称为"The International Council for Harmonisation of Technical Requirements for Pharmaceuticals for Human Use"。 ① ICH简介 于1990年由欧、美、日三方政府监管发起的一个国际非盈利组织,依…

L1527射频编码芯片 百万组通用编码器,可替代EV1527

L1527 是CMOS 结构的预烧内码(遥控中的地址码)通用编码器,内有 20 位可预烧写 100 万组内码组合,使得重码率很低,具有更高安全性。芯片内集成误操作禁止功能,在按键输入有效且状态不变时,芯片连…

kaggle竞赛系列基于图像对水稻分类代码案例

目录 依赖环境 代码 导入依赖包 定义数据集路径: 创建训练集、验证集和测试集的文件夹: 代码的作用: 设置新的数据集路径与类别名称 代码的作用: 定义数据预处理和增强变换: 代码的作用: 定义数…

C语言 | Leetcode C语言题解之第122题买卖股票的最佳时机II

题目&#xff1a; 题解&#xff1a; int maxProfit(int* prices, int pricesSize) {int ans 0;for (int i 1; i < pricesSize; i) {ans fmax(0, prices[i] - prices[i - 1]);}return ans; }

FPGA DMA IP核使用指南

摘要 本文旨在介绍FPGA中DMA(Direct Memory Access)IP核的使用,包括其基本框架、测试代码编写以及仿真波形的分析。DMA是一种允许外围设备直接与内存进行数据交换的技术,无需CPU的介入,从而提高了数据传输的效率。 1. 引言 在现代FPGA设计中,DMA IP核因其…

一站式链路追踪:阿里云的端到端解决方案

作者&#xff1a;涯海 炎炎夏日&#xff0c;当你打开外卖 APP 购买奶茶却发现下单失败&#xff1b;五一佳节&#xff0c;当你自驾游途中发现导航响应缓慢&#xff0c;频繁错过路口&#xff1b;深更半夜&#xff0c;当你辅导孩子功课&#xff0c;却发现 GPT 应用迟迟无法应答。…

【VTKExamples::Utilities】第十七期 ZBuffer

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例ZBuffer,并解析接口vtkWindowToImageFilter,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ…

一个案例告诉你,MySQL如何查询今天、昨天、近7天、近30天、本月、上个月、本季度、上季度、本年、上一年数据

参考博客 mysql查询当天/昨天/近7天/近30天/本月/上个月/本季度/上季度/本年/上一年 数据 正文内容 创建测试案例&#xff08;也可直接使用附录MySQL脚本生成数据&#xff09; 1、新建测试表 CREATE TABLE example (id INT AUTO_INCREMENT PRIMARY KEY,date_column DATE,d…

无信号、弱信号地区的“关键先生”,北三区域短报文应急通信——户外应急救援的安全保障

随着中国经济高速发展和民众生活水平、文化素养的不断提高&#xff0c;户外探险活动已经成为越来越多民众自主选择的一种休闲生活方式。 然而&#xff0c;产业发展和参与人数激增的同时户外探险事故也不断增多。根据中国探险协会发布《2022年度中国户外探险事故报告》显示2022…

跨境电商站外推广全攻略:揭秘有效推广方法!

随着全球贸易的蓬勃兴起&#xff0c;越来越多的企业开始涉足跨境电商领域。然而&#xff0c;要在国际市场上取得成功&#xff0c;仅仅依赖平台内的推广策略是远远不够的。站外推广成为了跨境电商拓展业务、吸引潜在客户的关键策略。那么&#xff0c;跨境电商的站外推广具体包括…

计算机组成原理·海明编码及其实验

前言&#xff1a;海明编码这一块在刚开始的时候没有弄懂&#xff0c;后面通过做实验、复习慢慢摸清了门道。在学习计算机组成原理的过程中&#xff0c;实验实践是很重要的&#xff0c;它会让你去搞清楚事情背后的原理&#xff0c;逼着你学会你没听懂的东西。这篇文章会从海明码…

Vue3实战笔记(53)—奇怪+1,VUE3实战模拟股票大盘工作台

文章目录 前言一、实战模拟股票大盘工作台二、使用步骤总结 前言 实战模拟股票大盘工作台 一、实战模拟股票大盘工作台 接上文&#xff0c;这两天封装好的组件直接应用,上源码&#xff1a; <template><div class"smart_house pb-5"><v-row ><…

做外贸,怎么选国外服务器?

不管是新手还是外贸老司机&#xff0c;大家都知道要用海外服务器来做外贸网站&#xff0c;无论外贸独立站的客户是欧美、东南亚、还是非洲&#xff0c;都不能选择国内机房的服务器&#xff0c;必须选择海外服务器&#xff0c;这是共识。 但是今天&#xff0c;我要告诉大家一个…

关联规则(Apriori算法)

文章目录 1 关联规则1.1 关联规则简介1.2 典型例子1.3 频繁项集的评估标准1.3.1 支持度&#xff08;support&#xff09;1.3.2 置信度&#xff08;confidence&#xff09;1.3.3 提升度&#xff08;lift&#xff09; 1.4 最小支持度、最小置信度 2 Python实战2.1 Python实战关联…

基于网关的ip频繁访问web限制

一、前言 外部ip对某一个web进行频繁访问&#xff0c;有可能是对web进行攻击&#xff0c;现在提供一种基于网关的ip频繁访问web限制策略&#xff0c;犹如带刀侍卫&#xff0c;审查异常身份人员。如发现异常或者暴力闯关者&#xff0c;即可进行识别管制。 二、基于网关的ip频繁访…

面向Java程序员的Go工程开发入门流程

对于一个像我这样没有go背景的java程序员来说&#xff0c;使用go开发一个可用的程序的速度是肉眼可见的缓慢。 其难点不在于go语言本身&#xff0c;而是搭建整个工程链路的过程&#xff0c;即所谓的“配环境”。 本文主要讲述如何配出一个适合go开发的环境&#xff0c;以免有同…

STL:vector

文章目录 标准库中的vectorvector的构造vector的迭代器vector的容量vector的元素访问data vector的修改 vector和string的迭代器失效问题resize、reserve、insert、push_back、assigneraseg 和 vs 的区别string解决迭代器失效的方法 标准库中的vector vector是表示可变大小数组…

【学习Day3】计算机基础

✍&#x1f3fb;记录学习过程中的输出&#xff0c;坚持每天学习一点点~ ❤️希望能给大家提供帮助~欢迎点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;指点&#x1f64f; 1.5.4 Cache替换算法 Cache的页面淘汰算法 常用替换算法有&#xff1a; • 随机替换算法RA…