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

Linux - 基础开发工具(yum、vim、gcc、g++、make/Makefile、git)

目录

Linux软件包管理器 - yum

  Linux下安装软件的方式

  认识yum

  查找软件包

  安装软件

  如何实现本地机器和云服务器之间的文件互传

  卸载软件

Linux编辑器 - vim

  vim的基本概念

  vim下各模式的切换

  vim命令模式各命令汇总

  vim底行模式各命令汇总

  vim的简单配置

Linux编译器 - gcc/g++

  gcc/g++的作用

  gcc/g++语法

  预处理

  编译

  汇编

  链接

  静态库与动态库

Linux项目自动化构建工具 - make/Makefile

  make/Makefile的重要性

  依赖关系和依赖方法

  多文件编译

  make原理

  项目清理

Linux第一个小程序 - 进度条

  行缓冲区的概念

  \r和\n

  进度条代码

Gitee上传代码


Linux软件包管理器 - yum

  Linux下安装软件的方式

在 Linux 系统中,安装软件的方法主要有以下三种:

  1. 编译源代码:从网络上下载软件的源代码,然后自行编译生成可执行程序。这种方式适合高级用户,可以根据需要进行深度定制。

  2. 使用 rpm 包:获取 rpm 安装包,然后通过 rpm 命令进行安装。这种方法不解决软件的依赖关系,适合安装单个独立的软件包。

  3. 使用 yum 包管理器:通过 yum 命令进行软件安装。这是最常用的方法之一,因为它会自动处理软件的依赖关系,简化了安装过程。

  认识yum

        yum 是 Fedora、RedHat 和 CentOS 系统中的前端软件包管理器。它可以自动从指定的服务器下载并安装 rpm 包,自动处理依赖关系,并一次性安装所有必需的软件包,省去了手动逐个下载和安装的繁琐过程。

注意:一个服务器同一时刻只允许一个yum进行安装,不能在同一时刻同时安装多个软件。 

        因为yum是从服务器上下载RPM包,所以在下载时必须联网,可以通过ping指令判断当前云服务器是否联网。

  查找软件包

        通过 yum list 命令可以罗列出当前一共有哪些软件包. 由于包的数目可能非常之多, 这里我们需要使用 grep 命令只筛选出我们关注的包. 例如:

yum list | grep lrzsz

        结果如下:

lrzsz.x86_64 0.12.20-36.el7 @base

说明:
1)软件包名称:主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构。
2)"x86_64"后缀表示64位系统的安装包,"i686"后缀表示32位系统安装包,选择包时要和系统匹配。
3)"el7"表示操作系统发行版的版本,“el7"表示的是"centos7/redhat7”,“el6"表示"centos6/redhat6”。
4)最后一列表示的是“软件源”的名称,类似于“小米应用商店”,“华为应用商店”这样的概念。

  安装软件

指令: sudo yum install 软件名

sudo yum install lrzsz

        yum会自动找到都有哪些软件包需要下载,这时候敲“y”确认安装,当出现“complete”字样时,说明安装完成。 

注意事项:
1)安装软件时由于需要向系统目录中写入内容,一般需要sudo或者切换到root账户下才能完成。
2)yum安装软件只能一个装完了再装另一个,正在使用yum安装一个软件的过程中,如果再尝试用yum安装另外一个软件,yum会报错。 

  如何实现本地机器和云服务器之间的文件互传

        既然已经安装了lrzsz,这里就顺便说一下lrzsz如何使用。

指令: rz -E
        通过该指令可选择需要从本地机器上传到云服务器的文件。

指令: sz 文件名
        该指令可将云服务器上的文件下载到本地机器的指定文件夹。

  卸载软件

指令: sudo yum remove 软件名

        yum会自动卸载该软件,这时候敲“y”确认卸载,当出现“complete”字样时,说明卸载完成。

Linux编辑器 - vim

  vim的基本概念

        Vim是一个功能强大的文本编辑器,特别适用于编写和编辑代码。

