粉丝2490获赞3659

这节课我们去讲一下这个 power 的一个简介,安装及 power 与接粒子的一个接口文件的一个设置。 首先我们先嗯把这个 power 的一个一个优点,我们在这里说一下, 那 power 为什么就是说现在越来越多的人喜欢用 power 写 g s 教文,他比 c 线的话具有一定的一个优势。我们现在在这里就是讲一下,因为 power 的话他 可以提供一个很好的界面,在这个界面上可以显示一个中文, ccl 也是可以显示这个中文的,但是他, 嗯他显示中文的话,他必须要做一个图片,嗯,这个图片的格式是点 s p m 啊, s b m, 他用这个图片的话有 c 需要的话,他调用 就是非常慢,所以的话这个 pa 的话就是说直接可以写的,你在这个程序里面判断的话,他也可以用这个中文直接去传单,所以的话这个 pa 这是他的一个优势。 还有一点就是 part 他运行的这个速度啊,速度比较快,然后读取这个速度也比较快,写入这个速度他要比 c 需要快的很多。 二的话它还可以跟这个数据库嗯相连,比如说把一些数据可以储存在这个数据库,比如说这个储存在这个 master, 嗯,也可以直接从这个数据库里面搜取这些数据, 嗯,这就是说,呃,他比需要他具有一定的优势。还有就是块可以自发自动发邮件,就说你写程序的话,或者遇到一些 bug, 或者 遇到一些错误的时候,他需要提醒的话,如果需要自动发邮件的话,可以可就是说这就是 par 的一个优优点,就是 park 可以去实现这样的一个功能, 这个 pro 的话也可以拥有不同的操作系统,你在 windows 里面可以用,也可以在嗯, univers 里面可以用。不像现在有很多人他用那什么英语,那还有那些什么微信去写的话,他只能在 windows 里面用,但是你换一个操作系统他就用不了了。 这一 part 它具有嗯,很多的一个优点,所以现在越来越多的人他就喜欢用这个 part 去斜接脚板 啊。我这里的话就是说我这里的话,呃,已经提供的有这个安装的一个安装的一个程序,但这个这个安装的话就是说可能版本 比较老一点啊,你们也可以自己去下载一个比较最新版本的一个一个 pro 安装程序。这安装的话就是说我在这里就不演示了,你直接点运行,直接点下一步,下一步就行了。这个非常简单 啊,我们就装好了以后我们要去查看这个,查看这个我们装的是哪个版本,我们这里就要选一个指名叫 bur 杠 v, 你们可以去演示一下。就说我现在这台电脑里面装了一个装的炮的一个版本是多少,你就输入一个炮尔康威 啊,回车就行了。你可以在这看,可以看到 this is part, 这是一个五点八八一个版本,这是它一个版本。好,如果你用这个秘密查看的时候,它出现了这个东西的话,就 说明你的电脑里面已经装了这个 par, 如果他没有出现这个的话,就说明你的电脑没有去装这个 par。 装了以后就是说我们看能不能运行这个接你的脚本,就是说有没有装成光阴,能不能运行,我们就是说运行一个程序就行了, 我这里就是说把,我这里也是提供了一个提供了,在这里面提供了一个程序二的话,这里提供了一个,有三部一个程序,我把这个程序 放出来,到时候我把这个程序放在这啊,这里我已经放了啊,让我放在这,我们在 js 里面去运行一下,如果能运行这个程序,说明你这个伴的话就,呃已经装成功了,也可以这么说,我们打开这个 id 操运行呃, par 的程序的话,我们去调试的话只能用 run, 不能用 bug。 呃, bug 的话只能调试这个 c c 二的一个程序,所以我们在这里只能点这个 run 啊,我们选择这个程序, 好,你点 ok 运行,看他能不能运行,如果能运行的话就 ok, 好能运行了 啊,这就是程序正在正在运行, 这说明我们安装了这个执行软件可以执行了。 嗯, 我给大家就是说推荐一款,比如说程序的一个编辑一个软件,以前是学 cc 的时候,我们都推荐了,就用的那个 id, 它用的那个啊,但是,但是的话,自从我用了这个软件以后,我就喜欢这款一个软件,因为它它有它的一些优点。 嗯,我简单的给大家去介绍一下啊,在这个文件夹里面,比如说我就和这个视频会一起放的,有这个软件放的有这个软件, 大家找找这个不需要安装的,找放到你的电脑里面直接打开就行了。 我们简单的说说他的一个优点,就是说,呃,你要去查看一些相同的一些东西,就是说你就双击一下,把相同的东西全部都给你显示出来了。 我觉得这一点有时候比较好用,比如说你写程序的时候,有时候我要把这,把这个,把这个规的改成其他的,嗯, 所有的都改成其他的,你就可以双击一下,也可以查看到哪些有这个单词。这是我给大家举的一个例子。还有个还有的话,一个好用的,就是说他写这个程序的时候他会有这个,有这个,有这个线, 就是我们为为就是写程序一般都说我们要会对的很整齐嘛,就说这里就用了一个 one, 那么这里,呃这里就有 有一个结束的,有一个结束的话他他这里就有一根线,这样对的很整齐,这样就可以增加我们程序的一个阅读性,我觉得这这一点是非常好的,这点是非常好的,也非常好用的。 嗯,还有的话就是你当你写程序的时候你就会发现,你就会发现当你按一个括号的时候,他就会出现两个括号,你可以少输一个括号,这也是很好用的。比如说我输一个大括号,他就会出现两个啊,你就可以少输一个。 挺,这个挺方便的,就是说你可以去试着去用一下啊。接下来我们讲一下这个 par 与 js 接口文件的设置,就是说 js 要想把 park 去,呃,用 park 进行小本的话,他就是有要需要有一个接口文件, 这个文件的话就是你装接力器的时候他他会自带的,他这个文件放在哪里呢?他这个 api 文件是放在哪里呢?他有一个目录,就是说你接一次看你装在哪个目录下面,然后下,呃,目录下面有个版本号 啊,版本后下面有个 word, 然后有个 par, 然后有个 g s 点 p m, 这个 g s 点 p m, 就是这个 g s 与 par 的一个单口文件,也就是一个 ip, 一个 ipi 文件,就是一个一个应用的一个接口文件。 他在哪里呢?就是我今天是现在装的 f 牌呢, f 牌下面有有个戒指,戒指下面有个版本或者一九二版本,你打开一九二,一九二下面有个 w, w 下面就有一个炮,有一个炮。 嗯,这个这个文件的话,这个文件的话介意是点 tm, 就是说介意思和 part 的一个 ita 文件应用的一个单个文件, 我们用这个编辑器去打开这个文件去看一下,这个可能你打开的话也看不懂,就是也没必要去看看。你只要知道这个文件,只要知道这个文件是一个 ipa 文件,一个机票文件就可以了。 它这里面这个格式定义了一些,呃,一些一些应用的一些格式 啊,还有一些一些一些变量,一些一些变量,如果有时候需要改的话,就是你运行报错的话,他会提示你这个文件哪里报错的话,你可以打开这个文件相应的去调试一下,看哪个地方 需要改的。一般情况下是不需要改,如果公司的话可能有些特殊的要求,或者有一些特殊的配置的话,也可以进去改。这么简单。 不是要想运行这个 janic 点 p m 这个文件的话,就是需要我们需要在写这个程序的时候,开头要调用这个文件,就是怎么去调用的呢? 啊?不过这也是一个写写字叫做一个固定的一个一个用法,就是说 used 不 used, 不,然后这是一个目录,你接一次版本的一个目录物,然后把把这个, 把这些话加进去,然后在下面再加进油脂接力这个他就会自动调用你这个文件包,自动会调用 这个文件包,我们去看一下是哪个文件包,就是在你装的戒指下面,版本下面,嗯, word, 然后下面一个 g s 点 p m, 它是一个文件,一个文件包它就会调动这个文件, 我们打开这个文件里面看一下,他这里就调用到另一个,调用到另一个文件,就是说在这里面还有一个接力时间 p l 接力时间 p l 文件, 也就是这里有一块,就相当于这项里面的 shot, 他把这个文件的内容就是调调呢,调用过来,我们看一下 gs 定 p l, 这一次点 p l 的话,这里面的话就是对对这个,对这些什么 c o i 嘛, i u x 啊,用户啊,都用户对它进行对对这些 pose 啊、帽子、冰箱一些,对这些指令, 对介意思系系统的一些一些命令就有一个定义,就是定义好了以后我们才能用,所以的话这些命令的定义就是在这个介意思点批量里面去定义的。 这个文件其实是奥奥宝,奥宝他们已经写好了,我们就是说调整这个文件 就直接可以去用这些产品了,你看这个 pose 他在这里就静音了,这个帽子他也在这里静音了, cym 也在这里静音了,静音好了以后我们就可以用,所以在写程序的 的开头,在写程序的开头一定要用到这一到,一定要用到这两句话,哪两句话呢?就是 usually, 包括这个接力程序, 把这把把这个,也就是说把这个文件去调用过来,调用到你的程序里面来调用到这个 ipa 文件,这样的话,这样的话就实现了 ts 和 par 的一个一个一个串联,一个串联 啊。我们去解释一下下面这个呃,这几句话的意思是什么?就是写程序的时候开头那这个东西的话,就是说你开头告诉告诉这个程序是用 part part 去写的,这个程序指向 普洱庄的一个末路啊,这句话的意思就是在上面这句话加了一个 w w 的话就是一个警告,就是说你执行程序代码的时候,他会如果你出现错误的话,他会警告你。所以我们开始去学程序的时候,我们在写程序的时候一定把这个把这个呃加一个参数, 加一个杠 w 啊。下面的这句话就是 user genis, 这句话就是定义了一个单口到 genis 文件,就是说去调用了这个 a p i 文件, 就是建议是点 pm, 他把这个点 pm 是一个包,一个一个一个相当于一个数据包里面把这个点 pm 是省略,省略价格,这也是一个固定的用法,我们可以去看一下这个,看看一个程序,就是说你写程序的时候, 一般的话这一串这一这一串的话都是一些固定的用法,直接去直接去扩过来就行了,但是我们我们还是要知道这是什么意思,然后下面有句话就开始去链接金利子,这也是一个固定的用法, 每个程序开头一般都会都会有这种计划去开始,然后我们看一下 g s 线模式的一个命令格式,这些都是录制的,比如说在 c 线的时候,它直接弄成这个 c o m, 直接露出这个手机干嘛?但是 par 的话,因为你定义的格式不一样,就在前面他一定要加一个哆啦 f 杠指向这个东西,他是一个固定的一个固定的一个用法,就是在前节课我 就是写了一个 house 啊,就可以直接去录制这样的程序代码。嗯,我们现在就可以去自己去写一个小小小的程序,就是打开一个编号的程序,就可以自己去写一个了。呃,这一段的话就是一个,呃固定的用用法,每次写程序的话包括谁就行了。 嗯,这个这句话的话就是打开一个念号,这是一个,这是一个。不,这,这是一个,这是一个录制的啊,那这个的话就可以换成一个系统的一个换成一个系统的音量去做。嗯,他这个东西代表一个念号名吗? 那么我就把这个,把这个 copy copy 过来,把这个列号名换成一个,换成一个变量,这样的话,这样的话就是一个一个简单的一个 一个一个小程序。让我们去讲一下就是如何去在 part 里面得到这个环境变量的允许,嗯,他和这个 c c l 他是不一样,其实我要想得到这个 c c l 里面的那个电话名,就直接是一个 doler, 后面加一个角膜,但是但是在 part 里面的话就一定要加一个 doler, e n v 后面加一个大括号,然后里面就是加你的,呃,轿跑就得到你的年号名 style, 就得到你的这个当前的一个 style 啊,这只是一个表达的一个一个一个方式不一样。 看一下,我们就说你看一下,看一下,我这是写了一个 hops, 写了一个程序,我这里就定义了这个一个变量,据说我定义一个 job lam, job lam 的话就是一,这是一个变量名, 我把这个纸,把这个系统的一个一个变量,把系统的一个变量啊,有一个轿跑付给了这个变量,这是一个打开的一个赛跑付给了这个变量。 所以 part 里面系统的变样的一个表达是是用的这种,他和 c、 c、 l 是有区别的 啊。以上就讲这么多,如果大家有什么不明白的话,就可以通过这些联系方式,就直接可以可以联系我,嗯。

那我们来学习一下普洱的一些基础知识或者语言的话呢,它是属于解释性的一个语言,是阿里沃尔在一九八七年的时候, 呃写出来的一个语言,他是一个解释性的,他不是变异性的 c 语言和 c 加加这些语言呢,他写的代码需要变异以后再运行,而普洱的话呢,他运行的时候是一个解释器在运行 现在最流行的拍摄的话呢,那是在一九九零年的时候发布的,那或者他的强项或者说他的优势 都有哪一些呢?他在借用了一个 c 语言,包括 scd 啊, awk 啊,还是这一些的语言的一些特性,然后他最内部最重要或者说被行业。呃, 我按照的一个非常重要的点的话呢,是他的正则表达是或者正则表达是在所有的语言里面可以说是属于顶级的,也是目前为止 在邮件的垃圾邮件的处理,包括银行的账户处理等等,目前还是他的还是在这个地位,还是目前没有被撼动。 那拍摄的话呢,是在九零年的时候发布,他是呃相对来讲比普洱要晚了几年,他也集成了普洱的一些优点,所以在目前呢来讲, 他们两个的都是属于开放式的一个员,都是属于开员的,偶尔跟拍摄的优势呢,或者说他们两个,嗯有一些优缺点吧,这个都是美门员对他自己生存能够呃 被很多人使用,那么就必然有他的一些优点。那同样的话呢,我们选择一门语言的话呢,就不必要太纠结这一门语言是不是最好的,这世界上没有说有十全十美的一门语言 适合我们自己的,能够解决自己的需求的,那么他就是一门好的语言。还有一个重要的点就是说语言好不好,他不一定说是他本身产生的问题,他也有可能 是你使用的水平,技术能力,能不能把它用的好。那学习 polo 最好的一本入门书籍呢,就是这一个叫幼儿园入门,也叫做小骆驼书。 为什么说我们会呃选择这一本呃小骆驼书的这本入门入门呢?因为他是 将普洱语言从最开始的所有的一个基础知识呢,从头到尾的都呃可以说从零开始讲起。哎,这本语言的话呢,他这本书的话呢,他相对来讲就没有讲到一些太高深的一些。呃普洱的一些用法, 往这本书里面的话呢,如果我们将前面呃这十来张全部都学完的话呢,基本上我们在 些脚本是足够足够了。那在讲到这个脚本这个概念的时候呢,其实 pos 在早期的时候呢,他 写的一个叫外国的一个服务,那也就说,嗯,可能有朋友知道叫 cgi 的一个一个程序, cgi 的话呢,其实在一定程度上呢,它指的就是 pool 语言写出来的一个程序, 那他是可以作为外国服务器的。呃,一个语言,在 php 流行之前,那么很多网站的网页武器上用的语言是普洱语言来实现的, 所以呢,就是说我们今天的话呢,先只是大概了解一下 pro 银行的一些优势,或者说他的一些呃优点,那最主要的时候呢,就是我们要将它怎么样的发挥出来, 那就是要靠我们每个人去把它学习好, 那波尔斯他是一个解释性的语言,也就说在运行他之前我们需要先安装解释器, 那解释器的话呢,这个温特斯朗版本呢,我们可以下载在网上去下载,这个版本推荐的话呢是五点幺六点三的版本,那五点 八点八呢,是最低的一个入门版本,建议是五点幺零或者是五点幺六点三,或者是幺六点二三十二位的这个版本, 那其他版本也是可以的,就是只是呢可能说需要的一些模块的话呢,嗯,我们目前没有途径获取到,或者说你要有自己有一个变异安装的这个能力,那么你就可 可以去使用其他的版本,如果没有的话呢,那我就建议你用这个五点幺六点三的版本。首先我们点安装 这个就通常软件的安装的话呢,下一步就好了,然后这里一个 ipi 的这个的话呢,主要是用于网站上的这个一个接口,这个的话呢我们主要是在网网站服务器的这个那个插件,所以我们经常就不需要去安装它,我们只需要下面这两个就好了, 那点下一步点装就好了,按 装完以后的话呢,在我的电脑属性高级属性里面,环境变量里面,那一个让他的安装目录的话呢,会加到我们环境变量里面,那个八点的 这个环境变量里面,我们只要确认一下,那有一些操作系统的话呢,可能没有权限或者说是设置的,他需要注销一下, 还能够生效。所以如果说您的破坏环境安装完以后,然后呢没有生效,那你可以注销或者重启一下操作系统, 那现在是在创建所有的 html 的这个帮助文件文档, 也就说他所有的模块的使用方法,在安装完以后,都会有一个网页的一个文档给到我们,我们可以去嗯,从这个文 档里面找到一些原始的技术性的支持文件或者说手册。 那每一门语言呢,我们在学习的时候呢,都会有一个 hello word 的一个案例的一个程序, 那我们再用 polo 的话呢,同样呢也会有这样的一个程序,那这个 polo 呢,是因为我之前安装过了,所以说呢那些模块我就不再一个个去下载,我就改一下名字就 ok 了,新安装的这个呢,原始的我就把它删了。 那这就是一个最简单的一个 poler 的一个 hello word 的一个案例的一个程序,我们打开 这个 cmd, 也就是我们的中班,然后呢找到我们的程序所在目录, 我执行普洱,然后比如说我这里的名词是 s 的影片,那么我们可以看到他打印出了一个 hello word 这样的一个豆腐串,那么这就是他最简单的一个入门,就是 hello word。 那接下来的话呢,我们就以 polo 的在吉尼斯里面,他默认的话呢有提供一个标准的案例的一个程序, 我们先启动吉尼斯,在每一个版本的吉尼斯的版本目录中,也就是在一九七 七,一九二一一百这些等等这些版本下面一个二的一个版本就是目录下面二,然后呢下面一个 polo 的这个版本,那这个版本这每一个呢里面都会有一个案例的这个程序,我们可以将这个案例的程序的话呢在 进电视里面跑一下调试出来,随便抬开一个亮黄, 然后呢我们直接点状,这个时候我们不能用调试的模式,因为在调试鉴定式里面,调试只能用于 c 线或者是 b 线啊, polo 拍摄啊,这些都不能再这样的调试, 我们可以看得到,那么弹出来一个提示,那我们再确认一下,那么呢可以看得到 这个是生成的一个 poler 语言,将写出来的一个图形,那我们再点继续我们看一下, 当你能看到这样的一个图形,这个或者这个脚本能够运行,那么的话呢,代表了你今天的这个学习就已经到位了。 那最主要的话呢,我们是要将这个图形能这个脚本案例的脚本能调试出来,那这样的话呢我们才能进行下一场的学习。

小伙伴们大家好,我是没什么人气的 up 主 peter 派,祝大家兔年工作顺利,一帆风顺,家庭幸福,学习进步。 过年了,咱们也不讲那些比较复杂的,整点轻松的来讲一讲,所以本期呢,给大家演示一个破脚本的,真实的实用的例子。大家呢,可以在 windows 上也下载这个破的解析器啊,有两个网站啊,一个是 active state 啊,另外一个是 strawberry for ms windows, 那么这两个的解析器呢,都是免费的。我们在课上啊,给大家举了一个 per 的例子,就是在 嗯众多文件夹当中寻找其中的一个文件当中包含哪些字符啊,这样一个 pro 的脚本。那么我们这回举的例子呢,就是这个这个文件夹里头有很多的文件啊,很多的文件夹,文件夹套文件夹里面 还有文件,那么里边有 meta level 文件,也有呃点儿微的 vlog 文件,那么我们就用这个 find 点儿 pro 啊,来去寻找这一些众多的文件夹当中,哪个文件当中有包含我们想要的字符。 大家看像这个代码呢,就是我们在书中啊给大家举的例子,那么这个里面呢是点微啊,点微,我们就是想搜索那个 vlog 代码当中的关键字,那么这个里面呢?假设我想搜索叫 temp 啊,叫 temp, 好,我们来运行他一下, 我这里打开了一个 terminal 啊,然后我们来运行这个 terminal, 我输入 pur 啊, pur 就是命令,就是我想执行这个 pur 这样的一个点 e s e 文件,那么刚才那个叫做 find 点 pur 啊,它搜出来这 这么多啊啊,搜出来很多啊,不同的文件夹当中,这个路径都给给出来了,然后这个文件当中的哪一行出现了 tamp? 都有啊,这个内容也都打出来了, 刚才搜出了那么多啊,但并不是我想要的,我想要的是全字匹配,那么这个时候我要给这个单词呢,加一个单词的毛位杠 b 啊,就是给他确定单词的边界,然后我们来搜索一下看, 我仍然是使用 pro find 点 pro, 大家看这回搜出来的就是完全的啊 tamp 啊,没有什么 tamp 杠什么之类的。 那么本书所举的例子呢,就是在这个里面用正则表达式啊,体现了一个单词毛位的一个功能。其实正则表达式的功能是 非常多的,在本书当中呢,内容有限,所以说不能够一一的讲到,只是给大家体现出这个政策表达式以及 poor 的一个用法。 在 lidux 服务器上呢,它的用法是一样的啊,这个语法是一样的,然后大家也是使用 pro 加 find 点 pro 来搜索就行了,只不过是我们前面最上方要加上这个语句来 表示啊,我们这个 pro 的编译器是安装在这个里面的,那这个时候呢,如果我们把这个 find 的点把它用 change mode 来改变为可执行文件的时候,那么他就可以不需要输入那个 pro 了啊,就像刚才我们刚才说的是 pro 放一点 pro 对不对?如果这个放一点 pro 本身他就是可执行文件的话,那就不需要输入 pro 放一点 pro, 直接输入放一点 pro 即可啊,如果没有这句话的话, 他找不到解析器,没有办法运行好破脚本呢,就演示到这里,希望对大家有所帮助,如果大家觉得有收获的话,请务必给我一键三连,并推荐给你的同学和同事。谢谢大家,我是皮特派皮老师,我们下期再见!

大家好,科颜露今天给大家带来 per primar 幺点幺点二幺的安装教程。首先我们打开这个界面,点击 next 选择我同意,同意完之后 安装路径可以改也可以不改,接着点击了 next, 然后等待软件安装完之后, 我们就可以得到软件了。 好的,我们来看一下这个软件。 以上就是 pro primer 幺点幺点二幺的安装教程, 谢谢大家。


这小节我们介绍如何用 libyvent 实现并发服务器,这些内容在深入理解计算机系统这本书上没有,是拓展内容。 libyvent 封装了底层多路服用接口,让我们可以更方便的跨平台使用一部网络 io。 libyvent 有两个概念, event base 和 event。 event 是事件可以设定触发条件,可读可写超时信号以及条件触发后需要执行的函数。 event 相当于 epole 中的 epole event 事件循环在 vent base 上执行。 event base 里记录了所有事件的触发条件,在循环中检查条件, 如果条件满足,则调用 event 中指定的函数。 event base 相当于 epo 中 epo create 创建 的结构。如图,要读取一个文件描述符 fd, 先创建一个 vent base, 然后创建一个读事件,之后把事件注册到循环中。接下来调用 vent based spat 开始事件循环,在有可读事件的时候,调用回调函数读取 fd 上的数据。 接下来介绍两种设计结构来编写我们的服务器。一种是一个县城监听事件,县城池处理事件。第二种是多个县城监听事件,事件触发后直接在本县城中执行。我们首先介绍单事件循环,多处理县城 event base 操作只能与事件循环在同一个县城中。为了在多县城中都可以进行事件处理,第一个想法是在事件县城中创建 event base 循环。 回调函数中将事件的处理交给现成值。事件循环中存在一个超时事件,这个超时事件的回调函数专门负责执行线乘值发过来的操作事件的代码。如果在线乘值中还有需要操作的事件,则将操作事件发给事件循环。 我们在使用 epox, 经常使用这种方式。接下来介绍多世界循环,这时候我们会创建多个世界县城,每个县城创建一个 event base, 世界循环,事件触发时直接在世界县城中执行, 这样能并发的处理多个客户端的连接请求。某些耗时的操作也可以放到线城池中直行,避免事件循环线城长时间阻塞。


因为他破圆的这种特性,就是说他是接近 自然语言的,这种特性的话呢,就有很多其他语言不具备的一些特性。比如说我们在讲这个标量的时候有字符标量,有数字标量, 那什么时候他能够将他作为素质漂亮,那什么时候又能将他作为自负漂亮?那他怎么样去识别的?他并没有像其他的语言一样去声明他这个变量的一个类型,他并没有去声明这一边 每一个电量的类型,他只是一个标量,标量前面就是当然是美元的这个符号,就是后面的话呢是数字还是字符? 那么的话呢,就是要看您这个环境是什么。那比如简单来讲,我们这里的话,四胎宝加勒儿那加是一个,嗯,数学符号,它是一个数学的运算符。 那我们上一次的时候呢,有演示到一个,当我用这个加号的时候,他两个字符呢都不见了,取而代之的是什么?是一个零, 我们可以看到他中间加的字符呢?他是是一个零,那为什么会出现就说这个中间他并没有 使用这个赛博,也没有使用这个乐,而是一个数字零呢?因为他当识别的这个加号的时候,他会按照数值变量的这个模式去运行。 那假如说我们在前面的话呢,加上一二三,一二啊,不要说一二三了,好吧,我们就这样一二,然后再加上啊,那这样的一个描述,我们去运行,看一下他的结果是什么? 我们可以看到这边的话呢,直接就不给你运行了,对不对?那我们再稍微改一下,把一二直接加六, 我们看一下这次他加的是什么, 我们可以看得到这一次呢他加的是一二,因为 在这个字符和数值运算的时候,中间的运算符是数值运算符的时候,那么他会按照数值的这个 电量去复制。如果今天这里不是加号,而是呃字符的,比如说连接符,或者说是我们,嗯,比如讲我累了,再加上后面的话呢,我用的是字符的这个操作符,比如说乘以个二,对吧? 那这个时候呢,他就换了一个上下纹了,他就不是竖直的上下纹,他是字符的上下纹,我们可以看一下这次他的结果是什么, 小伙伴们也可以想一想这次加的应该是什么,我们可以大概可以看得到他加的是两个内容,对吧?也就是说 他是内耳的这个呢是一个字符,字符串的字符的这样一个意思,就是这个 x 在这里呢,是我们上次有讲到,就是在 pos 里面的话呢,他的呃一个一个操作符叫做重复操作符的一个形式,他是将前面的这个字符串的 重复多少次这样的一个目的来用的。那所以说呢,他这个时候他的上下纹环境就是字符的上下纹环境,而不是竖直的双下纹环境。那我们可以再看一下,我把内耳放在前面,然后二放在后面, 那这个时候他是什么上下纹呢?我们可以看一下, 想问也可以想一下这次应该是出来是什么数字,或者是 说应该加的是什么字符, 我们可以看得到他加的是二,对吧?数字二,数字二的话呢,就是我们的这个,他因为目前用的是一个加号, 那加号就是把它当做一个竖直的上下纹,而不是字符的上下纹,这就是我们上下纹的一个很关键的一个理解。 这一点的话呢,在破后面的话,在实际使用的时候啊,经常会由于我们在复职的时候有字符串,然后又有这个数字混合在一起的时候呢,就特别容易出现。呃,程序运行的不是我们预期的那个效果, 所以这个的话呢,一定要多尝试,多去理解,包括说我们这里经用这个 单引号,双引号,那他的结果是不是一样的呢? 我们都可以去尝试一下,因为这个在他的上下纹环境里面有很多种很多种的这个包括现在是标量,然后面还有个数组含吸的时候呢,会更多的。上下纹 这一块的话呢,我们先看到这里,那接着下来呢,我们再讲另外一个概念,讲二元操作符或者说二元的复制符号。什么是二元复制符号呢?也就我们可以看得到这里的话是零点零五,再加上呃,零点 零一乘一个零点五。嗯,我们换一个例子吧,我们这里有一个十除以三的这个大小,是吧?这个我们上次是取了他的, 嗯嗯,鱼脂那个鱼素,那我们这次呢,我们把这个塞子,然后比如说我,我要减掉数字九,假如说我要减九, 那通常呢我们减九是怎么写呢?我们应该是在前面是塞子,然后再减号数字九,对吧?那这种的话呢,是他的一个呃, 正常的一个数学的数字的运算符号是这样的计算的,对吧?那我们先这样的算运行一下,看一下他的结果是不是跟现在是一样的。然后我们再等一下的时候,我们再来把这个变量显示出来,我们看一下, 我们可以看得到现在 跟刚才时间是一样的,所以这个是没有变化。我们在调试的时候呢,有一个简单的办法,就是我们呃可以加上暂停,然后将电量显示出来,这个时候呢你就不用去看那个中单的信息, 比如说我们现在可以看到这里显示是一,我们可以停止掉,然后这样的话呢我们再重新来计算一次,那这个时候呢,我们将这个负,也就是减号放在这个等号,也就是负值号的前面, 我们看一下这一次他出来的结果是多少,我们来看一下还是一对吧,也就是说我们二元组织号的话呢,他是 这两个是相等的,这两个是相等的, 这一个的话呢就是我们呃讲到二元复职的一个符号,就是说我们在计算的时候,在书写的时候呢,呃可以省略这个电量本身的名称, 电量本身的名称是可以省略掉的,不仅仅是加,呃那个减加、乘除这些都没问题。包括说你这边的话,呃 看一下时间,这比如说我加一吧,然后再减二,我们都 可以就说您在后面的话呢加的这些东呃数值,他会再运算到这个加前面的塞子这个符号的这个值里面去的,我们可以看一下这这一次的值是多少, 看一下这次是零了,对吧?所以说呢这个二月份复职号呢,他这个意义的话呢,就是我们在编写的时候呢,可以省很多很多的事情,比如说我们在一乘上一个二,对吧?那一乘二的话呢,我们通常呃 要用那个塞子乘二这样子写,也就是这个下面的下面的话呢,如果常规的写法呢,我们应该是这样子的,对吧?但是我们现在用上面的这个写法也是可以的,我们可以试一下 一乘二等于二,对吧?所以这个就是二元复制号的一个用法。 那前面讲的呢,就是说我们呃有有这个上下文,然后一个二二元的一个复制符号。 那上一节课的时候呢,我们其实讲过一些那个字符的一些双引号和单引号,这个原来在学 c 系列的时候呢,也也也讲过,那么的话这里的话呢,我们就不再去重复。那 接下来我们还有一个就是说操作服的优先和结合性的话呢,这个是在破入门里面的三十一页。嗯, 这个的话呢,会有一个就是涉及到逻辑运算的这一些符号,包括说我们加减乘除,然后自增自减呢这些等等的这些符号呢,他会有一个,嗯优先级, 嗯,因为这一块的话呢,主要是后面在用于那个呃条件 运算的时候用的多,所以我们前面的话呢,这一部分呢,我们先把它跳过去,然后后面的时候我们再讲那个条件运算的时候,就是衣服条件呢这些判断的时候,我们再来去学那一部分。那 今天的话呢,就是主要讲的就是上下纹这一部分,因为上下纹这一部分的话,呃,如果说对普洱没有太多的了解 姐的话呢,可能经常会把自己弄混了就是,嗯,应该怎么讲呢?就是说我们正常情况下可能说我这里有几个简单例子啊?我这样的话复制的话呢,它是个列,我什么时候它能变成数字,那什么时候它是字幅串, 那在这个时候呢?我们有一个办法呢?就是假如说我想要他作为数字的时候,我们可以做一个动作,就比如说 我们给他做一个加零的动作,那这个时候呢,他他会强制性的将它转换成这个呃速直的这个变量, 这个上下纹。比如说我们在下面的话,我们可以做个看一下, 在没有加这个加零的时候,我们可以看一下他的值是多少,然后我们加了一个零,我们来看一下他的值是多少, 我们现在可以看到这个直视链,对吧?那当我用加零强制性的将它转换成这个数值的这个上下纹的时候,我们可以想象一下这次应该是多少, 他就是零了,他就不是这个乐了,也就说我们可以做一个转换,那同样的假如说我是一个数字,呃,比如说我上面的这个赛字,对吧?那我要把它转换成字幅串呢?那怎么转? 我们假如说要把这个呃转换成字幅串上下文,我们应该怎么转? 我们可以加上一个 连接符,连接符也是可以在前面去连接的,这样的话呢他就成了一个赐福串的一个上下文, 我们可以看到这次是二十二,对吧?他就是说你在想要转换的时候呢,你只需要呃将 让他穿过,比如说转成数字,那我这边呢就加个零,如果我想转成字符串,那我就是用一个连接符就可以达到这样的一个效果,因为连接符我现在是 是一个空的,那我我可以转换成一个空的,这后面加个空值,这样的话呢,他就是一个呃,在后面不会增加任何新的值。 比如说刚刚我加了是是加了三次本身,所以是看到是二十二,那这次的话呢?我们不加,只是加一个那个连接符加个空的在那里我们可以看到现在是二。那我们怎么样去判断他是 嗯?制服还是说是制服串?这个其实在扩容内部的话呢?他自己是有一套机制来运行的,所以说我们不用太担心,你如果做了这两步的话,基本上你的变量就不 会出现,把字符当成了字符串,或者把字符串当成了那个数字这样的一个转换,怎么样就能实现它的一个内部的一个识别。 然后像二元操作符的话呢?二元复制符号的话呢,他其实就是把我们这个符号从后面,从这个 塞子乘以二,这样的一个后面的这个塞子,前面塞子就直接你可以简单的看把它的前面 移植到了这个前面,是不是相同的嘛,对吧?那我们就是把这个后面的这移到这个前面去,就省省略了这一部分,省略了,你看塞子然后加上这个长号跟前面的这个是一样的,所以他就可以将这一部分省略, 然后把塞子这个呢就可以删掉,然后把这个呃乘号的话呢移到这个复制号的左边,那这个时候呢,他就 是一个二元复制的符号的一个一个一个写法,那这样写的话的时候,当我们写很多长的一个计算,呃公式的时候呢,那可以省略很多,也还有一个很重要的一个用法呢,就是, 嗯,比如说我们在做四合串的拼接的时候,特别你当后面要做数据库的连接的时候,那四合一就呢他的呃很长很长,对吧?那有很多条件或者说很多的关键字,那我们可以在这里的话用一直拼接下去, 比如讲我们现在的是这里是累了,对吧?那我们把这个 我加上呃 style, 我这样加上 style, 那么的话呢他就会一直在那个那个后面加上 style, 然后呢在后面我再加上这个胶果 假货,我们是这样的一个形式,呃,这里呢你可以加空格,你也可以不加空格,都都是可以看得到。我们双引号跟单引号在前面已经有讲过,那我们再来看一下像这种拼接后它的值是多少? 我们可以看到你看这里有内尔斯太宝、轿宝,他会拼接在一起,拼接在一起的话呢,这个 就是说我们呃要要整理成一个很长的字不串的时候,比如说我们封边的边上有这个系数啊,或者说存名啊,叫过名啊,六号名称这些时候,那我们用这个拼接的时候呢,就可以 让我们的代码看起来就会更整洁,或者说调理更清晰一点。我第一行是叫我第二行是斯太伯,第三行是乐,对吧?或者说我第一行是 x 的系数,或者是 x 的把具,第二行呢是 y 的把具,或者是我们嗯 歪的这个这个尺,那个拍的尺寸等等,就是您看起来就不会那么凌乱,对吧?当然说我们也可以就说在这后面直接写上啊,那个斯泰国,然后教我,这样也是可以,但是呢你你没发现当我们要是用电量 拼接的时候,那你要在这里面不停的去加,那在用这个二元复制符号的时候呢,我们可以甚至可以这样子的来操作,第一个是胶布对吧?第二个的话呢,我们就 style, 第三个的话呢,我们再加上料, 我们甚至可以直接这样来操作啊,看一下上面的结果是大写还是小写? 我们可以看到泰式的啊,就泰式对吧?他就会把这几个都拼到一起去, 我不知道我这样讲的话小伙伴们能不能理解,如果不能理解的话呢,就尽 快的反馈一下,然后我再想一下怎么来,再再把它详细的说清楚一点,尽量是让人都能听得明白一点。

因为之前说的话,今天晚上学习那个为了循环, 因为外循环的话呢,他首先他要有一个数组才会比较合适一点,所以临时改成那个学习那个数组这一块的。只是那数组的话呢,在讲 cc 的时候呢,我们有讲过一个数组的概念,但是呢在 pos 里面跟 cc 里面会有一点点差异。 呃,比如说我们在这里获取这个层的列表的时候,对吧?那我们会用英方去获取他的层列表信息,我们可以看到他会有一个很多层的这个元素, 我们获取一下成立表的信息, 我们可以获取这个马克逊这边的话呢,可以看得到,这边的话呢,有整个马克逊的这边呢,一个二维的一个点,那个输走的一个矩阵的一个信息,那这边呢,他会有比如说我的层的 那或者是淘宝这些类型,对吧?每一个信息都有,那每一个的话呢,他这里面都是一个数字, 我们可以看得到他是用一个括号来写的,这是 c 线里面的一个写法,那在 po 里面的话呢,他的这个数字的写法的话呢,跟 c 线有一点差异。 在坡里面的话呢,他数组的关键字是什么呢?他的关键字是一个艾特一个小老鼠的这个符号,这个就是数组的一个一个一个符号。 she 把这个放大一点,这样看的清楚一点。艾特这个符号呢,就是一个数组的符号,数组的一个一个一个关键字符号, 也就是说我们大纳斯呢,开头的美元的这个符号,开头色是一个标量,然后用这个艾特这个开头的呢,那他表示的是一个数组,数组里面呢,他实际上是一个一个列表,那当我们要获取这样的一个数组的信息的时候呢,我们可以先用 我取一下,我们看一下,然后打印出来看一下,好吧? 比如说我们现在获取这一个数字 下面的,嗯,成名,我们把成名的这一个获取出来, 我们打印数字的时候呢,要加上那个双引号,不加上双引号呢,他不会给你显示, 然后我们把这个陈明的这个边量拧抻给他复制下来, 然后在坡里的这个尖绿色这个脚本里面呢,我们任何一个用这个打印的这个变量的时候呢,要 在后面加上一个感恩。如果你不加上这个换行符的话呢,那你在运行脚本调试的时候会出现那个卡住的情况,因为坚持他没有获取到一个结束符号, 那我们加了一个暂停的按钮,然后我们再来调试看一下,看一下他的结果是什么样。 我们可以看得到这里显示的就是我们获取到的这个层的列表信息,对吧? 那这样的话呢,他其实就是在一个简单的一个数组的一个访问,那如果我要想获取到其中某一个数组,比如说 gtr 这样一个数组,那他怎么访问呢? 数字有下标,我们前面有讲过下标,那下标的时候呢,我们可以 下边呢,就是在后面加上,比如说 gt 二是第三,那他的数组的下边是从零开始的,那我们可以把这个边量显示出来,看一下是不是的? 我们再来执行一下,看一下是不是,对吧?这次的话 gt 二呢,他就是这个第第三个那个下边的元素,他实际上呢在那个坡里面的话呢,他是 是用下标数字二来计算的,也就是说当我们的数组呢元素从零开始,一直向后添加, 一直添加到呃最后一个为止,他的下面数是要减掉一个数字一的,才是他整个呃加上一个数字一才是他整个数字的元素的数量。那同样的,假如说我们今天我不是从获取的,我自己去添加的时候,那我们可以加上一个, 我们可以自己加上一个数字,比如说我们里面加上零一,这样呢是两个元素,我们可以看一下,看一下他的 这个对不对? 那我们这次看一下他的这个元素里面是多少,这里看得到就是零和一对吧,那同样的,假如说我们用呃零一五 十对吧?那这种的话呢是第一次复制,那我也可以在下面再加上, 嗯, 我暂时先不讲这个用法,先讲另外一个吧,先看一下我们这里有几个元素, 当我要获取其中一个元素的时候呢,这个时候就不是用这个艾特小老鼠的这个符号了,就是用丹纳斯美元的这个符号。我们又从零开始,我们先看一下这个获取里面的元素和他的数字之间的区别, 以及我们在不用这一个双引号的时候,我们看一下是什么样子的。 我们不用刷引号的时候,我们看一下他的下面这三行的区别是什么, 我们可以看得到第一个,那他获取到元素零,那么就是这第一个元素,也就是下边 为零的是数字零,那第二个的话呢,他会将我们所有数组的元素全部都打印出来,我们可以看到零一五幺零, 那第三个当我没有用双引号的时候,他显示的是我们整个数组里面一共有多少个元素,也就是四个, 这就是说我们为什么说双引号,你要显示这个数组里面的内容的时候,你要用双引号扩起来,如果你只是想看这个数组一共有多少个元素,那么呢你就不用括号扩出来。 如果想要调用其中的某一个元素,那么呢你就用丹纳斯美元的这个符号,然后后面再加上他的这个下标,这样的话呢就可以调用他的数据, 比如说我们再嗯加一个变量,比如说胎死的,那我用这个我要调取其中的第三个元素,也就是五,那这个时候呢,我们应该用下边二,然后再加上十,那这个时候我的胎死的值是多少? 我们可以想一下太子的值应该是多少,然后我们来运行看一下,我们可以看到这里显示的是十五,对吧?因为第三个元素数字里面第三个元素是数字五,然后我们再加上十,那就是十五, 那这是一个数字,那假如说我们要是说呃将里面的变量那个数字元素改成这个字不串呢? 一样的, 如果说我们用字符串的时候呢,注意这地方的上下纹,在讲前面的标量的时候有讲到上下纹, 那这个时候我们需要用单引号或者说是双引号将它扩起来,才能表示这是一个次服串,否则的话呢他就会出现一些呃上那个上下纹的,这个理解不到位,那这个时候我们用太子的再加上十, 我们可以想象一下这个时候应该是多少,他还是十,因为我们 c 这是一个字符,字符的话呢,当他 进行数字运算的时候呢,他找不到里面有数字,他就会把它当做零,那这个时候呢?他就是十,那是不是我这个地方我可以改成二, 我们再可以看一下这个是多少,我们可以看到是十二。那么从这个例子我们可以看得到数组里面是可以有数字形的标量和字符形的标量混合在一起里面,甚至于说我们还可以 二位数字来做进一步的看一下, 比如说我们现在这个十组,对吧?那里面的话呢,我们再用这一个过来,用一个数组在里面来,我们看一下他的结果是什么样子的。 那这个时候呢,我们在下面再加上一行, 我们看一下啊,这两个 a 的这个数字是什么?我们可以看得到 这个数组呢?他是将里面的话呢,这前面的这个 ab、 二 d 对不对?再然后加上这个 b 和三,他就是将这个呃数组跟两个合合到一起来了, 这也就说数组他是可以复职的。另外一个数组来的,他不一定就说一定是,呃,其就是其中一个数组, 然后再加上几个元素,这是一种写法,就是说是可以合并到一起组成一个新的数组,这个时候有什么用处呢?嗯,其实我们在前面讲到那个赠 排刀的时候就有这种用法,当然说写法的话呢,不是这种写法,后面的话呢,再跟大家讲这个怎么用?现在我们先要了解到这个数组有几种写法,就是怎么用,我怎么去调取到其中的一个元素, 然后怎么样的把这个数组呢?复制到另外一个数组里面的一个一个合并到一起,然后怎么样呢?用这个里面那个元素呢?去做一些呃运算, 甚至说我们也可以就是进一个判断,比如说哎,里面呢,我们取到第一个元素零,对吧?如果说他等于 a 的时候, 那我们就显示这一个元素, 那这个时候呢,我们在前面加一个那个提示吧, 我们可以看一下他是不是这里可以看得到他,他是可以做直接用这个元素去做一个运算,或者说做一个判断。在任何地方,只要是在他的这个上下纹的范围内, 那么的话呢,他都是可以进行直接去调用去运算的,而不需要我们去考虑其他的因素。 那么同样的在这个时候呢,我们要考虑的一个问题呢,就是我们在算这个 max 这里面的这些层别的信息的时候,我们获取到,比如说我们获取到这个层的 呃类型的时候,他是文字层还是房子层还是线路层,以及他是正极性还是负极性的,那等等这些 的时候呢,那他都涉及到一个呃,一个一个标识叫下标,对吧?也就说我比如说我 gtu 层, gtu 层的话,他在这里的下标是零,那同样的我要获取到他的 成类型的时候呢,我也要用零这个下边去获取的,才能获取到这个 logo 这一个变量的第一个元素,也就是他的元素要对的对,对的上我才能在这相同的数组里面去获取,那我们可以试一下, 我们刚刚在上面有获取到他的这些信息,那我们在下面的话呢,我们就来打印看一下, 我们就获取他的成名, 然后我们用数字零,也就是第一个下边, 然后我们再来看他的类型, 这里有讲过我们那个拼接的字不串,也就是一个圆点的这个拼接, 那在前面的话呢,我们可以看一下,那这样的话呢,我们先试一下,看一下呢他的是不是用这个数字零的时候,我们能不能够获取到相同的一个信息? 我们来看一下这里 gto, 对吧?他的文字层的类型,这就是说我们的这个下标要一致,那相应的我们换一个下标,我们用这个一来看一下, 一的时候呢,我们看一下一是什么?这是防汗的,对吧?那同样的我们用一来看一下, 当我不同的下标的时候,那我们获取它的变量,不同的数组里面在挖过去里面的话呢,它是对一一对应的关系,所以我们一定要 把这个下边呢是整个的这个猫血,这每一个边量,他的下边要一致才能获取到这个数的 纵向的这个信息,我们才能说进一步的去分析,或者说去利用。那同样的这下面的急性我们也可以再加一行, 我们可以看得到这里极限就正极限了,对吧?所以说这里的话呢一定要确认,那同样的我们也可以把这三个字符串的话合并到一个, 我们可以将三个字符串就是三个数组中的一个,这个这个变量我们可以将它合并连接到一起来,比如说这里我们加一个内容,然后呢我们再 没有, 我们可以分行的来写一行一行的写, 用那个连接字不串的这个符号连接符就可以了 啊,下面这三行呢,我就把它去掉了,我只要需要一行,然后这第二行的话呢,就是逃跑,然后下面这个是极限, 在下面我们家把这个边量显示出来, 那这样拼接完以后呢,我们再来看一下他显示的是什么样子, 跟我期望的不一样啊,我没加这个换行服,他怎么会加了换行服呢? 中国画,中国画就是数组的下标, 那我们把它换到衣裳我看一下, 因为有的时候这个数字里面的拼接的标量,看一下是因为这个本身的变量有加这个换换符,还是怎么看一下 拼接的时候呢?上面加了一个那个翻译号,然后他自动加了一个换行符,那我们现在可以看到在这里呢一行串起来,这样也是可以把它拼接出来的,对吧?这里 也是可以把它拼接出来的,那不对呀,我这样应该也是对的呀,是我刚才看错行了吗? 啊?我刚才看错行了,我看到这个上面去了,实际上这个是对的啊,我以为我又犯了一个低级错误, 就说我加几个变量的话呢,我可以串串起来,然后再用这几个变量,再就说直接可以去调用我的这个里面数组里面的某一个元素。呃,为什么就说今天晚上我不讲外来循环呢?因为 首先我们得知道这个数组只有有数组的时候,我们才好去用外循环去判断,当然说我也可以用用另外一个判断去做一个外循环的一个使用。 等我们把这个数组的这个了解完以后,那我们再来去讲那个循环的那个嘴的用法, 那数组呢?还会有一些其他的操作,那其他的操作的话呢?呃,他涉及到的,比如说我们像里面去增加数组,或者说呃减少数组,对吧?这些的话呢都都是有有一些 用法的。那同样的话呢,数字的话呢,我们也可以进行一个直接,刚刚我们讲的是 直接去复制的里面的元素,对吧?其实呢我们还可以另外一种复制的这样的话呢,是里面有四个元素,那同样的呢,我也可以直接 去进行指定某一个元素,比如说我现在指定十对不对?那十这个元素的话呢等于多少?比如说等于十二,那这个时候我们想象一下这个数组里面的话现在有多少个元素,我们可以在这里做两个打印出来看一下。 那么我们在下面看一下,我们这次打印出来我们可以看到里面有多少个数字,我们可以看得到上上面的这个的话呢是四个。 然后到了下面这里的话十二,他是第十个,他挪到后面这样看不明显。我再把这个呃数字的元素个数打出打印出来看的话呢,你可能就是比较清楚一点, 这样的话呢就打印出来的话就是他数组的个数,我们可以看得到上面是四个,下面呢就是直接到了十一个,那因为为什么是十一个呢?因为这个数组的下标他是要加一的, 他是从零开始计算的,不是从一开始计算的,他第一个元素是零,那我们做复制到第十个的时候呢?从零到十,那就是十一, 不要说呃这个问题的话呢,就嗯,只是他的是这样规定的,这个就是说为什么是从零开始的,这个的话呢?我也解释不清楚啊, 我就就不去纠结这个问题,我们只要知道他是从零开始的就行了。 那说 这边的话呢,嗯,他还有一些其他的用法,就是操作符啊,还会有一些其他的用法, 比如说那我们现在这里是十一,十一个元素,我要直接获取的这个数组的那个个数的话呢,刚才我们讲的是用这个直接用数组的名称来来获取,那其实呢还有一个我假如说我要想 呃获取的这个数组的最后一个元素是什么呢?比如说这里十二,十二的话,我也不知道我的元素是多少,对吧?那我就不知道我的下边是多少,那这个时候呢,我们可以呃用一个,一个 呃用用,用一个那个符号来来来表示,就是用丹纳斯,然后再加上井号,然后再加上这个数字的这个变量,我们可以 看一下这个手是多少,这个呢只是他表示的是这个数组的最后一个下边的是是多少,我们可以看一下, 我们可以看得到这里是显示是十一,对吧?然后上面呢是十二,是因为十一是这一行第三行打印的,那第二行打印的是十二,也就是说是最后一个元素的值是十二,他显示出来是对的吗?对吧?然后或者说我们在 做一个台词,来来打印,这样的话看出来明确一点,我们可以看到这里是台词的,也就说他是调用最后一个元素,我们不知道这个速度有多少个元素的时候,那我们可以用这种 写法去获取他最后一个元素的下标值,然后呢再复到这个中括号的这个下标上面,就可以去调用他最后一个元素的值是多少。 呃,不知道这样讲的话,小伙们能不能理解啊?那当然说数字的话呢,我们假如说我们复职的时候是连串的,比如说呃一二三四五,对吧?那我们可以简写成 一两点,一直到五,这个时候呢他就是一二三四五,我们可以在这里下面打印出来看一下, 我们可以看到这个数组的元素从刚刚的呃四个增加到六个,然后下面的数组的内容呢 就是一二三四五,再加上一个十,对不对?那这个是一种写法。那同样呢,在字母的时候,也就是字符类型的时候,我从比如说我从 c 到 h, 我们看一下 c、 d、 e、 f、 g、 h, 对吧?他就按照这个呃数字的话呢,是一个顺序,然后字母的话呢,他是按照二十六个英文字母的顺序来排的, 就说你当你是连续的,那么这个时候呢,你就可以用两个连接符,也就是两个圆点,英文状态,英文状态下的圆点做连接符,然后呢就直接去复制给他 一个竖走,连连续的一个竖走, 那这里的话呢,我们看到就是说不同的元素之间我们都有用这个呃逗号去做区分,那实际上的话呢,还有一个简写的方式,那我们就不用逗号了, 我们加上一个 qw 这样的一个符号,比如说 abcd, 对吧?现在我们有四个元素在里面,那这个时候我们注意看上面的话呢,我打印出来看一下啊, 上面的话呢,我们有复职,然后呢在这这一行的时候没有重新复职了,那这个时候他的数组的值的话,他是重新复职的,还是说在这上面的值上面去增加的呢?那我们 再看一下,在第一个数组里面是 c d e, f g, 呃, e f g h 十,那当我第二个数组我重新复职的时候呢,他就是 abcd 了,他就没有这上面的值。也就是说我们在使用数组的时候呢, 如果要重置一个数组的时候,我们只需要重新复制给他,从第一个元素一直开始,那么的话呢他就会重新复制,他不会说 再从上面的话这个值那个元素里面去叠加,不会去叠加的,他就会重新复制。当,当我们要清空一个数组的时候呢,那同样的,那我们就直接给他清空 就可以了,那我们看一下这次还会有吗?我们可以看到这个的时候,这下面是空的了,对不对? 这也就是说受阻的话呢几个基本的一个写法。

各位学前端同学,做前端要拿高薪, model reaper 工程管理是必过的一关,很多同学呢,可能只熟悉小项目的开发,但是呢,真正的大型项目啊,几乎全部都是在用 model reaper 管理这个东西吧,它不仅是代码的一种组织方式,更是工程能力的分水岭。如果说你不会就拿不到高薪项目的入场券, 那么这期视频呢,我将带你从零开始搭建一个企业级的 model reaper 工程,内容比较多哈,设计面也比较广, 但是呢,不管这些知识有多少,他每一个点都是为了去解决某一方面问题而产生的,所以说在学习这些知识的时候呢,我希望同学们啊,能够抓住这些知识的核心。那么什么是核心?就这么几个点,第一个点呢是遇到了问题,目前我们遇到了什么样的问题啊?我们一切都是以问题为驱动的。 第二点呢是解决方案,我们用什么样的思路和方向去解决这个问题,方向不能错,方向错了就错完了,好。然后第三个点,技术选型,因为我们知道前端啊,他同质化的技术呢,是比较多的,每一个问题他都有多种技术可以解决,那么我们选择使用什么样的技术? 然后第四个呢是技术实施,就怎么去写代码呀,写配置啊,把它实现。然后第五个呢是呈现效果,就实现过后他得到的是一个什么样的效果,我们可以体验一下这个问题 有没有得到解决,以及呢他有没有带来一些新的问题,我们每一个知识点都会通过这五个层面去进行讲解,那么同学们要重点关注的呢是一二三五这四个点,你理解到一二三五这几个点之后啊,那么今后在用 monorepo 做工程管理的时候,你的方向就不会走偏。 那么至于说这第四点呢,他就涉及到具体的工程化技术了,那么就是各种配置,脚本开发等等等等啊,那么这部分内容呢,即便是你不会或者是忘记了,那么将来呢,我们可以查找文档或者是询问 ai 来解决啊,都比较简单,重点是一二三五, 因为你只要方向是正确的,那么在实施环节的话啊,就不会有大的问题。反之方向一旦错了,那么项目是一定会返程的。 好了,话不多说啊,那咱们开始来搭建这个工程。首先我要思考的第一个问题就是我们如果说进入到一条业务线,这条业务线里边呢,可能会涉及到多个项目,他不是只有一个项目,那随便举个例子吧,比方说你要做一套叉子系统,这里边有各种业务功能吧,对吧?那么业务里边有前端吧,有后端吧,那甚至前端里边还可能会分为移动端 和页面端,有可能会分开处理啊,那后端有可能分为微服务和中间层,这光是业务开发这一块,它都不仅是一个项目。那么除了业务之外呢,是不是还可能有基建?那基建里边是不是有可能有主建库,还有什么函数库啊?函数库呢?可能就会包含什么请求库啊,一些通用的一些 sdk 啊,那甚至还有可能是有一些研发的脚手架 啊,一些命令行工具,是不都有可能会出现,甚至还有可能会研发一些的码,对吧?那么这些都是基建措施,我这里只通过这个例子啊,不是说真的要去做一个 s 系统,我通过这个例子呢,告诉同学们,就是一条业务线里边啊, 它实际上不止一个项目,它有多个项目的,那么这么多的项目啊,我们如何去管理它?这是一个问题。那么这里呢,就涉及到两种管理项目的模式,一种呢叫做 monero, 分 别的意思呢就是多仓管理和单仓管理,怎么理解呢? 这很好理解,何为多仓管理啊?多仓管理就是每一个项目,我们把一个项目呢看成是一个包,每一个包呢,它独属于一个仓库,你看一个包一个仓库,一个包一个仓库有多少个就建多少个仓库。那么何为单仓管理呢?就是我们现在最流行的 model ripper, 那 就是所有的包都属于一个仓库,他们的区别就在这这他最根源的区别。 然后有的时候面试题问到你啊,这个 model ripper 和 martingale 有 啥区别?你可以在网上找到各种各样乱七八糟的答案,一二三一二三四一二三四五六七八九啊,各种各样的点,他们说它的区别,但是我告诉你,那些都不重要,最核心的区别就是到底它是一个包一个仓库,还是多个包一个仓库,就这个区别,这是最根源性的东西, 由此引发了以后什么一二三四五六七八九各种各样的区别,我没兴趣去背啊,你有兴趣的话你去网上去看一看,答案到处都是。在我们后期的课程里面呢,也有详细的讲解,那同学就问了,他说袁老师啊,一个包一个仓库和多个包一个仓库,我到底该选择哪一个呢?其实他的本质逻辑非常简单, 你要思考就一个问题,就是这些包之间,他们之间的关联是强呢?你就思考这一个问题就行了。比方说举个例子,我刚才举个啥子系统例子, 他里边有业务的包,有前端后端对吧?有基建的包一大堆,那么这些包是不是为了去做一件事,都是为了去实现整个 s 系统,他的目标都是一致的,那么你想一想,这些包之间会不会存在关联呢?你觉得会不会呢?那肯定会啊,我不说别的了,就是个前端后端, 它们传输的跟内存系统是一样的吧?你通过阿克逊请求去从服务器拿数据,那个数据的格式不就是个内存吗?如果说你用 ts 来写它内存应该一致吧?那比方说主键库前端要用到吧?函数库可能后端前端都会用到是吧?甚至主键库也会用到,那这个脚手架或者一些其他的颗粒工具是不是随时可能会用?也就说它们之间是存在关联的。 那如果说这些东西是存在关联的,你把它分成单个仓库来管理的话,会有一个什么样的问题呢?是不是在文件系统上就把它们隔离开了? 在文件系统上他们是独立的了,那就会造成一系列的问题。随便举一些例子,比方说一个小组写了一个主件库,另一个小组呢?在开发前端代码,他们的文件系统是完全独立的,那请问你咋用啊?你用起来是个大麻烦, 比方说你可以搭一个 m p m 的 私仓,哎,你这个主件库的团队,你写完主件库之后呢,你把它发布到这个 m p m 私仓上,那我前端用的时候呢,从 m p m 上去搭可不可以呢?当然是可以的啊, 但是呢,这一块又会引发新的问题,那版本管理咋办呀?那将来有一天这个东西升级了。那我咋知道升级了呀?我不知道啊,我还在用那些老的代码,就很难同步。那再比方说你开发的这套啥子系统,不管你是哪一个包,他们 那些代码规范啊,一些类型系统,比如 t s 他的一些配置啊,还有背包的一些配置啊,还有打包的一些控制啊,还有一些测试代码啊,都是大差不差的。就在工程管理的角度来讲的话,他们的管理方式都是差不多的。 那你把它分成一个一个独立的包,把它发布到各自的仓库,他们在文件系统上独立的,那这个统一的管理方案你怎么来处理呢?你只能为每一个包去单独的去设置管理方案,而且还要小心翼翼的 避免不统一,注意大堆的问题。这造成问题的根源在哪呢?根源就在于他们本应该是为了完成一件事而出现的包,结果呢,你把它分开了,强行把它隔离开了,就造成了问题。 所以说我们从逻辑上来讲,这些保有约他都是要处理同一个业务线的,他们之间一定存在的某种观点,无论是相互之间的使用和依赖,还是说他们有一些公共的管理方式,不管是什么样的角度,他们都应该是属于同 同一个仓库的,从文件系统上不能把它分开。所以很多事情呢,你从本质的角度去想的话,这事情就变得很简单了,因为他本来就有联系,就应该在一起,就不应该隔离。那么有同学问他说,袁老师,那我们现在学了这个 model reaper 之后,那是不是以后所有的包,我都把它合并到一个仓库里边了?比方说我到一家公司,这家公司所有的代码,我都把它合并到一个仓库来进行统一管理, 是不是这样呢?也不是,就咱们不要走火入魔,理解本质,我们刚才为什么要把它合并在一起,是因为这些东西本身就存在着强关联,他们之间本来就是关联关系,都是为了实现同一个业务来服务的。 所以说他们在一起,那如果说公司有多条业务线,比如说公司还搞了一个小游戏,你把这个沙子系统跟这个小游戏合并在一起干啥呀?有啥意义啊?他们之间基本上是完全独立的,毫无关联。 所以说咱们不要走火入魔哈,就该合在一起的时候合在一起,该分开的时候也不是非此即彼, 它是有适用场景的。你觉得这些包没啥关系的,把它分开,有关系的合并,对吧?这是最自然的一种选择。很多公司呢,他怎么做的呢?他实际上是一条业务线,一个地址仓库,那么地址仓库里边就有很多的包, 不同的业务线呢?还是使用 martingale 把它分离。听懂了吧?好,我们刚才讲的问题啊,就怎么来管理工程也提出来解决方案,那么我们这套解决方案呢,肯定是为了讲这个 model reaper, 是 吧?那么我们就搭建一个 model reaper 的 工程,然 接下来就是技术选型了。 model report 呢,它是一种工程管理方案啊,它不是说具体代码怎么敲,用什么样的技术,没有这个 model report 的 技术啊,没有这个库。你要使用这套方案的话,有很多的工具可以让你选择,比方说最常见的 pmpn, 它虽然是个包管理器,同时呢它也提供了 model report 的 工程管理方案啊,这也是我们 这个视频里边要用到的技术。它提供的管理方案呢,它是比较轻量级哈,它基本上没做啥事,很多东西呢需要你自己去手动编辑, 所以说他轻压,同时呢也灵活。为什么灵活呢?因为他基本上没咋做事,那可不就灵活吗,很多事情需要你自己去做啊,而且呢,也是目前比较主流的 model report 的 管理方案, 所以说我们会选择使用那个 pmpm 啊,包括什么无忧的原码,还有很多第三门户的原码工程,他都是使用 pmpm 来进行管理的。那除了这个 pmpm 之外呢,其实还有很多啊,包括 nmpm 的 这个保管器,还有样, 他们都有这个摩洛瑞普的管理方式啊。除此之外呢,还有一些集成度比较高的啊,比如说像这个 lana, n 叉,还有这个特普瑞普,他们呢也是可以进行摩洛瑞普的管理的哈,只不过呢,这些东西我为什么不用呢?因为他们集成度比较高,你用这些玩意把这个讲课就搞成啥了,就搞成使用这个库怎么去使用的问题了,那一下子格调就下来了,知道吧,有很多事情呢,他们记做完了, 但是呢,也造成了这些东西呢,不是那么灵活啊。呃,而且呢,我们用这个 pmpm 来进行了包管理之后呢,你将来再去使用这些玩意跟玩一样, 因为你自己都能答出来,那用他们那不更轻松了吗?是吧,而且呢,还有这个 rush rush 呢,它是一个发布包的时候一个版本控制的一个工具,这个工具呢,其实可以跟其他的包管理器合用的啊,比方说你用 p n p m 搭配这个 rush 来进行发布包的时候呢,一个版本管理啊,都是可以搭配使用的 啊,反正呢,总之你要进行 model 管理的话,实际上是有很多工具的哈,那么技术选型这一块呢,我们就选择使用 p n p m 的 道理呢,我说了,它清亮简洁,也是最流行的一个 model 管理技术,同时呢,你用了这个玩意儿打起来工程之后, 你再去学习其他玩意就非常简单了啊。好,那么具体怎么答呢?咱们首先呢,在桌面上去建立一个文件夹啊,这就是我们的工程根目录给它取个名字吧, 比方说就取个叫度一啊 monorepo, 到时候你根据你工程的名字来命名啊,我这就随便取了。好,这是个空目录啊,我们把它放大一点。由于呢,我们刚才说了啊,就是个 monorepo 工程啊,它里边实际上是有很多纸包的,所以说你要编排一下这个目录结构,以纸包安排在哪个目录下边 这一块呢,其实没有什么严格规定啊,不是说你必须要是用什么样的文件夹的名字把纸包安排进去,没有规定的,你自己看着来吧。不过普遍呢,我们有些习惯啊,比方说你像你的业务型的包呢,你放到这个 apps 里边 啊,可以写复数,可以写单数啊,保持风格统一就行。你的公共的基建类的代码呢,可以放到这个 package 里边啊,比方说,你可以看一下这个 view 啊,这个 view 的 源码啊, 你看一下吧。好,这是 vivo 的 原码工程哈。好,它就是一个典型的 model report, 你 看这个 package, 你 看这里边每一个子文件夹就是个纸包。当然 vivo 里边它没有业务代码啊,所以说它没有这个 apps 目录,它没有这个目录, 或者是你将来还有一些别的,比方说 doc 有 些文档性的站点,它也是个工程啊,你可以放到这个目录下面,你自行编排哈。这个东西没有什么强制的规定哈,它这个子目录又怎么去编排呢?那随便你哈。比方说这个 apps 你可以盖建两个子目录吧, front end, 这是前端的工程,然后再来一个 back end, 这是后端的工程啊,有的时候呢, node js 需要写一些后端代码,是吧?中间层之类的,那么你放到这儿,那甚至后端,它可能还会分为多个工程,你去建子目录就完事了。比方说前端,它有可能有多个啊,一个是移动端的 mobile 的, 一个是 web 端的啊, web 是一节子目录不就完了吗?啊,这个东西自由编排哈,看你怎么去编排,不重要啊,比如拍个例子,里边你可以有什么啊?颗粒就是一些命令行工具,还可以有什么有一些工具类的函数啊, utos 或者有一些什么啊,主键库啊, components, 对 吧,你自行去编排哈,这每一个子文件夹就是个工程啊,它肯定就去掉了。 好,我们刚才说了哈,我们选择的呢是使用这个 pmpm 进行工程管理,那么具体管理啥呢?又如何来管理呢?一会你看就知道了。好,所以说我们现在呢要做一些技术的实施啊,到底怎么去做?那这些东西呢?就简单看一下就行了啊,因为这后边东西还挺多的啊, 细节一大堆,甚至每一个东西呢都是单独的一门课程啊。你像这个 pmpm 呢,实际上是咱们架构课的一部分内容哈,它里面有详细的讲解啊,这个 pmpm 它到底为什么高效,为什么轻量,为什么更加适合用做魔道锐破的工程管理, 这里边都有详细的讲解哈,那具体的实施过程呢?我们这里就过一遍就行了啊,不过多去纠结,想要了解咱们详细课程同学啊。呃,可以通过抖音点击头像进入账号主页, 根据这个提示啊,来找到咱们来了解就可以了。好,咱们就直接开始,你要用 p n p 进行工程管理的话,你首先需要一个配置文件啊,就这个配置文件,你首先把文件建立好啊,终端建立一个文件啊,当然也可以在这里新建,也是一样的啊,在这个文件里边要写个配置。写啥配置呢? 我下边这个东西复制粘贴过来就这个配置。这是一个压默格式的配置啊,像这种格式的配置文件啊,我们在工程画的处理过程中是不是经常见到? 那么在这里呢,你需要告诉 pmpm, 就是 我们哪些地方是我们的纸包,这里告诉他啥呢?就是那个 package 这个文件夹下边的所有纸文件夹都是属于纸包,还有这个 apps 里边的所有纸文件夹都是属于纸包。好,这样子的话, pmpm 呢,他才会知道我们的纸包在哪个位置啊,主要是告诉他这个 好,告诉他纸包位置过后呢,我们就可以利用这个 p m p m 的 相应的命令来进行统一的管理。就他提供的命令也非常非常简单,比方说他提供了这么一个命令啊,给他写一下 p m p m, 它有一个两个横杠啊,一个参数叫做 workspace root。 这个表是什么意思呢?这个表是在我们的根项目里边,就是根工程里边去执行一个命令,表示我们执行一个 unit, 那 么它就会出事化我们整个工程,是吧?回车里看一下,是不是就在根目录下面去建立一个 p 剪,节省这个格式的文件了。 当然这个命令的执行的时候呢,你也可以进入到别的目录执行啊,比方说进入到任何的目录都可以啊,比方说到这里边我们还是使用 pmp workspace root index, 你 看一下是不是还是在根目录下面,因为你加了这个参数,如果说你不加这个参数的话,你试一试啊,你不加这个参数,你直接 index, 你 看一下它在哪,是不是在这里边, 它就起这么一个作用啊?没啥啊,就是表示在工程根目录下面去进行出售啊,那他就往上找呗,找啥找,这个文件所在的目录就这么简单 啊,这些都是具体的实施的细节哈,了解就可以了啊,刚才我们说了啊,一二三五是重点要关注的点。好,咱们呢,先把这个拍剪接成这个文件给它建立了,然后呢名字给它改一下啊,改成那个读 e 啊, monorribo。 好, 那如果说我们要执行一个在纸包里边去执行命令呢, 我们可以使用这个杠 c 啊,给它写上纸包路径,不过呢,我不太习惯这种方式啊,我习惯什么方式呢?我习惯直接在纸包里边点击右键在中框中打开,不就直接进这个纸包目录了吗?在这里边直接执行啊,到效果是一样的啊,比方在这里呢,拿一个 pmpm 一 列子看一下,这里边不就建立了个编辑节省文件了吗,不就是建立这个玩意吗,对吧,你就可以直接进到命令行里边去执行,它就完事了。 不过呢,你要知道啊,就这个 pmp 呢,它也可以在任意的目录下面通过一些特殊的参数指定到某一个纸包里边去执行啊,那些东西具体的实现细节啊,不重要。好,给这个工程取个名字啊,叫做 doe monorepo 啊,我用这个命名空间吧,因为纸包的话一般都是用命名空间啊, back end, 然后简单的写一写吧,比方说这里有个 s r c 啊,有一个 index 点 t s 啊,来一个打印吧,打印 hello from back end 啊,不要什么 from 了,就 hello 就 行了。然后呢,我们由于要需要在 load 环境里边啊,把它变成 e s module 的 格式,所以给大家加上个 type 啊,对,毛九啊,这些都是工程化的知识啊,跟那个摩洛瑞普都没啥关系。好,简单建立一下吧,比方说我再给他复制一份到下边来,这里名字改一下啊,改成 fronten, 然后这里边不变吧,好,复制一下到这边来这边来,好给它稍微修改一下啊,这个是 components, 然后下边这个是 utos。 好, 这样子呢,把工程结构稍微给它建立一下好,差不多了啊,这就是咱们 monorepo 的 一个大致的工程结构。那么接下来我们就考虑到底有哪些事我们要在工程里面去做,到底要做什么样的管理,一个个来呗。 首先第一个问题就是环境版本锁定的问题,因为我们都在一条业务线啊,往往他对一个环境的要求都是一致的。什么叫环境的要求呢?主要就是你用的是啥包管理器,你用的是啥那个 note 版本 啊,这就是环境的基本要求,这个要求呢,一般都是一致的,甚至呢,在一条业务线上,他很多钱的框架都是给它定死的,包括一些测试框架都是定死的。我很少看到一条业务线上有千奇百怪的技术框架, 一般都是统一的,为了最大程度的避免去找麻烦,对吧?首先呢,我们把环境给他固定啊,就是 low 的 版本,还有 n p m 的 版本和 p n 的 版本,那么这个版本怎么来固定呢?听好了啊,凡是你要对很多的纸包做统一处理的地方,全部在跟工程中完成, 不在纸包中完成,这个好理解吧,你只有在跟项目里边去完成统一的配置,统一的管理,那么才能保证所有的纸包都是一致的。那么在跟工程里边怎么来锁定这个版本呢?非常简单,到这里边配置文件里边把这个配置给他加上就完事了,当然这些是具体的实施细节啊。完了,遇到了问题呢,是要锁定版本,解决的办法呢?是在跟工程中去锁定, 用到的技术呢?是在派克检测里边去进行配置,那有没有别的技术方案呢?是在派克检测里边去进行配置,那有没有别的技术方案,爱用啥用啥。 我这里呢只是选择了这个 n p m 官方提供的这个字段啊,严禁在这里边去指定啊。 log 版本必须要哪个范围?你也可以把它定死啊。我这个不定死的啊。兼容吧,大于等于。这都行。 好,定好了过后呢,如果说你的版本不一样,他就会给你报出一个警告啊。比方说吧,咱们回到根目录啊,我们来看一下目前的 log 版本啊,目前 log 版本是倒是可以,我给它换一下吧。呃,换成二十, 好的版本该换 d 了。换 d 了过后我们再安装一下啊,随便安装一个吧,比方说一会儿我们要安装那个 type script, 所以 说我们这里杠 d 啊,注意要加上一个 w 啊,就是加上这个 work space root 对 吧?我们要跟目录里边去安装一个 ts, 因为一会儿呢,我们要对整个项目进行 ts 的 统一配置,所以加上这个。但这个呢也有简写啊,就是横杠 w 或者是你合并才起来写啊,前面一个横杠 d, 然后再加上个 w 也可以。我们该安装一个 type script。 举个例子啊, 好,安装,你看现在是不是一个警告,他说不支持的引擎啊,他想要的是什么? log 版本是大于等于二十二的结果呢?我目前的 log 版本呢,是二十,他会有个警告啊,那么看到这个警告呢,也可以修复一下。那如果说你希望更加严格一点,不希望看到警告,你直接给我报错就最好的,那我把这些删掉啊,那怎么弄呢?那你给他加上一个特殊的文件啊,叫做 npmrc, 这个文件呢是 n p m 官方建议写入的一个文件啊,这里边写一个配置啊, n p m 的 配置,你把这个它其中一个字段叫做 ints, 表示严格的环境给它设为 true。 设好了之后呢,当你使用 p n p m 的 这个保管利器的时候呢,它其实也会读到这个文件哈,也会读到 n p m 的 配置。那么你这个时候呢,再去安装这个 t s, 你 可以看到 它直接报错了,它说不支持的环境。那么这个时候呢,你就可以利用那些 load 版本的管理工具去切换 load 版本啊,把它切换到一个合适的环境就可以了 啊,避免环境不一致。好,这里呢,我们把它切过去啊,比方说又是二十二,好,切过去过后我们再来安装,你看一下是不是没问题了?好,这是个环境版本的控制啊,这个是一定要做的好,那么接下来呢,是这个 ts, 因为 ts 的 话,我们上了一定规模的项目的话,是一定会上的,哪怕你的业务系统里面不上 ts, 你 的公共库总要上 ts 吧, 不然别人咋用啊,你这个玩意儿,很多同学觉得 ts 不 以为然,那是因为你们写的是业务系统,业务系统的话倒真的是无所谓,你用 ts 的 话也影响不了啥,但是你公共的地方,要给别人用的地方,一定是有完整的类型提示的。你就这么想吧,如果说吾友他不支持 ts 的 话,你看一下吾友的实战率会有多少。 那么这些公共库的话,我这里随便只写了两个啊,实际上一个中型项目里边,他公共库是有很多的,我这里随便写了两个啊,有个意思就行了。 那么像这些他里边的 ts 呢,大部分的配置啊,他都是一致的,所以说我们 ts 呢,也要加入到统一的管理,所以因此呢,我们需要在跟目录里面去安装这个 ts 啊,安装一下啊,这两个库不用我去解释的吧,应该不用解释吧,就是你们学 ts 的 时候一定是学过的啊。好,走,安装好,安装完了过后是不是要配置,对吧?我们建立一个 ts 和一个接收文件, 这个配置里面写啥呢?其实就是写一些公共的配置,就写到这儿,比方说我们这里随便加一些吧, 复制过来,粘贴过来,这些字段我就不一个个去解释了啊,这是 ts 的 具体的东西,我们刚才说了,重点关注一二三五,具体的技术实施,那是需要你们单独去学习的哈。 我们整个 model report 里边包含了大量的工程化的知识,这些知识呢,绝大部分它都包含在咱们的高薪课和架构课里边,其中架构课占绝大多数,因为这毕竟是架构的知识嘛,我在短视频里边呢, 我们要去细化的去讲这个技术的具体实施,那是因为他涉及到知识太多了,我也不确定来听的同学,你们有没有这样的知识,你有这样的知识呢,我就不需要讲了,你没有这样的知识呢,以后我要讲的时间也不够,但是不是说这些知识不重要哈,这些知识是非常重要的,你要做架构开发的话,这些知识少一个都不行。所以同学们要拿高新走向高新岗位的话,就一定要去 看一看咱们的架构课哈,哪怕就看一下架构课的目录,对都是有帮助的,至少他指明了你将来要学哪些东西啊。这个架构课呢是咱们的付费课程之一, 我们除了付费课程之外呢,咱们还有一些福利课程啊,有完全免费的课程,也有一些小额的课程,几块钱十几块钱的。那么这里边也有架构的知识,也有高新课的知识都有。反正我们整个前端课程呢,是从零到前端毕业的课程,包含了前端最重要最核心的所有内容, 不管你是在哪个阶段,哪种情况,在我们的付费课程里边和我们的福利课程里边,总能找到你需要的。关键是呢,你要能够找到咱们的组织去领取或是了解这些课程。 怎么找到咱们在咱们账号主页啊,点击头像进入账号主页,根据提示来找到咱们就可以了啊。好,配置好了这个统一配置之后呢,那么这里边的 ts 呢,就已经生效了啊, 这里边 ts 他 就会按照外边统一的配置来进行验证和变异,但是呢保不起呢,每个工程呢,他有自己的特殊配置,比方说这个后端啊,你看现在后端报错了是吧?为啥报错呢?因为这个统一配置里边是没有配置,这个后端所需要的类型没有啊, 那怎么办?那后端是不是在一个 node 环境里边,它是不是需要 node 环境的类型啊?那我们在后端去建立一个 t s config 不 就完了吗? config 啊,其实这里的做法呢,有很多,它可以在具体的纸包里边去创建这个 t s 配置,也可以呢,在这里进行统一的配置,根据不同的项目呢,进行不同的配置也可以啊,都可以 选择是多种多样的啊。那么具体用哪种方式以及不同的方式,到底怎么去搭建这个配置,那就需要具体的工程化知识了啊。比如我们这里呢,就简单一点,在纸包里边去写这个文件,那么这些具体的 ts 呢?呃,它会依次向上读,对吧?读到第一个 ts config 这个配置, 他就会读到这个。好,那么这个呢?我写一个啊,呃, extens, 它继承嘛,它继承至哪呢?继承至上面的目录啊,就是 t s cafe 继承至统一的配置。然后呢,它自己呢,有一些独有的配置啊,给它覆盖一下,比方说它的 types 类型嘛,类型我给他加上 load 呀,对不对?然后呢, lab 呢?它的 library 呢?给它设置上 esnext 就 可 可以了。好,它就不需要 dom 了啊,因为它是 node 环境嘛。好,再加上一个 include s r c。 好, 写好了之后呢,咱们再到这边啊,来给它重启一下存储环境。好,你看这个 console 是 不是出来了,对吧?那么这里还可以使用 node 环境,里边的什么 process 是 不是都可以用了,对吧?就不会报错了啊? 呃,然后这个前端 front 是 不是一样的?也是一样的啊?来一份。那么这一块呢?前端这一块它就不需要 node 环境了啊? node 环境要它干啥呀?那就给它加上个 node 环境, 加上 dom 之后呢,你看一下,这里边不就可以使用那个 windows 了吗?对不对?你看 log 环境里面就不能使用 windows 啊? log 环境里面利用 windows 他 没有啊。但是呢,前端环境里面就可以使用这个 windows 了,这些具体的配置啊,你们自己去配。总之你要知道这么一种情况, ts 这一块呢,有公共的,也有具体的。那具体怎么安排?这个东西你们根据工程化的知识去搞定就行了。 好,这是关于 ts, 我 们要进行统一管理。那么除了 ts 之外呢,还有一些代码风格和质量检查。 这里主要是三个啊,一个是 printer, 一个是 e s link, 一个是拼写。检查啊,就主要是三个。那么这三个东西呢,肯定是整个项目所有的纸包全部通用的,因此呢,我们仍然会在工程的根目录下面进行管理。那有人说,那不对啊,袁老师,那这些玩意儿我还需要做啥吗?我这个 v s code, 这不是有相关的插件吗?安装插件不就完了吗? 那不行啊,你凭什么保证每一个小组成员他都安装的是统一的插件呢?你怎么保证呢?你没法保证,你靠嘴皮说吗?靠它发誓吗?这个玩意最好是能够用一些命令来进行检查的,比如将来在 case 提交的时候啊,或者是在 c a, c d 的 生产线的时候呢,在那些关键的环节,通过这些命令去卡你一下对吧?你能不能通过检查,不能通过给打回来 是有自动化的需求的,所以说你不能光靠这个 windows 插件啊,插件的话只是让你在本地变现代码的时候方便一点啊,能够方便的及时的看到错误和修复错误,更加严格的肯定要进行命令式的检查的, 所以说咱们需要去安装相应的库哈,首先呢,安装这个 printer 好, 咱们把 printer 先安装了啊,同样的是开发一代啊,杠 t, 然后在整个工作区的根部下面进行安装,安装好了之后呢,这个 printer 需要写一些配置啊,咱们把配置给他加上,创建一个配置文件 啊,就这个 preiter configure 调介示,就是 preiter 的 配置文件,有多种格式哈,那么这去需要具体的知识了,具体的知识呢,咱们不细扯了,好把配置给加上,这里边配置呢,我每一行都是写的注示的哈, 同学们可以根据自己的需要进行调整。当然这个 preiter 呢,它有更多的配置,你可以去采用它的官方文档啊,就这个官方文档,在这里面可以看到所有的配置,每一项到底是什么样的意思 啊?这里很多啊, pretty 是 做啥的呢?其实就是来控制代码格式的,你所有人都在同一条业务线上,你至少代码格式得统一吧,不管你写的是前端后端格式上统一啊,多少个字母要换行缩进的字母数量对不对?结尾要不要用分号格式得统一啊, 是吧?好,把配置好了过后呢,这涉及到一个问题,就是并不是所有的代码都需要通过他的检查,因此呢,我们要移除一些代码的格式,都已经一塌糊涂了, 还需要用它来检查吗?不需要了,所以说我们要排除掉一些文件哈,那排除掉文件的话,是这个一个 no 文件啊,就是 pretty 一个 no, 好 建立这么一个文件。那么这里边呢,把那些不需要检查的东西呢,给它排除掉啊,比方说像 this 目录啊, public 目录啊,就这些反正你不需要检查的地方,你给它配置上就行了啊,我这里随便写了几个 好配置好了过后呢,咱们来试验一下啊,它能不能生效?我们需要在命令行里边加一个脚本,就是个另一只脚本。好,这里给它粘过来啊,在这里 看一下这个脚本啊,我配置了这么一个脚本。呃,就是你运行一下 printer 的 命令,然后呢进行重写,就是按照正确的格式给你把文件重写了。那么这里呢,是一个文件的范围,要检查的文件范围 啊,凡是像这些后缀名的,我都要进行检查,凡是不满足要求的,它会自动重写。那咱们来试验一下吧,比方说我这里呢,给他来一个打印吧,好了,好,比完我不写分号。好保存 啊,你看,就像 vs code, 由于我已经安装了插件了哈,其实也不是安装插件,所以我进行了个配置啊,叫做 format unsafe, 就是 保存的时候自动格式化,而且格式化的时候呢,它是按照 printer 来进行格式化的。你看我这里用 default format 默认的格式化器是这个 printer, 所以 说它自动按照这个配置给你修复了啊,这是 vs code 的, 像那些代码编辑器给你带来的一些省事的点,那如果说没有这个自动的代码编辑器给你带来的一些省事的点,那如果说没有这个自动的演示一下命令的效果啊, 我们在工作区里边把 format on save 呢,给它取消掉,那么这一块会建立一个 vsco 的 配置,这里把它取消掉了啊,好,那么现在呢,我们再把这个分号去掉,然后呢保存,你看是不是没有自动格式化?那接下来我们来用一下刚才那个命令啊, p n p n 来运行命令啊, int ptr, 好, 你看,所以通过这个命令之后,它把我们的代码仍然重新格式化了,对吧?也就是说我们用 vsco 的 编辑器,它能搞定,用命令也能搞定, 但是用命令搞定它会有额外的好处,什么好处呢?我们之后就知道了啊。好,咱们这里呢,暂时把这个 format on save 把它设为 true, 好, 设置回去啊,刚才只是演示一下效果。好,那么现在的 printer 搞定了,加一个 yes link 啊,有些朋友呢,把这个 printer 跟 yes link 呢,容易搞混淆,它作用是不一样的啊, printer 的 作用呢,主要是检查代码的格式,而 yes link 呢, 主要是检查代码质量的质量和格式,它不是一回事啊,就好像说你的生活习惯和生活质量的质量和格式,它不是一回事。那它们之间有没有交集呢?也有交集, 比方说你这个分号默要不要加分号,他说他是一个代码风格,说他是一种代码格式,能不能说得通?可以说得通,那说他是一个代码质量是不也能说得通,因为不加分号可能会造成一些隐患嘛。 是也能说得通,他们之间会存在一些交集啊,大概是这个样子,就是这是 pritter, 这是 yes link 啊,他们中间呢,会存在一些交集交叉的部分。好,现在呢,我们搞定了 pritter 啊,现在我们要搞定 yes link。 yes link 呢,安装的东西就比较多了哈,把它复制过来,先安装再说。好。安装 好这些东西到底是啥呢?其实这就涉及到 e s n t 的 相关知识了啊,它同样是在我们的架构课里边啊。呃,简单看一下下边这个表格吧。这个呢,就是 e s n t 的 核心库啊,就是这个啊,下边这个 e s n t g s 呢?它是一个官方的规则集,因为我们知道 e s n t 里边是一大堆规则吧,它靠的是一大堆规则来检查你的代码质量。 那规则很多啊,他几百个,上千个,你一个个是手写吗?他都写疯了。所以说我们一般会用一些现成的给你写好的规则。那么这一块呢,是针对 gs 代码进行检查的规则啊,引入它的规则级。然后呢,这个 globos 呢,是一个全剧变量的支持,如果说你没有这个的话,他可能对一些全剧变量, window 啊, documents 呀,还有 note 环境边的全剧变量他就不支持了,不认识了,他可能要给你报错。 然后 t s 是 esprint 呢,就是对 es 检查的支持。然后这个呢,是 node 的, 就是类型。哎,我们之前安装过了是吧,那就没有必要再安装了。呃,这是 printer 集成,我们刚才说了, printer 跟那个 esprint 呢,它之间是有交集的,对吧?那么这个交集部分该怎么处理?有没有可能有冲突,对吧?它有可能有冲突的, 那第一个呢是一个 esprint 的 插件,加了这个东西过后呢,就是 printer 的 错误呢,它会报到 esprint 的 错误里边来,然后第二个呢是当 esprint 的 格式来走, 避免冲突。然后呢,下边这个是对无用的代码的支持啊,因为之后呢,我会简单的去写一些无用的代码啊,写一些市力代码,所以说我们需要对无用的一些单文件组件呢,进行 yes 链子的支持。好,大概就这么些东西。好,接下来就是要写这个 yes 链子的配置了啊,把配置文件建立好,好, 建立好配置文件在这啊,配置文件它有很多种格式哈,我们这里呢使用的是一个 gs 的 格式,我们把这个复制一下啊, 复制好粘贴过来。这个配置呢,我就不带着大家一一去读了哈,简单的看一下吧,你学这个一一读的话,你就需要 es 链子的具体知识了啊,这些东西呢,具体在我们家库里边可以去了解一下啊,简单看一下啊,就是你要去导出一个配置,这 配置里边呢可以写多项啊,这是第一项配置,第二项配置,第三项配置,后边还可以写第四项,第五项。我这里呢就写了三个,一个是通用配置,一个是针对前端代码的配置,一个是针对后端代码的配置, 我们工程里面都有嘛,对吧?那么通用配置里边自己看吧,要忽略掉哪些文件,哪些文件我是不进行检查的?然后呢?继承了哪些规则,使用了什么样的插件啊?就是 pr 这个插件。然后呢?对一些语言的类型配置啊, 比方说 x 码语法的版本用的是哪个版本?用的是最新版,模块化用的是哪种方式?也是毛球这个方式啊。解析器这一块,就是以 ts 的 解析器给它配置上啊,就是那些乱七八糟的。那么这一块呢,可以写一些自定义的配置,然后这个哇啊, 禁止使用包,你可以自定义在这里去制定一些规则啊,都行。那么这一块呢,是前端配置啊,前端配置的话,我一跟你说了吧,就是加了一个什么 globos, 因为前端的话,它是个浏览器环境嘛,它必须要有 windows。 那 如果说你不加这个的话会怎么样呢?比方说啊,前端这一块啊,你看我前端的范围,就是验证的范围是在这个目录下面和这个 components 目录下面,因为这两块会涉及到前端代码, 对吧?它的验证范围是这两块,那么如果说你不进行这个配置的话,有 ts 来验证,那如果说你 ts 的 话,给它写 windows, 你 看一下 随便写个啊,你看是不是报错了。 e s 链子它不能识别,它不知道这一块能写 windows, 它不知道有这个全剧变量。所以说你把这个 global 给他加上啊,加上 global 之后,你看就不报错了啊,就是这些小细节啊,就不一一说了啊。那表后端配置的 global 应该是啥呢?应该是 note 环境的 global 啊,就不一一说了啊。好,总之把配置给他写好啊。 好,同样的,我们给大家加上一个脚本命令,好复制一下啊,这东西细致末节的我不一一去配了。好,那么现在多了一条命令了啊, yes link。 哎,我这里是不是写错了,怎么写成两个 printer 了啊?这应该是 yes link 啊。好,我把这个这里改一下啊。好, yes link。 好, 咱们来试一下这个脚本吧。呃,比方说我们刚才的这个 新建个文件啊,您这个是 g s 呃,来一个打印 process and 打印这个对吧。啊,为什么我要单独写个 g s 呢?因为如果说在 t s 里面写的话, t s 肯定是写不出来的,肯定是要报错的。为啥呢?因为 t s config 里边它就没有这个 load 环境对吧?就没有配置 load 的 环境,肯定是要报错的,所以为了同学们区分是 e s link, 它报的错误,所以说给它弄了个 g s 文件啊, 你知道什么意思就行了啊。比方我再定一个变量 y, 那 你看 e s link, 它不能让你使用 y 是 吧?那么这些都是 e s link 的 错误。好,那咱们来用命令验证一下啊。 p m p m n t e s n t。 好 走,那你看是不是发现两个错误,一个 process, 一个是这个变量 a, 它不能使用啊?这个 a 还是这个问题啊?它是说没有被用过啊,因为它这里直接给你改过来了,我写的是 y 对 吧,我把这个自动格式给它去掉啊。 force 好 保存还不行哈,因为我这个 bios 的 环境表还按到这个 e s n t 插件的,所以说有这个 e s n t 插件,它会自动给我修复啊,讨厌啊,这个 算了吧,就这么地吧,反正你知道这是 yes 链次的错误就行了啊。好,你看把错误包出来就行了啊,好,那么现在呢? yes 链次这一块搞定了啊,那现在是拼写检查,呃,这个呢,是一个不大不小的事吧, 主要就是做什么呢?主要就是做拼写检查的,你写些单词可能写错了,比如说以前我讲 c 语言的时候,我经常见到一个错误,是啥?写个没函数,本来是这样写的, 哎,老师为什么运行不出来呢?很多时候是为了检查你单词也没写错的,他 影响的是代码的可阅读性。好这一块呢,我们可以使用一个 v s code 的 插件啊,叫做 code spell checker 啊,我已经安装好了啊,所以说你可以看到我们刚才的工程里边已经见到过一些了,比方说像这里,你看这里出一个绿色的线,对吧?这就是 v s code 的 那个插件也出现了一个错误, 他说这个未知的一个单词,实际上这一块呢,不仅仅是 v s code 的 插件可以做,而且通过一些库和命令也可以做,实际上这个插件就是在利用这个库来进行检查的。 按照之前我们的理论呢,就是我们尽量的把检查呢配置成命令,这样子呢,方便在我们的软件开发的各个关键环节通过命令自动完成检查。 所以说我们需要安装些库啊,然后呢把它生成命令库呢,主要是两个核心库呢,是这个 c spell 就是 个拼写检查的库,那么后边呢,是他的一些插件啊,比方说像那个乱序甲文,那这里边就没有一个合法单词,但是呢他又必须要存在,那我们就把这个乱序甲文呢这个插件给他安排上,其实这个插件是啥呢?就是个字典,到时候他检查的时候呢, 排除掉字典里边那些对应的单词,不要问我什么叫乱序甲文啊,那个就需要你们自行去查阅了,这个东西应该是你们学 atem 的 时候就应该学习过的。好把这个东西安上。安排好了之后呢,还是老规矩啊,需要写一个配置啊,给他生成一个配置文件 啊,就在这里配置好。这个配置呢,我直接把它复制下来啊,来看一下关键点啊,下边这个好理解吧,就是排除掉一些目录,就有些地方我就不要去进行检查。 note 就是 里面检查啥呀,还有这个地址目录打包的结果里边检查啥呀?那里边就没有一个单词是合法的, 压缩过后的就别检查了哈。呃,主要看上边啊,上边呢,第一个是插件啊,就是把我们刚才安装那个段数甲文的插件给它导入进去,这插件里边其实就是提供了一个节省,你可以看一下吧。啊,这里边有一个 csp, 一个扩展啊,你看这个插件的节省里边,它就是指向一个 tst, 你 看一下, tst 其实就是一个纯文本文件,这里边每一行写的单词就表示一个合法的单词,意思是啥呢?意思就是告诉这个拼写检查的库,这个文本文件里边的单词都是合法单词,你看到了不要大惊小怪,它是正确的,就这个意思啊,那么除了这个插线给我们写的字典之外呢,我们还可以自己去配置一些字典, 比如说这里呢,我该学个字典的名字,名字叫做 custom dictionary, 表示自定义的一个字典,那么字典的路径在哪呢?在这 啊,这样路径在这,所以说我们这里呢没有这个路径,给他建立这么一个路径,意思就是啥呢?意思就是说我们可以把一些他可能认为是错的单词,但是呢,我们认为是正确的单词,就写到这个字典里边啊,这是个自定义的字典,字典里边定义的东西呢,就是正确的啊,就是合法单词啊,主要是呢,避免他有一些误报啊。好,这是字典, 那比方说吧,咱们举个例子啊,呃,这里边你看,呃,比方说我们现在呢,首先看一下这边啊,这个拍剪辑里边,你看是不是没报错了?为什么没报错?因为在这里配置的时候是把这个东西给他排除掉的,你看是不是排除掉的,对吧?你不要去检查这些文件, 主要是检查代码文件,是吧?那比方说我们这里呢定义了一个变量吧,名字叫做度一啊,然后打印这个变量,你看它这里出一个字典的问题,对吧?单词不认识,你是不是写错了呀?那这个时候呢,如果说我们在字典里面给他加上一个度一,好保存一下,字典里面有了,你看重新启动一下数组,是不是就不报错了?现在, 对吧?现在就不报错了,因为字典里面有。其实这一块呢,还有一种简单的方式啊,比方说字典里面没有它报错吧,那么在 vs code 里边指着它,它可以进行快速修复的。这个快速修复 前面是让你改单词啊,他认为你单词写错了,改成别的单词,然后下边一个,你看 add doe to dictionary, 把 doe 添加到一个字典里边, the custom dictionary, 点击它就会自动帮你添加进去。你看字典里边自动有了 啊,主要是起这么个作用啊,当然这个自动修复的功能啊,需要安装那个插件才行啊,这插件的名字也就是刚才说的这个 code spell checker 啊,你搜一下这插件。 好,这是拼写检查,然后呢,我们同样的啊,给他写上一个检查脚本,好把脚本给他加上,那么现在就有三个检查脚本了是吧?好,这是 spellcheck。 好, 你看检查啥?检查所有的 packages 里边的,或者是 apps 里边的,所有的这些文件都要检查一遍啊,如果说以这一块啊,不 e a 啊,比方说随便写个吧,然后呢,来检查一下啊, p n p n int spellcheck 走,你看是不是出现了一个未知的单词,对吧,检查就无法通过。好,差不多了啊,那么这里呢,就是关于代码风格和质量检查, 我这里就随便举了三个例子啊,具体怎么安装的,具体怎么去配置的,其实并不重要,重要的要体验一下我们要做哪些事情,有这些事情要做,那具体用什么样的技术去做,具体做的方式,那就根据你不同的项目自行去安排 好。那么接下来呢,就是咱们的下一个话题, get 提交规范。因为我们整个工程啊,它是在同一个 get 仓库里边,那么可能涉及到不同的团队里边,比如说这个团队开发后端,另一个团队开发前端,然后再有些团队的架构基建组开发这个公共库, 朋友团队在这个工程里面进行开发,那么他们都会做提交,那提交规范也得统一啊,所以这一块呢,会涉及到记者的提交规范啊。其实像我们讲的这些工程的规范搭建的话,都是属于咱们架构课的里边内容啊,都在架构课里边,其实架构课里边有录播课,也有直播课,录播课里边讲过,直播课里边也讲过,这是咱们近期的一些架构课的直播。呃, 在哪呢啊?在这啊,前端项目规范这边基本上就包含了整个前端架构里边如何去搭建工程的所有东西都在这里边了啊。其实我现在给大家讲的这个呃,视频呢,也就是从这里边截下来的,所以更加详细的东西啊,朋友们可以去找找,咱们去了解下架构课, 找到咱们的方式啊,别忘了在咱们账号主页点击头像进入账号主页,根据提示来找咱们就可以了啊。好,这个 get 提交规范呢,你不能口口头约束,口头约束是不管事的,一定要有强约束力,就是你不按照规范来做,你就提交不了。那具体怎么做呢?这里面会涉及到一些库哈。呃,我们首先把 get 仓库建立好,首先我们建立好一个 get 一个 word 文件, 这个文件呢就没什么好说了啊,我就直接复制粘贴过来就行了啊,那些常见的把它排除掉可以了。好,排除掉。然后呢,把 get 仓库抽象 get in it。 好, 那么接下来怎么来约束它提交呢?这里面会涉及到第一个库,叫做 committeeon, committee 是 吧?提交是吧? committeeon 这个库呢,就是来检查提交的这个库呢,它也会涉及到一大堆的插件啊,我们把这个库呢先安装好再说,复制一下啊, 好,来安装啊,这个警告不用管他啊,这个警告呢,是说你现在新安装的东西呢,跟那个 log 文件有点不一致了,你只要重新 pmpi, 重新安装一次就没事了啊,你看就没事了,再来一次啊, pmpi 你 看就没事了。 好,下面呢,我又解释啊,就是安装这些库到底是干嘛的?核心在哪呢?核心在于这个库和这个库,这两个库呢是咱们做提交检查的核心, 没有这两个库就没法检查。那为什么是两个库呢?其实跟那个 babel 是 一样的道理,一个 babel 不是 一个 babel key 吗?对吧?还有个 babel core 是 吧?一个写的是核心代码,一个呢是把它写成一个命令行工具,给它包了一层。其实这种方式啊,也可以提醒同学们,将来要去写一些角色家工具的时候呢,也可以把它分开。一个是 core 核心, 纯属的借代码,不涉及到任何的命令行。一个呢是给他包一层壳子,用命令行的界面来进行交互,然后剩下的这个呢,它是基于这个 communication 的 一些配置,可以写好的一些配置啊,你不用去重复写了啊,但是这个配置呢,到时候它的提交是一个英文的交互,那么你把它变成中文的话,可以使用这个库 啊,就是不同的库有不同的作用嘛。好,那么接下来由于这个库呢,它给你提供了一个命令啊,叫做 gitcc 的 命令,这个命令呢,是这个库来给你提供的哈,因此呢,你可以写个脚本,就是 commit gitcc, 好 给大家复制一下啊。 来,好,有了这个命令之后,我们将来再提交的时候,可以使用 p n p m commit 来进行提交。好,我再次解释一下这个命令啊,就是 commit 这个命令运行的时候呢,它会运行那个 disk c d 来进行提交检查。那它具体怎么检查的呢?它需要一些配置啊,首先呢,在编辑检测里边需要做一个配置,就是 config 这个配置,然后呢,还需要个配置文件啊,就这个配置文件, 咱们把配置文件加上这些具体的实施细节啊,我就不一个个去讲了啊,不然的话,这个视频就变成讲一些具体的库的使用了,那就没啥意思啊,咱们着眼的是一个宏观格局,就整个工程他要解决哪些问题,那么具体是怎么解决的不是我们这个视频的重点哈, 那如果说这个视频我是讲这些具体的库的话,我可以给你讲的很细,一行一行给你讲不同的配置有什么样的效果,但是呢,我们讲的是整个工程搭建,所以说我们就不去纠结这个细节了啊。好,那么这些配置配置好了过后呢,咱们再来运行这个命令啊。 get, 首先把这些 文件加入到占存区,好,加入占存区过后呢,现在要提交使用 p n p m command 来进行提交。那你看提交的时候啊,它上面包了一个警告,先把它警告消除吧。这个警告说的是啥意思呢?就是我们这里的配置啊,都是使用的是 e s module 的 方式来导出的,而不是用 common g s 来导出的, 而我们这个排减接受里边呢,它没有支持那个 es 幺九,所以说这里呢,需要给它加上一个 type, 等于幺九,告诉它不是 common js 啊,是 es 幺九,不然它配置文件它读不出来。好,来,再来 p n p m com。 那 你看,这也没报错了是吧?你看是不是有交互功能了,可以在这里进行选择,比如你这次提交是干嘛呢?是工具啊, 回收选择的影响范围啊,我这里配置文件里边写了啊,影响范围有哪些?在下边影响范围就是 get, 提交的时候不是有个 stop 吗?就这个东西啊,有整个工程的,有有后端的,有前端的,有 components 的, 有 utos 的 啊,就对应到这些文件夹,你到底是提交了哪一部分啊?我这里就随便选一个吧,选 root 吧, 因为我现在是对整个工程进行控制,然后简要描述描述一下呗,描述出使化工程好,回车确认提交 y 确认好,现在就提交了。那么这样子呢,它生成的提交的信息呢?是标准化的啊,你看一下它生成的提交的历史记录,你看第一个单词 sure, 是 不是一个标准化的单词? 是工程化的一些杂项啊,然后呢,后边是提交的那种,影响的范围是 root, 这样子呢,用这个工具就不至于说你写些乱七八糟的提交文本啊,它一定是标准化的。好,这是这个 committee。 好, 后边这两个库呢,一个是 hasty, 一个是呃, link state, 这两个库呢,往往会联合起来使用哈, 我讲讲这两个库,其实我们目前这个项目里边呢,其实选一个就够了啊。呃,但是我两个都讲一下,因为绝大部分工程看上去呢,好像用不到这两个。一个个说吧,首先这个 hasty hask 用来干嘛的呢?它可不是宠物哈,它是用来去连接这个 git hook 的, 你没学过 git? git 里边不是有勾子函数吗?对不对?就在提交之前,你可以做一些事,提交之后可以做一些事。那么这个 hask 呢,主要是连连接这个的,你可以去自定义提交之前去做哪些事,提交之后做哪些事。我们通常情况下呢,用这个 hask 呢,主要是在提交之前 去做一些验证,验证没通过就不要你提交。好,那咱们把这个库安装一下啊,好,安装一下这个 husky。 好, 安装好了之后呢,我们要做一个初步啊, husky in it。 好, 初步完了过后呢,你会发现它这里多了个目录了啊,就是 husky 这个目录里边呢,它就有一个钩子,叫做 pre comment。 那 么这里边你可以写命令,就是你提交之前它要运行哪些命令。 那比方说吧,我们就给他写上这个几个命令,刚才我们不是写了几个命令吗?对不对? link, 这几个 link 我 们都把它运行一遍。如果说这个几个 link 没问题的话,我是不让你提交的 好。比方说吧,咱们这里呢,给他改一些内容啊,这里就有问题是吧?这 spell 它是检查通不过的,那么咱们来提交再试一下。呃,我们这里呢,改成 a b 吧,因为刚才已经提交成功了,现在改成 a b 啊。好,那么这一块来 get and。 走啊,添加到战城区,然后再来一次 pmpm com。 提交好还是工具 root 加上了一个 hash。 走走好,你看这个时候,你看它是不让你提交的,为什么运行到什么?运行到这个 controller 命令,还运行了什么 e s lint 的 命令,你看这些地方都必须要进行修复。那好吧,我们比方说 e s lint 的 命令,我先给它修复了啊,这个 g s 这里边给它干掉啊, 再来提交工具。好,再来 git add, 然后提交工具 root hashkey, 添加了一个 hashkey。 好, 走走好,现在 link 的 这一块没问题了是吧?但是呢,这个 espile 单词检查也通不过了,你看, 体会到了这个命令的好处了吗?它可以自动化的完成检查,避免提交一些错误的代码,或者是低质量的代码。这是命令的好处啊,它可以关联到一些自动化的处理,你光是用一个 vs code 插件的话,肯定是关联不上的。 好了,这就是 husky 的 作用,它本质上就是一个搭载这个 git hooks 的 钩子,你可以自定义做任何事情啊,在这里边,正在这里边去运行一段你自己写的 node 脚本都是可以的,比方说你用这一块用一个 node js 啊,运行某一段 js 没有问题,你自己爱做啥做啥都可以。 好,这是哈士奇啊,好,下一个 link stage。 我 再次重申啊,我们目前这个市力工程里边,其实这两个东西呢,倒是没有必要连着用,但是很多项目里面都是连着用的,所以两个都讲一下啊,因为我目前市力工程比较简单。好安装这个啊,安装完了过后我来给你解释他做啥先安装好,安装完了, 然后呢,这里呢,需要去配置个命令啊,他这个库里边会给你提供一个命令,叫做 link stage, 其实看名字的,你都猜到他在做啥了。然后呢?这里需要配置文件啊,把配置文件给他加上, 来个 touch。 好, 配置文件在里边。把配置给加上好说一下啊,他到底在干啥?他到底在干啥呢?就是个 link state 的 呀,他跟你提不提交没有任何关系。他做的是什么呢?他用来检查赞存区的文件,他就在做这个事的,你提交之前不是要把它先放到赞存里边吗?对吧?我们这里把更改放到赞存里边。好,你看赞存里边是不是有一堆文件呢? 那么你可以用这个 link stage, 你 看 link stage 什么意思?检查吗? stage 什么意思?占存吗?就检查占存区,占存区有这么多文件可以进行检查,怎么检查呢?就靠这个配置,非常简单,比方说像这些后缀名,我就运行啥啥啥来进行检查,像这些后缀名,我就运行啥啥来进行检查,就这个意思, 可以做一些精细化的配置,跟提不提交没关系。比方说现在我没有提交,但是有战存区了,那我就可以运行这个命令来进行检查。怎么来运行呢?刚才我们配置这个命令,对吧? pre command, 就 这个命令随便一写啊,一般来说我们都是在提交之前进行检查嘛,就这个命令,随便你写, abc 都可以。来,咱们来看一下啊, p n p m abc 不 就在检查吗?你看现在检查没通过,他告诉你啥啥啥没通过?啥啥没通过, 对吧?他怎么检查的?就是看你这里的配置啊,这些文件呢,交给他来检查,这些文件呢,交给他来检查,甚至一样,你可以去自己写脚本,如果说有些比较复杂的检查,比如说一些敏感词啊,对吧,乱七八糟的自行写脚本去检查,没有任何问题好不?一错了啊,好,咱们把命令配置回去啊, 我顺便说一下,为什么我这里要把命令写成 precommit? 因为写成这样的命令过后呢,有个好处,当你运行这个 git c z 的 时候,就运行 commit 的 命令的时候,它这个东西吧,它里边有个内置的机制,就它提交之前,它就会自动地运行一下你这个 precommit 这个命令 它会自动运行。所以说你这里把它写成 precommit 呢,你就不需要这个之前那个 hashkey 了,这一块儿都可以不用写了,你看,我现在再来一次啊, p n p m commit 走,你看是不是在检查它会自动地运行这个 precommit 命令,明白了吧? 但是为什么我说那个 hash 我 们经常还是要连用呢?这是因为这样的,因为啊,你目前呢,是通过这个命令来进行提交的,那万一他不通过这个命令呢?他通过什么命令? kids committee 这个命令呢?不就绕过了你这个库了吗?是不是就绕过了这个库了?那这个时候要不要检查他肯定还是要检查呀。那是不是这个时候就关联到这个 kids 的 沟子了?是不是关联到这个沟子了? 所以说,往往呢,这两块是联动的哈,不过呢,联动呢,这边涉及到一些细节啊,可能还会去多写一些脚本。总之呢,这些问题呢,我给你解释清楚就行了啊。就是这个东西,它是关联到地址的钩子的,而我们这个玩意 int state 的, 它是来检查占存区的。这里其实最简单的连用方式就是我们这一块的钩子里边运行一个 pre comment, 再运行一次,不过呢,这样子呢,就会检查两次。为什么会检查两次呢?你想啊,你运行这个 command 命令的时候是不是运行它?它是不是要先运行它?那么它运行它的时候是不是要运行它?运行它的时候是不是先要进行一次检查 好,检查通过了过后,然后才运行它来进行提交。你看,从一开始啊,先把它加到占存区,然后呢来一个 comis 看,一开始不是检查了一次?好,我们把这些东西修复啊, 好,修复完了啊,再来个 git add 好, 然后再来提交。你看,先运行检查,然后呢检查通过了,然后呢进行提交。加上一个 hash key, 再加上一个 int stage, 好, 回车,回车。好,你看是不是后边又要进行检查,但是你要知道两次检查是谁在做啊?前面那次检查呢,是运行这个命令的时候他运行的检查, 那后边那次检查呢,是运行提交的时候被这个钩子所捕获啊,你看,被这个 pre commission 的 钩子所捕获,他要进行一次检查啊,两次就两次吧。啊,如果说你看两次看不惯你要一定要一次检查的话,那你可能需要自行去写写脚本啊,总之这个意思就是个意思啊,反正这件事是一定要做的,具体怎么做,那你自己去研究吧。啊,短视频呢,我没有那么多时间去给你摊开的解释 好了,到现在呢,我们整个工程的统一的一些规范化的管理就做的差不多了,当然不同的项目环境里边不同的场景,可能呢,你有更多的一些管理需求,那么同学们自行去根据场景的需要去完成, 总之就是在根目录下面去安装一些乱七八糟的检查工具,配置一些命令,去完成检查就完事了。我这里呢就算是抛砖引玉了啊,因为更多的工程管理呢,是需要你有更多的工程化的知识,那就不是短短的几十分钟的短视频能够解决的了啊。那么这些工程化的知识呢,大部分都在咱们加固课里边,所以说同学们强烈建议你啊,如果说你要走向高新,走向加固, 不想在底层天天担惊受怕,一定要去重点研究一下他的加固课目录,对你都是有极大帮助的, 方向给你指明了哈。再次重申,这个课程你要了解的话,在咱们账号主页点击头像进入账号主页,根据提示来找咱们就可以了啊。但是事情完没事情还没完哈,因为我们目前呢只是做了一些规范的处理,更重要的是我们将来在这里边怎么写代码呀?那这里写的代码,其他的包要用怎么办呢? 他们之间如何来相互引用呢?而且我写好代码如何来测试呢?像这些公共库的把,我们往往是需要把它发布到 n p m 上的,或者是 n p m 的 私服上的,那我怎么来发布呢?那这一系列的问题啊,时间有限,咱们下节课再说啊。就是公共库的打包纸包间如何一代如何单元测试如何发布,咱们下节课再聊。

