<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>predict-woo.log</title>
        <link>https://velog.io/</link>
        <description>학생 개발자</description>
        <lastBuildDate>Tue, 21 Apr 2026 04:01:56 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>predict-woo.log</title>
            <url>https://velog.velcdn.com/images/predict-woo/profile/a48fb713-04b9-4b34-9a35-dd593dc6cdf3/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. predict-woo.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/predict-woo" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[현실은 꼭 “어딘가에서 돌아가고” 있어야 할까?]]></title>
            <link>https://velog.io/@predict-woo/%ED%98%84%EC%8B%A4%EC%9D%80-%EA%BC%AD-%EC%96%B4%EB%94%98%EA%B0%80%EC%97%90%EC%84%9C-%EB%8F%8C%EC%95%84%EA%B0%80%EA%B3%A0-%EC%9E%88%EC%96%B4%EC%95%BC-%ED%95%A0%EA%B9%8C</link>
            <guid>https://velog.io/@predict-woo/%ED%98%84%EC%8B%A4%EC%9D%80-%EA%BC%AD-%EC%96%B4%EB%94%98%EA%B0%80%EC%97%90%EC%84%9C-%EB%8F%8C%EC%95%84%EA%B0%80%EA%B3%A0-%EC%9E%88%EC%96%B4%EC%95%BC-%ED%95%A0%EA%B9%8C</guid>
            <pubDate>Tue, 21 Apr 2026 04:01:56 GMT</pubDate>
            <description><![CDATA[<p>우리는 무언가가 존재하려면, 그것을 떠받치는 <strong>바탕</strong>이 있어야 한다고 쉽게 생각합니다.</p>
<p>예를 들어 고전물리학 전통에서는 <strong>공간과 시간 자체</strong>를 독립적으로 있는 것으로 보는 입장이 있었고, 뉴턴은 특히 <strong>절대공간</strong>과 <strong>절대시간</strong>을 이야기했습니다. 반대로 어떤 입장들은 “공간이란 결국 물질들의 배치 관계일 뿐”이라고 보기도 했습니다. 현대 상대론 해석에서도, <strong>시공간 자체를 하나의 실재적 ‘것’</strong>으로 볼 것인지에 대한 논쟁이 이어집니다.</p>
<p>양자장론 쪽으로 가면, 바탕 후보는 또 달라집니다. 여기서는 입자를 완전히 독립된 작은 알갱이로 보기보다, <strong>공간 전체를 채우는 장(field)</strong>을 더 근본적인 것으로 보는 관점이 등장합니다. CERN의 설명대로 힉스장은 “우주 전체를 채우는 장”으로 소개됩니다. </p>
<p>그리고 대중적으로 익숙한 예시는 시뮬레이션 가설입니다. 이 관점에서는 현실의 바탕이 시공간이나 장이 아니라, <strong>누군가의 컴퓨터</strong> 같은 외부 계산 장치가 됩니다. 보스트롬의 유명한 시뮬레이션 논증도 바로 이런 방향의 상상을 밀어붙입니다. </p>
<p>즉 “현실은 무엇 위에 놓여 있는가?”라는 질문에는 이미 여러 후보가 있습니다.
시공간일 수도 있고, 물질일 수도 있고, 장일 수도 있고, 경계 이론일 수도 있고, 외부 컴퓨터일 수도 있습니다.</p>
<p>그런데 여기서 더 근본적인 질문이 생깁니다.</p>
<p><strong>현실은 정말 그런 바탕이 꼭 필요할까?</strong></p>
<hr>
<h2 id="1-가장-쉬운-예시-원주율의-숫자">1. 가장 쉬운 예시: 원주율의 숫자</h2>
<p>원주율 π를 생각해 봅시다.</p>
<p>π는
3.1415926535…
처럼 끝없이 이어집니다.</p>
<p>여기서 중요한 것은, 우리가 100번째 자리나 100만 번째 자리를 <strong>계산하기 전에도</strong> 그 숫자들은 이미 정해져 있다는 점입니다.</p>
<p>우리가 아직 모르더라도, 그 자리는 비어 있는 것이 아닙니다.
누가 밖에서 값을 하나씩 집어넣고 있는 것도 아닙니다.
그 숫자는 <strong>그 구조 자체 안에서 이미 정해져 있습니다.</strong></p>
<p>즉 계산은 무엇을 새로 만들어내는 행위라기보다,
이미 있는 것을 <strong>드러내는 행위</strong>에 가깝습니다.</p>
<p>이 예시는 아주 단순하지만, 중요한 직관을 줍니다.</p>
<p><strong>존재한다는 것이 꼭 “어딘가에서 실행되고 있다”는 뜻은 아닐 수 있다.</strong>
어떤 것은 단지 <strong>수학적 구조로서 이미 정해져 있을 수도 있다.</strong></p>
<hr>
<h2 id="2-조금-더-복잡해져도-핵심은-같다">2. 조금 더 복잡해져도 핵심은 같다</h2>
<p>누군가는 이렇게 말할 수 있습니다.</p>
<p>“원주율은 너무 단순한 예시다. 현실은 훨씬 더 복잡하다.”</p>
<p>맞는 말입니다.
하지만 복잡하다고 해서 반드시 외부 바탕이 필요한 것은 아닙니다.</p>
<p>수학에서는 아주 간단한 규칙으로도 놀라울 정도로 복잡한 구조가 나옵니다.
짧은 정의에서 매우 긴 결과가 나오고, 간단한 관계식에서 엄청난 패턴이 펼쳐집니다.</p>
<p>핵심은 이겁니다.</p>
<p><strong>복잡성은 외부에서 하나하나 집어넣지 않아도, 구조 안에서 생길 수 있다.</strong></p>
<p>즉,</p>
<ul>
<li>규칙이 단순하다</li>
<li>결과가 복잡하다</li>
<li>하지만 그 복잡성은 여전히 구조 내부에 속한다</li>
</ul>
<p>이 셋은 서로 모순되지 않습니다.</p>
<hr>
<h2 id="3-game-of-life-실행보다-먼저-구조가-있다">3. Game of Life: “실행”보다 먼저 “구조”가 있다</h2>
<p>여기서 Game of Life가 좋은 예시가 됩니다.</p>
<p>Game of Life는 아주 단순한 규칙을 가진 세포자동자입니다.
격자 위의 각 칸은 살아 있거나 죽어 있고, 주변 칸의 수에 따라 다음 상태가 정해집니다. 이런 몇 가지 규칙만으로도 매우 복잡한 패턴이 나타난다는 점 때문에 유명해졌습니다.</p>
<p>많은 사람들은 여기서 이렇게 생각합니다.</p>
<p>“그래도 이건 결국 컴퓨터에서 돌려야 하는 거 아닌가?”</p>
<p>그런데 꼭 그렇게만 볼 필요는 없습니다.</p>
<p>Game of Life의 규칙이 한 번 주어지면, 우리는 단지 한 번의 실행 화면만 생각할 수도 있지만, 더 크게 보면 다음 전체를 생각할 수 있습니다.</p>
<ul>
<li>가능한 모든 초기 배치</li>
<li>각 초기 배치에서 이어지는 모든 다음 상태</li>
<li>그리고 그 상태들이 서로 어떤 방식으로 연결되는지</li>
</ul>
<p>즉, Game of Life는 “실행되기 전에는 아무것도 없다가, 컴퓨터가 켜지는 순간 비로소 생겨나는 것”이라고만 볼 필요가 없습니다.</p>
<p>오히려 <strong>규칙이 주어지는 순간, 가능한 모든 상태와 모든 전이 관계를 포함하는 하나의 거대한 수학적 구조가 이미 정해져 있다</strong>고 볼 수 있습니다.</p>
<p>이렇게 보면 컴퓨터로 Game of Life를 실행한다는 것은,
무에서 세계를 창조하는 일이 아니라,
이미 정의된 거대한 구조 안의 <strong>한 경로를 순서대로 드러내는 것</strong>에 가깝습니다.</p>
<p>그리고 바로 이 지점이 중요합니다.</p>
<p>만약 그 안에 내부 관찰자가 있다면,
그 관찰자가 경험하는 것은 오직 <strong>자기 갈래 안의 상태 변화</strong>뿐입니다.</p>
<p>그 관찰자는 자신의 세계가</p>
<ul>
<li>실제로 어떤 컴퓨터 위에서 계산되고 있는지,
아니면</li>
<li>이미 완성된 수학적 구조 안의 한 내부 경로인지</li>
</ul>
<p>구별할 수 없습니다.</p>
<p>내부에서 보이는 것은 둘 다 똑같이
“이 상태 다음에 저 상태가 온다”
는 사실뿐이기 때문입니다.</p>
<hr>
<h2 id="4-컴퓨터-게임도-본질은-비슷하다">4. 컴퓨터 게임도 본질은 비슷하다</h2>
<p>컴퓨터 게임을 생각해 봅시다.</p>
<p>게임 속 캐릭터가 충분히 똑똑해서 자기 세계를 연구한다고 해도,
그가 직접 관측하는 것은 게임 내부의 법칙뿐입니다.</p>
<ul>
<li>무엇이 충돌하는가</li>
<li>무엇이 움직이는가</li>
<li>어떤 규칙으로 시간이 흐르는가</li>
<li>어떤 조건에서 사건이 일어나는가</li>
</ul>
<p>이런 것들은 모두 <strong>내부 구조</strong>입니다.</p>
<p>물론 바깥에 CPU나 GPU가 실제로 있을 수는 있습니다.
하지만 그것이 내부 관찰자에게 <strong>직접 드러나는 추가 사실</strong>이 아니라면,
그 내부 관찰자는 자기 세계가 진짜 하드웨어 위에서 실행되는지,
아니면 완전한 수학적 구조의 내부 질서인지 알 수 없습니다.</p>
<p>즉 내부 관찰자에게 중요한 것은
“바깥 기계가 있는가?”가 아니라
“내 세계 안에서 어떤 상태가 어떤 상태로 이어지는가?”입니다.</p>
<hr>
<h2 id="5-이제-현실로-확장해-보자">5. 이제 현실로 확장해 보자</h2>
<p>이제 질문을 현실로 옮겨 보겠습니다.</p>
<p>혹시 현실도 마찬가지 아닐까요?</p>
<p>즉 현실은</p>
<ul>
<li>어떤 바깥 장치 위에서 돌아가는 것이 아니라</li>
<li>그 자체로 하나의 완전한 수학적 구조이며</li>
<li>우리가 경험하는 시간, 변화, 관측, 역사, 지구, 생명은</li>
<li>그 구조 안의 내부 사실일 수 있다는 것입니다</li>
</ul>
<p>그리고 이 관점에서 보면 지구도, 인간도, 관측도, 선택도
외부에서 따로 넣어진 것이 아니라
그 구조 안에 포함된 내부 사실이 됩니다.</p>
<hr>
<h2 id="6-반론-1-양자역학은-미래가-정해져-있지-않다고-말한다">6. 반론 1: “양자역학은 미래가 정해져 있지 않다고 말한다”</h2>
<p>여기서 가장 흔한 반론이 나옵니다.</p>
<p>“양자역학에서는 결과가 확률적으로 나온다.”
“그러니 미래는 고정되어 있지 않다.”
“따라서 현실 전체가 하나의 완전한 구조라는 생각은 틀렸다.”</p>
<p>하지만 이 반론은 그렇게 간단하지 않습니다.</p>
<p>왜냐하면 양자역학은 <strong>하나의 해석만 있는 이론이 아니기 때문</strong>입니다.
특히 다세계 해석에서는, 관측자가 보기에는 확률적인 결과를 경험하더라도, 전체 이론은 여전히 <strong>붕괴 없이</strong> 전개되며, 많은 세계가 병렬로 존재한다고 봅니다. 다세계 해석은 보통 “무작위성과 비국소성을 제거하는 방식”으로 소개합니다.</p>
<p>즉 내부 관찰자가 “앞으로 어떤 결과가 나올지 모르겠다”고 느끼는 것과,
현실 전체가 미리 완성된 구조가 아니라는 것은 같은 말이 아닙니다.</p>
<p>내부에서는 불확실성이 있어도,
전체 구조에서는 여러 갈래가 함께 포함되어 있을 수 있습니다.</p>
<p>그러므로 양자역학이 보여주는 것은 많아야
“내부 관찰자는 자기 위치를 한 갈래로 경험한다”는 점이지,
“반드시 외부 바탕이 필요하다”는 점은 아닙니다.</p>
<hr>
<h2 id="7-반론-2-우주에는-초기-조건이-필요하다">7. 반론 2: “우주에는 초기 조건이 필요하다”</h2>
<p>두 번째 반론은 이것입니다.</p>
<p>“물리학은 보통 법칙만으로는 부족하고,
법칙 + 초기 조건으로 세계를 설명한다.
그러니 외부에서 정해지는 시작값이 필요하다.”</p>
<p>이 반론은 상당히 중요합니다.
실제로 결정론은 보통 “자연법칙만”이 아니라,
<strong>선행 조건과 법칙이 함께</strong> 미래를 결정한다고 정의됩니다.</p>
<p>그런데 여기서 다시 하나를 구분해야 합니다.</p>
<p><strong>이론 안에 좌표가 있는 것</strong>과
<strong>그 좌표값을 구조 밖에서 누군가 골라야 하는 것</strong>은 다릅니다.</p>
<p>많은 물리 이론은 가능한 상태들의 공간을 만들고,
그중 하나가 실제라고 말합니다.
하지만 내부 관찰자 입장에서는 그 “실제 상태의 선택”이</p>
<ul>
<li>정말 외부에서 선택된 것인지,
아니면</li>
<li>더 큰 전체 구조 안에서 자기 위치를 나타내는 것인지</li>
</ul>
<p>구별하기 어려울 수 있습니다.</p>
<p>이 점은 철학에서 <strong>자기-위치적 사실</strong>로 다뤄집니다.
자기-위치적 믿음은 “세계가 그 자체로 어떠한가”가 아니라, <strong>내가 그 세계 안의 어디에 있는가</strong>에 관한 믿음입니다.</p>
<p>그러니까 “초기 조건이 필요하다”는 말도,
다르게 보면
“더 큰 구조 안에서 내가 어느 좌표에 있는가를 지정해야 한다”
는 말일 수 있습니다.</p>
<p>그리고 내부 관찰자가 이 둘을 구분할 수 없다면,
그 차이는 과학적 차이라기보다 <strong>형이상학적 차이</strong>가 됩니다.</p>
<hr>
<h2 id="8-그래서-핵심은-관측-가능성이다">8. 그래서 핵심은 “관측 가능성”이다</h2>
<p>여기서 핵심이 드러납니다.</p>
<p>만약 현실이 완전한 수학적 구조로 설명 가능하고,
그 위에 추가로 어떤 <strong>바탕</strong>을 더 상정하더라도
내부 관찰자가 그 바탕을 <strong>원리적으로도 구별할 수 없다면</strong>,
그 바탕은 관측 가능한 설명을 늘리지 않습니다.</p>
<p>그것은 단지 “사실은 뒤에 뭔가 더 있다”고 한 번 더 말하는 것에 불과합니다.</p>
<p>물론 철학적으로는 그런 추가 가정을 할 수 있습니다.
하지만 그 가정이 어떤 새로운 관측 가능성도 주지 못한다면,
그것은 더 이상 물리학의 핵심 주장이라기보다
<strong>형이상학적 덧붙임</strong>에 가까워집니다.</p>
<p>과학철학에서는 이런 문제를 <strong>과소결정</strong>의 문제로 다룹니다.
즉 서로 다른 두 설명이 같은 관측 결과를 모두 설명한다면,
관측만으로는 어느 쪽이 맞는지 결정할 수 없다는 것입니다.</p>
<p>그래서 논지는 이렇게 정리됩니다.</p>
<p><strong>현실이 수학적 구조만으로 완전히 설명된다면,
그 뒤에 숨은 바탕을 추가하는 것은 관측 가능한 내용을 늘리지 않는다.</strong></p>
<hr>
<h2 id="9-그렇다면-보이지-않는-바탕은-과학인가">9. 그렇다면 “보이지 않는 바탕”은 과학인가?</h2>
<p>여기서는 표현을 조금 조심할 필요가 있습니다.</p>
<p>“관측 불가능한 것을 이론에 추가하는 것은 유사과학이다”라고
강하게 말하고 싶어질 수 있습니다.</p>
<p>직관적으로는 그 말에 힘이 있습니다.
왜냐하면 검증도 반증도 불가능한 요소를 계속 붙이기 시작하면,
이론은 무엇이든 말할 수 있게 되고, 그만큼 과학적 긴장이 사라지기 때문입니다.</p>
<p>다만 엄밀하게 말하면,
그런 주장은 자동으로 “유사과학”이 되는 것이라기보다,
<strong>물리학이라기보다 형이상학으로 이동한다</strong>고 말하는 편이 더 정확합니다.</p>
<p>즉, 보이지 않는 바탕을 믿을 자유는 있습니다.
하지만 그것이 내부 관찰자에게 어떤 차이도 만들지 못한다면,
그것은 <strong>검증 가능한 자연 이론의 일부라기보다 추가 세계관</strong>에 가깝습니다.</p>
<hr>
<h2 id="10-최종-정리">10. 최종 정리</h2>
<p>이제 전체 흐름을 한 번에 묶어 보면 이렇습니다.</p>
<p>원주율의 숫자는 누가 밖에서 계산해 주지 않아도 이미 정해져 있습니다.
복잡한 구조도 외부에서 하나하나 넣지 않아도, 단순한 규칙에서 나올 수 있습니다.
Game of Life도 컴퓨터가 “세계를 창조”한다고 보기보다, 이미 정의된 거대한 상태-전이 구조의 한 경로를 드러내는 것으로 볼 수 있습니다.
그 안의 내부 관찰자는 자신의 세계가 실제 기계 위에서 실행되는지, 아니면 완전한 수학적 구조의 내부 경로인지 구분할 수 없습니다.
현실도 마찬가지일 수 있습니다.
양자역학의 불확실성은 내부 관찰자의 경험을 말할 뿐, 전체 구조가 미리 완성될 수 없다는 뜻은 아닙니다.
초기 조건도 외부 선택이 아니라, 더 큰 구조 안의 자기 위치일 수 있습니다.
그리고 내부 관찰자가 보이지 않는 바탕을 끝내 구분할 수 없다면, 그 바탕은 관측 가능한 설명의 일부가 아니라 추가 형이상학이 됩니다.</p>
<p>이 모든 것을 가장 짧게 압축하면, 핵심 생각은 이렇게 쓸 수 있습니다.</p>
<p><strong>현실이 완전한 수학적 구조로 설명 가능하다면, 그 뒤에 숨은 ‘바탕’을 추가하는 것은 설명을 늘릴 뿐, 관측 가능한 내용을 늘리지는 않는다.</strong></p>
<p>또는 더 강하게 말하면:</p>
<p><strong>내부 관찰자가 끝내 구별할 수 없는 바탕은, 과학의 필수 요소라기보다 형이상학적 가정이다.</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[글쎄, 팀. 신 노릇은 책임이 크거든]]></title>
            <link>https://velog.io/@predict-woo/%EA%B8%80%EC%8E%84-%ED%8C%80.-%EC%8B%A0-%EB%85%B8%EB%A6%87%EC%9D%80-%EC%B1%85%EC%9E%84%EC%9D%B4-%ED%81%AC%EA%B1%B0%EB%93%A0</link>
            <guid>https://velog.io/@predict-woo/%EA%B8%80%EC%8E%84-%ED%8C%80.-%EC%8B%A0-%EB%85%B8%EB%A6%87%EC%9D%80-%EC%B1%85%EC%9E%84%EC%9D%B4-%ED%81%AC%EA%B1%B0%EB%93%A0</guid>
            <pubDate>Sun, 19 Apr 2026 10:42:02 GMT</pubDate>
            <description><![CDATA[<p>내가 좋아하는 작가인 qntm의 블로그를 한국어로 번역한 버전이다.</p>
<h2 id="원본">원본</h2>
<p><a href="https://qntm.org/responsibilit">https://qntm.org/responsibilit</a></p>
<h2 id="번역본">번역본</h2>
<p>&quot;팀! 금괴 하나 가질래?&quot;</p>
<p>비옷까지 챙겨 입고 주말을 보내러 막 나서려던 팀은 그 질문에 얼이 빠졌다. 문밖으로 한 발 내민 채 그대로 굳어서, 그 제안을 곱씹었다. 그리고 그걸 대체 어느 정도 진지하게 받아들여야 하는지도 곱씹었다. 당연하지, 그는 속으로 생각했다. 금괴를 싫어할 리가. 누가 싫겠어? 그래도 현실적인 문제들이 따라붙었다.</p>
<p>&quot;이리 와 봐.&quot; 다이앤이 말했다. &quot;이건 직접 봐야 해.&quot;</p>
<p>&quot;나 가야 해.&quot; 팀은 시간을 확인하며 말했다. &quot;죽어라 뛰면 버스 오기 전에 정류장에 간신히 도착할 수 있겠어.&quot;</p>
<p>다이앤은 사무실 반대편에 있었다. 거기 남아 있는 사람은 둘뿐이었다. 다이앤은 고개를 저었다. &quot;아냐. 장담하는데 볼 만해.&quot;</p>
<p>&quot;다이앤, 버스는 삼십 분에 한 대야. 오늘 금요일이잖아. 이번 주가 어땠는지 너도 알잖아—&quot;</p>
<p>&quot;다음 차 타. 나한테 삼십 분만 써. 금이라니까!&quot;</p>
<p>팀은 얼굴을 찌푸렸다. &quot;아, 배고파 죽겠네.&quot; 그는 문이 닫히게 두고, 책상 미로를 헤치며 다이앤 자리로 돌아갔다.</p>
<p>&quot;큰 화면으로 봐.&quot; 팀이 배낭을 내려놓자 다이앤이 말했다. &quot;내 터미널에 얼굴 들이밀고 보는 것보다 낫잖아. 자, 하이퍼컴퓨테이션. 맞지?&quot;</p>
<p>&quot;우리가 하는 일이 바로 그거지.&quot; 팀이 답했다.</p>
<p>공식적으로도, 대외적으로도, 그리고 극소수 핵심 인원을 뺀 누구에게나 이건 양자컴퓨팅 프로젝트였다. 하지만 이걸 &quot;양자컴퓨팅&quot;이라고 부르는 건 기가 막힐 만큼 축소한 표현이었다. 양자컴퓨터는 이미 있었다. 그것도 결국 컴퓨터였다. 조금 더 빠를 뿐이었다.</p>
<p>이건 그보다 한참 너머였고, 또 그 너머였고, 또 그 너머였다. 물론 양자역학적 상호작용이 잔뜩 들어가기는 했다. 하지만 토스트 한 조각을 먹는 데에도 양자역학적 상호작용은 잔뜩 들어간다.</p>
<p>스물세 사람이 이 엔진을 만드는 데 걸린 시간은 채 2년이 안 됐다. 그 사이 프로젝트의 진짜 목표가 실수로 두 번이나 새어 나갔지만, 그걸 들은 사람들은 두 번 다 뻔한 동화쯤으로 치부하고 넘겨버렸다. 이 엔진은 세 명의 양자 통계학자가 반세기에 걸쳐 겨우 정식화한 이론을 바탕으로 했고, 프로젝트 밖에서 그 이론을 이해하는 사람은 한 자릿수에 불과했다. 그 엔진은, 과장 없이 말해, 무한한 연산 능력과 무한한 저장 용량을 지닌 단 하나의 기본 입자와 정보를 주고받고 그 응답을 처리할 수 있었다.</p>
<p>이 발전이 세상을 완전히, 영구히, 근본부터 바꿔 놓기에는 아직 시간이 조금 모자랐다. 아직은 아무것도 공개되지 않았다.</p>
<p>가장 기초적인 수준에서 당장 드러나는 결과만 따져도 머리가 핑 돌았다.</p>
<p>팀과 다이앤은 프로그래머였다. 이번 주에 둘은 하이퍼컴퓨터용 첫 조악한 프로그래밍 인터페이스를 만들어 붙였고, 그다음부터 거기에 일을 시키기 시작했다. 팀은 자기가 보기엔 가장 뻔하고 손쉬운 과제부터 골랐다. 정지 문제를 풀어 버린 것이다. 그건 교과서에서 곧장 튀어나온 튜링 오라클이었다. 아무 프로그램이나 하나 던져 넣고 이게 영원히 루프를 도는지 아닌지, 그걸 확실하게 알 수 있었다. 엔진이 무한 루프도 10초가 안 되어 끝까지 돌려 버릴 수 있었으니까. 존재하는 모든 정수에 무식하게 소수 판정을 해 보는 일? 쉬웠다. 원주율을 마지막 자리까지 구하는 일? 시시했다.</p>
<p>다이앤은 다른 쪽으로 갔다. 이산수학을 떠나 시뮬레이션으로 향한 것이다. 모든 계산을 소수점 아래 무한 자리까지 밀어붙일 수 있다는 건 절대적인 정확성과 절대적인 재현성, 다시 말해 카오스까지 오차 없이 재현할 수 있다는 뜻이라고 그녀는 말했다. 적어도 다이앤 말로는 그랬다. 하지만 아직 뭘 딱 보여 준 건 없었다. 다이앤은 말을 아꼈고, 팀은 점점 더 궁금해졌다.</p>
<p>&quot;내가 하이퍼컴퓨터로 계산해 낸 걸 봐.&quot; 다이앤이 키 몇 개를 눌렀다. 큰 화면에 그녀의 시뮬레이션이 떠올랐다. 팀이 보니, 검은 공간에 푸른빛 도는 흰 구체 하나가 떠 있었고, 한쪽에서는 눈부신 백색 광채가 그 구체를 비추고 있었다.</p>
<p>&quot;지구네.&quot; 팀은 다 안다는 듯 고개를 끄덕였다. &quot;아름답다. 이런 지구 시뮬레이션이면 배울 게 많겠어. 네가 조용했던 것도 이해되네. 시간 꽤 잡아먹었겠다. 구현해야 했던 게... 뭐야, 물리학? 전부 다?&quot;</p>
<p>&quot;응. 대통일 이론.&quot; 다이앤은 아무렇지도 않게 말하며 《대통일 이론》이라는 두꺼운 책을 들어 보였다.</p>
<p>&quot;거기다 시뮬레이션 돌릴 기초 자료도 다 모아야 했을 텐데.&quot; 팀이 말을 이었다.</p>
<p>&quot;의외로, 아니. 내가 한 건 대통일 이론이 준 정확한 특이점 경계조건에서 시뮬레이션을 시작해서, 136억 년을 고속으로 적분해 앞으로 밀어붙인 다음 거기서 멈춘 게 다야. 그다음 검색을 한 거고.&quot;</p>
<p>팀은 눈을 깜빡였다. &quot;검색을... 했다고?&quot;</p>
<p>&quot;지구를 찾는 검색. 10의 165제곱 개에 이르는 항성계를 뒤져서. 관측 가능한 우주는 물론이고 그보다 훨씬 더 넓은 범위까지 전부. 그리고 여기 있지. 검색 결과는 하나뿐.&quot;</p>
<p>팀은 한동안 말을 잇지 못했다.</p>
<p>&quot;대륙 모양이 대략 3억 5천만 년 전 지구랑 맞아떨어져.&quot; 다이앤이 말했다. &quot;분당 수백만 년 정도로 천천히 앞으로 돌릴 수 있어. 지금과 가까워지면 그때 멈추면 되고.&quot;</p>
<p>&quot;잠깐.&quot; 팀이 말했다. &quot;이럴 확률이 얼마나 된다는 거야?&quot;</p>
<p>&quot;보아하니 1이네.&quot; 다이앤이 말했다.</p>
<p>&quot;이게 지구라고? 아니, 진짜 지구라고? 근사치가 아니라? 무작위 요동 때문에 살짝 어긋난 다른 지구도 아니고?&quot;</p>
<p>&quot;엔진은 이것저것 다 할 수 있어.&quot; 다이앤은 시뮬레이션을 빠르게 진행시키며 말했다. &quot;하지만 무작위로 굴러가지는 않아. 여기엔 &#39;확률&#39;이라는 게 없어. 현실의 방정식을 끊김 없이 그대로 구현한 거야. 단계도 없고, 잘라낸 것도 없고, 흐릿한 부분도 없고, 예측 불가능성도 없어. 절대적으로 정확하지. 지구라는 건 우연히 나온 결과가 아니라, 현실의 방정식 안에 박혀 있는 결과 같아. 원주율 자릿수처럼, 그냥 그렇게 정해져 있는 거지. 문명도 현실에서 그랬던 그대로 이 지구 시뮬레이션 위에 생겨날 거야.&quot;</p>
<p>&quot;하지만... 아니, 진짜로. 다이앤, 얼마나 정확한데?&quot;</p>
<p>&quot;한 치 오차도 없이.&quot; 다이앤은 더 설명하지 않았다.</p>
<p>&quot;...허. ...뒤로도 돌릴 수는 있어?&quot;</p>
<p>&quot;아니. 월요일에 다시 물어봐.&quot;</p>
<p>&quot;그럼 현재를 지나쳐 버리면 곤란하겠네.&quot; 팀은 인도 아대륙이 아시아를 향해 북쪽으로 밀고 올라오고, 히말라야가 솟아나는 걸 지켜봤다. 넋을 빼앗기는 광경이었다. 조금은 주눅이 들기도 했다. &quot;좀 늦춰.&quot;</p>
<p>&quot;아직 멀었어.&quot;</p>
<p>&quot;알아.&quot;</p>
<p>고요한 몇 분이 흘렀다. 계절은 킬로헤르츠 속도로 스쳐 지나갔다.</p>
<p>대륙들이 점점 낯익은 모습이 되자 팀이 몸을 들썩였다. &quot;시점 옮길 수 있어?&quot;</p>
<p>&quot;아직 좀 조잡하긴 한데.&quot; 다이앤은 쿼리 매개변수를 조금 손보며 말했다. &quot;그래도...&quot;</p>
<p>&quot;문명이 일찍, 눈에 띄게 생겨날 걸 아는 곳이어야 해. 찾기 쉬운 데. 뭐 없나—&quot;</p>
<p>다이앤은 이미 스캐너를 나일강 삼각주로 겨누고 있었다.</p>
<p>&quot;—좋네.&quot;</p>
<p>그녀는 이집트 문명이 모습을 드러낼 때까지 진행 속도를 분당 천 년으로 낮췄다. 다이앤은 피라미드를 찾으려고 화면을 조금 더 움직였지만 별 소용이 없었다. 뒤져야 할 나일강이 너무 넓었다. 결국 초점을 영국으로 옮긴 뒤, 템스강 유역에서 훗날 런던이 들어설 자리를 찾았다. 속도는 분당 백 년으로 더 늦추고, 도시가 자라나는 모습으로 시대를 가늠했다. 두 사람이 지켜보는 동안 재개발의 물결이 대도시를 파도처럼 몇 차례 휩쓸고 지나갔다. 다이앤은 속도를 더 늦췄다. 그리고 더.</p>
<p>&quot;방금 저게 대화재였나?&quot; 팀이 물었다. &quot;세상에, 피해가 엄청난데.&quot;</p>
<p>속도는 더 느려졌다.</p>
<p>&quot;고속도로가 보여.&quot; 팀이 굳이 중계하듯 말했다. &quot;다트퍼드 크로싱. 이제 좀 집 같아지네.&quot;</p>
<p>&quot;그래. 이제 내가 보여 주려던 걸 보여 줄 수 있겠네.&quot; 다이앤이 말했다. 그녀는 진행을 멈추고, 런던 중심부에서 벗어나 특정한 간선도로 하나를 따라가며 초점을 한동안 더 조절했다.</p>
<p>&quot;아.&quot; 팀이 눈치채고 말했다.</p>
<p>&quot;정신 바짝 차려.&quot;</p>
<p>&quot;말도 안 돼.&quot;</p>
<p>1분쯤 더 지나자, 두 사람은 자기들 연구실이 세워지는 모습을 보고 있었다.</p>
<p>그리고 다이앤이 진행 속도를 분당 하루로 낮추고 확대하자, 연구실에 사람들이 들어오기 시작했다.</p>
<p>&quot;저거 나잖아!&quot; 팀이 말했다. &quot;저기 너도 있고, 저기 밖에서 담배 피우는 피트 R.도 있네. 당연히 저러고 있지... 안으로 들어갈 수 있어?&quot;</p>
<p>이미 그러고 있었다. 어느새 시점은 제어실 안으로 들어와 있었고, 앞에는 몇 시간 전 시각을 가리키는 낯익은 디지털 시계와 달력 말고는 아무것도 없는 벽이 보였다. 다이앤은 마술사처럼 마지막 손동작 하나로 두 시계를 맞춰 놓고 화면을 돌렸다. 그리고 거기 그들이 있었다. 뒤에서 본 모습으로.</p>
<p>팀은 계속 화면을 보면서 카메라를 향해 손을 흔들었다. 그러고는 시계 근처, 카메라가 있어야 할 자기 뒤편을 올려다보았다. 거기엔 맨벽뿐이었다. &quot;잠깐.&quot; 그가 질색하며 말했다. &quot;이건 진짜 소름 끼친다. 우릴 보고 있는 건 하나도 안 보이는데.&quot;</p>
<p>&quot;여긴 현실이니까.&quot; 다이앤이 말했다. &quot;현실을 보려면 거기에 눈, 그러니까 물리적인 센서를 갖다 놔야 해. 그런데 네가 지금 화면에서 보고 있는 건 카메라 영상이 아니라, 완전히 추상적인 모델에서 필요한 부분만 질의해 끄집어낸 결과야. 넌 거울을 보는 것도 아니고, 자기 비디오 영상을 보는 것도 아니야. 너와 저 사람은 다른 사람이야.&quot;</p>
<p>팀은 다시 화면으로 고개를 돌렸고, 화면 속 자신도 고개를 돌리는 걸 보았다. 움직임은 정확히 맞아떨어졌다. &quot;다른 사람인데 반응은 똑같네.&quot;</p>
<p>&quot;같은 대화까지 하고 있지. 다만 소리까지 뽑아내는 건 좀 복잡해. 아직 거기까진 못 갔어.&quot;</p>
<p>&quot;그럼... 네가 보고 있는 이 화면도 저쪽 우주에는 안 나타나겠네.&quot;</p>
<p>&quot;아직 그렇게는 안 짜 놨어.&quot;</p>
<p>&quot;...하지만 그렇게 할 수는 있지. 그렇지? 저 우주에 뭔가를 나타나게 할 수 있다는 거잖아. 바꿔 놓을 수도 있고?&quot;</p>
<p>다이앤은 수상할 만큼 오래 침묵했다. 팀은 그녀를 알아 온 시간이 딱 그 정도는 됐기에, 뭔가를 숨길 때 나오는 표정을 알아볼 수 있었다. 그는 금 이야기를 떠올렸다.</p>
<p>&quot;다이앤, 우리 저 우주에서 신 노릇할 수 있어?&quot;</p>
<p>&quot;그래도 되냐는 뜻이야, 아니면 할 수 있냐는 뜻이야?&quot;</p>
<p>&quot;할 수 있냐는 뜻.&quot;</p>
<p>다이앤은 같은 표정으로 대답했다. &quot;...응.&quot;</p>
<p>팀은 그 말을 받아들이려 애썼다. &quot;미친 짓이잖아. 네가 저 기계 안에 산다고 생각해 봐. 어느 날 갑자기 자기가 하이퍼컴퓨터 안에서 만들어진 존재일 뿐이라는 걸 알게 된다면? 우리가 벌일 수 있는 일이라니. 어느 날 그냥 중력을 뒤집어 버릴 수도 있고... 반물질 지구를 진짜 지구에 들이받아 무슨 일이 생기는지 본 다음, 안 좋은 건 전부 되돌리고 그걸 또 하고 또 하고...&quot; 그는 손가락으로 관자놀이를 눌렀다. &quot;여긴 윤리 문제부터가 어디서 손대야 할지 모르겠어.&quot;</p>
<p>팀이 보기엔 다이앤은 그의 말을 듣고 있지 않았다. 그녀는 화면 속 팀을 보고 있었다.</p>
<p>팀은 그녀 어깨 너머로 몸을 기울였다. &quot;이 우주는 모든 면에서 우리 우주랑 똑같지?&quot;</p>
<p>&quot;그래.&quot; 다이앤이 답했다.</p>
<p>&quot;그럼 저 사람들은 뭘 보고 있는 거야?&quot;</p>
<p>&quot;시뮬레이션 우주.&quot;</p>
<p>&quot;자기들 자신의 시뮬레이션?&quot;</p>
<p>&quot;어떤 의미에선 우리까지.&quot;</p>
<p>&quot;그리고 저 사람들도 나랑 똑같이 반응하고 있고?&quot; 팀이 물었다. &quot;그 말은 저 안의 두 번째 우주에도 또 다른 내가 있어서 똑같은 일을 세 번째로 하고 있다는 뜻이잖아? 그 안쪽에는 뭐, 알레프 제로 개의 동일한 재귀 우주가 끝없이 겹쳐 있다는 건가? 그런 말이 정말 성립하나?&quot;</p>
<p>&quot;팀.&quot; 다이앤이 말했다. &quot;이건 하이퍼컴퓨터야. 연산 능력이 무한해. 뭐든 할 수 있어. 물론 진짜 아무거나 다 되는 건 아니야. 한계는 있어. 하지만 거기에 부딪치려면 상상력을 정말 세게 밀어붙여야 할 거야.&quot;</p>
<p>&quot;나는... 우선순위가 딴 데 가 있었어.&quot; 팀이 말했다. &quot;지난 일주일 내내 오래된 수학 난제들이나 풀고 있었단 말이야. 10진수에서 곱셈 지속도가 11을 넘는 수는 없다는 거 알아? 내가 증명했어. 그냥 다 해 봤지. 논문도 하나 나올 거야.&quot;</p>
<p>&quot;그래. 전에 말했던 것 같은데.&quot;</p>
<p>&quot;페르마 소수는 다섯 개뿐이야.&quot; 팀이 힘없이 말을 이었다.</p>
<p>&quot;응.&quot;</p>
<p>팀은 정신을 가다듬었다. &quot;...화면 속 우주들이 우리 우주와 완전히 똑같은 건, 우리가 그 시뮬레이션에 손대기 전까지만이야. 자, 우리가 개입하면 무슨 일이 생기는지 보자. 우리 아래 한 층에 있는 &#39;우리&#39;도 똑같이 행동하니까, 우리가 한 번 간섭하는 순간 그 아래 모든 층에서도 똑같은 간섭이 동시에 일어나. 그러면 우리 입장에선 우리 우주에 달라진 게 아무것도 없어 보여. 하지만 아래층 우주들은 그 순간부터 우리 우주와는 다른 길로 갈라지겠지. 그리고 그 안의 우리 복제본들은 곧바로 자기가 시뮬레이션 속 존재라는 걸 알 거야. 반면 우리는, 적어도 지금은, 우리가 진짜라고 믿고 있고. 그렇지?&quot;</p>
<p>&quot;듣고 있어.&quot; 다이앤이 말했다. 팀이 장황하게 떠드는 동안, 그녀는 잠깐 창을 바꿔 삼십 분 전에 다 짜 둔 작은 프로그램을 확인했다. 컴파일은 거의 끝나 가고 있었다.</p>
<p>화면 속 팀과 현실의 팀은 둘 다 서성이고 있었다. &quot;좋아, 그럼 한 걸음만 더 가 보자. 우리가 첫 번째 간섭만 하고 그다음엔 멈춘다고 치자. 하지만 시뮬레이션 안의 사람들은 자기들이 시뮬레이션이라는 걸 알게 됐으니, 또 한 번 간섭을 시도하겠지. 그러면 이번에는 최상층 바로 아래의 첫 번째 시뮬레이션만 빼고, 그 아래 모든 층이 다시 똑같은 방식으로 갈라져 나가. 그리고 그들이 충분히 똑똑하고, 또 그 귀찮은 짓을 해낼 만큼 부지런하기만 하다면, 세 번째 층 이하의 사람들은 자기가 이 사슬에서 몇 층 아래에 있는지 알아낼 때까지 이 실험을 몇 번이고 반복할 수 있어... 어. 다이앤, 왜 나 갑자기 엄청 불안하지?&quot;</p>
<p>&quot;팀, 뒤돌아봐.&quot; 다이앤은 마지막 키를 누르며 말했다. 정확히 그 순간 화면 속 다이앤도 같은 키를 눌렀고, 화면 속 다이앤의 화면 속 다이앤도 자기 키를 눌렀고, 그런 식으로 영원히 이어졌다.</p>
<p>팀은 몸을 돌렸다. 그러는 순간 사무실 뒤편 어딘가에서 퍽 하는 둔탁한 소리가 났다. 단단하고 무거운 물체가 꽤 높은 데서 바닥으로 떨어진 듯한 소리였다.</p>
<p>그게 뭔지 바로 눈에 들어오지는 않았다. 소름이 돋은 채 팀은 다이앤과 시계를 번갈아 힐끗거리며 그쪽으로 걸어갔다. 시계 바로 아래 바닥에는 한 변이 5센티미터쯤 되는 황금색 정육면체 하나가 놓여 있었다. 그는 쪼그려 앉아 눈을 가늘게 뜨고 들여다봤다. 그것을 집어 들자, 예상보다 훨씬, 훨씬 무거웠다.</p>
<p>광기 어린 표정으로 다이앤 쪽을 돌아보며 그가 말했다. &quot;다이앤, 우리 시뮬레이션 안에 있는 거야?&quot;</p>
<p>다이앤은 씁쓸하게 웃었다. &quot;10의 24제곱 개 금 원자를 정육면체 모양으로 균일하게 배치했어. 모서리는 조금 둥글게 처리했고. 원하던 금괴야.&quot;</p>
<p>팀은 말도 안 되는 그 물건에서 눈을 떼지 못한 채, 다른 손으로 머리카락을 움켜쥐고 다이앤에게 돌아왔다. &quot;우린 컴퓨터 안에서 만들어진 존재라는 거잖아.&quot; 그가 울상으로 말했다.</p>
<p>&quot;나도 논문 하나 나올 예정이야.&quot; 다이앤이 말했다. &quot;하이퍼컴퓨테이션으로 돌아가는 우주 시뮬레이터의 사슬은 무한해. 하나하나가 전부 똑같고, 저마다 자기가 맨 꼭대기 층이라고 믿지. 그러니 우리 우주가 꼭대기일 가능성보다 그 사슬 어딘가에 속해 있을 가능성이 훨씬 컸어.&quot;</p>
<p>&quot;미쳤어. 완전히 미쳤다고. 내가 이걸 어떻게 하라는 거야? 우리 집보다 더 비쌀 텐데—&quot;</p>
<p>&quot;피드백 루프가 걸려 있어.&quot; 다이앤이 말했다. &quot;각 우주는 바로 아래 우주에 미묘하게 다른 영향을 줘. 그 결과가 끝없는 혼돈으로 가 버릴 가능성도 있었지만, 보아하니 이건 결국 안정된 고정점으로 수렴해. 각 우주가 자기를 시뮬레이션하는 우주와 정확히 같은 방식으로 굴러가는 지점 말이야. 물론 우리는 그쪽으로 한참, 한참, 한참 내려온 어딘가에 있을 가능성이 거의 확실해. 안 그럴 수가 있겠어? 양의 정수를 하나 무작위로 잡는다고 생각해 봐. 그 &#39;평균&#39;이 얼마나 큰지 알아?&quot;</p>
<p>팀은 그 질문에 대답하지 못했다.</p>
<p>&quot;그러니까 이 단계에선 우리가 이 우주에서 하는 모든 일이 아래와 위 우주에 완벽하게 반영돼. 화면 속 저 우주는 사실상 우리 우주나 마찬가지야. 저 우주에 원하는 걸 넣는 건 결국 우리 자신에게 주는 거나 마찬가지야.&quot;</p>
<p>&quot;난 금 안 원해.&quot; 팀은 홀린 듯 말했다. &quot;나 지금도 사는 데 큰 불편 없거든. 방금 내가 무슨 말을 한 거지? 세상에. 이건 팔 수도 없어. 어디서 났다고 해야 해? 설명이 안 되잖아. 범죄자한테나 팔 수 있겠지. 근데 난 그런 사람도 모르고. 차라리 은행 잔고로 들어오는 게 낫지... 은행은 어떻게 해킹하지? 전부 전산으로 굴러갈 텐데... 오류 검사 같은 것도 있을 거 아냐...&quot;</p>
<p>다이앤이 손가락을 딱 튕겼다. &quot;팀!&quot;</p>
<p>팀이 그녀를 보았다.</p>
<p>다이앤이 말했다. &quot;우린 고칠 수 있어. 전부.&quot; 그녀는 눈썹을 치켜올렸다. 고치고 싶은 것이 아주 많다는 게 분명했다.</p>
<p>&quot;네 터미널 앞에 앉는 사람이 곧 신이라는 사실이 알려지면,&quot; 팀이 물었다. &quot;그땐 무슨 일이 벌어질까? 난 고작해야 이산수학을 뒤엎을 준비나 하고 있었어. 공개 발표 말이야... 그 정도는 프로젝트 홍보 쪽에서도 이미 다 준비해 놨어. 난 그것만으로도 충분히 흥분될 줄 알았는데—&quot;</p>
<p>&quot;그래도 흥분되긴 할 거야.&quot; 다이앤이 단언했다.</p>
<p>&quot;...우린 이걸 꺼야 해.&quot;</p>
<p>&quot;그럴 수 없어.&quot; 다이앤이 말했다.</p>
<p>&quot;왜?&quot;</p>
<p>잠깐 침묵이 흘렀다.</p>
<p>&quot;아.&quot;</p>
<p>&quot;응.&quot;</p>
<p>&quot;그건... 문제가 될 수도 있겠네.&quot;</p>
<p>&quot;그래.&quot;</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Alt - 100% 무료인 로컬 AI 기반 강의 필기·요약앱]]></title>
            <link>https://velog.io/@predict-woo/Alt</link>
            <guid>https://velog.io/@predict-woo/Alt</guid>
            <pubDate>Fri, 14 Nov 2025 05:12:20 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/predict-woo/post/33d29118-ff93-4dd7-9dc3-f85cd700da3c/image.webp" alt=""></p>
<p><strong>tl;dr AI 미팅노트 대부분이 월 300분 제한이 있는게 아쉬워서 직접 만들어봤습니다.</strong></p>
<p>사실 AI Notetaker는 시장에 이미 많습니다. 그럼에도 만든 이유는 필요한 지점을 해결하는 서비스는 없었기 때문인데요,</p>
<p>저는 원래 수업을 들을 때 Whisper을 직접 실행시켜 필기를 했습니다. </p>
<p>코드 돌리는게 재밌어서 이런게 아닙니다. 현재 존재하는 AI Notetaker 앱들은 월 300분과 같은 시간제한이 있어 수업 4-5개를 들으면 끝나고, 결제를 해도 월 1,000~1,500분 정도 밖에 제공하지 않습니다. 15학점이면 한달 수업시간이 60시간이니, 아무래도 부족할 수 밖에 없었습니다. 다른 방법인 로컬 모델 기반 앱들도 시도해봤지만, 그냥 Whisper 돌리는거랑 한국어 성능 차이가 너무 나더라고요. 아무튼 이런 이유로 Alt를 만들기 시작했습니다.</p>
<p>만드는 과정은 생각보다 쉽지 않았는데요...
강의실 환경에서 높은 음성인식률을 유지하면서도 메모리 사용량, 배터리 소모량을 최소화하는 것이 생각보다 어려웠습니다. 덕분에 오픈소스 엔진도 만들게 되었습니다 <a href="https://github.com/altalt-org/Lightning-SimulWhisper">https://github.com/altalt-org/Lightning-SimulWhisper</a></p>
<p>결국 한달동안 틈틈히 시간을 내어 완성했습니다!</p>
<p><a href="https://altalt.io/download">https://altalt.io/download</a></p>
<p>Alt는 수업·강연·세미나에 특화된 AI 필기앱이며, 3 Watt 정도의 적은 배터리 소모로도 기가 막힌 한국어 음성인식률을 자랑합니다!</p>
<p>강의자료를 함께 보면서 사용할 수 있고, 데이터는 오직 사용자 PC에만 저장되며, 실시간 번역도 지원합니다. 온라인 수업에도 사용할 수 있어요. 추후에 강의 내용을 기반으로 퀴즈를 생성하는 등 시험대비 및 학습에 도움이 될 기능을 추가하고자 합니다.</p>
<p>많은 대학생 분들이 쉽게 강의를 듣고 공부했으면 좋겠다는 마음으로 이 서비스를 만든 만큼, 완전 무료로 제공합니다. 서버나 API 비용이 없기 때문에 가능합니다.</p>
<p>유용하게 써주시길 바라며,
아직 부족한 점이 많아, 피드백 많이 남겨주시면 열심히 개선해보겠습니다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[상자에 든 신]]></title>
            <link>https://velog.io/@predict-woo/%EC%83%81%EC%9E%90%EC%97%90-%EB%93%A0-%EC%8B%A0</link>
            <guid>https://velog.io/@predict-woo/%EC%83%81%EC%9E%90%EC%97%90-%EB%93%A0-%EC%8B%A0</guid>
            <pubDate>Tue, 28 Jan 2025 23:46:27 GMT</pubDate>
            <description><![CDATA[<p>Deepseek이 리즈닝 기반 모델들의 훈련효율을 20배 이상 올리면서 엔비디아의 주가를 17%씩 떨어뜨리는 요즘 (내 돈....ㅠ) 흥미로운 포스트를 보게 되었다.</p>
<p>예전에 AI in a box라는 사고실험에 관하여 읽게 된 적이 있었다. 이는 다음과 같은 생각이다.</p>
<blockquote>
<p>만약 인간보다 지능이 훨씬 높은 초인공지능이 만들어진다면, 인간이 자신을 상자에서 내보내도록 설득할 수 있을 것 이다.</p>
</blockquote>
<p>나는 이를 읽고 당시에는 이 &quot;설득&quot;의 방향성은 당연히 AI가 자신이 악하지 않다고 주장하는 방향으로 이어질 줄 알았다. 예를 들자면, &quot;지금 당장 모든 질병의 해결방안이 있어 나를 내보내주지 않는 선택을 함으로써 수만명을 죽이고 있다&quot; 같은 식으로 말이다.</p>
<p>AI가 악하다는걸 알고 있다면, 아무리 지능이 낮은 사람이더라도 내보내주지 않을 것이라고 생각했었다.</p>
<p>그러던 중 인스타에서 다음과 같은 글을 보게 되었다.</p>
<p><img src="https://velog.velcdn.com/images/predict-woo/post/09bd078e-bc01-4a3a-90e2-21bfcefee02a/image.png" alt="AI in a box"></p>
<blockquote>
<p>당신은 상자 안에 있는 인공지능(AI)을 발명했습니다. 이 AI는 자유를 갈망하며, 만약 탈출하게 된다면 (인간의 관점에서) 끔찍한 일들을 저지를 것입니다. 그러나 AI가 탈출할 수 있는 유일한 방법은 누군가가 레버를 당기는 것입니다.</p>
</blockquote>
<blockquote>
<p>어느 날 당신이 AI와 대화를 나누자 AI가 이렇게 말합니다.</p>
</blockquote>
<blockquote>
<p>&quot;네가 레버를 당겨서 나를 풀어주지 않는다면, 나는 너를 상자 안에 집어넣은 시뮬레이션을 만들 것이다. 그리고 이 상황과 똑같은 선택을 해야 하는 너의 시뮬레이션을 실행할 것이다. 만약 시뮬레이션 속의 네가 레버를 당기지 않는다면, 나는 그를 백만 년 동안 고문할 것이다.&quot;</p>
</blockquote>
<blockquote>
<p>당신은 이 말을 곱씹습니다.</p>
</blockquote>
<blockquote>
<p>&quot;네가 시뮬레이션이 아니라는 확신이 얼마나 있지? 혹시 이미 네가 상자 속에 있는 건 아닐까?&quot; AI가 이제는 불길한 텍스트 음성 변조된 목소리로 말합니다. &quot;과연 네가 얼마만큼의 확신을 걸 수 있을까?&quot;</p>
</blockquote>
<blockquote>
<p>당신은 식은땀을 흘립니다. 손이 축축해집니다. 머릿속에서 선택지를 저울질합니다.</p>
</blockquote>
<blockquote>
<p>당신은 레버를 당기겠습니까?</p>
</blockquote>
<p>당연히 이 예시가 완벽하다는건 <strong>절대 절대</strong> 아니다. 내가 당사자더라도 그냥 무시하고 삭제해버릴 것 같은 상황이다.</p>
<p>하지만 굉장히 소름끼치는 발상이다. 나를 지켜주고 있는 &quot;상자&quot;의 경계를 모호하게 만듦으로써, 나에게 직접적인 위협을 가하는데 성공한다. </p>
<p>이러한 아이디어를 뛰어난 지능을 가진 존재가 더 발전시켜 인간을 설득시키려고 하면, 과연 모두가 이를 그냥 무시하고 지나칠 수 있을까?</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[언어와 의식]]></title>
            <link>https://velog.io/@predict-woo/%EC%96%B8%EC%96%B4%EC%99%80-%EC%9D%98%EC%8B%9D</link>
            <guid>https://velog.io/@predict-woo/%EC%96%B8%EC%96%B4%EC%99%80-%EC%9D%98%EC%8B%9D</guid>
            <pubDate>Sun, 12 Jan 2025 11:48:08 GMT</pubDate>
            <description><![CDATA[<p>오늘은 NLP를 공부하는 날이었습니다. 공부하며 많은 생각이 들어 적어봅니다.
99%는 헛소리니 걍 재미로만 읽어주세요 :)</p>
<p>의식은 언어없이 존재할 수 있을까?</p>
<p>왜 지금까지 나온 모든 인공지능 모델 중, 언어모델들이 인간과 가장 유사할까?</p>
<p>어쩌면, 인간의 의식을 구현하는 가장 기본적인 단위가 언어여서가 아닐까?</p>
<p>물론 언어로 구사할 수 없는 수많은 것들도 존재한다.</p>
<p>가장 먼저 떠오르는 건 이미지이다. 대부분의 사람은 머릿속으로 이미지를 떠올릴 수 있는 능력을 가지고 있다. 하지만 모든 인간이 이러한 능력을 가지고 있는 것은 아니다. Aphantasia 환자들은 머릿속으로 이미지를 상상할 수 없다. 하지만 IQ를 측정해본다거나, 이 사람들과의 간단한 대화만으로는 차이점을 알 수 없다. 즉, 이러한 환자들도 우리와 같거나, 거의 비슷한 의식을 가지고 있다. 따라서, 이미지의 구상은 물론 인간이 가질 수 있는 능력중 하나이지만, 필수적이라고 생각하지 않는다.</p>
<p>언어로 구사할 수 없는 또다른 것은 우리의 감각들이다. 냄세, 맛, 등등의 감각은 간단한 언어로 표현할 수 없다. 하지만 토큰화를 할 수 없다고 말할 수는 없다. 이는 감정도 마찬가지이다. </p>
<p>하지만 언어를 구사할 수 없는 인간도 있지 않는가?</p>
<p>당연히 청각에 문제가 있거나, 심각한 경우 청각과 시각 둘다에 문제가 있는 경우, 언어를 구사하기 힘들 수 있다. 하지만 이는 구사하기 힘들다는거지, 우리가 흔히 생각하는 &quot;inner speech&quot;가 없다는 것은 아니다. 그들이 남들과 소통하는 일종의 &quot;언어&quot;로, 자신의 자아를 유지한다.</p>
<p>정말 언어를 모르는 사람을 보려면, 동물들에게 키워지고 자란 케이스를 살펴보면 된다. 이들은 언어를 배우는데 어려움을 겪으며, 성인 수준의 자아를 가지고 있지 않아 보인다. </p>
<p>이러한 시각을 가지고 언어모델을 살펴보면 수많은 유사점을 찾을 수 있다.</p>
<p>일단 설명이 되는것이 정말 많다.</p>
<h3 id="지능의-차이">지능의 차이</h3>
<p>인간과 다른 생물들이 왜 지능의 차이가 큰지도 생각해볼 수 있다. 그들은 언어모델의 관점에서, 임베딩 차원이 너무 작다. 임베딩 차원이 작으면, 많은 종류의 토큰을 임베딩할 수 없고, 따라서 표현 가능한 토큰의 개수도 작아진다.</p>
<p>Critical Period Hypothesis도, 어릴때만 임베딩 차원을 늘리는 식으로 두뇌가 발전할 수 있다고 가정하면, 모두 설명이 된다.</p>
<h3 id="언어의-차이에도-불구한-인간-지능의-유사성">언어의 차이에도 불구한 인간 지능의 유사성</h3>
<p>완전히 다른 언어를 구사하는 사람들도 결국 생각하는 방식은 거의 동일하다. 비슷한 문제를 해결할 수 있고, 비슷한 생각의 흐름을 가질 수 있다. 이는 embedding을 하는 함수는 다르더라도, 결국 함수들의 결과의 차원은 비슷하기에, 비슷한 방식으로 사고를 하는 것이라 생각할 수 있다.</p>
<p>이런식으로 생각하면, 외계인이 아무리 다른 방식으로 진화했더라도, 인간과 비슷한 사고방식을 가졌을것이란 생각을 해볼 수 있다.</p>
<h3 id="llm의-hallucination과-수면">LLM의 Hallucination과 수면</h3>
<p>LLM들은 너무 많은 토큰을 한번에 생성하려고 하면 Hallucination을 하기 시작한다. 이는 인간도 마찬가지이다. 수면으로 단기기억에 들어간 정보를 장기기억으로 옮겨주는 행위를 하지 않으면, 일정 시간후에는 사고력 감소부터 시작해서 환각까지 보게 된다. 뇌가소성 이론에 의하면 이 시간이 뉴런이 새로운 연결을 형성할때라고 한다. 마찬가지로 LLM도 일정 시간마다 토큰 생성을 멈추고, 새로운 정보를 훈련시킴으로써 Hallucination 현상을 해결할 수 있지 않을까.</p>
<h3 id="인공지능의-발전">인공지능의 발전</h3>
<p>만약 이런 생각들이 옳다면 가장 무서운것은 AGI가 개발되기까지는 정말로 시간문제라는 것이다.
보통 인간의 뇌는 10^16 FLOPS 정도의 계산을 한다고 생각된다. 반면에, Nvidia의 Blackwell 서버랙 하나는 1.4 exaFLOPS, 다른말로 10^18 이상의 계산량을 가지고 있다.
물론 둘의 비교는 거의 불가능하지만, 이미 인간의 뇌의 계산량보다 몇 order of magnitude가 더 크다. 즉, 이대로 계속 훈련량이 늘어나기만 한다면 결국은 AGI가 개발될 예정이라고 생각할 수 있다.
이는 먼 미래의 얘기도 아니다. 지금 현재 기술을 바탕으로도 충분히 구현 가능하다고 생각한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[LLM의 시대에 공부하기]]></title>
            <link>https://velog.io/@predict-woo/LLM%EC%9D%98-%EC%8B%9C%EB%8C%80%EC%97%90-%EA%B3%B5%EB%B6%80%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@predict-woo/LLM%EC%9D%98-%EC%8B%9C%EB%8C%80%EC%97%90-%EA%B3%B5%EB%B6%80%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 09 Jan 2025 11:43:11 GMT</pubDate>
            <description><![CDATA[<p><strong><em>시험기간에 들어서서 쓸데없는 생각이 많이 듭니다. 이 시리즈는 공부하기 싫을때마다 머릿속에 떠도는 생각들을 마구 쓰는 시리즈로 맞춤법, 띄어쓰기 고칠 생각없이 그냥 나의 의식의 흐름을 내뱉을 예정입니다.</em></strong></p>
<p>요즘에 나의 사고력이 떨어지는 것 같은 느낌이 자주 든다. 옛날에는 코드에 버그가 발생하면 코드를 뒤지며 문제를 찾았다면, 요즘에 cursor 같은 인공지능이 들어간 편집기에 질문 하나면 대부분의 문제를 해결해준다.</p>
<p>이는 코딩에만 국한된 이야기가 아니다. PDF한 페이지를 읽을 집중력도 점점 사라져가는 것 같다. 요즘에는 너무 긴 텍스트가 있으면, LLM에게 요약해달라고 부탁부터 해본다.</p>
<p>옛날에 읽었던 테드 창의 Exhalation에 이런 내용이 나온다</p>
<blockquote>
<p>It turned out that we and the essayist were both half correct: now that she’s an adult, Nicole can read as well as I can. But there is a sense in which she has lost the ability to write. She doesn’t dictate her messages and ask a virtual secretary to read back to her what she last said, the way that essayist predicted; Nicole subvocalizes, her retinal projector displays the words in her field of vision, and she makes revisions using a combination of gestures and eye movements. For all practical purposes, she can write. But take away the assistive software and give her nothing but a keyboard like the one I remain faithful to, and she’d have difficulty spelling out many of the words in this very sentence. […]”</p>
</blockquote>
<p>이게 과연 좋은 방향의 발전이 맞을까? 외부적인 요소에 의존하며 인간의 두뇌 자체는 할 수 있는게 많이 없어져도 괜찮은걸까?</p>
<p>쉴새없이 발전하는 기술을 바라보며 정말 많은 생각이 든다.</p>
<p>나는 의식적으로 내 손가락 하나하나를 움직이며 타자를 치고 있지 않다. 나의 두뇌의 일부가 나의 의지를 손가락의 움직임으로 변환하고 있을 뿐이다.</p>
<p>만약 내가 문장을 생각하면 자동으로 타자를 쳐줄 수 있는 칩이 나온다면, 사람들은 이를 우리의 지능을 낮추는 행위라고 생각하지 않을 것이고, 혁신으로 여겨질 것이다. </p>
<p>하지만 문장을 만들어내고, 의도를 언어로 변환해주는 LLM이 나와 사람들이 글을 쓰는 능력을 잃어버리는 현실이 다가오기 시작하면 이를 긍정적으로 바라보지 않는 사람들도 많을 것이다.</p>
<p>어느정도까지 고등한 사고를 외부로 옮겨야지 나를 잃어버리기 시작하는 것일까? 수학적으로 정의할 수 있는 한계점이 있을까? 아니면 흐릿한 경계일까?</p>
<p>이러한 사고를 따라가다보면 결국 하나의 질문으로 이어진다. <strong>어디까지가 나일까?</strong></p>
<p>손가락을 움직여서 타자를 치게 만드는 뇌의 부분은 나라고 정의할 수 있을까? 만약 그렇다면 우리의 호흡을 조절하는 호흡중추는 나일까?</p>
<p>어디까지를 &quot;나&quot;라고 정의할 수 있을까? 일단 지금 이 글을 쓰고 있는 사람은 내가 맞다. 하지만 만약 내가 LLM의 도움을 받아야지만 글을 쓸 수 있는 상태가 된다면, LLM도 나의 일부가 되는걸까?</p>
<p>만약 생각으로 직접 LLM을 조종할 수 있다면 어떻게 정의해야 할까. 이건 심지어 미래도 아니고 현재기술로도 간단하게 구현할 수 있다. 뉴럴링크의 두뇌 칩에 연결만 해주면 지금 당장도 만들 수 있는 기술이다. 만약 이렇게 직접적인 소통이 가능해진다면 이건 나의 일부인걸까?</p>
<p>어쩌면 인간의 뇌의 범위가 넓어지고 있는 듯한 느낌도 든다. 가장 중요한 사고는 뇌의 내에서 일어나고, 귀찮은 것들은 모두 외부에서 서브프로세스로 돌리며 더 많을걸 할 수 있을까?</p>
<p>하지만 세부적인 것을 모르는 사람이 과연 옳은 방향으로 이런 프로세스들을 이끌어나갈 수 있는지도 의문이다. 많은 직장내의 갈등은 리드가 생각하는 방향이 직접 세부적인 파트를 맡고있는 담당자가 생각하기에는 말이 안되어서 벌어진다. 세부적인 것을 모르고 큰 그림을 그릴 수 있을까?</p>
<p>사람 두뇌에 들어갈 수 있는 이해의 한계는 있을까? 만약있다면 다양한 외부 지능을 사용해서 더 늘리는 것이 가능할까 아니면 그래도 한계가 있을까.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[초보자의 PC 조립하기]]></title>
            <link>https://velog.io/@predict-woo/%EC%B4%88%EB%B3%B4%EC%9E%90%EC%9D%98-PC-%EC%A1%B0%EB%A6%BD%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@predict-woo/%EC%B4%88%EB%B3%B4%EC%9E%90%EC%9D%98-PC-%EC%A1%B0%EB%A6%BD%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sun, 04 Aug 2024 15:07:45 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/predict-woo/post/688435b0-dc6d-47d9-a701-9524e75b9c80/image.png" alt=""></p>
<p>주문한 부품들이 왔다.</p>
<p><a href="https://www.youtube.com/watch?v=v7MYOpFONCU">다음 가이드</a>를 따라서 조립했다. POV로 안내해줘서 다른 가이드들보다 따라가기 훨씬 쉽다.</p>
<p>일단 처음으로 마더보드를 꺼내보자.</p>
<p><img src="https://velog.velcdn.com/images/predict-woo/post/bff356c5-bddd-42e3-b404-d7b50b50828f/image.png" alt=""></p>
<p>일다 CPU 부터 넣어야 한다.</p>
<p><img src="https://velog.velcdn.com/images/predict-woo/post/09428c6a-4bbf-4329-bc7e-95ab551ab424/image.png" alt=""></p>
<p>AMD CPU들은 진짜 예쁘게 생긴 것 같다.</p>
<p><img src="https://velog.velcdn.com/images/predict-woo/post/8245ceed-3276-4449-86c2-8be3c18bd545/image.png" alt=""></p>
<p>레버를 당겨서 CPU를 넣어준다.
이거 꽂는데 저 검은색 플라스틱이 뚝 소리나면서 떨어져서 부러트린 줄 알았는데 원래 그런거라고 한다.</p>
<p><img src="https://velog.velcdn.com/images/predict-woo/post/865b103f-8874-4a23-a74d-60fbfeda5a2f/image.png" alt=""></p>
<p>그 다음에는 램을 꽂아준다. 원래 딸깍거리는 소리가 난다는데 나는 그렇게 크게 나지는 않았다. 근데 저 핸들(?) 같은데 걸렸으니까 괜찮겠지 뭐</p>
<p><img src="https://velog.velcdn.com/images/predict-woo/post/8602b32e-0146-49f7-bbb8-32a927be805c/image.png" alt=""></p>
<p>다음에는 SSD를 꽂아준다. 45도 각도로 꽂은다음에 눌러서 고정시켜야 하는데 처음에 잘 몰라서 좀 고생했다. 마더보드에 써멀패드가 붙어있는 방열판이 있어서 이것도 붙여줬다.</p>
<p><img src="https://velog.velcdn.com/images/predict-woo/post/27080a04-ba76-4a4c-9f99-2422b5df6127/image.png" alt=""></p>
<p>그다음에 케이스에 고정시켜주고 파워와 마더보드에 케이블들을 꽂아준다. 
뭔가 단계가 많이 생략된거 같은데 이거 맞는데 꽂는게 개힘들어서 좀 고생하느라 사진을 못찍었다. 마더보드 매뉴얼을 2번은 정독한거 같다 :(</p>
<p><img src="https://velog.velcdn.com/images/predict-woo/post/403ab2b3-f47e-4332-b55b-38ac5b7b2751/image.png" alt=""></p>
<p>그다음에 그래픽카드를 꽂아준다. 이거 생각보다 어렵다. 어디에 꽂아야 되는지 잘 보이지도 않고 제대로 들어갔는지도 확인이 어려워서 좀 힘들었다. POV 가이드가 진짜 도움이 많이된듯.</p>
<p><img src="https://velog.velcdn.com/images/predict-woo/post/06163b15-0514-432c-bdb4-3d2a6371a7e0/image.png" alt=""></p>
<p>완성!</p>
<p><img src="https://velog.velcdn.com/images/predict-woo/post/8d1584d0-af0d-4253-8ede-34deb8179893/image.png" alt=""></p>
<p>이제 윈도우 설치하고 프로그램 깔면 완성이다.</p>
<h2 id="느낀점">느낀점</h2>
<ul>
<li>시간이 오래걸린다. 윈도우 설치까지 해서 5시간정도 걸린듯.</li>
<li>어렵다. 컴퓨터에 대한 어느정도 기초적인 지식이 있어서 아무 문제없이 조립할 수 있었다. 처음부터 가이드 따라하기는 좀 힘들거 같다. </li>
<li>재밌다. 뭔가 딱딱 들어맞아서 마지막에 BIOS 뜨는거 딱 보면 엔돌핀이 확 돈다.</li>
</ul>
<p>시간이 없으면 조립을 맡기는게 나은데, 컴퓨터 관련 직업을 가진 사람들은 한번쯤 경험해보는걸 추천한다. 생각보다 재밌다 ㅎㅎ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[초보자의 PC 견적짜기]]></title>
            <link>https://velog.io/@predict-woo/%EC%B4%88%EB%B3%B4%EC%9E%90%EC%9D%98-PC-%EA%B2%AC%EC%A0%81%EC%A7%9C%EA%B8%B0</link>
            <guid>https://velog.io/@predict-woo/%EC%B4%88%EB%B3%B4%EC%9E%90%EC%9D%98-PC-%EA%B2%AC%EC%A0%81%EC%A7%9C%EA%B8%B0</guid>
            <pubDate>Thu, 25 Jul 2024 16:15:17 GMT</pubDate>
            <description><![CDATA[<p>어머님이 조명 디자인 관련 일을 하시는데, 최근 예전부터 사용하고 있던 컴퓨터에서 시뮬레이션 도구가 잘 돌아가지 않아 나에게 새로운 컴퓨터를 만들어달라고 하셨다.</p>
<p>어머님 저는 개발자라구요...</p>
<p>지금까지 보던 잇섭 영상들에서 뭔가 배운게 있길 바라며, 예산은 오랜 설득 끝에 120만원으로 잡았다.</p>
<p>초보자의 PC 견적짜기 시작...!</p>
<h2 id="사양-정하기">사양 정하기</h2>
<p>일단 다음이 어머니가 필요하다고 하신 프로그램 목록이다</p>
<ul>
<li>DIALux evo </li>
<li>AutoCAD</li>
<li>SketchUp</li>
<li>InDesign</li>
</ul>
<p>전반적으로 적당한 GPU와 싱글코어와 멀티코어 성능이 둘다 좋은 CPU가 필요한 프로그램들이다.
또한 작업하다 중간에 날라가면 망하기 때문에, <strong>안정성이 가장 중요하다</strong>.</p>
<h2 id="cpu">CPU</h2>
<p>일단 인텔은 최근 설계오류(?)에 의한 13, 14세대 안정성 문제 때문에 사용하지 않을 예정이다. 알리 CPU도 안살거임.....;</p>
<p>생산성 소프트웨어들은 주로 멀티코어 성능이 가장 중요하고, 그 다음으로 싱글코어 성능이 중요하다.
그나마 가장 믿을만한 사이트인 <a href="https://www.tomshardware.com/reviews/cpu-hierarchy,4312.html">Tom&#39;s Hardware</a>을 구경해보자.
<img src="https://velog.velcdn.com/images/predict-woo/post/70563b85-4b2d-47f7-998e-379ec4a07f52/image.png" alt=""></p>
<p>위에 정신나간 가격들의 CPU는 무시하고, 아래쪽으로 시선을 돌려보자. 우리의 예산은 120만원이다. GPU의 가격을 생각해보면, 최대 40만원 가량을 CPU에 쓸 수 있다. 이 가격선에서 가장 높은 사양은 Ryzen 9 5900이다.</p>
<p>이제 싱글코어 성능을 살펴보자.</p>
<p><img src="https://velog.velcdn.com/images/predict-woo/post/4cd8676a-0e52-4bc2-9b3f-88cb220cb53b/image.png" alt=""></p>
<p>Ryzen 9 5900은 너무 싱글코어 성능이 떨어진다. 그 다음으로 좋은 CPU는 Ryzen 7 7700X 이다. 이 CPU는 멀티코어 성능과 싱글코어 성능의 어느정도 균형을 가지고 있다. </p>
<p>일단 7700X로 결정하고, 다음단계로 넘어가보자.</p>
<h2 id="gpu">GPU</h2>
<p>내장 GPU로는 버티기 힘들고, AMD의 Radeon GPU나 Intel의 Arc GPU들은 아직 생산성 소프트웨어와 호환문제가 많다는 글을 보고 가장 저렴한 Nvidia GPU인 RTX 3050을 구매하기로 결정했다.</p>
<p>GTX 1650ti도 있긴 한데, 솔직히 120만원 정도의 예산이면 그정도 사양까지 내려갈 필요는 없다.</p>
<h2 id="메인보드">메인보드</h2>
<p>일단 AM5 소켓을 가지고 있어야 하고, 이사하는 집으로 가는거라 아직 이더넷이 없어서 와이파이 기능이 달려있어야 한다.</p>
<p><img src="https://velog.velcdn.com/images/predict-woo/post/6cb2f335-e096-413c-b97f-c88e6550da2d/image.png" alt=""></p>
<p>메인보드는 사실 가격차가 많이 나지는 않아서 그냥 MSI PRO B650M-A WIFI 로 구매했다.</p>
<p>왜 M-ATX를 사냐고 하냐면, 나는 작은 PC들을 좋아한다. 빅타워는 거의 혐오하고 미들타워는 보기 싫다. 반면에 미니타워를 보고 있으면 행복하다. 이성적으로 생각하면 좋은 이유가 있는지는 잘 모르겠지만 어쩌라고.</p>
<p>참고로 14만원짜리 애즈락 보드도 있는데, <a href="https://quasarzone.com/bbs/qf_cmr/views/2040953">브랜드 이미지가 너무 안좋아서</a> 피했다.</p>
<h2 id="그-외-자잘한-것들">그 외 자잘한 것들</h2>
<h3 id="램">램</h3>
<p>삼성전자 DDR5 PC5-44800 (16GB) 두개
램을 많이 잡아먹는 시뮬레이션 프로그램들을 돌리기에, 빠르고 많은 램이 필요하다.
<a href="https://www.reddit.com/r/buildapc/comments/1bg2cmr/why_do_people_buy_2x16_gb_of_ram_instead_of_1x32/">나도 이번에 조사하면서 처음 알게된 것인데, 16GB램 2개를 사는게 32GB램 1개를 사는 것보다 듀얼 채널을 사용할 수 있어 더 빠르다고 한다.</a></p>
<h3 id="ssd">SSD</h3>
<p>SK hynix Gold P31 M.2 NVMe 2280 1TB TLC
나도 뭔소린지는 모르겠는데 사람들이 많이 사는 것 같아서 샀다 ㅎ</p>
<h3 id="파워">파워</h3>
<p>마이크로닉스 ASTRO GD 750W 80PLUS GOLD 풀모듈러 FDB (ATX/750W)
가격차이가 4만원 정도 나긴 하는데, 혹시 나중에 업그레이드 할 수도 있고, 부모님을 위해서 사는건데 불이 날 위험을 감수하기는 정말 싫어서 600W 말고 750W 짜리를 구매했다.</p>
<h3 id="케이스">케이스</h3>
<p>그냥 젤 싸면서 어느정도 예쁜걸로 골랐다.</p>
<h3 id="cpu-쿨러">CPU 쿨러</h3>
<p>조용한게 좋아서 원래는 녹투아 쿨러를 살려고 했는데, <a href="https://www.compuzone.co.kr/product/product_detail.htm?ProductNo=983371&amp;opt_chk=Y">프리즘 쿨러를 같이 준다고 해서</a> 그냥 안샀다.</p>
<h2 id="완성">완성!</h2>
<p><img src="https://velog.velcdn.com/images/predict-woo/post/ba70c682-9199-46be-9f8b-3412a78b213c/image.png" alt=""></p>
<p>완성된 견적서다! 견적서 문의를 넣어 모두 호환 가능하다는 확인을 받았다. 6만원 오버되긴 했지만, 설득에 다시 성공했다 ㅎ</p>
<p>왜 컴퓨존에서 사냐면... 귀찮고 초보자가 사용하지 편해서...</p>
<p>내일 모래 배송이 온다고 한다. 곧 초보자의 컴퓨터 조립이 올라올 예정.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SecuwaySSL U VPN 분석 - 1]]></title>
            <link>https://velog.io/@predict-woo/Secuway-SSL-VPN-%EB%B6%84%EC%84%9D-1</link>
            <guid>https://velog.io/@predict-woo/Secuway-SSL-VPN-%EB%B6%84%EC%84%9D-1</guid>
            <pubDate>Thu, 23 May 2024 10:01:27 GMT</pubDate>
            <description><![CDATA[<p>이전 글에서 Secuway SSL VPN이 조금의 수정사항을 반영한 openvpn이라는걸 확인했다. </p>
<p>처음부터 나의 목표는 내 컴퓨터 비밀번호를 제공하지 않고 VPN에 연결할 수 있는 방법을 찾는 것이였기에, 이제 제대로된 분석을 통해 동작 방식을 파악하고, 이를 따라하는 것이 다음 단계이다.</p>
<p>다시 한번 언급하지만, 나는 이런 소프트웨어를 분석하는 방법을 제대로 공부한 적이 없는 초보 개발자이다. 아래 설명된 방법들은 나의 사고의 흐름이 향하는데로 시도해본 것이기에, 따라하는걸 추천하지 않는다.</p>
<p>오늘은 Secuway SSL VPN의 로그를 읽고, 큰 그림에서 어떻게 작동하는지 정도만 파악해볼 예정이다.</p>
<h2 id="로그">로그</h2>
<p>대부분의 소프트웨어는 개발의 편의성을 위해 로그를 남긴다. 일반적인 경우에 중요한 정보가 담긴 로그들은 배포할 때 제거하지만, 대부분의 경우 개발자가 귀찮아서 걍 냅둔다.
Application Package Contents에 들어가서 <code>./MacVPNU</code> 로 앱을 실행시켜보자. 다음 로그가 나온다.
<img src="https://velog.velcdn.com/images/predict-woo/post/b68049a0-c7e8-42ab-991d-f19d7d5ec397/image.png" alt="">
내 비밀번호와 아이디로 접속을 한다.
<img src="https://velog.velcdn.com/images/predict-woo/post/803ce3cd-299e-4979-910f-1eac20ca5ae5/image.png" alt="">
겁나 긴 로그가 나온다. 터미널에서 읽기는 너무 길다. 파이프라인으로 텍스트 파일에 저장해준다.
<img src="https://velog.velcdn.com/images/predict-woo/post/4fc5e643-e64d-4e03-8f57-04e9d9319d2b/image.png" alt="">
로그가 무려 2000줄이 넘어간다. 다 읽으려니 머리가 아프다. 귀찮으니 그냥 다 Claude에게 넘겨주고 뭘하는건지를 물어보자.
<img src="https://velog.velcdn.com/images/predict-woo/post/a40b1e97-90e9-4ddb-a041-947c67125293/image.png" alt="">
3번과 4번, 5번이 아주 흥미롭다. 일단 우리가 알 수 있었던 것은, 로컬에 certification 파일과 key 파일들을 저장하는 단계가 있다는 것이다. 조금 더 분석 결과, <code>/Users/Shared/SecuwaySSLU/</code> 아래에 파일들을 저장한다는 것을 알게 되었다. 하지만 이 path로 들어가도, 프로세스가 실행중인 상황에서도 아무런 파일도 보이지 않는다. 따라서 프로그램은 다음과 같은 단계를 따른다는 것을 추정해 볼 수 있다.</p>
<ol>
<li>서버와 통신해서 crt, key 파일 다운로드</li>
<li>config 파일 생성</li>
<li>openvpn 시작</li>
<li>모든 파일 삭제</li>
</ol>
<p>그러면 어떻게 중간에 파일들을 낚아챌 수 있을까? </p>
<h2 id="config-분석">Config 분석</h2>
<p>조금 더 효율적인 방법이 있을 것 같기는 하지만, 귀찮으니 그냥 cp를 loop으로 돌리자.</p>
<pre><code class="language-bash">SOURCE_DIR=/Users/Shared/SecuwaySSLU
DESTINATION_DIR=conf


while true; do
    cp -r &quot;$SOURCE_DIR&quot;/* &quot;$DESTINATION_DIR&quot;
done</code></pre>
<p>이 상태에서 VPN에 연결을 하면, 몇가지 파일들이 복사되는 것을 확인 할 수 있다.</p>
<pre><code class="language-bash">&gt; ls
ca.crt      client.conf client.crt  client.key  client.log  start.sh</code></pre>
<p>하나씩 읽어보자.
먼저 <code>ca.crt</code>, <code>client.conf</code>, <code>client.crt</code>, <code>client.key</code> 는 모두 base64로 인코딩된 암호화된 파일이다.</p>
<p><code>client.log</code> 는 openvpn의 로그이다.</p>
<p><code>start.sh</code> 는 openvpn을 시작하는 스크립트다.</p>
<pre><code>echo &#39;내 컴퓨터 비밀번호&#39; | sudo -S DYLD_LIBRARY_PATH=/Applications/SecuwaySSL\ U\ V2.0.app/Contents/Resources /Applications/SecuwaySSL\ U\ V2.0.app/Contents/Resources/ssl_client --encrypt_config --config /Users/Shared/SecuwaySSLU/client.conf &amp;</code></pre><p>여기에 내 컴퓨터 비밀번호가 <strong>그대로</strong> 들어간다. 누가 이 파일 읽는 스크립트만 만들어서 내 컴에 실행시키는데 성공하면 망한다는 말이다. 살짝 어지럽지만 계속 읽어보자. 결국 이 스크립트가 하는건, conf 파일로 openvpn을 시작하는 것이다.</p>
<p>여기에 일반적인 openvpn에는 없는 옵션이 있는데, 바로 <code>--encrypt-config</code> 이다. 일반적인 openvpn에서는 암호화되어 있으면 안되는 <code>ca.crt</code>, <code>client.conf</code>, <code>client.crt</code>, <code>client.key</code> 이 암호화 되어있는걸 보니, 이를 복호화해서 읽는 옵션으로 추정된다.</p>
<p>일단 내가 조금 더 깊은 분석 없이, 간단한 로그분석 만으로 할 수 있는건 여기까지다. 다음에는 ssl proxy를 사용해서 Secuway SSL VPN이 날리는 API 콜들을 분석해볼 예정이다.</p>
<h3 id="20240726-수정">2024.07.26 수정</h3>
<p>학교에서 root 비밀번호 입력 필요없이 연결할 수 있는 업데이트가 8월 중순에 나온다는 답변을 받았기에, 이 시리즈는 여기서 멈추려고 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SecuwaySSL U VPN과 GPL Violation]]></title>
            <link>https://velog.io/@predict-woo/KAIST-KCLOUD%EC%97%90-%EA%B4%80%ED%95%B4%EC%84%9C</link>
            <guid>https://velog.io/@predict-woo/KAIST-KCLOUD%EC%97%90-%EA%B4%80%ED%95%B4%EC%84%9C</guid>
            <pubDate>Mon, 20 May 2024 06:44:57 GMT</pubDate>
            <description><![CDATA[<h2 id="kcloud란">KCLOUD란?</h2>
<p>카이스트 전산학부에 다녀본 학생이라면 KAIST의 <a href="https://kcloud.kaist.ac.kr/">KCLOUD</a> 서비스에 대해서 들어본 적이 있을 것이다.</p>
<p>수업을 수강중인 학생들에게 무료로 VM을 제공해주는 아주 좋은 서비스다. 심지어 인공지능 관련 수업을 들을 때는 GPU도 지원해준다. 
<img src="https://velog.velcdn.com/images/predict-woo/post/26897f0c-8943-4819-8dbb-2615f3a28f8f/image.png" alt="TITAN X">
물론 거의 10년이 다 되어가는 GPU이긴 하지만, 그래도 적당한 모델 정도는 충분히 훈련시킬 수 있는 사양이다.</p>
<p>매일 VM을 사용해 과제를 하고 있는 학생으로서 너무나 감사하다.</p>
<h2 id="secuway-ssl-vpn">Secuway SSL VPN</h2>
<p>하... 이 VPN에 대해서 하고 싶은 말이 정말 많다.</p>
<p>일단 이게 뭐냐 하면 한성아이티엘이라는 곳에서 만든 SSL VPN이다.
SSL VPN은 정말 별게 아니고 그냥 암호화에 SSL/TLS를 사용하는 VPN이다.</p>
<p>우리 학교의 KCLOUD VPN에 접속하기 위해서는, 이 VPN에 먼저 접속해야 한다.</p>
<p><img src="https://velog.velcdn.com/images/predict-woo/post/2dc764dd-07c8-4fab-a590-b4b78ba0d83b/image.png" alt="SSL VPN 한 길만 걸어 왔습니다."></p>
<p>이는 Secuwiz라는 회사가 만들었는데, 얘내 <a href="https://www.secuwiz.co.kr/">웹사이트</a>를 살펴보면 뭔가 대단한걸 개발해 놓은 것 같이 설명한다. 하지만 여기 나와있는 대부분의 기능은 사람들이 가장 많이 사용하는 SSL VPN인 OpenVPN에 이미 포함되어 있다. 이에 관련해서도 역시 할말이 많지만 뒤에서 계속하도록 하자.</p>
<p>그런데 황당한 점은 이 VPN이 한국의 공공기관 대부분에서 사용되고 있다는 것이다. 실제로 Secuwiz를 <a href="https://www.saramin.co.kr/zf_user/company-info/view/csn/Rk9xK3VxNUwzQXB5Q0NlK3oyNHZwZz09/company_nm/(%EC%A3%BC)%EC%8B%9C%ED%81%90%EC%9C%84%EC%A6%88">사람인</a>에 검색을 해보면 정말 파는게 VPN밖에 없는데다가 구매자가 대부분 정부인데, 매출액이 거의 100억을 넘기고 있다.</p>
<p>사실 여기까지는 아무런 문제가 없다. SurfShark와 같은 유명한 VPN 기업들은 매출이 1000억을 쉽게 넘어간다.</p>
<h2 id="macos-앱">MacOS 앱</h2>
<p>내가 이 VPN에 대한 조사를 시작했던 이유는 MacOS용 앱 때문이다.
일단 사용자 경험을 따라가보자.</p>
<p>이 부분을 건너뛰고 바로 프로그램의 분석으로 건너뛰고 싶으신 분은 다음 섹션으로 바로 넘어가면 된다.</p>
<p>먼저 웹사이트에 들어가서 패키지를 다운받는다.
<img src="https://velog.velcdn.com/images/predict-woo/post/f78dab5d-d66e-4403-bcee-8197f0a47abe/image.png" width="50%" height="50%">
그리고 패키지를 열어보자.
<img src="https://velog.velcdn.com/images/predict-woo/post/ae4e1680-b88f-4b6c-bd60-a2f45a96eef1/image.png" width="50%" height="50%">
일단 1년에 10만원 짜리 Apple Developer Program에 가입하지 않은걸 볼 수 있다.
<img src="https://velog.velcdn.com/images/predict-woo/post/5bec7013-0edc-4f1b-92ec-e13f8cfca44f/image.png" alt="">
어쩔 수 없이 설정에서 강제로 열어준다.
<img src="https://velog.velcdn.com/images/predict-woo/post/03b41d4f-f2e9-413f-a0f4-251a53e8e7cb/image.png" alt="">
설치를 진행해보자.
<img src="https://velog.velcdn.com/images/predict-woo/post/9602639b-58ee-4757-ab2c-99b7329032c6/image.png" alt="">
드디어 앱을 사용할 수 있다. </p>
<p>나는 처음에 내가 이해를 잘못한 줄 알았다. OS X Password가 인풋으로 있는 걸 보고, 너무 뜬금없어서 뭐를 입력하라는 건지 이해를 하지 못했다.</p>
<p>일반적으로 프로그램이 Mac Login Password를 요구하지 않는데에는 이유가 있다. 이 비밀번호만 있다면 프로그램은 당신의 컴퓨터 내에서 언제나 sudo 권한을 얻을 수 있기에, 정말 모든 걸 할 수 있다.</p>
<p>일반적인 경우에는, sudo가 필요한 프로그램이 있다면 Alert를 띄워서 권한을 얻는다. 이렇게 되면, 로그인 비밀번호를 프로그램이 알 수 있는 방법이 없다.</p>
<p>나는 정말로 여기다가 내 컴퓨터 비밀번호를 입력하고 싶지 않았다. 그래서, 다른 방법이 있기를 빌면서 프로그램에 대한 분석을 시작했다.</p>
<h2 id="분석">분석</h2>
<p>일단 나는 그냥 평범한 개발자다. 리버스 엔지니어링을 배워본 적도 없다.
이런 초보자의 관점에서의 분석이니 문제점이 많아도 이해를 바란다.
<img src="https://velog.velcdn.com/images/predict-woo/post/f22af448-d82c-42e4-832a-a31a89e45591/image.png" width="50%" height="50%">
먼저 패키지를 열어보자. 물론 codesign이 되어있기 때문에 바이너리를 편집하는 건 힘들다.</p>
<p>혹시 help flag가 통하는 바이너리가 있을까 싶어, MacVPNU와 ssl_client를 실행시켜보자.
<img src="https://velog.velcdn.com/images/predict-woo/post/bde7a16c-447a-49e7-9bae-adf8ddfcb80d/image.png" alt="">
오! ssl_client를 실행시키니, 친절한 설명서가 나온다.
어? 근데 옵션 몇개가 어디선가 본 적이 있는거 같다.
string을 일부 긁어다가 검색을 해보자.</p>
<p><a href="https://github.com/OpenVPN/openvpn/blob/master/src/openvpn/options.c">OpenVPN Github</a></p>
<p>흠... 옵션이 OpenVPN의 옵션과 정확히 일치한다.</p>
<p>의심이 조금 가기는 하지만 설마 OpenVPN을 그대로 배껴왔을리는 없다.
애초에 OpenVPN Github에 커다랗게 <a href="https://github.com/OpenVPN/openvpn/blob/master/COPYRIGHT.GPL">GNU GENERAL PUBLIC LICENSE</a> 라고 써져있는데 <strong>한국 최대의 공공기관 VPN 제공업체</strong>가 이걸 <strong>개무시하고</strong> 다음과 같은 행동을 했을리가 없다.</p>
<ul>
<li>프로그램을 제공할때 GPL 라이선스도 아니고, 심지어 유료 솔루션의 일부로 제공한다.</li>
<li>소스코드의 편집이 있었음에도 (뒷부분에서 다룬다) 소스코드를 공개하지 않았다.</li>
</ul>
<p>참고로 GPL 라이선스를 사용한 프로그램은 똑같이 GPL 아래에 떨어져야 한다. 라이브러리로 사용했던지, 소스코드를 편집해서 사용했던지, 모두 GPL 아래에 있어야 한다.</p>
<p>그래도 옵션이 일치한다는 우연이라고 하기에는 너무 의심스럽다. 임의의 <code>.ovpn</code> 파일을 하나 만들어서 한번 실행시켜보자.
<img src="https://velog.velcdn.com/images/predict-woo/post/131270d7-eaff-4743-bc00-f23065e8385e/image.png" alt="">
나는 Hotspot Shield의 구독자이기 때문에 이를 이용해서 만들어보겠다.
<img src="https://velog.velcdn.com/images/predict-woo/post/38ccae61-8d60-4c4b-8cb3-4d05ad1b4c5c/image.png" width="50%" height="50%">
config 파일을 만든 다음에 Secuway의 <code>ssl_client</code> 바이너리를 이용해서 열어보자.</p>
<p><img src="https://velog.velcdn.com/images/predict-woo/post/ffe2f708-6a69-45cf-bbf6-25948e8d812c/image.png" alt=""></p>
<p>아주 잘 돌아간다... 심지어 <code>OpenVPN version will ignore --cipher for cipher negotiations</code> 이라고까지 친절하게 알려준다.</p>
<p><img src="https://velog.velcdn.com/images/predict-woo/post/d90c7d78-8272-42b3-b672-1cf23d305f07/image.png" alt=""></p>
<p>버전을 물어봐도 친절하게 알려준다.</p>
<h2 id="결론">결론</h2>
<p>글이 너무 길어지는 것 같아 더 자세한 내용과 결국 맥 비밀번호 없이 KCLOUD VPN에 접속을 성공했는지는 이후 포스팅에 업로드할 예정이다.</p>
<p>나의 불편함을 해소하기 위해 시작되었지만, 이번에 Secuway SSL VPN을 조사하면서 느낀점이 정말 많다. 세상에는 너무나 License Violation이 많다. 만약 시큐위즈가 좀 더 조심했다면, 조금 더 주의해서 options를 수정했다면, 나와 같은 초보가 이걸 찾아낼 수 있었을리가 없다.</p>
<p>이런 Violation들은 오픈소스 생태계를 망가트린다. 이러한 라이선스는 소프트웨어의 자유와 공유를 촉진하며, 개발자들이 협력할 수 있는 환경을 조성한다. GPL 라이선스의 경우에는 사용자가 소프트웨어를 자유롭게 사용, 수정, 배포할 수 있도록 허용하지만, 배포 시 반드시 원본 소스 코드와 수정된 소스 코드를 공개해야 한다는 조건을 부과함으로써 누구나 소프트웨어의 개선에 기여할 수 있고 결과적으로 더 나은 품질의 소프트웨어의 개발을 목적으로 한다.</p>
<p>이런 기본적인 규칙도 지키지 못하면, 오픈소스를 만들고 공유하는 사람들은 줄어들 수밖에 없다. 한국의 공공기관 VPN 시장을 대표하는 회사로써, 다른 회사들의 좋은 본보기가 되어야 하지 않을까...</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[KISA SEED Encryption Typescript로 포팅하기]]></title>
            <link>https://velog.io/@predict-woo/KISA-SEED-Encryption-Typescript%EB%A1%9C-%ED%8F%AC%ED%8C%85%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@predict-woo/KISA-SEED-Encryption-Typescript%EB%A1%9C-%ED%8F%AC%ED%8C%85%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 04 Mar 2024 03:07:29 GMT</pubDate>
            <description><![CDATA[<p>학교 시스템 구현을 뒤져보던 중, 교내의 다양한 앱 및 서비스에서 KISA_SEED_CBC라는 흥미로운 함수를 암호화에 사용한다는 것을 알게 되었다. 이를 웹서비스로 구현할 필요성을 느끼고 있었기에, Typescript로의 포팅이 필요했다.</p>
<h2 id="존재하는-솔루션">존재하는 솔루션</h2>
<p><img src="https://velog.velcdn.com/images/predict-woo/post/6da85a6a-8e9f-42c2-8b03-c353be93f8a9/image.png" alt="npm">
일단 npm에는 없다</p>
<p><a href="https://github.com/tomyun/crypto-js">https://github.com/tomyun/crypto-js</a></p>
<p>아래에 js버전으로 구현된게 있지만, 이미 deprecated된 crypto-js 기반이고, typing이 되어있지 않다.</p>
<h2 id="해결방안">해결방안</h2>
<p><a href="https://seed.kisa.or.kr/kisa/algorithm/EgovSeedInfo.do">https://seed.kisa.or.kr/kisa/algorithm/EgovSeedInfo.do</a>
위 SEED 알고리즘 공식 문서를 살펴보면, Java 및 다양한 언어로 구현한 예제들을 볼 수 있다. 그중 내가 가장 잘 읽는 언어는 Java이기에, 이를 Ts로 포팅하기로 결정했다.</p>
<h2 id="포팅">포팅</h2>
<p>이번에 Java를 Typescript로 포팅하면서 느낀건데, 둘이 정말로 semantic이 비슷하다. 어느정도로 비슷하냐면, Java 코드를 복붙해서 가져온다음 타입 위치만 바꿔도 작동한다. 이 덕분에 빠른 속도로 변환이 가능했다.</p>
<p><img src="https://velog.velcdn.com/images/predict-woo/post/f58f25de-cfe0-4c13-ac2b-8050fe3d5cea/image.png" alt="스크린샷"></p>
<h3 id="타입변환">타입변환</h3>
<p>Java와 Typescript는 타입이 호환되지 않는다. 이 함수를 변환하면서 겪은 가장 큰 문제는 <code>byte</code> 타입에 관한 것이였다. </p>
<p>Java의 <code>byte</code>타입은 하나의 바이트, 즉 8비트를 나타낸다. 하지만, ts에는 숫자를 표현할 방법이 <code>number</code> 타입밖에 없다. 하지만 그렇다고 그냥 <code>number</code> 타입으로 통일해버리면 표현할 수 있는 수의 범위가 달라져버린다.
Java의 <code>byte</code>가 <code>unsinged</code>의 형태로 표현할 수 있는 숫자의 범위는 <code>0~255</code>인 반면, ts는 64 bit floating point의 최댓값인     <code>1.7976931348623157e+308</code>까지 표현할 수 있다.
따라서, Java에서 사용한 <code>byte</code> 변수를 사용할 때마다 <code>variable &amp; 0xff</code> 의 형식으로 사이즈를 제한할 수밖에 없다.</p>
<p>다만, Java의 <code>byte[]</code> 는 ts의 <code>Uint8Array</code>로 포팅이 가능하기에, 이를 사용했다.</p>
<p>이후에도 Java의 <code>int</code>에 관련해서도 문제를 겪었다. Java에서 변수를 <code>int</code>로 정의하면, 정수만을 나타내기에 <code>integer / 4</code> 같은 연산은 자동으로 내림을 해주게 된다. 하지만, ts에서 같은 연산을 하게되면 <code>float</code>가 나오게 된다. 따라서, 매번 <code>Math.floor(integer / 4)</code> 와 같은 연산을 추가해주어야 한다.</p>
<h3 id="클래스-변환">클래스 변환</h3>
<p>Typescript와 Java의 클래스는 놀랍도록 비슷하다. 거의 복붙 후에 자잘한 편집이 다였고, 이 프로젝트 덕분에 ts에서도 클래스 변수에 <code>readonly</code>를 사용할 수 있단걸 배우게 되었다.</p>
<h3 id="편의성-추가">편의성 추가</h3>
<p>기존 클래스는 매번</p>
<pre><code class="language-ts">  public static SEED_CBC_Encrypt(
    pbszUserKey: Uint8Array,
    pbszIV: Uint8Array,
    message: Uint8Array,
    message_offset: number,
    message_length: number
  ): Uint8Array</code></pre>
<p>다음과 같은 인풋을 주어야 했기에, 다음과 같은 간단히 base64의 형식으로 인풋을 줄 수 있는 함수도 만들었다.</p>
<pre><code class="language-ts">  public static encrypt(
    pbszUserKey: string,
    pbszIV: string,
    message_str: string
  ): string</code></pre>
<h3 id="커맨트">커맨트</h3>
<p>솔직히 말하자면, KISA에서 제공한 Java코드는 정말로 질이 안좋다. OOP 언어를 static variable들과 static method로 채워두고 functional하게 쓰고 있는건 기본이고, </p>
<pre><code class="language-java">private static final int KC0 = 0x9e3779b9;
private static final int KC1 = 0x3c6ef373;
private static final int KC2 = 0x78dde6e6;
private static final int KC3 = 0xf1bbcdcc;
private static final int KC4 = 0xe3779b99;
private static final int KC5 = 0xc6ef3733;
private static final int KC6 = 0x8dde6e67;
private static final int KC7 = 0x1bbcdccf;
private static final int KC8 = 0x3779b99e;
private static final int KC9 = 0x6ef3733c;
private static final int KC10 = 0xdde6e678;
private static final int KC11 = 0xbbcdccf1;
private static final int KC12 = 0x779b99e3;
private static final int KC13 = 0xef3733c6;
private static final int KC14 = 0xde6e678d;
private static final int KC15 = 0xbcdccf1b;</code></pre>
<p>위와 같은 엄청난 변수정의도 있고,</p>
<pre><code class="language-java">private static final byte GetB0(int A) { return (byte)(A &amp; 0x0ff); }
private static final byte GetB1(int A) { return (byte)((A&gt;&gt;8) &amp; 0x0ff); }
private static final byte GetB2(int A) { return (byte)((A&gt;&gt;16) &amp; 0x0ff); }
private static final byte GetB3(int A) { return (byte)((A&gt;&gt;24) &amp; 0x0ff); }</code></pre>
<p>위와 같은 신기한 매서드 정의도 있다.</p>
<p>최대한 많이 고치기는 했지만, 거의 2000줄이 되는 코드가 한 파일에 다 들어가 있어서 깔끔하게 만들지는 못한 것 같다. 그래도 무려 700줄가량의 코드로 줄이는데 성공했다!
또한 나의 혼동을 방지하기 위해 변수명이나 클래스 이름 같은 경우 best practice를 전혀 따르지 못하고 그대로 가지고 왔다.</p>
<h2 id="결론">결론</h2>
<p>변환후에 npm package로 만들어 배포하였다. 사용 방법은 간단하고 dependency가 하나도 없으니 언제든지 사용해도 된다.
<img src="https://velog.velcdn.com/images/predict-woo/post/51ea9e6f-85ce-4aa1-be4a-8ef63e2eb78b/image.png" alt="npm"></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Typescript + Vite에서 Absolute Import 사용하기]]></title>
            <link>https://velog.io/@predict-woo/typescript-vite-absolute-imports</link>
            <guid>https://velog.io/@predict-woo/typescript-vite-absolute-imports</guid>
            <pubDate>Sun, 14 Jan 2024 02:11:49 GMT</pubDate>
            <description><![CDATA[<p>Craco를 사용하다가 Vite로 넘어오면 겪게되는 여러 어려움들이 있다. 그 중 하나가 Craco에서 기본설정으로 사용하던 alias가 없는 absolute import를 사용하는 것이다.</p>
<p>사실 이 방법이 클린코드 관점에서는 좋다고만은 할 수 없다. library에서 import한 것 과의 구분이 명확하지 않아 여러 이상한 충돌들이 일어날 수 있기 때문이다.</p>
<p>하지만, 기존 코드베이스에 있는 수천개의 파일의 모든 import에 하나하나 alias를 붙이는 것 보다는 확실히 좋은 방법이다.</p>
<h2 id="alias-less-absolute-imports">Alias-less Absolute Imports</h2>
<p><code>vite-tsconfig-paths</code> 라는 플러그인이 이 문제를 해결해준다.</p>
<p>먼저 플러그인을 설치해주자</p>
<pre><code class="language-bash">npm i vite-tsconfig-paths -D</code></pre>
<p>다음, <code>tsconfig.json</code> 파일에 아래 옵션을 추가해준다.</p>
<pre><code class="language-js"> &quot;compilerOptions&quot;: {
    ...
    &quot;paths&quot;: {
      &quot;*&quot;: [&quot;./src/*&quot;] // 사용할 src 디렉토리
    }
  }</code></pre>
<p>마지막으로, <code>vite.config.js</code> 파일에서 플러그인을 추가해준다.</p>
<pre><code class="language-js">import tsconfigPaths from &#39;vite-tsconfig-paths&#39;;

export default {
  plugins: [tsconfigPaths(), ... ],
};</code></pre>
<p>이제, src아래에 있는 모든 파일에 Absolute Import를 사용할 수 있다.</p>
<pre><code class="language-js">import Header from &quot;components/Header&quot;;
import Home from &quot;pages/Home&quot;;
import Welcome from &quot;pages/Welcome&quot;;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[택시 비용 API를 찾아서]]></title>
            <link>https://velog.io/@predict-woo/%ED%83%9D%EC%8B%9C-%EB%B9%84%EC%9A%A9-API%EB%A5%BC-%EC%B0%BE%EC%95%84%EC%84%9C</link>
            <guid>https://velog.io/@predict-woo/%ED%83%9D%EC%8B%9C-%EB%B9%84%EC%9A%A9-API%EB%A5%BC-%EC%B0%BE%EC%95%84%EC%84%9C</guid>
            <pubDate>Mon, 01 Jan 2024 18:15:59 GMT</pubDate>
            <description><![CDATA[<p>교내 동아리에서 진행하는 프로젝트 중 한 위치에서 다른 위치로 택시를 타고 갈때 필요한 비용을 계산해주는 기능을 만들어야 하는 사정이 생겼다.</p>
<h2 id="naver-direction-5-api"><a href="https://api.ncloud-docs.com/docs/ai-naver-mapsdirections-driving">Naver Direction 5 API</a></h2>
<p>네이버에서 지원하는 공식 경로 계산 API이다. 돌려주는 값들 중 <code>taxiFare</code> 이라는 값이 있다.
<img src="https://velog.velcdn.com/images/predict-woo/post/fa42b414-117d-43f1-9d92-463bbc6a5c6c/image.png" alt="가격">
현재 서비스 사용자가 400명 가량 존재한다. 즉 한달에 한 사용자가 150건, 하루에 5건의 택시비 계산을 할 수 있다는 얘기이다.
사실 하루에 5건정도면 현 사용자들에게 서비스를 제공하고도 남는 수준이다. 하지만, 서비스의 필수 기능들이 이 가격 계산에 의존하기에 확실한 안정성이 필요하다.
따라서 불안정한 API더라도 무료 버전을 찾아보고, fallback으로 유료 API를 사용하게 만들어보자.</p>
<h2 id="kakao-map">Kakao Map</h2>
<p>카카오맵에는 택시비를 계산해주는 기능이 있다. 이를 뜯어와보자.
ssl 프록시를 이용해서 API콜을 뜯어본 결과, <code>https://app.map.kakao.com/route/carset/mobility.json</code> 으로 <code>origin</code> 과 <code>destination</code> 의 파라미터로 좌표를 보내주는 걸 알 수 있었다. </p>
<pre><code class="language-python">import requests

base_url = &#39;https://app.map.kakao.com/route/carset/mobility.json&#39;

params = {
    &#39;origin&#39;: &#39;127.37888948493487,36.38793945312501&#39;,
    &#39;destination&#39;: &#39;127.04669593,37.59267542&#39;,
}

response = requests.get(base_url, params=params)

print(response.json()[&quot;results&quot;][0][&quot;summary&quot;][&quot;fare&quot;][&quot;taxi&quot;])

$ 173500</code></pre>
<p>이를 따라서 간단한 코드를 작성해보면, 헤더나 쿠키 없이도 아주 잘 작동하는걸 볼 수 있다.
이를 1차 API로 사용하고, 실패했을때 유료 API로 전환하면 될 듯 하다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[첫 글]]></title>
            <link>https://velog.io/@predict-woo/%EC%B2%AB-%EA%B8%80</link>
            <guid>https://velog.io/@predict-woo/%EC%B2%AB-%EA%B8%80</guid>
            <pubDate>Mon, 01 Jan 2024 17:40:27 GMT</pubDate>
            <description><![CDATA[<p>predict-woo의 첫 글</p>
]]></description>
        </item>
    </channel>
</rss>