月度存档: 4 月 2020

git极简教程-温故知新

git极简教程-温故知新

0.配置

全局签名配置

git config --global user.name harrietlq
git config --global user.email nbllq@qq.com

项目签名配置,切换到项目目录下

git config user.name harrietlq
git config user.email nbllq@qq.com

给远程的github仓库配置别名为amy,以后pull&push用amy来代替一长串github仓库地址,方便爽~

git remote add amy https://github.com/amyflash/smart_trading.git
git remote add amy_ssh git@github.com:amyflash/smart_trading.git

查看已经配置好啦

git remote -v

1.查看历史记录的4种方式

git log 全显示
git log –pretty=oneline #一行显示一次提交
git log –oneline #一行显示一次提交,hash截取一部分
git reflog #显示步数

ps: vim 语法里面:set nu为显示行号,空格键下翻,p翻页

2.版本前进后退

git reflog 找到hash index
git reset –hard [hash index]

2.1 reset 3 params:

–hard: 在本地库移动head;重置暂存区;重置工作区
–mixed:在本地库移动head;重置暂存区
–soft:仅仅在本地库移动head

2.2 当前文件add了,没有commit,则用git reset –hard head 可以回退到没有add的状态

如果前文件add并且commit了,就用git reset –hard [hash index]这种方式回退到对应状态;这个功能可以帮助找回在工作区误删的文件,前提是该文件至少从工作区add到暂存区过,或者提交到本地库过

3.比较文件差异

将工作区文件和暂存区进行比较

git diff filename

将工作区的文件和本地库历史记录比较

git diff history-version filename
git diff head~3 filename

不带文件名,多个文件比较

git diff head

4.分支操作

查看所有分支

git branch -v

创建新分支

git branch 分支名

切换分支

git checkout 分支名

合并分支

先切换到要被合并的那个分支,比如把hot_fix分支合并到master分支,那么就执行命令
git checkout master
然后 执行
git merge hot_fix

5.解决冲突

diff以后程序员间大pk即可

6.向远程仓库推送本地master分支(创建者)

git pull amy master
git push amy master

git pull = git fetch+git merge
ps: git pull更新代码的话就比较简单暴力了,所以不要用git pull,用git fetch和git merge更安全

7.clone远程仓库到本地(参与者)

git clone https://github.com/amyflash/smart_trading.git
这个命令执行效果:
完整把远程库下载到本地
创建origin地址别名
初始化本地库

8.如何邀请其他人加入这个项目

[百度经验写得不错,我就不重复造轮子了]

LAMPP禁止目录浏览的方法

尼玛原来我的服务的目录一直是裸奔的,改改,必须改

vim /opt/lampp/etc/httpd.conf
Options Indexes FollowSymLinks ExecCGI Includes
#修改为:
Options FollowSymLinks ExecCGI Includes

linux下用xampp安装php集成环境,并修改各自端口号

解决端口号占用问题

安装完成后启动时可能会遇到端口号占用,1-4根据自己启动时报错决定是否修改,若1-4有修改的,5必须修改

1. Another web server is already running

说明apache端口号被占用

进入/opt/lampp/etc目录下,找到文件httpd.conf,此文件中有两个地方需要修改

a.找到Listen行修改,如:1211

b.找到ServerName行修改,如:10.0.0.251:1211

2. Another web server with SSL is already running

说明SSL端口号被占用

进入/opt/lampp/etc/extra目录下,找到文件httpd-ssl.conf,此文件中有三个地方需要修改

a.找到Listen行修改,如:1212

b.找到ServerName行修改,如:10.0.0.251:1212

c.找到节点VirtualHost行修改,如:default:1212

3. Another MySQL daemon is already running

说明MySQL端口号被占用

进入/opt/lampp/etc目录下,找到文件my.cnf,此文件中有两个地方需要修改

a.分别找到port行修改,如:1213

4. Another FTP daemon is already running

说明FTP端口号被占用

进入/opt/lampp/etc目录下,找到文件proftpd.conf,此文件中有一个地方需要修改

