<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>bengal_j.log</title>
        <link>https://velog.io/</link>
        <description>Overdose</description>
        <lastBuildDate>Sun, 16 Mar 2025 08:57:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>bengal_j.log</title>
            <url>https://velog.velcdn.com/images/bengal_j/profile/e7c297fa-e355-44ae-90de-e173f5507e3a/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. bengal_j.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/bengal_j" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[WSL 서버 구축기 (쌀먹) - 1]]></title>
            <link>https://velog.io/@bengal_j/WSL-%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%B6%95%EA%B8%B0-%EC%8C%80%EB%A8%B9-1</link>
            <guid>https://velog.io/@bengal_j/WSL-%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%B6%95%EA%B8%B0-%EC%8C%80%EB%A8%B9-1</guid>
            <pubDate>Sun, 16 Mar 2025 08:57:00 GMT</pubDate>
            <description><![CDATA[<p>비싼 돈을 주고 컴퓨터를 구입했는데,, 쌀도 캐야되고 개발도 하고싶다면 어떻게 해야 할까?
밖에서는 노트북으로만 코딩하고 집에 와서 돌려볼 것인가?</p>
<p>2마리의 토끼를 잡고 싶은 당신에게 내가 했던 WSL로 만드는 딥러닝, LLM 개발 서버 구축 방법과
그의 기본이 되는 여러가지 잡지식을 소개한다.</p>
<p>구축하는 방법만 볼 거면 다른 글을 보는게 훨씬 컴팩트 할 것이라 믿는다.
다만 이 글을 읽으면 다음에 비슷한걸 해야 될 때, 뭘 해야하는지 감을 잡을 수 있게 될 것이다.</p>
<p>우선 중요한 개념부터 짚고 넘어가보자.</p>
<h3 id="wsl이란-무엇일까">WSL이란 무엇일까?</h3>
<hr>
<p>식당으로 비유하자면, 숍인숍. 점포 안에 점포가 있는 형태이다.
이해가 쏚쏚되는가?</p>
<p><img src="https://velog.velcdn.com/images/bengal_j/post/9c9ae1fa-16bf-4002-9d4c-60cd8f71cc2e/image.png" alt=""></p>
<p>AI를 하고싶어서 이 글을 읽는 사람의 대부분은 네트워크나 인프라에 별 관심이 없을태니
알기쉽게 말하자면, 당신의 컴퓨터 안에 저장장치를 공유하는 리눅스 컴퓨터가 하나 있는거라고 생각하면 된다.</p>
<p>나는 윈도우에서 개발하고 싶은데, 학교과제는 무리없었는데 WSL 굳이 깔아야 하나요? </p>
<blockquote>
<p>넹</p>
</blockquote>
<p>일단 코딩을 더 하면 할수록 많은 프로그램들이 리눅스에서 설치가 더 편해진다. 미리 익숙해지는게 낫다.
특히 AI쪽 리서치를 한다면 </p>
<ul>
<li>윈도우 GUI 환경에서 Notebook을 써서 개발, 비전 프로그램 돌리고 논문 보기</li>
<li>GPU 빠빵한 Linux 환경에 배포해서 테스트, 튜닝</li>
</ul>
<p>저러한 생태가 나중에 취업을 하든~ 랩을 가든~ 일반적일 것이다.
그러니 지금부터 리눅스와 친구가 되도록 하고, WSL 설치 가이드는 다른분들이 써준 좋은 글 많으니 한번 보고 오시라.</p>
<p>충분히 최신컴과 윈도우를 쓰고 있다면(Win11 &gt;), 걍 BIOS에서 가상화 키고 스토어 들어가서 우분투 다운받으면 된다.
뭐라는지 모르겠다면 GPT한테 물어봐라. 난 강하게 키운다.</p>
<h3 id="우리가-해야-할-것">우리가 해야 할 것</h3>
<hr>
<p>일단 당신이 리눅스 서버를 써본적이 있을지 없을지 모르겠으나, 컴퓨터를 서버로 만들어본적은 없을 것이다.
보통은 없을거라고 생각한다. 우리학교 졸업한 애들 중에도 안해보고 졸업한애 많을껄?
그럼 일단 해야 할 것을 정리해보자</p>
<blockquote>
<p>네트워크에 대한 기본은 알아두면 나중에도 도움이 될 태니, 잘 기억해 놓도록 하자</p>
</blockquote>
<p>참고로 지금 공유기를 쓴다고 상정하고 글을 작성하고 있다. 공유기가 없다면 눈치껏 공유기를 사용하는 부분을 제거하자</p>
<ol>
<li>외부에서 컴퓨터 검색되게 만들기</li>
<li>공유기가 외부 접근시도를 입뺀 안시키도록 변경</li>
<li>컴퓨터가 외부 접근시도를 입뺀 안시키도록 변경</li>
<li>컴퓨터(윈도우)가 특정 트래픽을 WSL로 보내도록 변경</li>
<li>WSL에 SSH 서버 설치</li>
<li>(Additional) 파일 보안을 위해 환경을 Docker로 분리</li>
<li>(Additional) ssh 접근을 ID/Password가 아닌 key file로 수행</li>
</ol>
<h3 id="외부에서-컴퓨터-검색되게-만들기">외부에서 컴퓨터 검색되게 만들기</h3>
<hr>
<p>외부 네트워크에서 어떻게 서버를 검색할 수 있을까? 라는 고민은
브라우저에 네이버(<a href="https://naver.com)%EB%A5%BC">https://naver.com)를</a> 칠 때를 생각해 보면 된다.</p>
<p>그 행동이 외부 네트워크에서 네이버의 서버로 접근하는 행동이니까.</p>
<p>근데 ip주소라고 어디서 들어봤는데.. 그걸 알아야 컴퓨터에 접속을 하거나 통신 할 수 있는거 아니었나?</p>
<blockquote>
<p>맞다.</p>
</blockquote>
<p>근데 <strong><a href="http://www.naver.com">www.naver.com</a></strong>라고 쳤을 때, 어떻게 우리 브라우저는 네이버 서버로 연결을 해주는 걸까?
<strong>DNS (Domain Name Server)</strong> 덕분이다.</p>
<p><img src="https://velog.velcdn.com/images/bengal_j/post/60885f0f-d58c-4f37-8eb2-08506af4707c/image.png" alt=""></p>
<p>누군가(네이버, 구글, 아마존 등등)가 DNS라는 서버를 전 세계에 구축해놨다.
당신이 자연어로 된 URL(사실 URI)을 브라우저에 입력하면, 브라우저는 DNS 서버로 해당 주소를 보낸다.</p>
<p>DNS 서버는 짱 큰 KEY-Value Dictionary라고 생각하면 된다.
Key에 URL 주소가 들어가고, Value에 IP Address가 들어간다.
그래서 자기가 해당 데이터를 들고 있으면 IP 주소를 반환하고, 없으면 좀 더 큰 DNS한테 요청을 보내서 가져온다.</p>
<blockquote>
<p>DNS는 (naver.com -&gt; 123.123.123.123)을 해주는 딕셔너리다!</p>
</blockquote>
<p>이 설명을 왜 하느냐 하면</p>
<ol>
<li>결국 우리는 ssh 접속이든 뭘 하려고 하면 집 컴퓨터의 ip주소를 알아야 하고</li>
<li>ipTime 공유기를 사용하면 회사에서 DNS를 무료로 제공하고 있기 때문이다.</li>
</ol>
<p>DNS 서비스는 보통 유료이기 때문에 ipTime 공유기를 사용한다면 돈이 굳는거나 다름없다!
와이파이나 케이블로 연결된 상태에서 ipTime 공유기 콘솔 (192.168.0.1)로 접속해서 로그인하면 </p>
<p><img src="https://velog.velcdn.com/images/bengal_j/post/3c6f453a-210e-48b2-b7a1-35fdce8b5a55/image.png" alt="">
이런 창이 뜬다. 한번도 설정한 적 없다면 기본값인 (admin/admin)으로 접속할 수 있을 것이다.</p>
<blockquote>
<p>기본값 그대로 사용하고 있다면 빨리 비밀번호를 바꾸는걸 추천</p>
</blockquote>
<p>여기서 관리도구 -&gt; 특수 기능 -&gt; DDNS 설정으로 가서 시키는걸 다 하면</p>
<p><img src="https://velog.velcdn.com/images/bengal_j/post/616c2cfa-3740-478d-b7d3-0d17cf157880/image.png" alt=""></p>
<p>이렇게 될 것이다. 이제 저 <code>호스트 이름</code> 이라는 주소를 브라우저에 입력하거나 터미널에서 접근하면
해당 프로그램이 ipTime DNS에 요청을 보내서 당신의 ip주소를 받아온다.</p>
<blockquote>
<p>외부 네트워크에서 당신의 집 ip로 요청을 보낼 수 있게 되었다!</p>
</blockquote>
<h3 id="불만이-많은-친구들의-생각">불만이 많은 친구들의 생각</h3>
<hr>
<blockquote>
<p>1) 엥 그냥 집 컴퓨터 ip 주소 기억해놨다가 접속하면 되는거 아니에요? 왜 이런거 해야됨?
2) 전 공유기 없는데 걍 컴퓨터 ip 주소 쓰면 안되나요?</p>
</blockquote>
<p>그러면 참 편할 탠데, 집 컴퓨터 ip 주소는 어느 주기를 두고 바뀐다.
ip 주소라는게 옛날엔 12자리 숫자면 넉넉하지~ 라고 생각하고 만들었는데 
현대로 오면서 너무 컴퓨터나 스마트폰이 많아지다 보니 이제는 넉넉하지 않게 되어버렸다.
그러다보니 국내의 통신사들은 이 &quot;자원&quot;을 효율적으로 관리해야 될 필요성이 생겼고
그에 따라 만들어진 것이 유동 ip이다. 지금 당신 컴퓨터가 ip 안쓰고 있으면 뺏어가서 다른 필요한 애한테 주는 것이다.</p>
<p><img src="https://velog.velcdn.com/images/bengal_j/post/012025c0-38a3-40fd-a769-55c8abfcfe29/image.png" alt=""></p>
<p>예시 이미지를 보면 알겠지만, 보통은 고정 ip가 좀 더 비싸고, 기업용 인터넷 망이 아니라 일반 소비자용 망은
따로 가입한게 아니라면 99.9% 유동 ip를 쓰고 있을 것이다.
근데 좀 호들갑인것도 있는게 그렇게 자주 바뀌지는 않는다. 안바뀔땐 반년동안 안바뀌기도 하니
그래도 개발 하다보면 내가 일하는 중에 ip가 바뀐다던지.. 잠시 연결 끊었는데 바뀌어있다던지 같은 일들을 경험하게 된다.
그래서 왠만하면 어렵지도 않으니 하는 걸 추천하는거고</p>
<p>본인 공유기가 ipTime이 아닌 경우에는 그냥 ip 외워서 쓰는걸 추천한다. 그거 해결법 알아서 할 정도면 이거 보지도 않을듯</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[간만에 쓰는 글..]]></title>
            <link>https://velog.io/@bengal_j/%EA%B0%84%EB%A7%8C%EC%97%90-%EC%93%B0%EB%8A%94-%EA%B8%80</link>
            <guid>https://velog.io/@bengal_j/%EA%B0%84%EB%A7%8C%EC%97%90-%EC%93%B0%EB%8A%94-%EA%B8%80</guid>
            <pubDate>Sun, 16 Mar 2025 07:18:31 GMT</pubDate>
            <description><![CDATA[<p>토플은 결국 멸망해버렸고,, (최종성적 Speaking 21)</p>
<p>경력 인정안되는 것도 마음에 안드는데 그냥 스타트업 가려다가 방향을 틀어서 원래 가려는 회사에 갔다.
뭐 열심히 하면 잘 인정받을 수 있을 거라고 믿었고 실제로 맞긴 한 듯 하다. 내가 기대한 만큼은 아니지만.</p>
<p>요즘은 AI를 활용해서 여러가지 서비스도 만들고~ 사내에서 쓸 프로그램도 만들고~ 고객사용 프로그램도 만들고~ 하고 있다.
그러면서 세상이 참 빠르게 바뀌어가고 있다고 느끼는게, 개발이라는 게 너무 쉬워지고 있는 것 같다.</p>
<p>Vibe coding이라고 하나 요즘?
별 생각 안하고 자연어 질의만 치고 AI에게 코딩을 맡기는 그런 걸 말하는 것 같다.
2023년에 이 블로그에 글을 올릴때만 해도, 얘네 수준이 그렇게 높지가 않았다.
23년에 교내 위탁교육으로 은행 직원들이 반년동안 서비스를 한번 만들어보는 사업이 있었는데 내가 거기 조교였다.
그때까지만 해도 GPT-3.5? GPT-3으로 학생들이 코딩을 해서 가져오면 영 못쓸 수준이라 내가 고쳐주고 어디 보라고 알려주고 그랬는데..</p>
<p>며칠전에 프론트 페이지를 만들 일이 있어 잘 되려나~ 하는 마음으로 Vibe Coding을 한번 해봤다.
Bolt.new라는 서비스로 와꾸를 잡고, Cursor를 사용해서 코드를 충실하게 채우는 형태로 진행했는데
반나절만에 도커형태로 잘 말아지는 프론트 페이지 하나가 나오더라.
무료쿼타 제한에 걸려서 그렇지 계속 했으면 하루에 페이지 서너개는 만들었을 것 같다.</p>
<p>내년엔 더 똑똑해지고 내후년엔 더 똑똑해지겠지?
어찌보면 내가 순수개발 직군에서 경쟁하길 포기하고 떠난게 잘한 일 같기도 하다.
개발 좋아하는 애들 너무많은데 그 중에서도 AI에게 밀리지 않을 소수만 살아남을 걸 생각하면 ㅋㅋ...</p>
<p>아마 27년쯤 졸업하는 친구들은 설카포여도 1인기업을 차려야 하는 시대가 오지 않을까?
시대적 압력이 그렇게 사람들을 몰아버리지 않을까? 라는 느낌이 있다.
서버도 딸깍~ 프론트도 딸깍~ 배포도 딸깍~ 디자인도 딸깍~ 하면 서비스가 되는데
취업문도 좁아져 있을 것으로 예상되는 시기에 아이디어 넘치는 졸업생들이 굳이 취업을 택하지 않을 것 같다.</p>
<p>뭐가 됐든 당신이 컴퓨터를 전공했다면 지금부터 열심히 달러를 벌만한 프로덕트를 생각해보자.. 나도 맨날 하고있어..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TOEFL 여정의 끝 (86 -> 102 -> ?)]]></title>
            <link>https://velog.io/@bengal_j/TOEFL-%EC%97%AC%EC%A0%95%EC%9D%98-%EB%81%9D</link>
            <guid>https://velog.io/@bengal_j/TOEFL-%EC%97%AC%EC%A0%95%EC%9D%98-%EB%81%9D</guid>
            <pubDate>Sat, 18 Nov 2023 08:25:52 GMT</pubDate>
            <description><![CDATA[<h2 id="왜-나는-토플을-공부해야-했는가">왜 나는 토플을 공부해야 했는가</h2>
<p>4달간의 토플 공부가 끝났다.
뜬금없이 왜 토플을 공부하냐하면.. 한마디로 배를 쨋기 때문이다.</p>
<p>우리학교의 경우 입학시 영어 시험을 보고 성적에 따라 1~4학년 사이에 들어야하는 영어과목의 수가 정해진다.
제일 못하는 경우는 입학전 영어강의 수강 + 6개,
제일 잘하는 경우는 수업 올 패스.</p>
<p>나는 6개였다. (겨우 캠프만 안간 수준)</p>
<p>1학년때는 90% 이상 완성된 시간표를 학교에서 짜주기때문에 영어과목 2개를 들었는데
2개를 듣고 나니 이런 멍청한 생각이 들었다.
어차피 영어공부 취업 + 졸업하려면 해야 하는데, 강의 안듣고 시험으로 쨰는게 나은거 아니야?
(토플 / 아이엘츠의 경우 재학기간중 과목당 22점을 넘는다면, 해당 과목에 해당하는 강의를 면제해주는 제도가 있었다.)</p>
<p>그 생각만 하면서
1학년 여름학기 : 대외활동,
1학년 겨울학기 : 집에서 놀면서 과외,
2학년 여름학기 : 회사 인턴쉽,
2학년 겨울학기 : 면허 취득 + 유럽여행,
3학년 여름학기 : 회사 인턴쉽,
3학년 겨울학기 : 연구실 인턴쉽,</p>
<p>이 사이 3년간 서울에서 회사생활로 병역 수행 (하면서도 코로나 핑계대면서 현강안된다고 영어공부안함)</p>
<p>군대떄문에 꼬인 4학년 겨울학기에는 연구실 인턴쉽,
4학년 여름학기(졸업직전 계절학기) 되서야 토플준비!</p>
<p>ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ</p>
<p>학기중에는 대부분 바쁘거나... (2~3학년 사이엔 창업, 3학년 2학기는 죽음의학기, 4학년도 창업팀)
가지가지 핑계를 대면서 안했고. 결국 미루고 미뤄서 보니 이번학기에 토플못따면 졸업이 밀리네?
하면서 죽음의 토플런을 시작했다.</p>
<p>개인적으로 하면서 후회한 점은 스피킹이라도 여름학기에 수강을 했어야 하는데,
제대로 공부한적이 없으니 난이도를 가늠을 못해서 내 실력도 구린 주제에 어캐든 되겠지~ 라는 마음이었던거다.
스피킹을 제외하면 공부하는대로 성적이 나와주긴 했다.
한국인 특징) 쓰는 공부는 잘따라감</p>
<h2 id="숨막히는-토플-공부">숨막히는 토플 공부</h2>
<p>우선 타임라인을 간단히 되짚어보자</p>
<ul>
<li>6월(방학시작) : 신나서 놀았음 (생각없음) ~ </li>
<li>7월 중순 : 위기감을 느껴서 공부 시작.</li>
<li>7월 말 : TOEFL Hackers Intermediate 교재를 하루에 리딩/리스닝 1~2세트씩 품, 단어도 외움</li>
<li>8월 초 : Speaking / Writing 공부를 혼자 해보려니 어떻게 하는지도 모르겠어서 학원을 감</li>
<li>8월 중순 : 학원에서 알려주는 것들은 큰 의미가 없구나,, 라는 오만한 생각과 함께 다시 문제풀이 위주로 변경.</li>
<li>9월 초 : Testglider 결제 + TOEFL Actual test Reading 구매. Reading 말고는 그냥 문제풀면 되겠지 라는 오만한 생각</li>
<li>9월 중순 : 하루에 Testglider 1세트 + 액테 리딩 1챕터 정도 품</li>
<li>9월 말 : Actual Test 기준 리딩은 26<del>28 사이였고, Test glider 기준 27 / 27 / 20</del>23 / 25 정도라 첫 시험 준비</li>
<li>10월 초 : 첫 시험 완료, 이떄까지는 스피킹 정도 제외하면 한번에 통과될거라고 생각했음. Speaking은 남은 1달간 공부하면 되지않을까? 라는 생각</li>
<li>10월 중순 : 놀다가 성적표 받아보니 23 / 21 / 21 / 21이라는 미친 라인업, 리딩밖에 패스못해서 멘붕. 잘못하다 졸업을 조지겠구나 생각한 뒤로 학원에 첨삭위주로 강의 요청 + 액테 나머지 3개 분야 구매, 하루에 리스닝 1, 나머지 - 2개씩 풀어서 첨삭받기</li>
<li>10월 말 : 첨삭강의 2주 수강 + TOEFL Actual Test로 자신감이 좀 올라있었고 2번쨰 시험 개시</li>
<li>11월 초 : 28 / 28 / 20 / 26, 총점 102점이라는 점수로 사실 이공계생으로서 만족스러운 점수였다. 일부 대학교를 제외하고는 이공계 기준 박사유학을 가도 쓸 수 있을 정도의 점수. 스피킹 점수가 내 앞길을 가로막는것만 제외하면 말이다.</li>
<li>11월 중순 : 스피킹만 2주 학원에 다니면서 공부 (피드백 듣고 고치고 문장생각하고...) + 비싼 원장급의 과외 (1시간 16만원) + 소화장애 + 수면장애 +++++ 등등을 뒤로하고 오늘 3번째 시험이 끝났다.</li>
</ul>
<p>그렇다. 사실 아직 나도 3번째 시험의 결과를 모른다!
여기서 스피킹이 22점 미만이 나온다면, 나는 5학년 2학기를 0학점인채로 하게되는 것이다.
이 경우 졸업 요건은 만족하나 행정상 졸업이 안되어 등록금도 30만원 내야한다!
미리 합격한 회사에서도 입사취소 시킬수도 있어서 걱정했는데 떨어져도 입사취소는 안시켜준다고 한다.
대신 첫 승진이 조금 밀릴 수 있다고...</p>
<h3 id="해당-기간동안-완주한-총-공부의-양">해당 기간동안 완주한 총 공부의 양</h3>
<ol>
<li>Reading : 테글 12개 / 인터 10개 / 액테 9개 / ETS 교재 3회 -&gt; 34회분</li>
<li>Listening : 테글 12개 / 인터 12개 / 액테 6개 / ETS 교재 1회-&gt; 31회분</li>
<li>Speaking : 테글 12개 / 액테 11개 / 모의고사 3개 / ETS 교재 2개 -&gt; 28회분</li>
<li>Writing : 테글 12개 / 액테 10개 -&gt; 22회분</li>
<li>Voca : 해커스 초록책 한 12챕터 보고 리딩을 보니 어차피 모르는단어 나올거같아서 그냥 배쩃음.</li>
</ol>
<p>솔직히 학교 공부에도 안오는 수면장애가 간만에 와서 멘탈이 얼얼했다.
수면장애의 주된 원인은 스피킹 공부는 도대체 어캐하는거임? 이 가장 컸다. 솔직히 어떻게 해야 오르는거지? 아직도 잘 모르겠다.
쉐도잉 문장외우기 템플릿 아이디어 브레인스토밍 안해본게 없었다.</p>
<p>하지만 과외 + 학원에 졸라서 들은 개인교습에서 발견한 내 스피킹의 문제는</p>
<p>1) 문법이 지맘대로임.
2) 완성된 문장으로 말을 잘 못함.
3) 영어억양 못씀 이거 3개가 가장 큰 문제였다.</p>
<p>1)은 솔직히 내가 학교에서 외국인이나 등등과 말할일이 있으면 대충 말해도 잘알아듣더라.. 나도 따로 연습한적도 없고
나쁜 버릇이 안고쳐지고 입에 붙어있는 상태였다.
2)는 아니 한글로도 즉답이 잘 안되는 사람으로 타고났는데 15초 생각해서 45초 말하는게 쉬운게 아니다.. 한글로도 어렵다고 그거.. IELTS 공부나 할껄 하면서 많은 생각을 했다. 아이엘츠도 꽤나 괜찮더라..
3)은.. 토종 한국인이 영어 발음 교정해줄 사람도 곁에 많지 않았고 나도 솔직히 내가 나쁜줄 몰랐다.. 영어로 말할일은 자주 없잖아? 듣거나 읽을 일이 많지</p>
<p>그래서 이번 시험은 최대한 저 3개를 고치고 가봤다.
문법 망가지는건 Writing에서도 동일하게 있던 문제였는데 내가 또 생각할 시간이 있으면 문장은 잘 뽑아낸다.
해당 문제점 발견하자마자 공부도 별로없이 5점 올렸잖아? 한잔해~
자찬은 뒤로하고... 그래서 어떻게 될지 이제 나도 모른다!</p>
<p>이제 주사위는 던져졌다. 운명에 맡길 뿐</p>
<p>아 근데 오늘 옆자리 사람 휴대폰 제출해놓았는데 안끄고 토플 치다가 벨울려서 중도퇴실당했다.
나는 라이팅 치고있는데 벨이 울리길래 뭔 토플 고사장에 벨이울려 감독관들 정신 안차리나 했는데
수험자 휴대폰일줄은 몰랐지...
30만원이 싼 가격도 아니고 토플은 보통 목적이 있어서 치는 경우가 많은데..
괜히 나도 뭐가 많이 걸려있고 고생한걸 알다보니 옆자리에 앉았다고 마음이 안좋다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[근황]]></title>
            <link>https://velog.io/@bengal_j/%EA%B7%BC%ED%99%A9</link>
            <guid>https://velog.io/@bengal_j/%EA%B7%BC%ED%99%A9</guid>
            <pubDate>Thu, 02 Nov 2023 15:28:19 GMT</pubDate>
            <description><![CDATA[<p>빅4 컨설팅펌 합격하고 MBB중 한군데 면접을 앞둔 상태...</p>
<p>붙은 후에 사실 내년 2월에 가도되냐고 하고
영어 재껴버리면 진짜 눈물나는 선택지일거 같은데
일단은 토플을 어쩔수없이 해야한다... 어쩌겠냐 내 잘못이지 머</p>
<p>사실 컨설팅 합격까지 하고 면접까지 보면서도 하고싶은게 많다
걍 적당한 워크로드 개발자 본업으로 하면서
부업으로 사업을 해보고 싶기도 하고..</p>
<p>내 머릿속에 있는 게임이나 데브옵스 사업아이디어나 돈벌이 수단같은걸
컨설턴트랑 부업 병행은 절대 불가능하니까.. 더 이상 학생처럼 도전해볼 수 있는 기회가 없다는 사실이 조금 슬퍼진다.</p>
<hr>
<p>내가 고등학교 입시를 치루며 생각하던 목표가
해외에서 일자리 잡아보는 거였고 그거 때문에 의대 재끼고 공대로 온건데
첫 직장을 컨설팅으로 하는게 Good option은 맞는데 Best option인지?
컨설턴트 5년을 얹어서 개발3 + 컨설팅5로 해외로 나가는 것 보다 개발자로 8년을 찍는게 나가기는 더 쉬운게 아닐지? 라는 의문이 계속 생긴다.</p>
<p>사실 뭐든 모르는거긴 하고 맡은 자리에서 최선을 다한다면 어느 쪽이든 길이 안열리겠냐만은...</p>
<p>사실 컨설팅 회사에는 미안하지만 2군데 더 원서를 넣었다.
구글이랑 AWS ㅋㅋㅋㅋ
레주메 이번에 기깔나게 뽑혔으니 이용을 좀 해야지
그정도 급이 되야 컨설팅 붙었지만 스미마셍~ 도 할 수 있는거고</p>
<hr>
<p>쉽살재빙이라는 말도 있고 내가 좋아하는 말이긴 하지만 그래도 쉽게 살아가고 싶다..
내가 문제를 복잡하게 풀던 사람이 아니었는데 왜 이렇게 된건지ㅋㅋㅋ
약간 뒤쳐진다는 느낌을 처음으로 받는 것 같다.
대학에서 벗어나고 회사에서도 벗어나서 사회를 보게 되니
순간순간에 뒤쳐지지 않으려 노력하는 사람들의 모습들이 더 잘 보이고
결국엔 나도 돈을 벌려고? 일하는 건가 싶을때 현타가 좀 오기도 하고 ㅋㅋㅋㅋ</p>
<hr>
<p>지금 마음속에 있는 작은 불씨가 그냥 해외 재껴버려??? 인데 ㅋㅋㅋㅋ 하...
만족스럽지 않은 연봉 제시하면 진짜 재낄까?
좀 놀면서 봄 입사 준비해봐?? 라고 허세부리는 상태
참 별거아닌 돈인데 돈이 별거다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[C++ 일기 - 3]]></title>
            <link>https://velog.io/@bengal_j/C-%EC%9D%BC%EA%B8%B0-3</link>
            <guid>https://velog.io/@bengal_j/C-%EC%9D%BC%EA%B8%B0-3</guid>
            <pubDate>Tue, 21 Mar 2023 12:51:29 GMT</pubDate>
            <description><![CDATA[<p>지난주와 지지난주 합쳐 3 문제를 풀어볼 수 있었다.</p>
<p>배열과 window의 크기가 주어졌을 때 window 내부의 최솟값을 모든 circular 배열에 대해서 구하는 문제
2차원 좌표상에서 2*2로 사각형 구간들이 주어졌을 때 사각형이 겹칠 수 있다는 가정에서 모든 사각형의 넓이의 합을 구하는 문제
연속된 size 2 배열을 주고 조건에 맞게 최대값과 최솟값을 구하는 문제 등..</p>
<p>3가지의 문제를 풀어보았고
1주차에는 2개는 답은 맞췄지만 Time Complexity를 해결하지 못하였고 1개는 풀지 못했다.
2주차에는 Time Complexity 관련 설명을 들은 후에 문제를 해결할 수 있었다.</p>
<p>최대값과 최소값 문제 같은 경우에는 최대값과 최소값을 구하는 Sort를 실행하는 것이 문제가 된다.
n번의 시도에 대해서 k번의 (k &lt;= n) sorting이 발생하는 것도 전체적으로 속도를 크게 저하시킬 수 있는 요인이다. (sorting은 보통 <code>O(nlogn)</code>)
때문에 Sort를 하지 않고 저장소에 대한 Update를 짧은 시간내에 한다는 발상이 필요하다.</p>
<p>우리가 n번 update를 한다고 했을 때, Segment tree나 RBT, min_max heap을 사용하면 <code>O(logn), O(1)</code> 시간안에 관련된 최대값, 최소값을 구할 수 있는 함수가 존재한다.
c++의 set이 RBT로 구현되어 있다는 것을 확인하고 문제의 조건에 맞게 multiset을 활용하여 데이터를 관리하였고, rbegin, begin으로 최대 최소를 제거할 수 있었다.</p>
<p>Window 문제 같은 경우에는 window를 매번 계산하지 말고 update를 하는 방법으로 시간을 단축시켜야 했다. 그렇기 때문에 window의 자료를 담아둘 데이터 구조가 필요했고, 강의에서는 이를 Deque 또는 Segment Tree 형태로 자료를 저장하면 window의 입출력이 있을 때의 최소값을 찾는 행위의 시간 복잡도를 보장할 수 있다고 하였다.</p>
<p>사실 더 쉬운 구현을 위해 Deque의 형태로 구현을 하였으며, 3개의 문제 중에서는 자료구조가 직관적이고 룰베이스로 해결할 수 있었기 때문에 가장 빠른 시간안에 해결할 수 있었다.</p>
<p>사각형의 넓이를 구하는 문제는 한쪽 축을 level 축으로 정해서 <code>[0, 10]</code>과 같은 경우 level 0 ~ level 9를 모두 포함하는 구간으로 정한다.
반대쪽 측은 interval 축으로 정해서 2-D array에 interval을 계속 저장을 한다.</p>
<p>문제를 간단하게 만들어서 생각하면 결국 level 6에 <code>[3,5]</code> 구간이 존재한다면 실제로는 <code>[[6, 7], [3, 5]]</code>가 존재하는 것과 같다. 모든 사각형을 위와 같이 분해하여 map에 담아두기만 하면 해당 문제는 결국 interval의 중복을 허용하며 중첩시키는 문제와 같다. 이를 모든 level에 대해서 수행하는 것 뿐이다.</p>
<p>다만 해당 방식으로 해결한다고 했을 때, level에 해당하는 축의 길이에 해당하는 for-loop를 돌아야 함으로 굉장히 오래 걸릴 것으로 예상되며 각각의 루프가 내부에 저장한 interval의 길이 만큼의 루프를 다시 돌아야 한다.</p>
<p>시간 복잡도가 <code>O(n^2)</code>일 것 같은데.. 더 줄일 수 있는 방법을 생각해 봐야 할 것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[C++ 일기 - 2]]></title>
            <link>https://velog.io/@bengal_j/C-%EC%9D%BC%EA%B8%B0-2</link>
            <guid>https://velog.io/@bengal_j/C-%EC%9D%BC%EA%B8%B0-2</guid>
            <pubDate>Tue, 07 Mar 2023 03:46:59 GMT</pubDate>
            <description><![CDATA[<h1 id="a--b">A * B</h1>
<hr>
<p>저번에 짯던 프로그램이 느리다... 통과를 못하는 중이다.
값 자체는 잘 나오는데 문제점이 무엇일까.</p>
<p>지금 생각한 문제점 : <code>수를 한번에 하나씩 접근하면서 저장한다.</code>
string이 locality가 보장된다고는 해도 for문을 통해서 하나씩 접근해서 곱하기보다
1만단위로 수를 4개씩 가져와서 곱하는 경우 <code>9999 * 9999 &lt; INT_MAX</code>임으로 좋지 않을까? 라는 발상을 하게 되었다.</p>
<p>근데 <code>0000 * 0000</code>의 경우에는 어떻게 정해야하지?? 
<code>10000 * 10000</code>의 경우에는 첫 iter에서 0을 저장할 것이고, 두번째 iter에서는 <code>1 * 1</code>을 저장할 것이다.
두번째 iter의 digit_index는 8이고.. 값은 1이 될 것이다. 이 경우 <code>100000000</code>이 된다.</p>
<p>평범한 <code>22341 * 54313</code> 곱하기의 경우에는 첫 iter에서 <code>2341 * 4313</code>이 발생하고 <code>10096733</code>이 된다.
두번째 iter에서는 <code>5 * 2341</code>이, 3번째 iter에서는 <code>2 * 4313</code>, 네번째 iter에서는 <code>2 * 5</code>가 나온다.
그렇다면 <code>(10 * 10^8) + (5 * 2341 * 10^4) + (2 * 4313 * 10^4) + 10096733</code> = <code>22341 * 54313</code>.
1개의 digit_index를 10^4로 생각하고, 올림을 해줄때도 10000으로 나눈 나머지를 윗 digit_index에 더해주면 될 것이다.</p>
<p>작성했더니 통과... 근데 10^5000승의 곱하기는 아직도 통과를 못했다.
아예 complexity자체를 줄이는 방법으로 접근해야하나?</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[C++ 일기 - 1]]></title>
            <link>https://velog.io/@bengal_j/C-%EC%9D%BC%EA%B8%B0-1</link>
            <guid>https://velog.io/@bengal_j/C-%EC%9D%BC%EA%B8%B0-1</guid>
            <pubDate>Fri, 03 Mar 2023 13:20:11 GMT</pubDate>
            <description><![CDATA[<h1 id="a--b">A * B</h1>
<hr>
<p>A * B를 large-scale에서 수행하려면 어떻게 해야할까?
5 * 5 같은건 인터넷에서 검색해도 간단하게 수행할 수 있을 것이다.</p>
<p>그렇다면 10억 * 10억은? int를 초과할태니 double을 쓰면 되지 않을까?
그렇게 생각하고 double을 사용해봤다.</p>
<pre><code class="language-c">int main() {
    double val_a, val_b
    ...

    cout &lt;&lt; to_string(val_a * val_b) &lt;&lt; &quot;\n&quot;
    return 0;
}</code></pre>
<p>꼴에 Double이라고 출력값은 <code>11418858.000000</code> 처럼 붙어나옴..
그럼 string lib을 잘 만져서 뒤쪽을 잘라주면 될거다.</p>
<p>따로 String을 할당하고 &quot;.&quot;를 파싱해서 잘라보자</p>
<pre><code class="language-c">#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;string&gt;


int main() {
    double val_a, val_b;
    char delim = &#39;.&#39;;

    scanf(&quot;%lf %lf&quot;, &amp;val_a, &amp;val_b);

    std::string result;
    std::istringstream res;

    res.str(std::to_string(val_a * val_b));

    getline(res, result, delim);
    std::cout &lt;&lt; result &lt;&lt; &quot;\n&quot;;

    return 0;
}</code></pre>
<p>위 코드로 double의 입력범위와 출력범위까지는 대응할 수 있다.
그렇다면 double의 입출력범위를 넘는 수가 들어오는 경우에는 어떻게 해결해야 할까?
또 Double은 표현의 한계가 존재한다. IEEE754에서 Double의 구조를 생각해보면 Fragment의 자릿수가 만들어내는 표현의 한계라는 말의 뜻을 알 수 있을 것이다. 이를 해결하려면?
이제부터 문제가 좀 골때리기 시작한다.</p>
<p>이 문제를 3가지의 Task로 나누어 생각해보자.</p>
<pre><code>1. 임의의 0 이상의 정수를 입력받는다.
2. 임의의 0 이상의 정수 2개를 곱한 것을 저장한다.
3. 임의의 0 이상의 정수를 출력한다.</code></pre><p>일단 임의의 큰 수라면, 해당 수를 Numeric 형식의 자료형에 담을 수 없을 것이다.
미리 크기가 정해진 자료형의 경우 임의의 큰 수에 대해서 대응할 수 없다. 그렇다면 변동이 가능하면서 원하는 값을 저장할 수 있는 기본 자료형을 생각해보면 Vector, String, *Char가 있다.</p>
<p>좋은 개발자라면 선택에 이유가 있어야 한다던데.. 나는 나쁜 개발자라서 사실 잘 모르겠다. 일단 풀이를 생각해보자. 내가 간단하게 생각한 풀이는</p>
<pre><code>1. 특정 개수의 숫자 단위마다 String을 끊어서 저장한 후 각각을 곱해주기
2. 하나의 수를 어떻게든 저장해놓고 digit마다 곱해가면서 iterative하게 더해주기.</code></pre><p>둘다 귀찮아보인다... 하지만 2번의 과정이 조금 더 직관적으로 보임으로 해당 문제로 진행해보자. 우선 임의의 큰 수 임 A, B를 string에 저장할 수 있을 것이다. 그럼 str_a에 해당 값을 고정해놓고 str_b에 대해서 하나의 digit씩 뒤에서 앞으로 움직이며 곱해서 각각의 자릿수에 맞는 수를 저장한다.</p>
<p>쓰고보니 자릿수마다 저장할 수 있는 저장소가 있으면 나중에 다시 string으로 만들 때 편하지 않을까? dict을 만들어서 1의 자리는 dict[1], 10의 자리는 dict[2]에 vector&lt;int&gt;로 저장해 놓자.
이후에는 dict의 key값을 1씩 증가시켜가며 순서대로 돌면서 저장된 vector 내부의 int의 모든 값을 sum 하고 해당 경우 10이 넘어서 올림이 발생한다면 그것만 잘 처리해주면 된다.</p>
<pre><code class="language-c">#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;
#include &lt;map&gt;
#include &lt;numeric&gt;

using namespace std;

map&lt; string, vector&lt;int&gt; &gt; digit_map;


int main() {
    string input_str, val_a, val_b, map_key;
    getline(cin, input_str);

    char delimeter = &#39; &#39;;
    int int_d_a, int_d_b, temp_res, temp_remain;

    istringstream input_stream;
    input_stream.str(input_str);

    getline(input_stream, val_a, delimeter);
    getline(input_stream, val_b, delimeter);

    // std::cout &lt;&lt; val_a &lt;&lt; &quot;\n&quot; &lt;&lt; val_b &lt;&lt; &quot;\n&quot;;

    int digit_idx = 0;

    for (int i = val_a.size() - 1; i &gt;= 0; i--) {
        int_d_a = val_a[i] - 48;
        for (int j = val_b.size() - 1; j &gt;= 0; j--) {
            int_d_b = val_b[j] - 48;
            ...
            }
        }
        digit_idx += 1;
    }
    temp_res = 0;

    string result_str = &quot;&quot;;

    int max_length = val_a.size() + val_b.size();
    for (int k = 0; k &lt; max_length; k++) {
        string k_key = to_string(k);
        vector&lt;int&gt; digit_vec = digit_map[k_key];
        temp_res = accumulate(digit_vec.begin(), digit_vec.end(), 0);
        temp_remain = temp_res % 10;
        result_str = to_string(temp_remain) + result_str;

        temp_res = temp_res / 10;
        int remain_idx = 1;
        while (temp_res &gt;= 1) {
            temp_remain = temp_res % 10;
            ...
        }
    }

    std::cout &lt;&lt; result_str &lt;&lt; &quot;\n&quot;;

    return 0;
}
</code></pre>
<p>어캐 요래요래 짜니까 되긴 하더라...
별로 안이쁘긴 한데 내 자식이니 어쩔수없고 ㅋㅋ
이렇게 짜니 맨 앞자리가 0일때가 가끔 생겨서 해당 부분만 추가적으로 strcmp 등 string lib 함수로 없애주면 되더라.</p>
<p>다 안올려놓는 이유는 성격이 나빠서ㅋ 대학교 과제에 쓰지말라고ㅋ</p>
<p>근데 역시 못생기게 짜서 그런지 시간이 좀 오래걸린다..
시간 최적화는 내일</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Representing Scenes as Neural Radiance Fields for View Synthesis
- ECCV 2020]]></title>
            <link>https://velog.io/@bengal_j/Representing-Scenes-as-Neural-Radiance-Fields-for-View-Synthesis-ECCV-2020</link>
            <guid>https://velog.io/@bengal_j/Representing-Scenes-as-Neural-Radiance-Fields-for-View-Synthesis-ECCV-2020</guid>
            <pubDate>Fri, 03 Mar 2023 10:03:23 GMT</pubDate>
            <description><![CDATA[<h2 id="summary">Summary</h2>
<hr>
<p><img src="https://velog.velcdn.com/images/bengal_j/post/7a837652-9589-418d-bdb6-13db6854e743/image.png" alt=""></p>
<p>Input : spatial location (x, y, z), viewing direction (θ, φ) (5D coordinate)</p>
<ul>
<li>Spatial Position<ul>
<li>$\textbf{x}$ : xyz coordinate</li>
</ul>
</li>
<li>Viewing Direction<ul>
<li>$\textbf{d}$ : camera position</li>
</ul>
</li>
</ul>
<p>output : volume density, view-dependent emitted radiance</p>
<ul>
<li>Volume Density map<ul>
<li>$\sigma(x): \mathbb{R}^3 \rightarrow \mathbb{R}_{\ge0}$</li>
<li>xyz coordinate to opaque</li>
</ul>
</li>
<li>Color Radiance map<ul>
<li>$\textbf{c}(\textbf{x}, \textbf{d}): \mathbb{R}^5 \rightarrow \mathbb{R}^3$</li>
<li>xyz coordinate, camera position to RGB Color</li>
</ul>
</li>
</ul>
<p>$F_\theta: (\textbf{x}, \textbf{d}) \rightarrow (\textbf{c}, \sigma)$</p>
<p>After getting radiance output, process volume rendering to build motion</p>
<h2 id="what-is-neuiral-radiance-field">What is Neuiral Radiance Field</h2>
<hr>
<p>Approximate continuous 5D scene representation with an MLP network $F_\theta: (\textbf{x}, \textbf{d}) \rightarrow (\textbf{c}, \sigma)$ and optimaize weight $\theta$ to map from each input 5D coordinate to its corresponding volume density and directional emitted vector.</p>
<h3 id="positional-encoding">Positional Encoding</h3>
<hr>
<p><img src="https://velog.velcdn.com/images/bengal_j/post/11ff0e21-18db-4896-a48d-146904806c4a/image.png" alt=""></p>
<p>Neural network is universal function approximators. </p>
<p>That deep networks are biased towards learning lower frequency functions. Additionally, it also known as higher dimensional space using high frequency functions. So reformulating $F_\theta$ as a composition of $F_\theta = F&#39;_\theta \circ \gamma$, $\gamma$ is a mapping from $\mathbb{R}$ into a higher dimensional space $\mathbb{R}^{2L}$, and $F&#39;_\theta$ is still simply a regular MLP.</p>
<p>$$
\gamma(p) = (sin(2^0\pi p), \space cos(2^0\pi p), \space ... \space ,(sin(2^{L-1}\pi p),\space cos(2^{L-1}\pi p))
$$</p>
<p>This function is applied separately to each of the three coordinate values in $\textbf{x}$. In this paper, $L = 10$ for $\gamma(\textbf{x})$, $L = 4$ for $\gamma(\textbf{d})$. This Process helps MLP network to learn more high dimensional space easily to approximate higher frequency function. It means, more detailed representation can be adapted.</p>
<h3 id="hierarchical-volume-sampling">Hierarchical Volume Sampling</h3>
<hr>
<p>There are a lot of free space and occluded regions that don’t contribute to the rendered image. So, need special method that sampling radiance point more efficiently. Paper propose a hierarchical representation that increases rendering efficiency by allocating samples proportionally to ehir expected effect on the final rendering.</p>
<p>Paper optimizes two networks. One is coarse, other one is fine. First, sample $N_c$ locations using stratified sampleing, and evaluate the coarse network at these locations. After evaluate network, produce a more informed sampling where samples are biased towards the relevant parts of the volume.</p>
<p>$$
\hat{C}<em>c(r) = \sum</em>{i=1}^{N_c} w_ic_i, \space w_i = T_i(1-exp(-\sigma_i\delta_i)).
$$</p>
<p>Rewrite alpha compositioned color from the coarse network $\hat{C}_c(r)$ as a weighted sum of all sampled colors $c_i$. And sample a second set of $N_f$ locations from this distribution using inverse transform sampling. Evaluate “fine” network at union of the first and second set of samples. It is similar as importance sampling.</p>
<p><img src="https://velog.velcdn.com/images/bengal_j/post/da8317a5-6ec2-4339-9650-389800c7cca6/image.png" alt=""></p>
<p>So Input is $\gamma(\textbf{x})$ which is 3(coordinate) * 2(cos / sin space) * 10 (L), to 256 channel. Each black arrow is ReLU process. After finishing 4th layer, concat $\gamma(\textbf{x})$ term. An additional layer outputs the volume density $\sigma$ and 256 dimensional feature vector. This feature vector is concatencted with the positional encoding of the input viewing direction $\gamma(\textbf{d})$ and is processed by and additional ReLU layer with 128 channels.</p>
<h2 id="how-to-rendering-volume-from-radience">How to Rendering Volume from Radience?</h2>
<hr>
<ul>
<li><p>how to build 3D Image from this output?</p>
<p>  $$
  C(r) = \int_{t_n}^{t_f} T(t)\sigma(\textbf{r}(t))\textbf{c}(\textbf{r}(t),\textbf{d})dt
  $$</p>
<ul>
<li><p>$T(t)$ express previous sum of opaque to $t_n$ to $t$</p>
<p>  $$
  T(t) = exp(-\int_{t_n}^{t}\sigma(\textbf{r}(s))ds)
  $$</p>
</li>
<li><p>$<strong>\sigma{(\textbf{r}(t))}$</strong> express opaque at spatial point $\textbf{r}(t)$. It interpreted as the differential probability of a ray terminating at infinitesimal particle at location $\textbf{r}(t)$</p>
<ul>
<li>$\textbf{r}(t) = \textbf{o} + t\textbf{d}$, d is viewing direction, o is starting point?</li>
</ul>
</li>
<li><p>$\textbf{c}(\textbf{r}(t), \textbf{d})$ express color at specific point consider viewing direction</p>
</li>
</ul>
</li>
<li><p>Change quadrature to our discrete method</p>
<p>  $$
  \hat{C}(\textbf{r}) = \sum_{i=1}^{N}T_i(1 - exp(\sigma_i\delta_i))\textbf{c}_i
  $$</p>
<ul>
<li><p>$T_i$ express previous sum of opaque to $1$ to $i - 1$</p>
<p>  $$
  T_i = exp(-\sum_{j=1}^{i-1}\sigma_j\delta_j)
  $$</p>
</li>
</ul>
</li>
</ul>
<h2 id="loss">Loss</h2>
<hr>
<p>The paper use COLMAP package to estimate parameters for real data. Each optimization iteration, authors randomly sample a batch of camera rays from the set of all pixels in the dataset, and then follow the hierarchical sampling to query $N_c$ samples from the coarse, $N_c + N_f$ samples from fine network.</p>
<p>Loss is total squared error between rendered and true pixel colors for both networks.</p>
<p>$$
L = \sum_{r\in R}[|| \hat{C}_c(r) - C(r)||^2_2 \space + \space ||\hat{C}_f(r) - C(r)||^2_2 ]
$$</p>
<p>where $R$ is the set of rays in each batch. In this experiment, $N_c = 64, N_f = 128$, so all parameters are $64 + (64 + 128) = 256$.</p>
]]></description>
        </item>
    </channel>
</rss>