自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小葱的博客

每一个不曾起舞的日子都是对生命的辜负。。。

  • 博客(125)
  • 收藏
  • 关注

原创 HTTPS--->SSL建立连接过程

以访问百度为例:

2021-06-19 00:31:55 170

原创 自动化测试--->Log4j日志集成

Log4j介绍在项目中,不管是开发人员写代码还是测试人员写测试代码一般都需要加一些日志信息来记录项目的行为,以便更好的跟踪项目中的一些交互和问题。Log4j是一个第三方日志框架,配置简单,功能强大,在项目中用它来记录日志会很方便。使用步骤:①引入Log4j的依赖;<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <ve

2021-05-08 21:34:48 217

原创 PO设计模式

PO(Page Object)简介Page Object是Selenium自动化测试项目开发实践的最佳设计模式之一,通过对界面元素和功能模块(例如:对元素进行鼠标点击、输入等操作)的封装减少冗余代码,同时在后期维护中,若元素定位或功能模块发生变化,只需要调整页面元素或功能模块封装的代码,提高测试用例的可维护性。PO的实质分层设计,也就是分离解耦,不同的模块使用不同的包来管理,使其关联性没有那么强。面向对象编程需要考虑以下两点:1.对象的属性(全局变量)------>web页面的元素(元素

2021-04-22 17:26:48 926

原创 Java----->TestNG单元测试框架之数据驱动(DataProvider)

testNG之数据驱动(DataProvider)DataProvider的使用编写方法作为数据提供者 @DataProvider(name = "usernames") public Object[][] getDatas(){ Object[][] datas = { {"张三"}, {"李四"}, {"王五"}, }; return data

2021-04-22 15:49:03 1084

原创 剑指offer--->顺时针打印矩阵

题目: 例如:如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

2017-08-24 10:55:30 604

原创 I/O多路转接之epoll

前言:认识epoll。。按照官方文档: epoll:是为处理大批量句柄而做了改良的poll。 被公认为Linux2.6下性能最好的多路I/O就绪通知方法。和之前的select和poll不同的是:epoll使用三个函数共同实现。epoll中的三个系统调用1.目的: 创建了一个epoll模型。 究其本质:创建了一棵空的红黑树。(内核)返回值:epoll模型的句柄。注:size参数可以不用关心。2

2017-08-10 08:16:05 500

原创 排序小结

概要: 了解排序算法各种算法的时间复杂度和空间复杂度如下: 排序详解:一、 插入排序直接插入排序:将一段无序区间插入到一段有序区间(1个元素自称一个区间),每次都是取出无序区间的第一个元素插入到有序区间(在有序区间找合适自己的位置,也就是保持有序区间依然有序)。图示直接插入过程:代码如下://假设是升序template<class T>void InsertSort(T* arr,size

2017-07-25 15:07:34 569 1

原创 编写tcp_server

背景知识:1.在TCP/IP协议中,IP地址+TCP/UCP端口号 —-》唯一标识网络通讯中的一个进程, 并且IP地址+端口号被称为socket。2.内存中的多字节数据相对于内存地址有大端和小端之分, 而网络数据流同样有大端和小端之分。TCP/IP协议规定,网络数据流应采用大端字节序,即就是低地址高字节。所以:发送端把数据发送到发送缓冲区之前需要做字节序的转换。 而接收主机在

2017-07-24 17:30:39 7935

原创 判断两个链表是否相交?若相交,求交点(假设链表带环)

前言: 深知自己对于这个知识点掌握的不是很好,故好好思考,并记录下思考后的成果。图示链表带环相交问题:既然已经分析清楚,那么代码就很好实现了。。。Node* IsHaveCrossNode(Node* head1,Node* head2) { assert(head1); assert(head2); Node* meetNode1 = Is

2017-07-19 00:43:30 844 1

原创 根据类(不能被继承、只能在栈上/堆上创建对象)的特点设计一个类

一、设计一个类不能被继承二、设计一个类只能在栈上创建对象三、设计一个类只能在堆上创建对象

2017-07-16 19:44:06 575

原创 浅析有关链表的带环问题

概要: 有关链表带环问题的面试题: *判断一个链表是否带环? *求环的长度? *求环的入口点?1、判断链表是否带环?//判断一个链表是否带环 //思路:快慢指针,返回相遇点 Node* IsCircle(Node* head) { if (head == NULL) { return NULL;

2017-07-16 12:25:45 319

原创 二叉树的面试题

1. 求两个节点的最近公共祖先节点假设现在找的是节点X1和X2的最近的公共祖先节点。 这里由于这棵树的结构或者说是特点从而导致这颗树的解法会有多种思路:第一种就是这棵二叉树是一个搜索二叉树,那么可以根据搜索二叉树的特点从而找出两个节点的最近的公共祖先节点。 可以想到,如果X1在一个节点的左子树,X2在一个节点的右子树,或者X1在一个节点的右子树,而X2在一个节点的左子树,这样就可以

2017-07-14 20:16:44 1140

原创 栈和队列的面试题

1.实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)对于这个问题,我们都知道,栈的入栈和出栈时间复杂度都是O(1),那么我们所面临的问题就是需要有一个接口来实现返回最小值的操作,且这个操作的时间复杂度必须是O(1)。 这里有两种思路可供选择: (1)前提:这里有一组数据,利用一个栈,将这些数据需要入栈,而在入栈的时候遵循这样的规律,将一个数据

2017-07-13 11:31:05 1023

原创 代理服务器与NAT

文章概要: 1.代理服务器? 2.代理的过程? 3.NAT? 4.NAT技术?代理服务器(Proxy Server)代理(英语:Proxy),也称网络代理,是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。 (client —–server) 代理服务器:代理服务器就是代理网络用户去取得网络信息。 形象的说:它是网络

2017-07-11 00:17:40 616

原创 ARP协议

理解arp协议 编写arp脚本抓取对应主机mac地址 ARP:地址解析协议*用来将IP地址转换为MAC地址的。 背景知识: IP地址:给因特网上的每一个主机(或路由器)的每一个接口分配一个在全世界范围唯一的32位的标识符。 通俗点讲:标识网络中不同主机的地址。 端口号:同一台主机上标识不同进程的地址。 IP地址+端口号 ——》标识网络中唯一的进程。在网络通讯

2017-07-10 20:53:18 318

原创 CRC校验

CRC校验是什么? 如何进行校验? 具体的例子? CRC校验为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。 目前在数据链路层广泛使用了循环冗余检验CRC(Cyclic Redundancy Check)。CRC校验原理:先在要发送的帧后面附加一个数(这个数就是用来校验的校验码FCS,这个校验码是二进制序列的),生成一个新帧发送给接收端。关于这个校验码,不是随机选

2017-07-09 16:09:41 1311

原创 生产者与消费者模型(二)

在上一篇博客中我们了解了什么是生产者与消费者模型? 也掌握了生产者与消费者模型的规则,并且实现了基于单链表的生产者与消费者模型,但是我们实现的基于单链表的生产者与消费者模型还是存在问题,存在死锁的问题,如果想深入理解死锁问题的,可以去看下我总结的死锁的博客。这篇博客我们主要来实现基于环形队列的生产者与消费者模型。 由于上一篇博客已经讲清楚了关于生产者与消费者的各种问题,所以这篇博客我们就直接来实

2017-07-03 01:19:31 561

原创 生产者消费者模型(一)

什么是生产者和消费者?在实际的软件开发中,经常会遇到这样的场景:某个模块负责生产数据,这些数据由另一个模块来负责处理。产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。对于生产者/消费者模型来说,上面所述还需一个缓冲区,这个缓冲区处于生产者和消费者之间,作为一个中介。 生产者将数据放入缓冲区,而消费者从缓冲区取出数据。生产者和消费者模型为什么需要缓冲区?1.解耦假设生产者和消费者

2017-07-03 00:53:40 1114

原创 调研crond (linux下的定时任务)

前言: 1.了解crond以及crontab 2.了解涉及的背景知识 3.深入理解crontab文件 4.举例说明linux下需要循环运行的例行性任务,是使用crond这个系统服务来控制的。 linux系统上有非常多的计划性工作,因此这个系统服务是默认启动的。另外,由于一般用户有时也想要设置计划任务,所以,linux系统也提供了控制计划服务的命令:crontab命令。认识crondcron

2017-07-02 18:33:41 478

原创 守护进程及创建

前言: 1.了解守护进程 2.守护进程的特点 3.如何创建守护进程 4.创建守护进程时fork一次与fork两次的区别初识守护进程守护进程也称为精灵进程(Daemon),是运行在后台的一种特殊进程(孤儿进程)。 守护进程独立于控制终端并且周期性地执行某些任务或等待处理某些发生的事件。一般的进程都会在用户登录时或运行程序时创建,在用户注销或程序运行结束时终止。但是守护进程不受用户登录或注销的

2017-07-02 13:45:30 368

原创 RBTree的插入算法

红黑树:红黑树是一颗二叉搜索树,但是它在每个节点上都增加了一个存储位来表示节点的颜色,这个颜色非RED 即BLACK。 红黑树保证最长路径不超过最短路径的2倍,因而近似于平衡。红黑树是满足下面红黑树性质的二叉搜索树 1. 每个节点,不是红色就是黑色 2. 根节点是黑色的 3. 如果一个节点是红色的,则它的两个子节点是黑色的。(意思就是没有连续的两个红节点)。 4. 对于每个节点,从

2017-06-07 13:10:14 490

原创 AVLTree的各种旋转问题图解分析

AVL树(严格平衡二叉搜索树)的特性:①左子树和右子树的高度之差的绝对值不超过1 ②树中的每个节点的左子树和右子树都是AVL树 ③每个节点都有一个平衡因子(但不是必须的,只是方便我们操作AVL树),每个节点的平衡因子的取值范围只可能是-1,0,1.当在AVLTree中插入或者删除一个节点后会发现:破坏了AVL树的平衡,所以需要更新平衡因子以及需要进行某种旋转。单旋:双旋:左右双旋:右左双旋:代码

2017-06-07 12:40:20 1293

原创 使用gdb调试多进程及多线程程序

多进程调试:首先来了解下会可能会用到的调试命令: 1.默认设置下,在调试多进程程序时GDB只会调试主进程。 但是如果设置follow-fork-mode的话,就可调试多个进程。 set follow-fork-mode parent|child: 进入gdb后默认调试的是parent,若是想要调试child的话,需要设置set follow-fork-mode child,然后

2017-06-04 18:29:59 1281

原创 调研死锁问题

本文讲述的要点:1.死锁的概念2.为什么会产生死锁?3.死锁产生的条件?4.如何解决死锁?1.死锁的概念:定义为一组 相互竞争系统资源或进行通信的进程间的“永久”阻塞。可以概括为所有的死锁问题都涉及两个或多个进程之间对资源需求的冲突。看了上面的概念,可能还是不太能理解什么叫死锁?所以下面我们再用通俗点的话来解释。2、为

2017-06-03 00:41:51 853 1

原创 线索化二叉树

中序线索化(递归):图形解析:代码如下://中序线索化 void InorderThreading() { Node* prev = NULL; _InoderThreading(_root, prev); }void _InoderThreading(Node* cur, Node* & prev) { if (cur)

2017-05-27 00:25:53 359

转载 文本文件和二进制文件详解(转)

转自:http://www.cnblogs.com/pengwangguoyh/articles/3223072.html前言:1)文本文件:这类文件以文本的ASCII码形式存储在计算机中。它是以”行”为基本结构的一种信息组织和存储方式。 2)二进制文件:这类文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们,只有通过相应的软件才能将其显示出来。二进制文件一般是可执行程序、图形、图像

2017-05-26 22:19:38 3416

原创 二叉搜索树

特点:二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree) 一般具有下面的特点:若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;任意节点的左、右子树也分别为二叉查找树。没有键值相等的节点(no d

2017-05-26 08:12:11 213

原创 进程间通信----->共享内存

本文内容说明: *共享内存的概念 *通过共享内存来达到进程间通信。共享内存:在Linux中,每个进程都有自己的P C B 和地址空间,并且都有一个对应的页表,负责将进程的地址和物理地址进行映射,通过MMU来管理。创建一段共享存储区(临界资源),被映射到不同进程的地址空间内,从而实现了高效率的资源共享。共享内存的优点及缺点:优点: 共享内存在所有用于进程间通信的IPC资源中实现进程间通信的速度是

2017-05-20 00:25:15 685

原创 进程间通信---->信号量

进程间通信(IPC)Linux中的内存空间分为系统空间和用户空间。 在系统空间中,由于各个线程的地址空间都是共享的,即一个线程能够随意访问kernel中的任意地址,所以无需进程通信机制的保护。 而在用户空间中,每个进程都有自己的地址空间,一个进程为了与其他进程通信,必须进入到有足够权限访问其他进程空间的kernel中,从而与其他进程进行通信。在Linux中支持System V 进程通

2017-05-19 00:35:53 719 1

原创 进程间通信之管道

管道: 管道是进程间通信的主要手段之一。 一个管道实际上就是个只存在于内存中的文件, 对这个管道的操作需要两个已经打开的文件(两个文件描述符),代表管道的两端。管道根据其适用范围可分为: 匿名管道和命名管道。管道容量:管道容量分为pipe buf和pipe capacity两种: 1.先来看看第一种pipe buf: pipe buf定义的是内核管道缓冲区的容量,这个值

2017-05-18 00:55:27 416

原创 堆及topk问题

堆的本质 vector+向下调整算法/向上调整算法。 注意:这个二叉树为完全二叉树向下调整算法: 已知条件:从一个节点开始向下调整,已知这个节点的左右子树已经是大堆或小堆。 所以需要从第一个不是叶子节点的节点开始调整,而这个节点正好是最后一个节点的父节点。 i = (_v.size() - 2)>>1; i即是最后一个不是叶子节点的节点。以小堆为例:1.以删除堆顶元素为

2017-05-17 17:55:16 466

原创 探索文件描述符(fd)与FILE结构体之间的关系

文件描述符(fd)对于linux而言,所有对设备(对于linux而言,一切皆文件)和文件的操作都使用文件描述符来进行的。文件描述符是一个非负的整数,它是一个索引值,指向内核中每个进程打开文件的记录表。当打开一个现存文件或创建一个新文件时,内核就向进程返回一个文件描述符用于后续对文件的读写操作;当需要读写文件时,也需要把文件描述符作为参数传递给相应的函数。通常情况下,将一个程序从硬盘加载到内存后

2017-05-09 14:09:28 5170

原创 迷宫及走迷宫时的最优解

1.递归走迷宫: (利用回溯法)#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>using namespace std;#include<cassert>struct Pos//设置坐标{ Pos(int x, int y) :_x(x) , _y(y) {} int _x; int _y;

2017-05-07 01:03:01 2888

原创 对称矩阵及稀疏矩阵浅谈

1.对称矩阵特点: 关于对角线对称,Aij == Aji。 下面实现: ①对称矩阵的压缩存储 ②对称矩阵的访问 ③对称矩阵的还原实现代码如下:#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>using namespace std;//对称矩阵的压缩存储template<class T>class SymmetricMatrix

2017-05-07 00:28:52 2952

原创 二叉树的基本操作

1。二叉树的特点:二叉树的特点: 1.每个节点最多有两棵子树,即二叉树中不存在度大于2的节点(分支数最大不超过2) 2.二叉树的子树有左右之分,也就是说二叉树是有序的。2。二叉树的基本操作(递归):以下面的二叉树为例:1.求二叉树的节点个数: 思路: (1)root 为空(整个二叉树的根节点为空) return 0; (2)root不为空 —>左子树的节点个数 + 右子树的节点

2017-05-07 00:08:02 1141

原创 模拟实现list(iterator)

说明:list的erase存在迭代器失效问题,本文给出两种解决方法,其中的一种是stl中给出的解决方法。 //List.h#pragma once#define _CRT_SECURuE_NO_WARNINGS 1#include<iostream>using namespace std;#include<cassert>//nodetemplate<class T>struct Li

2017-04-28 19:18:00 488

原创 模拟实现vector

vector.h#pragma once#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>using namespace std;//vector的插入和删除都存在迭代器失效的问题,解决方法将插入和删除的函数//的参数给成引用,可以达到如下结果:当上述两个函数内部迭代器失效,也会使得//外部的迭代器也同样失效,那么就要在函数内部将其重置

2017-04-28 19:12:38 535 2

原创 了解c++中的类型转换

1、static_cast(隐式类型转换)—–>相关类型的转换static_cast用于非多态类型的转换(静态转换),任何标准转换都可以用它,但 它不能用于两个不相关的类型进行转换。 2、reinterpret_cast(强制类型转换)reinterpret_cast操作符用于将一种类型转换为另一种不同的类型。 3.const_cast(去const属性的类型转换)const_cas

2017-04-21 15:52:07 310

原创 递归算法总结

下面总结一些常见的递归编程题: 1.使用递归逆序打印单链表:#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>using namespace std;struct Node{ Node(int data) :_data(data) , _next(NULL) {} int _data; Nod

2017-04-21 14:29:18 431

原创 表达式求值(中缀转后缀及后缀表达式求值)

。中缀表达式转后缀表达式:中缀表达式转后缀表达式遵循以下原则: 1.遇到操作数,直接输出; 2.栈为空时,遇到运算符,入栈; 3.遇到左括号,将其入栈; 4.遇到右括号,执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出; 5.遇到其他运算符’+”-”*”/’时,弹出所有优先级大于或等于该运

2017-04-21 13:05:59 29906 6

空空如也

空空如也

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

TA关注的人

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