728x90
728x90

전체 글 630

자바(Java)에서의 싱글톤(Singleton) 패턴에 대해 알아보자

Singleton이 무엇인가? Singleton은 어떤 클래스가 최초 한 번만 메모리에 할당하고(Static) 그 메모리에 대해서 객체를 만들어 사용하는 디자인 패턴이다. 생성자 호출이 반복적으로 발생한다고 하더라도, 새로운 인스턴스를 생성하는 것이 아니라 최초 생성된 인스턴스를 반환해주는 것을 말한다. Singleton을 왜 사용하는가? 고정된 메모리 영역을 얻으며 생성된 인스턴스를 계속 사용하기 때문에 메모리 낭비를 방지할 수 있으며, 생성된 인스턴스는 전역 인스턴스이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기가 쉽다고 한다. DBCP(DataBase Connection Pool) 같이 공통된 객체를 여럿 생성해 사용해야할 때 많이 사용한다. Singleton 사용 시 조심해야 되는 부분 ..

MySQL에서 sql 파일로 데이터 추가 시 한글 깨짐 문제(feat:명령프롬프트)

Workbench 같은 좋은 SQL 관련 프로그램들이 많이 나와 있어서 흑백 바탕에 무언가를 입력하는 사람들이 많이 줄어든 것 같다. 그래도 아직까지는 명령어가 편한 사람들이 많고, 특히 입문자들은 명령 프롬프트(cmd.exe)를 이용해서 mysql에 접속해서 쿼리를 날리는 것 같다. MySQL 대부분의 인코딩 문제는 인코딩 관련 설정 문제라서 관련 글들을 참조하면 잘 해결할 수 있다. 보통의 경우 UTF-8로 데이터를 설정하는데 설정 문제에서 해결을 보면 좋지만, 그게 아닌 경우가 간혹 있다. 예를 들어, sql 파일을 source 명령어로 실행하는 경우라면 입력 데이터와 DB의 인코딩 설정이 문제가 아닐 수가 있다. 분명 모든 설정들, SQL과 입력되는 데이터까지 UTF-8로 인코딩이 되어 있는 상황..

자바(Java)와 메모리(Static, Stack, Heap)에 대한 정리

코드를 조금 더 실용적으로 작성하기 위해선 JVM의 메모리 영역들에 대한 이해가 필요하다. 모든 것을 다 Heap이나 Stack에 밀어 넣고 인스턴스 생성과 Thread Safe에 대해 고려하지 않는 등의 행위는 적절하지 않기 때문이다. 메모리 영역에 대한 이해와 그를 바탕으로 한 코드 설계는 개발자가 더 나은 코드를, 그로 인해 더 나은 개발자가 되기 위해서는 필수적이다. 세부적으로 따지면 코드 영역 같은 것도 있고 하지만, 크게 이렇게 다루고 신경써줘야 하는 부분은 static, stack, heap이다. 각 영역마다 특징적인 것들이 있고, 그렇다 보니 그 특징들을 고려해서 코드를 작성해야 인스턴스의 불필요한 생성을 방지하고, Thread Safe를 보장할 수 있으니 잘 짚고 넘어가는 것이 필요하다...

Redirect와 Forward에 대한 간단 비교

모든 내용을 언급하기 앞서 둘의 가장 큰 차이를 딱 하나로 말하라고 하면, 사용자에게(웹 브라우저에서) URL이 변경되어 보이는지 여부일 것이다. Forward Web Container에서의 페이지 이동만 진행되므로 웹 브라우저에는 해당 내용이 노출되지 않는다. 웹 브라우저에는 최초 호출 URL만 남아 있고, forward 과정에서 거쳐가는 URL은 노출되지 않으며, forward를 통해서 Request 객체와 Response 객체가 공유된다. 이러한 특성 때문에, 경우에 따라서 forward를 쓰면 문제가 발생할 수 있다. 예를 들어, 유저가 글쓰기나 삭제, 수정 과 같은 변경 작업을 요청으로 보냈고 그에 대해 응답을 할 수 있도록 forward로 응답 페이지를 불러온다고 가정하자. 이 과정에서 어떤 ..

토막 정보 - Command Line으로 MySQL 원격 접속 시 옵션 값들

EC2 위에 올려놓은 MySQL에 접속하거나, 다른 워크스테이션의 DB 등에 접근할 때, 원격 접속을 할 일이 생기는데 그때마다 주로 Workbench로 처리를 하는 편이었다. Workbench가 시각적으로 활용하는 것이나, 환경 확인하는데 있어서는 되게 쉬운 편이지만, 입문을 CLI 환경에서 하다 보니 편하지 않을 때가 많고, Workbench를 사용하지 못하는 경우가 생긴다. 최근에 딱 그런 상황이 왔는데, 원격 접속을 하려니 완전히 애를 먹었다. 대충 다음과 같은 상황이라고 가정했을 때, 주소 : 255.255.255.0 포트번호 : 3306 ID : user PW : user CLI에서 MySQL 외부 접속을 위해서는 다음과 같은 명령어를 쳐야 한다. mysql -h 255.255.255.0 -P..

