목록전체 글 (252)
Joonas' Note
정의 Interface Segregation Principle (ISP; 인터페이스 분리 원칙) 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다. 위반 사례 이 ATM기는 총 3개의 모듈을 가지고 있는데, 어떤 거래(transaction)에 대해서 입금(Deposit), 출금(Withdrawal), 송금(Transfer) 모듈을 각자 만들었다. 각 모듈은 전문화된 기능을 가지기 위해 분리되었지만, 무언가 이상하다. 입금 거래 모듈은 입금만 하면 되는데, 위 구조와 같다면 코드가 이럴것이다. public class DepositTransaction extends Transaction implements UI { @Override public void requestDepositAm..
정의 Liskov Substitution principle (LSP; 리스코프 치환 원칙) 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다. 어떤 모듈 S가 모듈 T의 하위 모듈이라면, 속성의 변경없이 T를 S(상위)로 교체할 수 있어야 한다고 한다. 즉, 부모 클래스와 자식 클래스가 일관되어야 한다는 뜻이다. 위반 사례 이를 위반하는 대표적인 사례로는 원-타원 문제 (또는 사각형-정사각형 문제)가 있다. class Rectangle { private int width; private int height; public void setWidth(int width){ this.width = width; } public void setHeight(int he..
SOLID 원칙들은, 소프트웨어 작업에서 프로그래머가 소스 코드를 읽기 쉽고 확장하기 쉽게 될 때 까지 리팩토링하여 코드 냄새를 없애기 위해 쓰기 좋은 지침이다. 정의 Open/Closed Principle (OCP; 개방-폐쇄 원칙) 소프트웨어 요소는 확장에는 열려 있으나, 변경에는 단혀 있어야 하다. 모듈 중 하나를 수정했는데, 그 모듈을 사용하는 모든 모듈의 코드를 수정하는 일이 있으면 안된다는 뜻이다. 조금만 떠올려봐도 얼마나 끔찍한 일인 지 알 수 있다. 확장에 대해 열려 있다. 이것은 모듈의 동작을 확장할 수 있다는 것을 의미한다. 애플리케이션의 요구 사항이 변경될 때, 이 변경에 맞게 새로운 동작을 추가해 모듈을 확장할 수 있다. 즉, 모듈이 하는 일을 변경할 수 있다. 수정에 대해 닫혀 있..
SOLID 원칙들은, 소프트웨어 작업에서 프로그래머가 소스 코드를 읽기 쉽고 확장하기 쉽게 될 때 까지 리팩토링하여 코드 냄새를 없애기 위해 쓰기 좋은 지침이다. 정의 Single Responsibility Principle (SRP; 단일 책임 원칙) 하나의 클래스나 모듈은 단 하나의 책임만 가져야 한다. 하나의 함수가 여러 개의 일을 한다는 뜻은 예측 불가능하다는 의미이다. 예시 아주 단적인 예시로, 끝 원소를 제거를 하는 함수가 삭제되는 원소를 반환할 이유는 없다. 제거만 하면 된다. Element pop() { if (size < 1) throw "Empty"; size = size - 1; return array[size + 1]; // ? } 삭제되는 값을 얻고 싶다면, pop 하기 전에 끝자..
Proximal Policy Optimization (PPO, 2017) 목적 함수를 완성하기 위한 gradient 식은 아래와 같다. $$ \nabla_{\theta}J_{\theta} \cong \sum_{t=0}^{\infty} \int_{s_t,a_t,s_{t+1}}\nabla_{\theta}lnp_{\theta}(a_t|s_t)~A_t~p_{\theta}(s_t,a_t)~p(s_{t+1}|s_t,a_t)~ds_t,a_t,s_{t+1} $$ 여기서 \(A_t\)는 n-step TD error 인데, \(A_t\)의 정의에 따라서 아래와 같이 달라졌었다. $$ A_t = \begin{cases} G_t & \longrightarrow REINFORCE \\ Q(s_t) & \longrightarro..
A3C (Asynchronous A2C, 2016) 샘플 사이의 상관 관계를 비동기 업데이트로 해결 리플레이 메모리를 사용하지 않음 on-policy 개념적으로는 A2C 를 여러개 두고, 각 에이전트마다 아래와 같이 gradient를 계산해서, 그걸 글로벌 네트워크에 반영하는 방식이다. $$ Q_{(1)}(s_t,a_t)(-\sum y_i log p_i) \rightarrow gradient_{(1)} \\ Q_{(2)}(s_t,a_t)(-\sum y_i log p_i) \rightarrow gradient_{(2)} \\ \vdots $$ 배경 A2C는 샘플 간 상관 관계에 문제가 있었다 시간의 흐름에 따라, 샘플을 수집했기 때문 또한 샘플에 따라 정책(\(\pi\))이 업데이트 되고, 업데이트 된 정..
책을 읽다가 행렬식(determinant)에 대한 노트를 읽었는데, 기하학적으로 설명된 부분에 궁금한 점이 생겨서 정리해보고자 한다. 2X2 행렬 책에서는 2X2 행렬에 대해서 \(det(A)~=~a_{11}a_{22} - a_{12}a_{21}\) 을 이렇게 설명하고 있었다. 행렬 \(A~=~\begin{pmatrix} a_{11} & a_{12} \\ a_{21} & a_{22} \end{pmatrix}\) 의 행렬식은 두 개의 열 벡터 \(\begin{pmatrix} a_{11} \\ a_{21} \end{pmatrix}\) 와 \(\begin{pmatrix} a_{12} \\ a_{22} \end{pmatrix}\) 를 두 변으로 하는 평행사변형의 면적이다. 그럼 행렬 \(\begin{pmatri..
참고한 원문 Put your Android Studio on a diet How to make a deep clean of your Android Studio & Gradle junk files to fix up the mess. engineering.backmarket.com aar 내에 있는 클래스를 자꾸 인덱싱을 못 하길래 검색하다가 찾은 방법인데, 생각보다 유용해서 블로그로 옮긴다. 참고로 위 문제는 해결 못 했다. 🤔 요약 1) "Build -> Clean Project" 로 먼저 빌드된 파일들 삭제 2) "File -> Invalidate Chaces / Restart" 로 캐시 제거 (안드로이드 스튜디오가 다시 시작되면 gradle을 다시 읽고 처리하는 데 일단은 무시) 3) .gradle ..