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

Android高级面试_12_项目经验梳理

Android 高级面试-1:Handler 相关

问题:Handler 实现机制(很多细节需要关注:如线程如何建立和退出消息循环等等)
问题:关于 Handler,在任何地方 new Handler 都是什么线程下?
问题:Handler 发消息给子线程,looper 怎么启动?
问题:在子线程中创建 Handler 报错是为什么?
问题:如何在子线程创建 Looper?
问题:为什么通过 Handler 能实现线程的切换?

参考:

  1. Handler 机制:Handler 机制中有 4 个主要的对象:Handler、Message、MessageQueue 和 Looper.

    1. Handler 负责消息的发送和处理;
    2. Message 是消息对象,是链表(不是队列!)的一个结点。Message 的布局变量保存了 Handler,处理消息时就是从 Message 上获取 Handler,并调用它的 dispatchMessage(),并进一步回调 handleMessage() 方法执行我们的逻辑。
    3. MessageQueue 是消息队列,用于存放消息对象的数据结构;
    4. Looper 是消息队列的处理者,用于轮询消息队列,使用 MessageQueue 取出 Message。
  2. 线程的问题

    1. 当我们在某个线程当中调用 new Handler() 的时候会使用当前线程的 Looper 创建 Handler. 当前线程的 Looper 存在于线程局部变量 ThreadLocal 中。
    2. 在使用 Handler 之前我们需要先调用 Looper.prepare() 方法实例化当前线程的 Looper,并将其放置到当前线程的线程局部变量中。
    3. 一个线程的 Looper 只会被创建一次,之后会先从 ThreadLocal 中获取再使用。
    4. 调用 Looper.prepare() 时会调用 Looper 的构造方法,并在构造方法中初始化 MessageQueue.
    5. 当我们调用 Looper.loop() 时开启消息循环。
    6. 主线程的 Looper 在 ActivityThread 的静态 main() 方法中被创建。主线程的 Looper 跟其他线程有所区别,主线程的 Looper 不能停止。我们可以使用 Looper.getMainLooper() 方法来获取主线程的 Looper,并使用它来创建 Handler.

    所以,在非主线程中使用 Handler 的标准是:

Looper.prepare(); // 内部会调用 Looper 的 new 方法实例化 Looper 并将其放进 TL
new Handler().post(() -> /* do something */);
Looper.loop();
  1. 在 Looper 的 loop() 中开启无限循环为什么不会导致主线程 ANR 呢? 这是因为 Android 系统本身就是基于消息机制的,而 Looper 的 循环就是来处理这些消息的。造成卡顿和 ANR 是因为某个消息阻塞了 Looper 循环,导致界面消息得不到处理,而不是 Looper 循环本身。并且如果 Looper 中没有消息需要处理,循环将会结束,线程也就关闭了。

  2. Handler 内存泄漏及解决办法:如果 Handler 不是静态内部类,Handler 会持有 Activity 的匿名引用。当 Activity 要被回收时,因为 Handler 在做耗时操作没有被释放,Handler Activity 的引用不能被释放导致 Activity 没有被回收停留在内存中造成内存泄露。 解决方法是:

    1. 将 Handler 设为静态内部类,如果需要的话,使用弱引用引用外部的 Activity;
    2. 在 Activity 生命周期 onDestroy() 中调用 Handler.removeCallbacks() 方法。

问题:Handler.post() 的逻辑在哪个线程执行的,是由 Looper 所在线程还是 Handler 所在线程决定的?
问题:Handler 的 post()/send() 的原理?
问题:Handler 的 post() 和 postDelayed() 方法的异同?

post() 方法所在的线程由 Looper 所在线程决定的;最终逻辑是在 Looper.loop() 方法中,从 MQ 中拿出 Message,并且执行其逻辑。这是在 Looper 中执行的。因此由 Looper 所在线程决定。

不论你调用 send() 类型的方法还是 post() 类型的方法,最终都会调用到 sendMessageAtTime() 方法。post()postDelay() 的区别在于,前者使用当前时间,后者使用当前时间+delay 的时间来决定消息触发的时间。最终方法的参数都将被包装成一个 Message 对象加入到 Handler 对应的 Looper 的 MQ 中被执行。

问题:Looper 和 Handler 一定要处于一个线程吗?子线程中可以用 MainLooper 去创建 Handler吗?

