自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(90)
  • 收藏
  • 关注

原创 Docker核心技术和实现原理

rootfs 等等,这种容器的组装方式提供了非常大的灵活性,只读的镜像层通过共享也能够减少磁盘的占用。而宿主机上的文件系统,也自然包括了我们要使用的容器镜像。镜像制作是因为某种需求,官方的镜像无法满足需求,需要我们通过一定手段来自定。用所需要的最小化环境。如果确实要从外部引入数据,需要指定持久的地址,并带版本信息等,让他人可以复。这样会看到很多无标签的镜像,与之前的虚悬镜像不同,这些无标签的镜像很多都是。中间层镜像,是其它镜像所依赖的镜像。实际上,这些镜像也没必要删除,因为之前说过,相同。

2024-08-20 11:01:27 522

原创 docker入门教程

常见问题和docker run有什么区别?命令从Docker映像创建一个全新的容器。但是,它不会立即运行它。命令将启动任何已停止的容器。如果使用命令创建容器,则可以使用此命令启动它。docker run命令是创建和启动的组合,因为它创建了一个新容器并立即启动它。实际上,如果docker run命令在您的系统上找不到上述映像,它可以从Docker Hub中提取映像。和有什么区别?想要了解与命令的区别,还必须知道与命令:•:将一个镜像导出为文件,再使用命。

2024-08-17 09:50:59 1175

原创 Spring Boot ⽇志

⽇志级别是开发⼈员设置的, ⽤来给开发⼈员看的. ⽇志级别的正确设置, 也与开发⼈员的⼯作经验有 关. 如果开发⼈员把error级别的⽇志设置成了info, 就很有可能会影响开发⼈员对项⽬运⾏情况的判 断. 出现error级别的⽇志信息较多时, 可能也没有任何问题. 测试的bug级别更多是依据现象和影响范 围来判断。SLF4J不同于其他⽇志框架, 它不是⼀个真正的⽇志实现, ⽽是⼀个抽象层, 对⽇志框架制定的⼀种规范, 标准, 接⼝. 所有SLF4J并不能独⽴使⽤, 需要和具体的⽇志框架配合使⽤。

2024-08-10 07:12:51 892

原创 SpringBoot 配置⽂件

计算机上有数以千计的配置⽂件, 我们使⽤的绝⼤多数软件, ⽐如浏览器, 微信, Idea, 甚⾄电脑, ⼿机, 都 离不开配置⽂件. 我们可能永远不会直接与其中的⼤部分⽂件打交道,但它们确实以不同的形式散落在 我们的计算机上, ⽐如C:\Users, C:\Windows⽂件夹, 以及各种 *.config, *.xml ⽂件。配置⽂件主要是为了解决硬编码带来的问题, 把可能会发⽣改变的信息, 放在⼀个集中的地⽅, 当我们启动某个程序时, 应⽤程序从配置⽂件中读取数据, 并加载运⾏.

2024-08-09 13:15:26 681

原创 Spring I

在上⾯的程序中, 我们是根据轮⼦的尺⼨设计的底盘,轮⼦的尺⼨⼀改,底盘的设计就得修改. 同样因 为我们是根据底盘设计的⻋⾝,那么⻋⾝也得改,同理汽⻋设计也得改, 也就是整个设计⼏乎都得改 我们尝试换⼀种思路, 我们先设计汽⻋的⼤概样⼦,然后根据汽⻋的样⼦来设计⻋⾝,根据⻋⾝来设计 底盘,最后根据底盘来设计轮⼦. 这时候,依赖关系就倒置过来了:轮⼦依赖底盘, 底盘依赖⻋⾝, ⻋⾝依赖汽⻋。IoC 是⼀种思想,也是"⽬标", ⽽思想只是⼀种指导原则,最终还是要有可⾏的落地⽅案,⽽ DI 就属于 具体的实现。

2024-08-08 15:33:51 934

原创 Java之SpringBoot入门(含Spring Mvc)

在计算机领域, 会话是⼀个客⼾与服务器之间的不中断的请求响应. 对客⼾的每个请求,服务器能够识 别出请求来⾃于同⼀个客⼾. 当⼀个未知的客⼾向Web应⽤程序发送第⼀个请求时就开始了⼀个会话. 当客⼾明确结束会话或服务器在⼀个时限内没有接受到客⼾的任何请求时,会话就结束了.服务器同⼀时刻收到的请求是很多的. 服务器需要清楚的区分每个请求是从属于哪个⽤⼾, 也就是属于 哪个会话, 就需要在服务器这边记录每个会话以及与⽤⼾的信息的对应关系. Session是服务器为了保存⽤⼾信息⽽创建的⼀个特殊的对象.