嵌入式开发常用芯片的开源驱动代码库,今天给大家推荐一个适合嵌入式开发的驱动开源库。如果你的电路板上用了各种外围芯片,比如 flash 传感器、 l c、 d n、 f c 之类的器械,那么这个开源库基本都能帮上忙。使用这个开源库,你可以不用自己重复造轮子, 也不用在一些网页里到处找驱动代码,最后还要花时间去分辨是否能用。在各大开源网站中就可以找到这个名为 libdriver 的 开源库。 这个作者看名字应该是个中国人,所以他是有中文文档的。他开源了一百多个代码仓库,基本上都是常用的外围芯片驱动代码。这个库的代码质量还是不错的,最重要的是它的架构是统一的,你只要尝试移植过一个这个库的驱动,那么剩下的其他芯片的驱动 移植起来思路都是一致的。以 file 式驱动为例,将驱动代码下载并解压之后,可以看到文件和目录还是挺多的,但我们只需要关注两个目录, 第一个是 s i c 目录,这个目录是驱动核心代码,一般只有一个 c 文件和一个 h 文件,这两个文件是不用改的,直接添加到自己的工程里。 第二个是 interface 目录,这个目录是接口代码,也是一个 c 文件和一个 h 文件。注意这个 c 文件是模板文件,是需要你来修改的。比如这个 flash 驱动就需要你把自己板子的 s p i 读写函数加进去, 还需要你把自己板子的毫秒和微秒的延时函数加进去,因为操作 flash 时会需要 s p i 的 init 和 denit。 当然,如果你选择在调用 flash 之前在自己程序的其他地方出示化 spi, 这里也可以空着。对这个接口模板文件的修改就是驱动移植的核心操作。 这个读写接口因为兼容了 qpi 模式,所以参数比较多。如果我们用的是普通 spi 模式,那么只需要关心 in buff 和 out buff 就 可以了。通常情况下,把核心文件和修改好的接口文件都放入你自己的工程, 这个驱动就算移植完成了。应用的部分直接参考 example 目录,里面有作者写的应用事例,尤其是初识化,需要照着 example 进行一下接口注册。以上是以 flip 驱动为例的大致移植过程。 如果你掌握了 libdriver 的 一种驱动,那么恭喜你,下次如果你添加其他驱动时就会变得很轻松了,思路和方法都是一样的。好了,下期再见。

