webgoat环境搭建

芹菜炒香肠

为什么想写研究webgoat,想写这篇文章

  • 最近听到一个词,叫“bounty hacker”,赏金黑客,通过提交安全漏洞获得赏金的人,这种挣钱方式看起来很酷,webgoat又是开源的由java开发的web靶场,所以就开始了

环境搭建

  • webgoat就是一个java web工程,用启动java web的方式启动就可以

Git教程

git知识

Git快速上手

  • git的仓库:Github、gitee、腾讯云Coding等等
  • 【fork按钮】fork代码到自己的namespace
  • 【git clone】从仓库下载代码到本地:git clone https://github.com/JavaProgrammerLB/spring-framework.git
  • 【git status】查看未修改的代码
  • 【git add -A】添加修改
  • 【git commit -m “修改处理逻辑”】提交
  • 【git push】推送

.gitignore

1
2
3
4
5
6
7
# 忽略单个文件
HELP.md
# 忽略文件夹
.idea
target
# 忽略后缀特征的文件
*.iml

Git分支相关命令

  • 【列出本地分支】git branch
  • 【列出所有分支】git branch -a
  • 【创建分支】git branch dev
  • 【切换分支】git checkout dev
  • 【创建并切换到分支】git checkout -b bug_fix
  • 【把本地新建分支推送到远程的新分支】git push origin bug_fix
  • 【分支合并】git merge master

工作区、暂存区、分支

  • 【工作区】本地
  • 【暂存区】git add readme.txt
  • 【分支】git commit -m “新增readme”

将暂存区文件恢复到工作区

  • git add a.txt
  • git add b.txt
  • git reset HEAD
  • 【或】git reset HEAD a.txt

Git远程仓库

  • 【查看远程仓库】git remote
  • 【查看远程仓库和url】 git remote -v
  • 【增加远程仓库】git remote add upstream https://github.com/spring-projects/spring-framework.git
  • 【从远程仓库拉代码】git pull upstream main
  • 【把本地代码push到origin仓库】git push origin

从git init命令开始的流程

  • 【本地创建】init
    1
    2
    3
    mkdir git_repo
    cd git_repo
    git init
  • 【创建空远程仓库】https://github.com/JavaProgrammerLB/git_repo.git
  • 【绑定】
    1
    2
    git remote add origin https://github.com/JavaProgrammerLB/git_repo.git
    git remote -v
  • 【本地提交】写代码、创建好.gitignore文件
    1
    2
    3
    4
    git add .gitignore
    git add 1.txt
    git commit -m "【初始化】init"
    git push origin master

Kubernetes教程

关键词

  • pods、label、annotation、namespace

kubectl get

  • kubectl get pods
1
kubectl get pods --show-labels
  • kubectl get pods -L creation_method, env
  • kubectl get pods -l creation_method=manual
  • kubectl get pods -l env
  • kubectl get pods -l ‘!env’
  • kubectl get pods -l creation_method!=manual
  • kubectl get pods -l env in (prod, dev)
  • kubectl get pods -l env notin (prod, dev)
  • kubectl get pods -l app=pc, rel=dev
  • kubectl get nodes
  • kubectl get services
  • kubectl get secrets
  • kubectl get namespaces
  • kubectl get pods –namespace kube-system

kubectl run

  • kubectl run nginx –image=nginx
  • kubectl run k8s-tutorial-node –image yitianyigexiangfa/k8s_node_hello_world:1.0
  • kubectl run k8s-tutorial-node –image yitianyigexiangfa/k8s_node_hello_world:1.0 –port=8080

kubectl delete

  • kubectl delete pods k8s-tutorial-node
  • kubectl delete pods -l creation_method=manual
  • kubectl delete namespaces custom-namespaces
  • kubectl delete secrets regsecret
  • kubectl delete rs kubia –cascade=false

kubectl create

  • kubectl create deployment demo –image=yitianyigexiangfa/springboot-k8s-tutorial –dry-run=client -o=yaml > deployment.yaml
  • kubectl create service clusterip demo –tcp=8080:8080 –dry-run=client -o=yaml >> deployment.yaml
  • kubectl create namespace custom-namespace

kubectl apply

  • kubectl apply -f deployment.yaml

kubectl port-forward

1
2
kubectl port-forward svc/demo --address=0.0.0.0  8080:8080
kubectl port-forward k8s-tutorial-fortune --address=0.0.0.0 8080:80

