9-27-TD

9/27일

오늘은 최종프로젝트를 자동빌딩 시키기 위해 CI/CD 의 하나인 Bitbucket runners에 대해서 조사했다. 하지만 Bitbucker Image에 Docker가 안깔려있어서 빌드되는것을 확인하는데에는 실패 하였다. KDT과정이 끝나고 아마존이 아닌 싼 VPS에서 모델을 돌리려 하다보니 이런저런 제약사항이 뒤따르고있다. 모델이 많이 무거워서 모델 경량화에 대해서 한번 공부할 필요성을 느꼈다.
그리고 Git 명령어에 대해서 공부했다.(저번에 저지른 사건을 잘 처리하기 위해서)

오늘 한것

  1. Hash Table 정리 해쉬 테이블

9/26-일기

9/26일

다 지나가서 27일 오전 1시에 쓰는 일기

카카오 준비한다고 몇 일 동안 하지 못했던 KDT 프로젝트 유지보수를 다시 시작하였다.
카카오 준비 직전에 바쁘다고 정신이 없었는데 그 때 ssh키를 모르고 커밋을 해버려서 팀내에서 새로 규칙을 정해서 브랜치를 정리했다. (미안….)
(private key 파일을 다행(?)히도 push 까지는 하지 않았고, 사용하는 repository가 private라 큰일은 없어서 다행이었다.)
가볍게 git을 공부했었는데 제대로 공부할 필요성을 느낀다.
무엇보다 git add . 이거 쓰면 안될거같다.

오늘 공부한것

1. Hash Table (추후에 자세히 정리예정)

  • python dictionay structure
    • 파이썬 내부에서 dictionary는 어떻게 돌아가나?
  • dictionary와 hashtable 차이
    • Boxing/UnBoxing을 하나 안하나
  • 충돌 처리기법
    • Open Hashging
      • Chaining : linked list 이용
    • Close hashing(Open Addressing)
      • Linear probing
      • Quadratic probing
      • Double hashing

1. 깃 브런치 복습

(https://learngitbranching.js.org/?locale=ko)

9/25-일기

9/25일

카카오 2차 시험을 보았다.
문제는 밝힐수 없지만 흥미로운 주제였다.

하루종일 시험을 보면서 더 공부해야할게 많다라는 점과 정말 잘하는사람은 엄청 잘하더라 알고리즘 어케 짰을지 궁금하다 라는 생각이 들었다.
그리고 리더보드는 정말 압박감이 심하더라…

필기시험과 api코딩테스트를 같이 봤는데
생각보다 내 cs 지식이 빈약한것을 느낄 수 있었다.
그래서 오늘 이런것들을 찾아서 정리해 보았다.
조금더 있는데 시험본다고 너무 피곤해서 내일 남길 예정이다.

  1. 데이터베이스 Key Post not found: database-key 데이터베이스 Key

부분 키(Partial Key) 또는 식별자(Discriminator)

  • 상위 개체 타입이 결정되지 않으면 개별 개체를 식별할 수 없는 종속적인 개체 타입
  • 독립적인 키로는 존재할수 없지만, 상위 개체의 타입의 키와 결합하여 약한개체 타입의 개별개체를 고유하게 식별하는 속성

약한 개체 타입

  • 상위개체타입이 결정되지 않으면 개별 개체를 식별할 수 없는 종속적인 개체타입
  • ex) 프로리그 축구단의 소속된 선수의 등번호
    • 등번호만 놓고 보면 다른축구단에도 같은 번호가 존재 할 수 있지만, 특정 축구단의 소속된 선수의 등번호는 단 하나만 존재한다. -> 개별개체를 식별가능

Http status code

  • 100 : 조건부 응답
  • 200 : 성공
  • 300 : 리다이렉션 완료
  • 400 : 클라이언트 에러
  • 500 : 서버 에러
    추후에 Fastapi 정리하면서 한번더 정리할 예정

database-key

KEY

Key는 데이터베이스에서 조건에 만족하는 튜플을 찾거나 순서대로 정렬할 때 다른 튜플들과 구별할 수 있는 유일한 기준이 되는 Attribute(속성)