2024-08-06 18:39:03 1109

原创 Mysql的指令及使用

首先我们要知道Mysql数据库的结构!

2024-07-20 10:36:18 1020

原创 Java之反射和枚举及lambda表达式

Java的反射()机制是在。

2024-07-16 13:14:42 778

原创 Java容器之顺序表和链表,栈,队列的使用

线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物。的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。进行数据插入和删除操作的一端称为栈 顶,另一端称为栈底。:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出。个具有相同特性的数据元素的有限序列。构,常见的线性表:顺序表、链表、栈、队列...)是指允许两端都可以进行入队和出队操作的队列,理上存储时,通常以数组和链式结构的形式存储。出栈:栈的删除操作叫做出栈。

2024-07-12 07:08:23 617

原创 Java包装类&简单认识泛型

一般的类和方法,只能使用具体的类型要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。-----来源《Java编程思想》对泛型的介绍。泛型是在JDK1.5。

2024-07-10 07:30:25 270

原创 Java集合框架

该阶段,我们主要学习以下容器,每个容器其实都是对某种特定数据结构的封装,大概了解一下,后序会给大家详细讲解(以前的文章有讲过c++版本的,之后只会讲在Java中如何使用)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的 集合。使用成熟的集合框架,有助于我们便捷、快速的写出高效、稳定的代码。:底层是队列,队列是一种特殊的顺序表。:底层为哈希桶,查询的时间复杂度为。:底层为红黑树,查询的时间复杂度为。:底层为红黑树,查询的时间复杂度为。:集合,是一个接口,里面放置的是。

2024-07-09 08:26:56 253

原创 Java异常

程序先执行try中的代码如果try中的代码出现异常就会结束try中的代码看和catch中的异常类型是否匹配如果找到匹配的异常类型就会执行catch中的代码如果没有找到匹配的异常类型就会将异常向上传递到上层调用者无论是否找到匹配的异常类型中的代码都会被执行到在该方法结束之前执行).如果上层调用者也没有处理的了异常就继续向上传递一直到main方法也没有合适的代码处理异常就会交给JVM来进行处理此时程序就会异常终止8.

2024-07-08 08:58:46 754

原创 Java之String类

这个哈希码是一个整数,用于快速比较字符串对象是否相等,而不需要逐字符比较,这在处理大量字符串时能够显著提高性能。自身的值不能改变,即不能引用其它字符数组,但是其引用空间中 的内容可以修改。可以直接用字符串常量进构造,也可以用new的方法去构造(二者等价)String是一个引用类型,所以str可以直接赋值一个字符串。要获取字符串的某一位,可以用charAt(),下标从0开始。字符串中的内容是不可改变。也可以传入一个字符数组进入,也会被转化为字符串。的不可更改特性,为了方便字符串的修改,

2024-07-08 07:18:18 671

原创 抽象类和接口及内部类

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,

2024-07-07 13:20:50 1038

原创 Java继承和多态

继承顾名思义即一方可以把另一方的东西啊传承到自己手里。例如猫和狗都是动物。动物都有吃饭,喝水等行为,也有年龄,体重的属性。那么我们在定义猫和狗的时候就没必要去重复写,而是我们可以定义一个动物类,然后猫和狗去继承动物类即可。即可以实现类与类直接共性的抽取和代码的复用。理解应该不难,我们直接看语法!例如上面就是狗类继承动物类,extends+要去继承的类public和protected修饰的成员可以被子类继承并直接访问,private成员则继承之后不可直接访问。

2024-07-06 13:25:21 690

原创 Java类和对象

比如:为了更好的管理电脑中的歌曲,一种好的方式就是将相同属性的歌曲放在相同文件 下,也可以对某个文件夹下的音乐进行更详细的分类。第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法 对象的引用传递给该成员方法,this。对象实例化就是new出来一个对象,相当于类就是一个蓝图,而new则是实实在在的创建出来的实际物体!例如我们创建一个人的类以后,不同人只是属性的内容不同,但是拥有的属性和行为都基本一样。不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中。

2024-07-05 08:27:46 920

原创 Java数据类型及运算符及数组(与C语言对比)

如Integer(int),Charcter(char).Boolean(boolean),short(Short),byte(Byte),long(Long)基本数据类型就是刚刚的8种类型,而引用数据类型就包括String,数组,类,接口,我们会慢慢接触到的!这些都是基础类型的包装类,但是大家现在还没有学类,所以大家见一下就行,以后大家就会理解这是什么东西的!4.Java中不存在0为假,非0为真这种说法,即boolean不能和整数进行转化!常见的加减乘除,取余,取模等C语言基本相同!

