0%

Mac 创建软链和删除软链

创建软链接

ln -s [源文件或目标] [目标文件或目录]

如:

1
2
ln -s /Users/xxx/settings.xml ~/.m2/settings.xml

删除软链接

rm -rf [目标文件]

如:

1
2
rm -rf settings.xml

注意:settings.xml 后面不要加 “/”,否则会把原文件也删除调

修改软链接

ln -snf [源文件或目录] [目标文件或目录]

1
ln -snf /Users/xxx/settings.xml ~/.m2/settings.xml

Java List 随机取值的多种方法

为了从列表中获取随机元素,需要生成一个随机索引号,然后使用list.get()方法通过生成的索引编号获取元素。

这里关键是要记住,不得使用超过列表大小的索引。

方法 1

 List<String> list = Arrays.asList("a","b","c");
 int index = (int) (Math.random()* list.size());
 System.out.println(list.get(index));

方法 2

 List<String> list = Arrays.asList("a","b","c");
 int index = new Random().nextInt(list.size());
 System.out.println(list.get(index));

方法 3

 List<String> list = Arrays.asList("a","b","c");

 // shuffle 打乱顺序 
 Collections.shuffle(list);
 System.out.println(list.get(0));

  • 获取当前时间在这一年是第几周(国外计算方式,周日为一周的第一天)
  • 获取当前时间在这一年是第几周(中国计算方式,周一为一周的第一天)
  • 获取当前周的第一天日期
  • 获取当前周的最后一天日期
  • 获取指定某年某一周的起止日期
  • 获取当前月份第一天日期
  • 获取当前月份最后一天日期
  • 获取指定年份月份的起止日期
  • 获取现在是今年的第几个季度
  • 获取当前季度的第一天日期
  • 获取当前季度的最后一天日期
  • 获取指定季度的起止日期

获取当前时间在这一年是第几周(国外计算方式,周日为一周的第一天)

1
2
3
4
5
/* 获取指定时间在这一年是第几周 可以把 CURDATE() 函数替换成你的指定时间 */

SELECT WEEK(CURDATE());

SELECT YEARWEEK(CURDATE());

获取当前时间在这一年是第几周(中国计算方式,周一为一周的第一天)

1
2
3
4
5
/* 获取指定时间在这一年是第几周 可以把 CURDATE() 函数替换成你的指定时间 */

SELECT WEEK(CURDATE(),1);

SELECT WEEKOFYEAR(CURDATE());

周起止时间获取

1
2
3
4
5
6
7
8
-- 获取当前周的第一天日期
SELECT DATE_SUB(CURDATE(),INTERVAL WEEKDAY(CURDATE()) + 0 DAY);
-- 获取当前周的最后一天日期
SELECT DATE_SUB(CURDATE(),INTERVAL WEEKDAY(CURDATE()) - 6 DAY);
-- 上周周一日期
select DATE_SUB( DATE_SUB(CURDATE(),interval 7 day),interval weekday(DATE_SUB(CURDATE(),interval 7 day)) +0 Day) as preWeekStartDay
-- 上周周日日期
SELECT DATE_SUB( DATE_SUB(CURDATE(),interval 7 day),interval weekday(DATE_SUB(CURDATE(),interval 7 day)) -6 Day) as preWeekEndDay

获取指定某年某一周的起止日期

1
2
3
4
5
/* 指定某年某一周的第一天日期 */
SELECT DATE_SUB((DATE_SUB(CONCAT(指定年份,'-01-01'), INTERVAL -(指定第几周-1) WEEK)),INTERVAL WEEKDAY((DATE_SUB(CONCAT(指定年份,'-01-01'), INTERVAL -(指定第几周-1) WEEK))) + 0 DAY)
/* 指定某年某一周的最后一天日期 */
SELECT DATE_SUB((DATE_SUB(CONCAT(指定年份,'-01-01'), INTERVAL -(指定第几周-1) WEEK)),INTERVAL WEEKDAY((DATE_SUB(CONCAT(指定年份,'-01-01'), INTERVAL -(指定第几周-1) WEEK))) - 6 DAY)

获取当前月份第一天日期

1
SELECT CONCAT(DATE_FORMAT(LAST_DAY(CURRENT_DATE()),'%Y-%m-'),'01'); 

获取当前月份最后一天日期

1
SELECT LAST_DAY(CURRENT_DATE()); 

获取指定年份月份的起止日期

