让chatGPT当我的老师如何? 通过和chatGPT交互式学习,了解在ES中,一条JSON数据是如何写到磁盘上的

2023-05-16

  最近一直有一个问题,如鲠在喉。争取早一天解决,早一天踏踏实实的睡觉。

  问题是:在ES中,一条JSON数据是如何写入到磁盘上的?

  如何解决这个问题?我想到了chatGPT,还有lucene的学习资料。这篇文章,我打算用 QA的形式来分享这次学习探索过程,看看能否驯服chatGPT当我的老师。

  文章我copy了我和chatGPT的聊天记录。

  最后的结果还是挺不错的,虽然也有一些问题,但是大多数是对的。并且chatGPT也给列出来了ES中这部分源码的实现位置,只需要再花时间看看源码,答案就有了。

Q1.1 在ES中,一条JSON数据是如何写入到磁盘上的,请结合lucene底层来讲讲

 其中引用起来的就是chatGPT告诉我的答案。chatGPT是一个很厉害的科学家,同时又很擅长说谎话。所以和chatGPT交流学习,最大的困难点,就是识别他说的谎话。

在Elasticsearch中,一条JSON数据是被索引到Lucene底层中的,Lucene底层是Elasticsearch用来存储和检索文档的核心引擎。

当一条JSON数据被索引到Elasticsearch中时,它首先会被转换为一个Lucene文档(Document)。Lucene文档是一个由多个字段组成的数据结构,每个字段都包含一个名称和一个值。在Elasticsearch中,每个JSON对象的属性都被映射为一个Lucene字段,其值则被存储在相应的字段中。

一旦JSON数据被转换为Lucene文档,它就可以被写入到磁盘上的Lucene索引文件中。Lucene索引文件是一个由多个段(Segment)组成的数据结构,每个段包含一部分文档和相关的元数据信息。当文档被写入到索引文件时,它会被分配到一个或多个段中,这些段可以是新建的,也可以是已存在的。

在Elasticsearch中,写入到磁盘上的数据是由分片(Shard)组成的。每个分片都是一个独立的Lucene索引,它可以存储一部分文档数据和元数据信息。当一条JSON数据被写入到Elasticsearch中时,它会被分配到一个或多个分片中,这些分片可以分布在不同的节点上,从而实现数据的分布式存储和检索。

总的来说,在Elasticsearch中,一条JSON数据是被转换为一个Lucene文档,并写入到分片的Lucene索引文件中的。这个过程涉及到很多细节和优化,Elasticsearch会尽可能地利用Lucene底层的特性来提高性能和可扩展性。

 第一个问题,看起来没有什么问题,因为只是笼统的回答一下。但是不是很详细,chatGPT也说了,涉及到了很多的细节和优化。那就接着继续问问。

 Q1.2这个过程涉及到哪些细节和什么优化

将一条JSON数据写入到磁盘上的Lucene索引文件中,涉及到很多细节和优化,其中一些关键点包括:

  1. 映射:将JSON数据映射到Lucene文档中,这包括对每个属性进行分词、索引和存储的处理。Elasticsearch会根据字段的类型和映射设置,自动进行数据转换和处理,以便正确地存储和检索数据。

  2. 索引:将Lucene文档写入到分片的索引文件中。这包括对文档进行分析、建立倒排索引、写入磁盘等一系列操作。Elasticsearch会利用Lucene底层的优化机制,如内存缓存、合并段、索引压缩等,以提高写入性能和减少磁盘空间占用。

  3. 分片:将索引数据分配到多个分片中,以实现数据的分布式存储和检索。Elasticsearch会根据集群配置和数据负载,自动进行分片和副本的分配和调整,以实现数据的高可用性和性能优化。

  4. 事务:将数据写入到索引文件时,需要保证数据的一致性和可靠性。Elasticsearch会利用Lucene底层的事务机制,如基于文件锁的事务管理和崩溃恢复机制,以确保数据写入的原子性和可靠性。

  5. 缓存:为了提高查询性能和减少磁盘I/O,Elasticsearch会利用Lucene底层的缓存机制,如过滤器缓存、字段数据缓存、近实时搜索等,以减少重复计算和磁盘访问。

总的来说,Elasticsearch通过利用Lucene底层的优化机制和特性,以及自身的分布式架构和算法,实现了高性能、可扩展和可靠的数据存储和检索。同时,Elasticsearch还提供了丰富的API和工具,方便用户进行数据操作和管理。

  这里的回答,看起来也都还行。 但还是不是我想要的答案。接下来我想问问他源码。

Q1.3还是不够详细,请结合源码跟我讲讲

