自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(153)
  • 问答 (5)
  • 收藏
  • 关注

原创 HMM地图匹配算法库Barefoot环境搭建

1.引入gps路径匹配开源项目barefoot克隆仓库git clone https://github.com/bmwcarit/barefoot.git打开项目执行mvn命令将项目打包到maven仓库mvn package在自己的maven项目中引入barefoot依赖 <dependency> <groupId>com.bmw-carit</groupId> <artifactId&g

2024-06-03 11:53:56 971 1

原创 在Arcgis中删除过滤Openstreetmap道路属性表中指定highway类型道路

打开图层的属性表,1.按属性选择,2.输入要删除数据的查询筛选条件,3.点击应用,4.最后点击删除所选项。:开始编辑后鼠标就一定不要点到地图上去了,以免造成地图的误编辑。点击左上角编辑器→开始编辑,选择要编辑的图层。用Excel打开输出表,包含的道路类型如下。选中highway属性列,选择汇总→确定。最后点击编辑器的停止编辑,保存编辑内容。''空值(无定义道路)

2024-02-27 19:53:34 934

原创 idea中debug Go程序报错error layer=debugger could not patch runtime.mallogc

## 一、问题场景在idea中配置了Go编程环境,可以运行Go程序,但是无法debug,报错error layer=debugger could not patch runtime.mallogc: no type entry found, use 'types' for a list of valid types## 二、解决方案这是由于idea中使用的dlv.exe版本太老导致,直接在终端中执行如下命令安装最新版dlv.exe```bashgo install github.com/go-d

2024-01-23 22:21:07 2008

原创 yarn集群HDFS datanode无法启动问题排查

要重新格式化,首先停止所有 HDFS 服务,然后在 NameNode 上运行 hdfs namenode -format,接着手动清除所有 DataNode 上的数据目录,最后重新启动整个集群。clusterID 是在 HDFS 集群的第一次格式化时生成的唯一标识符,用于确保 NameNode 和所有的 DataNode 属于同一个 HDFS 集群。:将无法启动的datanode节点的clusterID手动改为与namenode一致,然后再重启datanode。先看下启动的日志有无报错。

2024-01-22 18:02:56 976

原创 Java快速转Go入门案例

Golang语言在2009年诞生于谷歌,相较而言是一门年轻的语言。面对C++等老牌语言众多繁重的特性,几名谷歌员工希望能够甩开历史包袱设计一门更加简洁的编程语言,避免过度的设计,通过较少的特性组合连接就可实现复杂的功能。体现“**少即是多**”设计哲学。二、Go的核心特性- **跨平台**:Go的标准库提供了一系列与操作系统无关的接口和实现,并且Go的编译器本身就具备支持多种操作系统和硬件架构的能力,通过静态链接的方式可直接将程序编译为对应平台的机器码,故Go可以实现跨平台即“一次编写,到处运行”。此外G

2024-01-21 21:33:26 1331

原创 Git如何将多个commit合并一个commit

问题场景:我在fork的仓库提交多个commit后,准备向原仓库提交pr,但是原仓库要求一个pr一个commit,因此需要先将这些commit合并为一个。#### 1.先拿到要合并的commit中最早的一个的commit id,然后进入仓库,使用如下git log命令拿到这个commit的前一个commit的id(打印出的第二个,如下图)```bashgit log --pretty=format:"%H %P" -n 1 ```

2024-01-05 19:05:22 1478

原创 Linux中安装了openjdk后jps command not found

### 一、问题场景在Linux中用yum安装了openjdk-17,也在.bashrc中配置了环境变量JAVA_HOME以及bin目录的PATH。但是在运行jps命令时依然报错找不到命令。### 二、原因分析进入到$JAVA_HOME/bin目录查看,发现只有寥寥几个命令,压根没有jps命令,这是什么情况呢?再次确认安装的jdk版本,并使用yum info命令查看软件包的详细信息。发现安装的软件包并不是jdk,而是jre,jre只是Java运行时环境,是不包含jps命令工具的,jps是jdk(Jav

