<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>bn-tw.log</title>
        <link>https://velog.io/</link>
        <description>brand-new</description>
        <lastBuildDate>Wed, 20 Jan 2021 10:49:52 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>bn-tw.log</title>
            <url>https://images.velog.io/images/bn-tw/profile/89425b75-f4e0-4c39-b0f6-c78b377b68d0/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. bn-tw.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/bn-tw" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[validator]]></title>
            <link>https://velog.io/@bn-tw/validator</link>
            <guid>https://velog.io/@bn-tw/validator</guid>
            <pubDate>Wed, 20 Jan 2021 10:49:52 GMT</pubDate>
            <description><![CDATA[<h1 id="validation">Validation</h1>
<p><code>validation</code></p>
<ul>
<li>어떤 데이터의 값이 유효한지, 타당한지 확인하는 것</li>
</ul>
<pre><code>이메일 주소 양식은 test@example.com인데, 회원가입 할 때 이메일 양식이 일치하지 않으면 유효하지 않은 이메일이므로 회원 가입을 막을 수 있음</code></pre><ul>
<li><code>이메일 양식이 일치하지 않는다</code> UX측면(사용자 경험)에서 사용자에게 편의를 주기 위함</li>
<li>사용자가 잘못 입력하여 오타가 발생 했으니 다시 한 번 확인을 하라는 의미</li>
<li>UI단에서 유효성 검사를 하는 것은 보안적인 측면에서 아무 효과가 없음</li>
</ul>
<h2 id="보안적인-측면에서의-유효성-검사">보안적인 측면에서의 유효성 검사</h2>
<ul>
<li>올바르지 않은 데이터가 서버로 전송되거나, Database에 저장되지 않도록 하는 것</li>
</ul>
<h2 id="joi">Joi</h2>
<ul>
<li>프로젝트를 진행 중 유효성 검사 라이브러리를 검색 중 발견!
<code>아래의 예제는 학생 이름을 입력 받아 배열에 넣어 모든 학생의 정보를 보여주는 api입니다.</code></li>
</ul>
<pre><code class="language-javascript">app.post(&quot;/api/students&quot;, (req, res) =&gt; {
  let { name } = req.body;

  let student = {
    id: students.length + 1,
    name: name,
  };
  students.push(student);
  res.send(students);
});</code></pre>
<p><code>문제점은 name이라는 변수에 대해 유효성 검사를 할 수 없음</code></p>
<pre><code class="language-javascript">app.post(&quot;/api/students&quot;, (req, res) =&gt; {
  let { name } = req.body;

  if (!name) {
    res.status(400).send(&quot;Name is required...&quot;);
    return;
  }
  if (name.length &lt;= 3) {
    res.status(400).send(&quot;name must be more than 3 char long&quot;);
    return;
  }

  let student = {
    id: students.length + 1,
    name: name,
  };
  students.push(student);
  res.send(students);
});</code></pre>
<p><code>문제점은 많은 양의 변수가 들어올 시 체크 해줘야 할 것이 많아서 코드량이 늘어남</code></p>
<h3 id="joi-라이브러리">joi 라이브러리</h3>
<ul>
<li><code>install</code><ul>
<li><code>npm install @hapi/joi</code></li>
</ul>
</li>
</ul>
<pre><code class="language-javascript">
const schema = Joi.object({
    name: Joi.string().min(3).max(15).required(),
});


app.post(&quot;/api/students&quot;, (req, res) =&gt; {
  let { name } = req.body;

  let result = schema.validate(req.body);
  if (result.error) {
    res.status(400).send(result.error.details[0].message);
    return;
  }

  let student = {
    id: students.length + 1,
    name: name,
  };
  students.push(student);
  res.send(students);
});</code></pre>
<blockquote>
<p>schema 설정만 잘해준다면 여러 api에 대해서 유효성 검사가 편리할 것 같다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[운영체제와 정보기술의 원리[리뷰]]]></title>
            <link>https://velog.io/@bn-tw/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C%EC%99%80-%EC%A0%95%EB%B3%B4%EA%B8%B0%EC%88%A0%EC%9D%98-%EC%9B%90%EB%A6%AC%EB%A6%AC%EB%B7%B0</link>
            <guid>https://velog.io/@bn-tw/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C%EC%99%80-%EC%A0%95%EB%B3%B4%EA%B8%B0%EC%88%A0%EC%9D%98-%EC%9B%90%EB%A6%AC%EB%A6%AC%EB%B7%B0</guid>
            <pubDate>Sun, 17 Jan 2021 10:11:12 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/bn-tw/post/ba70b7e4-cfeb-44f7-864c-ed34f6e19cec/3.jpg" alt=""></p>
<ul>
<li>군입대 전 학습했던 운영체제를 정리하고자 선택하여 책을 읽었다.</li>
<li>머리 속에서 여기저기 떨어져 있던 개념들을 정리할 수 있었다.</li>
</ul>
<h4 id="장점">장점</h4>
<p>운영체제가 돌아가는 방법에 대해 스토리를 담고 있는 것 같다.  </p>
<p>하나 하나의 개념을 설명해주는 것이 아니라 전체적으로 컴퓨터가 부팅 되면서 프로그램이 돌아가는 것 모든 것을 정리할 수 있다.</p>
<p>책도 두껍지 않아서 잊어버렸던 개념을 정리할 수 있는 그런 책.</p>
<h4 id="단점">단점</h4>
<p>정독하면서 크게 단점을 찾을 수 없었다. 아마 1회독을 더 하지 않을 까 싶다.</p>
<blockquote>
<p>KOCW에 교수님이 한 강의도 있다고 하니 볼 사람은 같이 참고하면서 보면 좋을 듯 하다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[후위 표기식]]></title>
            <link>https://velog.io/@bn-tw/%ED%9B%84%EC%9C%84-%ED%91%9C%EA%B8%B0%EC%8B%9D</link>
            <guid>https://velog.io/@bn-tw/%ED%9B%84%EC%9C%84-%ED%91%9C%EA%B8%B0%EC%8B%9D</guid>
            <pubDate>Sun, 17 Jan 2021 09:55:13 GMT</pubDate>
            <description><![CDATA[<h2 id="문제">문제</h2>
<p><a href="https://www.acmicpc.net/problem/1918">https://www.acmicpc.net/problem/1918</a></p>
<h2 id="추상화">추상화</h2>
<p><code>전에 푼 1935번 후위 표기식을 계산하는 법을 알았다면 이번엔 중위표기식을 후위 표기식으로의 변환이다</code>
<code>이 문제는 자료구조를 통해 한번 익혓기에 그림으로 한번 시뮬을 돌린뒤 작성을 할 수 있었다.</code></p>
<h2 id="코드">코드</h2>
<pre><code class="language-c">// 숫자는 문자열에 추가
// 연산자일 때
// 괄호 안에는 우선순위가 가장 높기 때문에 ( 이면 push
// + - *  / 스택에 현재 연산자보다 우선순위가 높거나 같은 기호일 경우 pop해서 문자열 추가 그렇지 않으면 push
// 우선순위 * / &gt; + -

#include&lt;iostream&gt;
#include&lt;stack&gt;
using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    string s;
    string answer;
    stack&lt;char&gt; stk;
    cin&gt;&gt; s;

    for(int i=0; i&lt;s.size(); i++) {
        if(s[i] &gt;= &#39;A&#39; &amp;&amp; s[i] &lt;= &#39;Z&#39;) {
            answer+=s[i];
        }
        else {
            if(s[i] == &#39;(&#39;) stk.push(s[i]);
            else if(s[i] == &#39;*&#39; || s[i] == &#39;/&#39;) {
                while(!stk.empty() &amp;&amp; (stk.top() == &#39;*&#39; || stk.top() ==&#39;/&#39;)) {
                    answer += stk.top();
                    stk.pop();
                }
                stk.push(s[i]);
            }
            else if(s[i] == &#39;+&#39; || s[i] == &#39;-&#39;) {
                while(!stk.empty() &amp;&amp; stk.top() != &#39;(&#39;) {
                    answer += stk.top();
                    stk.pop();
                }
                stk.push(s[i]);
            }
            else if(s[i] ==&#39;)&#39;) {
                while(!stk.empty() &amp;&amp; stk.top() != &#39;(&#39;) {
                    answer += stk.top();
                    stk.pop();
                }
                stk.pop();
            }
        }
    }
    while(!stk.empty()) {
        answer+=stk.top();
        stk.pop();
    }
    cout&lt;&lt;answer&lt;&lt;&#39;\n&#39;;
    return 0;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[후위 표기식 2]]></title>
            <link>https://velog.io/@bn-tw/%ED%9B%84%EC%9C%84-%ED%91%9C%EA%B8%B0%EC%8B%9D-2</link>
            <guid>https://velog.io/@bn-tw/%ED%9B%84%EC%9C%84-%ED%91%9C%EA%B8%B0%EC%8B%9D-2</guid>
            <pubDate>Sun, 17 Jan 2021 09:51:24 GMT</pubDate>
            <description><![CDATA[<h2 id="문제">문제</h2>
<p><a href="https://www.acmicpc.net/problem/1935">https://www.acmicpc.net/problem/1935</a></p>
<h2 id="추상화">추상화</h2>
<p><code>주어진 후위표기식을 어떻게하면 완벽한 계산이 나올까?</code>
<code>후위표기식이라는 것을 먼저 이해하면 손 쉽게 해결이 가능하다.</code>
후위 표기식은 <a href="https://velog.io/@bn-tw/%ED%9B%84%EC%9C%84%ED%91%9C%EA%B8%B0%EB%B2%95Postfix-expression-%EA%B3%84%EC%82%B0%EB%B2%95">링크</a>을 통해 간단하게 정리를 했으니 참고하면 좋을듯 하다.</p>
<h2 id="코드">코드</h2>
<pre><code class="language-c">#include&lt;iostream&gt;
#include&lt;vector&gt;
#include&lt;stack&gt;
using namespace std;
vector&lt;int&gt; vec;
stack&lt;double&gt; stk;

void calc(double num1, double num2, char oper) {
    if(oper == &#39;+&#39;) stk.push(num2+num1);
    else if(oper ==&#39;-&#39;) stk.push(num2-num1);
    else if(oper ==&#39;*&#39;) stk.push(num2*num1);
    else stk.push(num2/num1);
}

int main() {
    int N; cin&gt;&gt;N;
    string s; cin&gt;&gt;s;

    for(int i=0; i&lt;N; i++) {
        double num; cin&gt;&gt;num;
        vec.push_back(num);
    }
    for(int i=0; i&lt;s.size(); i++) {
        if(s[i]&gt;=&#39;A&#39; &amp;&amp; s[i]&lt;=&#39;Z&#39;) { // 숫자
            stk.push(vec[s[i]-&#39;A&#39;]);
        }
        else { // 연산자
            double num1 = stk.top(); stk.pop();
            double num2 = stk.top(); stk.pop();
            calc(num1, num2, s[i]);
        }
    }
    cout&lt;&lt;fixed;
    cout.precision(2);
    cout&lt;&lt;stk.top();
    return 0;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[후위표기법(Postfix expression) 계산법]]></title>
            <link>https://velog.io/@bn-tw/%ED%9B%84%EC%9C%84%ED%91%9C%EA%B8%B0%EB%B2%95Postfix-expression-%EA%B3%84%EC%82%B0%EB%B2%95</link>
            <guid>https://velog.io/@bn-tw/%ED%9B%84%EC%9C%84%ED%91%9C%EA%B8%B0%EB%B2%95Postfix-expression-%EA%B3%84%EC%82%B0%EB%B2%95</guid>
            <pubDate>Sun, 17 Jan 2021 07:12:59 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>BOJ문제 풀이를 통해 후위 표기식 정리하는</p>
</blockquote>
<h1 id="후위표기식">후위표기식</h1>
<p>일반적으로 사용하는 사칙연산은 피연산자(숫자) 사이에 연산자(+, -, /, *)가 들어가는 형태로 중위표기식(infix expression)’이라고 한다. 그러나 후위표기식은 피연산자가 먼저쓰이고, 그 뒤로 피연산자가 나오는 형태를 말한다. 예를들어, <code>4+3</code> 의 중위표기식을 후위표기식으로 바꾼다면 <code>43+</code> 으로 표현할 수 있다.</p>
<h2 id="후위표기식의-장점">후위표기식의 장점</h2>
<p>일반적으로 익숙하지 않아서 그렇지, 중위표기식보다 후위표기식은 괄호나 사칙연산의 우선순위를 생각하지 않아 훨씬 직관적이다. 예를들어, 중위표기식에서 <code>4*7+2</code>라는 연산을 진행할 때, <code>7+2</code>를 먼저 연산하고 싶다면, 괄호를 필연적으로 사용해야 한다. <code>4*(7+2)</code> 하지만 후위표기식으로 표현한다면 <code>472+*</code> 로 표현할 수있다.</p>
<h2 id="후위표기식-읽는-방법">후위표기식 읽는 방법</h2>
<p>왼쪽부터 순차적으로 읽으면 된다.
피연산자(숫자)는 일단 지나치고, 연산자(+, -, *, /)가 나오게 되면, 연산자 앞쪽 두 개의 숫자로 연산을 진행한다.</p>
<ul>
<li>예제) <code>472+*</code><ul>
<li>왼쪽부터 순차적으로 읽으며 연산자를 찾는다.</li>
<li><code>+</code> 연산자를 찾고 그 기준으로 앞 쪽 두 개의 피연산자 <code>7, 2</code>를 더합니다.</li>
<li>연산을 진행하고 나면 연산된 값인 <code>49*</code>가 된다.</li>
<li>다시 순차적으로 연산자를 찾으며 진행하면,</li>
<li><code>*</code>연산자를 찾고, 앞의 두 개의 피연산자를 이용하여 연산을 진행한다.</li>
<li>최종 결과는 <code>36</code></li>
</ul>
</li>
</ul>
<blockquote>
<p>공부 후 풀어보면 도움 될만한 문제
<a href="https://www.acmicpc.net/problem/1918">후위 표기식</a>
<a href="https://www.acmicpc.net/problem/1935">후위 표기식2</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[ALTER]]></title>
            <link>https://velog.io/@bn-tw/ALTER</link>
            <guid>https://velog.io/@bn-tw/ALTER</guid>
            <pubDate>Sun, 13 Dec 2020 13:18:29 GMT</pubDate>
            <description><![CDATA[<h2 id="alter">ALTER</h2>
<blockquote>
<p>ALTER을 많이 사용하지 않기 때문에 기록으로 남겨두는 글</p>
</blockquote>
<h3 id="쿼리">쿼리</h3>
<ul>
<li><p>컬럼 추가</p>
<pre><code class="language-sql">ALTER TABLE table_name ADD COLUMN ex_column varchar(32) NOT NULL;</code></pre>
</li>
<li><p>컬럼 변경</p>
<pre><code class="language-sql">ALTER TABLE table_name MODIFY COLUMN ex_column varchar(16) NOT NULL;</code></pre>
</li>
<li><p>컬럼 이름까지 변경</p>
<pre><code class="language-sql">ALTER TABLE table_name CHANGE COLUMN ex_column ex_column2 varchar(16) NOT NULL;</code></pre>
</li>
<li><p>컬럼 삭제</p>
<pre><code class="language-sql">ALTER TABLE table_name DROP COLUMN ex_column;</code></pre>
</li>
<li><p>테이블 이름 변경</p>
<pre><code class="language-sql">ALTER TABLE table_name RENAME table_name2;</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[운영체제(2)]]></title>
            <link>https://velog.io/@bn-tw/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C2</link>
            <guid>https://velog.io/@bn-tw/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C2</guid>
            <pubDate>Sun, 13 Dec 2020 09:23:06 GMT</pubDate>
            <description><![CDATA[<h2 id="운영체제란-무엇인가">운영체제란 무엇인가?</h2>
<blockquote>
<p>컴퓨터 하드웨어 바로 위에 설치되어 사용자 및 다른 모든 소프트웨어와 하드웨어를 연결하는 소프트웨어 계층</p>
</blockquote>
<ul>
<li>협의의 운영체제(커널)<ul>
<li>운영체제의 핵심 부분으로 메모리에 상주하는 부분</li>
</ul>
</li>
<li>광의의 운영체제<ul>
<li>커널 뿐 아니라 각종 주변 시스템 유틸리티를 포함한 개념</li>
</ul>
</li>
</ul>
<h2 id="운영체제의-목적">운영체제의 목적</h2>
<ul>
<li>컴퓨터 시스템의 <strong>자원을 효율적으로 관리</strong><ul>
<li>프로세서, 기억장치, 입출력 장치 등의 효율적 관리<ul>
<li>사용자간의 형평성 있는 자원 분배</li>
<li>주어진 자원으로 최대한의 성능을 내도록</li>
</ul>
</li>
<li>사용자 및 운영체제 자신의 보호</li>
<li>프로세스, 파일, 메시지 등을 관리</br></li>
</ul>
</li>
<li>컴퓨터 시스템을 편리하게 사용할 수 있도록 제공<ul>
<li>운영체제는 동시 사용자/프로그램들이 각각 독자적 컴퓨터에서 수행되는 것 같은 환상을 제공</li>
<li>하드웨어를 직접 다루는 복잡한 부분을 운영체제가 대행</li>
</ul>
</li>
</ul>
<h2 id="운영-체제의-분류">운영 체제의 분류</h2>
<ol>
<li><strong>동시 작업 가능 여부</strong><ul>
<li>단일 작업(single tasking)
  ✓ 한 번에 하나의 작업만 처리
  ✓ 예) MS-DOS 프롬프트 상에서는 한 명령의 수행을 끝내기 전에 다른 명령을 수행 시킬 수 없음  </br></li>
<li>다중 작업(multi tasking)
  ✓ 동시에 두개 이상의 작업 처리
  ✓ 예) UNIX, MS Windows 등에서는 한 명령의 수행이 끝나기 전에 다른 명령이나 프로그램을 수행 할 수 있음  </br></li>
</ul>
</li>
<li><strong>사용자의 수</strong><ul>
<li>단일 사용자(single user)
  ✓ 예) MS-DOS, MS Windows  </br></li>
<li>다중 사용자(multi user)
  ✓ 예) UINIX, NT server  </br></li>
</ul>
</li>
<li><strong>처리 방식</strong><ul>
<li>일괄 처리(batch processing)
  ✓ 작업 요청의 일정량 모아서 한꺼번에 처리<br>  ✓ 작업이 완전 종료될 때까지 기다려야 함<br>  ✓ 예) 초기 Punch Card 처리 시스템  </br></li>
<li>시분할(time sharing)
  ✓ 여러 작업을 수행할 때 컴퓨터 처리 능력을 일정한 시간 단위로 분할하여 사용
  ✓ 일괄 처리 시스템에 비해 짧은 응답 시간을 가짐. 예) UINIX<br>  ✓ interactive한 방식  </br></li>
<li>실시간(Realtime OS)
  ✓ 정해진 시간 안에 어떠한 일이 반드시 종료됨이 보장되어야 하는 실시간시스템을 위한 os
  ✓ 예) 원자로/공장 제어, 미사일 제어, 반도체 장비, 로보트 제어  </br>    </li>
<li>실시간 시스템의 개념 확장
  ✓ Hard realtime system(경선 실시간 시스템)
  ✓ Soft realtime system(연성 실시간 시스템)</li>
</ul>
</li>
</ol>
<pre><code>Multitasking: CPU에서는 매 순간 하나의 작업만 하니깐 짧은 시간을 나누어서 할당을 하기 때문에 마치 동시에 실행되는 것처럼 보입니다.

Multiprogramming: 여러 프로그램이 메모리에 올라가 있음을 강조

Time sharing: CPU의 시간을 분할하여 나누어 쓴다는 말을 강조

Multiprocessor: 하나의 컴퓨터에 CPU (processor)가 여러 개 붙어있음을 의미</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[운영체제(1)]]></title>
            <link>https://velog.io/@bn-tw/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C1</link>
            <guid>https://velog.io/@bn-tw/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C1</guid>
            <pubDate>Sat, 12 Dec 2020 13:55:38 GMT</pubDate>
            <description><![CDATA[<h2 id="목표">목표</h2>
<p>운영체제는 컴퓨터 하드웨어 바로 위에 설치되는 소프트웨어 계층으로서 모든 컴퓨터 시스템의 필수적인 부분입니다.
운영체제의 개념과 역할, 운영체제를 구성하는 각 요소 및 그 알고리즘의 핵심적인 부분에 대해 기초부터 학습하기 위한 글입니다.</p>
<h2 id="내용">내용</h2>
<pre><code>운영체제 개요
컴퓨터시스템의 구조
프로세스 관리
CPU 스케줄링
병행 제어
데드락
메모리 관리
가상 메모리
파일 시스템
입출력 시스템
디스크 관리</code></pre><h2 id="운영체제란-무엇인가">운영체제란 무엇인가?</h2>
<ul>
<li>운영체제(Operating System, OS)란?<ul>
<li>컴퓨터 하드웨어 바로 위에 설치되어 사용자 및 다른 모든 소프트웨어와 하드웨어를 연결하는 소프트웨어 계층</li>
</ul>
</li>
</ul>
<p><img src="https://images.velog.io/images/bn-tw/post/0c20160a-9469-47e1-8eb4-9ffdbcbfe773/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202020-12-12%20%EC%98%A4%ED%9B%84%2010.33.17.png" width="100" height="100"></p>


<ul>
<li>운영체제의 기능<ul>
<li>하드웨어와 어떻게 인터페이스를 하는가?</li>
<li>사용자와 각종 소프트웨어와 어떻게 기능을 하는가?</li>
</ul>
</li>
</ul>
<ul>
<li><p>운영체제의 목표</p>
<ul>
<li><p>컴퓨터 시스템을 편리하게 사용할 수 있는 환경을 제공</p>
<ul>
<li>운영체제는 동시 사용자/프로그램들이 각각 독자적 컴퓨터에서 수행되는 것 같은 환상을 제공</li>
<li>하드웨어를 직접 다루는 복잡한 부분을 운영체제가 대행</li>
</ul>
</li>
<li><p>컴퓨터 시스템의 <strong>자원을 효율적으로 관리</strong></p>
<ul>
<li>프로세서, 기억장치, 입출력 장치 등의 효율적 관리!<p><img src="https://images.velog.io/images/bn-tw/post/f9f9b3b0-e8e2-4ecb-9ed2-e8576fd98b46/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202020-12-12%20%EC%98%A4%ED%9B%84%2010.52.17.png" width="500" height="400"></p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[관계 대수와 SQL]]></title>
            <link>https://velog.io/@bn-tw/%EA%B4%80%EA%B3%84-%EB%8C%80%EC%88%98%EC%99%80-SQL</link>
            <guid>https://velog.io/@bn-tw/%EA%B4%80%EA%B3%84-%EB%8C%80%EC%88%98%EC%99%80-SQL</guid>
            <pubDate>Thu, 03 Dec 2020 13:49:10 GMT</pubDate>
            <description><![CDATA[<h3 id="관계대수-관계해석">관계대수 관계해석</h3>
<p>관계형 데이터베이스에서는 관계대수와 관계해석이 존재합니다.</p>
<ul>
<li>관계 해석은 원하는 데이터만을 명시하고 어떻게 질의를 해석하는가에 언급을 하지 않는 명시적 언어입니다.</li>
<li>관계 대수는 어떻게 질의를 해석하는가에 언급을 하는 절차적 언어입니다.</li>
</ul>
<p>관계대수는 단일 혹은 두 테이블을 입력 받아 결과로 테이블이 나타나며, 집합 연산 토대로 만들어졌기 때문에 집합 연산에 속합니다.</p>
<p>관계 대수는 셀렉션, 프로젝션, 합집합, 교집합, 차집합, 카디션 곱, 디비젼, 조인이 존재합니다.</p>
<ul>
<li><p>셀렉션은 테이블에서 원하는 데이터를 수평적으로 도출합니다.</p>
</li>
<li><p>프로젝션은 테이블에서 원하는 데이터를 수직적으로 도출합니다.</p>
</li>
<li><p>합집합은 호환 조건이 필요합니다. 호환 조건은 릴레이션의 차수가 같아야 하며, 그에 대응되는 도메인도 같아야 합니다.</p>
</li>
<li><p>교집합, 차집합도 합집합과 같이 호환 조건이 있어야 합니다.</p>
</li>
<li><p>카디션 곱은 R, S 릴레이션이 존재한다면, R, S의 모든 경우의 수를 나타낼 수 있는 연산입니다.</p>
</li>
<li><p>디비젼은 릴레이션 R, S가 존재한다고 하면, 릴레이션 R이 릴레이션의 S의 모든 컬럼을 포함하고 있어야 합니다.</p>
</li>
<li><p>조인은 서로 상호연관이 있는 두 릴레이션을 합칠 수 있습니다. 조인에서는 세타, 동등, 자연 조인이 존재합니다.</p>
<ul>
<li>세타 조인은 연산자(&lt;, &gt;, ,&lt;&gt;, =, &lt;=, =&gt;)을 이용하여 투플을 반환합니다.</li>
<li>동등 조인은 세타 조인에서의 비교 연산자(=)을 사용한 조인입니다.</li>
<li>자연 조인은 동등 조인에서 중복된 속성을 제거한 결과입니다.</li>
</ul>
</li>
</ul>
<h3 id="관계-대수의-한계">관계 대수의 한계</h3>
<p>그러나 관계 대수에서 한계점이 존재합니다.
한계점으로는 정렬 불가, 집단 함수 사용 불가, 산술 연산 불가, 데이터베이스 수정 불가, 중복된 투플의 값을 명시하고 싶을 때, 명시 불가능합니다.</p>
<p>이러한 한계점을 극복하고 위해서 관계 대수를 확장시키며, 투플 기반의 관계 해석을 사용함으로써 SQL이 등장합니다.
관계 대수의 확장된 기능을 보게되면, 3가지로 집단 함수, 그룹화, 외부조인이 존재합니다.</p>
<ul>
<li>집단 함수은 여러 가지 연산을 사용할 수 있습니다.</li>
<li>그룹화는 원하는 목록을 그룹으로 묶어줍니다. 한 부서의 평균 연봉을 알고 싶다고 하면 그룹화와 집단 함수의 AVG를 이용하여 구할 수 있습니다. SUM, MIN, MAX, COUNT 등을 사용할 수 있습니다.</li>
<li>기본 조인의 문제점으로는 상호 연관이 없는 부분에 대해서는 배제됩니다. 이러한 배제되는 부분들의 데이터들도 표현해주기 위해서 외부조인이 사용됩니다. 외부조인에서는 왼쪽외부조인, 오른쪽외부조인, 완전외부조인이 존재합니다.</li>
</ul>
<h3 id="sql">SQL</h3>
<p>기본적으로 SQL은 관계해석과 관계대수의 영향을 받습니다.
SQL은 표준 관게형 데이터베이스입니다. 즉, 데이터베이스와 대화하는 순차적 언어라고 생각합니다.</p>
<p>SQL은 <code>DB</code> - <code>DBMS</code> - <code>대화식SQL</code> 와 <code>내포된SQL</code>로 될 것입니다.</p>
<ul>
<li><code>대화식SQL</code> 주로 DBA가 사용할 것이며, 뷰와 테이블을 다룰 것입니다.</li>
<li><code>내포된SQL</code> 기본적으로 SQL은 순차구조적 문장을 가지고 있기 때문에, 프로그램을 만들 수 없습니다. 프로그램을 만들기 위해서는 선택, 반복, 조건이 필요합니다. 하지만 SQL은 가지고 있지 않습니다. 내포된SQL은 호스트 언어와 GUI를 지원하기 때문에 프로그램을 만들 수 있습니다.</li>
</ul>
<p>SQL은 데이터 정의어, 데이터 조작어, 데이터 제어어를 가지고 있습니다.</p>
<ul>
<li>데이터 정의어는 뷰나 테이블을 나타냅니다. 뷰는 사용자에게 편의를 제공하며 보안의 효율성이 우수한 장점이 존재합니다.</li>
<li>데이터 조작어는 검색, 추가, 삭제, 수정 등을 조작할 수 있으며, 프로그래머가 CRUD를 주로 구현할 것입니다.</li>
<li>데이터 제어어는 객체 무결성 제약조건으로 데이터 불일치가 되는 현상을 제어하는 역할을 할 수 있습니다.</li>
</ul>
<p>데이터 정의어는 CREATE/DROP - DOMAIN, VIEW, TABLE, INDEX를 삭제 및 생성을 합니다.
ALTER TABLE로는 테이블의 구조를 변경, 컬럼 추가, 삭제가 가능합니다.</p>
<p>무결성 제약조건은 테이블 생성 시 제약 조건을 사용해서 입력하는 자료에 대해서 제약, 규칙을 정할 수 있습니다. 만약 제약에 배반된다면 오류가 나타납니다.
제약 조건을 정리하게 되면, 권한이 부여된 계정이나 사람만이 접근이 가능하고, 정확하고 완전한 데이터가 저장되어 있는 상태입니다.
무결성을 보장함으로 데이터 불일치 및 중복 저장 등을 해결해줄 수 있습니다.</p>
<p>제약 조건으로는 <code>NOT NULL</code> <code>UNIQUE</code> <code>PRIMARY KEY</code> <code>FOREIGN KEY</code> <code>CHECK</code>가 존재합니다.
<code>FOREIGN KEY</code> 옵션으로는
<code>ON DELETE NO ACTION</code> 오류 발생시 롤백을 합니다.
<code>ON DELETE CASCADE</code> 부모 테이블에서 삭제 시 참조 테이블도 삭제
<code>ON DELETE SET NULL</code> 부모 테이블에서 삭제 시 NULL
<code>ON DELETE SET DEFAULT</code> 부모 테이블에서 삭제 시 기본 값
<code>ON DELETE RESTRICT</code> 자식 테이블에 데이터가 있다면 부모 테이블에서 삭제 불가능</p>
<p>기본적인 SQL을 보도록 하면,</p>
<h3 id="select">SELECT</h3>
<pre><code>SELECT 칼럼 FROM
WHERE 조건
GROUP BY 칼럼(들)
HAVING 조건
ORDER BY 칼럼</code></pre><p>SELECT에서 *은 모든 컬럼에 대해서 검색을 하며 DISINCT는 중복을 제거합니다.
FROM은 테이블을 쓸 수 있으면 as 키워드로 별칭을 지을 수 있습니다.
WHERE은 조건을 걸어서 필요한 정보를 찾을 수 있습니다. LIKE, BETWEEN AND, IN, OR, IS NULL 등을 사용할 수 있습니다.
GROUP BY은 그룹화를 할 수 있습니다.
HAVING은 그룹화된 결과에 filtering을 할 수 있습니다.  SUM, MIN, MAX, AVG와 같은 집계 함수와 잘 어울립니다. 
ORDER BY은 정렬을 사용할 수 있습니다. AES, DESC을 사용할 수 있습니다.
JOIN은 두 개 이상의 데이블에 대해 연관된 튜블끼리 조인합니다.
정규화를 할 수 있기 때문에 JOIN을 사용할 수 있는 것입니다.</p>
<h3 id="insert">INSERT</h3>
<pre><code>INSERT INTO 테이블
(칼럼, ...)
VALUES(넣을 값)</code></pre><p>INSERT은 한 테이블에 대해서 튜플을 삽입시킵니다.</p>
<h3 id="delete">DELETE</h3>
<pre><code>DELETE FROM 테이블
WHERE 조건</code></pre><p>DELETE는 한 테이블에서 튜플을 삭제합니다.
WHERE 조건을 사용하여 선태적으로 튜플을 삭제할 수 있습니다.
만약 WHERE을 사용하지 않는다면, 테이블 내 모든 데이터가 삭제되므로 조심해야 합니다.</p>
<p>참조되는 테이블에 대해서 DELETE을 하면 참조무결성 위배되지만
참조하는 테이블에 대해서는 위배하지 않습니다.
참조하는 테이블은 외래키를 가지고 있는 테이블이라고 생각하면 됩니다.</p>
<h3 id="update">UPDATE</h3>
<pre><code>UPDATE 테이블
SET (칼럼=식,...)
WHERE 조건</code></pre><p>UPDATE는 한 테이블에서 튜플의 칼럼 값을 수정할 수 있습니다.
기본키나 외래키에 속한 칼럼에 대해서 수행시 참조 무결성 제외됩니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[약수의 합]]></title>
            <link>https://velog.io/@bn-tw/%EC%95%BD%EC%88%98%EC%9D%98-%ED%95%A9</link>
            <guid>https://velog.io/@bn-tw/%EC%95%BD%EC%88%98%EC%9D%98-%ED%95%A9</guid>
            <pubDate>Sat, 28 Nov 2020 10:59:13 GMT</pubDate>
            <description><![CDATA[<h2 id="문제">문제</h2>
<p><a href="https://programmers.co.kr/learn/courses/30/lessons/12928">https://programmers.co.kr/learn/courses/30/lessons/12928</a></p>
<h2 id="추상화">추상화</h2>
<p><code>반복문을 통해 1부터 하나씩 나누어 떨어지면 약수</code>
<code>n의 수만큼이 아닌 반만해도 약수를 구할 수 있다.</code></p>
<h2 id="코드">코드</h2>
<pre><code class="language-c">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;

using namespace std;

int solution(int n) {
    int answer = 0;
    for(int i=1; i&lt;=n/2 ; i++){
        if(n%i==0) {
            answer += i;
        }
    }
    return answer+n;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[서울에서 김서방 찾기]]></title>
            <link>https://velog.io/@bn-tw/%EC%84%9C%EC%9A%B8%EC%97%90%EC%84%9C-%EA%B9%80%EC%84%9C%EB%B0%A9-%EC%B0%BE%EA%B8%B0</link>
            <guid>https://velog.io/@bn-tw/%EC%84%9C%EC%9A%B8%EC%97%90%EC%84%9C-%EA%B9%80%EC%84%9C%EB%B0%A9-%EC%B0%BE%EA%B8%B0</guid>
            <pubDate>Sat, 28 Nov 2020 10:56:15 GMT</pubDate>
            <description><![CDATA[<h2 id="문제">문제</h2>
<p><a href="https://programmers.co.kr/learn/courses/30/lessons/12919">https://programmers.co.kr/learn/courses/30/lessons/12919</a></p>
<h2 id="추상화">추상화</h2>
<p><code>반복문을 활용하여 찾기</code></p>
<h2 id="코드">코드</h2>
<pre><code class="language-c">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;

using namespace std;

string solution(vector&lt;string&gt; seoul) {
    string answer = &quot;&quot;;
    string loc;
    for(int i=0; i&lt;seoul.size(); i++){
        if(seoul[i]==&quot;Kim&quot;) {
            loc = to_string(i);
            answer.append(&quot;김서방은 &quot;+loc+&quot;에 있다&quot;);
        }
    }
    return answer;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[수박수박수박수박수박수?]]></title>
            <link>https://velog.io/@bn-tw/%EC%88%98%EB%B0%95%EC%88%98%EB%B0%95%EC%88%98%EB%B0%95%EC%88%98%EB%B0%95%EC%88%98%EB%B0%95%EC%88%98</link>
            <guid>https://velog.io/@bn-tw/%EC%88%98%EB%B0%95%EC%88%98%EB%B0%95%EC%88%98%EB%B0%95%EC%88%98%EB%B0%95%EC%88%98%EB%B0%95%EC%88%98</guid>
            <pubDate>Sat, 28 Nov 2020 10:54:48 GMT</pubDate>
            <description><![CDATA[<h2 id="문제">문제</h2>
<p><a href="https://programmers.co.kr/learn/courses/30/lessons/12922">https://programmers.co.kr/learn/courses/30/lessons/12922</a></p>
<h2 id="추상화">추상화</h2>
<p><code>파라미터가 짝수, 홀수의 경우로 생각</code>
<code>파라미터을 2로 나눈 몫의 값의 개수만큼 수박의 개수</code></p>
<h2 id="코드">코드</h2>
<pre><code class="language-c">#include &lt;bits/stdc++.h&gt;

using namespace std;

string solution(int n) {
    string answer = &quot;&quot;;
    for(int i=0; i&lt;n/2; i++){
        answer+=&quot;수박&quot;;
    }
    if(n%2!=0) answer+=&quot;수&quot;;
    return answer;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[두 정수 사이의 합]]></title>
            <link>https://velog.io/@bn-tw/%EB%91%90-%EC%A0%95%EC%88%98-%EC%82%AC%EC%9D%B4%EC%9D%98-%ED%95%A9</link>
            <guid>https://velog.io/@bn-tw/%EB%91%90-%EC%A0%95%EC%88%98-%EC%82%AC%EC%9D%B4%EC%9D%98-%ED%95%A9</guid>
            <pubDate>Sat, 28 Nov 2020 10:52:04 GMT</pubDate>
            <description><![CDATA[<h2 id="문제">문제</h2>
<p><a href="https://programmers.co.kr/learn/courses/30/lessons/12912">https://programmers.co.kr/learn/courses/30/lessons/12912</a></p>
<h2 id="추상화">추상화</h2>
<p><code>a와 b 사이에 속한 모든 정수의 합을 리턴하는 것이기에 반복문을 이용</code>
<code>제한 조건의 a, b가 같을 경우</code>
<code>a, b 둘중 어떤 것이 큰지</code></p>
<h2 id="코드">코드</h2>
<pre><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;stdbool.h&gt;
#include &lt;stdlib.h&gt;

long long solution(int a, int b) {
    long long answer = 0;
    if(a == b) return a;
    if(a&gt;b){
        for(int i=b; i&lt;a+1; i++) answer+=i;
    } else{
        for(int i=a; i&lt;b+1; i++) answer +=i;   
    }
    return answer;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[if(kakao) 2020 Nonce 그게 뭔데?]]></title>
            <link>https://velog.io/@bn-tw/ifkakao-2020-Nonce-%EA%B7%B8%EA%B2%8C-%EB%AD%94%EB%8D%B0</link>
            <guid>https://velog.io/@bn-tw/ifkakao-2020-Nonce-%EA%B7%B8%EA%B2%8C-%EB%AD%94%EB%8D%B0</guid>
            <pubDate>Sun, 22 Nov 2020 11:17:35 GMT</pubDate>
            <description><![CDATA[<p><code>Nonce</code> 블록체인 서비스를 개발하는데 있어서 중요한 역할을 합니다.</p>
<h2 id="논스는-왜-필요할까-">논스는 왜 필요할까 ?</h2>
<p>논스를 알기 위해서 <code>Tx</code>을 알아야 합니다.
<code>Tx</code> : 일종의 사용자의 요청(송금을 한다. 블록체인 위에서 동작하는 스마트 컨택트를 실행하는데 사용)
<code>Nonce</code> : 대기표라 생각할 수 있습니다. Nonce는 Tx를 처리하기 위해 순서를 정해줍니다.</p>
<pre><code>1. &quot;철수에게 200원 송금 - 2&quot;
2. &quot;영희에게 100원 송금 - 1&quot;
3. &quot;릭에게 10000원 송금 - 3&quot;
4. &quot;영희에게 100원 송금 - 4&quot;</code></pre><p>각각의 트랜잭션의 논스를 지정하게 되면, <code>2번</code> <code>1번</code> <code>3번</code> <code>4번</code> 순으로 진행될 것입니다.</p>
<h3 id="nonce가-없다면-">Nonce가 없다면 ?</h3>
<p><img src="https://images.velog.io/images/bn-tw/post/e399d23c-537b-4900-9e3e-5ebf9108fb5d/image.png" alt="">
Klaytn에서는 노드가 서로가 연결되어 있습니다. 연결된 노드에게 Tx를 전파합니다.
노드가 Tx를 담아 블록을 생성하는데 어떤 노드에서 블록을 생성하는지 모르니 최대한 Tx를 모든 노드에게 전파해야만 빠르게 Tx가 처리 될 수 있습니다.
블록체인은 일종의 글로벌 디비입니다. Tx를 담아 블록을 생성하면 Tx의 내용이 디비에 반영됩니다.  </p>
<p>사용자의 어떤 요청이 A노드가 받게 되면, 노드는 연결된 B, C에게 Tx를 전파합니다.
<img src="https://images.velog.io/images/bn-tw/post/c39ea217-3d41-4e8c-892e-936276c60952/image.png" alt=""></p>
<p>노드는 Tx를 받게되면, 다시 서로 연결 되어 있는 B, C에게 전달합니다.
<img src="https://images.velog.io/images/bn-tw/post/a7b5c134-ea2b-49bd-895a-8681c4d362a5/image.png" alt=""></p>
<p>모든 노드는 같은 Tx를 공유하게 되는데, 이 때 각 노드들이 블록을 한 번씩 생성한다면, 동일한 Tx가 3번 반영되게 됩니다.
노드는 이미 Tx가 처리된건지 안된건지 알 수가 없기 때문에 모든 블록에 Tx를 적용하여 생성하게 됩니다.</p>
<pre><code>1. &quot;철수에게 200원 송금&quot;
2. &quot;영희에게 100원 송금&quot;
3. &quot;릭에게 10000원 송금&quot;
4. &quot;영희에게 100원 송금&quot;</code></pre><p>만일 <code>nonce</code>가 없다면 <code>2번</code> <code>4번</code>은 내용이 같이 때문에 구분할 수 없습니다. 모두 처리해줘야 합니다.
<code>nonce</code>는 순서를 정해주고 이미 처리된 Tx인지 아닌지 구분해주는 역할을 할 수 있습니다.</p>
<h2 id="논스-법칙">논스 법칙</h2>
<p><code>nonce</code>에는 크게 2가지 법칙이 적용됩니다.</p>
<h3 id="domino-rule">Domino Rule</h3>
<p>어렸을 때 한 번씩 했던 도미노를 생각해보겠습니다.
1번이 쓰러지면 2번이 쓰러지고 ... 차례대로 쓰러질 것입니다.
만약 3번째가 없다면, 2번째까지만 쓰러질 것입니다.</p>
<p><code>Tx</code>도 똑같이 3번 <code>nonce</code>가 적용된 Tx가 없다면 4번 논스가 적용된 Tx는 처리되지 않을 것입니다.</p>
<h3 id="unique-rule">Unique Rule</h3>
<p>모든 <code>nonce</code>는 유일해야 합니다.
동일한 <code>nonce</code>을 사용하는 Tx가 있다면 한 Tx는 처리되지 않을 것입니다.
블록체인에서 Tx를 생성할 때 동일한 <code>nonce</code>들을 사용해서 만들거나 이미 사용한 <code>nonce</code>을 재사용하면 안됩니다.</p>
<h2 id="어떻게-구현-할까-">어떻게 구현 할까 ?</h2>
<p><img src="https://images.velog.io/images/bn-tw/post/b5f7db8d-5c5f-4341-adfe-6db56ecb8f9b/image.png" alt="">
클레이튼은 사용자가 사용할 수 있는 <code>nonce</code> 이미 알고 있습니다.
Tx를 만들기 전에 클레이튼에게 논스를 묻고 응답 받은 <code>nonce</code>을 Tx에 적용하여 네트워크에 보내게됩니다.
그 후에, 반영이 되었는지 확인해야 합니다.
반영 확인을 하는 이유는 만일 Tx를 반영되지 않는 상태에서 <code>nonce</code>을 다시 묻게 된다면 동일한 <code>nonce</code>을 받게 되어 <code>Unique Rule</code>에 위배 됩니다.</p>
<p>클레이튼은 다른 블록체인에 비해 블록을 빠르게 만듭니다.(1초에 1블록)
논스를 묻고 확인하는 과정을 갖는다면 모든 Tx를 1초의 시간이 걸리게 될것입니다.
100개의 요청을 한다면 운이 좋으면, 한 2분쯤 걸릴 것입니다.</p>
<h3 id="좀-더-빠른-방법">좀 더 빠른 방법</h3>
<p><code>nonce</code>을 묻는 과정을 제외하고 서비스 내부에서 <code>nonce</code>을 저장하는 변수를 두는 것입니다.
Tx는 <code>nonce</code>을 저장한 변수로부터 <code>nonce</code>을 읽습니다.
그리고 해당하는 <code>nonce</code>을 Tx 적용 한 뒤 전송해줍니다.
다음 요청을 처리하기 위해서 <code>nonce</code>의 값을 업데이트해줍니다.
이후 계속 반복을 하게 됩니다.</p>
<h3 id="스케일-아웃">스케일 아웃</h3>
<p>일반적인 서비스에서는 많은 사용자의 처리하기 위해서 <code>스케일 아웃</code>을 사용합니다.</p>
<p><img src="https://images.velog.io/images/bn-tw/post/79f65036-afe3-4819-b123-9371e4a0c647/image.png" alt=""></p>
<p>하지만 약간의 문제 발생합니다.
서버를 2개 띄운다고 발생하면,  </p>
<p><img src="https://images.velog.io/images/bn-tw/post/570e7e57-5f9e-4020-9a52-9005290354f6/image.png" alt=""></p>
<p>날리고 논스값을 업데이트 할 것이며, 계속해서 진행할 것입니다.</p>
<p><img src="https://images.velog.io/images/bn-tw/post/b6388295-0597-4511-9a7d-19903bdda6c2/image.png" alt=""></p>
<p><code>Unique Rule</code>이 발생하게 됩니다.</p>
<p><code>공용 저장소</code>가 필요합니다.</p>
<p><img src="https://images.velog.io/images/bn-tw/post/82e6e724-0812-4103-a75c-c55572f38d23/image.png" alt=""></p>
<p><code>공용 저장소</code>를 사용하기 때문에 <code>Unique Rule</code>에 위배되지 않고 진행할 수 있습니다.</p>
<h3 id="데이터-레이스">데이터 레이스</h3>
<p>두 서버가 동시에<code>공용 저장소</code> 에 접근하면 <code>데이터 레이스</code>라는 문제가 발생합니다.
두 서버가 <code>공용 저장소</code> 동시에 접근하면 동일한 <code>nonce</code>을 얻게 되어 <code>Unique Rule</code>에 위배됩니다.</p>
<p>위의 문제를 해결하기 위해서 <code>Redis INCR 명령</code>을 사용
값을 순차적으로 증가시키고 1을 반환해줍니다.
key값을 해당하는 변수를 1씩 증가시켜줍니다.
이 명령을 atomic 해서 순차적으로 처리해줍니다.</p>
<h3 id="tx처리가-실패한다면">Tx처리가 실패한다면?</h3>
<p>서버가 죽어서 <code>nonce</code>가 1인 것이 실패하고 다른 서버가 <code>nonce</code>가 2인 것을 보내게 된다면 <code>Domino Rule</code>에 위배됩니다.
그래서 <code>실패한 Nonce를 재활용</code> 하게 됩니다.</p>
<p><img src="https://images.velog.io/images/bn-tw/post/59f2e55d-ccc4-4a91-8d20-13e738aa83e4/image.png" alt="">
<code>우선순위 큐</code> 를 사용하여 실패한 <code>nonce</code>를 저장합니다.
실패한 <code>nonce</code>가 있다면 우선순위 큐에서 뽑아서 사용하고 우선순위 큐가 비어있다면 <code>INCR 명령</code>을 사용합니다.</p>
<p><code>우선순위 큐</code>는 레디스의 Sorted Sets을 이용하면 쉽게 구현이 가능합니다.</p>
<h2 id="더-쉬운-방법">더 쉬운 방법</h2>
<p>문제가 생기는 이유들은 Tx를 서비스에서 생성하고 관리하기 때문입니다
(<a href="https://if.kakao.com/session/45">https://if.kakao.com/session/45</a>)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[if(kakao) 2020 딥러닝으로 어려운 요가 자세 잡아드립니다.]]></title>
            <link>https://velog.io/@bn-tw/ifkakao-2020-%EB%94%A5%EB%9F%AC%EB%8B%9D%EC%9C%BC%EB%A1%9C-%EC%96%B4%EB%A0%A4%EC%9A%B4-%EC%9A%94%EA%B0%80-%EC%9E%90%EC%84%B8-%EC%9E%A1%EC%95%84%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4</link>
            <guid>https://velog.io/@bn-tw/ifkakao-2020-%EB%94%A5%EB%9F%AC%EB%8B%9D%EC%9C%BC%EB%A1%9C-%EC%96%B4%EB%A0%A4%EC%9A%B4-%EC%9A%94%EA%B0%80-%EC%9E%90%EC%84%B8-%EC%9E%A1%EC%95%84%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4</guid>
            <pubDate>Sun, 22 Nov 2020 10:13:52 GMT</pubDate>
            <description><![CDATA[<h2 id="pose-estimation이란-">Pose Estimation이란 ?</h2>
<p><code>Pose Estimation</code> 은 <code>Keypoint detection</code>, <code>자세 인식</code> 이라고 불립니다.
관절과 같은 사람의 주요 신체부위 keyPoint을 찾는 것입니다.</p>
<p><img src="https://images.velog.io/images/bn-tw/post/c2d347ba-b961-416e-8984-dfdbceb39c76/image.png" alt="">
위 그림은 <code>Pose Estimation</code>이 keypoint를 찾아낸 위치입니다.</p>
<h3 id="적용">적용</h3>
<p><code>Fitness</code> : 운동에서 코칭이 가능합니다.
<code>Entertainment</code> : 게임에서 나의 동작과 게임의 동작이 얼마나 같은지 확인이 가능합니다.
<code>Rehabilitation</code> : 동작에 대한 피드백은 동적 재활에 사용성이 있음
<code>Surveillance</code> : 공공장소의 안전을 위해 설치된 카메라를 이용해서 사람이 어디에서 어디로 가는지 파악 가능
<code>Safety</code> : 어린아이나 거동이 어려운 분들이 위급한 상황일 때도 캡처할 수 있음
<code>In-Store</code> : 미국 아마존 매장에서는 사람의 움직임을 트래킹하여 누가 어떤 물건을 누가 잡는지, 사람 간의 상호작용이 어떻게 되는지 분석하여 자동 결제 시스템을 개발함.</p>
<h2 id="pose-estimation-with-deep-learning-맛보기">Pose Estimation with Deep Learning 맛보기</h2>
<h3 id="deep-learning-basic-cat-vs-dog">Deep Learning Basic: Cat vs Dog</h3>
<pre><code class="language-python">def build_cat_or_dog(cats, dogs):
  train([cats, dogs], [0,1])

def cat_or_dog(image):
  answer = network(image)

  return answer</code></pre>
<p><code>build_cat_or_dog</code> 개 혹은 고양이의 이미지를 입력을 받아 해당 이미지가 고양이와 가까우면 0, 개와 가까우면 1을 리턴해주는 네트워크
<code>cat_or_dog</code> 이미지를 넣어주면 출력 값으로 이 이미지가 고양이와 개 둘중에 어디에 가까운지 0 혹은 1을 리턴해줍니다.</p>
<h3 id="pose-estimation-data-annotation">Pose Estimation: Data, Annotation</h3>
<p>위의 Cat vs Dog와 0과 1을 input으로 넣어주었는데 pose estimation은 사람의 포즈를 input으로 넣어줘야 합니다.<br>사람의 관절을 사람이 하나하나 마킹을 해서 데이터를 만들어야 합니다.
마킹한 것들을 keypoint라고 부릅니다.</p>
<h3 id="key-point로-pose-estimation-모델에-만들-때-어떤-형태로">key point로 pose estimation 모델에 만들 때 어떤 형태로?</h3>
<p><code>Keypoint</code> : 신체 중요 부위
<code>이미지 상에서의 좌표</code> (x, y)
<code>총 17개의 Keypoint</code>
<img src="https://images.velog.io/images/bn-tw/post/72681bd6-c6ad-4cb6-b61c-52caa5724653/image.png" alt=""></p>
<h3 id="deep-learning-cat_or_dog-vs-pose-estimation">Deep Learning: Cat_or_dog vs Pose Estimation</h3>
<pre><code class="language-python">def build_pose(images, keypoints):
  network.train(images, keypoints)

def pose(image):
  keypoints = network(image)
  # [x1, y1, ..., xk, yk]

  return keypoints</code></pre>
<p>개 고양이 처럼 0과 1 두개의 숫자를 맞추는 것이 아니라 34개의 (x, y) 17쌍의 문제를 맞추는 것입니다.
<code>build_pose</code> keypoints가 변수가 34개의 숫자를 배열의 배열로 가지게 됩니다.
<code>pose</code> 이미지를 보고 34개의 좌표 값을 맞추게 됩니다.</p>
<p>이렇게 모델이 직접 좌표 값을 맞추는 방식은 <code>regression</code> 방식이라고 부릅니다.</p>
<h3 id="deep-learning-heatmap">Deep Learning: Heatmap</h3>
<p>다른 방식은 Heatmap도 있습니다.  </p>
<p>34개의 x, y keypoint를 맞추라는 대신, keypoint의 heatmap을 맞추는 방식입니다.
heatmap은 숫자의 범례의 따라 다양한 색으로 데이터를 표현하는 방식입니다.
keypoint의 (x, y) 중앙으로 기준 삼아서 가장 큰 값을 매핑한 적절한 분포를 만들고 이 값을 기준으로 3차원, 2차원으로 표현했을 때 아래의 그림과 같습니다.
<img src="https://images.velog.io/images/bn-tw/post/7825eb95-2014-4827-95af-478b323c2a53/image.png" alt="">
<img src="https://images.velog.io/images/bn-tw/post/07c9cef6-a09a-406b-9605-8e12454dcba7/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/bn-tw/post/e69377fc-2027-4d26-95a0-8df3bb72862e/image.png" alt="">
어깨 위에서 heatmap를 그려보면 위 그림과 같습니다.
이 값을 실제로는 1.0 ~ 0.0 까지 부러럽게 표현한 2차원 배열의 heatmap입니다.
heatmap 입력 값을 사용하게 됩니다.
keypoint마다 만들기 때문에 총 17개가 만들어지게 됩니다.
<img src="https://images.velog.io/images/bn-tw/post/a060466b-506d-4acf-8dca-e606dd5d74bc/image.png" alt=""></p>
<pre><code class="language-python">def build_pose(images, keypoints):
  heatmaps = convert(keypoints)
  network.train(images, heatmaps)</code></pre>
<p>input에서는 keypoints가 heatmap으로 변환 되는 convert 함수가 더 필요합니다.</p>
<pre><code class="language-python">def pose(image):
  heatmaps = network(image)
  keypoints = find_keypoint_from(heatmaps)

  return keypoints</code></pre>
<p>딥러닝으로 학습된 네트워크를 사용할 때도 네트워크가 만들어내는 heatmap를 keypoint로 변환하는 과정이 필요하게 됩니다.</p>
<p>지금까지 본 방식이 heatmap 방식으로 pose estimation 한다고 말합니다.</p>
<p>현재까지는 한 사람으로 진행하였지만, 사람이 여러 명이 있다고 하면, 이미지를 잘라서 한 명씩 따로따로 keypoint를 찾는 것입니다.
<img src="https://images.velog.io/images/bn-tw/post/1e700ad8-7e2d-4790-be8c-8aab536a73d7/image.png" alt="">
좌측의 서퍼와 물구나무한 사람을 각각 네트워크에 넣는다고 하면 2번씩 반복하게 되고, 2명의 대해서 keypoint를 찾아낼 것입니다.  </p>
<p>사람을 찾아내는 별도의 딥러닝 네트워크를 사용할 것입니다.
사람을 찾는 네트워크와 keypoint를 찾는 네트워크 2단계로 될 것이며, 이 방식을 <code>Top-down</code> 방식이라고 부릅니다. </p>
<p><code>Bottom up</code> 방식은 이미지와는 별개로 keypoint를 먼저 다찾아 내고 연결관계를 찾아냅니다.
연결 도중에 다른 관절끼리의 연결이 생길 수 있는 문제점이 생깁니다.</p>
<h3 id="deep-learning-simple-baseline">Deep Learning: Simple Baseline</h3>
<h4 id="pose-model-구조">Pose model 구조</h4>
<p><code>Top-down</code> 방식 중에서 간단하면서 강력한 성능을 가진 <code>simple baseline</code></p>
<p><code>ResNet + DeConv = Heatmap</code></p>
<p>ResNet을 사용해서 만든 picture을 DeConv layer을 사용하여 heatmap을 만들어 냅니다.
<img src="https://images.velog.io/images/bn-tw/post/ef63dda0-e40b-4bed-a161-aa5b51198526/image.png" alt=""></p>
<p>왼쪽의 RestNet 오른쪽의 3개의 DeConv layer
DeConv layer은 ResNet이 만든 picture을 확대시켜 Heatmap의 형태로 변환해주는 부분의 큰 역할을 담당실제 사용은 간단합니다.</p>
<h2 id="pose-estimation-in-kakaobrain">Pose Estimation in kakaobrain</h2>
<p>확실하게 pose estimation이 가능
<code>kakao developers</code>에서 인증키만 신청해서 받으면 <code>pose api</code>를 받아볼 수 있습니다.</p>
<p>(<a href="https://if.kakao.com/session/66">https://if.kakao.com/session/66</a>)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Basic Machine/Deep Learning #3]]></title>
            <link>https://velog.io/@bn-tw/Basic-MachineDeep-Learning-3</link>
            <guid>https://velog.io/@bn-tw/Basic-MachineDeep-Learning-3</guid>
            <pubDate>Thu, 19 Nov 2020 15:33:36 GMT</pubDate>
            <description><![CDATA[<h2 id="how-to-minimize-cost">How to minimize cost</h2>
<p><code>H(x) = Wx + b</code></p>
<ul>
<li>cost값을 가장 작게 찾을 수 있는 W, b를 우리가 가지고 있는 데이터로 구하는 것이 Linear Regression입니다.</li>
<li>설명을 위해서 <code>H(x) = Wx</code>로 설명하겠습니다.</li>
</ul>
<p><img src="https://images.velog.io/images/bn-tw/post/6772d80d-eefd-43ff-8f50-d82e95ccb0f0/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202020-11-19%20%EC%98%A4%ED%9B%84%2011.58.45.png" alt=""></p>
<table>
<thead>
<tr>
<th>x</th>
<th>y</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>2</td>
<td>2</td>
</tr>
<tr>
<td>3</td>
<td>3</td>
</tr>
</tbody></table>
<p><img src="https://images.velog.io/images/bn-tw/post/bdf27e89-37a5-4cc5-8194-cde90f38d48f/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202020-11-20%20%EC%98%A4%EC%A0%84%2012.04.06.png" alt=""></p>
<ul>
<li>W = 2, cost(W) = 4.67입니다.</li>
<li>위의 3개의 값을 이용해서 그래프를 그려보면 아래의 그림을 얻을 수 있습니다.
<img src="https://images.velog.io/images/bn-tw/post/062c8f5d-8379-4c02-b2eb-1b76cb16673b/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202020-11-20%20%EC%98%A4%EC%A0%84%2012.05.55.png" alt=""></li>
<li>목표는 여기서 cost가 최소화 되는 점을 찾는 것입니다.</li>
<li>그래프를 보게 되면 눈으로 쉽게 찾을 수 있지만, 기계적으로 찾아야 합니다.</li>
</ul>
<h3 id="gradient-descent-algorithm">Gradient descent algorithm</h3>
<ul>
<li><code>gradient descent algorithm</code>을 이용합니다.</li>
<li>경사를 따라 내려가는 알고리즘입니다.</li>
<li>주어진 cost function을 minimize하는데 많이 사용합니다.</li>
<li>아무 지점에서 시작을 할 수 있습니다.</li>
<li>W값을 조금 변경하면서 cost를 줄일 수 있습니다.</li>
<li>그 경사도를 계속해서 과정을 반복하게 됩니다.</li>
<li>어떤 지점에서 시작하던간에(예외도 존재하지만) 최저점에 도달할 수 있습니다.</li>
<li>경사도는 수학의 미분을 이용해서 구하게 됩니다.</li>
<li>미분을 하기 쉽게 적용하기 위해서 m값에 2를 곱합니다.
<img src="https://images.velog.io/images/bn-tw/post/0a63aa35-953c-49b8-b5ca-7d1bf7fb19ea/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202020-11-20%20%EC%98%A4%EC%A0%84%2012.19.06.png" alt=""></li>
<li>공식적인 알고리즘은 현재의 W값에 𝛂을 0.1이라고 하면 cost함수를 미분한 것(기울기) 곱해서 빼주면 됩니다.
<img src="https://images.velog.io/images/bn-tw/post/8120efac-ee69-4bdd-8d31-dca2f05798fd/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202020-11-20%20%EC%98%A4%EC%A0%84%2012.20.00.png" alt="">
<img src="https://images.velog.io/images/bn-tw/post/e67a3438-6f81-46af-8334-b137dde8ecbb/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202020-11-20%20%EC%98%A4%EC%A0%84%2012.26.27.png" alt=""></li>
<li>여러 번 실행시키면서 W가 변화되면서, cost를 최소화하는 것을 구할 수 있습니다.<blockquote>
<ol>
<li><code>gradient descent algorithm</code>은 하나의 수식이며, 기계적으로 적용만시키면, 바로 cost function을 최소화하는 w를 구할 수 있으며, 그것이 <code>Linear Regression</code>의 핵심 학습 과정을 통해서 모델을 만들 수 있습니다.</li>
<li>Cost Function을 설계하였을 때 모양이 Convex function이 되는지 확인해봐야합니다.</li>
</ol>
</blockquote>
</li>
</ul>
<blockquote>
<p>배운 이론을 tensorflow 실습
<a href="https://www.youtube.com/watch?v=Y0EF9VqRuEA&amp;list=PLlMkM4tgfjnLSOjrEJN31gZATbcj_MpUm&amp;index=7">https://www.youtube.com/watch?v=Y0EF9VqRuEA&amp;list=PLlMkM4tgfjnLSOjrEJN31gZATbcj_MpUm&amp;index=7</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Basic Machine/Deep Learning #2]]></title>
            <link>https://velog.io/@bn-tw/Basic-MachineDeep-Learning-2</link>
            <guid>https://velog.io/@bn-tw/Basic-MachineDeep-Learning-2</guid>
            <pubDate>Wed, 18 Nov 2020 11:20:51 GMT</pubDate>
            <description><![CDATA[<h2 id="linear-regression">Linear Regression</h2>
<ul>
<li><code>Predicting exam score: regression</code>
어떤 학생이 몇 시간정도 공부를 했더니 얼마정도의 성적이 나왔다라는 데이터를 가지고 <code>Supervised learning</code> 한다고 진행.</li>
</ul>
<table>
<thead>
<tr>
<th>x(hours)</th>
<th>y(score)</th>
</tr>
</thead>
<tbody><tr>
<td>10</td>
<td>90</td>
</tr>
<tr>
<td>9</td>
<td>80</td>
</tr>
<tr>
<td>3</td>
<td>50</td>
</tr>
<tr>
<td>2</td>
<td>30</td>
</tr>
</tbody></table>
<ul>
<li>0~100점의 범위를 예측하는 것이기 때문에 이런 형태는 supervised learning의 <code>regression</code>이라 부릅니다.</li>
<li>위의 데이터를 가지고 학습을 시키는데 이 과정을 <code>training</code>이라 부릅니다.</li>
<li>위의 표는 <code>training data</code>라고 부르면 됩니다.</li>
<li>regression모델이 데이터를 학습을 끝나고 모델이 만들어지게 됩니다.</li>
<li>학생이 7시간 정도 공부를 했는데 인공지능에게 물어보면 65점도 받을 수 있겠구나 예측을 할 것입니다.</li>
</ul>
<h3 id="regression-data">Regression (data)</h3>
<p><img src="https://images.velog.io/images/bn-tw/post/4ed8e84d-f47c-4b15-960e-19825185588a/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202020-11-18%20%EC%98%A4%ED%9B%84%207.51.17.png" alt=""></p>
<ul>
<li>regression의 모델을 학습한다는 것은 어떤 하나의 가설을 세울 필요가 있습니다.</li>
<li><code>Linear</code>한 모델이 우리 데이터에 맞을 것이다라고 가설을 세우는 것이 <code>Linear Regression</code>입니다.</li>
<li><code>Linear Regression</code> 세상에 있는 많은 데이터, 현상들이 Linear한 경우로 드러나는 것이 많이 존재합니다.</li>
<li>Linear하게 가설을 세운다는 것은 잘 맞는 선을 찾는다고 생각할 수 있습니다. 어떤 것이 이 데이터에 잘 맞는 선일까? 선을 찾는 것을 학습한다고 생각할 수 있습니다.<img src="https://images.velog.io/images/bn-tw/post/939911db-957c-4ec6-88fd-a5a39ab39a5d/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202020-11-18%20%EC%98%A4%ED%9B%84%207.56.37.png" alt=""></li>
</ul>
<h3 id="cost-function">Cost Function</h3>
<ul>
<li>선들 중에서 가장 잘 맞는 선이 무엇인지 찾아야 합니다.</li>
<li><code>H(x) = Wx + b</code><ul>
<li><strong>파랑</strong> H(x) = 1 * x + 0</li>
<li><strong>노랑</strong> H(x) = 0.5 * x + 2</li>
</ul>
</li>
<li>두 선 중에서 어떤 선이 더 좋은지 찾아야 합니다.</li>
<li>실제 데이터와 가설들과의 점들과 거리를 비교합니다.<ul>
<li>거리가 멀면 나쁘고, 가까우면 좋습니다.
<img src="https://images.velog.io/images/bn-tw/post/8f5b29d6-e460-41a4-86ea-7cf13d6c6b54/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202020-11-18%20%EC%98%A4%ED%9B%84%208.01.36.png" alt=""></li>
<li><code>Linear Regression</code>에서는 거리를 측정하는 것을 <code>Cost funcion</code> or <code>Loss function</code>이라 부릅니다.</li>
<li>우리가 세운 가설과 실제 데이터가 얼마나 다른가를 나타내게 됩니다.</li>
<li>기본적인 계산은 차이를 계산하는 것입니다. </li>
<li>(H(x) - y) <sup>2</sup></li>
<li>제곱을 하게되면 일정하게 차이를 양수로 표현해주면 차이가 클 때 패널티를 많이 주게 되면서, 차이를 작게 만들 수 있는 중요한 값을 나타낼 수 있습니다. </li>
<li>표현을 하게 되면 아래와 같습니다.
<img src="https://images.velog.io/images/bn-tw/post/06c1cea5-a49a-48ab-ab4e-4c4125dc31c9/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202020-11-18%20%EC%98%A4%ED%9B%84%208.08.35.png" alt=""></li>
<li>가장 작은 값을 갖는 W, b를 구하는 것이 Linear Regression의 학습입니다.
<img src="https://images.velog.io/images/bn-tw/post/4bac764d-5c2b-40fd-89d6-73652da05b3e/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202020-11-18%20%EC%98%A4%ED%9B%84%208.15.14.png" alt=""></li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Basic Machine/Deep Learning #1]]></title>
            <link>https://velog.io/@bn-tw/Basic-MachineDeep-Learning-1</link>
            <guid>https://velog.io/@bn-tw/Basic-MachineDeep-Learning-1</guid>
            <pubDate>Wed, 18 Nov 2020 10:18:47 GMT</pubDate>
            <description><![CDATA[<h2 id="목표">목표</h2>
<ul>
<li>Machine learning basic concepts</li>
<li>Linear regression</li>
<li>Logistic regression(classification)</li>
<li>Multivariable (Vector) linear/logistic regression</li>
<li>Neural networks</li>
<li>Deep learning<ul>
<li>CNN, RNN, Bidirectional Neural networks</li>
</ul>
</li>
</ul>
<hr>
<h2 id="machine-learning">Machine Learning</h2>
<p><code>머신러닝(Machine Learning)</code></p>
<ul>
<li>일종의 소프트웨어 (프로그램)</li>
</ul>
<pre><code>1. 사용자가 사용하는 앱에 입력을 하게 되면, 입력의 기반으로 데이터를 읽어서 보여주는 것. explicit programming로 불림.

2. 어떤 부분에서는 explicit programming 으로 개발하기 어려움.
(스팸 메일을 구별) 룰이 많기 때문에 어려움.
3. 로직을 가지고 프로그래밍을 할 수 있지만 규칙이 너무 어려움.</code></pre><ul>
<li><code>Arthur samuel(1959)</code> 일일히 프로그래밍하지말고 어떤 자료, 현상으로 자동으로 배우면 어떨까?</li>
<li>개발자가 일일이 정하지 않고 이 프로그램 자체가 데이터를 학습해서 배우는 프로그램을 머신 러닝이라 부릅니다.</li>
</ul>
<h2 id="supervisedunsupervised-learning">Supervised/UnSupervised learning</h2>
<ul>
<li><p>머신 러닝을 할 때 프로그램은 학습을 해야 한다.</p>
</li>
<li><p>학습하는 방법에 따라서 2개로 분류</p>
<ul>
<li><p>Supervised learning
정해져 있는 (레이블 되어있는) 데이터, training set
예) 사람들이 고양이 그림을 먼저 주면서 (레이블이 달려있는) 학습을 합니다. </p>
</li>
<li><p>Unsupervised learning
구글 뉴스가 있는데 자동적으로 유사한 것들을 그룹핑 합니다. 레이블하지 않고 학습을 합게 됩니다.
비슷한 단어들도 모으라는 머신러닝이 있다면, 레이블을 직접 만들어 주는 것이 아니라 데이터를 보고 스스로 학습하는 것입니다.</p>
</li>
</ul>
</li>
</ul>
<h3 id="supervised-learning">Supervised learning</h3>
<ul>
<li>ML에서 가장 일반적인 문제입니다.</li>
<li>이미지 레이블링을 한다던지, 이메일 스팸 필터링 레이블을 매겨 놓은것들을 학습합니다.</li>
<li>이전 사람들이 몇시간 공부했는데 성적이 얼마였다 등의 데이터가 있으면 그 데이터를 가지고 학습을 할 수 있습니다.</li>
</ul>
<h4 id="training-data-set">Training data set</h4>
<table>
<thead>
<tr>
<th>x</th>
<th>y</th>
</tr>
</thead>
<tbody><tr>
<td>3, 6, 9</td>
<td>3</td>
</tr>
<tr>
<td>2, 5, 9</td>
<td>2</td>
</tr>
<tr>
<td>2, 3, 5</td>
<td>1</td>
</tr>
</tbody></table>
<p>이런 데이터의 레이블을 가지고 학습을 합니다. 학습을 통해 생성된 모델을 가지고
Test x의 값이 [9, 3, 6]을 모델에 넣으면 3 이라는 y값을 얻을 수 있습니다. </p>
<h4 id="type-of-supervised-learning">Type of supervised learning</h4>
<ul>
<li><code>regression</code>
얼마나 시간을 많이 썻냐에 대한 기반으로 시험 성적을 예측한다고 하면 시험성적은 0~100이라고 큰 범위를 가지기 때문에 regression이라 부릅니다.</li>
</ul>
<table>
<thead>
<tr>
<th>x(hours)</th>
<th>y(score)</th>
</tr>
</thead>
<tbody><tr>
<td>10</td>
<td>90</td>
</tr>
<tr>
<td>9</td>
<td>80</td>
</tr>
<tr>
<td>3</td>
<td>50</td>
</tr>
<tr>
<td>2</td>
<td>30</td>
</tr>
</tbody></table>
<ul>
<li><code>binary classification</code>
문제를 단순화 시켜, pass, fail로 나눈다면, 둘 중에 하나를 고르는 것이기 때문에 분류이게 됩니다.</li>
</ul>
<table>
<thead>
<tr>
<th>x(hours)</th>
<th>y(pass/fail)</th>
</tr>
</thead>
<tbody><tr>
<td>10</td>
<td>P</td>
</tr>
<tr>
<td>9</td>
<td>P</td>
</tr>
<tr>
<td>3</td>
<td>F</td>
</tr>
<tr>
<td>2</td>
<td>F</td>
</tr>
<tr>
<td>- <code>multi-label classification</code></td>
<td></td>
</tr>
<tr>
<td>학점을 나눠서 준다고하면 (A, B, C, D, E, F), multi-label classification이게 됩니다.</td>
<td></td>
</tr>
</tbody></table>
<table>
<thead>
<tr>
<th>x(hours)</th>
<th>y(grade)</th>
</tr>
</thead>
<tbody><tr>
<td>10</td>
<td>A</td>
</tr>
<tr>
<td>9</td>
<td>B</td>
</tr>
<tr>
<td>3</td>
<td>B</td>
</tr>
<tr>
<td>2</td>
<td>C</td>
</tr>
</tbody></table>
]]></description>
        </item>
    </channel>
</rss>