嵌入式 linux 的 c 库从哪儿来?只要一块板子?先问一个问题,你在 linux 上写 c 程序,用 prof 打印一句话,背后是谁帮你完成的?你可能以为直接调的是操作系统接口,错, 实际调用的是文件系统 usr lib 目录里的 glib c 库,这个库才是 c 程序和内核之间的翻译官。简单说下整个系统是怎么构建的。拿一块 linux 开发板来稍写系统的时候,会做三件事儿, 一编辑 u boot, 相当于电脑的 bios, 负责硬件自检和启动。二编内核,真正的操作系统。三,构建 root fs 更文件系统,包含 usr, lib, bin 等目录,开机顺序是 u boot 自检,启动内核内核,启动 it 进程 into, 启动 shell。 你 看到命令行,那 guypc 库是怎么放进 usr lib 的? guypc 是 开源的, 开发版厂商下载了它的源码,然后用板子对应的交叉翻译器翻译出 so 文件,复制到 rootfast 的 usr lib 目录中。作为 rootfast 的 一部分,常见现状 libc 已经不是唯一选择了。现在嵌入式 linux 构建主要有两大阵营, build route 简单清亮,配置直观,翻译快,适合快速原型和单功能设备。 ucut project 灵活强大,支持多 sku 产品线和长期维护,但学习曲线陡峭。两家都能编辑内核 boot loader 酷和应用,但哲学完全不同, c 库的选择也在发生变化,过去清一色是 glipsc, 现在 mooselight 正在快速解体。 master 核心库不到一兆,启动快,静态链接友好。 openglenox 全面采用 mousse lab, docker 容器轻量化的首选。旧的 uclife c 逐渐被 mousse 取代。两年前随便买块板子默认都是 glapseev, 现在很多厂商直接给你 moussel 加 buildroot, 一 条龙编出来的固件体积直接砍半。最关键的一点,你写的 c 应用程序在板子上跑的时候掉 要用的根本不是内核接口,而是 usr lib 里的 c 库。想验证搞一块 linux 开发版,自己编一遍 uboot 内核和 rootfs 跑一遍就全明白了。

