Linux 入门:基础开发工具(上)vim,gcc/g++,make/makefile
目录
一.软件包管理器
一).软件包
二).安装软件
三).删除软件
二.编辑器vim
一).vim的基本介绍
1.正常/普通/命令模式(Normal mode)
2.插入模式(Insert mode)
3.底行模式(last line mode)
二).vim的基本操作
1.进入文本
2.切换模式
3.退出文本
三). vim--正常模式--命令集
1.移动光标
2.删除文字
3.复制-粘贴
4.替换
5. 撤销上⼀次操作
6.更改
7.跳至指定的行
四).vim--底行模式--命令集
1.列出行号
2.跳到文件中的某⼀行
3.查找字符
4.补充
1).「: + ! + 命令」
2).「: + %s+ / 当前文本内容 / 新内容 /」
3).「: + vs+ 文件名」
五).简单vim的配置
1.配置文件的位置
2.常用配置选项
3.插件配置
三.编译器gcc/g++
一).背景知识
二).gcc编译选项
1.预处理(进行初步操作)
2.编译(生成汇编)
3.汇编(生成机器可识别代码)
4.连接(生成可执行文件或库文件)
5.补充
三).动态链接和静态链接
1.动态链接
2.静态链接
四).静态库和动态库
1.动静态库对比:
2.补充:
四.自动化构建-make/Makefile
一).背景
二).理解
三).推导过程
编辑
一.软件包管理器
一).软件包
- 在Linux下安装软件, ⼀个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.
- 但是这样太麻烦了, 于是有些人把⼀些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在⼀个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.
- 软件包和软件包管理器, 就好比 "App" 和 "应用商店" 这样的关系.
- yum(Yellow dog Updater, Modified)是Linux下非常常用的⼀种包管理器. 主要应用在Fedora,RedHat, Centos等发行版上.
- Ubuntu:主要使用apt(Advanced Package Tool)作为其包管理器。apt同样提供了⾃动解决依赖关系、下载和安装软件包的功能
二).安装软件
# Centos
$ sudo yum install sl# Ubuntu
$ sudo apt install sl虚拟机安装拓展软件源: yum install -y epel-realse
注意事项:
- 安装软件时由于需要向系统目录中写入内容, ⼀般需要 sudo 或者切到 root 账户下才能完成.
- yum/apt安装软件只能⼀个装完了再装另⼀个. 正在yum/apt安装⼀个软件的过程中, 如果再尝试用yum/apt安装另外⼀个软件, yum/apt会报错.
- yum/apt 会⾃动找到都有哪些软件包需要下载, 这时候敲 "y" 确认安装.
- 出现 "complete" 字样或者中间未出现报错, 说明安装完成.
三).删除软件
# Centos
sudo yum remove sl# Ubuntu
sudo apt remove sl
二.编辑器vim
一).vim的基本介绍
讲解vim的三种模式(其实有好多模式,目前掌握这3种即可),分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下。
1.正常/普通/命令模式(Normal mode)
控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到last line mode
2.插入模式(Insert mode)
只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。
3.底行模式(last line mode)
文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。在命令模式下,*shift+:* 即可进入该模式。要查看你的所有模式:打开 vim,底行模式直接输入 :help vim-modes
二).vim的基本操作
1.进入文本
进⼊vim,在系统提⽰符号输⼊vim及⽂件名称后,就进⼊vim全屏幕编辑画⾯
2.切换模式
进⼊vim之后,是处于[正常模式],你要切换到[插⼊模式]才能够输文字
[正常模式]切换⾄[插⼊模式] 按下「i」
[插⼊模式]切换⾄[正常模式] 处于[插⼊模式],就只能⼀直输⼊文字,如果发现输错了字,想用光标键往回移动,将该字删除,可以先按⼀下「ESC」键转到[正常模式]再删除文字。当然,也可以直接删除。
[正常模式]切换⾄[末⾏模式] 「shift + :」, 其实就是输⼊「:」
3.退出文本
退出vim及保存文件,在[正常模式]下,按⼀下「:」冒号键进⼊「Last line mode」:
w (保存当前⽂件)
wq (输⼊「wq」,存盘并退出vim)
q! (输⼊q!,不存盘强制退出vim)
shift + z + z(保存退出vim)
三). vim--正常模式--命令集
1.移动光标
1.按「i」
按「i」切换进入插入模式「insert mode」,按“i”进⼊插⼊模式后是从光标当前位置开始输入⽂件;
2.按「a」
按「a」进⼊插入模式后,是从目前光标所在位置的下⼀个位置开始输入文字;
3.按「o」
按「o」进⼊插入模式后,是插⼊新的⼀行,从行首开始输入文字
4.按「shift + g」
移动到文章的最后
5.按「 shift + $(4) 」
移动到光标所在行的“行尾“
6.按「shift + ^(6)」
移动到光标所在行的“行首"
7.按[g + g]
进入到本文开始
8. 按[shift+g]
进入文本末端
9.其他的命令
按「w」:以单词为单位,光标跳到下个字的开头
按「e」:以单词为单位,光标跳到下个字的字尾
按「b」:以单词为单位,光标回到上个字的开头
按「#l」:光标移到该行的第#个位置,如:5l,56l
按「ctrl」+「b」:屏幕往“后”移动一页
按「ctrl」+「f」:屏幕往“前”移动一页
按「ctrl」+「u」:屏幕往“后”移动半页
按「ctrl」+「d」:屏幕往“前”移动半页
2.删除文字
1.按「x」
每按⼀次,删除光标所在位置的⼀个字符
2.按「d + d」
剪切或删除光标所在行
3.其他
「#x」:例如,「6x」表示删除光标所在位置的“后面(包含自己在内)”6个字符
「X」:大写的X,每按⼀次,删除光标所在位置的“前面”⼀个字符
「#X」:例如,「20 + shift + x」表示删除光标所在位置的“前面”20个字符
「#dd」:从光标所在行开始删除#行
3.复制-粘贴
1.按「yy」
复制光标所在行到缓冲区。
2.其他
「yw」:将光标所在之处到字尾的字符复制到缓冲区中。
「#yw」:复制#个字到缓冲区
「#yy」:例如,「6yy」表示拷贝从光标所在的该⾏“往下数”6行⽂字。
「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。
4.替换
1.按「r」
替换光标所在处的字符。
2.按「R」
替换光标所到之处的字符,直到按下「ESC」键为⽌
3「shift + ~ 」
大小写切换
5. 撤销上⼀次操作
一旦退出wq文件编辑,就无法再进行文件撤销了。但只是保存w,没有进行退出q,可以撤销。
1.「u」
如果您误执行⼀个命令可以马上按下「u」,回到上⼀个操作。按多次“u”可以执行多次复。
2.「ctrl + r」
撤销的恢复
6.更改
1.「cw」
更改光标所在处的字到字尾处
2.「c#w」
例如,「c3w」表示更改3个字
7.跳至指定的行
1.「ctrl」+「g」
列出光标所在行的行号。
2.「# + shift + g」
「15 + shift + g」,表示移动光标至文章的第15行行⾸。
四).vim--底行模式--命令集
在使用末行模式之前,请记住先按「ESC」键确定您已经处于正常模式,再按「:」冒号即可进⼊末行模式。
1.列出行号
「set nu」: 输⼊「set nu」后,会在文件中的每⼀行前面列出行号。
2.跳到文件中的某⼀行
「#」:「#」号表示⼀个数字,在冒号后输入⼀个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。
3.查找字符
- 「/关键字」: 先按「/」键,再输入您想寻找的字符,如果第⼀次找的关键字不是您想要的,可以⼀直按「n」会往后寻找到您要的关键字为⽌。
- 「?关键字」:先按「?」键,再输入您想寻找的字符,如果第⼀次找的关键字不是您想要的,可以⼀直按「n」会往前寻找到您要的关键字为⽌。
4.补充
1).「: + ! + 命令」
直接在vim中执行命令
2).「: + %s+ / 当前文本内容 / 新内容 /」
批量化替换
3).「: + vs+ 文件名」
分屏操作 (切换文件:Ctrl + w + w)
五).简单vim的配置
1.配置文件的位置
在目录 /etc/ 下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。
而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为:“.vimrc”。例如,/root目录下,通常已经存在⼀个.vimrc文件,如果不存在,则创建之。
切换用户成为自己执行 su ,进入自己的主工作目录,执行 cd ~
打开自己命令下的.vimrc文件,执行 vim .vimrc
2.常用配置选项
" 开启语法高亮
syntax on" 显示行号
set number" 高亮当前行
set cursorline" 自动缩进
set autoindent" 设置 Tab 为 4 个空格
set tabstop=4
set shiftwidth=4
set expandtab" 搜索时忽略大小写
set ignorecase" 智能大小写(如果搜索内容有大写则区分大小写)
set smartcase" 启用鼠标支持
set mouse=a
3.插件配置
可以看下面这位大佬的连接,非常详细
https://gitee.com/mirrorvim/vim-fast
三.编译器gcc/g++
一).背景知识
- 预处理(进行宏替换/去注释/条件编译/头文件展开等)
- 编译(生成汇编)
- 汇编(生成机器可识别代码)
- 连接(生成可执行文件或库文件)
二).gcc编译选项
1.预处理(进行初步操作)
- 预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
- 预处理指令是以#号开头的代码行。
实例: gcc –E hello.c –o hello.i
选项“-E”,该选项的作⽤是让 gcc 在预处理结束后停止编译过程。
选项“-o”是指目标⽂件,“.i”⽂件为已经过预处理的C原始程序。
2.编译(生成汇编)
- 在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
- 用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
实例: gcc –S hello.i –o hello.s
3.汇编(生成机器可识别代码)
- 汇编阶段是把编译阶段⽣成的“.s”文件转成目标文件
- 读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
实例: gcc –c hello.s –o hello.o
4.连接(生成可执行文件或库文件)
- 在成功编译之后,就进入了链接阶段。
实例: gcc hello.o –o hello
5.补充
- E -S -c 形成 .i .s .o文件
我们一般先将源文件编译成 .o文件,再将所有的.o文件连接成可执行程序
三).动态链接和静态链接
1.动态链接
动态链接的基本思想是把程序按照模块拆分成各个相对独立部分,在程序运⾏时才将它们链接在⼀起形成⼀个完整的程序,而不是像静态链接⼀样把所有程序模块都链接成⼀个单独的可执行文件
举个简单的例子吧
2.静态链接
在我们的实际开发中,不可能将所有代码放在⼀个源文件中,所以会出现多个源文件,而且多个源文件之间不是独立的,而会存在多种依赖关系,如⼀个源文件可能要调用另⼀个源文件中定义的函数,但是每个源⽂件都是独立编译的,即每个*.c文件会形成⼀个*.o文件,为了满足前面说的依赖关系,则需要将这些源文件产生的目标文件进行链接,从而形成⼀个可以执行的程序。这个链接的过程就是静态链接
四).静态库和动态库
- 静态库(只在链接时有用)是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名⼀般为“.a”
- 动态库与之相反,在编译链接时并没有把库文件的代码加⼊到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库⼀般后缀名为“.so”,如前面所述的libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。 gcc hello.o –o hello
- gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证
强制使用静态库生成:
Linux下,动态库XXX.so, 静态库XXX.a
Windows下,动态库XXX.dll, 静态库XXX.lib
库的名称:
1.动静态库对比:
- 动态库形成的可执行程序体积一定很小
- 可执行程序对静态库的依赖度小,动态库不能缺失
- 程序运行,需要加载到内存,静态链接的,会在内存中出现大量的重复代码,
- 动态链接,比较节省内存和磁盘资源
2.补充:
使用C++
初步认识库
四.自动化构建-make/Makefile
一).背景
- 会不会写makefile,从⼀个侧面说明了⼀个人是否具备完成大型工程的能力。
- ⼀个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了⼀系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
- makefile带来的好处就是⸺“自动化编译”,⼀旦写好,只需要⼀个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
- make是⼀个命令工具,是⼀个解释makefile中指令的命令工具,⼀般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了⼀种在工程方面的编译方法。
- make是⼀条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建
二).理解
makefile的基本概念---------依赖关系,依赖方法
依赖关系
上面的文件code,它依赖code.c
依赖方法
gcc -o code code.c ,就是与之对应的依赖关系
1.默认老代码不做重新编译
2.那么make怎么知道可执行程序和源文件的新旧问题?
操作:stat - 文件名
Modify:内容变更,时间更新
Chang:属性变更,时间更新
Access:常指的是文件
最近⼀次被访问的时间。在Linux的早期版本中,每当文件被访问时,其atime都会更新。但这种机制会导致大量的IO操作(多次查看才会改变)
通过对比源文件和可执行文件的Modify时间
项目清理
- 工程是需要被清理的
- 像clean这种,没有被第⼀个目标文件直接或间接关联,那么它后⾯所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令⸺“make clean”,以此来清除所有的目标文件,以便重编译
- 但是⼀般我们这种clean的目标文件,我们将它设置为伪目标,⽤ .PHONY 修饰,伪⽬标的特性是,总是被执行的
PHONY:让make忽略源文件和可执行目标文件的M时间对比
三).推导过程
code:code.ogcc code.o -o code code.o:code.sgcc -c code.s -o code.o code.s:code.igcc -S code.i -o code.s code.i:code.cgcc -E code.c -o code.i .PHONY:clean clean:rm -f *.i *.s *.o code
当然一般没有人会像上面这么写
make是如何工作的,在默认的方式下,也就是我们只输入make命令。
1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2. 如果找到,它会找文件中的第⼀个目标文件(target),在上面的例子中,他会找到 code这个文件,并把这个文件作为最终的目标文件。
3. 如果 code文件不存在,或是 myproc 所依赖的后面的 myproc.o 文件的文件修改时间要比code这个文件新(可以用 touch 测试),那么,他就会执行后面所定义的命令来生成code这个文件。
4. 如果 code所依赖的 code.o 文件不存在,那么 make 会在当前文件中找目标为code.o 文件的依赖性,如果找到则再根据那⼀个规则生成 code.o 文件。(这有点像⼀个堆栈的过程)
5.当然,你的C文件和H文件是存在的啦,于是 make 会生成 code.o ⽂件,然后再用 code.o文件声明 make 的终极任务,也就是执行文件 hello 了。
6. 这就是整个make的依赖性,make会⼀层⼜⼀层地去找文件的依赖关系,直到最终编译出第⼀个⽬标⽂件。
7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理
8. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。
面对多个文件,我们习惯把源文件先编译.o文件,再进行链接
BIN=proc.exe #定义变量 CC=gcc #SRC=$(shell ls *.c) #采用shell命令⾏方式,获取当前所有.c⽂件名 SRC=$(wildcard *.c) #或者使⽤ wildcard 函数,获取当前所有.c⽂件名 OBJ=$(SRC:.c=.o) #将SRC的所有同名.c 替换 成为.o 形成⽬标⽂件列表 LFLAGS=-o #链接选项 FLAGS=-c #编译选项 RM=rm -f #引⼊命令$(BIN):$(OBJ)@$(CC) $(LFLAGS) $@ $^ #$@:代表⽬标⽂件名。 $^: 代表依赖⽂件列表@echo "linking ... $^ to $@" %.o:%.c #%.c 展开当前⽬录下所有的.c。 %.o: 同时展开同名.o@$(CC) $(FLAGS) $< #%<: 对展开的依赖.c⽂件,⼀个⼀个的交给gcc。@echo "compling ... $< to $@" #@:不回显命令.PHONY:clean clean:$(RM) $(OBJ) $(BIN) # $(RM).PHONY:test test:@echo $(SRC)@echo $(OBJ)
相关文章:
Linux 入门:基础开发工具(上)vim,gcc/g++,make/makefile
目录 一.软件包管理器 一).软件包 二).安装软件 三).删除软件 二.编辑器vim 一).vim的基本介绍 1.正常/普通/命令模式(Normal mode) 2.插入模式(Insert mode) 3.底行模式(last line mode) 二).vim的基本操作 …...
golang 的channel
理解 Go 语言的 Channel Channel 是 Go 语言中用于 goroutine 之间通信和同步的重要机制。通过 channel,goroutine 可以安全地交换数据,避免了共享内存带来的竞态条件和内存一致性问题。 1. Channel 的基本概念 Channel 是一个先进先出(FI…...
HarmonyOS Next~鸿蒙元服务开发指南:核心功能与实践
HarmonyOS Next~鸿蒙元服务开发指南:核心功能与实践 一、元服务核心概念 原子化服务定义 元服务(原子服务)是鸿蒙系统的核心架构单元,具备独立业务能力的轻量化服务模块,支持免安装、跨设备调用和智能分发…...
stm32面试
数据结构相关问题 stm32面试 数据结构相关问题 目录基础数据结构树与图排序与查找算法 Linux相关问题Linux系统基础Linux命令与脚本Linux网络与服务 操作系统相关问题操作系统基础概念操作系统调度算法操作系统同步与通信 STM32相关问题STM32硬件基础STM32编程与开发STM32应用与…...
构建大语言模型应用:句子转换器(Sentence Transformers)(第三部分)
本系列文章目录 简介数据准备句子转换器(本文)向量数据库搜索与检索大语言模型开源检索增强生成评估大语言模型服务高级检索增强生成 RAG 在之前的博客中,我们学习了为RAG(检索增强生成,Retrieval Augmented Generati…...
新能源汽车空调系统(R134A)性能评估(一)
国内外主流空调系统厂家:贝尔、德尔福、空调国际、法雷奥、电装、松芝、杰信、新电、豫新等 泛亚汽车的空调电子部是比较优秀的整车空调研发团队。 空调系统综合试验台架是一套由试验室、风量测定装置、空气调和器、空气温度测定装置、湿度测定装置、加热器试验辅助…...
STRUCTBERT:将语言结构融入预训练以提升深度语言理解
【摘要】最近,预训练语言模型BERT(及其经过稳健优化的版本RoBERTa)在自然语言理解(NLU)领域引起了广泛关注,并在情感分类、自然语言推理、语义文本相似度和问答等各种NLU任务中达到了最先进的准确率。受到E…...
MCP协议的Streamable HTTP:革新数据传输的未来
引言 在数字化时代,数据传输的效率和稳定性是推动技术进步的关键。MCP(Model Context Protocol)作为AI生态系统中的重要一环,通过引入Streamable HTTP传输机制,为数据交互带来了革命性的变化。本文将深入解读MCP协议的…...
基于 RK3588 的 YOLO 多线程推理多级硬件加速引擎框架设计(代码框架和实现细节)
一、前言 接续上一篇文章,这个部分主要分析代码框架的实现细节和设计理念。 基于RK3588的YOLO多线程推理多级硬件加速引擎框架设计(项目总览和加速效果)-CSDN博客https://blog.csdn.net/plmm__/article/details/146542002?spm1001.2014.300…...
stm32 can 遥控帧的问题
STM32单片机使用CAN协议进行通信 引用这个博客的一段话 CAN的遥控帧(Remote Frame)的主要作用是请求其他节点发送具 有特定ID的数据帧。具体来说,当一个节点需要从另一个节点获取数 据时,它可以发送一个遥控帧,而不是…...
机器人基础知识-1
1.六轴机器人中的六轴是什么? 第一轴(J1):底座旋转 控制机器人整体绕垂直轴旋转(左右摆动),决定工作范围的水平方向。 第二轴(J2):下臂前后摆动 驱动机器人的…...
JAVA- 锁机制介绍 进程锁
进程锁 基于文件的锁基于Socket的锁数据库锁分布式锁基于Redis的分布式锁基于ZooKeeper的分布式锁 实际工作中都是集群部署,通过负载均衡多台服务器工作,所以存在多个进程并发执行情况,而在每台服务器中又存在多个线程并发的情况,…...
如何在WordPress中强制用户使用强密码?
在如今网络安全备受关注的环境下,弱密码问题不容忽视。很多用户习惯在多个网站使用相同且简单的密码,这样一来,若不强制他们在 WordPress 网站上使用强密码,网站的安全性就会受到威胁。尤其对于在线商店、会员网站、多作者博客等站…...
鸿蒙NEXT开发Base64工具类(ArkTs)
import util from ohos.util;/*** Base64 工具类* author: 鸿蒙布道师* since: 2025/03/31*/ export class Base64Util {/*** 创建 Base64Helper 实例* returns Base64Helper 实例*/private static createBase64Helper(): util.Base64Helper {return new util.Base64Helper();}…...
基于HUTOOL实现RSA工具类
一、前言:用 Hutool 简化 RSA 加密开发,提升代码安全与效率 在当今数据安全至关重要的时代,RSA 非对称加密作为保护敏感信息的核心技术,广泛应用于通信加密、数字签名、密钥交换等场景。然而,手动实现 RSA 算法涉及复…...
flink 分组窗口聚合 与 窗口表值函数聚合 的区别
警告:分组窗口聚合已经过时。推荐使用更加强大和有效的窗口表值函数聚合。 参考官方文档 在 Apache Flink 中,分组窗口聚合(Group Window Aggregation) 和 窗口表值函数聚合(Windowing TVF Aggregation)…...
prompt_status:5: command not found: wc解决办法
问题出现背景 想配置uniapp的命令行,在.zprofile配置路径的时候PATH 前面少打了一个$,执行了 source,导致各种命令都失效。 解决办法 用fider 打开用户文件夹,Command Shift .显示隐藏文件,用文本编辑器修改一下&…...
《STL 六大组件之容器篇:简单了解 list》
目录 一、list 简介二、list 的常用接口1. 构造函数(constructor )2. 迭代器(iterator)3. 容量、修改和访问(capacity 、modify and access) 一、list 简介 简单来说,list 就是数据结构初阶中学…...
向量数据库学习笔记(2) —— pgvector 用法 与 最佳实践
关于向量的基础概念,可以参考:向量数据库学习笔记(1) —— 基础概念-CSDN博客 一、 pgvector简介 pgvector 是一款开源的、基于pg的、向量相似性搜索 插件,将您的向量数据与其他数据统一存储在pg中。支持功能包括&…...
TCP的连接建立
面向连接 定义:在发送数据之前,需要建立一条点到点的连接 (参数协商的过程。因为tcp要保证可靠,所以tcp通信是发生在双方之间、两端之间的,两端在正式发送数据之前需要约定一些初始参数,这个过程就是面向连…...
如何让AI帮你做用户运营:用户消费偏好分层和洞察
随着deepseek的爆火,我一直在想能不能用AI来帮我做用户运营,目前deepseek只能提供框架层面的运营建议,还无法实现将订单数据给到它,能够自动化分析并将用户分层,并给出可视化的运营洞察报表。但是,我要告诉…...
二分答案-P8647 [蓝桥杯 2017 省 AB] 分巧克力
题解:P8647 [蓝桥杯 2017 省 AB] 分巧克力 题目传送门 题目链接 一、题目描述 小明有N块不同尺寸的巧克力,需要切出K块相同大小的正方形巧克力分给小朋友们。要求找到能满足条件的最大的正方形边长。 二、题目分析 我们需要从N块巧克力中切出K个相…...
搜广推校招面经六十一
美团推荐算法 一、ANN算法了解么?说几种你了解的ANN算法 ANN 近似最近邻搜索(Approximate Nearest Neighbor Search)算法 1.1. KD-Tree(K-Dimensional Tree,K 维树) 类型: 空间划分数据结构适用场景: 低…...
某地老旧房屋自动化监测项目
1. 项目简介 自从上个世纪90年代以来,我国经济发展迅猛,在此期间大量建筑平地而起,并且多为砖混结构的住房,使用寿命通常约为30-50年,钢筋混凝土结构,钢结构等高层建筑,这些建筑在一般情况下的…...
【第一节】Python爬虫基础-HTTP基本原理
目录 前言 一、URI和URL是什么 二、什么是超文本 三、HTTP和HTTPS的区别 四、HTTP请求过程 五、请求 六、响应 前言 在着手开发爬虫程序之前,我们需要先掌握一些基础概念。本节将详细讲解HTTP的基本工作原理,重点分析从浏览器输入网址到获取网页内…...
docker打包使用有头模式playwright
1.打包镜像 创建Dockerfile文件如下 # playywright 官方镜像 FROM mcr.microsoft.com/playwright:v1.37.0-jammy# 设置非交互式环境变量和时区 ENV DEBIAN_FRONTENDnoninteractive ENV TZEtc/UTC# 安装 Python 3.9 和 pip(修复时区阻塞问题) RUN apt-g…...
VuePress 和 Docusaurus的对比
VuePress 和 Docusaurus 是两个流行的现代静态网站生成器 vuepress:首页 | VuePress Docusaurus:Docusaurus 博客 | Docusaurus中文文档 | Docusaurus中文网 一、技术栈和设计理念 VuePress 技术栈:基于Vue.js,专为技术文档设计,…...
JAVA数据库增删改查
格式 Main.java(测试类) package com.example;import com.example.dao.UserDao; import com.example.model.User;public class Main {public static void main(String[] args) {UserDao userDao new UserDao();// 测试添加用户System.out.println(" 添加用户 ");Us…...
MSTP多域生成树
协议信息 MSTP 兼容 STP 和 RSTP,既可以快速收敛,又提供了数据转发的多个冗余路径,在数据转发过程中实现 VLAN 数据的负载均衡。 MSTP 可以将一个或多个 VLAN 映射到一个 Instance(实例)(一个或多个 VLAN…...
HashMap 在 JDK 1.7 和 JDK 1.8 有什么区别
HashMap 在 JDK 1.7 和 JDK 1.8 中的实现存在显著差异,主要体现在以下几个方面: 1. 数据结构的变化 • JDK 1.7:HashMap 的底层数据结构是数组 单向链表。当哈希冲突发生时,新的元素会插入到链表的头部(头插法&#…...
Mysql忽略大小写
🚀欢迎来到我的【Mysql】专栏🚀 🙋我是小蜗,一名在职牛马。🐒我的博客主页 ➡️ ➡️ 小蜗向前冲的主页🙏🙏欢迎大家的关注,你们的关注是我创作的最大动力🙏🙏在 MySQL 中取消大小写区分主要涉及以下两个层面的配置,具体操作如下: 一、表名大…...
基于TradingView和CTPBee的自动化期货交易系统实现
引言 在量化交易领域,TradingView因其强大的技术分析工具和丰富的指标库而广受欢迎,但是其不支持国内期货自动化交易,CTPBee则是一个优秀的国产Python期货交易接口。本文将介绍如何将两者结合,实现一个完整的自动化交易系统。 本…...
昇腾CANN算子共建仓CANN-Ops正式上线Gitee,首批算子已合入
在人工智能技术呈指数级发展的今天,AI创新已走向更底层的算法创新,以DeepSeek为例,通过MoE模型架构和底层算法创新,不仅获取极佳的模型性能,又更大程度释放硬件性能,降低硬件使用成本。 算子,作…...
基于PyQt5的自动化任务管理软件:高效、智能的任务调度与执行管理
基于PyQt5的自动化任务管理软件:高效、智能的任务调度与执行管理 相关资源文件已经打包成EXE文件,可双击直接运行程序,且文章末尾已附上相关源码,以供大家学习交流,博主主页还有更多Python相关程序案例,秉着…...
Pycharm(八):字符串切片
一、字符串分片介绍 对操作的对象截取其中一部分的操作,比如想要获取字符串“888666qq.com前面的qq号的时候就可以用切片。 字符串、列表、元组都支持切片操作。 语法:字符串变量名 [起始:结束:步长] 口诀:切片其实很简单,只顾头来…...
C++编程学习笔记:函数相关特性、引用与编译流程
目录 一、函数的缺省参数 (一)全缺省参数 (二)半缺省参数 二、函数重载 (一)参数类型不同 (二)参数个数不同 (三)参数类型顺序不同 三、引用相关问题…...
Nginx 配置 HTTPS 与 WSS 完整指南
Nginx 配置 HTTPS 与 WSS 完整指南 本教程将手把手教你如何为网站配置 HTTPS 加密访问,并通过反向代理实现安全的 WebSocket(WSS)通信。以 https://www.zhegepai.cn 域名为例,完整流程约需 30 分钟完成。 一、前置准备 1.1 域名…...
链表基本操作
文章目录 1、单链表1.1 链表的创建1.2 链表的遍历1.3 链表的删除1.4 链表的插入1.5 链表和数组 2、双向链表2.1 双链表的创建2.2 双链表的删除2.3 双链表的插入2.4 双向循环链表2.5 双链表优缺点 1、单链表 链表是一种物理存储单元上非连续、非顺序的存储结构,插入…...
【huggingface 数据下载】ssh / https 不同的下载流程,hf 镜像下载注意事项
ssh 下载流程 在 linux 服务器上生成 ssh key将 pub key 放入 huggingface 的 setting 中通过 git lfs install 然后 git clone githf.co … 来下载数据 遇到的问题 一直卡在 Updating files 后 卡住的可能原因: 系统当前限制了允许监视的最大文件数࿱…...
简单版CentOS7配置haproxy
一、实验步骤 1、自行下载pes的tar包 然后解压到家目录下 tar -xzvf pes.tar.gz 2、创建一个目录 mkdir docker-compose-pes-lb2 3、在这个目录下写两个文件docker-compose.yml和haproxy.cfg docker-compose.yml version: 3 services: db: image: mysql:5.7.44 container…...
leetcode146.LRU缓存
思路源自 【面试高频】146. LRU 缓存 采用哈希表双向链表 put一个键值对时,采用头插法将缓存块置于等级较高的位置,如果put数量超出限制,那么就将尾部的缓存块删除,以此达到置换的一个效果 get一个键值对也是同样的思路…...
SpringIoC和DI
文章目录 OCP开闭原则DIP(依赖倒置原则)IOC(控制反转)依赖注入DI基于XML配置Beanset注入构造注入 使用注解存储beanController方法注解Bean扫描路径依赖注入三种注入方式优缺点分析 引入 当我们写了一个程序,遵循SpringMVC三层架构,表现层调用业务逻辑层…...
vue 路由
目录 一、路由的使用 二、声明式导航 2.1 声明式导航 2.2 声明式导航路由传参 2.2.1.字符串写法 2.2.2.对象写法 2.2.3 query 传参和 param 传参总结 2.3 命名路由 2.4 可选操作符 2.5 props 参数 三、编程式导航 3.1 replace 和 push 跳转…...
JAVA常见的 JVM 参数及其典型默认值
在 Java 线上应用中,JVM 参数的默认值取决于具体的 JVM 实现(如 Oracle JDK、OpenJDK、Zulu 等)、版本(如 Java 8、11、17 等)以及运行环境(物理机、容器等)。以下是常见的 JVM 参数及其典型默认…...
文件压缩与解压(zip4j)
maven依赖 <dependency><groupId>net.lingala.zip4j</groupId><artifactId>zip4j</artifactId><version>2.11.5</version></dependency>示例 //参数配置ZipParameters parameters new ZipParameters();parameters.setCompres…...
【操作系统】查内存泄漏方法
【操作系统】查内存泄漏方法 1. 通用检测方法1.1 代码审查1.2 运行时监测 2.Linux平台检测工具2.1 Valgrind工具套件2.2 AddressSanitizer (ASan)2.3 mtrace 3.Windows平台检测工具3.1 Visual Studio诊断工具3.2 CRT调试堆 4.嵌入式系统检测方法4.1 RT-Thread内存检测4.2 自定义…...
oracle常用sql
获取主键 1. 查询主键的两种常用方法 Oracle 的主键信息存储在以下两个视图中: USER_CONSTRAINTS:存储当前用户下所有表的约束信息(如主键、外键等)。 USER_CONS_COLUMNS:存储约束对应的列信息。 方法 1ÿ…...
【第十三届“泰迪杯”数据挖掘挑战赛】【2025泰迪杯】【思路篇】A题解题全流程(持续更新)
【第十三届“泰迪杯”数据挖掘挑战赛】【2025泰迪杯】A题解题全流程-思路(持续更新) 写在前面: 1、A题、C题将会持续更新,陆续更新发布文章 2、赛题交流咨询Q群:1037590285 3、全家桶依旧包含: 代码、…...
Qt 信号量使用方法
Qt 信号量使用方法 QSemaphore 类 常用函数介绍 函数名称函数功能QSemaphore()构造并初始化对象acquire()尝试获取n个资源,如果没有那么多资源,线程将阻塞直到有n个资源可用available()返回当前信号量可用的资源个数,这个数永远不可能为负…...
C++进阶——封装哈希表实现unordered_map/set
与红黑树封装map/set基本相似,只是unordered_map/set是单向迭代器,模板多传一个HashFunc。 目录 1、源码及框架分析 2、模拟实现unordered_map/set 2.1 复用的哈希表框架及Insert 2.2 iterator的实现 2.2.1 iteartor的核心源码 2.2.2 iterator的实…...