Linux基础开发工具使用快速上手

软件包管理器

概念理解

在Linux下安装软件的话,一个比较原始的办法是下载程序的源代码,然后进行编译,进而得到可执行程序,然后就可以运行这个软件了。但是这种做法太麻烦了,于是就有些人把一些常用的软件提前编译好,做成软件包,放到服务器上,通过包管理器可以很方便的获取到这个编译好的软件包,直接进行安装即可。而负责管理这些软件包的东西就叫软件包管理器。软件包和软件包管理器之间的关系,就好比手机上的 "App" 和 "应用商店" 这样的关系。

yum的实现过程大致可以概括为如下步骤:

此引用部分摘自:linux网络服务-部署yum仓库 - 掘金


先在yum服务器上创建 yum repository(仓库),在仓库中事先存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录repodata下,内含有软件的依赖关系和软件的位置),当yum客户端利用yum/dnf工具进行安装时包时,会自动下载repodata中的元数据,查询元数据是否存在相关的包及依赖关系,自动从仓库中找到相关包下载并安装

而不同的Linux发行版本通常使用不同的软件包管理器来管理和安装软件包。以下是一些常见的 Linux发行版本及其对应的软件包管理器:

Ubuntu 和 Debian,使用 apt 作为软件包管理器。

CentOS 和 Red Hat,使用 yum 或 dnf 作为软件包管理器。在较新的版本中(CentOS 8和Red Hat 8及其之后),dnf 更为常见。

Fedora,使用 dnf 作为默认的软件包管理器。

openSUSE,使用 zypper 作为软件包管理器。

Arch Linux,使用 pacman 作为软件包管理器。

Manjaro,也是基于 Arch Linux,所以同样使用 pacman 作为软件包管理器。

Linux Mint,通常使用 apt,类似于 Ubuntu。

注意,这些发行版本中的软件包管理器可能会有不同的命令和选项,因此在使用时需要查阅相关文档或指南以获取详细信息。

用法示例 - 以yum为例

yum源

yum仓库,俗称yum源,用于存放各种的软件包。需要安装软件的计算机连接到指定yum仓库来安装软件包。yum源就相当于一个软件包管理器,类似于一个软件管家,而yum源又有分为本地yum源和网络yum源,绝大多数情况下我们使用的是网络yum源。
如果我们安装的是官方的系统镜像的话,其使用的网络yum源基本都是国外官方的,但国外的下载软件速度非常慢,很多情况下都无法下载。所以国内一些大公司会做镜像,以同步国外的软件。 所以我们可以配置使用国内的yum镜像源(如腾讯源、阿里源、华为源等)。

配置yum源的操作 - 以centos7,腾讯源为例:

首先我们直接网上搜索“腾讯源”,然后打开这个网站:腾讯软件源 (tencent.com)

接着找到centos,然后点击右侧的查看:

然后按照网页提示就可以直接安装了,它已经贴心的把指令告诉我们了。CentOS (tencent.com) 腾讯软件源icon-default.png?t=N7T8https://mirrors.tencent.com/help/centos.html

yum的语法格式

yum [options] [command] [package ...]

参数说明:

options: 选项,选项包括-h,-y,-q等等。

command: 要进行的操作。

package: 安装的包名。

常用选项:

-h:显示帮助信息

-y:对所有的提问都回答“yes”

-c:指定配置文件

-q:安静模式

-v:详细模式

-d:设置调试等级(0-10)

-e:设置错误等级(0-10)

-R:设置yum处理一个命令的最大等待时间

-C:完全从缓存中运行,而不去下载或者更新任何头文件

yum的常用命令

命令作用
yum list查询所有可安装的软件包
yum list <package_name>查询指定软件包的安装情况
yum info查询所有可安装软件包的详细信息
yum info <package_name>查询指定软件包的详细信息
yum list updates列出所有可更新的软件清单
yum list installed列出所有已安装的软件清单
yum update更新所有软件包(更新所有包同时,也更新软件和系统内核)
yum -y upgrade更新所有软件包(只更新所有包,不更新软件和系统内核)
yum update <package_name>更新指定软件包
yum install <package_name>安装指定软件包
yum remove <package_name>删除指定软件包
yum search <keyword>查找指定软件包

yum makecache

