Interview须知知识点

一、对于Git

安装git

创建目录,作为git可追踪的仓库,在目录下使用git init即可,git自动生成.git隐形文件进行追踪

git只能追踪文本文件,对于二进制文件不起作用

在创建的仓库中,目录下或者子目录下,创建文件

编辑好后,三步走:

git add

git commit -m 

git push

>>>>其他命令

git diff 查看修改内容

git log 显示从最近到最远的提交日志 简化命令:git log --pretty=oneline

HEAD表示当前版本,HEAD^表示上一个版本,HEAD^^^表示上上上个版本,往上100个版本写100个^写不过来可以写成是HEAD~100

git reset --hard HEAD^ 回退到上一个版本

 

回退到上一个版本后再打git log的话,最新版本的那个信息已经找不到了,穿越了,再想回去怎么办

从上次Git log里面找到最新的版本号,进行回退

git reset --hard 1094a 版本号没有必要写全,前几位就可以了

但是怎么找到新版本的版本号呢

git reflog记录你的每一次命令

场景1:当你改乱了工作区的内容,想直接丢弃工作区的修改时,用命令git checkout -- file

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。

    git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。

怎么删除文件呢

 

当你要删除文件的时候,可以采用命令:rm test.txt

 

这个时候有两种情况

 

第一种情况:的确要把test.txt删掉,那么可以执行 git rm test.txt git commit -m "remove test.txt" 文件被删除,且删除记录上传本地库

 

第二种情况:误删文件,想恢复,这时候还没有commit -m "remove test.txt",执行git checkout test.txt将文件恢复。

 

如果执行完git commit -m "remove test.txt"后就不能用checkout恢复了,得用git reset --hard HEAD^

其实只要你用了Git,无论怎么搞,你都可以找回曾经的任何一个版本的文件,几遍是rm file或者Git rm file 还 commit,都一回事,你提交也只是提交一个删除记录而已,这次版本的文件,他删除也只是相对于你的工作区目录,你以为Git本地仓库没有给你保存原文件吗?永远会有,只要你记住那个ID

git clone git@github.com:michaelliao/gitskills.git

你也许还注意到,GitHub给出的地址不止一个,还可以用https://github.com/michaelliao/gitskills.git这样的地址。实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。

使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https

 

创建dev分支+切换到dev分支

git checkout -b dev = get branch dev 创建分支;git checkout dev 切换分支

git branch 命令查看当前分支

git checkout master 切换回master分支

git merge dev 将dev分支合并到master分支上 git merge用于合并指定分支到当前分支

git branch -d dev 删除dev分支

在分支开发,开发完成后这样合并分支:1、先切换到master,git checkout master,2、合并分支,git merge hostfix

 

