自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(105)
  • 资源 (1)
  • 收藏
  • 关注

原创 C++ in _int_malloc () from /lib64/libc.so.6 问题记录

c++ Segment Fault 排查

2022-07-08 17:37:32 1448 2

原创 红黑树面试梳理

知识永远是常用常新,想要彻底理解,最好的方法还是记录下来,这里总结下红黑树的相关知识。复习按照《算法》中的内容,可以将二叉搜索树、红黑树和散列表归纳到符号表中,他们都是实现快速查找的数据结构。这里先给出各数据结构相关操作的复杂度数据结构插入删除查找hashtableO(1)O(1)O(1)red-black treeO(logn)O(logn)O(logn)BSTO(logn)O(logn)O(logn)二叉搜索树二叉搜索树要求,在树中的

2022-05-16 21:16:35 260

原创 算法与数据结构——二分模版

二分搜索可以说是每一位程序员必须掌握的方法,但是二分算法有很多变种,这里做个总结。标准的二分查找二分查找左边界二分查找右边界二分查找左右边界二分查找极值点标准的二分查找模版适用情况:已排序,不含重复元素的数组搜索class BinarySearch { public int search(int[] nums, int target) { int left = 0; int right = nums.length - 1; while

2022-05-07 22:37:17 365

原创 异常控制流

现代操作系统必须能够对系统状态的变化做出反应,这些系统状态不是被内部程序变量捕获的,而且也不一定要和程序的执行相关。比如,一个硬件定时器定期产生信号,这个事件必须得到处理。包到达网络适配器后,必须存放在内存中。程序向磁盘请求数据,然后休眠,直到被通知说数据已就绪。当子进程终止时,创造这些子进程的父进程必须得到通知。现代系统通过使控制流发生突变来对这些情况做出反应。一般而言,我们把这些突变称为异常控制流(Exceptional Control Flow,ECF)。异常控制流发生在计算机系统的各个层次。

2022-04-27 15:21:02 275

转载 ubuntu使用docker安装微信

作者:Misaki_Taro链接:https://www.jianshu.com/p/2a603db77195来源:简书1.概述通过安装docker,结合docker GUI在docker上添加wechat容器来实现运行wechat1.1使用的系统Linux Mint1.2总体步骤安装dockerdocker换源pull 微信镜像创建运行脚本以后如何打开&关闭2.详细步骤2.1安装Docker建议直接使用docker官网的安装方法2.2pull 微信镜像拉取微信镜像

2022-04-26 10:50:52 670

原创 修改B站分p视频标题

在B站上看系列教学视频时有时会遇到分p标题过长影响自己定位视频的问题,这个时候可以用一点前端的小技巧来解决。步骤1 打开浏览器控制台2 在 console 中输入代码 $('.part').each((i,v) => v.innerText = v.innerText.slice(18))上述代码的作用为将分p标题删去前面一部分。其中 slice(18) 中的数字可以根据自己的情况来修改...

2022-04-12 22:27:59 1901

原创 Ubuntu安装g++多版本方法

由于不能转载,这里记录一下网上现有较好的方法:如何在Ubuntu 18.04上安装GCC编译器如何确定gcc是否支持c11,c14,c17

2022-04-05 15:45:52 1809

原创 TCP三次握手和四次挥手

TCP是面向字节流的服务。字节流服务和数据包服务的区别对应到实际编程中,体现为通信双方是否必须执行相同次数的读、写操作(这只是表现形式)。当发送端应用程序连续执行多次写操作时,发送缓冲区中这些等待发送的数据可能被封装成一个或多个TCP报文段发出。因此,TCP模块发送出的TCP报文段的个数和应用程序执行的写操作次数之间没有固定的数量关系。当接收端收到一个或多个TCP报文段后,TCP模块将他们携带的应用程序数据按照TCP报文段的序号依次放入TCP接收缓冲区中,并通知应用程序读取数据。接收端应用程序可以一..

2022-03-28 16:48:32 2498

原创 C++知识点-成员函数中const的使用

const 在C++中是一个很重要的关键字,其不光可以用来修饰变量,还可以放在函数定义中,这里整理了其在函数中的三个用法。修饰入参首先我们要明白在C++中调用函数时存在两种方法,即传递值和传递引用。值传递值传递时,调用函数时会创建入参的拷贝,函数中的操作不会对原值进行修改,因此这种方式中不需要使用 const 来修饰入参,因为其只是对拷贝的临时对象进行操作。址传递传递地址时函数中的操作实际上是直接对原来的值进行修改,因此我们这里可以使用 const 修饰入参。const修饰入参当const修

2022-03-12 14:50:52 4614 4

原创 org.apache.http.NoHttpResponseException故障排查

文章目录背景问题分析解决方法加入重试机制Reference背景最近公司的spark离线任务稳定有报错日志:java.lang.RuntimeException: org.apache.http.NoHttpResponseException: demo.com:80 failed to respond通过该报错日志我们可以判断是离线任务中使用的 httpclient 调用失败了,使用的组件版本如下:httpclient-4.5.12httpcore-4.4.13问题分析遇到问题首先是在

2022-02-28 22:51:03 5021

原创 Kafka消息失败后无限重复消费现象的排查

文章目录背景相关代码现象解决方法Reference背景项目中用到了kafka消息队列,在开发测试过程中发现了消息端设置的最大重试次数失效的情况,具体信息如下:consumer: 3partition:1maxRetryTimes:15spring-kafka: 2.2.15.RELEASEkafka-client: 2.0.1相关代码消费者config文件@Configuration@EnableKafka@Slf4jpublic class KafkaConsumerConf

2022-02-24 22:56:06 7716 3

原创 Ubuntu18.04升级gdb10.2

背景由于目前ubuntu中的gdb版本为8.1,其存在bug无法调式多进程程序,因此打算将其升为10.2.步骤下载并解压在官网下载对应的版本解压 tar -zxvf gdb-10.2.tar.gzconfigcd gdb-10.2/mkdir buildcd build../configure --with-python=/usr/bin/python3 --enable-targets=all注意,上述使用的python路径请以你当前环境的为准。makemake这一步很

2022-02-20 22:31:05 5291 11

原创 Git报错解决——insufficient permission for adding an object to repository database

今天在使用git提交代码时出现了以下报错insufficient permission for adding an object to repository database首先分析出现错误的原因,报错信息很明显,我们的本地代码目录缺少权限,解决方法也很简单,使用 stackoverflow 网友提供的命令即可cd /path/to/repo.gitsudo chgrp -R groupname .sudo chmod -R g+rwX .sudo find . -type d -exec c

2022-02-17 11:38:42 5660 2

原创 C++知识点-静态成员变量和静态成员函数

文章目录静态成员变量静态变量在任何类对象创建前初始化定义静态成员变量使用静态成员变量类对象共享静态成员const constexpr静态成员函数Reference静态成员变量这里先引用GeeksforGeeks的一段内容:Static data members are class members that are declared using static keywords. A static member has certain special characteristics. These are

2022-02-16 21:22:18 728 7

原创 C++知识点-this指针

文章目录基本概念基本用法注意点Reference熟悉面向对象语言的读者一定对于 this 这个关键字很熟悉,比如Java中就有这一关键字,C++中也有,作用也和Java中的差不多。在这里我们简单介绍其概念和用法。基本概念The this pointer is a pointer accessible only within the nonstatic member functions of a class, struct, or union type. It points to the object

2022-02-15 12:41:34 810 4

原创 C++知识点-命名空间

文章目录命名空间的特性声明命名空间和命名空间成员全局命名空间不连续命名空间嵌套命名空间using声明和using编译指令命名空间别名综合代码示例ReferenceC++标准提供了命名空间的工具,其作用很简单也很好理解,为了就是解决多个库之间同名对象的冲突问题,这和Java中包的作用是一样的。命名空间的特性首先熟悉一下命名空间的两个概念。声明区域:可以在其中进行声明的区域,如全局文件的声明区域是文件,函数内声明的变量声明区域为代码块。潜在作用域:潜在作用域从声明点开始,到其声明区域的结尾。因此潜在

2022-02-12 21:50:58 615 1

原创 C++知识点 存储持续性、作用域和链接性总结

C++为在内存中存储数据提供了多种选择,可以选择数据保存在内存中的时间长度(存储持续性 storage duration)以及程序哪一部分可以访问数据(作用域 scope 和链接 linkage)存储持续性C++中有四种不同的方案来存储数据,这些方案的区别就在于数据保留在内存中的时间**自动存储持续性(Automatic Storage Duration):**在函数定义中声明的变量(包括函数参数)在存储持续性上是自动的。它们在程序开始执行其所属的函数或者代码块时被创建,在执行完函数或代码块时,他们

2022-02-11 18:12:22 591

原创 C++知识点-函数模版

2022-02-11 17:48:20 713

原创 C++基础知识-引用和指针

文章目录什么是引用引用与指针的区别指针可以先声明后赋值,但是必须在声明引用时将其初始化指针可以重新赋值,但是引用不行指针可以为空,引用不能为空指针可以嵌套,引用不可以指针支持算术运算,引用不可以使用引用基本类型用作函数参数临时变量返回引用常见的问题为什么要加上引用这个技术为什么this不是引用引用参数,指针参数和按值传递如何选择Reference在学习C++中的引用时,由于博主之前是Java选手,所以总是对于C++中的引用和指针的概念有一些绕,既然有了指针为什么还要有引用呢?在这里记录下自己的思考。什么

2022-02-10 21:57:26 614

原创 C++知识点-函数基础

这里总结下C++函数的一些基础知识。在工作中深刻体会到基础的重要性,以及理论指导实践,必须有一定的理论知识作为依据,才能写出健壮的代码以及有不错的解决问题的能力。如果总结的知识不对或者已过时还请大家指正。基本知识C++对于返回值的类型有一定的限制:不能是数组,但是可以是其他类型:整数,浮点数,指针,结构和对象。通常,函数通过将返回值复制到指定的CPU寄存器或内存单元中来将其返回。随后,调用程序将查看该内存单元。在编译阶段进行的原型化被称为静态类型检查(static type checking)函数

2022-02-10 17:06:50 511

原创 C++知识点-内联函数

内联函数是C++为了提高程序的运行速度而诞生的一项技术。要理解内联函数的作用必须对计算机组成和汇编原理有所了解。这里简单介绍下。简介我们知道当程序在运行时遇到函数调用,对应到CPU内部就会处理跳转指令,此时会需要将调用函数代码处下一条指令记录到寄存器中以便函数返回时能够继续往下顺序执行,并且还需要将函数参数复制到栈中。这显然会在程序运行过程中增加负担。当调用内联函数,编译器会使用响应的函数代码替换函数调用。因此,程序无须进行两次跳转。内联函数的运行速度比常规函数稍快,代价就是需要占用更多的内存,如果程

2022-02-09 18:08:51 471

原创 C++知识点-函数指针

初识C++中函数指针时感觉其就是一种函数式编程的实现,主要实现的功能是可以将函数当作参数传入其他函数中。与数据项类似,函数也有地址。**函数的地址是存储其机器语言代码的内存的开始地址。**这句话可能不太好理解,但是学过汇编后大致可以猜到函数指针就指向了函数汇编后一些列指令中的第一条指令。学好编程真是万丈高楼平地起,一定要把地基打好,即计算机的基础知识学好。使用函数指针可以在不同的时间传递不同函数的地址,因此可以在不同的时间使用不同的函数,有点类似于策略模式的思想。基础知识要使用函数指针,大致需要完成

2022-02-09 15:42:07 2057

原创 Ubuntu开发环境搭建详细笔记

本文详细介绍了从零开始安装ubuntu系统,并且在上面搭建C++和Java开发环境的方法,欢迎大家提出宝贵意见。

2022-01-30 22:06:45 3908 14

原创 C++知识点 单独编译总结

作为一个工业级的高级编程语言,C++和C语言一样,也提供了单独编译的能力,即将组件函数放在独立的文件中,单独编译这些文件,然后再将它们链接为可执行的程序。**如果只修改了项目中的一个文件,则可以重新编译该文件,然后将它与其他文件的编译版本链接。**例如,make 可以跟踪程序的依赖文件以及这些文件的最后修改时间。运行make时,如果它检测到上次遍以后修改了源文件,make将记住重新构建程序所需要的步骤。简单介绍一般程序可以分为三类:头文件:包含结构,对象声明和使用这些结构,对象的函数的原型源代码

2022-01-26 15:15:38 673

原创 汇编语言(6)——内中断

任何一个通用的CPU,都具备一种能力,可以在执行完当前正在执行的指令之后,检测到从CPU外部发送过来的或内部产生的一种特殊消息,并且可以立即对所接收到的信息进行处理。这种特殊的消息,我们可以称之为中断消息。中断的意思是指,CPU不再接着(刚执行完的指令)向下执行,而是转去处理这个特殊消息。对于8086CPU,当CPU内部有下面的情况发生的时候,将产生相应的中断信息除法错误单步执行执行into指令执行int指令8086CPU用中断类型码来标识中断信息的来源,中断类型码是一个字节型数据,可以表示2

2022-01-24 16:59:55 393

原创 汇编语言(7)——外中断

CPU除了能够处理指令以外,还应该能够对外部设备进行控制,接收他们的输入,向他们进行输入。要及时处理外设的输入,CPU需要解决两个问题:1.外设的输入随时可能发生,CPU如何得知2.CPU从何处得到外设的输入接口芯片和端口PC系统的接口卡和主板上有各种接口芯片,这些外设接口芯片中存在若干寄存器,CPU把这些寄存器当作端口来访问。因此这里可以回答第二个问题,即CPU从端口得到外设的数据。外设的输入不直接送入内存和CPU,而是送入相关的接口芯片的端口中;CPU向外设的输出也不是直接送入外设,而是先

2022-01-17 21:51:23 3306

原创 汇编语言(5)——转移指令的原理

可以修改 IP,或同时修改 CS 和 IP 的指令统称为转移指令。概括地讲,转移指令就是可以控制CPU执行内存中某处代码的指令。8086CPU的转移行为有以下分类:只修改IP,称为段内转移,如 jmp ax同时修改IP和CS,称为段间转移,如 jmp 1000:08086CPU的转移指令分为无条件转移指令(如jmp)条件转移指令循环指令(如 loop)过程中断...

2022-01-16 16:56:03 294

原创 汇编语言(4)——数据处理的两个基本问题

计算机是进行数据处理、运算的机器,那么有两个基本问题就包含在其中:1.处理的数据在什么地方2.要处理的数据有多长机器指令处理的数据在什么地方绝大部分机器指令都是进行数据处理的指令,处理大致可分为三类:读取、写入和运算 。在机器指令这一层来讲,并不关心数据的值是多少,**而关心指令执行前一刻,他将要处理的数据所在的位置。**指令执行前,索阿哟处理的数据可以在3个地方:CPU内部、内存、端口。汇编语言中数据位置的表达汇编语言中用3个概念来表达数据的位置:1.立即数2.寄存器3.段地址和偏移地

2022-01-16 12:16:28 185

原创 汇编语言(3)——寄存器(访问内存)

内存中字的存储8086CPU 中使用的寄存器是16位的。但是内存中内存单元是字节单元,即一个单元存放一个字节,则一个字需要用两个地址连续的内存单元来存放。DS和[address]8086CPU 中有一个 DS 寄存器,通常用来存放要访问数据的段地址。其中 [address] 表示内存地址的偏移地址,所以最终的物理地址为 ds * 4 + address将 1000H 内存中的数据存入寄存器 almov bx 1000Hmov ds bxmov al [0]数据段我们可以将一组长度为N(

2022-01-13 20:27:01 380

原创 汇编语言(2)——寄存器

一个典型的CPU由运算器,控制器、寄存器等器件构成,这些器件由内部总线连接,在CPU中:运算器进行信息处理寄存器进行信息存储控制器控制各种器件工作内部总线连接各种器件,在他们之间进行数据传递字在寄存器中的存储8086CPU中所有寄存器都是2个字节16位的,一共有14个寄存器:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW。其中AX,BX,CX,DX通常用来存放一般性数据。8086上一代寄存器事8位的,为了兼容上一代的CPU,这四个寄存器可以分为可独立

2022-01-11 19:35:13 408

原创 汇编语言(1)——基础知识

想要成为一名合格的程序员,必须要做的就是打好自己的基础,只有计算机基础扎实了,才能够让自己在一个领域深入。切勿浮沙筑高台。因此打算在年前将操作系统和汇编语言复习一遍,在这里进行整理。汇编语言的产生最早期的计算机没有操作系统,程序员们编程只能通过纸带的方式,非常不方便,因此就产生了汇编语言。汇编语言相当于电脑和程序员之间的中介,程序员可以更方便地编写程序,编写完程序之后再通过汇编编译器将其翻译成机器码就可以在电脑上执行。汇编语言发展至今,有以下三类指令组成:汇编指令:机器码的助记符,有一一对应的机

2022-01-10 21:06:24 511

原创 MacOS(Big Sur)安装GDB教程

最近在学习GDB,由于开发机是Mac,因此需要自己安装GDB,在此记录下安装使用过程。环境信息macOS Big SurVersion 11.2.3安装GDB安装Homebrew这一步由于国内网络原因,推荐使用清华大学的brew源,点这里安装 gbd直接使用 brew install gdb 命令即可安装创建证书在 mac 系统中使用 gdb 必须创建证书,这里可以参考 Mac在钥匙串创建系统证书失败证书创建完成之后需要将其信任选项设为 总是信任为gdb签名创建如下文件 entit

2022-01-07 15:51:08 5173

原创 C++析构函数为什么建议是虚函数

学习C++时,看到书上有建议析构函数函数设置为虚函数,一直不理解,现在我们写代码验证下这一建议。先看下不带virtual 的析构函数using namespace std;class TBase {public: TBase() {} ~TBase() { cout << "Base Destructor" << endl; } void show() { cout << "base show"

2021-12-26 21:50:12 696

原创 C++输入cin模版代码以及const与指针的关系

C++处理输入异常while (!(cin >> factor)) // bad input{ cin.clear(); while (cin.get() != '\n') continue; cout << "Bad input; Please enter a number: ";}数组处理函数的常用处理方式修改数组:void f_modify(double ar[], int n);不修改数组:void f_no_c

2021-11-28 23:07:53 808

原创 C++指针、数组和指针算术

在C++中,指针和数组基本等价,原因在于指针算术(pointer arithmetic)和C++内部处理数组的方式。指针算术中,指针变量+1后,增加的量等于它指向的类型的字节数。在多数情况下,C++将数组名解释为数组第1个元素的地址。int* stack = {1, 2, 3};要注意以下两点:stack[1] == *(stack + 1),C++会将数组名的表达式转化为指针的表达式stack == &stack[0] ,数组名被解释为数组第一个元素的地址指针和字符串观察如下代

2021-11-21 10:09:54 348

原创 C++指针和自由存储空间

计算机程序在存储数据时必须跟踪3个基本属性:信息存储在何处存储的值是多少存储的信息是什么类型我们可以从C++ 语法的角度简单分析一下声明语句;int a;该声明语句指出了值的类型和符号名,还让程序为值分配内存,并在内部跟踪该内存单元,这是一种基本类型的策略。我们来看复合类型的策略。即指针的策略,指针是一个变量,其存储的是值的地址,而不是值本身。对于两种不同变量的指针,虽然这两个指针指向不同的数据类型,但是其本身的值(即地址)的大小是相同的,通常在32位的机器上,一个指针占4字节,因此求s

2021-11-20 20:37:50 910

原创 MacOS配置C++开发环境

作为一名程序员,一定要学一下C语言和C++,因此本帖记录下在MacOS环境中进行C++学习的开发环境配置步骤,以及各种编译器的安装前置条件电脑:macOS BigSur Version 11.2.3(20D91)工具:homebrewIDE:JetBrains Clion安装编译器Xcode Command Line Tools 安装首先我们需要安装 command line tools,可以参考 How to Install Xcode Command Line Tools on a M

2021-11-13 15:31:28 7412

原创 【Effective Java】使可变性最小化

基础概念不可变类是指其实例不能被修改的类,每个实例中包含的信息都应该在创建该实例的时候就提供,并在对象的整个生命周期(lifetime)内固定不变。其中常用的 String、基本类型包装类、BigInteger和BigDecimal 就是不可变类。为了使类变成不可变,要遵循下面五条规则:不要提供任何回修改对象状态的方法保证类不会被扩展,即不会有方法重写声明所有的域都为final声明所有的域都为私有确保对于任何可变组件的互斥访问代码示例// Immutable complex numbe

2021-09-14 16:55:21 153

原创 【Effective Java】重写equals方法时的注意点

本文为《Effective Java》的读书笔记,经典的书每次读都会有不一样的感受,有些知识点只有有了相应的工作经验才能真正理解。相信大家刚开始学须 Java 基础时就对 equals 方法进行了重点学习。这里再总结下注意点。Equals 方法的通用约定自反性(reflexive):对于任何非 null 的引用值 x, x.equals(x) 必须返回 true对称性(symmetric):对于任何非 null 的引用值 x 和 y,当且仅当 y.equals(x) 时返回true,x.equals

2021-09-13 21:35:19 197

原创 Java BigDecimal 常用代码模版记录【持续更新,欢迎补充】

在电商领域,涉及到金额的遍历一般会使用 BigDecimal ,这里总结其常用的代码。两数进行比较比较两个金额是否相等,如 12 与 12.00,可以使用 compareTo 方法进行比较,如果返回0则相等,反之不相等。private boolean moneyEqual(String a, String b) { return new BigDecimal(a).compareTo(new BigDecimal(b)) == 0;}@Testpublic void moneyEqua

2021-04-22 11:22:23 257

org.activiti.designer.updatesite-5.18.1-SNAPSHOT.zip

eclipse的activit插件org.activiti.designer.updatesite-5.18.1-SNAPSHOT,方便离线安装

2019-07-28

空空如也

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

TA关注的人

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