Debian安装Apache和PHP

2019独角兽企业重金招聘Python工程师标准>>> 准备 养成习惯,先更新列表 sudo apt-get update sudo apt-get dist-upgrade apache 直接用 apt安装 sudo apt-cache search apache | grep 'apache2' 找到程序名,安装 sudo apt-get install apache2 安装好后开服务 sudo service apache2 start 在浏览器中输入地址,看到以下页面说明apache成功安装 php apt-get install php5-fpm php5-memcache php5-mysql 完成后输入 php -version 查看是否安装成功 这里注意一下,最好是先安装apache再安装php,这样php在安装的时候会连apache所要的文件一并安装。 到这里apache与php的安装结束。 转载于:https://my.oschina.net/ZhenyuanLiu/blog/2208366

LeetCode_5 最大子序和

题目 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 代码 class Solution: def maxSubArray(self, nums): """ :type nums: List[int] :rtype: int """ length = len(nums) for i in range(1,length): subMaxsum = max(nums[i] + nums[i-1],nums[i]) nums[i] = subMaxsum return max(nums) 结果:

Flask实现用户登录界面

# coding:utf8 # 一 导入包,会话存储包、渲染模块和请求包 from flask import Flask,render_template,request,session app = Flask(__name__) # 实例化Flask,传递name # 构建一个web服务器,打印hello /world/ @app.route("/") # 设置路由(url分发器) # 完整的url 127.0.0.1:5000/ def Web(): #首页信息 #用户名登录成功保存在session里面 if 'username' in session : return "用户已经登录" return "登录失败..." # 显示文本 @app.route("/context") def index(): #设置文本格式 return "<h1 style='color:blue'>Hello Web! --Flask</h1>" # 实现业务逻辑和展示相分离 @app.route('/login/',methods = ["POST","GET"]) #使用HTTP方法,GET:获取资源 POST:创建一个资源 def login(): #调用request里面的form表格获取username用户名信息 username = request.form.get('username') password = request.form.get('password') # 进行校验 if username == "User" and password == "

整数数组(3~900),长度为10万,,排序