它的核心概念包括几种主要模式:

  • 命令模式 (Normal mode):

        在命令模式下,键盘输入的大多数按键会被解释为命令,而不是输入字符。这时候,你可以移动光标、复制粘贴文本、删除字符或行、查找替换等操作。常用的移动命令包括 h (左)、j (下)、k (上)、l (右),以及 w (下一个单词)、b (前一个单词) 等。

  • 插入模式 (Insert mode):

        在插入模式下,Vim类似于普通文本编辑器,你可以直接输入并编辑文本。进入插入模式的常见方法是按下 i 键(在光标当前位置插入)、a 键(在光标后插入)、o 键(在当前行下插入新行并进入插入模式)等。

  • 底行模式 (Command-line mode):

        底行模式允许你执行一些底层命令,如保存文件、退出编辑器、执行查找替换等操作。你可以通过按下 : 进入底行模式,然后输入相应的命令来执行操作。例如,:w 保存文件、:q 退出、:wq 保存并退出等。

  vim下各模式的切换

指令: vim 文件名

russleo@virtual-machine:~/russleo$ vim test.c

        进入vim后默认为命令模式(普通模式),要输入文字需切换到插入模式。 

从命令模式切换至插入模式

  • 按下 i:在当前光标处进入插入模式,可以直接输入文本。
  • 按下 a:在当前光标的后一位置进入插入模式,方便在已有文本后添加内容。
  • 按下 o:在当前光标所在行的下方新起一行,并进入插入模式,适合在当前行下方插入新内容。

从命令模式切换至底行模式

  • 输入 Shift+;(实际上就是输入 :),进入底行模式,可以执行保存、退出等命令。

从插入模式或底行模式切换至命令模式

  • 按下 Esc 键,即可从插入模式或底行模式返回到命令模式,这样你可以继续使用移动、删除、复制等命令操作文本。

        这些快捷键和操作方法是Vim中使用频率非常高的基础操作,熟练掌握它们能够极大提升编辑效率和流畅度。 

  vim命令模式各命令汇总

移动光标

  1. k:光标向上移动。
  2. j:光标向下移动。
  3. h:光标向左移动。
  4. l:光标向右移动。
  5. $(Shift+4):移动到光标所在行的行尾。
  6. ^(Shift+6):移动到光标所在行的行首。
  7. gg:移动到文本的开头。
  8. G(Shift+g):移动到文本的末尾。
  9. nG:移动到第n行的行首。
  10. n<Enter>:光标向下移动n行。
  11. w:跳到下一个单词的开头。
  12. e:跳到当前或下一个单词的结尾。
  13. b:跳到前一个单词的开头。

删除

  1. x:删除光标所在位置的字符。
  2. nx:删除光标后n个字符。
  3. X:删除光标前的一个字符。
  4. nX:删除光标前n个字符。
  5. dd:删除光标所在行。
  6. ndd:删除从光标开始的n行。

复制粘贴

  1. yy:复制光标所在行到缓冲区。
  2. nyy:复制光标开始的n行到缓冲区。
  3. yw:复制从光标到当前单词结尾的字符到缓冲区。
  4. nyw:复制光标后的n个单词到缓冲区。
  5. p:粘贴缓冲区的内容在光标的下一行。
  6. np:粘贴缓冲区的内容在光标的下一行n次。

剪切

  1. dd:剪切光标所在行。
  2. ndd:剪切从光标开始的n行。
  3. p:粘贴剪切的内容在光标的下一行。
  4. np:粘贴剪切的内容在光标的下一行n次。

撤销和恢复

  1. u:撤销最后的操作。
  2. Ctrl+r:恢复上一步撤销的操作。