刷新缓存。把服务器的包信息下载到本地电脑缓存起来,makecache建立一个缓存。以后用install时就在缓存中搜索,提高了速度。配合yum -C search xxx使用,不用联网检索就能查找软件信息。
yum makecache fast将软件包信息提前在本地索引缓存,用来提高搜索安装软件的速度,执行这个命令可以提升yum安装的速度。
yum clean / yum clean all清除缓存目录下的软件包及旧的 headers。yum 会把下载的软件包和header存储在cache中而不自动删除。可以使用yum clean指令清除索引缓存和下载包的缓存。
yum clean packages清除缓存目录下的软件包
yum clean headers清除缓存目录下的 headers
yum clean oldheaders清除缓存目录下旧的 headers

vim

注意,这里只是简单的解释vim的一些基础用法,使得我们可以快速上手使用vim。如果想要更深层次的学习vim,可以自行探索,这里我推荐一个很不错的教程:(这个人的主页也有很多关于vim的相关内容,感兴趣的话可以好好看看)Learn-Vim(the Smart Way) 中文翻译icon-default.png?t=N7T8https://github.com/wsdjeg/Learn-Vim_zh_cn

如果觉得上面的内容太多了,也可以看一下这个:

Vim 命令速查表 - Chloneda - 博客园 (cnblogs.com)icon-default.png?t=N7T8https://www.cnblogs.com/chloneda/p/vim-cheatsheet.html当然,也可以参考这张很经典的图片:

模式的切换

下面就让我们来快速上手使用vim。首先,vim有很多模式,不同的模式下对应着不同的功能,虽然vim的模式有十几个但实际生活中最常用的也就3个:normal(命令)模式、command(底行)模式、insert(插入)模式,当然还有诸如v-block(视图)模式、replace(替换)模式等。

可以说,命令模式是vim中最基础的模式。首先,进入vim时默认的就是命令模式。而且,想要切换到其它模式,是必须在命令模式下进行的。下面就让我们来了解一下如何切换到其它模式。

首先,在命令模式下按i、a或o是可以进入到插入模式的,i是从当前光标下开始,a是光标后移一个,o是在下面另开一行。插入模式下就可以进行我们正常的写入了。在命令模式下按 shift+; 也就是打出冒号 ':' 就可以进入到底行模式。vim的一些操作,比如退出就是需要在低行模式下进行的。
按 Ctrl+v 是进入视图模式(v是大小写都可以),其中在视图模式下按shift+i、a、o等是在视图模式下进入插入模式,视图模式下可以批量对文本进行操作。输入大写的R(即shift+r)是进入到替换模式。替换模式下,每次输入的字符都会替换掉光标所在位置的字符。而对于任何模式下回到命令模式的情况,都是只需要按键盘左上角的Esc即可。

常用操作

0、进入vim

# 直接启动vim
vim # 打开单个文件
vim file# 同时打开多个文件
vim file1 file2 file3 ...

1、进入到插入模式

i  在当前位置生前插入

I  在当前行首插入

a  在当前位置后插入

在当前行尾插入

在当前行之后插入一行

O  在当前行之前插入一行

s  删除当前字符并进入插入模式

删除当前行并进入插入模式

2、光标的移动

左移一个字符,nh  左移n个字符

j   下移一个字符,nj   下移n个字符
上移一个字符,nk  上移n个字符
l   右移一个字符,nl   右移n个字符
上面的这四个hjkl就对应着键盘右侧的 ←↓↑→ 方向键。

gg / [[   移动到文件头
G(shift + g) / ]]   移动到文件尾

nG   移动到第n行

:n   移动到第n行

0   数字0,移动到本行第一个字符上,

功能键HOME   移动到本行第一个字符,同0健。

^ (shitf+6)   移动到本行第一个非空白字符上
$ (shitf+4) / 功能键END    移动到行尾

n$  移动到下面n行的行尾

(n)w   向后移动1(n)个单词,光标停在单词首部,如果已到行尾,则转至下一行行首。

(n)b  向前移动1(n)个单词,光标停在单词首部

(n)e   同w,只是光标停在单词尾部

(n)ge   同b,只是光标停在单词尾部

(n)fx  找到当前行,光标后的第1(n)个为x的字符

(n)F  同f,只不过是反向查找。

Ctrl + e  向下滚动一行

Ctrl + y  向上滚动一行

Ctrl + d  向下滚动半屏

Ctrl + u  向上滚动半屏

Ctrl + f   向下滚动一屏

