Believe it

相信不屈不挠的努力,相信战胜死亡的年轻

VPN 与 Proxy

VPN 和Proxy有什么区别呢,国内的各大平台极力屏蔽了VPN和Proxy这两个关键字,很多人都分不清他们的关系。

VPN全名虚拟专用网络,Proxy全名代理。

其实,VPN工作于操作系统级别,而Proxy工作在应用级别。如果你配置了VPN,那么所有的应用都进入了虚拟的网络;但如果你配置了代理,只有支持代理的那部分应用才可以进入到虚拟的网络,不支持代理的APP,则无法使用虚拟网络。

VPN原理图

阅读全文 »

Nginx

通过Docker快速部署一个Nginx实例

下面的指令可以把当前目录快速部署成一个web服务,注意要有index.html,否则会403

1
docker run -d --rm --name nginx -p 8081:80 -v $PWD:/usr/share/nginx/html nginx

配置stream

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 支持stream 的nginx
cd
wget http://nginx.org/download/nginx-1.16.1.tar.gz
tar -zxf nginx-1.16.1.tar.gz -C /usr/local
cd /usr/local/nginx-1.16.1
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-stream
make && make install
/usr/local/nginx/sbin/nginx -v

stream {
upstream myapp{
server IP:9000;
}
server {
listen 20000;
proxy_connect_timeout 5s;
proxy_timeout 5s;
proxy_pass myapp;
}
}
/usr/local/nginx/sbin/nginx -s reload

CPU分类

CPU分两类,精简指令集CPU(RISC)和复杂指令集CPU(CISC)。Intel、AMD厂商主要做复杂指令集CPU;IBM,ARM厂商主要做精简指令集CPU。

精简指令集CPU能耗低,性能相对较弱,常用于移动设备;复杂指令集CPU能耗高,性能强,常用于桌面设备。

CPU架构分类

不同厂商做的CPU,其架构也不尽相同,目前为止,比较多的架构有四种,ARM架构、X86架构、MIPS架构、PowerPC架构。

ARM架构CPU为精简指令集CPU;X86架构CPU为复杂指令集CPU;MIPS架构和PowerPC架构目前用的不太多了。笔者大学期间学习计算机组成原理的时候,学的就是MIPS架构。

阅读全文 »

以哪个镜像作为基础镜像

centos:centos8

1
docker run -it --rm centos:centos8

换源

阿里源

1
2
3
4
5
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* \
&& sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-* \
&& curl https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo -L -o /etc/yum.repos.d/CentOS-Base.repo \
&& yum clean all \
&& yum makecache

安装Git

yum 安装

1
yum install git -y

二进制安装

1

安装Clang

yum安装

1
yum install clang -y

二进制安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
```



# 安装SSH

## yum安装

```shell
yum install openssh-server openssh-clients passwd -y \
&& sed -i "s/^UsePAM yes/UsePAM no/g" /etc/ssh/sshd_config \
&& echo 123456 | passwd root --stdin \
&& ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa \
&& cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys \
&& chmod 0600 ~/.ssh/authorized_keys \
&& ssh-keygen -q -N "" -t rsa -f /etc/ssh/ssh_host_rsa_key \
&& ssh-keygen -q -N "" -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key \
&& ssh-keygen -q -N "" -t ed25519 -f /etc/ssh/ssh_host_ed25519_key

启动

1
/usr/sbin/sshd

1. 总揽

很老的一本书,但是依然有阅读价值。

全书分为4个部分,其中比较重要的应该是第二章和第三章,第二章主要讲解客户端(浏览器)如何保障用户的安全,第三章主要讲解服务端如何保障用户安全。

2. 客户端安全

客户端这边容易受到攻击的主要有三个类型。

第一个是XSS攻击,全名跨站脚本攻击,通常指的是黑客通过某些手段,篡改了用户访问的页面,导致页面上执行了一些恶意的脚本。一个简单的例子:在你登陆淘宝之后,黑客篡改了你的淘宝页面(篡改了用户访问的页面),自动帮你购买了一些奇怪的东西(执行了一些恶意的脚本)。