大小写切换

  1. ~(Shift+`):切换光标所在位置字符的大小写。
  2. n~:切换光标后n个字符的大小写。

替换

  1. r:替换光标所在位置的字符。
  2. R:替换从光标位置开始的字符,直到按下 Esc 键。

更改

  1. cw:删除从光标到当前单词结尾的字符,并进入插入模式。
  2. cnw:删除光标后的n个单词,并进入插入模式。

翻页

  1. Ctrl+b:向上翻一页。
  2. Ctrl+f:向下翻一页。
  3. Ctrl+u:向上翻半页。
  4. Ctrl+d:向下翻半页。

  vim底行模式各命令汇总

        在使用底行模式之前,记住先按「Esc」键确定你已经处于命令模式,再按「:」即可进入底行模式。

行号设置

  1. set nu:显示行号。
  2. set nonu:取消显示行号。

保存退出

  1. w:保存文件。
  2. q:退出 Vim。如果有未保存的修改,会提示保存或放弃修改。
  3. q!:强制退出 Vim,丢弃所有修改。
  4. wq:保存并退出 Vim。

分屏指令

  1. vs 文件名:在垂直方向上分屏打开指定文件。
  2. Ctrl+w w:在多个分屏之间切换光标焦点。

执行指令

  1. !指令:在不退出 Vim 的情况下执行 Linux 指令。例如,可以使用 :!ls 查看当前目录的内容,或者 :!make 编译当前代码。

  vim的简单配置

关于Vim配置文件的位置和作用范围如下:

  1. 系统级配置文件:位于 /etc/vimrc,这是系统中公共的配置文件,对所有用户都有效。系统管理员可以在这里设置全局的 Vim 配置选项,影响所有用户的 Vim 使用体验。

  2. 用户级配置文件:位于每个用户的主目录下,路径为 ~/.vimrc。例如,用户 xxx 的私有配置文件路径为 /home/xxx/.vimrc。这是用户私有的配置文件,只对该用户有效。用户可以在这里设置个性化的 Vim 配置选项,如显示行号、设置键盘映射、定义命令别名等。

        vim的配置比较复杂,某些vim配置还需要使用插件,建议不要自己一个个去配置。比较简单的方法是直接执行以下指令(想在哪个用户下让vim配置生效,就在哪个用户下执行该指令,不推荐直接在root下执行):

        在CSDN上有很多关于vim配置的文章,配置完成后,像什么自动补全、行号显示以及自动缩进什么的就都有了。 

Linux编译器 - gcc/g++

  gcc/g++的作用

        gcc和g++分别是GNU的C和C++的编译器。

gcc和g++在执行编译的时候一般有以下四个步骤

  1. 预处理阶段:这是编译过程的第一步,预处理器负责展开所有的头文件,移除注释,进行宏定义的替换,并根据预处理指令(如#ifdef#ifndef等)执行条件编译。这一阶段,源代码被调整为更适于编译的形式。

  2. 编译阶段:在预处理完成后,编译器开始工作,将经过预处理的C或C++代码翻译成汇编语言。这一过程涉及到语法分析、语义分析以及优化等复杂操作,确保生成的汇编代码既符合规范又高效。

  3. 汇编阶段:接下来,汇编器接手,将上一步生成的汇编语言代码转换成机器能理解的二进制目标代码。这些目标代码文件通常以.o.obj为扩展名,它们是下一步链接过程的基本单位。

  4. 链接阶段:最后,链接器将所有相关的二进制目标代码文件连接在一起,解决外部引用,生成最终的可执行程序或库文件。这一过程中,链接器还会处理静态库和动态库的链接,确保程序运行时能够访问到所需的全部资源。

  gcc/g++语法

语法: gcc/g++ 选项 文件
常用选项:

  1. -E:当使用这个选项时,GCC/G++仅执行预处理阶段,并输出预处理后的源代码。通常用于检查预处理的结果。

  2. -S:使用这个选项时,GCC/G++会执行预处理和编译阶段,但不会进行汇编和链接。结果是一个汇编语言文件。

  3. -c:这个选项告诉编译器仅编译到目标代码(.o文件),而不进行链接。

  4. -o:这个选项允许你指定输出文件的名字。例如,gcc main.c -o myprogram 将编译 main.c 并将可执行文件命名为 myprogram

  5. -static:使用这个选项时,GCC/G++会尝试使用静态库进行链接,而不是共享库。这会导致生成的可执行文件较大,但可能在没有安装相应共享库的系统上仍能运行。

  6. -g:这个选项要求编译器生成调试信息,使得生成的可执行文件可以用调试器如 GDB 来调试。

  7. -shared:当创建动态链接库(.so 文件)时,需要使用此选项。它告诉编译器生成一个共享对象。

  8. -w:这个选项抑制所有的警告信息。

  9. -Wall:相反于 -w-Wall 开启尽可能多的警告信息,帮助开发者发现潜在的问题。

  10. -O0, -O1, -O2, -O3:这些选项控制编译器的优化等级。-O0 表示不进行优化,而 -O3 是最高等级的优化,可以显著提高程序的运行速度,但可能会导致生成的代码更难理解(对于人类而言)。

  预处理

russleo@VM-0-2-ubuntu:~/test$ gcc -E test.c -o test.i

  • 预处理功能主要包括头文件展开、去注释、宏替换、条件编译等。
  • 预处理指令是以#开头的代码行。
  • -E选项的作用是让gcc/g++在预处理结束后停止编译过程。
  • -o选项是指目标文件,“xxx.i”文件为已经过预处理的原始程序。

  编译

russleo@VM-0-2-ubuntu:~/test$ gcc -S test.i -o test.s

  • 在这个阶段中,gcc/g++首先检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,将代码翻译成汇编语言。
  • 用户可以使用-S选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
  • -o选项是指目标文件,“xxx.s”文件为已经过翻译的原始程序。

  汇编

russleo@VM-0-2-ubuntu:~/test$ gcc -c test.s -o test.o

  • 汇编阶段是把编译阶段生成的“xxx.s”文件转成目标文件。
  • 使用-c选项就可以得到汇编代码转化为“xxx.o”的二进制目标代码了。

  链接

russleo@VM-0-2-ubuntu:~/test$ gcc test.o -o test

  • 在成功完成以上步骤之后,就进入了链接阶段。
  • 链接的主要任务就是将生成的各个“xxx.o”文件进行链接,生成可执行文件。
  • gcc/g++不带-E、-S、-c选项时,就默认生成预处理、编译、汇编、链接全过程后的文件。
  • 若不用-o选项指定生成文件的文件名,则默认生成的可执行文件名为a.out

  静态库与动态库

函数库一般分为静态库和动态库两种:

  • 静态库是指编译链接时,把库文件的代码全部加入到可执行文件当中,因此生成的文件比较大,但在运行时也就不再需要库文件了,静态库一般以.a为后缀。
  • 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件当中,而是在程序运行时由链接文件加载库,这样可以节省系统的开销,动态库一般以.so为后缀。

动态链接:
 优点:省空间(磁盘的空间,内存的空间),bin体积小,加载速度快。
 缺点:依赖动态库,程序可移植性较差。
静态链接:
 优点:不依赖第三方库,程序的可移植性较高。
 缺点:浪费空间。 

gcc和g++默认生成的二进制程序是动态链接的,我们可以使用file指令进行查看。

其次,我们还可以使用ldd指令查看动态链接的可执行文件所依赖的库。

虽然gcc和g++默认采用的是动态链接,但如果我们需要使用静态链接,带上-static选项即可。

russleo@VM-0-2-ubuntu:~/test$ gcc test.c -o test_s -static

此时生成的可执行文件就是静态链接的了。 

        我们可以查看源代码相同,但链接方式不同而生成的两个可执行程序test和test_s的大小。这也证明了动态链接比较节省空间,而静态链接比较浪费空间。

Linux项目自动化构建工具 - make/Makefile

  make/Makefile的重要性

        撰写Makefile的能力对于大型软件工程的管理至关重要,它不仅反映了一个开发者对项目结构和构建流程的理解深度,还体现了其能否高效地处理复杂工程的能力。在大型项目中,源代码文件数量庞大,根据类型、功能或模块被精心组织在不同的目录下。此时,Makefile就像一个指挥家,通过预定义的规则,有序地安排文件的编译顺序,甚至执行更为复杂的任务,如依赖性管理、资源清理等。

        Makefile的核心优势在于实现“自动化编译”。一旦正确配置,只需简单输入make命令,整个工程就能自动完成编译,显著提升了开发效率,减少了人为错误,使得软件构建过程更加稳定可靠。此外,make作为解释Makefile指令的工具,已广泛集成到各种集成开发环境(IDE)中,如Delphi的make,Visual C++的nmake,以及Linux下GNU的make,这表明Makefile已经成为跨平台项目构建的标准实践。

        总之,Makefile与make命令的结合,为软件工程提供了一种标准化、自动化的构建方案,是现代软件开发中不可或缺的一部分。掌握Makefile的编写,意味着能够更好地管理和优化大型项目的构建流程,提高团队的开发效率。

注意:make是一条命令,Makefile是一个文件

  依赖关系和依赖方法

在使用make/Makefile前我们首先应该理解各个文件之间的依赖关系以及它们之间的依赖方法。

依赖关系: 文件A的变更会影响到文件B,那么就称文件B依赖于文件A。

        例如,test.o文件是由test.c文件通过预处理、编译以及汇编之后生成的文件,所以test.c文件的改变会影响test.o,所以说test.o文件依赖于test.c文件。

依赖方法: 如果文件B依赖于文件A,那么通过文件A得到文件B的方法,就是文件B依赖于文件A的依赖方法。

        例如,test.o依赖于test.c,而test.c通过gcc -c test.c -o
test.o指令就可以得到test.o,那么test.o依赖于test.c的依赖方法就是gcc -c test.c -o test.o。

  多文件编译

        在处理包含多个源文件的工程项目时,采用多步骤的编译策略可以显著提升开发效率和构建速度。直接使用gcc命令一次性编译所有源文件虽然可行,但在源代码频繁变更的情况下,这种做法会导致不必要的重复工作,因为哪怕只是单个源文件发生改动,也需要重新编译整个项目。

        相比之下,先将每个源文件独立编译成目标文件(通常为.o格式的二进制文件),再将这些目标文件链接生成最终的可执行程序,是一种更为高效的做法。这种方式的好处在于,当你修改了某个源文件后,只需要重新编译那个特定的源文件,生成新的目标文件,然后与其它未改动的目标文件一起进行链接,从而生成更新后的可执行程序。这样既节省了时间,又避免了资源的浪费。

首先,针对每个源文件,使用gcc命令进行编译,生成相应的目标文件。例如:

gcc -c file1.c -o file1.o
gcc -c file2.c -o file2.o

 然后,将所有生成的目标文件链接起来,创建可执行程序:

gcc file1.o file2.o -o executable

        需要注意的是,在编译阶段,无需显式指定头文件路径。编译器会根据源文件中的#include指令自动查找所需的头文件。如果头文件使用的是标准库,通常使用尖括号<>包含;如果是项目内部的自定义头文件,则使用双引号""包含。编译器会依据不同的包含方式,从系统库路径或当前项目路径查找对应的头文件。 

        但是随着源文件个数的增加,我们每次重新生成可执行程序时,所需输入的gcc指令的长度与个数也会随之增加。这时我们就需要使用makeMakefile了,这将大大减少我们的工作量。

        步骤1: 在源文件所在目录下创建一个名为Makefile/makefile的文件。

        步骤2: 编写Makefile文件。

        Makefile文件最简单的编写格式是,先写出文件的依赖关系,然后写出这些文件之间的依赖方法,依次写下去。

        编写完毕Makefile文件后保存退出,然后在命令行当中执行make指令便可以生成可执行程序,以及该过程产生的中间产物。

Makefile文件的简写方式:

  1. $@:表示依赖关系中的目标文件(冒号左侧)。
  2. $^:表示依赖关系中的依赖文件列表(冒号右侧全部)。
  3. $<:表示依赖关系中的第一个依赖文件(冒号右侧第一个)。

例如以上Makefile文件可以简写为:

 

        说明: gcc/g++携带-c选项时,若不指定输出文件的文件名,则默认输出文件名为xxx.o,所以这里也可以不用指定输出文件名。 

  make原理

  1. make会在当前目录下找名字为“Makefile”或“makefile”的文件。
  2. 如果找到,它会找文件当中的第一个目标文件,在上面的例子中,它会找到mytest这个文件,并把这个文件作为最终的目标文件。
  3. 如果mytest文件不存在,或是mytest所依赖的后面的test.o文件和main.o文件的文件修改时间比mytest文件新,那么它就会执行后面的依赖方法来生成mytest文件。
  4. 如果mytest所依赖的test.o文件不存在,那么make会在Makefile文件中寻找目标为test.o文件的依赖关系,如果找到则再根据其依赖方法生成test.o文件(类似于堆栈的过程)。
  5. 当然,你的test.c文件和main.c文件是存在的,于是make会生成test.o文件和main.o文件,然后再用test.o文件和main.o文件生成最终的mytest文件。
  6. make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
  7. 在寻找的过程中,如果出现错误,例如最后被依赖的文件找不到,那么make就会直接退出,并报错。

  项目清理

        在我们每次重新生成可执行程序前,都应该将上一次生成可执行程序时生成的一系列文件进行清理,但是如果我们每次都手动执行一系列指令进行清理工作的话,未免有些麻烦,因为每次清理时执行的都是相同的清理指令,这时我们可以将项目清理的指令也加入到Makefile文件当中。

        即命令——“make clean”,以此来清除所有的目标文件,以便重编译。 

Linux第一个小程序 - 进度条

  行缓冲区的概念

        首先,我们来感受一下行缓冲区的存在,在Linux当中以下代码的运行结果是什么样的?

        对于此代码,大家应该都没问题,当然是先输出字符串hello world然后休眠3秒之后结束运行。那么对于以下代码呢?

        可以看到代码中仅仅删除了字符串后面的’\n’,那么代码的运行结果还与之前相同吗?答案否定的,该代码的运行结果是:先休眠3秒,然后打印字符串hello world之后结束运行。该现象就证明了行缓冲区的存在。

        显示器对应的是行刷新,即当缓冲区当中遇到’\n’或是缓冲区被写满才会被打印出来,而在第二份代码当中并没有’\n’,所以字符串hello world先被写到缓冲区当中去了,然后休眠3秒后,直到程序运行结束时才将hello world打印到显示器当中。

  \r和\n

        \r: 回车,使光标回到本行行首。
        \n: 换行,使光标下移一格。

        既然是\r是使光标回到本行行首,那么如果我们向显示器上写了一个数之后再让光标回到本行行首,然后再写一个数,不就相当于将前面一个数字覆盖了吗?

        但这里有一个问题:不使用’\n’进行换行怎么将缓冲区当中数据打印出来?

        这里我们可以使用fflush函数,该函数可以刷新缓冲区,即将缓冲区当中的数据刷新当显示器当中。
        对此我们可以编写一个倒计时的程序。

  进度条代码

Makefile:

processbar.h:

processbar.c:

main.c:

代码效果:

Gitee上传代码

        首先我们需要在gitee上注册一个仓库,再将我们的仓库克隆到Linux系统中,如下图所示

        在Linux系统上安装git工具 

russleo@VM-0-2-ubuntu:~$ sudo apt install -y git

         再将需要上传的目录复制到仓库目录下

        再依次进行add, commit -m ,push操作

        如果没有显示错误信息,我们就可以在gitee网站上看到我们所上传的文件及目录。 

相关文章:

Linux - 基础开发工具(yum、vim、gcc、g++、make/Makefile、git)

目录 Linux软件包管理器 - yum Linux下安装软件的方式 认识yum 查找软件包 安装软件 如何实现本地机器和云服务器之间的文件互传 卸载软件 Linux编辑器 - vim vim的基本概念 vim下各模式的切换 vim命令模式各命令汇总 vim底行模式各命令汇总 vim的简单配置 Linux编译器 - gc…...

网络安全法律框架更新:最新合规要求与企业应对策略

网络安全法律框架的最新更新 近期&#xff0c;中国的网络安全法律框架经历了重要的更新。2022年&#xff0c;《网络安全法》迎来了首次修改&#xff0c;这一修订主要是为了与《数据安全法》和《个人信息保护法》等新实施的法律进行衔接协调&#xff0c;完善法律责任制度&#x…...

数仓工具—Hive语法之正则表达式函数

正则表达式函数 之前我们介绍过like rlike regexp 这些关键字,都是和匹配有关的,今天我们介绍一下hive 的REGEXP_REPLACE 和REGEXP_EXTRACT 函数,背景是使用Hive正则表达式函数提取数字 在我的其他文章中,我们已经看到了如何使用Hive正则表达式从字符串中提取日期值。正则…...

WKCTF 2024 easy_heap

很经典的house of orange unsortedbin attack FSOP 变量覆盖 不能 free&#xff0c;那首先想到就是 house of orange泄露Libc基址&#xff0c;然后unsortedbin attack。 但是只能show(8)&#xff0c;就不能用largebin的套路来泄露堆地址了&#xff0c;那怎么办呢&#xff1f; …...

SQL 多变关联使用子查询去重

不去重状态 select a.*,b.recon_amt from free_settlement_first aleft join free_settlement_second b on a.settlement_first_id b.settlement_first_id 有2条数据出现了重复 使用子查询去重 select a.*,b.recon_amt from free_settlement_first aleft join free_settlem…...

php表单提交并自动发送邮件给某个邮箱(示例源码下载)

只需要将以下代码内容进行复制即可用到自己的程序/API接口中&#xff1a; <?php if(!empty($_POST[is_post]) && $_POST[is_post]1){$url "https://www.aoksend.com/index/api/send_email";$name $_POST[name];$email $_POST[email];$subject $_POS…...

论文翻译:Large Language Models for Education: A Survey

目录 大型语言模型在教育领域的应用&#xff1a;一项综述摘要1 引言2. 教育中的LLM特征2.1. LLMs的特征2.2 教育的特征2.2.1 教育发展过程 低进入门槛。2.2.2. 对教师的影响2.2.3 教育挑战 2.3 LLMEdu的特征2.3.1 "LLMs 教育"的具体体现2.3.2 "LLMs 教育"…...

7.13实训日志

上午 学习网络安全的过程中&#xff0c;我们深入了解了网络的不同层面和技术&#xff0c;从表层网络到深网再到暗网&#xff0c;以及涉及的产业分类和技术工具。这些知识不仅帮助我们理解网络的复杂性&#xff0c;还揭示了如何应对和防范各种网络威胁。 首先&#xff0c;我们…...

【力扣】每日一题—第70题,爬楼梯

题目&#xff1a; 假设你正在爬楼梯。需要n阶你才能到达楼顶。 每次你可以爬1或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 思路&#xff1a; 我开始是写了一个函数计算爬一层和爬二层的个数&#xff0c;之后排列求和&#xff0c;但是超范围了&#xff0c…...

Docker修改国内镜像源

如果docker已将安装好 参考&#xff1a;https://github.com/cmliu/CF-Workers-docker.io sudo mkdir -p /etc/dockercd /etc/dockersudo vim daemon.json #输入以下内容 { "registry-mirrors": ["https://docker.fxxk.dedyn.io"] } #重启docker服务 su…...

安防监控视频平台LntonCVS视频融合共享平台智慧消防实现远程集中视频监控方案

近年来&#xff0c;电力系统内变电站着火事件频发&#xff0c;这对消防安全管理提出了严峻挑战。我国消防安全基础设施不完善、管理机制不健全、应急处置能力不足及公众消防安全意识淡薄等问题&#xff0c;严重制约了消防安全的提升。因此&#xff0c;加强变电站的消防安全管理…...

【大模型LLM面试合集】大语言模型架构_layer_normalization

2.layer_normalization 1.Normalization 1.1 Batch Norm 为什么要进行BN呢&#xff1f; 在深度神经网络训练的过程中&#xff0c;通常以输入网络的每一个mini-batch进行训练&#xff0c;这样每个batch具有不同的分布&#xff0c;使模型训练起来特别困难。Internal Covariat…...

OpenGL笔记八之EBO和EBO绘制流程

OpenGL笔记八之EBO和EBO绘制流程 —— 2024-07-07 晚上 bilibili赵新政老师的教程看后笔记 code review! 文章目录 OpenGL笔记八之EBO和EBO绘制流程1.EBO2.glDrawElements&#xff1a;如果使用了ebo&#xff0c;最后一个参数可以写03.glDrawElements&#xff1a;如果使用了e…...

maven——(重要)手动创建,构建项目

创建项目 手动按照maven层级建好文件夹&#xff0c;并写上java&#xff0c;测试代码和pom文件 构建项目 在dos窗口中执行如下命令 compile编译 当前maven仓库中什么都没有。 在pom所在层级下&#xff0c;执行&#xff1a; mvn compile 就开始显示下面这些&#xff0c;…...

数学建模·非线性规划

整型规划 适用于一个变量或多个变量的值只能是整型的情况 整形规划的分类 0-1背包问题 对于一个物品来说&#xff0c;只有选和不选两种情况 表现为单下标&#xff0c;单变量问题 例&#xff1a;建设学校问题 对于每个学校来说只有选和不选两种情况&#xff0c;在数学上我们用…...

SpringCloud第三篇(服务中心与OpenFeign)

p 文章目录 一、服务中心二、Nacos注册中心 一、服务中心 在上一章我们实现了微服务拆分&#xff0c;并且通过Http请求实现了跨微服务的远程调用。不过这种手动发送Http请求的方式存在一些问题。 试想一下&#xff0c;假如商品微服务被调用较多&#xff0c;为了应对更高的并发…...

Linux重要知识点

1. 命令行操作 Linux大多数操作都是通过命令行进行的。熟悉常用命令和脚本是使用Linux的基础。 基本命令&#xff1a;如 ls, cd, cp, mv, rm&#xff0c;这些命令用于文件和目录的管理。文件权限和管理&#xff1a;了解如何使用 chmod, chown, chgrp 等命令来管理文件权限和所…...

Unity宏和编辑器

宏&#xff1a;UNITY_EDITOR 等等 编辑器&#xff1a;Unity未运行时的状态 如何使用&#xff1a;#if UNITY_EDITOR 代码 #endif 什么情况下使用&#xff1a;包裹那些想要在编辑器模式下使用的代码 而在Unity运行时不会去调用的代码 AssetDatabase.LoadAssetAtPath&#xff08;路…...

计算机网络——网络层(概念及IP地址划分)

目录 网络层概念 网络层向上层提供的两种服务 虚电路 网络提供数据报服务 虚电路服务与数据报服务的对比 网络层的两个层面 分组传送到路由器的运作 对网络层进行分层 网际协议IP 虚拟互联网络 IP地址 IP地址及其表示方法 IP地址的计算方式 IP地址的结构 …...

【JVM实战篇】内存调优:内存泄露危害+内存监控工具介绍+内存泄露原因介绍

文章目录 内存调优内存溢出和内存泄漏内存泄露带来什么问题内存泄露案例演示内存泄漏的常见场景场景一场景二 解决内存溢出的方法常用内存监控工具Top命令优缺点 VisualVM软件、插件优缺点监控本地Java进程监控服务器的Java进程&#xff08;生产环境不推荐使用&#xff09; Art…...

CVE漏洞爬虫脚本

前言&#xff1a;前阵子公司非要把CVE漏洞信息拉倒本地&#xff0c;说方便安全员们查看&#xff0c;其实在莫慌看来&#xff0c;大可不必&#xff0c;90%的CVE漏洞其实不具备现实利用的可能性的&#xff08;不代表不能被利用&#xff09;&#xff0c;但是你说它没有意义也是不对…...

如何搭建互联网医院系统源码?医疗陪诊APP开发实战详解

今天&#xff0c;小编将为大家讲解如何搭建一个完整的互联网医院系统源码&#xff0c;并介绍医疗陪诊APP的开发实战。 一、互联网医院系统的架构设计 搭建一个完整的互联网医院系统&#xff0c;需要从架构设计开始。一个典型的互联网医院系统通常包含以下几个核心模块&#xf…...

高通平台android的Framework开发遇到的一些问题总结

涉及到framwork的修改一般都在QSSI文件夹下。 1、Android设备&#xff0c;发现耳机插入了设备&#xff0c;但是设备statusbar并没有显示耳机插入的状态。 frameworks/base/packages/SystemUI/res/values/config.xml 下修改&#xff1a; <string-array name"config_s…...

基于modbus tcp通讯的雷赛导轨控制器调试软件

0.前言 之前工作遇到了雷赛电机驱动器设备&#xff0c;主要是用来控制光学导轨移动。雷赛的调试软件用的时串口通讯&#xff0c;还要他们定制的串口线&#xff0c;在现场都是485转网络的接口&#xff0c;调试起来也很不方便。所以我就照着他们的说明书&#xff0c;写了一个简易…...

阿里云产品流转

本文主要记述如何使用阿里云对数据进行流转&#xff0c;这里只是以topic流转&#xff08;再发布&#xff09;为例进行说明&#xff0c;可能还会有其他类型的流转&#xff0c;不同服务器的流转也可能会不一样&#xff0c;但应该大致相同。 1 创建设备 具体细节可看&#xff1a;…...

GO语言中的接口(interface)

go 接口 interface 1、什么是接口&#xff08;interface&#xff09;&#xff1f;2、注意事项3、interface底层实现4、侵入式与非侵入式5、接口的应用场景空接口的应用场景 6、其他使用 1、什么是接口&#xff08;interface&#xff09;&#xff1f; 在Go语言中&#xff0c;接口…...

模拟电路再理解系列(2)-电源滤波电路

前言 今天梳理一下电源滤波电路&#xff0c;在大部分电路设计中&#xff0c;都有滤波电路这一块儿&#xff0c;严格地说的话除了电源滤波还有信号滤波&#xff0c;经常会看到电路里面有一些电容&#xff0c;电感等串并联在一起的模块&#xff0c;大概率就是起到滤波作用&#…...

uniapp使用多列布局显示图片,一行两列

完整代码&#xff1a; <script setup>const src "https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/shuijiao.jpg" </script><template><view class"content"><view class"img-list"><image :src"src…...

近期几首小诗汇总-生活~卷

生活 为生活飘零&#xff0c;风雨都不阻 路见盲人艰&#xff0c;为她心点灯 贺中科大家长论坛成立十五周年 科学家园有喜贺 园外丑汉翘望中 曾一学子入我科 正育科二盼长大 憧憬也能入此家 与科学家论短长 园外翘首听高论 发现有隙入此坛 竟然也能注册成 入园浏览惶然立 此贴…...

超时导致SparkContext构造失败的问题探究

文章目录 1.前言2. 基于事故现场对问题进行分析2.1 日志分析2.2 单独测试Topology代码试图重现问题 3. 源码解析3.1 Client模式和Cluster模式下客户端的提交和启动过程客户端提交时在两种模式下的处理逻辑ApplicationMaster启动时在两种模式下的处理逻辑 3.2 两种模式下的下层角…...