Looper 和 Handler 不需要再一个线程中,默认的情况下会从 TL 中取当前线程对应的 Looper,但我们可以通过显式地指定一个 Looper 的方式来创建 Handler. 比如,当我们想要在子线程中发送消息到主线程中,那么我们可以

Handler handler = new Handler(Looper.getMainLooper());

问题:Handler.post() 方法发送的是同步消息吗?可以发送异步消息吗?

用户层面发送的都是同步消息,不能发送异步消息;异步消息只能由系统发送。

问题:MessageQueue.next() 会因为发现了延迟消息,而进行阻塞。那么为什么后面加入的非延迟消息没有被阻塞呢?
问题:MessageQueue.enqueueMessage() 方法的原理,如何进行线程同步的?
问题:MessageQueue.next() 方法内部的原理?
问题:next() 是如何处理一般消息的?
问题:next() 是如何处理同步屏障的?
问题:next() 是如何处理延迟消息的?

  1. 创建 Looper 时会同时创建一个 MQ,而 MQ 同时又会调用 nativeInit() 方法在 Native 层实例化一个 MQ 和 Looper,并返回 Native 的 MQ 对象的指针.
  2. Java 层的 Looper 和 Native 层的 Looper 之间使用 epoll 进行通信。
  3. 当调用 Looper 的 loop() 方法的时候会启动一个 for 循环来对消息进行处理。它调用 MQ 的 next() 方法尝试获取消息,这个方法也是一个 for 循环,它调用 nativePollOnce() 向管道写入一个消息,并等待返回,如果没有消息这里就会阻塞。当拿到了返回结果之后,这里继续向下进行处理,从 Message 中读取消息并进行处理。
  4. 在线程安全方面,当从 nativePollOnce() 中返回之后,使用 sychronized(this) 对 MQ 进行加锁来保证线程安全。
  5. 当使用 Handler 向 MQ 中添加消息时,会根据消息触发时间决定它在链表中的位置,时间早的位于链表的头结点。然后,如果此时 MQ 处于阻塞状态,那么就会调用 nativeWake() 方法向管道中写入消息,这样 MQ 就从 nativePollOnce() 中返回了。
  6. 同步屏障用来立即推迟所有将要执行的同步消息,知道释放同步屏障。使用 postSyncBarrier() 进行同步屏障,使用 removeSyncBarrier() 结束同步屏障。前者会返回一个 token,然后我们将其传入到 removeSyncBarrier() 中结束当前的同步屏障。进行内存屏障的时候会创建一个立即执行的消息,并将其添加到 MQ 中。当尝试获取消息的时候就可能会在 nativePollOnce() 阻塞。释放同步屏障的时候会从链表中找到这个结点,并可能调用 nativeWake() 方法。对于同步类型的消息,即使发生了同步屏障,它也会被正常执行。
  7. 同步屏障的使用案例:ViewRootImpl 中,scheduleTraversals() 方法在遍历 View 树之前会进行同步屏障。(猜测是用来暂停非 UI 绘制的消息,UI 绘制完毕之后再恢复执行。)

问题:Handler 的 dispatchMessage() 分发消息的处理流程?
问题:Handler 为什么要有 Callback 的构造方法?

使用 Handler 的时候我们会覆写 Handler 的 handleMessage() 方法。当我们调用该 Handler 的 send() 或者 post() 发送一个消息的时候,发送的信息会被包装成 Message,并且将该 Message 的 target 指向当前 Handler,这个消息会被放进 Looper 的 MQ 中。然后在 Looper 的循环中,取出这个 Message,并调用它的 target Handler,也就是我们定义的 Handler 的 dispatchMessage() 方法处理消息,此时会调用到 Handler 的 handleMessage() 方法处理消息,并回调 Callback.

当 Handler 在消息队列中被执行的时候会直接调用 Handler 的 dispatchMessage() 方法回调 Callback.

