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

RPM 包制作备查 SRPM 包编译

🌈 个人主页:Zfox_

目录

  • 🔥 前言
  • 一:🔥 准备
  • 二:🔥 制作 rpm
    • 1.设置目录结构(制作车间)
    • 2. 源码放置到规划好的目录当中
    • 3. 创建一个spec文件,指挥如何使用这些源材料,制作成 rpm包
    • 4. 编译源码生成rpm包 rpmbuild 命令
    • 🦋 第一步学习内容
      • 🎀 查看所有的rpm宏定义
    • 🦋 第三步学习内容
      • 信息段 (section):
      • 准备段 (section)
        • %prep
        • %setup
        • 常用选项:
        • %patch
      • 编译段 (section)
      • 安装阶段
      • 清理阶段
      • 文件段
      • changelog 段 日志
    • 🦋 第四步
      • 🎀 rpmbuild 参数信息
  • 三:🔥 rpm 制作过程
    • 1. %prep 阶段
    • 2. %build 阶段
        • config
      • make
    • % install
    • %check 阶段
    • %files 段
    • %clean
  • 四:🔥 备查
    • 🦋 rpmlint 检查
    • 🦋 代表路径的宏列表
  • 五:🔥 编译 SRPM 包
    • 🦋 以下是编译 SRPM 包的详细步骤:
      • 1. 安装必要的工具
      • 2. 安装依赖项
      • 3. 创建 RPM 工作目录
      • 4. 安装 SRPM 包
      • 5. 编译 RPM 包
      • 6. 检查生成的 RPM 包
      • 7. 安装生成的 RPM 包
      • 总结
  • 六:🔥 共勉

🔥 前言

🎒 **RPM(Redhat Package Manager)**是用于Redhat、CentOS、Fedora等Linux 分发版(distribution)的常见的软件包管理器。因为它允许分发已编译的软件,所以用户只用一个命令就可以安装软件。看到这篇文章的朋友想必已经知道RPM是个啥,rpm/yum命令怎么用,废话不多说,直接进入正题,来看看RPM包咋打。

一:🔥 准备

首先请准备一个Linux环境,比如CentOS。

RPM打包使用的是rpmbuild命令,这个命令来自rpm-build包,这个是必装的。

$ yum install rpm-build

当然也可以直接安装rpmdevtools,这个工具还包含一些其他的工具,同时它依赖rpm-build,所以直接安装的话会同时把rpm-build装上。

$ yum install rpmdevtools

当然,根据不同的软件构建过程,还需要其他的编译打包工具,比如C语言的 make、gcc,python 的 setuptools 等,根据需要安装即可。

二:🔥 制作 rpm

官方文档:

  • https://docs.redhat.com/zh-cn/documentation/red_hat_enterprise_linux/7/html-single/rpm_packaging_guide/index#getting-started-with-rpm-packaging

其他资料:

  • https://blog.csdn.net/m0_57053326/article/details/122363510

  • https://www.cnblogs.com/yipianchuyun/p/15442896.html

1.设置目录结构(制作车间)

必须要有五个目录

  • BUILD(制作车间)
    • 源代码解压以后放的位置,config,make,不需要我们管
  • RPMS
    • 制作完成以后的rpm包,为特定平台准备的子目录的
  • SOURCES
    • 所有源材料都放到这里,配置文件,源码包,补丁包
  • SPECS
    • 放置spec文件,每个rpm的纲领性文件(最重要的)
  • SRPMS
    • src格式的rpm包放置的位置
  • BUILDROOT (假想的根目录)
    • 是一个目录,它模拟了一个完整的文件系统环境。当构建一个 RPM 包时,所有的构建操作(如编译、安装等)都会在这个目录中进行,而不是直接在系统的根目录下操作。这样可以避免对系统本身的文件系统造成污染。

2. 源码放置到规划好的目录当中

3. 创建一个spec文件,指挥如何使用这些源材料,制作成 rpm包

4. 编译源码生成rpm包 rpmbuild 命令

🦋 第一步学习内容

在这里插入图片描述

mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}

也可以设置目录结构

🎀 查看所有的rpm宏定义

 rpmbuild --showrc

_topdir 存放的就是 rpm 制作车间的路径

parallels@ubuntu-linux-2404:~$ rpmbuild --showrc | grep _topdir
-13: _builddir	%{_topdir}/BUILD
-13: _buildrootdir	%{_topdir}/BUILDROOT
-13: _rpmdir	%{_topdir}/RPMS
-13: _sourcedir	%{_topdir}/SOURCES
-13: _specdir	%{_topdir}/SPECS
-13: _srcrpmdir	%{_topdir}/SRPMS
-13: _topdir	%{getenv:HOME}/rpmbuild
rpmbuild --showrc | grep macrofiles 

