추상화 추상화란 복잡한 현실을 단순화하기 위해서 사용하는 인간의 가장 기본적인 인지 수단이라고 할 수 있다. 이에 모든 추상화의 목적은 복잡성을 이해하기 쉬운 수준으로 단순화하는 것이다. 그리고 복잡성을 다루기 위해 추상화는 두 차원에서 이루어진다. 첫 번째 차원은 구체적인 사물들 간의 공통점은 취하고, 차이점은 버리는 일반화를 통해 단순하게 만드는 것 두 번째 차원은 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거함으로써 단순하게 만드는 것 객체지향 페러다임은 객체라는 추상화를 통해 현실의 복잡성을 극복한다. 그리고 객체지향 패러다임을 이용해 유용하고 아름다운 애플리케이션을 개발위해 추상화의 두 차원을 올바르게 이해하고 적용해야 한다. 객체: 명확한 경계를 가지고 서로 구별할 수 있는 구체적인 ..
한 가지만 해라! 함수는 한 가지만을 잘 해야한다. 여기서 함수가 한 가지만 하는지 판단하는 방법은 다음과 같다. 지정된 함수 이름 아래에서 추상화 수준이 하나인 단계만 수행한다. 단순히 다른 표현이 아니라 의미있는 이름으로 다른 함수를 추출할 수 있다면 그 함수는 여러 작업을 하는 셈이다. 함수당 추상화 수준은 하나로! 함수가 확실히 한 가지 작업만 하려면 함수 내 모든 문장의 추상화 수준이 동일해야 한다. 왜냐하면, 한 함수 내에서 추상화 수준을 섞으면 특정 표현이 근본 개념인지 아니면 세부사항인지 구분하기 어려운 탓이다. 또한 근본 개념과 세부사항을 뒤섞기 시작하면, 깨진 창문처럼 사람들이 함수에 세부사항을 점점 더 추가한다. 다음 코드는 함수 내 추상화 수준이 동일하지 않은 코드다. public ..
의도를 분명히 밝혀라 코드 맥락이 코드 자체에 명시적으로 드러날 수 있게 하자 다음 코드는 코드가 하는 일을 짐작하기 어렵다. private List theList = new ArrayList(); public List getThem() { List list1 = new ArrayList(); for (int[] x : theList) { if (x[0] == 4) { list1.add(x); } } return list1; } 하지만 아래와 같이 단순히 이름만 고치면 함수가 하는 일을 이해하기 쉬워진다. public static final int STATUS_VALUE = 0; public static final int FLAGGED = 4; private List gameBoard = new Arra..
index가 중요한 이유 예를 들어 다음의 select query 발생시, first_name에 index가 걸려있다면 full scan보다 더 빨리 찾을 수 있다. full scan : O(N) B tree based Index : O(log N) SELECT * FROM customer WHERE first_name = 'Minsoo'; 즉, index를 사용하는 이유는 다음과 같다. 특정 조건을 만족하는 튜플(들)을 빠르게 조회하기 위해서이다. 빠르게 정렬(order by)하거나 그룹핑(group by)하기 위해서이다. index 거는 법 이름과 같이 중복을 허용하는 index를 만드는 방법은 다음과 같다. CREATE INDEX player_name_idx ON player (name); SELE..
B tree 계열에는 B+ tree, B* tree가 있는데, 시간복잡도를 계산했을때 average case와 worst case 모두 조회, 삽입, 삭제에서 O(logN)이 나온다. 그런데 self-balancing BST의 종류인 AVL tree와 Red-Black tree의 average case와 worst case 모두 조회, 삽입, 삭제에서 시간복잡도 O(logN)이 나온다. 그렇다면 이제 왜 DB index로 B tree 계열이 사용되는지 알아보자. computer system CPU : 프로그램의 코드가 실제로 실행되는 곳 Main memory(RAM) : 실행중인 프로그램의 코드들과 코드 실행에 필요한 혹은 그 결과로 나온 데이터들이 상주하는 곳 Secondary Storage(SSS o..
이진 트리(Binary Tree) 자식 노드가 최대 2개인 노드들로 구성된 트리로, 각 자식 노드는 왼쪽 자식 노드, 오른쪽 자식 노드로 나눌 수 있다. 또한 자료의 삽입, 삭제 방법에 따라서 다음과 같이 나뉘어질 수 있다. Full Binary Tree : 각 노드가 0개 혹은 2개의 자식 노드를 갖는다. Complete Binary Tree (완전 이진 트리) : 마지막 레벨을 제외한 모든 노드가 가득 차 있어야 하고, 마지막 레벨의 노드는 왼쪽부터 노드가 순서대로 채워진 이진트리이다. Perfect Binary Tree (포화 이진 트리) : Full Binary Tree 이면서, Complete Binary Tree 인 경우이다. 모든 leaf node의 레벨이 동일하고, 모든 레벨이 가득 채워져..
flask 시작 코드 from flask import Flask app = Flask(__name__) @app.route('/') def home(): return 'HOME' if __name__ == '__main__': app.run('0.0.0.0', port=5001, debug=True) 기본 폴더구조 Flask 서버를 만들때는 프로젝트 폴더 안에 static, templates 폴더와 app.py 를 먼저 만들어 시작한다. HTML 파일 불러오기 templates 폴더는 HTML 파일을 담아두고 불러오는 역할을 한다. 여기에 index.html을 만들어준다. app.py 파일에서 html 파일을 불러올 수 있다. 이때 flask framework에 이미 구현되어 있는 내장함수 render_..
select()는 조건을 만족하는 모든 요소를 리스트에 담아 반환한다. select_one()은 그 중에 가장 위에 나오는 요소를 반환한다. 선택자는 CSS를 작성할 때 사용하는 것과 똑같이 사용하면 된다. # 선택자를 사용하는 방법 -> copy selector soup.select('태그명') soup.select('.클래스명') soup.select('#아이디명') # 위를 조금 더 구체화해서 어떤 경로를 거쳐 요소를 찾아야 되는지 명시할 수 있다. soup.select('상위태그명 > 하위태그명 > 하위태그명') soup.select('상위태그명.클래스명 > 하위태그명.클래스명') # 여러개의 li 태그를 가질 때, 몇 번째 li 인지를 부모의 몇 번째 자식인지 명시해서 지정할 수 있다. soup..
AUTHENTICATION AUTHORIZATION the identity of users are checked for providing the access to the system user's authorities are checked for accessing the resources. AuthN done before authorization AuthZ always happens after authentication It needs usually user's login details It needs user's privilege or roles If authentication fails, usually we will get 401 error response If authorization fails, u..
포트포워딩 룰 sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 5000 이렇게 입력하면 외부에서 오는 요청을 자동으로 우리 서버내에 있는 5000번 포트로 전달하게 하는 포트포워딩이 작동한다. nohup 설정 Git bash 또는 맥의 터미널을 종료하면 프로세스가 종료되면서 서버가 돌아가지 않는다. 이때 우리가 원격접속을 끊어도 서버가 계속 동작하게 만들어본다. 원격 접속을 종료하더라도 서버가 계속 돌아가게 하기 nohup python app.py & 서버 강제종료하는 방법 # 아래 명령어로 미리 pid 값(프로세스 번호)을 본다 ps -ef | grep 'app.py' # 아래 명령어로 특정 프로세스를 ..