1월, 2020의 게시물 표시

하둡 튜토리얼

install brew install hadoop /usr/local/Cellar/hadoop/3.2.1/libexec/etc/hadoop에서 파일 수정해야한다. 일단, hadoop-env.sh JAVA_HOME에 자바 경로를 설정해야한다. find / -name java로 해서 PATH/bin/java인 경로를 찾은 뒤에 PATH를 JAVA_HOME에 export하도록 한다. 여기까지가 standalone mode를 가능하게 하는 것이다. pseudo-distributed mode 하둡 데몬들이 각각 별도의 자바 프로세스로 실행되는데 하나의 노드로 실행되는 형태이다. hadoop-evn.sh export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true -Djava.security.krb5.realm= -Djava.security.krb5.kdc=" core-site.xml <configuration> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/Cellar/hadoop/hdfs/tmp</value> <description>A base for other temporary directories.</description> </property> <property> <name>fs.default.name</name> <value>hdfs://localhost:9000</value> </property> </configuration> mapred-site.xml <configuration> <property> <name>mapred.job.tracker...

Matplotlib & Seaborn

Matplotlib import matplotlib.pyplot as plt %matplotlib inline import numpy as np x = np.linspace(0, 5, 11) y = x ** 2 plt.plot(x,y) plt.xlabel('x Label') plt.ylabel('y Label') plt.title('Title') plt.subplot(1, 2, 1) #1 by 2에서 첫번째 subplot plt.plot(x,y) plt.subplot(1, 2, 2) plt.plot(y,x) #object-oriented method fig = plt.figure() # empty canvas axes = fig.add_axes([0.1, 0.1, 0.8, 0.8]) #첫 두개: 위치, 다음 두개: 가로와 높이 axes.plot(x,y) axes.set_title('Large') ax2 = fig.add_axes([0.2, 0.5, 0.3, 0.3]) # fig라는 canvas 안에 또 다른 그래프를 만든다. ax2.set_title('Small') fig fig2 = plt.figure(figsize = (8, 5), dpi = 60) #size와 해상도를 정해줄 수 있다. fig2.savefig('my_pic.png', dpi = 200) #figure를 파일로 저장할 수 있다. fig = plt.figure() ax = fig.add_axes([0, 0, 1, 1]) ax.plot(x, x**2, label = 'X squared') #하나의 평면에 y = x^2과 y = x^3 그래프를 모두 그린다. ax.plot(x, x**3, label = 'X Cubed') ax.set_xlim([0,1]) #limit x range ax.legend() Se...

Pandas

Data Analysis pandas, numpy Data Visualization matplotlib, seaborn, d3 Pandas import numpy as np import pandas as pd ser1 = pd.Series([10,20,30]) ser1.index = ['a','b','c'] print(ser1) ser2 = pd.Series( {'a':100, 'b':200, 'c':300}) print(ser2) ser3 = pd.Series( data = [1,2,3,4], index = ['USA', 'Germany', 'France', 'Canada'] ) print(ser3) ser4 = pd.Series([3,4,5,6], index = ['USA', 'Germany', 'France', 'Canada'] ) print(ser4) ser_sum = ser3+ser4 print(ser_sum) df = pd.read_csv('filename.csv', index_col = 'Unnamed:0')  #첫번째 컬럼을 인덱스로 사용하겠다 df.head() df['income']  #income이라는 컬럼만 부른다 df['income'][:5] #처음 다섯개의 값만 불러온다 df['continent'].unique() #중복되지 않게 보여준다 df['continent'].nunique() #중복되지 않은 수 df['continent'].value_counts() #각 대륙별로 갖고 있는 데이터의 수 asia_df = df[df['continent'] == 'as...

DBMS & SQL

DBMS (Database Management System) CRUD (create, retrieve, update, delete)의 기능이 있다. 일반적으로 retrieve의 빈도수가 압도적으로 많다고 가정한다. 빠른 검색을 위해서는 정렬되어 있어야 한다. Binary Search : 최대 log_2_n의 시간이 걸린다. B-Tree : 최대 log_3_n의 시간이 걸린다. 상용 DBMS에서 가장 일반적으로 사용된다. B-Tree는 한 번에 비교를 두 번 한다. 작은 값과 큰 값이 있어서 총 세 개로 나눠진다. C,U,D 때마다 작은 값과 큰 값이 수정된다. C,U,D의 작업 때마다 인덱스/정렬 업데이트가 일어난다. 찾기 위해 미리 저장해 놓는 것이 인덱스이다. RDBMS : 관계형 데이터베이스 시스템 테이블과 테이블 간의 연관관계를 이용해 필요한 정보를 구한다. 여러 테이블을 조인해서 필요한 정보를 찾아낸다. Table : 정보들의 묶음 단위이다. Column : 테이블을 구성하는 정보이다. 학생 테이블에 이름 컬럼, 주소 컬럼 등등. 이름 필드에 대한 정보는 row에 쭉 저장된다. Schema : 테이블의 정의 내역이다. DB SQL Query : RDBMS를 사용하는 질의 언어이다.. 대소문자 가리지 않는다. Interpreter 언어이다. Primary Key(PK) : 테이블에서 하나의 레코드를 지정할 수 있는 하나 이상의 컬럼 집합이다. Foreign Key(FK) : 어떤 테이블의 기본키가 다른 테이블의 컬럼에 들어있는 경우이다. Record : 테이블에 있는 여러 인스턴스 하나 하나를 지정한다. PK로 구별 가능하다. Domain Value : 각 컬럼에서 나올 수 있는 후보값이다. 중복을 피하기 위한 테이블 정의 규칙 제1 정규형: 나눌 수 있을 만큼 쪼갠다. 제2 정규형: 테이블의 컬럼들이 기본키와 직접 연관되는 컬럼만으로 구성한다. 제3 정규형: 컬럼들 간의 종속관계가 있으면 안된다. ...

