apt package index 를 update하고 docker 설치

sudo apt update
sudo apt install docker.io

 

docker 설치 후 데몬 기동 현황 확인

sudo systemctl status docker

ubuntu 계정에 docker 실행 권한을 주기 위한 설정

sudo chmod 666 /var/run/docker.sock

'docker' 카테고리의 다른 글

Docker base image  (0) 2023.02.18

Environment

Ubuntu 18.04
Java 11.0.18

 

vm 접속해서

curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo tee /usr/share/keyrings/jenkins-keyring.asc > /dev/null
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/null​

 

설치 가능한 패키지 리스트를 최신화후 jenkins 설치

sudo apt-get update
sudo apt-get install jenkins

https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/

 

Find First and Last Position of Element in Sorted Array - LeetCode

Can you solve this real interview question? Find First and Last Position of Element in Sorted Array - Given an array of integers nums sorted in non-decreasing order, find the starting and ending position of a given target value. If target is not found in t

leetcode.com

 

이진탐색 두번 시행

1. 시작지점 찾기

2. 끝나는 지점 찾기

 

class Solution {
    public int[] searchRange(int[] nums, int target) {

        int start = -1;
        int end = -1;

        int left = 0;
        int right = nums.length - 1;
        // start 위치 찾기
        while (left <= right) {

            int mid = (left + right) / 2;

            if (nums[mid] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
            if (nums[mid] == target) {
                start = mid;
            }
        }

        //end 위치 찾기

        left = 0;
        right = nums.length - 1;
        while (left <= right) {

            int mid = (left + right) / 2;

            if (nums[mid] <= target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
            if (nums[mid] == target) {
                end = mid;
            }
        }

        return new int[]{start, end};
    }
}

Docker는 가상화 기술을 이용해 애플리케이션을 컨테이너에 담아 환경을 구성하는 것이 가능하게 해줍니다. Docker에서 컨테이너를 실행하기 위해서는 base image가 필요합니다. 이번 글에서는 Docker base image에 대해 알아보도록 하겠습니다.

Docker base image란 무엇인가?

Docker base image는 Docker 이미지를 빌드할 때 사용하는 기본 이미지입니다. 모든 Docker 이미지는 기본 이미지 위에 추가적인 layer를 쌓아 올려서 만들어집니다. 이때, 기본이 되는 이미지를 Docker base image라고 합니다.

Docker base image는 Docker Hub에서 다운로드 받을 수 있으며, 여러 종류의 운영체제와 프로그래밍 언어가 이미지로 제공됩니다. 또한, 직접 Dockerfile을 작성하여 필요한 기능을 추가하여 새로운 이미지를 만들 수도 있습니다.

Docker base image를 선택하는 방법

Docker base image를 선택할 때는 다음과 같은 사항을 고려해야 합니다.

1. 운영체제

Docker base image를 선택할 때는 운영체제에 대한 고려가 필요합니다. Docker Hub에서는 대표적으로 Ubuntu, CentOS, Alpine 등의 운영체제가 제공됩니다. 이 중에서 가볍고 보안성이 높은 Alpine 이미지를 선택하는 것이 일반적입니다. 하지만, 기능적인 요구사항에 따라 다른 운영체제를 선택할 수도 있습니다.

2. 이미지 크기

Docker 이미지의 크기는 중요한 요소 중 하나입니다. 이미지 크기가 크면 이미지를 다운로드하고 실행하는 데 시간이 더 걸리고, 더 많은 저장 공간이 필요합니다. 따라서 가능한 한 작은 이미지를 선택하는 것이 좋습니다.

3. 보안

Docker 이미지를 사용할 때는 보안에 대한 고민이 필요합니다. Docker Hub에서는 공식적인 이미지가 제공되며, 이를 사용하는 것이 가장 안전한 선택입니다. 또한, Dockerfile에서 사용하는 기본 이미지의 취약점에 대한 정보를 주기적으로 업데이트하고 확인하는 것이 좋습니다.

결론

Docker base image는 Docker 이미지를 빌드할 때 필요한 기본 이미지입니다. Docker Hub에서 제공하는 이미지를 사용하거나, 직접 Dockerfile을 작성하여 필요한 기능을 추가하여 새로운 이미지를 만들 수 있습니다. Docker base image를 선택할 때는 운영체제, 이미지 크기, 보안 등의 요소를 고려하여 선택해야 합니다.

 

 

'docker' 카테고리의 다른 글

Ubuntu/Debian Docker 설치  (0) 2023.03.02

빌드를 진행했는데 에러가 발생했습니다.

/usr/bin/env: ‘sh\r’: No such file or directory

 

해당 에러는 운영체제 차이점 때문에 발생하는 문제로 ,

윈도우 OS에서는 엔터, 즉 개행 문자를 CRLF(\r\n)로 사용하지만, Unix OS에서는 개행 문자를 LF(\n)로 사용되기 때문입니다.

 

gradlew 파일을 dos2unix를 설치해서 변환해주었습니다.

 

$ sudo apt-get install dos2unix
$ dos2unix gradlew

다시 빌드를 진행하면 정상적으로 빌드됩니다.

'error' 카테고리의 다른 글

gradle jib FAILURE: Build failed with an exception.  (0) 2023.01.31

https://leetcode.com/problems/array-nesting/description/

 

Array Nesting - LeetCode

Array Nesting - You are given an integer array nums of length n where nums is a permutation of the numbers in the range [0, n - 1]. You should build a set s[k] = {nums[k], nums[nums[k]], nums[nums[nums[k]]], ... } subjected to the following rule: * The fir

leetcode.com

 

 

public int arrayNesting(int[] nums) {
        // 방문했는지 체크하는 임시배열 -1:방문 / 0:방문안함
        int[] tmp = new int[nums.length];
        int res = 0;
        
        for (int i = 0; i < nums.length; i++) {
            //방문한 원소면 스킵하기
            if (tmp[i] == -1) continue;
            
            int cnt = 1;    //방문한 원소 갯수 저장하는 변수
            tmp[i] = -1;
            int next = nums[i]; //다음 방문할 인덱스

            while (tmp[next] == 0) {
                tmp[next] = -1;
                cnt++;
                next = nums[next];
            }

            res = Math.max(res, cnt);
        }

        return res;
    }

https://leetcode.com/problems/max-consecutive-ones-iii/description/

 

Max Consecutive Ones III - LeetCode

Max Consecutive Ones III - Given a binary array nums and an integer k, return the maximum number of consecutive 1's in the array if you can flip at most k 0's.   Example 1: Input: nums = [1,1,1,0,0,0,1,1,1,1,0], k = 2 Output: 6 Explanation: [1,1,1,0,0,1,1

leetcode.com

 

 

풀이

1. r값이 0인지 체크해서 k값 조정

2. k값이 0보다 작으면 l이동

  2-1 > l값이 0인지 체크해서 k값 조정

  2-2 > l값 이동

3. 가장 긴 길이 저장 

public static int longestOnes(int[] nums, int k) {
        int left = 0;
        int right;
        int res = 0;

        //right 움직이기
        for (right = 0; right < nums.length; right++) {
            //rigth 값이 0이면 k--
            if (nums[right] == 0) {
                k--;
            }

            //k 값이 음수면 left 움직이기
            if (k < 0) {
                if (nums[left] == 0) k++;
                left++;
            }

            //가장 긴값 설정
            if (k >= 0)
                res = Math.max(res, right - left + 1);

        }
        return res;
    }
 What went wrong:
Execution failed for task ':jib'.
> com.google.cloud.tools.jib.plugins.common.BuildStepsExecutionException: Build image failed, perhaps you should make sure your credentials for '<ecr repository 주소>' are set up correctly. See https://github.com/GoogleContainerTools/jib/blob/master/docs/faq.md#what-should-i-do-when-the-registry-responds-with-unauthorized for help

ecr repository 생성만하고 리눅스 서버에 로그인을 안해놨었다....!

 

 

해결

생성된 repositroy 선택하고 "푸시명령보기" 로 aws ecr repository 로그인 명령어를 복사해서 인증한다.

 

빌드 성공

 

ecr repository에도 이미지 생성이 된걸 확인했다. 

 

 

 


삽질의 흔적들 

1차 시도 실패

.docker 에 있는 config.json 파일 수정해주기

credsStore > credStore

여전히 fail

참고 

https://honsal.blogspot.com/2020/11/docker-docker-for-desktop-on-wsl-2.html

 

[Docker] Docker for Desktop on WSL 2 사용 도중 docker-credential-desktop.exe not installed... 에러가 발생한 경우

IT 관련 자잘한 팁, 약간의 게임 플레이 영상, 그리고 일상이 적힌 블로그입니다.

honsal.blogspot.com

 

2차 시도 실패 

docker desktop 종료하고 다시 시도하기 > 그래도 안됌 ㅠㅠ

참고

https://gre-eny.tistory.com/341

 

[GCP] Failed to execute goal com.google.cloud.tools:jib-maven-plugin:2.8.0:build (default-cli) on project

도커 이미지 빌드 시 오류 SpringBoot 프로젝트로 도커 이미지를 빌드하는 도중 다음과 같은 오류를 만났다. [ERROR] Failed to execute goal com.google.cloud.tools:jib-maven-plugin:2.8.0:build (default-cli) on project book: Bu

gre-eny.tistory.com

 

'error' 카테고리의 다른 글

/usr/bin/env: ‘sh\r’: No such file or directory  (0) 2023.02.06

Blob Stores에서 AWS S3 Bucket 생성 및 설정 

 

로그인 후 상단 톱니바퀴 아이콘 > Reopsitories > Blob Stores > 오른쪽 상단 create Blob Store 

 

 

타입은 두가지가 있는데 File타입으로 만들면 로컬에 파일등을 저장하고 관리할 수 있도록 만들 수 있습니다. 여기서의 로컬은 렉서스 서버에 대한 로컬입니다.

우리는 s3버킷을 생성하고 오브젝트 파일들을 s3버킷에 저장하도록 설정하고 blob store을 s3에 연동된 상태로 만들고자 합니다. 

> s3선택

 

 

region은 서울 리전을 사용하기 때문에 ap-northeast-2를 선택했습니다.

prefix는 해당 s3버킷 내에서 사용될 디렉토리 이름인데 test라는 이름의 디렉토리를 만듭니다.

Expiration Days는 s3버킷에 저장되어있는 파일을 넥서스에서 삭제하면, 넥서스에서는 해당 파일의 대한 정보가 삭제되더라도 s3버킷에서는 설정한 날짜 뒤에 삭제가 됩니다. 

Authentication (Optional)의 Access Key ID와 Secret Access Key를 입력한 후 save 버튼을 누릅니다. 

 

 

버킷명은 이미 있는 이름이어서 따로 수정했습니다.

 

save를 누르면 nexus에서도 생성이 되고

 

제 aws s3에서도 생성이 되었습니다. 

 

 

https://fastcampus.co.kr/dev_online_devopskit

 

DevOps 마스터 Kit with Linux, Kubernetes, Docker | 패스트캠퍼스

0부터 시작하는 DevOps의 모든 것! DevOps 엔지니어/SRE가 되기 위한 Linux 기초부터 Docker, Kubernetes의 활용과 이직을 위한 데브옵스 인터뷰 준비까지 이 강의 하나로 빠짐없이 학습해 보세요.

fastcampus.co.kr

 

https://school.programmers.co.kr/learn/courses/30/lessons/132265

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

import java.util.*;

class Solution {
     public static int solution(int[] topping) {
        List<Integer> list1 = new ArrayList<>();
        List<Integer> list2 = new ArrayList<>();
        int res = 0;
        int[] reverseTopping = new int[topping.length];
        for (int i = 0; i < topping.length; i++) {
            reverseTopping[topping.length - 1 - i] = topping[i];
        }

        //list를 채우는 메서드
        fillList(list1, topping);
        fillList(list2, reverseTopping);
        Collections.reverse(list2);

        //토핑 갯수가 동일한 구간 구하기
        for (int i = 0; i < list1.size() - 1; i++) {
            if (list1.get(i).equals(list2.get(i + 1))) res++;
        }

        return res;
    }

    static void fillList(List<Integer> list, int[] topping) {
        Set<Integer> set = new HashSet<>();
        int cnt = 0;

        for (int j : topping) {
            if (!set.contains(j)) {
                set.add(j);
                list.add(++cnt);
            } else {
                list.add(cnt);
            }
        }
    }
}

 

원래 값 비교 부분에서 == 을 이용해서 답이 안나왔다.

if (list1.get(i) == list2.get(i + 1)) res++;

 

Boxed primitive 또는 Wrapper class(Integer) 끼리 비교 하는 경우, 

== 연산자 각 객체의 주소 값 비교 하게 된다. 값끼리의 비교는 equal 메소드를 사용해야한다.

if (list1.get(i).equals(list2.get(i + 1))) res++;

 

 

참고

https://marobiana.tistory.com/130

 

Java의 Integer, int 숫자 비교의 주의사항

예전에 프로그램에 버그가 있었고 원인을 한참을 못찾은적이 있었다.숫자 비교하다 생긴 문제였고, 무심코 코딩하다 틀리고 삽질할 수 있는 부분이라 블로그에 남겨본다.ㅎㅎ 아래는 숫자를 저

marobiana.tistory.com

 

icacls.exe <key이름>.pem /reset


icacls.exe <key이름>.pem /grant:r "$($env:username):(r)"


icacls.exe <key이름>.pem /inheritance:r

순서대로 하면 된다. 

 

참고

https://youtu.be/P1erVo5X3Bs

 

https://leetcode.com/problems/jump-game-ii/description/

 

Jump Game II - LeetCode

Jump Game II - You are given a 0-indexed array of integers nums of length n. You are initially positioned at nums[0]. Each element nums[i] represents the maximum length of a forward jump from index i. In other words, if you are at nums[i], you can jump to

leetcode.com

 

문제

nums[i]의 값만큼 인덱스를 점프해서 마지막 인덱스까지 도달하는 최소한의 점프 값을 구해야 한다.

 

tmp 배열을 하나 만들어서 배열의 인덱스 i 까지 올수 있는 최소한의 점프 수를 저장한다.

배열에 이미 값이 있으면 그 값이 최소값이므로, 이미 있는 값이 0 일때만 tmp[출발한 인덱스]의 값에 +1 해준다.

 

코드

 

package LeetCode;

public class L45 {
    public int jump(int[] nums) {
        int[] tmp = new int[nums.length];

		//tmp 배열 만들기
        for (int i = 0; i < nums.length; i++) {
        	// 인덱스값이 배열의 길이를 넘지 않게 해준다.
            for (int j = 1; j < nums[i] + 1 && (i + j) < nums.length; j++) {
            	// 값이 0일때만 새로운 값 지정하기
                if (tmp[i + j] == 0) tmp[i + j] = tmp[i] + 1;
            }
        }

        return tmp[nums.length - 1];
    }
}

https://leetcode.com/problems/find-peak-element/description/

 

Find Peak Element - LeetCode

Find Peak Element - A peak element is an element that is strictly greater than its neighbors. Given a 0-indexed integer array nums, find a peak element, and return its index. If the array contains multiple peaks, return the index to any of the peaks. You m

leetcode.com

 

문제

peek 은 양 옆의 수보다 큰 수 

peek을 찾는 문제 

배열의 처음-1 과 마지막+1 자리는 가장 작은 수 되어 있어서 처음이나 마지막 원소가 그 전 원소보다 크면 peek이다

 

you must write an algorithm that runs in O(log n) time.

> 이진 탐색으로 풀어라

 

 

코드 

 

public class L162 {
    public int findPeakElement(int[] nums) {
        int left = 0;
        int right = nums.length - 1;

        while (left < right) {
            int mid = (left + right) / 2;
            if (nums[mid] < nums[mid + 1]) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }

        return left;
    }
}

Kubernetes 쿠버네티스 기능

자동화된 롤아웃과 롤백 지원

  • 애플리케이션 또는 애플리케이션 설정 변경시 배포 기능 지원, 장애 시 롤백 지원

 

서비스 디스커버리와 로드 밸런싱

  • k8s 설계상 파드에는 모두 고유한 ip가 부여되고, 포트를 바꿔가면서 파드에 접근할 필요가 없게 되는 장점이 있습니다.
  • 파드 집합에 대한 단일 DNS명을 부여합니다. 
  • 기본적으로 인터널 DNS가 구성되고 그 다음에 로드밸런싱이 수행됩니다.
  • 인터널 DNS가 구성되기 때문에 별도의 DNS구성 없이 도메인 이름 기반의 서비스 접근이 가능해집니다.

 

 

시크릿과 구성 관리

  • 시크릿과 애플리케이션 구성을 안전하게 배포하고 업데이트 하는 기능을 지원하기 때문에 더이상 비밀번호 하드코딩을 할 필요가 없습니다. 
  • 시크릿 관리 기능을 이용해서 암호한 형태로 패스워드나 민감한 정보들을 저장 할 수 있습니다.

 

 

자동 빈 패킹 (bin packing)

  • 리소스 요구 사항과 기타 제약 조건에 따라 컨테이너를 자동으로 배치 가능하다. 

 

자가 치유

오류가 발생한 컨테이너를 재시작하고, 노드가 죽었을 때 컨테이너를 교체하기 위해 다시 스케줄하고, 사용자 정의 상태 체크에 응답하지 않는 컨테이너를 제거하며, 서비스를 제공할 준비가 될 때까지 클라이언트에 해당 컨테이너를 알리지 않습니다.

 

 

배치 실행

  • 쿠버네티스는 서비스 외에도 배치(batch)와 CI 워크로드를 관리할 수 있으며, 원하는 경우 실패한 컨테이너를 교체할 수 있습니다.

 

Horizontal 스케일링

  • 간단한 명령어나 UI를 통해서 또는 CPU 사용량에 따라 자동으로 애플리케이션의 스케일을 업 또는 다운합니다.

 

 

확장성을 고려하여 설계됨

  • 쿠버네티스 업스트림 소스 코드 수정 없이 쿠버네티스 클러스터에 기능을 추가할 수 있습니다.

 

 

참고

https://kubernetes.io/ko/

 

운영 수준의 컨테이너 오케스트레이션

운영 수준의 컨테이너 오케스트레이션

kubernetes.io

https://fastcampus.co.kr/dev_online_devopskit

 

DevOps 마스터 Kit with Linux, Kubernetes, Docker | 패스트캠퍼스

0부터 시작하는 DevOps의 모든 것! DevOps 엔지니어/SRE가 되기 위한 Linux 기초부터 Docker, Kubernetes의 활용과 이직을 위한 데브옵스 인터뷰 준비까지 이 강의 하나로 빠짐없이 학습해 보세요.

fastcampus.co.kr

 

'k8s' 카테고리의 다른 글

컨테이너 오케스트레이션 (Container Orchestration) 필요성  (0) 2023.01.17

컨테이너 오케스트레이션의 필요성

 

서비스 초기 / 개발 단계에서는 컨테이너 오케스트레이션이 필요가 없을 수 있습니다. 

  • 직접 메뉴얼한 관리가 가능
  • 관리할 서비스 개수와 서버 개수가 적기때문에 매뉴얼한 방식으로 프로비저닝과 배포를 하면서 진행 가능.
  • 도커 명령을 직접 실행해가면서 서비스를 관리.

 

서비스가 성장하면 앱을 관리할 도구가 필요해 집니다.

  • 여러 앱을 여러개의 서버에 배포를 해야 되는데 복잡도가 높아져 매뉴얼한 관리가 불가능하여 앱을 관리할 도구가 필요해짐.  >  이때 컨테이너 오케스트레이션을 활용.
  • 늘어나는 앱을 늘어나는 서버에 효율적으로 배치해 주기 위해 중간에 컨테이너 오케스트레이션이 들어가짐. app을 자동으로 배포해주고 스케일링 해주고 관리해줌.
  • app구동에 필요한 스토리지, 네트워킹, 보안과 같은 서비스를 간편하게 이용할 수 있도록 구성이 가능해짐.

 

컨테이너 오케스트레이션 도구로는 대부분 Kubernetes 사용

 

 

 

 

https://fastcampus.co.kr/dev_online_devopskit

 

DevOps 마스터 Kit with Linux, Kubernetes, Docker | 패스트캠퍼스

0부터 시작하는 DevOps의 모든 것! DevOps 엔지니어/SRE가 되기 위한 Linux 기초부터 Docker, Kubernetes의 활용과 이직을 위한 데브옵스 인터뷰 준비까지 이 강의 하나로 빠짐없이 학습해 보세요.

fastcampus.co.kr

 

'k8s' 카테고리의 다른 글

Kubernetes 쿠버네티스 기능  (0) 2023.01.17

컨테이너를 구성하는 3가지 주요 리눅스 기술

  • Control groups (cgroups)
  • Namespaces
  • Union mount filesystem

 

Namespace

  • 프로세스 별로 커널 자원을 분할(격리)하는 기능
  • 격리하는 자원 
    • Process ID (pid)
    • Network (net)
    • Filesystem/mount (mnt)
    • Inter-oric comms (ipc)
    • UTS (UTS)
    • User (user)

 

 

cgroups / namespaces 비교

cgroup

how much you can use를 제한 > 얼마나 많은 리소스를 사용할 수 있는지를 제한.

cpu, memory, network, storage I/O 에 대해서 프로세스가 쓸 수 있는 사용량을 제한합니다.

 

namespace

what you can see를 제한 > 해당 프로세스가 볼 수 있는 범위를 제한.

프로세스 자신이 파일 시스템이 볼 수 있는 범위를 제한할 수도 있고, 사용자 정보를 제한할 수도 있습니다. 

 

 

cgroup 과 namespace 두가지를 합쳐서 리눅스 컨테이너의 근간이 됩니다. 

각 자원이 격리된 환경에 있고, 그 격리된 환경에서 각각의 자원들을 얼마나 쓸지 제안을 받는것이 컨테이너 기술의 메인입니다. 

 

namespace 종류

  • PID 네임스페이스 - Process ID .정보를 격리합니다. 네임스페이스 외의 다른 프로세스에서 접근 불가능.
  • Network 네임스페이스 - 네트워크 리소스를 격리및 가상 네트워크 장치를 할당
  • User 네임스페이스 - 프로세스별로 UID, GID 정보를 격리
  • Mount 네임스페이스 -  프로세스별로 마운트 되는 파일 시스템을 격리.
  • IPC 네임스페이스 -  inter-process communication을 격리. 다른 프로세스의 접근이나 제어를 방지.
  • UTS  네임 스페이스 - 호스트명인 도메인명을 격리

 

https://fastcampus.co.kr/dev_online_devopskit

 

DevOps 마스터 Kit with Linux, Kubernetes, Docker | 패스트캠퍼스

0부터 시작하는 DevOps의 모든 것! DevOps 엔지니어/SRE가 되기 위한 Linux 기초부터 Docker, Kubernetes의 활용과 이직을 위한 데브옵스 인터뷰 준비까지 이 강의 하나로 빠짐없이 학습해 보세요.

fastcampus.co.kr

 

'linux' 카테고리의 다른 글

[Linux] cgroup으로 CPU 사용 제한하기  (0) 2023.01.14
[Linux] cgroup  (0) 2023.01.12

상황 만들기

stress tool로 cpu로드 100프로 생성하기 

# CPU stress 테스트 툴 설치
sudo apt install -y stress

 

cgroup 속성 변경하기

cgroup과 같은 속성은 실제로 파일은 아니지만 디렉토리 형태로 해서 속성이 들어가있고 echo 로 값을 써가면서 설정들을 변경할 수 있습니다. 

 

test용 cgroup 생성

mkdir utils 로 만들고 해당 그룹에 들어가 보면 컨트롤 제어에 필요한 cpu와 관련된 각종 값들이 세팅 되어있습니다. 

 

cpu 사용량 10% 제한

해당 값을 10%로 제한하려면 cpu.cfs_quota_us 값과 cpu.cfs_period_us 값을 세팅하면 됩니다. 둘다 microsecond 단위.

자식 프로세스는 해당 컨트롤 그룹의 부모 컨트롤 그룹의 상속을 받기 때문에 다른 쉘로 이동하면 안됩니다. 

# cfs quota 설정
echo 10000 > cpu.cfs_quota_us

 

tasks 등록하기

echo $$ > tasks

 

stress 명령 실행하기

# stress test 실행
stress -c 1

cpu가 10%로 제한되었습니다.

 

https://fastcampus.co.kr/dev_online_devopskit

 

DevOps 마스터 Kit with Linux, Kubernetes, Docker | 패스트캠퍼스

0부터 시작하는 DevOps의 모든 것! DevOps 엔지니어/SRE가 되기 위한 Linux 기초부터 Docker, Kubernetes의 활용과 이직을 위한 데브옵스 인터뷰 준비까지 이 강의 하나로 빠짐없이 학습해 보세요.

fastcampus.co.kr

 

'linux' 카테고리의 다른 글

[Linux] namespace  (0) 2023.01.17
[Linux] cgroup  (0) 2023.01.12

https://leetcode.com/problems/remove-all-occurrences-of-a-substring/

 

Remove All Occurrences of a Substring - LeetCode

Remove All Occurrences of a Substring - Given two strings s and part, perform the following operation on s until all occurrences of the substring part are removed: * Find the leftmost occurrence of the substring part and remove it from s. Return s after re

leetcode.com

 

풀이

StringBuilder 에 indexOf 메서드를 쓰면 part가 포함되어있는 idx를 알려준다. 없으면 -1 리턴.

 -1 이 나올때까지 (포함되어있지 않을때까지) 반복문을 돌리면서 포함되어있으면 delete 해준다.

 

 

public static String removeOccurrences(String s, String part) {
    StringBuilder sb = new StringBuilder(s);

    while (sb.indexOf(part) != -1) {
        sb.delete(sb.indexOf(part), sb.indexOf(part) + part.length());
    }
    return sb.toString();
}

 

https://leetcode.com/problems/compare-version-numbers/description/

 

Compare Version Numbers - LeetCode

Compare Version Numbers - Given two version numbers, version1 and version2, compare them. Version numbers consist of one or more revisions joined by a dot '.'. Each revision consists of digits and may contain leading zeros. Every revision contains at l

leetcode.com

버전2개를 비교하는 문제 

 

풀이

version 2개를 "." 를 기준으로 split하고

길이를 맞춰서 ArrayList에 넣어줬다. 모자른 부분은 0으로 채워둠.

ArrayList 두개 비교 

 
class Solution {
     public int compareVersion(String version1, String version2) {

        // . 을 기준으로 split
        String[] v1 = version1.split("\\.");
        String[] v2 = version2.split("\\.");
        int maxLength = Math.max(v1.length, v2.length);

        // 0 을 채워 size 동일한 ArrayList 만들기
        List<String> arr1 = getArr(v1, maxLength);
        List<String> arr2 = getArr(v2, maxLength);

        // 크기 비교
        for (int i = 0; i < maxLength; i++) {
            if (Integer.parseInt(arr1.get(i)) > Integer.parseInt(arr2.get(i))) return 1;
            else if (Integer.parseInt(arr1.get(i)) < Integer.parseInt(arr2.get(i))) return -1;
        }

	// 버전이 동일하면 0
        return 0;

    }

    ArrayList<String> getArr(String[] str, int maxLength) {
        ArrayList<String> arr = new ArrayList<>(Arrays.asList(str));

        while (arr.size() != maxLength) {
            arr.add("0");
        }
        return arr;
    }
}

 

https://leetcode.com/problems/ransom-note/description/

 

Ransom Note - LeetCode

Ransom Note - Given two strings ransomNote and magazine, return true if ransomNote can be constructed by using the letters from magazine and false otherwise. Each letter in magazine can only be used once in ransomNote.   Example 1: Input: ransomNote = "a"

leetcode.com

 

문제

문제에서 2개의 문자열(ransomNote, magazine)이 주어진다.
magazine을 구성하는 문자를 이용하여 ransomNote와 동일한 문자열을 만들 수 있는냐가 문제의 핵심이다.
canConstruct("aab", "baa"); -> true

ransomNote and magazine consist of lowercase English letters.

소문자로만 이루어져서 길이 26의 int배열을 만들고 magazine의 개수를 넣어준다.

배열과 ransomNote를 비교하여 T/F 리턴

 

public static boolean canConstruct(String ransomNote, String magazine) {

    // 소문자 배열을 만들어서 magzine 넣는다.
    int[] mag = new int[26];
    for (char m : magazine.toCharArray()) {
        int idx = m - 97;
        mag[idx]++;
    }

    // ransomNote 돌려가면서 배열에 있는지 확인한다.
    for (char r : ransomNote.toCharArray()) {
        int idx = r - 97;
        if (mag[idx] == 0) return false;
        mag[idx]--;
    }

    // for문을 다 돌았으면 true 리턴한다.
    return true;
}

시간복잡도 : O(n)

 

+ Recent posts