Elasticsearch的源码实现涉及到多个模块和组件,其中核心部分是基于Lucene底层实现的。在这里,我会结合源码解析一下Elasticsearch将一条JSON数据写入到磁盘上的过程。

  • 映射:在Elasticsearch中,将JSON数据映射为Lucene文档是通过Mapping和Analyzer两个组件实现的。Mapping定义了字段的数据类型、分析器、存储方式等属性,Analyzer则负责对文本进行分词、过滤、归一化等处理。

在源码中,Mapping的定义是通过IndicesModule组件实现的,而Analyzer则是通过AnalysisModule和Analysis类实现的。当一条JSON数据被索引时,Elasticsearch会根据Mapping和Analyzer的定义,将数据转换为一个Lucene文档。

  • 索引:将Lucene文档写入到分片的索引文件中,是通过IndexWriter和IndexShard类实现的。IndexWriter是Lucene底层的核心组件,它负责对文档进行分析、建立倒排索引、写入磁盘等操作。

在Elasticsearch中,每个分片都有一个对应的IndexShard对象,它封装了Lucene的IndexWriter和IndexReader组件,以及相关的元数据信息。当一条JSON数据被写入到Elasticsearch时,它会被分配到一个或多个分片中,然后通过IndexShard的Index方法将文档写入到索引文件中。

  • 分片:将索引数据分配到多个分片中,是通过ClusterService和ShardRouting类实现的。ClusterService是Elasticsearch的集群管理组件,它负责管理集群的状态和拓扑结构,以及处理分片的分配和调度。

当一条JSON数据被写入到Elasticsearch时,它首先会被发送到一个主节点上进行处理,然后根据集群配置和数据负载,ClusterService会计算出将数据分配到哪些分片中。这个过程涉及到一些复杂的算法和策略,如哈希分片、一致性哈希、负载均衡等。

  • 事务:将数据写入到索引文件时,需要保证数据的一致性和可靠性。在Lucene底层,这个问题是通过两个机制来解决的:事务日志(Transaction Log)和段合并(Segment Merge)。

在Elasticsearch中,Transaction Log是通过Translog类实现的,它负责记录文档的变化操作,以便在崩溃或重启时进行恢复。Segment Merge则是通过IndexWriter和IndexReader组件实现的,它负责将多个小段合并成一个大段,以减少磁盘空间占用和提高查询性能。

  • 刷新和提交:将数据写入到索引文件后,需要将数据刷新到内存缓存和磁盘上。在Elasticsearch中,这个过程是通过IndexWriter和IndexShard类的flush方法实现的。

IndexWriter的flush方法会将内存缓存中的数据写入到磁盘上,并生成一个新的段(Segment),同时将事务日志清空。IndexShard的flush方法会将IndexWriter的缓存和元数据信息同步到内存中,并更新分片的状态信息。

当一批数据被写入到Elasticsearch后,它们并不会立即生效,直到进行了提交(Commit)操作。在Elasticsearch中,提交是通过IndexWriter的commit方法实现的,它会将所有未提交的数据刷新到磁盘上,并更新分片的元数据信息。

  • 性能优化:在将数据写入到Elasticsearch时,有一些性能优化技巧可以提高写入速度和可靠性。其中一些技巧包括:
    1. 批量写入:将多条数据合并成一个批次,一次性写入到Elasticsearch中,可以减少网络开销和提高写入性能。
    2. 索引分片:将索引数据分配到多个分片中,可以提高并发写入能力和水平扩展性。
    3. 内存管理:合理地管理内存缓存和JVM堆内存,可以避免OOM和GC问题,提高写入性能和稳定性。
    4. 硬件优化:选择高性能的硬件设备和存储介质,可以提高磁盘IO速度和可靠性。

总体来说,将一条JSON数据写入到Elasticsearch中,涉及到多个组件和技术细节,包括数据映射、索引写入、分片管理、事务处理、数据刷新和性能优化等方面。理解这些细节和技术原理,可以帮助我们更好地理解和使用Elasticsearch,并在实际应用中提高性能和可靠性。

   回答行云流水,不管对不对,先炸一下它。

Q1.4 你不能骗我,你要根据es官网和lucene官网回答我,最好还能结合源码!

  这次回答要比上边更好一点了。这里chatGPT不仅讲了在es中的操作步骤,而且还讲了一下在lucene中的过程。这一次的答案已经趋向于我想要的答案了。

非常抱歉,我的回答并不够详细和准确。以下是根据Elasticsearch和Lucene官方文档以及源码的详细解释。

