<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>hun_dev.log</title>
        <link>https://velog.io/</link>
        <description>좋아하는 것이 잘하는 것이 될 때까지</description>
        <lastBuildDate>Thu, 18 May 2023 08:54:53 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>hun_dev.log</title>
            <url>https://velog.velcdn.com/images/hun_dev/profile/1304e720-3a8c-44c6-ae8f-027608b500ab/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. hun_dev.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/hun_dev" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[코모도] 너는 왜 str 타입이니? (Python)]]></title>
            <link>https://velog.io/@hun_dev/%EC%BD%94%EB%AA%A8%EB%8F%84-%EB%84%88%EB%8A%94-%EC%99%9C-str-%ED%83%80%EC%9E%85%EC%9D%B4%EB%8B%88-Python</link>
            <guid>https://velog.io/@hun_dev/%EC%BD%94%EB%AA%A8%EB%8F%84-%EB%84%88%EB%8A%94-%EC%99%9C-str-%ED%83%80%EC%9E%85%EC%9D%B4%EB%8B%88-Python</guid>
            <pubDate>Thu, 18 May 2023 08:54:53 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2>코모도 - 코딩의 모든 것을 도와줘요</h2>
</blockquote>
<h1 id="문제-상황">문제 상황</h1>
<p>Pandas를 이용해 csv 파일을 읽고 데이터프레임 내의 리스트 형태로 된 데이터를 다루어야 하는 상황을 마주하게 되었습니다. 평소와 같이 리스트를 다루듯 인덱스로 데이터에 접근했는데, 예상과는 다르게 <strong>쌍따옴표</strong>만 반환되었습니다.</p>
<p>혹시나해서 type check를 해보았더니 데이터의 타입은 str이었습니다. 제가 다루고자 한 데이터의 형태는 다음과 같았습니다. data의 0번 인덱스로 접근하면 element1을 반환해줄 것만 같은데 자꾸만 쌍따옴표만 반환해주는 컴퓨터가 야속하기만 했습니다.</p>
<pre><code class="language-python">&gt;&gt; data = &quot;[&#39;element1&#39;, &#39;element2&#39;, &#39;element&#39;]&quot;
&gt;&gt; type(data)

&lt;class &#39;str&#39;&gt;</code></pre>
<p>양 끝의 쌍따옴표와 대괄호를 제거하는 전처리를 모든 데이터에 적용해야 하나 싶어 눈 앞이 캄캄해졌습니다. 머리를 좀 아파하다가 구글 신이 저를 도와줄 수 있지 않을까 싶어 구글링을 단행한 결과, 저와 같은 문제를 겪는 분들이 많았고 해결 방법 또한 다수 제시되어 있었습니다.</p>
<h1 id="해결-방법">해결 방법</h1>
<p>파이썬의 내장 모듈 중 AST 모듈의 literal_eval 함수를 이용하면 str 타입의 리스트, 튜플, 딕셔너리와 같은 객체를 기존 타입의 객체로 변환할 수 있다는 것을 알 수 있었습니다.</p>
<h2 id="라이브러리-소개">라이브러리 소개</h2>
<h3 id="ast">AST</h3>
<p><strong>AST(Abstract Syntax Trees)</strong> 라이브러리는 파이썬의 내장 모듈 중 하나로, 파이썬 코드의 추상 구문 트리(Abstract Syntax Tree)를 생성하고 조작하는 기능을 제공합니다. 파이썬 코드를 파싱하고, 추상 구문 트리로 변환하여 코드 분석, 변환, 검증 등 다양한 작업을 수행할 수 있도록 도와주는 모듈입니다.</p>
<p>자세한 사항은 <a href="https://docs.python.org/ko/3/library/ast.html">공식 문서</a>를 참고하세요!</p>
<h2 id="적용-코드">적용 코드</h2>
<pre><code class="language-python">&gt;&gt; import ast

&gt;&gt; data = &quot;[&#39;element1&#39;, &#39;element2&#39;, &#39;element&#39;]&quot;
&gt;&gt; original_data = ast.literal_eval(data)
&gt;&gt; type(original_data)

&lt;class &#39;list&#39;&gt;</code></pre>
<p>리스트 뿐만 아니라, 딕셔너리, 튜플 모두 형 변환이 쉽게 가능합니다. 이제는 더이상 데이터프레임을 다루면서 머리가 아프지 않을 것 같아 참으로 행복합니다.</p>
<p><strong>피드백은 항상 감사히 받습니다. 게시글에 수정해야 할 내용이 있다면 댓글로 알려주세요!</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[오류해결] UserWarning: CUDA initialization: Unexpected error from cudaGetDeviceCount()]]></title>
            <link>https://velog.io/@hun_dev/%EC%98%A4%EB%A5%98%ED%95%B4%EA%B2%B0-UserWarning-CUDA-initialization-Unexpected-error-from-cudaGetDeviceCount</link>
            <guid>https://velog.io/@hun_dev/%EC%98%A4%EB%A5%98%ED%95%B4%EA%B2%B0-UserWarning-CUDA-initialization-Unexpected-error-from-cudaGetDeviceCount</guid>
            <pubDate>Mon, 10 Apr 2023 02:46:42 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hun_dev/post/13920c6b-32d9-43de-b3c6-ea8923b25224/image.jpeg" alt=""></p>