将分支合并回主干(master

  将newbranch代码合并回主干

    git checkout master

    git merge newbranch

 

  将master代码合并回分支newbranch

    git checkout newbranch

    git merge newbranch

 

冲突时,输入git merge featurel时git无法执行‘快速合并’,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,这时候必须手动解决冲突后再提

git status 可以告诉我们冲突的文件

Git用<<<<<<<=======>>>>>>>标记出不同分支的内容,我们修改后保存

然后再提交

用带参数的git log也可以看到分支的合并情况:

git log --graph --pretty=oneline --abbrev-commit

最后,删除feature1分支:

有紧急任务时,可以使用git stash储藏起来,

首先确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支

修复完成后,切换到master分支,并完成合并,最后删除issue-101分支

现在,是时候接着回到dev分支干活了!

git stash pop

git update-index --assume-unchanged conf/defined.php //git忽略追踪

 

git拉取分支代码:

cd ~/Desktop/                 

ls

git clone http://gitlab.i.beebank.com/php-beebank/fengyi.git fengyi

Cloning into 'fengyi'...

remote: Counting objects: 1464, done.

remote: Compressing objects: 100% (1263/1263), done.

remote: Total 1464 (delta 547), reused 532 (delta 89)

Receiving objects: 100% (1464/1464), 2.84 MiB | 4.49 MiB/s, done.

Resolving deltas: 100% (547/547), done.

git branch -a

fatal: Not a git repository (or any of the parent directories): .git

cd fengyi

git branch -a

* master

  remotes/origin/HEAD -> origin/master

  remotes/origin/develop

  remotes/origin/master

git checkout origin/develop -b develop

Branch 'develop' set up to track remote branch 'develop' from 'origin'.

Switched to a new branch 'develop'

git pull

Already up to date.

 

 二、基础的Linux命令

1、安装anaconda包

wget https://repo.anaconda.com/archive/Anaconda3-5.3.1-Linux-x86_64.sh

sh Anaconda3-5.3.1-Linux-x86_64.sh

2、递归查找当前目录下,某字符串所在的文件

3、grep 'rds7wvh2b3r70e26m95q.mysql.rds.aliyuncs.com' -ri .

:%s/rds7wvh2b3r70e26m95q.mysql.rds.aliyuncs.com/rds7wvh2b3r70e26m95q389.mysql.rds.aliyuncs.com/g

:%s/8841fe4e95d64e4a.m.cnbja.kvstore.aliyuncs.com/8841fe4e95d64e4a478.redis.rds.aliyuncs.com/g

全部替换的命令为:

  :%s/s1/s2/g

4、vim 查询关键字 /关键字 n向下 N向上

5、跳转指定行 :n

6、mysqldump -uroot -p visit>/tmp/visit.sql

 

7、添加权限

sudo chmod 777 -R /data2/logs/

8、追踪变化

tail -f sql.log

9、查看最后多少行数据

tail -n 300 debug.20161101.log

10、删除多个文件

rm 订单50041贷款合同.pdf 订单LsaNvhCEHLyFt贷款合同.pdf 订单LsbZ8IttgGSXJ贷款合同.pdf

加上-R删除文件夹

rm -Rf controller.exception  data.exception  index  jobs  service.exception  s.exception  sql.log  timelog

11、显示所有进程和其状态

ps aux|grep nginx

杀死进程:kill -s 9 pid

12、远程拷贝(可以用于 服务器到服务器,在本地拷贝服务器的文件)

scp peng.yu@172.16.22.70:/etc/nginx/vhosts/jydhx.conf .

13、压缩&解压

  1)gzip压缩

    

     压缩文件

      $ gzip -v test

      test:   53.1% -- replaced with test.gz

     压缩会删掉本地文件。新建test.gz文件

     不删除文件使用重定向

       $ gzip -c test > test.gz

     解压缩

       gzip -d test.gz

     查看压缩后的文件内容,不解压缩的情况下。使用zcat命令

      $ zcat test.gz 

  2)bzip2:bzip2是用来取代gzip的压缩,比gzip压缩比例还高 

    #压缩test文件,生成test.bz2

      $ bzip2 -z test

    #保留原文件, 压缩生成test.bz2

      $ bzip2 -k test

     #解压缩文件

      $ bzip2 -d test.bz2

    查看压缩文件内容,使用bzcat

      $ bzcat test.bz2 

  3)tar:为打包命令。将多个文件打包成一个文件。还包括压缩參数。

    #创建bzip2压缩文件

       $ tar -jcv -f test.tar.bz2 test/

    #不解压缩情况下查看文件列表

      $ tar -jtv -f test.tar.bz2    

    #解压缩到当前文件夹

      $ tar -jxv -f test.tar.bz2 

    #解压缩到指定文件夹test2

      $ mkdir test2

      $ tar -jxv -f test.tar.bz2 -C test2 

 

    #创建gzip压缩文件

       $ tar -zcv -f test.tar.gz test

    #查看压缩文件

       $ tar -ztv -f etc.tar.gz

14、

command+k 切新的一页

command+m 最小化

 15、切换php7

ps aux|grep php

root        218  0.0  0.0 295720  6840 ?        Ss   May14   0:46 php-fpm: master process (/etc/php-fpm.conf)                                            