在Elasticsearch中,一条JSON数据写入到磁盘的过程可以分为以下几个步骤:

  1. 数据映射:将JSON数据转换成Lucene文档(Document),并根据索引的映射规则(Mapping)将文档字段映射到Lucene字段(Field)中。这个过程是由IndexRequest类和IndexService类实现的。

  2. 索引写入:将文档写入到分片(Shard)的内存缓存中,同时将操作记录到事务日志(Translog)中。这个过程是由IndexShard类和Translog类实现的。

  3. 文档合并:将多个内存缓存中的文档合并成一个文档列表,并对文档列表进行排序和去重。这个过程是由InMemoryMerger类实现的。

  4. 索引合并:将合并后的文档列表写入到磁盘上的索引文件(Index File)中,并更新分片的元数据信息。这个过程是由IndexWriter类和Segment类实现的。

  5. 刷新和提交:将数据写入到索引文件后,需要将数据刷新到内存缓存和磁盘上。在Elasticsearch中,这个过程是通过IndexWriter和IndexShard类的flush方法实现的。当一批数据被写入到Elasticsearch后,它们并不会立即生效,直到进行了提交(Commit)操作。在Elasticsearch中,提交是通过IndexWriter的commit方法实现的,它会将所有未提交的数据刷新到磁盘上,并更新分片的元数据信息。

在Lucene底层实现上,索引写入的过程包括以下步骤:

  1. 文档分析:将文档内容进行分析和处理,生成一组词汇单元(Term)。

  2. 倒排索引写入:将文档的词汇单元写入到倒排索引(Inverted Index)中。倒排索引是一个数据结构,用于记录每个词汇单元出现在哪些文档中,并存储一些额外的统计信息(如出现次数、位置等)。

  3. 磁盘写入:将倒排索引写入到磁盘上的索引文件中。索引文件是一个二进制文件,用于持久化存储倒排索引和其他元数据信息。

  4. 内存管理:对内存缓存中的倒排索引进行管理,包括内存回收、内存合并和内存清理等操作。

  5. 索引合并:将多个磁盘索引文件合并成一个新的索引文件,并进行一些优化操作,如合并多个倒排索引、去重、压缩等。这个过程是由IndexWriter类的merge方法和MergePolicy类实现的。

  6. 索引优化:对索引文件进行优化,如减少文件数量、优化查询性能、减少索引大小等。这个过程是由IndexWriter类的optimize方法和MergePolicy类实现的。

  7. 在Lucene中,还有一些与索引写入相关的细节和优化,如:

    1. 内存缓存管理:Lucene会将一部分倒排索引存储在内存中,以加快索引写入和查询速度。但是,内存缓存的大小是有限制的,一旦缓存满了,就需要将其中的索引数据写入到磁盘上。

    2. 总之,索引写入是Elasticsearch和Lucene的核心功能之一,它涉及到多个组件和细节,包括数据映射、索引写入、索引合并、内存管理、磁盘写入优化等。通过对这些细节和优化进行深入理解,可以帮助我们更好地使用和优化Elasticsearch和Lucene。

    3. 磁盘写入优化:Lucene使用一些技术来优化磁盘写入性能,如缓存写入数据、使用多线程写入等。

    4. 索引压缩:Lucene会对索引文件进行压缩,以减少索引文件的大小,从而提高查询性能。索引压缩是在索引合并和优化过程中完成的。

    5. 数据结构优化:Lucene使用一些高效的数据结构来存储倒排索引和其他元数据信息,如FST、DFA、IntBlockPool等。这些数据结构可以显著提高索引写入和查询的性能。

Q1.5  请再帮我精确地找到源码的位置 es使用7.11.1版本最好

amazing!到这里,我觉得惊呆了,以前看源码的时候,可没有这么轻松。需要看好久才能捋出来这么一个列表。大概根据chatGPT给列出来的源码位置,点开看了看 ,还可以(还没有都点开验证)。 但是其中第四条 chatGPT说 “FielddataIndexFieldData类实现了倒排索引的存储和查询功能” 这个肯定是不对的。这部分肯定是lucene实现的。

  1. 数据映射:数据映射的相关代码位于 org.elasticsearch.index.mapper 包下。

  2. 索引写入:索引写入的相关代码位于 org.elasticsearch.index.engine 包下。其中,IndexWriter类位于 org.elasticsearch.index.engine.Engine 文件中。

  3. 倒排索引:倒排索引的相关代码位于 org.elasticsearch.index.fielddata 包下。其中,FielddataIndexFieldData类实现了倒排索引的存储和查询功能,位于 org.elasticsearch.index.fielddata.IndexFieldData.java 文件中。

  4. 索引合并:索引合并的相关代码位于 org.elasticsearch.index.merge 包下。其中,IndexWriter类的merge方法位于 org.elasticsearch.index.engine.Engine 文件中。

  5. 索引优化:索引优化的相关代码位于 org.elasticsearch.index.engine 包下。其中,IndexWriter类的optimize方法位于 org.elasticsearch.index.engine.Engine 文件中。