上一期视频我们在 linux 操作系统入班图下面用 v m 编写了第一个 pro 程序,按照惯例的话,我们输出了 hello world, 那么那个代码是比较简单的。今天的话,我们来做一个稍微复杂一点的计算,一加二加三,一直加到十的和。好,我们先打开那个 pro 目录,就是我们存放引码的目录, 然后我们在空白处点鼠标右键,选择在终端打开,然后把这个终端往中间拖一点,然后我们在命令行输入 vim, 文件名的话我们叫 sam sam 点 p l, p l 的话是那个普洱程序的扩展点,然后我们敲回车, 敲回车以后我们就进到了那个代码冰雪窗口。那么首先第一步的话,我们在键盘上按一下 i 键,就是我们要进到那个冰级状态。好,按完 i 键以后,我们就可以开始冰雪代码了。首先的话,我们定义累加和的并量 并负一个初折, some 等于零。接下来的话,我们的冰雪循环体 four i 等于一, i 小于等于十, i 等于 i 加一。好,我们来进行累加和, some 等于 some 加 i。 好,新闻题并写完了,我们来输出那个累加和的结果,输出累加和的结果,我们用的是 print, print some 等于 some。 好,这里的 sum 是不用进行手动转换的, pront 已经帮我们自动转化成那个字符串了,那么到这里的话,代码已经编写完成了,我们按一下键盘上面的 esc 键,然后我们输入冒号,然后再输入 wq 保存并退出。 好,我们看一下文件夹,这里已经多了一个萨姆点 pl 就是我们的野马文件已经创建成功了,接下来的话我们来进行编译,编译的话用的是普洱命令普尔萨姆,我按 table 进行补群,好,我们敲回车, 好,我们看到了这里是萨姆等于五十五,那么他也是跟命令行换在一起的,那么我们要进行一下处理。 y m 萨姆,好,我们也是补全,要敲回车。代码打开以后,我们先按一下 i 键, 好,我们在输出这里加一个回车杠 a, 好,我们按 esc 键,然后我们保存并退出。好,我们在 进行重签边页普洱萨姆,好,那么萨姆等于五十五,那么结果是正确的了,我们回来看一下代码。 vm, 萨姆,好,我们按推广键进行补全。 好,代码打开以后,我们先看一下第一句,第一句的话是那个变异累加和的变量变负一个粗折,然后这里的话是循环体,然后进行累加和的计算,然后这里的话是输出那个累加和的结果。我们用的是 parent 函数,那么这里的话我们不用进行手动那个转换,那么 parent 会帮我们转换的, 那么这个就在 linux 操作系统误班图中,用 v m 编写破程序来计算一加二加三一直加到十的和的代码,那么这个代码是比较简单的。

