sanggi-jayg의 등록된 링크

키자드에 등록된 총 211개의 포스트를 확인하실 수 있습니다.

Tistory

[MySQL] ORDER BY Optimization

MySQL ORDER BY Optimization MySQL Order by 사용시 인덱스를 사용 조건에 충족하다면 인덱스를 이용해서 정렬을 하겠지만 인덱스를 사용할 수 없는 경우에는 filesort를 사용을 한다. ORDER BY 인덱스 사용 충족 조건 Order by는 꼭 인덱스와 매치가 안되더라도 인덱스를 사용할 수도 있다. 각설하고 실제 예시를 통해 알아보자. SELECT * FROM t1 ORDER BY col_a, col_b; 테이블 t1에 복합 인덱스로 index (col_a, col_b) 가 생성되어 있다고 가정을 하자. MySQL의 Optimizer는 실행시 인덱스를 읽는게 효율적이라고 생각 한다면 인덱스를 사용할 것이고 그것을 통해서 추가적인 정렬하는 자원을 방지 할 수도 있다. SEL..

Tistory

[Git] .gitignore 적용이 안되는 경우

[Git] .gitignore 적용이 안되는 경우 git rm -rf --cached . git add .

Tistory

[Kafka] 카프카 컨슈머

카프카 컨슈머 Kafka Consumer는 사용자가 제어하며 poll 메소드를 호출하여 카프카 브로커에서 데이터를 가져올 수 있다. 일반적으로 Consumer의 group.id와 가져올 topic을 지정한다. 같은 group.id를 사용하는 Consumer를 묶어서 Consumer Group이라고 한다. // KafkaConsumer ... set properties of consumer val consumer = consumerFactory(props).createConsumer() consumer.subscribe(listOf("topic-name")) while (true) { val records = consumer.poll(Duration.ofMillis(100)) records.forEach ..

Tistory

Intellij에서 Kotlin을 Java로 변환 확인 하는 방법