Ctrl + b  向上滚动一屏

3、复制、剪切和粘贴

yiw  复制(yank)当前单词

yw  复制从当前光标的位置到下一个单词的开头

yb  复制从当前光标的位置到上一个单词的末尾

yy  复制整行(包括换行符)

4yy  复制4行(包括换行符)

y$  复制从当前光标的位置到行尾


(n)x  剪切光标处连续的1(n)个字符

(n)X  剪切当前字符的前1(n)个字符

(n)dl 剪切后1(n)个字符,dl=x

(n)dh  剪切前1(n)个字符,dh=X

(n)d  剪切当前行开始的1(n)行,通常还需要再回车一次

(n)dd  剪切当前1(n)行

(n)dj  剪切上1(n)行

(n)dk  剪切下1(n)行

(n)d$  剪切1(n)行当前字符之后的所有字符

(n)d^  剪切从光标到当前1(n)行的开头

(n)D  剪切当前字符至行尾,D=d$

dG  从光标删除到文件尾 (d 是删除行, G 是文件尾, 连起来就是从光标行删除到文件尾)

:beg,nd  剪切beg至n行(最后的d是指令部分)

:beg,$d  剪切beg行至以后所有的行


p  小写,粘贴在光标之后
P  大写,粘贴在光标之前

4、替换操作

substitute命令,将指定字符串替换为目标字符串。通常我们一般一般使用的是命令的缩写形式:s,具体使用格式如下:

:[range] s/search/replace/[flags] [count]

如果我们想要将所有出现的字符都替换成给定字符,可以在命令中使用g(global)标记,例如

:s/from/to/g

如果没有在命令中指定范围,那么默认范围是当前行。范围指定的用法示例如下:

# 在第10行知第20行每行前面加四个空格
:10,20 s/^/ /g  # 把当前行中的I替换为We。命令中的i标记,是用于指定区分大小写的。
:s/I/We/gi# 将文中所有的字符串idiots替换成managers
:1,$s/idiots/manages/g#通常我们会在命令中使用%指代整个文件做为替换范围
:%s/search/replace/g# 在第5至第15行间进行替换
:5,15s/dog/cat/g# 只在当前行在内的以下4行内进行替换
:s/helo/hello/g4# 只在当前行至文件结尾间进行替换
:.,$s/dog/cat/g# 只在后续9行内进行替换
:.,.+8s/dog/cat/g
  • 参考:VIM学习笔记 替换(Substitute) - 知乎 (zhihu.com)

s/old/new/  用old替换new,替换当前行的第一个匹配

s/old/new/g  用old替换new,替换当前行的所有匹配

%s/old/new/  用old替换new,替换所有行的第一个匹配

%s/old/new/g  用old替换new,替换整个文件的所有匹配

(n)ra  光标之后的1(n)个字符替换为a(r是命令,a是具体的字符)
R  从光标所在处开始替换字符,按 esc 键结束。也就是replace模