a.找到Port行修改,如:1214

5.修改完上面各自的配置文件端口号后,再修改xampp中的配置端口号

进入/opt/lampp目录下,找到文件xampp,此文件中有四个地方需要修改
找到testport,总共有四个,分别对应apache、SSL、MySql、FTP的端口号根据上面修改的端口号,对应修改此配置文件中的端口号(上面没有修改的端口,则对应的不需要改动)

修改完之后重新启动就ok了

[参考文章]

php调用python脚本传参, python 接收参数,php接收返回值

今天遇到一个问题,官方提供的api是用python写的,但是我本机的web程序是php写的,我也不想为了一个python-api重新用python来把php做过的事情重做一遍。所以就想用这种方式处理,php调用python 脚本传入参数, python接收参数,php接收返回值,这样完美兼容即可达到不重复造轮子,然后又可以完成项目需求的目的,yeap,废话少说,撸起袖子开干!
[参考地址]
我的实践:

<?php
$params = "1,2,3,5";
print 'test';

exec("python ~/mycode/phpdpython/t.py {$params}",$out,$re);
print_r($out);//$out中存放的是python脚本中输出的值,即为print()函数所输出的所有数据,每次print()都会记录为一条字典数据
if($re==0){//$re参数为执行情况的状态码,如果执行成功,返回0,否则返回一个非0数
echo "ok";
}else{
echo "error";
}
?>

/** t.py
import sys
a=sys.argv[1].strip().split(',')
print(list(a))
*/

使用 2>&1, 命令就会输出shell执行时的错误到$output变量, 输出该变量即可分析

exec('convert a.jpg b.jpg 2>&1', $output, $return_val);  
print_r($output);

mac上下载腾讯视频并转成mp4或gif格式

好不容易找到喜欢的视频,下载了,结果是一堆ts文件,必须整成自己需要的才舒服呀:)

第一步,找到下载存储的视频路径,一堆ts文件

/Users/用户名/Library/Containers/com.tencent.tenvideo/Data/Library/Application Support/Download/video

第二步,合并ts文件

cat *.ts > xxx.ts

第三步,安装ffmpeg 执行下面命令:

brew install ffmpeg

第四步,将ts文件转为mp4文件

ffmpeg -y -i xxx.ts -c:v libx264 -c:a copy -bsf:a aac_adtstoasc xxx.mp4

缩放视频尺寸

ffmpeg -i big.mov -vf scale=360:-1 small.mov
注意 sacle 值必须是偶数,这里的 -1 表示保持长宽比,根据宽度值自适应高度。

如果要求压缩出来的视频尺寸长宽都保持为偶数,可以使用 -2

将mp4文件转成gif

ffmpeg -i small.mp4 small.gif

补充知识:

使用ffmpeg裁剪和合并视频

剪切视频

使用 -ss 和 -t 选项,从第0秒开始,向后截取31秒视频,并保存

ffmpeg -ss 00:00:00 -i video.mp4 -vcodec copy -acodec copy -t 00:00:31 output1.mp4
从第01:33:30 开始,向后截取 00:47:16 视频,并保存

ffmpeg -ss 01:33:30 -i video.mp4 -vcodec copy -acodec copy -t 00:47:16 output2.mp4

合并视频

把剪切得到的两个视频合并成一个视频

使用 TS格式拼接视频

先将 mp4 转化为同样编码形式的 ts 流,因为 ts流是可以 concate 的,先把 mp4 封装成 ts ,然后 concate ts 流, 最后再把 ts 流转化为 mp4。

ffmpeg -i output1.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb output1.ts
ffmpeg -i output2.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb output2.ts
为了减少命令的输入,需要一个filelist.txt文件,里面内容如下

file 'output1.ts'
file 'output2.ts'

合并视频命令

ffmpeg -f concat -i filelist.txt -acodec copy -vcodec copy -absf aac_adtstoasc output.mp4

