手机自动化测试IDE —– Airtest的安装和IDE控件详解

大家好,我是IT共享者,人称皮皮。这篇文章主要给大家分享手机自动化测试IDE —– Airtest的安装和IDE控件详解相关知识,一起来看看吧。

前言

前面小编带大家讲解了一些用来做自动化的模块,但是如果是在手机上做自动化了,我们还能搞定吗?也许有人觉得抓手机的数据包都费劲,还搞什么自动化,而且肯定不简单。但我要告诉你的是,这一切都被一个叫Airtest的自动化测试软件给搞定了,你只需要把它一直运行着,你的手机上的所有操作,就都交给它了,直接就是点点点。

一、安装IDE

这里需要下载我们的Airtest,下载地址:

https://u062.com/file/7715018-451404671

下载好后我们需要安装它,然后第一次打开需要注册一个账号,必须是网易的账号,因为这个IDE就是网易开发的,所以需要登录网易的邮箱号才可以使用,安装成功后,如图所示:

二、IDE控件详解

1.Airtest辅助窗口

这里主要陈列着Airtest的所有功能函数以及Poco的功能函数,Poco是比Airtest识别率更友好的控件。如图:

touch:触屏操作


wait:等待操作


swipe:滑动操作


exists:检查屏幕上是否存在指定目标


test:在目标程序上输入文本


keyevent:按键操作


snapshot:截图操作


sleep:睡眠定时


assert_exists:存在断言的目标


assert_not_exists:不存在断言的目标


assert_equal:断言两个值是否相等


assert_not_equal:断言两个值是否不相等

2.Poco辅助窗口

Poco主要用来做游戏辅助测试,比如自动点击的外挂等等。

这里不再详细描述,因为我们用的最多的就是Airtest。

3.脚本编辑窗口

这个窗口是用来构建并运行我们的程序,同时还支持自动生成代码。

4.Log查看窗

这个窗口是将我们每一步操作生成的日志打印在这个窗口供我们查看的,可以通过查看日志了解到程序报错的原因以及当前操作所产生的结果。

5.移动设备连接

我们可以看到IDE上显示有移动设备连接,Serial NO.代表搜索到的设备名,State代表设备状态,有三种:offine(设备未连接或者无响应),Device(设备已连接),No Device(没有设备)。刷新ADB自然是重置当前设备列表,重启ADB自然是断开所有连接并重置列表。

6.远程设备连接

这里可以连接到本地模拟器上的设备,也可以连接到远程设备,只要你有可供连接的设备。

7.Windows窗口连接

用来选择当前系统桌面应用程序的并把它们的当前行为记录下来,也可用来做自动化。

8.连接IOS设备

这个就不说,给苹果手机准备的。

9.安卓助手

这个功能挺不错的,可以很方便查看设备的方法,以及可以进行一些简单的操作,如下所示:

三、总结

这篇文章主要给大家介绍了自动化测试IDE —– Airtest的安装和IDE控件基础知识,下一篇文章小编将带大家来实际应用Airtest连接手机,给大家分享一些好玩的。

干货|Sqlite数据库知识必知必会(下篇)

大家好,我是IT共享者,人称皮皮。

前面几天给大家分享了MySQL数据库知识,没来得及看的小伙伴可以前往:Mysql查询语句进阶知识集锦,一篇文章教会你进行Mysql数据库和数据表的基本操作,关于数据库的安装可以参考:手把手教你进行Mysql5.x版本的安装及解决安装过程中的bug。

上篇文章主要给大家介绍了Sqlite数据库的安装、图形化管理系统、基本数据类型、基本关键字和数据库的相关操作,干货|Sqlite数据库知识必知必会(上篇),今天皮皮紧接上篇文章,继续给大家分享数据库知识,一起来看看吧。

前言

前面我们学习了很多数据库,虽然它们功能非常丰富,但是占用空间比较大,使得我们的系统负荷变大,这对于我们新手小白来说不是一个理想的选择,于是乎,Sqlite闪亮登场,它受人喜爱的真正原因正是因为它足够小,无需安装和管理配置,简单容易上手,支持数据库的大小也有2TB,足够我们个人开发爱好者使用了。

一、数据表相关操作

1).创建数据表

CREATE TABLE student (
ID INTEGER DEFAULT '1406061' PRIMARY KEY AUTOINCREMENT NOT NULL,
NAME NVARCHAR(100)  UNIQUE NOT NULL,
score INTEGER  NOT NULL,
time TIMESTAMP  NOT NULL
);

我们可以使用SqliteAdmin快速生成表,如下:

干货|Sqlite数据库知识必知必会(下篇)

干货|Sqlite数据库知识必知必会(下篇)

这样我们的表就建立成功了。这里小编在软件中用的是DEMO这个数据文件,而在命令窗口中用的是TEST这个数据库文件,因为一个数据库文件不允许在两个位置打开的缘故。

2).删除表

DROP TABLE people;

3).显示表名

.tables
干货|Sqlite数据库知识必知必会(下篇)

4).数据表的增删改查

1)).增加

这里我们可以给刚创建的表添加一个数据,如下:

insert into student(ID,NAME,score,time) values(1406063,'任性的90后boy',90,'2020-07-06 12:23:32');
干货|Sqlite数据库知识必知必会(下篇)

这里我插入了三行数据,其中有一行报错是因为我使用了相同的ID号,而我的数据库的ID号是不允许重复的,故而会报错,改成其它的就好了,如果你把ID设为自增的话,就不需要你去写了,这里我用到了自增,所以大家不必写Sqlite会自动填充进去的。这里也可以省掉字段名,直接写值,如下:

干货|Sqlite数据库知识必知必会(下篇)

我们还可以给表添加新列,如下;

alter table people add  column aa char(10);#添加列并且列名为aa

