전체 글

개발 블로그 💻👩‍💻
· 알고리즘
문제 https://www.acmicpc.net/problem/1034 1034번: 램프 첫째 줄에 N과 M이 주어진다. N은 행의 개수이고, M은 열의 개수이다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 램프의 상태가 주어진다. 1이 켜져있는 상태이고, 0이 꺼져 www.acmicpc.net 첫번째 풀이 - 백트래킹, 시간초과 N, M의 입력값이 50이라 불안하긴 했지만 일단 백트래킹 말고는 최적화 방법을 못 떠올렸다. 아래와 같이 백트래킹으로 진입하며 XOR로 한 줄씩 램프를 반대로 설정하도록 구현하였다. """켜져있는 램프는 꺼지고, 꺼져있는 램프는 켜진다""" N, M = map(int,input().split()) List = [] for _ in range(N):..
0. 문제 https://www.acmicpc.net/problem/22115 22115번: 창영이와 커피 커피는 종류별로 하나씩 준비되어 있기 때문에, 동일한 커피를 여러 개 마실 수 없음에 유의하라. www.acmicpc.net 1. 문제 해설 아래 힌트에 이 문구가 있다. 커피는 종류별로 하나씩 준비되어 있기 때문에, 동일한 커피를 여러 개 마실 수 없음에 유의하라. 그리고 위에도 볼드채로 '하나씩' !! 이라고 쓰여 있는데 이걸 놓치면 틀릴 수 있다. .. ㅠ 2. 문제 풀이 그래서 이 DP+냅색 문제를 두 가지 경우로 바꾸어서 이해해 보았다. 먼저, 만약 커피가 무제한으로 존재한다면? 아래와 같이 풀 수 있을 것이다. N, K = map(int,input().split()) C = list(ma..
· INFRA
개요 이전 글에서 KONG을 docker로 실행하는 방법에 대해 알아보았다. 이번에는 이 kong 컨테이너 이미지에 인증서를 입혀 https를 이용해 들어갈 수 있도록 해보자 ! SSL 인증서란? CA란? SSL(Secure Socket Layer) 프로토콜은 처음에 Netscape사에서 웹서버와 브라우저 사이의 보안을 위해 만들었다. SSL은 Certificate Authority(CA)라 불리는 서드 파티로부터 서버와 클라이언트의 인증을 하는데 사용된다. 아래는 SSL이 어떻게 작동하는지에 대한 간단한 과정을 설명한 것이다. 출처 아래에서 웹브라우저는 Chrome, 웹서버는 Nginx로 이해하자. [웹브라우저] SSL로 암호화된 페이지를 요청하게 된다. (일반적으로 https://가 사용된다) [웹서..
· INFRA
아래는 쉽게 시작하는 쿠버네티스 책과 kubernetes ko docs 를 읽고 공부하여 정리한 글입니다. Docker에게 두들겨 맞고 서버에서 OOM 오류를 계속 만나면서 컨테이너에 대해 조금 이해하게 되었다. 이제 쿠버네티스를 학습할 때가 온 것 같아 기초적인 이론 부분만 학습을 진행하였다.. 목차 1. 아키텍쳐 2. 서비스 3. DEPLOYMENT 관리 4. Configmap, Secret 5. 볼륨 1. 아키텍쳐 쿠버네티스는 쿠버네티스 클러스터, 마스터 노드, 워커 노드, 컨테이너 런타임, 영구 스토리지 등으로 이루어져 있으며 각 구성요소의 역할은 아래와 같다. 구성요소의 역할 쿠버네티스 클러스터 : k8s의 여러 리소스를 관리하기 위한 집합체로, 마스터 노드와 워커 노드를 이용해 하나의 k8s ..
· INFRA
이어서 Kong API Gateway에 대해 더 알아보자! 여기 를 참고하면 Kong + Konga + Postgresql DB 를 docker 로 설치할 수 있다. 하지만 매번 이렇게 run 명령어를 일일이 칠 수도 없을 뿐더러 잘못해 docker container를 delete 시키게 되면 모든 데이터들이 날아갈 우려가 있다. 따라서 아래와 같이 docker-compose.yml 파일에 한꺼번에 정리하고 docker volume을 마운트해놓으면 좋다. 도커에 대한 설명과 아래에 쓰인 여러 지식들은 여기 에 정리해 두었으니 참고하면 좋다! docker-compose.yml 을 이용해 여러 컨테이너 run 시키기 기본적으로 kong에 관련된 config 데이터들은 postgresql 서버에 들어가므로 k..
· INFRA
API Gateway 현재 회사 프로젝트는 Flask API Server와 React 화면으로 구성되어 있으며 여러 GET 요청을 간단히 처리하고 있다. 인증처리나 loadbalancing 기능을 구현하기 위해, API GATEWAY를 이용하여 본래의 api 로직을 해치지 않고 여러 부가 기능을 추가하는 것으로 결정했다! 이렇게 서비스를 독립적으로 마이크로하게 나누어, 서비스의 개선과 확장을 용이하게 하는 것을 MSA 아키텍처라고 부른다. KONG 아래와 같이 KONG(킹콩🦍??) API GATEWAY를 사용하여 Client와 API 간 통신에 여러 부가 기능들을 대신 수행할 수 있다. KONGA Kong 관리를 쉽게 도와주는 GUI 툴, 즉 대시보드이다. Kong 설치 나는 docker 를 이용하여 설..
· INFRA
도커를 공부하며 헷갈리는 개념을 정리하는 공간입니다. 1. Docker build와 Docker run의 차이? "Docker build"는 이미지를 생성하고 정의하는 데 사용되며, "Docker run"은 이미지를 실행하여 컨테이너를 생성하고 실행하는 데에 사용되는 명령어이다. 2. 컨테이너와 이미지 차이? 예를 들어, Python 어플리케이션을 도커 이미지로 빌드하려고 한다. Python 코드와 필요한 종속성(라이브러리)을 포함하는 도커 이미지를 만든다. 이후 이 도커 이미지를 사용하여 Python 어플리케이션을 실행하려고 한다. 이미지를 기반으로 컨테이너를 생성하고 시작한다. 컨테이너는 이미지의 인스턴스이며 실행 중인 Python 어플리케이션을 나타낸다. 예를 들어 ubuntu라는 image가 있다..
다음은 토비의 스프링 7.3~7.4장 을 공부하고 정리하였습니다. 7.1~7.2장 내용 간단 요약 SQLReader - SQL을 어떻게 읽어오는지 SqlRegistry - SQL을 어떻게 저장해둘 건지 SqlService 이란? @PostConstruct 가 달린 빈 초기화 메소드와 SqlService 인터페이스에 선언된 메소드인 getFinder()을 sqlReader과 sqlRegistry를 이용하도록 변경 자기 자신을 참조하는 빈이다. → sqlService를 구현한 메소드와 초기화된 메소드는 외부에서 DI 된 오브젝트라고 생각하고 결국 자신의 메소드에 접근하므로 이 셋을 이용하여 디폴트 의존관계를 갖는 빈을 만들 수 있다. 디폴트 의존관계란 외부에서 DI 받지 않는 경우 기본적으로 자동 적용되는 ..
다음은 토비의 스프링 6장 AOP 를 공부하고 정리하였습니다. AOP를 이해하기 전에 먼저 아래 개념이 선행되어야 한다. 빈 생명주기 (그냥 훑어봐도 이해하기 쉽다. 아래 빈 후처리~ 로직을 이해하려면 필연적으로 알아야 함 !) DI Transaction (DataBase 관련 개념) 프록시 개념 아래 여러 혼란스러운 개념들이 나오니 단어들을 헷갈리지 않고 정리하면서 보는 과정이 필요하다.. AOP를 한 마디로 말하면, 공통된 기능을 재사용하는 기법이다. spring에서 볼 수 있는 AOP의 적용 대상은 바로 @Transactional 기능이다. 우선 Transactional 의 기본 코드는 아래와 같다는 사실을 알아두자. public void upgradeLevels() { PlatformTransac..
문제 https://school.programmers.co.kr/learn/courses/30/lessons/152995 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 생각 임의의 두 수 i, j가 있다. 만약 근무태도 점수[i] < 근무태도 점수 [j] 이고 동료평가 점수[i] < 동료평가 점수 [j] 인 경우가 한 번이라도 있다면 i 는 인센티브를 받지 못한다. 그게 아니라면 두 점수의 합이 높은 순으로 석차를 낸다. N = 10만이라면 → NlogN 알고리즘이 적합하겠다!! 문제 풀이 def solution(scores): wanho = sco..
· BackEnd
아래 글은 로버트 마틴의 클린코드 책 14장 ~ 끝까지를 읽고 작성한 글입니다. 아래 내용은 저자가 코드를 짜면서 사용하는 기교와 휴리스틱이다. 앞단의 내용과 조금 겹치는 부분도 존재하고, 내용이 이어지기 때문에 앞의 내용을 다 읽어야 이해가 쉽다. 주석 부적절한 정보 작성자, 최종 수정일, SPR 번호 등과 같은 메타 정보만 주석으로 넣는다. 쓸모 없는 주석 오래된 주석, 엉뚱한 주석, 잘못된 주석 등 쓸모 없는 주석은 코드를 그릇된 방향으로 이끈다. 중복된 코드 코드만으로 충분한데 구구절절 설명하지 말자. 성의 없는 주석 주석을 달 참이라면 시간을 들여 최대한 멋지게 작성한다. 단어를 신중하게 선택하고, 문법과 구두점을 올바로 사용하며, 간단하고 명료하게 작성하자. 주석 처리된 코드 주석으로 처리된 ..
· BackEnd
아래 글은 로버트 마틴의 클린코드 책 1장 ~ 13장 을 읽고 작성한 글입니다. 개요 이 책을 읽게 된 이유는 최근에 내가 너무 '어쨌든 굴러가는 코드'에만 집중해 코드를 작성하려고 해서였다. 구현이 빨리 되어 결과물이 바로 눈에 보이는 게 좋긴 하였으나 너무 성급하게 짠 코드는 정신이 하나도 없었다. 이 책을 읽어보면서 내가 작성한 코드를 리팩토링하기로 했다. 내가 개발한 코드와 서비스를 이어받아 운영할 분들에게 어느 정도 도움이 되고 싶다. 클린 코드란? 깨끗한 코드는 ‘보기에 즐거운’ 코드다. 클래스, 함수 , 메서드 등을 최대한 줄인다. 중복이 없다. 세세한 사항까지 꼼꼼하게 처리하는 코드다. 모든 테스트를 통과한다. 한가지에 ‘집중’한다. 의미있는 이름 함축성을 담자. 특히나 for문에 i,j,..
다음은 토비의 스프링 5.1 사용자 레벨 관리 기능 추가 를 공부하고 정리하였습니다. 요구사항 - 사용자의 레벨은 BASIC, SILVER, GOLD 세 가지 중 하나이다. - 사용자가 처음 가입하면 BASIC 레벨이며, 이후 활동에 따라 한 단계씩 업그레이드 도니다. - 가입 후 50 회 이상 로그인하면 BASIC에서 SILVER 레벨이 된다. - SILVER 레벨이면서 30번 이상 추천을 받으면 GOLD 레벨이 된다. - 사용자 레벨의 변경 작업은 일정한 주기를 가지고 일괄적으로 진행된다. Level을 Enum 을 쓰자 ! 만약 Enum이 아닌 class 로 쓴다면 ? 아래와 같이 일일히 int type으로 저장한다.이후 DB에서 어떻게 갖다 쓸 것인가? if (user1.getLevel() == U..
0. 문제 사칙연산 1. 문제 풀이 백준의 행렬 곱셈 순서 문제와 유사한 문제이다. 처음에는 Greedy라고 생각하였다 . 하지만 DP! - 뒤에는 작은 수가, + 뒤에는 큰 수가 나와야 한다. 또한 순차적인 계산 방식이 아니므로 Greedy로 풀 수 없고, 행렬 곱셈 순서 문제처럼 step별로 계산하며 DP table로 상태를 계속 적어두어야 한다. INF = 987654321 def solution(arr): answer=0 num = (len(arr)+1)//2 DP_max = [[-INF] *(num+1) for _ in range(num+1)] DP_min = [[INF] * (num+1) for _ in range(num+1)] for i in range(num): DP_max[i][i]=in..
· INFRA
Can’t log into Elastic (self hosted) “Oops! Error. Try again.” [lens_merge_tables] > [esaggs] > EsError TOO_MANY_REQUESTS/12/disk usage exceeded flood-stage watermark .. 해당 에러들은 모두 Elastic disk 가 가득차서 생기는 오류이다. free -h 명령어로 Elastic server에서 몇 퍼센트를 사용하고 있는지 확인할 수 있다. 아래 /elk 메모리가 90퍼센트 이상 사용하게 되면 주로 해당 오류들이 발생한다. [**@n**** config]# df -h Filesystem Size Used Avail Use% Mounted on dev**** t** t**s..
· AI
문제 상황 회사에서는 상담 센터에서 수많은 양의 상담 전화를 받고 있다. 이 상담 전화를 STT whisper로 받아 프로그램을 돌리고 있는데, 사실상 이 서비스가 빛을 발하지 못하고 있다. 밤새 돌려놓으면 2000건 까지는 돌릴 수 있으나 그 이상의 데이터(4000건 까지 들어옴)를 돌리지 못하는 어려움이 있음 whisper 에 화자분리는 지원이 되지 않아 해당 script의 화자 파악에 어려움이 있음✔️ 통화 음질이 아주 나빠서 정확도가 너무 떨어짐✔️ 이 STT 자료들을 조금 더 의미있게 사용하기를 원한다. 예를 들어 상담원 A와 상담원 B의 언어적 특징이나, 상담원들이 많이 사용하는 단어들을 추출한다거나 등 등 .. 내가 해볼 수 있는 기술적 영역에서 해결해볼 수 있는 것들? Kafka 등을 이용..
다음은 토비의 스프링 3.4 컨텍스트와 DI ~ 3.5장 3템플릿과 콜백 을 공부하고 정리하였습니다. DI에 대해 다시 복습하자 ! 1. 그림으로 표현해본다면? Pencil 객체와 Store 객체가 있다. 이 때 의존성은 다음과 같이 문장으로 표현된다. A가 B를 사용한다. A가 B에 의존성이 있다. A-store / B-pencil DI 가 아닌 코드를 먼저 보자. public class Store { private Pencil pencil; public Store() { this.pencil = new Pencil(); } } Store 객체 안에서 직접 객체를 생성하고 초기화한다. DI 인 코드 public class Store { private final Pencil pencil; public S..
· INFRA
개요 Elastic Observability로 NVIDIA GPU 메트릭을 모니터링하는 방법 을 참고하여 작업하였습니다. 해당 서버는 Linux에서 NVIDIA CUDA가 설치되어 GPU가 세팅되어 있는 환경이다. 해당 GPU가 얼마만큼 사용되는지 nvidia-smi 명령어를 사용하면 알 수 있지만, cmd 창에서 일일히 확인하지 않고 kibana 등을 이용하여 시각화하기 위해서 GPU 성능 모니터링 ELK 를 탑재하였다 ! DCGM DCGM (Data Center GPU Management) 툴은 NVIDIA GPU의 성능 및 상태를 실시간으로 모니터링하여 GPU의 온도, 전력 소비, 메모리 사용량, 그래픽 작업 부하 등의 데이터를 수집하고 분석할 수 있는 툴이다. GPU와 관련한 데이터는 metric..
· INFRA
해당 작업은 elastic metricbeat docker module 과 Docker Performance Monitoring with Metricbeat and ELK Stack (사진 출처) 을 참고하여 작업하였습니다. 개요 Linux에 ELK Stack(Metricbeat) 를 세팅하여 dashboard에서 확인하는 과정은 여기 에서 확인할 수 있다. ELK metricbeat는 Docker container 들에서 metric 데이터를 가져올 수 있는 모듈을 제공한다. 추가적으로 아래의 다른 모듈들도 기본적으로 제공되는데, ./metricbeat-7.12.1-linux-x86_64(다운로드 경로)/modules.d 경로에서 확인해볼 수 있다. activemq.yml.disabled docker...
아래 글은 토비의 스프링을 읽고 공부하였습니다. 목차 1. DI란 1) 의존관계 2) 모델링 시점의 의존관계 vs 런타임 시점의 의존관계 3) 제3의 존재 4) 의존관계 검색과 주입 5) 의존관계 주입 방법 3가지 2. XML을 이용한 DI 1) DI 설정정보를 만드는 XML 2) XML을 이용하는 애플리케이션 컨텍스트와 Datasource 1. DI DI는 의존관계 주입으로, IoC와 동떨어진 개념은 아니다. DI는 오브젝트 레퍼런스를 외부로부터 제공(주입)받고 이를 통해 여타 오브젝트와 동적으로 의존관계가 만들어지는 것이 핵심이다. 우리가 보통 알고있는 가장 대표적인 DI는 @Autowired 어노테이션일 것이다. 1. 의존관계 객체를 직접 생성하는 것이 아니라 외부에서 생성한 후 주입하는 방식이다...
jeonyoungseo
youngseo's TECH blog