多亏了这篇文章,我的开发效率远远领先于我的同事

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~

本文由独木桥先生发表于云+社区专栏

介绍

如果您有从Linux服务器上的源代码安装软件的经验,您可能会遇到make实用程序。该工具主要用于自动编译和构建程序。它允许应用程序的作者轻松地布置构建该特定项目所需的步骤。

尽管make是为自动化软件编译而创建的,但该工具的设计灵活性足以使其可以自动执行几乎任何可以从命令行完成的任务。在本教程中,我们将讨论如何重新调整make以自动执行按顺序发生的重复性任务。

我们将在Ubuntu上进行演示,但它应该在几乎任何Linux服务器上以类似的方式运行。

安装Make

在我们开始使用make之前,我们需要安装它。

虽然我们可以按名称安装它,但它通常与其他帮助您编译软件的工具一起安装。我们将安装所有这些因为它们总体上非常有用。有一个名为“build-essential”的包,其中包含make和其他程序:

sudo apt-get update
sudo apt-get install build-essential

现在,您拥有的工具可以让您以通常的容量利用make。

了解Makefile

make命令接收指令的主要方法是使用Makefile。

从手册页中,我们可以看到make将查找名为GNUmakefile的文件,然后查找makefile,然后查找Makefile。它建议您使用Makefile,因为GNUmakefile是针对GNU特定的命令,而makefile并不突出。

Makefile是特定于目录的,这意味着make将在调用它的目录中搜索以查找这些文件。因此,我们应该将Makefile放在我们将要执行的任务的根目录中,或者调用我们将要编写的脚本最有意义的地方。

在Makefile中,我们遵循特定的格式。以这种方式使用目标,源和命令的概念:

target: sourcecommand

这种对齐和格式非常重要,因为make很挑剔。我们将在这里讨论每个组件的格式和含义:

target

target是用户指定的名称,用于引用一组命令。可以认为它类似于编程语言中的简单函数。

target在左侧列上对齐,是连续的单词(无空格),以冒号(:)结尾。

调用make时,我们可以通过输入以下内容来指定target:

make target_name

然后,Make将检查Makefile并执行与该target关联的命令。

source

source是对文件或其他target的引用。它们代表与之关联的目标的准备或依赖关系。

例如,您可以将make文件的一部分看起来像这样:

target1: target2target1_commandtarget2:target2_command

在这个例子中,我们可以像这样调用target1:

make target1

然后Make将转到Makefile并搜索“target1”目标。然后它会检查是否有指定的来源。

它会找到“target2”源依赖项并暂时跳转到该目标。

从那里,它将检查target2是否列出了任何来源。它没有,所以它将继续执行“target2命令”。此时,make将到达“target2”命令列表的末尾,并将控制权传递回“target1”目标。然后它将执行“target1命令”并退出。

source可以是文件或目标本身。使用文件时间戳来查看自上次调用以来文件是否已更改。如果已对源文件进行了更改,则重新运行该目标。否则,它将依赖关系标记为已完成并继续到下一个源,或者命令(如果这是唯一的源)。

一般的想法是,通过添加源,我们可以构建一组必须在当前目标之前执行的顺序依赖项。您可以在任何目标之后指定多个以空格分隔的源。您可以开始了解如何指定精细的任务序列。

command

make命令具有这种灵活性的原因是语法的命令部分是非常开放的。您可以指定要在目标下运行的任何命令。您可以根据需要添加任意数量的命令。

命令在目标声明后的行上指定。它们由一个制表符缩进。某些版本的make对于缩进命令部分的方式很灵活,但一般来说,您应该坚持使用单个选项卡以确保make能够识别您的意图。

Make将目标定义下的每个缩进行视为单独的命令。您可以根据需要添加任意数量的缩进行和命令。Make会一次一个地浏览它们。

在命令告诉make以不同的方式处理它们之前,我们可以放置一些东西:

  • -:命令前的破折号告诉make如果遇到错误则不中止。例如,如果要对文件执行命令(如果存在),则此操作可能很有用,如果不存在则不执行任何操作。
  • @:如果使用“@”符号引导命令,则命令调用本身不会打印到标准输出。这主要用于清理产生的输出。

附加功能

一些其他功能可以帮助您在Makefile中创建更复杂的规则链。

变量

