<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>축적</title>
    <description>여기저기에 쓰는 글들을 한 곳에 모읍니다.
</description>
    <link>https://blog.novice.io/</link>
    <atom:link href="https://blog.novice.io/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Sun, 12 Mar 2023 15:08:28 +0000</pubDate>
    <lastBuildDate>Sun, 12 Mar 2023 15:08:28 +0000</lastBuildDate>
    <generator>Jekyll v3.9.3</generator>
    
      <item>
        <title>GitHub Copilot 사용해 보기</title>
        <description>&lt;h3 id=&quot;github-copilot&quot;&gt;GitHub Copilot?&lt;/h3&gt;

&lt;p&gt;GitHub Copilot은 최신 인공지능(AI) 기술 중 하나로, 개발자들이 코드 작성 시에 자동 완성 기능을 제공하는 도구입니다. Copilot은 GPT 모델을 기반으로 하며, 자연어 처리(NLP)와 프로그래밍 언어 모델링 기술을 결합하여 개발되었습니다.&lt;/p&gt;

&lt;p&gt;Copilot은 프로그래밍 언어의 문법, 라이브러리, 함수, 변수 등을 이해하고, 이를 활용하여 개발자에게 적절한 코드를 제안합니다. Copilot은 이를 위해 다양한 소스 코드와 프로그래밍 예제를 학습하여, 대규모 데이터셋을 생성하였습니다. 이후, 생성된 데이터셋을 토대로 개발자들이 작성하는 코드와 주어진 컨텍스트를 분석하여 유용한 코드를 제안합니다.&lt;/p&gt;

&lt;p&gt;GitHub Copilot은 현재 Visual Studio Code와 같은 개발 툴에서 사용할 수 있으며, Python, JavaScript, TypeScript, Ruby, Go, Rust, C++, C#, Java 등 다양한 프로그래밍 언어를 지원합니다. 이를 통해 개발자들은 코드 작성 시간을 단축하고, 효율성을 높일 수 있습니다.&lt;/p&gt;

&lt;p&gt;현재 Copilot은 60일의 트라이얼 기간을 주고 있습니다. 그 이후에는 월별로 19$의 비용이 듭니다. 자. 한번 테스트 해봅시다.&lt;/p&gt;

&lt;h3 id=&quot;vs-code---github-copilot--설치하기&quot;&gt;VS Code - GitHub Copilot  설치하기&lt;/h3&gt;

&lt;p&gt;GitHib Copilot은 VS Code MarketPlace에서 손쉽게 찾아보고 설치할 수 있습니다. 자세한 것은 GitHub의 &lt;a href=&quot;https://docs.github.com/en/copilot/getting-started-with-github-copilot/getting-started-with-github-copilot-in-visual-studio-code&quot;&gt;공식문서&lt;/a&gt;를 참고 해 보면 좋습니다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/leehosung/leehosung.github.io/master/assets/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202023-03-12%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2011.47.00.png&quot; alt=&quot;스크린샷 2023-03-12 오후 11.47.00&quot; style=&quot;zoom:50%;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;django-model-만들기&quot;&gt;Django Model 만들기&lt;/h3&gt;

&lt;p&gt;제가 주로 사용하는 Django 모델 작성으로 테스트를 해봅니다. Video라는 클래스명을 작성하니 나머지 내용들을 자동으로 제안해 줍니다. 여러가지 제안 중 한 가지를 선택할 수 있습니다. VS Code 의 경우에는 “Option + [, ]”을 사용하면 됩니다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/leehosung/leehosung.github.io/master/assets/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202023-03-12%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2011.34.48.png&quot; alt=&quot;스크린샷 2023-03-12 오후 11.34.48&quot; style=&quot;zoom:50%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;하하. 얼마나 많은 사람이 Video 모델을 작성해 왔을까요?&lt;/p&gt;

&lt;h3 id=&quot;test-작성하기&quot;&gt;Test 작성하기&lt;/h3&gt;

&lt;p&gt;코드를 작성하다 보면 Test 작성하는 것이 중요한것을 알면서도 귀찮은 일입니다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;테스트 함수 명을 작성하는 것만으로  Video 모델에서 데이터를 가져와서 중요한 title 을 검사하는 테스트 내용을 작성해 줍니다.&lt;/li&gt;
  &lt;li&gt;테스트를 위한 주석을 작성하면 테스트 함수명과 함수 내부를 자동으로 채워 줍니다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/leehosung/leehosung.github.io/master/assets/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202023-03-12%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2011.44.26.png&quot; alt=&quot;스크린샷 2023-03-12 오후 11.44.26&quot; style=&quot;zoom:50%;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;copilot과-함께-코딩하기가-default가-될까-개발자는-살아남을까&quot;&gt;Copilot과 함께 코딩하기가 Default가 될까? 개발자는 살아남을까?&lt;/h3&gt;

&lt;p&gt;점심을 먹으며,  Copilot에 대한 이야기를 나누었습니다. Github Copilot과 같은 AI가 그 역할을 대신할 것이므로 코드는 더 이상 문제가 되지 않으며, 대신 모델과 비지니스 요구사항에 대한 이해와 분석만 남는것이 아닌가 하는 의견이 있었습니다. 그렇다고 하면 비즈니스 담당자가 스펙으로 부터 직접 프로그램을 생성할 것이기 때문에 프로그래머는 더 이상 필요하지 않게 되지 않을까요.&lt;/p&gt;

&lt;p&gt;하지만 코드는 궁극적으로 기계에 대한 요구 사항을 표현하는 언어입니다. 모든 요구 사항들이 코드의 형태로 정의 되었을 때 요구되는 동작이 돌아갑닏. 결국 “작성된 스펙” 또는 “지시” 만으로 기대되는 모든 기능이 동작한다면 그것이 바로 코드입니다. 그리고 그 요구사항을 작성하는 사람이 프로그래머가 되겠죠.&lt;/p&gt;

&lt;p&gt;조금 더 활용해 봐야겠지만, 보조도구로  Colilot은 훌륭해 보입니다. 하루가 다르게 달라지고 있는 AI를 보면 우리의 기대와의 갭은 더 빠르게 줄어들 것으로 보입니다. 보다 정확히는 종종 우리의 기대 보다 좋은 코드를 주겠죠. Copilot류의 도구들과 함께 개발하는 날은 멀지 않은 것 같습니다.&lt;/p&gt;
</description>
        <pubDate>Sun, 12 Mar 2023 01:00:00 +0000</pubDate>
        <link>https://blog.novice.io/%EA%B0%9C%EB%B0%9C/2023/03/12/copilot-%EC%82%AC%EC%9A%A9%ED%95%B4-%EB%B3%B4%EA%B8%B0.html</link>
        <guid isPermaLink="true">https://blog.novice.io/%EA%B0%9C%EB%B0%9C/2023/03/12/copilot-%EC%82%AC%EC%9A%A9%ED%95%B4-%EB%B3%B4%EA%B8%B0.html</guid>
        
        <category>GPT</category>
        
        <category>GitHub</category>
        
        <category>Copilot</category>
        
        <category>viscose</category>
        
        
        <category>개발</category>
        
      </item>
    
      <item>
        <title>Github Pages를 root domain으로 연결하기</title>
        <description>&lt;h3 id=&quot;문제-상황&quot;&gt;문제 상황&lt;/h3&gt;

&lt;p&gt;최근 블로그에 Google AdSense를 등록하려다 보니, 최상위 도메인만이 등록이 가능했다.&lt;/p&gt;

&lt;center&gt;
        &lt;figure&gt;
                &lt;img src=&quot;https://blog.novice.io/assets/dns-1.png&quot; width=&quot;320&quot; alt=&quot;views&quot; /&gt;
                &lt;figcaption&gt;Google AdSense에서 도메인 등록 실패&lt;/figcaption&gt;
        &lt;/figure&gt;
&lt;/center&gt;

&lt;p&gt;GitHub Pages를 통해서 블로그를 관리하고 있었기에, &lt;a href=&quot;http://novice.io&quot;&gt;novice.io&lt;/a&gt; → &lt;a href=&quot;http://leehosung.github.io&quot;&gt;leehosung.github.io&lt;/a&gt; 로의 연결이 필요했는데, AWS Route53에서는 설정이 불가했다.&lt;/p&gt;

&lt;center&gt;
        &lt;figure&gt;
                &lt;img src=&quot;https://blog.novice.io/assets/dns-2.png&quot; width=&quot;320&quot; alt=&quot;views&quot; /&gt;
                &lt;figcaption&gt;AWS Route53에서 CNAME 등록실패&lt;/figcaption&gt;
        &lt;/figure&gt;
&lt;/center&gt;

&lt;h3 id=&quot;cname은-왜-설정이-안될까&quot;&gt;CNAME은 왜 설정이 안될까?&lt;/h3&gt;