其他与索引写入相关的细节和优化的代码位于不同的包和类中,具体位置如下:

  1. 内存缓存管理:内存缓存管理的相关代码位于 org.elasticsearch.index.shard 包下。其中,IndexShard类负责管理内存缓存,位于 org.elasticsearch.index.shard.IndexShard 文件中。

  2. 磁盘写入优化:磁盘写入优化的相关代码位于 org.elasticsearch.index.translog 包下。其中,Translog类实现了磁盘写入的缓存和优化功能,位于 org.elasticsearch.index.translog.Translog.java 文件中。

  3. 索引压缩:索引压缩的相关代码位于 org.elasticsearch.index.codec 包下。其中,Lucene索引压缩的实现位于 org.elasticsearch.index.codec.CodecService 类中,而Elasticsearch自身的索引压缩实现位于 org.elasticsearch.index.codec.PostingsFormat 类中。

  4. 数据结构优化:Lucene使用的高效数据结构的相关代码位于 org.apache.lucene.util 包下,其中FST的实现位于 org.apache.lucene.util.fst 包下,DFA的实现位于 org.apache.lucene.util.automaton 包下,IntBlockPool的实现位于 org.apache.lucene.util.packed 包下。Elasticsearch自身使用的高效数据结构的相关代码位于 org.elasticsearch.common.util 包下。

  5. 索引刷新:索引刷新的相关代码位于 org.elasticsearch.index.engine 包下。其中,IndexWriter类的flush方法位于 org.elasticsearch.index.engine.Engine 文件中。

  6. 索引删除:索引删除的相关代码位于 org.elasticsearch.index.engine 包下。其中,IndexWriter类的delete方法和deleteByQuery方法位于 org.elasticsearch.index.engine.Engine 文件中。

  7. 索引恢复:索引恢复的相关代码位于 org.elasticsearch.index.engine 包下。其中,IndexWriter类的recovery方法位于 org.elasticsearch.index.engine.Engine 文件中。

  8. 索引分片:索引分片的相关代码位于 org.elasticsearch.index.shard 包下。其中,IndexShard类负责管理和操作索引分片,位于 org.elasticsearch.index.shard.IndexShard 文件中。

  9. 数据写入确认:数据写入确认的相关代码位于 org.elasticsearch.index.translog 包下。其中,Translog类实现了数据写入确认的功能,位于 org.elasticsearch.index.translog.Translog.java 文件中。

  10. 索引同步:索引同步的相关代码位于 org.elasticsearch.index.engine 包下。其中,IndexWriter类的sync方法位于 org.elasticsearch.index.engine.Engine 文件中。

  11. 索引缓存:索引缓存的相关代码位于 org.elasticsearch.index.cache 包下。其中,IndexCache类负责管理和操作索引缓存,位于 org.elasticsearch.index.cache.IndexCache.java 文件中。

  12. 索引快照:索引快照的相关代码位于 org.elasticsearch.index.snapshots 包下。其中,IndexShardSnapshot类实现了索引快照的存储和恢复功能,位于 org.elasticsearch.index.snapshots.IndexShardSnapshot.java 文件中。

  13. 索引复制:索引复制的相关代码位于 org.elasticsearch.index.shard 包下。其中,IndexShard类实现了索引复制的功能,位于 org.elasticsearch.index.shard.IndexShard.java 文件中。

  14. 索引压缩:索引压缩的相关代码位于 org.elasticsearch.index.codec 包下。其中,PostingsFormat类和DocValuesFormat类负责控制索引压缩的方式和格式,位于 org.elasticsearch.index.codec 文件夹中。

  15. 索引合并:索引合并的相关代码位于 org.elasticsearch.index.merge 包下。其中,MergePolicy类和MergeScheduler类负责控制索引合并的策略和调度,位于 org.elasticsearch.index.merge 文件夹中。

  16. 索引优化:索引优化的相关代码位于 org.elasticsearch.index.engine 包下。其中,IndexWriter类的forceMerge方法位于 org.elasticsearch.index.engine.Engine 文件中。

  17. 索引自动切分:索引自动切分的相关代码位于 org.elasticsearch.index 包下。其中,IndexService类负责控制索引的自动切分,位于 org.elasticsearch.index.IndexService 文件中。

  18. 索引查询:索引查询的相关代码位于 org.elasticsearch.index.query 包下。其中,Query类和QueryBuilder类负责控制索引查询的方式和格式,位于 org.elasticsearch.index.query 文件夹中。

  19. 索引统计:索引统计的相关代码位于 org.elasticsearch.index.fielddata 包下。其中,FieldDataType类和FieldDataStats类负责控制索引统计的方式和格式,位于 org.elasticsearch.index.fielddata 文件夹中。

  20. 索引分析:索引分析的相关代码位于 org.elasticsearch.index.analysis 包下。其中,Analyzer类和TokenFilter类负责控制索引分析的方式和格式,位于 org.elasticsearch.index.analysis 文件夹中。

  接下来再用一个问题来验证。