Make识别变量(或宏),它在makefile中作为替换的简单占位符。最好在文件顶部声明这些内容。每个变量的名称都完全大写。在名称后面,等号将名称分配给右侧的值。例如,如果我们想要将安装目录定义为/usr/bin,我们可以在文件顶部添加:

INSTALLDIR=/usr/bin

稍后在文件中,我们可以使用以下语法引用此位置:

$(INSTALLDIR)

跨越多行

我们可以做的另一个有用的事情是允许命令跨越多行。

“”来表示跨行:

target: sourcecommand1 arg1 arg2 arg3 arg4 \arg5 arg6

如果你利用shell的一些更多编程功能,比如if-then语句,这就变得更加重要:

target: sourceif [ "condition_1" == "condition_2" ];\then\command to execute;\another command;\else\alternative command;\fi

这将执行此块,就好像它是一行命令一样。事实上,我们可以把它写成一行,但它提高了可读性,大大地将其分解为这样。

如果要转义行尾字符,请确保在“”后面没有任何多余的空格或制表符,否则您将收到错误。

文件后缀规则

如果进行文件处理,可以使用的另一个功能是文件后缀。这些是一般规则,提供了一种基于扩展名处理文件的方法。

例如,如果您想要处理目录中的所有.jpg文件并使用ImageMagick套件将它们转换为.png文件,我们可以在Makefile中使用以下内容:

.SUFFIXES: .jpg .png.jpg.png:@echo converting $< to $@convert $< $@

第一部分是.SUFFIXES:声明。这告诉make我们将在文件后缀中使用的所有后缀。默认情况下包含一些常用于编译源代码的后缀,如“.c”和“.o”文件,不需要在此声明中标记。

下一部分是实际后缀规则的声明。这基本上采取以下形式:

original_extension.target_extension:

这不是一个实际的目标,但它将匹配任何具有第二个扩展名的文件的调用,并在第一个扩展名中将它们构建出文件。

在我们的例子中,如果在我们的目录中有“file.jpg”,我们可以调用make这样构建一个名为“file.png”的文件:

make file.png

Make将在.SUFFIXES声明中看到png文件,并查看用于创建“.png”文件的规则。然后它将在目录中查找“.png”替换为“.jpg”的目标文件。然后它将执行后面的命令。

后缀规则使用了一些我们尚未介绍的变量。这些帮助根据当前流程的哪个部分替换不同的信息:

  • $?:此变量包含当前目标的比目标更新的依赖项列表。这些将是在执行此目标下的命令之前必须重新完成的目标。
  • $@:此变量是当前目标的名称。这允许我们引用您尝试制作的文件,即使此规则通过模式匹配。
  • $<:这是当前依赖项的名称。对于后缀规则,这是用于创建目标的文件的名称。在我们的示例中,这将包含“file.jpg”
  • $*:此文件是剥离匹配扩展名的当前依赖项的名称。将此视为目标文件和源文件之间的中间阶段。

创建转换Makefile

我们将创建一个Makefile,它将执行一些图像处理,然后将文件上传到我们的文件服务器,以便我们的网站可以显示它们。

如果您想跟随,请在开始之前下载ImageMagick转换工具。这些是用于操作图像的简单命令行工具,我们将在脚本中使用它们:

sudo apt-get update
sudo apt-get install imagemagick

在当前目录中,创建一个名为Makefile的文件:

nano Makefile

在此文件中,我们将开始实施转化目标。

将所有JPG文件转换为PNG

我们的服务器已设置为专门为.png图像提供服务。因此,我们需要在上传之前将任何.jpg文件转换为.png。

如上所述,后缀规则是一种很好的方法。我们将从.SUFFIX声明开始,列出我们之间转换的格式:

.SUFFIXES: .jpg .png

之后,我们可以制定一个将.jpg文件更改为.png文件的规则。我们可以使用ImageMagick套件中的convert命令来完成此操作。convert命令很简单,其语法是:

convert from_file to_file

要实现此命令,我们需要后缀规则来指定我们开始使用的格式以及我们结束的格式:

.SUFFIXES: .jpg .png.jpg.png:           ## This is the suffix rule declaration

现在我们有了匹配的规则,我们需要实现实际的转换步骤。

因为我们不确切知道这里将匹配什么文件名,所以我们需要使用我们学到的变量。具体来说,我们需要引用$<作为原始文件,以及$@作为我们要转换的文件。如果我们将此与我们对convert命令的了解结合起来,我们就会得到以下规则:

.SUFFIXES: .jpg .png.jpg.png:convert $< $@

让我们添加一些功能,以便明确告诉我们echo语句发生了什么。我们将在新命令和我们已经拥有的命令之前包含“@”符号,以便在执行时打印实际命令:

.SUFFIXES: .jpg .png.jpg.png:@echo converting $< to $@ using ImageMagick...@convert $< $@@echo conversion to $@ successful!

此时,我们应该保存并关闭文件,以便我们可以测试它。

获取jpg文件到当前目录。如果您手边没有文件,可以输入以下内容从腾讯云网站获取:

wget https://ask.qcloudimg.com/raw/qctrain/yehe-b5f4bb2e421e9/1kp7y81up9.jpg
mv digitalocean-badge-blue.jpg badge.jpg

您可以通过要求它创建badge.png文件来测试您的make文件是否正常工作:

make badge.png
converting badge.jpg to badge.png using ImageMagick...
conversion to badge.png successful!

Make将转到Makefile,请参阅.SUFFIXES声明中的.png,然后转到匹配的后缀规则。然后运行列出的命令。

创建文件列表

此时,如果我们明确告诉它我们想要该文件,make可以创建一个.png文件。

如果它只是在当前目录中创建一个.jpg文件列表然后转换它们会更好。我们可以通过创建一个包含要转换的所有文件的变量来实现。

执行此操作的最佳方法是使用wildcard指令:

JPG_FILES=$(wildcard *.jpg)

我们可以用这样的bash通配符指定一个目标:

JPG_FILES=*.jpg

但这有一个缺点。如果没有.jpg文件,这实际上会尝试在名为“*.jpg”的文件上运行转换命令,这将失败。

我们上面提到的通配符语法编译当前目录中的.jpg文件列表,如果不存在,则不会将变量设置为任何内容。

虽然我们这样做,但我们应该尝试处理常见的.jpg文件的轻微变化。这些图像文件通常使用.jpeg扩展名而不是.jpg。为了以理智的方式处理这些问题,我们可以将程序中的名称更改为.jpg文件,以便我们的处理行更简单:

我们将使用以下两个代替上述内容:

JPEG=$(wildcard *.jpg *.jpeg)     ## Has .jpeg and .jpg files
JPG=$(JPEG:.jpeg=.jpg)            ## Only has .jpg files

第一行编译当前目录中的.jpg和.jpeg文件列表,并将它们存储在一个名为JPEG的变量中。

第二行引用此变量并执行简单的名称转换,将JPEG变量中以.jpeg结尾的名称转换为以.jpg结尾的名称。

这是通过以下语法完成的:

$(VARNAME:.convert_from=.convert_to)

在这两行的末尾,我们将有一个名为JPG的新变量,它只包含.jpg文件名。其中一些文件可能实际上并不存在于系统上,因为它们实际上是.jpeg文件(没有发生实际的重命名)。这没关系,因为我们只使用此列表来创建我们要创建的.png文件的新列表:

JPEG=$(wildcard *.jpg *.jpeg)
JPG=$(JPEG:.jpeg=.jpg)
PNG=$(JPG:.jpg=.png)

现在,我们有一个我们想要在变量PNG中请求的文件列表。此列表仅包含.png文件名,因为我们进行了另一个名称转换。现在,此目录中的每个.jpg或.jpeg文件都用于编译我们要创建的.png文件列表。

我们还需要更新.SUFFIXES声明和后缀规则,以反映我们现在正在处理.jpeg文件:

JPEG=$(wildcard *.jpg *.jpeg)
JPG=$(JPEG:.jpeg=.jpg)
PNG=$(JPG:.jpg=.png)
.SUFFIXES: .jpg .jpeg .png.jpeg.png .jpg.png:@echo converting $< to $@ using ImageMagick...@convert $< $@@echo conversion to $@ successful!

如您所见,我们已将.jpeg添加到后缀列表中,并为我们的规则添加了另一个后缀匹配项。

创建一些Targets

我们现在在Makefile中有很多,但我们还没有任何正常的目标。让我们解决这个问题,以便我们可以将PNG列表传递给后缀规则:

JPEG=$(wildcard *.jpg *.jpeg)
JPG=$(JPEG:.jpeg=.jpg)
PNG=$(JPG:.jpg=.png)
.SUFFIXES: .jpg .jpeg .pngconvert: $(PNG).jpeg.png .jpg.png:@echo converting $< to $@ using ImageMagick...@convert $< $@@echo conversion to $@ successful!

