<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Fourier.dev</title>
    <link>https://hmtb.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sun, 28 Jun 2026 08:50:37 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>goudacheese</managingEditor>
    <image>
      <title>Fourier.dev</title>
      <url>https://tistory1.daumcdn.net/tistory/1739256/attach/dd93c4a5cc2045c294c2aec81fcc6d72</url>
      <link>https://hmtb.tistory.com</link>
    </image>
    <item>
      <title>python3로 Circular Queue 구현하기</title>
      <link>https://hmtb.tistory.com/39</link>
      <description>&lt;h1&gt;python3로 Circular Queue 구현하기&lt;/h1&gt;
&lt;h2&gt;__ &lt;strong&gt;init&lt;/strong&gt; __()&lt;/h2&gt;
&lt;p&gt;먼저 데이터 구조의 초깃값을 정한다. Queue의 크기를 k로 두고, 값을 담을 수 있게 길이가 k인 리스트 &lt;code&gt;queue_list&lt;/code&gt; 를 만든다.&lt;/p&gt;
&lt;p&gt;Queue에는 두개의 포인터가 필요하다. 한개는 Front를 가리켜야 하고, 다른 하나는 Back을 가리켜야 한다.&lt;/p&gt;
&lt;img src=&quot;https://i.imgur.com/VmtWFZV.png&quot; width=&quot;500px&quot;&gt;

&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def __init__(self, k: int):
    self.size = 0    # 처음 리스트의 길이
    self.max_size = k    # 리스트의 길이
    self.queue_list = [0] * k   # Queue를 담을 리스트
    self.front = self.rear = -1    # pointer&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;enQueue()&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;enQueue()&lt;/code&gt; 는 Circular Queue에 값을 삽입하는 함수이다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;enQueue()&lt;/code&gt; 는 boolean을 반환한다. 값을 삽입하는 것이 성공하면 &lt;code&gt;True&lt;/code&gt; 를 반환하고, 실패하면 &lt;code&gt;False&lt;/code&gt; 를 반환한다. &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;리스트의 초기 크기와 최대 크기가 같으면 값을 삽입할 수 없으므로 False를 반환한다.&lt;/li&gt;
&lt;li&gt;리스트의 뒷 부분(back)이 초기에 설정해둔 -1이면 &lt;code&gt;rear&lt;/code&gt; 와 &lt;code&gt;front&lt;/code&gt; 에 0을 넣는다. 왜냐하면 두 포인터 모두 리스트의 0번째 인덱스를 가리키고 있기 때문이다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rear&lt;/code&gt; 값이 -1이 아니라면, &lt;code&gt;rear&lt;/code&gt; 에 1을 증가 시키 것을 &lt;code&gt;max_size&lt;/code&gt; 로 나머지 연산한 값이 &lt;code&gt;rear&lt;/code&gt; 가 된다.&lt;/li&gt;
&lt;li&gt;그리고 &lt;code&gt;queue_list&lt;/code&gt; 에서 &lt;code&gt;rear&lt;/code&gt; 번째에 값이 들어간다.&lt;/li&gt;
&lt;li&gt;새 값이 들어가면서 길이가 증가하였으므로 &lt;code&gt;size&lt;/code&gt; 를 1만큼 증가시킨다. 그리고 &lt;code&gt;True&lt;/code&gt; 를 반환한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def enQueue(self, value: int):
    if self.size == self.max_size:    # 1
        return False
    else:
        if self.rear == -1:    # 2
            self.rear = self.front = 0
        else:    # 3
            self.rear = (self.rear + 1) % self.max_size
        self.queue_list[self.rear] = value    # 4
        self.size += 1
        return True&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;deQueue()&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;deQueue()&lt;/code&gt; 는 Circular Queue에 값을 삭제하는 함수이다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;deQueue()&lt;/code&gt; 는 boolean을 반환한다. 값을 제거하는게 성공하면 &lt;code&gt;True&lt;/code&gt; 를 반환하고, 실패하면 &lt;code&gt;False&lt;/code&gt; 를 반환한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def deQueue(self):
        if self.size == 0: return False
        if self.front == self.rear:
            self.front = self.rear = -1
        else:
            self.front = (self.front + 1) % self.max_size
        self.size -= 1
        return True&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Front()&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Front()&lt;/code&gt; 는 현재 start pointer가 가리키고 있는 값을 반환한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def Front(self):
        return self.queue_list[self.front] if self.size != 0 else -1&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Rear()&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Rear()&lt;/code&gt; 는 현재 end pointer가 가리키고 있는 값을 반환한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def Rear(self) -&amp;gt; int:
        return self.queue_list[self.rear] if self.size != 0 else -1&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;isEmpty()&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;isEmpty()&lt;/code&gt; 는 현재 값이 비어 있는지 아닌지 확인한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def isEmpty(self) -&amp;gt; bool:
        return self.size == 0&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;isFull()&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;isFull()&lt;/code&gt; 은 리스트에 값이 가득 차 있는지 아닌지 확인한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def isFull(self):
        return self.size == self.max_size&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;전체 코드&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;
class MyCircularQueue:
    def __init__(self, k: int):
        self.size = 0
        self.max_size = k
        self.queue_list = [0] * k
        self.front = self.rear = -1

    def enQueue(self, value: int) -&amp;gt; bool:
        if self.size == self.max_size:
            return False
        else:
            if self.rear == -1:
                self.rear = self.front = 0
            else:
                self.rear = (self.rear + 1) % self.max_size
            self.queue_list[self.rear] = value
            self.size += 1
            return True

    def deQueue(self) -&amp;gt; bool:
        if self.size == 0: return False
        if self.front == self.rear:
            self.front = self.rear = -1
        else:
            self.front = (self.front + 1) % self.max_size
        self.size -= 1
        return True

    def Front(self) -&amp;gt; int:
        return self.queue_list[self.front] if self.size != 0 else -1

    def Rear(self) -&amp;gt; int:
        return self.queue_list[self.rear] if self.size != 0 else -1

    def isEmpty(self) -&amp;gt; bool:
        return self.size == 0

    def isFull(self) -&amp;gt; bool:
        return self.size == self.max_size&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithms</category>
      <category>algorithm</category>
      <author>goudacheese</author>
      <guid isPermaLink="true">https://hmtb.tistory.com/39</guid>
      <comments>https://hmtb.tistory.com/39#entry39comment</comments>
      <pubDate>Wed, 14 Sep 2022 22:14:29 +0900</pubDate>
    </item>
    <item>
      <title>블로그 다시 시작</title>
      <link>https://hmtb.tistory.com/38</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/lifeisgouda/lifeisgouda.github.io/tree/main/posts&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Github&lt;/a&gt;, Medium, Notion 등에 가끔 블로그 글을 올리곤 했다. 글쓰는 방법이 편하지 않다보기 github blog나 medium(유입은 많은데 한국어 지원과 편집이 불편)은 손이 잘 가지 않았다. Notion은 점점 무거워지면서 개인 노트로만 활용하고 있다(뎁스가 깊어지면 사용하기 불편해지는 단점도...).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tistory가 그래도 여러 조건에 가장 부합하다고 생각하여 &lt;a href=&quot;https://fourierdev.medium.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Medium&lt;/a&gt;과 함께 관리하며 다시 운영해보려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;월 1회라도 꾸준히 쓰는 것이 목표!&lt;/p&gt;</description>
      <category>Daily</category>
      <category>블로그</category>
      <category>일상</category>
      <author>goudacheese</author>
      <guid isPermaLink="true">https://hmtb.tistory.com/38</guid>
      <comments>https://hmtb.tistory.com/38#entry38comment</comments>
      <pubDate>Wed, 14 Sep 2022 21:58:02 +0900</pubDate>
    </item>
    <item>
      <title>[React] 새 페이지 렌더링 시 상단에서 시작하기</title>
      <link>https://hmtb.tistory.com/37</link>
      <description>&lt;p&gt;리액트는 새 페이지를 렌더링한 후 스크롤을 맨 위로 올려주지 않는다. 그래서 별도로 컴포넌트를 만들어서 설정해주어야 한다.&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;먼저 &lt;code&gt;ScrollToTop.js&lt;/code&gt; 컴포넌트를 만든다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot; lang=&quot;javascript&quot;&gt;import React, { Component } from 'react';
