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

USB Hub 检测设备

在这里插入图片描述

系列文章目录


xHCI 简单分析
USB Root Hub 分析
USB Hub 检测设备


文章目录

  • 系列文章目录
  • 一、引言
  • 二、hub_events
    • hub_port_connect_change
    • usb_alloc_dev
    • usb_set_device_state
    • hub_port_init
    • usb_new_device


一、引言

    USB Hub 检测设备 一文中讲到,当有 USB 插入时,它会激活 hub_events 函数。

static int hub_thread(void *__unused)
{do {hub_events();wait_event_interruptible(khubd_wait,!list_empty(&hub_event_list) ||kthread_should_stop());try_to_freeze();} while (!kthread_should_stop() || !list_empty(&hub_event_list));pr_debug("%s: khubd exiting\n", usbcore_name);return 0;
}

二、hub_events

在这里插入图片描述

static void hub_events(void)
{// ...while (1) {// ...tmp = hub_event_list.next;list_del_init(tmp);hub = list_entry(tmp, struct usb_hub, event_list);// 描述 usb 设备(Hub,整体,不是接口)hdev = hub->hdev;intf = to_usb_interface(hub->intfdev);// hub 接口设备hub_dev = &intf->dev;// .../* Lock the device, then check to see if we were* disconnected while waiting for the lock to succeed. */if (locktree(hdev) < 0) {// .../* Autoresume */ret = usb_autopm_get_interface(intf);// .../* deal with port status changes */for (i = 1; i <= hub->descriptor->bNbrPorts; i++) {// ...ret = hub_port_status(hub, i,&portstatus, &portchange);// ...if (connect_change)hub_port_connect_change(hub, i,portstatus, portchange);} /* end for i */// ...if (!hdev->parent && !hub->busy_bits[0])usb_enable_root_hub_irq(hdev->bus);loop_autopm:/* Allow autosuspend if we're not going to run again */if (list_empty(&hub->event_list))usb_autopm_enable(intf);
loop:usb_unlock_device(hdev);usb_put_intf(intf);} /* end while (1) */
}

    在这个循环中,检测 Hub 的每个端口是否有变化,有变化则调用 hub_port_connect_change 进行处理。

hub_port_connect_change

static void hub_port_connect_change(struct usb_hub *hub, int port1,u16 portstatus, u16 portchange)
{struct usb_device *hdev = hub->hdev;struct device *hub_dev = hub->intfdev;// .../* Disconnect any existing devices under this port */if (hdev->children[port1-1])usb_disconnect(&hdev->children[port1-1]);clear_bit(port1, hub->change_bits);// ...for (i = 0; i < SET_CONFIG_TRIES; i++) {struct usb_device *udev;// ...udev = usb_alloc_dev(hdev, hdev->bus, port1);// ...usb_set_device_state(udev, USB_STATE_POWERED);udev->speed = USB_SPEED_UNKNOWN;udev->bus_mA = hub->mA_per_port;udev->level = hdev->level + 1;// ...choose_address(udev);// .../* reset and get descriptor */status = hub_port_init(hub, udev, port1, i);// ...if (!status) {status = usb_new_device(udev);// ...}// ...status = hub_power_remaining(hub);// ...
}

    在这个循环中,主要涉及 8 个重量级函数,先点明它们的角色分工。

    第一个函数,usb_alloc_dev(),一个 struct usb_device 结构体指针,申请内存,这个结构体指针可不是为 Hub 准备的,它正是为了 Hub 这个端口所接的设备而申请的,别忘了我们此时此刻的上下文,之所以进入这个循环,是因为我们的 Hub 检测到某个端口有设备连接,所以,Hub 驱动就义不容辞地要为该设备做点什么。

    第二个函数,usb_set_device_state(),这个函数用来设置设备的状态,在 struct usb_device 结构体中,有一个成员 enum usb_device_state state,这一刻会把这个设备的状态设置为 USB_STATE_POWERED,即上电状态。

    第三个函数,choose_address(),为设备选择一个地址。后面会用实例来查看效果。

    第四个函数,hub_port_init(),端口初始化,主要就是前面所讲的获取设备的描述符。

    第五个函数,usb_get_status(),这个函数是专门为 Hub 准备的,不是为当前的这个 Hub,而是说当前 Hub 的这个端口上连接的如果又是 Hub,那么和连接普通设备就不一样。

    第六个函数,check_highspeed(),不同速度的设备,当然待遇不一样。

    第七个函数,usb_new_device()。寻找驱动程序,调用驱动程序的 probe,跟踪这个函数就能一直到设备驱动程序的 probe() 函数的调用。

    第八个函数,hub_power_remaining(),电源管理。