所有这些新目标都列出了我们收集的.png文件名作为要求。然后看看是否有一种方法可以获取.png文件并使用后缀规则来执行此操作。

现在,我们可以使用此命令将我们所有的.jpg和.jpeg文件转换为.png文件:

make convert

让我们添加另一个目标。将图像上传到服务器时通常要完成的另一项任务是调整它们的大小。使图像具有正确的大小将使用户无需在请求时动态调整图像大小。

ImageMagick的mogrify命令可以按照我们需要的方式调整图像大小。假设我们的图片将在我们的网站上显示的区域是500px宽。我们可以使用以下命令转换此区域:

mogrify -resize 500\> file.png

这将调整大于500px宽的任何图像以适应此区域,但不会触摸较小的图像。这就是我们想要的。作为目标,我们可以添加以下规则:

resize: $(PNG)@echo resizing file...@mogrify -resize 648\> $(PNG)@echo resizing is complete!

我们可以像这样添加到我们的文件中:

JPEG=$(wildcard *.jpg *.jpeg)
JPG=$(JPEG:.jpeg=.jpg)
PNG=$(JPG:.jpg=.png)
.SUFFIXES: .jpg .jpeg .pngconvert: $(PNG)resize: $(PNG)@echo resizing file...@mogrify -resize 648\> $(PNG)@echo resizing is complete!.jpeg.png .jpg.png:@echo converting $< to $@ using ImageMagick...@convert $< $@@echo conversion to $@ successful!

现在,我们可以将这两个目标串在一起作为另一个目标的依赖关系:

JPEG=$(wildcard *.jpg *.jpeg)
JPG=$(JPEG:.jpeg=.jpg)
PNG=$(JPG:.jpg=.png)
.SUFFIXES: .jpg .jpeg .pngwebify: convert resizeconvert: $(PNG)resize: $(PNG)@echo resizing file...@mogrify -resize 648\> $(PNG)@echo resizing is complete!.jpeg.png .jpg.png:@echo converting $< to $@ using ImageMagick...@convert $< $@@echo conversion to $@ successful!

您可能会注意到隐式调整大小将运行与convert相同的命令。我们将指定它们两者,尽管并非总是如此。转换可以在将来包含更精细的处理。

webify目标现在可以转换图像并调整其大小。

将文件上载到远程服务器

现在我们已经为Web准备好了镜像,我们可以创建一个目标,将它们上传到我们服务器上的静态图像目录。

我们可以通过将转换后的文件列表传递给scp来实现:

我们的目标看起来像这样:

upload: webifyscp $(PNG) root@ip_address:/path/to/static/images

这会将我们的所有文件上传到远程服务器。我们的文件现在看起来像这样:

JPEG=$(wildcard *.jpg *.jpeg)
JPG=$(JPEG:.jpeg=.jpg)
PNG=$(JPG:.jpg=.png)
.SUFFIXES: .jpg .jpeg .pngupload: webifyscp $(PNG) root@ip_address:/path/to/static/imageswebify: convert resizeconvert: $(PNG)resize: $(PNG)@echo resizing file...@mogrify -resize 648\> $(PNG)@echo resizing is complete!.jpeg.png .jpg.png:@echo converting $< to $@ using ImageMagick...@convert $< $@@echo conversion to $@ successful!

清理

让我们添加一个清理选项,以便在将所有本地.png文件上传到远程服务器后将其删除:

clean:rm *.png

现在,我们可以在顶部添加另一个目标,在我们将文件上传到远程服务器之后调用此目标。这将是最完整的目标,也是我们想要默认的目标。

为了指定这一点,我们将把它作为第一个可用的目标。这将用作默认值。我们将按惯例称之为“全部”:

JPEG=$(wildcard *.jpg *.jpeg)
JPG=$(JPEG:.jpeg=.jpg)
PNG=$(JPG:.jpg=.png)
.SUFFIXES: .jpg .jpeg .pngall: upload cleanupload: webifyscp $(PNG) root@ip_address:/path/to/static/imageswebify: convert resizeconvert: $(PNG)resize: $(PNG)@echo resizing file...@mogrify -resize 648\> $(PNG)@echo resizing is complete!clean:rm *.png.jpeg.png .jpg.png:@echo converting $< to $@ using ImageMagick...@convert $< $@@echo conversion to $@ successful

