sanggi-jayg의 등록된 링크

 sanggi-jayg로 등록된 티스토리 포스트 수는 211건입니다.

[Git] .gitignore 적용이 안되는 경우 [내부링크]

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

[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..

[통계] 정규화(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 종목의 범위가 휠씬 ..

[Docker] 사용하지 않는 볼륨 삭제하는 방법 [내부링크]

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

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..

[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 ..

[Kafka] 카프카 프로듀서 [내부링크]

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

[Kafka] 카프카 메시지 브로커 [내부링크]

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

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

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

Jetbrains IDE용 Git 팁 [내부링크]

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

[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: ***************..

[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

[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"

[Web Hacking] Challange 16 풀이 [내부링크]

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

[보안] 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나 유저 트래킹..

[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으로 접속

[Web Hacking] Challange 15 풀이 [내부링크]

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

[보안] 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에 저장되어 있고 특정 키 값을 추적하여 확인한다면 서..

[보안] 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..

[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..

[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..

[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 (예정..

[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..

[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..

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..

[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_..

[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 -..

[Kubernetes] OpenLens 설치 [내부링크]

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

API, 서비스, 도메인 테스트 및 TDD 에서의 기어비 [내부링크]

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

[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 사용하는 경우 전자들과 추가..

알림 서비스 디자인 [내부링크]

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

[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..

[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..

[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"

[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..

[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:..

[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 ..

[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..

[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..

[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

[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..

[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)..

[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 =..

[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..

[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..

[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을 적절하게 설정. 만약 ..

[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 ..

[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 /..

[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..

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 작성 ..

[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...

[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

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

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

[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..

[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..

[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..

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..

[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..

[MySQL] binlog to SQL(텍스트) 변환 [내부링크]

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

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" 와 사용 할..

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 외부에서 발생하는 활동으로도 이벤트를..

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 프로젝트는 누가 개발하든 모두 ..

[백준] 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..

[백준] 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..

[백준] 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..

[백준] 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(' ..

[백준] 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 _..

[백준] 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..

[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..

[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..

[Python] 파이썬 multiprocessing [내부링크]

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

[Python] 파이썬 비동기 I/O [내부링크]

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

[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_..

[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이 때문에 정적인 데이터를 다룰때는 리스트보다는 튜플이 좋다. 또한 튜플은 정적이기에 리소스 캐싱을 하는데 크기가 ..

[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..

[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..

[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..

[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..

[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로 인해서 인접열 방문 실패한 경우..

[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, ..

[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,..

[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..

[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 이상의 메모리 이상이여..

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..

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는 요청/응답간..

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..

Micro Service Architecture - 6. IPC 3 [내부링크]

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

Micro Service Architecture - 6. IPC 2 [내부링크]

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

Micro Service Architecture - 6. IPC [내부링크]

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

Micro Service Architecture - 5.분해전략 2 [내부링크]

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

Micro Service Architecture - 4.분해전략 [내부링크]

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

Micro Service Architecture - 3.패턴 [내부링크]

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

Micro Service Architecture - 2.FTGO 예시 [내부링크]

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

Micro Service Architecture - 1. MSA [내부링크]

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

[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..

[Clean Code] 10-2 응집도 [내부링크]

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

[Clean Code] 10-1 클래스 [내부링크]

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

[Clean Code] 9-3 깨끗한 테스트 [내부링크]

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

[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..

[Clean Code] 9-1 TDD [내부링크]

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

[Clean Code] 7-1 예외처리 [내부링크]

예외처리 함수 깔끔하게 하기 호출자 코드와 오류 코드 처리 코드를 분리한다. 1안 class DeviceController: def shutdown(self): try: self.try_shutdown() except (DeviceControllerError, DeviceShutdownError) as e: ... logger.error() def try_shutdown(self): device = self.get_handle() device.pause() device.clear_queue() device.close() def get_handle(self, device_id: int): ... raise DeviceControllerError('Invalid device handle') 2안 def ca..

[Clean Code] 6-2 객체지향 절차지향 2 [내부링크]

객체와 자료구조 디미터 법칙 모듈은 자신이 조작하는 객체의 속을 몰라야 한다는 법칙이다. 객체는 조회 함수로 내부 구조를 공개한다면 안 된다는 의미 (내부 구조를 노출하는 셈) C 클래스의 f 메소드는 다음과 같은 객체의 메소드만 호출 해야 한다. 클래스 C f가 생성한 객체 f로 넘어온 인수 클래스 C 인스턴스 변수 객체 디미터 법칙을 어긴 예시 같은 객체가 아닌 서로 다른 객체를 가지고 서로 연결해서 작성한 이런 코드를 기차 충돌 이라고 부른다. 일반적으로 조잡하니 지향하는 편이 좋다. outputDir := cTxt.GetOptions().GetScratchDir().GetAbsolutePath() 변경 예시 opts := cTxt.GetOptions(); scratchDir := opts.GetS..

[Clean Code] 6-1 객체지향 절차지향 [내부링크]

객체와 자료구조 객체 지향적 과 절차 지향적의 차이 절차 지향적인 코드는 기존 자료구조를 변경하지 않으면서 새 함수를 추가하기 쉽다. 반면 객체 지향적인 코드는 변경점이 생기면 기존 함수를 변경해야 하는 부분이 생길 수 있다. 모든 것을 객체 지향적인것 보다는 때로는 단순한 것이 적합한 상황이 있을 수 있다. 절차 지향적 class Squre(object): x: float y: float side: float class Rectangle(object): x: float y: float width: float height: float class Circle(object): x: float y: float radius: float def get_arae(figure: object) -> float: if ..

[Clean Code] 5-1 형식 [내부링크]

형식 소스를 보았을 때 코드가 깔끔하고 일관적이며 꼼꼼하며 질서정연하다고 생각되면 좋겠다. 술 취한 사람이 짜놓은 듯한 코드로 보인다면 코드를 보는 사람은 다른 부분도 그렇다고 생각 할 것이다. 개인적으로 스파게티처럼 작성된 소스는 유지보수할때 나도 스파게티를 만든는 경향이 있는데 비교적 잘 짜여졌다고 생각되는 부분을 고칠때는 나도 조심하여 일관성 있게 코드를 작성 할려고 하는 것 같다.프로그래머라면 형식을 깔끔하게 맞춰 코드를 짜야 한다. 팀마다 형식을 맞추고 규칙을 정하며 규칙을 따라야 한다. 필요하다면 형식을 적용하는 도구를 활용해도 된다. jetbranin 제품을 사용한다면 코드 양식을 1명이 수정한 다음 config 파일 공유해도 괜찮지 않을까? 싶다.# 형식을 맞추는 목적 누군가 "돌아가기만 ..

[Clean Code] 4-1 주석 [내부링크]

주석 우리는 주석을 코드로 의도를 표현 하지 못하여 사용 한다. 그러나 과거의 주석이 미래에 실패를 불러 올 수 있다. 코드는 언제나 변화하고 진화하며 이곳 저곳 옮겨지기도 한다. 주석은 그 코드를 따라가지 못한다. 누군가는 주석을 엄격하게 관리해야 한다고 할 수도 있지만 애초에 주석이 필요하지 않도록 코드를 작성 하는데 에너지를 쏟자. 코드로 주석을 대체하라 변경 전 # 직원에게 복지 혜택을 받을 자격이 있는지 체크 if (employee.flags and HOURLY_FLAG) and employee.age > 65 : do_something() 변경 후 if employee.isEnoughForFullBenefits() : do_something() # 이상적인 주석 public static Sim..

[Clean Code] 3-2 Functions [내부링크]

함수 함수는 한 가지만! 문제의 코드다. session_initialize() 를 주목하자. 최초 개발시 로그인시에 암호 체크용으로 개발을 했는데 이후에 다른 곳에서도 암호를 체크가 필요한 경우가 생겼고 똑같이 가져다 썻을 경우 Session이 초기화 되어 문제가 생길수 있다. 문제를 해결하기 위해서는 함수명을 check_password_and_session_init() 등으로 함수기능 명시하는 방법 (그래도 함수가 2가지 역할을 담당하여 문제) 함수의 기능을 두개로 다시 작성을 진행하는 방법이 있다. def check_password(username: str, password: str) -> bool: try: user = User.object.get(username = username) encrypt..

Git 프로젝트 별로 다른 계정 사용하기 [내부링크]

모두 같은 계정 사용 git 을 사용할때 모든 프로젝트가 같은 계정정보를 사용한다면 아래처럼 사용 git config --global user.name "username" git config --global user.email "[email protected]"서로 다른 계정 사용 프로젝트별로 다른 계정을 사용한다면 commit시에 이상한 계정으로 업로드 될수 있음 (예를 들어서 회사에서 이렇게 사용한다면? 개인 Github + 회사 Github Entrerprise or 회사 Gitlab) 변경할 프로젝트 경로에 접속해서 아래처럼 사용 git config --local user.name "username" git config --local user.email "[email protected]"설정 확인 git config --..

[Clean Code] 3-1 Parameter [내부링크]

함수 인수 함수의 이상적인 인수개수는 0개 이다. 다음은 1개(단항) 다음은 2개(이항) 3개(삼항)은 피하는게 좋다. 4개(다항) 이상은 작성하면 안된다. 이유는 개념을 이해하기 어렵게 만든다 Test case 에서도 검증하기 위해서 다양한 인수를 작성하는 것도 어렵다. 운영 개발할때 경우에 따라서 필요한 경우가 있는데 요즘은 IDE 잘 되어 있어서 상관 없지 않을까 싶다. 그래도 줄일수 있다면 줄이자.1개 (단항 함수) 대표적인 단항의 경우는 주로 두가지로 나누어진다. 질문을 던지는 경우 def is_file_exist(filepath:string) -> bool: ... Parameter를 변환하여 결과를 Return 하는 경우 def file_open(filepath:string) -> file:..

[Clean Code] 2-2 Method [내부링크]

함수는 작게 만들어라 함수는 최대한 작게 만들어라. If문, While문 등 사용시 블록안에는 라인 1개로 처리하도록 하자. 이를 통해서 우리는 1단~2단 수준에 들여쓰기 수준을 유지할 수 있고 함수는 읽기 쉬워지고 이해하기 쉬워진다. def some_method(): ... if is_something: show_something() 함수는 한 역할만 해라 def request_something(): response = requests.post('url') return response def handle_response(response: Response): if response.status_code == 200: do_success() else: do_failure()

[Clean Code] 2-1 Class 와 Method 이름 [내부링크]

Class 이름 Class와 Object의 이름은 명사가 적합하다. [Good] Customer, WikiPage, Account, AddressParser [Bad] Manager, Processor, Data, Info Method 이름 Method와 Function의 이름은 동사가 적합하다. [Good] postPayment, deletePage, save javabean 표준에 따라서 Accessor(접근자), Mutator(변경자), Predictate(조건자)는 앞에 get, set, is 를 붙인다. 이름을 혼용하지마라 여러 Class에 add() 함수의 역할과 Paramerter와 Return 이 동일하다면 계속 사용해도 되지만 기존과 다른 성격을 지닌다면 insert() 나 append(..

[Python] Colorful print [내부링크]

Example from colorful_print import color color.black('Print Black') color.red('Print Red') color.green('Print Green') color.yellow('Print Yellow') color.blue('Print Blue') color.magenta('Print Magenta') color.cyan('Print Cyan') color.white('Print White') print() color.red('Print Red') color.green('Print Bold Green', bold = True) color.yellow('Print Bold Italic Yellow', bold = True, italic = True..

[Fluentd] MySQL slow log 연동 [내부링크]

Fluentd MySQL slow log 연동하기 MySQL slow log MySQL slow log 는 멀티라인입니다. 따라서, conf 를 꿍짞꿍짝 해서 나중에 수정불가한 conf 를 생성 하거나 open soruce 사용해서 연동을 하면 되는데 착하신 분이 미리 mysqlslowquery 라는 것을 만들어 놓아서 이걸로 연동 했습니다. 설치 및 사전 준비 gpasswd mysql -a td-agent apt install -y ruby ruby-dev libc6-dev # 현재 서버에서 사용중인 gem 레포지가 # td-agent-gem 인지 fluentd-gem 인지 gem 인지 먼저 확인하세요 td-agent-gem install fluent-plugin-mysqlslowquery설정 # IN..

Promtheus + MySQL Exporter 연동 [내부링크]

MySQL Exporter 설치 및 연동 MySQL Exporter 다운로드 # 버전 MySQL >= 5.6. MariaDB >= 10.2 # 유저 없으면 추가, 있으면 접속 useradd -m -s /bin/bash prometheus su - prometheus # 다운로드 wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.13.0/mysqld_exporter-0.13.0.linux-amd64.tar.gz tar zxvf mysql-5.6.51-linux-glibc2.12-x86_64.tar.gz mv mysqld_exporter-0.13.0.linux-amd64/ mysql_exporter exit MySQL 에 권한 추..

Prometheus + Node Exporter + Grafana 연동 [내부링크]

프로메테우스 설치 https://prometheus.io/ # 유저 추가 useradd -m -s /bin/bash prometheus su - prometheus # 다운로드 cd /home/prometheus wget https://github.com/prometheus/prometheus/releases/download/v2.28.0/prometheus-2.28.0.linux-amd64.tar.gz tar -xzvf prometheus-2.28.0.linux-amd64.tar.gz # 폴더명 변경 로그아웃 mv prometheus-2.28.0.linux-amd64/ prometheus exit# 시스템 서비스 등록 vi /etc/systemd/system/prometheus.service [Unit..

[Ubuntu 20.04] MySQL 5.6.xx 설치 [내부링크]

삭제 cd /home rm /var/lib/mysql/ -R rm /etc/mysql/ -R apt-get autoremove -y mysql* --purge apt-get remove -y apparmorMySQL 설치 apt install -y libaio1 libncurses5 groupadd mysql useradd -g mysql mysql wget https://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.51-linux-glibc2.12-x86_64.tar.gz tar -xvf mysql-5.6.51-linux-glibc2.12-x86_64.tar.gz mv mysql-5.6.51-linux-glibc2.12-x86_64 /usr/local/mysql..

[Fluentd] Php 연동 [내부링크]

PHP 연동 PHP 7 이상 (https://github.com/fluent/fluent-logger-php) composer.json 추가 "fluent/logger": "1.0.*" PHP 7 미만 (https://github.com/DQNEO/php-fluent-simplelogger) 오픈소스 라이브러리 설치 샘플 use Fluent\Logger\FluentLogger; defined('BASEPATH') or exit('No direct script access allowed'); function f_log(string $label, array $data) { try { # TODO : Constants setting $logger = new FluentLogger('192.168.10.7', ..

[Fluentd] 7. Nginx 연동 [내부링크]

Nginx 로그 연동 개요 리눅스 서버에서 nginx의 access log 와 error log 를 수집하려고 한다. 우선, Nginx 는 날짜별로 파일 로그를 생성하고 날짜가 지나면 압축시켜 버린다. 그렇다면 Input 시에는 현재 작성하고 있는 파일에 접근해서 데이터를 수집해야 하기때문에 Input 플러그인은 tail 을 사용할 것이고 tail plugin은 access.log, error.log 를 대상으로 수집을 진행 할것이다. 또, Nginx 폴더에 그룹 권한이 admin으로 되어 있다. fluentd 를 adm 그룹으로 추가해주자. # CentOS 7 $ gpasswd adm -a td-agent 연동 @type tail @label @NGINX_LOG @id NGINX_ACCESS_LOG t..

[Fluentd] Python 연동 [내부링크]

테스트 환경 : python3.7 라이브러리 설치 $ pip install fluent-logger 샘플 소스 def log(label: str, data: dict): try: from fluent import sender, event except ImportError: raise ImportError('Install fluent-logger. pip install fluent-logger') try: # TODO : Constants setting sender.setup(tag = 'apps', host = 'localhost', port = 24232) event.Event(label, data) except Exception as e: # TODO : 에..

[Fluentd] 8. Prometheus 연동 [내부링크]

Prometheus 연동 https://github.com/fluent/fluent-plugin-prometheus Prometheus 플러그인은 총 6개를 제공 연동전 설치 CentOS 라 td-agent $ td-agent-gem install fluent-plugin-prometheus 샘플 input plugin 은 promethues 사용해서 server_ip:24231/metrics 를 리스닝 상태로 두고 output plugin은 prometheus_output_monitor 사용해서 10 초마다 promethues 에서 pull 해가도록 한다. @type prometheus bind 0.0.0.0 port 24231 metrics_path /metrics @type prometheus_ou..

[Fluentd] 6. 서버간 연동 [내부링크]

서버간 연동 aggregator 서버 @type forward @id input_forward port 24232 bind 0.0.0.0 @type stdout @id output_nginx @log_level debug forwarder 서버 @type tail @label @NGINX_LOG @id NGINX_ACCESS_LOG tag nginx.access path /var/log/nginx/access.log pos_file /var/log/td-agent/nginx-access.log.pos @type nginx @type tail @label @NGINX_LOG @id NGINX_ERROR_LOG tag nginx.error path /var/log/nginx/error.log pos_file..

[Fluentd] 5. Output plugin [내부링크]

Output Plugin https://docs.fluentd.org/output file file 은 이름처럼 데이터를 파일로 생성 @type file path /var/log/fluent/myapp compress gzip timekey 1d timekey_use_utc true timekey_wait 10m forward output 에서 forward 는 local fluentd 데이터를 external fluentd 로 전송해 줌 아래 보면 myserver1과 myserver2 로 local event data를 전송해주고 운영시에 장애가 발생해도 문제 없이 운영이 가능 하도록 2개의 서버로 데이터를 보내는 것 유추 쌉가능 @type forward send_timeout 60s recover_w..

[Fluentd] 4. Input plugin [내부링크]

Input Plugin https://docs.fluentd.org/input tail tail 은 꼬리로, 텍스트 파일의 꼬리를 쫓는다. 리눅스 커맨드 tail 과 비슷하다. 아래는 Nginx access log tail 샘플 @type tail @label @NGINX_LOG @id NGINX_ACCESS_LOG tag nginx.access path /var/log/nginx/access.log pos_file /var/log/td-agent/nginx-access.log.pos @type nginx @log_level debug forward forward 는 포트 열고 통신 대기한다고 생각하면 됨 fluentd -> fluentd fluentd -> prometheus @type forward ..

[Fluentd] 3. 설정 파라미터 [내부링크]

설정 Common Parameter @type type 은 plugin 의 이름? 을 지정 @type my_plugin_type @type my_filter @id id 는 설정의 unique 값으로, buffer, storage, logging 등에서 사용 @type file @id service_www_accesslog path /path/to/my/access.log # ... @log_level log_level 은 log의 level 을 지정으로 system 선언에서 전체 log_level(default:info) 를 지정할 수도 있고, 특정 플러그인의 log level을 선언할 수도 있다. log_level info # ... @log_level debug # shows debug log on..

[Fluentd] 2. 설정 개요 [내부링크]

설정 How Does Fluentd Works 우선 Fluentd 에서 모듈별로 어떻게 작동하는지 순서를 봐보자. 그렇다고 한다. Component Role Input Input 은 로그를 수집하는 Plugin. Input 플러그인은 외부에서 event log 를 pull 후 fluentd 로 전송 이외에도 착하고 똑똑한 애들이 미리 개발 해놓은 Extension Plugin 설치를 통해 사용할 수 있음. Parser (option) Parser 는 Input 으로 읽은 데이터의 포맷이 fluentd에서 지원하지 않는 경우에 파싱을 위해 선택적으로 사용. Filter (option) Filter 는 Output 으로 보내기 전에 뭔가를 한다. 필터링 데이터 필드 추가, 삭제, 마스킹 로그 데이터에서 라벨..

[Fluentd] 1. 설치 [내부링크]

Before Installation Increase the Maximum Number of File Descriptors # 확인 $ ulimit -n 65535 # 서버마다 다른지 모르겠지만, CentOS는 1024가 default # 아래 파일 내용 추가 $ vi /etc/security/limits.conf root soft nofile 65536 root hard nofile 65536 * soft nofile 65536 * hard nofile 65536 systemd 서비스 사용중인 os는 'LimitNOFILE=65536' 추가, 이외 os 는 default 로 set 되어 있음 Optimize the Network Kernel Parameters $ vi /etc/sysctl.conf ne..

[CentOS] CPU, Memory 사용량 로그 [내부링크]

CentOS CPU, Memory 사용량 로그 확인하기 #설치 yum insatll sysstat # 크론탭 확인 cat /etc/cron.d/sysstat CPU 사용률 # CPU 사용률(오늘) sar # CPU 사용률(날짜별) sar -f /var/log/sa/sa날짜 메모리 사용률 # 메모리 사용률 (오늘) sar -r # 메모리 사용률 (날짜별) sar -r -f /var/log/sa/sa날짜

[CentOS 7] Prometheus + Grafana 설치 [내부링크]

CentOS 7 에 Prometheus + Grafana 설치 메뉴얼 프로메테우스 설치 https://prometheus.io/ # 유저 추가 useradd -m -s /bin/bash prometheus su - prometheus # 다운로드 cd /home/prometheus wget https://github.com/prometheus/prometheus/releases/download/v2.21.0/prometheus-2.21.0.linux-amd64.tar.gz tar -xzvf prometheus-2.21.0.linux-amd64.tar.gz # 폴더명 변경 로그아웃 mv prometheus-2.21.0.linux-amd64/ prometheus exit # 시스템 서비스 등록 vi /etc..

Git Branch 를 통한 Gitflow [내부링크]

참고 : gmlwjd9405.github.io/2018/05/11/types-of-git-branch.html

Git Branch 사용법 [내부링크]

Git Branch 사용법 Jetbrain IDE를 사용합니다 1. branch 확인하기 git branch 현재 master branch 만 존재, *는 현재 활성화 branch 표시 git branch -r 원격 저장소 branch 확인 2. branch 생성 및 이동 첫번째 방법 git branch feature/#1 git branch git checkout feature/#1 두번째 방법 git checkout -b feature/#1 3. branch 삭제 git branch -d feature/#1 4. branch Github 원격 저장소 push git push --set-upstream origin feature/#1 혹은 git push -u origin feature/#1 로컬에만 ..

Gitlab 에서 Github 로 저장소 log 유지하며 옮기기 [내부링크]

윈도우 기준입니다. gitcmd 터미널 실행을 해서 아래와 같이 실행 git clone --bare http://gitlab.kaffalab.com/project.git cd project git push --mirror https://github.nhnent.com/godo/project.git

[Jenkins] 젠킨스 Dockerfile 설치 [내부링크]

[Jenkins] 젠킨스 Dockerfile 설치 cd /home/ vi Dockerfile docker build -t demo_jenkins . docker image ls docker run -it -p 8080:8080 --name demo_jenkins docker.io/jenkins/jenkins docker run -d -p 8080:8080 --name demo_jenkins docker.io/jenkins/jenkins Dockerfile FROM centos:7 RUN echo -e '[AdoptOpenJDK]\n\ name=AdoptOpenJDK\n\ baseurl=http://adoptopenjdk.jfrog.io/adoptopenjdk/rpm/centos/$releasever/$b..

[Jenkins] 젠킨스란 무엇인가 [내부링크]

젠킨스란 무엇인가 젠킨스는 개발시에 지속적인 통합 서비스를 제공해주는 오픈소스 툴이며, 이를 CI(Continous Integration) 이라고 표현 한다. 젠킨스 사이트 접속을 하면, 젠킨스는 프로젝트를 빌드, 배포, 자동화를 해주며 다양한 플러그인들이 있다고 한다. 젠킨스는 Java로 개발되어 있고 WAR를 단독 혹은 톰캣 등의 서버로 실행을 할 수 있으며, Windows, Linux, macOS 등 크로스 플랫폼을 지원한다. 젠킨스를 실행하면 웹 화면을 생성하며 REST API 호출로 구동 된다. CI (Continous Integration) 란? Build, Test를 실시하는 프로세스로 이러한 통합 프로세스를 계속 실시해 주는 것을 CI 라고 한다. 즉, 통합을 지속적으로 수행하는 것. CD..

Cent OS 6 버전 yum 에러 [내부링크]

CentOS 6버전이 지원이 끝남에 따라서 yum 명령어 실행시 에러가 발생 아래와 같이 명령어 실행 $ echo "https://vault.centos.org/6.10/os/x86_64/" > /var/cache/yum/x86_64/6/base/mirrorlist.txt $ echo "http://vault.centos.org/6.10/extras/x86_64/" > /var/cache/yum/x86_64/6/extras/mirrorlist.txt $ echo "http://vault.centos.org/6.10/updates/x86_64/" > /var/cache/yum/x86_64/6/updates/mirrorlist.txt

프로그래머스 - 가장 큰 정사각형 찾기 [내부링크]

문제 설명 1와 0로 채워진 표(board)가 있습니다. 표 1칸은 1 x 1 의 정사각형으로 이루어져 있습니다. 표에서 1로 이루어진 가장 큰 정사각형을 찾아 넓이를 return 하는 solution 함수를 완성해 주세요. (단, 정사각형이란 축에 평행한 정사각형을 말합니다.) 예를 들어 1234 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 가 있다면 가장 큰 정사각형은 1234 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 가 되며 넓이는 9가 되므로 9를 반환해 주면 됩니다. 제한사항 표(board)는 2차원 배열로 주어집니다. 표(board)의 행(row)의 크기 : 1,000 이하의 자연수 표(board)의 열(column)의 크기 : 1,000 이하의 자연수 표(boar..

프로그래머스 - 나머지 한 점 [내부링크]

문제 설명 직사각형을 만드는 데 필요한 4개의 점 중 3개의 좌표가 주어질 때, 나머지 한 점의 좌표를 구하려고 합니다. 점 3개의 좌표가 들어있는 배열 v가 매개변수로 주어질 때, 직사각형을 만드는 데 필요한 나머지 한 점의 좌표를 return 하도록 solution 함수를 완성해주세요. 단, 직사각형의 각 변은 x축, y축에 평행하며, 반드시 직사각형을 만들 수 있는 경우만 입력으로 주어집니다. 제한사항 v는 세 점의 좌표가 들어있는 2차원 배열입니다. v의 각 원소는 점의 좌표를 나타내며, 좌표는 [x축 좌표, y축 좌표] 순으로 주어집니다. 좌표값은 1 이상 10억 이하의 자연수입니다. 직사각형을 만드는 데 필요한 나머지 한 점의 좌표를 [x축 좌표, y축 좌표] 순으로 담아 return 해주세요..

프로그래머스 - 순열 검사 [내부링크]

문제 설명 길이가 n인 배열에 1부터 n까지 숫자가 중복 없이 한 번씩 들어 있는지를 확인하려고 합니다. 1부터 n까지 숫자가 중복 없이 한 번씩 들어 있는 경우 true를, 아닌 경우 false를 반환하도록 함수 solution을 완성해주세요. 제한사항 배열의 길이는 10만 이하입니다. 배열의 원소는 0 이상 10만 이하인 정수입니다. 입출력 예 arrresult [4, 1, 3, 2] true [4, 1, 3] false 입출력 예 설명 입출력 예 #1 입력이 [4, 1, 3, 2]가 주어진 경우, 배열의 길이가 4이므로 배열에는 1부터 4까지 숫자가 모두 들어 있어야 합니다. [4, 1, 3, 2]에는 1부터 4까지의 숫자가 모두 들어 있으므로 true를 반환하면 됩니다. 입출력 예 #2 [4, 1..

CentOS pyenv 설치 [내부링크]

> yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel git > yum install gcc openssl-devel libffi-devel bzip2-devel wget > curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash > vi /root/.bash_profile export PATH="$HOME/.pyenv/bin:$PATH" eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)" > source /root/.bash_profile 설치 가능 버전 상위 리스트 >..

소프트웨어 개발원칙 YAGNI [내부링크]

소프트웨어 개발원칙 YAGNI "You ain't gonna need it" 에서 따온 약자로 정말 필요할때까지 만들지 말라는 의미를 가진다. 언제 사용될지도 모르는 것에대해서 작성하는 것은 현재 상황에 대해서 더욱 복잡하게 만들며 시간을 소요하게 하고 이후 변경 시 2차적으로 시간을 잡아먹게 된다. 따라서, 현재 사용되지 않을 것에 대해서 먼저 작성하는 것을 지양하라는 의미.

소프트웨어 개발원칙 KISS [내부링크]

소프트웨어 개발원칙 KISS “Keep it small and simple.”, “Keep it short and simple.”, 또는 “Keep it simple, stupid.” 에서 따온 약어이다. 소스코드에 대해서 최대한 간단 명료하게 작성하라는 의미로 불필요하게 장황하고 복잡하게 작성하는 것을 지양하며 경계하라는 원칙. 단순할수록 이해하기 쉽고 버그가 발생하기 어렵다.

소프트웨어 개발 원칙 DRY [내부링크]

소프트웨어 개발 원칙 DRY - Don't Repeat Yourself 똑같은 일을 두번하지 말아라! 중복 되는 내용의 함수, 모듈 등에 대해서 리팩토링을 해라. 한 프로젝트내에서 개발 과정이든 개발 완료 후 유지보수 과정에서든 언제든지 같은 역할을 수행하는 중복된 내용의 소스코드가 작성 될 수 있다. 이렇게 중복된 코드들은 시간이 지남에 따라서 프로젝트가 덩치가 커지면서 오버헤드를 발생시키고 쓸데없는 시간과 노력이 소요되게 하며 버그가 발견되었을 경우 여러군데를 고쳐야 하는 등의 단점이 발생한다.

객체지향 설계 5대 원리 SOLID - IRP [내부링크]

I - ISP - Interface Segregation Principle (인터페이스 분리 원칙) 특정 클라이언트를 위한 인터페이스 여러개가 범용 인터페이스 하나보다 낫다. 클래스에서 사용하지 않는 메서드는 분리해야 한다. 차량 소유주 정보는 변경점이 없어 그대로 구현 class CarOwnerInfo: def __init__(self, car_number, owner_name): self.__car_number = car_number self.__owner_name = owner_name @property def car_number(self): return self.__car_number @car_number.setter def car_number(self, value): self.__car_numb..

객체지향 설계 5대 원리 SOLID - OCP [내부링크]

O - OCP - Open/Closed Principle (개방/폐쇄 원칙) 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다. Truck 외에 차량 종류가 추가 될 경우 공통 속성을 가지는 Car Interface로 추상화를 합니다. class Car: id_number = None owner_info = None detail_info = None def __init__(self, id_number, owner_info: CarOwnerInfo, detail_info: CarDetailInfo): self.id_number = id_number self.owner_info = owner_info self.detail_info = detail_info class Suv(Car): pass..

객체지향 설계 5대 원리 SOLID - SRP [내부링크]

S - SRP - Single Responsiblity Principle (단일 책임 원칙) 한 클래스는 하나의 책임만 가져야 한다. 다음과 이미지처럼 트럭 정보를 관리하는 클래스가 있다고 가정 class Truck: id_number = None car_number = None owner_name = None def __init__(self, id_number, car_number, owner_name): self.id_number = id_number self.car_number = car_number self.owner_name = owner_name 트럭의 차대번호는 생산에 따라 부여된 고유 번호로 변경되지 않지만, 소유주나 차량등록번호는 변경 될 가능성이 있는 정보이다. 따라서 TruckOwne..

객체지향 설계 5대 원리 SOLID [내부링크]

객체지향 설계 5대 원리 SOLID 컴퓨터 프로그래밍에서 SOLID란 로버트 마틴이 2000년대 초반에 명명한 객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원칙을 마이클 페더스가 두문자어 기억술로 소개한 것이다. 프로그래머가 시간이 지나도 유지 보수와 확장이 쉬운 시스템을 만들고자 할 때 이 원칙들을 함께 적용할 수 있다. SOLID 원칙들은 소프트웨어 작업에서 프로그래머가 소스 코드가 읽기 쉽고 확장하기 쉽게 될 때까지 소프트웨어 소스 코드를 리팩터링하여 코드 냄새를 제거하기 위해 적용할 수 있는 지침이다. 이 원칙들은 애자일 소프트웨어 개발과 적응적 소프트웨어 개발의 전반적 전략의 일부다. S - SRP - Single Responsiblity Principle (단일 책임 원칙) 한 클래스는 하..

캐시 (Cache) [내부링크]

캐시 (Cache) 캐시란 컴퓨팅에서 캐시는 일반적으로 일시적인 특징이 있는 데이터 하위 집합을 저장하는 고속 데이터 스토리지 계층입니다. 따라서 이후에 해당 데이터에 대한 요청이 있을 경우 데이터의 기본 스토리지 위치에 액세스할 때보다 더 빠르게 요청을 처리할 수 있습니다. 캐싱을 사용하면 이전에 검색하거나 계산한 데이터를 효율적으로 재사용할 수 있습니다. 캐시의 작동방법 캐시의 데이터는 일반적으로 RAM(Random Access Memory)과 같이 빠르게 액세스할 수 있는 하드웨어에 저장되며, 소프트웨어 구성 요소와 함께 사용될 수도 있습니다. 캐시의 주요 목적은 더 느린 기본 스토리지 계층에 액세스해야 하는 필요를 줄임으로써 데이터 검색 성능을 향상하는 것입니다. 속도를 위해 용량을 절충하는 캐시..

[Ubuntu 18] docker 를 이용한 MariaDB Sharding (샤딩) [내부링크]

MariaDB Sharding using Docker Below versions. Ubuntu 18.04 Docker 19.03 MariaDB 10.4 Installation Install the server and apt update. $ sudo apt update $ sudo apt-get update $ sudo apt-get upgrade Install the dependencies. $ sudo apt install apt-transport-https ca-certificates curl software-properties-common Add docker repository on apt $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | ..

[Python] builtin dir() 함수 [내부링크]

[Python] builtin dir() 함수 dir()함수는 입력된 parameter 의 attributes를 list 형태로 return 해주는 함수. def dir(p_object=None): # real signature unknown; restored from __doc__ dir([object]) -> list of strings If called without an argument, return the names in the current scope. Else, return an alphabetized list of names comprising (some of) the attributes of the given object, and of attributes reachable from it...

DNS(Domain Name System) 작동원리 [내부링크]

DNS(Domain Name System) DNS(Domain Name System) 란? 도메인 네임 시스템 (Domain Name System, DNS) 은 호스트의 도메인네임 (www.example.com)을 네트워크주소(192.168.1.0)로 변환하거나, 그 반대의 역학을 수행하는 시스템이다. 인터넷의 DNS 시스템은 이름과 숫자 간의 매핑을 관리하여 마치 전화번호부와 같은 기능 DNS 작동원리 위의 그림과 같이 PC 브라우저에서 www.naver.com 을 입력한다. 그러면 PC는 미리 설정되어 있는 DNS (단말에 설정되어 있는 이 DNS를 Local DNS라 부름, 위에서는 203.248.252.2) 에게 "www.naver.com 이라는 hostname" 에 대한 IP 주소를 요청한다. ..

브라우저 동작 원리 [내부링크]

브라우저 동작 원리 브라우저의 주요 기능 브라우저의 주요 기능은 사용자가 선택한 자원을 서버에 요청하고 브라우저에 표시하는 것이다. 자원은 보통 HTML 문서지만 PDF나 이미지 또는 다른 형태일 수 있다. 자원의 주소는 URI(Uniform Resource Identifier)에 의해 정해진다. 브라우저의 기본 구조 브라우저의 주요 구성 요소는 다음과 같다. 사용자 인터페이스 - 주소 표시줄, 이전/다음 버튼, 북마크 메뉴 등. 요청한 페이지를 보여주는 창을 제외한 나머지 모든 부분이다. 브라우저 엔진 - 사용자 인터페이스와 렌더링 엔진 사이의 동작을 제어. 렌더링 엔진 - 요청한 콘텐츠를 표시. 예를 들어 HTML을 요청하면 HTML과 CSS를 파싱하여 화면에 표시함. 통신 - HTTP 요청과 같은 ..

HTTP Response Status Code (HTTP 응답 상태 코드) [내부링크]

HTTP Response Status Code (HTTP 응답 상태 코드) Status Code 란? HTTP response is called the status line and includes a numeric status code (such as "404") and a textual reason phrase (such as "Not Found"). The way the user agent handles the response depends primarily on the code, and secondarily on the other response header fields. Custom status codes can be used, for if the user agent encounters a cod..

HTTP Request Method (HTTP 요청 방법) [내부링크]

HTTP Request Method (HTTP 요청 방법) HTTP 는 GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE, PATCH Reqeust Method 가 있으며, 상황별 알맞게 사용을 권장한다. GET The GET method requests a representation of the specified resource. Requests using GET should only retrieve data and should have no other effect. (This is also true of some other HTTP methods.)[1] The W3C has published guidance principles on this distin..

HTTP (HyperText Transfer Protocol) 란? [내부링크]

HTTP (HyperText Transfer Protocol) 란? HTTP는 클라이언트와 서버 사이에 이루어지는 요청/응답(request/response) 프로토콜이다. W3 상에서 정보를 주고받을 수 있는 프로토콜이다. 주로 HTML 문서를 주고받는 데에 쓰인다. 주로 TCP를 사용하고 HTTP/3 부터는 UDP를 사용하며, 80번 포트를 사용한다 예를 들면, 클라이언트인 웹 브라우저가 HTTP를 통하여 서버로부터 웹페이지(HTML)나 그림 정보를 요청하면, 서버는 이 요청에 응답하여 필요한 정보를 해당 사용자에게 전달하게 된다. 이 정보가 모니터와 같은 출력 장치를 통해 사용자에게 나타나는 것이다. 추가로, HTTP는 여러가지 버전이 있다. HTTP의 버전은 이후 알아보기로 한다. 클라이언트 요청 ..

2020년 백엔드(Back-end) 개발자 로드맵 [내부링크]

2020년 백엔드(Back-end) 개발자 로드맵

[Python 오픈소스] Diagrams [내부링크]

Diagrams 라는 Python Github 오픈소스 라이브러리 이며, 이 라이브러리는 소스 작성을 통해서 그림을 그려주는 것을 정말로 간단하게 해준다. Github 주소 : github.com/mingrammer/diagrams mingrammer/diagrams :art: Diagram as Code for prototyping cloud system architectures - mingrammer/diagrams github.com Docs 주소 : diagrams.mingrammer.com/docs/guides/diagram Diagrams · Diagram as Code Diagram as Code diagrams.mingrammer.com 이하 샘플로 작성한 코드. from diagrams ..

[Python] builtin all() 함수 [내부링크]

정의 def all(*args, **kwargs): # real signature unknown """ Return True if bool(x) is True for all values x in the iterable. If the iterable is empty, return True. """ pass all() 함수는 iterable 안의 값이 모두 참이거나 empty 라면 return True. 그렇지 않다면 return False 를 한다. 실행결과 sample = [ [], [0], ['0'], [1], ['1'], [0, 1, 2], [1, 2, 3], [-0], [-1], [True], [False], ] for s in sample: print(s, '=>', all(s)) """ [] =..

[Python] builtin abs() 함수 [내부링크]

abs(x) 함수는 입력 받은 값의 절대값을 return 해주는 함수이다. 정의 def abs(*args, **kwargs): # real signature unknown Return the absolute value of the argument. 실행결과 sample = [ 10, - 10, 10.5, - 10.5, 0, 0.0, ] for s in sample: print('{} => {}'.format(s, abs(s))) """ 10 => 10 -10 => 10 10.5 => 10.5 -10.5 => 10.5 0 => 0 0.0 => 0.0 """ 이런식으로도 사용이 가능하다. from operator import __abs__ __abs__(10) 구현단 PyObject * PyNumber_Ab..

MariaDB sharding using docker [내부링크]

MariaDB sharding using docker (도커를 이용한 마리아DB 세팅) https://github.com/sanggi-wjg/docker_mariadb_sharding sanggi-wjg/docker_mariadb_sharding Contribute to sanggi-wjg/docker_mariadb_sharding development by creating an account on GitHub. github.com

Django demo project (chatting, monggo db, sample) [내부링크]

Django chatting demo app(장고 이용 채팅 데모) https://github.com/sanggi-wjg/django_chat_demo sanggi-wjg/django_chat_demo Contribute to sanggi-wjg/django_chat_demo development by creating an account on GitHub. github.com Django with MonggoDB (장고와 몽고 DB 사용) https://github.com/sanggi-wjg/django_mongodb sanggi-wjg/django_mongodb django_mongodb. Contribute to sanggi-wjg/django_mongodb development by creating..

통신사별 DNS IP 리스트 (구글, SKT, KT, LG) [내부링크]

통신사별 DNS IP 리스트 (구글, SKT, KT, LG) 구글 (Google Public) 기본 DNS 서버 : 8.8.8.8 보조 DNS 서버 : 8.8.4.4 SKT 기본 DNS 서버 : 219.250.36.130 보조 DNS 서버 : 210.220.163.82 KT 기본 DNS 서버 : 168.126.63.1 보조 DNS 서버 : 168.126.63.2 LG 기본 DNS 서버 : 164.124.101.2 보조 DNS 서버 : 203.248.252.2

[Clean Code] 0. 앞 부분... [내부링크]

5S 철학... 1. 정리 또는 조직화(정렬) : 적절한 명명법 방법 등을 통해 무엇이 어디에 있는지 알아야 한다. 2. 정돈 또는 체계화 : 코드는 누구나 예상하는 위치에 있어야 한다. 그렇지 않다면 위치 정돈을 하여라. 3. 청소 또는 정리 : 소스에 과거 이력이나 주석으로 처리한 코드 등은 제거하기 바란다. 4. 청결 또는 표준화 : 프로젝트 내 일관적인 구현 스타일과 기법을 가져라. 5. 규율 또는 생활화 : 관례를 따르고, 변경이 필요하다면 기꺼이 변경 하여라. 맞는 말도 있는 것 같고 아닌 말도 있는 것 같고...

5. Django - Nginx 연동 [내부링크]

참고 : https://victorydntmd.tistory.com/257 Nginx 설치 # Nginx 설치 > vi /etc/yum.repos.d/nginx.repo # Insert this parhase [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1 # Firewall 설정 > yum install nginx > firewall-cmd --permanent --zone=public --add-service=http > firewall-cmd --permanent --zone=public --add-service=https > firewall-cmd --reload # N..

4. Django 모델 및 관리자 [내부링크]

모델 클래스 생성 polls/models.py from django.db import models # Create your models here. class Users(models.Model): id = models.IntegerField(primary_key = True, null = False, auto_created = True) name = models.CharField(max_length = 10, null = False, unique = True) regDate = models.DateTimeField(null = False) def __str__(self): return "Name : {name}, RegDate : {regDate}".format(name = self.name, regDat..

3. Django 뷰 작성 및 라우팅 [내부링크]

polls 디렉토리 생성 > cd /home/django_sample/ > python manage.py startapp polls # 생성된 polls 디렉토리 구조 polls/ __init__.py admin.py apps.py migrations/ __init__.py models.py tests.py views.py # polls/views.py from django.http import HttpResponse from django.shortcuts import render # Create your views here. def index(request): return HttpResponse('Hello, World. This Is Polls Index()') def select(request): ..

2. Django 프로젝트 생성 [내부링크]

현재 디렉토리에서 django_sample 이라는 디렉토리 를 생성 > django-admin startproject django_sample django_sample 디렉토리에 생성된 파일 및 구조 (https://docs.djangoproject.com/en/2.2/intro/tutorial01/) django_sample / manage.py django_sample/ __init__.py settings.py urls.py wsgi.py MySQL 을 사용할 것이므로 settings.py 소스 수정 과 패키지 설치가 필요하다. # Database # https://docs.djangoproject.com/en/2.2/ref/settings/#databases # DATABASES = { # 'de..

1. Django 및 기타 설치 [내부링크]

Python 3.7 설치 1. 패키지 설치 yum install gcc openssl-devel libffi-devel bzip2-devel wget 2. 해당 버전 다운로드(https://www.python.org/ftp/python/) wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz 3. 압축 해제 tar zxf Python-3.7.4.tgz 4. Configure And Install cd Python-3.7.4 ./configure --enable-optimizations make altinstall 5. 설치 확인 python3.7 -V 그냥 python 명령어로 python3.7 을 실행하고 싶을 때... vi /root/.bash..

[리팩토링] 임수변수 내용 직접 삽입 [내부링크]

간단한 수식을 대입받는 임시변수를 사용할때는 임시변수 참조 부분을 수식으로 치환 변경 전 double basePrice = anOrder.basePrice(); return (basePrice > 1000); 변경 후 return (anOrder.basePrice() > 10000); 변경 전 double basePrice = _quantity * _itemPrice; if (basePrice > 1000) return basePrice * 0.5; else return basePrice * 0.9; 변경 후 A if (getBasePrice() > 1000) return getBasePrice() * 0.5; else return getBasePrice() * 0.9; double getBasePric..

[리팩토링] 메소드 삽입 [내부링크]

호출하는 메소드의 기능이 너무 간단해서 내용이 뻔하다면 메소드 기능을 한개로 병합하고 삭제하자. 변경 전 String getRating() { return (isPassRate())? "Y" : "N"; } boolean isPassRate() { return _score > 5; } 변경 후 String getRating() { return (_score > 5)? "Y" : "N"; }

[리팩토링] 메소드 추출 [내부링크]

리팩토링의 주된 작업은 코드를 포장하는 메소드를 적절히 정리하는 것이다. 핵심적인 리팩토링 기법은 코드 뭉치를 별도의 메소드로 빼내는 메소드 추출, 반대로 메소드를 호출 하는 곳에 메소드 삽입 기법이다. 메소드 추출 메소드 추출시에 가장 힘든 작업은 지역변수 처리, 주로 임시변수로 힘든경우가 많음. 1. 임시변수를 메소드 호출로 전환 후 없어도 되는 임시변수 삭제 2. 임시변수가 여러곳에서 사용된다면 임시변수 분리 3. 임시변수가 너무 얽혀 있다면 자료 객체 클래스로 전환해서 사용 void printOwing(double amound) { printBanner(); print("name : " + _name); print("amount : " + amound); } void printOwing(doubl..

리팩토링 - 코드 개선 방법 [내부링크]

중복 코드 똑같은 코드 구조가 두 군데 이상 있을 때 그 부분을 하나로 통일하면 개선할 수 있다. 단순한 예는 한 클래스의 두 메소드 안에 같은 코드가 들어 있는 경우다. 이럴 때는 메소드 추출 기법을 적용해서 겹치는 코드를 빼내어 별도의 메소드로 만들고 그 메소드를 두 곳에서 호출 또, 한 클래스의 두 하위 클래스에 같은 코드가 들어 있는 경우가 있다. 메소드 추출 기법을 적용해서 중복을 없앤 후 메소드 상향 기법을 적용한다. 코드가 같지 않고 비슷하다면, 같은 부분과 다른 부분을 분리한 다음 템플릿 메소드 형성 기법을 알고리즘만 다르다면, 알고리즘 전환 기법을 중복코드가 중간에 있다면 주변 메소드 추출 기법을 적용한다. 서로 상관없는 두 클래스 안에 중복 코드가 있다면, 모듈 추출로 제3의 클래스로 ..

[리팩토링] 클래스 멤버변수 이동 [내부링크]

어떤 멤버변수 필드가 자신이 속한 클래스보다 다른 클래스에서 더 많이 사용 되어질 때 대상 클래스안에 새 필드를 선언하고 그 필드 참조 부분을 새 필드 참조 하도록 수정하자. 시스템이 발전하고 수정되어 앞으로 나아갈수록 새 클래스가 필요해지며 기능이 여기저기서 사용이 많아진다. 따라서 그러한 것들을 여기저기로 옮겨야 하는 상황과 필요가 있다. 지금은 합리적이고 올바르다고 판단해서 설계 및 개발을 했다 해도, 나중에는 그렇지 않을 수 있다. 문제는 그러한 상황에서 아무것도 하지 않는 것이다. 변경전 AccountType 클래스에서 interestRate 필드를 더 많이 사용하는 경우 class Account { private AccountType _accountType; private double _int..

[리팩토링] 객체간 메소드 이동 [내부링크]

메소드가 자신이 속한 클래스보다 다른 클래스의 기능을 더 많이 이용할 땐 그 메소드가 제일 많이 이용하는 클래스안으로 메소드를 이동하자 클래스에 기능이 너무 많거나 클래스가 다른 클래스와 과하게 연동되어 의존성이 지나칠 때는 메소드를 옮기는 것이 좋다. 옮기면 클래스가 간결해지며, 여러 기능을 더 명확하게 구현할수 있다. 옮기는 것이 판단하기 힘들거나 확신이 서지 않다면, 해당 메소드가 참조된 클래스를 확인해보고 직감에 따라 판단해서 옮겼더라도 나중에 다시 변경하면 된다. 변경전 class Account { private AccountType _accountType; private int _dayOverdrawn; double getOverdraftCharge() { if ( _accountType.is..

[리팩토링] 메소드를 메소드 객체로 전환 [내부링크]

장황한 메소드에서 각 부분을 간결한 메소드로 변경해서 보면 코드가 이해하기 쉬워 진다. ...는데 짧고 간단한 소스예제라 잘 모르겠음 ㅋ 이 방법 길고 복잡한 소스에서는 어떨까? 1. 전환할 메소드의 이름과 같은 새 클래스(Gamma)를 생성 2. 새 클래스에 final 필드로 클래스와 멤버변수를 속성 추가 3. 생성자로 필요 변수들을 받을수 있도록 함 4. 복잡한 계산 로직을 나눔 5. 메소드 객체로 전환할 클래스에서 새로 만든 클래스와 메소드를 호출 변경 전 Class Account { int gamma(int inputVal, int quantity, int yearToDate) { int importantValue_1 = (inputVal*quantity) + getDelta(); int impo..

[리팩토링] 매개변수로의 값 대입 제거 [내부링크]

Parameter(매개변수)는 Method 호출 시 argument 로 넘어간 변수를 칭한다. 여기서 매개변수로의 값 대입은 Parameter로 받은 변수의 값을 호출한 Method에서 어떠한 값을 대입 하는 경우를 말한다. 전달받은 매개변수에 특정 Object나 Variable등을 참조 대입시에 코드의 명료성과 코드를 보는 이에게 Call by value 인지 Call by reference 인지 혼동을 불러 일으킬수 있다. 따라서, 매개변수로의 값 대입을 코드 작성할 시 지양해야 하며, 발견시에 해당 내용을 수정할 수 있도록 하자. 변경 전 int discount (int inputVal) { if (inputVal > 50) inputVal -= 10; // below code blah blah }..

[리팩토링] 직관적 임시변수 사용 [내부링크]

사용된 수식이 봅잡할때 수식의 결과나 일부분을 직관적 이름의 임시변수에 대입 위에 조건문과 같은 경우에 논리조건문이 복잡해져서 코드를 보는 사람이 한번에 이해 하기 어려울때 사용하지만, 임시변수를 사용하면 메소드가 복잡해진다. 따라서, 더 좋은 방법이 없는지 생각해본 뒤 사용하자. 변경 전 if ( (platform.toUpperCase().indexOf('MAC') > -1) && (browser.toUpperCase.indexOf('IE') > -1) && wasInitialized() && (resize > 0) ) { // code blah blah } 변경 후 boolean isMac = platform.toUpperCase().indexOf('MAC'); boolean isIE = browse..

batch 프로그램으로 host 변경하기 [내부링크]

파일 4개를 생성 hosts_normal.txt 파일에는 기본 host 내용을 적고 hosts_test.txt 파일에는 추가할 ip와 domain 내용을 적고 저장한다 ## hosts_normal.bat 파일 내용 @echo off copy /Y C:\Windows\System32\drivers\etc\hosts_normal.txt C:\Windows\System32\drivers\etc\hosts ## hosts_test.bat 파일 내용 @echo off copy /Y C:\Windows\System32\drivers\etc\hosts_test.txt C:\Windows\System32\drivers\etc\hosts

Flask Flask-SQLAlchemy [내부링크]

db init_app config class DevConfig(Config): # Dev Config ENV = 'dev' DEBUG = True TESTING = True # Dev Database SQLALCHEMY_TRACK_MODIFICATIONS = True SQLALCHEMY_ECHO = False SQLALCHEMY_RECORD_QUERIES = True SQLALCHEMY_DATABASE_URI = 'mysql://아이디:비밀번호@192.168.1.222:3306/test' # 데이터베이스 Binds SQLALCHEMY_BINDS = { 'test' : 'mysql://아이디:비밀번호@아이피:포트/test', 'EXPORT' : 'mysql://아이디:비밀번호@아이피:포트/EXPORT', ..

Flask Request Handler, Error Handler [내부링크]

Request Handler """ before_first_request : 웹 어플리케이션 기동 이후 가장 처음에 들어오는 HTTP 요청에서만 실행 before_request : 매 요청시 실행 after_request : 요청이 끝나 브라우저에 응답하기 전에 실행 teardown_request : 요청의 결과가 브라우저에 응답한 다음 실행 teardown_appcontext : HTTP 요청이 완료 되면 실행 되며, 애플리케이션 컨텍스트 내에서 실행 """ # 웹 브라우저로부터 HTTP 요청이 들어올 때마다 호출되는 메소드 @app.before_request def before_request(): g.temp = 'before_request' # print(getattr(g, 'temp', None)..

Centos7 ElasticSearch 설치 [내부링크]

Java 버전 확인 > java -version 없으면?? > yum install java 1.8 버전 이상인지 확인하자 elasticserach 7 버전 다운받자 > cd /home > wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.3.0-x86_64.rpm > rpm --install elasticsearch-7.3.0-x86_64.rpm /etc/elasticsearch.yml 수정 # Path to directory where to store the data (separate multiple locations by comma): # #path.data: /var/lib/elasticsearch path.data..

Centos7 Nginx, PHP, MySQL Codeigniter 프로젝트 세팅 [내부링크]

세팅 전 > yum install unzip net-tools wget > yum install openssl openssl-devel curl libcurl libcurl-devel > mkdir /home/mysql Nginx # Nginx 설치 > vi /etc/yum.repos.d/nginx.repo # Insert this parhase [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1 # Firewall 설정 > yum install nginx > firewall-cmd --permanent --zone=public --add-service=http > firewall..

개발에 있어서... [내부링크]

개발에 있어서 . 리펙토링의 개념을 제대로 알고 있는가 . 상황에 맞는 적절한 디자인 패턴을 적용할 수 있는가 . 프로그램 버전과 문서화를 얼마나 꼼꼼히 하는가 . 최신 기술에 관심이 있는 사람인가, . 팀의 업무 문화와 수준을 올려줄 수 있다는 믿음을 주는 사람인가, . 팀 작업에 중점을 두는가, 본인에게 익숙한 것에 중점을 두는가, 개발 전 . 툴 활용 능력이 아예 없는 사람은 아닌가? . 자기 생각을 먼저 정리하고 문서화 하는가, . 다른 사람과의 대화를 통해 목적을 뚜렷이 하는가, 개발 중 . 사용하는 라이브러리나 프레임워크에 대한 지식이 있는가, . 설계의 간소화를 위해 노력하는가, 그리고 구현하는가, . 최신 기술을 얼마나 효율적으로 적용해 프로그램의 질을 향상하는가, . 툴이 알려준 경고들에..

Centos Laravel 설치 [내부링크]

PHP # php 버전 확인 php -v # php 7버전대가 아니라면 삭제 yum remove php-* yum remove php-common mod_php php-cli # php 설치 yum install php71w yum install php71w-cli php71w-common php71w-dba php71w-devel php71w-fpm php71w-gd php71w-imap yum install php71w-ldap php71w-mbstring php71w-mcrypt php71w-mysqlnd php71w-odbc php71w-opcache yum install php71w-pdo php71w-pdo_dblib php71w-pear php71w-pecl-imagick php71w-pec..

설치 에러 발생시 대처 [내부링크]

Apache apr설치시 libtoolT No such file 에러시 # cp -arp libtool libtoolT 다시 ./configure 명령어 실행 PHP off_t undefined 에러시 --enable-zip 제거 Cannot find libmysqlclient_r 에러시 # cd /usr/local/mysql # ln -s ./lib ./lib64clea make:***[sapi/cli/php] 오류 1 # vi Makefile EXTRA_LIBS= -liconv 추가 # make 그래도 에러?? ㅠㅠ libiconv 경로 확인 후 --with-iconv-dir=경로 SVN svn 클론 에러 - vi ~/.subversion/servers 그런후 [global] 항목에 다음의 내용을 삽..

GitLab - SVN 마이그레이션 및 Clone [내부링크]

참고 http://blog.sz21c.com/569 마이그레이션 1. java -jar svn-migration-scripts.jar authors svn://192.168.1.107/wms_kr02 > authors.txt 실행 후 authors.txt에 메일을 알맞게 변경한다. 2. git svn clone --authors-file=authors.txt --no-metadata svn://192.168.1.107/wms_kr02 3. SourceTree에서 해당 폴더 Open 후, 저장소 설정에 GitLab 주소와 아이디 정보 저장한다. 4. 소스트리 해당 저장소 패치를 받는다. 5. Push를 진행하는데, Branch에 주의해서 강제푸쉬+모든 태그에 대해서 푸쉬를 진행한다. GitLab 프로젝트에..

Centos7 + Lucene Solr 8.2 설치 및 실행 [내부링크]

Java 버전 확인 > java -version 없으면?? > yum install java 1.8 버전 이상인지 확인하자 다운로드 > wget https://archive.apache.org/dist/lucene/solr/8.2.0/solr-8.2.0.tgz > tar -zxvf solr-8.2.0.tgz > useradd solr -p solr > chown solr:solr -R /home/solr-8.2.0 포트 > firewall-cmd --permanent --zone=public --add-port=8983/tcp (firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address=192.168.1.58 port port=..

Centos 7 Flask 설치 [내부링크]

1. 패키지 설치 yum install gcc openssl-devel libffi-devel bzip2-devel 2. 해당 버전 다운로드(https://www.python.org/ftp/python/) wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz 3. 압축 해제 tar zxf Python-3.7.4.tgz 4. Configure And Install cd Python-3.7.4 ./configure --enable-optimaizations make altinstall 5. 설치 확인 python3.7 -V 그냥 python 명령어로 python3.7 을 실행하고 싶을 때... vi /root/.bashrc 아래와 같이 alias py..

fail2ban [내부링크]

https://www.evoluso.com/how-to-protect-ssh-with-fail2ban-on-centos-6/ https://www.lesstif.com/pages/viewpage.action?pageId=43843899 [명령어] service fail2ban start / stop fail2ban-client status sshd fail2ban-client status mysqld-auth whois 패키지 쓸라면?? -> yum install jwhois [DEFAULT] ignoreip = 127.0.0.1/8 192.168.0.1/255 bantime = 7200 findtime = 600 maxretry = 3 destemail = sender = root@API-WH mta ..

CentOS 7 / 고정 IP 설정하는 방법 [내부링크]

CentOS 7 / 고정 IP 설정하는 방법 CentOS 7을 설치할 때 네트워크를 설정할 수 있습니다. GUI 환경이므로 네트워크 설정을 알고 있다면 쉽게 고정 IP로 설정할 수 있습니다. 만약 DHCP로 설치했다면 다음과 같은 방법으로 고정 IP 설정을 할 수 있습니다. 네트워크 설정 파일 열기 네트워크 설정 파일은 /etc/sysconfig/network-scripts/ifcfg-enp0s3입니다.(파일 이름은 다를 수도 있습니다.) 설정 파일을 텍스트 에디터로 엽니다. TYPE="Ethernet" PROXY_METHOD="none" BROWSER_ONLY="no" BOOTPROTO="dhcp" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6..

넷기어 VPN - L2TP 설정 [내부링크]

1. First, create a mode config profile. Go to VPN > Mode Config > Add. Note: The IP address information used in this mode config is the sample LAN network of a client (192.168.0.x). The First Pool should be any network OTHER than the actual network being used (I used 192.168.10.x). 2. Then, create the IKE Policy manually. Go to VPN > IPSec VPN > IKE Policy > Add. 3. Once done, create an IPSEC us..

MySQL Replication 연결 [내부링크]

# Master mysql > show master status; ex ) +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000010 | 6696003 | | | | +------------------+----------+--------------+------------------+--------..

MySQL DB 명세서 쿼리 작성 [내부링크]

SELECT t1.table_name, t1.table_comment, column_name, data_type, column_type, column_key, is_nullable, column_default, extra, column_comment FROM (SELECT table_name, table_comment FROM information_schema.TABLES WHERE table_schema='WH') t1, (SELECT table_name, column_name, data_type, column_type, column_key, is_nullable, column_default, extra, column_comment, ordinal_position FROM information_sche..

MySQL innodb 버퍼 할당 에러 [내부링크]

vi /ect/mysql/my.cnf # innodb 설정 값 중 메모리량을 적절하게 변경 innodb_buffer_pool_size = 5120M innodb_data_file_path = ibdata1:1000M:autoextend 2018-07-13 14:00:43 21419 [Note] InnoDB: Initializing buffer pool, size = 5.0G InnoDB: mmap(686817280 bytes) failed; errno 12 2018-07-13 14:00:44 21419 [ERROR] InnoDB: Cannot allocate memory for the buffer pool 2018-07-13 14:00:44 21419 [ERROR] Plugin 'InnoDB' ini..

MySQL 프로시저 디버그 [내부링크]

CREATE DEFINER=`jay_g`@`192.168.1.88` PROCEDURE `debug_msg`(_type VARCHAR(100) ,msg VARCHAR(255)) BEGIN SELECT concat("** DEBUG ** ", _type ," : ", msg) AS 'DEBUG'; END

MySQL error 1364 Field doesn't have a default values [내부링크]

MySQL 5.6 이전에는 필드 생성시 default 값을 따로 지정을 안 해도 insert 시에 '' 처럼 자동으로 디폴트 값이 반영이 되었습니다. 5.6 이후부터는 STRICT 모드라고 해서 테이블 생성시에 default 값을 지정하지 않을 경우 insert 시에 아래와 같이 에러가 발생합니다. Field 'name' doesn't have a default value 외부 프로그램을 사용시 테이블의 필드들을 모두 수정하기는 힘든 경우가 많습니다. 이런 경우 my.cnf 에서 기본 설정을 되어 있는 STRICT 모드를 해제해 줍니다. #sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES sql_mode=NO_ENGINE_SUBSTITUTION 해제 후에 MyS..

MySQL Dump시 테이블 Lock 에러 [내부링크]

mysqldump: Got error: 1044: Access denied for user 'root'@'localhost' to database 'information_schema' when using LOCK TABLES 에러 발생 시 GRANT SELECT,LOCK TABLES ON DBNAME.* TO 'username'@'localhost'; flush privileges;

MySQL 접속 유저 추가 [내부링크]

# 현재 유저별 호스트 확인 select user,host,password from mysql.user order by user; # 유저 추가 create user 'ID'@'a.b.c.d' identified by 'PASSWD'; grant all privileges on *.* to 'ID'@'a.b.c.d' with grant option; flush privileges; 5.7 버전 이상시 select user,host,authentication_string from mysql.user order by user; create user 'id'@'a.b.c.d59' identified by 'passwd'; grant all privileges on *.* to 'id'@'a.b.c.d' wit..

[토끼책] 객체지향의 사실과 오해 - 2장. 이상한 나라의 객체 [내부링크]

객체를 발견하고 창조하는 것은 지식과 행동을 구조화 하는 문제이다 (by. 레베카 위프스브록) 인간은 본능적으로 세상을 독립적이고 식별 가능한 객체의 집합으로 바라본다. 많은 사람들이 객체지향을 직관적이고 이해하기 쉽다고 하는 이유는 객체지향이 세상을 자율적이고 독립적인 객체들로 분해할 수 있는 기본적인 인지능력에 기반을 두고 있기 때문이다. 하지만 인간은 물리적인 한계를 넘어 추상적인 사물까지도 객체로 인식할 수 있다. (주문, 통장의 이체 등 손이나 눈에 안보이는 추상적인 것들) 저자는 이 장의 설명을 위해서 "이상한 나라의 앨리스" 책의 앨리스를 예로 들고 있다. 문을 지나 정원을 가기 위해서 앨리스는 키를 조정해야 한다. 병속의 액체나 케이크를 먹는 것으로 키를 조정할 수 있다고 하며 또, 버섯으..

[토끼책] 객체지향의 사실과 오해 1장 - 협력하는 객체들의 공동체 [내부링크]

"객체지향이란 실세계를 직접적이고 직관적으로 모델링 할 수 있는 패러다임" 현실 속에 존재하는 사물을 최대한 유사하게 모방해 소프트웨어 내부로 옮겨오는 작업. 즉, 객체지향 소프트웨어는 실세계의 투영이며 현실 세계 사물에 대한 추상화이다. 하지만, 현실은 객체에 직접적으로 대응되는 실세계의 사물을 발견한 확률은 높지 않다. 또 존재하더라도 유사성을 찾기가 매우 어려운 게 일반적이다. 화재의 확산을 막는 "방화벽" 과 네트워크의 침입을 막는 "방화벽" 을 예시로 실제 사물과 소프트웨어 객체 간의 의미적 거리와 연관성 간의 괴리를 예로 들을수 있다. 예 소프트 웨어에서 보는 객체 : 행위에 대한 "캡슐화(encapsulation)" 와 "자율성(autonomous)" 메시지(아규먼트) : 현실 세계의 사람들..

MySQL 5.7 설정 튜닝 [내부링크]

MySQL 5.7에서 가쟝 중요한 4가지 변수가 있다. [mysqld] innodb_buffer_pool_size = 10240M (램의 50~70% 정도로 설정) innodb_log_file_size = 256M innodb_flush_log_at_trx_commit = 1 # may change to 2 or 0 innodb_flush_method = O_DIRECT // performance_schema 데이터베이스 사용 USE performance_schema // 현재 쓰레드(연결) 개수 확인 SELECT * FROM performance_schema.threads // 현재까지 누적된 쿼리 패턴 통계 확인 SELECT * FROM performance_schema.events_statement..

Indexing for High Performance [내부링크]

Indexing for High Performance Index 는 좋은 성능을 위해서 중요하며 데이터가 점점 커지면 커질수록 더욱 중요해진다. 불행하게도, Index 는 종종 잊혀지거나 오해 되어 잘못 사용 될 수 있고 이는 현실 세계에서 문제가 된다. (저자 : 그래서 우리가 query optimzation 보다 앞 챕터로 넣은 것이다.) 인덱스 최적화는 쿼리 최적화를 위한 가장 강력한 방법이다. 진실된 인덱스 작업은 너의 쿼리 재작성을 요구할 수 있다. 따라서 쿼리 최적화보다 먼저 배워랑 Indexing Basics MySQL에서 storage engine 비슷한 방법으로 인덱스를 사용한다. storage engine은 인덱스 자료 구조에서 값을 찾는다. 값을 매칭 되는 것을 찾을 때, storag..

데이터 베이스 설계 프로세스 [내부링크]

데이터 베이스 설계 프로세스를 수행하는 방법에 대한 전반적인 생각과 프로세스에 포함된 각 순서에 대한 일반적인 생각을 가지고 있는 것은 중요하다. 일곱단계에 걸쳐서 설계 프로세스에 있는 정리 했으며, 설계 프로세스에 대한 전체적인 그림과 기술들의 이해를 보다 명확하게 할 수 있도록 도움이 되길 바란다. 새로운 데이터베이스를 설계할 때나 현재 운영중인 데이터베이스를 개선할 때, 혹은 분석한 결과를 토대로 새로운 데이터베이스를 설계하기 위해 운영 중인 데이터 베이스를 설계 할때 사용할 수 있을 것이다. 데이터 베이스에서 구조적인 무결성과 데이터 무결성의 수준이 전체적으로 설계 프로스세를 준수한 수준과 정비례 관계에 있다. 임무 목표와 임무 명세 정의 데이터 베이스의 임무 목표와 임무 명세를 정의하는 단계이다..

Isolation level (트랜잭션 고립(격리) 수준) [내부링크]

Isolation Levels (트랜잭션 고립(격리) 수준) 우선 Transaction에서 사용 되는 개념이다. SQL은 4개의 Isolation level을 정의하고 있다. READ UNCOMMITTED, READ COMMITED, REPEATABLE READ, SERIALZABLE 각 Storage Engine 혹은 DBMS 마다 조금씩 다르게 구현 되어 있다. 따라서, 어떤것을 사용하기 전에 메뉴얼을 읽어보자(언제 읽냐...) READ UNCOMMITTED Transaction은 uncommitted 결과를 볼 수 있다. 이 단계에서 너가 정말 정말 좋은 의도로 개발을 했지만 많은 문제가 발생할 수 있다. 이 단계는 거의 실용적이지 않다. 왜냐하면, 성능이 다른 레벨들보다 좋지 않기 때문이다. un..

트랜잭션 너는 누구니? [내부링크]

When should I use transactions in my queries? Basically any time you have a unit of work that is either sensitive to outside changes or needs the ability to rollback every change, if an error occurs or some other reason. 트랜잭션의 특징 트랜잭션의 특징은 크게 4가지로 구분된다. 원자성 (Atomicity) 일관성 (Consistency) 독립성 (Isolation) 지속성 (Durability) 첫번째로, 원자성은 트랜잭션이 데이터베이스에 모두 반영되던가, 아니면 전혀 반영되지 않아야 한다는 것이다. 트랜잭션은 사람이 설계한 논리적..

MySQL's Storage Engines - InnoDB Engine [내부링크]

InnoDB Engine ** 개요 ** InnoDB는 가장 중요하며 광범위하게 활용적인 Default Transactional storage engine 이다. 짧은 생명주기의 Transaction 처리 완료를 위해 디자인 되었다. (롤백 보다는) InnoDB는 Tablespace 라고 알려진 한개 이상의 데이터 파일 시리지 안에 자체 파일을 저장한다. (Tablespace 는 근본적으로 InnoDB가 자기 자신을 관리하는 블랙박스이다.) InnoDB는 각 테이블의 데이터와 인덱스들을 분리된 파일로 저장할 수 있다. (각각의 Tablespace를 만듬으로서 raw disk partition을 사용할 수 있다. 최신의 파일시스템이 이를 필요하지 않게 만들기는 했지만) ** MVCC ** 높은 동시 처리성..

프로시저 언제 사용해야 하나? [내부링크]

The benefits of using stored procedures in SQL Server rather than application code stored locally on client computers include: They allow modular programming. They allow faster execution. They can reduce network traffic. They can be used as a security mechanism. Determine when to use stored procedures vs. SQL in the code Stored procedures in SQL Server are similar to procedures in other programm..

MySQL's Storage Engies - MyISAM Engine [내부링크]

MyISAM ** 개요 5.1 버전 이하 default storage engine 이다. full-text 인덱싱, 압축, spatial functions 등 다양한 기능들을 제공 한다. Transaction 이나 row-level lock 은 제공 안 한다. 가장 큰 취약점은 충돌에서 안전하지 않다는 점이다. (The fact it isn't even remotely crash-safe) ** 왜 충돌에서 안전하지도 않고 non-transaction 인 MyISAM을 계속해서 사용 하는 것일까?? (저자 : 모든 부분에서 나쁘지는 않다. Non-trasaction, non-crash-safe를 한다면... ) 만약 read-only 혹은 데이터가 크지 않거나, 복구에 마음이 아프지 않을려면 묻지 말고 ..

Centos 파일, 디렉토리 찾기 [내부링크]

파일 찾기 (파일명 검색) 현재 디렉토리에서, pl 확장자를 가진 모든 파일 찾기 find -name '*.pl' (현재 디렉토리 밑의 하위 디렉토리까지 다 찾습니다.) 루트에서부터, 즉 전체 하드에서, pl 확장자를 가진 모든 파일 찾기 find / -name '*.pl' 전체 하드 디스크에서, 파일명이 ab 로 시작하는 모든 파일 찾기 find / -name 'ab*' 전체 하드 디스크에서, 파일명이 .bash 로 시작하는 모든 파일 찾기 find / -name '.bash*' 전체 하드 디스크에서, 파일명이 .bash 로 시작하는 모든 파일 찾기 + ls 명령 형식으로 출력 find / -name '.bash*' -ls 뒤에 -ls 라는 옵션을 붙이면 됩니다. 디렉토리명 찾기 전체 하드 디스크에서,..

Centos 6, 7 포트 추가 [내부링크]

Centos 6의 경우 # 우선 포트를 먼저 확인 하자 netstat -ntlp # 파일 오픈 vi /etc/sysconfig/iptables # 특정 포트 Open -A INPUT -m state --state NEW -m tcp -p tcp --dport 81 -j ACCEPT # 특정 포트 + IP 대역으로 한다고 하면, -A INPUT -p tcp -s 27.1.217.110 --dport 8988 -j ACCEPT # 재시작 service iptables restart 혹은 /etc/init.d/iptables restart service iptables save Centos 7의 경우 firewall-cmd --permanent --zone=public --add-port=3306/tcp # ..

PIP 꼬임 [내부링크]

https://stackoverflow.com/questions/50742538/importerror-no-module-named-sysconfig-cant-get-pip-working?newreg=8ac8ac18382346d28bf285f5fc5fbdef

파이선, 쉘스크립트 윈도우 -> 리눅스 되었을때 발생하는 문제 [내부링크]

linux 에서 스크립트 실행할 때 /bin/sh^M: bad interpreter: No such file or directory 와 같은 에러 메시지가 나타날 때가 있다. 유닉스 개행문자와 도스 개행문자가 섞여있어서 발생 즉 Line seperator 문제이다 CRLF를 LF로 변경하면 해결되는 문제인데 불가피한 상황에서 처리 방법이다. vi -b vi 의 바이너리 모드로 들어가면 ^M 이라는 문자가 보인다. 이것을 지워주면 된다. vim -b 파일이름 명령줄에 :%s/^M//g 입력하면 ^M이 다 삭제됨 ^ : CTRL + v M : CTRL + M 클릭해야함

쉘 접속 지연 문제 해결 방법 [내부링크]

GSS-API or DNS 문제일 확률이 높다 gss-api check time이 오래 걸릴 경우 gss-api 인증을 disable한다. (ssh -v option으로 확인 가능) gss-api disable 후에도 해결 안될시에는 DNS 문제이다 근본적인 해결 방법은 DNS Server 설정 부분을(/etc/resolv.conf) 수정하는것이지만 ssh에서 dns를 disable하여 해결 할 수 있다. (sshd config 설정(GSSAPIAuthentication, UseDNS)) vi /etc/ssh/sshd_config # GSSAPI options GSSAPIAuthentication no # DNS option UseDNS no service sshd restart