1
2
3
4
5
6
7
/* 指定年份月份的第一天日期 */

SELECT CONCAT_WS('-',指定年份,指定月份,'01');

/* 指定年份月份的最后一天日期 */

SELECT LAST_DAY(指定时间);

获取现在是今年的第几个季度

1
SELECT QUARTER(CURRENT_DATE());

获取当前季度的第一天日期

1
SELECT CONCAT(DATE_FORMAT(LAST_DAY(MAKEDATE(EXTRACT(YEAR FROM  CURDATE()),1) + INTERVAL QUARTER(CURDATE())*3-3 MONTH),'%Y-%m-'),'01');   

获取当前季度的最后一天日期

1
SELECT LAST_DAY(MAKEDATE(EXTRACT(YEAR  FROM CURDATE()),1) + INTERVAL QUARTER(CURDATE())*3-1 MONTH);  

获取指定季度的起止日期

1
2
3
4
5
6
7
/* 指定季度的第一天日期 */

SELECT CONCAT(DATE_FORMAT(LAST_DAY(MAKEDATE(指定年份,1) + INTERVAL 指定季度*3-3 MONTH),'%Y-%m-'),'01');

/* 指定季度的最后一天日期 */

SELECT LAST_DAY(MAKEDATE(指定年份,1) + INTERVAL 指定季度*3-1 MONTH);

缘起

在写java时,有时需要写注释,而为了更好的描述,需要引用和参考其他代码.为了让阅读者更好的体验,javadoc中支持链接跳转,这就需要用到注解@see.

@see用法

注解@see可以在注释中实现链接跳转.@see可以指向包,类,方法,属性.

一个完整的使用方法是这样的@see package.class#member.

Typical forms for @see package.class#member

如果指向的在当前类中,可以只写井号后面的.

1
2
3
4
5
@see #field
@see #method(Type, Type,...)
@see #method(Type argname, Type argname,...)
@see #constructor(Type, Type,...)
@see #constructor(Type argname, Type argname,...)

如果指向的在当前包中,可以省略包名.

1
2
3
4
5
6
7
@see Class#field
@see Class#method(Type, Type,...)
@see Class#method(Type argname, Type argname,...)
@see Class#constructor(Type, Type,...)
@see Class#constructor(Type argname, Type argname,...)
@see Class.NestedClass
@see Class

如果在其他包中,需要指向全路径.

1
2
3
4
5
6
7
8
@see package.Class#field
@see package.Class#method(Type, Type,...)
@see package.Class#method(Type argname, Type argname,...)
@see package.Class#constructor(Type, Type,...)
@see package.Class#constructor(Type argname, Type argname,...)
@see package.Class.NestedClass
@see package.Class
@see package

参考

在使用mysql时候,某些字段会存储中文字符,或是包含中文字符的串,查询出来的方法是:

1
SELECT column FROM table WHERE length(column)!=char_length(column)

  

原理其实很简单,当字符集为UTF-8,并且字符为中文时,length() 和 char_length() 两个方法返回的结果是不相同的。

PS:column更换为对应的列名

查看进程占用

lsof -i tcp:8080

该命令会显示占用8080端口的进程,有其 pid ,可以通过pid关掉该进程

杀死进程

kill pid

使用 Docker 搭建 FTP 服务,不仅十分简单,而且可以对宿主机有一定的隔离。下面以 CentOS 系统为例,演示如何通过容器运行 FTP 服务。

1,拉取镜像

首先执行如下命令将镜像下载到本地:

1
docker pull fauria/vsftpd

2,启动容器

执行如下命令实例化 ftp 服务:

参数说明:

  • /home/ftp:/home/vsftpd:映射 docker 容器 ftp 文件根目录(冒号前面是宿主机的目录)
  • -p:映射 docker 端口(冒号前面是宿主机的端口)
  • -e FTP_USER=test -e FTP_PASS=test :设置默认的用户名密码(都为 test
  • PASV_ADDRESS:宿主机 ip,当需要使用被动模式时必须设置。
  • PASV_MIN_PORT~ PASV_MAX_PORT:给客服端提供下载服务随机端口号范围,默认 21100-21110,与前面的 docker 端口映射设置成一样。
1
docker run -d -v /home/ftp:/home/vsftpd \-p 20:20 -p 21:21 -p 21100-21110:21100-21110 \-e FTP_USER=test -e FTP_PASS=test \-e PASV_ADDRESS=192.168.60.128 \-e PASV_MIN_PORT=21100 -e PASV_MAX_PORT=21110 \--name vsftpd --restart=always fauria/vsftpd

3,防火墙配置

如果 CentOS 服务器有防火墙,为了让客户端能够访问 ftp 服务。我们可以关闭防火墙,或者执行如下命令配置 firewall 防火墙策略:

1
firewall-cmd --permanent --add-port=20/tcpfirewall-cmd --permanent --add-port=21/tcpfirewall-cmd --permanent --add-port=21100/tcpfirewall-cmd --permanent --add-port=21101/tcpfirewall-cmd --permanent --add-port=21102/tcpfirewall-cmd --permanent --add-port=21103/tcpfirewall-cmd --permanent --add-port=21104/tcpfirewall-cmd --permanent --add-port=21105/tcpfirewall-cmd --permanent --add-port=21106/tcpfirewall-cmd --permanent --add-port=21107/tcpfirewall-cmd --permanent --add-port=21108/tcpfirewall-cmd --permanent --add-port=21109/tcpfirewall-cmd --permanent --add-port=21110/tcpfirewall-cmd --reload

4,新建用户文件夹

(1)首先执行如下命令进入到容器里面:

1
docker exec -i -t vsftpd bash

(2)由于前面我们启动的时候设置用户名为 test,已经自动创建对应的用户文件夹(所以下面这个文件夹无需我们再次手动创建):

1
mkdir /home/vsftpd/test

(3)为方便演示,在 test 用户文件夹下新建一个 1.txt 文件。

1
vi /home/vsftpd/test/1.txt

5,访问服务

(1)我们可以直接使用浏览器进行访问,地址如下:

原文:Docker - 在容器中搭建运行FTP服务器(vsftpd)

(2)也可以使用 ftp 客户端工具进行访问。

原文:Docker - 在容器中搭建运行FTP服务器(vsftpd)

(3)如果是 Mac 电脑,我们还可以通过“访达”->“前往”->“**连接服务器…**”来访问 ftp 服务。

原文:Docker - 在容器中搭建运行FTP服务器(vsftpd)

附:增加一个新用户

前面我们在启动服务的时候就创建了个默认用户 test。如果需要新增一个新用户,假设用户名:hangge,密码:123456,具体操作如下。

(1)首先执行如下命令进入到容器里面:

1
docker exec -i -t vsftpd bash

(2)创建新用户的文件夹:

1
mkdir /home/vsftpd/hangge

(3)编辑用户配置文件:

1
vi /etc/vsftpd/virtual_users.txt

(4)在文件中添加新用户的用户名和密码:

原文:Docker - 在容器中搭建运行FTP服务器(vsftpd)

(5)保存退出后执行如下命令,把登录的验证信息写入数据库。

1
/usr/bin/db_load -T -t hash -f /etc/vsftpd/virtual_users.txt /etc/vsftpd/virtual_users.db

(6)最后退出容器,并重启容器可以使用新用户连接 FTP 服务了。

1
exitdocker restart vsftpd

相关命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1、查看所有镜像
docker images
2、查看正在运行的容器
docker ps
3、查看所有容器
docker ps -a
4、运行已存在的容器
docker start {id}
5、停止已存在的容器
docker stop {id}
6、删除容器 (必须先停止容器)
docker rm {容器id}
7、删除镜像
docker rmi {镜像id}
8、进入容器,推荐使用
docker exec -it {容器id} /bin/bash
9、进入容器
docker attach {容器id}
10、查看容器ip:
docker inspect --format='{{.Name}} - {{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

docker命令别名

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
138
139
140
#!/bin/sh

#alias node='docker run --rm -it -v `pwd`:/app -w /app node:16-alpine '
alias node='docker run --rm -it -v "${CURDIR}":/app -w /app node:16-alpine '
alias npm='docker run --rm -it -v "${CURDIR}":/app -w /app node:16-alpine npm '
alias ffmpeg='docker run --rm -it -v "${CURDIR}":/app -w /app jrottenberg/ffmpeg '

alias dm='docker-machine'
alias dmx='docker-machine ssh'
alias dk='docker'
alias dki='docker images'
alias dks='docker service'
alias dkrm='docker rm'
alias dkl='docker logs'
alias dklf='docker logs -f'
alias dkflush='docker rm `docker ps --no-trunc -aq`'
alias dkflush2='docker rmi $(docker images --filter "dangling=true" -q --no-trunc)'
alias dkt='docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}"'
alias dkps="docker ps --format '{{.ID}} ~ {{.Names}} ~ {{.Status}} ~ {{.Image}}'"

dkln() {
docker logs -f `docker ps | grep $1 | awk '{print $1}'`
}

dkp() {
if [ ! -f .dockerignore ]; then
echo "Warning, .dockerignore file is missing."
read -p "Proceed anyway?"
fi

if [ ! -f package.json ]; then
echo "Warning, package.json file is missing."
read -p "Are you in the right directory?"
fi

VERSION=`cat package.json | jq .version | sed 's/\"//g'`
NAME=`cat package.json | jq .name | sed 's/\"//g'`
LABEL="$1/$NAME:$VERSION"

docker build --build-arg NPM_TOKEN=${NPM_TOKEN} -t $LABEL .

read -p "Press enter to publish"
docker push $LABEL
}

dkpnc() {
if [ ! -f .dockerignore ]; then
echo "Warning, .dockerignore file is missing."
read -p "Proceed anyway?"
fi

if [ ! -f package.json ]; then
echo "Warning, package.json file is missing."
read -p "Are you in the right directory?"
fi

VERSION=`cat package.json | jq .version | sed 's/\"//g'`
NAME=`cat package.json | jq .name | sed 's/\"//g'`
LABEL="$1/$NAME:$VERSION"

docker build --build-arg NPM_TOKEN=${NPM_TOKEN} --no-cache=true -t $LABEL .
read -p "Press enter to publish"
docker push $LABEL
}

dkpl() {
if [ ! -f .dockerignore ]; then
echo "Warning, .dockerignore file is missing."
read -p "Proceed anyway?"
fi

if [ ! -f package.json ]; then
echo "Warning, package.json file is missing."
read -p "Are you in the right directory?"
fi

VERSION=`cat package.json | jq .version | sed 's/\"//g'`
NAME=`cat package.json | jq .name | sed 's/\"//g'`
LATEST="$1/$NAME:latest"

docker build --build-arg NPM_TOKEN=${NPM_TOKEN} --no-cache=true -t $LATEST .
read -p "Press enter to publish"
docker push $LATEST
}

dkclean() {
docker rm $(docker ps --all -q -f status=exited)
docker volume rm $(docker volume ls -qf dangling=true)
}

dkprune() {
docker system prune -af
}

dktop() {
docker stats --format "table {{.Container}}\t{{.Name}}\t{{.CPUPerc}} {{.MemPerc}}\t{{.NetIO}}\t{{.BlockIO}}"
}

dkstats() {
if [ $# -eq 0 ]
then docker stats --no-stream;
else docker stats --no-stream | grep $1;
fi
}

dke() {
docker exec -it $1 /bin/sh
}

dkexe() {
docker exec -it $1 $2
}

dkreboot() {
osascript -e 'quit app "Docker"'
countdown 2
open -a Docker
echo "Restarting Docker engine"
countdown 120
}

dkstate() {
docker inspect $1 | jq .[0].State
}

dksb() {
docker service scale $1=0
sleep 2
docker service scale $1=$2
}

mongo() {
mongoLabel=`docker ps | grep mongo | awk '{print $NF}'`
docker exec -it $mongoLabel mongo "$@"
}

redis() {
redisLabel=`docker ps | grep redis | awk '{print $NF}'`
docker exec -it $redisLabel redis-cli
}

Spring boot Security Disable security

In case you have spring-boot-actuator in your package, you should add the following

1
2
3
@EnableAutoConfiguration(exclude = {
org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration.class,
org.springframework.boot.actuate.autoconfigure.ManagementWebSecurityAutoConfiguration.class})

spring boot 2.0 之前版本解决方法:

1
2
security.basic.enabled=false
management.security.enabled=false

For Spring Boot 2 following properties are deprecated in application.yml configuration

1
2
security.basic.enabled: false
management.security.enabled: false

To disable security for Sprint Boot 2 Basic + Actuator Security following properties can be used in application.yml file instead of annotation based exclusion (@EnableAutoConfiguration(exclude = {SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class}))

1
2
3
4
spring:
autoconfigure:
exclude[0]: org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration
exclude[1]: org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration

For application.properties syntax would be like

1
spring.autoconfigure.exclude[0]=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration