<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>wi___s10.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Sun, 18 Aug 2024 13:16:31 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>wi___s10.log</title>
            <url>https://velog.velcdn.com/images/wi___s10/profile/242b45b9-c851-4df8-b904-89be0b76197b/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. wi___s10.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/wi___s10" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[모던 JavaScript 튜토리얼 뽀개기 - 파트 1, 소개]]></title>
            <link>https://velog.io/@wi___s10/%EB%AA%A8%EB%8D%98-JavaScript-%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC-%EB%BD%80%EA%B0%9C%EA%B8%B0-%ED%8C%8C%ED%8A%B8-1-%EC%86%8C%EA%B0%9C</link>
            <guid>https://velog.io/@wi___s10/%EB%AA%A8%EB%8D%98-JavaScript-%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC-%EB%BD%80%EA%B0%9C%EA%B8%B0-%ED%8C%8C%ED%8A%B8-1-%EC%86%8C%EA%B0%9C</guid>
            <pubDate>Sun, 18 Aug 2024 13:16:31 GMT</pubDate>
            <description><![CDATA[<p> React, Next를 사용하며 무의식적으로 코드를 치던 나날, javascript가 어떻게 동작하는지도 자세히 모르는데 이래도 되나? 라는 생각이 들어 스터디를 하자!고 다짐했다.</p>
<p>앞으로의 모든 글은 <a href="https://ko.javascript.info">https://ko.javascript.info</a> 의 글을 읽고, 나의 언어로 다시 작성하여, 기억장치에 저장하는 것을 목표로 한다.</p>
<h1 id="소개">소개</h1>
<h2 id="자바스크립트란">자바스크립트란?</h2>
<blockquote>
<p>웹 페이지에 생동감을 불어넣기 위한 언어</p>
</blockquote>
<p>보통 웹페이지의 HTML 안에 작성하거나 불러와서 웹페이지를 불러올 때 스크립트가 자동으로 실행된다.</p>
<p>자바스크립트 엔진에서 돌아가며, 브라우저엔 &#39;자바스크립트 가상 머신&#39;이라는 불리는 엔진이 내장되어있다. ex)크롬 v8</p>
<p>브라우저를 대상으로 만든 언어이기 때문에 메모리나 CPU 같은 저수준 영역의 조작을 허용하지 않는다. 따라서 안전한 프로그래밍 언어라고 표현한 듯 하다!</p>
<p>TypeScript, Dart 등을 트랜스파일(보이지 않는 곳에서 이외의 언어로 자동 변환해해주는 것) 할 수 있다.</p>
<h3 id="메뉴얼">메뉴얼</h3>
<p>어느 정도 익숙해진 후, 더 필요한 자료가 있을 때 명세서를 참고하면 좋다.</p>
<p><a href="https://ecma-international.org/">https://ecma-international.org/</a></p>
<p>영어로 되어 있어 상당히 어질어질하다..</p>
<h3 id="명세서">명세서</h3>
<p>특정 함수나 메서드와 관련 정보를 찾고 싶을땐, MDN 사이트를 보면 좋다~</p>
<p>나도 몇 번 들어가본 적 있는 것 같다..</p>
<p><a href="https://developer.mozilla.org/ko/">https://developer.mozilla.org/ko/</a></p>
<h3 id="호환성-표">호환성 표</h3>
<p>자바스크립트는 끊임없이 변환하기 때문에, 때론 브라우저에서 기능을 지원하지 않을 수 있다.</p>
<p><a href="https://compat-table.github.io/compat-table/es6/">https://compat-table.github.io/compat-table/es6/</a></p>
<p>브라우저를 기준으로 한 표 형태</p>
<p><a href="https://caniuse.com/">https://caniuse.com/</a></p>
<p>기능을 기준으로 한 표 형태</p>
<p>요즘은 babel 같은 걸로 해결해서, 처음 몇 번 들어가본 적 밖에 없는 듯 하다.</p>
<h2 id="개발자-콘솔">개발자 콘솔</h2>
<p>에러를 보고, 고칠 수 있게 해준다!</p>
<h2 id="자바스크립트란-1">자바스크립트란?</h2>
<blockquote>
<p>웹 페이지에 생동감을 불어넣기 위한 언어</p>
</blockquote>
<p>보통 웹페이지의 HTML 안에 작성하거나 불러와서 웹페이지를 불러올 때 스크립트가 자동으로 실행된다.</p>
<p>자바스크립트 엔진에서 돌아가며, 브라우저엔 &#39;자바스크립트 가상 머신&#39;이라는 불리는 엔진이 내장되어있다. ex)크롬 v8</p>
<p>브라우저를 대상으로 만든 언어이기 때문에 메모리나 CPU 같은 저수준 영역의 조작을 허용하지 않는다. 따라서 안전한 프로그래밍 언어라고 표현한 듯 하다!</p>
<p>TypeScript, Dart 등을 트랜스파일(보이지 않는 곳에서 이외의 언어로 자동 변환해해주는 것) 할 수 있다.</p>
<h3 id="메뉴얼-1">메뉴얼</h3>
<p>어느 정도 익숙해진 후, 더 필요한 자료가 있을 때 명세서를 참고하면 좋다.</p>
<p><a href="https://ecma-international.org/">https://ecma-international.org/</a></p>
<p>영어로 되어 있어 상당히 어질어질하다..</p>
<h3 id="명세서-1">명세서</h3>
<p>특정 함수나 메서드와 관련 정보를 찾고 싶을땐, MDN 사이트를 보면 좋다~</p>
<p>나도 몇 번 들어가본 적 있는 것 같다..</p>
<p><a href="https://developer.mozilla.org/ko/">https://developer.mozilla.org/ko/</a></p>
<h3 id="호환성-표-1">호환성 표</h3>
<p>자바스크립트는 끊임없이 변환하기 때문에, 때론 브라우저에서 기능을 지원하지 않을 수 있다.</p>
<p><a href="https://compat-table.github.io/compat-table/es6/">https://compat-table.github.io/compat-table/es6/</a></p>
<p>브라우저를 기준으로 한 표 형태</p>
<p><a href="https://caniuse.com/">https://caniuse.com/</a></p>
<p>기능을 기준으로 한 표 형태</p>
<p>요즘은 babel 같은 걸로 해결해서, 처음 몇 번 들어가본 적 밖에 없는 듯 하다.</p>
<h2 id="개발자-콘솔-1">개발자 콘솔</h2>
<p>에러를 보고, 고칠 수 있게 해준다!</p>
<h3 id="chrome">Chrome</h3>
<p>Lighthouse(성능 분석 툴)이라든지, 이외에도 잘 되어 있어서 Chrome으로 개발하는 편이다. </p>
<p>Safari는 왜인지 모르게 폰트 적용이 안된다거나 UI가 깨지는 경우가 곧잘 발생한다.</p>
<p>왜인지는 모르겠지만, 나중에 알아봐야겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Debounce, Throttle]]></title>
            <link>https://velog.io/@wi___s10/Debounce-Throttle</link>
            <guid>https://velog.io/@wi___s10/Debounce-Throttle</guid>
            <pubDate>Tue, 13 Aug 2024 05:22:01 GMT</pubDate>
            <description><![CDATA[<h3 id="debounce-throttle를-사용하는-이유">Debounce, Throttle를 사용하는 이유?</h3>
<p><strong>Throttle</strong>과 <strong>Debounce</strong>는 사용자 입력이나 이벤트를 효율적으로 처리하기 위해 사용한다. 두 방법 모두 성능을 향상시키고, 불필요한 작업을 방지하는 데 좋다. 적용 시점과 처리 방식이 좀 다르다.</p>
<h2 id="throttle">Throttle</h2>
<blockquote>
<p>여러 번 발생하는 이벤트를 일정 시간 동안 한 번만 실행</p>
</blockquote>
<p>이벤트가 발생하는 빈도를 제한하여, 특정 시간 간격마다 이벤트 핸들러를 실행한다.</p>
<p><strong>예시 코드</strong></p>
<pre><code class="language-javascript">function throttle(func, limit) {
  let lastFunc;
  let lastRan;
  return function() {
    const context = this;
    const args = arguments;
    if (!lastRan) {
      func.apply(context, args);
      lastRan = Date.now();
    } else {
      if (lastFunc) clearTimeout(lastFunc);
      lastFunc = setTimeout(function() {
        if ((Date.now() - lastRan) &gt;= limit) {
          func.apply(context, args);
          lastRan = Date.now();
        }
      }, limit - (Date.now() - lastRan));
    }
  }
}

window.addEventListener(&#39;scroll&#39;, throttle(() =&gt; {
  console.log(&#39;Scroll event handler called!&#39;);
}, 500));</code></pre>
<p>위 코드는 스크롤 이벤트가 500ms마다 한 번만 처리되도록 한다.</p>
<h2 id="debounce">Debounce</h2>
<blockquote>
<p>여러 번 발생하는 이벤트에서 가장 마지막 이벤트만을 실행</p>
</blockquote>
<p>이벤트가 발생한 후 일정 시간 동안 추가 이벤트가 발생하지 않으면 핸들러를 실행한다.</p>
<p><strong>예시 코드</strong> (Debounce):</p>
<pre><code class="language-javascript">function debounce(func, delay) {
  let timeout;
  return function() {
    const context = this;
    const args = arguments;
    clearTimeout(timeout);
    timeout = setTimeout(() =&gt; func.apply(context, args), delay);
  }
}

const searchInput = document.getElementById(&#39;search&#39;);
searchInput.addEventListener(&#39;input&#39;, debounce(function() {
  console.log(&#39;Search input changed:&#39;, this.value);
}, 500));</code></pre>
<p>위 코드는 입력이 끝난 후 500ms 동안 추가 입력이 없으면 이벤트 핸들러를 실행하도록 한다.</p>
<h3 id="throttle-debounce가-무슨-차이임"><strong>Throttle, Debounce가 무슨 차이임?</strong></h3>
<p>정리하자면, <strong>Throttle</strong> 와 <strong>Debounce</strong> 의 차이점은 이벤트를 언제 발생시킬지의 <strong>시점 차이</strong>이다.</p>
<p><strong>Debounce</strong> 는 입력이 끝날 때까지 무한적으로 기다리지만, <strong>Throttle</strong> 는 입력이 시작되면, 일정 주기로 계속 실행한다.</p>
<hr>
<p>참고 링크: <a href="https://pks2974.medium.com/throttle-%EC%99%80-debounce-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC%ED%95%98%EA%B8%B0-2335a9c426ff">https://pks2974.medium.com/throttle-와-debounce-개념-정리하기-2335a9c426ff</a></p>
<p>정말 잘 되어있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[OpenAI API와 Streamlit으로 삼국지 전문가 생성하기]]></title>
            <link>https://velog.io/@wi___s10/OpenAI-API%EC%99%80-Streamlit%EC%9C%BC%EB%A1%9C-%EC%82%BC%EA%B5%AD%EC%A7%80-%EC%A0%84%EB%AC%B8%EA%B0%80-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@wi___s10/OpenAI-API%EC%99%80-Streamlit%EC%9C%BC%EB%A1%9C-%EC%82%BC%EA%B5%AD%EC%A7%80-%EC%A0%84%EB%AC%B8%EA%B0%80-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 26 Jun 2024 00:15:38 GMT</pubDate>
            <description><![CDATA[<p> 삼국지는 우리나라 고전 가운데서도 가장 유명하고 중요한 작품 중 하나입니다. 삼국시대의 역사와 인물, 사건 등을 다루고 있어 많은 사람들이 관심을 가지고 있죠. 하지만 방대한 분량 때문에 전문적인 지식 없이는 삼국지를 제대로 이해하기 어려울 수 있습니다.
 이번 포스트에서는 OpenAI의 GPT-3 API와 Streamlit 라이브러리를 활용하여 &#39;삼국지 전문가&#39; AI 어시스턴트를 만들고, 이를 웹 애플리케이션으로 구현해봤습니다.</p>
<h1 id="1-assistant-thread-작성">1. Assistant, Thread 작성</h1>
<pre><code> import openai
from dotenv import load_dotenv
import time
import logging
from datetime import datetime
import requests
from bs4 import BeautifulSoup

load_dotenv()
client = openai.OpenAI()
model = &quot;gpt-3.5-turbo-16k&quot;

url = &quot;https://namu.wiki/w/삼국지&quot;
response = requests.get(url)
html_content = response.content

# Step 2: Parse the HTML content and extract the relevant information
soup = BeautifulSoup(html_content, &#39;html.parser&#39;)
page_content = soup.get_text()

instructions = f&quot;&quot;&quot;
너는 삼국지 전문가이다. 
누군가 삼국지 관련 질문을 하면
간단하고 명확하게 대답해주되, 
삼국지의 역사와 인물, 사건 등에 대해 상세히 설명해줘.
{page_content}
&quot;&quot;&quot;

# Create assistant
three_kingdoms_expert = client.beta.assistants.create(
    name=&quot;삼국지 전문가&quot;,
    instructions=instructions,
    model=model
)

print(three_kingdoms_expert.id)
# Create a thread and send a message
thread = client.beta.threads.create(
    messages=[
        {
            &quot;role&quot;: &quot;user&quot;,
            &quot;content&quot;: &quot;삼국지 시대 유명한 인물들은 누구인가요?&quot;
        }
    ]
)
print(thread.id)</code></pre><h1 id="2-실행">2. 실행</h1>
<pre><code> # Send a follow-up message
message = &quot;삼국지 시대에서 유명한 인물이 누구야?&quot;
message = client.beta.threads.messages.create(
    thread_id=thread_id,
    role=&quot;user&quot;,
    content=message
)

run = client.beta.threads.runs.create(
    assistant_id=personal_trainer_assis_id,
    thread_id=thread_id,
    instructions=&quot;사용자를 주공이라고 불러줘.&quot;
)

def wait_for_run_completion(client, thread_id, run_id, sleep_interval=5):
    &quot;&quot;&quot;
    Waits for a run to complete and prints the elapsed time.
    :param client: The OpenAI client object.
    :param thread_id: The ID of the thread.
    :param run_id: The ID of the run.
    :param sleep_interval: Time in seconds to wait between checks.
    &quot;&quot;&quot;
    while True:
        try:
            run = client.beta.threads.runs.retrieve(thread_id=thread_id, run_id=run_id)
            if run.completed_at:
                elapsed_time = run.completed_at - run.created_at
                formatted_elapsed_time = time.strftime(
                    &quot;%H:%M:%S&quot;, time.gmtime(elapsed_time)
                )
                print(f&quot;Run completed in {formatted_elapsed_time}&quot;)
                logging.info(f&quot;Run completed in {formatted_elapsed_time}&quot;)
                # Get messages here once Run is completed!
                messages = client.beta.threads.messages.list(thread_id=thread_id)
                last_message = messages.data[0]
                response = last_message.content[0].text.value
                print(f&quot;Assistant Response: {response}&quot;)
                break
        except Exception as e:
            logging.error(f&quot;An error occurred while retrieving the run: {e}&quot;)
            break
        logging.info(&quot;Waiting for run to complete...&quot;)
        time.sleep(sleep_interval)

# === Run ===
wait_for_run_completion(client=client, thread_id=thread_id, run_id=run.id)

# ==== Steps --- Logs ==
run_steps = client.beta.threads.runs.steps.list(thread_id=thread_id, run_id=run.id)
print(f&quot;Steps---&gt; {run_steps.data[0]}&quot;)</code></pre><p> <img src="https://velog.velcdn.com/images/wi___s10/post/2eebb3ef-5d3e-4b26-acf3-0c1c5bcfa674/image.png" alt="">
 잘 나오죠?
 이제 이 코드를 Streamlit으로 변환해봅시다</p>
<h1 id="3streamlit">3.Streamlit</h1>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/6e683197-4d95-49c7-ae3c-e05eed460575/image.png" alt="">
똑똑한 친구가 잘 대답해 줍니다.
이를 실행시켜봅시다~
<img src="https://velog.velcdn.com/images/wi___s10/post/a19b5040-7599-4663-8669-6bae2cc0964b/image.png" alt="">
답변을 잘 해주네요~~ 
근데 좀 안이쁘죠? 스타일을 가미해봅시다.
<img src="https://velog.velcdn.com/images/wi___s10/post/1f2e730b-5b9b-4470-9eaa-c8d1c3cd931e/image.png" alt="">
<img src="https://velog.velcdn.com/images/wi___s10/post/0549bd2c-6703-4992-a572-db0f4e3b4216/image.png" alt=""></p>
<p> 예를 들어 &quot;삼국시대 유명한 인물들은 누구인가요?&quot;라고 질문하면, 어시스턴트는 제갈공명, 관우, 조조 등 유명 인물들에 대해 상세히 설명해줄 것입니다. 삼국지 관련한 것만 무엇이든 물어보세요.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[NBA 선수들의 성적과 연봉을 분석하여 보자]]></title>
            <link>https://velog.io/@wi___s10/NBA-%EC%84%A0%EC%88%98%EB%93%A4%EC%9D%98-%EC%84%B1%EC%A0%81%EA%B3%BC-%EC%97%B0%EB%B4%89%EC%9D%84-%EB%B6%84%EC%84%9D%ED%95%98%EC%97%AC-%EB%B3%B4%EC%9E%90</link>
            <guid>https://velog.io/@wi___s10/NBA-%EC%84%A0%EC%88%98%EB%93%A4%EC%9D%98-%EC%84%B1%EC%A0%81%EA%B3%BC-%EC%97%B0%EB%B4%89%EC%9D%84-%EB%B6%84%EC%84%9D%ED%95%98%EC%97%AC-%EB%B3%B4%EC%9E%90</guid>
            <pubDate>Tue, 04 Jun 2024 05:54:17 GMT</pubDate>
            <description><![CDATA[<h3 id="nba의-연봉은-실력-순인가-데이터-분석을-통해-알아보기">NBA의 연봉은 실력 순인가? 데이터 분석을 통해 알아보기</h3>
<p>NBA 선수들의 연봉이 과연 실력에 비례하는지에 대해 알아보았다. 이를 위해 두 가지 주요 데이터를 분석하였으며, 선수들의 경기당 평균 득점(PPG)과 연봉을 중심으로 상관관계를 살펴보았다.</p>
<h4 id="1-데이터-수집-및-준비">1. 데이터 수집 및 준비</h4>
<p>두 개의 CSV 파일을 사용하였다. 첫 번째 파일에는 선수들의 생애 통계 데이터가, 두 번째 파일에는 1985년부터 2018년까지의 연봉 데이터가 포함되어 있었다. 데이터는 다음과 같이 준비하였다:</p>
<ul>
<li><strong>선수 통계 데이터</strong>: 각 선수의 생애 동안의 평균 득점(PPG)을 계산하기 위해 총 득점(career_PTS)과 경기 수(career_G)를 사용하였다.</li>
<li><strong>연봉 데이터</strong>: 각 시즌별 선수들의 연봉이 포함되어 있었다.</li>
</ul>
<p>이 두 데이터를 선수 ID를 기준으로 병합하여 각 선수의 생애 평균 득점과 연봉을 한 데이터프레임에 담았다.</p>
<h4 id="2-데이터-분석">2. 데이터 분석</h4>
<p>주요 분석 방법으로 산점도와 피어슨 상관 계수를 사용하였다. 피어슨 상관 계수는 두 변수 간의 선형 상관관계를 측정하는데, -1에서 1 사이의 값을 가진다. 1에 가까울수록 강한 양의 상관관계를, -1에 가까울수록 강한 음의 상관관계를 나타낸다.</p>
<pre><code class="language-python">import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import pearsonr

# Load and prepare the data
players_df = pd.read_csv(&#39;players.csv&#39;)
salaries_df = pd.read_csv(&#39;salaries_1985to2018.csv&#39;)
players_df[&#39;career_PPG&#39;] = players_df[&#39;career_PTS&#39;] / players_df[&#39;career_G&#39;]
players_relevant = players_df[[&#39;name&#39;, &#39;_id&#39;, &#39;career_PPG&#39;]]
salaries_relevant = salaries_df[[&#39;player_id&#39;, &#39;salary&#39;, &#39;season&#39;]]
merged_df = pd.merge(players_relevant, salaries_relevant, left_on=&#39;_id&#39;, right_on=&#39;player_id&#39;)

# Calculate correlation
correlation, p_value = pearsonr(merged_df[&#39;career_PPG&#39;], merged_df[&#39;salary&#39;])

# Plotting the relationship
plt.figure(figsize=(10, 6))
sns.scatterplot(x=&#39;career_PPG&#39;, y=&#39;salary&#39;, data=merged_df)
plt.title(f&#39;Correlation between NBA Player PPG and Salary (r = {correlation:.2f})&#39;)
plt.xlabel(&#39;Career Points Per Game (PPG)&#39;)
plt.ylabel(&#39;Salary ($)&#39;)
plt.grid(True)
plt.show()

print(f&#39;Correlation: {correlation}, P-value: {p_value}&#39;)</code></pre>
<h4 id="3-분석-결과">3. 분석 결과</h4>
<p>위의 코드를 실행한 결과, PPG와 연봉 사이의 피어슨 상관 계수는 -0.0548로 나타났다. 이는 매우 약한 음의 상관관계를 의미하며, 사실상 두 변수 사이에 거의 상관관계가 없음을 시사한다. 또한, p-값이 매우 작게 나와 통계적으로 유의미하지만, 실질적인 상관관계는 거의 없다고 볼 수 있다.</p>
<h4 id="4-결론">4. 결론</h4>
<p>분석 결과, NBA 선수들의 연봉은 경기당 평균 득점(PPG)과는 거의 상관관계가 없는 것으로 나타났다. 이는 선수들의 연봉이 단순히 득점 능력만으로 결정되지 않음을 의미한다. 실제로, 연봉은 선수의 다재다능함, 수비 능력, 팀 기여도, 마케팅 가치 등 다양한 요소에 의해 영향을 받는다.</p>
<p>따라서, NBA의 연봉은 단순히 실력(여기서는 PPG로 측정된)에 따라 결정된다고 보기 어렵다. 이러한 결과는 선수들의 다양한 가치를 반영하는 복합적인 요소들이 연봉 결정에 중요한 역할을 한다는 것을 보여준다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[롤 챔피언 스탯을 분석하여 보자-1]]></title>
            <link>https://velog.io/@wi___s10/%EB%A1%A4-%EC%B1%94%ED%94%BC%EC%96%B8-%EC%8A%A4%ED%83%AF%EC%9D%84-%EB%B6%84%EC%84%9D%ED%95%98%EC%97%AC-%EB%B3%B4%EC%9E%90-1</link>
            <guid>https://velog.io/@wi___s10/%EB%A1%A4-%EC%B1%94%ED%94%BC%EC%96%B8-%EC%8A%A4%ED%83%AF%EC%9D%84-%EB%B6%84%EC%84%9D%ED%95%98%EC%97%AC-%EB%B3%B4%EC%9E%90-1</guid>
            <pubDate>Wed, 08 May 2024 05:33:16 GMT</pubDate>
            <description><![CDATA[<h1 id="pandas-기본-문법">Pandas 기본 문법</h1>
<p>pandas를 이용해 제목처럼 할 것이다. 제목처럼 하기 전에 기본 문법을 알아보자.</p>
<h2 id="데이터프레임-만들기">데이터프레임 만들기</h2>
<pre><code>import numpy as np
import pandas as pd

columns = [&#39;축구&#39;, &#39;맛집&#39;, &#39;피파&#39;, &#39;노래&#39;, &#39;연애&#39;]
index = [2024, 2023, 2022, 2021]

seokjin = np.array([
    [10, 60, 100, 60, 100],
    [100, 50, 100, 40, 100],
    [100, 70, 100, 10, 0],
    [100, 75, 100, 0, 0],
])

seokjin_table = pd.DataFrame(seokjin, index=index, columns=columns)</code></pre><p><img src="https://velog.velcdn.com/images/wi___s10/post/68b3bbdf-5f8a-4a1a-9b60-c6fd84810f3b/image.png" alt="">
김석진 씨의 도파민 테이블이다.</p>
<h2 id="데이터-접근">데이터 접근</h2>
<pre><code>seokjin_table.축구</code></pre><p><img src="https://velog.velcdn.com/images/wi___s10/post/79c33db1-f7e6-41de-892b-fdd159534cdc/image.png" alt=""></p>
<h2 id="데이터-합치기">데이터 합치기</h2>
<p>concat을 이용해 합칠 수 있다.</p>
<pre><code>pd.concat([df1,df2])</code></pre><p><img src="https://velog.velcdn.com/images/wi___s10/post/341346e3-39cd-45cd-82f8-2c0765402348/image.png" alt=""></p>
<h2 id="열-삭제하기">열 삭제하기</h2>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/f63167a7-d488-4cd7-9677-cd3ca9b26751/image.png" alt=""></p>
<h1 id="제목-하기">제목 하기</h1>
<ol>
<li>데이터 불러오기
<a href="https://oracleselixir.com/stats/players/byTournament/LCK%2F2024%20Season%2FSpring%20Season">https://oracleselixir.com/stats/players/byTournament/LCK%2F2024%20Season%2FSpring%20Season</a>
위 사이트에서 데이터를 다운받았다.<pre><code>import pandas as pd
</code></pre></li>
</ol>
<p>df = pd.read_csv(&#39;./LCK 2024 Spring - Player Stats - OraclesElixir.csv&#39;)</p>
<pre><code>2. dataframe.describe()로 값 확인하기</code></pre><p>df.describe()</p>
<pre><code>![](https://velog.velcdn.com/images/wi___s10/post/762f9c05-7226-4a81-8460-c2006ccf3778/image.png)
3. 포지션 기준으로 테이블 분리하기
포지션을 기준으로 정렬한 후 분리했다.</code></pre><p>grouped_df = {pos: group for pos, group in df.groupby(&#39;Pos&#39;)}</p>
<p>top = grouped_df[&#39;Top&#39;]
jungle = grouped_df[&#39;Jungle&#39;]
mid = grouped_df[&#39;Middle&#39;]
adc = grouped_df[&#39;ADC&#39;]
sup = grouped_df[&#39;Support&#39;]</p>
<pre><code>원딜 그룹만 가져왔다.
![](https://velog.velcdn.com/images/wi___s10/post/f9afe3db-57e4-4c94-ac45-39f7b8369811/image.png)

잘 나옴.
4. TOP 10 챔피언을 표시하자</code></pre><p>top[&#39;P+B%&#39;] = top[&#39;P+B%&#39;].str.rstrip(&#39;%&#39;).astype(float)
jungle[&#39;P+B%&#39;] = jungle[&#39;P+B%&#39;].str.rstrip(&#39;%&#39;).astype(float)
mid[&#39;P+B%&#39;] = mid[&#39;P+B%&#39;].str.rstrip(&#39;%&#39;).astype(float)
adc[&#39;P+B%&#39;] = adc[&#39;P+B%&#39;].str.rstrip(&#39;%&#39;).astype(float)
sup[&#39;P+B%&#39;] = sup[&#39;P+B%&#39;].str.rstrip(&#39;%&#39;).astype(float)</p>
<p>top_top10 = top.nlargest(10, &#39;P+B%&#39;)
jungle_top10 = jungle.nlargest(10, &#39;P+B%&#39;)
mid_top10 = mid.nlargest(10, &#39;P+B%&#39;)
adc_top10 = adc.nlargest(10, &#39;P+B%&#39;)
sup_top10 = sup.nlargest(10, &#39;P+B%&#39;)</p>
<p>print(top_top10)</p>
<pre><code>이상하게 데이터 타입 변환을 안 하면 에러가 뜬다.
아무튼 잘 된다.
![](https://velog.velcdn.com/images/wi___s10/post/966ff316-6213-460d-b37d-61ef334cd6cc/image.png)
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[회귀분석 프로젝트]]></title>
            <link>https://velog.io/@wi___s10/%ED%9A%8C%EA%B7%80%EB%B6%84%EC%84%9D-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</link>
            <guid>https://velog.io/@wi___s10/%ED%9A%8C%EA%B7%80%EB%B6%84%EC%84%9D-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</guid>
            <pubDate>Tue, 30 Apr 2024 05:50:57 GMT</pubDate>
            <description><![CDATA[<p>학교 과제인 회귀분석 프로젝트를 시작하도록 하겠습니다.</p>
<p>1회차</p>
<h2 id="주제-선정">주제 선정</h2>
<p>가장 먼저 주제를 찾아봐야겠죠?
뉴스를 좀 찾아봤습니다.
<a href="https://www.newneek.co/CvK5t6">https://www.newneek.co/CvK5t6</a>
위 기사를 보고 핫한 이슈인 국민연금을 선택했습니다.</p>
<p> 국민연금 기금 적립 현황에 가장 큰 영향을 미치는 요인들을 바탕으로 
미래의 국민연금 기금의 규모를 예측하고자 합니다.</p>
<p>2회차</p>
<h2 id="작품-개요-작성">작품 개요 작성</h2>
<p>주제를 정했으니 작품 개요를 작성했습니다.</p>
<p>+서울갔다왔습니다.</p>
<h2 id="데이터-수집">데이터 수집</h2>
<p>데이터를 찾아야 합니다.</p>
<p>인구・성장・이자・소득의 상대적 관계가 국민연금 기금에 미치는 영향에 대한 고찰(<a href="https://www.kihasa.re.kr/hswr/assets/pdf/79/journal-38-1-396.pdf)%EB%A5%BC">https://www.kihasa.re.kr/hswr/assets/pdf/79/journal-38-1-396.pdf)를</a> 바탕으로 경제활동인구, 물가상승률, 가입자 수등이 국민연금에 영향을 끼친다는 것을 알았습니다.</p>
<p>시간이 부족해 경제활동인구와 물가상승률만 바탕으로 회귀분석을 했습니다.</p>
<p>구글에 검색하여 가장 먼저 나오는 데이터들을 다운로드 받았습니다.
국민연금공단 기금적립현황 -  <a href="https://www.data.go.kr/data/15106891/fileData.do?recommendDataYn=Y">https://www.data.go.kr/data/15106891/fileData.do?recommendDataYn=Y</a>
경제활동인구 - <a href="https://kosis.kr/search/search.do?query=%EA%B2%BD%EC%A0%9C%ED%99%9C%EB%8F%99%EC%B0%B8%EA%B0%80%EC%9C%A8">https://kosis.kr/search/search.do?query=%EA%B2%BD%EC%A0%9C%ED%99%9C%EB%8F%99%EC%B0%B8%EA%B0%80%EC%9C%A8</a>
소비자물가상승률 - <a href="https://snapshot.bok.or.kr/dashboard/C6">https://snapshot.bok.or.kr/dashboard/C6</a>
국민연금 가입자 수 - <a href="https://www.nps.or.kr/jsppage/app/cms/view.jsp?seq=29369&amp;cPage=1&amp;cmsId=public_data&amp;SK=&amp;SW=&amp;SK2=">https://www.nps.or.kr/jsppage/app/cms/view.jsp?seq=29369&amp;cPage=1&amp;cmsId=public_data&amp;SK=&amp;SW=&amp;SK2=</a></p>
<h2 id="회귀분석-시작">회귀분석 시작</h2>
<h3 id="코드-작성">코드 작성</h3>
<p>다양한 곳에서 데이터를 다운받았으니, 데이터 클렌징을 해야겠죠?
연도를 기준으로 다듬었습니다.</p>
<h3 id="회귀분석-모델-학습">회귀분석 모델 학습</h3>
<pre><code>import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer

X = df[[&#39;물가상승률&#39;, &#39;경제활동인구&#39;]]
Y = df[&#39;금액&#39;]

imputer = IterativeImputer()
X_imputed = imputer.fit_transform(X)


poly = PolynomialFeatures(degree=3)
X_poly = poly.fit_transform(X_imputed)

x_train, x_test, y_train, y_test = train_test_split(X_poly, Y, test_size=0.2, random_state=5)

lrmodel = LinearRegression()
lrmodel.fit(x_train, y_train)

predicted_y_train = lrmodel.predict(x_train)
mse_train = mean_squared_error(y_train, predicted_y_train)
r2_train = r2_score(y_train, predicted_y_train)
print(&quot;MSE on train data: %f&quot; % mse_train)
print(&quot;train의 결정계수:%f&quot; % r2_train)

predicted_y_test = lrmodel.predict(x_test)
mse_test = mean_squared_error(y_test, predicted_y_test)
r2_test = r2_score(y_test, predicted_y_test)
print(&quot;MSE on test data: %f&quot; % mse_test)
print(&quot;test의 결정계수:%f&quot; % r2_test)
</code></pre><h3 id="실행-결과">실행 결과</h3>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/eee9e8c1-44f1-49d4-9980-b6d97b26aed6/image.png" alt=""></p>
<p>테스트 데이터 성능에서는
MSE가 1229722374.363250으로 매우 높고, 결정계수(R-squared)가 NaN(Not a Number)입니다. 이는 모델이 테스트 데이터에 대해 매우 좋지 않은 성능을 보인다는 것을 의미합니다. 즉, 모델이 훈련 데이터에 과도하게 적합되어 일반화 능력이 떨어지는 것으로 보입니다.</p>
<p>사실 결과는 그리 중요하지 않습니다.
테스트 데이터셋의 샘플 수가 2개 미만이고, 학습했다고 하기엔 데이터도 없기 때문입니다.</p>
<h3 id="사용-코드">사용 코드</h3>
<pre><code>import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer

while True:
    try:
        물가상승률 = float(input(&quot;물가상승률을 입력하세요: &quot;))
        경제활동인구 = float(input(&quot;경제활동인구를 입력하세요: &quot;))
        break
    except ValueError:
        print(&quot;유효한 숫자를 입력하세요.&quot;)

new_data = pd.DataFrame({&#39;물가상승률&#39;: [물가상승률], &#39;경제활동인구&#39;: [경제활동인구]})
new_data_imputed = imputer.transform(new_data)
new_data_poly = poly.transform(new_data_imputed)

predicted_y_new = lrmodel.predict(new_data_poly)

print(f&quot;입력한 데이터에 대한 예측 금액: {predicted_y_new[0]}&quot;)
</code></pre><h3 id="실행-결과-1">실행 결과</h3>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/fe500f55-f539-4be0-96fe-a4e580d172f3/image.png" alt=""></p>
<p>데이터를 찾아 보기도 하고, 주제를 바꾸려는 생각도 했지만 시간이 부족해 그냥 했습니다. 연도별 기금적립 현황 데이터가 2019년~2024년, 5개밖에 없어서 이런 결과가 나왔습니다.</p>
<p>데이터를 먼저 찾고 주제를 정할 걸 그랬습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[해싱 함수를 만들자]]></title>
            <link>https://velog.io/@wi___s10/%ED%95%B4%EC%8B%B1-%ED%95%A8%EC%88%98%EB%A5%BC-%EB%A7%8C%EB%93%A4%EC%9E%90</link>
            <guid>https://velog.io/@wi___s10/%ED%95%B4%EC%8B%B1-%ED%95%A8%EC%88%98%EB%A5%BC-%EB%A7%8C%EB%93%A4%EC%9E%90</guid>
            <pubDate>Tue, 23 Apr 2024 08:48:46 GMT</pubDate>
            <description><![CDATA[<h1 id="해싱">해싱</h1>
<p>해싱은 수학적 알고리즘을 사용하여 데이터를 매핑하고 압축하는 기술입니다. 이 기술은 다양한 크기의 입력 데이터(예: 이미지)를 동일한 크기의 출력 데이터(예: 데이터 지문, 디지털 ID)로 변환합니다. 해시 함수는 임의의 입력 비트열에 대해 일정한 길이의 안전한 출력 비트열을 생성하며, 정보 보호 분야에서 활발히 활용됩니다.</p>
<h2 id="해시-함수의-보안-요구사항">해시 함수의 보안 요구사항</h2>
<ul>
<li>속도: 계산이 용이하고 빨라야 합니다.</li>
<li>결정성: 동일한 입력에 대해 여러 번 해시 함수를 적용해도 동일한 출력이 나와야 합니다.</li>
<li>균일성: 데이터 크기와 상관없이 전반적으로 동일한 양의 해싱을 수행해야 합니다.</li>
<li>고정 크기: 출력은 고정 크기가 되어야 합니다(너무 작으면 충돌이 발생할 수 있습니다).
비가역성: 해시값으로부터 역으로 메시지를 알아낼 수 없어야 합니다(역상 정항성).</li>
<li>아발란치 효과: 정보가 변경되면 단일 문자가 변경되더라도 출력이 크게 변해야 합니다.</li>
<li>충돌 회피: 두 개의 메시지가 같은 해시값을 갖는 것을 충돌이라고 하는데, 이를 발견하지 않도록 해야 합니다.</li>
<li>제2역상 저항성: 최초 메시지가 확인된 상태에서 동일한 해시값이 나오는 다른 입력 메시지를 찾기 어려워야 합니다.<h2 id="해시-함수-기법">해시 함수 기법</h2>
</li>
<li>나누기(Division)의 나머지(%)</li>
<li>접기(Folding): Shift Folding, Boundary Folding</li>
<li>중간 제곱(Mid-square): 키를 제곱하고 중간 부분을 결과로 사용</li>
<li>추출(Extraction): 키의 일부만 사용하여 결과로 사용<h2 id="좋은-해시-함수의-특징">좋은 해시 함수의 특징</h2>
</li>
<li>계산이 쉽고 빠름</li>
<li>인덱스 범위에 걸쳐 실제 발생하는 키가 균등한 분포를 가짐</li>
<li>수학적으로 일대일로 관련 키 값 집합을 사용<h2 id="해시의-활용">해시의 활용</h2>
해시는 문자열(string)을 기준으로 정보를 기록하고 관리할 때 주로 사용됩니다. 인덱스 기반의 단순 배열을 사용할 수 없는 경우, key:value의 매핑 구조에서 key가 문자열일 때 해시를 활용합니다. 예를 들어, 등록된 전화번호를 기준으로 &#39;개인안심번호&#39;를 생성하는 데 해시가 사용됩니다.</li>
</ul>
<p>해시는 key:value 매핑 구조입니다.
대부분의 경우 key가 문자열입니다.
put/get/getOrDefault 메서드를 사용하여 데이터를 저장하고 값을 가져올 수 있습니다.</p>
<p>해싱 함수에 대해 간략하게 알아보았으니, 해싱 함수를 만들어 봅시다.</p>
<h1 id="1-일단-접기">1. 일단 접기</h1>
<h2 id="아이디어">아이디어</h2>
<p>고정된 길이를 가져야하니, 문자열을 일정한 길이로 나누는 것이 좋을 것 같습니다.</p>
<h2 id="코드-구현">코드 구현</h2>
<pre><code>def folding_hash(input_data, table_size, hash_length=8):
    input_bytes = input_data.encode()
    chunks = [input_bytes[i:i+4] for i in range(0, len(input_bytes), 4)]
    hash_value = sum(map(lambda x: int.from_bytes(x, byteorder=&#39;little&#39;), chunks))
    hash_value = hash_value % table_size
    return f&quot;{hash_value:0{hash_length}d}&quot;</code></pre><h2 id="테스트">테스트</h2>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/42872c93-8880-44f7-9076-a2d295b5f7b9/image.png" alt="">
보니까 이게 대부분의 해싱 함수 요구사항을 만족하지 못하는 것 같습니다.</p>
<p>실패!</p>
<h1 id="2-검색-좀-해보기">2. 검색 좀 해보기</h1>
<h2 id="아이디어-1">아이디어</h2>
<p>제 아이디어는 아닌데 이렇게 ASCII 코드 값을 사용하고 2^32로 나머지 연산을 수행해서 길이가 고정되게끔 했습니다.
13은 제가 가장 좋아하는 소수 중에 하나라 넣었습니다.</p>
<h2 id="코드-구현-1">코드 구현</h2>
<pre><code>def custom_hash_function(message):
    hash_value = 0
    for char in message:
        hash_value = (hash_value * 13 + ord(char)) % (2**32)
    return hash_value</code></pre><h1 id="테스트-1">테스트</h1>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/a3868e5b-a25f-4a3e-b187-144c6e1049a4/image.png" alt=""></p>
<p>가장 신경썼던 고정 크기 출력을 해결했습니다.
균일성을 만족합니다.
여전히 비가역성, 충돌 회피, 제2역상 저항성을 만족하지 못합니다.</p>
<h1 id="3-비트-연산-더하기">3. 비트 연산 더하기</h1>
<h2 id="아이디어-2">아이디어</h2>
<p>일단 제2역상 저항성을 높이기 위해 비트 연산을 넣기로 했습니다.
AND와 OR, XOR 중에 고민하다가 XOR이 가장 이쁜 것 같아서 선택했습니다.</p>
<h2 id="코드-구현-2">코드 구현</h2>
<pre><code>def custom_hash_function(message):
    hash_value = 0
    for char in message:
        hash_value = (hash_value * 13) ^ (ord(char) &lt;&lt; 1) ^ ord(char)
    return hash_value</code></pre><h2 id="테스트-2">테스트</h2>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/4b52d04c-a1bb-4d15-8992-96443464e160/image.png" alt="">
그래도 제2역상 저항성이 좀 나아진 것 같네요.
비가역성, 충돌 회피는 여전히 만족하지 못합니다.</p>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/8bebb97e-f7e0-47db-8ff1-ab7ab5b673e8/image.jpeg" alt="">
그러니 이미 있는 SHA-256같은 해시 함수를 쓰는 것이 좋겠죠?
좋은 하루 되세요.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ChatGPT로 고객 요구사항 구체화하기~]]></title>
            <link>https://velog.io/@wi___s10/AI-ChatGPT%EB%A1%9C-%EA%B3%A0%EA%B0%9D-%EC%9A%94%EA%B5%AC%EC%82%AC%ED%95%AD-%EA%B5%AC%EC%B2%B4%ED%99%94%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@wi___s10/AI-ChatGPT%EB%A1%9C-%EA%B3%A0%EA%B0%9D-%EC%9A%94%EA%B5%AC%EC%82%AC%ED%95%AD-%EA%B5%AC%EC%B2%B4%ED%99%94%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 18 Apr 2024 02:11:54 GMT</pubDate>
            <description><![CDATA[<p>크록스 지비츠를 커스텀해 구매까지 할 수 있는 서비스를 만들 겁니다.</p>
<p>크록스의 지비츠는 단순한 신발 액세서리를 넘어, 개성과 자유로움을 표현하는 하나의 문화가 되었습니다. 이러한 트렌드를 기반으로, 저는 <strong>ChatGPT의 확장 프로그램들을 활용하여 크록스 지비츠를 위한 전자상거래 플랫폼의 디자인 컨셉부터 개발 계획까지</strong>를 만들어냈습니다.</p>
<h1 id="먼저-software-architect-gpt에게-물어봤습니다">먼저 <strong>Software Architect GPT</strong>에게 물어봤습니다.</h1>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/a7974ed8-b8a0-42f4-96ee-bc63dddaba26/image.png" alt=""><img src="https://velog.velcdn.com/images/wi___s10/post/24e2f5df-1cd0-45da-afe3-ad9815f47ec7/image.png" alt=""></p>
<p>위를 바탕으로 클래스 다이어그램, 액티비티 다이어그램, 유즈케이스 다이어그램도 요청해봅시다.</p>
<h1 id="클래스-다이어그램">클래스 다이어그램</h1>
<p>클래스 다이어그램을 통해 시스템의 핵심 구성요소와 그들 간의 관계를 명확히 했습
니다. <img src="https://velog.velcdn.com/images/wi___s10/post/a083f225-0820-4621-853d-e7a349f88828/image.png" alt=""></p>
<h1 id="액티비티-다이어그램">액티비티 다이어그램</h1>
<p>액티비티 다이어그램은 사용자의 주요 활동 흐름을 나타냅니다. 
<img src="https://velog.velcdn.com/images/wi___s10/post/0a13b78b-265c-4ce1-bb4d-3586c39951ed/image.png" alt=""></p>
<h1 id="유즈케이스-다이어그램">유즈케이스 다이어그램</h1>
<p>유즈케이스 다이어그램을 통해 시스템의 기능과 사용자 간의 상호작용을 구체적으로 정의했습니다. 
<img src="https://velog.velcdn.com/images/wi___s10/post/b07680a2-3f83-4484-b112-8803f23ee0bd/image.png" alt=""></p>
<h1 id="요구사항-명세">요구사항 명세</h1>
<pre><code>= SPEC-001: Crocs Jibbitz Coordination and Commerce Platform
:sectnums:
:toc:

== Background

이 플랫폼은 크록스 착용자들이 자신의 신발에 맞는 지비츠를 가상으로 코디해보고, 마음에 드는 구성을 실제로 구매할 수 있게 하는 서비스입니다. 사용자는 자신의 크록스 사진을 업로드하거나 제공된 크록스 모델을 선택하여 지비츠를 가상으로 장착해볼 수 있습니다.

== Requirements

.사용자 인터페이스
* 사용자는 자신의 크록스 사진을 업로드할 수 있어야 합니다. (MUST)
* 사용자는 제공된 크록스 모델에 지비츠를 코디해볼 수 있어야 합니다. (MUST)
* 사용자는 코디된 지비츠 구성을 저장하고 나중에 볼 수 있어야 합니다. (SHOULD)
* 사용자는 코디된 지비츠 구성을 SNS 등에 공유할 수 있어야 합니다. (COULD)

.지비츠 코디네이션
* 시스템은 사용자가 업로드한 크록스 사진에 지비츠를 가상으로 추가할 수 있어야 합니다. (MUST)
* 시스템은 제공된 크록스 모델에 지비츠를 가상으로 추가할 수 있어야 합니다. (MUST)
* 시스템은 지비츠를 가상으로 추가할 때, 위치 조정과 크기 조정 기능을 제공해야 합니다. (MUST)

.결제 시스템
* 사용자는 코디한 지비츠를 실제로 구매할 수 있어야 합니다. (MUST)
* 시스템은 다양한 결제 방식(신용카드, 페이팔, 애플 페이 등)을 지원해야 합니다. (SHOULD)

.계정 관리
* 사용자는 계정을 생성하고 로그인할 수 있어야 합니다. (MUST)
* 사용자는 자신의 구매 이력을 조회할 수 있어야 합니다. (MUST)

== Method

이 섹션에서는 요구사항을 충족하기 위한 기술적 방법론, 데이터베이스 스키마, 아키텍처 디자인, 주요 알고리즘 등을 상세히 다룰 예정입니다.

== Implementation

개발 과정, 팀 구성, 사용할 기술 스택, 구현 단계별 주요 작업 항목 등을 포함합니다.

== Milestones

프로젝트 진행 상황을 모니터링하고 관리하기 위한 주요 이정표와 해당 날짜를 기재합니다.

== Gathering Results

이 섹션에서는 개발된 시스템의 성능 평가 및 요구사항 충족 여부에 대한 검토를 다룹니다.
</code></pre><p>이 귀찮은 걸 다 해주다니 신기하네요</p>
<h1 id="디자인-컨셉">디자인 컨셉</h1>
<p>이번엔 DesignerGPT와 Midjourney를 사용하여 디자인 컨셉안을 그렸습니다.
<img src="https://velog.velcdn.com/images/wi___s10/post/a029e588-0b87-4dd3-8957-8b0c74f91377/image.png" alt=""></p>
<h1 id="개발-계획">개발 계획</h1>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/5ff50250-2461-438b-b1b7-c63cf6135376/image.png" alt="">
은근 쓸 수 있을 것 같은 계발 계획도 잘 나옵니다.</p>
<p>이렇게 보니까 도움되네요.
<img src="https://velog.velcdn.com/images/wi___s10/post/e56eb19b-9fd5-48d8-a11c-a8daaf19657c/image.jpeg" alt="">
끝.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[python 문장 유사도]]></title>
            <link>https://velog.io/@wi___s10/python-%EB%AC%B8%EC%9E%A5-%EC%9C%A0%EC%82%AC%EB%8F%84</link>
            <guid>https://velog.io/@wi___s10/python-%EB%AC%B8%EC%9E%A5-%EC%9C%A0%EC%82%AC%EB%8F%84</guid>
            <pubDate>Tue, 16 Apr 2024 09:00:45 GMT</pubDate>
            <description><![CDATA[<pre><code>from konlpy.tag import Okt
from collections import Counter
import numpy as np

okt = Okt()

def get_nouns(text):
    return Counter(okt.nouns(text))

def make_vec(features, data):
    return np.array([data.get(f, 0) for f in features])

def sim(a, b):
    return a@b/ (np.linalg.norm(a) * np.linalg.norm(b))

A = get_nouns(input())
B = get_nouns(input())
C = get_nouns(input())

features = set(A + B + C)

va = make_vec(features, A)
vb = make_vec(features, B)
vc = make_vec(features, C)

print(&#39;va &amp; vb&#39;, sim(va, vb))
print(&#39;vb &amp; vc&#39;, sim(vb, vc))
print(&#39;va &amp; vc&#39;, sim(va, vc))</code></pre><p><img src="https://velog.velcdn.com/images/wi___s10/post/d2782c2e-adf1-4957-ad9c-f15cc7bca624/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[python 생태계 행렬 문제]]></title>
            <link>https://velog.io/@wi___s10/python-%EC%83%9D%ED%83%9C%EA%B3%84-%ED%96%89%EB%A0%AC-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@wi___s10/python-%EC%83%9D%ED%83%9C%EA%B3%84-%ED%96%89%EB%A0%AC-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Tue, 16 Apr 2024 07:36:43 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/wi___s10/post/8224ba3c-36b3-491f-a5c1-7d710fa11385/image.png" alt="">
<img src="https://velog.velcdn.com/images/wi___s10/post/fe29f616-f332-493c-8de9-f060f77a4e23/image.png" alt="">
<img src="https://velog.velcdn.com/images/wi___s10/post/c3470651-3db6-4a65-ba59-24028bdbe2e2/image.png" alt=""></p>
<p>1</p>
<pre><code>import copy
from collections import deque
length = 10

names = {
    0: &#39;독수리&#39;,
    1: &#39;뱀&#39;,
    2: &#39;쥐&#39;,
    3: &#39;휘파람새&#39;,
    4: &#39;개구리&#39;,
    5: &#39;나방&#39;,
    6: &#39;메뚜기&#39;,
    7: &#39;다람쥐&#39;,
    8: &#39;과실&#39;,
    9: &#39;나무&#39;
}

matrix = [
    [0, 1, 1, 1, 1, 0, 0, 1, 0, 0],
    [0, 0, 1, 0, 1, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 1, 0, 1, 0],
    [0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 1, 1, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
]

p = dict()

for i in range(10):
    for j in range(10):
        if matrix[i][j] == 1:
            if i in p: p[i].append(j)
            else: p[i] = [j]

s = copy.deepcopy(p)
for k, v in p.items():
    for i in v:
        if i in p: s[k] += s[i]

for i in range(len(matrix)):
    if i in s: print(f&quot;{names[i]}: {len(s[i])}&quot;)
    else: print(f&quot;{names[i]}: 0&quot;)</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[OOP랑 소프트웨어 디자인]]></title>
            <link>https://velog.io/@wi___s10/%EC%9E%84%EC%8B%9C-%EA%B8%80</link>
            <guid>https://velog.io/@wi___s10/%EC%9E%84%EC%8B%9C-%EA%B8%80</guid>
            <pubDate>Thu, 04 Apr 2024 05:11:50 GMT</pubDate>
            <description><![CDATA[<h1 id="객체-지향-프로그래밍이란">객체 지향 프로그래밍이란?</h1>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/07c4c3ca-dd2e-455b-8eea-69715a5ce653/image.png" alt=""></p>
<p>객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나로서, 실제 세계의 사물을 객체(Object)로 보고 이들이 서로 상호작용하는 방식으로 프로그램을 설계하고 구현하는 방법론이다. 이러한 설계 기법은 프로그램을 더욱 체계적이고 유연하게 만들어주며, 코드의 재사용성을 높이고 유지보수를 용이하게 한다.</p>
<h1 id="객체-지향-프로그래밍-패러다임">객체 지향 프로그래밍 패러다임</h1>
<p>객체 지향 프로그래밍은 여러 가지 특징을 가지고 있으며, 이러한 특징들은 프로그래밍을 통한 문제 해결을 보다 효과적으로 만든다. 이러한 특징들에는 Identity, Classification, Abstraction, Inheritance, Polymorphism, Persistence 등이 있다.</p>
<h2 id="identity">Identity</h2>
<p>객체 지향 프로그래밍에서 Identity는 각각의 객체를 서로 구분하는 데 사용되는 고유 식별자를 의미한다. 실제 세계에서도 모든 사물과 생명체는 그들을 구분하는 고유한 식별자를 가지고 있다. 프로그래밍에서 이러한 개념을 빌려와, 동일한 속성이나 동작을 가진 여러 객체를 서로 구분하고, 객체 간의 상호작용을 정의할 수 있다.</p>
<h2 id="classification">Classification</h2>
<p>Classification은 객체의 분류를 담당하는 기능이다. 이는 객체를 그룹화하고, 그룹 간의 관계를 설명하는 데 사용된다. 클래스(Class)는 객체의 특성(속성, Properties)과 행동(메소드, Methods)을 정의하는 템플릿 또는 청사진으로서 작동한다. 같은 클래스에 속한 객체들은 동일한 속성과 행동을 공유한다.</p>
<h2 id="abstraction">Abstraction</h2>
<p>Abstraction은 복잡한 시스템을 단순화시키는 과정이다. 프로그래머는 시스템의 복잡성을 효과적으로 관리하고, 시스템의 주요 기능에만 집중할 수 있게 해준다. 추상화를 통해, 우리는 복잡한 로직을 단순하고 이해하기 쉬운 인터페이스로 변환할 수 있다.</p>
<h2 id="inheritance">Inheritance</h2>
<p>Inheritance는 클래스 간의 관계를 정의하는 메커니즘이다. 하위 클래스(Subclass)는 상위 클래스(Superclass)의 속성과 메소드를 상속받는 것을 의미한다. 이를 통해 코드의 재사용성이 향상되고, 프로그램의 복잡성이 줄어든다. 상속을 통해 프로그래머는 기존 클래스의 기능을 확장하거나 변경할 수 있다.</p>
<h2 id="polymorphism">Polymorphism</h2>
<p>Polymorphism은 객체 지향 프로그래밍의 핵심 개념 중 하나로, 하나의 인터페이스를 통해 다양한 타입의 객체를 조작할 수 있도록 해준다. 이는 프로그램의 유연성과 확장성을 향상시킨다. 다형성은 메소드 오버로딩과 오버라이딩을 통해 구현할 수 있다.</p>
<h2 id="persistence">Persistence</h2>
<p>Persistence는 객체의 상태가 프로그램의 실행 주기를 넘어서 유지되는 성질을 의미한다. 프로그램이 종료되더라도 객체의 상태를 보존하고, 다시 프로그램이 시작되었을 때 그 상태를 불러오는 것이 가능하다. 이는 데이터베이스, 파일 시스템, 클라우드 스토리지 등을 통해 구현할 수 있다.</p>
<p>객체 지향 프로그래밍은 이러한 패러다임을 통해 프로그램의 구조를 보다 효과적으로 관리하고, 프로그램의 유지 보수를 용이하게 한다. 이러한 이유로 객체지향 프로그래밍은 많은 프로그래머들에게 선호되는 방법론 중 하나가 되었다.</p>
<h1 id="객체-지향-프로그래밍의-장점">객체 지향 프로그래밍의 장점</h1>
<ol>
<li><p><strong>재사용성</strong>: 객체 지향 프로그래밍에서는 클래스와 객체를 통해 코드를 재사용할 수 있습니다. 같은 기능이 필요할 때 마다 코드를 반복적으로 작성하는 대신, 이미 작성된 클래스나 객체를 재사용하여 효율적으로 코드를 작성할 수 있습니다.</p>
</li>
<li><p><strong>유지보수성</strong>: 객체 지향 프로그래밍은 코드의 유지보수를 쉽게 만듭니다. 특정 기능을 변경하거나 업데이트해야 할 경우, 해당 기능이 구현된 클래스나 객체만을 수정하면 되므로 유지보수가 간편해집니다.</p>
</li>
<li><p><strong>보안</strong>: 객체 지향 프로그래밍에서는 데이터를 객체 내부에 숨겨두고, 해당 객체에서만 접근 가능하도록 제한할 수 있습니다. 이를 캡슐화라고 하며, 이를 통해 데이터의 보안을 강화할 수 있습니다.</p>
</li>
</ol>
<h1 id="객체-지향-프로그래밍의-단점">객체 지향 프로그래밍의 단점</h1>
<ol>
<li><p><strong>처리 속도</strong>: 객체 지향 프로그래밍은 처리 속도가 절차 지향 프로그래밍에 비해 상대적으로 느릴 수 있습니다. 이는 객체 간의 메시지 전달, 객체 생성과 소멸 등에 시간이 소요되기 때문입니다.</p>
</li>
<li><p><strong>설계 시간</strong>: 객체 지향 프로그래밍은 다른 프로그래밍 방법론에 비해 설계 시간이 더 많이 필요할 수 있습니다. 클래스와 객체, 그리고 이들간의 관계를 정확하게 설계하는 것이 필요하기 때문입니다.</p>
</li>
<li><p><strong>난이도</strong>: 객체 지향 프로그래밍은 절차 지향 프로그래밍에 비해 학습 난이도가 높을 수 있습니다. 클래스, 객체, 상속, 다형성 등의 개념을 이해하고 잘 활용해야 하기 때문입니다.</p>
</li>
</ol>
<h1 id="객체-지향-프로그래밍이-적합한-상황">객체 지향 프로그래밍이 적합한 상황</h1>
<ol>
<li><p><strong>복잡한 소프트웨어 개발</strong>: 복잡한 소프트웨어 시스템을 개발할 때 객체 지향 방법론을 사용하면, 시스템의 복잡성을 줄이고 코드의 재사용성을 높일 수 있습니다.</p>
</li>
<li><p><strong>유지보수가 필요한 프로젝트</strong>: 프로젝트가 계속해서 업데이트되고 변화해야 하는 경우, 객체 지향 프로그래밍을 사용하면 유지보수가 용이합니다.</p>
</li>
<li><p><strong>여러 개발자가 참여하는 프로젝트</strong>: 여러 개발자가 함께 작업해야 하는 프로젝트에서는 객체 지향 프로그래밍을 사용하면, 각 개발자가 작성한 코드 간의 충돌을 최소화하고 효율적으로 협업할 수 있습니다.</p>
</li>
</ol>
<h1 id="소프트웨어-디자인이란">소프트웨어 디자인이란?</h1>
<p>소프트웨어 디자인은 요구 사항이나 계획을 개발 단계로 수행하기 위한 절차이다.</p>
<h2 id="소프트웨어-디자인-원칙">소프트웨어 디자인 원칙</h2>
<ol>
<li>“터널 시야”에 매몰되어서는 안된다
: 목표를 달성하는 것만이 아닌 다른 효과에도 초점을 맞추어야 한다</li>
<li>분석 모델로 추적 가능해야 한다
: 고품질의 소프트웨어를 개발하는데 필요한 모든 요구사항을 충족해야 한다</li>
<li>“바퀴의 재발명”을 하지 말아야 한다
: 이미 존재하는 것을 만드는데 시간과 노력을 낭비해서는 안된다</li>
<li>지적 거리 최소화
: 실제 문제와 소프트웨서 솔루션 간의 격차를 줄여야 한다</li>
<li>균질성 및 통합성 표기
: 프로세스 전체에서 변경 없는 균일한 디자인이어야 하며, 하위 시스템 전부가 결합되어야 한다</li>
<li>변경 수용
: 소프트웨어는 사용자의 필요에 따라 바뀌는 수행방식에 적응해야 한다</li>
<li>부드러운 저하
: 실행 중 오류가 발생하더라도 정확하게 작동해야 한다</li>
<li>평가 또는 품질
: 평가 중에도 디자인 품질을 확인하고 집중해야 한다</li>
<li>오류 발견을 위한 검토
: 설계를 검토하며 오류 유무와 최소화를 위한 전반적인 평가를 수행해야 한다</li>
<li>디자인은 코딩이 아니다, 코딩은 디자인이 아니다
: 디자인은 문제 해결을 위한 프로그램의 논리를 설명하는 것이며 코딩은 디자인 구현에 사용되는 일종의 언어다</li>
</ol>
<h2 id="composition-over-inheritance">Composition over Inheritance</h2>
<p>Composition over Inheritance은 상속 대신 구성을 사용하는 원칙이다. 이 원칙을 통해 코드의 유연성을 높이고, 재사용성을 증가시킬 수 있다.</p>
<h2 id="encapsulate-what-varies">Encapsulate what varies</h2>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/985bec14-a3ea-46c1-aeca-463767c6429e/image.jpeg" alt=""></p>
<p>Encapsulate what varies는 변화하는 부분을 캡슐화하는 원칙이다. 이를 통해 코드의 유지 보수를 용이하게 할 수 있다.</p>
<h2 id="program-against-abstractions">Program against abstractions</h2>
<p>Program against abstractions는 추상화에 대해 프로그래밍하는 원칙이다. 이 원칙을 통해 코드의 유연성을 증가시키고, 변경에 대한 영향을 최소화할 수 있다.</p>
<h2 id="hollywood-principle">Hollywood Principle</h2>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/70ea43dc-c677-4911-b584-293ecb08ed92/image.png" alt=""></p>
<p>Hollywood Principle은 &quot;먼저 전화하지 마세요, 우리가 전화할게요&quot;라는 원칙이다. 이 원칙은 시스템 간의 의존성을 줄이고, 유연성과 확장성을 향상시킬 수 있다.</p>
<h2 id="iocinversion-of-control--didependency-injection">IoC(Inversion of Control) / DI(Dependency Injection)</h2>
<p>IoC(Inversion of Control) 또는 DI(Dependency Injection)은 제어의 역전 또는 의존성 주입이라는 원칙이다. 이 원칙은 모듈 간의 결합도를 줄이고, 코드의 테스트와 재사용성을 증가시킬 수 있다.</p>
<h2 id="solid">SOLID</h2>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/0c18a620-d03c-45af-827a-bfdfc1dc7aa7/image.png" alt=""></p>
<p>SOLID는 객체 지향 프로그래밍과 설계의 다섯 가지 기본 원칙이다. 이 원칙들은 코드의 유지 보수성, 유연성, 효율성을 향상시킬 수 있다.</p>
<h2 id="dry">DRY</h2>
<p>DRY(Don&#39;t Repeat Yourself)는 같은 코드를 반복하지 않는 원칙이다. 이 원칙을 통해 코드의 유지 보수성을 증가시키고, 잠재적인 오류를 줄일 수 있다.</p>
<h2 id="yagni">YAGNI</h2>
<p>YAGNI(You Ain&#39;t Gonna Need It)은 필요하지 않은 것은 구현하지 않는 원칙이다. 이 원칙은 불필요한 코드를 줄이고, 개발 시간을 절약할 수 있다.</p>
<h2 id="kiss">KISS</h2>
<p>KISS(Keep It Simple, Stupid)는 가능한 한 간단하게 유지하는 원칙이다. 이 원칙은 코드의 복잡성을 줄이고, 이해와 유지 보수를 용이하게 할 수 있다.</p>
<h2 id="aha">AHA</h2>
<p>AHA(Avoid Hasty Abstraction)은 성급한 추상화를 피하는 원칙이다. 이 원칙은 불필요한 복잡성을 피하고, 코드의 가독성을 향상시킬 수 있다.</p>
<h2 id="lodlaw-of-demeter">LoD(Law of Demeter)</h2>
<p>LoD(Law of Demeter)은 데메테르의 법칙이라고도 하며, 객체 간의 상호작용을 최소화하는 원칙이다. 이 원칙은 결합도를 줄이고, 변경에 대한 영향을 최소화할 수 있다.</p>
<p>이렇게 소프트웨어 디자인 원칙들은 효율적인 코드를 작성하는데 도움이 될 수 있다. 이 원칙들을 잘 활용하면, 코드의 품질을 높이는 데 큰 도움이 될 것이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[UML의 핵심 요소-액티비티 다이어그램과 클래스 다이어그램]]></title>
            <link>https://velog.io/@wi___s10/UML%EC%9D%98-%ED%95%B5%EC%8B%AC-%EC%9A%94%EC%86%8C-%EC%95%A1%ED%8B%B0%EB%B9%84%ED%8B%B0-%EB%8B%A4%EC%9D%B4%EC%96%B4%EA%B7%B8%EB%9E%A8%EA%B3%BC-%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%8B%A4%EC%9D%B4%EC%96%B4%EA%B7%B8%EB%9E%A8</link>
            <guid>https://velog.io/@wi___s10/UML%EC%9D%98-%ED%95%B5%EC%8B%AC-%EC%9A%94%EC%86%8C-%EC%95%A1%ED%8B%B0%EB%B9%84%ED%8B%B0-%EB%8B%A4%EC%9D%B4%EC%96%B4%EA%B7%B8%EB%9E%A8%EA%B3%BC-%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%8B%A4%EC%9D%B4%EC%96%B4%EA%B7%B8%EB%9E%A8</guid>
            <pubDate>Wed, 03 Apr 2024 14:33:44 GMT</pubDate>
            <description><![CDATA[<p>소프트웨어 개발 과정에서 문제를 효과적으로 해결하려면 시스템의 다양한 측면을 이해하고 시각화해야 합니다. 이를 가능하게 하는 표준화된 일반 목적의 모델링 언어가 바로 <strong>UML(Unified Modeling Language)</strong>입니다. 이번 포스트에서는 UML의 주요 다이어그램 중 &#39;액티비티 다이어그램&#39;과 &#39;클래스 다이어그램&#39;에 대해 살펴보겠습니다.</p>
<h1 id="uml-unified-modeling-language">UML (Unified Modeling Language)</h1>
<p>UML은 <strong>소프트웨어 시스템을 시각화하고, 설계하고, 문서화하기 위한 표준화된 범용 모델링 언어</strong>입니다. 이는 복잡한 소프트웨어 시스템의 구조와 행동을 표현하는 데 사용됩니다.</p>
<h2 id="uml의-목적">UML의 목적</h2>
<p>UML은 다양한 사람들이 시스템을 이해하고, 분석하고, 설계하고, 유지보수하는 데 도움이 되도록 설계되었습니다. 이에는 소프트웨어 개발자, 프로젝트 매니저, 사용자 등이 포함됩니다.</p>
<h2 id="uml의-다이어그램-종류">UML의 다이어그램 종류</h2>
<p>UML에는 여러 종류의 다이어그램이 있으며, 각각이 시스템의 특정 측면을 설명합니다. 이들 중에는 클래스 다이어그램, 시퀀스 다이어그램, 사용 사례 다이어그램, 상태 다이어그램 등이 있습니다.</p>
<ul>
<li><strong>클래스 다이어그램:</strong> 시스템의 정적 구조를 나타냅니다.</li>
<li><strong>시퀀스 다이어그램:</strong> 객체 간의 상호작용을 시간 순서에 따라 보여줍니다.</li>
<li><strong>사용 사례 다이어그램:</strong> 시스템이 어떻게 작동할지를 사용자의 관점에서 보여줍니다.</li>
<li><strong>상태 다이어그램:</strong> 시스템의 다양한 상태와 그 상태 간의 전환을 보여줍니다.</li>
</ul>
<h2 id="uml의-중요성">UML의 중요성</h2>
<p>UML은 복잡한 시스템을 이해하고 표현하는 데 강력한 도구로, 소프트웨어 개발의 다양한 단계에서 널리 사용됩니다. 이는 시스템의 복잡성을 관리하고, 팀원 간의 의사소통을 개선하고, 시스템 설계의 품질을 향상시키는 데 도움이 됩니다.</p>
<h1 id="액티비티-다이어그램">액티비티 다이어그램</h1>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/5eddfb9d-3df7-469a-bc54-35358aeb50af/image.png" alt=""></p>
<p>액티비티 다이어그램은 UML의 동적 다이어그램 중 하나로, 시스템 내에서 <strong>비즈니스 로직이나 프로세스 흐름을 표현</strong>하는 데 사용됩니다. 그래프의 형태로 표현되며, 일반적으로 비즈니스 프로세스 모델링, 워크플로우 모델링, 데이터 흐름을 모델링하는 데 이용됩니다.</p>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/3369aa50-0b09-4aaa-b85e-e55e64cd5897/image.jpeg" alt=""></p>
<h2 id="활동-노드activity-nodes">활동 노드(Activity Nodes)</h2>
<p>활동 노드는 액티비티 다이어그램에서 가장 기본적인 요소로, 시스템의 특정 작업을 나타냅니다. 이는 시스템의 상태나 조건의 변화를 나타내는 데 사용되며, 각 활동 노드는 특정 조건이 충족되었을 때만 실행될 수 있습니다. 
활동 노드에는 아래와 같은 유형이 있습니다.</p>
<ul>
<li>Action States: 시스템이 수행하는 하나의 작업을 나타냅니다. 예를 들어, &#39;자료 검색&#39;, &#39;결과 출력&#39; 등의 작업이 여기에 해당됩니다.</li>
<li>Decision Nodes: 조건부 로직을 나타내며, 다수의 화살표가 이 노드에서 분기되어 다른 활동 노드로 향하게 됩니다.</li>
<li>Merge Nodes: 조건부 로직의 반대 개념으로, 여러 화살표가 하나의 활동 노드로 합쳐지는 지점입니다.</li>
<li>Initial Nodes: 액티비티의 시작점을 나타냅니다.</li>
<li>Final Nodes: 액티비티의 종료점을 나타냅니다.<h2 id="엣지edges">엣지(Edges)</h2>
엣지는 활동 노드 간의 흐름을 나타내는 화살표입니다. 이러한 흐름은 일반적으로 작업의 순서를 나타냅니다. 엣지는 활동 노드와 함께 액티비티 다이어그램의 구조적 흐름을 형성합니다. 엣지는 다음 두 가지 주요 유형이 있습니다.</li>
<li>Control Flow Edges: 이것은 활동 노드 간의 제어 흐름을 나타냅니다. 제어 흐름은 특정 활동이 완료되면 다음 활동으로 이동합니다.</li>
<li>Object Flow Edges: 이것은 객체가 활동 노드간에 이동하는 것을 나타냅니다. 객체 흐름은 특정 활동이 객체를 생성, 조작, 또는 소비할 때 이동합니다.
액티비티 다이어그램은 복잡한 시스템의 동작을 시각화하고 분석하는 데 매우 유용한 도구입니다. 이를 통해 프로세스의 흐름과 로직을 명확하게 이해하고 표현할 수 있습니다. 이것은 개발자가 시스템의 동작을 더 잘 이해하고, 이에 따라 더 <strong>효과적인 설계와 구현 전략</strong>을 도출할 수 있게 합니다.</li>
</ul>
<h1 id="클래스-다이어그램">클래스 다이어그램</h1>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/a070a713-b5e8-4d09-a579-d9301e61bbd5/image.png" alt="">
클래스 다이어그램은 객체 지향 프로그래밍에서 시스템의 정적 구조를 표현하는 UML 다이어그램 중 하나입니다. 이는 시스템의 주요 구조와 클래스 간의 관계를 보여주는 데 사용되며, 시스템 설계 및 분석의 중요한 부분입니다.</p>
<h2 id="클래스class">클래스(Class)</h2>
<p>클래스는 객체 지향 프로그래밍의 핵심 요소로, 비슷한 속성(attribute)과 메소드(method)를 가진 객체의 집합을 나타냅니다. 클래스 다이어그램에서 클래스는 일반적으로 세 개의 섹션으로 나뉩니다.</p>
<ul>
<li>Class Name: 클래스의 이름을 나타냅니다. 이는 보통 클래스 다이어그램의 상단에 위치합니다.</li>
<li>Attributes: 클래스에 속한 변수를 나타냅니다. 이는 클래스의 상태를 정의하며, 클래스 다이어그램의 중간 섹션에 위치합니다.</li>
<li>Methods: 클래스에 속한 함수를 나타냅니다. 이는 클래스의 행동을 정의하며, 클래스 다이어그램의 하단 섹션에 위치합니다.<h2 id="관계relationship">관계(Relationship)</h2>
클래스 간의 관계는 클래스 다이어그램의 핵심 부분으로, 클래스 간에 어떤 종류의 상호 작용이 발생하는지를 나타냅니다. 클래스 간의 관계는 다음과 같은 주요 형태가 있습니다.</li>
<li>Association: 두 클래스가 서로 관련이 있는 경우를 나타냅니다. 예를 들어, 학생 클래스와 선생님 클래스는 &quot;학생은 선생님에게 배운다&quot;는 관계를 가질 수 있습니다.</li>
<li>Aggregation: 한 클래스가 다른 클래스의 부분을 이루는 관계를 나타냅니다. 예를 들어, 학교 클래스와 학생 클래스는 &quot;학교는 학생들로 구성된다&quot;는 관계를 가질 수 있습니다.</li>
<li>Inheritance (Generalization): 한 클래스가 다른 클래스의 특성을 상속받는 관계를 나타냅니다. 예를 들어, 사람 클래스에서 학생 클래스와 선생님 클래스로 분기하는 경우, 학생과 선생님은 사람의 특성을 상속받습니다.</li>
<li>Dependency: 한 클래스가 다른 클래스에 의존하는 경우를 나타냅니다. 예를 들어, &quot;ReportGenerator&quot; 클래스가 &quot;Student&quot; 클래스의 데이터를 필요로 하는 경우, 이들은 의존 관계에 있습니다.</li>
<li>Composition: Aggregation과 비슷하나, 부분과 전체 사이의 관계가 더 강력한 경우를 나타냅니다. 예를 들어, &quot;Head&quot; 클래스와 &quot;Body&quot; 클래스는 &quot;Person&quot; 클래스를 구성하는 관계를 가질 수 있습니다.
클래스 다이어그램은 시스템의 구조적 측면을 명확하게 이해하고 표현하는 데 매우 유용한 도구입니다. 이를 통해 개발자는 시스템의 요소와 이들의 상호작용을 더 잘 이해하고, 이에 따라 더 효과적인 설계와 구현 전략을 도출할 수 있습니다.</li>
</ul>
<p>이를 바탕으로, 저도 쿠팡의 액티비티 다이어그램을 작성해 봤습니다.
멋지죠?
<img src="https://velog.velcdn.com/images/wi___s10/post/c1f0648e-7d69-40b5-947a-fc27cfc0c6fd/image.png" alt=""></p>
<p>좋은 하루 되세요.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[AI] 선형 회귀, CNN, 전이학습]]></title>
            <link>https://velog.io/@wi___s10/%EC%98%A4-%E3%85%8B%E3%85%8B</link>
            <guid>https://velog.io/@wi___s10/%EC%98%A4-%E3%85%8B%E3%85%8B</guid>
            <pubDate>Wed, 27 Mar 2024 06:25:39 GMT</pubDate>
            <description><![CDATA[<h1 id="선형-회귀linear-regression">선형 회귀(Linear Regression)</h1>
<blockquote>
<p>선형 회귀는 통계학과 머신러닝에서 가장 기본적이면서도 중요한 예측 기법 중 하나입니다.</p>
</blockquote>
<p>간단히 말해, 선형 회귀는 데이터 포인트들 사이의 선형 관계를 찾아내는 모델입니다. 이 글에서는 선형 회귀의 기본 원리부터, 어떻게 작동하는지, 언제 사용되는지에 대해 상세히 다루어보겠습니다.</p>
<h2 id="선형-회귀의-기본-원리">선형 회귀의 기본 원리</h2>
<p>선형 회귀는 이름에서 알 수 있듯이 변수들 간의 선형 관계를 모델링합니다. 가장 간단한 형태인 단순 선형 회귀는 독립 변수(X) 하나와 종속 변수(Y) 하나의 관계를 아래의 선형 방정식으로 표현합니다. </p>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/3367593c-0446-4438-bc14-5927cafa44c7/image.png" alt=""></p>
<p>선형 회귀 모델을 학습시키는 핵심은 최적의 W와 b 값을 찾아내는 것입니다. 이 값들은 모델이 실제 데이터를 가장 잘 설명하고 예측할 수 있는 선을 그리도록 합니다. 이 과정에서 &quot;최소 제곱법&quot;(Least Squares Method)이라는 기법이 널리 사용됩니다.
최소 제곱법은 실제 관측값과 모델에 의해 예측된 값 사이의 차이(잔차)의 제곱합을 최소화하는 W와 b를 찾아내는 방법입니다. 이 기법은 잔차의 제곱을 사용하기 때문에, 큰 오차를 더욱 강하게 처벌하여 모델의 정확도를 높입니다.</p>
<p>학습 단계는 다음과 같습니다.</p>
<ol>
<li>임의의 W와 b 값을 선택합니다.</li>
<li>이 값들을 사용하여 모든 데이터 포인트에 대한 예측 값을 계산합니다.</li>
<li>실제 값과 예측 값 사이의 잔차의 제곱합을 계산합니다.</li>
<li>잔차의 제곱합을 최소화하는 (a)와 (b) 값을 찾습니다.</li>
<li>이 최적의 값들을 사용하여 데이터를 가장 잘 설명하는 선형 모델을 얻습니다.</li>
</ol>
<p>이러한 과정을 통해, 선형 회귀 모델은 데이터 사이의 기본적인 선형 관계를 파악하고, 새로운 데이터에 대한 예측을 가능하게 합니다. 이러한 모델은 경제학, 의학, 공학 등 다양한 분야에서 활용되어 왔으며, 머신러닝의 기초를 이루는 중요한 알고리즘 중 하나입니다.</p>
<h2 id="선형-회귀의-주요-가정">선형 회귀의 주요 가정</h2>
<p>선형 회귀 모델은 효과적으로 작동하기 위해 다음의 몇 가지 기본 가정이 필요합니다.</p>
<ul>
<li>선형성: 독립 변수와 종속 변수 사이에는 선형 관계가 있어야 합니다.</li>
<li>독립성: 오차 항들은 서로 독립적이어야 합니다.</li>
<li>등분산성: 모든 독립 변수 값에 대해 오차 항의 분산이 일정해야 합니다.</li>
<li>정규성: 오차 항들은 정규 분포를 따라야 합니다.<h2 id="선형-회귀의-응용">선형 회귀의 응용</h2>
선형 회귀는 비교적 간단하지만 유용하며, 다양한 분야에서 활용됩니다. 예를 들어, 경제학에서는 소비자 지출과 소득의 관계를 분석하는 데 사용될 수 있고, 의학에서는 특정 질병의 위험 요소를 평가하는 데 사용될 수 있습니다. 또한, 마케팅에서는 광고 지출과 판매량 사이의 관계를 분석하는 데 활용될 수 있습니다.</li>
</ul>
<h1 id="cnnconvolutional-neural-networks-이미지-인식의-혁신">CNN(Convolutional Neural Networks): 이미지 인식의 혁신</h1>
<p>컴퓨터 비전 분야에서 이미지 인식은 머신러닝과 딥러닝 기술을 활용하여 컴퓨터가 사진이나 비디오에서 객체를 식별하고 분류하는 과정입니다. 이 분야에서 혁명적인 발전을 이룬 기술 중 하나가 바로 CNN(Convolutional Neural Networks, 합성곱 신경망)입니다. 이 글에서는 CNN의 기본 원리와 구조, 그리고 다양한 응용 분야에 대해 자세히 살펴보겠습니다.</p>
<h2 id="cnn의-원리">CNN의 원리</h2>
<p>CNN은 이미지 처리에 특화된 딥러닝 모델의 한 종류로, 이미지의 특징을 자동으로 추출하고 이를 기반으로 이미지를 분류합니다. 기존의 신경망과는 다르게, CNN은 이미지의 공간 정보를 유지하면서 학습이 가능하도록 설계되었습니다. 이는 CNN이 이미지 내의 작은 부분(패치)에 집중하여 패턴을 인식할 수 있게 해줍니다.</p>
<h2 id="cnn의-주요-구성-요소">CNN의 주요 구성 요소</h2>
<ul>
<li>합성곱 계층(Convolutional Layer): 이 계층은 이미지에서 특징을 추출하는 역할을 합니다. 여러 개의 필터(커널)를 사용하여 이미지를 스캔하고, 각 필터가 이미지의 특정 특징을 활성화시키는 방식으로 작동합니다.</li>
<li>활성화 함수(Activation Function): 대부분의 CNN에서는 ReLU(Rectified Linear Unit) 활성화 함수가 사용됩니다. 이 함수는 비선형성을 도입하여 네트워크가 복잡한 패턴을 학습할 수 있게 도와줍니다.</li>
<li>풀링 계층(Pooling Layer): 풀링 계층은 이미지의 차원을 축소하여 계산량을 줄이는 동시에 중요한 정보를 유지합니다. 가장 흔히 사용되는 방법은 맥스 풀링(Max Pooling)으로, 지정된 영역 내에서 가장 큰 값을 선택하는 방식입니다.</li>
<li>완전 연결 계층(Fully Connected Layer): 이 계층은 합성곱 계층과 풀링 계층을 거친 후의 정보를 바탕으로 최종 분류를 수행합니다. 이미지가 속할 클래스에 대한 확률을 출력하기 위해 사용됩니다.</li>
</ul>
<h2 id="cnn의-응용-분야">CNN의 응용 분야</h2>
<ul>
<li>객체 인식(Object Detection): 이미지 내의 다양한 객체를 식별하고 위치를 파악합니다.</li>
<li>얼굴 인식(Face Recognition): 얼굴의 특징을 학습하여 개인을 식별합니다.</li>
<li>자율 주행(Autonomous Driving): 도로의 상황을 인식하고 이해하여 자동차가 스스로 주행할 수 있도록 합니다.</li>
<li>의료 이미징(Medical Imaging): X-레이, MRI 등의 의료 이미지를 분석하여 질병을 진단합니다.</li>
</ul>
<p>CNN은 이미지 인식과 처리 분야에서 중요한 돌파구를 제시하였으며, 계속해서 발전하고 있는 기술입니다. 그 능력을 넘어, CNN은 머신러닝과 인공지능의 미래를 형성하는 데 중요한 역할을 하고 있으며, 앞으로도 그 가치와 가능성은 계속해서 확장될 것입니다.</p>
<h1 id="전이학습">전이학습</h1>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/9d9cf3dc-dd72-4061-82f0-4effbeffd771/image.png" alt="">
전이 학습은 사람이 배운 지식을 다른 문제나 상황에 적용하는 학습 방식에서 영감을 받았습니다. 구체적으로, 이미 특정 작업을 수행하기 위해 학습된 모델을 기반으로 새로운 모델을 훈련시키는 과정을 말합니다. 이 때, 기존 모델의 지식을 새 모델에 &#39;전이&#39;하여 학습 과정을 가속화하고, 데이터가 부족한 상황에서도 모델의 성능을 개선할 수 있습니다.</p>
<p>비글을 한 번 해보겠습니다.</p>
<pre><code>import sys
import numpy as np
import cv2


filename = &#39;data/beagle.jpg&#39;

img = cv2.imread(filename)

if img is None:
    print(&#39;Image load failed!&#39;)
    exit()

# Load network

net = cv2.dnn.readNet(&#39;data/bvlc_googlenet.caffemodel&#39;, &#39;data/deploy.prototxt&#39;)

if net.empty():
    print(&#39;Network load failed!&#39;)
    exit()

# Load class names

classNames = None
with open(&#39;data/classification_classes_ILSVRC2012.txt&#39;, &#39;rt&#39;) as f:
    classNames = f.read().rstrip(&#39;\n&#39;).split(&#39;\n&#39;)

# Inference

inputBlob = cv2.dnn.blobFromImage(img, 1, (224, 224), (104, 117, 123))
net.setInput(inputBlob)
prob = net.forward()

# Check results &amp; Display

out = prob.flatten()
classId = np.argmax(out)
confidence = out[classId]

text = &#39;%s (%4.2f%%)&#39; % (classNames[classId], confidence * 100)
cv2.putText(img, text, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 1, cv2.LINE_AA)

cv2.imshow(&#39;img&#39;, img)

cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1)
cv2.waitKey(1)</code></pre><p><img src="https://velog.velcdn.com/images/wi___s10/post/06dd59ab-531c-4080-88bf-7f7ae187a794/image.png" alt=""></p>
<h2 id="mediapipe">MediaPipe</h2>
<p>미디어파이프는 구글에서 주로 인체를 대상으로하는 비전인식기능들을  AI모델 개발과 기계학습까지 마친 상태로 제공하는 서비스입니다.</p>
<p>이걸 이용해 욕 제스쳐하면 모자이크 처리하는 프로그램을 만들어 봅시다.</p>
<pre><code>import cv2
import mediapipe as mp

# mediapipe에서 손 감지 모델을 불러옵니다.
mp_hands = mp.solutions.hands
# 손 감지 모델을 초기화합니다. 최대 손 개수를 1로 설정합니다.
hands = mp_hands.Hands(static_image_mode=False, max_num_hands=1)

# 모자이크 함수
def mosaic(img, x, y, w, h, size=30):
    # 이미지를 모자이크 처리합니다.
    for i in range(int(w / size)):
        for j in range(int(h / size)):
            xi = x + i * size
            yi = y + j * size
            # 모자이크 영역을 블러 처리합니다.
            img[yi:yi + size, xi:xi + size] = cv2.blur(img[yi:yi + size, xi:xi + size], (23, 23))

cap = cv2.VideoCapture(0)

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        continue
    frame = cv2.flip(frame, 1)

    rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    # 손 감지 모델을 통해 손을 감지합니다.
    results = hands.process(rgb_frame)

    # 손이 감지된 경우
    if results.multi_hand_landmarks:
        for hand_landmarks in results.multi_hand_landmarks:
            # 중지 손가락 끝의 y 좌표와 중지 손가락 끝의 y 좌표를 추출합니다.
            index_finger_tip_y = hand_landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_TIP].y * frame.shape[0]
            middle_finger_tip_y = hand_landmarks.landmark[mp_hands.HandLandmark.MIDDLE_FINGER_TIP].y * frame.shape[0]

            # 중지 손가락 끝의 y 좌표가 중지 손가락 끝의 y 좌표보다 큰 경우
            if index_finger_tip_y &gt; middle_finger_tip_y:
                # 모자이크를 적용할 영역의 좌상단과 우하단 좌표를 계산합니다.
                x_min, y_min = int(min(l.x * frame.shape[1] for l in hand_landmarks.landmark)), int(min(l.y * frame.shape[0] for l in hand_landmarks.landmark))
                x_max, y_max = int(max(l.x * frame.shape[1] for l in hand_landmarks.landmark)), int(max(l.y * frame.shape[0] for l in hand_landmarks.landmark))

                # 모자이크 함수를 호출하여 모자이크를 적용합니다.
                mosaic(frame, x_min, y_min, x_max - x_min, y_max - y_min)

    cv2.imshow(&#39;Fuck you Gesture Mosaic&#39;, frame)

    if cv2.waitKey(10) &amp; 0xFF == ord(&#39;q&#39;):
        break
cap.release()
cv2.destroyAllWindows()
</code></pre><p><img src="https://velog.velcdn.com/images/wi___s10/post/66a6e67c-933a-4dab-88f2-c3aa5b6a83cd/image.png" alt=""></p>
<p>잘 됩니다.
끝</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[AI] OpenCV Blur부터 Haar Cascade까지 ]]></title>
            <link>https://velog.io/@wi___s10/AI-OpenCV-Blur%EB%B6%80%ED%84%B0-Haar-Cascade%EA%B9%8C%EC%A7%80</link>
            <guid>https://velog.io/@wi___s10/AI-OpenCV-Blur%EB%B6%80%ED%84%B0-Haar-Cascade%EA%B9%8C%EC%A7%80</guid>
            <pubDate>Wed, 27 Mar 2024 01:34:58 GMT</pubDate>
            <description><![CDATA[<p>Blur, Canny, Erode, Dilation과 같은 기본적인 이미지 처리 방법와 Haar Cascade를 활용한 얼굴 인식에 대해서 알아보자.</p>
<h1 id="blur">Blur</h1>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/3a420723-671a-46db-9942-5dc325081232/image.jpg" alt=""></p>
<blockquote>
<p>이미지에 블러 효과를 주어 디테일을 줄이고, 노이즈를 제거하는 테크닉 </p>
</blockquote>
<p>사진에서 배경을 흐리게 하거나, 얼굴 식별을 어렵게 만드는 등의 용도로 사용된다.
사진이나 영상이 너무 선명해서 안 좋을 때도 눈에 덜 거슬리고 보기 좋도록 쓰기도 한다.</p>
<h1 id="canny-edge-detection">Canny Edge Detection</h1>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/3755ceb3-6093-4ca3-a51f-9c54e9bbfc1b/image.jpg" alt=""></p>
<blockquote>
<p>이미지에서 엣지(경계선)를 검출하는 알고리즘</p>
</blockquote>
<p>Canny Edge Detection은 사진에서 중요한 선을 찾아주는 건데, 사람 얼굴이나 물체의 경계선을 드러낸다. 
이미지의 높은 변화율을 찾아내어 객체의 외곽선 추출이나, 형태 분석에 유용하다.</p>
<h1 id="erode과-dilation">Erode과 Dilation</h1>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/4f829f68-6094-49a8-b5dc-d6d634fd1aa1/image.png" alt=""></p>
<blockquote>
<p>모폴로지 기법: 영상 내부 객체의 형태와 구조를 분석하고 처리하는 기법</p>
</blockquote>
<p>둘을 묶어 모폴로지 기법이라 부른다.
Erode(침식)는 필터 내에 검은색이 하나라도 있다면 검은색을 반환하여 결과적으로 이미지의 흰색 부분을 침식한다.
Dilation(팽창)는 필터 내에 흰색이 하나라도 있다면 흰색을 반환하여 결과적으로 이미지의 흰색 부분을 확장시킨다.
보통 사진에서 잡다한 부분을 치우고 중요한 부분만 부각시킬 때 사용한다.</p>
<h1 id="여러가지-affine">여러가지 affine</h1>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/85d477ec-f304-4b69-8b65-57ded0f69729/image.jpg" alt=""></p>
<blockquote>
<p>affine 변환: 이미지를 평행 이동, 회전, 크기 변환 등을 통해 변형하는 변환</p>
</blockquote>
<ul>
<li>이동(Translation)
이미지나 객체를 특정 방향으로 이동시킨다. 좌표를 특정하게 변환하여 이미지를 이동한다.</li>
<li>회전(Rotation)
이미지나 객체를 특정 각도만큼 회전시킨다. 이미지의 중심점을 기준으로 회전한다.</li>
<li>크기 변환(Scaling)
이미지나 객체의 크기를 조절. 크기 조정은 이미지나 객체의 폭과 높이를 각각 다른 비율로 확대 또는 축소하여 수행된다.</li>
</ul>
<h1 id="contour">Contour</h1>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/f403b657-c8f7-4654-a981-1381ee691f65/image.jpg" alt=""></p>
<blockquote>
<p>이미지에서 연속된 동일한 색상 또는 강도를 가지고 있는 영역의 경계를 나타내는 것</p>
</blockquote>
<p> cv2.findContours(src, mode, method, offset) → contours, hierarchy 함수를 사용하여 외곽선을 검출한다. 외곽선을 통해 객체의 넓이, 둘레 길이, 바운딩 박스 등 다양한 특징을 추출할 수 있다. 이를 통해 객체의 크기, 모양 등을 분석할 수 있다~ </p>
<p>아래의 노트북 사진에서 도형을 추출해 보자.</p>
<h1 id="1">1</h1>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/f6a8eea7-abfd-402d-b411-eaf1df585ff7/image.jpg" alt=""></p>
<pre><code>import cv2
import numpy as np
# 이미지를 불러오고 크기 조정
img = cv2.imread(&#39;data/tablet.jpg&#39;)
img = cv2.resize(img, (800, 500))
# 이미지를 그레이스케일로 변환
imgGrey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Canny 엣지 검출기를 사용하여 엣지 검출
canny = cv2.Canny(imgGrey, 150, 150)
# 팽창 연산을 적용하여 엣지 더 뚜렷하게
kernal = np.ones((5,5), np.uint8)
dilation = cv2.dilate(canny, kernal, iterations = 1)
# 침식 연산을 적용하여 팽창된 엣지 세밀하게
eroded = cv2.erode(dilation, kernal, iterations = 1)
# 결과를 보여줍니다.
cv2.imshow(&quot;eroded&quot;, eroded)

# 이진화를 통해 배경과 전경 분리
_, thrash = cv2.threshold(eroded, 200, 255, cv2.THRESH_BINARY)
contours, _ = cv2.findContours(thrash, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# 이진화된 이미지
cv2.imshow(&quot;thrash&quot;, thrash)

for contour in contours:
    if cv2.contourArea(contour) &lt; 100:
        continue
    # 윤곽선을 근사화하여 도형을 인식
    approx = cv2.approxPolyDP(contour, 0.01* cv2.arcLength(contour, True), True)
    # 인식된 도형을 이미지에 그림
    cv2.drawContours(img, [approx], 0, (0, 255, 0), 5)
    # 도형의 이름을 표시할 위치
    x = approx.ravel()[0]
    y = approx.ravel()[1] - 5

    # 꼭짓점의 개수에 따라 도형의 이름을 결정, 이미지에 표시
    if len(approx) == 3:
        cv2.putText(img, &quot;Triangle&quot;, (x, y), cv2.FONT_HERSHEY_COMPLEX, 0.5, (0, 0, 0))
    elif len(approx) == 4:
        x1, y1, w, h = cv2.boundingRect(approx)
        aspectRatio = float(w)/h
        print(aspectRatio)
        if aspectRatio &gt;= 0.95 and aspectRatio &lt;= 1.05:
            cv2.putText(img, &quot;square&quot;, (x, y), cv2.FONT_HERSHEY_COMPLEX, 0.5, (0, 0, 0))
        else:
            cv2.putText(img, &quot;rectangle&quot;, (x, y), cv2.FONT_HERSHEY_COMPLEX, 0.5, (0, 0, 0))
    elif len(approx) == 5:
        cv2.putText(img, &quot;Pentagon&quot;, (x, y), cv2.FONT_HERSHEY_COMPLEX, 0.5, (0, 0, 0))
    elif len(approx) == 10:
        cv2.putText(img, &quot;Star&quot;, (x, y), cv2.FONT_HERSHEY_COMPLEX, 0.5, (0, 0, 0))
    else:
        cv2.putText(img, &quot;Circle&quot;, (x, y), cv2.FONT_HERSHEY_COMPLEX, 0.5, (0, 0, 0))

# 이미지 출력
cv2.imshow(&quot;shapes&quot;, img)
cv2.waitKey()
cv2.waitKey(1)
cv2.waitKey(1)
cv2.waitKey(1)
cv2.waitKey(1)
cv2.destroyAllWindows()
</code></pre><p><img src="https://velog.velcdn.com/images/wi___s10/post/be5963e4-9da2-4445-be21-2a6adcdb2613/image.png" alt=""></p>
<h1 id="haar-cascade">Haar Cascade</h1>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/64b10d52-684c-4871-891e-53cb5baddd73/image.jpg" alt=""></p>
<blockquote>
<p>객체 검출을 위한 기계 학습 기반의 접근 방식 중 하나</p>
</blockquote>
<p>얼굴 검출에 많이 사용되며, 여러 단계의 분류기를 거쳐 객체를 검출한다.
빠르고 효율적으로 이미지 내에서 얼굴과 같은 객체를 찾을 수 있으며, 이는 보안, 모니터링, 인터랙티브 미디어 등 다양한 분야에서 활용될 수 있다.</p>
<p>얼굴 모자이크를 감상하러 가보자.</p>
<h1 id="2">2</h1>
<pre><code>import cv2

# 얼굴 감지를 위한 Haar Cascade 분류기 로드
faceCascade = cv2.CascadeClassifier(&quot;data/haarcascade_frontalface_default.xml&quot;)

# 카메라 장치 열기 (0은 기본 카메라를 의미)
cap = cv2.VideoCapture(0)

# 비디오 파일 저장을 위한 설정 (코덱, 파일명, FPS, 해상도)
fourcc = cv2.VideoWriter_fourcc(*&#39;XVID&#39;)
out = cv2.VideoWriter(&#39;output.avi&#39;, fourcc, 20.0, (640, 480))

while(cap.isOpened()):
    ret, frame = cap.read()
        if ret == True: 
        # 프레임을 그레이스케일로 변환
        imgGray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
                # 그레이스케일 이미지에서 얼굴 감지
        faces = faceCascade.detectMultiScale(imgGray, 1.1, 4)
        for (x, y, w, h) in faces:
            # 얼굴 영역(Region of Interest, ROI) 추출
            roi = frame[y:y+h, x:x+w]
            # 모자이크 효과 적용: ROI를 축소했다가 원래 크기로 확대
            factor = 30
            small_roi = cv2.resize(roi, (w//factor, h//factor))
            mosaic_roi = cv2.resize(small_roi, (w, h), interpolation=cv2.INTER_NEAREST)
            # 원본 프레임에 모자이크 처리된 ROI를 다시 적용
            frame[y:y+h, x:x+w] = mosaic_roi
        # 모자이크 처리된 프레임을 화면에 표시
        cv2.imshow(&#39;frame&#39;, frame)

        # &#39;q&#39; 키를 누르면 끝
        if cv2.waitKey(1) &amp; 0xFF == ord(&#39;q&#39;):
            break
    else:
        break

cap.release()
out.release()
cv2.destroyAllWindows()</code></pre><p><img src="https://velog.velcdn.com/images/wi___s10/post/b3376d00-4bab-420e-b6ac-77d0271f29ec/image.png" alt=""></p>
<p>모자이크가 잘 된다.</p>
<p>이번엔 affine까지 해서 노트북 사진에 canny로 외곽선 따고, 외곽선 잘 뜨게 하고,  사진 삐딱한 거 projective 써서 직사각형으로 만들어보겠다.</p>
<h1 id="3">3</h1>
<pre><code>import cv2
import numpy as np

# 이미지 불러오기
img = cv2.imread(&#39;data/notebook.jpg&#39;)

# 이미지 크기 조정
img = cv2.resize(img, (800, 600))

# Canny로 외곽선 따기
imgGrey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
canny = cv2.Canny(imgGrey, 150, 150)

# 외곽선을 더 뚜렷하게 만들기
kernal = np.ones((5,5), np.uint8)
dilation = cv2.dilate(canny, kernal, iterations=1)
eroded = cv2.erode(dilation, kernal, iterations=1)
blurred = cv2.GaussianBlur(eroded, (5, 5), cv2.BORDER_DEFAULT)

# 원근 변환을 위한 소스 및 목표 좌표 설정
# 주의: 아래의 pts1과 pts2는 예시 값입니다. 실제 이미지에 맞게 조정해야 합니다.
pts1 = np.float32([[320, 15], [700, 215], [85, 610], [530, 780]])
pts2 = np.float32([[0, 0], [800, 0], [0, 600], [800, 600]])

# 원근 변환 행렬 계산
matrix = cv2.getPerspectiveTransform(pts1, pts2)

# 원근 변환 적용
result = cv2.warpPerspective(img, matrix, (800, 600))

cv2.imshow(&quot;Original Image&quot;, img)
cv2.imshow(&quot;Canny Edge&quot;, canny)
cv2.imshow(&quot;Dilation + Erosion&quot;, eroded)
cv2.imshow(&quot;Blurred Edge&quot;, blurred)
cv2.imshow(&quot;Perspective Transform&quot;, result)
cv2.waitKey(0)
cv2.destroyAllWindows()
</code></pre><p>끝~</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[요구사항은 중요한듯]]></title>
            <link>https://velog.io/@wi___s10/%EC%9A%94%EA%B5%AC%EC%82%AC%ED%95%AD-%EB%AA%85%EC%84%B8%EC%84%9C</link>
            <guid>https://velog.io/@wi___s10/%EC%9A%94%EA%B5%AC%EC%82%AC%ED%95%AD-%EB%AA%85%EC%84%B8%EC%84%9C</guid>
            <pubDate>Thu, 21 Mar 2024 05:58:20 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/wi___s10/post/f906cc20-ffb7-4097-858c-b2520c45297f/image.jpg" alt=""></p>
<h1 id="요구사항-공학이-중요한-이유">요구사항 공학이 중요한 이유</h1>
<ul>
<li>요구사항 공학: 참여자들로 하여금 개발되는 소프트웨어 제품을 전체적으로 파악하도록 하여 <strong>의사 소통 시간을 절약</strong>하게 해 주는 것<ul>
<li>상세한 요구사항이 있어야만 산정이 가능하고, 이를 기반으로 계획을 세울 수 있기 때문~
<img src="https://velog.velcdn.com/images/wi___s10/post/06c7d01e-0a84-4fd3-babc-567a4288fc79/image.png" alt=""></li>
</ul>
</li>
</ul>
<h1 id="요구사항-엔지니어링">요구사항 엔지니어링</h1>
<p>고객이 시스템에 요구하는 서비스가 무엇인지 확립하고 시스템을 개발하고 운영하는 동안 충족해야하는 제약사항(constraint)이 무엇인가를 정립하는 과정.</p>
<p>실질적인 개발 과정에서 가장 먼저 진행되는 작업이다. 이 작업의 결과를 바탕으로 이후의 설계(design), 구현(implementation), 테스트(test)가 진행되기 때문에 굉장히 <strong>중요한 단계</strong>라고 볼 수 있다.</p>
<p>시스템에 대한 요구사항을 완전하게(complete), 그리고 요구사항 간의 충돌이 없도록 일관성 있게(consistent) 정립하는 것을 추구한다.</p>
<h1 id="요구사항의-종류">요구사항의 종류</h1>
<p>일반적으로 <strong>기능적, 비기능적</strong> 요구사항으로 구분하며, 기술 관점과 대상 범위에 따라 시스템 요구사항, 사용자 요구사항으로 나뉜다.</p>
<ol>
<li>기능적 요구사항 
 시스템이 무엇을 하는지, 어떤 기능을 하는지에 대한 사항이며 시스템이 반드시 수행해야 하는 기능이다.
  ex) 사용자는 회원ID와 비밀번호를 입력하여 로그인할 수 있다.</li>
<li>비기능적 요구사항
성능, 인터페이스, 장비 구성 등 대부분 품질이나 제약사항과 관련이 있는 요구사항들이다.
 ex) 시스템은 1년 365일, 하루 24시간 운용이 가능해야 한다.</li>
<li>사용자 요구사항 
사용자 관점에서 본 시스템이 제공해야 할 요구사항. 사용자를 위한 것이므로 친숙한 표현과 이해하기 쉽게 작성한다.</li>
<li>시스템 요구사항
개발자 관점에서 본 시스템 전체가 사용자와 다른 시스템에 제공해야 할 요구사항. 개발자 입장으로 쓰여진 것이기 때문에 전문적이고 기술적인 용어로 구성되어 있다~</li>
</ol>
<h1 id="requirements-engineering-process">requirements engineering process</h1>
<p>(요구사항 엔지니어링 프로세스 라는 뜻)</p>
<p>개발 대상에 대한 요구사항을 체계적으로 도출하고 이를 분석한 후 <strong>분석 결과를 명세서에 정리</strong>한 다음 마지막으로 이를 <strong>확인 및 검증</strong>하는 일련의 구조화된 활동이다.
<img src="https://velog.velcdn.com/images/wi___s10/post/cf8d40e4-468e-4ef5-9bad-ec194925edcf/image.png" alt=""></p>
<h1 id="fast-guidelines">FAST guidelines</h1>
<p>소프트웨어 개발 프로젝트에서 요구사항을 분석하고 시스템의 기능을 정의하는 데 사용되는 기법이다.  문제에 대해 객관적으로 생각하고 프로젝트의 범위를 식별함으로써 복잡한 시스템을 보다 쉽게 이해하고 관리할 수 있게 된다.
<img src="https://velog.velcdn.com/images/wi___s10/post/82cb3345-04c7-40a7-a341-d17f391b9f48/image.png" alt=""></p>
<h3 id="적용-방법">적용 방법</h3>
<ol>
<li>프로젝트에서 식별된 기능으로 시작한다.</li>
<li>&quot;How&quot; 경로를 따라 기능이 어떻게 달성되는지 물어보고, 답변을 활동 동사와 측정 가능한 명사의 형태로 오른쪽에 배치한다. &quot;Why&quot; 경로(오른쪽에서 왼쪽으로)의 논리를 테스트하여 이 기능이 왜 수행되는지 묻는다.</li>
</ol>
<p>+논리가 작동하지 않을 때엔 누락되거나 중복된 기능을 식별하거나 순서를 조정하고, 동시에 발생하는 기능을 식별하기 위해 &quot;이 기능이 수행될 때, 무엇이 또한 수행되거나 이 기능에 의해 발생하는가?&quot;를 다시 되짚어보면 된다.</p>
<h1 id="davis-principles">Davis` Principles</h1>
<p>소프트웨어 개발 과정 전반에 걸쳐 품질을 최우선으로 두는 접근 방식
아래와 같은 원칙들이 있다.</p>
<ul>
<li>품질을 1순위로</li>
<li>고객에게 제품을 조기에 제공</li>
<li>요구 사항을 결정하기 전에 문제를 파악</li>
<li>설계 대안 평가</li>
<li>적절한 프로세스 모델 사용</li>
<li>다양한 단계에 다른 언어 사용</li>
<li>지적 거리 최소화</li>
<li>기술을 도구보다 우선시</li>
<li>코드 검사</li>
<li>좋은 관리가 기술보다 중요</li>
<li>사람이 성공의 열쇠</li>
</ul>
<h1 id="use-case-model">Use case model</h1>
<p>사용자가 시스템과 상호작용하는 방식을 보여준다.</p>
<h2 id="유스케이스-다이어그램">유스케이스 다이어그램</h2>
<p>시스템의 기능을 나타내기 위해 사용자의 요구를 추출하고 분석하는데 사용
<strong>유스케이스(시스템 기능)</strong>, <strong>액터(시스템과 상호작용 하는 것)</strong>으로 구성된다.</p>
<p>액터가 될 수 있는 것에는 <strong>사용자가 맡은 일, 다른 시스템</strong>이 있다.
액터를 찾기 위한 질문</p>
<ul>
<li>시스템의 지원을 받는가?</li>
<li>어떤 사용자 그룹이 시스템의 주요기능을 사용하는가?</li>
<li>보수와 관리 등의 부수적 기능을 사용하는가?</li>
<li>외부 하드웨어나 소프트웨어 시스템과 동작하는가?</li>
</ul>
<p>부마위키
<a href="https://buma.wiki">https://buma.wiki</a>
내가 다니는 부산소프트웨어마이스터고에서 쓰는 교내 나무위키다.
처음에 야심차게 다른 학교에도 만들어주겠다고 만들었는데 다른 소프트웨어마이스터고에서도 따라서 만들어서 실패한 것 같다.</p>
<p>아무튼 이걸 보고 간단하게 쓴 use case model을 보고 가자~
<img src="https://velog.velcdn.com/images/wi___s10/post/7d0bb8d7-b54d-46b3-bca1-334f7246e7d5/image.png" alt="">
잘 쓴 것은 아니기에 충분히 좋은 use case model을 참고하길 바란다.</p>
<p>끝~</p>
<p>출처
<a href="https://newdevlog.tistory.com/14">https://newdevlog.tistory.com/14</a>
<a href="https://lizarmong-water.tistory.com/16">https://lizarmong-water.tistory.com/16</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로세스와 모델들 몇 가지]]></title>
            <link>https://velog.io/@wi___s10/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EB%AA%A8%EB%8D%B8%EB%93%A4-%EB%AA%87-%EA%B0%80%EC%A7%80</link>
            <guid>https://velog.io/@wi___s10/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EB%AA%A8%EB%8D%B8%EB%93%A4-%EB%AA%87-%EA%B0%80%EC%A7%80</guid>
            <pubDate>Mon, 18 Mar 2024 11:20:44 GMT</pubDate>
            <description><![CDATA[<h1 id="1-소프트웨어-공학에서-프로세스란">1. 소프트웨어 공학에서 프로세스란?</h1>
<blockquote>
<p><strong>*작업</strong> 순서의 집합과 일정, 예산, 자원 등 제약 조건을 포함하는 일련의 활동과 그것들의 순서</p>
</blockquote>
<p>** <em>작업(task)*</em> : 소프트웨어를 개발할 때 일을 수행하는 작은 단위</p>
<p>프로세스를 설명할 때에는 누가 참여하는지, 무엇을 만드는지와 일련의 활동에 영향을 주는 조건들이 중요하다.</p>
<ul>
<li>제품과 산출물 : 프로세스 활동의 결과물이다.</li>
<li>역할(role) : 프로세스에 참여하는 사람들의 책임을 나타낸다.</li>
<li>사전/사후 조건 : 프로세스 활동이 이루어지거나 제품이 만들어지는 전과 후에 만족해야 하는 조건들이다.</li>
</ul>
<p>그냥 <strong>소프트웨어 시스템을 개발하거나 유지보수할 목적으로 수행되는 활동 또는 그 절차</strong>를 뜻한다. </p>
<h1 id="2-프로세스가-필요한-이유">2. 프로세스가 필요한 이유</h1>
<p>소프트웨어 개발 프로세스의 목적은 <strong>전체적인 개발에 대한 가이드라인을 제공</strong>하는 데 있다. 
 소프트웨어 개발 프로세스를 이용하면 전체 프로세스의 이해에 도움을 주고, 자원 사용에 대한 사전 계획을 가능하게 하며 자원사용을 추적하고 통제할 수 있다.</p>
<p> 체계적인 개발을 지원할 수 있으며 프로젝트의 관리에도 도움을 주기에, 개발 조직은 적당한 프로세스 모델을 보유하여 공통의 개발문화와 공통의 기술을 제공해야한다.</p>
<p>소프트웨어 개발 프로세스 모델은 <strong>SDLC, Software Development Life Cycle</strong>를 기반으로 설명된다.
<img src="https://velog.velcdn.com/images/wi___s10/post/110b77f5-98d7-46fd-9c4f-c5ab48ab37a4/image.jpeg" alt=""></p>
<blockquote>
<p><strong>생명주기 5단계</strong> 요구분석 -&gt; 설계 -&gt; 구현(코딩) -&gt; 테스트 -&gt; 발전&amp;유지보수</p>
</blockquote>
<h1 id="3-cmmi-란">3. CMMI 란?</h1>
<blockquote>
<p>조직의 프로세스 개선 활동을 효율적으로 지원하기 위한 모델</p>
</blockquote>
<p> 조직의 개발능력이 얼마나 성숙되었는지를  평가할 수 있도록 만든 모델로써, 현재 전 세계 106개국에서 도입하여 적용하고 있는 산업계 표준이다.
 CMMI에서는 조직의 프로세스 성숙도를 다음의 성숙도 레벨 5단계로 표현한다.</p>
<h3 id="cmmi의-성숙도-단계">CMMI의 성숙도 단계</h3>
<p> <img src="https://velog.velcdn.com/images/wi___s10/post/c550f590-5d4d-460f-ae8a-b4b6537b052d/image.jpeg" alt=""></p>
<ul>
<li>레벨 1: <strong>초기 (Initial)</strong>: 이 단계의 조직은 프로세스가 문서화되거나 표준화되지 않아 예측 불가능하며, 제어되지 않는 상태입니다. 결과는 종종 예측할 수 없고, 프로젝트의 성공은 개인의 역량에 크게 의존합니다.</li>
<li>레벨 2: <strong>관리 (Managed)</strong>: 프로젝트 수준에서 기본적인 프로젝트 관리 프로세스가 수립되어 있습니다. 계획, 수행, 측정 및 통제의 기본적인 접근 방식이 존재하여 프로젝트 결과를 더 예측 가능하게 합니다.</li>
<li>레벨 3: <strong>정의됨 (Defined)</strong>: 조직 수준의 표준 프로세스가 정의되어 있으며, 프로젝트 팀은 이 표준을 기반으로 자신의 프로세스를 맞춤화합니다. 조직 전체의 활동이 더 일관되고 예측 가능해집니다.</li>
<li>레벨 4: <strong>양적 관리 (Quantitatively Managed)</strong>: 프로세스의 성능을 측정하고 관리하기 위해 양적(정량적) 목표를 사용합니다. 이 단계에서는 데이터를 분석하여 프로세스 성능을 지속적으로 개선합니다.</li>
<li>레벨 5: <strong>최적화 (Optimizing)</strong>: 지속적인 프로세스 개선을 통해 신규 목표 달성과 현재 프로세스의 성능 개선에 집중합니다. 이는 혁신과 기술 개발을 통해 이루어지며 변동 및 미래의 위험을 더 잘 관리하게 됩니다.</li>
</ul>
<h1 id="4-프로세스의-종류">4. 프로세스의 종류</h1>
<p> 워터풀 모델, RAD 모델, 프로토타이핑 모델, v모델, 나선형 모델, 애자일 모델, 반복형 개발 모델, 스크럼, TDD 등이 있다.
아래에서 더 자세히 살펴보자</p>
<h1 id="5-워터폴-모델">5. 워터폴 모델</h1>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/76b81372-7221-4e4f-afdf-9815e2a06ac7/image.jpeg" alt=""></p>
<blockquote>
<p>소프트웨어 개발 시 단계적으로 개발하는 방법론</p>
</blockquote>
<p>폭포수 모델은 계획-&gt;요구분석-&gt;설계-&gt;구현-&gt;테스트-&gt;유지보수의 단계들이 하향식으로 진행되며, 병행이나 거슬러 올라가지 않는다. 따라서, 각 단계의 종료마다 확실하게 작업을 종료하고 그 결과를 확인한 뒤 다음 단계로 내려간다.</p>
<h3 id="장점">장점</h3>
<ul>
<li>관리의 용이</li>
<li>체계적인 문서화</li>
<li>요구사항의 변화가 적은 프로젝트에 효과적<h3 id="단점">단점</h3>
</li>
<li>각 단계는 이전 단계가 완료되어야 수행됨</li>
<li>각 단계의 결과물이 완벽한 수준이 되어야 다음 단계에서 오류없이 작업 수행 가능</li>
<li>사용자가 중간에 가시적인 결과를 볼 수 없음</li>
</ul>
<h1 id="6-rad-모델">6. RAD 모델</h1>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/17880c8f-f6a1-4a3f-9889-b28e011dfba2/image.png" alt=""></p>
<blockquote>
<p> 특별한 계획 없이 프로토타입을 기반으로 하는 소프트웨어 개발 방법론</p>
</blockquote>
<p>계획 수립&amp;요구분석-&gt;프로토타입 개발-&gt;프로토타입 평가-&gt;구현-&gt;테스트-&gt;유지보수의 단계로 진행된다.</p>
<h3 id="장점-1">장점</h3>
<ul>
<li>요구사항의 완전한 이해와 프로젝트 범위의 명확한 설정 시 신속한 개발 및 완전한 기능 구현이 가능</li>
<li>재사용 가능 컴포넌트 활용으로 시스템 시험 기간이 짧아짐</li>
</ul>
<h3 id="단점-1">단점</h3>
<ul>
<li>책임감 있는 구성원이 없을 경우 실패</li>
<li>적절한 모듈화 가능성이 전제되어야 함</li>
<li>기술적 위험이 높을 경우 부적합<h1 id="7-프로토타이핑-모델">7. 프로토타이핑 모델</h1>
<img src="https://velog.velcdn.com/images/wi___s10/post/339959c8-0d9b-436d-b2e0-215821f7c4da/image.jpeg" alt=""></li>
</ul>
<p>요구분석 -&gt; 프로토타입 설계 -&gt; 초기 프로토타입 개발 -&gt; 고객 피드백 수집 -&gt; 프로토타입 수정의 단계로 진행된다.</p>
<h3 id="장점-2">장점</h3>
<ul>
<li>요구사항을 명확히 정의하기 힘들 때 효과적</li>
<li>실제적이고 구체적임</li>
<li>정확한 요구사항을 도출하여 클라이언트가 원하는 시스템을 개발할 수 있음</li>
<li>클라이언트의 참여를 증진시킴<h3 id="단점-2">단점</h3>
</li>
<li>명세가 없음</li>
<li>작은 프로젝트에 적합</li>
<li>오늘날의 환경에 부적합</li>
</ul>
<h1 id="그-외의-모델">그 외의 모델</h1>
<h2 id="v모델">v모델</h2>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/0f5f8899-ef15-4a9d-b202-3c78f13e85cb/image.png" alt=""></p>
<blockquote>
<p>개발 과정과 테스트 과정이 V자 형태로 대칭을 이루면서 진행되는 소프트웨어 개발 방법론</p>
</blockquote>
<p>각 개발 단계가 끝날 때마다 해당 단계에서 발생할 수 있는 결함을 테스트하여 품질을 보장한다.
<strong>장점</strong></p>
<ul>
<li>이해와 적용법이 쉬움</li>
<li>작업의 순서가 명확하여 관리가 용이</li>
</ul>
<p><strong>단점</strong></p>
<ul>
<li>요구사항 변경에 유연하지 않음<h2 id="나선형-모델">나선형 모델</h2>
<img src="https://velog.velcdn.com/images/wi___s10/post/9d473503-8ca4-4276-878b-2a73514394ab/image.png" alt=""></li>
</ul>
<blockquote>
<p>계획, 위험 분석, 엔지니어링 및 고객 평가의 4가지 주요 활동을 반복적으로 수행하는 개발 방법론</p>
</blockquote>
<p>결과적으로 위험을 최소화할 수 있다.
<strong>장점</strong></p>
<ul>
<li>위험 분석에 중점을 두어 대규모 프로젝트에 적합</li>
<li>요구사항 변경에 유연</li>
</ul>
<p><strong>단점</strong></p>
<ul>
<li>비용 산정&amp;프로젝트 기간의 예측이 어려움<h2 id="애자일-모델">애자일 모델</h2>
<img src="https://velog.velcdn.com/images/wi___s10/post/7a196d0f-e39b-4594-bf84-e5f532e99cdc/image.png" alt=""><blockquote>
<p>일정한 주기를 가지고 빠르게 제품을 출시하여 고객의 요구사항, 변화된 환경에 맞게 요구를 더 하고 수정해나가는 탄력적인 방법론</p>
</blockquote>
</li>
</ul>
<p><strong>장점</strong></p>
<ul>
<li>변화하는 요구사항에 신속하게 대응 가능</li>
<li>고객의 지속적인 피드백으로 품질 향상</li>
</ul>
<p><strong>단점</strong></p>
<ul>
<li>문서화가 충분하지 않아 후기 단계에서 어려움이 발생할 수 있음</li>
<li>프로젝트 방향 설정이 어려움</li>
</ul>
<h2 id="-워터폴-모델의-요구사항명세서-예시">+ 워터폴 모델의 요구사항명세서 예시</h2>
<p>나는 오늘의집의 요구사항 명세서를 작성해 보았다.
<img src="https://velog.velcdn.com/images/wi___s10/post/06af35ff-bdbd-4f8e-8a98-2309aa1b0b78/image.png" alt=""></p>
<p>딱히 좋은 예시는 아니긴 하다.
요구사항 정의서에는 필수적으로 요구사항 구분, 요구사항 ID, 요청사항(기능), 요청사항에 대한 설명, 요청자, 수용 여부가 필요하다. 물론 플로젝트마다 다르긴 하겠지만, 잘 된 예시는 아래 링크에서 찾도록 하자</p>
<p><a href="https://brunch.co.kr/@uxuxlove/123">https://brunch.co.kr/@uxuxlove/123</a></p>
<p>끝~</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[AI] OpenCV에 대해 알아보자]]></title>
            <link>https://velog.io/@wi___s10/AI-OpenCV%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90</link>
            <guid>https://velog.io/@wi___s10/AI-OpenCV%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90</guid>
            <pubDate>Sun, 17 Mar 2024 13:48:00 GMT</pubDate>
            <description><![CDATA[<h1 id="영상인식이란">영상인식이란?</h1>
<p> 영상인식은 사람, 물체, 장소 및 기타 요소를 식별할 수 있는 이미지를 감지하고 분석하는 기술이다. 
 <img src="https://velog.velcdn.com/images/wi___s10/post/4faaf88f-34a8-4132-b5ff-6a5bc61e7740/image.jpeg" alt="">
 분류, 태깅, 검출, 분할 등과 같은 기술을 사용해 공장 자동화 시스템에서 얼굴 인식, 의료 분야에서 질병 진단, 자율 주행 차량에서의 장애물 인식에 이르기까지 다양한 분야에 적용된다.</p>
<h1 id="opencv란">OpenCv란?</h1>
<p><img src="https://velog.velcdn.com/images/wi___s10/post/50987333-d4e2-413f-899f-b62817adf524/image.png" alt="">
 OpenCv(Open Source Computer Vision)는 이미지나 영상 처리에 사용할 수 있는 오픈 소스 라이브러리이다. OpenCV의 기원은 인텔에서부터 시작되는데, 컴퓨터 비전과 인공지능의 발달 시키고자 하는 바램으로 OpenCV를 출시한 것이다. 
 인텔은 OpenCV를 배포해서 OpenCV가 점차 발전함에 따라 빠른 인텔 프로세서의 수요가 늘어나는 것을 노렸을 지도</p>
<p>이런 걸 할 수 있다.
<img src="https://velog.velcdn.com/images/wi___s10/post/fc075b07-f1ee-4632-99f1-4c5fa7e892e3/image.jpeg" alt=""></p>
<h1 id="mac-파이썬-가상환경부터-주피터-노트북-세팅까지">Mac 파이썬 가상환경부터 주피터 노트북 세팅까지...</h1>
<blockquote>
<p>파이썬이 없어도 OK입니다</p>
</blockquote>
<ol>
<li><p>아나콘다 설치
<a href="https://www.anaconda.com/download#downloads">https://www.anaconda.com/download#downloads</a>
mac m2쓰는 사람도 맨 위에 있는 것 말고 아래에 있는 <strong>m1</strong>용을 깔도록 하자.</p>
</li>
<li><p>가상환경 생성 및 실행</p>
<pre><code>conda create -n [가상환경 이름] python=[사용할 파이썬 버전]</code></pre></li>
<li><p>가상환경에 주피터노트북 커널 연결하기</p>
<pre><code>conda activate [가상환경 이름] 
pip install ipykernel
python -m ipykernel install --user --name [가상환경 이름] --display-name [가상환경 이름]</code></pre></li>
<li><p>주피터 노트북 실행
 터미널을 끄고 킨 후에 주피터를 실행시키자.</p>
<pre><code>conda activate [가상환경 이름] 
jupyter notebook</code></pre><h1 id="opencv-이미지-출력-영상-출력-방법">openCv 이미지 출력, 영상 출력 방법</h1>
</li>
</ol>
<h2 id="파일을-이용한-이미지-출력-방법">파일을 이용한 이미지 출력 방법</h2>
<pre><code>import cv2

img = cv2.imread(&#39;data/Dog.jpg&#39;)
cv2.imshow(&#39;image&#39;, img) # 파일 경로에서부터 사진을 찾아 이미지를 출력해준다.
cv2.waitKey() # 안에 들어가는 숫자의 ms만큼 기다린다.
cv2.destroyAllWindows()
cv2.waitKey(1)
cv2.waitKey(1)
cv2.waitKey(1)
cv2.waitKey(1)</code></pre><p>사진을 흑백으로 띄우고 싶으면 imshow 부분을 아래처럼 쓰면 된다</p>
<pre><code>cv2.imshow(&#39;image&#39;, gray) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
cv2.imshow(&#39;image&#39;, gray)</code></pre><p>cv2.waitKey(1) * 4 는 mac을 사용하는 사람만 써주면 된다..
<img src="https://velog.velcdn.com/images/wi___s10/post/26481d6a-cf2f-400e-af60-9382858a6d6f/image.png" alt=""></p>
<h2 id="영상을-이용한-이미지-출력-방법">영상을 이용한 이미지 출력 방법</h2>
<h3 id="웹캠-on">웹캠 on</h3>
<pre><code>cap = cv2.VideoCapture(0)
print(cap.isOpened())
while(cap.isOpened()):
    ret, frame = cap.read()  # 웹캠에서 성공여부 ret과 이미지객체 frame 을 추출한다
    if ret :
        cv2.imshow(&#39;frame&#39;, frame) # 이미지를 윈도우에 출력
        if cv2.waitKey(1) &amp; 0xFF == ord(&#39;q&#39;):
            break
    else:
        break

cap.release()
cv2.destroyAllWindows()
cv2.waitKey(1)
cv2.waitKey(1)
cv2.waitKey(1)
cv2.waitKey(1)</code></pre><p>이것도 흑백처럼 쓸 수 있다.</p>
<pre><code>    if ret :
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        cv2.imshow(&#39;frame&#39;, gray)</code></pre><h3 id="영상-녹화----videowriter">영상 녹화  - VideoWriter</h3>
<pre><code>import cv2

cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*&#39;XVID&#39;) # 코덱 정하기
out = cv2.VideoWriter(&#39;output.avi&#39;, fourcc, 20.0, (640,480)) # 영상녹화 세팅

print(cap.isOpened())
while(cap.isOpened()):
    ret, frame = cap.read()
    if ret == True:
        out.write(frame)
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        cv2.imshow(&#39;frame&#39;, gray)

        if cv2.waitKey(1) &amp; 0xFF == ord(&#39;q&#39;):
            break
    else:
        break

cap.release()
out.release()
cv2.destroyAllWindows()
cv2.waitKey(1)
cv2.waitKey(1)
cv2.waitKey(1)
cv2.waitKey(1)</code></pre><h3 id="영상에-문자-넣기">영상에 문자 넣기</h3>
<pre><code>import cv2
import datetime
cap = cv2.VideoCapture(0)

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret :
        font = cv2.FONT_HERSHEY_SIMPLEX
        text = &#39;Width: &#39; + str(cap.get(3)) + &#39; Height: &#39; + str(cap.get(4)) # 그냥 글자 그대로 너비랑 높이다
        datet = str(datetime.datetime.now()) # 지금시간
        frame = cv2.putText(frame, datet, (10,50), font, 1, (0,255,255), 2, cv2.LINE_AA)  # 글자 출력
        cv2.imshow(&#39;frame&#39;, frame)
        if cv2.waitKey(1) &amp; 0xFF == ord(&#39;q&#39;):
            break
    else:
        break
cap.release()
cv2.destroyAllWindows()
cv2.waitKey(1)
cv2.waitKey(1)
cv2.waitKey(1)
cv2.waitKey(1)</code></pre><p>지금까지 배운 것들을 통해 과제를 해결해보자
<strong>과제(assignment 라는 뜻)</strong></p>
<blockquote>
<ol>
<li>이미지를 불러오는데 제목을 이미지 오른쪽 상단에 넣기</li>
<li>웹캠 영상을 불러오는데 웹캠 영상 왼쪽 상단에 HADURI 라고 출력
웹캠 영상 오른쪽 하단에 본인 영어 이름 출력
출력될 때는 컬러로 출력되지만
녹화본은 그레이스케일로 녹화</li>
</ol>
</blockquote>
<p><strong>1. 이미지를 불러오는데 제목을 이미지 오른쪽 상단에 넣기</strong></p>
<pre><code>import cv2
img = cv2.imread(&#39;data/very_hard.jpg&#39;)
font = cv2.FONT_HERSHEY_SIMPLEX
text = &quot;i&#39;m tired&quot;
cv2.putText(img, text, (400,50), font, 1, (0,255,255), 2, cv2.LINE_AA) # 위치 (400,50), 폰트 크기 1, 색깔 하양, 두께 2
cv2.imshow(&#39;image&#39;, img)
cv2.waitKey()
cv2.destroyAllWindows()
cv2.waitKey(1)
cv2.waitKey(1)
cv2.waitKey(1)
cv2.waitKey(1)</code></pre><p><img src="https://velog.velcdn.com/images/wi___s10/post/6d30fb92-d3f7-4504-ac5f-c6ac66fbd56f/image.png" alt=""></p>
<p><strong>2. HADURI 웹캠</strong></p>
<pre><code>import cv2
import datetime
cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*&#39;XVID&#39;) # 저장하려고 코덱 설정
out = cv2.VideoWriter(&#39;output.avi&#39;, fourcc, 20.0, (640,480), isColor=False) # isColor=False -&gt; 흑백으로 저장
while(cap.isOpened()):
    ret, frame = cap.read()
    if ret :
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
        out.write(gray) # 그레이스케일로 녹화
        font = cv2.FONT_HERSHEY_SIMPLEX
        cv2.putText(frame, &#39;HADURI&#39;, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 194, 133), 2, cv2.LINE_AA)
        cv2.putText(frame, &#39;KimEunHye&#39;, (frame.shape[1] - 100, frame.shape[0] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1, cv2.LINE_AA)
        cv2.imshow(&#39;frame&#39;, frame)
        if cv2.waitKey(1) &amp; 0xFF == ord(&#39;q&#39;):
            break
    else:
        break
cap.release()
out.release()
cv2.destroyAllWindows()
cv2.waitKey(1)
cv2.waitKey(1)
cv2.waitKey(1)
cv2.waitKey(1)</code></pre><p><img src="https://velog.velcdn.com/images/wi___s10/post/825d7116-c118-48a5-83d3-7099596cb667/image.png" alt="">
아무래도 얼굴은 부담스러워서 귀여운 농담곰으로 대체했습니다.</p>
<p>mac에서 avi파일이 안열리길래 잘 저장됐나보다 생각하겠습니다.</p>
<p>끝<del>~</del></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[소프트웨어 공학]]></title>
            <link>https://velog.io/@wi___s10/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%ED%95%99</link>
            <guid>https://velog.io/@wi___s10/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%ED%95%99</guid>
            <pubDate>Mon, 11 Mar 2024 03:22:10 GMT</pubDate>
            <description><![CDATA[<h1 id="소프트웨어-공학📚">소프트웨어 공학📚</h1>
<p><strong>소프트웨어 공학</strong>은 단순 프로그래밍을 넘어 소프트웨어의 전 생명주기에 걸친 개발, 운용 및 유지보수 등을 체계적, 효율적으로 접근하는 학문분야다.
 대충 프로젝트 관리, 테스팅, 품질 보증과 같은 내용이 포함되어 있다.</p>
<h1 id="왜-소프트웨어-공학을-배워야-하나요-🤔">왜 소프트웨어 공학을 배워야 하나요? 🤔</h1>
<p>프트웨어의 규모와 복잡도가 너무 증가해 일일이 작성하고 테스트 하는것 만으로는 부족하기에 필요하다고 한다.
소프트웨어 공학을 적용하면 기간 내에 높은 품질의 소프트웨어를 개발하고, 프로젝트&amp;유지보수 비용을 줄일 수 있다.</p>
<h1 id="소프트웨어-품질-용어">소프트웨어 품질 용어</h1>
<h2 id="소프트웨어-품질">소프트웨어 품질</h2>
<p>다양한 정의들이 있지만 미국 국방부(DoD)에 따르면 아래와 같다.</p>
<blockquote>
<p>소프트웨어의 속성이 그것이 의도된 최종 사용을 수행하는 데 
어느 정도로 기여하는지에 대한 정도</p>
</blockquote>
<p><strong>품질의 특징</strong></p>
<ul>
<li>절대적이지 않음</li>
<li>다차원적</li>
<li>제약 조건(사람, 돈, 시간, 도구)에 의해 결정</li>
<li>수용 가능한 타협에 관한 것</li>
<li>품질 기준은 독립적이지 않음</li>
</ul>
<ol>
<li>외부 품질 VS 내부 품질
   외부 품질: 시스템의 사용자에게 보이는 품질
   내부 품질: 시스템의 개발자에게 관련된 품질</li>
<li>제품 품질 VS 공정 품질
제품 품질: 기능성, 사용성, 효율성, 신뢰성 등
공정 품질: 생산성,방법,도구의 효과성, 표준의 사용 관리 등</li>
</ol>
<h2 id="소프트웨어-품질-주요-용어들">소프트웨어 품질 주요 용어들</h2>
<h3 id="correctness정확성">Correctness(정확성)</h3>
<p>프로그램이 기능의 명세에 따라 동작하면 &#39;정확&#39;합니다.
가정 :</p>
<ol>
<li>시스템의 명세가 사용 가능합니다.</li>
<li>프로그램이 명세를 만족하는지 명확하게 판단할 수 있습니다.</li>
</ol>
<h3 id="reliability신뢰성">Reliability(신뢰성)</h3>
<p>신뢰성은 사용자가 그것에 의존할 수 있는지에 따릅니다. 이는 종속성과 같은 의미입니다.
제품의 실패에 대한 빈도와 중요성을 측정하는 것입니다.
실패: 허용되는 운영 조건 하에서 발생하는 불편한 효과나 동작을 의미합니다.
통계적인 행동으로 정의할 수 있습니다: MTTR(평균 수리 시간), MTTF(평균 고장 시간), MTBF(평균 고장 간격)</p>
<h3 id="robustness강건성">Robustness(강건성)</h3>
<p>강건성은 요구 사항 명세에서 예상하지 못한 상황에서도 합리적으로 동작하면 튼튼하다고 할 수 있습니다.
이는 운영 조건의 범위, 유효한 입력으로 인한 불편한 결과의 가능성, 
제품이 유효하지 않은 입력을 받았을 때의 효과의 수용성 등 여러 요소의 기능입니다.</p>
<h3 id="performance성능">Performance(성능)</h3>
<p>성능은 효율성(공간, 시간)과 동일시됩니다.
시스템의 사용성에 영향을 미칩니다.
성능 평가</p>
<ul>
<li>측정 (모니터링)</li>
<li>분석</li>
<li>시뮬레이션<h3 id="user-friendliness사용자-친화성">User Friendliness(사용자 친화성)</h3>
</li>
</ul>
<p>사용하기 쉬움
시스템을 하드웨어 환경에 쉽게 구성하고 적응시킬 수 있는 용이성</p>
<h3 id="verifiability검증-가능성">Verifiability(검증 가능성)</h3>
<p>검증 가능한 속성이 안전하게 검증될 수 있다면, 그것은 검증 가능하다고 할 수 있습니다.
이는 형식 분석 방법이나 테스팅을 통해 수행될 수 있습니다.</p>
<h3 id="maintainability유지보수성">Maintainability(유지보수성)</h3>
<p>유지 보수</p>
<ul>
<li>수정 유지 보수</li>
<li>적응 유지 보수</li>
<li>완성 유지 보수
소프트웨어 진화 (유지 보수 대신)
수리 가능성과 진화 가능성</li>
</ul>
<h4 id="reusability재사용성">Reusability(재사용성)</h4>
<p>기존 컴포넌트를 사용하여 새 제품을 구축합니다.
예시: 과학 라이브러리, 모티프, 유닉스 쉘 등
재사용 수준</p>
<ul>
<li>사람</li>
<li>요구 사항</li>
<li>디자인</li>
<li>코드</li>
<li>도메인 분석 등
객체 지향 기술, 컴포넌트, 서비스 등
공정에의 적용</li>
<li>소프트웨어 방법론</li>
<li>생명주기 모델<h3 id="portability이식성">Portability(이식성)</h3>
</li>
</ul>
<p>다른 환경에서 실행할 수 있다면, 그것은 이식성이 있다고 말할 수 있습니다.</p>
<ul>
<li>하드웨어 플랫폼</li>
<li>소프트웨어 플랫폼</li>
</ul>
<h3 id="understandability이해성">Understandability(이해성)</h3>
<p>내부 제품 품질입니다.</p>
<ul>
<li>내부 품질 요소 - 다른 많은 품질을 달성하는 데 도움이 됩니다.</li>
<li>쉬운 유지 보수</li>
<li>외부적인 관점에서 보면, 예측 가능한 행동이 있다면 이해하기 쉽습니다.
객체 지향 패러다임은 이해하기 쉬울 수 있음<h3 id="interoperability상호-운용성">Interoperability(상호 운용성)</h3>
</li>
</ul>
<p>시스템이 다른 시스템과 공존하고 협력하는 능력
오픈 시스템 개념</p>
<h3 id="productivity생산성">Productivity(생산성)</h3>
<p>소프트웨어 생산 과정의 품질
프로세스: 과정의 효율성을 측정하기 위함
Difficult to measure: 단순한 척도 : LOC
툴은 생산성을 증가시킵니다.</p>
<h3 id="timeliness시기적절성">Timeliness(시기적절성)</h3>
<p>공정 관련 요소</p>
<ul>
<li>제품을 시간 내에 제공하는 능력.
필요한 것들:</li>
<li>세심한 스케줄링,</li>
<li>정확한 작업 추정,</li>
<li>명확하게 지정된 이정표.
이를 달성하기 위해 Incremetal delivery를 사용한다. 
요구사항을 기능적으로 잘게 잘게 나눠서 increment(증분)로 나누는것이다.
요구사항에 중요도를 매기고, 가장 중요한 요구사항을 앞쪽에 있는 increment에 부여한다.<h3 id="visibility가시성">Visibility(가시성)</h3>
</li>
</ul>
<p>공정 관련
모든 단계와 현재 상태가 문서화되어 있으면 가시적이라고 할 수 있습니다.
이를 통해 각각의 영향을 파악하고 결정을 내리는 데 도움을 줍니다.</p>
<hr>
<p>참고: <a href="https://chanos.tistory.com/entry/Software-Engineering-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%ED%95%99%EC%9D%B4%EB%9E%80-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%ED%95%99%EC%9D%98-%ED%95%84%EC%9A%94%EC%84%B1-%EC%A2%8B%EC%9D%80-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%EC%9D%98-%ED%8A%B9%EC%84%B1">[Software Engineering] 소프트웨어 공학이란?, 소프트웨어 공학의 필요성, 좋은 소프트웨어의 특성</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[AI] 인공 지능이란?]]></title>
            <link>https://velog.io/@wi___s10/AI%EB%9E%91Teachable-Machine</link>
            <guid>https://velog.io/@wi___s10/AI%EB%9E%91Teachable-Machine</guid>
            <pubDate>Sun, 10 Mar 2024 23:09:31 GMT</pubDate>
            <description><![CDATA[<h2 id="1인공지능이란">1.인공지능이란?</h2>
<p>인공지능(Artificial Intelligence), AI는 기계가 인간의 학습 능력, 추론 능력, 지각 능력, 자연어 이해 능력 등을 갖추게 하는 기술이다. 이는 정해진 규칙에 따라 동작하는 일반적인 프로그램과는 달리, 데이터를 통해 스스로 학습하고 성장하는 능력을 갖추게 된다.</p>
<h2 id="2-강인공지능과-약인공지능">2. 강인공지능과 약인공지능</h2>
<p>인공지능은 크게 강인공지능(Strong AI)와 약인공지능(Weak AI)로 나뉜다.
 강인공지능은 인간의 지능을 완벽하게 모방한 인공지능으로, 인간의 모든 학습 능력과 문제 해결 능력을 갖추고 있다. 반대로 약인공지능은 음성 인식처럼 특정 분야나 작업에 초점을 맞춘 인공지능으로, 그 범위 내에서는 인간처럼 또는 그 이상으로 효율적으로 작업을 수행할 수 있다. </p>
<h2 id="3-ai관련-직군">3. AI관련 직군</h2>
<p>데이터 과학자, 머신러닝 엔지니어, AI 엔지니어 등이 AI 모델을 개발하고 최적화하는 역할을 한다. 더해, 소프트웨어 엔지니어는 이들이 개발한 모델을 실제 시스템에 통합하는 직군이다.</p>
<h2 id="4-머신러닝이란">4. 머신러닝이란?</h2>
<p>머신러닝은 AI의 한 분야로, 기계가 데이터를 통해 학습하는 능력을 갖추게 하는 알고리즘과 기술이다.
머신러닝은 크게 지도학습, 비지도학습, 강화학습으로 나뉜다.</p>
<ul>
<li><p><strong>지도학습(Supervised Learning)</strong> : 지도학습은 학습 데이터가 주어진 입력과 그에 상응하는 출력(레이블)으로 구성되는데, 모델은 이들 사이의 관계를 학습하고 새로운 입력에 대한 출력을 예측한다.</p>
</li>
<li><p><strong>비지도학습(Unsupervised Learning)</strong> : 비지도학습은 출력(레이블) 없이 입력 데이터만으로 학습을 수행한다. 이 방법은 데이터의 숨겨진 패턴이나 구조를 발견하는 데 사용된다.</p>
</li>
<li><p><strong>강화학습(Reinforcement Learning)</strong> : 강화학습은 기계가 환경과 상호작용하며 보상을 최대화하는 행동을 학습하는 방법이다. 학습 과정에서는 시행착오를 통해 최적의 전략을 찾아낸다.</p>
</li>
</ul>
<h2 id="6-티처블머신-실습">6. 티처블머신 실습</h2>
<p>티처블머신(Teachable Machine)은 머신러닝 모델을 쉽게 만들 수 있는 도구인데, 이게 비지도 학습에 해당할 거다.</p>
<p><a href="https://teachablemachine.withgoogle.com">https://teachablemachine.withgoogle.com</a>
링크를 클릭하면 어떻게 해야 하는지 딱 보인다.</p>
<p>아래와 같이 미리 시험해 볼 수도 있다.
<img src="https://velog.velcdn.com/images/wi___s10/post/95487a5e-3ae6-47b6-82b0-60189364a68d/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[react] Lottie]]></title>
            <link>https://velog.io/@wi___s10/reactLottie</link>
            <guid>https://velog.io/@wi___s10/reactLottie</guid>
            <pubDate>Thu, 05 Oct 2023 00:39:07 GMT</pubDate>
        </item>
    </channel>
</rss>