数据库MySQL
引言,没有数据库发明之前采用方式就是数据以文件形式存储到自己的计算机中,因此文件路径不统一数据格式也不统一这样导致开发效率极低。之后就有了数据库服务,数据存储到网络中文件路径以及数据格式都得到统一了。从底层原理分析数据库也是操作数据的进程即一堆代码、这就意味着每一名程序员都有资格编写出数据库;从实际应用角度分析数据库是可视化操作界面即常说的软件、说明数据库也是CS架构的程序。数据库有两种分类,一是关系型数据库、二是非关系型数据库。本次通过学习关系型数据库MySQL来学习数据库的操作,因为数据库软件也很多但是操作方式大差不差。
关系型数据库举例
非关系型数据库举例
一、MySQL基本操作SQL语句
mysql -uroot -p
mysqladmin -uroot -p原密码 password 新密码
net stop mysql
mysqld --skip-grant-table
update mysql.user set password=password('123') where Host='localhost' and User='root';
最后关闭服务端然后正常运行方式启动即可解决忘记密码的问题
create database 库名;
alter database 库名 charset='utf8';
drop database 库名;
use 库名;
create table 表名(字段名 字段类型,字段名 字段类型);
alter table 表名 rename 新表名;
drop table 表名;
nsert into 表名 values(数据值1,数据值2);
select * from 表名;
update 表名 set 字段名=新数据 where 筛选条件;
delete from 表名 where id=2;
show databases;
show tables;
select * from mysql.user;
制作系统服务的操作
查看系统服务 services.msc
启动系统服务 net start mysql
先关闭服务端 net stop mysql
移除系统服务 mysqld --remove
二、修改字符编码配置文件以及数据库存储引擎
值得注意的是只有MySQL5.6及之前版本的MySQL数据库需要该操作 之后的版本都已经全部默认统一 如果想要永久编码配置需要操作配置文件。具体操作如
先找到默认编码配置文件my-default.ini
拷贝改文件并把文件名改为my.ini
清楚原有的内容再把以下代码CV即可
操作完之后需要重启服务端
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
存储引擎 ;数据库针对数据采取的多种存取方式
查看数据库存储引擎的命令
show engines;
当我们在使用数据库存储数据的时候 如果数据不符合规范 应该直接报错而不是擅自修改数据 这样会导致数据的失真(没有实际意义)正常都应该报错 但是我们之前不小心改了配置文件。
展示严格模式命令
show variables like '%mode%';
临时修改严格模式;如果想永久修改你就直接改配置既可
set session sql_mode='strict_trans_tables';在当前客户端有效
set global sql_mode='strict_trans_tables';在当前服务端有效
三、创建表的完整的语法
create table 表名(
字段名 字段类型(数字) 约束条件,
字段名 字段类型(数字) 约束条件,
字段名 字段类型(数字) 约束条件
);
四、字段类型
tinyint 1bytes 正负号(占1bit)
smallint 2bytes 正负号(占1bit)
int 4bytes 正负号(占1bit)
bigint 8bytes 正负号(占1bit)
float(20,10)总共存储20位数 小数点后面占10
double(20,10)总共存储20位数 小数点后面占10
decimal(20,10)总共存储20位数 小数点后面占10
float < double < decimal
char(4) 最多存储四个字符 超出就报错 不够四个空格填充至四个
varchar(4) 最多存储四个字符 超出就报错 不够则有几位存几位
set global sql_mode='strict_trans_tables,pad_char_to_full_length';
枚举
多选一
create table t15(
id int,
name varchar(32),
gender enum('male','female','others')
);
insert into t15 values(1,'tony','猛男');
insert into t15 values(2,'jason','male');
insert into t15 values(3,'kevin','others');
集合
多选多(多选一)
create table t16(
id int,
name varchar(16),
hobbies set('basketabll','football','doublecolorball')
);
insert into t16 values(1,'jason','study');
insert into t16 values(2,'tony','doublecolorball');
insert into t16 values(3,'kevin','doublecolorball,football');
datetime 年月日时分秒
date 年月日
time 时分秒
year 年
create table t17(
id int,
name varchar(32),
register_time datetime,
birthday date,
study_time time,
work_time year
);
insert into t17 values(1,'jason','2000-11-11 11:11:11','1998-01-21','11:11:11','2000');
五、字段约束条件
id int unsigned
id int(5) zerofill
所有字段类型不加约束条件的情况下默认都是可以为空
create table table1(
id int,
name varchar(16) not null
);
create table table2(
id int default 666,
name varchar(16) default '匿名'
);
create table table3(
id int unique,
name varchar(32) unique
);
create table table4(
id int primary key
name varchar(32)
);
主键相当于非空且唯一not null and unique
如果没有明确主键那么第一个字段默认升级为主键
创表时应该有一个字段用来表示数据的唯一性通常用id字段
自增单独是无效、只能与主键配合着使用且只能出现一次
六、字段约束条件之外键及其创建
外键字段用于表示数据与数据之间关系的字段,也是两个表之间的关系,该关系有四种、关系的判断可以采用换位思考的原则。建立外键时先定义出含有普通字段的表再考虑外键字段。创建表时一定要先创建关联表、录入数据的时候也一定先录入被关联表、修改数据的时候外键字段无法修改和删除,可以有简化操作即级联更新级联删除。外键是强耦合不符合解耦合的特性所以很多时候实际项目中当表较多的情况可能不使用外键而是使用代码建立逻辑层面关系。
# 一对一
create table user(
id int primary key auto_increment,
name varchar(32),
detail_id int unique,
foreign key(detail_id) references userdetail(id)
on update cascade
on delete cascade
);
create table userdetail(
id int primary key auto_increment,
phone bigint
);
# 一对多
create table emp(
id int primary key auto_increment,
name varchar(32),
age int,
dep_id int,
foreign key(dep_id) references dep(id)
);
create table dep(
id int primary key auto_increment,
dep_name varchar(32),
dep_desc varchar(64)
);
create table emp1(
id int primary key auto_increment,
name varchar(32),
age int,
dep_id int,
foreign key(dep_id) references dep1(id)
on update cascade
on delete cascade
);
create table dep1(
id int primary key auto_increment,
dep_name varchar(32),
dep_desc varchar(64)
);
# 多对多
create table book(
id int primary key auto_increment,
title varchar(32),
price float(5,2)
);
create table author(
id int primary key auto_increment,
name varchar(32),
phone bigint
);
create table book2author(
id int primary key auto_increment,
author_id int,
foreign key(author_id) references author(id)
on update cascade
on delete cascade,
book_id int,
foreign key(book_id) references book(id)
on update cascade
on delete cascade
);
七、SQL语句查询关键字
SQL语句的编写也类似于代码编写不是一蹴而就也是需要反反复复的修修补补之后写出来的,针对select后面字段可以先用*号占位后面回来修改就可以、但是实际运用中很少有这个操作因为数据特别多的情况下非常浪费数据库资源学习该部分需要实操数据库,所以需要提前做数据准备,具体准备如下:
create table emp(
id int primary key auto_increment,
name varchar(20) not null,
gender enum('male','female') not null default 'male', #大部分是男的
age int(3) unsigned not null default 28,
hire_date date not null,
post varchar(50),
post_comment varchar(100),
salary double(15,2),
office int, #一个部门一个屋子
depart_id int
);
#插入记录
#三个部门:教学,销售,运营
insert into emp(name,gender,age,hire_date,post,salary,office,depart_id) values
('jason','male',18,'20170301','浦东第一帅形象代言',7300.33,401,1), #以下是教学部
('tom','male',78,'20150302','teacher',1000000.31,401,1),
('kevin','male',81,'20130305','teacher',8300,401,1),
('tony','male',73,'20140701','teacher',3500,401,1),
('owen','male',28,'20121101','teacher',2100,401,1),
('jack','female',18,'20110211','teacher',9000,401,1),
('jenny','male',18,'19000301','teacher',30000,401,1),
('sank','male',48,'20101111','teacher',10000,401,1),
('哈哈','female',48,'20150311','sale',3000.13,402,2),#以下是销售部门
('呵呵','female',38,'20101101','sale',2000.35,402,2),
('西西','female',18,'20110312','sale',1000.37,402,2),
('乐乐','female',18,'20160513','sale',3000.29,402,2),
('拉拉','female',28,'20170127','sale',4000.33,402,2),
('僧龙','male',28,'20160311','operation',10000.13,403,3), #以下是运营部门
('程咬金','male',18,'19970312','operation',20000,403,3),
('程咬银','female',18,'20130311','operation',19000,403,3),
('程咬铜','male',18,'20150411','operation',18000,403,3),
('程咬铁','female',18,'20140512','operation',17000,403,3);
select 后面要跟指定的字段名信息写*号默认差所有的字段信息
from 后面要跟指定的表名
select * from userinfo; # 从userinfo表里面查询所有的字段
select id, name, from userinfo; # 从userinfo表里面查询id,name字段
编写的时候先写select再写from,代码执行的时候恰好相反
# 1.查询id大于等于3小于等于6的数据
select * from emp where id >= 3 and id <= 6;
select * from emp where id between 3 and 6;
# 2.查询薪资是20000或者18000或者17000的数据
select * from emp where salary=20000 or salary=18000 or salary=17000;
select * from emp where salary in (20000,18000,17000);
# 3.查询id小于3大于6的数据
select * from emp where id<3 or id>6;
select * from emp where id not between 3 and 6;
# 4.查询员工姓名中包含字母o的员工姓名与薪资(模糊查询用like)
select * from emp where name like '%o%';
# 5.查询员工姓名是由四个字符组成的员工姓名与其薪资
select * from emp where name like '____';
select * from emp where char_length(name) = 4;
# 6.查询岗位描述为空的员工名与岗位名 针对null不能用等号,只能用is
select * from emp where post_comment is NULL;
聚合函数 专门用于分组之后的数据统计
max\min\sum\avg\count 最大值、最小值、求和、平均值、计数
# 1.将员工数据按照部门分组
select * from emp group by post;
# 2.获取每个部门的最高工资
select post,max(salary) from emp group by post;
select post as '部门',max(salary) as '最高薪资' from emp group by post;
# 3.一次获取部门薪资相关统计
select post,max(salary) '最高薪',min(salary) '最低薪',avg(salary) '平均薪资',sum(salary) '月支出' from emp group by post;
# 4.统计每个部门的人数
select post,count(id) from emp group by post;
#5.统计每个部门的部门名称以及部门下的员工姓名
'''分组以外的字段无法直接填写 需要借助于方法'''
select post,name from emp group by post;
select post,group_concat(name) from emp group by post;
select post,group_concat(name,age) from emp group by post;
select post,group_concat(name,'|',age) from emp group by post;
select post,group_concat(name,'_NB') from emp group by post;
select post,group_concat('DSB_',name,'_NB') from emp group by post
having与where本质是一样的 都是用来对数据做筛选只不过where用在分组之前(首次筛选)having用在分组之后(二次筛选)
# 1.统计各部门年龄在30岁以上的员工平均工资 并且保留大于10000的数据
步骤1:先筛选出所有年龄大于30岁的员工数据
select * from emp where age > 30;
步骤2:再对筛选出来的数据按照部门分组并统计平均薪资
select post,avg(salary) from emp where age > 30 group by post;
步骤3:针对分组统计之后的结果做二次筛选
select post,avg(salary) from emp where age > 30 group by post having avg(salary) > 10000;
数据必须一模一样才可以去重
select distinct id,age from emp; 关键字针对的是多个字段组合的结果
select distinct age from emp;
select distinct age,post from emp;
select * from emp order by age; 默认升序 asc升序 desc降序
select * from emp order by age,salary desc; 先按照年龄升序排 相同的情况下再按照薪资降序排
select * from emp limit 5; 直接限制展示的条数
select * from emp limit 5,5; 从第5条开始往后读取5条
SQL语句的模糊匹配如果用不习惯 也可以自己写正则批量查询
select * from emp where name regexp '^j.*?(n|y)$';
八、多表查询
前期数据准备
create table dep(
id int primary key auto_increment,
name varchar(20)
);
create table emp(
id int primary key auto_increment,
name varchar(20),
sex enum('male','female') not null default 'male',
age int,
dep_id int
);
#插入数据
insert into dep values
(200,'技术'),
(201,'人力资源'),
(202,'销售'),
(203,'运营'),
(205,'财务');
insert into emp(name,sex,age,dep_id) values
('jason','male',18,200),
('dragon','female',48,201),
('kevin','male',18,201),
('nick','male',28,202),
('owen','male',18,203),
('jerry','female',18,204);
select * from emp inner join dep on emp.dep_id=dep.id;内连接
该方法只连接两张表共有的部分,此外还有left、right、union join
将一条SQL语句用括号括起来当成另外一条SQL语句的查询条件
这个只能用例子来展示
题目:求姓名是jason的员工部门名称
子查询类似于我们日常生活中解决问题的方式>>>:分步操作
步骤1:先根据jason获取部门编号
select dep_id from emp where name='jason';
步骤2:再根据部门编号获取部门名称
select name from dep where id=200;
总结select name from dep where id=(select dep_id from emp where name='jason');
九、多表查询练习跟Navicat可视化软件同步操作
查询所有的课程的名称以及对应的任课老师姓名
# 1.先确定需要用到几张表 课程表 分数表
# 2.预览表中的数据 做到心中有数
select * from course;
select * from teacher;
# 3.确定多表查询的思路 连表 子查询 混合操作
SELECT
teacher.tname,
course.cname
FROM
course
INNER JOIN teacher ON course.teacher_id = teacher.tid;
查询平均成绩大于八十分的同学的姓名和平均成绩
# 1.先确定需要用到几张表 学生表 分数表
# 2.预览表中的数据
select * from student;
select * from score;
# 3.根据已知条件80分 选择切入点 分数表
# 求每个学生的平均成绩 按照student_id分组 然后avg求num即可
select student_id,avg(num) as avg_num from score group by student_id having avg_num>80;
# 4.确定最终的结果需要几张表 需要两张表 采用连表更加合适
SELECT
student.sname,
t1.avg_num
FROM
student
INNER JOIN (
SELECT
student_id,
avg(num) AS avg_num
FROM
score
GROUP BY
student_id
HAVING
avg_num > 80
) AS t1 ON student.sid = t1.student_id;
查询没有报李平老师课的学生姓名
# 1.先确定需要用到几张表
老师表 课程表 分数表 学生表
# 2.预览每张表的数据
# 3.确定思路 思路1:正向筛选 思路2:筛选所有报了李平老师课程的学生id 然后取反即可
# 步骤1 先获取李平老师教授的课程id
select tid from teacher where tname = '李平老师';
select cid from course where teacher_id = (select tid from teacher where tname = '李平老师');
# 步骤2 根据课程id筛选出所有报了李平老师的学生id
select distinct student_id from score where course_id in (select cid from course where teacher_id = (select tid from teacher where tname = '李平老师'))
# 步骤3 根据学生id去学生表中取反获取学生姓名
SELECT
sname
FROM
student
WHERE
sid NOT IN (
SELECT DISTINCT
student_id
FROM
score
WHERE
course_id IN (
SELECT
cid
FROM
course
WHERE
teacher_id = (
SELECT
tid
FROM
teacher
WHERE
tname = '李平老师'
)
)
)
查询没有同时选修物理课程和体育课程的学生姓名(报了两门或者一门不报的都不算)
# 1.先确定需要的表
学生表 分数表 课程表
# 2.预览表数据
# 3.根据给出的条件确定起手的表
# 4.根据物理和体育筛选课程id
select cid from course where cname in ('物理','体育');
# 5.根据课程id筛选出所有跟物理 体育相关的学生id
select * from score where course_id in (select cid from course where cname in ('物理','体育'))
# 6.统计每个学生报了的课程数 筛选出等于1的
select student_id from score where course_id in (select cid from course where cname in ('物理','体育'))
group by student_id
having count(course_id) = 1;
# 7.子查询获取学生姓名即可
SELECT
sname
FROM
student
WHERE
sid IN (
SELECT
student_id
FROM
score
WHERE
course_id IN (
SELECT
cid FROM
course
WHERE
cname IN ('物理', '体育')
)
GROUP BY
student_id
HAVING
count(course_id) = 1
)
查询挂科超过两门(包括两门)的学生姓名和班级
# 1.先确定涉及到的表
分数表 学生表 班级表
# 2.预览表数据
select * from class
# 3.根据条件确定以分数表作为起手条件
# 步骤1 先筛选掉大于60的数据
select * from score where num < 60;
# 步骤2 统计每个学生挂科的次数
select student_id,count(course_id) from score where num < 60 group by student_id;
# 步骤3 筛选次数大于等于2的数据
select student_id from score where num < 60 group by student_id having count(course_id) >= 2;
# 步骤4 连接班级表与学生表 然后基于学生id筛选即可
SELECT
student.sname,
class.caption
FROM
student
INNER JOIN class ON student.class_id = class.cid
WHERE
student.sid IN (
SELECT
student_id
FROM
score
WHERE
num < 60
GROUP BY
student_id
HAVING
count(course_id) >= 2
);
十、Python操作MySQL及事物操作
需要下载pymysql第三方模块模块 pip3 install pymysql
import pymysql
# 1.连接MySQL服务端
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='123',
db='db4_03',
charset='utf8mb4'
)
# 2.产生游标对象
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # [{},{}]
# 3.编写SQL语句
sql = 'select * from score;'
# 4.发送SQL语句
affect_rows = cursor.execute(sql) # execute也有返回值 接收的是SQL语句影响的行数
print(affect_rows)
# 5.获取SQL语句执行之后的结果
res = cursor.fetchall()
print(res)
1.获取数据
fetchall() 获取所有的结果
fetchone() 获取结果集的第一个数据
fetchmany() 获取指定数量的结果集
cursor.scroll(1,'relative') # 基于当前位置往后移动
cursor.scroll(0,'absolute') # 基于数据的开头往后移动
2.增删改查
autocommit=True # 针对增 删 改 自动确认(直接配置)
conn.commit() # 针对 增 删 改 需要二次确认(代码确认)
事务的四大特性(ACID)
A:原子性 事务中的各项操作是不可分割的整体 要么同时成功要么同时失败
C:一致性 使数据库从一个一致性状态变到另一个一致性状态
I:隔离性 多个事务之间彼此不干扰
D:持久性 也称永久性,指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的
create table user(
id int primary key auto_increment,
name char(32),
balance int
);
insert into user(name,balance)
values
('jason',1000),
('kevin',1000),
('tank',1000);
# 修改数据之前先开启事务操作
start transaction;
# 修改操作
update user set balance=900 where name='jason'; #买支付100元
update user set balance=1010 where name='kevin'; #中介拿走10元
update user set balance=1090 where name='tank'; #卖家拿到90元
# 回滚到上一个状态
rollback;
# 开启事务之后,只要没有执行commit操作,数据其实都没有真正刷新到硬盘
commit;
一、概述:做了几年的移动端一直用rem,感觉最繁琐的就是rem的计算。随便可以用cssrem自动计算,但是有时候感觉宽度跟高度的rem并不是完全准确。所以决定用viewport缩放来试试看效果,经过一些网友的帮忙测试,发现缩放viewport这种方法更简单、高效、准确二、思路:例如效果图是:750*1334(px)的源文件。1、根据750PSD源图宽度尺寸进行比例缩放,高度并没有限制,所以高度是自由的2、缩放viewport的同时,宽度跟高度是等比的,所以敢说这种方式比rem更准确。三、js核心代码:代码说明:切图时只需要按照PSD尺寸大小设置px即可,无需复杂的rem计算js代码:(function(doc,win){ varmaxwidth=750;//PSD源图宽度尺寸 varoMeta=document.getElementById('viewport'); vardocE1=doc.documentElement, resizeEvt='orientationchange'inwindow?'orientationchange
说明:本文实例使用Python版本为3.5.6,Tensorflow版本为2.0介绍Tensorflow是Google推出的机器学习开源神器,对Python有着良好的语言支持,支持CPU,GPU和GoogleTPU等硬件,并且已经拥有了各种各样的模型和算法。目前,Tensorflow已被广泛应用于文本处理,语音识别和图像识别等多项机器学习和深度学习领域。基础框架分为三层:应用层、接口层和核心层应用层提供了机器学习相关的训练库、预测库和针对Python、C++和Java等变成语言的编程环境,类似于web系统的前端,主要实现了对计算图的构造。接口层对Tensorflow功能模块的封装,便于其它语言平台的调用。核心层最重要的部分,包括设备层、网络层、数据操作层和图计算层,执行应用层的计算。1.设备层包括Tensorflow在不同硬件设备上的实现,主要支持CPU、GPU和Mobile等设备,在不同硬件设备上实现计算命令的转换,给上层提供统一的接口,实现程序的跨平台功能。2.网络层网络层主要包括RPC和RDMA通信协议,实现不同设备之间的数据传输和更新,这些协议都会在分布式计算中用到。3.数据操
本文是吴恩达《机器学习》视频笔记第43篇,对应第3周第11个视频。“Regularization——Regularizedlogisticregression”。01—笔记对于逻辑回归代价函数的优化,我们前面也讲过两种办法:(1)比较通用的梯度下降法;(2)一类比较高级的方法,就是想办法计算出代价函数的导数,类似于线性回归中的正规方程的方法。 本小节介绍如何使用正则化解决逻辑回归的问题。如上上小节所述,逻辑回归分类的过拟合问题,会使得决策边界非常的扭曲。类似的,加入正则化项后的代价函数是:与线性回归类似,梯度下降的算法是:与上一小节类似,只需要在\theta_j这一边加上一个正则项即可:同样的,\alpha后面中括号里面的部分,也是对新的代价函数(加入了正则化项)求偏导后的结果。如果是使用Octave来定义这个costFunction的话,我们需要这样写:然后参考前面文章:Octave梯度下降法最优化代价函数的一个例子—MLNote38中介绍的方法就可以了。当然上面的伪代码,中每一个语句的实现都有不同,就是要加上正则化项。小结到此,我们把前面三周的内容都学完了。这个时候,如果你掌握了线
作者:IANJ.HISSEY编译:方的馒头1前言2在量化研究中引入机器学习3自动化机器学习4建立和测试模型为了表明机器学习可用于增强传统的量化因子,我们建立了中国A股的股票预测模型。我们为2012年12月至2019年8月编制了中证800指数的股票表现和各种因子数据的月度概况。我们将目标变量设置为股票的未来一个月收益,并使用原始投资组合模型中的因子。5不要混淆样本内和样本外6屏蔽噪音并一次建模与机器学习的典型用例(如预测同店销售额或个人银行贷款违约的可能性)不同,股票收益数据是嘈杂的。众所周知,时间序列金融数据受复杂行为困扰,包括异方差性、黑天鹅和尾部相关性。在我们的案例中,我们并不试图预测市场收益,而只是预测要投资的股票。为了最大程度地减少这些现象的影响,我们可以仅关注基准相对或同级相对表现,以将噪声降至最低。7简化问题陈述以产生更好的模型8解释你的模型与构建模型一样重要此图表解释了特征与预测的关系。这些可以是并且通常是非线性的。就价值而言,公司的风险敞口越高,我们模型中的预测就越高。然后,我们可以从理论到实践的理解,并研究该策略的交易方式。下图显示了该模型推荐的公司的SWS行业。Y轴
描述给一个01矩阵,求不同的岛屿的个数。0代表海,1代表岛,如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。样例在矩阵:[ [1,1,0,0,0], [0,1,0,0,1], [0,0,0,1,1], [0,0,0,0,0], [0,0,0,0,1] ]复制中有 3 个岛。代码GitHub的源代码,请访问下面的链接:https://github.com/cwiki-us/java-tutorial/blob/master/src/test/java/com/ossez/lang/tutorial/tests/lintcode/LintCode0433NumIslandsTest.javapackagecom.ossez.lang.tutorial.tests.lintcode; importorg.junit.Test; importorg.slf4j.Logger; importorg.slf4j.LoggerFactory; /** *<p> *433 *<ul> *<li>@see<ahref= *"ht
作者:Hcamael@知道创宇404实验室前段时间meh又挖了一个Exim的RCE漏洞[1],而且这次RCE的漏洞的约束更少了,就算开启了PIE仍然能被利用。虽然去年我研究过Exim,但是时间过去这么久了,所以这次复现还是花了大量时间在熟悉Exim源码上。 本次漏洞复现的过程中,踩了好多坑,实际复现的过程中发现堆块的实际情况无法像meh所说的那样的构造,所以在这部分卡了很久(猜测是因为环境不同的原因),之后决定先理解meh利用的大致思路,然后自己根据实际情况对堆块进行构造,虽然过程艰难,但最终基本算是成功了。复现环境搭建 本次使用的环境和上次大致相同,首先去github上该漏洞的patchcommit[2] 然后把分支切换到上一个commit $gitclonehttps://github.com/Exim/exim.git $gitcheckout38e3d2dff7982736f1e6833e06d4aab4652f337a $cdsrc $mkdirLocalMakefile仍然使用上次那个: $catLocal/makefile|grep-v"#" BI
npm常用命令总结1npm升级$sudonpminstallnpm-g复制淘宝镜像$sudonpminstallcnpm-g复制2模块安装模块#安装nodejs的express框架 $npminstallexpress #若出现错误npmerr!Error:connectECONNREFUSED127.0.0.1:8888 $npmconfigsetproxynull #查看所有全局安装的模块 $npmlist-g #查看某个模块的版本号 $npmlistexpress复制卸载模块$npmuninstallexpress复制更新模块$npmupdateexpress复制搜索模块$npmsearchexpress复制创建模块#使用NPM生成package.json文件 $npminit #在npm资源库中注册用户(邮箱) $npmadduser Username:csxiaoyao Password: Email:(thisISpublic)1724338257@qq.com复制发布模块$npmpublish复制3package.jsonname-包名version-包的版本号descr
最近,欧洲支付委员会就区块链及其对支付行业的影响对其会员进行了问卷调查,调查结果表明绝大多数受访者(90%)相信区块链技术在2025年前将会改变支付行业。四分之一的受访者甚至认为其所产生的影响将是深刻而彻底的。世界经济论坛的研究也支持了这些调查结论,按照世界经济论坛的说法,区块链技术将从根本上改变金融机构的经营模式。 近期发展 最近,区块链领域发生了很多大事,支付领域是值得关注的重要领域。最近几个月,关于区块链和支付的报告越来越多,同时在现实世界里我们也看到很多区块链重要事件发生。 报告和颠覆性创新 最近有三个报告值得关注。一份报告来自瑞士信贷,一份来自花旗银行,一份来自世界经济论坛。这些报告尤其关注区块链技术对支付行业产生的颠覆性影响以及可行的应用场景。·瑞士信贷的报告 瑞士信贷最近发布了一份报告阐述了区块链对各个产业的意义,包括全球支付市场。其主要结论为,尽管分类账不需要一个中央结算机构,但是对于Visa和万事达这类发卡机构而言风险有限。 瑞士信贷还认为,支付领域的其他企业比如WordPay,DHCorportion不用过于担忧。真正遇到麻烦的支付企业是SWIFT,“其系统效率较
作者:熊普江,腾讯公司资深架构师来自:51CTO技术栈一,行业背景互联网技术一直在快速演进当中,同时移动互联网与云时代来临,微服务架构由此应映而生。如下图,是微服务在我国的百度搜索指数:从图中可以看出,自2013前后微服务开始逐渐被大家关注,随时间推移搜索的人也越来越多,直至2016年爆发。微服务架构的快速发展并广泛流行,和以下因素息息相关:互联网技术架构飞速演进,特别是底层硬件及芯片技术快速发展,后端服务器的能力越来越强大。多数情况下,单个业务已很难消耗完一整台服务器的资源或处理能力。移动互联网深度融合与应用,瘦客户端兴起,使得云端能力与承载变得更加重要。容器技术得到广泛认可与应用,轻量级协议、代码管理、新集成方法与工具等技术也越来越成熟。近两年,微服务这个术语渐成热门词汇,但它不是一个全新架构,更不是一个包治百病的架构。那么,微服务架构与单体式架构相比优势体现在哪?这些优势又给开发模式、运维带来哪些痛点?二,微服务架构的优势及痛点微服务和单点服务的区别是什么呢?比喻来讲,单点服务是把所有的东西放在一个大盒子里,这个大盒子里什么都有。微服务更像是车箱,每个箱子里包含特定的功能模块和物
腾讯云开发者实验室为开发者提供了一个零门槛的在线实验平台,开发者实验室提供的能力:零门槛扫码即可免费领取实验机器,支持使用自有机器参与,实验完成后支持保留实验成果;在线WEBIDE支持shell命令操作,支持机器文件操作,支持文件实时编辑,结合交互式教学体验提供了良好的在线实验体验;基于云的真实标准的实验环境,确保实验的普适性;.NETCore的最重要的一个特性就是跨平台,Windows很多同学都会,学习Linux已经成为一个.NET程序员的必备技能,因此我和腾讯云同事合作在腾讯云上提供了1个CentOS7.2环境下的.netcore2.0实验教程,结合腾讯云上其他Linux的教程,这就是一个非常好的实现在线学习环境。腾讯云在线实验室目前有30个教程,具体参看实验列表。其中有3个实验是.NETCore和Mono相关的,具体访问https://cloud.tencent.com/developer/labs/gallery?tagId=11。从linux基础开始到.netcore的入门的系列实验,动手实验的效果要比纯粹的看文章的效果要好很多,这里给大家整理一下在腾讯云学习的系列实验推荐。
Stayhungry,stayfoolish!tidyverse系列应该算是R语言数据分析中的瑞士军刀了,统一的格式,简洁的代码,管道符便于阅读的形式,都能让大家快速上手。R数据科学就是专门讲这个系列的,但是对于很多函数的用法和细节问题,都没有说,所以在使用时还是会经常遇到各种问题。我根据R数据科学和tidyverse官网的教程,整理了几篇笔记,主要是对tidyverse的各种函数的用法进行详细的演示。前面已经介绍过了forcats包处理因子型数据,lubridate包处理日期时间格式数据。下面介绍dplyr包。在处理数据时,要明确以下几个问题:明确你的目的用计算机程序的方式描述你的任务执行程序dplyr包可以帮你又快又简单地处理这些问题。tidyr包主要聚焦于把数据变成整洁数据,dplyr包主要功能在于对整洁数据进行各种操作,比如新增、筛选、汇总、合并等。安装数据集:starwars针对单个数据集的操作filter()根据条件筛选行arrange()进行排序slice()根据位置选择行select()选择列mutate()新建列relocate()重排列的位置summarise()汇
文章目录一,云服务基础知识1.1背景1.2云服务的定义1.3个人经常使用的云服务1.4企业/政府经常使用的云服务1.5云计算的模式1.5.1云计算的部署模式1.5.2公有云1.5.3云计算的服务模式1.6云计算的价值1.7云计算的8个通用点二.计算类技术2.1认识虚拟化2.2虚拟化与云计算2.3虚拟化的特点2.4计算虚拟化中的重要概念2.5我们身边的计算资源2.6计算在云计算中的服务形态2.7容器技术2.8容器和虚拟化架构的对比2.9容器和虚拟机的区别2.10容器在云计算中的服务形态三,网络类技术3.1传统网络的概念3.2虚拟网络的基本概念3.2.1桥接和NAT的作用3.2.2虚拟交换机的作用3.3网络在云计算中的服务形态四,存储类技术4.1主流存储类型:4.2块存储4.3文件存储4.4对象存储4.5企业存储的发展过程4.6分布式存储技术4.7存储在云计算中的服务形态一,云服务基础知识1.1背景随着移动互联网、全联接时代的到来,越来越多的终端设备被投入使用,每天都会有大量的数据产生,传统的ICT基础设施也在面临着前所未有的挑战。1.2云服务的定义通俗地讲,“云”是网络、互联网的一种比喻
把想要解决的问题写下来: UPD:挖这么多坑不填是不是作死? UPD:压力山大感觉整个人都不好了 UPD:卧槽居然留了这么多坑? UPD:什么时候闲了填坑! 3276:磁力 2141:排队 3100:排列 1835:[ZJOI2010]base基站选址 2112:[ZJOI2010]Jobs安排工作 2303:[Apio2011]方格染色 1239:[SCOI2008]城堡castle 1367:[Baltic2004]sequence 3547:[ONTAK2010]Matchings 3350:相似回文串 3103:PalindromicEquivalence 1138:[POI2009]Baj最短回文路 1358:[Baltic2009]Beetle 3733:[Pa2013]Iloczyn 3750:[POI2015]Pieczęć 2013:[Ceoi2010]Ahugetower NEUQ1441:过河卒 NEUQ1440:K-圈 1136:[POI2009]Arc 3595:[Scoi2014]方伯伯的Oj 3594:[Scoi2014]方伯伯的玉米田 315
本篇博客摘自下面的博客和自己的理解进行补充,如有侵权,请告知,删除这篇博客,谢谢!。 参考博客: python中的Queue(队列)详解 Python采用列表实现栈(Stack) Queue .Queue分成以下三种: .FIFO: Queue.Queue(maxsize=0) FIFO即FirstinFirstOut,先进先出。Queue提供了一个基本的FIFO容器,使用方法很简单,maxsize是个整数,指明了队列中能存放的数据个数的上限。一旦达到上限,插入会导致阻塞,直到队列中的数据被消费掉。如果maxsize小于或者等于0,队列大小没有限制。 .LIFO Queue.LifoQueue(maxsize=0) LIFO即LastinFirstOut,后进先出。与栈的类似,使用也很简单,maxsize用法同上 .priority classQueue.PriorityQueue(maxsize=0) priority即插入队列中自动排序,无序入队列,弹出时按照从大到小的顺序弹出,使用方法与上面的类似。 Queue的方法 Queue.Queue(maxsize=0)FIFO,如
HDU4431Mahjong第37届ACM/ICPC天津赛区现场赛A题(枚举,判断麻将胡牌) 很有意思的题目。 就是给了13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子+4组3个相同的牌或者顺子。只有m、s、p是可以构成顺子的。东西南北这样的牌没有顺子。 2、7个不同的对子。 3、1m,9m,1p,9p,1s,9s,1c,2c,3c,4c,5c,6c,7c.这13种牌每种都有,而且仅有这13种牌。肯定是有一种2张。其他的1张。 首先是枚举18+7=34张牌,加进去构成14张牌,判断胡牌。 胡牌判断如下。 对于第一种情况:枚举每一个对子。然后按照顺序找3张相同或者顺子。如果有三种相同的,构成3张相同的。没有就看能不能和后面的构成顺子。一定要按照顺序从小到大找过去。1c```7c只能构成3张一样的。然后判断是不是刚好找到4组。 对于第二种情况:就是要每一种牌的数量要么是0,要么是2,这样一定是7个不同的对子了。 对于第三种情况:就是要让这13种牌的数量不等于0,而且其他牌的数量为0;复制 代码: #include<stdio.h> #includ
WebservicerequestGetDataSourceContentstoReportServer http://crm-vm/reportserver/ReportService2005.asmx failedwithSoapException.Error:Theitem'/SharedReports/5.0.xxxx/MSCRM_FetchDataSource'cannotbefound. 解决方法 到 \ProgramFiles\MicrosoftCRMfolder\Tools 下 通过cmd命令 publishreports 组织名 ,重新发布一下。
本文转载自:https://blog.csdn.net/dingsai88/article/details/51637977 jar:https://pan.baidu.com/s/1-8JaRoUtzc1fV8lqhFCBoA 1packageutil; 2 3importjava.security.MessageDigest; 4importjava.security.NoSuchAlgorithmException; 5importjava.util.Random; 6 7importorg.apache.commons.codec.binary.Hex; 8 9publicclassMD5Util{ 10/** 11*普通MD5 12* 13*@authordaniel 14*@time2016-6-11下午8:00:28 15*@paraminStr 16*@return 17*/ 18publicstaticStringMD5(Stringinput){ 19MessageDigestmd5=null; 20try{ 21md5=MessageDigest.getInst
Linux的字符串截取很有用。有八种方法。 假设有变量var=http://www.aaa.com/123.htm. 1.#号截取,删除左边字符,保留右边字符。 复制代码代码如下: echo${var#*//}复制 其中var是变量名,#号是运算符,*//表示从左边开始删除第一个//号及左边的所有字符即删除http://结果是:www.aaa.com/123.htm 2.##号截取,删除左边字符,保留右边字符。 复制代码代码如下: echo${var##*/}复制 ##*/表示从左边开始删除最后(最右边)一个/号及左边的所有字符即删除http://www.aaa.com/ 结果是123.htm 3.%号截取,删除右边字符,保留左边字符 复制代码代码如下: echo${var%/*}复制 %/*表示从右边开始,删除第一个/号及右边的字符 结果是:http://www.aaa.com 4.%%号截取,删除右边字符,保留左边字符 复制代码代码如下: echo${var%%/*}复制 %%/*表示从右边开始,删除最后(最左边)一个/号及右边的字符结
http://man.linuxde.net/awk参考 -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-循环判断类-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- for((i=1;i<=10;i++));doecho$(expr$i\*3+1);done 条件双括号用分号分开,分别是初始值;范围;变化fordodone if[-f"$FILE"];thenecho"OK"elseecho"error$FILE">error.logmail-s"$FILEbackupfail"test123@jb51.net<error.logfi 开头结尾用if---fi条件后;if;thenels