&lt;p&gt;CNAME(Canonical Name Record)은 일반적인 DNS 레코드 유형 중 하나다. CNAME 레코드는 하나의 도메인 이름을 다른 도메인 이름으로 리다이렉션하는 별칭(Alias)으로, 동일한 웹사이트나 서버로 연결된 여러 도메인 이름을 관리하는 데 유용하다.&lt;/p&gt;

&lt;p&gt;하지만 CNAME 레코드에는 한 가지 중요한 제한이 있다. 도메인의 루트(root)에는 사용할 수 없다. 도메인의 루트란 빈 공간이나 점(.)으로 표시되는 최상위 도메인을 의미한다. 예를 들어 ‘www.&lt;a href=&quot;http://example.com/&quot;&gt;example.com&lt;/a&gt;’ 도메인의 루트는 ‘&lt;a href=&quot;http://example.com&quot;&gt;example.com&lt;/a&gt;’ 다. 참고로 루트 도메인은 apex domain, bare domain으로 불리기도 한다.&lt;/p&gt;

&lt;p&gt;이러한 제한은 DNS 프로토콜이 작동하는 방식과 관련이 있다.  DNS 표준이 작성될 당시에는 사용을 관리하기 위해 몇 가지 규칙이 정해져 있었다. RFC 1912와 RFC 2181에 다음과 같이 명시되어 있다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;SOA 및 NS 레코드는 루트 도메인에 반드시 존재해야 한다.&lt;/li&gt;
  &lt;li&gt;CNAME 레코드는 단일 레코드로만 존재할 수 있으며 다른 리소스 레코드와 결합할 수 없다.(DNSSEC SIG, NXT 및 KEY RR 레코드는 제외)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;즉, 도메인의 루트는 도메인의 정상적인 작동에 필요한 SOA 또는 NS 레코드와 같은 다른 유형의 레코드가 필요하기 때문에 동시에 CNAME을 설정할 수 없다.&lt;/p&gt;

&lt;p&gt;따라서 도메인 루트에서 다른 도메인 이름으로 트래픽을 리다이렉션하려면 A 레코드 또는 ALIAS 레코드를 설정해야 한다.&lt;/p&gt;

&lt;h3 id=&quot;a-레코드-사용하기&quot;&gt;A 레코드 사용하기&lt;/h3&gt;

&lt;p&gt;도메인의 A 레코드(Address 레코드)는 도메인 네임을 해당 도메인을 호스팅하는 서버의 IP 주소에 매핑하는 DNS(도메인 네임 시스템) 레코드의 한 유형이다.&lt;/p&gt;

&lt;p&gt;간단히 말해, A 레코드는 도메인 이름을 컴퓨터가 웹사이트에 연결할 때 사용하는 IP 주소로 변환하는 전화번호부 항목과 같다. 웹 브라우저에 도메인 이름을 입력하면 브라우저는 해당 도메인에 대한 A 레코드를 조회하여 해당 도메인 이름과 연결된 IP 주소를 가져오기 위해 DNS 서버에 요청을 보낸다. IP 주소가 확보되면 브라우저는 해당 IP 주소와 연결된 웹 서버에 연결하여 웹사이트의 콘텐츠를 요청할 수 있다.&lt;/p&gt;

&lt;p&gt;예를 들어, 도메인 이름 “&lt;a href=&quot;http://example.com&quot;&gt;example.com&lt;/a&gt;“의 A 레코드는 “93.184.216.34”라는 IP 주소에 매핑될 수 있다. 즉, 누군가 웹 브라우저에 “&lt;a href=&quot;http://example.com&quot;&gt;example.com&lt;/a&gt;“을 입력하면 브라우저는 A 레코드를 사용하여 IP 주소 “93.184.216.34”에서 서버를 찾아 해당 서버에서 호스팅되는 웹사이트에 연결한다.&lt;/p&gt;

&lt;p&gt;A 레코드를 이용해서 루트 도메인을 GitHub Pages로 연결하기 위해서는 &lt;a href=&quot;https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site/managing-a-custom-domain-for-your-github-pages-site#configuring-a-subdomain&quot;&gt;GitHub에서 제안하는 방법&lt;/a&gt;을 따르면 된다. 간단하게 요약해 보면, &lt;a href=&quot;http://novice.io&quot;&gt;novice.io&lt;/a&gt; → (185.199.108.153, 185.199.109.153, 185.199.110.153, 185.199.111.153) 로  A 레코드를 지정해 주면 된다.&lt;/p&gt;

&lt;center&gt;
        &lt;figure&gt;
                &lt;img src=&quot;https://blog.novice.io/assets/dns-3.png&quot; width=&quot;320&quot; alt=&quot;views&quot; /&gt;
                &lt;figcaption&gt;Route53 A레코드 추가하기&lt;/figcaption&gt;
        &lt;/figure&gt;
&lt;/center&gt;

&lt;center&gt;
        &lt;figure&gt;
                &lt;img src=&quot;https://blog.novice.io/assets/dns-4.png&quot; width=&quot;320&quot; alt=&quot;views&quot; /&gt;
                &lt;figcaption&gt;Github Pages 에서 도메인 등록하기&lt;/figcaption&gt;
        &lt;/figure&gt;
&lt;/center&gt;

&lt;p&gt;이를 통해 novice.io에 대한 DNS 조회는 4개의 IP 주소로 정해진 알고리즘에 따라 라우팅 된다. 하지만 GitHub Pages 설정을 변경하게 되면 기존 블로그 주소인 blog.novice.io가 변경되기에 이 방법은 사용하지 않았다.&lt;/p&gt;

&lt;h3 id=&quot;alias를-사용해서-리다이렉션-하기&quot;&gt;Alias를 사용해서 리다이렉션 하기&lt;/h3&gt;

&lt;p&gt;Route 53의 Alias 레코드는 도메인 이름을 ELB(Elastic Load Balancer), Amazon S3 버킷, CloudFront 배포와 같은 AWS 리소스에 매핑할 수 있도록 하는 DNS 레코드 유형이다. 별칭 레코드는 사용자가 리소스의 IP 주소나 URL을 기억하거나 사용할 필요 없이 친숙한 도메인 이름을 가진 AWS 리소스로 트래픽을 라우팅할 수 있는 방법을 제공한다.&lt;/p&gt;

&lt;p&gt;Route 53의 Alias 레코드는 도메인 이름을 리소스에 매핑하는 데 IP 주소를 사용하지 않는다는 점에서 A 레코드 유형과 다르다. 대신 리소스의 DNS 이름에 대한 포인터 역할을 하는 Alias 대상이라는 특수한 유형의 CNAME 레코드를 사용한다. 즉, 리소스의 IP 주소 또는 URL이 변경되면 별칭 레코드가 새 주소를 반영하도록 자동으로 업데이트 된다.&lt;/p&gt;

&lt;p&gt;나의 경우에는 S3의 정적 웹 호스팅 Redirection 기능을 사용해서 S3 Bucket을 셋업했다. (자세한 것은 역시 &lt;a href=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/how-to-page-redirect.html&quot;&gt;AWS 메뉴얼&lt;/a&gt;을 참고하자.)&lt;/p&gt;

&lt;center&gt;
        &lt;figure&gt;
                &lt;img src=&quot;https://blog.novice.io/assets/dns-5.png&quot; width=&quot;320&quot; alt=&quot;views&quot; /&gt;
                &lt;figcaption&gt;S3의 Redirection 설정&lt;/figcaption&gt;
        &lt;/figure&gt;
&lt;/center&gt;

&lt;p&gt;해당 S3 Bucket을 Endpoint 를 향하는 Alias 레코드를 &lt;a href=&quot;http://novice.io&quot;&gt;novice.io&lt;/a&gt; 루트도메인에 설정해 주었다.&lt;/p&gt;

&lt;p&gt;이와 같은 방법을 통해 &lt;a href=&quot;http://novice.io&quot;&gt;novice.io&lt;/a&gt;, &lt;a href=&quot;http://blog.novice.io&quot;&gt;blog.novice.io&lt;/a&gt; 모두 leehosung.github.io로 연결되는 설정이 완료 되었다.&lt;/p&gt;
</description>
        <pubDate>Sat, 25 Feb 2023 01:00:00 +0000</pubDate>
        <link>https://blog.novice.io/%EA%B0%9C%EB%B0%9C/2023/02/25/Github-Pages%EB%A5%BC-root-domain%EC%9C%BC%EB%A1%9C-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0.html</link>
        <guid isPermaLink="true">https://blog.novice.io/%EA%B0%9C%EB%B0%9C/2023/02/25/Github-Pages%EB%A5%BC-root-domain%EC%9C%BC%EB%A1%9C-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0.html</guid>
        
        <category>DNS</category>
        
        <category>AWS</category>
        
        <category>blog</category>
        
        
        <category>개발</category>
        
      </item>
    
      <item>
        <title>개발자 면접에 ChatGPT를 활용해 보면 어떨까?</title>
        <description>&lt;p&gt;ChatGPT가 유행이다. 유행이라는 말로도 부족한 느낌도 있다. ChatGPT로 이런저런 질문을 던져보다가, ChatGPT를 개발자 면접에 활용해 보면 어떨까 싶었다.&lt;/p&gt;

