최적의 전략
•
[2, 7, 40, 19]부터 해보기
2 | 7 | 40 | 19 | |
2 | (2, 0) | (7, 2) | **** | |
7 | (7, 0) | (40, 7) | ||
40 | (40, 0) | (40, 19) | ||
19 | (19, 0) |
1.
위의 표에서 행의 값이 n, 열의 값이 m일 때, (n, m) 칸은 리스트에서 n에서 시작해서 m으로 끝나는 부분 배열 [n , .. , m]에서 최적의 (나의 점수, 상대방 점수)를 나타낸다. 위의 표만큼 채운다.
2.
****칸을 채우기 위해서는 앞의 칸을 이용할 수 있다. 왜냐하면 해당 칸은 [2, 7, 40] 배열에서 최적의 경우를 찾는다. 그리고 양끝의 숫자를 가져갈 수 있는데, 양끝의 숫자의 행과 열의 제목에 나와 있다.
결국 나는 40 + 2, 상대방은 7을 가져오게 된다.
결국 나는 2 + 7, 상대방은 40을 가져오게 된다.
3.
순서 찾기
a.
(0, 1) → (1, 2) → (2, 3)
b.
(0, 2) → (1, 3)
c.
(0, 3)
for (int i = 1; i < n; i++) { //i : 0, 1, 2, 3, ..n
for (int j = 0; j < n-i; j++) { //j : 0, 1, .. n-i
dp[j][j+i] =
}
}
Java
복사
답안
class Pair{ //dp에 쓸 클래스 만들기
int left; //나의 카드 합
int right; //상대방 카드 합
@Override
public String toString() {
return "("+ left + ", " + right + ')'; //(1, 1) 모양
}
public Pair(int left, int right) {
this.left = left;
this.right = right;
}
public static Pair better(Pair p1, Pair p2){ //나에게 유리한 경우 찾기
if (p1.left > p2.left){
return p1;
} else if (p1.left < p2.left) {
return p2;
} else { //나의 값이 같다면 상대방이 더 작은거 고르기
return p1.right > p2.right ? p2 : p1;
}
}
}
public class OptimalStrategy {
public static void main(String[] args) {
int[] cards = new int[] {2, 7, 40, 19};
int n = cards.length;
Pair[][] dp = new Pair[n][n]; //dp 만들기
//1. 대각선 채우기
for (int i = 0; i < n; i++) {
dp[i][i] = new Pair(cards[i], 0);
}
//2. 로직 실행하기
for (int i = 1; i < n; i++) { //i : 0, 1, 2, 3, ..n
for (int j = 0; j < n-i; j++) { //j : 0, 1, .. n-i
Pair p1 = new Pair(cards[j]+dp[j+1][j+i].right, dp[j+1][j+i].left); //앞(행)의 카드를 골랐을 때
Pair p2 = new Pair(cards[j+i]+dp[j][j+i-1].right, dp[j][j+i-1].left); //뒤(열)의 카드를 골랐을 때
dp[j][j+i] = Pair.better(p1, p2);
}
}
Arrays.stream(dp).map(Arrays::toString).forEach(System.out::println);
System.out.println(dp[0][n-1].left);
}
}
Java
복사
리눅스 명령어
명령어 출력 결과를 파일로 저장하기
•
최근 하나만 저장된다.
◦
git pull > l.log
◦
docker ps > pds.log
•
있던 파일에 추가한다.
◦
git pull >> l.log
Crontab
예제
45 5 * * 5 sh /home/ubuntu/crontab/docker-prune.sh > /home/ubuntu/crontab/docker-prune.log 2>&1
Java
복사
•
매주 5시 45분에 /home/ubuntu/crontab/ 위치에 있는 docker-prune.sh 를 실행
•
실행로그를 /home/ubuntu/crontab/docker-prune.log에 저장한다.
•
에러(2)가 나면 에러도 docker-prune.log에 저장한다.
45 5 * * 5 —> 매주 금요일 5시(14시) 45분에 실행
[실습] 1분마다 로그 저장해보기
1.
deploy.sh 작성
code
2.
crontab -e
3.
crobtab 내용 작성
* * * * * sh /home/ubuntu/deploy.sh >> /home/ubuntu/deploy.log
#* * * * * echo hello >> /home/ubuntu/deploy.log
Java
복사
4.
cat deploy.log
시간이 지나면서 deploy.log 파일 용량이 점점 늘어간다.
시스템 시간변경
1.
sudo su -
sudo 권한 필요하다.
2.
tzselect
3.
4 > enter > 27 > enter
4.
date 로 현재 시간 확인 ??????
#Environment Variables
JWT_TOKEN_SECRETKEY=가나다라마바사아자차카타파하거너더러;SPRING_DATASOURCE_PASSWORD=1357;SPRING_DATASOURCE_URL=jdbc:mysql://ec2-15-164-176-18.ap-northeast-2.compute.amazonaws.com:3306/likelion
Java
복사
[실습] 새로운 기능 추가해서 자동 배포하기
로컬에서 진행
1.
기능 추가하기 + 도커 파일 작성
controller
Dockerfile
2.
작동 확인
3.
.gitlab-ci.yml 파일 작성하기
# stage → 단계
stages:
- dockerbuild-push
package:
image: docker:latest #도커 위에서 빌드를 한다
stage: dockerbuild-push
services:
- docker:dind #도커 안에서 도커를 빌드할 때 주는 옵션
before_script:
- docker login registry.gitlab.com -u $GITLAB_ID -p $GITLAB_PASSWORD
script:
- docker build -t registry.gitlab.com/$GITLAB_ID/$PROJECT_NAME .
- docker push registry.gitlab.com/$GITLAB_ID/$PROJECT_NAME
after_script:
- docker logout
Java
복사
4.
pipeline이 실행되었다
5.
Container Resistry 확인
published 되었다.
6.
image path를 복사한다.
제목옆에 복사버튼 클릭
registry.gitlab.com/coastby/likelion-hospital-review:latest
Java
복사
서버에서 진행
1.
docker pull을 받아서 실행한다
docker pull [resistry주소]
Java
복사
2.
docker images로 확인
3.
docker run
docker run -p 8080:8080 --name hospital-review -e JWT_TOKEN_SECRETKEY=[JWT KEY] -e SPRING_DATASOURCE_PASSWORD=[mysql PW] -e SPRING_DATASOURCE_URL=jdbc:mysql://[ec2주소]:3306/[schema이름] -d registry.gitlab.com/coastby/likelion-hospital-review
Java
복사
4.
docker ps
5.
docker logs [container ID]
JVM 실행되는 것 확인
6.
api 들어갔을 때 정상적으로 실행되는 것 확인
수정 후 push했을 때 서버에 적용되는 지 확인
1.
Controller 변경 후 push
@GetMapping
public ResponseEntity<String> hi (){
return ResponseEntity.ok("bye");
}
Java
복사
2.
deploy.sh 파일 작성
#!/usr/bin/env bash
# Grab latest config, if the image is different then we have a new update to make
set -ex
docker pull registry.gitlab.com/coastby/likelion-hospital-review:latest | grep "Image is up to date" && pull_status="already_pulled" || pull_status="newly_pulled"
echo $pull_status
if [ "$pull_status" = "newly_pulled" ]; then
docker stop hospital-review
docker rm -f hospital-review
docker run -p 8080:8080 --name hospital-review -e JWT_TOKEN_SECRETKEY=[JWT KEY] -e SPRING_DATASOURCE_PASSWORD=[mysql PW] -e SPRING_DATASOURCE_URL=jdbc:mysql://[ec2주소]:3306/[schema이름] -d registry.gitlab.com/coastby/likelion-hospital-review
fi
Java
복사
c.
container resistry publish 된 것 확인하고 deploy 스크립트 실행해보기
d.
다시 요청보내기
crontab 걸기
crontab -e
* 6 * * * sh deploy.sh >> deploy.log 2>>&1
Java
복사
소스코드 수정, 기능추가
.jar → 1.0 login기능
new .java, 수정 → 1.1 /회원가입 기능
build → gradle → .jar
Docker → K8s
Docker build → docker stop and run
복잡하지만 전형적입니다.
.java → .class → .jar → docker image → Gitlab Runner로 위 스크립트를 실행 하면 이 과정이 진행 됩니다.