(n)~  也就是shift+`(Esc下面),将从光标位置之后的1(n)个字符转换大小写

5、文件操作

:w  保存不退出

:q  不保存退出

:wq  保存退出

:q!  强制不保存退出,不保存数据

:wq!  强制保存退出

:open file  在新窗口中打开文件

:split file  切换到下一个文件

:bn  切换到上一个文件

:bp  切换到上一个文件

6、多窗口操作

在底行模式下可以以多窗口的方式打开一个新文件,具体操作形式如下

:sp file    以纵向显示的方式打开file文件

:vsp file  以横向向显示的方式打开file文件

:vs file    以横向显示的方式打开file文件

在多窗口模式的常用操作如下

命令关键词联想功能
Ctrl w wwindow切换到下一个窗口。
Ctrl w h/←window切换到左边的窗口。
Ctrl w j/↓window切换到下边的窗口。
Ctrl w k/↑window切换到上边的窗口。
Ctrl w l/→window切换到右边的窗口。
Ctrl w rreverse互换窗口。
Ctrl w cclose关闭当前窗口。(但是不能关闭最后一个窗口)
Ctrl w qquit退出当前窗口。(如果是最后一个窗口,则关闭vim编辑器)
Ctrl w oother关闭其他窗口

7、常用的set命令

:set number				" 显示行号
:set nu			        " 显示行号
:set nonumber			" 关闭行号:set showcmd            " 显示输入的命令
:set noshowcmd          " 不显示输入的命令:set tabstop=4 			" 设置 tab space 为4个空格
:set ts=4				" 同 tabstop
:set expandtab			" 将tab替换为指定数量的空格
:set autoindent			" 设置为自动缩进:set background=dark		" 设置背景颜色
:set guifont=consolas:h14		" 设置字体为 consolas,字号为14:set history=700		" 设置保存命令的行数:set autoread		" 设置当文件变化时,自动读取新文件:set wrap		" 启动折行
:set nowrap		" 禁止折行" 切换文件格式,ff是 fileformat 的缩写
:set ff=unix			" 将文件切换为 unix 格式,每行以 "\n" 结尾 
:set ff=dos				" 切换为 Windows 格式,每行以 "\r\n" 结尾" 设置编码格式
:set encoding=utf-8			" 设置 vim 展示文本时的编码格式
:set fileencoding=utf-8		" 设置 vim 写入文件时的编码格式:set filetype=html			" 设定文件类型,方便语法高亮:set hlsearch				" 高亮显示搜索结果:set paste					" 设置为 paste 模式,在粘贴前设置该模式,可以避免各种 auto-formating
:set nopaste				" 切换回 normal 模式

其它操作

:! command   在不退出vim的情况下执行command指令

.  重复前一次命令

u  撤销
ctrl + r  反撤销

插件和配置

.vimrc文件

vim通常是用.vimrc文件配置的,其实原理很简单,就是.vimrc文件会在进入vim之前执行.vimrc文件中的所有指令,所以我们通常把一些set命令放入到.vimrc文件中,这样就不用每次进入vim时手动的输入指令来个性化我们的vim了。

插件

首先我们需要知道,如果想要很好的使用vim中的插件,一个很重要的工具就是插件管理器,一般来说,最常使用的插件管理器就是vim-plug。不过由于vim的插件种类繁多,没有办法让我们快速上手,所以我们可以尝试去GitHub上找一个一键部署的,比如:GitHub - askunix/VimForCpp: VIM一键配置C/C++开发环境,可自动下载各类插件。VIM一键配置C/C++开发环境,可自动下载各类插件。. Contribute to askunix/VimForCpp development by creating an account on GitHub.icon-default.png?t=N7T8https://github.com/askunix/VimForCpp

如果要手动安装插件的话,可以参考这篇博客:神级编辑器 Vim 使用 - 插件篇 | 闪耀旅途 (hanleylee.com)icon-default.png?t=N7T8https://www.hanleylee.com/articles/usage-of-vim-editor-plugin/

gcc/g++

前置知识:源文件形成可执行文件需要经过预处理、编译、汇编和链接这四大过程。不知道的可以看这篇博客:浅析编译和链接


概念理解

gcc 与 g++ 分别是 gnu 的 c & c++ 编译器 gcc/g++ 在执行编译工作的时候,总共需要4步:

1、预处理,生成 .i 的文件[预处理器cpp]

2、将预处理后的文件转换成汇编语言, 生成文件 .s [编译器egcs]

3、有汇编变为目标代码(机器代码)生成 .o 的文件[汇编器as]

4、连接目标代码, 生成可执行程序 [链接器ld]

参数说明

g++和gcc的使用参数是一样的,所以虽然以gcc的角度进行讲解,但g++也是同样使用的。gcc的多样性大多是源于它的参数,其中有5个比较常用的参数:Esco和std,下面是相关解释:

-E 只运行 C 预编译器,把源文件编译为.i文件。

-S 只激活预处理和编译,把文件编译成为汇编代码.s文件。

-c  只编译生成.o可重定位目标文件。

-o FILE 生成指定的输出文件FILE,也就是说,-o后面是必须跟文件名的。

-std=Standard  用于指定编译器的执行标准,比如C99或者C++11就需要手动指定。

当然,还有一个 -g 选项也是比较常用的,这是在需要调试代码时常用的一个选项。

gcc/g++ 命令的常用选项

-ansi 只支持ANSI标准的C语法。这一选项将禁止GNU C的某些特色,例如asm或typeof关键词。
-c  只编译生成.o可重定位目标文件。
-DMACRO 以字符串"1"定义 MACRO 宏。
-DMACRO=DEFN    以字符串"DEFN"定义 MACRO 宏。
-E  只运行 C 预编译器,把源文件编译为.i文件。
-g  生成调试信息。GNU 调试器可利用该信息。
-IDIRECTORY 指定额外的头文件搜索路径DIRECTORY。
-LDIRECTORY 指定额外的函数库搜索路径DIRECTORY。
-lLIBRARY   连接时搜索指定的函数库LIBRARY。
-m486   针对 486 进行代码优化。
-o FILE 生成指定的输出文件。用在生成可执行文件时。
-O0 不进行优化处理。
-O 或 -O1    优化生成代码。
-O2 进一步优化。
-O3 比 -O2 更进一步优化,包括 inline 函数。
-S 只激活预处理和编译,把文件编译成为汇编代码.s文件。
-static 将禁止使用动态库,即只使用静态库。
-std=Standard  用于指定编译器的执行标准,比如C99或者C++11就需要手动指定。
-share 尽量使用动态库。
-shared 生成共享目标文件。通常用在建立共享库时。
-UMACRO 取消对 MACRO 宏的定义。
-w  不生成任何警告信息。
-Wall   生成所有警告信息。

gdb

使用过VS的人都知道,在VS中编译一个程序时有debug和release版本。而在Linux中的gcc下,默认生成的就是release版本的,也就是说gcc默认生成的可执行程序是没有调试信息的,当然也就不能调试,如果想要生成可调式的,需要在gcc/g++的选项上再加一个-g。如果没有-g选项生成的可执行文件是没有调试信息的,那么就会显示:

由于gdb的使用非常的复杂,东西很多,所以这里我们只是简单的介绍如何快速上手用起gdb,至于详细的内容,可以参考gdb手册:Help (Debugging with GDB) (sourceware.org)icon-default.png?t=N7T8https://sourceware.org/gdb/onlinedocs/gdb/Help.html#index-GDB-version-number

当然,由于这个手册是纯英文的,所以可能很难入手,如果很介意英文,可以尝试在下面这篇博客里找,里面的内容相对来说也是比较全面的:

显示gdb版本信息 | 100个gdb小技巧 (gitbooks.io)icon-default.png?t=N7T8https://wizardforcel.gitbooks.io/100-gdb-tips/content/show-version.html


下面是一些基础常用的gdb命令介绍,以便我们能够快速上手。

  1. list(l) :显示文件的源代码,从当前函数开始,每次显示10行,按回车键继续。其中,list是全称,l是简写。
  2. list(l)  line显示文件源代码,从第line行开始。其余内容同上。
  3. list(l)  func显示文件源代码,从func函数开始。其余内容同上。
  4. run(r):运行程序,通常配合断点来使用。和VS中不同的是,gdb运行程序结束之后,只要gdb没有退出,就还可以继续用的。其中run是全称,r是简写。
  5. start:start和run的功能基本上一致。最大区别的就是:run命令是在第一个断点处停下,start是在main函数的的入口处停下。
  6. break(b) line:在第line行设置断点。
  7. break(b) func:在func的函数入口处设置断点。
  8. break(b) file:line:给file文件的line行打断点。
  9. break(b) file:func:给file文件的func函数入口处打断点。
  10. info break(b):查看所有断点的信息。从gdb的打开到gdb的退出,这之间断点的编号会一直增加,即使某个断点被删除了它的编号也不会被占用。当gdb退出时,所有的断点就会被全部清除。
  11. info break(b) n:查看指定编号为n的断点。
  12. next(n):单条执行,不会进入到语句的函数中,相当于VS中的逐过程执行(F10)。通常在程序运行时配合断点使用。
  13. step(s):和next功能类似,只是step会进入到当前语句的函数中,更详细。相当于VS的逐语句执行(F11)。通常在程序运行时配合断点使用。
  14. continue(c):直接跳转到下一个断点处,没有断点则直接执行至程序结束。
  15. until line:无视任何条件,直接跳转至line行。
  16. finish:略过所有断点,直接执行剩下的所有语句,正常的结束当前函数。
  17. return:立即结束(停止)执行当前函数,并指函数的定返回值
  18. delete breakpoints(d):删除所有断点。
  19. delete breakpoints(d) n:删除编号为n的断点。
  20. disable breakpoints(disable):禁用所有断点。
  21. disable breakpoints(disable) n:禁用编号为n的断点。
  22. enable breakpoints(enable):启用所有断点。
  23. enable breakpoints(enable) n:启用编号为n的断点。
  24. p val:打印一次val变量的值,但只显示一次。
  25. display val:跟踪变量val。每次输入命令之后,都会紧接着显示变量val的值。
  26. info display:显示所有跟踪变量的信息。
  27. undisplay:取消对所有变量的跟踪。
  28. undisplay n:取消对编号为n的变量的跟踪。
  29. disable display <n>:禁用对所有(编号为n)的变量跟踪。
  30. set variable/var val = x:将变量val的值改为x,一般用于特殊情况的测试,不过有一定的风险性,而且一般不常用。
  31. breaktrace(bt):查看各级函数调用及参数,可以类比VS中的查看调用栈帧。
  32. quit(q):退出gdb

其它

  1. 有时我们打开gdb时会显示一些提示信息,感觉很冗余,如果想要不显示,可以在使用gdb时加上一个-q参数
  2. 如果不输入任何东西直接回车,默认是执行上一次的命令

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

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

相关文章

笔记1.5:计算机网络体系结构

从功能上描述计算机网络结构 分层结构 每层遵循某个网络协议完成本层功能 基本概念 实体&#xff1a;表示任何可发送或接收信息的硬件或软件进程。 协议是控制两个对等实体进行通信的规则的集合&#xff0c;协议是水平的。 任一层实体需要使用下层服务&#xff0c;遵循本层…

uniapp 小程序 父组件调用子组件方法

答案&#xff1a;配合小程序API > this.selectComponent("")&#xff0c;来选择组件&#xff0c;再使用$vm选择组件实例&#xff0c;再调用方法&#xff0c;或者data 1 设置组件的id,如果你的多端&#xff0c;请跟据情况设置ref,class,id&#xff0c;以便通过小…

一阶低通滤波器滞后补偿算法

一阶低通滤波器的推导过程和双线性变换算法请查看下面文章链接: PLC算法系列之数字低通滤波器(离散化方法:双线性变换)_双线性离散化_RXXW_Dor的博客-CSDN博客PLC信号处理系列之一阶低通(RC)滤波器算法_RXXW_Dor的博客-CSDN博客_rc滤波电路的优缺点1、先看看RC滤波的优缺点…

Redis 篇

1、为什么要用缓存&#xff1f; 使用缓存的目的就是提升读写性能。而实际业务场景下&#xff0c;更多的是为了提升读性能&#xff0c;带来更好的性能&#xff0c;带来更高的并发量。 Redis 的读写性能比 Mysql 好的多&#xff0c;我们就可以把 Mysql 中的热点数据缓存到 Redis…

Linux学习第14天:Linux设备树(一):枝繁叶茂见晴天

本节笔记主要学习了Linux设备树相关知识点&#xff0c;由于内容较多&#xff0c;打算分两天进行总结。今天着重学习Linux设备树&#xff0c;主要包括前三节内容&#xff0c;分别是概念、格式和语法。 本节思维导图内容如下&#xff1a; 一、什么是设备树 设备树可以用一个图来进…

Vivado XADC IP核 使用详解

本文介绍Vivado中XADC Wizard V3.3的使用方法。 XADC简介 XADC Wizard Basic Interface Options&#xff1a; 一共三种&#xff0c;分别是AXI4Lite、DRP、None。勾选后可在界面左侧看到相应通信接口情况。Startup Channel Selection Simultaneous Selection&#xff1a;同时监…

长胜证券:煤价突破900元大关 GLP-1减重药进入集中获批期

上星期五&#xff0c;两市股指早盘震动上扬&#xff0c;午后回落走低。到收盘&#xff0c;沪指跌0.28%报3117.74点&#xff0c;深成指跌0.52%报10144.59点&#xff0c;创业板指涨跌0.45%报2002.73点&#xff0c;科创50指数涨0.71%&#xff1b;两市合计成交7217亿元&#xff0c;…

【算法训练-二叉树 一】【遍历二叉树】前序遍历、中序遍历、后续遍历、层序遍历、锯齿形层序遍历、二叉树右视图

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【二叉树的遍历】&#xff0c;使用【二叉树】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为…

OmniShade - Mobile Optimized Shader

OmniShade Pro是一款专为移动设备设计的高性能着色器。它包含多种技术,使其几乎可以实现从现实到卡通到动漫的任何外观,但由于自适应系统仅计算任何功能集所需的内容,它的速度也非常快。 它旨在弥合Unity的标准着色器和移动着色器之间的差距,但由于其高级别的风格化、组合…

浏览器事件机制详解

目录 前言 事件类型 鼠标事件 表单事件 窗口事件 DOM事件 多媒体事件 拖拽与放置事件 移动设备事件 剪切板事件 错误事件 过渡、动画事件 事件监听 onevent addEventListener(event) 事件触发 事件流程 捕获阶段 目标阶段 冒泡阶段 事件对象 总结 相关代…

Pyhton压缩JS代码

文章目录 1.安装依赖2.目录结构3.代码4.执行结果 1.安装依赖 pip install jsmin2.目录结构 3.代码 import jsmindef run(src_path, tgt_path):with open(src_path, "r", encodingutf-8) as input_file:with open(tgt_path, "w", encodingutf-8) as outpu…

【Java 基础篇】Java 字节流详解:从入门到精通

Java中的字节流是处理二进制数据的关键工具之一。无论是文件操作、网络通信还是数据处理&#xff0c;字节流都发挥着重要作用。本文将从基础概念开始&#xff0c;深入探讨Java字节流的使用&#xff0c;旨在帮助初学者理解和掌握这一重要主题。 什么是字节流&#xff1f; 在Ja…

Claude 使用指南 | 可与GPT-4媲美的语言模型

本文全程干货&#xff0c;让你轻松使用上claude&#xff0c;这也是目前体验cluade的唯一途径&#xff01;废话不多说&#xff0c;直接上教程&#xff0c;cluade的能力不逊于GPT4&#xff0c;号称是ChatGPT4.0最强竞品。相对Chatgpt来说&#xff0c;Claude不仅是完全免费的&…

springboot集成kafka

创建工程 父工程pom 父工程做了子工程管理和包管理 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocati…

深度解析NLP文本摘要技术:定义、应用与PyTorch实战

目录 1. 概述1.1 什么是文本摘要&#xff1f;1.2 为什么需要文本摘要&#xff1f; 2. 发展历程2.1 早期技术2.2 统计方法的崛起2.3 深度学习的应用2.4 文本摘要的演变趋势 3. 主要任务3.1 单文档摘要3.2 多文档摘要3.3 信息性摘要 vs. 背景摘要3.4 实时摘要 4. 主要类型4.1 抽取…

【Leetcode热题】打卡day1——10

目录 1、两数之和 - 哈希表 1、两数之和 - 哈希表 1. 两数之和 思路&#xff1a; 建立map&#xff0c;mp[nums[i]]i 存储值所对应的下标 顺序遍历每一个元素&#xff0c;先查找mp中是否存在与nums[i]匹配的值&#xff08;target-nums[i]&#xff09; 如果存在&#xff0c;则返…

伊朗市场最全开发攻略

伊朗是是古代波斯帝国的继承者&#xff0c;是中东和北非区第二大经济体&#xff0c;紧随沙特阿拉伯之后。它拥有庞大的人口、丰富的自然资源和逐渐增长的实力。也是世界上拥有最大储油量的国家之一&#xff0c;石油、天然气和铜等战略资源得天独厚。 南非的拉马福萨在2023年金…

Python爬虫自动切换爬虫ip的完美方案

在进行网络爬虫时&#xff0c;经常会遇到需要切换爬虫ip的情况&#xff0c;以绕过限制或保护自己的爬虫请求。今天&#xff0c;我将为你介绍Python爬虫中自动切换爬虫ip的终极方案&#xff0c;让你的爬虫更加高效稳定。 步骤一&#xff1a;准备爬虫ip池 首先&#xff0c;你需要…

设计模式之十:状态模式

状态模式通过改变对象内部的状态来帮助对象控制自己的行为。 这是一张状态图&#xff0c;其中每个圆圈都是一个状态。 最简单&#xff0c;第一反应的实现就是使用一个变量来控制状态值&#xff0c;并在方法内书写条件代码来处理不同情况。 package headfirst.designpatterns.…

为什么有了IP地址还需要MAC地址?

上午好&#xff0c;我的网工朋友。 今天想和你聊聊Mac地址。 到底啥是Mac地址&#xff1f;官方直译是媒体存取控制位址&#xff0c;是一个用来确认网络设备位置的位址。 在OSI模型中&#xff0c;第三层网络层负责IP地址&#xff0c;第二层数据链路层则负责MAC位址。 MAC地址…