kubectl config

  • kubectl config set-context kube-system-ctx –cluster=k8s-cluster1 –user=kubectl –namespace=kube-system

kubectl logs

  • kubectl logs k8s-tutorial-node
  • kubectl logs k8s-tutorial-node -c redis

kubectl label

  • kubectl label pods k8s-tutorial-node creation_method=manual
  • kubectl label pods k8s-tutorial-node env=prod –overwrite

kubectl annotation

  • kubectl annotation pods k8s-tutorial-node myCompany.com/someAnnotaion=”foo bar”

kubectl edit

  • kubectl edit replicationcontroller kubia

kubectl scale

  • kubectl scale rc kubia –replicas=3

kubectl exec

1
kubectl exec k8s-tutorial-fortune -c html-generator -- cat /var/htdocs/index.html

拍头像

相机拍摄效果

相机与照片参数

  • Sony A600
  • Sigma 30mm F1.4
  • 光圈 F1.4
  • 快门 1/60
  • ISO 125

处理效果

醒图处理步骤

  • 人像->自动美颜->一键美颜
  • 调节->饱和度 +10
  • 调节->色调 +30

如何做辣椒炒肉

辣椒炒肉步骤

  • 切肉丝
  • 放盐,料酒、白糖、豆瓣酱、生粉搅拌
  • 切辣椒
  • 起锅放油,倒入肉丝爆炒,盛出来
  • 炒辣椒至断生
  • 倒入肉丝回锅
  • 放入葱花
  • 盛盘

使用阿里云效自动部署github pages博客

博客自动部署时序图

使用到的工具和技术

  • github(webhook、Github Pages、token)
  • 阿里云效(流水线构建、部署)
  • Docker(镜像)
  • hexo(根据markdown生产html页面文件、hexo deploy to git)
  • 阿里云容器镜像服务(镜像仓库)
  • Digital Ocean(保证博客发布到Github的稳定)

Docker教程

docker 命令列表

  • docker build
  • docker run
  • docker network
  • docker exec
  • docker inspect
  • docker tag
  • docker login
  • docker ps
  • docker stop
  • docker images
  • docker rmi
  • docker search
  • docker pull
  • docker push

Dockerfile关键词列表

  • FROM
  • VOLUME
  • ARG
  • ENV
  • ADD
  • COPY
  • EXPOSE
  • WORKDIR
  • ENTRYPOINT
  • USER
  • CMD
  • RUN

docker build命令执行示例

1
docker build -t hexo_docker:1.0.1 --no-cache .

docker run命令执行示例

1
docker run hexo_docker:1.0.1

docker 命令执行示例

1
docker exec -it ${容器ID} /bin/bash 

docker ps

1
2
docker ps
docker ps -a

docker rm ${容器ID}

  • 删除容器

docker rmi ${镜像ID}

  • 删除镜像

docker tag

  • docker tag : 标记本地镜像,将其归入某一仓库
  • docker tag demo:0.0.1-SNAPSHOT yitianyigexiangfa/springboot-k8s-tutorial:1.0
1
2
3
docker search nginx
docker search -f stars=10 java
docker search yitianyigexiangfa

docker pull

1
docker pull yitianyigexiangfa/k8s_tutorial_fortune:1.0

docker push

1
docker push yitianyigexiangfa/k8s_tutorial_fortune:1.0

docker hub

  • 类似于github里有存了很多开源代码,docker hub里存了很多开放的容器
  • 例如redis在docker hub的地址是这样的

Dockerfile例子

