1. 资源SchedulerFactory

1.1 介绍

        Quartz以模块方式架构,因此,要使它运行,几个组件必须很好的咬合在一起,幸运的是,已经有了一些现存的助手可以完成这些工作,所有的Scheduler实例由SchedulerFactory创建。

        Quartz的三个核心概念:调度器、任务、触发器,三者之间的关系

SchedulerFactory ——> Scheduler ——> Trigger/job

        SchedulerFactory 接口,有两个子类,一个是StdSchedulerFactory,另一个是DirectSchedulerFactory,我们之前用的都是StdSchedulerFactory。

        一个作业,比较重要的三要素是Scheduler、JobDetail、Trigger,而Trigger对于Job而言就好比一个驱动器,没有触发器来定时驱动作业,作业就无法运行,对于Job而言,一个Job可以对应多个Trigger,单对于Trigger而言,一个Trigger只能对应一个Job,所以一个Trigger只能被指派给一个job,所以如果我们需要一个复杂的触发计划,可以创建多个Trigger并指派他们给同一个job。

1.2 Scheduler的创建方式

1.2.1 StdSchedulerFactory

        Quartz默认的SchedulerFactory。

1. 使用一组参数(java.util.Properties)来创建和初始化Quartz调度器。

2. 配置参数一般存储在quartz.properties文件中。

3. 调用getScheduler方法就能创建和初始化调度器对象。例如:

// Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
SchedulerFactory s = new StdSchedulerFactory();
Scheduler scheduler = s.getScheduler();

注意:看源码知道,StdSchedulerFactory.getDefaultScheduler();内部实现就是用的该方式。

1.2.2 Scheduler的API

1. 获取调度器开始时间

Date startDate = scheduler.scheduleJob(jobDetail, trigger);

2. 启动任务调度

scheduler.start();

3. 任务调度挂起、暂停

scheduler.standby();

4. 关闭任务调度

scheduler.shutdown();

scheduler.shutdown(true):表示等待所有正在执行的job执行完毕之后,再关闭Scheduler

scheduler.shutdown(false):表示直接关闭Scheduler

1.3 DirectSchedulerFactory

        DirectSchedulerFactory是对SchedulerFactory的直接实现,通过它可以直接构建Scheduler、Threadpool等。

DirectSchedulerFactory instance = DirectSchedulerFactory.getInstance();
Scheduler scheduler1 = instance.getScheduler();

2. Quartz.properties配置文件

默认路径:quartz-2.3.0中的org.quartz.properties

 注意:如果不想用默认的配置文件,我们也可以在资源目录下新建quartz.properties配置文件,在该文件下写自己的配置信息

2.1 配置文件详解

# Default Properties file for use by StdSchedulerFactory
# to create a Quartz Scheduler Instance, if a different
# properties file is not explicitly specified.
#org.quartz.scheduler.instanceName: DefaultQuartzScheduler
org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: falseorg.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 10
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: trueorg.quartz.jobStore.misfireThreshold: 60000org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore

2.1.1 调度器属性

1. org.quartz.scheduler.instanceName:用来区分特定的调度器实例,可以按照功能用途给调度器起名字。

2. org.quartz.scheduler.instanceId:也是用来区分调度器实例的,允许是任何的字符串,但是这个值必须在所有的调度器实例中是唯一的,尤其在一个集群环境中,作为集群的唯一key。

注意:如果想Quartz自动生成该值,可以将其设置成AUTO。

例如: org.quartz.scheduler.instanceId:AUTO

2.1.2 线程池属性

1. threadCount:处理job的线程个数,至少为1,但是最多的话最好不要超过100个,在多数机器上超过100个就显得相当不实用,特别是在job执行时间较长的情况下。

2. threadPriority:线程的优先级, 优先级高的线程比优先级的线程先得到执行。最小为1,最大为10,默认为5