www        7748  0.0  0.0 300428 16292 ?        S    May15   0:00 php-fpm: pool www                                                                      

www        7749  0.0  0.0 300436 15888 ?        S    May15   0:00 php-fpm: pool www                                                                      

www        7750  0.0  0.0 300428 16116 ?        S    May15   0:00 php-fpm: pool www                                                                      

www        7756  0.0  0.0 300424 15632 ?        S    May15   0:00 php-fpm: pool www                                                                      

1104     134330  0.0  0.0 103300   840 pts/0    S+   10:49   0:00 grep php

[huiyun.zhao@22-102 ~]$ sudo service php-fpm stop

Gracefully shutting down php-fpm ... . SUCC

[huiyun.zhao@22-102 ~]$ /data1/

htdocs/ logs/   php/    phplib/ tomcat/ 

[huiyun.zhao@22-102 ~]$ sudo /data1/php/sbin/php-fpm 

 

三、改纯js文件需要清缓存

   

 

 四、

催收中心:

$ret_array = json_decode($ret_json, true);//这里是对json进行解码

if(json_last_error() !== JSON_ERROR_NONE) {
    throw new Exception('房贷系统,响应数据格式不正确');
}

如果有,返回 JSON 编码解码时最后发生的错误。该函数没有参数

 

*json_last_error()的返回值为常数:

常量

含义

可用性

JSON_ERROR_NONE

没有错误发生

 

JSON_ERROR_DEPTH

到达了最大堆栈深度

 

JSON_ERROR_STATE_MISMATCH

无效或异常的 JSON

 

JSON_ERROR_CTRL_CHAR

控制字符错误,可能是编码不对

 

JSON_ERROR_SYNTAX

语法错误

 

JSON_ERROR_UTF8

异常的 UTF-8 字符,也许是因为不正确的编码。

PHP 5.3.3

JSON_ERROR_RECURSION

One or more recursive references in the value to be encoded

PHP 5.5.0

JSON_ERROR_INF_OR_NAN

One or more NAN or INF values in the value to be encoded

PHP 5.5.0

JSON_ERROR_UNSUPPORTED_TYPE

指定的类型,值无法编码。

PHP 5.5.0

JSON_ERROR_INVALID_PROPERTY_NAME

指定的属性名无法编码。

PHP 7.0.0

JSON_ERROR_UTF16

畸形的 UTF-16 字符,可能因为字符编码不正确。

PHP 7.0.0

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

$data='[{"Name":"a1","Number":"123","Contno":"000","QQNo":""},{"Name":"a1","Number":"123","Contno":"000","QQNo":""},{"Name":"a1","Number":"123","Contno":"000","QQNo":""}]'

//上面是单组元素,下面是多组,就像数组一样 可以是$data = [{},{}];也可以$data[]=‘{}’这样一个一个添加

//改造json是这样的外面是单引号,里面的值都是双引号,

$array = json_decode($json, true);

if(json_last_error() !== JSON_ERROR_NONE){

        echo '发生错误';exit;   

}

echo '没有发生错误';var_dump($array);exit;

 

二、接下来研究下对外接口

 

static我先这样理解:static只获取基类的定义的值,self:之后去基类自身的值 //完全错误😂,换种思维

说明:

self:类内指针,就是写在哪个类里边,就调用哪个类里边的方法或属性。

static:使用的这个类会被子类覆盖,使用的是子类的方法或属性,就是说父类访问的是子类的方法或属性。

//自己理解下:self-在哪个类中使用就是访问哪个类中的属性/方法。static-会被子类覆盖,比如说b子类调用A父类,虽然说static在A父类中写的,但是调用的属性/方法还是b子类的

例子:

class a{

    public static function who(){

        echo "my name is xiaofeng";

    }

    public static function name(){

        self::who();

    }

}

class b extends a{

    public static function who(){

        echo "my name is xiaoma";

    }

    public static function name(){

        static::who();

    }

}

a::name();

b::name();

输出:

a、my name is xiaofeng

