【小野森森源码】【购买核销源码】【设计logo源码】多个patch源码_fetch源码

时间:2024-11-26 09:27:31 来源:debian源码下载 分类:知识

1.Rust Cargo使用指南 | 第八篇 | 依赖覆盖
2.swin transformer理解要点
3.linux下的patch命令
4.请问Linux中patch产生的源源码信息怎么看,+-是源源码什么意思?
5.如何使用git 发patch

多个patch源码_fetch源码

Rust Cargo使用指南 | 第八篇 | 依赖覆盖

       依赖覆盖在本地开发中是常见的,通常是源源码为了在某个包发布到crates.io之前使用它。

       通过多种引用方式引入一个包也是源源码一种依赖覆盖。

       假设项目正在使用uuid依赖包,源源码但不幸地发现了一个bug。源源码小野森森源码由于这个bug影响了使用,源源码无法等到官方提交新版本,源源码因此还是源源码自己修复为好。

       为了修复bug,源源码需要将uuid的源源码源码克隆到本地,克隆到和项目同级的源源码购买核销源码目录下。

       修改项目的源源码Cargo.toml,添加以下内容以引入本地克隆的源源码版本。

       这里使用自己修改过的源源码patch来覆盖来自crates.io的版本,由于克隆下来的uuid目录和项目同级,因此通过相对路径"../uuid"即可定位到。

       在成功为uuid打了本地补丁后,尝试在项目下运行cargo build,但却报错了。

       具体原因比较复杂,但仔细观察会发现克隆下来的uuid的版本是v1.0.0-alpha.1,然后本地引入的设计logo源码uuid版本是0.8.2。根据crates.io的版本规则,这两者是不兼容的。

       既然如此,先将"../uuid/Cargo.toml"中的version="1.0.0-alpha.1"修改为version="0.8.3",然后看看结果。

       大家注意到最后一行了吗?成功使用本地的0.8.3版本的uuid作为最新的依赖,因此也侧面证明了补丁patch的版本也必须遵循相应的版本兼容规则。

       如果修改后仍有问题,可以试试以下命令,指定版本进行更新。

       修复bug后,核心源码spring可以提交pr给uuid,一旦pr被合并到了master分支,可以按照以下方式使用补丁。

       等未来新的内容更新到crates.io后,可以移除这个补丁,直接更新[dependencies]中的uuid版本即可。

       假设要为uuid包新增一个特性,并已经修改完毕,在本地测试过,并提交了相应的pr,下面来看看如何在它发布到crates.io之前继续使用。hbase项目源码

       为了使用新加的特性,同时当该包在未来发布到crates.io后,可以自动使用crates.io上的新版本,而无需再使用patch补丁,可以这样修改Cargo.toml。

       注意,将[dependencies]中的uuid版本提前修改为1.0.1,由于该版本在crates.io尚未发布,因此patch版本会被使用。

       现在,项目是基于patch版本的uuid来构建,也就是从github的master分支中拉取最新的commit来构建。

       一旦未来crates.io上有1.0.1版本,项目就会继续基于crates.io来构建,此时,patch就可以删除了。

       假设项目A的依赖是B和uuid,而B的依赖也是uuid,此时可以配置A和B都使用来自github的patch版本。

       如上所示,patch不仅仅对于my-binary项目有用,对于my-binary的依赖my-library来说,一样可以间接生效。

       若要覆盖的依赖不是来自crates.io,就需要对[patch]做一些修改。

       若要发布一个大版本2.0.0,可以将Cargo.toml修改如下。

       此时2.0版本在crates.io上还不存在,因此使用了patch版本且指定了branch="2.0.0"。

       这里需要注意,与之前的小版本不同,大版本的patch不会发生间接的传递。

       在之前章节中介绍过如何使用package key来重命名依赖包,现在来看看如何使用它同时引入多个patch。

       为了满足两个patch需求,可以使用如下内容的Cargo.toml。

       第一行说明,第一个patch从官方仓库main分支的最新commit拉取,而第二则从我们自己的仓库拉取v2分支,同时将其重命名为serde2。

       这样,在代码中就可以分别通过serde和serde2引用不同版本的依赖库了。

       有时只是临时性地对一个项目进行处理,因此并不想去修改它的Cargo.toml,可以使用Cargo提供的路径覆盖方法。

       与[patch]修改Cargo.toml不同,路径覆盖修改的是Cargo自身的配置文件$Home/.cargo/config.toml。

       paths数组中的元素是一个包含Cargo.toml的目录(依赖包),在当前例子中,由于只有一个uuid,因此只需要覆盖它即可。

       不推荐的[replace]已经被标记为deprecated,并将在未来被移除,请使用[patch]替代。

       虽然不建议使用,但如果阅读其它项目时依然可能会碰到这种用法。

swin transformer理解要点

        这是跑通的分类以及分割源码介绍,大家有需要可以参考一下:

        1、 Swin-Transformer分类源码(已跑通)

        2、 Swin-Transformer分割源码(已跑通)

        3、 Swin-Unet(分割改编)

        我们假设图片的大小是×的,窗口大小是固定的,7×7。这里每个方框都是一个窗口,每个窗口是固定有7×7个patch,但是patch的大小是不固定的,它会随着patch merging的操作而发生变化。比如我们看这儿,patch大小是4×4的,那怎么变成8×8呢?我们把周边4个窗口的patch拼在一起,相当于patch扩大了2×2倍,从而得到8×8大小的patch。

        我们发现经过这一系列的操作之后,patch的数目在变少,最后整张图只有一个窗口,7个patch。所以我们可以认为降采样是指让patch的数量减少,但是patch的大小在变大。

        这便是对ViT的一个改进,ViT从头至尾都是对全局做self-attention,而swin-transformer是一个窗口在放大的过程,然后self-attention的计算是以窗口为单位去计算的,这样相当于引入了局部聚合的信息,和CNN的卷积过程很相似,就像是CNN的步长和卷积核大小一样,这样就做到了窗口的不重合,区别在于CNN在每个窗口做的是卷积的计算,每个窗口最后得到一个值,这个值代表着这个窗口的特征。而swin transformer在每个窗口做的是self-attention的计算,得到的是一个更新过的窗口,然后通过patch merging的操作,把窗口做了个合并,再继续对这个合并后的窗口做self-attention的计算。

        其实这边困扰了我一小下,因为我们印象中降采样都是像CNN一样,会变小,但是swin transformer没有给我们变小的感觉。其实这就是感受野没理解到位的问题,CNN到最后,设计适当,最后一个特征图的感受野是可以放大到整张图的,swin transformer最后一个stage也是一个窗口涵盖了整张图。

        Swin-transformer是怎么把复杂度降低的呢? Swin Transformer Block这个模块和普通的transformer的区别就在于W-MSA,而它就是降低复杂度计算的大功臣。

        关于复杂度的计算,我简单的给大家介绍一下,首先是transformer本身基于全局的复杂度计算,这一块儿讲起来有点复杂,感兴趣的同学我们可以会后一起探讨推导过程。在这里,我们假设已知MSA的复杂度是图像大小的平方,根据MSA的复杂度,我们可以得出A的复杂度是(3×3)²ï¼Œæœ€åŽå¤æ‚度是。Swin transformer是在每个local windows(红色部分)计算self-attention,根据MSA的复杂度我们可以得出每个红色窗口的复杂度是1×1的平方,也就是1的四次方。然后9个窗口,这些窗口的复杂度加和,最后B的复杂度为9。

        W-MSA虽然降低了计算复杂度,但是不重合的window之间缺乏信息交流,所以想要窗口之间的信息有所交流,那么就可以把左图演化成右图这样,但是这就产生了一个问题,如此操作,会产生更多的windows,并且其中一部分window小于普通的window,比如4个window -> 9个window,windows数量增加了一倍多。这计算量又上来了。因此我们有两个目的,Windows数量不能多,window之间信息得有交流。

        我们看到,原来的图被划分了9个窗口,中间的区域A就是信息交流的证明。我们先把左上部分(蓝色以外的窗口)移动到右下,然后再用切分四块的方法去切这个图片,这时候区域A就被隔出来了,达到了我们想要的效果。

        transformer的出现并不是为了替代CNN。因为transformer有着CNN没有的功能性,它不仅可以提取特征,还可以做很多CNN做不到的事情,比如多模态融合。而swin transformer就是一个趋势,将CNN与transformer各自的优势有效的结合了起来。这是暂时对它的一些细节补充。最近听说MLP出来了,还没有细看,时代进展未免也太快了,手里针对ViT改进的文章还没投出去,就已经开始要立不住脚了。

        希望可以帮助到大家,如果你觉得这篇文章对你有一定的帮助,那就点个赞支持一下吧!如果有什么问题的话也可以在文章下面评论,我们一起交流解决问题!

        以下是我所有文章的目录,大家如果感兴趣,也可以前往查看

        👉戳右边: 打开它,也许会看到很多对你有帮助的文章

linux下的patch命令

       patch命令用于为特定软件包打补丁,该命令使用diff命令对源文件进行操作。

       æ ¼å¼ï¼špatch [选项] [原始文件 [补丁文件]]

       å¸¸ç”¨å‚数:

       -r 是一个递归选项,设置了这个选项,diff会将两个不同版本源代码目录中的所有对应文件全部都进行一次比较,包括子目录文件。

       -N 选项确保补丁文件将正确地处理已经创建或删除文件的情况。

       -u 选项以统一格式创建补丁文件,这种格式比缺省格式更紧凑些。

       -p0 选项从当前目录查找目的文件(夹)(直接使用补丁文件里面指定的路径)

       -p1 选项忽略掉第一层目录,从当前目录查找(去掉补丁文件指定路径最左的第1个'/'及前面所有内容)。

       -E 选项说明如果发现了空文件,那么就删除它

       -R 选项说明在补丁文件中的“新”文件和“旧”文件现在要调换过来了(实际上就是给新版本打补丁,让它变成老版本)

       ç¤ºä¾‹ï¼š

       1、单个文件

       é¦–先将两个文件的内容显示如下:

       $ cat test0

       

       

       

       $ cat test1

       

       

       

       *生成补丁:

       $ diff -uN test0 test1 >test1.patch

       è¿™æ ·å°†é€šè¿‡æ¯”较,生成test1的补丁文件。这里选项u表示使用同一格式输出这样产生的输出便于阅读易于修改,N表示把不存在的文件看做empty的.就算文件test0不存在,也会生成补丁。

       *把test0通过打补丁变成test1文件:

       $ patch -p0 <test1.patch

       æˆ–$patch <test1.patch

       è¿™æ ·ï¼Œtest0的内容将和test1的内容一样,但是文件名称还是test0。关于patch的选项见后面多文件有说明。当前目录下可以有test1.如果比较的时候test0是不存在的,那么这时候会生成一个test0文件。

       *把打过补丁的test0还原:

       $ patch -RE -p0<test1.patch

       æˆ–$patch -R <test1.patch

       è¿™æ ·ï¼Œtest0的内容将还原为原来没有打过补丁的状态。当前目录下可以有test1.这里的-E选项是要求patch在文件为空的时候删除文件,这个选项是不必要的因为patch是根据时间戳来判断一个文件是否存在。如果比较的时候test0是不存在的,这将会删除test0文件。

       

**

       2、多个文件的:

       é¦–先查看文件结构如下:

       1)外层目录列表:

       $ ls -p

       prj0/ prj1/

       2)子目录prj0列表:

       $ ls -p prj0

       prj0name test0

       3)子目录prj1列表:

       $ ls -p prj1

       prj1name test1

       4)文件prj0/prj0name:

       $ cat prj0/prj0name

       --------

       prj0/prj0name

       --------

       5)文件prj1/prj1name:

       $ cat prj1/prj1name

       ---------

       prj1/prj1name

       ---------

       6)文件prj0/test0:

       $ cat prj0/test0

       

       

       

       

       

       

       

       7)文件prj1/test1:

       $ cat prj1/test1

       

       

       

       

       

       

       

       *创建补丁:

       $ diff -uNr prj0 prj1 > prj1.patch

       è¿™é‡Œé¡¹u表示使用同一格式输出这样产生的输出便于阅读易于修改,N表示把不存在的文件看做empty的,r表示递归地比较子目录,比较的结果被标准重定向到文件prj1.patch中了。

       è¿è¡Œä¹‹åŽï¼Œè¾“出的就是一个补丁,描述了两个文件的不同,这个补丁就是把diff参数的第一个文件打补丁变成第二个文件的补丁文件。

       å®žé™…过程依次比较两个目录下的同名文件,如果这里不加-N就会指明prj0name和test0只在prj0中存在,prj1name和test1只在prj1中存在,这就无法比较了,所以这里为了能够比较,加上了-N选项。

       ä¸ºäº†ä¾¿äºŽç†è§£ï¼Œè¿™é‡Œç»™å‡ºprj1.patch文件的内容:

       $ cat prj1.patch

       diff -uNr prj0/prj0name prj1/prj0name

       --- prj0/prj0name -- ::. +

       +++ prj1/prj0name -- ::. +

       @@ -1,5 +0,0 @@

       ---------

       -

       -prj0/prj0name

       -

       ---------

       diff -uNr prj0/prj1name prj1/prj1name

       --- prj0/prj1name -- ::. +

       +++ prj1/prj1name -- ::. +

       @@ -0,0 +1,5 @@

       +---------

       +

       +prj1/prj1name

       +

       +---------

       diff -uNr prj0/test0 prj1/test0

       --- prj0/test0 -- ::. +

       +++ prj1/test0 -- ::. +

       @@ -1,7 +0,0 @@

       -

       -

       -

       -

       -

       -

       -

       diff -uNr prj0/test1 prj1/test1

       --- prj0/test1 -- ::. +

       +++ prj1/test1 -- ::. +

       @@ -0,0 +1,7 @@

       +

       +

       +

       +

       +

       +

       +

       *将prj0中的所有文件打补丁成为prj1中的所有文件:

       æ­¥éª¤å¦‚下:

       1)$ cp prj1.patch ./prj0

       2)$ cd prj0

       3)$ patch -p1 < prj1.patch

       è¿™é‡Œï¼ŒæŠŠè¡¥ä¸æ–‡ä»¶å¤åˆ¶åˆ°äº†prj0下面,然后将该文件夹下面的文件"变成"prj1下的文件了.

       $ ls -p

       prj1name prj1.patch test1

       å…³äºŽpatch命令的-p选项接数字n,意思是去掉补丁文件里指定路径的前n个'/'前缀.

       ä¾‹å¦‚补丁文件中指定路径是/u/howard/src/blurfl/blurfl.c,那么p0选项处理之后的路径还是原来路径不变,而p1选项处理之后的路径是u/howard/src/blurfl/blurfl.c,同理p4处理之后的路径是:blurfl/blurfl.c.

       æ³¨æ„ï¼šå¦‚果在外层目录运行这个命令,那么会在外层目录创建两个prj1name和test1文件。

       *将打好补丁的prj0中的所有文件还原成为原来打补丁之前的文件:

       $ patch -R -p1 < prj1.patch

       è¿è¡Œä¹‹åŽæ–‡ä»¶å˜æˆåŽŸæ¥çš„文件了,如下:

       $ ls -p

       prj0name prj1.patch test0

       *将prj1中的所有文件反向打补丁成为prj0中的所有文件:

       $ patch -R -p1 < prj1.patch

       è¿è¡Œä¹‹åŽprj1中的文件变成prj0的文件了,如下:

       $ ls -p

       prj0name prj1.patch test0

       *将prj1中反打补丁后的文件还原成原来的prj1中的文件:

       $ patch -p1 < prj1.patch

       è¿è¡Œä¹‹åŽï¼Œprj1中的文件被还原了,如下:

       $ ls -p

       prj1name prj1.patch test1

       *在外层目录把prj0的内容打补丁成prj1的内容:

       $ls -p

       prj0/ prj1.patch

       $patch -p0 <prj1.patch

       è¿™æ ·prj0中的内容变成了prj1中的内容,但是prj0的目录名仍旧是prj0,如下:

       $ls -p prj0

       prj1name test1

       æ³¨æ„ï¼šå½“前文件夹下面不能prj1目录,否则会出现一些警告提示。

       *在外层目录把prj0的内容反打补丁还原成原来prj0的内容:

       $ patch -R -p0 <prj1.patch

       è¿™æ ·åŽŸæ¥çš„文件如下:

       $ ls -p prj0

       prj0name test0

       

**

请问Linux中patch产生的信息怎么看,+-是什么意思?

       通过diff工具生成补丁,patch工具打上补丁.在使用diff之前,你需要保留一份未修改过的源码,然后在其它地方修改源码的一份拷贝.diff对比这两份源码生成patch.修改过的源码必须保留原来的文件名,例如,如果你修改源码中的a.c文件,那么,修改

如何使用git 发patch

       å¤šå‘patch,多产生一些好的idea,才可以在open software community中越混越好。首先配置git。这里有两种配置文件,一个是全局的,在用户的home目录下,一个是相应git仓库的。如果你设置了全局的,那么可以用在各个git仓库上。查看一下我已经配置好的配置文件:hacker@hacker:~/qemu-kvm$cat~/.gitconfig[user]name = Wanpeng Liemail = liwp@linux.vnet.ibm.com[sendemail]chainreplyto = falsesmtpserver=/usr/bin/msmtp我们可以使用命令来配置:$git config --global user.name 'Wanpeng Li'$git config --global user.name 'liwp@linux.vnet.ibm.com'$git config --global sendemail.chainreplyto false$git config --global sendemail.smtpserver/usr/bin/msmtp另一个需要配置的就是msmtp的配置文件,如果没有安装msmtp使用apt-get install安装。hacker@hacker:~/qemu-kvm$ cat ~/.msmtprcaccount defaulthost ap.relay.ibm.com#auth plainuser liwp@linux.vnet.ibm.compassword xxxxxfrom liwp@linux.vnet.ibm.com当你修改源码文件后,使用git commit -a可以给你的patch加一些注释,注意第一行添加的是patch的名字,然后空一行,然后另启一行添加对patch的注释。注意这patch的名字和注释之前必须空一行。然后添加Signed-off-by: eg:Signed-off-by: Wanpeng Li <liwp@linux.vnet.ibm.com然后生成patch文件,使用命令git format-patch,eg:$git format-patch origin如果觉得这个commit不想要了用git reset:$gitresetHEAD^然后发送出去:要使用git-send-email之前先要apt-get install git-email