usb_alloc_dev

struct usb_device *
usb_alloc_dev(struct usb_device *parent, struct usb_bus *bus, unsigned port1)
{struct usb_device *dev;// ...device_initialize(&dev->dev);dev->dev.bus = &usb_bus_type;dev->dev.type = &usb_device_type;dev->dev.dma_mask = bus->controller->dma_mask;dev->state = USB_STATE_ATTACHED;INIT_LIST_HEAD(&dev->ep0.urb_list);dev->ep0.desc.bLength = USB_DT_ENDPOINT_SIZE;dev->ep0.desc.bDescriptorType = USB_DT_ENDPOINT;/* ep0 maxpacket comes later, from device descriptor */dev->ep_in[0] = dev->ep_out[0] = &dev->ep0;// ...dev->portnum = port1;dev->bus = bus;dev->parent = parent;INIT_LIST_HEAD(&dev->filelist);#ifdef	CONFIG_PMmutex_init(&dev->pm_mutex);INIT_DELAYED_WORK(&dev->autosuspend, usb_autosuspend_work);dev->autosuspend_delay = usb_autosuspend_delay * HZ;
#endifreturn dev;
}

usb_set_device_state

void usb_set_device_state(struct usb_device *udev,enum usb_device_state new_state)
{unsigned long flags;spin_lock_irqsave(&device_state_lock, flags);if (udev->state == USB_STATE_NOTATTACHED);	/* do nothing */else if (new_state != USB_STATE_NOTATTACHED) {/* root hub wakeup capabilities are managed out-of-band* and may involve silicon errata ... ignore them here.*/if (udev->parent) {if (udev->state == USB_STATE_SUSPENDED|| new_state == USB_STATE_SUSPENDED);	/* No change to wakeup settings */else if (new_state == USB_STATE_CONFIGURED)device_init_wakeup(&udev->dev,(udev->actconfig->desc.bmAttributes& USB_CONFIG_ATT_WAKEUP));elsedevice_init_wakeup(&udev->dev, 0);}udev->state = new_state;} elserecursively_mark_NOTATTACHED(udev);spin_unlock_irqrestore(&device_state_lock, flags);
}

hub_port_init

static int
hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,int retry_counter)
{// .../* Reset the device; full speed may morph to high speed */retval = hub_port_reset(hub, port1, udev, delay);// ...for (i = 0; i < GET_DESCRIPTOR_TRIES; (++i, msleep(100))) {if (USE_NEW_SCHEME(retry_counter)) {struct usb_device_descriptor *buf;int r = 0;#define GET_DESCRIPTOR_BUFSIZE	64buf = kmalloc(GET_DESCRIPTOR_BUFSIZE, GFP_NOIO);// ...for (j = 0; j < 3; ++j) {buf->bMaxPacketSize0 = 0;r = usb_control_msg(udev, usb_rcvaddr0pipe(),USB_REQ_GET_DESCRIPTOR, USB_DIR_IN,USB_DT_DEVICE << 8, 0,buf, GET_DESCRIPTOR_BUFSIZE,USB_CTRL_GET_TIMEOUT);// ...}udev->descriptor.bMaxPacketSize0 =buf->bMaxPacketSize0;kfree(buf);retval = hub_port_reset(hub, port1, udev, delay);// ...}for (j = 0; j < SET_ADDRESS_TRIES; ++j) {retval = hub_set_address(udev);if (retval >= 0)break;msleep(200);}// ...retval = usb_get_device_descriptor(udev, 8);// ...
}

usb_new_device