注:Sqlite3并不支持带有UNIQUE约束的列

2)).删除

delete from people;#删除表数据
delete from people where score<20#删除people数据表score数值小于20的记录

3)).修改

其实就是更新操作,如下;

update people set score=100 where  age=46;#当age=46时score设置为100

4)).查找

查找不管是在哪个数据库中方法都是相当多的,因为查询操作是最常见也是最频繁的,下面我们就来详细说说:

1))).查询所有的结果

select * from student;
干货|Sqlite数据库知识必知必会(下篇)

我们可以看到虽然结果打印出了,但是并不是那么美观,我们将它的打印格式化一下,如下;

干货|Sqlite数据库知识必知必会(下篇)

这下就完美多了。虽然这种方法很不错,但是如果数据列很多的话就无法完全显示了,这个时候我们就需要设置列的宽度,如下:

.width 10 20 15

2))).查询指定结果

select NAME,score from student; #打印出NAME和score列的结果
select * from people where score<20 and age<40;#当score小于20并且age小于40的时候
select *from people where score between 10 and 30;#当score为10~30之间时
select *from people where NAME LIKE '放大%';#当name的开始处含有放大
select *from people where NAME glob '放大*';#与上同
select *from where score not in(12,23);#当score不属于12~23

3))).查找排序

select * from people order by score desc; #对score降序排序

4))).查找指定数量的数据

select * from people  limit 3 offset 2#偏移2个单位然后输出三行数据,其实就是输出后三行数据

5))).查找重复数据并消除

select distinct * from people where score>10;#当score大于10的时候消除重复数据

6))).查找数据并进行分组

select NAME ,max(age) from people where score>10 group by age#返回score大于10的时候age的最大值

7))).查找数据进行分组并过滤分组

select NAME ,max(age) from people where score>10 group by age having count(NAME)>1;#名称计数大于1

5).表的重命名

alter table people rename to man;#将表名people改为man
干货|Sqlite数据库知识必知必会(下篇)

6).数据表的连接

这里的连接分为内外交叉三种连接,使用好了可以极大提高我们的工作效率。这里我们再次创建一张表,如下:

干货|Sqlite数据库知识必知必会(下篇)

1)).交叉连接

select * from people cross join woman;
干货|Sqlite数据库知识必知必会(下篇)

2)).内连接

select * from people inner join woman;

3)).外连接

select * from people outer join woman;

注:Sqlite3只支持左外连接。

7).表的复制

create table man as select * from people where 1=0;#复制表结构
create table woman as select * from people;#复制表结构和数据

8).临时表

有时候我们不需要存储所有表的数据,这个时候临时表就很有使用的必要了。如下:

#创建一个临时表
create  temporary table temp_table(
    id int primary key,
    name varchar(50) unique not null,
    age int not null
);


#查看临时表
temp.temp_table


#删除临时表
drop table temp.temp_table;

5.索引操作

1).创建索引

create index user on people(score);#在people表的score字段上设置索引
create unique name on people(NAME);#在people表的score字段上设置唯一索引
create index pa on people(score,age)#在people表的score和age字段上设置索引

2).查看索引

SELECT * FROM sqlite_master WHERE type = 'index';
干货|Sqlite数据库知识必知必会(下篇)

这里我们之前仅仅只是创建了一个索引,那就是”user“,为何会有两个索引了,而且最上面的索引好像跟我们并没有什么关系,也不像是自己创建的,其实,这个就是隐式索引,这个隐式索引在我们创建表的时候就连带着一起创建了的,只是为了让查询更加快速而已,影响不大。

3).使用索引

这里涉及到两个关键字请配套使用,表示索引来自于哪里的意思。

select * from people indexed by user where score>10;

4).删除索引

drop index user;

注:数据量较小不应使用索引,以免给系统增压。

6.视图操作

1).创建视图

create view name as select NAME from people;#创建NAME字段的视图

2).使用视图

select *from name;
干货|Sqlite数据库知识必知必会(下篇)

这样就可以直接输出视图字段的所有值了。

3).删除视图

drop view name;

7.触发器

触发器就是使得多个表的交互增强,互相调用,满足条件就调用哪个表,语法格式如下:

create trigger 触发器 after(before) insert(delete update)
on1
begin
insert into2(表2字段,表2字段,n) VALUES(表1值, 表1值,,,,n);
END;

1).创建触发器

#给people表创建一个触发器
create trigger cf
after insert on people
begin
insert into woman(w_ID,NAME,SCORE,date) values(new.ID,'向前插入',100,datetime('now'));
end;

2).查看触发器

select * from sqlite_master where type = 'trigger'AND tbl_name='people';#查看people表的触发器

3).删除触发器

drop trigger cf;

8.事务

有了事务可以让我们的Sqlite语句工作的更加有条不紊,一般大致分为事务开始 提交 回滚 结束,下面来看看:

begin;#开始
insert into people('gf',65,datetime('now'));
rollback; #回滚就是撤销
COMMIT;提交保存数据
end;#结束

这里的数据没有插入到“people”表中哦,是不是超级简单了?

二、总结

这篇文章主要介绍了Sqlite数据库的数据表、索引、视图、触发器和事务操作知识,干货满满。

皮皮自从学过Sqlite之后,就果断卸载了Mysql和Mongo了,主要是目前还用不着Mysql数据库和Mongo那么强大的数据,够用就好。

我是皮皮,如果觉得文章不错,记得三连噢,大家有问题也可以点击下方的图片,加我好友,交个朋友也好呀~

干货|Sqlite数据库知识必知必会(上篇)

大家好,我是IT共享者,人称皮皮。