Network Security

Paros 서버와 클라이언트 사이에 위치해서 parameter를 변조할 수 있다. 랜설정의 proxy 설정에서 주소를 Paros의 local proxy로 입력하면 웹서핑을 할 때 서버로 바로 가지 않고 해당 proxy를 통해서 간다. Trap Request를 해놓으면 클라이언트에서 요청을 서버로 보낼 때 Paros에 잡히고 안보내진다. Paros에서 continue를 눌러 줘야 서버로 전송이 되는데 continue 누르기 전에 request를 수정할 수 있다. Firewall 는 port/ip 기반으로 작동한다. 허용 정책에 포함되지 않은 port/ip 모두 차단한다. 하지만 야후와 같은 웹서비스가 대중화되면서 80포트를 모든 사용자에게 열어놔야 한다. 이 때문에 ip/port만으로는 방어가 어렵워졌다. IDS (Instruction Detection System)가 나왔다. 주소만 보는 것이 아니라 무슨 명령인지를 본다.(snort) 패턴매칭 오고 가는 패턴으로 상호관계를 파악한다. Misuse 분석: IDS, IPS(black list) Anomaly 분석: Firewall(white list) 패턴매칭은 만들기도 쉽고 쓰기도 쉽다. 문제로는 false positives, negatives가 있고 로그가 점점 커지는 걸 직접 확인하기 어려워졌다. 예를 들어 bug가 blacklist에 있는데 bugger도 탐지가 될 수 있다. 이상징후 분석 평소의 기록을 기반으로 다른 작업이 생기면 이상징후로 판단한다. 어떤 현상의 변화를 숫자로 표현한 통계분석을 이용할 수 있다. 이를 위해서는 정확한 데이터의 수를 세야 한다. 대용량의 로그를 분석할 수 있기 때문에 유의미한 통계를 낼 수 있게 되어 가능해졌다. Snort NIPS(Network Intrusion Prevention System)이자 NIDS(Network Intrusion Detection System)이다. 실시간 트래픽 분석과 IP에서의 패킷 로깅을...

Process Synchronization

reentrant code: 여러 process들에 의해 동시에 호출되거나 이전 호출이 완료되기 전에는 반복 호출되어도 올바르게 수행되는 코드이다. critical section: 이 구간에서는 하나의 프로세스만 수행될 수 있고 mutual exclusion의 성질을 갖고 있어야 한다. interrupt는 너무 강력하기 때문에 semaphore를 mutual exclusion mechanism으로 쓴다. Semaphore: synchronization을 제공해주는 정수형 변수이다. resource가 있는 방의 key로 비유할 수 있다. P operation: 열쇠 줘. 사용하는 거니까 lock을 한다. wait()로도 불린다. V operation: 열쇠 반납. 사용 끝났으니까 unlock을 한다. 다른 애 깨우니까 signal()로도 불린다. 열쇠를 생성한다. mutual exclusion말고도 scheduling까지도 할 수 있다. share되는 resource의 종류만큼 semaphore가 있어야 한다. 그 resource의 instance가 몇 개이냐가 semaphore의 초깃값이다. resource가 생성되면 V()를 쓰고 없어지면 P()를 쓴다. Semaphore는 unstructured programming construct이기 때문에 P()가 있으면 반드시 V()가 있어야 하는 게 아니고 이 때문에 컴파일러를 이용한 디버깅이 어렵다.

CPU Scheduling