3. threadPool.class:一个实现了org.quartz.ThreadPool接口的类,Quartz自带的线程池实现类是org.quartz.smpl.SimpleThreadPool

2.1.3 作业存储设置

描述了在调度器实例的生命周期中,Job和Trigger信息是如何被存储的

org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore

2.1.4 插件配置

满足特定需求用到的Quartz插件的配置

2. 监听器

        Quartz的监听器用于当任务调度中,你所关注事件发生时,能够及时获取这一事件通知。类似于任务执行过程中的邮件、短信提醒。

        Quartz监听器主要有JobListener、TriggerListener、SchedulerListener三种,分别表示任务、触发器、调度器对应的监听器三者使用方式类似。

2.1 全局监听器

全局监听器能接收到所有的Job/Trigger 的事件通知

// 创建一个全局的监听器
scheduler.getListenerManager().addJobListener(new MyJobListener(),EverythingMatcher.allJobs());

2.2 局部监听器

非全局的监听器只能接收到在其上注册的job或trigger的事件,不在其注册的job或trigger则 不会进行监听。

// 创建一个局部监听器
scheduler.getListenerManager().addJobListener(new MyJobListener(),KeyMatcher.keyEquals(JobKey.jobKey("job1", "group1")));

2.3 JobListener

        任务调度过程中,与任务Job相关的事件包括:job开始要执行的提示,job执行完成的提示灯

2.3.1 JobListener接口中的方法与作用

1. getName():用于获取JobListener的名称

2. jobToBeExecuted(JobExecutionContext context):Scheduler在jobDetail将要被执行时调用这个方法

3. jobExecutionVetoed(JobExecutionContext context):Scheduler在jobDetail即将被执行,但又被TriggerListener否决时会调用该方法。

4. jobWasExecuted():Scheduler在JobDetail被执行之后调用该方法。

2.3.2 自定义一个Job监听器

1. 创建监听器类

package cn.bjc.quartz.listener;import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobListener;public class MyJobListener implements JobListener{@Overridepublic String getName() {String name = this.getClass().getSimpleName();System.out.println("name = " + name);return name;}@Overridepublic void jobToBeExecuted(JobExecutionContext context) {String name = context.getJobDetail().getKey().getName();System.out.println("Job的名称是:" + name + "   Scheduler在jobDetail将要被执行时调用的方法。");}@Overridepublic void jobExecutionVetoed(JobExecutionContext context) {System.out.println("xxx");}@Overridepublic void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) {System.out.println("yyy");}}

2. 添加监听器

2.1 添加一个全局的监听器

在scheduler.start();之前加上如下代码,EverythingMatcher.allJobs()表示所有的job

scheduler.getListenerManager().addJobListener(new MyJobListener(),EverythingMatcher.allJobs());

2.2 添加一个局部监听器,监听指定的job

scheduler.getListenerManager().addJobListener(new MyJobListener(),KeyMatcher.keyEquals(JobKey.jobKey("job1", "group1")));

完整的调用代码:

package cn.bjc.quartz.main;import java.util.Date;import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.matchers.EverythingMatcher;
import org.quartz.impl.matchers.KeyMatcher;import cn.bjc.quartz.job.HelloJobListener;
import cn.bjc.quartz.listener.MyJobListener;public class JobListenerDemo {public static void main(String[] args) throws Exception {Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();// 2. 任务实例(JobDetail),通过JobBuilder创建JobDetail jobDetail = JobBuilder.newJob(HelloJobListener.class).withIdentity("job1", "group1").usingJobData("msg", "日志打印").usingJobData("count", 0).build();// 3. 触发器(Trigger)Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startNow().withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?"))	// 日历每秒执行.build();Date startDate = scheduler.scheduleJob(jobDetail, trigger);// 创建一个全局的监听器// scheduler.getListenerManager().addJobListener(new MyJobListener(),EverythingMatcher.allJobs());// 创建一个局部监听器scheduler.getListenerManager().addJobListener(new MyJobListener(),KeyMatcher.keyEquals(JobKey.jobKey("job1", "group1")));// 启动scheduler.start();}}

2.4 TriggerListener

        任务调度过程中,与触发器Trigger相关的事件包括:触发器触发、触发器未正常触发、触发器完成等。

2.4.1 TriggerListener接口定义的方法

1. getName():用于获取触发器名称

2. triggerField(Trigger trigger,JobExecutionContext context):当与监听器相关联的Trigger被触发,Job上的execute方法将被执行时,Scheduler就调用该方法。

3. vetoJobExecution(Trigger trigger,JobExecutionContext context):在Trigger触发后,job将要被执行时由Scheduler调用这个方法,TriggerListener给了一个选择去否决Job的执行。假如这个方法返回true,这个Job将不会为此次Trigger触发而得到执行。

4. triggerMisfired(Trigger trigger):Scheduler调用这个方法是在Trigger错过触发时,你应该关注此方法中持续时间长的逻辑;在出现许多错过触发的Trigger时,长逻辑会导致骨牌效应,所以,你应当尽量的保持这上方法尽量的小。

5. triggerComplete(Trigger trigger):Trigger被触发并且完成了Job的执行时,Scheduler调用这个方法。

2.4.2 自定义一个TriggerListener监听器

1. 创建监听器

MyTriggerListener.java

package cn.bjc.quartz.listener;import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobListener;
import org.quartz.Trigger;
import org.quartz.Trigger.CompletedExecutionInstruction;
import org.quartz.TriggerListener;public class MyTriggerListener implements TriggerListener{@Overridepublic String getName() {String name = this.getClass().getSimpleName();System.out.println("触发器的名称是:" + name);return name;}@Overridepublic void triggerFired(Trigger trigger, JobExecutionContext context) {String name = trigger.getKey().getName();System.out.println(name + "被触发了!");}@Overridepublic boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) {String name = trigger.getKey().getName();System.out.println(name + "没有被触发!");return true;  // true:表示不会执行job的方法。}@Overridepublic void triggerMisfired(Trigger trigger) {String name = trigger.getKey().getName();System.out.println(name + "错过触发!");}@Overridepublic void triggerComplete(Trigger trigger, JobExecutionContext context,CompletedExecutionInstruction triggerInstructionCode) {String name = trigger.getKey().getName();System.out.println(name + "完成之后触发!");}}

2. 添加监听器

2.1 添加一个全局监听器

// 创建并注册一个全局TriggerListener
scheduler.getListenerManager().addTriggerListener(new MyTriggerListener(),EverythingMatcher.allTriggers());

2.2 添加一个局部监听器

// 创建并注册一个局部TriggerListener
scheduler.getListenerManager().addTriggerListener(new MyTriggerListener(), KeyMatcher.keyEquals(TriggerKey.triggerKey("trigger1")));

完整的调用:

package cn.bjc.quartz.main;import java.util.Date;
import java.util.concurrent.ScheduledFuture;import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.matchers.EverythingMatcher;
import org.quartz.impl.matchers.KeyMatcher;import cn.bjc.quartz.job.HelloJobListener;
import cn.bjc.quartz.listener.MyJobListener;
import cn.bjc.quartz.listener.MyTriggerListener;public class TriggerListenerDemo {public static void main(String[] args) throws Exception {Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();// 2. 任务实例(JobDetail),通过JobBuilder创建JobDetail jobDetail = JobBuilder.newJob(HelloJobListener.class).withIdentity("job1", "group1").usingJobData("msg", "日志打印").usingJobData("count", 0).build();// 3. 触发器(Trigger)Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startNow().withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?"))	// 日历每秒执行.build();Date startDate = scheduler.scheduleJob(jobDetail, trigger);// 创建并注册一个全局TriggerListener//scheduler.getListenerManager().addTriggerListener(new MyTriggerListener(),EverythingMatcher.allTriggers());// 创建并注册一个局部TriggerListenerscheduler.getListenerManager().addTriggerListener(new MyTriggerListener(), KeyMatcher.keyEquals(TriggerKey.triggerKey("trigger1","group1")));// 启动scheduler.start();}}

2.5 SchedulerListener监听器

        SchedulerListener会在Scheduler的生命周期中关键事件发生时被调用,与Scheduler有关的事件包括:增加一个job/trigger,删除一个job/trigger,scheduler发生严重错误的时候,关闭scheduler。

2.5.1 SchedulerListener接口的方法

1. jobScheduler(Trigger trigger):用于部署JobDetail时调用

2. jobUnscheduled(String triggerName,String triggerGroup):用于卸载JobDetail时调用

3. triggerFinalized(Trigger trigger):当一个trigger来到了再也不会触发的状态的时候调用这个方法。除非这个job已设置成了持久性,否则它就会从Scheduler中移除。

4. triggersPaused(String triggerName,String triggerGroup):Scheduler调用这个方法是发生在一个Trigger或trigger组被暂停的时候。假如Trigger组的话,triggerName参数将为null。

5. triggersResumed(String triggerName,String triggerGroup):Scheduler调用这个方法是发生在一个trigger或trigger组被暂停时。加入是trigger组的话,triggerName参数将为null

6. jobsPaused(String triggerName,String triggerGroup):当一个或一组job被暂停的时候调用

7. jobsResumed(String triggerName,String triggerGroup):当一个或一个组job从暂停上恢复时调用。加入是job组,jobName参数将为null。

8. schedulerError(String msg,SchedulerException cause):在Scheduler正常运行期间,产生一个严重错误的时候调用

9. schedulerStarted():当scheduler开启的时候调用

10. schedulerInStandbyMode():当scheduler处于StandBy模式时,调用该方法。

11. schedulerShutdown():当scheduler停止时调用

12. schedulingDataCleared():当scheduler中的数据被清除的时候调用

2.5.2 Scheduler监听器的使用

1. 自定义Scheduler监听器

package cn.bjc.quartz.listener;import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.SchedulerException;
import org.quartz.SchedulerListener;
import org.quartz.Trigger;
import org.quartz.TriggerKey;public class MySchedulerListener implements SchedulerListener{@Overridepublic void jobScheduled(Trigger trigger) {String name = trigger.getKey().getName();System.out.println(name + "部署的时候调用!");}@Overridepublic void jobUnscheduled(TriggerKey triggerKey) {String name = triggerKey.getName();System.out.println(name + "卸载JobDetail时调用!");}@Overridepublic void triggerFinalized(Trigger trigger) {String name = trigger.getKey().getName();System.out.println(name + "被移除调用!");}@Overridepublic void triggerPaused(TriggerKey triggerKey) {String name = triggerKey.getName();System.out.println(name + "正在被暂停!");}@Overridepublic void triggersPaused(String triggerGroup) {System.out.println("触发器组" + triggerGroup + "正在被暂停!");}@Overridepublic void triggerResumed(TriggerKey triggerKey) {String name = triggerKey.getName();System.out.println(name + "正在被恢复!");}@Overridepublic void triggersResumed(String triggerGroup) {System.out.println("触发器组" + triggerGroup + "正在被恢复!");}@Overridepublic void jobAdded(JobDetail jobDetail) {String name = jobDetail.getKey().getName();System.out.println(name + "添加工作任务的时候调用!");}@Overridepublic void jobDeleted(JobKey jobKey) {String name = jobKey.getName();System.out.println(name + "删除工作任务的时候调用!");}@Overridepublic void jobPaused(JobKey jobKey) {String name = jobKey.getName();System.out.println(name + "暂停工作任务的时候调用!");}@Overridepublic void jobsPaused(String jobGroup) {System.out.println("job组" + jobGroup + "暂停的时候调用!");}@Overridepublic void jobResumed(JobKey jobKey) {System.out.println("工作任务恢复!");}@Overridepublic void jobsResumed(String jobGroup) {System.out.println("工作组任务恢复!");}@Overridepublic void schedulerError(String msg, SchedulerException cause) {System.out.println("调用出错,错误信息是:" + msg + "   具体错误原因是:" + cause.getUnderlyingException());}@Overridepublic void schedulerInStandbyMode() {System.out.println("调度器被挂起模式的时候调用!");}@Overridepublic void schedulerStarted() {System.out.println("调度器开启的时候调用!");}@Overridepublic void schedulerStarting() {System.out.println("调度器正在开启的时候调用!");}@Overridepublic void schedulerShutdown() {System.out.println("调度器关闭的时候调用!");}@Overridepublic void schedulerShuttingdown() {System.out.println("调度器正在关闭的时候调用!");}@Overridepublic void schedulingDataCleared() {System.out.println("当scheduler中的数据被清除的时候调用!");}}

2. 添加监听

scheduler.getListenerManager().addSchedulerListener(mySchedulerListener);

调用代码:

package cn.bjc.quartz.main;import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;import cn.bjc.quartz.job.HelloJobListener;
import cn.bjc.quartz.listener.MySchedulerListener;public class SchedulerListenerDemo {public static void main(String[] args) throws Exception {Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();// 2. 任务实例(JobDetail),通过JobBuilder创建JobDetail jobDetail = JobBuilder.newJob(HelloJobListener.class).withIdentity("job1", "group1").usingJobData("msg", "日志打印").usingJobData("count", 0).build();// 3. 触发器(Trigger)Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startNow().withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(5).withRepeatCount(2))	// 5秒后重复执行,只重复执行4次.build();scheduler.scheduleJob(jobDetail, trigger);MySchedulerListener mySchedulerListener = new MySchedulerListener();// 注册监听器scheduler.getListenerManager().addSchedulerListener(mySchedulerListener);// 移除监听// scheduler.getListenerManager().removeSchedulerListener(mySchedulerListener);// 启动scheduler.start();Thread.sleep(8000);scheduler.shutdown();}}

 

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. day06

    01-合并数据 import pandas as pd""" import numpy as np numpy 合并数组 np.hstack() # 水平合并 np.vstack() # 垂直合并 np.concatenate() # 行的方向 axis = 0 np.concatenate() # 列的方向 axis = 1 """ # # 获取df数据 # df1 = pd.read_e…...

    2024/5/6 22:53:45
  2. LeetCode-136. 只出现一次的数字

    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,1] 输出: 1 示例 2:输入: [4,1,2,1,2] 输出: 4方法1:哈希表#include &l…...

    2024/5/6 22:53:42
  3. select,poll,epoll之间的区别

    (1)select==>时间复杂度O(n)它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询…...

    2024/5/6 22:53:37
  4. nginx rewrite 指令last break区别最详细的解释

    总结: rewrite 可以在 server location 块, 正则比配的时候才重写,所以多条 rewrite 顺序靠前且匹配的优先执行。break跳出rewrite阶段,不会在匹配,进入输出阶段。 last 类似重新发起请求,所以会重新进行匹配。nginx 的官方注释是这样的:laststops processing the curre…...

    2024/5/6 22:53:33
  5. 体验.NET Core 命令行应用程序-CommandLineUtils

    前言在我们开发中可能需要设计一次性应用程序,这些实用程序可以利用接近原始源代码的优势,但可以在与主Web应用程序完全独立的安全性上下文中启动。具体在 [管理过程](https://12factor.net/admin-processes)中也已经列出了原因。创建控制台应用打开命令提示符,创建创建一个…...

    2024/5/6 22:53:29
  6. LeetCode 92-反转链表

    1. 反转链表public class ReverseList92 {//定义一个单链表public class ListNode {int val; //当前节点值ListNode next; //下一个节点值//构造方法 初始化当前节点值ListNode(int x) { val = x; }}/**反转链表(反转链表中一部分)*方法1:迭代思想(利用链表特…...

    2024/5/6 22:53:25
  7. Vulkan填坑学习Day11—固有功能

    Vulkan 固有功能 Vulkan 固有功能,早期的图形API在图形渲染管线的许多阶段提供了默认的状态。在Vulkan中,从viewport的大小到混色函数,需要凡事做到亲历亲为。在本章节中我们会填充有关固有功能操作的所有结构体。 一、顶点输入 VkPipelineVertexInputStateCreateInfo结构体…...

    2024/5/6 22:53:21
  8. JavaWeb综合案例第一天(注册_验证码_邮箱验证_登录_退出_登陆成功之后的信息展示)

    一、搭建开发环境—基于前后端分离的旅游项目 项目需要用到的技术栈 后端:Servlet, beanUtils , Jackson , javaMail , jdbctemplate ,druid + mysql 前端:bootstrap + jquery1.创建web项目,创建java目录和resources目录2.在pom.xml中导入项目需要用的依赖包 <?xml versi…...

    2024/5/6 22:53:17
  9. IC--die/shot/cell

    把不同的版图放在同一张掩模版上,这样一个曝光区域中就可以由不同的器件设计(又称为’die’) 网格(grid),按照曝光区域把晶圆表面分成若干大小相同的矩形的网格 每一个网格内的区域被称为一个单元(cell) 每个cell里有一个曝光区域,曝光区域的面积比cell略小一些。每一次曝光…...

    2024/5/6 22:53:13
  10. Tensorflow神奇的Bug:ImportError: dlopen: cannot load any more object with static TLS

    (转载请私信或微信联系:moses_1994,请不要原文搬运了连声招呼都不打)1. 背景基本环境:anaconda 3.0 + python 3.6 + tensorflow 1.5.02. 问题描述在服务器上安装了tensorflow 1.5.0版本,但是在载入的时候,出现了一个神奇的Bug,详情如下:tensorflow的相关程序在 mode…...

    2024/5/6 22:53:09
  11. 现代数字和模拟通信复习3/7

    @现代数字和模拟通信复习 现代数字和模拟通信复习3/7 23号要考信号变调了,在这里整理一下信号转换的知识点和大纲。 以下是目录(第三章): 3 信号的分析和传输62 3.1傅立叶积分表示的非周期信号62 3.2某些有用功能的转换69 3,3傅立叶变换的某些特性75 3.3.1时频对偶76 3.3.2对…...

    2024/5/6 22:53:05
  12. 【Python】(三)条件判断与条件嵌套

    文章目录1.条件判断2.if嵌套3.如何写嵌套代码4.总结5.练习5.1 寻找宝石5.2 美国队长的工资 1.条件判断 在Python宇宙,条件判断语句总共有三种表现形式,先从最简单的单向判断:if开始说起:单向判断:if示例如下: # 为宝石数量赋值 stonenumber=6# 条件:如果你拥有的宝石数量…...

    2024/5/6 22:53:01
  13. 指针练习题二

    练习题一、完成代码,实现数组值的互换 void Function() { int arr[5] = {1,2,3,4,5}; //..此处添加代码,使用指针,将数组的值倒置 int* x=arr;int z;for(int i=0,k=4; i<2;i++,k--){z = *(x+i);*(x+i) = *(x+k);*(x+k) = z;} //打印数组值的代码已经写完…...

    2024/5/6 22:52:57
  14. Anaconda如何安装、卸载、更新、查看库?

    conda包库管理器,下载卸载更新查看库 以安装tensorflow库为例 (virtual) C:\Users\Admin>conda install tensorflow或 (virtual) C:\Users\Admin>pip install tensorflow两者区别在于pip安装的范围更广,资源更丰富,有些conda找不到的库pip可以找到。 conda的优势在于解…...

    2024/5/6 22:52:53
  15. CentOS 1908 配置 Redis 5.0.7 集群 一(单节点)

    CentOS 下载:http://mirrors.aliyun.com/centos/Redis:http://download.redis.io/releases/下载 Redis 5.0.7:wget http://download.redis.io/releases/redis-5.0.7.tar.gz解压 Redis:tar -zxvf redis-5.0.7.tar.gz安装 gcc:yum -y install gcc如未安装,可能出现如下问题…...

    2024/5/6 22:52:49
  16. 字典序全排列

    题目 给定一个可包含重复数字的序列,返回所有不重复的全排列。 示例: 输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ] 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/permutations-ii 分析 在用几个数字进行排列组合时,可以按照数字的大小顺序进行排列…...

    2024/5/6 22:52:45
  17. 5G基础_08 5G承载网

    载波聚合/多点协作5G基站数量巨大,海量的运维LTE峰值带宽是LTE的100倍以上网络切片敏捷网络--》快速的业务部署,站点开通,流量调整### 高带宽 ###4G LTE:每个基站峰值速率,即承载网要为下面的每个基站预留320M的峰值速率,平均速率为每站80M5G NR:承载网为每个基站预留峰…...

    2024/5/6 8:28:09
  18. pandas数据聚合与分组

    前言 数据聚合于分组操作在众多的关系型或非关系型库中都有涉及,大体原理都是类似,根据某个或者多个业务字段将获取到的数据进行聚合操作或者分组操作,pandas提供了非常友好的分组聚合功能,可以方便使用人员对数据进行不同维度的聚合分组操作 API简要说明 构造一个DataFram…...

    2024/5/6 8:28:06
  19. idae 快捷键

    格式化 代码:Ctrl+Alt+L...

    2024/5/6 22:52:41
  20. 7-6 整除光棍

    7-6 整除光棍这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如,111111就可以被13整除。 现在,你的程序要读入一个整数x,这个整数一定是奇数并且不以5结尾。然后,经过计算,输…...

    2024/5/6 22:52:37

最新文章

  1. 04-xss获取cookie实验

    二、开发XSS服务器端 1、确认实验环境 攻击者服务器&#xff1a;192.168.74.134&#xff0c;将获取到cookie数据保存到该服务器的数据库中&#xff0c;运行PHP代码暴露一个接收Cookie的URL地址。 正常Web服务器&#xff1a;192.168.74.133&#xff0c;用于正常的用户访问的目…...

    2024/5/7 18:50:39
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/7 10:36:02
  3. 产品推荐 | 中科亿海微推出亿迅®A8000金融FPGA加速卡

    01、产品概述 亿迅A8000金融加速卡&#xff0c;是中科亿海微联合金融证券领域的战略合作伙伴北京睿智融科&#xff0c;将可编程逻辑芯片与金融行业深度结合&#xff0c;通过可编程逻辑芯片对交易行情加速解码&#xff0c;实现低至纳秒级的解码引擎&#xff0c;端到端的处理时延…...

    2024/5/7 18:18:40
  4. 蓝桥杯 - 受伤的皇后

    解题思路&#xff1a; 递归 回溯&#xff08;n皇后问题的变种&#xff09; 在 N 皇后问题的解决方案中&#xff0c;我们是从棋盘的顶部向底部逐行放置皇后的&#xff0c;这意味着在任何给定时间&#xff0c;所有未来的行&#xff08;即当前行之下的所有行&#xff09;都还没…...

    2024/5/6 20:35:46
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/7 5:50:09
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/7 9:45:25
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/7 14:25:14
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/7 11:36:39
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/6 1:40:42
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/4 23:55:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/7 9:26:26
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/4 23:55:06
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/5 8:13:33
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/4 23:55:16
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/6 21:42:42
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/4 23:54:56
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57