前面几天给大家分享了MySQL数据库知识,没来得及看的小伙伴可以前往:Mysql查询语句进阶知识集锦,一篇文章教会你进行Mysql数据库和数据表的基本操作,关于数据库的安装可以参考:手把手教你进行Mysql5.x版本的安装及解决安装过程中的bug,今天皮皮继续给大家分享数据库知识,但是换了一个主角,它就是Sqlite。

前言

前面我们学习了很多数据库,虽然它们功能非常丰富,但是占用空间比较大,使得我们的系统负荷变大,这对于我们新手小白来说不是一个理想的选择,于是乎,Sqlite闪亮登场,它受人喜爱的真正原因正是因为它足够小,无需安装和管理配置,简单容易上手,支持数据库的大小也有2TB,足够我们个人开发爱好者使用了。

一、安装

既然要学Sqlite,首先我们先安装它们,前面我们说过,安装它们无需太多过程,即免安装,下载地址:

https://u062.com/dir/7715018-39794633-fbf2ca

我们下载好后直接将Sqlite的应用程序加入到环境变量中即可随意使用了,打开CMD,看到这种字样,表示安装成功,如图:

二、图形化界面管理

Sqlite已经安装上了,但是在命令提示符窗口操作总感觉不美观,小编想这时候应该需要一个图形界面工具来操纵Sqlite,这样就能更直观的显示数据了,这里我推荐SqliteAdmin,中文版的界面再加上简洁的界面设计,如图:

注意,此时的软件还无法正常工作,因为它还没有可以解析Sqlite语句的动态链接库,所以你还需要下载个动态链接库,这里小编已经准备好了下载地址了,下载后直接复制到软件的目录即可,下载地址:

https://u062.com/file/7715018-452195159

三、基本语法

Sqlite不像其它的数据库以“;”结尾,而且它是以“.”开头使得式子成立的。打开我们的SqliteAdmin,下面开始我们的装逼之旅。

1.数据类型

Null         空值
SMALLLINT    短整型
INTEGER      带符号的整数 这个就是布尔类型 0(false)和 1(true)
TINYINT      长整型
REAL         浮点值
TEXT         大量文本字符串
BLOB         二进制对象       
NUMERIC      使用所有五个存储类的值
VARCHAR(n)   变动长度字符串,只能存英文,最多8000个字符
CHAR(n)      固定长度字符串
DATA         年月日
TIME         时分秒
DOUBLE       双精度浮点数
FLOAT        单精度浮点数
TIMESTAMP    存储年月日时分秒
NCHAR        存储Unicode数据类型的固长字符串 ,可存英文汉字,做多4000个字符
NVARCHAR 存储Unicode数据类型的变长字符串
NTEXT        存储Unicode数据类型的大量文本字符串
DATATIME     存储日期时间

其实它的数据类型远不止这些,更多的数据类型需要大家发掘,这里小编列举只是常用的数据类型罢了。

2.基本关键字

了解了数据类型,在创建数据库时用于操作时需要配套使用的关键字当然也必须得了解,这样才能提高开发效率。

AND   




BETWEEN  最小值和最大值之间




EXISTS 判断是否存在




IN  判断某个值是否属于另一个值




NOT IN 判断某个值是否不属于另一个值




LIKE 使用通配符比较值与另一个值 不区分大小写 %(表示零个,一个或者多个)  _(表示一个)




GLOB  使用通配符将值与类似值进行比较,并区分大小写的 *(表示零个或多个)     ?(表示一个)




LIMIT  限制满足条件的值的数量




ORDER BY 排序  ASC(升序) | DESC(降序)




GROUP BY  数据聚合




HAVING   过滤分组,使用前一定要使用GROUP BY




DISTINCT   消除所有重复记录






NOT  不,常和in一起用




OR   




IS NULL  判断是否等于空值,类型运算符




IS  相当于‘=’




IS NOT  判断是否不等于 相当于“!=”




UNIQUE    不重复


UNION     消除所有重复行


UNIONALL  不消除重复行


WHERE   用于满足某个条件时


SELECT  选择


FROM   来自


INSERT INTO 插入表数据


PRIMARY Key  主列


DEFAULT 默认值


CHECK 检查

3.数据库相关操作

1).创建数据库文件

首先我们要创建一个数据库文件,以“.db”结尾的文件,如下:

我们还可以在命令提示符里面创建数据库,如下所示:

这样就创建了一个”test”的数据库文件了,我们创建之后我们就进入了”test”数据库中了,然后就可以进行其它操作了。

2).查看数据库

.database   .databases 两者即可

3).退出数据库

.quit

4).导出数据库

sqlite3 test.db .dump > test.sql

5).创建附加数据库

ATTACH DATABASE 'test1.db' as 'test1';
ATTACH DATABASE 'test2.db' as 'test2';

上述操作是将所有数据库数据都存放在了数据库文件“test.db”中了,不过实际开发中不建议这么做,建议多做几个数据库,或者将数据库嵌入到其它数据库中。

6).显示附加数据库

.database   .databases 两者即可

7).分离数据库

DETACH DATABASE 'test1';

四、总结

这篇文章主要介绍了Sqlite数据库的安装、图形化管理系统、基本数据类型、基本关键字和数据库的相关操作,介绍了创建数据库、查看数据库、退出数据库、导出数据库、创建附加数据库、显示附加数据库和分离数据库的方法,干货多多。下一篇文章继续给大家分享Sqlite数据库的数据表、索引、视图、触发器和事务操作知识,敬请期待!

浅析Python模块的引入和调用

大家好,我是IT共享者,人称皮皮。这篇文章我们来浅析Python模块的引入和调用。

一、前言

Python中的模块,有过C语言编程经验的朋友都知道在C语言中如果要引用sqrt函数,必须用语句#include引入math.h这个头文件,否则是无法正常进行调用的。

