블로그

Depth

인프런 워밍업 클럽 스터디 4기 - CS 전공지식 > 1주차 발자국

 ◼만들면서 쉽게 배우는 컴퓨터 구조Section1) 컴퓨터 구조 개요컴퓨터는 트랜지스터라는 반도체 소자로 만들어지고, 여러 트랜지스터로 NAND 게이트를 만들며, 이로부터 컴퓨터가 구성된다. 프로그램의 동작방식 (2가지)컴파일러전체 코드를 미리 번역해 실행 속도가 빠름컴파일 시 문법 오류 사전 발견 가능인터프리터한 줄씩 번역하며 실행, 실행 중 문법 오류 가능실행 속도는 컴파일러보다 느림 Section2) 컴퓨터 구성 요소CPU컴퓨터의 두뇌 역할을 하는 장치로, 산술연산장치(ALU), 제어장치 등으로 구성된다. 메모리RAM, ROM, 캐시 메모리 등이 있다. 주변 장치입력 장치 (키보드, 마우스 등), 출력 장치 (모니터, 프린터 등) 등이 있다. 8비트, 32비트, 64비트 컴퓨터가 표현할수 있는 데이터 차이8비트: 2^8 = 256개32비트: 약 42억개 (RAM 4GB 한계)64비트: 약 18경개 (RAM 한계없음, 거의 무한대)  Section3) 불 대수불 대수의 등장클로드 섀넌이 0과 1 (false, true)만으로 모든 논리 연산과 계이 가능함을 발견 주요 불 연산NOT: 입력의 반대값 출력AND: 둘 다 1일 때만 1 출력OR: 둘 중 하나 이상 1이면 1 출력NAND: AND의 결과를 반전NOR: OR의 결과를 반전XOR: 입력이 서로 다를 때 1 출력 (입력개수 2개일때), 1의 개수가 홀수이면 1, 아니면 0 (입력개수가 3개이상일때) 불 연산 우선순위 : NOT -> AND -> OR 불 대수의 성질과 법칙항등원 법칙, 교환법칙, 분배법칙, 동일법칙, 이중부정법칙, 흡수법칙, 드모르간 법칙 등이 있다 불 연산을 바탕으로 진리표 작성 가능방정식 -> 진리표 -> 논리회로로 변환 Section4) 비트10진법, 2진법, 16진법10진법은 0~9까지 10개의 숫자 사용2진법은 0과 1 두 가지 숫자만 사용16진법은 0~9, A~F(10~15)를 사용 바이트 저장 순서 방식리틀 엔디안: LSB(Least Significant Byte, 가장 낮은 자리 바이트)를 낮은 주소에 저장빅 엔디안: MSB(Most Significant Byte, 가장 높은 자리 바이트)를 낮은 주소에 저장  오버플로우표현할 수 있는 비트 수를 초과하는 계산 결과 발생 시 결과가 제대로 저장되지 못하는 현상 음수 표현MSB(Most Significant Bit, 최상위 비트)가 0이면 양수, 1이면 음수로 해석 2의 보수법음수를 표현하는 방법음수 = 1의 보수(모든 비트를 반전) + 1  Section5) 컴퓨터의 기초가 되는 하드웨어 만들기 Logisim-evolution 같은 시뮬레이터를 사용해 논리 회로를 직접 설계·실험 가능,설치하려면 JDK 필요, GitHub에서 최신 버전 다운로드 가 기본 논리 게이트NAND 게이트, NOT 게이트, AND 게이트, OR 게이트, XOR 게이트  Mission1)https://inf.run/wLEBH  ◼그림으로 쉽개 배우는 자료구조와 알고리즘Section1) 개요선형 자료구조 : 배열, 연결 리스트, 스택, 큐비선형 자료구조: 트리, 그래프, 힙 P-NP 문제 개념 이해빅오 표기법 (시간 복잡도)결정 문제와 최적화 문제P 문제 (Polynomial time 문제)NP 문제 (Nondeterministic Polynomial time 문제)NP-hard 문제P vs NP 문제   Section2) 트리와 이진트리트리노드(Node)와 간선(Edge)으로 구성된 계층적 자료구조 트리의 구성요소노드, 간선, 루트 노드, 자식 노드, 형제 노드, 리프 노드, 레벨, 높이 이진트리각 노드가 최대 2개의 자식 노드를 갖는 트리포화이진트리와 완전이진트리도 존  Section3) 이진 탐색트리각 노드가 값의 기준점 역할을 하며, 찾고자 하는 값이 현재 노드의 값보다 크면 오른쪽 서브트리를, 작으면 왼쪽 서브트리를 탐색하는 구조  Section4) AVL 트리높이 균형을 유지하는 이진 탐색 트리로, 각 노드의 왼쪽과 오른쪽 서브트리 높이 차이(균형 인수)가 최대 1 이내여야 한다.이 균형 조건을 벗어나면 회전 연산을 통해 트리의 균형을 맞춰 탐색, 삽입, 삭제 수행  🗒회고컴퓨터 구조와 자료구조(알고리즘) 강의를 동시에 완벽히 이해하기엔 시간적으로 무리가 있을 것 같아 컴퓨터 구조 심화 학습에 좀 더 집중해볼 예정이다.강의에서 Logisim-evolution을 활용해 AND, OR, NOT, XOR 등의 게이트를 직접 만들어보는 과정이 인상 깊었다. 회로를 하나하나를 쌓아가며 구조를 이해하는게 재미가 있어 몰입이 잘 되었다.강의를 완강할 즈음에는, 정말 작은 컴퓨터 하나쯤은 스스로 만들어 낼 수 있을 것 같은 기대감이 든다 🏷출처https://inf.run/y1hhdhttps://inf.run/7mNZ2https://inf.run/uHJ1a  

cs발자국4기

승현

[인프런 워밍업 클럽 4기] 4주차 발자국

이번주 학습 내용Helm vs Kustomize의 차이를 이어서 학습했다.Helm은 Chart로 환경별 설정이 가능하여 관리가 용이한 점kustomize는 기존 설정을 overlay로 A+B를 결합하는 형식이어서 조금 더 직관적인 느낌만약 처음 선택을 해야 한다면 서비스의 갯수에 따라서 Helm과 kustomize에 대해서 고민할 것 같다. 관리해야 하는 서비스가 많을 수록 kustomize가 주는 장점이 오히려 관리 포인트가 되어 단점이 될 수 있다고 생각이 들고, Helm이 주는 장점이 더 두각되는 것 같다.ArgoCD의 동작방식에 대해서는 아직 학습이 덜되어서 다시 한번 학습이 필요할 것 같다.회고마지막 발자국이라는 것이 믿기지가 않는다, 직장, 학업으로 매주 힘들었지만 같이 해준 팀원 분들에게 너무 감사하고, 좋은 분들을 만날 수 있어서 감사했다. 또한 중간점검을 통해 강사님이 강의에 투자하는 시간을 알게되었는데 높은 품질의 강의는 확실히 다른다는 것을 알게 되었고, 양질의 내용을 제공해주기 위해 준비해주신 강사님께도 감사하다.스터디는 이번주에 종료되지만 여기서 멈추는 것이 아니라 내것으로 만들기 위해 복습하는 시간을 가지려고 한다.💪💪

데브옵스 · 인프라워밍업클럽인프런스터디4기데브옵스Devops

suover

인프런 워밍업 클럽 스터디 4기 - CS 전공지식 3주차 발자국