<p>Ubuntu 서버에서 코드를 돌리던 중 다음과 같은 에러를 마주하게 되었습니다.</p>
<p><strong>UserWarning: CUDA initialization: Unexpected error from cudaGetDeviceCount(). Did you run some cuda functions before calling NumCudaDevices() that might have already set an error? Error 804: forward compatibility was attempted on non supported HW (Triggered internally at /opt/conda/conda-bld/pytorch_1670525539683/work/c10/cuda/CUDAFunctions.cpp:109.)</strong></p>
<p>분명 잘 돌아가던 코드였기에 골머리를 앓던 중, 모든 기계에서 발생하는 오류의 가장 좋은 해결법은 <strong>reboot</strong>이라는 명언이 떠올라 해당 명령어를 입력 후 코드를 재실행하였더니 마법과도 같이 해결되었습니다.</p>
<pre><code>$ sudo reboot</code></pre><p>역시 모든 기계에서 발생하는 오류의 가장 좋은 해결법은 <strong>reboot</strong>입니다.</p>
<p><strong>피드백은 항상 감사히 받습니다. 게시글에 수정해야 할 내용이 있다면 댓글로 알려주세요!</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[오류해결] Firebase Storage Connection reset by peer]]></title>
            <link>https://velog.io/@hun_dev/%EC%98%A4%EB%A5%98-Firebase-Storage-Connection-reset-by-peer</link>
            <guid>https://velog.io/@hun_dev/%EC%98%A4%EB%A5%98-Firebase-Storage-Connection-reset-by-peer</guid>
            <pubDate>Thu, 30 Mar 2023 05:45:23 GMT</pubDate>
            <description><![CDATA[<p>Firebase Storage에 파일을 업로드하던 중, <strong>error: [Errno 104] Connection reset by peer</strong> 오류가 발생하였습니다.</p>
<pre><code class="language-python">from firebase_admin import storage

bucket = storage.bucket()
blob = bucket.blob(&#39;파일명&#39;)
blob.upload_from_string(image_data, content_type=&#39;image/png&#39;)</code></pre>
<p>해당 오류는 특정 시간 동안 Firebase Storage에 request가 발생되지 않아 발생한 오류로, 600초간 request가 발생되지 않을 시 timeout이 되어 bucket이 활성화되지 않는 것으로 확인되었습니다.</p>
<p>주기적으로 request를 발생시키는 방법도 생각해보았지만, bucket을 reload하여 해당 오류를 해결하였습니다.</p>
<pre><code class="language-python">from firebase_admin import storage

bucket = storage.bucket()
bucket.reload()
blob = bucket.blob(&#39;파일명&#39;)
blob.upload_from_string(image_data, content_type=&#39;image/png&#39;)</code></pre>
<p><strong>피드백은 항상 감사히 받습니다. 게시글에 수정해야 할 내용이 있다면 댓글로 알려주세요!</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[NHN FORWARD 22에 다녀오다]]></title>
            <link>https://velog.io/@hun_dev/NHN-FORWARD-22%EC%97%90-%EB%8B%A4%EB%85%80%EC%98%A4%EB%8B%A4</link>
            <guid>https://velog.io/@hun_dev/NHN-FORWARD-22%EC%97%90-%EB%8B%A4%EB%85%80%EC%98%A4%EB%8B%A4</guid>
            <pubDate>Sat, 26 Nov 2022 14:40:24 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hun_dev/post/000b2a92-f631-4a55-a6a4-bd7cf36d097e/image.JPG" alt=""></p>
<p>추첨과는 거리가 먼 삶을 살았던 저에게 걸맞지 않은 우연한 기회가 생겨 NHN FORWARD 22에 다녀오게 되었습니다. 3년 만에 오프라인으로 열린 <strong>NHN FORWARD 22</strong>는 <strong>Small Steps make a Big Difference</strong>이라는 슬로건 아래 AI, 클라우드, 프론트엔드, 백엔드 등 기술적인 내용을 포함하는 세션 및 라운지 토크 뿐만 아니라 협업 툴, 메이크 오버, 헬스 포워드 등 기술 외적인 내용을 포함하는 세션 및 라운지 토크, 게임존, 스낵존, 브랜드 존 등 다양한 볼거리와 즐길거리를 참가자에게 제공하고 있었습니다.</p>
<p>이렇게 다채로운 콘텐츠를 양질로 제공한 <strong>NHN FORWARD 22</strong>에서 보고 듣고 느낀 것을 정리해보고자 합니다.</p>
<h1 id="행사-장소에-도착하다">행사 장소에 도착하다</h1>
<p>처음 행사 장소에 대한 안내 메일을 받았을 때 의아한 내용이 하나 있었습니다. 기술 컨퍼런스를 호텔에서 진행한다는 것이었습니다. 오프라인 컨퍼런스에 참여해 본 경험이 전무한 탓에 어떻게 호텔에서 진행하는 것인지에 의문을 품고 있었으나, 행사 장소에 도착하자마자 의문이 깔끔하게 해소되었습니다. 제가 생각했던 호텔의 이미지와는 사뭇 다른 느낌을 받을 수 있었습니다. 컨퍼런스가 진행되는 탓인지, 원래 사람이 북적북적한 지는 잘 모르겠으나 정말 많은 사람이 건물 안에서 바삐 움직이고 있었습니다.</p>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/c8589a9d-33c5-482c-81d2-a93dcc3a0127/image.jpg" alt=""></p>
<p>사람들을 따라 흘러가듯이 등록 장소로 향했고 키노트 시간인 10시까지 시간이 남아 행사 장소를 둘러보며, 새로운 장소에 대한 어색함과 두려움을 해소할 수 있었습니다. 키노트 시간이 다가와 첫번째 세션 중 가장 듣고 싶었던 세션의 장소인 <strong>TRACK 7</strong>로 가 자리를 잡았습니다. 확실히 5층보다는 2층이 다소 한산했고 일찍 자리 잡기를 정말 잘했다는 생각이 들었습니다.</p>
<h1 id="키노트-및-세션">키노트 및 세션</h1>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/a6b2c40b-d7c4-4efe-94bb-a71934df5241/image.jpg" alt=""></p>
<h2 id="키노트">키노트</h2>
<p>NHN FORWARD 22에 대한 전반적인 소개와 함께 NHN의 주요 사업 분야에 대한 설명이 주를 이루었습니다. 가장 먼저 소개된 분야는 <strong>게임 분야</strong>였습니다. NHN의 <strong>한게임</strong>은 캐쥬얼 게임 부문에서 자타공인 국내 최대 게임 포털이었기에 잘 알고 있었는데 라인팝, 포코팡, 프렌즈팝과 같은 게임 또한 NHN의 게임이었다는 것을 알 수 있었습니다. </p>
<p>NHN은 캐쥬얼 게임 개발 엔진 <strong>MBrick</strong>을 자체 개발해 게임 개발에 드는 비용과 시간을 최소화하고 있었고 게임에서 공통으로 필요한 기능들을 통합 SDK로 제공하고 있는 <strong>Gamebase</strong>와 추후 공개될 <strong>GameAnvil</strong>, <strong>GameTalk</strong>로 하여금 개발자에게 보다 합리적이고 편리한 기능을 제공하는 모습이 인상깊었습니다.</p>
<p>다음으로 소개된 분야는 <strong>데이터 분야</strong>였습니다. 데이터 분야에서 가장 인상깊었던 내용은 서비스 이용자의 <strong>DBTI</strong>를 분석하여 비즈니스 유형에 따른 전략을 도출한다는 것입니다. 요즘 가장 핫한 키워드를 뽑으라면 빠지지 않는 것이 <strong>성격유형검사</strong>, 즉 <strong>MBTI</strong>입니다. DBTI는 고객 비즈니스 특성을 36개 유형으로 분류하고 있는데 NHN는 경쟁사들 대비 NHN이 가지는 차별화된 경쟁력이라며 이를 소개하고 있습니다. 더 나아가 2026년까지 <strong>데이터 테크 분야</strong>에서 글로벌 탑기어 데이터 테크 컴퍼니를 목표로 하고 있다고 밝혔습니다.</p>
<p>다음으로 소개된 분야는 <strong>클라우드 분야</strong>였습니다. <strong>NHN Cloud</strong>는 다소 생소할 수도 있는데 이전에 <strong>Toast Cloud</strong>로 서비스를 시작했습니다. 현재 국내에는 판교, 평촌에, 국외에는 도쿄, LA에 데이터 센터를 설립했으며 김해와 광주에도 데이터 센터를 설립할 계획에 있다고 합니다. NHN Cloud는 <strong>국내 유일 OpenStack 클라우드 서비스</strong>로 <strong>Face Recognition</strong>, <strong>AI Fashion</strong> 등 다양한 <strong>AI 서비스</strong>를 제공하며 발전시키고 있습니다.</p>
<p>마지막으로 소개된 분야는 <strong>AI 분야</strong>였습니다. AI 분야를 소개하면서 사진을 카툰처럼 변경하는 기술, 동화책을 읽어주는 TTS 기술 등에 대해 알 수 있었는데, 행사 장내에 방송되는 음성 또한 TTS 기술로 개발된 목소리라는 것을 알 수 있었습니다. 이에 대해 알지 못했다면 사람이 방송하고 있다고 느낄 정도로 방송에 전혀 위화감이 없는 모습이 인상깊었습니다.</p>
<p>이렇게 NHN FORWARD 22에 대한 전반적인 소개와 함께 NHN의 주요 사업 분야에 대한 설명과 함께 NHN FORWARD 22의 시작을 알리게 되었습니다.</p>
<h2 id="세션-1-데이터로-바라보는-리그-오브-레전드---지표--e-스포츠">세션 1. 데이터로 바라보는 리그 오브 레전드 - 지표 + E 스포츠</h2>
<p>가장 처음으로 참여한 세션은 <a href="https://your.gg/ko/kr/home">YOUR.GG</a> 서비스를 제공하고 있는 지지틱스 차민창님의 <strong>데이터로 바라보는 리그 오브 레전드 - 지표 + E 스포츠</strong>입니다. 데이터를 다루는 일에 관심이 많고, 기존에 리그 오브 레전드를 즐겨할 뿐더러 종종 사용하는 YOUR.GG 서비스의 제공자를 만날 수 있는 기회는 흔치 않다고 생각했기에 선택하게 되었습니다.</p>
<p>세션 발표를 들으면서 가장 많이 한 생각은 <strong>&#39;YOUR.GG가 사용자를 위한 서비스를 제공하고 있구나&#39;</strong> 하는 것이었습니다. YOUR.GG는 인분, 등수, 팀운, 예상 승률 등의 지표를 사용자에게 제공하는데, 사용자의 게임 정보가 담긴 데이터나 커뮤니티의 게시글 등을 분석하여 객관적인 지표로 나타내는 것은 상당히 어려운 일임이 자명합니다. 그러나 YOUR.GG는 많은 시행착오와 타당성 조사, 정량적 분석, 탐색적 테스트의 과정을 거친 연구와 사용자가 이해하기 쉽게끔 하는 UX와 테스트 단계를 거쳐 서비스를 제공하고 있었습니다. 이는 YOUR.GG가 사용자들에게 사랑받고 꾸준히 사용되어지는 이유가 되기에 충분하다고 생각했습니다.</p>
<p>지표에 대한 발표 이후에는 E 스포츠에 대한 발표가 이어졌습니다. 이에 차민창님은 프레드 브룩스가 1986년 발표한 <strong>&#39;은총알은 없다&#39;</strong> 라는 논문을 소개하며 과연 <strong>E 스포츠에 은총알은 있는가</strong>에 대한 의문을 제기하였습니다. 논문에서 <strong>은총알</strong>은 소프트웨어 제작비용을 급격히 떨어뜨려줄 수 있는 <strong>마법의 아이템</strong>으로 소개되고 있는데, 다시 말해 <strong>만병통치약</strong>으로 설명할 수 있습니다. </p>
<p>스포츠에 <strong>무조건</strong>이라는 것은 없습니다. 2018년 러시아 월드컵에서 우리나라가 독일을 상대로 무조건 질 것이라는 예측이 대다수였지만 2:0으로 승리한 것처럼 말입니다. E 스포츠도 마찬가지일 것입니다. 리그 오브 레전드 같은 경우는 다섯 명이 한 팀을 이루어하는 게임인만큼 아주 뛰어난 선수를 보유한 팀일지라도 선수 개개인의 컨디션에 따라, 준비해 온 전략에 따라 충분히 결과가 달라질 수 있음이 분명합니다.</p>
<p>차민창님은 E 스포츠에 은총알은 존재하지 않지만 납총알 정도는 존재할 것이라는 생각을 가지게 되었고 이 납총알은 데이터 분석이라고 설명했습니다. 이를 설명하면서 <strong>Data Driven</strong>과 <strong>Data Informed</strong>를 비교하며 예로 들었는데 <strong>Data Informed</strong>한 의사 결정이 중요하다고 강조했습니다.</p>
<blockquote>
<p>Data Driven : 데이터애 기반하여 구체적인 수치로 의사결정
Data Informed : 구체적인 수치, 행동 패턴 등과 같은 다양한 근거를 통해 의사결정</p>
</blockquote>
<p>차민창님은 E 스포츠에 Data Driven이 적용되기 적합하지 않은 이유로 <strong>데이터가 적어 bias가 발생할 수 있다</strong>는 것과 <strong>업계의 성숙도가 부족하다</strong>는 것, <strong>전문가의 직관이 데이터를 능가할 수 있다</strong>는 것을 들고 있습니다. 이는 생각해보면 당연한 것입니다. 기계가 게임을 플레이하는 것이 아닌 사람이 게임을 플레이하는 것이기 때문에 언제든 변수가 발생할 수 있으며 데이터가 모든 것을 말해주지는 않기 때문입니다. 하지만 선수 개개인의 특성, 전략 등을 포함하는 Data Informed한 의사 결정이 이루어진다면 데이터는 게임의 승패에 상당한 영향을 미칠 것이 자명합니다.</p>
<p><strong>세션 1. 데이터로 바라보는 리그 오브 레전드 - 지표 + E 스포츠</strong>는 40분이라는 시간이 언제 지난지도 모를 만큼 인상 깊었습니다. 세션의 마무리 또한 인상 깊었습니다. 세션을 시작하며 차민창님이 발표 내용과 관련된 퀴즈를 출제했는데, 세션을 마무리하며 퀴즈를 맞힌 참가자에게 <strong>플레이리포트 1회 이용권</strong>를 제공했습니다. <del>조만간 아주 요긴히 쓰일 것 같습니다.</del></p>
<h2 id="세션-2-더-나은-이커머스-서비스를-위한-클라우드로-이전하기">세션 2. 더 나은 이커머스 서비스를 위한 클라우드로 이전하기</h2>
<p>다음으로 참여한 세션은 박시영, 이용훈님의 <strong>더 나은 이커머스 서비스를 위한 클라우드로 이전하기</strong>입니다. 물리 서버에서 클라우드 서비스로 이전할 때 발생한 문제들을 해결하며 이전을 진행했던 경험을 공유한다는 소개가 인상 깊어 참여하게 되었습니다. 클라우드 서비스에 크게 관심이 있는 것은 아니지만 물리 서버에서 클라우드 서비스로 이전할 때 서비스의 중단, 용량 문제 등 해결해야할 문제가 한두개가 아닐텐데 어떤 방법으로 해결했는지 궁금했습니다.</p>
<p>신규 사이트 오픈, 해지, 이벤트 진행으로 인한 대규모 리소스 사용 등 커머스 서비스에서 물리적 한계점이 드러나는 부분들이 많았기에 클라우드 서비스로 이전하여 안정적인 서비스를 제공하고자 하였다고 합니다. 하지만 NHN 커머스 서비스는 사용자가 적은 서비스도 아니었을 뿐더러, 서버 대수가 적지도 않았습니다. 클라우드 서비스로 이전하는 동안 서비스를 중단하게 되면 사용자 이탈이 발생하게 될 것이고 이는 곧 매출 감소로 직결되는 문제였습니다.</p>
<p>이에 박시영, 이용훈님은 <strong>무중단 마이그레이션</strong>을 고안해냈지만 쉽지 않았고, <strong>DB 이중화</strong>를 통해 서비스 중단 시간을 최소화하는 방법을 채택하였습니다. <strong>DB 이중화</strong>란 <strong>DB Replication</strong>이라고도 하며 물리적으로 떨어져 있는 여러 개의 데이터베이스에 대하여 로컬 데이터베이스의 변경된 내용을 원격 데이터베이스에 복제하고 관리하는 것입니다. 박시영, 이용훈님은 물리 서버의 같은 데이터를 저장하고 있는 Master / Slave DB를 이용해 클라우드 서버의 Master / Slave DB를 업데이트하고 이전하는 과정을 거쳐 물리 서버에서 클라우드 서비스로의 이전을 진행했습니다.</p>
<p>비록 무중단 마이그레이션을 수행할 수는 없었지만 서비스 중단 시간이 약 1분 밖에 되지 않는다는 것은 다양한 문제를 해결하기 위해 상당히 많은 고민과 연구가 동반되었음을 알 수 있습니다. 클라우드 마이그레이션을 위한 압박감과 막막함이 상당했을텐데 성공적으로 마무리한 박시영, 이용훈님을 포함한 NHN Cloud 팀이 정말 대단하다고 느낄 수 있었습니다.</p>
<h2 id="세션-3-일하는-방식의-변화-우리가-재택근무-하는-방법">세션 3. 일하는 방식의 변화, 우리가 재택근무 하는 방법</h2>
<p>다음으로 참여한 세션은 김형근님의 <strong>일하는 방식의 변화, 우리가 재택근무 하는 방법</strong>입니다. 재택근무라는 키워드에 끌려 참여하게 되었습니다. 세션의 주된 내용은 NHN Dooray의 <strong>Dooray!</strong> 서비스 소개 및 NHN Dooray의 업무 방식, 재택근무 노하우에 대한 것이었습니다. <strong>Dooray!</strong>는 올인원 협업툴로 메신저, 메일을 포함한 다양한 협업 기능을 하나로 합친 서비스입니다. 아직 현업에서 일해보지는 못했지만 취업을 하게 되면 협업을 하게 됨이 분명한데 Dooray!와 같은 협업 툴을 사용하여 업무를 수행한다면 더 효율적이고 수월한 업무 수행이 가능할 것 같아보였습니다.</p>
<p>이어서 김형근님은 재택근무 노하우를 상당수 공유하였는데 그중에서 가장 인상 깊었던 것은 재택근무가 해결하지 못한 숙제였습니다. 재택근무의 장점은 너무나도 자명합니다. 자유로운 업무가 가능하며 출퇴근 시간을 아낄 수 있는 것 등 재택근무를 경험해보지 못한 저 조차도 쉽게 알 수 있는 것들입니다. 하지만 재택근무가 해결하지 못한 숙제는 재택근무를 경험해보지 못했다면 알 수 없었습니다. 김형근님이 소개한 재택근무가 해결하지 못한 숙제는 다음과 같습니다.</p>
<blockquote>
<ol>
<li>체중이 증가한다.</li>
<li>워라밸이 좋지 않다.</li>
<li>정서적으로 외로울 수 있다.</li>
<li>업무 환경 구성에 어려움을 겪을 수 있다.</li>
</ol>
</blockquote>
<p>위와 같은 내용은 재택근무를 경험해보지 못했다면 절대 알 수 없는 내용입니다. 특히 워라밸이 좋지 않다는 내용은 다소 새로웠습니다. 보통 재택근무라 하면 워라밸이 좋을 것 같은데, 김형근님은  집이 곧 직장이기 때문에 워라밸이 좋지 않다고 설명했습니다. <del>하지만 아직 업무를 경험해보지 못한 저로서는 재택근무가 최고일 것 같습니다.</del></p>
<h1 id="마무리하며">마무리하며</h1>
<p>저는 학생 신분으로 참가했지만 참가자분들의 명찰을 살펴보니 다들 재직자 신분으로 참여하고 있었습니다. 내년에도 기회가 되어 참가할 수 있다면 그때는 재직자 신분으로 참여하고 싶다는 생각을 컨퍼런스 내내 하게 되었습니다.</p>
<p>세션 내용은 너무 유익했고 브랜드 존의 스티커, 그립톡과 같은 사은품 또한 너무 좋았습니다. <del>(깃허브 스티커 사랑해요)</del></p>
<p>관계자, 강연자, 참가자분들의 열정을 너무나도 가까이에서 잔뜩 느낄 수 있었고 정말 좋은 추억이 될 것 같습니다. 내년에도 기회가 되어 참가할 수 있다면 올해에는 참여하지 못했던 라운지 토크, 게임 존 등 더욱 적극적으로 다양한 콘텐츠를 즐기고 싶습니다.</p>
<p>개발자, 비개발자 할 것 없이 다채로운 콘텐츠를 제공해준 <strong>NHN FORWARD 22</strong>에 감사하며, <strong>NHN FORWARD 22</strong>에서 보고 듣고 느낀 것이 저에게 있어 강한 동기부여가 되어 좋은 개발자로 성장할 수 있을 것 같습니다.</p>
<h3 id="아-그리고-점심식사-너무-맛있었습니다">아 그리고 점심식사 너무 맛있었습니다.</h3>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/1b70ae3d-0ae1-4b4d-84cd-5b1138213ec8/image.jpg" alt=""></p>
<p><strong>세션의 내용을 따로 기록해두지 않았기에 다녀온지 이틀이 지난 지금, 기억에 의존하여 작성하느라 부정확한 내용이 있을 수 있습니다. 부정확한 내용이 있다면 바로 수정하겠습니다.</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[BOJ] 1013 / Contact / Python]]></title>
            <link>https://velog.io/@hun_dev/BOJ-1013-Contact-Python</link>
            <guid>https://velog.io/@hun_dev/BOJ-1013-Contact-Python</guid>
            <pubDate>Sat, 29 Oct 2022 10:36:52 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hun_dev/post/8a3d0db5-990b-43cd-a7ae-1b5a28d805a6/image.JPG" alt=""></p>
<p><a href="https://www.acmicpc.net/">BOJ</a>의 1013번 문제 <strong>Contact</strong>를 Python으로 해결한 문제입니다.
문제는 <a href="https://www.acmicpc.net/problem/1013">해당 링크</a>에서 확인할 수 있습니다.</p>
<h1 id="문제">문제</h1>
<blockquote>
<p>“무한히 넓은 저 우주에 인류만이 홀로 존재한다면, 그건 정말 슬픈 일이 아닐까요”</p>
</blockquote>
<p>푸에르토리코 아레시보에 위치한 아레시보 전파망원경(Arecibo radio telescope)은 수십 년째 존재하지 않을 지도 모르는 외계 문명으로부터의 전파를 수신하기 위해 밤하늘을 바라보고 있다.</p>
<p>이 망원경이 수집한 전파 속에서 자연적으로 발생하기 힘든 패턴들을 찾아내어, 그것을 증거로 외계 문명의 존재 여부를 가리려는 노력은 줄곧 이어져왔지만 아직까지도 그러한 패턴은 발견되지 않았다. 한국 천문학계의 자존심 김동혁 박사는 국내 기술로 이러한 탐사를 진행하기 위하여 다음의 전파 표기를 표준으로 삼았다.</p>
<p>전파의 기본 단위는 { 0 , 1 } 두 가지로 구성되어있으며, x+ (  ) 는 임의의 개수(최소 1개) x의 반복으로 이루어진 전파의 집합을 나타낸다.</p>
<p>(xyx)+ (  ) 는 괄호 내의 xyx의 반복으로 이루어진 전파의 집합을 뜻한다. 아래는 이해를 돕기 위한 예제이다.</p>
<p>1+ = { 1, 11, 111, 1111, 11111, … }
10+ = { 10, 100, 1000, 10000, 100000, … }
(01)+ = { 01, 0101, 010101, 01010101, 0101010101, … }
(1001)+ = { 1001, 10011001, 100110011001, … }
10+11 = { 1011, 10011, 100011, 1000011, 10000011, … }
(10+1)+ = { 101, 1001, 10001, 1011001, 1001101, 100011011000001, … }
반복을 의미하는 + 외에도 or 를 의미하는 | 기호가 있다. { x | y } 는 x 혹은 y 를 의미하는 것으로, { 0+ | 1+ } 는 { 0 , 1 , 00 , 11 , 000 , 111 , … } 의 집합을 의미한다. 아래는 두 기호를 복합적으로 사용한 예이다.</p>
<p>(100 | 11)+ = { 100 , 11 , 10011 , 11100 , 1110011100 , 100111111100100, … }
최근 김동혁 박사는 아레시보 전파망원경에서 star Vega(직녀성) 으로부터 수신한 전파 기록의 일부를 조사하여 그 전파들의 패턴을 분석하여 아래와 같이 기록하였다.</p>
<p>(100+1+ | 01)+
김동혁 박사는 다양한 전파 기록 중에서 위의 패턴을 지니는 전파를 가려내는 프로그램을 필요로 한다. 이를 수행할 수 있는 프로그램을 작성하라.</p>
<h1 id="입력">입력</h1>
<p>입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트 케이스에 대해 전파를 표현하는, { 0, 1 }만으로 이루어진 문자열이 공백 없이 주어진다. 문자열 길이는 (1 ≤ N ≤ 200)의 범위를 갖는다.</p>
<h1 id="출력">출력</h1>
<p>각 테스트 케이스에 대해 주어진 전파가 문제에서 제시한 패턴이면 “YES”를 그렇지 않은 경우는 “NO”를 출력한다. 출력 문자열은 모두 대문자로 구성되어 있다.</p>
<h1 id="예제-입력-및-출력">예제 입력 및 출력</h1>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/d6379cbb-71b6-44c7-81cc-5ae2427dd1a4/image.JPG" alt=""></p>
<p>해당 문제의 예제 입력 및 출력 중 일부입니다.</p>
<h1 id="풀이-코드">풀이 코드</h1>
<pre><code class="language-python">import re
import sys

t = int(sys.stdin.readline())
test_list = [ sys.stdin.readline().replace(&#39;\n&#39;, &#39;&#39;) for _ in range(t) ]

pattern = re.compile(r&#39;(100+1+|01)+&#39;)
for testcase in test_list:
  if pattern.fullmatch(testcase) != None:
    print(&quot;YES&quot;)
  else:
    print(&quot;NO&quot;)</code></pre>
<h1 id="풀이-방법">풀이 방법</h1>
<p>파이썬의 정규표현식 re 모듈을 이용한 간단한 풀이입니다.
re 모듈에 관한 내용은 <a href="https://wikidocs.net/">위키독스</a>의 <a href="https://wikidocs.net/4308">점프 투 파이썬</a>에서 간단한 예제와 함께 학습할 수 있습니다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[BOJ] 1205 / 등수 구하기 / Python]]></title>
            <link>https://velog.io/@hun_dev/BOJ-1205-%EB%93%B1%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0-Python</link>
            <guid>https://velog.io/@hun_dev/BOJ-1205-%EB%93%B1%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0-Python</guid>
            <pubDate>Sat, 15 Oct 2022 16:46:06 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hun_dev/post/46a2f47b-dce5-4430-a7c4-1f4ad04ea972/image.JPG" alt=""></p>
<p><a href="https://www.acmicpc.net/">BOJ</a>의 1205번 문제 <strong>등수 구하기</strong>를 Python으로 해결한 문제입니다.
문제는 <a href="https://www.acmicpc.net/problem/1205">해당 링크</a>에서 확인할 수 있습니다.</p>
<h1 id="문제">문제</h1>
<p>태수가 즐겨하는 디제이맥스 게임은 각각의 노래마다 랭킹 리스트가 있다. 이것은 매번 게임할 때 마다 얻는 점수가 비오름차순으로 저장되어 있는 것이다.</p>
<p>이 랭킹 리스트의 등수는 보통 위에서부터 몇 번째 있는 점수인지로 결정한다. 하지만, 같은 점수가 있을 때는 그러한 점수의 등수 중에 가장 작은 등수가 된다.</p>
<p>예를 들어 랭킹 리스트가 100, 90, 90, 80일 때 각각의 등수는 1, 2, 2, 4등이 된다.</p>
<p>랭킹 리스트에 올라 갈 수 있는 점수의 개수 P가 주어진다. 그리고 리스트에 있는 점수 N개가 비오름차순으로 주어지고, 태수의 새로운 점수가 주어진다. 이때, 태수의 새로운 점수가 랭킹 리스트에서 몇 등 하는지 구하는 프로그램을 작성하시오. 만약 점수가 랭킹 리스트에 올라갈 수 없을 정도로 낮다면 -1을 출력한다.</p>
<p>만약, 랭킹 리스트가 꽉 차있을 때, 새 점수가 이전 점수보다 더 좋을 때만 점수가 바뀐다.</p>
<h1 id="입력">입력</h1>
<p>첫째 줄에 N, 태수의 새로운 점수, 그리고 P가 주어진다. P는 10보다 크거나 같고, 50보다 작거나 같은 정수, N은 0보다 크거나 같고, P보다 작거나 같은 정수이다. 그리고 모든 점수는 2,000,000,000보다 작거나 같은 자연수 또는 0이다. 둘째 줄에는 현재 랭킹 리스트에 있는 점수가 비오름차순으로 주어진다. 둘째 줄은 N이 0보다 큰 경우에만 주어진다.</p>
<h1 id="출력">출력</h1>
<p>첫째 줄에 문제의 정답을 출력한다.</p>
<h1 id="예제-입력-및-출력">예제 입력 및 출력</h1>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/8be1bc7f-da5e-423f-a31c-8d1fdf4a5b63/image.JPG" alt=""></p>
<p>해당 문제의 예제 입력 및 출력 중 일부입니다.</p>
<h1 id="풀이-코드">풀이 코드</h1>
<pre><code class="language-python">import sys

n, new_score, p = map(int, sys.stdin.readline().split())

if n:
  score_list = list(map(int, sys.stdin.readline().split()))
  score_list.append(new_score)
  score_list.sort(reverse=True)

  if p &gt;= (score_list.index(new_score) + 1):
    if n == p and new_score &lt;= score_list[-1]:
      print(-1)
    else:
      print(score_list.index(new_score) + 1)
  else:
    print(-1)
else:
  print(1)</code></pre>
<h1 id="풀이-방법">풀이 방법</h1>
<p>먼저 예제 입력의 첫 줄인 N, 태수의 새로운 점수, P를 입력받습니다.
입력받은 후, N이 0인지 아닌지의 여부를 판단합니다. 0이라면 현재 랭킹 리스트에 등록된 점수가 하나도 없다는 의미이므로 태수는 1등입니다. 따라서 1을 출력합니다.</p>
<p>N이 0이 아니라면 랭킹 리스트에 등록된 점수를 리스트로 입력받고 태수의 새로운 점수를 추가합니다. 그리고 리스트를 내림차순 정렬합니다.</p>
<p>내림차순 정렬이 완료된 리스트에 대하여 태수의 등수와 P를 비교합니다. P가 태수의 등수보다 작다면 태수는 랭킹 리스트에 점수를 등록할 수 없습니다. 따라서 -1을 출력합니다.</p>
<p>P가 태수의 등수보다 크거나 같다면 태수는 랭킹 리스트에 점수를 등록할 수 있습니다. 이제 문제 마지막줄에 주어진 <strong>만약, 랭킹 리스트가 꽉 차있을 때, 새 점수가 이전 점수보다 더 좋을 때만 점수가 바뀐다</strong>라는 조건을 만족되게끔 코드를 작성해야 합니다.</p>
<p>랭킹 리스트가 꽉 차있다는 것은 N과 P가 같다는 것이기 때문에, N과 P가 같지 않고 태수의 새로운 점수가 이전 점수보다 더 좋다면 태수의 등수를 출력하고 그렇지 않다면 -1을 출력합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[한주한권] 스눕, 상대를 꿰뚫어보는 힘]]></title>
            <link>https://velog.io/@hun_dev/%ED%95%9C%EC%A3%BC%ED%95%9C%EA%B6%8C-%EC%8A%A4%EB%88%95</link>
            <guid>https://velog.io/@hun_dev/%ED%95%9C%EC%A3%BC%ED%95%9C%EA%B6%8C-%EC%8A%A4%EB%88%95</guid>
            <pubDate>Fri, 30 Sep 2022 08:57:19 GMT</pubDate>
            <description><![CDATA[<p>한 주 한 권 책읽기의 첫번째 주인공은 <strong>샘 고슬링</strong>의 <strong>스눕</strong>입니다. 한 3년전쯤 우연한 계기로 심리학에 관심이 생겨 읽게 되었는데, 당시 책을 읽으면서 상당히 흥미로웠던 기억이 떠올라 금주의 도서로 선정하여 다시 읽어보았습니다.</p>
<p><strong>스누핑</strong>은 타인의 개인 공간이나 소지품 등, 타인의 흔적을 통해 그 사람의 성격과 이미지를 유추하는 심리학 기법으로 정의할 수 있습니다. 스눕의 저자 샘 고슬링은 어떠한 공간에서 발견할 수 있는 누군가의 흔적을 통해 그의 성격과 이미지 등을 유추하는 스누핑의 중요성을 내내 강조하고 있습니다. 실제로 책을 읽으면서, 고객들의 니즈를 파악해 서비스를 제공할 필요가 있는 개발자가 스누핑을 능숙히 할 줄 안다면 다양한 방면에서 더 나은 결과를 얻을 수 있지 않을까요.</p>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/6aafe6f2-372e-46fb-b73b-fe1e56091f0a/image.jpg" alt=""></p>
<p><a href="https://search.shopping.naver.com/book/catalog/32441036512?cat_id=50005625&amp;frm=PBOKPRO&amp;query=%EC%8A%A4%EB%88%95&amp;NaPm=ct%3Dl8o44a0o%7Cci%3Db6a7d2769e788f15785c89b7a38b4a8b0877cbf5%7Ctr%3Dboknx%7Csn%3D95694%7Chk%3D1c91fdb37c33cf226d20617910f39dba01beb830">네이버 도서</a>에서는 스눕을 다음과 같이 소개하고 있습니다.</p>
<blockquote>
<p><strong>소지품이나 흔적만으로도 상대의 모든 것을 알 수 있다!</strong><br>
상대를 꿰뚫어보는 힘 『스눕』. 특정 개인과 관련된 장소를 통해 개인의 성향이나 이미지를 파악할 수 있는 노하우를 다양한 사례를 들며 흥미롭게 소개한 책이다. 사람들이 드러내는 ‘자기 정체성 주장’과 ‘감정조절 장치’ 그리고 ‘행동양식의 잔유물’이라는 3가지 개념에 기초해 설명한다. 사소한 물건들을 해석해 그것들의 주인이 가진 성격과 내면 등을 파악해내고, 이를 역으로 이용해 상대가 나를 ‘내가 원하는 모습의 나’로 보게 할 수 있는 이미지메이킹 또한 가능하다는 것을 다양한 실험과 이론 등 과학적인 근거를 통해 증명하고 있다.</p>
</blockquote>
<p><a href="http://weeklybiz.chosun.com/site/data/html_dir/2010/09/17/2010091701322.html">해당 링크</a>는 조선일보에서 작성한 샘 고슬링 교수와의 인터뷰 내용 기사입니다. 샘 고슬링 교수의 스눕에 대한 주장과 생각을 알 수 있습니다. 인터뷰의 내용이 다소 흥미롭다면 <strong>스눕</strong>을 읽어보기를 추천합니다.</p>
<p><strong>스눕</strong>을 읽고 난 후에 든 생각을 정리해보았습니다.</p>
<h1 id="당신은-누구십니까">당신은 누구십니까?</h1>
<p>‘쩝쩝 소리 내지 말아라’, ‘밥 먹을 때 다리 떨지 말아라’ 우리가 어렸을 적부터 받아 왔던 일명 ‘밥상머리 교육’은 어느새 우리에게 더할 나위 없이 익숙한 행동양식이 되었다. 짧으면 수년, 길면 수십 년 전부터 배워 익숙해진 이 행동양식이 때로는 우리를 평가하는 잣대가 되기도 한다.
예를 들어, 밥 먹을 때에 쩝쩝 소리를 내거나 다리를 떠는 사람이 좋지 못한 평가를 받는 것은 당연시되었다. 또, 이 사람이 어떠한 성격을 가졌는지, 어떠한 성장배경을 가졌는지 유추하는 데에 적지 않은 영향을 끼친다. 스눕의 저자 ‘샘 고슬링’은 ‘어느 한 사람의 사무실, 침실 등의 공간에서 찾을 수 있는 그 사람의 행동양식을 통해 그 사람의 성향을 유추할 수 있지 않을까?’ 하는 의문으로부터 이야기를 전개해 나간다.</p>
<p>‘샘 고슬링’은 의문을 해결하기 위해 사람들이 개인적인 공간에 영향을 끼치는 방법들을 알아보는 것을 목적으로 연구조사를 시작한다. 연구조사의 내용은 자원자 그룹을 모집해 자원자들이 방을 비운 동안 분석팀이 그 빈방에 들어가 거기에 남겨진 단서들 만을 바탕으로 방주인에 대한 인상을 그려내는 것이 주를 이룬다. 연구조사가 진행되면서 피실험자들이 주변 환경을 다루는 메커니즘은 크게 ‘자기 정체성 주장의 흔적, 감정 조절의 흔적, 행동양식의 흔적’ 세 가지로 분류되는데, 저자는 이 세 가지 메커니즘이 남들보다 더욱 두드러지게 나타나는 피실험자들을 연구하는 과정과 연구결과를 소개한다. ‘자기 정체성 주장’이 두드러진 신디의 공간에서, ‘감정 조절’이 두드러진 던컨의 공간에서, ‘행동양식’이 두드러진 기드온의 공간에서 저자는 연구를 통해 무엇을 얻고자 했던 것일까. 다시 말해, 저자는 그들의 공간에서 무엇을 보았을까.</p>
<p>이뿐만 아니라 ‘스눕’의 전체적인 내용은 저자가 진행한 연구조사를 중심으로 이루어진다. 피실험자들의 성격을 각각 다섯 가지 유형으로 나누어 피실험자들의 일관적인 생각, 감정 그리고 행동양식의 일정한 패턴에 대해 연구하기도 하고, 실제로 실시된 34건의 면접을 분석해 면접 대상자들의 행동거지와 외모를 포함한 면접 대상자의 모든 것을 기록하고 분석하기도 한다. 이러한 연구조사가 보여주는 단서와 흔적을 바탕으로 저자는 스누핑을 시작한다.</p>
<p>책을 읽으면서 계속되는 연구조사와 이에 따른 스누핑의 반복패턴에 질려갈 무렵, 저자가 연구를 위해 설정한 상황이 독자에게 닥치기 쉽지 않은 상황이라는 생각이 들기 시작했다. 연구를 진행하기 위해 모집한 자원자와는 달리, 평범한 일상생활에서 우리가 만나는 사람은 전혀 모르는 사람부터 떼려야 뗄 수 없는 사이인 사람까지 아주 다양하다. 하지만 그들 모두에게 개인 공간을 공개하고, 많은 흔적을 보이는 것은 참으로 어려운 일이다. 저자는 스누핑을 소개하면서 ‘안면만 있던 사이에서 절친한 친구가 되기까지 어떤 요건들이 필요한지 살펴볼 것이다’라는 문구를 남겼는데, 저자가 연구를 진행한 공간인 사무실이나 침실을 공유할 정도라면 안면만 있던 사이보다 더 친밀한 관계임이 당연하다. 서양과 동양 간의 문화 차이일지는 모르겠지만 안면만 있는 사이에게 자신의 개인 공간을 공개하기는 조금 꺼려지는 것이 사실이다. 친하지 않은 사람과 그의 개인 공간이 남긴 흔적을 통한 스누핑이 마냥 쉽지만은 않아 보인다.</p>
<p>만약 나와 친하든 친하지 않든 그 사람의 흔적을 통해 스누핑을 했다고 가정하자. 독자의 대부분은 전문적인 스누퍼가 아니기 때문에 스누핑을 서투르게 할 수밖에 없다. 필자는 이 서투른 스누핑이 타인에 대한 선입견을 불러올까 걱정된다. 예를 들어, 침대가 잘 정리되지 않은 사람의 흔적을 보고 그 사람은 정리정돈을 잘 하지 않는 성격일 것이며 지저분한 상태를 즐기는 사람이라고 생각하기 십상이다. 그 사람이 진짜 정리정돈을 잘 하지 않고 지저분한 상태를 즐기는 사람일 수도 있지만, 출근 시간에 쫓겨 침대를 채 정리하지 못한 사람일 수도 있지 않은가.</p>
<p>앞서 보았듯이, 서투른 스누핑은 안 하느니만 못하다. 필자는 책을 읽어 내려가면서 저자가 스누핑의 개념을 설명하기보다는 저자의 연구조사 과정과 결과를 서술한다는 느낌을 강하게 받았다. 독자에게 스누핑을 가르치기 위해 쓴 글이 아닌 저자 자신이 ‘스누핑에 관한 연구조사를 진행했으며 이런 결과가 나왔으니 스누핑을 사용하면 상대방의 성격을 파악할 수 있다’라는 허무맹랑한 느낌 말이다. 표지의 ‘상대를 꿰뚫어보는 힘’이라는 문구에 끌려 이 책을 읽게 되었는가, 스누핑이라는 심리학 기법을 처음 배워보고자 이 책을 선택했는가. 그렇다면 당장 이 책을 덮고 다른 스누핑 입문서를 찾아 보는 것을 추천한다. 이 책을 입문서로 삼았다가는 서투른 스누퍼가 될 수밖에 없다. 먼저 다른 스누핑 관련 서적을 읽고 스누핑을 여러 가지 상황에 유연하게 적용할 수 있을 정도의 수준이 되었을 때, 이 책을 읽는다면 더욱 흥미를 가지고 읽을 수 있을 것이다.</p>
<p>하지만 필자는 전문 스누퍼가 아님에도 이 책을 읽으면서 적지 않은 흥미가 환기되었는데 이는 내용 중간중간에 실험 결과를 그래프나 표로 제시해 주었다는 것에서 왔다. 우리의 원초적 본능을 생각해보자. 어떤 글을 읽는데 계속 글자만 읽어 내려가다가는 곧 흥미가 떨어지고 만다. 이상하게 자꾸만 하품이 나오고 지루하다. 평소에는 연락 하나 오지 않던 휴대폰이 계속 울리는 것만 같고 글을 읽는 시간이 마치 억겁의 시간 같다. 하지만 중간중간에 배치된 그림, 표, 그래프 같은 시각자료를 만난다면 글자만 읽어 지루해 하던 우리의 뇌가 곧 흥미를 되찾아 다시 글을 재미있게 읽을 수 있다. 필자는 저자가 우리의 이러한 원초적 본능을 잘 공략했다고 생각한다. 저자는 5대 성격 유형을 설명하면서 다섯 가지의 성격 유형이 각각 높은 사람들의 사례를 표로 소개하기도 하고, 음악 애호가들의 특성, 가치관, 술과 마약 선호도에 대한 고정관념을 그래프로 소개하기도 한다. 이외에도 여러가지 실험 결과를 시각적으로 보기 쉽게 제시함으로써 독자의 흥미를 돋운다.</p>
<p>필자는 독자가 스누핑 스킬을 체득해 다양한 상황에서 유연하게 스누핑을 할 수 있는 경지에 이르렀다면 &lt;스눕, 상대를 꿰뚫어보는 힘&gt;을 읽어 보기를 권한다. ‘샘 고슬링’의 스누핑을 자신만의 방식으로 녹여내 타인을 스누핑하는 것은 색다른 경험이 될 것이다. 타인에 대해 더 많은 것을 알고 그를 파악하고자 타인을 스누핑하는 것도 좋다. 하지만 옛말에 ‘지피지기 백전불태’ 즉, ‘적을 알고 나를 알면 백 번 싸워도 위태롭지 않다.’라는 말이 있다. 나를 아는 것이 상대를 아는 것만큼 중요하다는 것이다. 가끔은 거울 건너편의 나를 스누핑해보자. </p>
<p><strong>‘당신은 누구십니까?’</strong></p>
<h1 id="마무리하며">마무리하며</h1>
<p>누군가의 속을 꿰뚫어보는 것은 어려운 일임을 우리는 너무나도 잘 알고 있습니다. 우리에게 스트레스를 주는 요소 중 상당수를 차지하는 것이 인간관계가 되어가는 모습만 보아도 잘 알 수 있지요. <strong>열 길 물속은 알아도 한 길 사람 속은 모른다</strong>라는 말이 괜히 속담으로 전해져 내려오는 것은 아닐겁니다.</p>
<p>가끔은 나 자신의 속부터 꿰뚫어보는 시간을 가져보는 건 어떨까요. 나 자신을 스누핑하다보면 언젠가 자연스레 남을 스누핑하게 되고, 이로 인해 더 나은 인간관계를 만들고 유지할 수 있을지도 모르겠습니다.</p>
<p><strong>한 주 한 권 책 읽기는 한 주에 한 권씩 다양한 장르의 책을 읽고 기록하는 것을 목표로 합니다. 
책 추천은 언제나 환영입니다! 흥미로운 내용의 책이 있다면 추천해주세요!</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[NLP] 자연어 처리 Task 알아보기]]></title>
            <link>https://velog.io/@hun_dev/NLP-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC-Task-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@hun_dev/NLP-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC-Task-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Fri, 23 Sep 2022 09:52:19 GMT</pubDate>
            <description><![CDATA[<p>어디선가 한번은 봤던 것 같은 사진입니다. 몇 년 전, 피리부는 사나이의 구글 번역 결과입니다. 현재는 <strong>the piped man</strong>으로 수정되어 번역되고 있습니다. 피리부 씨는 왜 사나이가 되었을까요. 또, 어떻게 지금은 우리가 원하는 뜻으로 수정되어 번역되고 있을까요. </p>
<p>인공지능이 발전함에 따라 자연어 처리 기술과 성능 또한 자연스럽게 발전하고 있습니다. 많은 기업이 상담원 대신 24시간 대응 가능한 상담 챗봇 서비스를 제공하고 있고, Papago, Google 번역과 같은 번역기의 성능은 나날이 좋아지고 있습니다. 본 게시글에서는 나날이 발전하고 있고 앞으로도 계속 발전해나갈 자연어처리 Task를 살펴보겠습니다.</p>
<h1 id="자연어-처리란-무엇인가">자연어 처리란 무엇인가</h1>
<p>자연어 처리에 대해서 알기 전에 자연어가 무엇인지 알아보도록 하겠습니다.
<strong>자연어 (Natural Language)</strong>란 프로그래밍 언어와 같이 사람이 인공적으로 만든 언어가 아닌, 우리가 일상 생활에서 사용하는 언어입니다. 이를테면 한국어, 영어, 프랑스어와 같이 일상 생활과 의사 소통을 위해 사용하는 언어라고 할 수 있지요.</p>
<p>이 자연어를 기계가 이해할 수 있게, 즉 컴퓨터가 인간의 언어를 알아들을 수 있게 만드는 것을 <strong>자연어 처리 (Natural Language Processing)</strong>라고 합니다. 이렇게만 보면 자연어 처리가 대체 어떤 것을 연구하는 학문인지 감이 잘 오지 않습니다. 다양한 자연어 처리 Task를 살펴보며 자연어 처리에 대해 이해해보는 시간을 갖도록 하겠습니다.</p>
<p><strong>간단한 소개만 진행하고 자세한 내용은 추후 다른 게시글에서 다루도록 하겠습니다.</strong></p>
<h1 id="nlp-task">NLP Task</h1>
<p>편의상 <strong>자연어 처리</strong>를 <strong>NLP</strong>라 작성하겠습니다. 
NLP는 현재 다양한 분야에서 연구 및 사용되고 있는데, 가장 보편적인 NLP Task에 대해 알아보도록 하겠습니다. </p>
<h2 id="텍스트-분류-text-classification">텍스트 분류 (Text Classification)</h2>
<blockquote>
<p><strong>정리정돈을 잘하자!</strong></p>
</blockquote>
<p>어렸을 때 어른들로부터 줄곧 들어온 소리입니다. 정리정돈의 중요성은 누구보다 잘 알고 있지만 잘 실천하지는 못하죠. 하지만 정리정돈을 잘하면 다양한 상황에서 편리하며 소모되는 시간이 줄어드는 것은 자명합니다. </p>
<p>쉴 새 없이 축적되는 데이터를 잘 분류하는 것은 두 말하면 입 아플 정도로 중요합니다. 잘 분류된 데이터를 이용한다면 처리 속도는 당연히 증가할 것이며, 소모되는 시간과 비용은 현저히 감소할 것입니다. 기계가 데이터 분류, 그 중에서도 텍스트를 잘 분류할 수 있도록 하는 것이 텍스트 분류 (Text Classification)의 목적입니다.</p>
<p>텍스트 분류는 텍스트가 가진 정보를 이용해 분류하는 문제로, 두 가지로 나뉩니다. 분류해야 할 범주가 두 가지라면 이진 분류(Binary Classification)라고 하며, 세 가지 이상이라면 다중 분류(MultiClass Classification)라고 합니다.</p>
<p>이진 분류에 대해 먼저 살펴보자면 말 그대로 두 가지 중 한 가지로 분류되는 문제를 다룹니다.
다음과 같은 항목이 이진 분류에 해당하는 항목입니다.</p>
<blockquote>
<ul>
<li>스팸 메일인지 일반 메일인지</li>
</ul>
</blockquote>
<ul>
<li>긍정적 문장인지 부정적 문장인지</li>
<li>식물인지 동물인지</li>
</ul>
<p>다중 분류는 세 가지 이상의 범주 중 한 가지로 분류되는 문제를 다룹니다.
다음과 같은 항목이 다중 분류에 해당하는 항목입니다.</p>
<blockquote>
<ul>
<li>뉴스 기사 분류 (정치, 경제, 스포츠, IT 등)</li>
</ul>
</blockquote>
<ul>
<li>상품 리뷰 분류 (노트북, 스마트폰, 이어폰 등)</li>
<li>감성 분석 (기쁨, 슬픔, 우울함 등)</li>
</ul>
<h2 id="기계-번역-machine-translation">기계 번역 (Machine Translation)</h2>
<p>이제 더이상 해외에서의 의사소통을 두려워하지 않아도 됩니다. 네이버 Papago, Google 번역과 같은 번역 서비스는 다양한 언어로 번역이 가능할 뿐만 아니라 음성으로 읽어주기까지 합니다. 번역 서비스는 그동안 참 많은 발전을 이루어 왔고 앞으로도 꾸준히 발전할 것입니다.</p>
<p>기계 번역은 <strong>규칙 기반 기계 번역(Rule-Based Machine Translation)</strong>부터, <strong>통계 기반 기계 번역(Statistical Machine Translation)</strong>, <strong>신경망 기계 번역(Neural Machine Translation)</strong>까지 발전을 이루어 왔고 뛰어난 성능을 보여주고 있습니다.</p>
<p>번역하고 싶은 문장을 <strong>Source Text</strong>, 번역된 문장을 <strong>Target Text</strong>라 하겠습니다.</p>
<p><strong>규칙 기반 기계 번역(Rule-Based Machine Translation)</strong>은 Source Text와 Target Text의 문법 규칙을 기반으로 번역하는 방법입니다. Source Text의 형태소 분석, 구문 분석, 의미 분석, 화용 분석을 거쳐 이에 역순으로 Target Text를 생성합니다. 문법 규칙이 유사한 경우 형태소 분석, 구문 분석, 의미 분석, 화용 분석 중 생략되는 단계가 존재할 수 있습니다.</p>
<p><strong>규칙 기반 기계 번역(Rule-Based Machine Translation)</strong>은 언어학적 지식이 상당수 필요하다는 것이 가장 큰 단점으로 꼽힙니다.</p>
<p><strong>통계 기반 기계 번역(Statistical Machine Translation)</strong>은 이름에 나타난 것처럼 통계적으로 번역하는 방법입니다. 통계적이라 함은 사전에 데이터가 존재해야 함을 의미합니다. 데이터를 바탕으로 Word Alignment를 진행해 얻을 수 있는 대역어 테이블에서 단어 혹은 구 단위로 묶어 번역 모델을 생성하는 과정을 거쳐 Source Text와 가장 비슷하다고 예측한 Source Text를 생성합니다.</p>
<p><strong>통계 기반 기계 번역(Statistical Machine Translation)</strong>은 어순이 다른 언어 간 번역이 이루어질 때 성능이 부족하다는 것이 가장 큰 단점으로 꼽힙니다.</p>
<p><strong>신경망 기계 번역(Neural Machine Translation)</strong>은 인공지능이 발전하면서 새로이 등장한 기계 번역 방법입니다. 신경망 기계 번역이 등장하기 전, 번역 서비스는 통계 기반 기계 번역을 기반으로 제공되고 있었습니다. 하지만 신경망 기계 번역이 등장하고 점차 통계 기반 기계 번역을 대체하고 있습니다.</p>
<p><strong>신경망 기계 번역(Neural Machine Translation)</strong>은 데이터를 통해 학습된다는 점에서 통계 기반 기계 번역과 유사하다고 볼 수 있으나, 통계 기반 기계 번역이 사용하는 데이터보다 더욱 방대한 데이터를 통해 딥러닝한다는 점이 신경망 기계 번역의 특징입니다.</p>
<p><strong>신경망 기계 번역(Neural Machine Translation)</strong>의 가장 큰 단점은 데이터의 질과 양에 따라 언어별 번역 정확도가 다르다는 것입니다. 상대적으로 데이터의 양이 많은 영어와 데이터의 양이 적은 한국어, 태국어 등 단일 국가에서 사용하는 언어에 대한 번역 정확도는 서로 상이한 결과를 보입니다.</p>
<h2 id="텍스트-요약-text-summarization">텍스트 요약 (Text Summarization)</h2>
<blockquote>
<p><strong>세 줄 요약 좀</strong></p>
</blockquote>
<p>장문의 게시글을 게시하거나, 메세지를 작성하여 전송하면 독자, 상대방이 흔히 보이는 반응입니다. 수능을 준비하던 수험생 시절 우리를 괴롭혔던 언어, 외국어 영역의 요약 문제를 풀 때 빠르고 정확하게 요약할 수 있는 초능력이 발휘되었으면 하는 바람을 항상 가지곤 했었지요.</p>
<p>이렇듯 텍스트 요약(Text Summarization)은 정말 중요한 Task입니다. 다수의 문단, 더 나아가 다수의 문서로 이루어진 텍스트 정보를 한 눈에 파악하기란 아주 어려운 일입니다. 또, 전문 용어가 가득한 텍스트를 마주 하는 날에는 눈 앞이 깜깜해져 버립니다.</p>
<p><strong>텍스트 요약(Text Summarization)</strong>은 원문을 잘 반영하면서도 간결하고 이해하기 쉬운 형태의 문장, 혹은 문단으로 요약하는 Task입니다. 원문의 문장을 포함한 요약인 <strong>Extractive Method</strong>와 원문의 의미를 해석하여 새로운 문장을 생성하는 요약인 <strong>Abstractive Method</strong>가 존재합니다.</p>
<p>텍스트의 핵심 내용을 빠르고 정확하게 판단할 수 있는 좋은 요약문을 생성하기 위한 연구는 활발히 진행중이며, 더욱 발전되어야 할 연구 분야입니다.</p>
<h1 id="nlp가-풀어야-할-숙제">NLP가 풀어야 할 숙제</h1>
<p>저를 지도하신 교수님께서는 <strong>NLP에 100%는 없다</strong>라고 항상 강조하셨습니다. 텍스트 분류, 기계 번역, 텍스트 요약을 포함한 다양한 NLP Task는 100%의 정확도를 보이지 못합니다. 하지만 100%에 근접하는 정확도를 보이기 위한 노력은 계속되어야 하며, 계속될 것입니다.</p>
<p>본 게시글에서 소개한 Task를 제외하고도 많은 NLP Task가 존재합니다. 본 게시글에서는 제가 생각했을 때 가장 보편적이라고 생각하고 관심 있는 NLP Task를 소개하였습니다. </p>
<p>다음 게시글에서는 소개한 NLP Task들을 하나씩 자세하게 살펴보도록 하겠습니다.</p>
<p><strong>피드백은 항상 감사히 받습니다. 게시글에 수정해야 할 내용이 있다면 댓글로 알려주세요!</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[개발 환경] GCP에서 GPU를 이용해 개발해보자! - 04 (完)]]></title>
            <link>https://velog.io/@hun_dev/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-GCP%EC%97%90%EC%84%9C-GPU%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4-%EA%B0%9C%EB%B0%9C%ED%95%B4%EB%B3%B4%EC%9E%90-04</link>
            <guid>https://velog.io/@hun_dev/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-GCP%EC%97%90%EC%84%9C-GPU%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4-%EA%B0%9C%EB%B0%9C%ED%95%B4%EB%B3%B4%EC%9E%90-04</guid>
            <pubDate>Mon, 19 Sep 2022 13:07:27 GMT</pubDate>
            <description><![CDATA[<p>오류를 고치지 못하고 찝찝한 기분으로 잠자리에 들려는 순간, 여러분의 뇌가 신호를 보내온다면 여러분은 어떻게 하시나요? 저는 그림의 주인공처럼 정신이 확 들면서 자연스레 컴퓨터 앞에 앉게 됩니다. 이건 어쩌면 개발자의 숙명이 아닐까요?</p>
<p>항상 느끼는 것이지만 깨어 있는 시간에 뇌가 신호를 보내주었으면 좋겠습니다. (<del>제발 부탁할게 내 뇌야</del>)</p>
<p>지난 게시글에서는 딥러닝 개발을 위해 GPU를 사용할 수 있게끔 설정을 진행해보았습니다. 이번 게시글에서는 PyTorch와 TensorFlow를 설치해보겠습니다.</p>
<p>지난 게시글은 <a href="https://velog.io/@hun_dev/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-GCP%EC%97%90%EC%84%9C-GPU%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4-%EA%B0%9C%EB%B0%9C%ED%95%B4%EB%B3%B4%EC%9E%90-03">해당 링크</a> 또는 위의 시리즈를 통해 다시 볼 수 있습니다.</p>
<h1 id="버전-호환-정리">버전 호환 정리</h1>
<p>TensorFlow는 CUDA 버전, cudnn 버전과 호환되는 버전을 사용해야 올바르게 동작하고, PyTorch는 CUDA 버전과 호환되는 버전을 사용해야 올바르게 동작합니다. </p>
<p>따라서, 설치 전에 CUDA, cuDNN, TensorFlow, PyTorch 간 서로 호환되는지 확인하는 것이 우선입니다. 다음은 제가 사용하고 있는 사양과 버전입니다.</p>
<blockquote>
<p>OS : Linux Ubuntu 20.04 LTS
GPU : NVIDIA Tesla V100
CUDA : 11.2
cuDNN : 8.1
Python : 3.8
TensorFlow : 2.5.0
PyTorch : 1.7.1</p>
</blockquote>
<p>여러 번의 시행착오를 거듭하며 얻어낸 조합입니다. 본 게시글은 위와 같은 버전을 설치할 것입니다.</p>
<p>PyTorch 버전 호환 정보는 <a href="https://pytorch.org/get-started/previous-versions/">해당 링크</a>에서 확인할 수 있고 다운로드 가능합니다.</p>
<p>TensorFlow 버전 호환 정보는 <a href="https://www.tensorflow.org/install/source#linux">해당 링크</a>에서 확인할 수 있습니다.</p>
<h1 id="pytorch-설치">PyTorch 설치</h1>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/81947c78-0f9c-458f-8606-3dcc8bca49ae/image.JPG" alt=""></p>
<p><a href="https://pytorch.org/get-started/previous-versions/">해당 링크</a>에서 확인한 1.7.1 버전 설치 명령어입니다. Linux 환경에서 설치할 것이므로 아래에 나열된 명령어 중 CUDA 버전과 맞는 명령어를 통해 설치하면 됩니다.</p>
<blockquote>
<p>CUDA 11.2 버전은 없는데 ?</p>
</blockquote>
<p>CUDA 11.2 보다 아래 버전의 명령어를 선택하여 설치하면 됩니다. 지금 같은 경우는 CUDA 11.0 버전 명령어를 입력하여 설치합니다. 다음과 같은 명령어를 터미널에 입력하여 <strong>PyTorch 1.7.1 버전</strong>을 설치합니다.</p>
<pre><code>$ pip3 install torch==1.7.1+cu110 torchvision==0.8.2+cu110 -f https://download.pytorch.org/whl/torch_stable.html</code></pre><h1 id="tensorflow-설치">TensorFlow 설치</h1>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/58f5beef-bfde-4d92-8ee4-664870e93ce9/image.JPG" alt=""></p>
<p><a href="https://pytorch.org/get-started/previous-versions/">해당 링크</a>에서 확인한 버전 별 호환 정보입니다. 각자 환경에 맞는 TensorFlow 버전을 설치하면 됩니다. 본 게시글은 <strong>Python은 3.8, cuDNN은 8.1, CUDA는 11.2 버전</strong>을 사용하므로 TensorFlow는 2.5.0 ~ 2.7.0 버전을 설치하면 되는데, <strong>2.5.0 버전</strong>을 설치하도록 하겠습니다.</p>
<p>다음과 같은 명령어를 터미널에 입력하여 TensorFlow 2.5.0 버전을 설치합니다. GPU를 사용하기 위해서는 TensorFlow gpu 버전 또한 설치해주어야 합니다.</p>
<pre><code>$ pip3 install tensorflow==2.5.0
$ pip3 install tensorflow-gpu==2.5.0</code></pre><h1 id="gpu-인식-확인">GPU 인식 확인</h1>
<p>PyTorch와 TensorFlow가 정상적으로 설치되었으면 GPU를 인식하는지 확인해보는 절차가 필요합니다.</p>
<p>터미널에 <strong>python3</strong>을 입력해 <strong>Python</strong>을 실행합니다.</p>
<p><strong>TensorFlow 확인</strong></p>
<pre><code>&gt;&gt;&gt; from tensorflow.python.client import device_lib
&gt;&gt;&gt; device_lib.list_local_devices()</code></pre><p>위와 같이 입력하였을 때, 다음과 같이 사용 가능한 CPU와 GPU가 출력됩니다.</p>
<pre><code>[name: &quot;/device:CPU:0&quot;
device_type: &quot;CPU&quot;
memory_limit: 268435456
locality {
}
incarnation: 11070026007720078383
, name: &quot;/device:GPU:0&quot;
device_type: &quot;GPU&quot;
memory_limit: 15358427136
locality {
  bus_id: 1
  links {
  }
}
incarnation: 4103382598444265130
physical_device_desc: &quot;device: 0, name: Tesla V100-SXM2-16GB, pci bus id: 0000:00:04.0, compute capability: 7.0&quot;
]</code></pre><p>사용 가능한 디바이스 목록에 GPU가 출력되지 않으면 TensorFlow 설치 과정에 오류가 있는 것이니 TensorFlow 삭제 후 재설치를 진행하여야 합니다.</p>
<p><strong>PyTorch 확인</strong></p>
<pre><code>&gt;&gt;&gt; import torch
&gt;&gt;&gt; torch.cuda.is_available()</code></pre><p>위와 같이 입력하였을 때, <strong>True</strong>가 출력되면 GPU가 인식되어 사용 가능하다는 의미이고, <strong>False</strong>가 출력되면 GPU가 인식되지 않아 사용 불가능하다는 의미입니다. False가 출력된다면 PyTorch 설치 과정에 오류가 있는 것이니 PyTorch 삭제 후 재설치를 진행하여야 합니다.</p>
<h1 id="이제-진짜-딥러닝-개발을-진행해보자">이제 진짜 딥러닝 개발을 진행해보자!</h1>
<p>처음 환경을 구성할 때는 알맞은 버전의 TensorFlow와 PyTorch를 설치하는 과정에서 상당한 어려움을 겪었습니다. 본 시리즈를 작성하게 된 이유이기도 합니다. (<del>머리를 너무 쥐어뜯어서 몇 가닥 빠진 것 같습니다</del>)</p>
<p>본 게시글에서 설치한 CUDA, cuDNN, PyTorch, TensorFlow는 제가 직접 설치, 삭제, 재설치를 반복하여 얻은 아주 잘 호환되는 버전 조합입니다.</p>
<p>본 게시글을 마지막으로 <strong>GCP에서 GPU를 이용해 개발해보자!</strong> 시리즈가 마무리되었습니다.</p>
<p>드디어 <strong>구글 신</strong>의 은총을 받아 딥러닝 개발을 진행할 수 있게 되었습니다. 우리 모두 그동안 GPU 사양이 부족해 맘껏 개발하지 못했던 나날들은 모두 잊고, <strong>맘껏 개발합시다!</strong></p>
<p><strong>피드백은 항상 감사히 받습니다. 설정 중 오류가 발생하거나, 게시글에 수정해야 할 내용이 있다면 댓글로 알려주세요!</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[개발 환경] GCP에서 GPU를 이용해 개발해보자! - 03]]></title>
            <link>https://velog.io/@hun_dev/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-GCP%EC%97%90%EC%84%9C-GPU%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4-%EA%B0%9C%EB%B0%9C%ED%95%B4%EB%B3%B4%EC%9E%90-03</link>
            <guid>https://velog.io/@hun_dev/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-GCP%EC%97%90%EC%84%9C-GPU%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4-%EA%B0%9C%EB%B0%9C%ED%95%B4%EB%B3%B4%EC%9E%90-03</guid>
            <pubDate>Fri, 16 Sep 2022 13:41:49 GMT</pubDate>
            <description><![CDATA[<p>지난 게시글에서는 GCP에서 GPU를 할당받고 VM 인스턴스를 생성해보았습니다. 이번 게시글에서는 GPU 설정을 진행해보겠습니다.</p>
<p>지난 게시글은 <a href="https://velog.io/@hun_dev/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-GCP%EC%97%90%EC%84%9C-GPU%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4-%EA%B0%9C%EB%B0%9C%ED%95%B4%EB%B3%B4%EC%9E%90-02">해당 링크</a> 또는 위의 시리즈를 통해 다시 볼 수 있습니다.</p>
<h1 id="pip-설치">pip 설치</h1>
<p>처음 VM 인스턴스를 실행하면 설치되어 있는 패키지들의 새로운 버전을 확인하고 업그레이드해줍니다. 터미널에 다음과 같이 입력해줍니다.</p>
<pre><code>$ sudo apt-get update
$ sudo apt-get upgrade</code></pre><p>다음과 같은 명령어를 터미널에 입력해 pip3을 설치합니다.</p>
<pre><code>$ sudo apt-get install python3-pip</code></pre><p>아래의 명령어를 입력하면 pip의 버전과 설치 경로를 알 수 있습니다.</p>
<pre><code>$ pip3 --version</code></pre><p><img src="https://velog.velcdn.com/images/hun_dev/post/fb669c1a-9668-4dd0-b395-406c4fac4c88/image.JPG" alt=""></p>
<h1 id="jupyter-notebook-설정-선택-사항">jupyter notebook 설정 (선택 사항)</h1>
<p>해당 설정은 jupyter를 사용하고자 할 때만 진행하면 됩니다. </p>
<p>다음과 같은 명령어를 터미널에 입력해 jupyter를 설치합니다.</p>
<pre><code>$ sudo apt-get install jupyter</code></pre><p>jupyter 설치가 완료되었으면 환경설정을 위해 config 파일을 생성합니다.</p>
<pre><code>$ jupyter notebook --generate-config</code></pre><p><img src="https://velog.velcdn.com/images/hun_dev/post/591845b4-ed21-40b2-bc62-a3ba03a43cf8/image.JPG" alt=""></p>
<p>config 파일 생성이 완료되면 config 파일의 경로가 출력됩니다. config 파일을 열어 편집해보겠습니다. config 파일을 열면 주석처리된 문장들이 나열되어 있는 것을 볼 수 있습니다. 스크롤을 가장 아래로 내리거나 <strong>Ctrl + End</strong>를 눌러 파일의 마지막으로 이동합니다. a를 눌러 vi 입력모드로 진입합니다. </p>
<p>vi에 익숙하지 않은 분들을 위해 <a href="https://terms.naver.com/entry.naver?docId=4125944&amp;cid=59321&amp;categoryId=59321">네이버 지식백과</a>에서 vi 에디터 명령어 정리표를 제공합니다.  </p>
<pre><code>$ vi ~/.jupyter/jupyter_notebook_config.py

c = get_config()
c.NotebookApp.ip = &#39;VM 인스턴스의 외부 IP 주소&#39;
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8888</code></pre><p>c.NotebookApp.ip는 VM 인스턴스의 외부 IP 주소, c.NotebookApp.open_browser는 실행과 동시에 Web Browser의 실행 여부, c.NotebookApp.port는 VM 인스턴스 생성 시 jupyter 태그의 포트 번호를 설정합니다. 본 시리즈를 처음부터 따라오셨다면 8888을 입력하면 됩니다.</p>
<p>입력이 완료되었으면 ESC를 눌러 <strong>:wq</strong>를 입력해 수정 내용을 저장하고 파일을 닫아줍니다. 
<img src="https://velog.velcdn.com/images/hun_dev/post/28bef3d7-921f-4f4c-830f-6f0d98d97d9a/image.JPG" alt=""></p>
<p>jupyter notebook을 사용하기 위한 환경설정이 완료되었습니다. 터미널에 다음과 같이 입력해 jupyter notebook 서버를 실행합니다.</p>
<pre><code>$ jupyter-notebook --ip=0.0.0.0 --port=8888</code></pre><p>정상 실행되면 jupyter notebook이 다음과 같이 실행되고 있다는 문구가 출력됩니다. 로컬에서 해당 notebook에 접근해보겠습니다. Web Browser를 열고 주소창에 다음과 같이 입력합니다.</p>
<pre><code>http://외부IP주소:8888</code></pre><p>입력하면 다음과 같이 패스워드 혹은 토큰을 입력하여 로그인하라는 페이지가 나타납니다.</p>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/8d3307be-c067-4e1d-a06e-3c324a60e2b6/image.JPG" alt=""></p>
<p>VM 인스턴스의 터미널을 보면 The Jupyter Notebook is running at: 아래 주소 가장 뒤 token= 부분에서 토큰 정보를 알 수 있습니다.</p>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/8e322c0c-a77a-4cef-ad30-4e42440e7228/image.JPG" alt=""></p>
<p>복사 및 붙여넣기 후 jupyter notebook 서버에 로그인합니다.</p>
<p>토큰을 입력하는 번거로운 과정을 거치지 않고 싶다면 다음과 같이 입력하여도 됩니다.</p>
<pre><code>http://외부IP주소:8888/?token=토큰</code></pre><h1 id="gpu-드라이버-설치">GPU 드라이버 설치</h1>
<p>가장 먼저 진행해야 하는 것은 GPU 드라이버 설치입니다. 처음 VM 인스턴스를 생성하면 GPU 드라이버가 설치되어 있지 않습니다. 따라서 GPU 드라이버를 직접 설치해주어야 합니다.</p>
<p>GPU 드라이버를 입력하기 위해 드라이버 설치 패키지를 설치합니다.</p>
<pre><code>$ sudo apt-get install ubuntu-drivers-common</code></pre><p>설치가 완료되고 터미널에 다음과 같이 입력하면 GPU 종류와 설치 가능한 GPU 드라이버 목록이 출력됩니다.</p>
<pre><code>$ ubuntu-drivers devices</code></pre><p><img src="https://velog.velcdn.com/images/hun_dev/post/60cb6ff7-71de-4cbe-b57f-7819604526fc/image.JPG" alt=""></p>
<p>저는 <strong>nvidia-driver-515</strong>를 설치하려고 합니다. </p>
<pre><code>$ sudo apt-get install nvidia-driver-515</code></pre><p>다음 명령어를 입력하면 추천 드라이버를 알아서 설치할 수도 있습니다.</p>
<pre><code>$ sudo ubuntu-drivers autoinstall</code></pre><p>원하는 드라이버를 설치하려면 첫 번째 방법으로, 추천 드라이버를 설치하려면 두 번째 방법으로 진행하면 됩니다.</p>
<p>설치가 완료되면 인스턴스를 재부팅하여 제대로 설치되었는지 확인합니다.</p>
<pre><code>$ sudo reboot
$ nvidia-smi</code></pre><p><img src="https://velog.velcdn.com/images/hun_dev/post/301c46d7-1827-47b6-a897-02960a06ce31/image.JPG" alt=""></p>
<p>위와 같이 출력되고 Driver Version이 설치한 버전과 같으면 제대로 설치된 것입니다.</p>
<h1 id="cuda-설치">CUDA 설치</h1>
<p>CUDA는 NVIDIA에서 만든 GPU의 가상 명령어셋을 사용할 수 있도록 만들어주는 소프트웨어 레이어입니다. CUDA는 병렬 연산 수행을 돕습니다. GPU로 딥러닝을 진행하려면 필수로 설치해야 하는 것이지요.</p>
<p>CUDA는 많은 버전이 존재하며, 자신의 GPU 드라이버의 버전에 맞게 설치하면 됩니다. GPU 드라이버의 버전마다 호환 가능한 CUDA 버전은 <a href="https://docs.nvidia.com/deploy/cuda-compatibility/">해당 링크</a>에서 참고할 수 있습니다.</p>
<p>저는 <strong>CUDA-11.2</strong>를 설치하려고 합니다. 추후에 설치할 TensorFlow와 PyTorch와 CUDA 버전의 호환이 중요하기 때문에 웬만하면 게시글대로 설치하는 것을 추천드립니다.</p>
<p><a href="https://developer.nvidia.com/cuda-toolkit-archive">해당 링크</a>에서 CUDA 전 버전을 설치할 수 있습니다. 원하는 CUDA 버전을 클릭하면 본인의 사양에 맞는 CUDA프로그램을 설치할 수 있습니다. 저는 <a href="https://developer.nvidia.com/cuda-11.2.0-download-archive">CUDA Toolkit 11.2</a>를 설치하도록 하겠습니다. </p>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/80760aa4-e2c5-4c90-8e1c-19061ac7f42e/image.JPG" alt=""></p>
<p>설치 방법이 세 가지 존재하는데 저는 <strong>runfile (local)</strong>로 설치하도록 하겠습니다. deb를 통한 설치 방법은 GPU 드라이버를 따로 설치하게 되어 기존에 설치한 드라이버 버전과 충돌이 일어나 설치 과정에 오류가 발생합니다. 따라서, GPU 드라이버를 따로 설치하지 않는 runfile 방법을 선택하였습니다.</p>
<p>사실 runfile 방법은 UI를 이용한 설치 방법입니다. 하지만 UI를 이용하지 않고 설치해보겠습니다.
<strong>sudo sh ~.run --silent --toolkit</strong> 명령어를 사용하면 UI 없이 CUDA Toolkit만 설치가 가능합니다.</p>
<pre><code>$ wget https://developer.download.nvidia.com/compute/cuda/11.2.0/local_installers/cuda_11.2.0_460.27.04_linux.run
$ sudo sh cuda_11.2.0_460.27.04_linux.run --silent --toolkit</code></pre><p>정상적으로 설치가 완료되었으면 터미널에 아무것도 출력되지 않습니다. 터미널에 다음과 같이 입력하고 <strong>cuda, cuda-11.2</strong> 디렉토리가 있으면 정상적으로 설치가 완료된 것입니다.</p>
<pre><code>$ ls /usr/local</code></pre><p>설치가 완료되었으면 CUDA PATH를 설정해주어야 합니다.
PATH는 .bashrc 파일을 열어 설정할 수 있습니다. bashrc 파일을 열어 스크롤을 가장 아래로 내리거나 <strong>Ctrl + End</strong>를 눌러 파일의 마지막으로 이동하여 입력하면 됩니다.</p>
<pre><code>$ vi ~/.bashrc

export PATH=/usr/local/cuda-11.2/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.2/lib64:${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}</code></pre><p>입력이 완료되었으면 <strong>:wq</strong>를 입력해 저장 후 파일을 닫습니다.
다른 CUDA 버전을 설치하신 분은 경로 중간에 있는 <strong>cuda-11.2</strong> 부분을 버전에 맞게 변경해주시면 됩니다.</p>
<p>입력이 완료되었으면 다음과 같이 입력하여 수정 내용을 저장하고 업데이트합니다.</p>
<pre><code>$ source ~/.bashrc</code></pre><p>다음과 같이 입력하여 CUDA가 올바르게 설치되었는지 확인할 수 있습니다. CUDA 버전도 함께 출력되는 것을 알 수 있습니다.</p>
<pre><code>$ nvcc -V</code></pre><p><img src="https://velog.velcdn.com/images/hun_dev/post/4ca372e8-4681-43aa-9331-b5158e867a57/image.JPG" alt=""></p>
<h1 id="cudnn-설치">cudnn 설치</h1>
<p>CUDA와 마찬가지로 GPU를 사용하여 딥러닝하기 위해 필요한 cudnn을 설치해야 합니다. cudnn은 CUDA Deep Neural Network Library의 준말로 딥러닝을 효율적이고 빠르게 처리할 수 있게 돕는 라이브러리입니다.</p>
<p>cudnn은 CUDA와 다르게 파일을 직접 다운로드해 설치하여야 합니다. 따라서, 로컬에서 다운로드받은 후 VM 인스턴스로 업로드하는 과정이 필요합니다. 이 과정에서 jupyter를 사용하면 좀 더 빠른 업로드 및 다운로드가 가능합니다. </p>
<p><a href="https://developer.nvidia.com/rdp/cudnn-archive">해당 링크</a>에서 <strong>회원가입</strong> 후에 자신의 CUDA 버전에 맞는 cudnn을 설치할 수 있습니다. 저는 <strong>cudnn 8.1.0</strong>을 설치하도록 하겠습니다. 이또한 CUDA와 마찬가지로 추후에 설치할 TensorFlow와 PyTorch와 cudnn 버전의 호환이 중요하기 때문에 웬만하면 게시글대로 설치하는 것을 추천드립니다.</p>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/81b2feb7-4000-4e33-a4c7-58b9ddfb5983/image.JPG" alt=""></p>
<p>로컬에서 두 번째에 위치한 <strong>cuDNN Library for Linux (x86_64)</strong>를 클릭하여 다운로드받은 후, jupyter를 이용하거나 GCP에서 제공하는 파일 업로드 기능을 이용하여 VM 인스턴스로 업로드합니다.</p>
<p>VM 인스턴스로의 파일 업로드가 완료되면 파일 위치로 이동해 다음과 같이 입력합니다. 압축을 해제하는 명령어입니다.</p>
<pre><code>$ tar -xvzf cudnn-11.2-linux-x64-v8.1.0.77.tgz</code></pre><p>압축을 해제하고 다음과 같은 명령어를 터미널에 입력합니다.</p>
<pre><code>$ sudo cp cuda/include/cudnn*.h /usr/local/cuda-11.2/include 
$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda-11.2/lib64 
$ sudo chmod a+r /usr/local/cuda-11.2/include/cudnn*.h /usr/local/cuda-11.2/lib64/libcudnn*</code></pre><p>다음과 같이 입력하여 cudnn이 올바르게 설치되었는지 확인할 수 있습니다. </p>
<pre><code>$ cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2</code></pre><p><img src="https://velog.velcdn.com/images/hun_dev/post/d7428393-1b68-4aee-97c3-41a13c217fbf/image.JPG" alt=""></p>
<p>8.1.0 버전이 설치된 것을 알 수 있습니다.</p>
<h1 id="gpu-설정-완료">GPU 설정 완료!</h1>
<p>본 게시글에서 TensorFlow, PyTorch와 같은 딥러닝 라이브러리를 설치해보려고 하였으나, 예상 외로 게시글의 분량이 넘쳐버리는 바람에 다음 게시글에서 설치함으로 시리즈를 마무리해야할 것 같습니다.</p>
<p>CUDA, cudnn 설치 과정에서 가장 애를 먹었는데 <del>(스트레스가 엄청납니다)</del> 본 게시글을 보신 분들은 문제 없이, 오류 없이 잘 설치하여 스트레스받는 일이 없으셨으면 좋겠습니다. </p>
<p><strong>피드백은 항상 감사히 받습니다. 설정 중 오류가 발생하거나, 게시글에 수정해야 할 내용이 있다면 댓글로 알려주세요!</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[개발 환경] GCP에서 GPU를 이용해 개발해보자! - 02]]></title>
            <link>https://velog.io/@hun_dev/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-GCP%EC%97%90%EC%84%9C-GPU%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4-%EA%B0%9C%EB%B0%9C%ED%95%B4%EB%B3%B4%EC%9E%90-02</link>
            <guid>https://velog.io/@hun_dev/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-GCP%EC%97%90%EC%84%9C-GPU%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4-%EA%B0%9C%EB%B0%9C%ED%95%B4%EB%B3%B4%EC%9E%90-02</guid>
            <pubDate>Tue, 13 Sep 2022 16:26:27 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hun_dev/post/2273aa71-cbca-4975-a98a-a0111610b498/image.gif" alt=""></p>
<p>꿀 같이 달콤했던 나흘이 지나고 다시 바쁜 일상이 찾아왔습니다. 다들 추석 연휴는 잘 보내셨는지요. 지난 게시글에서는 GCP에서 GPU를 할당받는 과정을 진행해보았습니다. 이번 게시글에서는 할당받은 GPU를 토대로 VM 인스턴스를 생성해보겠습니다.</p>
<p>지난 게시글은 <a href="https://velog.io/@hun_dev/%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD-GCP%EC%97%90%EC%84%9C-GPU%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4-%EA%B0%9C%EB%B0%9C%ED%95%B4%EB%B3%B4%EC%9E%90-01">해당 링크</a> 또는 위의 시리즈를 통해 다시 볼 수 있습니다.</p>
<h1 id="vm-인스턴스-생성">VM 인스턴스 생성</h1>
<p>GPU 할당을 받았으니 이제 할당받은 GPU를 사용하여 개발을 진행할 개발 공간, 즉 VM 인스턴스가 필요합니다. 그 전에 VM에 대해 잠시 알아보도록 하겠습니다.</p>
<blockquote>
<p><strong>VM ( Virtual Machine, 가상 머신 )</strong>
가상 머신은 컴퓨팅 환경을 소프트웨어로 구현한 것, 즉 컴퓨터 시스템을 에뮬레이션(가상 현실화)하는 소프트웨어다. 가상 머신 상에서 운영 체제나 응용 프로그램을 설치 및 실행할 수 있다.<br>
(참고) <a href="https://ko.wikipedia.org/wiki/%EA%B0%80%EC%83%81_%EB%A8%B8%EC%8B%A0">위키백과 - 가상 머신</a></p>
</blockquote>
<p>쉽게 말해, 현재 사용하고 있는 호스트 컴퓨터 안에 또다른 컴퓨터를 생성하고 동작시키는 것이라고 할 수 있습니다. VM을 이용하면 호스트 컴퓨터와 독립된 공간에서 동작하므로 각종 테스트에 용이합니다. </p>
<p>뿐만 아니라, 현재 Windows 환경에서 개발을 진행하고 있는데 Linux 등 Windows가 아닌 타 환경에서의 개발이 필요할 때도 요긴하게 사용할 수 있습니다.</p>
<p>그러나 호스트 컴퓨터보다 떨어지는 효율성과 실행 속도, 하나의 호스트 컴퓨터에서 다수의 가상 머신을 실행했을 시 나타나는 성능의 불안정함은 불가피합니다.</p>
<p>대표적인 VM 프로그램으로는 VirtualBox, VMware 등이 있습니다. </p>
<blockquote>
<p>Google Cloud의 VM 인스턴스에 대한 설명입니다.
<a href="https://cloud.google.com/compute/docs/instances?hl=ko#instances_and_containers">https://cloud.google.com/compute/docs/instances?hl=ko#instances_and_containers</a></p>
</blockquote>
<p>GCP에서 VM 인스턴스를 생성하는 것은 어렵지 않습니다. 좌측 상단의 탐색 메뉴를 클릭해 Compute Engine의 VM 인스턴스를 클릭합니다. 그러면 다음과 같은 페이지가 우리를 맞아줍니다.</p>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/5e890cff-d43a-4fa8-ab16-966a5f7901b5/image.JPG" alt=""></p>
<p><strong>인스턴스 만들기</strong>를 클릭합니다. 클릭하면 인스턴스 이름, 머신 구성, 방화벽 설정 등을 진행할 수 있는 페이지가 나타납니다. 작성 및 변경할 사항은 다음과 같습니다.</p>
<blockquote>
<p>이름, 리전, 영역, 머신 구성, 부팅 디스크, 방화벽, 고급 옵션 - 네트워킹</p>
</blockquote>
<p><a href="https://cloud.google.com/compute/docs/instances/create-start-instance?hl=ko">해당 링크</a>는 GCP의 VM 인스턴스 생성 가이드입니다. 우리는 위의 설정만 작성 및 변경하지만 다른 설정도 작성 및 변경하여 인스턴스를 생성하고 싶다면 참고하여 생성하면 됩니다.</p>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/e5ee2d57-0339-4c3a-ba04-43a3ef6ff21e/image.JPG" alt=""></p>
<p>인스턴스 이름 설정입니다. 저는 Bert를 사용하여 작업을 진행할 것이기에 간단하게 &#39;instance-bert&#39;라고 하겠습니다.</p>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/9cf7f230-bebc-4905-8bd1-2e4054896663/image.JPG" alt=""></p>
<p>인스턴스 리전과 영역 설정입니다. 리전과 영역마다 사용할 수 있는 리소스, CPU, 머신 유형 등이 상이합니다. 아쉽게도 서울을 비롯한 근방의 홍콩, 도쿄 등은 <strong>V100 GPU</strong>를 지원하지 않습니다. 저는 V100 GPU를 사용할 수 있는 <strong>asia-east1 리전의 asia-east1-c 영역</strong>을 선택하였습니다. 제가 선택한 리전과 영역은 <strong>T4, V100, P100</strong>을 지원합니다. </p>
<blockquote>
<p>리전 및 영역 별 사용가능한 설정은 <a href="https://cloud.google.com/compute/docs/regions-zones?authuser=2&amp;_ga=2.56598315.-1090478596.1660401695">여기</a>에서 알 수 있습니다. 
그러나 GPU 사용이 가장 제한되는 문제이므로, <a href="https://cloud.google.com/compute/docs/gpus/gpu-regions-zones?authuser=2&amp;_ga=2.99514910.-1090478596.1660401695">여기</a>에서 해당 GPU를 사용가능한 지역을 찾아 선택하면 됩니다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/e381d269-0c33-4ae7-86b2-9712f34044ad/image.JPG" alt=""></p>
<p>아시아 리전의 GPU 리전 및 영역 조합 표입니다. GPU 플랫폼 항목에서 사용하고자 하는 GPU를 찾아 해당 리전과 영역을 선택하면 됩니다.</p>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/d29a90d7-cdd0-4fac-9fec-9e3ad742ed57/image.JPG" alt=""></p>
<p>머신 구성 설정입니다. 우리는 GPU를 사용할 것이기 때문에 머신 계열에서 GPU를 선택합니다. GPU 유형으로 할당받은 GPU를 선택하고 GPU 수는 할당량만큼 설정합니다. 저는 <strong>V100 GPU를 1</strong>만큼 할당 받았기 때문에 다음과 같이 설정하였습니다. </p>
<p>다음으로는 머신 유형을 설정합니다. 필요에 부합하는 vCPU의 수와 메모리의 크기를 설정합니다. 그 외 사항은 건드리지 않아도 됩니다.</p>
<blockquote>
<p><strong>리소스가 많아지고 성능이 향상될수록 시간 당 부과되는 요금은 올라가니 적당히 타협하여 설정해야 합니다.</strong></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/fe3f6924-ea6c-4c19-a960-a72ae3406eb8/image.JPG" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/ce93f91a-7842-4e11-969e-53fb45401307/image.JPG" alt=""></p>
<p>부팅 디스크 이미지 설정입니다. 변경을 눌러 원하는 이미지의 부팅 디스크로 설정합니다. 저는 <strong>Ubuntu 20.04 LTS</strong> 환경에서 작업할 것이기에 사진과 같이 설정하였습니다. 본 게시글 및 시리즈는 <strong>Ubuntu 20.04 LTS</strong> 환경에서 진행됩니다.</p>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/8e55c6e1-bfa9-442d-a629-16fa24a32d47/image.JPG" alt=""></p>
<p>방화벽 설정과 고급옵션 - 네트워킹 설정입니다. 사용하면서 로컬 컴퓨터와의 기본 파일 업로드 및 다운로드 기능이 존재하나, 파일의 크기가 커질수록 속도가 현저히 느려짐을 알 수 있었습니다. 따라서 jupyter를 통해 파일 업로드 및 다운로드를 진행할 것입니다. 뿐만 아니라, CLI 환경이 어색하거나 notebook 환경이 익숙하신 분들은 다음과 같이 네트워크 태그에 꼭 jupyter를 작성해주세요. ( <strong>jupyter 사용 유무는 선택사항입니다.</strong> )</p>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/02687a37-b65c-4871-9b49-f6b17f87ee35/image.JPG" alt=""></p>
<p>설정이 진행되는 동안 우측 상단의 가격 책정표가 실시간으로 업데이트됩니다. 제 VM 인스턴스의 경우 시간당 약 $1.93가 부과된다고 합니다. 역시 GPU가 비용의 가장 큰 부분을 차지하고 있음을 알 수 있습니다. 9월 14일 01시 현재 환율로 따져보면 한화로 약 2,700원 가량이네요. 지난 시간에 무료 크레딧으로 약 400,000원의 한화를 지급받았으니 148시간 정도 사용할 수 있습니다.</p>
<p><strong>가격 책정표를 보며 사양을 요리조리 변경하면서 극한의 효율을 챙겨도 좋겠네요.</strong></p>
<p>예상 요금까지 확인하였으면 하단의 만들기를 눌러 인스턴스를 생성합니다. 인스턴스가 생성되는 데에는 약간의 시간이 소요됩니다. 빙글빙글 돌아가는 로딩 게이지를 보며 눈 운동을 해보겠습니다. 항상 고생하는 우리의 눈을 위해 잠시 휴식 시간을 주는 <strong>구글 신</strong>의 은혜입니다.</p>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/79866901-514e-402f-810d-e47f11f641b5/image.JPG" alt=""></p>
<p>우리의 첫 인스턴스가 생성되었습니다. </p>
<blockquote>
<p><strong>인스턴스가 동작하는 동안에는 요금이 부과됩니다.
작업이 마무리되었으면 인스턴스를 꼭 중지하여야 합니다. 그렇지 않으면 나도 모르는 사이 요금 폭탄을 맞습니다..! 기억하세요. 억울한 요금 부과는 없어야 합니다.</strong><br>
인스턴스 정지가 아니라 <strong>중지</strong>입니다. 정지는 작업 중이던 노트북을 잠시 닫는 것과 같습니다. 중지 후에는 인스턴스가 정말로 중지되었는지 확인해주세요.</p>
</blockquote>
<h1 id="방화벽-규칙-설정-선택-사항">방화벽 규칙 설정 (선택 사항)</h1>
<p><strong>해당 설정은 jupyter를 사용하고자 할 때만 진행하면 됩니다.</strong> 좌측 상단의 탐색 메뉴에서 VPC 네트워크의 방화벽에 들어가줍니다. 그러면 다수의 VPC 방화벽 규칙이 눈에 띕니다. 상단에 보이는 방화벽 규칙 만들기를 클릭합니다.</p>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/0cc53465-2603-49cc-bee6-561601661039/image.JPG" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/49bc2284-0607-4931-b1fc-1c73727f72fd/image.JPG" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/888218ed-a312-4731-8fe0-380a95f275f0/image.JPG" alt=""></p>
<p>위와 같이 입력합니다. 방화벽 규칙 설명은 작성하지 않아도 됩니다. 작성하였으면 하단에 위치한 만들기를 클릭합니다. </p>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/86c8c4bc-c758-4a91-afef-845ac4689727/image.JPG" alt=""></p>
<p>방화벽 규칙을 생성하고 다시 VPC 방화벽 규칙 리스트를 살펴 보면, 위와 같이 방화벽 규칙이 정상적으로 생성되었음을 알 수 있습니다.</p>
<h1 id="vm-인스턴스-생성-완료">VM 인스턴스 생성 완료!</h1>
<p>VM 인스턴스로 돌아가 해당 VM 인스턴스의 연결 메뉴를 누르면 여러 가지의 연결 방법이 나열되어 있습니다. 저는 SSH가 별도의 설치가 필요 없기에 브라우저에서 SSH로 연결하였습니다. </p>
<p>상단바를 살펴보면, 파일 업로드 및 다운로드 메뉴, 유저 피드백 및 단축키 사용, 설정 메뉴가 있습니다. 설정 메뉴에서 약간의 커스텀을 진행할 수가 있습니다. 선택지가 극히 적지만 기분이라도 내줍니다.</p>
<p><strong>커스텀? 개발자라면 이거 못 참습니다.</strong></p>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/6a3c72be-e76a-4452-83d1-4246a83df952/image.JPG" alt=""></p>
<h1 id="이제-진짜-개발을-진행해보자">이제 진짜 개발을 진행해보자!</h1>
<p>본 게시글에서는 VM 인스턴스를 생성하고 jupyter를 이용하기 위한 방화벽 규칙 설정까지 완료하였습니다. 이제 진짜 GPU를 이용한 개발을 진행해봅시다. </p>
<p>혼자 환경설정할 때에는 금방금방 진행했는데 스크린샷과 설명을 덧붙이니 다소 오랜 시간이 걸리는 듯한 느낌입니다. 최대한 간결하고 쉽게 쓰려고 노력하고 있습니다.</p>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/696c0307-2185-43e7-9f97-ded7eaf641d1/image.jpg" alt=""></p>
<p>다음 게시글에서는 GPU 설정과 PyTorch, TensorFlow와 같은 딥러닝에 필요한 각종 라이브러리 설치를 진행해보도록 하겠습니다.</p>
<p><strong>피드백은 항상 감사히 받습니다. 수정해야 할 내용이 있다면 댓글로 알려주세요!</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[개발 환경] GCP에서 GPU를 이용해 개발해보자! - 01]]></title>
            <link>https://velog.io/@hun_dev/%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD-GCP%EC%97%90%EC%84%9C-GPU%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4-%EA%B0%9C%EB%B0%9C%ED%95%B4%EB%B3%B4%EC%9E%90-01</link>
            <guid>https://velog.io/@hun_dev/%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD-GCP%EC%97%90%EC%84%9C-GPU%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4-%EA%B0%9C%EB%B0%9C%ED%95%B4%EB%B3%B4%EC%9E%90-01</guid>
            <pubDate>Fri, 09 Sep 2022 14:08:35 GMT</pubDate>
            <description><![CDATA[<p>연구실에서 기존 실험의 추가 실험을 진행하기 위해 GPU를 사용할 필요가 생겼습니다. 하지만 제가 가지고 있는 GPU는 <strong>NVIDIA GeForce GTX 1650 SUPER</strong>로, 딥러닝 모델을 설계하고 훈련시키기엔 성능이 턱없이 부족했습니다. 그렇다고 가격이 상당한 GPU를 구매하는 것은 부담이 따를 수 밖에 없었지요. </p>
<p>Google Colab에서 GPU를 사용했던 기억이 어렴풋이 나기 시작했습니다. 좀 찾아 보니 Google Colab에서 무료로 제공하는 GPU는 <strong>Nvidia Tesla T4 8GB</strong>였고 런타임 시간은 12시간이었기에 상당한 데이터의 양과 시간을 필요로 하는 실험을 진행하기엔 부족했습니다.</p>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/f4ea9877-8c04-43a4-a93a-ed17ed23cb65/image.webp" alt=""></p>
<p>어떻게 할까 밤낮을 고민하던 중, GCP에서 GPU를 사용하게끔 해준다는 것을 알게 되었습니다. 무려 <strong>NVIDIA K80, P100, P4, T4, V100, A100</strong>를 제공하고 있어 입맛별로 골라 사용할 수가 있었습니다! 콜럼버스가 신대륙을 발견했을 때, 아르키메데스가 유레카를 외쳤을 때 이런 기분이었을까요. 저는 <strong>구글 신</strong>의 은혜에 힘 입어 열심히 개발 환경을 구성하고 실험을 진행할 수 있었습니다.</p>
<p>이렇듯 딥러닝에 대한 관심이 늘어나면서 성능이 좋은 GPU의 중요성은 강조하면 할수록 입만 아플 뿐입니다. GPU가 없어 딥러닝을 공부하지 못하는 저와 같은 사람들을 위해 오늘도 <strong>구글 신</strong>은 은총을 내려주십니다. 함께 한단계 한단계 진행하며 구글 신의 은총을 받아보도록 하겠습니다.</p>
<p>아무리 구글 신이라고 해도 무료로 GPU를 대여해주지는 않습니다. 
가격 책정에 대한 정보는 <a href="https://cloud.google.com/compute/gpus-pricing?hl=ko">해당 링크</a>에서 알 수 있습니다.</p>
<p>무료가 아니라고 해서 절망할 필요가 없습니다.
Google Cloud Platform은 모든 고객에게 90일 동안 사용할 수 있는 $300 상당의 크레딧을 제공합니다. 우리는 이 크레딧으로 GPU를 대여하여 사용할 것입니다.</p>
<blockquote>
<p>$300 상당의 크레딧으로 얼마나 사용할 수 있는데 ?</p>
</blockquote>
<p>아주 좋은 질문입니다. Google Cloud Platform은 <a href="https://cloud.google.com/products/calculator/">요금 계산기</a>를 제공합니다. 
<img src="https://velog.velcdn.com/images/hun_dev/post/445abd23-c592-4c48-b716-911b89eb2a3f/image.JPG" alt="v100"></p>
<p>제가 사용하려는 견적은 이정도의 요금이 부과된다고 하네요. 헤비하지 않은 딥러닝 작업을 진행한다면 T4나 K80 정도만 사용하여도 괜찮습니다. 저는 V100의 성능을 필요로 하니 상당한 요금이 부과되는 것을 알 수 있습니다. 할당 신청 전에 한번씩 계산해보시는 걸 추천드립니다.</p>
<p>세번째 항목을 보면 Provisioning model은 Regular와 Spot(Preemptible VM) 두 가지의 선택지가 존재합니다. Spot은 Google Colab과 비슷하게 생각하시면 됩니다. 24시간의 최대 런타임이 존재하여 VM 사용 시간을 24시간으로 제한하고, 24시간 이내에도 활동이 감지되지 않으면 자동으로 사용을 종료합니다. Spot은 Regular에 비해 최대 91%까지 비용을 절약할 수 있다고 하니, VM을 장시간 켜둘 필요가 없는 경우에는 Spot을 선택하는 것이 비용적으로 유리할 것 같네요.</p>
<p>(참고) <a href="https://cloud.google.com/spot-vms?hl=ko">Google Cloud - Spot VM</a></p>
<h1 id="회원가입과-로그인">회원가입과 로그인</h1>
<p>우선 <a href="https://console.cloud.google.com/">Google Cloud Platform</a>에 접속해 회원가입과 로그인을 진행해야 합니다. 회원가입과 로그인을 마무리하면 다음과 같은 페이지가 우리를 맞아 줍니다.</p>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/7aeb5610-e757-4ab7-abec-ef9490e384a1/image.JPG" alt=""></p>
<p>어렵지 않습니다.
그냥 입력할 수 있는 정보만 입력하고 다음 단계로 계속 넘어가면 됩니다.</p>
<p>무료로 사용해 보기를 클릭하면, 계정 정보를 입력할 수 있는 페이지가 나타납니다. 국가와 조직 또는 니즈를 가장 잘 나타내는 설명을 선택하고 서비스 약관에 동의 후 <strong>계속</strong>을 눌러 다음 단계로 넘어갑니다. </p>
<p>다음은 결제 정보와 주소를 입력할 수 있는 페이지가 나타납니다.
계좌 유형을 개인으로, 이름 및 주소를 입력하여 주세요. 입력 후 계속을 누르면 고객 정보를 입력할 수 있는 페이지가 나타납니다. 이또한 귀찮지만 입력 후 본인 확인을 마무리해주세요.</p>
<p>본인 확인을 마무리하면 결제 수단을 입력할 수 있는 페이지가 나타납니다.
결제 수단 입력까지 완료하였으면 아래의 무료 평가판 시작하기를 눌러주세요.
결제 수단을 입력한다고 해서 즉시 결제를 요구한다거나 무료 크레딧이 모두 소진된 후 자동 결제를 요구하지 않으니 안심해도 된다는 문구가 눈에 띕니다.</p>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/e490deb5-804a-4562-a9cc-002d0d0f3be2/image.JPG" alt=""></p>
<p>무료 평가판 시작하기 버튼을 누르면 간단한 설문조사가 이어집니다. 적당히 진행하면 됩니다.
한국인이라면 튜토리얼은 건너뛰어주는 게 예의겠죠? 튜토리얼은 가볍게 건너뛰어줍니다.</p>
<p>좌측 상단의 Google Cloud를 클릭하면 GCP의 메인 페이지가 나타나고 상단에 다음과 같은 문구가 보입니다.</p>
<blockquote>
<p>무료 평가판 상태: 크레딧은 ₩405,113.00, 무료 평가판 기간은 91일 남았습니다. 완전한 계정을 사용하면 Google Cloud Platform의 모든 기능에 무제한 액세스할 수 있습니다.</p>
</blockquote>
<p>₩405,113.00의 크레딧을 제공받았습니다! 문구 우측을 보면 활성화 버튼과 닫기 버튼이 보입니다. 우리는 GPU를 사용하기 위해서 무료 계정을 유료 계정으로 활성화해야 합니다. 활성화 버튼을 눌러 유료 계정 활성화를 해줍니다. </p>
<p><strong>유료 계정으로 활성화하게 되면 무료 크레딧을 모두 사용했을 시에 자동으로 사용량만큼 요금이 부과됩니다.</strong></p>
<blockquote>
<p>그럼 결국 우리가 돈을 내고 사용하는 거잖아 ?</p>
</blockquote>
<p>아닙니다. 무료 크레딧은 그대로 존재합니다. 우리는 필요한 만큼의 GPU만 사용하고 중단하면 되기 때문에 아무 걱정하지 않으셔도 됩니다. 조금 번거롭기는 하지만 크레딧 사용 추이를 잘 파악하고 모니터링하여 무료 크레딧을 모두 사용하기 전에 서비스를 중단해야 합니다.</p>
<h1 id="크레딧-사용-추이-파악">크레딧 사용 추이 파악</h1>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/bb285f78-5bdb-4c4f-b1d9-e835fab75cf2/image.JPG" alt=""></p>
<p>좌측 상단의 탐색 메뉴를 눌러 살펴보면 결제 탭이 존재합니다. 결제 탭을 클릭하면 다음과 같은 페이지가 나타나게 되고 비용 추세를 그래프로 확인할 수 있으며, 우측 하단에서 남은 크레딧을 확인할 수 있습니다. 우리는 이 크레딧이 0이 되기 전에 서비스를 중단하면 됩니다.</p>
<blockquote>
<p><strong>이 페이지를 자주 확인하는 습관을 들이세요! 나도 모르게 결제되면 안되니까요.</strong></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/4790cdcf-b4b7-46bc-ab70-ead32dc8da63/image.JPG" alt=""></p>
<h1 id="할당량-신청">할당량 신청</h1>
<p>크레딧까지 제공받았으니 GPU를 할당받는 일만 남았습니다. 내 계정에서 GPU를 사용할 수 있도록 신청하는 과정을 거쳐야 합니다. 할당 신청을 하면 메일로 신청 결과를 통보해 줍니다. 결과 통보는 영업일에만 진행됩니다.</p>
<p>그 전에 해야 할 일이 하나 남아 있습니다. 탐색 메뉴의 Compute Engine에 VM 인스턴스라는 메뉴가 존재합니다. 클릭해줍니다. 우리는 GCP에서 제공하는 VM을 이용해 개발을 진행할 것이므로 Compute Engine API를 활성화해야 합니다. </p>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/28863410-c8da-402a-9d63-157a4a19651d/image.JPG" alt=""></p>
<p>VM 인스턴스 메뉴에 처음 접근하면 다음과 같은 페이지가 나타날텐데 사용 버튼을 클릭해줍니다. 잠시 기다리면 VM 인스턴스 메뉴가 활성화된 것을 알 수 있습니다.</p>
<p>다시 탐색 메뉴를 클릭해 IAM 및 관리자에 있는 할당량 메뉴에 접근합니다. 그리고 필터 검색란을 클릭하면 다양한 항목이 뜰텐데 측정항목을 찾아 클릭해줍니다. 클릭 후에 <strong>gpus</strong> 라고 입력하면 또 다양한 항목이 나타납니다. 아래로 내려가다보면 <strong>compute.googleapis.com/gpus_all_regions</strong> 항목이 존재합니다. 항목을 클릭하면 다음과 같은 화면이 나타납니다.</p>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/79e74c6d-9e71-41f6-bc06-8e4e8ce39239/image.JPG" alt=""></p>
<p>나타난 Compute Engine API 항목을 체크 후 우측 상단에 할당량 수정을 눌러줍니다. 그럼 다음과 같은 페이지가 나타납니다. </p>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/db1d0137-2602-4dfc-8c19-6df6c5a8fc1e/image.JPG" alt=""></p>
<p>저는 GPU를 하나만 사용할 것이기에 한도를 1로 설정하였습니다. 여러 개의 GPU가 필요하다면 2 이상의 한도를 입력하면 됩니다. 요금은 그만큼 더 부과되겠지요. 요청 설명란에는 적당히 여러분이 GPU로 무슨 작업을 할지 작성하면 됩니다. 저는 간단히 작성하겠습니다.</p>
<p>그리고 다음을 누르면 연락처 세부정보를 입력할 수 있고 연락처 세부정보 입력 후 요청 제출을 누르면 할당량 수정 제출이 완료되었다는 문구와 함께 입력한 이메일로 두 개의 메일이 전송됩니다. </p>
<p>두 개의 메일 내용은 비슷합니다. </p>
<blockquote>
<p>할당량 수정 제출이 완료되었으며 담당자가 확인하여 할당량을 증가시키는데 영업일 기준 2~3일이 소요되므로, 급히 사용해야 하는 경우나 요청 설명을 추가하고자 하면 본 메일에 회신해달라는 내용입니다.</p>
</blockquote>
<p>할당량 증가가 완료되면 다음과 같은 메일을 수신할 수 있습니다. 저는 9월 9일 금요일 22시 37분에 신청했는데 3분 밖에 지나지 않은 22시 40분에 할당량 증가 완료 메일이 도착했습니다. 다음주나 되어서야 받을 수 있을줄 알았는데 처리 속도가 엄청나네요. 만약 시간이 지나도 할당량 증가 완료 메일이 도착하지 않는다면 할당량 신청을 한번 더 진행해 주시면 됩니다.</p>
<p>할당량 증가가 완료되었으며 Cloud Console에 반영되기 까지 15분 정도 걸릴 수 있다고 합니다.
뒤이어 메일이 하나 더 올건데 그건 피드백을 요청하는 메일이니 자유롭게 피드백을 진행하시면 됩니다.</p>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/0e76b4fe-f592-4b64-b8cb-6f46b306a1b8/image.JPG" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hun_dev/post/27407e98-282d-4b01-86f7-0fa67a6cca44/image.JPG" alt=""></p>
<p>한도가 0에서 1로 증가한 것을 확인할 수 있습니다.</p>
<h1 id="gpu-사용-준비-끝">GPU 사용 준비 끝!</h1>
<p>여기까지 잘 따라오셨다면 GCP에서 GPU를 사용하여 개발하기까지 얼마 남지 않았습니다. 다음 게시글에서는 VM 인스턴스를 생성하고 딥러닝을 위한 환경을 구성해보도록 하겠습니다.</p>
<p>긴 글 읽어주셔서 감사합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[시작이 반이다]]></title>
            <link>https://velog.io/@hun_dev/%EC%8B%9C%EC%9E%91%EC%9D%B4-%EB%B0%98%EC%9D%B4%EB%8B%A4</link>
            <guid>https://velog.io/@hun_dev/%EC%8B%9C%EC%9E%91%EC%9D%B4-%EB%B0%98%EC%9D%B4%EB%8B%A4</guid>
            <pubDate>Thu, 08 Sep 2022 15:59:11 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>개발을 하다 보면 다양한 상황과 마주하게 됩니다.</p>
</blockquote>
<p>친절한 에러 메세지부터 난생 처음 보는 에러 메세지까지의 수많은 에러 메세지를 만나 <strong>구글 신</strong>의 도움을 받기도 하고, 분명 이론상 완벽한데 원하는 대로 동작하지 않아 애꿏은 머리카락을 쥐어뜯기도 하죠.
관심 분야의 정보를 습득하기 위해, 뛰어난 개발자가 되기 위해 우리는 오늘도 정보의 바다에 뛰어듭니다.</p>
<p align="center" style="color:gray">
  <img style="margin:50px 0 10px 0",  src="https://velog.velcdn.com/images/hun_dev/post/16dc06ce-eb1a-49a4-8014-b2e51afb8992/image.png" alt="" width=600 />
</p>

<hr>
<h1 id="기록의-중요성-📝">기록의 중요성 📝</h1>
<p>바보 같은 저는 학교 과제를 수행하면서, 프로젝트를 진행하면서 같은 에러 메세지를 여러 번 마주하게 되었습니다. 그럴 때마다 <strong>구글 신</strong>에게 찾아가 도움을 청하곤 했습니다. 코딩 테스트를 준비하기 위해 알고리즘 문제를 풀 때에 이미 푼 문제의 풀이를 쉽게 떠올리지 못하기도 합니다.</p>
<p>저는 바보 같았던 지난 날을 떠나 보내기 위해 <strong>보고 듣고 쓰는 것을 기록하자</strong>는 결론에 도달하게 됩니다. 그러나 무언가를 기록한다는 것은 상당히 귀찮은 일입니다. 이렇게 블로그를 생성하고 첫 게시글을 작성하는 데까지 보낸 다짐과 번복의 시간 동안 종이학을 접었으면 만 마리는 더 접었을 것 같네요.</p>
<hr>
<h1 id="velog를-선택한-이유-📌">velog를 선택한 이유 📌</h1>
<p>말 나온 김에 블로그 플랫폼으로 velog를 선택한 이유에 대해서도 이야기해볼까 합니다. </p>
<p><strong>(결정장애라는 말이 보편화되어 있지만 비하의 의미로 사용될 여지가 있어 결정바보라 표현합니다.)</strong></p>
<p>저는 심각한 결정바보입니다. 먹고 싶은 음식이 딱히 없어 배달 앱을 켜면 한식, 일식, 중식, 양식 등의 분류 중 하나를 선택하는 것이 가장 어렵고, RPG 게임을 하면 직업을 선택하는 것이 가장 어렵습니다. 
블로그 플랫폼을 선택할 때에도 역시 결정바보 기질은 여실히 드러났습니다. 해당 게시글을 작성하기 전까지도 고민한 것이 블로그 플랫폼입니다. </p>
<p>마지막까지 살아남은 블로그 플랫폼은 <strong>Tistory</strong>와 <strong>velog</strong>였습니다.
Tistory와 velog의 차이점은 다른 블로그에 세세히 정리되어 있어 따로 설명하지는 않겠습니다.
velog를 선택하게 된 가장 큰 이유는 마크다운 문법을 사용해 작성하기 편리하다는 점과 불필요한 광고가 없다는 점이었습니다. </p>
<p>Github Repository를 생성할 때마다 Readme 파일을 작성하는 걸 중요시 여기는 저에게 다소 익숙한 마크다운 문법은 velog를 더욱 매력 있게 만들기에 충분했습니다. 또한 각종 블로그에서 정보를 습득하면서 쉽게 볼 수 있는 불필요한 광고에 불만을 가져왔던 터라 불필요한 광고를 삽입하지 않는 velog는 필수 불가결한 존재가 아닐 수 없었습니다.</p>
<p align="center" style="color:gray">
  <img style="margin:50px 0 10px 0",  src="https://velog.velcdn.com/images/hun_dev/post/20ce226c-bbce-41af-8109-99a4e53ff181/image.png"
 alt="" width=300 />
</p>

<hr>
<h1 id="어떤-것을-기록할까요-❓">어떤 것을 기록할까요 ❓</h1>
<p>(<del>아무도 읽지 않았을</del>) 소개를 읽었다면 대충 유추할 수 있겠지만 저는 <strong>NLP</strong>에 관심을 가지고 있으며, 특히 NLP Task 중 <strong>Text Classification</strong>와 <strong>Machine Translation</strong>를 공부하고 있습니다.</p>
<p>따라서 <strong>NLP</strong>를 주제로 한 게시글과 <strong>ML / DL</strong>를 주제로 한 게시글, 온라인 저지 사이트의 알고리즘 문제 풀이, 개발 환경 구성 및 다양한 오류 해결 등을 다루는 게시글을 기록할 예정입니다.</p>
<p>추가로 저를 책 읽는 NLP 개발자라고 소개한 이유이기도 합니다. 버킷 리스트 중 하나인 <strong>한 주 한 권 책 읽기</strong>를 달성하고 이를 기록으로 남기고자 매주 하나의 독후감이 기록될 예정입니다. 매주 하나가 될지 둘이 될지는 아무도 모르나, 하나 이상은 기록하려고 합니다.</p>
<h4>게시글 피드백과 책 추천은 언제나 환영합니다!</h4>

<hr>
<h1 id="마무리하며-✔️">마무리하며 ✔️</h1>
<p>글을 재미있게 작성하는 솜씨가 부족합니다. (<del>이런 솜씨는 어디서 키우는걸까요</del>)
따라서 올바른 정보 공유를 위한 노력에 힘을 기울이고자 합니다.</p>
<p>게시글에 올바르지 않은 정보가 있으면 알려주세요! 
여러분의 피드백은 제가 성장하는 데에 뛰어난 자양분이 됩니다!</p>
<pre><code class="language-python">def start():
    print(&quot;좋아하는 것이 잘하는 것이 될 때까지&quot;)</code></pre>
]]></description>
        </item>
    </channel>
</rss>