参考:
http://note.rpsh.net/posts/2015/04/21/mac-osx-ffmpeg-mp4-gif-convert/

mysql存储过程

变量,存储过程

变量

系统变量(全局变量,会话变量),自定义变量(用户变量,局部变量)

初始化&赋值&查看

查看所有系统全局变量

show global variables;

查看所有系统会话变量

show session variables;

设置&查看系统变量

set @@session.autocommit=1
select @@session.autocommit

设置&查看自定义变量

set @myvar = 1;
select @myvar;

将mytable的记录数赋值给$count

select count(*) into $count from mytable;

声明局部变量并赋值

ps:声明必须为begin end块的第一句,必须定义类型

begin
declare a int default 1;
declare b int default 2;
declare sum int;
set sum=a+b;
select sum;
end

存储过程

基础语法

delimiter 结束标记
create procedure myname(myparams)
begin
    存储过程体
end 结束标记

ps:

参数包含三部分

参数模式,参数名,参数类型
例子:IN name varchare(20)
参数模式:
IN:该参数可以作为输入,需要调用方传入值
OUT:该参数可以作为输出,该参数可以作为返回值
INOUT:该参数既可以作为输入又可以作为输出

如果存储过程体只有一句话,begin end可以省略

存储过程体中的每条sql语句结尾必须加分号。
delimiter重新设置存储过程的结尾,类比双引号,单引号,delimiter默认为;,但如果有很多;想一起执行,那还是换一个结束符号来处理,语法更清晰
语法:
delimiter 结束标记

调用语法

call funcname(params);

例子:

1. 空参存储过程

命令行下运行

delimiter $
create procedure myp1()
begin
  insert into table1(name)values('a1'),('a2'),('a3'),('a4'),('a5');
end $

调用

call myp1()$

查看

select * from table1 $

2.带IN和OUT参数的存储过程

MariaDB [test]> select * from table1 where name='a5';$
+----+------+-----------+------+
| id | name | addr      | age  |
+----+------+-----------+------+
|  9 | a5   | 劳动节    |   22 |
+----+------+-----------+------+
1 row in set (0.001 sec)

MariaDB [test]> create PROCEDURE myp2(IN uname VARCHAR(20),OUT addr VARCHAR(20),OUT age int)
    -> BEGIN
    -> SELECT table1.addr,table1.age into addr,age
    -> from table1 where table1.name=uname;
    -> end $
Query OK, 0 rows affected (0.010 sec)

MariaDB [test]> call myp2("a5",@addr,@age)$
Query OK, 1 row affected (0.001 sec)

MariaDB [test]> select @addr,@age $
+-----------+------+
| @addr     | @age |
+-----------+------+
| 劳动节    |   22 |
+-----------+------+
1 row in set (0.000 sec)

3.带INOUT参数的存储过程

MariaDB [test]> create PROCEDURE myp3(INOUT a int)
    -> BEGIN
    -> set a=a*2;
    -> end $
Query OK, 0 rows affected (0.020 sec)

MariaDB [test]> set @test=10$
Query OK, 0 rows affected (0.000 sec)

MariaDB [test]> call myp3(@test)$
Query OK, 0 rows affected (0.001 sec)

MariaDB [test]> select @test;
    -> $
+-------+
| @test |
+-------+
|    20 |
+-------+
1 row in set (0.001 sec)

删除存储过程

一次只能删一个
drop procedure proname;

查看存储过程的信息

show create procedure proname;

mysql事务&视图

学完redis再来复习mysql,温故知新:)
查看mysql支持的存储引擎

show engines

现在默认都是innodb了,支持事务;其他的像myisam和memory都不支持事务

事务的acid特性

  1. 原子性atomicity
    一起生,一起死
  2. 一致性consistency
     状态切换完整
  3. 隔离性isolation
  4. 持久性durability
    事务提交后不能撤销

事务使用

#开启事务
set autocommit=0;
[start transaction;]

my sql command1...
#savepoint a;#设置保存点
my sql command2...

#rollback to a;#回滚到a,即a下面的没有执行