rpmbuild --showrc | grep macrofiles 命令可以帮助你了解 RPM 构建过程中使用的宏文件路径。

添加/修改变量,更改制作车间的位置

vim .rpmmacros%_topdir 	~/selffile

🦋 第三步学习内容

这些内容都是 spec 设置的

信息段 (section):

rpm -qi 命令会显示的内容
在这里插入图片描述
在这里插入图片描述

Source 指令在 .spec 文件中用于指定构建软件包所需的源文件。这些源文件可以是 URL 或本地文件路径。通过正确配置 Source 指令,你可以确保 rpmbuild 能够找到并使用所需的源文件来构建软件包。

依赖关系

BuildRequires 编译依赖
Requires 安装依赖

准备段 (section)

在这里插入图片描述
源码包解压缩到 BUILD 的过程

%prep

%prep.spec 文件中的一个部分,用于准备源代码。在这个部分中,通常会执行以下操作:

  • 解压源代码文件。
  • 应用补丁文件。
  • 执行其他必要的准备步骤。
%setup

%setup 是一个宏,用于解压源代码文件。它会自动处理 Source 指令中指定的源文件。

常用选项:
  • -q:安静模式,减少输出信息。
  • -n:指定解压后的目录名称。如果不指定,%setup 会根据源文件的名称自动推断目录名称。

示例:

%prep
%setup -q

这个命令会解压 Source0 指定的源文件,并进入解压后的目录。如果源文件是 myapp-1.0.tar.gz,解压后的目录通常是 myapp-1.0

%patch

%patch 是一个宏,用于应用补丁文件。补丁文件通常用于修复源代码中的问题或添加功能。

常用选项:

  • -p:指定补丁的上下文级别。-p1 表示补丁文件是基于一级目录的。
  • -b:指定补丁后的备份文件后缀。例如,-b .orig 会在应用补丁后生成备份文件。

示例:

%prep
%setup -q
%patch1 -p1

这个命令会:

  1. 解压 Source0 指定的源文件。
  2. 应用 Source1 指定的补丁文件。

编译段 (section)

在这里插入图片描述

安装阶段

在这里插入图片描述

清理阶段

在这里插入图片描述

文件段

%files 段在 .spec 文件中用于定义哪些文件和目录应该包含在最终的 RPM 包中,并指定它们在目标系统上的安装位置。通过正确配置 %files 段,你可以确保 RPM 包包含所有必要的文件,并将它们安装到正确的位置。
在这里插入图片描述
%defattr 是一个非常重要的指令,用于定义包中文件的默认属性。

%defatter (- root, root, 755)

当你在 %files 部分列出 /usr/local/bin/axel 时,这意味着 /usr/local/bin/axel 文件将被包含在最终生成的 RPM 包中,并且在安装该 RPM 包时,该文件将被安装到目标系统上的 /usr/local/bin/axel 路径。

/usr/local/bin/axel

changelog 段 日志

在这里插入图片描述

🦋 第四步

rpmbuild -ba …spec

🎀 rpmbuild 参数信息

  • bb 二进制
  • ba 都 build
  • bs 源 rpm包

在这里插入图片描述

%files 和 buildroot 的文件必须一一对应!

三:🔥 rpm 制作过程

在这里插入图片描述
使用 rpmbuild 命令

首先读取 SOURCES 下的相关文件解压缩到 BUILD 生成子目录,而后制作过程会跳到子目录执行 config make

以下是详细解释 :

在使用 rpmbuild 命令构建 RPM 包时,%prep%build%install 是三个关键的阶段。你提到的 configmake 是在 %build 阶段中常用的命令,它们的作用如下:

1. %prep 阶段

%prep 阶段用于准备源代码,通常包括解压源文件和应用补丁。rpmbuild 会读取 .spec 文件中的 Source 指令,下载并解压源文件到 BUILD 目录下的子目录中。例如:

%prep
%setup -q
%patch1 -p1
  • %setup -q:解压 Source0 指定的源文件,并进入解压后的目录。
  • %patch1 -p1:应用 Source1 指定的补丁文件。

2. %build 阶段

%build 阶段用于编译和构建软件。在这个阶段,通常会执行以下步骤:
在 BUILD下做

config

config 通常是指 ./configure 脚本,这是一个常见的配置工具,用于检查系统环境并生成适合当前系统的配置文件。./configure 脚本通常由 autoconf 工具生成,它会检查系统上的依赖项、库和工具,以确保软件可以正确编译。

%build
%configure
  • %configure:这是一个 RPM 宏,等同于运行 ./configure 脚本。它会执行以下操作:
    • 检查系统环境。
    • 生成配置文件(如 Makefile)。
    • 检查依赖项是否满足。

make

make 是一个构建工具,用于根据 Makefile 文件中的规则编译源代码并生成可执行文件或库文件。make 会读取 Makefile 中的规则,执行编译、链接等操作。