int usb_new_device(struct usb_device *udev)
{// ...usb_detect_quirks(udev);err = usb_get_configuration(udev);// .../* read the standard strings and cache them if present */udev->product = usb_cache_string(udev, udev->descriptor.iProduct);udev->manufacturer = usb_cache_string(udev,udev->descriptor.iManufacturer);udev->serial = usb_cache_string(udev, udev->descriptor.iSerialNumber);// .../* export the usbdev device-node for libusb */udev->dev.devt = MKDEV(USB_DEVICE_MAJOR,(((udev->bus->busnum-1) * 128) + (udev->devnum-1)));// ...err = device_add(&udev->dev);// ...if (udev->parent)usb_autoresume_device(udev->parent);// ...			
}

   
 

相关文章:

USB Hub 检测设备

系列文章目录 xHCI 简单分析 USB Root Hub 分析 USB Hub 检测设备 文章目录 系列文章目录一、引言二、hub_eventshub_port_connect_changeusb_alloc_devusb_set_device_statehub_port_initusb_new_device 一、引言 USB Hub 检测设备 一文中讲到&#xff0c;当有 USB 插入时&…...

Python 正则表达式

正则在线实用工具&#xff1a;regex101 正则表达式&#xff08;regular expression&#xff09;是一种用于匹配字符串中字符组合模式的工具。它可以用来检查一个字符串是否匹配某个模式、提取字符串中的信息、替换字符串中的某些部分等。 Python 的 re 模块提供了对正则表达式…...

【Mac】终端改色-让用户名和主机名有颜色

效果图 配置zsh 1.打开终端&#xff0c;进入.zshrc配置 cd ~ vim .zshrc2.添加如下配置并保存 # 启用命令行颜色显示 export CLICOLOR1 ## 加载颜色支持 autoload -U colors && colors # 配置 zsh 提示符 PROMPT"%{$fg_bold[red]%}%n%{$reset_color%}%{$fg_bol…...

React 前端框架入门

这里写目录标题 React 前端框架入门什么是 React&#xff1f;核心特性基本概念1. JSX2. 组件3. State 和 Props4. 生命周期5. React Hooks React 应用示例项目结构如何启动 React 项目参考资料 React 前端框架入门 什么是 React&#xff1f; React 是由 Facebook 开发并开源的…...

复习打卡大数据篇——Hadoop YARN

目录 &#xff11;.什么是yarn &#xff12;.yarn的三大角色 &#xff13;.任务&#xff08;MR&#xff09;提交到YARN运行流程 4. 调度器Scheduler 5.YARN HA 高可用 &#xff11;.什么是yarn YARN&#xff08;Yet Another Resource Negotiator&#xff09;是一个资源管…...

03.HTTPS的实现原理-HTTPS的工作流程

03.HTTPS的实现原理-HTTPS的工作流程 简介1. HTTPS的工作流程1.1. TCP的工作流程1.1.1. 三次握手的详细步骤1.1.2. 三次握手的作用 1.2. HTTPS的工作流程1.2.1. HTTPS与TCP的关系1.2.2. HTTPS的工作流程 2. 公钥和私钥的作用3. 对称密钥的生成和交换4. 对称加密和非对称加密的区…...

idea部署maven项目步骤(图+文)

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…...

Eclipse 添加书签

Eclipse 添加书签 Eclipse 是一款非常受欢迎的集成开发环境&#xff08;IDE&#xff09;&#xff0c;广泛用于 Java、C、Python 等语言的开发。在处理大型项目时&#xff0c;开发者通常需要在不同文件和代码行之间频繁切换。为了提高工作效率&#xff0c;Eclipse 提供了书签功…...

ROSboard:为您的机器人提供强大的Web可视化工具

ROSboard&#xff1a;为您的机器人提供强大的Web可视化工具 rosboard ROS node that turns your robot into a web server to visualize ROS topics [这里是图片001] 项目地址: https://gitcode.com/gh_mirrors/ro/rosboard 项目介绍 ROSboard 是一个专为机器人设计的 Web 服…...

InnoDB引擎的内存结构