import { withRouter } from 'react-router';

class ScrollToTop extends Component {
  componentDidUpdate(prevProps) {
    if (this.props.location !== prevProps.location) {
      window.scrollTo(0, 0)
    }
  }

  render() {
    return this.props.children
  }
}

export default withRouter(ScrollToTop)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;code&gt;App.js&lt;/code&gt; 파일에 &lt;code&gt;ScrollToTop&lt;/code&gt; 컴포넌트를 끼워 넣는다. 나의 경우는 아래와 같이 했다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot; lang=&quot;javascript&quot;&gt;import React from 'react';
import { Switch, Route, Router } from 'react-router-dom';
import { Home, RefundPage, ChatbotPage, NotFoundPage } from '../pages';
import ScrollToTop from './ScrollToTop';
const App = () =&amp;gt; {
    return (
        &amp;lt;div&amp;gt;
          &amp;lt;ScrollToTop&amp;gt;  // ScrollToTop으로 각 페이지를 감쌓다.
            &amp;lt;Switch&amp;gt;
                &amp;lt;Route exact path=&quot;/&quot; component={Home}/&amp;gt;
                &amp;lt;Route path=&quot;/refund&quot; component={RefundPage} /&amp;gt;
                &amp;lt;Route path=&quot;/refund/:Chatbot?&quot; component={ChatbotPage} /&amp;gt;
                &amp;lt;Route component={NotFoundPage} /&amp;gt;
            &amp;lt;/Switch&amp;gt;
          &amp;lt;/ScrollToTop&amp;gt;
        &amp;lt;/div&amp;gt;
    );
};

export default App;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/JavaScript</category>
      <category>REACT</category>
      <category>scroll up</category>
      <category>페이지 상단</category>
      <author>goudacheese</author>
      <guid isPermaLink="true">https://hmtb.tistory.com/37</guid>
      <comments>https://hmtb.tistory.com/37#entry37comment</comments>
      <pubDate>Sun, 30 Sep 2018 15:34:00 +0900</pubDate>
    </item>
    <item>
      <title>[R] 결측값 데이터 다루기</title>
      <link>https://hmtb.tistory.com/34</link>
      <description>&lt;meta charset=&quot;UTF-8&quot;&gt;&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width initial-scale=1&quot;&gt;
&lt;title&gt;R_Missing_Values.md&lt;/title&gt;

&lt;h2&gt;1. 결측값 단순 삭제&lt;/h2&gt;
&lt;h2&gt;na.omit()&lt;/h2&gt;
&lt;p&gt;결측값이 있는 행을 삭제하는 함수&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;example&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-R&quot; lang=&quot;R&quot;&gt;&amp;gt; dat &amp;lt;- data.frame( a = c(1, 2, 3, 4),
+                    b = c(5, 6, 7, NA),
+                    c = c('a', 'b', 'c', NA),
+                    d = c('e', NA, 'f', 'g'))
&amp;gt; dat
  a  b    c    d
1 1  5    a    e
2 2  6    b &amp;lt;NA&amp;gt;
3 3  7    c    f
4 4 NA &amp;lt;NA&amp;gt;    g
&amp;gt; dat &amp;lt;- na.omit(dat)
&amp;gt; dat
  a b c d
1 1 5 a e
3 3 7 c f
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2행,  4행이 삭제된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;2. Multiple Imputation 다중대체법&lt;/h2&gt;
&lt;p&gt;m번의 대치를 통해 m개의 가상 자료를 만들어서 대체하는 방법이다.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Multiple imputation is a statistical technique for analyzing incomplete data sets, that is, data sets for which some entries are missing. Application of the technique requires three steps: imputation, analysis and pooling. The figure illustrates these steps. [1]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt; 다중 대체법은 결측값을 처리하는 방법 중 하나인데 대체, 분석, 풀링 3단계로 이루어져있다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://image.slidesharecdn.com/20151215apresentation-151216031138/95/multiple-imputation-joint-and-conditional-modeling-of-missing-data-13-638.jpg?cb=1450236425&quot; alt=&quot;&quot; style=&quot;max-width: 100%; height: auto;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;mice()&lt;/h3&gt;
&lt;blockquote&gt;&lt;p&gt;The mice package implements a method to deal with missing data. The package creates multiple imputations (replacement values) for multivariate missing data. The method is based on Fully Conditional Specification, where each incomplete variable is imputed by a separate model. The MICE algorithm can impute mixes of continuous, binary, unordered categorical and ordered categorical data. In addition, MICE can impute continuous two-level data, and maintain consistency between imputations by means of passive imputation. Many diagnostic plots are implemented to inspect the quality of the imputations.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt; 통계기법을 이용한 예측방정식을 이용해서 결측값이 대체된다. 대체할 값이 수렴될 때까지 반복한다. &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-R&quot; lang=&quot;R&quot;&gt;&amp;gt; library(mice)
&amp;gt; data(nhanes)
&amp;gt; str(nhanes)
## 'data.frame':    25 obs. of  4 variables:
##  $ age: num  1 2 1 3 1 3 1 1 2 2 ...
##  $ bmi: num  NA 22.7 NA NA 20.4 NA 22.5 30.1 22 NA ...
##  $ hyp: num  NA 1 1 NA 1 NA 1 1 1 NA ...
##  $ chl: num  NA 187 187 NA 113 184 118 187 238 NA ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4&gt;참고문헌&lt;/h4&gt;
&lt;p&gt;[1] &lt;a href=&quot;http://www.stefvanbuuren.nl/mi/mi.html&quot; target=&quot;_blank&quot;&gt;http://www.stefvanbuuren.nl/mi/mi.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[2] &lt;a href=&quot;https://www.rdocumentation.org/packages/mice/versions/2.46.0/topics/mice&quot; target=&quot;_blank&quot;&gt;https://www.rdocumentation.org/packages/mice/versions/2.46.0/topics/mice&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[3] &lt;a href=&quot;https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3074241&quot; target=&quot;_blank&quot;&gt;https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3074241&lt;/a&gt;/&lt;/p&gt;
&lt;p&gt;[4] &lt;a href=&quot;https://statkclee.github.io/data-science/ds-missing.html&quot; target=&quot;_blank&quot;&gt;https://statkclee.github.io/data-science/ds-missing.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[5] &lt;a href=&quot;https://www.analyticsvidhya.com/blog/2016/03/tutorial-powerful-packages-imputing-missing-values&quot; target=&quot;_blank&quot;&gt;https://www.analyticsvidhya.com/blog/2016/03/tutorial-powerful-packages-imputing-missing-values&lt;/a&gt;/&lt;/p&gt;
&lt;p&gt;[6] &lt;a href=&quot;http://web.maths.unsw.edu.au/~dwarton/missingDataLab.html&quot; target=&quot;_blank&quot;&gt;http://web.maths.unsw.edu.au/~dwarton/missingDataLab.html&lt;/a&gt;&lt;/p&gt;</description>
      <category>Statistics/R</category>
      <category>MICE</category>
      <category>missing value</category>
      <category>multiple imputation</category>
      <category>na.omit</category>
      <category>r</category>
      <category>결측값</category>
      <category>다중대체법</category>
      <author>goudacheese</author>
      <guid isPermaLink="true">https://hmtb.tistory.com/34</guid>
      <comments>https://hmtb.tistory.com/34#entry34comment</comments>
      <pubDate>Wed, 25 Apr 2018 12:54:46 +0900</pubDate>
    </item>
    <item>
      <title>[python] 리스트 변수를 반복문 돌리기 예시</title>
      <link>https://hmtb.tistory.com/33</link>
      <description>
