Linux彻底删除mysql5.6

查看安装的mysql组件

rpm -qa | grep -i mysql

mysql57-community-release-el6-8.noarch
mysql-community-common-5.6.37-2.el6.x86_64
mysql-community-client-5.6.37-2.el6.x86_64
php70w-mysql-7.0.22-2.w6.x86_64
mysql-community-libs-5.6.37-2.el6.x86_64
mysql-community-libs-compat-5.6.37-2.el6.x86_64
mysql-community-server-5.6.37-2.el6.x86_64

查看与mysql相关的文件

find / -name mysql

/home/mysql
/etc/logrotate.d/mysql
/usr/share/mysql
/usr/bin/mysql
/usr/lib64/mysql
/var/spool/mail/mysql
/var/lib/mysql
/var/lib/mysql/mysql

whereis mysql

mysql: /usr/bin/mysql /usr/lib64/mysql /usr/share/mysql /usr/share/man/man1/mysql.1.gz

卸载mysql组件

rpm -ev --nodeps mysql57-community-release-el6-8.noarch
rpm -ev --nodeps mysql-community-common-5.6.37-2.el6.x86_64
rpm -ev --nodeps mysql-community-client-5.6.37-2.el6.x86_64
rpm -ev --nodeps mysql-community-libs-5.6.37-2.el6.x86_64
rpm -ev --nodeps mysql-community-libs-compat-5.6.37-2.el6.x86_64
rpm -ev --nodeps mysql-community-server-5.6.37-2.el6.x86_64

删除mysql相关文件

rm -rf /home/mysql
rm -rf /etc/logrotate.d/mysql
rm -rf /usr/share/mysql
rm -rf /usr/bin/mysql
rm -rf /usr/lib64/mysql
rm -rf /var/spool/mail/mysql
rm -rf /var/lib/mysql
rm -rf /var/lib/mysql/mysql

Linux问题: SSH FTP登录不了

昨天准备新加一个FTP用户来管理/etc下面的文件。然后执行chmod 777 -R /etc后出现了一系列的崩溃,服务器登不上,有些文件变成了只读,FTP和PUTTY登录不上。

之后尝试了git传文件被拒绝。

搜索了问题后无果,想到自己是新加FTP出现的问题,会不会是权限的问题?于是搜索了更改/etc权限会出现的问题,果不其然,会影响SSH的登录。没有备份的情况下只能重装系统。

因为我的一系列Nginx重定向规则不能下载,只能重装后再手打了。:(

JavaScript方法splice()和slice()

1 splice()

1.1 说明

splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。该方法会改变原始数组Link

1.2 语法

arrayObject.splice(index,howmany,item1,.....,itemX)

参数

  • index: 必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
  • howmany: 必需。要删除的项目数量。如果设置为 0,则不会删除项目。
  • item1, …, itemX: 可选。向数组添加的新项目。

返回值

  • Array: 包含被删除项目的新数组,如果有的话。

1.3 示例

//添加项目
(function(){
    var arr = [0, 1, 2, 3, 4];
    arr.splice(1, 0, 9, 10); //索引位置/ 删除数量/ 可选, 添加项目, 可多个
    console.log(arr); //[0, 9, 10, 1, 2, 3, 4]
}());
//删除项目
(function(){
    var arr = [0, 1, 2, 3, 4];
    arr.splice(1, 2);
    console.log(arr); //[0, 3, 4]
}());
//删除并添加项目
(function(){
    var arr = [0, 1, 2, 3, 4];
    arr.splice(1, 2, 9, 10, 11);
    console.log(arr); //[0, 9, 10, 11, 3, 4]
}());

2 slice()

2.1 说明

slice() 方法可从已有的数组中返回选定的元素。该方法并不会修改数组,而是返回一个子数组

2.2 语法

arrayObject.slice(start,end)

参数

  • start: 必需。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。
  • end: 可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。

返回值

  • 返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素。

2.3 示例

//截取中间一段
(function(){
    var arr = [0, 1, 2, 3, 4];
    arrS = arr.slice(1, 3); //从索引1开始到索引3之前, 不包括索引3的项目
    console.log(arrS); //[1, 2]
}());
//截取中间到最后
(function(){
    var arr = [0, 1, 2, 3, 4];
    arrS = arr.slice(1); //end为空, 从索引1开始到结束
    console.log(arrS); //[1, 2, 3, 4]
}());
//获取最后一个项目
(function(){
    var arr = [0, 1, 2, 3, 4];
    arrS = arr.slice(-1); // -1个项目到最后, -1即最后一个, -2倒数第二个
    console.log(arrS); //[4]
}());
//排除最后一个项目
(function(){
    var arr = [0, 1, 2, 3, 4];
    arrS = arr.slice(0, -1); // 第一个到第-1个, 不包含第-1个(最后一个)
    console.log(arrS); //[0, 1, 2, 3]
}());

搭建LNMP环境

### 1.搭建 Nginx 静态服务器

– 安装 Nginx
– 使用 yum 安装 Nginx:

yum install nginx -y

– 修改 /etc/nginx/conf.d/default.conf,去除对 IPv6 地址的监听
– i进入修改 esc退出编辑 :x保存

vim /etc/nginx/conf.d/default.conf

– 代码示例
server {
listen 80 default_server;
# listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;

# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;

location / {
}

error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}

}