&lt;p&gt;나는 기술 면접을 진행하면서, 검색을 허용하는 경우가 있다. 필요한 정보를 찾는 과정을 옆에서 지켜 보면 생각보다 많은것을 알 수 있다. 어떤 경우에는 현재의 자신의 의도를 설명하면서 검색을 진행해 달라고 하는 경우도 있다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;주로 검색을 하는 곳이 어디인가? (제발 네이버에서 검색은 하지 말아 주세요.)&lt;/li&gt;
  &lt;li&gt;어떤 검색어를 선택하는가? (문제를 제대로 이해하고 있는지, 원하는 답에 가까운 키워드를 선택하는지)&lt;/li&gt;
  &lt;li&gt;어떤 싸이트를 선택하는가? (stackoverflow vs 공식문서 vs 블로그의 글 vs 그냥 첫번째 싸이트)&lt;/li&gt;
  &lt;li&gt;싸이트를 선택한 이후에 필요한 내용을 어떻게 찾아내는가? 해당 문서가 자신에게 적절한 문서인지를 어떻게 판별하는가? (유사한 문서를 찾고, 읽어 본 경험이 많은지)&lt;/li&gt;
  &lt;li&gt;필요한 내용을 찾았을 때, 어떻게 읽고, 어떤 이해를 하는가? (관련 내용을 꼼꼼하게 살펴보고, 제대로 이해하는지 또는 간단하게 답만 찾아내어서 시도를 하는지)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;예를 들어 지원자가 작성한 코드에 다음과 같은 코드가 있다고 가정해보자.&lt;/p&gt;

&lt;center&gt;
        &lt;figure&gt;
                &lt;img src=&quot;https://blog.novice.io/assets/chatgpt-1.png&quot; width=&quot;320&quot; alt=&quot;views&quot; /&gt;
                &lt;figcaption&gt;지원자가 작성한 코드&lt;/figcaption&gt;
        &lt;/figure&gt;
&lt;/center&gt;

&lt;ul&gt;
  &lt;li&gt;면접관: @transaction.atomic 에 대해서 설명해 주시겠어요?&lt;/li&gt;
  &lt;li&gt;지원자: 아. 데이터의 무결성을 보장하기 위해서 사용합니다.&lt;/li&gt;
  &lt;li&gt;면접관: 데이터의 무결성이 어떻게 보장되는지 조금 더 설명 해 주시겠어요?&lt;/li&gt;
  &lt;li&gt;지원자: 흠… 자세하게는 잘 모르겠습니다.&lt;/li&gt;
  &lt;li&gt;면접관: 그럼 검색을 해서 내용을 찾아보고 해당 내용을 설명해 주시겠어요?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;지원자는 브라우저에서 “django transaction atomic”을 검색한다. 이 때 가장 원하는 플로우는 다음과 같다.&lt;/p&gt;

&lt;center&gt;
        &lt;figure&gt;
                &lt;img src=&quot;https://blog.novice.io/assets/chatgpt-2.png&quot; width=&quot;480&quot; alt=&quot;views&quot; /&gt;
                &lt;figcaption&gt;구글 검색&lt;/figcaption&gt;
        &lt;/figure&gt;
&lt;/center&gt;

&lt;ul&gt;
  &lt;li&gt;첫번째 공식문서 클릭하기&lt;/li&gt;
  &lt;li&gt;transaction.atomic 검색하기&lt;/li&gt;
  &lt;li&gt;atomic에 대한 내용 꼼꼼하게 읽어보기, 필요하다면 간단하게 link를 따라가서 추가로 확인해 보기&lt;/li&gt;
  &lt;li&gt;이해한 바에 대해서 명확하게 설명해 보기&lt;/li&gt;
&lt;/ul&gt;

&lt;center&gt;
        &lt;figure&gt;
                &lt;img src=&quot;https://blog.novice.io/assets/chatgpt-3.png&quot; width=&quot;480&quot; alt=&quot;views&quot; /&gt;
                &lt;figcaption&gt;Django 공식문서&lt;/figcaption&gt;
        &lt;/figure&gt;
&lt;/center&gt;