그림으로 쉽게 배우는 자료구조와 알고리즘 (심화편)만들면서 쉽게 배우는 컴퓨터 구조강의와 함께한 인프런 워밍업 클럽 스터디 4기 - CS 전공지식 (자료구조, 알고리즘, 컴퓨터구조)3주차 발자국 입니다.학습 내용 요약자료구조·알고리즘트라이(Trie)와 자동완성개념: 문자열 집합을 효율적으로 저장·탐색하기 위해, 각 노드가 문자 하나를 나타내며 공통 접두사를 공유하는 트리 구조입니다.학습: 삽입 및 탐색 로직의 흐름을 개념적으로 이해하였습니다.인사이트: 삽입·탐색이 문자열 길이에 비례하기 때문에, 대규모 단어 집합에서 접두사 검색이 빠르지만 메모리 사용이 커질 수 있음을 감안해야 함을 체감했습니다.그래프개념: 그래프는 정점과 간선으로 관계를 표현하는 자료구조로, 방향 여부나 가중치 유무에 따라 다르게 다루며 인접 리스트와 인접 행렬 방식으로 표현할 수 있습니다.학습: 간단한 예제 그래프를 구성해 보고, DFS는 재귀나 스택으로 깊이 우선 탐색하며 방문 체크로 순환을 막고, BFS는 큐로 레벨별 탐색해 비가중치 최단 경로에 유리함을 코드로 확인했습니다.인사이트: DFS는 깊이 탐색이 필요할 때, BFS는 단계별 탐색이 필요할 때 유용하며, 그래프 표현 방식도 데이터 크기와 목적에 맞춰 결정해야 한다는 점을 깨달았습니다.가중 그래프와 다익스트라 알고리즘개념: 가중치가 있는 그래프에서 시작 정점으로부터 다른 정점까지 최단 경로를 찾는 문제입니다.다익스트라 알고리즘원리: 현재까지 알려진 최단 거리 후보 정점을 선택해 인접 간선을 완화(relaxation)하며 거리 배열을 갱신합니다.인사이트: 그래프가 커질수록 일반 방식은 느려지고, 우선순위 큐(힙)를 쓰면 더 빠르게 최단 경로를 구할 수 있음을 느꼈습니다.컴퓨터 구조제어 장치 없는 컴퓨터 & 조립CPU 주요 구성 요소(CPU 레지스터, ALU, 프로그램 카운터, 스텝 카운터)를 복습하고, 실습을 통해 신호 흐름을 이해했습니다.CPU 만들기: 제어 장치(Control Unit)명령어 처리 흐름: 명령어 인출(fetch), 디코딩, 실행(execute) 단계의 제어 신호 타이밍을 확인했습니다.주요 명령어: NOP, LOADA, ADD, SUB, STOREA, LOADI, JMP/JMPC/JMPZ, OUT, HLT 등의 제어 신호와 ALU·레지스터·메모리 동작 방식을 이해했습니다. 제어 장치 조립: Logisim에서 각 단계별 신호를 조합해 제어 유닛을 완성하고, 시뮬레이션으로 신호 흐름과 분기 동작을 확인했습니다.미션🎯 자료구조·알고리즘 미션3: 허프만 코딩 구현목표주어진 문자열에 대해 HuffmanCoding.compress(str)를 호출했을 때, [ [문자, 코드], … ]형태의 배열을 출력하도록 허프만 코딩을 구현합니다.class Node { constructor(char = null, freq = 0, left = null, right = null) { this.char = char; this.freq = freq; this.left = left; this.right = right; } } class HuffmanCoding { compress(str) { if (!str) return []; // 빈도 계산 const freqMap = new Map(); for (const ch of str) { freqMap.set(ch, (freqMap.get(ch) || 0) + 1); } // 초기 노드 리스트 생성 const nodes = []; for (const [ch, f] of freqMap.entries()) { nodes.push(new Node(ch, f)); } // 허프만 트리 구성 while (nodes.length > 1) { nodes.sort((a, b) => a.freq - b.freq); const a = nodes.shift(); const b = nodes.shift(); nodes.push(new Node(null, a.freq + b.freq, a, b)); } const root = nodes[0]; // 코드 생성 const codes = {}; const build = (node, prefix) => { if (node.char !== null) { codes[node.char] = prefix || "0"; } else { build(node.left, prefix + "0"); build(node.right, prefix + "1"); } }; build(root, ""); // [문자, 코드] 쌍 배열 반환 return Object.entries(codes); } } const huffmanCoding = new HuffmanCoding(); const str = "Lorem ipsum dolor sit amet consectetur adipiscing elit. " + "Consectetur adipiscing elit quisque faucibus ex sapien vitae. " + "Ex sapien vitae pellentesque sem placerat in id. " + "Placerat in id cursus mi pretium tellus duis. " + "Pretium tellus duis convallis tempus leo eu aenean."; const result = huffmanCoding.compress(str); console.log(result);흐름 및 구현 요약빈도 계산문자열을 순회해 Map 또는 객체에 문자별 등장 빈도를 집계했습니다.코드 생성재귀 탐색으로 왼쪽 자식은 '0', 오른쪽 자식은 '1'을 prefix에 추가하며 리프에서 코드 할당. 단일 문자 입력 시 빈 prefix에 "0" 처리 로직도 반영했습니다.검증실행 결과에서 빈도가 높은 문자는 짧은 코드, 낮은 문자는 긴 코드가 할당되는지 확인했습니다.빈도와 코드 길이 관계가 적절한지, 모든 문자가 포함되었는지, 코드끼리 충돌이 없는지 점검했습니다. // 결과 [ [ 'i', '000' ], [ 'q', '001000' ], [ 'v', '001001' ], [ 'o', '00101' ], [ 'l', '0011' ], [ 'd', '01000' ], [ 'E', '0100100' ], [ 'g', '0100101' ], [ 'x', '0100110' ], [ 'P', '0100111' ], [ 'a', '0101' ], [ 'e', '011' ], [ 'm', '10000' ], [ 'r', '10001' ], [ 'u', '1001' ], [ 't', '1010' ], [ 'p', '10110' ], [ 'L', '10111000' ], [ 'C', '10111001' ], [ 'f', '10111010' ], [ 'b', '10111011' ], [ '.', '101111' ], [ ' ', '110' ], [ 's', '1110' ], [ 'c', '11110' ], [ 'n', '11111' ] ]느낀 점허프만 코딩의 "빈도 기반 병합 → 트리 구조 → 코드 생성" 흐름을 직접 구현하며 원리 습득이 명확해졌습니다. 결과 검증 과정에서 빈도와 코드 길이 관계, 프리픽스 성질 확인 등이 중요함을 체득했습니다. 🔗 자료구조·알고리즘 미션3 블로그 링크🎯 컴퓨터 구조 미션3: STOREB 명령어와 A·B 비교 어셈블리어 구현목표STOREB 명령어(OPcode 1001)를 추가해 레지스터 B의 값을 메모리 주소에 저장하도록 구현합니다.A와 B 값을 비교해 같으면 0, A>B면 1, A<B면 2를 출력 레지스터에 내보내는 어셈블리어를 작성하고 검증합니다.구현STOREB(1001) 명령어 추가기존 STOREA 처리 경로를 참고하여 opcode 1001 분기 로직을 제어 장치에 추가했습니다.스텝 카운터가 각 단계에 진입할 때, STOREB 신호와 연관된 핀들이 의도한 타이밍에 활성화되는지 확인했습니다.A·B 비교 어셈블리어메모리에 저장된 A와 B 값을 불러와 비교하는 순서LOADA addrA → SUB addrB (A = A - B, 플래그 설정)JMPC 분기로 A≥B 처리, 아닐 경우 LOADI 2로 A<B 결과 세팅 후 출력분기한 경우 ZF 검사: ZF=1일 때 A=B(LOADI 0), ZF=0일 때 A>B(LOADI 1)이후 OUT, HLT로 마무리주소 라벨 매핑과 분기 주소 계산을 꼼꼼히 검토했습니다.Logisim에서 다양한 A·B 조합 테스트를 통해 출력 레지스터가 기대값(0/1/2)을 잘 내보내는지 확인했습니다.LOADA 14 // A = RAM[14] SUB 15 // A -= RAM[15] JMPC 5 // CF = 1 → A ≥ B일 때 5번 주소로 점프 LOADI 2 // A < B → 결과 2 JMP 9 // 결과 출력으로 점프 JMPZ 8 // ZF = 1 → A = B일 때 8번 주소로 점프 LOADI 1 // A > B → 결과 1 JMP 9 // 결과 출력으로 점프 LOADI 0 // A = B → 결과 0 OUT // 결과 출력 HLT // 프로그램 종료 0 0 0 7 // A값 3 // B값느낀 점제어 장치에 새로운 명령어를 추가할 때, 기존 신호 경로와 타이밍 흐름을 정확히 이해해야 오류를 줄일 수 있음을 확인했습니다.분기 주소 계산이 미흡하면 예상치 못한 동작이 발생하므로, 어셈블리어 작성 시 라벨 관리가 중요함을 체감했습니다. 🔗 컴퓨터 구조 미션3 블로그 링크회고잘한 점단계적 접근: 컴퓨터 구조와 알고리즘 미션을 작은 단위로 나눠 핵심 로직과 흐름을 차근차근 구현하고 검증했습니다.디버깅 습관 강화: Logisim 시뮬레이션과 코드 실행 결과를 반복 확인하며, 문제 발생 시 신호 흐름이나 분기 주소 동작을 빠르게 점검했습니다.이론·실습 병행: 트라이, 그래프, 다익스트라 개념 학습 뒤 직접 구현 연습, 제어 유닛 명령어 설계 뒤 Logisim 실습, 허프만 코딩 이론 뒤 코드 작성으로 이론과 실습을 잘 연결했습니다. 아쉬웠던 점 & 보완테스트 부족 : 테스트가 부족해 다양한 상황을 확인하지 못했습니다. 다음에는 다양한 입력과 경계값을 더 많이 시도해 보겠습니다.성능 최적화 부족: 성능 최적화 연습이 부족했습니다. 시간이 된다면 구현했던 자료구조와 알고리즘을 재작성해보고, 다양한 시도를 통해 실행 시간을 비교해 보겠습니다. 마치며이번 주차에는 Trie, 그래프, 다익스트라 학습을 진행하고, 제어 장치 명령어 확장과 허프만 코딩 구현 미션을 병행하며 이론과 실습을 모두 경험했습니다. 단계별 실습을 통해 개념이 실제 코드나 회로로 연결되는 과정을 체감했고, 디버깅과 테스트 습관을 강화할 수 있었습니다. 다음주에는 추가 알고리즘 학습을 통해 더욱 탄탄한 이해를 쌓아가겠습니다. 감사합니다!

알고리즘 · 자료구조인프런워밍업클럽스터디CS전공지식자료구조컴퓨터구조발자국회고4기

승현

[인프런 워밍업 클럽 4기] 3주차 발자국

이번주 학습 내용이번주는 Devops의 역할, 배포 방법, 쿠버네티스 패키지 매니저(Helm)에 대해서 학습했다.아무래도 개발자이다 보니, 위 그림을 인상 깊게 보았는데, 내가 경험해온 Devops 엔지니어 분들은 개발 영역은 하지 않으셨고, 개발 부분은 개발자가 맡아서 하는 R&R이 확실하게 분리된 환경에서 업무를 해왔는데, 결국 나의 능력을 높이기 위해서는 개발 + 인프라까지 다룰 수 있어야 하는 건 맞는 것 같다. ( AI가 무섭게 성장하고 있는 흐름에서는 더더욱...! )그리고 추후 PM/PL/아키텍트 역할을 맡게 되었을때도 전체적인 그림을 볼 수 있어야 하기 때문에 전문가처럼 깊게는 아니더라도 전체적인 흐름은 알고 있어야 할 것 같다. 사실 이미지를 보자마자 놀랬다🤣🤣이 많은 내용을 다 알고 있어야 한다고?! 생각했는데 강사님께서 스탭별로 진행하면 된다고 말씀주셔서 다행이었다...나는 인프라는 곧 비용이다. 라고 생각하는데, 인프라 환경에 필요한 장비 또는 클라우드 비용이 매섭기 때문이다.회사의 지갑 사정에 따라서 또는 회사의 투자 상황에 따라서 인프라 환경도 달라질 것인데, 각 재정 상황에 맞는 파이프라인을 구축하면 되는 것 같다. 배포 방식에서는 Recreate / RollingUpdate / Blue&Green / Canary 이렇게 4개의 종류를 배웠는데, 가장 좋은 건 역시 Canary인 것 같다. (서비스는 죽으면 안되니까!)다만 이것도 결국 쿠버네티스를 얼마나 다룰 수 있는지 역량에 따라서 달라질 것 같다. Canary 배포 중 가중치가 안바뀐다거나? / 배포가 실행이 안된다거나?-> 여러 상황에 대해서 수동으로 처리할 수 있게 대응이 필요할 것 같다.)또한 서비스의 특징에 따라서도 어떠한 배포 방식을 선택할지 달라질 것 같다. 무중단이 아닌 운영시간이 정해진 서비스라면?-> 꼭 Canary 배포 방식을 선택하지 않아도 될 것 같다.회고요즘 퇴근 후 저녁에 3km 러닝을 하고 있는데, 러닝을 하면서 느끼는 것이 무엇이든지 단번에 되는 것이 아닌 절대적인 시간이 필요하고, 그 시간을 인내하고 꾸준히 달리는 것이 중요한 것 같다.학습도 마찬가지라는 생각이 든다. 어떠한 지식을 단번에 학습하려고 하지 말고, 천천히 꾸준히 학습하는 것이 중요한 것 같다.저번주 발자국에 일프로님께서 댓글을 달아주셔서 얼마나 놀랬는지 모르겠다ㅎㅎㅎ 이번 스터디는 완주를 목표로 학습하고, 추후에 꼭 복습해야겠다. 항상 디스코드 스레드 보면서 힘을 얻어갑니다! 마지막 4주차까지 파이팅!💪💪

데브옵스 · 인프라Devops일프로워밍업클럽인프런4기데브옵스쿠버네티스k8s

[워밍업 클럽 4기 백엔드] 2주차 발자국

✅ 내용 정리 및 느낀점[ 테스트 코드 작성 이유 ]테스트 코드는 문서다.테스트 코드를 통해 안정적인 서비스가 가능 하고 리팩토링 시간을 단축할 수 있다.강의를 수강 후 프로젝트를 했습니다.이전에 혼자 공부할 때는 Postman을 사용 하여 일일이 테스트를 했습니다." 귀찮긴 하지만 이 정도는 할만하다" 라는 생각이였습니다.하지만 협업을 하며 서로의 코드를 수정 하는 경우가 빈번 하였습니다. 그 결과 코드를 신용할 수 없었습니다.테스트 코드를 적용해 보니 최소한의 기능을 보장할 수 있기 때문에 일일이 테스트 하지 않아도 된다는 장점이 있습니다.비록 테스트 코드를 작성 하는 시간은 걸리지만코드의 신뢰성과 유지 보수를 위해 테스트 코드는 "필수" 라고 생각 합니다. [ BDD ( Behavior Driven Development ) ]사용자 행위를 기반으로 사용자 시나리오를 구성 하여 테스트 케이스를 개발* Given - 행위를 수행하기 전 필요한 환경 * When - 실제 사용자 행위를 서술 * Then - 행위에 따른 기대 결과를 서술 ✅ [ 미션 회고 ]강의를 수강한 후 " 나도 이제 읽기 좋은 코드를 작성할 수 있다!" 라고 생각 하였지만이번 미션을 수행 하며 자만 이였음을 느꼈습니다.변수 이름 잘 짓기, 메서드 적절히 추상화 하기 강의를 수강할 때는 쉬운 레벨 같지만 실제론 해보니변수 이름 하나를 정하는 것도 많은 고민이 필요 했고 메서드도 "추상화 레벨을 어느정도로 해야 읽기 좋을까? "등을 고민 하는데 쉽지 않았습니다. 중간 점검을 통해 다른 분들의 코드를 보니 다들 비슷한 고민을 하신게 느껴져서 공감이 되었고,우빈님 피드백을 통해 많이 배웠습니다.

백엔드워밍업클럽4기

suover

인프런 워밍업 클럽 스터디 4기 - CS 전공지식 2주차 발자국

그림으로 쉽게 배우는 자료구조와 알고리즘 (심화편)만들면서 쉽게 배우는 컴퓨터 구조강의와 함께한 인프런 워밍업 클럽 스터디 4기 - CS 전공지식 (자료구조, 알고리즘, 컴퓨터구조)2주차 발자국 입니다.학습 내용 요약그림으로 쉽게 배우는 자료구조와 알고리즘 (심화편)이번 주에는 균형 이진 탐색 트리의 대표 주자인 Red-Black 트리의 삽입·삭제 개념과 실제 구현을 다뤘습니다.개념(삽입/제거) 단계에서 색상 규칙과 회전을 통해 균형을 유지하는 원리를 학습했고보조 함수(색 변경, 회전 함수), 삽입 로직, 삭제 로직을 차례로 완성하며, 각 단계마다 균형 인자가 올바르게 갱신되는지 확인했습니다.이어 우선순위 큐와 힙을 학습했습니다.힙(Heap) 의 개념과 완전 이진 트리 구조를 이해하고, 힙 삽입, 힙 제거 과정을 직접 구현해 보았습니다.이를 기반으로 미션에서 CpuScheduler 를 만들어, 실행 횟수 우선 & I/O 바운드 우선 정책을 Heap 비교 함수를 수정해 적용했으며마지막으로 힙 정렬(Heapsort) 알고리즘까지 학습했습니다.만들면서 쉽게 배우는 컴퓨터 구조지난주 불 대수·진리표·Logisim 기초를 다진 뒤, 이번 주에는MUX: 1비트 2입력부터 8비트 16입력까지 다양한 MUX 설계디코더: 3비트·4비트 디코더 설계컨트롤 버퍼(Buffer) 이해ALU: 반 가산기·전 가산기·ALU 제작메모리: SR/D/JK 래치, 플립플롭, 레지스터, RAM 구현까지 확장하며, 각 모듈을 직접 구현하고 테스트하며 신호 흐름을 검증했습니다.미션🎯 미션1. 자료구조와 알고리즘 미션: CPU 스케줄링목표프로세스의 executionCount(실행 횟수)와 cpuReturnCount(I/O 바운드 횟수)로 우선순위를 매기는 스케줄러 구현실행 횟수(executionCount)가 가장 작은 프로세스가 우선순위가 높다.실행 횟수가 같을 경우, I/O Bound 프로세스(cpuReturnCount가 큰 프로세스) 가 우선순위가 높다.구현 개요자료구조: 완전 이진 트리 기반의 Heap 활용비교 함수 재정의// CpuScheduler 생성자 내부 this.heap.isBigPriority = (first, second) => { if (first.executionCount !== second.executionCount) { // 실행 횟수가 적은 프로세스가 우선 return first.executionCount < second.executionCount; } // 실행 횟수가 같다면 I/O Bound 정도(cpuReturnCount)가 큰 쪽이 우선 return first.cpuReturnCount > second.cpuReturnCount; }; CpuScheduler 클래스import { Heap } from "../../heap/heap.mjs"; class Process { constructor(name, cpuReturnCount, executionCount) { this.name = name; this.cpuReturnCount = cpuReturnCount; this.executionCount = executionCount; } } class CpuScheduler { constructor() { this.heap = new Heap(); this.heap.isBigPriority = (first, second) => { if (first.executionCount !== second.executionCount) { return first.executionCount < second.executionCount; } return first.cpuReturnCount > second.cpuReturnCount; }; } enqueue(process) { this.heap.insert(process); } dequeue() { const node = this.heap.remove(); return node ? node.getData() : null; } } let cpuScheduler = new CpuScheduler(); cpuScheduler.enqueue(new Process("수치계산프로그램", 4, 0)); // cpu반납 4회, 실행횟수 0회 cpuScheduler.enqueue(new Process("뮤직플레이어", 11, 10)); // cpu반납 11회, 실행횟수 10회 cpuScheduler.enqueue(new Process("웹브라우저", 27, 25)); // cpu반납 27회, 실행횟수 25 cpuScheduler.enqueue(new Process("터미널1", 34, 2)); // cpu반납 34회, 실행횟수 2회 cpuScheduler.enqueue(new Process("터미널2", 93, 2)); // cpu반납 93회, 실행횟수 2회 console.log(cpuScheduler.dequeue()); // 수치계산프로그램 프로세스 출력 console.log(cpuScheduler.dequeue()); // 터미널2 프로세스 출력 console.log(cpuScheduler.dequeue()); // 터미널1 프로세스 출력 console.log(cpuScheduler.dequeue()); // 뮤직플레이어 프로세스 출력 console.log(cpuScheduler.dequeue()); // 웹브라우저 프로세스 출력테스트 결과Process { name: '수치계산프로그램', cpuReturnCount: 4, executionCount: 0 } Process { name: '터미널2', cpuReturnCount: 93, executionCount: 2 } Process { name: '터미널1', cpuReturnCount: 34, executionCount: 2 } Process { name: '뮤직플레이어', cpuReturnCount: 11, executionCount: 10 } Process { name: '웹브라우저', cpuReturnCount: 27, executionCount: 25 }O(log N) 삽입·삭제 성능으로 대규모 프로세스 관리 가능비교 함수만 바꿔 다양한 스케줄링 정책 가능🔗 자료구조·알고리즘 미션2 블로그 링크🎯 미션2. 컴퓨터 구조 미션: 터널 연결부터 32바이트 RAM까지미션 구성모든 회로 연결을 터널(Tunnel)로 대체8비트 32입력 MUX 제작10비트 입력 두 개(A, B)를 계산하는 ALU 설계32바이트 RAM 구현1) 모든 회로 연결을 터널(Tunnel)로 대체목표: Logisim의 Tunnel 컴포넌트를 사용해 복잡한 선 숨기기결과: 캔버스가 한눈에 들어오고, 라벨만으로 신호 흐름 파악 가능2) 8비트 32입력 MUX 제작목표: IN_0…IN_31 중 하나 선택하여 출력구현: Logisim 내장 32-to-1 MUX + 8비트 버스검증: SELECTION 값 변화 시 기대 출력 확인3) 10비트 입력 두 개(A, B)를 계산하는 ALU 설계목표: 덧셈(SU=0)/뺄셈(SU=1), Carry-in/Carry-out, Zero Flag구현:10개 Full Adder 체인B 입력 XOR + SU → 뺄셈 지원마지막 Adder의 Carry-out → CF, 출력 전 비트 OR·NOT → ZF검증: 다양한 A, B 조합 테스트, CF/ZF 정상 동작4) 32바이트 RAM 구현목표: 5비트 주소 + 8비트 데이터 입·출력, ENABLE_WRITE, ENABLE_OUT구현:5→32 디코더 + AND → 각 레지스터 Load읽기 MUX로 선택 출력검증: WRITE=1 시 해당 워드에 저장, OUT=1 시 올바른 데이터 읽기 🔗 컴퓨터 구조 미션2 블로그 링크회고잘한 점단계적 학습Red-Black 트리 개념 → 보조 함수 → 삽입 → 삭제까지 차근차근 구현하며 균형 유지 원리를 확실히 체득했습니다.힙 기반 스케줄러와 힙 정렬, 다양한 크기의 MUX·디코더 구현으로 자료구조·회로 설계 감각을 크게 확장했어요.모듈화 & 재사용성Heap 비교 함수만 바꿔 다양한 스케줄링 정책을 손쉽게 실험했고, Logisim 터널·버퍼 적용으로 회로 블록을 깔끔하게 재사용할 수 있었습니다.플래그·메모리 회로 반복 학습반·전 가산기, Zero/Carry Flag, 래치·플립플롭, 레지스터 파일, RAM까지 차례로 구현하며 신호 흐름과 제어 신호 이해가 깊어졌습니다.아쉬웠던 점 & 보완테스트 케이스 부족Red-Black 트리 삭제의 예외 케이스를 더 다양하게 검증하지 못했습니다.힙 스케줄러에도 executionCount·cpuReturnCount 동률 시나리오를 추가할 필요가 있습니다.시간 관리다양한 모듈 구현에 몰두하느라 후반부 학습이 빠듯했습니다. 마치며이번 주차에도 "작게 쪼개고 하나씩 검증하는" 학습 방식을 통해, 알고리즘과 회로 설계 모두에서 자신감을 많이 얻었습니다.다음 주에는 부족했던 것들을 보완해, 더 탄탄한 결과물을 만들어 보겠습니다. 감사합니다!

알고리즘 · 자료구조인프런워밍업클럽스터디CS전공지식자료구조컴퓨터구조발자국회고4기

승현

[인프런 워밍업 클럽 4기] 2주차 발자국

이번주 학습 내용이번주는 Probe, Secret, ConfigMap, PVC/PV, Deployment, Service, HPA, Cmponent 등을 배웠다.Probe는 앱의 상태를 체크할때 사용하는데, 앱의 로딩 시간에 따라서 Probe 설정을 정말 잘해주어야 하고, 외부 트래픽을 처리할지도 Probe에서 관리하기 때문에 중요도가 매우 높은 부분이라는 것을 배웠다.Secret, ConfigMap에서는 Secret이 암호화를 대신 해주는 것이 아닌 Base64 인코딩을 지원하는 것이고, ConfigMap을 통해서 앱에서 사용할 환경변수를 주입할 수 있었다.PVC/PV, Deployment, Service, HPA는 모두 중요한 포인트인 것 같은데 파일 스토리지 연동, 배포 방법에 따른 차이와 설정 방법, 내부/외부 트래픽에 대한 처리, 스케일 아웃 처리 등 운영 환경에서 적재적소에 사용하려면 해당 오브젝트들을 잘 이해하고 있어야 한다는 것을 배웠다.( 그렇지만 아직 한번에 이해가 가지는 않는 중이다. 실제로 실습하면서 컨테이너 내부에서 실행해야 되는 명령어인데, 호스트에서 진행해서 왜 안되는거지? 확인하는 시간도 적지 않게 있었다... 정말 많은 학습이 필요한 것 같다.) 이번주 미션 진행[미션2] Application 기능으로 k8s 이해 - Probe[미션3] Application 기능으로 k8s 이해 - Configmap, Secret[미션4] Application 기능으로 k8s 이해 - PV/PVC, Deployment, Service, HPA회고이번주는 미션이 3개가 있어서 정말 바빴던 것 같다... (공휴일도 2일이나 있었는데 ^^;;)정말 나만 힘든 건가? 라는 생각이 들었는데, 팀원 분들도 다들 힘들어 하시는 것 같았다. 그래도 다같이 으쌰!으쌰! 하는 분위기여서 나도 모르게 힘이 나는 것 같고, 모난 부분 없이 열정있고 긍정적인 팀원 분들을 만난 것이 너무 감사하다.아직은 쿠버네티스의 모든 것이 이해가지 않는 것이 당연하다고 생각한다.모든 내용을 한번에 다 이해한다면 누구나 상위 1%가 되었겠지만 실제로는 그렇지 않은 것 처럼 지속적으로 학습할 수 있는 습관이 중요한 것 같다.

데브옵스 · 인프라데브옵스인프런워밍업클럽4기일프로Devops발자국

kndh2914

인프런 워밍업 클럽 4기 - DevOps 2주차 발자국

[2주차 강의 수강]2주차 기간동안 k8s의 applicaition 기능으로 k8s를 이해하는 시간을 가졌다. 또한 실습시간에 k8s의 기능들을 보다 제대로 활용하기 위해 많이 활용하면서 장난감 다루듯이 마구잡이로 다뤘던 시간들을 경험하게 되었다. 미션과제도 해보고 실습을 따라해보면서 완벽하게 해보지는 못했지만 따로 복습시간을 가지면서 더욱 더 k8s를 이해하게 되었고 실무에 나갔을 때도 확실하게 다룰 수 있도록 배우는 자세를 가지게 되었다.[미션] [2번미션]링크: https://du-hyeon.notion.site/5-Application-1-Probe-20722449e85a8014a350c93b419f22ec?source=copy_link [3번미션]링크:https://du-hyeon.notion.site/6-Application-2-Configmap-Secret-20722449e85a80c3a914c3b9ae1e043b?source=copy_link [4번미션]링크: https://du-hyeon.notion.site/7-Application-PV-PVC-Deployment-Service-HPA-20822449e85a8015ad0de48924b42dbe?source=copy_link  회고: 2주차에는 미션이 3개이면서 많은 실습시간을 투자한 기간이였을뿐더러 더욱 더 손에 익히고 눈으로 많이 보게되면서 k8s의 구조와 어떠한 상황에서 기능을 써야 더 좋은 시너지가 일어나는지에 대한 시간을 가지게 되었다. 다음주부터는 3주차이고 벌써 스터디의 절반이 지났다고 한다. 또한 3주차부터는 Sprint2로 넘어가기 때문에 더더욱 설레는 마음으로 공부를 할 계획이다.

데브옵스 · 인프라k8s인프라일프로devops화이팅워밍업클럽4기

suover

인프런 워밍업 클럽 스터디 4기 - CS 전공지식 1주차 발자국

그림으로 쉽게 배우는 자료구조와 알고리즘 (심화편)만들면서 쉽게 배우는 컴퓨터 구조강의와 함께한 인프런 워밍업 클럽 스터디 4기 - CS 전공지식 (자료구조, 알고리즘, 컴퓨터구조)1주차 발자국 입니다.학습 내용 요약이번 주에는 두 가지 강의를 통해 자료구조·알고리즘과 컴퓨터 구조의 큰 틀을 살펴보며, 이론과 실습을 병행했습니다.그림으로 쉽게 배우는 자료구조와 알고리즘 (심화편)크게 트리 구조와 이진 탐색 트리(BST), 그리고 그 위에 균형을 더한 AVL 트리를 다뤘습니다.초반에는 "트리와 이진 트리 개념"으로 부모·자식 노드 간 관계를 복습했고, 이어서 BST의 삽입·검색·삭제 과정을 훑어보았습니다.마지막으로 AVL 트리 개념과 구현(보조 함수, 삽입, 삭제)을 익히며, "왜 균형 인자가 중요한지"와 "삽입/삭제 후 어떻게 회전으로 높이를 조정하는지"를 이해했습니다.만들면서 쉽게 배우는 컴퓨터 구조컴퓨터 구조 전반(블랙박스 관점, CPU·메모리·주변 장치)과 함께, 불 대수 및 논리 게이트 설계로 넘어가 간단한 하드웨어 시뮬레이션을 해보았습니다.먼저 "컴퓨터 구조를 배우는 이유"와 명령어가 메모리→CPU→다시 메모리로 흐르는 과정을 개념적으로 파악했고, CPU 내부와 메모리 계층도 간단히 살펴봤습니다.이어서 불 대수 기본 연산과 성질을 학습한 뒤, 직접 Logisim을 설치해 NAND/NOT/AND/OR/XOR 게이트를 조합해 보는 실습을 경험했습니다.또 10진수↔2진수 변환, 16진법, 빅·리틀 엔디안, 2의 보수 음수 표현 같은 비트 단위 개념을 짚으며, 디지털 회로의 밑바탕이 되는 이진 표현 방식을 정리했습니다.미션🎯 자료구조·알고리즘 미션1: GarbageCollector 클래스 구현목표: AVL 트리로 빈 메모리 블록을 관리해, 요청 크기와 정확히 일치하는 블록이나 그보다 큰 값 중 최소값을 찾아 반환·삭제하도록 한다.코드import { AVLTree } from "../../avlTree/avlTree.mjs"; class GabageCollector { constructor() { this.avlTree = new AVLTree(); } // 빈 메모리 블록 삽입 insertFreeMemory(size) { this.avlTree.root = this.avlTree.insert(this.avlTree.root, size); } // 요청 크기 이상인 블록 검색 searchFreeMemory(requestSize) { let current = this.avlTree.root; let candidate = null; while (current) { const nodeSize = current.getData(); if (nodeSize === requestSize) { // 정확히 같은 크기를 찾으면 즉시 반환 candidate = current; break; } if (nodeSize > requestSize) { // 후보로 저장한 뒤, 더 작은 후보를 찾기 위해 왼쪽 서브트리 탐색 candidate = current; current = current.getLeftSubTree(); } else { current = current.getRightSubTree(); } } return candidate; } // 반환된 블록(크기) 삭제 releaseFreeMemory(size) { this.avlTree.root = this.avlTree.remove(this.avlTree.root, size); } } // 실행 const gc = new GabageCollector(); console.log("========== 빈 메모리 영역 초기화 =========="); gc.insertFreeMemory(64); // 빈 64바이트 삽입 gc.insertFreeMemory(48); // 빈 48바이트 삽입 gc.insertFreeMemory(87); // 빈 87바이트 삽입 gc.insertFreeMemory(13); // 빈 13바이트 삽입 gc.insertFreeMemory(102); // 빈 102바이트 삽입 gc.insertFreeMemory(34); // 빈 34바이트 삽입 gc.insertFreeMemory(61); // 빈 61바이트 삽입 gc.insertFreeMemory(40); // 빈 40바이트 삽입 gc.insertFreeMemory(6); // 빈 6바이트 삽입 let freeMemory1 = gc.searchFreeMemory(64); // 64바이트 메모리 console.log(freeMemory1); if (freeMemory1) { gc.releaseFreeMemory(freeMemory1.data); } let freeMemory2 = gc.searchFreeMemory(42); // 48바이트 메모리 획득 console.log(freeMemory2); if (freeMemory2) { gc.releaseFreeMemory(freeMemory2.data); }실행 요약const gc = new GarbageCollector(); 빈 블록 [64, 48, 87, 13, 102, 34, 61, 40, 6]을 insertFreeMemory(...)로 순차 삽입 searchFreeMemory(64) → 정확히 64 노드를 찾아 반환 → releaseFreeMemory(64) 삭제 searchFreeMemory(42) → 42와 동일한 값이 없어 “42보다 큰 값 중 최소(48)” 반환 → releaseFreeMemory(48) 삭제 회고AVL 트리의 삽입·삭제 시 "LL·RR·LR·RL 회전"이 실제로 동작하는 것을 확인하며, 균형 인자의 중요성을 체감했습니다. 삽입, 삭제, 검색이 모두 로그 시간에 동작하기 때문에, 빈 메모리 블록이 많아질 때도 성능을 보장할 수 있다는 점을 체감했습니다. "정확히 같은 크기가 없을 때, 그보다 큰 값 중 최소값을 찾는 후보(candidate)" 로직을 루트부터 내려가며 올바르게 업데이트해야 합니다.    🔗자료구조·알고리즘 미션1 블로그 링크🎯 컴퓨터 구조 미션1 (총 5개)미션 1. 4입력 논리 연산 진리표 작성내용: 4개의 입력(A, B, C, D)에 대한 AND, OR, NAND, NOR, XOR 진리표를 총 16조합으로 작성실행A B C D를 0000 → 0001 → … → 1111 순서로 나열 각 연산(AND, OR, NAND, NOR, XOR)의 출력(Q)을 직접 채워 넣음느낀 점2진수 순서대로 입력 조합을 정리하니 빠짐없이 작성할 수 있었고, XOR처럼 "1 개수 홀짝 판정" 연산은 중간에 헷갈려도 정리 순서를 엄수하면 실수를 줄일 수 있었다.미션 2. 불 방정식 간략화내용: 아래 네 개의 불 방정식을 단계별로 법칙(아이디엠포턴트, 드모르간, 흡수 등)을 적용해 간략화했다.A( (BB)’ + 0A) + (CC)’ = (AB’) + C’ (B’B’) + (AD’ + (CA)’)D = B’ + (DC’) + (DA’) (A’B) + B(B1 + BC) = B B’(1C + BD) + DB = (B’C) + (DB) 느낀 점드모르간·흡수법칙을 차례로 적용하며 "복잡해 보이던 식이 단번에 간결해지는 과정"이 인상적이었다.단계별로 어떤 법칙을 먼저 적용해야 가장 효율적으로 축약되는지 아직 직관이 부족해, 다음주엔 다양한 예제를 풀어 보며 연습할 예정이다.미션 3. 2진수를 10진수로 변환내용: 다음 네 개의 2진수를 10진수로 바꿔 보았다.110111₂ = 55₁₀ 10000001₂ = 129₁₀ 11111100000₂ = 2016₁₀ 101010₂ = 42₁₀실행 각 2진수를 우측 끝 비트부터 자리값(2⁰, 2¹, 2², …)을 곱해 합산 예: 11111100000₂ = 1·2¹⁰ + 1·2⁹ + … + 1·2⁵ + 0·… = 1024 + 512 + 256 + 128 + 64 + 32 = 2016느낀 점자릿값을 일일이 계산하는 것은 번거롭지만, "가장 큰 2의 거듭제곱부터 차례로 빼 나가는 방식"으로 익히니 긴 이진수도 비교적 빠르게 변환할 수 있었다.미션 4. 10진수를 2진수로 변환내용: 다음 네 개의 10진수를 2진수로 바꿔 보았다.10₁₀ = 1010₂ 27₁₀ = 11011₂ 86₁₀ = 1010110₂ 516₁₀ = 1000000100₂실행 나눗셈→나머지 반복: 예를 들어 86 ÷ 2 = 43, 나머지 0 → 43 ÷ 2 = 21, 나머지 1 → … → 최종 이진수 역순 또는 "가장 큰 2의 거듭제곱(2⁶=64)부터 빼 나가기" 방식으로 빠르게 도출느낀 점처음엔 헷갈렸지만, "2ⁿ 이하 최대값을 찾아서 빼고, 나머지로 또 반복"하는 방식이 머릿속에 각인되자 더 긴 수도 금방 변환할 수 있었다.미션 5. 불 방정식을 Logisim으로 회로 구현내용: 불 방정식을 logisim을 이용해 회로 만들기 실행(B′·C) + (D·B)B → NOT → B′AND1: (B′, C)AND2: (D, B)OR: (AND1, AND2) → 출력(A·B′) + CB → NOT → B′AND: (A, B′)OR: (AND, C) → 출력B′ + (D·C′) + (D·A′)B → NOT → B′ (첫 OR 입력)C → NOT → C′, A → NOT → A′AND1: (D, C′)AND2: (D, A′)OR( B′, AND1, AND2 ) → 출력대표 입력별 검증(B′·C)+(D·B) → B=0,C=1,D=0 → OUT=1, B=1,C=0,D=1 → OUT=1, B=1,C=1,D=0 → OUT=0(A·B′)+C → A=0,B=0,C=1 → OUT=1, A=1,B=1,C=0 → OUT=0B′+(D·C′)+(D·A′) → A=0,B=0,C=0,D=0 → OUT=1, A=1,B=1,C=0,D=1 → OUT=1느낀 점Logisim을 통해 "진리표상의 연산이 실제 게이트 단위 회로에서 어떻게 동작하는지"를 직접 눈으로 확인할 수 있었다.회로가 복잡해질수록 배선이 겹치는 문제가 있었으나, 다음에는 모듈 단위(예: (B′·C) 회로 → (D·B) 회로 → OR)로 나눠서 단계별로 검증하려 한다. 🔗컴퓨터 구조 미션1 블로그 링크회고이번 주에는 AVL 트리와 논리 회로 설계를 함께 학습했습니다.AVL 트리 구현: 삽입·삭제 시 LL·RR·LR·RL 회전을 거쳐 균형을 유지하는 과정을 직접 코드로 확인했습니다. "정확히 같은 값이 없으면 그보다 큰 값 중 최소값을 찾는 로직"을 구현하면서, 균형 인자를 어떻게 업데이트해야 하는지 확실히 알게 되었습니다.논리 회로 설계: 4입력 진리표 작성부터 불 방정식 간략화, Logisim 회로 구성까지 순서대로 진행했습니다. 직접 회로를 만들어 입력을 바꿔 볼 때마다 결과가 즉시 바뀌는 모습을 보면서, 이론이 실제 게이트 동작으로 이어진다는 점이 와닿았습니다.스스로 칭찬하는 점이론과 실습 병행AVL 트리 코드와 Logisim 회로를 동시에 구현하며, 배운 내용을 손으로 직접 확인한 점이 좋았습니다.진리표 정리법 습득2진수 순서대로 진리표를 빠짐없이 작성하면서, 체계적인 정리 방법을 제대로 익혔습니다.아쉬웠던 점 & 보완회로 배선 정리 부족Logisim에서 선이 겹치다 보니 가끔 헷갈렸습니다.→ 다음에는 작은 모듈로 나눠 단계별로 검증하고, 마지막에 합치는 방식을 사용하겠습니다. 개념 정리 자료 부족AVL 트리나 불 대수 법칙을 공부할 때, 머릿속으로만 이해하고 따로 요약해 두지 않아 복습할 때 헷갈리는 부분이 있었습니다.→ 학습 중에는 핵심 개념을 노트에 간단히 정리하여, 부족한 부분을 바로 찾아볼 수 있도록 하겠습니다.마치며이번 주차는 이론을 코드와 회로로 연결해 보는 경험을 했습니다. 다음 주에도 부족했던 부분을 보완하며 차근차근 학습을 이어가겠습니다! 감사합니다!

알고리즘 · 자료구조인프런워밍업클럽스터디CS전공지식자료구조컴퓨터구조발자국회고4기

승현

[인프런 워밍업 클럽 4기] 1주차 발자국

이번주 학습 내용실무에 적용하고 싶은 쿠버네티스섹션3. 컨테이너 한방 정리에서 리눅스의 역사부터 도커의 탄생, 쿠버네티스까지 전체적인 흐름을 알 수 있었다.섹션5. 실무에서 느껴 본 쿠버네티스가 정말 편한 이유 에서 정말 쿠버네티스의 기본적인 기능들만 확인했는데, 너무 마음에 들었다. 어느정도 마음에 들었냐면 "당장 실무에서 쓰고 싶다!" 라는 생각이 들었다.매번 VM(EC2)에 JDK 설치하고, 프로메테우스 설치하고, 뭐 누락된거 없는지 체크리스트 확인하고 수동으로 작업했어야 했는데, 거기다 이중화 해야 한다고 하면 VM 하나 더 수동으로 똑같은 작업을 해야 하는데 이게 작업자가 다르거나 체크리스트를 만들지 않으면 환경이 전혀 달라질 수 있다!그런데!! 쿠버네티스는 수동으로 했던 모든 작업을 replica 수만 조정하면 바로 VM 한대가 똑같이 생성된다.이번주 미션 진행[미션1] 쿠버네티스 설치 구간별 상태 확인고민되었던 부분강의를 예전에 듣고 구성해둔 환경이 있었어서, 그대로 사용하려고 하였는데 아래 명령어가 갑자기 안되었다.yum install -y ...그래서 왜 안되는건지 찾아보았는데 NTP 설정을 맞춰주어야 한다고 한다.( 아마 현재 서버가 2024년도여서 yum install 시간과 맞지 않아서 그런것 같다 )sudo timedatectl set-ntp trueNTP 설정을 맞추니까 현재 시간으로 맞춰진 것을 확인했는데! 이번엔 kubectl에서 pod들이 연결이 모두 안되었다. 로그를 확인해보니 인증서가 만료되었다는 것!Jun 01 11:46:22 k8s-master kubelet[1161]: E0601 11:46:22.568529 1161 bootstrap.go:266] part of the existing bootstrap client certificate in /etc/kubernetes/kubelet.conf is expired: 2025-05-24 17:34:19 +000>NTP를 오늘 날짜로 맞춰서 인증서의 날짜보다 지나있기 때문에 만료 되었다고 한다,.동작방식은 제대로 문서를 봐야겠지만, k8s 내부에서 통신을 할때 TLS 통신을 하는 것 같다. 그래서 같은 인증서로 통신을 하는데 만료되어서 통신이 안되고 있는 것으로 예상되어 인증서를 갱신 해주었다.sudo kubeadm certs renew all인증서는 갱신되었지만 여전히 kubeadm은 실행이 되지 않았다, 아마 kubectl 뿐만 아니라 연관된 서비스들도 같이 인증서를 갱신해주어야 하는 것 같은데! 시간이 너무 소요될 것 같아서😢 kubeadm을 새로 설치해주었다.( 삭제하면 namespace들도 모두 삭제되어서,, 다시 설치해주어야 한다. dashboard, calico, grafana... 등)회고정말 쿠버네티스 설치가 너무 힘들고 2번은 못하겠다는 생각도 들고,, 하지만 운영 관점에서는 안정성과 확장성 부분에서 너무 좋은 것 같다.일프로님께 AWS/GCP/Azure 등 클라우드 벤더사에서 제공하는 k8s 서비스를 사용해도 이렇게 설치 과정을 거치는지 궁금해서 여쭤드렸다.일프로님 답변클러스터에 이슈가 발생하면 설치 과정을 이해하고 있어야 한다고 말씀주셨다!복습할 수 있는 시간이 주어진다면 꼭 다시 봐야겠다! 

데브옵스 · 인프라데브옵스인프라Devops인프런워밍업클럽4기

Depth

인프런 워밍업 클럽 스터디 4기 - CS 전공지식 > 3주차 발자국

◼만들면서 쉽게 배우는 컴퓨터 구조Section8) 제어 장치가 없는 컴퓨터 제어 장치가 없는 컴퓨터명령어 실행시 MI, RI, RO, II, IO, AI, AO, BI, BO, EO, SU 등의 제어 신호를 외부에서 직접 활성화해주는 방식예시RAM의 15번지 값 5를 레지스터 A에 저장 Section9) CPU 만들기: 제어 장치 (Control Unit) 1바이트 기계 명령어상위 4비트(Opcode) + 하위 4비트(주소 또는 값)로 구성종류 (Opcode)NOP (0000), LOADA(0001), ADD(0010), SUB(0011), STOREA(0100), LOADI(0101), JMP(0110), JMPC(0111), JMPZ(1000), OUT(1110), HLT(1111) Program Counter (PC)다음에 실행할 명령어의 주소를 저장하는 레지스터보통 클럭 신호에 맞춰 1씩 증가하며 명령어를 순차적으로 실행하지만, 조건에 따라 특정 주소로 점프(Jump) 하기도 한다. 스텝 카운터(Step Counter)시스템 내에서 현재 동작이 몇 번째 단계(스텝)인지 추적하는 카운터어떤 동작이 여러 단계(Step 0, Step 1, Step 2, ...)로 나뉘어 있을 때, 지금 어느 단계인지 기억하고 다음 단계로 이동하기 위해 사용되는 카운터 제어장치 (Control Unit)NOP, LOADA, ADD, SUB, STOREA, LOADI, JMP, JMPC, JMPZ, OUT, HLT, 출력 레지스터로 구성  Section10) 기계어와 어셈블리 어셈블리어어셈블리어는 기계어(Machine Code)를 사람이 조금 더 이해하기 쉬운 형태로 바꾼 언어예시  어셈블러어셈블리어로 작성된 코드를 컴퓨터가 실행할 수 있는 기계어(이진 코드)로 변환해주는 프로그램   ◼ 그림으로 쉽게 배우는 자료구조와 알고리즘Section7) 트라이와 자동완성 트라이(Trie)문자열을 저장하고 검색하는 데 특화된 트리 자료구조루트부터 리프까지의 경로가 하나의 단어효율적인 자동완성, 사전 검색, 접두사 검색에 사용됨사용 예: 검색창 자동완성, 입력기 등  Section8) 그래프 그래프정점(Vertex)과 간선(Edge)으로 이루어진 자료구조방향 그래프: 간선에 방향이 있음 (ex: A → B)무방향 그래프: 간선에 방향 없음 (ex: A—B)탐색 방법DFS : 한 방향으로 계속 깊이 들어가며 탐색하는 방식 BFS : 가까운 정점부터 차례대로 탐색하는 방식표현 방식인접 행렬: 2차원 배열로 표현인접 리스트: 각 정점이 연결된 정점을 리스트로 표현    Section9) 가중 그래프각 간선(Edge)에 숫자 값(가중치, 비용, 거리 등)이 부여된 그래프예) 도시간 거리 그래프  🗒회고지난 주차에 배웠던 RAM, Register, ALU에 이어 Control Unit도 구현해 보았는데, 난이도가 점점 높아지고 있는 것을 실감했다. 수동으로 제어 신호(MI, RO, AO 등)를 켜서 RAM에서 레지스터로 값을 이동시키는 과정도 경험해 볼수 있었고, 기계어를 사람이 이해하기 쉽게 만든 어셈블리어와, 이를 기계어로 변환하는 어셈블러의 역할까지 학습해 봄으로써 하드웨어 수준의 명령어 실행 과정을 이해할 수 있었다. 🏷출처https://inf.run/y1hhdhttps://inf.run/7mNZ2https://inf.run/uHJ1a 