– 修改完成后,启动 Nginx:

nginx

– 此时,可访问实验机器外网 HTTP 服务(http://1.1.1.1)来确认是否已经安装成功。

– 将 Nginx 设置为开机自动启动:

chkconfig nginx on

### 2.安装 MySQL 数据库服务

– 安装 MySQL
– 使用 yum 安装 MySQL:

yum install mysql-server -y

– 安装完成后,启动 MySQL 服务:

service mysqld restart

– 设置 MySQL 账户 root 密码:

/usr/bin/mysqladmin -u root password 'vYyie1cQ'

– 将 MySQL 设置为开机自动启动:

chkconfig mysqld on

### 3.搭建 PHP 环境

– 安装 PHP
– 使用 yum 安装 PHP:

yum install php php-fpm php-mysql -y

– 安装之后,启动 PHP-FPM 进程:

service php-fpm start

– 启动之后,可以使用下面的命令查看 PHP-FPM 进程监听哪个端口

netstat -nlpt | grep php-fpm

– 把 PHP-FPM 也设置成开机自动启动:

chkconfig php-fpm on

### 4.配置 Nginx 并运行 PHP 程序

– 配置 Nginx

– 在 /etc/nginx/conf.d 目录中新建一个名为 php.conf 的文件,并配置 Nginx 端口 ,配置示例如下:
– 代码示例
server {
listen 8000;
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
location ~ .php$ {
root /usr/share/php;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

cd /etc/nginx/conf.d

vim /etc/nginx/conf.d/php.conf

touch php.conf

vim /etc/nginx/conf.d/php.conf

– 修改配置完成后,重启 nginx 服务

service nginx restart

– 这时候,我们就可以在/usr/share/php 目录下新建一个 info.php 文件来检查 php 是否安装成功了,文件内容参考如下:

cd /usr/share/php

touch info.php

vim info.php

<?php phpinfo(); ?>

– 此时,访问 http://1.1.1.1:8000/info.php 可浏览到我们刚刚创建的 info.php 页面了

– 重启

service php-fpm restart
service nginx restart

– 默认网站目录

/usr/share/nginx/html

– 配置目录
vim /etc/nginx/conf.d/default.conf
vim /etc/nginx/conf.d/php.conf

[腾讯 – 开发者实验室 – 搭建 LNMP 环境](https://www.qcloud.com/developer/labs/lab/10029)

JavaScript函数setInterval()和setTimeout()正确的写法

一、常规写法

1.1 不传参数

function a (x, y) {
    var i = 0;
    var b = function(){
        console.log((x * y) + (i++));
    }
    return b;
}
var c = a(1, 2);
setInterval('c()', 1000);

1.2 传参数

function c (x, y) {
    console.log(x * y);
}
setInterval('c(1, 2)', 1000);

二、改进写法

2.1 不传参数

setInterval(c, 1000);

2.2 传参数

setInterval(function(){
    c(1, 2);
}, 1000);

2.3 改进原因

在幕后,JavaScript仍需要评估和执行你给程序传递的字符串。Link

JavaSctipt语句for循环的思考

一、语法

for (语句 1; 语句 2; 语句 3) {
    被执行的代码块;
}
  • 语句 1: 在循环(代码块)开始前执行, 可选.
  • 语句 2: 定义运行循环(代码块)的条件, 可选, 如果省略了语句 2, 那么必须在循环内提供 break, 否则循环就无法停下来.
  • 语句 3: 在循环(代码块)已被执行之后执行, 可选.

二、常规写法

var arr = [1, 2, 3, 4, 5];
(function(){
    for(var i = 0; i < arr.length; i++){
        console.log(arr[i]); //1 2 3 4 5
    }
})();

三、改进

3.1 将数组长度提前提取出来,避免每次循环提取一次

(function(){
    for(var i = 0, max = arr.length; i < max; i++){
        console.log(arr[i]); //1 2 3 4 5
    }
})();

3.2 i += 1i = i+1i++

(function(){
    for(var i = 0, max = arr.length; i < max; i += 1){
        console.log(arr[i]); //1 2 3 4 5
    }
})();

3.3 和0作比较更快

(function(){
    for(var i = arr.length; i--;){
        console.log(arr[i]); //5 4 3 2 1
    }
})();
(function(){
    var i = arr.length;
    while(i--){
        console.log(arr[i]); //5 4 3 2 1
    }
})();

JavaScript创建对象

一、原型”__proto__”

//__proto__
var Mazey1 = {
    name: 'Mazey1',
    say: function(){
        console.log('Hi, i\'m ' + this.name + '!');
    }
};
var Cherrie1 = {
    name: 'Cherrie1'
};
Cherrie1.__proto__ = Mazey1;
Cherrie1.say(); //Hi, i'm Cherrie1!

低版本IE不支持,不推荐使用。

二、方法”Object.create()”

//Object.create
var Mazey2 = {
    name: 'Mazey2',
    say: function(){
        console.log('Hi, i\'m ' + this.name + '!');
    }
};
function createMazey(name){
    var m = Object.create(Mazey2);
    m.name = name;
    return m;
}
var Cherrie2 = createMazey('Cherrie2');
Cherrie2.say(); //Hi, i'm Cherrie2!

三、构造函数”function”

//function
function Mazey3(name){
    this.name = name;
    this.say = function(){
        console.log('Hi, i\'m ' + this.name + '!');
    }
}
var Cherrie3 = new Mazey3('Cherrie3');
Cherrie3.say(); //Hi, i'm Cherrie3!

四、构造函数”function” – 多个对象共用方法

//function 多个对象共用say
function Mazey4(name){
    this.name = name;
}
Mazey4.prototype.say = function(){
    console.log('Hi, i\'m ' + this.name + '!');
}
var Cherrie4 = new Mazey4('Cherrie4');
Cherrie4.say(); //Hi, i'm Cherrie4!
var Luna4 = new Mazey4('Luna4');
Luna4.say(); //Hi, i'm Luna4!

节省内存,推荐使用。

五、类的继承/call/2017-07-28

//类1
function Mazey(name){
    this.name = name;
    this.say = function(){
        console.log('Hi, i\'m ' + this.name + '.');
    };
}
//用原型继承不了方法
Mazey.prototype = {
    run: function(){
        console.log(this.name + 'is running.');
    }
};
var Cherrie = new Mazey('Cherrie');
Cherrie.say(); //Hi, i'm Cherrie.
Cherrie.run(); //Cherrieis running.

//类2 继承类1 call
function Baby(name){
    Mazey.call(this, name);
    this.eat = function(){
        console.log(this.name + ' eats rice.');
    };
}
LittleBaby = new Baby('Baby');
LittleBaby.say(); //Hi, i'm Baby.
LittleBaby.eat(); //Baby eats rice.
LittleBaby.run(); //Uncaught TypeError: LittleBaby.run is not a function

原始类的原型”prototype”继承不了,把不需要继承的方法属性放在原型里面。

六、类的继承/ECMAScript6/2017-08-03

//类1
class Mazey {
    constructor(name, age){
        this.name = name;
        this.age = age;
    }
    say(){
        console.log(`My name is ${this.name}, i'm ${this.age}.`);
    }
    info(){
        return `${this.name}, ${this.age}`;
    }
}
var m1 = new Mazey('mazey', 18);
m1.say(); //My name is mazey, i'm 18.
//类2
class Cherrie extends Mazey {
    constructor(name, age, sex){
        super(name, age); //super一定要放在this前面,等于 Mazey.call(this, name, age)
        this.sex = sex;
    }
    say(){
        super.say();
        console.log(`I am a ${this.sex}(${this.age}).`)
    }
    moreInfo(){
        console.log(`${super.info()}, ${this.sex}`); //super.info() => Mazey.info.call(this)
    }
}
var c1 = new Cherrie('cherrie', 17, 'girl');
c1.say(); //My name is cherrie, i'm 17. I am a girl(17).
c1.moreInfo(); //cherrie, 17, girl

七、通过函数实例类/2017-08-10

可传入任意组{key: value}对象,只取需要的值,没有则使用默认值。

//定义类
function Person(obj) {
    this.name = obj.name || 'anonymous';
    this.age = obj.age || 0;
}
//定义类共享内存的方法
Person.prototype.say = function () {
    console.log(`My name is ${this.name}, i'm ${this.age}.`);
};
//通过函数创建实例
function newPerson (obj) {
    return new Person(obj || {});
}
//正常传值
var mazey = newPerson({ //自动获取name和age
    name: 'mazeyqian',
    age: '19'
});
mazey.say(); //My name is mazeyqian, i'm 19.
//只传一个
var cherrie = newPerson({
    name: 'cherrie'
});
cherrie.say(); //My name is cherrie, i'm 0.
//不传值
var someone = newPerson(); //若不传值,则使用默认值
someone.say(); //My name is anonymous, i'm 0.
//传不相关值
var test = newPerson({
    sex: 'boy'
});
test.say(); //My name is anonymous, i'm 0.

JavaScript点击事件/一个按钮触发另一个按钮

给按钮2添加点击事件click触发按钮1的点击事件,就算给按钮1添加样式display: none;visibility: hidden;隐藏起来也能触发。

<button type="button" id="btn1" onclick="alert('我是按钮1的弹框')" >按钮1</button>
<button type="button" id="btn2">按钮2</button>
<script type="text/javascript">
    const BTN1 = document.getElementById('btn1');
    const BTN2 = document.getElementById('btn2');
    //给按钮2添加点击事件
    BTN2.addEventListener('click', () => {
        BTN1.onclick(); //按钮2点击后触发按钮1的onclick
        //BTN1.click(); //按钮2点击后触发按钮1的click 效果一样
    });
</script>

JavaScript闭包理解

一、JavaScript闭包理解/2017-07-19

<script>
    function a(){
        var i = 0;
        var b = function(){
            console.log(i++);
        }
        return b;
    }
    var c = a();
    setInterval('c()', 500); //0 1 2 3 4 5...
</script>

作用域/闭包理解/2017-08-03

<script>
function a(j){
    var i = j;
    var b = function(){
        console.log(i);
    }
    //i++;
    return b;
}
var c = a(0);
c(); //0
a(1); //i值不管怎么变,c里面的i已经锁死了。
c(); //0
c(); //0
</script>

二、JavaScript闭包理解/2017-08-03

<div>
    <a rel="nofollow" class="mazey-example-a1">Click</a>
    <a rel="nofollow" class="mazey-example-a1">Click</a>
    <a rel="nofollow" class="mazey-example-a1">Click</a>
    <a rel="nofollow" class="mazey-example-a1">Click</a>
    <a rel="nofollow" class="mazey-example-a1">Click</a>
    <a rel="nofollow" class="mazey-example-a1">Click</a>
    <a rel="nofollow" class="mazey-example-a1">Click</a>
    <a rel="nofollow" class="mazey-example-a1">Click</a>
    <a rel="nofollow" class="mazey-example-a1">Click</a>
    <a rel="nofollow" class="mazey-example-a1">Click</a>
</div>
<script type="text/javascript">
var domEles = document.getElementsByClassName('mazey-example-a1');
//正确写法 返回 0 1 2 3...
for (var i = 0, max = domEles.length; i < max; i++) {
    (function(i){ //传入的i被锁定了,与外面的i作用域不一样。
        //debugger;
        domEles[i].addEventListener('click', function () {
            alert(i);
        });
    }(i)); //传入i
}
//错误写法 返回 10
for (var i = 0, max = domEles.length; i < max; i++) {
    domEles[i].addEventListener('click', function () {
        alert(i);
    });
}
</script>

示例: 检查长度/2017-08-08

长度: <input type="text" value="" name="textLen">
<script type="text/javascript">
(function(){
	var textLen = document.getElementsByName('textLen')[0];
	(function(obj){
		obj.addEventListener('blur', function(){
			if(obj.value.length > 20){
				console.log('长度不能超过20位!');
			}
		});
	}(textLen)); //这里的 textLen 与外面的同名 textLen 互不影响.
}());
</script>

三、JavaScript闭包理解/2017-08-08

(function(){
    var data = [];
    for (var i = 0; i < 3; i++){
        data[i] = (function(j){
            return function(){
                console.log(j);
            }
        }(i));
    }
    data[0](); //0
    data[1](); //1
    data[2](); //2
}());

JavaScript邮箱验证-正则验证

一、RegExp

1.1 创建RegExp对象

new RegExp("必选,正则表达式","可选,匹配模式g,i,m")

1.2 RegExp对象的方法

  • test:检索字符串中的指定值,返回True或False。
  • exec:检索字符串中的指定值,返回找到的值,没有则null。
  • complie:用于改变正则表达式,或增删匹配模式。
1.2.1 test()
var r1 = new RegExp('world');
console.log(r1.test('Hello, world!')); //true
console.log(r1.test('Hello, World!')); //false
var r2 = new RegExp('world', 'i'); //大小写不敏感
console.log(r2.test('Hello, World!')); //true
var r3 = new RegExp(/world/i); //简写
console.log(r3.test('Hello, World!')); //true
1.2.2 exec()
var r1 = new RegExp('world');
console.log(r1.exec('Hello, world!')); //['world']
console.log(r1.exec('Hello, World!')); //null
var r2 = new RegExp('world', 'i'); //大小写不敏感
console.log(r2.exec('Hello, World!')); //['world']
var r3 = new RegExp(/world/i); //简写
console.log(r3.exec('Hello, World!')); //['world']
var r4 = new RegExp('o');
console.log(r4.exec('Hello, World!')); //['o']
var r5 = new RegExp('o', 'gi');
console.log(r5.exec('Hello, WOrld!')); //['o']
console.log(r5.lastIndex); //5 匹配文本的第一个字符的位置,o为4,下一个位置为5
console.log(r5.exec('Hello, WOrld!')); //['O'] 匹配完第一个o后调用继续匹配
console.log(r5.lastIndex); //9
console.log(r5.exec('Hello, WOrld!')); //null 匹配不到返回null
console.log(r5.lastIndex); //0 lastIndex重置为0
1.2.3 complie()
var r1 = new RegExp('world');
console.log(r1.exec('Hello, world!')); //['world']
r1.compile('o');
console.log(r1.exec('Hello, World!')); //['o']
r1.compile('m');
console.log(r1.exec('Hello, World!')); //null
var r2 = new RegExp('world');
console.log(r2.test('Hello, world!')); //true
r2.compile('mazey');
console.log(r2.test('Hello, world!')); //false

二、正则表达式

  • ^$:表示匹配值的开始和结尾。
  • +:1+,一个或更多。
  • *:0+,零个或更多。
  • ?:0/1,零个或一个。
  • {1,2}:1<=length<=2,长度。
  • ():表示一个表达式的组。
  • []:匹配的字符范围,我理解为一个块,很多块放在一个组()里面。

三、示例

<form action="">
输入:<input type="text" name="mazey" id="mazey" placeholder="请输入邮箱">
<input type="button" value="验证" onclick="check();">
</form>
<script>
function check(){
    var reg = new RegExp("^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$"); //正则表达式
    var obj = document.getElementById("mazey"); //要验证的对象
    if(obj.value === ""){ //输入不能为空
        alert("输入不能为空!");
        return false;
    }else if(!reg.test(obj.value)){ //正则验证不通过,格式不对
        alert("验证不通过!");
        return false;
    }else{
        alert("通过!");
        return true;
    }
}
</script>