%build
%configure
make %{?_smp_mflags}
  • make %{?_smp_mflags}:运行 make 命令,%{?_smp_mflags} 是一个 RPM 宏,用于启用并行构建(如果系统支持多核处理器)。

% install

然后使用 install 命令安装到 buildroot 中

buildroot 是 RPM 构建过程中一个非常重要的目录,它用于模拟软件包的安装过程。在构建 RPM 包时,buildroot 起到了一个临时的“根目录”的作用,确保软件包在构建过程中不会直接安装到系统的实际根目录中,从而避免对系统造成污染或破坏。

%check 阶段

如果需要执行测试,使用 %check 是个好主意。测试代码应写入 %check 部分(紧接在 %install 之后,因为需要测试 %{buildroot} 中的文件),而不是写入 %{build} 部分,这样才能在必要时忽略测试。通常,此部分包含:

make test

有时候也可以用:

make check

请熟悉 Makefile 的用法,并选择适当的方式。

%files 段

%files 段用于指定哪些文件和目录应该包含在最终的 RPM 包中,并定义这些文件在目标系统上的安装位置。%files 段并不直接操作 buildroot,而是告诉 rpmbuild 哪些文件应该从 buildroot 中打包到最终的 RPM 包中。

%clean

在 RPM 的 .spec 文件中,%clean 段用于指定在构建过程结束后需要清理的文件和目录。这个阶段的主要目的是确保构建过程中产生的临时文件和目录被正确清理,以避免对系统造成不必要的污染。
%clean 段的作用
清理临时文件:删除构建过程中产生的临时文件和目录。
清理 buildroot:确保 buildroot 目录被清理,避免残留文件影响后续构建。
清理其他临时目录:清理 %prep 和 %build 阶段产生的其他临时目录。

四:🔥 备查

🦋 rpmlint 检查

为避免常见错误,请先使用 rpmlint 查找 SPEC 文件的错误:

$ rpmlint program.spec

如果返回错误/警告,使用 “-i” 选项查看更详细的信息。

也可以使用 rpmlint 测试已构建的 RPM 包,检查 SPEC/RPM/SRPM 是否存在错误。你需要在发布软件包之前,解决这些警告。此页面 提供一些常见问题的解释。如果你位于 SPEC 目录中,请执行:

$ rpmlint NAME.spec ../RPMS/*/NAME*.rpm ../SRPMS/NAME*.rpm

进入 ~/rpmbuild/RPMS 下的特定架构目录中,您会发现有许多二进制 RPM 包。使用以下命令快速查看 RPM 包含的文件和权限:

$ rpmls *.rpm

🦋 代表路径的宏列表

%{_sysconfdir}        /etc
%{_prefix}            /usr
%{_exec_prefix}       %{_prefix}
%{_bindir}            %{_exec_prefix}/bin
%{_libdir}            %{_exec_prefix}/%{_lib}
%{_libexecdir}        %{_exec_prefix}/libexec
%{_sbindir}           %{_exec_prefix}/sbin
%{_sharedstatedir}    /var/lib
%{_datarootdir}       %{_prefix}/share
%{_datadir}           %{_datarootdir}
%{_includedir}        %{_prefix}/include
%{_infodir}           /usr/share/info
%{_mandir}            /usr/share/man
%{_localstatedir}     /var
%{_initddir}          %{_sysconfdir}/rc.d/init.d
%{_var}               /var
%{_tmppath}           %{_var}/tmp
%{_usr}               /usr
%{_usrsrc}            %{_usr}/src
%{_lib}               lib (lib64 on 64bit multilib systems)
%{_docdir}            %{_datadir}/doc
%{buildroot}          %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}
$RPM_BUILD_ROOT       %{buildroot}

五:🔥 编译 SRPM 包

🦈 编译一个已下载的 RPM 包通常指的是从源代码构建一个 RPM 包。如果你下载的是源 RPM 包(SRPM),可以通过以下步骤进行编译。如果是二进制 RPM 包(即直接安装的 RPM 包),则无法直接“编译”,因为它们已经是编译后的安装包。

🦋 以下是编译 SRPM 包的详细步骤:

1. 安装必要的工具

在编译 RPM 包之前,需要安装一些必要的工具,包括 rpm-buildrpmbuild。在基于 Red Hat 的系统(如 CentOS、Fedora 或 RHEL)上,可以使用以下命令安装:

sudo dnf install rpm-build

或者在较旧的系统中,可能需要使用 yum

sudo yum install rpm-build

2. 安装依赖项

编译 RPM 包时,可能需要安装一些编译依赖项。这些依赖项通常在 .spec 文件中指定。可以使用以下命令安装所有依赖项:

sudo dnf builddep <srpm-file>.src.rpm

或者使用 yum

sudo yum-builddep <srpm-file>.src.rpm

这会自动安装 .spec 文件中指定的所有依赖项。

3. 创建 RPM 工作目录

如果你还没有创建 RPM 工作目录,可以按照之前提到的步骤创建一个标准的 RPM 工作目录结构:

mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}

并配置 ~/.rpmmacros 文件:

echo "%_topdir %(echo $HOME)/rpmbuild" > ~/.rpmmacros

4. 安装 SRPM 包

将 SRPM 包安装到你的 RPM 工作目录中。这会将源代码和 .spec 文件解压到相应的位置。使用以下命令:

rpm -ivh --define "_topdir $HOME/rpmbuild" <srpm-file>.src.rpm

例如:

rpm -ivh --define "_topdir $HOME/rpmbuild" example-1.0-1.src.rpm

这会将源代码解压到 ~/rpmbuild/SOURCES 目录,.spec 文件解压到 ~/rpmbuild/SPECS 目录。

5. 编译 RPM 包

使用 rpmbuild 命令从 .spec 文件构建 RPM 包。运行以下命令:

rpmbuild -ba ~/rpmbuild/SPECS/<spec-file>.spec

例如:

rpmbuild -ba ~/rpmbuild/SPECS/example.spec

这个命令会执行以下步骤:

  • 解压源代码。
  • 编译代码。
  • 安装文件到 buildroot
  • 打包生成 RPM 文件。

6. 检查生成的 RPM 包

如果一切顺利,生成的 RPM 包会出现在 ~/rpmbuild/RPMS 目录中。你可以使用以下命令查看生成的 RPM 包:

ls ~/rpmbuild/RPMS/

7. 安装生成的 RPM 包

你可以使用 dnfyum 安装生成的 RPM 包:

sudo dnf install ~/rpmbuild/RPMS/<arch>/<rpm-file>.rpm

或者:

sudo yum install ~/rpmbuild/RPMS/<arch>/<rpm-file>.rpm

例如:

sudo dnf install ~/rpmbuild/RPMS/x86_64/example-1.0-1.x86_64.rpm

总结

编译一个已下载的 SRPM 包的步骤如下:

  1. 安装必要的工具(如 rpm-build)。
  2. 安装编译依赖项(使用 dnf builddepyum-builddep)。
  3. 创建 RPM 工作目录并配置 ~/.rpmmacros 文件。
  4. 安装 SRPM 包到工作目录。
  5. 使用 rpmbuild -ba 命令从 .spec 文件构建 RPM 包。
  6. 检查生成的 RPM 包。
  7. 安装生成的 RPM 包。

通过这些步骤,你可以从源代码重新编译并生成自己的 RPM 包。

六:🔥 共勉

😋 以上就是我对 RPM 包制作原理详解及备查 的理解, 觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~ 😉
在这里插入图片描述

相关文章:

RPM 包制作备查 SRPM 包编译

&#x1f308; 个人主页&#xff1a;Zfox_ 目录 &#x1f525; 前言 一&#xff1a;&#x1f525; 准备 二&#xff1a;&#x1f525; 制作 rpm 1.设置目录结构&#xff08;制作车间&#xff09;2. 源码放置到规划好的目录当中3. 创建一个spec文件&#xff0c;指挥如何使用这些…...

[学习] RTKLib详解:rtcm2.c、rtcm3.c、rtcm3e与rtcmn.c

RTKLib详解&#xff1a;rtcm2.c、rtcm3.c、rtcm3e与rtcmn.c 本文是 RTKLlib详解 系列文章的一篇&#xff0c;目前该系列文章还在持续总结写作中&#xff0c;以发表的如下&#xff0c;有兴趣的可以翻阅。 [学习] RTKlib详解&#xff1a;功能、工具与源码结构解析 [学习]RTKLib详…...

MCU ESP32-S3+SD NAND(贴片式T卡):智能皮电手环(GSR智能手环)性能与存储的深度评测

在智能皮电手环与数据存储领域&#xff0c;主控MCU ESP32-S3FH4R2 与 存储SD NAND MKDV2GIL-AST 的搭档堪称行业新典范。二者深度融合低功耗、高速读写、SMART 卓越稳定性等核心优势&#xff0c;以高容量、低成本的突出特性&#xff0c;为大规模生产场景带来理想的数据存储方案…...

股指期货套期保值怎么操作?

股指期货套期保值就是企业或投资者通过持有与其现货市场头寸相反的期货合约&#xff0c;来对冲价格风险的一种方式。换句话说&#xff0c;就是你在股票市场上买了股票&#xff08;现货&#xff09;&#xff0c;担心股价下跌会亏钱&#xff0c;于是就在期货市场上卖出相应的股指…...

Pytorch的Dataloader使用详解

PyTorch 的 DataLoader 是数据加载的核心组件&#xff0c;它能高效地批量加载数据并进行预处理。 Pytorch DataLoader基础概念 DataLoader基础概念 DataLoader是PyTorch基础概念 DataLoader是PyTorch中用于加载数据的工具&#xff0c;它可以&#xff1a;批量加载数据&#xf…...

Ros2 - Moveit2 - DeepGrasp(深度抓握)

本教程演示了如何在 MoveIt 任务构造器中使用抓握姿势检测 (GPD)和 Dex-Net 。 GPD&#xff08;左&#xff09;和 Dex-Net&#xff08;右&#xff09;用于生成拾取圆柱体的抓取姿势。 https://moveit.picknik.ai/main/_images/mtc_gpd_panda.gif 入门 如果您还没有这样做&am…...

【DRAM存储器五十一】LPDDR5介绍--CK、WCK、RDQS单端模式、Thermal Offset、Temperature Sensor

👉个人主页:highman110 👉作者简介:一名硬件工程师,持续学习,不断记录,保持思考,输出干货内容 参考资料:《某LPDDR5数据手册》 、《JESD209-5C》 目录 CK、WCK、RDQS单端模式 Thermal Offset Temperature Sensor...

【springcloud学习(dalston.sr1)】Eureka 客户端服务注册(含源代码)(四)

d该系列项目整体介绍及源代码请参照前面写的一篇文章【springcloud学习(dalston.sr1)】项目整体介绍&#xff08;含源代码&#xff09;&#xff08;一&#xff09; 这篇文章主要介绍Eureka客户端服务注册到eureka的server端。 上篇文章【springcloud学习(dalston.sr1)】Eurek…...

数据结构 栈和队列

文章目录 &#x1f4d5;1.栈(Stack)✏️1.1 栈的基本操作✏️1.2 栈的模拟实现&#x1f516;1.2.1 构造方法&#x1f516;1.2.2 扩容方法&#x1f516;1.2.3 判断栈是否为空或是否满&#x1f516;1.2.4 存储元素&#x1f516;1.2.5 删除元素&#x1f516;1.2. 6 获取栈顶元素 ✏…...

[数据结构]5. 栈-Stack

栈-Stack 1. 介绍2. 栈的实现2.1 基于链表的实现2.2 基于数组的实现 3. 栈操作CreateInitilizateDestoryPushPopTopEmptySize 1. 介绍 栈&#xff08;stack&#xff09; 是一种遵循先入后出逻辑的线性数据结构。顶部称为“栈顶”&#xff0c;底部称为“栈底”。把元素添加到栈…...

Git的安装和配置(idea中配置Git)

一、Git的下载和安装 前提条件&#xff1a;IntelliJ IDEA 版本是2023.3 &#xff0c;那么配置 Git 时推荐使用 Git 2.40.x 或更高版本 下载地址&#xff1a;CNPM Binaries Mirror 操作&#xff1a;打开链接 → 滚动到页面底部 → 选择2.40.x或更高版本的 .exe 文件&#xf…...

QT-1.信号与槽

一、信号与槽机制概述 四、信号与槽的连接 六、自定义信号与槽 思考 定义与作用 &#xff1a;信号与槽是Qt中的核心通信机制&#xff0c;用于实现对象间的数据交互和事件处理。当特定事件发生时&#xff0c;对象会发出信号&#xff0c;而与之相连的槽函数会被自动调用。 特点 …...

常用的应用层网络协议对比

概述 协议通信模式加密支持传输层主要特点典型应用场景WSS全双工是&#xff08;TLS/SSL&#xff09;TCP安全的实时双向通信实时聊天、在线游戏WebSocket (WS)全双工否TCP持久连接、低延迟协同编辑、实时通知HTTPS请求-响应是&#xff08;TLS/SSL&#xff09;TCP安全性强、兼容…...

数据结构与算法:状压dp

前言 状压dp在整个动态规划专题里特别重要,用位信息表示元素的思想更是重中之重。 一、状态压缩 1.内容 对于一些带路径的递归,通常来讲没法改记忆化搜索和严格位置依赖的动态规划。但如果这个路径的数据量在一定范围内,就可以考虑使用一个整数status的位信息0和1来存路…...

Spring Cloud Gateway 聚合 Swagger 文档:一站式API管理解决方案

前言 在微服务架构中&#xff0c;随着服务数量的增加&#xff0c;API文档管理变得越来越复杂。每个微服务都有自己的Swagger文档&#xff0c;开发人员需要记住每个服务的文档地址&#xff0c;这无疑增加了开发难度。本文将介绍如何使用Spring Cloud Gateway聚合所有微服务的Sw…...

Android 适配之——targetSdkVersion 30升级到31-34需要注意些什么?

在Android 16即将到来的之际。也就是targetSdkVersion即将出现36&#xff0c;而30已然会成为历史。那么我的项目已经停留在30很久了。是时候要适配一下适用市场的主流机型了。正常来查找资料的&#xff0c;无非就是已经升级和准备升级targetSdkVersion开发版本。所以你是哪一种…...

网络运维过程中的常用命令

一、通用网络命令 ping 作用&#xff1a;测试与目标 IP 或域名的连通性。 示例&#xff1a; ping www.baidu.com # 持续发送ICMP包 ping -c 4 8.8.8.8 # 发送4个包后停止 traceroute/tracert 功能&#xff1a;追踪数据包经过的路由节点。 示例&#xff1a; traceroute…...

[Java实战]Spring Boot 3整合JWT实现无状态身份认证(二十四)

[Java实战]Spring Boot 3整合JWT实现无状态身份认证&#xff08;二十四&#xff09; 一、JWT简介与核心概念 1. JWT是什么&#xff1f; JSON Web Token (JWT) 是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在各方之间安全地传输信息。JWT由三部分组成&am…...

【Java-EE进阶】SpringBoot针对某个IP限流问题

目录 简介 1. 使用Guava的RateLimiter实现限流 添加Guava依赖 实现RateLimiter限流逻辑 限流管理类 控制器中应用限流逻辑 2. 使用计数器实现限流 限流管理类 控制器中应用限流逻辑 简介 针对某个IP进行限流以防止恶意点击是一种常见的反爬虫和防止DoS的措施。限流策…...

软考冲刺——案例分析题 MUX VLAN

上一篇文章介绍了VLAN高级应用的Super VLAN&#xff0c;本次介绍MUX VLAN内容&#xff0c;MUX VLAN在2024.11月考察过选择题&#xff0c;案例题中有可能出现。 考点一&#xff1a;MUX VLAN原理及实现方式&#xff1b;通过简答题出现。 考点二&#xff1a;配置命令填空。 一&…...

Git 用户名与邮箱配置全解析:精准配置——基于场景的参数选择

目录 一、配置查看&#xff1a;理解多层级配置体系二、精准配置&#xff1a;基于场景的参数选择1. 仓库级配置&#xff08;推荐&#xff09;2. 用户级配置3. 系统级配置 三、历史提交信息修改1. 修改最近一次提交2. 修改多个历史提交&#xff08;危险操作&#xff09; 五、配置…...

OpenHarmony平台驱动开发(十七),UART

OpenHarmony平台驱动开发&#xff08;十七&#xff09; UART 概述 功能简介 UART指异步收发传输器&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09;&#xff0c;是通用串行数据总线&#xff0c;用于异步通信。该总线双向通信&#xff0c;可以实现全双工…...

仿生眼机器人(人脸跟踪版)系列之一

文章不介绍具体参数&#xff0c;有需求可去网上搜索。 特别声明&#xff1a;不论年龄&#xff0c;不看学历。既然你对这个领域的东西感兴趣&#xff0c;就应该不断培养自己提出问题、思考问题、探索答案的能力。 提出问题&#xff1a;提出问题时&#xff0c;应说明是哪款产品&a…...

Redis的Pipeline和Lua脚本适用场景是什么?使用时需要注意什么?

Redis Pipeline 和 Lua 脚本详解 一、Pipeline&#xff08;管道&#xff09; 定义 一种批量执行命令的机制&#xff0c;客户端将多个命令一次性发送给服务器&#xff0c;减少网络往返时间&#xff08;RTT&#xff09; 适用场景 ✅ 批量数据操作&#xff08;如万级 key 的写入…...

【Pycharm】pycharm修改注释文字的颜色

一、默认颜色-灰色 这个默认的灰色视觉效果太弱&#xff0c;不便于学习时使用 二、修改颜色 打开Settings 也可以从右上角设置那里打开 还可以快捷键Ctrl&#xff0b;Alt&#xff0b;S打开 找到这个页面把这个√取消掉 然后就能自定义颜色啦...

webgl2着色语言

一、数据类型 标量&#xff1a;布尔型、整型、浮点型 向量&#xff1a;基本类型&#xff1a;bool、int、float 数量 &#xff1a; 2&#xff0c;3&#xff0c;4 矩阵&#xff1a; 移位、旋转、缩放等变换 采样器&#xff1a; 执行纹理采样的相关操作 结构体&#xff1a; 为开…...

Nginx+Lua 实战避坑:从模块加载失败到版本冲突的深度剖析

Nginx 集成 Lua (通常通过 ngx_http_lua_module 或 OpenResty) 为我们提供了在 Web 服务器层面实现动态逻辑的强大能力。然而,在享受其高性能和灵活性的同时,配置和使用过程中也常常会遇到各种令人头疼的问题。本文将结合实际案例,深入分析在 Nginx+Lua 环境中常见的技术问题…...

什么是alpaca 或 sharegpt 格式的数据集?

环境&#xff1a; LLaMA-Factory 问题描述&#xff1a; alpaca 或 sharegpt 格式的数据集&#xff1f; 解决方案&#xff1a; “Alpaca”和“ShareGPT”格式的数据集&#xff0c;是近年来在开源大语言模型微调和对话数据构建领域比较流行的两种格式。它们主要用于训练和微调…...

C++效率掌握之STL库:map set底层剖析及迭代器万字详解

文章目录 1.map、set的基本结构2.map、set模拟实现2.1 初步定义2.2 仿函数实现2.3 Find功能实现2.4 迭代器初步功能实现2.4.1 运算符重载2.4.2 --运算符重载2.4.3 *运算符重载2.4.4 ->运算符重载2.4.5 !运算符重载2.4.6 begin()2.4.7 end() 2.5 迭代器进阶功能实现2.5.1 set…...

使用 Docker Desktop 安装 Neo4j 知识图谱

一、简介 Neo4j是一个高性能的&#xff0c;基于java开发的&#xff0c;NOSQL图形数据库&#xff0c;它将结构化数据存储在网络上而不是表中&#xff1b;它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎。 Neo4j分为企业版和社区版&#xff0c;企业版可以创…...

从构想到交付:专业级软开发流程详解

目录 ​​一、软件开发生命周期&#xff08;SDLC&#xff09;标准化流程​​ 1. 需求工程阶段&#xff08;Requirement Engineering&#xff09; 2. 系统设计阶段&#xff08;System Design&#xff09; 3. 开发阶段&#xff08;Implementation&#xff09; 4. 测试阶段&a…...

时源芯微| KY键盘接口静电浪涌防护方案

KY键盘接口静电浪涌防护方案通过集成ESD保护元件、电阻和连接键&#xff0c;形成了一道有效的防护屏障。当键盘接口受到静电放电或其他浪涌冲击时&#xff0c;该方案能够迅速将过电压和过电流引导至地&#xff0c;从而保护后续电路免受损害。 ESD保护元件是方案中的核心部分&a…...

数据库故障排查指南:从理论到实践的深度解析

数据库作为现代信息系统的核心组件&#xff0c;承载着数据存储、查询和事务处理等关键任务。然而&#xff0c;数据库系统在运行过程中可能遭遇各种故障&#xff0c;从硬件故障到软件配置问题&#xff0c;从性能瓶颈到安全漏洞&#xff0c;这些问题都可能影响业务的连续性和数据…...

电脑开机提示按f1原因分析及解决方法(6种解决方法)

经常有网友问到一个问题,我电脑开机后提示按f1怎么解决?不管理是台式电脑,还是笔记本,都有可能会遇到开机需要按F1,才能进入系统的问题,引起这个问题的原因比较多,今天小编在这里给大家列举了比较常见的几种电脑开机提示按f1的解决方法。 电脑开机提示按f1原因分析及解决…...

常用的Java工具库

1. Collections 首先是 java.util 包下的 Collections 类。这个类主要用于操作集合&#xff0c;我个人非常喜欢使用它。以下是一些常用功能&#xff1a; 1.1 排序 在工作中&#xff0c;经常需要对集合进行排序。让我们看看如何使用 Collections 工具实现升序和降序排列&…...

NC65开发环境(eclipse启动)在企业报表中的报表数据中心里计算某张报表时,一直计算不出数据的解决办法。

NC65开发环境&#xff08;eclipse启动&#xff09;在企业报表中的报表数据中心里计算某张报表时&#xff0c;一直计算不出数据的解决办法。 如下图&#xff0c;在报表数据中心&#xff0c;针对现金内部往来明细表计算5月的数据&#xff0c;然后报表下面一张显示计算&#xff0c…...

React 第三十九节 React Router 中的 unstable_usePrompt Hook的详细用法及案例

React Router 中的 unstable_usePrompt 是一个用于在用户尝试离开当前页面时触发确认提示的自定义钩子&#xff0c;常用于防止用户误操作导致数据丢失&#xff08;例如未保存的表单&#xff09;。 一、unstable_usePrompt用途 防止意外离开页面&#xff1a;当用户在当前页面有…...

《P4391 [BalticOI 2009] Radio Transmission 无线传输 题解》

题目描述 给你一个字符串 s1​&#xff0c;它是由某个字符串 s2​ 不断自我连接形成的&#xff08;保证至少重复 2 次&#xff09;。但是字符串 s2​ 是不确定的&#xff0c;现在只想知道它的最短长度是多少。 输入格式 第一行一个整数 L&#xff0c;表示给出字符串的长度。…...

使用ECS搭建云上博客wordpress(ALMP)

一、需求分析与技术选型 1. 架构组成及含义 本文使用ECS云服务器&#xff0c;采用ALMP架构搭建wordpress。组件具体的含义如下表&#xff1a; 组件作用WordPress中的功能体现Linux操作系统基础&#xff0c;提供稳定运行环境支持PHP运行和服务器管理ApacheWeb服务器&#xff…...

Scratch游戏 | 企鹅大乱斗

有没有过无聊到抓狂的时刻&#xff1f;试试这款 企鹅大乱斗 吧&#xff01;超简单的玩法&#xff0c;让你瞬间告别无聊&#xff01; &#x1f3ae; 玩法超简单 等待屏幕出现 ”Go!” 疯狂点击&#xff0c;疯狂拍打企鹅&#xff01; &#x1f4a5; 游戏特色 解压神器&#x…...

深入理解SpringBoot中的SpringCache缓存技术

深入理解SpringBoot中的SpringCache缓存技术 引言 在现代应用开发中&#xff0c;缓存技术是提升系统性能的重要手段之一。SpringBoot提供了SpringCache作为缓存抽象层&#xff0c;简化了缓存的使用和管理。本文将深入探讨SpringCache的核心技术点及其在实际业务中的应用场景。…...

URP相机如何将场景渲染定帧模糊绘制

1&#xff09;URP相机如何将场景渲染定帧模糊绘制 2&#xff09;为什么Virtual Machine会随着游戏时间变大 3&#xff09;出海项目&#xff0c;打包时需要勾选ARMv7吗 4&#xff09;Unity是手动还是自动调用GC.Collect 这是第431篇UWA技术知识分享的推送&#xff0c;精选了UWA社…...

嵌入式中深入理解C语言中的指针:类型、区别及应用

在嵌入式开发中,C语言是一种基础且极为重要的编程语言,其中指针作为一个非常强大且灵活的工具,广泛应用于内存管理、动态数据结构的实现以及函数参数的传递等方面。然而,尽管指针的使用极为常见,很多开发者在掌握其基本使用后,往往对指针的深入理解还不够。本文将深入分析…...

.NET程序启动就报错,如何截获初期化时的问题json

一&#xff1a;背景 1. 讲故事 前几天训练营里的一位朋友在复习课件的时候&#xff0c;程序一跑就报错&#xff0c;截图如下&#xff1a; 从给出的错误信息看大概是因为json格式无效导致的&#xff0c;在早期的训练营里曾经也有一例这样的报错&#xff0c;最后定位下来是公司…...

WeakAuras Lua Script ICC (BarneyICC)

WeakAuras Lua Script ICC &#xff08;BarneyICC&#xff09; https://wago.io/BarneyICC/69 全量英文字符串&#xff1a; !WA:2!S33c4TXX5bQv0kobjnnMowYw2YAnDKmPnjnb4ljzl7sqcscl(YaG6HvCbxaSG7AcU76Dxis6uLlHNBIAtBtRCVM00Rnj8Y1M426ZH9XDxstsRDR)UMVCTt0DTzVhTjNASIDAU…...

Sunsetting 创建 React App

&#x1f916; 作者简介&#xff1a;水煮白菜王&#xff0c;一位前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 前端专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧和知识归纳总结✍。 感谢支持&#x1f495;&#x1f495;&#…...

Python笔记:c++内嵌python,c++主窗口如何传递给脚本中的QDialog,使用的是pybind11

1. 问题描述 用的是python 3.8.20, qt版本使用的是5.15.2, PySide的版本是5.15.2, pybind11的版本为2.13.6 网上说在python脚本中直接用PySide2自带的QWinWidget&#xff0c;如from PySide2.QtWinExtras import QWinWidget&#xff0c;但我用的版本中说没有QWinWidget&#x…...

环境配置与MySQL简介

目录 1 环境配置 2 MySQL简介 1 环境配置 本专栏使用CentOS7进行讲解。首先我们查看系统中是否已经安装了MySQL&#xff0c;可以使用rpm -qa 命令查看系统安装包/压缩包 列表 这只是看我们是否下载过对应安装包&#xff0c;不一定就安装了。如果我们需要重新下载&#xff0c;…...

Unity3D游戏内存管理优化指南

前言 Unity3D 的内存管理机制较为复杂&#xff0c;开发者需要理解其内存分布以避免内存泄漏和性能问题。以下是 Unity3D 游戏内存分布的核心概览&#xff0c;结合托管堆、本地堆、资源内存等关键模块&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;大家…...

深度解析 Sora:从技术原理到多场景实战的 AI 视频生成指南【附学习资料包下载】

一、技术架构与核心能力解析 1.1 时空建模体系的创新突破 Sora 在视频生成领域的核心优势源于其独特的时空建模架构。区别于传统将视频拆解为单帧处理的模式,Sora 采用时空 Patch 嵌入技术,将连续视频序列分割为 32x32 像素的时空块(每个块包含相邻 3 帧画面),通过线性投…...