#结束事务
commit;

事务隔离级别

设置为serializable串行化,可以解决并发问题:脏读update,幻读insert,不可重复读repeat select,但是效率低。
mysql默认隔离级别为REPEATABLE-READ,不能解决幻读,其他两个ok。
oracle默认read committed
查看当前隔离级别
select @@tx_isolation

设置当前连接的隔离级别:
set session transaction isolation level serializable;

设置数据库系统的全局隔离级别:
set global transaction isolation level read committed;

以下四种隔离级别,x代表不能解决的并发问题:

read uncommitted 脏读x,幻读x,不可重复读x
read committed  脏读,幻读x,不可重复读x
REPEATABLE-READ 脏读,幻读X,不可重复读
serializable  脏读,幻读,不可重复读

视图语法

create view myv1 #视图名
as
#查询语句
select id from user where score>90;

使用视图

 select * from myv1 where id>2;

删除视图

drop view 视图名1,视图名2,....

mysql约束和标识

约束分为表级约束和列级约束,列级约束包括,主键,唯一,非空,默认值;外键约束一般写在表级约束里面

create table if not exists major(
    id int primary key,
    name varchar(20)
)

create table if not exists info(
    id int primary key,
    name varchar(20) not null,
     gender char(1),
    age int default 18,
    seat int unique,
    majorid int,
    constraint fk_info_major foreign key(majorid) referencer major(id) 
);

desc info;
show index from info;

1.注意外键字段必须是关联的主键或唯一键,关联其他键会报错

2.注意创建顺序,一定是先创建表,再创建带约束的关联表

3.插入和删除关联记录时候,注意顺序;插入先major后info;删除先info,后major

主键和唯一的区别

主键特点唯一,非空,一张表中至多一个主键,允许组合
唯一:可以为空,一张表中可以有多个唯一键,允许组合

create table if not exists info(
    id int,
    name varchar(20) not null,
     gender char(1),
    age int default 18,
    seat int,
    majorid int,
    constraint fk_info_major foreign key(majorid) referencer major(id),
    primary key(id,name),
    unique(age,seat)
);

自增id

alter table info modify COLUMN id int auto_increment

级联删除

constraint fk_info_major foreign key(majorid) REFERENCES major(id) on delete cascade;

alter table info add constraint fk_info_major foreign key(majorid) REFERENCES major(id) on delete cascade ;

级联置空

constraint fk_info_major foreign key(majorid) REFERENCES major(id) on delete set null;

alter table info add constraint fk_info_major foreign key(majorid) REFERENCES major(id) on delete set null;

mysql基础

dml 数据管理语言

truncate和delete的区别
1.truncate table tname; 清空数据表,初始化自增长id=1
delete id从断点开始
2.d有返回值,t无
3.d可以回滚,t无
4.d可以加where,t无
5.t删除效率高于d

ddl 数据定义语言

create database if not exists db; #如果db不存在,就创建一个叫db的数据库
alter database db character set gbk; #改变db数据库的字符编码
drop database if exists db; #如果db存在,就删除叫db的数据库

创建表

create table if not exists book(
#列名 类型【(长度) 约束】
published datatime,
id int unsigned #无符号整数 0~非负整数
id2 int(7) zerofill #显示长度7,不够用0填充
)

修改表的列名,修改列的类型或约束,添加新列,删除列,修改表名

alter table book change column published pubdate datatime;
alter table book modify column published timestamp;
alter table book add column name text;
alter table book drop column name;
alter table book rename to book1;

复制表的结构

create table copy like book;
create table c4 select id from book where 0; (只复制一个id)

复制表的结构+数据(where 部分数据)

create table copy2 select * from book;

mysql查询

1.concat连接字段查询 , Ifnull(字段名,0):如果字段为null,则强制转换为0

<> 就是!=
select concat(name,"-",gender) from users;

2.模糊查询like, between and, in ,is null

通配符 %代表匹配任意个字符(包含0个字符),_代表匹配一个字符
案例1:查询员工名称中包含字符a的员工信息
select * from employees where username like ‘%a%’;

