Docker Nginx 安装

1
2
3
4
5
6
7
docker run -d --name nginx \
-v /usr/share/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
-v /usr/share/nginx/html:/usr/share/nginx/html:ro \
-v /usr/share/nginx/log:/var/log/nginx \
-p 80:80 \
--restart=always \
nginx

简化版:

1
docker run -d --name nginx -p 80:80 daocloud.io/library/nginx:latest

Docker Ghost 安装

Ghost

Ghost 是基于 Node.js 的开源博客平台,目的是为了给用户提供一种更加纯粹的内容写作与发布平台。

启动命令:

1
docker run -d -name ghost -p 80:2368 -v /root/ghost/data:/var/lib/ghost/content ghost

释义:

1
2
3
4
5
docker run -d \ #创建一个后台运行容器,并返回容器ID
--name ghost \ #为容器指定一个名称
-p 80:2368 \ #将容器的80端口映射到主机的80端口
-v /root/ghost/data:/var/lib/ghost/content \ #主机的目录/root/ghost/data映射到容器的目录/var/lib/ghost/content
ghost #使用docker官方镜像ghost:latest

参考

Ghost
Ghost中文网

echarts - Angular 1.x指令集成

html

1
2
3
4
5
6
<div ng-app="demo" ng-controller="myCtrl" id="demo">
<div style="width: 640px; height: 320px;" bar-chart e-data="data"></div>
<div style="width: 640px; height: 320px;" pie-chart e-data="data"></div>
</div>
<!-- ... 省略文件中其他无关内容 -->
<script src="js/echarts.min.js"></script>

js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
var app = angular.module('demo', []); //定义一个模块
angular.module('demo').controller("myCtrl", function($scope, $http, $interval) { //定义控制器
$interval(function() { //调用$interval服务执行循环任务,3秒自动更新一次数据
$http.get("/demo_get") //调用$http服务获取数据
.success(function(data) {
if (data.status == '0') {
$scope.data = data.data; //将数据放在model中
}
}).error(function() {
$scope.data[0].value = Math.floor(Math.random() * 2000); //模拟数据改变测试
});
}, 3000);
//假设获取到的数据如下:
$scope.data = [{
'value': 335,
'name': '直接访问'
}, {
'value': 310,
'name': '邮件营销'
}, {
'value': 234,
'name': '联盟广告'
}, {
'value': 135,
'name': '视频广告'
}, {
'value': 748,
'name': '搜索引擎'
}];

});
angular.module('demo').directive('barChart', function($window) { //定义条形图指令
return {
restrict: 'A', //以属性的方式调用指令
link: function($scope, element, attrs) { //attrs是DOM元素的属性集合
var myChart = echarts.init(element[0]); //element是一个jqlite对象,如果jQuery在AngularJS之前引入,则是一个jQuery对象,可使用jQuery所有的方法
$scope.$watch(attrs.eData, function(newValue, oldValue, scope) { //监听属性e-data的值,当数据发生改变时执行作为第二个参数的函数
var xData = [],
sData = [],
data = newValue; //获取$scope.data
angular.forEach(data, function(val) {
xData.push(val.name);
sData.push(val.value);
});
var option = {
title: {
text: '某站点用户访问来源',
subtext: '纯属虚构',
x: 'center'
},
color: ['#3398DB'],
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
}
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: [{
type: 'category',
data: xData,
axisTick: {
alignWithLabel: true
}
}],
yAxis: [{
type: 'value'
}],
series: [{
name: '直接访问',
type: 'bar',
barWidth: '60%',
data: sData
}]
};
myChart.setOption(option);
}, true); //$watch的第三个参数,是否深度监听,true监听对象所有属性的变化。
$window.onresize = function() { //调用window服务,使图表能响应式调整大小
myChart.resize();
};
}
};
});