preemptive resource : 한 프로세스가 점유한 상태에서 다른 프로세스에게 양보할 수 있는 자원이다. cpu나 main memory(swap) 등등이 있다. non-preemptive resource : 한번 점유하게 되면 다른 프로세스가 뺏을 수 없다. 프린터가 하나의 예이다. process scheduling : 어느 프로세스에게 얼마나 cpu를 줄 것인가를 정한다. batch monitor의 job : 한번 수행되면 끝날 때까지 수행돼야한다. CPU burst size가 크면 cpu intensive한 연산이고 작으면 I/O interactive(터치 스크린과 같이)하다. ready -> running : dispatch한다고 말한다. scheduling이라고 하지 않는다. running -> ready : HW interrupt로 os scheduler가 개입하여 강제로 cpu를 뺏는다. preemptive. running -> waiting : 스스로 cpu yield 함수를 호출한다. non-preemptive. running -> terminate : non-preemptive. waiting -> ready : preemptive. ready로 가면 preemptive인가보다. aging : task가 cpu를 기다리는 시간에 비례하여 우선순위를 점차적으로 높이는 방법이다. throughput : 단위 시간 내에 끝내는 process 수이다. turnaround time : process가 수행되는 데 걸리는 시간이다. waiting time : ready큐에서 대기하는 시간이다. response time : 처음 request가 왔을 때부터 첫 response까지의(output이 아니라) 시간이다. FIFO : cpu burst 단위이다. monopoly가 발생할 수 있기 때문에 maximum limit을 걸 수 있다. SJF(Shrotest Job First) : 가장...

Processes and Threads

preemptive scheduling : HW에 의해 cpu를 뺏기는 scheduling이다. non-preemptive scheduling : SW에 의해 interrupt가 발생한다. I/O가 오래 걸릴 것 같으면 voluntarily yield한다. 새로운 process가 생기면 os가 그 process의 content를 build한다. Unix는 부팅 시 0번 프로세스만 생성하고 그 이후는 fork한다. 프로세스 생성할 때는 실행 파일이 os에 전달되고 os가 그 exe를 메모리의 code segment에 로드함으로써 생성한다. fork가 불리면 그 부른 parent를 stop시키고 context(프로세스가 갖고 있는 자원)를 복사해서 pid만 바꾸고 나머지는 똑같은 child process를 만든다. fork 뒤에는 exec이라는 system call이 필요하고 exec이 끝나면 exit을 불러서 parent를 깨운다. Zombie state : exit하고 exit state를 남기고 parent가 그 state를 보기 기다리는 상태이다. CPU      --->       MMU(Memory Management Unit)       --->       physical memory       (logical addr.)                                                     (physical addr.) 각 process는 독자적인 address space를 갖는다. 각각 0 ~ 2...

cin ifstream

한 줄 읽어서 특정 단위로 저장하기 vector<string> v; string line; string s; getline(cin, line); istringstream iss(line); while(iss >> s) v.push_back(c); 실행할 때 받은 argument로 txt파일 읽어오기 void readFile(string filename, vector<vector<string>>& result){     ifstream reading;     reading.open(filename);     if(reading.is_open()){         while(!reading.eof()){  //파일을 끝까지 읽을 때 까지             string curLine;             getline(reading, curLine);  //한 줄을 읽어와서             vector<string> tmp;             string s;             stringstream ss(curLine);   //stringstream에 넣는다             while(ss >> s){                 tmp.push_back(s);          ...

Dynamic Programming

Longest Common Subsequence 맨 뒤부터 본다. L1, L2가 있으면 L1[n]과 L2[m]을 비교한다. 같으면 길이를 1 추가하고 L1[n-1] L2[m-1]을 비교하고, 다르면 max(L1[n-1]L2[m] , L1[n]L2[m-1])을 구한다. Longest Increasing Subsequence 숫자들로 이뤄진 리스트가 있고 그중에서 longest subsequence를 찾는데 그 subsequence는 ascending order로 정렬돼있어야한다. 리스트의 길이만큼 다른 리스트 L2를 만들어서 그 리스트의 i번째에는 숫자 리스트의 i번째까지의 LIS 길이가 저장된다. 그러면 L2[0]에는 1이 저장된다. 어떤 시점에 보고 있는 i번째 L[i]에는 L2[0] ~ L2[i-1]중에서 numbers[i]보다 작은 값을 가지는 것들 중에 최댓값+1이 들어간다. Edit Distance string 두 개가 주어지고 insert, remove, replace의 작업을 str1에 할 수 있을 때 몇 번의 최소 작업으로 str2와 같아지는 지 구해야 한다. 맨 뒤부터 비교를 한다. 두 문자가 같으면 str1[n-1] str2[m-1]을 recursive하게 부른다. 다르면 insert, remove, replace 세 가지 경우를 다 고려한다. insert를 하고 str1[n] str[m-1]를 한 경우, remove하고 str1[n-1] str2[m]을 한 경우, replace를 하고 str[n-1] str[m-1]을 한 경우 중 최소를 구한다. dp[n][m]에 각각의 결과를 저장함으로써 시간을 줄인다. Longest Path in Matrix 숫자들로 채워진 matrix가 있고 그중에서 원소 값이 1씩 증가하면서 이을 수 있는 가장 긴 path를 찾아야 한다. 전체 원소에 대해서 왼, 오, 위, 아래 모두 탐색해가며 그중 가장 큰 값을 다른 행렬에 저장한다. 어떤 위치에 대해 최댓값이 저장...