案例2:查询员工名称中第三个字符为a,第5个字符为e的员工信息
select * from employees where username like ‘__a_e%’;

案例3:查询员工名称中第二个字符为_的员工信息
select * from employees where username like ‘_\_%’;
select * from employees where username like ‘_$_%’ ESCAPE ‘$’;#指定$为转义符

案例4:查出员工编号在100到120之间的员工信息
select * from employees where id >=100 and id <=120;
select * from employees where id between 100 and 120;
between and注意:
1.包含临界值
2.临界值顺序不能调换

案例5:查出员工编号为100或者120的员工信息
select * from employees where id =100 or id =120;
select * from employees where id in(100,120);

案例6:查询员工编号为null的记录

select * from employees where id is null; #注意不能用=
查询员工编号不为null的记录
select * from employees where id is not null;

案例7:

select * from employees;
select * from employees where id like ‘%%’;
select * from employees where address like ‘%%’; 

如果address有null值,则上面三条语句查询出的记录是不一样的,否则一样

3. 常见函数

select trim(a from “aaabaaacaaa”); #output: baaac
select lpad(a,3,0);# output: 00a
select rpad(a,3,0);# output: a00;
select now();
select curdate();
select year(now());
select datediff(d1,d2);
instr:获取子串第一次出现的索引
str_to_date:字符转日期
date_format:日期转字符

4.分组查询(默认忽略null)

案例:查询哪个部门的员工个数>2,having关键字添加分组后结果的筛选条件,where是在分组前筛选

select count(*),department_id from employees group by department_id Having count(*)>2;

5.多表查询

如果给表起了别名,那原始表名就不被认识了,因为from语句是先执行的
sq192语法
内连接:等值连接,非等值连接,自连接(查交集)
n表等值连接,必须有n-1个连接条件
自连接案例:查询员工名和上级名:
select e.employee_id, e.name, m.employee_id, m.name from employees
as e, employees as m
where e.manager_id = m.employee.id

sql199语法
外连接:左外,右外,全外(sql不支持);交叉连接)
select 查询列表
from 表1 别名【连接类型】
join 表2 别名
on 连接条件
【where 筛选条件】
【group by 分组】
【having 筛选条件】
【order by 排序列表】

分类:
内连接:inner
左外:left 【outer】
右外:right 【outer】
全外:full 【outer】

交叉连接: cross join等价于sql192语法的笛卡尔乘集结果,count=表1记录数*表2记录数

sql199语法的内连接和sql192语法的内连接效果一样,写法格式不一样,推荐用sql199语法 ,
连接条件和筛选条件分离,可读性更强

sql199外连接特点:
1. 外连接查询结果为主表中的所有记录=内连接结果+主表中有而从表中没有的记录
如果从表中有和它匹配的,则显示匹配的值;如果从表中没有和它匹配的,则显示null
2.左外连接,left outer join左边是主表;右外连接,right outer join右边是主表
3.左外和右外交换两表顺序,可以实现同样的效果
4.全外连接=内连接结果+表1中有但表2中没有的+表2中有但表1中没有的,mysql不支持这种操作

6 子查询(select嵌套)

定义:标量子查询(结果1行1列)
列子查询(结果1列多行)
行子查询(结果1行多列)
表子查询(结果为多行多列)
按子查询出现的位置:
select后面只支持标量子查询
from,exists后面支持表子查询
where或having后面支持除表子查询以外的三种查询,用得比较多的是标量和列子查询

特点:1.子查询放在小括号内,2.子查询一般放在条件右侧 3.标量配合<>=用 4.列子配合in,any/some(min or max),all(max or min

7 union联合查询

查询语句1
union 默认去重
查询语句2
union all(加上all以后不去重)
查询语句3
。。。。。
应用场景:要查询的结果来自多个表,且多个表没有直接的连接关系,但查询的信息一致时
注意事项:要求查询列数一致,类型,顺序一致