2024-06-13 20:25:39 481

原创 初识Java

然后大家可能就会出现混淆,JDK,JVM,JRE(Java Runtime Environment)是什么,有什么关系?下面这张图就可以很好解释,JDK包含JRE包含JVM,所以安装了JDK就已经安装好了JVM了!在JDK1.6以及之后,安装Java的开发环境,只需要配置上面两个内容即可。命令,如果输出如下图,表示安装配置成功,否则需要检查安装和配置是否正确。安装完成JDK以及相应的配置之后,需要验证是否安装成功,是否配置正常。的值,这样的好处在于,如果Java安装目录发生变话,主需要修改。

2024-06-12 22:29:55 504

原创 项目——boost搜索引擎

这个地方我们要注意一个问题,由于分词,所以一个搜索会被分为多个关键字,每个关键字都会查找到一些文章,而这些文章的内容很有可能是重复的,所以我们必须进行去重工作!然后我们可以看一下我们的网页文件,会发现里面除了网页的标题,内容,url之外其他的我们并不需要,并且这些东西会干扰对网页内容的提取,所以我们必须要去掉这些无用的标签!首先我们看我们的主框架,整个程序的思路是,首先我们要提取出整个文件的内容,然后将所有文件的内容写入一个文件,然后用分隔符进行分割,然后再对文件主要信息进行提取。

2024-04-15 20:11:23 1192

原创 高级IO——多路转接

每个被检测的fd都会被放入红黑树,一旦事件就绪,就会调用回调函数,让操作系统从红黑树中找到相关的rbn成员然后读取其信息,然后在等待队列中添加,这样就我们进行读取事件的时候就是在等待队列中读取事件了,并且在这个过程中事件主动回调,时间复杂度为o(1),比我们之前的select和poll效率拥有了质的提升!所以我们一般更青睐于多路转接的方法!也即如果设置为非阻塞的时候,我们反复读取,一旦读完就会出错返回,如果阻塞模式,我们就会阻塞在读的地方,这显然是我们不能接受的,所以我们要把读设为非阻塞模式!

2024-04-10 12:43:24 521

原创 ip协议和数据链路层!

简而言之,就是套娃!然后在一个公网ip内部再组建私网,这样就扩充ip数量,缓解了ip不足的问题!然后为了保证双方能确认彼此,每一次在公网除都会根据转换表将公网的地址转化内网的地址(相对于一个签证,在不同区域内标识身份一样)就可以实现双方数据的通信了!(如果报头,收到后面的自然知道报头有缺失,可以进行补发,如果中间有丢失显然会有偏移量没有连续,同理,如果报尾丢失,则会没有更多分片为0的报文(即片尾)同理可以查出来)!也就是用子网掩码的1的部分为网络号,0为主机号,1和0就划分了网络号和主机号的部分!

2024-03-27 11:45:43 1189

原创 Linux之udp/tcp协议

然后等待对方也将数据发送完以后,确定没有数据要发送了,也要断开连接,也发送FIN,同理左边也会发送应答!大家可以想如果1000-2000的应答丢失了,但是收到了4001,接收方也会知道对方已经收到了1000-2000的数据,这样我们就可以允许少量的应答已经丢失了!首先我们要知道接受方是有缓冲区大小的,如果我们完全不加限制的发送数据,就会很容易写满对方的缓冲区,而一旦溢出,这些数据就会被直接丢掉,肯定是不行的,所以我们必须对发送方进行控制!,压缩成了一次),然后开始发送的一方收到以后也发送ACK进行应答!

2024-03-22 22:43:41 814

原创 http/https协议

比如百度的搜索界面,这个就是URL(就是我们平时说的网址),其中www.baidu.com就是域名,也即网址是由域名+其他内容所组成的(一个完整的网址通常由协议、域名(可能包括子域名)、目录路径、查询参数和端口号(如果非默认)等),然后域名将会通过域名解析变成ip+端口号,实际访问的是ip+端口号!而GET则是在被包含在url里面的(这也是为什么会回显)!解决方法就是我们每次想服务器请求的时候,不仅要看我们的登录账号和密码,也会监测登录地点,ip等,如果出现了异常情况,服务器就会拦截我们的信息!

2024-03-20 23:39:22 1112 1

原创 Linux之网络套接字

首先我们在网络基础1的基础上就要先初步认识一下UDP和TCP协议此处我们先对TCP(Transmission Control Protocol 传输控制协议)有一个直观的认识;后面我们再详细讨论TCP的一 些细节问题.此处我们也是对UDP(User Datagram Protocol 用户数据报协议)有一个直观的认识;后面再详细讨论两者并没有绝对的好坏之分。通知像对可靠性要求非常高的就选tcp(银行等不允许信息丢失的),较低的就选udp(比如网络直播这种可以允许少量信息丢失的)。

2024-03-18 00:54:38 730

原创 Linux之网络基础1

网络发展背景:单机—>多用户远程操作—>网络独立模式:计算机之间相互独立。网络互联:多台计算机连在一起,完成数据共享。局域网LAN:计算机数量变多,通过交换机和路由器连接在一起。广域网WAN:将远隔千里的计算机连接到一起。

2024-03-15 13:17:45 865

原创 Linux之多线程

只要我们对资源进行整体加锁就默认了我们对这个资源整体使用,实际情况可能存在一份公共资源,但是允许同时访问不同的区域!(程序员编码保证不同的线程可以并发访问公共资源的不同区域!信号量本质是一把。

2024-03-13 19:12:33 914

原创 Linux之信号

通过下图,我们就会知道其实信号,阻塞实质上就是把我们的位图相应位置改为1就算是改变了状态,比如如果要阻塞2号信号那就把block表的二号信号比特位置1,如果我们要发送信号就把pending表置为1即可!答案就是我们的进程是要被cpu调度的,我们的进程是时间片调度的,所以进程会不停被调度,这个时候就要进入系统内核,这样我们就可以避免这种情况了!就是说正常情况是没有core dump的,但是如果我们开启了,那么如果进程出现错误了,它就会以文档的形式保存相关的数据,方便后面的排查和解决错误。我们来做实验看一看!

2024-02-19 10:25:43 842

原创 进程间通信(管道,共享内存,消息队列,信号量)

而半双工则是指在通信过程中的任何时候,信息可以从A传输到B,从B传输到A,但只能有一个方向的传输,不能同时传输。所以结构的开头都是Ipc_perm,这样我们就可以用一个ipc_perm指针数组保存管理任意类型的结构体(指的是共享内存,消息队列,信号量这些东西),然后要访问其中的数据时再强转成对应的类型就完成了我们的数据管理!命名管道也是通过文件缓冲区建立的通信的(管道文件与其他文件形式一样,只不过不向磁盘刷新数据而已),而匿名管道是通过血缘关系确定同一份资源,而命名管道是通过路径和文件名确定资源的!

2024-02-18 18:36:59 895

原创 Linux之动静态库

静态库,就是那个文件想用,就直接把库文件的内容拷贝过去,这样可以减少出现文件丢失的情况,略微提高运行速度,但是会造成巨大的空间消耗,大多数情况我们都选择动态库!并且把相关文件拷贝进去。然后这个时候再打包的时候再加上-I也即告诉gcc找头文件不仅要在当前目录找,系统目录找,也要到指定的目录进行寻找!所以我们只需要库加载之后,位置是确定的,我们之后就可以正常加载了!于是我们就可以得出一个结论,我们在函数跳转的时候就是在地址之间跳转而已!同理我们还要包括库文件,于是还要加上后面的语句去链接相关的库文件!

2024-02-15 20:46:53 1645

原创 c++之IO流

C++标准库提供了4个全局流对象cin、cout、cerr、clog,使用cout进行标准输出,即数据从内。盘)读取数据,并将值存放在变量中。提供了cerr用来进行标准错误的输出,以及clog进行日志的输出,从上图可以看出,cout、1.可以屏蔽掉低级I/O的实现,低级I/O的实现依赖操作系统本身内核的实现,所以如果能够屏。5. 对于自定义类型,如果要支持cin和cout的标准输入输出,需要对<<和>>进行重载。“流”即是流动的意思,是物质从一处向另一处流动的过程,是对一种有序连续且具有方向性的数。

2024-01-31 18:41:07 797

原创 c++特殊类的设计

如果单例对象构造十分耗时或者占用很多资源,比如加载插件啊, 初始化网络连啊,读取文件啊等等,而有可能该对象程序运行时不会用到,那么也要在程序一开始就进行初始化,然后我们为了在一开始就加载,我们就必须在main函数之前创建,所以我们必须使用全局变量。但是如果我们直接禁止掉拷贝构造又会导致我们返回的时候出问题,属于伤敌一千,自损一万。一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个。但是又因为我们不能在类外进行创建,所以我们可以直接在类里面创建一个类一直保留着就行。

2024-01-30 17:16:23 367

原创 C++11

