今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录
- 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器
- 并发修改异常
- 并发修改异常简介
- 实现机制
- 设计原因及意义
- 使用线程池造成的链路丢失问题
- 线程池导致的链路丢失问题
- 发生原因
- 常见解决方法
- 更好的解决方法
- 设计精妙之处
- 登录续期
- 登录续期常见实现方式
- 特殊应用场景
- 可能造成生产问题的编码细节
- VIP过期策略
- 实现步骤
- 注意事项
- 扩展功能
- 数值类缓存
- ✅ Java 中常见的具有 **值缓存机制的包装类**:
- 🔍 各类型缓存详情
- 1. `Integer`
- 2. `Short`
- 3. `Byte`
- 4. `Long`
- 5. `Character`
- 6. `Boolean`
- 🧠 小结:哪些值会被缓存?
- 💡 实际开发建议
- ✅ 简要回答
- 🧠 详细解释
- 🔍 超出缓存范围的例子
- ✅ 总结
- 💡 最佳实践
优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器
参考文档
并发修改异常
并发修改异常简介
并发修改异常(ConcurrentModificationException)是在 Java 中当一个对象被检测到在迭代过程中被另一个线程不恰当地修改时抛出的运行时异常。这种情况通常发生在使用集合框架(如 ArrayList、HashMap 等)时,如果在一个线程正在遍历集合的同时,另一个线程尝试修改该集合(例如添加、删除元素),就会抛出这个异常。
实现机制
Java 中的许多集合类通过**快速失败(fail-fast)**机制来实现对并发修改的检测。这意味着一旦检测到结构上的修改(即不是由迭代器自身的方法引起的修改),就会立即抛出 ConcurrentModificationException
异常,而不是试图继续执行或给出不确定的行为。
- modCount 变量:大多数集合类内部维护了一个名为
modCount
的变量,用于记录集合被修改的次数。每当集合中的元素发生改变(如添加、删除操作),modCount
都会增加。 - 迭代器检查:迭代器在创建时会记录当前的
modCount
值。每次调用next()
或其他类似方法时,都会检查当前的modCount
是否与记录的值相同。如果不一致,则说明集合已被修改,此时迭代器将抛出ConcurrentModificationException
。
设计原因及意义
-
保证数据一致性:快速失败机制的主要目的是尽早发现问题,避免潜在的数据不一致或错误状态。通过立即抛出异常,可以防止程序在不知情的情况下基于不准确的数据做出决策。
-
简化调试过程:这种机制有助于开发者迅速定位问题所在,因为它明确指出在迭代过程中发生了不安全的操作,使得调试和修复更加直接。
-
安全性考虑:虽然
ConcurrentModificationException
提供了一种简单的检测并发修改的方式,但它并不是一种处理并发访问的有效手段。对于需要多线程环境下的集合操作,应该使用专门设计的支持并发访问的集合类(如CopyOnWriteArrayList
、ConcurrentHashMap
等)。
总之,ConcurrentModificationException
是 Java 为了保障集合操作的安全性和可靠性而设计的一种保护措施,它强调了正确同步的重要性,并鼓励开发人员采用适当的设计模式来管理并发访问。然而,在实际应用中,理解何时以及如何避免触发此异常同样重要,特别是在编写多线程应用程序时。
使用线程池造成的链路丢失问题
线程池导致的链路丢失问题
在使用线程池时,特别是当我们通过异步方式提交任务到线程池执行时,可能会遇到所谓的“链路丢失”问题。这里的“链路”通常指的是分布式系统中用于追踪请求来源、处理流程以及日志信息的上下文(context),例如 MDC(Mapped Diagnostic Context)或跟踪ID(trace ID)。当任务被提交给线程池后,新的线程可能无法继承原线程中的这些上下文信息,导致日志记录、监控或者调试变得困难,因为失去了对原始请求的跟踪。
发生原因
- 上下文未传递:默认情况下,新启动的线程不会自动继承创建它的父线程的上下文环境。
- 异步编程模型:在异步编程中,任务往往会被分配给线程池中的某个工作线程执行,而这些工作线程并不知道初始请求的所有上下文信息。
- 跨线程边界的数据共享问题:某些数据需要在线程之间正确地传递,如安全上下文、事务信息等。
常见解决方法
-
手动传递上下文:可以在提交任务时,显式地将必要的上下文信息作为参数传递给任务,并在任务内部恢复这些上下文。
ExecutorService executor = Executors.newFixedThreadPool(10); final Map<String, String> contextMap = MDC.getCopyOfContextMap(); executor.submit(() -> {try {MDC.setContextMap(contextMap);// 执行任务逻辑} finally {MDC.clear(); // 清理上下文} });
-
使用装饰器模式包装Runnable/Callable:可以编写一个通用的装饰器,在执行任务前后自动设置和清除上下文信息。
public class MDCTaskDecorator implements Runnable {private final Runnable task;private final Map<String, String> contextMap;public MDCTaskDecorator(Runnable task) {this.task = task;this.contextMap = MDC.getCopyOfContextMap();}@Overridepublic void run() {try {MDC.setContextMap(contextMap);task.run();} finally {MDC.clear();}} }
-
利用框架支持:一些现代框架如 Spring 提供了对异步方法调用的支持,可以自动处理上下文传播,减少了手动操作的需求。
更好的解决方法
-
使用Continuation Passing Style (CPS) 或者更高级别的抽象来管理异步流控制,比如 CompletableFuture 的 thenApplyAsync 方法允许指定自定义的Executor,这样你可以确保所有的后续操作都在同一个上下文中运行。
-
采用专门的日志库或分布式追踪系统,例如 SLF4J + Logback 结合 Spring Cloud Sleuth,它们能够自动为每个请求生成唯一的 trace ID 并在整个分布式系统中传播这个 ID,简化了跨服务边界的追踪和日志关联。
设计精妙之处
这种设计的核心在于它强调了分离关注点的原则:
- 职责分离:通过让开发者明确区分业务逻辑与基础设施逻辑(如上下文管理),使得代码更加清晰易懂。
- 灵活性增强:允许开发者根据具体需求选择最合适的方式来处理上下文传播,无论是手动还是借助框架自动化。
- 提高可维护性:良好的上下文管理和错误处理机制有助于提升系统的健壮性和可维护性,特别是在大规模分布式系统中尤为重要。
综上所述,虽然线程池可能导致链路丢失的问题,但通过合理的设计和技术手段完全可以克服这一挑战,并且这样的设计促进了更好的架构实践。
登录续期
登录续期常见实现方式
登录续期通常是指在用户会话过期前,自动延长用户的登录状态或刷新其认证令牌的有效期。以下是几种常见的实现方式:
-
基于JWT的续期:
- 在初次登录时生成一个JWT(JSON Web Token),并在其中嵌入过期时间(exp)。
- 当接近过期时,可以通过刷新令牌(refresh token)来获取新的访问令牌(access token)。这要求客户端保存刷新令牌,并在需要时使用它请求新的访问令牌。
-
Session机制下的续期:
- 对于传统的Session机制,服务器端维护用户的会话信息。可以通过设置较长的Session超时时间和活动检测机制,在用户有交互行为时重置Session的过期时间。
- 或者定期发送心跳包保持Session活跃状态。
-
滑动窗口机制:
- 每次用户进行操作时都更新Token的有效期,使得只要用户持续活动,Token就不会过期。这种方式适合Web应用中频繁交互的场景。
特殊应用场景
- 移动端应用:考虑到用户体验和网络环境的不确定性,移动端往往采用较宽松的续期策略,比如后台静默刷新Token,避免用户频繁重新登录。
- 微服务架构下的SSO(单点登录):多个微服务共享同一套认证中心,当某个服务需要验证用户身份时,可以利用OAuth 2.0协议中的授权码模式或隐式授权模式结合刷新令牌机制完成无缝续期。
- 物联网设备管理平台:对于长期运行但不常交互的设备,可能需要特殊的续期逻辑,如基于设备心跳信号自动延长认证有效期。
可能造成生产问题的编码细节
-
未妥善处理并发请求:如果在短时间内收到多个续期请求,可能会导致不必要的多次Token刷新,增加系统负载。应确保续期逻辑能够正确处理并发情况。
-
忽略Token过期后的安全措施:即使实现了续期功能,也应当设定合理的最大续期次数或总有效期限制,防止因Token泄露而导致的安全风险。
-
缺乏有效的错误处理:例如,在尝试使用无效的刷新令牌请求新Token时,如果没有适当的错误反馈机制,可能导致前端显示混乱或者后端陷入无限重试循环。
-
存储不当:无论是存储Session还是Token,都需要考虑安全性。比如,避免将敏感信息直接存放在客户端本地存储中,而应选择HttpOnly Cookies等更安全的方式。
-
忘记清理过期数据:长时间运行的服务如果不及时清理过期的Tokens或Sessions,会导致数据库膨胀,影响性能。
总之,设计登录续期机制时不仅要考虑用户体验,还要兼顾安全性与系统稳定性,同时注意上述提到的一些潜在问题以减少生产环境中可能出现的故障。
VIP过期策略
实现判断用户VIP是否过期的功能,主要依赖于存储和检查用户的VIP状态及有效期。以下是实现这一功能的基本步骤和一些最佳实践建议:
实现步骤
-
存储VIP信息:
- 在数据库中为每个用户增加一个或多个字段来记录VIP相关信息,如:
vip_status
:表示用户当前的VIP状态(例如:普通用户、银卡会员、金卡会员等)。vip_start_date
:VIP开始日期。vip_end_date
:VIP结束日期。
- 在数据库中为每个用户增加一个或多个字段来记录VIP相关信息,如:
-
编写业务逻辑:
- 当需要判断用户VIP是否过期时,可以通过比较当前时间与
vip_end_date
来进行判断。
示例代码(Java):
public boolean isVipExpired(User user) {// 获取当前时间LocalDateTime now = LocalDateTime.now();// 比较当前时间和VIP到期时间return user.getVipEndDate().isBefore(now); }
- 当需要判断用户VIP是否过期时,可以通过比较当前时间与
-
在适当的地方调用此逻辑:
- 可以在用户登录时检查VIP状态,并在前端显示相应的VIP标识。
- 或者,在执行某些仅限VIP的操作前进行验证,确保只有未过期的VIP用户才能访问这些资源。
注意事项
- 时区处理:确保所有的时间戳都使用相同的时区,最好统一使用UTC,避免由于不同时区导致的问题。
- 缓存机制:如果频繁查询VIP状态,可以考虑引入缓存机制减少对数据库的压力。
- 异步更新:对于大量用户的系统,可以考虑定期批量检查并更新VIP状态,而不是每次请求时都实时计算。
- 用户体验优化:临近到期时提醒用户续费,提供便捷的续费途径,改善用户体验。
扩展功能
- 自动续费功能:如果支持自动续费,可以在接近到期日时尝试自动扣款并延长VIP期限。
- 分级管理:根据不同级别的VIP提供差异化的服务,比如不同的折扣率、专属客服等。
- 历史记录追踪:记录VIP状态变更的历史,便于后续分析和审计。
通过上述方法,你可以有效地管理和判断用户的VIP状态,确保系统能够准确地识别VIP用户以及他们的权限范围。这不仅提升了用户体验,也为精细化运营提供了数据支持。
数值类缓存
在 Java 中,除了 Integer
类型之外,还有一些其他的包装类(Wrapper Classes)也实现了值缓存机制,用于优化性能并减少内存开销。这些缓存通常只针对常用的小范围值。
✅ Java 中常见的具有 值缓存机制的包装类:
类型 | 缓存范围/机制说明 |
---|---|
Integer | 缓存 -128 ~ 127 ,可通过 JVM 参数扩展上限 |
Short | 缓存 -128 ~ 127 |
Byte | 缓存 -128 ~ 127 (固定) |
Long | 缓存 -128 ~ 127 (固定) |
Character | 缓存 0 ~ 127 (ASCII 字符) |
Boolean | 只有两个值:true 和 false ,直接缓存这两个实例 |
💡 所有这些类都使用了类似的设计模式:享元模式(Flyweight Pattern),通过缓存常用对象来避免重复创建。
🔍 各类型缓存详情
1. Integer
- 默认缓存范围:
-128 ~ 127
- 可配置:可以通过 JVM 参数调整最大值:
-Djava.lang.Integer.IntegerCache.high=255
- 使用方式:
Integer a = 100; // 使用缓存 Integer b = 100; System.out.println(a == b); // true
2. Short
- 缓存范围:
-128 ~ 127
- 源码实现:内部也有一个静态缓存数组。
- 示例:
Short s1 = -100; Short s2 = -100; System.out.println(s1 == s2); // true
3. Byte
- 缓存范围:
-128 ~ 127
(固定) - 因为 byte 的取值范围本身就是
-128 ~ 127
,所以整个有效值域都被缓存。 - 示例:
Byte b1 = 10; Byte b2 = 10; System.out.println(b1 == b2); // true
4. Long
- 缓存范围:
-128 ~ 127
(固定) - 超出此范围则每次都会创建新对象。
- 示例:
Long l1 = 100L; Long l2 = 100L; System.out.println(l1 == l2); // trueLong l3 = 1000L; Long l4 = 1000L; System.out.println(l3 == l4); // false
5. Character
- 缓存范围:
0 ~ 127
(即 ASCII 字符) - 对应的是常用的英文字符集。
- 示例:
Character c1 = 'A'; Character c2 = 'A'; System.out.println(c1 == c2); // trueCharacter c3 = '你'; Character c4 = '你'; System.out.println(c3 == c4); // false(超出缓存范围)
6. Boolean
- 只有两个值:
true
和false
- 内部缓存了这两个常量对象:
Boolean b1 = true; Boolean b2 = true; System.out.println(b1 == b2); // true
🧠 小结:哪些值会被缓存?
类型 | 是否缓存 | 缓存范围 |
---|---|---|
Integer | ✅ | 默认 -128 ~ 127 ,可扩展 |
Short | ✅ | -128 ~ 127 |
Byte | ✅ | 全部值(-128 ~ 127 ) |
Long | ✅ | -128 ~ 127 |
Character | ✅ | 0 ~ 127 (ASCII 字符) |
Boolean | ✅ | true , false |
💡 实际开发建议
- 如果你需要进行对象引用比较(如
==
),请确保理解缓存机制; - 如果你想比较值,请使用
.equals()
或者拆箱成基本类型(如intValue()
、longValue()
等); - 避免对超出缓存范围的包装类使用
==
来判断值是否相等。
✅ 简要回答
是的!当你使用
Integer a == 1
这样的比较时,Java 会自动将Integer
拆箱为int
,此时不会受到 Integer 缓存机制的影响。
也就是说,在这种情况下,比较的是值本身,而不是对象引用。
🧠 详细解释
示例代码:
Integer a = 100;
Integer b = 100;System.out.println(a == b); // true(因为 100 在缓存范围内)
上面这个例子中,我们比较的是两个 Integer
对象的引用,而由于它们在缓存范围内(-128 ~ 127),所以指向同一个对象,结果是 true
。
下面这种情况就不同了:
Integer a = 100;
System.out.println(a == 100); // true
这是因为在 a == 100
中:
a
是一个Integer
类型;100
是一个int
字面量;- Java 会自动对
a
进行 拆箱操作,将其转换为int
; - 实际上执行的是:
100 == 100
,也就是两个基本类型int
的比较; - 所以无论数值是否在缓存范围内,只要值相等,结果就是
true
。
🔍 超出缓存范围的例子
Integer x = 200;
Integer y = 200;System.out.println(x == y); // false(不在缓存范围内)
System.out.println(x == 200); // true(自动拆箱后比较值)
x == y
:比较的是引用,不在缓存范围内,返回false
;x == 200
:自动拆箱成int
,比较的是值,返回true
。
✅ 总结
表达式 | 是否自动拆箱 | 比较类型 | 是否受缓存影响 |
---|---|---|---|
Integer == int | ✅ 是 | int == int | ❌ 否 |
Integer == Integer (同值) | ❌ 否 | 引用比较 | ✅ 是(依赖缓存) |
💡 最佳实践
-
如果你想比较 值,推荐使用
.equals()
或者intValue()
显式比较:if (a != null && a.equals(100)) { ... } if (a != null && a.intValue() == 100) { ... }
-
避免直接使用
==
来比较Integer
对象的值,除非你明确知道其缓存行为。
相关文章:
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...