b、my name is xiaoma

    • sort() - 以升序对数组排序
    • rsort() - 以降序对数组排序
    • asort() - 根据值,以升序对关联数组进行排序
    • ksort() - 根据键,以升序对关联数组进行排序
    • arsort() - 根据值,以降序对关联数组进行排序
    • krsort() - 根据键,以降序对关联数组进行排序

 五、

$string = '

        hahahahha yyyyyy ;

hahahah   yyyyyy

 

eeee

eeeeeeeeeee

heiehieheiehiehieheiehi

 

';

 

$strn = str_replace(["\r\n", "\r", "\n", "\t", "\0", "\x0B", " "], '', $string);

 

 

$string = '

        hahahahha yyyyyy ;

hahahah   yyyyyy

 

eeee

eeeeeeeeeee

heiehieheiehiehieheiehi

 

';

 

$strn = str_replace(["\r", "\n", "\t"," "], '', $string);这个是可以去空格、换行和制表符之类的

输出的是:

string(67) "hahahahhayyyyyy;hahahahyyyyyyeeeeeeeeeeeeeeeheiehieheiehiehieheiehi"

 

array_slice()对数组进行切割 array_slice($array, 1, 2);切出来的是第一个和第二个

 

六、研究算法 

七、

CREATE TABLE dept

              (

                d_no INT NOT NULL PRIMARY KEY AUTO_INCREMENT,    //部门编号

                d_name VARCHAR(50),                    //部门名称

                d_location VARCHAR(100)                  //部门地址

              );

               CREATE TABLE employee 

               (

                e_no INT NOT NULL PRIMARY KEY,    //员工编号

                e_name VARCHAR(100) NOT NULL,    //员工姓名

                e_gender CHAR(2) NOT NULL,      //员工性别

                dept_no INT NOT NULL,         //部门编号

                e_job VARCHAR(100) NOT NULL,    //职位

                e_salary SMALLINT NOT NULL,     //薪水

                hireDate DATE,             //入职日期

                CONSTRAINT dno_fk FOREIGN KEY(dept_no) REFERENCES dept(d_no)

               );

select * from employee e join dept d on e.dept.no=d.d_no where d.d_no=20;

select *,sum(e_salary) ss from employee group by dept_no 

select e_no,e_name,max(e_salary) from employee group by dept_no;

select e.e_name,d.d_name,d.location from employee e join dept d on e.dept_no=d.d_no where e.name=‘blake’;

select dept_no,count(e_name) from employee group by dept_no;

select e_job,sum(e_salary) from employee group by e_job;

select * from employee order by dept_no desc,e_salary desc;

select * from employee where e_name like ‘’

select * from employee where (year(now())-year(hireDate))>10;

select e_name,e_job from employee where dept_no=(select d_no from dept where d_location=‘beijing’);

 

 

LIKE: 相当于模糊查询,和LIKE一起使用的通配符有  "%"、"_"  

                 "%":作用是能匹配任意长度的字符。

                 "_":只能匹配任意一个字符

             SELECT * FROM fruits WHERE f_name LIKE 'b%';  //f_name以b字母开头的所有记录

SELECT * FROM fruits WHERE f_name LIKE 'b%y';  //f_name以b字母开头,y字母结尾的所有记录

SELECT * FROM fruits WHERE f_name LIKE '____y'  //此处有四个_,说明要查询以y字母结尾并且y之前只有四个字符的记录

总结:'%'和'_'可以在任意位置使用,只需要记住%能够表示任意个字符,_只能表示一个任意字符

SELECT * FROM 表名 WHERE 字段名 IS NULL;  //查询字段名是NULL的记录

SELECT * FROM 表名 WHERE 字段名 IS NOT NULL;  //查询字段名不是NULL的记录

使用DISTINCT就能消除重复的值

SELECT DISTINCT s_id FROM fruits;

SELECT s_id, COUNT(f_name), GROUP_CONCAT(f_name) FROM fruits GROUP BY s_id;