那么在Python中,如果要引用一些其他的函数,该怎么处理呢?

在Python中有一个概念叫做模块(module),这个和C语言中的头文件以及Java中的包很类似,比如在Python中要调用sqrt函数,必须用import关键字引入math这个模块,下面就来了解一下Python中的模块。

说的通俗点 :模块就好比是工具包,要想使用这个工具包中的工具(就好比函数),就需要导入这个模块。

二、模块引入

1. import

在Python中用关键字import来引入某个模块,比如要引用模块math,就可以在文件最开始的地方用import math来引入。

形如 :

 import module1,mudule2...

当解释器遇到import语句,如果模块在当前的搜索路径就会被导入。

在调用math模块中的函数时,必须这样引用:

  模块名.函数名

为什么必须加上模块名调用呢?

因为可能存在这样一种情况:在多个模块中含有相同名称的函数,此时如果只是通过函数名来调用,解释器无法知道到底要调用哪个函数。所以如果像上述这样引入模块的时候,调用函数必须加上模块名。

   import math


    #这样会报错
    print sqrt(2)


    #这样才能正确输出结果
    print math.sqrt(2)

有时候我们只需要用到模块中的某个函数,只需要引入该函数即可,此时可以用下面方法实现:

   from 模块名 import 函数名1,函数名2....

不仅可以引入函数,还可以引入一些全局变量、类等。

注意:

  1. 这种方式引入的时候,调用函数时只能给出函数名,不能给出模块名,但是当两个模块中含有相同名称函数的时候,后面一次引入会覆盖前一次引入。也就是说假如模块A中有函数function( ),在模块B中也有函数function( ),如果引入A中的function在先、B中的function在后,那么当调用function函数的时候,是去执行模块B中的function函数。

2. 如果想一次性引入math中所有的东西,还可以通过from math import 来实现

2. from…import

Python的from语句让你从模块中导入一个指定的部分到当前命名空间中。

语法如下:

   from modname import name1[, name2[, ... nameN]]

例如,要导入模块fib的fibonacci函数,使用如下语句:

   from fib import fibonacci

注意:

  • 不会把整个fib模块导入到当前的命名空间中,它只会将fib里的fibonacci单个引入。

3. from … import *

把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:

   from modname import *

注意:

  • 这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。

4 . 定位模块

当你导入一个模块,Python解析器对模块位置的搜索顺序是:

  1. 当前目录
  2. 如果不在当前目录,Python则搜索在shell变量PYTHONPATH下的每个目录。
  3. 如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/
  4. 模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。

三、as 的三种用法

1. with…as…

第一种是和with结合使用,主要用于文件的读写操作,省去了关闭文件的麻烦。

写法:

with open("文件路径","读写方式") as 赋值变量:
    #  执行代码块

实例:

#test.py
with open("1.txt") as f:
    print f.read()


#1.txt(两个文件在同一目录下)

运行结果:

 

2. 导入模块起别名

导入模块是对模块进行重命名,也就是给模块起一个别名。示例代码在下方的第三点有演示。

3. except结合使用

第一种:给traceback模块起别名为a

示例代码 :

import traceback as a
try:
    while 1/0 < 0:
        print True

第二种:和except组合使用,将捕获到的异常对象赋值给e。

实例代码 :

except Exception as e:
    print "e=",e
    a.print_exc()

四、总结

本文详细的讲解了Python基础 ( 模块 )的引入,调用 。介绍了常用的三种模块。模块时的需要注意的事项,以及在实际操作中会遇到的问题,提供了解决方案。希望可以帮助你更好的学习Python。

一篇文章带你了解CSS定位知识

大家好,我是IT共享者,人称皮皮。这篇我们来讲讲CSS定位。

一、Position(定位)

CSS定位属性允许你为一个元素定位。它也可以将一个元素放在另一个元素后面,并指定一个元素的内容太大时,应该发生什么。

元素可以使用的顶部,底部,左侧和右侧属性定位。然而,这些属性无法工作,除非是先设定position属性。他们也有不同的工作方式,这取决于定位方法。

二、属性

1. Static 定位(默认效果)

HTML元素的默认值,即没有定位,元素出现在正常的流中。

静态定位的元素不会受到top, bottom, left, right影响。

2. Fixed 定位

元素的位置相对于浏览器窗口是固定位置。

即使窗口是滚动的它也不会移动:

<!DOCTYPE html>
<html>
        <meta charset="utf-8">
        <meta name="viewport" content="width=640, user-scalable=no">
    <head>
        <style>
            p.pos_fixed {
                position: fixed;
                top: 30px;
                right: 5px;
            }
</style>
    </head>


    <body>


        <p class="pos_fixed">Some more text</p>
        <p><b>Note:</b> 代码使人进步!!!.</p>
        <p>Some text</p>
        <p>Some text</p>
        <p>Some text</p>
        <p>Some text</p>


    </body>


</html>

注意:

Fixed定位使元素的位置与文档流无关,因此不占据空间。

Fixed定位的元素和其他元素重叠。

3. Relative 定位

相对定位元素的定位是相对其正常位置。

<!DOCTYPE html>
<html>
    <meta charset="utf-8">
    <meta name="viewport" content="width=640, user-scalable=no">
    <title> 定位</title>


    <head>
        <style>
            h2.pos_left {
                position: relative;
                left: -20px;
            }


            h2.pos_right {
                position: relative;
                left: 20px;
            }
</style>
    </head>


    <body style="background-color:azure;">


        <p>Some more text</p>
        <p><b>Note:</b> 代码使人进步!!!.</p>
        <h2 class="pos_left">This heading is moved left according to its normal position</h2>
        <h2 class="pos_right">This heading is moved right according to its normal position</h2>


    </body>


</html>