1. 슈퍼키(Super Key)

  • 데이터 베이스에서 테이블의 행을 고유하게 식별할 수 있는 속성 또는 속성의 집합
  • 고유하게 식별하는 모든 조합을 나타냄

2. 후보 키(candidate key)

  • 슈퍼 키 중에 더이상 줄일 수 없는 형태를 가진 것
  • 슈퍼 키를 구성하는 속성 중 하나라도 빠지면 유일성을 잃어버리는 조합
  • 기본 키로 선정될 수 있는 후보이기 때문에 후보키라고 이름이 붙여짐
  • Null 값을 허용할지 안할지는 여러가지 설이 존재함(된다 하는 사람도 있고 안된다 하는 사람도 있음)

3. 기본 키(Primary Key, 주 키)

  • 식별자로 이용하기에 가장 적합한 것을 설계자가 선택 정의한 후보키
  • 후보키중 하나를 설계자가 선택해서 기본키로 삼을수 있음
  • 항상 고유한 값을 가짐
  • Null 값이 존재하지 않아야함

4. 대리 키(alternate key)

  • 후보 키들중 기본키로 선택받지 못한 나머지 키들
  • 기본키의 조건도 만족하기때문에 언제든지 기본키로 대체될 수 있다.
  • 대체 키(surrogate key)라고도 함

5. 외래 키(외부 키, Foreign Key)

  • 테이블과 테이블을 연결시켜주는 키
  • 여러 테이블을 동시에 분석할때 유용하다
  • 하나의 테이블로 저장할때 발생하는 중복된 데이터 발생을 방지하면서 데이터를 이어줄 수 있다.

TCP/UDP

2. TCP/UDP

2.1 TCP 전송 제어 프로토콜

2.1.1 TCP개요

  • 인터넷 상에서 데이터를 메세지의 형태(TCP 세그먼트)로 보내기 위해 IP와 함께 사용하는 프로토콜
  • IP와 함께 TCP/IP라는 명칭으로 불린다. IP가 주소를 통해 데이터의 배달을 한다면 TCP는 패킷을 추적 및 관리하는 역할을 한다.

2.1.2 TCP특징

  • 연결형 서비스로 연결이 성공해야지만 통신 가능(3 & 4 way Handshaking : 연결설정, 연결해제)
  • 데이터의 경계를 구분하지 않음
  • 신뢰성이 있다
    • 패킷손실, 중복 순서바뀜을 보장 -> 정확한 데이터 전달 가능
  • 흐름제어 및 혼잡제어를 제공
    • 흐름제어 : 송신처와 수신처의 데이터 처리속도를 조절하여 수신자의 버퍼 오버플로우를 방지
      • 수신측의 처리속도보다 송신속도가 빠를경우 도착한 데이터가 손상될 가능성이 존재
      • 수신자가 송신자에게 자신의 상태를 feedback 해서 속도를 조절한다.
    • 혼잡제어 : 네트워크 내의 패킷수가 넘치지 않도록 방지
      • 낮은속도로 전송하기 시작해서 속도를 올림
  • Full-Duplex(전송이 양방향으로 동시에 일어날 수 있음), Point to Point(연결이 정확히 2개의 종단점을 가지고 있음)
  • ex) 파일전송

2.2 UDP 사용자 데이터그램 프로토콜

2.2.1 UDP개요

  • 데이터를 데이터그램 단위로 처리하는 프로토콜 -> 전송계층
  • 비연결형, 신뢰성 없는 전송 프로토콜이다.

2.2.2 UDP특징

  • 전송방식이 매우 단순해서 빠르다 -> 최소한의 오류만 검출한다.
  • 신뢰성이 낮다 -> 전송하는 데이터의 순번이 바뀌거나 누락될 가능성이 존재한다.
  • 비연결형 서비스이다
    • 논리적인 경로가 없기 때문에 각각의 패킷은 다른 경로로 전송되고 독립적인 관계를 가진다.
  • ex) 실시간 서비스 : 영상통화 등등

2.3 TCP UDP 차이


출처 : soosungp33.log [CS] 📕 Network

OSI 모델

1. OSI 모델이란?