InnoDB擅长处理事务&#xff0c;具有自动崩溃恢复的特性 架构图&#xff1a; 由4部分组成&#xff1a; 1.Buffer Pool&#xff1a;缓冲池&#xff0c;缓存表数据和索引数据&#xff0c;减少磁盘I/O操作&#xff0c;提升效率 2.change Buffer&#xff1a;写缓冲区&#xff0c…...

使用RTP 协议 对 H264 封包和解包,h264的avpacket和NAL的关系

学习内容&#xff1a; 本章探讨如何将h264的 avpacket的视频 数据&#xff0c;通过RTP协议发送到 流媒体 服务器 或者 对端接受者。 前提 我们在将 YUV数据变成avframe后&#xff0c;通过h264 编码变成AVPacket&#xff0c;例如&#xff0c;在安防项目中&#xff0c;或者直播…...

面试经典问题 —— 最大/小前K个数问题(top - K)问题

目录 常见思路更优的解法&#xff08;面试官喜欢的&#xff09; 常见思路 要选出最小的前K个数首先我们会想到排排升序建大堆&#xff0c;排降序建小堆 一个直观的想法是使用&#xff08;小根堆&#xff09;&#xff0c;起始将所有元素放入堆中&#xff0c;然后再从堆中取出k 个…...

HNUST-数据分析技术课堂实验

1.要求 1&#xff0c;从下列第一、二、三组实验中各至少选取一个算法进行实验&#xff0c;选修组实验不作强制要求&#xff1b;2&#xff0c;实验过程不限&#xff0c;目标在于锻炼算法实现过程&#xff0c;即可采用C、C、Java、Python&#xff08;建议&#xff09;等任意语言编…...

HEIC 是什么图片格式?如何把 iPhone 中的 HEIC 转为 JPG?

在 iPhone 拍摄照片时&#xff0c;默认的图片格式为 HEIC。虽然 HEIC 格式具有高压缩比、高画质等优点&#xff0c;但在某些设备或软件上可能存在兼容性问题。因此&#xff0c;将 HEIC 格式转换为更为通用的 JPG 格式就显得很有必要。本教程将介绍如何使用简鹿格式工厂&#xf…...

Next.js 14 性能优化:从首屏加载到运行时优化的最佳实践

在现代 Web 应用中&#xff0c;性能优化直接影响用户体验和业务转化。Next.js 14 提供了多种内置的性能优化特性&#xff0c;今天我们就来深入探讨如何充分利用这些特性&#xff0c;以及一些实用的优化技巧。 图片和字体优化 1. 图片优化 Next.js 的 Image 组件供了强大的图…...

T-SQL语言的软件开发工具

T-SQL&#xff1a;微软SQL Server的强大工具 引言 在现代软件开发中&#xff0c;数据的管理与操作是不可或缺的一部分&#xff0c;而T-SQL&#xff08;Transact-SQL&#xff09;作为微软SQL Server的重要组成部分&#xff0c;承担着数据查询、数据操作、数据插入和数据删除等…...

Ubuntu环境 nginx.conf详解(二)

1、nginx.conf 结构详解&#xff1a; http 块&#xff1a;用于配置 HTTP 服务器的相关设置&#xff0c;包括处理 HTTP 和 HTTPS。 stream 块&#xff1a;用于配置 TCP/UDP 代理服务器&#xff0c;适用于需要进行四层负载均衡的情况。 ... # 全局块 events {...} …...

【Linux】centos7安装php7.4

环境说明 本文档在服务器不能连接互联网的情况下&#xff0c;进行安装php7.4及其扩展。 操作系统&#xff1a;centos7.6 架构&#xff1a;X86_64 一、安装依赖&#xff08;可选&#xff09; 说明&#xff1a;服务器能联网就可以通过 yum install 命令下载对应php需要的依赖。…...

OpenHarmony-6.IPC/RPC组件

IPC/RPC组件机制 1.基本概念 IPC&#xff1a;设备内的进程间通信&#xff08;Inter-Process Communication&#xff09;。 RPC&#xff1a;设备间的进程间通信&#xff08;Remote Procedure Call&#xff09;。 IPC/RPC用于实现跨进程通信&#xff0c;不同的是前者使用Binder驱…...

自然语言处理与知识图谱的融合与应用