这是课程,我们来介绍一下如何获得一个学习破语言的编程环境,我们一直强调学习编程一定要进行实际操作,不管是学习破语言还是其他编程语言, 我们强烈建议学习本课程的学员要跟着视频内容去反复的操作,所以如何获得一个破语言的变成环境就十分重要。 会员可以在利那个时与 windows 和迈克 os 等多个平台上运行。在利那个时或者迈克 os 是随系统自带的破环境,只要在命令行模式下直接敲破杠微选项,就可以查看系统是否安装了破语言变成环境。那么在 windower 下面每次运行 需要切换到道士环境下运行,非常的不方便,因此我们建议大家使用立定式版本的破语言。当然 window 下也可以安装集成开发的环境, 但是需要额外的安装和配置,对于新手来说还是有一定的难度,不如直接使用 limix 或麦克 os 模拟终端的破语言更加方便。那么如果想在 window 下面学习破语言怎么办呢? 条件下,由于系统没有自带的破语言变成环境,所以首先需要执行下载安装 sorry 破或者 xtuple。 这里面我们选择使用草莓破,首先登录到 sorry pro 的官网下载 安装程序,因为是 windowe 的程序,直接双击下一步,下一步就可以了,这个过程不需要担心里面并没有国产软件,里面打包很多额外的东西。 那么安装完成之后需要在倒驶模式下运行, 我们直接敲 win 键加 r 会弹出运行窗口,然后输出 cmd 命令,就会弹出命令提示服窗口,或者也可以选择开始菜单, 点击下面的命令提示服,直接在里面敲破杠微,如果输出破的提示,就表示程序安装好了,可以在温度下运行破程序了。接下来我们还需要下载一个文本编辑器,用来编写程序。 windowe 自带的记事本功能太少,这里面我们推荐使用一款功能多一点的文本编辑器, topy 的直接下载安装就可以使用。 那么在编写破之前呢,我们最好还需要对其进行配置一下, 这样的话会有文本高量的显示,也就是程序中不同的语法部分会有不同的颜色来显示, 非常的方便。下面我们就来写一个程序来试验一下。一般的编程语言,第一个程序都是 同音的,哈罗沃的告诉这个世界我来了。学习写程序将会进入到一个新的世界。我们保存一下这个程序保存的扩展名为点 pl 或语言的程序,一般扩展名为点 pl, 然后进入到道士环境下来运行,注意一定要给出程序的正确路径。 我将程序保存到地盘的戴帽文件夹, 我们直接输入破零零一点 pl, 屏幕就会输出哈喽 word 这样一个破程序就运行好了。我们看 那这个过程其实是比较繁琐,因为普洱最开始是根植于力那个时系统,或者更确切来说是优那个系统,因此在力那个环境下学习和使用破语言编程会非常的方便。 我们这门课程介绍的破语言编程主要也是应用于生物信息学方向,而生物信息分析绝大部分都是在立命式环境下完成的,因此如果想学习生物信息,最好还是要具备一些立命式操作的基础,我们这门课程后面的演示 也都是在立定式环境下完成的,所以现在的问题就是如何获得一个立定式的操作环境。这个我在生物数据分析软件视频教学的课程里有过介绍,大概有四种方式。第一种最简单的就是自己所在的单位 有利那个是服务器,那么管理员开通一个账户密码就可以登录了。第二种是在自己的个人电脑上安装利那个操作系统,可以选择五班图或者山头使, 不过大部分人使用 window 的电脑,如果安装双系统会非常的混乱,需要格式化的硬盘,对于新手或不小心很容易把瓷盘上的数据清空了,对于初学者我们不建议这种方式。那么第三种就是使用虚拟机来 安装,利落使采用微抽 boos 加乌半图镜像就可以了,这个难度并不大,不过因为在电脑上又运行一个虚拟的系统,所以对内存的消耗比较大,需要计算机配置稍微高一些 才能流畅的运行。最后一种就是购买这种云服务器,这种最方便,购买之后就可以远程登录直接学习就可以了, 这里面我们有额外销售云服务器的练习账号,大家购买课程的配套练习之后就可以登录开始学习, 里面会将本课程所有的案例放置进去,大家可以直接进行查看和练习。另外里面也有很多编写好的软件,购买服务器之后就可以直接拿来使用, 我们多人同时使用一个福气,因此比每个人单独购买价格会便宜很多,那么最好的方式就是 一面看视频,一面跟着视频里面的操作来进行练习,本视频外加这个服务器练习,大家只要多去练习,相信很快就会完成。破语言的入门学习可以处理一些日常的基本操作, 下面我们来看一下在利润系统环境下如何来编写破程序。这里面我们使用利润系统下载 vim 文本编辑器。 下节课程我们将重点介绍 vim 的使用。首先利用 vim 创建一个程序,这里面我们就叫做零零一点, 那么在第一行敲井号,感叹号,然后是斜杠 u s r b 破,这是破的安装路径,这样的话就可以直接敲破程序运行, 然后我们警号小蕾丝一直买 boss 和 program, 这是我的第一个破程序, 警号开头表示注视,那么这句话不会进行变异和执行, 对程序的执行没有影响,那么然后输入红英的 hello word, 然后保存退出, v i m 的退出比较复杂,下节课我们会具体介绍,那么程序编写好了之后,我们直接敲破零零一点 pl 运行这个程序, 那么就会输出哈罗沃的表示这个程序运行成功了。从以上案例我们可以看到个语言编程其实并不难,他和我们自然语言是比较类似的,其实程序语言是 和计算机交流的语言,所以每一个程序首先我们自己写的程序自己要能够读懂,如果一个程序自己都没有看懂,那么计算机就更看不懂了。这次的课程就到这里。