使用 ChatGPT 创建 Makefile 构建系统:从 Docker 开始
使用 Docker 搭配 ChatGPT 创建 Makefile 构建系统
Makefile 构建系统是嵌入式软件团队实现其开发流程现代化的基础。构建系统不仅允许开发人员选择各种构建目标,还可以将这些构建集成到持续集成/持续部署 (CI/CD) 流程中。使用诸如 ChatGPT 这样的人工智能 (AI) 工具则能够提升这个现代化过程的趣味性,因为现在这些工具可以提供反馈,在某些情况下甚至能为你开发构建系统。在这个系列中,我会使用 ChatGPT 从 Docker 开始着手创建 Makefile 构建系统。
Makefile 构建系统需要什么
无论你有没有意识到,大多数嵌入式软件 IDE 背后都是基于 Makefile 的构建系统。此类构建系统可能直接使用 GNU Make,也可能使用 Cmake。就本文而言,使用什么工具我真不在乎。使用 AI 工具能轻松生成所需的代码,无论是用于 GNU Make 还是 Cmake 都不在话下。首先是规划构建系统大纲。在我的如何定义你的理想化嵌入式构建系统一文和如何定义你的理想化嵌入式 CI/CD 流水线一文中,我提到了如何定义理想化的连续集成/连续部署流水线和构建系统。我强烈建议你阅读这些文章,并妥善制定相应策略,然后再尝试使用 AI 工具来完成工作。
出于试验目的,我将按图 1 所示定义理想化的构建系统。
图1 - 结合任何现代化嵌入式系统的必要构建配置和软件堆栈的理想构建系统。(来源:嵌入式软件设计;第 23 页)
至此,就可以开始使用 ChatGPT 等 AI 工具逐步创建构建系统了。但如果你有兴趣了解可供嵌入式软件开发人员使用的其他 AI 工具,可以查看我写的“揭示嵌入式软件开发者可用的 5 大 AI 工具”一文。
我还发现,使用 Docker 来封装所有工具和依赖项对于创建构建系统也同样极为有用。可能许多公司的 IT 部门对于 Docker 深恶痛绝,但是它可以显著简化更新共享,帮助开发人员快速上手。如果你使用 Visual Studio Code 之类的 IDE,那么还会发现可以通过终端使用 Docker 和构建系统,或者也可以自定义 Visual Studio Code 通过用户接口来执行命令。使用 AI 创建构建系统之前,我们将使用它来创建一个 Dockerfile,使用 Docker Desktop 来执行它,这将创建一个容器用于构建软件。
在 ChatGPT 中输入第一个提示
我给 ChatGPT 的第一个提示是告诉它我想要做什么,然后列出我的要求。例如:
我想创建一个 Dockerfile,用于为 Cortex®-M4 架构处理器进行嵌入式软件开发。这个 Dockerfile 具有以下要求:
- 使用最新版本的 Ubuntu
- 安装基本 Linux 支持工具,如 update、clean、autoconf、curl 等
- 在 /home/dev 下设置一个工具目录
- 安装 gcc-arm-none-eabi 工具链,附带针对 newlib 的 C++ 支持
- 安装 Clang 工具用于格式化和静态分析
你能生成满足上述要求的 Dockerfile 吗?
在提示符中输入这些要求后,ChatGPT 生成了一些解释性文本及以下 Dockerfile 输出:
Certainly! Here's a `Dockerfile` that meets your requirements:
```Dockerfile
# Use the latest version of Ubuntu as the base image
FROM ubuntu:latest
# Set the maintainer label
LABEL maintainer="your-email@example.com"
# Set environment variables to non-interactive (this will prevent some prompts)
ENV DEBIAN_FRONTEND=non-interactive
# Install basic linux support tools
RUN apt-get update -y && \
apt-get install -y --no-install-recommends \
autoconf \
curl \
build-essential \
git \
libtool \
make \
pkg-config && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Setup a tool directory in /home/dev
RUN mkdir -p /home/dev
WORKDIR /home/dev
# Install the gcc-arm-none-eabi toolchain with C++ support for newlib
RUN apt-get update -y && \
apt-get install -y --no-install-recommends software-properties-common && \
apt-add-repository ppa:team-gcc-arm-embedded/ppa && \
apt-get update -y && \
apt-get install -y --no-install-recommends gcc-arm-embedded && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Install clang tools for formatting and static analysis
RUN apt-get update -y && \
apt-get install -y --no-install-recommends clang-format clang-tidy && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Set the default command to bash
CMD ["/bin/bash"]
请注意把 `your-email@example.com` 替换为你的实际电子邮件或者其他标识符。
构建和运行 Docker 容器:
- 将 Dockerfile 保存到目录中。
- 在终端中导航到该目录。
- 构建 Docker 镜像:`docker build -t arm-dev-env.`
- 运行 Docker 容器:`docker run -it arm-dev-env`
这样会在 Docker 容器中为你提供一个 bash 提示,并且你指定的所有工具均已安装完成,并准备就绪可供使用。
近几年来,我编写了多个 Dockerfile,以供各种构建系统使用,我授课时会用到这些构建系统,也会把它们给客户。通过对比 ChatGPT 生成的内容,我发现有几处细微差异:
- 我编写的 Dockerfile 中不包含维护人标签,因为我不会广泛发布我的构建系统。但是,我使用刷新标签来标识上次更新 Dockerfile 的时间。(其实有点浪费,因为其实我只要检查 Git 仓库就行了)。
- ChatGPT 额外包含了 ENV DEBIAN_FRONTEND=non-interactive,这招不错。我通常只在安装单个封装包时才会包含这部分。ENV 变量在整个 Dockerfile 中全局包含了这部分。
- ARM 编译器是使用 PPA 服务安装的,而不是通过直接下载或其他方法。
- 默认命令设置为 bash。我从未显式包含此命令,但我觉得这个做法不错。
Dockerfile 看起来与我写的非常相似,但效率也不高。你只要仔细查看,就能看到其中多次运行更新,并且对文件进行了清理和移除操作。就首通 (first pass) 而言,也算不错了。
修复首通的问题
事实证明,如果用以下命令来运行 ChatGPT 生成的第一个 Dockerfile:
docker build -t beningo/cpp-dev。
你会发现 Docker 镜像会失败! 事实证明,使用 PPA 可能会导致一些问题,而且可能与最新版本的 Ubuntu 不兼容。我使用以下提示将此错误输入 ChatGPT 后:
它就会识别这个问题并自动调整方法。这次它决定直接下载 ARM 编译器可执行文件并进行安装,如下 Dockerfile 所示:
# Install the gcc-arm-none-eabi toolchain with C++ support for newlib
RUN curl -L https://developer.arm.com/-/media/Files/downloads/gnu-rm/10-2020q4/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2 | tar xj && \
echo "export PATH=$PATH:/home/dev/gcc-arm-none-eabi-10-2020-q4-major/bin" >> ~/.bashrc
说到这里,你可能会很兴奋,但我可不是第一次肆无忌惮玩野了。通过检查 Dockerfile 可见,我以前就用过这种下载方式,并且遇到过 SSL 证书问题。不过既然要让 AI 驱动,我决定这次循规蹈矩,运行一下 Dockerfile。看到 SSL 错误后,我向 ChatGPT 发送了以下提示:
ChatGPT 能够获取错误代码并识别问题所在。它称:
“The error you’re seeing is due to curl not being able to verify the SSL certificate when trying to fetch the ARM toolchain from the website. This is because the Docker image doesn’t have the necessary CA certificates installed by default. Here’s the updated Dockerfile”:
# Use the latest version of Ubuntu as the base image
FROM ubuntu:latest
# Set the maintainer label
LABEL maintainer="your-email@example.com"
# Set environment variables to non-interactive (this will prevent some prompts)
ENV DEBIAN_FRONTEND=non-interactive
# Install basic linux support tools and ca-certificates for SSL verification
RUN apt-get update -y && \
apt-get install -y --no-install-recommends \
autoconf \
curl \
build-essential \
git \
libtool \
make \
pkg-config \
ca-certificates && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Setup a tool directory in /home/dev
RUN mkdir -p /home/dev
WORKDIR /home/dev
# Install the gcc-arm-none-eabi toolchain with C++ support for newlib
RUN curl -L https://developer.arm.com/-/media/Files/downloads/gnu-rm/10-2020q4/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2 | tar xj && \
echo "export PATH=$PATH:/home/dev/gcc-arm-none-eabi-10-2020-q4-major/bin" >> ~/.bashrc
# Install clang tools for formatting and static analysis
RUN apt-get update -y && \
apt-get install -y --no-install-recommends clang-format clang-tidy && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Set the default command to bash
CMD ["/bin/bash"]
瞧!这回得到的 Dockerfile 能成功构建了!
测试 Docker 镜像
我启动 Docker 镜像时,很高兴地发现我的所有工具都安装好了,而且镜像也在正常运行。不过,我注意到了一个小问题。当我启动镜像时,总是会进入 /home/dev 文件夹中,而不是我的应用程序所在的 /home/app 文件夹。在我自己的 Dockerfiles 中,我在文件末尾添加了以下内容:
WORKDIR /home/app
ChatGPT 也会提供同样的解决方案吗?接下来,我输入了以下提示:
我得到的响应是:
# Use the latest version of Ubuntu as the base image
FROM ubuntu:latest
# Set the maintainer label
LABEL maintainer="your-email@example.com"
# Set environment variables to non-interactive (this will prevent some prompts)
ENV DEBIAN_FRONTEND=non-interactive
# Install basic linux support tools and ca-certificates for SSL verification
RUN apt-get update -y && \
apt-get install -y --no-install-recommends \
autoconf \
curl \
build-essential \
git \
libtool \
make \
pkg-config \
ca-certificates && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Setup a tool directory in /home/dev
RUN mkdir -p /home/dev
# Install the gcc-arm-none-eabi toolchain with C++ support for newlib in /home/dev
WORKDIR /home/dev
RUN curl -L https://developer.arm.com/-/media/Files/downloads/gnu-rm/10-2020q4/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2 | tar xj && \
echo "export PATH=$PATH:/home/dev/gcc-arm-none-eabi-10-2020-q4-major/bin" >> ~/.bashrc
# Install clang tools for formatting and static analysis
RUN apt-get update -y && \
apt-get install -y --no-install-recommends clang-format clang-tidy && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Create and set the working directory to /home/app
WORKDIR /home/app
# Set the default command to bash
CMD ["/bin/bash"]
成功!ChatGPT 得出了与我相同的解决方案和结论!
重构和清理 Dockerfile
到目前为止,ChatGPT 工作非常出色!不过还有一个问题,就是 Dockerfile 的优化仍不及预期。我可以自己重来一遍,手动对它进行优化......或者让 AI 来做!回到 ChatGPT 中,我输入了以下内容作为下一项提示:
Dockerfile 效率不高,原因可能是多次安装和清理。可以改善吗?
得到的响应是:
修改后的 Dockerfile:
# Use the latest version of Ubuntu as the base image
FROM ubuntu:latest
# Set the maintainer label
LABEL maintainer="your-email@example.com"
# Set environment variables to non-interactive (this will prevent some prompts)
ENV DEBIAN_FRONTEND=non-interactive
# Update package lists, install basic tools, toolchains, and clean up in one step
RUN apt-get update -y && \
apt-get install -y --no-install-recommends \
autoconf \
curl \
build-essential \
git \
libtool \
make \
pkg-config \
ca-certificates \
software-properties-common \
clang-format \
clang-tidy && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Setup a tool directory in /home/dev and download the ARM toolchain
WORKDIR /home/dev
RUN curl -L https://developer.arm.com/-/media/Files/downloads/gnu-rm/10-2020q4/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2 | tar xj && \
echo "export PATH=$PATH:/home/dev/gcc-arm-none-eabi-10-2020-q4-major/bin" >> ~/.bashrc
# Create and set the working directory to /home/app
WORKDIR /home/app
# Set the default command to bash
CMD ["/bin/bash"]
我不知道你怎么想,但我很兴奋。最新的 dockerfile 看起来与我近几年来从头开始写的 Dockerfile 非常相似。我仍然使用不同的方法来安装 Arm 编译器,但目前我们 Dockerfile 中的方法并不太寒酸。(不过它已经被修复了,所以我们没法知道是否有新版本的 GNU Arm 编译器可用。奇怪的是,已经有大概两年没更新了。我不知道什么原因,但这个话题下次再讨论)。
添加测试工具
有时,即使面对如此精品,你也会忍不住对它“调教”一番。毕竟,只要弄不坏它,那就可以试试把它做得更好,对吧?眼下有一个 Dockerfile,其中包含为 Arm 微控制器编译代码所需的工具。但实际上,我们还应该在这个镜像中添加不少东西。比如指标分析,可能最重要的是,添加测试工具?我觉得在 Dockerfile 中添加 cpputest 会很有趣。毕竟,我自己的许多工程都会用 cpputest,而且我知道应该会生成怎样的 Dockerfile。ChatGPT 能做到吗?让我们一探究竟。我回到提示符中,添加了以下内容:
ChatGPT 则提供了如下输出:
# Use the latest version of Ubuntu as the base image
FROM ubuntu:latest
# Set the maintainer label
LABEL maintainer="your-email@example.com"
# Set environment variables to non-interactive (this will prevent some prompts)
ENV DEBIAN_FRONTEND=non-interactive
# Update package lists, install basic tools, toolchains, and clean up in one step
RUN apt-get update -y && \
apt-get install -y --no-install-recommends \
autoconf \
automake \
curl \
build-essential \
git \
libtool \
make \
pkg-config \
ca-certificates \
software-properties-common \
clang-format \
clang-tidy && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Setup a tool directory in /home/dev and download the ARM toolchain
WORKDIR /home/dev
RUN curl -L https://developer.arm.com/-/media/Files/downloads/gnu-rm/10-2020q4/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2 | tar xj && \
echo "export PATH=$PATH:/home/dev/gcc-arm-none-eabi-10-2020-q4-major/bin" >> ~/.bashrc
# Clone, build, and install CppUTest
WORKDIR /home
RUN git clone https://github.com/cpputest/cpputest.git && \
cd cpputest && \
./autogen.sh && \
./configure && \
make install
# Set the CPPUTEST_HOME environment variable
ENV CPPUTEST_HOME=/home/cpputest
# Create and set the working directory to /home/app
WORKDIR /home/app
# Set the default command to bash
CMD ["/bin/bash"]
没错。这基本上与我自己的 Dockerfile 中的内容差不多。哪天我不得不从头写个文件时,就可以用 ChatGPT 在 5 分钟内完成。
结论
像 ChatGPT 这样的 AI 工具可以用来编写和改进你的嵌入式构建系统。这篇文章探讨了如何使用 ChatGPT 写一个 Dockerfile,并且其中包括我在开发嵌入式软件时使用的一些工具。这个示例虽然有一定的局限性,但它展示了如何使用 AI 工具快速创建代码草稿,并对其进行快速迭代。我之所以能快速完成这些,是因为我已经为我使用的各种构建系统写了很多 Dockerfile。我拥有丰富的经验,知道 AI 给的输出究竟是有效的、需要改进的还是一文不值的。我相信,如果没有这些经验,你难免会发现自己深陷泥潭难以自拔。
下次,我们来聊聊如何使用 AI 从头生成一个构建系统,然后搭配 Dockerfile 一起使用。你觉得 AI 能做到吗?你很快就会知道了。
相关文章:

使用 ChatGPT 创建 Makefile 构建系统:从 Docker 开始
使用 Docker 搭配 ChatGPT 创建 Makefile 构建系统 Makefile 构建系统是嵌入式软件团队实现其开发流程现代化的基础。构建系统不仅允许开发人员选择各种构建目标,还可以将这些构建集成到持续集成/持续部署 (CI/CD) 流程中。使用诸如 ChatGPT 这样的人工智能 (AI) 工…...
嵌入式设备摄像头基础知识
工作原理 摄像头的工作原理是,当光线通过镜头聚焦到图像传感器上时,传感器会将光信号转换为电信号,并将其传输给处理器进行处理。处理器通过算法对图像信号进行增强、去噪、压缩等操作,并将其转换为数字信号输出给计算机或其他设…...

使用Pytorch从零开始构建Normalizing Flow
归一化流 (Normalizing Flow) (Rezende & Mohamed,2015)学习可逆映射 f : X → Z f: X \rightarrow Z f:X→Z, 在这里X是我们的数据分布,Z是选定的潜在分布。 归一化流是生成模型家族的一部分,其中包括变分自动编…...
一个tomcat中部署的多个war,相当于几个jvm
请直接去看原文 原文链接:一个tomcat有几个jvm-CSDN博客 --------------------------------------------------------------------------------------------------------------------------------- 前几天向unmi提问,今天他答复了。我觉得答复很清楚,…...

2023年第十六届中国系统架构师大会(SACC2023)-核心PPT资料下载
一、峰会简介 本届大会以“数字转型 架构演进”为主题, 涵盖多个热门领域,如多云多活、海量分布式存储、容器、云成本、AIGC大数据等,同时还关注系统架构在各个行业中的应用,如金融、制造业、互联网、教育等。 与往届相比&#…...

高校大学校园后勤移动报修系统 微信小程序uniapp+vue
本文主要是针对线下校园后勤移动报修传统管理方式中管理不便与效率低的缺点,将电子商务和计算机技术结合起来,开发出管理便捷,效率高的基于app的大学校园后勤移动报修app。该系统、操作简单、界面友好、易于管理和维护;而且对后勤…...
docker常见问题汇总
docker常见问题 ❓问题1:启动docker容器时,报错Unknown runtime specified nvidia. 当我启动一个容器时,运行以下命令: docker run --runtimenvidia 。。。。 后面一部分命令没写出来,此时报错的信息如下:…...

JMeter 测试脚本编写技巧
JMeter 是一款开源软件,用于进行负载测试、性能测试及功能测试。测试人员可以使用 JMeter 编写测试脚本,模拟多种不同的负载情况,从而评估系统的性能和稳定性。以下是编写 JMeter 测试脚本的步骤。 第 1 步:创建测试计划 在JMet…...

力扣6:N字形变化
代码: class Solution { public:string convert(string s, int numRows){int lens.size();if(numRows1){return s;}int d2*numRows-2;int count0;string ret;//第一行!for(int i0;i<len;id){rets[i];}//第k行!for(int i1;i<numRows-1;…...

【上海大学数字逻辑实验报告】一、基本门电路
一、 实验目的 熟悉TTL中、小规模集成电路的外形、管脚和使用方法;了解和掌握基本逻辑门电路的输入与输出之间的逻辑关系及使用规则。 二、 实验原理 实现基本逻辑运算和常用逻辑运算的单元电路称为逻辑门电路。门电路通常用高电平VH表示逻辑值“1”,…...

基于xml配置的AOP
目录 xml方式AOP快速入门 xml方式AOP配置详解 xml方式AOP快速入门 xml方式配置AOP的步骤 导入AOP相关坐标 <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.13</version></de…...

java学习part12多态
99-面向对象(进阶)-面向对象的特征三:多态性_哔哩哔哩_bilibili 1.多态(仅限方法) 父类引用指向子类对象。 调用重写的方法,就会执行子类重写的方法。 编译看引用表面类型,执行看实际变量类型。 2.父子同名属性是否…...

前置任务之安装jdk
已经安装过很多次了,但是每次安装都要搜好几次才能找到正确的,离大谱。 1.打开 oracle官网 https://www.oracle.com 然后切换到Java archive 下载192版本的,页面搜索ctrlF,【Java SE Development Kit】或者【jdk-8u192-windows-…...
C++ 常见异常
关于C异常(包括但不限于编译器异常)先开个头,有空都记下来吧: 1:_DllMain12 已经在 MSVCRTD.lib(dllmain.obj) 中定义 有效的解决办法: Debug版本: 项目-属性-链接器-输入:忽略特…...
语音识别学习笔记
目录 开源的语音识别项目 端到端的多说话人语音识别序列化训练方法简介 新一代 Kaldi: Two-pass 实时语音识别 开源的语音识别项目 有哪些语音识别的开源项目? - 知乎 端到端的多说话人语音识别序列化训练方法简介 端到端的多说话人语音识别序列化训练方法简介 …...

深入了解Java8新特性-日期时间API
阅读建议 嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议: 本篇文章大概2000多字,预计阅读时间长需要3分钟。本篇文章的实战性、理论性较强,是一篇质量分数较高的技术干货文章&#x…...
【数据结构】二叉树概念 | 满二叉树 | 完全二叉树
二叉树的概念 二叉树在实践中用的很多。 一棵二叉树是结点的一个有限集合,该集合: 或者为空;由一个根结点加上两棵别称为左子树和右子树的二叉树组成。二叉树最多两个孩子。 这里注意:二叉树并不是度为2的树。 二叉树的度最大值是…...

第 373 场 LeetCode 周赛题解
A 循环移位后的矩阵相似检查 模拟 class Solution { public:bool areSimilar(vector<vector<int>> &mat, int k) {int m mat.size(), n mat[0].size();k % n;auto g mat;for (int i 0; i < m; i)if (i & 1)rotate(mat[i].begin(), mat[i].begin() …...

C#,《小白学程序》第二十五课:大数乘法(BigInteger Multiply)的Karatsuba算法及源代码
1 文本格式 /// <summary> /// 《小白学程序》第二十五课:大数(BigInteger)的Karatsuba乘法 /// Multiplies two bit strings X and Y and returns result as long integer /// </summary> /// <param name"a">&…...

Redis的五大数据类型详细用法
我们说 Redis 相对于 Memcache 等其他的缓存产品,有一个比较明显的优势就是 Redis 不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。本篇博客我们就将介绍这些数据类型的详细使用…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...

Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...

【深度学习新浪潮】什么是credit assignment problem?
Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...