目录 前言1. 知识图谱与自然语言处理的关系1.1 知识图谱的定义与特点1.2 自然语言处理的核心任务1.3 二者的互补性 2. NLP在知识图谱构建中的应用2.1 信息抽取2.1.1 实体识别2.1.2 关系抽取2.1.3 属性抽取 2.2 知识融合2.3 知识推理 3. NLP与知识图谱融合的实际应用3.1 智能问答…...

Pytorch | 利用VA-I-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用VA-I-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集VA-I-FGSM介绍相关定义算法流程 VAI-FGSM代码实现VAI-FGSM算法实现攻击效果 代码汇总vaifgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器&#xff1a; Pytorch | 从零构建AlexNet对…...

【Java基础面试题028】Java中的hashCode和equals方法,与==操作符有什么区别?

回答重点 hashcode、equals 和 都是Java中用于比较对象的三种方式&#xff0c;但是它们的用途和实现还是有挺大区别的。 hashcode用于散列存储结构中确定对象的存储位置。可用于快速比较两个对象是否不同&#xff0c;因为如果它们的哈希码不同&#xff0c;那么它们肯定不相等…...

[ThinkPHP]5.0.23-Rce 1

[ThinkPHP]5.0.23-Rce 1 根据题目知道这是一个5.0.23的PHP RCE&#xff0c;话不多说直接上扫描器 检测出Payload url地址&#xff1a; ?scaptcha&test-1 Post表单参数: _method__construct&filter[]phpinfo&methodget&server[REQUEST_METHOD]1HackBar构造p…...

ByConity BSP 解锁数据仓库新未来

文章目录 前言BSP 模式简介基于 TPC-DS 的 ELT 活动测试环境登录 ECS数据查询配置 执行 02.sqlsql解释&#xff1a;1. 第一步&#xff1a;创建 wscs 临时表2. 第二步&#xff1a;创建 wswscs 临时表3. 第三步&#xff1a;对比 2001 年和 2002 年的数据子查询 1&#xff1a;提取…...

应对 Google Play 政策违规:开发者账号被终止解除指南

目录 解封指南 申诉文案 谷歌问题 授权书 1、授权书标题及双方信息 2、游戏信息 3、授权内容 4、双方义务与责任 5、费用与支付 5、保密条款 6、争议解决 8、其他条款 9、签字盖章 10、日期 相关推荐 解封指南 由于开发人员的疏忽,移除了读写权限的动态申请,使…...

【ES6复习笔记】Map(14)

概念 Map 是 JavaScript 中的一种数据结构&#xff0c;它允许你存储键值对&#xff0c;并且可以通过键来访问对应的值。在本教程中&#xff0c;我们将学习如何声明、添加、删除、获取和遍历 Map 集合。 ES6 提供了 Map 数据结构。它类似于对象&#xff0c;也是键值对的集合。…...

重温设计模式--8、命令模式

文章目录 命令模式的详细介绍C 代码示例C代码示例2 命令模式的详细介绍 定义与概念 命令模式属于行为型设计模式&#xff0c;它旨在将一个请求封装成一个对象&#xff0c;从而让你可以用不同的请求对客户端进行参数化&#xff0c;将请求的发送者和接收者解耦&#xff0c;并且能…...

人工智能ACA(七)——计算机视觉基础

一、自然语言处理基本介绍 1. 自然语言处理的定义 1-1 自然语言 人类使用的在社会生活中自然形成的语言 1-2 自然语言处理 目标是让计算机能够理解、解析、生成和处理人类的自然语言 包含自然语言理解和自然语言生成两部分组成 2. 自然语言处理的发展趋势 3.自然语言处理…...

RCE常见姿势

文章目录 常见漏洞执行函数&#xff1a;1.系统命令执行函数2.代码执行函数 命令拼接符读取文件命令绕过&#xff1a;空格过滤绕过关键字绕过长度过滤绕过无参数命令执行绕过无字母数字绕过利用%0A截断利用回溯绕过利用create_function()代码注入无回显RCE1.反弹shell2.dnslog外…...

CSS系列(36)-- Containment详解