通过这些最后的操作,如果您使用Makefile和.jpg或.jpeg文件进入目录,您可以调用make而不使用任何参数来处理文件,将它们发送到您的服务器,然后删除您上传的.png文件。

make

正如您所看到的,很容易将任务串联在一起,并且可以选择一个流程到某一点。例如,如果您只想转换文件并需要在不同的服务器上托管它们,则可以使用webify目标。

结论


此时,您应该很好地了解如何使用Makefile。更具体地说,您应该知道如何使用make作为自动执行大多数过程的工具。

虽然在某些情况下编写一个简单的脚本可能更容易,但Makefile是在流程之间建立结构化的层次关系的简单方法。学习如何利用这个工具可以帮助简化重复性任务。更多Makefile的教程请前往腾讯云+社区学习更多知识。


参考文献:《How To Use Makefiles to Automate Repetitive Tasks on an Ubuntu VPS》

问答
BeautifulSoup和Scrapy爬虫之间的区别?
相关阅读
腾讯云数据库回档解决方案
大数据在教育行业的研究与应用
看看上下文映射的清晰视图
【每日课程推荐】新加坡南洋理工大学博士,带你深度学习NLP技术

此文已由作者授权腾讯云+社区发布,更多原文请点击

搜索关注公众号「云加社区」,第一时间获取技术干货,关注后回复1024 送你一份技术课程大礼包!

海量技术实践经验,尽在云加社区!

转载于:https://www.cnblogs.com/qcloud1001/p/9593663.html

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

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

相关文章

Free SQLSever 2008的书

Introducing SQL Server 2008 http://csna01.libredigital.com/?urss1q2we6这是一本提供自由使用书&#xff01;我把它翻译&#xff0c;或转送有什么关系&#xff01;这样的书还是有几本吧&#xff0c;Introducing Linq,Introducting Silverlight,都是啊&#xff01;嘿嘿。。。…

流式数据分析_流式大数据分析

流式数据分析The recent years have seen a considerable rise in connected devices such as IoT [1] devices, and streaming sensor data. At present there are billions of IoT devices connected to the internet. While you read this article, terabytes and petabytes…

oracle failover 区别,Oracle DG failover 实战

Oracle dataguardfailover实战操作步骤备库&#xff1a;SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE;SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;SQL> SHUTDOWN IMMEDIATE;SQL> STARTUP;添加临时文件&#xff0c;删除老的临时文…

Jenkins自动化CI CD流水线之8--流水线自动化发布Java项目

一、前提 插件&#xff1a;Maven Integration plugin 环境&#xff1a; maven、tomcat 用的博客系统代码&#xff1a; git clone https://github.com/b3log/solo.git 远端git服务器&#xff1a; [gitgit repos]$ mkdir -p solo [gitgit repos]$ cd solo/ [gitgit solo]$ git --…

oracle数据泵导入很慢,impdp导入效率的问题

内网从一台服务器A导入到另一台服务器B&#xff0c;38G的数据半个多小时才导了一个表。原来B库上是有数据的&#xff0c;是不是因为TABLE_EXISTS_ACTIONREPLACE 导致速度慢了&#xff1f;parallel8也不知道会不会设高了。SQL> show parameter cpuNAME …

BZOJ2597 WC2007剪刀石头布(费用流)

考虑使非剪刀石头布情况尽量少。设第i个人赢了xi场&#xff0c;那么以i作为赢家的非剪刀石头布情况就为xi(xi-1)/2种。那么使Σxi(xi-1)/2尽量小即可。 考虑网络流。将比赛建成一排点&#xff0c;人建成一排点&#xff0c;每场未确定比赛向比赛双方连边&#xff0c;确定比赛向赢…

数据科学还是计算机科学_数据科学101

数据科学还是计算机科学什么是数据科学&#xff1f; (What is data science?) Well, if you have just woken up from a 10-year coma and have no idea what is data science, don’t worry, there’s still time. Many years ago, statisticians had some pretty good ideas…

开机流程与主引导分区(MBR)

由于操作系统会提供所有的硬件并且提供内核功能&#xff0c;因此我们的计算机就能够认识硬盘内的文件系统&#xff0c;并且进一步读取硬盘内的软件文件与执行该软件来完成各项软件的执行目的 问题是你有没有发现&#xff0c;既然操作系统也是软件&#xff0c;那么我的计算机优势…