解释:

                COUNT():这个是下面要讲解到的一个函数,作用就是计算有多少条记录, 

                GROUP_CONCAT(): 将分组中的各个字段的值显示出来 

               SELECT s_id, COUNT(f_name), GROUP_CONCAT(f_name), GROUP_CONCAT(f_price) FROM fruits GROUP BY s_id;

分组之后还可以进行条件过滤,将不想要的分组丢弃,使用关键字 HAVING

              SELECT s_id,COUNT(f_name),GROUP_CONCAT(f_name) FROM fruits GROUP BY s_id HAVING COUNT(f_name) > 1;//他能够过s_id分组,然后过滤出水果种类大于1的分组信息。

总结:

                 知道GROUP BY的意义,并且会使用HAVING对分组进行过滤, HAVING和WHERE都是进行条件过滤的,区别就在于 WHERE 是在分组之前进行过滤,而HAVING是在分组之后进行条件过滤。

给字段名取别名的原因是有些字段名是为了显示更加清楚,比如

                SELECT f_price AS '价格' FROM fruits;

子查询

ANY关键字接在一个比较操作符的后面,表示若与子查询返回的任何值比较为TRUE,则返回TRUE,通俗点讲,只要满足任意一个条件,就返回TRUE。

                 SELECT num1 FROM tb11 WHERE num1 > ANY(SELECT num2 FROM tb12);//这里就是将在tb12表中查询的结果放在前一个查询语句中充当条件参数。只要num1大于其结果中的任意一个数,那么就算匹配。

使用ALL时表示需要同时满足所有条件。

                SELECT num1 FROM tb11 WHERE num1 > ALL(SELECT num2 FROM tb12);  //num1需要大于所有的查询结果才算匹配

EXISTS关键字后面的参数是任意一个子查询,如果子查询有返回记录行,则为TRUE,外层查询语句将会进行查询,如果子查询没有返回任何记录行,则为FALSE,外层查询语句将不会进行查询。

                SLEECT * FROM tb11 WHERE EXISTS(SELECT * FROM tb12 WHERE num2 = 3);  //查询tb12中有没有num2=3的记录,有的话则会将tb11的所有记录查询出来,没有的话,不做查询

这个IN关键字的作用跟上面单表查询的IN是一样的,不过这里IN中的参数放的是一个子查询语句。

                SELECT s_id,f_id,f_name

                FROM fruits

                WHERE s_id IN(SELECT s_id FROM suppliers WHERE s_id = 107);

两张表: employee(员工)表和dept(部门)表。

              CREATE TABLE dept

              (

                d_no INT NOT NULL PRIMARY KEY AUTO_INCREMENT,    //部门编号

                d_name VARCHAR(50),                    //部门名称

                d_location VARCHAR(100)                  //部门地址

              );

               CREATE TABLE employee 

               (

                e_no INT NOT NULL PRIMARY KEY,    //员工编号

                e_name VARCHAR(100) NOT NULL,    //员工姓名

                e_gender CHAR(2) NOT NULL,      //员工性别

                dept_no INT NOT NULL,         //部门编号

                e_job VARCHAR(100) NOT NULL,    //职位

                e_salary SMALLINT NOT NULL,     //薪水

                hireDate DATE,             //入职日期

                CONSTRAINT dno_fk FOREIGN KEY(dept_no) REFERENCES dept(d_no)

          

     );

4.2.2、在employee表中,查询dept_no等于1020的所有记录

方式一:SELECT * FROM employee WHERE dept_no IN(10,20);

方式二:SELECT * FROM employee WHERE dept_no = 10 OR dept_no = 20;

4.2.3、在employee表中,查询工资范围在800~2500之间的员工信息

SELECT * FROM employee WHERE e_salary BETWEEN 800 AND 2500;

4.2.4、在employee表中,查询部门编号为20的部门中的员工信息

SELECT * FROM employee WHERE dept_no = 20;

4.2.5、在employee表中,查询每个部门最高工资的员工信息