2023-12-27 19:15:26 1424

原创 MySQL主从架构

主库的更新是并发进行的,而从库是单线程读取binlog日志,并且通过SQL线程单线程更新从库,所以在采用非同步策略,当主库同一时刻有大量更新操作时,从库的更新速率可能就跟不上,并且从库的更新还可能和读请求竞争锁。这就产生了主从延迟的问题。主节点负责写,然后将数据更新通过binlog日志同步到从节点。看是网络IO慢还是SQL线程处理慢,一般都是SQL线程处理慢。

2023-10-14 17:06:27 9

原创 操作系统:虚拟内存

我们就可以利用这一特性,把最常访问的几个页表项存储到访问速度更快的硬件,于是计算机科学家们,就在 CPU 芯片中,加入了一个专门存放程序最常访问的页表项的 Cache,这个 Cache 就是 TLB(Translation Lookaside Buffer) ,通常称为页表缓存、转址旁路缓存、快表等。多级页表虽然解决了空间上的问题,但是虚拟地址到物理地址的转换就多了几道转换的工序,这显然就降低了这俩地址转换的速度,也就是带来了时间上的开销。,每一片称为页,在 Linux 下,每一页的大小为 4KB。

2023-10-13 23:02:51 11

原创 Java中的函数式编程

从宏观的角度说,面向对象编程思想是抽象出一个个对象,使用这些对象互相协作来达成目的。而函数式编程是定义一种处理规则,就像数学里面定义的函数,我接收一个输入,并针对相同的输入产生一个固定的输出。函数式编程就是使用这些独立的函数来组合达成目的。从具体的角度说,函数式编程中可以将一个函数像变量一样定义或传递,可以在方法中接收一个函数作为参数,或者说接收一种处理规则,然后在方法中就可以使用这个函数来接收输入并产生输出。

2023-08-27 12:18:22 297

转载 Dubbo与微服务架构简介

微服务架构就是将所有服务模块都拆分出来单独开发部署,模块之间通过RPC通信优势1. 可针对模块的热度精准弹性扩容或缩容,扩展性好。2. 拆分模块使得模块之间耦合度降低,不会因为一个模块出问题导致整个应用都无法使用。3. 维护成本低,在发布某个模块时只需要发布这个模块就行了,不需要发布整个应用系统。4. 开发技术栈更灵活,不同的模块可以采用不同的编程语言实现,由RPC框架进行服务桥接。微服务代表框架:Spring Cloud,DNS(Dubbo、Nacos、Sentinel)微服务架构框架

2023-08-26 21:10:58 219

原创 分布式事务与解决方案

## 一、什么是分布式事务首先我们知道本地事务是指事务方法中的操作只依赖本地数据库,可保证事务的ACID特性。而在分布式系统中,一个应用系统被拆分为多个可独立部署的微服务,在一个微服务的事务方法中,除了依赖本地数据库外,还可能会调用一个或多个远程服务操作远程数据库,这种就叫做分布式事务。在分布式事务中,如果由于网络波动导致远程调用执行成功了,但是没有及时返回结果,导致事务回滚,本地数据库回滚了,但是远程数据库已经执行成功持久化了,这就出现了不一致的情况。## 二、Base理论在CAP理论中的一致

2023-08-17 22:36:13 403

原创 Spring中什么是Bean及其生命周期

SpringBoot中是通过三级缓存来解决循环依赖的,这三级缓存都是一个Map:1. 一级缓存singletonobjects:就是前面的单例池map,用于存储已经创建完成的Bean对象。2. 二级缓存earlySingletonObjects:用于缓存提前创建的Bean对象。3. 三级缓存singletonFactories:用于缓存提前创建Bean对象的lambda表达式。解决循环依赖的步骤:- 比如说在创建A类的Bean对象前,会将其放到一个**creatingSet**中,表示这个类的B