cs발자국4기

Depth

인프런 워밍업 클럽 스터디 4기 - CS 전공지식 > 2주차 발자국

◼만들면서 쉽게 배우는 컴퓨터 구조Section5) 컴퓨터의 기초가 되는 하드웨어 만들기 MUX (Multiplexer, 멀티플렉서)여러 입력 중 하나를 선택하여 출력으로 내보내는 장치데이터 선택기라고도 불림  1비트 2입력 MUXSelection 입력 값에 따라 A입력 또는 B입력을 선택하여 출력Selection이 0 → 입력 A 선택Selection이 1 → 입력 B 선택   8비트 4입력 MUX4개의 8비트 입력 중 하나를 선택하여 출력 2비트의 Selection 입력 사용 (00₂ ~ 11₂)00₂(0) → IN_0 출력01₂(1) → IN_1 출력10₂(2) → IN_2 출력11₂(3) → IN_3 출력 8비트 8입력 MUX8개의 8비트 입력 중 하나를 선택하여 출력3비트의 Selection 입력 사용 (000₂ ~ 111₂)000₂(0) → IN_0 출력001₂(1) → IN_1 출력010₂(2) → IN_2 출력011₂(3) → IN_3 출력100₂(4) → IN_4 출력101₂(5) → IN_5 출력110₂(6) → IN_6 출력111₂(7) → IN_7 출력 디코더 (Decoder)n비트 입력을 받아 2ⁿ개의 출력 중 하나만 활성화 시키는 장치Enable 입력을 통해 디코더 회로 전체의 작동 여부를 제어Enable이 0이면 모든 출력은 0 (비활성화 상태)Enable이 1일 때에는 입력값에 따라 하나의 출력을 활성화 4비트 디코더 (Decoder)4비트 입력 → 2^4 = 16개 출력 중 하나만 활성화RAM 구현시 활용 컨트롤 버퍼제어 신호에 따라 데이터를 흐르게 하거나 차단하는 버퍼  Section6) CPU 만들기: 산술논리연산장치 (ALU) 폰 노이만 구조 컴퓨터입출력 장치 (I/O Device)중앙 처리 장치 (CPU)제어 유닛 (Control Unit)산술 논리 연산 장치 (ALU)메모리 (RAM) → 위 세 가지 구성 요소로 컴퓨터가 구성됨 반가산기 (Half Adder)두 개의 1비트 입력을 더하여, 합(Sum)과 자리올림(Carry)을 계산하는 조합 논리 회로특징입력: A, B (1비트씩)출력: Sum[XOR로 구현], Carry[AND로 구현] (각 1비트)자리올림(Carry-In)을 처리하지 못함 → 이전 자리의 올림을 고려하지 않음 → '반쪽짜리 가산기’ (반가산기)라 불림 진리표 전가산기 (Full Adder)세 개의 1비트 입력(두 입력 + 이전 자리의 자리올림)을 더하여, 합(Sum)과 자리올림(Carry-Out)을 계산하는 조합 논리 회로.특징:입력: A, B, Carry-In (1비트씩)출력: Sum[반가산기 2개로 구현], Carry-Out[반가산기 2개+OR로 구현] (각 1비트)자리올림을 연속적으로 처리 가능진리표  산술 논리 연산 장치 (ALU: Arithmetic Logic Unit)컴퓨터의 핵심 연산 장치로, 산술 연산과 논리 연산을 수행한다.산술 연산 : 덧셈, 뺄셈, 증가, 감소, 곱셈, 나눗셈논리 연산 : AND, OR, NOT, XOR, NAND, NOR 등비교 연산 : ==, >, <, >=, <=CPU 내부에 포함되어 있으며, 프로세서가 수행하는 계산의 대부분은 이 ALU를 통해 처리음수 표현시 2의 보수 사용  Section7) 메모리 만들기조합 논리 회로 (Combinational Logic Circuit)출력이 현재 입력에만 의존하는 회로상태를 기억하지 않음 (메모리 없음)예시: AND, OR, NOT, Half Adder, Full Adder, Multiplexer, Decoder, ALU 순차 논리 회로 (Sequential Logic Circuit)이전 입력에 대한 출력이 다시 입력으로 들어가는 회로이전 상태를 기억예시: SR Latch, D Latch, JK Latch, Flip-Flop, Register, RAM SR LatchSet(S)과 Reset(R) 입력을 갖는 기본 기억 회로특정 조건에서 출력 Q는 이전 상태를 유지Gated SR Latch는 Enable 신호가 1일 때만 동작 D LatchS, R을 하나의 입력 D로 통합한 형태Enable이 1일 때 D의 값을 Q에 저장  JK LatchSR Latch의 단점 (S=R=1일 때 불안정)을 개선J = Set, K = Reset 의미J=K=1이면 출력이 반전 (Toggle 동작)내부 딜레이가 있어 안정적인 동작 위해 Clock 필요 클럭과 플립플롭Clock : enable을 0과 1로 반복해서 바꿔주는 신호 (Hz 단위로 동작)Trigger클럭 신호 중에서 "입력을 출력으로 반영하는 순간"을 결정하는 방식종류Level Trigger: High/Low 상태에서 작동 → D LatchEdge Trigger: Rising/Falling 순간에 작동 → Flip-Flop  레지스터8비트 저장 장치 여러 개의 Latch 또는 Flip-Flop으로 구성Latch 또는 Flip-Flop : 1비트 저장장치   RAM (Random Access Memory)주소를 통해 원하는 데이터에 접근 가능한 메모리 실행 중의 데이터와 상태를 임시로 저장  Mission2)https://inf.run/iWGzi   ◼ 그림으로 쉽게 배우는 자료구조와 알고리즘Section5) Red-Black 트리 Red-Black 트리이진 탐색 트리의 일종으로,데이터가 삽입되거나 삭제될때 트리의 균형을 자동으로 유지하는 균형 이진트리이다.트리의 높이를 제한해 모든 연산의 최악의 시간복잡도를 O(log n)으로 유지하는 것이 목적조건모든 노드는 빨간색 혹은 검정색루트 노드는 검은색모든 리프 노드는 검은색빨간색 노드의 자식은 검은색모든 리프 노드에서 Black Depth는 같다  Section6) 우선순위 큐와 힙 우선순위 큐데이터의 삽입 순서와는 상관 없이 우선순위가 높은 데이터가 먼저 나오는 큐 힙완전 이진 트리 형태의 자료구조로, 부모 노드가 자식보다 크면 최대 힙, 작으면 최소 힙을 의미   🗒회고MUX, 반가산기, 전가산기, 디코더, ALU 등 조합 논리 회로를 직접 구현해보며 각 장치의 동작 원리와 회로 구성 방식을 직관적으로 이해할 수 있었다.또한 Register와 RAM 같은 순차 논리 회로를 만들며, 클럭과 Enable, 기억 소자의 역할, 메모리 동작 방식도 자연스럽게 배울수 있었다.단순 이론을 넘어서 실제 회로 구조를 만들어 시각화 해보는 경험을 통해 컴퓨터 구조애 대한 이해력이 높아지고 있는것 같다.  🏷출처https://inf.run/y1hhdhttps://inf.run/7mNZ2https://inf.run/uHJ1ahttps://velog.io/@kku64r/rbtreehttps://suyeon96.tistory.com/31     