Intellij에서 Kotlin을 Java 변환 확인 하는 방법, 인텔리제이에서 코틀린을 자바 변환 확인 하는 방법 코틀린 컴파일 자바로 Decompile Kotlin class Person(val name: String) { val isKim: Boolean get() = name.startsWith("김") val maskingName: String get() = name[0] + (1 until name.length).joinToString("") { "*" } } Java public final class Person { @NotNull private final String name; public final boolean isKim() { return StringsKt.startsWith$defa..

Tistory

[Docker] 사용하지 않는 볼륨 삭제하는 방법

[Docker] 사용하지 않는 볼륨 삭제하는 방법 docker volume rm $(docker volume ls -qf dangling=true)

Tistory

[통계] 정규화(Normalization)와 표준화(Standardization)

정규화 Normalization 정규화는 통계학에서 여러가지의 의미를 가지고 있으며 주로 서로 다른 척도를 가진 것들에 대해서 공통의 척도를 갖도록 조정 하는 것으로 사용 된다. 보통 평균화 이전에 사용하며 교육 평가 점수를 정규화 하는 경우 분포를 정규분포로 맞추기 위해서 사용을 한다. 날짜 주식 A 주식 B 2010-01-01 10,000 10,000 2011-01-01 9,000 50,000 2012-01-01 11,000 100,000 2013-01-01 15,000 150,000 주식 A 종목과 주식 B 종목의 데이터 셋을 가지고 있다고 가정해보자. 각 주식 종목들의 범위는 [9000~15000], [10000~150000] 을 알 수 있다. 주식 A 종목에 비해서 주식 B 종목의 범위가 휠씬 ..

Tistory

[Kafka] 카프카 에러 핸들링 패턴

Pattern 1: Stop on error (에러시 중지) 모든 이벤트들이 순서 보장과 함께 에러 없이 처리 되어야 하는 경우에 사용함. (예를 들어, CDC) 처리 도중 에러가 발생한다면 어플리케이션은 중단되며 수동 개입이 필수적이다. Source 토픽의 이벤트는 다른 경로를 사용하지 않는다. Pattern 2: Dead letter queue (실패 대기열 큐) 일반적인 시나리오로 메인 스트림이 계속되는 동안 어플리케이션에서 처리가 불가하다면 Error 토픽으로 향하도록 함. 이 방식에서는 재시도를 위한 프로세스를 요구하거나 지원하지 않는다. 즉, 이벤트는 성공적으로 처리되거나 Error 토픽이다. 일반적인 상황에서 어플리케이션은 Source 토픽의 각 이벤트를 처리하고 Target 토픽으로 생성한..

Tistory

[Kafka] 카프카 메시지 브로커

카프카 구조 Zookeeper (주키퍼) 분산 코디네이션 서비스를 제공하는 오픈소스 프로젝트로 직접 어플리케이션 작업을 조율하는 것을 쉽게 개발할 수 있도록 도와주는 도구이다. API를 이용해 동기화나 마스터 선출 등의 작업을 쉽게 구현할 수 있게 해준다. Broker (브로커) Kafka 서버를 의미하며 한개의 Cluster 내에 여러개의 Kafka 서버를 실행시킬 수 있다. Topic (토픽) 메시지가 생산되고 소비되는 주체 Partition (파티션) 하나의 토픽내에서 토픽의 메시지가 분산되어서 각자 저장되는 단위 (위 카프카 아키텍쳐대로면 한개의 토픽에서 3개의 파티션으로 저장 관리되고 있다.) 파티션은 내부가 Queue로 구성이 되어있어서 순서를 보장하지만, Partition끼리의 순서를 보장하..

Tistory

[Kafka] 카프카 프로듀서

카프카 프로듀서 프로듀서는 카프카 프로듀서 API를 포함하여 구성된 애플리케이션을 마라혀 브로커에 특정 토픽의 파티션에 메시지를 전달하는 역할을 합니다. 프로듀서가 전달하는 메시지의 구조는 다음과 같습니다. Topic (토픽) Partition (특정 파티션 위치) Timestamp (생성 시간) Header (헤더) Key (키) Value (값) 카프카 서버에 메시지를 전송하는 책임을 가지고 있으며 데이터를 전송하기 위한 전략을 가지고 있다. 재시도는 어떻게 할 것 인지 데이터 전송 시 Compression은 어떻게 할 것 인지 데이터 전송 시 Serializer는 어떤것을 사용할 것인지 어떤 Partition으로 데이터 전송을 할 것인지 Compression (압축) 메시지 압축 옵션을 사용하였다면..

Tistory

[Web Hacking] Challange 24 풀이

https://webhacking.kr/challenge/bonus-4/ view-source 방법 extract 함수로 변수 추출을 하는데 SERVER와 COOKIE를 변수로 추출한다. 여기서 서버는 헤더 정보, 쿠키는 쿠키 정보를 가지고 있는데 쿠키에 REMOTE_ADDR 키를 가진 값을 생성한다. 그리고 나서 string replace를 함수들을 통과 했을 때 127.0.0.1 이 나오도록 쿠키 값을 수정해준다. 정답 값은 "112277...007.....007.....1"

Tistory

[Web Hacking] Challange 54 풀이

https://webhacking.kr/challenge/bonus-14/ x = new XMLHttpRequest(); var results = [] function callback(res) { results.push(res); } x.onreadystatechange = () => { if (x.readyState === 4) { callback(x.response); } }; for(i=0;i

Tistory

[MySQL] Show Index

SHOW INDEX Statement SHOW {INDEX | INDEXES | KEYS} {FROM | IN} tbl_name [{FROM | IN} db_name] [WHERE expr] mysql> SHOW INDEX FROM City\G *************************** 1. row *************************** Table: city Non_unique: 0 Key_name: PRIMARY Seq_in_index: 1 Column_name: ID Collation: A Cardinality: 4188 Sub_part: NULL Packed: NULL Null: Index_type: BTREE Comment: Index_comment: ***************..

Tistory

Jetbrains IDE용 Git 팁

Push 하지 안았고 Commit만 한 상태에서 변경 사항이 있다면 Undo Commit을 활용 다시 Changes 리스트로 복구할 수 있다. 또한, Commit 메시지 수정이 필요하다면 다음처럼 수정을 할 수도 있다.

Tistory

[Web Hacking] Challange 15 풀이

https://webhacking.kr/challenge/js-2/ 페이지 소스를 보면 alert 창 띄우고 document location을 /으로 이동 시키도록 되어있다. url 주소를 뒤에 ?getFlag 추가하여 접속

Tistory

[Web Hacking] Challange 26 풀이

https://webhacking.kr/challenge/web-11/ view-source 소스 코드를 보면 $_GET['id']로 url query id 값을 가져와서 preg_match 확인 후 admin 글자가 있다면 exit 하도록 되어 있다. 그 다음줄에서 urldecode를 진행 하니 ASCII 코드표를 확인 후 URL Encoding을 한다. 한번만 인코딩 하면 접속시 'admin'으로 변경 되니 두번 인코딩 하여 ?id=%2561%2564%256d%2569%256e으로 접속

Tistory

[보안] Cookie bomb attack

Cookie Bomb Attack Cookie Bomb는 비정상적인 크기의 쿠기 값으로 생성하여 공격하는 방법. 일반적인 HTTP Request 프로토콜에서는 Request/Respons로 나누어지고 각각 Header/Body로 나누어진다. 그 중에 Request Header가 너무 클 경우 413(Request Entity Too Large) 혹은 400(Bad Request) 에러를 발생 시킨다. 공격을 해소하기 위해서는 Client 쿠키가 초기화 하지 않는 이상 계속 이어진다. 많이 사용 되는 Web Server의 Header 허용 사이즈 Web Server Size Nginx 4KB ~ 8 KB Apache Web Server 8KB Tomcat 8KB ~ 48KB 공격 방법 XSS나 유저 트래킹..

Tistory

[Web Hacking] Challange 16 풀이

https://webhacking.kr/challenge/js-3/ Challenge 16 * 페이지 소스 코드를 보면 mv함수에서 document location을 이동시키는 부분이 있다. Console에서 mv(124) 입력하면 된다.

Tistory

[Python] 파이썬 Thread and Pool Manager

[Python] 파이썬 Thread and Pool Manager GitHub 주소 https://github.com/sanggi-wjg/py-thread-manager 코드 import os from pool_manager import PoolManager def calculate(x): print(f"[{os.getpid()}] func: {x}\t\t", r := x ** 5 ** 2, flush=True) return r manager = PoolManager() manager.add_task(calculate, [i for i in range(2, 22)]) manager.run_map() manager.add_task(calculate, [i for i in range(2, 22)]) mana..

Tistory

[보안] XSS HTML Image 태그 주의할 점

[보안] HTML Image 태그 주의할 점 회사를 다니며 상용 서비스를 운용과 개발을 해왔는데, 그 길지도 않은 기간동안 악의적인 목적으로 혹은 학습 목적으로 보이는 경우의 운용중인 서버를 바라보는 공격적인 행위가 있었다. 그 때의 추억을 되새기며 몇가지 간단한 것들에 대해서 한번 정리 해볼려고 한다. 이미지 파일에 스크립트를 삽입하는 방법 샘플 예시 https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/ How To Bypass CSP By Hiding JavaScript In A PNG Image Hide a malicious JavaScript library in a PNG image and tweet it, then include it in..

Tistory

[보안] XSS HTML Image 태그 주의할 점 - 2

[보안] HTML Image 태그 주의할 점 - 2 route 및 controller 작성 path("something.png", SomethingView.as_view()) class SomethingView(View): def get(self, request, *args, **kwargs): print(request.headers) print(request.GET) return HttpResponse(status=204) HTML Image 작성 해당 이미지가 출력되는 곳에서 local storage에 xxx 키값으로 저장되어 있는 값을 가져오고자 한다. 결과 만약 local storage, cookie 등의 비휘발성의 데이터가 사용자 Client에 저장되어 있고 특정 키 값을 추적하여 확인한다면 서..

Tistory

[Locust] 1. Locust 부하 테스트 툴(load testing tool)

Locust란? https://locust.io/ https://docs.locust.io/en/stable/ Locust는 오픈 소스로 제공하는 부하 테스트 툴 프레임워크. 매우 간단한 소스코드를 통해 기능을 수행할 수 있고 제공해주는 설정들을 통해서 유저 수량 지정 테스트 등 다양한 테스트를 진행 할 수 있음. 간단한 개발과 설정으로 빠르게 테스트를 할 수 있는 환경을 갖출 수 있음. 설치 pip install locust 실행 locust.conf locustfile = locust_impl.py expect-workers = 5 host = http://localhost:8000 users = 10 spawn-rate = 10 run-time = 1m locust_impl.py from locus..

Tistory

[Locust] 2. Locust를 통한 언어와 프레임워크 별 테스트

테스트용 Locust 설정 locust.conf locustfile = locust_impl.py headless = true expect-workers = 5 host = http://localhost:8000 users = 10 spawn-rate = 10 run-time = 30s locust_impl.py from locust import task, FastHttpUser class TargetURL: ROOT = "/" STRING = "/string" JSON = "/json" CALC = "/calc" class LocustImpl(FastHttpUser): @task def root(self): self.client.get(TargetURL.ROOT) @task def string(self..

Tistory

[Code Execution API] 1. 프로그래밍 코드 실행 API 만들어보기

1. 프로그래밍 코드 실행 API 만들어보기 구글에서 online python 등을 검색하거나 코딩 테스트 등 웹에서 코드를 실행 가능한 서비스를 제공해 주는 웹 페이지들이 있는데 한번 궁금해서 구현을 해보았다. 개발한 프로젝트 Github 주소 (https://github.com/sanggi-wjg/my-ide-java) 2. 개발 스펙 선택과 제공할 언어 선택 개발 진행을 위해서는 우선 API 개발 언어와 프레임워크 등과 기능 제공할 언어와 정해야 하는데 하기처럼 정해서 진행했다. API 개발 Java 17 (correto) Spring boot 3.0.2 JPA Hibernate 6.1.6 제공할 언어 Python 3.8 Python 2.7 Php 8.2 Php 7.4 Gcc 4.9 Java (예정..

Tistory

[Python] 파이썬 출력 문자 색 변경하기

[Python] 파이썬 출력 문자 색 변경하기 (Python print with color) 파이썬 문자 혹은 데이터 출력시에 색깔과 함께 이미지처럼 출력하는 방법 GitHub 주소 https://github.com/sanggi-wjg/color_print Install pip install colorful_print Usage 1 import sys from colorful_print import color a = [1, 'a', 2.3] b = (4, 'b', 5.6) color.black('Print Black', a, b) color.red('Print Red', a, b) color.green('Print Green', a, b) color.yellow('Print Yellow', a, b) c..

Tistory

[Ubuntu 20.04] OpenVPN Server Docker 설치 및 Client

[Ubuntu 20.04] OpenVPN Server Docker 설치 및 Client Server Side 우분투 패키지 설치 apt update && apt upgrade --y apt install openssl easy-rsa net-tools docker.io Docker로 설치 및 실행 OVPN_DATA="ovpn-data" docker volume create --name $OVPN_DATA # Download the OpenVPN server docker image file with the argument to set it to use your server’s(host) public IP address or your domain name via UDP protocol docker run -..

Tistory

[Kafka] Python confluent Kafka 설치 및 테스트

[Kafka] Python confluent Kafka 설치 및 테스트 테스트 및 설치 환경은 Mac에서 진행 하였습니다. Zookeper와 Kafka Cluster docker-compose.yml version: '3' services: zookeeper: image: confluentinc/cp-zookeeper:7.3.0 hostname: zookeeper container_name: zookeeper environment: TZ: Asia/Seoul ZOOKEEPER_SERVER_ID: 1 ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_TICK_TIME: 2000 kafka-1: image: confluentinc/cp-kafka:7.3.0 container_..

Tistory

ChatGTP를 이용한 간단한 Web App 만들기 (python, streamlit)

Python Streamlit을 통해서 간단한 ChatGPT Web App 만들어보기 우선, Streamlit 이란? https://docs.streamlit.io/ streamlit는 주로 데이터 사이언스, 머신 러닝 등에서 사용되는 커스터 마이징 가능한 간단하고 쉽게 웹앱을 만들어주는 오픈 소스이다. 사용할 ChatGPT SDK, Reverse Engineered ChatGPT API https://github.com/acheong08/ChatGPT Python 패키지 설치 pip install revChatGPT pip install streamlit chatgpt_with_streamlit.py 생성 및 실행 streamlit run chatgpt_with_streamlit.py import ra..

Tistory

[Python] Linter 비교

Python Linter Linter 종류와 개요 구 분 flake8 pylint bandit 종 류 linter linter security linter Star 2.3K 4.2K 4.5K 특 징 코드 스타일, 오류 복잡성 검사 코드 스타일, code smell, 오류 등을 검사 unsafe coding 검사 장 점 간단함, 많은 플러그인이 있음 세팅 비용이 flake8 비해 높음 단 점 많은 플러그인을 있음 린트 통과가 flake8 비해 까다로움 다른 개발자들은 어떻게 사용할까 (from Reddit, StackShare) flake8 + pylint 사용하는 경우 flake8 + pylint + bandit 사용하는 경우 (flake8 or pylint) + bandit 사용하는 경우 전자들과 추가..

Tistory

API, 서비스, 도메인 테스트 및 TDD 에서의 기어비

API, 서비스, 도메인 테스트 및 TDD 에서의 기어비 테스트 필요 이유 테스트가 있으면 시스템 변경에 두려움이 적어진다. 하지만, 너무 많은 테스트는 코드 변경마다 테스트 코드도 같이 변경되어야 하는 문제가 있다. 테스트의 목적은 코드 변경에서 시스템의 특성을 강제로 유지하기 위해서다. API 테스트를 작성하면 도메인 모델을 변경할 때 테스트 코드 변경의 양을 줄일 수 있다. 테스트 종류에 따른 얻는 것 구분 API 테스트 서비스 테스트 도메인(모델) 테스트 피드백 적음 - 많음 변경 장벽 낮음 - 높음 테스트 영역 넓음 - 한정 도메인(모델) 테스트 코드와 더 밀접하게 연관되어 작업시 높은 피드백을 받을 수 있다. 테스트 코드를 통해서 도메인에 대한 이해도를 높일 수 있다. API 테스트 더 높은 ..

Tistory

[Kubernetes] OpenLens 설치

[Kubernetes] Mac M1에서 OpenLens 설치 OpenLens 설치 brew install --cask openlens (https://github.com/MuhammedKalkan/OpenLens) Extension 설치 플러그인 설치 @alebcay/openlens-node-pod-menu 설치가 되면 종료 후 Reload

Tistory

[Python] Object class __slots__를 이용한 성능 개선

[Python] Object class __slots__를 이용한 성능 개선 0. 개요 Python에서는 Object attribute에 대해서 메모리는 더 적게 사용, 접근 속도는 더 빠르게 하는 방법이 있습니다. 바로, __slots__ 를 사용하는 방법 입니다. 기본적으로 Python은 객체 인스턴스 속성을 Dict를 사용 생성하며 Dict 형은 메모리를 추가적으로 필요로 합니다. slots 을 사용 하는 경우 class는 __dict__, __weakref__ 생성을 하지 않습니다. It restricts the valid set of attribute names on an object to exactly those names listed. Since the attributes are now fi..

Tistory

[Python] lru_cache

[Python] lru_cache 0. 개요 LRU(Last Recently Used) 는 운영체제 OS에서 메모리 관리에서 Page 교체에서 사용되는 알고리즘 중 하나로 가장 오랫동안 사용하지 않은 것을 교체하는 방식입니다 알고리즘 설명 : https://www.geeksforgeeks.org/lru-cache-implementation/ Python에서는 @lru_cache 로 데코레이터로 기능을 제공해주고 있습니다. 1. 기대 효과 Memorization 으로 추가 계산 감소 CPU-Bound 감소 2. Sample Code lru_cache 데코레이터는 실행 함수에 3가지 함수를 추가합니다. 사용 방법은 @lru_cache(maxsize=128, typed=False) maxsize : lru_c..

Tistory

알림 서비스 디자인

알림 서비스 설계 우리는 왜 알림 서비스가 필요한 이유. 많은 서비스들은 OTP, Email, SMS 등을 통해 알림 서비스를 사용중 이다. 금융기관: 사용자에게 비용에 관한 정보 제공. 이커머스: 사용자에게 주문에 관한 정보 혹은 구독 서비스 등에 대한 정보 제공 플랫폼: 사용자에게 구독, 뉴스, 정보 등에 대한 정보 제공. 기능 요구사항 구독한 사용자에게 알림을 보낼 수 있어야 한다. 우선순위 알림이 가능해야 한다. OTP 같은 경우 시간 이슈가 있기 때문에 높은 우선 순위로 고려 되어야 한다. 반대로, 뉴스 등은 낮은 우선 순위로 되어도 된다. Email, SMS, Mobile, Web, Hook 등 알림이 가능 해야 한다. Single/Bulk로 처리할 수 있는 기능이 있어야 한다. 같은 알림을 ..

Tistory

[Python] Concurrency 어떤 경우에 어떤 것을 사용하는게 좋을까 - 1

어느 상황에 어떤 Concurrency API를 사용하는게 좋을까 우리는 평소 개발 업무를 하면서 최대한 Response latency, Memory Usage 등을 줄이기 위해 노력을 한다. 예를 들어, ORM을 사용하는 경우 N+1 이나 1+N+a 등 Query Fetch를 줄이거나 또는, Algorithm을 이용해 시간복잡도를 최대한 적게 할려고 하는 등 말이다. 그럼 Python에서 비동기 소스를 개발할 때는 어떠한 경우에 어떻게 해야 좋은지 알아보자. 우선 Python이 제공하는 concurrency API는 다음과 같다. Coroutine: asyncio module Thread: threading module Process: multiprocessing module 이 3가지의 module ..

Tistory

[Python] Concurrency PDF 파일 생성 - 2

PDF 파일 생성 PDF 파일 생성은 비동기 I/O 작업이다. 평벙하고 쉽게 누구나처럼 그냥 함수 혹은 클래스 작성해서 반복문으로 구현할 수도 있지만, 정말로 업무가 급하고 그런게 아니라고 한다면, 빠르게 동작을 할 수 있도록 하자. Sample Data와 Package import random import uuid from threading import Thread from faker import Faker from fpdf import FPDF fake = Faker() class Person: # slots는 Class attr에 빠른 접근 및 제어, 적은 메모리 사용에 이점이 있다. __slots__ = ['name', 'age', 'location'] def __init__(self, name:..

Tistory

[Python] Concurrency Thread Decorator - 3

[Python] Concurrency Thread Decorator Thread Decorator 정말로 간단한 함수들을 Thread를 사용하기 위해 계속 같은 코드를 구현하는 것을 피곤하다. 다행히도 Python은 Decorator 기능이 있다. Decorator기능을 활용해서 간단한 비동기 I/O 함수들은 Thread로 동작하도록 하자. HTTP Reqeust는 Thread 보다는 async await를 활용한 Coroutine으로 작성하고 안에는 꼭 비동기를 지원하는 패키지를 사용하자. def using_thread(func: Callable): def decorator(*args): th = Thread(target=func, args=(*args,)) th.start() return th ret..

Tistory

[Mac] 사용 중인 Port 찾기, Kill 하기

[Mac] 사용 중인 Port 찾기, Kill 하기 Find lsof -i :포트번호 lsof -i :8000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME Python 85659 raynor 8u IPv4 0xfd2c93d6aaa5021b 0t0 TCP localhost:irdmi (LISTEN)Kill kill -9 :PID kill -9 85659현재 Open Port 리스트 lsof -i -P | grep -i "listen"

Tistory

[Go] Int, String, Struct 정렬

Input package sorts import ( "fmt" "sort" ) type person struct { name string age int loc *location } type location struct { nation string city string } func newPerson(name string, age int, nation, city string) *person { return &person{ name: name, age: age, loc: &location{ nation: nation, city: city, }, } } func SortStructMain() { // Integer 정렬 numbers := []int{1, 3, 4, 2, 5} slice := sort.IntSl..

Tistory

[Go] Channel 이용한 Queue

package channel import ( "fmt" "math/rand" ) const QUEUE_SIZE = 20 var queue = newChannelQueue(QUEUE_SIZE) type ChannelQueue struct { data chan any } func newChannelQueue(size int) *ChannelQueue { return &ChannelQueue{ data: make(chan any, size), } } func (q *ChannelQueue) get() any { return

Tistory

[Go] Factory Pattern(팩토리 패턴) 구현

Factory Pattern 운송업체별로 물리 프린터기 출력용지나 출력물 등 달라지는데 여기서는 물리 프린터기에서 출력을 위한 데이터를 팩토리 패턴으로 구현 하였다. PrineterMethod Interface 구현 EMSPrinter, SFPrinter struct 구현 → GetOuput() 구현 Create() 를 통해서 new() 로 사용할 Prineter를 Create and Return Return Struct의 GetOuput() 메소드를 통해 결과값 Return factory.go package factory import ( "errors" "fmt" ) const ( EMS_CODE = "EMS" SF_CODE = "SF" ) type PrinterMethod interface { Get..

Tistory

[Go] Time

Golang Time 패키지 Time struct type Time struct { wall uint64 ext int64 loc *Location } Time 생성 방법 time.now() time.Date(year int, month Month...) time.Unix(sec int64, nsec int64) Time Test func TestTime(t *testing.T) { now := time.Now() t.Log(now) // 2022-08-02 11:14:48.8866312 +0900 KST m=+0.002534901 nowFormat := time.Now().Format("2006-01-02 15:04:05") t.Log(nowFormat) // 2022-08-02 11:17:33 (ht..

Tistory

[Redis] 활용 방법

Redis 사용 Look Aside Redis Cache에 데이터가 있는지 확인 데이터가 있다면(Cache Hit) 해당 데이터 Return 데이터가 없다면(Cache Miss) DB에서 Fetch 해당 데이터 Redis Cache 저장 해당 데이터 Return 특징 실제 사용중인 데이터만 Cache Redis 장애가 치명적인 영향을 미치지 않음 Cache Miss가 많은 경우 DB Query를 계속 실행하기 때문에 비효율적일수도 있음 Update 등 최신 데이터가 동기화 되지 않음 Write Through 특징 DB 데이터 작성할 때마다 데이터를 Redis Cache에 추가, 업데이트 Cache는 최신 데이터를 유지 가능하지만 DB와 Redis 두번의 과정을 거쳐 수행 시간이 증가 (Insert, Up..

Tistory

[Go] Linked List 구현

package datastruct import ( "fmt" ) type LinkedList struct { Head *Node Tail *Node Size int } type Node struct { Data any Next *Node } func NewLinkedList() *LinkedList { return &LinkedList{ Head: nil, Tail: nil, Size: 0, } } func newNode(value any) *Node { return &Node{ Data: value, Next: nil, } } func (list *LinkedList) Lpush(value any) { node := newNode(value) if list.Head == nil { list.Head =..

Tistory

[Python] 음성인식(Speech Recognition) 과 TTS 구현 - 3

TTS with FastAPI FastAPI에서 TTS 구현 app/api/tts.py DB exist 체크로 생성되지 않았던 tts파일만 생성 하도록 되어있는데 사용량이 많다고 한다면 Insert가 많아지니 당연히 DB에 부담이 갈수 있다. 따라서, Redis Set로 저장하고 체크하는 것이 더 효율적으로 보인다. @router.get("/tts/{text}", response_class = FileResponse) async def get_tts_mp3(text: str, db: Session = Depends(get_db)): if not tts_record_repo.is_exist_tts_record(db, text): tts_record_repo.create_tts_record(db, text)..

Tistory

[Go] File 정보 확인

Go File 정보 확인 package file import ( "fmt" "os" "runtime" "syscall" "time" ) const FILE_PATH = "data/big_data.txt" type myFile struct { file *os.File } func newMyFile(file *os.File) *myFile { f := myFile{ file: file, } return &f } func (f *myFile) showStat() { stat, err := f.file.Stat() if err != nil { panic(err) } /* type FileInfo interface { Name() string // base name of the file Size() int64 /..

Tistory

[Go] Panic recover 하기

package recovery import ( "errors" "fmt" ) func panicRecover() { defer func() { r := recover() fmt.Println("Recover panic: ", r) }() panic(errors.New("something is wrong...")) // unreachable // fmt.Println("panicRecover() is done.") } func RecoveryMain() { fmt.Println("START!") panicRecover() fmt.Print("RecoveryMain() is done.") } /* START! Recover panic: something is wrong... RecoveryMain() is ..

Tistory

[Redis] 간단 개요

Redis 관리자 Server OS Linux 환경이 Best kernel overcommit memory setting 추가 vi /etc/sysctl.conf vm.overcommit_memory = 1 저장 다음 reboot * Set kernel feature Transparent Huge Pages가 Redis memory 사용과 지연에 영향을 미치지 않도록 추가 ```shell echo never > /sys/kernel/mm/transparent_hugepage/enabled Memory RAM과 swap memory가 동일하도록 설정. 만약 설정이 되어 있지않다면 Redis가 너무 많은 메모리를 소모함에 따라 OOM 발생할 수도 있음. maxmemory option을 적절하게 설정. 만약 ..

Tistory

[Redis] Command

redis-cli Command https://redis.io/docs/manual/cli/ # 접속 docker exec -it demo-redis redis-cli # 모니터링 docker exec -it demo-redis redis-cli monitor # 기타 docker exec -it demo-redis redis-cli info docker exec -it demo-redis redis-cli help docker exec -it demo-redis redis-cli --bigkeys # Scanning the entire keyspace to find biggest keys as well as # average sizes per key type. You can use -i 0.1 to s..

Tistory

[Go] variable type별 printf format

func main() { var num1 int = 10 var num2 float32 = 3.2 var num3 complex64 = 2.5 + 8.1i var s string = "Hello, world!" var b bool = true var a []int = []int{1, 2, 3} var m map[string]int = map[string]int{"Hello": 1} var p *int = new(int) type Data struct{ a, b int } var data Data = Data{1, 2} var i interface{} = 1 fmt.Printf("정수: %d\n", num1) // 정수: 10 fmt.Printf("실수: %f\n", num2) // 실수: 3.2 fmt...

Tistory

Git Commit Message Convention 정리

Git Commit Convention and Useful Commit Message 1. Commit Message Convention의 필요 협업에 용이 기록 확인 용이 과거 이슈 추적이나 이슈 진행사항 확인 2. Commit Message 작성 방법 Type : Subject Body Footer 2.1 Type Feat : 기능 추가 HotFix : 긴급 버그 수정 Fix : 버그 수정 Build : CI/CD 관련 수정 Docs : 문서 추가, 수정, 삭제 Refactor : 리팩토링 Test : 테스트 코드 추가, 수정, 삭제 ETC : 기타 사항 2.2 Subject 제목의 길이는 최소화하고 마침표 없이 끝냄 명령문으로 작성 제목과 본문은 한 줄 띄워서 작성 Type : Subject 작성 ..

Tistory

[Go lang] Excel 읽기, 쓰기

[Go lang] Excel 읽기, 쓰기 go get github.com/xuri/excelize/v2 Excel Read package excel import ( "fmt" "github.com/xuri/excelize/v2" ) func ExcelReadMain() { f, err := excelize.OpenFile("sample/excel/sample_read.xlsx") if err != nil { panic(err) } defer f.Close() sheets := f.GetSheetList() sheet := sheets[1] rows, err := f.GetRows(sheet) if err != nil { fmt.Println(err) } for i, row := range rows { f..

Tistory

[Python] Thread와 Async를 이용한 비동기 방법

Python Thread와 Async를 이용한 비동기 방법 이후 Client에서 Request 보낼 Server의 소스는 다음과 같다. @router.get("/second") async def second(): return { "second": random.randint(1, 100), } 그리고 일반 함수를 생성해서 Server로 Request 했을 때, 약 20초 걸린다. import datetime import requests def second_request(): resp = requests.get("http://localhost:8090/second") start = datetime.datetime.now() for _ in range(0, 10): second_request() print(d..

Tistory

[Python] 음성인식(Speech Recognition) 과 TTS 구현 - 1

Python Speech Recognition 방법 파이썬에서 음성 인식 하는 방법. 음성 인식을 기술을 활요하여 이미 아마존 알렉사, 카카오 미니 등 다양한 제품들이 현재 집에서 서비스를 하고 있다. 그럼 음성인식이란 어떤것이고 어떻게 작동을하고 간단한 개요를 확인하고 파이썬에서 음성인식과 TTS를 활용하여 간단한 데모를 구현 해보자 1. 음성인식 개요 음성인식은 1950년대 Bell Labs에서 연구의 기초를 둔다. 처음에는 한명의 말과 수십개 정도의 단어 정도에서 였지만 현재는 수많은 사람의 말과 수많은 언어의 단어를 인식 한다. 작동 방법 → Physical Sound with Microphone → Electrical Signal → Digital Data with Analog-to-Digita..

Tistory

[Python] 음성인식(Speech Recognition) 과 TTS 구현 - 2

Python TTS 방법 TTS(Text to Speech) 기술은 유튜브, 트위치 등 인터넷 방송 뿐만 아니라 네이버, 구글 번역 사이트 등 발음 기능 등으로 웹 서비스로도 많이 사용 되는데 TTS는 어떻게 작동 되는지 한번 알아보자. 1. TTS 개요 TTS는 머신 러닝 등을 이용하여 텍스트에서 인간의 발언으로 구현해주는 것이다. TTS를 이용하여 메뉴얼 녹음이라든지 회사 비지니스 관점에서 시간이나 돈 등을 절약할 수 있는데 https://github.com/pndurette/gTTS TTS 구현 방법 연결 (Concatenative) 방식 녹음된 오디오의 조각을 이어 붙이는 방식으로 매우 고품질을 제공하지만 머신 러닝을 위해서 많은 데이터가 필요하다. 매개변수 (Parametric) 방식 주어진 텍..

Tistory

[Go] 대용량 파일 chunk 단위로 나누기

Go lang으로 대용량 파일 chunk 단위로 나누기 Go lang으로 대용량 파일에 대해서 chunk 단위로 나누어 보자. 나누기 위해서 우선 대용량 파일을 생성한 후 나누기를 진행 할 것이다. 대용량 파일 생성 파일 나누기 1. 대용량 파일 생성 package main import ( "fmt" "math" "os" "runtime" "strconv" "time" ) const MAX_CONCURRENT_JOB = 10 const NUMBER_OF_UNORDERED = 100000000 const BIG_DATA_ROOT = "data" const BIG_DATA_FILE_PATH = "data/big_data.txt" const FILE_CHUNK_SIZE = 10 * (1

Tistory

[Python] 후위표기법(postifx) 계산 코드

후위표기법(postfix) 계산 코드 from typing import List, Optional class Profit(object): __slots__ = ['subject_name', 'profit_value'] def __init__(self, subject_name: str, profit_value: float): self.subject_name = subject_name self.profit_value = profit_value def find_profit_by_subject_name(profits: List[Profit], subject_name: str) -> Optional[Profit]: for p in profits: if p.subject_name == subject_name: re..

Tistory

Ubuntu 20.04 고정 IP 할당 방법

Ubuntu 20.04 고정 IP 할당 방법 개요 DHCP 로 설치 했을 경우 네트워크 설정 yaml 파일 : /etc/netplan/xx.yaml 경로 (이름은 상이할 수 있음) 변경 전 # This is the network config written by 'subiquity' network: ethernets: ens160: dhcp4: true version: 2 변경 후 이더넷 인터페이스 이름은 꼭 확인 필요 (인터페이스 이름은 ifconfig 명령어로 확인 가능) network: ethernets: ens160: # 이더넷 인터페이스 이름 (확인 필요!) dhcp4: no dhcp6: no addresses: [192.168.10.85/24] # 원하는 IP 주소 gateway4: 192.16..

Tistory

[Python] DTO, Dataclass Validate 방법

Validate Class Attributes in Python Python에서 DTO, Data Class로 사용하는 Class를 Validation 하는 여러 방법을 알아보자 1. Validation method 사용 간단한 방법으로 __init__ 메소드에서 validate 하는 방법이다. 만약 유효하지 않다면 ValueError Exception 처리 될것이다. class Person(object): def __init__(self, id: int, name: str, age: int): self.id = id self.name = self._clean_name(name) self.age = self._clean_age(age) def _clean_name(self, name: str): if n..

Tistory

Golang

Go Go 소개 2007년 구글에서 개발을 시작하여 2012년 GO 버젼 1.0을 완성. (현재 1.17 까지 realase) 디자인은 로버트 그리즈머, 롭 파이크, 케네스 톰슨 (대학교 전공 서적에 나오는 사람, C언어 만든 사람) 이 진행 Using at Use cases https://go.dev/solutions/#case-studies 특징 컴파일 언어 정적 타이핑 언어 함수형 언어 빠른 속도 일차적 개발 목적은 시스템 프로그래밍 직접 개발하면서 느낀 장점과 단점 장점 Go 는 문법이 매우 간단하고 배우기 쉽다 문법은 C++, Java, Python 장단점 섞어 놓은 느낌 동시성 기능 구현 쉬움 배포 Architecture 관점에서 진짜 진짜 쉬운 배포 모든 Go 프로젝트는 누가 개발하든 모두 ..

Tistory

Github Action

Github Action Github Action 개요 Github action 은 github에서 공식적으로 제공하는 work flow 자동화 툴. github repo 안에서 .github/workflows 경로에 yml 파일 작성으로 생성. Github Action 구성 다음 6가지의 개념으로 구성 되어 있음 Workflows Events Runners Jobs Steps Actions 워크 플로우(workflows) 자동화된 프로세스 단위. 하나 이상의 job으로 이루어져 있으며 설정한 이벤트에 의해 실행된다. 이벤트(Events) 워크 플로우를 실행하는 특정 활동이나 규칙이다. 커밋의 push, pull request가 생성 되었을 때뿐만 아니라 Github 외부에서 발생하는 활동으로도 이벤트를..

Tistory

Python 에서 go 함수 사용 하는 방법

Python With Go Python 은 쉽고, 깔금하고, 독립적이며, 짧은 시간안에 개발을 할 수 있으며, 수많은 라이브러리들을 사용 할 수 있다는 점에서 좋은 언어 이다. 다만, 파이썬의 장점의 모든 것들은 속도 라는 대가를 가진다. (numpy 같은 c 라이브러리 제외 하고는...) pypy 나 pyc 등에 속도 향상을 대체도 있지만 실제 사용해보면 현실은 녹록치 않다. Go to Python Go 에서는 Go 를 C에 연결을 혹은 C를 Go에 연결을 도와주는 라이브러리를 제공한다. https://golang.org/cmd/cgo/ Python 에서는 C 모듈을 가져와서 사용 할 수있는 기능이 있기 때문에 Go도 마찬가지로 사용이 가능하다. Go .so 파일 만들기 import "C" 와 사용 할..

Tistory

[MySQL] binlog to SQL(텍스트) 변환

[MySQL] binlog to SQL 변환 /usr/local/mysql/bin/mysqlbinlog mysql-bin.xxxxxx > binlog.xxxxxx.sql vi binlog.xxxxxx.sql

Tistory

[백준] 1697 파이썬(python)

문제 https://www.acmicpc.net/problem/1697 1697번: 숨바꼭질 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 www.acmicpc.net 문제 풀이 import sys from collections import deque n, k = map(int, sys.stdin.readline().split()) MAX = (10 ** 5) def bfs(root, find): distance = [0] * (MAX+1) queue = deque([root]) while queue: x = queue.pople..

Tistory

[백준] 2468 파이썬(python)

문제 https://www.acmicpc.net/problem/2468 2468번: 안전 영역 재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는 www.acmicpc.net 문제 풀이 import collections import sys dx = [0, 1, 0, -1] dy = [-1, 0, 1, 0] N = int(sys.stdin.readline().strip()) MAX_VALUE, MIN_VALUE = 0, 0 maps = [] for _ in range(N): case = list(map(int, sys.stdin.readline().split())) MIN..

Tistory

[백준] 4963 파이썬(python)

문제 https://www.acmicpc.net/problem/4963 4963번: 섬의 개수 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 w와 높이 h가 주어진다. w와 h는 50보다 작거나 같은 양의 정수이다. 둘째 줄부터 h개 줄에는 지도 www.acmicpc.net 문제 풀이 import collections import sys dx = [-1, 0, 1, 1, 1, 0, -1, -1] dy = [-1, -1, -1, 0, 1, 1, 1, 0] def bfs(graph, y, x): graph[y][x] = 0 queue = collections.deque([(y, x)]) while queue: yy, xx = queue.popleft() for..

Tistory

[Python] __slots__ method

slots 기본적으로 파이썬에서는 객체의 인스턴스 속성을 저장하기 위해서 dict 를 사용 하는데 이를 통해 런타임 중 속성을 변경할 수 있다. 하지만 dict 는 메모리를 낭비하는 경향이 있다. slots를 사용하는 경우 두가지 효과가 있다. 속성에 대한 빠른 접근 class Normal(object): pass class UsingSlots(object): __slots__ = ['name'] normal = Normal() use_slots = UsingSlots() def fn_set_get_delete(cls): def set_get_delete(): setattr(cls, 'name', 'foo var') getattr(cls, 'name&#3..

Tistory

[백준] 7569 파이썬(python)

문제 https://www.acmicpc.net/problem/7569 7569번: 토마토 첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100, www.acmicpc.net 문제 풀이 import collections import sys M, N, H = map(int, sys.stdin.readline().split()) tomato = [[] for _ in range(H)] queue = collections.deque([]) for h in range(H): for y in range(N): temp = list(map(int, s..

Tistory

[백준] 9372 파이썬(python)

문제 https://www.acmicpc.net/problem/9372 문제 풀이 import collections import sys T = int(sys.stdin.readline()) def bfs(graph, i, visited, count): # visited[i] = 1 queue = collections.deque([i]) while queue: node = queue.popleft() if visited[node] == 0: visited[node] = 1 count += 1 queue.extend(graph[node]) return count for _ in range(T): N, M = map(int, sys.stdin.readline().split()) graph = [[] for _..

Tistory

[백준] 11403 파이썬(python)

문제 https://www.acmicpc.net/problem/11403 11403번: 경로 찾기 가중치 없는 방향 그래프 G가 주어졌을 때, 모든 정점 (i, j)에 대해서, i에서 j로 가는 경로가 있는지 없는지 구하는 프로그램을 작성하시오. www.acmicpc.net 문제 풀이 import sys N = int(sys.stdin.readline()) maps = [list(map(int, sys.stdin.readline().split())) for _ in range(N)] for k in range(N): for y in range(N): for x in range(N): if maps[y][k] and maps[k][x]: maps[y][x] = 1 for m in maps: print(' ..

Tistory

[Python] 파이썬 비동기 I/O

비동기 I/O 개발 업무를 하면서 실제 코드 자체보다는 코드에 필요한 데이터를 얻어오는 작업이 병목이 생기는 것을 많이 겪었을 것이다. 이런경우 프로그램 I/O 위주라 하고 I/O 효율이 속도를 제한 한다는 것을 의미한다. I/O는 프로그램 흐름에 큰 영향을 미친다. 파일이나 네트워크 소켓 연결을 통해 데이터를 읽을 때까지 실행을 멈추고 커널에 연산을 요청한 후 끝날때 까지 기다려야 하기 때문이다. 비동기 I/O를 활용하면 I/O 연산을 기다리는 동안 다른 연산을 수행하여 유휴 시간을 활용할 수 있다. 작업1,2,3 을 순차적으로 실행한다면 지연을 세번 감수해야 하지만 세 작업을 동시에 실행한다면 시간을 감소할 수 있을 것이다. 파이썬에서는 제너레이터 기반의 Coroutine과 async 함수로 Nati..

Tistory

[Python] 파이썬 multiprocessing

multiprocessing 파이썬은 기본적으로 여러 CPU를 사용하지 않는다. 단일 코어 시대에 설계 되었고 병렬 처리를 효율적으로 실행하기가 어렵기도 하다. 로직을 병렬화하면 N배의 속도를 기대하지만 실제로는 프로세스간 통신 비용이 발생 등 N배 만큼에 성능 향상이 이루어지지는 않는다. 또는 어떻게 설계하냐에 따라서 오히려 더 느려지는 경우도 있기 때문에 설계를 잘 해야한다. multiprocessing 모듈은 프로세스와 스레드 기반의 병렬 처리를 사용해 작업 대기열을 분산시키고 프로세스 간에 데이터를 공유할 수 있도록 한다. 작업을 병렬화 하려면 순차적으로 작성하는 방식과는 달리 다른 관점으로 작성을 해야하며 일반적으로 디버깅이 어렵다. 따라서 성능도 중요하지만 유지보수 측면에서 단순하게 작성을 해..

Tistory

[Python] __new__ method

파이썬 Magic Method https://docs.python.org/ko/3.7/reference/datamodel.html#special-method-names new 인스턴스 생성시 호출되며 Static method 이다. 일반적인 구현은 super().new(cls) 로 인스턴스 생성후 Return 전에 필요한 작업을 함 만약 인스턴스를 Return 하지 않는다면 init 은 호출되지 않는다. class Sample(object): def __new__(cls, *args, **kwargs): print('new', args, kwargs) this = super().__new__(cls) cls.args = args cls.kwargs = kwargs return this def __init..

Tistory

[Python] 프로파일링 cProfile, memory_profiler

프로파일링으로 병목지점 찾기 cProfile 감으로 코드를 작성하는 습관을 버리고 가설을 세우고 프로파일링을 통한 검증으로 코드를 작성해라. 이는 시간을 투자 할만한 가치가 충분하고 코드 작성의 근거가 될 수 있다. cProfile 테스트 테스트 코드 피보나치 수열을 dp와 recursion 으로 구현한 함수 def fibonacci_dp(n): dp = [0, 1] for i in range(2, n + 1): dp.append(dp[i - 1] + dp[i - 2]) return dp[n] def fibonacci_recursion(n): if n python -m cProfile -s cumulative High-Performance-Python\2-프로파일링으로-병목지점-찾기\2-1-cProfil..

Tistory

[Python] 리스트(list) 성능

리스트 리스트는 동적 배열로 크기를 자유자재로 조절할 수 있는데 이러한 변경 가능한 특성 때문에 리스트는 메모리와 추가 연산을 필요로 한다. 리스트에 object 추가 시 기존에 object들과 추가되는 object를 새로운 리스트를 추가하여 생성한다. 새로 추가된 리스트의 크기는 기존 N개와 추가되는 1개 더하여 N+1이 아니라 M개 (M > N+1) 의 크기를 가진다. 크기에 여유를 두는 이유는 메모리 할당과 복사 요청 횟수를 줄이기 위하여다. 리스트의 크기 1을 할당한 이후 크기는 동일하다가 5를 할당하니 크기가 커진다. 이는 새로 리스트를 생성한 것. a = [] print('0', sys.getsizeof(a)) a.append(1) print('1', sys.getsizeof(a)) a.app..

Tistory

[Python] 튜플(tuple) 성능

튜플 튜플은 한번 생성되면 내용이나 크기를 변경할 수 없지만 두 튜플을 합칠 수는 있다. >>> t1 = (1,2,3) >>> t2 = (4,5,6) >>> t1 + t2 # (1,2,3,4,5,6) 튜플은 합치면 항상 메모리에 새로운 튜플을 새로 할당 한다. 또 튜플은 여유공간을 할당하지 않기 때문에 자원을 더 적게 사용한다. l = [i for i in range(100000)] t = tuple(l) print('list', sys.getsizeof(l)) print('tuple', sys.getsizeof(t)) list 824464 tuple 800048이 때문에 정적인 데이터를 다룰때는 리스트보다는 튜플이 좋다. 또한 튜플은 정적이기에 리소스 캐싱을 하는데 크기가 ..

Tistory

[Python] 사전(dict) 와 셋(set) 의 성능

사전(dict)과 셋(set) dict와 set은 미리 정해진 순서로 정렬 되지 않는다. dict와 set의 차이점은 set은 key만 가지고 있다는 것이다. 리스트와 튜플은 경우에 따라 검색을 O(logN) 시간 복잡도로 구현할 수 있다. 반면, dict와 set은 O(1)이다. dict와 set은 보통 많은 메모리를 사용한다. 또 해시 함수에 의존 함으로 해시 함수가 느리다면 연산속도도 느릴 것이다. 리스트와 사전 검색 성능 차이 리스트 or 튜플로 구현시 O(N) dict로 구현시 O(1) phonebook_list = [ ("홍길동", "010-1111-1111"), ("김철수", "010-1111-1234"), ("국영수", "010-1234-1234"), ] def find_phonebook_..

Tistory

[Python] 백준 7576 - 토마토

문제 https://www.acmicpc.net/problem/7576 7576번: 토마토 첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토 www.acmicpc.net 문제 해결방법 bfs 로 해결 가능하다. 입력 조건으로 토마토는 1개이상이 들어갈수 있기 때문에 bfs 실행 전에 토마토의 위치를 큐에 넣어줘야 한다. 그 이후에 bfs 함수에서 인접열 방문시에 0(익지않은 토마토) 값이라면 기준열 토마토가 익는데 걸리시간에서 +1일을 해준다. bfs 종료 후 만약 graph 내에 0이 아닌 값이 있다면 -1로 인해서 인접열 방문 실패한 경우..

Tistory

[Python] 백준 11724 - 연결 요소의 개수

문제 https://www.acmicpc.net/problem/11724 11724번: 연결 요소의 개수 첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주 www.acmicpc.net 문제 해결방법 bfs 로 해결 가능 노드별로 방문 결과에 대해 방문결과 값을 업데이트 하고 방문결과가 있는 노드는 skip 하고 방문 안한 노드는 방문해서 총 몇번 반복 되는지 문제 풀이 import sys from collections import deque N, M = map(int, sys.stdin.readline().st..

Tistory

[Python] 검색 방법 profile 해보기

이해하기 어느 search 가 빠르고 느린지 확인 하는 방법 import csv def search_fast(haystack, needle): for item in haystack: if item == needle: return True return False def search_slow(haystack, needle): is_exist = False for item in haystack: if item == needle: is_exist = True return is_exist def search_unknown_1(haystack, needle): return any((item == needle for item in haystack)) def search_unknown_2(haystack, needle..

Tistory

[Airflow] DAGs 생성하기

Pipeline 작성 Before Testing # check ~/airflow/airflow.cfg # dags default 경로 # dags_folder = /root/airflow/dags nano ~/airflow/dags/sample.py from datetime import timedelta, datetime from textwrap import dedent from airflow import DAG from airflow.operators.bash import BashOperator default_args = { 'owner' : 'WMS', 'depends_on_past' : False, 'email' : ['jay_g@kr..

Tistory

[Python] 백준 2667 - 단지번호붙이기

문제 https://www.acmicpc.net/problem/2667 2667번: 단지번호붙이기 과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여 www.acmicpc.net 문제 해결방법 bfs 로 해결 가능 graph[i][j] 가 1인 곳에서 검색을 시작해서 인접한 부분을 찾고 종료시 count return 문제 풀이 import sys from collections import deque N = int(sys.stdin.readline().strip()) boards = [] for _ in range(N): boards.append(list(map(int,..

Tistory

[Python] 백준 1012 - 유기농 배추

문제 https://www.acmicpc.net/problem/1012 1012번: 유기농 배추 차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 www.acmicpc.net 문제 해결방법 bfs 로 해결 가능 graph[y][x] == 1 인 곳에서 검색을 시작하여 인접한 부분을 모두 0으로 변경한 뒤에 count++ 문제 풀이 import sys from collections import deque T = int(sys.stdin.readline().strip()) dx = [0, 0, 1, -1] dy = [1, -1, 0, 0] for _ in range(T): M, ..

Tistory

JWT (JSON Web Token)

Json Web Token JWT 는 요청자/응답자 간에 JSON 객체를 안전하게 전송할 수 있는 간결하고 자기 포함된 개방형 표준(RFC 7519) 정보는 디지털 서명되어 있어 신뢰할 수 있으며 Secret(HMAC 알고리즘), RSA나 ECDSA 를 이용한 public/private 키를 이용하여 서명할 수 있다. JWT 사용 하는 케이스 Authorization JWT를 사용하는 흔한 케이스. 유저 로그인 후, 요청에 대해서 JWT가 포함 될 것이고 이를 통해서 route, service, resource 등 허용/비허용 제한할 수 있다. Single Sign On 은 도메인간에 쉽게 사용 가능하며 작은 자원을 사용해 최근 많이 사용 된다. Information Exchange JWT는 요청/응답간..

Tistory

WEB RTC

Web RTC Web RTC (Web Real-Time Communication)는 웹 브라우저 간에 플러그인의 도움 없이 서로 통신할 수 있도록 설계된 API이다. W3C에서 제시된 초안이며, 음성 통화, 영상 통화, P2P 파일 공유 등으로 활용될 수 있다. 두레이 화상회의도 Web RTC 를 이용해서 구현 되어 있다. 통신 방법 Web RTC 는 P2P 통신에 최적화 되어 있으며 크게 3가지 클래스로 실시간 데이터 교화이 이루어진다. MediaStream - 카메라/마이크 등 데이터 스트림 접근 RTCPeerConnection - 암호화, 대역폭 관리 및 오디오, 비디오 연결 RTCDataChannel - 일반적인 데이터 P2P 통신 위 3가지를 통해서 데이터 교환이 이루어 지며 RTCPeerCon..

Tistory

[Airflow] Ubuntu 20.04 docker-compose 설치

Airflow Concepts Airflow 는 프로그래밍을 통해서 workflows를 작성하고 스케쥴링 하고 모니터링 하는 플랫폼 이다. Airflow 는 Directed Acyclic Graphs(DAGs)을 통해서 workflows를 작성하며 Airflow 스케줄러는 지정된 종속에 따라서 array of workers를 이용하여 Task를 실행 한다. DAG은 tasks 사이에 종속성과 실행될 순서, 재시도를 명시 해야하며, Taks는 무엇을 할지 작성하여야 한다. Strength points Airflow는 Python 기반으로 쉽게 작성 가능하며 콘솔을 통해서 Task 작업 확인과 bottleneck을 찾을때도 유용하다. Install Requirements 적어도 4Gb 이상의 메모리 이상이여..

Tistory

Micro Service Architecture - 6. IPC 2

MSA 프로세스 통신 2 부분 통신 실패 : 회로 차단기 패턴 항상 서비스는 실패할 가능성에 대해 오픈 마인드다. 한개 서비스 호출 불가는 전체 서비스에 대해 영향을 미침으로 서비스 부분 실패가 전체에 영향 가지 않도록 설계를 해야 한다. RPI 프록시 설계 Netflix는 다음과 같이 실패에 대해 처리한다. 네트워크 타임아웃: 응답에 대해 항상 Timeout 설정, 불필요한 리소스 사용 방지 미처리 요청 개수 제한: 최대 요청 횟수를 설정하여 초과시 요청을 포기하도록 한다. 회로 차단기 패턴: 서비스에 성공/실패에 대해서 counting을 하고 일정 임계치를 초과하면 그 이후에 요청은 포기한다. 부분 실패시 미리 정해진 default 값이나 캐시된 값 등을 반환하는 방법이 있다. 서비스 디스커버리 클라..

Tistory

Micro Service Architecture - 6. IPC 3

비동기 메시징 패턴 응용 통신 비동기 메시징은 메시지 브로커를 사용하는 경우 브로커 없이 서비스가 직접 하는 경우가 있다. 메시지 메시지는 Header와 Body 로 구성. 브로커를 사용하는 경우 메시지 채널을 통해서 교환 된다. 메시징 상호작용 클라이언트/서비스는 한 쌍의 메시지를 주고받는 비동기 요청/응답 스타일로 상호작용 한다. 클라이언트는 수행 작업과 매개변수를 메시징 요청 채널에 보내고 서비스는 요청 처리 후 메시지 응답 채널로 응답 한다. 클라이언트 → 요청 채널 → 서비스 → 응답 채널 → 클라이언트 구현 방법 단방향 알림 비동기 메시징을 이용하여 클라이언트만 서비스에 요청하고 서비스는 응답 하지 않음 발행/구독 메시징은 발행/구독 스타일을 기본 지원한다. 클라이언트는 여러 Consumer가..

Tistory

Jenkins Nexus Docker 연동하기

Nexus https://hub.docker.com/r/sonatype/nexus3/ https://velog.io/@king/private-docker-registry sudo docker pull sonatype/nexus3:3.34.1 sudo docker run -d -p 8081:8081 -p 5000:5000 --name demo-nexus sonatype/nexus3:3.34.1 sudo docker exec -it demo-nexus bash > cat /nexus-data/admin.password Nexus 세팅 docker-hosted, docker-hub 추가 repo-docker-hosted 추가 docker-hub 추가 nexus 연동 # docker http sudo vi /e..

Tistory

Micro Service Architecture - 5.분해전략 2

마이크로서비스 아키텍쳐 3단계 프로세스 1단계는 요청을 추출, 요청에 대해서 추상적으로 관찰 해야 합니다. 2단계는 어떻게 서비스로 분해할지 결정 해야 합니다. 3단계는 서비스별 API를 정의하고 서비스에 역할 배정 및 서비스간 협동에 대해서 정의를 해야 합니다. # 1단계. 시스템 작업 식별 시스템 작업을 기술하기 위한 고수준 도메인 모델을 생성한다. 위 그림을 통하면 이는 Order, Delivery, Restaurant 로 추출할 수 있다. 고수준의 도메인 모델로 나누기 위해서는 시나리오 작성을 통해서 하는 방법이 있다. 전제 (Given) - 소비자가 있다. - 음식점이 있다. - 음식점은 소비자의 주소로 음식을 배달 한다. - 주문 총액은 최소 주문량 조건에 부합해야 한다. 조건 (When) -..

Tistory

Micro Service Architecture - 6. IPC

MSA 프로세스 통신 IPC 개요 통신 상호작용 기준 첫번째 일대일: Client의 요청은 한개의 서비스가 처리 일대다: Client의 요철을 여러개의 서비스가 처리 두번째 동기: Client가 서비스에게 요청하고 응답 대기를 하며 블로킹도 할 수 있음 비동기: Client가 블로킹 하지 않으며 응답은 바로 하지 않아도 됨 통신 상호작용 종류 요청/응답 : Client는 서비스에 요청을 하고 응답 대기. 강한 결합의 상호작용 스타일 비동기 요청/응답 : Client는 서비스에 요청을 하고 서비스는 비동기적으로 응답 단방향 알림 : Client는 요청만 하고 서비스는 응답을 하지 않음 API 설계 API 기능 추가/변경/삭제 등을 통해서 충분히 변경될 수 있다. 따라서 이런 문제를 해결하기 위해서 프로젝트..

Tistory

Micro Service Architecture - 1. MSA

모놀리식에서 MSA로 Micro Service Architecture 마이크로 서비스 아키텍쳐는 고수준에서 하라보면 하나의 애플리케이션을 여러 서비스로 기능 분해하는 기법 입니다. 각 서비스가 집중되고 응집된 역할을 수행을 합니다. 모듈성 모듈셩은 크고 복잡한 애플리케이션을 개발할 때 꼭 필요한 특성으로 규모가 방대하고 복잡하다면, 개인이 이해하기 어렵고 개발하기 힘듭니다. 따라서 여러 사람이 이해하기 쉽고 개발을 할 수 있도록 여러 모듈로 분할을 해야 합니다. 경계선 각 서비스는 다른 서비스가 침투하지 못하도록 API 라는 경계선을 갖고 있어 다른 서비스에서 접근이 불가하도록 해주며 이는 유지보수에 크게 도움이 됩니다. 또 서비스에 대해서 단위 별로 배포 및 확장에도 도움이 되는 장점이 있습니다. 개별..

Tistory

Micro Service Architecture - 2.FTGO 예시

FTGO 예시 모놀리식 구조 전형적인 자바 애플리케이션인 FTGO 의 전체 구조는 코어가 비지니스 로직으로 구성된 융각형 아키텍쳐이며 UI, 외부 시스템 통합을 위해 어댑터가 비지니스 로직을 감싼 모양새이다. # 마이크로 서비스 구조 FTGO 애플리케이션은 각 요청에 대해 서비스로 보내고 각자의 API 를 통해 서로 협동한다. # 마이크로 서비스로 변경을 통해 장점 크고 복잡한 애플리케이션을 지속적인 전달/배포 서비스 규모가 작아 관리 용이 서비스를 독립적으로 배포/확장 가능 서비스 팀별로 자율적인 업무 수행 가능 결함 격리가 쉬움 새로운 기술에 대해 도입 용이 단점 서비스를 찾기가 어려움 마이크로 서비스는 따로 정해진 규약이 없어 서비스 모듈을 잘 못 분해할 경우 분산 모놀리식이 구성 될 수도 있다. ..

Tistory

Micro Service Architecture - 3.패턴

패턴은 패턴은 특정 상황에 발생한 문제에 재사용 가능한 해법이며 실제로 검증된 유용한 생각입니다. 패턴은 어떤 상황에서는 유용하지만, 또 어떤 상황에서는 전혀 유용하지 않을 수 있습니다. 또 기술적인 부분이 강제되는 점도 있습니다. 강제 조항 (Forces) 문제 해결을 위해서 강제로 처리해야 할 이슈들에 대해서 우선순위를 정하는 것. 예를들어 코드를 이해하기 쉬우며 성능도 우수해야 한다면 리액티브 스타일 코드는 성능은 우수할지 모르지만 이해햐기 어렵습니다. 따라서 이는 전에 반드시 해결 되고 진행 되어야 함. (리액티브 스타일 : 함수형 언어나 엑셀등에서 사용, 자세한 것은 구글링) 결과 맥락 (Resulting Context) 패턴 적용 결과 장점과 단점, 이후 새로운 문제에 대해 고려 필요 연관 패..

Tistory

Micro Service Architecture - 4.분해전략

분해전략 애플리케이션의 아키텍쳐는 여러 파트로 분해와 파트들의 연관성 이 두가지 때문에 중요하다. 업무와 지식을 분리하여 효과적으로 팀을 이루어 생산적인 작업을 할 수 있고 어떻게 상호작용 하는지 알 수 있다. # 소프트웨어 아키텍쳐 4+1 뷰 모델 아래 4가지 뷰를 통해서 시나리오 뷰를 작동한다. 논리 + 구현 + 프로세스 + 배포 => 시나리오 논리 뷰 (Logical View) 구분 내용 개발자가 작성하는 것 엘리먼트 클래스, 패키지 관계 상속, 연관, 의존 등 클래스와 패키지의 관계 구현 뷰 (Implementation View) 구분 내용 빌드 시스템의 결과물 엘리먼트 모듈(JAR), 컴포넌트(WAR) 관계 모듈과 컴포넌트의 관계 프로세스 뷰(Process View) 구분 내용 런타임 컴포넌트 ..

Tistory

[Clean Code] 10-1 클래스

클래스 클래스 체계 클래스에서 static, public 변수는 위에 다음으로 private 변수 마지막으로 private object 가 나와야 한다. 클래스의 변수와 메소드는 가능한 공개하지 않는 편이 좋지만 때로는 접근을 허용해야 하는 경우가 있다. 따라서 그런 경우에는 protected 로 하거나 패키지내 공개 해야 한다. 하지만 가능한 그렇지 않게 작성 해야 한다. 클래스 이름 이름은 해당 클래스의 책임을 기술해야 한다.(명사로) 간결한 이름이 떠올리지 않는다면 책임이 많을 확률이 높다. 단일 책임 원칙(Single Responsibility Principle) 단일 책임 원칙은 모듈을 변경할 이유가 단 하나뿐이어야 한다는 원칙. 매우 지키기 쉽지만 많은 개발자들이 안지키는 원칙이다. 어떤 개발..

Tistory

[Clean Code] 10-2 응집도

응집도 클래스는 인스턴스 변수 수가 적어야 한다. 각 메소드는 클래스 인스턴스 변수를 하나 이상 사용해야 한다. 일반적으로 메소드가 인스턴스 변수를 더 많이 사용 할수록 메소드와 클래스는 응집도가 높다. 모든 인스턴스 변수를 메소드마다 사용한다면 응집도가 가장 높은 경우이다. 응집도가 높은 클래스는 바람직 하지 않지만 많은 개발자들이 응집도가 높은 클래스를 작성한다. 응집도가 높다는 말은 변수와 메소드가 서로 논리적으로 묶여 있다는 의미이기 때문이다. 아래는 클래스의 응집도가 매우 높은 케이스다. class Stack(object): _top_of_stack = 0 _elements = [] def size(self) -> int: return self._top_of_stack def push(self,..

Tistory

[Clean Code] 11-1 Concern

시스템 Concern (관심사) 시작 단계는 모든 앱이 풀어야하는 관심사(Concern) 이다. 관심사 분리는 오래된 가장 중요한 기법이다. 대다수의 앱은 시작 단계라는 관심사를 분리 하지 않고 준비 과정 코드를 주먹구구로 구현하고 심지어 런타임 로직하고도 섞인다. 다음은 대표적인 예다. class SomethingMain(object): ... def get_service() -> Service: if not self._service: self._service = MyService() return self._service def main(): ... service = self.get_service() ... ... 위는 초기화 지연 (Lazy Initialization) 혹은 계산 지연 (Laze Ev..

Tistory

[Clean Code] 9-1 TDD

단위 테스트 TDD, Test Driven Development 첫째, 실패하는 단위 테스트를 작성할 때까지 서비스 코드를 작성하지 마라. 둘째, 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성 하라. 셋째, 현재 실패하는 테스트를 통과할 정도의 서비스 코드를 작성 하라. 이렇게 일을 하면 테스트 수천개의 케이스가 생기는데 이를 전부 다 방치를 하면 서비스 코드와 맞먹을 정도의 규모가 되는데 이는 심각한 관리문제를 야기한다. 깨끗한 테스트 코드 테스트 코드는 가독성이 중요하다. 변경 전은 addPage와 assertSubString를 부르는라 중복되는 코드가 매우 많다. 자질구레한 사항은 없애고 테스트 코드 표현의 중점하자. public void testGetPageHieratch..

Tistory

[Clean Code] 9-2 도메인 특화 테스트

단위 테스트 도메인 특화 테스트 앞서 9-1 에서 구현간 기법으로 주로 API 위에다 함수와 유틸리티를 구현한 후 테스트 코드를 작성함으로 코드작성과 높은 가독성을 가진다. 테스트 코드는 쉽고 간결하고 이해하기 쉽게 해야하지만 효율성의 측면에서는 효율적일 필요는 없다. 온드가 급격하게 떨어지면 경보, 온풍기, 송풍기가 모두 가동 되는지 확인하는 코드. func TestTurnOnLoTempAlramAtThreashold(t *testing.T) { hardware.SetTemp(WayTooCold) controller.Tic() tests.AssertEqual(t, hardware.HeaterState(), true) tests.AssertEqual(t, hardware.BlowerState(), tru..

Tistory

[Clean Code] 9-3 깨끗한 테스트

단위 테스트 깨끗한 테스트 1. 테스트틑 빨라야 한다. 테스트가 느리면 테스트를 자주 못하고 자주 돌리지 못하면 결국 문제가 발생해도 코드 정리가 힘들어져 코드 품질이 망가지기 시작한다. 2. 독립적 각 테스트는 서로 독립적이여야 한다. 한 테스트가 다음 테스트가 실행될 한경을 기다려서는 안 된다. 테스트가 서로 의존하면 하나가 실패하면 연달아 실패하므로 결함 찾기가 힘들다. 3. 반복 가능 테스트는 Test, QA, Production 모두 사용 가능 해야 한다. 4. 자가 검증 테스트는 Boolean 으로 결과를 내야 한다. 즉 성공 아니면 실패 로 해야 한다. 5. 적시에 단위 테스트는 실제 코드 작성 전 구현해야 한다. 실제 코드를 구현하고 테스트 코드 작성시에는 테스트 코드로 작성하기가 어려울 ..

1 2 3