当前位置: 首页 > news >正文

【iOS-系统框架】

文章目录

  • 前言
  • 47.熟悉系统框架
        • CoreFoundation框架
        • 其他框架
    • 要点
    • 48. 多用块枚举,少用for循环
        • for循环
        • NSEnumerator遍历
        • 快速遍历
        • 基于块的遍历方式
    • 要点
  • 49.对自定义其内存管理语义的collection使用无缝桥接
    • 要点
  • 50.构建缓存时选用NSCache而非NSDictionary
        • NSCache
        • NSCache实例
    • 要点
  • 51.精简initialize与load的实现代码
        • load
        • initalize
        • initalize方法尽量精简
    • 要点
  • 52.别忘了NSTimer会保留其目标对象
        • 创建计时器
        • 保留环
        • 使用块的特点打破保留环
    • 要点
  • 总结

前言

小蓝书的最后一张学习的主要内容是OC的系统框架,对于OC而言Foundation框架是OC最基本最重要的框架了

47.熟悉系统框架

OC的Foundation框架,像NSObject NSArray, NSDictionary等类都在其中。Foundation框架里的类都是用NS前缀,因为OC之前作为NeXTSTEP操作系统确定的。

将一系列代码封装为动态库,并在其中放入描述其接口的头文件,这样做出来的东西就叫框架。

CoreFoundation框架

Foundation框架提供了collection等基础核心功能,而且还提供了字符串处理等复杂功能。还存在一个CoreFoundation框架,在之前了解过他是不属于OC框架之内的,但是OC应用程序的编写离不开这个框架,Foundation框架的许多功在CoreFoundation框架都可以找到对应的C语言API

他其中的很多类都和Foundation框架相似,并且我们还可以通过“无缝桥接”功能实现CoreFoundation框架中的C语言数据结构平滑转换为Foundation框架中的OC对象,也可以反向转换。无缝桥接技术是用某些相当复杂的代码实现出来的,这些代码可以使运行期系统把CoreFoundation框架中的对象视为普通的OC对象。

NSString所对应的就是CFString对象。

其他框架

  • CFNetWork 此框架提供了 C语言級别的网络通信能力,它将 “BSD 套接字"(BSDsockeD) 抽象成易于使用的网络接口。而Foundation 则将该框架里的部分内容封装为
    Objective-c语言的接口,以便进行网络通信,例如可以用 NSURLConncction 从 URI
    中下载数据。
  • CoreAudio 该框架所提供的C语言 APT可用来操作设备上的音频硬件。这个框架屆手比较难用的那科,因为育频处理本身就很复东。所幸由这套 ^PL 可以抽象出另外一套Objective-C 式 API,用后者米处理音频问题会更简单些。
  • AvFoundation 此框架所提供的 Objective-C对象可用水回放并录制音频及视频,比如能碰在 UI视凶类里播放视物。
  • CoreData 此框架所提供的 Objective-C 按口可将对象放人数据,便于特久保存。
    CoreData 会处理数据的狀取及存储事宜,而且可以路越 Mac OS X 及 iOS 平台。
  • CoreText 此框架提供的 C诺青接口可以高效执行文字排版及谊染操作。

OC编程的重要特点就是:经常需要使用底层的C语言级 API。用c语言实现 APTI的好处是,可以统过 Objeotive-C 的运行期系统,从而提升执行速度

在编写新的工具类之前可以在系统框架搜一下,通常有写好的类可以供直接使用

要点

  • 许多系统框架都可以直接使用。其中最重要的是Foundation与CoreFoundation,这两个框架提供了构建应用程序所需的许多核心功能。
  • 很多常见任务都能用框架来做,例如音频与视频处理、网络通信、数据管理等。
  • 请记住:用纯C写成的框架与用OC写成的一样重要,若想成为优秀的OC开发者,应该掌握C语言的核心概念。

48. 多用块枚举,少用for循环

在OC里,列举collection中的元素可以使用C语言的for循环,还可以使用快速遍历。当学习了block块特性的时候,又提供了多种遍历collection的方式,可以传入块。

for循环

遍历数组的时候for循环最基本