cs발자국4기

Depth

인프런 워밍업 클럽 스터디 4기 - CS 전공지식 > 컴퓨터 구조 1주차 미션

◼컴퓨터 구조 1. 4입력 AND, OR, NAND, NOR, XOR 연산의 진리표를 작성해보세요.AND : 모든 입력값이 1일때만 결과는 1OR : 입력값중 하나라도 1이라면 결과는 1NAND : AND의 반대, 모든 입력이 1일 때만 0, 나머지는 1NOR : OR의 반대, 모든 입력이 0일 때만 1, 나머지는 0XOR : 입력값 중 1의 개수가 홀수이면 1, 짝수이면 0  2. 다음 불 방정식들을 여러 방법을 이용해 간략화 해보세요.A( (BB)’+ 0A) + (CC)' = (AB’) +C(B’B’) + (AD’ + (CA)’)D = B’ + (DC’) + (DA’)(A’B) + B(B1 + BC) = B B’(1C + BD) + DB = (B’C) + (DB)   3. 다음 2진수를 10진수로 변환해보세요.1101112^5 + 2^4 + 0 + 2^2 + 2^1 + 2^032 + 16 + 4 + 2 + 155100000012^7 + 1 = 129111111000002^10 + 2^9 + 2^8 + 2^7 + 2^6 + 2^5 = 20161010102^5 + 2^3 + 2^5 = 32 + 8 + 2 = 42  4. 다음 10진수를 2진수로 변환해보세요.10 = 1010₂2 |10 2 | 5 - 0 2 | 2 - 1 | 1 - 0 27 = 11011₂2 |27 2 |13 - 1 2 | 6 - 1 2 | 3 - 0 | 1 - 1 86 = 1010110₂2 |86 2 |43 - 0 2 |21 - 1 2 |10 - 1 2 | 5 - 0 2 | 2 - 1 | 1 - 0 516 = 10000001002 |516 2 |258 - 0 2 |129 - 0 2 | 64 - 1 2 | 32 - 0 2 | 16 - 0 2 | 8 - 0 2 | 4 - 0 2 | 2 - 0 | 1 - 0  5. 다음 불 방정식을 logisim을 이용해 회로를 만들어보세요.(B’C) + (DB)B’C : NOT(B) AND C → AND 연산DB : D AND B → AND 연산전체: (B’C) + (DB) → OR 연산(AB’) +C AB’ : A AND NOT(B) → AND 연산+C : 결과와 C를 OR 연산 B’ + (DC’) + (DA’)B’ : NOT(B) → NOTDC’ : D AND NOT(C) → ANDDA’ : D AND NOT(A) → AND전체는 OR 연산         

CS미션4기

채널톡 아이콘