1
2
3
FROM java:8
COPY target/*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

java并发集合

birthday

常用并发集合

  • ConcurrentLinkedDeque;非阻塞式列表
  • LinkedBlockingDeque;阻塞式列表
  • LinkedTransferQueue;用于数据生成或消费的阻塞式列表
  • PriorityBlockingQueue;按优先级排序列表元素的阻塞式列表
  • DelayQueue;带有延迟列表元素的阻塞式列表
  • ConcurrentSkipListMap;非阻塞式可遍历映射
  • ThreadLocalRandom;随机数字
  • AtomicLong、AtomicIntegerArray;原子实现类

业务类

  1. 继承或实现声明
  2. 类属性
  3. 构造方法
  4. main方法
  5. override的方法
  6. 私有方法

队列常见的操作

  • add
  • size
  • poll
  • get
  • take(获取并移除)
  • remove
  • peek

队列常见单词

  • first
  • last

优先级

如何优先,需要通过实现Comparable接口,提供compareTo方法

延迟

Delayed接口,实现compareTo方法,getDelay方法

java的多线程与并发

cloud

java创建线程

  • extend Thread
  • implements Runnable

java多线程计算器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Caculator implements Runnable{
public void run(){
for(int i = 0; i < 100; i ++){
System.out.println(“%s, value=%d”, Thread.currentThread().getName(), i);
}
}
}

class Application{
public static void main(){
for(int i = 0; i < 10; i ++){
Caculator c = new Caculator();
Thread t = new Thread(c);
t.start();
}
}
}

计数器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Counter implements Runnable{
private int count = 0;
public void run(){
for (int i = 0; i < 10000; i ++){
count ++;
}
}

public static int getCountValue(){
return count;
}
}

public class Application{
public static void main(){
Counter c = new Counter();
Thread t = new Thread();
t.start();
System.out.println(Count.getCountValue());
}
}

使用join方法

  • 子线程调用join方法,让main线程等待
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public class MySubThread extends Thread{
    public void run(){
    int sleepTime = 2000;
    Thread.sleep(sleepTime);
    System.out.println(“MySubThread run finished!”);
    }
    }

    public class Application{
    public static void main(){
    MySubThread t = new MySubThread();
    t.start();
    // t.join();
    System.out.println(“Main Thread finished!”);
    }
    }

线程上锁

  • synchronized
  • lock与ReentrantedLock

synchronized版本的计数器

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
public class Counter implements Runnable{
int count = 0;

public static int getCount(){
return count;
}

@Override
public void run(){
for(int i = 0; i < 10000; i ++){
synchronized(this){
count ++;
}
}
}
}

public class Application{
public static void main(){
Counter c = new Counter();
Thread t1 = new Thread();
Thread t2 = new Thread();
t1.start();
t1.join();
t2.start();
t2.join();
System.out.println(“count is: ” + Count.getCount());
}
}

synchronized版本的计数器之二, 使用synchronized给实例方法加锁

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
public class Counter implements Runnable{
int count = 0;

public static int getCount(){
return count;
}

@Override
public synchronized void run(){
for(int i = 0; i < 10000; i ++){
count ++;
}
}
}

public class Application{
public static void main(){
Counter c = new Counter();
Thread t1 = new Thread();
Thread t2 = new Thread();
t1.start();
t1.join();
t2.start();
t2.join();
System.out.println(“count is: ” + Count.getCount());
}
}

synchronized版本的计数器之三,使用synchronized修饰静态方法

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
public class Counter implements Runnable{
int count = 0;

public static int getCount(){
return count;
}

@Override
public void run(){
for(int i = 0; i < 10000; i ++){
increase();
}
}
}

public static synchronize increase(){
count ++;
}
}

public class Application{
public static void main(){
Counter c = new Counter();
Thread t1 = new Thread();
Thread t2 = new Thread();
t1.start();
t1.join();
t2.start();
t2.join();
System.out.println(“count is: ” + Count.getCount());
}
}

笔记

  • reentrant单词也作re-entrant,entrant为进入者、新会员的意思

过去不等于未来

smile

习惯

同样的环境,同样的情况,对于同样一件事,昨天你会这样做,只随着时间的变化,你的行动一般是一样的,这就是习惯。

温水煮青蛙

思考这样一个问题,如何知道自己是不是被温水煮着的青蛙。首先,视野要大过头顶,知道什么是锅,锅下架着柴火,柴火会让锅里的水变热,青蛙不能在水温高的环境里生存。另外,要和朋友聊聊,和在锅里的朋友聊聊,感觉异常了,相互帮助能想个办法;你在锅里,朋友在河里,聊一聊各自的环境,你能帮朋友度过寒冬,朋友能帮你认识到燃烧的柴火。突破边界,找到跳出锅的方法,水冷的时候你能有地方保暖,水热的时候能很快跳出锅的束缚。

人生是一条河吗

在河里游泳,是不是不往前游就会往下沉?其实也不会,只要你会踩水,你就能一直浮着,呼气、吸气。如果你沉到了水底,你一直往下沉,你只有在自己还有气之前把自己浮出水面。