springCloud-es B站黑马程序员 多多三连
1.倒排索引
查询数据库时如果是根据主键Id查询,因为主键id本身带有索引,所以查询效率很快.但是如果字段上没有索引,此时如果进行查询,MySQL的策略则是逐条扫描,这样的效率是非常慢的.这种查询方式为正向索引.
es采用一种名为倒排索引的查询方式.
1.1 分词
在定义es索引库的时候,如果字段的类型为text,并且指定分词器时,则会进行分词,并将分出的词进行倒排索引.
-
mysql的表结构
-
id titile price 1 小米手机 3499 2 华为手机 4999 3 华为小米充电器 49 4 小米手环 299
-
-
对应的 es mapping
{id : 1,title : "小米手机",price : 3499}
-
,假设 title 字段的类型为 text , 分词器采用IK分词器,则所有title字段则会被分词,创建倒排索引表, 则会被分词小米,手机,华为,充电器,手环,则title字段的倒排索引表为
词条(term) | 文档id |
---|---|
小米 | 1,3,,4 |
手机 | 1,2 |
华为 | 2,3 |
充电器 | 3 |
手环 | 4 |
-
可见 这种根据词条反向查询文档id的查询与Mysql的方式正好相反,解释了什么叫倒排.
1.2 搜索
-
搜索过程 :
-
搜索"华为手机"
-
进行分词 => "华为","手机"
-
在倒排索引表进行搜索,得到文档id为 1,2 和 2,3
-
将结果集 1, 2 ,3保存
-
根据文档id 1 ,2 ,3 去索引库进行查找.
-
2. Mysql 与 es
两者并不是替代关系,而是根据自身的优势和劣势进行互补,在进行不同的数据操作时,选择合适的技术.
-
Mysql 数据库负责事务类型的操作,可以保证数据的安全和一致性,如果是根据主键id查询,则可以直接使用SQL语句.
-
es负责海量数据的搜索,分析,计算.
-
额...比如做后台管理系统的时候,就可以采用Mysql
-
但是..对于用户的搜索,则采用es
-
3. 创建索引时的mapping属性
-
mapping是对索引库中文档的约束,常见的mapping属性包括
-
type : 字段数据类型,常见的简单类型有:
-
字符串 : text(可分词的文本),keyword(精确值)
-
数值 : long , integer , double , float ...
-
判断 : boolean
-
日期 : date
-
对象 : object
-
-
index : 是否创建倒排索引,默认true,创建
-
analyzer : standard , ik_smart , ik_max_word , pinyin ...
-
properties : 子字段
-
4. 索引(index)操作的DSL与javaRestClient
Test测试
private RestHighLevelClient esClient;@BeforeEach //建立客户端void setUp(){this.esClient = new RestHighLevelClient(RestClient.builder(HttpHost.create("xxx.xx.71.234:9200")));}@AfterEach //关闭客户端void closeClient() throws IOException {this.esClient.close();}
4.1 创建索引
-
DSL
PUT /hotel
{"settings": {"analysis": {"analyzer": {"text_analyzer":{"tokenizer":"ik_max_word","filter":"py"},"completion_analyzer":{"tokenizer" : "keyword","filter":"py"}},"filter": {"py":{"type": "pinyin","keep_full_pinyin": false,"keep_joined_full_pinyin": true,"keep_original": true,"limit_first_letter_length": 16,"remove_duplicated_term": true,"none_chinese_pinyin_tokenize": false}}}},"mappings": {"properties": {"id":{"type": "keyword"},"name":{"type": "text","analyzer": "text_analyzer","search_analyzer": "ik_max_word","copy_to": "all"},"address":{"type": "keyword"},"price":{"type": "integer"},"score":{"type": "integer"},"brand":{"type": "keyword","copy_to": "all"},"city":{"type": "keyword"},"starName":{"type": "keyword"},"bussiness":{"type": "keyword","copy_to": "all"},"location":{"type": "geo_point"},"pic":{"type": "keyword","index": false},"all":{"type": "text","analyzer": "text_analyzer","search_analyzer": "ik_max_word"},"suggestion":{"type": "completion","analyzer": "completion_analyzer"}}}
}
4.2 获取索引
-
DSL
GET /hotel
Rest java 判断索引是否存在
@Testvoid indexExist() throws IOException {GetIndexRequest getIndexRequest = new GetIndexRequest("hotel");boolean exists = esClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT);System.err.println(exists);}
4.3 删除索引
-
DSL
DELETE /hotel
Rest java 删除索引
@Testvoid deleteIndex() throws IOException {DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("user");esClient.indices().delete(deleteIndexRequest,RequestOptions.DEFAULT);}
4.4 新增字段
-
DSL
PUT /hotel/_mapping
{"properties":{"age":{"type":integer}}
}
5.文档(document)操作的DSL与javaRestClient
5.1批量新增文档
-
DSL
POST /user/_doc/1
{"id" : 1,"name" : "奥利给","gender" : false,"email" : "1111111111@qq.com"
}
Rest Client
@Testvoid createDocument() throws IOException {BulkRequest bulkRequest = new BulkRequest();//user3User user3 = new User();user3.setId(3L);user3.setName("user3");user3.setEmail("@qq.com");user3.setGender(false);//user4User user4 = new User();user4.setId(4L);user4.setName("user4");user4.setEmail("@qq.com");user4.setGender(false);bulkRequest.add(new IndexRequest("user").source(JSON.toJSONString(user3), XContentType.JSON).id("3"));bulkRequest.add(new IndexRequest("user").source(JSON.toJSONString(user4), XContentType.JSON).id("4"));esClient.bulk(bulkRequest, RequestOptions.DEFAULT);}
5.2 删除文档
-
DSL
DELETE /user/_doc/1
Rest Client
@Testvoid deleteDocument() throws IOException {DeleteRequest deleteRequest = new DeleteRequest("user").id("4");esClient.delete(deleteRequest, RequestOptions.DEFAULT);}
5.3 修改文档
-
DSL
POST /user/_update/1
{"doc":{"name" : "the 奥利给 has benn updaated"}
}
Rest Client
@Testvoid updateDocument() throws IOException {UpdateRequest updateRequest = new UpdateRequest("user","1");updateRequest.doc("name","the 奥利给 has benn updaated");esClient.update(updateRequest,RequestOptions.DEFAULT);}
6. 文档查询
6.1 match all
-
DSL
#文档 全查询 match
GET /hotel/_search
{"query": {"match_all": {}}
}
Rest Client
@Testvoid matchAll() throws IOException {SearchRequest searchRequest = new SearchRequest("hotel");SearchResponse response =esClient.search(searchRequest, RequestOptions.DEFAULT);//结果解析long value = response.getHits().getTotalHits().value;System.err.println(value);SearchHit[] hits = response.getHits().getHits();for (SearchHit hit : hits) {System.err.println(hit.getSourceAsString());}}
6.2 match field
-
DSL
GET /hotel/_search
{"query": {"match": {"all": "上海"}}
}
Rest Client
@Testvoid match() throws IOException {SearchRequest searchRequest = new SearchRequest("hotel");searchRequest.source().query(QueryBuilders.matchQuery("all", "上海"));SearchResponse search =esClient.search(searchRequest, RequestOptions.DEFAULT);long value = search.getHits().getTotalHits().value;System.err.println(value);}
6.3 multi match
-
DSL
GET /hotel/_search
{"query": {"multi_match": {"query": "上海","fields": ["name","business"]}}
}
Rest Client
@Testvoid multiMatch() throws IOException {SearchRequest searchRequest = new SearchRequest("hotel");searchRequest.source().query(QueryBuilders.multiMatchQuery("上海", "name","business"));SearchResponse search =esClient.search(searchRequest, RequestOptions.DEFAULT);TotalHits totalHits = search.getHits().getTotalHits();System.err.println(totalHits);}
6.4 term
-
DSL
GET /hotel/_search
{"query": {"term": {"city": {"value": "上海"}}}
}
Rest Client
@Testvoid termSearch() throws IOException {SearchRequest searchRequest = new SearchRequest("hotel");searchRequest.source().query(QueryBuilders.termQuery("city", "上海"));SearchResponse search =esClient.search(searchRequest, RequestOptions.DEFAULT);long totalHits = search.getHits().getTotalHits().value;System.out.println(totalHits);}
6.5 range
-
DSL
GET /hotel/_search
{"query": {"range": {"price": {"gte": 0,"lte": 2000}}}
}
Rest Client
@Testvoid termSearch() throws IOException {SearchRequest searchRequest = new SearchRequest("hotel");searchRequest.source().query(QueryBuilders.termQuery("city", "上海"));SearchResponse search =esClient.search(searchRequest, RequestOptions.DEFAULT);long totalHits = search.getHits().getTotalHits().value;System.out.println(totalHits);}
6.6 bool "and" 搜索
-
must 参与算分 "与"
-
filter 不参与算分 "与"
-
must not "非" 不参与算分
-
should "或" 参与算分
-
DSL
-
GET /hotel/_search
{"query": {"bool": {"must": [{"term": {"city": {"value": "上海"}}}],"filter": [{"range": {"price": {"gte": 0,"lte": 2000}}}]}}
}
Rest Client
@Testvoid booleanSearch() throws IOException {SearchRequest searchRequest = new SearchRequest("hotel");BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();boolQuery.must(QueryBuilders.termQuery("city", "上海"));boolQuery.filter(QueryBuilders.rangeQuery("price").gte(0).lte(2000));searchRequest.source().query(boolQuery);SearchResponse response =esClient.search(searchRequest, RequestOptions.DEFAULT);long value = response.getHits().getTotalHits().value;System.out.println(value);}
6.7 sort and page
-
DSL
GET /hotel/_search
{"query": {"match_all": {}},"sort": [{"price": {"order": "desc"}}],"from": 0,"size": 2
}
Rest Client
@Testvoid sortAndPage() throws IOException {SearchRequest searchRequest = new SearchRequest("hotel");searchRequest.source().sort("price", SortOrder.DESC).from(0).size(2);SearchResponse response =esClient.search(searchRequest, RequestOptions.DEFAULT);SearchHit[] hits = response.getHits().getHits();for (SearchHit hit : hits) {String sourceAsString = hit.getSourceAsString();System.out.println(sourceAsString);}}
6.7.1 逻辑分页
-
逻辑分页 : es的倒排索引方式导致其分页效率不是很高,当from = 990 , size = 10 时 ,是先获取1000条数据,再去截取最后10条.
-
ES是分布式的,所以会面临深度分页的问题.例如按price排序之后,获取from = 990 , size = 10 的数据 :
-
首先在每个数据分片上都排序并查询前1000条文档
-
然后将所有节点的结果聚合,在内存中重新排序选出前1000条文档
-
最后从这1000条中,选取990开始的10条文档
-
-
如果搜索页数过深,或者结果集(from + size)越大,对内存和CPU的消耗也就越高.因此ES设定结果集查询的上限为10000(from + size <= 10000)
-
百度的ES集群假设有5000台,再每个分片上取1000,统共500万条数据在内存中运算..
-
正常业务对于用户的分页查询给出的结果也不会超过10000条(基本上会比10000很少),从情理来说,用户也不会做过深的查找.
-
深度分页解决方案,假设我真的要查询10000条以上的数据,针对深度分页,ES提供了两种解决方案
-
search after : 分页时需要排序 , 原理是从上一次的排序值开始,查询下一页数据.
-
由于是记录了上一次排序的最后值 , 再次查询基于此值向后查询,所以此类深度分页解决方案所以,只能向前翻页----
-
-
6.8 highLight
-
默认情况下 , ES 搜索字段必须与高亮字段一致.
-
DSL
GET /hotel/_search
{"query": {"match": {"all": "上海"}},"highlight": {"fields": {"name": {"require_field_match": "false"}}}
}
Rest Client
@Testvoid highLight() throws IOException {SearchRequest searchRequest = new SearchRequest("hotel");searchRequest.source().query(QueryBuilders.matchQuery("all", "上海"));searchRequest.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));SearchResponse response = esClient.search(searchRequest, RequestOptions.DEFAULT);SearchHit[] hits = response.getHits().getHits();for (SearchHit hit : hits) {Map<String, HighlightField> highlightFields = hit.getHighlightFields();HighlightField name = highlightFields.get("name");Text[] fragments = name.getFragments();for (Text fragment : fragments) {System.out.println(fragment.string());System.out.println("-----");}}}
6.9 sort by geoDistance
-
DSL
GET /hotel/_search
{"query": {"match_all": {}},"sort": [{"_geo_distance": {"location": {"lat": 31,"lon": 131},"order": "asc"}}]
}
Rest Client
@Testvoid sortByGeo() throws IOException {SearchRequest searchRequest = new SearchRequest("hotel");searchRequest.source().sort(SortBuilders.geoDistanceSort("location", new GeoPoint("31,121")).order(SortOrder.ASC).unit(DistanceUnit.KILOMETERS));SearchResponse response = esClient.search(searchRequest, RequestOptions.DEFAULT);SearchHit[] hits = response.getHits().getHits();for (SearchHit hit : hits) {String sourceAsString = hit.getSourceAsString();Object[] sortValues = hit.getSortValues();for (Object sortValue : sortValues) {System.err.println(Double.parseDouble(sortValue.toString()));}System.out.println(sourceAsString);}}
6.10 geo_distance
-
DSL
GET /hotel/_search
{"query": {"geo_distance":{"distance":"15km","location":"31.21,121.5"} }
}
6.11 compound 复合查询
6.11.1 function score
-
DSL
-
当我们利用match查询时,文档结果会根据与搜索词条的关联度打分(_score),返回结果时按照分值降序排列.
GET /hotel/_search
{"query": {"function_score": {"query": { // 原始查询条件,搜索文档并根据相关性打分(query score)"match": {"all": "外滩"}},"functions": [{"filter": { // 过滤条件,符合条件的文档才会被重新算分"term": {"city": "上海"}},"weight": 10 //算分函数 详见下面解释}],"boost_mode": "multiply" //加权模式 详见下面解释}}
}
-
算分函数 : 算分函数的结果称为function score , 将来会与query score 运算,得到新的算分 , 常见的算分有:
-
weight : 给定一个常量值 , 作为函数结果 (function score) 与 相关性算分进行运算.
-
field_value_factor : 用文档中的某个字段值作为结果 (百度竞价 谁出钱高 谁排上面).
-
random_score : 随机数.
-
script_score : 自定义计算公式,公式结果作为函数的结果.
-
-
加权模式 , 定义function score 与 query score的运算方式,包括
-
multiply : 两者相乘.默认
-
replace : 用function_score 替换 query_score
-
其他 : sum , avg , max , min
-
Rest Client
@Testvoid functionTest() throws IOException {SearchRequest searchRequest = new SearchRequest("hotel");BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();FunctionScoreQueryBuilder functionScoreQuery =QueryBuilders.functionScoreQuery(boolQuery, new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.termQuery("isAD", true),ScoreFunctionBuilders.weightFactorFunction(10))}).boostMode(CombineFunction.SUM);searchRequest.source().query(functionScoreQuery);SearchResponse response = esClient.search(searchRequest, RequestOptions.DEFAULT);}
7.数据聚合
7.1 文档的分类
-
桶 (bucket)聚合 : 用来对文档进行分组.
-
TermAggregation : 按照文档字段值分组.
-
Date Histogram : 按照日期阶梯分组,例如一周为一组,或者一月为一组.
-
-
度量(Metric)聚合 : 用以计算一些值,比如 : 最大值,最小值,平均值等..
-
Avg : 求平均值
-
Max : 求最大值
-
Min : 求最小值
-
Stats : 同时求max,min,avg,sum等.
-
-
管道(pipeline)聚合 : 其他聚合的结果为基础做聚合
7.1 Bucket聚合
-
DSL
GET /hotel/_search
{"query":{"range":{"price":{"lte":200}}}, "size": 0,"aggs": {"brandAggs": {"terms": {"field": "brand","size": 10},"aggs": {"scoreAgg": {"stats": {"field": "score"}}}}}
}
Rest Client
@Testvoid brandAgg() throws IOException {SearchRequest searchRequest = new SearchRequest("hotel");searchRequest.source().size(0);//term aggTermsAggregationBuilder brandTermAgg = AggregationBuilders.terms("brandAgg").field("brand").size(10);//avg aggAvgAggregationBuilder scoreAvgAgg = AggregationBuilders.avg("scoreAvg").field("score");//min aggMinAggregationBuilder scoreMinAgg = AggregationBuilders.min("scoreMin").field("score");brandTermAgg.subAggregation(scoreAvgAgg);brandTermAgg.subAggregation(scoreMinAgg);searchRequest.source().aggregation(brandTermAgg);SearchResponse response =esClient.search(searchRequest, RequestOptions.DEFAULT);Terms mySuggestion = response.getAggregations().get("brandAgg");List<? extends Terms.Bucket> buckets = mySuggestion.getBuckets();for (Terms.Bucket bucket : buckets) {String keyAsString = bucket.getKeyAsString();System.err.println(keyAsString);Aggregations aggregations = bucket.getAggregations();Avg scoreAvg = aggregations.get("scoreAvg");System.out.println("平均值"+scoreAvg.getValue());Min scoreMin = aggregations.get("scoreMin");System.out.println("最小值"+scoreMin.getValue());}}
7.2 多条件聚合
@Testvoid multiAgg() throws IOException {SearchRequest searchRequest = new SearchRequest("hotel");searchRequest.source().size(0);//brand AggTermsAggregationBuilder brandAgg =AggregationBuilders.terms("brandAgg").field("brand").size(10);//starName aggTermsAggregationBuilder starNameAgg =AggregationBuilders.terms("starNameAgg").field("starName").size(10);//city AggTermsAggregationBuilder cityAgg =AggregationBuilders.terms("cityAgg").field("city").size(10);searchRequest.source().aggregation(brandAgg);searchRequest.source().aggregation(starNameAgg);searchRequest.source().aggregation(cityAgg);SearchResponse response =esClient.search(searchRequest, RequestOptions.DEFAULT);Terms brandTerms = response.getAggregations().get("brandAgg");List<? extends Terms.Bucket> buckets = brandTerms.getBuckets();for (Terms.Bucket bucket : buckets) {String hotelName = bucket.getKeyAsString();System.err.println(hotelName);}Terms starNameTerms = response.getAggregations().get("starNameAgg");List<? extends Terms.Bucket> buckets1 = starNameTerms.getBuckets();for (Terms.Bucket bucket : buckets1) {String hotelName = bucket.getKeyAsString();System.out.println(hotelName);}}
8.自动补全
8.1 分词器
-
ES中分词器(analyzer)的组成包含三部分.
-
character filters : 在tokenizer之前对文本进行处理.例如删除字符,替换字符.
-
tokenizer : 将文本按照一定的规则切割成词条(term).例如keyword,就是不分词,还有ik_smart
-
filter : 将tokenizer输出的词条做进一步处理.例如大小写转换,同义词处理,拼音处理等等.
-
拼音分词器适合在创建倒排索引的时候使用,但不能再搜索的时候使用
8.2 语法
-
DSL
GET /hotel/_search
{"size": 0,"suggest": {"mySuggestion": {"text": "sd","completion": {"field": "suggestion","skip_duplicates":true,"size":2}}}
}
Rest Client
@Testvoid hotelSuggestion() throws IOException {SearchRequest searchRequest = new SearchRequest("hotel");searchRequest.source().suggest(new SuggestBuilder().addSuggestion("mySuggestion",SuggestBuilders.completionSuggestion("suggestion").prefix("sd").skipDuplicates(true).size(10)));SearchResponse response =esClient.search(searchRequest, RequestOptions.DEFAULT);CompletionSuggestion mySuggestion =response.getSuggest().getSuggestion("mySuggestion");List<CompletionSuggestion.Entry.Option> options = mySuggestion.getOptions();for (CompletionSuggestion.Entry.Option option : options) {System.err.println(option.getText().string());}}
9. ES集群
9.1 ES集群结构
-
单机的ES做数据存储,必然会面临两个问题,海量数据存储问题,单点故障问题.
-
海量数据存储问题,将索引库从逻辑上拆分为N个分片(shard),存储到多个节点.
-
单点故障问题,将分片数据在不同节点备份.
-
9.2 ES集群的节点角色
节点类型 | 配置参数 | 默认值 | 节点职责 |
---|---|---|---|
master eligible | node.master | true | 备选主节点:主节点可以管理和记录集群状态,决定跟片在哪个节点,处理创建和删除索引库的请求. |
data | node.data | true | 数据节点 : 存储数据,搜索,聚合,CRUD |
ingest | node.ingest | true | 数据存储之前的预处理 |
coordianting | 上面3个参数都为false,则为coordinating节点 | 无 | 路由请求到其他节点,合并其他节点处理的结果,返回给用户. |
-
ES中的每个节点角色都有自己不同的职责,因此建议部署集群时,每个节点都有独立的角色.
9.3 ES集群的脑裂
-
由于网络阻塞问题导致的多主节点情况,在es 7.0 之后已经得到解决.
9.4 ES分布式新增流程
当新增文档时,应该保存到不同分片,保证数据均衡,那么coordinating node如何确定数据该存储到哪个分片呢?elasticsearch会通过hash算法来计算文档应该存储到哪个分片.
shard = hash(_routing) % number_of_shards
-
_routing默认是文档的id
-
算法与分片数量有关,因此索引库一旦创建,分片的数量就不能修改了!
9.5 ES分布式查询流程
elasticsearch的查询分成两个阶段
-
scatter phase:分散阶段,coordinating node会把请求分发到每一个分片
-
gather phase:聚集阶段,coordinating node汇总data node的搜索结果,并处理为最终结果集返回给用户
9.6 ES 故障转移
集群的master节点会监控集群中的节点状态,如果发现有节点宕机,会立即将宕机节点的分片数据迁移到其它节点,确保数据安全,这个叫做故障转移.
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- vivado下载错误 core_34 is an invalid handle
问题原因:应该是debug的问题。工程在以前有了部分debug,然后更新了部分的源代码(主要是更改了一些debug的路劲),然后再更新debug核;就算这样处理了但是这样还是会有问题的。 解决办法:需要将XD…...
2024/3/23 14:04:38 - 达人评测 i5 10300H、i7 10510u和i7 11800h选哪个好
i5 10300H是笔记本平台的标准电压处理器,为四核心八线程,主频2.5GHz,睿频4.5GHz,45W TDP,8M三级缓存 选i5 10300H、i7 10510u还是i7 11800h这些点很重要 http://www.adiannao.cn/dy i7-11800H基本参数为:8…...
2024/3/23 11:19:44 - 到底谁是外键
主表(父表) 拥有主键的表,其主键与其他表相关联。 从表(子表) 以主表的主键值作为外键,可以通过外键与主表进行关联查询。 外键位于从表之上,制约主表。 始终要清楚的是,无论是…...
2024/3/23 14:04:02 - 问题记录:VScode显示解决找不到任务“compile”
Python编程时,点击运行启用—调试时报了这个错误: 后来发现在运行和调试那一栏发现,我的配置是C: 添加配置—Python—当前文件,然后会生成一个launch.jason的文件,搞定。...
2024/3/23 14:02:49 - AC自动机复习
文章目录AC自动机复习1.前置知识2.导入3.Fail指针4.算法流程5.模板代码6.习题AC自动机复习 1.前置知识 kmpkmpkmp的思想TrieTrieTrie图论入门 2.导入 AC自动机用来解决多个模式串匹配文本串的问题的。但是如果把每个模式串拼在一起的话 或者每次匹配一个的话,肯定…...
2024/3/29 22:46:51 - TreeMap DeleteEntry方法没搞懂的地方
首先是replacement部分针对p.right没有进行处理不知道为啥 就是图上标着2 和 3 的位置部分 以及右侧示意图问号部分的处理 我去数据结构网站上生成了对应的数据接口看发现不会出现那种情况找了找相关资料发现 这种应该是数据结构不会允许那种情况出现 就是自己这块比较模糊没法…...
2024/3/29 22:46:50 - 优先队列(最大堆)
目录一 优先队列二 原始操作:Sift-up和Sift-down三 初始化、插入、删除、返回最大元素四 完整代码与测试用例一 优先队列 优先队列(最大/最小堆)是一个运用非常广泛的数据结构,在维护与查找最值方面相比于有序数组与有序链表有着非常良好的时间复杂度&a…...
2024/3/29 22:46:49 - office保存提示“由于文件许可错误,word/excel/PowerPoint无法完成保存”的解决办法
office保存提示“由于文件许可错误,word/excel/PowerPoint无法完成保存” **问题:**我使用的是win10操作系统,在某次更新之后出现了office无法保存的问题,错误信息如下图 **解决办法:**将文件移动到非系统盘…...
2024/3/29 22:46:48 - Android Preference 布局结构
转自 http://blog.csdn.net/qinjuning/article/details/6710003在Android系统源码中,绝大多数应用程序的UI布局采用了Preference的布局结构,而不是我们平时在模拟器中构建应用程序时使用的View布局结构,例如,Setting模块中布局。当然,凡事都有例外,FMRadio应用程序中则使…...
2024/3/23 14:08:52 - 【算法入门系列】基础算法——二分查找
二分查找 概念 二分查找是一个基础的算法,也是面试中常考的一个知识点。二分查找就是将查找的键和子数组的中间键作比较,如果被查找的键小于中间键,就在左子数组继续查找;如果大于中间键,就在右子数组中查找…...
2024/3/23 14:07:03 - DiskCatalogMaker for Mac(磁盘管理工具)
DiskCatalogMaker Mac破解版是一款可以帮你管理磁盘目录盘的工具,DiskCatalogMaker for Mac破解版可以压缩目录数据的磁盘空间、生成缩略图等,DiskCatalogMaker Mac版还支持ZIP、RAR、7-Zip、gzip、bzip2 等格式,简单好用。 DiskCatalogMake…...
2024/3/23 14:05:14 - 詹森不等式汇总
...
2024/3/23 11:19:44 - 数据结构-二叉树(上)
1、树(Tree)一种非线性表数据结构: A 节点就是 B 节点的父节点,B 节点是 A 节点的子节点。B、C、D 这三个节点的父节点是同一个节点,所以它们之间互称为兄弟节点。我们把没有父节点的节点叫做根节点,也就是…...
2024/3/23 14:08:16 - 小米运动修改脚本-python版-亲测可用
搬运源: 小米运动修改脚本Python源码 下载小米运动APP,注册小米账户绑定第三方 微信、支付宝运行脚本 # !/usr/bin/python # -*- codingutf-8 -*- import time, re, random import requestsdef get_now():# return time.strftime(%H:%M:%S)return time…...
2024/3/23 14:10:05 - SSM框架整合
文章目录SSM框架整合一、pom文件引入依赖二、Spring.xml三、springmvc.xml四、mybatis.xml五、web.xmlSSM框架整合 一、pom文件引入依赖 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" …...
2024/3/23 14:05:51 - CA-IS3720LS 双通道标准数字隔离器
概述 CA-IS372x 是一款高性能2 通道数字隔离器具有精确的时序特性和低电源损耗。 在隔离 CMOS 数字 I/O 时,CA-IS372x 器件可提供高电磁抗扰度和低辐射。所有器件版本均具有施密特触发器输入,可实现高抗噪性能。每条隔离通道的逻辑输入和输出缓冲器均由…...
2024/3/23 14:10:41 - iOS单元测试
单测介绍、基本逻辑测试 iOS单元测试从入门到应用 包括: 什么是单元测试 为什么要做单元测试 如何进行单元测试 测试准备 公共方法的测试 私有方法的测试 性能测试 运用OCMock进行测试 异步测试 UITest脚本录制 引入单元测试遇到的问题 这篇主要看点是利用通知进行…...
2024/3/23 14:13:06 - 【dolphinScheduler】手动提交spark到yarn cluster运行正常,DS提交yarn cluster报空指针等错误
问题描述: 手动提交spark到yarn cluster运行正常,DS提交yarn cluster报空指针等错误: Exception in thread "main" org.apache.spark.SparkException: Application application_1633943332832_0171 finished with failed statusa…...
2024/3/29 17:02:15 - 冒泡,快速,插入排序算法java简单实现
笔者在学习排序算法时经常是算法原理懂了但是不会实现,网上的许多实现过程要么太过于复杂,要么多次定义方法还递归,让人掌握起来double困难,鉴于此,笔者决定将几种常见算法的简单实现送给大家,希望对大家掌…...
2024/3/23 14:14:19 - 《如何阅读一本书》读书笔记
如何阅读一本书 阅读的层次 主动阅读最重要,在阅读中不停进行思考。 指导型的学习:通过倾听或者阅读,借助于老师或者旁人的帮助。 自我发现型的学习:需要被启发,就是要去理解搞清楚这到底是怎么回事,为…...
2024/3/23 14:16:45
最新文章
- 【C语言】内存函数(memmove)的使用和模拟实现
目录 前言memmove定义1.在cplusplus中的定义 memmove的模拟实现1、思路2、难点3、解决方法 模拟实现代码 前言 这篇文章讲述了memcpy的使用、模拟实现和一个未解决的问题内存函数(memcpy)的使用和模拟实现 当我们使用我们模拟的my_memcpy拷贝,当源拷贝地址与目标拷…...
2024/3/29 22:57:49 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 计算机毕业设计Hadoop+Spark+Hive租房推荐系统 贝壳租房数据分析 租房爬虫 租房可视化 租房大数据 大数据毕业设计 大数据毕设 机器学习
毕业技术方向调查表 姓名: 李昌福 课题方向 房无忧房屋租赁平台 开发语言: Java 前端框架: VUE 数据库: MySQL 服务器端 框架: SpringCloud 其他技术: Hadoop、HDFS 方向…...
2024/3/29 19:53:23 - JDK,JRE,JVM之间的关系
他们明面上的关系是JDK包含JRE,JRE包含JVM。 简单理解JDK就是Java开发工具包。JRE是Java运行环境。JVM是Java虚拟机。 JDK是面向开发者的,JRE是面向JAVA程序的用户的。也就是说开发者开发JAVA程序是需要用到JDK,如果用户不去开发JAVA程序&am…...
2024/3/29 17:31:08 - Unity 布局元素Layout Element
Layout Element是一种用于控制UI元素在布局组件(如Horizontal Layout Group、Vertical Layout Group、Grid Layout Group、Content Size Fitter和Aspect Ratio Fitter)中的大小和位置的组件。Layout Element组件可以附加到UI元素上,以便在布局…...
2024/3/29 1:00:11 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/3/29 18:08:39 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/3/29 18:08:34 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/3/29 2:45:46 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/3/29 16:26:39 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/3/29 5:19:52 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/3/29 18:08:00 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/3/29 11:11:56 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/3/29 1:13:26 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/3/29 8:28:16 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/3/29 7:41:19 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/3/29 18:07:15 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/3/29 9:57:23 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/3/29 0:49:46 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/3/29 18:06:57 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/3/29 17:27:19 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/3/29 18:06:36 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/3/29 18:06:22 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/3/28 18:26:34 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/3/29 18:06:01 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/3/28 20:09:10 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) 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 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在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