컴퓨터 네트워크 프로토콜 디자인과 통신을 계층으로 나누어 설명한 것이다. 각 계층은 하위 계층의 기능만을 이용하고, 상위 계층에게 기능을 제공한다. 일반적으로 하위 계층들은 하드웨어로, 상위 계층들은 소프트웨어로 구현된다.

1.1 7계층으로 나눈 이유

통신이 일어나는 과정을 단계별로 파악할수 있고, 특정한 곳에 이상이 생기면 이상을 탐지하기 쉽고, 이상이 생긴 단계만 고칠수 있기 때문이다

1.2. 계층단계

  1. 물리 계층
    • 네트워크의 기본 하드웨어 전송기술로 구성
    • 높은 수준의 기능의 논리데이터 구조를 기초로 한다
    • 하드웨어 기술이 접목되어있어 OSI 아키텍쳐중 가장 복잡한 계층이며 필수적이다
    • 전송단위는 Bit이다
    • 리피터, 케이블, 허브
  2. 데이터 링크 계층
    • Point to Point 간 신뢰성 있는 전송을 보장하기 위한 계층
    • 네트워크 위의 개체들 간 데이터를 전달한다.
    • 물리계층에서 발생할 수 있는 오류를 찾아내고 수정하는데 필요한 기능적, 절차적 수단을 제공한다.
    • 주소값은 물리적으로 할당받는다.(MAC address)
    • 네트워크 브릿지나 스위치 등이 이계층에서 동작한다. (Ethernet)
    • 전송단위는 Frame
  3. 네트 워크 계층
    • 여러개의 노드를 거칠때마다 경로를 찾아주는 역할을 하는 계층으로 다양한 길이의 데이터를 네트워크들을 통해 전달하고, 그 과정에서 전송 계층이 요구하는 서비스 품질(QoS)을 제공하기 위한 기능적, 절차적 수단을 제공
    • 라우팅, 흐름 제어, 세그멘테이션(segmentation/desegmentation), 오류 제어, 인터네트워킹(Internetworking) 등을 수행한다
    • IP부여, 경로설정(Route)
    • 전송단위는 Datagram(Packet)
  4. 전송 계층
    • 양 끝단(End to end)의 사용자들이 신뢰성있는 데이터를 주고 받을 수 있도록 해 주어, 상위 계층들이 데이터 전달의 유효성이나 효율성을 생각하지 않도록 해준다.
    • TCP/UDP프로토콜을 사용한다.
    • 전송 단위는 Segment이다.
    • 여기까지가 물리 계층이라고 한다.
  5. 세션 계층
    • 양 끝단의 응용 프로세스가 통신을 관리하기 위한 방법을 제공한다.
    • TCP/IP 세션을 만들고 없애는 책임을 진다.
    • 통신을 하기 위한 세션을 확립/유지/중단
  6. 표현 계층
    • 코드 간의 번역을 담당하여 사용자 시스템에서 데이터의 형식상 차이를 다루는 부담을 응용 계층으로부터 덜어 준다.
    • 인코딩이나 암호화등의 동작이 이루어진다.
    • 송신층과 수신측 사이에서 데이터의 형식(png, jpg, webp 등등) 을 정해준다.
  7. 응용 계층
    • 응용 계층(Application layer)은 응용 프로세스와 직접 관계하여 일반적인 응용 서비스를 수행한다.
    • DHCP, DNS, FTP, HTTP

Array & ArrayList & LinkedList

Array & ArrayList & LinkedList 의 특징

Array(배열)

  • Array는 선언함과 동시에 크기를 함께 적어줘야하는 자료구조이다.
  • Array를 선언하면서 특정 자료형과 배열의 크기를 함께 적어주면 특정 자료형이 들어갈 메모리공간을 미리 할당한다.
  • 데이터를 삭제해도 공간이 남아있다.
  • 장점
    • 미리 주소값(Index)을 할당하다보니 데이터검색이 빠르다.
  • 단점
    • 선언한 크기 이상의 데이터를 가지는것은 불가능하기 때문에 데이터가 늘어나거나 하는 최대사이즈를 알수없는 상황에서 사용하기 부적합하다.
  • ex) c, c++의 배열