&lt;p&gt;이번에는 동일한 과정을 ChatGPT 를 활용해 보면 다음과 같을 것 같다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;ChatGPT에 원하는 결과를 물어 보시겠어요? (원하는 정보를 찾을 수 있는가?)&lt;/li&gt;
  &lt;li&gt;ChatGPT의 답변을 읽어보고 제게 설명을 해 주시겠어요? (조각만 찾는것이 아니라, 영어로 된 컨텍스트를 잘 이해할수 있는가?)&lt;/li&gt;
  &lt;li&gt;해당 답변에 혹시 오류가 있나요? (기본적으로 오류/거짓을 찾아 낼 수 있는 역량이 있는가?)&lt;/li&gt;
  &lt;li&gt;해당 답변에 추가해서 설명할 수 있는 부분이 있나요? (&lt;/li&gt;
  &lt;li&gt;답변을 읽어보고 이해 안되는 부분이 있었나요? 그것을 알기 위해서는 어떤 질문을 다시 던지면 좋을까요? (지식을 깊게 이해하는 과정)&lt;/li&gt;
&lt;/ul&gt;

&lt;center&gt;
        &lt;figure&gt;
                &lt;img src=&quot;https://blog.novice.io/assets/chatgpt-4.png&quot; width=&quot;480&quot; alt=&quot;views&quot; /&gt;
                &lt;figcaption&gt;ChatGPT에 transaction.atomic 물어보기&lt;/figcaption&gt;
        &lt;/figure&gt;
&lt;/center&gt;

&lt;p&gt;검색의 미래가 ChatGPT라고 하니 제대로 된 정보를 찾고 잘 이해하는지를 ChatGPT로 살펴보는것은 의미가 있겠다. 그러고 보면 Github Copilot과 함께 라이브 코딩을 시켜봐야 할지도..&lt;/p&gt;

&lt;p&gt;또는 지원자가 먼저 답을 하고, 동일한 질문에 대해 ChatGPT로 답변을 시킨 다음에 양쪽을 비교해 보는것도 의미가 있겠다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;면접관: 스타트업의 웹서비스를 위한 일반적인 AWS 아키텍처 구성이 어떻게 될까요?&lt;/li&gt;
  &lt;li&gt;지원자: 이렇게 저렇게 될 것 같습니다.&lt;/li&gt;
  &lt;li&gt;면접관: ChatGPT는 이렇게 설명을 해주었네요. 말씀 하신것 중에 빠진 컴포넌트는 어떤것인가요? 혹시 이 구성을 칠판에 한번 그려 보시겠어요?&lt;/li&gt;
&lt;/ul&gt;

&lt;center&gt;
        &lt;figure&gt;
                &lt;img src=&quot;https://blog.novice.io/assets/chatgpt-5.png&quot; width=&quot;480&quot; alt=&quot;views&quot; /&gt;
                &lt;figcaption&gt;ChatGPT에 아키텍처 물어보기&lt;/figcaption&gt;
        &lt;/figure&gt;
&lt;/center&gt;

&lt;p&gt;대체로 기술 면접관이 답변을 해석하는것에는 뛰어나지만 적절한 질문들을 이어가는것에는 어려움을 겪는 경우들이 있어서, 이런식으로 ChatGPT를 활용해 가며 지원자의 다양한 면을 살펴보는데 도움을 받을 수 있겠다. 또 훈련이 좀 된다면 상대적으로 전문성이 부족한 사람이 전문성이 높은 사람을 효과적으로 평가하는것에도 도움을 받을 수 있지 않을까 싶다.&lt;/p&gt;

&lt;p&gt;AI 면접이 사용된다는 소식을 종종 들었었는데, ChatGPT를 활용해 보니 그 시점이 꽤 당겨질 수 있겠다 싶은 생각도 든다. 우리(사람)은 점점 더 지원자의 태도와 인격에 집중해야 하는걸까.&lt;/p&gt;

</description>
        <pubDate>Sun, 12 Feb 2023 01:00:00 +0000</pubDate>
        <link>https://blog.novice.io/%EA%B0%9C%EB%B0%9C/2023/02/12/%EA%B0%9C%EB%B0%9C%EC%9E%90-%EB%A9%B4%EC%A0%91%EC%97%90-ChatGPT%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%B4-%EB%B3%B4%EB%A9%B4-%EC%96%B4%EB%96%A8%EA%B9%8C.html</link>
        <guid isPermaLink="true">https://blog.novice.io/%EA%B0%9C%EB%B0%9C/2023/02/12/%EA%B0%9C%EB%B0%9C%EC%9E%90-%EB%A9%B4%EC%A0%91%EC%97%90-ChatGPT%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%B4-%EB%B3%B4%EB%A9%B4-%EC%96%B4%EB%96%A8%EA%B9%8C.html</guid>
        
        <category>ChatGPT</category>
        
        <category>면접</category>
        
        
        <category>개발</category>
        
      </item>
    
      <item>
        <title>좋나?</title>
        <description>&lt;center&gt;
        &lt;figure&gt;
                &lt;img src=&quot;https://blog.novice.io/assets/좋나.jpeg&quot; width=&quot;320&quot; alt=&quot;views&quot; /&gt;
                &lt;figcaption&gt;좋나?&lt;/figcaption&gt;
        &lt;/figure&gt;
&lt;/center&gt;

&lt;p&gt;좋나라는 게임이 있다. (발음에 주의하자. 조온나아\ 가 아니라 존나/ 다.) 내가 초등학교 때 경상도 지역에서 하던 야구와 비슷한 놀이다. 찾아보니 공식 명칭은 &lt;a href=&quot;https://namu.wiki/w/%EC%B0%9C%EB%BF%8C&quot;&gt;찜뿌&lt;/a&gt;라고 하고, 지역마다 부르는 이름은 다르다. 타자는 테니스 공을 손에 쥐고 수비 측을 향해 외친다. &lt;strong&gt;“좋나?”&lt;/strong&gt; 그러면 수비 측에서는 준비가 되었다는 의미로 &lt;strong&gt;“좋다!”&lt;/strong&gt;라고 외친다. (“&lt;strong&gt;좋다!”&lt;/strong&gt;를 외치지 않은 상태에서 기습적으로 공을 날리면 벤치 클리어링이 발생한다.) 그럼 타자는 주먹으로 공을 멀리 쳐서 보내고 1루로 달리면 된다. 당시에 키도 작고, 주먹도 작았고, 달리기도 느렸던 나는 타자로는 게임을 별로 즐기지 못했다. 그래서 주로 &lt;strong&gt;“좋나?”&lt;/strong&gt; 보다는 &lt;strong&gt;“좋다!”&lt;/strong&gt;를 외쳤던 기억이다.&lt;/p&gt;

&lt;p&gt;요즘 달리기를 즐기고 있다. 어쩌다 보니 다음 주말에 첫 번째 하프 마라톤을 앞두고 있다. 그래서 종종 퇴근 후 집까지 뛰어오는 연습을 하고 있다. 회사 스터디까지 마치고 20Km가 넘는 거리를 달려오다 보니 12시가 넘어서 집에 도착한다. 40살 아저씨가 밤 12시가 넘어서 땀에 푹 젖은 운동복에 이상한 러닝 벨트를 하고 헉헉거리며 집에 들어서니, 부산 출신 와이프가 웃으며 물어본다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“좋나?”&lt;/p&gt;

  &lt;p&gt;“어. 좋다. ㅎㅎ”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;20년 동안 학습된 와이프 기분 모델로 와이프의 웃음을 분석해 보건대 한심 20%, 응원 30%, 옛다 관심 50% 다.&lt;/p&gt;

&lt;p&gt;어제 밤늦게 까지 써서 브런치에 올린 글을 하루 만에 1,000명이 넘게 읽었다. 오늘 내내 “클클클..” 하면서 통계 페이지를 들락거렸다. 아이들이 잠들고 나서 식탁에 앉아 대출이자 이야기를 하다가 통계 페이지를 와이프에게 보여주면서 자랑을 했다. 와이프가 물어본다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“좋나?”&lt;/p&gt;

  &lt;p&gt;“어. 좋다. ㅎㅎ”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;둘째가 학교를 가기 시작하면서 아이들이 외부에서 보내는 시간이 늘어나고 집에서도 스스로 보내는 시간이 늘어났다. 집안 어른들의 도움을 기대하기가 어려워 빡빡했던 우리 부부의 삶에도 조금씩 각자의 시간이 생겨나는 중이다.&lt;/p&gt;

&lt;p&gt;나는 달리기와 글쓰기를 하고, 와이프는 재테크 책을 보며 뭔가 열심히 정리를 한다. 가끔 목이 말라 깼을 때에도 거실에 앉아 집중하고 있는 것을 보면 재미있나 보다. 그러고 보니 나도 &lt;strong&gt;“좋나?”&lt;/strong&gt;라고 물어봐 줄 것 을 그랬다. 그러면 와이프도 분명 &lt;strong&gt;“어. 좋다.”&lt;/strong&gt;라고 답했을 거다.&lt;/p&gt;

&lt;p&gt;각자의 회사에서 큰 성취를 이루는 것도 물론 좋겠지만, 그것은 아주 많은 노력과 긴 시간 그리고 무엇보다도 운이 따라야 한다는 것을 알고 있다. 행복은 삶의 틈에서 작은 즐거움을 찾는 것, 그리고 그것을 이해해주고 서로 관심 가져 주는 사람과 함께 사는 것이다. 앞으로도 각자의 삶에 &lt;strong&gt;“좋나?”&lt;/strong&gt;라고 관심 가져주고, &lt;strong&gt;“어. 좋다.”&lt;/strong&gt;라고 만족감과 관심에 대한 감사함을 표현할 수 있으면 좋겠다. 그렇게 주고받았을 때 우리의 삶이 즐거운 게임이 되지 않겠나.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;그림 출처: &lt;a href=&quot;https://shorturl.at/kU168&quot;&gt;추억의 공놀이 ‘찜뿌’ 1920년대 인천·서울서 시작&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Mon, 03 Oct 2022 01:00:00 +0000</pubDate>
        <link>https://blog.novice.io/%EA%B0%80%EC%A1%B1/2022/10/03/%EC%A2%8B%EB%82%98.html</link>
        <guid isPermaLink="true">https://blog.novice.io/%EA%B0%80%EC%A1%B1/2022/10/03/%EC%A2%8B%EB%82%98.html</guid>
        
        <category>가족</category>
        
        <category>삶</category>
        
        <category>와이프</category>
        
        
        <category>가족</category>
        
      </item>
    
      <item>
        <title>집에 가면 어떤 공부를 하면 좋을까요?</title>
        <description>&lt;ul&gt;
  &lt;li&gt;이 글은 회사에서 일하고 있는 주니어 개발자를 대상으로 합니다.&lt;/li&gt;
  &lt;li&gt;제가 원온원에서 종종 듣는 질문에 대한 제 답변을 글로 옮겨 봅니다.&lt;/li&gt;
  &lt;li&gt;(제 생각의 변화와 발전에 따라 글이 업데이트됩니다.)&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;“집에 가면 어떤 공부를 하면 좋을까요?”&lt;/strong&gt;라는 질문을 풀어서 써보면 &lt;strong&gt;“더 좋은 개발자가 되려면 회사 밖에서 어떤 노력을 하면 좋을까요?”&lt;/strong&gt;인 것 같습니다. 여기에서 “더 좋은 개발자”는 회사에서 더 높은 가치로 인정받는 프로 개발자로 한정 지어 봅시다. 세상에는 다양한 개발자가 있으니까요.&lt;/p&gt;

&lt;h3 id=&quot;회사라는-공간에-대해&quot;&gt;회사라는 공간에 대해&lt;/h3&gt;

&lt;p&gt;회사는 결과를 내는 곳입니다. 그리고 엔지니어인 우리는 최소한의 리소스로 기대되는 결과를 만들어 내야만 합니다. 최소한의 리소스라는 것은 대체로 새로운 시도에 제약을 가져옵니다. 따라서 우리는 대체로 익숙한 도구와 방식으로 프로그래밍을 하게 됩니다. 이에 따른 장단점이 있습니다.&lt;/p&gt;

&lt;p&gt;장점은 기술의 숙련도의 향상, 다시 말해 체화입니다. 배움의 단계와 달리 회사에서 요구되는 복잡성과 완성도는 해당 기술을 내 것으로 만들어 줍니다. 회사에 계신 시니어 개발자 중 언어, 프레임워크, 도구 등을 정말 내 것처럼 사용하시는 분들을 보셨을 겁니다. 단점은 숙련이 충분히 된 이후에도 반복되는 경우입니다. 이때 우리는 보통 성장이 멈췄다고 생각합니다.&lt;/p&gt;

&lt;h3 id=&quot;회사-밖의-학습에-대해&quot;&gt;회사 밖의 학습에 대해&lt;/h3&gt;

&lt;p&gt;어떤 공부를 하고 계신가요? 보통 다음의 경우가 있었던 것 같습니다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;저는 아무래도 비전공자다 보니 기본이 부족한 것 같아요. OS를 공부해 보고 있습니다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;최근에 나온 어떤 라이브러리에 관심이 있어요. 한번 시도해 보고 있습니다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;어떤 책을 새로 샀어요. 그 책을 따라가면서 개념을 익혀 보고 있습니다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;친구들과 사이드 프로젝트를 해보고 있어요. 잘 되려나 모르겠네요.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;저는 어떤 학습이든 꾸준하게 이어갈 수 있는 동기가 있다면 그것이 최선이라고 생각합니다. 지금 하고 있는 학습이 재미있고 꾸준하게 하고 있다면 더 고민할 여지는 없습니다. 지금 그것을 꾸준하게 하시면 됩니다. (학습은 기본적으로 재미가 없거든요) 하지만 아직 갈피를 못 잡고 있다면 제 추천은 다음과 같습니다.&lt;/p&gt;

&lt;h3 id=&quot;회사의-업무를-확장할-수-있는-학습하기&quot;&gt;회사의 업무를 확장할 수 있는 학습하기&lt;/h3&gt;

&lt;p&gt;퇴근 후 학습은 하루 2시간을 꾸준히 하기가 쉽지 않습니다. 그렇다면 발상을 전환해서 대부분의 시간을 보내는 회사에서의 성장을 부스팅 하기 위해서 여러분의 추가 시간을 활용해 보는 것은 어떨까요? 저는 우리가 바라는 &lt;strong&gt;“회사에서 더 높은 가치로 인정받는 프로 개발자”&lt;/strong&gt;가 되는 지름길이라고 생각합니다.&lt;/p&gt;

&lt;p&gt;회사의 업무를 이어서 하는 것을 말하는 것은 아닙니다. 이것은 보통 야근이라고 하죠. 위에서 말씀드린 회사의 특징을 활용해 보는 것입니다. 다음 단계로 진행됩니다.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;회사의 문제점 찾기&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;효율적인 방법 찾기&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;학습을 통해 허들 낮추기&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;설득&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;회사에 대한 기여, 해당 기술에 대한 숙련도 향상&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;저희 회사에서는 이를 간단하게 &lt;strong&gt;“오늘 배워 내일 쓴다.”&lt;/strong&gt;라고 표현합니다. 조금 더 자세하게 살펴봅시다.&lt;/p&gt;

&lt;h4 id=&quot;1-회사의-문제점-찾기&quot;&gt;1. 회사의 문제점 찾기&lt;/h4&gt;

&lt;p&gt;분명 더 잘할 수 있을 것 같은데, 회사의 관성에 의해서 혹은 나서는 사람이 없어서 개선되지 못하는 부분이 있을 겁니다. 물론 여러분의 업무 내에서도 찾을 수 있습니다. 예를 들면 에디터 사용방법 같은 것일 수도 있죠.&lt;/p&gt;

&lt;h4 id=&quot;2-효율적인-방법-찾기&quot;&gt;2. 효율적인 방법 찾기&lt;/h4&gt;

&lt;p&gt;현재 회사의 방식보다 효율적인 방법을 찾아봅시다. 간단한 라이브러리나 프레임워크의 도입이 될 수도 있고, 개발 프로세스나 전반적인 설계에 영향이 가는 범위일 수도 있습니다. 하지만 대부분의 것들에 더 나은 방법이 존재합니다. 그 방법을 탐구해 봅시다.&lt;/p&gt;

&lt;h4 id=&quot;3-학습을-통한-허들-낮추기&quot;&gt;3. 학습을 통한 허들 낮추기&lt;/h4&gt;

&lt;p&gt;좋은 방법을 찾았다 하더라도, 아직 확신이 있지 않을 겁니다. 이때 학습이 필요합니다. 회사의 문제 개선하기라는 구체적인 학습 목표를 둡시다. 그리고 학습의 결과물을 설득을 위한 데모 혹은 발표자료로 해봅시다.&lt;/p&gt;

&lt;h4 id=&quot;4-설득&quot;&gt;4. 설득&lt;/h4&gt;

&lt;p&gt;해결하고자 하는 문제와 방법을 회사(팀, 리더)에 설득합시다. 이때 잊지 말아야 할 것은 “아름다움”이 아니라 “비즈니스적인 가치”입니다. 대체로 장단기적인 리소스의 절약으로 설명이 될 겁니다. 학습한 것을 바탕으로 시도에 필요한 리소스를 상대적으로 명확하게 전달할 수 있습니다. 예를 들어, “제가 이렇게 프로토타이핑을 해봐서 기술적인 검증은 되어 있습니다. 내부 도입만 하면 되는 상태라서 2주면 됩니다.” 와 같은 식입니다.&lt;/p&gt;

&lt;h4 id=&quot;5-회사에-대한-기여-해당-기술에-대한-숙련도-향상&quot;&gt;5. 회사에 대한 기여, 해당 기술에 대한 숙련도 향상&lt;/h4&gt;

&lt;p&gt;동일한 문제(혹은 해결하지 못하던 문제)를 더 좋은 방법으로 해결하는 것은 회사의 자산으로 남게 됩니다. 시스템의 개선 뿐 아니라 동료들도 배움이 있습니다. 이런 과정을 통해 회사에서 인정받게 되면, 앞으로의 또 다른 시도가 원활해집니다. 동료들의 신뢰도 언게 되구요. 그리고 시도하는 과정에서 회사의 특징인 복잡도와 완성도를 맞추기 위해 기술에 대한 숙련도 이뤄집니다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;더 좋은 개발자가 되었네요. 야호!&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;마지막으로&quot;&gt;마지막으로&lt;/h3&gt;

&lt;p&gt;야구선수를 생각해 봅시다. 야구경기가 끝난 이후에서 특타를 치면서 폼을 이렇게 바꾸면 경기중에 더 잘 칠 수 있지 않을까?라는 생각을 할 겁니다. 그리고 경기시에 실제로 그 폼의 변화를 시도해 보겠죠. 이와 같은 시도를 통해서 더 좋은 타자가 될 겁니다. 우리도 크게 다르지 않습니다. 잊지 말아야할 것은 우리의 학습의 목표입니다. 회사에서 더 높은 퍼포먼스를 내는 것이라면, 퍼포먼스를 높여가는 훈련을 해야 합니다.&lt;/p&gt;

&lt;p&gt;회사 밖에서 확장하고 회사에서 단단해 집시다.&lt;/p&gt;
</description>
        <pubDate>Sun, 18 Sep 2022 01:00:00 +0000</pubDate>
        <link>https://blog.novice.io/%EC%83%9D%EA%B0%81/2022/09/18/%EC%A7%91%EC%97%90-%EA%B0%80%EB%A9%B4-%EC%96%B4%EB%96%A4-%EA%B3%B5%EB%B6%80%EB%A5%BC-%ED%95%98%EB%A9%B4-%EC%A2%8B%EC%9D%84%EA%B9%8C%EC%9A%94.html</link>
        <guid isPermaLink="true">https://blog.novice.io/%EC%83%9D%EA%B0%81/2022/09/18/%EC%A7%91%EC%97%90-%EA%B0%80%EB%A9%B4-%EC%96%B4%EB%96%A4-%EA%B3%B5%EB%B6%80%EB%A5%BC-%ED%95%98%EB%A9%B4-%EC%A2%8B%EC%9D%84%EA%B9%8C%EC%9A%94.html</guid>
        
        <category>학습</category>
        
        <category>CTO</category>
        
        <category>성장</category>
        
        
        <category>생각</category>
        
      </item>
    
      <item>
        <title>세신</title>
        <description>&lt;p&gt;아이들 방학을 맞아 부산 처가에 다녀왔다. 처가 근처에는 허심청이라는 목욕탕이 있다. 온천동(행정 지역명)에 있는 만큼 규모가 큰 목욕탕이다. 명절에 처가에 내려가면 아들 녀석과 종종 들리곤 했었는데, 코로나로 한참을 가지 못했다. 아들 녀석은 부산에 갈 때 마다 큰 목욕탕 이야기를 했었다. 허심청에는 족욕을 하면서 장기를 둘 수 있는 곳이 있는데 그곳에서 아빠와 발가벗고 알까기를 했던 것이 깊게 인상에 남았나 보다. 흠.&lt;/p&gt;

&lt;p&gt;코로나가 우리 가족을 지나가기도 해서 이번에는 허심청에 가봤다. 2년 전 아들은 목욕탕에서 나를 졸졸 따라다니더니, 이제는 좀 컸는지 열탕에 몸을 지지고 있는 나를 내버려 두고 자기가 가고 싶은 곳을 돌아다닌다. 나도 미니풀장에 아들을 두고, 사우나에 들어갔다. 사우나에 들어가 괜히 먼저 들어간 사람과 모래시계의 눈치를 봤다. 먼저 들어간 사람이 나가자 10을 세고 밖으로 나왔다. 찬물에 몸을 한번 담갔다가 아들을 찾아갔다. 멀리서 봐도 신나게 놀고 있다. 잘 놀고 있냐고 물어봤더니, 미니 풀장에서 바구니 두 개를 겹쳐서 수영으로 왔다 갔다 하고 있단다. 수영 학원을 보낸 보람이 있다. 다시 사우나로 향했다.&lt;/p&gt;

&lt;p&gt;미니풀장과 사우나 사이에는 세신 코너가 있다. 안 그래도 왔다 갔다 하면서 세신 메뉴판과 탕에서 때를 불리기 위해 몸을 담그고 있는 사람들을 힐끗힐끗 보았는데 충동적으로 아저씨에게 말을 걸고 말았다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“자리 있습니까?”&lt;/p&gt;

  &lt;p&gt;“네. 비 있습니다. 누우 이소.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;아저씨는 안쪽 침대를 가리켰고, 나는 자리에 누웠고, 아저씨는 발목에 있는 키를 빼셨다. 이제 돌이킬 수 없다. 두근두근. 목욕을 그리 자주 하진 않지만 그래도 어렸을 때부터 지켜보던 “어른의 공간”에 들어간 느낌이다. 왠지 흐뭇하다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“바로 누이소”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;다행히 민망하지 않도록 얼굴을 수건으로 덮어 주셨다. 편안한 마음으로 기다리는데 갑자기 아저씨의 때밀이가 시작되었다. 이것은 세신이라는 고상한 표현이 적합하지 않은 그런 것이었다. 마치 도마 위 생선의 비늘을 벗기는 것 같은 강력한 느낌이었다. 이태리 타올 10개를 한 번에 쓰시는 것이 분명했다. 이건 아닌 것 같다는 생각이 순간 들었지만 “어른의 공간”에 들어온 나는 멈출 수도 아주 작은 신음 소리도 낼 수 없었다.&lt;/p&gt;

&lt;p&gt;아저씨는 나를 90도씩 돌려가며 때밀이를 이어가셨다. 온 신경이 아저씨의 손길에 집중되어 미니풀장에서 놀고 있는 아들 녀석은 생각나지도 않았다. 과연 때는 밀리고 있는 걸까. 얼굴이 가려져 있어 확인을 할 수도 없었다. 그저 한 부위가 끝났을 때 뿌려지는 온수만이 작은 안도감을 주었다.&lt;/p&gt;

&lt;p&gt;중간중간 구석진 곳의 때를 밀기 위해 이상한 자세를 유도하셨다. 이렇게 360도를 돌고 나니 때밀이가 끝났다. 하지만 얼굴에는 여전히 수건이 덮혀져 있었다. 이번에는 비누칠을 할 시간이었다. 볼 수 없어 확인할 수는 없었지만 세차할 때 쓰는 바로 그 스펀지와 같은 걸레가 분명했다. 순식간에 몸 전체가 거품으로 덮였다. 아. 세차를 할 때 자동차는 이런 기분이겠구나.&lt;/p&gt;

&lt;p&gt;거품을 묻힌 채로 어깨와 등의 간단한 안마가 이어졌다. 아마 아저씨는 “이 녀석 왜 이렇게 몸이 굳어 있어?” 싶으셨을 거다. 나는 앞 과정의 놀람으로 다음에 뭐가 이어질지 몰라 계속 긴장할 수밖에 없었다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“다 됐십니다.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;다시 목욕탕 키를 건네받았다. 휴우. 끝났구나 싶은 생각과 함께 처음으로 때를 밀어봤다는 처음의 흐뭇함이 다시 살아났다.&lt;/p&gt;

&lt;p&gt;미니 풀장으로 돌아왔다. 아들 녀석은 여전히 풍덩풍덩 거리면서 잘 놀고 있었다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“아빠가 말이야.. 저기 옆에 가서 때를 밀었는데, 어우 진짜 피부가 벗겨지는 줄 알았어. 이제 너도 아빠랑 때 밀러 가자. 아빠가 잘 밀어줄게.”&lt;/p&gt;
&lt;/blockquote&gt;
</description>
        <pubDate>Mon, 15 Aug 2022 01:00:00 +0000</pubDate>
        <link>https://blog.novice.io/%EC%9D%BC%EC%83%81%EB%8B%A4%EB%B0%98%EC%82%AC/2022/08/15/%EC%84%B8%EC%8B%A0.html</link>
        <guid isPermaLink="true">https://blog.novice.io/%EC%9D%BC%EC%83%81%EB%8B%A4%EB%B0%98%EC%82%AC/2022/08/15/%EC%84%B8%EC%8B%A0.html</guid>
        
        <category>목욕</category>
        
        <category>세신</category>
        
        <category>승준</category>
        
        
        <category>일상다반사</category>
        
      </item>
    
      <item>
        <title>타원곡선 암호 (2)</title>
        <description>&lt;hr /&gt;

&lt;p&gt;지난번에는 타원곡선에 대해서 알아보았다. 이번에는 유한체의 타원곡선에 대해서 알아보자.&lt;/p&gt;

&lt;p&gt;유한체는 유한개의 원소를 가지는 체(Field)이다. 체는 원소들 간의 덧셈, 곱셈의 연산 결과가 다시 그 안에 있는 (닫힘성)을 갖는 대수적 구조이다. 다시 말해 유한체는&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;유한개의 원소들이 집합을 이루면서,&lt;/li&gt;
  &lt;li&gt;덧셈과 곱셈 연산 두 쌍을 자유롭게 사용할 수 있고, (2개 연산자 사용)&lt;/li&gt;
  &lt;li&gt;각 원소가 0이 아닌 원소로 나눌 수 있는 대수적 구조 (곱셈 역원 존재)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;이다.&lt;/p&gt;

&lt;p&gt;유한체에서의 타원곡선을 그려 보자. 다음 타원 곡선을 그려보려고 한다. 
\(y^2 = x^3 + 7\)&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# 타원 곡선을 정의하자. 유한체에서 타원곡선을 정의하기 위해 prime 으로 modular 연산을 하자.
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prime&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;53&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;ecc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;prime&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# 53x53 범위 내에서 주어진 식을 만족하는 점을 모두 찍어보자.
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;points&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ecc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;points&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FieldElement&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;prime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FieldElement&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;prime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;
            
&lt;span class=&quot;n&quot;&gt;fig&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;figure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xlim&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;prime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylim&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;prime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;points&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scatter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'b'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;alpha&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;center&gt;
        &lt;figure&gt;
                &lt;img src=&quot;https://blog.novice.io/assets/타원곡선암호-5.png&quot; width=&quot;320&quot; alt=&quot;views&quot; /&gt;
                &lt;figcaption&gt;유한체의 타원곡선&lt;/figcaption&gt;
        &lt;/figure&gt;
&lt;/center&gt;

&lt;p&gt;유한체이기 때문에 곡선이 아닌 점들의 집합으로 나타낸다. 점만으로는 원래의 타원곡선 형태를 알기 어렵다.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.graui.de/code/elliptic2/&quot;&gt;Elliptic Curves over Finite Fields&lt;/a&gt; 에서도 동일한 그래프를 그려 볼 수 있다.&lt;/p&gt;

&lt;center&gt;
        &lt;figure&gt;
                &lt;img src=&quot;https://blog.novice.io/assets/타원곡선암호-6.png&quot; width=&quot;320&quot; alt=&quot;views&quot; /&gt;
                &lt;figcaption&gt;유한체의 타원곡선 위의 점&lt;/figcaption&gt;
        &lt;/figure&gt;
&lt;/center&gt;

&lt;p&gt;(8, 25) 의 inverse 가 (8, 23) 임을 알수 있다. y^2 에 따라 나타나는 성질로 이에 따라 y=(53/2)를 기준으로 상하 대칭이 되는 것을 확인할 수 있다.&lt;/p&gt;

&lt;h2 id=&quot;곡선위에서의-덧셈-연산&quot;&gt;곡선위에서의 덧셈 연산&lt;/h2&gt;

&lt;p&gt;곡선 위의 두 점 A, B를 임의로 정하고, 곡선 위에 그려 보자.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;points&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;points&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FieldElement&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;prime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FieldElement&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;prime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;B&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;points&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;points&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FieldElement&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;prime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FieldElement&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;prime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scatter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;annotate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'A'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.25&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'r'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scatter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;B&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;B&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;annotate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'B'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;B&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;B&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.25&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'r'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;center&gt;
        &lt;figure&gt;
                &lt;img src=&quot;https://blog.novice.io/assets/타원곡선암호-7.png&quot; width=&quot;320&quot; alt=&quot;views&quot; /&gt;
                &lt;figcaption&gt;유한체의 타원곡선 위의 두점&lt;/figcaption&gt;
        &lt;/figure&gt;
&lt;/center&gt;

&lt;p&gt;A와 B를 연결하는 직선을 찾자. modular 연산의 특징으로 y값이 53이 되면 다시 0부터 직선이 이어지는 특성을 갖는다.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# A와 B를 지나는 직선 찾기
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;la&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;B&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;B&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;lb&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;la&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;x_intercept&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lb&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;la&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; 
&lt;span class=&quot;n&quot;&gt;x_distance&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prime&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;la&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x_intercept&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# A+B 의 계산 
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;B&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# A+B의 x축이 나올때 까지 직선 그려 보기
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;lx&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;linspace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;ly&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;la&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lx&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x_distance&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;plot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ly&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;linestyle&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'--'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'black'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;linewidth&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;alpha&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;la&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x_distance&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lb&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prime&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;break&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;center&gt;
        &lt;figure&gt;
                &lt;img src=&quot;https://blog.novice.io/assets/타원곡선암호-8.png&quot; width=&quot;320&quot; alt=&quot;views&quot; /&gt;
                &lt;figcaption&gt;타원곡선 위의 두 점을 연결하는 직선&lt;/figcaption&gt;
        &lt;/figure&gt;
&lt;/center&gt;

&lt;p&gt;다시 한번 떠올려 보면, 타원 곡선의 덧셈은 다음과 같의 정의한다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;두 점 A와 B를 지나가는 직선이 타원곡선과 새롭게 만나는 점 C를 찾는다.&lt;/li&gt;
  &lt;li&gt;그 점과 X축에 대해 대칭인 점이 덧셈의 결과다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;유한체에서도 이어진 직선(비록 직선이 끝을 만나면 반대쪽에서 다시 이어지지만)이 유한체 내의 점을 찾게 되고, X축에 대해 대칭인 점이 덧셈의 결과가 된다.&lt;/p&gt;
</description>
        <pubDate>Sun, 26 Jun 2022 01:00:00 +0000</pubDate>
        <link>https://blog.novice.io/%EA%B3%B5%EB%B6%80/2022/06/26/%ED%83%80%EC%9B%90%EA%B3%A1%EC%84%A0-%EC%95%94%ED%98%B8-2.html</link>
        <guid isPermaLink="true">https://blog.novice.io/%EA%B3%B5%EB%B6%80/2022/06/26/%ED%83%80%EC%9B%90%EA%B3%A1%EC%84%A0-%EC%95%94%ED%98%B8-2.html</guid>
        
        <category>글또</category>
        
        <category>암호</category>
        
        
        <category>공부</category>
        
      </item>
    
      <item>
        <title>타원곡선 암호 (1)</title>
        <description>&lt;hr /&gt;

&lt;p&gt;회사 분들과 함께 Programming Bitcoin 책을 스터디하고 있다. 첫 3장에서 타원곡선 암호에 대해서 다루고 있는데, 이해가 부족한 느낌이 들어 다른 레퍼런스들을 찾아가며 다시 한번 구현 해 보고자 한다.타원 곡선&lt;/p&gt;

&lt;p&gt;타원 곡선의 정의는 다음과 같다. 한번 그려보도록 하자.
\(y^2 = x^3 + ax + b\)&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numpy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# 타원 곡선을 정의하자. a와 b 는 곡선이 적당한 모양이 되도록 정했다.
&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;ec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;fig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;subplots&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dpi&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# X, Y 축 모두 (-5, 5) 범위
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ogrid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;100j&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;100j&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# 가로, 세로선 표시
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;grid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# 등치선 그려보기
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;contour&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ravel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ravel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;levels&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;center&gt;
        &lt;figure&gt;
                &lt;img src=&quot;https://blog.novice.io/assets/타원곡선암호-1.png&quot; width=&quot;320&quot; alt=&quot;views&quot; /&gt;
                &lt;figcaption&gt;타원곡선&lt;/figcaption&gt;
        &lt;/figure&gt;
&lt;/center&gt;

&lt;p&gt;원래 생각하던 타원 모양은 아니다. 사실 타원 곡선의 “타원” 은 타원의 둘레를 구하기 위한 적분 계산에서 유래 되었다고 한다.&lt;/p&gt;

&lt;h2 id=&quot;곡선위에서의-덧셈-연산&quot;&gt;곡선위에서의 덧셈 연산&lt;/h2&gt;

&lt;p&gt;덧셈을 알아보기 전에 곡선위의 점을 정의해 보자.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sqrt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ecc_r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
        
    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__repr__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'Point({}, {})'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;곡선 위의 두 점 A, B를 임의로 정하고, 곡선 위에 그려 보자.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Point(-1.5, 1.2747548783981961)
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;1.5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# Point(0, 1.4142135623730951))
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;B&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scatter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;annotate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'A'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.25&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'b'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scatter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;B&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;B&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;annotate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'B'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;B&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;B&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.25&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'b'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;fig&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;center&gt;
        &lt;figure&gt;
                &lt;img src=&quot;https://blog.novice.io/assets/타원곡선암호-2.png&quot; width=&quot;320&quot; alt=&quot;views&quot; /&gt;
                &lt;figcaption&gt;타원곡선 위의 두 점&lt;/figcaption&gt;
        &lt;/figure&gt;
&lt;/center&gt;

&lt;p&gt;타원 곡선의 덧셈은 다음과 같의 정의한다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;두 점 A와 B를 지나가는 직선이 타원곡선과 새롭게 만나는 점 C를 찾는다.&lt;/li&gt;
  &lt;li&gt;그 점과 X축에 대해 대칭인 점이 덧셈의 결과다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;곡선위에서의 덧셈은 두 점에 어떤 연산을 통해서 곡선위의 또 다른 점을 얻는것이다. 이 연산을 굳이 “덧셈” 이라고 하는 이유는 우리가 알고 있는 일반적인 덧셈의 속성들을 가지기 때문이다.&lt;/p&gt;

&lt;p&gt;A와 B를 지나는 직선은 중학교 때를 떠올려 보자. 직선의 방정식은 
\(y = ax + b\)
로 정의된다. 여기에서 기울기는 
\(a = (y2 - y1) / (x2 - x1)\)
와 같이 구한다. y절편 b 는 x=0 일 때 식이다.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;la&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;B&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;B&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;lx&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;linspace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;lb&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sqrt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ecc_r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ly&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;la&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lx&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lb&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;plot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ly&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;linestyle&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'--'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'black'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;linewidth&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;fig&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;center&gt;
        &lt;figure&gt;
                &lt;img src=&quot;https://blog.novice.io/assets/타원곡선암호-3.png&quot; width=&quot;320&quot; alt=&quot;views&quot; /&gt;
                &lt;figcaption&gt;두 점 사이의 직선&lt;/figcaption&gt;
        &lt;/figure&gt;
&lt;/center&gt;

&lt;p&gt;타원 곡선 덧셈의 정의에 따라 직선과 타원 곡선이 만나는 점을 구하자. 선을 따라가며 근사값을 구해보도록 하자.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;linspace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;ec_y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sqrt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ecc_r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;line_y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lm&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lb&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;isclose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ec_y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;line_y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rtol&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.001&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;C&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# Point(1.509090909090909,1.555170238373621)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;적절한 값이 나온 것 같다. 교점과 X축에 대칭되는 점을 구해 보자.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scatter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;annotate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'C'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.25&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'b'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scatter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;annotate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'A+B'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.25&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'b'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;fig&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;center&gt;
        &lt;figure&gt;
                &lt;img src=&quot;https://blog.novice.io/assets/타원곡선암호-4.png&quot; width=&quot;320&quot; alt=&quot;views&quot; /&gt;
                &lt;figcaption&gt;타원곡선의 덧셈&lt;/figcaption&gt;
        &lt;/figure&gt;
&lt;/center&gt;

&lt;p&gt;타원곡선의 덧셈을 구해 봤다. 다음번에는 유한체에서 정의된 타원곡선의 덧셈에 대해서 알아보고자 한다.&lt;/p&gt;

</description>
        <pubDate>Sun, 12 Jun 2022 01:00:00 +0000</pubDate>
        <link>https://blog.novice.io/%EA%B3%B5%EB%B6%80/2022/06/12/%ED%83%80%EC%9B%90%EA%B3%A1%EC%84%A0-%EC%95%94%ED%98%B8-1.html</link>
        <guid isPermaLink="true">https://blog.novice.io/%EA%B3%B5%EB%B6%80/2022/06/12/%ED%83%80%EC%9B%90%EA%B3%A1%EC%84%A0-%EC%95%94%ED%98%B8-1.html</guid>
        
        <category>글또</category>
        
        <category>암호</category>
        
        
        <category>공부</category>
        
      </item>
    
      <item>
        <title>다시 글쓰기를 다짐하며</title>
        <description>&lt;center&gt;
        &lt;figure&gt;
                &lt;img src=&quot;https://blog.novice.io/assets/rewrite.jpeg&quot; width=&quot;480&quot; alt=&quot;views&quot; /&gt;
                &lt;figcaption&gt;&lt;a href=&quot;https://www.inc.com/jessica-stillman/3-reasons-writing-is-great-for-your-mental-health.html&quot;&gt;출처&lt;/a&gt;&lt;/figcaption&gt;
        &lt;/figure&gt;
&lt;/center&gt;

&lt;blockquote&gt;
  &lt;p&gt;“일단 연필을 잡아!”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;얼마 전 스승의 날 편지를 두고 끙끙거리고 있는  아들 녀석에게 한 말이다. 아들이 퉁명스럽게 대답했다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“잡았는데?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A를 입력하니 A만 출력하는 내 아들.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“그럼 일단 “XXX 선생님께”를 써!”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;부루퉁한 얼굴로 연필을 잡고 꾸물꾸물 편지를 써내려 간다. 그러고는 얼마 안 되어서 “다 썼다!” 하고 보지 않아도 개발새발 써진 편지를 편지봉투에 담아 가방 속에 던져 버렸다.&lt;/p&gt;

&lt;p&gt;며칠이 지나 오늘은 온라인 글쓰기 모임인 &lt;a href=&quot;https://www.notion.so/zzsza/ac5b18a482fb4df497d4e8257ad4d516&quot;&gt;글또&lt;/a&gt;(글 쓰는 또라이가 세상을 바꾼다)의 첫 듀 데이트다. 미루고 미루다가 늦은 오후가 되어서야 드디어 키보드에 손을 얹었다. 그리고 일단 제목을 썼다. 미안하다 아들아. 아빠에게도 글쓰기는 어렵다.&lt;/p&gt;

&lt;p&gt;늘 글쓰기에  대한 마음의 짐을 가지고 있다. 보다 정확히는 마음의 짐만 가지고 있다. 이럴 때에는 도망갈 수 없는 상황으로 나를 밀어 넣을 필요가 있다. 마치 다가오는 스승의 날처럼. 반 친구들은 모두 편지를 쓰는데 나만 안 쓸 수도 없는 상황처럼. 그래서 지난 달 글또 모임에 지원했다. 그리고 지금 와서는 또 생각한다. “아이고 왜 또 사서 고생을..”&lt;/p&gt;

&lt;p&gt;한참 글을 쓸 때 사람들이 왜 글을 쓰냐고 물어본 적이 있다. 곰곰 생각을 해봤는데, 결국 남기고 싶어서였다. 나는 스타트업에서 일하고, 리더의 길을 선택하면서 전문화보다는 일반화의 길을 가고 있다고 생각해 왔다. 전문화의 길을 가는 사람들은 그 과정에서 논문, 책, 탁월한 코드로 그들의 지식과 경험을 남긴다. 하지만 일반화의 길을 가는 사람은 의도적으로 글을 쓰지 않으면 축적되지 않는다. 그냥 흘러가 버린다. 그래서 글을 써야 한다 싶었다. 그렇게 생각해 보면 글을 쓰지 않는 지금은 지식과 경험이 축적되고 있지 않는 상황인 거다. 역시 글을 써야 한다.&lt;/p&gt;

&lt;p&gt;지금까지 3군데 글을 써왔다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://8percent.github.io/&quot;&gt;팀 블로그&lt;/a&gt;: 기술적인 내용&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://brunch.co.kr/@leehosung&quot;&gt;브런치&lt;/a&gt;: 회사 알리기, 회사에서 경험한 일, 공고&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.novice.io/&quot;&gt;개인 블로그&lt;/a&gt;: 개인적인 감상, 내가 배우고 살아가는 이야기&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;앞으로 반년 간 이어질 글또에서 10개가 넘는 글을 쓰게 될 텐데 3군데 모두 글을 올리고 싶다. 기술적인 내용도 다듬어 올리고, 회사에서 나와 동료의 삶, 그리고 지나쳐 버리기에 아까운 내 삶의 어떤 순간까지도 기록하고 싶다.&lt;/p&gt;

&lt;p&gt;대단한 글에 대한 부담은 떨쳐 버리고, 하나씩 쌓아 나가야지. 바퀴를 다시 굴려아지.&lt;/p&gt;
</description>
        <pubDate>Sun, 15 May 2022 01:00:00 +0000</pubDate>
        <link>https://blog.novice.io/%EC%83%9D%EA%B0%81/2022/05/15/%EB%8B%A4%EC%8B%9C%EA%B8%80%EC%93%B0%EA%B8%B0%EB%A5%BC%EB%8B%A4%EC%A7%90%ED%95%98%EB%A9%B0.html</link>
        <guid isPermaLink="true">https://blog.novice.io/%EC%83%9D%EA%B0%81/2022/05/15/%EB%8B%A4%EC%8B%9C%EA%B8%80%EC%93%B0%EA%B8%B0%EB%A5%BC%EB%8B%A4%EC%A7%90%ED%95%98%EB%A9%B0.html</guid>
        
        <category>글쓰기</category>
        
        
        <category>생각</category>
        
      </item>
    
      <item>
        <title>누리호 발사를 축하하며</title>
        <description>&lt;center&gt;
        &lt;figure&gt;
                &lt;img src=&quot;https://blog.novice.io/assets/nuriho.jpg&quot; width=&quot;600&quot; alt=&quot;views&quot; /&gt;
                &lt;figcaption&gt;하늘로 날아 오르는 누리호&lt;/figcaption&gt;
        &lt;/figure&gt;
&lt;/center&gt;

&lt;p&gt;2021년 10월 21일 오후 5시 누리호가 발사되었다. 잠깐 회사일을 멈추고 라이브로 지켜보았다. 영화에서 볼 수 있는 장면과 크게 다르지 않은데 코끝이 찡하고 눈물이 난다. 고된 훈련 후 올림픽에서 메달을 따고 시상대에 오른 스포츠 선수를 볼 때의 감동과 다르지 않다. 아니, 수백 명이 11년 7개월 동안 개발을 진행했다고 하니 감동이 더 크고 눈물이 나는 것이 정상이다.&lt;/p&gt;

&lt;p&gt;어제 대학교 동아리 단톡방이 오랜만에 울렸다. 누리호의 발사를 응원해달라는 이야기였다. 동아리 친구는 정부 쪽에서 누리호 프로젝트를 지원하고 있었고, 동아리 선배 중 한 명이 로켓 개발에 핵심적으로 참여하고 있다며 한국항공우주연구원의 &lt;a href=&quot;https://www.youtube.com/watch?v=Tw251SC7ysw&quot;&gt;동영상&lt;/a&gt;을 공유해 주었다. 동아리 때는 호탕하고, 노래도 잘 부르던 형으로만 기억하고 있었는데 동영상에서는 누리호의 개발 과정과 핵심기술에 대해 담담하게 설명하고 있었다. 물론 그때 그 모습 그대로. 그때 그 사투리 그대로. 나도 모르게 “우와 진짜 과학자네!”라는 혼잣말이 나왔다. 신기하면서도 자랑스러웠다.&lt;/p&gt;

&lt;p&gt;얼마 전 2학년 아들이 아빠는 나만할 때 꿈이 뭐였냐고 물었다. 기억을 되짚어 볼 필요도 없이 “과학자였어”라고 답했다. 어린 시절 나의 꿈은 항상 과학자였다. 로켓 만들고, 로봇 만들고, 플라스크를 들고 무엇인가를 섞는 그런 과학자 말이다. 과학고를 가고 KAIST에 진학할 때 까지도 과학자의 삶을 생각했었다. 하지만 지금은 과학자 → 엔지니어 → 개발자 → 회사원이 점점 어울리는 삶을 살아가고 있다. 내가 선택한 길에 대한 후회는 없지만 내가 가보지 못한 길에 대한 아쉬움은 있다. 동시에 석박사를 마치고 연구원으로 혹은 교수로 그 길을 걸어가고 있는 동기와 선후배에 대한 큰 존경심을 갖고 있다.&lt;/p&gt;

&lt;p&gt;과학자는 인류의 지평을 넓혀 주는 직업이라고 생각한다. 다른 사람들은 그곳을 왜 바라보나 싶지만 인류가 가지 않았던 그 무거운 한 걸음을 걸어내는 사람이라고 생각한다. 우리는 그렇게 과학자들이 넓혀온 세상 위에서 점점 더 나은 삶을 살아가고 있다.&lt;/p&gt;

&lt;p&gt;나는 이제는 다시 학문의 길로 돌아가기가 쉽지 않겠다는 생각이 든다. 하지만 주위 친구들을 통해 과학자의 삶을 엿볼 수 있기에 그들을 응원하고 감사하는 마음은 계속 커질 것 같다. 그리고 나도 업계의 선배님들이 하신 것처럼 학교에 기부하는 형태로 과학의 미래와 과학자의 삶을 응원하고 싶다. 인류의 작은 전진을 위해.&lt;/p&gt;
</description>
        <pubDate>Thu, 21 Oct 2021 01:00:00 +0000</pubDate>
        <link>https://blog.novice.io/%EC%83%9D%EA%B0%81/2021/10/21/%EB%88%84%EB%A6%AC%ED%98%B8-%EB%B0%9C%EC%82%AC%EB%A5%BC-%EC%B6%95%ED%95%98%ED%95%98%EB%A9%B0.html</link>
        <guid isPermaLink="true">https://blog.novice.io/%EC%83%9D%EA%B0%81/2021/10/21/%EB%88%84%EB%A6%AC%ED%98%B8-%EB%B0%9C%EC%82%AC%EB%A5%BC-%EC%B6%95%ED%95%98%ED%95%98%EB%A9%B0.html</guid>
        
        <category>누리호</category>
        
        <category>과학자</category>
        
        
        <category>생각</category>
        
      </item>
    
  </channel>
</rss>