问题:Looper 的两个退出方法?
问题:quit() 和 quitSafely() 有什么区别
问题:子线程中创建了 Looper,在使用完毕后,终止消息循环的方法?
问题:quit() 和 quitSafely() 的本质是什么?

    public void quit() {mQueue.quit(false);}public void quitSafely() {mQueue.quit(true);}void quit(boolean safe) {if (!mQuitAllowed)  throw new IllegalStateException("Main thread not allowed to quit.");synchronized (this) {if (mQuitting) return;mQuitting = true;if (safe)  removeAllFutureMessagesLocked(); // 把所有延迟消息清除else       removeAllMessagesLocked();  // 直接把消息队列里面的消息清空nativeWake(mPtr); // 唤醒}}public static void loop() {// ...for (;;) {Message msg = queue.next();if (msg == null) { // 得到了 null 就返回了return;}// ...}}// MQ:Message next() {// ...for (;;) {// ...nativePollOnce(ptr, nextPollTimeoutMillis);synchronized (this) {// ... 这里就返回了 nullif (mQuitting) {dispose();return null;}// ...}}}

quit()quitSafely() 的本质就是让消息队列的 next() 返回 null,以此来退出 Looper.loop()

quit() 调用后直接终止 Looper,不在处理任何 Message,所有尝试把 Message 放进消息队列的操作都会失败,比如 Handler.sendMessage() 会返回 false,但是存在不安全性,因为有可能有 Message 还在消息队列中没来的及处理就终止 Looper 了。

quitSafely() 调用后会在所有消息都处理后再终止 Looper,所有尝试把 Message 放进消息队列的操作也都会失败。

问题:Looper.loop() 在什么情况下会退出?

  1. next() 方法返回的 msg == null;
  2. 线程意外终止。

问题:Looper.loop() 的源码流程?

  1. 获取到 Looper 和消息队列;
  2. for 无限循环,阻塞于消息队列的 next() 方法;
  3. 取出消息后调用 msg.target.dispatchMessage(msg) 进行消息分发。

问题:Looper.loop() 方法执行时,如果内部的 myLooper() 获取不到Looper会出现什么结果?

    public static void loop() {final Looper me = myLooper();if (me == null) {throw new RuntimeException("No Looper; Looper.prepare() wasn't called on this thread.");}// ...}

问题:Android 如何保证一个线程最多只能有一个 Looper?如何保证只有一个 MessageQueue

通过保证只有一个 Looper 来保证只有以一个 MQ. 在一个线程中使用 Handler 之前需要使用 Looper.prepare() 创建 Looper,它会从 TL 中获取,如果发现 TL 中已经存在 Looper,就抛异常。

问题:Handler 消息机制中,一个 Looper 是如何区分多个 Handler 的?

根据消息的分发机制,Looper 不会区分 Handler,每个 Handler 会被添加到 Message 的 target 字段上面,Looper 通过调用 Message.target.handleMessage() 来让 Handler 处理消息。

参考资料

  1. 《Android 中的 Handler 的 Native 层研究》

另外
有什么技术问题欢迎加我交流 qilebeaf
本人10多年大厂软件开发经验,精通Android,Java,Python,前端等开发,空余时间承接软件开发设计、课程设计指导、解决疑难bug、AI大模型搭建,AI绘图应用等。
欢迎砸单

相机

  • Android 中开启摄像头的主要步骤

压缩

深度研究:

  1. SurefaceView, TextureView, Camera
  2. RecyclerView
  3. Adapter + Fragment

热修补+插件化(组件化)

PMW WMS AMW 相关的东西

项目相关

以上的深度研究 + 屏幕适配方式 + WorkManager 的研究

实际相机拍照的时候是先把照片写到磁盘上面然后在从磁盘上面加载到内存的时候使用一个采样率来采样。从最终的效果来看,设置采样率起到了压缩的作用,但是它只是改变了加载的图片的比率。真正起到压缩作用的是把加载到内存之后的 Bitmap 再次写入到磁盘上面并替换原始的文件。所以,相机采用多大的预览图和输出的图片的尺寸跟最终得到的图片的尺寸和大小没有关系——拍摄的照片写入到磁盘上面之后对其进行压缩。

Q:照片太大的话压缩和写入磁盘的效率可能降低,但是这会有多少的性能损失呢?相机预览和输出的时候,寻找一个不是太大的比例?

Q:图片压缩的尺寸压缩的问题,难道除了设置成 2 的比例,就没有其他的办法了吗?

/**
邻近采样:采用一个 2 的倍数,
1. CompressFormat format:压缩格式,它有 JPEG、PNG、WEBP 三种选择,JPEG 是有损压缩,PNG 是无损压缩,压缩后的图像大小不会变化(也就是没有压缩效果),WEBP 是 Google 推出的图像格式,它相比 JPEG 会节省 30% 左右的空间,处于兼容性和节省空间的综合考虑,我们一般会选择 JPEG。
2. int quality:0~100 可选,数值越大,质量越高,图像越大。
3. OutputStream stream:压缩后图像的输出流。
*/
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 1; // 设置加载图片时的采样率
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.blue_red, options);
bitmap.compress(Bitmap.CompressFormat.JPEG, 75, stream); // 压缩,然后使用 stream 写出数据
bitmap.recycle();/**
双线性采样:Bitmap.createBitmap() 的几个参数的意义,
1. Bitmap source:源图像
2. int x:目标图像第一个像素的 x 坐标
3. int y:目标图像第一个像素的 y 坐标
4. int width:目标图像的宽度(像素点个数)
5. int height:目标图像的高度(像素点个数)
6. Matrix m:变换矩阵
7. boolean filter:是否开启过滤
*/
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.blue_red);
Matrix matrix = new Matrix();
matrix.setScale(0.5f, 0.5f);
Bitmap sclaedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth()/2, bitmap.getHeight()/2, matrix, true);
ImageUtils.save(bitmap, savePath, Bitmap.CompressFormat.PNG);