前端技术探索系列&#xff1a;CSS Containment详解 ⚡ 致读者&#xff1a;探索性能优化的艺术 &#x1f44b; 前端开发者们&#xff0c; 今天我们将深入探讨 CSS Containment&#xff0c;这个强大的性能优化特性。 基础概念 &#x1f680; 包含类型 /* 布局包含 */ .layo…...

golang,多个proxy拉包的处理逻辑

在Go语言中&#xff0c;当你设置了多个代理&#xff08;GOPROXY&#xff09;时&#xff0c;Go工具链会按照你设置的顺序尝试每个代理。如果第一个代理失败&#xff0c;它会尝试下一个代理&#xff0c;直到成功获取到模块或者所有代理都尝试失败。最后&#xff0c;如果所有代理都…...

Vue使用Tinymce 编辑器

目录 一、下载并重新组织tinymce结构二、使用三、遇到的坑 一、下载并重新组织tinymce结构 下载 npm install tinymce^7 or yarn add tinymce^7重构目录 在node_moudles里找到tinymce文件夹&#xff0c;把里面文件拷贝一份放到public下&#xff0c;如下&#xff1a; -- pub…...

神经网络-AlexNet

AlexNet是在2012年的ImageNet竞赛后&#xff0c;整理发表的文章&#xff0c;也是对CNN网络的衍生。 网络结构 AlexNet网络结构如下图所示&#xff0c;网络分为了上下两部分&#xff0c;对应两个不同的GPU训练&#xff0c;可以更好的利用GPU算力。只有在特殊的网络层后&#x…...

《人工智能:洞察材料微观与宏观性能关系的神奇之眼》

在材料科学的广袤天地里&#xff0c;一个前沿且充满魅力的课题正吸引着全球科研人员的目光——如何借助人工智能的强大力量&#xff0c;精准模拟材料微观结构与宏观性能之间那错综复杂的关系。这不仅是解开材料性能之谜的关键钥匙&#xff0c;更是推动从航空航天到电子芯片等众…...

count(1)、count(_)与count(列名)的区别?

大家好&#xff0c;我是锋哥。今天分享关于【count(1)、count(_)与count(列名)的区别&#xff1f;】面试题。希望对大家有帮助&#xff1b; count(1)、count(_)与count(列名)的区别&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 SQL 中&#xff0c…...

Docker 镜像加速访问方案

在数字化时代&#xff0c;Docker以其轻量级和便捷性成为开发者和运维人员的首选容器技术。然而自2023年5月中旬起&#xff0c;Docker Hub 的访问速度较慢或不稳定&#xff0c;这对依赖Docker Hub拉取镜像的用户来说无疑是一个挑战。本文将提供 Docker Hub 访问的一系列替代方案…...

菜鸟带新鸟——基于EPlan2022的部件库制作(3D)

设备逻辑的概念&#xff1a; 可在布局空间 中和其它对象上放置对象。可将其它对象放置在 3D 对象上。已放置的对象分到组件的逻辑结构中。 将此属性的整体标识为设备逻辑。可使用不同的功能创建和编辑设备逻辑。 设备的逻辑定义 定义 / 旋转 / 移动 / 翻转&#xff1a;组…...

笔记工具--MD-Markdown的语法技巧

MD格式&#xff0c;全称为Markdown格式&#xff0c;是一种轻量级标记语言文件&#xff0c;主要用于创建格式化文本。以下是对MD格式的详细解释&#xff1a; 一、定义与特点 定义&#xff1a;MD文件是一种纯文本格式的文件&#xff0c;使用简单的符号或语法来标记标题、列表、…...

【ES6复习笔记】生成器(11)

什么是生成器函数 生成器函数是一种特殊的函数&#xff0c;它可以在执行过程中暂停并保存当前状态&#xff0c;然后在需要时恢复执行。生成器函数通过 yield 关键字来实现暂停和恢复执行的功能。 生成器函数的基本用法 定义生成器函数&#xff1a;使用 function* 关键字来定…...

【解决报错】AttributeError: ‘NoneType‘ object has no attribute ‘group‘