Q 1.6  我有个疑问,你确定 FielddataIndexFieldData类实现了倒排索引的存储和查询功能吗

非常抱歉,我在之前的回答中有误,FielddataIndexFieldData 类并没有实现倒排索引的存储和查询功能。

FielddataIndexFieldData 类是 Elasticsearch 中用于在内存中存储分段的字段数据的一个数据结构,通常用于聚合、排序和脚本等功能的计算。它不是存储实际的倒排索引,而是对已经建立好的倒排索引数据进行了提取和封装,方便后续的处理和计算。

实际上,倒排索引是在建立索引时创建的,主要由 Lucene 库实现,而不是 Elasticsearch 本身。Elasticsearch 的索引底层是基于 Lucene 的,它使用了 Lucene 的倒排索引机制来存储和查询数据。Lucene 的倒排索引主要包括 Term、Document 和 Field 等概念,可以通过 IndexReader、IndexWriter、TermQuery、BooleanQuery 等 Lucene 类进行索引的存储和查询操作。

因此,如果您需要深入了解 Elasticsearch 中倒排索引的实现和细节,建议参考 Lucene 相关的文档和资料。

Q1.7 那你检查一下上边说的源码的位置,还有没有错的了

 于是chatGPT又列出和倒排索引相关的源码了。

非常抱歉之前的回答中有误,FielddataIndexFieldData 类并没有实现倒排索引的存储和查询功能。

以下是 Elasticsearch 7.11.1 版本中倒排索引存储和查询的相关源代码位置:

  • 倒排索引存储

在 Elasticsearch 中,倒排索引是在建立索引时创建的,主要由 Lucene 库实现。在 Elasticsearch 的源代码中,建立索引的主要逻辑位于 org.elasticsearch.index.IndexService 类中,具体实现可以参考 org.elasticsearch.index.engine.InternalEngine 类的 IndexWriter 内部类。倒排索引数据存储在磁盘上,位于索引目录下的 segments_N 文件中,其中 N 表示索引分段编号。

  • 倒排索引查询

在 Elasticsearch 中,查询请求通过各种查询语句和过滤器进行构建,这些查询语句和过滤器最终会转换为 Lucene 的 Query 和 Filter 对象,然后通过 org.elasticsearch.index.search.SearchService 类的 search 方法进行查询。在 SearchService 类中,使用 Lucene 的 IndexSearcher 对象对索引进行搜索,具体实现可以参考 org.elasticsearch.index.search.DefaultSearchContext 类和 org.elasticsearch.search.SearchHit 类。

对于搜索结果的排序和分页,Elasticsearch 使用了 Lucene 的 ScoreDoc 和 TopDocs 对象,这些对象包含了查询结果的相关性分数和文档 ID 等信息。在 Elasticsearch 的源代码中,相关性分数的计算和排序逻辑可以参考 org.elasticsearch.search.SearchHits 类的 sortgetAt 方法。分页逻辑可以参考 org.elasticsearch.search.SearchHit 类的 shardid 字段。

在 Elasticsearch 中,查询请求可以分为两种类型:分片查询和全局查询。分片查询是指查询请求只在单个分片上进行查询,并返回查询结果,全局查询是指查询请求在所有分片上进行查询,并返回聚合的查询结果。

对于分片查询,每个分片会使用 Lucene 的 IndexSearcher 对象进行查询,并返回查询结果。在 Elasticsearch 的源代码中,具体实现可以参考 org.elasticsearch.search.query.QueryPhase 类和 org.elasticsearch.search.fetch.subphase.DocIdSearchFetchSubPhase 类。QueryPhase 类是分片查询的主要逻辑实现类,它使用 Lucene 的 QueryParser 和 QueryRewriteChain 等对象对查询语句进行解析和重写,然后使用 Lucene 的 IndexSearcher 对象对分片上的索引进行查询。DocIdSearchFetchSubPhase 类则是对查询结果进行文档 ID 提取和转换的实现类。

对于全局查询,Elasticsearch 会将查询请求发送到所有的分片上,并在所有分片上进行查询。查询结果会通过 org.elasticsearch.action.search.SearchPhaseController 类进行合并和排序,并返回给客户端。具体实现可以参考 org.elasticsearch.action.search.TransportSearchAction 类和 org.elasticsearch.search.fetch.subphase.HighlightPhase 类。TransportSearchAction 类是全局查询的主要逻辑实现类,它负责将查询请求发送到所有分片上,并通过 SearchPhaseController 类进行查询结果的合并和排序。HighlightPhase 类则是对查询结果进行高亮处理的实现类。

总之,倒排索引是 Elasticsearch 和 Lucene 中非常重要的数据结构,它可以大大提高搜索性能和查询效率。在 Elasticsearch 中,倒排索引的存储和查询主要依赖于 Lucene 库的实现,同时也涉及到大量的优化和改进,以满足不同的查询需求和性能要求。

最后chatGPT说,让我去看看源码。并可以参与开发和贡献代码。 不得不说,还是chatGPT懂我。

如果您想了解更多关于 Elasticsearch 的源码位置和细节,请参考以下官方文档和 GitHub 仓库:

  1. Elasticsearch 官方文档:Elasticsearch Guide [8.7] | Elastic

  2. Elasticsearch GitHub 仓库:GitHub - elastic/elasticsearch: Free and Open, Distributed, RESTful Search Engine

在官方文档中,您可以找到详细的 Elasticsearch 使用文档和参考手册,以及各个版本的发行说明和更新日志。

在 GitHub 仓库中,您可以找到 Elasticsearch 的完整源代码,并可以参与开发和贡献代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

让chatGPT当我的老师如何? 通过和chatGPT交互式学习,了解在ES中,一条JSON数据是如何写到磁盘上的 的相关文章

  • Gazebo仿真PX4运行roslaunch PX4 mavros_posix_sitl.launch时报错Required process [sitl-2] has died 解决方法

    报错如图 解决方法为卸载Gazebo9安装Gazebo9 19 参考下文中4 4部分 xff0c 问题类似但解决方法相同 xff1a https blog csdn net qq 38768959 article details 10604
  • PTA第十五周

    6 4 指定位置输出字符串 20分 本题要求实现一个函数 xff0c 对给定的一个字符串和两个字符 xff0c 打印出给定字符串中从与第一个字符匹配的位置开始到与第二个字符匹配的位置之间的所有字符 函数接口定义 xff1a char mat
  • 6-27复习

    1 while语句的一般形式如下 xff0c 其中的循环体语句只能是一条语句 while 表达式 循环体语句 答案 xff1a T 解析 xff1a for 循环和while 循环循环体都是一条语句 xff0c 但是可以加 变成复合语句 x
  • 如何在Ubtun上安装vscode,保姆级教程

    Ubtun安装vscode 打开vm虚拟机安装VM tools 主要目的 xff1a 实现win上的文件与vm虚拟机上的文件进行共享 具体过程 参照B站 Ubuntu安装vmware tools和open vm tools Ubuntu安装
  • python matplotlib生成图表基础

    本节的目标是绘制一个y 61 x 2的函数图像 plot图表 绘制图表 plot xff08 xff09 函数绘制图表 xff0c 传入参数 xff0c 输入值和输出值 xff0c 还可以指定其他参数 plt span class toke
  • Cannot make a static reference to the non-static method XXX() from the type XXX

    不能用调用静态方法的方式调用一个非静态的方法 xff1a 我在定义方法的时候不是static的 出现这个报错是因为java调用任何方法都要实例化 xff0c c 43 43 里有函数的概念 xff0c 但是java里的函数实际上是类的方法
  • 【2022_10_17】PX4学习

    commander cpp内 int Commander custom command int argc char argv 221行 该函数接受所有commander输入的参数 xff0c strcmp比较后调用不同的函数 strcmp返
  • how to solveE:Unmet dependencies.Try‘apt --fix ^^^^^

    span class token function sudo span span class token function apt span span class token function install span span class
  • PX4报错FAILED: external/Stamp/sitl_gazebo/sitl_gazebo-configure解决

    PX4仿真gazebo报错 make px4 sitl default gazebo Configuring incomplete errors occurred span class token operator span See als
  • 汉诺塔问题的解法

    问题描述 相传在古印度圣庙中 xff0c 有一种被称为汉诺塔 Hanoi 的游戏 该游戏是在一块铜板装置上 xff0c 有三根杆 编号A B C xff0c 在A杆自下而上 由大到小按顺序放置64个金盘 如下图 游戏的目标 xff1a 把A
  • 51单片机——串口通信(发送和接受数据)

    目录 一 实现的功能 二 串口通信 2 1单片机发送数据 2 1 1串口初始化 2 1 2串口发送程序 2 1 3发送效果 2 2单片机接收数据 2 2 1串口初始化 2 2 2接收数据程序 2 2 3接收效果 一 实现的功能 通过串口 x
  • 无人机仿真SLAM_gazebo&promethues

    无人机仿真 总体概述系统要求 PX4固件简介无人机固件整体框图无人机软件框图无人机硬件模型 Mavlink模块位置估计与姿态估计模块安装与编译二次开发 机载计算机程序控制模块估计模块仿真模块SLAM模块SLAM效果演示 总体概述 无人机仿真
  • 编译orbslam2时,Pangolin could not be found because dependency Eigen3 could not be found,解决方法

    是因为使用了pangolin0 6版本 xff0c 需要重新安装0 5版本的pangolin 1 在pangolin的build文件夹下 sudo make uninstall 2 usr local include 删除pangolin文
  • CMakeLists.txt常用语法

    0 绪 cmake 是一个跨平台 开源的构建系统 它是一个集软件构建 测试 打包于一身的软件 它使用与平台和编译器独立的配置文件来对软件编译过程进行控制 1 常用命令 1 1制定cmake最小版本 cmake minimum require
  • Vue 模板

    原文 在Vue中 xff0c Vue模板对应的就是Vue中的View xff08 视图 xff09 部分 xff0c 也是Vue重中之一 xff0c 而在Vue中要了解Vue模板我们就需要从两个方面来着手 xff0c 其一是Vue的模板语法
  • Ubuntu:系统分区

    在系统分区之前 先进行磁盘分区 这里针对的是window10系统下安装ubuntu双系统 需要在window10下进行磁盘分区来安装ubuntu系统 一 磁盘分区 win10系统下 右击此电脑 xff0c 点击管理就进入磁盘管理 这时候可以
  • Mac 安装node.js

    Mac系统安装Node js xff0c 下载地址 如上图安装路径 xff1a This package will install Node js v16 19 1 to usr local bin node span class toke
  • MySQL 常用函数(二)

    ABS函数 xff1a 求绝对值 绝对值函数 ABS x 返回 x 的绝对值 正数的绝对值是其本身 xff0c 负数的绝对值为其相反数 xff0c 0 的绝对值是 0 span class token keyword SELECT span
  • MyBatis Mapper常用动态SQL之foreach 、if、choose、where、when

    if语句 lt if gt 判断语句 xff0c 用于单条件分支条件判断 使用 lt if gt 元素对参数username和jobs进行非空判断 xff0c 并动态组装SQL xff1a span class token keyword
  • Java 查看官方Java API文档

    话不多说 xff0c 直接上方法 打开官网址 xff1a http www oracle com technetwork cn java javase downloads index html 方式一 在线浏览 点击Java 文档 xff1

随机推荐

  • iOS-微信分享成功回调问题

    本人用ShareSDK做分享和第三方登录 xff0c 登录先不讲 xff0c 本节只做分享成功或失败后回调问题 相信好多人会有这个疑惑就是在微信分享成功后没有成功后的方法回调 xff0c 我在ShareSDK论坛也发表过帖子问过 xff0c
  • iOS-常见三种加密(MD5、非对称加密,对称加密)

    任何应用的开发中安全都是重中之重 xff0c 在信息交互异常活跃的现在 xff0c 信息加密技术显得尤为重要 在app应用开发中 xff0c 我们需要对应用中的多项数据进行加密处理 xff0c 从而来保证应用上线后的安全性 xff0c 给用
  • iOS-开辟子线程(NSThread、NSOperationQueue、GCD)

    本节主要总结一些开辟子线程的常用的几种方法 一 通过NSThread类开辟子线程 1 NSThread手动开启子线程 span class hljs comment 创建线程对象 span span class hljs built in
  • Mac 安装 IntelliJ IDEA 以及激活方法

    之前一直在苹果移动端开发 xff0c 这里想了解下Java后台的开发 xff0c 以至于更好的配合后台工作 xff0c 下面说下破解版的安装过程 xff08 Mac xff09 第一步 xff1a 下载Java开发工具 这里我们选择比较好的
  • Mac IntelliJ IDEA连接和操作MySQL数据库

    想要IntelliJ IDEA后台开发 xff0c 数据库的连接时必不可少的 xff0c 这里我们选择开源的 xff0c 同时也是使用人数比较多的一种数据库MySQL 第一步 xff1a MySQL的下载安装 到MySQL官网下载 xff0
  • GStreamer-CRITICAL **: gst_element_make_from_uri: assertion `gst_uri_is_valid (uri)' failed

    在Qt中 xff0c 使用phonon播放视频的时候 xff0c 出现了GStreamer CRITICAL gst element make from uri assertion 96 gst uri is valid uri 39 fa
  • IDEA导入JDBC驱动的jar包

    JDBC的全称是Java Database Connectivity xff0c 意思就是Java数据库链接 xff0c 是一套面向对象的应用程序接口 xff0c 指定了统一的访问各种类型数据库的标准接口 JDBC是一种底层的API xff
  • IDEA-自带Database中table进行增删改查和筛选数据

    显式的数据库有人喜欢用Navicat Premium xff0c 在里面对数据进行各种筛选和增删改查操作 xff0c 用起来很方便 这里我们说下IDEA内部自带的显式的数据库 这里我已经建好数据库和表 xff0c 表内数据我也添加了若干条
  • Flutter - Android Studio开发Flutter以及iOS真机测试

    上一节已经配置好了iOS和安卓的环境 xff0c 下面我们用Android Studio开发Flutter xff0c 当然你也可以用VSCode和ItelliJ IDEA来开发 还没配置的同学请看上一片文章 一 创建项目 接着上一节操作
  • Oracle 中ORA-28000: the account is locked解决办法

    在没有navicat xff0c 只有cmd应用程序的条件下 xff0c 在密码输入多次都出现 the account is locked用户账号被锁的问题 xff0c 请看这里 xff1a 首先 xff0c 出现ORA 28000 the
  • Linux 虚拟机设置共享文件夹不显示问题解决办法

    安装完VMware Tools后 xff0c 不要点重新启动客户机 xff0c 需要先关闭客户机 xff0c 然后再启动客户机就可以看到共享的文件
  • ROS话题通信c++和python实现

    机器人是一种高度复杂的系统性实现 xff0c 在机器人上可能集成各种传感器 雷达 摄像头 GPS 以及运动控制实现 xff0c 为了解耦合 xff0c 在ROS中每一个功能点都是一个单独的进程 xff0c 每一个进程都是独立运行的 更确切的
  • Go微服务架构实战-中篇 1. k8s架构介绍

    Go微服务架构实战 公粽号 xff1a 堆栈future 本系列文章主要是针对云原生领域微服务架构的实战 xff0c 包括网关 xff0c k8s xff0c etcd以及grpc等相关技术的应用 xff0c 同时也会把服务发现与注册 xf
  • ubuntu系统备份还原(迁移)到另外一台电脑上

    ubuntu系统备份还原 迁移 到另外一台电脑上 主要参考如下博客 xff1a https blog csdn net zeg635702733 article details 53992224 https blog csdn net qq
  • 选择嵌入式行业还是互联网行业

    本人大学的时候读的是电子信息科学与技术 xff0c 从小就特别喜欢电子产品 xff0c 经常把家里的电器这些拆来玩 xff0c 录音机 复读机都拆过 xff0c 对它们有一种莫名的喜欢 在高考那年 xff0c 填志愿的时候 xff0c 有考
  • 【直达本质】超快 STM32 系统入门指南

    计算机类的教程多 xff0c 框架和 API 用法讲的全面 xff0c 成系统的教程很多 xff0c CSDN上 知乎上很多个人学习记录和全面的成书的教程 xff0c 而且生动形象有甚至有动画讲解 xff0c 回过头来看嵌入式的教程 xff
  • ubuntu20.04上安装ros及控制小乌龟移动

    目录 一 安装过程二 运行ROS1 2 rqt graph 显示系统计算图 3 rosnode 显示所有节点相关信息 4 使小乌龟做圆周运动rostopic话题控制c语言控制 三 总结 一 安装过程 参考这篇古月居的博客 xff08 非常详
  • ros+opencv的一些安装经验

    记录一些乱七八糟的过程 1 安装ROS时候一般会默认安装opencv3 3 1 xff0c 可以在 opt ros melodic include下看到opencv3 3 1的文件夹 我安装ros后又安装了opencv3 4 2 xff0c
  • 一份工作一年半的java开发个人简历,欢迎拍砖

    一份个人简历 xff0c 大四提前一年出来实习 xff0c 在12306 2020年毕业 xff0c 开始第二份正式工作 从大学毕业 xff0c 只是我学习之路的刚刚开始 简历所写的内容都是真实的 xff0c 一点水分没有 欢迎拍砖 xff
  • 让chatGPT当我的老师如何? 通过和chatGPT交互式学习,了解在ES中,一条JSON数据是如何写到磁盘上的

    最近一直有一个问题 xff0c 如鲠在喉 争取早一天解决 xff0c 早一天踏踏实实的睡觉 问题是 xff1a 在ES中 xff0c 一条JSON数据是如何写入到磁盘上的 xff1f 如何解决这个问题 xff1f 我想到了chatGPT x