肤色检测算法 - 基于二次多项式混合模型的肤色检测。

由于CSDN博客和博客园的编辑方面有不一致的地方&#xff0c;导致文中部分图片错位&#xff0c;为不影响浏览效果&#xff0c;建议点击打开链接。 由于能力有限&#xff0c;算法层面的东西自己去创新的很少&#xff0c;很多都是从现有的论文中学习&#xff0c;然后实践的。 本文…

oracle解析儒略日,利用to_char获取当前日期准确的周数!

总的来说周数的算法有两种&#xff1a;算法一&#xff1a;iw算法&#xff0c;每周为星期一到星期日算一周&#xff0c;且每年的第一个星期一为第一周&#xff0c;就拿2014年来说&#xff0c;2014-01-01是星期三&#xff0c;但还是算为今年的第一周&#xff0c;可以简单的用sql函…

密码机

树状数组1 #include<bits/stdc.h>2 using namespace std;3 int x,y,c[200005];4 char str[20];5 int inline read(){6 int x0,f1;7 char chgetchar();8 while(ch<0||ch>9)9 chgetchar(); 10 while(ch>0&&ch<9){ 11 …

js有默认参数的函数加参数_函数参数:默认,关键字和任意

js有默认参数的函数加参数PYTHON开发人员的提示 (TIPS FOR PYTHON DEVELOPERS) Think that you are writing a function that accepts multiple parameters, and there is often a common value for some of these parameters. For instance, you would like to be able to cal…

sql management studio 附加mdf文件出错的解决办法

将mdf文件所在文件夹的权限改为everyone.&#xff0c;完全控制即可。

oracle raise_application_error,RAISE_ APPLICATION_ ERROR--之异常处理

平时用来测试的异常处理我们都是通过dbms_output.put_line来输出异常信息&#xff0c;但是在实际的应用中&#xff0c;需要把异常信息返回给调用的客户端。其实 RAISE_APPLICATION_ERROR 是将应用程序专有的错误从服务器端转达到客户端应用程序(其他机器上的SQLPLUS或者其他前台…

金融信息交换协议

随着网络的使用&#xff0c;目前所有大型的金融机构都已经实现了自动化和数字化。当中肯定少不了互联网的加入&#xff0c;那么在这当中&#xff0c;我们主要介绍一下FIX协议。它是由国际FIX协会组织提供的一个开放式协议&#xff0c;目的是推动国际贸易电子化的进程&#xff0…

2018大数据学习路线从入门到精通

最近很多人问小编现在学习大数据这么多&#xff0c;他们都是如何学习的呢。很多初学者在萌生向大数据方向发展的想法之后&#xff0c;不免产生一些疑问&#xff0c;应该怎样入门&#xff1f;应该学习哪些技术&#xff1f;学习路线又是什么&#xff1f;今天小编特意为大家整理了…

相似邻里算法_纽约市-邻里之战

相似邻里算法IBM Data Science Capstone ProjectIBM Data Science Capstone项目 分析和可视化与服装店投资者的要求有关的纽约市结构 (Analyzing and visualizing the structure of New York City in relation to the requirements of a Clothing Store Investor) 介绍 (Introd…

一、面向对象

第一节&#xff1a;面向对象编程1.面向对象三大原则&#xff1a;封装&#xff1a;就是把客观事物封装成抽象的类&#xff0c;并且类可以把自己的数据和方法只让可信的类或者对象操作&#xff0c;对不可信的进行信息隐藏。继承&#xff1a;继承&#xff0c;指可以让某个类型的对…

[poj 1364]King[差分约束详解(续篇)][超级源点][SPFA][Bellman-Ford]

题意 有n个数的序列, 下标为[1.. N ], 限制条件为: 下标从 si 到 sini 的项求和 < 或 > ki. 一共有m个限制条件. 问是否存在满足条件的序列. 思路 转化为差分约束, 就是 即 Si 为第 i 项的前缀和, 特别的 So 为0. 转化不等式(连续子段和变为前缀和之差 > < 变为 &g…

linux质控命令,Linux下microRNA质控-cutadapt安装

如果Linux系统已安装pip或conda&#xff0c;cutadapt的安装相对简便一些&#xff0c;示例如下&#xff1a;1.pip安装pip install --user --upgrade cutadapt添加环境变量echo export PATH$PATH:/your path/cutadapt-1.10/bin >> ~/.bashrc2.conda安装conda install -c b…