可以移动的相对定位元素的内容和相互重叠的元素,它原本所占的空间不会改变。

h2.pos_top{
    position:relative;
    top:-50px;
}

相对定位元素经常被用来作为绝对定位元素的容器块。

4. Absolute 定位

绝对定位的元素的位置相对于最近的已定位父元素,如果元素没有已定位的父元素,那么它的位置相对于<html>:

h2{
    position:absolute;
    left:100px;
    top:150px;
}

Absolutely定位使元素的位置与文档流无关,因此不占据空间。

Absolutely定位的元素和其他元素重叠。

三、重叠的元素

元素的定位与文档流无关,所以它们可以覆盖页面上的其它元素

z-index属性指定了一个元素的堆叠顺序(哪个元素应该放在前面,或后面)

一个元素可以有正数或负数的堆叠顺序:

img{
    position:absolute;
    left:0px;
    top:0px;
    z-index:-1;
}

具有更高堆叠顺序的元素总是在较低的堆叠顺序元素的前面。

注意: 如果两个定位元素重叠,没有指定z – index,最后定位在HTML代码中的元素将被显示在最前面。

四、总结

本文基于Html基础,主要介绍了CSS中四种定位的方式。对于四种的定位表现形式,用丰富的案例 ,代码效果图的展示,帮助大家更好理解 。

最后,希望可以帮助大家更好的学习CSS3。

盘点4大下载神器,教你分分钟搞定文件下载

大家好,我是IT共享者,人称皮皮。

前几天给大家分享了一篇关于百度网盘的下载神器文章,安利一款神奇——教你轻松下载百度网盘超大文件,有读者反馈这个下载神奇下载小文件得心应手,但是下载大文件还是有些小吃力的,于是乎,皮皮给大家继续找了几个插件,一起跟着皮皮来盘点一下吧~

一、前言

平时我们在访问一些国外网站的时候难免会出现访问延迟甚至是下载到一半就无法下载的尴尬,比如我用360浏览器下载docker,如图:

看到这感人的速度,不禁让我流下了悔恨的泪水,如果当初我能知道几个下载神器中的一种,我也不会那么焦急地等待着。好在现在小编接触的软件比以前的多了,所以现在下载很多工具也就效率高了不少,下面小编就把自己曾经用过的觉得非常棒棒哒的下载工具分享给大家吧,记得点赞关注加收藏哦。

二、IDM

全称Internet Download Manager,是一个非常强大的软件,官方说可将下载速度提升至最多五倍,原先不信,自从用过之后我信了,而且觉得有过之而无不及。IDM不仅下载速度快而且支持断点续传,而且还支持代理服务器,ftp和http协议,防火墙,重定向,cookie,授权,音频和视频内容处理。我们下载后只需按照要求来安装它即可,IDM支持指定位置安装,下面我们来看看它长啥样吧,如图:

下面我们来使用它下载docker看看效果如何,如图:

我们从上面使用360浏览器下载的速度和这里使用IDM的速度一对比,差距可以说是再明显不过了,这也可以说明IDM的下载速度不是一般的快。不过这个软件有个致命伤,那就是有使用的时间限制,如果你用超过15天的话,你就会被它颁奖,授予你一个需要序列号才能使用的奖状,如图:

此时若是遇到这种情况莫要惊慌,小编已经给大家在网上找到了一个破解版的,也是相当好用,地址:

https://u062.com/f/7715018-484413622-ddb3ad(访问密码:123321)

下载下来后直接解压点击绿色安装然后点击IDM.exe就可以直接用了,如图:

这样就再也不用担心下载付费的问题了。另外,IDM也支持指定站点抓取,什么意思呢?就是它可以将目标网址中的一些图片视频以及其它文件抓取下来,你想抓取什么类型的文件都可以,如图:

可以说功能也是有够强大了。

三、XDM

全称Xtreme Download Manager,同样是一款牛逼的下载工具,具有和IDM 相同的功能,它可以保存和转换来自YouTube,Vimeo,Dailymotion,Google Video和成千上万个其它网站的流式视频并支持断点续传,支持HTTP,HTTPS,FTP,DASH,HLS,HDS协议,防火墙,代理服务器,PAC脚本,文件重定向,Cookie,授权,下载队列,调度程序等,并且它内置了视频转换器。说得这么牛逼我们来下载个试试看,地址:

https://u062.com/f/7715018-484413629-55a3ab(访问密码:6511)

这里小编分享的是一个msi的安装包,点击后无需安装直接就能安装好,第一次启动会显示英文界面,如图:

这里下面提示我们软件有更新,我们不用管它,下面我们把这个英文界面切换到中文界面,如图:

这样就可以直接汉化成功了,然后我们来添加一个下载任务,如图:

从这个速度可以看到,感觉比IDM还要快,简直就是视频下载必杀器一般的存在啊。

四、PDM

全称Persepolis Download Manager,也是一款十分强大的下载工具,这里小编提供有32位和64位两个版本,下载地址:

https://u062.com/f/7715018-484413736-d1c621(访问密码:6511)

PDM是一款基于aria2的图形化工具,它的速度也很快,并且资源占用少,支持 HTTP / FTP / BT / Magnet 磁力链接等类型的文件下载;并且跨平台支持 Win、Mac、Linux,甚至在树莓派、NAS、路由器等设备上都能安装它。唯一的遗憾就是不支持HTTPS。PDM打开时为英文界面,不过我们可以把它改为中文界面,如图:

下面我们用它来下载下docker试试,如图:

可以看到,下载速度和上面的工具比起来要更快一些。

五、XDown

一款专业的文件下载与分享工具,支持浏览器(Chrome/FireFox/Edge )下载,torrent下载文件与做种,BitTorrent 内置tracker list设置,FTP/HTTP/HTTPS/HTTP2协议下载,断点续传,多IP轮询节点下载,磁力链接,全局限速,也是相当牛逼的一个工具,地址:

https://u062.com/f/7715018-484416754-72bcab(访问密码:6511)

下面来看下它是如何下载的吧,如下:

我们可以看到,速度比较慢,不过比360浏览器还是稍微快一点,可以说是这几款工具中表现最差的了,不过它也有它的过人之处,就是用它来下载种子文件还是很方便的,这点是其它几个工具比不了的。

六、总结

以上就是小编经常使用的几款下载工具了,不知道你用过哪几款呢?赶快都来试试吧。

Mysql查询语句进阶知识集锦

前言

上次咱们简单的学习了一下select的用法,一篇文章教会你进行Mysql数据库和数据表的基本操作,对数据库大概有了一些基本的了解。

咱们接着上次继续来看叭!

查询

数据如下

or查询

我们在上学时,会听到这样的话,某某某,你把谁谁谁或者谁谁谁叫过来。

这样子的话,我们我们要查询的,就是一个或(or)的关系了。

or查询只有满足一个条件即可

sql

-- 语法
SELECT * from student WHERE <条件> or <条件> ...;
-- 例如,查询姓名为张三的或者姓名为小刘的数据
SELECT * from student WHERE name="张三" or name="小刘";

执行结果

不等于(!=)查询

上述我们查询的,都是等于(=)操作,但是我们在上学时,还会有这种情况。

某个学生学习可好,背东西背的可快,放学的时候可能就人家一个人过了,这时候老师可能就说

除了某某某,其他学生本篇文章全部抄3遍,淦。。。

所以这时候就是反过来的查询的,只需要排除某个人即可!

sql

-- 语法
SELECT * from student WHERE <条件>;
-- 例如,查询姓名不是张三的其他人,排除张三
SELECT * from student WHERE name!="张三";

执行结果

in/not in查询

学生们还都是年轻人,年龄大概都在20来岁,这时候老师说,班长,把年龄在19,20,21的人统计一下!

根据上述我们学过的知识,可能你是这样婶的。

SELECT * from student WHERE age=19 or age=20 or age=21;

执行结果

通过三个or找到,其实这样也没错,但是还有一种更简单的。

sql

-- 语法
SELECT * from student WHERE <列名> in (值1,值2,...) ...;
-- 例如,需求同上
SELECT * from student WHERE age in (19,20,21);

执行结果

not in 就是不在这个范围的数据啦!

sql

-- 查询年龄不在19,20,21范围的数据
SELECT * from student WHERE age not in (19,20,21);

执行结果

between查询

between适合进行范围查询!

sql

-- 语法
select * fromwhere <列> between <开始范围> and <结束范围>;
-- 例如,查询年龄时20-22岁的学生
SELECT * from student WHERE age BETWEEN 20 and 22;

执行结果

同理,between还能用在时间上。

select * from <表名> where <时间列> between <开始时间> and <结束时间>

模糊查询(like)

假设现在数据如下,有三个姓张的。

老师可能突然有一天对你说,班长,把咱们姓张的列出来,我找他们谈点事,咋办???

我们只需要找,是以张开头的,后面是啥无所谓。

所以就要用到like模糊查询。

sql

-- 语法 %表示匹配一个或多个字符
select * fromwhere <列> like '[%]<字符串>[%]'
-- 例如,查询,以张开头的
SELECT * from student WHERE name like "张%";

执行结果

同理,这个%可以放在任意位置,他就是充当不确定的字符使用的,能够自动匹配一个或多个

例如

... WHERE name like "张%丰";
匹配:张三丰
WHERE name like "%鱼";
匹配:张甲鱼
WHERE name like "李%";
匹配:李四
...

限制(limit)

限制这个有点怪异,还是图片举例比较好。

数据如下

sql

-- 前两行
SELECT * from student LIMIT 2;

-- 从第2行开始后,再取4行
SELECT * from student LIMIT 2,4;
-- 同上,写法不同
SELECT * from student LIMIT 4 OFFSET 2

排序(order by)

不知道你有没有发现,我们之前查找的顺序都是正向的。

但是会有个问题,我们新增的数据,其实id是最大的,理论来说,应该要排在最前面。

所以,应该是倒序的是最好的。

sql

-- 语法
select * from <表名> order by <列> asc -- 从小到大排序
select * from <表名> order by <列> desc -- 从大到小排序
select * from <表名> order by <列1> desc,<列2> asc -- 先根据 列1 排序,如果数据相同,按照 列2 排序

例如

根据id正向排序

SELECT * from student ORDER BY id ASC;

执行结果

根据id反向排序

SELECT * from student ORDER BY id desc;

执行结果

hhh,这样我们就把数据反过来了!!!

分组(groupby)

分组,这个可能是难为了一批人,其实分组的核心,在于理解这个压缩这个概念。

假设数据如下

性别有男有女,如果我想知道,男的有多少个,女的有多少个怎么办???我总不能数吧。。。

所以这时候,如果能吧,男的都拿出来,女的都拿出来,就像这样!

然后我对拿出来进行压缩成一条。

如果这个你懂了,那分组就懂了。

语法

SELECT <列>,COUNT(<列>) from student GROUP BY <列>;
-- 因为分组了某个列,所以就不能再展示其他列的信息了,因为压在一块了,显示不了
-- 但是可以通过count,sum等函数计算压缩的个数,或者总值

例如

统计男女各多少人

SELECT gender,COUNT(gender) from student GROUP BY gender;

执行结果

统计同一年龄多少人

SELECT age,COUNT(age) as "数量" from student GROUP BY age;

执行结果

注意:group by必须在where之后,order by之前。

总结