但是第二种方式存在一个问题,因为它在进行压缩之前需要将图片全部加载到内存中,如果图片比较大,那么可能会把内存撑爆,导致 OOM.

所以,我们可以考虑结合两种方式拉

Q:如何根据相机支持的图像的质量选择一个合适的尺寸?即使相同的尺寸和质量的图片,不同分辨率的手机拍摄出的效果还是不同的?如何得出图片的质量的等级?不同分辨率的手机拍摄出的照片影响的是什么的效果?

Q:图片的 Bitmap 的计算规则与最终上次的文件的计算规则一样吗?区别是什么?

其他:视频压缩,视频录制

Android 性能优化-相机优化

场景,人工智能识别图片,对图片质量要求较高,同时为了加快图片上传的速度,需要对图片的大小进行控制,也就是既要保证图片在的质量又要控制图片的体积。照片是由自定义相机拍摄完成的,在拍摄的时候相关参数的选择,相机各种功能的完善等。

所以关注的地方在于,第一是相机,封装一个功能完善的相机库,可以处理常见的问题,同时对 Camera1 和 Camera2 进行兼容。第二是图片的压缩,保证图片的质量,并控制图片的大小。

相机:

相机要解决的几个问题,

  1. 使用 Camera1 还是 Camera2 的问题
  2. TextureView 还是 SurfaceView 的问题
  3. 相机的预览尺寸、输出图片的尺寸和拍摄视频的尺寸的计算
  4. 手势缩放
  5. 对焦(自动对焦、外部调整对焦)
  6. 相机实时预览时,提供对外接口,可以对图片实时进行处理

压缩:

  1. 使用邻近采样将图片加载到内存中(内存防爆)
  2. 使用质量压缩和双线性采样控制图片的尺寸和质量

遗留的问题,不同分辨率的相机拍摄出的相片的质量不一样,在图片尺寸相同的情况下,相机硬件会影响图片的什么呢?

另外
有什么技术问题欢迎加我交流 qilebeaf
本人10多年大厂软件开发经验,精通Android,Java,Python,前端等开发,空余时间承接软件开发设计、课程设计指导、解决疑难bug、AI大模型搭建,AI绘图应用等。
欢迎砸单

相关文章:

Android高级面试_12_项目经验梳理

Android 高级面试-1:Handler 相关 问题:Handler 实现机制(很多细节需要关注:如线程如何建立和退出消息循环等等) 问题:关于 Handler,在任何地方 new Handler 都是什么线程下? 问题&#xff1a…...

【项目实训】解决前后端跨域问题

由于前端框架使用vue,后端使用flask,因此需要解决前后端通信问题 在vue.config.js中修改 module.exports defineConfig({transpileDependencies: true,lintOnSave:false, }) // 跨域配置 module.exports {devServer: { //记住&#x…...

Java反射API详解与应用场景

一、Java反射API简介: 一、什么是反射: 反射是一种强大的工具,它允许我们在运行时检查类、方法和字段的信息,甚至允许我们动态的调用特定类的方法或改变字段的值。编程语言中的反射机制通常用于从类、对象或方法中检索元数据,或者更特别的说,从代码本身中获取信息。这就…...