&lt;meta charset=&quot;UTF-8&quot;&gt;&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width initial-scale=1&quot;&gt;
&lt;title&gt;python_for_loop.md&lt;/title&gt;

&lt;pre&gt;&lt;code class=&quot;language-python&quot; lang=&quot;python&quot;&gt;students = []
student1_info = {
    &quot;first_name&quot;: &quot;Martin&quot;,
    &quot;las_name&quot; : &quot;Lawrence&quot;,
    &quot;student_no&quot;: 9854

}

student2_info = {
    &quot;first_name&quot;: &quot;Robert&quot;,
    &quot;las_name&quot; : &quot;Gant&quot;,
    &quot;student_no&quot;: 6790

}

student3_info = {
    &quot;first_name&quot;: &quot;George&quot;,
    &quot;las_name&quot; : &quot;Murphy&quot;,
    &quot;student_no&quot;: 4728

}

for i in range(1, 4):
    students.append(eval('student%d_info'% (i)))

print(students)

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;eval()&lt;/code&gt; : 실행 가능한 문자열을 입력 받아 실행한 결과값을 리턴하는 함수이다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot; lang=&quot;python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; eval('1+2')
3
&amp;gt;&amp;gt;&amp;gt; eval(&quot;'hi' + 'a'&quot;)
'hia'
&amp;gt;&amp;gt;&amp;gt; eval('divmod(4, 3)')
(1, 1)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;append()&lt;/code&gt; : 객체를 맨 뒤에 추가해주는 함수이다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot; lang=&quot;python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; x = [1, 2, 3]
&amp;gt;&amp;gt;&amp;gt; x.append([4, 5, 6])
&amp;gt;&amp;gt;&amp;gt; print (x)
[1, 2, 3, [4, 5, 6]]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;/li&gt;

&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;extend()&lt;/code&gt; : 여러개의 값을 확장시킬 수 있는 함수이다. 함수로 전달되는 인수에는 리스트만 올 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot; lang=&quot;python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; x = [1, 2, 3]
&amp;gt;&amp;gt;&amp;gt; x.extend([4, 5, 6])
&amp;gt;&amp;gt;&amp;gt; print (x)
[1, 2, 3, 4, 5, 6]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;/li&gt;

&lt;/ul&gt;</description>
      <category>Programming/Python</category>
      <category>Append</category>
      <category>eval</category>
      <category>extend</category>
      <category>list</category>
      <category>Python</category>
      <category>리스트</category>
      <category>반복문</category>
      <category>파이썬</category>
      <author>goudacheese</author>
      <guid isPermaLink="true">https://hmtb.tistory.com/33</guid>
      <comments>https://hmtb.tistory.com/33#entry33comment</comments>
      <pubDate>Wed, 25 Apr 2018 12:51:35 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Python에서 CSV 파일을 읽어들이는 여러가지 방법</title>
      <link>https://hmtb.tistory.com/32</link>
      <description>&lt;!doctype html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset='UTF-8'&gt;&lt;meta name='viewport' content='width=device-width initial-scale=1'&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;방법1. 기본 내장함수 사용&lt;/h2&gt;
