GAMES002-图形学研发基础工具 - P2:Windows+cmd+PowerShell - GAMES-Webinar - BV1cC411L7uG
呃OK现在应该能够看到我的PPT好,大家好啊,好的好的行,那我们就开始吧,我们上周也是讲啊,给大家介绍一下LINUX系统以及linux shell,的一些基本的用法啊,那我们这周呢就继续讲一下。
windows系统和它底下两个比较嗯,比较常用的shell吧,一个是CMD,另外一个是power shell,然后也跟之前一样,我会先把视频关掉,然后等到最后我们再打开,因为可能会挡一下PPT嗯。
好的呃,首先我们也是嗯讲一下什么是windows,Windows,它是一组由微软开发经营销售的,图形化操作系统家族,可以看到它和LINUX的最大差别就在于,它不再是开源的了,而是由微软,所以所有。
然后它是一个操作系统家族,我们可以从下面这样一个结构图来展示,首先呢windows它会分为这样几个家族,最最老的一些它不是最老的,就是很老的一些系统叫做windows9X呃。
比如说windows9598这些系统,这个呃这里的windows9X表示的是他呃发布的年份,比如说windows98,它就是1998年发布的,所以呃这个已经这种这些系统,已经非常有这个年代感了。
然后后来呢随着这个技术的发展,windows microsoft它推出了一种新的技术,新的内核叫做windows nt,NT呢它是new technology的一个缩写啊。
然后这个新的内核也就取代了之前的windows,9X的一系列系统,然后此外呢windows还会有一些其他的家族,比如说windows I/O t,Windows i o t。
IOT大家应该都知道叫做internet of things啊,这个windows I/O t它的老名称叫做windows embedding啊,对呃,他是一个专门就是呃。
他这这这个家族里的所有系统都是嵌入式系统,它是呃安装在嵌入系统,就是说安装在一些呃比较微小的设备上的,比如说你的手表呃,你的这个手表,还有比如说呃对,大概就是这种可和一些其他可穿戴式设备吧。
包括可能眼镜也那种,眼镜也算嗯,然后在windows new technology系统啊,就是我们现在所用的系统啊。
其实都是属于windows new technology这个windows nt这个家族的,它主要也分为两类,一类是windows server,然后windows server。
它的意思就是安装在服务器上的windows系统嗯,然后从老到新也有这个windows nt3。1到4。0,然后再到windows2000,然后再到2003到200222022。
这些都是在服务器上运行的windows系统,当然这个可能对于我们科研来讲啊,这个windows server可能没有linux server那么常用嗯,我们最常用的LINUX系统。
还是属于下面这个其他类当中啊,这个其他我之所以叫它others,是因为我并没有找到一个,就是并没有找到一个学术,就是官方的名词能够概括这一类操作系统啊,这类操作系统呢,就主要是装在我们的个人电脑上的。
一个一些操作系统,然后从2000年开始呃,有windows xp,然后再到windows7以及windows10,我标出的这三个是,应该是可以说几乎没有人没听过吧,呃如果你可你出生晚,你可能没用过XP。
那你就从七开始,然后用十呃之后,但是在win7之前啊,就是基本上所有的这个windows系列电脑都是XP系统,在我们知道就是这三个标黑的地方,就是windows7推出的时候,其实就是推出一段时间之后。
微软其实已经停更这个windows xp系统了,然后同理呃,后面也就是在推出windows11段时间之后,也完全停更了这个windows7,就是相当于强制大家更新这些系统嗯,然后接下来呃也推出了。
我们现在是有windows11的,然后我们也不知道他会不会我,我我个人认为他之后应该也会就是用windows11,全面取代windows10,因为现在的用电脑的话,大家应该有一定经验啊。
就是你的这个更新,经常是让你是推荐你把电脑升级成为note11,OK啊,至于windows的一个发展史呢,我们大概可以从它的图标的发展史窥见一斑,就是从1985年开始。
这个他的这个windows它可能还是一种DOS系统,所以都是用字符的一种图标,然后到了91年才开始,变成我们很经典的这种四个方格啊,就是这种四个格子的windows图标,然后再往后呃。
到了01年就是windows xp,然后再往后就是win8,win10以及win11这些系统,也可以看到他的这个图标发展史也是挺有趣的,OK是大概就是对windows的一个简单介绍。
嗯那接下来我再来讲一下windows,我们为什么要windows啊,就是它的一些好处吧,首先它的优点呢就是它最突出的优点,就是说它图形化界面是非常强大的,然后以及它的用户基数也很大。
因为嗯对就是用户基数大,相当于在这个基础系统基础上,开发的软件也会很多,所以就是很多东西它都只支持windows,那你就不得不用windows是这样一个事情,然后windows它也有很强的兼容性。
硬件兼容软件兼容都挺强的,然后还有一个优点,它就比较简单易用嘛,因为它的图形化界面非常的呃,interactive非常的图形化界面非常的简便,接下来应用场景我觉得可以说是almost anything。
就是你可能尤其是在图形学里,基本上日常使用的电脑都是windows系统,因为这个上面的图形化的开发应该是最简单的,在这个系统上呃,至于访问windows的话,我觉得这个没必要多说啊。
首先就是你一般正常买的一种,比如说联想的电脑,它就会自带一个windows,你买的电脑就是自带,就是你买的电脑那个价钱里面就是包含了嗯,正版的windows系统啊,如果说你实在是买了一个从零开始的。
自己攒的一台电脑,没有系统的话,你也需要去安装,先先去购买windows系统,然后去安装呃,安装的话也是一样的,需要一些启动盘去,这和LINUX一样啊,去需要一些启动盘去安装,然后另外也可以使用虚拟机。
虚拟机里面放windows,就是这个使用虚拟机的好处主要是什么,就是你可以你可以把程序放到虚拟机里运行,就像放在沙盒里一样,如果这东西带一点病毒,那可能不太会影响到你外面的这个系统的,这个环境。
只会去破坏你的虚拟机的环境,然后这样的话就会安全一些吧,就在你一些呃,不确定它来源的一些程序的情况下,嗯好,接下来呢,我们在接下来就是呃windows的部分就结束了,我相信大家应该没有什么问题吧。
如果有问题也可以提出来啊,接下来就讲一下CMD和power shell的内容了,对CMD和POWERSHELL在讲它的用法之前,我们先来一个不等式,那就是说CMD不等于power shell。
我们上一次课讲的时候,其实也有人也有弹幕提过问,就是说CMD和POWERSHELL其实难道不是一样的吗,为什么要分开讲,但实际上他们非常不一样啊,他们其实可以说是完全是两种脚本,两种命令行呃。
首先呢power shell它是不执行执行CMD命令的,就我们看上去,power shell好像我输入一些CMD命令到power shell里面,它也可以work,而且跟c mt里的行为也非常相似。
这不是因为这些CMD命令直接属于POWERSHELL,就是而是因为power shell它提供了一种种alias,也就叫别名的一种机制,它可以把一些CMD的,就是把一些power shell中的指令。
去映射到CMD的那些简写的形式,从而你在调用CMD指令的时候,它会自动转化成对应的power shell指令,而那些power shell指令和CMD指令的行为非常相似,所以呢。
呃就看上去好像CMD是它的一个子集一样,但实际上不是这样的,CMD和POWERSHELL可以说是独立的两个东西,他们没有任何包含关系,但是POWERSHELL呢它确实啊要比cm要强大得多,你可以这么说。
就是CND能做的事情啊,几乎所有事情吧,就所有事情power shell都可以干,对这个从这个含义上,你可以说CMD它是属于,就是比如说被被包含于这个POWERSHELL。
然后power shell它有几点,一个是他每一条命令呢它叫做command lets,我们在最后也会讲到,他的每条命令都会比CMD要复杂,其实都是一个小型的命令程序。
另外的power shell和CMD它的设计理念不同,CMD它的本质上呢就是只希望呃,就只想让你用CMD去干一些很简单的事情,比如说批处理呃,类似于呃一堆文件,我要把它进行一些处理啊。
重命名或者拷贝这种操作,但是power shell的话呃,就是它支持的功能就越远远,更就要复杂的多了,然后POWERSHELL它其实更像一种高级语言,它可以说就是一种高级语言,它可以运行复杂脚本。
然后他也是面向对象的,没错,他和Python一样,都是面向对象的这个一种语言呃,但CMD呢不是面向对象,CMD里面所有指令的这种传输管道啊,什么它都是以这个字符串来进行的,它相当于传输指令之间的传信息。
传输只靠字符串,那POWERSHELL呢则可以把一个整个结构化的对象,传给在这个指令之间传递,呃这里是一个简单的比较啊,我们可以总的概括来说,就是POWERSHELL比CMD要强大的多。
呃它还支持跨平台,然后以及一些可扩展性,但是呢因为很早很早的一些微软的windows的版本呃,他是不支持POWERSHELL,它那个POWERSHELL提出要比windows要晚。
所以说呃POWERSHELL可能会不支持一些很老的系统,但这个其实不是什么问题,因为我们没有没有人才会去用那些系统了,呃CMD呢则是不一样的,因为CMD相当于就是系统自带的一个shell。
它测试和系统这个呃同时出现的好的,然后接下来大家可以跟着我一起来启动一下,你的电脑里的CMD或者POWERSHELL啊,我一开始会讲一些CMD当中的命令啊,我建议大家先启动CMD。
因为有些命令它在POWERSHELL里的这个行为,跟CMD里表保就是表现的不太一样嗯,然后启动的方法大家也应该很清楚了,就是你用开始拆菜单就可以启动,或者说用windows加R。
然后启动进入相应的shell名称,然后就可以启动了,呃还有一种很便捷的方式啊,就是你如果打开了一个文件夹,我想在这个文件夹里直接打开我的power shell,你就可以用按住shift啊,不好意思。
这里拉了一下,就是你要按住shift键,然后再右键单击一下文件夹的空白处,然后这个时候你会发现菜单栏里有一个选项,叫做在此处打开POWERSHELL窗口,你点开之后就会发现POWERSHELL。
它那个当前路径就直接设定为了,你现在打开这个文件夹的路径呃,这里稍微有点对,稍微有点错误,稍微改一下嗯,右键单击,啊,然后有可能会有很少很少一部分同学需要去,安装或者更新一下POWERSHELL。
这个的话呃你你你如果真的需要的话,就是你电脑上没有power shell,这个基本不可能,然后如果你实在需要的话,你可以先打开CMD,然后后面去官网去好啊,安装一下好的。
然后CMD指令也从CMD指令讲起吧,CMD的命令行的这个格式其实和linux shell非常相似,它也是呃第一个单词是我的那个命令,我想让他做的命令,然后后面跟上若干个参数。
这个每一个参数呢可以是三种选项,三种情况之一啊,第一种是文件名,第二种是路径,第三种是选项文件名和LINUX一样,就是嗯对,然后路径的话和LINUX会稍微有一些不同,首先呢windows下的路径。
它的这个他这个就是呃,这这条链它其实是由这个反斜杠连起来的,但是实际上LINUX它是用正斜杠,也就是除号连接起来的,这是它的不一样的地方,然后在windows里面这个CMD里面建议都用反斜杠。
因为这个东西它其实挺迷惑的,就有的时候你用正斜杠它可以work,但是又反斜呃,又但是在另外一些情况下,你用正斜杠它就报错了,所以呃但是反斜杠它一直都是支持的,所以大家可以就是习惯一下。
去用反斜杠打这个目录啊,打这个路径,然后呃与LINUX另外一个不同点是,LINUX它不是有一个统一的根目录吗,就是叫做对根目录,但是嗯嗯windows它不太一样。
因为windows它其实是把这个磁盘分区,暴露给这个用户了,所以呃磁盘的分区就会分出这种C盘,D盘,E盘这种东西,所以开头呢它就是一个盘符呃,盘符是一个字母加上一个冒号,比如说C盘D盘这样的东西呃。
第三个呢第三个情况就是选项了,选项一般都是以这个正斜杠,或者以这个减号开头,然后后面一般是跟一个字母,后面也有跟多个字符的情况,这个选项呢就是也类似LINUX当中的选项。
就是呃会呃有些选项后面会跟一些别的参数,就是选项后面跟的那个argument,有一个特殊的含义,或者说这个选项本身是一个类似开关的东西啊,你你你打开这个选项,表示这个开关打开,然后没有这个选项。
表示这个开关就关闭,我这里有一个例子,就是erase杠f my fault txt,这个是什么意思呢,就是GF就是说强制执行的意思,erase是删除的意思。
也就是说我要强制删除这个my fault xt,这样一个文件,这个这条指令的作用就是这样子,然后接下来另外还有一些就是windows,其实它这个CMD尤其是CMD啊,它不像LINUX那么好嗯。
不像LINUX那么好用,就是因为它有些地方空格和引号,它的含义是不规律的,我可以举个例子嗯,我先调出我的CMD来。
对大家应该可以看到我这里的命令提示符吧。
啊我首先切换到一个我想要的目录下,然后要注意一点事情,就是这个在命令在CMD这个CD指令,如果你想切换这个盘符的话,它是没有办法直接切换的,你需要再就是再输入一下盘符。
它才能切换到你想要的那个那个那个路径下,然后比如说我先创建一个my file,然后接下来哦对不好意思啊。
我展示的事情是这个空格和引号。
它的含义不规律,这个事情哈,嗯就是比如说啊我想echo一个hello world,我们知道在LINUX里面,他这个其实代表的就是hello和word是两个参数对吧。
所以然后他在输出的时候会把两个参数之间加,自己加一个空格,但是这里就不一样了,我这这里不管我敲多少个空格,它都会原样不动的输出,也就是说这里echo后面这个东西啊,它会把所有的啊对他会把所有的东西呃。
所有的内容,你不管输的是空格还是非空格的字符,都会当成字符串,所以它会这样输出来就很奇怪,然后如果说我加上引号,他这个引号也会输出来,也就是说他把引号这个东西也看作echo,后面跟的那个字符串了。
所以这里的引号就跟就不太一样,但是你在别的地方,引号又可以表示括起来的意思,比如说我想切换到一个路径,在这个路径下有一个叫做space dr的东西,这个就是说我故意设置的一个,包含空格的一个路径。
然后这个时候你你加上引号又是没有问题的,它就相当于把这个space dr这个东西,扩到一个串子串里,在所有CMD里涉及到路径的呃地方,然后路径里包含空格,你都可以用引号括起来,这是没有问题的。
但是在echo里这个引号就失去了它的含义,所以这个在CMD里面,每条指令它其实这个协议吧这个规则不太统一。
所以没有LINUX那么好用,然后另外呢CMD也支持重定向,和管道和LINUX一样,我呃我相信大家也应该知道吧,就是呃应该还记得这个LINUX的管道和重定向,是怎么做的吧,大家可以啊。
可以去可以在弹幕里打出来一下,LINUX管道和重定向是怎么做的好吧,就是我想重定向一个指令的输入是什么呃,重定向指令的输出是什么,然后在文件末尾追加是什么符号,然后管道又是什么符号。
这些用法大家可以嗯可以打出来啊,这里我就不再重提了,然后呃,接下来呢又是就是在CMD里面,有一有一些常用的命令,我在这个表格里展示出来,并且啊最后最右边一列是它对应的类似功能的。
linux shell里的命令,这里的功能只是类似,并不能说是完全一样啊,呃具体他们有什么差别,你们还是可以去自己命令行里输入,就是去对比一下,所以呢就是你可以发现CMD和linux shell。
使用方法其实是非常类似的,因为嗯因为每一个操作,基本上都可以找到对应的指令,嗯对然后这个表格我也先过了啊,大家可以在课后去看一下,嗯很好,我看到弹幕里有打出那个重定向和管道的啊,没错是对的,然后呃。
接下来我来讲讲一下,这个windows里面的账户权限是什么一个概念,windows里面那它分为三类不同权限的账户,一类是管理员账户,一类是标准用户账户,然后第三类呢是来宾账户,管理员账户拥有最高权限。
可以类似于LINUX的root账户,它可以完全使用计算机,并且可以管理其他的账户呃,第二类标准用户账户呢,就是它的权限要比管理员稍微低一点,但是它可以正常的访问计算机以及执行程序。
它不能做的事情就是更改其他用户的设置,以及系统设置,然后也不能在电脑上去安装新的软件,OK第三个是来宾账户,来宾账户呢它只适用于临时访问的,他的权限是最低的呃,他无法第一无法更改系统设置。
第二无法安装应用,第三有一些私密文件也是不可以访问的,所以说呃但是我们现在很少用来宾账户了,来宾账户其实就是你把电脑锁定之后,但是你的电脑又想临时的给另外一个人用啊。
那你基本上就只能让那个人去用来宾账户,我们现在就是因为windows它有一个叫做MICROSOFT的账户,然后如果你把MICROSOFT账户去绑定到电脑里。
然后电脑里只有你一个MICROSOFT账户的话,那你基本上就是有管理员权限的嗯,当然我们这个正常使用的时候,还是用这种标准用户账户的身份去做的,因为你会发现就是在有的时候。
windows你想安装一个程序对吧,嗯你从网上下载了一个安装程序,然后要双击运行的时候,它会弹出一个窗口对吧,让你授权这个能不能运行,其实就是让你以管理员身份去授权它,然后这个时候。
如果你这个账户没有管理员的权限,那你就是授权不了,或者说你需要输入输入管理员的一个密码,才能够授权,然后所以呢类似于LINUX的SUDO,SUDO这个操作速度,我相信大家还记得吧。
提升我这条指令的一个权限,如果我想在windows里做类似的操作呢,怎么办,就是说我在打开的时候,打开我这个CMD或者power shell的时候,我又见他,然后选那个以管理员身份运行就可以了。
然后任何程序其实都可以以管理员身份运行,这样的话,你就相当于给了那个程序管理员的权限,然后那个程序就可以任意的操作你的电脑了,对所以你要做这个事情之前,你也得确认啊,我你得确保那个程序没有攻击性。
不会伤害你的电脑。
可以给大家演示一下,就我在CMD里打开,我在开始菜单里打开CMD,然后这里会有一个以管理员身份运行这个选项。
你点点开就可以了,然后这个时候它会弹出一个窗口,然后你要给你给他授权。
OK打开之后是这样子。
嗯接下来是文件权限,刚刚讲的是用户权限,然后windows管理这个文件权限的方式是什么呢,是叫做一个访问控制列表啊,它的英文名字叫做access control list,然后缩写叫AACL。
访问控制列表,它是相当于是文件CENTRIC的,file centric的一个管理方式,呃,我们知道就其实你学过操作系统,其实我们会知道文件权限,它其实文件这个东西它有两种管理方式。
一种是fl centric,一种是user centric,user centric的话,它相当于是在每一个用户底下去记录,去维护一个呃,list表示我这个用户可以呃,以什么样的权限可以去操作哪些文件。
而这种像windows这种这个呃fifth centric,它的方法就是说呃,我在我为每一个文件去维护这样一个list,然后list里面表示的是有哪些用户可以访问我,有哪些用户可以以哪些权限去访问我。
OK呃这个访问控制列表怎么查看呢,呃很简单,它是呃你右键单击一个文件,然后点击属性,然后再点击这个安全选项卡,对可以,可以给大家稍微演示一下,比如说我这里有一个my file txt,我右键。
然后就会有属性,这个东西在哪里呢,属性在最后,然后你点开之后点到安全里,然后就会弹出这样一个这个小窗口,这个呃对,然后上面这个框,它是表示说我我这个用户可以访问它的,用户有哪些,然后下面表示呃。
你可以在上面选一个用户,然后下面显示的就是,这个用户可以对应有哪些权限,比如说这个users对这个file,就只有读取和执行的权限,然后如果是比如说这个administrator是管理员账号。
他就是有完全控制的权限,呃接下来讲一下CMD里面的变量,它其实也是有变量的,而且很类似那个很类似LINUX的shell,它的赋值跟LINUX不太一样的地方,就是前面要加一个set。
在LINUX里面的赋值呢,它直接赋值就可以了,直接你输入负等于半就可以了,但是在CMD里面呢,你就需要对你就需要前面加一个set,表示我这个复制语句前面要加个set啊。
然后赋完值之后去访问这个变量怎么做,就是呃在前面和后面分别加上一个百分号啊,这个的意思就是说把负的这个值去替换掉,前面前后加一个百分号这样一段串字符串,Linux。
大家可以回想一下LINUX怎么访问LINUX,就是在前面加一个dollar好,然后嗯这里有个例子啊,就是我们知道在在windows下呃,也有一个叫做pass的环境变量。
它和LINUX下的pass是一个意思,就是说我要运行程序的时候,我在CMD里面不加任何前缀,不加任何前缀路径的时候,我想运行一个程序,都是在pass这些路径里面去搜索,我想要的这个程序。
然后再搜到了就运行,搜不到就报错,所以这个pass跟LINUX是一样的,然后如果我想用命令行给pass添加一条路径,要怎么做呢,用这样一条指令,set pass等于两边百分号,一个pass。
然后后面加一个分号,然后后面跟上我新的路径。
这个我们可以看一下,给大家看一眼呃。
比如说我现在去echo一下pass。
我可以看到有这些有这些这个目录对吧。
但是我现在呢如果我想加一条路径,那就相当于set pass等于,然后分号T,然后我现在在看,其实他就是说在这个串末尾连上这么一个字符。
然后我们再看pass后,后面就添加上了这个这个这个路径非常的简单。
然后如果我们想删除一个变量的话,就是说我把后面这个赋值操作,把后面的东西就放空就可以了,像这样set负等于,然后后面什么都没有,就表示我要删除这个删除这个变量,然后如果说你set后面啥都不跟。
它表示的是查看所有环境变量和当前局部变量,这个有点类似于LINUX中的set命令,就是说查看所有的当前这个shell里面,可以看到的变量,可以使用的变量,然后set后面也可以跟一个名称表示我查看。
比如说set for,就表示查看所有变量名中,包含FO这三个字母的一个变量,好的,呃和LINUX一样,set指令,我天做的这个赋值只会影响当前的CMD窗口,我无论是修改了。
像刚才一样修改了这个pass pass变量,还是说我新建了一个复变量,我在关掉CMD,在启动之后,这些变量这些修改就不存在了,因为修改和添加都不存在了,如果想要永久修改呢,就需要用到set x指令。
set x指令它没有这个等于号了啊,要注意它的sex指令后面跟两个东西,一个是变量名,后面是用引号括起来的,呃,他的这个字符串就是它的值,比如说我想永久的创建一个负,然后它的值是bar。
这样的话我就去用第一行这样的指令,set x负引号B,然后它会它的操作呢是我会添加并且修改呃,添加或者修改当前用户的环境变量,就是在windows里边的环境变量,它是分用户的。
有一部分环境变量呢叫做当前用户的环境变量,这些是用户之间不共享的,另外一部分呢叫做系统环境变量,就是你登录哪个用户,它都会有这些环境变量,如果我想修改或者添加系统环境变量呢。
就会在后面加一个杠M这个选项就可以了,非常的简单,但是呢有些局限,就是菜塔X它没有办法永久删除一个环境变量,或者说CMD里面就没有这种指令不能删除,那要怎么删除,那要去怎么删除呢。
我们其实因为我们知道LINUX,linux windows它其实是一个图形化的一个系统对吧,操作系统,所以他的任何高级操作,都可以用图形化的方式来解决,你没有必要,其实没有必要去用那个命令行。
我们可以用图形界面去编辑环境变量,这个方法呢,就是说我右键桌面上的这个此电脑图标,然后点属性,然后再点进去高级系统设置,然后再点环境变量,我就可以查看到这样一个窗口,然后上面是用户变量,下面是系统变量。
然后如果我想去编辑的话,我直接选中一个点编辑或者双击就可以了,然后新建的话,这里也有,然后包括删除也有,我现在可以呃对可以给大家做个示范啊,我这里是呃给大家做个示范吧,我这里是windows11系统。
win10可能会跟我稍微有点不一样,但其实差不多还是点属性,然后这里有个高级系统设置,然后呃接下来就点这个环境变量就好了,然后这里面所有的上面是用户变量,下面是系统变量,这些所有都展示出来。
比如说我想加一个pass pass在哪里呢,pat在这里,对我想加一个的话,我就双击这个东西,或者说点它编辑,然后在这里面就可以新建了或者删除啊,什么上移下移都有,然后比如说我想删除这个负。
等于半这个负这个系统变量,那我就直接选中它,然后删除就好了,非常的简单对吧,所以在windows下很多情况下,你只需要用图形化界面就能解决问题了,没有必要去弄呃,去这种去用他的这个命令行。
所以windows它其实设计理念就是说,尽可能的让你能够去用那个用图形化的界面,去解决你想要做的事情呃,脚本的方创建方法呢是先新建一个空白文档,然后去把它的后缀名改成点BAT呃。
因为默认的空白文档是点TXT的后缀,然后你改成点BT的这个后缀,然后它也叫呃改成点PAT的这个后缀,然后为什么是点BAT呢,BAT它其实是一个batch的缩写呃,所以说这个脚本文件也叫做批处理文件。
在windows下,对然后刚才提到的就是在LINUX下,他判断一个程序就判断一个文件是否可执行,是通过权限位来判断的,windows也有类似的权限位,但它不是以这个为依据,去判断是否为可执行文件。
而是以后缀,就后缀名或者说扩展名是来判断它是否可执行,如果是点EXE文件,它就会默认为是一个可执行文件,然后如果是点bat文件,它会默认是一个,用CMD这个解释器,去解释了一个脚本的脚本文件。
对然后所以说嗯所以说如果你在windows里啊,如果说想把一个普通文件,其他文件改成EXE文件,它也会认为一个可执行文件,你双击那个你自己改成EXE的文件之后呃,你会发现它就变成它就会呃它就会运行它。
Anyway,就是把直接把你那个文件的内容的二进制,看成是我的一个呃计算机执行的代码,所以你直接点开它,就也会去试图弹出一个DOS窗口,然后运行,然后会发现他肯定会报错,因为它本身不是EX文件对吧。
所以大家尽量不要去这么做啊,不要去把其他类型的文件改成点ex e呃,OK然后继续啊,就是呃如果我想编辑一个对,我刚才已经创建了一个点bat文件之后,我想怎么办,我我我我想去写一下这个脚本程序。
方法就是我去右键单击这个文件,然后在菜单栏里选出那个命编辑那那一项,然后点完编辑之后,它会弹出一个记事本的窗口对吧,大家可以照做一下啊,弹出一个记事本窗口,然后它其实就是一个点BT。
其实就是一个文本文件,只不过呢它的扩展名换成BT之后,你再去运行这个文件,它windows会默认去调用CMD,去解释你这个文文件里的文本O呃,在弹出我这个窗口之后,写入一系列的CMD命令保存,然后退出。
接下来你双击就可以直接运行了,然后当然也可以用命令行去调用它,比如说我可以在前面也用这个call指令,然后后面跟一个点bat文件,或者说我切换到当前这个目录下,我直接直接把这个文件名输入进来。
它也可以运行,然后这里有个例子,有这么两行代码,首先是at echo off,Echo that i at echo off,这个指令的意思是什么呢,这个指令就是说我接下来把所有的呃。
指令的输出提示都关掉,在CMD里是这样的,但是power shell里没有这个功能,也就是说我之后所有的指令,无论他运行正常与否,都是silent的,当然我现在保证了,每线文之后的所有指针都是对的。
接下来是一个for循环,这个for循环呢,它的语法呢就是呃也是有一定语法的,这个CMD脚本它也像其他高级语言一样,也有分支结构,循环结构,还有每一条指令,它其实都是有返回值的,那回到我这个for循环呢。
他的意思就是说我这个I从零开始步长为一,然后到五结束,要注意啊,这个零和五都是包含在内的,然后接下来do后面跟的是我想要执行的操作,然后后面这个括号里面,每个操作之间用这个语去分开。
然后这两个操作它就会都会运行,然后这里的echo点啊,箭箭头echo点大于号是什么意思,就是说echo点其实是什么都不输出的,意思,就是echo后面不是跟一个字符串吗,我会把这个echo指定。
会把这个后面的字符串原样输出,如果你echo后面紧跟着点,就表示我什么都不干,就什么都不输出,但是这个这个情况我后面,但是在这里这个指针就有用了,就是我后面跟一个管道输出到file file。
序号点TXT这样一个文件之后呃,如果这个文件不存在,它就会把这个文件先创建出来,然后我在里面输出空的字符,就相当于等价于我把这个文件创建出来了对吧,然后后面text也一样。
然后这这里的这个循环变量呢跟刚才不太一样,刚才是前后各跟一个百分号,这里呢它又是两个百分号,然后具体这个语法也是比较复杂的,呃,我们可以去参考一下维基百科的一个啊,VICKBOOKS的一个链接。
如果大家想学的话,但是啊我个人其实不推荐大家去学这个,因为我其实也不会呃,因为为什么不推荐学呢,因为这个东西它可能一是比较的,学起来可能会费时间,二是你可以有更好的替代方案。
就是Python Python也是更应该说是比power shell更要更跨平台,几乎是应该是所有的呃,这个东所有的系统里都可以运行Python脚本,然后Python它的功能也会更加强大。
然后包括你如果想去做这个呃科研的话,嗯深度学习什么呢,肯定都是离不开Python的,所以学Python相当于一举两得了,就是一举多得了,就是所有东西都可以用Python去做好的。
然后我可以给大家做个示范,这里我这个script bt其实已经编辑好了,我可以给大家打开看一下啊,就是这两行代码,然后我接下来直接双击运行嗯,对你会发现他闪闪过一个窗口,然后退出就表示他执行完了。
然后我会发现多出来了file0到file5这几个文件,然后TXT0到TT5,任意打开一个都是空的,OK好,接下来我用命令行把它删除,能把这些文件删除,我这里删除,我用这个CMD吧。
然后,三星和还有什么text星哎呀,不好意思,我老是把这个windows和LINUX记混,而M是linux by shells下的指令。
然后windows里面要用erase或者dl dl delete的缩写去执行。
然后对,然后就清掉了。
好展示完CMD脚本之后呃,接下来我就去介绍一下POWERSHELL指令了,就是CMD部的部分,大家还有什么疑问吗,可以去可以在弹幕里打一下CMD就这么多了,其实就是一些很简单的指令。
然后大家其实只要把前面我打出那个,表格里的指令呃,记住就好了,然后基本上也就只会用CMD干这么多事,然后更高级的功能,一般写个Python脚本会好好好方便很多,CMD的部分。
大家有什么问题可以在弹幕里打出来啊,如果没有的话,我就继续啊,如果对,我们可以把问题都放到最后呃,接下来只去讲这个power shell,power shell指令,我们刚才说了啊。
他每一个指令都比比CMD的要复杂,它每个指令有一个别称叫做command lets,每一个command lights,他的他的这个长相也跟CMD里不一样,他都是一个形容这样verb减号NN的一个组合。
就是动词名词,你可以想这是叫什么来着,叫动名词的一个短语对吧,前面是我想要执行的动作,后面是我要就是执行的一个对象,然后这里有几个例子,一个是get verb,Get web,它的含义就是说呃。
呃呃我就是说含义就是说显示出所有这个呃,所有可能指令的前半部分,也就是这个verb的部分,比如说我可以给呃给大家展示一下啊,给大家展示一下。
据说如果我用get verb,你会发现它弹出来一堆这个东西,然后第一列的就是它的所有的verb。
你看我们可以看到,其实get也在里边,get本身就是个verb对吧,就是说他把所有我们常用的,也不是常用的,是所有的指令的前半部分,就是前半部分动词的那个部分都都展示出来,然后后面会展示出来。
这个这个web所属的一个组group,有common data,然后后面还有life cycle,Diagonal,Diagnostic,Communication,Security other。
然后相对的相似的一个指令呢是get command,这个指令,它的作用是输出所有的存,power shell里所有内置的指令,我们可以看到这个屏幕刷了好久。
它就是有超级多这样的指令,然后每一个指令你会发现,比如说register engine event,前面register是个动词,后面就是一个名词,都是形容这样,其实都是形容这样的一个呃动名词对。
然后这也让这个power shell的这个指令呢,更加可观性强一些,不会像我们之前呃,之前那个CMD或者shell linux shell里面,他都是用一些小写字母缩写来代替调一个指令。
我们很可能需要查阅文档才能知道他什么意思,但这个一般来讲呢就看一下就看一下。
就知道他大致做的是什么了,后面还有get get这个我我后面会讲它的含义。
然后还有get help,get help就是一个类似于CMD里面的help指令,就是去查这个帮助文档,我我输入get help回车之后也会有一堆这个文字啊,这些就是帮助文档,然后呃。
当然他这个帮助文档只会告诉你,怎么去使用这个get help指令,然后如果你想真正的去查询一个呃,一个指令是怎么用的,你就可以在get help去跟一个指令,比如说我想知道get command怎么用。
那就输入get help空格,Get command,回车之后会发现他就把get command,这些语法都给你展示出来了,还有别名,别名就是我刚才说的alias。
就是说g cm其它其实和get command是完全等价的,然后我们发现get command,其实它不只是输出所有的指令,你可以指定它的名称啊,也可以指定使用它的别的东西,Ok。
好然后POWERSHELL里面也是很类似的,就是格式也很类似的,第一个词是我的那个指令,后面都是argument,然后后面的参数如果是那种有名儿嗯,带名的参数呢,这个参数名要以减号开头呃,这就好。
很类似于就是你写这个C加加或者Python里面,每一个函数它都有一些参数对吧,每个参数都有参数名,然后如果你想指定给某某个参数,给某个名称的参数去赋值的话,你就需要以这个减号开头。
比如说我要get command,我要指定我的名称,那后面就加一个这个名称,它的名称,这个参数的名称叫做name,所以我就加上减号name,后面再空格跟上的这个字符串。
它就相当于传给了get command name参数。
我可以执行一下给大家看呃,get command杠name呃,Sheer gun process,它会把所有以process减号process结尾的这些呃,这些串这些指令都显示出来。
这里的芯儿呢是一个通配符,表示就是匹配任何串都可以,空串也可以嗯,然后这里可以提示就是再告诉一下大家,就是无论是CMD还是POWERSHELL,在很多地方输输入字符串的地方,其实都是支持通配符的。
或者说支持一种对,都是支持通通配符的,有些地方可能还支持那个正则语言,这个大家可以自己去了解一下,通配符呢就比较的呃,可以让我们很方便的去使用一些东西,比如说我刚才执行那个删除操作,我不是erase。
或者说delete file芯,还有那个text星吗,那个芯也是一个通配符。
好接下来我们讲一下power shell的对象,因为呃刚才我们时不时提到了,power shot是一个面向对象的编程语言对吧,所以它它像Python一样也是有对象这个概念的,然后呃如果我想查看对象。
用get member这个指令,但是get member这个指令它的用法是这样的啊,就是它用管道来传输,它是用管道的方式来输入的,就比如说我现在这样一个指令get process。
然后管道连接到get member,就表示说我的get process,这个指令的输出输出是个对象,它的输出不再是一个呃像CMD里一样的,string了一个字符串,而是一个更高级的对象。
然后把这个对象呢通过管道直接传给get member,这个指令,那get member就是相当于把这个对象的这个信息属性,包括它的属性啊,还有他的method方法都给你展示出来。
比如说我现在可以输这个命令,给大家看一下是什么效果啊,get process管道,Get member,然后首先它会输出type name,就是get process,它输出的这个对象呢。
它的类型是什么,我们可以看到这个类型它是叫做一个system,Diagnose,diagnostic process这样一个类型,然后后面呢就跟出了这个类型的所有的呃属性。
包括这种alias property event,还有method method,就是它的方法就类似我们的成员函数,它是可以调用的,然后后面还有一些property。
property是它的另外一些属性吧,对。
好的呃,在这里面,power shell里面常见的类型呢,也跟我们的编程语言一样,就字符串啊,int还有double整数啊,小数还有布尔类型,然后也有数组高级一点的,包括date time。
就是表示时间的一个类型,然后还有hash table,就是哈希表,还有呃文件的信息和目录信息,这样子的一些类型,当然所有点net的类型他都支持,点net呢也是一个语言,你可以理解为是一个语言嗯。
他也是一个非常跨平台的一个一个语言吧,它可以用来去跑各种各样的程序,然后我们对我们前面提到过的power shell的别名,这里再次再次讲一下呃,为什么POWERSHELL。
看上去能够支持很多的CMD指令呢,它就归功于这个别名的机制呃,别名机制我们刚才说过啊,就是相当于把power shell的一些指令,映射到一个很短小的缩写缩写字符串当中,所以你以后调用那些缩写字符串。
相当于直接调用的是对应的POWERSHELL指令,如果我想查看别名与指令名的对应,用的是get alias这样一个一条指令,我们以这个get member和gm为例啊。
get member它的alias是gm就是它的首字母,然后gm它的对应的全称也就是get member,如果说我现在是知道某一个指定的别名是什么,也就我只知道gm是什么,但我不知道它对应的是哪个。
真正的对哪个呃,他的power shell指令是什么样子的,我就用上面这一行的方法,get alias后面跟上name参数,然后输入gm。
这个name参数一般是因为它是一个positional argument,它是在第一位的a positional argument呃,所以这个name其实可以一般是可以省略掉的,嗯后面这个指令名到别名。
如果我只知道一个指令名,但是我想就是方便一点,不用每次打这么长的名称,我想知道它的别名,那就是相当于跟上一个definition参数,然后definition参数就是我这个指定的名称。
然后这个definition,它因为不是那个positional argument,所以这玩意是不可以切记,这个东西是不可以省略的,好的我们可以看一下效果吧。
Get alias,先切过来,Get alias,gm会发现它输出了这么一个东西,然后gm重定向到了get,所以说gm所对应的这个指令名就是get member。
然后如果我想get ali definition,然后get a member,你就会发现它会输出同样的内容啊,也会,然后你就可以从这个信息当中获取它的A列,名称,叫gm。
OK这应该都很好理解好,接下来我们再讲POWERSHELL脚本呃,他也是你想创建一个脚本,其实也跟CMT是一样的,只不过它的文件名日不再是点BT,而是那个点P1点PSE文件。
然后同样是用文本的方式去编辑,这个点PS文件,然后把扩展名改成点P1之后,windows会自动的去调用POWERSHELL,去解释解析你这个文件里的代码啊。
然后我们观察一下这个power shell脚本代码会发现啊,大括号什么的,小括号这些符号就一目了然了对吧,他就更更加接近的一个高级语言了,比如说和刚才的那个CMD里的脚本,执行同样的命令。
同样是创建file0到file5,以及TXT0到TT5的空文件的脚本,就用这样一个函数循环就可以了,这个减号表示小于等于的意思,然后我们也同样的是,把这段代码输到那个点PSE文件里。
然后双击执行就可以了啊,我这里也给大家展示一下啊,因为我这里也准备好了,其实已经准备好了一个script,可以给大家展开看一下啊,这里面的内容已经是这个循环了,然后保存在退出之后直接双击啊,不好意思。
双击啊,这不不太能双击运行,这个你可能得用得用那个power shell来运行。
P这个power shell直接输入这个script点P1就可以了,可能还有点杠一下,对这里跟POWERSHELL跟LINUX是一样的啊,LINUX是一样的,就是你不加点杠的话,它没有指明它的路径。
它就会从环境变量里的pass里去搜索,然后pass里没有,我现在当前这个命令没有当前这个目录,所以这个script它就找不到,就像刚才一样报错,然后你加上点杠就表示我指定了它的路径,就在当前路径。
然后弄出来之后就变成这个样子。
然后我会在看到窗口里面确实多了file0,到file5这些文件。
以及text0的text5这些文件,我同样可以删掉这些文件。
好呃然后如果大家想学拍power shell脚本的话,也可以去参考官方文档,然后他这个POWERSHELL就比command c md要复杂多了,因为它功能也很强大,它是跨平台的。
而且是面向对象的一个高级语言,但同样的我给大家建议还是同样的,就是学Python不如学Python好,学这个POWERSHELL不如学Python,就我们刚才讲的所有操作其实都可以用Python。
里边有一个叫点OS的模块都是可以做到的,好的这个今天的内容其实就这么多了,接下来呢我们要留下第一次作业,我之前跟大家说过的,所有的作业的截止日期都是结课后的一周对吧,嗯自己再强调一下。
就是6月4号的晚上11:59分呃,然后第一次作业的要求呢,是我们只要提交一个PDF文件就好了,然后呃作业一会有四个小题,然后你在PDF文件里要注明你每个题的序号呃,接下来呢对。
还有另外有些题他会让你去展示结果截图,那你就嗯需要在文档里把那个图给贴上,然后最后一定要注意是只能交一个PDF文件,不能交任何其他的附加文件,你的图片是不能单交的好吧,一定要把它放到PDF里面。
对然后其实怎么生成,怎么把图片放到PDF里,最简单的方法,现在就是用word吗,你现在可以用word写,然后之后我们也会教这个了,TX和markdown这个用法之后呢。
就可以用markdown或者LTT,更方便的去排版一个文件,然后他markdown和the text渲染出来的东西呢,就是PDF文件渲染出来的,OK然后这次作业的总分是20分,然后有八分的附加分。
然后前三道题就是那20分,然后最后一道题是选做的,然后就会额外的给给八分,然后如果你做的话,会给你额外的加八分啊,OK然后作业的要求就是我这次PPT的最后两页,然后PPT到时候也会传传到呃。
传到那个games的网站上啊,待会儿课后我会就是放开这个,放开这个作业系统的提交提交入口嗯,对作业系统我可以再给大家强调一下,就是,OK这cs哎呀,不好意思,作业系统,呃对。
OK作业系统就是这样一个界面啊,大家如果没有注册的话,可以去上一次的这个上一次PPT的,最开始第一页有这个注册链接,先注册这个课程,然后点进去之后会发现有作业,现在作业还没有开放,然后有一个作业零。
也是只提交一个PDF文档这样子的东西,然后我发现好像网上现在已经有两个人提交了,就是这个是用来测试的,是不计分的,然后接下来开放的作业一呢,就是正式计分的部分,好的,如果大家没有什么呃。
如果大家就是没有什么问题,对作业没有什么问题的话,就进入QA环节,当然对作业的问题也可以在QA环节跟我说啊,大家有什么问题吗,OK我是不是可以把我的camera调出来,OK大家有什么问题的话可以嗯。
WSL不是POWERSHELL呃,WSL在上节课讲过了,他是windows下的一个呃,Subsystem,Linux,Subsystem,然后呃如果你在windows下。
它其实就是windows下的一个程序,你运行这个程序之后,它其实就会模拟一个LINUX的环境,让你用LINUX的命令行,能够操作这个windows下的这些文件啊,资源等等,这个上次其实是讲过了的。
上次我包括我做的演示,也都是用WSL来演示的,POWERSHELL是呃是windows自己的一个shell,然后pow s l呢则是windows里面的一个子系统,LINUX系统好吧。
你说深度学习这方面用的多,你是说什么用得多呀,是说我们这两次课讲的内容吗,如果说深度学习的话,我觉得还是上一次课讲的LINUX会用的更多一点,当然对于传统图形学的话,你肯定也是离不开windows的。
比如说我做simulation,那我基本上只会用LINUX啊,不是我基本上只会用windows,因为我没有需要去,没有太多需要去train的一些东西,啊作业有AI的使用限制吗,什么意思。
你的意思是用cg p t去写吗,呃这个,我想想啊,这个事情呢其实就是呃作业它的本质目的呢,其实还是为了大家熟悉一下这两次课的内容,当然呃如果你实在不会的话,去用CHEGT,我我也没办法去查到对吧。
我也没办法查你,所以就允许吧,当然就是我还是希望大家可以先自己思考一下,如果就是去想一下这个作业的这些对应的指令,应该是什么,自己先看一下能不能做出来,然后如果是写出来不对,或者说实在想不到。
你再去问cg p t,因为这几个作业,我觉得啊就是这两次课的课件都是可以查到的,呃但但是这次这个选择选择题稍微有点困难,因为涉及到你需要去安装一个新的软件,然后还需要拍摄照片啊。
以及呃写一些Python的脚本,或者说写其他脚本,写脚本程序,然后这两次课我们都没有去介绍,没有去重点介绍脚本程序怎么写,所以这个东西你可能需要一些网络资源的,这个帮助是可以的,下节课下节课不是我讲了。
下节课是另外一位呃,我的同学叶开来讲课程大纲可以,课程大纲上次的PPT里有啊,下一次讲什么呀,我有点忘了,好像是GSORRY啊,我看一眼,CMD算不算shell的子集,我在课程刚开始的时候说过了。
CMD不算POWERSHELL的子集啊,啊你说的是shell是linux shell吗,如果你说的是linux shell,那这个就更不对了,因为他们的系统都不一样。
然后如果你说的这个shell是power shell的话,也是不对,呃,我课程刚开始说过,就是CMD和POWERSHELL其实是两个完全不一样的嗯,完全不一样的shell程序。
然后你之所以可以在power shell里使用,大多数CMD命令,是因为power shell里的alias的机制,别名机制哦,下节课不是git,下下次课是git,下次课是那个远程工具。
远程控制工具和命令行的环境,是由叶开来给你们讲的,就是远程控制你的服务器,这个还是挺实用的,好的大家还有什么问题吗,power shell和net dotnet是什么关系啊。
其实我对DOTNET没有太多理解,我只知道呢就是DOTNET里面的所有类型,POWERSHELL都是支持的对,然后POWERSHELL其实很强大,就是嗯对他是一个面向对象的,面向对象的一个语言吧。
然后DOTNET里面的所有的类型,那个POWERSHELL都是支持的,常用的库图形学,常用的库呃,你指的是什么语言的库呀,是C加加还是Python呢,如果是C加加的话,我个人常用的是那个数学库。
然后当然也有那个open gl啊,那个open gl还有那些东西,如果你想写这种渲染管线或者什么的话,肯定是需要open gl的,POWERSHELL是命令行工具,没错,打开课程大纲行,稍等啊。
嗯等一下,这个有点奇怪,现在应该可以看到吧,其实blender要讲的话也是最后一节课讲了,然后我也不确定嗯,我不确定,现在这个还没有定,目前想讲的是HDI,当然bra确实它的应用范围会更广一些。
如果讲其实也是在最后一次课讲,然后呃也只能是一个比较浅的一个,带大家的入门,然后更深层的应用还是需要去自学,这个课程大纲其实都可以讲,都可以在课程网站上找到的,天呐图形学应该死嗯。
图形学用Python你得看什么领域,当然是有的了,如果你需要PYTORCH这类,你需要那种呃对就是如果你需要训练的话,训练神经网络,你肯定是用Python是最方便的,因为那个PTORCH是很好用的。
然后最近不是也出现了一款编程语言,叫做太极吗,太极也是在Python里的一个,就是支持Python支持是最好的,所以不能说没有用,没人用Python还是很多人用的,然后追求性能的话,C加肯定是最快的。
但是呃现在太极的性能其实也是很不错的,我现在也在用太极,然后这里给太极打个广告,他可能只是会比C加加稍微慢一点,但是在写程序上来讲,它的效率会非常高,对你不会,因为如果你想写C加加,然后你要运行。
你要用GPU去写QA的话,你需要自己手写CUDA程序,但是写KA是一个,其实KA其实是一个挺复杂的语言,然后嗯太极的话就可以直接都在Python里写,然后太极的语言和语法也跟Python很相似。
呃所以说在太极使用太极的话,会在你保证你效率不是那么低的同时啊,也也可以让你的,就是也可以让你很方便的去写一个程序吧,太极其实效率很高了,比Python比Python高的太多了。
只能说比C加加可能是相当的稍微慢一点点,这个人我个人使用经历是这样子的,渲染推荐的笔记本啊,这个我也不了解,换电脑这个事情还是自己去调研一下吧,一般来讲一般来讲买个什么显卡。
高配一点的电脑应该没什么问题,好的大家没有什么问题了吧,如果没有别的问题,那我们就结束。
OK感谢大家支持。
GAMES002-图形学研发基础工具 - P3:远程控制工具+命令行环境 - GAMES-Webinar - BV1cC411L7uG
哈喽大家好,欢迎来到嗯games002课程的第三节课,然后我是另一位讲者叶开,来自北京大学,然后这节课给大家介绍一下啊,我们的远程控制工具和命令行环境,然后哦这边上右上角有我们的这个课程二维码。
大家也可以扫码这个关注一下,然后那么我们就开始今天的课程,OK目前来说这节课我们要注意的点就是呃,目录里列出了四个部分,我们要学习的第一个部分是远程服务器的使用,包括他的介绍,然后远程控制的基础方法。
远程控制的一些工具,然后以及本节课的第二个部分,就是嗯,简单介绍一下,和远程控制配套的这个命令行环境,包括命令行参数,和我们的一种ZSH这个shell的使用,然后从第一个部分开始哦。
简单介绍一下远程服务器,或者说我们的云服务器,它其实是用来做一些高性能计算的,云服务器,是由服务器供应商提供的这个远端计算的设备,所以哦你有了云服务器之后,你就实际上可以直接通过远程的链接来。
直接使用这些设备去做一些高性能计算,然而不需要就是说你自己去管理这些硬件,然后去配置这些硬件,然后在我们这个图形学,或者在这个智能科学中,最常见的这个啊云服务器,就是LINUX操作系统的云主机。
这些主机基本上都具有强大的硬件配置,比如说32GB以上的内存,然后多核的CPU处理器,以及我们常用到的一些英伟达显卡,进行密集的扩大计算,然后云服务器的来源基本上是呃,这里列出来的两种。
一种是说呃你通过一些租赁的方式,从腾讯云,百度云,阿里云,华为云这些服务器的厂商去租赁一些这种,比如说你按周计费或者按月计费,或者包年之类的一些租赁的一些方式,然后第二种来源就是说嗯。
同样是类似的云服务器厂商,但是你是以科研实验室或者个人呃为单位,然后自行购置这些服务器,并且你自己来维护它,然后比如说放在你的实验室,或者放在你的工作单位,然后呢,你就可以在家里或者在别的地方。
远程去这个连接这些服务器,然后不管这个云服务器的来源是怎么样的,我们都要面临一个问题,就是我们需要从远程去使用这个云服务器,这也是云服务器的意义,就是说你不需要比如说带着它跑来跑去,而是你只只要有需要。
你就可以从远程连接它,然后去提供一个方便的使用,所以由于这个特点的话,呃很多云服务器其实都是呃没有图形界面的,然后需要你去做一些比如说呃终端的一些连接,然后但是其实也有现在也有一些云服务器。
它是提供了图形界面的,可以通过VNC的服务连接到它的远程桌面,然后这个呃我们这里就不介绍了,因为我们这里主要面向的还是啊,就是说当你没有一个图形界面,然后你怎么样去使用你的云服务器。
或者说呃当你通过终端去连接你的云服务器,你怎么样去使用,这里就需要我们呃,借助命令行及一些辅助软件来完成,比如说终端的连接,退出多路复用,然后文件的传输查看编辑比较,以及最后程序的运行和中断。
这几个部分都是呃,呃这个第二第二相当于我们这第2part,就是之前目录里介绍到的这个终端文件,以及程序运行这一部分要讲的,所以接下来就开始介绍,我们远程控制的一些基础方法。
OK然后第一个部分就是我们的终端,因为云服务器的连接,它首先就是一个呃通过SSH在终端进行的,因为呃比如说有的云服务器,它提供一些其他的连接方式,比如说之前提到的VNC,但是不管怎么样。
就是大部分云服务器它一定能通过SSH,然后来让你在终端去连接,比如说当我们在本地打开一个终端,不管你是windows的用户还是Mac的用户嗯,都可以打开一个,比如说CMD或者terminal。
然后打开了之后,一般来说我们现在的电脑,它都是自带一个SSH命令的,然后我们可以通过这个SSC命令,去做一个远程的连接,然后这里展示了一个使用的简单使用例子吧,就是我们可以通过下面所示的这个命令嗯。
就是这一段SH,然后先填你的账号名称,然后加上一个服务器地址,以及服务器开放连接的端口,这三这三个部分基本上是带你,比如说租赁云服务器或者购买云服务器的时候,他就会提供给你的,所以嗯记住这三个部分。
然后之后你就可以在任意的,比如说你的自己的个人电脑上,或者移动的笔记本上,然后用这个命令来做一个连接啊,这里可以举个例子,我看一下,嗯比如说这里我们输入一个嗯,S h,然后输入它的端口。
再输入我们的用户名,然后加上后面的这个IP地址,这个可以是一个,比如说这种呃网址一样的一个地址,也可以是一个就是数字,比如说162。105点什么什么,这样下去的一个这样一个呃IP数字的IP地址。
然后不管是怎么样的地址啊,我们通过这个给定它的端口和地址,以及我们用户名之后,就可以去做一个连接了,比如说这样它就会显示出嗯,他需要你输入一个密码,然后你输入正确的密码之后嗯,你就会发现它提示你诶。
不好意思,你会发现它提示你连接到了这个,远程的一个服务器上,对,然后这个地方。
所以就有一个我们非常关键的部分,就是当你连接到远程服务器的时候,你需要一个验证方式来证明,就是你是这个服务器的所有者,然后一般来说,它默认的方式都是你提供一个密码,比如说像刚才的嗯。
他会告诉你你需要输入密码,然后你就在终端里输入这个当时租赁的时候,他给你的一个密码,然后或者也有另外一种方式是通过密钥的方式,这个密钥就是说你可以通过SSH,在本地生成一个密钥,然后呢以后登录的时候。
你就可以用这个密钥来去嗯,自动的就是它会自动判断你有没有这个密钥,然后这个密钥是否匹配服务器上的一个公钥,然后如果匹配的话,那么它就会呃呃它就会就是不需要输入密码,你就可以自动登录进去。
然后这个是一个验证方式,然后总而言之。
当你比如说通过这种方式登录进服务器的时候,它就会嗯告诉你你已经成功连接了,然后像上面的这一大串信息,就是在服务器上显示的,然后呢当我登录进去之后,我就会发现啊,比如说我原来在我的本机。
我有一个本机的用户名和本机的电脑地址,然后但是当我登录进去的时候,它就会切换成远程服务器的,一个用户名和他的一个地址,然后以及对,以及这里,这里的命令行就已经在远程的服务器里了。
所以这个就是一个终端连接,基本上是比较简单的。
然后哦说到连接肯定也有终端的退出。
就是当我们连接上了这个终端之后,我们怎么样从这里退出,简单的方式就是啊,比如说我们直接把这个窗口关掉对吧,然后他就肯定会退出了,然后但是呃呃也你也可以通过一些主动的,比如说渐入或者通过一些命令来退出。
这个退出的话就比较呃怎么说呢,就比较正常一点,就是是一个标准的退出方式,就是相当于你告诉远程终端,现在你要退出了,然后远程终端会执行一个标准的退出过程,但是如果你像直接关闭这个窗口的话。
有时候远程终端是意外的发现退出了对,所以这两个还是不太一样,那么我们怎么样主动退出呢,就比如说第一种方式是嗯在远程终端这个界面,比如说现在是远程终端界面,然后我们CTRLD,然后他就会发现哦。
你通过这个方式就退出了,他会告诉你connection已经close,然后或者说嗯你在进入远程终端之后,直接输入一个exit或者log out,都是可以这样退出的,然后退出之后。
你会发现你回到了你在本地的那个命令行,就是这个地方已经是我本地的命令行,然后我还可以继续重新连接回来,对然后这个就是一个主动退出的过程,然后也有一些情况是被动退出,比如说当我们比如说我们登录之后。
然后他闲置了太久,或者说你的你登录上服务器之后,因为哦远程连接它是需要联网的,你需要一直保持电脑的网络连接,所以比如说你登上这个服务器之后,你把电脑合上了,然后或者说呢嗯你突然没网了。
然后他就会这个连接,它在过了一定的超时时长之后,它就会断开,然后你在本地会收到一条信息,告诉你远程主机重置了连接,或者远程主机关闭了连接,然后这个情况就是被动的退出,然后不管是哪种退出终端的退出。
都会终止所有的紫禁城,就是说比如说我们连接上远程服务器之后,我在命令行里跑一个什么什么程序,然后呢,呃但是比如说我突然我突然我这个呃,有事要走了,我要把电脑合上了,或者或者怎么样。
或者说嗯比如说呃我要我电脑要充电,要关机,然后不管是哪种情况,一旦这个终端你进行了退出,它就会导致你终端中运行的所有进程,全部被呃这个退出掉了,所以这就导致说比如说我们嗯像深度学习里。
我们想要训练一个神经网络,然后呢可能有时候训练会比较久,比如说你要训练个一天一夜,然后像这种情况,那么因为这个训练命令是我通过远程连接来,在远程服务器上执行的。
所以说相当于说比如说我们这里有一个train,什么什么什么什么一个脚本,然后我们运行之后,一旦你把这个终端给关掉了,然后呃远程服务器也会终止掉这个训练过程,所以这个对我们来说是不可接受的。
因为你使用远程服务器的主要目的就是说呃,我想要方便的,比如说呃能够在远程服务器上做训练,但是我本地可以通过命令行简单的操作它,但是我肯定是希望,比如说他要训练一天一夜的时候,我不我不需要。
把我本机的电脑也一直打开着对吧,然后所以这个时候就带来一个问题,就是我们怎么样去让终端退出之后,终端里运行的所有进程仍然在这个正常运行呢,这就涉及到了终端的多路复用,然后这个是一个嗯对。
比如说对我自己来说会经常用到的一个功能,就是它主要主要的功能呢是一个,关闭远程连接后,原有的这个进程也不会中断,你可以通过一些命令再次恢复出它,然后呃它也有一些其他功能。
比如说嗯比如说你使用这个终端多路复用之后,多个用户实际上是可以看到同一个这个绘画的,就是你可以跟他分享,你的这个终端里的一些情况,然后或者说你可以在单个窗口下,进行一些分屏啊。
这题我们可以来看一下这个它的使用,比如说以这里有两种这个终端,多路复用的软件啊,主要是以LINUX为例,windows的操作系统的话,我们一般对,一般是通过一些图形界面的方式来操作。
然后像LINUX的话,你要操作终端,你就需要一些这个LINUX下的一些多路复用的软件,比如说嗯这里以t max为例,呃,t max的结构是呃,我们分出三种东西,一种是叫绘画,这个叫session。
session是什么呢,就是说嗯比如说我现在连到远程服务器了,那么我就是一个session嗯,我退出了这个session就关闭了,然后一个session下可能有很多的进程呃。
当我关闭这个session的时候,下面的所有进程都被关闭了,这个就是我们刚才说到的一个问题对,那么我们想怎么处理问题呢,就是说我们现在可以通过t max开开启一个,就是开启一个特殊session。
这个session不会因为我们本地的终端的关闭而关闭,所以说比如说嗯,这里我们就可以就可以发现t max,这样我就打开了一个全新的筛选,然后这个筛选是一个特殊筛选,它下面有一些有些子概念。
比如说首先是一个窗口的概念,比如说我们可以看到这个这个最下面这行,绿色的栏告诉你这里有个零这个标记,这个零其实说的就是我我默认打开了一个window,就是打开了一个编号编号为零的这个window。
打开了一个这样的窗口,然后对于这个窗口,我可以在里面进行一些分屏操作,把它变成子窗口对,所以总的来说,绘画这个session这个概念,就是我整一个登录进来的一个概念,然后我的窗口。
就是我可以在这里面开很多个窗口,就像我们的浏览器一样,绘画就是呃这个浏览器的整个的程序窗口,就是浏览器里的标签页,子窗口,就是比如说你可以在标签页里做一些,更复杂的分屏功能,这个后面会讲到嗯。
那么说了这么多,到底怎么样去做一个终端多路复用的操作,这里可以啊,大家简单的看一下,比如说我们要新建一个绘画,就是通过t max,然后new,然后比如说你可以给这个绘画取个名字。
杠S他就呃他就得到了一个新的窗口,比如说杠S1个test,然后我们就进来了一个新的窗口,这个窗口的名字叫test,然后我们也可以选择列出全部窗口,比如说呃比如说t max els。
这样他会告诉你没有正在运行的窗口对,因为我这里,我这里实际上刚才那个窗口被我退出了,呃话说我发现有个快捷键冲突了,我们这里换一个吧,用screen为例子,应该是一样的。
比如说用screen els和t max els是类似的,它会列出来你正在运行的窗口,然后我这台服务器上是已经有一个,正在运行的窗口,他会告诉你这个窗口是从什么时间开始运行的,然后他的状态是怎么样。
然后我们也可以选择接入这个绘画,比如说呃这个窗口是我比如说大家可以看到,就是我这个去年12月就打开了,运行的一个窗口,然后它一直运行到现在,那么你实际上是可以通过恢复的操作去,重新恢复到它的。
比如说我们可以在screen里,它就是杠二杠二就可以恢复过来,然后到这里可以发现哦,你恢复出了当时正在运行的一个进程,它的一个状态,这个进程其实是我这里的一个服务器进程。
然后大家可以看到这里其实是一个日志,然后呢,当我们像我们如果不不不通过这个终端,多路复用的方法去进行这个程序的运行的话,那么当我关掉这个这个终端,比如说或者说当我的Mac电脑它关机了。
那么这整个进程就会终止掉,但是通过现在通过这个终端多路复用的方式,我们可以就是暂时的退出这个进程,这里比如说我这里通过一个操作,暂时的退出了它,它告诉我们的是这个这个进程被挂起了。
或者说它被隐藏到后台了,而不是我像之前的我直接把它退出掉了,所以通过这种方式,我们就可以在这个服务器的后台去运行,一些复杂的这个进程命令,然后呃像我们这里开启的终端,它其实是和之前说的一样。
你是可以用CTRLD来退出的,但是这个退出是一个终止,就是是一个你像呃你像终止进程一样,真的把这个窗口给终止了,而另一种退出是嗯,你可以选择这个断开当前绘画的连接,把当前绘画放到后台去。
然后这个操作就是我刚才展示的操作,然后它可以让你在后台运行一些命令,而不而不会因为比如说你本机电脑的关机,或者其他操作,导致这个进程的断开,然后这里的话呃,绘画操作,就是我比如说我刚才到底是怎么样。
退出那个绘画,这里就涉及到一些组合键,就是这是t max的一个特殊操作,就是说当你在t max的命令里,然后你可以先按住CTRLBCTRLB的话,就是告诉t max,你是你要开始做一些这个特殊操作了。
然后CTRLB之后,它会根据你输入的到底是什么操作,来执行相应的行为,比如说嗯你你CTRLB加S,它就是会让你选择切换到哪一个会画,这里可以展示一个例子,OK我河豚还要试一下我的,这里有个快捷键冲突了。
因为max他的截屏和录制,我这里设的是CTRLB,所以和他冲突,这里把它关掉,然后就可以用TMAX,嗯比如说CTRLB加S,然后他就会告诉你,你可以选一个呃,一个一个绘画来进入。
那么我们这里展示展示一下例子的话,我们就开多多一点的,比如说刚才我创建了一个叫test的绘画,然后呢现在我再创建一个叫test2的绘画,然后这个时候我通过CTRLB加S。
然后就可以发现有两个绘画可以让我来选对,所以这个地方就是一个一些基本的绘画操作,然后比如说我可以从test2切到test,然后在test这里,我可以用CTRLB加D来断开当前的绘画,它会告诉你啊。
你从当前的绘画断开了,但是呢你还是可以重新连接回去,就是通过嗯,通过刚才提到的这个命令接入绘画接入会话,比如说我在这里写t max a,然后杠t test,然后这样我又回来了。
反正类似的就是这样一个操作,具体的使用大家在遇到这个情况的时候,也可以继续的嗯,根据这个PPT的内容,或者说自行的去上网搜索一些资料,总而言之,总结一下我们的终端多路复用,就是为了做这样一件事情。
就是我需要在远程服务器上去后台的运行一些。
比如说一些复杂的一些进程,然后而不希望因为我本地电脑的关闭,导致后台这些进程的一个断开,然后这个就是一个终端和终端多路复用的内容,接着哦,涉及到远程服务器的另一个重要内容。
就是文件的传输,文件传输的话嗯,其实是我们经常会遇到的一个功能,就比如说我们在云服务器上哦,它它有它自己的文件系统,然后我们本地可能有一些我们本地的重要文件,然后想要上传到云服务器上。
或者想要在云服务器上进行,和我们本地这个类似的一些文件操作,比如说你要传输,你要查看,你要编辑,然后这里的话,其实一般来说需要通过额外的软件来进行啊。
比如说我们常见的呃有x FTP或者win s c p,这两个软件都是可以用来做文件传输的,然后呃这些软件进行传输的协议,其实都是SFTP协议,所以嗯这些软件基本上你可以找到,非常非常多的变种或者替代品。
然后这里展示一个简单的例子,就是用这个win s c p这个软件,做了一个呃简单的事例,然后比如说左边显示的啊,这个地方就是我本地的电脑的一个文件夹,右边显示的是远程的文电脑的文件夹。
然后我通过一些比如说把左边拖到右边,或者右边拖到左边,我就可以做一些文件传输的操作,而文件的查看编辑比较,其实也可以通过上述软件来完成,然后有一些情况下会比较麻烦。
就比如说实际上嗯像比如说右边某一个文件,你要去查看它,那实际上你需要把它下载到本地,然后再在本地打开它,这样有时候会显得比较麻烦,所以我们在终端中,有时候也会进行一些文件操作。
这里就其实和LINUX下的一些命令就有关了,比如说我们可以编写一些Python的脚本,或者说我们可以通过LINUX自带的命令做一些查看,然后做一些编辑和比较,然后这里我们就不详细展开了。
我给大家简单的这个看一下,就是我们的一些常见操作,然后这里也可以在我们的远程服务器上,做一个例子,比如说像第一个啊,我们要列出,比如说要列出一个地方的目录,然后这里可以CD到一个地方。
嗯最简单的命令就是IOS,它可以列出当前目录下都有哪些文件夹,然后LS杠ALF这个可以列出更详细的信息,包括文件的权限,它的所有者,它的创建时间以及它的大小,然后我们也可以递归的列出目录下所有的文件。
比如说哦这里可以find data啊,算了,find find这个这个吧,然后你就会发现他列了一大串东西,把这个目录下,所有的递归的这些文件全部列了出来,然后或者我们不想要这么复杂的操作呃。
就是不想要它列出这么复杂的输出,我们也可以就是做一个筛选,列出所有具有特定文件名的文件,比如说我们只想要以JPG为后缀的这些文件,或者说比如说我们这里举个例子吧,我只想要以这个TXT为后缀的文件。
啊好这里没有啊,我想想,那就这样吧,反正比如说你通过这个graph这个命令,它就可以做一些这个字符串的处理操作,比如说这个意思就是说嗯我只看所有的路径里,包含TXT这三个字母的路径。
然后它就可以给你筛选出来啊,比如说当前这个mobile文件夹下面,所有包含TXT这三个字的这样一个路径,然后你就可以根据这个来做一些,特定文件的筛选,然后或者我们也可以统计目录占用的空间。
比如说用这个DUDU名,然后他就告诉你,比如说当前文件夹占了56G,然后其中最大的这个文件夹呢,它占了44个G,就是大概这个意思,然后以及一些统计硬盘的剩余空间,然后或者说我们可以查看文件的内容。
就是直接在命令行里查看文件的内容,比如说cat一个什么什么,然后或者说如果这个文件太长,你可以用后面这个,然后这些嗯这些复杂的文件操作,其实我们不一定要完全掌握,因为嗯它只是提供一种便利性。
比如说列出目录这个选项,你实际上就可以在这个文件传输的这个软件里,去简单的直观的看到,而不需要通过命令行,然后像比如说我们统计目录占用空间,或者说递归的列出某些文件的文件名,这些也可以通过。
比如说你编写一些Python脚本,或者编写一些这种嗯C加加脚本也可以,然后你就可以通过类似的方式,就是根据你自己的需求,去把这个事儿给完成出来,但是之所以要介绍这一页。
其实主要目的还是说有时候有些特定情况下,我们是我们记住这些命令会更加方便,比如说嗯比如说当你真的真的只打开了我,我只打开了一个终端,我没有打开一些其他软件,我就想简单的看一下,比如说这个目录下面有什么。
或者说我就想简单看下某一个目录下面有什么,然后这种情况下,有时候啊简简单单的一句命令是更加方便,这个就不需要特地学,但是会在大家比如说使用远程服务器的过程中,逐渐的熟悉起来,然后以及一些文件的编辑。
或者一些复制移动删除的操作,这些都是一些就是在我们的使用中,会逐渐熟能生巧,会经常遇到的一些操作,然后还有一些像文件的比较操作,然后这一部分就是文件的一些主要内容了,这里并不详细的展开。
因为之后我们将介绍就是不是这么原始的,比如说使用命令行,然后去做一些操作,而是使用一些远程控制的一些软件,像是vs code这样的软件去做一些呃更加方便的事,然后我们可以直接在本地去。
比如说方便的比较文件,去方便的比较目录,然后像哦这里第二节所介绍的方法,都是一个最基本的方法,然后这就是文件的部分,然后第三节这里我们将简单介绍一下,程序的部分,就是我们怎么样在远程终端中运行程序。
一般来说这个其实反而是比较简单的,我们可以简单的理解一下,就是当你进入一个远程终端之后,你在命令行里输入一个命令,它实际上就运行了一个程序了,就比如说我这里输入一个LS,其实它本身就是一个程序。
然后或者我们输入一些更复杂的一些Python命令,那么它其实也是一种程序,这些程序运行起来哦,你就可以像这个像是在怎么说,像是在在这个你本地的电脑上,打开一个窗口一样,然后你想要关掉它,在本地。
比如说像我们的windows系统,我们就可以点一个叉叉,或者或者在右下角的任务栏点一个退出,然后就可以让这个程序退出掉,但是比如说我们在远程终端里运行的程序,它一般来说嗯不能就是你不能通过。
比如说简单的点一个点个关闭来退出,然后像是嗯因为有些复杂的程序,实际上哦你需要做一些就是标准的退出,而不是说你突然关掉这个程序,让这个程序反应不过来,然后他可能有些比如说日志,然后有些输出都会中断掉。
对我们我们一般来说在一个正在运行的程序中,我们是可以通过CTRLC来进行中断的,然后像是嗯,但是这样比如说我这里运行了一个cat程序,然后总而言之它就是卡在这里了。
然后你就发现这个cat程序一直在运行的话,你就没有办法从这里从这个命令行环境退出了,然后但是这个时候你可以通过CTRLC来终止掉,这个命令行环呃,来终止掉这个程序,也就是说一个正在运行的程序。
我们一般都是可以通过CTRLC来做一个程序中断,然后你就会发现你中断了正在运行的这个程序,之后,就回到了原来的命令行,然后你可以去做一些其他的事情对,然后也有一些情况下,这些程序可能因为它卡住了。
或者因为他嗯,它特殊处理了这个CTRLC的这个中断,所以呢你通过CTRLC不能简单的去这个中断掉,这种程序,这种情况下,我们就需要使用更复杂的kill命令,来强制终止程序,不过这种情况一般比较少。
就是嗯正常来说,我们不应该使用kill来强制终止一个程序,除非他遇到了一些意外状况,比如卡住了,然后我们还有还有一种办法,可以查看正在运行的程序,比如说通过P来查看PSAOX。
可以查看哦当前机器上所有运行的进程,然后每个进程他都会告诉你嗯是谁谁在使用,然后他的ID是多少,然后他的占用的CPU和占用的内存,然后或者也可以有一个,就是也也因为PS这个命令你是输入的瞬间,他去统计。
然后你也可以通过这个top命令,来实时的查看CPU的变化,比如说这里是一个哦top命令,它会每三秒监测一下所有正在运行的进程,它的CPU占用,然后并且从高到低做一个排序,然后大家可以看到这里嗯。
他其实是三秒刷新一次,然后就像我们的任务管理器一样,它是为我们统计出目前正在运行的所有进程,然后你去可以有一个直观的感受,就是谁在使用最高的这个资源,然后这个地方你可以通过CTRLC。
也可以通过Q来退出,然后以及还有一些呃命令,像是我们可以去查看哦显卡的占用情况,比如说这里这里可以看一个显卡的占用情况,对然后像这里就说我有一张24G的显卡,然后他已经用了500MB,大概就是这样。
然后也可以去查看内存使用的情况,嗯总之就是类似的这个情况,比如说我们告诉我们,这里可能有一个T的内存,然后呢现在已经用了100G,他还有900G可以用,然后这个就是一些简单的程序运行中断。
以及我怎么样查看这些正在运行中的程序,然后之后嗯,这一部分还有一个对于这个LINUX命令行来说,非常重要的部分,这个大家之前可能已经呃介介绍到,然后但是这里来做一个更详细的阐述,就是我们有两个基本操作。
一个叫重定向,另一个叫管道重定向操作,就是说我们的程序本来它是会输出一些东西的,比如说像我输入这个呃,我要我要查看这个显卡的情况,他就会给我输出一张表,这整张表都是这个程序的输出内容。
然后有的时候我们不希望,就是这些输出内容是输入到我的屏幕上,而我希望比如说把它保存成一个文件,然后这个时候就需要我们把输入,输出流进行一个重定向,然后管道也是一个类似的,就是它的功能就是让一个一个输出。
重定向到另一个输入流,这里到底是什么意思呢,我们可以简单的来看几个例子,就首先大家知道LINUX里的echo这个程序,就是它的功能就是你输入什么就输出什么,比如说我给echo呃,传一个apple。
然后你就会发现它会打印出来一个apple,然后呢比如说我echo一个something,它就会打印出来一个something,在这种情况下,我想要我一口出来的东西,给它存到一个文件里去。
就可以用一个简单的重定向操作,比如说我这里输入一个大于号,这个其实就是输出重定向,我把它输入到比如说什么apple点,大家就可以看到这下面就出现了一个apple text。
然后这个apple text里有什么东西呢,我们可以用cat来查看它,然后你就会发现里面写了写的东西就是something对,所以这个重定向就是一个非常简单,就是我打印了什么东西。
我默认的啊一个一个操作,默认的一个行为是把这个东西打印到屏幕上,但是我通过这个重定向,就可以让本来要打印到屏幕上的东西,打印到一个文件里,然后第二个第二行这里展示了一个追加操作,就是嗯怎么说呢。
我们的这个重定向它是会覆盖这个文件的内容,就比如说我现在输入的不是something了,我现在输入的是一个apple,然后我们再去看这个apple text,你会发现里面的东西全部变成apple了。
然后这个所以说这个重定向,它的默认行为是一个复制,但是有时候我们不希望复制,我们希望就是我们希望的不是覆盖,而是说我把这个东西给追加到,这个文件的末尾去,这种情况下我们就需要一个两个大于号,这个操作。
就比如说两个大于号嗯,比如说这条命令它是什么意思呢,它就是在apple text的末尾追加一个something,那么我们原来的apple text里只有一句apple,然后输入完这个命令之后。
你就会发现它多了一行叫something对,大概就是这个意思,所以在这种情况下,其实啊我们就可以发现,你可以通过这种重定向去做很多事情,像是嗯像是做一些比如说操作的组合,比如说你有一个脚本文件。
你本来是要在控制台上,或者说在你的屏幕上打印一大堆日志的,但是这种情况下,比如说我们可以Python,比如说什么券点PY,然后让他的所有的输出都重定向到一个log点text。
这样的话你就可以去打开这个logo in text,你就知道发生了什么事,就是这样一个类似的情况,然后管道它提供的是一个呃相似的功能,但是稍微复杂一些,比如说我们知道这个一个程序,它有它的输入。
它有它的输出,就比如说像PSAOX这个我们已经遇到过了,它的功能就是打印当前的一些嗯,这种使用的一些情况,比如说当前的进程他用了多少CPU,他用了多少内存,然后一般来说嗯。
就是这里可能显示的还是一个小比较小的例子,一般来说你输入PX杠AX之后,它会有一个特别复杂,特别长的一个列表,这个时候我们可能是希望我只关心其中,比如说某一个用户的它的一个使用情况。
这个时候我们就可以用grape这个东西,来做筛选,比如说嗯像我这里,我我这里只需要所有和DPKO相关的,一个进程,然后你就会发现他这里列出的所有行,都是只和DPKU相关的,然后或者说像我们刚才的例子。
我只关心有特定文件后缀的一个文件,然后这种情况下我们去做一个递归搜索的时候,加上这一句,他就会只包含所有JPG格式的文件,然后这个就是做了一个管道,因为GRAP这个命令它的功能其实是嗯,比如说。
Grab text,这个时候我可以给他输入一些文本,但是不管我说什么,除非我输入的文本里有TT这个东西,否则的话他是不会做任何的输出的,但是一旦我的文本里有text。
他就会这个程序就会把你的输出给输出哦,就把你的输入给输出回来,所以什么意思呢,就是当我们使用管道的时候,你就会发现前一个程序的输出,它必须包含GRAP所规定的这个词的情况下。
GRAP才会把它重新再输出一遍,除此之外,graph都会把你的输入给吞掉,所以通过这两个的组合,你就会发现嗯,它就完成了一个筛选功能,也就是说比如说像这个例子里。
所有不包括name这个词的那些文本的输出,都会被grab给吞掉,然后但是你一旦包含name rap又会输出出来,所以说啊它就使得我p x ax这个命令里,只只有比如说某一行包含name。
它才会被打印出来,就完成了这个目的,然后这里就是LINUX里的一些呃,标准输出流的重定向,然后它以及包含一些复杂的管道操作,所以这样的话,比如说我们当我们成功运行了一个,Python脚本的时候。
假如这个脚本它有一大堆输出,然后它是打印在终端上的,这种情况下,其实啊你会遇到一个问题,就是说嗯我们的我们的终端,首先我们的终端它是有一个显示内容的上限的,就是你拉到头可能可能是有一个上限的。
然后如果你打印太长的东西的话,最开头溢出的东西就会丢掉,所以这种情况下,我们其实是希望把输出结果保存成一个文件的,而不是显示在终端上,所以就可以通过这个重定向的操作,然后也有一些管道操作是可以支持。
你既显示在终端也保存到文件的,比如说好像LINUX自带的这个命令,就是上面,比如说下面这两行的命令,它其实是上面这两行命令的一个一个加强版,就是它不仅能够让你的输出显示在终端,也能够保存到文件。
如果只用上面这两行的话,大家可以发现,刚才其实是比如说我把p x ax的传到apple里,大家可以发现其实是不会打印出来的,而是全部存到这个apple里去了,所以通过下面这两个更复杂的管道。
你就可以既显示在终端,也保存到这个想要的文件里,然后最后我们来讲一下每个程序,它的在命令行中运行的时候,他的一个成功和失败的情况,就是比如说我们正常来说,我运行一个文件,我我运行一个程序。
它运行完了之后,他如果没有爆出什么异常或者没有报错,那么它其实是会有一个返回值的,这个返回值大家可能在写C加加程序,或者写C语言程序里见到过,就是我们的main函数,它有一个return一个值。
这个值其实就是返回值,然后零是表示正常返回的,一旦不是零,就说明返回发生了异常,然后所以这种情况下,其实我们在终端中也可以利用这一点,就是我们可以通过一个这个and这个操作符,来执行多个命令。
然后如果其中有某一个发生异常了,剩下来就不会执行,因为大家知道这个and逻辑操作符,它其实是一个短路的操作符,就是当你嗯当你某一个值为false之后,后面的所有值都不会再去求职了,所以在我们这个例子里。
我们运行了三个program program1啊,两个program program1和program2,然后你会发现如果program1它出现了异常,比如说他报错。
然后program2它就不会继续运行,然后通过这种方式啊,我们可以做一个这个好简单的一个程序的一个,成功性的一个检验,就是说我保证只有前面的所有程序都正常运行,之后才运行,接下来后面的程序。
然后总结一下,其实这里的基本操作还是比较简单的,包括终端的连接退出以及多路复用,然后以及一些文件的传输查看编辑和比较,然后最后涉及到程序的运行和中断,然后这里其实没有什么特别复杂的一些概念。
反而是说比如说某一个知识点,你知道了嗯,之后就一直知道,然后如果你如果你一开始不知道,你可能会花一些功夫得去查找资料,然后像是CSDN或者菜鸟教程这种中文资料。
也可以去外网查询一些这种stack overflow,的一些英文资料,然后不管是怎么样啊,其实这一部分没有特别困难,大家可以就是在使用远程服务器的过程中嗯,逐渐就会熟练起来,然后通过这些资料的查询。
就是前面这么一大堆可能非常复杂的知识,最后其实也会变成嗯你这个熟能生巧,得心应手的一个技能,然后第三部分,我们简单的讲一下远程的控制工具,因为嗯大家也知道,就是像第二节里我们讲到了那么多东西。
其实对于一个初学者来说,或者对于我们刚希希望入门,图形学研究的人来说,或者说哪怕是你啊,完全就是刚买了一个新的服务器,然后呃第一次使用这样的远程服务器,其实啊就是之前的这些各种操作都是有些门槛。
然后我们要怎么样去方,以最简单的这个方式来学习它的使用,其实是有一些远程控制工具可以直接应用的,比如说啊,我我知道的两个比较主流的就是一个是x shell,这个是一个这个集成式的一个软件。
它用来做命令行,包括文件,包括程序运行的一个所有的远程的一个控制,然后以及vs code,Vs code,它本身只是一个编辑器,但是它里面有各种各样的插件,可以支持你做一些远程的控制。
然后这两种工具都可以提供,就是你在本地上有一个图形化的界面去操作,而不是需要比如说特别复杂的终端的,命令行的一个控制,然后我推荐就是比如说如果你不是特别熟悉,一开始肯定是用这种带有图形界面的。
远程控制工具会比较好对,然后我们这里可以用vs code做一个简单的例子嗯,看一下。
可以调一下屏幕,然后比如说我们这里有一个vs code,然后呢它左下角它左下角有一个远端窗口,打开远端窗口的这个一个按钮,然后你按一下,然后它就会有两个选项,一个是连接到主机。
一个是将当前窗口连接到主机,这两个是差不多的,然后你点其中一个的话哦,这里就会展示,就是你可以选择你已经配置好的一些主机,或者说你输入嗯SSH,然后就是你输入一个user at host的一个命令。
就可以添加新的主机啊,比如说我们这里要添加新的SH主机,这里的话就是要把刚才我们学到的嗯,这个SSH username,然后at host,然后gp port这一串命令给它输进去。
具体来说这里三个东西分别填什么,也像之前讲到过的,我们是需要从这个服务器的供应商那里得到的,就是当你租他的时候,他会给你这三个信息,然后有了这三个信息之后,实际上你就可以完成一个。
这个远程服务器的连接了,比如说我这里选我一个配好的服务器,然后去做一个连接,然后他就会告诉你,你需要输入密码,这个过程就和我们在终端里做的操作一模一样,比如说我这里输入密码,然后我就登上去了。
然后这个时候你可以看到左下角,它就会告诉你正在远程服务器上做一个编辑,然后这个时候我们就可以比如说做一些操作嗯,我这里展示一下DK,我们可以去打开一个命令面板,然后,打开一个终端对。
然后这个时候它其实就和你在自己的终端里,远程连接到这个服务器上是一样的对,但是你可能要问,就是我们这样两种方式有什么区别呢,就是在vs code里和直接在终端里有什么区别呢。
就其实在现在目前来说还是没有区别的,因为啊我们目前只是连到了这个远程服务器上,Vs code,还不能就是确定你要在哪个文件目录下工作,所以这个时候我们需要再选择一个文件夹,去打开,比如说远程服务器上。
我这里有一个例子,我们要打开这个文件夹,然后这样vs code就知道,你要在这个文件目录下工作,然后他就会读取这个文件下的,远程服务器上的所有文件,就像我左边列出的这些。
然后这个过程其实就和你在本地使用vs code,是一样的,就是你可以在左边看到哦,当前的文件夹下面有哪些文件,但实际上呢这些文件都是在远程服务器上,所以通过vs code这个方式。
我们可以在远程服务器上,像在自己本地机子上那样的工作对,然后比如说我们这里涉及到一个文件的传输,实际上你就可以直接从本地的文件夹里,把把这个文件拖到这个栏里,然后他就完成了一个这个呃文件的上传。
然后呢如果你想要下载,你就可以选择其中的某一个文件,然后右键点击下载,然后它就会就可以下载到本地了,所以这样就完成了很简单的文件的上传和下载,然后以及你想要查看某一个文件,就直接点它就可以了。
然后这个就是一个vs code,它提供了远程连接,其实还是非常方便的,然后你甚至可以在你的终端里打开多个,多个终端,就同时打开多个终端,然后以及如果你想要做一些更复杂的操作,比如说你想要比较两个文件。
你想要去做一些,比如说代码的高亮或者代码的智能提示,vs code也提供了非常多的这个扩展,就是嗯你可以到这个应用商店里去搜索,大家常用的一些扩展的插件,然后把它安装起来,然后你就可以做一些这个这个。
比如说比如说我这里,我这里应该有一个markdown的一个扩展,可以给大家看一下,就比如说我们的markdown文件,它是有自己的格式的,然后这里可能可能这样,这样子大家可能看到的全是文本。
就是相当于是这个markdown的一个原始的一个文件,然后但是呢它其实是,比如说我在vs code上装了一个markdown,查看的查看器插件,然后我这里就会多出来一个按钮,我就可以打开一个预览。
然后我们在这里打开预览之后,你就会发现哦,我原来的这个文本它又变成右边这个样子,这个就是一个vs code的,各种各样的插件的一个功能,它其实支持非常多,非常多的一种文件的查看和编辑。
然后嗯比如说你可以根据你的需求,然后在这个扩展商店里去查询,然后甚至甚至说其实可以自己编写一些扩展对,然后所以总体来说嗯,通过像vs code这样的这种集成式的,它提供了一个远程连接的服务。
我们其实是可以非常方便地做一个远程控制的,然后这个远程控制,基本上就不需要你做太多的一个学习,有时候你可能只需要搜索一下,比如说怎么怎么用vs code做一件事。
然后或者你在vs code的社区里去做一些搜索,然后就可以找到相关的功能对,那么从这个角度来说嗯,这里列出了这两个工具,它到底有什么区别呢,我们可以简单的看一下,就是像上面这个x shell。
它其实是一个,就是相当于有点像是商用的那种软件,或者说一个专业的软件,然后它是有免费版和付费版呃,呃等等,有没有免费版,我不是很清楚,但是肯定是有付费付费的商用使用版对,所以他提供的其实就是相当于说嗯。
一个相当于专业软件这样的一个一个定位,而vs code大家都知道它是免费开源的啊,不不它是免费的,开不开源,我有点忘了,但反正因为它是免费的,并且提供了一系列的这个呃插件的一个接口。
然后所以其实那些插件都是一个用户社区,他们这个大家群策群力,相当于嗯这样贡献出来的,所以说啊相比于x shell来说,vs code它的优势就是它有一大堆的插件。
然后这些插件你可以去做一个这个选择和使用,然后r x shell因为它它本身是一个闭源的,所以它是没有这种插件支持的,但好处可能是它可能本身有一些强大的功能,然后总体而言的话。
远程控制工具就可以给我们远程服务器的使用,提供非常大的帮助,然后最后我们来简单的讲一下呃,回到我们的命令行环境,我们来再呃这个看一下,比如说命令行到底是怎么样工作的,实际上在一个远程服务器里。
我们是可以分成两个,就是两个主机,一个是我们用户的一个终端,就相当于你在本地,你在自己的电脑上,然后呢一个是远程服务器,它可能可以运行一些呃复杂的事情,那么实际上这里有一个操作的流程,就是说。
比如说我们像刚才我在命令行里输入一个命令,之后发生了什么,实际上就是你输入这个命令之后,你把这个命令传给远程服务器的这个shell,这个shell它就是一个做一个交互的。
然后这个shell读取了你的命令,他就知道该干什么事了,比如说到底是跑一个程序,还是说我要查看一个这个嗯所有进程的使用,还是说我要退出登录,还是说我要做一些什么事,都是shell来读取你的命令。
然后他他告诉具体的进程该怎么样操作,然后他告诉服务器执行特定操作之后,服务器就去运行,运行完了输出操作,结果这个操作结果也是在远程服务器上,然后shell会把这个远程的结果给他传,再传回来。
传到你的终端上,这个时候你的终端就看到刚才那句命令的结果,所以这个过程中其实有一个非常重要的角色,就是这个shell,他扮演了我们从我们的用户的输入,到这个服务器到底要干什么。
这个这个行为之间的它它相当于一个中介,然后这个中介其实是有很多种选择的,就是比如说像windows terminal,大家学到的这个windows terminal。
Windows cmd power shell,它都是一种,它都是一种性,然后像是LINUX上的一个BH或者LINUX上的一个ZSH,它都是也也是一种形,然后呢我们今天可能嗯就是常用的几种shell。
它都是它都是有一个最基本的功能,就是这个命令行参数,就是说当我们啊我们想要运行一个程序,但是你想要特殊的定制这个程序的,一些选项的时候,在我们的windows电脑上,或者带我们图形化界面的电脑上。
我们其实是可以,比如说啊你我有一个窗口,比如说我最简单的大家可以看这个vs code。
How does,什么叫不能动,好吧嗯这不重要,简单来说,就是比如说你可以从上面打开一个侧边栏,还有一系列的窗口,有一系列的命令选项,然后你甚至可以比如说你去做一些文件的配置。
或者做一些这个这个命令行的呃,做一些命令行的一个打开,然后像这些操作在我们真正的远程服务器上,它可能就没有这样的图形界面让你来配置,比如说你想要的某个功能,而它是以一个什么样的形式呢。
它基本上都是以我们的这个命令行参数的形式。
就是你给一个程序输入一个参数,然后这个程序就知道你要做什么特殊的定制,然后像是比如说我这里展示了一个例子。
就是一个特别复杂的一个呃一个程序,然后他就是叫这个ns process data,然后它后面有一大堆的命令行参数,然后这个参数定制了这个程序的一些功能,然后我们其实在我们的编程中。
其实也是已经见到过这些参数的处理了。
比如说C和C加加里面这个它的它的main函数,它就已经有两个参,有两个地方嗯,其实是用来给你解析这些命令行参数,以及像这个Python它其实也是有一个默认的一个库,它用来提供命令行参数的处理对。
但是嗯回到我们刚才的问题,就是说当你一个命令行参数特别复杂的时候,有时候我们其实是希望,比如说我们能不能查找以前使用过的,命令行参数,就是比如说像浏览器历史一样,我可以记住我。
比如说收藏的一些网页我会记住,我比如说几天前用过的一些网页,其实啊是有这个功能的,这个功能就是我们的这个一种特殊的效叫,ZSH里提供的,然后我觉得这个shell算是比如说我们比较通用。
或者功能比较强大的一个shell吧,然后经常比如说大家可以看到,在我自己的终端这里,我用的就是这个shell,这个shell有什么功能呢,就是首先嗯他可以做一个命令行的补全。
就比如说我这里可能我输入Python,然后你就可以看到它已经我输入PYT,他就已经可以帮我补全到Python了,然后比如说我这里再空格,它又可以帮我补全到我上一句用的这个Python命令。
然后我按一下右键,然后他就把它全部补全上了,然后我在这个基础上可以做一些修改,然后这个其实我觉得还是一个蛮实用的功能,就是说它可以做一个命令行参数的历史,然后加上你的一个自动补全,然后这个东西是哦。
这个shell本身叫ZSH,它的配置是非常复杂的,但是有人就是提供了一个开源的,这个这个配置的一些方法叫oh my zh,然后这个基本上就是它的一个GITHUB的网址。
然后大家也可以在网上搜索一些相关信息,然后来这个就是或者一些中文的配置教程,然后像下面这个链接里,其实就有一些嗯简单的配置方法,然后总而言之,当你配置完成之后,它其实是有一些非常多的功能。
除了我刚才提到的这个命令行的历史,你还可以做一些快速的目录操作,什么意思呢,比如说嗯,我们在这里,其实比如说当你想要进入某一个文件夹的时候,一般来说我们就LS一下,然后呢我要看我需要哪个文件夹对吧。
然后我就CD到这里面去,然后比如说如果这个文件夹的名字特别长,那其实我我要把它全部打进去对吧,其实还蛮麻烦的,然后像我们如果有命令行的历史的话,你就可以直接直接找到这个历史,然后你就可以CD进去。
但是呃ZSH也提供了一些其他方法,比如说你在你只需要打前面几个字符,然后在这个情况下按一个tab,它就会帮你自动补全到这个目录下的,这个文件名对,然后像是一些特殊情况,比如说我们先到data里。
比如说这里这里有两个前缀都叫MG的文件,然后这个时候,比如说我想要知道其中一个文件的大小,然后我用ls命令去查询它的大小的时候,然后这个时候你输入前面三个字母,你再按一下tab。
你会发现ZSH它是帮你补全到最长的,它们的公共的前缀,然后在这个基础上你再决定,比如说我想要三七,我就输入一个三,然后再按tab,他就会帮你补全好,如果我想要四二,我就输入一个四,再按tab他帮你补全。
好像这种功能基本上嗯还是比较实用的,特别是像比如说你需要做一个Python,然后你里面需要一个,比如说你需要指定的data的时候,然后这个data假如离你当前的目录特别远,比如说你需要先出去。
然后再去找,然后这个时候你不知道出外面那一层,文件夹里有什么的时候,你就可以按一个点点,然后杠,然后tab,它就会帮你补全出这个外面这一层文件夹下的,所有目录,然后比如说这个时候你想要你的data。
是在是在这个output里的,那么你就输入一个output,output也不用全输,你输入一个O可能它就能自动补全了,然后对像我刚才就是输入一个O,然后按一下tab tab补全,这个时候再按一下tab。
我就能知道output里到底有什么,比如说它它自动帮我补全出example,然后example下有什么,你也可以再按tab,这个时候他就告诉你example下面有这五个文件,然后有这五个文件的情况下。
你就可以比如说我知道我的我的data在这个spark里,然后你再按一下弹,然后他就,然后你甚至可以连按两下tab做一个选择,然后这种情况下你就发现嗯,其实这种路径的自动的一个选择,功能还是比较强大的。
然后他支持一个,就是你在命令行里做一些非常方便的一些操作,虽然还是比不上我们直接在vs code里做一个,图形界面的一个操作,但是对于命令行来说,这种快速目录已经非常实用。
有时候像vs code也会有比较麻烦的时候,就比如说如果我们的我们要找非常远,然后又没有,就是它不是在不是在当前文件夹下的,是在几个其他的一个犄角旮旯里的,文件夹的时候,其实用命令行反而会比较快一些。
然后这个也就是ZSH,提供了一个快速目录操作,然后除此之外还有一些辅助的功能,就比如说它可以标注出你的嗯一些时间,比如说我们这里显示了当前的时间,然后一些文件属性,比如说大家可以看到这三个文件。
它的颜色是不一样的,这是因为它的一个文件属性是不一样,比如说嗯,我看看这里具体来说对,比如说这个是个zip,对于ZSH来说就会有一个特殊的颜色,就是表示这是一个压缩包,然后以及你的虚拟环境。
比如说我们如果使用了Python的虚拟环境,比如说康达,好像mini康纳或者安娜康纳,这里都会有一个康纳的一个环境的名字,比如说我这里叫贝斯,然后如果我用了某一个环境。
它就它这里就会改成那个环境对应的名字,然后以及我们会有一个git的状态,就比如说如果当前文件夹是一个呃git的仓库,这里会标注出一个git的状态,比如说如果是叉叉。
就说明你当前有一些文件需要已经被修改掉了,然后如果不是叉叉,是一个是一个圈,就说明当前文件全部都是啊已经最新的,然后没有被修改过,好像是这样一种辅助的标注功能,对总体来说。
ZSH就是这样一个嗯命令行的一个工具吧,然后我们总结一下嗯,这边的话我们就主要讲了一些远程控制,然后讲了一些哦,我翻到最前,就首先讲一下远程服务器的这个介绍,然后是他的一些基础方法,这些基础方法的话。
它其实是被这个远程控制的一些专用工具,给覆盖了,对,但是这些基础方法也确实是一些,可能是一些比较嗯比较便利的,有时候会需要你去这个熟能生巧的一些方法,然后第三个部分就是讲一下我们的呃。
x shell以及vs code这两样远程控制工具,然后最后简单的介绍一下命令行环境,包括它的参数,和我们的这个一个特殊的命令行shell,然后综上基本上就是啊,我们这一节的所有内容对,然后嗯后续啊。
然后然后本节课是没有作业的,然后后续可能会有一些其他的作业,然后大家可以这个有什么问题,可以在弹幕里这个提问对的,哦不好意思,我这边好像OBS,下移一些吗,我研究一下,对那个补全。
这个有同学说到那个补全确实不是默认打开的,是因为呃是因为就是这个一个默认的ZSH,它它是绝对没有这个功能,然后呢嗯当你配置了OMMYZH之后,那个东西里面其实是有很多插件的。
然后像是补全它就是其中一个插插件,但这个插件其实也算是比较知名了吧,就所以其实你可以在大多数的教程里找到,就是它这个插件应该叫什么,什么什么suggestion对,反正这些就是大家可以自己试试看。
然后如果遇到问题了,也可以在QQ群里就是联系我们,然后我们可以帮大家解答,对,然后呃,我看看,对,然后有同学提到这个图形界面确实就是哦,不管你怎么样来说,如果有一个图形界面,而不是一个命令行的话。
肯定是图形界面最方便的,然后除了一些非常特殊的情况,可能说比如说我命令行简单的做一个哦,命令行一个历史的一个查找,会比这个图形界面更方便以外,其他情况像我们的各种文件操作,都是图形界面更加方便。
然后所以大家也不用,就是说,一定要锻炼自己在命令行操作的一些能力,或者说锻炼自己对这些LINUX命令的熟悉程度,我觉得吧,就是当你有一个图形化的一个界面的时候,肯定是就不需要原来那些复杂的东西,类似的。
可以类比,就是啊,比如说我们现在已经有vs code的远程连接了,我还需不需要用win,在命令行里去编辑一个文本文件呃,这个对这个问题的回答是,就是我们大部分情况下。
绝对是我在vs code里直接去编辑文件要更方便,但是也一定有一些情况是WM更方便的,我们要不要为了那些情况去专门去学WW呢,我觉得是其实是不需要的,就是你最终还是要看你自己更多频率下使用的。
一个更得心应手的一个工具,然后去专门的去就是熟悉那个工具,而不是说我们把时间花在这个命令行上,对,嗯然后然后已经学了,其实也没关系,因为学了绝对是这个,就是会给你带来很多方便的。
像我刚才其实其实我现在一直都在用的,就是vs code,但是呢呃第二节我们说到的这一大堆终端操作,文件操作的方法啊,我我最后也都会了,这就是就是一个就是你这个多多益善的事情,对。
然后呃有同学说QQ群搜不到啊,这个的话确实就是我们那个群,目前还不能它开放搜索,好像需要一个什么什么条件啊,大家暂时可以就是到我们的games002的官网上,然后去扫那个二维码加群。
然后呃后续我研究一下那个QQ群怎么怎么样,开放搜搜索吧。
GAMES002-图形学研发基础工具 - P4:Git+GitHub - GAMES-Webinar - BV1cC411L7uG
哈喽哈喽嗯,应该可以听到吧,然后大家好啊,这是我们games的这个第四次课程,然后嗯,这节课程大概我们花一点时间来给大家讲一下,git和GITHUB之间的使用,嗯那么首先我们介绍一下get这个概念。
就是git,它是一个相当于是一个软件包,然后它它的功能是一个版本控制的功能,然后什么是版本控制呢,其实呃如果比如说对于大学生来说,可能有一个非常常见的例子,就是我们比如说有个小组作业。
然后要共同修改一份PPT,然后我们要在微信群里,比如说大家互相把自己修改完的文件传到群里,然后结果就会出现一个情况,就是我们可以有可能有一大堆这种文件,说什么小组PRE点PPT,然后小组PRE修改版。
修改版一,然后最终修改版,最终最终修改版等等,就是当你如果没有一个版本控制的软件的时候,我们去做这样一件呃,这个共同协作修改的,或者说哪怕是只有你自己一个人在做一个修改。
然后如果你想要追溯每次修改的版本,或者说你想要去做一些这个呃修改的就具体,比如说我修改了哪些部分,我我对这些是有一个掌控的,如果要做这件事的话,我们一般来说哦,最粗暴的方式就是像我这里列出来的这样。
我们去准备很多很多个文件,然后这些文件之间可能各自有一个小的修改,但是这样的缺点就是呃,这种方法我们会导致最终大家可以看到,就是首先从文件名上,可能它基本上无法提供太多信息,就是你看着这这一系列文件。
你是不知道嗯,呃我可能两个版本之间到底有什么区别,然后可能甚至有时候你都不知道,哪个是最终的最新版,所以这种时候就需要引入到我们get呃,作为一个版本控制软件了,那么什么是版本控制呢,嗯就是相当于说。
比如说我们之前的例子都是共同编辑一份PPT,共同编辑一份代码,然后最后搞不清楚每个版本修改了哪些部分,一旦有错误,就比如说你的修改和别人的修改呃,它不同步,或者有有什么错误需要你回溯去对比,就非常麻烦。
所以get他做的事情,其实就是我们这里的困难的点就是,首先嗯git能帮你搞清楚版本和版本之间,文件到底有哪些变化,其次git能帮助你追溯这些变化,并且在你需要做回溯和对比的时候,get可以帮你处理。
那么回到git,什么是git,git其实是一个开源的分布式的版本管理系统,它可以非常有效并且高速的处理呃,从非常小的项目,到非常大的这种项目的版本管理,然后他最初是LINUX。
他为了帮助管理LINUX内核系统而开发的一个,开源版本的版本控制软件,所以git它基本上它的功能其实是比较强大的,只不过我们平时可能用不到git的所有功能,就是其实我们不一定啊。
比如说用一个复杂软件的时候,不一定要成为这个软件的专家,你只需要哦,让他尽可能的适合你正在处理的这个工作,或者那尽可能的辅助到你目前手头的事儿,就可以了,我们这里呃要学的功能其实就比较简单。
当然git的全部功能肯定不仅限于此,但在本节课中,我们基本上要注意的是,首先是它的版本管理,自动追踪每个文件的修改。
然后比如说呃,这里有一个那个命令行控制台的一个例子,就比如说我这边输入这个呃,git的一个status的命令,让他告诉我目前我这个代代码仓库,或者说我这个代码文件夹,下面的情况是怎么样的。
然后他会告诉你三条信息,第一条是说呃告诉你在哪个分支,这个分支是之后可以学到的一个概念,然后第二条是呃,他告诉你哪些文件是你已经暂存了,然后之后就可以做提交的一个呃文件。
就比如说这绿色的是我已经修改了这些文件,并且我把我的修改给保存下来了,然后最后红色的就是嗯,它会告诉你哪些文件和之前的版本相比,它已经发生了变化,但是这些变化你又还没有把它给记录下来,对总而言之。
基本上它的最大功能就是,自动追踪每个文件的修改,然后其次它还可以去追踪每个版本的差异,相当于我们可以,这个人为的去定制很多的版本出来,比如说呃像这里列出的,它每一个黄色的这个commit。
它都代表了一个一次提交,然后每个提交我们可以简单理解为,它是一个版本,然后每次版本它有一个简单的说明,这是在你提交的时候去做的一个注释,然后版本和版本之间其实大家可以看到,比如说呃第一个版本是这个啊。
这个10月14号的七点,然后第二个版本是10月14号的12点。
然后我们在这两个版本之间,其实是可以做一个对比的,就当你使用一个啊。
get这个作为一个对比功能的时候,然后他就会在命令行啊,向你汇报所有的这个呃文件的修改,就相当于它直接对比这两个版本,然后比如说这里最下面这里显示的红色和绿色,就是呃,比如说版本A相对于版本B。
它新增的部分就会以绿色的显示出来,然后版本A相对来说少掉的那一部分,就会以红色的部分显示出来,然后ticket基本上主要的版本管理功能就是这样,它会追踪文件的差异,然后能让你记录文件版本。
然后并且自动追踪每个版本的区别。
那么它其实还有一个功能,就是分布式的一个协作啊,这个到底是什么意思呢,就相当于说呃我我同样一个代码仓库,我可以有不同的人,大家一起协作去修改这个呃仓库,并且它是分布式的。
就是说嗯我不需要我不需要存全部的文件,我可能每个人手头只有一个git的一个,比如说我我只存部分的版本,然后呢,我最终把他们汇总到远程的一个集,中于一个集中式的一个地方的时候。
然后git就会自动帮你去计算,你们之间版本的一些差异,然后完成一些合并操作,或者完成一些这个提交修改覆盖等等的操作,所以git基本上它最大的两个功能,就可以简单的概括为,第一个是版本管理。
第二个是能够允许多个人同时协作。
然后去做版本之间的合并和处理,然后这里还有一个分支的概念,其实这个分支相对来说更像是我们的一个呃,我们的一个版本这样的概念,但是呃区别大概在于,比如说这张图里的每个小圆点,它都代表了你的代码整。
就你的所有文件它的一个状态,比如说这个状态和这个状态之间,它可能有一些微小的修改,然后这两个修改嗯,它们分别形成了两个版本,就比如说这里是版本一,然后呢这里是白板二,然后比如说这里是版本三。
但是版本和版本之间,比如说我怎么样去呃,哦就比如说对比版本一和版本三之间的区别,它实际上是把一和二的区别,然后加上二和三的区别,这样子组合在一起,相当于我们在git的这个版本的历史版本上。
可以找到一条修改的一个线路,就比如说我一开始是一,然后加了一点东西变成二,然后再加一点东西变成三,那么这条线路其实可以,就我们就可以把它叫做呃这样一个分支的概念,那么大家可以看一下。
就是比如说比如说我现在这个例子啊,假设我们把这个叫做版本一,然后呢,这个比如说我现在有一个新的节点,在这里是版本一上面做了某一个修改,然后来到了一个新的节点,但是同时我版本一做了另一个修改。
然后他又来到了这样一个节点,就是相当于我有两个从版本一派生出来的节点,然后这个时候其实这两个节点,它对应的就是不同的一个呃,你可以叫世界线也好,或者你可以简单的就是认为它就是一种分支。
相当于说呃我们从这个本来是一致的,这个版本一分裂出了两种不同的可能性,然后这两种可能性之间它本身是呃这个互斥的,因为它们都基于相同的版本,而不是像前面一样是一个线性下来的过程,所以这个东西做到分支。
相当于我们在嗯,通俗的理解,就是我们在这个这个世界线上发生了一个分裂,然后对,然后最后就会像图中看到的,比如说我可以把这条这条分支叫做DEV分支,然后把上面这一条分支叫做我的master分支。
然后这里就是一个分支的概念,这就使得我们可以方便实现一个功能,就是说嗯,我可能代码有一个稳定版和一个,正在开发中的功能,那么我肯定不希望,比如说我开发者开发者,然后我原来稳定版的那些功能。
都已经就是没法用了,所以呢在对于git来说,如果你用git来做你的代码的版本管理,那么实际上可以实现的事情,就是嗯我同时维护一个master,这个master是稳定版,然后我想要新加一些功能的时候。
我就开一个新的分支,比如说我开的这里有一个DEV分支,这个叫呃开发者或者叫develop,然后我在这个分支上去做一些特殊的修改,这个修改并不会影响到我在master,分支上的一些结构。
然后当未来有某一天的时候,比如说我觉得我在DEV分支上的修改,已经成熟了,已经稳定了,通过测试了,然后我可以把DEV分支的所有内容给它,合并到master分支里,然后这个就就实现了我们的一个版本管理。
所以简单来说呢,呃版本管理它和刚才说到的追溯文件修改,它有一个更大的不同,就是相当于版本管理,它对应了这个分支概念,这个这个分支概念它对应了一系列文件的修改,相当于我记录了这个修改,这个修改和这个修改。
然后并且我有另一条线路是这几条修改,然后它可以管理这些连续的修改,并且形成最终的分支,所以基本上这就是get it,我们需要学到的主要功能,这里可能还有点抽象,然后后续我们可以讲一些更具体的例子嗯。
具体来说首先get它既然是个软件包,我们肯定要有一个使用方法对吧,那么它其实呃它其实有多种变体,毕竟因为git本身是开源的,所以你其实嗯像社区他们其实是实现了很多种。
比如说git的辅助工具或者一些呃图形化的界面,比如说像对于我们呃命令行来说,其实是有直接交互的,就是我们在git官网上可以下载,直接可以用命令行运行的G,然后git也提供这个图形化的界面。
比如说我们可以用一个git ji,这个应该是比如说windows上下载git,我感觉嗯应该是会自带一个GOI的,就是它自带一个图形化界面,然后如果你也可以就是通过GITHUB下载一个。
比如说github desktop这样的一个桌面的管理的软件,然后它上面也有一些这个图形化界面,可以提供你进行一些git的操作,然后比如说右边,这就是一个这个这个github desktop的例子。
然后我们可以看到呃,它其实就和你在网页上打开GITHUB有点像,只不过呃对于github desktop来说,他操作的是你本地的一些文件,然后这里kit的话,命令行也有一个简单的安装方法。
这里列的应该是LINUX上,LINUX上,比如说我们因为git已经是个非常知名的包了,所以基本上你直接运行安装命令,都可以把git给装上,嗯然后这里这里是给个简单的例子吧。
比如说我现在就打开了一个命令行,然后我们可以试一下,就比如说嗯这里应该有个git,然后你在命令行输入git的话,它会告诉你一些基本的git的使用方法,然后这里其实会有很多很多很多这种子命令。
就是叫比如说get clone或者get in it,get ADD这些,然后大家可能平时使用过程中,也遇到过一些子命令,然后我们这里可能只要掌握它最简单的几种,就能完成一些基本的git操作就可以。
比如说像这里其实有一些比较复杂的命令啊,我自己平时也基本上不会用到,然后嗯有一些更加复杂的,涉及到分支之间的特别,比如说合并啦这种,或者说你对你需要对git的一些特定操作,进行一些微调。
然后他就会涉及到特别复杂的git操作,嗯但在讲这些之前,我我我们可以用一个最简单的抽象的模型,然后来介绍一下get的原理,就首先嗯git它的原理是怎么样,就是为什么get it能够去做一个文件呃。
修改细节的一个追踪,或者说为什么他能做一个版本管理,它其实首先是这样的,它会指定一个目录作为你的工作区,这个意思就是说呃,这个工作区里的所有文件都是我要关心的,我这个get要关心的一些这个呃。
我需要去追踪他的修改,我需要记录它的版本的一些文件,然后这个时候get就会在工作区,它生成一个专用的文件夹,这个文件夹一般来说是隐藏的,就是比如说嗯像像我们在Mac或者LINUX上啊。
一点什么什么开头的这些文件夹,它都是默认隐藏的,你一般来说是看不到他的,但是你可以在命令行输入LS杠A,可以看到全部的,就是点开头的这些特殊的隐藏文件夹,然后嗯这些点点git文件夹。
就是git他用的一个隐藏文件夹,然后他是把所有的信息都存在里面,然后它会作为我们的一个版本库,里面会存这个版本变化的一些信息,然后这个点git里它还会有一个新的文件夹。
它叫index这个东西是作为我们的暂存区,这里有一个非常重要的概念,就是工什么叫工作区,什么叫版本库,什么叫暂存区,嗯只要搞清楚这三个概念,基本上就可以明白get到底是怎么一回事了,那么嗯所谓的工作区。
其实指的就是呃我们的这个目录,下面的这些文件,就相当于我在编辑器里打开的文件,或者说我在我的文件夹里,能直接看到的这些文件,它就叫工作区,然后呢在我们的这个特殊的隐藏文件夹里,它其实是会记录你的版本库。
这个版本库简单的来说可以理解为,我们每次提交一个版本的时候,这个版本所有的工作区文件全部被存到了,这个版本库里,相当于我们可以想象一下,比如说我有一个V1。0的版本,那么B1。0的版本里。
可能就会有我全部的文件,就是相当于我把我整个工作区的一个拷贝,一个副本存到了这个V1。0版本里,然后现在我再做一些修改,我就是比如说V1。2,然后又可以从一个新的版本进去,那么这些1。01。2之间。
它就构成了一个版本库,然后我们可以随时从版本库中,提取出历史的这个代码,然后最后一个是所谓的这个暂存区,什么叫暂存区呢,就是说呃我的文件已经发生了修改,然后文件修改的时候,git是知道你的文件被修改的。
但是git它不会记录这些修改,就是相当于说get it知道你修改了文件,但是git还没有去把这些修改给记住,那么呃暂存区就是我让git来先记住我的修改,相当于说呃我们我们做的所有改动。
可以通过git ADD来存到这个暂存区中,暂存区它不像版本库,因为它里面只是一个临时的,就是把你的临时的修改给它保存到里面去,同时暂存区也不是工作区,因为这个暂存区其实是一个虚拟的概念。
就是嗯相当于他是追溯你的一些文件的改动,而不是实际上存了一份,比如说你改之前的文件或者改之后的文件,这样嗯,然后我们做的改动在暂存区里的时候,比如说我改了一个文件,我把它存到暂存区。
这样get it就知道我修改了这个文件,并且它会暂时的记录下这个文件的改动,然后当我暂存区中的文件足够多的时候,比如说我修改的修改着觉得这这个时候,比如说我应该变成V1。3了,我应该可以升级了。
然后这个时候我们的暂存区里面的所有修改,你就可以把它提交到版本库里,然后它就形成了一个新的版本,于是这些修改就会帮助get it,让他知道我从1V1。2发生了这么多变化,然后形成了V1。3。
这个时候你就会清空你的暂存区,然后形成你的一个新的版本库,所以这个就是get commit做的事情,那么简单的来说呢,呃我们最基础的两种命令就是get a和get commit了。
呃一种叫做这个可以理解为gt可以理解为暂存,然后get commit可以为可以理解为正式的提交,也就是说get at它是一个暂时的提交,get commit是一个正式的提交。
那么呃这样可能讲的还是非常抽象,但是我们这里可以看一个新的例子,我看一下怎么样找个兼职,比如说我们在我们找到了我桌面上的一个games,002的文件夹,然后我给他新建了一个这个K002文件。
然后我在我在里面新建了一个TP文件夹,就是相当于我在命令行里输入这一句,就可以,在比如说当前目录下,新建一个名字叫做tap的这个文件夹,然后有了tap这个文件夹之后呢,呃我看一下这能直接开,哦在这对。
然后这里就是我们新建,刚刚新建的一个空文件夹,然后这个时候嗯我们也可以,我们就可以在里面新建一个git工作区了,这个时候其实就是说相当于你告诉git,这整个temp文件夹下面的所有内容。
都是我要关心的一个内容,所以我们就可以通过get in it来新建一个工作区,那么这里演示一下,就是这样get it,然后他就会告诉你啊,这个信息,就是他说我在这个,我生成了一个新的空的git仓库。
然后在这个路径下面,并且大家可以看到它的它的版本文件,其实保存在这个点,get it这个子文件夹里,然后我们一般来说是看不到的,然后像刚才这样,这里其实也没有对吧,但是其实这个文件夹是存在的。
当年IOS杠A的时候,你就会看到这里是有一个点get文件夹的,然后你甚至可以看看里面有什么东西,就里面有些一大堆乱七八糟的东西,然后这个时候,反正我们已经初始化了一个新的空的git仓库了。
然后这个时候get status,它是可以查看当前的工作区的状态,那么我们可以演示一下,就是呃他告诉你,首先我们在一个我们在一个main branch上,这是它的一个默认的分支,这个可以先不用管。
然后他的第二句话是他告诉你没有分,没有commit需要提交,相当于说呃因为我们毕竟是一个空的文件夹嘛,所以我们还没还没有做任何改动,还没有办法形成一个版本,所以他告诉你什么东西都不需要提交,然后这里。
如果是你用的是中文的git,他会告诉你位于分支这个master,然后上午提交,并且没有文件要提交,然后这个时候我们可以试试看新建一个文件,比如说我们在这里用上节课学到的这个命令。
比如说EQU到这个A点TT里,这个时候其实是会在会在这里生成一个文件,文本文件它叫做A点TT,然后它里面有什么内容呢,它里面有这个something这一行,然后这个时候你就会发现,比如说我用的这个终端。
它告诉我它这里从圈变成一个叉了,就从绿色的一个圈变成一个红色的叉,其实意思就是说你现在的工作区发生改动,也就是说get it其实能知道你修改的文件,比如说我这里的行为。
其实是新建了一个叫做A点text的文件,然后这个时候get it就知道了,那么知道了之后呢,我们这个时候再输入git sees,他就会告诉你,首先git知道A点text被修改了。
其次这些修改git没有去暂存它,也就是说G呃get it只是知道修改,他没有把这些修改给记录下来,嗯那么这个时候嗯就像这里说的,我们我们这个get stus告诉你了两件事,一个是说你有修改。
第二个是你的修改还没有被这个记录,那么我们我们这个时候,如果我再把这个A给删掉,大家可以看一下,然后你就会发现这个get get他的git的状态,又变成一个圈了。
然后对应的话get get saders,他就会告诉你啊,我又变成一开始的空的状态,这个是什么意思呢,因为git只能知道你的文件被修改了,但是它没有记录,所以如果你把这个修改恢复回去的话。
get就不会知道,就是gay会发现你现在工作区又没有变化,相当于和他知道的上一个版本,也就是他知道的一个全空的一个状态是一致的,然后这个时候get就会告诉你,当前的这个工作区。
和之前get it知道的那个版本没有变化,然后他就会告诉你啊,一切正常对,所以所以说我们虽然是做了这样,A点TT的一个修改,但是如果你不把这个修改记录下来的话,其实这个修改是就是随着你把A点TT给改掉。
这个修改是会变化的,所以啊我们这里其实是需要用到一个操作,就是git ADD来做一个修改的记录,那么呃这个这个这里大家也可以看一下PPT,就是这里具体来说什么叫做呃,有一个尚未跟踪的。
或者说是修改尚未记录的,它其实就是说你工作区里的文件的内容,和版本库里的记录不符合,我们因为是个空的呃仓库,所以这个时候版本库里的记录,也是一个空的记录,然后只要你就是只要你的当前的工作去飞空。
然后他就会告诉你和版本库的记录不符合,但是这个记录没有,就是这个改动并没有被记录,所以说呃,当我们再把这个仓库恢复成空仓库的时候,你就会发现这个git又不知道你修改过了,他又会告诉你现在一切正常。
对的嗯,那我们怎么样去跟踪当前改动呢,其实很简单,就是加一句git ADD呃,这个我们在,我们再把刚才那个A点text给创建出来,然后到这里大家可以发现这个A点task,又出现了,然后并且kit告诉你。
这个东西它是一个未跟踪的一个修改,然后这个时候我们想要记录这个变化,就是我们想要把A点TT的出现给他记下来,这里就可以用一句git ADD a text,这个时候大家可以看到右边还是一个叉叉。
这是因为这是因为你目前确实还是修改了,就是说你和上一个版本之间还是有差别,所以这里状态还是一个叉叉,但是当你kid cus的时候,他会告诉你嗯这里A点TT会变成一个绿色。
这个绿色的意思就是说它已经被暂存了,这条修改已经被记录了,这个时候A点TT已经在暂存区里,然后如果后续A点text它再发生变化的话,我们其实是可以知道这个变化的,比如说我这里我这里再给他加一句。
加一行something,原来只有一行嘛,我现在通过这个语句再给它加一行,然后现在可以看到这里变成两行的something了,然后这个时候嗯你再去看GCUS,他就会告诉你。
首先我这个有一个就是暂存区里有一条记录,就是说我新建了一个只有一行的A点text,其次他会告诉你暂存区里的这条记录,它和现在A点TT的状态也不一样,所以他会告诉你A点text它又被修改过。
就是离你刚才记录的时候比起来,它也它还是又被修改过,其实就对应着我们刚才这个,我在A点text里新加了一行something,所以这个时候如果我们想要去看,我离这次暂存的时候。
我的A点text发生什么变化,可以通过KDF来查看,或者get def一点text可能更具体一点,然后他会告诉你哦,就是这里会显示一个带颜色的一个something。
就告诉你这里加了一行something,然后原来的原本一样的地方,它就会用黑色来显示,然后告诉你第一行something是原来就有的,后来也还是在,然后第二行something是原来没有的。
后来新增了对,大概就是这样一个意思,所以说呢嗯到目前为止,大家要注意,我们都只是在做一个工作区的一个修改,和一个暂存区的修改,我们还没有记录任何的版本,所以版本库一直是空的,并且我们没有提交过任何版本。
然后这个时候,如果假设我们现在已经做了一系列改动,比如说我现在又加了一行,然后我再把这个新的新加的这一行给记录下来,然后你可以发现呃,新加的这行确实被记录下来了,然后这个时候。
假如说我说我已经改好我的代码了,我需要一个新的版本,然后我就可以通过git commit产生一个提交,这个提交的意思就是说,相当于我让我让当前工作区的所有文件的,一个快照,或者说它的一个当前的状态。
全部被记录到版本库里去,然后它会作为一个呃新的版本出现在版本库里,这样以后,就是我就随时能够和这个版本去做比较,或者和这个版本去做一些恢复操作之类的对,然后这个就通过git commit来实现。
比如说我们可以可以commit,一般来说你是加一个杠M的参数,然后在这里写一句,比如说写一句message啊,这个就是相当于我们之前之前看到的那个提,关于提交的一个注释,就是比如说之前看到的嗯。
这个地方这个地方一共有三个版本,然后其中的这一行就是这一行。
然后这一行和这一行,这三行其实就是我们当时提交的时候,对它的一个说明,所以这个说明其实一般来说不用写很长,就是我们可以简单的讲一下,你到底做了一个什么样的修改。
所以我在这里的话,我就简单说一下,我我新增了一个A点TXT这个文件,啊不好意思,多打了一个银行,这样,然后这个时候他就会告诉你哦,git就会告诉你,首先我把一个这个commit给提交了。
这个这里可能有点他就是他说的有点抽象,但这句这一行的意思其实是嗯,我产生了一个新的commit,这个commit有一个编号,就这里的一个这个这个,16进制的码的一个编号,并且它的说明是说明在这里。
就是我刚才打的这一行,然后他会统计出当前的版本,比起上一个版本有哪些变化,然后首先他会告诉你有几个文件变,其次有几行新增了几行,删几几行删减,然后最后他会告诉你嗯新增了哪些文件对,大概就是这样一个区别。
然后这个时候我们可以再查看一下状态,而且大家也可以注意到右边这个地方,它的状态变成了一个圈了,意思就是你和最新的版本已经一致了,我们的工作区和版本库的最新版本已经一致了。
这个时候get seus会告诉你嗯没有新的东西要交,并且WALTREE是一个clean的,也就是说哦我和上一个版本是一模一样的,所以这里没有任何的修改对,然后这个时候我们其实就有一个历史版本了。
那么我们要怎么去查看这个历史版本,最简单的方法就是用这个GLOG来查看,然后我们输入git log,大家可以看到,在这里有一个这个一个简单的log信息,首先他告诉你我commit的一个编号。
相当于我上一个版本的编号,然后其次他会告诉你作者是谁,然后日期是谁呃,然后最后是关于你对这个版本的一个说明,这个就是一个简单的去查看版本历史,然后如果我想知道这个版本具体的情况的话。
其实是根据这个编号可以进一步的查询,然后刚才这个界面它会打开一个,就是类似于VM那样的一个全屏窗口的一个界面,就是说它会占据你命令行当前窗口的全部内容,然后这个时候我们按Q就可以退出。
然后最后总结一下啊,我们这里列出了刚才涉及到的功能,以及刚才涉及到的一些呃,其实刚才没有讲的功能都已经列出来了,然后呃这里可能我们经常使用的是前面这四个,然后后面这四个其实基本上用的不是特别多。
嗯这里我们一个个看吧,就第一个嗯刚才讲过是初始化,然后这个是把文件的改动给存到暂存区里,这个是把所有文件的改动存到暂存区里,然后git committer就是提交一个新的版本,并且附带上你的一些说明。
然后下面这四个哦,就是大家可以看到上面这四个,其实都对应着你增加什么东西,比如说我增加一个暂存区的内容,或者增加一个新版本,下面这四行就其实就对应了删减哦,那么删减怎么删减呢。
啊右边的文字其实给出了说明,但是如果你想要就是啊真正理解,就是比如说这个说明到底是什么意思,就需要掌握这个三个东西的概念,就是我们刚才提到的工作区,暂存区和版本库,所以这个地方可以简单的看一下吧。
就是首先get check out杠杠,然后加一个文件名,这个是什么意思呢,就是说我的工作区和我上一个版本之间,发生了一些改动,然后呢我通过这一行命令,把我工作区的这些改动,恢复到我最新版本的一个状态。
比如说我们在这里,我们在这里又新建了一个文件,然后新建了比如说一大堆文件,然后大家可以看到这个时候已经有A点text,B点text和C点text,然后呢我上一个版本其实只有A点TT对吧,然后这个时候呃。
假设你做了一大堆修改,然后呢或者说你误操作,然后搞了一大堆无关的文件,或者或者怎么样,Anyway,就是当我们想要把当前的状态,假设这些都是都不是我要的,就是B点TT和C点TT都是垃圾文件。
我都不需要它,然后我想要把我的工作区的状态,恢复成我最新版本的状态,这个时候可以简单的用一个get check out,然后刚刚后面填一个文件名的,意思,就是说把这个恢复成最新的,上一个版本库的状态。
那么因为呃,因为B点TT其实在上一个版本库里不存在,所以其实这个操作,这个操作其实就会把它给删掉,对所以这个这个地方可能不能用,因为上一个版本里B点text并不存在。
所以这里可能比如说你就简单的加一个点就好,这个点的意思就是所有文件的意思,所以这样写的话,那不好意思,Check out,这样写的话,其实是说把当前工作区的所有文件,全部恢复成上一个版本的样子。
那么我们输入这条命令,然后你会发现哦,这两个文件还是在这里,但是如果你对A对A点text,文件有任何的修改的话,A点TT就会变回去,那么这两个文件为什么会在这里呢,是因为呃它其实是从工作区丢弃掉。
你的这个改动,关键是呃如果你对这些改动有记录的话,它在暂存区里,然后你就可以去做一个这个呃恢复,比如说哦比如说我这里举个例子,我们把这两个文件加到我们暂存区里,然后这个时候呢我们我们要怎么样去。
比如说这个暂存区里有B点TT和C点TT,我们要怎么去这个呃,撤销掉,把它们从我们暂存区里删除,然后其实就可以用这个,然后比如说我们gm,然后刚刚开始一点text,然后他就会告诉你。
你把这个东西从暂存区里删掉,然后你就会发现我在status的时候,它又变成一个没有改动,没有记录的一个状态,对,那么呃比如说假设假设我,我我确实像刚才所说的,修改了这个A的状态,比如说,哦不好意思。
这是拼错,然后再把C点删掉,OK我恢复到上一个版本的状态的时候,假设我们在这个时候又对A点TT做了一个修改,比如说我给他加再加了一行进去,然后呢这个时候我们要怎么样去把它恢复回去。
其实就是用刚才说的这个get check out,然后加一个A点text,然后你就会发现嗯,虽然我在这里新加了一行,但是A点TT并没有三行,而是还是两行,这个其实就是因为这句命令。
他把A点TT给全部恢复了回去,对,然后下面这四个,反正总而言之呃其实可能也并不是那么常用,比如说对我自己来说,我可能就经常用的是get check out杠杠,然后加一个点。
就是把所有的修改全部撤销这样一个操作,然后最下面三行,我自己平时其实用的也不是很多,然后基本上这三个还是蛮蛮容易混淆的,就是比如说你好久没有学习git的使用,或者说嗯你隔了好一段时间。
然后你去想要做类似的删除操作,而这个时候你就很容易不知道应该用怎么样的,删除操操作,所以嗯一般来说,当我们想要做一些git的删除的时候,特别是最下面三种语句嗯,最好还是比如说你确信嗯。
这条命令有怎么样的效果,然后具体比如说具体到底有怎么样的效果,我们其实是可以通过搜索来知道的,然后呃,通过这一点来确定,它能够达到你想要的效果之后,然后我再去执行这样的命令,对。
因为git它确实这个删除的话,从什么区里取消掉什么东西,或者删除掉什么东西,确实是一个蛮容易混淆的概念,然后像我们平时使用的基本功能的话,最常用的比如说我们如果不考虑远程的协作。
我们只考虑本地的自己的使用,最常用的就是前面这四种,然后以及还有一些就是,比如说我我们我们可能会问,就是费这么大周章,然后你把这些工作区版本库给他存下来之后,有什么用呢。
其实基本上的用法就是我们可以去看,比如说两个区的文件差异,我们可以去看文件的版本历史,我们去看可以去看它所有版本历史,或者可以去看它逐行的一个文件改动,这些都是一个比较有用的功能。
最后还有一个项目里其实经常遇到的功能,就是你可以设置我get到底不关心哪些文件,比如说我们在这个例子里嗯,我们我们其实往这个tap文件夹下面,随便加一个什么东西,哎呦这样随便加一个。
比如说我生成一个新文件,然后get都会注意到这个新文件的产生,并且告诉你版本不一致了,然后这个时候如果你想要git ADD点,那其实是会把这个B点text也加入到暂存区里,但有时候可能B点text。
它仅仅是一个没有关系的文件,它是一个无关的东西,或者说它是你的数据,或者说它是你的缓存,或者说是一些别的什么临时文件,这个时候我们不想要get去跟踪它的变化,就需要设置这个get一个NE文件。
然后get会按照get ignore文件里指定的规则,去忽略掉这些无关的文件啊,这里比如说可以举一个例子嗯,对比如说我找了一个呃比较知名的代码库,它的一个例子,这里的话get一个NL文件。
就基本上是这里显示的,这样就是它可以你可以列出一些前缀,比如说像我这比如说这一条的意思,每一行其实是一个忽略项,比如说这一条的意思,就是我忽略这个整个lib文件夹下的所有内容。
然后我忽或者说我忽略整整个X文件夹下,所有的内容,然后呢有一些特殊的新号,可以用作一个正则表达式的一个匹配,或者说是文件路径的一个通配,就是说我所有的呃。
比如说我所有的以这个点egg info结尾的文件夹,全部被我忽略,或者我所有的点EG结尾的文件全部被我忽略,然后像这样的一些这个忽略的规则,相当于它每一行是一条规则,然后git git会从上到下。
从前往后去扫描你的git ignore文件,然后来确定你到底有哪些文件是不关心的,然后这里可能有一些更复杂的呃规则,比如说前面加一个感叹号,其实是反效果,就是说我可能我可能不希望所有的download。
这个文件夹,我我我不想跟踪所有和DOWLOAD有关的文件夹,但是呢其中有一个例外,就是以这个前缀开头的DOWLOAD文件夹,可能是我关心的,这个时候我就给他前面加一个感叹号,然后他就可以起到这样的效果。
对这里的话,基本上就是大家可以根据自己的需要,比如说你项目中确实真的遇到了嗯,需要设置这个忽略无关文件的情况,然后呢再去网上搜索一些资料,去看怎么设置这个无关的这个规则文件。
然后就可以就可以实现git的一个比较方便的,一个忽略,然后最后呃这里我们介绍完git的话,我们再来介绍一下GITHUB,GIGIT和GITHUB的关系,我想想可以说是没有什么关系,因为。
虽然他们名字长得很像,但是其实是两个完全不一样的东西,就是git他做的是什么,git它是一个开源的一个人人都可以用的软件,然后他做的是版本的控制,Github,它是一个。
相当于是一个提供了网页服务的一个网站,然后他可以给你提供一个远程存储,仓库的一个服务,只不过说呢GITHUB可能它基本上是基于git的,就是他管理仓库的那些规则,他版本的控制它都是基于git的。
所以呃GITHUB其实会叫这个名字嘛,然后但是使用上来说,GITHUB其实并不是一个,比如说git的升级版或者git的替代品,相反它是一个和git可以相辅相成,互相辅助的一个呃远程的一个东西。
所以啊具体来说到底是什么情况呢,其实大家都比较熟悉GITHUB了吧,然后我们之前目前的这个版本管理,可能都是在本地,比如说我本地跑一个这样的git,把我本地新建一个这样的文件夹去创建git仓库。
但是呃有的时候我们其实是希望做一些协作的,就比如说呃这节课最开头提到的那个问题,比如说你希望和你的一些比如说微信好友,或者说你的同事,你在这,然后然后你们可能有时候通过这个微信啊。
通过一些这种软件去联系,然后都是一个线上的状态,然后你们不可能不能说,就是我每次有一个新的版本,我都要把我的整个项目打包,然后我发给你,你发给我这个样子,而是一般来说我们会比如说要么我们呃。
比如说我和我的同事,他用同一个服务器,然后呢,我们可以看到服务器上的公共的一个代码,然后这个是可以的,这个其实也是一种在本地的情况,但是还有一种情况就是呃,你们两个可能没有什么。
就是比如说公共的一个存储的文件系统,那么这个时候其实呃和他人分享合作,甚至是你和网上的一些开源贡献者之间,去做一些分享合作,它其实就需要一个分布式的平台,相当于这个网站本身,或者这个平台本身。
给你提供一个仓库的存储服务,这个其实就是GITHUB,然后其实我们还有一些其他替代品,比如说呃国内的有这个gt,然后或者有这个GLAB,他们都是类似的啊,这里我们简单的以GITHUB为为例做介绍啊。
GITHUB它简单来说其实就是呃,你可以把你的仓库存到远程服务器上,然后它会托管给你托管这个仓库,并且嗯提供一些更加方便的包,从文件浏览,然后到这个到这个这个分支的管理。
然后到一些其他的一些呃比较复杂的一些操作,然后到你的开源的一些这个社区的一些,交互或者贡献,然后它都是有一个支持的,这里我们经常用到的,其实最基本的一个功能就是啊,从网上下载代码到我的本地。
其实就是我们比如说GITHUB上有一些开源的仓库,然后你可以去用git clone这个方法,从远程下载到本地,那么这个地方其实嗯,大家应该都比较熟悉这个界面了,那么它其实就是你点这个仓库的一个下载界面。
然后他就可以给你展示啊这个clone的一个网址,然后比如说这里有一个网址,我们我们在我们命令行里去输一个git clone,然后他其实就是会啊,比如说把后面这个网址对应的那个仓库,下载到当前文件夹的。
然后这里有两种kit clone,可以稍微做一下了解,第一种git clone,叫做这个用HTTPS这个协议去做clone,那么这种clone它的特点是,就是只要后面这个仓库是开源的。
你就可以去做一个克隆或者做一个下载,然后克隆是不需要权限的,你下载过来哦,你可以你也可以任意的改它,但是你不能把这个改动提交到GITHUB上,就是说你不能把它下载过来,然后你本地做了一些新的版本。
然后你把新的版本给给这个推送到这个GITHUB上,这是不行的,因为他需要检查你的权限,你必须要是这个仓库的一个使用者啊,或者协作者,你才有资格说,把我本地的代码交到这个远程上去。
然后但是这样就很不方便吧,因为毕竟如果我们每次需要去,比如说假如这个仓库真的是你自己的仓库,然后你要去把这个本地的仓库给他,这个把他新的版本上传到远程服务器上,相当于上传到GITHUB上,这个时候。
每次如果我们都要输入用户名和密码的话,其实是太过麻烦的一件事,毕竟好像我们从命令行,其实命令行不像浏览器,命令行其实没有一个所谓登录的这个东西,所以比如说你每次上传都要自己再输一遍,用户名和密码。
因为GITHUB会问你的,所以这个时候就非常麻烦,然后我们就可以对于自己的仓库,就可以用SSH这个协议来cl这样克隆下来了,仓库的话,我们是直接根据SSH key去做一个权限检查的。
这样推送是可以直接进行,无需要验证的,然后这个具体方法啊,网上其实也有非常多的教程了,大家可以就是如果有需要,可以搜索一下怎么样去设置啊,比如说GITHUB的SSH key,然后这里还有一些功能。
可能就是涉及到本地和远端的一个通信,比如说我们有一个git fetch,它是把我本地的版本库同步到,同步成远端的版本库,这个是什么意思呢,就是我们只做版本库的一个改动,相当于说远程有一个新版本。
我可以用get fish给他,把这个新版本加入到我的版本库,但是它并不会实际的修改我本地的代码,相当于我只是先把它加进来,然后后续我可能要做一些额外操作,或者做一些对比,我就可以跟我版本库里。
远端的那个最新版本去对比,然后第二个就是第二个就是一个呃一个进阶版,就是GPL,它不仅做了gifts做的事情,他把远端的版本库进行了同这个同步,GPL还会做一件事情,就是他会把最新版本和本地的最新版本。
去做一个合并,然后这个合并我们后面会介绍到,然后第二件事就是呃,你可能有时候需要把本地传到远端,这个时候用的就是get push,这个时候你需要有它的所有权或者使用权,然后GITHUB也很简单。
就是它的使用也很简单,就是相当于我们本地是一个,比如说我们本地建了一个空仓库,比如说就拿这个仓库为例子吧,我现在建了空仓库,然后我加了一些东西,然后我commit1些修改。
然后这个时候get log里其实有一个版本历史,然后我想要把我整个仓库加上我的版本历史,一起打包传到GITHUB上,应该怎么做呢,其实就比较简单,我们就可以在网页上直接创建一个空的仓库。
然后呢你就会得到一个一个这个链接吧,或者说一个地址,然后你可以在本地通过下面这两行,第一行是说我让本地的这个仓库,和远程这个仓库连起来,然后第二行是说我把本地的这个分支给他,推送到远程上。
这个时候你再在GITHUB上刷新你的页面,你就会发现你本地的那个,所有代码已经传上去了,然后呃还有一个点就是刚才说的,其实是你自己创亲手创建的这个仓库,然后如果这个仓库不是你自己的,比如说是其他人有的。
那么嗯我们应该怎么样去,比如说嗯比如说让我本地的修改,能同步到远程的,其实是需要一些操作的,首先需要你你需要有这个权限,可能是仓库的所有者交给你的权限,然后第二个你需要用刚才说到的这个SSH的协议。
给它克隆到本地,然后第三个,比如说我们在本地产生新的版本之后,用第四条去get push,提交到远端做一个修改,然后这个的话就是其实是一些基本的操作了,然后具体来说其实网上也有非常多的教程。
然后大家到时候遇到具体情况,比如说如果你不是GITHUB,你是什么git或者KITLAB这种,其实都是可以去做一个搜索,然后会有具体的教程嗯,介绍到底要怎么使用呢。
然后呃这里再讲一个我平时会用的一个东西,就是说呃GITHUB网页,它其实是支持commit之间的比较的,什么意思呢,就是说我们本地可能比如说本地我看了,比如说我们本地如果要做一个一个对比。
其实是蛮麻烦的,因为你是你首先需要知道呃,比如说你需要知道一个提交,或者你的一个版本的它的一个编号,然后呢你用get def,然后去啊输入这个编号,然后在这里可以开启一个一个小的一个界面。
然后它可以列出你的所有的文件的变化,但是哦这种肯定是不如我们的这个,可视化的方法比较呃那个直观或者清晰的,因为毕竟呃我们在命令行操作,还是会有很多不方便或者不熟悉的地方,然后实际上GITHUB的网页端。
它是提供了一个呃这种git commit之间的,一个方便的一个比较,然后这里列出了网址,其实是有一个那个呃,有一个GITHUB官方那个教程说明,然后这里简单来说呢,就是我们想要比较的两个commit。
我们可以找他的那个代码啊,或者说他那个索引的前6~7位,然后把它copy过来,然后最后我们输入这个网址,网址前面这一段就是从呃,从HTTP到你的仓库名的这一段,其实都是你点进你自己的仓库。
你就会你就会有的,然后呢你在这个网址后面加一个compare,然后后面填第一个填你的,填你的其中一个分支啊,其中一个那个版本,第二个填另一个版本,然后中间有两个点连接,这个时候你再输入进去。
你就可以发现嗯,它它可以去做一个那个版本职能比较,然后嗯这里可以看一个例子嗯,我看看。
比如说我们这里有一个版本啊,不不有个GITHUB,然后我在里面打开一个仓库的一个最新版本,然后呢,比如说我们可以先先在这里看一下,这个版本有哪些嗯,比起之前有哪些变化,然后这里的话它其实会列出一个。
你哦修改过的所有历史,比如说嗯,这里有一个最早的3月7号的一个提交,他是说他初始化了我整个仓库,然后呢现在上一个提交,可能最新的这个是4月12号的提交,然后他又会有它自己的一个说明。
然后你想要去看每一个提交发生了什么的话哦,可以点这个就是右边这个按钮,然后点进去之后,GITHUB就会给你列出来嗯,这个文件之间的到底发生了什么,就左边可以列出一个最基本的一个详情。
就是哪些文件发生了变化,右边则是这些文件里具体发生了什么样的变化,然后这些文件特别是每行的增删,它其实都是比较清楚的列在里面,然后呢嗯这个的话就是一个,相当于我们本地用git log。
然后加上GDF来去查看的一个功能,它在远程就可以呃,比如说在GITHUB这种平台上,可以用一个更好的可视化的方法,来给你显示出来,然后其次它还支持我刚才说到的compare的功能。
就比如说嗯就比如说我我我这样看,比如说我看每一个commit提交的一些细节,我是能知道这个版本和是和这个版本的,前一个版本之间有什么差别的,但如果我想批量的比较,比如说我想比较这个版本。
这个4月12号的版本和我一个,比如说3月9号的版本之间到底有什么差别,这个应该怎么比较呢,就用刚才说到的这个compare,那么我们可以先复制这段路径,这段路径就是我刚才说到的GITHUB。
然后加上你的用户名,然后加上你的仓库名,这里填一个compare compare,然后我们可以把比如说我刚才3月19号,这个版本的,它的一个这个id先输进去啊,这怎么说,好家伙好吧,那就只能点一次。
点进去,然后复制这个commit的一个代码,然后第一第一个地方就填这个代码,这个代码就是我们的3月12号的这个版本,它的一个对应的代码,然后我最新的版本可能是这个代码,这个代码。
然后我们也点进去把它复制过来,然后中间加两个点,然后这样就形成了一组,就是两个版本之间的比较,然后输入这个网址,你就会发现嗯,他告诉你,我正在comparing changes。
就是我们在比较两个分支之间,两个版本之间的一个差异啊,这里左边是显示了我3月12号的版本,右边显示的是4月12号的版本,然后呢我们就可以发现啊,有这些区别,然后可能有一个非常长的一个文件修改的说明。
然后呢可以在这个说明里去做一个做一个筛选,比如说可以看看哪些文件到底具体发生了改动,然后去做一个这样一个在浏览器里做一个,可视化的一个浏览,然后会比较直观一点对,总而言之嗯。
GITHUB其实提供了非常多的这个git的可视化的支持,我觉得这个还是蛮好用的,所以说有时候哪怕其实你没有一个呃,远程协作的需要嗯,你也可以去把自己的仓库放到GITHUB上,或者哪怕是你不公开你的仓库。
你作为一个私人仓仓库放到你的GITHUB上,然后去可以利用到GITHUB的一个界面,去做一些这个可视化或者做一些比较,然后你也可以用那个呃我刚才提到的那个GITHUB,desktop这个软件。
然后在本地去做一个可视化的查看,对这个和网页端应该原理是类似的,然后通过这样的方式,总而言之,GITHUB就可以支持到我们的一个本地和远程仓库,的一个这个上传和下载,然后同时它也支持一些可视化的操作。
然后最后我们来讲一下这个GITHUB,或者说这个git它在多人协作上的这样一个概念,就是其实就是最开始提到这个分支的概念,这个分支是什么意思呢,就是说一个分支其实就像刚才说到的。
它代表着一条独立的开发线,你可以从开发的主线上分离出来,然后在不影响主线的情况下同时工作,就像刚才说到这个流程图,然后分支有一些操作,就比如说这里列出的操作,都是我可以创建一个新的分支。
然后我也可以切换分支,列出新分支或者删除分支,然后像是比如说我们在这个图里就可以看到哦,像是比如说这个这个节点,它是一个最初的一个版本,然后呢我们在这样一个这样一个版本的时候,发生了一个分裂。
分裂出了一个新分支,这个分支可能是紫色的这个状态,这可能是我想要开发的一个某一个特殊功能,然后呢我原来的版,我原来的这两个版本,它沿着主线一直走,就是中间这一条可能是我们的稳定分支。
然后上面这条是开发某个新功能分支,下面这条又是开发另一个新功能分子,然后有时候我们其实会遇到一个需求,就是说啊,我我这个新分支上的这些功能已经开发好了,然后我想要把这些新分之上的功能给它。
合并到主线回来,这个时候应该怎么做呢,其实用的就是这个git merge,Git merge,它其实是支持你对不同分支之间进行合并的,比如说我们在这个同样的这个版本基础上,然后有一个主线分支。
有一个开发分支,然后最后要怎么把它合并下来,其实就是比如说如果你在主线分分支,你就get merge,然后给他们填上这个开发分支的名字,然后他就会把这两个给合并起来,然后这个合并是自动发生的哦。
基本上如果你的这个代码嗯,一,一般来说你的代码,如果没有一些特殊的一些问题的话,基本上这个合并可以自动的完成,但是有时候其实嗯hub也不能真正的自动合,就是完全没问题的合并,因为有时候其实是会遇到。
比如说你这两个分支,他同时的修改了同一份文件的同一部分内容,然后这个时候自动的合并就会失败了,因为毕竟嗯hit是不能确定你到底要哪一个,文件里的内容,对他什么时候会成功呢。
成功的时候其实是我比如说我对一个文件,我只有其中的一个分支修改了它,另一个分支没有修改它,这个时候我合并的操作很简单,就是把我那个修改掉的内容给它应用过来,然后这样就完成了一个合并。
但是如果你两个分支同时修改了同一份文件的,同一部分内容的话,嗯自动合并就会失败,然后这个时候get it它又会中断合并的这个提交,然后并且告诉你你需要自己去选,到底我要哪个分支,然后呃get it。
它会自动在你需要决定这个去选择的位置上,进行一个标记,然后右边可以看到这个标记的样子,就是嗯它的格式就是这样,就是它会它会在这里列出一个,列出一个这样的一个段落,然后呢第一第一行可能是一个分之一。
然后最后一行是一个分之二,然后中间用一大串等号相隔的两个部分,就是两个分支各自的内容,然后你可能你可能比如说我,我如果觉得上面这个是对的,我就我就把这五行全部换成上面这一行。
然后我如果觉得下面这个是对的,我就把这五行全部换成下面这一行,然后你也可以在一些IDE里,比如说像vs code这样的IDE里,它会给你提供一个按钮,比如说嗯,像这个这个其实是一个纯文本的一个界面。
但是如果你在一些IDE里或者一些文本编辑器里,它其实是会给你一个按钮的,比如说上面这样有一个勾,下面也有一个勾,然后你点上面就是用上面这个这个修改结果,然后点下面就是用下面这个结果。
然后这样就可以完成一个比较简单的一个,冲突的合并对,然后这个基本上就是我们的一个哦,git的全部内容了,然后这里可能讲的还是特别的抽象一点,但是呃其实git确实是一个怎么说,有一些入门的门槛的一个工具。
但是它也确实十分强大,基本上可能呃如果你如果你这个能够顺利使用,它,能够熟练掌握它,其实是会对生产的效率呃,有一个非常大的提升的,然后呢我们可以总结一下,就是嗯它最最重要的概念就是版本库。
工作区和暂存区这三个概念,然后它有一些基本的操作,本地的操作,分支的操作和远端的操作,以及我们刚才提到的多人协作的操作,这里可能最重要的就是对于初学者而言,我们可以从本地的那几个那四个呃。
增加的操作开始学起,然后以及啊,我们一定要尽量的利用图形化的东西,就是能图形就图形,最好不要在命令行上一直死磕,然后除非你是一个就是你已经逐渐熟练了,然后你可以在命令行上嗯。
做一些简单的快捷的方便的一些操作,否则的话就是一开始以学习为目的的时候,我们最好还是利用一些比较直观的,可视化的东西,然后来辅助我们的一个对工具的使用对,然后这个基本上就是呃全部的内容。
然后我们今天哦这次也没有作业,下次应该我看下次应该会有作业,然后我们可以之后嗯发布了之后告诉大家,下节课应该会有作业对,然后这次没有作业,我先看一下这个大家有什么问题,可以在弹幕上那个告诉我。
哦有同学说这个呃就是比如说一个一个分支,它可以再分支吗,这个肯定是可以的,就是比如说我们打开一个GITHUB上的一个嗯,一个仓库吧,然后你是可以看到它上面有一大堆分支。
就比如说你点开这个呃main branch,你可以看到这里有一大堆分支,都是大家就是这个七手八脚给它弄出来,然后它会有特别复杂的一个,一个互相之间的关系,所以这里可以看到。
其实GITHUB也用了一个特别复杂的界面,然后来显示这几这些分支之间的关系和区别,然后以及它们的一些可能他们的一些状态,然后他们是哦更新频率是怎么样的,然后他们是谁在管理这些更新,对。
基本上哦分支之间是可以进一步的再分支的对,然后然后我们可能反正哦我看一下,有同学说如果误添加了,怎么取消跟踪呢,这个其实就是呃之前说到的嗯,前面有一段有一大段关于哦,git基本操作的一个使用。
我找一下对,就是这里吧,这里其实会有一些,就是你怎么样从工作去撤销你的改动,然后从暂存区取消跟踪文件的改动,甚至是说啊,甚至说我有时候,我有时候就是我甚至教错了一个版本,我怎么样强制回退到上一个版本。
这些操作基本上哦就是都是挺复杂的,然后也挺容易混淆的,所以我建议就是我们遇到具体情况的时候,我们可以去搜索一些资料,然后去做一些这个呃资料的搜索之后,然后当你完全明白,比如说我应该怎么做。
或者它完全网页上的内容完全告诉你了,你应该怎么做之后,我们再去做这个操作,然后如果自己要直接去,比如说去做哦一些操作的话,可能会引起一些问题,比如说比如说虽然我知道这条命令。
它可能是从暂存区取消跟踪文件的改动,但是如果你不是特别理解,比如说暂存区是什么,工作区是什么的情况下,你可能会以为它有什么样的效果,但实际上它的效果是另外一种,然后这个时候就会出现问题。
所以最好还是比如说如果你要用这条语句,你就去查一下网网页,然后他会告诉你这个呃,他会告诉你呃,这比如说它一般来说像CSDN这种教程,它都会给你一个例子,具体的例子。
然后让你直观的感受一下它到底有什么效果,嗯然后,OK我看大家也没有其他问题,然后大家如果有问题也可以这个嗯,扫码加我们主页,我们主页上有这个QQ群的二维码,然后大家也可以加到群里,然后有问题可以联系我。
然后今天的课就到这里。
GAMES002-图形学研发基础工具 - P5:编译工具和包管理环境 - GAMES-Webinar - BV1cC411L7uG
Hello hello,大家好,然后那么我们今天的games002的课程就开始了。
然后这边的话本节课介绍的是嗯,编译工具和包管理环境,其实分别对应于,比如说我们平时用的C和C加加,它就是需要一个编译工具,然后我们用的Python或者用的一些JAVASCRIPT。
它就需要一些包管理环境,然后我们今天的内容,主要就是介绍这两块的部分,OK首先我们来看一下这个一个,今天内容的大纲吧,就基本上主要是按照刚才说的来,我们首先介绍一下CPP的这个嗯,三个编译构建的工具。
一个是Mac,然后是c Mac,这个大家可能用的是最多的,然后最后再引申介绍一下x max,然后对于Python来说,我们主要介绍的就是康达嗯,这个包管理工具,然后在介绍完CPP和Python之后。
我们可能还会延伸一些,就是做一些呃,比如说关于怎么样对我们的程序,做一些性能的测试,这些做一些稍微做一些展开,因为这个主要是因为比如说对我来说,我平时可能会用到的一些功能,然后这里跟大家分享一下。
然后最后会有一个总结,总结之后会介绍我们今天要布置的作业,好的那我们就先开始,然后首先是对于C和C加加来说,我们都知道它作为一种编译型的语言,其实我们经常是要用这种编译器。
然后必须你通过编译器才能把代码,转换为可执行的二级定制文件,然后相对来说嗯不是这种编译型语言的话,另外一些语言叫做解释型语言,它们就像是Python这种嗯,就是说我们只需要有一个解释器,然后呢。
它实时的把我们的这个代码,转化为二进制的机器码,然后虽然这样速度更慢了,但是可能会带来意想不到的便捷的效果,但是对于这个C和C加加来说,它就是一种编译型语言,我们一般来说比如说在windows电脑上呃。
基本上用到的都是本地的一个ID去做编译,比如说嗯这个最最原始的是哦,我想上是那个def c加加对吧,然后后面可能会有一些vs code,或者有一些嗯visual studio。
然后我们就是用本地的IDE去做一个编译,然后其实C和C加加,也是可以做一些远程编译的,比如说我们用之前提到过的vs code,它的一个SH的远程功能,它也是可以完成一些编译的,然后嗯这种远程。
比如说我们在服务器上去做编译,它往往就是呃,因为你你很难在服务器上打开一个IDE嘛,然后它往往就是通过命令行,比如说你输入一个指定的编译器,这里用的是G加加,然后让他去编译一个具体的一个比如说文件。
然后就能得到一个编译的结果啊,当然其实今天发展到今天的ID,很多都已经支持了,就是一个远程编译的功能对,但是嗯就是为什么我们还要去学一下,怎么样配置这个编译的make或者c make呢。
是因为比如说嗯如果这个项目不是你自己写的,然后呢我们我们现在可能呃一方面是想从网上,比如说下载一些仓库,然后编译它的一些项目,然后拿过来用,另一方面又可能是说我自己写好的一个东西,我想把它发布出来。
然后我能让别人顺利的去使用它,这个时候你就必须就是嗯去嗯,把这个编译的这个所有的配置全部给理清楚,因为不理清楚的话,可能你用的编译条件和别人用的编译条件,是完全不一样的,然后这就导致你的可能文件。
就没有办法经过编译,然后这里的话,比如说我们这里列出的一个最简单的编译是呃,你指定一个编译器,然后指定我我编译的一个源文件,然后再指定一些选项,然后呃这里可能很简单,你输入一行就可以完成。
但是大部分情况下,我们实际上遇到的问题都没有这么简单,就比如说如果你要调一些额外的库,比如说open gl或者掉些嗯,对类似的这种第三方的库,然后这种时候的话,这个编译语句就会变得特别繁琐。
然后嗯所以我们就需要往往需要去给它做一个,就是做一个配置,相当于把你当时的所有的编译选项,全部给记录下来,并且给它给它配置成一个具体的文件,那么最简单的方式就是说,我们用之前学到的知识。
比如说假设我这一行,我这行没有这么短,而是后面还有一大堆的奇奇怪怪的选项,那么这么长的一条命令行,其实我们用之前学到的知识,是可以说我写一个脚本,然后把这条语句给写到脚本里,这样的话我想要编译我的项目。
那么下次就直接用bash,然后来调用这个脚本,然后就可以完成编译了,这样的方式呃,它的好处是在于它确实非常便捷,就是当时啊你怎么敲的命令行,就可以把这个命令行,原封不动的放到这个呃脚本里。
然后下次运行这个脚本的时候,或者说别人来下载你的仓库,然后来运行这个脚本的时候,它就能完成一个编译,但这里遇到的问题就其实是说嗯你这个脚本,首先你的G加加的版本是多少呢,然后呢你的一些其他的选项。
它其实都是依赖于你那个目前运行这条命令的,本地的那个机器,它的一些比如说它的一些库,它的一些安装的一些软件的配置,所以嗯在这种方面上,就是说这条命令行,当然它它可以通过你写成脚本的方式,给它复现出来。
但是一旦你这台机器换了,比如说换了别人的机器,它可能一方面G加加的版本跟你不一样,另一方面他可能没有安装open gl的库,然后你这里安装了,然后这样对他来说,可能就是会有很多很多这种机器。
或者说操作系统层面的一些,这种调用的一些区别,然后导致说同样一模一样的命令行,在你这里是可以运行的,在他那里是没有办法运行的,这就导致说我们简单的写上脚本的方式,并不能够支持这个编译的一个选项的配置。
那么其实一般来说,我们都是要用到一个叫做构建系统,这个叫build system,然后go所谓构建系统,就是说嗯我提供一个配置文件,然后我用这套购置系统就可以在不同的这个,比如说不同版本的操作系统。
不同版本的编译器下,然后实现一件事,就是说我可以顺利的把我整个项目给编译下来,然后这就牵扯到相当于我们对于一个大规模的,足够复杂的工程,我们都是需要去这么做的,就是嗯我们需要把这个手动用命令行编译。
链接所有代码的这个步骤,改成一个使用我们的构建系统来做一次配置,然后之后可以反复使用的这样的一个方式,然后构建系统往往也具备一些功能,就比如说如果我们要呃,每次要修改一些代码的话。
其实构建系统会检查有更新的部分,然后它会重新的去就是做一个部分的编译,相当于不用每次都完整的把你整个项目,完整编译打包一遍,然后这样就是啊,我们一个构建系统的一个最初的一个目的。
然后他具体要完成一个什么样的任务呢,其实是说嗯我们用户给他指定的,就比如说嗯像刚才的例子里,我们如果要编译一个C加加的文件,或者编一个C语言的文件,那么实际上你要告诉这个构建系统。
你需要生成什么样的目标文件,这个目标文件可以是你你生成一个库,或者你生成一个可执行文件,然后等等,然后以及你要告诉它,生成的时候使用到的一些依赖项,然后生成的时候使用到的一些具体的命令。
或者命令行的选项,然后这里的话其实之前说了这么多,大家可能都已经见过一个最常用的一个build system,这个东西就叫make,这个东西是LINUX下最常用的一种这个build system。
因为它它的特点主要是编译小项目的时候,非常的便捷,然后呃可以提供一个非常好的支持,但是实际上如果你了解一下make的这个语法,或者说了解一下它的配置的规则,你会发现其实它的配置起来还是非常繁琐的。
所以大项目基本上你是很难手写make,而实际上我们往往都是,比如说如果你去做C加加或者C语言的编译,我们都可以用这个c make这个工具,先用CMC工具生成make的一个配置文件。
然后我们再使用make,嗯那么具体来说,我们可以先了解一下Mac的基础用法,就是它到底是干什么的,他到底是怎么用的,make的话,它有一个基本的配置文件的名字,格式就叫这个make file。
就是就是呃名字就是要跟这个一模一样,然后make才能识别出来,然后我们如果在当前路径下准备好了,这个make file的话,那么你在命令行里直接输入make,然后make就会识别出这是一个配置文件。
然后他就会读取里面所有的配置信息,那么make file里到底有什么呢,它其实很简单,就是一个普通的文本文件,make file里指定了就是你要构建的目标,然后你的依赖项和你的一些具体的命令。
那么比如说以下面这个图片为例子,嗯这里这两行基本上是说了一件事,就是说我要构建一个paper点PDF,然后我要我要生成它,首先我必须先准备好这两个文件,什么意思呢,就是如果你不提供这两个文件的话。
或者说当前路径下找不到这两个文件的话,那么make就会告诉你这个呃依赖依赖没有满足,或者make就会去去试图满足这个依赖,比如说如果如果你有一些配其他的配置选项,能够再生成这两个文件。
那么make就会先去把这两个文件生成好,然后再去执行这个生成paper点PDF的这个操作,然后这所以这里就很简单,列出了一个呃,你的目标文件和你目标文件的所有依赖项,然后具体要怎么生成这个目标文件呢。
其实就用的是呃下面指定的一个这样的命令,比如说我们可以用这个PDF来TX这个这个程序,然后它来运行一下,就可以从这个paper点text啊,paper点text里面生成这个paper点PDF。
也就是其实这就是一个LTT的编译的一个过程,然后相当于说我们每一个make file文件里,都有若干个这样的一个三段式,每一个三段式呢都告诉你了啊,某一个target文件到底要怎么样生成出来。
所以嗯这个基本就是make file的一个特点,那么回想到我们之前的这个编译,比如说用刚才那个用G加加编译的例子,这个例子里面我们make file怎么写呢,其实就是说我们要生成的那个文件。
其实是一个可执行文件,是这个main这个文件对吧,所以我们其实啊,如果你要把你要用make file,来来描述这个这个事儿的话,那首先你的target就应该是这个,然后你的依赖项就应该是main点cc。
然后最后你用什么命令来生成,整个这个你的可执行文件,用的就是这一整句,所以你可以看到Mac它其实还是一个呃比较简单,就起码从原理上来说比较简单的一个东西,它就是简单的帮你打包了一下。
然后呢啊使得比如说我们我们以后,我我比如说我以后想要知道怎么样生成这个paper,点PDF,那么我就可以找到make file,然后里面的生成的命令全部都列出来了,然后这样的话。
其实我们就有了一个最基本的一个,这样的一个构建系统,然后常用的哦,其实我们经常比如说我们遇到仓库的时候,经常会用这两条命令,然后实际上就是说啊install和这个clean。
它实际上都是make file里定义的一些呃target,然后只不过这些target是特殊的target,就是说呃install它并不是一个具体的一个,你要生成的一个文件。
而是说我我我去执行这个install的时候,我就会执行一些额外的操作,比如说常见的额外操作,就是把我们需要的这些文件,然后拷贝到我们的用户的一个目录下,然后这就是install干的事。
然后clean可能也干了一些其他的事,然后这就使得嗯其实我们可以发现make file,它的配置还是非常自由的,相当于说你可以去定义呃一些编译语句,你也可以去定义一些你的特殊的一些命令。
然后通过这些编译指令和命令的组合,然后你就可以得到一个比较完善的一个,一个配置文件,然后我们可以看到它的一些常见用法,就比如说这里很简单,就是首先我先做一个make,这个make就是做一句编译。
然后后面这一句语句,就是说我把我编译完的这些库或者可执行文件,全部放到我用户可以搜索到的一个路径下,这样的话我就无论在哪里,都可以从从命令行去调用了,然后或者也有一些用法,比如说如果你构建的时候。
希望它开多个线程一起并行,那么你可以用J来指定,比如说你要用的这个线程或者进程数量,然后或者说你也可以用杠C来指定,比如说你不是在当前目录下找啊,或者不是在当前目录下,生成你的最终的一些文件。
而是我新建一个build文件夹去生成一些新的文件,比如说像这种,那么抛开它的常见用法,其实呃总体来说呃,make还是一个配置起来非常麻烦的事情,这是因为它其实没有给太多的这个。
比如说太多的这个优化或者提供便利的一些事,而是说它仅仅提供的是一些我有什么命令,我就把它记录下来的功能,也就是说,如果比如说,如果你的这个编译的命令特别特别复杂。
那么你可以想象你的make file也会特别特别复杂,比如说嗯像我们比如说如果要调用open gl这个库,那你可能会遇到一大堆的这个,open gl的一些编译选项,那么这些编译选项。
其实你都得把它放到这个make file里,然后你给它全部给粘贴出来,然后一个个配置下来,其实还是非常麻烦的,所以这个地方嗯基本上我们常用的嗯,比如说如果你是用C加加来编程,常用。
基本上都是用c make这个工具来作为一个中介,就相当于我告诉c make,我要我要做什么事啊,然后c Mac帮我生成一个呃make file文件,然后相当于呃c Mac来做一个中间层。
然后他能知道你的需求之后,帮你省去那些繁琐的配置,make file的一些选项,这个就是c Mac干的事,那么它本身c Mac本身其实并不是一个build system,因为它不能直接生成可执行文件。
你也不能让他就是嗯,你也不能脱离了任何一个呃build system,来让CMC帮你编译,比如说嗯如果你没有make,那么其实c make并不能帮你继续编译下去。
一般来说c make它都是要生成一个make file,或者生成一个这个呃visual studio的一个解决项目,然后你才能用后续的真正的这个build system,然后来去做进一步的生成。
比如说这里就是真正的build system是make,然后这里真正的build system是这个visual studio,然后但是c Mac正是因为它特别方便的一个,跨平台和跨语言的一个能力吧。
所以说成为了我们基本上用C加加,基本上都是会用CMC来配置的,CMC的话呃,其实我们可以经常见到它的一个,命令行的一个用法,比如说我们一般嗯,如果你你下载过GITHUB上的一些项目的话。
你会发现有一个非常经典的一个操作,就是你首先我我们在项目目录下,新建一个build目录,然后呢我们CD到build里,然后去调用c make,然后把把c Mac,然后c Mac它会识别。
其实它会识别这个父目录,下一个c Mac自己的配置文件,识别完了之后,c Mac会帮你生成make file,生成完make file之后,我们就会知道我们可以通过make来执行这个make file。
文件了,所以基本上就是这么一个呃,其实是三段操作吧,第一段操作是嗯先创建一个build目录,然后第二段操作是让c make来生成make file,然后第三段操作是让make。
根据make file来执行真正的那个命令,所以这些嗯,这些流程基本上就是CMC的一个,通用的一个用法,然后这个命令行的形式,它它其实还有一个这个跨平台的版本,然后这个可以就是。
比如说如果我们遇到跨平台的时候,可以再进行搜索去了解一下,然后呃那么说了这么多,就是c Mac它到底是怎么用呢,就是说我们要怎么配置CMC的一个文件呢,这个其实是类似于make file的。
就是说c make会在当前目录下识别一个叫做这个,semc list的一个文本文件,然后这个文本文件里指定了你的c Mac的版本,然后指定了你的项目名字,然后以及指定了我们要构建的这个目标。
然后并且这个目标它到底叫什么名字,它需要什么文件,你都可以用这些来这个自定义,然后这里下面这条哦,这张图片其实显示了一个,这个最简单的一个sim list,就是首先啊,我说我这个至少要2。
6版本的c Mac,然后呢我这个项目名字叫hello world,然后呢我最后这里呃指定了,我要从hello点CPP里生成一个这个,hello的可执行文件,然后这就是一个SIMILIST的一个基本配置。
然后如果对比make file的话,你会发现它特别简单的一点,就是你不需要告诉c make你怎么样编译CPP文件,因为c Mac自己会决定要怎么样编译,而不是需要你去告诉他,比如说我要用一个G加加。
然后杠O2,然后杠什么样的一个选项,而是c Mac他自己会帮你去决定,然后这个就是一个主要的比较方便的地方,所以相呃比较一下的话,就是如果我们去做make file的配置。
我们是一定要去关心命令行选项的一些细节的,但是c make它其实并不需要c make,你可以基本上不用管,不用操心这个命令行选项,你只需要关心我要生成哪些文件,然后呢我依赖哪些文件。
然后我依赖哪些包就可以了,而不需要针对这些文件,或者针对这些包去定制,你的一些特别细节的一些命令行选项,然后当然c Mac它的功能也是非常强大的,实际上我们可以把CMC当做一个,非常简单的一种脚本语言。
然后它是可以定义一些局部变量,然后这种局部变量或者全局变量,基本上我们只会在特别大型的这个,sim项目里见到,比如说它有特别复杂的一些配置的时候,或者有多个就是多个包的时候,然后往往会有一些这种局部。
或者全局变量的一些使用,然后这个地方的话最常见的使用可能是嗯,可能是就是,比如说我们有时候指定我们用的C加加版本,或者指定我们构建的到底是debug还是release,项目的时候嗯,是是会用到这些功能。
当然这些功能我觉得一开始我们可以不用,特别的就是特别的把它掌握得特别清楚,因为后续如果实际上真的用到的时候,还是可以去查找资料的,然后这个地方基本上就和我们之前学过的那个,这个脚本的语法非常相近。
然后它也是一个比较容易上手的功能,然后除了这块的话,我们重点来讲一下包管理,就是怎么样用CMC去做一个嗯,这个多个文件的一个编译链接吧,然后就假设我们项目根目录下有两个源文件。
一个叫这个这个这个MMSRT,然后一个叫这个main,然后我们分别定义了,就是我们在这个平方根文件里,定义了一个我们自己写的一个平方根函数,然后在我们的main文件里定义了一个呃main函数。
然后main函数里面调用了这个平方根文件,这其实是我们经常会遇到的一个需求,就是说呃就是说相当于我妹喊我妹函数,或者我的main文件里并不直接定义函数,而是把函数的定义写到专门的一个呃函数。
和这个函数相关的那个CPP文件里,然后这样就形成了一个多个CPP文件之间的,一个编译链接的一个关系,所以相应的话我们在simic list里就可以这样写,就是用哦下面这张图显示的这个图片。
如果看不清楚的话,呃之后可以那个之后可以下载一下课件对嗯,因为它实在确实有点小了,然后但是不管怎么说嗯,这里可以简单解释一下,就是比如说他第一行就指定了c mic的版本,然后第二行指定了我们的项目名称。
第三行这里它首先就通过ADD library这个这个函数,然后它定义了,就是说我们要把我们要把这个文件给打包成,一个库,然后打包成库之后,你就可以去链接它了,然后链接它的话。
你就相当于呃这个你自己写的这个平方根函数,就可以被其他的源文件给调用,那么最后这里还是和之前一样,去声明了我的可执行文件的一个名字,然后以及它是从main点CPP里来的,然后执行完这四步之后。
我们实际上就有一个呃library,然后又有一个可执行文件,这个时候你就可以去做一个链接,就是相当于让你的可执行文件,和这个你需要的这个库给它连起来,然后这样连起来之后你就可以调用它了。
然后所以说和之前对比,我们可能就简简单单加两行,就可以完成一个酷的一个编译和链接,哦真的有张大图对,然后我们就会发现这个嗯,c make来去做一个库的链接还是非常方便,然后实际上对于第三方库。
我们甚至可以有一些更方便的方法,就比如说你可以通过这个呃,c Mac的一个特殊命令叫find package,然后他去搜索你的这台电脑上有没有安装,比如说某一个库。
然后啊或者可以用这个呃package的search module,这个命令,然后呃如果你的电脑上有这个库的话,之前命令就会返回相应的这个嗯库的一些地址,然后返回库的一些依赖选项。
然后你你就可以直接根据这些地址和依赖选项,它所形成的这个变量,然后给它链接起来,就比如说嗯像下面这张图的例子,我我需要去呃用一个A跟库对吧,然后A跟库的话,它本来如果你直接在命令行里写。
肯定是非常复杂的,但是呃如果你用CMC来去做一个链接的话,你就可以发现它,首先嗯它首先通过这个package的search,然后他可以直接找到这个A根的库,然后如果找到了之后呢,它就会生成两个变量啊。
它会生成一个变量,就是因为嗯因为A更是只有头文件嘛,然后实际上你就可以发现这个变量,就是它生成的a an的头文件所在的那个目录,然后你用这个变量去做一些后续的一些这个,Include。
然后或者做一些这个链接,然后你就会发现它整个项目就非常简单的,就你就把A根给编译进来了,然后这里也有一张大图,具体来说就是如果我们找到了A跟这个库,然后它就会生成下面的这个变量。
然后你就可以直接去用这个变量,这个变量可以帮助你找到文件的这个包含目录,以及找到这个这个链接库的一个地址,嗯那么除了这种方法,就是除了我们本地系统上去做搜索之外。
其实你还可以支持一些这个第三方的包管理器,比如说像这个VCPKG,这个就是微软的一个这个vc package,这个跨平台的包管理器,然后比如说以windows为例的话,我们实际上可以在任意位置。
安装上这个VCPKG之后,在你任何一个项目目录下面,你去执行这个VCPKG,然后它install某一个包,这个时候你就会发现,它自动的把那个包装起来了,然后呢执行完毕之后,BCPKG还会告诉你。
就是我我我如果想要调用这个包,我c make里应该怎么写,就是VCPKZ会把这这些c make应该怎么写的,这个代码给打印出来,然后你把它复制出来,粘贴到你自己的c Mac配置里面。
然后就可以完成这个包的一个调用,然后啊,而且我们也不需要关心这个包到底安装在哪,因为VCPKG它是帮你管理好了,所以这个基本上就是一个常见的跨平台的包,管理器的使用方法。
就是说呃如果如果你熟悉Python的话,你会发现它就和pipe有点像,就是说我我pip install某一个包,其实和vc p k g install某一个包,它是类似的,你可以通过这个包管理器。
然后来管理你的所有的这种从第三方装过来的,一些包或者库,呃然后最后在讲完c Mac之后,我们也可以来提一下这个x make,这个扩展的一个构建系统,那么它它不像c max,max自己是一个呃。
更加现代化的一个C和C加加的一个构建系统,这是因为它其实打包了一大堆的内容进去,就是说呃,c make它其实只是一个我们用户的一些需求,到make之间的一个中间体,那么c Mac来知道我们的需求。
生成make file所需要的这个文件,那么x make它其实并不一样,它是帮你打包了,从make到c make,到这个VCPKG的一个所有的一个流程,相当于它既能完成编译,又能完成你的项目管理。
又能完成你的包管理,同时呢它其实还支持管理的一个编译器,然后这个嗯他其实有一个自己的官网,然后在官网上也有一个非常丰富的文档,然后我们可以来简单的看一下它的一个使用嗯,和之前一样,就是x max。
也是需要一个呃固定的一个配置文件的,这个配置文件一般来说嗯都有一个固定的名字,然后像x max这里它就是一个LUA脚本,然后这个脚本的话,呃可以看到,比如说这里的四行,其实就是一个脚本的主要内容。
然后它就可以以一种x make,自己定义的一种语法的形式,然后来完成一个目标的编译,然后对比c Mac的话,就相当于我们刚才这四行,如果你把它翻译成c max的话,它其实还是非常复杂的。
就是可以在CMC里写好多好多行,但是x max来说,它就只需要非常简单的这么四行,所以基本上来说啊,我个人觉得x max还是一个非常容易上手的,一个编译工具,然后他也可以支持一下包管理。
包管理也非常简单,就和c max有点像,你可以直接在那个FMC的配置里面去加一句,比如说你需要ADD什么package,你需要at什么requires,然后像这种。
然后并且x max它也是兼容这个vcp kg,自己的包管理的,然后或者他也他其实也支持,就是你自己啊自己构建的包,而不是说一个第三方的一个知名的包,然后vc ux Mac它也兼容vs,就说正常来讲。
我们的这个,我们如果想用visual studio去这个配置一个c make文件,其实是要打开一个特殊的c max项目的,但是对于x max来说,它并不是这样,它可它实际上可以呃直接生成一个vs项目。
就相当于通过下面这句语句,它就可以直接把你的项目转化成一个vs项目,然后你打开这个项目的解决方案,然后visual studio就会自动的这个能够去运行,然后能够去编译了。
然后x max就是一个非常简单,就是它是一个傻瓜式的一个运行,你在命令行里直接说一句x mix,然后就可以完成从编译到构建到一系列的这种,甚至是包安装,就是说它会识别你,如果哪些包是没有的。
它会自己去安装,然后从这个编译到运行,基本上全部在这样一个命令里,他都会帮你完成下来,然后这里展示一个,比如说我们有的从自己的项目里找的一个这个,x max的配置文件,然后你就可以发现。
就是说他很多的操作都是用了一些更加怎么说,更加人性化,或者更加嗯对用户来说更友好的一种语法来写,比如说如果我们在CMC里要定义C加加版本,其实那个还是有一点复杂的,往往都是要去网上查一下怎么定义。
然后呢你不要把变量名字打错才比较好,但是在x max里,基本上比如说可以看到这样这样一句,非常简单的命令,就可以去嗯定义好C加加的版本,然后以及它有一些非常简单的,比如说你增加依赖库的一些方式。
然后这些都是一行就可以完成,这个依赖库的这个构建,然后这部分其实就是C和C加加的这个呃,全部内容,然后我们可以发现这个嗯,它其实是一个循序渐进的过程,就是说我们一开始最原始。
可能历史也最悠久的就是这个make这个工具,然后呢从make一直到c make c Mac,它其实是比Mac月出了一大步,就是说我们可以用更少的一些编译的配置,然后就能完成这样一个呃。
比如说你要编一个C或者C加加的项目,c Mac其实是比make要省了特别特别多的功夫的,然后再到我们最近可能新新颖的这个,x max这个方法,然后他可能又是说及这个之前的各种大臣,然后他就嗯。
他就兼顾了你的这个编译和这个包管理,然后并且同时它的这个配置文件的写法,也非常的接近我们自己,比如说我们现在这种,大家大家这种怎么说现代人的习惯吧,我是觉得因为c Mac其实还是有一点,有一点反人类的。
我个人觉得比如说比如说可以看这个对比c make,然后像他这里,比如说我们要啊,我们要去做一些呃,查找SRC这个文件夹下所有的这个点C文件,它其实有一个特别奇怪的一个操作,就是长成这样。
这个操作是什么意思呢,就是说他查找所有的点C文件,然后把这些点C文件给放到这个变量里面去,这个src files这个变量里面去,然后你后续就可以用这个变量,然后去完成一些变异了。
但是这个这个其实怎么说呢,如果是从那个年代来的,人,会觉得这是一件自然的事情,因为比如说我们之前学的那些shell脚本,其实它都是这样的嘛,就是我一定要把什么什么东西放到变量里。
然后我后面就可以继续这样用,但是x max它其实他其实也跨出了更大的一步,就是说啊我们可以直接我找一下那个例子,对我们可以直接说我用一个函数,然后函数里就指定了我要的一个正则表达式。
然后我x make就根据我这个正则表达式去搜索,然后这个可能是一个更加自然的一种方式吧,就比起c max来说,所以总结一下,就是啊我觉得我们经常需要了解的是,或者说我们经常遇到的。
并且需要了解的基本上是后面两种,就是c make和x make,至于make本身,其实大家知道它是怎么一回事就行了,就是说知道make,它是一个,用来这个用来生成或者用来配置系统的。
一个这样一个这个啊build system就可以了,然后至至于make,比如说make file到底要怎么写,然后里面的语法是什么,这个可以不用特别仔细的去关心。
因为我们现在基本上都是不直接去写make了,而是用c Mac或者x make,然后对于c Mac来说,可能如果不是就是不是特别刚需的话,就比如说你并不需要自己去把自己的仓库打包,发布出去的话。
基本上也不一定要用到c Mac,就是说你可以知道c max是什么就可以,然后你会你会用别人的c make list,这样其实已经够了,但是如果你需要把自己的仓库,打包发布出去的话。
其实还是需要掌握一下c make的,因为虽然x make很好用,我们可能我们可能可以,甚至可以,直接拿x max作为C加加编译的一个上手工具,但是它毕竟不是那么的就是流行吧。
所以如果我们要把自己的东西发布出去的话,基本上还是应该提供一个c mic list,所以这就是一个基本的一个三个东西的区别,然后在讲完这个C加加的部分之后啊。
我们可以看一下这个Python这里的包管理器,然后呃包管理器诶,等一下我看一下弹幕,哦对有同学说到一个点,就是这个是通配符,是的是的,就是这其实是那个哦LINUX的路径的通配符。
它和正则表达式还是有区别的,然后呢另外一些哦,我看一下,另外一些就有同学说到这个古代SIMIC哦,我我后来想了一下,确实是有可能就是比如说这里展示的例子,可能都是一些特别特别旧的一些例子。
然后至于最新的SEMIC到底怎么写,嗯这个我还真不了解,然后可能大家也可以去学一下,就是最新的,比如说嗯最新的c Mac,它的一些语法我估计是会比以前的有所改进的,然后总体来说还。
总之还是建议就是大家根据自己的需求去学,比如说x make或者去学c make,然后x make本身的话,在我具体的使用过程中,其实也是遇到了很多问题的,就比如说因为毕竟他是一个非常新的东西。
然后呢它可能功能有些方面没有说c Mac这样,经过时间的考验,然后经过各种奇奇怪怪配置的考验,所以x max可能是有很多不支持的地方,就是如果大家并不是一个通用的一个,项目的配置的话。
就就说比如说你的编译条件或者编译选项,特别的这个非通用,那么其实x max它不一定能支持,所以这个具体来说还是要看各自的这个项目的,一个嗯需要的一个需求情况吧,所以嗯这个选择的话还是放在这里。
就是c max和x Mac,我觉得都是这个比较好的一个选择,啊当然我个人用x max,可能是因为嗯它附带把包管理给搞进去了,所以个人感觉就稍微省力一点,然后如果用c Mac的话。
可能也可以就是c Mac,然后配套上别的这种包管理的系统,然后premier我我就不了解了,OK那我们接下来讲一下Python这边的包管理系统,就是Python这边的话。
其实大家知道的最知名的可能就是像康达,pipe这种,然后其他的呃我我其实也没有听说过,然后Python语言的话,它其实和C加加和和C语言都不一样,它是一种这个解释型语言,就是说我们不需要做编译。
我们直接在解释器上去运行就可以了,所以说对于Python来说,可能没有那么复杂的一个编译的过程,因为实际上你安装Python本身的时候,很多东西都已经编译好了,就比如说Python自己的解释器。
你就已经编译好,然后它是不需要你去再做额外的编译的,然后我们的Python代码都是直接在解释器上运行,这个时候对于解释器来说可能事情就少很多,就相当于我们在C加加或者C语言里面,我们既需要管理包。
又需要去配置编译环境,但是在这个Python里,你可能只需要去这个呃管理包就可以,比如说我们大家都知道这个康纳这个东西,就是它是在Python里的一个非常知名的,包管理和环境管理的一个工具。
然后我们经常用的两种康大,可能是mini康纳和安娜康纳,然后呢嗯这里两个基本上功能上是类似的,只不过安娜康达,它会附带很多科学计算用到的一些包对,然后这里的话mini counter就是呃。
一般来说是我个人觉得我经常用到的一个东西,就是说啊我们比如说拿到一台LINUX服务器,或者拿到一台新的电脑,然后如果要装一个CONDA环境的话,基本上我的选择都是装一个mini conda的环境。
因为这个东西它首先哦特别特别小,然后它又安装的特别快,然后所以等你装上之后,再去自己决定安装怎么样的包,其实都是一个比较方便的事情,然后但总之这两个其实没有太多的区别,然后具体来我们可以来看一下。
就是嗯比如说我们我们命令行。
我们之前应该也就是见过这一幕,就是说前面有一个base这样一个选项,是在我们上次ZH配置的时候嗯,大家可以可能会注意到的一个点,然后这个base它其实就是一个康达的环境,然后呃康达你在默认安装的时候。
它会提供一个默认的base环境,所以康达基本上哦他做了两件事,就是做了一个环境的分割,就是他会把你的这个运行环境给分成好几个,然后每个运行环境之间安装的包,它是互相不可见的。
然后所以也互相不会污染或者干扰到。
然后主要是这样一个事儿,然后对于康纳来说,我们一般来说先要配置一下它的这个清华园吧,呃我不确定现在是不是还是需要,我感觉经常,反正如果如果如果你发现它默认的那个圆,它不是一个国内的语言的话。
一般来说会很慢,然后最好还是配置一下这种嗯康达的一个圆,这个圆是什么意思呢,就是说我们要下载一些新的,比如说互联网上的一些别人发布的包的时候,康纳从哪个网站上去找这些包。
它其实就是从他的这个channel里去找的,那么这个channel的话,就导致说,如果比如说你的channel是一些默认的国外的channel,它可能就特别卡,所以我们一般来说会把它换成自己国内的产能。
然后这个是一个第一件事,然后然后设置好这个圆之后,我们就可以去看这个包管理了,然后包管理的话它主要就非常简单,就像刚才的VCPKG一样,我们用conda install。
然后后面填包的名字就可以安装这个包,然后或者说康纳install后面填包的名字,在指定它的版本号就可以安装指定版本的包,然后也可以康纳去卸载一个包,或者还有一些额外的功能,比如说康纳clean。
就删除掉那些你下载了但是没有用到的package,然后或者你可以清理掉一些文件,这种呃常见于比如说你的电脑,这个实在放不下那么多东西的时候,然后以及我们还有一些功能就是列出呃,列出包。
比如说kda list,它其实是列出当前的环境下面所有的包,然后呃这里再快快速的过一下pip pip,它其实也和康纳很像,就是这这里都一模一样,就是pip install。
然后你填一个包的名字或者指定它的版本,然后或者说嗯这里,这里是你根据这个requirements,这个text里所有的内容,然后你去根据这个文件指定的那些包去安装,这个时候就要加一个杠二选项。
然后这个的话也是比较常用的,然后以及它的卸载KDA这个uninstall,或者哦不对,pipe uninstall或者pip list,然后这个和kda list也是一样的。
那么这些功能其实等我们遇到了再去查,其实也完全OK,因为pip和CONDA都是一个非常简单的两个工具,就不像我们之前遇到的git,它有各种复杂的概念,康纳和pip基本上就非常简单。
然后pip它也有一个换元,然后这个换元的话,你可能需要到你的一个个人,就是用户目录下面的一个文件里去改,然后这个具体来说网上有很多教程,那么我们来讲一下刚才一直cue到的这个概念,就叫虚拟环境。
那么什么叫虚拟环境呢,它其实就是一个包含了特定Python解析器版本,以及一些软件包的一个目录,什么意思呢,就是说呃有的时候我们会遇到一些特殊的需求,比如说呃比如说我我希望运行别人的一个仓库。
但是呢他那个仓库只能在Python的一个,特定版本下运行,或者说它的很多语法都只能在那个版本下,可能会比较配套,或者说它依赖的一些包,最新的只发布到了那个版本,或者等种种原因。
就是啊总而言之就是你遇到的一个特殊需求,就是你必须要指定,首先我这个我这个项目要用到怎么样的Python版本,其次我要用到哪哪些版本的软件包,比如说呃举个最简单的例子。
我们可能在一个环境中需要部署不同版本的Python,然后或者说你的你需要安装不同版本的包,比如说我们知道NN派,或者我们知道一些这个open CV,这些包它往往不同版本之间,虽然它已经尽量在兼容了。
但是不同版本之间其实还是会有差异的,然后有的时候你可能只希望其中一个版本,不希望另外一个版本,那么这又带来一个问题,比如说你的项目A它可能需要某一个版本的Python。
项目B需要另一个版本的Python,这个时候你怎么样去这个协调,这两个版本的冲突,这里就遇到一个虚拟环境的概念,所谓虚拟环境,就是说我们相当于有点像虚拟机一样的感觉,就是说我们打开了一个虚拟的一个机器。
这台机器上装了一个Python,比如说python3。9,然后你还可以打开另一个虚拟机器,那个机器上装了python3。8,然后对于你的程序来说,他只能看得到你的虚拟的环境里的Python版本。
然后他不知道你真正的Python版本,他也不知道你其他虚拟环境里安装了什么包,他只看得到当前虚拟环境里装的包,这就让你能够去完成一件事,就是说我们可以部署不同版本的Python。
然后并且不同的虚拟环境之间,它们不会相互影响嗯,那么这里就举一个最简单的例子,我们一般来说用CONDA创建虚拟环境,而不是用pip,然后KDA的话喷的话,它最简单的命令就是这样。
就比如说康达create杠N哎,这里打错了。
哦这个是杠P。
康纳create gun,他就是说啊我创建一个虚拟环境,杠N的意思就是我的名字叫这个,我的名字叫这个in the name,然后呢我的Python版本这里也可以填,你可以填一个三点,比如说3。
9或者怎么样,然后或者呃你可以用另一个选项叫做杠P,这个选项是说这两个选项的区别,就是你把这些环境,所有的那些文件存到哪里去了,那么杠N,它它其实是把文件存到你的那个用户目录下。
就可能比如说对于windows来说,他都可能在C盘下面,然后对于这个LINUX来说,它可能就在home目录下,然后有时候你那个地方比如说你C盘特别挤,或者你的home目录下特别挤。
然后你这个虚拟环境又必须装很多很多的文件,然后有时候放不下了,我们就会用下面这一条,就下面这一条你是指定了一条路径,然后去放这个虚拟环境,这个时候呃,就就可能比如说我,我我专门把我的虚拟环境放到D盘去。
这样的话空间上就不那么挤一点,然后这个是一个点,其次还有一个区别,就是我们在激活这些虚拟环境的时候,对于第一种方法,我们可以直接输入他的名字就可以激活,对于第二种方法。
你要输入它完整的路径名就可以才可以激活,所以嗯如果说正常情况下,我们都是用上面这种方法来创建环境,然后创建完之后,你就可以直接通过这个conda activate,然后就可以去激活它。
这个name就是你自己命名的某一个名字,然后你激活了也可以去解除它。
解除就很简单,用这句。
OK这个虚拟环境其实就没有太多好讲。
然后这里我讲一个点吧,就是说嗯就是说我们我们关于这个虚拟环境。
它可能有一些特殊的一些地方,就比如说呃就比如说我们有的时候,你其实你其实拿到了一个别人的那个项目,然后呢,你会发现就是他的一个Python仓库里,可能有一个这样的文件。
这个叫requirements text,然后这个文件是用来告诉你,虚拟环境的版本的哦,就是虚拟环境里安装的包的版本,所以一般来说我们拿到一个新的,别人的仓库的时候,呃,如果你想要去运行它的代码。
比如说它的Python代码,那么你可能需要做的就是首先去做这样一件事,我首先创建这样一个虚拟环境,比如说我在这里的显示的例子,我首先去create一个虚拟环境。
然后把Python的版本换成他的仓库所需要的,那个版本,然后创建完了之后,我就可以去用这个pip install嗯,杠二,然后用这句来把他的所有依赖项全部装上去了,然后装完之后。
你就可以正常的运行它的一个项目代码,然后这就其实是一个非常简单的一种包管理对,然后嗯然后另外提到一件事,就是康纳和pip之间的混用的关系,就是说一般来说嗯我们知道康达能够安装包。
然后pip也能安装包对吧,然后如果你在一个虚拟环境里,你又用CONDA安装,用pip安装的话,往往会遇到一些冲突的问题,就是它有时候还蛮不兼容的,所以这里建议就是呃要用这种其中一种。
比如说我只用康纳安装,或者只用pip安装类似这样的一个方法,然后像我个人的话,我都是用只用pip安装,嗯然后虚拟环境可能就是这么多吧,就是简单来说它就是一个呃,稍微复杂一点的包管理系统。
然后我们可能经常用到的这个康纳和pip,在网上也有非常非常多的资料,然后大家就是遇到什么具体问题,也可以到网上去做一个搜索。
然后最后我们来讲一下,我们的这个性能探查的这个部分呃,性能探查的话其实是嗯,因为它是一个特别小的部分,所以当时可能在这个哦准备课程大纲的时候,就没有把它专门塞成一个模块,然后所以就在这里顺便讲一下。
那么性能探查其实是我们,比如说我们不管是写C加加程序,还是写Python程序都会遇到的一件事,只不过大家有,就是有些同学可能平时并不是怎么用它,然后可能有些同学平时就已经在用了。
但是现在总而言之性能探查啊,我我个人觉得还是一个,我经常会用到的一个工具吧,就是比如说我们写了一个写了一些代码的时候,然后你可能比如说你可能嫌它太慢了,或者说你觉得每一次跑,比如说我渲染什么东西。
然后我每次渲染都花的时间太久了,然后比如说我想改一个参数,然后再重新渲染一下,然后这样嗯就是这样反复的,你改参数,然后看结果,改参数,看结果,这个过程中,可能你的程序运行占了一个非常多的时间。
然后这个时候,如果我们能通过一些这个代码上的加速,或者说我们能够知道这个代码到底慢在哪了,从而去提供一个时间上的优化,那么其实可以给我们的开发,或者给我们的这个这个呃项目的编写。
或者项目的管理给提供非常多的便利,所以这个地方的话基本上嗯,就是比如说对我来说,我写一个项目的话,经常会用到的工具,就是比如说在C加加下就会用到这个visual studio,它自带的一个性能探查器。
然后我就看一下我的代码是不是有明显不合理,或者明显慢的一个地方,那么如果有的话,这个性能探查器它其实就会给你显示出来,然后你可以根据显示的这个结果来去排查,你的代码到底卖在哪。
然后比如说呃对于visual studio的这个性能探查来说,他这里这张表格它其实是会列出你这个项目中,每一个函数,它的一个CPU占据的一个时间百分比,然后你可以根据这个百分比来判断。
你代码最慢的部分在哪里,然后它是不是慢的不合理,还是说他的慢是合理的,就比如说你有特别密集的计算,这种是合理的,但是如果你写了一个特别特别慢的循环,就是因为因为你自身的一些一些过失吧。
然后写了一个其实应该很快,但实际上最后写出来特别慢的循环,然后你就可以通过这个性能探查来发现,就这个地方比想象的要慢很多,然后从而去改进这一块的代码,然后这就是性能探查的一个主要意义。
然后对于Python来说的话啊,我用的可能就是这个c profile,它自带的一个东西,然后加上一个哦第三方的这个可视化的工具,然后这个也是可以用pip来安装的,然后用pip安装的话之后。
你就可以可以就是去图形化的查看它的一个,这个性能的一个结果,然后这里可能有一个比较分辨率比较低的例子,然后总而言之,这个例子的话就是说它会像那个visual studio一样,把你的函数调用的这个时间。
调用的这个比例全部给你列出来,这样你可以知道,就是比如说每个函数具体占用了多少时间,对那么总而言之,用C和C加加,或者用Python的这些性能探查,我们的终极目的都是为了提高我们的这个这个。
这个工程的一个构建的效率吧,就是说可能有的时候速度并不是最重要的,但是在有的时候,比如说当你需要频繁的去修改你的程序的参数,去观察它的结果的时候,速度就变得很重要,比如说如果你三天才能搞出一个结果。
然后去呃重新调整你的这个参数,然后再去花三天去看新的结果,像这种,比如说,那我们就会发现,你甚至不如,你先花个一周时间去把你的程序改成,比如说把它的速度提高到,我可能一天就能出结果。
这样的话我接下来一周可以七天跑七次结果,但是如果你什么都不做,你还是三天出一次结果的话,我可能两周就干不了什么事儿,所以这个可能是一个性能探查,一个意义所在的。
然后嗯Python的话除了自带的这个性能探查,它其实还有一个就是它可以看每行的一个性能,占用的时间,这个在C加加里是没有的,这是因为Python它毕竟是一个解释器的语言,它的每一行是非常的分明的。
就是Python解释器知道现在执行到哪一行了,但对于C加加来说,它是一个编译后的一个结果,所以它其实不能知道每行的一个性能情况,但是呃它可以推断出来,就比如说某一某一条二进制的字节码。
它到底对应的原文件里哪一行,所以这个总而言之,这个Python也是能够支持这个功能,就是它能告诉你每一行占用的大概时间,比如说这里就有一个例子哦,这就是一个函数,右边这个地方是我写的一个函数。
然后呢我们就可以看每一行,比如说他占用的一个时间,然后发现呃,第八行这里占用了92。9%的时间,你就会知道,然后你再看我这里是一个这个判断,这个某一个数,在不在一个列表里的这样一个语句,然后你就会发现。
就假设呃你的代码里这一句,你本来觉得他应该很快的执行完,但是通过性能探查,你发现它占用了你程序93%的时间,那这其实就是不合理的点,那么我们可以来分析这个不合理的点,其实这这个例子就非常简单,就是说。
如果你,如果你这个这个这个功能被用得如此频繁的话,那你就不应该设计把它设计成一个列表,应该把它设计成一个这个set,一个散列表,所以你会发现这一句就是它的功能是一样的,但是它只占用了非常少的时间。
所以如果我们把上面这句改成下面这句话,你可以想象,整个整个代码的速度就会大大的加快,然后可能就可以给你的开发省下时间,然后这个是我想说的一个点,OK然后最后呃我们可能嗯最后再总结一下。
比如说嗯再总结一下,从性能探查这个点引申开来的话啊,我们要怎么样去高效的去做coding呢,呃我觉得首先第一步可能就是准备你的code base,就是说我们的某一个项目,它到底要从什么程度出发。
是从零出发,还是说从我们的GITHUB上一个已有的仓库出发,然后针对你想实现的那个功能,我们应该用什么样的语言,应该用C加加还是用Python,然后我们比如说,如果我们是从GITHUB上一个项目出发。
那么我们应该怎么样阅读别人的代码,这些其实都是一个点,然后比如说对于我来说,我最经常的需求就是嗯,我可能拿到别人的一个code base,就是他已经有了一个呃一个具体的实现,然后有了一个具体的仓库。
然后我要先把他的仓库读懂,然后我在上面可能可以做一些修改,然后做一些实验,然后去发展我的新方法,然后这个时候的话,其实呃第一件事就是你要去读懂别人的代码,然后这个读懂的过程中。
我觉得这这一步其实还蛮重要的,就是说我们一定要利用到呃,像是IDE这样的功能,就是说我们能够比如说能够去嗯,你点击它的一个函数,你就可以跳转到它的一个定义,然后甚至是你去实际的运行它的代码。
去做一个编译,做一个调试,然后或者你把它放到Python的tubular notebook里,然后一句一句的执行,然后你去看他的输入输出,总而言之就是我们不要把代码当作纯文本来读。
就是如果你把它当纯文本来读,其实是非常难读的,但是如果你用一些现代的一些方法,比如说IDE,然后比如说编译调试工具,然后比如说自己去运行,去查看输入输出的这些方法,其实会事半功倍,然后这个可能是嗯。
第一步就是我们准备好我们的code base,然后读懂他们的这个呃代码到底是怎么写的,然后接着我们我们去起步的时候,就我们开始写我们自己的代码的时候,我们肯定是有一个具体的问题的。
就比如说你想要解决一个什么点,或者你想要给它的代码上加一个什么功能,那么在一开始问题的一开始,我们一定要用最高效的方法,就可能可能对于一个问题我们有多种解决方法,然后有优雅的解决方法。
有一个粗暴的解决方法,但是对对于,就比如说我们经常遇到的这些问题来说,如果你是一开始去处理它,那么我建议一开始还是用最高效的这个方法,比如说我们我们可以呃找一个开发效率最高的,比如说呃如果你需要可视化。
那么怎么可视化呢,嗯C加加当然有像ONGL这样的可视化,然后Python也有它自己的可视化,但是呃你其实可以把它放到这个chrome浏览器里,然后去做一些你自己的一些修改或者调试。
然后你可以用它的控制台的JAVASCRIPT来做一些辅助,然后像这种就是怎么快怎么来吧,然后像Python的话,一开始可能我们就可以放到jupiter notebook里去,去做一个这个开发。
然后相当于你可以每个cl每个cell的执行,而不是说你把整个脚本文件一块执行下来,然后在起步的时候,我们可以用最高效的方法,然后等你验证你的方法是嗯OK的的时候,然后我们再把我们目前的代码给整理下来。
可能整理成一个比如说和原来的仓库风格类似,然后可能也封装好,也比较优雅的一个状态,对这个这个就是一个起步的时候的一个问题吧,就是一开始还是要高效更好,然后后来可能等你等你验证你的正确性的时候。
然后你再把它组织成一个更加系统的一个代码,然后对于我们的一开始去处理问题的时候,对于性能来说,对于我们是否符合面向对象的基本原则,我我感觉我们可以不用太早的关心这些问题,特别是优化上的问题。
因为如果你写代码的时候,就太关注优化的一个问题的话,其实会影响到你的开发效率,就说一开始我们可以嗯就是怎么样直接怎么来,而不是去关心它的性能,等到你把整一个问题给他,全部给它完成之后。
给它写成一个代码之后,然后你可以回头来用我们的性能分析工具,然后去关心它的效率,去关心它的一些性能的优化,然后当然在完成了就是你的一个coding的时候,其实还有一个很重要的一环。
就是做一个DEBUFF去做一个调试,那么我我感觉调试其实还是呃,代码编程中一个非常重要的一个地方,就是说呃,我们可能只有50%的时候在写代码,剩下来50%的时候再调试,那么调试其实也是非常有讲究的。
就是说啊我们到底要怎么调试,那一定要首先磨刀不误砍柴工,你去找一个,就是最能直观的看到我当前运行到哪里了,然后我当前有哪些变量,然后我怎么样去做一个可交互的调试方法。
然后特别是像我们用IDE就是用那个必修studio啦,然后用PYTHM啦之类的这种啊,这种IDE去做一个可交互的调试,然后也不要尽量不要就,除非你觉得非常非常确定。
但是尽量不要就是通过肉眼去看那些文本的代,码去做一个调试,然后debug,反正永远是最关键的部分,然后这个地方就有一个就有个点,就是说必要的时候,我们可以保存下来中间的结果,然后和标准的程序去做比较。
就比如说假设你有一个标准的程序,比如说我要实现一个什么功能,然后可能别人已经有一个标准的这个功能,或者我有一种方法来验证我的结果是不是对的,然后这种时候,我们可能也可以保存一些中间结果,然后去做比较。
就简单来说把它拆分成一个小问题,然后再去做一个正确性的验证,嗯然后最后比如说像深度学习这种啊,不要长时间的盯着他的一个训练过程,或者说像渲染这种,或者或者物理模拟这种,你就不要长时间的盯着他的一个过程。
然后可以把这些过程就是等待的过程,拿去干别的事情,然后比如说你可以边等,就可以边开始修改其代码,然后此外可能还有一个啊,比如说良好习惯是你每一次运行,然后你可能会有一些参数去做微调,然后这些参数的微调。
你最好把它都记录下来,就比如说你每次程序到底是怎么样能够复现的,嗯这些东西如果你能够记录下来的话,其实对整体的一个开发是有一个帮助的,然后最后可能呃这个可能就更加针对科研,或者针对一些别的东西了。
就是说我们要明确我们自己的计划,然后去判断接下来需要多少实验,需要多少时间,然后根据这个来判断,比如说我们有没有必要去优化,程序的运行速度等等,然后最后就是想清楚啊,整个开发过程中。
它的一个这个呃瓶颈在哪里,然后你的计划是什么,然后你要平衡好你的精力和时间,精力和时间其实是两个非常不一样的事情,就是有时候你可能有充足的时间,但是你没有什么精力,有的时候你可能精力充沛。
但是时间来不及,所以总而言之就是我们无论做什么,其实都是要做好这两件事的平衡,然后最后可能就嗯最后可能就到这里,然后这就是我们本次课的全部内容,然后我们来讲一下作业吧,这里这节课应该是发布要发布作业二。
现在那个作业网站上应该还没有上传,然后等下课之后,我会把它传到这个作业网站上,嗯然后这里的话一共有三道题,三道题加起来是有22分,但是这里有六分是选做的,就是也不一定一定要要完成。
然后前面16分是有两道题,第一道题是这个,就是哦你其实是在A和B两个题目里选一个,因为考虑到命不是所有人都又会C加加,又会Python,所以我们可能就CR和Python的去做一个分支吧。
就是如果你会Python就做B,然后如果你只会C加加,你就做A,然后就像这样,然后这两个的话,其实呃都是涉及到我们今天所讲到的内容,然后嗯第一个C加加的这边就是去很简单的。
我们先写一个hello world程序,然后呢去把它给它编写一个c mic list,然后这样就可以用c make和make来完成编译了,对然后第二个像B这个题,B这个题的话。
就是说你去装一个mini conda或者装一个安康达,然后去尝试创建一个新的虚拟环境,然后呢用Python装,用pip装指定的两个包,然后最后去列出这些已安装的包呃。
然后第二道题的话就涉及到刚才说的这个性能,性能的话,就是说啊我们最简单的写个排序算法,然后去做排序时间那个比较,然后可以用你刚才说到的这个性能分析工具,去做一个分析,然后B也是B也是Python版的。
然后如果你只会Python就做B,只会C加加六做A,然后最后是一个选做的题目,选做题目的话哦,对于C加加来说,就是去哦用一下x make,然后对于这个Python来说的话。
就是做一些更复杂的一些虚拟环境的操作,然后呃基本上全部内容就是这样,然后最后我们可能这个作业的话,提交到PDF里就行,然后涉及到代码的话,就把代码复制到文档,然后如果要展示一些结果的话。
比如说你的命令行的结果,那么你就把这些截图给附到文档里,然后最后截止时间是这个6月4号的晚上,然后呃,大家可以看那个这个这个作业提交的网站,去做提交,然后如果这些还有什么不清楚的,也可以,这个随时扫。
就是扫我们的课程主页的码,然后那里面有一个QQ群的码,然后大家可以加入到里面去,然后我们会给大家答疑,大概就是这样,OK然后大家如果还有什么问题的话,可以在弹幕上告诉,OK有同学问WEBGL发展咋样。
这个我就不是很清楚了,行那如果大家都没有什么问题的话哦,今天课先到这里,然后呢,反正之后随时都可以在QQ群中提问。
GAMES002-图形学研发基础工具 - P6:代码编译器与笔记软件使用技巧 - GAMES-Webinar - BV1cC411L7uG
行啊,各位B站的朋友们大家好,各位同学们大家好啊,也是好久不见呃,上一周是五一,然后我们停了一次课,然后希望呃,相信大家也过了一个比较愉快的假期吧,嗯今天我要给跟大家讨论的一个就是呃。
讨论的一些工具呢是和代码和文档编辑相关的,好我们直接开始啊,今天讲的部分主要是要分为两个,我我我主要会讲四介绍四种工具呃,前两种vim和visual studio code呢,他们都是代码编辑器。
就是用来编写代码的,然后后两种是markdown和呃lay tech呃,这两种工具呢是用来写文档的行,我先把这个摄像头关掉啊,以后避免之后挡内容。
行,我们呃我们首先去介绍一下,什么叫集成开发环境,集成开发环境的意思呢,就是呃他其实简单理解呢就是呃它最主要的,但最主要的功能就是让你去呃,编写代码的一个地方,然后此外呢它还可以去集成一些其他的工具。
能让你的代码编译或者运呃,编译运行或者调试等等,其他的呃一些一些呃一些功能都可以有啊,这边呢我我我展示了两张统计图,这两个统计图都是截止到2023年的一个,统计的信息,今年的统计信息还没有出来。
嗯这呃首先左边这张统计图呢显示的是呃,目前最热门的一些呃集成开发环境的使用的数,用户的数量,我们可以看到visual studio code其实处在一个断层,第一的状态啊。
就是说visual studio code它的用户其实是最多的,用户基数是最大的,然后他的第二也是同样为微软公司开发的visual studio,也是一个呃,它是一个更加强大。
然后也更加大规模的一个呃一个集成开发环境,然后此外呢我们还可以看到,就是今天要讲另外一个win也是比较常常见的,也是排的比较靠前的呃,再往后看可以看到拍唱,还有jupiter notebook。
然后也是如果写Python的,同学们可能会比较熟悉这些呃,一般这两个这两个应该是呃比较专业,也比较常用的Python开发的工具,当然是除了visual studio code之外的工具啊。
然后右边这个统计图呢显示的是常用的几个呃,代码编辑器的用户的对用户的吸引力,这个图的意思是什么呢,就是它每一个半圆,每一个扇形,它对应一个呃,对应一个代码编辑器,然后每一条这样的透半透明的边。
其实代表就是比如说它从A连到B,他的意思就是我这个用用户正在使用A,然后他对这个B感兴趣的一个数量,对这个边应该越粗,就代表的数量越多,然后我们可以主要关注三个。
就一个是visual studio code,一个是WM,一个是new wm,然后其中new wm,其实就是win的一个更新的版本呃,我们可以首先看到visual studio code的部分呃。
前半就是前面这个小小段呃,它它代表的是就是从visual studio code指出的一些编,指出的意思就是我这个用户正在使用visual studio code,但是对其他的一些软件感兴趣呃。
然后后面这个更大的一个更大的半个部分呃,它是指入的边,然后他的意思就是我用户正在使用其他的软件,但是对visual studio code感兴趣,然后其中也包括一些就是粘性很高的用户。
就是正在使用visual recode,并且我也只对这一个软件感兴趣的用户呃,然后我们可以看一下,更有意思的是new win呃,这个边它是从visual studio code指向new wm的一条边。
也就是说,这一部分用户代表的是正在使用visual studio code,但是对new wam感兴趣的,然后最有意思的是,其他部分所有使用new vm的用户,他都只对自己这一个软件感兴趣。
他不会去看其他的就可以看,大概的看出来就是呃,其实如果是实习惯使用win这这类风格的编辑,编辑器的这些用户,他们可能就很难去接受其他的编辑器了,呃,然后包括win也是WM只有一条比较细的边。
是指到vivisual studio code,然后这也是因为visual studio code它应该也是可以配置成,就是跟win的操作几乎一样的这种呃这种样子的,所以还能够符合这个win的操作习惯。
OK接下来呢就是给大家来介绍一下win,然后因为不涉及到特别高级的一些呃一些功能,所以就是new vm和VM都适用的呃,这些接下来的内容其实是new vm和VM,它都是用的一个一些操作,呃。
我个人其实是不会用win的,就是我我只知道他们怎么工作,但是我用的特别不熟练,所以我也不习惯用win,然后呃这次课给大家介绍这个win呢,主要是有两个有两方面的目的,第一方面就是对于那些。
如果你听完这个WM的介绍之后,你对WM非常感兴趣的话,那么欢迎你继续去查WM的文档,然后就可以拿我这个PPT做一个引子去呃,去开始尝试WM,然后并且慢慢的熟悉它,然后呃需要提醒你的是。
这个win他的学习过程可能会很困难,他会很慢嗯,然后第二个方面呢,是对于那些对V不太感兴趣的同学呃,你们需要知道呃,你们一定需要了解的几点是呃,第一是win它的模式,它这几个模式就像右下角这个图一样。
它其实WM其实就是一个五个状态的自动机,然后自动机之间的状态是怎么来回切换的,你们要清楚,你们要清楚它是一个自动机的模式,然后第二就是很重要的,就是呃你们要知道怎么打开win之后怎么退出。
对如果说你完全不会使用的时候,因为你有的时候可能会避免不了打开VM呃,然后那个时候,如果你连退出或者保存都不知道怎么做的话,那就会陷入很麻烦的很麻烦的困境了,OKWM它的特点呢主要就是使用广泛。
以及它的历史很悠久,因为它其实是比这种比如说像windows这种操作系统,其实历史还要悠久的,它是在这种图形化界面的操作系统之前,就已经有了一个编辑器啊,是它是,所以它说它是可以完全运行于命令行的。
而且它也只能运行于命令行,也就是说比如说你要在现在来讲,如果说你要去远程SSH连接到一个服务器上,然后那个服务器很可能是没有图形化界面的,那这个时候你用文本编辑器,大概率就要用到WM。
当然也有一个更加接近现代编辑器的嗯,叫做NANO呃,那个功能应该就不如WM强大,但是可能会更接近于现在的,更加接近现在的这个编辑器,然后WM的话刚才说过,他确实非常难以学习。
但是学习如果你能真的能使用呃,这个熟练使用的话,收益是非常高的啊,就是一般来讲用win的这个用户啊,它的开发的速度,还有打字速度等等,应该都会比用其他的嗯,用其他软件的一些开发者要快一些。
效率要高一些呃,ram还有一个大特点,就是它可编程,然后有高度的自由性,就是你可以很就是有高度的个性化的这个能力,你可以把它配置成你想要的样子呃,它的可配置的东西,包括但不限于重视重映射键盘。
然后设置你自己想习惯的快捷键,然后也包括一些高亮和那个语法,就是高亮和什么缩进等等的规则,然后WM的配置文件,也是类似于我们之前讲过的BHBH的配置文件,有一个点BSRC。
然后WM的也有一个叫做点WMRC的东西,然后如果是new wm的话,会不太一样,一眼它是它叫做INIT点win呃,总之有一些更高级的设置,都可以在配置文件里去去这个呃去设置。
然后另外呢vim他会也会借助一些呃,借助很多大量的第三方插件去实现,其余的功能就是在编辑文本之外的一些功能,好的嗯对,在此之前我还是要去让大家看一下,就是记住右下角这样一张图。
这这个图就代表的win有五种状态,它最常用的状态也是呃我们WM刚打开,刚进入WM的时候,所处在的状态是中间这个叫做normal,normal状态下,可以通过呃,normal状态下。
它其实跟我们现在的文本编辑器不一样,你在键盘上敲一些字符,它不会直接的去在光标注插入那些字符,而是会把你敲入的字符识别成一些命令,然后这些命令作为这个自动机转换的一,些转移条件,比如说你敲一个大写的R。
那它就会从normal去切换到replace,这样一个状态下,然后在replace这个状态下呃,replace之后也会讲,他其实是主要是呃,只是用来去替换一段文本的,替换一段长文本来使用的。
然后呃另外还有一个insert状态,insert状态是最接近于我们现代文本编辑器的呃,常常态的,也就是说在int insert状态下,你输入一些字符,它会真正的在光标处插入那些字符。
像呃就是正常的去编辑这个文本,然后呃右下角的是visual状态,visual状态是用于选择一段文本的,就好比我们现在文本编辑器用鼠标去呃,选中一段呃,去框选一段这个内容。
然后还有一个叫做command line状态,command line状态就是命令行呃,也就是说呃在这个状态下,你可以去输入一些呃,输入一些字符,这些字符会被解析成命令。
然后让呃然后让这个win这个编辑器去呃,做你指定他做的事情,好的,我们接下来就是一个状态,一个状态来讲,首先呢是normal这个状态下M1呃,normal这个模式下。
最主要的要知道的就是在normal模式下,上下左右移动,可以用分别用这个KJHL这四个键去代替,然后大家可以看一下键盘上呃,HJKL其实是E就是一排连续的四个键,所以这个跟我们的上下左右键的分布。
是不太一样的,大家要注意一下,然后为什么我们要用这个这四个键去移动呢,这是因为呃WM它有一个宗旨,就是它尽可能的不用鼠标,它不仅不用鼠标,还呃让你尽可能的少用键盘使呃,就是用键盘的区域,就是它能让你。
他会让你就是所有工作都能够在那个数字键,以及常规的字母键,然后再加上ESC以及一些,比如说shift control的一些呃,普通的普通的这种快捷键呃,就是你五个手指最容易够到的地方呃。
这些地方的按键就足以完成所有的任务了,如果是呃对于旁边那种小的数字键,你可以用,但是你可以你也可以不用,你用了的话,就相当于是浪费了时间,然后报甚至于这种呃上下左右的箭头,这些箭呃也可以不用用了。
也是浪费时间,这就是WM的哲学之一啊,为什么还有两个哲学啊,就是首先它是区分模式,刚才说过,然后不可编程,就是配置自由,刚才也也说过了,OK那么在懦弱模式下,是用HJKL这四个键去进行光标的移移动的。
然后呃不只有这四个移动,这四个移动很是最基础的移动,还有其他的花式的跳转,比如说我们可以跳到单单词的开头结尾,然后括号的左左半部分和右呃,就是左括号和右括号,或者是行内段落间。
或者说上下翻页这些很高级的,现在编辑器里有的功能,win里都有,就是它们对应的,就是在normal模式下的不同的按键,然后具体的案件也是在PPT里有讲,我就不一一念了,大家可以在课后的话呃去看一下。
也可以照着这个按一下去实践一下啊,然后另外呢就是我们要介绍的就是insert模式,插入模式,进入插插入模式的方法,就是在normal模式下按小I键,就直接按那个I就可以了。
然后呃进入insert模式之后,他做的事情就是在当前光标位置进行编辑,然后还有一些其他的进入insert模式的方法,也是一些花式进入insert模式的方法,比如说我可以先跳到行首。
当前行的行首再进入insert模式,就是把当前的光标先移动一下,再再insert,那这个实现就是用大写的I,也就shift加I就可以了,然后还有一些其他的先体移动光标,再进入insert模式的方式。
也在这个PPT里有呃,然后此外还有一些就是你可以不需要进入,有一些比较简单的修改,对文本的修改,你可以不需要进入insert模式,只在normal模式下就完成它,比如说啊我们在左边可以看到。
就是有一个按S可以删除当前字符,然后再输入,我不知道大家能不能看到我的鼠标,我我我切一个激光笔,激光笔啊,这样会更明显一些啊,就是左边可以看到S小写S在呃,对在normal模式下。
按小写的S是相当于是删除当前的字符,然后再进入insert模式,但是等价的有一个就是按X按小写的X,那它的按X这个操作就是它只会删除当前字符,然后不会进入insert模式,然后类似还有一些其他的按键。
就是可以让你更快的就是不用进行模式切换,就进行最简单的一些编辑操作,然后还有一个replace模式,就是按大而进,replace模式它主要是用于长文本的替换,这里呢我也就没有详细介绍了。
因为它确实不是一个很常用的模式,一般我们最常用的模式还是insert模式,就是用来编辑文本啊,OK接下来就是呃接下来要介绍的就是visual模式了,就是WM里的选择文本。
首先呢VIVISUAL模式它的这个visual模式下,它是说呃你按那个刚才的移动键,就是包括这个上下左右键,以及刚才的在normal模式下的,那些高级的移动键呃,用这些移动键去移动光标。
然后光标所移动的这个道路上会框选住呃,移动的道路上会框选住这个所有经过的文本,就是你移动光标就可以框选文本,就这么简单,然后进入威慑模式也有三种方式,第一种是小小写的V进入V呃。
小写的V代表的是进入微show模式之后,我们是就是按照现在最常呃,现代文本编辑器中最常用的那种框选模式,就是移动光标经过的字符被选中,然后如果你按大V进入维修模式的话,相当于是光标经过的行整行都被选中。
然后如果是CTRLV进入的话,那它就是光标所经过的列也被选中,呃它是一个列选择模式啊,对呃接下来呃就是在选中之后还处在visual模式,这个时候你可以有两种选择,一个是按Y按Y表示我复制选中的内容。
然后按Y之后,这个visual模式将退出回到normal模式,然后剪切D也是同理,D也是同理,然后就是在你复制或者剪切完之后,你可以就回到normal模式了吗,在normal模式下再去按一下P。
就可以在当前的光标位置进行粘贴,OK所以就是我们可以看啊,就是其实呃我们可以稍微比较一下vim的操作,和我们现在文本编辑器的操作,现在文本编辑器如果我想复制一段话,到文本的开头,我是不是就是框选住。
用鼠标框选住一段话,然后按CTRLC,然后再把用鼠标点一下开头,然后再用CTRLV,然后如果你不想用鼠标也可以,你就是用上下左右键去,先先移动到你想框选的位置上,先把它框选住,然后CTRLC完之后。
你可以按一下home键或者Ctrl home键,可以回到整个文档的开头,然后再按下CTRLV进行粘贴,然后但是在WM里面它是怎么操作的呢,你首先需要呃把光标移动到呃,在normal模式下。
把光标移动到你框选的开始位置,然后进入visual模式,然后移动光标,直到你把所有的想copy的文本都框选下来,然后再按一下Y,然后再退回了normal模式,在normal模式下。
你再移动光标到文本文本的开头,这个时候你再按一下P,这个是我们刚才的CTRLC和CTRLV的全部过程,是这样的,所以WM它相当于和呃,我们平时的这个操作的一个最关键的区别在于,我们平时的快捷键。
其实都是通过一系列组合键,来实现它的复杂性的,而WM它的复杂性都在于这个状态机,就在于模式之间的切换,所以你会看到就是WM的熟练的使用的人,就是熟练使用win的人,他们经常会把ESC敲烂。
就是因为他们经常需要回到normal模式,以最常用的回到normal模式的这个按键就是ESC,好的嗯,然后最后一个win的状态叫做命令行状态,就命令行模式呃,这个命令行模式就是通过在normal模式下。
进入冒号去进入的呃,命令行模式的话呃,会在就是整个整个终端的窗口的最下面一行,显示一行,就是显示一行,然后这一行的开头是冒号,然后接下来你输出输入的所有字符,都会在冒号后面显示。
然后这后面的呃这一串字符呢就会被解析成呃,解析成你要WM干的指令,就解析成一个命令,然后最常见的命令有几个,接下来的命令是大家需要记住的,就即使你不对V不感兴趣,不使用为你也要记住这些。
首先呢是按W就是单个W,你敲完W之后再回车,就表示你敲完这个指令了,就是按回车表示结束你的指令输入,并且直接执行,然后你敲完W回车,就是说保存文件,然后W后面跟一下叹号,SODOT百分号。
它的意思就是用SUDO的权限去保存文件,也就是说如果你没有用SUDO呃,就是你没有以管理员,没有以root的身份打开WB,而你又编辑完了这个文本,你不想说退出再重新编辑的话,你可以用这个方式。
就是使用SUDO的权限,就是用root权限直接去保存呃,还有这三个是等价的啊,就是WQ小X,还有大写的ZZ都是保存并退出的意思,然后Q叹号和大写的ZQ表示的是退出,但不保存,OK应该是这些。
对上面这四条我觉得大家是需要记住的,就是你即使不用win,你要记住,这样的话你至少知道怎么保存,怎么退出嗯,然后接下来呢,后面后面的这些勇士是一些更高级的命令,然后这些的话就大家自己看就可以了,好吧。
嗯接下来我们就到这个vi visual studio code的介绍呃,首先我们要明确两个概念,那就是visual studio code和visual studio,这两个其实是没有什么太大关系的。
他们两个是完全不同的概念啊,visual studio呢它是一个功能更加强大,更加完整的一个集成开发环境,它有一套完整的工具链,包括呃编译器呃,链接器,然后以及调试的功能,调试程序,然后各单元测试。
所有的功能都集成在一个程序里,集成在一套软件里,这个叫做vs,也就是说你下载VS之后,编译器链接器调试程序,还有那些单元测试功能都是一并给你下好的,这就是为什么你安装vs可能会安装,一整天都有可能。
但是你安装vs code就不一样了,你可能222分钟就可以把它下完,然后安装完,这是因为VN vs code,它是其实就是一个就一个裸的vs code,它其实就是一个轻量的文本编辑器。
它只做文本编辑的功能,然后其vs code它其实更像一个浏览器,但vs你完全不能把它等价为浏览器啊,vs code你如果去打开它的那个属性的对话框,你可以看到啊,他这里有几个几个属性。
其中有一个这个chromium,chromium表示它的内核,它这个浏览器的内核,也就是说visual studio code,它所用的内核其实跟我们的chrome浏览器。
和我们的edge浏览器是一样的,呃然后V但是我们也会经常看到visual studio code,它也可以实现非常像vs一样强大的功能,也可以调试,也可以运行,也可以编译,这是为什么呢。
这都是呃这些就都归功于它的插件,就是vs code,它刚下下来是其实是只带,可能只带很少的插件,甚至是不带插件的,那然后随后如果你想去编译一下,比如说让v vs code去能够编译C加加。
或者能高亮显示C加加的语法,还有Python什么的,你都需要去安装这些extension,你需要额外的去安装,对包括语法高亮自动补全这些功能呃,刚开始是都是没有的,他其实刚下下下来。
你可以把它理解为它就等价于notepad,就是微软就是嗯windows下面那个记事本呃,Vs code,它也是一个高度可配置的软件,然后它的他的这些配置文件的都是JASON格式,JSON格式。
visual code studio code和vim不同了,就是它比win要好用的多,就基本上不需要上手吧,你就你只要会打字就能用,然后它也是图,因为它也是一个图形界面的这个应用程序。
所以它自然会有呃,一自然有这种易用性,OK之前其实我们已经有介绍过,就是远程连接SSSH命令对吧,然后应该也介绍过visual studio code里面,怎么去运用这个命令。
然后这里我也解释了,这里我我我PPT里也写详细的介绍了一下,怎么去呃,怎么去连接一个远程服务器。
用v vs code去连接,然后怎么去添加一个配置,然后让你呃。
让你在第二次以及之后更多次连接的时候,就不用重新配置了,就是你可以点一个选项就可以直接连接上,然后vs code,visual studio code它远程连接的一个好处就在于呃,你连上之后。
它会弹出一个新的窗口,这个窗口就好像是在你在远端服务器打,远端服务器打开的一个visual studio code一样,然后呃,它主要体现就在于左边那个文件资源管理器,里面,就是显示那些目录和文件。
显示的都是那个那个远程服务器上的,那些文件系统,所以就就好像你在本地一样去操作,但实际上你操作的是远程服务器上的内容,所以这是它的一个非常非常方便的一点,然后具体怎么做,其实也有讲,我我就我就跳过了。
嗯对,然后接下来可以给大家简单的介绍一下,威神vs code的基本的设置,还有它的一个多光标的一个小特性啊,就是呃它的设置的方法就是vs code,整个软件它的一个设置方法,通用的设置呃。
是在那个左下角的一个齿轮图标的,那个齿齿轮图标就是它叫做settings,你点击它,然后就可以呃,你点击它就可以进入到这样图片的一个界面,这个图片所示的这样一个界面啊,然后在这里面可以设置一些最基本。
最基本的属性,就比如说是tab字符的宽度,是四个还是八个还是两个,根据你的习惯,然后还有自动缩进,是否要自动缩进,然后是否要自动删除,行末的多余的空白字符等等,这些基本的编辑器的属性可以在这里设置。
然后这些设置也是可以多设备同步的,然后如果是更高级的设置的话,呃可能首先第一可能是跟可能会跟插件相关,那对于插件的设置,你要点到那个extension里面,然后选中那个插件,在插件里面有一个齿轮图标。
你在那个齿轮图标里去设置就好了,然后插件的设置以及vs code,在当前一个有一个工作区的设置,它都是通过JASON文件去配置的,然后在JSON文件里去指定它的每一个属性。
呃然后具体这个JSON文件的配置其实也是有很多,很多东西也也挺复杂的,呃大家可以就是我个人的建议,就是你遇到什么问题,就去网上搜搜对应的配置哪一条,然后嗯对如果想系统性的了解,可以去看那个文档。
然后还有一个小小功能,就是有一个多光标的功能,就是在vs code里面可以产生一下子产生多个光标,就是你的当前位置不只是一个位置了,可能是多个位置嗯,产生多光标的方法有两种,一个是按住鼠标的中键。
然后拖动一个矩形区域,然后你就会呃选中那个矩形区域,然后矩形所涉及到的所有的行,都会给你生成一个新的光标,另外一个产生多光标的方法就是按住Ctrl shift alt键,然后再按这个上下的方向键。
就可以往上或者往下一行产生一个新的光标呃,这个多光标的作用就是你可以同时删除,也可以同时插入,就比如说我在这个图里面,它呃呃这几行都是货对吧,都是按位或,我想把它们全都变成按位异或,我就可以多光标选中。
然后直接按一下异或就可以呃。
全都改一下子,全都改过来了,所以这里很方便,OK接下来我们就要进入到那个呃文本文本编辑,也就是文档的写,就是文档的写作,这方面就是前面的呃,代码编辑器的部分已经讲完了,大家有什么问题吗。
哦vim里面是叹号的意思,我这里有解释,我刚才没说,但是PPT里有解释,就是叹号其实表示一个shell命令的开头,就是W里面后面加了一个叹号,叹号后面跟的其实是一个效命令,然后其实你也可以不用加那个W。
就是你直接用叹号开头后面跟一个shell命令,它就会让他就是指他的意思,就是在shell环境下执行后面的命令,vs code有没有办法啊,一次输入多光标,多行下的一什么意思,WM大概要多久可以掌握。
这个我不清楚,因为我没学过,我感觉反正慎学好吧慎学,如果你是真的想追求极致的体验,极致的代码体验,那那可以用VM,但其实大多数情况下,我个人认为就是呃,你用普通的编辑器速度足够了。
这个我觉得你可能如果你想了解,就是WM怎么学,或者说要学多久,建议找一个vim大佬,我个人是不会用win的,不不不不熟练使用win的,按123的递增,多行的递增额,一次输入多光标下。
嗯对你的意思是就是多个,比如说我有三个光标,第一行的光标在第一个位置,第二行光标在第二个位置,第三三行光标在第三个位置是吗,这个呃这个我也不太清楚啊。
我不知道他能做到这个吗,就是你可能可以通过一些特殊的呃。
特殊的方法卡成这个位置,这样吧,我呃但他可能不太能做到,就是你每一行任意指定那个位置,就是多光标,每一行任意指定它的位置,可能还是比较难做到的。
呃我可以给大家做个示范,就是我先打开一个vs code,Sorry。
Ok anyway,嗯大家不知道能不能看到我的屏幕啊,OK可以看到我屏幕现在是个vs code,就是这个光标,它其实只是一个方便使用,它可能没有太大的任意性,就比如说我按中键,我产生了呃多行的光标。
然后在这个时候其实你可以做任何呃,呃按任何就是快捷键,你你把它当做一行来编辑就可以了,比如说我想全选整行,我就直接按住shift再按这个按键,就可以把这些行都选中,然后比如说我直接按住and。
我就可以把所有光标放到航墨,然后按住home就可以把所有光标放到行首,然后这样的话就可以实现,就是它的所有光标其实也不一定在一条竖线上,总之就是嗯你可以去这么使用,然后我还可以比如说我把它移到航母之后。
我再按住CTRL再按方向键,这样的话就可以让所有的光标都同时按照,一个单词,一个单词这样的跳跃的方式去移动,所以根据你的需求去做吧,他可能自由性没有特别大,没有那么大。
哦第一行输入一,第二行自动二,这个可能没有吧,这个应该是没有的吧,这个还是需要自己弄一下,就我我现在还不知道有这个功呃,有没有这个功能,我目前了解是没有这个功能了,一般遇到这种情况,我就自己手打了。
如果你比如说,如果你实在是一个要编辑,一个特别特别特别长的文本,你可以写程序去做,你可以写个脚本去改他的字符好吧,行嗯好嘞,嗯很好,我看到有个弹幕说,建议先在自己熟悉的编辑器里装win插件。
嗯是是是可以的啊,就是这样的话,你可以做到很方便的去拆卸这个WM,如果你用不惯的话,你可以随时回来,但是其实WM大多数情况下,如果你用的win linux的话。
然后windows里的WSL它其实都是自带的WM,就是你只要打开那个终端就可以,就可以用WM了,LINUX上用的多,是因为LINUX很多时候都不需要图形化界面,所以这个时候你用不了vs code。
你只能用V吗,然后刚才我所说的那个用vs code,SSH去远程连接服务器,应该也是要求你的那个远程终端也要装vs code的,不然也是没办法连的,OK我看可能大家没有更多的问题了,那我们就继续吧。
好吧。
呃接下来就讲的都是呃,就是文档的文档的编辑器了,其实他也不一定是编辑某个编辑器啊,它就是它其实是文档的编辑的一种语言,首先第一个是markdown,markdown它的图标是这样,就是一个M1个下降。
就是Mark和down很好记,markdown它的特点是,它的它是一个很简单的标记语言,非常简单,然后呃就是markdown其实是所有里面最易学的,我今天讲的所有东西里面最容易学的一个东西。
它其实甚至不需要学习,你就照着照着某个文档抄一两遍就会了嗯,第二个就是它是纯文本格式的,就是它的markdown文件,它的后缀名是点MD,然后这个MD文件它就是一个纯文本的文件呃。
然后walk down可以让你轻松的排版呃,在我们就是常见的就是用途当中,一般就是在GITHUB上的read me,就是都是用的markdown来写的。
然后WIKIPEDIA的这个页面其实也是用markdown写的,然后包括简书一些其他的也都用它,然后他其实还是一个你平时做笔记以及科研,科研记录进度的一个绝佳的工具,因为它特别简单。
它又不像latex了,它又不像呃LLTC一样,就是需要很复杂的,就是你呃比如说你想加一个公式,或者加一句话,或者加一个表,加一个图片什么的,不需要输入一长串代码,就直接加就行了。
直接加你的文本内容就可以了,所以markdown记笔记什么的,平时用还是非常方便的,呃教程有两个,第一个是官方教程,它是更系统更全面的,第二个交互式教程,大家可以在我PPT发下去的时候点进去看一下。
他其实非常有意思啊,就是呃它是一个网页,然后它会一步一步的指导你了解每一个语法,它会让你自己去输入那个语法,去了解它的它是怎么工作的,它的交互性比较强,OK呃然后哪些编辑器可以用markdown呢。
其实首先其实任何一个纯文本编辑器,都可以用啊,都可以去写一个markdown,但只不过是它能不能渲染的问题,你比如说用WM,用notepad其实都可以写markdown,它其实因为它就是一个文本的文件。
然后如果你用vs code的话,你需要装一下markdown的插件,然后才可以做到实时的渲染,就像这个图片里所展示的一样,呃另外markdown官方的呃。
就是有一个还有一个就是编辑markdown的一个软件,叫做type啊,这个这个软件应该是要付费的,这个付费呃,这个,但是这个软件它渲染出的markdown效果比较好看,然后他也是就是能做到呃。
就是怎么说呢,你就是编写实时渲染的,就是它还不是像vs code一样,左边分栏,左边是源代码,右边渲染,结果他是说你type a是你直接编辑,它就可以直接给你预览当前编辑的效果,就相当于是直接在一个。
直接在一个渲染好的地方,渲染好的上面去修改。
呃然后他的一些常用的语法就简单的过一下吧,首先是标题用井号来表示,然后井号的个数越多,表示标题的级别越低,就是他的他的级数越高,也就是说它它的字体越小的意思,然后还有一些强调,就是两个星号。
如果呃你用两个星号框住一段文本,表示把这个文本加粗,然后用一个星号框住的话,就是倾斜,如果又要加粗又倾斜,那你就用三个星号框框住它,就是两边各加三个星号,OK呃然后还有一些换行规则。
这个这个是比较重要的一点啊,呃就是它跟我们平时的编辑,比如说在word里的编辑是不一样的,呃,markdown里面他要敲两个换行才能是一个真正的呃,在才能在是一个真正的换行,才是一个真正的分段呃。
我们可以看一下下面源码的效果,就是如果你只敲一个敲一个换行,就是第一行这个啊,Sorry,就是第一行到第二行这个样子,就是他只敲了一个在源码里面只敲了一个换行,那么在渲染之后的效果呢。
呃它就是就是段落段落内的换行,就是这两这两个虽然它换行了,但是他还在同一个段落里,然而如果是你敲两个换行的话,它相当于是呃重新新开了一个自然段,然后对于有一些markdown的这个渲染器。
它它会直接忽略单个回车的情形,也就是说前两行它会直接并成一行,在渲染之后,然后呃后面一个语法是列表列表的方式,就是前面加一个短短横线,然后短航线就是代表着一个那个列表的开始符,就是那个这个小圆点。
然后呃在列表之后里面可以添加子列表,然后在列表里面也可以按照刚才的换行方式,敲两个回车或者敲一个回车,都是可以有这种效果的,呃对然后这里面是呃这里是缩进敏感的,大家要注意就是呃它识别你是二级二级列表。
二级列表的依据,就是说你二级列表的缩进比一级列表更靠前,就是缩进更更多,就是这样子呃,接下来是还有一个特殊的列表,是带复选框的,就是这种呃这种你可以点点到勾和取消点呃,就是你可以点击勾选它。
也可以取消勾选的这种呃复选框的列表,它的方法就是一个减号,然后空格再跟一个呃,中括号跟一对中括号,然后记住,如果说你想不选这个复选框,你要中间要留一个空格,如果要选的话,中间要加一个X。
Mark text是吗,我还没有听说过Mark text可以可以,如果有免费的版本也那那就更好了好吧,TAPA应该是一个比较官方的版本,它他其实以前也是以前也是不收费,以前也是免费的。
然后应该是近几年才开始收费嗯,对列表之后我们去讲这个公式啊,公式就是数学公式,公式的话一般是呃,用这个dollar美元符号去框起来,如果是单个美元符号框起来,那是行内的公式。
如果是呃两两个美元符号框起来就是行间公式,它的区别就是下面这个效果,这样行内公式就是在呃他不换行行间公式的话,它会强行给你换一行,让你这个公式单独处在一行,呃然后至于公式类怎么去打这个语法的话。
这个东西其实是呃latex的语法,就是呃接下来接下来这个雷tag应该会讲到啊,然后markdown还有一个引用的格式,就是它的效果是这样子,就是呃就是类似于你在文章中,比如说引用一段诗。
一首诗或者引用一段歌词,就这样的,或者说引用别的文章中的一个说法,一个一个一句话,他呃这样的一个效果,他的方法就是大于号加空格就可以了,然后如果多个太多,多个大于号的话,可以实现引用里面再加引用。
还有一个概念是块啊,就是markdown里面你可以输入代码块,如果呃代码块也分分为行,行内和行间就行内的话,你只需要用一个呃,一个这个斜点,这个符号就可以括起来就可以了。
这个斜点符号是在你的键盘的左上角,ESC的下面呃,大多数键盘的布局应该都是这样,就是在EC下面那一个,然后你不需要按shift打,打出来,就是这个符号,对,然后如果是行间的话,行间的代码块的话。
就是用三个这样的写点这个符号呃,然后这个代码块你也可以在呃,在其就是在前面这三个节点之后,去指定它的是哪种语言,比如说这里我就指定的是Python,你还可以指定是c#或者C加这样子。
OK另外一个常用的是超链接,markdown里的超链接,超链接就是的格式,就是用中括号括起来呃,你你想想你想对哪些内容去施加一个,去添加一个超链接,然后小后面跟一个小括号。
小括号里面是这个超链接所链接到的地址,它有点类似于,你在word里或者PPT里面去选一段文本,然后右键添加超链接,这个呃这样一个意思,然后只不过你那个右键选中的那个内容,在这里是用中括号框起来的。
这样讲应该大家都理解呃,然后除了这个链接到网页之外,还有一个锚点机制,就是比如说你在行呃,就比如说你在行内就是有一段内容,你想把你想把它变成一个可以点击的东西,然后点击之后会跳转到文本的另外一个位置。
那它的方法就是说,我我在这个中括号显示的内容,这个中括号的后面去跟一个中括号,注意这里跟的是中括号,而不是小括号,然后这个中括号里面是一个Mark marker,是你任意的一个字符串。
然后只要你在后面用同样的一个字符串,然后加上冒号呃,然后后面再指定那个跳转目标就可以呃,就可以把他们俩链接起来,就是所以其实他呃,他的意思就是说我这是成对的,我这里在呃在行内。
我会我会把这个显示内容框且用框框起来,然后后面跟一个Mark,后面我还需要定义一下,这个Mark跳转的目标是什么,然后至于这里跳转的目标呢,可以是像刚才一样一个网页的链接,也可以是某一个标题。
然后如果你想跳的是当前文档中,某一个标题或者子标题,任意以及标题都可以,这样呃,这个时候你必须在这个标题前面加一个井号,就是像这种呃marker冒号井号,TTITLE这样的一个格式。
这样的话你就相当于是呃添加了一个锚点,然后呃这个显示内容这这四个字,这就是这个框选的这个部分,它也会变成一个超链接的样子,就底下加个下划线,字体变蓝,然后你点击它之后,它就会跳转到。
就会把文档自动滚动到你这个呃,你指定的这个标题的的那个地方,呃另外还有一个插入图片的语法,插入图片和超链接是非常相像的,只不过在前面多了一个感叹号就可以了,呃感叹号呃,另外一个不同点呢。
就是中括号里的内容是它只是一个注释,有点像comment,这也就是说在它是在图片不可用的时候,就图片挂了的时候,或者说图片不存在的时候,它才会去显示嗯中括号里的这些文本。
然后如果你也可以把这个中括号直接滞空,然后如果图片正常的话,它就会正常的显示这个图片,这后面这个图片地址呢可以是本地的一个呃,目录,也可以是网站,就是网一个网站一个网址,对。
然后这里的话在markdown里面插图片,确实是一个问题,就是如果你想把它传到网上的话,很很有可能你需要把这个图片去,上传到一个图床的服务器上,就是说给你这个图片上传到某个服务器上。
然后给你这个图片生成一个固定的网址,然后你在这个小括号里填上那个网址就可以了,嗯但是比如说对于GITHUB的那个read me的话,read me里面你要插图,其实就不需要这样操作。
你直接不在后面那个地址,填一个相对路径就可以了,然后是目录,就是如果你想给这个文档插一个目录,你直接在那个地方加一个中括号,TOC就可以了,呃还有分隔线是三个星号表格对,然后一个比较重要的也是表格。
这个表格也会比呃LANTIC里面要简单的多,就是它的方法就是这样,你你手打一个表,手搓一个表格出来就好了,然后大概就是现在我PPT里展示的这个样子,它就对应于下面这样一个呃也一个表格。
然后这里面有个细节啊,就是第二行它会指定,就是你看第二行它有冒号和减号这几个字符,它其实指定的就是,你当前这一列是左对齐还是中对齐,还是右对齐呃,左对齐还是居中还是右对齐,然后这里也不难看出。
如果是左边只有左边有冒号的话,是左对齐,只有右边的是右对齐,两边都有冒号,就是居中,ok markdown呃,这这里就是markdown的全部内容,然后我们接下来再讲一下LTC。
我呃我我这里一直在读LTC,是因为我最近查了一下这个发音,我之前其实都是很习惯读它了,TX或者LTX,但是实际上呃,当这个这个词专指我这个文本编辑器的话,呃我专指我这个文档工具的话。
它的读音是LT就后面那个X只发一半的音,呃这个具体的话可以去找那个创始人,他的那本书可以他有一个介绍嗯,latex就是这个单词,其实还有一个意思,它叫做它应该是乳胶的,意思就是没有大写啊,全都是小写。
那他当他表示乳胶的时候,它的读音就是latex,他有这个X是正常发音的,但是当它在我们现在这个语境下,它就应该读成LTC,然后但是这个不重要了,你只要大家都明白,你随便怎么发音都好呃。
latex它的主要的特点就是它是一个很高效,也很高质量的排版系统,它所生成的文本一般来讲会比markdown的要多呃,要要专业的多呃,一般来讲就是你发paper什么的。
发paper甚至出书他都是用LILLATEX写的,不会用不基本上不会去用markdown写,markdown相比于他来说还是更随意一些,但是雷泰克它有一个缺点,就是它需要编译。
它不像lock markdown一样可以及时渲染,就是markdown有点类似于我及时解释,然后它是很清亮的,就相当于是一种mapping,就是字符串之间的mapping一样的一样的简单操作。
但是LTC不一样,latex它是类似C加加这样的一种语言,它是你把这个整个代码写好之后,它需要编译你这个代码,然后从而转化成PDF的输出,latex它也是有很多很多的红包的,就跟正规的编程语言是一样的。
都是需要各种外部的包的,然后这个红包也是可以开发的,也也是可以,你你你也是可以自己开发的,然后这里我们有也有一个LTC的官方文档,大家如果就是遇到很详细的问题,可以去搜一下呃。
至于LTG一般用什么编辑器呃,最常用的还是overleaf,overleaf就是呃一个网站,它是3W点,overleaf点com这样一个网站,啊对,然后这个网站呢,它其实就是一个管理你所有LT文档的。
一个一个网站,一个服务器吧,然后每一个文档你其实都可以添加合作者,然后这些合作者就都可以就是协同的在线编译,就有点类似于现在的腾讯文档,它是实时的编译的,就是你现在敲一个字啊,你协同的人如果在线。
他就可以立马看到啊,而且要网好啊,当然然后嗯LTC还有一个比较方便的点,就是它有很多的模板可以使用,这里我可以给大家展示一下PPT,没有涉及到,我可以告诉大家这个雷tag要怎么,怎么去找他的模板。
OK呃就是你进入到overleaf主页之后,你登录之后,它会直接到你的这个project页面下,然后你点呃,上面的上面这一栏的那个templates就好了。
然后你会发现有很多很多的模板。
包括书啊,还有那个文章,还有引用等等等等。
呃如果你想搜一个,比如说我我也不知道能不能搜到,我随便搜一个CVPR的模板,文章的模板它理论上是可以搜到的,你看每一年的呃都是可以搜到的,然后点进去就可以了,你可以你可以直接open。
然后然后把这个把这个存下来保存下来,它其实你open之后它会自动存下来,然后你接下来改个名什么的,然后呃它渲染出来是这个样子,接下来也就呃改一下对应的,比如说作者信息。
还有你的正文信息摘要啊等等等等就可以了,所以这个还是非常方便的,对,就是你你会发现我这个已经多了一个这个,CVPR的文档,就是你刚才只要打开它会自动给你保存下来。
行,回答的事情OK另外一个这个编辑,另外一个写latex的编辑器呢是vs code,也是vs code,但是同样的,你还你也需要安装那个Lt text live的编辑器,还需要配置编译环境。
然后你的vs code里面也需要安装对应的插件,这样才能呃才能这个充分的利用起来啊,就是我个人还是推荐使用overleaf的,只要你网好,嗯latex latex的一些常用语法呃,我这里也介绍一下吧。
首先是它的一个基本的框架,就是一个最简单的文章的一个框架,是什么样子呢,他首先要用document class来指定一下呃,文档的类型,比如说article,这里可以是article。
然后如果你要文章中要中文的话,你需要换成这个c tax art,然后呃LTC里面像一般的编程语言都一样,呃和编程一般的编程语言都一样,它也有这个注释,行注释的话。
就用那个这个这个叫什么百分号开头就可以了,嗯接下来接下来就是跟着的就是一个begin document,就是进入document的这个环境,在document里面才是你真正的想要显示的内容,在呃。
包括什么图,就是所有的文本图片,表格标题什么的列表,所有东西都在document这个环境里呃,去输入,有点类似于你C加加里的main函数,就是你真正要执行的代码都在这个环境下面。
然后在document外面是什么呢,中间有一个导言区,导言区的意思就是有点像呃Python里的import,或者说是C加加里的include,就是说你要包含哪些红包。
然后也也有一些predefined的变量,就比如说作者作者的名字,然后还有你可以去在latex里面去定义一些呃,command就是一些快捷的命令,然后定义command的方法。
就是用new command这样一个指令去定义,所以导言区就类似于引入红包,然后声明全局变量有点这个意思,好的,接下来是标题和章节怎么去做呃,现在我因为要用中文。
所以这里换成了document class,换成了c tx art,然后添加标题的话就是title斜杠,title指定这个文档的标题,然后接下来是这个,author就是指定他的名字呃。
只指定这个作者的名字,然后接下来还可以指定一下它显示今天的日期,当然这个我我我这个,我截图是比较早的一个截图了,所以日期是很早的,大家忽略这一点就好,你呃但是你在呃你在编辑的时候。
你用这个斜杠today表示的就是今天的日期,嗯然后接下来呃,但是呃这里你要注意,就是我们现在只是在导言区定义了这个文字,和定义了这个文档的标题和,作者的名称以及日期,但是呃它并不会让它显示出来。
你要真的让它显示出来,得在document这个环境里面写一个make title,好,这个make title就会把刚才你在导言区域,定义的所有东西打出来,呃然后如果你想开一个新的章节。
就用section,如果是新的子章节,就是subsection,这就类似于markdown里的一级引号和二级引号,这样子嗯对然后还有以此类推,Subsection。
下面还可以有sub subsection,但是应该最多就到sub subsection,在在之后就嗯,在之后就理论上不应该再分更细的章节了,如果你想再分的更细的章节的话,你可能需要用一些其他的。
比如说字体加粗加粗的方式,但是LT的这个允许你应该就只允许你做,做到subsection这这么多呃,后面的话再往后其实还有一些类似paragraph,就比如说呃一个段的断手。
你可以用那个斜杠paragraph,来来指定那个断手的一个小标题,呃是这样的,然后类似于markdown latex里面也有列表呃,如果像markdown里那种圆点的列表的话,你就用这种items环境。
就是begin itemize,然后每一个条目都前面都需要跟一个呃,就需要加一个杠,斜杠item,然后如果是以数字开头的列表,就换成enumerate就可以了,然后这里面还有更多的样式的调整。
也可以点击这个链接去看一下嗯,latex里面也可以去插入公式呃,你像这种begin equation and equation,其实就对应于markdown里的那个双引号括起来的呃。
公式它就是行间公式嗯,然后行内公式也是和markdown一样,就是用一个单引号就可以用,用一个单引号括,用一对单引号括起来就可以了,然后latex其实也可以不用这种equation的环境。
你可以也可以像markdown一样,用双引号括起来一个公式,它也可以变成行间公式,但是和它的区别就是呃,equation会给你带一个后面的label,然后如果是用双引号括起来的。
他就不会给你带那个label,嗯然后还有一些更高级的公式的方法,就是一些更高级的公式环境,比如说你如果想写多个等式并列的写的话,可能需要用line环境,line环境就是说呃它可以让你指定就是多行公式。
并且可以让你比如说只对对齐等号,或者对齐最左边或者对齐最右边,这些都可以设置,然后呃如果要用这个环境的话,你应该是需要加一个这个a s a m s max包的,然后这句话use package。
这句话就放在刚才所说的那个导言区就可以了,好creation,嗯这里面我我我这里还讲了一下,就是引用的问题,就是呃比如说如果你想引用一个公式,那你就在这个公式的这个环境里面加一个杠。
label这样的一个呃这样一句话,然后label后面表示的是你这个引用呃,就是相当于声明的一个变量,这个变量所代表的就是这个公式,然后你接下来想去引用这个公式的话,就在行间使用这个斜杠呃。
而呃rap rap它是reference的缩写,就是rap,然后rap后面那个大括号,写同样的这个变量名就可以了,呃这里这个这个代码其实就是个例子啊,在这个括号里我引用了这个呃这个公式的label。
所以在这一行里面,这个label所对应的就是一,然后在生成PDF之后,你也可以就是点一下这个一,它就可以自动跳转到呃公式所在那一行,还有就是LTLT里面插入图片的方法,就是用这个figure这个环境呃。
你当然可以直接插入图片啊,就是直接使用include graphics,然后中括号里面写的是参数,一般就是用来指定这个图片的缩放,比如说是0。7倍的text wise,就表示我的图片的宽度。
就是我把图片缩放到它的宽度,等于0。7倍的文本的宽度嗯,然后后面大括号跟的是图片的文件名,如果你在overleaf上插图片插图的话,你需要在overleaf这个项目里面去导入这个图片。
然后呃这里的路径也就是overleaf项目里面,那个图片所对应的路径,如果是本地的话,这个路径相当于就是一个相对路径,你也可以只是这个绝对路径,呃但是我们一般不会直接用include graphics。
去查图,因为这样的话他不会有,比如说标题以及对图片的引用,这些都不太行,然后包括我们想控制图片的位置也也也很难,所以一般插入图片,我们都会把它放在一个浮动体里。
所谓的浮动体其实就是这个figure环境呃,然后我们就看这个代码就可以了,这include graphics放在这里面,然后他还有一些其他的选项,比如说居中,Century,表示。
我想把这个图片放到整个文档的居中的位置,然后还有我可以加一个caption,就是标题呃,然后后面我还可以像公式一样去加一个label,然后后面我也可以通过和同公式一样的方法,去引用这张图片。
然后我们还注意到一个细节,就是在begin figure这一行之后有一个中括号,中括号里面有HTP3个字母,这里表示的是H表示的是here,就是我希望让这个图片尽可能的放在我呃,当前的位置呃。
T呢表示的是top,就表示我希望这个图片尽可能的放在文本文呃,这这一页的顶端,然后B就是bottom底端的意思,然后还有一个P这里没打,他还有一个P的话表示的是a page of float。
也就是说图片单独放在一页里面嗯,这里呢其实这个中国号给他的是lettuce,是其实是给LT一个排版的建议,就是说你优先去考虑能不能放在here,放在现在当前这个位置,如果不行,比如说图片太大了。
不行的话,那你再去考虑能不能放在某一页的页手,就是叶顶端,然后再不行的话再去考虑放液底端,然后再再不行的话,再去考虑其他选项呃,但是这其实也只是去给latex的一个建议,他有的时候在一些情况下。
他其实是不会采取你的建议,他会直接忽略这些呃,如果你想坚持的话,想坚持你的想法,就是想强烈的建议他,你可以在这前面加一个叹号,如果但是这个时候,内tag还是有可能忽略你的建议呃。
这个时候如果你想再坚强的表,强制,再坚强的强制他安排,这个图片放在当前位置的话,你就可以用这个大写的H中括号,大写的H来表示,然后这个强制强制放图片位置的这个做法,其实一般是不提倡的。
然后latex的宗旨也是嗯,尽可能按照LTX他自己的呃,按照LTC那个编译器的审美,不要按照你的审美去排版,因为如果你按照你自己的审美去排版的话,很可能会去产生大量的空白,然后导致不美观。
然后我们一般都是按照LTC的这个,latex的这个习惯,去LTC他自己的习惯去排版图片就好,好然后图片之后是表格,表格也有和图片一样的,就是这个安排位置的方式,你也可以用中括号去建议他放在哪里嗯。
对然后表格的方式,这里的表格的话,可能就会比那个markdown里面要难一些,首先我们可以借,就是先先去生成一个最简单的表格呃,最简单的表格就是在中间这个tabular,这这一段里面。
我我生成一个四元的表格,就是一行只有两个字母诶,只有只有两个项目,然后呃它是在tabular后面,会跟一个大括号框起来的cc,这两个C都表示的是居中的意思,对啊,就是说当前列都居中。
当前列列的内容都居中,然后两个C就表示两列都会居中,然后还有这个字母也可以替换成L或者R,L表示左对齐,R表示右对齐,很好理解,然后接下来呢这个怎么去排版这些格子的内容,就是呃就是说你先输入东西。
然后如果想切换到同一行的下一个格子,你就加一个雨,加一个这个雨的符号,然后再输入第二个格子的内容,如果你想换行的话,就用这个双斜杠,双反斜杠就表示换行,换到下一行,再用同样的方式呃,输入C然后再加个雨。
再输入D,这样的话我们就生成了一个2×2的表格,AB和CD呃,但是这样的表格显然非常的low,他什么都没有对吧,我们想如果想添加竖线的话,就在那个tabular前面,那个C和C中间去加一些竖线。
就表示我表格的这个行间是是由竖线分隔的,然后如果要横线加横线的话,就是你不仅要换行,你在换行之后,你可能需要一个哦,对你在换行之后,你还需要加入一个单独的行,就是斜杠h line。
然后h line之后再换行,这样的话才会在行与行之间去添加一个横线,然后这里我们要注意啊,就是比如说我现在在我这个换一个比,如果我们在这个这个这个地方,就是A和B和C和D中间加一个这个杠,H line。
哎呀不好意思,在这个地方我就不写了,就是在这个地方加一个h line,然后呃,它只会在A和B和,C和D这两行之间加这么一条横线,然后上面和下面其实是不会加的,如果上面和下面还要加的话。
你必须要在A和B的前面也加一个h line,然后C和D的后面也加一个h line,然后这个东西应该就是,呃latex的表格,它应该还会有很多很多其他的选项,也有很多其他的排版,高级的排版方式。
然后这样的这个东西你们不用愁你,我这里有一个工具,就是excel to late,你可以点进去,它是个网页,你可以直接在那个网页去,你可以上传一个excel,或者或者说你可以在网页上。
直接去手动编辑一个表格,然后它可以自动给你转化成latex代码,然后你复制到复制过来就好了,呃然后最后应该这应该是最后一个了,就是LTG的最后一个语法是论文引用呃,论文引用的方式呢。
就是一般它会采用这个BTEXT的格式去引用,你需要做的事情,首先是你在这个LTC项目里面,添加一个点BIB的文件,这个点BIB文件就是BTX的,就是存有beef text格式的所有的文献的引用。
把所有文献引用相当于列个清单,在这个文件里保存下来,然后你在正文当中呃,先去你在正文的就是刚才不是有一个document,就是document的环境吗。
你在document的环境and and document环境之前去,也就是说正文的最后的地方去加上这个引用呃,加引用的方式是首先去用这个bibliography style。
去使用指定它的引用的风格呃,然后去,嗯然后然后在之后去使用那个bibliography,bibliography这样一个命令,然后呃后面的大括号跟的,就是你这个BB文件的文件名。
注意这里的文件名不要加那个后缀名,然后这个文件名的话就是指定你用哪个呃,big text文件去作为引用的,这些也就作为引用库吧,然后接下来你只需要在行文当中去加呃,如果在行文当中需要引用某一篇文章。
比如说要引用爱因斯坦这篇文章的话,你直接在那个地方输入斜杠赛,然后在里面写这个爱因斯坦就可以了,然后这个爱因斯坦这个词呢就是每一个BBTX,每一条BBTX它都是遵循这样一个格式。
然后它的格式中的第一个参数呢,就是你set后面跟的那个字符串,然后后面这个其他的参数会指定他的文章名啊,作者名,然后哪些哪个journal上哪个哪一页哪个号,然后年份等等的信息。
都可以指定在这个bb text里面,然后如何去就是如何去找到这种一个文献的,beef text是什么样子的呢,你可以在谷歌学术上面去呃,找到一个条目的这个引用,然后点一下它会弹出来一个这么一个对话框。
然后对话框里面你再点一下这个BBTX,它就会弹出一个页面,然后页面里显示的就是它真正的BTX的格式,就是你直接复制到你的BB点,BB文件里面就可以了,呃然后呃但是想要要注意的是。
就是谷歌学术里面的这个格式,可能包含的信息并不完全,有的时候你直接复制它是不太可信,是是不够的,就有些文章他可能这个信息不完全,然后这个时候你可能需要找到这个文章,他他作者的主页。
然后去找作者主页里面那些他的publication,去找他那个作者自己写的那个那个B不text格式,O这应该就是今天所有的内容啊,对于后面这两个就是markdown和LTC。
大家有什么问题也可以来提问一下啊,对啊markdown和latex其实打公式的语法是一样的,就他们其实都是他们的格式,应该都是text math,都是text math,就是其实这个公式这个事情。
最开始markdown是不是不支持的,但是markdown其实是加了一些扩展,才能够支持latex里面的数学公式,所以他们数学公式其实就是一样的,语法就是一样的,放figure就有点太麻烦了。
而且在很多时候放figure也不不规范,所以最好还是手打一下攻势呃,其实这个东西公式这个东西你用vs code的话,它会有一个就是有一个作弊,作弊版,叫什么snippet panel。
它会告诉你那那个公司里边那些符号都怎么打,typist应该也是一个哎我我其实没用过tape,我不太了解,ti它也是,也是一种新的语言是吗,他好像是类似latex的语言,我我我确实没用过,可能很方便吧。
之后我也了解一下,但各位记住,我觉得现在啊最最最主流的会议,你想投会议什么的,还得是用latex排版,他们一般只接受用latex或者用word排版的格式,用其他的可能就不接收了。
哦只需要类似markdown,那那还挺方便的,对大家一定要注意,就是正规场合一般都是都是要用LTIC的,投会议他一般会有要求的,就是不是你随便编辑一下,一个PDF就能交上去。
包括你甚至你挂那个r cave,就是呃大家应该知道archive吧,就是可以搜那个archive点com去上上那个ark网站,啊sorry,是ark arcad,点ORG,2KD点ORG。
然后如果你想把一个文章,传到2K点ORG的话,其实是很麻烦的,就是他不接受直接传PDF,你必须传一个一整个LTC项目,然后他帮你,他帮你去,他帮你去编译它,然后它它的编译器还经常出问题。
所以传2K也是一个很复杂的事情,是一个很麻烦的事情,所以说这个就是为了提醒大家,就是很多正规的场合,他都是要求用latex的,可以传PDF吗,好像不行吧,我记得我上次传过一次,然后还没传上,很复杂。
就不是很复杂,很难用,好看点,ORG这东西,就是其实就是一些没有正式发表的,你你可以先提前挂到RCP上,然后让所有的学界的所有的同行看到,这样的话相当于你占了个坑,就不会让大家冲题了。
就是不会出现冲题这种尴尬的事情,啊word可以生成PDF,是但是呃就是word这个东西,怎么我怎么说他呢,哦其他就哦这个意思,其他制作方法可以传PDF,OKOKOK谢谢谢谢你。
这个我也是第一次了解word,也没有说不规范,其实呃就是有一些有些会议现在还是接收word的,就接受word编辑的PDF的,但是嗯word它并不是你想象中那么简单,它可能需要很高级的操作。
有的时候word也需要写一些脚本才行,然后word它涉及的用法,涉及到这种高级的用法,可能就要比LETIC要难多了,要复杂的多了,和发表之后那些出版商下载要钱的不会冲突吗,你指的是什么呀,你指的是什么。
发表之后paper吗,paper的话一般是这样,就是archive是这样,就是一个你正在研究的东西,你不想被别人呃,就是你不想让别人跟你研究的重复了,就说明说明你是第一个研究他的。
所以你就先提前把你的那个paper挂到ARCAVE上,可能你想投某个会议,但那个会议的DDL还没有到,你还没有去投他,你可以提前挂到r cave上,表示你要你,你正要投了,然后其他的人想做这个。
想做这个问题的人,就先先停一停吧,因为我已经做掉了,你们就不要再抢了,大概是这个意思啊,Ok arcave,这个事情我不多说了,我都说了,我怕我说错,因为我个人也没有用太多ARCAVE。
然后呃这个事情如果大家感兴趣的话,可以自己去了解,我怕误导大家,因为我个人也没有用太多这个东西,然后我们的作业今天也是没有作业的,然后我呃下我我我我自我的,下一次作业会在最后一次课给出来,然后最后。
所以那次作业,可能大家就只有一周的时间来做了,如果如果是需要延长的话,那可能大家在群里提一下吧,如果大家需要延长的话,在群里提一下。