【例子】webpack 开发一个可以加载 markdown 文件的加载器 loader 案例

Loader 作为 Webpack 的核心机制,内部的工作原理却非常简单。接下来我们一起来开发一个自己的 Loader,通过这个开发过程再来深入了解 Loader 的工作原理。 这里我的需求是开发一个可以加载 markdown 文件的加载器,以便可以在代码中直接导入 m…...

揭秘!这款电路设计工具让学校师生都爱不释手——SmartEDA的魔力何在?

随着科技的飞速发展,电子设计已成为学校师生们不可或缺的技能之一。而在众多的电路设计工具中,有一款名为SmartEDA的工具,凭借其强大的功能和友好的用户体验,迅速赢得了广大师生的青睐。今天,就让我们一起探索SmartEDA…...

onlyoffice实现打开文档的功能

后端代码 import api from api import middlewareasync def doc_callback(request):data await api.req.get_json(request)print("callback ", data)# status 2 文档准备好被保存# status 6 文档编辑会话关闭return api.resp.success()app api.Api(routes[api.…...

基于 SpringBoot + Vue 的图书购物商城项目

本项目是一个基于 SpringBoot 和 Vue 的图书购物商城系统。系统主要实现了用户注册、登录,图书浏览、查询、加购,购物车管理,订单结算,会员折扣,下单,个人订单管理,书籍及分类管理,用…...

如何使用kimi智能助手:您的智能生活小助手

Kimi智能助手是一款功能强大的AI工具,旨在帮助用户提高工作效率和生活品质。下面小编将详细介绍如何使用Kimi智能助手,涵盖其主要功能以及一些实用技巧。 一、Kimi智能助手的主要功能 多语言对话能力:Kimi擅长中文和英文的对话,可…...

sql操作