Windows10 CUDA + OpenCV 4 빌드 에러 LINK : fatal error LNK1181: '..\..\lib\Release\opencv_world440.lib'

Microsoft Visual Studio 2019를 활용해서 OpenCV에서 CUDA 좀 쓰려고 빌드를 하려는데 에러를 막 토해낸다. 에러 코드는 다음과 같은 에러들이 막 쏟아져 나왓다. LINK : fatal error LNK1181: '..\..\lib\Release\opencv_world440.lib' 입력 파일을 열 수 없습니다. "opencv_perf_core.vcxproj" 프로젝트를 빌드했습니다. - 실패 원인을 찾아보니까 OpenCV 자체가 문제가 아니라 CUDA 버전이 문제였다. CUDA 10.0은 Visual Studio 2017까지만 빌드가 가능하고, 그 이후 버전을 이용해야 한다. 나는 이걸 두 번이나 삽질하고 나서 CLI로 빌드를 돌려보고 나서야 알았다.

Library/OpenCV 2020.08.29

강화학습 Deep Q-Network(DQN)에 대한 정리

현재 학교 졸업 프로젝트로 강화 학습 관련 프로젝트를 진행하고 있다. 그러면서 DQN에 대한 차이를 설명하면서 여러 자료를 보게 됐고, 이를 좀 정리하기 위해 남겨 놓는다. Deep Q-Network Q-Learning에 Value Function Approximation(VFA)을 사용하는 것은, Weight Update 과정에서 샘플들 간의 상관관계와, Non-stationary Target으로 인해 수렴하지 않고 발산 가능성이 있다. 이러한 문제를 해결할 필요가 있는데 Deep Q-Learning(DQN)이 이 문제를 Experience Repaly와 Fixed Q-targets으로 해결을 시도하였다. State, Action을 Q-Table로 정의하기에 Table이 너무 방대해지는 경우(ex, 간..

TensorFlow, Keras GPU 메모리 문제(Out of Memory) 발생 시 시도해볼 방법

빅데이터 처리나 딥러닝을 하다보면 자연스럽게 마주하는 문제가 바로 메모리 문제다. 빅데이터 처리 같은 경우 그냥 파이썬에서 Numpy나 Dataframe을 사용하는 과정에서 발생하는 일이 흔하고, 그때마다 gc를 호출하거나, 처리하는 데이터의 양을 분할하는 방법, 변수 타입 변경 등 다양한 방법이 있어서 해결하기 쉬운데, 딥러닝은 그게 쉽지가 않다. 그래도 시도해볼 방법은 있다. 주로 메모리 에러를 마주할 때 보게 되는 메세지는 아래 부류들이다. OOM(Out of Memory)Resource exhausted: OOM when allocating tensor with shape Failed to get convolution algorithm. This is probably because cuDNN fa..

Node.js Express Framework에 대해서 미들웨어와 라우터 등 간략 정리

bin/www http모듈에 express 모듈을 연결하고, 포트 지정하는 부분 콘솔 명령어로도 만들 수 있으며 그때, 주석처리된 #!/usr/bin/env node이 사용됨 전역 설치 후 rimraf와 같이 명령어로도 실행할 수 있음 var app=require('../app'); var debug=require('debug')('learn-express:server'); var http=require('http'); app, debug, http 모듈 가져옴 var port=normalizePort(process.env.PORT || '3000'); app.set('port',port); 실행될 포트 지정, 기본 값 3000 데이터를 app.set으로 지정하고, app.get으로 가져올 수 있음 va..

깊이 우선 탐색(DFS)과 너비 우선 탐색(BFS) 정리 - 기본적인 특징과 유의 사항에 대해서

깊이 우선 탐색과 너비 우선 탐색에 대해 간단하게 비교하여 정리하고자 한다. 두 알고리즘은 생각보다 알고리즘 문제 풀이에서 많이 볼 수 있고, 각각의 응용 방식을 통해 나오는 코딩 테스트 문제가 많기 때문에 참고해두는 것이 좋고, 기본적인 구현 방식은 알고 접근하는 것이 좋다. 기본적인 구현 코드는 백준 온라인 저지의 1260번 DFS와 BFS 을 구현하는 코드이다. DFS(Depth-First Search) Stack으로 구현할 수 있고, 함수 호출도 Stack처럼 이뤄지기 때문에 대부분 재귀 함수로 구현된 코드들이 많다. DFS는 미로 찾기로 치면, 막히는 곳까지 계속 파고 드는 Leaf-wise한 방식이다. 분기점이 나오면 길 하나를 선택하고 더 이상 진행하지 못하는 시점까지 진행한다고 보면 이해하..

728x90