1 package Test; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 import java.util.Random; 6 7 public class test { 8 /** 9 * 有一个整数数组,数组长度为10万,整数的范围位于3到900之间,请用Java实现时间复杂度尽可能低的排序算法(假设内存空间足够大) 10 * @param args 11 */ 12 public static void main(String[] args) { 13 Random rand=new Random(); 14 int max=900; 15 int min=3; 16 int arr[]=new int[10000]; 17 List list=new ArrayList<>(); 18 //生成数组 19 for(int i=0;i<10000;i++){ 20 arr[i]=rand.nextInt(max)%(max-min+1)+min; 21 list.add(arr[i]); 22 } 23 list.sort(null); 24 } 25 }

求两个数最大公因数的c语言程序

对于这个问题,我能想到的方法有三种: ①先找出这两个数中最小的那个,可以用i表示,然后用这两个数依次对i取余. 同时i不断减1,直到这两个数对i取余都为0;这时的i就为最大公因数 程序如下: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> int main(){ int a = 0; int b = 0; int i = 0; printf("输入 a b:"); scanf("%d%d", &a, &b); if (a > b){ i = b; } else i = a; while (a%i != 0 || b%i != 0){ i--; } printf("最大公因数为%d\n", i); system("pause"); return 0; } ②辗转相除法:用其中一个数除以另外那个数,再用除数除以得到的余数,重复这个过程,直到余数为0.余数为0的等式中那个除数就是最大公因数. 程序如下: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> int main(){ int a = 0; int b = 0; int i = 1; printf("

Jmeter教程(三) - Linux中使用命令行进行压测

Jmeter教程(一) - 入门 Jmeter教程(二) - 自定义变量模拟多用户 Jmeter教程(三) - Linux中使用命令行进行压测 本篇文章讲一下如何在linux上使用Jmeter进行压测。 1.Linux中安装Jmeter。 Jmeter安装包上传到Linux服务器并解压。 2.导出测试计划。 在Windows上先将测试计划配置好,然后导出为.jmx文件,这里命名为test.jmx。 3.将jmx文件上传到Linux服务器。 我这里在Jmeter安装目录下创建了一个文件夹MyTest存放jmx文件,方便管理。 4.运行压测。 使用jmeter.sh运行jmx文件,将压测结果输出到result.jtl文件中,命令如下。 sh ../bin/jmeter.sh -n -t test.jmx -l result.jtl 5.将result.jtl导入Windows中的Jmeter,即可查看压测结果。 PS 1.权限问题,报错如下: jmeter: Permission denied 解决方法,给Jmeter安装目录授权,执行如下命令: chmod -R 777 apache-jmeter-5.0

MongoDB主从集群、副本集与分片

在实际生产中,为了防止数据丢失,我们需要搭建主从集群来同步数据;有时候当数据库中的数据量很大的时候,一台服务器无法存储,这时我们需要扩展多台机器来存储我们的数据,这时需要用到MongoDB的分片操作。 转发请标明原文地址:【原文链接】 一、主从复制 对于主从复制的原理,非常简单,简单的说就是几台机器之间进行同步操作,我们在主节点上操作数据,需要同步到其他子节点上。下面我们来实战一下。 首先创建一个cluster文件夹,然后在该文件夹中创建两个子文件夹master和slave分别存放主从节点的数据文件。 下面我们启动两台mongod服务器,主节点端口号为10000,从节点端口号为10001,首先启动主节点: mongod --dbpath F:\mongodb-win32-x86_64-enterprise-windows-64-2.6.12\cluster\master --port 10000 --master 然后启动从节点,需要指定跟随的主节点地址: mongod --dbpath F:\mongodb-win32-x86_64-enterprise-windows-64-2.6.12\cluster\slave --port 10001 --slave --source localhost:10000 主从节点启动之后,我们连接主节点,插入数据,会发现主节点同步数据到从节点: 二、副本集 副本集具有自动故障恢复的功能。 主从集群和副本集最大的区别就是副本集没有固定的“主节点”;整个集群会选出一个“主节点”,当其挂掉后,又在剩下的从节点中选中其他节点为“主节点”,副本集总有一个活跃点(primary)和一个或多个备份节点(secondary)。 创建一个cluster文件夹并创建node1,node2,node3三个子文件夹。 三个节点的配置信息如下: 节点1: HOST:localhost:10001 Data File:D:\mongodb\dbs\node1 节点2: HOST:localhost:10002 Data File:D:\mongodb\dbs\node2 节点3: HOST:localhost:10003 Data File:D:\mongodb\dbs\node3 分别使用下面命令启动三个节点: #replSet参数指定副本集名称,后面初始化需要使用 mongod --dbpath D:\mongodb\dbs\node1 --port 10001 --replSet shinelon mongod --dbpath D:\mongodb\dbs\node2 --port 10002 --replSet shinelon mongod --dbpath D:\mongodb\dbs\node3 --port 10003 --replSet shinelon 启动之后会发现打印这样的错误日志: replSet can't get local.system.replset config from self or any seed (yet) 这时候需要登录到任意一个节点中进行初始化操作:

【学习笔之BugkuCTF】这是一张单纯的图片

【学习笔之BugkuCTF】这是一张单纯的图片 作为初入CTF的小萌新,看到CTF的第一题是一脸懵逼 点开这个链接后就给了这么一张图片. 显而易见,flag就在这张图片里面,可是就一张图有什么用呢? 将这张图片另存为,再用winhex软件打开这张图片 我们看到这一堆代码的最后有一串能看的懂的代码。我们可以联想到Ascll 码 那么我们来试着翻译一下 最后可以发现就是我们要的flag ,翻译之后就是key{you are right}

Jmeter教程(二) - 自定义变量模拟多用户

Jmeter教程(一) - 入门 Jmeter教程(二) - 自定义变量模拟多用户 Jmeter教程(三) - Linux中使用命令行进行压测 在上一篇文章 Jmeter教程(一) - 入门 中介绍了Jmeter的基本用法。本文会继续介绍如何使用Jmeter对一个带参数的http请求进行压测,以及如何设置多个变量模拟多用户发送请求。 一、如何创建带参数的请求 1. 首先新建一个http请求。 2.设置请求路径,并添加参数。 如下图所示,Path中填写请求路径,点击Add添加参数,有一个名为token的参数。 至此给带参数请求已创建完成,点击运行即可开始压测。 二、如何模拟设置多个变量,模拟多个用户请求接口 1. 新建Csv Data Set Config设置。 2.新建配置文件config.txt,配置用户信息。 文件名随便写,里面数据每行有两个值,userId和userToken,中间用逗号隔开,我这里设置了两个用户的信息。 3.引用配置文件。 Csv Data Set Config中引用配置文件config.txt,并定义变量名为userId和userToken。 4.请求中引用配置文件中的变量。 在填写参数Value的地方不要将值写死,而是写为${变量名}这种格式,我这里想要引用配置文件中userToken的值,所以写为${userToken}。 至此配置完毕,点击运行按钮,即可开始压测。

解决谷歌浏览器在F12情况下自动断点问题Paused in debugger

解决谷歌浏览器在F12情况下自动断点问题(Paused in debugger) 最近在使用谷歌浏览器在调试js脚本的时候,每次按F12,再刷新页面,都会跳出如上图所示的图标,自动进入断点调试。如果不想让它自动断点可以按一下3步去设置。 1.打开任何一个页面,按下F12,在弹出来的调试窗口找到“Sources"; 2.在右边找到XHR/fetchBreakpoints,展开,把"Any XHR or fetch"的勾选去掉; 3.再把调试窗口右上角的圆圈“pause”点击置灰,完毕。

MySQL数据库操作(五)——多表查询

个人博客:haichenyi.com。感谢关注 合并结果集 union all(包含相同行)、union(去除相同行) 把查询的结果合并到一起。要求: 查询的结果列数相同,列类型相同 create table emp( eid int, ename varchar(50), eage int ); create table stu( sid int, sname varchar(50) ); //合并结果集(加上all,包含相同的行) select eid,ename from emp union all select * from stu; //合并结果集(去掉all,去除相同行) select eid,ename from emp union select * from stu; 连接查询 内连接 方言: select * from 表1,表2 where 条件 表a有三条数据:q,w,e 表b有两条数据:h,j select * from a,b; 得出的结果是表a与表b的笛卡尔集,也就是会得到6条数据, 分别:qh,qj,wh,wj,eh,ej 去除无用的笛卡尔集,加上where后面的条件 连表查询会有附表的外键=主表的主键这个条件 select * from student,teacher where student.

拼多多 美团连续上市 互联网创业进入“土味时代”

金秋九月,美团点评正式在香港挂牌,两个月前的一个炎日,纳斯达克亚太区主席亲手将上市手钟从美国送至上海中心,交给了拼多多的消费者敲钟代表。 美团和拼多多的挂牌,标志着巨头们在一线大城市的正面主战场鏖战多年之后,五环外的“田间地头”与一线城市的街弄巷尾成为了互联网新贵的“土味时代”主战场,背后重要的战略级投资人——腾讯也籍此在提升互联网支付、云计算等基础设施服务份额方面受益良多。 按照市值计,美团一声锣响,当天即超京东和小米,仅次于BAT,而拼多多刚刚在一周前一度跃至第六大互联网公司,市值超300亿美金。 腾讯财务与业务份额双丰收 拼多多2017年共完成43亿笔订单,而美团在同年完成的交易笔数逾58亿笔,平均每天数千万笔订单背后,腾讯迅速成为互联网长尾支付这一巨大市场的最大赢家。 经过8年发展,如今美团已经成为中国最大的互联网生活服务平台,拼多多经过3年发展,成为了仅次于阿里和京东的第三大电商平台,但这背后的数字与代价各有不同。近三年,美团累计亏损了300多亿人民币,而拼多多三年也付出了13.12亿的亏损代价。 据美团点评更新后的招股书显示,经调整后2018年前4个月净亏损20亿元人民币。此外,2015、2016、2017连续三年亏损105亿元、58亿元和189亿元人民币,经过调整之后的亏损为59亿元、53亿元、28亿元人民币。 拼多多在2016年净亏损为人民币2.92亿元,在2017年亏损为人民币5.251亿元。受大幅扩张市场的需要,拼多多在2018年Q1的销售与市场支出达到12.17亿元,平台单季发生2.01亿元人民币净亏损。也就是说拼多多创业三年多,截至2018年Q1累计亏损(含期权支出)为13.12亿元人民币。 三亿用户成为互联网新贵门槛 拼多多财报显示,其年活跃用户高达3.4亿,2018年6月30日披露的月活跃用户数已达1.95亿,客单价从385元翻倍至763元。而美团的招股书显示,2015年至2017年,美团点评年度交易用户数分别为2.06亿、2.59亿、3.1亿;每位交易用户平均每年的交易笔数分别为10.4笔、12.9笔、18.8笔。 阿里巴巴曾披露其电商板块年活跃用户已超过6亿,腾讯披露微信年活跃账户数达到9.89亿。虽然数据无法与巨头比肩,但美团和拼多多的财报显示,在新兴小巨头们的战场上,能否年服务逾3亿用户,成为了一道竞争的衡量门槛。 小巨头们仍维持了“超级增速” 9月20日,王兴敲响了创业15年以来的第一记钟声。“一锤子”下去,4000亿港币。按实时股价计算,美团成为中国第四大互联网公司,市值仅次于BAT。 招股书显示,成立8年的美团,依旧维持着高速增长。2017年,美团完成交易超过58亿笔,交易金额约3570亿元。其中,年度活跃商家为440万,年度交易用户数达到3.1亿。在线商家数量从2015年的300万增长至2017年的550万,同期活跃商家从66%升至80%。 外卖是美团增长最快的部分。Trustdata发布的《2018年上半年中国移动互联网行业发展分析报告》中,2018上半年,美团外卖占据了59%的外卖市场,超过饿了么与百度外卖的总和,而且还在以更高的增速增长。 2015到2017年,美团外卖的收入从1.75亿元增长到210.32亿元,复合增长率高达996.3%;外卖收入的高速增长,带动整个美团的收入从40亿元增长到339亿元。 活下沉到田间巷尾的生意 不论是外卖,还是其他业务,美团的杀手锏都是其令对手闻风丧胆的“地推”铁军。早年间,如何找到并掌控商家是王兴最头疼的事情,他为此拜访后来美团地推军的统领干嘉伟,对方给出的答案是:长出来的肉才是自己的肉,在别人身上挖一块肉贴在身上也长不成自己的肉。言外之意,美团需要建立自己的地推铁军。 那之后,美团杀入各大领域,开辟多条战场,唯独地推这件事从来没有放缓过。时至今日,有评论认为美团之所以能迅速干成很多事情,最关键点便在于其深入“街弄巷尾”的绞杀能力,而这一点,恰恰是很多互联网企业所不具备的。 美团执着于街头,拼多多则直接下沉到了田间地头。数据显示,拼多多的3.4亿用户中,过半来自四五六线和城镇地区。针对乡村地区,拼多多设计了农货“上行+下行”的完整链条。截至6月,拼多多一共销售了367万吨农货,能装满8万节火车皮,成为中国最大的农产品经销平台,共有4000万消费者催生了12亿笔农货订单。同时,针对乡村市场,拼多多也通过渠道服务他们的消费升级,形成一个增加收入——提升生活品质的闭环。 由此可见,如今的互联网创业已经沾满“土味”,田间地头与街弄巷尾成为互联网新贵主战场。 增长的烦恼 王兴认为,增速大于一切,他曾引用硅谷名言“Keep growing, fuck everything else(只有增长是重要的,其他一切都不重要)”来阐述美团的发展逻辑。在他看来,只要能保持高速增长,所有的问题都至少在短期内能够被容忍,被掩盖,或者不会爆发。可能很多问题当时是个问题,你长大十倍、百倍之后它就不是问题了,甚至不需要解决它就自然而然地消失了。 并非所有人都认同增速理论。拼多多的增速是中国大型互联网企业中最快的,但在近期,它却饱受负面舆情的困扰。 不过,从结果看,上市后集中爆发的舆情,不仅没有影响拼多多的增速,反而帮助这家公司快速升级。按照拼多多的说法,“所有人都在帮忙挑毛病,平台正以钉钉子精神挨个解决”,笔者用之前媒体关注时的各类“涉山寨”品牌关键词一一尝试,均已无法透出。 针对“山寨”问题,拼多多也陆续推出一系列举措,包括8月展开“双打行动”,下架了超过430万件商品;围绕品牌升级,拼多多推出品牌馆,整合了包括网易严选在内的多个品牌;针对整个行业可能普遍存在问题的散装纸尿裤等商品,拼多多直接“一刀切”,率先于行业全量下架…… 重拳出击打假,是否会影响拼多多的增长速度,外界对此持有不同的看法。相关数据,在11月的第三季度财报上,应该会有所展现,这让人无比好奇且期待。 文/刘旷公众号,ID:liukuang110,本文首发旷创投网

java去除字符串中空格的几种方法

1.去掉首尾空格:String.trim(); 2.去掉首尾、中间所有空格:String str1 = str.replaceAll(" ", ""); 或replaceAll(" +",""); 3.去掉大部分空白字符, 不仅仅是空格:String str2= str.replaceAll("\\s*", "");

完美解决: VSCode 中文显示

首先打开VSCode 看到中间有一些提示的命令 选择第一条,即Ctrl+shift+P,弹出命令行,选择"Configure Display Language"(这里你可以输入一些关键词,比如Language) 弹出语言配置文件编辑界面,把从冒号开始的都删除,然后自己输入一个冒号,弹出的框里可以选择语言,这里选择简体中文 Ctrl+S保存后,关闭配置文件,然后点击左边栏的这个地方 输入Chinese 点击install 选择Yes,完成

修改 vscode 默认的终端

因本人实在忍受不了 vscode 的默认终端为 (powershell, cmd), 在工作时项目分支比较多, 需要经常切换分支, 但自带的终端很是傻叉, 需要自己使用 git 指令查看当前所在分支, 稍不留神就改错代码了, 为此很是苦恼, 查看了 vscode官方文档之后, 原来可以配置, 毫不犹豫换终端. 1. VS Code 自带终端显示效果 2. 修改默认终端为 git-bash 2.1 打开设置, 搜索shell 关键字 2.2 找到 Terminal › Integrated › Shell: Windows 设置项 2.3 将默认的终端修改为 git-bash.exe 的路径 3. 修改之后的效果 这下再也不怕搞不清当前所在的分支了, 小伙伴们, 快去设置吧, 简直爽到飞起.

Java去掉字符串最后的空格

在字符串的方法中,有一个方法叫trim,是用来去掉字符串中的首尾空格的一个方法,具体实现如下: public String trim() { int len = value.length;//value是一个字符数组 int st = 0;//表示字符串开始第一个不是空格的字符的下标 char[] val = value; /* avoid getfield opcode */ //表示从字符数组的头开始遍历 while ((st < len) && (val[st] <= ' ')) { st++; } //表示从字符数组的尾开始遍历 //len的最终值是字符串从尾部开始遍历第一个不是空格的字符下标 while ((st < len) && (val[len - 1] <= ' ')) { len--; } return ((st > 0) || (len < value.length)) ? substring(st, len) : this; } 效果如下: 现在我有个需求是去掉字符串的末尾空格,所以改造了一下这个trim方法的实现,具体代码如下所示: public String trimEnd(char[] value) { int len = value.

SQl 排序(字段里面包含字符,数字,以及英文)

/*这个可以排序中文和数字加字母组合!*/ select [字段] from [表名] order by LEN([字段]), [字段] /*这个可以排序中文数字!(列中只有中文数字)*/ select [字段] from [表名] order by charindex([字段],'一二三四五六七八九十') /*这个可以排序中文数字!(列中包含中文数字)*/ select [字段] from [表名] order by charindex('一',[字段]) desc, charindex('二',[字段]) desc , charindex('三',[字段]) desc , charindex('四',[字段]) desc , charindex('五',[字段]) desc, charindex('六',[字段]) desc , charindex('七',[字段]) desc , charindex('八',[字段]) desc, charindex('九',[字段]) desc , charindex('十',[字段]) desc

在VS Code 中修改默认的命令终端(shell)

在日常使用vscode编辑器中, 我们可以通过 Ctrl+反引号快捷键来调出终端面板, 如下图: 其中的shell(上图右下圈红部分)是可以设置的, 接下来,教大家如何更改默认的shell 1.在文件 -> 首选项 -> 设置中打开settings页面, 搜索shell或则找到Terminal>Integrated>Shell:Windows, 2.把地址切换成你需要以下的某个shell的地址(powershell, cmd, 和bash) powershell: "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe", cmd: "C:\\Windows\\System32\\cmd.exe", bash: "D:\\soft\\git\\bin\\bash.exe" 注:如果对你有帮助的,请帮我点个“赞”,如果有写的不好的,或有改进的地方,欢迎留言区评论,如果情况属实,我会优化改进该文章-----张小桀

推荐大家一块开发神器guiplan,自动写代码,一键保存

推荐大家一块开发神器guiplan,网站前端后端数据库等等 再也无需手敲代码。一键生成,一键保存效率是传统手写代码8倍以上,开发成本最少能降低5倍以上,产出速度能加快四倍以上,是程序员的春天,也是外包核心竞争黑科技,你还在等什么呢?赶快下载使用吧http://www.guiplan.com/#/

快捷键取色器

1.用QQ的截图键,然后按住ctrl键就可以看得到需要的颜色代码

Qt中使用串口发送十六进制指令

使用Qt的serial.write()发送十六进制指令 比如需要发送01 02 fa 32 使用write()函数发送字节数组QByteArray QByteArray array; array[0] = 0x01; array[1] = 0x02; array[2] = 0xfa; array[3] = 0x32; serial.write(array);

谷歌浏览器无插件保存网页为长图

windows: 打开你想截图的网页,按 F12,接着按Ctrl + Shift + P,在如下图所示的地方输入 capture ,如下图所示有三个选项。 分别是截取全屏、node 模式以及当前范围,选择对你想用的,我一直都是截全屏。 MAC: 截取网页长图: ⌘Command + ⌥Option + I 快捷键,打开调试界面; 按下 ⌘Command + ⇧Shift + P; 输入命令 Capture full size screenshot,或直接输入full即可找到这个功能,然后回车; Chrome 就会自动截取整个网页内容并保存至本地。

阿里图标库iconfont如何使用

1、在阿里图标库(http://iconfont.cn/)选择自己喜欢的一个或多个图标,效果如下图所示 2、网页右上角的小购物车, 3、这里我们选择下载代码。下载好了后在项目需要的地方解压。 4、这是我下载好的压缩文件以及解压后的文件。 5、下载好了以后,会看到有三个html文件,我们用浏览器打开,他是三种引入图标的方法,我们根据自己的需要自行选择。 6、举例子来说,我个人喜欢用 新建一个文件夹,名字自己取吧!我的叫font,放入这四个文件。与font平级的放iconfont.css html中的style: .iconfont{ color: blue; } @font-face { font-family: 'iconfont'; src: url('font/iconfont.eot'); src: url('font/iconfont.eot?#iefix') format('embedded-opentype'), url('font/iconfont.woff') format('woff'), url('font/iconfont.ttf') format('truetype'), url('font/iconfont.svg#iconfont') format('svg'); } .iconfont{ font-family:"iconfont" !important; font-size:16px;font-style:normal; -webkit-font-smoothing: antialiased; -webkit-text-stroke-width: 0.2px; -moz-osx-font-smoothing: grayscale; } body中 <body> <ul> <li><a href=""><!--<i class="iconfont icon-yifu"></i>-->1男装/女装</a></li> <li><a href=""><!--<span class="iconfont icon-15"></span>-->2鞋靴/箱包</a></li> <li><a href=""><i class="iconfont">&#xe666;</i>3家具</a></li> <li><a href=""><i class="iconfont">&#xe60f;</i>4家具</a></li> <li><a href=""><i class="iconfont">&#x3446;</i>5家具</a></li> </ul> </body> 这些图标都可以当成font来处理,改颜色大小之类的,都和文字一样。

猫眼测试开发面经(整理)

作者:小橘子454 链接:https://www.nowcoder.com/discuss/105746 来源:牛客网 一面:(60分钟) 1.输入一个网址,在浏览器中会发生什么? https://www.cnblogs.com/wenanry/archive/2010/02/25/1673368.html 2.了解同步与互斥吗?怎样解决互斥? 互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。 同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。 PV是用来解决互斥和同步问题的。Peterson算法才可以算正确的且简洁的解决 a. 关中断 b. 测试并加锁 TSL指令 c. 交换指令 XCHG 3.malloc,是怎样申请内存的? http://www.cnblogs.com/hanyonglu/archive/2011/04/28/2031271.html 4.堆和栈的区别 堆和栈的区别 https://iamjohnnyzhuang.github.io/java/2016/07/12/Java%E5%A0%86%E5%92%8C%E6%A0%88%E7%9C%8B%E8%BF%99%E7%AF%87%E5%B0%B1%E5%A4%9F.html 功能不同 栈内存用来存储局部变量和方法调用。 而堆内存用来存储Java中的对象。无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中。 共享性不同 栈内存是线程私有的。堆内存是所有线程共有的。 异常错误不同 如果栈内存或者堆内存不足都会抛出异常。 栈空间不足:java.lang.StackOverFlowError。堆空间不足:java.lang.OutOfMemoryError。 空间大小 栈的空间大小远远小于堆的。 5.写了一个数据库的查询语句,查询,成绩大于平均成绩60的学号 select S#,avg(score) from sc group by S# having avg(score) >60; https://bbs.csdn.net/topics/280002741 6.http请求的具体格式 https://blog.csdn.net/u010002184/article/details/78885733 7.get/post的区别 HTTP请求方法我这里只讨论GET方法与POST方法 l GET方法 GET方法是默认的HTTP请求方法,我们日常用GET方法来提交表单数据,然而用GET方法提交的表单数据只经过了简单的编码,同时它将作为URL的一部分向Web服务器发送,因此,如果使用GET方法来提交表单数据就存在着安全隐患上。例如 Http://127.0.0.1/login.jsp?Name=zhangshi&Age=30&Submit=%cc%E+%BD%BB 从上面的URL请求中,很容易就可以辩认出表单提交的内容。(?之后的内容)另外由于GET方法提交的数据是作为URL请求的一部分所以提交的数据量不能太大 l POST方法 POST方法是GET方法的一个替代方法,它主要是向Web服务器提交表单数据,尤其是大批量的数据。POST方法克服了GET方法的一些缺点。通过POST方法提交表单数据时,数据不是作为URL请求的一部分而是作为标准数据传送给Web服务器,这就克服了GET方法中的信息无法保密和数据量太小的缺点。因此,出于安全的考虑以及对用户隐私的尊重,通常表单提交时采用POST方法。 从编程的角度来讲,如果用户通过GET方法提交数据,则数据存放在QUERY_STRING环境变量中,而POST方法提交的数据则可以从标准输入流中获取。 8.平时怎么测试自己写的代码? 9.写一个链表公共节点查询 public class Solution14 { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { int l1=0,l2=0; ListNode n1,n2; n1=pHead1; n2=pHead2; //求两条链表的长度 while(n1!

stm32串口奇偶校验时出现bug总结

做的是工业传感采集器,现场采集的参数查询指令为FE FE 68 19 01 00 00 00 00 33 78 01 03 1F 90 01 E1 16 ,8位数据位,奇校验模式 串口设置: USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_Parity = USART_Parity_Odd; 代码写入: index = 0; Max3485SendBuf[index++] = 0xfe; Max3485SendBuf[index++] = 0xfe; Max3485SendBuf[index++] = 0x68; Max3485SendBuf[index++] = 0x19; Max3485SendBuf[index++] = 0x01; Max3485SendBuf[index++] = 0x00; Max3485SendBuf[index++] = 0x00; Max3485SendBuf[index++] = 0x00; Max3485SendBuf[index++] = 0x00; Max3485SendBuf[index++] = 0x33; Max3485SendBuf[index++] = 0x78; Max3485SendBuf[index++] = 0x01; Max3485SendBuf[index++] = 0x03;

STM32F1笔记(十)PWM

PWM:Pulse Width Modulation,脉冲宽度调制。是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单来说就是对脉冲宽度的控制。 在《STM32中文参考手册》里可以看到 占空比:占空比是指在一个脉冲循环内,通电时间相对于总时间所占的比例。占空比(Duty Ratio)在电信领域中有如下含义:例如:脉冲宽度1μs,信号周期4μs的脉冲序列占空比为0.25。(百度百科) STM32的定时器除了TIM6和TIM7,其他的定时器都可以用来产生PWM输出。其中高级定时器TIM1和TIM8可以同时产生多达7路的PWM输出。而通用定时器也能同时产生多达4路的PWM输出。这样,STM32最多可以同时产生30路PWM输出。 PWM初始化代码示例: void TIM3_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //定时器3通道2重映射 GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Period = arr; TIM_TimeBaseStructure.TIM_Prescaler =psc; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC2Init(TIM3, &TIM_OCInitStructure); //重要的一步,勿忘 //使能TIM3在CCR2上的预装载寄存器 TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_Cmd(TIM3, ENABLE); } PWM模式1和2的概念可在《STM32中文参考手册》找到

STL中vector、set容器元素的清空和内存的释放

元素的清空和内存的释放 在STL中,经常会使用到vector容器,而且是多次清空,多次存放数据,使用clear()只是清空元素,并不释放内存,可以使用swap()实现元素的清空和内存的释放。 vector<int>().swap(MyObject)可以清空元素,释放内存。 而对于set关联式容器,使用clear()即可。

如何学习计算机组成原理

最近看组成原理看得相当无聊,去网上找学习方法,找到一篇不错的文章。 《操作系统》是站在软件的角度看计算机的运行原理,《计算机组成原理》则是站在硬件的角度来看计算机的运行原理,因此这门课对于学习计算机的学生来说非常重要。我这里不谈怎么通过考试,相信对于现在的的大学考试来说,只要认真备考的都不会通不过,所以这里不谈怎么通过考试,而是谈怎么学到有用的东西。 对于以后想从事嵌入式系统、操作系统设计等和硬件结合比较紧密的工作的同学,我建议所有的内容都要学好,而如果以后想从事软件相关工作的同学也要学好存储器、输入输出系统、计算机的运算方法、指令系统、CPU的结构和功能等章节的内容,因为做大型系统软件会涉及到调优的问题,如果只懂软件,而不知道硬件在怎么运行的话,调优会受到限制,软件无法发挥硬件的最大优势。举一个简单的例子,我所在的公司以前开发过一套软件系统,在Intel的服务器上运行,一开始我们的软件运行效率非常低,然后Intel派了一个对硬件、软件都非常熟悉的团队来进行调优,经过调优,我们的程序运行效率提高了10倍。 这门课程和数字电路等课程不同,《数字电路》是站在微观的角度讲解计算机的原理的,而《计算机组成原理》则是站在宏观角度讲解的,因此大可不必在电路图等细节问题上陷得太深,只要像zsk425 说的那样,以“抽象”的观点看问题,只要知道它在做什么就可以了,不要管它内部是怎么实现的。 这门课和其他专业课不同,大部分都是理论性的东西,很少有动手实验的内容,因此很多同学感觉非常枯燥。那么我的建议就是自己多结合自己的电脑进行联想和研究,多到网上搜索相关的资料,那样理解就会更加深刻。《计算机组成原理》、《操作系统》、《计算机组成原理》是可以当成“小说”来看的课程,不要皱着眉头把它当成理论学,而是把课本想象成一个给你讲计算机运行原理的说书人。 比如学到《系统总线》的时候,你就想:计算机部件之间的通讯如果是通过一根线来进行的话肯定非常慢,因为数据、控制信息等都要通过一根线进行,而如果分成数据总线、地址总线和控制总线三条线的话数据、控制、地址信息就可以并行进行,所以速度就快了。然后你就可以到网上搜PCI、ISA总线等的介绍,南北桥芯片的介绍等,这样你就能把知识做到“不用刻意记就记住了”。 讲到存储器的缓存的时候,你就琢磨缓存到底是在做什么。缓存就是为了解决低速设备读取的问题,从内存中读数据肯定没有直接从CPU的缓存中读取快,所以就需要把经常被读取的数据放到缓存中,以后读的时候直接去缓存中读取就可以。缓存不能设计的太小,因为太小的话很多需要缓存的数据放不进去,太大的话则会增加成本,而且会导致很多不需要被缓存的数据也缓存了。然后你就到网上看主流的CPU内置的1M、2M、8M缓存的比较的文章,相信你就会理解深刻了。 讲到程序查询方式、DMA方式等的时候你就联想企业中的人员管理,有的企业里边A员工让B员工做一件事情也要领导转达任务分派,而且有的企业里一些普通的事情员工之间就可以处理,无需要领导过问。 讲到奇偶校检码的时候你就可以思考为什么有的压缩文件、视频文件有轻微的损坏仍然能够打开,你甚至可以自己写一个程序来实现校检功能。 总之,多到网上搜集相关资料,多联想,把它当成小说来读就会轻松、愉快很多,学的也会更扎实。

docker原理

简介 Docker就是虚拟化的一种轻量级替代技术。Docker的容器技术不依赖任何语言、框架或系统,可以将App变成一种 标准化的、可移植的、自管理的组件,并脱离服务器硬件在任何主流系统中开发、调试和运行 简单的说就是,在 Linux 系统上迅速创建一个容器(类似虚拟机)并在容器上部署和运行应用程序,并通过配置文件 可以轻松实现应用程序的自动化安装、部署和升级,非常方便。因为使用了容器,所以可以很方便的把生产环境和开 发环境分开,互不影响,这是 docker 最普遍的一个玩法。 Namespaces 命名空间 (namespaces) 是 Linux 为我们提供的用于分离进程树、网络接口、挂载点以及进程间通信等资源的方法。在日常使用 Linux 或者 macOS 时,我们并没有运行多个完全分离的服务器的需要,但是如果我们在服务器上启动了多个服务,这些服务其实会相互影响的,每一个服务都能看到其他服务的进程,也可以访问宿主机器上的任意文件,这是很多时候我们都不愿意看到的,我们更希望运行在同一台机器上的不同服务能做到完全隔离,就像运行在多台不同的机器上一样。 在这种情况下,一旦服务器上的某一个服务被入侵,那么入侵者就能够访问当前机器上的所有服务和文件,这也是我们不想看到的,而 Docker 其实就通过 Linux 的 Namespaces 对不同的容器实现了隔离。 Linux 的命名空间机制提供了以下七种不同的命名空间,包括 CLONE_NEWCGROUP、CLONE_NEWIPC、CLONE_NEWNET、CLONE_NEWNS、CLONE_NEWPID、CLONE_NEWUSER 和 CLONE_NEWUTS,通过这七个选项我们能在创建新的进程时设置新进程应该在哪些资源上与宿主机器进行隔离。 进程 进程是 Linux 以及现在操作系统中非常重要的概念,它表示一个正在执行的程序,也是在现代分时系统中的一个任务单元。在每一个 *nix 的操作系统上,我们都能够通过 ps 命令打印出当前操作系统中正在执行的进程。 如果我们在当前的 Linux 操作系统下运行一个新的 Docker 容器,并通过 exec 进入其内部的 bash 并打印其中的全部进程,在新的容器内部执行 ps 命令打印出了非常干净的进程列表。 网络 如果 Docker 的容器通过 Linux 的命名空间完成了与宿主机进程的网络隔离,但是却有没有办法通过宿主机的网络与整个互联网相连,就会产生很多限制,所以 Docker 虽然可以通过命名空间创建一个隔离的网络环境,但是 Docker 中的服务仍然需要与外界相连才能发挥作用。 每一个使用 docker run 启动的容器其实都具有单独的网络命名空间,Docker 为我们提供了四种不同的网络模式,Host、Container、None 和 Bridge 模式。

Spring boot:org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean wi

先看错误: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'AIQueryController': Unsatisfied dependency expressed through field 'aIQueryService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'AIQueryServiceImpl': Unsatisfied dependency expressed through field 'tProjectMapper'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.mapper.TProjectMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:586) ~[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE] at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:91) ~[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:372) ~[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1341) ~[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:572) ~[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE]

锁的获取流程

今天的主题是探究一下锁的获取过程是如何实现的,我们主要以ReentrantLock(重入锁)来展开研究,在进行探究之前我们先来了解几个比较重要的名词AQS,CAS AQS(AbstractQueuedSynchronizer)在JDK文档中定义如下: 为实现依赖于先进先出 (FIFO) 等待队列的阻塞锁和相关同步器(信号量、事件,等等)提供一个框架。此类的设计目标是成为依靠单个原子 int 值来表示状态的大多数同步器的一个有用基础。子类必须定义更改此状态的受保护方法,并定义哪种状态对于此对象意味着被获取或被释放。假定这些条件之后,此类中的其他方法就可以实现所有排队和阻塞机制。子类可以维护其他状态字段,但只是为了获得同步而只追踪使用 getState()、setState(int) 和 compareAndSetState(int, int) 方法来操作以原子方式更新的 int 值。他的具体用法我们在后面再进行了解。 CAS(Compare And Swap):执行的函数CAS(v,e,n)他包含了三个参数 v: 表示要更新的对象 e: 表示预期值 n: 表示更新的新值 CAS也称之为无锁执行者,它有点类似与乐观锁,他会把v和e进行比较看是否一致,如果不一致那么肯定是有其他线程对对象进行了修改,他将会被告知操作失败,之后他可以选择重获获取值进行比较也可以直接放弃;反之将v替换成n,操作成功然后则可以执行后面的操作,这样虽然CAS没有牵扯到锁的概念但是他一样可以保证多线程情况下的资源共享的安全性; 1.锁获取的流程图 我们获取的锁的过程以公平锁为列,首先我们看看ReentrantLock的lock方法 /** * Acquires the lock. * * <p>Acquires the lock if it is not held by another thread and returns * immediately, setting the lock hold count to one. * * <p>If the current thread already holds the lock then the hold * count is incremented by one and the method returns immediately.

Python用户界面控件(widget)布局练习(grid)

grid网格和网页中表格的作用类似。按照这个思路想就很好理解下面的代码了。 import tkinter as tr root=tr.Tk() #上北下南左西右东(N、S、W、E)排列控件,比较加“E”与不加的区别 tr.Label(root,text="甲方").grid(row=0,sticky="E") tr.Label(root,text="乙方").grid(row=1) e1=tr.Entry(root) e2=tr.Entry(root) e1.grid(row=0,column=1) e2.grid(row=1,column=1) #文本控件宽度跨两列。 tr.Text(root).grid(row=3,column=0,columnspan=2) tr.Button(root,text="确定",width=10).grid(row=4,column=0) tr.Button(root,text="取消",width=10).grid(row=4,column=1) root.mainloop()

三种方法求两个数最大公因数

1.题目描述: 求两个正整数的最大公约数和最小公倍数。 基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出。 提高要求:1.三种以上算法解决两个正整数最大公约数问题。 2.求3个正整数的最大公约数和最小公倍数。 2.程序源码及解题原理 (1)相减法(C/C++) 原理:有两整数a和b: ① 若a>b,则a=a-b ② 若a (2)穷举法(C/C++) 原理: 有两整数a和b: ① i=1 ② 若a,b能同时被i整除,则t=i ③ i++ ④ 若 i <= a(或b),则再回去执行② ⑤ 若 i > a(或b),则t即为最大公约数,结束 源码: #include 改进后求两个数的最大公因数和最小公倍数: ① i= a(或b) ② 若a,b能同时被i整除,则i即为最大公约数, 结束 ③ i–,再回去执行② 源码: #include 多个数的最大公因数: #include (3)辗转相除(JAVA) 原理: 用辗转相除法求两个数的最大公约数的步骤如下: 先用小的一个数除大的一个数,得第一个余数; 再用第一个余数除小的一个数,得第二个余数; 又用第二个余数除第一个余数,得第三个余数; 这样逐次用后一个数去除前一个余数,直到余数是0为止。那么,最后一个除数就是所求的最大公约数(如果最后的除数是1,那么原来的两个数是互质数)。 例如:求1515和600的最大公约数, 第一次:用600除1515,商2余315; 第二次:用315除600,商1余285; 第三次:用285除315,商1余30; 第四次:用30除285,商9余15; 第五次:用15除30,商2余0。 1515和600的最大公约数是15。 辗转相除法是求两个数的最大公约数的方法。如果求几个数的最大公约数,可以先求两个数的最大公约数,再求这个最大公约数与第三个数的最大公约数。这样依次下去,直到最后一个数为止。最后所得的一个最大公约数,就是所求的几个数的最大公约数。 Java源码: package test; import java.util.Scanner; public class zuoye { /** * @max_num:最大公因数 * @ min_num:最小公倍数 */ public static void main(String[] args) { @SuppressWarnings(“resource”) Scanner sc = new Scanner(System.

组合计数专题

原博客 组合数学之一 —— 计数问题基础 组合数学之二 —— 容斥原理及应用 组合数学之三 —— 生成函数 组合数学之四 —— 鸽巢原理 组合数学之五 —— 莫比乌斯反演 组合数学之六 —— 差分序列&Stirling数

keras 整理之 Layers

» 嵌入层 Embedding Embedding keras.layers.Embedding(input_dim, output_dim, embeddings_initializer='uniform', embeddings_regularizer=None, activity_regularizer=None, embeddings_constraint=None, mask_zero=False, input_length=None) 将正整数(索引值)转换为固定尺寸的稠密向量。 例如: [[4], [20]] -> [[0.25, 0.1], [0.6, -0.2]] 该层只能用作模型中的第一层。 参数 input_dim: int > 0。词汇表大小, 即,最大整数 index + 1。 output_dim: int >= 0。词向量的维度。 embeddings_initializer: embeddings 矩阵的初始化方法 (详见 initializers)。 embeddings_regularizer: embeddings matrix 的正则化方法 (详见 regularizer)。 embeddings_constraint: embeddings matrix 的约束函数 (详见 constraints)。 mask_zero: 是否把 0 看作为一个应该被遮蔽的特殊的 "padding" 值。 这对于可变长的 循环神经网络层 十分有用。 如果设定为 True,那么接下来的所有层都必须支持 masking,否则就会抛出异常。 如果 mask_zero 为 True,作为结果,索引 0 就不能被用于词汇表中 (input_dim 应该与 vocabulary + 1 大小相同)。 input_length: 输入序列的长度,当它是固定的时。 如果你需要连接 Flatten 和 Dense 层,则这个参数是必须的 (没有它,dense 层的输出尺寸就无法计算)。 输入尺寸

java文件加解密,java.security.InvalidKeyException: Illegal key size or default parameters问题解决

使用AES加密时,当密钥大于128时,代码会抛出java.security.InvalidKeyException: Illegal key size or default parameters。网上大部分的解决方法都是下载相关的jar包,覆盖掉${java_home}/jre/lib/security/ 下面的local_policy.jar和US_export_policy.jar来解除这种限制。但有时候,在生产环境中不能或不方便进行这种覆盖操作,这时候可以在加解密代码中加上下列代码去掉这种限制: //使其支持256位秘钥 static { Field field = null; try { field = Class.forName("javax.crypto.JceSecurity").getDeclaredField("isRestricted"); field.setAccessible(true); Field modifiersField = Field.class.getDeclaredField("modifiers"); modifiersField.setAccessible(true); modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); field.set(null, java.lang.Boolean.FALSE); } catch (Exception e) { e.printStackTrace(); } } 顺便提供一个文件加解密的类FileAesEncryptUtil.java package com.learn; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import java.io.*; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.security.GeneralSecurityException; import java.security.Key; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; public class FileAesEncryptUtil { //可修改成配置,SECRET根据实际修改 private final static String SECRET = "

LeetCode_4 两个排序数组的中位数

题目: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。 请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。 你可以假设 nums1 和 nums2 不同时为空。 示例: 示例 1: nums1 = [1, 3] nums2 = [2] 中位数是 2.0 示例 2: nums1 = [1, 2] nums2 = [3, 4] 中位数是 (2 + 3)/2 = 2.5 代码: class Solution: def findMedianSortedArrays(self, nums1, nums2): """ :type nums1: List[int] :type nums2: List[int] :rtype: float """ res = nums1 + nums2

laravel解决跨域问题

1、执行composer require barryvdh/laravel-cors 2、kernel.php protected $middleware = [ \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, \App\Http\Middleware\TrimStrings::class, \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, \App\Http\Middleware\TrustProxies::class, \Barryvdh\Cors\HandleCors::class,//新增这行 ]; 原作者:https://blog.csdn.net/jj546630576/article/details/79253214

python 各种开源库

测试开发 来源:https://www.jianshu.com/p/ea6f7fb69501 Web UI测试自动化 splinter - web UI测试工具,基于selnium封装。 链接selenium - web UI自动化测试。 链接 --推荐mechanize- Python中有状态的程序化Web浏览。链接selene - 使用Python + Ajax支持+ PageObjects + Widgets进行简明UI测试 链接hitch - 基于服务的应用程序的高级集成测试框架。链接Needle - Css 自动化测试框架。链接seleniumbase - 端到端自动化测试框架。链接pytest_splinter - pytest spinter和selenium集成。 链接Browsermob Proxy - Browsermob Proxy的python包装器。 链接Selenium-Requests - 扩展Selenium WebDriver类以包含请求库中的请求函数,同时完成所有需要的cookie和请求头处理。链接 移动测试自动化 appium - 移动端UI自动化测试。 链接 --推荐uiautomator- 安卓UI自动化测试。 链接ATX - 智能手机自动化工具。支持iOS,Android,WebApp和游戏。 网易出品 链接 --推荐uiautomator2- Android Uiautomator2 Python Wrapper。 链接 --推荐facebook-wda Facebook WebDriverAgent Python Client Library (not official) 可用于IOS应用测试。 链接 --推荐 Windows UI测试自动化 Winium.

CSS3新属性篇(二):transform-origin属性

文章目录 一、transform-origin属性介绍二、实例三、code 一、transform-origin属性介绍 transform-origin属性表示在对元素进行变换的时候,设置围绕哪个点进行变化的。默认情况,变换的原点在元素的中心点,即是元素X轴和Y轴的50%处,如下图所示: 我们没有使用transform-origin改变元素原点位置的情况下,CSS变换进行的旋转、移位、缩放等操作都是以元素自己中心(变换原点)位置进行变换的。但很多时候需要在不同的位置对元素进行变换操作,我们就可以使用transform-origin来对元素进行原点位置改变,使元素原点不在元素的中心位置,以达到需要的原点位置。 用法:transform-origin: x-axis y-axis z-axis; transform-origin属性可以使用一个,两个或三个值来指定,其中每个值都表示一个偏移量。 没有明确定义的偏移将重置为其对应的初始值。 一个值: 必须是 <length><percentage>,或 left, center, right, top, bottom关键字中的一个。 两个值: 其中一个必须是<length><percentage>,或left, center, right关键字中的一个。另一个必须是<length><percentage>,或top, center, bottom关键字中的一个。 三个值: 前两个值和只有两个值时的用法相同。第三个值必须是。它始终代表Z轴偏移量。 二、实例 1、以rotate()为例,设置不同的transform-origin,观察效果: transform-origin取值为center(或center center或50% 或50% 50%或默认): transform-origin取值为top(或top center或center top或50% 0): transform-origin取值为right(或right center 或center right 或 100% 或 100% 50%): transform-origin取值为bottom(或bottom center 或center bottom 或 50% 100%): transform-origin取值为left(或left center或center left或0或0 50%): transform-origin取值为top left(或left top或0 0): transform-origin取值为right top(或top right或100% 0): transform-origin取值为bottom right(或right bottom或100% 100%):

正则表达式(匹配第一个花括号)

学习正则,工作中使用正则让我对“^”有了新的认知: 正则中^匹配输入字符串的开始位置,除非在[]方括号表达式中使用,此时表示不接受该字符集合。 废话不多说,直接看栗子吧, 如下图所示,需要匹配第一个花括号前的地址 [^}] 除了“}”以外的任何字符 [^}]* 0或多个非“}”的字符 ^[^}]* 从左向右匹配非“}”的多个字符 ^[^}]*\} 从左向右匹配第一个包含“}”的字符串 正则表达式匹配大括号里面的内容 方法一: {[^}]+} var str = "aa ds sdf {asdf asdfag }"; var str1 = str.match(/\{[^\}]+\}/)[0]; 方法二: /{[\S\s]+}/或者/{(.|\r\n)+}/ 注:\S\s可是微软文档中对\n匹配的标准用法哦 var str = "aa ds sdf {asdf asdfag }"; var str1 = str.match(/\{[\S\s]+\}/)[0]; 如何利用正则表达式匹配花括号内的内容 匹配花括号内的内容 Input: {abc}, Output: abc 正则表达式: (?<=\{)[^}]*(?=\}) (?<=\{) 匹配以左花括号开头 [^}]* 取得内容 (?=\}) 匹配以右花括号结束 private List<String> GetTokens(String str) { Regex regex = new Regex(@"(?<=\{)[^}]*(?=\})", RegexOptions.IgnoreCase); MatchCollection matches = regex.

CSS3新属性篇(一):transform属性

文章目录 一、移动 translate二、缩放 scale三、旋转 rotate四、倾斜 skew五、matrix()函数六、事例代码 在CSS3中,可以利用transform功能来实现文字或图像的旋转、缩放、倾斜、移动这四种类型的变形处理,以下将详细说明各个属性。 一、移动 translate 用法:transform: translate(45px) 或者 transform: translate(45px, 150px); 参数表示移动距离,单位px, 一个参数时:表示水平方向的移动距离;两个参数时:第一个参数表示水平方向的移动距离,第二个参数表示垂直方向的移动距离。 二、缩放 scale 用法:transform: scale(0.5) 或者 transform: scale(0.5, 2); 参数表示缩放倍数; 一个参数时:表示水平和垂直同时缩放该倍率两个参数时:第一个参数指定水平方向的缩放倍率,第二个参数指定垂直方向的缩放倍率。 三、旋转 rotate 用法:transform: rotate(45deg); 围绕旋转中心旋转而不变形的转换,rotate()默认旋转中心为图片的中点。共一个参数“角度”,单位deg为度的意思,正数为顺时针旋转,负数为逆时针旋转,上述代码作用是顺时针旋转45度。 四、倾斜 skew 用法:transform: skew(30deg) 或者 transform: skew(30deg, 30deg); 参数表示倾斜角度,单位deg 一个参数时:表示水平方向的倾斜角度; 两个参数时:第一个参数表示水平方向的倾斜角度,第二个参数表示垂直方向的倾斜角度。 关于skew倾斜角度的计算方式表面上看并不是那么直观,这里借鉴某大拿绘制的图举例说明一下: 每个图下方都有skew的参数。粗的红色的线分别是水平垂直方向上的投影,其长度与左边的未倾斜的边是相等的。两个参数所代表的角度,就是图中黑色标记的角。需要注意的是,skew中,垂直方向代表着X轴,水平方向代表着Y轴。 但是要注意的是,例如当用skew(60,60)的时候,角度的算法不是上面那样的呢,因为当两个参数的角度都大于45的时候,其实我们看到的是图形的反面,也就是长和宽交换了位置。 此时黄色的才才是投影的矩形,可以和左边的原图进行比较。而原来的粗的红色的线是错的。而角度则是黑色的标出来的! 五、matrix()函数 用法:transform: matrix(0.5, 0.2, 0, 0.5, 200, 50); transform: matrix(数值a,数值b,数值c,数值d,数值e,数值f): 数值a:水平方向上的尺寸缩放数值b:垂直方向上的倾斜率数值c:水平方向上的倾斜率数值d:垂直方向上的尺寸缩放数值e:水平方向上的移动距离数值f:垂直方向上的移动距离 使用transform属性的matrix()函数能够综合实现旋转、缩放、倾斜的2D变形。变形内容由6个数值决定,基准数值为matrix(1,0,0,1,0,0),也就是说这时的坐标没有变化。 如果需要3D变形,需要使用transform属性的matrix3d()函数。 六、事例代码 height="500" width="800" scrolling="no" title="transform属性" src="//codepen.io/madman0621/embed/pOwqzL/?height=421&theme-id=light&default-tab=result&embed-version=2" allowfullscreen="true">See the Pen transform属性 by madman0621 ( @madman0621) on CodePen.

IP的正则表达式

((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) 2[0-4]\d :表示200-249 25[0-5] :表示250-255 [01]?\d\d? :表示1-199 {3} :重复三次 | : 或者 四段,每段都是1-255; 注:如有错误,请指正!

Ubuntu18.04.1 apt-get install报错: Package ‘xxx‘ has no installation candidate解决方法

对于Ubuntu操作系统,很多同学在使用apt-get install的时候 会发现很多源都找不到,原因是系统初始的资源库找不到指定的包,解决方法: 1、执行下面的命令,编辑系统资源库列表: vi /etc/apt/sources.list 2、修改为以下内容(原来的内容可以注释一下): deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse

浏览器拦截跨域请求问题(火狐显示:已拦截跨域请求;谷歌显示请求报错:error/Network Error)

火狐与谷歌最简单的解决方法:在浏览器中打开请求的url,添加例外。除此之外,可分别设置如下: 请求已经发送,页面的请求接口无误的情况下,火狐浏览器显示如下时: 火狐浏览器提示已拦截跨域请求,解决发放如下: 1.在火狐浏览器地址栏输入 about:preferences#privacy 2.证书 -> 查看证书 -> 添加例外 -> 输入要添加的url -> 获取证书 -> 确认安全例外 3.刷新浏览器 请求已经发送,页面的请求接口无误的情况下,谷歌浏览器报错,显示如下时: 谷歌浏览器拦截不是安全连接,解决办法如下: 1.在火狐浏览器地址栏输入 chrome://flags/ 2.查找 Allow invalid certificates for resources loaded from localhost ,设置为Enabled 3.重启浏览器

vue-cli3.0 配置vue.config.js

// vue.config.js 配置说明 //官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions // 这里只列一部分,具体配置参考文档 const fs = require('fs') module.exports = { // 部署生产环境和开发环境下的URL。 // 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上 //例如 https://www.my-app.com/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.my-app.com/my-app/,则设置 baseUrl 为 /my-app/。 baseUrl: process.env.NODE_ENV === "production" ? "./" : "/", // outputDir: 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致) outputDir: "dist", //用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下) assetsDir: "assets", //指定生成的 index.html 的输出路径 (打包之后,改变系统默认的index.html的文件名) // indexPath: "myIndex.html", //默认情况下,生成的静态资源在它们的文件名中包含了 hash 以便更好的控制缓存。你可以通过将这个选项设为 false 来关闭文件名哈希。(false的时候就是让原来的文件名不改变) // filenameHashing: false, // lintOnSave:{ type:Boolean default:true } 问你是否使用eslint lintOnSave: false, //如果你想要在生产构建时禁用 eslint-loader,你可以用如下配置 // lintOnSave: process.

微信公众号开发之绑定微信开发者

第一步:登录微信公众号,绑定网页开发者 在登录后的界面中,我们向下拉在左侧会看到有一个“开发者工具”点击。 这时在开发者工具中,会看到有好几个工具,其中有一个“web开发者工具”,我们点击进入。 在这里,我们就会看到有一个“绑定开发者微信号”按钮,我们点击。 进入后,我们输入需要绑定的微信号,点击“邀请绑定”按钮即可,然后在手机上确认一下即可。

配置Scala环境

系统:Ubuntu Server 18.04 教程:http://www.runoob.com/scala/scala-tutorial.html 下载debian安装包:https://www.scala-lang.org/download/ sudo apt install openjdk-11-jdk-headless sudo apt-get install ./scala-2.12.6.deb 根据软连接找到路径,设置环境变量 export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 export SCALA_HOME=/usr/share/scala alias s='scala' alias sc='scalac' 打开shell: groot@guardian:~$ scala Welcome to Scala 2.12.6 (OpenJDK 64-Bit Server VM, Java 10.0.2). Type in expressions for evaluation. Or try :help. scala> 安装成功。