自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Jack的博客

The more you know, the more you don't understand

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

转载 nginx配置之proxy_pass路径加斜杠/以及包含路径的区别

nginx配置看似简单,但一些细节配置经常被大家忽略。在proxy_pass中1.proxy_pass包含路径如 http://127.0.0.1:8080/abc 和http://127.0.0.1:8080规则都有区别。2.proxy_pass结尾加斜杠/和不加斜杠的有区别下面四种情况分别用http://192.168.10.1/proxy/test.html 进行访问。第一种(末尾加斜杠,proxy_pass中不包含路径):location /proxy/ {proxy_pass ht

2021-11-16 11:36:24 7765

原创 docker部署-flask集成allure提供测试报告查看,uwsgi只能启动一个worker进程

flask集成allure测试报告,提供pytest执行测试用例接口和查看allure报告接口。pytest+allure执行和收集测试报告可支持多方方式集成,和Jenkins、gitlab集成等。与Jenkins集成解决方案往上很多,不再赘述。和gitlab集成可参考https://github.com/allure-framework/allure2/issues/891。之前做过与Jenkins集成,但是在查看allure报告的时候有时候会遇见某个测试case结果404的情况。今天将以与flask

2020-07-19 23:17:58 1234

原创 gitlab-ci+docker+supervisor+uwsgi部署踩坑,使用uwsgi,如何查看500错误?

需求:搭建了autotest自动化工程,结合了flask,目的是将autotest中的方法开放接口出去(存在跨语言调用),并且开放了自动化测试接口出去(pytest+allure),以便可以实现调用接口跑case。部署:gitlab-ci+docker+supervisor+uwsgidocker和docker-composedocker容器必须以前台进程启动CMD 容器启动命令这里踩了个坑,一直尝试在Dockerfile中以后台进程运行服务,结果发现容器启动了就会立马退出,所依赖的服务也不在。这

2020-06-11 08:55:48 1194

原创 Run GitLab Runner in a container (Docker in docker)

GitLab Runner 官方文档:https://docs.gitlab.com/runner/支持一下运行环境:详情见上述文档。Install using GitLab’s repository for Debian/Ubuntu/CentOS/RedHat (preferred).Install on GNU/Linux manually (advanced).Install on...

2020-01-08 09:37:34 3625

原创 java-使用keytool信任自签证书,需要重启

目前我司的技术栈是Java和Python,且都调用第三方的服务,因此需要mock第三方的服务以便开发测试使用。之前已整理过[Python requests信任自签证书的问题]。(https://blog.csdn.net/windy135/article/details/79861209)因此这次需要再Java中mock第三方服务。java官方文档:1、使用keytool工具生成证书,然后将c...

2019-06-17 09:19:52 6372

转载 python进程线程详解

如下是目录结构:多进程 multiprocessing进程池 Pool子进程进程间通信进程小结多线程Lock多核CPUThreadLocal进程 vs. 线程线程切换计算密集型 vs. IO密集型异步IO分布式进程对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启...

2019-05-29 08:25:21 385

原创 CentOS 7 安装MongoDB详细步骤 及 supervisor 管理MongoDB踩坑

安装MongoDB:创建/etc/yum.repos.d/mongodb-org-4.0.repo文件,编辑内容如下:[mongodb-org-4.0]name=MongoDB Repositorybaseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/gpgcheck=1enable...

2019-05-16 12:33:03 946

原创 Supervisor 管理进程详解

Supervisor 是一个用 Python 实现的进程管理工具,可以很方便地启动,关闭,重启,查看,以及监控进程,当进程由于某种原因崩溃或者被误杀后,可以自动重启并发送事件通知。Supervisor 可谓运维利器,使用 Supervisor 来管理进程,可以提高系统的高可用特性。注意:supervisor管理这些进程是把他们当做自己的子进程来管理,还有supervisor不能管理以daemon...

2019-05-14 13:14:47 4599 1

转载 Java HTTP 组件库选型看这篇就够了

最近项目需要使用 Java 重度调用 HTTP API 接口,于是想着封装一个公用的 HTTP client lib. 这个库需要支持以下特性:1、连接池管理,包括连接创建和超时、空闲连接数控制、每个 host 的连接数配置等。基本上,我们想要一个 go HTTP 标准库自带的连接池管理功能。2、域名解析控制。因为调用量会比较大,因此希望在域名解析这一层做一个调用端可控的负载均衡,同时可以对每...

2019-05-02 14:46:49 506

转载 @RequestParam、@RequestBody和@ModelAttribute(application/x-www-form-urlencoded, application/json)

@RequestParamA) 常用来处理简单类型的绑定,通过Request.getParameter() 获取的String可直接转换为简单类型的情况( 由String到 简单类型的转换操作由ConversionService配置的转换器来完成);因为使用request.getParameter()方式获取参数,所以可以处理get 方式中queryString的值,也可以处理post方式中 b...