本篇主要讲述的是Mysql查询语法,再单表查询中,基本上就上述这么些的内容,但是从理论到事件,是需要时间的。

一定要勤加练习,什么是or查询,like查询注意事项,尤其是group by分组查询,一定要多多思考和联系。

如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。

不要轻易改变自己,因为你可能就是世界上那颗未加工的最亮的钻石。

我是码农星期八,如果觉得还不错,记得动手点赞一下哈。

感谢你的观看。

如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。

安利一款神奇——教你轻松下载百度网盘超大文件

前言

玩过百度网盘的都应该清楚它的强大,小编就是靠着百度网盘那强大的功能以及变态的存储空间才获得许多具有纪念价值的东西,比如某些Hacker资料,你懂的。

但是小编一直以来都有一个心结未解开,那就是为毛每次使用百度网盘下载文件的时候就非得下载百度网盘客户端才可以了,估计先不说浪费时间和占用电脑资源,至少小编也是不乐意这样做的,毕竟小编电脑可是只有60个G的存储空间了。

那么,我们该怎么样处理这个问题呢?简而言之就是如何在不下载客户端的情况下就可以下载这个大型的文件了,一起往下看看。

一、坑爹的下载制度

先来回顾下这个坑爹的画面:

看到这里小编尴尬癌都犯了,本想下载个黑客工具玩玩,过过瘾,奈何是这个样子,正巧不巧的自己的电脑又出了点意外,无法安装百度云客户端,目前还无法找出根本原因;但是小编是那么轻易认输的人吗?当然不是,于是乎,小编便找到了这么个神器,浏览器的一个脚本—-一般圈内人都叫它们油猴。

二、油猴脚本

油猴(Tampermonkey),这哥们我相信只要是玩过Google浏览器的同志都不会太陌生,它有着丰富的脚本资源,因而可以满足我们平时的网络需求,但是请注意,油猴脚本只能作用在Chromeium内核的浏览器上哦,小编所使用的360浏览器就是其中之一,其它的像什么QQ浏览器,UC浏览器等都是,随意选择一种即可;IE浏览器不是哦。

三、安装脚本

这里我们以360浏览器为主进行讲解,首先需要进入扩展管理界面,要想进入就得先点击管理图标,如下:

就是这个田子型的图标,点击它即可进入,然后我们点击加号按钮就可以进入扩展管理界面,如下:

这里我们在红色箭头处输入:‘tampermonkey’“,然后点击安装即可。安装成功是这个样子的,如图:

四、选择脚本库

虽然我们已经安装了油猴脚本,但是并不表示现在就可以随心所欲下载资源,进行各种骚操作了,我们还需要下载另一个脚本资源。不过在下载脚本资源之前,我们需要在某个库中查找,因为这些脚本资源目前都集中在库中,目前来说最出名的就是”GreasyFork “和”OpenUserJS “。小编选择的是”GreasyFork “,不因为别的,只是觉得这个网站的布局风格我很喜欢,于是果断选择了它,如图:

五、安装附加脚本

既然我们已经找到最合适的库了,那么接下来就是安装附加的脚本了,这里我们需要下载一个脚本,名为”网盘助手“,选择最新版本的网盘助手,如图:

点击进去,然后进行下载,如图:

这里我们可以在油猴的界面去查看当前下载的脚本的状态,如图:

可以看到,这里小编下载了两个脚本。

六、下载文件它就是解除

接下来就是最重要的时刻,做了那么多还不就是为下载文件做铺垫吗?那么我们该怎么做了?首先小编要说明的一点就是,你必须先把这个要下载的文件保存到百度网盘中才可以 ,那么废话不多说,保存我想大家都会,那就看网盘里有啥资源吧,我们随便选择一个资源,如图:

可以看到,选择了之后就会出现一些其它的选项,我们选择生成链接,然后会出现一个链接,如图:

我们点击这个链接,如图:

这样就弹出了下载链接了,我们选择好下载路径后直接点击下载,如图:

静静等待下载,一切大功告成。

七、总结

其实,像这样的神器在油猴中还有许多,这只是其中的一个而已,油猴上有很多优秀的脚本,好用到哭。

说说Python集合的那些事儿

大家好,我是IT共享者,人称皮皮。今天给大家来捋一捋Python集合。

一、什么是集合?

集合(set)和字典(dict)类似,它是一组 key 的集合,但不存储 value。集合的特性就是:key 不能重复。

二、集合常用操作

1. 创建集合

set 的创建可以使用 {} 也可以使用 set 函数:

s1 = {'a', 'b', 'c', 'a', 'd', 'b'}  # 使用 {}
print(s1)
(['a', 'c', 'b', 'd'])

s2 = set('helloworld')  # 使用 set(),接收一个字符串
print(s2)
set(['e', 'd', 'h', 'l', 'o', 'r', 'w'])
s3 = set(['.mp3', '.mp4', '.rmvb', '.mkv', '.mp3'])  # 使用 set(),接收一个列表
print(s3)
set(['.mp3', '.mkv', '.rmvb', '.mp4'])

说说Python集合的那些事儿

2. 遍历集合

s = {'a', 'b', 'c', 'a', 'd', 'b'}
for e in s:
    print(e)

说说Python集合的那些事儿

3. 添加元素

add() 方法可以将元素添加到 set 中,可以重复添加,但没有效果。

s = {'a', 'b', 'c', 'a', 'd', 'b'}
print(s)
set(['a', 'c', 'b', 'd'])
s.add('e')
print(s)
set(['a', 'c', 'b', 'e', 'd'])
s.add('a')
print(s)
set(['a', 'c', 'b', 'e', 'd'])
s.add(4)
print(s)
set(['a', 'c', 'b', 4, 'd', 'e'])

说说Python集合的那些事儿

4. 删除元素

