一. 字符串 首先是不推荐字符串的, 原因如下: 1. 使用字符串存储日期,第一个显而易见的问题就是无法使用 MySQL 中提供的日期函数,这会为很多查询带来不便 2. 使用字符串存储日期的第二个问题就是占用空间较大, 例如存储一个标准yyyy-MM-dd HH:mm:ss格式的时间: 二. timestamp 先来看看timestamp的特点: 1. timestamp存储范围则介于 1970-01-01 00:00:01 UTC 到 2038-01-19 03:14:07 UTC 之间 2. timestamp自带时区属性, TIMESTAMP 类型字段的值会随着服务器时区的变化而变化,自动换算成相应的时间 3. 数据库中存储的形式为: yyyy-MM-dd HH:mm:ss 4. 对应Java类型: java.sql.Timestamp 故, 如果你的业务需要对应不同的国家时区,那么类型 TIMESTAMP 是一种不错的选择, 但它最大的弊病是他的存储范围只到2038年..
三. datetime 看看datetime的特点: 1. 数据库中存储的形式为:yyyy-MM-dd HH:mm:ss, 这个和timestamp存储形式一样 2. datetime存储范围介于 1000-01-01 00:00:00 到 9999-12-31 23:59:59 之间, 相比timestamp, 其可存储范围更大 3. datetime不具备时区属性, 时区问题也并非一定要在数据库中解决,也可以在前端或者服务端用代码处理下 4. 对应Java类型: java.util.Date 或者 jdk8的LocalDateTime 一般存储日期时间格式的字段, 建议使用datetime
四. date 看看date的特点: 1.
使用ionic官方的方式安装file-transfer如下:
$ ionic cordova plugin add cordova-plugin-file-transfer $ npm install @awesome-cordova-plugins/file-transfer 在引用时报错
后面查阅资料猜测原因是,使用awesome-cordova-plugins安装插件导致,本地没有安装@awesome-cordova-plugins/core,本地之前是使用@ionic-native的方式安装,且安装了@ionic-native/core环境
解决方式:
方式一
1.后面就换成使用@ionic-native的方式安装插件
$ ionic cordova plugin add cordova-plugin-file-transfer
$ npm install --save @ionic-native/file-transfer
方式二
或者安装@awesome-cordova-plugins/core后使用前面的方式
Docker有两个分支版本:Docker CE和Docker EE,即社区版和企业版。本教程基于CentOS 7安装Docker CE。 1. 安装Docker的依赖库。 yum install -y yum-utils device-mapper-persistent-data lvm2 2. 添加Docker CE的软件源信息。 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 3. 安装Docker CE。 yum makecache fast yum -y install docker-ce docker-ce-cli CentOS8.0只需要yum makecache即可 CentOS8.0安装docker-ce报错 Error: Problem: package docker-ce-3:19.03.14-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed 说明containerd.io 要>= 1.2.2-3,一种是降低版本,一种是手动安装containerd.io wget https://download.docker.com/linux/centos/8/x86_64/edge/Packages/containerd.io-1.3.7-3.1.el8.x86_64.rpm yum -y install docker-ce 4.
//********* // 成员内部类 class CallableThread implements Callable<String> { @Override public String Back() { //Back()这个就是执行的业务方法 try { // 假设这个是一个耗时的网络 请求 Thread.currentThread().sleep(5000); return 执行成功!; } catch (Exception e) { e.printStackTrace(); return 执行异常!; } } } Callable<String> callableThread=new CallableThread(); FutureTask<String> task= new FutureTask<>(callableThread); // 开启线程 new Thread(task).start(); Result r; try { // 如果3秒没有返回值就 抛出异常 r = task.get(3000, TimeUnit.MILLISECONDS); } catch (Exception e) { r=null; } // 结束事件 //*********** 方式二:(这个方法可以获取到返回值) //********* final ExecutorService exec = Executors.
先上floyd算法的代码,本质上是动态规划问题本质就是DP含有动态规划的思想,满足重叠子问题和最优子结构dis[k][i][j]=min(dis[k-1][i][j],dis[k-1][i][k]+dis[k-1][k][j]);我们可以发现他其实是由前k-1的状态来推出第k个点的状态之后你就会发现f[k]只与f[k-1]有关 然后我们可以根据这个性质解决很多问题
for (k = 1; k <= n; k++) { for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { if (dis[i][k] + dis[k][j] < dis[i][j]) { dis[i][j] = dis[i][k] + dis[k][j]; } } } } 这个经典代码的难点在于理解为什么k的循环在外面,这里附上一波知乎的高赞解释
这篇文章主要介绍了Python 测试框架unittest和pytest的优劣,帮助大家更好的进行python程序的测试,感兴趣的朋友可以了解下 一、Unittest
Unittest是Python标准库中自带的单元测试框架,Unittest有时候也被称为PyUnit,就像JUnit是Java语言的标准单元测试框架一样,Unittest则是Python语言的标准单元测试框架。
Unittest支持自动化测试,测试用例的初始化、关闭和测试用例的聚合等功能,它有一个很重要的特性:它是通过类(class)的方式,将测试用例组织在一起。
示例:
运行结果
注:unittest有一个关联模块unittest2,但unittest2仅适用于Python 2.4-2.6。这是由于从Python 2.7开始,unittest增加一些新的特性。为了在老的版本中支持这些特性,所以提供了unittest2这个库。但对于Python 2.7及之后的版本,unittest是唯一的。本次示例中使用的为python2.7。
二、Pytest
Pytest是Python的另一个第三方单元测试库。它的目的是让单元测试变得更容易,并且也能扩展到支持应用层面复杂的功能测试。
pytest的特性有:
支持用简单的assert语句实现丰富的断言,无需复杂的self.assert*函数 自动识别测试模块和测试函数 模块化夹具用以管理各类测试资源 对 unittest 完全兼容,对 nose基本兼容 支持Python3和PyPy3 丰富的插件生态,已有300多个各式各样的插件,社区繁荣 示例:
执行结果:
三、Unittest vs Pytest
unittest pytest 用例编写规则 1)测试文件必须先import unittest 2)测试类必须继承unittest.TestCase
3)测试方法必须以“test_”开头
4)测试类必须要有unittest.main()方法
1)测试文件名必须以“test_”开头或者_test结尾(如:test_ab.py) 2)测试方法必须以“test_”开头
3)测试类命名以Test开头
用例分类执行 默认执行全部用例,也可以通过加载testsuit,执行部分用例 可以通过@pytest.mark来标记类和方法,pytest.main加入参数(-m)可以只运行标记的类和方法 用例前置和后置 提供了setUp/tearDown,只能针对所有用例 pytest中的fixture显然更加灵活。可以任意自定义方法函数,只要加上@pytest.fixture()这个装饰器,那么被装饰的方法就可以被使用 参数化 需依赖ddt库 使用@pytest.mark.parametrize装饰器 断言 很多断言格式(assertEqual、assertIn、assertTrue、assertFalse) 只有assert一个表达式,用起来比较方便 报告 使用HTMLTestRunnerNew库 有pytest-HTML、allure插件 失败重跑 无此功能 pytest支持用例执行失败重跑,pytest-rerunfailures插件 总结:
今天用docker部署一个web服务时遇到总是连不上宿主机mysql数据库的问题,报SQLSTATE[HY000] [2002] Connection refused,经过测试,宿主机用相同配置可以连上,登入docker容器内就连不上,初步判断容器内通过localhost或127.0.0.1是连不上宿主机的。具体原因和解决方法如下:
原因: docker容器内的localhost并不是指宿主机的localhost
docker在运行时就建立了虚拟网卡,并命名为docker0,在宿主机ifconfig可以看到网桥的ip是172.17.0.1(不同机器或者docker版本ip可能不同,需要查下自己的是多少)
解决方法: 在容器内通过172.17.0.1:3306访问宿主机的mysql $ docker exec -it 8686d3dda02c /bin/sh $ mysql -ushowx -p --database showx -P3306 -h172.17.0.1 #可以看到连上了,只是ip没有访问授权 ERROR 1130 (HY000): Host '172.17.0.2' is not allowed to connect to this MySQL server 设置宿主机mysql允许docker0的虚拟网卡ip访问 # 宿主机mysql设置允许用户showx通过172.17.0.2访问showx数据库的任意表 $ mysql -uroot -p mysql>GRANT ALL PRIVILEGES ON showx.* TO 'showx'@'172.17.0.2' IDENTIFIED BY 'password' WITH GRANT OPTION; mysql>flush privileges; # docker内测试docker0 ip链接 $ docker exec -it 8686d3dda02c /bin/sh $ mysql -ushowx -p --database showx -P3306 -h172.
1、自建yum仓库,分别为网络源和本地源
一、本地源
备份文件 [21:55:01 root@CentOS8 /etc/yum.repos.d]#mkdir backup [21:55:08 root@CentOS8 /etc/yum.repos.d]#mv *.repo ./backup/
1)挂载 mount /dev/cdrom /mnt/
2)修改配置文件 vim /etc/yum.repos.d/local.repo [aaa] name=aaa baseurl=file:///mnt/AppStream/ gpgcheck=0
[bbb] name=bbb baseurl=file:///mnt/BaseOS/ gpgcheck=0 enabled=1 ~ 对于yum源的URL地址,有三种表示模式: (1)指向网络的web服务器:baseurl=http://..................... (2)指向网络的ftp服务器:baseurl=ftp://.......................... (3)指向本地的某个目录:baseurl=file://............................ 我们只需要更改对应的地址就可以。 3)检查挂载点是否生效 Yum repolist 4)安装软件yum扩展包 [21:15:27 root@CentOS8 /etc/yum.repos.d]#yum install yum-utils -y
5)安装软件vsftpd [21:19:32 root@CentOS8 /etc/yum.repos.d]#yum install vsftpd -y 二、网络源
备份文件 [15:21:46 root@localhost /etc/yum.repos.d]#mkdir backup [15:21:58 root@localhost /etc/yum.repos.d]#mv *.repo ./backup/
1)修改清华yum源配置文件Centos-7.repo 设置虚拟机网卡为桥接模式,更改IP地址获取方式为dhcp,就可以上网了。
2)vim /etc/yum.repos.d/Centos-7.repo 3)清除yum缓存 [15:52:14 root@localhost /etc/yum.
SQL注入攻击是指攻击者利用SQL漏洞,绕过系统约束,越权获取数据的攻击方式。
#SQL代码 select * from a where name=' +name+ ' ; #正常情况,name:张三 select * from a where name='张三'; #SQL注入,name:' or 1=1 or 1=' select * from a where name='' or 1=1 or 1=''; 前端输入的字符串可能作为SQL语句的一部分被带入到SQL中执行,造成了数据泄露的可能,解决办法是将单引号(')字符进行转译,Mybatis已经为我们提供了相关工作。
MyBatis两种传值方式
${ }文本替换,未经任何处理对文本进行替换
#{ }预编译传值,对字符串中的特殊字符转译处理,可以预防SQL注入
import redis REDIS_ITEMS_HOST: str = host REDIS_ITEMS_PASSWORD: str = pwd REDIS_ITEMS_DB: int = 4 #查询DB4 REDIS_ITEMS_PORT: int = 6379 new_r = redis.Redis(host=REDIS_ITEMS_HOST, password=REDIS_ITEMS_PASSWORD, port=REDIS_ITEMS_PORT, db=REDIS_ITEMS_DB) new_key = 'XXX' # redis key old_key = 'XXX' new_r_list = new_r.zrangebyscore(new_key, start, end) new_r_data = [info.decode('utf-8') for info in new_r_list] old_r_list = old_r.zrangebyscore(old_key, start, end) old_r_data = [info.decode('utf-8') for info in old_r_list] #end = datetime.datetime.now().timestamp() * 1000 #start = int((datetime.datetime.now() - datetime.timedelta(days=3)).timestamp() * 1000) end = 1650268800000 start = 1650267600000 print(条数:,new_r.