2019-04-29 23:30:54 1950

转载 HttpServletRequest request 获取form参数的两种方式

@RequestMapping(value="/query",method = RequestMethod.POST) public String buildRequest(HttpServletRequest request){ // 方式一:getParameterMap(),获得请求参数map Map<String,String> parmMap=new Hash...

2019-04-29 23:19:05 9588

转载 springboot+idea热部署

spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用。devtools的原理深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoa...

2019-04-22 08:03:14 132

转载 证书(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)

SSLSSL - Secure Sockets Layer,现在应该叫"TLS",但由于习惯问题,我们还是叫"SSL"比较多.http协议默认情况下是不加密内容的,这样就很可能在内容传播的时候被别人监听到,对于安全性要求较高的场合,必须要加密,https就是带加密的http协议,而https的加密是基于SSL的,它执行的是一个比较下层的加密,也就是说,在加密前,你的服务器程序在干嘛,加密后也一样...

2019-04-19 07:18:12 856

转载 使用spring validation完成数据后端校验

简述JSR303/JSR-349,hibernate validation,spring validation之间的关系。(1)JSR303是一项标准,JSR-349是其的升级版本,添加了一些新特性,他们规定一些校验规范即校验注解,如@Null,@NotNull,@Pattern,他们位于javax.validation.constraints包下,只提供规范不提供实现。(2)而hiberna...

2019-04-15 09:00:35 354

原创 SpringBoot构建RESTful service完成Get和Post

SpringBoot构建RESTful service完成Get和Post一个基本的RESTfule service最进场向外提供的请求Method就是Get和Post。在Get中,常用的都会在请求上带上参数,或者是路径参数。响应Json。在Post中,常用的会提交form data或者json data作为参数,响应Json。1. Get请求,url传参,返回json。先准备一个请求后...

2019-04-15 08:41:27 668

转载 Java中int与Integer、Long与long的区别

Long与long究竟有什么区别呢?无外乎,int与Integer!我们知道Java的数据类型分两种:1.基本类型:long,int,byte,float,double,char …2.对象类型(类): Long,Integer,Byte,Float,Double,Char,String … 其它一切java提供的,或者你自己创建的类。其中Long叫 long的包装类。Integer、B...

2019-04-09 10:16:49 8616

原创 long(Long)与int(Integer)之间的转换

1.将long型转化为int型,这里的long型是基础类型:long a = 10; int b = (int)a;2.将Long型转换为int 型的,这里的Long型是包装类型:Long a = 10; int b=a.intValue();3.将Long型转换为 Integer 型的,这里的Long型是包装类型:Long a = 10;; Integer b=a.intV...

2019-04-09 10:11:57 86960 1

转载 Lombok

前提项目代码中用 Lombok 的都用了,毕竟这么好的轮子要充分利用好。也可以减少一些 get/set/toString 方法的编写,虽说 IDEA 的插件可以自动生成 get/set/toString 方法,但是使用 Lombok 可以让代码更简洁。下面看看如何在 IDEA 中如何安装 Lombok:安装打开 IDEA 的 Settings 面板,并选择 Plugins 选项,然后点击 ...

2019-04-02 20:36:59 305

原创 MongoDB删除字段

使用update命令update命令update命令格式:db.collection.update(criteria,objNew,upsert,multi)参数说明:criteria:查询条件objNew:update对象和一些更新操作符upsert:如果不存在update的记录,是否插入objNew这个新的文档,true为插入,默认为false,不插入。multi:默认是fal...

2019-03-12 07:50:27 2459

原创 Ubuntu 安装和使用 Supervisor(进程管理)

Supervisor 是一个用 Python 写的进程管理工具,可以很方便的对进程进行启动、停止、重启等操作。安装命令:$ apt-get install supervisor安装成功后,会在/etc/supervisor目录下,生成supervisord.conf配置文件。你也可以使用echo_supervisord_conf &amp;gt; supervisord.conf命令,生成默认的...

2019-02-14 08:51:26 2219

转载 Python 进程管理工具 Supervisor 使用教程

Supervisor 是基于 Python 的进程管理工具,只能运行在 Unix-Like 的系统上,也就是无法运行在 Windows 上。Supervisor 官方版目前只能运行在 Python 2.4 以上版本,但是还无法运行在 Python 3 上,不过已经有一个 Python 3 的移植版 supervisor-py3k。什么情况下我们需要进程管理呢?就是执行一些需要以守护进程方式执行的...

2019-02-14 08:43:40 444

转载 使用 lsof 代替 Mac OS X 中的 netstat 查看占用端口的程序

OS X 的 netstat 不能查看使用端口的程序名,而且也没找到 GNU 版本,于是去搜了一下解决办法,stackoverflow 上的结论基本都是建议使用 lsof 代替 netstat 进行查看:sudo lsof -nP -iTCP:端口号 -sTCP:LISTEN -n 表示不显示主机名 -P 表示不显示端口俗称 不加 sudo 只能查看以当前用户运行的程序另外,还可以通过...

2018-12-31 01:37:15 2599

原创 python kill process两种思路

使用subprocess库执行shell操作。一、直接使用shell杀进程import subprocesssubprocess.check_output("for p in `lsof -n -i:8080 | grep LISTEN | awk '{print $2}'`; do kill -9 $p; done", shell=True)二,先拿到进程号,在killport = ...

2018-12-31 01:27:16 6031

原创 python执行系统命令常用方法(subprocess、os、commands)

一、subprocess模块 (-- Python3.x)使用 subprocess.check_output() 函数。例如:import subprocessout_bytes = subprocess.check_output(['netstat','-a'])这段代码执行一个指定的命令并将执行结果以一个字节字符串的形式返回。如果你需要文本形式返回,加一个解码步骤即可。例如:o...

2018-12-30 23:25:46 2619

原创 python属性访问顺序 --描述符、__getattr__()

在Python中,访问一个属性的优先级顺序按照如下顺序:1、_getattribute_()2.类属性3.数据描述符4.实例属性5.非数据描述符6.__getattr__()方法需要注意的是:类属性和实例属性属于不同的属性集,因此这里类属性排序并不严谨。首先来说下什么是描述符。官方的定义:描述符是一种具有“捆绑行为”的对象属性。访问(获取、设置和删除)它的属性时,实际是调用特殊的...

2018-11-09 09:59:42 2078

原创 闭包(setter、getter) --访问定义在闭包内的变量

问题:我们希望通过函数来扩展闭包,使得在闭包内层定义的变量可以别访问和修改一般来说,在闭包内存定义的变量对于外界来说是完全隔绝的。但是,可以通过编写存取函数(acessor function,即getter/setter方法)并将它们作为函数属性附加到闭包上,来提供对内存变量的访问支持def sample(): n = 0 # 闭包...

2018-10-04 15:47:00 489

原创 闭包(保存变量) --在回调函数中携带额外状态的几种方法

问题: 希望编写回调函数可以携带额外的状态以便在回调函数内部使用首先定义一个回调函数:def apply_async(func, args, *, callback): result = func(*args) callback(result)使用示例:def print_reqult(result): """ 仅接受一...

2018-10-04 15:27:00 452

原创 闭包(closure) --用函数替代只有单个方法的类

问题:我们有一个定义了一个方法的类(__init__()除外)。但是,为了简化代码,我们希望用一个简单的函数替代解决方案:只有单个方法的类可以通过闭包将其转换成函数示例:现有一个类,允许通过某种模板方案来获取URLfrom urllib.request import urlopenclass UrlTemplate: def __init...

2018-10-04 14:36:00 421

原创 functools.partial() --让带有n个参数的可调用对象以较少的参数形式调用

函数functools.partial()允许我们给一个或多个参数指定固定的值,以此减少需要提供给之后调用的参数数量。举个例子:def spam(a, b, c, d): print(a, b, c, d)s1 = functools.partial(spam, 1) # a = 1s1(2, 3, 4) # 1 2 3 4s2 ...

2018-10-04 14:17:00 829

原创 lambda --定义匿名或内联函数 --并且实现绑定变量的值

问题:需要提供一个短小的回调函数为sort()这样的操作使用,但是又不想通过def语句编写一个单行的函数解决方案:像这种仅仅完成表达式求值的简单函数可以通过lambda表达式来替代# 示例1:add = lambda x, y: x + yprint(add(1, 2)) # 3# 示例2:lambda表达式可用在如下的上下文环境中,比如排序...

2018-10-04 13:46:00 698

原创 函数的常用参数定义及返回

问题1:我们想编写一个可接受任意数量参数的函数解决方案:1、要编写一个可接受任意数量的位置参数的函数,可以使用以*开头的参数def avg(first, *rest): """ rest是一个元组 """ return (first + sum(rest)) / (1 + len(rest))print(avg(2))print...

2018-10-04 13:06:00 518

原创 heapq.merge() --合并多个有序序列,再对整个有序序列进行迭代

问题:我们有一组有序序列,想对它们合并在一起之后的有序序列进行迭代使用heapq.merge()函数来解决这个问题import heapqa = [1, 3, 7, 10]b = [2, 5, 6, 11]for c in heapq.merge(a, b): print(c) 1235671011总结:1、...

2018-10-03 21:07:00 864

原创 生成器(yield [from]) --使用的两个例子

使用示例1:创建处理数据的管道具体描述:我们想以流水线式的形式对数据进行迭代处理(类似Unix下的管道)。比方说我们有海量的数据需要处理,但是没法完全的将数据加载到内存中去。解决方案:生成器函数是一种实现管道机制的好方法(具体代码不做描述了,这里简单介绍下原理)原理剖析:1、yield语句表现为数据的生产者,for循环表现为数据的消费者;2、由于...

2018-10-03 20:55:00 342

原创 itertools.chain() --在不同的容器中进行迭代

问题:我们需要对许多对象执行相同的操作,但是这些对象包含在不同的容器内,而我们希望可以避免写出嵌套循环,保持代码的可读性解决方案:使用itertools.chain()可以解决这个问题,它接受一系列可迭代对象作为输入并返回一个迭代器(实际上是在对多个容器进行迭代)import itertoolsa = [1, 2, 3, 4]b = ['x', '...

2018-10-03 19:37:00 371

原创 zip() --同时迭代多个序列

1、可以使用zip()函数来同时迭代多个序列xpts = [1, 5, 4, 2, 8, 10]ypts = [100, 121, 78, 37, 23]for x, y in zip(xpts, ypts): print(x, y) 1 1005 1214 782 378 23zip(a, b)的工作原理是创建出一个迭...

2018-10-03 19:20:00 493

原创 enumerate() --以索引-值对的形式迭代序列

问题:迭代一个序列,但是又想记录下序列中的当前处理到的元素索引使用内建的enumerate()函数来解决my_list = ['a', 'b', 'c']for index, value in enumerate(my_list): print(index, value) 0 a1 b2 c# 可以传入一个start参数作为...

2018-10-03 15:09:00 607

原创 itertools --迭代所有可能的组合或排列

问题:想对一系列元素所有可能的组合或排列进行迭代1、itertools.permutations() 它接受一个元素集合,将其中的元素排列为所有可能的情况,并以元组序列的形式返回import itertoolsitems = ['a', 'b', 'c']for p in itertools.permutations(items): pr...

2018-10-03 14:40:00 1228

原创 itertools.dropwhile() --跳过可迭代对象中前一部分元素

1、使用itertools.dropwhile(),只要提供一个函数和一个可迭代对象即可(该函数起到过滤作用,满足条件的值都会丢弃直到有元素不满足为止)示例:文件开头有一些注释行,想跳过所有的初始注释行with open('/etc/passwd') as f: for line in f: print(line, end=''...

2018-10-03 14:21:00 837 1

原创 itertools.islice() --对迭代器做切片操作

问题:迭代器和生成器是没没法执行普通的切片操作的,这是因为不知道它们的长度是多少(而且它们也没有实现索引),那么如何切片?解决方案:使用itertools.islice()来对迭代器和生成器做切片操作def count(n): while True: yield n n += 1c = count(0) #...

2018-10-03 13:51:00 7446

原创 将生成器函数定义到类中

问题:想定义一个生成器函数,但是他还涉及一些额外的状态,我们希望能以某种形式将这些状态暴露给用户解决方案:实现一个类,将生成器函数代码放到__iter__()方法中即可import collectionsclass linehistory: def __init__(self, lines, histlen=3): self...

2018-10-03 13:29:00 295

空空如也

空空如也

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

TA关注的人

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