Angular面试题汇总系列一
1. 如何理解Angular Signal
Angular Signals is a system that granularly tracks how and where your state is used throughout an application, allowing the framework to optimize rendering updates.
什么是信号
信号是一个值的包装器,可以在该值发生变化时通知感兴趣的消费者。信号可以包含任何值,从简单的原语到复杂的数据结构。
信号的值总会通过 getter 函数读取,这使得 Angular 可以跟踪信号的使用位置。
信号可以是可写的或只读的。
可写信号
可写信号提供了一个 API 来直接更新它们的值。你可以通过使用信号的初始值调用 signal 函数来创建可写信号:
const count = signal(0);
// Signals are getter functions - calling them reads their value.
console.log('The count is: ' + count());
要更改可写信号的值,你可以直接 .set():
count.set(3);
或者使用 .update() 操作从前一个值计算出一个新值:
// Increment the count by 1.
count.update(value => value + 1);
在处理包含对象的信号时,有时直接改变该对象很有用。例如,如果对象是一个数组,你可能希望在不完全替换数组的情况下推送一个新值。要进行这样的内部更改,请使用 .mutate 方法:
const todos = signal([{title: 'Learn signals', done: false}]);todos.mutate(value => {// Change the first TODO in the array to 'done: true' without replacing it.value[0].done = true;
});
计算信号
计算信号是从其他信号中派生出来的。可以使用 computed 并指定推导函数来定义一个:
const count: WritableSignal<number> = signal(0);
const doubleCount: Signal<number> = computed(() => count() * 2);
doubleCount 信号取决于 count。每当 count 更新时,Angular 知道任何依赖于 count 或 doubleCount 东西也需要更新。
计算信号都是惰性计算和记忆的
在第一次读取 doubleCount 之前,不会运行 doubleCount 的派生函数以计算其值。一旦计算出来,这个值就会被缓存起来,以后读取 doubleCount 将返回缓存的值而不用重新计算。
当 count 发生变化时,它会告诉 doubleCount 它的缓存值不再有效,并且该值只会在下一次读取 doubleCount 时重新计算。
因此,在计算信号中执行计算量大的推导(例如过滤数组)是相当安全的。
计算信号不是可写信号
你不能直接为计算信号赋值。比如,
doubleCount.set(3);
会产生编译错误,因为 doubleCount 不是 WritableSignal。
计算信号的依赖性是动态的
只能跟踪推导期间实际读取过的信号。例如,在此计算中,只会有条件地读取 count 信号:
const showCount = signal(false);
const count = signal(0);
const conditionalCount = computed(() => {if (showCount()) {return `The count is ${count()}.`;} else {return 'Nothing to see here!';}
});
读取 conditionalCount 时,如果 showCount 为 false,则没有读取 count 信号就返回了消息 “Nothing to see here!”。这意味着对 count 的更新不会导致重新计算。
如果稍后将 showCount 设置为 true 并再次读取 conditionalCount,则将重新执行派生并采用 showCount 为 true 的分支,返回显示 count 值的消息。对 count 的更改将使 conditionalCount 的缓存值无效。
请注意,可以删除和添加依赖项。如果 showCount 稍后再次设置为 false,则 count 将不再被视为 conditionalCount 的依赖项。
何时使用副作用
在大多数应用程序代码中很少需要副作用,但在特定情况下可能会有用。下面是一些需要以 effect 作为解决方案的例子:
-
记录正在显示的数据及其更改时间,用于分析或作为调试工具
-
在数据与 window.localStorage 之间保持同步
-
添加无法用模板语法表达的自定义 DOM 行为
-
对 canvas、图表库或其他第三方 UI 库执行自定义渲染
如何理解 Web Worker
在Angular中,Web Worker是一种运行在浏览器后台线程的JavaScript,它允许你执行任务而不会冻结用户界面。这对于执行密集型计算或长时间运行的任务特别有用,因为这些任务可能会阻塞主线程,导致用户界面变得不响应。
主线程与工作线程:
主线程:负责处理UI交互和DOM操作。
工作线程:运行Web Worker,处理后台任务,不会直接影响UI。
避免UI阻塞:
通过将计算密集型任务放在Web Worker中执行,可以避免主线程阻塞,从而提高应用的响应性和性能。
数据交换:
主线程和工作线程之间通过消息传递进行通信。你可以使用postMessage方法发送消息给Worker,Worker也可以通过postMessage向主线程发送消息。
创建Web Worker:
在Angular中,你可以创建一个服务来管理Web Worker。这个服务负责创建Worker实例,发送消息,并处理从Worker接收到的消息。
Angular服务中的Web Worker:
你可以使用@angular/platform-webworker和@angular/platform-webworker动态模块来创建专门的Worker应用程序或共享Worker。
示例:
以下是一个简单的Angular服务,演示如何使用Web Worker:
// worker.service.ts
import { Injectable } from '@angular/core';
import { Worker } from '@angular/platform-webworker';@Injectable()
export class WorkerService {private worker: Worker;constructor() {this.worker = new Worker('./worker', { data: 'Hello, worker!' });this.worker.onMessage().subscribe(message => {console.log('Message from worker:', message);});}sendToWorker(data: any) {this.worker.postMessage(data);}
}
2 Web Worker 使用场景:
CPU密集型计算:
Web Worker允许在后台线程中运行CPU密集型计算,从而释放主线程以更新用户界面。这对于需要进行大量计算的应用,如生成CAD图纸或进行繁重的几何计算,非常有帮助
离线数据处理和缓存:
通过使用Web Worker和缓存,可以提高应用的性能和响应性。用户可以继续在页面上进行其他操作,而不会受到耗时计算的影响。同时,由于计算结果已经存储在缓存中,当用户需要再次获取时,可以快速地获取到,提高了应用的效率
大量数据计算:
对于需要处理大量数据的Web应用,例如数据分析工具或科学计算应用程序,可以使用Web Worker来处理这些数据。这样可以避免主线程阻塞,提高应用性能
图像处理和媒体编解码:
Web Worker在图像处理和媒体编解码方面也有广泛的应用。例如,可以创建一个Web Worker线程来处理图像调整大小、旋转、裁剪、滤镜等操作,而不阻塞主线程
实时数据推送和通知:
对于需要实时推送数据更新和通知的应用,可以使用Web Worker来处理实时数据的获取和处理任务。这样可以在后台线程中使用WebSocket、Server-Sent Events或定期轮询来获取实时数据,而不会影响主线程的用户交互
轮询服务器状态:
有时,浏览器需要轮询服务器状态,以便第一时间得知状态改变。这个工作可以放在Web Worker里面,以避免阻塞主线程
文件数据处理:
在某些应用中,可能需要处理大量文件数据,如保存文件数据到服务器。这些操作可以在Web Worker中进行,以避免阻塞用户界面
3. Angular 生命周期Hooks
Angular的生命周期钩子是组件或指令在其生命周期中经历的不同阶段的回调方法。理解这些钩子有助于我们更好地控制组件的行为。以下是Angular组件的生命周期钩子及其用途:
1. ngOnChanges
- 触发时机: 当输入属性(通过
@Input
装饰器标记的属性)发生变化时。 - 用途: 可以用来检测输入属性的变化,并执行相应的逻辑。
- 操作示例: 重新计算数据、重新渲染视图、更新状态等。
2. ngOnInit
- 触发时机: 组件或指令被初始化后,且第一次
ngOnChanges
之后。 - 用途: 用于执行初始化逻辑,如订阅Observables、获取数据、设置初始状态等。
- 操作示例: 发起HTTP请求、初始化表单、设置默认值等。
3. ngDoCheck
- 触发时机: 每次变更检测运行时。
- 用途: 用于检测Angular自身未检测到的变化,如第三方库的变化。
- 操作示例: 手动检查变量的变化、执行自定义变更检测逻辑等。
4. ngAfterContentInit
- 触发时机: 组件内容投影完成后。
- 用途: 用于在内容投影完成后执行逻辑。
- 操作示例: 初始化投影内容、设置初始状态等。
5. ngAfterContentChecked
- 触发时机: 每次变更检测运行后,内容投影检查完成后。
- 用途: 用于在内容投影检查完成后执行逻辑。
- 操作示例: 更新投影内容的状态、执行额外的检查等。
6. ngAfterViewInit
- 触发时机: 组件视图初始化完成后。
- 用途: 用于在视图初始化完成后执行逻辑。
- 操作示例: 初始化视图、设置初始状态、操作DOM等。
7. ngAfterViewChecked
- 触发时机: 每次变更检测运行后,视图检查完成后。
- 用途: 用于在视图检查完成后执行逻辑。
- 操作示例: 更新视图的状态、执行额外的检查等。
8. ngOnDestroy
- 触发时机: 组件或指令被销毁前。
- 用途: 用于执行清理工作,如取消订阅、清理定时器等。
- 操作示例: 取消HTTP请求、清理DOM监听器、释放资源等。
示例代码
import { Component, OnInit, OnChanges, DoCheck, AfterContentInit, AfterContentChecked, AfterViewInit, AfterViewChecked, OnDestroy, Input } from '@angular/core';@Component({selector: 'app-lifecycle',template: `<p>Current value: {{ value }}</p >`
})
export class LifecycleComponent implements OnInit, OnChanges, DoCheck, AfterContentInit, AfterContentChecked, AfterViewInit, AfterViewChecked, OnDestroy {@Input() value: string;constructor() {console.log('Constructor called');}ngOnChanges(changes: SimpleChanges): void {console.log('ngOnChanges called', changes);}ngOnInit(): void {console.log('ngOnInit called');}ngDoCheck(): void {console.log('ngDoCheck called');}ngAfterContentInit(): void {console.log('ngAfterContentInit called');}ngAfterContentChecked(): void {console.log('ngAfterContentChecked called');}ngAfterViewInit(): void {console.log('ngAfterViewInit called');}ngAfterViewChecked(): void {console.log('ngAfterViewChecked called');}ngOnDestroy(): void {console.log('ngOnDestroy called');}
}
总结
- ngOnChanges: 输入属性变化时调用。
- ngOnInit: 初始化完成后调用。
- ngDoCheck: 每次变更检测时调用。
- ngAfterContentInit: 内容投影完成后调用。
- ngAfterContentChecked: 内容投影检查完成后调用。
- ngAfterViewInit: 视图初始化完成后调用。
- ngAfterViewChecked: 视图检查完成后调用。
- ngOnDestroy: 销毁前调用。
4. 如何理解Angular中的依赖注入
依赖注入(DI)是 Angular 中的基本概念之一。DI 被装配进 Angular 框架,并允许带有 Angular 装饰器的类(例如组件、指令、管道和可注入对象)配置它们所需的依赖项。
DI 系统中存在两个主要角色:依赖使用者和依赖提供者。
Angular 使用一种称为 Injector 的抽象来促进依赖消费者和依赖提供者之间的互动。当有人请求依赖项时,注入器会检查其注册表以查看那里是否已有可用的实例。如果没有,就会创建一个新实例并将其存储在注册表中。Angular 会在应用的引导过程中创建一个应用范围的注入器(也称为“根”注入器),并会根据需要创建任何其它注入器。在大多数情况下,你都不需要手动创建注入器,但应该知道有这样一个连接提供者和消费者的层次。
本主题介绍了某个类如何作为依赖项的基本场景。Angular 还允许你使用函数、对象、基本类型(例如字符串或 Boolean)或任何其他类型作为依赖项。
提供依赖项
假设有一个名为 HeroService 的类需要用作组件中的依赖项。
第一步是添加 @Injectable 装饰器以表明此类可以被注入。
@Injectable()
class HeroService {}
下一步是提供它,以便让其在 DI 中可用。可以在多种地方提供依赖项:
在组件级别,使用 @Component 装饰器的 providers 字段。在这种情况下,HeroService 将可用于此组件的所有实例以及它的模板中使用的其他组件和指令。例如:
@Component({selector: 'hero-list',template: '...',providers: [HeroService]
})
class HeroListComponent {}
当你在组件级别注册提供者时,该组件的每个新实例都会获得一个新的服务实例。
在 NgModule 级别,要使用 @NgModule 装饰器的 providers 字段。在这种情况下,HeroService 可用于此 NgModule 或与本模块位于同一个 ModuleInjector 的其它模块中声明的所有组件、指令和管道。当你向特定的 NgModule 注册提供者时,同一个服务实例可用于该 NgModule 中的所有组件、指令和管道。要理解所有边缘情况,参见多级注入器。例如:
@NgModule({declarations: [HeroListComponent]providers: [HeroService]
})
class HeroListModule {}
在应用程序根级别,允许将其注入应用程序中的其他类。这可以通过将 providedIn: ‘root’ 字段添加到 @Injectable 装饰器来实现:
@Injectable({providedIn: 'root'
})
class HeroService {}
当你在根级别提供服务时,Angular 会创建一个 HeroService 的共享实例,并将其注入到任何需要它的类中。在 @Injectable 元数据中注册提供者还允许 Angular 通过从已编译的应用程序中删除没用到的服务来优化应用程序,这个过程称为摇树优化(tree-shaking)。
注入依赖项
注入依赖项的最常见方法是在类的构造函数中声明它。当 Angular 创建组件、指令或管道类的新实例时,它会通过查看构造函数的参数类型来确定该类需要哪些服务或其他依赖项。例如,如果 HeroListComponent 要用 HeroService,则构造函数可以如下所示:
@Component({ … })
class HeroListComponent {constructor(private service: HeroService) {}
}
当 Angular 发现一个组件依赖于一项服务时,它会首先检查注入器中是否已有该服务的任何现有实例。如果所请求的服务实例尚不存在,注入器就会使用注册的提供者创建一个,并在将服务返回给 Angular 之前将其添加到注入器中。
当所有请求的服务都已解析并返回时,Angular 就可以用这些服务实例为参数,调用该组件的构造函数。
指定提供者令牌
如果你用服务类作为提供者令牌,则其默认行为是注入器使用 new 运算符实例化该类。
在下面这个例子中,Logger 类提供了 Logger 的实例。
providers: [Logger]
但是,你可以将 DI 配置为使用不同的类或任何其他不同的值来与 Logger 类关联。因此,当注入 Logger 时,会改为使用这个新值。
实际上,类提供者语法是一个简写表达式,可以扩展为由 Provider 接口定义的提供者配置信息。
在这种情况下,Angular 将 providers 值展开为完整的提供者对象,如下所示:
[{ provide: Logger, useClass: Logger }]
展开后的提供者配置是一个具有两个属性的对象字面量:
provide 属性包含一个令牌,该令牌会作为定位依赖值和配置注入器时的键。
第二个属性是一个提供者定义对象,它会告诉注入器如何创建依赖值。提供者定义对象中的键可以是以下值之一:
-
useClass - 此选项告诉 Angular DI 在注入依赖项时要实例化这里提供的类
-
useExisting - 允许你为令牌起一个别名,并引用任意一个现有令牌。
-
useFactory - 允许你定义一个用来构造依赖项的函数。
-
useValue - 提供了一个应该作为依赖项使用的静态值。
5 Angular常见指令有哪些
NgIf:
用于根据条件包含或排除一个元素。
<div *ngIf="condition">Content to show when condition is true.</div>
NgForOf:
用于基于一个数组或可迭代对象来重复元素。
<ul><li *ngFor="let item of items">{{ item }}</li>
</ul>
NgSwitch:
用于在多个条件之间切换显示不同的内容。
<div [ngSwitch]="condition"><ng-container *ngSwitchCase="'case1'">Case 1</ng-container><ng-container *ngSwitchDefault>Default case</ng-container>
</div>
NgClass 和 NgStyle:
用于动态添加或移除CSS类和样式。
<div [ngClass]="{'active': isActive, 'disabled': isDisabled}"></div>
<div [ngStyle]="{'color': color, 'font-size': size}"></div>
NgModel:
用于实现双向数据绑定,通常与表单控件一起使用。
<input type="text" [(ngModel)]="name">
FormsModule:
提供了NgModel以及其他表单相关的指令,需要在模块中导入。
import { FormsModule } from '@angular/forms';
@NgModule({imports: [FormsModule]
})
NgTemplateOutlet:
用于插入一个模板到指定的位置。
<ng-template let-item="item"><div>{{ item }}</div>
</ng-template>
<ng-container *ngTemplateOutlet="template; context: { $implicit: context }"></ng-container>
NgComponentOutlet:
用于动态创建组件实例。
<ng-component-outlet [component]="dynamicComponent"></ng-component-outlet>
NgIfElse:
与NgIf一起使用,用于提供条件为假时的备用内容。
<div *ngIf="condition; else elseBlock">True</div>
<ng-template #elseBlock>False</ng-template>
AsyncPipe:
用于订阅可观察对象,并自动清理订阅。
<div>{{ (data$ | async)?.property }}</div>
NgNonBindable:
用于跳过元素及其子元素的Angular绑定。
<span ngNonBindable>{{ '{' }}{{ value }}{{ '}' }}</span>
NgContent:
用于在组件中分配内容(使用标签)。
NgHost:
用于在创建组件时指定宿主元素。
相关文章:
Angular面试题汇总系列一
1. 如何理解Angular Signal Angular Signals is a system that granularly tracks how and where your state is used throughout an application, allowing the framework to optimize rendering updates. 什么是信号 信号是一个值的包装器,可以在该值发生变化时…...
【面试分享】主流编程语言的内存回收机制及其优缺点
以下是几种主流编程语言的内存回收机制及其优缺点: 一、Java 内存回收机制: Java 使用自动内存管理,主要通过垃圾回收器(Garbage Collector,GC)来回收不再被使用的对象所占用的内存。Java 的垃圾回收器会定…...
Java中的多线程
文章目录 Java中的多线程一、引言二、多线程的创建和启动1、继承Thread类2、实现Runnable接口 三、线程的常用方法1、currentThread()和getName()2、sleep()和yield()3、join() 四、线程优先级五、使用示例六、总结 Java中的多线程 一、引言 在Java中,多线程编程是…...
TypeError: issubclass() arg 1 must be a class
TypeError: issubclass() arg 1 must be a class 报错代码: import spacy 原因: 库版本错误, 解决方法: pip install typing-inspect0.8.0 typing_extensions4.5.0 感谢作者: langchain TypeError: issubclass() …...
C语言实例之9斐波那契数列实现
1. 斐波那契数列简介 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多・斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为 “兔子数列”。 它的特点是从第三…...
Flink 常用问题及常用配置(有用)
一、Flink 常用问题及常用配置 参数 示例 说明 execution.checkpointing.interval 3min Checkpoint 触发间隔 state.backend rocksdb / filesystem 用于设置statebackend类型, 默认会以内存为statebackend(无法支持大状态) taskmanager.memory.jvm-overhead.max 204…...
什么是内网穿透开发
文章目录 前言实现内网穿透的常见技术方法1. 反向代理与端口映射2. 第三方内网穿透服务3. 自建穿透服务4. VPN(虚拟专用网络) 内网穿透开发的关键点1. 安全性2. 性能3. 合法性和合规性 适用场景 前言 内网穿透开发是指将位于内网或防火墙后的应用服务&a…...
RabbitMQ简单应用
概念 RabbitMQ 是一种流行的开源消息代理(Message Broker)软件,它实现了高级消息队列协议(AMQP - Advanced Message Queuing Protocol)。RabbitMQ 通过高效的消息传递机制,主要应用于分布式系统中解耦应用…...
创建HTTPS网站
每天,我们都会听到网络上发生身份盗窃和数据侵权的案例,这导致用户对自己访问的网站更加怀疑。他们开始更加了解自己将个人信息放在哪里以及信任哪些类型的网站。了解如何使网站使用HTTPS变得比以往任何时候都更加重要。 解读缩略词:HTTP与HT…...
【DL笔记】神经网络轻量化(CV方向)的一些论文记录
现在大模型爆火,但俺这种组里只有10系显卡的下水道科研老鼠也要混毕业的,于是选择做小模型(x)。本人纯科研飞舞一个,刚入学有段时间爱看论文,今天有空把那会看到论文总结下。 轻量化,相关文章的…...
计算(a+b)/c的值
计算(ab)/c的值 C语言代码C语言代码Java语言代码Python语言代码 💐The Begin💐点点关注,收藏不迷路💐 给定3个整数a、b、c,计算表达式(ab)/c的值,/是整除运算。 输入 输入仅一行&…...
11.26作业
#include "test.h" #include <myhead.h>int main(int argc, const char *argv[]) {Student students[100]; // 假设最多有100个学生int select 0;int n 0; // 学生数量menu();while (1) {printf("请输入你想要的功能:");scanf("%…...
AdaPipe:动态规划解决显存和GPU在LLM计算中出现气泡问题
目录 AdaPipe:动态规划解决显存和GPU在LLM计算中出现气泡问题 0-5表示不同数据 大的方块表示:管道,便于理解了想成GPU 黄色方块表示显存 Stage表示Attention和FFN layer(Projection和MLP) 重计算和分区策略:细化了Attention和FFN layer Transformer中的管道 AdaPi…...
C++设计模式之组合模式中如何实现同一层部件的有序性
在组合模式中,为了实现同一层上部件的有序性,可以采取以下几种设计方法: 1. 使用有序集合 使用有序集合(如 std::list、std::vector 或其他有序容器)来存储和管理子部件。这种方法可以确保子部件按照特定顺序排列&am…...
QT QRadioButton控件 全面详解
本系列文章全面的介绍了QT中的57种控件的使用方法以及示例,包括 Button(PushButton、toolButton、radioButton、checkBox、commandLinkButton、buttonBox)、Layouts(verticalLayout、horizontalLayout、gridLayout、formLayout)、Spacers(verticalSpacer、horizontalSpacer)、…...
【IEEE独立出版 | 厦门大学主办】第四届人工智能、机器人和通信国际会议(ICAIRC 2024,12月27-29日)
第四届人工智能、机器人和通信国际会议(ICAIRC 2024) 2024 4th International Conference on Artificial Intelligence, Robotics, and Communication 重要信息 会议官网:www.icairc.net 三轮截稿时间:2024年11月30日23:59 录…...
Dubbo的RPC泛化调用
目录 一、RPC泛化调用的应用场景 二、Dubbo RPC泛化调用的实现原理 三、Dubbo RPC泛化调用的实现步骤 四、示例代码 五、泛化调用怎么发现提供该接口的服务及服务的IP和端口? Dubbo的RPC泛化调用是一种在调用方没有服务方提供的API的情况下,对服务方…...
Java面试题、八股文学习之JVM篇
1.对象一定分配在堆中吗?有没有了解逃逸分析技术? 对象不一定总是分配在堆中。在Java等一些高级编程语言中,对象的分配位置可以通过编译器或运行时系统的优化来决定。其中,逃逸分析(Escape Analysis)是用于…...
Apache Maven Assembly 插件简介
Apache Maven Assembly 插件是一个强大的工具,允许您以多种格式(如 ZIP、TAR 和 JAR)创建项目的分发包。 该插件特别适用于将项目与其依赖项、配置文件和其他必要资源一起打包。 通过使用 Maven Assembly 插件,您可以将项目作为…...
3174、清除数字
3174、[简单] 清除数字 1、题目描述 给你一个字符串 s 。你的任务是重复以下操作删除 所有 数字字符: 删除 第一个数字字符 以及它左边 最近 的 非数字 字符。 请你返回删除所有数字字符以后剩下的字符串。 2、解题思路 遍历字符串: 我们需要逐个遍…...
【C#】C# resx方式实现多语言切换(静态切换)
1. 效果 中文界面 英文界面 2. 步骤 1. 添加resx文件 2. Form1.en-GB.resx内容 3. Form1.zh-CN.resx内容 4. Form1.cs修改(重点) using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using Syste…...
鸿蒙系统ubuntu开发环境搭建
在RISC-V等平台移植鸿蒙系统OpenHarmony,需要使用linux环境进行代码的编译,为兼顾日常办公需要,可采用WindowsUbuntu虚拟机的混合开发的环境,通过网络及文件夹共享,在主机和虚拟机之间共享文件数据。 工具准备&#x…...
TCP/IP协议攻击与防范
一、TCP/IP协议攻击介绍 1.1 Internet的结构 LAN:局域网 WAN:广域网 WLAN:无线局域网 私有IP地址与公有IP地址? 私有地址:A类:10.0.0.0~10.255.255.255 B类:172.16.0.0~172.31.255.255…...
1 ISP一键下载
BOOT0BOOT1启动模式说明0X用户Flash用户闪存存储器,也就是Flash启动10系统存储器系统存储器启动,串口下载11SRAM启动SRAM启动,用于在SRAM中调试代码 闪存存储器 是STM32 的内置FLASH,一般使用JTAG或者SWD模式下载程序时,就是下载…...
vue的理解
什么是vue vue是一套用于构建用户界面的渐进式框架,与其他框架不同的是,vue被设计为可以自底向上逐层应用,它也是创建单页面应用的web应用框架。vue的核心库只关注视图层,不仅易上手,还便于与第三方库或既有项目整合。…...
【Leetcode】3206.交替组1
题目描述: https://leetcode.cn/problems/alternating-groups-i/description/?envTypedaily-question&envId2024-11-26 题目示例: 解题思路 思路一: 1.如果color.size()小于等于2,则构不成环,直接返回结果…...
极狐GitLab 17.6 正式发布几十项与 DevSecOps 相关的功能【二】
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…...
oracle小技巧-解决特殊密码字符而导致的exp错误
在使用oracle数据库的时候,我们经常会利用exp工具对某些表进行导出。但有些时候,因我们用户密码为安全性设有特殊字符,导致exp导出时候报:“EXP-00056和ORA-12154”,今天我们就分享下如何通过设置符号隔离的小技巧解决…...
tomcat 文件上传 (CVE-2017-12615)
目录 1、漏洞描述 2、访问ip:port 3、漏洞利用 4、Exploit 5、修复建议 1、漏洞描述 Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。 攻击者将有可能可通过…...
每天五分钟深度学习框架pytorch:卷积神经网络的搭建
本文重点 从本文开始我们将开启卷积神经网络的搭建了,卷积神经网络网络是深度学习中基础的算法模型之一,但是这里我们从实战为主,我们并不会对卷积神经网络详细的介绍,如果不懂得可以看我得《每天五分钟计算机视觉》专栏。 卷积神经网络 卷积神经网络可以认为是多个卷积…...
Opencv+ROS实现颜色识别应用
目录 一、工具 二、原理 概念 本质 三、实践 添加发布话题 主要代码 四、成果 五、总结 一、工具 opencvros ubuntu18.04 摄像头 二、原理 概念 彩色图像:RGB(红,绿,蓝) HSV图像:H࿰…...
JVM详解:垃圾回收机制
java作为大型服务开发的主流语言,其运行会占用大量的内存空间,那么合理的使用有限的服务器资源至关重要。和大多数翻译性语言一样,java的运行环境jvm也内置垃圾回收机制,其通过一些合理的算法组合,定时来对堆中保存的不…...
【单片机的结构和组成】
目录 1、中央处理单元(CPU):2、存储器:3、输入/输出(I/O)接口:4、定时器/计数器:5、模拟-数字转换器(ADC):6、数字-模拟转换器(DAC&am…...
上下文信息、全局信息、局部信息
摘要 在计算机视觉中,上下文信息(contextual information)是一个核心概念,它指的是一个像素或一个小区域周围的环境或背景信息。这种信息对于模型理解图像中对象的相对位置、大小、形状,以及与其他对象的关系至关重要…...
Ansible--自动化运维工具
Ansible自动化运维工具介绍 1.Ansible介绍 Ansible是一款自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。…...
【每日一题】142.环形链表II
最近有点懈怠了,因为连续出差,身心俱疲,实在是没有空做题。 这道题的思路是快慢指针,需要对环形的链表进行数学公式的计算。 根据这个公式可以推断出一个数学结论,当快慢指针相遇的时候,快指针从起点再出发…...
YOLO系列论文综述(从YOLOv1到YOLOv11)【第1篇:概述物体检测算法发展史、YOLO应用领域、评价指标和NMS】
目录 1 前言2 YOLO在不同领域的应用3 物体检测指标和NMS3.1 mAP和IOU3.2 mAP计算流程3.2.1 VOC 数据集3.2.2 微软 COCO 数据集 3.3 NMS 1 前言 最近在做目标检测模型相关的优化,重新看了一些新的论文,发现了几篇写得比较好的YOLO系列论文综述࿰…...
TailwindCss 总结
目录 一、简介 二、盒子模型相关 三、将样式类写到一个类里面apply 四、一款TailWind CSS的UI库 一、简介 官方文档:Width - TailwindCSS中文文档 | TailwindCSS中文网 Tailwind CSS 的工作原理是扫描所有 HTML 文件、JavaScript 组件以及任何 模板中的 CSS 类…...
【开源项目】2024最新PHP在线客服系统源码/带预知消息/带搭建教程
简介 随着人工智能技术的飞速发展,AI驱动的在线客服系统已经成为企业提升客户服务质量和效率的重要工具。本文将探讨AI在线客服系统的理论基础,并展示如何使用PHP语言实现一个简单的AI客服系统。源码仓库地址:ym.fzapp.top 在线客服系统的…...
MySQL原理简介—11.优化案例介绍
大纲 1.禁止或改写SQL避免自动半连接优化 2.指定索引避免按聚簇索引全表扫描大表 3.按聚簇索引扫描小表减少回表次数 4.避免产生长事务长时间执行 1.禁止或改写SQL避免自动半连接优化 (1)业务场景介绍 (2)SQL性能问题分析 (3)SQL性能调优 (1)业务场景介绍 某互联网公司…...
Http 响应协议
HTTP的响应协议 响应数据格式 响应行 响应数据的第一行,包括协议、状态码、描述 响应头 从响应数据格式的第二行开始,也是以key:value的格式 响应体 和响应头之间有一个空行,是响应数据格式的最后一部分,用于存放响应的数据 常见响…...
实现 Browser 客户端下载 XML 文件功能
后端 使用 io.BytesIO 方法 创建一个字节缓冲区在不需要磁盘文件的情况下进行文件操作打包为 zip 压缩包(上图代码)in_memory_zip.seek(0) 数据写入ZIP后文件指针会停留在缓冲区的末尾将文件指针重置回开头make_response() 方法用于创建HTTP响应的函数.g…...
Matlab以一个图像分类例子总结分类学习的使用方法
目录 前言 导入数据 训练学习 导出训练模型 仿真测试 总结 前言 最近在尝试一些基于Simulink的边沿AI部署,通过这个案例总结Matlab 分类学习功能的使用。本案例通过输入3000张28*28的灰度图像,训练分类学习模型。并验证训练好的模型最后部署到MCU。 导入数据 如下图是…...
AI-agent矩阵营销:让品牌传播无处不在
矩阵营销是一种通过多平台联动构建品牌影响力的策略,而 AI-agent 技术让这一策略变得更加智能化。AI社媒引流王凭借其矩阵管理功能,帮助品牌在多个平台上实现深度覆盖与精准传播。 1. 矩阵营销的优势 品牌触达更广:多平台联动可以覆盖不同用…...
HDMI转VGA方案 LT8612UX(HDMI2.0) LT8612SX LT8511EX LT8522EX LT8612EX_e(HDMI1.4)
一、产品概述 LT8612UX是一款高性能的HDMI至HDMI&VGA转换器,由龙迅半导体公司推出。它能够将HDMI2.0数据流转换为HDMI2.0信号和模拟RGB信号,同时输出8通道I2S和SPDIF信号,实现高质量的7.1声道音频。该转换器采用最新的ClearEdge技术&…...
零基础3分钟快速掌握 ——Linux【终端操作】及【常用指令】Ubuntu
1.为啥使用Linux做嵌入式开发 能广泛支持硬件 内核比较高效稳定 原码开放、软件丰富 能够完善网络通信与文件管理机制 优秀的开发工具 2.什么是Ubuntu 是一个以桌面应用为主的Linux的操作系统, 内核是Linux操作系统, 具有Ubuntu特色的可视…...
腾讯云OCR车牌识别实践:从图片上传到车牌识别
在当今智能化和自动化的浪潮中,车牌识别(LPR)技术已经广泛应用于交通管理、智能停车、自动收费等多个场景。腾讯云OCR车牌识别服务凭借其高效、精准的识别能力,为开发者提供了强大的技术支持。本文将介绍如何利用腾讯云OCR车牌识别…...
第二十二课 Vue中的组件切换
Vue中的组件切换 :is 操作符可以用于组件的切换,配合component标签可以实现根据不同的组件名进行组件的切换效果 组件切换实例 1):is与component实现组件切换 <div id"app"><button click"checks()">点击切换组件&l…...
抖音短视频矩阵源代码部署搭建流程
抖音短视频矩阵源代码部署搭建流程 1. 硬件准备 需确保具备一台性能足够的服务器或云主机。这些硬件设施应当拥有充足的计算和存储能力,以便支持抖音短视频矩阵系统的稳定运行。 2. 操作系统安装 在选定的服务器或云主机上安装适合的操作系统是关键步骤之一。推…...
【Linux】线程同步与互斥
文章目录 1. 线程互斥1.1 进程线程间的互斥相关背景概念1.2 互斥量mutex1.3 相关操作1.4 互斥量实现原理1.5 互斥量的封装 2. 线程同步2.1 条件变量2.2 生产者消费者模型2.3 基于BlockingQueue的生产者消费者模型2.4 信号量2.5 基于环形队列的生产消费模型 3. 线程池3.1 日志3.…...