&lt;h3&gt;1. csv.reader&lt;/h3&gt;
&lt;pre&gt;&lt;code class='language-python' lang='python'&gt;import csv
dat = open(&amp;#39;file.csv&amp;#39;)
reader = csv.reader(dat)
lines = list(reader)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;2. 한 줄씩 읽어들여서 리스트로 만들기&lt;/h3&gt;
&lt;pre&gt;&lt;code class='language-python' lang='python'&gt;import csv
dat1_list = []
dat2_list = []

with open(&amp;#39;file.csv&amp;#39;, &amp;#39;r&amp;#39;) as raw:
    reader = csv.reader(raw)
    for lines in reader:
        print(lines)
        dat1_list.append(lines)
        start = len(dat2_list)
        dat2_list[start:start] = lines
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;3. from_csv&lt;/h3&gt;
&lt;pre&gt;&lt;code class='language-python' lang='python'&gt;dat.from_csv(&amp;#39;file.csv&amp;#39;,
          sep = &amp;#39;,&amp;#39;,
          encoding = &amp;#39;utf-8&amp;#39;)
dat.head()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;4. readlines()&lt;/h3&gt;
&lt;pre&gt;&lt;code class='language-python' lang='python'&gt;open(&amp;#39;file.csv&amp;#39;).readlines()    # 파일을 한 줄씩 전체를 읽어들여서 리스트로 반환
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;방법2. Pandas 사용&lt;/h2&gt;
&lt;pre&gt;&lt;code class='language-python' lang='python'&gt;import pandas as pd
dat = pd.read_csv(&amp;#39;file.csv&amp;#39;, 
                  thousands = &amp;#39;,&amp;#39;,
                  index_col = 0,
                  names = [&amp;#39;col1&amp;#39;, &amp;#39;col2&amp;#39;, &amp;#39;col3&amp;#39;],
                  encoding = &amp;#39;utf-8&amp;#39;)

dat.head()

dat.columns    # 열 이름 출력
dat.rename(columns = {dat.columns[0] : &amp;#39;명칭&amp;#39;}, inplace = True )    # 열 이름 변경
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</description>
      <category>Programming/Python</category>
      <category>CSV</category>
      <category>numpy</category>
      <category>Pandas</category>
      <category>Python</category>
      <category>read csv</category>
      <category>파이썬</category>
      <author>goudacheese</author>
      <guid isPermaLink="true">https://hmtb.tistory.com/32</guid>
      <comments>https://hmtb.tistory.com/32#entry32comment</comments>
      <pubDate>Wed, 25 Apr 2018 12:47:35 +0900</pubDate>
    </item>
    <item>
      <title>Hadoop wordCount example</title>
      <link>https://hmtb.tistory.com/31</link>
      <description>&lt;!doctype html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset='UTF-8'&gt;&lt;meta name='viewport' content='width=device-width initial-scale=1'&gt;
&lt;title&gt;Hadoop_wordCount_example.md&lt;/title&gt;&lt;/head&gt;
&lt;body&gt;&lt;h1&gt;Hadoop&lt;/h1&gt;
&lt;p&gt;Hadoop = HDFS + MapReduce&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Mode 3가지&lt;/h3&gt;
&lt;h4&gt;HDFS 설치방법&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Stand alone : 분산저장 안함, 코딩은 가능&lt;/li&gt;
&lt;li&gt;가상분산모드 : 프로세스 3개. &lt;/li&gt;
&lt;li&gt;맵리듀스 : 맵 상속 받음, 리듀스 상속받음. 어떻게 데이터 처리하는지 익히기.&lt;/li&gt;

&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;순서&lt;/h3&gt;
&lt;ol start='' &gt;
&lt;li&gt;VirtualBox 설치 // 여기까지만 Windows 환경에서 진행합니다.&lt;/li&gt;
&lt;li&gt;Ubuntu 14.04.2 설치 // 이후에는 VirtualBox 내의 Ubuntu 에서 진행&lt;/li&gt;
&lt;li&gt;JDK 설치&lt;/li&gt;
&lt;li&gt;하둡 다운로드&lt;/li&gt;
&lt;li&gt;하둡 Stand-alone 모드 구성&lt;/li&gt;
&lt;li&gt;하둡 가상 분산 모드 구성&lt;/li&gt;
&lt;li&gt;이클립스 다운로드, 설정&lt;/li&gt;
&lt;li&gt;WordCount 예제 코딩&lt;/li&gt;
&lt;li&gt;테스트&lt;/li&gt;

&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Ubuntu에 JDK 8 설치&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java8-installer

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;하둡 다운로드 후 압축 해제&lt;/h3&gt;
&lt;p&gt;URL : &lt;a href='https://archive.apache.org/dist/hadoop/common/hadoop-1.2.1/hadoop-1.2.1.tar.gz' target='_blank' &gt;https://archive.apache.org/dist/hadoop/common/hadoop-1.2.1/hadoop-1.2.1.tar.gz&lt;/a&gt; 에서 다운로드&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래 명령어로 압축해제 및 설정.&lt;/p&gt;
&lt;p&gt;참고 : 앞으로 나오는 /home/유저명/ 에서 &amp;quot;유저명&amp;quot; 부분은 &amp;quot;여러분 자신의 유저명&amp;quot;으로 수정하여 입력하면 된다. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;vim 설정&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;$ vi .vimrc

# 아래 내용 입력 후 저장
filetype plugin on
syntax on

set number
set paste

set ruler
set laststatus=2

$ cat .vimrc     # 확인
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cd Downloads
$ cp hadoop-1.2.1.tar.gz ~       # ~ : home folder
$ cd ~
$ tar zxvf hadoop-1.2.1.tar.gz
$ sudo apt-get install vim

$ vim .bashrc # 맨 끝에 아래 3줄 추가

export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export HADOOP_INSTALL=/home/유저명/hadoop-1.2.1
export PATH=PATH:HADOOP_INSTALL/bin

$ source .bashrc # 변경 내용 적용
$ hadoop # 메시지가 정상 출력되면 OK
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;하둡 Stand-alone 모드 구성 및 예제 테스트&lt;/h2&gt;
&lt;p&gt;아래 명령어로 테스트.&lt;/p&gt;
&lt;p&gt;폴더명 중복 안되게 해야 한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cd /home/유저명/hadoop-1.2.1
$ mkdir input
$ cp README.txt input
$ hadoop jar hadoop-examples-1.2.1.jar wordcount input output
# cat output/part-r-00000 # 결과 확인

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;jar : 파일을 실행하는 명령어&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;hadoop-examples-1.2.1.jar 파일이 하둡 예제파일&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;$ hadoop jar hadoop-examples-1.2.1.jar wordcount input output&lt;/code&gt; : hadoop / 파일실행 / 파일명 / 할일 /입력폴더 / 출력폴더&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 출력 결과

18/02/24 14:10:18 INFO util.NativeCodeLoader: Loaded the native-hadoop library
18/02/24 14:10:18 INFO input.FileInputFormat: Total input paths to process : 1
18/02/24 14:10:18 WARN snappy.LoadSnappy: Snappy native library not loaded
18/02/24 14:10:18 INFO mapred.JobClient: Running job: job_local1707454656_0001
18/02/24 14:10:19 INFO mapred.LocalJobRunner: Waiting for map tasks
18/02/24 14:10:19 INFO mapred.LocalJobRunner: Starting task: attempt_local1707454656_0001_m_000000_0
18/02/24 14:10:19 INFO util.ProcessTree: setsid exited with exit code 0
18/02/24 14:10:19 INFO mapred.Task:  Using ResourceCalculatorPlugin : org.apache.hadoop.util.LinuxResourceCalculatorPlugin@415eb82d
18/02/24 14:10:19 INFO mapred.MapTask: Processing split: file:/home/jane/hadoop-1.2.1/input:0+1366
18/02/24 14:10:19 INFO mapred.MapTask: io.sort.mb = 100
18/02/24 14:10:19 INFO mapred.MapTask: data buffer = 79691776/99614720
18/02/24 14:10:19 INFO mapred.MapTask: record buffer = 262144/327680
18/02/24 14:10:19 INFO mapred.MapTask: Starting flush of map output
18/02/24 14:10:19 INFO mapred.MapTask: Finished spill 0
18/02/24 14:10:19 INFO mapred.Task: Task:attempt_local1707454656_0001_m_000000_0 is done. And is in the process of commiting
18/02/24 14:10:19 INFO mapred.LocalJobRunner: 
18/02/24 14:10:19 INFO mapred.Task: Task &amp;#39;attempt_local1707454656_0001_m_000000_0&amp;#39; done.
18/02/24 14:10:19 INFO mapred.LocalJobRunner: Finishing task: attempt_local1707454656_0001_m_000000_0
18/02/24 14:10:19 INFO mapred.LocalJobRunner: Map task executor complete.
18/02/24 14:10:19 INFO mapred.Task:  Using ResourceCalculatorPlugin : org.apache.hadoop.util.LinuxResourceCalculatorPlugin@2f017655
18/02/24 14:10:19 INFO mapred.LocalJobRunner: 
18/02/24 14:10:19 INFO mapred.Merger: Merging 1 sorted segments
18/02/24 14:10:19 INFO mapred.Merger: Down to the last merge-pass, with 1 segments left of total size: 1832 bytes
18/02/24 14:10:19 INFO mapred.LocalJobRunner: 
18/02/24 14:10:19 INFO mapred.Task: Task:attempt_local1707454656_0001_r_000000_0 is done. And is in the process of commiting
18/02/24 14:10:19 INFO mapred.LocalJobRunner: 
18/02/24 14:10:19 INFO mapred.Task: Task attempt_local1707454656_0001_r_000000_0 is allowed to commit now
18/02/24 14:10:19 INFO output.FileOutputCommitter: Saved output of task &amp;#39;attempt_local1707454656_0001_r_000000_0&amp;#39; to output
18/02/24 14:10:19 INFO mapred.LocalJobRunner: reduce &amp;gt; reduce
18/02/24 14:10:19 INFO mapred.Task: Task &amp;#39;attempt_local1707454656_0001_r_000000_0&amp;#39; done.
18/02/24 14:10:19 INFO mapred.JobClient:  map 100% reduce 100%
18/02/24 14:10:19 INFO mapred.JobClient: Job complete: job_local1707454656_0001
18/02/24 14:10:19 INFO mapred.JobClient: Counters: 20
18/02/24 14:10:19 INFO mapred.JobClient:   Map-Reduce Framework
18/02/24 14:10:19 INFO mapred.JobClient:     Spilled Records=262
18/02/24 14:10:19 INFO mapred.JobClient:     Map output materialized bytes=1836
18/02/24 14:10:19 INFO mapred.JobClient:     Reduce input records=131
18/02/24 14:10:19 INFO mapred.JobClient:     Virtual memory (bytes) snapshot=0
18/02/24 14:10:19 INFO mapred.JobClient:     Map input records=31
18/02/24 14:10:19 INFO mapred.JobClient:     SPLIT_RAW_BYTES=99
18/02/24 14:10:19 INFO mapred.JobClient:     Map output bytes=2055
18/02/24 14:10:19 INFO mapred.JobClient:     Reduce shuffle bytes=0
18/02/24 14:10:19 INFO mapred.JobClient:     Physical memory (bytes) snapshot=0
18/02/24 14:10:19 INFO mapred.JobClient:     Reduce input groups=131
18/02/24 14:10:19 INFO mapred.JobClient:     Combine output records=131
18/02/24 14:10:19 INFO mapred.JobClient:     Reduce output records=131
18/02/24 14:10:19 INFO mapred.JobClient:     Map output records=179
18/02/24 14:10:19 INFO mapred.JobClient:     Combine input records=179
18/02/24 14:10:19 INFO mapred.JobClient:     CPU time spent (ms)=0
18/02/24 14:10:19 INFO mapred.JobClient:     Total committed heap usage (bytes)=357564416
18/02/24 14:10:19 INFO mapred.JobClient:   File Input Format Counters 
18/02/24 14:10:19 INFO mapred.JobClient:     Bytes Read=1366
18/02/24 14:10:19 INFO mapred.JobClient:   FileSystemCounters
18/02/24 14:10:19 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=395714
18/02/24 14:10:19 INFO mapred.JobClient:     FILE_BYTES_READ=290330
18/02/24 14:10:19 INFO mapred.JobClient:   File Output Format Counters 
18/02/24 14:10:19 INFO mapred.JobClient:     Bytes Written=1326
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;

&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;하둡 가상분산 모드 구성&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;5개의 프로세스&lt;/strong&gt; : Name node, Secondary Namenode, Data node, Job tracker, Tast tracker &lt;/p&gt;
&lt;p&gt; hadoop-env.sh&lt;/p&gt;
&lt;p&gt; core-site.xml &lt;/p&gt;
&lt;p&gt; hdfs-site.xml&lt;/p&gt;
&lt;p&gt; mapred-site.xml&lt;/p&gt;
&lt;p&gt;위 순서로 네개 파일 수정해 준다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;hadoop-env.sh 수정&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;$ vim /home/유저명/hadoop-1.2.1/conf/hadoop-env.sh # 맨 끝에 3줄 추가

export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export HADOOP_HOME=/home/유저명/hadoop-1.2.1
export HADOOP_HOME_WARN_SUPPRESS=&amp;quot;TRUE&amp;quot;  # Warning: $HADOOP_HOME is deprecated.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;보안 인증 관련 명령 실행&lt;/h4&gt;
&lt;p&gt;컴퓨터끼리 연결해서 접속할 수 있게 ssh 설정&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo apt-get install openssh-server
$ sudo /etc/init.d/ssh restart # ssh 재실행
$ netstat -ntl # 0:::22 있으면 OK
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;접속할 때마다 비밀번호 묻지 않게 public key 공유(리눅스의 기능)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ssh-keygen -t rsa # 엔터 3번
$ cat ~/.ssh/id_rsa.pub &amp;gt;&amp;gt; ~/.ssh/authorized_keys
$ ssh localhost # 처음 한번만 yes, 두번째 접속시 부터는 안 물어봄.
$ exit # exit 로 꼭 나와야 함
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;core-site.xml (하둡의 핵심 설정 파일) 편집&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;$ vim /home/유저명/hadoop-1.2.1/conf/core-site.xml

&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;
&amp;lt;?xml-stylesheet type=&amp;quot;text/xsl&amp;quot; href=&amp;quot;configuration.xsl&amp;quot;?&amp;gt;
&amp;lt;!-- Put site-specific property overrides in this file. --&amp;gt;
&amp;lt;configuration&amp;gt;
    &amp;lt;property&amp;gt;
        &amp;lt;name&amp;gt;fs.default.name&amp;lt;/name&amp;gt;
        &amp;lt;value&amp;gt;hdfs://localhost:9000&amp;lt;/value&amp;gt;
    &amp;lt;/property&amp;gt;
    &amp;lt;property&amp;gt;
        &amp;lt;name&amp;gt;hadoop.tmp.dir&amp;lt;/name&amp;gt;
        &amp;lt;value&amp;gt;/home/유저명/hadoop-1.2.1/hadoop-${user.name}&amp;lt;/value&amp;gt;
    &amp;lt;/property&amp;gt;
&amp;lt;/configuration&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;hdfs-site.xml (하둡 분산 파일 관련 설정) 편집&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;$ vim /home/유저명/hadoop-1.2.1/conf/hdfs-site.xml

&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;
&amp;lt;?xml-stylesheet type=&amp;quot;text/xsl&amp;quot; href=&amp;quot;configuration.xsl&amp;quot;?&amp;gt;
&amp;lt;!-- Put site-specific property overrides in this file. --&amp;gt;
&amp;lt;configuration&amp;gt;
    &amp;lt;property&amp;gt;
        &amp;lt;name&amp;gt;dfs.name.dir&amp;lt;/name&amp;gt;
        &amp;lt;value&amp;gt;/home/유저명/hadoop-1.2.1/dfs/name&amp;lt;/value&amp;gt;
    &amp;lt;/property&amp;gt;
    &amp;lt;property&amp;gt;
        &amp;lt;name&amp;gt;dfs.name.edits.dir&amp;lt;/name&amp;gt;
        &amp;lt;value&amp;gt;${dfs.name.dir}&amp;lt;/value&amp;gt;
    &amp;lt;/property&amp;gt;
    &amp;lt;property&amp;gt;
        &amp;lt;name&amp;gt;dfs.data.dir&amp;lt;/name&amp;gt;
        &amp;lt;value&amp;gt;/home/유저명/hadoop-1.2.1/dfs/data&amp;lt;/value&amp;gt;
    &amp;lt;/property&amp;gt;
&amp;lt;/configuration&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;mapred-site.xml (하둡 맵리듀스 관련 설정) 편집&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;$ vim /home/유저명/hadoop-1.2.1/conf/mapred-site.xml

&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;
&amp;lt;?xml-stylesheet type=&amp;quot;text/xsl&amp;quot; href=&amp;quot;configuration.xsl&amp;quot;?&amp;gt;
&amp;lt;!-- Put site-specific property overrides in this file. --&amp;gt;
&amp;lt;configuration&amp;gt;
    &amp;lt;property&amp;gt;
        &amp;lt;name&amp;gt;mapred.job.tracker&amp;lt;/name&amp;gt;
        &amp;lt;value&amp;gt;localhost:9001&amp;lt;/value&amp;gt;
    &amp;lt;/property&amp;gt;
    &amp;lt;property&amp;gt;
        &amp;lt;name&amp;gt;mapred.local.dir&amp;lt;/name&amp;gt;
        &amp;lt;value&amp;gt;${hadoop.tmp.dir}/mapred/local&amp;lt;/value&amp;gt;
    &amp;lt;/property&amp;gt;
    &amp;lt;property&amp;gt;
        &amp;lt;name&amp;gt;mapred.system.dir&amp;lt;/name&amp;gt;
        &amp;lt;value&amp;gt;${hadoop.tmp.dir}/mapred/system&amp;lt;/value&amp;gt;
    &amp;lt;/property&amp;gt;
&amp;lt;/configuration&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;namenode 포맷 ( namenode 는 처음에 꼭 한번 만 포맷해야 한다.)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;$ hadoop namenode -format
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;하둡 시작 및 확인&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;$ cd /home/유저명/hadoop-1.2.1
$ bin/start-all.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;하둡 프로세스 확인&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;$ jps 
# 5개의 프로세스 출력되면 OK : namenode, secondarynamenode, datanode, jobtracker, tasktracker
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;브라우저에서 접속해서 확인&lt;/h2&gt;
&lt;p&gt;URL : &lt;a href='http://localhost:50070/dfshealth.jsp' target='_blank' &gt;http://localhost:50070/dfshealth.jsp&lt;/a&gt;   // HDFS 확인
URL : &lt;a href='http://localhost:50030/jobtracker.jsp' target='_blank' &gt;http://localhost:50030/jobtracker.jsp&lt;/a&gt; // MapReduce 확인&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;이클립스 다운로드, 설정&lt;/h2&gt;
&lt;h4&gt;이클립스 다운로드&lt;/h4&gt;
&lt;p&gt;URL : &lt;a href='http://www.eclipse.org/downloads/' target='_blank' &gt;http://www.eclipse.org/downloads/&lt;/a&gt; 로 접속&lt;/p&gt;
&lt;p&gt;Eclipse IDE for Java Developers 를 다운로드&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;압축해제&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;$ cd Downloads
$ tar zxvf eclipse-java-luna-SR2-linux-gtk-x86_64.tar.gz
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;이클립스를 사용하여 Maven 프로젝트 생성&lt;/h4&gt;
&lt;h5&gt;Maven에 대한 이해&lt;/h5&gt;
&lt;p&gt;&lt;a href='https://www.slideshare.net/sunnykwak90/ss-43767933' target='_blank' &gt;https://www.slideshare.net/sunnykwak90/ss-43767933&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;이클립스 실행&lt;/h5&gt;
&lt;p&gt;파일 (탐색기)를 이용해서 eclipse 폴더의 eclipse 파일을 더블 클릭해서 실행&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;Maven Project 생성&lt;/h5&gt;
&lt;p&gt;File -&amp;gt; New -&amp;gt; Project -&amp;gt; Maven -&amp;gt; Maven Project 선택&lt;/p&gt;
&lt;p&gt;-&amp;gt; [Next] -&amp;gt; [Next] -&amp;gt; [Next] -&amp;gt;&lt;/p&gt;
&lt;p&gt;Group Id : kr.co.mycompant.hd&lt;/p&gt;
&lt;p&gt;Artifact Id : wcount&lt;/p&gt;
&lt;p&gt;-&amp;gt; [Finish]&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;pom.xml 수정해서 하둡 jar 파일 설정&lt;/h5&gt;
&lt;p&gt;pom.xml 을 열어서 &lt;dependencies&gt; 와 &lt;/dependencies&gt; 사이에 아래 내용을 입력&lt;/p&gt;
&lt;p&gt;의미 : 하둡 1.2.1 관련된 jar 파일들을 자동으로 다운로드해서 환경 설정&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;

  &amp;lt;groupId&amp;gt;org.apache.hadoop&amp;lt;/groupId&amp;gt;

  &amp;lt;artifactId&amp;gt;hadoop-core&amp;lt;/artifactId&amp;gt;

  &amp;lt;version&amp;gt;1.2.1&amp;lt;/version&amp;gt;

&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;WordCount 예제 코딩&lt;/h2&gt;
&lt;h3&gt;WordCount 클래스 생성&lt;/h3&gt;
&lt;p&gt;sr/main/java 밑의 kr.co.mycompany.hd.wcount 에서&lt;/p&gt;
&lt;p&gt;우클릭해서 -&amp;gt; New -&amp;gt; Class : WordCount -&amp;gt; [Finish]&lt;/p&gt;
&lt;p&gt;아래 소스를 입력&lt;/p&gt;
&lt;pre&gt;&lt;code class='language-Java' lang='Java'&gt;package kr.co.mycompany.hd.wcount;
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;

public class WordCount {
  public static class MyMapper
    extends Mapper&amp;lt;LongWritable, Text, Text, LongWritable&amp;gt; {
    private final static LongWritable one = new LongWritable(1);
    private Text word = new Text();
    @Override
    public void map(LongWritable key, Text value, Context context)
        throws IOException, InterruptedException {
      String line = value.toString();
      StringTokenizer tokenizer =
        new StringTokenizer(line, &amp;quot;\t\r\n\f|,.()&amp;lt;&amp;gt; &amp;quot;);
      while(tokenizer.hasMoreTokens()) {
        word.set(tokenizer.nextToken().toLowerCase());
        context.write(word, one);
      }
    }// map
  }// MyMapper
  public static class MyReducer
    extends Reducer&amp;lt;Text, LongWritable, Text, LongWritable&amp;gt; {
    private LongWritable sumWritable = new LongWritable();
    @Override
    protected void reduce(Text key, Iterable&amp;lt;LongWritable&amp;gt; values,
        Context context)
        throws IOException, InterruptedException {
      long sum = 0;
      for(LongWritable val : values) {
        sum += val.get();
      }
      sumWritable.set(sum);
      context.write(key, sumWritable);
    }// reduce
  }// MyReducer
  public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
    Job job = new Job(conf, &amp;quot;WordCount&amp;quot;);

    job.setJarByClass(WordCount.class);
    job.setMapperClass(MyMapper.class);
    job.setReducerClass(MyReducer.class);

    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(LongWritable.class);

    job.setInputFormatClass(TextInputFormat.class);
    job.setOutputFormatClass(TextOutputFormat.class);

    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));

    job.waitForCompletion(true);
  }// main
}// end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;코드 설명&lt;/h3&gt;
&lt;pre&gt;&lt;code class='language-Java' lang='Java'&gt;package kr.co.mycompany.hd.wcount;

public class WordCount {
  public static class MyMapper
    extends Mapper&amp;lt;LongWritable, Text, Text, LongWritable&amp;gt; {
    // Mapper를 상속받음 &amp;lt;KEYIN, VALUEIN, KEYOUT, VALUEOUT&amp;gt;
    
    private final static LongWritable one = new LongWritable(1);
    // final로 정의(상수). 공유하기 위해 static. 1을 담음. 어떤 단어가 한 번 나올 때 1이 들어가는 용도
    
    private Text word = new Text();
    // 단어 담는 용도. 이 위치에서 생성하는 게 성능 향상에 도움이 됨. 
    // Map에 생성되면 갯수만큼 호출되므로 매번 객체생성. Map에서는 객체 생성 안함. Map 들어가기 전에 생성.
    
    @Override  
    public void map(LongWritable key, Text value, Context context)
    // Text value : 텍스트가 한 줄씩 들어옴
    // Context : 나와 하둡의 연결고리
    
        throws IOException, InterruptedException {
      String line = value.toString();
      // String으로 바꿔야 자바에서 자료 관리가 가능하므로 변경
      // toStirng : String으로 바꿔줌
      
      StringTokenizer tokenizer = new StringTokenizer(line, &amp;quot;\t\r\n\f|,.()&amp;lt;&amp;gt; &amp;quot;);
      // StringTokenizer&amp;lt;String, 구분자&amp;gt;, 구분자 맨 뒤에 공백 있음.
      // Dear Bear River
      
      while(tokenizer.hasMoreTokens()) {
        word.set(tokenizer.nextToken().toLowerCase());
        context.write(word, one);
      // hasMoreTokens() : 반복문 돌면서 &amp;#39;hello hadoop world&amp;#39;
      // -&amp;gt; 3개로 끊어짐. &amp;#39;hello&amp;#39;, &amp;#39;hadoo&amp;#39;, &amp;#39;world&amp;#39;
          
      // word.set : 하나씩 담음
      // nextToken : 다음 토큰 가져옴
      // toLowerCase : 대소문자 구분 안하기 위해 모두 소문자로 변경
      
      // context.write(word, one) : 단어 기록. (ex) &amp;#39;hello&amp;#39;가 1번 나왔다 : (&amp;#39;hello&amp;#39;, 1)
          // 첫번째 루프 : Deer, 1 / 두번째 루프 : Bear, 1 / 세번째 루프 : River 1
      }
    }// map
  }// MyMapper
  
  
  // Reducer
  public static class MyReducer
    extends Reducer&amp;lt;Text, LongWritable, Text, LongWritable&amp;gt; {
    // Reducer &amp;lt;KEYIN, VALUEIN, KEYOUT, VALUEOUT&amp;gt;  
      
    private LongWritable sumWritable = new LongWritable();
    
    @Override
    protected void reduce(Text key, Iterable&amp;lt;LongWritable&amp;gt; values,
        Context context)
    // Iterable : 반복자
        
        throws IOException, InterruptedException {
      long sum = 0;
      for(LongWritable val : values) {
        sum += val.get();
      }
      // 반복문 돌면서 LongWritable로 하나씩 가져온다.
      // 배열로 두개가 들어온다고 생각(그림의 Shuffling 부분 참고). (ex) Bear[1, 1]
      
      sumWritable.set(sum);
      // 더해 줌
        
      context.write(key, sumWritable);       
    }// reduce
  }// MyReducer
    
 
  // Main method
  public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
    // Configuration : 환경설정
   
    Job job = new Job(conf, &amp;quot;WordCount&amp;quot;);
    // Job : MapReduce의 Job

    job.setJarByClass(WordCount.class);
    job.setMapperClass(MyMapper.class);
    job.setReducerClass(MyReducer.class);

    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(LongWritable.class);

    job.setInputFormatClass(TextInputFormat.class);
    job.setOutputFormatClass(TextOutputFormat.class);

    FileInputFormat.addInputPath(job, new Path(args[0]));  // 입력폴더
    FileOutputFormat.setOutputPath(job, new Path(args[1]));  // 출력폴더

    job.waitForCompletion(true);
  }
}// end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;예제를 Maven Install 로 ~.jar 파일로 패키징한다.&lt;/h3&gt;
&lt;p&gt;프로젝트 우클릭 -&amp;gt; Run As -&amp;gt; 8 Maven install&lt;/p&gt;
&lt;p&gt;target 폴더에 wcount-0.0.1-SNAPSHOT.jar 이 생성된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;하둡 가상 분산 모드에서 생성된 jar 을 사용하여 WordCount 실행, 테스트&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;wcount-0.0.1-SNAPSHOT.jar 파일을 /home/유저명/hadoop-1.2.1 폴더에 복사한다.&lt;/li&gt;
&lt;li&gt;hadoop fs 명령을 사용하여 테스트할 파일을 복사한다.&lt;/li&gt;

&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;$ hadoop fs -put READEME.txt .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;hadoop jar 명령을 사용하여 예제를 실행/테스트한다.&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ hadoop jar wcount-0.0.1-SNAPSHOT.jar kr.co.mycompany.hd.wcount.WordCount README.txt output1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;결과가 output1 폴더에 part-r-00000 이라는 파일로 저장된다.&lt;/h3&gt;
&lt;p&gt;hadoop fs -cat 명령어를 통해서 학인 할 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ hadoop fs -cat output1/part-r-00000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;wc : wordcount 명령어&lt;/h4&gt;
&lt;p&gt;단어수 31,  줄 179, 크기 1366 &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[참고문헌]&lt;/p&gt;
&lt;p&gt;&lt;a href='https://blog.naver.com/sungback/220381870733' target='_blank' &gt;https://blog.naver.com/sungback/220381870733&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href='https://www.slideshare.net/sunnykwak90/ss-43767933' target='_blank' &gt;https://www.slideshare.net/sunnykwak90/ss-43767933&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href='http://naver.me/IDMfcGl3' target='_blank' &gt;http://naver.me/IDMfcGl3&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href='https://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html' target='_blank' &gt;https://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html&lt;/a&gt;&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</description>
      <category>Programming/Data Engineering</category>
      <author>goudacheese</author>
      <guid isPermaLink="true">https://hmtb.tistory.com/31</guid>
      <comments>https://hmtb.tistory.com/31#entry31comment</comments>
      <pubDate>Wed, 25 Apr 2018 12:33:36 +0900</pubDate>
    </item>
    <item>
      <title>HDFS의 기본 구조(HDFS Architecture)</title>
      <link>https://hmtb.tistory.com/30</link>
      <description>&lt;meta charset=&quot;UTF-8&quot;&gt;&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width initial-scale=1&quot;&gt;
&lt;title&gt;HDFS Architecture&lt;/title&gt;

&lt;h2&gt;HDFS Architecture&lt;/h2&gt;&lt;h2&gt;
&lt;/h2&gt;&lt;h2&gt;&lt;img src=&quot;https://github.com/lovesignal/lovesignal.github.io/blob/master/img/post/Programming/HDFS%20Architecture.png?raw=true&quot; alt=&quot;&quot; style=&quot;max-width: 100%; height: auto;&quot;&gt;&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol start=&quot;&quot;&gt;
&lt;li&gt;파일 저장, 읽기 : 어플리케이션에서 클라이언트로 파일 저장 또는 읽기 요청&lt;/li&gt;
&lt;li&gt;Client : application 요청에 의해 client가 NameNode에 데이터 블록의 위치를 조회 &lt;/li&gt;
&lt;li&gt;NameNode에게 받은 Data block 위치를 통해 Client가 데이터를 직접 조회&lt;/li&gt;
&lt;li&gt;Heart beat : DataNode가 상태를 주기적으로 보고(일종의 출석체크).&lt;/li&gt;

&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;h2&gt;&lt;/h2&gt;&lt;h2&gt;&lt;b style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;Secondary NameNode&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;h2&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt; font-weight: normal;&quot;&gt;NameNode가 망가지면 데이터가 어디에 저장되어 있는지 알 수 없기때문에 읽어들일 수 없으므로, NameNode를 백업해 두었다가 NameNode가 망가지면 다시 복구해 주는 역할&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;/h2&gt;
&lt;li&gt;&lt;p&gt;&lt;b&gt;HDFS와 MapReduce는 둘다 Master/Slave 구조&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HDFS&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Master : Name node(메타정보관리)&lt;/li&gt;
&lt;li&gt;Slave : Data node(실제 데이터)&lt;/li&gt;

&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;MapReduce&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Master : JobTracker(TaskTracker의 상태 및 전체 작업의 진행 상황등을 지속적으로 감시하며 일 시적인 장애에 대해 자동 복구 기능 제공)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Slave : TaskTracker&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Map Task&lt;/p&gt;
&lt;p&gt;레코드 단위로 처리해야 하는 작업을 담당&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reduce Task&lt;/p&gt;
&lt;p&gt;관련된 데이터 끼리 묶어서 처리해야 하는 작업 담당&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;MapReduce만 코딩. 나머지는 자동.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Node&lt;/b&gt; : 컴퓨터 한 대라고 생각하면 됨.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Name Node, Data Node&lt;/b&gt; : HDFS 컨트롤 &lt;/li&gt;
&lt;li&gt;&lt;b&gt;Job tracker, task tracker&lt;/b&gt; : MapReduce 컨트롤&lt;/li&gt;

&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/Data Engineering</category>
      <category>hadoop</category>
      <category>hadoop architecture</category>
      <category>HDFS</category>
      <category>하둡</category>
      <category>하둡구조</category>
      <author>goudacheese</author>
      <guid isPermaLink="true">https://hmtb.tistory.com/30</guid>
      <comments>https://hmtb.tistory.com/30#entry30comment</comments>
      <pubDate>Wed, 25 Apr 2018 12:27:30 +0900</pubDate>
    </item>
    <item>
      <title>R Data Structure 데이터 구조</title>
      <link>https://hmtb.tistory.com/29</link>
      <description>&lt;!doctype html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset='UTF-8'&gt;&lt;meta name='viewport' content='width=device-width initial-scale=1'&gt;
&lt;title&gt;R_DataStructure.md&lt;/title&gt;&lt;/head&gt;
&lt;body&gt;&lt;h1&gt;R의 Data structure&lt;/h1&gt;
&lt;h2&gt;데이터 구조 종류&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scalar&lt;/strong&gt; : element가 1개인 vector이다. &lt;/p&gt;
&lt;pre&gt;&lt;code class='language-R' lang='R'&gt;# scalar 만들기
a &amp;lt;- &amp;#39;a&amp;#39;
alphabet &amp;lt;- &amp;#39;abcdefg&amp;#39;
num &amp;lt;- 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Vector&lt;/strong&gt; : 같은 종류의 element가 여러개 들어 있는 1차원 matrix이다.&lt;/p&gt;
&lt;pre&gt;&lt;code class='language-R' lang='R'&gt;# vector 만들기
table &amp;lt;- c(&amp;#39;a&amp;#39;, &amp;#39;b&amp;#39;)
table &amp;lt;- c(1, 2, 3, 5)
bool &amp;lt;- c(TRUE, FALSE)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Matrix&lt;/strong&gt; : 2차원으로 된 배열. 일반적이 표 데이터를 생각하면 된다.&lt;/p&gt;
&lt;pre&gt;&lt;code class='language-R' lang='R'&gt;# matrix 만들기
# 2 by 3 행렬 생성
&amp;gt; mat &amp;lt;- matrix(c(&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;), nrow = 2, ncol = 3)
&amp;gt; mat
    [,1] [,2] [,3]
[1,] &amp;quot;a&amp;quot;  &amp;quot;c&amp;quot;  &amp;quot;e&amp;quot; 
[2,] &amp;quot;b&amp;quot;  &amp;quot;d&amp;quot;  &amp;quot;f&amp;quot; 

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Array&lt;/strong&gt; : 차원이  matrix 보다 많다. Matrix는 2차원(행, 열)인데 비해 배열은 그 이상 차원이 형성될 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code class='language-R' lang='R'&gt;# array 만들기
&amp;gt; animal &amp;lt;- c(&amp;quot;dog&amp;quot;, &amp;quot;cat&amp;quot;, &amp;quot;rabbit&amp;quot;)
&amp;gt; feed &amp;lt;- c(&amp;quot;meat&amp;quot;, &amp;quot;fish&amp;quot;, &amp;quot;carrot&amp;quot;)
&amp;gt; jump &amp;lt;- c(&amp;quot;3&amp;quot;, &amp;quot;2&amp;quot;, &amp;quot;1&amp;quot;)
&amp;gt; arr &amp;lt;- array(data = c(animal, feed, jump), dim = c(1,3,3), dimnames = list(&amp;#39;value&amp;#39;, c(1, 2, 3), c(&amp;#39;animal&amp;#39;,&amp;#39;feed&amp;#39;,&amp;#39;jump&amp;#39;)))

# array(c(vector1, vector2, vector3), dim = c(1,3,3), dimnames = list(row.names, column.names, matrix.names))

&amp;gt; arr
, , animal

      1     2     3       
value &amp;quot;dog&amp;quot; &amp;quot;cat&amp;quot; &amp;quot;rabbit&amp;quot;

, , feed

      1      2      3       
value &amp;quot;meat&amp;quot; &amp;quot;fish&amp;quot; &amp;quot;carrot&amp;quot;

, , jump

      1   2   3  
value &amp;quot;3&amp;quot; &amp;quot;2&amp;quot; &amp;quot;1&amp;quot; 

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src='https://lovesignal.github.io/img/post/Study/R_1.png' alt='' /&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data Frame&lt;/strong&gt; : matrix와 유사한데, 유형이 다른 데이터를 함께 넣을 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code class='language-R' lang='R'&gt;&amp;gt; animal &amp;lt;- c(&amp;quot;dog&amp;quot;, &amp;quot;cat&amp;quot;, &amp;quot;rabbit&amp;quot;)
&amp;gt; feed &amp;lt;- c(&amp;quot;meat&amp;quot;, &amp;quot;fish&amp;quot;, &amp;quot;carrot&amp;quot;)
&amp;gt; jump &amp;lt;- c(&amp;quot;3&amp;quot;, &amp;quot;2&amp;quot;, &amp;quot;1&amp;quot;)
&amp;gt; dat &amp;lt;- data.frame(animal, feed, jump)
&amp;gt; dat
  animal   feed jump
1    dog   meat    3
2    cat   fish    2
3 rabbit carrot    1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;/li&gt;

&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;List&lt;/strong&gt; :서열화된 성분들의 집합체이다. 예시를 보는 게 빠르다.&lt;/p&gt;
&lt;pre&gt;&lt;code class='language-R' lang='R'&gt;&amp;gt; title &amp;lt;- &amp;quot;Phone Book&amp;quot;
&amp;gt; name &amp;lt;- c(&amp;quot;Tom&amp;quot;, &amp;quot;Jack&amp;quot;, &amp;quot;Jean&amp;quot;, &amp;quot;Mike&amp;quot;)
&amp;gt; phone &amp;lt;- c(&amp;quot;010-1234-1234&amp;quot;, &amp;quot;010-2345-5678&amp;quot;, &amp;quot;010-9876-5673&amp;quot;)
&amp;gt; index &amp;lt;- c(1, 2, 3)
&amp;gt; etc &amp;lt;- matrix(1:10, nrow=2)

&amp;gt; mylist &amp;lt;-list(title = title, info = name, phone, index, etc)
&amp;gt; mylist
$title
[1] &amp;quot;Phone Book&amp;quot;

$info
[1] &amp;quot;Tom&amp;quot;  &amp;quot;Jack&amp;quot; &amp;quot;Jean&amp;quot; &amp;quot;Mike&amp;quot;

[[3]]
[1] &amp;quot;010-1234-1234&amp;quot; &amp;quot;010-2345-5678&amp;quot; &amp;quot;010-9876-5673&amp;quot;

[[4]]
[1] 1 2 3

[[5]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8   10

&amp;gt; mylist$title
[1] &amp;quot;Phone Book&amp;quot;

&amp;gt; mylist[[3]]
[1] &amp;quot;010-1234-1234&amp;quot; &amp;quot;010-2345-5678&amp;quot; &amp;quot;010-9876-5673&amp;quot;

&amp;gt; mylist$info[1]
[1] &amp;quot;Tom&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;/li&gt;

&lt;/ul&gt;
&lt;/body&gt;
&lt;/html&gt;</description>
      <category>Statistics/R</category>
      <author>goudacheese</author>
      <guid isPermaLink="true">https://hmtb.tistory.com/29</guid>
      <comments>https://hmtb.tistory.com/29#entry29comment</comments>
      <pubDate>Wed, 25 Apr 2018 12:25:10 +0900</pubDate>
    </item>
    <item>
      <title>PYTHON &amp;amp; DJANGO 온라인 강의 수업노트 DAY20</title>
      <link>https://hmtb.tistory.com/28</link>
      <description>&lt;meta charset=&quot;UTF-8&quot;&gt;&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width initial-scale=1&quot;&gt;
&lt;title&gt;Python Django - Day20.md&lt;/title&gt;
&lt;h1&gt;Day 20. Django 프로젝트 파일 구조, MTV&lt;/h1&gt;
&lt;h2&gt;Django 프로젝트 만들기&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;$ python3 -m venv django-venv
$ source django-venv/bin/activate
$ pip install django
$ django-admin startproject firstproject
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래 구조의 프로젝트가 생성된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Django 프로젝트 디렉토리 형태&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/lovesignal/img/master/programming/django/django_project.png&quot; alt=&quot;project_django&quot; style=&quot;max-width: 100%; height: auto;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;manage.py&lt;/h3&gt;
&lt;p&gt;다양한 명령어를 수행시켜주는 매개체 역할을 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;__&lt;/strong&gt;init&lt;strong&gt;__&lt;/strong&gt;.py&lt;/h3&gt;
&lt;p&gt;파이썬 모듈로써 동작을 할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;settings.py&lt;/h3&gt;
&lt;p&gt;여러 설정들을 기억해 두는 파일.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;wigs.py&lt;/h3&gt;
&lt;p&gt;웹서버에 배포를 할때 설정파일들을 연결시켜주는 파이썬 파일.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Django 앱 추가해보기&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;source ../django-env/bin/activate    # 가상환경 실행
python3 manage.py startapp myapp     # myapp 자리에 앱 이름 넣으면 됨
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/lovesignal/img/master/programming/django/django_myapp.png&quot; alt=&quot;project_myapp&quot; style=&quot;max-width: 100%; height: auto;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Django MTV&lt;/h2&gt;
&lt;h3&gt;Model&lt;/h3&gt;
&lt;p&gt;데이터 베이스 관리&lt;/p&gt;
&lt;h3&gt;Template&lt;/h3&gt;
&lt;p&gt;사용자가 보는 화면(HTML, CSS 등)&lt;/p&gt;
&lt;h3&gt;View&lt;/h3&gt;
&lt;p&gt;화면을 구성 통제. 데이터베이스와 템플릿을 연결&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/Django</category>
      <author>goudacheese</author>
      <guid isPermaLink="true">https://hmtb.tistory.com/28</guid>
      <comments>https://hmtb.tistory.com/28#entry28comment</comments>
      <pubDate>Wed, 25 Apr 2018 12:20:20 +0900</pubDate>
    </item>
  </channel>
</rss>