学习爬虫时&#xff0c;遇到如下报错&#xff1a; 报错原因&#xff1a; 正则表达式的 search 或 finditer 方法没有找到任何匹配项&#xff0c;可能是换行符处理不当等。 解决方法如下&#xff1a; 在正则表达式末尾加上re.S即可&#xff0c;re.S是一个编译标志&#xff0c…...

UE5.3 C++ Ceiusm中的POI 制作3DUI 结合坐标转化

一.核心思路WidgetComponent CesiumGloberAnchor 二.先制作POI 创建C Actor来制作&#xff0c;APOI。直接上代码 #pragma once#include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "CesiumGlobeAnchorComponent.h" #includ…...

机器学习系列(一)——K-近邻算法

1. 算法定义 KNN 算法属于基于实例的机器学习方法。在对未知数据进行分类或回归之前&#xff0c;我们不需要对数据进行显式的训练或建立复杂的模型。它的核心思想是&#xff1a;对一个新的样本点&#xff0c;寻找在特征空间上与其最相似的 K 个已知数据点&#xff0c;采取“投…...

Android unitTest 单元测试用例编写(初始)

文章目录 了解测试相关库导入依赖库新建测试文件示例执行查看结果网页结果其他 本片讲解的重点是unitTest&#xff0c;而不是androidTest哦 了解测试相关库 androidx.compose.ui:ui-test-junit4: 用于Compose UI的JUnit 4测试库。 它提供了测试Compose UI组件的工具和API。 and…...

uni-app 跨端开发精美开源UI框架推荐

&#x1f380;&#x1f380;&#x1f380;uni-app 跨端开发系列 &#x1f380;&#x1f380;&#x1f380; 一、uni-app 组成和跨端原理 二、uni-app 各端差异注意事项 三、uni-app 离线本地存储方案 四、uni-app UI库、框架、组件选型指南 五、uni-app 蓝牙开发 六、uni-app …...

【微服务】微服务之Feign 与 Ribbon

文章目录 强烈推荐引言优点Feign示例什么是Ribbon&#xff1f;Ribbon 的优点Netflix Feign 和 Ribbon整合Feign 与 Ribbon 的关系Feign 与 Ribbon 结合使用的示例配置文件&#xff08;application.yml&#xff09;说明&#xff1a; Feign 与 Ribbon 结合使用的应用场景1. 动态服…...

【C语言】成绩等级制

将成绩分为A、B、C、D、E等级。具体的等级划分如下&#xff1a; A&#xff1a;90分及以上B&#xff1a;80分到89分C&#xff1a;70分到79分D&#xff1a;60分到69分E&#xff1a;60分以下 #include <stdio.h> int main() {float score 0;printf("请输入学生成绩&a…...

Flutter 插件开发入门

1、初识 Flutter Plugin Flutter 的插件类似于我们在 Android 中说的第三方库&#xff0c;通过使用插件&#xff0c;可以借助插件中的代码实现一些额外功能。 Flutter 的插件以 package 的形式存在&#xff0c;使用 package 的目的是为了达到模块化&#xff0c;可以让代码被共…...

2024.12.25在腾讯云服务器上使用docker部署flask

2024.12.25在腾讯云服务器上使用docker部署flask 操作系统&#xff1a;Ubuntu 根据腾讯云的说明文档安装 Docker 并配置镜像加速源&#xff0c;注意需要安装腾讯云的加速源&#xff0c;使用官网的加速源连接极其不稳定&#xff0c;容易导致运行失败。使用哪个公司的云服务器就…...

2024 年12月英语六级CET6听力原文(Lecture部分)

2024 年12月英语六级CET6听力原文(Long Conersation和Passage) 1 牛津大学关于普遍道德准则的研究及相关观点与建议 译文 2 食物颜色对味觉体验及大脑预期的影响 译文 3 财务资源对意义与幸福之间关系的影响研究 译文...

centos 释放系统预留内存并关闭Kdump服务

背景&#xff1a;Kdump是Linux系统的一种内核崩溃转储机制&#xff0c;它允许在系统发生内核崩溃&#xff08;例如内核panic&#xff09;时&#xff0c;捕获内存的转储信息&#xff0c;从而帮助事后分析故障原因。该过程需要一块预留内存&#xff08;称为crashkernel内存&#…...