//////
Search

221213 (1)

최적의 전략

[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)의 반대의 경우가 될 것이다. 즉 나는 2, 상대방이 7을 가져오게 될 것이다.
결국 나는 40 + 2, 상대방은 7을 가져오게 된다.
 만약 왼쪽 끝인 2를 고른다면 그 후에는 [7, 40]에 대한 선택을 할 것이다.
결국 나는 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로 위 스크립트를 실행 하면 이 과정이 진행 됩니다.