自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 搭建Appium+python的UI自动化测试环境

关于UI自动化有很多测试框架,之所以选择appium是因为平台的通用性以及广泛性,因此选用这款框架作为UI自动化测试框架1、安装java环境以及android sdk(sdk安装的详细教程见此链接:https://www.cnblogs.com/gufengchen/p/11038029.html)验证是否安装成功,可以采用以下两行命令,adb没有连接设备的时候会出现以下提示2、安...

2019-11-06 14:18:11 372

原创 JavaSE之面向对象编程-类与对象

面向对象的三大特性:封装、继承和多态。 C++和Java都是面向对象编程。因此他们都有这三大特性 关于类和对象在C++里之前有提到 类是一个抽象的概念,而对象是一个具体的事物,因此对象是类的实例化在Java里同样如此。在Java中类的组成 1、方法(操作的行为) 2、属性(变量,描述每个对象的特点)示例:定义一个完整的类class Person{ private String na

2017-11-02 14:33:50 403

原创 JavaSE之数据类型与运算符

Java标识符,有三点要求标识符由字母、数字、_、$所组成,其中不能以数字作为开头,也不能用java中的关键字标识符采用有意义的简单命名$不要再代码中出现对于类和变量的命名,java的标准命名规范为驼峰法以大写开头如果有多个单词每个单词的开头大写for example:FirstNameJava 的关键字和C++类似但又有所不同 java的关键字如下用于定义访问

2017-11-02 13:32:02 369

原创 关于正则表达式

正则表达式专门来操作字符串正则表达式的功能:匹配、切割、替换、获取grep 文本过滤egrep 通过扩展正则过滤fgrep  快速prepawk   文本处理sed    从输入中读取信息,经编辑后输出grep 命令语法-E 使用扩展正则表达式进行匹配-F  使用固定字符串匹配-i 匹配时忽略大小写差异正则表达式的组成普通字符:普

2017-11-01 12:44:27 460

原创 shell脚本变量

环境变量和本地变量,环境变量是具有全局属性的。 在交互式shell下面定义变量:VALUE=100 这定义的即为本地变量,如果要将其变成环境变量则需要export VALUE 导出环境变量,取消环境变量则可以使用unset命令。 环境变量是可以被子进程继承的更是可以被子子孙孙都继承的。环境变量在程序替换掉的时候默认是不会被替换掉的。变量的拼接 shell环境变量 例如PWD HOME HO

2017-10-14 17:31:26 337

原创 基于UDP的网络群聊系统

因此我们首先需要编写server端、client端 畅聊系统主要采用UDP协议因此他不要进行listen和accept 但是我们的server端依旧需要绑定ip和端口号 首先我们的server服务器使用生产者消费者模型,生产者要从网络中拿取数据,拿到的数据要放入数据池中,消费者要从数据池中取数据通过过类似广播的形式发送给每一个client端。

2017-08-28 01:44:35 545 1

原创 【剑指offer24】输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。首先二叉搜索树的性质就是左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。,后序遍历即(左 右 根)这道题和重建二叉树的思想一样,首先找到根节点,最后划分出左

2017-08-25 20:48:22 502

原创 为什么需要项目管理软件

产品经理:定义产品的需求 开发人员:实现需求,查看他的需求,就可以看到,然后就将需求开发,之后转到测试经理让测试经理去分配任务 测试经理:分配测试任务,制定测试计划 测试人员:进行测试,发现bug,提交bug 每一个角色都有自己的账号 通过缺陷管理工具就可以流转 每个人也知道要做什么事情,提高工作效率

2017-08-22 17:03:18 1043

原创 单例模式

单例模式也叫单件模式。 Singleton是一个非常常用的设计模式,几乎所有稍微大一些的程序都会使用到它,所以构建一个线程安全并且 高效的Singleton很重要。 1. 单例类保证全局只有一个唯一实例对象。 2. 单例类提供获取这个唯一实例的接口。 设计单例模式有两种方式: 1、懒汉模式: 什么叫做懒汉模式呢?就是只有在第一次来调用的时候才会实例化这个对象。 简单的实现一个懒汉模式下

2017-08-03 11:44:44 297

原创 I/O多路转接之epoll模型

epoll是性能最好的没有之一 epoll有三个系统调用函数 epoll_create 创建文件描述符、来标识epoll模型 epoll_ctl epoll_wait #include<stdio.h>#include <sys/epoll.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/time.h>

2017-08-02 10:21:12 343

原创 I/O多路转接之poll

相较于select模型 1、poll模型已经没有了文件描述的限制,理论上可以无限大 2、poll模型的输入输出型参数不再是同一个,它的输入输出参数分离,并且不需要更新poll模型的优点:解决了select的两个缺点,它比多线程多进程占用的资源少,性能好 缺点:但是在poll一次监视的文件描述的个数过多时,它有可能来不及处理,它在后期也需要遍历,性能会随着用户的增多而性能下降include<st

2017-08-02 09:42:48 230

原创 I/O多路转接之select服务器

select 服务器 发生了改变就是读事件写事件就绪 文件描述符通常关心读事件、写事件、异常事件 也可以关心至少一个或者有多个事件 select是系统调用接口 只负责等,一次等多个文件描述符就绪之后select就会返回通知上层int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct t

2017-08-02 09:24:48 311

原创 C语言如何实现继承和多态

使用函数指针来实现继承和多态#include <stdio.h>#include <stdlib.h>struct Base_Vptr //虚函数表{ void(*fun1)( void*); void(*fun2)( void*);};struct Base{ struct Base_Vptr* base_v

2017-07-29 09:56:12 397

原创 TCP为什么要进行三次握手四次挥手

先看一下三次握手的过程: 为什么要进行三次握手而不是两次握手呢? 假设是两次握手的情况下:A向B发了一个第一个请求连接报文,此时又于选择了一条较长的路径导致这个请求,传输的时间较长,以致延误到连接释放以后的某个时间才到达server,但是此时A认为发了一个请求连接的报文B没有收到,因此A进行重传,此时这个新的请求连接报文B很快就收到了,于是B向A发送确认报文段,同意连接,于是A和B开始互发数

2017-07-25 19:01:00 712

原创 socket套接字编写多线程多进程的server和client

关于套接字编程 套接字编程 IP地址+端口号就成为套接字 在TCP协议中。建立两个连接的进程个字有一个socket来标识,那么这两个socket组成desocketpair就表示一个唯一链接 socket用来描述网络连接一对一关系 socket地址的数据类型及相关函数 第一个是通用接口 第二个表示IPV4的地址使用socketaddr_in 第三个表示预间套接字 这样我们只需要

2017-07-25 12:51:30 978

原创 STL之空间配置器

最近在看侯捷老师写的STL源码剖析,想通过看优秀的代码来提高自己的编程水平。 首先STL提供了六大组件,彼此可以套用使用。 借助一张从书上截的图来表明: Container通过Allocator来获取数据存储空间 Algorithms通过迭代器来获取Container的内容,Functors可以协助Algorithms完成不同策略变化 Adapter可以修饰或者套接Functor由此可

2017-07-22 11:39:55 475

原创 URG和PSH

URG: 急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。T C P的紧急方式是发送端向另一端发送紧急数据的一种方式。紧急指针指向包内数据段的某个字节(数据从第一字节到指针所指字节就是紧急数据,不进入接收缓冲就直接交给上层进程,余下的数据要进入接收缓冲的)值得注意的是即使窗口为0时也可以发送紧急数据,紧急数据不进入接收缓冲区直接交给上层进程。 PSH:当两个应用进程进行

2017-07-20 23:24:21 375

原创 tcp定时器

我们都知道,TCP发送的报文段是要交给IP层传送的,但IP层只能提供尽最大努力服务。也就是说TCP下面的网络所提供的是不可靠传输。因此TCP必须采取适当的策略。而定时器就发挥作用。 TCP管理的4个不同的定时器:1.重传定时器:用于当希望收到另一端的确认。2.坚持定时器:使窗口大小信息保持不断流动。3.保活定时器:检测TCP空闲连接的另一端何时崩溃或重启。4.2MSL定时器:测量一个连接处于TIM

2017-07-16 14:22:22 296

原创 端口分类

一、端口 通俗地讲,端口(Port)就是电脑向网络开放的信息出入“门户”。和小区大门不同的是,在电脑上这种“门户”有个256×256(65535)个,而且它们还有多种状态。1.端口的分类 根据端口和服务的绑定情况,端口可分为公认端口、注册端口和动态端口。 公认端口:0~1023。这个范围内的端口系统一般保留给一些常用的系统服务,比如WEB服务使用80端口,FTP服务使用21端口

2017-07-16 13:59:28 4024

原创 crond和crontab

Crond是linux系统用来定期执行命令或指定程序任务的一种服务或软件。一般情况下,我们安装完CentOS5/6linux操作系统之后,默认便会启动Crond任务调度服务。Crond服务会定期(默认每分钟检查一次)检查系统中是否有要执行的任务工作。如果有,便会根据其预先设定的定时任务规则自动执行该定时任务工作。这个Crond定时任务服务就相当于我们早上使用的闹钟一样。crontab是一个很方便的在

2017-07-16 10:46:15 331

原创 路由生产算法调研

路由算法是路由选择协议的核心。路由算法指明了计算机网络中的结点机(或路由器)在接收到一个分组之后,应该选择哪条输出链路的策略。当采用虚电路通信时,路由是在建立呼叫链接是确立的,即一次性选择路由,后继的分组均沿着这条既定的路由传送。当采用数据报通信时,路由器要为每个分组做出路由选择。因此通信子网采用不同的通信方式,路由算法的使用额度是不一样的。 一个实际的路由算法不可能做到尽善尽美,只能比较接近理想

2017-07-12 16:28:06 373

原创 NAT技术与代理服务器

什么是NAT技术: NAT(Network Address Translation,网络地址转换)是1994年提出的。当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但现在又想和因特网上的主机通信(并不需要加密)时,可使用NAT方法。 这种方法需要在专用网连接到因特网的路由器上安装NAT软件。装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全

2017-07-11 16:18:32 669

原创 浅谈ARP协议

OSI模型中ARP协议属于链路层;而在TCP/IP模型中,ARP协议属于网络层。 在这里只谈TCP/IP模型 ARP协议是一种地址解析协议,在实际应用中 ,我们经常会遇到这样的问题,已经知道啦一个主机的IP地址,需要找出与之相应的物理地址,或者反过来已经知道了物理地址需要找出相应的IP地址。地址解析协议ARP和逆地址解析协议就是用来解决这样的问题的。 IP地址是表示网络中不同主机的地址,

2017-07-09 16:05:57 526

原创 可重入函数与线程安全

可重入函数: 可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误。 (1)可以在执行的过程中可以被打断; (2)被打断之后,在该函数一次调用执行完之前,可以再次被调用(或进入,reentered)。 (3)再次调用执行完之后,被打断的上次调用可以继续恢复执行

2017-07-09 10:52:09 536

原创 子进程的异步等待方式

SIGCHLD,在一个进程终止或者停止时,将SIGCHLD信号发送给其父进程,按系统默认将忽略此信号,如果父进程希望被告知其子系统的这种状态,则应捕捉此信号。#include<stdio.h>#include <sys/types.h>#include <sys/wait.h>#include<signal.h>void myhandler(int sig){ printf("i

2017-07-09 09:44:40 212

原创 CRC校验

差错控制 传输过程中可能会产生比特差错:1可能会变成0而0也可能变成1 为了保证数据传输的可靠性,在计算机网路输数据时,必须采用各种差错检测措施 循环冗余检验CRC 在数据链路层传送的帧中,广泛使用了循环冗余检验CRC技术 在发送端,先把数据划分成组,假设每组k个比特,假设待传送的一组数据M=101001(现在k=6)。我们在M的后面再添加差错检测用的冗余码一起发送冗余码的计算 用二

2017-07-09 08:44:16 1468

原创 并查集

并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中的这种数据结构叫做并查集。 已知有N个人和m对好友关系,如果这两个人士直接好友或者间接的好友(好友的好友….)则认为他们属于同一个朋友圈,n=5,m=3,r={{1,2},{2,3},{4,5}}求出这n个人里一共有多少个朋友

2017-07-06 10:39:17 300 2

原创 守护进程

守护进程也称精灵进程( Daemon),是运行在后台的⼀一种特殊进程。它独立于控制终端并 且周期性地执行某种任务或等待处理某些发生的事件。守护进程是⼀一种很有用的进程。 Linux的⼤大多数服务器就是⽤用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd 等。同时,守护进程完成许多系统任务。比如,作业规划进程crond等 Linux系统启动时会启动很多系统服务进程,这些系

2017-07-05 21:56:30 409

原创 归并排序

基本思想:将待排序的元素序列分成两个长度相等的子序列,为每一个子序列排序,然后将他们 合并成一个序列。合并两个子序列的过程称为两路归并.void _Merge(int*arr, int*tmp, int begin1, int end1, int begin2, int end2){ int index = 0; while (begin1 <= end1&&begin2 <= e

2017-07-05 11:13:24 171

原创 交换排序

void BubbleSort(int *arr,int n){ int end = n - 1; while (end > 0) { bool flag = false; for (int i = 0; i < end; ++i) { if (arr[i]>arr[i + 1])

2017-07-04 16:02:15 402

原创 选择排序和堆排序

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法,选择排序是一种时间复杂度为O(N^2)的算法void SelectSort(int*arr, int n){ int left = 0; int right = n;

2017-07-02 11:23:17 232

原创 生产者消费者模型

生产者消费者模型遵循三二一原则 三种关系:生产者和生产者 :互斥 消费者和消费者:互斥 生产者和消费者:同步与互斥 两种角色 一个交易场所条件变量的作用:判断临界资源中生产消费的条件是否成熟通常情况下互斥锁和条件变量搭配使用对单链表的操作#include<stdio.h>#include<pthread.h>#i

2017-07-02 08:21:22 303

原创 Linux下的SIGCHLD信号

在之前我们为了避免出现僵尸进程我们采用了两种方式 1、调用wait()函数使父进程去等待子进程。wait()是一种阻塞等待 2、调用waitpid()函数这也是父进程去等待子进程而waitpid()分为阻塞式等待和非阻塞式等待,轮询的方式就是建立在非阻塞等待的基础之上的而SIGCHILD信号也可以避免出现僵尸进程创建僵尸进程#include<stdio.h>#include <unistd.

2017-07-02 08:02:45 605

原创 Linux下mysleep的实现

第一种方式:mysleep的实现实际上是利用alarm(timeout)函数和利用pause函数将当前进程挂起pause函数使调用进程挂起直到有信号递达。如果信号的处理动作是终止进程,则进程终止,pause函数没有机会返回;如果信号的处理动作是忽略,则进程继续处于挂起状态,pause 不返回;如果信号的处理动作是捕捉,则调用了信号处理函数之后pause返回-1,errno设置为 EINTR, 所以p

2017-07-01 18:33:42 403

原创 直接插入排序和希尔排序

直接插入排序是先将第一个数当做有序区,然后对之后的数进行排序依次将它们放入有序区 void InsertSort(int*arr, int n){ for (int i = 0; i < n - 1; ++i) { int end=i; int tmp = arr[end + 1]; while (end >= 0)

2017-07-01 12:38:05 415

原创 信号屏蔽pending

实际执⾏行信号的处理动作称为信号递 达(Delivery),实际的处理方式有三种。 1、忽略带信号 2、默认处理动作 3、自定义处理动作 信号从产⽣生到递达之间的状态,称为信号未决(Pending)。 进程可以选择阻塞 (Block )某个信号。被阻塞的信号产⽣生时将保持在未决状态,直到进程解除对此信号的阻塞, 才 执⾏行递达的动作。 注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,

2017-06-27 15:54:47 347

原创 布隆过滤器

布隆过滤器实际上就是哈希和位图的结合 它的优点:速度快并且节省空间 它的缺点:存在误判(比如存在不同的字符串可能存在相同的ASCII,这样我们在判断的时候就会出现误判) 这样的误判一定是发生在 判断它存在的情况下 误判一定不会发生在 不存在的情况下 为了降低误判率,我们必须尽可能的减少哈希冲突 也就是一个Key值可以有多个映射的位置

2017-06-24 11:35:53 231

原创 二叉树求最短路径

#include<iostream>#include<stdlib.h>using namespace std;template <class T>struct BinaryTreeNode{ BinaryTreeNode(const T& data) :_data(data) , _left(NULL) , _right(NULL) { }

2017-06-17 18:48:08 2936

原创 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。 【腾讯】

40亿占多少个字节:4G 10个亿需要1G 一个整型需要4个字节,40亿个则需要16G 由于如果我们直接使用这种方式去存储需要16个G显然这是不可能的,因此我们需要用到下面的方式去存储,采用位图 我们用一个Bit位去标识一个数存在还是不存在 我们都是到一般字节是存储的最小单位 那么一个字节有8个位,巧妙的利用这一点来实现我们的位图 比如10我们先确定他存在第几个字节,再去确定它在第几个

2017-06-16 21:51:39 1693

原创 STL之map的使用方法

map的元素都是“实值/键值”所形成的一个对组。每个元素都有一个键,是排序的准则。每个键只能出现一次,不允许重复使用。map可以被视为关联式数组,也就是具有任意索引型别的数组。map就是一种红黑树的K,V模型 关于STL中map的使用方法:1、关于map迭代器的使用 这些迭代器迭代器的使用和set中迭代器的使用类似#include<iostream>#include<stdlib.h>#

2017-06-08 13:17:35 900

空空如也

空空如也

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

TA关注的人

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