일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- branch 전략
- 백준
- 구현
- 알람 시스템
- 이분탐색
- AWS
- 좋은 코드 나쁜 코드
- 숫자 블록
- 주식
- gRPC
- spring event
- JPA
- 누적합
- piplining
- 트랜잭샨
- 레디스 동시성
- 검색어 추천
- 프로그래머스
- docker
- jwt 표준
- 깊게 생각해보기
- 완전탐색
- BFS
- 객체지향패러다임
- 셀러리
- prg 패턴
- 디버깅
- 결제서비스
- 카카오
- 쿠키
- Today
- Total
목록분류 전체보기 (168)
코딩관계론
프로젝트를 하는 중 python3.7에서 지원하는 pkg를 사용해야만 하는 상황에 직면했다. 우리는 build된 docker 이미지만 있는 상황이었다. 먼저 ros version을 확인하기 위해 docker inspect 명령어를 이용해 조사헸더니 ros:melodic버전이었다. 따라서 docker hub에서 제공하는 공식 ros:melodic을 이용하기로 했다. 특이한 점은 ros:melodic의 기본 파이썬 버전이 아니라 3.7파이썬을 사용하기 위해서 python3.7을 다운로드해준다. FROM osrf/ros:melodic-desktop-full-bionic RUN apt-get update && apt-get install -y python3.7 python3-pip python 명령어가 3.7버..
1. 문제 상황프로젝트가 example 도커 이미지를 빌드하기 위해선 기반 파일인 src 파일을 빌드해야 한다. example 코드를 수정하던 중에 src 코드 수정이 필요하다면 src 파일을 --no-cache로 빌드했다. src의 환경이 변하는 것이 아니라 코드만 변했을 뿐인데 기존 pkg를 다운하고 다시 설치하는 것은 불필요한 시간을 잡아먹고 있었다. FROM nvcr.io/nvidia/l4t-base:r32.6.1# Keeps Python from generating .pyc files in the containerENV PYTHONDONTWRITEBYTECODE=1# Turns off buffering for easier container loggingENV PYTHONUNBUFFERED=1A..
[ 정규화(Normalization) 수행 이유] 정규화는 데이터의 일관성 최소한의 데이터 중복, 최소한의 데이터 유연성을 위해 데이터를 분해하는 과정이다 중복된 데이터를 허용하지 않음으로써 데이터의 무결성을 유지할 수 있다. [ 1 정규화 ] 모든 속성은 단 하나의 값을 가져야 한다. 아래의 표를 보면 연락처 속성에 휴대폰과 집전화가 혼합되서 들어있는 것을 볼 수 있다. -> 단 하나의 의미를 가지는 것이 아님 [이와 같이 테입을을 구성한다면 몇 가지 단점이 존재한다] 연락처 정보에 든 값이 휴대폰인지, 집 전화인지 구별이 불가능하다. 명확하지 않은 속성은 이메일처럼 다른 유형의 데이터를 포함할 수 있다. 고객번호 고객명 연락처 1000 배재완 010-7123-1234, 02-123-123 1001 이..
1. 엔터티(Entity) 업무에 필요하고 유용한 정보를 저장하고 관리하기 위한 집한적인 것으로 설명할 수 있다. 특징 유일한 식별자에 의해 식별이 가능해야 한다. 엔터티는 반드시 속성이 있어야 한다. 엔터티가 최소 단위일 필요는 없다. 한 개 이상의 관계를 가져야 한다. 분류 유/무형 유형엔터티: 물리적인 형태가 있고 안적적이며 지속적으로 활용되는 엔터티(ex. 사원, 물품) 개념엔터티: 물리적인 형태가 없고, 개념적 정보로 구분되는 엔터티(ex. 조직, 보험상품) 사건엔터티: 업무를 수행함에 따라 발생하는 엔터티(ex. 주문, 청구, 미납) 발생시점 기본엔터티: 업무에 원래 존재하는 정보다, 중심엔타티: 기본엔터티로부터 파생되고 그 업무에서 중심적인 역활을 한다. 행위엔터티: 두 개 이상의 부모엔터티..
프로토콜 CSMA/CD CSMA/CD는 Carrier Sense Multiple Access/Collision Detetion의 줄임말로, 네트워크에 케리어가 감지되지 않으면 frame을 전송하는 방식이다 1. 네트워크가 비었는 상태인지 알기 위해서 캐리어가 있는지 검사한다. 1 - 1 *브로트캐스트를 사용하여 목적지의 mac을 감지한다. 목적지의 device는 *유니캐스트를 이용해 응답합니다. 2. 캐리어가 감지되지 않는다면 프레임을 네트워크에 보낸다. 3. 충돌이 발생하면 jam signal을 모든 호스트에게 전송하여 충돌 발생을 알리고 전송을 하던 매체는 랜덤한 시간만큼 기다린 후 재전송을 시도한다. 3 - 1 랜덤한 시간을 기다리는 이유: 충돌난 디바이스가 같은 시간을 기다리면 또 다시 충돌이 발..
먼저 OSI 7계층이 필요한 이유를 설명하자면 OSI 7 계층의 목적은 표준화를 통하여 이기종 장치의 데이터 통신이 가능하게 해준다. 1계층(물리 계층) 목적: 사용자 데이터를 전기적 특성으로 변환하는 계층 특징: 오류, 전송 제어 등의 기능이 없음 Only 전달만 수행하는 역활 전송 형식: bit 기기: 랜카드 요즘 랜카드에서는 Auto MDIX 기능으로 인해 크로스 케이블과 다이렉트 케이블을 구별할 필요가 없지만 랜카드에서 인터넷 인식이 안된다면 해당 기능이 있는지 체크하자(트러블 슈팅 내역 : 2022.10.10 - [TroubleShooting/Network] - [SPOT/Network] 서버와 라우터(공유기)가 연결이 안됨(SITE-HUB of Boston dynamics)) 다이렉트 케이블은..
결론부터 말하자면 Thread 문제가 아니라 이 액션과 상관없는 네트워크 타임에 의해서 발생하는 문제였다. 해결 방법1. time.time모듈을 이용해 각 구간의 프로그램 실행 시간을 체크함2. request에서 매번 필요한 keyword를 파싱하는 방법이 아니라 request를 한번만 파싱하고 default dict을 이용하는 방법을 사용함dev_name = self._parsing_keyword(request, "dev_name")cmd = self._parsing_keyword(request, "cmd")min_threshold = self._parsing_keyword(request, "min")max_threshold = self._parsing_keyword(request, "max")----..
풀이 각 메뉴들을 조합하여 리스트에 저장하고, 각 course 개수의 best like를 구해주면 된다. 코드 from collections import Counter from collections import defaultdict import itertools def solution(orders, course): answer = [] cand_comb_menu = [] for num in course: for order in orders: comb_menues = list(itertools.combinations(order, num)) #AC, AD, AE for comb_menu in comb_menues: comb_menu = sorted(comb_menu) cand_comb_menu.append(..
풀이 연속된 문자열의 깔끔한 처리 코드 "연속된 문자를 복잡하게 처리하는 코드" def get_rule2(id): new_id = "" for i in range(len(id)): if not id[i].isalpha() and not id[i].isdigit(): if not id[i] in ['.', '-', '_']: continue new_id += id[i] return new_id def get_rule3(id): new_id = "" end = -1 for i in range(len(id)): if not id[i].isalpha(): if id[i] == '.': end = i for j in range(i + 1, len(id)): if id[j] != '.': break end = j ..
풀이 누적합을 이용해 skill을 O(n2)으로 줄여야 한다. 오랜 시간 동안 고민했던 것은 2차원 배열에서 누적 합을 어떻게 풀어야 할지 고민을 했다. 2차원 누적 합의 공식은 각 row를 먼저 다 누적해서 더한 후 col을 누적해서 더해주면 된다. 초기 배열 -2 0 2 0 0 0 map[2][3]) 2 0 -2 map[3][3] 누적합 배열 -2 -2 (psum[1][2]) 0 (psum[1][3]) -2 -2 (psum[2][2]) 0 ( psum[2][3]) 0 0 0 잘 생각하면 psum[2][3] 을 계산하면 map[2][3] + psum[1][3] + psum[2][2] -psum [1][2]의 경우는 변화량이 한번 제거된다.하지만 map[3][3]의 경우에는 변화량이 두 번 제거가 됨으로..
변수 설명 N[] = 모래의 초기 상태 a, b deg = a이상 b이하 deg만큼 모래를 채워라(빼라) 풀이 a~b까지 deg를 누적해서 더해주고 b + 1에서 deg를 소멸시켜주자 누적해서 더해주는 것은 각 인덱스에 무엇을 얼만큼 더해야 하는지 알려주기 때문에 누적하는 것이 굉장히 중요하다. 여기서 문제점은 a ~ b까지 deg를 누적해서 더했다면 n[b + 1] = [b] + b[n + 1]이 된다. n[b + 1]에서는 deg값을 인덱스마다 누적 할 필요가 없는데 어떻게 하면 소멸할 수 있을까를 고민하면 된다. b[n + 1]에 -deg 값을 넣음으로써 해당하는 누적 값을 없앨 수 있다. 풀이 def make_psum(arr): psum = [] psum.append(arr[0]) for i in..
풀이 "당신은 중간에 양이 늑대에게 잡아먹히지 않도록 하면서..." 가장 중요한 점은 방문 순서가 상관이 없다는 점이다. 왜냐하면 방문한 노드의 양과 늑대를 다 더하고 늑대가 많다면 탐색을 잔행 하지 못하기 때문이다. 다시 루트 노드로 돌아오려 합니다." 노드의 재방문을 고민해보면 양방향 간선을 통해서 해결할 수 있다. 이 부분 때문에 2차원 배열의 메모제이션이 필요하다. dp는 cache[node][방문한 노드들] = 양의 최대 수 코드 from collections import defaultdict nodes = [] edges = [] cache = [] def dfs(node, visited): global nodes, edges sheep = 0 wolf = 0 if cache[node][vis..