- (void)forMethod {NSArray *testArray = @[@"kd", @"lbj", @"Curry", @"KW", @"@PG"];for (int i = 0; i < testArray.count; i++) {// 操作数组}
}

不过对于字典或者集合,字典和set都是无序的,所以要先把它转换为数组才可以正常使用for循环来使用

 NSDictionary *textDic = @{@"LA": @"LBJ", @"PHX" :@"KD"};NSArray *allKeys = [textDic allKeys];for (int i = 0; i < allKeys.count; i++) {// 操作字典或集合}

for循环还有个比较好的地方就是反向遍历,在需要执行反向遍历的时候for循环往往更方便。

NSEnumerator遍历

NSEnumerator是个抽象基类,其中只定义了两个方法,供其具体子类来实现:请添加图片描述
关键的是其中的nextObject对象,它返回枚举里的下个对象,当返回不为nil的时候就会一直调用下一个对象,常用while语句

  • 数组
    • NSEnumerator类还提供了反向枚举器
- (void)NSEnumerator {// ArrayNSArray *testArray = @[@"kd", @"lbj", @"Curry", @"KW", @"@PG"];NSEnumerator *enumerator = [testArray objectEnumerator];// 正向id object;while ((object = [enumerator nextObject]) != nil) {// 操作数组}// 反向NSEnumerator *reverseEnum = [testArray reverseObjectEnumerator];id object2;while ((object2 = [reverseEnum nextObject]) != nil) {// 操作数组}
  • 字典和集合
// Dict And SetNSDictionary *textDic = @{@"LA": @"LBJ", @"PHX" :@"KD"};NSEnumerator *enumertorDic = [textDic keyEnumerator];id key;while ((key = [enumertorDic nextObject]) != nil) {// 操作字典id value = textDic[key];}
}

快速遍历

快速遍历是OC2.0引入的语法功能,引入了in关键字,语法更加简洁了collection的遍历过程。尤其是字典类

- (void)fast {NSArray *testArray = @[@"kd", @"lbj", @"Curry", @"KW", @"@PG"];for (id object in testArray) {//}NSDictionary *textDic = @{@"LA": @"LBJ", @"PHX" :@"KD"};for (id key in textDic) {NSLog(@"%@", textDic[key]);}
}

基于块的遍历方式

对于块的引入,数组字典和集合都有自己的块遍历方法

  • 数组
    请添加图片描述
    • 参数1是每次枚举的对象, idx是下标, stop则是代表是否停止遍历
    • obj = array[idx];
- (void)block {NSArray *testArray = @[@"kd", @"lbj", @"Curry", @"KW", @"@PG"];__block NSInteger x = 2;[testArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {if (x < 4) {x++;NSLog(@"%@", obj);// 等效NSLog(@"%@", testArray[idx]);*stop = NO;} else {*stop = YES;NSLog(@"x == 4 STOP");}}];//
}

请添加图片描述
字典和集合是一样的思路。
遍历时可以直接从块里获取更多信息,并且它能够修改块的方法签名,以免进行类型转换操作。
块的遍历也有反向遍历数组字典集合,我们需要传入一个新的选项掩码请添加图片描述
我知道反向遍历是通过NSEnumerationReserve来实现的,当然反向遍历只针对有序的数组和集合

要点

  • 遍历collection有四种方式。最基本的办法是for循环,其次是NSEnumerator遍历法及快速遍历法,最新、最先进的方式则是“块枚举法”。
  • “块枚举法”本身就能通过GCD来并发执行遍历操作,无须另行编写代码。而采用其他遍历方式则无法轻易实现这一点。
  • 若提前知道待遍历的collection含有何种对象,则应修改块签名,指出对象的具体类型

49.对自定义其内存管理语义的collection使用无缝桥接

“无缝桥接”技术其实就是不同库之间相同类型的相互转换。
使用“无缝桥接”技术,可以在定义于Foundation框架中的OC类和定义于CoreFoundation框架中的C数据结构之间互相转换

- (void)seamlessBridging {NSArray *testArray = @[@"kd", @"lbj", @"Curry", @"KW", @"@PG"];CFArrayRef aCFArray = (__bridge  CFArrayRef)testArray;NSLog(@"cfArratSize =  %li", CFArrayGetCount(aCFArray));
}

转换操作中的__bridge告诉ARC如何处理转换所涉及的OC对象。__bridge本身的意思是:ARC仍然具备这个OC对象的所有权。而__bridge_retained则与之相反,意味着ARC将交出对象的所有权。与之相似,反向转换可通过__bridge_transfer来实现,也就是将对象的所有权交给ARC。这三种转换方式称为“桥式转换”

要点

  • 通过无缝桥接技术,可以在Foundation框架中的OC对象与CoreFoundation框架中的C语言数据结构之间来回转换。
  • 在CoreFoundation层面创建collection时,可以指定许多回调函数,这些函数表示此collection应如何处理其元素。然后,可运用无缝桥接技术,将其转换成具备特殊内存管理语义的OC collection。

50.构建缓存时选用NSCache而非NSDictionary

就目前的知识而言,对于从网上下载的图片如何缓存,我会把图片全部放到字典里,使用的时候就无需再次下载了,OC提供了一个NSCache类更好的方便缓存。

NSCache

NSCache类的优势在于当系统资源即将耗尽的时候自动删减缓存,这是字典类不能做到的。并且遵循先删减最久未使用的对象

NSCache并非拷贝 键 而是保留 键。这和字典完全不同,并且NSCache是线程安全的,它在开发者不自己编写安全锁的情况下多个线程可以同时访问NSCache,这对于缓存来说是很重要的,多线程完成这个任务更加方便

NSCache可以令开发者操控缓存删减其内容的时机,可以调整缓存里的对象总数和对象的总开销,就是在讲对象加入缓存的时候开发者可以知道开销值,对象总数或总开销超过上限,缓存就会自动删减不需要的对象,当然这个删减不能确定会不会删减掉某个必要的对象,所以把对象转换成NSData对象之后把数据大小当作缓存值更合适这样避免了复杂的计算开销值,变成了读取数据大小的步骤

NSCache实例

书上提供了实用NSCache的例子,并引入其他的知识。
请添加图片描述
请添加图片描述
下载数据所用的URL,就是缓存的键。若缓存未命中,即缓存中没有访问者所需的数据,则下载数据并将其放入缓存。而数据的“开销值”则设为其长度

存在一个类叫做NSPurgeableDataNSCache搭配起来用,它是NSMutableData的子类,而且实现了NSDiscardableContent协议。如果某个对象所占的内存能够根据需要随时丢弃,那么就可以实现该协议所定义的接口。这就是说,当系统资源紧张时,可以把保存NSPurgeableData对象的那块内存释放掉。NSDiscardableContent协议里定义了名为isContentDiscarded的方法,用来查询相关内存是否释放

如果需要访问某个NSPurgeableData对象,可以调用其beginContentAccess方法,告诉它现在还不应丢弃自己所占据的内存。用完之后,调用endContentAccess方法,告诉它在必要时可以丢弃自己所占据的内存了。这些调用可以嵌套,类似于对象的引用计数机制,为0就告诉系统可以销毁对象了

将NSPurgeableData对象加入NSCache,那么当该对象为系统所丢弃时,也会自动从缓存中清除。通过NSCache的evictsObjectsWithDiscardedContent属性,选择开启或者关闭此功能。

要点

  • 实现缓存时应选用NSCache而非NSDictionary对象。因为NSCache可以提供优雅的自动删减功能,而且是“线程安全的”,此外,它与字典不同,并不会拷贝键。
  • 可以给NSCache对象设置上限,用以限制缓存中的对象总个数及“总成本”,而这些尺度则定义了缓存删减其中对象的时机。但是绝对不要把这些尺度当成可靠的“硬限制”,它们仅对NSCache起指导作用。
  • NSPurgeableData与NSCache搭配使用,可实现自动清除数据的功能,也就是说,当NSPurgeableData对象所内存为系统所丢弃时,该对象自身也会从缓存中移除。
  • 如果缓存使用得当,那么应用程序的响应速度就能提高。只有那种“重新计算起来很费事的”数据,才值得放入缓存,比如那些需要从网络获取或从磁盘读取的数据。

51.精简initialize与load的实现代码

在OC里一个类必须初始化才能使用,大多数类继承与NSObject这个根类,提供了loadinitalize方法
请添加图片描述

load

加入运行期系统中的每个类和分类来说,会调用此方且仅调用一次,当类和分类的程序载入系统的时候就会执行这个方法,调用顺序是类大于分类。

load方法执行的时候运行期系统处于脆弱状态,在执行子类的load方法之前必须执行所有超类的load方法,其中还会执行代码涉及到的库的load,导致在load方法里面使用其他类不安全
请添加图片描述
在B类里调用A类,无法保证A类已经加载完成,也就是只有A的load方法执行完成才能完整的使用A类。

某个类没实现load方法,那么他的超类不论实现该方法,都不会调用。
load尽量不用它。

initalize

该方法是在程序首次使用该类之前调用且仅有一次,是由运行期系统调用的,不通过代码调用。和load存在区别

  • 惰性调用:当程序用到了相关类的时候才会调用,类似于懒加载模式。而load是所有类不管用不用先load方法之后再说
  • 其次运行期在执行该方法的时候是系统正常状态,也就是安全状态,不影响调用类的其他方法,此为线程安全
  • 当某个类没实现initialize方法,超类实现后会调用超类的方法,和大多数消息是一样的。

initalize方法尽量精简

  • 首先,大家都不想看到自己的应用程序“挂起”,若写的太过繁琐,导致其运行很慢那就适得其反了。
  • 开发者无法控制类的初始化时机。
  • 最后,如果某个类的实现代码很复杂,那么其中可能会直接或间接用到其他类。若那些类尚未初始化,则系统会迫使其初始化。然而,本类的初始化方法此时尚未运行完毕。其他类在运行其initialize方法时,有可能会依赖本类中的某些数据,而这些数据此时也许还未初始化好,就会造成依赖环

initalize方法只应该用来设置内部数据,不能在内部调用其他的方法。

initalize还可以初始化某个无法在编译器初始化的全局变量

请添加图片描述
无法初始化数组等一些类,整数可以在编译期定义。
请添加图片描述
放到initalize里面即可在调用前完成该全局变量的初始化
请添加图片描述

+ (void)initialize {if (self == [ViewController class]) {staticArray = [NSArray new];}
}
  • 别忘了单例类也可以实现该目的

要点

  • 在加载阶段,如果类实现了load方法,那么系统就会调用它。分类里也可以定义此方法,类的load方法要比分类中的先调用。与其他方法不同,load方法不参与覆写机制。
  • 首次使用某个类之前,系统会向其发送initialize消息。由于此方法遵从普通的覆写规则,所以通常应该在里面判断当前要初始化的是那个类。
  • load与initialize方法都应该实现的精简一些,这有助于保持应用程序的响应能力,也能减少引入“依赖环”的几率。
  • 无法在编译期设定的全局常量,可以放在initialize方法里初始化。

52.别忘了NSTimer会保留其目标对象

Foundation框架中有个类叫NSTimer,开发者可以指定绝对的日期与时间,以便到时执行任务,计时器要和“运行循环(run loop)”相关联,运行循环到时候会触发任务。创建NSTimer时,可以将其“预先安排”在当前的运行循环中,也可以先创建好,然后由开发者自己来调度。无论采用哪种方式,只有把计时器放在运行环里,它才能正常触发任务

创建计时器

 _pollTimer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(pDoPoll) userInfo:nil repeats:YES];

用此方法创建出来的计时器,会在指定的间隔时间之后执行任务。也可以令其反复执行任务,知道开发者稍后将其手动关闭为止。

计时器会保留其目标对象,等到自身“失效”时再释放此对象。调用invalidate方法可令计时器失效;执行完相关任务之后,一次性的计时器也会失效。开发者若将计时器设置成重复执行模式,那么必须自己调用invalidate方法,才能令其停止。

由于计时器会保留其目标对象,所以反复执行任务通常会导致应用程序出现保留环。

// NSTimer- (void)startPolling {_pollTimer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(pDoPoll) userInfo:nil repeats:YES];[self stopPolling];
}
- (void)stopPolling {[_pollTimer invalidate];_pollTimer = nil;
}
- (void)pDoPoll {NSLog(@"poll");
}
// 为啥不实现dealloc?
- (void)dealloc {[_pollTimer invalidate];
}

这里为什么一直打印poll不是很理解 为什么没有调用dealloc方法
请添加图片描述

保留环

创建计时器的时候,由于目标对象是self,所以要保留此实例。然而,因为计时器是用实例变量存放的,所以实例也保留了计时器,于是,就产生了保留环。所以说,调用stopPolling,或者令系统将此实例回收,只有这样才能打破保留环。

因为是类和这个类中的实例出现了保留环,不管你外界怎么对这个类释放,这个计时器始终都会保留这个类,而这个类也会保留这个计时器,互相引用保留导致他们的计数永远都不会降为0请添加图片描述
如果从外界直接先调用stop方法,代码没办法自己检测。

使用块的特点打破保留环

使用块和weak关键字合理的打破保留环,块可以传递代码,这一功能可以利用
请添加图片描述

这段代码将计时器所应执行的任务封装成“块”,在调用计时器函数上,把它作为userInfo参数传进去。该参数可用来存放“不透明值”(即万能值),只要计时器还有效,就会一直保留着它。传入参数时要通过copy方法将block拷贝到“堆”上(之前在blk提过,copy方法把块变成了有引用计数的对象。)

否则等到稍后要执行它的时候,该块可能已经无效了。计时器现在的target是NSTimer类对象,这是个单例,因此计时器是否会保留它,其实都无所谓。此处依然有保留环,使用
方法和weak关键字打破它请添加图片描述

[NSTimer scheduledTimerWithTimeInterval:2 repeats:YES block:^

请添加图片描述
这段代码采用了一种很有效的写法,他先定义了一个弱引用,令其指向self,然后使块捕获这个引用,而不直接去捕获普通的self变量。也就是说,self不会为计时器所保留。当块开始执行时,立刻生成strong引用,以保证实例在执行期间持续存活。

要点

  • NSTimer对象会保留其目标,直到计时器本身失效为止,调用invalidate方法可令计时器失效,另外,一次性的计时器在触发完成任务之后也会失效。
  • 反复执行任务的计时器,很容易引人保留环,如果这种计时器的目标对象又保留了计时器本身,那肯定会导致保留环。这种环状保留关系,可能是直接发生的,也可能是通过对象图里的其他对象间接发生的。
  • 可以扩充NSTimer的功能,**用“块” 来打破保留环。**不过,除非NSTimer将来在公共接口里提供此功能,否则必须创建分类,将相关实现代码加入其中。

总结

小蓝书的最后一章刚开始看的不是很理解,有些代码还是需要自己手动打一下才知道原理,其中49.50 就是看着书写的,理解的不是很完全,GCD和block还是需要再次多加学习才能掌握。

相关文章:

【iOS-系统框架】

文章目录前言47.熟悉系统框架CoreFoundation框架其他框架要点48. 多用块枚举&#xff0c;少用for循环for循环NSEnumerator遍历快速遍历基于块的遍历方式要点49.对自定义其内存管理语义的collection使用无缝桥接要点50.构建缓存时选用NSCache而非NSDictionaryNSCacheNSCache实例…...

Android APK 签名打包原理分析(二)【Android签名原理】

说到签名,从这个词来理解,正常个人需要签名的时候,一般是用来证明这是某个人的特属认证。 大家是否有印象?还记得我们之前在学习、总结网络相关知识的时候,说到过,客户端和服务端虽然通信数据上,可以采用对称加密和非对称加密组合去进行数据的加密,但是这时还有一个问题…...

linux判断文件不存在退出jenkins编译流程

# linux判断文件不存在退出jenkins编译流程 file"${WORKSPACE}/mc/jenkins_arm64.sh" if [ ! -f "$file" ]; then echo "jenkins_arm64.sh not exist" exit 0 fi dir(charge){checkout([$class: GitSCM, branches: [[name: …...

shell脚本(语法)

一、什么是shell脚本 1.1、shell 的两层含义&#xff1a;既是一种应用程序,又是一种程序设计语言 1.1.1、shell是一种应用程序 交互式地解释、执行用户输入的命令&#xff0c;将用户的操作翻译成机器可以识别的语言&#xff0c;完成相应功能称之为 shell 命令解析器。 shell 是…...

java高频面试题(2023最新)

目录一.java基础1.八大基础类型2.java三大特性3.重载和重写的区别4.pubilc、protected、(dafault)不写、private修饰符的作用范围5.和equals的区别6.hashcode()值相同&#xff0c;equals就一定为true7.short s 1&#xff1b;s s 1&#xff1b;(程序1)和 short s 1&#xff…...

视觉感知(二):车位线检测

1. 简介 本期为大家带来车位线检测相关知识点,以及算法工程落地的全流程演示。车位线检测是自动泊车领域必不可缺的一环,顾名思义就是采用环视鱼眼相机对路面上的车位线进行检测,从而识别出车位进行泊车。 较为常规的做法是使用四颗鱼眼相机环视拼接然后在鸟瞰图上做停车位…...

2023.2.10学习记录Docker容器

Docker 必须跑在Linux内核上 镜像是一个轻量级可执行的独立软件包 新建一个docker容器只需要几秒钟 Docker常用命令 启动类命令 镜像命令 容器命令 docker images docker search --limit 5 redis docker pull redis:6.0.8 docker system df 查看镜像/容器/…...

扩散模型diffusion model用于图像恢复任务详细原理 (去雨,去雾等皆可),附实现代码

文章目录1. 去噪扩散概率模型2. 前向扩散3. 反向采样3. 图像条件扩散模型4. 可以考虑改进的点5. 实现代码1. 去噪扩散概率模型 扩散模型是一类生成模型, 和生成对抗网络GAN 、变分自动编码器VAE和标准化流模型NFM等生成网络不同的是, 扩散模型在前向扩散过程中对图像逐步施加噪…...

pytorch

PyTorch基础 import torch torch.__version__ #return 1.13.1cu116基本使用方法 矩阵 x torch.empty(5, 3)tensor([[1.4586e-19, 1.1578e27, 2.0780e-07],[6.0542e22, 7.8675e34, 4.6894e27],[1.6217e-19, 1.4333e-19, 2.7530e12],[7.5338e28, 8.1173e-10, 4.3861e-43],[2.…...

软件测试—对职业生涯发展的一些感想

目录&#xff1a;导读 职场生涯 1、短期规划 2、长期规划 自身定位 1、你在哪儿&#xff1f; 2、你想要什么&#xff1f; 3、你拥有什么&#xff1f; 4、你需要做什么&#xff1f;什么时候做&#xff1f; 5、淡定啊淡定 最近工作不是很忙&#xff0c;有空都是在看书&a…...

5年经验之谈:月薪3000到30000,测试工程师的变“行”记!

自我介绍下&#xff0c;我是一名转IT测试人&#xff0c;我的专业是化学&#xff0c;去化工厂实习才发现这专业的坑人之处&#xff0c;化学试剂害人不浅&#xff0c;有毒&#xff0c;易燃易爆&#xff0c;实验室经常用丙酮&#xff0c;甲醇&#xff0c;四氯化碳&#xff0c;接触…...

全价值链赋能,数字化助力营销价值全力释放 | 爱分析报告

报告编委 张扬 爱分析联合创始人&首席分析师 文鸿伟 爱分析高级分析师 王鹏 爱分析分析师 外部专家&#xff08;按姓氏拼音排序&#xff09; 黄洵 客易达 联合创始人 毛健 云徙科技 副总裁 & COO 特别鸣谢&#xff08;按拼音排序&#xff09; 报告摘要 在…...

【自学Docker 】Docker search命令

大纲 Docker search命令 docker search命令教程 docker search 命令用于从 Docker Hub 查找镜像。 docker search命令语法 haicoder(www.haicoder.net)# docker search [OPTIONS] TERMdocker search命令参数 参数描述docker search --filter设置过滤条件。docker search -…...

银行零售如何更贴近客户?是时候升级你的客户旅程平台了

随着数字化战略推进&#xff0c;各大银行持续加大对线上多渠道的建设投入&#xff0c;客户触达也愈发移动化、智能化。与此同时&#xff0c;手机银行飞速发展产生并累积了大量客户行为数据&#xff0c;呈多样化、海量化等特点&#xff0c;将在用户体验、客户经营、手机银行运营…...

零入门kubernetes网络实战-12->基于DNAT技术使得外网可以访问本宿主机上veth-pair链接的内部网络

视频地址(稍后上传) 本篇文章测试如何让veth pair链接的内网网络可以被本局域网的其他宿主机访问到&#xff1f; 1、测试环境介绍 一台centos虚拟机 # 查看操作系统版本 cat /etc/centos-release # 内核版本 uname -a uname -r # 查看网卡信息 ip a s eth02、网络拓扑 3、操…...

conda环境管理命令

conda环境管理命令 1.环境检查 1&#xff09;查看安装了哪些包 conda list 2)查看当前存在哪些虚拟环境 conda env list conda info -e [rootoracledb anaconda3]# conda info -e # conda environments: # base * /home/anaconda33)检查更新当前conda con…...

ubuntu clion从0开始搭建一个风格转换ONNX推理网络 opencv cuda::dnn::net

系统搭建 系统搭建 OpenCV的安装 cmake sudo apt-get install cmake其他环境以来 sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev 不安装会报这个错误 OpenCV(4.6.0) /hom…...

1.十大排序算法

1.什么是排序算法&#xff1f; 在梳理十大排序算法之前&#xff0c;虽然知道排序算法是将数字或字母按增序排列的算法&#xff0c;但该理解过于片面&#xff0c;那排序算法的权威定义是什么呢。 一个排序算法&#xff08;英语&#xff1a;Sorting algorithm&#xff09;是一种…...

算法导论—SAT、NP、NPC、NP-Hard问题

算法导论—SAT、NP、NP-Hard、NPC问题SAT 问题基本定义问题复杂性P、NP、NP-Hard、NP-Complete&#xff08;NPC&#xff09;证明NP-Hard关系图NP问题的概念约化的定义NPC问题NP-Hard问题SAT 问题基本定义 SAT 问题 (Boolean satisfiability problem, 布尔可满足性问题,SAT): 给…...

linux入门---基础指令(上)

这里写目录标题前言ls指令pwd指令cd指令touch指令mkdirrmdirrmman指令cp指令mv指令前言 我们平时使用电脑主要是通过鼠标键盘以及操作系统中自带的图形来对电脑执行相应的命令&#xff0c;比如说我想打开D盘中的cctalk这个文件&#xff1a; 我就可以先用鼠标左键单击这个文件…...

大数据Kylin(一):基础概念和Kylin简介

文章目录 基础概念和Kylin简介 一、​​​​​​​OLTP与OLAP 1、​​​​​​​​​​​​​​OLTP 2、​​​​​​​​​​​​​​OLAP 3、​​​​​​​​​​​​​​OLTP与OLAP的关系 二、​​​​​​​​​​​​​​数据分析模型 1、星型模型 2、雪花模型 …...

推进行业生态发展完善,中国信通院第八批RPA评测工作正式启动

随着人工智能、云计算、大数据等新兴数字技术的高速发展&#xff0c;数字劳动力应用实践步伐加快&#xff0c;以数字生产力、数字创造力为基础的数字经济占比逐年上升。近年来&#xff0c;机器人流程自动化&#xff08;Robotic Process Automation&#xff0c;RPA&#xff09;成…...

DOM编程-获取下拉列表选中项的value

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>获取下拉列表选中项的value</title> </head> <body> <script type"text/javascript"> …...

认证服务-----技术点及亮点

大技术Nacos做注册中心把新建的微服务注册到Nacos上去两个步骤 在配置文件中配置应用名称、nacos的发现注册ip地址&#xff0c;端口号在启动类上用EnableDiscoveryClient注解开启注册功能使用Redis存验证码信息加入依赖配置地址和端口号即可直接注入StringRedisTemplate模板类用…...

6个常见的 PHP 安全性攻击

了解常见的PHP应用程序安全威胁&#xff0c;可以确保你的PHP应用程序不受攻击。因此&#xff0c;本文将列出 6个常见的 PHP 安全性攻击&#xff0c;欢迎大家来阅读和学习。 1、SQL注入 SQL注入是一种恶意攻击&#xff0c;用户利用在表单字段输入SQL语句的方式来影响正常的SQL执…...

三大基础排序算法——冒泡排序、选择排序、插入排序

目录前言一、排序简介二、冒泡排序三、选择排序四、插入排序五、对比References前言 在此之前&#xff0c;我们已经介绍了十大排序算法中的&#xff1a;归并排序、快速排序、堆排序&#xff08;还不知道的小伙伴们可以参考我的 「数据结构与算法」 专栏&#xff09;&#xff0…...

负载均衡上传webshell+apache换行解析漏洞

目录一、负载均衡反向代理下的webshell上传1、nginx负载均衡2、负载均衡下webshell上传的四大难点难点一&#xff1a;需要在每一台节点的相同位置上传相同内容的webshell难点二&#xff1a;无法预测下一次请求是哪一台机器去执行难点三&#xff1a;当我们需要上传一些工具时&am…...

【ESP 保姆级教程】玩转emqx数据集成篇③ ——消息重发布

忘记过去,超越自己 ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-02-10 ❤️❤️ 本篇更新记录 2023-02-10 ❤️🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请…...

支持分布式部署的主流方式 - Session 持久化到 Redis

1.为什么要将 Session 存储在 Redis 中如果我们不将 Session 存储在 MySQL 或者 Redis 中, 那么做出来的项目就只能支持单机部署, 不支持分布式部署. 因为之前我们只是将 Session 存储在当前电脑的内存里面. 当张三去登录的时候, 将 Session 信息存储在 A 服务器, 这个时候负载…...

计算机网络|第二章 物理层|湖科大课程|从零开始的计网学习——物理层(计网入门就看这篇!)

图片来源于胡科大计算机网络课程&#xff0c;https://www.bilibili.com/video/BV1c4411d7jb?p20&vd_sourcedeb12d86dce7e419744a73045bc66364。文章非盈利商业用途&#xff0c;供博主与大家学习参考&#xff0c;如有侵权&#xff0c;请联系我删除&#xff01;2.1物理层的基…...

网站必须做电子标识信息/海外免费网站推广

2019独角兽企业重金招聘Python工程师标准>>> 错误 ueditor上传附件时显示和下载都是正常的&#xff0c;当下次点击在线附件时图片图标显示错误&#xff0c;再添加到网页中访问的时候出现404错误&#xff0c;比如&#xff1a; 第一次添加&#xff1a;http://192.168.…...

阿里云做哪里查网站/如何推广网站

首先先确认用户密码是否正确&#xff0c;最好重新为那个用户设置一下密码&#xff0c;在linux执行以下命令 smbpasswd -a 用户名 设置完密码后如果不行再执行以下操作&#xff1a; 1、修改本地安全策略 运行secpol.msc打开“本地安全策略”窗体&#xff0c;依次点开“本地策…...

电脑如何做ppt模板下载网站/杭州推广平台有哪些

数位DP 问题 求区间[L,R][L, R][L,R]中满足条件的数有多少个&#xff0c; 0≤L≤R0 \le L \le R0≤L≤R&#xff0c;该条件与数位有关&#xff0c;比如不包含数字444。 思路 考虑函数cal(n)cal(n)cal(n)表示区间[0,n][0, n][0,n]中满足条件的数的个数&#xff0c;那么区间[…...

建设旅游网站/金华网站推广

评估聚类效果的指标非常多&#xff0c;甚至有工具包clusterCrit提供了多种内部和外部评价指标。外部指标&#xff1a;Czekanowski_Dice, Folkes_Mallows, Hubert, Jaccard, Kulczynski, McNemar, Phi, Precision, Rand, Recall, Rogers_Tanimoto, Russel_Rao, Sokal_Sneath1, S…...

软件定制开发服务收费多少/优化大师windows

第一步&#xff0c;下载mysql版本包现在国内&#xff0c;上mysql官网&#xff0c;如果用windows系统打开是无法下载到mysql&#xff0c;linux版本安装包这里推荐一个下载源http://mirrors.sohu.com/mysql/&#xff0c;可以找我最新的mysql数据库安装包或者是通过linux系统上msy…...

wordpress 小人/重庆seo结算

看着ie9 、firefox &#xff0c;opera都效仿tab风格&#xff0c;对比了下&#xff0c;chrome的窗口上面部分还不够小&#xff0c;干脆把地址栏去掉&#xff0c;按F10或ALT键&#xff0c;显示隐藏地址栏&#xff0c;这里是我编译好的程序&#xff0c;喜欢的拿走&#xff08;26M&…...