angular.module('demo').directive('pieChart', function($window) { //定义饼图指令
return {
restrict: 'A',
link: function($scope, element, attrs) { //attrs是DOM元素的属性集合
var myChart = echarts.init(element[0]);
$scope.$watch(attrs.eData, function(newValue, oldValue, scope) {
var legend = [];
angular.forEach(newValue, function(val) {
legend.push(val.name);
});
var option = {
title: {
text: '某站点用户访问来源',
subtext: '纯属虚构',
x: 'center'
},
tooltip: {
trigger: 'item',
formatter: "{a} <br/>{b} : {c} ({d}%)"
},
legend: {
orient: 'vertical',
left: 'left',
data: legend
},
series: [{
name: '访问来源',
type: 'pie',
radius: '55%',
center: ['50%', '60%'],
data: newValue,
itemStyle: {
emphasis: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}]
};
myChart.setOption(option);
}, true);
window.addEventListener("resize", function() { //这里使用$window.onresize方法会使前面的图表无法调整大小
myChart.resize();
});
}
};
});

参考

ECharts - 可高度个性化定制的数据可视化图表
ECharts - API
在AngularJS中使用Echarts

nvm-windows安装使用指南

nvm-windows

  • nvm-windows是一个命令行工具
  • nvm-windows 并不是 nvm 的简单移植,他们也没有任何关系
  • nvm-windows切换node版本时,不同node版本之间不共享npm模块
  • 安装nvm-windows前需要卸载及删除node npm相关文件
  • 安装nvm-windows后必须为每个新安装的node单独安装全局应用,如gulp

安装前建议

全局模块

如当前已经安装node,且npm全局安装过一些模块,建议记录下这些全局模块留档
命令如下:

1
npm list -g --depth 0

项目模块

如项目中node_modules中包含模块,建议保存一份存档;如确定项目中package.json里的dependencies和devDependencies配置是规范的,可略过此项

卸载node

安装前先卸载任何现有版本的node.js, 并删除nodejs安装目录
可通过以下命令查找node或npm的安装路径:

spring-retry

Spring Retry实现重试操作

dependency

1
2
3
4
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>

注解

在启动入口加入重试配置

1
@EnableRetry

使用

1
@Retryable(value = Exception.class, maxAttempts = 3,backoff = @Backoff(delay = 2000, multiplier = 1.5))

参考

  • @EnableRetry 能否重试
  • @Retryable 标注此注解的方法在发生异常时会进行重试
    • value:指定处理的异常类
    • include:指定处理的异常类和value一样,默认为空,当exclude也为空时,默认所有异常
    • exclude:指定异常不处理,默认空,当include也为空时,默认所有异常
    • maxAttempts:最大重试次数。默认3次
    • backoff: 重试等待策略。默认使用@Backoff注解
  • @Backoff 重试等待策略
    • 不设置参数时,默认使用FixedBackOffPolicy(指定等待时间),重试等待1000ms
    • 设置delay,使用FixedBackOffPolicy(指定等待时间),重试等待填写的时间
    • 设置delay和maxDealy时,重试等待在这两个值之间均态分布
    • 设置delay、maxDealy、multiplier,使用 ExponentialBackOffPolicy(指数级重试间隔的实现 ),multiplier即指定延迟倍数,比如delay=5000l,multiplier=2,则第一次重试为5秒,第二次为10秒,第三次为20秒……
  • @Recover 用于@Retryable重试失败后处理方法,此注解注释的方法参数一定要是@Retryable抛出的异常,否则无法识别,可以在该方法中进行日志处理。

proxy

代理

反向代理

Mysql 查看binlog

解压缩
tar -xzvf binlog-free.tar.gz

mysqlbinlog -vvv –base64-output=decode-rows mysql-bin.02702* 这个命令是查看日志内容的
mysqlbinlog -vvv –base64-output=decode-rows mysql-bin.000001

mysqlbinlog -vvv –base64-output=decode-rows mysql-bin.0273* >prd.sql
mysqlbinlog -vvv –base64-output=decode-rows mysql-bin.0277* >prd.sql
mysqlbinlog -vvv –base64-output=decode-rows mysql-bin.0280* >prd.sql

mysqlbinlog -vvv –base64-output=decode-rows mysql-bin.0293* >prd.sql
mysqlbinlog -vvv –base64-output=decode-rows mysql-bin.0313* >prd.sql

linux 下执行
替换文件名中的.sql为空字符串
rename .sql.rm ‘’ *

windows下添加后缀名
ren * *.sql

Mysql Regexp 正则表达式

1
2
3
4
5
6
-- 查找name字段中以'st'为开头的所有数据
SELECT name FROM person_tbl WHERE name REGEXP '^st';
-- 查找name字段中以'ok'为结尾的所有数据
SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
-- 查找name字段中包含'mar'字符串的所有数据
SELECT name FROM person_tbl WHERE name REGEXP 'mar';

参考:https://www.runoob.com/mysql/mysql-regexp.html

Mysql常用函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
-- 求绝对值
ABS(x)
-- 四舍五入
ROUND(x)
-- 字符数
CHAR_LENGTH(s)
-- 字符串长度
LENGTH(s)
-- 字符串拼接
CONCAT(s1,s2,...)
-- 字符串截取:从字符串s中的第a个字符开始取b个字符
SUBSTRING(s,a,b)
-- 当前日期
CURRENT_DATE()
-- 当前时间
CURRENT_TIME()
-- 当前时间戳
UNIX_TIMESTAMP()
-- 把UNIX时间戳的时间转换为普通格式的时间
FROM_UNIXTIME(d)
-- 如果表达式expr成立,返回结果v1;否则,返回结果v2。
IF(expr,v1,v2)
-- 如果v1的不为空,就显示v1的值;否则就显示v2的值。
IFNULL(v1,v2)
-- 数据库版本号
VERSION()

Mysql相关

函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
-- 求绝对值
ABS(x)
-- 四舍五入
ROUND(x)
-- 字符数
CHAR_LENGTH(s)
-- 字符串长度
LENGTH(s)
-- 字符串拼接
CONCAT(s1,s2,...)
-- 字符串截取:从字符串s中的第a个字符开始取b个字符
SUBSTRING(s,a,b)
-- 当前日期
CURRENT_DATE()
-- 当前时间
CURRENT_TIME()
-- 当前时间戳
UNIX_TIMESTAMP()
-- 把UNIX时间戳的时间转换为普通格式的时间
FROM_UNIXTIME(d)
-- 如果表达式expr成立,返回结果v1;否则,返回结果v2。
IF(expr,v1,v2)
-- 如果v1的不为空,就显示v1的值;否则就显示v2的值。
IFNULL(v1,v2)
-- 数据库版本号
VERSION()

查询隔离级别

1
2
3
SELECT @@global.tx_isolation;
SELECT @@session.tx_isolation;
SELECT @@tx_isolation;

正则表达式

1
2
3
4
5
6
-- 查找name字段中以'st'为开头的所有数据
SELECT name FROM person_tbl WHERE name REGEXP '^st';
-- 查找name字段中以'ok'为结尾的所有数据
SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
-- 查找name字段中包含'mar'字符串的所有数据
SELECT name FROM person_tbl WHERE name REGEXP 'mar';

参考:https://www.runoob.com/mysql/mysql-regexp.html

查看数据库表结构

1
2
3
4
5
6
7
8
SELECT
t.TABLE_SCHEMA,
t.TABLE_NAME,
t.TABLE_TYPE,
t.CREATE_TIME,
t.TABLE_COMMENT
FROM
information_schema.`TABLES` t;
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×