2023-08-16 20:35:18 209

原创 解决“先commit再pull”造成的git冲突

## 一、问题场景在分支上修改了代码然后commit(没有push),此时再git pull,拉下了别人的修改,但是报错无法merge## 二、解决步骤1.在idea下方工具栏选择git -> log,可以看到版本变化链表,右键选中自己commit提交之前的版本,然后点reset到这里

2023-08-11 22:25:46 2863

原创 JVM笔记 —— 出现内存溢出错误时时如何排查

内存溢出错误分为StackOverflowError和OutOfMemoryError,前者是栈中出现溢出,后者一般是堆或方法区出现溢出,简称OOM### 1. 栈溢出 StackOverflowError栈溢出一般都是因为没有正确的结束递归导致的,无限递归导致超出栈内存(-Xss)限制时就会抛出StackOverflowError。这种情况直接根据异常信息定位到代码位置进行修正即可。2. 方法区溢出 OOM当方法区中加载的类过多,比如通过**动态代理生成很多代理类**或者**热部署时热加载了过多的

2023-08-10 17:02:04 1436

原创 遍历集合List的五种方法以及如何在遍历集合过程中安全移除元素

如何在遍历集合过程中安全移除元素 如果在使用 Iterator 或 ListIterator 遍历集合的过程中,使用了list.remove() 方法来移除元素,而没有通过迭代器自身的 remove() 方法,就有可能导致 **ConcurrentModificationException**。这是因为list内部维护了一个修改计数器modCount, 记录list中添加和删除元素的次数,迭代器对象内部会维护一个迭代器修改计数器expectedModCount,如果被非迭代器方法修改了list,导致mod

2023-08-09 21:30:52 2682

原创 List和数组互转方法以及踩坑点

Arrays.asList()返回的是一个Arrays中的内部类ArrayList对象(不是我们平时使用的那个),这个list没有重写实现添加和删除方法,其大小是固定不变的,当调用它的add和remove方法时,会默认抛出UnsupportedOperationException异常。toArray()方法返回的是Object数组,可使用list.toArray(T[] a)传入一个指定类型的数组,获得的结果数据即为指定类型的数组。ArrayList中toArray(T[] a)方法的源码如下,

2023-08-09 19:49:31 1115

转载 Spring中AOP原理与使用案例

AOP (Aspect Oriented Programming) ,意为: 面向切面编程,可以通过预编译方式或运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP的编程思想就是把很多类对象中的横切问题点,从业务逻辑中分离出来,从而达到解耦的目的增加代码的重用性,提高开发效率。SpringBoot项目导入spring-boot-starter-aop依赖编写切面类类上加@Aspect注解,表明这是一个切面类。

2023-08-07 18:12:21 99

原创 幂等性问题 —— 如何防止重复创建订单

幂等性:对接口多余重复调用的结果和单次调用的结果一致。## 二、幂等性实现方案**核心思想**:首先要根据业务判断什么是重复相同的请求,然后相同的请求都携带或生成一个唯一的识别码,这样在服务端就可以进行判别处理### 1. 基于token机制实现在允许一次独立的接口调用前先向服务端请求生成一个唯一token并存放在redis,当发起接口请求调用时携带上这个token,服务端进行校验,请求成功就删除这个token,后续的重复请求就无效了。例如在防止订单重复提交时,除了在前端设置请求加载蒙版

2023-08-03 20:40:25 348

原创 二分查找的几类问题