第二个是CSRF攻击,全名跨站点请求伪造,通常指的是黑客通过某些手段,诱导用户访问某钓鱼页面,在该页面上完成了一些恶意的脚本。一个简单的例子: 在一些诱惑下你点开了一个页面(诱导用户访问某钓鱼页面),尽管你之后什么都没有做,但是你的淘宝购物车被恶意清空了(在该页面上完成了一些恶意的脚本)

第三个是ClickJacking攻击,全名点击劫持攻击,通常指的是黑客通过某些手段,诱导用户访问某钓鱼页面,该页面有个按钮,按钮上悬浮了一个透明的iframe,然后引诱你点击该按钮,当你点击该按钮时触发了iframe中的按钮。一个例子是:在一些诱惑下你点开了一个页面,然后在该页面的诱惑下你点击了一个按钮,结果你的淘宝购物车被恶意清空了。

阅读全文 »

1. AspectJ

1.1. AspectJ介绍

AspectJ官网1

AspectJ文档2

1.1.1. pointcuts

pointcuts指的是程序中的某些链接点(某些时机),例如call(void Point.setX(int))表示:调用类PointsetX(int)方法时

pointcuts可以使用与或非表达式(||,&&,!)连接,比如 call(void Point.setX(int)) || call(void Point.setY(int))

pointcuts可以被定义为变量,如下面代码中的move()

1
2
3
4
5
6
pointcut move():
call(void FigureElement.setXY(int,int)) ||
call(void Point.setX(int)) ||
call(void Point.setY(int)) ||
call(void Line.setP1(Point)) ||
call(void Line.setP2(Point));

当然pointcuts定义的时候还可以使用通配符,比如call(void Figure.make*(..))代表Figure的以make开头且返回值为void的方法(不关心参数)调用的时候。比如call(public * Figure.* (..))代表Figure的任何方法(不关心方法名,参数,返回值)调用的时候。

阅读全文 »

0. 一个错误的概念

1
2
3
4
5
6
int main() {
int a = 111;
int &b = a;
b = 222;
std::cout<<&a<<&b;
}

我们能看到这里输出的两个值相同。

  • 错误1:

    很多人认为这里的b就是a,a就是b,a和b的地址是一样的,如下图。

    但是笔者要说,其实这个概念是有问题的,a是a,b是b,a和b并不是同一个地址。

阅读全文 »

1. 对List不能很好的支持

1.1. 核心代码

代码中写的是数组

1
2
3
4
5
/**
* 用户
*/
@ApiModelProperty(value = "用户",example = "hellowang")
private List<String> user;

1.2. 问题详情

在swagger页面展示的例子是字符串

1
2
3
{
"user": "hellowang"
}

1.3. 问题讨论

Stackoverflow

Github

1.4. 解决方案

springfox-collection-example-plugin

1. Go 的指针

Go的指针和C的指针很类似,这也是Go被归类于C类语言的原因,Go的指针不支持偏移运算,即不能向C一样让指针+1,-1。

1.1. 正常使用

先来看第一个,符号&即可取到对象的地址。

1
2
3
4
5
6
7
func sample1() {
arr1 := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

fmt.Println(arr1)

fmt.Println(&arr1)
}
1
2
[0 1 2 3 4 5 6 7 8 9]
&[0 1 2 3 4 5 6 7 8 9]

1.2. for循环问题

下面的输出全是9,因为for循环的value是共用一个地址的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func sample2() {
arr1 := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

mp := map[int]*int{}

for i, value := range arr1 {
mp[i] = &value
}


for i, _ := range arr1 {
fmt.Println(*mp[i])
}
}

2. Go 的 new 和 make

参考

new 只分配内存,make不仅分配内存还初始化对象。

slice、chan、map一般可以使用make初始化。