1. 按条件将表A的数据更新到表B中: update B b set b.col1 (select col1 from A a where b. id a.code), b.col2 (select col2 from A a where b. id a.code), ………… 2. 将表A的全量数据插入到表B中 insert into B (col1, col2, col3, col4,……&am…...

开关电源调试记录-基于DK112(DK1203也一样)作为开关主控芯片的开关电源

调试了一款DK112(datasheet)开关电源控制芯片。 1、原理图如下: 2、测试波形 a.输出波形,图中标识“5V”的位置 b.芯片VCC引脚,图中标识“4”的位置 c.芯片FB引脚,图中标识“3”的位置 对于FB引脚&…...

【自然语言处理】GPT-5技术突破预测:引领自然语言处理革新的里程碑

摘要 随着科技的飞速发展,人工智能(AI)领域正迎来一场前所未有的革命。近日,OpenAI首席技术官米拉穆拉蒂在采访中透露,新一代大语言模型GPT-5将在一年半后发布,这一消息无疑在科技界掀起了巨大的波澜。GPT-…...

qt基本窗口类(QWidget,QDialog,QMainWindow)

1.三个基本窗口类 1.1QWidget 所有窗口的基类 可以内嵌到其他窗口的内部,无边框 也可以作为独立窗口显示,有边框 1.2QDialog 继承于QWidget 对话框窗口类 不可以内嵌到其他窗口 有模态和非模态两种显示方式 1.3QMainWind 继承于QWidget 主窗口类 不可以…...

最新收录历年地震数据,含时间、位置、类型、震级等信息

基本信息. 数据名称: 历年地震数据 数据格式: Shp 数据时间: 2023年 数据几何类型: 点 数据坐标系: WGS84坐标系 数据来源:网络公开数据 数据字段: 序号字段名称字段说明1dzlx地震类型2zj震级3zysd震源深度(米)4jtwz…...

C++ 串口读写

这段代码演示了如何使用 Windows API 中的串口通信功能进行简单的数据发送和接收。它使用了串口的基本操作和设置,并通过 sendSizeCategory 函数实现了一个简单的串口通信示例,发送一个十六进制数据,并读取串口返回的数据。 _CRT_SECURE_NO_WARNINGS:这是针对使用 strcpy …...

WebRTC系列实战-自定义RTP中的extension

文章目录 1. 新增extensionsId;1.1 新增自定义extension1.2 准备添加到sdp相关操作1.3 对header长度返回的修改:2. 自定义extesion的写入及注册到extensionMap中2.1 添加到RTPheader中2.2. 大小限制2.3. 是否注册限制2.4. 自定义extension注册需要修改的位置3.接收端解析及注…...

std::function和std::bind函数

std::function和std::bind是C11引入的功能强大的库组件,用于处理函数对象和函数调用的高级操作。它们极大地增强了C处理回调、函数指针和函数对象的能力。 std::function std::function是一个通用的、多态的函数封装器,可以容纳任何可调用的目标——包…...

补码的理解,想明白了觉得还挺有趣的

原因: 之前会一直好奇补码为什么是这么设计的,刚刚发呆的时候突然就明白了。 设计目的: 要理解,补码的设计初衷是为了计算机的计算问题。计算机的加法计算是非常简单的,但是对于减法,因为要借位&#xf…...

FuTalk设计周刊-Vol.027

🔥🔥交互体验 创意运营🔥🔥 1、「AIGC实战」城市消费券项目经验 随着AI图像生成技术的高速发展,以Midjourney、Stable diffusion为例的AI工具引起了大家广泛的研究和应用浪潮,也印证了早期流传在AIGC圈的…...

抖音外卖服务商有哪些,盘点这几家正规服务商!

当前,抖音外卖的关注度不断上涨,抖音外卖服务商也逐渐成为了众多创业者心中的理想创业赛道。在此背景下,抖音外卖服务商的入局途径多次引发创业者热议,以抖音外卖服务商有哪些公司为代表的相关话题更是长期位居创业者问题榜单的前…...

sh脚本模块笔记

sh脚本模块笔记 1. 如果不存在,则创建指定目录2. 检测python启动指令 记录一些sh脚本中用到过的模块 1. 如果不存在,则创建指定目录 这个脚本首先会检查指定的目录是否存在,如果存在则会打印错误消息并退出,否则会创建该目录&am…...

关于服务器的一些知识

1. 云服务器 和 轻量应用服务器 腾讯云中的"云服务器"(Cloud Virtual Machine, CVM)和"轻量应用服务器"(Lite Cloud Server)都是提供云端计算资源的服务,但它们在定位、特性和使用场景上存在一些差…...

力扣-和为K的子数组

题目-和为 K 的子数组 解法1&#xff1a;两层for循环 public class T560 {public static int subarraySum(int[] nums, int k) {int res 0;for (int i 0; i < nums.length; i) {int tempSum 0;for (int j i; j < nums.length; j) {tempSum nums[j];if (tempSum k)…...

写一个坏越个人天地(五)

昨天整了半天天气api还是有点小问题。一天50次真的不够我test的。一气之下还是全删了改用高德api。把接口写在了后端&#xff0c;这样我启动界面后就可以直接通过接口在后端嘎嘎处理逻辑了。再整理返回就好了 不过高德api好像获取地址的概率好低&#xff0c;于是我还是整了个获…...

步步精科技诚邀您参加2024慕尼黑上海电子展

尊敬的客户&#xff1a; 我们诚挚地邀请您参加即将于2024年7月8日至7月10日在上海新国际博览中心举办的2024慕尼黑上海电子展&#xff08;electronica China&#xff09;。此次展会汇聚了国内外优秀企业&#xff0c;展示从元器件到系统集成方案的完整产品链&#xff0c;为各行…...

Spring Boot中如何配置和使用多数据源

Spring Boot中如何配置和使用多数据源 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我们将深入探讨如何在Spring Boot应用中配置和使用多数据…...

vue3 【提效】全局布局 vite-plugin-vue-layouts 实用教程

一个常见的需求是&#xff0c;同模块的若干页面需要使用同一种布局&#xff0c;比如俱乐部相关的页面的顶部需要展示俱乐部的名称&#xff0c;其他页面顶部需要展示网站名称。 通常实现的方法是&#xff0c;将俱乐部的名称和网站名称定义成公共组件&#xff0c;在每个页面都书…...

前端性能优化-实测

PageSpeed Insights 性能测试 今天测试网站性能的时候发现一个问题&#xff0c;一个h2标签内容为什么会占据这么长的渲染时间&#xff0c;甚至有阶段测到占据了7000多毫秒&#xff0c;使用了很多方法都不能解决&#xff0c;包括了修改标签&#xff0c;样式大小等&#xff0c;当…...

【Linux】初识操作系统

一、冯•诺依曼体系结构 在学习操作系统之前&#xff0c;我们先来认识一下冯•诺依曼体系结构&#xff0c;我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。 截至目前&#xff0c;我们所认识的计算机&am…...

等保2.0中,如何确保云服务提供商的数据主权合规?

等保2.0中云服务提供商的数据主权合规措施 等保2.0&#xff08;网络安全等级保护2.0&#xff09;是中国的网络安全标准&#xff0c;旨在确保云服务提供商的数据主权合规。以下是一些关键措施和要求&#xff1a; 数据地理位置要求&#xff1a;云服务提供商必须保证所有基础设施位…...

【AI大模型】Transformers大模型库(十四):Datasets Viewer

目录 一、引言 二、Datasets Viewer数据查看器 2.1 概述 2.2 示例 三、总结 一、引言 这里的Transformers指的是huggingface开发的大模型库&#xff0c;为huggingface上数以万计的预训练大模型提供预测、训练等服务。 &#x1f917; Transformers 提供了数以千计的预训练…...

一个例子理解傅里叶变换的计算过程

假设我们有一个简单的信号&#xff0c;由两个不同频率的正弦波组成&#xff0c;我们希望通过傅里叶变换来分析其频谱。 示例信号 假设我们有一个信号 &#xff1a; 这个信号由两个频率成分组成&#xff1a;一个50 Hz的正弦波和一个120 Hz的正弦波&#xff0c;后者的振幅是前者…...

2-2到2-4

计算出所有人的平均年龄&#xff1a; val lines sc.textFile("/root/data/scala/people/page.txt") val count lines.count() val total lines.map(line > line.split(" ")(1)).map(t>t.trim.toInt).collect().reduce((a,b)>ab) val avgAge …...

Vatee万腾平台:一站式智慧服务,让生活更美好

在数字化浪潮席卷全球的今天&#xff0c;我们生活的方方面面都在经历着前所未有的变革。Vatee万腾平台凭借其一站式智慧服务&#xff0c;正成为推动这场变革的重要力量&#xff0c;让我们的生活变得更加美好。 Vatee万腾平台&#xff0c;作为一家专注于提供智慧服务的领军企业&…...

如何选择一个好的汽车油封制造商?

汽车的每一个零部件都至关重要&#xff0c;其中&#xff0c;油封的作用更是不可忽视。它们确保了液体和气体在汽车内部的正确流动&#xff0c;防止了泄漏。因此&#xff0c;选择一个可靠的汽车油封制造商就显得尤为重要。那么&#xff0c;我们应该如何做出明智的选择呢? 首先…...

构建高效的电商返利系统:架构设计与实现

构建高效的电商返利系统&#xff1a;架构设计与实现 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 电商返利系统作为连接消费者和商家的桥梁&#xff0c;能够…...

如何使用 Python 交互式解释器?

1. 什么是Python交互式解释器&#xff1f; Python交互式解释器是一种REPL&#xff08;Read-Eval-Print Loop&#xff09;环境。它会读取用户输入的代码&#xff0c;执行代码&#xff0c;并输出结果&#xff0c;随后等待下一个用户输入。这种交互方式使得Python非常适合快速原型…...

C++日期类的完整实现,以及this指针的const修饰等的介绍

文章目录 前言一、日期类的实现二、this指针的const修饰总结 前言 C日期类的完整实现&#xff0c;以及this指针的const修饰等的介绍 一、日期类的实现 // Date.h #pragma once#include <iostream> using namespace std;#include <assert.h>class Date {// 友元函…...

缓冲区溢出

本文作者&#xff1a;杉木涂鸦智能安全实验室 前置知识点 栈 栈&#xff08;Stack&#xff09;是计算机中的一种数据结构&#xff0c;用于存储临时数据。它的特点是后入先出&#xff08;LIFO&#xff09;&#xff0c;只能在栈顶添加或删除数据。在程序中&#xff0c;栈被用于…...

step7:“模拟量界面”逻辑

文章目录 文章介绍效果图AnalogPage.qml结构图调用 SerialPortHandler.sendData(message); serialporthandler.cpp 文章介绍 之前的6步实现了案例MF的界面设计和串口界面的逻辑设计&#xff0c;本文将实现模拟量界面的逻辑设计 新增功能&#xff1a; 1&#xff09;弹出提示框 …...

Arduino - 继电器

Arduino - 继电器 In a previous tutorial, we have learned how to turn on/off an LED. In this tutorial, we are going to learn how to turn on/off some kind of devices that use the high voltage power supply(such as a light bulb, fan, electromagnetic lock, lin…...

状态压缩DP——AcWing 327. 玉米田

状态压缩DP 定义 状态压缩 DP 是一种通过二进制压缩状态的动态规划算法。它通过使用位运算来加速状态的转移和计算&#xff0c;从而提高算法的效率。 注意事项 数据范围&#xff1a;状态压缩 DP 通常适用于数据范围较小的问题&#xff0c;因为它需要使用二进制来表示状态&a…...

kafka(二)安装部署(2)windows

目录 一、前提 1、jdk 2、Zookeeper 2.1、解压 2.2、创建data文件夹 2.3、配置文件 2.4、添加环境变量 2.5、启动zk&#xff1a;zkServer 2.6、客户端 3、Scala 3.1、下载安装 3.2、配置环境变量 3.3、验证是否安装成功 二、kafka下载安装 1、下载 2、安装 2.1…...

aliplayer Server returned 403 Forbidden (access denied)

最近在接入阿里云播放器的sdk,项目的播放地址是m3u8的,h265的url 输入播放源以后播放报错,提示403,拒绝访问,起初以为是crt路径问题和key的问题,然后检查了以后没问题,后来又看了一下是不是白名单的问题,但是项目资源没通过阿里云平台存储 AVPUrlSource *source [[AVPUrlSou…...

单例模式(下)

文章目录 文章介绍步骤安排及单例讲解step1&#xff1a;注册单例类型&#xff08;main.cpp&#xff09;step2&#xff1a;定义类和私有构造函数&#xff08;keyboardinputmanager.h&#xff09;step3:&#xff08;keyboardinputmanager.cpp&#xff09;step4&#xff1a;在qml中…...

合约期VS优惠期,搞明白他们的区别才能避免很多坑!

在购买流量卡时&#xff0c;相信大家也都发现了&#xff0c;市面上的不少套餐都是有合约期和优惠期的&#xff0c;尤其是联通和移动&#xff0c;那么&#xff0c;什么是合约期&#xff1f;什么又是优惠期呢&#xff1f; ​ 其实&#xff0c;目前很多在网上办理的大流量卡都是有…...

函数式反应式编程(FRP)在Scala中的实践与探索

函数式反应式编程&#xff08;Functional Reactive Programming&#xff0c;简称FRP&#xff09;是一种编程范式&#xff0c;它结合了函数式编程&#xff08;Functional Programming&#xff0c;FP&#xff09;的声明式特性和反应式编程&#xff08;Reactive Programming&#…...

NGINX配置web文件服务

一、需求描述 系统需要提供文件&#xff08;pdf、图片&#xff09;等上传后支持预览功能。 二、实现方式 2.1 文件权限配置 chmod arwx -R public/chmod 是更改文件权限的命令。-R 是递归选项&#xff0c;表示更改目录及其所有子目录和文件的权限。arwx 是权限设置&#xf…...

deepspeed docker集群实现多机多卡训练----问题记录及解决方案资源汇总

. Docker中实现Deepspeed多机多卡训练 【掘金-雨田君的记事本】docker容器中deepspeed多机多卡集群分布式训练大模型 . 问题记录及解决方案资源汇总 问题1&#xff1a;deepspeed socketStartConnect: Connect to 172.18.0.3<54379> failed : Software caused connectio…...

恢复 IntelliJ IDEA 中消失的菜单栏

要恢复 IntelliJ IDEA 中消失的菜单栏&#xff0c;可以按照以下简单步骤操作&#xff1a; 使用快捷键打开搜索&#xff1a;首先&#xff0c;双击 Shift 键打开全局搜索对话框。 搜索“Menu”&#xff1a;在搜索框中输入 menu&#xff0c;然后从搜索结果中选择与“Main Menu”相…...

漏洞利用开发基础学习记录

文章目录 简介Win32缓冲区溢出内容难点 SEH 溢出内容难点 Egg Hunters内容难点 Unicode 溢出内容难点 x86-64 缓冲区溢出内容难点 参考资料 简介 本文基于ERC.Xdbg漏洞分析文章进行初步归纳整理&#xff0c;主要有Win32 缓冲区溢出、SEH 溢出、Egg Hunters、Unicode 溢出、x86…...