ArrayList

  • ArrayList는 크기가 정해져 있지 않다.
  • 데이터에 순서가 Index형식으로 존재한다.
  • 데이터를 중간에 추가하면 기존에 데이터는 Index의 변화가 일어난다. (뒤로 하나씩 밀리거나 당겨지거나)
  • 장점
    • 배열과 같이 Index가 존재하기 때문에 데이터검색이 빠르다.
    • 데이터 검색에 $O(1)$의 시간복잡도
  • 단점
    • 중간에 추가하면 기존 데이터의 Index에 변화가 일어나기 때문에 추가적인 연산이 필요하다.
    • 데이터 추가와 삭제에 $O(n)$의 시간복잡도

LinkedList

  • 각 노드가 데이터와 포인터를 가지고 연결되어 있는 방식으로 데이터를 저장
  • 한방향으로만 연결되거나, 양방향으로 연결, 순환구조로 연결 등의 여러가지 방식이 존재한다.
  • 장점
    • 노드의 연결만 끊어주면 되기때문에 데이터의 추가 삭제가 간단함
    • 시간복잡도 $O(1)$
  • 단점
    • 특정위치의 데이터를 알기 위해서 처음부터 탐색을 해야하기 때문에 시간이 소요됨
    • 시간복잡도 $O(n)$
  • 추가 정보

rabbitmq

KDT과정에서 만든 프로젝트의 실사용자가 여럿인 경우를 가정하고(그럴일은 거의 없겠지만) 백엔드를 구성하려고 팀원들과 계획을 해서 Rabbitmq를 사용하기로 결정하여 공부했었던 내용을 정리해 보았다.

RabbitMQ는 오픈소스 메세지 브로커로써 메세지를 많은사람들에게 전달하거나, request에 대한 처리시간이 길 때 등 비동기적인 처리를 할 때 사용된다.

Model

RabbitMQ는 아래와 같이 AMQP(Advanced Message Queuing Protocol)에 따른 구조로 되어있다.

image

Producer(P)

  • 메세지를 생성하고 Queue에 보내 저장하는 주체이다.

    Consumer(C)

  • 메세지를 수신하는 주체이다.

    Exchange(X)

  • Producer로 부터 수신한 메세지를 각각의 키에 따른 규칙(Binding)으로 Queue나 다른 Exchange로 보내주는 라우터의 기능을 가지고 있다.
  • 모든 Queue는 반드시 Exchange를 통해 메세지를 Producer로 부터 전달받는다.

    Queue(Red Box)

  • 자료구조에서 흔히 들어왔던 큐이다. 메모리에 메세지를 저장하고 Consumer로부터 큐에 요청이 들어오면 저장되었던 메세지를 Consumer에게 전달한다.

Exchange Type

producer로부터 생성된 모든 메세지들은 반드시 Exchange에서 Exchange Type과 Binding 규칙에 따라 규칙에 알맞은 Queue로 전달된다. Exchange Type은 다음과 같은 속성을 가진다.

  • Direct Exchange
    • 메세지에 포함된 routing Key를 기반으로 동일한 binding key를 가진 Queue에 연결된다.

image

  • Fanout Exchange
    • Exchange에 연결된 모든 Queue에 동일한 메세지를 전달한다.
  • Topic Exchange
    • routing Key와 binding Key가 부분적으로 일치하는 모든 Queue 로 메세지를 전달한다.
    • 닷( . )으로 구분된 binding key를 사용하며 *#을 이용하여 binding Key를 구성할 수 있다. *은 한개의 단어를 나타내고 #은 0개 또는 1개의 단어를 나타낸다.

image

  • Header Exchange
    • key-value 로 정의된 헤더에 의해서 전달할 Queue를 결정한다.
    • Queue를 바인딩 할 때 x-match라는 argument로 헤더를 하나만 충족켜도 되는지(any : OR의 기능), 모든 헤더를 충족시켜야 하는지(all : AND의 기능) 규칙을 정할 수 있다.

reference

todolist

9월 해야하는것