remove() 方法可以删除集合中的元素, 但是删除不存在的元素,会抛出 KeyError,可改用 discard()

例子:

s = {'a', 'b', 'c', 'a', 'd', 'b'}
print(s)
set(['a', 'c', 'b', 'd'])
s.remove('a')  # 删除元素 'a'
print(s)
set(['c', 'b', 'd'])
s.remove('e')  # 删除不存在的元素,会抛出 KeyError

说说Python集合的那些事儿

s = {'a', 'b', 'c', 'a', 'd', 'b'}
print(s)
set(['a', 'c', 'b', 'd'])
s.remove('a')  # 删除元素 'a'
print(s)
set(['c', 'b', 'd'])
s.discard('e')  # 删除不存在的元素, 不会抛出 KeyError

说说Python集合的那些事儿

三、交集/并集/差集

Python 中的集合也可以看成是数学意义上的无序和无重复元素的集合,因此,我们可以对两个集合作交集、并集等。

看看例子:

s1 = {1, 2, 3, 4, 5, 6}
s2 = {3, 6, 9, 10, 12}
s3 = {2, 3, 4}
print(s1 & s2 ) # 交集
set([3, 6])
print(s1 | s2)  # 并集
set([1, 2, 3, 4, 5, 6, 9, 10, 12])
print(s1 - s2)  # 差集
set([1, 2, 4, 5])
print(s3.issubset(s1))  # s3 是否是 s1 的子集

print(s3.issubset(s2))  # s3 是否是 s2 的子集

print(s1.issuperset(s3))  # s1 是否是 s3 的超集

print(s1.issuperset(s2))  # s1 是否是 s2 的超集

说说Python集合的那些事儿

四、总结

本文主要介绍了Python的另外一种形式(集合),通过讲解集合中如何去创建集合,遍历集合,解释了两种常见的集合操作,添加元素和删除元素。最后通过一个小项目,介绍了集合之间中的三种关系。希望能够帮助大家更好的学习。

Vue的学习笔记(下篇)

一、什么是Vue.js?

Vue 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。

前面几天我们已经分享了Vue的学习笔记(中篇)和Vue的学习笔记(上篇),今天我们一起来看看下篇。

二、Vue的v-for循环

(一)v-for循环普通数组

1.在data中定义普通数组;

data(){
return{
list: [1, 2, 3, 4, 5]
}
}

2.在html中使用v-for指令渲染;

<p v-for="(item, i) in list">索引值是:{{i}} --- 每一项的值是:{{item}}</p>

3.效果图如下图:

Vue的学习笔记(下篇)

(二)v-for循环对象数组

1.在data 中定义对象数组;

data(){
return{
        list: [
  { id: 1, name: 'zhan1' },
  { id: 2, name: 'zhan2' },
  { id: 3, name: 'zhan3' },
  { id: 4, name: 'zhan4' }
]
}
}

2.在html中使用v-for指令渲染:

<p v-for="(user, i) in list">Id:{{ user.id }} --- 名字:{{ user.name }} --- 索引值是:{{i}}</p>

3.效果图如下图:

Vue的学习笔记(下篇)

(三)v-for循环对象,在遍历对象的身上的键值对时候,除了有val、key,在第三个位置还有一个索引值。

1.在data定义一个对象;

data(){
return{
user: {
        id: 1,
        name: 'zhan',
        gender: '男'
   }
}
}

2.在html中使用v-for指令渲染:

<p v-for="(val, key, i) in user">值是:{{ val }} --- 键是:{{key}} -- 索引值是:{{i}}</p>

3.效果图如下图:

Vue的学习笔记(下篇)

(四)v-for迭代数字 ###在in后面我们放过普通数组、对象数组、对象,还可以放数字,如果使用v-for迭代数字的时候,前面的count值的从1开始。

1.在html中使用v-for指令渲染:

<p v-for="count in 5">这是第 {{ count }} 次循环</p>

2.效果图如下图:

Vue的学习笔记(下篇)

(五)v-for循环中key属性的使用

v-for 循环的时候,key 属性只能使用number获取string,在key使用的时候,必须使用v-bind属性绑定的形式,指定key的值,在组件中,使用v-for循环的时候,如果有v-for的同时,指定唯一的字符串/数字类型:key的值。

1.在data 中定义对象数组;

data(){
return{
        list: [
  { id: 1, name: 'zhan1' },
  { id: 2, name: 'zhan2' },
  { id: 3, name: 'zhan3' },
  { id: 4, name: 'zhan4' }
]
}
}

2.在html中使用v-for指令渲染代码如下图:

Vue的学习笔记(下篇)

3.效果图如下图:

Vue的学习笔记(下篇)

三、Vue过滤器的基本使用

1.首先定义一个 Vue 全局的过滤器,名字叫做msgFormat,字符串的replace方法的第一个参数,除了可以写一个字符串之外,还可以定义一个正则。

2.在js的代码中,如以下代码:

Vue.filter('msgFormat', function (msg, arg, arg2) {
  return msg.replace(/day/g, arg + arg2)
})


Vue.filter('test', function (msg) {
  return msg + '========'
})

3.在html代码中,如以下代码:

<p>{{ msg | msgFormat('我', '123') | test }}</p>

4.在data中,定义一个msg:

data(){
return{
msg:'the day is cloudless'
}
}

5.效果图如下图:

Vue的学习笔记(下篇)

四、总结

1.vue中的v-for循环有普通数组、对象数组、对象、迭代数字、key属性的使用,这些用法的详解,希望对大家有所帮助。

2.vue过滤器的基本使用局部过滤器优先于全局过滤器被调用,一个表达式可以使用多个过滤器,过滤器之间需要用管道符“|”隔开,其执行顺序从左往右。

3.这些代码比较简单,希望对你有帮助!