<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>beomjin_97.log</title>
        <link>https://velog.io/</link>
        <description>Rather be dead than cool.</description>
        <lastBuildDate>Thu, 18 Jan 2024 06:33:04 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. beomjin_97.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/beomjin_97" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[발표 스크립트]]></title>
            <link>https://velog.io/@beomjin_97/%EB%B0%9C%ED%91%9C-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8</link>
            <guid>https://velog.io/@beomjin_97/%EB%B0%9C%ED%91%9C-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8</guid>
            <pubDate>Thu, 18 Jan 2024 06:33:04 GMT</pubDate>
            <description><![CDATA[<p>안녕하십니까. 
약 3주전 1월 2일에 본 회사로 입사하게 된 김범진입니다. 
출근 첫날부터 지금까지 현대 중공업에서 상주하며 근무했었기 때문에 처음뵙거나 아직은 저에게 낯선 분들이 많이 계신거 같습니다.
이 자리를 빌어 인사드릴 수 있게 되어 기쁘게 생각합니다.   </p>
<p>그럼 발표를 시작하겠습니다. 발표 순서는 다음과 같습니다. 
먼저 제가 이번 년도에 달성하고 싶은 목표를 말씀드리고 그 다음 그 목표를 달성하기 위한 계획을 시간 순서대로 정리해서 말씀드리겠습니다.  </p>
<p>저는 올해 목표를 다음 4가지로 분류해서 결정했습니다. 
의도했던 바는 아니지만 이제 보니 제 인생에 있어서 중요한 순서대로 나열된 거 같네요
인턴 종료 후에 정직원으로의 계약, 실무를 진행함에 있어 업무 역량의 향상, 개인적인 성장을 위한 자격증 취득과 영어 능력 향상이 이번 2024년의 저의 목표 입니다.
목표의 세부적인 내용은 다음 계획 슬라이드에서 같이 말씀드리겠습니다.</p>
<p>평소에 신년 계획을 수립할 때엔 상반기와 하반기로 나누어서 계획했습니다. 
그러다 보니 계획이 분명하지 못하고 나중에는 희미해지는 느낌이 들어서 올해에는 4분기로 나누고 상시에 수행할 것을 추가했습니다. 
업무 관련해서는 올해 ¼분기에는 서버 시스템과 네트워크에 대한 이해를 중점적으로 하고, 2/4분기에는 스토리지의 시스템과 하드웨어에 대한 이해를, 하반기에는 HPC의 하드웨어와 클러스터 아키텍쳐, 그리고 성능 최적화에 대해서 공부하고 스킬업 하겠습니다.
자격증 취득 계획은 ¼분기에 리눅스 마스터, 2/4분기와 마지막 4/4분기에 정보 보안 기사 취득에 도전해볼 생각입니다. 
그리고 시간이 허락하는 대로 영어 공부에도 시간을 들여서 850점 이상 받을 수 있도록 하겠습니다. </p>
<p>지난 2023년 모두 고생 많으셨고 함께 성장하고 많은 것을 이룰 수 있는 2024년 한 해가 되셨으면 좋겠습니다. </p>
<p>그리고 올해를 함께할 모든 분들께 감사하다고 말씀드리고 싶습니다. 이것으로 발표를 마치겠습니다. 감사합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[code splitting]]></title>
            <link>https://velog.io/@beomjin_97/dynamic-import</link>
            <guid>https://velog.io/@beomjin_97/dynamic-import</guid>
            <pubDate>Tue, 21 Mar 2023 23:20:36 GMT</pubDate>
            <description><![CDATA[<h1 id="필요성">필요성</h1>
<p>싱글페이지 어플리케이션의 특성상 번들된 자바스크립트 파일이 모두 불러져와야 웹앱을 브라우저에서 실행할 수 있다. </p>
<p>ux적인 측면에서 최초 렌더링 속도는 매우 중요한 요소이기에 서드파티 라이브러리가 점점 추가됨과 함께 전체적인 앱의 크기가 커짐에 따라 code splitting이 필요하다고 생각되었다.</p>
<h1 id="계획">계획</h1>
<p>dynamic import와 react.lazy( ) 함수를 활용하여 라우팅 단위로 chuck들을 쪼갤 것이다.
이에 따라 페이지를 동적으로 불러올 동안 대체할 Suspense의 fallback 컴포넌트도 추가적으로 제작할 생각이다. <del><code>&lt;div&gt; ...Loading &lt;div&gt;</code>은 이제 그만</del></p>
<h1 id="과정">과정</h1>
<h1 id="결과">결과</h1>
]]></description>
        </item>
        <item>
            <title><![CDATA[이벤트 캡처링 버블링]]></title>
            <link>https://velog.io/@beomjin_97/%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%BA%A1%EC%B2%98%EB%A7%81-%EB%B2%84%EB%B8%94%EB%A7%81</link>
            <guid>https://velog.io/@beomjin_97/%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%BA%A1%EC%B2%98%EB%A7%81-%EB%B2%84%EB%B8%94%EB%A7%81</guid>
            <pubDate>Mon, 13 Mar 2023 10:45:39 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[hash]]></title>
            <link>https://velog.io/@beomjin_97/hash</link>
            <guid>https://velog.io/@beomjin_97/hash</guid>
            <pubDate>Sat, 25 Feb 2023 11:18:33 GMT</pubDate>
            <description><![CDATA[<h1 id="해싱-hashing">해싱 Hashing</h1>
<ul>
<li>데이터를 빠르게 저장하고 가져오는 기법 중 하나</li>
<li>키에 특정 연산을 적용하여 테이블의 주소를 계산<h1 id="hash-function">hash function</h1>
</li>
<li>O(1)의 시간복잡도</li>
<li>좋은 함수가 되려면, 키 값을 고르게 분포시키고, 해시 충돌이 최소화 되어야 함<h1 id="해시-테이블">해시 테이블</h1>
</li>
<li>key, value 쌍을 저장</li>
<li>순서가 없다</li>
</ul>
<pre><code class="language-ts">class HashTable&lt;K, V&gt; {
  private buckets: Map&lt;number, Array&lt;[K, V]&gt;&gt;;
  private size: number;

  constructor(size: number = 1024) {
    this.buckets = new Map&lt;number, Array&lt;[K, V]&gt;&gt;();
    this.size = size;
    // buckets 사이즈 만큼 초기화
    for (let i = 0; i &lt; size; i++) {
      this.buckets.set(i, []);
    }
  }

  // hash function    
  private hash(key: K): number {
    const hashString = key.toString();
    let hash = 0;
    for (let i = 0; i &lt; hashString.length; i++) {
      hash = (hash &lt;&lt; 5) + hash + hashString.charCodeAt(i);
      hash &amp;= hash; // convert to 32-bit integer
    }
    return hash % this.size;
  }

  // 값 저장하기
  public set(key: K, value: V): void {
    const index = this.hash(key);
    const bucket = this.buckets.get(index);
    for (const pair of bucket) {
      if (pair[0] === key) {
        pair[1] = value;
        return;
      }
    }
    bucket.push([key, value]);
  }

  // 값 불러오기
  public get(key: K): V | undefined {
    const index = this.hash(key);
    const bucket = this.buckets.get(index);
    for (const pair of bucket) {
      if (pair[0] === key) {
        return pair[1];
      }
    }
    return undefined;
  }

  // 값 삭제하기    
  public delete(key: K): boolean {
    const index = this.hash(key);
    const bucket = this.buckets.get(index);
    for (let i = 0; i &lt; bucket.length; i++) {
      if (bucket[i][0] === key) {
        bucket.splice(i, 1);
        return true;
      }
    }
    return false;
  }

  // 값이 있는지 여부 확인
  public has(key: K): boolean {
    const index = this.hash(key);
    const bucket = this.buckets.get(index);
    for (const pair of bucket) {
      if (pair[0] === key) {
        return true;
      }
    }
    return false;
  }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[기초 문법]]></title>
            <link>https://velog.io/@beomjin_97/%EB%AC%B8%EC%9E%90%EC%97%B4-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@beomjin_97/%EB%AC%B8%EC%9E%90%EC%97%B4-%ED%95%A8%EC%88%98</guid>
            <pubDate>Sat, 25 Feb 2023 11:17:34 GMT</pubDate>
            <description><![CDATA[<h1 id="반복문">반복문</h1>
<pre><code class="language-py"># list를 이용한 반복문
items = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;]

for item in items:
    print(item)

# range를 이용한 반복문
for num in range(10):
    print(num)</code></pre>
<h1 id="인덱싱">인덱싱</h1>
<pre><code class="language-py">word = &#39;superman&#39;
word[3]  # &#39;e&#39;
word[-2] # &#39;a&#39;
word[5:] # &#39;man&#39;
word[:5] # &#39;super&#39;</code></pre>
<h1 id="메서드">메서드</h1>
<h2 id="startswith">startswith()</h2>
<pre><code class="language-py">word = &#39;python&#39;
word.startswith(&#39;py&#39;)  #True
word.startswith(&#39;sa&#39;)  #False</code></pre>
<h2 id="split">split()</h2>
<pre><code class="language-py">intro = &#39;my name is beomjin&#39;
intro.split()  # [&#39;my&#39;, &#39;name&#39;, &#39;is&#39;, &#39;beomjin&#39;]

fruits = &#39;사과,귤,배,바나나&#39;
fruits.split(&#39;,&#39;) # [&#39;사과&#39;, &#39;귤&#39;, &#39;배&#39;, &#39;바나나&#39;]</code></pre>
<h2 id="append">append()</h2>
<pre><code class="language-py">numbers = []

numbers.append(1)
print(numbers)  # [1]

numbers.appned(2)
print(numbers)  # [1, 2]</code></pre>
<h2 id="upper-lower">upper(), lower()</h2>
<pre><code class="language-py">intro = &#39;my name is beomjin&#39;
intro.upper()  # &#39;MY NAME IS BEOMJIN&#39;
intro.lower()  # &#39;my name is beomjin&#39;</code></pre>
<h2 id="replace">replace</h2>
<pre><code class="language-py">intro = &#39;my name is beomjin&#39;
intro.replace(&#39;beomjin&#39;, &#39;kim&#39;)  # &#39;my name is kim&#39;</code></pre>
<h1 id="list-comprehension">list comprehension</h1>
<pre><code class="language-py">words = [&#39;life&#39;, &#39;love&#39;, &#39;faith&#39;]
first_letters = []

for word in words:
    first_letters.append(word[0])

first_letters = [word[0] for word in words]</code></pre>
<p>for문과 list comprehension문은 동일한 결과를 가져온다. </p>
<pre><code class="language-py">numbers = [1, 3, 4, 5, 6, 7]
even = []

for n in numbers:
    if n % 2 == 0:
        even.append(n)

even = [n for in numbers if n % 2 == 0]</code></pre>
<p>if문과 함께 사용하는 것도 가능하다.</p>
<h1 id="sorted">sorted</h1>
<pre><code class="language-py">numbers = [-1, 3, -4, 5, 6, 100]
sort_by_abs = sorted(number, key=abs)  # [-1, 3, -4, 5, 6, 100]</code></pre>
<p>key에 정렬에 이용할 함수를 넣어준다. 내장 함수 뿐만 아니라 사용자 생성 함수도 이용가능하다.</p>
<h1 id="set">set</h1>
<h2 id="set-생성">set 생성</h2>
<pre><code class="language-py">set1 = {1, 2, 3}
set2 = set([1, 2, 3])
set3 = {1, 1, 2, 3, 3}</code></pre>
<h2 id="원소-추가삭제">원소 추가/삭제</h2>
<pre><code class="language-py">num_set = {1, 3, 5, 7}
num_set.add(9)  # {1, 3, 5, 7, 9} 
num_set.update([3,15,4])  # {1, 3, 4, 5, 7, 9, 15} 
num_set.remove(7)  # {1, 3, 4, 5, 9, 15} 
num_set.discard(13)  # {1, 3, 4, 5, 9, 15}</code></pre>
<p>discard는 remove와 달리 없는 원소에 대해서 삭제할 때 에러를 내지 않는다. (무시됨)</p>
<h2 id="집합-연산">집합 연산</h2>
<pre><code class="language-py">union = set1 | set2
intersection = set1 &amp; set 2
diff = set1 - set2
xor = set1 ^ set2</code></pre>
<h1 id="lambda">lambda</h1>
<pre><code class="language-py">def square(x):
    return x * x

square = lambda x: x * x

def get_title(row):
    split = row.split(&#39;,&#39;)
    return split[1]

get_title = lambda row: row.split(&#39;,)[1]</code></pre>
<h1 id="map">map</h1>
<pre><code class="language-py">get_title = lambda row: row.split(&#39;,)[1]

titles = map(get_title, movies)</code></pre>
<p>리스트와 유사하기는 하지만 리스트가 아닌 map이라는 타입을 가진다.</p>
<h1 id="filter">filter</h1>
<pre><code class="language-py">def starts_with_r(word):
    return word.startswith(&#39;r&#39;)

r_word = filter(starts_with_r, words)</code></pre>
<p>첫번째 인자로 들어오는 함수에서 True를 반환하는 요소만 반환</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[matplotlib]]></title>
            <link>https://velog.io/@beomjin_97/mapplotlib</link>
            <guid>https://velog.io/@beomjin_97/mapplotlib</guid>
            <pubDate>Sat, 25 Feb 2023 11:16:11 GMT</pubDate>
            <description><![CDATA[<p>데이터를 그래프나 차트로 시각화할 수 있는 라이브러리</p>
<h1 id="단일-그래프-그리기">단일 그래프 그리기</h1>
<pre><code class="language-py">import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [1, 2, 3, 4, 5]

fig, ax = plt.subplots(x,y)
ax.set_title = (&#39;first plot&#39;)
ax.set_xlabel(&#39;x&#39;)
ax.set_ylabel(&#39;y&#39;)
fig.set_dpi(300)
fig.savefig(&#39;first_plot.png&#39;)</code></pre>
<h1 id="다중-그래프-그리기">다중 그래프 그리기</h1>
<pre><code class="language-py">fig, axes = lit.subplot(2,1)
axes[0].plot(x, np.sin(x))
axes[1].plot(x, np.cos(x))</code></pre>
<h1 id="option">option</h1>
<pre><code class="language-py">ax.plot(x,y, linestyle=&quot;&quot;, marker=&quot;&quot;, color=&quot;&quot;)
ax.set_xlim
ax.set_ylim
ax.legend( loc=&quot;&quot;, shadow=True, fancybox=True, borderpad=2)</code></pre>
<h1 id="scatter">scatter</h1>
<pre><code class="language-py">fig, ax = plt.subplots()
ax.scatter(x,y, c=colors, s=sizes, alpha=0.3)</code></pre>
<h1 id="bar-plot">bar plot</h1>
<pre><code class="language-py">fig, ax = plt.subplots(figsize=(12,4))
ax.bar(x, x*2)

x_ax = np.arange(3)
for i in x_ax:
    ax.bar(x_ax, data[i],
    bottom=np.sum(data[:i], axis=0)</code></pre>
<h1 id="histogram">histogram</h1>
<pre><code class="language-py">fig, ax = plt.subplots()
data = np.random.rand(1000)
ax.hist(data, bins=50)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[파일 입출력]]></title>
            <link>https://velog.io/@beomjin_97/%ED%8C%8C%EC%9D%BC-%EC%9E%85%EC%B6%9C%EB%A0%A5</link>
            <guid>https://velog.io/@beomjin_97/%ED%8C%8C%EC%9D%BC-%EC%9E%85%EC%B6%9C%EB%A0%A5</guid>
            <pubDate>Sat, 25 Feb 2023 11:11:19 GMT</pubDate>
            <description><![CDATA[<h1 id="파일-열기">파일 열기</h1>
<pre><code class="language-py">file = open(&#39;data.txt&#39;)
content = file.read()
file.close</code></pre>
<p>파일을 열고 닫는 방식</p>
<pre><code class="language-py">with open(&#39;data.txt&#39;) as file:
    content = file.read()</code></pre>
<p>: 내에서 파일을 사용, close는 필요없다</p>
<h1 id="줄-단위로-읽기">줄 단위로 읽기</h1>
<pre><code class="language-py">contents = []
with open (&#39;data.txt&#39;) as file:
    for line in file:
        contents.append(line)</code></pre>
<h1 id="파일의-모드">파일의 모드</h1>
<pre><code class="language-py">with open(&#39;data.txt&#39;, &#39;w&#39;) as file:
    file.write(&#39;hello&#39;)</code></pre>
<p>default는 읽기 모드로 &#39;w&#39;값을 넘겨주면 쓰기 모드로 파일을 열 수 있다.</p>
<h1 id="json">JSON</h1>
<p>json과 dictionary는 서로의 포멧으로 변환이 가능하다.</p>
<pre><code class="language-py">import json

def create_dict(filename):
    with open(filename) as file:
        json_string = file.read()
        new_dict = json.loads(json_string)
        return new_dict 


def create_json(dictionary, filename):
    with open(filename, &#39;w&#39;) as file:
        json_string = json.dumps(dictionary)
        file.write(json_string)        
</code></pre>
<ul>
<li>loads() : json을 dictionary로</li>
<li>dumps() : dictionary를 json으로</li>
</ul>
<h1 id="csv">CSV</h1>
<p>CSV : Comma Separated Value</p>
<ul>
<li>컬럼 형태</li>
<li>콤마로 구분된 자료</li>
<li>다른 dilimter도 사용가능</li>
</ul>
<pre><code class="language-py">import csv

with open(&#39;data.csv&#39;) as file:
    reader = csv.reader(file, delimiter=&#39;,&#39;)
    for row in reader:
        print(row[0])</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[pandas]]></title>
            <link>https://velog.io/@beomjin_97/pandas</link>
            <guid>https://velog.io/@beomjin_97/pandas</guid>
            <pubDate>Sat, 25 Feb 2023 11:11:00 GMT</pubDate>
            <description><![CDATA[<p>NumPy를 기반으로 설계된 구조화된 데이터를 처리하고 저장하는 라이브러리</p>
<h1 id="series">Series</h1>
<ul>
<li>numpy array가 보강된 형태</li>
<li>data + index</li>
</ul>
<pre><code class="language-py">import pandas as pd

# 기본형(0,1,2,...) 아닌 지정된 인덱스를 사용할 수도 있다.
# name 속성으로 title을 지정할 수도 있다.
data = pd.Series([1, 2, 3, 4], index=[&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;] name=&#39;title1&#39;)

# 딕셔너리를 Series로 사용할 수 있다.
population_dict = {
&#39;korea&#39;: 5180,
&#39;japan&#39;: 12718,
&#39;china&#39;: 141500,
&#39;usa&#39;: 32676
}
population = pd.Series(population_dict)</code></pre>
<h2 id="연산">연산</h2>
<pre><code class="language-py">A = pd.Series([2, 4, 6], index=[0, 1, 2])
B = pd.Series([1, 3, 5], index=[1, 2, 3])
A + B
A.add(B, fill_value=0)</code></pre>
<p>index에 맞춰서 연산된다.</p>
<br />

<h1 id="dataframe">DataFrame</h1>
<ul>
<li>여러개의 Series가 모여서 행과 열을 이룬 데이터<pre><code class="language-py">population = pd.Series(population_dict)
gdp = pd.Series(gdp_dict)
</code></pre>
</li>
</ul>
<p>country = pd.DataFrame({
    &#39;population&#39;: population,
    &#39;gdp&#39;: gdp</p>
<pre><code>
## Series 간의 연산
```py
gdp_per_capita = country[&#39;gdp&#39;] / country[&#39;population’]
country[&#39;gdp per capita’] = gdp_per_capita</code></pre><h2 id="저장과-불러오기">저장과 불러오기</h2>
<pre><code class="language-py"># 저장
country.to_csv(“./country.csv”)
country.to_excel(“country.xlsx”)

# 불러오기
country = pd.read_csv(“./country.csv”)
country = pd.read_excel(“country.xlsx”)</code></pre>
<h2 id="인덱싱슬라이싱">인덱싱/슬라이싱</h2>
<pre><code class="language-py"># 명시적 인덱스 참조
country.loc[&#39;china&#39;]  
country.loc[&#39;japan&#39;:&#39;korea&#39;, :&#39;population&#39;] 

# 정수 인덱스 참조
country.iloc[0]
country.iloc[1:3, :2]</code></pre>
<h2 id="추가수정">추가/수정</h2>
<pre><code class="language-py">dataframe = pd.DataFrame(colums=[&#39;name&#39;, &#39;age&#39;, &#39;address&#39;]
dataframe.loc[0] = [&#39;김범진&#39;, &#39;27&#39;, &#39;서울&#39;]
dataframe.loc[1] = [&#39;name&#39;: &#39;이혜영&#39;, &#39;age&#39;: &#39;26&#39;, &#39;address&#39;: &#39;제주&#39;]
dataframe.loc[1, &#39;이름&#39;] = &#39;혜일&#39;

#새로운 컬럼 추가
dataframe[‘contact&#39;] = np.nan
dataframe.loc[0, ‘contact’] = ‘01012341234’</code></pre>
<h2 id="컬럼-선택">컬럼 선택</h2>
<pre><code class="language-py">dataframe[&quot;name&quot;]
dataframe[[&quot;name&quot;,&quot;address&quot;,&quot;age&quot;]]</code></pre>
<h2 id="누락-데이터">누락 데이터</h2>
<pre><code class="language-py">dataframe.isnull()  # null인 값을 True로, null이 아닌 값을 False로 채워진 dataframe 반환</code></pre>
<p>누락된 데이터가 있는 경우 해당 열을 삭제하거나, 빈곳을 default값으로 채우는 방식을 사용할 수 있다.</p>
<pre><code class="language-py">dataframe.dropna()
dataframe[&#39;contact&#39;] = dataframe[&#39;contact&#39;].fillna(&#39;no phone number&#39;)</code></pre>
<h2 id="연산-1">연산</h2>
<pre><code class="language-py">A = pd.DataFrame(np.random.randint(0, 10, (2, 2)), columns=list(&quot;AB&quot;))
B = pd.DataFrame(np.random.randint(0, 10, (3, 3)), columns=list(&quot;BAC&quot;))
A + B
A.add(B, fill_value=0)</code></pre>
<p>index와 컬럼에 맞춰서 연산된다.</p>
<h2 id="집계함수">집계함수</h2>
<pre><code class="language-py">data = {
&#39;A&#39;: [ i+5 for i in range(3) ],
&#39;B&#39;: [ i**2 for i in range(3) ]
}
df = pd.DataFrame(data)
df[&#39;A&#39;].sum() # 18
df.sum()
df.mean()</code></pre>
<h2 id="정렬">정렬</h2>
<pre><code class="language-py">df = pd.DataFrame({
&#39;col1&#39; : [2, 1, 9, 8, 7, 4],
&#39;col2&#39; : [&#39;A&#39;, &#39;A&#39;, &#39;B&#39;, np.nan, &#39;D&#39;, &#39;C&#39;],
&#39;col3&#39;: [0, 1, 9, 4, 2, 3],
})
df.sort_values(&#39;col1&#39;, ascending=False) # 기본값은 오름차순 정렬
df.sort_values([&#39;col2&#39;, &#39;col1&#39;])  # col2에 대해서 정렬하고 동일한 값은 col1에 의해 정렬</code></pre>
<h2 id="조건-검색">조건 검색</h2>
<h3 id="masking-연산">masking 연산</h3>
<pre><code class="language-py">df = pd.DataFrame(np.random.rand(5, 2), columns=[&quot;A&quot;, &quot;B&quot;])

df[“A”] &lt; 0.5 # True, False값을 가지는 dataframe

df[(df[&quot;A&quot;] &lt; 0.5) &amp; (df[&quot;B&quot;] &gt; 0.3)]
df.query(&quot;A &lt; 0.5 and B &gt; 0.3&quot;) # query를 이용해서도 조건 검색 가능

# 문자열 조건 검색
df[&quot;Animal&quot;].str.contains(&quot;Cat&quot;)
df.Animal.str.match(&quot;Cat&quot;)</code></pre>
<h2 id="함수로-데이터-다루기">함수로 데이터 다루기</h2>
<h3 id="apply">apply</h3>
<p>apply를 통해서 함수로 데이터를 다룰 수 있다.</p>
<pre><code class="language-py">df = pd.DataFrame(np.arange(5), columns=[&quot;Num&quot;])

df[&quot;Square&quot;] = df.Num.apply(lambda x: x ** 2)</code></pre>
<h3 id="replace">replace</h3>
<pre><code class="language-py">df.Sex.replace({&quot;Male&quot;: 0, &quot;Female&quot;: 1}, inplace=True) </code></pre>
<h2 id="그룹">그룹</h2>
<h3 id="groupby">groupby</h3>
<pre><code class="language-py">df.groupby(&#39;key&#39;)
df.groupby(&#39;key&#39;).sum()
df.groupby([&#39;key&#39;,&#39;data1&#39;]).sum()</code></pre>
<p>그룹으로 묶은 다음 집계함수를 사용할 수도 있다.</p>
<h2 id="aggregate">aggregate</h2>
<pre><code class="language-py">df.groupby(&#39;key&#39;).aggregate([&#39;min&#39;, np.median, max])
df.groupby(&#39;key&#39;).aggregate({&#39;data1&#39;: &#39;min&#39;, &#39;data2&#39;: np.sum})</code></pre>
<p>aggregate를 사용하면 집계를 한번에 계산할 수 있다.</p>
<h2 id="filter">filter</h2>
<pre><code class="language-py">def filter_by_mean(x):
return x[&#39;data2&#39;].mean() &gt; 3

df.groupby(&#39;key&#39;).filter(filter_by_mean)</code></pre>
<p>그룹 속성을 기준으로 데이터 필터링을 사용할 수 있다.</p>
<h2 id="apply-1">apply</h2>
<pre><code class="language-py">df.groupby(&#39;key&#39;).apply(lambda x: x.max() - x.min())</code></pre>
<p>그룹을 통해 묶인 데이터에 함수를 적용할 수 있다.</p>
<h2 id="get_group">get_group</h2>
<pre><code class="language-py">df.groupby(&#39;시도&#39;).get_group(&#39;경기&#39;)</code></pre>
<p>그룹으로 묶인 데이터에서 키값으로 데이터를 추출할 수 있다.</p>
<h2 id="multiindex">multiindex</h2>
<pre><code class="language-py">df = pd.DataFrame(
np.random.randn(4, 2),
index=[[&#39;A&#39;, &#39;A&#39;, &#39;B&#39;, &#39;B&#39;], [1, 2, 1, 2]], # 계층적 인덱스
columns=[&#39;data1&#39;, &#39;data2&#39;]
)

df = pd.DataFrame(
np.random.randn(4, 4),
columns=[[&quot;A&quot;, &quot;A&quot;, &quot;B&quot;, &quot;B&quot;], [&quot;1&quot;, &quot;2&quot;, &quot;1&quot;, &quot;2&quot;]] # 계층적 열 인덱스
)</code></pre>
<h2 id="pivot_table">pivot_table</h2>
<p>필요한 자료만 뽑아서 새롭게 요약</p>
<ul>
<li>index: 행 인덱스로 들어갈 key</li>
<li>columns: 열 인덱스로 라벨링될 값</li>
<li>value: 분석할 데이터</li>
</ul>
<pre><code class="language-py">df.pivot_table(
index=&quot;월별&quot;, columns=&#39;내역&#39;, values=[&quot;수입&quot;, &#39;지출&#39;])</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[numpy]]></title>
            <link>https://velog.io/@beomjin_97/numpy</link>
            <guid>https://velog.io/@beomjin_97/numpy</guid>
            <pubDate>Sat, 25 Feb 2023 11:10:36 GMT</pubDate>
            <description><![CDATA[<h1 id="numpy">NumPy</h1>
<p>대규모 다차원 배열을 다룰 수 있게 도와주는 라이브러리</p>
<h1 id="배열-생성">배열 생성</h1>
<p>배열 내의 원소는 같은 dtype을 가진다.</p>
<pre><code class="language-py">np.array([1,2,3,4,5])
np.array([3, 1.4, 2, 3, 4])  # [3. ,1.4, 2. ,3. , 4.] 
np.array([1, 2], [3, 4]) # [[1, 2], [3, 4]]
np.array([1, 2, 3, 4], dtype=&#39;float&#39;)</code></pre>
<h2 id="다양한-배열">다양한 배열</h2>
<pre><code class="language-py">np.zeros(10, dtype=int)
np.ones((3, 5), dtype=float) # 3 x 5 배열
np.arrage(0, 20, 2)  # 0에서 20미만까지 2step을 가진 배열
np.linspace(0, 1, 5)  # 0에서 1이하까지 5등분된 요소를 가진 배열</code></pre>
<h2 id="난수-배열">난수 배열</h2>
<pre><code class="language-py">np.random.random((2, 2)) # 0과 1사이 난수
np.random.normal(0, 1, (2,2))  # params(mean, standard deviation, size)
np.random.randint(0, 10, (2,2))  # parmas(low, high, size)</code></pre>
<h1 id="배열의-정보">배열의 정보</h1>
<pre><code class="language-py">x2 = np.random.randint(10, size=(3,4))

x2.ndim # 2
x2.shape # (3,4)
x2.size # 12
x2.dtype # dtype(&#39;int64&#39;)</code></pre>
<h1 id="배열-변형">배열 변형</h1>
<h2 id="reshape">reshape</h2>
<pre><code class="language-py">x = np.arrage(8)
x.shape  # (8.)
x2 = x.reshape((2,4))
x2.shape # (2,4)</code></pre>
<h2 id="concatenate">concatenate</h2>
<pre><code class="language-py">matrix = np.arrage(4).reshape(2,2)
np.concatenate([matrix, matrix], axis=0)  # 세로방향
np.concatenate([matrix, matrix], axis=1)  # 가로방향</code></pre>
<h2 id="split">split</h2>
<pre><code class="language-py">matrix = np.arrage(16).reshape(4,4)
upper, lower = np.split(matrix, [3], axis = 0)  # 세로방향
upper, lower = np.split(matrix, [3], axis = 1)  # 가로방향</code></pre>
<h1 id="배열-연산">배열 연산</h1>
<h2 id="기본-연산">기본 연산</h2>
<pre><code class="language-py">x = np.arange(4)
x + 5
# array([5, 6, 7, 8])
x - 5
# array([-5, -4, -3, -2])
x * 5
# array([ 0, 5, 10, 15])
x / 5
# array([0. , 0.2, 0.4, 0.6])</code></pre>
<h2 id="배열간의-연산">배열간의 연산</h2>
<pre><code class="language-py">x = np.arange(4).reshape((2, 2))
y = np.random.randint(10, size=(2, 2))
x + y
# array([[1, 7],
[6, 5]])
x - y
# array([[-1, -5],
[-2, 1]])</code></pre>
<h2 id="브로드-캐스팅">브로드 캐스팅</h2>
<p>shape이 다른 array끼리 연산.
서로의 shape에 맞게 빈 곳을 반복을 통해 채워 넣고 연산한다고 생각하면 이해하기 쉽다. </p>
<h2 id="집계함수">집계함수</h2>
<pre><code class="language-py">x = np.arange(8).reshape((2,4))
np.sum(x) # 28
np.min(x) # 0
np.max(x) # 7
np.mean(x) # 3.5

np.sum(x, axis=0) # [4, 6, 8, 10]
np.sum(x, axis=1) # [6, 22]</code></pre>
<h2 id="마스킹-연산">마스킹 연산</h2>
<p>True, False array를 통해 True를 만족하는 값들만 필터링</p>
<pre><code class="language-py">x = np.arange(5)
x &lt; 3  # [True, True, True, False, False]
x[x &lt; 3]  # [0, 1, 2]</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[데코레이터]]></title>
            <link>https://velog.io/@beomjin_97/%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0</link>
            <guid>https://velog.io/@beomjin_97/%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0</guid>
            <pubDate>Tue, 10 Jan 2023 10:42:20 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[1. Routing]]></title>
            <link>https://velog.io/@beomjin_97/1.-Routing</link>
            <guid>https://velog.io/@beomjin_97/1.-Routing</guid>
            <pubDate>Sun, 08 Jan 2023 09:03:39 GMT</pubDate>
            <description><![CDATA[<h1 id="routing">routing</h1>
<p>next.js는 자체적인 라우팅 기능을 제공한다. 
page 디렉토리 아래 nest된 구조를 기본적으로 라우팅으로 사용한다. </p>
<ul>
<li>pages/index.tsx : /</li>
<li>pages/upload.tsx : /upload</li>
</ul>
<p>다이나믹 라우팅또한 다음과 같이 구현할 수 있다.</p>
<ul>
<li>pages/post/[postId].tsx : /post/:postId</li>
</ul>
<p>참고로 다음과 같이([...]) 작성하면 아래 모든 path와 매칭된다.</p>
<ul>
<li>pages/post/[...all].js : /post/*</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[타입을 좁히는 방법, 확장하는 방법]]></title>
            <link>https://velog.io/@beomjin_97/%ED%83%80%EC%9E%85%EC%9D%84-%EC%A2%81%ED%9E%88%EB%8A%94-%EB%B0%A9%EB%B2%95-%ED%99%95%EC%9E%A5%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@beomjin_97/%ED%83%80%EC%9E%85%EC%9D%84-%EC%A2%81%ED%9E%88%EB%8A%94-%EB%B0%A9%EB%B2%95-%ED%99%95%EC%9E%A5%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Tue, 03 Jan 2023 11:44:36 GMT</pubDate>
            <description><![CDATA[<h1 id="11-union-type">1.1 Union Type</h1>
<ul>
<li>여러 타입 중 하나가 올 것이라 가정할 때 사용한다.<pre><code class="language-ts">let one : string | number
one = 1;
one = &#39;abc&#39;;</code></pre>
</li>
<li>동시에 여러 타입이 될 수 없다.</li>
</ul>
<pre><code class="language-ts">type Human = {
  think: () =&gt; void;
};

type Human = {
  think: () =&gt; void;
};

type Dog = {
  bark: () =&gt; void;
};

declare function getType(): Human | Dog;

const creature = getType() 
creature.think(); // Property &#39;think&#39; does not exist on type &#39;Human | Dog&#39;. 
                  // Property &#39;think&#39; does not exist on type &#39;Dog&#39;.

creature.bark();  // Property &#39;bark&#39; does not exist on type &#39;Human | Dog&#39;. 
                 // Property &#39;bark&#39; does not exist on type &#39;Human&#39;.</code></pre>
<br />

<h1 id="12-intersection-type">1.2 Intersection Type</h1>
<ul>
<li>A타입 이면서 B타입이라는 의미</li>
<li>&amp;로 묶인 모든 타입을 만족해야 한다. </li>
<li>기존 타입을 수정하지 않으면서 기존 타입에 새로운 필드를 추가(확장)하고 싶을 때 사용한다. <pre><code class="language-ts">type Human = {
think: () =&gt; void;
};
</code></pre>
</li>
</ul>
<p>type Developer = {
  work: () =&gt; void;
};</p>
<p>const me: Human &amp; Developer = {
  think() {},
  work() {},
};</p>
<pre><code>- 타입간에 겹치는 필드가 있는 경우 에러가 발생할 수 있다.
```ts
type A = {
  output: string;
  test: string | number
};
type B = {
  output: number;
  test: string
};

const obj: A &amp; B = {
  output, // Type &#39;any&#39; is not assignable to type &#39;never&#39;.
  test  // only &#39;string&#39; Type is assignable. 
};</code></pre><br />

<h1 id="2-type-guard">2. Type Guard</h1>
<p>데이터의 타입을 알 수 없거나, 될 수 있는 타입이 여러개라고 가정할 때, 구별할 수 있는 단서들을 활용하여 조건문을 통해 데이터의 타입을 좁혀나가는 것. 
에러를 최소화하는 방어적인 코드 작성 가능.</p>
<pre><code class="language-ts">type Human = {
  think: () =&gt; void;
};

type Dog = {
  tail: string;
  bark: () =&gt; void;
};

declare function getType(): Human | Dog;

const creature = getType();
if (&quot;tail&quot; in creature) {
  creature.bark();
} else {
  creature.think();
}
</code></pre>
<ul>
<li>구별 단서 : instanceof 활용, typeof 활용, in 활용, literal type을 활용<br />

</li>
</ul>
<h1 id="3-optional-chaining">3. Optional Chaining</h1>
<ul>
<li><code>obj?.propery</code></li>
<li>접근하는 객체가 null 또는 undefined이면 undefined를 리턴. 그렇지 않은 경우는 데이터 값을 리턴한다. </li>
<li>&amp;&amp; 는 falsy한 값(alse, null, undefined, ‘’, 0, -0, NaN) 모두를 체킹한다. </li>
<li>array와 함수에도 사용할 수 있다.<br>ex) <code>comments?.[0]</code> <code>add?.()</code><br />
# 4. Nullish Coalescing Operator</li>
<li>null 병합 연산자 <code>A ?? B</code></li>
<li>좌항이 null, undefined인 경우에만 B를 반환</li>
<li><code>A || B</code> 에서는 A가 falsy값인 경우 바로 B를 반환하는 것에 반해, <code>A ?? B</code>는 A가 undefined, null이 아니라면 falsy 값이라해도 A를 반환한다. <br />

</li>
</ul>
<h1 id="5-functional-overloading">5. Functional Overloading</h1>
<ul>
<li>파라미터의 형태가 다양한 여러 케이스에 대응하는 같은 이름을 가진 함수를 만드는 것이다.</li>
<li>함수의 다형성을 지원한다.</li>
<li>제네릭과 달리 타입을 선언하는 시점에 타입이 추론된다. </li>
</ul>
<h2 id="선언시-주의할-점">선언시 주의할 점</h2>
<ul>
<li><p>함수의 이름이 같아야 한다.</p>
</li>
<li><p>매개변수의 순서가 같아야 한다.</p>
</li>
<li><p>반환타입이 같아야 한다.</p>
</li>
<li><p>타입 선언부는 런타임에서 제거된다. </p>
<pre><code class="language-ts">class User {
constructor(private id: string) {}

setId(id: string): string;  // 런타임에 제거됨
setId(id: number, radix: number): string; // 런타임에 제거됨

setId(id: string | number, radix?: number): string {
  return id.toString(radix);
}
}</code></pre>
<br />

</li>
</ul>
<h1 id="6-type-assertion">6. type Assertion</h1>
<ul>
<li>타입스크립트가 추론하지 못하는 타입을 as로 명시해주는 것</li>
<li>타입 선언과 달리 개발자에 의존하는 타입 (실수할 수 있는 여지가 충분히 존재)</li>
<li>실제 데이터 타입을 변경하지 않고 타입 에러가 나지 않게끔만 한다.<pre><code class="language-ts">let someValue:unknown = &#39;this is a string&#39;
</code></pre>
</li>
</ul>
<p>let strLength: number = (someValue as string).length</p>
<pre><code>&lt;br /&gt;

# 7. Index Signature
- 인덱스 시그니처에 대해서도 타입을 지정할 수 있다.
- 객체의 프로퍼티를 정확히 알 수 없을 때 사용한다. 
- 너무 많은 프로퍼티를 다 선언할 수 없을 때 사용한다.
```ts
type ArrStr = {
  [key1: string]: string;
  [key2: number]: string;
};

type ArrStrs = Record&lt;string|number, string&gt;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[List]]></title>
            <link>https://velog.io/@beomjin_97/List</link>
            <guid>https://velog.io/@beomjin_97/List</guid>
            <pubDate>Mon, 02 Jan 2023 11:41:07 GMT</pubDate>
            <description><![CDATA[<h1 id="1-리스트">1. 리스트</h1>
<ul>
<li>데이터를 일렬로 늘여뜨려 놓은 형태인 선형적 자료구조이다.</li>
<li>순서를 가진다.</li>
</ul>
<h2 id="11-리스트의-연산">1.1 리스트의 연산</h2>
<ul>
<li>삽입</li>
<li>삭제</li>
<li>탐색</li>
</ul>
<h2 id="12-종류">1.2 종류</h2>
<ul>
<li>ArrayList</li>
<li>LikedList<ul>
<li>Single linked list</li>
<li>Double linked list<br />

</li>
</ul>
</li>
</ul>
<h1 id="2-arraylist">2. ArrayList</h1>
<ul>
<li>배열 기반의 리스트</li>
<li>메모리 공간을 연속적으로 사용</li>
</ul>
<h2 id="21-연산">2.1 연산</h2>
<ul>
<li>삽입 : 삽입할 인덱스와 그 다음에 있는 데이터들을 한칸씩 뒤로 밀고 삽입, O(n)</li>
<li>삭제 : 해당 인덱스 데이터 삭제 후 삭제할 인덱스 그 다음에 있는 데이터들을 한칸씩 앞으로 당김, O(n)</li>
<li>탐색 ; random access 방식으로 탐색, O(1)</li>
</ul>
<pre><code class="language-ts">class MyArrayList&lt;T&gt; {
  length: number;
  elements: T[];

  constructor() {
    this.length = 0;
    this.elements = new Array&lt;T&gt;(0);
  }

  // 요소 추가
  add(t: T): void {
    this.elements[this.length] = t;
    this.length += 1;
  }

  // 특정 인덱스에 요소 추가
  insert(index: number, t: T): void {
    for (let i = index; i &lt; this.length; i++) {
      this.elements[i + 1] = this.elements[i];
    }
    this.elements[index] = t;
    this.length += 1;
  }

  // 특정 인덱스 요소 삭제
  deleteByIndex(index: number): boolean {
    if (index &lt; 0 || index &gt; this.length - 1) return false;
    for (let i = index; i &lt; this.length - 1; i++) {
      this.elements[i] = this.elements[i + 1];
    }
    this.length -= 1;
    return false;
  }

  // 특정 요소 삭제
  delete(t: T): boolean {
    for (let i = 0; i &lt; this.length; i++) {
      if (this.elements[i] === t) {
        for (let j = i; j &lt; this.length - 1; j++) {
          this.elements[j] = this.elements[j + 1];
        }
        this.length--;
        return true;
      }
    }
    return false;
  }

  // 특정 인덱스 요소 취득
  get(index: number): T {
    if (index &lt; 0 || index &gt; this.length - 1) {
      throw new Error(&quot;IndexOutOfBoundsException&quot;);
    }
    return this.elements[index];
  }

  // 특정 요소 인덱스 취득
  indexOf(t: T): number {
    for (let i = 0; i &lt; this.length; i++) {
      if (this.elements[i] === t) {
        return i;
      }
    }
    return -1;
  }

  // 특정 요소의 유무
  contains(t: T): boolean {
    for (let i = 0; i &lt; this.length; i++) {
      if (this.elements[i] === t) {
        return true;
      }
    }
    return false;
  }

  // 리스트의 length 취득
  size(): number {
    return this.length;
  }

  // 빈 리스트인지 여부
  isEmpty(): boolean {
    return this.length === 0;
  }

  // length 0으로 초기화
  clear(): void {
    this.length = 0;
    this.elements = new Array&lt;T&gt;(0);
  }
}
</code></pre>
<br />

<h1 id="3-linked-list">3. Linked List</h1>
<ul>
<li>linked list는 Node로 구성되어 있다. </li>
<li>node는 데이터를 <strong>저장할 수 있는 필드</strong>와 다음 노드를 가리키는 <strong>next pointer를 가진 필드</strong>를 가지고 있다.</li>
<li>가장 앞에 있는 노드는 head, 가장 마지막 노드는 tail</li>
<li>배열의 복사나 재할당 없이 데이터를 추가 할 수 있다. (유연한 공간)</li>
<li>대신, random access가 불가능하기 때문에 데이터 접근시 시간 소요</li>
</ul>
<h2 id="31-연산">3.1 연산</h2>
<p>next pointer를 잘 조정해주어야 한다.</p>
<ul>
<li>삽입 : O(n)</li>
<li>삭제 : O(1)</li>
<li>탐색 ; O(n)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[URL]]></title>
            <link>https://velog.io/@beomjin_97/URL</link>
            <guid>https://velog.io/@beomjin_97/URL</guid>
            <pubDate>Mon, 02 Jan 2023 04:30:07 GMT</pubDate>
            <description><![CDATA[<h1 id="url-uniform-resource-locator">URL (Uniform Resource Locator)</h1>
<p>컴퓨터 네트워크 상에서 리소스( 웹페이지, 이미지, 비디오 등 )가 어디에 위치하는지 알려주기 위한 규약, 흔히 웹 주소로 불린다.</p>
<h1 id="vs-uri">VS URI</h1>
<p>URL은 URI의 subset으로 URI는 식별자(identifier)의 역할을 하고 URL은 특정 위치를 가르킨다.
URL은 URI와는 달리, #fragment를 포함하지 않으며, ?query까지만 포함한다.</p>
<h1 id="구조">구조</h1>
<p>scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]</p>
<ul>
<li>scheme: 프로토콜 (http 또는 https)</li>
<li>user, password: 데이터에 접근하기 위한 사용자의 이름과 비밀번호</li>
<li>host, port: 접근할 서버의 host name (port number)</li>
<li>path: 접근할 서버의 경로에 대한 상세 정보</li>
<li>query: 접근할 대상에 전달하는 추가적인 정보</li>
<li>fragment: 서브 리소스를 접근할 때 필요한 정보</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[semantic versioning ]]></title>
            <link>https://velog.io/@beomjin_97/semantic-versioning</link>
            <guid>https://velog.io/@beomjin_97/semantic-versioning</guid>
            <pubDate>Mon, 02 Jan 2023 03:19:12 GMT</pubDate>
            <description><![CDATA[<h1 id="유의적-버전-semantic-versioning-semver">유의적 버전 (semantic versioning, SemVer)</h1>
<h3 id="majorminorpatch-예시--12141">Major.Minor.Patch (예시 : ^12.14.1)</h3>
<ul>
<li>Major: 기존 버전과 호환되지 않는 새로운 버전</li>
<li>Minor: 기존 버전과 호환되는 새로운 기능이 추가된 버전</li>
<li>Patch:  기존 버전과 호환되는 버그 및 오타 등이 수정된 버전</li>
<li>^: Major 버전 안에서 가장 최신 버전으로 업데이트 가능</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[네트워크 계층]]></title>
            <link>https://velog.io/@beomjin_97/network-layer</link>
            <guid>https://velog.io/@beomjin_97/network-layer</guid>
            <pubDate>Mon, 02 Jan 2023 03:00:28 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/beomjin_97/post/263c013a-4ef0-4a80-a512-d351265546a1/image.png" alt=""></p>
<h3 id="종단간연결의-추상적-설명">종단간연결의 추상적 설명</h3>
<ol>
<li>계층을 타고 내려가면서 패킷(주소 정보)이 감싸진다.</li>
<li>가장 아래 physical 계층까지 내려가고 연결을 위한 이동을 시작한다. </li>
<li>네트워크를 타고 이동하기 위해 네트워크 계층까지는 타고 올라가서 확인하고 다시 내려오기를 반복하며 이동한다. </li>
<li>목표 지점인 반대편 단말에 도착하여 계층을 타고 올라간다. </li>
</ol>
<h3 id="물리계층physical-layer">물리계층(physical layer)</h3>
<ul>
<li>물리적 매체를 통해서 비트 스트림 전송에 요구되는 기능을 담당 (기계적, 전기적, 전송매체)</li>
<li>물리적인 장치와 인터페이스가 전송을 위해 필요한 기능과 처리절차 규정</li>
<li>주요 기능 <ul>
<li>인터페이스와 매체의 물리적인 특성: 장치와 전송메체 간의 인터페이스 특성을 규정</li>
<li>비트의 표현 : 비트를 전송하기 위해 전기적 또는 광학적인 신호로 부호화</li>
<li>데이터속도 : 신호가 유지되는 비트의 주기를 설정</li>
<li>비트의 동기화 : 송신자와 수신자는 같은 클록을 사용</li>
</ul>
</li>
<li>프로토콜 <ul>
<li>MAC (medium access control) 필요<ul>
<li>자유경쟁 (선착순) : Aloha, Slotted Aloha, CSMA, CSMA/CD (IEEE 802.3)</li>
<li>Token </li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[basic concept]]></title>
            <link>https://velog.io/@beomjin_97/basic-concept</link>
            <guid>https://velog.io/@beomjin_97/basic-concept</guid>
            <pubDate>Mon, 02 Jan 2023 02:45:29 GMT</pubDate>
            <description><![CDATA[<p>네트워크 </p>
<ul>
<li>종단 시스템(end system) : PC나 스마트폰처럼 네트워크 송수신 주체</li>
<li>프로토콜(Protocol): 두 이종 시스템을 연결하기 위한 규약 (ex. http)</li>
<li>유선 또는 무선<br />


</li>
</ul>
<p>인터넷</p>
<ul>
<li>소규모의 네트워크에서 전세계 네트워크와 연결된 상태</li>
<li>종단 시스템은 일반적으로 ISP (Internet service provider)에 의해 연결<br />


</li>
</ul>
<p>OSI 7 계층</p>
<ul>
<li>네트워크 구성요소를 7개의 계층으로 역할을 나눈 표준 모델</li>
<li>각 계층별 역할을 통해 protocol을 충족</li>
<li>일부 하위계층은 하드웨어에서 구현</li>
<li>상위 계층은 소프트웨어에서 구현<br />


</li>
</ul>
<p>TCP/IP ( Transmission Control Protocol / Internet Protocol )</p>
<ul>
<li>OSI 7계층이 나오기전 사용되던 사실상 표준 역할<br />


</li>
</ul>
<p>IP address</p>
<ul>
<li>통신 자료를 최종적으로 전달하기 위해 필요한 송/수신 위치정보</li>
<li>IPv4 (10진법), 주소 부족으로 인해 IPv6 개발됨<br />


</li>
</ul>
<p>패킷 교환(Packet Switching)</p>
<ul>
<li>종단간에 전송되는 데이터를 패킷이라는 단위로 전달함</li>
<li>패킷은 네트워크를 통해 일정한 순서없이 보내지며 어떤 경로를 통해 이동되는지는 네트워크의 상황에 따라 다르다.<br />




</li>
</ul>
<p>통신을 통한 기본 동작 </p>
<ul>
<li>요청(Request) : 전송하는 종단 장치에서 상대방의 서비스를 요청한다.</li>
<li>인지(Indicate) : 수신하는 장치에서 작업 요청을 확인한다.</li>
<li>응답(Response) : 수신하는 장치에서 요청 받은 작업에 대해 적절히 응답한다.</li>
<li>확인(Confirm) : 전송 측에서 응답 데이터를 최종적으로 확인한다.<br />


</li>
</ul>
<p>네트워크의 유형</p>
<ul>
<li>LAN (Local Area Network) : 일정 그룹의 지역 네트워크 (집, 사무실), 시설망등을 구축해 연결</li>
<li>WAN (Wide Area Network) : 원거리 통신망 (국가, 대륙)<br />


</li>
</ul>
<p>네트워크 토폴로지</p>
<ul>
<li>Ring Topology : 기기와 기기 간의 연결</li>
<li>Bus Topology : 하나의 메인 회선을 설치하고 그 회선에 각 기기를 연결</li>
<li>Star Topology : 허브가 존재하고 허브에 각 기기의 회선을 끌어와서 연결</li>
<li>Mesh Topology: 각 기기가 여러 기기와 연결</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Database]]></title>
            <link>https://velog.io/@beomjin_97/Database</link>
            <guid>https://velog.io/@beomjin_97/Database</guid>
            <pubDate>Thu, 29 Dec 2022 11:57:01 GMT</pubDate>
            <description><![CDATA[<p>데이터베이스</p>
<p>특정 조직의 여러 사용자가 공유하여 사용할 수 있도록 통합해서 저장한 운영 데이터의 집합</p>
<ul>
<li><p>실시간 접근 가능</p>
</li>
<li><p>계속적으로 변화 </p>
</li>
<li><p>동시 공유가 가능</p>
</li>
<li><p>저장된 주소가 아닌 내용으로 참조 가능</p>
<br />

</li>
</ul>
<p>데이터의 유형</p>
<ul>
<li>structured data (정형 데이터) : excel의 스프레드시트, 관계데이터베이스의 테이블, sql</li>
<li>semi-structured data (반정형 데이터) : HTML, XML, JSON</li>
<li>unstructured data( 비정형 데이터) ; 정해진 구조가 없이 저장된 데이터, text, 멀티미디어 </li>
</ul>
<br />

<p>DBMS 대신 file system을 사용했을 때의 문제점</p>
<ul>
<li>데이터 중복으로 인한 리소스 낭비</li>
<li>업데이트 및 데이터 일관성 유지 어려움</li>
<li>데이터 무결성(data integrity constraints) 유지 어려움</li>
<li>응용프로그램이 파일 데이터에 종속됨, 파일구조가 바뀔 때마다 응용 프로그램 교체 필요</li>
<li>여러 사용자가 동시에 접근할 때 동시성 제공이 어려움</li>
<li>파일 변경 중에 시스템 장애가 발생했을 때 처리가 어려움</li>
<li>사용자 별 파일 안에 일부 데이터 읽기 권한 제어가 어려움</li>
</ul>
<p>DBMS</p>
<ul>
<li>파일시스템의 데이터중복과 데이터 종속 문제를 해결하기 위해 제시된 스포트웨어 </li>
<li>데이터베이스의 생성과 관리를 담당</li>
<li>모든 응용프로그램은 데이터베이스 공유 가능, DBMS를 통해 삽입, 수정, 검색</li>
<li>Oracle, MS SQL Server, Sap HANA, MySQL, PostergreSQL<br />

</li>
</ul>
<p>DMBS의 주요기능</p>
<ul>
<li>데이터베이스 구조를 정의하거나 수행</li>
<li>데이터를 삽입, 삭제, 수정, 검색하는 연산을 수행</li>
<li>데이터를 항상 정확하고, 안전하게 유지<br />

</li>
</ul>
<p>DBMS의 장점</p>
<ul>
<li>file system에서 언급했던 문제점을 모두 해결할 수 있다. <br />

</li>
</ul>
<p>DBMS의 단점</p>
<ul>
<li>구매 비용</li>
<li>데이터에 직접적인 접근이 아닌 DBMS를 통해 접근하기 때문에 추가적인 오버헤드 발생</li>
<li>DBMS의 동작원리와 표준 데이터 언어에 대한 지식 필요</li>
<li>DBMS의 장애가 발생하면 모든 프로그램이 같이 장애 발생<br />


</li>
</ul>
<p>Data Dictiionary</p>
<ul>
<li>DBMS는 database와 함께 metadata를 저장한다.</li>
<li>데이터 정의어(DDL)에 의해 생성된다.<br />


</li>
</ul>
<p>Metadata</p>
<ul>
<li>각 데이터에 접근할 수 있는 데이터의 이름 (테이블, 컬럼 이름)</li>
<li>스토리지에 데이터가 저장된 위치</li>
<li>보안을 위한 제약 (어던 사용자가 어떤 데이터에 접근할 수 있는지)</li>
<li>무결정을 위한 제약 (어떤 값이 데이터에 유효한지) <br />

</li>
</ul>
<p>스키마(schema)</p>
<ul>
<li>데이터베이스에 저장되는 데이터의 논리적구조와 제약조건을 정의한 것<br />

</li>
</ul>
<p>인스턴스</p>
<ul>
<li>정의된 스키마에 따라 데이터베이스에 실제로 저장된 값<br />

</li>
</ul>
<p>데이터언어</p>
<ul>
<li>사용자가 데이터베이스를 구축하고 이에 접근하기 위해 데이터베이스 관리 시스템과 통신하는 수단</li>
<li>데이터 정의어(DDL) : 스키마 구조와 제약조건 등을 정의, 삭제, 수정</li>
<li>데이터 조작어(DML) : 데이터의 삽입, 삭제, 수정, 검색</li>
<li>데이터 제어어(DCL) : 내부적으로 필요한 규칙 (보안, 무결성 체크) 등을 정의하는 데이터 언어<br />

</li>
</ul>
<p>질의처리기</p>
<ul>
<li>DDL Interpreter: DDL로 작성된 스키마의 정의를 해석, 데이터 딕셔너리에 저장</li>
<li>DML Compiler: DML로 작성된 데이터 처리 요구를 processing engine이 이해할 수 있는 코드로 해석하여 plan을 작성</li>
<li>DML(Query) Processing Engine: 컴파일된 plan을 데이터베이스에 실제로 실행</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Intro]]></title>
            <link>https://velog.io/@beomjin_97/Intro</link>
            <guid>https://velog.io/@beomjin_97/Intro</guid>
            <pubDate>Wed, 28 Dec 2022 08:44:50 GMT</pubDate>
            <description><![CDATA[<p>자료구조</p>
<ul>
<li>자료를 담는 추상적인 틀</li>
<li>컴퓨터의 자원이 한정적이기 때문에 제약된 조건내에서 최선의 결과를 내야 한다.</li>
<li>데이터의 형태와 쓰임에 가장 적합한 자료구조를 써야한다.</li>
</ul>
<br />

<p>알고리즘</p>
<ul>
<li>어떤 문제가 주어졌을 때, 문제를 풀기위한 동작 절차</li>
</ul>
<br />

<p>점근 표기법</p>
<ul>
<li>빅오 표기법 : 상한 점근</li>
<li>세타 표기법 : 상한/하한 점근</li>
<li>오메가 표기법 : 하한 점근</li>
</ul>
<br />

<p>빅오(Big-O) 표기법</p>
<ul>
<li>가장 큰 영향력이 있는 항만 표시 : O(N^3 + N^2 + N) -&gt; O(N^3)</li>
<li>계수는 무시 : O(2N + 1) -&gt; O(N)</li>
<li>O(1) &lt; O(logN) &lt; O(N) &lt; O(NlogN) &lt; O(N^2) &lt; O(2^N)</li>
</ul>
<br />

<p>공간 복잡도</p>
<ul>
<li>데이터 관리에 필요한 공간</li>
<li>데이터 양의 변화에 따른 공간의 변화</li>
<li>예상 소요 공간 측정</li>
</ul>
<br/>

<p>시간 복잡도</p>
<ul>
<li>데이터 처리에 소요되는 시간</li>
<li>데이터 양의 변화에 따른 소요 시간의 변화</li>
<li>지연장애가 발생했을 때의 근거를 찾을 수 있다.</li>
<li>O(1) : 입력 데이터의 크기와 상관없이 항상 일정한 시간이 걸리는 알고리즘 ( 배열의 random aceess, Hash )</li>
<li>O(N) : 입력 데이터의 크기에 비례해서 시간이 소요되는 알고리즘 ( for 문 )</li>
<li>O(logN) : 이진탐색 (Binary search)</li>
<li>O(N^2) : 입력 데이터의 제곱에 비례해서 시간이 소요되는 알고리즘 ( 2중 for 문)</li>
<li>O(NlogN) : Merge sort</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[0. Rewind 프로젝트 시작   ]]></title>
            <link>https://velog.io/@beomjin_97/0.-Rewind-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%8B%9C%EC%9E%91</link>
            <guid>https://velog.io/@beomjin_97/0.-Rewind-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%8B%9C%EC%9E%91</guid>
            <pubDate>Wed, 28 Dec 2022 08:37:46 GMT</pubDate>
            <description><![CDATA[<h1 id="목표">목표</h1>
<p>서버사이드 렌더링을 사용해야 하거나 또는 SEO가 필요할 때 많이 사용되는 프레임워크인 next.js를 사용해서 풀스택 프로젝트를 만들어 보고자 한다.</p>
<p>본 프로젝트의 목적은 첫째로 next.js에서 제공되는 다양한 기능을 써보며 사용 방법에 익숙해지는 것, 둘째는 앞으로 웹 개발을 함에 있어서 next.js를 도입할 수 있을지에 대해 판단해보는 것이다.    </p>
<p>본 프로젝트에서 사용되는 기능이 반드시 필요하지 않는 기능도 많겠지만 최대한 많은 기능을 활용해 볼 것이다.</p>
<h1 id="구상">구상</h1>
<p>기존에 React와 Express를 이용해 개발한 Rewind라는 프로젝트가 있었다. 기존 프로젝트에서 부족했던 부분을 보완하여 next.js로 migration 할 것이다. (현재 next.js 13 버전이 출시되었지만 12버전으로 개발)</p>
<p>최소한의 setup 이후에 배포부터 할 것이며 배포는 next.js를 개발한 vercel을 이용할 것이다. </p>
]]></description>
        </item>
    </channel>
</rss>