二分查找的本质为维护[0, low)和(high, length-1]两个不同性质的区间作为循环不变量,通过循环检查剩余未定部分[low, high]的mid来拓展区间边界,当两个区间相遇时,则数组被划分为了两个不同性质的部分。>这种在循环过程中动态维护多个区间的边界的思想在数组相关算法题中比较常见,例如快排中的基于基准元素将数据划分为左右两部分,[颜色分类](https://leetcode.cn/problems/sort-colors)等

2023-07-21 20:07:11 218

原创 Java String类详解

## 一、如何理解String的不可变性### 1. 为什么String不可变- String字符串内部是由一个被private final修饰的字符数组实现的(java 9改成byte[] value实现了,但这不影响不可变性)- 且String内部没有对外暴露的修改这个数组内部元素的api- 并且String也被final修饰,这个字符数组不会被子类“遮蔽”故String对象中字符数组是无法通过常规手段修改的(反射除外),因此我们说String字符串是不可变的。>通过反射中的getDecl

2023-07-18 15:31:57 269

转载 MySQL学习笔记 —— 锁篇

## 一、全局锁执行全局锁后,**整个数据库**就处于只读状态了。通常用于全库逻辑备份,这样在备份数据库期间,不会因为数据或表结构的更新,而出现备份文件的数据与预期的不一样。如果数据库的引擎支持的事务支持可重复读的隔离级别,那么**在备份数据库之前先开启事务,会先创建 Read View,然后整个事务执行期间都在用这个 Read View**,而且由于 MVCC 的支持,备份期间业务依然可以对数据进行更新操作。因为在可重复读的隔离级别下,即使其他事务更新了表的数据,也不会影响备份数据库时的 Read

2023-07-17 19:02:40 223

原创 MySQL学习笔记 —— 事务篇

事务是对数据库独立的一组操作,操作中可能涉及到对数据库的多次读写,一个事务中的操作要么全部执行成功,要么都不执行## 一、事务的四个特性### 1. 原子性一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。### 2. 一致性是指事务操作前和操作后,数据满足完整性约束,数据库保持一致性状态。### 3. 隔离性数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致,因为多个事务同时使用相同的数据时,不会相

2023-07-17 19:01:55 284

原创 Java并发编程(11) —— CountDownLatch原理详解

在日常开发中经常会遇到需要在主线程中开启多个线程去并行执行任务,并且主线程需要等待所有子线程执行完毕后再进行汇总的场景。在 CountDownLatch 出现之前一般都使用线程的join()方法来实现这一点,但是 join 方法不够灵活,不能够满足不同场景的需要,所以JDK开发组提供了 CountDownLatch 这个类,使用CountDownLatch 会更优雅。并且CountDownLatch 可以在子线程的任何位置让 await 方法返回而不一定必须线程结束,这比join更加灵活。

2023-07-15 17:26:46 583

原创 Java并发编程(10) —— ReentrantLock类详解

一、ReentrantLock介绍ReentrantLock是juc.locks包中的一个独占式可重入锁,相比synchronized,它可以创建多个条件等待队列,还支持公平/非公平锁、可中断、超时、轮询等特性。ReentrantLock实现Lock接口实现了一个锁所需的方法,如lock()、unLock()等,在这些方法中实际上是调用继承了AQS的同步器Sync对象中的方法来实现对锁资源的获取与释放,而内部类Sync有两个子类FairSync和NonfairSync,分别对应公平锁和非公平锁。Ree

2023-07-15 15:05:10 833

原创 TCP和UDP的区别

连接:TCP 是面向连接的传输层协议,传输数据前先要建立连接;UDP 是不需要连接,即刻传输数据。首部开销:TCP 首部长度较长,首部在没有使用「选项」字段时是 20 个字节,如果使用了「选项」字段则会变长的;UDP 首部只有 8 个字节,并且是固定不变的,开销较小。传输方式:TCP是基于字节流传输数据的,消息之间没有边界,若数据过大在TCP层面就会进行按MSS大小进行分片,一片数据组成一个TCP报文;UDP按包进行传输,不会对数据分片,这就是说应用层一次交给UDP多长的数据,UDP就将其组成一个UDP

2023-07-14 21:02:01 1017

转载 TCP的数据传输机制:重传机制、滑动窗口、流量控制、拥堵控制

通过三次握手建立TCP连接后,双方就可以开始正式通信了,为了保证通信的高效可靠,TCP做了许多复杂的控制,如下## 一、重传机制网络情况错综复杂可能会出现丢包的情况,TCP会对丢失的数据进行重传,其重传机制有如下四种### 1. 超时重传超时重传是指发送数据后设置一个时间,超过这个时间没有收到ACK应答就重传(无论是发送的数据包丢失还是ACK应答丢失)。超时时间RTO应该设置为略大于一个RTT(Round-Trip Time 往返时延),由于网络波动RTO也应是一个动态变化的值### 2.

2023-07-14 19:09:57 4219

原创 TCP三次握手、数据传输与四次挥手

一、建立TCP连接 —— 三次握手(1)客户端向服务端发送一个携带客户端随机初始序列号x的SYN报文,进入SYN-send状态。(2)服务端收到后将其加入到半连接队列,进入SYN-rcvd状态。然后向客户端回复携带服务端初始序列号y的SYN+ACK报文,这里的ack确认应答号就是x+1。(3)客户端收到后再向服务端发送一个确认应答号为y+1的ACK包,服务端收到后确认建立连接,放入到全连接队列,此时双方都进入了Established状态,表示连接已建立成功,可以进行数据交互了。

2023-07-13 19:00:34 723

原创 Java中抽象类与接口的区别

**相同点**:1. 都不能实例化2. 都可以定义抽象方法3. 都可以定义成员方法,接口中成员方法要用default修饰4. 都可以定义静态方法,但接口中的静态方法只能通过接口访问,无法通过实现类访问**不同点**:1. 抽象类只能继承自一个抽象类,接口可以extends多个接口2. 抽象类中可以定义构造/静态代码块,接口中不能3. 抽象类中可以定义普通成员变量;接口中定义的变量是默认用public static final修饰的(无论有没有显示指定),且必须初始化4. 抽象类中的变量和

2023-07-03 18:09:47 149

原创 Java IO流知识总结

IO 操作是很消耗性能的,如果一个字节一个字节的读取效率很低,缓冲字节流BufferedInputStream将数据加载至缓冲区,一次性可读取多个字节到一个数组中,从而避免频繁的 IO 操作,提高流的传输效率。:与缓存字节流稍有不同的是,缓冲字符流的读写方法通过synchronized锁方法内的代码块,锁对象为构造传入的Reader/Writer对象。:并且缓冲字节流的读/写方法通过synchronized关键字对方法加锁,保证了使用同一个缓冲字节流对象并发读/写时的线程安全。

2023-07-03 18:07:51 145

原创 Java反射详解

类加载时会根据class文件(其中包括字段表、方法表、属性表和常量池等信息)生成一个InstanceKlass对象(C++)存放在方法区,并在堆中生成一个唯一代表这个类的java.lang.Class对象,它们互相持有对方的引用。在程序代码中获取一个类的Class对象后,通过这个Class对象中的反射相关方法就可以获取到类的运行时结构体InstanceKlass中的信息,即可以获取一个类中的全部信息,并且可以调用类的实例中的属性和方法。

2023-07-02 16:43:25 938

原创 Linux端口请求转发设置

目标:将对本机某个端口的请求转发到另一台服务器的端口### sshssh默认转发tcp请求```bash# 绑定所有ip 监听本地9870端口,转发到远程172.169.8.178服务器9870端口ssh -fCNL *:9870:172.169.8.178:9870 root@172.169.8.178```用netstat查看,可以看到已开启对9870端口的监听

2023-05-22 20:08:35 326

原创 yarn无法连接ResourceManager问题解析

发现服务监听的ip为回环地址127.0.1.1,也就是只有本机能够访问,导致了其它节点无法访问ResourceManager。1.登录到ResourceManager所在的节点,首先用jps命令检查ResourceManager是否已启动。因此resourcemanager的ip通过hosts直接被解析为了127.0.1.1,最终导致了此问题。3.检查ResourceManager服务端口8032是否正常监听。将/etc/hosts中这条映射注释掉,重启yarn即可。2.检查系统防火墙是否已关闭。

2023-05-22 14:44:28 1267

原创 Linux将新硬盘挂载到指定目录

MBR分区最大2T,超过2T需用parted工具进行GPT分区。

2023-05-19 18:37:11 4808

原创 List按指定规则排序的四种方法

使用Collections.sort(list)可对一个List对象进行升序排序,但如果要按某种指定规则进行排序,可使用如下四种方法:### 1. 使用list.sort(comparator)方法List的sort()方法中可以传入一个自定义Comparator比较器。实现Comparator接口,**重写compare方法**来定义排序规则。- 如果compare()方法返回负整数,表示obj1小于obj2;- 如果compare()方法返回零,表示obj1等于obj2;- 如果compare

2023-05-15 18:50:31 8397

原创 MySQL面试题 —— 索引篇

一、索引的分类1. 按数据结构:B+tree索引、Hash索引、Full-text索引2. 按物理存储:聚簇索引(主键索引)、辅助索引(二级索引)3. 按字段特性:主键索引、唯一索引、普通索引、前缀索引4. 按字段个数:单列索引、联合索引二、优化索引的方法1. 前缀索引2. 覆盖索引3. 主键索引最好是自增的4. 索引列最好设置为 NOT NULL三、索引失效的六种情况1. 当我们使用左或者左右模糊匹配的时候,也就是 like %xx 或者 like %xx%这两种方式都会造成索引失效

2023-05-09 21:25:39 1395

原创 Redis十大面试题总结

1. 常见的五种 Redis 数据类型2. Redis是单线程还是多线程(1)为什么单线程这么快(2)Redis 6.0 之前为什么网络IO使用单线程?(3)Redis 6.0 之后为什么为网络IO引入了多线程?3. Redis数据如何进行持久化(1)AOF日志(2)RDB 快照(3)混合持久化4. Redis 如何实现服务高可用?(1)主从复制(2)哨兵模式(3)切片集群模式5. 集群脑裂导致数据丢失怎么办?6. Redis 使用的过期删除策略是什么?7.Redis 内存淘汰

2023-05-08 20:30:51 246

原创 Tomcat整体架构解析

Tomcat是一个开源的轻量级web应用服务器。Tomcat中最顶层的容器是Server,即代表一个Tomcat服务器,一个Server中可以有多个Service,对外提供不同的web服务。Service是对Connector和Container的封装,一个Service中有一个或多个连接器,和一个Container容器。连接器Connector负责监听端口接收请求并按照设定的协议进行解析数据,将解析后的请求交给容器处理。

2023-05-02 21:21:38 2366

原创 Java集合 —— HashMap原理解析

一、HashMap是什么HashMap是一个存储key-value键值对的哈希表,表中每个元素的key都是唯一的(通过equals方法判断),查询时通过key的hashcode值即可定位到元素的存储地址,因此HashMap在理想情况下查询时间复杂度为O(1)。1. 存储下标计算方法HashMap底层通过Entry数组来存储元素,插入元素和查询元素时首先需要计算元素在数组中的存储下标,方法如下:1. 通过key的hashCode()方法获取其hashcode值2. 将这个hashcode值再通过h

2023-04-28 17:10:13 4237

原创 LinkedHashMap顺序迭代原理与LRU算法实现

LinkedHashMap可保证通过keySet()、entrySet()、forEach()等方法获取的元素具有顺序性,顺序分为两种:- 添加顺序:获取元素的顺序与其被添加的顺序一致。- 访问顺序:按元素被访问的时间进行排序,越近被访问的排在越后面,put和get等方法都表示访问。在LinkedHashMap通过成员变量accessOrder来决定按哪种顺序排序,默认为false添加顺序,只有通过下面这个构造方法在创建LinkedHashMap时将accessOrder设置为true,才表示访问顺

2023-04-28 16:44:49 1344

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除