分析:每个员工都可能处于不同的部门,要先找出每个部门中的所有员工,应该想到分组,将相同部门的员工分为一组。然后在使用MAX()函数比较最大的salary。注意不要MAX(GROUP_CONCAT(e_salary)), 这样写就会报错,GROUP_CONCAT(e_salary)是将分组中所有的e_salary显示出来,我们直接MAX(e_salary)就会将该分组中所有的e_salary进行比较,拿到最大的一份。

SELECT e_no,e_name,MAX(e_salary) FROM employee GROUP BY dept_no;

4.2.6、查询员工BLAKE所在部门和部门所在地

分析:看下题目就应该知道是两张表,也就应该使用连接查询,找出是用内连接还是外连接,然后找出连接条件,

方式一:SELECT d.d_no,d.d_name,d.d_location FROM employee AS e,dept AS d WHERE e.e_name = 'BLAKE' AND e.dept_no = d.d_no;

方式二:SELECT d.d_no,d.d_name,d.d_location FROM employee AS e INNER JOIN dept AS d ON e.e_name = 'BLAKE' AND e.dept_no = d.d_no;

4.2.7、使用连接查询,查询所有员工的部门和部门信息

               分析:这个题跟上面哪个题差不多,使用内连接

              SELECT e.e_no,e.e_name,d.d_no,d.d_name,d.d_location

              FROM employee AS e INNER JOIN dept AS d

              ON e.dept_no = d.d_no;

4.2.8、在employee中,计算每个部门各有多少员工

              分析:每个部门用分组

              SELECT COUNT(e.e_name)

              FROM employee AS e  

              GROUP BY e.dept_no   

4.2.9、在employee表中,计算不同类型职员的总工资数

              分析:对员工职位类型进行分组

              SELECT e.e_job,SUM(e.e_salary)

              FROM employee AS e

              GROUP BY e.e_job;

4.2.10、在employee表中,计算不同部门的平均工资

               分析:对部门进行分组

               SELECT e.dept_no,AVG(e.e_salary)

               FROM employee AS e

               GROUP BY e.dept_no;

4.2.12、在employee表中,将查询记录先按部门编号由高到低排列,再按员工工资由高到低排列

                SELECT * FROM employee ORDER BY dept_no DESC,e_salary DESC;

4.2.13、在employee表中,查询员工姓名以字母AS开头的员工信息

方式一: SELECT * FROM employee WHERE e_name LIKE 'A%' OR e_name LIKE ’S%’;//用的是like

方式二:SELECT * FROM employee WHERE e_name REGEXP '^A' OR e_name REGEXP '^S’;//用的是正则表达式

4.2.14、在employee表中,查询到目前为止,工龄大于等于10年的员工信息

方式一:SELECT * FROM employee WHERE (YEAR(NOW()) - YEAR(hireDate)) > 10; 

方式二:SELECT * FROM employee WHERE (YEAR(CURDATE()) - YEAR(hireDate)) > 10;

解释:记得我们前一节学的数据类型吗,其中CURDATE()代表的是YYYY-MM-DD, NOW()代表的是YYYY-MM-DD HH:MM:SS,所以这里两个度能用,只要将其截取为为YEAR,然后相减,就能得到相差几年了。

4.3.4、查询名字以字母N或者S结尾的记录

方式一:

                     SELECT * FROM employee WHERE e_name LIKE '%N' OR e_name LIKE '%S'; 

方式二:

                     SELECT * FROM employee WHERE e_name REGEXP 'N$' OR e_name REGEXP 'S$';

4.3.5、查询在BeiJing工作的员工的姓名和职务

方式一:SELECT e_name,e_job FROM employee WHERE dept_no = (SELECT d_no FROM dept WHERE d_location = 'BeiJing');

方式二:SELECT e.e_name, e.e_job FROM employee AS e,dept AS d WHERE e.dept_no = d.d_no AND d.d_location = 'BeiJing';

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2018-11-27 17:28  bigclould  阅读(684)  评论(0编辑  收藏  举报