현재 하고있는것

  • DP관련 문제 풀기
    • 백준 DP 문제집 푸는중
  • 배운것 정리하기(너무 미루는거같아서 하루에 1포스트씩이라도 정리하자)
  • Stargan-V2 논문 정독
  • 카카오 블라인드 2022 자체 피드백:
    • cs 공부
  • cs 공부(되세김질 기술면접대비)
  • 코딩테스트 대비 알고리즘 공부 및 정리(점점 늘어날 예정)
    • 힙, 큐, 스택
    • 트리
    • DFS, BFS
    • 플루이드 와샬 알고리즘
    • 다익스트라 알고리즘
    • 이진탐색
    • LIS
    • A* 알고리즘
  • 인터넷 찾다가 공부하고 싶은것
    • B+ Tree
  • 백엔드 관련 공부(KDT 프로그램 최종 프로젝트 관련)
    • rabbitmq, fastapi, celery
  • 도커, 도커 컴포즈 공부

한것

  • 코세라 딥러닝 강의 수료 : 복습하는 느낌이라 2일만에 끝내긴 했는데 좋았다
  • KDT 마지막 프로젝트 GAN 임시 테스트 데이터셋으로 학습시키기 : 결과가 나오는것을 보았는데 정말 행복했다. 일주일동안 라벨링만했는데 보상 받는 기분
  • KDT 과정 마지막 프로젝트 진행 : 어느정도 결과가 나오게 무사히 끝난거같다. 팀원들과 유지보수, 보완에 대해 토의해서 주기적으로 보안하는 코드를 작성할 예정
  • 코딩테스트 대비 알고리즘 공부 및 정리(점점 늘어날 예정)
    • 링크드 리스트
  • 카카오 블라인드 2022 준비 :
    • 1차 준비 : 4.5솔로 솔직히 잘본건 아니었는데 붙어서 다행이었다.
    • 2차 준비 : 참신한 문제여서 재미는 있었는데 리더보드로 인한 압박감이 너무 컸다. 면접 볼수 있으면 좋겠다. 아직 내 cs상식이 좀 부족한거같았다. 열심히 면접대비cs지식을 보면서 공부했는데 모르는것만 나오더라…

링크드 리스트

링크드리스트

링크드 리스트는 각 노드가 데이터와 포인터를 가지고 연결되어 있는 방식으로 데이터를 저장하는 자료구조이다

장점

  • 원소 추가와 제거가 쉬움 : 시간복잡도 $O(1)$
  • list의 크기를 가변적으로 사용가능

단점

  • 탐색에는 효율이 좋지 않음 : 특정위치 탐색에 걸리는 시간복잡도 $O(n)$

결론

  • 가변적으로 자주 변하는 데이터에 사용하면 좋다

종류

  • 단일 연결 리스트 : 단방향으로 포인터가 연결된 리스트
  • 이중 연결 리스트 : 양방향으로 포인터가 연결된 리스트
  • 순환 연결 리스트 : Head와 Tail의 노드가 연결되어 순환구조를 가지는 리스트

구현

양방향 리스트로 구현해 보았다.

  1. 노드
    • 데이터를 담을 노드를 구현
      1
      2
      3
      4
      5
      class Node:
      def __init__(self, Data):
      self.Data = Data
      self.prev = None
      self.next = None
  2. 리스트
    • head와 tail은 더미데이터를 넣어주어서 고려할 사항을 줄여줌
      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
      class linked_list:
      def __init__(self):
      dummy = Node(None)
      self.head = dummy
      self.tail = dummy
      self.current = dummy

      def add(self, data): # 새로운 노드를 추가
      newNode = Node(data)
      self.tail.next = newNode
      newNode.prev = self.tail
      self.tail = newNode
      self.current = newNode

      def delete(self): # 현재 활성화 노드를 삭제하고 리턴
      next_node, prev_node = self.current.next, self.current.prev
      if next_node != None:
      next_node.prev = prev_node
      prev_node.next = next_node
      return self.current

      def delete_n(self, n): # n번째 노드를 삭제하고 리턴
      current = self.head.next
      for _ in range(n-1):
      current = current.next

      def prev(self): # 활성화 노드를 prev로 이동
      self.current = self.current.prev

      def next(self): # 활성화 노드를 next로 이동
      self.current = self.current.next