前者在针对一个智能指针的时候是正常的,但是如果有多个资源的智能指针,最后就会撞在一起了,所以也不可以用。emplace_back是C++11标准中引入的一个方法,用于向容器中添加一个元素,它与push_back类似,但在使用上具有更高的效率。正常情况下,左-》右,左边析构以后--为0,析构自己会导致右边的计数--,然后出作用域的时候右边本身就--,然后也为0,进行清楚。万能引用的声明方式为。不过不要轻易进行移动赋值,比如此处s1的资源就被给给s3,而自己的资源没了,容易引发问题,一定要谨慎使用。

2024-01-30 13:37:06 1021

原创 c++之哈希

这意味着索引值是由插入项的值所确定的,当你需要判断列表中是否存在该值时,只需要对值进行哈希处理并在相应的索引位置进行搜索即可,这时的搜索速度是非常快的。但是 HashMap 的实现也有缺点,例如存储容量占比高,考虑到负载因子的存在,通常空间是不能被用满的,而一旦你的值很多例如上亿的时候,那 HashMap 占据的内存大小就变得很可观了。(比如,如果有人还书,是2023年12月1日借的,名字叫张三,那我们就可以直接去2023年12月1日的,首字母是Z的信息处找,如果找到那就完成还书,如果找不到就存在问题)。

2024-01-11 11:38:13 1016

原创 二叉搜索树(AVL树,红黑树)+封装

这个地方我们要注意,因为最左节点可能还有右子树,那么这个时候我们可以先记录父节点,方便进行重新连接,如果右子树只有一个节点,这个时候subleft将会是parent的右节点,除此之外都会是左节点。然后就是旋转的情况,先分成祖父节点的左子树和右子树,分为单旋和双旋(看插入节点是父节点的左还是右),最终都是将cur放到祖父节点,然后保持更改颜色即可。通过值的大小选择不同的走向,一直到遇到一颗树正确的根节点的正确插入位置。其中左旋就是将要旋转的父节点的右节点的左子树交给父节点,然后将父节点变成右节点的左子树。

2023-12-21 19:39:30 889 1

原创 priority_queue的实现,容器和仿函数

我们先写好我们的模板和成员,这个container就是我们的容器,它可以复用我们的其他stl,这样就可以屏蔽底层细节,只要container能够实现我们等下所需要的功能,就可以实现完美复用。然后通过我们push,pop,tiop,empty的实现我们就可以发现通过container的接口我们很容易就实现了我们的功能,这就是容器的作用。同理我们的less,也就是我们的仿函数,本质其实就是一个类,但是重载了()这样我们就可以发现我们容器的作用,我们不用再具体实现。然后我们实现向上调整和向下调整。

2023-12-15 15:20:09 368

原创 C++STL之List的实现

然后我们来研究list的构造函数,首先我们要写一个空链表的构造,也就是头节点的构造函数,可以为我们的无参构造和初始化提供方便。迭代器的作用其实就是将容器内容的访问与修改进行包装,使得使用的程序员可以不直接对底层数据进行修改,这样不仅提高了数据的安全性,并且提高了使用者的规范性和代码的可读性。迭代器中实际的成员仍然是我们的原生节点指针,但通过迭代器的包装,就避免了我们直接使用节点,更避免了我们直接操控节点的数据域和指针域,起到多重包装的作用。首先我们先分析迭代器和List的类的基本成员和模板的使用。

2023-12-12 19:03:44 800

原创 c++之STL

然后我们实现size()和c_str(),其中c_str就是可以将string类型转换为char*类型返回。但是要注意用in.get()提取,如果用in由于cin会省略空格和回车,会导致陷入死循环。insert实现的时候要避免end变成负数(size_t变成负数就会是无穷大)首先我们需要实现string的构造函数和析构函数。然后实现find和substr这都是和数据结构的实现非常像的。通过运算符重载,我们就可以实现string的[]访问。然后我们实现+=和append。然后就是流插入和流提取的实现。

2023-11-29 19:19:00 482

原创 Linux之gdb

gdb就是一个Linux的调试工具,类似与vs里面的调试。可执行程序也有格式,不是简单的二进制堆砌。

2023-11-12 20:11:54 230

原创 Linux之make/maakefile

可以通过fflush(stdout)强制刷新缓冲区。printf打印并不是直接给屏幕而是先放到缓冲区。换行是指直接到同一位置的下一行,回车是回到开头。access不是实时更新的。

2023-11-08 18:12:22 87

原创 linux系统编程之gcc/g++

两者都是编译器,只是针对目标不一样。可以用来进行不同版本功能的裁剪。

2023-11-07 09:06:44 120

空空如也

空空如也

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

TA关注的人

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